sonic-visualiser-3.0.3/.hg_archival.txt0000644000000000000000000000017513111512442016225 0ustar 00000000000000repo: cd5d7ff8ef38db407306e8ed02a77901db8d0289 node: 8d2d9a4f5d5264ed6c738ff7b36f3a9e1729d5aa branch: default tag: sv_v3.0.3 sonic-visualiser-3.0.3/.hgignore0000644000000000000000000000047513111512442014745 0ustar 00000000000000syntax: glob Makefile* */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej re:^autom4te\.cache/ re:^qrc_sonic-visualiser\.cpp$ re:^sonic-visualiser$ re:^aclocal\.m4$ re:^config\.log$ re:^config\.pri$ re:^config\.status$ *.app Sonic Visualiser* .DS_Store *.stash cov-int/* sonic-visualiser-3.0.3/.hgsub0000644000000000000000000000140113111512442014241 0ustar 00000000000000vamp-plugin-sdk = https://code.soundsoftware.ac.uk/hg/vamp-plugin-sdk svcore = https://code.soundsoftware.ac.uk/hg/svcore svgui = https://code.soundsoftware.ac.uk/hg/svgui svapp = https://code.soundsoftware.ac.uk/hg/svapp dataquay = https://bitbucket.org/breakfastquay/dataquay bqvec = https://bitbucket.org/breakfastquay/bqvec bqfft = https://bitbucket.org/breakfastquay/bqfft bqresample = https://bitbucket.org/breakfastquay/bqresample bqaudioio = https://bitbucket.org/breakfastquay/bqaudioio sv-dependency-builds = https://code.soundsoftware.ac.uk/hg/sv-dependency-builds icons/scalable = https://code.soundsoftware.ac.uk/hg/sv-iconset checker = https://code.soundsoftware.ac.uk/hg/vamp-plugin-load-checker piper-cpp = https://code.soundsoftware.ac.uk/hg/piper-cpp sonic-visualiser-3.0.3/.hgsubstate0000644000000000000000000000123013111512442015302 0ustar 00000000000000692c02f29c999fa355a60220089499924ca94e02 bqaudioio fb508f7cdcdc245add2de6811acda46745516716 bqfft a867fff0963dd91df0fd99c81d690c1155e73645 bqresample ddbf6d836efb6fc320b652e1a4dff4edeaae9b53 bqvec cf18645ff411a2b292946153109d499fbf69de9f checker 3768bdde6fdf866aa63fff5bde8d9fa64a8979ef dataquay 3d2cde3b1ab3d39c7f9e542250c288a9da0f6850 icons/scalable db929669e7d3564ec09cf41bf7ee347fa11233de piper-cpp eccd51b72864a07c9744d88d0b3c22f557ba43c1 sv-dependency-builds 72b4870f0e6b0d3bc279b77cfb550a0c3f846f52 svapp e7e626a87a1ef03ba474c25a3c5ae886738c134e svcore cdaeff1858af72b24f40b5799d8d11c495dc14f0 svgui 946d850c940c1aa46e0db3dae1625182d2f7ca9e vamp-plugin-sdk sonic-visualiser-3.0.3/.hgtags0000644000000000000000000000675113111512442014423 0ustar 000000000000000e7d0cdb6ac7e4bab525c8d88c2a022cbc17a016 sv-v1.5pre1 107ca17594c8d55dc2d9b127a1e6648bd68c3c4c sv1-1.0rc1 3211f8cef51a955bfd08d96425d18351f7ab3c20 sv-v1.7.1 33ae130b951ff9ee3ca7d5c4a5b45e05ce10f870 sv-v1.7 3bb7eef5d45c4bd01390d830115bc28c1d455a98 sv-v1.7.2 784ea35d07dd04faa82487e2785a988d7e42e562 sv1-1.0pre4 8aa8dd8050d98c6eaa3b51829b2b565824e34185 sv-v1.5 91426a5e4b53d23e74aa3f3335888accd8a29345 sv1-v1.2pre4 975f6b6c414c5f9b6332910ec1cd8f5b5abac3b0 sv-v1.4 975f6b6c414c5f9b6332910ec1cd8f5b5abac3b0 sv-v1.4rc1 a45733cc3939b1c644dfc87651feead2ff58fe8d sv1-1.0pre2 a46d68ae3c3e1f647ac5c6042775c51bd0879c2a sv1-1.0pre1 a47d7116aedf95aca94760097407ac5e66e308cb sv1-v1.2 c452d8a7b770c4802637d5a3c8372a5351b76f5f sv1-v1.3 c452d8a7b770c4802637d5a3c8372a5351b76f5f sv1-v1.3rc1 c9fa92615948719b7d3b54e4ea557625596c7e7d sv1-v1.0 cf8748822f4d7e0499864b381e5cf2755c3fdbd8 sv1-v1.2pre5 cfdc07e4e0d5ff282b930f5cef06f9465d3254b6 sv-v1.6 d936e3d77b959176550a700001f2b11bc89d1f37 sv1-v1.2pre3 e764bbf2b0904654a4816d94c09c0b66c426c6f5 last-cc-copyright fcd2315296280ea174e83f061c6508db15788ab1 sv1-1.0pre3 5c2a18310c6e351ccf401c5bead78ddcccfecf18 sv_v1.8 44741262c2e016f2e81e35c66b66a1a9969e9dd2 sv_v1.8_osx_deploy 6750452fcbe6a8b0e3ea45877f808ef92da2b4b9 sv_v1.9 6750452fcbe6a8b0e3ea45877f808ef92da2b4b9 sv_v1.9 afca1234d34170bb9f0d85d83b7971d56ed6e3ff sv_v1.9 afca1234d34170bb9f0d85d83b7971d56ed6e3ff sv_v1.9 c4071f97a471ef9f6e76bf8d83dceddd66400e83 sv_v1.9 f8833ed742fc8bef02a01c15c87e6ffb2fd7ee1d sv_v2.0 f8833ed742fc8bef02a01c15c87e6ffb2fd7ee1d sv_v2.0 6b8e6600fa02931945185884485dc9b4e3b88e1c sv_v2.0 0757db4b5d103a950512d218374060ab392930b0 sv_v2.1 0757db4b5d103a950512d218374060ab392930b0 sv_v2.1 deabb09d994be070f7cccdd52c23351746427f92 sv_v2.1 ac16e50930326a4826b5813a6cae58b81c721044 sv_v2.2 ac16e50930326a4826b5813a6cae58b81c721044 sv_v2.2 29a97099b6473aa14251ec6392eb696cad4a6431 sv_v2.2 29a97099b6473aa14251ec6392eb696cad4a6431 sv_v2.2 a91416395daf6d8ac2b5f7330cc2e44ab699dc50 sv_v2.2 242ebf1db0f16582b883d65ae80df99c613b99a7 sv_v2.3 242ebf1db0f16582b883d65ae80df99c613b99a7 sv_v2.3 7f7fba33b7de2890ca96dbd15969219bb9fe04b9 sv_v2.3 59c68b5ae5be5997719ff959d40fe9ad36ab86ab sv_v2.3-f 59c68b5ae5be5997719ff959d40fe9ad36ab86ab sv_v2.3-f 0000000000000000000000000000000000000000 sv_v2.3-f 7f7fba33b7de2890ca96dbd15969219bb9fe04b9 sv_v2.3 bf06f4311ec0af43f93a15489a757955e07597cd sv_v2.3 cfbea29fae640aed5c8b7265d6806df823f34fef sv_v2.4 8215909b74d2c58be28ce128d40fbc1645bc0d6e sv_v2.4_linux_deploy 2868d5abf1a3baa37099c1b5d7e984bf8bb8177a sv_v2.4.1 94253fa113183075c8400fa64d0ccb0e81682f90 sv_v2.5 e206741df37ddfa3db28bfbbe4b79f2248b92695 sv_v2.5_osx_deploy e6c7585863feeba4d278c770314e3455e0020bdb last_v2.5_on_default_branch 3173259cdcc67cb687fb9d62f6a945a86bc7ea77 sv_v3.0beta1 7a8e909a15da99ff87928a0be0475f214a450d14 sv_v3.0beta2 7a8e909a15da99ff87928a0be0475f214a450d14 sv_v3.0beta2 b6f1052dbda12b33c5bc0ea4ae33d4764da10b31 sv_v3.0beta2 881d7f99bba33a35852bd0dcfa19367f6b306e14 sv_v3.0beta3 2f13bdee5cb541f22ac6567ba55faf2aa23277df sv_v3.0beta4 2f13bdee5cb541f22ac6567ba55faf2aa23277df sv_v3.0beta4 d739444d2c489f79572017902e9b5b4ec961cbbe sv_v3.0beta4 811fbe905f5e4f3114a8024c0a8d45f9d4ff838d sv_v3.0rc1 c3380c78811fbcaf1dae5f4b08d1a0db05bc2820 sv_v3.0 cbaac283f47ea7f21e83612cf0931b26ea29c213 sv_v3.0.1 cbaac283f47ea7f21e83612cf0931b26ea29c213 sv_v3.0.1 96a5cf264033195f52613f6fce02398ae3efa020 sv_v3.0.1 96a5cf264033195f52613f6fce02398ae3efa020 sv_v3.0.1 fad5960ac61a2cead83ff1b57072cb0634bf6f4e sv_v3.0.1 38c40fe5135b8220e39cf2a6ba52f43bd40168b9 sv_v3.0.2 sonic-visualiser-3.0.3/CHANGELOG0000644000000000000000000005337613111512442014364 0ustar 00000000000000 Changes in Sonic Visualiser 3.0.3 (May 2017) since the previous release 3.0.2: - Improve decisions about where and how to label vertical scales - Update build support material and documentation to reflect the official release of Cap'n Proto 0.6 (which we can now use rather than depending on git builds) Changes in Sonic Visualiser 3.0.2 (Mar 2017) since the previous release 3.0.1: - Fix crash when changing parameters for spectrum view - Fix incorrect measure tool crosshairs in spectrum view - Update Russian and Czech UI translations (thanks to Alexandre Prokoudine and Pavel Fric respectively) Changes in Sonic Visualiser 3.0.1 (Mar 2017) since the previous release 3.0: - Fix crashes with MIDI devices and speedup/slowdown control on Windows - Update MIDI input driver layer Changes in Sonic Visualiser 3.0 (Mar 2017) since the previous release 2.5: - Add ability to record audio, and ability to change the audio device for playback or recording in the preferences - Add complete support for high-resolution (Hi-DPI or retina) displays, including for layer data rendering as well as UI controls and icons. This makes the biggest difference when using a retina Mac, on which previous versions did not render layer data at retina resolution, but it also improves scaling and rendering of UI elements on Hi-DPI displays on Windows and Linux - Add ability to export scalable (SVG) image files - Run plugins in a separate process, so that if a plugin crashes, it no longer brings down Sonic Visualiser with it. In every other respect the behaviour should be unchanged - Scan plugins on startup in a separate process, and report on any that crash or won't load - Add ability to open, display, and analyse very long audio files (of more than 2^32 sample frames) - Change mp3 file loading so as to compensate for encoder/decoder delay and padding (using "gapless playback" logic). While this is a real improvement, unfortunately it does mean that the initial padding in mp3 file load has changed from previous versions, which may mean some sessions saved in previous versions are no longer correctly aligned. It's not a great idea to use mp3 as a file format of record, because of differences like this between decoders. The previous behaviour is still available as a preference. - Add new Hybrid normalisation type for spectrogram and colour 3d plot layers. This normalises each column to its peak value and then scales the normalised values by the log of the peak in order to restore some distinction in scale between columns with different levels. It can provide quite visually clear results. - Add function to subdivide time instant layers into regular intervals (and its inverse) - Add new preference for default colour scales - Add a basic ability to zoom (in the frequency axis) to the spectrum - Switch to using combined level/pan controls in layer property boxes and for the main volume control - Make CSV file reader better able to handle files with varying numbers of columns - Fix a number of problems on Windows with loading and saving some file formats to filenames not representable in system codepage - Add "What's New" dialog - Finally switch the Windows build to 64-bit by default (with adapters to run either 32- or 64-bit plugins) Changes in Sonic Visualiser 2.5 (Oct 2015) since the previous release 2.4.1: - Add unit-converter dialog, for converting between various pitch and timing units - Fix failure to reload note layers from session file - Use a more sensible scale for the play-speed dial - Fix crash when importing very wide CSV files - Fix generation of wrong layer type from some CSV files - Fix failure to export last instant in a time-instant layer Changes in Sonic Visualiser 2.4.1 (Oct 2014) since the previous release 2.4: - Fix a crash when rendering certain colour 3d plot layers Changes in Sonic Visualiser 2.4 (Sep 2014) since the previous release 2.3: - Add support for left/right scrolling using a two-finger touchpad gesture (where available) - Make the octave numbering into a configurable option, and change the default. Previously Sonic Visualiser labelled middle-C as "C3"; now it labels middle-C as "C4", a more common standard in the world outside MIDI sequencer software. The previous system is available as an option in the Preferences. This affects only the visible labels: there is no change to analysis or to the file format - Sonify time-value layers. Any time-value curve whose scale unit is set to Hz will now acquire a playback toggle control; this control is off by default, but if it is switched on, the curve will be played back using a variable-frequency sound generator - Add support for playback of note layers with non-MIDI frequencies (formerly the note playback was limited to exact MIDI pitch) - Change the default playback sample for note layers from piano to an electric piano with sustain. The piano sample is still available, and any sessions saved using it should continue to use it - Add a cancel button for Vamp plugin processing: currently, cancelling a transform results in a part-complete layer rather than removing the results - Add keyboard shortcuts to cycle the current layer (in addition to the existing ones to cycle the current pane) - Fix various bugs related to layer ordering: layer tabs re-ordering themselves randomly when new layer added, layers being ordered randomly when saving and reloading a session - Fix incorrect interaction with non-Unicode usernames when creating temporary and template directories on Windows - Shade the start and end of the main audio file, to make them easier to see for files that start or end in silence - Speed up rendering and scrolling in time-value layers - Make it possible to import CSV files directly into Note layers by adding Pitch as a data type in the CSV file import dialog - Fix play pointer jump to wrong frame when clicking on row in the layer edit dialog - Fix problems with keyboard shortcuts when using Qt5 on OS/X. This is the first release in which the official builds use Qt5 for all platforms. Changes in Sonic Visualiser 2.3 (Dec 2013) since the previous release 2.2: - Add a startup welcome dialog that also explains what SV makes network connections for and allows user to forbid them - Add "Export Audio Data" feature - Show piano keyboard scale in note and time-value layers as well as spectrogram, where vertical scale is log Hz; also show numerical scale in note and region layers when not auto-aligned - Speed up CSV file import and avoid showing crazily wide window for CSV file format dialog when file has lots of columns - Fix incorrectly saved window geometry when exiting from maximised state - Reduce number of timer wakeups when idle - Add American English translation and make choice of translation into a preference (defaulting to system locale) - Permit installation to non-default location with Windows installer build Changes in Sonic Visualiser 2.2 (July 2013) since the previous release 2.1: - Build with support for hidpi ("retina") text on OS/X - Fix very slow analysis when using Ogg or FLAC files decoded via libsndfile - Fix inaccurate scale auto-align between time-value layers and others - Fix failure to open files specified on command line (or via Open With) on Windows - Reset cyclical counters and switch back to navigate mode when a new session is started Changes in Sonic Visualiser 2.1 (May 2013) since the previous release 2.0.1: - Fix incorrect handling of FixedSampleRate outputs (Vamp SDK fix) - Make it easier to see results from transforms that return a single point - Make labelling clearer on time-value layers - Add discrete-curve mode for time-value layers (for curves with gaps) - Update code to build against Qt5 Changes in Sonic Visualiser 2.0.1 since the previous release 2.0: - Fix incorrect samplerate in reading m4a files on OS/X Changes in Sonic Visualiser 2.0 (July 2012) since the previous release 1.9: - Support 64-bit builds on OS/X (using CoreAudio instead of obsolete QuickTime audio file reader) - Simplify RDF reading and fix some bugs. Now requires Dataquay (http://breakfastquay.com/dataquay/) rather than using Redland directly. Release builds use Sord/Serd rather than Redland - Add a fullscreen mode on the F11 key Changes in Sonic Visualiser 1.9 (Oct 2011) since the previous release 1.8: - Add session templates; save session as template; apply template to session - Tidy up the file open logic so as to remove the dialog asking how to open a file, where possible - Various bug fixes. Changes in Sonic Visualiser 1.8 (Apr 2011) since the previous release 1.7.2: - Sonic Visualiser now registers as a file type handler on OS/X, providing better integration with the desktop generally (Dan Stowell) - There is a new function to toggle all Time Rulers at once (key #) - The CSV import dialog has been overhauled, allowing more flexible selection of purpose for each column - Text overlays are now easier to read on dark backgrounds - Hidden layers are now ignored when exporting an image (Dan Stowell) - A crash when starting a new session or exiting the application after loading a session with saved alignment data has been fixed - The duplication of right-button menu functions when multiple files were loaded has been fixed - The layer-add menu functions now have shortcuts (Dan Stowell) - The codebase has been reorganised into libraries and a configure step added. It should be easier to build and maintain on OS/X and Linux than previously, although it won't make much difference on Windows. - A Czech translation is now included (thanks to Pavel Fric). Changes in Sonic Visualiser 1.7.2 (May 2010) since the previous release 1.7.1: - The time-value layer now has an origin line and an option to show derivatives (change from one point to the next) rather than raw values - A static initialiser race has been fixed, possibly fixing an occasional crash on startup in Windows - A crash when pressing Play straight after New Session has been fixed Changes in Sonic Visualiser 1.7.1 (Oct 2009) since the previous release 1.7: - The RDF importer does a better job of assigning labels to layers, layers to panes, and values to labelled regions - Interactive editing in the Text layer benefits from the same improvements as made in 1.7 to Note and Region layers - The layer data editor window has a text search feature - The main window status bar now shows the last label to have passed the playback position in the current layer, at the right end of the status bar - The Russian translation has been updated (thanks Alexandre) Changes in Sonic Visualiser 1.7 (Sep 2009) since the previous release 1.6: - A new "Insert Item At Selection" function on the Edit menu can be used to create Note and Region layer items whose time extents correspond to the current selection(s) - Interactively editing points in the Note and Region layers now works much more smoothly - SV can now import MIDI files that use SMPTE timecode for event timing (importing MIDI files using with the more common timebase-based timing was already supported) - Time values throughout the display may optionally be shown in seconds and frames at various frame rates - A crash on exit in Windows has been fixed - A very unobtrusive user survey is now included - Various other bug fixes. Changes in Sonic Visualiser 1.6 (Jun 2009) since the previous release 1.5: - The Colour 3D Plot layer now supports logarithmic vertical scale and linear interpolation options. - A new colour scheme (High Gain) has been added for spectrogram and Colour 3D Plot, which improves readability for some data. - Further performance improvements have been made to Colour 3D Plot. - Various other bug fixes. Changes in Sonic Visualiser 1.5 (Mar 2009) since the previous release 1.4: - You can now insert time instants, time values, and notes using a MIDI device during playback. If a time value or note layer is current it will be used for insertion (giving a value equal to the pitch class, or the played note, respectively); otherwise an existing or new time instants layer will be used just as it is when inserting instants using the PC keyboard. Using a MIDI device should give better timing than using the PC keyboard. - There is a new Activity Log window with a (purely informative) list of events and user interactions that happen while SV is running. - The spectrogram has somewhat improved graphical scaling, and this is now the default (being much faster than the 4x oversampled method). The previous default is still available as a preference. - Visualisation of very dense colour plots (such as spectrograms calculated by plugins) is substantially faster in this release. - Spectrogram display is now faster in many circumstances. - Alignment using the MATCH plugin is faster on OS/X than before. - SV will take into account RDF plugin descriptions, if available, in order to make somewhat better decisions about display of plugin outputs (for example, placing segmentation data into a layer with segmentation plot type). - You can now switch layers by clicking on the spare area at the left end of the pane that is also used for the current pane indicator. - The vertical black lines dividing segments in the time value layer's segmentation plot style are now optional. - Several widget layout bugs on OS/X have been fixed. - Several serious crashing, deadlock, and data corruption bugs have been fixed. Changes in Sonic Visualiser 1.4 (Dec 2008) since the previous release 1.3: - SV now has a Region layer type, used for display of features with durations. It also supports Vamp v2.0 plugins that provide durations for features. - Layer data can now be imported from RDF described using the Audio Features Ontology, as well as from the existing text file types. SV can also export annotation layer data to RDF/Turtle, although in a somewhat simplistic manner at present. - You can search for transforms by text in the new "Find a Transform" dialog. This searches both installed plugins, and plugins that have not been installed but that have descriptions available on the semantic web. - You can now zoom and scroll vertically in the time-value, note, and colour 3d plot layers. - Sonic Visualiser can now load sessions from uncompressed XML files as well as its own compressed-XML .sv format. Files with extension .xml that contain suitable session data will be loaded as sessions. Note that .xml extension files still do not show up in the default file load filter. This is intentional, as there may be any kind of data in them -- if you want to load uncompressed session files from XML, you need to know you're doing it. - Several crashes and other bugs have been fixed. Changes in Sonic Visualiser 1.3 (Jul 2008) since the previous release 1.2: - There is a new spreadsheet-style data viewer and editor for viewing and editing the data in some types of annotation layer. - Alignments are now saved to the session file. - The spectrogram layer is usually somewhat faster than it was. - You can now hold Shift while dragging to move an item, in order to override the initial drag resistance introduced in 1.2. - The gross mis-labelling of time lines in the ruler has been fixed. - There is a new, somewhat provisional PulseAudio output driver. - Several other bug fixes. Changes in Sonic Visualiser 1.2 (Feb 2008) since the previous release 1.0: - SV now supports time-alignment of multiple performances of a work loaded at the same time. This option is enabled when the MATCH Vamp plugin is installed. When alignment is switched on and more than one audio file is open, SV will assume that all open files are differently timed performances of the same work, and will calculate time alignments for them. Playback will then play only a single file at a time, and the playback cursors in other files will track at the varying speeds to try to ensure that each is at the same point in the underlying score. This enables effective comparison of several such files, as well as a meaningful way to switch from one performance to another during playback (ensuring that the switch happens at the correct point in the performance being switched to). - There is a new Image layer, which can display images from the local filesystem or retrieved via HTTP or FTP. - A new measurement tool has been added. With the measurement tool selected, dragging in a pane draws a rectangle labelled with the scale values for its start and end corners and its size. You can have any number of measurements present at once; they are associated with the top layer, their scale values depend on the scale for that layer, and they are only shown when that layer is at the top and the measurement tool is active. Measurements are saved and reloaded in the session file. Drawing measurements can be undone and redone, and a measurement can be deleted by hitting Del when highlighted. Note that the measurement tool shows the scale values associated with the pixel positions of the mouse when dragging, not any values associated with actual features present in the audio or its analysis (e.g. the values are not rounded to the nearest spectrogram bin). - You can double-click using the measurement tool in the spectrogram to get an instant measurement rectangle for a feature. This is a purely graphical feature that works by calculating the boundary of a contiguous region of pixels "similar to" the one you double-clicked on; it does not use audio analysis. Adjusting the gain and colour scheme etc of the spectrogram will (by design) affect the measurements obtained this way. - The spectrum can now optionally show frequency estimates of peaks aligned with a piano keyboard along the horizontal axis (this needs some refinement). - The harmonic cursor in the spectrogram has moved from the Select tool to the Measurement tool. There is now a similar harmonic cursor in the spectrum. Both of them show more information as text alongside the cursor than previously. - There is a new Erase tool for erasing individual points from an editable layer. - Several keyboard shortcuts have changed -- all of the Alt+key shortcuts now either use Ctrl or a plain keypress with no modifier, to avoid clashes with window manager shortcuts and to make them easier to use and remember - The playback controls are now in a Playback menu as well as the toolbar. - There is a new key and mouse control reference under Help (or press F2). - You can double-click on a pane in navigate mode to jump to a time. - All of the single-colour layers (waveform, time values etc) now allow you to define your own colours as well as using the built-in set. The colour of a layer is now shown next to its name on the pane. - When you add a new single-colour layer it will use a default colour that is not yet in use in another layer (if there is one). - Single-colour layers can now optionally have black backgrounds (with a set of lighter colours in the default colour palette that use black backgrounds by default). - There's a new Printer colour scheme in the spectrogram with only a small number of grey shades. - Vertical zoom in a log-scaled spectrogram is much more intuitive; it now leaves the point that was in the centre of the visible area in the centre after zoom, instead of the point that was in the centre of the linear range corresponding to the visible area. - You can now turn a colour 3d plot layer upside down by clicking the Invert Vertical Scale button. - There's a new Layer Summary window which shows the panes and layer data in a tree layout. This is very simplistic at the moment. - Each pane now has an [X] button at its top left, which removes that pane when clicked. - There's a new Solo play mode toggle button; when active, only the currently selected pane is played. This is also the default when time alignment is in use. - Rewind/ffwd now stay confined to the selection if Play Selection is enabled; also, the rewind and ffwd "one step" buttons are now enabled even if there is no time instants layer for them to align to (they align to the time ruler instead and so jump in steps of a size dependent on the zoom level). - You can now export note layers to MIDI. - MIDI note velocity is partially supported. Note velocity is retained when importing and exporting MIDI and is used in playback, but it is not yet shown in the display and cannot yet be edited. - You can now drag-and-drop files (of whatever type) onto SV from other programs such as file managers or web browsers. - mp3 files (and Ogg, but they aren't supported on Windows at the moment) are now decoded in a background thread so you can see the start of the track without waiting for the rest to decode. - Mac builds of SV can now load AAC/mp4 files and anything else supported by QuickTime. - There is now an option to resample audio files on import if they don't match the samplerate of the first file loaded. By default this is switched off, as it affects the visible waveform. The default behaviour is unchanged (play at the wrong rate). There is still no option to handle multiple rates "correctly" (i.e. by resampling on playback and showing the waveforms at different resolutions according to each one's underlying rate) and there probably never will be. - SV can now open .m3u playlist files, though it's a hazardous thing to do as it simply loads all the files in the playlist at once. - SV now has various options for how to number tapped time instants (bar/beat, plain counter, time in seconds, tempo etc). - The official builds use Qt 4.3, which fixes some nasty bugs in the file dialog that the version 1.0 builds suffered from. sonic-visualiser-3.0.3/CITATION0000644000000000000000000000074013111512442014272 0ustar 00000000000000If you are using Sonic Visualiser in research work for publication, please cite: @InProceedings{SonicVisualiser, author = {C. Cannam and C. Landone and M. Sandler}, title = {Sonic Visualiser: An Open Source Application for Viewing, Analysing, and Annotating Music Audio Files}, pages = {1467--1468}, booktitle = {Proceedings of the ACM Multimedia 2010 International Conference}, month = {October}, year = {2010}, address = {Firenze, Italy}, } sonic-visualiser-3.0.3/COPYING0000644000000000000000000003543313111512442014177 0ustar 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 sonic-visualiser-3.0.3/Doxyfile0000644000000000000000000014253013111512442014647 0ustar 00000000000000# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Sonic Visualiser # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = main # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-3.0.3/INSTALL.txt0000644000000000000000000000536113111512442015010 0ustar 00000000000000 To compile Sonic Visualiser from source ======================================= Windows ------- Use the Qt Creator IDE with either the MinGW compiler (for 32-bit builds) or Visual C++ (for 64-bit builds). For details, see the wiki page at https://code.soundsoftware.ac.uk/projects/sonic-visualiser/wiki/WindowsBuild30 MacOS ----- Build from the command line, but don't use the configure script. Instead install Qt v5.x and run the Qt "qmake" command, then "make". Linux ----- $ ./configure && make && make install The following additional libraries are required or optional: REQUIRED Qt v5 http://qt-project.org/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED Rubber Band Library http://www.breakfastquay.com/rubberband/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Sord and Serd libraries http://drobilla.net/software/ REQUIRED Cap'n Proto http://capnproto.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://xiph.org/oggz/ Optional liblo OSC library http://www.plugin.org.uk/liblo/ Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have at least one of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). For Cap'n Proto, currently you will need the v0.6 release which (if not available as a package) can be obtained from the releases page on Github. To build it, you might do something like $ curl -L -o capnproto-v0.6.0.tar.gz https://github.com/sandstorm-io/capnproto/archive/v0.6.0.tar.gz $ tar xf capnproto-v0.6.0.tar.gz $ cd capnproto-0.6.0/c++ $ autoreconf -i $ ./configure --enable-static --disable-shared $ make && make install For the rest, if you happen to be using a Debian-based Linux, you probably want to apt install something like the following packages: build-essential libbz2-dev libfftw3-dev libfishsound1-dev libid3tag0-dev liblo-dev liblrdf0-dev libmad0-dev liboggz2-dev libpulse-dev libsamplerate-dev libsndfile-dev libsord-dev libxml2-utils portaudio19-dev qt5-default libqt5svg5-dev raptor-utils librubberband-dev git mercurial autoconf automake libtool sonic-visualiser-3.0.3/README0000644000000000000000000001013713111512442014016 0ustar 00000000000000 Sonic Visualiser ================ Sonic Visualiser is a program for viewing and analysing the contents of music audio files. With Sonic Visualiser you can: * Load audio files in various formats (WAV/AIFF, plus Ogg and mp3 if compiled in) and view their waveforms * Look at audio visualisations such as spectrogram views, with interactive adjustment of display parameters * Annotate audio data by adding labelled time points and defining segments, point values and curves * Run feature-extraction plugins to calculate annotations automatically, using algorithms such as beat trackers, pitch detectors and so on (see http://vamp-plugins.org/) * Import annotation data from various text formats and MIDI files * Play back the original audio with synthesised annotations, taking care to synchronise playback with the display position * Slow down and speed up playback and loop segments of interest, including seamless looping of complex non-contiguous areas * Export annotations and audio selections to external files. Sonic Visualiser can also be controlled remotely using the Open Sound Control (OSC) protocol (if support is compiled in). Credits ------- Sonic Visualiser was developed at the Centre for Digital Music, Queen Mary, University of London. http://c4dm.eecs.qmul.ac.uk/ Sonic Visualiser was written by Chris Cannam with contributions from Christian Landone, Mathieu Barthet, Dan Stowell, Jesus Corral Garcia, Matthias Mauch, and Craig Sapp. Code copyright 2005-2007 Chris Cannam and copyright 2006-2017 Queen Mary, University of London, except where indicated in the individual source files. Russian translation provided by Alexandre Prokoudine, copyright 2006-2017 Alexandre Prokoudine. Czech translation provided by Pavel Fric, copyright 2010-2017 Pavel Fric. This work was partially funded by the European Commission through the SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. This work was partially funded by the Arts and Humanities Research Council through its Research Centre for the History and Analysis of Recorded Music (CHARM). This work was partially funded by the Engineering and Physical Sciences Research Council through the OMRAS2 project EP/E017614/1, the Musicology for the Masses project EP/I001832/1, and the Sound Software project EP/H043101/1. Sonic Visualiser 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. See the file COPYING included with this distribution for more information. Sonic Visualiser may also make use of the following libraries: * Qt5 -- Copyright The Qt Company, distributed under the LGPL * JACK -- Copyright Paul Davis, Jack O'Quin et al, under the LGPL * PortAudio -- Copyright Ross Bencina, Phil Burk et al, BSD license * Ogg decoder -- Copyright CSIRO Australia, BSD license * MAD mp3 decoder -- Copyright Underbit Technologies Inc, GPL * libsamplerate -- Copyright Erik de Castro Lopo, BSD license * libsndfile -- Copyright Erik de Castro Lopo, LGPL * FFTW3 -- Copyright Matteo Frigo and MIT, GPL * Rubber Band -- Copyright Particular Programs Ltd, GPL * Vamp plugin SDK -- Copyright Chris Cannam and QMUL, BSD license * LADSPA plugin SDK -- Copyright Richard Furse et al, LGPL * RtMIDI -- Copyright Gary P. Scavone, BSD license * Dataquay -- Copyright Particular Programs Ltd, BSD license * Sord and Serd -- Copyright David Robillard, BSD license * Redland -- Copyright Dave Beckett and the University of Bristol, LGPL/Apache license * liblo OSC library -- Copyright Steve Harris, GPL * Cap'n Proto -- Copyright Sandstorm Development Group, Inc, BSD license (Some distributions of Sonic Visualiser may have one or more of these libraries statically linked.) Many thanks to their authors. Compiling Sonic Visualiser -------------------------- If you are planning to compile Sonic Visualiser from source code, please read the file INSTALL.txt. More information ---------------- For more information about Sonic Visualiser, please go to http://www.sonicvisualiser.org/ sonic-visualiser-3.0.3/README.OSC0000644000000000000000000002132313111512442014440 0ustar 00000000000000 OSC control of Sonic Visualiser =============================== Sonic Visualiser can be controlled remotely using the Open Sound Control protocol. This facility requires Steve Harris's liblo (Lite OSC) library to have been available when Sonic Visualiser was built. Sonic Visualiser opens a single OSC port on startup. The URL of this port is printed to standard output on startup, or can be read from the About box on the Help menu. OSC commands accepted by Sonic Visualiser take the form: ://:/ [ ...] For example, "osc.udp://localhost:12654/play 2.0" will play the current session from time 2.0 seconds. Methods that manipulate panes or layers act on the currently selected pane or layer. Use the setcurrent method to choose the right target for subsequent such methods. If you need an OSC client, there is a small program in the svcore library at svcore/data/osc/sv-osc-send.c that sends an OSC method and arguments to a given URL -- this is not specific to SV but will work with it. To compile that program you should only have to run $ gcc sv-osc-send.c -o sv-osc-send -llo provided you have liblo installed. Then there is a small shell script in the same directory, called sv-command, that provides a basic command shell for Sonic Visualiser. Start SV first, then sv-command should find its OSC port from the system process table when you start it. For example: $ PATH=.:$PATH ./sv-command # Set PATH so it can find sv-osc-send /open snare_hex.wav /add spectrogram /set layer Colour Sunset /play /quit $ OSC methods available ===================== Main window methods ------------------- /open Open a new file (of type determined by Sonic Visualiser). If it is an audio file, use it to replace the existing main audio file (if any). /openadditional Open a new file. If it is an audio file, open it in a new pane in addition to the existing audio file (if any). /recent /last Open the 'th most recent file from the Recent Files menu, counting from 1 for the most recent file opened. "last" is a synonym for "recent 1". /save Save the current session in as an SV session file. This action will try to fail rather than overwrite an existing file, but you probably shouldn't rely on that. /export Export the (first) selected area of the main audio file (or all of it, if there is no selection) in , as a WAV file. This action will try to fail rather than overwrite an existing file, but you probably shouldn't rely on that. /jump /jump end /jump selection Jump the playback position to time (in seconds); or to the end of the file; or to the start of the current selection. /play /play /play selection Start playback. If a time is given, start from that time in seconds. If the word "selection" is given instead, play the current selection. /stop Stop playback. /loop on /loop off Switch playback loop mode on or off. /select /select all /select none Select the region from times to in seconds; or select the whole file; or clear the selection. If there is a layer selected that can be used as a snap guide for the selection, then the selection will be snapped to it (in the same manner as when making selections interactively). /addselect Make an additional selection (leaving any existing selection in place) from times to in seconds. /undo /redo Undo the last editing operation; redo the last undone operation. Note that most of the classic editing operations (copy and paste etc) are not controllable via OSC, but undo may still be useful because Sonic Visualiser considers actions such as adding a pane to be undoable editing operations as well. /add /add Add a new pane containing a layer of the given type, based on the main audio file. If no is specified, use all available channels. Useful s are: waveform spectrogram spectrum timeruler The following s are less useful, because they create empty layers which there is currently no OSC support for editing: timeinstants timevalues notes text colour3dplot /set /set pane /set layer Set a main window control; a property of the current pane; or a property of the current layer. Accepted main window s are: gain whose values are linear multipliers (i.e. 1.0 == unity gain). speed takes a value of a percentage change in playback speed, so 100 is the default playback speed, 200 sets double the default speed, and 50 sets half the default. overlays controls the verbosity level of the text overlays on each pane, from 0 (everything off) to 2 (everything on). zoomwheels controls whether the zoom wheels are displayed (1) or not (0). propertyboxes controls whether the property boxes are displayed (1) or not (0). For pane and layer properties, the control name is the displayed name of the given property (though you may use "-" or "_" in place of any spaces in the name if it's easier for you). The value may be the displayed value or underlying integer for the property. Some examples: /set pane Global-Scroll off /set pane Follow_Playback Scroll /set layer Colour Blue /set layer Scale-Units dB /set layer Frequency-Scale Log Note that while you can use "-" or "_" in place of spaces in the property name, you cannot currently do so in the value text. If this is a problem for you, you might be able to set the value as an integer instead (all layer properties can be set this way). /setcurrent /setcurrent Make the given (a number counting from 1 for the topmost pane) and optionally the given on that pane (a number counting from 1 for the "frontmost" layer) the current pane and layer for subsequent pane and layer operations. /delete pane /delete layer Delete the current pane or layer. /zoom /zoom in /zoom out /zoom default Zoom to a given zoom , given in audio sample frames per pixel; or zoom in or out one step from the current level; or return to the default zoom level. This method acts on the current pane (it only affects all panes if set to Global Zoom, which is the default). /zoomvertical /zoomvertical in /zoomvertical out /zoomvertical default Change the vertical zoom and origin so as to show the value range from to in the vertical scale; or zoom in or out vertically; or return to the default vertical zoom level. The effect of this method is heavily dependent on the current layer. /transform Transform the current main audio file using the named transform. Transforms are named according to the scheme type:source:plugin:output For example, the percussion onset detector from the Vamp example plugin set can be invoked via /transform vamp:vamp-example-plugins:percussiononsets:onsets If the output is omitted, the first is used. Note that you need to use the plugin and output name, not description: in this case "percussiononsets" rather than "Simple Percussion Onset Detector". There is not yet any way to run a transform via OSC on any but the main audio file, nor with any but its default parameters, processing block/step size, or channel selection. /resize /resize pane Resize the main window to width and height (if the window system permits); resize the current pane to height if possible (!!! not yet working). /quit Exit the program abruptly without saving. Handy things still missing from the OSC interface include: * the ability to run transforms with non-default parameters or starting from different source models * the ability to add layers to a pane (without transform) * the ability to add panes (and layers) showing any but the main model * the ability to set play parameters on a layer/model and show/hide it * the ability to set the vertical zoom range (vital for spectrogram) * the ability to import and export layers * a working pane resize * quick shortcuts to Melodic Range Spectrogram, Peak Frequency Spectrogram * the ability to rename a layer sonic-visualiser-3.0.3/acinclude.m40000644000000000000000000002160413111512442015330 0ustar 00000000000000 AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, $QTDIR/bin/qt5-qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, qt5-qmake,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) # From autoconf archive: # ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # # The first argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The second argument, if specified 'mandatory' or if left unspecified, # indicates that baseline C++11 support is required and that the macro # should error out if no mode with that support is found. If specified # 'optional', then configuration proceeds regardless, after defining # HAVE_CXX11 if and only if a supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014 Alexey Sokolov # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; ]]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi AC_SUBST(HAVE_CXX11) fi ]) sonic-visualiser-3.0.3/base.pri0000644000000000000000000000351513111512442014566 0ustar 00000000000000 SV_INCLUDEPATH = \ . \ bqvec \ bqvec/bqvec \ bqfft \ bqresample \ bqaudioio \ bqaudioio/bqaudioio \ piper-cpp \ checker \ checker/checker \ dataquay \ dataquay/dataquay \ svcore \ svcore/data \ svcore/plugin/api/alsa \ svgui \ svapp \ vamp-plugin-sdk DEPENDPATH += $$SV_INCLUDEPATH INCLUDEPATH += $$SV_INCLUDEPATH # Platform defines for RtMidi linux*: DEFINES += __LINUX_ALSASEQ__ __LINUX_ALSA__ macx*: DEFINES += __MACOSX_CORE__ win*: DEFINES += __WINDOWS_MM__ solaris*: DEFINES += __RTMIDI_DUMMY_ONLY__ # Defines for Dataquay DEFINES += USE_SORD CONFIG += qt thread warn_on stl rtti exceptions c++11 include(bq-files.pri) include(vamp-plugin-sdk-files.pri) include(svcore/files.pri) DATAQUAY_SOURCES=$$fromfile(dataquay/lib.pro, SOURCES) DATAQUAY_HEADERS=$$fromfile(dataquay/lib.pro, HEADERS) CHECKER_SOURCES=$$fromfile(checker/checker.pri, SOURCES) CHECKER_HEADERS=$$fromfile(checker/checker.pri, HEADERS) CLIENT_HEADERS=$$fromfile(piper-cpp/vamp-client/qt/test.pro, HEADERS) for (file, BQ_SOURCES) { SOURCES += $$file } for (file, BQ_HEADERS) { HEADERS += $$file } for (file, VAMP_SOURCES) { SOURCES += $$file } for (file, VAMP_HEADERS) { HEADERS += $$file } for (file, DATAQUAY_SOURCES) { SOURCES += $$sprintf("dataquay/%1", $$file) } for (file, DATAQUAY_HEADERS) { HEADERS += $$sprintf("dataquay/%1", $$file) } for (file, CHECKER_SOURCES) { SOURCES += $$sprintf("checker/%1", $$file) } for (file, CHECKER_HEADERS) { HEADERS += $$sprintf("checker/%1", $$file) } for (file, SVCORE_SOURCES) { SOURCES += $$sprintf("svcore/%1", $$file) } for (file, SVCORE_HEADERS) { HEADERS += $$sprintf("svcore/%1", $$file) } for (file, CLIENT_HEADERS) { HEADERS += $$sprintf("piper-cpp/vamp-client/qt/%1", $$file) } SOURCES += piper-cpp/vamp-capnp/piper-capnp.cpp sonic-visualiser-3.0.3/bootstrap.sh0000644000000000000000000000004413111512442015503 0ustar 00000000000000#!/bin/sh aclocal -I . && autoconf sonic-visualiser-3.0.3/bq-files.pri0000644000000000000000000000237613111512442015362 0ustar 00000000000000 BQ_HEADERS += \ bqvec/bqvec/Allocators.h \ bqvec/bqvec/Barrier.h \ bqvec/bqvec/ComplexTypes.h \ bqvec/bqvec/Restrict.h \ bqvec/bqvec/RingBuffer.h \ bqvec/bqvec/VectorOpsComplex.h \ bqvec/bqvec/VectorOps.h \ bqvec/pommier/neon_mathfun.h \ bqvec/pommier/sse_mathfun.h \ bqfft/bqfft/FFT.h \ bqresample/bqresample/Resampler.h \ bqresample/speex/speex_resampler.h \ bqaudioio/bqaudioio/ApplicationPlaybackSource.h \ bqaudioio/bqaudioio/ApplicationRecordTarget.h \ bqaudioio/bqaudioio/AudioFactory.h \ bqaudioio/bqaudioio/ResamplerWrapper.h \ bqaudioio/bqaudioio/SystemAudioIO.h \ bqaudioio/bqaudioio/SystemPlaybackTarget.h \ bqaudioio/bqaudioio/SystemRecordSource.h \ bqaudioio/src/DynamicJACK.h \ bqaudioio/src/JACKAudioIO.h \ bqaudioio/src/Log.h \ bqaudioio/src/PortAudioIO.h \ bqaudioio/src/PulseAudioIO.h BQ_SOURCES += \ bqvec/src/Allocators.cpp \ bqvec/src/Barrier.cpp \ bqvec/src/VectorOpsComplex.cpp \ bqfft/src/FFT.cpp \ bqresample/src/Resampler.cpp \ bqaudioio/src/AudioFactory.cpp \ bqaudioio/src/JACKAudioIO.cpp \ bqaudioio/src/Log.cpp \ bqaudioio/src/PortAudioIO.cpp \ bqaudioio/src/PulseAudioIO.cpp \ bqaudioio/src/ResamplerWrapper.cpp \ bqaudioio/src/SystemPlaybackTarget.cpp \ bqaudioio/src/SystemRecordSource.cpp sonic-visualiser-3.0.3/config.pri.in0000644000000000000000000000071513111512442015525 0ustar 00000000000000 CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ QMAKE_LFLAGS += @LDFLAGS@ linux*:LIBS += -lasound -ldl macx*:DEFINES += HAVE_COREAUDIO macx*:LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ DEFINES += HAVE_PIPER HAVE_PLUGIN_CHECKER_HELPER sonic-visualiser-3.0.3/configure0000755000000000000000000102226213111512442015050 0ustar 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="Sonic Visualiser" ac_unique_file="main/main.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL X11_LIBS X11_CFLAGS id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_LIBS portaudio_CFLAGS liblo_LIBS liblo_CFLAGS capnp_LIBS capnp_CFLAGS serd_LIBS serd_CFLAGS sord_LIBS sord_CFLAGS rubberband_LIBS rubberband_CFLAGS libsamplerate_LIBS libsamplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP HAVE_CXX11 MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS libsamplerate_CFLAGS libsamplerate_LIBS rubberband_CFLAGS rubberband_LIBS sord_CFLAGS sord_LIBS serd_CFLAGS serd_LIBS capnp_CFLAGS capnp_LIBS liblo_CFLAGS liblo_LIBS portaudio_CFLAGS portaudio_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS X11_CFLAGS X11_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config libsamplerate_CFLAGS C compiler flags for libsamplerate, overriding pkg-config libsamplerate_LIBS linker flags for libsamplerate, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config sord_CFLAGS C compiler flags for sord, overriding pkg-config sord_LIBS linker flags for sord, overriding pkg-config serd_CFLAGS C compiler flags for serd, overriding pkg-config serd_LIBS linker flags for serd, overriding pkg-config capnp_CFLAGS C compiler flags for capnp, overriding pkg-config capnp_LIBS linker flags for capnp, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_CFLAGS C compiler flags for portaudio, overriding pkg-config portaudio_LIBS linker flags for portaudio, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config X11_CFLAGS C compiler flags for X11, overriding pkg-config X11_LIBS linker flags for X11, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } # We are daringly making use of C++11 now ax_cxx_compile_cxx11_required=true ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING -DNO_HIT_COUNTS" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-std=c++11 -fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g -Werror" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O3 -ffast-math" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=libsamplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo libsamplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libsamplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libsamplerate_CFLAGS" LIBS="$LIBS $libsamplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$libsamplerate_CFLAGS"; then pkg_cv_libsamplerate_CFLAGS="$libsamplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libsamplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libsamplerate_LIBS"; then pkg_cv_libsamplerate_LIBS="$libsamplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libsamplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libsamplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libsamplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libsamplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libsamplerate_CFLAGS=$pkg_cv_libsamplerate_CFLAGS libsamplerate_LIBS=$pkg_cv_libsamplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libsamplerate_CFLAGS";LIBS="$LIBS $libsamplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sord SV_MODULE_VERSION_TEST="sord-0 >= 0.5" SV_MODULE_HEADER=sord/sord.h SV_MODULE_LIB=sord-0 SV_MODULE_FUNC=sord_world_new SV_MODULE_HAVE=HAVE_$(echo sord | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sord_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sord_CFLAGS" LIBS="$LIBS $sord_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$sord_CFLAGS"; then pkg_cv_sord_CFLAGS="$sord_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sord_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sord_LIBS"; then pkg_cv_sord_LIBS="$sord_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sord_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sord_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sord_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sord_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sord_CFLAGS=$pkg_cv_sord_CFLAGS sord_LIBS=$pkg_cv_sord_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sord_CFLAGS";LIBS="$LIBS $sord_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=serd SV_MODULE_VERSION_TEST="serd-0 >= 0.5" SV_MODULE_HEADER=serd/serd.h SV_MODULE_LIB=serd-0 SV_MODULE_FUNC=serd_reader_read_file SV_MODULE_HAVE=HAVE_$(echo serd | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$serd_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $serd_CFLAGS" LIBS="$LIBS $serd_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$serd_CFLAGS"; then pkg_cv_serd_CFLAGS="$serd_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_serd_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$serd_LIBS"; then pkg_cv_serd_LIBS="$serd_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_serd_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then serd_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else serd_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$serd_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else serd_CFLAGS=$pkg_cv_serd_CFLAGS serd_LIBS=$pkg_cv_serd_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $serd_CFLAGS";LIBS="$LIBS $serd_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi # We need a Cap'n Proto version with the expectedSizeInWordsFromPrefix # function, which appeared in v0.6. If we can't find at least that # version with pkg-config, we check for the symbol with the compiler. pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for capnp >= 0.6" >&5 $as_echo_n "checking for capnp >= 0.6... " >&6; } if test -n "$capnp_CFLAGS"; then pkg_cv_capnp_CFLAGS="$capnp_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"capnp >= 0.6\""; } >&5 ($PKG_CONFIG --exists --print-errors "capnp >= 0.6") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_capnp_CFLAGS=`$PKG_CONFIG --cflags "capnp >= 0.6" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$capnp_LIBS"; then pkg_cv_capnp_LIBS="$capnp_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"capnp >= 0.6\""; } >&5 ($PKG_CONFIG --exists --print-errors "capnp >= 0.6") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_capnp_LIBS=`$PKG_CONFIG --libs "capnp >= 0.6" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then capnp_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "capnp >= 0.6" 2>&1` else capnp_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "capnp >= 0.6" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$capnp_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module capnp using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module capnp using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module capnp using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module capnp using pkg-config, trying again by old-fashioned means" >&6;} else capnp_CFLAGS=$pkg_cv_capnp_CFLAGS capnp_LIBS=$pkg_cv_capnp_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES HAVE_CAPNP";CXXFLAGS="$CXXFLAGS $capnp_CFLAGS";LIBS="$LIBS $capnp_LIBS" fi if test -z "$capnp_LIBS" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { kj::Array prefix; return capnp::expectedSizeInWordsFromPrefix(prefix.asPtr()); } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : HAVES="$HAVES HAVE_CAPNP";LIBS="$LIBS -lcapnp -lkj" else as_fn_error $? "Failed to find appropriate capnp library" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS" LIBS="$LIBS $portaudio_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$portaudio_CFLAGS"; then pkg_cv_portaudio_CFLAGS="$portaudio_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_LIBS"; then pkg_cv_portaudio_LIBS="$portaudio_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_CFLAGS=$pkg_cv_portaudio_CFLAGS portaudio_LIBS=$pkg_cv_portaudio_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS";LIBS="$LIBS $portaudio_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi # Link in -lX11 if it exists -- this is for the X error handler SV_MODULE_MODULE=X11 SV_MODULE_VERSION_TEST="x11 >= 1.0.0" SV_MODULE_HEADER=X11/X.h SV_MODULE_LIB=x11 SV_MODULE_FUNC=XGetErrorText SV_MODULE_HAVE=HAVE_$(echo X11 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$X11_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $X11_CFLAGS" LIBS="$LIBS $X11_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_VERSION_TEST" >&5 $as_echo_n "checking for $SV_MODULE_VERSION_TEST... " >&6; } if test -n "$X11_CFLAGS"; then pkg_cv_X11_CFLAGS="$X11_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X11_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$X11_LIBS"; then pkg_cv_X11_LIBS="$X11_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X11_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else X11_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$X11_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else X11_CFLAGS=$pkg_cv_X11_CFLAGS X11_LIBS=$pkg_cv_X11_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $X11_CFLAGS";LIBS="$LIBS $X11_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r sonic-visualiser.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-3.0.3/configure.ac0000644000000000000000000001311113111512442015417 0ustar 00000000000000 AC_INIT([Sonic Visualiser], [], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(main/main.cpp) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P # We are daringly making use of C++11 now AX_CXX_COMPILE_STDCXX_11(noext) AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING -DNO_HIT_COUNTS" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-std=c++11 -fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g -Werror" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O3 -ffast-math" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([libsamplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_REQUIRED([sord],[sord-0 >= 0.5],[sord/sord.h],[sord-0],[sord_world_new]) SV_MODULE_REQUIRED([serd],[serd-0 >= 0.5],[serd/serd.h],[serd-0],[serd_reader_read_file]) # We need a Cap'n Proto version with the expectedSizeInWordsFromPrefix # function, which appeared in v0.6. If we can't find at least that # version with pkg-config, we check for the symbol with the compiler. PKG_CHECK_MODULES([capnp],[capnp >= 0.6],[HAVES="$HAVES HAVE_CAPNP";CXXFLAGS="$CXXFLAGS $capnp_CFLAGS";LIBS="$LIBS $capnp_LIBS"],[AC_MSG_NOTICE([Failed to find required module capnp using pkg-config, trying again by old-fashioned means])]) if test -z "$capnp_LIBS" ; then AC_COMPILE_IFELSE([ AC_LANG_SOURCE([[ #include int main() { kj::Array prefix; return capnp::expectedSizeInWordsFromPrefix(prefix.asPtr()); }]])], [HAVES="$HAVES HAVE_CAPNP";LIBS="$LIBS -lcapnp -lkj"], [AC_MSG_ERROR([Failed to find appropriate capnp library])] ) fi SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) # Link in -lX11 if it exists -- this is for the X error handler SV_MODULE_OPTIONAL([X11],[x11 >= 1.0.0],[X11/X.h],[x11],[XGetErrorText]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(LDFLAGS) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r sonic-visualiser.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-3.0.3/convert.pro0000644000000000000000000000233713111512442015343 0ustar 00000000000000 TEMPLATE = app CONFIG += stl c++11 exceptions console warn_on CONFIG -= qt exists(config.pri) { include(config.pri) } !exists(config.pri) { include(noconfig.pri) macx*: LIBS -= -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices -framework Accelerate -lbz2 -lz } # Can't support this flag with the JSON11 and basen modules as they stand QMAKE_CXXFLAGS -= -Werror # Using the "console" CONFIG flag above should ensure this happens for # normal Windows builds, but this may be necessary when cross-compiling win32-x-g++: QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle linux*: LIBS += -ldl TARGET = piper-convert OBJECTS_DIR = o MOC_DIR = o INCLUDEPATH += piper-cpp piper-cpp/ext vamp-plugin-sdk include(vamp-plugin-sdk-files.pri) for (file, VAMP_SOURCES) { SOURCES += $$file } for (file, VAMP_HEADERS) { HEADERS += $$file } HEADERS += \ piper-cpp/vamp-capnp/piper.capnp.h \ piper-cpp/vamp-capnp/VampnProto.h SOURCES += \ piper-cpp/vamp-capnp/piper-capnp.cpp \ piper-cpp/ext/json11/json11.cpp \ piper-cpp/vamp-server/convert.cpp sonic-visualiser-3.0.3/deploy/linux/deb-skeleton/DEBIAN/control0000644000000000000000000000175213111512442022475 0ustar 00000000000000Package: sonic-visualiser Priority: optional Maintainer: Chris Cannam Architecture: amd64 Version: 2.4cc-1 Installed-Size: 6056 Section: contrib/sound Depends: libqt5core5a, libsndfile1, libsamplerate0, libfftw3-3, libbz2-1.0, libpulse0, libmad0, libid3tag0, liboggz2, libfishsound1, libasound2, liblo7, liblrdf0, libsord-0-0, libserd-0-0, vamp-plugin-sdk, librubberband2, libc6 Description: View and analyse the contents of music audio files Sonic Visualiser is an application for viewing and analysing the contents of music audio files. It was developed at the Centre for Digital Music at Queen Mary, University of London. Our aim is for it to be the first program you reach for when want to study a musical recording rather than simply listen to it. We hope Sonic Visualiser will be of particular interest to musicologists, archivists, signal-processing researchers and anyone else looking for a friendly way to take a look at what lies inside the audio file. sonic-visualiser-3.0.3/deploy/linux/deb-skeleton/usr/share/applications/sonic-visualiser.desktop0000644000000000000000000000105713111512442031441 0ustar 00000000000000[Desktop Entry] Name=Sonic Visualiser Comment=Viewing and analysing the contents of music audio files Comment[fr]=Affichage et analyse des contenus des fichiers audio de musique Exec=sonic-visualiser %U Keywords=audio; sound; visualiser; sonic; Terminal=false Type=Application Icon=sv-icon Categories=Audio;AudioVideo; MimeType=application/x-sonicvisualiser;application/x-sonicvisualiser-layer;application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg; sonic-visualiser-3.0.3/deploy/linux/deb-skeleton/usr/share/doc/sonic-visualiser/README0000644000000000000000000000751013111512442027005 0ustar 00000000000000 Sonic Visualiser ================ Sonic Visualiser is a program for viewing and analysing the contents of music audio files. With Sonic Visualiser you can: * Load audio files in various formats (WAV/AIFF, plus Ogg and mp3 if compiled in) and view their waveforms * Look at audio visualisations such as spectrogram views, with interactive adjustment of display parameters * Annotate audio data by adding labelled time points and defining segments, point values and curves * Run feature-extraction plugins to calculate annotations automatically, using algorithms such as beat trackers, pitch detectors and so on (see http://vamp-plugins.org/) * Import annotation data from various text formats and MIDI files * Play back the original audio with synthesised annotations, taking care to synchronise playback with the display position * Slow down and speed up playback and loop segments of interest, including seamless looping of complex non-contiguous areas * Export annotations and audio selections to external files. Sonic Visualiser can also be controlled remotely using the Open Sound Control (OSC) protocol (if support is compiled in). Credits ------- Sonic Visualiser was developed at the Centre for Digital Music, Queen Mary, University of London. http://c4dm.eecs.qmul.ac.uk/ Sonic Visualiser was written by Chris Cannam with contributions from Christian Landone, Mathieu Barthet, Dan Stowell, Jesus Corral Garcia, Matthias Mauch, and Craig Sapp. Code copyright 2005-2007 Chris Cannam and copyright 2006-2014 Queen Mary, University of London, except where indicated in the individual source files. This work was partially funded by the European Commission through the SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. This work was partially funded by the Arts and Humanities Research Council through its Research Centre for the History and Analysis of Recorded Music (CHARM). This work was partially funded by the Engineering and Physical Sciences Research Council through the OMRAS2 project EP/E017614/1, the Musicology for the Masses project EP/I001832/1, and the Sound Software project EP/H043101/1. Sonic Visualiser 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. See the file COPYING included with this distribution for more information. Sonic Visualiser may also make use of the following libraries: * Qt5 -- Copyright Digia Oyj, distributed under the LGPL * JACK -- Copyright Paul Davis, Jack O'Quin et al, under the LGPL * PortAudio -- Copyright Ross Bencina, Phil Burk et al, BSD license * Ogg decoder -- Copyright CSIRO Australia, BSD license * MAD mp3 decoder -- Copyright Underbit Technologies Inc, GPL * libsamplerate -- Copyright Erik de Castro Lopo, GPL * libsndfile -- Copyright Erik de Castro Lopo, LGPL * FFTW3 -- Copyright Matteo Frigo and MIT, GPL * Rubber Band -- Copyright Chris Cannam, GPL * Vamp plugin SDK -- Copyright Chris Cannam and QMUL, BSD license * LADSPA plugin SDK -- Copyright Richard Furse et al, LGPL * RtMIDI -- Copyright Gary P. Scavone, BSD license * Dataquay -- Copyright Breakfast Quay, BSD license * Sord and Serd -- Copyright David Robillard, BSD license * Redland -- Copyright Dave Beckett and the University of Bristol, LGPL/Apache license * liblo OSC library -- Copyright Steve Harris, GPL (Some distributions of Sonic Visualiser may have one or more of these libraries statically linked.) Many thanks to their authors. Compiling Sonic Visualiser -------------------------- If you are planning to compile Sonic Visualiser from source code, please read the file INSTALL.txt. More information ---------------- For more information about Sonic Visualiser, please go to http://www.sonicvisualiser.org/ sonic-visualiser-3.0.3/deploy/linux/deb-skeleton/usr/share/doc/sonic-visualiser/changelog.Debian.gz0000644000000000000000000000004513111512442031573 0ustar 00000000000000‹<"Tchangelog.Debiansonic-visualiser-3.0.3/deploy/linux/deb-skeleton/usr/share/doc/sonic-visualiser/copyright0000644000000000000000000000252113111512442030055 0ustar 00000000000000Sonic Visualiser was developed at the Centre for Digital Music, Queen Mary, University of London. http://www.elec.qmul.ac.uk/digitalmusic/ The main program is by Chris Cannam, with additional DSP and program design work by Christian Landone. Thanks also to Craig Sapp for his suggestions and useful feedback. Code copyright 2005-2007 Chris Cannam and copyright 2006-2014 Queen Mary, University of London, except where indicated in the individual source files. This work was partially funded by the European Commission through the SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. This work was partially funded by the Arts and Humanities Research Council through its Research Centre for the History and Analysis of Recorded Music (CHARM). This work was partially funded by the Engineering and Physical Sciences Research Council through the OMRAS2 project EP/E017614/1. This work was partially funded by the Engineering and Physical Sciences Research Council through the Musicology for the Masses project EP/I001832/1. Sonic Visualiser 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. See the file /usr/share/common-licenses/GPL-2 for more information. sonic-visualiser-3.0.3/deploy/linux/debian-dependencies.sh0000644000000000000000000000170613111512442021775 0ustar 00000000000000#!/bin/bash target=$1 if [ ! -f "$target" ]; then echo "Usage: $0 target-executable" exit 1 fi pfile=/tmp/packages_$$ rfile=/tmp/redundant_$$ trap "rm -f $pfile $rfile" 0 echo 1>&2 ldd "$target" | awk '{ print $3; }' | grep '^/' | while read lib; do if test -n "$lib" ; then dpkg-query -S "$lib" fi done | grep ': ' | awk -F: '{ print $1 }' | sort | uniq > $pfile echo "Packages providing required libraries:" 1>&2 cat $pfile 1>&2 echo 1>&2 for p in `cat $pfile`; do echo Looking at $p 1>&2 apt-cache showpkg "$p" | grep '^ ' | grep ',' | awk -F, '{ print $1; }' | \ while read d; do if grep -q '^'$d'$' $pfile; then echo $p fi done done | sort | uniq > $rfile echo "Packages that can be eliminated because other packages depend on them:" 1>&2 cat $rfile 1>&2 echo 1>&2 cat $pfile $rfile | sort | uniq -u | sed 's/$/,/' | fmt -1000 | sed 's/^/Depends: /' | sed 's/,$/, libc6/' | sed 's/libjack0,/jackd,/' sonic-visualiser-3.0.3/deploy/linux/deploy-deb.sh0000755000000000000000000000253413111512442020156 0ustar 00000000000000#!/bin/bash # # Run this from the build root (with sudo, I think) usage() { echo echo "Usage:" echo echo "$0 " echo echo "For example: $0 2.4cc1-1 amd64" echo exit 2 } version="$1" arch="$2" if [ -z "$version" ] || [ -z "$arch" ]; then usage fi set -eu program=sonic-visualiser checker=vamp-plugin-load-checker piper=piper-vamp-simple-server depdir=deploy/linux targetdir="${program}_${version}_${arch}" echo "Target dir is $targetdir" if [ -d "$targetdir" ]; then echo "Target directory exists, not overwriting" exit fi mkdir "$targetdir" cp -r "$depdir"/deb-skeleton/* "$targetdir"/ mkdir -p "$targetdir"/usr/bin "$targetdir"/usr/share/pixmaps cp "$program" "$checker" "$piper" "$targetdir"/usr/bin/ cp icons/sv-icon*.svg "$targetdir"/usr/share/pixmaps/ cp "$program".desktop "$targetdir"/usr/share/applications/ cp README "$targetdir"/usr/share/doc/"$program"/ perl -i -p -e "s/Architecture: .*/Architecture: $arch/" "$targetdir"/DEBIAN/control deps=`bash "$depdir"/debian-dependencies.sh "$program"` perl -i -p -e "s/Depends: .*/$deps/" "$targetdir"/DEBIAN/control control_ver=${version%-?} perl -i -p -e "s/Version: .*/Version: $control_ver/" "$targetdir"/DEBIAN/control bash "$depdir"/fix-lintian-bits.sh "$targetdir" dpkg-deb --build "$targetdir" && lintian "$targetdir".deb sonic-visualiser-3.0.3/deploy/linux/doc/sonic-visualiser/copyright0000644000000000000000000000252113111512442023566 0ustar 00000000000000Sonic Visualiser was developed at the Centre for Digital Music, Queen Mary, University of London. http://www.elec.qmul.ac.uk/digitalmusic/ The main program is by Chris Cannam, with additional DSP and program design work by Christian Landone. Thanks also to Craig Sapp for his suggestions and useful feedback. Code copyright 2005-2007 Chris Cannam and copyright 2006-2014 Queen Mary, University of London, except where indicated in the individual source files. This work was partially funded by the European Commission through the SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. This work was partially funded by the Arts and Humanities Research Council through its Research Centre for the History and Analysis of Recorded Music (CHARM). This work was partially funded by the Engineering and Physical Sciences Research Council through the OMRAS2 project EP/E017614/1. This work was partially funded by the Engineering and Physical Sciences Research Council through the Musicology for the Masses project EP/I001832/1. Sonic Visualiser 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. See the file /usr/share/common-licenses/GPL-2 for more information. sonic-visualiser-3.0.3/deploy/linux/docker/Dockerfile_v3.0.1_ubuntu16040000644000000000000000000000220413111512442023650 0ustar 00000000000000FROM ubuntu:16.04 MAINTAINER Chris Cannam RUN apt-get update && \ apt-get install -y \ build-essential \ libbz2-dev \ libfftw3-dev \ libfishsound1-dev \ libid3tag0-dev \ liblo-dev \ liblrdf0-dev \ libmad0-dev \ liboggz2-dev \ libpulse-dev \ libsamplerate-dev \ libsndfile-dev \ libsord-dev \ libxml2-utils \ portaudio19-dev \ qt5-default libqt5svg5-dev \ raptor-utils \ librubberband-dev \ git \ mercurial \ curl wget \ autoconf automake libtool lintian RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN git clone https://github.com/sandstorm-io/capnproto WORKDIR capnproto/c++ RUN ./setup-autotools.sh && autoreconf -i RUN ./configure --enable-static --disable-shared RUN make && make install WORKDIR ../.. RUN hg clone -rsv_v3.0.1 https://code.soundsoftware.ac.uk/hg/sonic-visualiser WORKDIR sonic-visualiser RUN ./configure RUN make -j3 RUN deploy/linux/deploy-deb.sh 3.0.1 amd64 RUN tar cvf output.tar *.deb && cp output.tar .. sonic-visualiser-3.0.3/deploy/linux/docker/Dockerfile_v3.0.2_ubuntu16040000644000000000000000000000220413111512442023651 0ustar 00000000000000FROM ubuntu:16.04 MAINTAINER Chris Cannam RUN apt-get update && \ apt-get install -y \ build-essential \ libbz2-dev \ libfftw3-dev \ libfishsound1-dev \ libid3tag0-dev \ liblo-dev \ liblrdf0-dev \ libmad0-dev \ liboggz2-dev \ libpulse-dev \ libsamplerate-dev \ libsndfile-dev \ libsord-dev \ libxml2-utils \ portaudio19-dev \ qt5-default libqt5svg5-dev \ raptor-utils \ librubberband-dev \ git \ mercurial \ curl wget \ autoconf automake libtool lintian RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN git clone https://github.com/sandstorm-io/capnproto WORKDIR capnproto/c++ RUN ./setup-autotools.sh && autoreconf -i RUN ./configure --enable-static --disable-shared RUN make && make install WORKDIR ../.. RUN hg clone -rsv_v3.0.2 https://code.soundsoftware.ac.uk/hg/sonic-visualiser WORKDIR sonic-visualiser RUN ./configure RUN make -j3 RUN deploy/linux/deploy-deb.sh 3.0.2 amd64 RUN tar cvf output.tar *.deb && cp output.tar .. sonic-visualiser-3.0.3/deploy/linux/docker/Dockerfile_v3.0.3_ubuntu16040000644000000000000000000000230413111512442023653 0ustar 00000000000000FROM ubuntu:16.04 MAINTAINER Chris Cannam RUN apt-get update && \ apt-get install -y \ build-essential \ libbz2-dev \ libfftw3-dev \ libfishsound1-dev \ libid3tag0-dev \ liblo-dev \ liblrdf0-dev \ libmad0-dev \ liboggz2-dev \ libpulse-dev \ libsamplerate-dev \ libsndfile-dev \ libsord-dev \ libxml2-utils \ portaudio19-dev \ qt5-default libqt5svg5-dev \ raptor-utils \ librubberband-dev \ git \ mercurial \ curl wget \ autoconf automake libtool lintian RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN curl -L -o capnproto-v0.6.0.tar.gz https://github.com/sandstorm-io/capnproto/archive/v0.6.0.tar.gz RUN tar xf capnproto-v0.6.0.tar.gz WORKDIR capnproto-0.6.0/c++ RUN autoreconf -i RUN ./configure --enable-static --disable-shared RUN make && make install WORKDIR ../.. RUN hg clone -rsv_v3.0.3 https://code.soundsoftware.ac.uk/hg/sonic-visualiser WORKDIR sonic-visualiser RUN ./configure RUN make -j3 RUN deploy/linux/deploy-deb.sh 3.0.3 amd64 RUN tar cvf output.tar *.deb && cp output.tar .. sonic-visualiser-3.0.3/deploy/linux/docker/Dockerfile_v3.0_ubuntu16040000644000000000000000000000220013111512442023505 0ustar 00000000000000FROM ubuntu:16.04 MAINTAINER Chris Cannam RUN apt-get update && \ apt-get install -y \ build-essential \ libbz2-dev \ libfftw3-dev \ libfishsound1-dev \ libid3tag0-dev \ liblo-dev \ liblrdf0-dev \ libmad0-dev \ liboggz2-dev \ libpulse-dev \ libsamplerate-dev \ libsndfile-dev \ libsord-dev \ libxml2-utils \ portaudio19-dev \ qt5-default libqt5svg5-dev \ raptor-utils \ librubberband-dev \ git \ mercurial \ curl wget \ autoconf automake libtool lintian RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN git clone https://github.com/sandstorm-io/capnproto WORKDIR capnproto/c++ RUN ./setup-autotools.sh && autoreconf -i RUN ./configure --enable-static --disable-shared RUN make && make install WORKDIR ../.. RUN hg clone -rsv_v3.0 https://code.soundsoftware.ac.uk/hg/sonic-visualiser WORKDIR sonic-visualiser RUN ./configure RUN make -j3 RUN deploy/linux/deploy-deb.sh 3.0 amd64 RUN tar cvf output.tar *.deb && cp output.tar .. sonic-visualiser-3.0.3/deploy/linux/docker/build.sh0000755000000000000000000000203713111512442020476 0ustar 00000000000000#!/bin/bash version=$(perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h | sed 's/-//g') dockerdir=./deploy/linux/docker if [ ! -d "$dockerdir" ]; then echo "Run this script from the build root" exit 2 fi platform="$1" if [ -z "$platform" ] || [ -n "$2" ]; then echo "Usage: $0 " echo "where matches the suffix of the Docker file, e.g. ubuntu1604" exit 2 fi set -eu echo "Building for version $version, platform $platform" dockerfile="Dockerfile_v${version}_${platform}" if [ ! -f "$dockerdir/$dockerfile" ]; then echo "No matching docker file $dockerfile found in $dockerdir" exit 1 fi dockertag="cannam/sonic-visualiser-$platform" sudo docker build -t "$dockertag" -f "$dockerdir/$dockerfile" "$dockerdir" outdir="$dockerdir/output" mkdir -p "$outdir" container=$(sudo docker create "$dockertag") sudo docker cp "$container":output.tar "$outdir" sudo docker rm "$container" ( cd "$outdir" ; tar xf output.tar && rm -f output.tar ) echo echo "Done, output directory contains:" ls -ltr "$outdir" sonic-visualiser-3.0.3/deploy/linux/fix-lintian-bits.sh0000755000000000000000000000046513111512442021314 0ustar 00000000000000#!/bin/bash dir=$1 [ -d "$dir" ] || exit 1 set -eu strip "$dir"/usr/bin/* sz=`du -sx --exclude DEBIAN "$dir" | awk '{ print $1; }'` perl -i -p -e "s/Installed-Size: .*/Installed-Size: $sz/" "$dir"/DEBIAN/control find "$dir" -name \*~ -exec rm \{\} \; chown -R root.root "$dir"/* chmod -R g-w "$dir"/* sonic-visualiser-3.0.3/deploy/linux/remember-to-run-lintian0000644000000000000000000000000013111512442022154 0ustar 00000000000000sonic-visualiser-3.0.3/deploy/osx/Info.plist0000644000000000000000000000711713111512442017217 0ustar 00000000000000 CFBundlePackageType APPL CFBundleName Sonic Visualiser CFBundleExecutable Sonic Visualiser CFBundleIconFile sv-macicon.icns CFBundleIdentifier org.sonicvisualiser.SonicVisualiser CFBundleShortVersionString SV_VERSION NSPrincipalClass NSApplication NSHighResolutionCapable True CFBundleDocumentTypes CFBundleTypeExtensions sv CFBundleTypeMIMETypes application/x-sonic-visualiser-session CFBundleTypeName Sonic Visualiser Session CFBundleTypeOSTypes **** CFBundleTypeRole Editor LSHandlerRank Owner LSIsAppleDefaultForType CFBundleTypeExtensions mp3 CFBundleTypeMIMETypes audio/mpeg CFBundleTypeName MP3 Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions ogg oga CFBundleTypeMIMETypes audio/ogg CFBundleTypeName Ogg Vorbis Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions wav CFBundleTypeMIMETypes audio/x-wav CFBundleTypeName Wave Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions aif aiff CFBundleTypeMIMETypes audio/x-aiff CFBundleTypeName AIFF Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions flac CFBundleTypeMIMETypes audio/flac CFBundleTypeName FLAC Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate sonic-visualiser-3.0.3/deploy/osx/copy-qt.sh0000755000000000000000000000242513111512442017177 0ustar 00000000000000#!/bin/bash set -eu app="$1" if [ -z "$app" ]; then echo "Usage: $0 " echo "Provide appname without the .app extension, please" exit 2 fi frameworks="QtCore QtNetwork QtGui QtXml QtSvg QtWidgets QtPrintSupport QtDBus" plugins="dds gif icns ico jpeg tga tiff wbmp webp cocoa minimal offscreen" qtdir=$(grep "Command:" Makefile | head -1 | awk '{ print $3; }' | sed s,/bin/.*,,) if [ ! -d "$qtdir" ]; then echo "Failed to discover Qt installation directory from Makefile, exiting" exit 2 fi fdir="$app.app/Contents/Frameworks" pdir="$app.app/Contents/plugins" mkdir -p "$fdir" mkdir -p "$pdir" echo echo "Copying frameworks..." for fwk in $frameworks; do if [ ! -d "$qtdir/lib/$fwk.framework" ]; then if [ "$fwk" = "QtDBus" ]; then echo "QtDBus.framework not found, assuming Qt was built without DBus support" continue fi fi cp -v "$qtdir/lib/$fwk.framework/$fwk" "$fdir" || exit 2 done echo "Done" echo echo "Copying plugins..." for plug in $plugins; do pfile=$(ls "$qtdir"/plugins/*/libq"$plug".dylib) if [ ! -f "$pfile" ]; then echo "Failed to find plugin $plug, exiting" exit 2 fi target="$pdir"/${pfile##?*plugins/} tdir=`dirname "$target"` mkdir -p "$tdir" cp -v "$pfile" "$target" || exit 2 done echo "Done" sonic-visualiser-3.0.3/deploy/osx/deploy.sh0000755000000000000000000000446613111512442017106 0ustar 00000000000000#!/bin/bash set -e # Execute this from the top-level directory of the project (the one # that contains the .app bundle). Supply the name of the .app bundle # as argument (the target will use $app.app regardless, but we need # to know the source) source="$1" dmg="$2" if [ -z "$source" ] || [ ! -d "$source" ] || [ -z "$dmg" ]; then echo "Usage: $0 " echo " e.g. $0 MyApplication.app MyApplication" echo " Version number and .dmg will be appended automatically," echo " but the .app name must include .app" exit 2 fi app=`basename "$source" .app` set -u version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h` stem=${version%%-*} stem=${stem%%pre*} case "$stem" in [0-9].[0-9]) bundleVersion="$stem".0 ;; [0-9].[0-9].[0-9]) bundleVersion="$stem" ;; *) echo "Error: Version stem $stem (of version $version) is neither two- nor three-part number" ;; esac echo echo "Copying in frameworks and plugins from Qt installation directory." deploy/osx/copy-qt.sh "$app" || exit 2 echo echo "Fixing up paths." deploy/osx/paths.sh "$app" echo echo "Copying in qt.conf to set local-only plugin paths." echo "Make sure all necessary Qt plugins are in $source/Contents/plugins/*" echo "You probably want platforms/, accessible/ and imageformats/ subdirectories." cp deploy/osx/qt.conf "$source"/Contents/Resources/qt.conf echo echo "Copying in plugin load checker." cp checker/vamp-plugin-load-checker "$source"/Contents/MacOS/ echo echo "Copying in plugin server." cp piper-vamp-simple-server "$source"/Contents/MacOS/ echo echo "Writing version $bundleVersion in to bundle." echo "(This should be a three-part number: major.minor.point)" perl -p -e "s/SV_VERSION/$bundleVersion/" deploy/osx/Info.plist \ > "$source"/Contents/Info.plist echo "Done: check $source/Contents/Info.plist for sanity please" echo echo "Making target tree." volume="$app"-"$version" target="$volume"/"$app".app dmg="$dmg"-"$version".dmg mkdir "$volume" || exit 1 ln -s /Applications "$volume"/Applications cp README README.OSC COPYING CHANGELOG "$volume/" cp -rp "$source" "$target" echo "Done" echo echo "Code-signing volume..." deploy/osx/sign.sh "$volume" || exit 1 echo "Done" echo echo "Making dmg..." hdiutil create -srcfolder "$volume" "$dmg" -volname "$volume" && rm -r "$volume" echo "Done" sonic-visualiser-3.0.3/deploy/osx/paths.sh0000755000000000000000000000326213111512442016722 0ustar 00000000000000#!/bin/bash set -e app="$1" if [ -z "$app" ]; then echo "Usage: $0 " echo "Provide appname without the .app extension, please" exit 2 fi set -u frameworks="QtCore QtNetwork QtGui QtXml QtSvg QtWidgets QtPrintSupport QtDBus" echo echo "I expect you to have already copied these frameworks from the Qt installation to" echo "$app.app/Contents/Frameworks -- expect errors to follow if they're missing:" echo "$frameworks" echo echo "Fixing up loader paths in binaries..." for fwk in $frameworks; do install_name_tool -id $fwk "$app.app/Contents/Frameworks/$fwk" done find "$app.app" -name \*.dylib -print | while read x; do install_name_tool -id "`basename \"$x\"`" "$x" done for fwk in $frameworks; do find "$app.app" -type f -print | while read x; do if [ -x "$x" ]; then current=$(otool -L "$x" | grep "$fwk" | grep amework | grep -v ':$' | awk '{ print $1; }') [ -z "$current" ] && continue echo "$x has $current" relative=$(echo "$x" | sed -e "s,$app.app/Contents/,," \ -e 's,[^/]*/,../,g' \ -e 's,/[^/]*$,/Frameworks/'"$fwk"',' ) echo "replacing with relative path $relative" install_name_tool -change "$current" "@loader_path/$relative" "$x" fi done done find "$app.app" -type f -print | while read x; do if [ -x "$x" ]; then qtdep=$(otool -L "$x" | grep Qt | grep amework | grep -v ':$' | grep -v '@loader_path' | awk '{ print $1; }') if [ -n "$qtdep" ]; then echo echo "ERROR: File $x depends on Qt framework(s) not apparently present in the bundle:" echo $qtdep exit 1 fi fi done echo "Done: be sure to run the app and see that it works!" sonic-visualiser-3.0.3/deploy/osx/qt.conf0000644000000000000000000000003213111512442016527 0ustar 00000000000000[Paths] Plugins = plugins sonic-visualiser-3.0.3/deploy/osx/sign.sh0000755000000000000000000000250113111512442016536 0ustar 00000000000000#!/bin/bash set -eu # Execute this from the top-level directory of the project (the one # that contains the .app bundle). Supply the name of the .app bundle # as argument dir="$1" if [ -z "$dir" ] || [ ! -d "$dir" ]; then echo "Usage: $0 " echo "Where pkgdir is the directory containing .app" echo "All .app bundles in pkgdir will be signed" exit 2 fi for app in "$dir"/*.app; do codesign -s "Developer ID Application: Chris Cannam" -fv --deep "$app" # find "$app" -name Qt\* -print | while read fr; do # codesign -s "Developer ID Application: Chris Cannam" -fv "$fr" # done # find "$app" -name \*.dylib -print | while read fr; do # codesign -s "Developer ID Application: Chris Cannam" -fv "$fr" # done # find "$app/Contents/MacOS" -type f -print | while read fr; do # codesign -s "Developer ID Application: Chris Cannam" -fv "$fr" # done codesign -s "Developer ID Application: Chris Cannam" -fv \ --requirements '=designated => identifier "org.sonicvisualiser.SonicVisualiser" and ( (anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] ) or (anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] and certificate leaf[field.1.2.840.113635.100.6.1.13] and certificate leaf[subject.OU] = "M2H8666U82"))' \ "$app" done sonic-visualiser-3.0.3/deploy/src/archive-tip.sh0000644000000000000000000000026613111512442017772 0ustar 00000000000000#!/bin/bash tag=`hg id | awk '{ print $1; }'` echo "Packaging from tag $tag..." hg archive -r"$tag" --subrepos --exclude sv-dependency-builds /tmp/sonic-visualiser-"$tag".tar.gz sonic-visualiser-3.0.3/deploy/src/archive.sh0000644000000000000000000000126513111512442017200 0ustar 00000000000000#!/bin/bash set -eu tag=`hg tags | grep '^sv_v' | head -1 | awk '{ print $1; }'` v=`echo "$tag" | sed 's/sv_v//' | sed 's/_.*$//'` echo echo -n "Packaging up version $v from tag $tag... " hg archive -r"$tag" --subrepos --exclude sv-dependency-builds /tmp/sonic-visualiser-"$v".tar.gz echo Done echo # Test that the appropriate version of the docs exist on the website doc_url="http://sonicvisualiser.org/doc/reference/$v/en/" doc_status=$(curl -sL -w "%{http_code}" "$doc_url" -o /dev/null) if [ "$doc_status" = "404" ]; then echo "*** WARNING: Documentation URL returns a 404:" echo "*** $doc_url" echo "*** Please fix this before release!" echo fi sonic-visualiser-3.0.3/deploy/win32/License.rtf0000644000000000000000000004661013111512442017500 0ustar 00000000000000{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1046\deflangfe1046\deftab708{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fmodern\fprq1\fcharset0 Courier New;}} {\colortbl ;\red0\green0\blue255;} {\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}{\s3 heading 3;}} {\*\generator Riched20 6.2.9200}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 \pard\widctlpar\s3\sb100\sa100\b\f0\fs27 GNU GENERAL PUBLIC LICENSE\par \pard\widctlpar\sb100\sa100\b0\fs24 Version 2, June 1991 \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Copyright (C) 1989, 1991 Free Software Foundation, Inc. \par 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\par \par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \pard\widctlpar\s3\sb100\sa100\b\f0\fs27 Preamble\par \pard\widctlpar\sb100\sa100\b0\fs24 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. \par 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. \par 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. \par 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. \par 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. \par 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. \par 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. \par The precise terms and conditions for copying, distribution and modification follow. \par \pard\widctlpar\s3\sb100\sa100\b\fs27 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par \pard\widctlpar\sb100\sa100\fs24 0.\b0 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". \par 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. \par \b 1.\b0 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. \par 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. \par \b 2.\b0 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: \par \pard\widctlpar\li720\b a)\b0 You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \par \b b)\b0 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. \par \b c)\b0 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.) \par \pard\widctlpar\sb100\sa100 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. \par 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. \par 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. \par \b 3.\b0 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: \par \pard\widctlpar\li720\b a)\b0 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, \par \b b)\b0 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, \par \b c)\b0 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.) \par \pard\widctlpar\sb100\sa100 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. \par 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. \par \b 4.\b0 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. \par \b 5.\b0 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. \par \b 6.\b0 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. \par \b 7.\b0 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. \par 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. \par 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. \par This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \par \b 8.\b0 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. \par \b 9.\b0 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. \par 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. \par \b 10.\b0 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. \par \b NO WARRANTY\b0\par \b 11.\b0 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. \par \b 12.\b0 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. \par \pard\widctlpar\s3\sb100\sa100\b\fs27 END OF TERMS AND CONDITIONS\par How to Apply These Terms to Your New Programs\par \pard\widctlpar\sb100\sa100\b0\fs24 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. \par 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. \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\i\f1\fs20 one line to give the program's name and an idea of what it does.\i0\par Copyright (C) \i yyyy\i0 \i name of author\i0\par \par This program is free software; you can redistribute it and/or\par modify it under the terms of the GNU General Public License\par as published by the Free Software Foundation; either version 2\par of the License, or (at your option) any later version.\par \par This program is distributed in the hope that it will be useful,\par but WITHOUT ANY WARRANTY; without even the implied warranty of\par MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\par GNU General Public License for more details.\par \par You should have received a copy of the GNU General Public License\par along with this program; if not, write to the Free Software\par Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\par \pard\widctlpar\sb100\sa100\f0\fs24 Also add information on how to contact you by electronic and paper mail. \par If the program is interactive, make it output a short notice like this when it starts in an interactive mode: \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Gnomovision version 69, Copyright (C) \i year\i0 \i name of author\i0\par Gnomovision comes with ABSOLUTELY NO WARRANTY; for details\par type `show w'. This is free software, and you are welcome\par to redistribute it under certain conditions; type `show c' \par for details.\par \pard\widctlpar\sb100\sa100\f0\fs24 The hypothetical commands \f1 `show w'\f0 and \f1 `show c'\f0 should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than \f1 `show w'\f0 and \f1 `show c'\f0 ; they could even be mouse-clicks or menu items--whatever suits your program. \par 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: \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Yoyodyne, Inc., hereby disclaims all copyright\par interest in the program `Gnomovision'\par (which makes passes at compilers) written \par by James Hacker.\par \par \i signature of Ty Coon\i0 , 1 April 1989\par Ty Coon, President of Vice\par \pard\widctlpar\sb100\sa100\f0\fs24 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 {{\field{\*\fldinst{HYPERLINK "http://www.gnu.org/licenses/lgpl.html" }}{\fldrslt{\ul\cf1\cf1\ul GNU Lesser General Public License}}}}\f0\fs24 instead of this License. \par \par } sonic-visualiser-3.0.3/deploy/win32/README-Vamp.txt0000644000000000000000000000026213111512442017771 0ustar 00000000000000 To add Vamp audio analysis plugins to the Transform menu in Sonic Visualiser, unpack and copy them into this directory. See http://vamp-plugins.org/ for more information. sonic-visualiser-3.0.3/deploy/win32/build.cmd0000644000000000000000000000070713111512442017162 0ustar 00000000000000@ECHO OFF SET WIXPATH="C:\Program Files (x86)\WiX Toolset v3.9\bin" IF NOT EXIST %WIXPATH% ( SET WIXPATH="C:\Program Files\WiX Toolset v3.9\bin" ) DEL sonic-visualiser.msi %WIXPATH%\candle.exe -v sonic-visualiser.wxs %WIXPATH%\light.exe -b ..\..\..\build-sonic-visualiser-Desktop_Qt_5_7_0_MinGW_32bit-Release -ext WixUIExtension -ext WixUtilExtension -v sonic-visualiser.wixobj PAUSE DEL sonic-visualiser.wixobj DEL sonic-visualiser.wixpdb sonic-visualiser-3.0.3/deploy/win32/main.bmp0000644000000000000000000160607213111512442017032 0ustar 00000000000000BM: zlí8À   BGRsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔVÔ^ÖcØb×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×cØ^ÖVÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔ_׃¬ê¼Òô·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó¼Òôƒ¬ê_×UÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔdÙ¼Òôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÒôdÙUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïŠsss‡‡‡™™™¼¼¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿'''õõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒŒŒÂÂÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëMMM‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝ'''\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓ :::âââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆ%%%ÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ§§§···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüü†††£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúqqq‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøø]]]nnnøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööIIIQQQìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõ555444áááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóó!!!ÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé•••999«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòò ÑÑÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄYYYòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}$$$ÔÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæææ²²²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééFFFÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥===ÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎΔ””ýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒ***¯¯¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññCCC ìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···xxxúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁ777ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   \\\øøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²jjjöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwwwÒÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠŠŠ@@@öööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœGGGñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,,,ŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsss$$$óóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú}}}%%%ìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëJJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\òòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòò^^^èèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§)))ÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDDDèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêê???ÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ...ÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444­­­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:::rrrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿjjj‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈZZZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVVôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûû˜˜˜lllÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ¡¡¡;;;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ888ÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãã㯯¯###KKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüzzzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËÄÄÄCCC***ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüTTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆ¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´´´ÚÚÚccc ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûû---éééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦žžžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžžžðððƒƒƒüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú"""ÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆzzzùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ööö£££ÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééémmm§§§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtttXXXðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿoooöööÄÄĺººÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾³³³………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿbbb555$$$444çççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXXX%%%öööäääšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““ääädddÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿOOO@@@UUUßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@@@999øøøôôôxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿlllýýý...BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ===LLL………ÒÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ***MMMùùùöööWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKKK$$$ÿÿÿMMM ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)))WWW³³³ªªªþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿbbbúúú÷÷÷888888ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+++DDDÿÿÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcccäää~~~ýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ vvvûûûùùùTTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ cccÿÿÿŠŠŠíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcعÑõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüoooÿÿÿSSSüüüÿÿÿÿÿÿÿÿÿÿÿÿïïï ŠŠŠüüüúúúqqq ÿÿÿÿÿÿÿÿÿÿÿÿýýý‚‚‚ÿÿÿ¨¨¨ÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹ÑõcØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔ`Õœ´ØÞÞÞÙÙÙØØØØØØ×××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÔÔÔÓÓÓÿÿÿÿÿÿÿÿÿóó󃃃ÿÿÿFFF&&&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààत¤ÿÿÿÿÿÿ”””çççÿÿÿÿÿÿÿÿÿâââ§§§ÿÿÿÏÏÏ´´´ÿÿÿÿÿÿÿÿÿñññ°°°¡¡¡¤¤¤¦¦¦¨¨¨ªªª¬¬¬¯¯¯±±±³³³µµµ···¹¹¹¼¼¼ÈÈÈÙÙÙ£ºÞb×UÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔRÇ$<_333222111111111111000111000000////////////------™±Ô¬Éô¬Éõ“«Ð^n†®Ë÷JWl¤ÀêªÇñ©Æñ©Æñ­Ëö„šºu‰¨©Åð¨Åïp„¡„™¹­Ë÷©Æñ­Êö“²}“´ªÇñ‘ªÏbqˆ°Îú«Éö„’¨JKK  ###---A]† \ÒUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔNÃ; >ˆdÞbÜM¬ ;„bÜ <ˆR´aÙ`×`×dÞ B” K§`×`× K§ ?dÞ`×dÞ <…Sº`×U¾ +]gåUº+6hXÐUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔNÃ<!QZàWÚ>œ9ŽWÙF¯7‰V×UÔUÔXÜ3E­UÕUÕF¯-rYÝUÔXÝ*iNÂUÔMÀ C\ç0z6iWÐUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔNÃ< YßXÛ: <•V×UÓ'aWÙUÔUÔYÝ-pG±UÕUÔIµ$YYßUÔYßOOÅUÔNÄ4*TÑ?6iWÐUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔNÃ;  _¾-xçE‡ S *rÞ*rÞ C+tâ*qÛ*qÛ,væ1a $a»*qÜ*qÜ%cÁ ' C-yé*qÛ-xé6 ,(kÎ*qÛ(kÏ(M ^»          8hXÐUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔVÌH`„fffddddddeeeeeeeeeeeeeeefffgggiiiIII¦§©ÿÿÿŠ‹Ž »½Áùüÿøûÿ>?A,,,ÿÿÿöùýöùýÿÿÿ[[\'()×ÚÞ÷úþ÷úþàãçABD444ÿÿÿöùþÿÿÿ"""JKMëîò÷úþîñõmorª«­ WX\¨¬²ž¡§œŸ¥™œ¡—šŸ”—›‘”˜’•ŒŽ’ŠŒƒ„ˆpqrgggh€¤_ÕUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔeÚÁÙýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊtttÿÿÿÌÌÌÿÿÿÿÿÿeee ÿÿÿÿÿÿÿÿÿÿÿÿIII999çççÿÿÿÿÿÿòòò[[[)))ÿÿÿÿÿÿÿÿÿjjjùùùÿÿÿþþþyyy±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾ÖúcØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛ555HHHÿÿÿnnn'''ÒÒÒÿÿÿÿÿÿ†††öööÿÿÿÿÿÿÿÿÿ444HHHêêêÿÿÿÿÿÿ÷÷÷rrr"""æææÿÿÿèèè„„„úúúÿÿÿÿÿÿ¤¤¤ 111ÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôZZZ///ííí]]]333ÙÙÙÿÿÿÿÿÿ¨¨¨ÔÔÔÿÿÿÿÿÿÿÿÿ+++YYYðððÿÿÿÿÿÿþþþˆˆˆÏÏÏÿÿÿÌÌÌ žžžþþþÿÿÿÿÿÿ¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄQQQ@@@âââÿÿÿÿÿÿÊÊʲ²²ÿÿÿÿÿÿööö'''hhhôôôÿÿÿÿÿÿÿÿÿžžž¸¸¸ÿÿÿ±±± ···ÿÿÿÿÿÿÿÿÿÆÆÆHHHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§KKKKKKëëëÿÿÿÿÿÿæææÿÿÿÿÿÿæææ"""xxxùùùÿÿÿÿÿÿÿÿÿ¬¬¬   ÿÿÿ–––ÅÅÅÿÿÿÿÿÿÿÿÿÕÕÕ---zzzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐ%%%[[[888XXXóóóÿÿÿÿÿÿììì mmmÿÿÿÿÿÿÔÔÔˆˆˆþþþÿÿÿÿÿÿÿÿÿ»»»‰‰‰ÿÿÿ|||ÎÎÎÿÿÿÿÿÿÿÿÿæææDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùù:::%%%dddûûûÿÿÿÿÿÿððð+++JJJÿÿÿÿÿÿÄÄÄ———ÿÿÿÿÿÿÿÿÿÿÿÿÉÉÉ"""qqqÿÿÿaaa&&&×××ÿÿÿÿÿÿÿÿÿõõõ\\\ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___qqqÿÿÿÿÿÿÿÿÿóóóHHH'''ÿÿÿÿÿÿ´´´¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿØØØ111]]]ÿÿÿEEE999áááÿÿÿÿÿÿÿÿÿÿÿÿsssãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ””” }}}ÿÿÿÿÿÿÿÿÿ÷÷÷dddÿÿÿÿÿÿ£££®®®ÿÿÿÿÿÿÿÿÿÿÿÿçççAAAOOOÿÿÿ999NNNêêêÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËŠŠŠÿÿÿÿÿÿÿÿÿúúúéééÿÿÿ’’’ ···ÿÿÿÿÿÿÿÿÿÿÿÿõõõQQQDDDÛÛÛ111bbbóóóÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜ÿÿÿÿÿÿÿÿÿþþþžžž ËËËÿÿÿÂÂÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ```777···***vvvýýýÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHHH¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿ¸¸¸ ­­­ÿÿÿqqq%%%ËËËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqq,,,“““!!!‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØ)))dddÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹²²²ÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿÿÿaaa000ÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰jjjšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóó777‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑsssÿÿÿVVV:::àààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ AAA ªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEEE®®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ $$$ÍÍÍÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛ...UUUÿÿÿLLLEEEêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXXX+++ÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿåååDDD>>>úúúDDDPPPôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜ$$$%%%ËËËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜ ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬777óóóÿÿÿÿÿÿÿÿÿÿÿÿðððZZZ444ØØØ;;;[[[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿööö...222ÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóMMMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúooo+++···333eeeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<<<???ìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!!!QQQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDDDsssÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ………###•••+++sssÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[[[KKKýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ———rrr###‚‚‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~XXXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññ³³³ŒŒŒccc222^^^èèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿííí>>>õõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªª QQQ ‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡nnnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûõõõíííõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼///   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÅÅ ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíí혘˜yyyoooiiiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎ''' °°°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèè žžžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààà555ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòCCC!!!ÔÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ000ÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPPP)))èèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZZZäääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿccc000ûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‚‚$$$üüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}666ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªª---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ——— JJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒGGGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±cccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøødddÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌ|||ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‚‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóó!!!”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAAžžžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ666 ¬¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿggg ÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé×××ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™ ÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúEEE  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·ÏóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÖÖÖ¿¿¿¨¨¨ŽŽŽ¼¼¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ'''ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ***UUUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒƒƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­hhhbbbWWWEEEšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔcØ·Ïóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÏócØUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔdÙ¼Òôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÒôdÙUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔ_׃¬ê¼Òô·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó·Ïó¼Òôƒ¬ê_×UÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔVÔ^ÖcØb×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×b×cØ^ÖVÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÕUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÔUÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsonic-visualiser-3.0.3/deploy/win32/sonic-visualiser.wxs0000644000000000000000000002131113111512442021432 0ustar 00000000000000 sonic-visualiser-3.0.3/deploy/win32/top.bmp0000644000000000000000000024771213111512442016711 0ustar 00000000000000BMÊOzlí:PO  BGRs5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jï5jïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsonic-visualiser-3.0.3/deploy/win64/License.rtf0000644000000000000000000004661013111512442017505 0ustar 00000000000000{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1046\deflangfe1046\deftab708{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fmodern\fprq1\fcharset0 Courier New;}} {\colortbl ;\red0\green0\blue255;} {\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}{\s3 heading 3;}} {\*\generator Riched20 6.2.9200}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 \pard\widctlpar\s3\sb100\sa100\b\f0\fs27 GNU GENERAL PUBLIC LICENSE\par \pard\widctlpar\sb100\sa100\b0\fs24 Version 2, June 1991 \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Copyright (C) 1989, 1991 Free Software Foundation, Inc. \par 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\par \par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \pard\widctlpar\s3\sb100\sa100\b\f0\fs27 Preamble\par \pard\widctlpar\sb100\sa100\b0\fs24 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. \par 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. \par 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. \par 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. \par 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. \par 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. \par 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. \par The precise terms and conditions for copying, distribution and modification follow. \par \pard\widctlpar\s3\sb100\sa100\b\fs27 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par \pard\widctlpar\sb100\sa100\fs24 0.\b0 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". \par 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. \par \b 1.\b0 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. \par 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. \par \b 2.\b0 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: \par \pard\widctlpar\li720\b a)\b0 You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \par \b b)\b0 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. \par \b c)\b0 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.) \par \pard\widctlpar\sb100\sa100 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. \par 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. \par 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. \par \b 3.\b0 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: \par \pard\widctlpar\li720\b a)\b0 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, \par \b b)\b0 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, \par \b c)\b0 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.) \par \pard\widctlpar\sb100\sa100 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. \par 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. \par \b 4.\b0 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. \par \b 5.\b0 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. \par \b 6.\b0 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. \par \b 7.\b0 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. \par 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. \par 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. \par This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \par \b 8.\b0 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. \par \b 9.\b0 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. \par 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. \par \b 10.\b0 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. \par \b NO WARRANTY\b0\par \b 11.\b0 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. \par \b 12.\b0 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. \par \pard\widctlpar\s3\sb100\sa100\b\fs27 END OF TERMS AND CONDITIONS\par How to Apply These Terms to Your New Programs\par \pard\widctlpar\sb100\sa100\b0\fs24 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. \par 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. \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\i\f1\fs20 one line to give the program's name and an idea of what it does.\i0\par Copyright (C) \i yyyy\i0 \i name of author\i0\par \par This program is free software; you can redistribute it and/or\par modify it under the terms of the GNU General Public License\par as published by the Free Software Foundation; either version 2\par of the License, or (at your option) any later version.\par \par This program is distributed in the hope that it will be useful,\par but WITHOUT ANY WARRANTY; without even the implied warranty of\par MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\par GNU General Public License for more details.\par \par You should have received a copy of the GNU General Public License\par along with this program; if not, write to the Free Software\par Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\par \pard\widctlpar\sb100\sa100\f0\fs24 Also add information on how to contact you by electronic and paper mail. \par If the program is interactive, make it output a short notice like this when it starts in an interactive mode: \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Gnomovision version 69, Copyright (C) \i year\i0 \i name of author\i0\par Gnomovision comes with ABSOLUTELY NO WARRANTY; for details\par type `show w'. This is free software, and you are welcome\par to redistribute it under certain conditions; type `show c' \par for details.\par \pard\widctlpar\sb100\sa100\f0\fs24 The hypothetical commands \f1 `show w'\f0 and \f1 `show c'\f0 should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than \f1 `show w'\f0 and \f1 `show c'\f0 ; they could even be mouse-clicks or menu items--whatever suits your program. \par 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: \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Yoyodyne, Inc., hereby disclaims all copyright\par interest in the program `Gnomovision'\par (which makes passes at compilers) written \par by James Hacker.\par \par \i signature of Ty Coon\i0 , 1 April 1989\par Ty Coon, President of Vice\par \pard\widctlpar\sb100\sa100\f0\fs24 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 {{\field{\*\fldinst{HYPERLINK "http://www.gnu.org/licenses/lgpl.html" }}{\fldrslt{\ul\cf1\cf1\ul GNU Lesser General Public License}}}}\f0\fs24 instead of this License. \par \par } sonic-visualiser-3.0.3/deploy/win64/README-Vamp.txt0000644000000000000000000000026213111512442017776 0ustar 00000000000000 To add Vamp audio analysis plugins to the Transform menu in Sonic Visualiser, unpack and copy them into this directory. See http://vamp-plugins.org/ for more information. sonic-visualiser-3.0.3/deploy/win64/README-Vamp32.txt0000644000000000000000000000027113111512442020143 0ustar 00000000000000 To add 32-bit Vamp audio analysis plugins to the Transform menu in Sonic Visualiser, unpack and copy them into this directory. See http://vamp-plugins.org/ for more information. sonic-visualiser-3.0.3/deploy/win64/build.cmd0000644000000000000000000000066413111512442017171 0ustar 00000000000000@ECHO OFF SET WIXPATH="C:\Program Files (x86)\WiX Toolset v3.9\bin" IF NOT EXIST %WIXPATH% ( SET WIXPATH="C:\Program Files\WiX Toolset v3.9\bin" ) DEL sonic-visualiser.msi %WIXPATH%\candle.exe -v sonic-visualiser.wxs %WIXPATH%\light.exe -b ..\..\..\build-sonic-visualiser-Desktop_Qt_5_7_0_MSVC2015_64bit-Release -ext WixUIExtension -v sonic-visualiser.wixobj PAUSE DEL sonic-visualiser.wixobj DEL sonic-visualiser.wixpdb sonic-visualiser-3.0.3/deploy/win64/sonic-visualiser.wxs0000644000000000000000000002423113111512442021443 0ustar 00000000000000 sonic-visualiser-3.0.3/i18n/sonic-visualiser_cs_CZ.qm0000644000000000000000000063174113111512442020646 0ustar 00000000000000<¸dÊÍ!¿`¡½ÝB2` Õj#¢Š&€K'®+éÆ0®"1®D2®”3®¶4®Ø5®ú6¯8¯>9¯`;¯‚=éëE"9F3âGCKKUMLhNTRi”T¢‹U§·W©`X¯Y¯*Z¯L[± ]±,l²‚o²¤s²Æ{²è}³ ‚oœ˜µ§‘4’4Q;~S;JSÀ¨­Àé`‚“‚„[‚›Ž‚G„îº(OU­^V(J=b-Iúô-û8-©û6‚~6‚üHY~üIA4)J\'J\‘ J´'œJ¼JÄÊøLD%L“&ÔO•l±SW·SW<SWðßSWt SW€¾SW•]SW»ŒUÆñAX´kâhvœ6h…(JuÆUÙ{@„€ÃV€y³}y{of„ƒß„ƒ«…úŒ^žÓ+â¨â¶O F~rW%ŽW%žiwúŽ·‚%Žà‚%ž§%^§%žµˆ“púSõSpSÙSŸ,“µE§Ô[¶Þ á¶ÞåZ¸‡!»"[×þ×þ€(×þ”®×þýuèN0sì0CÂö5D~+ÔKw;~€ê;~Ÿ‹;~þLB'ɳ}¨(2‚8(2‚íp(2‚pw(2‚µÐ(4ú'p(4úž8(@‚‚’(A¤½(­8Ç*¦y¦|*»¨*Ð%¨¦*ì0¨Ø+hE«¼+Œ¬k+į˜+ÏÇ­Î3MžvÙ3Mž²t3Mž¾œ3OúŒ4‚®f4$úŒå4Oú»5$úå6OúŽc6Â…¥7$úŽ8Oú48§rcÐ8§rÙ 8®1ÿÈ9#"à9Åó!E:Oú‡?,ZF8BÕú&Gv©P¿Hw9CùH„ÒãI'›J6•ÆQJ¹·JÉÅ·ÜK ˜EÿLACœLZÂ%,Lˆ•%´Mz×ÐMzåØM ¤úM ¤ŸZMˆ5%XMˆ5D\Mˆ5OOMˆ5÷÷Mˆ5{\Mˆ5‡ Mˆ5ˆ­Mˆ5©¿N‹¾C’N‹¾JN‹¾l N³Ý†ÝP7ÕGrP7ÕOPWÄ¡ÑP›…ÐÅPØÙƒRKÍ„Rx¼!Rx¼DRx¼O±Rx¼ø&Rx¼{Rx¼‡_Rx¼ˆçRx¼ªRŽS…RÂŽÈR½zý«R̼DÄR̼øUSÀ’Sû\SÂÚÞSÂÐ*SÊÂSÊ•ãSÊÂþ~TZ¼ŽüTƒŠ MTפ’ UjËvU¾4¦VŠ¥=PVŠ¥KYVŠ¥Ò*VŠ¥ñÊVŠ¥tÈVŠ¥¥xVŠ¥±VŠ¥¼LV®ÂГVè•™bW ˜VW ˜DøW ˜ø®W ˜ì¦X|¯!™XÉÄ~½Xù.ŸXýô{>XýôY˜%gY˜%>øY˜%óJY˜%vWY˜%‚tY˜%™”Y˜%¾Y˜%ÿWY‹ÌYß%¬Yß%.YöÞkZg•žqZy§ûÑZ¬CÀ×Z¬s‚¨ZÄoìáZÏz[Š3\P³Òd\ƒµ9\ƒµ|O\ƒµ‰ð]ë¼ã]𥭞_X™3)`GC<ü`GCñ{`GCtw`GC°Ç`GC»ø`äãQcÐc€zdãCÚdãE™dãNÈdã÷¸dã{dã„ûdã†Ñdãˆcdã©€h|œdhúÂ,lƒ•Unnßx{noƒ3P%uj•$^wúNž'xüNë|!à|"‚!}¸¡Ø4äœÓ¾Ý$€`s¾dŠ:m’›…““ŸÅÊo”wÎ#,—•Ë—ë›Ñ´-?¢"ƒŸ¢Š¥SP¢Éη*£sÓZÙ¤HþŤî¤U@ªAÑ—™«i¹•(®¢bSá±bä‡ù·£¹>ÒMÙÈ^×Ð_M³ØRÝðj‘3ç¬S&‰è°.Ÿ.èðï?ÑèðïLžèðïóÈèðïwèðï¦äèðïÁ õÊO©¸úÖÅ©ü̳®>ÿ¢å‘¿ØE,« Þž c~“7e®Ä?  Z5w$+aî³~0⯫È1zŸ¿‘7“ep7“e5ô7“e_Ä<© H°CW.sQId<ßPÖtãÔS³ôŠTAE-ðX4±Q‹eôž´lè R$nÎTrÿnûƒFoådŽrkRô£ušÉH˜zŒ.¢$€?rwÔƒ£'Ñ„XeBû†¾#ÁˆbK‹Ïr“õ›ã•MaÜ<–X@:˜·‚|‚š’`á,œ ª7¯É©8E¯É©í±U$ÁìÝ5¶rÎâ¶Õ¥òH¹_‹ð ÁNá7$ÉmDOÒ@ٽݞCmßòÑ‘wà*°ç}tÔÂç—¿ 縿!é ÛLé¢ÛK¤ìƒ·‘ò*œÀù„<ÜþB…Ÿÿ‘Ù1?bðå!´K6ÕJ£n9£nî-£np¦£n¶x+QTIžÜOV#³3© $Cug¶$ùÕ¢)Ð*Tð3+Ýó4›u¡H8 ¡\d9â‰ü :‘n#b>]MåŠBjƒ¬ŸD‚¥ãE^ɨÚRY.­MRÎC?€SBuóOU<€ÃV:!õW”Ò&o](ò‚¾aÀÞeûiųé’kv⡬mÉápzA&€q§!s5tÃâsP¥:v"90vSÎ Ðz'î+¸{n‚Y>„‚¤Œ„‚„‚y„‚¤ë„‚³º„‚Ûô„‚Èë­î#¬­î$­î¡þ­îù@ާǔ˂ëdx•ŠGš¢Ýø­¡5ôÙ­­yƒ®Ï“úº²Â« ¶Š¥«ð¶Œ•ü¶®Â=к™Õîº÷žŠá¾â ¥§¿ëLgÂø?oÃl•CJÃl•÷2Ãl•z‘Ãl•Å\ÄEÕÊγpÕŽªgtÖvN²ÞÇònŽãŽñäŒÓHèË>¼ì;_S†ò`ù˜ô~ó2ôÝ#-­ûm‡Óû %Š,=>ô o9.pwUÅ)Ž·Ø°¨†šB«µo„e3ä!O…+X&ûI_ˆ*‚w)½._ee04bÉ"1xb3*Z‹Â5óÈ6§C’n9È3‚:ª<ò BOúC$ú:DOúeHOúVKS(¯WKS) X$úŽ8X/BnÝXÙu}JZ>¹¥]2ĦCbKS)cg>·gÝNGªkVïém\â åmoŽŸáp/T½tBùy#=tyC°Ƶ‚KS*ƒ$ú ƒ¨ï±Êƒâžnæ‰ ¢íŠãšŒ "¯¤’KS*ê˜:yE£‚¾äȲêÞ©`¸[%¸[%¬?¸{~>™¸{~Kü¸{~òð¸{~,¸{~uû¸{~¦Š¸{~²¸{~½µ¸¬ÕP‹º%±º%žÛ¼\E×M®C9ìDÖÕô,]õôuLWô«ÞXòú)‰fÇûT]yûtô† þ ó`ê!×)ûÁÛ‘ÅWBu Æs/+3žÉnOÊŒ¹$¥c%—xWP&D$K5'šª_,qÁþ¯-¿é™à2Id]×3"\Œ5ä´Aw7a$M9=‰Ëà<¾™í>"|£xXé/Ñ`eŽåg¬õNj«n®®»èv*·H{¶nL|{ÿ$0+„ÎD©„ƒÉÂ…Ñ.œˆJ´g‚‹ÁI®ˆ“Z#›˜I¼hñ˜I¼}Ú˜I¼EǘI¼P$˜I¼ï…š7™ÊóžÉ™gú¢zÔæ6ÂZ¦6Â~¦6‘<«tîëF«Žñ–«ŽóÇ«Žôø«Žùc«Žü”«Žý «Žþ>«Žÿo««K«¥«¸«é«« K« L¬’ºr¬,¥Ö0­´ê(À®ûú´3C`¸ÆS%溌TQ¿G>ºÂ‡'Âx~à†©†ªÐƾ¤ÙÇ´ÅCõÇØ šÈÈ¢ÏðÉ,fxÉת˜ùÏdNÆ€Õ^Îï­Ö”©&"ØZ‹Üß|ÀÜàž ßüÕY äôN¥šå#$ë«Çéë«Ç6^ëýô©îì%>'6ñRÕ–ñÐËšë÷ÀÑ 'ú)±ýüeOÿ˜ôÚÿ˜ô”ç}Ëwžß~œ”Ø °ƒ¥Ð ŸR•ë}B9%ìb]Å«%/ÞÚ%/ÞgK%/Þ}Ç%/Þ%/Þï'‹úG¥(óÙå+Ç4v,ËúýÜ0K‚0K‚;È0K‚ð©0K‚sÒ0K‚€[0K‚• 0K‚»!0K‚þ4ÜÓi÷583›¸7H…ô8Z ?«%aIZ$v4K0JO|ýQsˆ–kQsþ–°Qý¥:V\ê XÚD0Zu…[õo—\¾ä5ð\Ø91#]Æü‹^?­ØGau.ŸÖh„Õ_Äh ¾5•k¶Þc%r´.v³¼Â|Ku£Ï|—%i]~³•27‚fËv‚lõqf…’AÕ‰öü]I‹¦„kG‹¼’o‹à^{¾ŒàDuõŽ”Ît7ßzÿ#•¿59v•¿5î•¿5q*•¿5¶Ï—€Ô$üš–,©š–,ñã›—3оœ+¤„D8³ Ç¨ˆÖ¡z=ا£:~|.¤f¨¢¦‰•…¦Žþ¿Š¦È•ÛK§$%^lª€³¯ë«!¬!Ęª¬YÄm °(ŠGq°@Gc°¿a6“¾ˆ,7•¾ˆ,IÀXÎrmÀYÎqÞÀp>r¸Ä¡®‘qÈ8 5cÈ;Š È;ÃpÉíQ°u˨|4«ÔäîAßÔþNæ×/ÔB1ÙŽt;÷àKgšÄàKg †à­ŽGÙà­ŽJâä<¥%äNÙòìŽV ìóXÅò–„o¿ò©1còפ¯Üõk®ÿ™¤wBƒÿ€ %ÉÑ… +¹‰þtkË\ eég"õ_':“ñ.·ÿSµ4.*W·79Ã99èN2?Føµ ÃJè3+ðLŒÕOSåT;SåTïõSåT¯"SåTº^Wô8ßWôöFWôȰWô…¿\eE¿=_,_PÔæa1]a˜Þa˜Þ—(e÷Utùe÷U¶e÷U±Se÷U¼€jñùÏkOnë»l¾«s´NMu#d†avtœxžç©}ìu 0„Ãqh…«›¹‡þ0š÷‡þ0 ¶ˆcÆ‹þF¶$ôºâŽAR´î“.3쯕 –’––Ý?±—œ§+œG£€) ¦£Ò÷¨…%ª¢º¼Œ6»``ž¥»wRЏ¿¤ù|ØÀÿ97ÁÇ€Žb]Ë|* ˆË¥µ›DË¥µ¡ÌÖ£~|ÍËYòÒ$Ö)Òîu¬×ATª×2oV ؃ã}AÜø¤OÝû‡…RÞf©\îß^|àªG©ÿãºÉhSèÇReèÇRÙ}éJžEÐóEe ‚øš®»hüëô7è“?0è“ó}è“vŒè“¾Lž£oYµÄ ,¥+D £ŒûÎcu“^A‚µþçØÄ;HØÄð3ØÄ£¹ØÄ¯gØÄº¡ 2[#ϵ_$ S”_$84ê(¢)l=ª>I;Gž…9pHíBoKqJ_KòOêqL¹ê—¶Q$žTlUW>|¤/ZØÅîâ]Ÿ¥ŒÏi¾GEj°u.æsomj­v¨ PY…Ç–ö†;žµc†…¼B£†…¼ö‰ÎIkFŒÏ—HQÒÎ{áZ’lÖ•è-Èa5¿¤\ÄÞ§•4tz«6ာAÝð¡­7î¯D„c»´ µ¾—ƒ…Àûøz ƽNaWË!ÍÐДÄcÐðå"DÔÚã—pÕŸ”TÚŽì'ÂâÁ¿ãÐr–²é\âû4ê¥9ǤîBCC¼ñNÒœóõ,=õGŽ€oø$umÿˆ™I¸ÿÑ‘:\Йb_ÖDzæ 8.Ʀ vÄ&ç'^òj®ÑÍ"6ÜZ(),Û.â÷/˜ôg/¦EÿÎ/äôûZ1X.½31Œõ81Ïì&-2ò¢úŒ2ò¢~>2ò¢Õ2ò¢¡G3è~Û³73èY9"ƒ¢­> ÅòkE(ÉÚExõøÔI5¾ßI-ÄH„JÕÜ yá/ ‹Ó;Œ ‹ÓJ' ‹Óðr ‹Ós™ ‹Ó£ø ‹Ó¯­ ‹Óºå ‰Þ©Ö ÜEoÊ  D”. O¤ŠŽ Ö¼á# )D$% 2RÌJ 8†eG :%âÌæ :¬þI >½þó ?§d.E C‰Ò^ MgþÊ6 NðI› Sè$:0 Sè$ï/ Sè$®C Sè$¹ SèÔ:¾ SèÔï³ SèÔ®Ù SèÔ¹ VÀÌ¢© W ”<À W ”Jª W ”ñD W ”¥A W ”°‰ W ”»¼ WzeõB \²¤åz bê  c••:é c••ËÝ dg2l i64„¨ lHñ¥Œ lfñòå zã^s" {гŽt }ê”™Ò ‚ƒŽÎˆ „#¤ˆq „#¤Õ „iƒöX ‡QI ‰#%ôu ‹Ã„w ’–”‡ž •sÒÎ* š0J'© ¡~Ä;R ¡~ä=U £{ªõ £ò²“ø ¦8Õ ¦8Õ~Å §nS23 ª‡O=„ ª‡OK‰ ª‡Oñù ª‡Ou8 ª‡O¦ ª‡O¼ó ¬óÊô ¬óÊ­ ¯ûÓO· ¼4.| ½÷UV Á_RP ÊŸ.LA Ì •˜š Íòî‹ê Ïç!8 Ý`þ„ âÎDØ âϾ,ª ë*ç íÞ9QÉ ïÖ§Ž7 ïÖ«Žk ïÖ­Žê ï×Uì ï×W ðb”Aÿ ðb”õñ 9„« ØYÍ« t|? [õ|  §ZJ XO 5âF óÓ. p䢬 !<k !nOÊÇ %[•öü *$Õ– +’"W -x†% 1õ9Ø 56C 5£Š– 5£Š«¼ 9‹: 9‹:«2 9ͳrA ;fœ„u >Ýt

Ψ@ Pv³-| RwC<3 RwCñ V²õm `B}ýí cƒ$t dÃt>N dÃtòª dÃt½j e® ž h:52¥ i’U2ý nÄjH9 o&þÏ p³s‰Ô r›Î‰  têü t`\æs yü _ {WR£‡ ~W«< ÷Ò=˜ ˆŽ%iö еU] Œ»s9Ñ Œ»sîÕ Œ»sq‚ Œ»s¸\ Œþ¡lD ‘flµI œ|m´  "´õ £õ=‘ ¦T¹i- ¬Æùüª ¯ŒðW °°$Î ±½ô~ Âp‰£: ̺óÊp ÐoC“- Ò˜¾Ó| Õ}dbv Þ¼ä‹2 á„¡ö áˆn çÙù> ï ¾ ïƒÝ‹û òõ‘¨P õíN Þ ùy(~ ùŸùyû û-/±N ‹”T šZ ÜÎÒž bT42 C” *h l%r öØ YP> 3jêe ÄÞ¬# ÙR@ !Ëá"Œ 'î '© çY ,RuIº -¤%Ó„ 5%lÞ 5%• 5Ô£1r <ésN¿ >…D¦´ H2Žc± HmeÙ Ifnöµ K1Ê KÑ"ô Oà¼yé Q©;É RVŽEa RVŽP RVލ RVŽù RVŽ| RVŽˆ RVމ² RVŽª RèS¹ä S â,L ZLÒž [yÌÇ ^tkRÓ `É¥M\ a§Ü a§Ÿ b.ߪ@ b³ :• b´ ; h5ÿŽ t)³eq t“¥p. }žî¬ò ƒÌõûŒ „·w  ‡aÏ9L ˆ¬î ˆ¬îC™ ˆ¬î÷| ˆ¬îzÝ ‰ò…%Z Ьä.Œ Ž `Ù ú˜2 ’'’LŠ –&bÐe –P ‹ —Z<{× —‹ƒ. ™œÓrž šÚ' š[ê'ø ¢¤îm¯ §Ì£¦ §ô7ƒ ¨z.ÖÈ ¨Õ®è? ¯óÓT\ ±?£Ök ³Íyw⠳ߣ§« ¾Ê¥kx ¿(A–D ÄÖÙQ Èü%i ÉʧúY ÎyŽÞé Ø5¾ìA ÝÂ66 ÝÂJò ê·“g î…D ðbÁ&ü óJ= û›³ t üÿ¤~£ ÿHEn ×Á°a ³¸» ¸’¤? ôt° áê- W‚( ÌÎÃ: )_>ÛÛ )ƒÙ î -«ö‚ 4âU4à Aœ 0 DYñÖ DYô DYÿ\ DZï DZ2 DZ  D–äx| FTÎ(E L‹~; OqP½ P€}Q [¥Y \‰m" ]–DbÌ ^B“/… _Ÿ¢^ì fÒ$yD iÞI¤à kµ$ŽŸ lFsÈ o$W9 ug1Îf uò0a z›4Ø¢ zÖ=ø {¾N ‚Ë—™5 ‰P©‚ ‹––Á ”S•† ¢­V= ¤™l7 ¤é’ìó ­4ò ­ž¹)N ±Æ²!Í ²tó”® ·§ ¹Ê¼ý] Àë÷s ÃFÎ(¤ ƨ´;• Ç‚òO ÐíL· Ò¦þ´­ Ó™N = Ú!mp² à&ˆ£x ãÈã8M ä@Î åë5÷g æåã ñ晜l ò³lx òÀD‡ óB,–> ÷ºTR ú¥E _ û¸hì þ£B§?âÑ!Hrͽñ®ïA \Å)þÑ_[þI™[þ¢c[þ­ö"R¥øQ%jé½*™^†.•Ir€>ÖãF÷ó‡³K>8LªþÄ=P%ÓTUHN“h8…ãMhóét­k 4ånM¤v«nßMóÂoþ:˜Ÿr×bÙt×*W²tÝÕõ­uÀÞ) {S¾<2|´C†x€WNÐÚ€WN}D¤å.Ë„@0>…P£!…P£ý?ŠÅj'PŒÄ1õŽð5O¯›¬Þ›ñ¶Ü§WŽ¡©ŒŽ«Ó4q ®ÒËá°ôÕÏû»àJ¼ÚÞ¸Ú¾®_ù¾(­÷$ÁæÄ¢PÁæÄÇdÍ->Ú(ÔÜ­ý?Þ;â+óáÜþ&áÞ©ZætÂæç»õõëYW 2í\tX+õ@™V¯õ@êõ½Nñ” y•ˉ!S°( @<j Vt| ðÉÌu¥Ò 'ƒ¾ Âù0Ÿ"Ƥµ±%ésú>*ÇÚž -er6pC˜ ?²ºk?²º¬“Ahyn¨CS mkD8ÚµJ«d•­L!õ2N¥ UO™2Ρ[m4§Ù]‡Õ%Ñ^—äw€h|Ž­Êi‹šPjbÌômýôÿu°TŠx{Yœá{sCÈð{sC­žƒ¶ŽXšJC!€–ÒA›coÈ~›òµ)äZY¡»žj "Ÿjßv€ úŠÅ¡Ôev¤H>¥º4L®T‹“®Õ ú¨¯ÛShÚ´/²¹¸¶Ã2Ͻ嚩ÄÏÞ†åÇÌó“”ÕéTd³×Ù£ùCÛMIÀt݉Ô8á@™|Žål®Àått åttïQècʨúìî*þc^´3ÿ.Ò#bÿ.Ò×gi\ %1: %2%1: %2 ActivityLogŽ<p>Zápis  inností uvádí vaai spolupráci a dalaí události uvnitY %1.</p>G

Activity Log lists your interactions and other events within %1.

 ActivityLogZápis  innosti Activity Log ActivityLog PYidat %1 vrstvu Add %1 LayerAddLayerCommandÚhrnná vlnaAggregate WaveAggregateWaveModelZarovnání AlignmentAlignmentModel&Pohled na zarovnání AlignmentView AlignmentViewFZmnit násobek rozta~ení  asu na %1 Change time-stretch factor to %1AudioCallbackPlaySourcePYehrát od %1 Play from %1AudioCallbackPlaySourceZastavit na %1 Stop at %1AudioCallbackPlaySourceNahráno %1 Recorded %1AudioCallbackRecordTargetnahráno-%1.wavrecorded-%1.wavAudioCallbackRecordTarget %1: %2%1: %2 AudioDial%1: %2%3%1: %2%3 AudioDial%2%3%2%3 AudioDialLZadejte novou hodnotu od %1, do %2 %3:#Enter a new value from %1 to %2 %3: AudioDialDZadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2: AudioDial&Zadat novou hodnotuEnter new value AudioDialHNová hodnota pro %1, od %2 do %3 %4:#New value for %1, from %2 to %3 %4: AudioDialBNová hodnota pro %1, od %2 do %3: New value for %1, from %2 to %3: AudioDial>Re~im pYipojení není podporovánAppend mode not supportedBZipFileDeviceXOtevYení proudu bzip2 pro  tení se nezdaYilo'Failed to open bzip2 stream for readingBZipFileDeviceXOtevYení proudu bzip2 pro zápis se nezdaYilo'Failed to open bzip2 stream for writingBZipFileDeviceNOtevYení souboru pro  tení se nezdaYiloFailed to open file for readingBZipFileDeviceNOtevYení souboru pro zápis se nezdaYiloFailed to open file for writingBZipFileDevicehOtevYení manipulátoru souboru pro  tení se nezdaYilo&Failed to open file handle for readingBZipFileDevicehOtevYení manipulátoru souboru pro zápis se nezdaYilo&Failed to open file handle for writingBZipFileDeviceHRe~im pYístupu k souborom není zadánFile access mode not specifiedBZipFileDevice*Soubor je ji~ otevYenFile is already openBZipFileDevice Soubor neotevYen File not openBZipFileDevicedVnitYní chyba (závr ani pro  tení, ani pro zápis)1Internal error (close for neither read nor write)BZipFileDevicejVnitYní chyba (otevYení ani pro  tení, ani pro zápis)0Internal error (open for neither read nor write)BZipFileDeviceHRe~imy pro  tení a zápis jsou zadány#Read and write modes both specifiedBZipFileDevice>Chyba závru  tení proudu bzip2bzip2 stream read close errorBZipFileDevice0Chyba  tení proudu bzip2bzip2 stream read errorBZipFileDevice@Chyba závru zápisu proudu bzip2bzip2 stream write close errorBZipFileDevice %1 (jedna zmna)%1 (%n zmny)%1 (%n zmn)%1 (%n change(s)) BundleCommandTOtevYení souboru %1 pro zápis se nezdaYilo"Failed to open file %1 for writing CSVFileWriter%1 (více) (%1 more)CSVFormatDialog<nevaímat si>CSVFormatDialog>Vzorkovací kmito et zvuku (Hz):Audio sample rate (Hz):CSVFormatDialogDData budou zobrazena ve vrstv %1.%Data will be displayed in a %1 layer.CSVFormatDialogDoba trváníDurationCSVFormatDialogKoncový  asEnd timeCSVFormatDialogXOtevYen, ve zvukových vzorkovacích snímcích"Explicitly, in audio sample framesCSVFormatDialog2OtevYen, v milisekundáchExplicitly, in millisecondsCSVFormatDialog*OtevYen, v sekundáchExplicitly, in secondsCSVFormatDialog2Nárost snímko mezi Yádky:Frame increment between rows:CSVFormatDialog\Skryt: Yádky jsou pravideln rozlo~eny v  ase+Implicitly: rows are equally spaced in timeCSVFormatDialog `títekLabelCSVFormatDialogVýaka tónuPitchCSVFormatDialogpVyberte, prosím, správný datový formát pro tento soubor.4Please select the correct data format for this file.CSVFormatDialog(Vybrat datový formátSelect Data FormatCSVFormatDialog asTimeCSVFormatDialog as je zadán:Timing is specified:CSVFormatDialogHodnotaValueCSVFormatDialogHodnotyValuesCSVFormatDialog+/-1+/-1Colour3DPlotLayer<neznámý> Colour3DPlotLayerNaprostýAbsoluteColour3DPlotLayer V~dý neprohledná Always OpaqueColour3DPlotLayerStupnice koae Bin ScaleColour3DPlotLayerKoaeBinsColour3DPlotLayer BarvaColColour3DPlotLayer BarvaColourColour3DPlotLayer Zesílení signáluGainColour3DPlotLayerSmíaenýHybridColour3DPlotLayer0Obrátit svislou stupniciInvert Vertical ScaleColour3DPlotLayer  árovýLinearColour3DPlotLayer ZápisLogColour3DPlotLayer }ádnýNoneColour3DPlotLayerNormalizace NormalizationColour3DPlotLayerStupniceScaleColour3DPlotLayer JemnáSmoothColour3DPlotLayer@ as: %1 - %2 Koa: %3 Hodnota: %4Time: %1 - %2 Bin: %3 Value: %4Colour3DPlotLayer PohledViewColour3DPlotLayerdBdBColour3DPlotLayer*PYidat novou barvu...Add New Colour...ColourComboBox<Zadejte název pro novou barvu: Enter a name for the new colour:ColourComboBox,Pojmenovat novou barvuName New ColourColourComboBoxTUpYednostHovat  erné pozadí pro tuto barvu'Prefer black background for this colourColourComboBox &Zpt&UndoCommandHistory&Zpt %1&Undo %1CommandHistoryCtrl+Shift+Z Ctrl+Shift+ZCommandHistory Ctrl+ZCtrl+ZCommandHistorybNeexistuje nic, u  eho by alo zruait vrácení zptNothing to redoCommandHistoryRNeexistuje nic, co by se dalo vrátit zptNothing to undoCommandHistory &ZnovuRe&doCommandHistory&Znovu %1Re&do %1CommandHistoryZnovu %1Redo %1CommandHistoryfOpakovat poslední krok úprav, který byl vrácen zpt'Redo the last operation that was undoneCommandHistoryZpt %1Undo %1CommandHistory>Poslední krok úprav vrátit zptUndo the last editing operationCommandHistory"Dekóduje se %1...Decoding %1...CoreAudioFileReader"Dekóduje se %1...Decoding %1...DecodingWavFileReader`Vyrovnávací pame hustého trojrozmrného vrcholuDense 3-D Peak CacheDense3DModelPeakCache$Hustý trojrozmrný Dense 3-DDenseThreeDimensionalModel SnímekFrameDenseThreeDimensionalModel asTimeDenseThreeDimensionalModel$Hustá hodnota  asuDense Time-ValueDenseTimeValueModel&Smazat hlavní modelClear main modelDocument6Nastavit hlavní model na %1Set main model to %1Document@Upravovatelný hustý trojrozmrnýEditable Dense 3-D"EditableDenseThreeDimensionalModel %1 Hz%1 HzFFTModelFFTFFTFFTModel8Zadat novou úroveH prolína eEnter new fader levelFader(ÚroveH: %1%2.%3%4 dBLevel: %1%2.%3%4 dBFaderÚroveH: Vypnuto Level: OffFaderPNová úroveH prolína e, od %1 do %2 dBFS:$New fader level, from %1 to %2 dBFS:FaderFNelze poskytnout dostatek kanálo pro pYídavný modul vyta~ení funkce "%1" (minimum pro pYídavný modul je %2, maximum pro pYídavný modul je %3; vstupní model has %4)oCannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4)!FeatureExtractionModelTransformerrPYídavný modul vyta~ení funkce se nepodaYilo spustit "%1"3Failed to initialise feature extraction plugin "%1"!FeatureExtractionModelTransformerfPYídavný modul "%1" se nepodaYilo dolo~it pYíkladem!Failed to instantiate plugin "%1"!FeatureExtractionModelTransformerPYídavný modul vyta~ení funkce "%1" odmítl daný krok a velikosti bloko (%2 a %3); pou~ívají se výchozí nastavení pYídavného modulu (%4 a %5)}Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead!FeatureExtractionModelTransformer®Vstupní model pro pYídavný modul vyta~ení funkce "%1" je chybného typu (vnitYní chyba?)QInput model for feature extraction plugin "%1" is of wrong type (internal error?)!FeatureExtractionModelTransformerøNení dostupný ~ádný závod pro ID pYídavného modulu vyta~ení funkce "%1" (neznámý typ pYídavného modulu, nebo vnitYní chyba?)dNo factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?)!FeatureExtractionModelTransformervPYídavný modul "%1" nemá ~ádný výstup pojmenovaný jako "%2"$Plugin "%1" has no output named "%2"!FeatureExtractionModelTransformerLPYídavný modul "%1" nemá ~ádné výstupyPlugin "%1" has no outputs!FeatureExtractionModelTransformerÎPromna byla nastavena pro verzi %1 pYídavného modulu "%2", ale pou~ívaný pYídavný modul je ve verzi %3_Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3!FeatureExtractionModelTransformerPromny poskytnuté jedné instanci FeatureExtractionModelTransformer musí být podobné v ka~dém ohledu vyjma výstupu pYídavného modulu€Transforms supplied to a single FeatureExtractionModelTransformer instance must be similar in every respect except plugin output!FeatureExtractionModelTransformer"Stahování zruaenoDownload cancelled FileSource Stahuje se %1...Downloading %1... FileSourceTVytvoYení místního souboru %1 se nezdaYiloFailed to create local file %1 FileSource<Soubor neobsahuje ~ádné údaje!File contains no data! FileSourceFNepodporované schéma v adrese (URL)Unsupported scheme in URL FileSource %1 %2%1 %2FlexiNoteLayer%1 (%2, %3 Hz)%1 (%2, %3 Hz)FlexiNoteLayer%1 Hz (%2, %3)%1 Hz (%2, %3)FlexiNoteLayerPYidat bod Add PointFlexiNoteLayer*Automatické zarovnání Auto-AlignFlexiNoteLayer&Zmnit hodnotu boduChange Point ValueFlexiNoteLayer&Smazat vybrané bodyDelete Selected PointsFlexiNoteLayerTáhnout bod Drag PointFlexiNoteLayerTáhnout výbrDrag SelectionFlexiNoteLayerNakreslit bod Draw PointFlexiNoteLayerUpravit bod Edit PointFlexiNoteLayerVymazat bod Erase PointFlexiNoteLayerProbíhá In progressFlexiNoteLayerLineárníLinearFlexiNoteLayer ZáznamLogFlexiNoteLayerNoty MIDI MIDI NotesFlexiNoteLayer Slou it poznámky Merge NotesFlexiNoteLayerNový bod New PointFlexiNoteLayer"}ádné místní bodyNo local pointsFlexiNoteLayer Vlo~itPasteFlexiNoteLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted items?FlexiNoteLayer Nahrát FlexiNoteRecord FlexiNoteFlexiNoteLayerPYemístit bodRelocate PointFlexiNoteLayer,Zmnit velikost výbruResize SelectionFlexiNoteLayerStupniceScaleFlexiNoteLayer"Jednotky stupnice Scale UnitsFlexiNoteLayer$PYichytit poznámky Snap NotesFlexiNoteLayer^Polo~ky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?­The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?FlexiNoteLayerX as: %1 Výaka: %2 Doba trvání: %3 `títek: %4)Time: %1 Pitch: %2 Duration: %3 Label: %4FlexiNoteLayer\ as: %1 Výaka: %2 Doba trvání: %3 }ádný atítek(Time: %1 Pitch: %2 Duration: %3 No labelFlexiNoteLayerSvislá stupniceVertical ScaleFlexiNoteLayerDoba trváníDurationFlexiNoteModelUpravit data Edit DataFlexiNoteModelFlexiNote FlexiNoteFlexiNoteModel SnímekFrameFlexiNoteModel `títekLabelFlexiNoteModel ÚroveHLevelFlexiNoteModelVýaka tónuPitchFlexiNoteModel asTimeFlexiNoteModelNeznámýUnknownFlexiNoteModelUpravit data Edit DataIProcházet... Browse... ImageDialogXNepodaYilo se stáhnout adresu (URL) "%1": %2Failed to download URL "%1": %2 ImageDialog8Sta~ení souboru se nezdaYiloFile download failed ImageDialog2Soubor nebo adresa (URL): File or URL: ImageDialogObrázekImage ImageDialog`títek:Label: ImageDialogDOtevírá se adresa obrázku (URL)...Opening image URL... ImageDialog NáhledPreview ImageDialogRSchéma adresy (URL) "%1" není podporována$The URL scheme "%1" is not supported ImageDialogFNepodporované schéma v adrese (URL)Unsupported scheme in URL ImageDialogSmazat výbrDelete Selection ImageLayerTáhnout výbrDrag Selection ImageLayerProbíhá In progress ImageLayer"PYesunout obrázek Move Image ImageLayerNový bod New Point ImageLayerDOtevírá se adresa obrázku (URL)...Opening image URL... ImageLayer Vlo~itPaste ImageLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted items? ImageLayer,Zmnit velikost výbruResize Selection ImageLayerVybrat obrázek Select image ImageLayer^Polo~ky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?­The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? ImageLayerUpravit data Edit Data ImageModelUpravit obrázek Edit Image ImageModel SnímekFrame ImageModelObrázekImage ImageModel `títekLabel ImageModel asTime ImageModelNeznámýUnknown ImageModel~%1 soubory sezení (*.%1) Soubory RDF (%3) Vaechny soubory (*.*)6%1 session files (*.%1) RDF files (%3) All files (*.*)InteractiveFileFinder\%1 soubory sezení (*.%2) Vaechny soubory (*.*)'%1 session files (*.%2) All files (*.*)InteractiveFileFinderZ<b>Soubor vybrán</b><p>Soubor "%1" je adresáY4Directory selected

File "%1" is a directoryInteractiveFileFinderž<b>Umístní se nepodaYilo otevYít</b><p>Adresu (URL) "%1" se nepodaYilo otevYít=Failed to open location

URL "%1" could not be openedInteractiveFileFinderŒ<b>Soubor existuje</b><p>Soubor "%1" ji~ existuje. Chcete jej pYepsat?OFile exists

The file "%1" already exists. Do you want to overwrite it?InteractiveFileFinderb<b>Soubor je prázdný</b><p>Soubor "%1" je prázdný)File is empty

File "%1" is emptyInteractiveFileFinderl<b>Soubor není  itelný</b><p>Soubor "%1" nelze pYe íst7File is not readable

File "%1" can not be readInteractiveFileFinder¬<b>Soubor nenalezen</b><p>Zvukový soubor "%1" se nepodaYilo otevYít. Chcete jej najít?VFile not found

Audio file "%1" could not be opened. Do you want to locate it?InteractiveFileFinderœ<b>Soubor nenalezen</b><p>Soubor "%1" se nepodaYilo otevYít. Chcete jej najít?PFile not found

File "%1" could not be opened. Do you want to locate it?InteractiveFileFinder`<b>Soubor nenalezen</b><p>Soubor "%1" neexistuje0File not found

File "%1" does not existInteractiveFileFinderV<b>Není soubor</b><p>Cesta "%1" není soubor+Not a file

Path "%1" is not a fileInteractiveFileFinder*Vaechny soubory (*.*)All files (*.*)InteractiveFileFinderÞVaechny podporované soubory (%1 %2)  árkou oddlené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Mezerou oddlené soubory .lab (*.lab) Soubory RDF (%2) Soubory MIDI (*.mid) Textové soubory (*.txt) Vaechny soubory (*.*)ÏAll supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinder´Vaechny podporované soubory (%1 %2)  árkou oddlené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Mezerou oddlené soubory .lab (*.lab) Soubory RDF (%2) Textové soubory (*.txt) Vaechny soubory (*.*)¼All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*)InteractiveFileFinderÞVaechny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl)  árkou oddlené datové soubory (*.csv) Mezerou oddlené soubory .lab (*.lab) Soubory RDF (%2) Soubory MIDI (*.mid) Textové soubory (*.txt) Vaechny soubory (*.*)ÏAll supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinder´Vaechny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl)  árkou oddlené datové soubory (*.csv) Mezerou oddlené soubory .lab (*.lab) Soubory RDF (%2) Textové soubory (*.txt) Vaechny soubory (*.*)¼All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*)InteractiveFileFinder(Vaechny podporované soubory (*.sv %1 %2 %3) %4 soubory sezení (*.%5) Zvukové soubory (%1) Soubory vrstev (%2) Soubory RDF (%3) Vaechny soubory (*.*)|All supported files (*.sv %1 %2 %3) %4 session files (*.%5) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*)InteractiveFileFinderúVaechny podporované soubory (*.sv %1 %2) %3 soubory sezení (*.%4) Zvukové soubory (%2) Soubory RDF (%1) Vaechny soubory (*.*)hAll supported files (*.sv %1 %2) %3 session files (*.%4) Audio files (%2) RDF files (%1) All files (*.*)InteractiveFileFinderTZvukové soubory (%1) Vaechny soubory (*.*) Audio files (%1) All files (*.*)InteractiveFileFinder ZruaitCancelInteractiveFileFinderX árkou oddlené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Soubory RDF/Turtle (%1) Soubory MIDI (*.mid) Textové soubory (*.txt) Vaechny soubory (*.*)—Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinder. árkou oddlené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Soubory RDF/Turtle (%1) Textové soubory (*.txt) Vaechny soubory (*.*)„Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) Text files (*.txt) All files (*.*)InteractiveFileFinderô árkou oddlené datové soubory (*.csv) Mezerou oddlené soubory .lab (*.lab) Textové soubory (*.txt) Vaechny soubory (*.*)hComma-separated data files (*.csv) Space-separated .lab files (*.lab) Text files (*.txt) All files (*.*)InteractiveFileFinder¨ árkou oddlené datové soubory (*.csv) Textové soubory (*.txt) Vaechny soubory (*.*)EComma-separated data files (*.csv) Text files (*.txt) All files (*.*)InteractiveFileFinderAdresáY vybránDirectory selectedInteractiveFileFinder8Soubor se nepodaYilo otevYítFailed to open fileInteractiveFileFinder<Umístní se nepodaYilo otevYítFailed to open locationInteractiveFileFinder"Soubor neexistujeFile does not existInteractiveFileFinder&Soubor ji~ existuje File existsInteractiveFileFinder"Soubor je prázdný File is emptyInteractiveFileFinder&Soubor není  itelnýFile is not readableInteractiveFileFinderXObrázkové soubory (%1) Vaechny soubory (*.*) Image files (%1) All files (*.*)InteractiveFileFinderNajít soubor...Locate file...InteractiveFileFinder Vybrán ne-souborNon-file selectedInteractiveFileFinder†Zadejte, prosím, adresu (URL), která se má pou~ít pro tento soubor:*Please enter the URL to use for this file:InteractiveFileFinderŠSoubory PNG (Portable Network Graphics) (*.png) Vaechny soubory (*.*)7Portable Network Graphics files (*.png) All files (*.*)InteractiveFileFinderˆSoubory SVG (Scalable Vector Graphics) (*.svg) Vaechny soubory (*.*)6Scalable Vector Graphics files (*.svg) All files (*.*)InteractiveFileFinder`Vybrat soubor, do kterého se má provést vyvedeníSelect a file to export toInteractiveFileFinder0Vybrat soubor se sezenímSelect a session fileInteractiveFileFinderVybrat soubor Select fileInteractiveFileFinderXSoubory XML Sonic Visualiser Layer (*.svl)  árkou oddlené datové soubory (*.csv) Soubory RDF/Turtle (%1) Soubory MIDI (*.mid) Textové soubory (*.txt) Vaechny soubory (*.*)—Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinder.Soubory XML Sonic Visualiser Layer (*.svl)  árkou oddlené datové soubory (*.csv) Soubory RDF/Turtle (%1) Textové soubory (*.txt) Vaechny soubory (*.*)„Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*)InteractiveFileFinder&Pou~ít adresu (URL)Use URLInteractiveFileFinder,Pou~ít adresu (URL)... Use URL...InteractiveFileFinderbZvukové soubory WAV (*.wav) Vaechny soubory (*.*)'WAV audio files (*.wav) All files (*.*)InteractiveFileFinder snímky framesItemEditDialog sek secItemEditDialog usek usecItemEditDialog ZruaitCancelItemEditDialogDoba trvání: Duration:ItemEditDialogOKOKItemEditDialogVlastnosti PropertiesItemEditDialogNastavit znovuResetItemEditDialog Text:Text:ItemEditDialog as:Time:ItemEditDialogNa asováníTimingItemEditDialogHodnota:Value:ItemEditDialog6%1: Klávesové zkratky a mya%1: Key and Mouse Reference KeyReference&& KeyReference"</b>&nbsp;(%1)<b> (%1) KeyReference4<i>nebo</i>&nbsp;<b>%1</b>or %1 KeyReference.Hrubé po ítadlo (doby):Coarse counter (bars):LabelCounterInputDialog2Citlivé po ítadlo (doby):Fine counter (beats):LabelCounterInputDialog$Nastavit po ítadla Set CountersLabelCounterInputDialog%1%1Labeller %1 %2%1.%2Labeller: íslo snímku zvukového vzorkuAudio sample frame numberLabeller$Cyklické po ítadloCyclical counterLabellerVCyklické dvouúrovHové po ítadlo (takt/doba)%Cyclical two-level counter (bar/beat)Labeller@Doba trvání od pYedchozí polo~ky Duration since the previous itemLabellerDDoba trvání po následující polo~kuDuration to the following itemLabellerBody atítko Label PointsLabeller}ádné  íslování No numberingLabellerNStejné jako nejbli~aí pYedchozí polo~ka!Same as the nearest previous itemLabeller(Jednoduché po ítadloSimple counterLabeller8Rozdlit body na menaí  ástiSubdivide PointsLabeller¨Tempo (po et údero za minutu; úzm: bpm) zalo~ené na dob trvání od pYedchozí polo~ky1Tempo (bpm) based on duration since previous itemLabeller¬Tempo (po et údero za minutu; úzm: bpm) zalo~ené na dob trvání po následující polo~ku/Tempo (bpm) based on duration to following itemLabeller as v sekundáchTime in secondsLabellerlHodnota vyta~ená ze atítku u polo~ky (kde je to mo~né)6Value extracted from the item's label (where possible)LabellerProtYídit body Winnow PointsLabeller6Barevný trojrozmrný nákresColour 3D PlotLayerSmazat mYeníDelete MeasurementLayerPru~né poznámkyFlexible NotesLayerObrázkyImagesLayerUdlat mYeníMake MeasurementLayerNotyNotesLayerOblastiRegionsLayerPravítkoRulerLayerSpektrogram SpectrogramLayerSpektrumSpectrumLayerTextTextLayerOkam~iky  asu Time InstantsLayerKus  asu Time SliceLayerHodnoty  asu Time ValuesLayerNeznámá vrstva Unknown LayerLayer$ asový probh vlnyWaveformLayer(Zdroje zvukových datAudio Data SourcesLayerTreeDialogPYehled vrstev Layer SummaryLayerTreeDialog Tabulky a vrstvyPanes and LayersLayerTreeDialog VrstvaLayerLayerTreeModel ModelModelLayerTreeModelPYehrávanáPlayedLayerTreeModelUkázanáShownLayerTreeModelVKlepnte pro pYizposobení úrovn a vyvá~eníClick to adjust level and panLevelPanToolButtonšTáhnte svisle pro pYizposobení úrovn, vodorovného pro pYizposobení vyvá~ení;Drag vertically to adjust level, horizontally to adjust panLevelPanWidgetê<b>Vybrat stopu pro zavedení</b><p> Tento soubor mo~ete zavést jen jako jednu poznámkovou vrstvu, ale soubor obsahuje více ne~ jednu stopu, nebo noty na více ne~ jednom kanálu.<p>Vyberte, prosím, stopu nebo slou ené stopy, je~ si pYejete zavést:èSelect track to import

You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.

Please select the track or merged tracks you wish to import:MIDIFileImportDialog>Chyba pYi zavádní souboru MIDIError in MIDI file importMIDIFileImportDialogTSlou it vaechny stopy, které nejsou bicíchMerge all non-percussion tracksMIDIFileImportDialog*Slou it vaechny stopyMerge all tracksMIDIFileImportDialogHVybrat stopu nebo stopy pro zavedení Select track or tracks to importMIDIFileImportDialog4 - pou~ívá kanál bicích GM - uses GM percussion channelMIDIFileReader%1 - vel %2 %1 - vel %2MIDIFileReaderŽPokus o získání více byto, ne~ je na stop dostupných (%1, má pouze %2)DAttempt to get more bytes than available on Track (%1, only have %2)MIDIFileReaderlPokus o získání více byto ze stopy, ne~ bylo o ekáváno0Attempt to get more bytes than expected on TrackMIDIFileReaderFPokus o  tení po konci souboru MIDI"Attempt to read past MIDI file endMIDIFileReaderPPYi  tení byl dosa~en konec souboru MIDI*End of MIDI file encountered while readingMIDIFileReader@Nalezen neplatný kód události %1Invalid event code %1 foundMIDIFileReaderPSoubor MIDI "%1" nemá noty v ~ádné stop(MIDI file "%1" has no notes in any trackMIDIFileReader~Pro první událost ve stop byl pou~it provozní stav ('Running'),Running status used for first event in trackMIDIFileReaderStopa %1 (%2)%3Track %1 (%2)%3MIDIFileReader,Stopa %1 (bez názvu)%3Track %1 (untitled)%3MIDIFileReader€Chybná délka pro vnitYní data v proudu MIDI (%1, mlo by být %2);Wrong length for int data in MIDI stream (%1, should be %2)MIDIFileReader~Chybná délka pro dlouhá data v proudu MIDI (%1, mlo by být %2)<p><small>Adresa (URL) OSC pro tuto instanci je: "%1"8

The OSC URL for this instance is: "%1" MainWindowª<b>Spo ítání zarovnání se nezdaYilo</b><p>NepodaYilo se spo ítat zarovnání zvuku<p>%1RAlignment calculation failed

Failed to calculate an audio alignment:

%1 MainWindow8<b>Vy~adován zvuk</b><p>Data s vrstvou nelze z "%1" nahrát bez zvukového souboru.<br>PYed zavedením poznámek nahrajte, prosím, alespoH jeden zvukový soubor.—Audio required

Unable to load layer data from "%1" without an audio file.
Please load at least one audio file before importing annotations. MainWindowÄ<b>NepodaYilo se zeptat se na vlastnosti promn</b><p>Chyba pYídavného modulu nebo serveru: %1</p>LFailed to query transform attributes

Plugin or server error: %1

 MainWindow¦<b>NepodaYilo se spustit promnu</b><p>Chyba pYídavného modulu nebo serveru: %1</p>?Failed to run transform

Plugin or server error: %1

 MainWindowž<b>Soubor se nepodaYilo otevYít</b><p>Zvukový soubor "%1" se nepodaYilo otevYít=File open failed

Audio file "%1" could not be opened MainWindowŽ<b>Soubor se nepodaYilo otevYít</b><p>Soubor "%1" se nepodaYilo otevYít7File open failed

File "%1" could not be opened MainWindow¤<b>Soubor se nepodaYilo otevYít</b><p>Soubor s vrstvou "%1" se nepodaYilo otevYít.<File open failed

Layer file %1 could not be opened. MainWindow<<b>VytvoYení vrstvy se nezdaYilo</b><p>NepodaYilo se vytvoYit odvozenou vrstvu.<p>Promna vrstvy "%1" se nezdaYila.<p>Nejsou dostupné ~ádné informace o chyb.‰Layer generation failed

Failed to generate a derived layer.

The layer transform %1failed.

No error information is available. MainWindowð<b>VytvoYení vrstvy se nezdaYilo</b><p>NepodaYilo se vytvoYit odvozenou vrstvu.<p>Promna vrstvy "%1" se nezdaYila:<p>%2gLayer generation failed

Failed to generate derived layer.

The layer transform %1failed:

%2 MainWindow®<b>VytvoYení vrstvy se nezdaYilo</b><p>NepodaYilo se znovu vytvoYit odvozenou vrstvu "%1" za pou~ití nového datového modelu jako vstupu.<p>Promna vrstvy "%2" se nezdaYila.<p>Nejsou dostupné ~ádné informace o chyb.¯Layer generation failed

Failed to regenerate derived layer "%1" using new data model as input.

The layer transform "%2" failed.

No error information is available. MainWindowb<b>VytvoYení vrstvy se nezdaYilo</b><p>NepodaYilo se znovu vytvoYit odvozenou vrstvu "%1" za pou~ití nového datového modelu jako vstupu.<p>Promna vrstvy "%2" se nezdaYila:<p>%3Layer generation failed

Failed to regenerate derived layer "%1" using new data model as input.

The layer transform "%2" failed:

%3 MainWindowæ<b>Poznámka:</b> Je dostupná novjaí verze programu Sonic Visualiser.<br>(je dostupná verze %1; pou~íváte verzi %2)uNote: A newer version of Sonic Visualiser is available.
(Version %1 is available; you are using version %2) MainWindow <b>OtevYení se nezdaYilo</b><p>Upuatnou adresu (URL) "%1" se nepodaYilo otevYít9Open failed

Dropped URL "%1" could not be opened MainWindow¤<b>OtevYení se nezdaYilo</b><p>Soubor nebo adresu (URL) "%1" se nepodaYilo otevYít9Open failed

File or URL "%1" could not be opened MainWindowŒ<b>OtevYení se nezdaYilo</b><p>Adresu (URL) "%1" se nepodaYilo otevYít1Open failed

URL "%1" could not be opened MainWindowÒ<b>PYetí~eno</b><p>Poslech pYídavných modulo zvukových efekto byl zakázán kvoli pYetí~ení pYi zpracování.dOverloaded

Audio effects plugin auditioning has been disabled due to a processing overload. MainWindowè<b>PYetí~eno</b><p>Zpracování rychlosti pYehrávání zvuku bylo omezeno na jeden kanál kvoli pYetí~ení pYi zpracování.wOverloaded

Audio playback speed processing has been reduced to a single channel, due to a processing overload. MainWindow”<b>Ulo~ení se nezdaYilo</b><p>Soubor se sezením "%1" se nepodaYilo ulo~it.:Save failed

Session file "%1" could not be saved. MainWindowt<b>Vybrat cíl pro zavedení</b><p> Tento dokument RDF odkazuje na jeden nebo více zvukových souboro.<p>Ji~ jste nahrál jeden zvukový  asový probh vlny.<br>Co chcete udlat s novými daty?¶Select a target for import

This RDF document refers to one or more audio files.
You already have an audio waveform loaded.
What would you like to do with the new data? MainWindow <b>Sezení bylo upraveno</b><p>Nynjaí sezení bylo upraveno.<br>Chcete je ulo~it?[Session modified

The current session has been modified.
Do you want to save it? MainWindow–<b>Soubor s pYedlohou existuje</b><p>PYedloha "%1" existuje.<br>PYepsat ji?PTemplate file exists

The template "%1" already exists.
Overwrite it? MainWindow<b>Varování pYi znovuvytváYení vrstvy</b><p>PYi znovuvytváYení odvozené vrstvy "%1" za pou~ití nového datového modelu jako vstupu:<p>%2uWarning when regenerating layer

When regenerating the derived layer "%1" using new data model as input:

%2 MainWindowÀ<b>`patný vzorkovací kmito et</b><p>Vzorkovací kmito et tohoto zvukového souboru (%1 Hz) neodpovídá nynjaí rychlosti pYehrávání (%2 Hz).<p>Soubor bude pYehráván se apatnou rychlostí a výakou.<p>ZmHte volbu <i>PYevzorkovat neodpovídající soubory pYi zavedení</i>, která je v nabídce <i>Soubor</i> -> <i>Nastavení</i>, pokud toto chování chcete zmnit.7Wrong sample rate

The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).

The file will play at the wrong speed and pitch.

Change the Resample mismatching files on import option under File -> Preferences if you want to alter this behaviour. MainWindow’<br>Vydávání na pokra ování Cap'n Proto &copy; Vývojová skupina SandstormE
With Cap'n Proto serialisation © Sandstorm Development Group MainWindowº<br>Podpora pro pYídavné moduly DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean BoltonU
With DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton MainWindowv<br>Knihovna Dataquay Qt/RDF &copy; Particular Programs Ltd?
With Dataquay Qt/RDF library © Particular Programs Ltd MainWindowJ<br>FFTW3 &copy; Matteo Frigo and MIT*
With FFTW3 © Matteo Frigo and MIT MainWindowR<br>FFTW3 v%1 &copy; Matteo Frigo and MIT.
With FFTW3 v%1 © Matteo Frigo and MIT MainWindow„<br>Zvuková výstupní knihovna JACK &copy; Paul Davis a Jack O'QuinD
With JACK audio output library © Paul Davis and Jack O'Quin MainWindowŒ<br>Zvuková výstupní knihovna JACK v%1 &copy; Paul Davis a Jack O'QuinH
With JACK audio output library v%1 © Paul Davis and Jack O'Quin MainWindowÈ<br>Podpora pro pYídavné moduly LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld\
With LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld MainWindowx<br>Dekodér souboro mp3 MAD &copy; Underbit Technologies Inc9
With MAD mp3 decoder © Underbit Technologies Inc MainWindow€<br>Dekodér souboro mp3 MAD v%1 &copy; Underbit Technologies Inc=
With MAD mp3 decoder v%1 © Underbit Technologies Inc MainWindow\<br>Dekodér souboro Ogg &copy; CSIRO Australia0
With Ogg file decoder © CSIRO Australia MainWindow<br>Dekodér souboro Ogg (oggz v%1, fishsound v%2) &copy; CSIRO AustraliaJ
With Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia MainWindowp<br>Mostkový komunika ní protokol Piper Vamp &copy; QMUL/
With Piper Vamp protocol bridge © QMUL MainWindowŽ<br>Zvuková výstupní knihovna PortAudio &copy; Ross Bencina a Phil BurkI
With PortAudio audio output library © Ross Bencina and Phil Burk MainWindow¤<br>Zvuková výstupní knihovna PulseAudio &copy; Lennart Poettering a Pierre OssmanT
With PulseAudio audio output library © Lennart Poettering and Pierre Ossman MainWindow¬<br>Zvuková výstupní knihovna PulseAudio v%1 &copy; Lennart Poettering a Pierre OssmanX
With PulseAudio audio output library v%1 © Lennart Poettering and Pierre Ossman MainWindow <br>Datové skladiat RDF Redland &copy; Dave Beckett a the University of BristolP
With Redland RDF datastore © Dave Beckett and the University of Bristol MainWindow¨<br>Datové skladiat RDF Redland v%1 &copy; Dave Beckett a the University of BristolT
With Redland RDF datastore v%1 © Dave Beckett and the University of Bristol MainWindowB<br>RtMidi &copy; Gary P. Scavone&
With RtMidi © Gary P. Scavone MainWindown<br>Knihovna Rubber Band &copy; Particular Programs Ltd;
With Rubber Band Library © Particular Programs Ltd MainWindow€<br>Knihovna Rubber Band verze %1 &copy; Particular Programs Ltd?
With Rubber Band Library v%1 © Particular Programs Ltd MainWindow˜<br>Syntaktický analyzátor Serd a Sord RDF a ukládání &copy; David RobillardB
With Serd and Sord RDF parser and store © David Robillard MainWindowÆ<br>Podpora pro pYídavné moduly Vamp (API verze %1, host SDK verze %2) &copy; Chris Cannam and QMULQ
With Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam and QMUL MainWindow^<br>Knihovna liblo Lite OSC &copy; Steve Harris3
With liblo Lite OSC library © Steve Harris MainWindowf<br>Knihovna liblo Lite OSC v%1 &copy; Steve Harris7
With liblo Lite OSC library v%1 © Steve Harris MainWindowX<br>libsamplerate &copy; Erik de Castro Lopo1
With libsamplerate © Erik de Castro Lopo MainWindow`<br>libsamplerate v%1 &copy; Erik de Castro Lopo5
With libsamplerate v%1 © Erik de Castro Lopo MainWindowR<br>libsndfile &copy; Erik de Castro Lopo.
With libsndfile © Erik de Castro Lopo MainWindowZ<br>libsndfile v%1 &copy; Erik de Castro Lopo2
With libsndfile v%1 © Erik de Castro Lopo MainWindowH<h3>O programu Sonic Visualiser</h3>

About Sonic Visualiser

 MainWindowþ<h3>Je dostupná novjaí verze</h3><p>Pou~íváte verzi %1 programu Sonic Visualiser, ale nyní je dostupná verze %2.</p><p>Podívejte se, prosím, na stránky <a href="http://sonicvisualiser.org/">projektu Sonic Visualiser</a>, abyste získal více informací.</p>ã

Newer version available

You are using version %1 of Sonic Visualiser, but version %2 is now available.

Please see the Sonic Visualiser website for more information.

 MainWindow4<h3>Co je nového v %1</h3>

What's New in %1

 MainWindow¶<p>Sonic Visualiser je programem ur eným pro prohlí~ení a zkoumání zvukových dat, pro významový hudební rozbor a pYipojování poznámek.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p>Æ

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.
http://www.sonicvisualiser.org/

 MainWindowLOpustit nynjaí sezení %1 a za ít nové2Abandon the current %1 session and start a new one MainWindowO %1About %1 MainWindow"PYidat %1 tabulku Add %1 Pane MainWindow0PYidat &stávající vrstvuAdd &Existing Layer MainWindowNPYidat spektrogram &melodického rozsahuAdd &Melodic Range Spectrogram MainWindow*PYidat &novou tabulku Add &New Pane MainWindow.PYidat  a&sové pravítkoAdd &Time Ruler MainWindow4PYidat & asový probh vlny Add &Waveform MainWindow,PYidat novou vrstvu %1Add New %1 Layer MainWindowNPYidat spektrogram nejvyaaího &kmito tuAdd Pea&k Frequency Spectrogram MainWindowPYidat bod Add Point MainWindow$PYidat k&us vrstvyAdd S&lice of Layer MainWindow PYidat spektr&um Add Spectr&um MainWindow&PYidat spektro&gramAdd Spectro&gram MainWindowHPYidat novou prázdnou vrstvu typu %1 Add a new empty layer of type %1 MainWindowbPYidat novou vrstvu ukazující kmito tové spektrum,Add a new layer showing a frequency spectrum MainWindowRPYidat novou vrstvu ukazující spektrogram%Add a new layer showing a spectrogram MainWindowPYidat novou vrstvu ukazující spektrogram nastavený na pYehled výaek notLAdd a new layer showing a spectrogram set up for an overview of note pitches MainWindow’PYidat novou vrstvu ukazující spektrogram nastavený na sledování kmito toEAdd a new layer showing a spectrogram set up for tracking frequencies MainWindowZPYidat novou vrstvu ukazující  asové pravítko$Add a new layer showing a time ruler MainWindowtPYidat novou vrstvu ukazující pohled na  asový probh vlny'Add a new layer showing a waveform view MainWindowjPYidat novou tabulku obsahující pouze  asové pravítko+Add a new pane containing only a time ruler MainWindowdPYidat novou tabulku ukazující kmito tové spektrum+Add a new pane showing a frequency spectrum MainWindowTPYidat novou tabulku ukazující spektrogram$Add a new pane showing a spectrogram MainWindow’PYidat novou tabulku ukazující spektrogram nastavený na pYehled výaek notKAdd a new pane showing a spectrogram set up for an overview of note pitches MainWindow”PYidat novou tabulku ukazující spektrogram nastavený na sledování kmito toDAdd a new pane showing a spectrogram set up for tracking frequencies MainWindowvPYidat novou tabulku ukazující pohled na  asový probh vlny&Add a new pane showing a waveform view MainWindowŠPYidat nové okam~iky v pravidelných odstupech mezi vybranými okam~ikyCAdd new instants at regular intervals between the selected instants MainWindowHPYidat tato data do nynjaího sezení$Add this data to the current session MainWindow4Upravit nastavení programu"Adjust the application preferences MainWindow^PYizposobit hlavní úroveH pYehrávání a vyvá~ení(Adjust the master playback level and pan MainWindowLPYizposobit hlavní rychlost pYehrávání Adjust the master playback speed MainWindow<Zarovnat  asové pYímky souboroAlign File Timelines MainWindowAlt+aipka vlevoAlt+Left MainWindow Alt+aipka vpravo Alt+Right MainWindow,Pou~ít pYedlohu sezeníApply Session Template MainWindow4PYetí~ení zpracování zvukuAudio processing overload MainWindow  ernáBlack MainWindow ModráBlue MainWindowSvtlemodrá Bright Blue MainWindowSvtlezelená Bright Green MainWindowSvtleoran~ová Bright Orange MainWindowSvtlepurpurová Bright Purple MainWindowSvtle ervená Bright Red MainWindowDProcházet slo~ku s nahraným zvukemBrowse Recorded Audio Folder MainWindow"Vyprázd&nit výbrC&lear Selection MainWindowJNe-notové vrstvy nelze do MIDI vyvést$Can't export non-note layers to MIDI MainWindowKanál &%1 Channel &%1 MainWindow4Vybrat výchozí pYedlohu...Choose Default Template... MainWindow Vyprázdnit výbrClear the selection MainWindowzKlepnte levým tla ítkem a táhnte pro vytvoYení nové polo~ky-Click left button and drag to create new item MainWindow„Klepnte levým tla ítkem a táhnte pro zmYení obdélníkové oblasti8Click left button and drag to measure a rectangular area MainWindow’Klepnte levým tla ítkem a táhnte pro zmYení rozsahu polo~ky nebo tvaruAClick left button and drag to measure extents of an item or shape MainWindowbKlepnte levým tla ítkem a táhnte pro pYesouvání)Click left button and drag to move around MainWindowÎKlepnte levým tla ítkem a táhnte pro výbr oblasti; táhnte za okraj oblasti pro zmnu její velikostiGClick left button and drag to select region; drag region edge to resize MainWindow¤Klepnte levým tla ítkem na polo~ku nebo vybranou oblast a táhnte pro její pYesun@Click left button on an item or selected region and drag to move MainWindow€Klepnte levým tla ítkem na polo~ku pro její odstranní z vrstvy8Click left button on an item to remove it from the layer MainWindowJZavYít nynjaí sezení a vytvoYit nové.Close the current session and create a new one MainWindow‚Ctrl a klepnte levým tla ítkem a táhnte pro výbr dalaí oblasti=Cmd-click left button and drag to select an additional region MainWindow4Omezit pYehrávání na výbrConstrain Playback to Selection MainWindowHOmezit pYehrávání na vybrané oblasti*Constrain playback to the selected regions MainWindowXKopírovat výbr z nynjaí vrstvy do schránky:Copy the selection from the current layer to the clipboard MainWindow Ctrl+ACtrl+A MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindowCtrl+Home Ctrl+Home MainWindow Ctrl+ICtrl+I MainWindow Ctrl+LCtrl+L MainWindow Ctrl+aipka vlevo Ctrl+Left MainWindow Ctrl+MCtrl+M MainWindow Ctrl+NCtrl+N MainWindow Ctrl+OCtrl+O MainWindowCtrl+PgDown Ctrl+PgDown MainWindowCtrl+PgUp Ctrl+PgUp MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+RCtrl+R MainWindowÿÿÿÿ Ctrl+Right MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+A Ctrl+Shift+A MainWindowCtrl+Shift+D Ctrl+Shift+D MainWindowCtrl+Shift+O Ctrl+Shift+O MainWindow Ctrl+Shift+EnterCtrl+Shift+Return MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+V Ctrl+Shift+V MainWindowCtrl+Mezerník Ctrl+Space MainWindow Ctrl+TCtrl+T MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow Ctrl+YCtrl+Y MainWindow‚Ctrl a klepnte levým tla ítkem a táhnte pro výbr dalaí oblasti>Ctrl-click left button and drag to select an additional region MainWindowVyj&moutCu&t MainWindowTVyjmout výbr z nynjaí vrstvy do schránky9Cut the selection from the current layer to the clipboard MainWindowVelikost cyklu Cycle size MainWindow LaditDebug MainWindow,Sní~it úroveH zvtaeníDecrease the zoom level MainWindowSmazat (Delete)Del MainWindowbSmazat polo~ky v nynjaím výbru z nynjaí vrstvy8Delete items in current selection from the current layer MainWindow2Smazat nyní  innou vrstvu!Delete the currently active layer MainWindow4Smazat nyní  innou tabulku Delete the currently active pane MainWindowbSmazat mYení, které je nyní pod ukazovátkem myai8Delete the measurement currently under the mouse pointer MainWindow Funkce zobrazeníDisplay Features MainWindow,Dvakrát klepnte levýmDouble-Click Left MainWindowzDvakrát klepnte levým tla ítkem na polo~ce pro její upravení.Double-click left button on an item to edit it MainWindowvDvakrát klepnte levým tla ítkem pro skok na klepnuté místo4Double-click left button to jump to clicked location MainWindow Sní~itDown MainWindowNakreslitDraw MainWindowR innosti nástroje kreslení provádné myaíDraw Tool Mouse Actions MainWindow6Nakreslit polo~ky ve vrstvDraw new items in layer MainWindowEE MainWindowUpravitEdit MainWindow&Upravit data vrstvyEdit Layer Data MainWindowL innosti nástroje úprav provádné myaíEdit Tool Mouse Actions MainWindow4Nástrojový pruh pro úpravy Edit Toolbar MainWindow2Upravit polo~ky ve vrstvEdit items in layer MainWindow\Upravit nyní  innou vrstvu jako datovou mYí~ku.Edit the currently active layer as a data grid MainWindow ÚpravyEditing MainWindow KonecEnd MainWindow EnterEnter MainWindow(Zadat název pYedlohyEnter template name MainWindowVymazatErase MainWindowR innosti nástroje vymazání provádné myaíErase Tool Mouse Actions MainWindow0Vymazat polo~ky z vrstvyErase items from layer MainWindowEscEsc MainWindowUkon it %1Exit %1 MainWindowTRozaíYit oblast tabulky na celou obrazovku(Expand the pane area to the whole screen MainWindow:Vyvést poznámkovou &vrstvu...Export Annotation La&yer... MainWindow,Vyvést zvuková data...Export Audio Data... MainWindow4Vyvést obrázkový soubor...Export Image File... MainWindow0Vyvést do souboru SVG...Export SVG File... MainWindow<Vyvést pYedlohu jako sezení...Export Session as Template... MainWindow|Vyvést jednu tabulku do akálovatelného obrázkového souboru SVG1Export a single pane to a scalable SVG image file MainWindowdVyvést ka~dou jednu tabulku do obrázkového souboru%Export a single pane to an image file MainWindowPVyvést zvuk z výbru do datového souboru,Export audio from selection into a data file MainWindow&Vyvést zvuk do "%1"Export audio to "%1" MainWindow,Vyvést obrázek do "%1"Export image to "%1" MainWindow:Vyvést data vrstvy do souboruExport layer data to a file MainWindow*Vyvést vrstvu do "%1"Export layer to "%1" MainWindow:Vyvést více zvukových souboroExport multiple audio files MainWindow@Vyvést výbr jako zvukový soubor!Export selection as an audio file MainWindow8Vyvést pouze vybranou oblastExport the selected region only MainWindowRVyvést vybrané oblasti do jednoho souboru.Export the selected regions into a single file MainWindowXVyvést vybrané oblasti do oddlených souboro/Export the selected regions into separate files MainWindow(Vyvést plochu výbruExport the selection extent MainWindowFVyvést plochu výbru (%1x%2 pixelo)*Export the selection extent (%1x%2 pixels) MainWindow<Vyvést pouze viditelnou oblastExport the visible area only MainWindowZVyvést pouze viditelnou oblast (%1x%2 pixelo)+Export the visible area only (%1x%2 pixels) MainWindow4Vyvést celý zvukový souborExport the whole audio file MainWindow$Vyvést celý souborExport the whole file MainWindow(Vyvést celou tabulkuExport the whole pane MainWindowFVyvést celou tabulku (%1x%2 pixelo)$Export the whole pane (%1x%2 pixels) MainWindowPF MainWindowF1F1 MainWindowF11F11 MainWindowF2F2 MainWindow@Zarovnání se spo ítat nepodaYiloFailed to calculate alignment MainWindow:Vrstvu se nepodaYilo vytvoYitFailed to generate layer MainWindowXUpuatnou adresu (URL) se nepodaYilo otevYítFailed to open dropped URL MainWindow8Soubor se nepodaYilo otevYítFailed to open file MainWindowTOtevYení souboru %1 pro zápis se nezdaYilo"Failed to open file %1 for writing MainWindow<Umístní se nepodaYilo otevYítFailed to open location MainWindowXNepodaYilo se zeptat se na vlastnosti promn$Failed to query transform attributes MainWindowFVrstvu se nepodaYilo vytvoYit znovuFailed to regenerate layer MainWindow>Soubor SVG se nepodaYilo ulo~itFailed to save SVG file MainWindowDNepodaYilo se ulo~it soubor SVG %1Failed to save SVG file %1 MainWindow6Soubor se nepodaYilo ulo~itFailed to save file MainWindowLSoubor s obrázkem se nepodaYilo ulo~itFailed to save image file MainWindowRSoubor s obrázkem %1 se nepodaYilo ulo~itFailed to save image file %1 MainWindow6Soubor se nepodaYilo zapsatFailed to write file MainWindowRychle vpYed Fast Forward MainWindow0PYetá et rychle na konecFast Forward to End MainWindow>Rychle vpYed k dalaímu okam~ikuFast Forward to Next Instant MainWindow6Rychle vpYed k dalaímu boduFast Forward to Next Point MainWindow:Rychle vpYed k podobnému boduFast Forward to Similar Point MainWindowRychle vpYed Fast forward MainWindowXRychle vpYed k dalaímu bodu v nynjaí vrstv3Fast forward to the next point in the current layer MainWindownRychle vpYed k dalaímu okam~iku v  ase v nynjaí vrstv:Fast forward to the next time instant in the current layer MainWindow0PYetá et rychle na konecFast-forward to the end MainWindowvRychle vpYed k dalaímu podobn ohodnocenému okam~iku v  ase6Fast-forward to the next similarly valued time instant MainWindow†Rychle vpYed k dalaímu okam~iku v  ase nebo místu  asového pravítka9Fast-forward to the next time instant or time ruler notch MainWindow4Nástrojový pruh pro soubor File Toolbar MainWindow.Správa souboro a sezeníFile and Session Management MainWindow Najít promnu...Find a Transform... MainWindowCitlivý výbr Fine Select MainWindowZZlomkový soubor %1 ji~ existuje. PYeruauje se)Fragment file %1 already exists, aborting MainWindowGG MainWindow,Jít na celou obrazovkuGo Full-Screen MainWindow ZelenáGreen MainWindowNápovdaHelp MainWindowHSkrýt  asy, názvy vrstev, a stupnici"Hide times, layer names, and scale MainWindowHomeHome MainWindow:Zavést poznámkovou &vrstvu...Import Annotation &Layer... MainWindowVZavést dalaí zvukový soubor do nové tabulky*Import an extra audio file into a new pane MainWindowRZavést data vrstvy ze stávajícího souboru'Import layer data from an existing file MainWindow,Zvýait úroveH zvtaeníIncrease the zoom level MainWindowHVlo~it okam~iky na &hranicích výbru(Insert Instants at Selection &Boundaries MainWindow.Vlo~it polo~ku u výbruInsert Item at Selection MainWindowˆVlo~it novou polo~ku noty nebo oblasti odpovídající nynjaímu výbruGInsert a new note or region item corresponding to the current selection MainWindowªVlo~it nový  asový okam~ik v nynjaí poloze pYehrávání, v nové vrstv, pokud je tYebaWInsert a new time instant at the current playback position, in a new layer if necessary MainWindowÎVlo~it nové  asové okam~iky na za átku a na konci nyní vybraných oblastí, v nové vrstv, pokud je tYebajInsert new time instants at the start and end of the current selected regions, in a new layer if necessary MainWindowS&ko it vpravo J&ump Right MainWindowKK MainWindow VlevoLeft MainWindow4Udlat z pYehrávání smy ku Loop Playback MainWindow8Udlat z pYehrávaného smy ku Loop playback MainWindowMM MainWindow.Udlat mYení ve vrstvMake measurements in layer MainWindowJUdlat dalaí vrstvu v tabulce nynjaí'Make the next layer in the pane current MainWindow|Udlat dalaí tabulku smrem dolo v zásobníku tabulek sou asnou1Make the next pane down in the pane stack current MainWindow€Udlat dalaí tabulku smrem nahoru v zásobníku tabulek sou asnou/Make the next pane up in the pane stack current MainWindowRUdlat pYedchozí vrstvu v tabulce nynjaí+Make the previous layer in the pane current MainWindow6Spravovat vyvedené pYedlohyManage Exported Templates MainWindow.Správa tabulek a vrstevManaging Panes and Layers MainWindow ZmYitMeasure MainWindowOblast mYení Measure Area MainWindowPolo~ka mYení Measure Item MainWindowN innosti nástroje mYení provádné myaíMeasure Tool Mouse Actions MainWindowPosunoutMove MainWindow"Vícenásobný výbr Multi Select MainWindowŒJe vybráno více oblastí povodního zvukového souboru. Co chcete vyvést?UMultiple regions of the original audio file are selected. What do you want to export? MainWindow,Vícenásobn vae z výaeMultiplex all of the above MainWindowVíceproudý zvukMultiplexed audio MainWindowNN MainWindowNavedeníNavigate MainWindowZ innosti nástroje pro navedení provádné myaíNavigate Tool Mouse Actions MainWindow6Nový název pro tuto vrstvu:New name for this layer: MainWindow2Je dostupná novjaí verzeNewer version available MainWindowDNebyl nahrán ~ádný zvukový soubor.No audio file loaded. MainWindow²Poznámka: celá tabulka je pYília airoká na to, aby mohla být vyvedena jako jeden obrázek.BNote: the whole pane is too wide to be exported as a single image. MainWindow0 íslovat nové okam~iky sNumber New Instants with MainWindow>Po et rozdlení na menaí  ásti:Number of subdivisions: MainWindowDOtevYít &naposledy otevYený soubor Open &Recent MainWindow(OtevYít &umístní...Open Lo&cation... MainWindow OtevYít umístní Open Location MainWindowlOtevYít soubor se sezením, zvukový soubor, nebo vrstvu)Open a session file, audio file, or layer MainWindow~OtevYít okno zobrazující poYadí tabulek a vrstev v tomto sezeníJOpen a window displaying the hierarchy of panes and layers in this session MainWindowpOtevYít okno uvádjící výmnu informací a dalaí události3Open a window listing interactions and other events MainWindowtOtevYít okno s nástroji na pYevádní výaek tóno a  asování6Open a window of pitch and timing conversion utilities MainWindowOtevYít okno ukazující klávesové zkratky, které lze pou~ít v programu %16Open a window showing the keystrokes you can use in %1 MainWindowfOtevYít nebo zavést soubor ze vzdálené adresy (URL)'Open or import a file from a remote URL MainWindow<OtevYít odbornou pYíru ku k %1Open the %1 reference manual MainWindowNOtevYít internetové stránky programu %1Open the %1 website MainWindow€OtevYít slo~ku s nahraným zvukem v systémovém prohlí~e i souboro9Open the Recorded Audio folder in the system file browser MainWindowOran~ováOrange MainWindow(Nají~dní a navádníPanning and Navigation MainWindow4Vlo~it v poloze pYehráváníPaste at Playback Position MainWindowHVlo~it ze schránky do nynjaí vrstvy-Paste from the clipboard to the current layer MainWindow¢Vlo~it ze schránky do nynjaí vrstvy, první polo~ka se umístí v poloze pYehrávání^Paste from the clipboard to the current layer, placing the first item at the playback position MainWindow.Letmo prohlédnout vlevo Peek Left MainWindow0Letmo prohlédnout vpravo Peek Right MainWindow PgDownPgDown MainWindowPgUpPgUp MainWindow$PYehrát/Pozastavit Play / Pause MainWindow:Nástrojový pruh pro re~im hryPlay Mode Toolbar MainWindow&PYehrávání Play&back MainWindowPYehráváníPlayback MainWindow&Rychlost pYehráváníPlayback Speed MainWindow<Nástrojový pruh pro pYehráváníPlayback Toolbar MainWindow:Ovládání pYehrávání a pYesunuPlayback and Transport Controls MainWindowPRychlost pYehrávání: %1% (%2x rychlejaí) Playback speed: %1% (%2x faster) MainWindowPRychlost pYehrávání: %1% (%2x pomalejai) Playback speed: %1% (%2x slower) MainWindow8Rychlost pYehrávání: ObvykláPlayback speed: Normal MainWindowZZadejte, prosím, název pro ulo~enou pYedlohu:+Please enter a name for the saved template: MainWindowvZadejte, prosím adresu (URL) umístní, které se má otevYít:-Please enter the URL of the location to open: MainWindowLPotí~e pYi nahrávání pYídavných moduloProblems loading plugins MainWindowPurpurováPurple MainWindowRR MainWindowOtevYít znovuRe-open MainWindowhOtevYít znovu nynjaí nebo naposledy otevYený soubor0Re-open the current or most recently opened file MainWindowRVybrat znovu naposledy provedenou promnu)Re-select the most recently run transform MainWindow NahrátRecord MainWindow4Nahrát nový zvukový souborRecord a new audio file MainWindow ervenáRed MainWindow VydáníRelease MainWindowVydání %1 Release %1 MainWindow(Vydání %1: Revize %2Release %1 : Revision %2 MainWindowPYemístitRelocate MainWindowROdstranit vaechny okam~iky krom násobko:,Remove all instants apart from multiples of: MainWindowˆOdstranit rozdlení na menaí  ásti, ponechaje jen ka~dý n-tý okam~ik3Remove subdivisions, leaving only every Nth instant MainWindow$PYejmenovat vrstvu Rename Layer MainWindow<PYejmenovat nyní  innou vrstvu!Rename the currently active layer MainWindow8PYe íslovat vybrané okam~ikyRenumber Selected Instants MainWindowˆPYe íslovat vybrané okam~iky za pou~ití nynjaího atítkovacího plánuARenumber the selected instants using the current labelling scheme MainWindow Opakovat promnuRepeat Transform MainWindow0Nahradit &hlavní zvuk...Replace &Main Audio... MainWindow|Nahradit soubor s hlavním zvukem v tomto sezení jiným souborem@Replace the main audio file of the session with a different file MainWindow0Nastavit znovu po ítadlaReset Counters MainWindowDNastavit  íslovací po ítadla znovuReset Numbering Counters MainWindow Nastavit na 1 vaechna po ítadla pou~ívaná pro atítkování zalo~ené na po ítadlechPYeto it k pYedchozímu okam~ikuRewind to Previous Instant MainWindow6PYeto it k pYedchozímu boduRewind to Previous Point MainWindow2PYeto it k podobnému boduRewind to Similar Point MainWindow&PYeto it na za átekRewind to Start MainWindowXPYeto it k pYedchozímu bodu v nynjaí vrstv1Rewind to the previous point in the current layer MainWindowvPYeto it k pYedchozímu podobn ohodnocenému okam~iku v  ase4Rewind to the previous similarly valued time instant MainWindownPYeto it k pYedchozímu okam~iku v  ase v nynjaí vrstv8Rewind to the previous time instant in the current layer MainWindow†PYeto it k pYedchozímu okam~iku v  ase nebo místu  asového pravítka7Rewind to the previous time instant or time ruler notch MainWindow&PYeto it na za átekRewind to the start MainWindow VpravoRight MainWindow@Nesoulad ve vzorkovacím kmito tuSample rate mismatch MainWindow,Ulo~it sezení &jako...Save Session &As... MainWindow.Ulo~it sezení jako "%1"Save session as "%1" MainWindow\Ulo~it nynjaí sezení do %1 souboru se sezením/Save the current session into a %1 session file MainWindowjUlo~it nynjaí sezení do nového %1 souboru se sezením3Save the current session into a new %1 session file MainWindow"Projí~dt &doleva Scroll &Left MainWindow$Projí~dt do&prava Scroll &Right MainWindow\Projí~dt nynjaí tabulkou velkým skokem vlevo.Scroll the current pane a big step to the left MainWindow^Projí~dt nynjaí tabulkou velkým skokem vpravo/Scroll the current pane a big step to the right MainWindow@Projí~dt nynjaí tabulkou vlevo#Scroll the current pane to the left MainWindow®Projí~dt nynjaí tabulkou vlevo bez pohybu ukazatelem pYehrávání nebo jinými tabulkamiUScroll the current pane to the left without moving the playback cursor or other panes MainWindowBProjí~dt nynjaí tabulkou vpravo$Scroll the current pane to the right MainWindow°Projí~dt nynjaí tabulkou vpravo bez pohybu ukazatelem pYehrávání nebo jinými tabulkamiVScroll the current pane to the right without moving the playback cursor or other panes MainWindow–Hledat promnu z nainstalovaných pYídavných modulo, podle názvu nebo popisuISearch for a transform from the installed plugins, by name or description MainWindow VybratSelect MainWindowVybrat &vae Select &All MainWindow0Vybrat &viditelný rozsahSelect &Visible Range MainWindowN innosti nástroje výbru provádné myaíSelect Tool Mouse Actions MainWindowDVybrat zvukový soubor pro vyvedeníSelect audio file to export MainWindowfVybrat od nynjaí polohy pYehrávání po konec sezeníCSelect from the current playback position to the end of the session MainWindowjVybrat od za átku sezení po nynjaí polohu pYehráváníESelect from the start of the session to the current playback position MainWindowVybrat rozsah Select ranges MainWindowBVybrat oblast, která se má vyvéstSelect region to export MainWindow.Vybrat cíl pro zavedeníSelect target for import MainWindowlVybrat  asový rozsah odpovídající aíYce nynjaího okna?Select the time range corresponding to the current window width MainWindowRVybrat celou dobu trvání nynjaího sezení0Select the whole duration of the current session MainWindow Vybrat do &konceSelect to &End MainWindow$Vybrat po &za átekSelect to &Start MainWindow Výbr Selection MainWindow@Výbr: %1 a~ %2 (doba trvání %3)!Selection: %1 to %2 (duration %3) MainWindow(Sezení bylo upravenoSession modified MainWindow>Nastavit  íslovací po ítadla...Set Numbering Counters... MainWindowtNastavit jako výchozí pYedlohu pro budoucí zvukové soubory.Set as default template for future audio files MainWindow†Nastavit po ítadla pou~ívaná pro atítkování zalo~ené na po ítadlech1Set the counters used for counter-based labelling MainWindowShift+Enter Shift+Enter MainWindowShift+GShift+G MainWindowShift+KShift+K MainWindow"Shift+aipka vlevo Shift+Left MainWindowShift+MShift+M MainWindowShift+PgDown Shift+PgDown MainWindowShift+PgUp Shift+PgUp MainWindow$Shift+aipka vpravo Shift+Right MainWindowShift+UShift+U MainWindowShift+WShift+W MainWindow¸Shift a klepnte levým tla ítkem a táhnte pro výbr bez pYichytávání k polo~kám nebo mYí~ceLShift-click left button and drag to select without snapping to items or grid MainWindowšShift a klepnte levým tla ítkem a táhnte pro pYiblí~ení obdélníkové oblasti>Shift-click left button and drag to zoom to a rectangular area MainWindow0Ukázat &vaechna pYekrytíShow &All Overlays MainWindow.Ukázat &stYedovou linkuShow &Centre Line MainWindow2Ukázat nej&menaí pYekrytíShow &Minimal Overlays MainWindow4&Neukazovat ~ádná pYekrytíShow &No Overlays MainWindow4Ukázat pYevodník &jednotekShow &Unit Converter MainWindow<Ukázat kole ka pro &zvtaováníShow &Zoom Wheels MainWindow,Ukázat zápis  in&nostiShow Acti&vity Log MainWindow,Ukázat pYehled &vrstevShow La&yer Summary MainWindow2Ukázat &okénka vlastnostíShow Property Bo&xes MainWindow*Ukázat st&avový YádekShow Status &Bar MainWindow<Ukázat zmny v tomto vydání %1"Show changes in this release of %1 MainWindownUkázat související nápovdu ve stavovém Yádku okna doleKShow context help information in the status bar at the bottom of the window MainWindow<Ukázat informace o programu %1Show information about %1 MainWindowRUkázat nebo skrýt vaechna  asová pravítkaShow or hide all time rulers MainWindowBUkázat nebo skrýt stYedovou linkuShow or hide the centre line MainWindownUkázat okénka vlastností vrstev po stran hlavního oknaUkázat  asy a základní stupniciShow times and basic scale MainWindowJUkázat  asy, názvy vrstev, a stupnici"Show times, layer names, and scale MainWindowZpomalit Slow Down MainWindow4Nynjaí tabulka samostatnSolo Current Pane MainWindowVNynjaí tabulka samostatn bhem pYehrávání%Solo the current pane during playback MainWindowPromiHte, ale typ této vrstvu nelze vyvést do RDF (podporovanými typy jsou: oblast, poznámka, text, okam~iky  asu. hodnoty  asu)qSorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) MainWindowMezerníkSpace MainWindowZrychlitSpeed Up MainWindow"Obvyklý tvar vlnyStandard Waveform MainWindowdSpustit nebo zastavit pYehrávání od nynjaí polohy0Start or stop playback from the current position MainWindowVRozdlit vybrané okam~iky na menaí  ásti...Subdivide Selected Instants... MainWindow@Rozdlit okam~iky na menaí  ástiSubdivide instants MainWindow0PYepnout na dalaí vrstvuSwitch to Next Layer MainWindow2PYepnout na dalaí tabulkuSwitch to Next Pane MainWindow8PYepnout na pYedchozí vrstvuSwitch to Previous Layer MainWindow:PYepnout na pYedchozí tabulkuSwitch to Previous Pane MainWindowTT MainWindow.Zaklepání okam~iko  asuTapping Time Instants MainWindow6Soubor s pYedlohou existujeTemplate file exists MainWindow|PYehrávání rozta~ení  asu kvoli jeho zpomalení bez zmny výakyhttp://www.sonicvisualiser.org/http://www.sonicvisualiser.org/ MainWindowfhttp://www.sonicvisualiser.org/doc/reference/%1/en/3http://www.sonicvisualiser.org/doc/reference/%1/en/ MainWindowll MainWindowoo MainWindowss MainWindow{{ MainWindow}} MainWindow (upraveno) (modified)MainWindowBase%1 (upraveno) %1 (modified)MainWindowBase %1: %2%1: %2MainWindowBase%1: %2 [%3] %1: %2 [%3]MainWindowBase¸<b>NepodaYilo se zavést RDF</b><p>Zavedení dat z dokumentu RDF na "%1" se nepodaYilo: %2</p>UFailed to import RDF

Importing data from RDF document at "%1" failed: %2

MainWindowBaseò<b>NepodaYilo se zavést RDF</b><p>Nebyly nalezeny ~ádné vhodné datové modely pro zavedení dat z dokumentu RDF na "%1"</p>dFailed to import RDF

No suitable data models found for import from RDF document at "%1"

MainWindowBaseš<b>Není dostupný ~ádný zvuk</b><p>NepodaYilo se otevYít zvukové zaYízení.</p>?No audio available

Could not open an audio device.

MainWindowBase <b>Není dostupný ~ádný zvuk</b><p>NepodaYilo se otevYít zvukové zaYízení: %1</p>?No audio available

Could not open audio device: %1

MainWindowBaseÌ<b>Není dostupný ~ádný zvuk</b><p>NepodaYilo se otevYít vámi upYednostHovaný ovlada zvuku ("%1").</p>RNo audio available

Failed to open your preferred audio driver ("%1").

MainWindowBaseÔ<b>Není dostupný ~ádný zvuk</b><p>NepodaYilo se otevYít vámi upYednostHovaný ovlada zvuku ("%1"): %2.</p>VNo audio available

Failed to open your preferred audio driver ("%1"): %2.

MainWindowBase*<p>Není dostupné ~ádné nahrávací zaYízení.</b><p>NepodaYilo se najít nebo otevYít zvukové zaYízení pro nahrávání. Bude dostupné pouze pYehrávání.</p>~No record device available

Failed to find or open an audio device for recording. Only playback will be available.

MainWindowBase„<b>Nedostatek místa na disku</b><p></p>Zdá se, ~e na disku není dostatek místa na to, aby pojalo vaechny nezbytné do asné soubory.<p> </p><p>Uvolnte, prosím, njaké místo a zkuste to znovu.</p>°Not enough disc space

There doesn't appear to be enough spare disc space to accommodate any necessary temporary files.

Please clear some space and try again.

MainWindowBaseÆ<b>Nahrávání selhalo</b><p>NepodaYilo se pYepnout do nahrávacího re~imu (njaké potí~e uvnitY?)</p>VRecording failed

Failed to switch to record mode (some internal problem?)

MainWindowBaseŒ<b>Ulo~ení se nezdaYilo</b><p>NepodaYilo se zapsat do souboru "%1": %25Save failed

Failed to write to file "%1": %2MainWindowBaseê<b>Vybrat cíl pro zavedení</b><p>Ji~ máte nahrán jeden zvukový soubor.<br>Co chcete udlat s novým zvukovým souborem?€Select a target for import

You already have an audio file loaded.
What would you like to do with the new audio file?MainWindowBase’<p>PYehrávání zvuku a nahrávání nebudou bhem tohoto sezení dostupné.</p>N

Audio playback and recording will not be available during this session.

MainWindowBasex<p>PYehrávání zvuku nebude bhem tohoto sezení dostupné.</p>@

Audio playback will not be available during this session.

MainWindowBaseô<p>Automatické zjiatní zvukového zaYízení selhalo. PYehrávání zvuku a nahrávání nebudou bhem tohoto sezení dostupné.</p>w

Automatic audio device detection failed. Audio playback and recording will not be available during this session.

MainWindowBaseÚ<p>Automatické zjiatní zvukového zaYízení selhalo. PYehrávání zvuku nebude bhem tohoto sezení dostupné.</p>i

Automatic audio device detection failed. Audio playback will not be available during this session.

MainWindowBase*PYidat polo~ku v %1 sAdd Item at %1 sMainWindowBasePYidat tabulkuAdd PaneMainWindowBasePYidat bod Add PointMainWindowBase"PYidat bod v %1 sAdd Point at %1 sMainWindowBasePPYidat soubor se zvukem do tohoto sezení"Add the audio file to this sessionMainWindowBaseDZavYít nynjaí sezení a za ít nové-Close the current session and start a new oneMainWindowBaseLNepodaYilo se otevYít zvukové zaYízeníCouldn't open audio deviceMainWindowBaseVyjmoutCutMainWindowBaseSmazat tabulku Delete PaneMainWindowBase0NepodaYilo se zavést RDFFailed to import RDFMainWindowBase6Soubor se nepodaYilo zapsatFailed to write fileMainWindowBaseZavést "%1" Import "%1"MainWindowBase.Zavést soubor MIDI "%1"Import MIDI file "%1"MainWindowBase0Zavést dokument RDF "%1"Import RDF document "%1"MainWindowBase&Zavést nahraný zvukImport Recorded AudioMainWindowBase4Zavést zvukový soubor "%1"Import audio file "%1"MainWindowBase:Zavést soubor XML vrstvy "%1"Import layer XML file "%1"MainWindowBase:Zavést soubor se sezením "%1"Import session file "%1"MainWindowBase$Zavádí se z RDF...Importing from RDF...MainWindowBaseLNení dostupné ~ádné nahrávací zaYízeníNo record device availableMainWindowBase2Nedostatek místa na diskuNot enough disc spaceMainWindowBase8OtevYít pYedlohu sezení "%1"Open session template "%1"MainWindowBaseLOtevírá se soubor nebo adresa (URL)...Opening file or URL...MainWindowBase8Otevírá se seznam skladeb...Opening playlist...MainWindowBase(Otevírá se sezení...Opening session...MainWindowBase Vlo~itPasteMainWindowBaseBPYehrává se: %1 z %2 (%3 zostává) Playing: %1 of %2 (%3 remaining)MainWindowBase"Nahrávání selhaloRecording failedMainWindowBaseNahrává se: %1 Recording: %1MainWindowBase"Odstranit tabulku Remove PaneMainWindowBase^Nahradit soubor s hlavním zvukem v tomto sezení+Replace the main audio file in this sessionMainWindowBaseDChyba pYi  tení souboru XML SV: %1SV XML file read error: %1MainWindowBase.Vybrat cíl pro zavedeníSelect target for importMainWindowBase  ModelDataTableDialogEditor dat Data EditorModelDataTableDialogData ve vrstv Data in LayerModelDataTableDialog SmazatDeleteModelDataTableDialog,Smazat vybrané polo~kyDelete Selected ItemsModelDataTableDialogHSmazat vybranou polo~ku nebo polo~ky!Delete the selected item or itemsModelDataTableDialog4Nástrojový pruh pro úpravy Edit ToolbarModelDataTableDialogHledat:Find:ModelDataTableDialog Vlo~itInsertModelDataTableDialog(Vlo~it novou polo~kuInsert New ItemModelDataTableDialog(Vlo~it novou polo~kuInsert a new itemModelDataTableDialog:Nástrojový pruh pro re~im hryPlay Mode ToolbarModelDataTableDialog<Nástrojový pruh pro pYehráváníPlayback ToolbarModelDataTableDialogHPYepnout sledování polohy pYehrávání$Toggle tracking of playback positionModelDataTableDialog PYehrávání stopyTrack PlaybackModelDataTableDialog TvorceMakerModelMetadataModel NázevNameModelMetadataModel ZdrojSourceModelMetadataModelTypTypeModelMetadataModel%1 <%2>%1 <%2>ModelTransformerFactory %1: %2%1: %2ModelTransformerFactory¶<h2>Vítejte v Sonic Visualiseru!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Sonic Visualiser je program na zobrazování a zkoumání zvukových dat pro semantický rozbor hudby a psaní poznámek.</p><p>Vyvíjen ve StYedisku pro digitální hudbu (Centre for Digital Music) na londýnské univerzit královny Marie (Queen Mary University of London), Sonic Visualiser je program s otevYeným zdrojovým kódem pod veYejnou obecnou licencí GNU (GNU General Public License).</p><p><hr></p><p><b>PYedtím ne~ budeme pokra ovat...</b></p><p>Sonic Visualiser chce po~ádat o svolení k pou~ívání sít.</p>ã

Welcome to Sonic Visualiser!

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.

Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.


Before we go on...

Sonic Visualiser would like permission to use the network.

NetworkPermissionTesterl<p><b>Nebudou odesílány ~ádné osobní informace, neprovádí se ~ádné sledování, a ~ádné údaje o jednotlivci nebudou s nikým dalaím sdíleny.</b> Nicmén budeme dlat úhrnné sou ty odlianých po~adavko pro zpravodajství o u~ití.</p><p>Doporu ujeme, abyste toto povolil, proto~e to pro vás dlá Sonic Visualiser u~ite njaím a podporuje veYejné financování této práce. Pokud si to vaak nepYejete, zruate, prosím, zaakrtnutí okénka ní~e.<br></p>°

No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else. We will however make aggregate counts of distinct requests for usage reporting.

We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.

NetworkPermissionTester4<p>Ú elem je:</p><ul><li> Najít informace o dostupných a nainstalovaných pYídavných modulech;</li><li> Xíct vám, kdy~ jsou dostupné aktualizace.</li></ul>Ž

This is to:

  • Find information about available and installed plugins; and
  • Tell you when updates are available.
NetworkPermissionTester˜<p>Ú elem je:</p><ul><li> Najít informace o dostupných a nainstalovaných pYídavných modulech;</li><li> PodpoYit pou~ívání Open Sound Control; a</li><li> Xíct vám, kdy~ jsou dostupné aktualizace.</li></ul>¾

This is to:

  • Find information about available and installed plugins;
  • Support the use of Open Sound Control; and
  • Tell you when updates are available.
NetworkPermissionTesterPovolit Allow thisNetworkPermissionTester6Vítejte v Sonic VisualiseruWelcome to Sonic VisualiserNetworkPermissionTester %1 %2%1 %2 NoteLayer%1 (%2, %3 Hz)%1 (%2, %3 Hz) NoteLayer%1 Hz (%2, %3)%1 Hz (%2, %3) NoteLayer*Automatické zarovnání Auto-Align NoteLayer&Zmnit hodnotu boduChange Point Value NoteLayer&Smazat vybrané bodyDelete Selected Points NoteLayerTáhnout bod Drag Point NoteLayerTáhnout výbrDrag Selection NoteLayerNakreslit bod Draw Point NoteLayerUpravit bod Edit Point NoteLayerVymazat bod Erase Point NoteLayerProbíhá In progress NoteLayerPYímo aréLinear NoteLayer ZápisLog NoteLayerNoty MIDI MIDI Notes NoteLayerNový bod New Point NoteLayer"}ádné místní bodyNo local points NoteLayer Vlo~itPaste NoteLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted items? NoteLayerNahrát notu Record Note NoteLayerPYemístit bodRelocate Point NoteLayer,Zmnit velikost výbruResize Selection NoteLayerStupniceScale NoteLayer"Jednotky stupnice Scale Units NoteLayer^Polo~ky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?­The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? NoteLayerX as: %1 Výaka: %2 Doba trvání: %3 `títek: %4)Time: %1 Pitch: %2 Duration: %3 Label: %4 NoteLayer\ as: %1 Výaka: %2 Doba trvání: %3 }ádný atítek(Time: %1 Pitch: %2 Duration: %3 No label NoteLayerSvislá stupniceVertical Scale NoteLayerDoba trváníDuration NoteModelUpravit data Edit Data NoteModel SnímekFrame NoteModel `títekLabel NoteModel ÚroveHLevel NoteModelNotaNote NoteModelVýaka tónuPitch NoteModel asTime NoteModelNeznámýUnknown NoteModel"Dekóduje se %1...Decoding %1...OggVorbisFileReadertKlepnte a táhnte pro navedení; dvakrát klepnte pro skok0Click and drag to navigate; double-click to jumpOverviewPYehledOverviewOverview%1 - %2%1 - %2Pane%1 / %2Hz%3 %1 / %2Hz%3Pane(R)(R)Pane(X)(X)Pane+%1+%1PaneZarovnánoAlignedPaneZarovnání: %1% Aligning: %1%PaneAlt+kole ko Alt+WheelPaneÞKlepnte a táhnte polo~ku v  inné vrstv pro její pYesun; dr~te klávesu Shift pro potla ení po áte ního odporu`Click and drag an item in the active layer to move it; hold Shift to override initial resistancePane~Klepnte a táhnte pro pYizposobení úrovn vodorovného zvtaení2Click and drag to adjust the horizontal zoom levelPanexKlepnte a táhnte pro pYizposobení úrovn svislého zvtaení0Click and drag to adjust the vertical zoom levelPaneŽKlepnte a táhnte pro pYizposobení viditelného rozsahu svislé stupnice@Click and drag to adjust the visible range of the vertical scalePane~Klepnte a táhnte pro pYesun vaech polo~ek ve vybraném rozsahu6Click and drag to move all items in the selected rangePanexKlepnte levým tla ítkem a táhnte pro pYesun hranice výbru-Click and drag to move the selection boundaryPane>Klepnte a táhnte pro navedeníClick and drag to navigatePane$Klepnte a táhnte pro výbr rozsahu; dr~te klávesu Ctrl pro provedení vícenásobného výbru; klepnte prostYedním tla ítkem a táhnte pro navedení^Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigatePane$Klepnte a táhnte pro výbr rozsahu; dr~te klávesu Ctrl pro provedení vícenásobného výbru; klepnte prostYedním tla ítkem a táhnte pro navedení_Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigatePane¢Klepnte a táhnte pro výbr rozsahu; dr~te klávesu Shift, abyste se vyhnul pYichytávání k polo~kám; dr~te klávesu Ctrl pro provedení vícenásobného výbru; klepnte prostYedním tla ítkem a táhnte pro navedení…Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigatePane¢Klepnte a táhnte pro výbr rozsahu; dr~te klávesu Shift, abyste se vyhnul pYichytávání k polo~kám; dr~te klávesu Ctrl pro provedení vícenásobného výbru; klepnte prostYedním tla ítkem a táhnte pro navedení†Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigatePane4Klepnte a táhnte pro výbr rozsahu; dr~te klávesu Shift, abyste se vyhnul pYichytávání k polo~kám; klepnte prostYedním tla ítkem a táhnte pro navedeníaClick and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigatePane¶Klepnte a táhnte pro výbr rozsahu; klepnte prostYedním tla ítkem a táhnte pro navedeníCClick and drag to select a range; middle-click and drag to navigatePane–Klepnte prostYedním tla ítkem a táhnte pro navedení s jakýmkoli nástrojem6Click middle button and drag to navigate with any toolPanebKlepnte pro pYidání nové polo~ky do  inné vrstvy+Click to add a new item in the active layerPaneXKlepnte pro vymazání polo~ky z  inné vrstvy,Click to erase an item from the active layerPaneCtrl+kole ko Ctrl+WheelPane8Dvakrát klepnte prostYednímDouble-Click MiddlePane‚Dvakrát klepnte prostYedním pro pYemístní s jakýmkoli nástrojem4Double-click middle button to relocate with any toolPaneTáhnout výbrDrag SelectionPane&Zadejte nový rozsahEnter new rangePaneP innosti provádné myaí obecn v tabulceGeneral Pane Mouse ActionsPane$Vodorovné zvtaeníHorizontal ZoomPaneNabídkaMenuPaneProstYedníMiddlePaneNavedeníNavigatePane^Nový rozsah svislého zobrazení, od %1 do %2 %4:-New vertical display range, from %1 to %2 %4:Pane Odkaz ReferencePanePYemístitRelocatePanežNastavit znovu úrovn vodorovného a svislého zvtaení na jejich výchozí hodnoty;Reset horizontal and vertical zoom levels to their defaultsPaneDNastavit zvtaení znovu na výchozíReset zoom to defaultPane,Zmnit velikost výbruResize SelectionPane PravéRightPaneProjí~dtScrollPane Projí~dt svisleScroll VerticallyPane`Projí~dt rychle vlevo nebo vpravo na  asové ose)Scroll rapidly left or right in time axisPanePProjí~dt nahoru nebo dolo na svislé ose&Scroll up or down in the vertical axisPaneShift+kole ko Shift+WheelPaneJUkázat nabídku související s tabulkouShow pane context menuPane.PYília dlouhá pYedpona:Some lengthy prefix:PaneNezarovnáno UnalignedPaneSvislé zvtaení Vertical ZoomPaneKole koWheelPaneKole ko dolo Wheel DownPaneKole ko nahoruWheel UpPaneZvtaeníZoomPanePYiblí~itZoom InPaneOddálitZoom OutPane0PYiblí~it/Oddálit svisleZoom VerticallyPaneHPYiblí~it nebo oddálit na svislé ose#Zoom in or out in the vertical axisPaneHPYiblí~it nebo oddálit na  asové oseZoom in or out in time axisPane8Upravit parametry pYehráváníAdjust Playback ParametersPlayParameterRepository4Zmnit zesílení pYehráváníChange Playback GainPlayParameterRepository>Zmnit stav ztlumení pYehráváníChange Playback Mute StatePlayParameterRepository4Zmnit vyvá~ení pYehráváníChange Playback PanPlayParameterRepository0Zmnit vzorek pYehráváníChange Playback SamplePlayParameterRepositoryProgramProgramPluginParameterBoxlTento pYídavný modul nemá ~ádné upravitelné parametry.)This plugin has no adjustable parameters.PluginParameterBoxPokro ilé << Advanced <<PluginParameterDialogPokro ilé >> Advanced >>PluginParameterDialog*Snímko zvuku na blok:Audio frames per block:PluginParameterDialog"Nesoulad v kanáluChannel mismatchPluginParameterDialog KanályChannelsPluginParameterDialog"Autorské právo:  Copyright: PluginParameterDialog Vstupní materiálInput MaterialPluginParameterDialogTvorce:Maker:PluginParameterDialog Název:Name:PluginParameterDialogVýstup:Output:PluginParameterDialog6Parametry pYídavného moduluPlugin ParametersPluginParameterDialogZpracování ProcessingPluginParameterDialog.Omezit na rozsah výbruRestrict to selection extentsPluginParameterDialogØTento pYídavný modul nepYijímá více ne~ %1 vstupní kanály, ale dostupné jsou %2. Pou~ije se pouze první %3. kThis plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. PluginParameterDialogŠTento pYídavný modul má jednokanálový vstup, ale zdroj má %1 kanály. LThis plugin only has a single channel input, but the source has %1 channels.PluginParameterDialogTento pYídavný modul vy~aduje alespoH %1 vstupních kanálo, ale dostupné jsou pouze %2 %3. PYídavný modul pravdpodobn nebude pracovat správn.xThis plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly.PluginParameterDialog*Pou~ít pouze kanál %1Use channel %1 onlyPluginParameterDialogDPou~ít promr ze zdrojových kanáloUse mean of source channelsPluginParameterDialog Verze:Version:PluginParameterDialogPYírostek okna:Window increment:PluginParameterDialogPodoba okna: Window shape:PluginParameterDialogVelikost okna: Window size:PluginParameterDialogjsouarePluginParameterDialogjeisPluginParameterDialog424 snímko za sekundu (FPS)24 FPS Preferences425 snímko za sekundu (FPS)25 FPS Preferences430 snímko za sekundu (FPS)30 FPS Preferences"4 x pYevzorkování4 x Oversampling Preferences>4 x pYevzorkování s interpolací#4 x Oversampling with interpolation Preferences450 snímko za sekundu (FPS)50 FPS Preferences460 snímko za sekundu (FPS)60 FPS Preferences8UpYednostHovaná barva pozadíBackground colour preference PreferencesBlackmanBlackman PreferencesBlackman-HarrisBlackman-Harris Preferences2C0 - stYed rozsahu oktávyC0 - middle of octave scale PreferencesPC3 - obecná zvyklost pro sekvencer MIDI%C3 - common MIDI sequencer convention Preferences4C4 - americký standard ASAC4 - ASA American standard PreferencesXC5 - pou~íváno v programu Cakewalk a dalaích C5 - used in Cakewalk and others PreferencesTmavé pozadíDark background PreferencesNejrychlejaíFastest Preferences,Dr~et se námtu plochyFollow desktop theme PreferencesDVelikost písma pro pYekrytí textemFont size for text overlays Preferences,Kmito et koncertního AFrequency of concert A Preferences GaussGaussian PreferencesHammingHamming PreferencesHannHann PreferencesDVysoké rozliaení (na mikrosekundy) High resolution (to microsecond) Preferences Nejvyaaí kvalitaHighest quality PreferencesROpatYit atítkem jedno árkované C (C1, C')Label middle C as PreferencesSvtlé pozadíLight background Preferences*PYímo ará interpolaceLinear interpolation PreferencesNNahrát soubory MP v bezmezerovém re~imuLoad mp3 files in gapless mode PreferencesLUmístní adresáYe s vyrovnávací pamtí!Location for cache file directory Preferences }ádnáNone PreferencestNormalizovat zvukový signál pYi  tení ze zvukového souboru3Normalise audio signal when reading from audio file PreferencesNuttallNuttall PreferencesnVynechat do asné z nabídky naposledy otevYených souboro'Omit temporaries from Recent Files menu Preferences ParzenParzen Preferences8Typ pYevzorkování pYehráváníPlayback resampler type PreferencesNastavení Preferences Preferences6Rozvr~ení okénka vlastnostíProperty box layout PreferencesObdélníková Rectangular Preferences`PYevzorkovat neodpovídající soubory pYi zavedení$Resample mismatching files on import PreferencesNUkázat okénko pouze pro nynjaí tabulkuShow box for current pane only PreferencesBUkázat okénka pro vaechny tabulkyShow boxes for all panes PreferencesHUkázat úvodní obrazovku pYi spuatníShow splash screen on startup Preferences~Jeden pevný vzorkovací kmito et pro pYevzorkování vaech souboro1Single fixed sample rate to resample all files to Preferences<Podoba okna pro rozbor spektraSpectral analysis window shape Preferences>Interpolace osy x spektrogramu:!Spectrogram x-axis interpolation: Preferences>Interpolace osy y spektrogramu:!Spectrogram y-axis interpolation: PreferencesObvykléStandard Preferences0Obvyklý (na milisekundy)Standard (to millisecond) Preferences.PYesnost zobrazení  asuTime display precision PreferencesTrojúhelníková Triangular PreferencesFPou~ít formát hodiny:minuty:sekundy Use hours:minutes:seconds format Preferences%1:%1:PreferencesDialogVz&hled &AppearancePreferencesDialog &Jiné&OtherPreferencesDialogdPou~ít "%1" v nabídce Soubor pro pYidání k tmto.),(Use "%1" in the File menu to add to these.)PreferencesDialog (auto)(auto)PreferencesDialog2<b>Znovuspuatní vy~adováno</b><p>Jedno nebo více nastavení programu, které jste zmnil, se nebude moci pln projevit do doby, ne~ bude Sonic Visualiser spuatn znovu.</p><p>Ukon ete, prosím, program nyní a spusete jej znovu, pokud chcete, aby se tyto zmny projevily okam~it.</p>ÿRestart required

One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.

Please exit and restart the application now if you want these changes to take effect immediately.

PreferencesDialog$<domovský adresáY>PreferencesDialog&Vstup/Výstup &zvuku A&udio I/OPreferencesDialog,Povolit pou~ívání sítAllow network usagePreferencesDialog&Americká angli tinaAmerican EnglishPreferencesDialog&Rozbor Anal&ysisPreferencesDialog Pou~ítApplyPreferencesDialog<ZaYízení pro pYehrávání zvuku:Audio playback device:PreferencesDialog:ZaYízení pro nahrávání zvuku:Audio record device:PreferencesDialogZvuková slu~ba:Audio service:PreferencesDialog$Britská angli tinaBritish EnglishPreferencesDialog ZruaitCancelPreferencesDialog eatinaCzechPreferencesDialog^Výchozí barva barevného trojrozmrného nákresu:Default colour 3D plot colour:PreferencesDialogNVýchozí barva melodického spektrogramu:#Default melodic spectrogram colour:PreferencesDialogpVýchozí pYedloha sezení pYi nahrávání zvukových souboro:2Default session template when loading audio files:PreferencesDialog6Výchozí barva spektrogramu:Default spectrogram colour:PreferencesDialogDKreslit vrstvy v rozliaení Retina:!Draw layers at Retina resolution:PreferencesDialog<Vyvést sezení jako pYedlohu...Export Session as Template...PreferencesDialog(Pou~ít jazyk systémuFollow system localePreferencesDialog ZelenáGreenPreferencesDialogOKOKPreferencesDialog4Barva tvaru vlny pYehledu:Overview waveform colour:PreferencesDialogNastavení PreferencesPreferencesDialog"Nastavení zmnnaPreferences ChangedPreferencesDialogfSpustit pYídavné moduly Vamp v samostatném procesu:%Run Vamp plugins in separate process:PreferencesDialogRuatinaRussianPreferencesDialogˆVyberte adresáY pro vytvoYení podadresáYe s vyrovnávací pamtí v nm2Select a directory to create cache subdirectory inPreferencesDialog &PYedloha sezeníSession &TemplatePreferencesDialog˜Nkterá nastavení byla zmnna, ale nebyla pou~ita. Pou~ít je pYed zavYením?NSome preferences have been changed but not applied. Apply them before closing?PreferencesDialogHSonic Visualiser: Nastavení programu)Sonic Visualiser: Application PreferencesPreferencesDialog"Obvyklý tvar vlnyStandard WaveformPreferencesDialog8Jazyk u~ivatelského rozhraníUser interface languagePreferencesDialog ZruaitCancelProgressDialog0 (nynjaí hodnota: %1%2) (current value: %1%2) PropertyBox, (nynjaí hodnota: %1) (current value: %1) PropertyBox2Upravit %1 vlastnost %2%3Adjust %1 property of %2%3 PropertyBoxVPYizposobit úroveH pYehrávání a vyvá~ení %1#Adjust playback level and pan of %1 PropertyBox`Zmnit zvuk pou~ívaný pro pYehrávání (nyní "%1")/Change sound used for playback (currently "%1") PropertyBox@Klepnout pro pYepnutí pYehráváníClick to toggle playback PropertyBox4Nastavit zábr pYehrávání:Set playback clip: PropertyBox UkázatShow PropertyBox0PYepnout %1 vlastnost %2Toggle %1 property of %2 PropertyBox,PYepnout pYehrávání %1Toggle Playback of %1 PropertyBox.PYepnout viditelnost %1Toggle Visibility of %1 PropertyBox*Nastavit %1 vlastnostSet %1 PropertyPropertyContainerNepravdivýfalsePropertyContainerNenoPropertyContainerVypnutooffPropertyContainerZapnutoonPropertyContainerPravdivýtruePropertyContainerAnoyesPropertyContainer2Zmnit viditelnost vrstvyChange Layer Visibility PropertyStackNKlepnte pro zmnu nynjaí  inné vrstvy(Click to change the current active layer PropertyStackB Sonic Visualiser je programem ur eným pro prohlí~ení a zkoumání zvukových dat, pro významový hudební rozbor a pYipojování poznámek. Pou~ití: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Nepokouaet se otevYít zaYízení pro výstup zvuku --no-osc: Neposkytovat pYípojku Open Sound Control pro dálkové ovládání <file>: Lze poskytnout jeden nebo více souboro Sonic Visualiser (.sv) a zvukových souboro. w Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [ ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control : One or more Sonic Visualiser (.sv) and audio files may be provided.  QApplicationHSonic Visualiser - ZnázorHova zvukuSonic Visualiser QApplicationBSoubor "%1" se nepodaYilo otevYítFailed to open file "%1"QFile,Soubor "%1" neexistujeFile "%1" does not existQFiledSoubor nebo adresu (URL) "%1" se nepodaYilo získat'File or URL "%1" could not be retrievedQFileÌ<b>Vy~adován zvuk</b><p>PYed zavedením dat s poznámkami nahrajte, prosím, alespoH jeden zvukový soubor\Audio required

Please load at least one audio file before importing annotation data QMessageBox8Soubor se nepodaYilo otevYítFailed to open file QMessageBoxfSoubor nebo adresu (URL) "%1" se nepodaYilo otevYít$File or URL "%1" could not be opened QMessageBox<b>Neprohledáno na pYídavné moduly</b><p>Podle vaeho nedoalo k ~ádnému pokusu o prohledání na pYídavné moduly (vnitYní chyba?)</p>dDid not scan for plugins

Apparently no scan for plugins was attempted (internal error?)

QObjectè<b>NepodaYilo se nahrát pYídavné moduly</b><p>NepodaYilo se nahrát jednu nebo více knihoven s pYídavnými moduly:</p>PFailed to load plugins

Failed to load one or more plugin libraries:

QObject’<b>NepodaYilo se prohledat na pYídavné moduly</b><p>PYi spuatní se nepodaYilo provést vyhledání pYídavných modulo. Je mo~né, ~e kontrolor pYídavných modulo nebyl zároveH s %1 správn nainstalován?</p>œFailed to scan for plugins

Failed to scan for plugins at startup. Possibly the plugin checker program was not correctly installed alongside %1?

QObjectÐ<p>Tyto pYídavné moduly se nemusí slu ovat se systémem, a budou bhem tohoto spuatní %1 pYehlí~eny.</p>d

These plugins may be incompatible with the system, and will be ignored during this run of %1.

QObject<neznámý> QObjectPruhovanýBandedQObject erná na bíléBlack on WhiteQObjectTYeaHová barvaCherryQObjecttNepodaYilo se spustit vnjaího hostitele pYídavného modulu$Could not start external plugin hostQObject°Zdá se, ~e není nainstalován spustitelný soubor pro vnjaího hostitele pYídavného modulu?External plugin host executable does not appear to be installedQObject¸Vnjaí hostitel pYídavného modulu byl bhem vypisování pYídavných modulo neo ekávan ukon en>External plugin host exited unexpectedly while listing pluginsQObject|NepodaYilo se vyvolat vnjaího hostitele pYídavného modulu: %1*External plugin host invocation failed: %1QObjectOvocný salát Fruit SaladQObject ZelenáGreenQObjectZesílení výaek High GainQObjectZvýraznní HighlightQObjectLedIceQObjectTiskárnaPrinterQObjectZápad slunceSunsetQObjectVosaWaspQObjectBílá na  ernéWhite on BlackQObjectDZavádí se zvuk odkazovaný v RDF...$Importing audio referenced in RDF... RDFImporterhZavádí se signálová data s vysokou hustotou z RDF...'Importing dense signal data from RDF... RDFImporter@Zavádí se data událostí z RDF... Importing event data from RDF... RDFImporter do  to RangeInputDialogFRozsahov shrnutelná  asová hodnotaRange-Summarisable Time-ValueRangeSummarisableTimeValueModelSoubor Wave Wave FileReadOnlyWaveFileModel %1 %2%1 %2 RegionLayer*Automatické zarovnání Auto-Align RegionLayer Úse kyBars RegionLayer&Zmnit hodnotu boduChange Point Value RegionLayer&Smazat vybrané bodyDelete Selected Points RegionLayerTáhnout oblast Drag Region RegionLayerTáhnout výbrDrag Selection RegionLayer Nakreslit oblast Draw Region RegionLayerUpravit oblast Edit Region RegionLayer&Vyrovnan rozlo~ené Equal Spaced RegionLayerVymazat oblast Erase Region RegionLayerProbíhá In progress RegionLayerPYímo arýLinear RegionLayer ZápisLog RegionLayerNová oblast New Region RegionLayer"}ádné místní bodyNo local points RegionLayer Vlo~itPaste RegionLayerTyp nákresu Plot Type RegionLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted items? RegionLayer PYemístit oblastRelocate Region RegionLayer,Zmnit velikost výbruResize Selection RegionLayerStupniceScale RegionLayer"Jednotky stupnice Scale Units RegionLayerRoz lenní Segmentation RegionLayer^Polo~ky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?­The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? RegionLayer\ as: %1 Hodnota: %2 Doba trvání: %3 `títek: %4)Time: %1 Value: %2 Duration: %3 Label: %4 RegionLayer` as: %1 Hodnota: %2 Doba trvání: %3 }ádný atítek(Time: %1 Value: %2 Duration: %3 No label RegionLayerSvislá stupniceVertical Scale RegionLayerDoba trváníDuration RegionModelUpravit data Edit Data RegionModel SnímekFrame RegionModel `títekLabel RegionModel OblastRegion RegionModel asTime RegionModelNeznámýUnknown RegionModelHodnotaValue RegionModel Smazat %1 vrstvuDelete %1 LayerRemoveLayerCommand2(odvozený model v SV-XML)(derived model in SV-XML) SVFileReaderLOtevírá se soubor nebo adresa (URL)...Opening file or URL... SVFileReader<neznámý> SingleColourLayer BarvaColourSingleColourLayer%1 - %2%1 - %2 SliceLayer-Inf-Inf SliceLayer0dB0dB SliceLayerNaprostýAbsolute SliceLayerJakýkoliAny SliceLayerStupnice koae Bin Scale SliceLayerKoaeBins SliceLayer BlokyBlocks SliceLayer BarvyColours SliceLayer PrvníFirst SliceLayerZesíleníGain SliceLayerPYímo arýLinear SliceLayer áryLines SliceLayer ZápisLog SliceLayer PromrMean SliceLayer MYi Meter SliceLayerNormalizovat Normalize SliceLayer VrcholPeak SliceLayerTyp nákresu Plot Type SliceLayerRev LogRev Log SliceLayer Re~im vzorkování Sampling Mode SliceLayerStupniceScale SliceLayer KrokySteps SliceLayerPráh Threshold SliceLayerF as: %1 - %2 Rozsah: %3 vzorky (%4)$Time: %1 - %2 Range: %3 samples (%4) SliceLayert as: %1 - %2 Rozsah: %3 vzorky (%4) Koa: %5 %6 hodnota: %79Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 SliceLayerdBdB SliceLayerx10x10 SliceLayer"Smazat datový bodDelete Data Point SparseModelUpravit data Edit Data SparseModel"Vlo~it datový bodInsert Data Point SparseModel XídkýSparse SparseModelPYidat bod Add PointSparseModel::AddPointCommandSmazat bod Delete PointSparseModel::DeletePointCommand2OpatYit bod znovu atítkemRe-Label PointSparseModel::RelabelCommandUpravit data Edit DataSparseOneDimensionalModel SnímekFrameSparseOneDimensionalModel `títekLabelSparseOneDimensionalModelXídký 1-D Sparse 1-DSparseOneDimensionalModel asTimeSparseOneDimensionalModelNeznámýUnknownSparseOneDimensionalModelUpravit data Edit DataSparseTimeValueModel SnímekFrameSparseTimeValueModel `títekLabelSparseTimeValueModel$Xídká hodnota  asuSparse Time-ValueSparseTimeValueModel asTimeSparseTimeValueModelNeznámýUnknownSparseTimeValueModelHodnotaValueSparseTimeValueModelXídká hodnota Sparse ValueSparseValueModel Fáze: %1 Phase: %1SpectrogramLayer Fáze: %1 - %2 Phase: %1 - %2SpectrogramLayerd%1Kmito et koae: %2 - %3 Hz %4Výaka koae: %5 - %6 1%1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 SpectrogramLayerP%1Kmito et koae: %2 Hz %3Výaka koae: %4 '%1Bin Frequency: %2 Hz %3Bin Pitch: %4 SpectrogramLayer%1Hz%1HzSpectrogramLayerÿÿÿÿ1 KHzSpectrogramLayerÿÿÿÿ1.5 KHzSpectrogramLayerÿÿÿÿ10 HzSpectrogramLayerÿÿÿÿ10 KHzSpectrogramLayerÿÿÿÿ100 HzSpectrogramLayerÿÿÿÿ12 KHzSpectrogramLayerÿÿÿÿ16 KHzSpectrogramLayerÿÿÿÿ2 KHzSpectrogramLayerÿÿÿÿ20 HzSpectrogramLayerÿÿÿÿ25 %SpectrogramLayerÿÿÿÿ250 HzSpectrogramLayerÿÿÿÿ4 KHzSpectrogramLayerÿÿÿÿ40 HzSpectrogramLayerÿÿÿÿ43HzSpectrogramLayerÿÿÿÿ50 %SpectrogramLayerÿÿÿÿ500 HzSpectrogramLayerÿÿÿÿ6 KHzSpectrogramLayerÿÿÿÿ75 %SpectrogramLayerÿÿÿÿ8 KHzSpectrogramLayerÿÿÿÿ87.5 %SpectrogramLayerÿÿÿÿ93.75 %SpectrogramLayer<neznámý> SpectrogramLayerVaechny koaeAll BinsSpectrogramLayerZobrazení koae Bin DisplaySpectrogramLayerKoaeBinsSpectrogramLayer BarvaColSpectrogramLayer BarvaColourSpectrogramLayerOtá ení barevColour RotationSpectrogramLayerStupnice barev Colour ScaleSpectrogramLayer:FFT vyrovnávací pame selhalaFFT cache failedSpectrogramLayerNepodaYilo se vytvoYit model FFT pro tento spektrogram. Dovodem pro to mo~e být nedostatek pamti, nebo nedostatek místa na disku.pFailed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue.SpectrogramLayerKmito ty FrequenciesSpectrogramLayer&Kmito tová stupniceFrequency ScaleSpectrogramLayerZesíleníGainSpectrogramLayerSmíaenýHybridSpectrogramLayerPYímo arýLinearSpectrogramLayer ZápisLogSpectrogramLayer"Nejvtaí kmito et Max FrequencySpectrogramLayer MYi MeterSpectrogramLayer"Nejmenaí kmito et Min FrequencySpectrogramLayer}ádné maximumNo maxSpectrogramLayer}ádné minimumNo minSpectrogramLayer }ádnáNoneSpectrogramLayerNormalizace NormalizationSpectrogramLayerKoae vrcholo Peak BinsSpectrogramLayer<Nejvyaaí kmito et: %1 - %2 Hz Peak Frequency: %1 - %2 Hz SpectrogramLayer2Nejvyaaí kmito et: %1 Hz Peak Frequency: %1 Hz SpectrogramLayer&Nejvyaaí výaka: %2 Peak Pitch: %2 SpectrogramLayer0Nejvyaaí výaka: %3 - %4 Peak Pitch: %3 - %4 SpectrogramLayerFázePhaseSpectrogramLayerStupniceScaleSpectrogramLayerPráh ThresholdSpectrogramLayer as: %1  Time: %1 SpectrogramLayer as: %1 - %2 Time: %1 - %2 SpectrogramLayer PohledViewSpectrogramLayerOknoWindowSpectrogramLayerPYekrytí oknaWindow OverlapSpectrogramLayerVelikost okna Window SizeSpectrogramLayerdBdBSpectrogramLayer dB: %1dB: %1SpectrogramLayerdB: %1 - %2 dB: %1 - %2SpectrogramLayerdBVdBVSpectrogramLayer dBV^2dBV^2SpectrogramLayer%1%1 SpectrumLayerJ%1 Koa: %2 (%3) %4 hodnota: %5 dB: %6#%1 Bin: %2 (%3) %4 value: %5 dB: %6 SpectrumLayerD%1 Koa: %2 (%3) Hodnota: %4 dB: %5 %1 Bin: %2 (%3) Value: %4 dB: %5 SpectrumLayer%1 - %2%1 - %2 SpectrumLayerÿÿÿÿ %1 - %2 Hz SpectrumLayer %1 Hz%1 Hz SpectrumLayerÿÿÿÿ25 % SpectrumLayerÿÿÿÿ50 % SpectrumLayerÿÿÿÿ75 % SpectrumLayerÿÿÿÿ87.5 % SpectrumLayerÿÿÿÿ93.75 % SpectrumLayerKoaeBins SpectrumLayer PrvníFirst SpectrumLayer PromrMean SpectrumLayer }ádnýNone SpectrumLayer VrcholPeak SpectrumLayer0Ukázat nejvyaaí kmito tyShow Peak Frequencies SpectrumLayerOknoWindow SpectrumLayerPYekrytí oknaWindow Overlap SpectrumLayerVelikost okna Window Size SpectrumLayer%1 - %2%1 - %2SubdividingMenuNe, dkuji No, thanksSurveyer2Ano! Vezmi m do prozkumuYes! Take me to the surveySurveyer<~ádný text>  TextLayerSmazat výbrDelete Selection TextLayerTáhnout atítek Drag Label TextLayerTáhnout výbrDrag Selection TextLayerPrázdný atítek Empty Label TextLayerZadat atítek Enter label TextLayerVymazat bod Erase Point TextLayerProbíhá In progress TextLayer PYesunout atítek Move Label TextLayer4PYesunout atítek vodorovnMove Label Horizontally TextLayer.PYesunout atítek svisleMove Label Vertically TextLayerNový bod New Point TextLayer Vlo~itPaste TextLayer:Zadejte, prosím, nový atítek:Please enter a new label: TextLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted items? TextLayer,Zmnit velikost výbruResize Selection TextLayer^Polo~ky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?­The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? TextLayer8 as: %1 Výaka: %2 `títek: %3Time: %1 Height: %2 Label: %3 TextLayerUpravit data Edit Data TextModel SnímekFrame TextModel VýakaHeight TextModel `títekLabel TextModelTextText TextModel asTime TextModelNeznámýUnknown TextModel%1: %2%3%1: %2%3 Thumbwheel%2%3%2%3 ThumbwheelHZadejte novou hodnotu od %1do %2 %3:#Enter a new value from %1 to %2 %3: ThumbwheelDZadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2: Thumbwheel&Zadat novou hodnotuEnter new value ThumbwheelHNová hodnota pro %1, od %2 do %3 %4:#New value for %1, from %2 to %3 %4: ThumbwheelBNová hodnota pro %1, od %2 do %3: New value for %1, from %2 to %3: Thumbwheel"PYidat bod v %1 sAdd Point at %1 sTimeInstantLayerSmazat výbrDelete SelectionTimeInstantLayerNakreslit bod Drag PointTimeInstantLayerTáhnout výbrDrag SelectionTimeInstantLayerNakreslit bod Draw PointTimeInstantLayerUpravit bod Edit PointTimeInstantLayerVymazat bod Erase PointTimeInstantLayerProbíhá In progressTimeInstantLayerOkam~ikyInstantsTimeInstantLayer*PYesunout bod na %1 sMove Point to %1 sTimeInstantLayerNový bod New PointTimeInstantLayer"}ádné místní bodyNo local pointsTimeInstantLayer Vlo~itPasteTimeInstantLayerTyp nákresu Plot TypeTimeInstantLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted instants?TimeInstantLayer,Zmnit velikost výbruResize SelectionTimeInstantLayerRoz lenní SegmentationTimeInstantLayer`Okam~iky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?°The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?TimeInstantLayer$ as: %1 `títek: %2Time: %1 Label: %2TimeInstantLayer( as: %1 }ádný atítekTime: %1 No labelTimeInstantLayer%1%1TimeValueLayer %1 %2%1 %2TimeValueLayer%1 Hz (%2, %3)%1 Hz (%2, %3)TimeValueLayerv+/-1TimeValueLayer*Automatické zarovnání Auto-AlignTimeValueLayer&Zmnit hodnotu boduChange Point ValueTimeValueLayer,Vybrat výpo et hodnotyChoose value calculationTimeValueLayerSpojené bodyConnected PointsTimeValueLayer KYivkaCurveTimeValueLayerVelikost cyklu: Cycle size:TimeValueLayer&Smazat vybrané bodyDelete Selected PointsTimeValueLayer"Samostatné kYivkyDiscrete CurvesTimeValueLayerTáhnout bod Drag PointTimeValueLayerTáhnout výbrDrag SelectionTimeValueLayerNakreslit bod Draw PointTimeValueLayer<Kreslit  áry rozdlující  ástiDraw Segment Division LinesTimeValueLayerUpravit bod Edit PointTimeValueLayerVymazat bod Erase PointTimeValueLayerProbíhá In progressTimeValueLayerPYímo aréLinearTimeValueLayer áryLinesTimeValueLayer ZápisLogTimeValueLayerNový bod New PointTimeValueLayer"}ádné místní bodyNo local pointsTimeValueLayer Vlo~itPasteTimeValueLayerTyp nákresu Plot TypeTimeValueLayerBodyPointsTimeValueLayer>Zarovnat vlo~ené polo~ky znovu?Re-align pasted items?TimeValueLayerPYemístit bodRelocate PointTimeValueLayer,Zmnit velikost výbruResize SelectionTimeValueLayerStupniceScaleTimeValueLayer"Jednotky stupnice Scale UnitsTimeValueLayerRoz lenní SegmentationTimeValueLayer*Vybrat velikost cykluSelect cycle sizeTimeValueLayer"Ukázat odvozeninuShow DerivativeTimeValueLayer¾Nkteré z polo~ek, které vkládáte, nemají hodnoty. Jaké hodnoty chcete pro tyto polo~ky pou~ít?eSome of the items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer StopkyStemsTimeValueLayer^Polo~ky, které vkládáte, pYialy z vrstvy s odlianým zdrojovým materiálem, ne~ má tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu?­The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?TimeValueLayerªPolo~ky, které vkládáte, nemají hodnoty. Jaké hodnoty chcete pro tyto polo~ky pou~ít?]The items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer< as: %1 Hodnota: %2 `títek: %4Time: %1 Value: %2 Label: %4TimeValueLayer@ as: %1 Hodnota: %2 }ádný atítekTime: %1 Value: %2 No labelTimeValueLayerSvislá stupniceVertical ScaleTimeValueLayer0Nula pro vaechny polo~kyZero for all itemsTimeValueLayer<< PYedchozí << Previous TipDialog ZavYítClose TipDialogDalaí >>Next >> TipDialog0Ukázat radu pYi spuatníShow tip on startup TipDialog"Rada na tento denTip of the Day TipDialog [\(<].*$ [\(<].*$TransformFactoryh%1 pou~ívá "%2" výstup "%3" pYídavného modulu (z %4)-%1 using "%2" output of "%3" plugin (from %4)TransformFactoryJ%1 pou~ívá "%2" pYídavný modul (z %3)%1 using "%2" plugin (from %3)TransformFactory %1: %2%1: %2TransformFactory%1: Výstup %2 %1: Output %2TransformFactory <neznámý tvorce>TransformFactory RozborAnalysisTransformFactorySkupinaCategoryTransformFactory Popis DescriptionTransformFactory EfektyEffectsTransformFactoryEfektová data Effects DataTransformFactoryŽVytáhnout "%1" datový výstup z "%2" efektového pYídavného modulu (z %3):Extract "%1" data output from "%2" effect plugin (from %3)TransformFactoryŠVytáhnout datový výstup %1 z "%2" efektového pYídavného modulu (z %3)8Extract data output %1 from "%2" effect plugin (from %3)TransformFactory„Vytáhnout funkce pomocí "%1" výstupu "%2" pYídavného modulu (z %3);Extract features using "%1" output of "%2" plugin (from %3)TransformFactoryjVytáhnout funkce pomocí "%1" pYídavného modulu (z %2),Extract features using "%1" plugin (from %2)TransformFactoryZNepodaYilo se vypsat pYídavné moduly Vamp: %1Failed to list Vamp plugins: %1TransformFactory–VytvoYit zvukový signál za pou~ití "%1" efektového pYídavného modulu (z %2)1Generate audio signal using "%1" plugin (from %2)TransformFactory Tvorce GeneratorTransformFactory TvorceMakerTransformFactory NázevNameTransformFactoryJinýOtherTransformFactory,Druh pYídavného modulu Plugin typeTransformFactory.Systémový identifikátorSystem IdentifierTransformFactory‚Promnit zvukový signál s "%1" efektovým pYídavným modulem (z %2)8Transform audio signal with "%1" effect plugin (from %2)TransformFactoryjednotkyUnitsTransformFactory%1%2<br><small>%1%2
TransformFinder</small>TransformFinder<b>%1</b>%2<br>%1%2
TransformFindern<b>Nyní nejsou nainstalovány ~ádné pYídavné moduly!</b>*No plugins are currently installed!TransformFinderl<b>ZveYejnné popisy se ze sít získat nepodaYilo!</b>>Unable to retrieve published descriptions from network!TransformFinderv<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Skupina: %1<
      — Category: %1TransformFinderÔ<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Více informací naleznete na stránkách: <a href="%1">%1</a>U
      — More information: %1TransformFinder’<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Typ pYídavného modulu: %1?
      — Plugin type: %1TransformFinder–<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Systémový identifikátor: %1E
      — System identifier: %1TransformFinder\<br>&nbsp;&nbsp;Nebyly nalezeny ~ádné výsledky
  No results foundTransformFinder0<i> (nenainstalován)</i> (not installed)TransformFinder <p>%1<br>%2<br>Je mo~né, ~e síeové spojení vypadlo, nebo slu~by odpovídají pYília pomalu.<br>Nebudou dostupné ~ádné výsledky hledání.…

%1
%2
Perhaps the network connection is down, or services are responding too slowly.
No search results will be available.TransformFinderÈ<p>%1<br>Budou se prohledávat pouze zveYejnné popisy funk ních vytahovacích pYídavných modulo Vamp.]

%1
Only the published descriptions of Vamp feature extraction plugins will be searched.TransformFinder|<p>%1<br>Je mo~né, ~e síeové spojení vypadlo, slu~by odpovídají pYília pomalu, nebo se vyskytly potí~e se zpracováním.<br>Budou se prohledávat pouze popisy nainstalovaných pYídavných modulo.º

%1
Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.
Only the descriptions of installed plugins will be searched.TransformFinder–<p>Napiate do okénka pro hledání njaký text pro hledání popiso:<ul><li>Vaech nyní nainstalovaných <a href="http://www.vamp-plugins.org/">Vamp</a> zvukových funk ních vytahovacích pYídavných modulo</li><li>Vaech nyní nainstalovaných <a href="http://www.ladspa.org/">LADSPA</a> zvukových efektových pYídavných modulo</li><li>Vamp pYídavných modulo, které nyní nainstalovány nejsou, ale mají svoj popis zvYejnný prostYednictvím významového internetu</li></ul>

Type some text into the search box to search the descriptions of:

  • All currently installed Vamp audio feature extraction plugins
  • All currently installed LADSPA audio effects plugins
  • Vamp plugins that are not currently installed but that have descriptions published via the semantic web
TransformFinder</small>TransformFinder"<small>%1</small>%1TransformFinderDoloDownTransformFinderNajít promnuFind a TransformTransformFinderHledat:Find:TransformFinderPNalezen jeden popis obsahující <b>%1</b>NNalezeny %n popisy obsahující <b>%1</b>RNalezeno %n popiso obsahujících <b>%1</b>,Found %n description(s) containing %1TransformFinder†Nalezen jeden popis obsahující <b>%1</b>, ukazují se pouze první %2„Nalezeny %n popisy obsahující <b>%1</b>, ukazují se pouze první %2ˆNalezeno %n popiso obsahujících <b>%1</b>, ukazují se pouze první %2GFound %n description(s) containing %1, showing the first %2 onlyTransformFinder NahoruUpTransformFinder cento cents UnitConverter++ UnitConverter== UnitConverter(Perioda (doba) rytmu Beat period UnitConverterXV 12-tónovém rovnomrn temperovaném ladní:In 12-tone Equal Temperament: UnitConverterVýaka tónu MIDI MIDI pitch UnitConverter®Mjte na pamti, ~e v protokolu MIDI jsou platnými pouze výaky tóno v rozsahu 0 a~ 127.LNote that only pitches in the range 0 to 127 are valid in the MIDI protocol. UnitConverterNota klavíru Piano note UnitConverterVýaka tónuPitch UnitConverter TempoTempo UnitConverterS kmito tem koncertního ladní A na %1 Hz a jedno árkovaným C spo ívajícím v oktáv %2. (To vae lze zmnit v nastavení programu.)„With concert-A tuning frequency at %1 Hz, and middle C residing in octave %2. (These can be changed in the application preferences.) UnitConverternaat UnitConverterv oktáv in octave UnitConverter<neznámý> ViewZarovnání AlignmentView ZruaitCancelView*Vyvedený obrázek z %1Exported image from %1View&Sledovat pYehráváníFollow PlaybackView$Celkové projí~dní Global ScrollView Celkové zvtaení Global ZoomView.Chyba pYi dlání vrstvyLayer rendering errorViewVypnutoOffView StranaPageView$Dlá se obrázek...Rendering image...ViewProjí~dtScrollViewR eká se na vrstvy, a~ budou pYipraveny...!Waiting for layers to be ready...View,Zmnit úroveH pYekrytíChange overlay level ViewManager Vyprázdnit výbrClear Selection ViewManager6Vstoupit do re~imu kresleníEnter Draw mode ViewManager0Vstoupit do re~imu úpravEnter Edit mode ViewManager2Vstoupit do re~imu mazáníEnter Erase mode ViewManager2Vstoupit do re~imu mYeníEnter Measure mode ViewManager6Vstoupit do re~imu navedeníEnter Navigate mode ViewManager8Vstoupit do re~imu úprav notEnter NoteEdit mode ViewManager2Vstoupit do re~imu výbruEnter Select mode ViewManagerProjí~dt k %1 Scroll to %1 ViewManager&Vybrat více oblastíSelect Multiple Regions ViewManagerVybrat oblast Select Region ViewManager2Vypnout re~im zarovnáváníSwitch off Alignment mode ViewManager(Vypnout re~im smy kySwitch off Loop mode ViewManagerPVypnout re~im pYehrávání vybrané oblastiSwitch off Play Selection mode ViewManagerJVypnout re~im samostatného pYehráváníSwitch off Play Solo mode ViewManager2Zapnout re~im zarovnáváníSwitch on Alignment mode ViewManager(Zapnout re~im smy kySwitch on Loop mode ViewManagerPZapnout re~im pYehrávání vybrané oblastiSwitch on Play Selection mode ViewManagerJZapnout re~im samostatného pYehráváníSwitch on Play Solo mode ViewManagerBZvtaení na jeden vzorek na pixel<Zvtaení na %n vzorky na pixel<Zvtaení na %n vzorko na pixelZoom to %n sample(s) per pixel ViewManager. %1 %2 (%3 dB nejvyaaí) %1 %2 (%3 dB peak) WaveformLayer8 %1 %2 - %3 (%4 dB nejvyaaí) %1 %2 - %3 (%4 dB peak) WaveformLayer0dB0dB WaveformLayer.RozYíznout a roztáhnout Butterfly WaveformLayerKanál %1 Channel %1 WaveformLayer KanályChannels WaveformLayerZesíleníGain WaveformLayer Levý:Left: WaveformLayerÚroveH:Level: WaveformLayerPYímo arýLinear WaveformLayer PromrMean WaveformLayer MYi Meter WaveformLayer<Normalizovat viditelnou oblastNormalize Visible Area WaveformLayer Pravý:Right: WaveformLayerStupniceScale WaveformLayerRozdlitSeparate WaveformLayer as: %1Time: %1 WaveformLayer as: %1 - %2 Time: %1 - %2 WaveformLayerdBdB WaveformLayer V/ asV / timeWindowShapePreviewdB/kmito et dB / freqWindowShapePreview2Zapisovatelný soubor WaveWritable Wave FileWritableWaveFileModelˆÿsonic-visualiser-3.0.3/i18n/sonic-visualiser_cs_CZ.ts0000644000000000000000000105540413111512442020654 0ustar 00000000000000 ActivityLog %1: %2 %1: %2 Activity Log Zápis Äinnosti <p>Activity Log lists your interactions and other events within %1.</p> <p>Zápis Äinností uvádí vaÅ¡i spolupráci a další události uvnitÅ™ %1.</p> AddLayerCommand Add %1 Layer PÅ™idat %1 vrstvu AggregateWaveModel Aggregate Wave Úhrnná vlna AlignmentModel Alignment Zarovnání AlignmentView AlignmentView Pohled na zarovnání AudioCallbackPlaySource Stop at %1 Zastavit na %1 Play from %1 PÅ™ehrát od %1 Change time-stretch factor to %1 ZmÄ›nit násobek roztažení Äasu na %1 AudioCallbackRecordTarget recorded-%1.wav nahráno-%1.wav Recorded %1 Nahráno %1 AudioDial %2%3 %2%3 Enter new value Zadat novou hodnotu %1: %2%3 %1: %2%3 New value for %1, from %2 to %3: Nová hodnota pro %1, od %2 do %3: Enter a new value from %1 to %2: Zadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2 %3: Zadejte novou hodnotu od %1, do %2 %3: New value for %1, from %2 to %3 %4: Nová hodnota pro %1, od %2 do %3 %4: %1: %2 %1: %2 AudioTargetFactory Core Audio Device Jaderné zvukové zařízení (auto) (auto) Default Soundcard Device Výchozí zařízení zvukové karty PulseAudio Server Server PulseAudio JACK Audio Connection Kit Spojovací sada pro zvuk JACK BZipFileDevice Failed to open bzip2 stream for writing OtevÅ™ení proudu bzip2 pro zápis se nezdaÅ™ilo bzip2 stream read close error Chyba závÄ›ru Ätení proudu bzip2 bzip2 stream read error Chyba Ätení proudu bzip2 Internal error (open for neither read nor write) VnitÅ™ní chyba (otevÅ™ení ani pro Ätení, ani pro zápis) Failed to open bzip2 stream for reading OtevÅ™ení proudu bzip2 pro Ätení se nezdaÅ™ilo Read and write modes both specified Režimy pro Ätení a zápis jsou zadány File access mode not specified Režim přístupu k souborům není zadán Failed to open file for writing OtevÅ™ení souboru pro zápis se nezdaÅ™ilo Append mode not supported Režim pÅ™ipojení není podporován File not open Soubor neotevÅ™en Internal error (close for neither read nor write) VnitÅ™ní chyba (závÄ›r ani pro Ätení, ani pro zápis) File is already open Soubor je již otevÅ™en bzip2 stream write close error Chyba závÄ›ru zápisu proudu bzip2 Failed to open file for reading OtevÅ™ení souboru pro Ätení se nezdaÅ™ilo Failed to open file handle for writing OtevÅ™ení manipulátoru souboru pro zápis se nezdaÅ™ilo Failed to open file handle for reading OtevÅ™ení manipulátoru souboru pro Ätení se nezdaÅ™ilo BundleCommand %1 (%n change(s)) %1 (jedna zmÄ›na) %1 (%n zmÄ›ny) %1 (%n zmÄ›n) CSVFileWriter Failed to open file %1 for writing OtevÅ™ení souboru %1 pro zápis se nezdaÅ™ilo CSVFormatDialog Time ÄŒas Label Å títek Value Hodnota Explicitly, in seconds OtevÅ™enÄ›, v sekundách (%1 more) %1 (více) End time Koncový Äas Audio sample rate (Hz): Vzorkovací kmitoÄet zvuku (Hz): Frame increment between rows: Nárůst snímků mezi řádky: Values Hodnoty Select Data Format Vybrat datový formát Timing is specified: ÄŒas je zadán: Duration Doba trvání Explicitly, in audio sample frames OtevÅ™enÄ›, ve zvukových vzorkovacích snímcích Please select the correct data format for this file. Vyberte, prosím, správný datový formát pro tento soubor. Implicitly: rows are equally spaced in time SkrytÄ›: řádky jsou pravidelnÄ› rozloženy v Äase Data will be displayed in a %1 layer. Data budou zobrazena ve vrstvÄ› %1. <ignore> <nevšímat si> Pitch Výška tónu Explicitly, in milliseconds OtevÅ™enÄ›, v milisekundách Colour3DPlotLayer dB dB Log Zápis +/-1 +/-1 Bins KoÅ¡e Gain Zesílení signálu Scale Stupnice Bin Scale Stupnice koÅ¡e Normalize Columns Normalizovat sloupce Normalize Visible Area Normalizovat viditelnou oblast Colour Barva <unknown> <neznámý> Linear Čárový Smooth Jemná Absolute Naprostý Time: %1 - %2 Bin: %3 Value: %4 ÄŒas: %1 - %2 KoÅ¡: %3 Hodnota: %4 Always Opaque Vždý neprůhledná Invert Vertical Scale Obrátit svislou stupnici Normalization Normalizace None Žádný Col Barva View Pohled Hybrid Smíšený ColourComboBox Name New Colour Pojmenovat novou barvu Enter a name for the new colour: Zadejte název pro novou barvu: Prefer black background for this colour UpÅ™ednostňovat Äerné pozadí pro tuto barvu Add New Colour... PÅ™idat novou barvu... ColourMapper Black on White ÄŒerná na bílé Yellow on Black Žlutá na Äerné Banded Pruhovaný <unknown> <neznámý> Sunset Západ slunce Fruit Salad Ovocný salát Red on Blue ÄŒervená na modré Printer Tiskárna Blue on Black Modrá na Äerné Default Výchozí High Gain Zesílení výšek Highlight ZvýraznÄ›ní White on Black Bílá na Äerné Green Zelená CommandHistory &Undo &ZpÄ›t Re&do &Znovu Undo the last editing operation Poslední krok úprav vrátit zpÄ›t Nothing to redo Neexistuje nic, u Äeho by Å¡lo zruÅ¡it vrácení zpÄ›t Nothing to undo Neexistuje nic, co by se dalo vrátit zpÄ›t Ctrl+Z Ctrl+Z Re&do %1 &Znovu %1 Redo the last operation that was undone Opakovat poslední krok úprav, který byl vrácen zpÄ›t Redo %1 Znovu %1 &Undo %1 &ZpÄ›t %1 Undo %1 ZpÄ›t %1 Ctrl+Shift+Z Ctrl+Shift+Z CoreAudioFileReader Decoding %1... Dekóduje se %1... DecodingWavFileReader Decoding %1... Dekóduje se %1... Dense3DModelPeakCache Dense 3-D Peak Cache Vyrovnávací paměť hustého trojrozmÄ›rného vrcholu DenseThreeDimensionalModel Time ÄŒas Frame Snímek Dense 3-D Hustý trojrozmÄ›rný DenseTimeValueModel Dense Time-Value Hustá hodnota Äasu Document Set main model to %1 Nastavit hlavní model na %1 Clear main model Smazat hlavní model EditableDenseThreeDimensionalModel Editable Dense 3-D Upravovatelný hustý trojrozmÄ›rný FFTModel FFT FFT %1 Hz %1 Hz Fader New fader level, from %1 to %2 dBFS: Nová úroveň prolínaÄe, od %1 do %2 dBFS: Enter new fader level Zadat novou úroveň prolínaÄe Level: %1%2.%3%4 dB Úroveň: %1%2.%3%4 dB Level: Off Úroveň: Vypnuto FeatureExtractionModelTransformer Failed to instantiate plugin "%1" Přídavný modul "%1" se nepodaÅ™ilo doložit příkladem No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Není dostupný žádný závod pro ID přídavného modulu vytažení funkce "%1" (neznámý typ přídavného modulu, nebo vnitÅ™ní chyba?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Vstupní model pro přídavný modul vytažení funkce "%1" je chybného typu (vnitÅ™ní chyba?) Plugin "%1" has no output named "%2" Přídavný modul "%1" nemá žádný výstup pojmenovaný jako "%2" Failed to initialise feature extraction plugin "%1" Přídavný modul vytažení funkce se nepodaÅ™ilo spustit "%1" Plugin "%1" has no outputs Přídavný modul "%1" nemá žádné výstupy Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Přídavný modul vytažení funkce "%1" odmítl daný krok a velikosti bloků (%2 a %3); používají se výchozí nastavení přídavného modulu (%4 a %5) Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Nelze poskytnout dostatek kanálů pro přídavný modul vytažení funkce "%1" (minimum pro přídavný modul je %2, maximum pro přídavný modul je %3; vstupní model has %4) Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 PromÄ›na byla nastavena pro verzi %1 přídavného modulu "%2", ale používaný přídavný modul je ve verzi %3 Transforms supplied to a single FeatureExtractionModelTransformer instance must be similar in every respect except plugin output PromÄ›ny poskytnuté jedné instanci FeatureExtractionModelTransformer musí být podobné v každém ohledu vyjma výstupu přídavného modulu FileSource File contains no data! Soubor neobsahuje žádné údaje! Login failed PÅ™ihlášení se nezdaÅ™ilo Download cancelled Stahování zruÅ¡eno Failed to create local file %1 VytvoÅ™ení místního souboru %1 se nezdaÅ™ilo Unsupported scheme in URL Nepodporované schéma v adrese (URL) FTP download aborted FTP stahování zruÅ¡eno Downloading %1... Stahuje se %1... Failed to connect to FTP server PÅ™ipojení k FTP serveru se nezdaÅ™ilo Failed to change to correct directory ZmÄ›na na správný adresář se nepodaÅ™ila FlexiNoteLayer New Point Nový bod Vertical Scale Svislá stupnice Scale Units Jednotky stupnice Scale Stupnice Auto-Align Automatické zarovnání Linear Lineární Log Záznam MIDI Notes Noty MIDI In progress Probíhá No local points Žádné místní body %1 (%2, %3 Hz) %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 Hz (%2, %3) %1 %2 %1 %2 Time: %1 Pitch: %2 Duration: %3 No label ÄŒas: %1 Výška: %2 Doba trvání: %3 Žádný Å¡títek Time: %1 Pitch: %2 Duration: %3 Label: %4 ÄŒas: %1 Výška: %2 Doba trvání: %3 Å títek: %4 Draw Point Nakreslit bod Erase Point Vymazat bod Drag Point Táhnout bod Edit Point Upravit bod Relocate Point PÅ™emístit bod Change Point Value ZmÄ›nit hodnotu bodu Add Point PÅ™idat bod Snap Notes PÅ™ichytit poznámky Merge Notes SlouÄit poznámky Drag Selection Táhnout výbÄ›r Resize Selection ZmÄ›nit velikost výbÄ›ru Delete Selected Points Smazat vybrané body Re-align pasted items? Zarovnat vložené položky znovu? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Paste Vložit Record FlexiNote Nahrát FlexiNote FlexiNoteModel FlexiNote FlexiNote Time ÄŒas Frame Snímek Pitch Výška tónu Duration Doba trvání Level Úroveň Label Å títek Unknown Neznámý Edit Data Upravit data I Edit Data Upravit data ImageDialog Image Obrázek File or URL: Soubor nebo adresa (URL): Label: Å títek: Unsupported scheme in URL Nepodporované schéma v adrese (URL) Opening image URL... Otevírá se adresa obrázku (URL)... Browse... Procházet... Preview Náhled The URL scheme "%1" is not supported Schéma adresy (URL) "%1" není podporována File download failed Stažení souboru se nezdaÅ™ilo Failed to download URL "%1": %2 NepodaÅ™ilo se stáhnout adresu (URL) "%1": %2 ImageLayer Paste Vložit The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Resize Selection ZmÄ›nit velikost výbÄ›ru Select image Vybrat obrázek Opening image URL... Otevírá se adresa obrázku (URL)... Move Image PÅ™esunout obrázek In progress Probíhá New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výbÄ›r Delete Selection Smazat výbÄ›r ImageModel Time ÄŒas Frame Snímek Image Obrázek Label Å títek Edit Data Upravit data Edit Image Upravit obrázek Unknown Neznámý InteractiveFileFinder <b>File is not readable</b><p>File "%1" can not be read <b>Soubor není Äitelný</b><p>Soubor "%1" nelze pÅ™eÄíst Select a session file Vybrat soubor se sezením Failed to open file Soubor se nepodaÅ™ilo otevřít <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>Soubor existuje</b><p>Soubor "%1" již existuje. Chcete jej pÅ™epsat? All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) VÅ¡echny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddÄ›lené datové soubory (*.csv) Mezerou oddÄ›lené soubory .lab (*.lab) Soubory RDF (%2) Soubory MIDI (*.mid) Textové soubory (*.txt) VÅ¡echny soubory (*.*) Cancel ZruÅ¡it <b>Not a file</b><p>Path "%1" is not a file <b>Není soubor</b><p>Cesta "%1" není soubor Use URL... Použít adresu (URL)... Directory selected Adresář vybrán File exists Soubor již existuje <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>Soubor nenalezen</b><p>Zvukový soubor "%1" se nepodaÅ™ilo otevřít. Chcete jej najít? Audio files (%1) All files (*.*) Zvukové soubory (%1) VÅ¡echny soubory (*.*) Sonic Visualiser session files (*.sv) RDF files (%1) All files (*.*) Soubory se sezením programu Sonic Visualiser (*.sv) Soubory RDF (%1) VÅ¡echny soubory (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) VÅ¡echny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddÄ›lené datové soubory (*.csv) Mezerou oddÄ›lené soubory .lab (*.lab) Soubory RDF (%2) Textové soubory (*.txt) VÅ¡echny soubory (*.*) File is empty Soubor je prázdný Non-file selected Vybrán ne-soubor All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) VÅ¡echny podporované soubory (*.sv %1 %2 %3) Soubory XML Sonic Visualiser Layer (*.svl) Zvukové soubory (%1) Soubory Layer (%2) Soubory RDF (%3) VÅ¡echny soubory (*.*) Failed to open location UmístÄ›ní se nepodaÅ™ilo otevřít Please enter the URL to use for this file: Zadejte, prosím, adresu (URL), která se má použít pro tento soubor: Locate file... Najít soubor... <b>Directory selected</b><p>File "%1" is a directory <b>Soubor vybrán</b><p>Soubor "%1" je adresář <b>File not found</b><p>File "%1" does not exist <b>Soubor nenalezen</b><p>Soubor "%1" neexistuje Select file Vybrat soubor <b>File is empty</b><p>File "%1" is empty <b>Soubor je prázdný</b><p>Soubor "%1" je prázdný All files (*.*) VÅ¡echny soubory (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddÄ›lené datové soubory (*.csv) Soubory RDF/Turtle (%1) Textové soubory (*.txt) VÅ¡echny soubory (*.*) File is not readable Soubor není Äitelný Use URL Použít adresu (URL) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddÄ›lené datové soubory (*.csv) Soubory RDF/Turtle (%1) Soubory MIDI (*.mid) Textové soubory (*.txt) VÅ¡echny soubory (*.*) All supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*) VÅ¡echny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Zvukové soubory (%2) Soubory RDF (%1) VÅ¡echny soubory (*.*) <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? <b>Soubor nenalezen</b><p>Soubor "%1" se nepodaÅ™ilo otevřít. Chcete jej najít? <b>Failed to open location</b><p>URL "%1" could not be opened <b>UmístÄ›ní se nepodaÅ™ilo otevřít</b><p>Adresu (URL) "%1" se nepodaÅ™ilo otevřít Image files (%1) All files (*.*) Obrázkové soubory (%1) VÅ¡echny soubory (*.*) Portable Network Graphics files (*.png) All files (*.*) Soubory PNG (Portable Network Graphics) (*.png) VÅ¡echny soubory (*.*) File does not exist Soubor neexistuje Sonic Visualiser session files (*.sv) All files (*.*) Soubory se sezením programu Sonic Visualiser (*.sv) VÅ¡echny soubory (*.*) Select a file to export to Vybrat soubor, do kterého se má provést vyvedení WAV audio files (*.wav) All files (*.*) Zvukové soubory WAV (*.wav) VÅ¡echny soubory (*.*) %1 session files (*.%1) RDF files (%3) All files (*.*) %1 soubory sezení (*.%1) Soubory RDF (%3) VÅ¡echny soubory (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) VÅ¡echny podporované soubory (%1 %2) Čárkou oddÄ›lené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Mezerou oddÄ›lené soubory .lab (*.lab) Soubory RDF (%2) Soubory MIDI (*.mid) Textové soubory (*.txt) VÅ¡echny soubory (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) VÅ¡echny podporované soubory (%1 %2) Čárkou oddÄ›lené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Mezerou oddÄ›lené soubory .lab (*.lab) Soubory RDF (%2) Textové soubory (*.txt) VÅ¡echny soubory (*.*) All supported files (*.sv %1 %2) %3 session files (*.%4) Audio files (%2) RDF files (%1) All files (*.*) VÅ¡echny podporované soubory (*.sv %1 %2) %3 soubory sezení (*.%4) Zvukové soubory (%2) Soubory RDF (%1) VÅ¡echny soubory (*.*) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) Text files (*.txt) All files (*.*) Čárkou oddÄ›lené datové soubory (*.csv) Mezerou oddÄ›lené soubory .lab (*.lab) Textové soubory (*.txt) VÅ¡echny soubory (*.*) All supported files (*.sv %1 %2 %3) %4 session files (*.%5) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) VÅ¡echny podporované soubory (*.sv %1 %2 %3) %4 soubory sezení (*.%5) Zvukové soubory (%1) Soubory vrstev (%2) Soubory RDF (%3) VÅ¡echny soubory (*.*) %1 session files (*.%2) All files (*.*) %1 soubory sezení (*.%2) VÅ¡echny soubory (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Čárkou oddÄ›lené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Soubory RDF/Turtle (%1) Soubory MIDI (*.mid) Textové soubory (*.txt) VÅ¡echny soubory (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Čárkou oddÄ›lené datové soubory (*.csv) Soubory XML Sonic Visualiser Layer (*.svl) Soubory RDF/Turtle (%1) Textové soubory (*.txt) VÅ¡echny soubory (*.*) Comma-separated data files (*.csv) Text files (*.txt) All files (*.*) Čárkou oddÄ›lené datové soubory (*.csv) Textové soubory (*.txt) VÅ¡echny soubory (*.*) Scalable Vector Graphics files (*.svg) All files (*.*) Soubory SVG (Scalable Vector Graphics) (*.svg) VÅ¡echny soubory (*.*) ItemEditDialog OK OK sec sek usec usek Reset Nastavit znovu Text: Text: Time: ÄŒas: Cancel ZruÅ¡it Timing NaÄasování Value: Hodnota: Properties Vlastnosti frames snímky Duration: Doba trvání: KeyReference & & <i>or</i>&nbsp;<b>%1</b> <i>nebo</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> </b>&nbsp;(%1)<b> Sonic Visualiser: Key and Mouse Reference Sonic Visualiser: Odkaz na klávesy a myÅ¡ %1: Key and Mouse Reference %1: Klávesové zkratky a myÅ¡ LabelCounterInputDialog Set Counters Nastavit poÄítadla Fine counter (beats): Citlivé poÄítadlo (doby): Coarse counter (bars): Hrubé poÄítadlo (doby): Labeller %1 %1 %1.%2 %1 %2 Tempo (bpm) based on duration since previous item Tempo (poÄet úderů za minutu; úzm: bpm) založené na dobÄ› trvání od pÅ™edchozí položky Duration since the previous item Doba trvání od pÅ™edchozí položky Label Points Body Å¡títků Audio sample frame number Číslo snímku zvukového vzorku Cyclical two-level counter (bar/beat) Cyklické dvouúrovňové poÄítadlo (takt/doba) Tempo (bpm) based on duration to following item Tempo (poÄet úderů za minutu; úzm: bpm) založené na dobÄ› trvání po následující položku Value extracted from the item's label (where possible) Hodnota vytažená ze Å¡títku u položky (kde je to možné) No numbering Žádné Äíslování Simple counter Jednoduché poÄítadlo Same as the nearest previous item Stejné jako nejbližší pÅ™edchozí položka Time in seconds ÄŒas v sekundách Duration to the following item Doba trvání po následující položku Cyclical counter Cyklické poÄítadlo Subdivide Points RozdÄ›lit body na menší Äásti Winnow Points Protřídit body Layer Text Text Layer Vrstva Notes Noty Ruler Pravítko Colour 3D Plot Barevný trojrozmÄ›rný nákres Images Obrázky Time Values Hodnoty Äasu Spectrum Spektrum Time Slice Kus Äasu Regions Oblasti Waveform ÄŒasový průbÄ›h vlny Make Measurement UdÄ›lat měření Spectrogram Spektrogram Time Instants Okamžiky Äasu Delete Measurement Smazat měření Flexible Notes Pružné poznámky Unknown Layer Neznámá vrstva LayerTreeDialog Layer Summary PÅ™ehled vrstev Panes and Layers Tabulky a vrstvy Audio Data Sources Zdroje zvukových dat LayerTreeModel Layer Vrstva Model Model Shown Ukázaná Played PÅ™ehrávaná LevelPanToolButton Click to adjust level and pan KlepnÄ›te pro pÅ™izpůsobení úrovnÄ› a vyvážení LevelPanWidget Drag vertically to adjust level, horizontally to adjust pan TáhnÄ›te svisle pro pÅ™izpůsobení úrovnÄ›, vodorovného pro pÅ™izpůsobení vyvážení MIDIFileImportDialog <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: <b>Vybrat stopu pro zavedení</b><p> Tento soubor můžete zavést jen jako jednu poznámkovou vrstvu, ale soubor obsahuje více než jednu stopu, nebo noty na více než jednom kanálu.<p>Vyberte, prosím, stopu nebo slouÄené stopy, jež si pÅ™ejete zavést: Error in MIDI file import Chyba pÅ™i zavádÄ›ní souboru MIDI Merge all tracks SlouÄit vÅ¡echny stopy Merge all non-percussion tracks SlouÄit vÅ¡echny stopy, které nejsou bicích Select track or tracks to import Vybrat stopu nebo stopy pro zavedení MIDIFileReader Track %1 (untitled)%3 Stopa %1 (bez názvu)%3 getMIDIByte called but no MIDI file open Voláno getMIDIByte (získat byt MIDI), ale neotevÅ™en žádný soubor MIDI Attempt to get more bytes than expected on Track Pokus o získání více bytů ze stopy, než bylo oÄekáváno Running status used for first event in track Pro první událost ve stopÄ› byl použit provozní stav ('Running') Track %1 (%2)%3 Stopa %1 (%2)%3 Wrong length for long data in MIDI stream (%1, should be %2) Chybná délka pro dlouhá data v proudu MIDI (%1, mÄ›lo by být %2) getNumberFromMIDIBytes called but no MIDI file open Voláno getNumberFromMIDIBytes (získat z bytů MIDI Äíslo), ale neotevÅ™en žádný soubor MIDI Attempt to read past MIDI file end Pokus o Ätení po konci souboru MIDI Attempt to get more bytes than available on Track (%1, only have %2) Pokus o získání více bytů, než je na stopÄ› dostupných (%1, má pouze %2) %1 - vel %2 %1 - vel %2 Invalid event code %1 found Nalezen neplatný kód události %1 getMIDIBytes called but no MIDI file open Voláno getMIDIBytes (získat byty MIDI), ale neotevÅ™en žádný soubor MIDI skipToNextTrack called but no MIDI file open Voláno skipToNextTrack (skoÄit na další skladbuI), ale neotevÅ™en žádný soubor MIDI End of MIDI file encountered while reading PÅ™i Ätení byl dosažen konec souboru MIDI Wrong length for int data in MIDI stream (%1, should be %2) Chybná délka pro vnitÅ™ní data v proudu MIDI (%1, mÄ›lo by být %2) - uses GM percussion channel - používá kanál bicích GM MIDI file "%1" has no notes in any track Soubor MIDI "%1" nemá noty v žádné stopÄ› MIDIInput Input Vstup MP3FileReader Decoding %1... Dekóduje se %1... MainWindow # # 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 ; ; E E F P G G K K M M N N R R T T U U W W X X Y Y Z Z [ [ ] ] l l o o s s F1 F1 F2 F2 Up Zvýšit Del Smazat (Delete) End Konec Esc Esc Red ÄŒervená Blue Modrá Cu&t Vyj&mout Down Snížit Draw Nakreslit Edit Upravit Help NápovÄ›da Home Home Left Vlevo PgUp PgUp Zoom ZvÄ›tÅ¡ení <br>With Rasqal RDF query engine &copy; Dave Beckett and the University of Bristol <br>Se strojem na dotazy RDF Rasqal &copy; Dave Beckett a the University of Bristol Zoom to show the whole file Ukázat celý soubor Ctrl+PgDown Ctrl+PgDown Paste at Playback Position Vložit v poloze pÅ™ehrávání Fast forward to the next time instant in the current layer Rychle vpÅ™ed k dalšímu okamžiku v Äase v nynÄ›jší vrstvÄ› %1... %1... &Copy &Kopírovat &Edit &Úpravy &File &Soubor &Help &NápovÄ›da &Pane &Tabulka &Quit &UkonÄit &View &Pohled Play Mode Toolbar Nástrojový pruh pro režim hry Black ÄŒerná Debug Ladit Enter Enter Erase Vymazat Green Zelená &All Channels Mixed &VÅ¡echny kanály smíchány Right Vpravo Space Mezerník Add a new layer showing a waveform view PÅ™idat novou vrstvu ukazující pohled na Äasový průbÄ›h vlny White Bílá With S Scroll the current pane to the left without moving the playback cursor or other panes ProjíždÄ›t nynÄ›jší tabulkou vlevo bez pohybu ukazatelem pÅ™ehrávání nebo jinými tabulkami Sample rate mismatch Nesoulad ve vzorkovacím kmitoÄtu Managing Panes and Layers Správa tabulek a vrstev Scroll the current pane to the right without moving the playback cursor or other panes ProjíždÄ›t nynÄ›jší tabulkou vpravo bez pohybu ukazatelem pÅ™ehrávání nebo jinými tabulkami <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>VytvoÅ™ení vrstvy se nezdaÅ™ilo</b><p>NepodaÅ™ilo se znovu vytvoÅ™it odvozenou vrstvu "%1" za použití nového datového modelu jako vstupu.<p>PromÄ›na vrstvy "%2" se nezdaÅ™ila:<p>%3 Open a window listing interactions and other events Otevřít okno uvádÄ›jící výmÄ›nu informací a další události Show La&yer Summary Ukázat pÅ™ehled &vrstev Select region to export Vybrat oblast, která se má vyvést Start or stop playback from the current position Spustit nebo zastavit pÅ™ehrávání od nynÄ›jší polohy &Help Reference Odkaz na &nápovÄ›du Export layer data to a file Vyvést data vrstvy do souboru Choose Default Template... Vybrat výchozí pÅ™edlohu... Fast-forward to the end PÅ™etáÄet rychle na konec Abandon the current Sonic Visualiser session and start a new one Opustit nynÄ›jší sezení programu Sonic Visualiser a spustit nové Failed to open file Soubor se nepodaÅ™ilo otevřít Fast Forward to Similar Point Rychle vpÅ™ed k podobnému bodu Export selection as an audio file Vyvést výbÄ›r jako zvukový soubor Search for a transform from the installed plugins, by name or description Hledat promÄ›nu z nainstalovaných přídavných modulů, podle názvu nebo popisu Cut the selection from the current layer to the clipboard Vyjmout výbÄ›r z nynÄ›jší vrstvy do schránky Add &Time Ruler PÅ™idat Äa&sové pravítko Insert a new time instant at the current playback position, in a new layer if necessary Vložit nový Äasový okamžik v nynÄ›jší poloze pÅ™ehrávání, v nové vrstvÄ›, pokud je tÅ™eba Rewind to the previous point in the current layer PÅ™etoÄit k pÅ™edchozímu bodu v nynÄ›jší vrstvÄ› Edit items in layer Upravit položky ve vrstvÄ› Solo Current Pane NynÄ›jší tabulka samostatnÄ› <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>Dekodér souborů Ogg (oggz v%1, fishsound v%2) &copy; CSIRO Australia Fast-forward to the next time instant or time ruler notch Rychle vpÅ™ed k dalšímu okamžiku v Äase nebo místu Äasového pravítka Paste from the clipboard to the current layer Vložit ze schránky do nynÄ›jší vrstvy <b>Open failed</b><p>Dropped URL "%1" could not be opened <b>OtevÅ™ení se nezdaÅ™ilo</b><p>UpuÅ¡tÄ›nou adresu (URL) "%1" se nepodaÅ™ilo otevřít Constrain Playback to Selection Omezit pÅ™ehrávání na výbÄ›r Export a single pane to an image file Vyvést každou jednu tabulku do obrázkového souboru Loop playback UdÄ›lat z pÅ™ehrávaného smyÄku Loop Playback UdÄ›lat z pÅ™ehrávání smyÄku Select audio file to export Vybrat zvukový soubor pro vyvedení J&ump Right S&koÄit vpravo Apply Session Template Použít pÅ™edlohu sezení Standard Waveform Obvyklý tvar vlny Switch to Previous Pane PÅ™epnout na pÅ™edchozí tabulku New name for this layer: Nový název pro tuto vrstvu: <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>Zvuková výstupní knihovna PortAudio &copy; Ross Bencina a Phil Burk Switch to Next Pane PÅ™epnout na další tabulku &Recent Transforms &Poslední promÄ›ny Tools Toolbar Nástrojový pruh s nástroji Visible: %1 to %2 (duration %3) Viditelný: %1 až %2 (doba trvání %3) &Save Session &Uložit sezení <br>With Rubber Band &copy; Chris Cannam <br>GumiÄka (Rubber Band) &copy; Chris Cannam Erase items from layer Vymazat položky z vrstvy Set the counters used for counter-based labelling Nastavit poÄítadla používaná pro Å¡títkování založené na poÄítadlech <b>Open failed</b><p>URL "%1" could not be opened <b>OtevÅ™ení se nezdaÅ™ilo</b><p>Adresu (URL) "%1" se nepodaÅ™ilo otevřít Cycle size Velikost cyklu Export the selection extent (%1x%2 pixels) Vyvést plochu výbÄ›ru (%1x%2 pixelů) Clear the selection Vyprázdnit výbÄ›r Open a session file, audio file, or layer Otevřít soubor se sezením, zvukový soubor, nebo vrstvu %1: %2 %1: %2 <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment using transform "%1":<p>%2 <b>SpoÄítání zarovnání se nezdaÅ™ilo</b><p>Zarovnání zvuku se spoÄítat s pomocí "%1" nepodaÅ™ilo:<p>%2 Show Acti&vity Log Ukázat zápis Äin&nosti Playback PÅ™ehrávání Add a new layer showing a spectrogram PÅ™idat novou vrstvu ukazující spektrogram &Layer &Vrstva &Paste V&ložit Selection VýbÄ›r Playback speed: Normal Rychlost pÅ™ehrávání: Obvyklá Fast-forward to the next similarly valued time instant Rychle vpÅ™ed k dalšímu podobnÄ› ohodnocenému okamžiku v Äase Open the Sonic Visualiser website Otevřít internetové stránky programu Sonic Visualiser Please enter a name for the saved template: Zadejte, prosím, název pro uloženou pÅ™edlohu: Bright Green SvÄ›tlezelená Rename Layer PÅ™ejmenovat vrstvu Export the selected region only Vyvést pouze vybranou oblast No audio file loaded. Nebyl nahrán žádný zvukový soubor. Show &All Overlays Ukázat &vÅ¡echna pÅ™ekrytí Rename the currently active layer PÅ™ejmenovat nyní Äinnou vrstvu %1Hz (resampling to %2Hz) %1Hz (pÅ™evzorkování na %2Hz) <b>File open failed</b><p>Layer file %1 could not be opened. <b>Soubor se nepodaÅ™ilo otevřít</b><p>Soubor s vrstvou "%1" se nepodaÅ™ilo otevřít. Insert a new note or region item corresponding to the current selection Vložit novou položku noty nebo oblasti odpovídající nynÄ›jšímu výbÄ›ru <br>With libsamplerate &copy; Erik de Castro Lopo <br>libsamplerate &copy; Erik de Castro Lopo Alt+Left Alt+Å¡ipka vlevo Playback speed: %1%2% Rychlost pÅ™ehrávání: %1%2% Restore &Default Zoom Obnovit &výchozí zvÄ›tÅ¡ení http://www.sonicvisualiser.org/doc/reference/%1/en/ http://www.sonicvisualiser.org/doc/reference/%1/en/ Delete the measurement currently under the mouse pointer Smazat měření, které je nyní pod ukazovátkem myÅ¡i </small><p><small>The OSC URL for this instance is: "%1" </small><p><small>Adresa (URL) OSC pro tuto instanci je: "%1" Rewind to the previous time instant in the current layer PÅ™etoÄit k pÅ™edchozímu okamžiku v Äase v nynÄ›jší vrstvÄ› &Import More Audio... &Zavést více zvukových souborů... Measure Změřit Open Location Otevřít umístÄ›ní Add &Existing Layer PÅ™idat &stávající vrstvu <br>With Ogg file decoder &copy; CSIRO Australia <br>Dekodér souborů Ogg &copy; CSIRO Australia Fragment file %1 already exists, aborting Zlomkový soubor %1 již existuje. PÅ™eruÅ¡uje se Play / Pause PÅ™ehrát/Pozastavit Number New Instants with Číslovat nové okamžiky s Save the current session into a new Sonic Visualiser session file Uložit nynÄ›jší sezení do nového souboru se sezením programu Sonic Visualiser &Jump Left &SkoÄit vlevo Show thumbwheels for zooming horizontally and vertically Ukázat ovládací koleÄko pro vodorovné a svislé zvÄ›tÅ¡ování Sonic Visualiser Sonic Visualiser - ZnázorňovaÄ zvuku File and Session Management Správa souborů a sezení Make the next pane down in the pane stack current UdÄ›lat další tabulku smÄ›rem dolů v zásobníku tabulek souÄasnou Exit Sonic Visualiser UkonÄit Sonic Visualiser <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>VytvoÅ™ení vrstvy se nezdaÅ™ilo</b><p>NepodaÅ™ilo se znovu vytvoÅ™it odvozenou vrstvu "%1" za použití nového datového modelu jako vstupu.<p>PromÄ›na vrstvy "%2" se nezdaÅ™ila.<p>Nejsou dostupné žádné informace o chybÄ›. Export the selection extent Vyvést plochu výbÄ›ru Import Annotation &Layer... Zavést poznámkovou &vrstvu... Adjust the master playback speed PÅ™izpůsobit hlavní rychlost pÅ™ehrávání Show &Standard Overlays Ukázat ob&vyklá pÅ™ekrytí Show All Time Rulers Ukázat vÅ¡echna Äasová pravítka Ctrl+A Ctrl+A Ctrl+C Ctrl+C Ctrl+D Ctrl+D Ctrl+I Ctrl+I Ctrl+L Ctrl+L Ctrl+M Ctrl+M Ctrl+N Ctrl+N Ctrl+O Ctrl+O Ctrl+Q Ctrl+Q Ctrl+R Ctrl+R Ctrl+S Ctrl+S Ctrl+T Ctrl+T Ctrl+V Ctrl+V Ctrl+X Ctrl+X <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>Zvuková výstupní knihovna PulseAudio v%1 &copy; Lennart Poettering a Pierre Ossman Can't export non-note layers to MIDI Ne-notové vrstvy nelze do MIDI vyvést Adjust the master playback level PÅ™izpůsobit hlavní úroveň pÅ™ehrávání <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p>Sonic Visualiser je programem urÄeným pro prohlížení a zkoumání zvukových dat, pro významový hudební rozbor a pÅ™ipojování poznámek.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> Tool Selection VýbÄ›r nástroje Failed to open file %1 for writing OtevÅ™ení souboru %1 pro zápis se nezdaÅ™ilo Channel &%1 Kanál &%1 <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. <b>Vyžadován zvuk</b><p>Data s vrstvou nelze z "%1" nahrát bez zvukového souboru.<br>PÅ™ed zavedením poznámek nahrajte, prosím, alespoň jeden zvukový soubor. &All Channels &VÅ¡echny kanály Show Status &Bar Ukázat st&avový řádek Delete the currently active layer Smazat nyní Äinnou vrstvu <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform "%1" failed:<p>%2 <b>VytvoÅ™ení vrstvy se nezdaÅ™ilo</b><p>NepodaÅ™ilo se vytvoÅ™it odvozenou vrstvu.<p>PromÄ›na vrstvy "%1" se nezdaÅ™ila:<p>%2 <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>Dekodér souborů mp3 MAD &copy; Underbit Technologies Inc Failed to calculate alignment Zarovnání se spoÄítat nepodaÅ™ilo Rewind to Previous Instant PÅ™etoÄit k pÅ™edchozímu okamžiku Add a new pane containing only a time ruler PÅ™idat novou tabulku obsahující pouze Äasové pravítko Orange Oranžová PgDown PgDown %1 by Plugin Name %1 podle názvu přídavného modulu Purple Purpurová Export the whole audio file Vyvést celý zvukový soubor Open or import a file from a remote URL Otevřít nebo zavést soubor ze vzdálené adresy (URL) Rewind PÅ™etoÄit zpÄ›t Select Vybrat Select the time range corresponding to the current window width Vybrat Äasový rozsah odpovídající šířce nynÄ›jšího okna <b>File open failed</b><p>Session file "%1" could not be opened <b>Soubor se nepodaÅ™ilo otevřít</b><p>Soubor se sezením "%1" se nepodaÅ™ilo otevřít <br>With Rubber Band v%1 &copy; Chris Cannam <br>GumiÄka (Rubber Band) v%1 &copy; Chris Cannam Show centre indicator, frame times and scale Ukázat stÅ™edový ukazatel, Äasy snímků a stupnici Failed to open dropped URL UpuÅ¡tÄ›nou adresu (URL) se nepodaÅ™ilo otevřít Using Find a Transform... Najít promÄ›nu... Fast Forward to Next Instant Rychle vpÅ™ed k dalšímu okamžiku Playback Speedup Zvýšení rychlosti pÅ™ehrávání Zoom &Out &Oddálit Shift+PgDown Shift+PgDown Add a new pane showing a spectrogram set up for tracking frequencies PÅ™idat novou tabulku ukazující spektrogram nastavený na sledování kmitoÄtů Add New %1 Layer PÅ™idat novou vrstvu %1 Add Point PÅ™idat bod Zoom &In &PÅ™iblížit <h3>About Sonic Visualiser</h3> <h3>O programu Sonic Visualiser</h3> &Open... &Otevřít... Make the next pane up in the pane stack current UdÄ›lat další tabulku smÄ›rem nahoru v zásobníku tabulek souÄasnou Scroll the current pane to the right ProjíždÄ›t nynÄ›jší tabulkou vpravo <br>With liblo Lite OSC library &copy; Steve Harris <br>Knihovna liblo Lite OSC &copy; Steve Harris Insert Instants at Selection &Boundaries Vložit okamžiky na &hranicích výbÄ›ru Slow Down Zpomalit Solo the current pane during playback NynÄ›jší tabulka samostatnÄ› bÄ›hem pÅ™ehrávání Shift+Enter Shift+Enter &Key and Mouse Reference &Klávesové zkratky a myÅ¡ Speed Up Zrychlit Open a window displaying the hierarchy of panes and layers in this session Otevřít okno zobrazující poÅ™adí tabulek a vrstev v tomto sezení <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>FFTW3 v%1 &copy; Matteo Frigo and MIT Time-stretch playback to speed it up without changing pitch PÅ™ehrávání roztažení Äasu kvůli jeho zrychlení bez zmÄ›ny výšky Playback Toolbar Nástrojový pruh pro pÅ™ehrávání Renumber Selected Instants PÅ™eÄíslovat vybrané okamžiky Alt+Right Alt+Å¡ipka vpravo Show &Zoom Wheels Ukázat koleÄka pro &zvÄ›tÅ¡ování Select to &End Vybrat do &konce Export Session as Template... Vyvést pÅ™edlohu jako sezení... Failed to save file Soubor se nepodaÅ™ilo uložit <br>With libsndfile &copy; Erik de Castro Lopo <br>libsndfile &copy; Erik de Castro Lopo Shift+Right Shift+Å¡ipka vpravo Insert Item at Selection Vložit položku u výbÄ›ru Re-select the most recently run transform Vybrat znovu naposledy provedenou promÄ›nu Save Session &As... Uložit sezení &jako... Restore Normal Speed Obnovit obyÄejnou rychlost Rewind to the previous time instant or time ruler notch PÅ™etoÄit k pÅ™edchozímu okamžiku v Äase nebo místu Äasového pravítka Paste from the clipboard to the current layer, placing the first item at the playback position Vložit ze schránky do nynÄ›jší vrstvy, první položka se umístí v poloze pÅ™ehrávání With Qt v%1 &copy; Nokia Corporation S Qt v%1 &copy; Nokia Corporation Add a new layer showing a time ruler PÅ™idat novou vrstvu ukazující Äasové pravítko Restore the zoom level to the default Obnovit úroveň zvÄ›tÅ¡ení na výchozí Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Vložit nové Äasové okamžiky na zaÄátku a na konci nyní vybraných oblastí, v nové vrstvÄ›, pokud je tÅ™eba Failed to save image file %1 Soubor s obrázkem %1 se nepodaÅ™ilo uložit Rewind to the start PÅ™etoÄit na zaÄátek <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>Knihovna liblo Lite OSC v%1 &copy; Steve Harris Tapping Time Instants Zaklepání okamžiků Äasu Show centre indicator only Ukázat pouze stÅ™edový ukazatel Open the Sonic Visualiser reference manual Otevřít odbornou příruÄku k programu Sonic Visualiser <b>File open failed</b><p>File "%1" could not be opened <b>Soubor se nepodaÅ™ilo otevřít</b><p>Soubor "%1" se nepodaÅ™ilo otevřít Add Pea&k Frequency Spectrogram PÅ™idat spektrogram nejvyššího &kmitoÄtu Delete the currently active pane Smazat nyní Äinnou tabulku About Sonic Visualiser O programu Sonic Visualiser Restore non-time-stretched playback Obnovit neÄasovÄ› roztažené pÅ™ehrávání &Transform &PromÄ›na Scroll the current pane to the left ProjíždÄ›t nynÄ›jší tabulkou vlevo Show the layer property boxes at the side of the main window Ukázat okénka vlastností vrstev po stranÄ› hlavního okna Add %1 Pane PÅ™idat %1 tabulku &About Sonic Visualiser &O programu Sonic Visualiser Re-open Otevřít znovu <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. <b>PÅ™etíženo</b><p>Zpracování rychlosti pÅ™ehrávání zvuku bylo omezeno na jeden kanál kvůli pÅ™etížení pÅ™i zpracování. <b>Save failed</b><p>Session file "%1" could not be saved. <b>Uložení se nezdaÅ™ilo</b><p>Soubor se sezením "%1" se nepodaÅ™ilo uložit. Export the visible area only (%1x%2 pixels) Vyvést pouze viditelnou oblast (%1x%2 pixelů) Export the whole pane (%1x%2 pixels) Vyvést celou tabulku (%1x%2 pixelů) Adjust the application preferences Upravit nastavení programu Play&back &PÅ™ehrávání Release Vydání <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. <b>PÅ™etíženo</b><p>Poslech přídavných modulů zvukových efektů byl zakázán kvůli pÅ™etížení pÅ™i zpracování. Navigate Navedení Import an extra audio file into a new pane Zavést další zvukový soubor do nové tabulky Failed to open location UmístÄ›ní se nepodaÅ™ilo otevřít Save the current session into a Sonic Visualiser session file Uložit nynÄ›jší sezení do souboru se sezením programu Sonic Visualiser &Delete Pane &Smazat tabulku Export layer to "%1" Vyvést vrstvu do "%1" Select &Visible Range Vybrat &viditelný rozsah Ctrl+Home Ctrl+Home Ctrl+PgUp Ctrl+PgUp Ctrl+Left Ctrl+Å¡ipka vlevo Treat multiple audio files as versions of the same work, and align their timelines S více zvukovými soubory zacházet jako s verzemi téže práce a zarovnat jejich Äasové přímky <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>Zvuková výstupní knihovna JACK v%1 &copy; Paul Davis a Jack O'Quin &Insert Instant at Playback Position &Vložit okamžik v poloze pÅ™ehrávání Renumber the selected instants using the current labelling scheme PÅ™eÄíslovat vybrané okamžiky za použití nynÄ›jšího Å¡títkovacího plánu Select to &Start Vybrat po &zaÄátek <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>Datové skladiÅ¡tÄ› RDF Redland &copy; Dave Beckett a the University of Bristol Edit the currently active layer as a data grid Upravit nyní Äinnou vrstvu jako datovou mřížku <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 <b>Varování pÅ™i znovuvytváření vrstvy</b><p>PÅ™i znovuvytváření odvozené vrstvy "%1" za použití nového datového modelu jako vstupu:<p>%2 C&lear Selection Vyprázd&nit výbÄ›r Failed to write file Soubor se nepodaÅ™ilo zapsat Release %1 : Revision %2 Vydání %1: Revize %2 <br>With Raptor RDF parser v%1 &copy; Dave Beckett and the University of Bristol <br>Se syntaktickým analyzátorem RDF Raptor v%1 &copy; Dave Beckett a the University of Bristol Export the selected regions into a single audio file Vyvést vybrané oblasti do jednoho zvukového souboru <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. <b>Å patný vzorkovací kmitoÄet</b><p>Vzorkovací kmitoÄet tohoto zvukového souboru (%1 Hz) neodpovídá nynÄ›jší rychlosti pÅ™ehrávání (%2 Hz).<p>Soubor bude pÅ™ehráván se Å¡patnou rychlostí a výškou.<p>Změňte volbu <i>PÅ™evzorkovat neodpovídající soubory pÅ™i zavedení</i>, která je v nabídce <i>Soubor</i> -> <i>Nastavení</i>, pokud toto chování chcete zmÄ›nit. Select target for import Vybrat cíl pro zavedení Rewind to Similar Point PÅ™etoÄit k podobnému bodu Fast Forward Rychle vpÅ™ed Fast forward Rychle vpÅ™ed Which region from the original audio file do you want to export? Kterou oblast z původního zvukového souboru chcete vyvést? Manage Exported Templates Spravovat vyvedené pÅ™edlohy Multiple regions of the original audio file are selected. What do you want to export? Je vybráno více oblastí původního zvukového souboru. Co chcete vyvést? Set Numbering Counters... Nastavit Äíslovací poÄítadla... Add a new pane showing a spectrogram set up for an overview of note pitches PÅ™idat novou tabulku ukazující spektrogram nastavený na pÅ™ehled výšek not Shift+G Shift+G Shift+K Shift+K Shift+M Shift+M Shift+U Shift+U Shift+W Shift+W Ctrl+Shift+Enter Ctrl+Shift+Enter Audio processing overload PÅ™etížení zpracování zvuku Save session as "%1" Uložit sezení jako "%1" <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? <b>Sezení bylo upraveno</b><p>NynÄ›jší sezení bylo upraveno.<br>Chcete je uložit? <br>With FFTW3 &copy; Matteo Frigo and MIT <br>FFTW3 &copy; Matteo Frigo and MIT Failed to save image file Soubor s obrázkem se nepodaÅ™ilo uložit Reset Counters Nastavit znovu poÄítadla Select &All Vybrat &vÅ¡e Fast Forward to Next Point Rychle vpÅ™ed k dalšímu bodu <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>Datové skladiÅ¡tÄ› RDF Redland v%1 &copy; Dave Beckett a the University of Bristol Show all texts and scale Ukázat vÅ¡echny texty a stupnici <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>libsndfile v%1 &copy; Erik de Castro Lopo Import layer data from an existing file Zavést data vrstvy ze stávajícího souboru <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>Podpora pro přídavné moduly DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton Add a new pane showing a waveform view PÅ™idat novou tabulku ukazující pohled na Äasový průbÄ›h vlny Hide centre indicator, frame times, layer names and scale Skrýt stÅ™edový ukazatel, Äasy snímků, názvy vrstev a stupnici Which region of the current pane do you want to export as an image? Kterou oblast nynÄ›jší tabulky chcete vyvést jako obrázek? Increase the zoom level Zvýšit úroveň zvÄ›tÅ¡ení Decrease the zoom level Snížit úroveň zvÄ›tÅ¡ení Add a new empty layer of type %1 PÅ™idat novou prázdnou vrstvu typu %1 Scroll &Right ProjíždÄ›t do&prava Add &New Pane PÅ™idat &novou tabulku Export Annotation Layer... Vyvést poznámkovou vrstvu... &Export Audio File... &Vyvést zvukový soubor... Export multiple audio files Vyvést více zvukových souborů Close the current session and create a new one Zavřít nynÄ›jší sezení a vytvoÅ™it nové Add a new pane showing a spectrogram PÅ™idat novou tabulku ukazující spektrogram Select the whole duration of the current session Vybrat celou dobu trvání nynÄ›jšího sezení %1 by Maker %1 podle tvůrce &New Session &Nové sezení Fast forward to the next point in the current layer Rychle vpÅ™ed k dalšímu bodu v nynÄ›jší vrstvÄ› Re-open the current or most recently opened file Otevřít znovu nynÄ›jší nebo naposledy otevÅ™ený soubor Newer version available Je dostupná novÄ›jší verze Release %1 Vydání %1 <br>With Raptor RDF parser &copy; Dave Beckett and the University of Bristol <br>Se syntaktickým analyzátorem RDF Raptor &copy; Dave Beckett a the University of Bristol <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform "%1" failed.<p>No error information is available. <b>VytvoÅ™ení vrstvy se nezdaÅ™ilo</b><p>NepodaÅ™ilo se vytvoÅ™it odvozenou vrstvu.<p>PromÄ›na vrstvy "%1" se nezdaÅ™ila.<p>Nejsou dostupné žádné informace o chybÄ›. Editing Úpravy Scroll &Left ProjíždÄ›t &doleva %1 by Category %1 podle skupiny Show &Minimal Overlays Ukázat nej&menší pÅ™ekrytí Peek Left Letmo prohlédnout vlevo Add this data to the current session PÅ™idat tato data do nynÄ›jšího sezení Unreleased : Revision %1 Nevydáno: Revize %1 http://www.sonicvisualiser.org/ http://www.sonicvisualiser.org/ Please enter the URL of the location to open: Zadejte, prosím adresu (URL) umístÄ›ní, které se má otevřít: Add Spectr&um PÅ™idat spektr&um &Preferences... &Nastavení... Edit Layer Data Upravit data vrstvy Open a window showing the keystrokes you can use in Sonic Visualiser Otevřít okno ukazující klávesové zkratky, které lze použít v programu Sonic Visualiser &Delete Current Measurement &Smazat nynÄ›jší měření Unknown Neznámý Export image to "%1" Vyvést obrázek do "%1" <br>With Rasqal RDF query engine v%1 &copy; Dave Beckett and the University of Bristol <br>Se strojem na dotazy RDF Rasqal v%1 &copy; Dave Beckett a the University of Bristol Which audio file do you want to export from? Ze kterého zvukového souboru chcete provést vyvedení? Playback and Transport Controls Ovládání pÅ™ehrávání a pÅ™esunu &Rename Layer... &PÅ™ejmenovat vrstvu... Enter template name Zadat název pÅ™edlohy Make measurements in layer UdÄ›lat měření ve vrstvÄ› Selection: %1 to %2 (duration %3) VýbÄ›r: %1 až %2 (doba trvání %3) Display Features Funkce zobrazení <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>Zvuková výstupní knihovna JACK &copy; Paul Davis a Jack O'Quin &Delete Selected Items &Smazat vybrané položky <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>Zvuková výstupní knihovna PulseAudio &copy; Lennart Poettering a Pierre Ossman Bright Purple SvÄ›tlepurpurová Scroll the current pane a big step to the left ProjíždÄ›t nynÄ›jší tabulkou velkým skokem vlevo Zoom to &Fit &PÅ™izpůsobit oknu Add S&lice of Layer PÅ™idat k&us vrstvy Ctrl+Shift+A Ctrl+Shift+A Ctrl+Shift+D Ctrl+Shift+D Ctrl+Shift+O Ctrl+Shift+O Ctrl+Shift+S Ctrl+Shift+S Ctrl+Shift+V Ctrl+Shift+V Rewind to the previous similarly valued time instant PÅ™etoÄit k pÅ™edchozímu podobnÄ› ohodnocenému okamžiku v Äase Peek Right Letmo prohlédnout vpravo Export the selected regions into separate files Vyvést vybrané oblasti do oddÄ›lených souborů Shift+Left Shift+Å¡ipka vlevo Shift+PgUp Shift+PgUp <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>Podpora pro přídavné moduly LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld Add a new layer showing a frequency spectrum PÅ™idat novou vrstvu ukazující kmitoÄtové spektrum Align File Timelines Zarovnat Äasové přímky souborů Warning Varování Show context help information in the status bar at the bottom of the window Ukázat související nápovÄ›du ve stavovém řádku okna dole Show Property Bo&xes Ukázat &okénka vlastností Note: the whole pane is too wide to be exported as a single image. Poznámka: celá tabulka je příliÅ¡ Å¡iroká na to, aby mohla být vyvedena jako jeden obrázek. Failed to generate layer Vrstvu se nepodaÅ™ilo vytvoÅ™it Draw new items in layer Nakreslit položky ve vrstvÄ› Export Image File... Vyvést obrázkový soubor... Fast Forward to End PÅ™etáÄet rychle na konec Delete items in current selection from the current layer Smazat položky v nynÄ›jším výbÄ›ru z nynÄ›jší vrstvy Repeat Transform Opakovat promÄ›nu Time-stretch playback to slow it down without changing pitch PÅ™ehrávání roztažení Äasu kvůli jeho zpomalení bez zmÄ›ny výšky Template file exists Soubor s pÅ™edlohou existuje Bright Red SvÄ›tleÄervená &Delete Layer &Smazat vrstvu Sonic Visualiser on the &Web Sonic Visualiser na &internetu <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>libsamplerate v%1 &copy; Erik de Castro Lopo Select from the current playback position to the end of the session Vybrat od nynÄ›jší polohy pÅ™ehrávání po konec sezení Select ranges Vybrat rozsah Failed to regenerate layer Vrstvu se nepodaÅ™ilo vytvoÅ™it znovu Constrain playback to the selected regions Omezit pÅ™ehrávání na vybrané oblasti <br>With RtMidi &copy; Gary P. Scavone <br>RtMidi &copy; Gary P. Scavone Copy the selection from the current layer to the clipboard Kopírovat výbÄ›r z nynÄ›jší vrstvy do schránky Rewind to Previous Point PÅ™etoÄit k pÅ™edchozímu bodu Add &Melodic Range Spectrogram PÅ™idat spektrogram &melodického rozsahu Show information about Sonic Visualiser Ukázat informace o programu Sonic Visualiser <p><small>%1 : %2 configuration</small></p> <p><small>%1 : %2 nastavení</small></p> <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? <b>Soubor s pÅ™edlohou existuje</b><p>PÅ™edloha "%1" existuje.<br>PÅ™epsat ji? Panning and Navigation NajíždÄ›ní a navádÄ›ní Add Spectro&gram PÅ™idat spektro&gram [\(<].*$ [\(<].*$ Add a new pane showing a frequency spectrum PÅ™idat novou tabulku ukazující kmitoÄtové spektrum Export audio to "%1" Vyvést zvuk do "%1" <b>Open failed</b><p>File or URL "%1" could not be opened <b>OtevÅ™ení se nezdaÅ™ilo</b><p>Soubor nebo adresu (URL) "%1" se nepodaÅ™ilo otevřít Bright Orange SvÄ›tleoranžová Open &Recent Otevřít &naposledy otevÅ™ený soubor Ctrl+Right Sonic Visualiser: %1 Sonic Visualiser: %1 <b>File open failed</b><p>Audio file "%1" could not be opened <b>Soubor se nepodaÅ™ilo otevřít</b><p>Zvukový soubor "%1" se nepodaÅ™ilo otevřít Add a new layer showing a spectrogram set up for tracking frequencies PÅ™idat novou vrstvu ukazující spektrogram nastavený na sledování kmitoÄtů Bright Blue SvÄ›tlemodrá Show or hide all time rulers Ukázat nebo skrýt vÅ¡echna Äasová pravítka <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>Dekodér souborů mp3 MAD v%1 &copy; Underbit Technologies Inc <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam <br>Podpora pro přídavné moduly Vamp (API v%1, host SDK v%2) &copy; Chris Cannam Unclassified Bez zaÅ™azení Rewind to Start PÅ™etoÄit na zaÄátek Add &Waveform PÅ™idat &Äasový průbÄ›h vlny Open Lo&cation... Otevřít &umístÄ›ní... File Toolbar Nástrojový pruh pro soubor <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? <b>Vybrat cíl pro zavedení</b><p> Tento dokument RDF odkazuje na jeden nebo více zvukových souborů.<p>Již jste nahrál jeden zvukový Äasový průbÄ›h vlny.<br>Co chcete udÄ›lat s novými daty? Scroll the current pane a big step to the right ProjíždÄ›t nynÄ›jší tabulkou velkým skokem vpravo Session modified Sezení bylo upraveno Select from the start of the session to the current playback position Vybrat od zaÄátku sezení po nynÄ›jší polohu pÅ™ehrávání Show &No Overlays &Neukazovat žádná pÅ™ekrytí Add a new layer showing a spectrogram set up for an overview of note pitches PÅ™idat novou vrstvu ukazující spektrogram nastavený na pÅ™ehled výšek not <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %3 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> <h3>Je dostupná novÄ›jší verze</h3><p>Používáte verzi %1 programu Sonic Visualiser, ale nyní je dostupná verze %3.</p><p>Podívejte se, prosím, na stránky <a href="http://sonicvisualiser.org/">projektu Sonic Visualiser</a>, abyste získal více informací.</p> Edit Toolbar Nástrojový pruh pro úpravy Abandon the current %1 session and start a new one Opustit nynÄ›jší sezení %1 a zaÄít nové Replace &Main Audio... Nahradit &hlavní zvuk... Replace the main audio file of the session with a different file Nahradit soubor s hlavním zvukem v tomto sezení jiným souborem Save the current session into a %1 session file Uložit nynÄ›jší sezení do %1 souboru se sezením Save the current session into a new %1 session file Uložit nynÄ›jší sezení do nového %1 souboru se sezením Exit %1 UkonÄit %1 Reset Numbering Counters Nastavit Äíslovací poÄítadla znovu Reset to 1 all the counters used for counter-based labelling Nastavit na 1 vÅ¡echna poÄítadla používaná pro Å¡títkování založené na poÄítadlech Show &Centre Line Ukázat &stÅ™edovou linku ' ' Show or hide the centre line Ukázat nebo skrýt stÅ™edovou linku Toggle All Time Rulers PÅ™epnout vÅ¡echna Äasová pravítka Hide times, layer names, and scale Skrýt Äasy, názvy vrstev, a stupnici Show times and basic scale Ukázat Äasy a základní stupnici Show times, layer names, and scale Ukázat Äasy, názvy vrstev, a stupnici Go Full-Screen Jít na celou obrazovku F11 F11 Expand the pane area to the whole screen Rozšířit oblast tabulky na celou obrazovku Open the %1 reference manual Otevřít odbornou příruÄku k %1 Open a window showing the keystrokes you can use in %1 Otevřít okno ukazující klávesové zkratky, které lze použít v programu %1 %1 on the &Web %1 na &internetu Open the %1 website Otevřít internetové stránky programu %1 &About %1 &O programu %1 Show information about %1 Ukázat informace o programu %1 Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Promiňte, ale typ této vrstvu nelze vyvést do RDF (podporovanými typy jsou: oblast, poznámka, text, okamžiky Äasu. hodnoty Äasu) Set as default template for future audio files Nastavit jako výchozí pÅ™edlohu pro budoucí zvukové soubory %1: %1 %1: %1 <br>With Serd and Sord RDF parser and store &copy; David Robillard <br>Syntaktický analyzátor Serd a Sord RDF a ukládání &copy; David Robillard <br>With Dataquay Qt/RDF library &copy; Chris Cannam <br>Knihovna Dataquay Qt/RDF &copy; Chris Cannam Export audio from selection into a data file Vyvést zvuk z výbÄ›ru do datového souboru Export the selected regions into a single file Vyvést vybrané oblasti do jednoho souboru Export the whole file Vyvést celý soubor Playback Speed Rychlost pÅ™ehrávání Export Audio Data... Vyvést zvuková data... Export Annotation La&yer... Vyvést poznámkovou &vrstvu... Ctrl+Y Ctrl+Y Browse Recorded Audio Folder Procházet složku s nahraným zvukem Open the Recorded Audio folder in the system file browser Otevřít složku s nahraným zvukem v systémovém prohlížeÄi souborů Ctrl+Shift+Return Ctrl+Shift+Enter Show &Unit Converter Ukázat pÅ™evodník &jednotek Open a window of pitch and timing conversion utilities Otevřít okno s nástroji na pÅ™evádÄ›ní výšek tónů a Äasování Switch to Previous Layer PÅ™epnout na pÅ™edchozí vrstvu { { Make the previous layer in the pane current UdÄ›lat pÅ™edchozí vrstvu v tabulce nynÄ›jší Switch to Next Layer PÅ™epnout na další vrstvu } } Make the next layer in the pane current UdÄ›lat další vrstvu v tabulce nynÄ›jší Record Nahrát Ctrl+Space Ctrl+Mezerník Record a new audio file Nahrát nový zvukový soubor Navigate Tool Mouse Actions ÄŒinnosti nástroje pro navedení provádÄ›né myší Click left button and drag to move around KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro pÅ™esouvání Zoom to Area PÅ™iblížit oblast Shift-click left button and drag to zoom to a rectangular area Shift a klepnÄ›te levým tlaÄítkem a táhnÄ›te pro pÅ™iblížení obdélníkové oblasti Relocate PÅ™emístit Double-Click Left Dvakrát klepnÄ›te levým Double-click left button to jump to clicked location Dvakrát klepnÄ›te levým tlaÄítkem pro skok na klepnuté místo Double-click left button on an item to edit it Dvakrát klepnÄ›te levým tlaÄítkem na položce pro její upravení Select Tool Mouse Actions ÄŒinnosti nástroje výbÄ›ru provádÄ›né myší Click left button and drag to select region; drag region edge to resize KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r oblasti; táhnÄ›te za okraj oblasti pro zmÄ›nu její velikosti Multi Select Vícenásobný výbÄ›r Cmd-click left button and drag to select an additional region Ctrl a klepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r další oblasti Ctrl-click left button and drag to select an additional region Ctrl a klepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r další oblasti Fine Select Citlivý výbÄ›r Shift-click left button and drag to select without snapping to items or grid Shift a klepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r bez pÅ™ichytávání k položkám nebo mřížce Edit Tool Mouse Actions ÄŒinnosti nástroje úprav provádÄ›né myší Move Posunout Click left button on an item or selected region and drag to move KlepnÄ›te levým tlaÄítkem na položku nebo vybranou oblast a táhnÄ›te pro její pÅ™esun Draw Tool Mouse Actions ÄŒinnosti nástroje kreslení provádÄ›né myší Click left button and drag to create new item KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro vytvoÅ™ení nové položky Erase Tool Mouse Actions ÄŒinnosti nástroje vymazání provádÄ›né myší Click left button on an item to remove it from the layer KlepnÄ›te levým tlaÄítkem na položku pro její odstranÄ›ní z vrstvy Measure Tool Mouse Actions ÄŒinnosti nástroje měření provádÄ›né myší Measure Area Oblast měření Click left button and drag to measure a rectangular area KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro změření obdélníkové oblasti Measure Item Položka měření Click left button and drag to measure extents of an item or shape KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro změření rozsahu položky nebo tvaru 1. %2 1. %2 %1. %2 %1: %2 Multiplex all of the above VícenásobnÄ› vÅ¡e z výše Playback speed: %1% (%2x slower) Rychlost pÅ™ehrávání: %1% (%2x pomalejÅ¡i) Playback speed: %1% (%2x faster) Rychlost pÅ™ehrávání: %1% (%2x rychlejší) Problems loading plugins Potíže pÅ™i nahrávání přídavných modulů <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform %1failed:<p>%2 <b>VytvoÅ™ení vrstvy se nezdaÅ™ilo</b><p>NepodaÅ™ilo se vytvoÅ™it odvozenou vrstvu.<p>PromÄ›na vrstvy "%1" se nezdaÅ™ila:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform %1failed.<p>No error information is available. <b>VytvoÅ™ení vrstvy se nezdaÅ™ilo</b><p>NepodaÅ™ilo se vytvoÅ™it odvozenou vrstvu.<p>PromÄ›na vrstvy "%1" se nezdaÅ™ila.<p>Nejsou dostupné žádné informace o chybÄ›. <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %2 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> <h3>Je dostupná novÄ›jší verze</h3><p>Používáte verzi %1 programu Sonic Visualiser, ale nyní je dostupná verze %2.</p><p>Podívejte se, prosím, na stránky <a href="http://sonicvisualiser.org/">projektu Sonic Visualiser</a>, abyste získal více informací.</p> Export SVG File... Vyvést do souboru SVG... Export a single pane to a scalable SVG image file Vyvést jednu tabulku do Å¡kálovatelného obrázkového souboru SVG Subdivide Selected Instants... RozdÄ›lit vybrané okamžiky na menší Äásti... Add new instants at regular intervals between the selected instants PÅ™idat nové okamžiky v pravidelných odstupech mezi vybranými okamžiky Winnow Selected Instants... Protřídit vybrané okamžiky... Remove subdivisions, leaving only every Nth instant Odstranit rozdÄ›lení na menší Äásti, ponechaje jen každý n-tý okamžik Export the whole pane Vyvést celou tabulku Export the visible area only Vyvést pouze viditelnou oblast Which region of the current pane do you want to export as a scalable SVG image? Kterou oblast nynÄ›jší tabulky chcete vyvést jako Å¡kálovatelný obrázek SVG? Failed to save SVG file Soubor SVG se nepodaÅ™ilo uložit Failed to save SVG file %1 NepodaÅ™ilo se uložit soubor SVG %1 Subdivide instants RozdÄ›lit okamžiky na menší Äásti Number of subdivisions: PoÄet rozdÄ›lení na menší Äásti: Winnow instants Protřídit body Remove all instants apart from multiples of: Odstranit vÅ¡echny okamžiky kromÄ› násobků: <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment:<p>%1 <b>SpoÄítání zarovnání se nezdaÅ™ilo</b><p>NepodaÅ™ilo se spoÄítat zarovnání zvuku<p>%1 Adjust the master playback level and pan PÅ™izpůsobit hlavní úroveň pÅ™ehrávání a vyvážení With Qt v%1 &copy; The Qt Company Qt verze %1 &copy; spoleÄnost Qt <br>With Rubber Band Library v%1 &copy; Particular Programs Ltd <br>Knihovna Rubber Band verze %1 &copy; Particular Programs Ltd <br>With Rubber Band Library &copy; Particular Programs Ltd <br>Knihovna Rubber Band &copy; Particular Programs Ltd <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam and QMUL <br>Podpora pro přídavné moduly Vamp (API verze %1, host SDK verze %2) &copy; Chris Cannam and QMUL <br>With Dataquay Qt/RDF library &copy; Particular Programs Ltd <br>Knihovna Dataquay Qt/RDF &copy; Particular Programs Ltd <br>With Cap'n Proto serialisation &copy; Sandstorm Development Group <br>Vydávání na pokraÄování Cap'n Proto &copy; Vývojová skupina Sandstorm What's &New? Co je &nového? Show changes in this release of %1 Ukázat zmÄ›ny v tomto vydání %1 Failed to query transform attributes NepodaÅ™ilo se zeptat se na vlastnosti promÄ›n <b>Failed to query transform attributes</b><p>Plugin or server error: %1</p> <b>NepodaÅ™ilo se zeptat se na vlastnosti promÄ›n</b><p>Chyba přídavného modulu nebo serveru: %1</p> Transform failed PromÄ›na selhala <b>Failed to run transform</b><p>Plugin or server error: %1</p> <b>NepodaÅ™ilo se spustit promÄ›nu</b><p>Chyba přídavného modulu nebo serveru: %1</p> What's New Co je nového <h3>What's New in %1</h3> <h3>Co je nového v %1</h3> <b>Note:</b> A newer version of Sonic Visualiser is available.<br>(Version %1 is available; you are using version %2) <b>Poznámka:</b> Je dostupná novÄ›jší verze programu Sonic Visualiser.<br>(je dostupná verze %1; používáte verzi %2) %1 : %2 configuration, %3-bit build %1 : %2 nastavení, %3-bitové sestavení About %1 O %1 Multiplexed audio Víceproudý zvuk <br>With Piper Vamp protocol bridge &copy; QMUL <br>Můstkový komunikaÄní protokol Piper Vamp &copy; QMUL Russian UI translation contributed by Alexandre Prokoudine. Czech UI translation contributed by Pavel Fric. MainWindowBase Cut Vyjmout Paste Vložit Couldn't open audio device NepodaÅ™ilo se otevřít zvukové zařízení %1: %2 %1: %2 %1 (modified) %1 (upraveno) Failed to import RDF NepodaÅ™ilo se zavést RDF <b>No audio available</b><p>Could not open an audio device for playback.<p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>Žádný zvuk není dostupný</b><p> Zvukové zařízení se nepodaÅ™ilo otevřít pro pÅ™ehrávání.<p>Automatické urÄení zvukového zařízení se nezdaÅ™ilo. PÅ™ehrávání zvuku bÄ›hem tohoto sezení nebude dostupné.</p> Add Point PÅ™idat bod <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? <b>Vybrat cíl pro zavedení</b><p>Již máte nahrán jeden zvukový soubor.<br>Co chcete udÄ›lat s novým zvukovým souborem? Replace the main audio file in this session Nahradit soubor s hlavním zvukem v tomto sezení <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> <b>NepodaÅ™ilo se zavést RDF</b><p>Nebyly nalezeny žádné vhodné datové modely pro zavedení dat z dokumentu RDF na "%1"</p> Opening session... Otevírá se sezení... %1: %2 [%3] %1: %2 [%3] Import MIDI file "%1" Zavést soubor MIDI "%1" SV XML file read error: %1 Chyba pÅ™i Ätení souboru XML SV: %1 Import "%1" Zavést "%1" Playing: %1 of %2 (%3 remaining) PÅ™ehrává se: %1 z %2 (%3 zůstává) Failed to write file Soubor se nepodaÅ™ilo zapsat Select target for import Vybrat cíl pro zavedení Import layer XML file "%1" Zavést soubor XML vrstvy "%1" <b>No audio available</b><p>Failed to open your preferred audio device ("%1").<p>Audio playback will not be available during this session.</p> <b>Žádný zvuk není dostupný</b><p> Vámi upÅ™ednostňované zvukové zařízení se nepodaÅ™ilo otevřít ("%1").<p>PÅ™ehrávání zvuku bÄ›hem tohoto sezení nebude dostupné.</p> Delete Pane Smazat tabulku Add the audio file to this session PÅ™idat soubor se zvukem do tohoto sezení Add Pane PÅ™idat tabulku <b>Save failed</b><p>Failed to write to file "%1": %2 <b>Uložení se nezdaÅ™ilo</b><p>NepodaÅ™ilo se zapsat do souboru "%1": %2 (modified) (upraveno) Close the current session and start a new one Zavřít nynÄ›jší sezení a zaÄít nové Importing from RDF... Zavádí se z RDF... Remove Pane Odstranit tabulku Open session template "%1" Otevřít pÅ™edlohu sezení "%1" Add Item at %1 s PÅ™idat položku v %1 s Import audio file "%1" Zavést zvukový soubor "%1" Opening playlist... Otevírá se seznam skladeb... Opening file or URL... Otevírá se soubor nebo adresa (URL)... Import session file "%1" Zavést soubor se sezením "%1" Import RDF document "%1" Zavést dokument RDF "%1" Add Point at %1 s PÅ™idat bod v %1 s <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>NepodaÅ™ilo se zavést RDF</b><p>Zavedení dat z dokumentu RDF na "%1" se nepodaÅ™ilo: %2</p> Import Recorded Audio Zavést nahraný zvuk Recording: %1 Nahrává se: %1 Not enough disc space Nedostatek místa na disku <b>Not enough disc space</b><p>There doesn't appear to be enough spare disc space to accommodate any necessary temporary files.</p><p>Please clear some space and try again.</p> <b>Nedostatek místa na disku</b><p></p>Zdá se, že na disku není dostatek místa na to, aby pojalo vÅ¡echny nezbytné doÄasné soubory.<p> </p><p>UvolnÄ›te, prosím, nÄ›jaké místo a zkuste to znovu.</p> <b>No audio available</b><p>Could not open an audio device.</p> <b>Není dostupný žádný zvuk</b><p>NepodaÅ™ilo se otevřít zvukové zařízení.</p> <b>No audio available</b><p>Could not open audio device: %1</p> <b>Není dostupný žádný zvuk</b><p>NepodaÅ™ilo se otevřít zvukové zařízení: %1</p> <p>Automatic audio device detection failed. Audio playback and recording will not be available during this session.</p> <p>Automatické zjiÅ¡tÄ›ní zvukového zařízení selhalo. PÅ™ehrávání zvuku a nahrávání nebudou bÄ›hem tohoto sezení dostupné.</p> <p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <p>Automatické zjiÅ¡tÄ›ní zvukového zařízení selhalo. PÅ™ehrávání zvuku nebude bÄ›hem tohoto sezení dostupné.</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1").</p> <b>Není dostupný žádný zvuk</b><p>NepodaÅ™ilo se otevřít vámi upÅ™ednostňovaný ovladaÄ zvuku ("%1").</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1"): %2.</p> <b>Není dostupný žádný zvuk</b><p>NepodaÅ™ilo se otevřít vámi upÅ™ednostňovaný ovladaÄ zvuku ("%1"): %2.</p> <p>Audio playback and recording will not be available during this session.</p> <p>PÅ™ehrávání zvuku a nahrávání nebudou bÄ›hem tohoto sezení dostupné.</p> <p>Audio playback will not be available during this session.</p> <p>PÅ™ehrávání zvuku nebude bÄ›hem tohoto sezení dostupné.</p> No record device available Není dostupné žádné nahrávací zařízení <b>No record device available</b><p>Failed to find or open an audio device for recording. Only playback will be available.</p> <p>Není dostupné žádné nahrávací zařízení.</b><p>NepodaÅ™ilo se najít nebo otevřít zvukové zařízení pro nahrávání. Bude dostupné pouze pÅ™ehrávání.</p> Recording failed Nahrávání selhalo <b>Recording failed</b><p>Failed to switch to record mode (some internal problem?)</p> <b>Nahrávání selhalo</b><p>NepodaÅ™ilo se pÅ™epnout do nahrávacího režimu (nÄ›jaké potíže uvnitÅ™?)</p> Not enough memory <b>Not enough memory</b><p>There doesn't appear to be enough memory to accommodate any necessary temporary data.</p> ModelDataTableDialog Play Mode Toolbar Nástrojový pruh pro režim hry Find: Hledat: Delete the selected item or items Smazat vybranou položku nebo položky Delete Smazat Data Editor Editor dat Insert Vložit Insert New Item Vložit novou položku Insert a new item Vložit novou položku Toggle tracking of playback position PÅ™epnout sledování polohy pÅ™ehrávání Playback Toolbar Nástrojový pruh pro pÅ™ehrávání Data in Layer Data ve vrstvÄ› Track Playback PÅ™ehrávání stopy Delete Selected Items Smazat vybrané položky Edit Toolbar Nástrojový pruh pro úpravy ModelMetadataModel Name Název Type Typ Maker Tvůrce Source Zdroj ModelTransformerFactory %1: %2 %1: %2 %1 <%2> %1 <%2> NetworkPermissionTester Welcome to Sonic Visualiser Vítejte v Sonic Visualiseru Allow this Povolit <h2>Welcome to Sonic Visualiser!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.</p><p>Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.</p><p><hr></p><p><b>Before we go on...</b></p><p>Sonic Visualiser would like permission to use the network.</p> <h2>Vítejte v Sonic Visualiseru!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Sonic Visualiser je program na zobrazování a zkoumání zvukových dat pro semantický rozbor hudby a psaní poznámek.</p><p>Vyvíjen ve StÅ™edisku pro digitální hudbu (Centre for Digital Music) na londýnské univerzitÄ› královny Marie (Queen Mary University of London), Sonic Visualiser je program s otevÅ™eným zdrojovým kódem pod veÅ™ejnou obecnou licencí GNU (GNU General Public License).</p><p><hr></p><p><b>PÅ™edtím než budeme pokraÄovat...</b></p><p>Sonic Visualiser chce požádat o svolení k používání sítÄ›.</p> <p>This is to:</p><ul><li> Find information about available and installed plugins;</li><li> Support the use of Open Sound Control; and</li><li> Tell you when updates are available.</li></ul> <p>ÚÄelem je:</p><ul><li> Najít informace o dostupných a nainstalovaných přídavných modulech;</li><li> PodpoÅ™it používání Open Sound Control; a</li><li> Říct vám, když jsou dostupné aktualizace.</li></ul> <p>This is to:</p><ul><li> Find information about available and installed plugins; and</li><li> Tell you when updates are available.</li></ul> <p>ÚÄelem je:</p><ul><li> Najít informace o dostupných a nainstalovaných přídavných modulech;</li><li> Říct vám, když jsou dostupné aktualizace.</li></ul> <p><b>No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else.</b> We will however make aggregate counts of distinct requests for usage reporting.</p><p>We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.<br></p> <p><b>Nebudou odesílány žádné osobní informace, neprovádí se žádné sledování, a žádné údaje o jednotlivci nebudou s nikým dalším sdíleny.</b> NicménÄ› budeme dÄ›lat úhrnné souÄty odliÅ¡ných požadavků pro zpravodajství o užití.</p><p>DoporuÄujeme, abyste toto povolil, protože to pro vás dÄ›lá Sonic Visualiser užiteÄnÄ›jším a podporuje veÅ™ejné financování této práce. Pokud si to vÅ¡ak nepÅ™ejete, zruÅ¡te, prosím, zaÅ¡krtnutí okénka níže.<br></p> NoteLayer Log Zápis %1 %2 %1 %2 Paste Vložit Scale Stupnice No local points Žádné místní body The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? %1 (%2, %3 Hz) %1 (%2, %3 Hz) Auto-Align Automatické zarovnání Vertical Scale Svislá stupnice Resize Selection ZmÄ›nit velikost výbÄ›ru Linear PřímoÄaré Change Point Value ZmÄ›nit hodnotu bodu Edit Point Upravit bod Scale Units Jednotky stupnice Erase Point Vymazat bod Time: %1 Pitch: %2 Duration: %3 No label ÄŒas: %1 Výška: %2 Doba trvání: %3 Žádný Å¡títek Record Note Nahrát notu In progress Probíhá Drag Point Táhnout bod Draw Point Nakreslit bod New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Time: %1 Pitch: %2 Duration: %3 Label: %4 ÄŒas: %1 Výška: %2 Doba trvání: %3 Å títek: %4 Drag Selection Táhnout výbÄ›r %1 Hz (%2, %3) %1 Hz (%2, %3) MIDI Notes Noty MIDI Relocate Point PÅ™emístit bod Delete Selected Points Smazat vybrané body NoteModel Note Nota Time ÄŒas Frame Snímek Label Å títek Level Úroveň Pitch Výška tónu Edit Data Upravit data Unknown Neznámý Duration Doba trvání OggVorbisFileReader Decoding %1... Dekóduje se %1... Overview Click and drag to navigate; double-click to jump KlepnÄ›te a táhnÄ›te pro navedení; dvakrát klepnÄ›te pro skok Overview PÅ™ehled Pane (R) (R) +%1 +%1 (X) (X) Draw Nakreslit Edit Upravit Left Levé Menu Nabídka Move Posunout Zoom ZvÄ›tÅ¡ení Click left button and drag to measure a rectangular area KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro změření obdélníkové oblasti Double-Click Middle Dvakrát klepnÄ›te prostÅ™edním Edit Tool Mouse Actions ÄŒinnosti nástroje úprav provádÄ›né myší Draw Tool Mouse Actions ÄŒinnosti nástroje kreslení provádÄ›né myší Right Pravé Wheel KoleÄko Show pane context menu Ukázat nabídku související s tabulkou Multi Select Vícenásobný výbÄ›r Zoom In PÅ™iblížit Double-click middle button to relocate with any tool Dvakrát klepnÄ›te prostÅ™edním pro pÅ™emístÄ›ní s jakýmkoli nástrojem Shift-click left button and drag to zoom to a rectangular area Shift-klepnÄ›te levým tlaÄítkem a táhnÄ›te pro pÅ™iblížení obdélníkové oblasti %1 / %2Hz%3 %1 / %2Hz%3 Click and drag an item in the active layer to move it; hold Shift to override initial resistance KlepnÄ›te a táhnÄ›te položku v Äinné vrstvÄ› pro její pÅ™esun; držte klávesu Shift pro potlaÄení poÄáteÄního odporu Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate KlepnÄ›te a táhnÄ›te pro výbÄ›r rozsahu; držte klávesu Ctrl pro provedení vícenásobného výbÄ›ru; klepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení Reset horizontal and vertical zoom levels to their defaults Nastavit znovu úrovnÄ› vodorovného a svislého zvÄ›tÅ¡ení na jejich výchozí hodnoty Resize Selection ZmÄ›nit velikost výbÄ›ru Enter new range Zadejte nový rozsah Double-click left button on an item to edit it Dvakrát klepnÄ›te levým tlaÄítkem na položce pro její upravení Scroll rapidly left or right in time axis ProjíždÄ›t rychle vlevo nebo vpravo na Äasové ose Middle ProstÅ™ední Some lengthy prefix: PříliÅ¡ dlouhá pÅ™edpona: Scroll ProjíždÄ›t Select Vybrat Fine Select Citlivý výbÄ›r Zoom in or out in time axis PÅ™iblížit nebo oddálit na Äasové ose Click left button and drag to measure extents of an item or shape KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro změření rozsahu položky nebo tvaru Zoom Out Oddálit Click and drag to select a range; middle-click and drag to navigate KlepnÄ›te a táhnÄ›te pro výbÄ›r rozsahu; klepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení Scroll up or down in the vertical axis ProjíždÄ›t nahoru nebo dolů na svislé ose Reset zoom to default Nastavit zvÄ›tÅ¡ení znovu na výchozí Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate KlepnÄ›te a táhnÄ›te pro výbÄ›r rozsahu; držte klávesu Shift, abyste se vyhnul pÅ™ichytávání k položkám; klepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení Alt+Wheel Alt+koleÄko Click left button on an item or selected region and drag to move KlepnÄ›te levým tlaÄítkem na položku nebo vybranou oblast a táhnÄ›te pro její pÅ™esun Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate KlepnÄ›te a táhnÄ›te pro výbÄ›r rozsahu; držte klávesu Shift, abyste se vyhnul pÅ™ichytávání k položkám; držte klávesu Ctrl pro provedení vícenásobného výbÄ›ru; klepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení Click and drag to adjust the visible range of the vertical scale KlepnÄ›te a táhnÄ›te pro pÅ™izpůsobení viditelného rozsahu svislé stupnice Click and drag to navigate KlepnÄ›te a táhnÄ›te pro navedení Shift+Wheel Shift+koleÄko Click left button and drag to move around KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro pÅ™esouvání se Select Tool Mouse Actions ÄŒinnosti nástroje výbÄ›ru provádÄ›né myší Unaligned Nezarovnáno Click and drag to move all items in the selected range KlepnÄ›te a táhnÄ›te pro pÅ™esun vÅ¡ech položek ve vybraném rozsahu Aligned Zarovnáno %1 - %2 %1 - %2 Scroll Vertically ProjíždÄ›t svisle Navigate Navedení Ctrl+Left Ctrl+Å¡ipka vlevo Click and drag to move the selection boundary KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro pÅ™esun hranice výbÄ›ru Measure Tool Mouse Actions ÄŒinnosti nástroje měření provádÄ›né myší Ctrl-click left button and drag to select an additional region Ctrl-klepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r další oblasti Zoom in or out in the vertical axis PÅ™iblížit nebo oddálit na svislé ose Click to erase an item from the active layer KlepnÄ›te pro vymazání položky z Äinné vrstvy Drag Selection Táhnout výbÄ›r Vertical Zoom Svislé zvÄ›tÅ¡ení Click middle button and drag to navigate with any tool KlepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení s jakýmkoli nástrojem Double-Click Left Dvakrát klepnÄ›te levým Wheel Down KoleÄko dolů Shift-click left button and drag to select without snapping to items or grid Shift a klepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r bez pÅ™ichytávání k položkám nebo mřížce Relocate PÅ™emístit Aligning: %1% Zarovnání: %1% Navigate Tool Mouse Actions ÄŒinnosti nástroje pro navedení provádÄ›né myší Reference Odkaz General Pane Mouse Actions ÄŒinnosti provádÄ›né myší obecnÄ› v tabulce Zoom to Area PÅ™iblížit oblast Measure Area Oblast měření Measure Item Položka měření Shift+Left Shift+Å¡ipka vlevo Click and drag to adjust the horizontal zoom level KlepnÄ›te a táhnÄ›te pro pÅ™izpůsobení úrovnÄ› vodorovného zvÄ›tÅ¡ení Click left button and drag to select region; drag region edge to resize KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r oblasti; táhnÄ›te za okraj oblasti pro zmÄ›nu její velikosti Wheel Up KoleÄko nahoru Click and drag to adjust the vertical zoom level KlepnÄ›te a táhnÄ›te pro pÅ™izpůsobení úrovnÄ› svislého zvÄ›tÅ¡ení Horizontal Zoom Vodorovné zvÄ›tÅ¡ení Ctrl+Wheel Ctrl+koleÄko Zoom Vertically PÅ™iblížit/Oddálit svisle Click to add a new item in the active layer KlepnÄ›te pro pÅ™idání nové položky do Äinné vrstvy Double-click left button to jump to clicked location Dvakrát klepnÄ›te levým tlaÄítkem pro skok na klepnuté místo Click left button and drag to create new item KlepnÄ›te levým tlaÄítkem a táhnÄ›te pro vytvoÅ™ení nové položky New vertical display range, from %1 to %2 %4: Nový rozsah svislého zobrazení, od %1 do %2 %4: Cmd-click left button and drag to select an additional region Ctrl-klepnÄ›te levým tlaÄítkem a táhnÄ›te pro výbÄ›r další oblasti Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate KlepnÄ›te a táhnÄ›te pro výbÄ›r rozsahu; držte klávesu Shift, abyste se vyhnul pÅ™ichytávání k položkám; držte klávesu Ctrl pro provedení vícenásobného výbÄ›ru; klepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate KlepnÄ›te a táhnÄ›te pro výbÄ›r rozsahu; držte klávesu Ctrl pro provedení vícenásobného výbÄ›ru; klepnÄ›te prostÅ™edním tlaÄítkem a táhnÄ›te pro navedení PlayParameterRepository Change Playback Gain ZmÄ›nit zesílení pÅ™ehrávání Adjust Playback Parameters Upravit parametry pÅ™ehrávání Change Playback Mute State ZmÄ›nit stav ztlumení pÅ™ehrávání Change Playback Plugin ZmÄ›nit přídavný modul pÅ™ehrávání Change Playback Pan ZmÄ›nit vyvážení pÅ™ehrávání Configure Playback Plugin Nastavit přídavný modul pÅ™ehrávání Change Playback Sample ZmÄ›nit vzorek pÅ™ehrávání PluginParameterBox Program Program This plugin has no adjustable parameters. Tento přídavný modul nemá žádné upravitelné parametry. PluginParameterDialog is je are jsou Name: Název: Use mean of source channels Použít průmÄ›r ze zdrojových kanálů This plugin only has a single channel input, but the source has %1 channels. Tento přídavný modul má jednokanálový vstup, ale zdroj má %1 kanály. This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. Tento přídavný modul nepÅ™ijímá více než %1 vstupní kanály, ale dostupné jsou %2. Použije se pouze první %3. Use channel %1 only Použít pouze kanál %1 Advanced << PokroÄilé << Advanced >> PokroÄilé >> Maker: Tvůrce: Channel mismatch Nesoulad v kanálu Output: Výstup: Plugin Parameters Parametry přídavného modulu Window shape: Podoba okna: Processing Zpracování This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. Tento přídavný modul vyžaduje alespoň %1 vstupních kanálů, ale dostupné jsou pouze %2 %3. Přídavný modul pravdÄ›podobnÄ› nebude pracovat správnÄ›. Copyright: Autorské právo: Audio frames per block: Snímků zvuku na blok: Version: Verze: Window size: Velikost okna: Input Material Vstupní materiál Channels Kanály Window increment: Přírůstek okna: Restrict to selection extents Omezit na rozsah výbÄ›ru Preferences Hann Hann None Žádná Show splash screen on startup Ukázat úvodní obrazovku pÅ™i spuÅ¡tÄ›ní Location for cache file directory UmístÄ›ní adresáře s vyrovnávací pamÄ›tí Blackman Blackman 4 x Oversampling 4 x pÅ™evzorkování 24 FPS 24 snímků za sekundu (FPS) 25 FPS 25 snímků za sekundu (FPS) 30 FPS 30 snímků za sekundu (FPS) 50 FPS 50 snímků za sekundu (FPS) 60 FPS 60 snímků za sekundu (FPS) Font size for text overlays Velikost písma pro pÅ™ekrytí textem Spectral analysis window shape Podoba okna pro rozbor spektra Highest quality Nejvyšší kvalita Parzen Parzen Nuttall Nuttall Linear interpolation PřímoÄará interpolace Blackman-Harris Blackman-Harris Show box for current pane only Ukázat okénko pouze pro nynÄ›jší tabulku Resample mismatching files on import PÅ™evzorkovat neodpovídající soubory pÅ™i zavedení Background colour preference UpÅ™ednostňovaná barva pozadí Rectangular Obdélníková Triangular Trojúhelníková Gaussian Gauss Playback resampler type Typ pÅ™evzorkování pÅ™ehrávání Dark background Tmavé pozadí Standard Obvyklé Frequency of concert A KmitoÄet koncertního A Property box layout Rozvržení okénka vlastností Standard (to millisecond) Obvyklý (na milisekundy) Spectrogram x-axis interpolation: Interpolace osy x spektrogramu: Spectrogram y-axis interpolation: Interpolace osy y spektrogramu: Fastest Nejrychlejší Preferences Nastavení Omit temporaries from Recent Files menu Vynechat doÄasné z nabídky naposledy otevÅ™ených souborů Time display format Formát zobrazení Äasu Show boxes for all panes Ukázat okénka pro vÅ¡echny tabulky Follow desktop theme Držet se námÄ›tu plochy Hamming Hamming Light background SvÄ›tlé pozadí High resolution (to microsecond) Vysoké rozliÅ¡ení (na mikrosekundy) 4 x Oversampling with interpolation 4 x pÅ™evzorkování s interpolací Normalise audio signal when reading from audio file Normalizovat zvukový signál pÅ™i Ätení ze zvukového souboru Single fixed sample rate to resample all files to Jeden pevný vzorkovací kmitoÄet pro pÅ™evzorkování vÅ¡ech souborů Time display precision PÅ™esnost zobrazení Äasu Use hours:minutes:seconds format Použít formát hodiny:minuty:sekundy Label middle C as OpatÅ™it Å¡títkem jednoÄárkované C (C1, C') C0 - middle of octave scale C0 - stÅ™ed rozsahu oktávy C3 - common MIDI sequencer convention C3 - obecná zvyklost pro sekvencer MIDI C4 - ASA American standard C4 - americký standard ASA C5 - used in Cakewalk and others C5 - používáno v programu Cakewalk a dalších Load mp3 files in gapless mode Nahrát soubory MP v bezmezerovém režimu PreferencesDialog OK OK %1: %1: Apply Použít Some preferences have been changed but not applied. Apply them before closing? NÄ›která nastavení byla zmÄ›nÄ›na, ale nebyla použita. Použít je pÅ™ed zavÅ™ením? Standard Waveform Obvyklý tvar vlny <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> <b>ZnovuspuÅ¡tÄ›ní vyžadováno</b><p>Jedno nebo více nastavení programu, které jste zmÄ›nil, se nebude moci plnÄ› projevit do doby, než bude Sonic Visualiser spuÅ¡tÄ›n znovu.</p><p>UkonÄete, prosím, program nyní a spusÅ¥te jej znovu, pokud chcete, aby se tyto zmÄ›ny projevily okamžitÄ›.</p> Preferences Changed Nastavení zmÄ›nÄ›na Select a directory to create cache subdirectory in Vyberte adresář pro vytvoÅ™ení podadresáře s vyrovnávací pamÄ›tí v nÄ›m Cancel ZruÅ¡it Default session template for audio files: Výchozí pÅ™edloha sezení pro zvukové soubory: Anal&ysis &Rozbor <home directory> <domovský adresář> &Appearance Vz&hled Sonic Visualiser: Application Preferences Sonic Visualiser: Nastavení programu Session &Template &PÅ™edloha sezení Preferences Nastavení &General &Obecné Playback audio device: Zvukové zařízení pro pÅ™ehrávání: Follow system locale Použít jazyk systému Russian RuÅ¡tina British English Britská angliÄtina American English Americká angliÄtina Czech ÄŒeÅ¡tina User interface language Jazyk uživatelského rozhraní Allow network usage Povolit používání sítÄ› Draw layers at Retina resolution: Kreslit vrstvy v rozliÅ¡ení Retina: Default spectrogram colour: Výchozí barva spektrogramu: Default melodic spectrogram colour: Výchozí barva melodického spektrogramu: Default colour 3D plot colour: Výchozí barva barevného trojrozmÄ›rného nákresu: Green Zelená (auto) (auto) Overview waveform colour: Barva tvaru vlny pÅ™ehledu: Run Vamp plugins in separate process: Spustit přídavné moduly Vamp v samostatném procesu: Default session template when loading audio files: Výchozí pÅ™edloha sezení pÅ™i nahrávání zvukových souborů: (Use "%1" in the File menu to add to these.) Použít "%1" v nabídce Soubor pro pÅ™idání k tÄ›mto.) Export Session as Template... Vyvést sezení jako pÅ™edlohu... Audio service: Zvuková služba: Audio playback device: Zařízení pro pÅ™ehrávání zvuku: Audio record device: Zařízení pro nahrávání zvuku: A&udio I/O Vstup/Výstup &zvuku &Other &Jiné ProgressDialog Cancel ZruÅ¡it PropertyBox dB dB Play PÅ™ehrát Show Ukázat (current value: %1) (nynÄ›jší hodnota: %1) Adjust %1 property of %2%3 Upravit %1 vlastnost %2%3 Toggle %1 property of %2 PÅ™epnout %1 vlastnost %2 Toggle Playback of %1 PÅ™epnout pÅ™ehrávání %1 Playback Pan / Balance Vyvážení pÅ™ehrávání/rovnováha Prefer black background for this colour UpÅ™ednostňovat Äerné pozadí pro tuto barvu Toggle Visibility of %1 PÅ™epnout viditelnost %1 (current value: %1%2) (nynÄ›jší hodnota: %1%2) Add New Colour... PÅ™idat novou barvu... Name New Colour Pojmenovat novou barvu Enter a name for the new colour: Zadejte název pro novou barvu: Playback Gain Zesílení pÅ™ehrávání Set playback clip: Nastavit zábÄ›r pÅ™ehrávání: Click to toggle playback Klepnout pro pÅ™epnutí pÅ™ehrávání Adjust playback level and pan of %1 PÅ™izpůsobit úroveň pÅ™ehrávání a vyvážení %1 Change sound used for playback (currently "%1") ZmÄ›nit zvuk používaný pro pÅ™ehrávání (nyní "%1") PropertyContainer no Ne on Zapnuto off Vypnuto yes Ano true Pravdivý false Nepravdivý Set %1 Property Nastavit %1 vlastnost PropertyStack Click to change the current active layer KlepnÄ›te pro zmÄ›nu nynÄ›jší Äinné vrstvy Change Layer Visibility ZmÄ›nit viditelnost vrstvy QApplication Sonic Visualiser Sonic Visualiser - ZnázorňovaÄ zvuku Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser je programem urÄeným pro prohlížení a zkoumání zvukových dat, pro významový hudební rozbor a pÅ™ipojování poznámek. Použití: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: NepokouÅ¡et se otevřít zařízení pro výstup zvuku --no-osc: Neposkytovat přípojku Open Sound Control pro dálkové ovládání <file>: Lze poskytnout jeden nebo více souborů Sonic Visualiser (.sv) a zvukových souborů. QFile File "%1" does not exist Soubor "%1" neexistuje File or URL "%1" could not be retrieved Soubor nebo adresu (URL) "%1" se nepodaÅ™ilo získat Failed to open file "%1" Soubor "%1" se nepodaÅ™ilo otevřít QMessageBox Failed to open file Soubor se nepodaÅ™ilo otevřít <b>Audio required</b><p>Please load at least one audio file before importing annotation data <b>Vyžadován zvuk</b><p>PÅ™ed zavedením dat s poznámkami nahrajte, prosím, alespoň jeden zvukový soubor File or URL "%1" could not be opened Soubor nebo adresu (URL) "%1" se nepodaÅ™ilo otevřít QObject External plugin host executable does not appear to be installed Zdá se, že není nainstalován spustitelný soubor pro vnÄ›jšího hostitele přídavného modulu Could not start external plugin host NepodaÅ™ilo se spustit vnÄ›jšího hostitele přídavného modulu External plugin host exited unexpectedly while listing plugins VnÄ›jší hostitel přídavného modulu byl bÄ›hem vypisování přídavných modulů neoÄekávanÄ› ukonÄen External plugin host invocation failed: %1 NepodaÅ™ilo se vyvolat vnÄ›jšího hostitele přídavného modulu: %1 <b>Did not scan for plugins</b><p>Apparently no scan for plugins was attempted (internal error?)</p> <b>Neprohledáno na přídavné moduly</b><p>Podle vÅ¡eho nedoÅ¡lo k žádnému pokusu o prohledání na přídavné moduly (vnitÅ™ní chyba?)</p> <b>Failed to load plugins</b><p>Failed to load one or more plugin libraries:</p> <b>NepodaÅ™ilo se nahrát přídavné moduly</b><p>NepodaÅ™ilo se nahrát jednu nebo více knihoven s přídavnými moduly:</p> <p>These plugins may be incompatible with the system, and will be ignored during this run of %1.</p> <p>Tyto přídavné moduly se nemusí sluÄovat se systémem, a budou bÄ›hem tohoto spuÅ¡tÄ›ní %1 pÅ™ehlíženy.</p> <unknown> <neznámý> Green Zelená White on Black Bílá na Äerné Black on White ÄŒerná na bílé Cherry TÅ™ešňová barva Wasp Vosa Ice Led Sunset Západ slunce Fruit Salad Ovocný salát Banded Pruhovaný Highlight ZvýraznÄ›ní Printer Tiskárna High Gain Zesílení výšek <b>Failed to scan for plugins</b><p>Failed to scan for plugins at startup. Possibly the plugin checker program was not correctly installed alongside %1?</p> <b>NepodaÅ™ilo se prohledat na přídavné moduly</b><p>PÅ™i spuÅ¡tÄ›ní se nepodaÅ™ilo provést vyhledání přídavných modulů. Je možné, že kontrolor přídavných modulů nebyl zároveň s %1 správnÄ› nainstalován?</p> QuickTimeFileReader Decoding %1... Dekóduje se %1... RDFImporter Importing event data from RDF... Zavádí se data událostí z RDF... Importing dense signal data from RDF... Zavádí se signálová data s vysokou hustotou z RDF... Importing audio referenced in RDF... Zavádí se zvuk odkazovaný v RDF... RangeInputDialog to do RangeSummarisableTimeValueModel Range-Summarisable Time-Value RozsahovÄ› shrnutelná Äasová hodnota ReadOnlyWaveFileModel Wave File Soubor Wave RegionLayer Log Zápis Bars ÚseÄky %1 %2 %1 %2 Segmentation RozÄlenÄ›ní Paste Vložit Scale Stupnice No local points Žádné místní body The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Erase Region Vymazat oblast Equal Spaced VyrovnanÄ› rozložené Auto-Align Automatické zarovnání Vertical Scale Svislá stupnice Resize Selection ZmÄ›nit velikost výbÄ›ru Linear PřímoÄarý New Region Nová oblast Change Point Value ZmÄ›nit hodnotu bodu Draw Region Nakreslit oblast Drag Region Táhnout oblast Edit Region Upravit oblast Plot Type Typ nákresu Relocate Region PÅ™emístit oblast Scale Units Jednotky stupnice In progress Probíhá Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výbÄ›r Delete Selected Points Smazat vybrané body Time: %1 Value: %2 Duration: %3 No label ÄŒas: %1 Hodnota: %2 Doba trvání: %3 Žádný Å¡títek Time: %1 Value: %2 Duration: %3 Label: %4 ÄŒas: %1 Hodnota: %2 Doba trvání: %3 Å títek: %4 RegionModel Time ÄŒas Frame Snímek Label Å títek Value Hodnota Edit Data Upravit data Region Oblast Unknown Neznámý Duration Doba trvání RemoveLayerCommand Delete %1 Layer Smazat %1 vrstvu ResamplingWavFileReader Resampling %1... PÅ™evzorkovává se %1... SVFileReader (derived model in SV-XML) (odvozený model v SV-XML) Opening file or URL... Otevírá se soubor nebo adresa (URL)... SingleColourLayer Colour Barva <unknown> <neznámý> SliceLayer dB dB 0dB 0dB Any Jakýkoli Log Zápis x10 x10 -Inf -Inf Bins KoÅ¡e Gain Zesílení Mean PrůmÄ›r Peak Vrchol First První Time: %1 - %2 Range: %3 samples (%4) ÄŒas: %1 - %2 Rozsah: %3 vzorky (%4) Lines Čáry Meter MěřiÄ Scale Stupnice Bin Scale Stupnice koÅ¡e Steps Kroky Blocks Bloky Linear PřímoÄarý Plot Type Typ nákresu %1 - %2 %1 - %2 Rev Log Rev Log Threshold Práh Normalize Normalizovat Absolute Naprostý Colours Barvy Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 ÄŒas: %1 - %2 Rozsah: %3 vzorky (%4) KoÅ¡: %5 %6 hodnota: %7 Sampling Mode Režim vzorkování SparseModel Edit Data Upravit data Sparse Řídký Delete Data Point Smazat datový bod Insert Data Point Vložit datový bod SparseModel::AddPointCommand Add Point PÅ™idat bod SparseModel::DeletePointCommand Delete Point Smazat bod SparseModel::RelabelCommand Re-Label Point OpatÅ™it bod znovu Å¡títkem SparseOneDimensionalModel Time ÄŒas Frame Snímek Label Å títek Edit Data Upravit data Sparse 1-D Řídký 1-D Unknown Neznámý SparseTimeValueModel Time ÄŒas Frame Snímek Label Å títek Value Hodnota Edit Data Upravit data Unknown Neznámý Sparse Time-Value Řídká hodnota Äasu SparseValueModel Sparse Value Řídká hodnota SpectrogramLayer dB dB Log Zápis dBV dBV %1Hz %1Hz -Inf -Inf 25 % 43Hz 50 % 75 % Bins KoÅ¡e Gain Zesílení None Žádná 1 KHz 10 Hz 2 KHz 20 Hz 4 KHz 40 Hz 6 KHz 8 KHz Meter MěřiÄ FFT cache failed FFT vyrovnávací paměť selhala Phase Fáze Scale Stupnice dBV^2 dBV^2 Colour Scale Stupnice barev All Bins VÅ¡echny koÅ¡e Normalize Columns Normalizovat sloupce Time: %1 - %2 ÄŒas: %1 - %2 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 %1KmitoÄet koÅ¡e: %2 Hz %3Výška koÅ¡e: %4 10 KHz 100 Hz 12 KHz 16 KHz 250 Hz 500 Hz Time: %1 ÄŒas: %1 87.5 % 1.5 KHz Normalize Visible Area Normalizovat viditelnou oblast Colour Barva Peak Pitch: %3 - %4 Nejvyšší výška: %3 - %4 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1KmitoÄet koÅ¡e: %2 - %3 Hz %4Výška koÅ¡e: %5 - %6 <unknown> <neznámý> Linear PřímoÄarý No max Žádné maximum No min Žádné minimum Colour Rotation OtáÄení barev Window Okno Smoothing Vyhlazování dB: %1 dB: %1 Window Overlap PÅ™ekrytí okna Phase: %1 - %2 Fáze: %1 - %2 Window Size Velikost okna Peak Frequency: %1 - %2 Hz Nejvyšší kmitoÄet: %1 - %2 Hz Peak Bins KoÅ¡e vrcholů Frequency Scale KmitoÄtová stupnice dB: %1 - %2 dB: %1 - %2 Min Frequency Nejmenší kmitoÄet Phase: %1 Fáze: %1 Threshold Práh Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. NepodaÅ™ilo se vytvoÅ™it model FFT pro tento spektrogram. Důvodem pro to může být nedostatek pamÄ›ti, nebo nedostatek místa na disku. Bin Display Zobrazení koÅ¡e Frequencies KmitoÄty 93.75 % Peak Frequency: %1 Hz Nejvyšší kmitoÄet: %1 Hz Peak Pitch: %2 Nejvyšší výška: %2 Max Frequency NejvÄ›tší kmitoÄet Normalization Normalizace Col Barva View Pohled Hybrid Smíšený SpectrumLayer %1 %1 -Inf -Inf 25 % 50 % 75 % Bins KoÅ¡e Mean PrůmÄ›r None Žádný Peak Vrchol %1 Hz %1 Hz First První Show Peak Frequencies Ukázat nejvyšší kmitoÄty %1 Bin: %2 (%3) %4 value: %5 dB: %6 %1 KoÅ¡: %2 (%3) %4 hodnota: %5 dB: %6 87.5 % %1 Bin: %2 (%3) Value: %4 dB: %5 %1 KoÅ¡: %2 (%3) Hodnota: %4 dB: %5 Window Okno Window Overlap PÅ™ekrytí okna Window Size Velikost okna %1 - %2 %1 - %2 93.75 % %1 - %2 Hz SubdividingMenu %1 - %2 %1 - %2 Surveyer No, thanks Ne, dÄ›kuji Yes! Take me to the survey Ano! Vezmi mÄ› do průzkumu TextLayer Paste Vložit The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? <no text> <žádný text> Time: %1 Height: %2 Label: %3 ÄŒas: %1 Výška: %2 Å títek: %3 Please enter a new label: Zadejte, prosím, nový Å¡títek: Resize Selection ZmÄ›nit velikost výbÄ›ru Enter label Zadat Å¡títek Move Label Horizontally PÅ™esunout Å¡títek vodorovnÄ› Erase Point Vymazat bod Move Label PÅ™esunout Å¡títek In progress Probíhá Drag Label Táhnout Å¡títek New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výbÄ›r Empty Label Prázdný Å¡títek Move Label Vertically PÅ™esunout Å¡títek svisle Delete Selection Smazat výbÄ›r TextModel Text Text Time ÄŒas Frame Snímek Label Å títek Edit Data Upravit data Height Výška Unknown Neznámý Thumbwheel %2%3 %2%3 Enter new value Zadat novou hodnotu %1: %2%3 %1: %2%3 New value for %1, from %2 to %3: Nová hodnota pro %1, od %2 do %3: Enter a new value from %1 to %2: Zadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2 %3: Zadejte novou hodnotu od %1do %2 %3: New value for %1, from %2 to %3 %4: Nová hodnota pro %1, od %2 do %3 %4: TimeInstantLayer Segmentation RozÄlenÄ›ní Paste Vložit No local points Žádné místní body Resize Selection ZmÄ›nit velikost výbÄ›ru Instants Okamžiky Edit Point Upravit bod Plot Type Typ nákresu Time: %1 Label: %2 ÄŒas: %1 Å títek: %2 Re-align pasted instants? Zarovnat vložené položky znovu? Erase Point Vymazat bod In progress Probíhá Drag Point Nakreslit bod Draw Point Nakreslit bod New Point Nový bod Drag Selection Táhnout výbÄ›r Time: %1 No label ÄŒas: %1 Žádný Å¡títek Delete Selection Smazat výbÄ›r Move Point to %1 s PÅ™esunout bod na %1 s Add Point at %1 s PÅ™idat bod v %1 s The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Okamžiky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? TimeValueLayer Log Zápis +/-1 v Segmentation RozÄlenÄ›ní Curve KÅ™ivka Lines Čáry Paste Vložit Scale Stupnice Stems Stopky No local points Žádné místní body Choose value calculation Vybrat výpoÄet hodnoty The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, pÅ™iÅ¡ly z vrstvy s odliÅ¡ným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v Äase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Some of the items you are pasting do not have values. What values do you want to use for these items? NÄ›které z položek, které vkládáte, nemají hodnoty. Jaké hodnoty chcete pro tyto položky použít? Time: %1 Value: %2%3 Label: %4 ÄŒas: %1 Hodnota: %2%3 Å títek: %4 Connected Points Spojené body Auto-Align Automatické zarovnání Vertical Scale Svislá stupnice Resize Selection ZmÄ›nit velikost výbÄ›ru Zero for all items Nula pro vÅ¡echny položky Linear PřímoÄaré Points Body Change Point Value ZmÄ›nit hodnotu bodu The items you are pasting do not have values. What values do you want to use for these items? Položky, které vkládáte, nemají hodnoty. Jaké hodnoty chcete pro tyto položky použít? Edit Point Upravit bod Show Derivative Ukázat odvozeninu Plot Type Typ nákresu Scale Units Jednotky stupnice Erase Point Vymazat bod Cycle size: Velikost cyklu: Time: %1 Value: %2%3 No label ÄŒas: %1 Hodnota: %2%3 Žádný Å¡títek Select cycle size Vybrat velikost cyklu In progress Probíhá Drag Point Táhnout bod Draw Point Nakreslit bod New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výbÄ›r Relocate Point PÅ™emístit bod Delete Selected Points Smazat vybrané body Draw Segment Division Lines Kreslit Äáry rozdÄ›lující Äásti Discrete Curves Samostatné kÅ™ivky %1 Hz (%2, %3) %1 Hz (%2, %3) %1 %2 %1 %2 %1 %1 Time: %1 Value: %2 No label ÄŒas: %1 Hodnota: %2 Žádný Å¡títek Time: %1 Value: %2 Label: %4 ÄŒas: %1 Hodnota: %2 Å títek: %4 TipDialog Close Zavřít Show tip on startup Ukázat radu pÅ™i spuÅ¡tÄ›ní Next >> Další >> << Previous << PÅ™edchozí Tip of the Day Rada na tento den TransformFactory Name Název Plugin type Druh přídavného modulu Maker Tvůrce Other Jiný Units jednotky %1 using "%2" plugin (from %3) %1 používá "%2" přídavný modul (z %3) %1: %2 %1: %2 %1: Output %2 %1: Výstup %2 <unknown maker> <neznámý tvůrce> Extract data output %1 from "%2" effect plugin (from %3) Vytáhnout datový výstup %1 z "%2" efektového přídavného modulu (z %3) Analysis Rozbor Extract "%1" data output from "%2" effect plugin (from %3) Vytáhnout "%1" datový výstup z "%2" efektového přídavného modulu (z %3) Generator Tvůrce Transform audio signal with "%1" effect plugin (from %2) PromÄ›nit zvukový signál s "%1" efektovým přídavným modulem (z %2) Generate audio signal using "%1" plugin (from %2) VytvoÅ™it zvukový signál za použití "%1" efektového přídavného modulu (z %2) %1 using "%2" output of "%3" plugin (from %4) %1 používá "%2" výstup "%3" přídavného modulu (z %4) Category Skupina Description Popis Extract features using "%1" plugin (from %2) Vytáhnout funkce pomocí "%1" přídavného modulu (z %2) Effects Efekty Extract features using "%1" output of "%2" plugin (from %3) Vytáhnout funkce pomocí "%1" výstupu "%2" přídavného modulu (z %3) System Identifier Systémový identifikátor [\(<].*$ [\(<].*$ Effects Data Efektová data Failed to list Vamp plugins: %1 NepodaÅ™ilo se vypsat přídavné moduly Vamp: %1 TransformFinder Up Nahoru <b>%1</b>%2<br> <b>%1</b>%2<br> Down Dolů Find: Hledat: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Systémový identifikátor: %1 <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Je možné, že síťové spojení vypadlo, služby odpovídají příliÅ¡ pomalu, nebo se vyskytly potíže se zpracováním.<br>Budou se prohledávat pouze popisy nainstalovaných přídavných modulů. <i> (not installed)</i> <i> (nenainstalován)</i> Find a Transform Najít promÄ›nu <small> </small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Typ přídavného modulu: %1 <small>%1</small> <small>%1</small> <br>&nbsp;&nbsp;No results found <br>&nbsp;&nbsp;Nebyly nalezeny žádné výsledky <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <p>NapiÅ¡te do okénka pro hledání nÄ›jaký text pro hledání popisů:<ul><li>VÅ¡ech nyní nainstalovaných <a href="http://www.vamp-plugins.org/">Vamp</a> zvukových funkÄních vytahovacích přídavných modulů</li><li>VÅ¡ech nyní nainstalovaných <a href="http://www.ladspa.org/">LADSPA</a> zvukových efektových přídavných modulů</li><li>Vamp přídavných modulů, které nyní nainstalovány nejsou, ale mají svůj popis zvěřejnÄ›ný prostÅ™ednictvím významového internetu</li></ul> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Skupina: %1 Found %n description(s) containing <b>%1</b> Nalezen jeden popis obsahující <b>%1</b> Nalezeny %n popisy obsahující <b>%1</b> Nalezeno %n popisů obsahujících <b>%1</b> </small> </small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Více informací naleznete na stránkách: <a href="%1">%1</a> <b>No plugins are currently installed!</b> <b>Nyní nejsou nainstalovány žádné přídavné moduly!</b> %1%2<br><small> %1%2<br><small> Found %n description(s) containing <b>%1</b>, showing the first %2 only Nalezen jeden popis obsahující <b>%1</b>, ukazují se pouze první %2 Nalezeny %n popisy obsahující <b>%1</b>, ukazují se pouze první %2 Nalezeno %n popisů obsahujících <b>%1</b>, ukazují se pouze první %2 <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>Budou se prohledávat pouze zveÅ™ejnÄ›né popisy funkÄních vytahovacích přídavných modulů Vamp. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. <p>%1<br>%2<br>Je možné, že síťové spojení vypadlo, nebo služby odpovídají příliÅ¡ pomalu.<br>Nebudou dostupné žádné výsledky hledání. <b>Unable to retrieve published descriptions from network!</b> <b>ZveÅ™ejnÄ›né popisy se ze sítÄ› získat nepodaÅ™ilo!</b> UnitConverter Pitch Výška tónu cents centů In 12-tone Equal Temperament: V 12-tónovém rovnomÄ›rnÄ› temperovaném ladÄ›ní: = = + + Piano note Nota klavíru in octave v oktávÄ› MIDI pitch Výška tónu MIDI Note that only pitches in the range 0 to 127 are valid in the MIDI protocol. MÄ›jte na pamÄ›ti, že v protokolu MIDI jsou platnými pouze výšky tónů v rozsahu 0 až 127. Tempo Tempo Beat period Perioda (doba) rytmu at na With concert-A tuning frequency at %1 Hz, and middle C residing in octave %2. (These can be changed in the application preferences.) S kmitoÄtem koncertního ladÄ›ní A na %1 Hz a jednoÄárkovaným C spoÄívajícím v oktávÄ› %2. (To vÅ¡e lze zmÄ›nit v nastavení programu.) View Off Vypnuto Page Strana Follow Playback Sledovat pÅ™ehrávání Layer rendering error Chyba pÅ™i dÄ›lání vrstvy Cancel ZruÅ¡it <unknown> <neznámý> Scroll ProjíždÄ›t Global Zoom Celkové zvÄ›tÅ¡ení Waiting for layers to be ready... ÄŒeká se na vrstvy, až budou pÅ™ipraveny... Global Scroll Celkové projíždÄ›ní Rendering image... DÄ›lá se obrázek... Alignment Zarovnání Exported image from %1 Vyvedený obrázek z %1 ViewManager Switch on Play Solo mode Zapnout režim samostatného pÅ™ehrávání Enter Draw mode Vstoupit do režimu kreslení Enter Navigate mode Vstoupit do režimu navedení Change overlay level ZmÄ›nit úroveň pÅ™ekrytí Enter Erase mode Vstoupit do režimu mazání Switch on Alignment mode Zapnout režim zarovnávání Switch off Play Selection mode Vypnout režim pÅ™ehrávání vybrané oblasti Clear Selection Vyprázdnit výbÄ›r Select Multiple Regions Vybrat více oblastí Enter Measure mode Vstoupit do režimu měření Switch off Alignment mode Vypnout režim zarovnávání Enter Edit mode Vstoupit do režimu úprav Switch on Play Selection mode Zapnout režim pÅ™ehrávání vybrané oblasti Scroll to %1 ProjíždÄ›t k %1 Switch on Loop mode Zapnout režim smyÄky Select Region Vybrat oblast Switch off Loop mode Vypnout režim smyÄky Switch off Play Solo mode Vypnout režim samostatného pÅ™ehrávání Enter Select mode Vstoupit do režimu výbÄ›ru Zoom to %n sample(s) per pixel ZvÄ›tÅ¡ení na jeden vzorek na pixel ZvÄ›tÅ¡ení na %n vzorky na pixel ZvÄ›tÅ¡ení na %n vzorků na pixel Enter NoteEdit mode Vstoupit do režimu úprav not WaveFileModel Wave File Soubor Wave WaveformLayer dB dB 0dB 0dB -Inf -Inf Gain Zesílení Mean PrůmÄ›r Time: %1 ÄŒas: %1 Left: Levý: Meter MěřiÄ Scale Stupnice %1 %2 - %3 (%4 dB peak) %1 %2 - %3 (%4 dB nejvyšší) Time: %1 - %2 ÄŒas: %1 - %2 Normalize Visible Area Normalizovat viditelnou oblast Level: Úroveň: Linear PřímoÄarý Channel %1 Kanál %1 Right: Pravý: %1 %2 (%3 dB peak) %1 %2 (%3 dB nejvyšší) Butterfly Rozříznout a roztáhnout Separate RozdÄ›lit Channels Kanály WindowShapePreview dB / freq dB/kmitoÄet V / time V/Äas WritableWaveFileModel Writable Wave File Zapisovatelný soubor Wave sonic-visualiser-3.0.3/i18n/sonic-visualiser_en_GB.qm0000644000000000000000000000172613111512442020611 0ustar 00000000000000<¸dÊÍ!¿`¡½ÝB(,qÁ)ÔþN¬ùYY 8†er '© §i%1 (%n change)%1 (%n changes)%1 (%n change(s)) BundleCommandNormalise Normalize SliceLayerRFound %n description containing <b>%1</b>TFound %n descriptions containing <b>%1</b>,Found %n description(s) containing %1TransformFinderˆFound %n description containing <b>%1</b>, showing the first %2 onlyŠFound %n descriptions containing <b>%1</b>, showing the first %2 onlyGFound %n description(s) containing %1, showing the first %2 onlyTransformFinder,Normalise Visible AreaNormalize Visible Area WaveformLayerˆsonic-visualiser-3.0.3/i18n/sonic-visualiser_en_GB.ts0000644000000000000000000131236713111512442020631 0ustar 00000000000000 ActivityLog Activity Log <p>Activity Log lists your interactions and other events within %1.</p> %1: %2 AddLayerCommand Add %1 Layer AggregateWaveModel Aggregate Wave AlignmentModel Alignment AlignmentView AlignmentView AudioCallbackPlaySource Play from %1 Stop at %1 Change time-stretch factor to %1 AudioCallbackRecordTarget recorded-%1.wav Recorded %1 AudioDial %1: %2 %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value BZipFileDevice File is already open Append mode not supported File access mode not specified Read and write modes both specified Failed to open file for writing Failed to open file handle for writing Failed to open bzip2 stream for writing Failed to open file for reading Failed to open file handle for reading Failed to open bzip2 stream for reading Internal error (open for neither read nor write) File not open bzip2 stream write close error bzip2 stream read close error Internal error (close for neither read nor write) bzip2 stream read error BundleCommand %1 (%n change(s)) %1 (%n change) %1 (%n changes) CSVFileWriter Failed to open file %1 for writing CSVFormatDialog Select Data Format Please select the correct data format for this file. <ignore> Values (%1 more) Time End time Duration Value Pitch Label Timing is specified: Explicitly, in seconds Explicitly, in milliseconds Explicitly, in audio sample frames Implicitly: rows are equally spaced in time Audio sample rate (Hz): Frame increment between rows: Data will be displayed in a %1 layer. Colour3DPlotLayer Colour Scale Normalize Columns Normalise Columns Normalize Visible Area Normalise Visible Area Normalization Invert Vertical Scale Gain Always Opaque Smooth Bin Scale Bins Linear Log +/-1 Absolute None Col View Hybrid <unknown> dB Time: %1 - %2 Bin: %3 Value: %4 ColourComboBox Name New Colour Enter a name for the new colour: Prefer black background for this colour Add New Colour... CommandHistory &Undo Ctrl+Z Undo the last editing operation Re&do Ctrl+Shift+Z Redo the last operation that was undone Undo %1 Redo %1 Nothing to undo Nothing to redo &Undo %1 Re&do %1 CoreAudioFileReader Decoding %1... DecodingWavFileReader Decoding %1... Dense3DModelPeakCache Dense 3-D Peak Cache DenseThreeDimensionalModel Dense 3-D Time Frame DenseTimeValueModel Dense Time-Value Document Set main model to %1 Clear main model EditableDenseThreeDimensionalModel Editable Dense 3-D FFTModel FFT %1 Hz Fader Enter new fader level New fader level, from %1 to %2 dBFS: Level: Off Level: %1%2.%3%4 dB FeatureExtractionModelTransformer Transforms supplied to a single FeatureExtractionModelTransformer instance must be similar in every respect except plugin output No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Failed to instantiate plugin "%1" Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Failed to initialise feature extraction plugin "%1" Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Plugin "%1" has no outputs Plugin "%1" has no output named "%2" FileSource Unsupported scheme in URL Downloading %1... Download cancelled Failed to create local file %1 File contains no data! FlexiNoteLayer New Point Vertical Scale Scale Units Scale Auto-Align Linear Log MIDI Notes In progress No local points %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 %2 Time: %1 Pitch: %2 Duration: %3 No label Time: %1 Pitch: %2 Duration: %3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Add Point Snap Notes Merge Notes Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Record FlexiNote FlexiNoteModel FlexiNote Time Frame Pitch Duration Level Label Unknown Edit Data I Edit Data ImageDialog Image Label: File or URL: Browse... Preview Unsupported scheme in URL The URL scheme "%1" is not supported Opening image URL... File download failed Failed to download URL "%1": %2 ImageLayer In progress Select image Move Image Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point Opening image URL... ImageModel Image Edit Image Time Frame Label Unknown Edit Data InteractiveFileFinder Select file All files (*.*) Select a session file Audio files (%1) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) Image files (%1) All files (*.*) File does not exist <b>File not found</b><p>File "%1" does not exist File is not readable <b>File is not readable</b><p>File "%1" can not be read Directory selected <b>Directory selected</b><p>File "%1" is a directory Non-file selected <b>Not a file</b><p>Path "%1" is not a file File is empty <b>File is empty</b><p>File "%1" is empty %1 session files (*.%1) RDF files (%3) All files (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2) %3 session files (*.%4) Audio files (%2) RDF files (%1) All files (*.*) Scalable Vector Graphics files (*.svg) All files (*.*) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2 %3) %4 session files (*.%5) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) %1 session files (*.%2) All files (*.*) Select a file to export to WAV audio files (*.wav) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Portable Network Graphics files (*.png) All files (*.*) Comma-separated data files (*.csv) Text files (*.txt) All files (*.*) File exists <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? Failed to open file Locate file... Use URL... Cancel Use URL Please enter the URL to use for this file: Failed to open location <b>Failed to open location</b><p>URL "%1" could not be opened ItemEditDialog Timing Time: frames sec usec Duration: Properties Value: Text: OK Reset Cancel KeyReference & <i>or</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> %1: Key and Mouse Reference LabelCounterInputDialog Set Counters Fine counter (beats): Coarse counter (bars): Labeller No numbering Simple counter Cyclical counter Cyclical two-level counter (bar/beat) Audio sample frame number Time in seconds Duration to the following item Tempo (bpm) based on duration to following item Duration since the previous item Tempo (bpm) based on duration since previous item Same as the nearest previous item Value extracted from the item's label (where possible) %1.%2 %1 Label Points Subdivide Points Winnow Points Layer Waveform Spectrogram Ruler Time Instants Time Values Notes Flexible Notes Regions Text Images Colour 3D Plot Spectrum Time Slice Unknown Layer Make Measurement Delete Measurement LayerTreeDialog Layer Summary Audio Data Sources Panes and Layers LayerTreeModel Layer Shown Played Model LevelPanToolButton Click to adjust level and pan LevelPanWidget Drag vertically to adjust level, horizontally to adjust pan MIDIFileImportDialog Merge all tracks Merge all non-percussion tracks Select track or tracks to import <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: Error in MIDI file import MIDIFileReader Wrong length for long data in MIDI stream (%1, should be %2) Wrong length for int data in MIDI stream (%1, should be %2) getMIDIByte called but no MIDI file open End of MIDI file encountered while reading Attempt to get more bytes than expected on Track Attempt to read past MIDI file end getMIDIBytes called but no MIDI file open Attempt to get more bytes than available on Track (%1, only have %2) getNumberFromMIDIBytes called but no MIDI file open skipToNextTrack called but no MIDI file open Invalid event code %1 found Running status used for first event in track MIDI file "%1" has no notes in any track - uses GM percussion channel Track %1 (%2)%3 Track %1 (untitled)%3 %1 - vel %2 MIDIInput Input MP3FileReader Decoding %1... MainWindow Black Red Blue Green Purple Orange White Bright Red Bright Blue Bright Green Bright Purple Bright Orange &Layer &Transform &File File Toolbar File and Session Management &New Session Ctrl+N Ctrl+O &Open... Open a session file, audio file, or layer &Save Session Ctrl+S Save Session &As... Ctrl+Shift+S Ctrl+I &Export Audio File... Export selection as an audio file Import Annotation &Layer... Ctrl+L Import layer data from an existing file Export layer data to a file Export Image File... Export a single pane to an image file Open Lo&cation... Playback Speed Ctrl+Shift+O Open or import a file from a remote URL Export Audio Data... &Preferences... Adjust the application preferences &Quit Ctrl+Q &Edit Editing Cu&t Ctrl+X Cut the selection from the current layer to the clipboard &Copy Ctrl+C Copy the selection from the current layer to the clipboard &Paste Ctrl+V Paste from the clipboard to the current layer Paste at Playback Position Ctrl+Shift+V Paste from the clipboard to the current layer, placing the first item at the playback position &Delete Selected Items Del Delete items in current selection from the current layer Selection Select &All Ctrl+A Select the whole duration of the current session Select &Visible Range Ctrl+Shift+A Select the time range corresponding to the current window width Select to &Start Shift+Left Select from the start of the session to the current playback position Select to &End Shift+Right Select from the current playback position to the end of the session C&lear Selection Esc Clear the selection Tapping Time Instants &Insert Instant at Playback Position Enter Insert a new time instant at the current playback position, in a new layer if necessary ; Insert Instants at Selection &Boundaries Shift+Enter Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Insert Item at Selection Insert a new note or region item corresponding to the current selection Number New Instants with Cycle size Reset Numbering Counters Reset to 1 all the counters used for counter-based labelling Set Numbering Counters... Set the counters used for counter-based labelling Renumber Selected Instants Renumber the selected instants using the current labelling scheme Panning and Navigation &View Scroll &Left Left Scroll the current pane to the left Scroll &Right Right Scroll the current pane to the right &Jump Left Ctrl+Left Scroll the current pane a big step to the left J&ump Right Ctrl+Right Scroll the current pane a big step to the right Peek Left Alt+Left Scroll the current pane to the left without moving the playback cursor or other panes Peek Right Alt+Right Scroll the current pane to the right without moving the playback cursor or other panes Zoom Zoom &In Up Increase the zoom level Zoom &Out Down Decrease the zoom level Restore &Default Zoom Restore the zoom level to the default Zoom to &Fit F Zoom to show the whole file Display Features Show &Centre Line ' Show or hide the centre line Toggle All Time Rulers Show &No Overlays 0 Show &Minimal Overlays 9 8 Show &All Overlays Export audio from selection into a data file Export Annotation La&yer... Ctrl+Y Export SVG File... Export a single pane to a scalable SVG image file Browse Recorded Audio Folder Open the Recorded Audio folder in the system file browser Ctrl+Shift+Return Subdivide Selected Instants... Add new instants at regular intervals between the selected instants Winnow Selected Instants... Remove subdivisions, leaving only every Nth instant # Show or hide all time rulers Hide times, layer names, and scale Show times and basic scale Show times, layer names, and scale Show &Zoom Wheels Z Show thumbwheels for zooming horizontally and vertically Show Property Bo&xes X Show the layer property boxes at the side of the main window Show Status &Bar Show context help information in the status bar at the bottom of the window Show La&yer Summary Y Open a window displaying the hierarchy of panes and layers in this session Show Acti&vity Log Open a window listing interactions and other events Show &Unit Converter Open a window of pitch and timing conversion utilities Go Full-Screen F11 Expand the pane area to the whole screen &Pane Managing Panes and Layers Add &New Pane N Add a new pane containing only a time ruler Add New %1 Layer Add a new empty layer of type %1 T Add &Waveform W Add a new pane showing a waveform view Shift+W Add a new layer showing a waveform view Add Spectro&gram G Add a new pane showing a spectrogram Shift+G Add a new layer showing a spectrogram Add &Melodic Range Spectrogram M Add a new pane showing a spectrogram set up for an overview of note pitches Shift+M Add a new layer showing a spectrogram set up for an overview of note pitches Add Pea&k Frequency Spectrogram K Add a new pane showing a spectrogram set up for tracking frequencies Shift+K Add a new layer showing a spectrogram set up for tracking frequencies Add Spectr&um U Add a new pane showing a frequency spectrum Shift+U Add a new layer showing a frequency spectrum &All Channels Mixed &All Channels Channel &%1 %1: %2 Switch to Previous Pane [ Make the next pane up in the pane stack current Switch to Next Pane ] Make the next pane down in the pane stack current &Delete Pane Ctrl+Shift+D Delete the currently active pane Add &Time Ruler Add a new layer showing a time ruler Add &Existing Layer Add S&lice of Layer Switch to Previous Layer { Make the previous layer in the pane current Switch to Next Layer } Make the next layer in the pane current &Rename Layer... R Rename the currently active layer Edit Layer Data E Edit the currently active layer as a data grid &Delete Layer Ctrl+D Delete the currently active layer &Recent Transforms %1 by Category Unclassified %1 by Plugin Name %1 by Maker Unknown [\(<].*$ %1... Find a Transform... Search for a transform from the installed plugins, by name or description Ctrl+M &Help Help &Help Reference F1 &Key and Mouse Reference F2 What's &New? Show changes in this release of %1 Ctrl+R Re-open Re-open the current or most recently opened file Standard Waveform Choose Default Template... Ctrl+T Repeat Transform Re-select the most recently run transform Playback and Transport Controls Play&back Playback Playback Toolbar Rewind to Start Home Rewind to the start Rewind PgUp Rewind to the previous time instant or time ruler notch Rewind to Similar Point Shift+PgUp Rewind to the previous similarly valued time instant Play / Pause Space Start or stop playback from the current position Fast Forward PgDown Fast-forward to the next time instant or time ruler notch Fast Forward to Similar Point Shift+PgDown Fast-forward to the next similarly valued time instant Fast Forward to End End Fast-forward to the end Record Ctrl+Space Record a new audio file Play Mode Toolbar Constrain Playback to Selection s Constrain playback to the selected regions Loop Playback l Loop playback Solo Current Pane o Solo the current pane during playback Align File Timelines Treat multiple audio files as versions of the same work, and align their timelines Speed Up Ctrl+PgUp Time-stretch playback to speed it up without changing pitch Slow Down Ctrl+PgDown Time-stretch playback to slow it down without changing pitch Restore Normal Speed Ctrl+Home Restore non-time-stretched playback Edit Toolbar Tool Selection Export the whole pane Export the visible area only Which region of the current pane do you want to export as a scalable SVG image? Failed to save SVG file Failed to save SVG file %1 Failed to query transform attributes <b>Failed to query transform attributes</b><p>Plugin or server error: %1</p> Multiplexed audio Transform failed <b>Failed to run transform</b><p>Plugin or server error: %1</p> Playback speed: %1% (%2x slower) Playback speed: %1% (%2x faster) Subdivide instants Number of subdivisions: Winnow instants Remove all instants apart from multiples of: <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform %1failed:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform %1failed.<p>No error information is available. <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment:<p>%1 Adjust the master playback level and pan With Qt v%1 &copy; The Qt Company <br>With Rubber Band Library v%1 &copy; Particular Programs Ltd <br>With Rubber Band Library &copy; Particular Programs Ltd <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam and QMUL <br>With Piper Vamp protocol bridge &copy; QMUL <br>With Dataquay Qt/RDF library &copy; Particular Programs Ltd <br>With Cap'n Proto serialisation &copy; Sandstorm Development Group Russian UI translation contributed by Alexandre Prokoudine. Czech UI translation contributed by Pavel Fric. <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %2 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> Tools Toolbar Navigate 1 Select 2 Select ranges Edit Navigate Tool Mouse Actions Click left button and drag to move around Zoom to Area Shift-click left button and drag to zoom to a rectangular area Relocate Double-Click Left Double-click left button to jump to clicked location Double-click left button on an item to edit it Select Tool Mouse Actions Click left button and drag to select region; drag region edge to resize Multi Select Cmd-click left button and drag to select an additional region Ctrl-click left button and drag to select an additional region Fine Select Shift-click left button and drag to select without snapping to items or grid 3 Edit items in layer Edit Tool Mouse Actions Move Click left button on an item or selected region and drag to move Draw 4 Draw new items in layer Draw Tool Mouse Actions Click left button and drag to create new item Erase 5 Erase items from layer Erase Tool Mouse Actions Click left button on an item to remove it from the layer Measure 6 Make measurements in layer Measure Tool Mouse Actions Measure Area Click left button and drag to measure a rectangular area Measure Item Click left button and drag to measure extents of an item or shape &Delete Current Measurement Delete the measurement currently under the mouse pointer Fast Forward to Next Instant Fast forward to the next time instant in the current layer Rewind to Previous Instant Rewind to the previous time instant in the current layer Fast Forward to Next Point Fast forward to the next point in the current layer Rewind to Previous Point Rewind to the previous point in the current layer Fast forward No audio file loaded. %1Hz (resampling to %2Hz) Failed to open file <b>File open failed</b><p>Audio file "%1" could not be opened 1. %2 %1. %2 Select audio file to export Which audio file do you want to export from? Export the selected region only Export the whole audio file Select region to export Which region from the original audio file do you want to export? Export the selected regions into separate files Multiple regions of the original audio file are selected. What do you want to export? Fragment file %1 already exists, aborting Export multiple audio files Export audio to "%1" Failed to write file <b>File open failed</b><p>Layer file %1 could not be opened. <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Enter template name Please enter a name for the saved template: Set as default template for future audio files Template file exists <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? http://www.sonicvisualiser.org/doc/reference/%1/en/ What's New <h3>What's New in %1</h3> <b>Note:</b> A newer version of Sonic Visualiser is available.<br>(Version %1 is available; you are using version %2) %1 : %2 configuration, %3-bit build <br>With Serd and Sord RDF parser and store &copy; David Robillard About %1 Newer version available Failed to open file %1 for writing Abandon the current %1 session and start a new one &Import More Audio... Import an extra audio file into a new pane Replace &Main Audio... Replace the main audio file of the session with a different file Open &Recent Save the current session into a %1 session file Save the current session into a new %1 session file Apply Session Template Export Session as Template... Manage Exported Templates Exit %1 Open the %1 reference manual Open a window showing the keystrokes you can use in %1 %1 on the &Web Open the %1 website &About %1 Show information about %1 Export the selected regions into a single file Export the whole file Can't export non-note layers to MIDI Export layer to "%1" Export the whole pane (%1x%2 pixels) Export the visible area only (%1x%2 pixels) Export the selection extent (%1x%2 pixels) Export the selection extent Which region of the current pane do you want to export as an image? Note: the whole pane is too wide to be exported as a single image. Failed to save image file Failed to save image file %1 <b>File open failed</b><p>File "%1" could not be opened Open Location Please enter the URL of the location to open: Failed to open location <b>Open failed</b><p>URL "%1" could not be opened <b>Open failed</b><p>File or URL "%1" could not be opened Failed to open dropped URL <b>Open failed</b><p>Dropped URL "%1" could not be opened Export image to "%1" Session modified <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? Close the current session and create a new one Add this data to the current session Select target for import <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? Failed to save file <b>Save failed</b><p>Session file "%1" could not be saved. Save session as "%1" Multiplex all of the above Rename Layer New name for this layer: Playback speed: Normal Selection: %1 to %2 (duration %3) Visible: %1 to %2 (duration %3) Sample rate mismatch <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. Audio processing overload <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. Problems loading plugins Add Point Reset Counters Failed to generate layer Warning Failed to regenerate layer <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 Failed to calculate alignment Adjust the master playback speed http://www.sonicvisualiser.org/ Release %1 : Revision %2 Release %1 Unreleased : Revision %1 <h3>About Sonic Visualiser</h3> <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> Debug Release <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>With Ogg file decoder &copy; CSIRO Australia <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>With libsamplerate &copy; Erik de Castro Lopo <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>With libsndfile &copy; Erik de Castro Lopo <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>With FFTW3 &copy; Matteo Frigo and MIT <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>With RtMidi &copy; Gary P. Scavone <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>With liblo Lite OSC library &copy; Steve Harris </small><p><small>The OSC URL for this instance is: "%1" Add %1 Pane MainWindowBase %1 (modified) (modified) Cut Paste Add Point Add Point at %1 s Add Item at %1 s Opening file or URL... Select target for import %1: %2 %1: %2 [%3] Import "%1" Opening playlist... Importing from RDF... Opening session... Not enough disc space <b>Not enough disc space</b><p>There doesn't appear to be enough spare disc space to accommodate any necessary temporary files.</p><p>Please clear some space and try again.</p> Not enough memory <b>Not enough memory</b><p>There doesn't appear to be enough memory to accommodate any necessary temporary data.</p> Close the current session and start a new one Replace the main audio file in this session Add the audio file to this session <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? Import audio file "%1" Import layer XML file "%1" Import MIDI file "%1" SV XML file read error: %1 Import session file "%1" Open session template "%1" Failed to import RDF <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> Import RDF document "%1" <b>No audio available</b><p>Could not open an audio device.</p> <b>No audio available</b><p>Could not open audio device: %1</p> <p>Automatic audio device detection failed. Audio playback and recording will not be available during this session.</p> <p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1").</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1"): %2.</p> <p>Audio playback and recording will not be available during this session.</p> <p>Audio playback will not be available during this session.</p> Couldn't open audio device Recording: %1 Failed to write file <b>Save failed</b><p>Failed to write to file "%1": %2 No record device available <b>No record device available</b><p>Failed to find or open an audio device for recording. Only playback will be available.</p> Recording failed <b>Recording failed</b><p>Failed to switch to record mode (some internal problem?)</p> Import Recorded Audio Add Pane Remove Pane Delete Pane Playing: %1 of %2 (%3 remaining) ModelDataTableDialog Data Editor Playback Toolbar Play Mode Toolbar Track Playback Toggle tracking of playback position Edit Toolbar Insert New Item Insert Insert a new item Delete Selected Items Delete Delete the selected item or items Data in Layer Find: ModelMetadataModel Type Name Maker Source ModelTransformerFactory %1 <%2> %1: %2 NetworkPermissionTester Welcome to Sonic Visualiser <h2>Welcome to Sonic Visualiser!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.</p><p>Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.</p><p><hr></p><p><b>Before we go on...</b></p><p>Sonic Visualiser would like permission to use the network.</p> <p>This is to:</p><ul><li> Find information about available and installed plugins;</li><li> Support the use of Open Sound Control; and</li><li> Tell you when updates are available.</li></ul> <p>This is to:</p><ul><li> Find information about available and installed plugins; and</li><li> Tell you when updates are available.</li></ul> <p><b>No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else.</b> We will however make aggregate counts of distinct requests for usage reporting.</p><p>We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.<br></p> Allow this NoteLayer New Point Vertical Scale Scale Units Scale Auto-Align Linear Log MIDI Notes In progress No local points %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 %2 Time: %1 Pitch: %2 Duration: %3 No label Time: %1 Pitch: %2 Duration: %3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Record Note NoteModel Note Time Frame Pitch Duration Level Label Unknown Edit Data OggVorbisFileReader Decoding %1... Overview Overview Click and drag to navigate; double-click to jump Pane Horizontal Zoom Vertical Zoom Reset zoom to default Some lengthy prefix: Reference Unaligned Aligning: %1% Aligned %1 - %2 +%1 (R) (X) %1 / %2Hz%3 Zoom Zoom In Wheel Up Zoom Out Wheel Down General Pane Mouse Actions Wheel Zoom in or out in time axis Scroll Ctrl+Wheel Scroll rapidly left or right in time axis Zoom Vertically Shift+Wheel Zoom in or out in the vertical axis Scroll Vertically Alt+Wheel Scroll up or down in the vertical axis Navigate Middle Click middle button and drag to navigate with any tool Relocate Double-Click Middle Double-click middle button to relocate with any tool Menu Right Show pane context menu Enter new range New vertical display range, from %1 to %2 %4: Drag Selection Resize Selection Click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to move the selection boundary Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Click and drag to select a range; middle-click and drag to navigate Click to add a new item in the active layer Click to erase an item from the active layer Click and drag an item in the active layer to move it; hold Shift to override initial resistance Click and drag to move all items in the selected range Click and drag to adjust the visible range of the vertical scale Click and drag to adjust the vertical zoom level Click and drag to adjust the horizontal zoom level Reset horizontal and vertical zoom levels to their defaults PlayParameterRepository Adjust Playback Parameters Change Playback Mute State Change Playback Gain Change Playback Pan Change Playback Sample PluginParameterBox This plugin has no adjustable parameters. Program PluginParameterDialog Plugin Parameters Name: Version: Maker: Copyright: Output: Input Material Restrict to selection extents Channels Processing Advanced >> Channel mismatch This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. are is This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. This plugin only has a single channel input, but the source has %1 channels. Use mean of source channels Use channel %1 only Window size: Audio frames per block: Window increment: Window shape: Advanced << Preferences Spectrogram y-axis interpolation: Spectrogram x-axis interpolation: Frequency of concert A Property box layout Spectral analysis window shape Playback resampler type Normalise audio signal when reading from audio file Omit temporaries from Recent Files menu Resample mismatching files on import Load mp3 files in gapless mode Single fixed sample rate to resample all files to Location for cache file directory Background colour preference Time display precision Use hours:minutes:seconds format Label middle C as Font size for text overlays Show splash screen on startup Show boxes for all panes Show box for current pane only Rectangular Triangular Hamming Hann Blackman Gaussian Parzen Nuttall Blackman-Harris Fastest Standard Highest quality None Linear interpolation 4 x Oversampling 4 x Oversampling with interpolation Follow desktop theme Dark background Light background Standard (to millisecond) High resolution (to microsecond) 24 FPS 25 FPS 30 FPS 50 FPS 60 FPS C0 - middle of octave scale C3 - common MIDI sequencer convention C4 - ASA American standard C5 - used in Cakewalk and others Preferences PreferencesDialog Sonic Visualiser: Application Preferences Apply Green (auto) <home directory> Follow system locale Russian British English American English Czech %1: Overview waveform colour: Run Vamp plugins in separate process: Default session template when loading audio files: (Use "%1" in the File menu to add to these.) Export Session as Template... Audio service: Audio playback device: Audio record device: A&udio I/O User interface language Allow network usage Draw layers at Retina resolution: Default spectrogram colour: Default melodic spectrogram colour: Default colour 3D plot colour: &Appearance Anal&ysis Standard Waveform Session &Template &Other OK Cancel Select a directory to create cache subdirectory in Preferences <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> Preferences Changed Some preferences have been changed but not applied. Apply them before closing? ProgressDialog Cancel PropertyBox Show Click to toggle playback Set playback clip: Adjust playback level and pan of %1 Change sound used for playback (currently "%1") (current value: %1%2) (current value: %1) Toggle Visibility of %1 Toggle Playback of %1 Toggle %1 property of %2 Adjust %1 property of %2%3 PropertyContainer yes on true no off false Set %1 Property PropertyStack Change Layer Visibility Click to change the current active layer QApplication Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser QColorDialog Color Colour &Basic colors &Basic colours &Custom colors &Custom colours &Define Custom Colors >> &Define Custom Colours >> &Add to Custom Colors &Add to Custom Colours Select color Select colour QFile File "%1" does not exist Failed to open file "%1" File or URL "%1" could not be retrieved QMessageBox Failed to open file File or URL "%1" could not be opened <b>Audio required</b><p>Please load at least one audio file before importing annotation data QObject External plugin host executable does not appear to be installed Could not start external plugin host External plugin host exited unexpectedly while listing plugins External plugin host invocation failed: %1 <b>Failed to scan for plugins</b><p>Failed to scan for plugins at startup. Possibly the plugin checker program was not correctly installed alongside %1?</p> <b>Did not scan for plugins</b><p>Apparently no scan for plugins was attempted (internal error?)</p> <b>Failed to load plugins</b><p>Failed to load one or more plugin libraries:</p> <p>These plugins may be incompatible with the system, and will be ignored during this run of %1.</p> <unknown> Green White on Black Black on White Cherry Wasp Ice Sunset Fruit Salad Banded Highlight Printer High Gain RDFImporter Importing audio referenced in RDF... Importing dense signal data from RDF... Importing event data from RDF... RangeInputDialog to RangeSummarisableTimeValueModel Range-Summarisable Time-Value ReadOnlyWaveFileModel Wave File RegionLayer New Region Vertical Scale Scale Units Plot Type Scale Bars Segmentation Auto-Align Equal Spaced Linear Log In progress No local points %1 %2 Time: %1 Value: %2 Duration: %3 No label Time: %1 Value: %2 Duration: %3 Label: %4 Draw Region Erase Region Drag Region Edit Region Relocate Region Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste RegionModel Region Time Frame Value Duration Label Unknown Edit Data RemoveLayerCommand Delete %1 Layer SVFileReader (derived model in SV-XML) Opening file or URL... SingleColourLayer Colour <unknown> SliceLayer %1 - %2 Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 First Mean Peak Time: %1 - %2 Range: %3 samples (%4) 0dB -Inf x10 Plot Type Scale Normalize Normalise Threshold Gain Sampling Mode Linear Meter Rev Log dB Any Bin Scale Bins Log Absolute Lines Steps Blocks Colours SparseModel Sparse Edit Data Insert Data Point Delete Data Point SparseModel::AddPointCommand Add Point SparseModel::DeletePointCommand Delete Point SparseModel::RelabelCommand Re-Label Point SparseOneDimensionalModel Sparse 1-D Time Frame Label Unknown Edit Data SparseTimeValueModel Sparse Time-Value Time Frame Value Label Unknown Edit Data SparseValueModel Sparse Value SpectrogramLayer Colour Colour Scale Window Size Window Overlap Normalize Columns Normalise Columns Normalize Visible Area Normalise Visible Area Normalization Bin Display Threshold Gain Colour Rotation Min Frequency Max Frequency Frequency Scale Bins Window Scale Linear Meter dBV^2 dBV Phase None Col View Hybrid 25 % 50 % 75 % 87.5 % 93.75 % No min 10 Hz 20 Hz 40 Hz 100 Hz 250 Hz 500 Hz 1 KHz 4 KHz 10 KHz 1.5 KHz 2 KHz 6 KHz 8 KHz 12 KHz 16 KHz No max Log All Bins Peak Bins Frequencies <unknown> dB FFT cache failed Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Peak Frequency: %1 - %2 Hz Peak Frequency: %1 Hz Peak Pitch: %3 - %4 Peak Pitch: %2 Time: %1 - %2 Time: %1 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 dB: %1 - %2 dB: %1 Phase: %1 - %2 Phase: %1 43Hz %1Hz SpectrumLayer Window Size Window Overlap Show Peak Frequencies Window Bins None 25 % 50 % 75 % 87.5 % 93.75 % %1 - %2 %1 - %2 Hz %1 Hz %1 %1 Bin: %2 (%3) %4 value: %5 dB: %6 First Mean Peak %1 Bin: %2 (%3) Value: %4 dB: %5 SubdividingMenu %1 - %2 Surveyer Yes! Take me to the survey No, thanks TextLayer Empty Label <no text> In progress Time: %1 Height: %2 Label: %3 Enter label Please enter a new label: Erase Point Drag Label Move Label Move Label Horizontally Move Label Vertically Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point TextModel Text Time Frame Height Label Unknown Edit Data Thumbwheel %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value TimeInstantLayer New Point Plot Type Instants Segmentation In progress No local points Time: %1 No label Time: %1 Label: %2 Draw Point Add Point at %1 s Erase Point Drag Point Move Point to %1 s Edit Point Drag Selection Resize Selection Delete Selection Re-align pasted instants? The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste TimeValueLayer New Point Plot Type Vertical Scale Scale Units Draw Segment Division Lines Show Derivative Scale Points Stems Connected Points Lines Curve Segmentation Discrete Curves Auto-Align Linear Log +/-1 In progress No local points %1 Hz (%2, %3) %1 %2 %1 Time: %1 Value: %2 No label Time: %1 Value: %2 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste The items you are pasting do not have values. What values do you want to use for these items? Some of the items you are pasting do not have values. What values do you want to use for these items? Zero for all items Choose value calculation Select cycle size Cycle size: TipDialog Tip of the Day Show tip on startup << Previous Next >> Close TransformFactory [\(<].*$ <unknown maker> Extract features using "%1" plugin (from %2) Extract features using "%1" output of "%2" plugin (from %3) %1 using "%2" plugin (from %3) %1 using "%2" output of "%3" plugin (from %4) Analysis Generator Other %1: %2 %1: Output %2 Extract "%1" data output from "%2" effect plugin (from %3) Extract data output %1 from "%2" effect plugin (from %3) Effects Data Effects Failed to list Vamp plugins: %1 Transform audio signal with "%1" effect plugin (from %2) Generate audio signal using "%1" plugin (from %2) Plugin type Category System Identifier Name Description Maker Units TransformFinder Find a Transform Find: <br>&nbsp;&nbsp;No results found Up Down <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <b>Unable to retrieve published descriptions from network!</b> <b>No plugins are currently installed!</b> <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. Found %n description(s) containing <b>%1</b>, showing the first %2 only Found %n description containing <b>%1</b>, showing the first %2 only Found %n descriptions containing <b>%1</b>, showing the first %2 only Found %n description(s) containing <b>%1</b> Found %n description containing <b>%1</b> Found %n descriptions containing <b>%1</b> <i> (not installed)</i> %1%2<br><small> </small> <b>%1</b>%2<br> <small>%1</small> <small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> UnitConverter Pitch cents In 12-tone Equal Temperament: = + Piano note in octave MIDI pitch Note that only pitches in the range 0 to 127 are valid in the MIDI protocol. Tempo Beat period at With concert-A tuning frequency at %1 Hz, and middle C residing in octave %2. (These can be changed in the application preferences.) View Global Scroll Global Zoom Follow Playback Scroll Page Off <unknown> Layer rendering error Alignment Waiting for layers to be ready... Cancel Rendering image... Exported image from %1 ViewManager Clear Selection Select Multiple Regions Select Region Enter Navigate mode Enter Select mode Enter Edit mode Enter Draw mode Enter Erase mode Enter Measure mode Enter NoteEdit mode Switch on Loop mode Switch off Loop mode Switch on Play Selection mode Switch off Play Selection mode Switch on Play Solo mode Switch off Play Solo mode Switch on Alignment mode Switch off Alignment mode Scroll to %1 Zoom to %n sample(s) per pixel Change overlay level WaveformLayer Scale Gain Normalize Visible Area Normalise Visible Area Channels Linear Meter dB Separate Mean Butterfly Time: %1 - %2 Time: %1 Level: Left: Right: Channel %1 %1 %2 - %3 (%4 dB peak) %1 %2 (%3 dB peak) 0dB WindowShapePreview V / time dB / freq WritableWaveFileModel Writable Wave File sonic-visualiser-3.0.3/i18n/sonic-visualiser_en_US.qm0000644000000000000000000000534613111512442020652 0ustar 00000000000000<¸dÊÍ!¿`¡½ÝB¨?,Zîÿ¢åYS³ô:­­y¦¦6Âr¦6Âl¦6ÂÔ®ûËÄ¡® ÔþN  ,¥|âÁ¨ñNÒ}¿ªJüøé2aùYY clÓ¢ ¢új nÄj÷ '© › Aœ 0i %1 (%n change)%1 (%n changes)%1 (%n change(s)) BundleCommand ColorColourColour3DPlotLayer Add New Color...Add New Colour...ColourComboBox>Enter a name for the new color: Enter a name for the new colour:ColourComboBoxName New ColorName New ColourColourComboBoxLPrefer black background for this color'Prefer black background for this colourColourComboBoxfFailed to initialize feature extraction plugin "%1"3Failed to initialise feature extraction plugin "%1"!FeatureExtractionModelTransformer4Coarse counter (measures):Coarse counter (bars):LabelCounterInputDialogRCyclical two-level counter (measure/beat)%Cyclical two-level counter (bar/beat)LabellerColor 3D PlotColour 3D PlotLayer6Background color preferenceBackground colour preference Preferences8Default color 3d plot color:Default colour 3D plot colour:PreferencesDialogDDefault melodic spectrogram color:#Default melodic spectrogram colour:PreferencesDialog4Default spectrogram color:Default spectrogram colour:PreferencesDialog ColorColourSingleColourLayer ColorsColours SliceLayer ColorColourSpectrogramLayerColor RotationColour RotationSpectrogramLayerColor Scale Colour ScaleSpectrogramLayerRFound %n description containing <b>%1</b>TFound %n descriptions containing <b>%1</b>,Found %n description(s) containing %1TransformFinderˆFound %n description containing <b>%1</b>, showing the first %2 onlyŠFound %n descriptions containing <b>%1</b>, showing the first %2 onlyGFound %n description(s) containing %1, showing the first %2 onlyTransformFinderˆsonic-visualiser-3.0.3/i18n/sonic-visualiser_en_US.ts0000644000000000000000000131247513111512442020670 0ustar 00000000000000 ActivityLog Activity Log <p>Activity Log lists your interactions and other events within %1.</p> %1: %2 AddLayerCommand Add %1 Layer AggregateWaveModel Aggregate Wave AlignmentModel Alignment AlignmentView AlignmentView AudioCallbackPlaySource Play from %1 Stop at %1 Change time-stretch factor to %1 AudioCallbackRecordTarget recorded-%1.wav Recorded %1 AudioDial %1: %2 %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value BZipFileDevice File is already open Append mode not supported File access mode not specified Read and write modes both specified Failed to open file for writing Failed to open file handle for writing Failed to open bzip2 stream for writing Failed to open file for reading Failed to open file handle for reading Failed to open bzip2 stream for reading Internal error (open for neither read nor write) File not open bzip2 stream write close error bzip2 stream read close error Internal error (close for neither read nor write) bzip2 stream read error BundleCommand %1 (%n change(s)) %1 (%n change) %1 (%n changes) CSVFileWriter Failed to open file %1 for writing CSVFormatDialog Select Data Format Please select the correct data format for this file. <ignore> Values (%1 more) Time End time Duration Value Pitch Label Timing is specified: Explicitly, in seconds Explicitly, in milliseconds Explicitly, in audio sample frames Implicitly: rows are equally spaced in time Audio sample rate (Hz): Frame increment between rows: Data will be displayed in a %1 layer. Colour3DPlotLayer Colour Color Scale Normalization Invert Vertical Scale Gain Always Opaque Smooth Bin Scale Bins Linear Log +/-1 Absolute None Col View Hybrid <unknown> dB Time: %1 - %2 Bin: %3 Value: %4 ColourComboBox Name New Colour Name New Color Enter a name for the new colour: Enter a name for the new color: Prefer black background for this colour Prefer black background for this color Add New Colour... Add New Color... CommandHistory &Undo Ctrl+Z Undo the last editing operation Re&do Ctrl+Shift+Z Redo the last operation that was undone Undo %1 Redo %1 Nothing to undo Nothing to redo &Undo %1 Re&do %1 CoreAudioFileReader Decoding %1... DecodingWavFileReader Decoding %1... Dense3DModelPeakCache Dense 3-D Peak Cache DenseThreeDimensionalModel Dense 3-D Time Frame DenseTimeValueModel Dense Time-Value Document Set main model to %1 Clear main model EditableDenseThreeDimensionalModel Editable Dense 3-D FFTModel FFT %1 Hz Fader Enter new fader level New fader level, from %1 to %2 dBFS: Level: Off Level: %1%2.%3%4 dB FeatureExtractionModelTransformer Transforms supplied to a single FeatureExtractionModelTransformer instance must be similar in every respect except plugin output No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Failed to instantiate plugin "%1" Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Failed to initialise feature extraction plugin "%1" Failed to initialize feature extraction plugin "%1" Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Plugin "%1" has no outputs Plugin "%1" has no output named "%2" FileSource Unsupported scheme in URL Downloading %1... Download cancelled Failed to create local file %1 File contains no data! FlexiNoteLayer New Point Vertical Scale Scale Units Scale Auto-Align Linear Log MIDI Notes In progress No local points %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 %2 Time: %1 Pitch: %2 Duration: %3 No label Time: %1 Pitch: %2 Duration: %3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Add Point Snap Notes Merge Notes Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Record FlexiNote FlexiNoteModel FlexiNote Time Frame Pitch Duration Level Label Unknown Edit Data I Edit Data ImageDialog Image Label: File or URL: Browse... Preview Unsupported scheme in URL The URL scheme "%1" is not supported Opening image URL... File download failed Failed to download URL "%1": %2 ImageLayer In progress Select image Move Image Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point Opening image URL... ImageModel Image Edit Image Time Frame Label Unknown Edit Data InteractiveFileFinder Select file All files (*.*) Select a session file Audio files (%1) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) Image files (%1) All files (*.*) File does not exist <b>File not found</b><p>File "%1" does not exist File is not readable <b>File is not readable</b><p>File "%1" can not be read Directory selected <b>Directory selected</b><p>File "%1" is a directory Non-file selected <b>Not a file</b><p>Path "%1" is not a file File is empty <b>File is empty</b><p>File "%1" is empty %1 session files (*.%1) RDF files (%3) All files (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2) %3 session files (*.%4) Audio files (%2) RDF files (%1) All files (*.*) Scalable Vector Graphics files (*.svg) All files (*.*) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2 %3) %4 session files (*.%5) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) %1 session files (*.%2) All files (*.*) Select a file to export to WAV audio files (*.wav) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Portable Network Graphics files (*.png) All files (*.*) Comma-separated data files (*.csv) Text files (*.txt) All files (*.*) File exists <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? Failed to open file Locate file... Use URL... Cancel Use URL Please enter the URL to use for this file: Failed to open location <b>Failed to open location</b><p>URL "%1" could not be opened ItemEditDialog Timing Time: frames sec usec Duration: Properties Value: Text: OK Reset Cancel KeyReference & <i>or</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> %1: Key and Mouse Reference LabelCounterInputDialog Set Counters Fine counter (beats): Coarse counter (bars): Coarse counter (measures): Labeller No numbering Simple counter Cyclical counter Cyclical two-level counter (bar/beat) Cyclical two-level counter (measure/beat) Audio sample frame number Time in seconds Duration to the following item Tempo (bpm) based on duration to following item Duration since the previous item Tempo (bpm) based on duration since previous item Same as the nearest previous item Value extracted from the item's label (where possible) %1.%2 %1 Label Points Subdivide Points Winnow Points Layer Waveform Spectrogram Ruler Time Instants Time Values Notes Flexible Notes Regions Text Images Colour 3D Plot Color 3D Plot Spectrum Time Slice Unknown Layer Make Measurement Delete Measurement LayerTreeDialog Layer Summary Audio Data Sources Panes and Layers LayerTreeModel Layer Shown Played Model LevelPanToolButton Click to adjust level and pan LevelPanWidget Drag vertically to adjust level, horizontally to adjust pan MIDIFileImportDialog Merge all tracks Merge all non-percussion tracks Select track or tracks to import <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: Error in MIDI file import MIDIFileReader Wrong length for long data in MIDI stream (%1, should be %2) Wrong length for int data in MIDI stream (%1, should be %2) getMIDIByte called but no MIDI file open End of MIDI file encountered while reading Attempt to get more bytes than expected on Track Attempt to read past MIDI file end getMIDIBytes called but no MIDI file open Attempt to get more bytes than available on Track (%1, only have %2) getNumberFromMIDIBytes called but no MIDI file open skipToNextTrack called but no MIDI file open Invalid event code %1 found Running status used for first event in track MIDI file "%1" has no notes in any track - uses GM percussion channel Track %1 (%2)%3 Track %1 (untitled)%3 %1 - vel %2 MIDIInput Input MP3FileReader Decoding %1... MainWindow Black Red Blue Green Purple Orange White Bright Red Bright Blue Bright Green Bright Purple Bright Orange &Layer &Transform &File File Toolbar File and Session Management &New Session Ctrl+N Ctrl+O &Open... Open a session file, audio file, or layer &Save Session Ctrl+S Save Session &As... Ctrl+Shift+S Ctrl+I &Export Audio File... Export selection as an audio file Import Annotation &Layer... Ctrl+L Import layer data from an existing file Export layer data to a file Export Image File... Export a single pane to an image file Open Lo&cation... Playback Speed Ctrl+Shift+O Open or import a file from a remote URL Export Audio Data... &Preferences... Adjust the application preferences &Quit Ctrl+Q &Edit Editing Cu&t Ctrl+X Cut the selection from the current layer to the clipboard &Copy Ctrl+C Copy the selection from the current layer to the clipboard &Paste Ctrl+V Paste from the clipboard to the current layer Paste at Playback Position Ctrl+Shift+V Paste from the clipboard to the current layer, placing the first item at the playback position &Delete Selected Items Del Delete items in current selection from the current layer Selection Select &All Ctrl+A Select the whole duration of the current session Select &Visible Range Ctrl+Shift+A Select the time range corresponding to the current window width Select to &Start Shift+Left Select from the start of the session to the current playback position Select to &End Shift+Right Select from the current playback position to the end of the session C&lear Selection Esc Clear the selection Tapping Time Instants &Insert Instant at Playback Position Enter Insert a new time instant at the current playback position, in a new layer if necessary ; Insert Instants at Selection &Boundaries Shift+Enter Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Insert Item at Selection Insert a new note or region item corresponding to the current selection Number New Instants with Cycle size Reset Numbering Counters Reset to 1 all the counters used for counter-based labelling Set Numbering Counters... Set the counters used for counter-based labelling Renumber Selected Instants Renumber the selected instants using the current labelling scheme Panning and Navigation &View Scroll &Left Left Scroll the current pane to the left Scroll &Right Right Scroll the current pane to the right &Jump Left Ctrl+Left Scroll the current pane a big step to the left J&ump Right Ctrl+Right Scroll the current pane a big step to the right Peek Left Alt+Left Scroll the current pane to the left without moving the playback cursor or other panes Peek Right Alt+Right Scroll the current pane to the right without moving the playback cursor or other panes Zoom Zoom &In Up Increase the zoom level Zoom &Out Down Decrease the zoom level Restore &Default Zoom Restore the zoom level to the default Zoom to &Fit F Zoom to show the whole file Display Features Show &Centre Line ' Show or hide the centre line Toggle All Time Rulers Show &No Overlays 0 Hide centre indicator, frame times, layer names and scale Hide center indicator, frame times, layer names and scale Show &Minimal Overlays 9 Show centre indicator only Show center indicator only 8 Show centre indicator, frame times and scale Show center indicator, frame times and scale Show &All Overlays # Export audio from selection into a data file Export Annotation La&yer... Ctrl+Y Export SVG File... Export a single pane to a scalable SVG image file Browse Recorded Audio Folder Open the Recorded Audio folder in the system file browser Ctrl+Shift+Return Subdivide Selected Instants... Add new instants at regular intervals between the selected instants Winnow Selected Instants... Remove subdivisions, leaving only every Nth instant Show or hide all time rulers Hide times, layer names, and scale Show times and basic scale Show times, layer names, and scale Show &Zoom Wheels Z Show thumbwheels for zooming horizontally and vertically Show Property Bo&xes X Show the layer property boxes at the side of the main window Show Status &Bar Show context help information in the status bar at the bottom of the window Show La&yer Summary Y Open a window displaying the hierarchy of panes and layers in this session Show Acti&vity Log Open a window listing interactions and other events Show &Unit Converter Open a window of pitch and timing conversion utilities Go Full-Screen F11 Expand the pane area to the whole screen &Pane Managing Panes and Layers Add &New Pane N Add a new pane containing only a time ruler Add New %1 Layer Add a new empty layer of type %1 T Add &Waveform W Add a new pane showing a waveform view Shift+W Add a new layer showing a waveform view Add Spectro&gram G Add a new pane showing a spectrogram Shift+G Add a new layer showing a spectrogram Add &Melodic Range Spectrogram M Add a new pane showing a spectrogram set up for an overview of note pitches Shift+M Add a new layer showing a spectrogram set up for an overview of note pitches Add Pea&k Frequency Spectrogram K Add a new pane showing a spectrogram set up for tracking frequencies Shift+K Add a new layer showing a spectrogram set up for tracking frequencies Add Spectr&um U Add a new pane showing a frequency spectrum Shift+U Add a new layer showing a frequency spectrum &All Channels Mixed &All Channels Channel &%1 %1: %2 Switch to Previous Pane [ Make the next pane up in the pane stack current Switch to Next Pane ] Make the next pane down in the pane stack current &Delete Pane Ctrl+Shift+D Delete the currently active pane Add &Time Ruler Add a new layer showing a time ruler Add &Existing Layer Add S&lice of Layer Switch to Previous Layer { Make the previous layer in the pane current Switch to Next Layer } Make the next layer in the pane current &Rename Layer... R Rename the currently active layer Edit Layer Data E Edit the currently active layer as a data grid &Delete Layer Ctrl+D Delete the currently active layer &Recent Transforms %1 by Category Unclassified %1 by Plugin Name %1 by Maker Unknown [\(<].*$ %1... Find a Transform... Search for a transform from the installed plugins, by name or description Ctrl+M &Help Help &Help Reference F1 &Key and Mouse Reference F2 What's &New? Show changes in this release of %1 Ctrl+R Re-open Re-open the current or most recently opened file Standard Waveform Choose Default Template... Ctrl+T Repeat Transform Re-select the most recently run transform Playback and Transport Controls Play&back Playback Playback Toolbar Rewind to Start Home Rewind to the start Rewind PgUp Rewind to the previous time instant or time ruler notch Rewind to Similar Point Shift+PgUp Rewind to the previous similarly valued time instant Play / Pause Space Start or stop playback from the current position Fast Forward PgDown Fast-forward to the next time instant or time ruler notch Fast Forward to Similar Point Shift+PgDown Fast-forward to the next similarly valued time instant Fast Forward to End End Fast-forward to the end Record Ctrl+Space Record a new audio file Play Mode Toolbar Constrain Playback to Selection s Constrain playback to the selected regions Loop Playback l Loop playback Solo Current Pane o Solo the current pane during playback Align File Timelines Treat multiple audio files as versions of the same work, and align their timelines Speed Up Ctrl+PgUp Time-stretch playback to speed it up without changing pitch Slow Down Ctrl+PgDown Time-stretch playback to slow it down without changing pitch Restore Normal Speed Ctrl+Home Restore non-time-stretched playback Edit Toolbar Tool Selection Export the whole pane Export the visible area only Which region of the current pane do you want to export as a scalable SVG image? Failed to save SVG file Failed to save SVG file %1 Failed to query transform attributes <b>Failed to query transform attributes</b><p>Plugin or server error: %1</p> Multiplexed audio Transform failed <b>Failed to run transform</b><p>Plugin or server error: %1</p> Playback speed: %1% (%2x slower) Playback speed: %1% (%2x faster) Subdivide instants Number of subdivisions: Winnow instants Remove all instants apart from multiples of: <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform %1failed:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform %1failed.<p>No error information is available. <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment:<p>%1 Adjust the master playback level and pan With Qt v%1 &copy; The Qt Company <br>With Rubber Band Library v%1 &copy; Particular Programs Ltd <br>With Rubber Band Library &copy; Particular Programs Ltd <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam and QMUL <br>With Piper Vamp protocol bridge &copy; QMUL <br>With Dataquay Qt/RDF library &copy; Particular Programs Ltd <br>With Cap'n Proto serialisation &copy; Sandstorm Development Group Russian UI translation contributed by Alexandre Prokoudine. Czech UI translation contributed by Pavel Fric. <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %2 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> Tools Toolbar Navigate 1 Select 2 Select ranges Edit Navigate Tool Mouse Actions Click left button and drag to move around Zoom to Area Shift-click left button and drag to zoom to a rectangular area Relocate Double-Click Left Double-click left button to jump to clicked location Double-click left button on an item to edit it Select Tool Mouse Actions Click left button and drag to select region; drag region edge to resize Multi Select Cmd-click left button and drag to select an additional region Ctrl-click left button and drag to select an additional region Fine Select Shift-click left button and drag to select without snapping to items or grid 3 Edit items in layer Edit Tool Mouse Actions Move Click left button on an item or selected region and drag to move Draw 4 Draw new items in layer Draw Tool Mouse Actions Click left button and drag to create new item Erase 5 Erase items from layer Erase Tool Mouse Actions Click left button on an item to remove it from the layer Measure 6 Make measurements in layer Measure Tool Mouse Actions Measure Area Click left button and drag to measure a rectangular area Measure Item Click left button and drag to measure extents of an item or shape &Delete Current Measurement Delete the measurement currently under the mouse pointer Fast Forward to Next Instant Fast forward to the next time instant in the current layer Rewind to Previous Instant Rewind to the previous time instant in the current layer Fast Forward to Next Point Fast forward to the next point in the current layer Rewind to Previous Point Rewind to the previous point in the current layer Fast forward No audio file loaded. %1Hz (resampling to %2Hz) Failed to open file <b>File open failed</b><p>Audio file "%1" could not be opened 1. %2 %1. %2 Select audio file to export Which audio file do you want to export from? Export the selected region only Export the whole audio file Select region to export Which region from the original audio file do you want to export? Export the selected regions into separate files Multiple regions of the original audio file are selected. What do you want to export? Fragment file %1 already exists, aborting Export multiple audio files Export audio to "%1" Failed to write file <b>File open failed</b><p>Layer file %1 could not be opened. <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Enter template name Please enter a name for the saved template: Set as default template for future audio files Template file exists <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? http://www.sonicvisualiser.org/doc/reference/%1/en/ What's New <h3>What's New in %1</h3> <b>Note:</b> A newer version of Sonic Visualiser is available.<br>(Version %1 is available; you are using version %2) %1 : %2 configuration, %3-bit build <br>With Serd and Sord RDF parser and store &copy; David Robillard About %1 Newer version available Failed to open file %1 for writing Abandon the current %1 session and start a new one &Import More Audio... Import an extra audio file into a new pane Replace &Main Audio... Replace the main audio file of the session with a different file Open &Recent Save the current session into a %1 session file Save the current session into a new %1 session file Apply Session Template Export Session as Template... Manage Exported Templates Exit %1 Open the %1 reference manual Open a window showing the keystrokes you can use in %1 %1 on the &Web Open the %1 website &About %1 Show information about %1 Export the selected regions into a single file Export the whole file Can't export non-note layers to MIDI Export layer to "%1" Export the whole pane (%1x%2 pixels) Export the visible area only (%1x%2 pixels) Export the selection extent (%1x%2 pixels) Export the selection extent Which region of the current pane do you want to export as an image? Note: the whole pane is too wide to be exported as a single image. Failed to save image file Failed to save image file %1 <b>File open failed</b><p>File "%1" could not be opened Open Location Please enter the URL of the location to open: Failed to open location <b>Open failed</b><p>URL "%1" could not be opened <b>Open failed</b><p>File or URL "%1" could not be opened Failed to open dropped URL <b>Open failed</b><p>Dropped URL "%1" could not be opened Export image to "%1" Session modified <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? Close the current session and create a new one Add this data to the current session Select target for import <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? Failed to save file <b>Save failed</b><p>Session file "%1" could not be saved. Save session as "%1" Multiplex all of the above Rename Layer New name for this layer: Playback speed: Normal Selection: %1 to %2 (duration %3) Visible: %1 to %2 (duration %3) Sample rate mismatch <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. Audio processing overload <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. Problems loading plugins Add Point Reset Counters Failed to generate layer Warning Failed to regenerate layer <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 Failed to calculate alignment Adjust the master playback speed http://www.sonicvisualiser.org/ Release %1 : Revision %2 Release %1 Unreleased : Revision %1 <h3>About Sonic Visualiser</h3> <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> Debug Release <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>With Ogg file decoder &copy; CSIRO Australia <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>With libsamplerate &copy; Erik de Castro Lopo <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>With libsndfile &copy; Erik de Castro Lopo <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>With FFTW3 &copy; Matteo Frigo and MIT <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>With RtMidi &copy; Gary P. Scavone <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>With liblo Lite OSC library &copy; Steve Harris </small><p><small>The OSC URL for this instance is: "%1" Add %1 Pane MainWindowBase %1 (modified) (modified) Cut Paste Add Point Add Point at %1 s Add Item at %1 s Opening file or URL... Select target for import %1: %2 %1: %2 [%3] Import "%1" Opening playlist... Importing from RDF... Opening session... Not enough disc space <b>Not enough disc space</b><p>There doesn't appear to be enough spare disc space to accommodate any necessary temporary files.</p><p>Please clear some space and try again.</p> Not enough memory <b>Not enough memory</b><p>There doesn't appear to be enough memory to accommodate any necessary temporary data.</p> Close the current session and start a new one Replace the main audio file in this session Add the audio file to this session <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? Import audio file "%1" Import layer XML file "%1" Import MIDI file "%1" SV XML file read error: %1 Import session file "%1" Open session template "%1" Failed to import RDF <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> Import RDF document "%1" <b>No audio available</b><p>Could not open an audio device.</p> <b>No audio available</b><p>Could not open audio device: %1</p> <p>Automatic audio device detection failed. Audio playback and recording will not be available during this session.</p> <p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1").</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1"): %2.</p> <p>Audio playback and recording will not be available during this session.</p> <p>Audio playback will not be available during this session.</p> Couldn't open audio device Recording: %1 Failed to write file <b>Save failed</b><p>Failed to write to file "%1": %2 No record device available <b>No record device available</b><p>Failed to find or open an audio device for recording. Only playback will be available.</p> Recording failed <b>Recording failed</b><p>Failed to switch to record mode (some internal problem?)</p> Import Recorded Audio Add Pane Remove Pane Delete Pane Playing: %1 of %2 (%3 remaining) ModelDataTableDialog Data Editor Playback Toolbar Play Mode Toolbar Track Playback Toggle tracking of playback position Edit Toolbar Insert New Item Insert Insert a new item Delete Selected Items Delete Delete the selected item or items Data in Layer Find: ModelMetadataModel Type Name Maker Source ModelTransformerFactory %1 <%2> %1: %2 NetworkPermissionTester Welcome to Sonic Visualiser <h2>Welcome to Sonic Visualiser!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.</p><p>Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.</p><p><hr></p><p><b>Before we go on...</b></p><p>Sonic Visualiser would like permission to use the network.</p> <p>This is to:</p><ul><li> Find information about available and installed plugins;</li><li> Support the use of Open Sound Control; and</li><li> Tell you when updates are available.</li></ul> <p>This is to:</p><ul><li> Find information about available and installed plugins; and</li><li> Tell you when updates are available.</li></ul> <p><b>No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else.</b> We will however make aggregate counts of distinct requests for usage reporting.</p><p>We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.<br></p> Allow this NoteLayer New Point Vertical Scale Scale Units Scale Auto-Align Linear Log MIDI Notes In progress No local points %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 %2 Time: %1 Pitch: %2 Duration: %3 No label Time: %1 Pitch: %2 Duration: %3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Record Note NoteModel Note Time Frame Pitch Duration Level Label Unknown Edit Data OggVorbisFileReader Decoding %1... Overview Overview Click and drag to navigate; double-click to jump Pane Horizontal Zoom Vertical Zoom Reset zoom to default Some lengthy prefix: Reference Unaligned Aligning: %1% Aligned %1 - %2 +%1 (R) (X) %1 / %2Hz%3 Zoom Zoom In Wheel Up Zoom Out Wheel Down General Pane Mouse Actions Wheel Zoom in or out in time axis Scroll Ctrl+Wheel Scroll rapidly left or right in time axis Zoom Vertically Shift+Wheel Zoom in or out in the vertical axis Scroll Vertically Alt+Wheel Scroll up or down in the vertical axis Navigate Middle Click middle button and drag to navigate with any tool Relocate Double-Click Middle Double-click middle button to relocate with any tool Menu Right Show pane context menu Enter new range New vertical display range, from %1 to %2 %4: Drag Selection Resize Selection Click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to move the selection boundary Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Click and drag to select a range; middle-click and drag to navigate Click to add a new item in the active layer Click to erase an item from the active layer Click and drag an item in the active layer to move it; hold Shift to override initial resistance Click and drag to move all items in the selected range Click and drag to adjust the visible range of the vertical scale Click and drag to adjust the vertical zoom level Click and drag to adjust the horizontal zoom level Reset horizontal and vertical zoom levels to their defaults PlayParameterRepository Adjust Playback Parameters Change Playback Mute State Change Playback Gain Change Playback Pan Change Playback Sample PluginParameterBox This plugin has no adjustable parameters. Program PluginParameterDialog Plugin Parameters Name: Version: Maker: Copyright: Output: Input Material Restrict to selection extents Channels Processing Advanced >> Channel mismatch This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. are is This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. This plugin only has a single channel input, but the source has %1 channels. Use mean of source channels Use channel %1 only Window size: Audio frames per block: Window increment: Window shape: Advanced << Preferences Spectrogram y-axis interpolation: Spectrogram x-axis interpolation: Frequency of concert A Property box layout Spectral analysis window shape Playback resampler type Normalise audio signal when reading from audio file Omit temporaries from Recent Files menu Resample mismatching files on import Load mp3 files in gapless mode Single fixed sample rate to resample all files to Location for cache file directory Background colour preference Background color preference Time display precision Use hours:minutes:seconds format Label middle C as Font size for text overlays Show splash screen on startup Show boxes for all panes Show box for current pane only Rectangular Triangular Hamming Hann Blackman Gaussian Parzen Nuttall Blackman-Harris Fastest Standard Highest quality None Linear interpolation 4 x Oversampling 4 x Oversampling with interpolation Follow desktop theme Dark background Light background Standard (to millisecond) High resolution (to microsecond) 24 FPS 25 FPS 30 FPS 50 FPS 60 FPS C0 - middle of octave scale C3 - common MIDI sequencer convention C4 - ASA American standard C5 - used in Cakewalk and others Preferences PreferencesDialog Sonic Visualiser: Application Preferences Apply Green (auto) <home directory> Follow system locale Russian British English American English Czech %1: Overview waveform colour: Run Vamp plugins in separate process: Default session template when loading audio files: (Use "%1" in the File menu to add to these.) Export Session as Template... Audio service: Audio playback device: Audio record device: A&udio I/O User interface language Allow network usage Draw layers at Retina resolution: Default spectrogram colour: Default spectrogram color: Default melodic spectrogram colour: Default melodic spectrogram color: Default colour 3D plot colour: Default color 3d plot color: &Appearance Anal&ysis Standard Waveform Session &Template &Other OK Cancel Select a directory to create cache subdirectory in Preferences <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> Preferences Changed Some preferences have been changed but not applied. Apply them before closing? ProgressDialog Cancel PropertyBox Show Add New Colour... Add New Color... Name New Colour Name New Color Enter a name for the new colour: Enter a name for the new color: Prefer black background for this colour Prefer black background for this color Click to toggle playback Set playback clip: Adjust playback level and pan of %1 Change sound used for playback (currently "%1") (current value: %1%2) (current value: %1) Toggle Visibility of %1 Toggle Playback of %1 Toggle %1 property of %2 Adjust %1 property of %2%3 PropertyContainer yes on true no off false Set %1 Property PropertyStack Change Layer Visibility Click to change the current active layer QApplication Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser QFile File "%1" does not exist Failed to open file "%1" File or URL "%1" could not be retrieved QMessageBox Failed to open file File or URL "%1" could not be opened <b>Audio required</b><p>Please load at least one audio file before importing annotation data QObject External plugin host executable does not appear to be installed Could not start external plugin host External plugin host exited unexpectedly while listing plugins External plugin host invocation failed: %1 <b>Failed to scan for plugins</b><p>Failed to scan for plugins at startup. Possibly the plugin checker program was not correctly installed alongside %1?</p> <b>Did not scan for plugins</b><p>Apparently no scan for plugins was attempted (internal error?)</p> <b>Failed to load plugins</b><p>Failed to load one or more plugin libraries:</p> <p>These plugins may be incompatible with the system, and will be ignored during this run of %1.</p> <unknown> Green White on Black Black on White Cherry Wasp Ice Sunset Fruit Salad Banded Highlight Printer High Gain RDFImporter Importing audio referenced in RDF... Importing dense signal data from RDF... Importing event data from RDF... RangeInputDialog to RangeSummarisableTimeValueModel Range-Summarisable Time-Value ReadOnlyWaveFileModel Wave File RegionLayer New Region Vertical Scale Scale Units Plot Type Scale Bars Segmentation Auto-Align Equal Spaced Linear Log In progress No local points %1 %2 Time: %1 Value: %2 Duration: %3 No label Time: %1 Value: %2 Duration: %3 Label: %4 Draw Region Erase Region Drag Region Edit Region Relocate Region Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste RegionModel Region Time Frame Value Duration Label Unknown Edit Data RemoveLayerCommand Delete %1 Layer SVFileReader (derived model in SV-XML) Opening file or URL... SingleColourLayer Colour Color <unknown> SliceLayer %1 - %2 Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 First Mean Peak Time: %1 - %2 Range: %3 samples (%4) 0dB -Inf x10 Plot Type Scale Normalize Threshold Gain Sampling Mode Linear Meter Rev Log dB Any Bin Scale Bins Log Absolute Lines Steps Blocks Colours Colors SparseModel Sparse Edit Data Insert Data Point Delete Data Point SparseModel::AddPointCommand Add Point SparseModel::DeletePointCommand Delete Point SparseModel::RelabelCommand Re-Label Point SparseOneDimensionalModel Sparse 1-D Time Frame Label Unknown Edit Data SparseTimeValueModel Sparse Time-Value Time Frame Value Label Unknown Edit Data SparseValueModel Sparse Value SpectrogramLayer Colour Color Colour Scale Color Scale Window Size Window Overlap Normalization Bin Display Threshold Gain Colour Rotation Color Rotation Min Frequency Max Frequency Frequency Scale Bins Window Scale Linear Meter dBV^2 dBV Phase None Col View Hybrid 25 % 50 % 75 % 87.5 % 93.75 % No min 10 Hz 20 Hz 40 Hz 100 Hz 250 Hz 500 Hz 1 KHz 4 KHz 10 KHz 1.5 KHz 2 KHz 6 KHz 8 KHz 12 KHz 16 KHz No max Log All Bins Peak Bins Frequencies <unknown> dB FFT cache failed Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Peak Frequency: %1 - %2 Hz Peak Frequency: %1 Hz Peak Pitch: %3 - %4 Peak Pitch: %2 Time: %1 - %2 Time: %1 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 dB: %1 - %2 dB: %1 Phase: %1 - %2 Phase: %1 43Hz %1Hz SpectrumLayer Window Size Window Overlap Show Peak Frequencies Window Bins None 25 % 50 % 75 % 87.5 % 93.75 % %1 - %2 %1 - %2 Hz %1 Hz %1 %1 Bin: %2 (%3) %4 value: %5 dB: %6 First Mean Peak %1 Bin: %2 (%3) Value: %4 dB: %5 SubdividingMenu %1 - %2 Surveyer Yes! Take me to the survey No, thanks TextLayer Empty Label <no text> In progress Time: %1 Height: %2 Label: %3 Enter label Please enter a new label: Erase Point Drag Label Move Label Move Label Horizontally Move Label Vertically Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point TextModel Text Time Frame Height Label Unknown Edit Data Thumbwheel %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value TimeInstantLayer New Point Plot Type Instants Segmentation In progress No local points Time: %1 No label Time: %1 Label: %2 Draw Point Add Point at %1 s Erase Point Drag Point Move Point to %1 s Edit Point Drag Selection Resize Selection Delete Selection Re-align pasted instants? The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste TimeValueLayer New Point Plot Type Vertical Scale Scale Units Draw Segment Division Lines Show Derivative Scale Points Stems Connected Points Lines Curve Segmentation Discrete Curves Auto-Align Linear Log +/-1 In progress No local points %1 Hz (%2, %3) %1 %2 %1 Time: %1 Value: %2 No label Time: %1 Value: %2 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste The items you are pasting do not have values. What values do you want to use for these items? Some of the items you are pasting do not have values. What values do you want to use for these items? Zero for all items Choose value calculation Select cycle size Cycle size: TipDialog Tip of the Day Show tip on startup << Previous Next >> Close TransformFactory [\(<].*$ <unknown maker> Extract features using "%1" plugin (from %2) Extract features using "%1" output of "%2" plugin (from %3) %1 using "%2" plugin (from %3) %1 using "%2" output of "%3" plugin (from %4) Analysis Generator Other %1: %2 %1: Output %2 Extract "%1" data output from "%2" effect plugin (from %3) Extract data output %1 from "%2" effect plugin (from %3) Effects Data Effects Failed to list Vamp plugins: %1 Transform audio signal with "%1" effect plugin (from %2) Generate audio signal using "%1" plugin (from %2) Plugin type Category System Identifier Name Description Maker Units TransformFinder Find a Transform Find: <br>&nbsp;&nbsp;No results found Up Down <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <b>Unable to retrieve published descriptions from network!</b> <b>No plugins are currently installed!</b> <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. Found %n description(s) containing <b>%1</b>, showing the first %2 only Found %n description containing <b>%1</b>, showing the first %2 only Found %n descriptions containing <b>%1</b>, showing the first %2 only Found %n description(s) containing <b>%1</b> Found %n description containing <b>%1</b> Found %n descriptions containing <b>%1</b> <i> (not installed)</i> %1%2<br><small> </small> <b>%1</b>%2<br> <small>%1</small> <small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> UnitConverter Pitch cents In 12-tone Equal Temperament: = + Piano note in octave MIDI pitch Note that only pitches in the range 0 to 127 are valid in the MIDI protocol. Tempo Beat period at With concert-A tuning frequency at %1 Hz, and middle C residing in octave %2. (These can be changed in the application preferences.) View Global Scroll Global Zoom Follow Playback Scroll Page Off <unknown> Layer rendering error Alignment Waiting for layers to be ready... Cancel Rendering image... Exported image from %1 ViewManager Clear Selection Select Multiple Regions Select Region Enter Navigate mode Enter Select mode Enter Edit mode Enter Draw mode Enter Erase mode Enter Measure mode Enter NoteEdit mode Switch on Loop mode Switch off Loop mode Switch on Play Selection mode Switch off Play Selection mode Switch on Play Solo mode Switch off Play Solo mode Switch on Alignment mode Switch off Alignment mode Scroll to %1 Zoom to %n sample(s) per pixel Change overlay level WaveformLayer Scale Gain Normalize Visible Area Channels Linear Meter dB Separate Mean Butterfly Time: %1 - %2 Time: %1 Level: Left: Right: Channel %1 %1 %2 - %3 (%4 dB peak) %1 %2 (%3 dB peak) 0dB WindowShapePreview V / time dB / freq WritableWaveFileModel Writable Wave File sonic-visualiser-3.0.3/i18n/sonic-visualiser_ru.qm0000644000000000000000000045552013111512442020272 0ustar 00000000000000<¸dÊÍ!¿`¡½ÝB)( :&Sn0|1|A2|‘3|³4|Õ5|÷6}8};9}];}EÅ#FÓCGÝ£KãaMädNèäRøPTU!<W#X&µY&×Z&ù[(Ý](ÿl*Uo*ws*™{*»}*ÝUŒãPø¹‘Óe’Ó²;Qö;¤ÜÀ"TÀ'È‚™‚Í¥‚âF‚0Û†¼O®^®g(J—ñ-I^1-©^S6‚Èa6‚-HYÈÆIAÓŠJ´ÙJ¼À›JÄ0 LDÇÞL“É'O•¼ŠSWŽSW%ESWV SWÀVSWÊSWÜŠSWýÐUÆ)ÐX´úrhvâîh…†uÆ®6{@ÍÊîËy³Q {½T„ƒ±„ƒð…úÔ%žâ%âù_ FÈ6W%Ö>W%å9wúׂ%×A‚%åg§%×ݧ%啈“¾KS3SÈòSÙ6Sæ.“µ³<§Ô¾Å¶ÞÃöÞ#º¸‡Ãî»ÅE×þ™×þÉ|×þÜ×þ-ëèNŒZì0ÞJö5Þ{+Ôãƒ;~ÊF;~æ\;~.Ä£sÓï ¤î¤7zªAÑÿ«i¹8®¢b¬0±bä Ô·£¹˜—ÒMÙ×Ð_§ôØç_Ýðj`¡ç¬S„²è°.õÊO#}úÖÅvéØEÍ< Þž¶p®ÄÛ@ Z5K!1zŸY7“eD’7“eÕk7“e·<© £IdÙÀS³ô[ÑTAEÎeôžw—nÎT¿“nûëoåd¾úrkR£_ušÉáëzŒ.郣ɟ„XeV†¾Æ¥ˆb¦)‹49“õA•Ma…˜·‚ÆTš’ñ¡,œnMª7Нɩ!ð¯É©R˜±U$€ñ¶rθ¹_‹(ØÁNá íÒ@·ÝžCylàËâç—¿¥縿é Ûä é¢Ûã°ìƒú¯ò*ãxù„—cþB Z!´ã6Õ²9£n"УnS&£n¾£nùŽ+Q¬œœ©±#³3î$Cu»k$ùÕ)Ð*éÓ3+v4›u<9â‰,£:‘n¡>]M#êBjƒz¢D‚ êE^É"RY.{^U<SæV:€:W”ÒÈÊ](òUÛaÀÞ¹ºkvâ mÉáépzAFq§[s5t‚ÿsP¥¿¸v"9ÐçvSζáz'î‰y{n‚퇄‚r…„‚„‚K„‚rä„‚+‰„‚@½„‚™­î´­î­îp±­î\cާÇÕ‚ëô5•Š,Óš¢Ý§—­­yV ®Ï“]õ²Ây¶Š¥yó¶®Â˜]º™Õ1Œº÷žÒ¾â 켿ëL÷Ãl•)UÃl•ZCÃl•ÄQÃl•&ÄEÕc(Î+AÖvN³§ÞÇòû±ãŽ wäŒÓØùèË™qì;_5Òò`\½ûmZ=™© o9Ï/wê °1D†á+«µ1„e&ûI¹sbKS‡ng>€kVm\âËp/T±Äy#=þ}yC°ƒ‚KSˆ•ƒ$ú×rƒ¨ï)‰ ¢ÂQŠãàéŒ "}¡’KSˆÑ˜:—£‚¾#*²êÞwI¸[%ì¸[%ñS¸{~1͸{~X¸{~rѸ{~Áà¸{~í¥¸{~÷R¸{~1¸¬Õåɺ%ØBº%åü\Eog×M®ÝÅìD;–ôu2.ô«Þí/ú)‰AîûTµ~ûtôÎþ ¢ ê!QûÁŽâÅWÝ ÆsŠø3ž OÊÔŒ$¥ó%—xì &D$¥Ì'šxL,qÁ/3-¿é02IdµÞ3"´Ã5ä´Ûá9=‰ š>"|ês`eŽ#cj«%{¶n§{ÿ$Ð}„ÎÞ¨„ƒ „ˆJ´»7“Z#ɘI¼Cú˜I¼Qw˜I¼ ˜I¼ª˜I¼(©š7™ Şə»³¢zÔ°Ò¦6Âe¦6ÂÇΦ6ÂÙg«Žñ¹h«Žó¹™«Žô¹Ê«Žùº5«Žüºf«ŽýºÓ«Žþ»«Žÿ»5«»à«¼«¼«¾«¾2«¾c« ¾”« p¬,¥:é­´êÿ®ûþ´3»Â‡ÿÂx~’S†{†ïÞƾ¤1ÇØ µ•ÈÈ¢FÉ,öaÉתßÔÏdNFÕ^Ο9Ö”©„=ØZÒ³Üß||Üàž|ÈßüÕ;eäôN ›å#sýë«Ç—ë«ÇÕËëýôîðñR:G÷ÀѶ4ýüeä }Ã\awžºœ”<°ƒs¿ ŸR}BÁ~]q%/ÞS%/Þºú%/ÞLJ%/Þس%/Þ(5'‹ú-T(óF+ÇÓ×,Ëú.T0K‚R0K‚% 0K‚UÖ0K‚À 0K‚ɯ0K‚ÜO0K‚ýe0K‚.Œ583jµ8Z~vK0l]O|-yQsˆÝ’QsþÝ×Qý¥”~V\êuíXÚž‹Zu…f9\¾ä¿\Ø9Œþ]Æ«E^?­<Üau.n×h„Õðth ¾Ák¶ÞòÂr´`v³ÿ(|KuqÞ|—%ø~³•Ò4‚f0……’AL‰öüï΋¦„ú=‹¼’ ý‹à^Å‚ŒàD’ßz/¥•¿5#•¿5Sn•¿5¾y•¿5ùÛš–,sXš–,*–œ+¤ó8³^8 Ç¨ «¡z==>£:~Oç¦È•@¬!ÄhT¬Yļà°(Š¡Ø°@GRü°¿a h¾ˆ,!R¾ˆ,.¿Ä¡®ÙšÈ8 Ô¼È;ŠS3˨|ÕÔäîÜQÔþN$•×/ÔܽàKgá|àKgç_à­Ž-†à­Ž0¥ä< $äN>{ìóX}|ò–„D:ò©òפ'õk®Šÿ™ë€Bƒ®2 %ÉÛ +¹[þt»ß\ õÀg"¤':“xä79Ë9èN™Jè3‰±LŒÕ2ÅSåT$SåTUSåTôpSåTü’Wô"ˆWô¥Wô.ÈWôÎ9_,î'`_PÔwËa1µe÷UÁ!e÷UËe÷Uö†e÷Uþæjñù‚kOn›Ql¾yˆu#dÎévtjxž—-}ìukà„ÃEá…«âq‡þ0ᯇþ0çˆct©‹þàߎARø“.3Q‚• î–Ý?öÊœ§+—£€) "£S£µ ¨…%x™º¼]»``e»wRÒc¿¤ùƪÀÿ9’çÇ€Ž¸ŠË|*~óË¥µâË¥µçÝÌÖ£RÍËî%Ò$‰Æ×A­ ×2o8I؃ãPæÜøhÝû‡X@ß¶iàªG#ÀãºÉCjèÇRô×èÇR>éJž+µóEejPüëô’cè“'¦è“X£è“Âuè“Ìž£üvµÄ±ý ,¥‰  £Œ^u^hC‚µ`GØÄUVØÄê¶ØÄô»ØÄüÛ 2X#ϵzx$ Sa)¥ubŸ,ꚟ[/[Þ8—9 ¤,=ª>Ëd=ª>£¤Gž…×GHíBKKq0KòO™ÿL¹êÞQ$ Tlu@W>|ë6i¾á~somùwv¨ ª¸…Çfކ…¼(¢†…¼Y•ŒÏ—-üÒÎ_Z’¼¯•è-{¤\Œ§•4þë«6ÃèY¬AÝ)ˆ­7î¯D„ ï¾—ƒÌËŸÐДñÐðåLÔÚãÞIÚŽìÿâÁÅãÐrfJé\âª,ê¥9lîBCžñNÒ¤õGŽS’ø$ÿþÿÑ‘Ø-Й?NÖD\'^*Íj®6"’Zj,Û.G¼/¦Ea:1Ïìé2ò¢]Ç2ò¢È2ò¢ä‘2ò¢è 3è~@|73—ßE(És§I-Ä.;J& yᇠ‹Ó$Ê ‹Ó/Ò ‹ÓU™ ‹Ó¿á ‹Óêù ‹Óõ ‹Óý# ‰Þw·  Dc® O¤} Ö¼“^ )DÇ 2R1[ 8†eʯ :¬þµF >½þ+? ?§dŠ C‰7# Mgþ ü NðIañ Sè$#ç Sè$T. Sè$ów Sè$ûŸ SèÔ$4 SèÔTÊ SèÔô! SèÔüE VÀÌé’ W ”%È W ”0g W ”Vƒ W ”ìL W ”õ® W ”þ bêTÁ c••ظ c••0ô dg2û lHñs zã^G {г_p }ê”iŽ „#¤ D „#¤9° „iƒ+Œ ‡æ— ‹Ã„× •sÒ2í š0J…Ø ¡~ÄÙ ¡~äÚ4 £{$º £ò²ú ¦8Õš ¦8ÕÈ‹ §nS; ª‡O&š ª‡O1N ª‡OWF ª‡OÁ` ª‡Oí' ª‡Oÿ[ ¬óÊÖ ¬óÊò; ¯ûÓäó Á_ç¸ ÊŸ.¦Ê Íòîã Ïç Ý`­4 âÎD íÞ94 ðb”'î ðb”Xæ 9„²œ ØY C t¿ §Z¥ :­ 5â+ô !nO†ý *$‰3 +’"¯e -xY 1õ׫ 5  5£Šh 5£ŠðÎ 9‹:Û 9‹:ð@ 9ͳý½ ;fœ* ?•Kˆ ?¦…0? C”\”q Ošƒ^» Q-þ@û X‘^2 _Y,F clÓÉL ed5.ƒ Н𢠄­$–$ …}e¯ ‰‰.n ”«6á ˜´³xL ¦õßÉ ¬ûnýN µå^ˆ ·_d·þ ºÒw¯# ÀIî ÃóN/} ÃóNTv ÃóNo ÃóN¿= ÃóNéÚ ÃóNóÆ ÃóNûì ȨíXƒ Ë(Cd¾ ÐÿÃZÆ ÑJß%› Ö³~ÚQ Ø¢-@ ع:™ Ý…Ìào Þ9*ÿ çÌÀ+ ïäž‚¯ öW{?( úlêžý èy"= èyRà èyù jq‹} •A¦y wœþ ”Î{ ¤‘· ¢ú¡ ŸDs â=Wà ? ê. -»vF 3ME£ 7TÉIà F)< N>Îv Pv³Î RwC%‰ RwCVI `B}¬‘ cƒ$^ dÃt' dÃtWÄ dÃtÿÞ e®  nÄj¢˜ o&þ3É r›Î u t`\– yü ~ {WRqŠ ~Wy? ˆŽ%ø¸ еê4 Œ»s#€ Œ»sSÌ Œ»s¾Ù Œ»sû8 Œþ¡úÔ ‘flø]  "´ÃY £õ˜ ¬Æù-< ¯Œ): °°Çœ ±½ô& Âp‰q? ̺ó < ÐoC Ò˜¾à Õ}dò; Þ¼ä\— áˆnvÎ ï ¾¯¼ ïƒÝ]^ òõ‘!ë õíNo¹ ùyÁ ùŸùMÔ û-/)! š} ÜÎ CÛØ *÷} l%F‘ ¥¨ ÄÞz* !ËáÅt 'î{Ý '© %å ,Ru¤) -¤%8Q 5%ût 5%q˜ <és©. >…Dt• Ifn+ù K1Ð KÑÜ Oà¼ç Q©–Z RVŽ+: RVŽ3Ý RVŽ!± RVŽ\* RVŽÅä RVŽÐ\ RVŽÑ  RVŽï¥ S âÌÕ [y i `É¥§¡ a§Øy a§å÷ b.ß$ b³ • b´ •¡ h50 t)³õ2 t“¥½… }žî{ ˆ¬î¢ ˆ¬î)  ˆ¬îZ‰ ˆ¬îÄ™ ‰ò…È8 ЬäŠC úß ’'’ä† –&b50 –P  —Z<O– —‹VM ™œÓþ šÚ…U š[ê† §Ì£Ã §ô7ÌÍ ¨z.Še ¨Õ®Lø ¯óÓéC ±?£;& ³ÍyK× ³ß£uˆ ¿(Ah Éʧ]˜ ÎyŽ‘T Ø5¾›Ù Ý‘z ÝÂ¥‰ ê·“o» ðbÁÉO óJ´2 üÿ¤à ÿHŸ¯ ×Á(" ¸’r: ôt'× áNò WËX )_>Û )ƒÙ ` -«¥H 4âU Aœ TQ DYñ¼² DYô¼õ DYÿ½8 DZ½{ DZ½¾ DZ ) FTÎÊ Oqæ P€}æN [¥Ü ]–Dò} ^B“Ͻ fÒ$Âü iÞIëé kµ$M lFs. o$9‡ ug1 ð uò0Í z›4Œ zÖ=§ {¾±_ ‚Ë—h÷ ‰P#; ‹–ï ”Sš ¢­ë ¤é’Qæ ­ÔW ±Æ²Ä¯ ²tód* ·§ß ¹Ê¼^« ÃFÎʈ ƨ´Ùh Ç‚òÀà әN µ Ú!müï à&ˆ£ ãÈã“{ ñæ™kq ò³¼S òÀD´z óB,eÊ ÷ºT4Ý þ£Btý?âwHr2~ñ®žÑ \ÅÓ)þ6[þ/,[þéB[þó %j™G*™^ Ü.•IFéF÷ó ˆK>ÖÎh8…•hóéHôk 4¸£nßM¢roþ:ßpr×b kt×*¯ñuÀÞË{S¾–±€WN5¡€WNǤ劄„@Œ#…P£}Þ…P£-µŠÅj…•ŒÄSŽð5ª$©]ó«Ó4E€°ôÕ4²»àw ¾®ð«¾(­¦ÁæÄqÁæÄ,Í->"ÔÜ­«ûÞ;âÌzáÜ_|æt‚ç»õ³êëYW&í\tì~õ@™®øõ@p"õ½N*1 yÜÄSõI @<m¤ Vt¼B ðÉwü¥ÒlòÂùŒˆ"Ƥ~Z%és©:*ÇÚäÈ-e³i?²ºE?²ºñ­CS ½ D8ŽJ«de#L!õ÷N¥ ­tO™23^[m4!^^—äCi‹jjb2mý£¿u°T\{sC/{sCòÀƒ¶ŽìËJCÓ–ÒÛœ›co„´ZY蘞j·7ŸjßJ úŠp⥺4V®T–ÄÏÞ °ÇÌóŠÕéTôz×Ù£¨;݉vá@™PAått›ått(oèc vúìîˆþc^,ÿ.ÒÆ`ÿ.Ò<i1ü %1: %2%1: %2 ActivityLogf<p>!?8A>: 2A5E ?@54?@8=OBKE 20<8 459AB289 A %1.</p>G

Activity Log lists your interactions and other events within %1.

 ActivityLog C@=0; 87<5=5=89 Activity Log ActivityLog >1028BL A;>9 %1 Add %1 LayerAddLayerCommandK@02=820=85 AlignmentAlignmentModel\!<5=0 :>MDD8F85=B0 @0ABO65=8O 2> 2@5<5=8 =0 %1 Change time-stretch factor to %1AudioCallbackPlaySource*>A?@>872545=85 >B %1 Play from %1AudioCallbackPlaySource,AB0=>2:0 2 ?>78F88 %1 Stop at %1AudioCallbackPlaySource %1: %2%1: %2 AudioDial%1: %2%3%1: %2%3 AudioDial%2%3%2%3 AudioDialL2548B5 =>2>5 7=0G5=85 >B %1 4> %2 %3:#Enter a new value from %1 to %2 %3: AudioDialF2548B5 =>2>5 7=0G5=85 >B %1 4> %2: Enter a new value from %1 to %2: AudioDial,2548B5 =>2>5 7=0G5=85Enter new value AudioDialP>2>5 7=0G5=85 4;O «%1», >B %2 4> %3 %4:#New value for %1, from %2 to %3 %4: AudioDialJ>2>5 7=0G5=85 4;O «%1», >B %2 4> %3: New value for %1, from %2 to %3: AudioDialT 568< 4>102;5=8O 2 :>=5F =5 ?>445@68205BAOAppend mode not supportedBZipFileDeviceR5 C40;>AL >B:@KBL ?>B>: bzip2 4;O GB5=8O'Failed to open bzip2 stream for readingBZipFileDeviceR5 C40;>AL >B:@KBL ?>B>: bzip2 4;O 70?8A8'Failed to open bzip2 stream for writingBZipFileDeviceD5 C40;>AL >B:@KBL D09; 4;O GB5=8OFailed to open file for readingBZipFileDeviceD5 C40;>AL >B:@KBL D09; 4;O 70?8A8Failed to open file for writingBZipFileDeviceB!?>A>1 4>ABC?0 : D09;0< =5 C:070=File access mode not specifiedBZipFileDevice(-B>B D09; C65 >B:@KBFile is already openBZipFileDevice$09; =5 >B:@KB File not openBZipFileDevicen=CB@5==OO >H81:0 (=5 70:@K205BAO =8 GB5=85, =8 70?8AL)1Internal error (close for neither read nor write)BZipFileDevicez=CB@5==OO >H81:0 (=5 >B:@K205BAO =8 =0 GB5=85, =8 =0 70?8AL)0Internal error (open for neither read nor write)BZipFileDeviceB 568<K GB5=8O 8 70?8A8 >?@545;5=K#Read and write modes both specifiedBZipFileDeviceFH81:0 70:@KB8O GB5=8O ?>B>:0 bzip2bzip2 stream read close errorBZipFileDevice4H81:0 GB5=8O ?>B>:0 bzip2bzip2 stream read errorBZipFileDeviceHH81:0 70:@KB8O 70?8A8 2 ?>B>: bzip2bzip2 stream write close errorBZipFileDevice"%1 (%n 87<5=5=85)"%1 (%n 87<5=5=8O)"%1 (%n 87<5=5=89)%1 (%n change(s)) BundleCommandJ5 C40;>AL >B:@KBL D09; %1 4;O 70?8A8"Failed to open file %1 for writing CSVFileWriterB'0AB>B0 AM<?;8@>20=8O 72C:0 (F):Audio sample rate (Hz):CSVFormatDialog;8B5;L=>ABLDurationCSVFormatDialog 5B:0LabelCSVFormatDialogKA>B0 B>=0PitchCSVFormatDialog,K15@8B5 D>@<0B 40==KESelect Data FormatCSVFormatDialog @5<OTimeCSVFormatDialog=0G5=85ValueCSVFormatDialog±1+/-1Colour3DPlotLayer<=58725AB=>> Colour3DPlotLayer1A>;NB=K9AbsoluteColour3DPlotLayer$A5340 =5?@>7@0G=> Always OpaqueColour3DPlotLayer8=KBinsColour3DPlotLayer&25BColourColour3DPlotLayer#A8;5=85GainColour3DPlotLayerD=25@B8@>20BL <0AHB01 ?> 25@B8:0;8Invert Vertical ScaleColour3DPlotLayer8=59=K9LinearColour3DPlotLayer>30@8D<8G5A:89LogColour3DPlotLayer0AHB01ScaleColour3DPlotLayerF@5<O: %1 - %2 Bin: %3 =0G5=85: %4Time: %1 - %2 Bin: %3 Value: %4Colour3DPlotLayer1dBColour3DPlotLayer,>1028BL =>2K9 F25B...Add New Colour...ColourComboBox<2548B5 =0720=85 =>2>3> F25B0: Enter a name for the new colour:ColourComboBox(09B5 F25BC =0720=85Name New ColourColourComboBoxN@54?>G8B0BL G5@=K9 D>= 4;O MB>3> F25B0'Prefer black background for this colourColourComboBox&B<5=8BL&UndoCommandHistory.&B<5=8BL 459AB285 «%1»&Undo %1CommandHistoryCtrl+Shift+Z Ctrl+Shift+ZCommandHistory Ctrl+ZCtrl+ZCommandHistory05B ?>2B>@O5<KE 459AB289Nothing to redoCommandHistory.5B >B<5=O5<KE 459AB289Nothing to undoCommandHistory5&@=CBLRe&doCommandHistory0>2B>&@8BL 459AB285 «%1»Re&do %1CommandHistory(>2B>@ 459AB28O «%1»Redo %1CommandHistoryF>2B>@8BL ?>A;54=55 459AB285 ?@02:8'Redo the last operation that was undoneCommandHistory(B<5=0 459AB28O «%1»Undo %1CommandHistoryDB<5=8BL ?>A;54=55 459AB285 ?@02:8Undo the last editing operationCommandHistory$5:>48@C5BAO %1...Decoding %1...CoreAudioFileReader$5:>48@C5BAO %1...Decoding %1...DecodingWavFileReaderK1>@:0FrameDenseThreeDimensionalModel @5<OTimeDenseThreeDimensionalModel0G8AB8BL >A=>2=CN <>45;LClear main modelDocument6!45;0BL %1 >A=>2=>9 <>45;LNSet main model to %1Document %1 F%1 HzFFTModelFFTFFTFFTModel<22548B5 =>2K9 C@>25=L D5945@0Enter new fader levelFader*#@>25=L: %1%2.%3%4 1Level: %1%2.%3%4 dBFader#@>25=L: 2K:; Level: OffFaderP>2K9 C@>25=L D5945@0, >B %1 4> %2 dBFS:$New fader level, from %1 to %2 dBFS:FaderT# ?;038=0 "%1" =5B 2KE>40 A =0720=85< "%2"$Plugin "%1" has no output named "%2"!FeatureExtractionModelTransformer4# ?;038=0 "%1" =5B 2KE>4>2Plugin "%1" has no outputs!FeatureExtractionModelTransformer&!:0G820=85 >B<5=5=>Download cancelled FileSource"!:0G8205BAO %1...Downloading %1... FileSourceH5 C40;>AL A>740BL ;>:0;L=K9 D09; %1Failed to create local file %1 FileSource0$09; =5 A>45@68B 40==KE!File contains no data! FileSource45?>445@68205<0O AE5<0 URLUnsupported scheme in URL FileSource %1 %2%1 %2FlexiNoteLayer%1 (%2, %3 F)%1 (%2, %3 Hz)FlexiNoteLayer%1F (%2, %3)%1 Hz (%2, %3)FlexiNoteLayer>1028BL B>G:C Add PointFlexiNoteLayer 2B>2K@02=820=85 Auto-AlignFlexiNoteLayer.7<5=8BL 7=0G5=85 B>G:8Change Point ValueFlexiNoteLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected PointsFlexiNoteLayer 5@5B0I8BL B>G:C Drag PointFlexiNoteLayer 0@8A>20BL B>G:C Draw PointFlexiNoteLayer7<5=8BL B>G:C Edit PointFlexiNoteLayer ?@>F5AA5 In progressFlexiNoteLayer8=59=K9LinearFlexiNoteLayer>30@8D<8G5A:89LogFlexiNoteLayer>BK MIDI MIDI NotesFlexiNoteLayer>20O B>G:0 New PointFlexiNoteLayer&5B ;>:0;L=KE B>G5:No local pointsFlexiNoteLayerAB028BLPasteFlexiNoteLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items?FlexiNoteLayer"5@5<5AB8BL B>G:CRelocate PointFlexiNoteLayer0AHB01ScaleFlexiNoteLayer48=8FK H:0;K Scale UnitsFlexiNoteLayerh@5<O: %1 KA>B0 B>=0: %2 ;8B5;L=>ABL: %3 5B:0: %4)Time: %1 Pitch: %2 Duration: %3 Label: %4FlexiNoteLayerh@5<O: %1 KA>B0 B>=0: %2 ;8B5;L=>ABL: %3 57 <5B:8(Time: %1 Pitch: %2 Duration: %3 No labelFlexiNoteLayer5@B. <0AHB01Vertical ScaleFlexiNoteLayer;8B5;L=>ABLDurationFlexiNoteModel7<5=8BL 40==K5 Edit DataFlexiNoteModelK1>@:0FrameFlexiNoteModel 5B:0LabelFlexiNoteModel#@>25=LLevelFlexiNoteModelKA>B0 B>=0PitchFlexiNoteModel @5<OTimeFlexiNoteModel58725AB=>UnknownFlexiNoteModel7<5=8BL 40==K5 Edit DataI@>A<>B@... Browse... ImageDialog>5 C40;>AL A:0G0BL URL "%1": %2Failed to download URL "%1": %2 ImageDialog.5 C40;>AL A:0G0BL D09;File download failed ImageDialog$09; 8;8 URL: File or URL: ImageDialog7>1@065=85Image ImageDialog 5B:0:Label: ImageDialogBB:@K205BAO 87>1@065=85 ?> URL...Opening image URL... ImageDialog@54?@>A<>B@Preview ImageDialog@!E5<0 URL "%1" =5 ?>445@68205BAO$The URL scheme "%1" is not supported ImageDialog45?>445@68205<0O AE5<0 URLUnsupported scheme in URL ImageDialog"#40;8B5 2K45;5=85Delete Selection ImageLayer(5@5B0I8BL 2K45;5=85Drag Selection ImageLayer ?@>F5AA5 In progress ImageLayer.5@5<5AB8BL 87>1@065=85 Move Image ImageLayer>20O B>G:0 New Point ImageLayerBB:@K205BAO 87>1@065=85 ?> URL...Opening image URL... ImageLayerAB028BLPaste ImageLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? ImageLayer27<5=8BL @07<5@ 2K45;5=8OResize Selection ImageLayer&K1@0BL 87>1@065=85 Select image ImageLayer7<5=8BL 40==K5 Edit Data ImageModel(7<5=8BL 87>1@065=85 Edit Image ImageModelK1>@:0Frame ImageModel7>1@065=85Image ImageModel 5B:0Label ImageModel @5<OTime ImageModel58725AB=>Unknown ImageModelh<b>K1@0= :0B0;>3</b><p>$09; "%1" O2;O5BAO :0B0;>3><4Directory selected

File "%1" is a directoryInteractiveFileFinderŽ<b>5 C40;>AL >B:@KBL <5AB>?>;>65=85</b><p>5 C40;>AL >B:@KBL URL "%1".=Failed to open location

URL "%1" could not be openedInteractiveFileFinder–<b>$09; ACI5AB2C5B</b>$09; "%1" C65 ACI5AB2C5B. K E>B8B5 ?5@570?8A0BL 53>?OFile exists

The file "%1" already exists. Do you want to overwrite it?InteractiveFileFinderF<b>CAB>9 D09;</b><p>$09; "%1" ?CAB)File is empty

File "%1" is emptyInteractiveFileFindern<b>$09; =5G8B05<</b><p>$09; "%1" =5 <>65B 1KBL ?@>G8B0=7File is not readable

File "%1" can not be readInteractiveFileFinder¾<b>$09; =5 =0945=</b><p>5 C40;>AL >B:@KBL 72C:>2>9 D09; "%1". K E>B8B5 C:070BL 53> ?@>3@0<<5?VFile not found

Audio file "%1" could not be opened. Do you want to locate it?InteractiveFileFinder¬<b>$09; =5 =0945=</b><p>5 C40;>AL >B:@KBL D09; "%1". K E>B8B5 C:070BL 53> ?@>3@0<<5?PFile not found

File "%1" could not be opened. Do you want to locate it?InteractiveFileFinder^<b>$09; =5 =0945=</b><p>$09; "%1" =5 ACI5AB2C5B0File not found

File "%1" does not existInteractiveFileFinderb<b>-B> =5 D09;</b><p>CBL "%1" =5 O2;O5BAO D09;><+Not a file

You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.

Please select the track or merged tracks you wish to import:MIDIFileImportDialog:H81:0 ?@8 8<?>@B5 D09;0 MIDIError in MIDI file importMIDIFileImportDialogL1J548=8BL 2A5 =5?5@:CAA8>==K5 4>@>6:8Merge all non-percussion tracksMIDIFileImportDialog,1J548=8BL 2A5 4>@>6:8Merge all tracksMIDIFileImportDialog^K15@8B5 >4=C 8;8 =5A:>;L:> 4>@>65: 4;O 8<?>@B0 Select track or tracks to importMIDIFileImportDialog@  8A?>;L7C5B :0=0; ?5@:CAA88 GM - uses GM percussion channelMIDIFileReader%1 - vel %2 %1 - vel %2MIDIFileReaderœ>?KB:0 ?>;CG8BL 87 4>@>6:8 1>;LH5 109B>2, G5< >6840;>AL (%1, 0 5ABL ;8HL %2)DAttempt to get more bytes than available on Track (%1, only have %2)MIDIFileReaderp>?KB:0 ?>;CG8BL 87 4>@>6:8 1>;LH5 109B>2, G5< >6840;>AL0Attempt to get more bytes than expected on TrackMIDIFileReader^>?KB:0 ?@>G8B0BL D09; MIDI ?>A;5 53> >:>=G0=8O"Attempt to read past MIDI file endMIDIFileReaderJ@8 GB5=88 >1=0@C65= :>=5F D09;0 MIDI*End of MIDI file encountered while readingMIDIFileReaderJ1=0@C65= =5:>@@5:B=K9 :>4 A>1KB8O %1Invalid event code %1 foundMIDIFileReaderT8 2 >4=>9 4>@>6:5 D09;0 MIDI "%1" =5B =>B(MIDI file "%1" has no notes in any trackMIDIFileReader">@>6:0 %1 (%2)%3Track %1 (%2)%3MIDIFileReader0>@>6:0 %1 (157 8<5=8)%3Track %1 (untitled)%3MIDIFileReaderŽ5?@028;L=0O 4;8B5;L=>ABL int-40==KE 2 ?>B>:5 MIDI (%1, 4>;6=> 1KBL %2);Wrong length for int data in MIDI stream (%1, should be %2)MIDIFileReader–5?@028;L=0O 4;8B5;L=>ABL 1>;LH8E 40==KE 2 ?>B>:5 MIDI (%1, 4>;6=> 1KBL %2) =8 >48= D09; MIDI =5 >B:@KB(getMIDIByte called but no MIDI file openMIDIFileReaderx$C=:F8O getMIDIBytes 2K720=0, => =8 >48= D09; MIDI =5 >B:@KB)getMIDIBytes called but no MIDI file openMIDIFileReaderŒ$C=:F8O getNumberFromMIDIBytes 2K720=0, => =8 >48= D09; MIDI =5 >B:@KB3getNumberFromMIDIBytes called but no MIDI file openMIDIFileReader~$C=:F8O skipToNextTrack 2K720=0, => =8 >48= D09; MIDI =5 >B:@KB,skipToNextTrack called but no MIDI file openMIDIFileReaderE>4Input MIDIInput$5:>48@C5BAO %1...Decoding %1... MP3FileReader [\(<].*$ [\(<].*$ MainWindow%1 ?> :0B53>@88%1 by Category MainWindow*%1 ?> 8<5=8 A>740B5;O %1 by Maker MainWindow,%1 ?> =0720=8N ?;038=0%1 by Plugin Name MainWindow%1 2 &=B5@=5B5%1 on the &Web MainWindow %1. %2%1. %2 MainWindow %1...%1... MainWindow %1: %2%1: %2 MainWindow@%1 F (@5AM<?;8@>20=85 4> %2 F)%1Hz (resampling to %2Hz) MainWindow & %1 &About %1 MainWindow&A5 :0=0;K &All Channels MainWindow&A5 &:0=0;K A2545=K&All Channels Mixed MainWindow!&:>?8@>20BL&Copy MainWindow.&#40;8BL 0:B82=K9 70<5@&Delete Current Measurement MainWindow&#40;8BL A;>9 &Delete Layer MainWindow#&40;8BL >:=> &Delete Pane MainWindow$&#40;8BL 2K1@0==>5&Delete Selected Items MainWindow&@02:0&Edit MainWindow@-&:A?>@B8@>20BL 72C:>2>9 D09;...&Export Audio File... MainWindow &$09;&File MainWindow&!?@02:0&Help MainWindow2& C:>2>4AB2> ?>;L7>20B5;O&Help Reference MainWindow:&<?>@B8@>20BL 5IQ 0C48>D09; &&Import More Audio... MainWindowRAB028BL &>B<5B:C 2 B>G:C 2>A?@>872545=8O$&Insert Instant at Playback Position MainWindow$5@5A:>G8BL 2&;52> &Jump Left MainWindow@&A?>;L7>20=85 :;0280BC@K 8 <KH8&Key and Mouse Reference MainWindow !&;>9&Layer MainWindow&!>740BL A5AA8N &New Session MainWindow&B:@KBL...&Open... MainWindow &:=>&Pane MainWindowAB&028BL&Paste MainWindow&0@0<5B@K...&Preferences... MainWindow &KE>4&Quit MainWindow0&5402=85 ?@5>1@07>20=8O&Recent Transforms MainWindow,&5@58<5=>20BL A;>9...&Rename Layer... MainWindow"!>E@&0=8BL A5AA8N &Save Session MainWindow@&5>1@07>20=8O &Transform MainWindow&84&View MainWindow00 MainWindow11 MainWindow 1. %21. %2 MainWindow22 MainWindow33 MainWindow44 MainWindow55 MainWindow66 MainWindow88 MainWindow99 MainWindow;; MainWindowb</small><p><small>4@5A OSC 4;O MB>9 A5AA88: "%1"8

The OSC URL for this instance is: "%1" MainWindowŒ<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL 72C:>2>9 D09; "%1"=File open failed

Audio file "%1" could not be opened MainWindowz<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL D09; "%1"7File open failed

File "%1" could not be opened MainWindow„<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL D09; A;>O "%1"<File open failed

Layer file %1 could not be opened. MainWindowÐ<b>5 C40;>AL >B:@KBL AAK;:C</b><p>5 C40;>AL >B:@KBL D09; URL "%1", ?5@5B0I5==K9 2 >:=> ?@>3@0<<K <KHLN9Open failed

Dropped URL "%1" could not be opened MainWindowŽ<b>5 C40;>AL >B:@KBL AAK;:C</b><p>5 C40;>AL >B:@KBL D09; 8;8 URL "%1"9Open failed

File or URL "%1" could not be opened MainWindow|<b>5 C40;>AL >B:@KBL AAK;:C</b><p>5 C40;>AL >B:@KBL URL "%1"1Open failed

URL "%1" could not be opened MainWindow<b>5 C40;>AL A>E@0=8BL D09;</b><p>5 C40;>AL A>E@0=8BL D09; A5AA88 "%1":Save failed

Session file "%1" could not be saved. MainWindowt<b>K15@8B5 F5;L 8<?>@B0</b><p>-B>B 4>:C<5=B RDF AAK;05BAO =0 >48= 8;8 1>;55 72C:>2KE D09;>2.<br># 20A C65 5ABL >48= 703@C65==K9 72C:>2>9 D09;.<br>'B> 2K E>B8B5 A45;0BL A =>2K<8 40==K<8?¶Select a target for import

This RDF document refers to one or more audio files.
You already have an audio waveform loaded.
What would you like to do with the new data? MainWindowš<b>!50=A 87<5=8;AO</b><p>:B82=K9 A50=A 87<5=8;AO<br>K E>B8B5 A>E@0=8BL 53>?[Session modified

The current session has been modified.
Do you want to save it? MainWindow®<br>! ?>445@6:>9 ?;038=>2 DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean BoltonU
With DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton MainWindowJ<br>! FFTW3 &copy; Matteo Frigo 8 MIT*
With FFTW3 © Matteo Frigo and MIT MainWindowR<br>! FFTW3 v%1 &copy; Matteo Frigo 8 MIT.
With FFTW3 v%1 © Matteo Frigo and MIT MainWindowl<br>! 181;8>B5:>9 JACK &copy; Paul Davis 8 Jack O'QuinD
With JACK audio output library © Paul Davis and Jack O'Quin MainWindowt<br>! 181;8>B5:>9 JACK v%1 &copy; Paul Davis 8 Jack O'QuinH
With JACK audio output library v%1 © Paul Davis and Jack O'Quin MainWindow¼<br>! ?>445@6:>9 ?;038=>2 LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld\
With LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld MainWindowp<br>! 45:>45@>< MAD mp3 &copy; Underbit Technologies Inc9
With MAD mp3 decoder © Underbit Technologies Inc MainWindowx<br>! 45:>45@>< mp3 MAD v%1 &copy; Underbit Technologies Inc=
With MAD mp3 decoder v%1 © Underbit Technologies Inc MainWindowT<br>! 45:>45@>< Ogg &copy; CSIRO Australia0
With Ogg file decoder © CSIRO Australia MainWindowˆ<br>! 45:>45@>< Ogg (oggz v%1, fishsound v%2) &copy; CSIRO AustraliaJ
With Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia MainWindowv<br>! 181;8>B5:>9 PortAudio &copy; Ross Bencina 8 Phil BurkI
With PortAudio audio output library © Ross Bencina and Phil Burk MainWindowŒ<br>! 181;8>B5:>9 PulseAudio &copy; Lennart Poettering 8 Pierre OssmanT
With PulseAudio audio output library © Lennart Poettering and Pierre Ossman MainWindow”<br>! 181;8>B5:>9 PulseAudio v%1 &copy; Lennart Poettering 8 Pierre OssmanX
With PulseAudio audio output library v%1 © Lennart Poettering and Pierre Ossman MainWindow¤<br>C E@0=8;8I5< 40==KE RDF Redland &copy; Dave Beckett 8 @8AB>;LA:89 C=825@A8B5BP
With Redland RDF datastore © Dave Beckett and the University of Bristol MainWindow¬<br>C E@0=8;8I5< 40==KE RDF Redland v%1 &copy; Dave Beckett 8 @8AB>;LA:89 C=825@A8B5BT
With Redland RDF datastore v%1 © Dave Beckett and the University of Bristol MainWindowF<br>! RtMidi &copy; Gary P. Scavone&
With RtMidi © Gary P. Scavone MainWindow¢<br>! ?>445@6:>9 ?;038=>2 Vamp (API v%1, host SDK v%2) &copy; Chris Cannam 8 QMULQ
With Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam and QMUL MainWindow`<br>! liblo Lite OSC library &copy; Steve Harris3
With liblo Lite OSC library © Steve Harris MainWindowf<br>! 181;8>B5:>9 OSC liblo v%1 &copy; Steve Harris7
With liblo Lite OSC library v%1 © Steve Harris MainWindow\<br>! libsamplerate &copy; Erik de Castro Lopo1
With libsamplerate © Erik de Castro Lopo MainWindowd<br>! libsamplerate v%1 &copy; Erik de Castro Lopo5
With libsamplerate v%1 © Erik de Castro Lopo MainWindowV<br>! libsndfile &copy; Erik de Castro Lopo.
With libsndfile © Erik de Castro Lopo MainWindow^<br>! libsndfile v%1 &copy; Erik de Castro Lopo2
With libsndfile v%1 © Erik de Castro Lopo MainWindowJ<h3> ?@>3@0<<5 Sonic Visualiser</h3>

About Sonic Visualiser

 MainWindowö<h3>>ABC?=0 =>20O 25@A8O ?@>3@0<<K</h3><p>K 8A?>;L7C5B55 Sonic Visualiser 25@A88 %1, => C65 4>ABC?=0 25@A8O %2.</p><p>03;O=8B5 =0 <a href="http://sonicvisualiser.org/">A09B Sonic Visualiser</a>, GB>1K C7=0BL ?>4@>1=>AB8.</p> {3>?} {3>?} {1 ?} {2 ?}ã

Newer version available

You are using version %1 of Sonic Visualiser, but version %2 is now available.

Please see the Sonic Visualiser website for more information.

 MainWindow0<h3>'B> =>2>3> 2 %1</h3>

What's New in %1

 MainWindow¢<p>Sonic Visualiser  ?@>3@0<<0 4;O ?@>A<>B@0 8 8AA;54>20=8O 72C:>70?8A59 A F5;LN A5<0=B8G5A:>3> 0=0;870 8 0==>B0F88 <C7K:8.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p>Æ

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.
http://www.sonicvisualiser.org/

 MainWindow >1028BL >:=> %1 Add %1 Pane MainWindow6>1028BL &ACI5AB2CNI89 A;>9Add &Existing Layer MainWindow\>1028BL A?5:B>3@0<<C &<5;>48G5A:>3> 480?07>=0Add &Melodic Range Spectrogram MainWindow(>1028BL &=>2>5 >:=> Add &New Pane MainWindow2>1028BL ;8=59:C &2@5<5=8Add &Time Ruler MainWindow0>1028BL &2>;=>2CN D>@<C Add &Waveform MainWindow0>1028BL =>2K9 A;>9 «%1»Add New %1 Layer MainWindowL>1028BL A?5:B>3@0<<C &?8:>2>9 G0AB>BKAdd Pea&k Frequency Spectrogram MainWindow>1028BL B>G:C Add Point MainWindow.>1028BL &D@03<5=B A;>OAdd S&lice of Layer MainWindowJ>1028BL &3@0D8: A?5:B@0;L=>9 DC=:F88 Add Spectr&um MainWindow,>1028BL &A?5:B>3@0<<CAdd Spectro&gram MainWindowH>1028BL =>2K9 ?CAB>9 A;>9 B8?0 «%1» Add a new empty layer of type %1 MainWindowL>1028BL =>2K9 A;>9 A G0AB>B>9 A?5:B@0,Add a new layer showing a frequency spectrum MainWindow`>1028BL =>2K9 A;>9 A >B>1@065=85< A?5:B@>3@0<<K%Add a new layer showing a spectrogram MainWindow”>1028BL =>2K9 A;>9, >B>1@060NI89 A?5:B@>3@0<<C 4;O >17>@0 2KA>BK B>=0 =>BLAdd a new layer showing a spectrogram set up for an overview of note pitches MainWindowŽ>1028BL =>2K9 A;>9, >B>1@060NI89 A?5:B@>3@0<<C 4;O >BA;56820=8O G0AB>BEAdd a new layer showing a spectrogram set up for tracking frequencies MainWindow<>1028BL =>2K9 A;>9 A ;8=59:>9$Add a new layer showing a time ruler MainWindowT>1028BL =>2K9 A;>9 A 284>< 2>;=>2>9 D>@<K'Add a new layer showing a waveform view MainWindowl>1028BL =>2>5 >:=>, A>45@60I55 B>;L:> ;8=59:C 2@5<5=8+Add a new pane containing only a time ruler MainWindowL>1028BL =>2>5 >:=> A G0AB>B>9 A?5:B@0+Add a new pane showing a frequency spectrum MainWindow`>1028BL =>2>5 >:=> A >B>1@065=85< A?5:B@>3@0<<K$Add a new pane showing a spectrogram MainWindow”>1028BL =>2>5 >:=>, >B>1@060NI55 A?5:B@>3@0<<C 4;O >17>@0 2KA>BK B>=0 =>BKAdd a new pane showing a spectrogram set up for an overview of note pitches MainWindowŽ>1028BL =>2>5 >:=>, >B>1@060NI55 A?5:B@>3@0<<C 4;O >BA;56820=8O G0AB>BDAdd a new pane showing a spectrogram set up for tracking frequencies MainWindowT>1028BL =>2>5 >:=> A 284>< 2>;=>2>9 D>@<K&Add a new pane showing a waveform view MainWindowJ>1028BL MB8 40==K5 2 0:B82=CN A5AA8N$Add this data to the current session MainWindowH7<5=8BL ?0@0<5B@K @01>BK ?@8;>65=8O"Adjust the application preferences MainWindowN7<5=8BL >1ICN A:>@>ABL 2>A?@>872545=8O Adjust the master playback speed MainWindow2K@>2=OBL ;8=59:8 2@5<5=8Align File Timelines MainWindowAlt+2;52>Alt+Left MainWindowAlt+2?@02> Alt+Right MainWindow.@8<5=8BL H01;>= A5AA88Apply Session Template MainWindow85@53@C7:0 2 >1@01>B:5 72C:0Audio processing overload MainWindow 'Q@=K9Black MainWindow !8=89Blue MainWindow/@:>-A8=89 Bright Blue MainWindow/@:>-75;Q=K9 Bright Green MainWindow/@:>->@0=652K9 Bright Orange MainWindow/@:>-?C@?C@=K9 Bright Purple MainWindow/@:>-:@0A=K9 Bright Red MainWindowPB:@KBL ?0?:C A 70?8A0==K<8 0C48>D09;0<8Browse Recorded Audio Folder MainWindow !=&OBL 2K45;5=85C&lear Selection MainWindow\52>7<>6=> M:A?>@B8@>20BL =5=>B=K5 A;>8 2 MIDI$Can't export non-note layers to MIDI MainWindow0=0; &%1 Channel &%1 MainWindow8K1@0BL H01;>= ?> C<>;G0=8N &Choose Default Template... MainWindow$G8AB8BL 2K45;5=85Clear the selection MainWindow˜)5;:=8B5 ;52>9 :;028H59 <KH8 8 ?5@5B0I8B5 :C@A>@ 4;O A>740=8O =>2>3> >1J5:B0-Click left button and drag to create new item MainWindowJ3@0=8G8BL 2>A?@>872545=85 2K45;5=85<Constrain Playback to Selection MainWindowl!:>?8@>20BL 2K45;5=85 87 0:B82=>3> A;>O 2 1CD5@ >1<5=0:Copy the selection from the current layer to the clipboard MainWindow Ctrl+ACtrl+A MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindowCtrl+Home Ctrl+Home MainWindow Ctrl+ICtrl+I MainWindow Ctrl+LCtrl+L MainWindowCtrl+;52> Ctrl+Left MainWindow Ctrl+MCtrl+M MainWindow Ctrl+NCtrl+N MainWindow Ctrl+OCtrl+O MainWindowCtrl+PgDown Ctrl+PgDown MainWindowCtrl+PgUp Ctrl+PgUp MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+RCtrl+R MainWindowCtrl+?@02> Ctrl+Right MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+A Ctrl+Shift+A MainWindowCtrl+Shift+D Ctrl+Shift+D MainWindowCtrl+Shift+O Ctrl+Shift+O MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+V Ctrl+Shift+V MainWindow Ctrl+TCtrl+T MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow Ctrl+YCtrl+Y MainWindow&K@570BLCu&t MainWindowfK@570BL 2K45;5=85 87 0:B82=>3> A;>O 2 1CD5@ >1<5=09Cut the selection from the current layer to the clipboard MainWindow 07<5@ F8:;0 Cycle size MainWindowB;04:0Debug MainWindow:#<5=LH8BL <0AHB01 >B>1@065=8ODecrease the zoom level MainWindowDelDel MainWindowd#40;8BL >1J5:BK 2 0:B82=>< 2K45;5=88 B5:CI53> A;>O8Delete items in current selection from the current layer MainWindow*#40;8BL 0:B82=K9 A;>9!Delete the currently active layer MainWindow*#40;8BL 0:B82=>5 >:=> Delete the currently active pane MainWindowX#40;8BL 70<5@, =0E>4OI89AO ?>4 :C@A>@>< <KH88Delete the measurement currently under the mouse pointer MainWindow*B>1@065=85 M;5<5=B>2Display Features MainWindow:2>9=>9 I5;G>: ;52>9 :;028H59Double-Click Left MainWindow=87Down MainWindow 8A>20=85Draw MainWindowVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< @8A>20=8ODraw Tool Mouse Actions MainWindow>0@8A>20BL =>2K5 >1J5:BK 2 A;>5Draw new items in layer MainWindowEE MainWindow @02:0Edit MainWindow(7<5=8BL 40==K5 A;>OEdit Layer Data MainWindow`A?>;L7>20=85 <KH8 A 8=AB@C<5=B>< @540:B8@>20=8OEdit Tool Mouse Actions MainWindow0=5;L ?@02:8 Edit Toolbar MainWindow*7<5=8BL >1J5:BK A;>OEdit items in layer MainWindowN7<5=8BL 0:B82=K9 A;>9 :0: A5B:C 40==KE.Edit the currently active layer as a data grid MainWindow 540:B8@>20=85Editing MainWindow >=5FEnd MainWindow EnterEnter MainWindow02548B5 =0720=85 H01;>=0Enter template name MainWindow !B5@:0Erase MainWindow(!B8@0BL >1J5:BK A;>OErase items from layer MainWindowEscEsc MainWindow*025@H8BL @01>BC A %1Exit %1 MainWindow>-:A?>@B8@>20BL A;>9 &0==>B0F89 &Export Annotation La&yer... MainWindow>-:A?>@B8@>20BL 72C:>2K5 40==K5 &Export Audio Data... MainWindowH-:A?>@B8@>20BL 2 D09; 87>1@065=8O...Export Image File... MainWindow0-:A?>@B8@>20BL D09; SVG &Export SVG File... MainWindowB-:A?>@B8@>20BL A5AA8N :0: H01;>= &Export Session as Template... MainWindowT-:A?>@B8@>20BL 2AQ >:=> 2 D09; 87>1@065=8O%Export a single pane to an image file MainWindow(-:A?>@B 72C:0 2 "%1"Export audio to "%1" MainWindow4-:A?>@B 87>1@065=8O 2 "%1"Export image to "%1" MainWindowB-:A?>@B8@>20BL 40==K5 A;>O 2 D09;Export layer data to a file MainWindow&-:A?>@B A;>O 2 "%1"Export layer to "%1" MainWindowR-:A?>@B8@>20BL =5A:>;L:> 72C:>2KE D09;>2 Export multiple audio files MainWindowR-:A?>@B8@>20BL 2K45;5==>5 2 72C:>2>9 D09;!Export selection as an audio file MainWindowP-:A?>@B8@>20BL B>;L:> 2K45;5==CN >1;0ABLExport the selected region only MainWindowr-:A?>@B8@>20BL 2K45;5==K5 >1;0AB8 2 @07=K5 72C:>2K5 D09;K/Export the selected regions into separate files MainWindow0-:A?>@B8@>20BL 2K45;5=85Export the selection extent MainWindowR-:A?>@B8@>20BL 2K45;5=85 (%1x%2 ?8:A5;>2)*Export the selection extent (%1x%2 pixels) MainWindowh-:A?>@B8@>20BL B>;L:> 2848<CN G0ABL (%1x%2 ?8:A5;>2)+Export the visible area only (%1x%2 pixels) MainWindowB-:A?>@B8@>20BL 25AL 72C:>2>9 D09;Export the whole audio file MainWindowP-:A?>@B8@>20BL 2AQ >:=> (%1x%2 ?8:A5;>2)$Export the whole pane (%1x%2 pixels) MainWindowFF MainWindowF1F1 MainWindowF11F11 MainWindowF2F2 MainWindowD5 C40;>AL @0AAG8B0BL 2K@02=820=85Failed to calculate alignment MainWindow.5 C40;>AL A>740BL A;>9Failed to generate layer MainWindowv5 C40;>AL >B:@KBL URL, ?5@5<5I5==K9 <KHLN 2 >:=> ?@>3@0<<KFailed to open dropped URL MainWindow.5 C40;>AL >B:@KBL D09;Failed to open file MainWindowJ5 C40;>AL >B:@KBL D09; %1 4;O 70?8A8"Failed to open file %1 for writing MainWindowB5 C40;>AL >B:@KBL <5AB>?>;>65=85Failed to open location MainWindow@5 C40;>AL ?>2B>@=> A>740BL A;>9Failed to regenerate layer MainWindow25 C40;>AL A>E@0=8BL D09;Failed to save file MainWindowJ5 C40;>AL A>E@0=8BL D09; 87>1@065=8OFailed to save image file MainWindowP5 C40;>AL A>E@0=8BL D09; 87>1@065=8O %1Failed to save image file %1 MainWindow05 C40;>AL 70?8A0BL D09;Failed to write file MainWindow"5@5<>B0BL 2?5@Q4 Fast Forward MainWindow&5@5<>B0BL 4> :>=F0Fast Forward to End MainWindow8?5@54 : ?5@2>9 AE>659 B>G:5Fast Forward to Similar Point MainWindowKAB@K9 2?5@54 Fast forward MainWindowl5@5<>B0BL 4> A;54CNI59 >B<5B:8 2@5<5=8 2 B5:CI5< A;>5:Fast forward to the next time instant in the current layer MainWindow&5@5<>B0BL 4> :>=F0Fast-forward to the end MainWindow0=5;L D09;>2 File Toolbar MainWindow6$09;K 8 C?@02;5=85 A5AA8O<8File and Session Management MainWindow:09B8 MDD5:B B@0=AD>@<0F88...Find a Transform... MainWindowK45;8BL B>G=> Fine Select MainWindowX$09; D@03<5=B0 %1 C65 ACI5AB2C5B, ?@5@K20=85)Fragment file %1 already exists, aborting MainWindowGG MainWindow&>;=>M:@0==K9 @568<Go Full-Screen MainWindow5;Q=K9Green MainWindow!?@02:0Help MainWindow ><>9Home MainWindow@&<?>@B8@>20BL A;>9 0==>B0F89...Import Annotation &Layer... MainWindow^B:@KBL 4>?>;=8B5;L=K9 0C48>D09; 2 =>2>9 ?0=5;8*Import an extra audio file into a new pane MainWindow`<?>@B8@>20BL 40==K5 A;>O 87 ACI5AB2CNI53> D09;0'Import layer data from an existing file MainWindow:#25;8G8BL <0AHB01 >B>1@065=8OIncrease the zoom level MainWindowXAB028BL >B<5B:8 2@5<5=8 ?> &:@0O< 2K45;5=8O(Insert Instants at Selection &Boundaries MainWindow6AB028BL >1J5:B 2 2K45;5=85Insert Item at Selection MainWindow°AB028BL =>2CN >B<5B:C 2@5<5=8 2 B>G:C 2>A?@>872545=8O, ?@8 =5>1E>48<>AB8  2 =>2K9 A;>9WInsert a new time instant at the current playback position, in a new layer if necessary MainWindow&&5@5A:>G8BL 2?@02> J&ump Right MainWindowKK MainWindow ;52>Left MainWindow.>A?@>872545=85 2 F8:;5 Loop Playback MainWindow.>A?@>872545=85 2 F8:;5 Loop playback MainWindowMM MainWindow4K?>;=OBL 87<5@5=8O 2 A;>5Make measurements in layer MainWindow2B:@KBL ?0?:C A H01;>=0<8Manage Exported Templates MainWindow4#?@02;5=85 >:=0<8 8 A;>O<8Managing Panes and Layers MainWindow7<5@8B5;LMeasure MainWindow 7<5@8BL >1;0ABL Measure Area MainWindow7<5@8BL >1J5:B Measure Item MainWindowVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< 87<5@5=8OMeasure Tool Mouse Actions MainWindow5@5<5AB8BLMove MainWindow.=>65AB25==>5 2K45;5=85 Multi Select MainWindow¸K1@0=> =5A:>;L:> >1;0AB59 8AE>4=>3> 72C:>2>3> D09;0. 0:CN 87 =8E 2K E>B8B5 M:A?>@B8@>20BL?UMultiple regions of the original audio file are selected. What do you want to export? MainWindowNN MainWindow5@5<5I5=85Navigate MainWindowVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< =02830F88Navigate Tool Mouse Actions MainWindow*>2>5 8<O MB>3> A;>O:New name for this layer: MainWindow6>ABC?=0 1>;55 =>20O 25@A8ONewer version available MainWindowD8 >48= 72C:>2>9 D09; =5 703@C65=.No audio file loaded. MainWindow’@8<5G0=85: 2AQ >:=> A;8H:>< H8@>:>, GB>1K A>E@0=8BL 53> :0: 87>1@065=85.BNote: the whole pane is too wide to be exported as a single image. MainWindow<!?>A>1 =C<5@0F88 =>2KE >B<5B>:Number New Instants with MainWindow"B:@KBL &=5402=89 Open &Recent MainWindow4B:@KBL &<5AB>?>;>65=85...Open Lo&cation... MainWindow,B:@KBL <5AB>?>;>65=85 Open Location MainWindowVB:@KBL D09; A5AA88, 72C:>2>9 D09; 8;8 A;>9)Open a session file, audio file, or layer MainWindow’B:@KBL >:=>, 2 :>B>@>< >B>1@078BAO 85@0@E8O >:>= 8 A;>52 0:B82=>9 A5AA88JOpen a window displaying the hierarchy of panes and layers in this session MainWindow\B:@KBL >:=> A> A?8A:>< 2A5E 459AB289 2 A50=A53Open a window listing interactions and other events MainWindow`B:@KBL 8;8 8<?>@B8@>20BL D09; A C40;Q==>3> C7;0'Open or import a file from a remote URL MainWindow@0=652K9Orange MainWindow.@>:@CB:0 8 ?5@5<5I5=85Panning and Navigation MainWindowFAB028BL ?>4 :C@A>@ 2>A?@>872545=8OPaste at Playback Position MainWindowbAB028BL A>45@68<>5 1CD5@0 >1<5=0 2 0:B82=K9 A;>9-Paste from the clipboard to the current layer MainWindow;O=CBL 2;52> Peek Left MainWindow;O=CBL 2?@02> Peek Right MainWindow PgDownPgDown MainWindowPgUpPgUp MainWindow:>A?@>8725AB8 / @8>AB0=>28BL Play / Pause MainWindow:0=5;L @568<0 2>A?@>872545=8OPlay Mode Toolbar MainWindow >A?@>&872545=85 Play&back MainWindow>A?@>872545=85Playback MainWindow0!:>@>ABL 2>A?@>872545=8OPlayback Speed MainWindow,0=5;L 2>A?@>872545=8OPlayback Toolbar MainWindowP#?@02;5=85 2>A?@>872545=85< 8 ?5@5<>B:>9Playback and Transport Controls MainWindowb!:>@>ABL 2>A?@>872545=8O: %1% (2 %2 @070 1KAB@55) Playback speed: %1% (%2x faster) MainWindowf!:>@>ABL 2>A?@>872545=8O: %1% (2 %2 @070 <54;5==55) Playback speed: %1% (%2x slower) MainWindowB!:>@>ABL 2>A?@>872545=8O: >1KG=0OPlayback speed: Normal MainWindowP2548B5 URL >B:@K205<>3> <5AB>?>;>65=8O:-Please enter the URL of the location to open: MainWindowC@?C@=K9Purple MainWindowRR MainWindow >2B>@=> >B:@KBLRe-open MainWindowp>2B>@=> >B:@KBL 0:B82=K9 8;8 =5402=> >B:@K202H89AO D09;0Re-open the current or most recently opened file MainWindow~>2B>@=> 70?CAB8BL A0<>5 ?>A;54=55 2K?>;=O2H55AO ?@5>1@07>20=85)Re-select the most recently run transform MainWindow0?8A0BLRecord MainWindow@0A=K9Red MainWindow 5@A8ORelease MainWindow5@A8O %1 Release %1 MainWindow.5@A8O %1 :  540:F8O %2Release %1 : Revision %2 MainWindow5@5<5AB8BLRelocate MainWindow$5@58<5=>20BL A;>9 Rename Layer MainWindow65@58<5=>20BL 0:B82=K9 A;>9!Rename the currently active layer MainWindow@5@5=C<5@>20BL 2K1@0==K5 >B<5B:8Renumber Selected Instants MainWindow0>2B>@8BL ?@5>1@07>20=85Repeat Transform MainWindow:&0<5=8BL >A=>2=>9 0C48>D09; &Replace &Main Audio... MainWindow&1=C;5=85 AG5BG8:>2Reset Counters MainWindow6!1@>A8BL AGQBG8:8 =C<5@0F88Reset Numbering Counters MainWindow:&>AAB0=>28BL >1KG=K9 <0AHB01Restore &Default Zoom MainWindow:>AAB0=>28BL >1KG=CN A:>@>ABLRestore Normal Speed MainWindowd>AAB0=>28BL 5AB5AB25==CN A:>@>ABL 2>A?@>872545=8O#Restore non-time-stretched playback MainWindowP>AAB0=>28BL >1KG=K9 <0AHB01 >B>1@065=8O%Restore the zoom level to the default MainWindow 5@5<>B0BL =0704Rewind MainWindow60704 : ?5@2>9 AE>659 B>G:5Rewind to Similar Point MainWindow&5@5<>B0BL 2 =0G0;>Rewind to Start MainWindown5@5<>B0BL 4> ?@54K4CI59 >B<5B:8 2@5<5=8 2 B5:CI5< A;>58Rewind to the previous time instant in the current layer MainWindow&5@5<>B0BL 2 =0G0;>Rewind to the start MainWindow ?@02>Right MainWindowH5A>>B25BAB285 G0AB>BK 48A:@5B870F88Sample rate mismatch MainWindow.!>E@0=8BL A50=A &:0:...Save Session &As... MainWindow4!>E@0=5=85 A5AA8N :0: "%1"Save session as "%1" MainWindow"@>:@CB8BL 2&;52> Scroll &Left MainWindow$@>:@CB8BL 2&?@02> Scroll &Right MainWindowF!45;0BL 1>;LH>9 H03 ?@>:@CB:8 2;52>.Scroll the current pane a big step to the left MainWindowH!45;0BL 1>;LH>9 H03 ?@>:@CB:8 2?@02>/Scroll the current pane a big step to the right MainWindow<@>:@CB8BL 0:B82=>5 >:=> 2;52>#Scroll the current pane to the left MainWindow>@>:@CB8BL 0:B82=>5 >:=> 2?@02>$Scroll the current pane to the right MainWindow 09B8 MDD5:B B@0=AD>@<0F88 A@548 CAB0=>2;5==KE ?;038=>2 ?> =0720=8N 8;8 >?8A0=8NISearch for a transform from the installed plugins, by name or description MainWindowK45;5=85Select MainWindow&K45;8BL 2AQ Select &All MainWindow*K&45;8BL 2AQ 2848<>5Select &Visible Range MainWindowVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< 2K45;5=8OSelect Tool Mouse Actions MainWindowH#:068B5 M:A?>@B8@C5<K9 72C:>2>9 D09;Select audio file to export MainWindowrK45;8BL >B B5:CI59 B>G:8 2>A?@>872545=8O 4> :>=F0 A5AA88CSelect from the current playback position to the end of the session MainWindowtK45;8BL >B =0G0;0 A5AA88 4> B5:CI59 B>G:8 2>A?@>872545=8OESelect from the start of the session to the current playback position MainWindow K1@0BL 480?07>= Select ranges MainWindow:K45;8B5 >1;0ABL 4;O M:A?>@B0Select region to export MainWindow0K1@0BL F5;L 4;O 8<?>@B0Select target for import MainWindowl!45;0BL 2@5<5==>9 480?07>= @02=K< 0:B82=>9 H8@8=5 >:=0?Select the time range corresponding to the current window width MainWindowhK1@0BL 40==K5 ?> 2A59 4;8B5;L=>AB8 0:B82=>=@ A50=A00Select the whole duration of the current session MainWindow$K45;8BL 4> &:>=F0Select to &End MainWindow&K45;8BL 4> &=0G0;0Select to &Start MainWindowK45;5=85 Selection MainWindowJK45;5=85: %1 4> %2 (4;8B5;L=>ABL %3)!Selection: %1 to %2 (duration %3) MainWindow!5AA8O 87<5=5=0Session modified MainWindow@#AB0=>28BL AG5BG8:8 =C<5@0F88...Set Numbering Counters... MainWindowb#AB0=>;28BL AG5BG8:8 4;O <5B>: =0 >A=>25 ?>4AG5B01Set the counters used for counter-based labelling MainWindowShift+Enter Shift+Enter MainWindowShift+Left Shift+Left MainWindowShift+PgDown Shift+PgDown MainWindowShift+PgUp Shift+PgUp MainWindowShift+Right Shift+Right MainWindow4>:07K20BL 2&A5 ?5@5:@KB8OShow &All Overlays MainWindow:>:07K20BL &F5=B@0;L=CN ;8=8NShow &Centre Line MainWindow<>:07K20BL &<8=8<C< ?5@5:@KB89Show &Minimal Overlays MainWindow@5 ?>&:07K20BL ?5@5:@KB8O A>2A5<Show &No Overlays MainWindow4>:070BL :>=25@B5@ &548=8FShow &Unit Converter MainWindowD>:07K20BL &:>;QA0 <0AHB018@>20=8OShow &Zoom Wheels MainWindow2>:070BL &6C@=0; 459AB289Show Acti&vity Log MainWindow0&>:070BL A2>4:C ?> A;>NShow La&yer Summary MainWindow4>:07K20BL ?0=5;8 A&2>9AB2Show Property Bo&xes MainWindow8>:07K20BL AB0BCA=CN &AB@>:CShow Status &Bar MainWindowF>:070BL 87<5=5=8O 2 MB>9 25@A88 %1"Show changes in this release of %1 MainWindow¦>:07K20BL :>=B5:AB=CN A?@02:C 2 AB0BCA=>9 AB@>:5, =0E>4OI59AO 2=87C >:=0 ?@>3@0<<KKShow context help information in the status bar at the bottom of the window MainWindow0>:070BL 8=D>@<0F8N > %1Show information about %1 MainWindown>:07K20BL ?0=5;8 A2>9AB2 A;>Q2 A1>:C >B >A=>2=>3> >:=0:07K20BL :>;QA0 4;O <0AHB018@>20=8O ?> 3>@87>=B0;8 8 25@B8:0;88Show thumbwheels for zooming horizontally and vertically MainWindow0<54;8BL Slow Down MainWindow&!>;> 0:B82=>3> >:=0Solo Current Pane MainWindowZ@8 2>A?@>872545=88 72CG8B ;8HL 0:B82=>5 >:=>%Solo the current pane during playback MainWindow @>15;Space MainWindow#A:>@8BLSpeed Up MainWindow<1KG=0O 2>;=>20O D>@<0 A83=0;0Standard Waveform MainWindowt0?CAB8BL 8;8 >AB0=>28BL 2>A?@>872545=85 A B5:CI59 ?>78F880Start or stop playback from the current position MainWindow>5@5:;NG8BLAO =0 A;54CNI89 A;>9Switch to Next Layer MainWindow25@59B8 : A;54CNI5<C >:=CSwitch to Next Pane MainWindow@5@5:;NG8BLAO =0 ?@54K4CI89 A;>9Switch to Previous Layer MainWindow45@59B8 : ?@54K4CI5<C >:=CSwitch to Previous Pane MainWindowTT MainWindowj 0AH8@8BL 2@5<O 2>A?@>872545=8O, =5 <5=OO 2KA>BC B>=0A?@>872545=8O, =5 <5=OO 2KA>BC B>=0;Time-stretch playback to speed it up without changing pitch MainWindowB5@5:;NG8BL 2848<>ABL 2A5E ;8=55:Toggle All Time Rulers MainWindow"K1>@ 8=AB@C<5=B0Tool Selection MainWindow&0=5;L 8=AB@C<5=B>2 Tools Toolbar MainWindowUU MainWindow(5:;0AA8D8F8@>20==K5 Unclassified MainWindow58725AB5=Unknown MainWindow25 2K?CI5=> : @540:F8O %1Unreleased : Revision %1 MainWindow 25@EUp MainWindow\848<0O >1;0ABL: >B %1 4> %2 (4;8B5;L=>ABL %3)Visible: %1 to %2 (duration %3) MainWindowWW MainWindow@54C?@5645=85Warning MainWindow&'B> =>2>3>? What's &New? MainWindow,'B> =>2>3> 2 ?@>3@0<<5 What's New MainWindowZ0:>9 72C:>2>9 D09; 2K E>B8B5 M:A?>@B8@>20BL?,Which audio file do you want to export from? MainWindow‚0:CN >1;0ABL 8AE>4=>3> 72C:>2>3> D09;0 2K E>B8B5 M:A?>@B8@>20BL?@Which region from the original audio file do you want to export? MainWindowŠ0:CN >1;0ABL B5:CI53> >:=0 2K E>B8B5 M:A?>@B8@>20BL :0: 87>1@065=85?CWhich region of the current pane do you want to export as an image? MainWindow 5;K9White MainWindowXX MainWindowYY MainWindowZZ MainWindow"0AHB01 ?@>A<>B@0Zoom MainWindow@8&1;878BLZoom &In MainWindow&B40;8BL Zoom &Out MainWindow &#<5AB8BL 2 >:=5 Zoom to &Fit MainWindow40AHB018@>20BL 2 2K45;5=85 Zoom to Area MainWindow"#2845BL 25AL D09;Zoom to show the whole file MainWindow[[ MainWindow]] MainWindow>http://www.sonicvisualiser.org/http://www.sonicvisualiser.org/ MainWindowfhttp://www.sonicvisualiser.org/doc/reference/%1/en/3http://www.sonicvisualiser.org/doc/reference/%1/en/ MainWindowll MainWindowoo MainWindowAs MainWindow{{ MainWindow}} MainWindow (87<5=5=) (modified)MainWindowBase%1 (87<5=5=) %1 (modified)MainWindowBase %1: %2%1: %2MainWindowBase%1: %2 [%3] %1: %2 [%3]MainWindowBaseÆ<b>5 C40;>AL 8<?>@B8@>20BL RDF</b><p>5 C40;>AL 8<?>@B8@>20BL 40==K5 87 4>:C<5=B0 RDF "%1": %2</p>UFailed to import RDF

Importing data from RDF document at "%1" failed: %2

MainWindowBase~<b>5 C40;>AL A>E@0=8BL</b><p>5 C40;>AL 70?8A0BL D09; "%1": %25Save failed

Failed to write to file "%1": %2MainWindowBase:>1028BL >1J5:B 2 ?>78F8N %1AAdd Item at %1 sMainWindowBase>1028BL >:=>Add PaneMainWindowBase>1028BL B>G:C Add PointMainWindowBase<>1028BL B>G:C ?> >B<5B:5 %1 AAdd Point at %1 sMainWindowBaseL5 C40;>AL >B:@KBL 72C:>2>5 CAB@>9AB2>Couldn't open audio deviceMainWindowBaseK@570BLCutMainWindowBase#40;8BL >:=> Delete PaneMainWindowBase85 C40;>AL 8<?>@B8@>20BL RDFFailed to import RDFMainWindowBase05 C40;>AL 70?8A0BL D09;Failed to write fileMainWindowBase$<?>@B8@>20BL "%1" Import "%1"MainWindowBase,<?>@B D09;0 MIDI "%1"Import MIDI file "%1"MainWindowBase2<?>@B 4>:C<5=B0 RDF "%1"Import RDF document "%1"MainWindowBase6<?>@B 72C:>2>3> D09;0 "%1"Import audio file "%1"MainWindowBase4<?>@B XML-D09;0 A;>O "%1"Import layer XML file "%1"MainWindowBase0<?>@B D09;0 A5AA88 "%1"Import session file "%1"MainWindowBase8K?>;=O5BAO 8<?>@B 87 RDF...Importing from RDF...MainWindowBase<5B 4>ABC?=KE CAB@>9AB2 70?8A8No record device availableMainWindowBaseF54>AB0B>G=> 48A:>2>3> ?@>AB@0=AB20Not enough disc spaceMainWindowBase4B:@KBL H01;>= A5AA88 "%1"Open session template "%1"MainWindowBase6B:@K205BAO D09; 8;8 URL...Opening file or URL...MainWindowBaseJB:@K205BAO A?8A>: 2>A?@>872545=8O...Opening playlist...MainWindowBase&B:@K205BAO A5AA8O &Opening session...MainWindowBaseAB028BLPasteMainWindowBaseN>A?@>872>48BAO: %1 87 %2 (>AB0;>AL %3) Playing: %1 of %2 (%3 remaining)MainWindowBase&5 C40;>AL 70?8A0BLRecording failedMainWindowBase0?8AL: %1 Recording: %1MainWindowBase#40;8BL >:=> Remove PaneMainWindowBaseR0<5=8BL >A=>2=>9 0C48>D09; 2 MB9> A5AA88+Replace the main audio file in this sessionMainWindowBase<H81:0 GB5=8O XML-D09;0 SV: %1SV XML file read error: %1MainWindowBase0K1@0BL F5;L 4;O 8<?>@B0Select target for importMainWindowBase  ModelDataTableDialog 540:B>@ 40==KE Data EditorModelDataTableDialog0==K5 2 A;>5 Data in LayerModelDataTableDialog#40;8BLDeleteModelDataTableDialog2#40;8BL 2K1@0==K5 >1J5:BKDelete Selected ItemsModelDataTableDialog2#40;8BL 2K1@0==K5 >1J5:BK!Delete the selected item or itemsModelDataTableDialog0=5;L ?@02:8 Edit ToolbarModelDataTableDialogA:0BL:Find:ModelDataTableDialogAB028BLInsertModelDataTableDialog*AB028BL =>2K9 >1J5:BInsert New ItemModelDataTableDialog*AB028BL =>2K9 >1J5:BInsert a new itemModelDataTableDialog:0=5;L @568<0 2>A?@>872545=8OPlay Mode ToolbarModelDataTableDialog,0=5;L 2>A?@>872545=8OPlayback ToolbarModelDataTableDialog`5@5:;NG8BL >BA;56820=85 ?>78F88 2>A?@>872545=8O$Toggle tracking of playback positionModelDataTableDialog65@5:;NG8BL 2>A?@>872545=85Track PlaybackModelDataTableDialog!>740B5;LMakerModelMetadataModel0720=85NameModelMetadataModelAB>G=8:SourceModelMetadataModel"8?TypeModelMetadataModel%1 <%2>%1 <%2>ModelTransformerFactory %1: %2%1: %2ModelTransformerFactory²<h2>@825BAB2C5< 2 Sonic Visualiser!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">-B> ?@>3@0<<0 4;O ?@>A<>B@0 8 8AA;54>20=8O 72C:>2KE 40==KE A F5;LN A5<0=B8G5A:>3> 0=0;870 8 0==>B0F88 <C7K:8.</p><p>@>3@0<<0 @07@01>B0=0 2 &5=B@5 D8@>2>9 <C7K:8 (Centre for Digital Music) C=825@A8B5B0 >@>;52K M@8 (Queen Mary University) 2 >=4>=5. Sonic Visualiser  ?@8;>65=85 A >B:@KBK< 8AE>4=K< :>4><, :>B>@>5 @0A?@>AB@0=O5BAO =0 CA;>28OE GNU General Public License.</p><p><hr></p><p><b>5@54 =0G0;>< @01>BK &</b></p><p>Sonic Visualiser =5>1E>48<> ?>;CG8BL 20H5 @07@5H5=85 =0 4>ABC? 2 !5BL.</p>ã

Welcome to Sonic Visualiser!

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.

Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.


Before we go on...

Sonic Visualiser would like permission to use the network.

NetworkPermissionTester`<p><b>@>3@0<<0 =5 1C45B ?5@54020BL ?5@A>=0;L=K5 40==K5, A;548BL 70 20<8 8;8 45;8BLAO A :5<-B> 20H59 ;8G=>9 8=D>@<0F859.</b> 4=0:> Sonic Visualiser 1C45B A>18@0BL 107>2CN AB0B8AB8:C > A2>5< 8A?>;L7>20=88.</p><p>K @5:><5=4C5< @07@5H8BL ?@>3@0<<5 4>ABC? 2 !5BL, ?>A:>;L:C MB> ?>72>;8B =0< A45;0BL Sonic Visualiser ;CGH5 4;O 20A, 0 :@><5 B>3>, ?><>65B A D8=0=A8@>20=85< @07@01>B:8. A;8 2K ?@>B82, ?@>AB> A=8<8B5 D;06>: =865.<br></p>°

No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else. We will however make aggregate counts of distinct requests for usage reporting.

We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.

NetworkPermissionTester@<p>;O G53> MB> =C6=>:</p><ul><li> 0E>48BL 8=D>@<0F8N > 4>ABC?=KE 8 CAB0=>2;5==KE ?;038=0E;</li><li> !>>1I0BL 20< > ?>O2;5=88 =>2KE 25@A89 ?@>3@0<<K.</li></ul>Ž

This is to:

  • Find information about available and installed plugins; and
  • Tell you when updates are available.
NetworkPermissionTester¦<p>;O G53> MB> =C6=>:</p><ul><li> 0E>48BL 8=D>@<0F8N > 4>ABC?=KE 8 CAB0=>2;5==KE ?;038=0E;</li><li> A?>;L7>20BL ?@>B>:>; Open Sound Control;</li><li> !>>1I0BL 20< > ?>O2;5=88 =>2KE 25@A89 ?@>3@0<<K.</li></ul>¾

This is to:

  • Find information about available and installed plugins;
  • Support the use of Open Sound Control; and
  • Tell you when updates are available.
NetworkPermissionTester. 07@5H8BL 4>ABC? 2 !5BL Allow thisNetworkPermissionTester>@825BAB2C5< 2 Sonic VisualiserWelcome to Sonic VisualiserNetworkPermissionTester %1 %2%1 %2 NoteLayer%1 (%2, %3 F)%1 (%2, %3 Hz) NoteLayer%1F (%2, %3)%1 Hz (%2, %3) NoteLayer 2B>2K@02=820=85 Auto-Align NoteLayer.7<5=8BL 7=0G5=85 B>G:8Change Point Value NoteLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected Points NoteLayer 5@5B0I8BL B>G:C Drag Point NoteLayer(5@5B0I8BL 2K45;5=85Drag Selection NoteLayer 0@8A>20BL B>G:C Draw Point NoteLayer7<5=8BL B>G:C Edit Point NoteLayer!B5@5BL B>G:C Erase Point NoteLayer ?@>F5AA5 In progress NoteLayer8=59=K9Linear NoteLayer>30@8D<8G5A:89Log NoteLayer>BK MIDI MIDI Notes NoteLayer>20O B>G:0 New Point NoteLayer&5B ;>:0;L=KE B>G5:No local points NoteLayerAB028BLPaste NoteLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? NoteLayer"5@5<5AB8BL B>G:CRelocate Point NoteLayer27<5=8BL @07<5@ 2K45;5=8OResize Selection NoteLayer0AHB01Scale NoteLayer48=8FK H:0;K Scale Units NoteLayerh@5<O: %1 KA>B0 B>=0: %2 ;8B5;L=>ABL: %3 5B:0: %4)Time: %1 Pitch: %2 Duration: %3 Label: %4 NoteLayerh@5<O: %1 KA>B0 B>=0: %2 ;8B5;L=>ABL: %3 57 <5B:8(Time: %1 Pitch: %2 Duration: %3 No label NoteLayer5@B. <0AHB01Vertical Scale NoteLayer;8B5;L=>ABLDuration NoteModel7<5=8BL 40==K5 Edit Data NoteModelK1>@:0Frame NoteModel 5B:0Label NoteModel#@>25=LLevel NoteModel>B0Note NoteModelKA>B0 B>=0Pitch NoteModel @5<OTime NoteModel58725AB=>Unknown NoteModel$5:>48@C5BAO %1...Decoding %1...OggVorbisFileReaderŽ)Q;:=8B5 8 ?>B0I8B5 4;O ?5@5<5I5=8O ?> >:=C; IQ;:=8B5 42064K 4;O A:0G:00Click and drag to navigate; double-click to jumpOverview 17>@OverviewOverview%1 - %2%1 - %2Pane%1 / %2 F%3 %1 / %2Hz%3Pane(R)(R)Pane(X)(X)PaneAlt+>;5A> Alt+WheelPane†)Q;:=8B5 8 ?>B0I8B5 4;O A<5=K C@>2=O <0AHB018@>20=8O ?> 3>@87>=B0;82Click and drag to adjust the horizontal zoom levelPane‚)Q;:=8B5 8 ?>B0I8B5 4;O A<5=K C@>2=O <0AHB018@>20=8O ?> 25@B8:0;80Click and drag to adjust the vertical zoom levelPaneš)Q;:=8B5 8 ?>B0I8B5 4;O A<5=K 2848<>3> 480?07>=0 <0AHB018@>20=8O ?> 25@B8:0;8@Click and drag to adjust the visible range of the vertical scalePaneh)Q;:=8B5 8 ?>B0I8B5 2A5 >1J5:BK 2 2K45;5==>9 >1;0AB86Click and drag to move all items in the selected rangePaneh)Q;:=8B5 8 ?>B0I8B5 4;O ?5@5<5I5=8O 3@0=8F 2K45;5=8O-Click and drag to move the selection boundaryPaneV)Q;:=8B5 8 ?>B0I8B5 4;O ?5@5<5I5=8O ?> >:=CClick and drag to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O 480?07>=0; + Cmd  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=C^Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O 480?07>=0; + Ctrl  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=C_Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigatePanel)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + Shift  4;O >B:;NG5=8O ?@8;8?0=8O : >1J5:B0<; + Cmd  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=C…Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigatePanen)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + Shift  4;O >B:;NG5=8O ?@8;8?0=8O : >1J5:B0<; + Ctrl  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=C†Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + Shift  4;O >B:;NG5=8O ?@8;8?0=8O : >1J5:B0<; + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=CaClick and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigatePane¶)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=CCClick and drag to select a range; middle-click and drag to navigatePanen)Q;:=8B5 4;O 4>102;5=8O =>2>3> >1J5:B0 =0 0:B82=K9 A;>9+Click to add a new item in the active layerPaneCtrl+?@>:@CB:0 Ctrl+WheelPane>2>9=>9 I5;G>: A@54=59 :;028H59Double-Click MiddlePane~5@5A:>G8BL 2?@02> 8;8 2;52> 2 7028A8<>AB8 >B ?>;>65=8O :C@A>@04Double-click middle button to relocate with any toolPane(5@5B0I8BL 2K45;5=85Drag SelectionPane,2548B5 =>2K9 480?07>=Enter new rangePane4A?>;L7>20=85 <KH8 2 >:=0EGeneral Pane Mouse ActionsPane<>@87>=B0;L=>5 <0AHB018@>20=85Horizontal ZoomPane5=NMenuPane5@5<5I5=85NavigatePanep>2K9 480?07>= >B>1@065=8O ?> 25@B8:0;8, >B %1 4> %2 %4:-New vertical display range, from %1 to %2 %4:Pane&5@5<5I5=85 A:0G:><RelocatePanež!1@>A8BL C@>2=8 <0AHB018@>20=8O ?> 3>@87>=B0;8 8 25@B8:0;8 4> 8AE>4=KE 7=0G5=89;Reset horizontal and vertical zoom levels to their defaultsPane$7<5=8BL 2K45;5=85Resize SelectionPane@020O :;028H0RightPane0@>:@CG820BL >:=> A5AA88ScrollPane,@>:@CB:0 ?> 25@B8:0;8Scroll VerticallyPanejKAB@> ?5@5<5I0BLAO 2?@02> 8 2;52> ?> 2@5<5==>9 H:0;5)Scroll rapidly left or right in time axisPaneX@>:@CG820BL >B>1@065=85 ?> 25@B8:0;L=>9 >A8&Scroll up or down in the vertical axisPaneShift+?@>:@CB:0 Shift+WheelPane<>:070BL :>=B5:AB=>5 <5=N >:=0Show pane context menuPane,5:89 4;8==K9 ?@5D8:A:Some lengthy prefix:Pane85@B8:0;L=>5 <0AHB018@>20=85 Vertical ZoomPane >;5A>WheelPane>;5A>< 2=87 Wheel DownPane>;5A>< 225@EWheel UpPane60AHB018@>20=85 >B>1@065=8OZoomPane@81;878BLZoom InPaneB40;8BLZoom OutPane(5@B8:0;L=K9 <0AHB01Zoom VerticallyPane\0AHB018@>20BL >B>1@065=85 ?> 25@B8:0;L=>9 >A8#Zoom in or out in the vertical axisPaneT@81;865=85 8 >B40;5=85 ?> 2@5<5==>9 H:0;5Zoom in or out in time axisPaneH>@@5:F8O ?0@0<5B@>2 2>A?@>872545=8OAdjust Playback ParametersPlayParameterRepository>!<5=0 3@><:>AB8 2>A?@>872545=8OChange Playback GainPlayParameterRepository\!<5=0 A>AB>O=8O ?@83;CH5==>AB8 2>A?@>872545=8OChange Playback Mute StatePlayParameterRepositoryD!<5=0 ?0=>@0<K ?@8 2>A?@>872545=88Change Playback PanPlayParameterRepository@>3@0<<0ProgramPluginParameterBoxT# MB>3> ?;038=0 =5B 87<5=O5<KE ?0@0<5B@>2.)This plugin has no adjustable parameters.PluginParameterBox5=LH5 << Advanced <<PluginParameterDialog>;LH5 >> Advanced >>PluginParameterDialog,K1>@>: 72C:0 =0 1;>::Audio frames per block:PluginParameterDialog(5A>2?045=85 :0=0;>2Channel mismatchPluginParameterDialog 0=0;KChannelsPluginParameterDialog$2B>@A:85 ?@020:  Copyright: PluginParameterDialog 2B>@:Maker:PluginParameterDialog0720=85:Name:PluginParameterDialog KE>4:Output:PluginParameterDialog"0@0<5B@K ?;038=0Plugin ParametersPluginParameterDialog1@01>B:0 ProcessingPluginParameterDialog ">;L:> 2K45;5=85Restrict to selection extentsPluginParameterDialogÒ-B>B ?;038= ?@8=8<05B =5 1>;55 %1 :0=0;>2 =0 2E>45, => 4>ABC?=> %2. ">;L:> ?5@2K5 %3 1C4CB 8A?>;L7>20=K. kThis plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. PluginParameterDialog˜-B>B ?;038= <>65B >1@010BK20BL B>;L:> >48= :0=0;, => C 8AB>G=8:0 %1 :0=0;>2.LThis plugin only has a single channel input, but the source has %1 channels.PluginParameterDialogì-B><C ?;038=C =C6=> E>BO 1K %1 2E>4=KE :0=0;>2, => ;8HL %2 %3 4>ABC?=K. 5@>OB=>, ?;038= =5 1C45B :>@@5:B=> @01>B0BL.xThis plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly.PluginParameterDialog8A?>;L7>20BL B>;L:> :0=0; %1Use channel %1 onlyPluginParameterDialog^A?>;L7>20BL A@54=55 7=0G5=85 :0=0;>2 8AB>G=8:0Use mean of source channelsPluginParameterDialog5@A8O:Version:PluginParameterDialog(03:Window increment:PluginParameterDialog $>@<0: Window shape:PluginParameterDialog. 07<5@ >:>==>9 DC=:F88: Window size:PluginParameterDialogO2;ONBAOarePluginParameterDialogO2;O5BAOisPluginParameterDialog24 :04@0/A24 FPS Preferences25 :04@>2/A25 FPS Preferences30 :04@>2/A30 FPS Preferences,4 × ?5@5AM<?;8@>20==0O4 x Oversampling PreferencesL4 × ?5@5AM<?;8@>20==0O A 8=B5@?>;OF859#4 x Oversampling with interpolation Preferences50 :04@>2/A50 FPS Preferences60 :04@>2/A60 FPS Preferences0@54?>G8B05<K9 F25B D>=0Background colour preference Preferences;M:<5=0Blackman Preferences ;M:<5=0-%0@@8A0Blackman-Harris Preferences"5<=K9 D>=Dark background Preferences!0<K9 1KAB@K9Fastest Preferences@A?>;L7>20BL ?0@0<5B@K >:@C65=8OFollow desktop theme PreferencesJ53;L H@8DB0 4;O B5:AB>2KE ?5@5:@KB89Font size for text overlays Preferences8'0AB>B0 CA;>2=>9 =>BK O (A)Frequency of concert A Preferences0CAA>20Gaussian Preferences%0<<8=30Hamming Preferences %M==0Hann Preferences6KA>:>5 @07@5H5=85 (4> <:A) High resolution (to microsecond) Preferences&082KAH53> :0G5AB20Highest quality Preferences!25B;K9 D>=Light background Preferences*8=59=0O 8=B5@?>;OF8OLinear interpolation PreferencesD03@C60BL D09;K MP3 157 8=B5@20;>2Load mp3 files in gapless mode Preferences: 0A?>;>65=85 :0B0;>30 A :MH5<!Location for cache file directory Preferences5BNone Preferencesd>@<8@>20BL 72C:>2>9 A83=0; ?@8 GB5=88 0C48>D09;>23Normalise audio signal when reading from audio file PreferencesCBB0;;0Nuttall Preferencesn@>?CA:0BL 2@5<5==K5 D09;K 2 <5=N =5402=> >B:@K202H8EAO'Omit temporaries from Recent Files menu Preferences0@75=0Parzen PreferencesN"8? @5AM<?;8@>20=8O ?@8 2>A?@>872545=88Playback resampler type Preferences0@0<5B@K Preferences Preferences4=5H=89 284 ?0=5;8 A2>9AB2Property box layout Preferences@O<>C3>;L=0O Rectangular Preferences@ 5AM<?;8@>20BL D09;K ?@8 8<?>@B5$Resample mismatching files on import PreferencesV>:07K20BL ?0=5;L B>;L:> 4;O 0:B82=>3> >:=0Show box for current pane only Preferences>>:07K20BL ?0=5;8 4;O 2A5E >:>=Show boxes for all panes PreferencesP>:07K20BL 70AB02:C ?@8 AB0@B5 ?@>3@0<<KShow splash screen on startup Preferences\$>@<0 >:>==>9 DC=:F88 ?@8 A?5:B@0;L=>< 0=0;875Spectral analysis window shape PreferencesH=B5@?>;OF8O A?5:B@>3@0<<K ?> >A8 X:!Spectrogram x-axis interpolation: PreferencesB=B5@?>;OF8O >A8 Y A?5:B@>3@0<<K:!Spectrogram y-axis interpolation: Preferences1KG=K9Standard Preferences1KG=0O (4> <A)Standard (to millisecond) Preferences<">G=>ABL ?>:07K205<>3> 2@5<5=8Time display precision Preferences"@5C3>;L=0O Triangular PreferencesNA?>;L7>20BL D>@<0B G0AK:<8=CBK:A5:C=4K Use hours:minutes:seconds format Preferences%1:%1:PreferencesDialog 1&;8: &AppearancePreferencesDialog&@>G55&OtherPreferencesDialogˆA?>;L7C9B5 :><0=4C «%1» 2 <5=N «$09;», GB>1K A>740BL =>2K5 H01;>=K.,(Use "%1" in the File menu to add to these.)PreferencesDialog (02B>)(auto)PreferencesDialogÖ<b>"@51C5BAO ?5@570?CA: ?@>3@0<<K</b><p>5:>B>@K5 87<5=82H85AO ?0@0<5B@K =5 <>3CB 1KBL CGB5=K 157 ?5@570?CA:0 Sonic Visualiser.</p><p>025@H8B5 @01>BC A ?@>3@0<<>9 8 ?>2B>@=> 70?CAB8B5 55, GB>1K 2=5A5==K5 87<5=5=8O 2>7K<5;8 MDD5:B.</p>ÿRestart required

One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.

Please exit and restart the application now if you want these changes to take effect immediately.

PreferencesDialog$<4><0H=89 :0B0;>3>PreferencesDialog(&2C:>2>9 2E>4/2KE>4 A&udio I/OPreferencesDialog, 07@5H8BL 2KE>4 2 !5BLAllow network usagePreferencesDialog =3;89A:89 (!()American EnglishPreferencesDialog&=0;87 Anal&ysisPreferencesDialog@8<5=8BLApplyPreferencesDialog6#AB@>9AB2> 2>A?@>872545=8O:Audio playback device:PreferencesDialog$#AB@>9AB2> 70?8A8:Audio record device:PreferencesDialog 2C:>2>9 4286>::Audio service:PreferencesDialog6=3;89A:89 (5;8:>1@8B0=8O)British EnglishPreferencesDialogB<5=8BLCancelPreferencesDialog'5HA:89CzechPreferencesDialogL&25B B@QE<5@=>3> 3@0D8:0 ?> C<>;G0=8N:Default colour 3D plot colour:PreferencesDialogp&25B A?5:B@>3@0<<K <5;>48G5A:>3> 480?07>=0 ?> C<>;G0=8N:#Default melodic spectrogram colour:PreferencesDialogh(01;>= A5AA88 ?> C<>;G0=8N ?@8 703@C7:5 0C48>D09;>2:2Default session template when loading audio files:PreferencesDialog@&25B A?5:B@>3@0<<K ?> C<>;G0=8N:Default spectrogram colour:PreferencesDialogD 8A>20BL A;>8 2 @07@5H5=88 Retina:!Draw layers at Retina resolution:PreferencesDialogB-:A?>@B8@>20BL A5AA8N :0: H01;>= &Export Session as Template...PreferencesDialog@A?>;L7>20BL A8AB5<=K5 =0AB@>9:8Follow system localePreferencesDialog5;Q=K9GreenPreferencesDialogOKPreferencesDialogB&25B <8=80BN@K 2>;=>2>3> A83=0;0:Overview waveform colour:PreferencesDialog0@0<5B@K PreferencesPreferencesDialog$0@0<5B@K 87<5=5=KPreferences ChangedPreferencesDialogV0?CA:0BL ?;038=K VAMP >B45;L=K< ?@>F5AA><:%Run Vamp plugins in separate process:PreferencesDialog CAA:89RussianPreferencesDialogDK15@8B5 :0B0;>3 4;O E@0=5=8O :MH02Select a directory to create cache subdirectory inPreferencesDialog&(01;>= A5AA89Session &TemplatePreferencesDialogÆ5:>B>@K5 ?0@0<5B@K @01>BK ?@>3@0<<K 1K;8 87<5=5=K, => =5 ?@8<5=5=K. @8<5=8BL 8E ?5@54 70:@KB85<?NSome preferences have been changed but not applied. Apply them before closing?PreferencesDialog40@0<5B@K Sonic Visualiser)Sonic Visualiser: Application PreferencesPreferencesDialog<1KG=0O 2>;=>20O D>@<0 A83=0;0Standard WaveformPreferencesDialog/7K: 8=B5@D59A0User interface languagePreferencesDialogB<5=8BLCancelProgressDialog2 (B5:CI55 7=0G5=85: %1%2) (current value: %1%2) PropertyBox. (B5:CI55 7=0G5=85: %1) (current value: %1) PropertyBox@!:>@@5:B8@>20BL %1 A2>9AB2> %2%3Adjust %1 property of %2%3 PropertyBox>:070BLShow PropertyBox45@5:;NG8BL %1 A2>9AB2> %2Toggle %1 property of %2 PropertyBox<5@5:;NG8BL 2>A?@>872545=85 %1Toggle Playback of %1 PropertyBox05@5:;NG8BL 2848<>ABL %1Toggle Visibility of %1 PropertyBox,#AB0=>28BL A2>9AB2> %1Set %1 PropertyPropertyContainer;>6LfalsePropertyContainer=5BnoPropertyContainer2K:;offPropertyContainer2:;onPropertyContainer ?@0240truePropertyContainer40yesPropertyContainer45@5:;NG8BL 2848<>ABL A;>OChange Layer Visibility PropertyStackB)Q;:=8B5 4;O A<5=K 0:B82=>3> A;>O(Click to change the current active layer PropertyStack: Sonic Visualiser  ?@>3@0<<0 4;O ?@>A<>B@0 8 8AA;54>20=8O 72C:>2KE 40==KE A F5;LN A5<0=B8G5A:>3> 0=0;870 8 0==>B0F88 <C7K:8. A?>;L7>20=85: %1 [--no-audio] [--no-osc] [<D09;> ...] --no-audio: =5 ?KB0BLAO >B:@KBL CAB@>9AB2> 72C:>2>3> 2K2>40 --no-osc: =5 ?@54>AB02;OBL ?>@B Open Sound Control 4;O C40;Q==>3> C?@02;5=8O <D09;>: <>6=> C:070BL >48= 8 1>;55 D09;>2 Sonic Visualiser (.sv) 8 72C:>2KE D09;>2. w Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [ ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control : One or more Sonic Visualiser (.sv) and audio files may be provided.  QApplication Sonic VisualiserSonic Visualiser QApplication85 C40;>AL >B:@KBL D09; "%1"Failed to open file "%1"QFile.$09; "%1" =5 ACI5AB2C5BFile "%1" does not existQFileJ$09; 8;8 URL "%1" =5 <>3 1KBL ?>;CG5='File or URL "%1" could not be retrievedQFile¸<b>C6=K 72C:>2K5 40==K5</b><p>03@C78B5 E>BO 1K >48= 72C:>2>9 D09; ?5@54 8<?>@B>< 0==>B0F89\Audio required

Please load at least one audio file before importing annotation data QMessageBox.5 C40;>AL >B:@KBL D09;Failed to open file QMessageBoxH$09; 8;8 URL "%1" =5 <>3 1KBL >B:@KB$File or URL "%1" could not be opened QMessageBoxÄ<b>5 C40;>AL 703@C78BL ?;038=K</b><p>5 C40;>AL 703@C78BL >4=C 8;8 1>;LH5 181;8>B5: ?;038=>2:</p>PFailed to load plugins

Failed to load one or more plugin libraries:

QObjectÀ<p>-B8 ?;038=K <>3CB 1KBL =5A>2<5AB8<K A ?@>3@0<<>9 8 1C4CB ?@>83=>@8@>20=K ?@8 @01>B5 2 %1.</p>d

These plugins may be incompatible with the system, and will be ignored during this run of %1.

QObject<=58725AB=>> QObject ?>;>A:CBandedQObject'Q@=>5 =0 15;><Black on WhiteQObject 8H=OCherryQObject$@C:B>2K9 A0;0B Fruit SaladQObject5;Q=K9GreenQObject>4A25B:0 HighlightQObjectQ4IceQObject@8=B5@PrinterQObject 0:0BSunsetQObject5;>5 =0 GQ@=><White on BlackQObject 4>  to RangeInputDialog2C:>2>9 D09; Wave FileReadOnlyWaveFileModel %1 %2%1 %2 RegionLayer 2B>2K@02=820=85 Auto-Align RegionLayer "0:BKBars RegionLayer.7<5=8BL 7=0G5=85 B>G:8Change Point Value RegionLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected Points RegionLayer(5@5B0I8BL 2K45;5=85Drag Selection RegionLayer" 02=K5 ?@><56CB:8 Equal Spaced RegionLayer ?@>F5AA5 In progress RegionLayer8=59=K9Linear RegionLayer>30@8D<8G5A:89Log RegionLayer&5B ;>:0;L=KE B>G5:No local points RegionLayerAB028BLPaste RegionLayer"8? 3@0D8:0 Plot Type RegionLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? RegionLayer27<5=8BL @07<5@ 2K45;5=8OResize Selection RegionLayer0AHB01Scale RegionLayer48=8FK H:0;K Scale Units RegionLayer!53<5=B0F8O Segmentation RegionLayerb@5<O: %1 =0G5=85: %2 ;8B5;L=>ABL: %3 5B:0: %4)Time: %1 Value: %2 Duration: %3 Label: %4 RegionLayerb@5<O: %1 =0G5=85: %2 ;8B5;L=>ABL: %3 57 <5B:8(Time: %1 Value: %2 Duration: %3 No label RegionLayer5@B. <0AHB01Vertical Scale RegionLayer;8B5;L=>ABLDuration RegionModel7<5=8BL 40==K5 Edit Data RegionModelK1>@:0Frame RegionModel 5B:0Label RegionModel1;0ABLRegion RegionModel @5<OTime RegionModel58725AB=>Unknown RegionModel=0G5=85Value RegionModel #40;8BL A;>9 %1 Delete %1 LayerRemoveLayerCommand6(<>45;L 872;5G5=0 2 SV-XML)(derived model in SV-XML) SVFileReader6B:@K205BAO D09; 8;8 URL...Opening file or URL... SVFileReader<=58725AB=>> SingleColourLayer&25BColourSingleColourLayer%1 - %2%1 - %2 SliceLayer-Inf-Inf SliceLayer0 10dB SliceLayer1A>;NB=K9Absolute SliceLayer N1K5Any SliceLayer8=KBins SliceLayer ;>:8Blocks SliceLayer &25B0Colours SliceLayer#A8;5=85Gain SliceLayer8=59=K9Linear SliceLayer 8=88Lines SliceLayer>30@8D<.Log SliceLayer#A@54=Q==>Mean SliceLayer!G5BG8:Meter SliceLayer>@<0;87>20BL Normalize SliceLayer8:Peak SliceLayer"8? 3@0D8:0 Plot Type SliceLayer& 568< AM<?;8@>20=8O Sampling Mode SliceLayer0AHB01Scale SliceLayer(038Steps SliceLayer >@>3 Threshold SliceLayerP@5<O: %1 - %2 80?07>=: %3 AM<?;>2 (%4)$Time: %1 - %2 Range: %3 samples (%4) SliceLayer€@5<O: %1 - %2 80?07>=: %3 AM<?;>2 (%4) 8=: %5 %6 7=0G5=85: %79Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 SliceLayer1dB SliceLayerx10x10 SliceLayer7<5=8BL 40==K5 Edit Data SparseModel>1028BL B>G:C Add PointSparseModel::AddPointCommand#40;8BL B>G:C Delete PointSparseModel::DeletePointCommand&5@5@07<5B8BL B>G:CRe-Label PointSparseModel::RelabelCommand7<5=8BL 40==K5 Edit DataSparseOneDimensionalModelK1>@:0FrameSparseOneDimensionalModel 5B:0LabelSparseOneDimensionalModel @5<OTimeSparseOneDimensionalModel58725AB=>UnknownSparseOneDimensionalModel7<5=8BL 40==K5 Edit DataSparseTimeValueModelK1>@:0FrameSparseTimeValueModel 5B:0LabelSparseTimeValueModel @5<OTimeSparseTimeValueModel58725AB=>UnknownSparseTimeValueModel=0G5=85ValueSparseTimeValueModel $070: %1 Phase: %1SpectrogramLayer $070: %1 - %2 Phase: %1 - %2SpectrogramLayerr%1'0AB>B0 18=>2: %2 - %3 F %4KA>B0 B>=0 18=>2: %5 - %6 1%1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 SpectrogramLayer^%1'0AB>B0 18=>2: %2 F %3KA>B0 B>=0 18=>2: %4 '%1Bin Frequency: %2 Hz %3Bin Pitch: %4 SpectrogramLayer %1 F%1HzSpectrogramLayer 1 F1 KHzSpectrogramLayer1,5 F1.5 KHzSpectrogramLayer 10 F10 HzSpectrogramLayer 10 F10 KHzSpectrogramLayer 100 F100 HzSpectrogramLayer 12 F12 KHzSpectrogramLayer 16 F16 KHzSpectrogramLayer 2 F2 KHzSpectrogramLayer 20 F20 HzSpectrogramLayer25 %25 %SpectrogramLayer 250 F250 HzSpectrogramLayer 4 F4 KHzSpectrogramLayer 40 F40 HzSpectrogramLayer 43 F43HzSpectrogramLayer50 %50 %SpectrogramLayer 500 F500 HzSpectrogramLayer 6 F6 KHzSpectrogramLayer75 %75 %SpectrogramLayer 8 F8 KHzSpectrogramLayer 87,5 %87.5 %SpectrogramLayer93,75 %93.75 %SpectrogramLayer<=58725AB=>> SpectrogramLayerA5 18=KAll BinsSpectrogramLayer8=KBinsSpectrogramLayer&25BColourSpectrogramLayer@0I5=85 F25B0Colour RotationSpectrogramLayer25 C40;>AL :MH8@>20BL FFTFFT cache failedSpectrogramLayerò5 C40;>AL A>740BL FFT-<>45;L MB>9 A?5:B@>3@0<<K. 5@>OB=>, =5 E20B05B ?0<OB8 8;8 48A:>2>3> ?>@AB@0=AB20 4;O ?@>4>;65=8O.pFailed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue.SpectrogramLayer'0AB>BK FrequenciesSpectrogramLayer#A8;5=85GainSpectrogramLayer8=59=K9LinearSpectrogramLayer>30@8D<.LogSpectrogramLayer0:A. G0AB>B0 Max FrequencySpectrogramLayer!G5BG8:MeterSpectrogramLayer8=. G0AB>B0 Min FrequencySpectrogramLayer57 <0:A8<C<0No maxSpectrogramLayer57 <8=8<C<0No minSpectrogramLayer5BNoneSpectrogramLayer8:>2K5 18=K Peak BinsSpectrogramLayer88:>20O G0AB>B0: %1 - %2 F Peak Frequency: %1 - %2 Hz SpectrogramLayer.8:>20O G0AB>B0: %1 F Peak Frequency: %1 Hz SpectrogramLayer08:>20O 2KA>B0 B>=0: %2 Peak Pitch: %2 SpectrogramLayer:8:>20O 2KA>B0 B>=0: %3 - %4 Peak Pitch: %3 - %4 SpectrogramLayer$070PhaseSpectrogramLayer0AHB01ScaleSpectrogramLayer >@>3 ThresholdSpectrogramLayer@5<O: %1  Time: %1 SpectrogramLayer@5<O: %1 - %2 Time: %1 - %2 SpectrogramLayer:=>WindowSpectrogramLayer5@5:@KB85 >:>=Window OverlapSpectrogramLayer 07<5@ >:=0 Window SizeSpectrogramLayer1dBSpectrogramLayer 1: %1dB: %1SpectrogramLayer1: %1 - %2 dB: %1 - %2SpectrogramLayer1dBVSpectrogramLayer 1^2dBV^2SpectrogramLayer%1%1 SpectrumLayerL%1 8=: %2 (%3) %4 7=0G5=85: %5 1: %6#%1 Bin: %2 (%3) %4 value: %5 dB: %6 SpectrumLayerF%1 8=: %2 (%3) =0G5=85: %4 1: %5 %1 Bin: %2 (%3) Value: %4 dB: %5 SpectrumLayer%1 - %2%1 - %2 SpectrumLayer%1 - %2 F %1 - %2 Hz SpectrumLayer %1 F%1 Hz SpectrumLayer25 %25 % SpectrumLayer50 %50 % SpectrumLayer75 %75 % SpectrumLayer 87,5 %87.5 % SpectrumLayer93,75 %93.75 % SpectrumLayer8=KBins SpectrumLayer#A@54=Q==>Mean SpectrumLayer 8G53>None SpectrumLayer8:Peak SpectrumLayer4>:07K20BL ?8:>2K5 G0AB>BKShow Peak Frequencies SpectrumLayer:=>Window SpectrumLayer5@5:@KB85 >:>=Window Overlap SpectrumLayer 07<5@ >:=0 Window Size SpectrumLayer%1 - %2%1 - %2SubdividingMenu!?0A81>, =5B No, thanksSurveyer40, O E>GC 70?>;=8BL >BGQBYes! Take me to the surveySurveyer<157 B5:AB0>  TextLayer"#40;8B5 2K45;5=85Delete Selection TextLayer 5@5B0I8B5 <5B:C Drag Label TextLayer(5@5B0I8B5 2K45;5=85Drag Selection TextLayerG8AB8BL <5B:C Empty Label TextLayer2548B5 <5B:C Enter label TextLayer#40;8BL B>G:C Erase Point TextLayer ?@>F5AA5 In progress TextLayer"5@5<5AB8B5 <5B:C Move Label TextLayer45@5<5AB8B5 ?> 3>@87>=B0;8Move Label Horizontally TextLayer05@5<5AB8B5 ?> 25@B8:0;8Move Label Vertically TextLayer>20O B>G:0 New Point TextLayerAB028BLPaste TextLayer42548B5 B5:AB =>2>9 <5B:8:Please enter a new label: TextLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? TextLayer0!<5=8B5 @07<5@ 2K45;5=8OResize Selection TextLayer<@5<O: %1 KA>B0: %2 5B:0: %3Time: %1 Height: %2 Label: %3 TextLayer7<5=8BL 40==K5 Edit Data TextModelK1>@:0Frame TextModel KA>B0Height TextModel 5B:0Label TextModel "5:ABText TextModel @5<OTime TextModel58725AB=>Unknown TextModel%1: %2%3%1: %2%3 Thumbwheel%2%3%2%3 ThumbwheelL2548B5 =>2>5 7=0G5=85 >B %1 4> %2 %3:#Enter a new value from %1 to %2 %3: ThumbwheelF2548B5 =>2>5 7=0G5=85 >B %1 4> %2: Enter a new value from %1 to %2: Thumbwheel,2548B5 =>2>5 7=0G5=85Enter new value ThumbwheelL>2>5 7=0G5=85 4;O %1, >B %2 4> %3 %4:#New value for %1, from %2 to %3 %4: ThumbwheelF>2>5 7=0G5=85 4;O %1, >B %2 4> %3: New value for %1, from %2 to %3: Thumbwheel*>1028BL B>G:C 2 %1 AAdd Point at %1 sTimeInstantLayer"#40;8BL 2K45;5=85Delete SelectionTimeInstantLayer 5@5B0I8BL B>G:C Drag PointTimeInstantLayer(5@5B0I8BL 2K45;5=85Drag SelectionTimeInstantLayer 0@8A>20BL B>G:C Draw PointTimeInstantLayer7<5=8BL B>G:C Edit PointTimeInstantLayer#40;8BL B>G:C Erase PointTimeInstantLayer ?@>F5AA5 In progressTimeInstantLayer.5@5B0I8BL B>G:C : %1 AMove Point to %1 sTimeInstantLayer>20O B>G:0 New PointTimeInstantLayer&5B ;>:0;L=KE B>G5:No local pointsTimeInstantLayerAB028BLPasteTimeInstantLayer"8? 3@0D8:0 Plot TypeTimeInstantLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted instants?TimeInstantLayer27<5=8BL @07<5@ 2K45;5=8OResize SelectionTimeInstantLayer!53<5=B0F8O SegmentationTimeInstantLayer&@5<O: %1 5B:0: %2Time: %1 Label: %2TimeInstantLayer&@5<O: %1 57 <5B:8Time: %1 No labelTimeInstantLayer%1%1TimeValueLayer %1 %2%1 %2TimeValueLayer%1F (%2, %3)%1 Hz (%2, %3)TimeValueLayer+/-1+/-1TimeValueLayer 2B>2K@02=820=85 Auto-AlignTimeValueLayer.7<5=8BL 7=0G5=85 B>G:8Change Point ValueTimeValueLayer6K1@0BL 2KG8A;5=85 7=0G5=8OChoose value calculationTimeValueLayer"!>548=Q==K5 B>G:8Connected PointsTimeValueLayer @820OCurveTimeValueLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected PointsTimeValueLayer 5@5B0I8BL B>G:C Drag PointTimeValueLayer(5@5B0I8BL 2K45;5=85Drag SelectionTimeValueLayer 0@8A>20BL B>G:C Draw PointTimeValueLayer7<5=8BL B>G:C Edit PointTimeValueLayer!B5@5BL B>G:C Erase PointTimeValueLayer ?@>F5AA5 In progressTimeValueLayer8=59=K9LinearTimeValueLayer 8=88LinesTimeValueLayer>30@8D<8G5A:89LogTimeValueLayer>20O B>G:0 New PointTimeValueLayer&5B ;>:0;L=KE B>G5:No local pointsTimeValueLayerAB028BLPasteTimeValueLayer"8? 3@0D8:0 Plot TypeTimeValueLayer ">G:8PointsTimeValueLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items?TimeValueLayer"5@5<5AB8BL B>G:CRelocate PointTimeValueLayer27<5=8BL @07<5@ 2K45;5=8OResize SelectionTimeValueLayer0AHB01ScaleTimeValueLayer48=8FK H:0;K Scale UnitsTimeValueLayer!53<5=B0F8O SegmentationTimeValueLayer¸# =5:>B>@KE 2AB02;O5<KE >1J5:B>2 =5B 7=0G5=89.0:85 7=0G5=8O 2K E>B8B5 4;O =8E 8A?>;L7>20BL?eSome of the items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer >6:8StemsTimeValueLayer¦# 2AB02;O5<KE >1J5:B>2 =5B 7=0G5=89. 0:85 7=0G5=8O 2K E>B8B5 4;O =8E 8A?>;L7>20BL?]The items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer\@5<O: %1 =0G5=85: %2%3 5B:0: %4 {1 ?} {2 ?}Time: %1 Value: %2 Label: %4TimeValueLayer\@5<O: %1 =0G5=85: %2%3 57 <5B:8 {1 ?} {2 ?}Time: %1 Value: %2 No labelTimeValueLayer5@B. <0AHB01Vertical ScaleTimeValueLayer,>;L 4;O 2A5E >1J5:B>2Zero for all itemsTimeValueLayer<< @54K4CI89 << Previous TipDialog0:@KBLClose TipDialog!;54CNI89 >>Next >> TipDialog:>:07K20BL A>25BK ?@8 70?CA:5Show tip on startup TipDialog!>25B 4=OTip of the Day TipDialog [\(<].*$ [\(<].*$TransformFactoryX%1 8A?>;L7CO 2K2>4 "%2" ?;038=0 "%3" (87 %4)-%1 using "%2" output of "%3" plugin (from %4)TransformFactory@%1 8A?>;L7CO ?;038= "%2" (87 %3)%1 using "%2" plugin (from %3)TransformFactory %1: %2%1: %2TransformFactory%1: KE>4 %2 %1: Output %2TransformFactory6<=58725AB=K9 ?@>872>48B5;L>TransformFactory =0;87AnalysisTransformFactory0B53>@8OCategoryTransformFactory?8A0=85 DescriptionTransformFactory-DD5:BKEffectsTransformFactory0==K5 MDD5:B>2 Effects DataTransformFactoryv72;5GL "%1" 40==K5 2K2>40 87 ?;038=0 MDD5:B>2 "%2" (87 %3):Extract "%1" data output from "%2" effect plugin (from %3)TransformFactoryr72;5GL 40==K5 2K2>40 %1 87 ?;038=0 MDD5:B>2 "%2" (87 %3)8Extract data output %1 from "%2" effect plugin (from %3)TransformFactoryz72;5GL 40==K5 ?@8 ?><>I8 "%1" 2K2>40 87 ?;038=0 "%2" (87 %3);Extract features using "%1" output of "%2" plugin (from %3)TransformFactory\72;5GL 40==K5 ?@8 ?><>I8 ?;038=0 "%1" (87 %2),Extract features using "%1" plugin (from %2)TransformFactoryN5 C40;>AL ?5@5G8A;8BL ?;038=K VAMP: %1Failed to list Vamp plugins: %1TransformFactoryn!>740BL 72C:>2>9 A83=0; ?@8 ?><>I8 ?;038=0 "%1" (87 %2)1Generate audio signal using "%1" plugin (from %2)TransformFactory5=5@0B>@ GeneratorTransformFactory!>740B5;LMakerTransformFactory0720=85NameTransformFactory @>G55OtherTransformFactory"8? ?;038=0 Plugin typeTransformFactory.!8AB5<=K9 845=B8D8:0B>@System IdentifierTransformFactory~"@0=AD>@<8@>20BL 72C:>2>9 A83=0; ?;038=>< MDD5:B>2 "%1" (87 %2)8Transform audio signal with "%1" effect plugin (from %2)TransformFactory"48=8F0 87<5@5=8OUnitsTransformFactory%1%2<br><small>%1%2
TransformFinder</small>TransformFinder<b>%1</b>%2<br>%1%2
TransformFinderH<b>8 >48= ?;038= =5 CAB0=>2;5=!</b>*No plugins are currently installed!TransformFindert<b>5 C40;>AL ?>;CG8BL >?C1;8:>20==K5 2 A5B8 >?8A0=8O!</b>>Unable to retrieve published descriptions from network!TransformFinderz<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; 0B53>@8O: %1<
      — Category: %1TransformFinder²<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; >4@>1=0O 8=D>@<0F8O: <a href="%1">%1</a>U
      — More information: %1TransformFinder~<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; "8? ?;038=0: %1?
      — Plugin type: %1TransformFinder–<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; !8AB5<=K9 845=B8D8:0B>@: %1E
      — System identifier: %1TransformFinderB<br>&nbsp;&nbsp;8G53> =5 =0945=>
  No results foundTransformFinder0<i> (=5 CAB0=>2;5=>)</i> (not installed)TransformFinder<p>%1<br>%2<br>5@>OB=>, =5 @01>B05B A5B52>5 A>548=5=85, ;81> A;C61K >B7K20NBAO A;8H:>< <54;5==>.<br> 57C;LB0BK ?>8A:0 1C4CB =54>ABC?=K.…

%1
%2
Perhaps the network connection is down, or services are responding too slowly.
No search results will be available.TransformFinderê<p>%1<br>K45B 2K?>;=5= ?>8A: B>;L:> ?> >?8A0=8O< ?;038=>2 VAMP, ?@54=07=0G5==KE 4;O 872;5G5=8O 0=0;878@C5<KE 40==KE.]

%1
Only the published descriptions of Vamp feature extraction plugins will be searched.TransformFinder–<p>%1<br>5@>OB=>, =5 @01>B05B A5B52>5 A>548=5=85, ;81> A;C61K >B7K20NBAO A;8H:>< <54;5==>, ;81> ?@>87>H;0 =5?>;04:0 ?@8 >1@01>B:5.<br>C45B 2K?>;=5= ?>8A: B>;L:> ?> >?8A0=8O< C65 CAB0=>2;5==KE ?;038=>2.º

%1
Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.
Only the descriptions of installed plugins will be searched.TransformFinder¼<p>2548B5 B5:AB 4;O ?>8A:0 ?> >?8A0=8O< A@548:<ul><li>2A5E CAB0=>2;5==KE ?;038=>2 <a href="http://www.vamp-plugins.org/">VAMP</a> 4;O 872;5G5=8O 0=0;878@C5<KE 40==KE;</li><li>2A5E CAB0=>2;5==KE ?;038=>2 <a href="http://www.ladspa.org/">LADSPA</a>;</li><li>5I5 =5 CAB0=>2;5==KE ?;038=>2 VAMP, GLQ >?8A0=85 >?C1;8:>20=> 2 A5<0=B8G5A:>9 A5B8.</li></ul>

Type some text into the search box to search the descriptions of:

  • All currently installed Vamp audio feature extraction plugins
  • All currently installed LADSPA audio effects plugins
  • Vamp plugins that are not currently installed but that have descriptions published via the semantic web
TransformFinder<small>TransformFinder"<small>%1</small>%1TransformFinder=87DownTransformFinder@>8A: ?;038=>2 4;O B@0=AD>@<0F88Find a TransformTransformFinderA:0BL:Find:TransformFinderR0945=> %n >?8A0=85, A>45@60I55 <b>%1</b>R0945=> %n >?8A0=8O, A>45@60I8E <b>%1</b>R0945=> %n >?8A0=89, A>45@60I8E <b>%1</b>,Found %n description(s) containing %1TransformFinderz0945=> %n >?8A0=85, A>45@60I55 <b>%1</b>, ?>:070=K ?5@2K5 %2z0945=> %n >?8A0=8O, A>45@60I8E <b>%1</b>, ?>:070=K ?5@2K5 %2z0945=> %n >?8A0=89, A>45@60I8E <b>%1</b>, ?>:070=K ?5@2K5 %2GFound %n description(s) containing %1, showing the first %2 onlyTransformFinder 25@EUpTransformFinderKA>B0 B>=0Pitch UnitConverter<=58725AB=>> ViewK@02=820=85 AlignmentViewB<5=8BLCancelView:!;54>20BL 70 2>A?@>872545=85<Follow PlaybackView(;>10;L=0O ?@>:@CB:0 Global ScrollView$;>10;L=K9 <0AHB01 Global ZoomViewK:;NG8BLOffView>AB@0=8G=>PageView:B@8A>2K205BAO 87>1@065=85...Rendering image...View@>:@CG820BLScrollView86840=85 3>B>2=>AB8 A;>Q2...!Waiting for layers to be ready...View!=OBL 2K45;5=85Clear Selection ViewManager6K45;8BL =5A:>;L:> >1;0AB59Select Multiple Regions ViewManager K45;8BL >1;0ABL Select Region ViewManager( %1 %2 (?8: 2 %3 1) %1 %2 (%3 dB peak) WaveformLayer2 %1 %2 - %3 (?8: 2 %4 1) %1 %2 - %3 (%4 dB peak) WaveformLayer0 10dB WaveformLayerV->1@07=> Butterfly WaveformLayer0=0; %1 Channel %1 WaveformLayer 0=0;KChannels WaveformLayer#A8;5=85Gain WaveformLayer 52K9:Left: WaveformLayer#@>25=L:Level: WaveformLayer8=59=K9Linear WaveformLayer#A@54=Q==>Mean WaveformLayer!G5BG8:Meter WaveformLayer:>@<0;87>20BL 2848<CN >1;0ABLNormalize Visible Area WaveformLayer@02K9:Right: WaveformLayer0AHB01 ?> YScale WaveformLayerB45;L=>Separate WaveformLayer@5<O: %1Time: %1 WaveformLayer@5<O: %1 - %2 Time: %1 - %2 WaveformLayer1dB WaveformLayerV / 2@5<OV / timeWindowShapePreview1 / G0AB>B0 dB / freqWindowShapePreview40?8AK205<K9 72C:>2>9 D09;Writable Wave FileWritableWaveFileModelˆ ý) ÿý, sonic-visualiser-3.0.3/i18n/sonic-visualiser_ru.ts0000644000000000000000000152526013111512442020303 0ustar 00000000000000 ActivityLog Activity Log Журнал изменений <p>Activity Log lists your interactions and other events within %1.</p> <p>СпиÑок вÑех предпринÑтых вами дейÑтвий Ñ %1.</p> %1: %2 %1: %2 AddLayerCommand Add %1 Layer Добавить Ñлой %1 AggregateWaveModel Aggregate Wave AlignmentModel Alignment Выравнивание AlignmentView AlignmentView AudioCallbackPlaySource Play from %1 ВоÑпроизведение от %1 Stop at %1 ОÑтановка в позиции %1 Change time-stretch factor to %1 Смена коÑффициента раÑÑ‚ÑÐ¶ÐµÐ½Ð¸Ñ Ð²Ð¾ времени на %1 AudioCallbackRecordTarget recorded-%1.wav Recorded %1 AudioDial Enter new value Введите новое значение %1: %2%3 %1: %2%3 %1: %2 %1: %2 %2%3 %2%3 New value for %1, from %2 to %3 %4: Ðовое значение Ð´Ð»Ñ Â«%1», от %2 до %3 %4: New value for %1, from %2 to %3: Ðовое значение Ð´Ð»Ñ Â«%1», от %2 до %3: Enter a new value from %1 to %2 %3: Введите новое значение от %1 до %2 %3: Enter a new value from %1 to %2: Введите новое значение от %1 до %2: AudioTargetFactory (auto) (авто) JACK Audio Connection Kit Ограничить воÑпроизведение выделением PulseAudio Server Сервер PulseAudio Core Audio Device УÑтройÑтво Core Audio Default Soundcard Device Ð—Ð²ÑƒÐºÐ¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° по умолчанию BZipFileDevice File is already open Этот файл уже открыт Append mode not supported Режим Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² конец не поддерживаетÑÑ File access mode not specified СпоÑоб доÑтупа к файлам не указан Read and write modes both specified Режимы Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑи определены Failed to open file for writing Ðе удалоÑÑŒ открыть файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Failed to open file handle for writing Failed to open bzip2 stream for writing Ðе удалоÑÑŒ открыть поток bzip2 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Failed to open file for reading Ðе удалоÑÑŒ открыть файл Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Failed to open file handle for reading Failed to open bzip2 stream for reading Ðе удалоÑÑŒ открыть поток bzip2 Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Internal error (open for neither read nor write) ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° (не открываетÑÑ Ð½Ð¸ на чтение, ни на запиÑÑŒ) File not open Файл не открыт bzip2 stream write close error Ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи в поток bzip2 bzip2 stream read close error Ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ° bzip2 Internal error (close for neither read nor write) ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° (не закрываетÑÑ Ð½Ð¸ чтение, ни запиÑÑŒ) bzip2 stream read error Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ° bzip2 BundleCommand %1 (%n change(s)) %1 (%n изменение) %1 (%n изменениÑ) %1 (%n изменений) CSVFileWriter Failed to open file %1 for writing Ðе удалоÑÑŒ открыть файл %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи CSVFormatDialog Select Data Format Выберите формат данных Each row specifies: ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока определÑет: A point in time Точку во времени A value at a time Значение во точке времени A set of values Серию значений The first column contains: Первый Ñтолбец Ñодержит: Time, in seconds ВремÑ, в Ñекундах Time, in audio sample frames ВремÑ, в выборках звуковых ÑÑмплов Data (rows are consecutive in time) Данные (Ñтроки поÑледовательны во времени) Please select the correct data format for this file. <ignore> Values (%1 more) Time Ð’Ñ€ÐµÐ¼Ñ End time Duration ДлительноÑть Value Значение Pitch Ð’Ñ‹Ñота тона Label Метка Timing is specified: Explicitly, in seconds Explicitly, in milliseconds Explicitly, in audio sample frames Implicitly: rows are equally spaced in time Audio sample rate (Hz): ЧаÑтота ÑÑÐ¼Ð¿Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ° (Гц): Frame increment between rows: Data will be displayed in a %1 layer. Example data from file: Пример данных из файла: <b>Select Data Format</b><p>Please select the correct data format for this file. <b>Выберите формат данных</b><p>Выберите правильный формат данных Ð´Ð»Ñ Ñтого файла. Colour3DPlotLayer Time: %1 - %2 Bin: %3 Value: %4 ВремÑ: %1 - %2 Bin: %3 Значение: %4 Linear Линейный <unknown> <неизвеÑтно> Colour Цвет Scale МаÑштаб Normalize Columns Ðормализовать Ñтолбцы Normalize Visible Area Ðормализовать видимую облаÑть Log ЛогарифмичеÑкий +/-1 ±1 Invert Vertical Scale Инвертировать маÑштаб по вертикали Always Opaque Ð’Ñегда непрозрачно Absolute ÐбÑолютный Gain УÑиление Normalization Smooth Bin Scale Bins Бины None Col View Hybrid dB Дб ColourComboBox Name New Colour Дайте цвету название Enter a name for the new colour: Введите название нового цвета: Prefer black background for this colour Предпочитать черный фон Ð´Ð»Ñ Ñтого цвета Add New Colour... Добавить новый цвет... ColourMapper <unknown> <неизвеÑтно> Default По умолчанию White on Black Белое на чёрном Black on White Чёрное на белом Red on Blue КраÑное на Ñинем Yellow on Black Жёлтое на чёрном Blue on Black Синее на чёрном Green Зелёный Sunset Закат Fruit Salad Фруктовый Ñалат Banded Ð’ полоÑку Highlight ПодÑветка Printer Принтер CommandHistory &Undo &Отменить Ctrl+Z Ctrl+Z Re&do Ве&рнуть Ctrl+Shift+Z Ctrl+Shift+Z Nothing to undo Ðет отменÑемых дейÑтвий Nothing to redo Ðет повторÑемых дейÑтвий &Undo %1 &Отменить дейÑтвие «%1» Re&do %1 Повто&рить дейÑтвие «%1» Undo the last editing operation Отменить поÑледнее дейÑтвие правки Redo the last operation that was undone Повторить поÑледнее дейÑтвие правки Undo %1 Отмена дейÑÑ‚Ð²Ð¸Ñ Â«%1» Redo %1 Повтор дейÑÑ‚Ð²Ð¸Ñ Â«%1» CoreAudioFileReader Decoding %1... ДекодируетÑÑ %1... DecodingWavFileReader Decoding %1... ДекодируетÑÑ %1... Dense3DModelPeakCache Dense 3-D Peak Cache DenseThreeDimensionalModel Dense 3-D Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка DenseTimeValueModel Dense Time-Value Document Set main model to %1 Сделать %1 оÑновной моделью Clear main model ОчиÑтить оÑновную модель EditableDenseThreeDimensionalModel Editable Dense 3-D FFTModel %1 Hz %1 Гц FFT FFT Fader Level: Off Уровень: выкл Level: %1%2.%3%4 dB Уровень: %1%2.%3%4 Дб Enter new fader level Ввведите новый уровень фейдера New fader level, from %1 to %2 dBFS: Ðовый уровень фейдера, от %1 до %2 dBFS: FeatureExtractionModelTransformer Transforms supplied to a single FeatureExtractionModelTransformer instance must be similar in every respect except plugin output No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Failed to instantiate plugin "%1" Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Failed to initialise feature extraction plugin "%1" Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Plugin "%1" has no outputs У плагина "%1" нет выходов Plugin "%1" has no output named "%2" У плагина "%1" нет выхода Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ "%2" FileSource Unsupported scheme in URL ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñхема URL Downloading %1... СкачиваетÑÑ %1... Failed to connect to FTP server Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ FTP-Ñервером Login failed Ðе удалоÑÑŒ авторизоватьÑÑ Failed to change to correct directory Ðе удалоÑÑŒ поменÑть на корректный каталог FTP download aborted Скачивание Ñ FTP-Ñервера прервано Download cancelled Скачивание отменено Failed to create local file %1 Ðе удалоÑÑŒ Ñоздать локальный файл %1 File contains no data! Файл не Ñодержит данных! FlexiNoteLayer New Point ÐÐ¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Vertical Scale Верт. маÑштаб Scale Units Единицы шкалы Scale МаÑштаб Auto-Align Ðвтовыравнивание Linear Линейный Log ЛогарифмичеÑкий MIDI Notes Ðоты MIDI In progress Ð’ процеÑÑе No local points Ðет локальных точек %1 (%2, %3 Hz) %1 (%2, %3 Гц) %1 Hz (%2, %3) %1Гц (%2, %3) %1 %2 %1 %2 Time: %1 Pitch: %2 Duration: %3 No label ВремÑ: %1 Ð’Ñ‹Ñота тона: %2 ДлительноÑть: %3 Без метки Time: %1 Pitch: %2 Duration: %3 Label: %4 ВремÑ: %1 Ð’Ñ‹Ñота тона: %2 ДлительноÑть: %3 Метка: %4 Draw Point ÐариÑовать точку Erase Point Drag Point Перетащить точку Edit Point Изменить точку Relocate Point ПеремеÑтить точку Change Point Value Изменить значение точки Add Point Добавить точку Snap Notes Merge Notes Drag Selection Resize Selection Delete Selected Points Удалить выбранные точки Re-align pasted items? Заново выровнÑть вÑтавленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Ð’Ñтавить Record FlexiNote FlexiNoteModel FlexiNote Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Pitch Ð’Ñ‹Ñота тона Duration ДлительноÑть Level Уровень Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные I Edit Data Изменить данные ImageDialog Image Изображение Label: Метка: File or URL: Файл или URL: Browse... ПроÑмотр... Preview ПредпроÑмотр Unsupported scheme in URL ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñхема URL The URL scheme "%1" is not supported Схема URL "%1" не поддерживаетÑÑ Opening image URL... ОткрываетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ по URL... File download failed Ðе удалоÑÑŒ Ñкачать файл Failed to download URL "%1": %2 Ðе удалоÑÑŒ Ñкачать URL "%1": %2 ImageLayer In progress Ð’ процеÑÑе Select image Выбрать изображение Move Image ПеремеÑтить изображение Drag Selection Перетащить выделение Resize Selection Изменить размер Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Delete Selection Удалите выделение Re-align pasted items? Заново выровнÑть вÑтавленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Ð’Ñтавить New Point ÐÐ¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Opening image URL... ОткрываетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ по URL... ImageModel Image Изображение Edit Image Изменить изображение Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные InteractiveFileFinder Select file Выберите файл All files (*.*) Ð’Ñе файлы (*.*) Select a session file Выберите файл ÑеÑÑии Sonic Visualiser session files (*.sv) RDF files (%1) All files (*.*) Файлы ÑеанÑов Sonic Visualiser (*.sv) Файлы RDF (%1) Ð’Ñе файлы (*.*) Audio files (%1) All files (*.*) Звуковые файлы (%1) Ð’Ñе файлы (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) Ð’Ñе поддерживаемые типы файлов (%1 %2) XML-файлы Ñлоёв Sonic Visualiser (*.svl) Разделённые запÑтой файлы данных (*.csv) Разделённые пробелом файлы .lab (*.lab) Файлы RDF (%2) Файлы MIDI (*.mid) ТекÑтовые файлы (*.txt) Ð’Ñе файлы (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) Ð’Ñе поддерживаемые типы файлов (%1 %2) XML-файлы Ñлоёв Sonic Visualiser (*.svl) Разделённые запÑтой файлы данных (*.csv) Разделённые пробелом файлы .lab (*.lab) Файлы RDF (%2) ТекÑтовые файлы (*.txt) ВÑе файлы (*.*) All supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*) Ð’Ñе поддерживаемые типы файлов (*.sv %1 %2) Файлы ÑеанÑов Sonic Visualiser (*.sv) Звуковые файлы (%2) Файлы RDF (%1) Ð’Ñе файлы (*.*) Image files (%1) All files (*.*) Файлы изображений (%1) Ð’Ñе файлы (*.*) All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) Ð’Ñе поддерживаемые типы файлов (*.sv %1 %2 %3) Файлы ÑеанÑов Sonic Visualiser (*.sv) Звуковые файлы (%1) Файлы Ñлоев (%2) Файлы RDF (%3) Ð’Ñе файлы (*.*) File does not exist Файл не ÑущеÑтвует <b>File not found</b><p>File "%1" does not exist <b>Файл не найден</b><p>Файл "%1" не ÑущеÑтвует File is not readable Файл нечитаем <b>File is not readable</b><p>File "%1" can not be read <b>Файл нечитаем</b><p>Файл "%1" не может быть прочитан Directory selected Выбран каталог <b>Directory selected</b><p>File "%1" is a directory <b>Выбран каталог</b><p>Файл "%1" ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ Non-file selected Выбран не файл <b>Not a file</b><p>Path "%1" is not a file <b>Это не файл</b><p>Путь "%1" не ÑвлÑетÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ File is empty Файл пуÑÑ‚ <b>File is empty</b><p>File "%1" is empty <b>ПуÑтой файл</b><p>Файл "%1" пуÑÑ‚ Sonic Visualiser session files (*.sv) All files (*.*) Файлы ÑеанÑов Sonic Visualiser (*.sv) Ð’Ñе файлы (*.*) %1 session files (*.%1) RDF files (%3) All files (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2) %3 session files (*.%4) Audio files (%2) RDF files (%1) All files (*.*) Ð’Ñе поддерживаемые типы файлов (*.sv %1 %2) Файлы ÑеÑÑий %3 (*.%4) Звуковые файлы (%2) Файлы RDF (%1) Ð’Ñе файлы (*.*) Scalable Vector Graphics files (*.svg) All files (*.*) Файлы Scalable Vector Graphics (*.svg) Ð’Ñе файлы (*.*) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2 %3) %4 session files (*.%5) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) %1 session files (*.%2) All files (*.*) Select a file to export to Выберите файл, в который ÑкÑпортировать WAV audio files (*.wav) All files (*.*) Звуковые файлы WAV (*.wav) Ð’Ñе файлы (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) XML-файлы Ñлоёв Sonic Visualiser (*.svl) Разделённые запÑтой данные (*.csv) Файлы RDF/Turtle (%1) Файлы MIDI (*.mid) ТекÑтовые файлы (*.txt) Ð’Ñе файлы (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) XML-файлы Ñлоёв Sonic Visualiser (*.svl) Разделённые запÑтой данные (*.csv) Файлы RDF/Turtle (%1) ТекÑтовые файлы (*.txt) Ð’Ñе файлы (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Comma-separated data files (*.csv) Sonic Visualiser Layer XML files (*.svl) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Portable Network Graphics files (*.png) All files (*.*) Файлы Portable Network Graphics (*.png) Ð’Ñе файлы (*.*) Comma-separated data files (*.csv) Text files (*.txt) All files (*.*) File exists Такой файл уже ÑущеÑтвует <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>Файл ÑущеÑтвует</b>Файл "%1" уже ÑущеÑтвует. Ð’Ñ‹ хотите перезапиÑать его? <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>Файл не найден</b><p>Ðе удалоÑÑŒ открыть звуковой файл "%1". Ð’Ñ‹ хотите указать его программе? <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? <b>Файл не найден</b><p>Ðе удалоÑÑŒ открыть файл "%1". Ð’Ñ‹ хотите указать его программе? Failed to open file Ðе удалоÑÑŒ открыть файл Locate file... Указать файл... Use URL... ИÑпользовать URL... Cancel Отменить Use URL ИÑпользовать URL Please enter the URL to use for this file: Укажите URL, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñтого файла: Failed to open location Ðе удалоÑÑŒ открыть меÑтоположение <b>Failed to open location</b><p>URL "%1" could not be opened <b>Ðе удалоÑÑŒ открыть меÑтоположение</b><p>Ðе удалоÑÑŒ открыть URL "%1". ItemEditDialog Timing Тайминг Time: ВремÑ: frames выборок sec Ñ usec Ð¼Ñ Duration: ДлительноÑть: Properties СвойÑтва Value: Значение: Text: ТекÑÑ‚: OK ОК Reset СброÑить Cancel Отменить KeyReference & & <i>or</i>&nbsp;<b>%1</b> <i>или</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> </b>&nbsp;(%1)<b> %1: Key and Mouse Reference Sonic Visualiser: Key and Mouse Reference Справка по иÑпользованию клавиатуры и мыши LabFileWriter Failed to open file %1 for writing Ðе удалоÑÑŒ открыть файл %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи LabelCounterInputDialog Set Counters УÑтановка Ñчётчиков Fine counter (beats): Точный Ñчётчик (доли): Coarse counter (bars): Грубый Ñчётчик (такты): Labeller No numbering Без нумерации Simple counter ПроÑтой Ñчетчик Cyclical counter ЦикличеÑкий Ñчетчик Cyclical two-level counter (bar/beat) ЦикличеÑкий двухуровневый Ñчетчик (такт/долÑ) Audio sample frame number Ðомер выборки звукового ÑÑмпла Time in seconds Ð’Ñ€ÐµÐ¼Ñ Ð² Ñекундах Duration to the following item ДлительноÑть до Ñледующей отметки Tempo (bpm) based on duration to following item Темп (bpm) на оÑнове длительноÑти до Ñледующей отметки Duration since the previous item ДлительноÑть поÑле предыдущей отметки Tempo (bpm) based on duration since previous item Темп (bpm) на оÑнове длительноÑти поÑле предыдущей отметки Same as the nearest previous item Как и ближайший предыдущий объект Value extracted from the item's label (where possible) Значение, извлечённое из метки объекта (еÑли возможно) %1.%2 %1.%2 %1 %1 Label Points Subdivide Points Winnow Points Layer Waveform Ð’Ð¾Ð»Ð½Ð¾Ð²Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° Spectrogram Спектрограмма Ruler Линейка Time Instants Отметки времени Time Values Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Notes Ðоты Flexible Notes Text ТекÑÑ‚ Colour 3D Plot Цветной 3D-график Unknown Layer Layer Слой Spectrum Спектр Time Slice Images Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Regions ОблаÑти Make Measurement Создать замер Delete Measurement Удалить замер Layer::AddMeasurementRectCommand Make Measurement Создать замер Layer::DeleteMeasurementRectCommand Delete Measurement Удалить замер LayerTreeDialog Layer Summary Сводка по Ñлою Audio Data Sources ИÑточники звуковых данных Panes and Layers Окна и Ñлои LayerTreeModel Layer Слой Model Модель Shown Отображение Played ВоÑпризведение LevelPanToolButton Click to adjust level and pan LevelPanWidget Drag vertically to adjust level, horizontally to adjust pan MIDIFileImportDialog Merge all tracks Объединить вÑе дорожки Merge all non-percussion tracks Объединить вÑе неперкуÑÑионные дорожки Select track or tracks to import Выберите одну или неÑколько дорожек Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: <b>Выберите импортируемую дорожку</b><p>Ð’Ñ‹ можете импортировать Ñтот файл лишь как одиночный Ñлой аннотации, но в файле либо больше одной дорожки, либо ноты в более чем одном канале.<p>Выберите одну дорожку или неÑколько объединÑемых дорожек Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°: Error in MIDI file import Ошибка при импорте файла MIDI MIDIFileReader Wrong length for long data in MIDI stream (%1, should be %2) ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñть больших данных в потоке MIDI (%1, должно быть %2) Wrong length for int data in MIDI stream (%1, should be %2) ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñть int-данных в потоке MIDI (%1, должно быть %2) getMIDIByte called but no MIDI file open Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ getMIDIByte вызвана, но ни один файл MIDI не открыт End of MIDI file encountered while reading При чтении обнаружен конец файла MIDI Attempt to get more bytes than expected on Track Попытка получить из дорожки больше байтов, чем ожидалоÑÑŒ Attempt to read past MIDI file end Попытка прочитать файл MIDI поÑле его Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ getMIDIBytes called but no MIDI file open Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ getMIDIBytes вызвана, но ни один файл MIDI не открыт Attempt to get more bytes than available on Track (%1, only have %2) Попытка получить из дорожки больше байтов, чем ожидалоÑÑŒ (%1, а еÑть лишь %2) getNumberFromMIDIBytes called but no MIDI file open Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ getNumberFromMIDIBytes вызвана, но ни один файл MIDI не открыт skipToNextTrack called but no MIDI file open Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ skipToNextTrack вызвана, но ни один файл MIDI не открыт Invalid event code %1 found Обнаружен некорректный код ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ %1 Running status used for first event in track MIDI file "%1" has no notes in any track Ðи в одной дорожке файла MIDI "%1" нет нот - uses GM percussion channel — иÑпользует канал перкуÑÑии GM Track %1 (%2)%3 Дорожка %1 (%2)%3 Track %1 (untitled)%3 Дорожка %1 (без имени)%3 %1 - vel %2 %1 - vel %2 MIDIInput Input Вход MP3FileReader Decoding %1... ДекодируетÑÑ %1... MainWindow Sonic Visualiser Sonic Visualiser &Layer С&лой &File &Файл File Toolbar Панель файлов &New Session &Создать ÑеÑÑию Ctrl+N Ctrl+N &Open Session... &Открыть ÑеанÑ... Ctrl+O Ctrl+O Open a previously saved Sonic Visualiser session file Открыть файл Ñохранённого ранее ÑеанÑа Sonic Visualiser &Open... О&ткрыть... Open a session file, audio file, or layer Открыть файл ÑеÑÑии, звуковой файл или Ñлой &Save Session Сохр&анить ÑеÑÑию Ctrl+S Ctrl+S Save the current session into a Sonic Visualiser session file Сохранить в файл текущий ÑÐµÐ°Ð½Ñ Sonic Visualiser Save Session &As... Сохранить ÑÐµÐ°Ð½Ñ &как... Save the current session into a new Sonic Visualiser session file Сохранить текущий ÑÐµÐ°Ð½Ñ Sonic Visualiser в файл Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ именем &Import Audio File... &Импортировать звуковой файл... Ctrl+I Ctrl+I Import an existing audio file Импортировать ÑущеÑтвующий звуковой файл Import Secondary Audio File... Импортировать второй звуковой файл... Ctrl+Shift+I Ctrl+Shift+I Import an extra audio file as a separate layer Импортировать ещё один звуковой файл в отдельный Ñлой &Export Audio File... Э&кÑпортировать звуковой файл... Export selection as an audio file ЭкÑпортировать выделенное в звуковой файл Import Annotation &Layer... И&мпортировать Ñлой аннотаций... Ctrl+L Ctrl+L Import layer data from an existing file Импортировать данные ÑÐ»Ð¾Ñ Ð¸Ð· ÑущеÑтвующего файла Export Annotation Layer... ЭкÑпортировать Ñлой аннотаций... Export layer data to a file ЭкÑпортировать данные ÑÐ»Ð¾Ñ Ð² файл &Quit Ð’&ыход Ctrl+Q Ctrl+Q &Edit &Правка Cu&t &Вырезать Ctrl+X Ctrl+X &Copy С&копировать Ctrl+C Ctrl+C &Paste Ð’ÑÑ‚&авить Ctrl+V Ctrl+V &Delete Selected Items &Удалить выбранное Del Del Select &All Ð’&ыделить вÑÑ‘ Ctrl+A Ctrl+A Select &Visible Range Ð’Ñ‹&делить вÑÑ‘ видимое Ctrl+Shift+A Ctrl+Shift+A Select to &Start Выделить до &начала Shift+Left Shift+Left Select to &End Выделить до &конца Shift+Right Shift+Right C&lear Selection Сн&Ñть выделение Esc Esc &Insert Instant at Playback Position Ð’Ñтавить &отметку в точку воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Enter Enter &View &Вид 0 0 9 9 8 8 Scroll &Left Прокрутить в&лево Playback Speed СкороÑть воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Abandon the current %1 session and start a new one Replace &Main Audio... &Заменить оÑновной аудиофайл… Replace the main audio file of the session with a different file Save the current session into a %1 session file Save the current session into a new %1 session file Export Audio Data... ЭкÑпортировать звуковые данные… Export Annotation La&yer... ЭкÑпортировать Ñлой &аннотаций… Ctrl+Y Ctrl+Y Export SVG File... ЭкÑпортировать файл SVG… Export a single pane to a scalable SVG image file Browse Recorded Audio Folder Открыть папку Ñ Ð·Ð°Ð¿Ð¸Ñанными аудиофайлами Open the Recorded Audio folder in the system file browser Exit %1 Завершить работу Ñ %1 Ctrl+Shift+Return Reset Numbering Counters СброÑить Ñчётчики нумерации Reset to 1 all the counters used for counter-based labelling Subdivide Selected Instants... Add new instants at regular intervals between the selected instants Winnow Selected Instants... Remove subdivisions, leaving only every Nth instant Left Влево Scroll the current pane to the left Прокрутить активное окно влево Scroll &Right Прокрутить в&право Right Вправо Scroll the current pane to the right Прокрутить активное окно вправо Ctrl+Left Ctrl+Влево Scroll the current pane a big step to the left Сделать большой шаг прокрутки влево Ctrl+Right Ctrl+Вправо Scroll the current pane a big step to the right Сделать большой шаг прокрутки вправо Zoom &In При&близить Up Вверх Increase the zoom level Увеличить маÑштаб Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Zoom &Out &Отдалить Down Вниз Decrease the zoom level Уменьшить маÑштаб Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Restore &Default Zoom &ВоÑÑтановить обычный маÑштаб Zoom to &Fit &УмеÑтить в окне Zoom to show the whole file Увидеть веÑÑŒ файл Show &Centre Line Показывать &центральную линию ' Show or hide the centre line Toggle All Time Rulers Переключить видимоÑть вÑех линеек Hide times, layer names, and scale Show times and basic scale Show times, layer names, and scale Show &Unit Converter Показать конвертер &единиц Open a window of pitch and timing conversion utilities Go Full-Screen ПолноÑкранный режим F11 F11 Expand the pane area to the whole screen &Pane &Окно Add &New Pane Добавить &новое окно Add a new pane containing only a time ruler Добавить новое окно, Ñодержащее только линейку времени Add New %1 Layer Добавить новый Ñлой «%1» Add a new empty layer of type %1 Добавить новый пуÑтой Ñлой типа «%1» Add &Waveform Добавить &волновую форму Add a new pane showing a waveform view Добавить новое окно Ñ Ð²Ð¸Ð´Ð¾Ð¼ волновой формы Add a new layer showing a waveform view Добавить новый Ñлой Ñ Ð²Ð¸Ð´Ð¾Ð¼ волновой формы Add &Melodic Range Spectrogram Добавить Ñпектограмму &мелодичеÑкого диапазона Add a new pane showing a spectrogram set up for tracking frequencies Добавить новое окно, отображающее Ñпектрограмму Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñтот Add a new layer showing a spectrogram set up for tracking frequencies Добавить новый Ñлой, отображающий Ñпектрограмму Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñтот &All Channels Mixed Ð’Ñе &каналы Ñведены &All Channels &Ð’Ñе каналы Channel &%1 Канал &%1 &Delete Pane У&далить окно Add &Time Ruler Добавить линейку &времени Add a new layer showing a time ruler Добавить новый Ñлой Ñ Ð»Ð¸Ð½ÐµÐ¹ÐºÐ¾Ð¹ Add &Existing Layer Добавить &ÑущеÑтвующий Ñлой Switch to Previous Layer ПереключитьÑÑ Ð½Ð° предыдущий Ñлой { { Make the previous layer in the pane current Switch to Next Layer ПереключитьÑÑ Ð½Ð° Ñледующий Ñлой } } Make the next layer in the pane current &Rename Layer... &Переименовать Ñлой... Rename the currently active layer Переименовать активный Ñлой &Delete Layer &Удалить Ñлой Delete the currently active layer Удалить активный Ñлой &Help &Справка &Help Reference &РуководÑтво Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Open the Sonic Visualiser reference manual Открыть Ñправку по Sonic Visualiser Sonic Visualiser on the &Web &Веб-Ñайт Sonic Visualiser Open the Sonic Visualiser website Открыть веб-Ñайт Sonic Visualiser &About Sonic Visualiser &О Sonic Visualiser Show information about Sonic Visualiser Показать информацию о Sonic Visualiser Rewind to Start Перемотать в начало Home Домой Rewind to the start Перемотать в начало Rewind Перемотать назад Rewind to the previous time instant in the current layer Перемотать до предыдущей отметки времени в текущем Ñлое Play / Pause ВоÑпроизвеÑти / ПриоÑтановить Space Пробел Start or stop playback from the current position ЗапуÑтить или оÑтановить воÑпроизведение Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ позиции Fast Forward Перемотать вперёд Fast forward to the next time instant in the current layer Перемотать до Ñледующей отметки времени в текущем Ñлое Fast Forward to End Перемотать до конца Open a window showing the keystrokes you can use in %1 %1 on the &Web %1 в &Интернете Open the %1 website &About %1 &О %1 Show information about %1 Показать информацию о %1 End Конец Fast-forward to the end Перемотать до конца Play Mode Toolbar Панель режима воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Constrain Playback to Selection Ограничить воÑпроизведение выделением s Ñ Loop Playback ВоÑпроизведение в цикле l l Loop playback ВоÑпроизведение в цикле Edit Toolbar Панель правки Tools Toolbar Панель инÑтрументов Navigate Перемещение 1 1 Select Выделение 2 2 Edit Правка 3 3 Draw РиÑование 4 4 No audio file loaded. Ðи один звуковой файл не загружен. %1Hz (resampling to %2Hz) %1 Гц (реÑÑмплирование до %2 Гц) Failed to open file Ðе удалоÑÑŒ открыть файл Export the selected region only ЭкÑпортировать только выделенную облаÑть Export the whole audio file ЭкÑпортировать веÑÑŒ звуковой файл Select region to export Выделите облаÑть Ð´Ð»Ñ ÑкÑпорта Which region from the original audio file do you want to export? Какую облаÑть иÑходного звукового файла вы хотите ÑкÑпортировать? Export the selected regions into a single audio file ЭкÑпортировать выделенные облаÑти в один звуковой файл Export the selected regions into separate files ЭкÑпортировать выделенные облаÑти в разные звуковые файлы Multiple regions of the original audio file are selected. What do you want to export? Выбрано неÑколько облаÑтей иÑходного звукового файла. Какую из них вы хотите ÑкÑпортировать? Fragment file %1 already exists, aborting Файл фрагмента %1 уже ÑущеÑтвует, прерывание Failed to write file Ðе удалоÑÑŒ запиÑать файл Failed to open file %1 for writing Ðе удалоÑÑŒ открыть файл %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Sonic Visualiser: %1 Sonic Visualiser: %1 Session modified СеÑÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° Failed to save file Ðе удалоÑÑŒ Ñохранить файл Rename Layer Переименовать Ñлой New name for this layer: Ðовое Ð¸Ð¼Ñ Ñтого ÑлоÑ: Sample rate mismatch ÐеÑоответÑтвие чаÑтоты диÑкретизации Failed to regenerate layer Ðе удалоÑÑŒ повторно Ñоздать Ñлой http://www.sonicvisualiser.org/ http://www.sonicvisualiser.org/ Release %1 : Revision %2 ВерÑÐ¸Ñ %1 : Ð ÐµÐ´Ð°ÐºÑ†Ð¸Ñ %2 Release %1 ВерÑÐ¸Ñ %1 Unreleased : Revision %1 Ðе выпущено : Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ %1 <h3>About Sonic Visualiser</h3> <h3>О программе Sonic Visualiser</h3> Debug Отладка Release ВерÑÐ¸Ñ <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>С декодером Ogg (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>С поддержкой плагинов LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>С поддержкой плагинов DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton About Sonic Visualiser О программе Sonic Visualiser Failed to generate layer Ðе удалоÑÑŒ Ñоздать Ñлой Adjust the application preferences Изменить параметры работы Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ &Recent Files Ð&едавние файлы &Preferences... &Параметры... ; ; Show &Zoom Wheels Показывать &колёÑа маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Z Z Show thumbwheels for zooming horizontally and vertically Показывать колёÑа Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ горизонтали и вертикали %1 by Category %1 по категории Unclassified ÐеклаÑÑифицированные %1 by Maker %1 по имени ÑÐ¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Unknown ÐеизвеÑтен %1 by Plugin Name %1 по названию плагина %1... %1... Add Spectr&um Добавить &график Ñпектральной функции Add a new pane showing a frequency spectrum Добавить новое окно Ñ Ñ‡Ð°Ñтотой Ñпектра Add a new layer showing a frequency spectrum Добавить новый Ñлой Ñ Ñ‡Ð°Ñтотой Ñпектра Playback Speedup УÑкорение воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ &Transform Пр&ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ %1: %2 %1: %2 &Recent Transforms &Ðедавние Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ [\(<].*$ [\(<].*$ Audio processing overload Перегрузка в обработке звука Show Property Bo&xes Показывать панели Ñ&войÑтв X X Show the layer property boxes at the side of the main window Показывать панели ÑвойÑтв Ñлоёв Ñбоку от оÑновного окна Add %1 Pane Добавить окно %1 Abandon the current Sonic Visualiser session and start a new one ОтказатьÑÑ Ð¾Ñ‚ текущего ÑеанÑа Sonic Visualiser и начать новый Open Lo&cation... Открыть &меÑтоположение... Ctrl+Shift+O Ctrl+Shift+O Open or import a file from a remote URL Открыть или импортировать файл Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ узла Exit Sonic Visualiser Завершить работу Ñ Sonic Visualiser Cut the selection from the current layer to the clipboard Вырезать выделение из активного ÑÐ»Ð¾Ñ Ð² буфер обмена Copy the selection from the current layer to the clipboard Скопировать выделение из активного ÑÐ»Ð¾Ñ Ð² буфер обмена Paste from the clipboard to the current layer Ð’Ñтавить Ñодержимое буфера обмена в активный Ñлой Select the whole duration of the current session Выбрать данные по вÑей длительноÑти активнонр ÑеанÑа Select the time range corresponding to the current window width Сделать временной диапазон равным активной ширине окна Select from the start of the session to the current playback position Выделить от начала ÑеÑÑии до текущей точки воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Select from the current playback position to the end of the session Выделить от текущей точки воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾ конца ÑеÑÑии Clear the selection ОчиÑтить выделение Insert a new time instant at the current playback position, in a new layer if necessary Ð’Ñтавить новую отметку времени в точку воÑпроизведениÑ, при необходимоÑти — в новый Ñлой Insert Instants at Selection &Boundaries Ð’Ñтавить отметки времени по &краÑм Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Shift+Enter Shift+Enter &Jump Left ПереÑкочить в&лево J&ump Right П&ереÑкочить вправо Restore the zoom level to the default ВоÑÑтановить обычный маÑштаб Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Show &No Overlays Ðе по&казывать Ð¿ÐµÑ€ÐµÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑовÑем Hide centre indicator, frame times, layer names and scale СпрÑтать индикацию центра, времён выделениÑ, имена Ñлоёв и маÑштаб Show &Minimal Overlays Показывать &минимум перекрытий Show centre indicator only Показывать только индикатор центра Show &Standard Overlays Показывать о&бычные Ð¿ÐµÑ€ÐµÐºÑ€Ñ‹Ñ‚Ð¸Ñ Show centre indicator, frame times and scale Показывать индикатор центра, времена выделений, имена Ñлоёв и маÑштаб Show &All Overlays Показывать в&Ñе Ð¿ÐµÑ€ÐµÐºÑ€Ñ‹Ñ‚Ð¸Ñ 7 7 Show all texts and scale Показывать веÑÑŒ текÑÑ‚ и маÑштаб Show Status &Bar Показывать ÑтатуÑную &Ñтроку Show context help information in the status bar at the bottom of the window Показывать контекÑтную Ñправку в ÑтатуÑной Ñтроке, находÑщейÑÑ Ð²Ð½Ð¸Ð·Ñƒ окна программы Add a new pane showing a spectrogram Добавить новое окно Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ Ñпектрограммы Add a new layer showing a spectrogram Добавить новый Ñлой Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ Ñпектрограммы Add a new pane showing a spectrogram set up for an overview of note pitches Добавить новое окно, отображающее Ñпектрограмму Ð´Ð»Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° выÑоты тона нот Add a new layer showing a spectrogram set up for an overview of note pitches Добавить новый Ñлой, отображающий Ñпектрограмму Ð´Ð»Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° выÑоты тона нот Delete the currently active pane Удалить активное окно Add S&lice of Layer Добавить &фрагмент ÑÐ»Ð¾Ñ What's &New? &Что нового? Show changes in this release of %1 Показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтой верÑии %1 Select ranges Выбрать диапазон Edit items in layer Изменить объекты ÑÐ»Ð¾Ñ Draw new items in layer ÐариÑовать новые объекты в Ñлое Open Location Открыть меÑтоположение Please enter the URL of the location to open: Введите URL открываемого меÑтоположениÑ: Failed to open location Ðе удалоÑÑŒ открыть меÑтоположение Multiplex all of the above Playback speed: %1% (%2x slower) СкороÑть воÑпроизведениÑ: %1% (в %2 раза медленнее) Playback speed: %1% (%2x faster) СкороÑть воÑпроизведениÑ: %1% (в %2 раза быÑтрее) Visible: %1 to %2 (duration %3) Ð’Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð¾Ð±Ð»Ð°Ñть: от %1 до %2 (длительноÑть %3) Problems loading plugins <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform %1failed:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform %1failed.<p>No error information is available. Adjust the master playback level Изменить общую громкоÑть воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Adjust the master playback speed Изменить общую ÑкороÑть воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ <br>With Ogg file decoder &copy; CSIRO Australia <br>С декодером Ogg &copy; CSIRO Australia <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>С декодером MAD mp3 &copy; Underbit Technologies Inc <br>With libsamplerate &copy; Erik de Castro Lopo <br>С libsamplerate &copy; Erik de Castro Lopo <br>With libsndfile &copy; Erik de Castro Lopo <br>С libsndfile &copy; Erik de Castro Lopo <br>With FFTW3 &copy; Matteo Frigo and MIT <br>С FFTW3 &copy; Matteo Frigo и MIT <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam <br>С поддержкой раÑширений Vamp (API v%1, host SDK v%2) &copy; Chris Cannam <br>With Serd and Sord RDF parser and store &copy; David Robillard <br>With liblo Lite OSC library &copy; Steve Harris <br>С liblo Lite OSC library &copy; Steve Harris Export Image File... ЭкÑпортировать в файл изображениÑ... Export a single pane to an image file ЭкÑпортировать вÑÑ‘ окно в файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Export the whole pane (%1x%2 pixels) ЭкÑпортировать вÑÑ‘ окно (%1x%2 пикÑелов) Export the visible area only (%1x%2 pixels) ЭкÑпортировать только видимую чаÑть (%1x%2 пикÑелов) Export the selection extent (%1x%2 pixels) ЭкÑпортировать выделение (%1x%2 пикÑелов) Export the selection extent ЭкÑпортировать выделение Which region of the current pane do you want to export as an image? Какую облаÑть текущего окна вы хотите ÑкÑпортировать как изображение? Note: the whole pane is too wide to be exported as a single image. Примечание: вÑÑ‘ окно Ñлишком широко, чтобы Ñохранить его как изображение. Failed to save image file Ðе удалоÑÑŒ Ñохранить файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Failed to save image file %1 Ðе удалоÑÑŒ Ñохранить файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ %1 Selection: %1 to %2 (duration %3) Выделение: %1 до %2 (длительноÑть %3) Black Чёрный Red КраÑный Blue Синий Green Зелёный Purple Пурпурный Orange Оранжевый White Белый Bright Red Ярко-краÑный Bright Blue Ярко-Ñиний Bright Green Ярко-зелёный Bright Purple Ярко-пурпурный Bright Orange Ярко-оранжевый File and Session Management Файлы и управление ÑеÑÑиÑми &Import More Audio... &Импортировать ещё аудиофайл… Import an extra audio file into a new pane Открыть дополнительный аудиофайл в новой панели Open &Recent Открыть &недавний Export audio from selection into a data file Apply Session Template Применить шаблон ÑеÑÑии Export Session as Template... ЭкÑпортировать ÑеÑÑию как шаблон… Manage Exported Templates Открыть папку Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ Editing Редактирование Paste at Playback Position Ð’Ñтавить под курÑор воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ctrl+Shift+V Ctrl+Shift+V Paste from the clipboard to the current layer, placing the first item at the playback position Delete items in current selection from the current layer Удалить объекты в активном выделении текущего ÑÐ»Ð¾Ñ Selection Выделение Tapping Time Instants Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Number New Instants with СпоÑоб нумерации новых отметок Cycle size Размер цикла Set Numbering Counters... УÑтановить Ñчетчики нумерации... Set the counters used for counter-based labelling УÑтанолвить Ñчетчики Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ðº на оÑнове подÑчета Renumber Selected Instants Перенумеровать выбранные отметки Renumber the selected instants using the current labelling scheme Panning and Navigation Прокрутка и перемещение Zoom МаÑштаб проÑмотра F F Display Features Отображение Ñлементов # Show or hide all time rulers Show La&yer Summary &Показать Ñводку по Ñлою Y Y Open a window displaying the hierarchy of panes and layers in this session Открыть окно, в котором отобразитÑÑ Ð¸ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ Ð¾ÐºÐ¾Ð½ и Ñлоев активной ÑеÑÑии Managing Panes and Layers Управление окнами и ÑлоÑми N N T T W W Shift+W Add Spectro&gram Добавить &Ñпектограмму G G Shift+G M M Shift+M Add Pea&k Frequency Spectrogram Добавить Ñпектограмму &пиковой чаÑтоты K K Shift+K U U Shift+U Switch to Previous Pane Перейти к предыдущему окну [ [ Make the next pane up in the pane stack current Switch to Next Pane Перейти к Ñледующему окну ] ] Make the next pane down in the pane stack current Ctrl+Shift+D Ctrl+Shift+D R R Edit Layer Data Изменить данные ÑÐ»Ð¾Ñ E E Edit the currently active layer as a data grid Изменить активный Ñлой как Ñетку данных Ctrl+D Ctrl+D Help Справка F1 F1 Open the %1 reference manual &Key and Mouse Reference &ИÑпользование клавиатуры и мыши F2 F2 Open a window showing the keystrokes you can use in Sonic Visualiser Открыть окно, в котором перечиÑлÑÑŽÑ‚ÑÑ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð½Ñ‹Ðµ комбинации Sonic Visualiser Ctrl+R Ctrl+R Re-open Повторно открыть Re-open the current or most recently opened file Повторно открыть активный или недавно открывавшийÑÑ Ñ„Ð°Ð¹Ð» Standard Waveform ÐžÐ±Ñ‹Ñ‡Ð½Ð°Ñ Ð²Ð¾Ð»Ð½Ð¾Ð²Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° Ñигнала Choose Default Template... Выбрать шаблон по умолчанию… Ctrl+T Ctrl+T Repeat Transform Повторить преобразование Re-select the most recently run transform Повторно запуÑтить Ñамое поÑледнее выполнÑвшееÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ðµ Playback and Transport Controls Управление воÑпроизведением и перемоткой Play&back ВоÑпро&изведение Playback ВоÑпроизведение Playback Toolbar Панель воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ PgUp PgUp Rewind to the previous time instant or time ruler notch PgDown PgDown Fast-forward to the next time instant or time ruler notch Record ЗапиÑать Ctrl+Space Record a new audio file Constrain playback to the selected regions Solo Current Pane Соло активного окна o o Solo the current pane during playback При воÑпроизведении звучит лишь активное окно Align File Timelines ВыровнÑть линейки времени Treat multiple audio files as versions of the same work, and align their timelines Speed Up УÑкорить Ctrl+PgUp Ctrl+PgUp Time-stretch playback to speed it up without changing pitch Сжать Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑпроизведениÑ, не менÑÑ Ð²Ñ‹Ñоту тона Slow Down Замедлить Ctrl+PgDown Ctrl+PgDown Time-stretch playback to slow it down without changing pitch РаÑширить Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑпроизведениÑ, не менÑÑ Ð²Ñ‹Ñоту тона Restore Normal Speed ВоÑÑтановить обычную ÑкороÑть Ctrl+Home Ctrl+Home Restore non-time-stretched playback ВоÑÑтановить еÑтеÑтвенную ÑкороÑть воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Tool Selection Выбор инÑтрумента Navigate Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом навигации Click left button and drag to move around Zoom to Area МаÑштабировать в выделение Shift-click left button and drag to zoom to a rectangular area Relocate ПеремеÑтить Double-Click Left Двойной щелчок левой клавишей Double-click left button to jump to clicked location Double-click left button on an item to edit it Select Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Click left button and drag to select region; drag region edge to resize Multi Select МножеÑтвенное выделение Cmd-click left button and drag to select an additional region Ctrl-click left button and drag to select an additional region Fine Select Выделить точно Shift-click left button and drag to select without snapping to items or grid Edit Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Move ПеремеÑтить Click left button on an item or selected region and drag to move Draw Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Click left button and drag to create new item Щелкните левой клавишей мыши и перетащите курÑор Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ объекта Erase Стерка 5 5 Erase items from layer Стирать объекты ÑÐ»Ð¾Ñ Erase Tool Mouse Actions Click left button on an item to remove it from the layer Measure Измеритель 6 6 Make measurements in layer ВыполнÑть Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð² Ñлое Measure Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Measure Area Измерить облаÑть Click left button and drag to measure a rectangular area Measure Item Измерить объект Click left button and drag to measure extents of an item or shape &Delete Current Measurement &Удалить активный замер Delete the measurement currently under the mouse pointer Удалить замер, находÑщийÑÑ Ð¿Ð¾Ð´ курÑором мыши Fast Forward to Next Instant Rewind to Previous Instant Fast Forward to Next Point Fast forward to the next point in the current layer Rewind to Previous Point Rewind to the previous point in the current layer Fast forward БыÑтрый вперед <b>File open failed</b><p>Audio file "%1" could not be opened <b>Ðе удалоÑÑŒ открыть файл</b><p>Ðе удалоÑÑŒ открыть звуковой файл "%1" Export the selected regions into a single file Export the whole file <b>File open failed</b><p>Layer file %1 could not be opened. <b>Ðе удалоÑÑŒ открыть файл</b><p>Ðе удалоÑÑŒ открыть файл ÑÐ»Ð¾Ñ "%1" Can't export non-note layers to MIDI Ðевозможно ÑкÑпортировать ненотные Ñлои в MIDI Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Export the whole pane Export the visible area only Which region of the current pane do you want to export as a scalable SVG image? Failed to save SVG file Failed to save SVG file %1 Failed to query transform attributes <b>Failed to query transform attributes</b><p>Plugin or server error: %1</p> Multiplexed audio Transform failed <b>Failed to run transform</b><p>Plugin or server error: %1</p> Subdivide instants Number of subdivisions: Winnow instants Remove all instants apart from multiples of: <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment:<p>%1 Adjust the master playback level and pan With Qt v%1 &copy; The Qt Company <br>With Rubber Band Library v%1 &copy; Particular Programs Ltd <br>With Rubber Band Library &copy; Particular Programs Ltd <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam and QMUL <br>С поддержкой плагинов Vamp (API v%1, host SDK v%2) &copy; Chris Cannam и QMUL <br>With Piper Vamp protocol bridge &copy; QMUL <br>With Dataquay Qt/RDF library &copy; Particular Programs Ltd <br>With Cap'n Proto serialisation &copy; Sandstorm Development Group Russian UI translation contributed by Alexandre Prokoudine. Czech UI translation contributed by Pavel Fric. <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %2 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> <h3>ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹</h3><p>Ð’Ñ‹ иÑпользуетее Sonic Visualiser верÑии %1, но уже доÑтупна верÑÐ¸Ñ %2.</p><p>ЗаглÑните на <a href="http://sonicvisualiser.org/">Ñайт Sonic Visualiser</a>, чтобы узнать подробноÑти.</p> {3>?} {3>?} {1 ?} {2 ?} <b>File open failed</b><p>Session file "%1" could not be opened <b>Ðе удалоÑÑŒ открыть файл</b><p>Ðе удалоÑÑŒ открыть файл ÑеанÑа "%1" <b>File open failed</b><p>File "%1" could not be opened <b>Ðе удалоÑÑŒ открыть файл</b><p>Ðе удалоÑÑŒ открыть файл "%1" <b>Open failed</b><p>URL "%1" could not be opened <b>Ðе удалоÑÑŒ открыть ÑÑылку</b><p>Ðе удалоÑÑŒ открыть URL "%1" <b>Open failed</b><p>File or URL "%1" could not be opened <b>Ðе удалоÑÑŒ открыть ÑÑылку</b><p>Ðе удалоÑÑŒ открыть файл или URL "%1" Enter template name Введите название шаблона Please enter a name for the saved template: Set as default template for future audio files Template file exists <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? Failed to open dropped URL Ðе удалоÑÑŒ открыть URL, перемещенный мышью в окно программы <b>Open failed</b><p>Dropped URL "%1" could not be opened <b>Ðе удалоÑÑŒ открыть ÑÑылку</b><p>Ðе удалоÑÑŒ открыть файл URL "%1", перетащенный в окно программы мышью <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? <b>Ð¡ÐµÐ°Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»ÑÑ</b><p>Ðктивный ÑÐµÐ°Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»ÑÑ<br>Ð’Ñ‹ хотите Ñохранить его? <b>Save failed</b><p>Session file "%1" could not be saved. <b>Ðе удалоÑÑŒ Ñохранить файл</b><p>Ðе удалоÑÑŒ Ñохранить файл ÑеÑÑии "%1" %1: %1 %1: %1 {1:?} Playback speed: Normal СкороÑть воÑпроизведениÑ: Ð¾Ð±Ñ‹Ñ‡Ð½Ð°Ñ Playback speed: %1%2% СкороÑть воÑпроизведениÑ: %1%2% <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. Reset Counters Обнуление Ñчетчиков Warning Предупреждение <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 Failed to calculate alignment Ðе удалоÑÑŒ раÑÑчитать выравнивание <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>С библиотекой JACK &copy; Paul Davis и Jack O'Quin <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>С библиотекой PortAudio &copy; Ross Bencina и Phil Burk <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>С библиотекой PulseAudio &copy; Lennart Poettering и Pierre Ossman <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. <br>With Rubber Band &copy; Chris Cannam <br>С Rubber Band &copy; Chris Cannam Find a Transform... Ðайти Ñффект транÑформации... Search for a transform from the installed plugins, by name or description Ðайти Ñффект транÑформации Ñреди уÑтановленных плагинов по названию или опиÑанию Ctrl+M Ctrl+M <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p>Sonic Visualiser — программа Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð·Ð°Ð¿Ð¸Ñей Ñ Ñ†ÐµÐ»ÑŒÑŽ ÑемантичеÑкого анализа и аннотации музыки.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p><small>%1 : %2 configuration</small></p> <p><small>%1 : ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ %2</small></p> With Qt v%1 &copy; Nokia Corporation С иÑпользованием Qt v%1 &copy; Nokia Corporation <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>С библиотекой JACK v%1 &copy; Paul Davis и Jack O'Quin <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>С библиотекой PulseAudio v%1 &copy; Lennart Poettering и Pierre Ossman <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>С декодером mp3 MAD v%1 &copy; Underbit Technologies Inc <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>С libsamplerate v%1 &copy; Erik de Castro Lopo <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>С libsndfile v%1 &copy; Erik de Castro Lopo <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>С FFTW3 v%1 &copy; Matteo Frigo и MIT <br>With Rubber Band v%1 &copy; Chris Cannam <br>С Rubber Band v%1 &copy; Chris Cannam <br>With Raptor RDF parser v%1 &copy; Dave Beckett and the University of Bristol <br>С парÑером RDF Raptor v%1 &copy; Dave Beckett и БриÑтольÑкий универÑитет <br>With Raptor RDF parser &copy; Dave Beckett and the University of Bristol <br>С парÑером RDF Raptor &copy; Dave Beckett и БриÑтольÑкий универÑитет <br>With Rasqal RDF query engine v%1 &copy; Dave Beckett and the University of Bristol <br>С движком запроÑов RDF Rasqal v%1 &copy; Dave Beckett и БриÑтольÑкий универÑитет <br>With Rasqal RDF query engine &copy; Dave Beckett and the University of Bristol <br>С движком запроÑов RDF Rasqal &copy; Dave Beckett и БриÑтольÑкий универÑитет <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>C хранилищем данных RDF Redland v%1 &copy; Dave Beckett и БриÑтольÑкий универÑитет <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>C хранилищем данных RDF Redland &copy; Dave Beckett и БриÑтольÑкий универÑитет <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>С библиотекой OSC liblo v%1 &copy; Steve Harris </small><p><small>The OSC URL for this instance is: "%1" </small><p><small>ÐÐ´Ñ€ÐµÑ OSC Ð´Ð»Ñ Ñтой ÑеÑÑии: "%1" With С Using ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Peek Left ГлÑнуть влево Alt+Left Alt+влево Scroll the current pane to the left without moving the playback cursor or other panes Peek Right ГлÑнуть вправо Alt+Right Alt+вправо Scroll the current pane to the right without moving the playback cursor or other panes Show Acti&vity Log Показать &журнал дейÑтвий Open a window listing interactions and other events Открыть окно Ñо ÑпиÑком вÑех дейÑтвий в ÑеанÑе Export multiple audio files ЭкÑпортировать неÑколько звуковых файлов Export audio to "%1" ЭкÑпорт звука в "%1" <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. Export layer to "%1" ЭкÑпорт ÑÐ»Ð¾Ñ Ð² "%1" Export image to "%1" ЭкÑпорт Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² "%1" Close the current session and create a new one Add this data to the current session Добавить Ñти данные в активную ÑеÑÑию Select target for import Выбрать цель Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? <b>Выберите цель импорта</b><p>Этот документ RDF ÑÑылаетÑÑ Ð½Ð° один или более звуковых файлов.<br>У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть один загруженный звуковой файл.<br>Что вы хотите Ñделать Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ данными? Save session as "%1" Сохранение ÑеÑÑию как "%1" Add Point Добавить точку http://www.sonicvisualiser.org/doc/reference/%1/en/ http://www.sonicvisualiser.org/doc/reference/%1/en/ What's New Что нового в программе <h3>What's New in %1</h3> <h3>Что нового в %1</h3> <b>Note:</b> A newer version of Sonic Visualiser is available.<br>(Version %1 is available; you are using version %2) %1 : %2 configuration, %3-bit build <br>With RtMidi &copy; Gary P. Scavone <br>С RtMidi &copy; Gary P. Scavone Ctrl+Shift+S Ctrl+Shift+S Insert Item at Selection Ð’Ñтавить объект в выделение Ctrl+Shift+Enter Ctrl+Shift+Enter Insert a new note or region item corresponding to the current selection Rewind to Similar Point Ðазад к первой Ñхожей точке Shift+PgUp Shift+PgUp Rewind to the previous similarly valued time instant Fast Forward to Similar Point Вперед к первой Ñхожей точке Shift+PgDown Shift+PgDown Fast-forward to the next similarly valued time instant 1. %2 1. %2 %1. %2 %1. %2 Select audio file to export Укажите ÑкÑпортируемый звуковой файл Which audio file do you want to export from? Какой звуковой файл вы хотите ÑкÑпортировать? About %1 Newer version available ДоÑтупна более Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %3 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> <h3>ДоÑтупна более Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ</h3><p>Ð’Ñ‹ иÑпользуетее Sonic Visualiser верÑии %1, но уже доÑтупна верÑÐ¸Ñ %3.</p><p>ЗаглÑните на <a href="http://sonicvisualiser.org/">Ñайт Sonic Visualiser</a> за подробноÑÑ‚Ñми.</p> MainWindowBase %1 (modified) %1 (изменен) (modified) (изменен) Cut Вырезать Paste Ð’Ñтавить Add Point Добавить точку Add Point at %1 s Добавить точку по отметке %1 Ñ Opening file or URL... ОткрываетÑÑ Ñ„Ð°Ð¹Ð» или URL... Replace the existing main waveform Заменить ÑущеÑтвующую оÑновную волновую форму Load this file into a new waveform pane Загрузить Ñтот файл в новое окно волновой формы Not enough disc space ÐедоÑтаточно диÑкового проÑтранÑтва <b>Not enough disc space</b><p>There doesn't appear to be enough spare disc space to accommodate any necessary temporary files.</p><p>Please clear some space and try again.</p> Not enough memory <b>Not enough memory</b><p>There doesn't appear to be enough memory to accommodate any necessary temporary data.</p> Select target for import Выбрать цель Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? %1: %2 %1: %2 %1: %2 [%3] %1: %2 [%3] Import "%1" Импортировать "%1" Opening playlist... ОткрываетÑÑ ÑпиÑок воÑпроизведениÑ... Opening session... ОткрываетÑÑ ÑеÑÑиÑ… SV XML file read error: %1 Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ XML-файла SV: %1 Open session template "%1" Открыть шаблон ÑеÑÑии "%1" <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> <b>No audio available</b><p>Could not open an audio device.</p> <b>No audio available</b><p>Could not open audio device: %1</p> <p>Automatic audio device detection failed. Audio playback and recording will not be available during this session.</p> <p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1").</p> <b>No audio available</b><p>Failed to open your preferred audio driver ("%1"): %2.</p> <p>Audio playback and recording will not be available during this session.</p> <p>Audio playback will not be available during this session.</p> Couldn't open audio device Ðе удалоÑÑŒ открыть звуковое уÑтройÑтво Failed to write file Ðе удалоÑÑŒ запиÑать файл <b>Save failed</b><p>Failed to write to file "%1": %2 <b>Ðе удалоÑÑŒ Ñохранить</b><p>Ðе удалоÑÑŒ запиÑать файл "%1": %2 No record device available Ðет доÑтупных уÑтройÑтв запиÑи <b>No record device available</b><p>Failed to find or open an audio device for recording. Only playback will be available.</p> Recording failed Ðе удалоÑÑŒ запиÑать <b>Recording failed</b><p>Failed to switch to record mode (some internal problem?)</p> Import Recorded Audio Add Pane Добавить окно Remove Pane Удалить окно Delete Pane Удалить окно Playing: %1 of %2 (%3 remaining) ВоÑпроизводитÑÑ: %1 из %2 (оÑталоÑÑŒ %3) Recording: %1 ЗапиÑÑŒ: %1 <b>No audio available</b><p>Could not open an audio device for playback.<p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>Беззвучный режим</b><p>Ðе удалоÑÑŒ открыть звуковое уÑтройÑтво Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ.<p>Ðе удалоÑÑŒ автоматичеÑки определить звуковое уÑтройÑтво. Ðа Ñтот раз придетÑÑ Ð¾Ð±Ð¾Ð¹Ñ‚Ð¸ÑÑŒ без воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð²ÑƒÐºÐ°.</p> Close the current session and start a new one Replace the main audio file in this session Заменить оÑновной аудиофайл в Ñтйо ÑеÑÑии Add the audio file to this session <b>No audio available</b><p>Failed to open your preferred audio device ("%1").<p>Audio playback will not be available during this session.</p> <b>Беззвучный режим</b><p>Ðе удалоÑÑŒ открыть предпочитаемое звуковое уÑтройÑтво («%1»).<p>Ðа Ñтот раз придетÑÑ Ð¾Ð±Ð¾Ð¹Ñ‚Ð¸ÑÑŒ без воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð²ÑƒÐºÐ°.</p> Importing from RDF... ВыполнÑетÑÑ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚ из RDF... <b>Select a target for import</b><p>You already have an audio waveform loaded.<br>What would you like to do with the new audio file? <b>Выберите цель импорта</b><p>У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть один загруженный звуковой файл.<br>Что вы хотите Ñделать Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ звуковыми данными? Import audio file "%1" Импорт звукового файла "%1" Import layer XML file "%1" Импорт XML-файла ÑÐ»Ð¾Ñ "%1" Import MIDI file "%1" Импорт файла MIDI "%1" Import session file "%1" Импорт файла ÑеÑÑии "%1" Failed to import RDF Ðе удалоÑÑŒ импортировать RDF <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Ðе удалоÑÑŒ импортировать RDF</b><p>Ðе удалоÑÑŒ импортировать данные из документа RDF "%1": %2</p> Import RDF document "%1" Импорт документа RDF "%1" Add Item at %1 s Добавить объект в позицию %1Ñ MainWindowBase::AddPaneCommand Add Pane Добавить окно MainWindowBase::RemovePaneCommand Remove Pane Удалить окно ModelDataTableDialog Data Editor Редактор данных Playback Toolbar Панель воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Play Mode Toolbar Панель режима воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Track Playback Переключить воÑпроизведение Toggle tracking of playback position Переключить отÑлеживание позиции воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Edit Toolbar Панель правки Insert New Item Ð’Ñтавить новый объект Insert Ð’Ñтавить Insert a new item Ð’Ñтавить новый объект Delete Selected Items Удалить выбранные объекты Delete Удалить Delete the selected item or items Удалить выбранные объекты Data in Layer Данные в Ñлое Find: ИÑкать: ModelMetadataModel Type Тип Name Ðазвание Maker Создатель Source ИÑточник ModelTransformerFactory %1 <%2> %1 <%2> %1: %2 %1: %2 NetworkPermissionTester Welcome to Sonic Visualiser ПриветÑтвуем в Sonic Visualiser <h2>Welcome to Sonic Visualiser!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.</p><p>Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.</p><p><hr></p><p><b>Before we go on...</b></p><p>Sonic Visualiser would like permission to use the network.</p> <h2>ПриветÑтвуем в Sonic Visualiser!</h2><p><img src=":icons/qm-logo-smaller.png" style="float:right">Это программа Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ñ‹Ñ… данных Ñ Ñ†ÐµÐ»ÑŒÑŽ ÑемантичеÑкого анализа и аннотации музыки.</p><p>Программа разработана в Центре фировой музыки (Centre for Digital Music) универÑитета Королевы МÑри (Queen Mary University) в Лондоне. Sonic Visualiser — приложение Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом, которое раÑпроÑтранÑетÑÑ Ð½Ð° уÑловиÑÑ… GNU General Public License.</p><p><hr></p><p><b>Перед началом работы…</b></p><p>Sonic Visualiser необходимо получить ваше разрешение на доÑтуп в Сеть.</p> <p>This is to:</p><ul><li> Find information about available and installed plugins;</li><li> Support the use of Open Sound Control; and</li><li> Tell you when updates are available.</li></ul> <p>Ð”Ð»Ñ Ñ‡ÐµÐ³Ð¾ Ñто нужно:</p><ul><li> Ðаходить информацию о доÑтупных и уÑтановленных плагинах;</li><li> ИÑпользовать протокол Open Sound Control;</li><li> Сообщать вам о поÑвлении новых верÑий программы.</li></ul> <p>This is to:</p><ul><li> Find information about available and installed plugins; and</li><li> Tell you when updates are available.</li></ul> <p>Ð”Ð»Ñ Ñ‡ÐµÐ³Ð¾ Ñто нужно:</p><ul><li> Ðаходить информацию о доÑтупных и уÑтановленных плагинах;</li><li> Сообщать вам о поÑвлении новых верÑий программы.</li></ul> <p><b>No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else.</b> We will however make aggregate counts of distinct requests for usage reporting.</p><p>We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.<br></p> <p><b>Программа не будет передавать перÑональные данные, Ñледить за вами или делитьÑÑ Ñ ÐºÐµÐ¼-то вашей личной информацией.</b> Однако Sonic Visualiser будет Ñобирать базовую ÑтатиÑтику о Ñвоем иÑпользовании.</p><p>Мы рекомендуем разрешить программе доÑтуп в Сеть, поÑкольку Ñто позволит нам Ñделать Sonic Visualiser лучше Ð´Ð»Ñ Ð²Ð°Ñ, а кроме того, поможет Ñ Ñ„Ð¸Ð½Ð°Ð½Ñированием разработки. ЕÑли вы против, проÑто Ñнимите флажок ниже.<br></p> Allow this Разрешить доÑтуп в Сеть NoteLayer New Point ÐÐ¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Vertical Scale Верт. маÑштаб Auto-Align Ðвтовыравнивание In progress Ð’ процеÑÑе No local points Ðет локальных точек Time: %1 Pitch: %2 Duration: %3 No label ВремÑ: %1 Ð’Ñ‹Ñота тона: %2 ДлительноÑть: %3 Без метки Time: %1 Pitch: %2 Duration: %3 Label: %4 ВремÑ: %1 Ð’Ñ‹Ñота тона: %2 ДлительноÑть: %3 Метка: %4 Draw Point ÐариÑовать точку Drag Point Перетащить точку Edit Point Изменить точку Relocate Point ПеремеÑтить точку Change Point Value Изменить значение точки Drag Selection Перетащить выделение Resize Selection Изменить размер Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Delete Selected Points Удалить выбранные точки Paste Ð’Ñтавить Scale Units Единицы шкалы Scale МаÑштаб Linear Линейный Log ЛогарифмичеÑкий MIDI Notes Ðоты MIDI %1 %2 %1 %2 Erase Point Стереть точку Re-align pasted items? Заново выровнÑть вÑтавленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Record Note %1 (%2, %3 Hz) %1 (%2, %3 Гц) %1 Hz (%2, %3) %1Гц (%2, %3) NoteModel Note Ðота Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Pitch Ð’Ñ‹Ñота тона Duration ДлительноÑть Level Уровень Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные OggVorbisFileReader Decoding %1... ДекодируетÑÑ %1... Overview Overview Обзор Click and drag to navigate; double-click to jump Щёлкните и потащите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну; щёлкните дважды Ð´Ð»Ñ Ñкачка Pane Some lengthy prefix: Ðекий длинный префикÑ: (R) (R) (X) (X) %1 / %2Hz%3 %1 / %2 Гц%3 Drag Selection Перетащить выделение Resize Selection Изменить выделение Horizontal Zoom Горизонтальное маÑштабирование Vertical Zoom Вертикальное маÑштабирование Enter new range Введите новый диапазон New vertical display range, from %1 to %2 %4: Ðовый диапазон Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ вертикали, от %1 до %2 %4: Click and drag to navigate Щёлкните и потащите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Щёлкните и потащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти; + Shift — Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ðº объектам; + Ctrl — Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких объектов, + ÑреднÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° мыши — Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Щёлкните и потащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти; + Shift — Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ðº объектам; + Cmd — Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких объектов, + ÑреднÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° мыши — Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Щёлкните и потащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°; + Ctrl — Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких объектов, + ÑреднÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° мыши — Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Щёлкните и потащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°; + Cmd — Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких объектов, + ÑреднÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° мыши — Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click and drag to move the selection boundary Щёлкните и потащите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ† Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Щёлкните и потащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти; + Shift — Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ðº объектам; + ÑреднÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° мыши — Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click and drag to select a range; middle-click and drag to navigate Щёлкните и потащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти; + ÑреднÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° мыши — Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ окну Click to add a new item in the active layer Щёлкните Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ объекта на активный Ñлой Click and drag to move all items in the selected range Щёлкните и потащите вÑе объекты в выделенной облаÑти Click and drag to adjust the visible range of the vertical scale Щёлкните и потащите Ð´Ð»Ñ Ñмены видимого диапазона маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ вертикали Click and drag to adjust the vertical zoom level Щёлкните и потащите Ð´Ð»Ñ Ñмены ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ вертикали Click and drag to adjust the horizontal zoom level Щёлкните и потащите Ð´Ð»Ñ Ñмены ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ горизонтали Reset horizontal and vertical zoom levels to their defaults СброÑить уровни маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ горизонтали и вертикали до иÑходных значений Reference Unaligned Aligning: %1% Aligned %1 - %2 %1 - %2 +%1 Zoom МаÑштабирование Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Zoom In Приблизить Wheel Up КолеÑом вверх Zoom Out Отдалить Wheel Down КолеÑом вниз General Pane Mouse Actions ИÑпользование мыши в окнах Wheel КолеÑо Zoom in or out in time axis Приближение и отдаление по временной шкале Ctrl+Wheel Ctrl+прокрутка Scroll Прокручивать окно ÑеÑÑии Scroll rapidly left or right in time axis БыÑтро перемещатьÑÑ Ð²Ð¿Ñ€Ð°Ð²Ð¾ и влево по временной шкале Zoom Vertically Вертикальный маÑштаб Shift+Wheel Shift+прокрутка Zoom in or out in the vertical axis МаÑштабировать отображение по вертикальной оÑи Scroll Vertically Прокрутка по вертикали Alt+Wheel Alt+КолеÑо Scroll up or down in the vertical axis Прокручивать отображение по вертикальной оÑи Navigate Перемещение Middle Click middle button and drag to navigate with any tool Relocate Перемещение Ñкачком Double-Click Middle Двойной щелчок Ñредней клавишей Double-click middle button to relocate with any tool ПереÑкочить вправо или влево в завиÑимоÑти от Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐºÑƒÑ€Ñора Menu Меню Right ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° Show pane context menu Показать контекÑтное меню окна Navigate Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом навигации Left Ð›ÐµÐ²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° Zoom to Area МаÑштабировать в выделение Shift+Left Shift+Left Double-Click Left Двойной щелчок левой клавишей Edit Изменить Select Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Select Выделить Multi Select МножеÑтвенное выделение Ctrl+Left Ctrl+Влево Fine Select Выделить точно Edit Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Move ПеремеÑтить Draw Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Draw РиÑовать Click left button and drag to create new item Щелкните левой клавишей мыши и перетащите курÑор Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ объекта Measure Tool Mouse Actions ИÑпользование мыши Ñ Ð¸Ð½Ñтрументом Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Measure Area Измерить облаÑть Measure Item Измерить объект Click to erase an item from the active layer Reset zoom to default Click and drag an item in the active layer to move it; hold Shift to override initial resistance PlayParameterRepository Adjust Playback Parameters ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Change Playback Mute State Смена ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð³Ð»ÑƒÑˆÐµÐ½Ð½Ð¾Ñти воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Change Playback Gain Смена громкоÑти воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Change Playback Pan Смена панорамы при воÑпроизведении Change Playback Sample Change Playback Plugin Смена раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Configure Playback Plugin Смена параметров раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ PlayParameterRepository::EditCommand Adjust Playback Parameters ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Change Playback Mute State Смена ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð³Ð»ÑƒÑˆÐµÐ½Ð½Ð¾Ñти воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Change Playback Gain Смена громкоÑти воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Change Playback Pan Смена панорамы при воÑпроизведении Change Playback Plugin Смена раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Configure Playback Plugin Смена параметров раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ PluginParameterBox This plugin has no adjustable parameters. У Ñтого плагина нет изменÑемых параметров. Program Программа PluginParameterDialog Name: Ðазвание: Maker: Ðвтор: Copyright: ÐвторÑкие права: Version: ВерÑиÑ: Plugin Parameters Параметры плагина Channel mismatch ÐеÑовпадение каналов This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. Этому плагину нужно Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ %1 входных каналов, но лишь %2 %3 доÑтупны. ВероÑтно, плагин не будет корректно работать. are ÑвлÑÑŽÑ‚ÑÑ is ÑвлÑетÑÑ Channels Каналы This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. Этот плагин принимает не более %1 каналов на входе, но доÑтупно %2. Только первые %3 будут иÑпользованы. This plugin only has a single channel input, but the source has %1 channels. Этот плагин может обрабатывать только один канал, но у иÑточника %1 каналов. Use mean of source channels ИÑпользовать Ñреднее значение каналов иÑточника Use channel %1 only ИÑпользовать только канал %1 Output: Выход: Processing Обработка Window size: Размер оконной функции: Audio frames per block: Выборок звука на блок: Window increment: Шаг: Window shape: Форма: Advanced >> Больше >> Advanced << Меньше << Input Material Restrict to selection extents Только выделение Preferences Frequency of concert A ЧаÑтота уÑловной ноты Ð›Ñ (A) Property box layout Внешний вид панели ÑвойÑтв Spectral analysis window shape Форма оконной функции при Ñпектральном анализе Normalise audio signal when reading from audio file Ðормировать звуковой Ñигнал при чтении аудиофайлов Load mp3 files in gapless mode Загружать файлы MP3 без интервалов Single fixed sample rate to resample all files to Time display precision ТочноÑть показываемого времени Use hours:minutes:seconds format ИÑпользовать формат чаÑÑ‹:минуты:Ñекунды Label middle C as Show boxes for all panes Показывать панели Ð´Ð»Ñ Ð²Ñех окон Show box for current pane only Показывать панель только Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ окна Rectangular ПрÑÐ¼Ð¾ÑƒÐ³Ð¾Ð»ÑŒÐ½Ð°Ñ Triangular Ð¢Ñ€ÐµÑƒÐ³Ð¾Ð»ÑŒÐ½Ð°Ñ Hamming Хамминга Blackman БлÑкмена Gaussian ГауÑÑова Parzen Парзена Nuttall Ðутталла Blackman-Harris БлÑкмена-ХарриÑа C0 - middle of octave scale C3 - common MIDI sequencer convention C4 - ASA American standard C5 - used in Cakewalk and others Preferences Параметры Playback resampler type Тип реÑÑÐ¼Ð¿Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ воÑпроизведении Fastest Самый быÑтрый Standard Обычный Highest quality ÐаивыÑшего качеÑтва Spectrogram y-axis interpolation: ИнтерполÑÑ†Ð¸Ñ Ð¾Ñи Y Ñпектрограммы: Omit temporaries from Recent Files menu ПропуÑкать временные файлы в меню недавно открывавшихÑÑ Resample mismatching files on import РеÑÑмплировать файлы при импорте Location for cache file directory РаÑположение каталога Ñ ÐºÑшем Background colour preference Предпочитаемый цвет фона Font size for text overlays Кегль шрифта Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых перекрытий Show splash screen on startup Показывать заÑтавку при Ñтарте программы Hann Ð¥Ñнна Follow desktop theme ИÑпользовать параметры Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Dark background Темный фон Light background Светлый фон Spectrogram x-axis interpolation: ИнтерполÑÑ†Ð¸Ñ Ñпектрограммы по оÑи X: None Ðет Linear interpolation Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ 4 x Oversampling 4 × переÑÑÐ¼Ð¿Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ 4 x Oversampling with interpolation 4 × переÑÑÐ¼Ð¿Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñцией Time display format Формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Standard (to millisecond) ÐžÐ±Ñ‹Ñ‡Ð½Ð°Ñ (до мÑ) High resolution (to microsecond) Ð’Ñ‹Ñокое разрешение (до мкÑ) 24 FPS 24 кадра/Ñ 25 FPS 25 кадров/Ñ 30 FPS 30 кадров/Ñ 50 FPS 50 кадров/Ñ 60 FPS 60 кадров/Ñ PreferencesDialog Apply Применить %1: %1: Default spectrogram colour: Цвет Ñпектрограммы по умолчанию: Default melodic spectrogram colour: Цвет Ñпектрограммы мелодичеÑкого диапазона по умолчанию: Default colour 3D plot colour: Цвет трёхмерного графика по умолчанию: &Other &Прочее OK ОК Cancel Отменить Sonic Visualiser: Application Preferences Параметры Sonic Visualiser Green Зелёный (auto) (авто) <home directory> <домашний каталог> Follow system locale ИÑпользовать ÑиÑтемные наÑтройки Russian РуÑÑкий British English ÐнглийÑкий (ВеликобританиÑ) American English ÐнглийÑкий (СШÐ) Czech ЧешÑкий Overview waveform colour: Цвет миниатюры волнового Ñигнала: Run Vamp plugins in separate process: ЗапуÑкать плагины VAMP отдельным процеÑÑом: Default session template when loading audio files: Шаблон ÑеÑÑии по умолчанию при загрузке аудиофайлов: (Use "%1" in the File menu to add to these.) ИÑпользуйте команду «%1» в меню «Файл», чтобы Ñоздать новые шаблоны. Export Session as Template... ЭкÑпортировать ÑеÑÑию как шаблон… Audio service: Звуковой движок: Audio playback device: УÑтройÑтво воÑпроизведениÑ: Audio record device: УÑтройÑтво запиÑи: A&udio I/O &Звуковой вход/выход User interface language Язык интерфейÑа Allow network usage Разрешить выход в Сеть &General О&бщие Draw layers at Retina resolution: РиÑовать Ñлои в разрешении Retina: Standard Waveform ÐžÐ±Ñ‹Ñ‡Ð½Ð°Ñ Ð²Ð¾Ð»Ð½Ð¾Ð²Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° Ñигнала Session &Template &Шаблон ÑеÑÑий Select a directory to create cache subdirectory in Выберите каталог Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÑша Preferences Параметры <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> <b>ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк программы</b><p>Ðекоторые изменившиеÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ не могут быть учтены без перезапуÑка Sonic Visualiser.</p><p>Завершите работу Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¾Ð¹ и повторно запуÑтите ее, чтобы внеÑенные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ñ‹Ð¼ÐµÐ»Ð¸ Ñффект.</p> Preferences Changed Параметры изменены Some preferences have been changed but not applied. Apply them before closing? Ðекоторые параметры работы программы были изменены, но не применены. Применить их перед закрытием? Playback audio device: УÑтройÑтво воÑпроизведениÑ: &Appearance Об&лик Anal&ysis &Ðнализ ProgressDialog Cancel Отменить PropertyBox Show Показать Play ВоÑпроизвеÑти Playback Pan / Balance Панорама/Ð±Ð°Ð»Ð°Ð½Ñ Ð¿Ñ€Ð¸ воÑпроизведении Playback Gain УÑиление воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ dB Дб Click to toggle playback Set playback clip: Adjust playback level and pan of %1 Change sound used for playback (currently "%1") (current value: %1%2) (текущее значение: %1%2) (current value: %1) (текущее значение: %1) Toggle Visibility of %1 Переключить видимоÑть %1 Toggle Playback of %1 Переключить воÑпроизведение %1 Toggle %1 property of %2 Переключить %1 ÑвойÑтво %2 Adjust %1 property of %2%3 Скорректировать %1 ÑвойÑтво %2%3 Add New Colour... Добавить новый цвет... Name New Colour Дайте цвету название Enter a name for the new colour: Введите название нового цвета: Prefer black background for this colour Предпочитать черный фон Ð´Ð»Ñ Ñтого цвета PropertyContainer yes да on вкл true правда no нет off выкл false ложь Set %1 Property УÑтановить ÑвойÑтво %1 PropertyContainer::SetPropertyCommand Set %1 Property УÑтановить ÑвойÑтво %1 PropertyStack Click to change the current active layer Щёлкните Ð´Ð»Ñ Ñмены активного ÑÐ»Ð¾Ñ Change Layer Visibility Переключить видимоÑть ÑÐ»Ð¾Ñ QApplication Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser — программа Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ñ‹Ñ… данных Ñ Ñ†ÐµÐ»ÑŒÑŽ ÑемантичеÑкого анализа и аннотации музыки. ИÑпользование: %1 [--no-audio] [--no-osc] [<файл> ...] --no-audio: не пытатьÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ уÑтройÑтво звукового вывода --no-osc: не предоÑтавлÑть порт Open Sound Control Ð´Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ <файл>: можно указать один и более файлов Sonic Visualiser (.sv) и звуковых файлов. Sonic Visualiser Sonic Visualiser QFile File "%1" does not exist Файл "%1" не ÑущеÑтвует Failed to open file "%1" Ðе удалоÑÑŒ открыть файл "%1" File or URL "%1" could not be retrieved Файл или URL "%1" не мог быть получен QMessageBox Failed to open file Ðе удалоÑÑŒ открыть файл File or URL "%1" could not be opened Файл или URL "%1" не мог быть открыт <b>Audio required</b><p>Please load at least one audio file before importing annotation data <b>Ðужны звуковые данные</b><p>Загрузите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один звуковой файл перед импортом аннотаций QObject External plugin host executable does not appear to be installed Could not start external plugin host External plugin host exited unexpectedly while listing plugins External plugin host invocation failed: %1 <b>Failed to scan for plugins</b><p>Failed to scan for plugins at startup. Possibly the plugin checker program was not correctly installed alongside %1?</p> <b>Did not scan for plugins</b><p>Apparently no scan for plugins was attempted (internal error?)</p> <b>Failed to load plugins</b><p>Failed to load one or more plugin libraries:</p> <b>Ðе удалоÑÑŒ загрузить плагины</b><p>Ðе удалоÑÑŒ загрузить одну или больше библиотек плагинов:</p> <p>These plugins may be incompatible with the system, and will be ignored during this run of %1.</p> <p>Эти плагины могут быть неÑовмеÑтимы Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¾Ð¹ и будут проигнорированы при работе в %1.</p> <unknown> <неизвеÑтно> Green Зелёный White on Black Белое на чёрном Black on White Чёрное на белом Cherry Ð’Ð¸ÑˆÐ½Ñ Wasp Ice Лёд Sunset Закат Fruit Salad Фруктовый Ñалат Banded Ð’ полоÑку Highlight ПодÑветка Printer Принтер High Gain QuickTimeFileReader Decoding %1... ДекодируетÑÑ %1... RDFImporter Importing audio referenced in RDF... Importing dense signal data from RDF... Importing event data from RDF... RangeInputDialog to до RangeSummarisableTimeValueModel Range-Summarisable Time-Value ReadOnlyWaveFileModel Wave File Звуковой файл RegionLayer Vertical Scale Верт. маÑштаб Scale Units Единицы шкалы Plot Type Тип графика Scale МаÑштаб Bars Такты Segmentation Ð¡ÐµÐ³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Auto-Align Ðвтовыравнивание Equal Spaced Равные промежутки Linear Линейный Log ЛогарифмичеÑкий In progress Ð’ процеÑÑе No local points Ðет локальных точек %1 %2 %1 %2 Time: %1 Value: %2 Duration: %3 No label ВремÑ: %1 Значение: %2 ДлительноÑть: %3 Без метки Time: %1 Value: %2 Duration: %3 Label: %4 ВремÑ: %1 Значение: %2 ДлительноÑть: %3 Метка: %4 Change Point Value Изменить значение точки Drag Selection Перетащить выделение Resize Selection Изменить размер Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Delete Selected Points Удалить выбранные точки Re-align pasted items? Заново выровнÑть вÑтавленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Ð’Ñтавить New Region Draw Region Erase Region Drag Region Edit Region Relocate Region RegionModel Region ОблаÑть Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Value Значение Duration ДлительноÑть Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные RemoveLayerCommand Delete %1 Layer Удалить Ñлой %1 ResamplingWavFileReader Resampling %1... РеÑÑмплирование %1... SVFileReader (derived model in SV-XML) (модель извлечена в SV-XML) Opening file or URL... ОткрываетÑÑ Ñ„Ð°Ð¹Ð» или URL... SingleColourLayer Colour Цвет <unknown> <неизвеÑтно> SliceLayer %1 - %2 %1 - %2 First Mean УÑреднённо Peak Пик 0dB 0 Дб -Inf -Inf x10 x10 Plot Type Тип графика Scale МаÑштаб Normalize Ðормализовать Gain УÑиление Sampling Mode Режим ÑÑÐ¼Ð¿Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Linear Линейный Meter Счетчик dB Дб Any Любые Lines Линии Steps Шаги Blocks Блоки Colours Цвета Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 ВремÑ: %1 - %2 Диапазон: %3 ÑÑмплов (%4) Бин: %5 %6 значение: %7 Time: %1 - %2 Range: %3 samples (%4) ВремÑ: %1 - %2 Диапазон: %3 ÑÑмплов (%4) Threshold Порог Bin Scale Bins Бины Log Логарифм. Absolute ÐбÑолютный Rev Log SparseModel Add Point Добавить точку Delete Point Удалить точку Re-Label Point Переразметить точку Sparse Edit Data Изменить данные Insert Data Point Delete Data Point SparseModel::AddPointCommand Add Point Добавить точку SparseModel::DeletePointCommand Delete Point Удалить точку SparseModel::RelabelCommand Re-Label Point Переразметить точку SparseOneDimensionalModel Sparse 1-D Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные SparseTimeValueModel Sparse Time-Value Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Value Значение Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные SparseValueModel Sparse Value SpectrogramLayer Colour Цвет Colour Scale Window Size Размер окна Normalize Columns Ðормализовать Ñтолбцы Bin Display Threshold Порог Gain УÑиление Colour Rotation Вращение цвета Min Frequency Мин. чаÑтота Max Frequency МакÑ. чаÑтота Frequency Scale Window Окно Scale МаÑштаб Linear Линейный Meter Счетчик dB Дб Phase Фаза Normalization Col View Hybrid No min Без минимума 10 Hz 10 Гц 20 Hz 20 Гц 40 Hz 40 Гц 100 Hz 100 Гц 250 Hz 250 Гц 500 Hz 500 Гц 1 KHz 1 КГц 4 KHz 4 КГц 10 KHz 10 КГц 1.5 KHz 1,5 КГц 2 KHz 2 КГц 6 KHz 6 КГц 8 KHz 8 КГц 12 KHz 12 КГц 16 KHz 16 КГц No max Без макÑимума Log Логарифм. All Bins Ð’Ñе бины Peak Bins Пиковые бины Frequencies ЧаÑтоты <unknown> <неизвеÑтно> Peak Frequency: %1 - %2 Hz ÐŸÐ¸ÐºÐ¾Ð²Ð°Ñ Ñ‡Ð°Ñтота: %1 - %2 Гц Peak Frequency: %1 Hz ÐŸÐ¸ÐºÐ¾Ð²Ð°Ñ Ñ‡Ð°Ñтота: %1 Гц Peak Pitch: %3 - %4 ÐŸÐ¸ÐºÐ¾Ð²Ð°Ñ Ð²Ñ‹Ñота тона: %3 - %4 Peak Pitch: %2 ÐŸÐ¸ÐºÐ¾Ð²Ð°Ñ Ð²Ñ‹Ñота тона: %2 Time: %1 - %2 ВремÑ: %1 - %2 Time: %1 ВремÑ: %1 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1ЧаÑтота бинов: %2 - %3 Гц %4Ð’Ñ‹Ñота тона бинов: %5 - %6 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 %1ЧаÑтота бинов: %2 Гц %3Ð’Ñ‹Ñота тона бинов: %4 -Inf -Inf dB: %1 - %2 Дб: %1 - %2 dB: %1 Дб: %1 Phase: %1 - %2 Фаза: %1 - %2 Phase: %1 Фаза: %1 Window Overlap Перекрытие окон None Ðет 25 % 25 % 50 % 50 % 75 % 75 % 87.5 % 87,5 % 93.75 % 93,75 % Normalize Visible Area Ðормализовать видимую облаÑть Bins Бины FFT cache failed Ðе удалоÑÑŒ кÑшировать FFT Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Ðе удалоÑÑŒ Ñоздать FFT-модель Ñтой Ñпектрограммы. ВероÑтно, не хватает памÑти или диÑкового порÑтранÑтва Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ. dBV^2 ДбВ^2 dBV ДбВ 43Hz 43 Гц %1Hz %1 Гц SpectrumLayer Window Size Размер окна Window Overlap Перекрытие окон Window Окно Mean УÑреднённо None Ðичего Bins Бины 25 % 25 % 50 % 50 % 75 % 75 % 87.5 % 87,5 % 93.75 % 93,75 % %1 - %2 %1 - %2 %1 - %2 Hz %1 - %2 Гц %1 Hz %1 Гц -Inf -Inf %1 %1 %1 Bin: %2 (%3) %4 value: %5 dB: %6 %1 Бин: %2 (%3) %4 значение: %5 Дб: %6 First Peak Пик %1 Bin: %2 (%3) Value: %4 dB: %5 %1 Бин: %2 (%3) Значение: %4 Дб: %5 Show Peak Frequencies Показывать пиковые чаÑтоты Plot Type Тип графика SubdividingMenu %1 - %2 %1 - %2 Surveyer Yes! Take me to the survey Да, Ñ Ñ…Ð¾Ñ‡Ñƒ заполнить отчёт No, thanks СпаÑибо, нет TextLayer Empty Label ОчиÑтить метку <no text> <без текÑта> In progress Ð’ процеÑÑе Time: %1 Height: %2 Label: %3 ВремÑ: %1 Ð’Ñ‹Ñота: %2 Метка: %3 Enter label Введите метку Please enter a new label: Введите текÑÑ‚ новой метки: Drag Label Перетащите метку Move Label ПеремеÑтите метку Move Label Horizontally ПеремеÑтите по горизонтали Move Label Vertically ПеремеÑтите по вертикали Drag Selection Перетащите выделение Resize Selection Смените размер Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Delete Selection Удалите выделение Paste Ð’Ñтавить New Point ÐÐ¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Erase Point Удалить точку Re-align pasted items? Заново выровнÑть вÑтавленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? TextModel Text ТекÑÑ‚ Time Ð’Ñ€ÐµÐ¼Ñ Frame Выборка Height Ð’Ñ‹Ñота Label Метка Unknown ÐеизвеÑтно Edit Data Изменить данные Thumbwheel %1: %2%3 %1: %2%3 %2%3 %2%3 New value for %1, from %2 to %3 %4: Ðовое значение Ð´Ð»Ñ %1, от %2 до %3 %4: New value for %1, from %2 to %3: Ðовое значение Ð´Ð»Ñ %1, от %2 до %3: Enter a new value from %1 to %2 %3: Введите новое значение от %1 до %2 %3: Enter a new value from %1 to %2: Введите новое значение от %1 до %2: Enter new value Введите новое значение TimeInstantLayer New Point ÐÐ¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Plot Type Тип графика Instants Segmentation Ð¡ÐµÐ³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ In progress Ð’ процеÑÑе No local points Ðет локальных точек Time: %1 No label ВремÑ: %1 Без метки Time: %1 Label: %2 ВремÑ: %1 Метка: %2 Draw Point ÐариÑовать точку Add Point at %1 s Добавить точку в %1 Ñ Drag Point Перетащить точку Move Point to %1 s Перетащить точку к %1 Ñ Edit Point Изменить точку Drag Selection Перетащить выделение Resize Selection Изменить размер Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Delete Selection Удалить выделение Paste Ð’Ñтавить Erase Point Удалить точку Re-align pasted instants? Заново выровнÑть вÑтавленные объекты? The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? TimeValueLayer New Point ÐÐ¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Plot Type Тип графика Vertical Scale Верт. маÑштаб Scale Units Единицы шкалы Show Derivative Points Точки Stems Ðожки Connected Points Соединённые точки Lines Линии Curve ÐšÑ€Ð¸Ð²Ð°Ñ Segmentation Ð¡ÐµÐ³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Discrete Curves Auto-Align Ðвтовыравнивание In progress Ð’ процеÑÑе No local points Ðет локальных точек Time: %1 Value: %2%3 No label ВремÑ: %1 Значение: %2%3 Без метки Time: %1 Value: %2%3 Label: %4 ВремÑ: %1 Значение: %2%3 Метка: %4 Draw Point ÐариÑовать точку Drag Point Перетащить точку Edit Point Изменить точку Relocate Point ПеремеÑтить точку Change Point Value Изменить значение точки Drag Selection Перетащить выделение Resize Selection Изменить размер Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Delete Selected Points Удалить выбранные точки Paste Ð’Ñтавить The items you are pasting do not have values. What values do you want to use for these items? У вÑтавлÑемых объектов нет значений. Какие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹ хотите Ð´Ð»Ñ Ð½Ð¸Ñ… иÑпользовать? Some of the items you are pasting do not have values. What values do you want to use for these items? У некоторых вÑтавлÑемых объектов нет значений.Какие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹ хотите Ð´Ð»Ñ Ð½Ð¸Ñ… иÑпользовать? Zero for all items Ðоль Ð´Ð»Ñ Ð²Ñех объектов Choose value calculation Выбрать вычиÑление Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Scale МаÑштаб Linear Линейный Log ЛогарифмичеÑкий +/-1 +/-1 %1 Hz (%2, %3) %1Гц (%2, %3) %1 %2 %1 %2 %1 %1 Time: %1 Value: %2 No label ВремÑ: %1 Значение: %2%3 Без метки {1 ?} {2 ?} Time: %1 Value: %2 Label: %4 ВремÑ: %1 Значение: %2%3 Метка: %4 {1 ?} {2 ?} Erase Point Стереть точку Re-align pasted items? Заново выровнÑть вÑтавленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Select cycle size Cycle size: Draw Segment Division Lines TipDialog Tip of the Day Совет Ð´Ð½Ñ Show tip on startup Показывать Ñоветы при запуÑке << Previous << Предыдущий Next >> Следующий >> Close Закрыть TransformFactory %1: %2 %1: %2 %1: Output %2 %1: Выход %2 Analysis Ðнализ Effects Data Данные Ñффектов Effects Эффекты [\(<].*$ [\(<].*$ Failed to list Vamp plugins: %1 Ðе удалоÑÑŒ перечиÑлить плагины VAMP: %1 <unknown maker> <неизвеÑтный производитель> Extract features using "%1" plugin (from %2) Извлечь данные при помощи плагина "%1" (из %2) Extract features using "%1" output of "%2" plugin (from %3) Извлечь данные при помощи "%1" вывода из плагина "%2" (из %3) %1 using "%2" plugin (from %3) %1 иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð»Ð°Ð³Ð¸Ð½ "%2" (из %3) %1 using "%2" output of "%3" plugin (from %4) %1 иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ð²Ð¾Ð´ "%2" плагина "%3" (из %4) Extract "%1" data output from "%2" effect plugin (from %3) Извлечь "%1" данные вывода из плагина Ñффектов "%2" (из %3) Extract data output %1 from "%2" effect plugin (from %3) Извлечь данные вывода %1 из плагина Ñффектов "%2" (из %3) Transform audio signal with "%1" effect plugin (from %2) ТранÑформировать звуковой Ñигнал плагином Ñффектов "%1" (из %2) Generate audio signal using "%1" plugin (from %2) Создать звуковой Ñигнал при помощи плагина "%1" (из %2) Plugin type Тип плагина Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ System Identifier СиÑтемный идентификатор Name Ðазвание Description ОпиÑание Maker Создатель Units Единица Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Generator Генератор Other Прочее TransformFinder Find a Transform ПоиÑк плагинов Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñформации Find: ИÑкать: <br>&nbsp;&nbsp;No results found <br>&nbsp;&nbsp;Ðичего не найдено Up Вверх Down Вниз Found %n description(s) containing <b>%1</b>, showing the first %2 only Ðайдено %n опиÑание, Ñодержащее <b>%1</b>, показаны первые %2 Ðайдено %n опиÑаниÑ, Ñодержащих <b>%1</b>, показаны первые %2 Ðайдено %n опиÑаний, Ñодержащих <b>%1</b>, показаны первые %2 Found %n description(s) containing <b>%1</b> Ðайдено %n опиÑание, Ñодержащее <b>%1</b> Ðайдено %n опиÑаниÑ, Ñодержащих <b>%1</b> Ðайдено %n опиÑаний, Ñодержащих <b>%1</b> <i> (not installed)</i> <i> (не уÑтановлено)</i> %1%2<br><small> %1%2<br><small> </small> </small> <b>%1</b>%2<br> <b>%1</b>%2<br> <small>%1</small> <small>%1</small> <small> <small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Тип плагина: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; КатегориÑ: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; СиÑтемный идентификатор: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ: <a href="%1">%1</a> <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <p>Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по опиÑаниÑм Ñреди:<ul><li>вÑех уÑтановленных плагинов <a href="http://www.vamp-plugins.org/">VAMP</a> Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… данных;</li><li>вÑех уÑтановленных плагинов <a href="http://www.ladspa.org/">LADSPA</a>;</li><li>еще не уÑтановленных плагинов VAMP, чьё опиÑание опубликовано в ÑемантичеÑкой Ñети.</li></ul> <b>Unable to retrieve published descriptions from network!</b> <b>Ðе удалоÑÑŒ получить опубликованные в Ñети опиÑаниÑ!</b> <b>No plugins are currently installed!</b> <b>Ðи один плагин не уÑтановлен!</b> <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>ВероÑтно, не работает Ñетевое Ñоединение, либо Ñлужбы отзываютÑÑ Ñлишком медленно, либо произошла неполадка при обработке.<br>Будет выполнен поиÑк только по опиÑаниÑм уже уÑтановленных плагинов. <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>Выдет выполнен поиÑк только по опиÑаниÑм плагинов VAMP, предназначенных Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… данных. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. <p>%1<br>%2<br>ВероÑтно, не работает Ñетевое Ñоединение, либо Ñлужбы отзываютÑÑ Ñлишком медленно.<br>Результаты поиÑка будут недоÑтупны. UnitConverter Pitch Ð’Ñ‹Ñота тона cents In 12-tone Equal Temperament: = + Piano note in octave MIDI pitch Note that only pitches in the range 0 to 127 are valid in the MIDI protocol. Tempo Beat period at With concert-A tuning frequency at %1 Hz, and middle C residing in octave %2. (These can be changed in the application preferences.) View Global Scroll Ð“Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ° Global Zoom Глобальный маÑштаб Follow Playback Следовать за воÑпроизведением Scroll Прокручивать Page ПоÑтранично Off Выключить <unknown> <неизвеÑтно> Layer rendering error Waiting for layers to be ready... Ожидание готовноÑти Ñлоёв... Cancel Отменить Rendering image... ОтриÑовываетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ... Exported image from %1 Alignment Выравнивание ViewManager Clear Selection СнÑть выделение Select Multiple Regions Выделить неÑколько облаÑтей Select Region Выделить облаÑть Enter Navigate mode Enter Select mode Enter Edit mode Enter Draw mode Enter Erase mode Enter Measure mode Enter NoteEdit mode Switch on Loop mode Switch off Loop mode Switch on Play Selection mode Switch off Play Selection mode Switch on Play Solo mode Switch off Play Solo mode Switch on Alignment mode Switch off Alignment mode Scroll to %1 Zoom to %n sample(s) per pixel Change overlay level ViewManager::SetSelectionCommand Clear Selection СнÑть выделение Select Multiple Regions Выделить неÑколько облаÑтей Select Region Выделить облаÑть WaveFileModel Wave File Звуковой файл WaveformLayer Scale МаÑштаб по Y Gain УÑиление Normalize Visible Area Ðормализовать видимую облаÑть Channels Каналы Linear Линейный Meter Счетчик dB Дб Separate Отдельно Mean УÑреднённо Butterfly V-образно Time: %1 - %2 ВремÑ: %1 - %2 Time: %1 ВремÑ: %1 Level: Уровень: Left: Левый: Right: Правый: Channel %1 Канал %1 %1 %2 - %3 (%4 dB peak) %1 %2 - %3 (пик в %4 Дб) %1 %2 (%3 dB peak) %1 %2 (пик в %3 Дб) 0dB 0 Дб -Inf -Inf WindowShapePreview V / time V / Ð²Ñ€ÐµÐ¼Ñ dB / freq Дб / чаÑтота WritableWaveFileModel Writable Wave File ЗапиÑываемый звуковой файл sonic-visualiser-3.0.3/i18n/tips_en.xml0000644000000000000000000000434513111512442016104 0ustar 00000000000000

Welcome to Sonic Visualiser!

Sonic Visualiser is a complex application, but it's easy enough to get started with.

Try importing an audio file and using the Pane menu to add some different views of it.

Check out the links on the Help menu for tutorials and other documentation!

Sonic Visualiser's window is organised into "panes" and "layers". To begin with, you have one pane. Import an audio file to see it displayed in a waveform layer on that pane.

Each pane can contain any number of layers, which appear stacked from "front" to "back" on the same timeline. A layer can contain a view of audio, or of points (time instants) or data plots (time-values).

There's a "layer property box" to the right of each pane, with one tab for each of the layers on that pane. Click on a layer's tab to bring that layer to the front. You can then adjust its colour and other display properties in the property box. The first tab is always for the pane itself, which has a few adjustable properties of its own.

If you have more than one pane, only one of them will be "current", marked with a black bar at the left side. Just click on another pane to make it current. Most editing operations affect the layer that's at the front of the current pane.

You can use different zoom levels for different panes by un-checking the Global Zoom control for one of them. By default, all panes will zoom and scroll together.

You can speed up and slow down playback using the Playback Speedup control in the bottom-right of the window.

The Transforms menu lists things you can do to extract features from or process your audio. The available outputs of any Vamp feature-extraction plugins or LADSPA audio effects plugins you have will show up here.

sonic-visualiser-3.0.3/icons/README0000644000000000000000000000032613111512442015130 0ustar 00000000000000Icons are from various GPL'd sources, including the GIMP image editor, KDE crystalsvg icon set, Rosegarden audio and MIDI sequencer, and Hydrogen drum machine. Some modifications and new drawings by Chris Cannam. sonic-visualiser-3.0.3/icons/align-on.png0000644000000000000000000000054613111512442016466 0ustar 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ%[ôkdæIDAT8Ëc`hÀÈÀÀÀàpÜâ?9šXž`d¢‰³&ßïû_p5‹(W±  \Íú¿ôâb¬†î{»›áù“ ª– ´§12000 xÁbƒáÿ·£ðaì»ßî0<ò‚ARF®Å0'à °Pµdxøý>Ü0[žS3 9qû8ƒ¤ŒÃz“íŒ g<ÿËs*¢ÌÀÀwJ`³åù“ Ï^Àù'ng8pn1²í0?*s© 4 )>pž™O4(¸šõòý¾ÿ8S¢ÿw²RâF“4J‰tñ^`Ä^ymñIEND®B`‚sonic-visualiser-3.0.3/icons/align.png0000644000000000000000000000030513111512442016045 0ustar 00000000000000‰PNG  IHDRóÿaŒIDAT8Å’Ë 1 D_¶š§Êp9.rL7æ@X²KPÄg$K±?ÏH†+8Ä̰CZ>éæNv3›rE¼Õ*)€§ðÔÜ «–þƒ™õN´öµVrίí÷[$E«-G8Èxë!B)I{›i÷îû÷dfáîCÛWÚiî9ëª á²F°ცIEND®B`‚sonic-visualiser-3.0.3/icons/annotation.png0000644000000000000000000000147313111512442017134 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÍIDATxÚbdÈüÉÀðóÑÜ@<…á÷(†Ÿßã€ì• ¿€â¿@òß¡ê@ô78 €˜@ˆ—202úé} ÿ302d3Ä¡þ‹300®g`d2àÁðŸá8Ãÿý ÿþO² Zp@L ÿÿ«5ïj–g`b²aøûûPs#³Ð€j†ôi6l ÐF f†ß@ v@…w~ÿ‰_ºÊh0/Øöÿÿ+r"@vG6 €€aðÿ–Ò@ƒ88A^:Ïðï_P£ Ðo %u@¶е@I!dhc$P¢ƒáßß9@Eu@Å Ì  a<4Ȉٜx 80þ]Űˆåa( ¼€6³q5Ãÿ¿@üèo&FfVü ¨ÿß *:È–`øÏ¸(§ R@LИ(JÊá èš, ¢Å@1Nff 0ãS¨óOÅ@.œ 4ì¿È7 €œ ¢x Û(™ÃðÿO Ð5ë| ¡@C˜>å#€x%P¾èÚ5@ú!¯ XBÎ?o &O  !@ é@I]`@î*–b`+ûÊðïO:Ãß›˜XYZrrJÜt‰ PP ÈÎZ[dó˜*™4ÀI÷û×? ÿ| JÀ<À𠀘ÐÒÅi &g Íœ@EM@—Ñÿ/@×mº¬( Äü x††#@±`I\7ò.@C6Ù˜XŠ~| ÃÀÎù‘áÏ ¡{€ü¿ ƒˆG ´òÿæ]2è÷R†_?gùl`Ûÿýý d›Ù¬Ä‚'£ãž! èçI ¬ìøï0üøÎÎÊ¿ÿþ8Ðÿ $ÓÎ¥D§§IEND®B`‚sonic-visualiser-3.0.3/icons/colour3d.png0000644000000000000000000000022313111512442016504 0ustar 00000000000000‰PNG  IHDRóÿaZIDAT8í’± À Ï£0cdœ‡1„]>E*^P‘".¯°¥“8I:„ðXÍGV$®uàâ ‰X µ½w>WyŸ8yÝL,¶ìHx=Jƒ·HDIEND®B`‚sonic-visualiser-3.0.3/icons/cross.png0000644000000000000000000000025013111512442016103 0ustar 00000000000000‰PNG  IHDRóÿaoIDAT8͑˅0 ªII*Gå¤$wãwOÃgæ±·D¶å(ð9lçm-猈a¡íŒ€±í””@JÊí™¶Œ\zïH¢µ@½³½ë›nrä@ʦ§…ê:öŽŽ§2™U$§òÕìc’çú††.<ôùP[O¾}C*“é.Zfm{àýׯ üzp…„€ ¬*V[XDÊ+t½£Þ¶!stÍ“¶äVŸo·ˆ´ªwåÛ‘ÅçNgmm$–JaÊíÆ]UÅÔÌ Vh"eaÈ"Û>ëiέ$?ÿ’GU!Ë0ç…x/å.Ó¤ª(W´W¹Ý#G+*ù¨ªŠKǬ‚’`š^ïðÅÆF&,‹¯ÂavüëGN RQâÝ~?Á ‡L“]šFð´ðþ“ LX–ÅžeËèUÕûÔœ¼hµ¢¤ºuÉ`ÆDleÌŠyf¦3LkÜnK&ǾÌÎî 9›C_\D6žš™éOOL”§mÏÉ›$Óy9à1TõÖ¶ÊJ†tý€Ø_Fg~ŒØNÞ¢’žëЉܓþ‹”ôÿÚ‚ýyßñ¹î=w9tNIEND®B`‚sonic-visualiser-3.0.3/icons/dataedit.png0000644000000000000000000000200613111512442016532 0ustar 00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<˜IDATxœµ”OLTGÇ?óÞº WMZÛa©T« ØŠ’–*&¦—š&šØ6驇^zÐK^<Ô˜4 BÚš’žšôÖ?Ii+hÿà*EVúGJT°,owÙ}3¿v÷ñ'©‡N2™™÷Þ|æû¾óQ"ÂÿQ|J©HMMÍnÛ¶Wÿʳ¸äšt&Ãíáá~ٷʈ8Ž“2ÆH¾j1Ú“I‹N/ˆ^HŠN%D'çÅMÄÅÿGf&Æà6pxRDXª¾¥,ËÊËÆ€"Ù1YbÀdÛ¶¶6»ëígžÛ,íê™{bkPú{VNæ¬ðEÀ@rðy¥|sÜsµqaø¡H{¿Œþ9ÃéEh¯ˆbÑÚú®\åÈ¡—PJ¡Ó)™ ‰éׯ…‘i‹Ö_ÝÔDœSÀÐ/‹'.7Ñ:oGAÌ:¿üŠæ— ’ÌýAlà Äë¸õÀâûÉ2=gˆˆÈe)¸x r,ÞÜM÷…^^i|qú;³£wâê˜Åugo=–¹¾üªÈYaŒ£<¹méü‚oü™Ë¯¿Ê»÷ðÝOé¹;CcSÇ•„¶l1@b9ÔÎZ r‰èî½D,CD¸94̉»£Ô74òNS5%%Ål¯ ³ycЬõ€E4h•ËíÙÏÎãÄçØ·«šý ûy¡vÅÅET‡+¨…°m '‘\‹[ X»ˆ•w÷\$63Ëñ÷ßC¡T‡+¨,á[ëÎ^S±Ñ°xòÂåeüòuƒÑ~?á­eÿ¸ìj…/kYey€ç·=‹m[«ÏŒÑk®–7}+àó=žªt:S²Ö;%"(¥üfúñŠ‘ôò‡ÿŠsÛóW$IEND®B`‚sonic-visualiser-3.0.3/icons/datainsert.png0000644000000000000000000000153213111512442017114 0ustar 00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<ìIDATxœµ•Mh”GÇÏÌ»ïf7‰›ÍvÝhB$šXÓÒ ŠÍED´ ¦´To½R­Z/žZz(½õ’CÏý€ÞZ¨ hKé¡*JPPÛÚÆ$›`Z%ºÖ®oâ&›wÞ§‡Y“Íf¡u`˜ùÏgžùÏ<¢ª?_²þ¨ty¶ÌNU *sœjnâü™“æùÞ 6Q]à‰;>C¿Y~8;R ´OU PñòTµLóÚ¾·¢ü¯7 ÷J5ûømŸ ×,?˜,º{ú„+*lÖ‘iåÚåŸütg¼Œ¬© …‹#ì=4s÷Á´nSÕ‰JÎ2«êŸ-kÄ+ 5¢µª„ehˆQZ ­ ‘¶®Ni¦\; 8`^Éel‡ˆ4,åxK'€žõ9!ihÿ<ô¾å£¶äʤ!D´J¶Å`#p}5p{[ÆÐ`¡0#?ãúˆ2øÕ\”lyo\6dãlYW¦ÉWšÐV8›I “÷<ÎE|ñ휻:ì¾>®†oíõ¿½'N÷zTr`í2J•íŦ¤mYy| tVѼ|¾qKø2 t/Õ,³,”!¬ø°Ê‰*uMtÁ²µ§ULÿ¡28Îl¾>IEND®B`‚sonic-visualiser-3.0.3/icons/derivative.png0000644000000000000000000000041013111512442017112 0ustar 00000000000000‰PNG  IHDR ü|”lsRGB®ÎébKGDÿ‡Ì¿ pHYsœÄuö„tIMEÚ&¹ÚtEXtCommentCreated with GIMPWgIDATÓc` 2ü`xÉ0Sâ;ƒv­ ·d±Iè1¼f¸Í ˆ.lΰAˆa1Ã$t‰c ê ª Ñ%~30300È0<€ 0AéW ¡ œ  Ñuø1@*;X1ëâ­:@mtÐD 5ÐyüB‘תàËI;Ay3øŒ¿¸F™×†×Ä1æ°É›8ÙÌ`‘3L:øLøˆ]œݪ¥YüD‰QžÐ_ÆYøŸ°ŽïÁè7î°…!®â. ý6¾`„˰£xøàÛø¦3èà6¾xŒ¾pþ^?ŠŒ0®,Fµ2e¥Hü^̨EF•¤+Y‰`òDL>à Z©Ôlj5þ³Eò7ž/Æ+¶0«/ÚÉNÁ4É™ IEND®B`‚sonic-visualiser-3.0.3/icons/draw.png0000644000000000000000000000104513111512442015712 0ustar 00000000000000‰PNG  IHDRÄ´l; pHYs  šœ×IDAT8­•ÏKaÇ?»;háE´q Lb/Bý]„nâ%ð`Ñ­º{ð`§ OâQd·n ’°ÄÅŠzÛ­„BÙ]Q×ýñ¾\Qcf|·í9ÌÃ÷ý¼ŸyæFÐ@½hGãZ,üR2©˜HI9”¦ÐéD‡¾y«ˆÓ-`à¹Éyî.íL-JùÈ/ßb ¾jqú jšžØð’MÝ> +õ›=È+xZXÏóþ œ¾néÈm ´%˜R°S­†¾øsÁm1_  ¤`·³ã¼eáà;QÞmÀ>ª`ãtṓÖkatˆÂÁÎ0ðp¬fáGYÍ6Î]FÆÿ£þä—¼UW}IEND®B`‚sonic-visualiser-3.0.3/icons/editcopy.png0000644000000000000000000000141113111512442016572 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<›IDATxÚb}úÆðýû/>>nKK=;QQYÀpà*á²ýß¿³^c ¾~e`xÿþ 0¾0)me +Å•?þ £¿@5?aÃ4° €P øñƒáÛ·àX¹‚!ÍÍÍŒ!N†×¯?0|þü6Ý?~ x€¼öë×o& $ Èß èÏ `VIIQ9..ŽB€‚ðëÈÿÌà0À@±ÀÎÎÊ ..Ì --4• €X@l 0@Š1"è½_À°ùNlœœì`WËçÏß~ú Ä?ÀÀÐðè¢?`0ðùó?`àýz‹œà0b@±ìÜy|£X÷ýûÏﺺªNJʰÀýóç7Ðÿ,`—¼q!#@‚9Y3Èf ažtŒ2HÝß¿ÿ€62 ù¦A^ @(ÑÊ0 61чÈ+þ0‚m‚$sF°7‘@Á Ù¢¬,Ë ¯¯N®ÿÿÿkdee‡Å¿¬@úÿ¦X&°8@± 'a` c8zô<4]üÿyóæó ”v„ý¬þË—ï Žöõ€ÛbúlIEND®B`‚sonic-visualiser-3.0.3/icons/editcut.png0000644000000000000000000000144413111512442016421 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÓ  *}µÆ±IDATxÚ’KL†ÿ}v·X¶H­PhA¤&”§„hŒ†ÈÑ£ˆÆƒ!zÑx0Qcô@<`¼7IOâÁhHÁ≅²¼Š¥Ô¾»Ý¶»ëE0Fø“¹ÌŸù2f€=466{ebb>0::]õ/ŸÜ ÀóÜìì,£,'w{}}O ŽŸz/M“I’ FÑÑá¤,SC~¾©›ãØ—†öÜ Ž#ŽÁç Ђpà¬Ýní¶ÙÌE[[à¾"„B1„BQx½þ†²²¢«õ°}jjqÒåZíÝW¿?EQàp”<7<<ñÙãÙ¾Äóìâ_€¡[…†&ì –¥!Vß^û±¼´‚B›&“ÀޏÝ× ‚puvÞÐ2¯Ú ‹3:ŽÖ’•L.C…\êÒüc[Ï{. UÕÐßÿiN=ׂœq:ïj;st](°Õ:R¯‹Öh„ùf´0FÞJW( 5˜c¡“×›OZÑ€`åÍ5u@@k=׿°%š'gt]>/y5׈y-ºƒ$Œ²U¥kp؃%:¬OÄ´@k}öJ×pøO„¼,)/N“ónŒgéUäoªM‚YQÅ9u.ÛB:„RZCåú\²FNÇ¥¸r€w÷Œ[*¢ÓR쉒ȣÊ#ñ½|Qü®ô/~UÎ+‘Â3‰eñ]òòÖdÒ)èÓ¥rRkÜ}4Xðq½,¥Õ˜S*AÄ5æY J>I§!JÛ)( FÜ«ìŠÖ‚|²IJÐæ @L¦f§7õ- %^£þ”˜hÛsO¾<0­òLºZ\'Ê‹óÓU oÊ‹ñ À½ ò»2´±‰å¹½®8Õ“Å©f¿—Ä%ímàÚðSOS ®¨8G:·¥}+Ý}_”rïø¿B,OËÞíIEND®B`‚sonic-visualiser-3.0.3/icons/editdelete.png0000644000000000000000000000157413111512442017074 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚböÿÿ3ÀÀ? óÇŸ ¿ýfxóî#ÓŸßÿÞþüŃ™…å Ãí[7ª3Àjˆ…[SM†ƒ üöã×?†¿îÞÌÀÃÍÉu÷ÁóýOž½ egg?€¬ €˜°FFF E ŒLÿ˜˜™$$E¬uEÔUåw²²°„üC8– €X°’gb66†û3¼zù’‹›ƒáÏï¿lŸ>~Xýïß¿" t?H-@auØL@WMbøõ‘áå‹ wî>f`ã`cøòåCL@auÈv& 7þüþàk Áðë00?ÿdx÷ü9++éGájá‚®Ÿb`¸y–áûè?¬¬ _îÝc`ê*b`Ý»Ž•‹è-Vfff¸6€B¸àÉ-†ã;¾~`øÿèÃW›†ÿo2Nªb`ß»ƒSîÃom3&1i` #\ @$•äÕö¬c`¾9ŸûÌQ¦;wXdø-¥Äð>§‘YDœ•ñÔ“@,0ö& Ó.„ñÛOÖ3دnf`xõžá·–ûº© ¿5˜¿|a&&p4Ã@±Àá0Y™X˜8Ÿ¾b`xöšáó†§o±Àò;P3#,¢! €˜þÁBþ÷/¶Å“Ø;+^døkdÁð[˜õì aWöm@qrAmG¸ €à±ÀrdëÔ†o~E&3|^¸“ákï,†ÿ|ü ̯^1ç20½zÁðÈ €^0sb`tòcø/£Âð+¥œ~ûú2|X½‘«¬€ákzÃ?^ aÀ´ì€b¥knA>†öé`)V þû”©€´‹ïóç€^üÏÀýõ +J ËÇOŸ¾¶uNþÃÄÄÍÿ€>djþ6à?4güsþ531|ùL–P`^†nJïxIEND®B`‚sonic-visualiser-3.0.3/icons/editpaste.png0000644000000000000000000000172313111512442016742 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<eIDATxÚb|·Ö„“áïO'&Æ¿ oþ0L~Ùæ¥,Å—¸lÑÒ3ßoÌèÜÝ¡ÁÀËÅÊ qzë»O¿@1¾ß´“IÜØáÏ6F†MW$äMâ´ž¼ùɰz^/C¸ôr.n†;^n›µöå’;_–à  6~7&Å(n¦ v|dØr•—AéÍ5†þ3pr²30(ò>f`ºÿáû» ?30õñÀ  ÿ×w†Ÿ@3&†ïÏÒ/^ÞÉðééK†ŸO¾1œÿ¦ÈðM€C‚—åýý¿ ^ ˆÿÿ00þûÉðãÛW†/¶¿dø÷ü*ùwF ¯mŽ0HýõP ~Éi 67ªk+^îlÉ@L Œ@ÿ~Úúˆ_20ü²ßßa`xuƒáï÷/ 2 ¼¿þüùÍÀÆø‡åï›øæ‹ÒffV€b»ãÐxf óÿ†w>Ý;Œ‘“á7ЭlÌŒ@CØ™οøÍðüÅ_ɰ®šç//\ ˆ ¬@Wüºó ÄìÀ0ââ?¬`Y¹@½ ¿J,¤Y„Yض?e`Xþ— € ½ñè…o/€Ö2CøŒ@ÍLL`Íß~20|ÆÕ»ÏÿÞ~úÃÀ çåªûÏÀ@Ð@†Îg æ¿À@db† °A+~üJ ãæddàêâø r@A øó ˆßÃhÐ_ Ê?@뀱Žˆ /ð²½Á ÖŸƒˆ…‡›•“‘“›AB¨ñ ÿFé†_øØDAn`ø 4è}†¿Ò@+#Øw`@,é«ËöWÿþû˜*AB è¶¿ßÿ¯¬ÁãåÈÀ .ÆÂÀÅ Ä_@CJ>=*F#@1B<Ê  Ä’ ¨à7ƒ¨¾=ƒež3ïoL 耕ë/Ãɾ6€b„åJyhJ`i^’bAA†"Ê×o œ%'ï@=DIEND®B`‚sonic-visualiser-3.0.3/icons/emptypage.png0000644000000000000000000000170613111512442016754 0ustar 00000000000000‰PNG  IHDR szzô pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF ©‰ [Ü£cÅ ß㳈…˜à'%ÀR;1–ƒ@¡8”XXae$ ‰–Êa%±–ƒ@¡8àË—/ ÌÌÌ ,,,à,ƒœm°¥n¥È!CŠÅ0@(2øçÏŸpÃÐ Å äX Ä‚Í |Rb€<‡ ˆ…š†Ã‹W`Ôá2 Åê’Öˆ]’PJ',]º”˜D v!@Q5@úA |}}Á‰”¦@ä1¯AìÆÆÆ]¯^½ºR@TwÌ QQQ¬Yº¾¾~ÏŒ3’ÌW >@ÑÌ?~ü€‡˜®­­ÝÓÖÖ–d>é &P¡öë×/pЃèêêj ËA €h €5ÈòÖÖÖ=ÝÝÝ–ƒ@QݰÒDûö¡§§gO__VËA €PJµ”dCXI ¯_¿f¨««[°víÚ ÷).=„â€ïß¿SìX(NܵkW(=âÓ@,È=Vj åµ„,€’’ýÓÔIEND®B`‚sonic-visualiser-3.0.3/icons/erase.png0000644000000000000000000000232013111512442016051 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIME× 1 Uç¦]IDAT8˵•]lUÇÿ÷ΙýtÛi—v»Ýbù   (’X@B¡FQ°E§¦Jˆ_h"ƒ/†h„ ê‹&¾UÚ4Ѥ´ÅXD - Û–í×¶»í¶Ý]šÝÙÙ™¹¾´IƒT« 79oçþó¿çÜó;„sŽ»qèÿ¹D‘KJß]O‘æMâœ/8BïSK¼Ö=xîÒ-ãÕ·;GJ—Ü@ø[î•×m>ñáɯÕŽ ÎÏuül0Ç?oÊ<ºó«³.O¹gn>ù·BHAñªÀ¶]ïµ×ì­XÂly,«éÐ%@7$è* óŒõû÷â—~mý(xᓜsý… !òš­/¿±{÷Þ·V¬yЭ¥ÈX·ЦL2 Íf@3]H¥»/¦Ç¯µõ'¾ÙÂæs™Wè÷í<ðAË®§÷Ü) ކ-ÜœžÂpê¨aš5ˆŒ[AfÒäX G¾’Æ™g°ØfÏ_ÍîärÃŽ×nÛQùþÚ [Ü?_qæâ$ú xÆÄT 08Wd@êÍç5Ö/÷]î óµ…°[”p°¹.NgaýÉ“§ÛºãÉ®°œ:ô¥lE§rl `j(# ¤ü<´nÙpÊdéßúñpA¥°L:벺ººª¥¥¥ó¹}ûª\ZöI¡‚77ž^ã¢9J-¯„úÊà ¤ÍýO¬¼ÖcÞ?£X 23µÊ-ÀU__ÿYMMÍ—Ë%]¿qš¦R BLfk§:}u¥?’œœ<þ°86mØ3m7„r0ˆ\…/ØWÞ©`^¯×_TB008Î9v;(¥! œbÙl„ÛÍPˆq˺ît:—1Æl‚ Ì Ã²,,.u˜Jžfí?…òþ„„YQþ?‚q¦Ÿ?ê~é€ιÎt]·l²L%I¢±XìþŒ¦ÅËÊÊÆ$Q¼—Î9˜(ŽD#ª‹ œR€ÅjOÖ1‰L{ar²õ*€Ÿ –ËåLI–›,Ãa·Ã0 %*ÅEE£Š¢8dc¥”RPÆRº%‚ð,Ê£g’Rz¤5ØõÊQ£œóìÜoËLÓäj*•󗔨óÉd²$AUU¿Ëå ¦ƒ)Iàši)æÝ7~a";öÝ‹ý¡¶ós]ÞŽÍØ‘#Gžmoo¿–Óõ\žÇ&Š% ‚ X’(BE‚€_:~Ró§è;hóp¨­sçó0pÎ1ÃU_mmm]åöíϯX¾¼ÄãñEQ†,‡sMWŽööö^0¯ày Àåv»W>|øÛ¦¦¦x$innž¨««ûÀRò‚1{î ªªªö?~¼{Ó¦M»̾n¡1/6gÊc ÝÞñ­¯»µLÿ‚œD£*¢IEND®B`‚sonic-visualiser-3.0.3/icons/exit.png0000644000000000000000000000156213111512442015732 0ustar 00000000000000‰PNG  IHDRóÿagAMA± üabKGDÿÿÿ ½§“ pHYs ˆ ˆåŽ)ItIMEÑ 4<;¨ïIDATxœM’_hÖeÇ?çœçùí÷î}ßÙæz—nönTnå„Ù…t•wáEz×DWa]EEʬ Ân¢Œ)ú³DK]4ié˜s6[nn{ÛïyºxÇèpœ›Ï—/ç|àP[:³|¸¹¯‡°T#’çäDˆòBšscøÆ†¡Ý“óåP[:ØÔÕ5ÜûÜ\ùú’¦ˆêPƒˆ`Nª`Šóž†Êzμð!ùÜ!ù ÙÇû?zs¯¾Drsñ†98¥rÏ6T«£'Qó¨30C§|G•“ûÞÄÝÔÛÍß?}OÒÚŠ Ê-ôïÝOÚ³•ÿ×üéãœÿü=V²EÄŒ|atC+.Ö2âò ’x å¶8 @mt„‰ÇihZGǃ;)õmg û^N½þ4ËYˆkñ‚9OÿÞý\úì?¿ý<•Í+üðò“L}|‰ÛvìBœGE!FTòÔQj¿•´g+µÑÆ¿ýqŽrç]4w÷#ÎqqäÌ]aÝ–ˆ)Q•šQƒâÆ*À,f b†˜1óÛå¶Äy%"‚ªÕ¯¥¶€ÔÛ q ¢€/5#êVòˆ9añÚí­©Ã¦´ôÖ?³8s¯FrA•…™i˜¤Ô·JÏbÆòµi®_8‹˜R½ïah\OöçiÔ§ä«\ÈY ‡ñë»/r÷¾·¸}ϳTÇÏ0uvQaËîg°ön cü»#àæ´. ‰¢€8Çâì4§^yœÍ»žÂwö²©³w-Haêƾ:Ìrž‘›ÈW–@ÁÍ]¢Ðq Ù?óuÛY_>yƒ¤T¦¥z'8Ïõ‰ ¨OÁ9|c‰bµ‹‹_~J¾öhKãäÕÏ?²içXâ°B>MÀ µÅ©Ý˜Å;#˜`N±Æ—¿9Âïï&i* ÀÇ˃+KKÃé†Vb-ƒ !Àêä!_Û#)ISq豿fþ|Ž /!‡€tIEND®B`‚sonic-visualiser-3.0.3/icons/fader_background.png0000644000000000000000000000041213111512442020232 0ustar 00000000000000‰PNG  IHDRtÚúkÓ pHYs  šœ¼IDAThíØ± Â0Æñ/âj‡æÜ¤³ÏíàVÐ'É3Ä5–†“ÿ\[ZŽ~PÊI€?qéÁþpŠ¥Á÷ºn§×xwÒ$PIÚ.'IÛ¹+Çó IòÞ+„@_qÿÙmSÔ˜ÙO.㪞˜Vß÷qzî×JŸ™ë×Ü[jžfÈÔr Tu¹Þ²¢q, `±`‹ =‹ãÔ ­²°X¨a†ŠßÉr TÅbŠx|稿nÔàIEND®B`‚sonic-visualiser-3.0.3/icons/fader_knob.png0000644000000000000000000000047613111512442017056 0ustar 00000000000000‰PNG  IHDR ÎÔ'‚IDAT8íÐÁjÂ@ÆñZ"¸]ÐÍ­ôÒCŽy >€Ógiû<¢bŒx÷äîÂ&;`O†B¡·zêwú1Ì0Ì$óÅòªž4÷Šw–÷–<Ï)Š­5ÆF£§Ó‰Ùl†RŠý~1†étÊz½&Ë2Œ1¬V«_eJ)Ò4%„@Ó4¼|òøüòúÖ4‘ápH]×ÄI’„²,º®c·Û!"´mÛ[DzÇ)Ë’#"ÒÏŠ!¼÷œÏg”Rl¶[îö×où_ú§ÜPUZk¬µ8ç8\.œsǾ^UÖZ¬µ?ìœë{nžL&ŒÇcBÔu @2_,¯ÞÛ»]©”æ ŠÞ®;øø²nIEND®B`‚sonic-visualiser-3.0.3/icons/fader_knob_red.png0000644000000000000000000000043313111512442017701 0ustar 00000000000000‰PNG  IHDR ÎÔ'‚bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ  'ø{¥n¨IDAT8ËíÒ1jÃ@…áÏAŒ…‘>AªÜÃ×Ì}nR$"W%°R:Íì,7ößÇÌþՑkm¹PxÅvxÆ#~РÆgô'¼äþÞ\ê-¶Xã‚_¼£‚OÚ§á;܆ÏÃCò+gŸ7†Ô•5u†N8dÛwˆÿ¡7j†.ŸÞ&™¹+Œ4ë}a˜’Ï©“›˜tJÂêÈu\pË-þ6‘d;BIEND®B`‚sonic-visualiser-3.0.3/icons/fader_leds.png0000644000000000000000000000047413111512442017052 0ustar 00000000000000‰PNG  IHDRtÚúkÓ pHYs  šœîIDAThí˜=‚@…ß[)¸‚…0‘Ä^cgíýl¸…56œ‡g£†Aü‡]ß—LøX²0á50€Bˆaõ“élξ¯“$œŽP áb0ò®d4d4¬6Û¿ðœ†Üñ’†ÒqÒÀ«Žï Ü;¾3pç8 ÄóÞÄ T„‹Œ±·Hòv ÁCì¹é×Ï—{NÇ»`½Ò4esíݪ߳ÍÙûz§·<·;PUµX®[£ÁBh°',h° Œ( ÕÅ«ªju~À5X@?ïŸêaÀï¤;PU¥Á‚BôÂ1ÐXnüWÅíIEND®B`‚sonic-visualiser-3.0.3/icons/faders.png0000644000000000000000000000043613111512442016224 0ustar 00000000000000‰PNG  IHDR kùbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ"Ñèj6tEXtCommentCreated with The GIMPïd%n‚IDAT(Ï¥’½ ƒ@‡­lâ«ëmL¡µ™Z عÖ"V>ÍY Çz§¶øØ¦XTÕåÅÇ©ªx¤‰Û Àöý,øŽ31ªºdšªºD¸À>·š¡ü[Ö`«Ùµ=Yö¦kû¨Móz\kûÃö¸Ø¦åÌDþÑŒ!ÜàtyŒ9ÊVÅà,¾ëIEND®B`‚sonic-visualiser-3.0.3/icons/ffwd-end.png0000644000000000000000000000051713111512442016452 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ /Ä̤NtEXtCommentCreated with The GIMPïd%n³IDAT8Ëí“= A F£……"x ؉øSØy7Kaceí„=Ànµ…±É‚(Y³Nìöƒ!ùx !VÿVGÉoPz<90®ñì€(±8JÇÅ_އ—#à\W žá/ð`ôUð¹7¸‚Ÿ€u x ä{À1ÜWò°±€» FQ3 óœqL­PkÇ7`!—è¶nWé4÷< °îÊÿþ-š´”Õj•®'`,3wu@¤IEND®B`‚sonic-visualiser-3.0.3/icons/ffwd.png0000644000000000000000000000053013111512442015701 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÕÏ´ÕtEXtCommentCreated with The GIMPïd%n¼IDAT8Ëí“1 A E«…… Øy ؉¨[Øy;/à l¬ì„kÁìÚXXYÉÚÌØ¸I&‚Ý~òÈ#dhóït„úxw'3³J`ìdŸd '`âd¦`ÆL1À@ˆ,KÜy̬ñê†óö Ë-ñNhŽ‰Ý¬Uô…z [{wgÀCag¯ø LÃĺ Ò °¿-™YašÒÉTñX ;Õ˜š%Ðûµù΄GCCo9´IEND®B`‚sonic-visualiser-3.0.3/icons/fileclose.png0000644000000000000000000000200313111512442016715 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<•IDATxÚbÔÔtg@‚¿~ýÔøû÷¯-ôÿÿ†ÿþ½cbbØÂÂÂr(ö$öÿÿ?°b€bAÖ ôøùóWœœœµ¦¦2??/##ÃçÏ_nÞ¼_uóæ£ÌÌŒ-LLÌ;`zˆ¡ù [Gxx·»»=ƒŽŽ77Ø€_¿þ1ܸñˆaëÖ}Ö+Wn\óñã› &&¦) }ÄòÐfwffÖÍ ‘¬îî¶ ,,Œ ?þ 5œ••(ÎÌpôèy†þþ¿?}zç äï fe¾ß¿Ïvp°W°··ú÷ƒ––Û7?~tþw ûƒªª4Ð  eÌ/^Vºz @1ýýû[[HHÄJEE ¬ÐÀ@•ƒƒACCžáùó7@1))aqqA†;w½ô‡APPÈ ¤ €˜…„3¥¥¥mÇðî݆—/?0¨¨È0pr²5IJŠ0((H€½Ò×·”aÍší >aøñãЛ?^ 00„!õúõ À/†Gž]ò–!1Ñ——ƒANN ÝÝ Ö®Ýô30,X®ä0“@±€BùÛ· OžÉ}ùòd00¾1Ü¿˜™n0ܺuýè_s€š—Áò@½Í‰ l ò¿ 04€Š|ØØX…@aLï€!¾úà쌜ƒ ÈQ¹QkÓ»IEND®B`‚sonic-visualiser-3.0.3/icons/filenew-22.png0000644000000000000000000000126413111512442016632 0ustar 00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<FIDATxÚbüÿÿ?ùK÷þ3112`¿~ÿaøýë7Ãß¿ÿ>~ú óõ0Ç®  ˆj £ˆ!ùhéŸþüùÆž¼`àçeؼãäB†!›™–‚,ff‚(egce05ÒŽO@á5˜‰h 3 3³@ÈÅÅÁ "Ìॡˆ×p€"èb`Dò4;3Ø")IA¼. â †ÇÞ}GS¾÷ÖíÿÅy1(a@ J9 `IŠ‹ýýû—áÉÓWà’[³f †>€b"ÖÅàˆdfúåëwpŠ…?3v#ˆ ‹ÿÿûvÈ oß~“ß/`ÒûËÀÁÁ”cËa„×`a€ã/ÐpP:þ¤a®gafz,ÿþaÕ @]üóç_HX!(¼YYXÀAʉ ׂhl €Xð¹”ë@®efŽP— güÏ„âzl €XÐ ƒ¡ÿþA\ Œ>ˆb¸ AAñÈ Ø# €P þùëFÎ…#ÈP¦€É‚‚…æ ÿ@©»‹Å:F$`Àéÿ9âjL@Lx³ñ¤ìÌË0Là°…a&FìFQ„@43 €ðŒ§(Ç•ã` €p&7Pø‚ø a ôüÊduì‘@(³±"ÒÌ@P–ÙNrÀˆúË Á0þÁî-€b”ZL ¥•mT c€v/ïAøZëIEND®B`‚sonic-visualiser-3.0.3/icons/filenew.png0000644000000000000000000000132513111512442016407 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<gIDATxÚböÿÿ3ÀÀ? óÇŸ ¿ýfxóî#ÓŸßÿÞþüŃ™…å Ãí[7ª3Àjˆ…[SM†ƒ üöã×?†¿îÞÌÀÃÍÉu÷ÁóýOž½ egg?€¬ €˜°FFF E ŒLÿ˜˜™$$E¬uEÔUåw²²°„üC8– €X°’gb66†û3¼zù’‹›ƒáÏï¿lŸ>~Xýïß¿" t?H-@auØL@WMbøõû?ÃËïîÜ}ÂÀÆÁÆðåˇ6˜:€ÂêíL@oAOWáçß ïÞèVV6†S'ŽÂÕv/ñïß þ2|øð h㆟?1°±² `a`ff†« ¬ü†Òç/¿þüùÃðïï`X°½ŒÞÿXY€lF„Z€Â0à7Ðæïß3)°g˜˜X˜€šØ€®út+Ô“@,0ößÁÌßþBc€ h;Øæ?ŒÿÁ&ÏÂŽf X4üùóî4F ­ þ b„¤ þô60Y003Â"ˆérȃ(-£&3Pbb{ƒj;„3 ˆ fÂÿLr˜BJ®ÿai÷?$Š‘½@,09nVDnbp˜ý… 0Mýùû—á0 Y€ 9ˆåã§O_Û:'ÿabbZòìßÿ@'ý»’3À61#0Z¾|úüf@€IÛ€6ŸÆ©IEND®B`‚sonic-visualiser-3.0.3/icons/fileopen-22.png0000644000000000000000000000251413111512442017001 0ustar 00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÞIDATxÚbüÿÿ?-@1ÒÊ`€b$UCyãI…þÏgec2øüù·âä.ëØÔI¨¢édAç„‹ï¯ßúòÿÎýoÿ³J¯Ç¥ €@A Ã@më)ƒªæSç÷xñÿë×ÿÿ_½úýÿýû¿ÿ§Ï»õ?9÷P6sˆQ>ñúÿ1†ÿ~ýe`øýçï? k¶?ýð}‹¾`Cç™zW'y~^V†?þ3üþýLsp03Ô´üðñÓOÅ¥³Q‚ €mËîýï¯Wöh0ˆþù›áéï ßbr‘e01”ûÅÀð÷/Â`¯î>þÂÐ<éÒ†ÝW .9<€ @,è©âPó³SOxÿü`¨ËÓgàâ†=ÿýûÏ £&À`k(ðïßÛ…{/1À  –¿ÿxôáéÙ >. rœx#òý—? 7¼d:èn†[ïÞ÷3è4‡)P €X]óéÅ'+SI‚†~øúÁ»öƒ‹ƒ’,Ø,u …Ï_ÿýþÃðabï^€º¡IZŒ¡jÞsÓ ÿþý÷ ÿ€é–á0lÿ@Ù[O¼cñ”g``8øl0;ÃÅóyï½ó hÔ€B Šõ{^3(¨Š2èI³0Šp1|Ê}ÿ ß~ügøöûà éj ?YYN݃ÊÈÄÀðöáw†WÇüeø÷Eñ @¡¼çð+†[KtÞ¾úÍÀ/ÌÂð‡áõg†7@üð9×÷@öO ºé݇¿ o^ÿdøöö Ãó«¯><ûúáãcÞ¿ê LÿËŸ?C÷ŸúÎ`«ËÇÀ ô«+Ãù[ŸDåøn=a`¸ôî‹×^¿ùËðò ˆþÃðíÃw†ï¾ |Ïðè+†o ¯Xþ²ðÃ-·ÄòšÜž|Çd-ÄŒ†—@W½bâc¸qè³ÿÌà`¥á¿þ1üòãç? k¿1üþLÜÜÜ@³€€˜ù—Ãÿ³@æÓ?`„|úÊÀpùÚ†p`²a`xÄÀ dx÷ùÃÇ/@Ã~ ø h·¿^¼øÆð—…‰ƒ5¹0ÿágøË°Ä pªØsü3ƒ?Ë/ <@ÏHƒƒ˜*ø$Y>¾ûÅð‡…‘Aèß¾ß?xÅ1( 03üûù“áß·Ÿ €Ùôû7`ð¼ý'üðñïW >v†ºÖ#uoÞ}ËÞu–‘h8ó?€bù÷ïß¼_¿ÿ³ÿþ qÁï_ÿ¾þýû¯ˆ™‘9ÛÍY¡ÊÍQŽ“ƒ™áׯ Žv ±ËV_YÉÂÂtèÏ?F°EÄ¢¡Ê›˜/ÂðöÃ×? Úì ?¯?ôI ”“ÔÖdøöáË—¿@'108ÛÊð:õ¢óïÅ7á@ë  &6V†/‚L œ ¿~`Ðþÿž¡)_GRW[á÷o†?@C™€þýûï/ët´D,$Åþ0üø# ô§0@±ütú‹ oôyÿ0X…(Âà èÒ@/TÎ~Ìpéþ)qn}•fQUF¿›—žÿ  Á Ì@~°s2¬:ó†áÜûO ¿þføó÷/Ã_  @såöG†û˜ätåžý`e4‘á{sü¥ÃŸ¯OÏËßÿÿX€¶¸øAô?+ƒ¨+Ãfv†ßÿ1|üüáý—ÿ Ür< :šÜ —€¾þçý¿Çû¯21üû± A¾ÿþýÿðôéâô‹{!öùüÔãîÚÿêéÿãèÿëçøïäíñÛæùåòæú þ̈…hý±³ß4åyØ…™N\g`xûàÃçÌ wïþcxòèó§¿><|ËðëÝ{€!Æøé÷#†ÿ¯Ðù.¾c°3æd¸”üá*Ѐ÷ÿ1üþóáǯÿ ŸÞ~gøJ8lœÀ$Œ.Æ¿Às•á/Àbyøè'ƒ¦*ƒ¤?Pƒ 3ÃÇw¿¤˜ÿ0þüÆ Áü—á70ùþ&”Ÿ_ÿ0>yüçõ³¿—ÿËý;ŸœùÜ€†€\Ã4û‡$8}ûúá§ Ã7`À}ùúÈç¦H†–ùß¿¿~ôï,3#@±üþò“ÁUŸ¢€4733 Ãÿ¿€ÑùD½ñëÃ׿®Ýøü (y˜Äˆ‘Åpÿ{S3nv&`ÔSÍ_°ßÿøô7ÿdøÔôÈþó ”Cÿ0¼ºÿgÆde ¢aòmIEND®B`‚sonic-visualiser-3.0.3/icons/fileopenaudio.png0000644000000000000000000000163113111512442017601 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIME× 2*¸º¯&IDAT8Ë¥’[h›uÅß—/MҘЬikfìe]¡—ªl°:œŽê¨P‡cAÇñaÊÐñÂpƒyE˜¢ÁISQЗaH+Ý,kqaÝlëš­1Ñô–û÷}ÿ‹Uß|ò¼çCkÍÿÑþì ;·E)U4RÃÄ¥,;›Öˆ‡¶ GÖk½'jýÞÁ;‹ù> Ù|,Æ’.Ö9+­©TÜ]íÑÓƒ›ûÂaÇNýt,·\>òÔ6àQXJ©ÏWû\w=먒”êUá9²§¿õ=»›Ã¿ÇQìÞÕú̹‘«Ã–eŽ e`uv„>e)%=>ìë ƒÏíkŽõtE(—¡X”  ÿ¡xhl2󎼒;ž€Y㥩3 øÁYX¥G¯pâè–ØÖž® B€i‚T’?V[º£;bòIª¢¥ë-!AiÈü’£7$xp¨íß|>èìjæÆµ¯z›ä¼`cSÖÞÍ':Œ½³Éߥ¥$xL¨ú$.ç˜^ÉS)Á´.¤îpèÔó«š·¶®z‰l‹‡s³ˆÒâ”)µÂ2àÇ+eÊÊKC—מŽS 1{k­!Ø|-ß¿½Ì’"9¾¤æFgLQ©^°”Ô¬!›*òÞ›m”mÀÆM>xù$÷½ÏôÌ"·&¾¤œI2;<…½˜Oãujñ©Ë¦eLLUèj¹‹¼ø“ûâ~¾ûö*ËÙ Np/7.M²<ó5xîÆ^©hĸüóµ”/d8~³pàÃÛúìØªo¨×€5nÒ€tÃöãššØ:7‚šÐQõdÌ…”¬Äýœý™¦{Ûx71À+gÒô¼H}¬›à†.xü(|dDÚ?QµÿÓ…—Τµ’J+¥ôHbD— B:usMÿv=§ýÔÁôèù9 è¾}£EBç¥î+L·hóXoÖŸÉþ¡ýøƒ&vÙ%00 Àƒpœ‰Ä$×~-¤Ñê"h,C qú‹”øxØDJ@I\¡p«ŽíàØ6þºnÏ[ŸU¥pæ±mÁZVŒcš%4ü:; 3|âÆIEND®B`‚sonic-visualiser-3.0.3/icons/fileopensession.png0000644000000000000000000000125713111512442020167 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  d_‘OIDATxÚ’;hTA†¿ûØÜÝd“Ý`X£1Ñø*L¡D,ll‚`aP°++Q SX Z –bI¡b%j!$6ŠE"F†ÄUóX–}ß;sï¹7l\××áÌœÿÌùÏ™ù±ÉÕw¹Œ3ª|ð4R(¤«žBzϽðž«ñ…"”›oç2ÎèY<.¸.Ôëñjt€e‚a@¨|0} áÚ]Grà^‚ïÇg) V‹¤ŒP!¼ž±°‡zàø®8ø/"hî•R\-˜ÿuó7¦ULjGZ·µJì‹¶Ñi¦ÛØB¥PJcÿÌG‹<’w)©=_8ß…TÊiiÝ÷ø ­±C6Á5OQ~Ãô³æ+î¸A¢™³´\dbðY'ðël5U¦,Ö1Ì,3Ã'½¬Ž@B˜+sKO`yÅsßÛ ø¢Áºí³ÏH³gK®L@ÅüÀ‰®1’¤™,´Ò»wddp¼ï ¶7דè¦ÓNã˜NÊÁ l.¼½,ŸßL}.4Š¡}úpï¡î­4óVòìzÉ¿?]šn²%Í$V¬ƒN« €•gK··Jqmü䱪¡Ô¦Ÿ¼xðÇÈ2’‚€ˆ?1"uÑEübH@ A‚!sB2úddɾw»3»ÓÝUÕÕ3;ÇÉk;vK­ªî½ýôÛÕ O[«6É?þúQ]OT3³zBÓvĤdËÌê)fÅ,£j¨n¢qçŸ9ó£ÅwÍbõñÏ7>_Ôẞ¼ôʵKPqíê>Ÿ~ñ Ë&pá¹]>ûäýÇÒ}ãÞºýÁ·_ýðáá””. Õ°‰›¿rùÂyêzòÄm/šÜó»#è&‘a{UÕ ï_Üãå¯ð•ËO1–Ë)É8w*,Ѝ1©z·ßx•«Ï_dÿÒ³u/,›–å¢Á,?,œÄÍ”bœ4ï½õ:¥Jùq;äýxÍŒ““–£Çt!bfÛˆ{+º˜øí;¨eÌ2–}Ƚ¯ˆœ1bH4Ë–õ:p|Ò£<ŠXUBJÊr_R–ÿ˜”…¶]ºHJBJŠˆc$ç-Â:Xáîœß=‡ejרŠã“’™–ÌÎlÊd÷³IÅl:á(RröG;ÏÌxçÍ×pwBBH¤¤¨Ú`—õ-6ö/¿þ‰yH÷À,B"AÕ¶Ÿ] ‰ ¢Û­HI͘wïþËýû ª6\a®°Žö˜õâ;;5) IÒvaÈL•ª*ìíÕˆ€*Ôu¡®a:-˜ÁdRP-TUˆÝ·yœ”Õº#›±ZE‹n¤ê O!¡Ù¬¬íÄ1$Öë@qGÕpÏäüp7룻BýB²8ÄD ¼`f”â¸÷½Ïó0îcΛ¼ "¨(î[ˆÃ:²^´äl¬VËñäO«àì!ªæñŸuÛº5¾­Žç‹ë÷þ~pSâö_‡ä\F✠¥øÿæN¿¹îÎé‚âÎužÚöàÿßyK¼IEND®B`‚sonic-visualiser-3.0.3/icons/filesave.png0000644000000000000000000000150613111512442016555 0ustar 00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ØIDATxÚbüÿÿ?% €X@Ä’¥Gîqr± }ÿú‹áßß? _¾~gøðá ×/ß¾~ýÁðíÛw þÁðýûO†wï¿0\¼xõã‡÷÷“ÿÿ¿¾ €@.X·þô×O?þýÿ÷ïßÿiËŽþÉžýÿÄÅG`>:¾zïíÿâÚÿÙÙÌŸôÈŸ?ÿøýáóo†ï¿Nœ¿ÃðàÉ+†¿±{íõ»Ï _ÿaààäâñì…¯_¿1|:•“õ?ƒ§ƒ>ƒ¥6ƒ¶ªV~üøÁðäác†ß¿ýñbÀ7?1<ûõ‹ÁÆDhû_†×ï¿2<{ýÌþtÍïÿ¾|þÊpòôu†OŸ>1½6 ‡sŒ Qôßÿ–T†Å˜°£!®“ß½ÌÜ¡—RÏÄĘÁ=ÿ*áàrÇŽŽ5C!žÜZûŸ‚ õÏ@Cþ!;++#3#à‹¾ÿûÅÀøó';Ó!^.†W@±OŸ?Á  °ß@Ñöù;ƒ’ ƒ©¶4Xèr`àþGùò(úŸaáê= ×.]@Ð@„ÄñÏ^½ü tÐf`”|iŠƒ øúõ' ÐY_ýøö–â‚ï?>èã'v†?AÑ O80€Â‚™ hÀׯ ?½û ºà;Û7ØÞùæÿÑ3èû÷ï LŒL@þW`@~ê‚Ä@Acá0éˆ?ÐÀPÿô¬d ƒ 4ìÏŸŸpbÀ§/¬^¾axÉÎÌðSEœáׯO@ ŒZ`èÿFé¯_?€¨é?#Çׯþ}ÿÔÅÈ Ò @Œ Ààç÷¸ÇÄø_ˆñ7778‘üýûl (IƒÔÀÎׯ©ð3Åú˜™”ˆ‘Òì `°“Þ2¨  IEND®B`‚sonic-visualiser-3.0.3/icons/filesaveas-22.png0000644000000000000000000000216113111512442017320 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÓ.*Ÿ½'#þIDATxœÕ“Ëk]U‡¿sî97›÷£¦éKiK+¶Z¡:+‚íÀþ ‚àÐgЍӂ8Ñ R,­RÅ–ÚUªÖ›>Ò¤Iš›{ï9gŸ½×~8HL“¶ º&k³øñ±Öoíq±ð>Õd<ýÀ ¼ùjsª}µ=u飹³Ç8ÉÜÚä~Àq7»ºv†ýÕ‘ëÑàÞW¶5ëÓogûNðÍ;N¢Ö¿>~îH\‰'¬xÒ$¦ÙÊÑÆâ¬#M*Xk1Æb­ã׎“§û׸ö)Qû] vÞÊ‹‡? /wÂëÁi5}wÇÎÍÄ•˜ÍcƒyïsŒ±<0ÚÇÄk/­ ƒd˜_^'ö1”@Ó³xu–Òƒ‡Ï7¦7ÖM§µP”†RNŸÿƒÙù&ª4kd[?JudZÝ ýøv/¿Û1÷à½;t—ÇF,Fa¥02ØÃîíyhëèªÈç7 #  ; ì¢¹På÷®§h¶ ŒÈ]ûHŒ±±DÑráàsûØ:>̆áÞ•f¾qЏ£Ùø .ëÃnzœùëc4› ¬u÷ F,Î{­‚Ã/>Aó‹mpŠþöWT{`±ºƒv^årm/K¹Cå¿-"ŽVVrî§:Ö:¬uˆõXçõxvÏ4¨A €Ô¸8-|©-‹y›RkœûŽUiëqËÙ:‚ä<6v†¤o\BÑpœº¹‘‘ÃRkÁû`ù6\bÄaÄá} ÖUŦËjméãG6m `z¶‡¿®ÍÐìÛMK¹™hmpÎûR  ¨&ÑZ0"ôötòÂþGpÎS–•5élž¦64 m¡FÞpÈ–ç9ôä3q|üÉ1ŠB!b*ÀÈ'ÒXV¾Û?Þæ¹"ÏK¤\¢#ªE@7ø!n5"ÚéTihµ2ò¼@êÞk-ˆ8ŠBS¯/07×FÄR± †ÇÇ@†!ªâlÌÏ×S=1ªœ¢³3A©c Þù;¹>1b)µÁCº»DIÖÂûíPÝ…“ê“ß2Û±"OšÆ„à#ˆ¼_;–^'Z í¬ Z‰É²’f³@ÄÒ±4O64@TD\>Sçì̃,%½ØLa­#McŒŒ¼÷h­@=L†D)M‘+|š bqÎá½#Ë ßwžîÊ$¶PÝ›ðbñÞáœ#ŠÎY¼³‚‡É|­±R¥ ei°Ö‚Ç{7–rú W̦w3!„Õ‘“¤Bµšâ¼G¬[kÅíå©¢$[ja’˜~ü ¦?}ú dã×ï2èð]`˜l}€AIjÝ'Žxã{›7.ûpýz/óÿ7 @@Lÿÿ3ðýùó—ÿׯßü¿ÿãŸ?ñÿøñ“ŸáÏ7þC÷äøw¿äw°z gq_Î.'¶BHN8â¿?ƒ@±°²±\PT–’øú‹áßß? _¾~ºä ×/ß€ìŸ ïßýe`Ó<ÂÉÀð‘‘áÌ †çw3ääd¾þY hÿ?€bX·þô×O?þýÿ÷ïßÿiËŽþÉžýÿÄÅG`>¿=óÿß5¶ÿÿ1ÿÿ7›÷ÿæÃÿL¬Ö4¹´ˆéóç¿?|þÍðý7Éów0üÿİë£Û/À°ú÷ê¾_ ÄòåËw†Ÿ¿þ0<|úá+Рï?~2|ùþáÛ3†hÓÓ@E@×üge8~ý'ÃÑ7¢ ¿¾¼ð¤è‚?ŒÄ õÏ@Cþ!;++#Ã? ”"Ç qi†÷l ÿÞÿe8ú^šá /×ϯ€Œá0™ˆå(Ú>gP’ác0Õ–†8ìË'†§ï, pL½~û‹Á>4‹áñÞ« kÏžð—( Œ†ï Ä ß¿ÿdøùã/ë—@çÆÈûW *¬Š Ì\ ?Ÿ0œyÊÀðèï·/^Õ~eøÿ† Œ`ˈéÛ÷ ?“/0 ÿùÃÈðùó/p²þùS(mÍpìà?†›ÿt>¾ £¯ ¿~ý€À ɯtÁw†7oÞ1q±3|F)ˆÿÒûcàäºÅpñ‹Ã毟Á.ýŒ-HÂ`| ôßw€b%YP&ú*ÄtÅO`fúŽÖ7¯Þ‰h1üfádøÔÌÎÆÜ?ÿ~Aô3pþ9 €X¾|úÂúá冗ìÌ ?UÄ~ýüÄðûÿýžï¾ûÂðŸhã†Oïßíüò?0q°1€0@1òñ¹ßcbü/ÄÀø›››˜¡þ1üY ~P|ÿfW ôð× ¿ʱ¾c``Ò2>‘ívõ®”ÿIEND®B`‚sonic-visualiser-3.0.3/icons/help.png0000644000000000000000000000135213111512442015706 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  ­#½utIMEÓ 1q,(wIDATxÚu“ËKÔa†ŸïwgFS#aF³‹C:PØ@—¨ iU”îܹpá^Z†ä¶¹p•m¤Y¶,#Ô$hS"‘É[:::·ï;-tF*=p6çò¾çœ—£8ú†$$BTJ†Ô܈JŸV§þ Üy*} ]‡XS]¬lºH–4có£jâT€»ÃRm„ÉP­Äw ]­Š\¾€1àº6Ë¿ ¯Þ[|]uÚлðRíXe#L¶_ÒñáGpµ¡D¡XàZ“¶fõAE¸NxÖcó –‹0Yî³Êc_¨–øÃN‹í=M$d ûØÈÀÏ-8´¹~ÙG¾`¸;@´QÇ#ÒWP0ØÙ*ìçù¢p¾Æa÷¦àË2Ì,æ¨ Ú¤w vE#0àt Iȱ‰Õøëðl‡• ø¶ ë@¸Ñh˜]2¼ý¬0âQ]E¬¹_BŽÑ€gØ9´àðhž×Ž÷39žtCKØÏâšajŒݽÊ-u´céßÿëÛÓQ¤%\CjÕð| ÚBë&8FHe‹ŠÌ D!F µÉ#_„ïE­p킃œ€HÊšQéýC’Æ KmkÃ̲Cb´Qx6G„¬$ׯ´  c[{†s*^S¥ñÛ9.Ö© òWnu³„ˆ«È8?ª&~lÚ‰ÝÌa¥¨Ú§¹×¤£Í%TÒ¼±e)MbmÜ›pÊ;iCïôwÿäÍB.~+bã<Þ|ÏÇ‚ “çÓ‚fvÅK€ôžùL-ÒçY¥ÁHC. ø!³Ÿe1]•Ì•¬±2ó™ekî—‰bÔÚ¸sê;ÿ‰î¿Ù*µIEND®B`‚sonic-visualiser-3.0.3/icons/hh.gif0000644000000000000000000020404013111512442015335 0ustar 00000000000000GIF87aoý÷ÿÿÿskkkcc½­­ïÖÖ¥””œŒŒ{kkkZZcRR{ccsZZïÖÎçÎÆÎµ­µœ”„kcsZRcJBÞÆ½½¥œœ„{{cZïÞÖkZRœ{k­{c)ÿï県„{kcέœÆ¥”­Œ{¥„sœkRÖÆ½scZRB9¥{cœcBRRR÷ÞÎŒscÞµœkRBR9)111Æ­œ¥Œ{œ„s{cR½Œk{ZBÎ¥„­{RŒZ1Ƶ¥cZR¥”„Ö½¥kZJB1!)ÿ÷ï½µ­”Œ„÷çÖskcµ¥”RJB½¥Œ{kZ91)scR¥Œs1)!ZJ9„kRRB1kR9ÎÆ½­¥œŒ„{kcZ)!¥{JÖµŒÆ¥{½œs„kJ{cBcJ)ZB!ïΜB1µ¥ŒœŒsscJZJ1kR)„{kcZJœ„Z{scZRB91!Æ¥cZJ)”s1Œ„skcRRJ91)ÞÆŒZBcZB¥”cν„RJ1Œ{BkcB½µ{ccZRRJBB9kkZccRZZJ„„kRRB))!ssZccJ!!­­sZZ9œ­kZcJRc9JRBZkJRcBZcR!BR9RsJRZRJRJBJBcsc)1)JZJBRB!)!9J9!k{scsk9JB­Æ½k„{sŒ„ï÷÷µ½½ÖççÎÞÞÆÖÖckk½ÎÎ¥µµRZZZccœ­­Œœœ„””BJJ{ŒŒ9BB199”­­Œ¥¥ZkkJZZc{{9JJ1BBZks1BJ¥µ½)9BBJR9BRRRZ99BJB)!RZJscB”cB„cBs{c„”k”kJkkRcŒJk,oýÿû80ÁEiàB‚zØÐáD‰#ª¸1âDv\œ¸£ã@$Q‚„’e ”†Vž<óò$ ›6o2¤ó&KC,oÝÙ³(Q£By"%ªT©OCNAj*Ô «Ww:âiK–X¥:Ú ÉêØ«†ÆN- TíX³Ž¼ÆÝ:v‘#»vïÞÅûHï£E‹&ühR&Àÿž”øpâÇ"ÿmôxÑ£L([†<ù²äÌ %SÚ2åAŸ)^mÐ`ŸÃûP’=aÛ}Rz({bB…¹}_Ü|xÆ@"/–y͉@'¢Rä΋v@]ts‘!ìG£ ÿ=:5üx³ã{Šï4©y¦á¡êJÿ&ú®ZÓò”Ÿö¬U¨ý¥%VZe±åßUo%¨—]ä…W]¶Wbƒr—bˆ)Fág•ý…d‹ŒYˆž&bd˜}fYŠŠFšd’DÆ#0’#¿½–#AÍö›n¹ ÄÛ"a$d q4’’+-Ù‘L-5Sv'MÕ$J>¡Sy[jI•zíñÄåRd.•|Yé„Þx_fõUSX×P?íT ˜Š••ZÎuÕ"e‰u×T{ÕU(^|í˜e ‚Ø`Fʨb˜mÆ¢f#JÆ(‹›=æèh,F6j'®æâh1>"k<®z›@‹Tÿ2 4ÛC \p}xÔ$’À&ù$r$uÈETM€Y÷w@iùRQS)ÕÞQómiÔzØn[š>eÛ&XåÕ÷Ÿ˜þÇÔ„Ò•‚|’¯ ¶ÕŸœ†Jˆè‚ƒ 6©]B:b§>šâfVzic¡Hð‹-Â(*‡”ш£Ž;fl+oBv¬‚®FzÔñ’I.yѾ4RHe§–པÝJÍݤ%LÚb{í˜Ní—m·é©÷mÐj nšA™EÕZ~^µ–~tíD§› "8—^ –åV.¸`aˆ]øhÀZÆØ¿k ™c?ÜâÃN¬Ú#Î-£Ü‘I¢Z&¬ºÿÆ7B¶áöj 2Û­º-„D»ñÜF%4쯾ªÌrH,ßôÒ‹4'-O7COØqÇ™m–Y&špÀ§¦xQ­Ù-€uîWn~ðm%ÕPý½…n t] —ÖŽE`׃A¨oÙ}f™#½™`™j¸"‡•†[‹˜ævÄtsš¤j£«;öXmqlx¯ K¤pEVN’FÉ9IMÓ97Õ²DºNÒ ¯€°[ÊWP§:¡5ðg=#š}òd;´]hٓӾ△hÍ?´KŸä |åÅ„ÏcÀ õ¯ }¨S×Sц±¸‰f3qÕ‹ì†7Ä5‚³UBÿ╌áÊq½ºá‡$ §9ÕIIVâ‘–`g9DÂÎw®Ó“3€ntl2Ê餶º2F0[­Z‰6÷`ë]ú‘X´’à)Í]yJÕôèŸiíAsÙ—¢ö⯠ìm™R¡Ú*¥BP•EÁLܶÙC—ù&šÁå(ˆƒ£UC WøK‰HJâü~uû= S<Ö±\B%+}Ç3³SL°$6ºM¸DŠÏ̤:¥´n@#ãÏ€FŸµ<wQK“Ôþ<­˜Ekr±O¨5®` —XCÞ 3¤¢äe†ž!gÁ9‚(5’±aÝ"fªñÕ(2 ©Da#ÿ8QvL•+©’|´‘ˆŒ,e§$™ýˆµœ@|§A4‘’ÿx¢2qqNsš›–·Œ¶Ña– ™E颻óÈMºÔO7Ï25Þç]dTWúD¼¬ýÑPXÛ S½NJ†1Œ^ăIðµa.B*hÁ*Q!´bßlp³Ãõác ©F|5¿$~XÍ1ÙU@ÉKÈáŽsJrKç¸g9AÑJ‘3.ó®x]ŠHy"R “ŽqqWè8M.3í`/7—v}ðšõ:¢ô±AOlŠüiÚ4>ÍŠˆ0—¬a‹H¾Ò&ÕD6¢>a•ZÑÊ6‡kâx#?ÆÿQ‰‹óUXU¿'ùO$kõ ›³,—ð2"R¹hxÊC¤/á)™#EãM@ÊW@ˆô˜}ã3çã³úœ´š¢JÒ8XÓ¶¨E.ñBWð¼?ŠS‘bõfØ6­í{˜*êÄ*iZxr22š¼›ˆbľWùè© 9°mpå#ƒŽ$º*Ž’|µÐÊ='¬4‹³°8ÿáìfe‰\{y&× íÄ<ãÏúŠ]ìꆀÃú*L’.¶h@»]ºÐ" Š×->ÙJºàEžð-:á¾Â66:ùœ2ìéÚ8àÓŽ–bË!iDô…rÁ.bEà—DRvõ}_ háXÉfÿ1´ÿIPœâ.e‚@d§<K¼t-¿J“1.ÄzâëbÐR“qŠð‡"¤ñ—hñ±-s—ŒÖ²Œ-d òx°/Ô¼ÙÁ9™šùÂé¡*»ÂZ¯…ëüjlx½ï…6žú­²QßyÏÌøh¿Žª-Â>5çæc^ÙqPi² ;‡ÎΔH¨t,©`Ç‹ÐBŽ|4ÚKèÚÕ®m¼É a†!áKp0C^œ oðÀ Qˆ4 ºu>xÃÞ°ÆcÆxÆH T/½Ò]@¤ ”æŠÏÔFŸÇ>Êc€d^á½…P%Lždå—G¤…Õ:% •ÕÔŸæWEDÿµL&w­Z‰*UÃf*²s›©>5ª &¥oŽdP!T =™,ŸÝ‘7€ò\MŒÎÜn‹É‹;y .O:̦ô̹ˆ·t°î5Ö< ‚ÔÌ0)ðà B˜‚ áAâ˜iÐ ahëBåi¢½3¨Àa: Œ±²Ÿ·BC Â¼ûLjbÅwÆ«#¼0®j}%*R‡^§âû°´)²zzç:zëðer“ðÄM&üת –_) G?á@$ú‰W2KbM§¢XRŠ–ØêÐe=—™â¢–^‡Pö8à ߉!ÂK0Bt0„ ` p0Âÿ¨ †7,Á pø Ý:¨" <Ýï:G«Ï8îBùý>èýâ  ¯°†ÅX]ÁRs‚MhADH‚r–Õ<ÏSÒ!£·Y•‘6ÝóBxeWv"1R#¨òP%€ó*ÓdvD´7?‹#?ö+(Ól(óá9 RÙö2Ù¡V1!WÕ‚ÁT-ÞÁ-Ú5;oP@Ðp3ö…F0ñ—oàYøoàfÐPf h…ðvpàY(àhÕui$‚CP« ‚ÀWE wD‘` ¦I°†·Xüñ4äá.pÿ±GH†5&Ô<¬–!‚0š5zöÕ‰™Ñ)¢gzôÔ_ŸñkCôZëÊÃU]%2«x‘c2âtSÄ2×¶?D!u¼¤Õ¦b~ÆW§LB‘âç % C> FÐ I`=ðâ§`<ÐðÛŽa`0i0bðŒ€%P”õV‚cßâ~^X € [‘uo°h‡æR 0‚ ‰h[±i­Xý(ëæL‰Ò;Þá5d3YŒ¢yŸ‡y™˜È_ØCŠ™rk¡øªE1" Àf'h +ÀæI…f¶‡+YÿU$±Ë6ÍÁ[M"\ÆÂ2PÄ?Ù±K×&¾n)æÄjÀ¥p…ÀB :à|CÀDD@Ð,P†ðpðTPàÈ„DÀ „%p—D— PBð… T0™wóç† FÀ< @RЇ…ðF ˜n'ˆB0dB`Ð7o7o™Žo0oÐÁóxˆÅé5­IY0Г¢)ÒsT GIÂGZv#z2Dq8%˜s¶³af¾±{«Ä$4¨,²Ô$¥Vü£2ôb°³$„ãq)öKóa&ÿÑgj0Z(f02 @F+Ðà%`3`†D@Go –a . ëB0–=@ר=P}’i…ÿXhØi;~% •@|™ a0ò—i:RR%Óá9uã¡\Édu…`…ÄøK°pð@U P0%€D `¨Zy©, @Eÿà|Àg0  €†;à10@S`3À#`w9S°—g×ÔH2fp‚jo :°™iR«B o0Yx–Óèç(pÄȘp}:˜BPi°côAN‘Ø5za}A­¸tN§›ž§6œ¨r ‰NÆ›Ÿ±r¤%>«DtŠ3U¹AJ€?£Ô®¶çU;ù¥˜3”ÉVÑáVÏvEÓ"3°$AxFQ‘gPCpŒh7@nžp~pC0Ÿðˆªa aðpvàSP GP|ð2Àð'à ¨h™¬jp ÿ°•0@ ü9™b°†‚ðöi&`P<i «Œ©Œ7ÀŽ;ŽUH‹ö:àR ¬€°†y7Éšígx4j0c$äšLv‚¤••H>êd$×Q†›¥×"¨'O #ìz‚S+» ”0J†“¸öÃDFâ$¸×“JB\€â?!уüóƒ§C:vÒmE-n4Á*I ¨ P:`b  E~oÐ `F`Ppf°»C À:PpTpEðrùpP`2 Pk:2%@à=€`ÿé<À´CSàŸžP`¼À¢hG@`g@@våHS0 ;ãË—<0´¾j ²a€pë&x$†àp€£‚‘³‘S)”)gC·à’ÝJ\=JªkU&"*ù$h+ƒ`UZPQ¸q¸‰;aÎùœ³”,4#Kcõ¯Ý^Ô”3æ†ù¹ó±¤¹¬†P:»—UغE``8 à0 eÈ,ð&ÐG€;ppIRT@ofàjàNÀ@P À°…b† A•!²>‹Rÿ Pð opTà…"@ókv&:ë: P¾BðS˜˜<`¥œvaÇnGq|5ci‘u0`<ïå€+$)”(·gƒ¹ù“pkiÂÄ,>þs”Ð`)ÈZ½âD“”Y%¯9 ¹Æ”s,"T¤VbvR(‘Gñ`ô3&pnO;p` KF=Àö™b@»p0€ JÀÆpgJp|àGP'Fà¡ 0p¬;J ¼qPÇ0ðZ(ð¼@b8Ÿß— @)ÝApj€¿w|ÿv  0ð&0Ü<;pf@°½%0Ø;2 „Ýë¡`º¦lš}hk'C ‘Á*(vŒµ!‘!·G_°Öd°Æ­›zÂà‚J5ÏÌ®ÓÜ+ï l·—ÉÙ®ˆ»lfP…‹P=y9³„\ñžó{vuÙÖVüá2›¹Lÿ™`õÆD I€`¶kF° @`ÅJ0& k M`ÐJÀ¢V† ðJð½²{Pø oy©vIðÐDÝÛŸÌÆø©ïIpðÐDÐŽ,À•ÿ¬jÀPÉ àÈÜ‹¼ pì Ô`Ÿë`1С%PPDàPšÐ§Ï«,wå8´Ì7}xa‘0’}Á?åjDeŸ'e½IŠ6„**ü®5IZEEêP^%f&ƒÍNâ*€aUäÍfVu5ãÁe;ÛA*v…à˜`pÔDP.P"jK0  pÏеàpP°hqЩM@%@½ ¨0Nàég‘©Òøf¿"À[˜Ò<û-«a ˜ljе"*=@ŸK p–i fþ,1ÿ-9  q`T@ ½BÀ½0Æ&pI8 ³AÐB`¾êF %à|RÑkCàZˆ‚YÌ/ûB‰Ä¬yô"šµ­Gú=RzNŠ08…óTUš Ö+ ¶»“€­D@ç“B§2Ttg÷šÀµ;º363F°ãEP·TÐŽSP<`<°aBÀ§, 3p©í~Ð& p &ÐT°f`H°u U ŸJ°pàfÐZÜÙ,À´ð• LΗÀPîøH„\äÐÒð2`'ÓgP ÿ ©€Ú¹+éÿk0y p“>»¨€ÀU¨ŒYµjôR°o i hï÷µ”–qÇ‘•á|q·|á™X_Üš·F#}[ZLõz&¸1cæáíŠÍÁ±{+ÃJDò‚m6acE$U¹åEÛYm;á£Ãî!žÁŠÕSðé  \"`•Êa@C=cÀÔUl Jð¤zo æ@ùÆc0(°SвN€œlù¾aºÛ{< Ý=4 +àE ïJ°àã; †ðI-ÝÀùVPp£<à¿€Pÿàf²ŽÉ´pƃ€ MàÅ’L}Ü¡¦<Рßx–=0ÿ%°ŽPi ˜o@a` À ñ!GŽ-2Xð ÁE6,øá#‰“6|4‰âA‰)zÜøQ¤È†AŠ4’"#”¹dùˆRŸ>‹f.ê)g J‹ ¢¹(ÐÏœ:ùhÒ¡?™:êÒCJM t¤[»îXÔõ  °€Ì޽jh µfÍB2dÖP•?†Ìxà!(¦<àq!„Xøø„G*¼I†H~üÀ¨âáÀ<tp`$†† (1ÑDŽxÀ Äsÿ„¾ ÄA¤CŒ7 xÌàኚPMà¡C1Â8h‚‚ƒ tDð¼CI‘(P‘v%G<â€Â:¦TQ²fHEd¸0Bþ:z”P=èá´ 0@¦€`¼+aŠ7.!ˆ ErD"†6t¨ÃŽ É¢‘J ©!>D‘$•F)¥G\|1F•J'œr**©œ|2j«>†*ê§­”"R)§ˆ’ÈŒìj(±„\r@D«¸¦4d+ãºÐ,µrkÊ*Í 3„ƒ$LXP?ÎàŒhxÁ„$4€À‚7((¡‚鄘@ ?Žäˆ8ÿÌxã ܈A¿$,hÀ%ùÁŒ ðã0Yb ( ƒÞø´‡Üp‰ ÞðÀVýà"„‚B(è#b%â 8 ÐËõ@·é(ص(üIJøhäd€ ÐÀxá¦#`€̘b€)xðÀˆ„˜‚ŠB"ò8ÊÐ ‰Hô·_„8òÈ$“R\QE‚?*éà„~‰¢ˆq⩞júq&kÔéGŽ„D!süñ)™2ò #“ÚL«¨Ô fHÜëª0©Úáá8cˆ)LX‚À „ð <Ð@† $(€ˆ$P"ƒÿƈÀAV Â*ˆA ?TèÔ „ Æ@âW ¸ó’ð@–ðƒCñŠ t !.8Ádè¡‚TU‡&à¬×z la…£ ˆ4äPã‚xÀ„#`ô*0H¯"ˆ¢‡ ~ð! AùHàˆ% x`¨0À;.µí¸~3v8`Š) xCƒ7:ó6 Cb§bˆ7ЍÐ-G,„ˆD’H„h#ðK ©`•~¸%ŠR‚‘"IDºØÆ q\Š’!ÚJª#=ÖÿH$• [Œ$¤3t%,S™X®4©ØL.n‰Kª`ˆ" Á0çÌ`‚ÿ0­hÎô ðbL8ø€+( ÆÀƒœÁ}€ À"Tà.ÐÁˆ@D9A4°”°(X¡ ˜TrˆÐ€ B>8Û>È)1 À’аkƒ tЀ0„Ár+(£ °† <W( nÈEݨ¸rÀ¢p—?( (› ®  XR€ð€ <€Ê®ˆÃÉ2=¶HØäc8ŠfSŠDÍ•-¥šYáJ6©¤Ú–q%,T²Ufæ±%LÈÎ$!8=x×,$èÀ9=ȤzЃˆ y;$@LЀø€¨`€NY’LV¤%Q3*H™R6¥Ä‡³Ìl,gÐ’Z«@%/ Ä&„΄UÔSW™Äd ŒÐ!°í (ð† ê`Á<ý°† 8€ UØàšpˆ&o8C&`8A%0à ԃ0Xa KЀ* 4Áf€€ä0¥o¨€â0%œ¡Aà :C%¼ ¬@ .0Ló`…~Ę ‚uW Ù HÂH¸H@<¸6¾ªß= žâª@aÿt±டŒ4üD( (A$!7˜;˜‚ŒÀ#<`@–‚a ‘Ü!„%…¾ç¡ôë±áërù¸¼¾=Œ˜Šýx’$£E)” íOD6ÀÒRdáüX¢ä²(³.kË”Þ ˜¶&Hƒ>j„0ðÀÐAtà< ~Nfà‚$°€«Ž]>Qá~ƒtpà~éNQ(4á ðh°?$A,Ãt˜Ï € „Ô´Ö  X >@B7ÒA=Èì5¢’ƒt HƒXPßÔ\ N`Á0ÿ ¿¹ÊgÐ#&ð†²Ÿ‹+xÌ*`.t=`HÀ¨0Pà]<,@€x.]€.u€Œrù%x€Pý( Mˆ(È»25Ë‹9d½çË™¤}”‘x ›¨ŸS ŒiŠ¢ºA!9™Ó -tÀ¯àŠ )ƒ C¨@´PA€°)ø¥H#‚0¨#(Å•X¾H H›0˜€ˆ€ÂË€0êƒ H‚hSƒ#8‚50 xÀS½ ‚8P!Pøb)(x8+ˆ[ƒ03hÀ+ð5'˜µ`RK‚38¯iÿts À€0¨*àcÓ€z ƒ^á%8=‰ƒ9\ƒ0 ˜ˆk³€%(ò Bˆƒ €»¨€€²²7 0€ $(¾ ؘ‚ €(n¡È€ °€cy€¦² ßá“P%21„"Ð…xC(*˜‚îƒÁц™)Æ„Á²šS bª9! ºÌ­ ºÿ!-lt&fR-§Ð@@£ºà3´¸Šk‚)hØ vá!X*¿5bð3€Ád" ø€öSH"H*%¸$%0ƒÀ<' 9ð®7ÐD%à€ÿ4è€>("Ð9Д5Hƒ88„¨I‚$˜0X5+(*ôƒ5 H#P(X62 8‚M–7'°#*ˆ20H‚"€?ؘâ8 ‚€ƒ#¸ LX5…LE¶²7•øäÀÄQ2ºÃD¯¬õkÐ °€ ˆ¨€í8ˆc•öó–x”ŒAà—G¨8„0`Vj¬‘9ƺ²,›,Åì¿Çt‰G°jÔ‰<ŠÜ й‘ž“³ûiŠÎt&)ɦhÚ®(‚À->Ç ¼ 3H ð)è*`*M2ƒÙ Ñ›‚0ˆÿ5X¤Àxƒ'Xªé˜PxƒXª‚%ø€P%¨0‚à𺠀Д)À°‚7(ÈNX‚€‚Žb©3Hƒ#¸›‘‚±‘'P hÁ¿9%P9¸ Xo›‘ò4ü€X+Ø!Öq E0£0òøBMi(Jz?ˆƒ"@/*ˆE°±JRž¸€$ ‚!Pà° `3È€§ „äH°€õc¿î+‚–1ƒ“¸@€ƒB(@(Jò€7€à ˜‰°2bd9ÇÌR‘XÆ„‰‰` ùÒùÌÎJ@’ÿ’ŠÎBŠlœ&ntÀÕZÒ¦?€)„?8Í?€ƒ¼ò)¸3à 諸´7¢]€Í ¯} ¯ 0ƒPPð€xƒÐ›8ðƒ7¨s›€P‚Ø HMQ‚БZ‚$X …5p€8 è¶ øÍH@U˰X3h¶ ˜‚0 0I‘">$Ð= +ðD-Ž/À€à€ È PB»ÁÂÈA˜#%p"±â\!‚)8!€ 8`/*8ƒ ‹X+ `¨>Sƒ ¸ ްQHž0º2ê €*ø€ÿ>ðƒ (í{QÇ£$*(‚"0XšÒˆ89Çä—ã¿.m9ÈSš{„˜xŸGxŸF  ó˜g­¡°‰¨ˆ¦‘iÓü1Àk<-<Õ ® \,Í*È ¼J2à›Æ¨¨ 4 À$ë›Aè7øO0%©O“˜”€!(‚! s³Ú¼)‚5ˆ”ƒ(°à8°Î$°Bø&à_ˆ1ÐH9…8ˆ€¨9X8h¢aá;JëC5Ð*% !¨€pàÈN¨  ø¢ (£0`?‚C°¯ Ѐ1€8ƒ TÀ©€€Ä;ÿ º0€¨€@`8àUY!€)X€5| ˆ Àƒ#ب?8¹´òZ™Ýá0\ˆ+!ظ0H2>•2‘=F)Æ*+Ù-¥ßÆlF0ü¥ˆžx&š`3 ûÌ£8™2½YÑ ­¤ÀS"¹ ( ¤ “¼À"`[) ‚¢!Åäh°'Q1‚‚ péÊ€H… )+ðÀÖ«%P‹º/€PÀ‚$È+ø#Øà€¡õ…»á­0Õ¾PE#È9È›&H‚½ûC(`]%Ëh‚ x›$xñÚ(Š£7'xÿ"À€!P¢5P] °‚$` (r ÐPõ°#¨P+€]€8p‚1Xò•!: ƒQlE­z3è‹p‚*À–.Ô-»+8£1¹²>€‚(–s2] 9ø„@p‘ ±!ˆøuL”U +ƒ¹+}˜0µ¹˜¨ÆüÑe i&i‚3àä9#I` ü‰%©’Š?x38ƒ*(ƒÅ)ø¢£‘‚\! `ö2ƒ#ƒð!è€@Ø/CÒ_)Pƒ3¸€3XÐQ“ƒwDµ‚#8+ÈÕ4h€åÕÅg+0ÄCÕ€d>&ƒ 8!^C‚1è$h(€ÿ p  Uø3ˆþÌâ"Pƒ@ÈM^ñ­ ÑH(8 ð ßl‚ù`Ýæ '@‚h{’áò.±L‚ # Ø&ÃÕk€ðhE‹ú£œ‚º9„6 3€>î˜h ЮLÒ€ K>ðƒF0 ((~ʤ_<µAˆ5ØÅ©Òa¼¥ÆRL—ÛÈLŸöùRÉ,6ºÎM¢ãeŸm -é,p¤¦<ËŠ¡¨ŠÙb 81)`¸…ä±ô£°gî¢Ýé*JxÝ0”ƒ4Ø´Í;ãì“0É…h9ðiað"„´mg‚5X¾§œCÿ˜ÃÔ`€H >H]Õ}vJ' dÕ*( V¨[XU B˰Œ#0(…\Ñ€pÕlc ¨U"¯ÃȧYqx]ŠüC1¤0ð‰U¨ÙC%p‚'¨PQhØÊS×)È€þ#ˆÃ¨X˜ªdÝ#@ÀWàª"Õ ÐDƒÁj A*P…mRR@(ÈÂ2,- “ÕR-…eÈÓ1fι óYÁÖŸü]ž™ÃÞ nB "xƒP4HŽ À€Hd^% >ÉåHS¢ 0øìM0¶  ‚ Èzå 0ˆÕu©‘º[%0ÿÕ`#&|ƒ#‚H€ƒŽ“¯‡öp%' ‚ P#ƒ3PÜÕ“C²n–dÐ3á5€â¿#%¡¸T È` H¼ØÐÕ#ðÛP-#  ·H0Ò»®ûQð8% „WCù¼$8—M[$Pi85¨#p! WP•šŽð€Ú™Dà0- '`ª²²€Ð…U4(M÷+©—³ÄrëY.F”¥eºVŸ—ø2Éœ‰úÁÙΜq¥ð‰«ÀÙî Ϭ&¸H1¡d‚$#áš‚ 4L’‚ õƒ P5Ë•“ º€ÿ>X5‘’ƒ8`;`x%È.Å)»U p‚B©-²A's[ƒ9ú< à¡`€×!  PÈiþlÉ‘‚#à™¼Qƒ€Ÿg)x¨0å¸0°ù%€âLAÉe™€ƒê§˜­4@ B݃ÐUO¨@@p‘š'  ™ƒ° ü®ôiÿ>8K¦ØtóGHëÁŠK”€ƒ Hƒ]Y°€Â€+!;¬ãåyƒ&ck’5 Y^L•¨ƒrçR_Rë™K‰/ÿ~3¢“ ÙÙ™9ºÕrºzÏñ&á Ø‹®ð$£0P4ÿ*€›)ð€wU8‚Km‚Z(«É˜ˆöƒ½ +¨“ðR'Pƒ]ƒ:xX¿åZøC¯ý²®¬Ñ5·•è)X€‚5ƒ!ÀÔ©2·‚äwse]Ê]5T%Ø@h=òƒˆP¡òàA˜ø¬Q¢J„0ÕjÔÈ¡$<¼˜±BF˜fðXAdˆDt¼¡rÀŒ‰x¼aaÁD(ð¸ g € ƒ>"˜‰håçà &,L© b†…«$° ‚@ bBT<˜¢ÃÀ›B†=rTç‘!C€ 9ZäèÑ¢º~ÿ÷ý[÷0]Ãt/nìø1ÝAI~TÙ2]J”õ D $J õÚ´éÑ£Aï0 ÒkHb«†tÆô¢Ö¯wÚq{öŽÙ„4àMTì1À<AÀàÈj¢æ„B"ý˜ª+8ÄñŒŸ5ñ­Ä’$B(@y4 02¬‘D F˜ÀÁF8ð€ ¼D ¨ñÉÑ X&V0Pá ~(ÑÄ!V˜ø 1ôC¼ñrE(¡žj4ÒD~ã!V8ñMJLƒa<À¼Â*9@‹>\ XPô@€ÿTÄ ðPâ‡PøðÆø¡^J8qÆoXðF3Å0Œù€Æ`ä0À aB 0Å‚È5—#pR„ EÀ±¥õ•X`‹92]¤z ª©22Ùbœ¥6Zi«™¹Zj¨¥œl¹Êºk´ÆÚl£íÈlEüñF2(dppÀÌöH&|PB`À~4aK@á¡/àñƒ‰„0pa$ö¹ ß jÈ¡jòЃMœ¡A D¡A<(‘F>ÔÁAôpÆ}ô¸ÆP0  €ÂAêBˆæV @ȱD|°ƒÿˆ'dáÇJlB‘D ‡¼rˆ`„&˜ b „0‚oÐ LDôÀƒtÐ@ Bý†˜QÐ}ˆøÐoÀÕˆkÄqÆ+gp†NH` >PÂÛnûÆ2ôi@…PÄT@0w BP_†"öFÀe,†øµÈ`fù©˜3–ªc”­Š™c• "Zg Ñjºé«©Pëh¿Bbl¾Â&¬lÄÎ.;ì°õæk EPñ‡°¨$S8à€jxé@%L ÄgDð¼8ð‚úÔo˜Ð’@ƒòÅa r˜y@"üìjø€€à8$jÐJ@g=8x…‹5Á C¨å¨±†Œé ãùà -T@åðT ÈöA1(a`h€Ì` ƒˆ<× “PÀŒèÀ†rè€ ¸a‚€<ƒœpG%àlÏ{Á8TÁµÍj0£P  °éY£P€Ô–)¤…oý*ÜŒ€!L¡§À* !dŽ(LÿåüÒ)Fjns|ëb*ƒÊm’“¹‚Ä"N';Ôà 4¼Â믫;_­R•«¬‚¤ …7Eà€ Xd9øágèI<€3©§ èÖ¬@ˆHÀKøA~p<(éMðà À üàdðÁ & † B8C¼Ô…&ÁlôÉšž†=©Ç k|CÇ’÷†’ÂdZŒ†D‹ Kœa ‚` ^² qH ~ˆ@ 0`%€\G8‚p/#ô` IXA:@ =H‚ à‡%˜ax¢ *#4â`ª‚VÐô "A ¡à_eÿ#< qcÉÌ > àКšò—8g` ð¤*,jQ¸É¦‹7áo˜Å¡J@ ŒR‚øÃ>•9Ħ‘Tv+\3ˆÏ5†VvýL&q“º»º.8£|Í^“Ý¡rX¯™ þP¬±˜@>@ÒÛ*ä¨Á PB°ÏÚN ñàô MXƒt( Á uHBÔ 8  f8B âƒC0M1Ð E¢ r°À À zKð¸\+`ƒ†™Œ @,! ÞQŽÖ¬Ãð€ „ÿ;R@+èÀÔd°¾ À@X ð,àÛ$T0cëÁžœl@ƒ'ŒÁ"F€„æqïlK ‚â€àˆBÀ{E½E˜¨!@€ˆ”T!°¸Ð'3lM(ž¸„´Â®h… òÉ@l1 o`‹¢¼Ë Æ`PJ"ÍÜåX™fYcpÙ#”Ö ê¬Ž­ÐÎèF®”’mŒ’mÄNkèÆ*µÆ±™ü4@ì× A@ ôHÔAJ€«Å¼–½@A`ÀÀéáAh€Ô KüÿÀЀŸ ®Rn–¬î@ AAÀÀÁ,Á D€\€lBð¨5øXÌ÷0ž|Ž °µÑÐÞ- (Aú8 $x× ”dlÁØ×d ¦™ °MÄAÔ!ÚˆÿÚÀÀ| $XÀp=Ä_šÀôˆß1ÑÀȰ0fð@ÌèÇÖPÀÀÃB¼ A®!‰Õž<¥ù€’êÀ@€ÈP<áÒXÀ$[h©œ‰8€E™ÁLÀÅ/Š,n‘ÁîÚÞÙKøÐ8¥ Ñ™@TÂ0 CHƒ í€XËB%ÂLcl-×ÊT––‘“ñfè€E[UN•¹U[- ª$]|e,ê0g˜ÕÊš±ê`R*¥¯Èªßn§+IÁ¤åüÁ¤Å ‰BE¾g ^¹µšµLERÛ ÿ)nØ€B¯:ŒØ¹Ð ,À.A¨9¤]¦ÔÇ d€yy\!šDÐD€,Œ*x@ÁE‚ÂÅÌ‹F(ü@¦K½­Gœ@lwÀAÁ)¼A€©Q ð¢†THŒŒÒ¨òô€¨Á©AI2Áh€LØrð;Aü¢¸¸ŒÁ “,¡H€“蘀òµ•~„¯ö„×­1Ô‚dÀ„@$À{ ˜¼4H“!ŠRUÅIÅ”Ö ARA°ZN§8Æ_˜ d<ÍARÎÑÅ6êÊ«à£i´Æ«~Ò™áÎtêNae'ÿx‚ñ4€Ð.¢œÀË´à!¨@tî@ó®Ýh p€ð ïà˜éHÖˆX LÀ 4[fàÁL@\&ìzÓ|OÄAñ5€UÚœ(œ€ 䔤~'O ï‡È§2¹€|ï!8DƤ$W\€|<|AÔž”«²%Ì,ùÊÀÀ¤è²€‡IÀ …ÑjºfPÁœÚâúX@(c’tXÐ^/ÆCÌ/âÅé† èÖžÖ‡àÈLÃ8®ò{“ô4ÀÚøÆ\€ œ P¢Ä˜YÁ^T™ ÆåXÿN;ZÙ;fÙ<Òm¯ÄFì¨j'ùU@±› qØ àDÀ3£ ”€¬¸‰œ@h‚<À¬5„‡ü‘…2(¯ˆ‹óáÁ;É5è$·Žˆ ¬5›8Á2Õ´ÇPQ¨Á™@Ap¨|¡ !ÀL?“ŸÜ„ˆržÉdPœ,²U@\ôŒâˆ‰°Ú‡`ëSÂÈðÀ˜ln9I8Š\„‰¬‡!¤0ÏH(Ët€\Ä·˜WïðÀÀ9¿ÈPA,@b@ÔžÂ,€Ør„A ó/b ü•šÔ‚y©‰hõÐêL®ÅžŽHCHÿÀ TÀ,ªLð'¨˜‹ü_üÅ`$†aÔA§Âs¨Úr2‚ÍiÒ܆Òî8gÞÆFa¥lè?Ëên¯RÇ\!PA hH˜ñßz DB=r¼›ñï tKWKhÖD¸G¦¥iàT×GÚ©A,ñåíöšˆÀ ¿*É®m üHdù5Ðhw(AT@ ˜‡x DZÌE·eŽÀ× Äü‹xóMQBoá‡` WÅiðvma:Ä|€|˜€ÄÀ·IÊ$ÀHÍ P@Ô8x.*  Ì@ˆ€ÿ€¾ñí¨ÀE€Íl6r‚lÔÄ¡‰àHœ¨À @0€+T'Ä%äæYùE™‹Š¦–6j³-ªÄ0dH’ ׆_¡¦*lh âsoû­ßÂ"4XgŸÀˆHwš½€ê ‚ÈÌùÄÁÈ€µB/DÖÁ€ÐwÛŒ!|+´M¥ŽÁZ¾´€IìXœ¤ºC„‘€AªÞnI2›À´9„˜À8AEâª{ͨ°7PÅt%š(À8AD€  @X€ôP «u‚!GÑhÅ(ˆÁ €˜À¥RtDz_ ŒÿÓ œ@Åm€À‡AÁÓª¡IÀ¬“,Y^ TA|¦­ý«´øõøNK=mK˜Aì€ É –ÄÀT9Á¦à¦¦’ö"¥£p†›‹<]¸9Úð]ÑÝ3Òé³vòF›–kÈ*ðŸ›Éȧ¢u‰ñ‰ß¤Ÿx 3f¦0‰ü8Lü`PâzA‹ã 8#¢5~<œ€ã+ÔÀ£ •À#(yá 'za¢—^‚ÿá§#Î8£@ì‚’@2ÈàN˜ ‚4˜£#2zH‰#ŠˆÀ *–HA8hB Ì0Á+d°H(ÌÀÞªðA80Ê#À !Ò ëºŠÎ¸2€Ë%&SÃ4ˆ€‡hà)˜â€"@¢‡7© Vx€'Ô8Ä" Á‡%f# èŠ L˜¢)¨˜È5%±Ï&x‚Nó 6*ŠD@àŒ3°µ‚‚t0@" DZA ÎåAN¸ä´¥îº:¼ÅNÜí Yd¼îv„d8øê;¯=v‰+¾ùÚÃ?þðƒC ÿC ÌPC% !„‡èhà ñx¡&"áà‡  X ü€¢a âP ŠK2>­ƒ2?P†1+ÕÈØf…©FÿÎðÕ‡3ªÈÀµ*’Ø45ŽðáÞ¨ ‚¬à€ƒ¤ò#‰0 àA±â *Öå-L¸l"2èŒÄŠ|H‚3"(?9$i“#Þh€d€  ˆ¨ ‰ ˆè€)†0áçF&:aŒ7Þ¸ ‚a '.˜x¨@‡0,µ:`ö6 8ñL8 (2XÍ® X0àRuS4@âˆÑÑÞ(`v0À@ †xƒŠX`1ÿÀ“?®un¹k©C\oÃÅN»qÑÏÜyá-7¾ôÞu¯^ðƧÏÞøôÓ×ÞAœÀÒ„8"ñcˆ•LÓŠ&Ö㈆áPƒ'9þR"†MÆ ƒÂƒ8à‡ÙE K€Ã^‘%AÁ'  ËT…˜âv±Qh‡ ˜s(ÂÖá~0ÙHk^¦†`‚N:ÂÆpÿå$'J«“€— èª eaÀ!‰ZX àA ( ƒØ­Ð@"ôà c ÃRŸÄ!9“À@@ˆ  BÞÚ: ÌÑ ˆÁˆ& |€mMðÃ|W‚¬ê?¹ÿ@Ð`C8€v`¤Fô!ÀúSiP!…Þ ÁS(Àñ‡j‡9¤4Žu½q­’•ã‘Wwȇ.xÇ|û’Oùìs>{U!?çÓ× Ôà8"UÄšð·l ˆqÀÃYÒ +`Œ SZîÖ†UŒB\eà°„ <Ä~,'¦š £‡$Í „X Zve¬â!§'$ <¸‰ª„@aX(Ñ”vÂE %8BÊH4á8”L…C(4V„ØÄ&ÚvŸœà'`A`7LŠ1ƒ®Èƒ`àT°K l„!h@¦+p@ÔdÀÿ€Ž+Ђ4`ƒ(Ø`ˆŒÀ@–ÄUpv´ËA 1¨Àh`Ç")„3þ iHôðÚä&;™”wþuvä®î¹ç<øÚrcÏgýø„9²€8¹ÈQ;£¬c TšðZ¸ _D©0— Ê›`ÓÉù<¬Îæ'ÐÉËr1aA¤ŽÍ•ÀPÆ3ã#â€dVÄ – Hè1>ÀpDÈWä)SÈ‹|‡D'>лÿ”†B© * žmÈ Ae’¦B fi¨¢u0‡Ä5Lç2 ¿,@œ$` Y„ `GX` – àMD@ÐÍ'fEŒeNà¶cšånG4Àß A@2 ,G~Œ  ÇdgŽJ@ àP L!QêÍŒ€<é ’ì´¥:–O\þðù«°ÆCú° –ËËB®ûKåÄ åÐGåX® cuò‡BÐo2ª«aGñt@$À B z€à¢J^@c"hÑâþ¬@lvG!c2 hàgàÏ~ÅqL`âÀ?–à $LàO¾ª¦àÞbà›Ä¢ N eÔàŒ `> Ñ"fÔ’2dh%œ@SúGcÎà,à7G2îVÃ*@ àÀ a ¦€%gcŦ@{£ÐC:–C°RéùÔ€•áz¬lã¦oË€Ò|1(¿8NŽ?TŽäNÎÄe™$ªB¾2c ˆš@*·D-ôç€2æA þB,$h@"™âÆ`ðkE |áÿÍëÄè~è,.,Ñ Þ`ÞÀ , .Ï€$ÏÀ@a @> !a€ à51À<À.¶$.a0Á ì ! X@ €ä+ €àQìÈx€h†ª~€AüÀ €‚z‚TüC @&Àè,$ D€’`¬Ì€(Èåp' À’…‘x…­ ` ú«(@P'u®Äj÷e  $§€Lƒ€ Àü‹à:U®XÒ† ¦#[œ¬:œC°R•=­c'Û–æó>êÓ±´O—ø@?NîûNNåNnXÁÎ2d,¦é~¤íÎÜb,ÿí0¦)~Ô€,4‘ˆÂZAñ0¢­@‚b Š¢ýhDh± @ëŒÂ'"¢+}à8¥­xà 6ÅV HÌ„Ì@- àÒÒà,Ë Rc6\¡ð„YáòÀD’` B "@" Fx0d TÌ|Í# z YJÀ  $å/œ 0çLÀ#gFↀ…Œ)ôÆ“‰ ³Z3 €½Tr* ÐF¦åÅl5ú ÀpC;  6eà %Aõ F‰:þŠù®ã&‹Vñ–fÕ^Ì#WƒɶäìE_ a$ÆÎTiTÐPfÍ~¢"ÿÛéjTb@«J:Fi|™c/ŠÑöäF ˜È‚‹êmAœ‘,€à"VG 42"&ãŒÜõ†Å;e9©£-0@ÐŽ@ø@Á`B01 ð±, xà´aÁF4„Ú@ „ HâdÎô "À¬¨(à >Ç2` Ì.à nEG•t¢Áíe'MÀVŒX@…‚Ä@7p…t"¶fˆqd¹àŠ`æ7®  º3jn fA 9 ¬:TIÇ…Þs;Èç\Þ¥]>n׃ÉvûR)ÕçWÏcXí,!Éb!£í-ÿ\¤,T‚/ÉÎ΢ Z ´r¢ƒ ƒKDëþ€Ò„â·(F¤mwêMê˜Q Éi2¤ŠÒŠs *O’7¨dÀläµ@„~ÄÕÑ\ÍðF¡|à1Ì@‚Ô3Õ¢+âÆ@(€¡Ò”`„ À‘Z“ŒW…„@#(/úõI† `4à ä5ì‚,BÊo¡ ŠƒŠ 2j 0Óbt€t§"èD¢œ–„v`¼š¨XªÀ:ëR# ˜ç8Niùš¯U ø:`5VµLú±—êÅV‡ò^d¹lï#?½OåÔÖ?ºeÒo"P°*ŠìlçFx7¡@i–dÍÿ2F{;+ šÒ\Û© B0riHVšQ ðÉ•\Õ\Q 2ÙàiS*,bŒh×/L@…Ö@-v'eü™‚Í6ÁZ¡0ÁA•¦¤ˆJiUúø>îÃúq‚ñãû.ÿs€éÌý&¢³2 &£ëÖa¢õF;â…+'„ÿ„NDêÿPð,7*‡sxš›À`‚ë~–5HŽ3Ìù hà &`Ž€ ¤é!”vŒ=#.Ž` Xr@¹* v  †î»º„N ™ €JjˆÁ~`Rd F˂Ϊk "`#«@<Žà|Å!Ö  ЍÀ ª`´b¤a`Þ"`Å8Io®È$à~  ë’€ÞŽ €ñø Š`®)uòÀf!àrÀ»öBiK¹ùX•+Ž• £©{Ò»L–Çö>»Oûòmõ3>p'#áÌÎb—•wt­{Q¦D /WÑeîO+:KIš vb “‡þÒü`¢ÿ¸F¤W‡ÙnF$¸ZëeDb "à8ÑNðˆÊ×2oë²*¢Õk  TÀ3˜$`âúˆ:áN.boƒ"Ù¦X'L”àsVàŽ Ú”LX¨Yíp°À~ÄfÍŽ G?І´Frdw2`@,@¥Œ‘µ°Þå6€¶ÇÕ †@oÏ @Êû2…Ù¼3ô°ZXÉyTõ”«£=®lV½–?¦ûÐÇú"=–-½()+>ª`Ìv! Âå^"SÆû˜p"øÌ¶XnKá%nâ'†ËȘöÎѸD¤$Š,¢­³`@‡wxD…Ë`ÚiNTô,þ‚%ÆÞÿf@^jf@˜}ÌðrL€#–ÀŒÀH7Õ@h Û¹XÃSͦà èD{w"hAP¢¦«Út¹ßÀ`š€±…"i¦ÑÎ >  ÆK ÎHWÌ@M?£ƒc Ä&bD0 7@ôŒ‡ÂNà >€5 ·gåÄ<_,Õ:Q¦ Bi:ÑÞ{°æ[\!'c•c©ãè#—Æ'ªi9ûÒÖûÀÌ^Š@”XnX;&+=H¼T"cÆ´ä)!«¤Yߢ,´¢í×$¸ ÒêbÃpµn‡k±¯«.V VšR‚․škh©hÀž@ \ŠÿtàŠ Òœòq ,¢Ó  ¦|Ä Ž`ßà”&(ˆb(v‚"â|@ÂTL`*#bn]×bæŒF̆>@ šÍ.`ΠG…¼Ò$(Ô" ¹ åªñ*f,£ÔQ&,{³hi7¦À àRC·“¦ÀYBY©¥Ì”Rã £=©u²¾²ìûË´ÒñÅ¿¿¬W‹ 5$"{ÿ2F2Ž€åz qÀs5ñîÜnDÁ>0Õ’äÝ?ç&â´¹\G´ê:00ɹÂ5jN@ñq†Æ IXh˜‘Dƒ2àC”F €bp‚Ç8ÿ9¬QÃÃ?5ràÀÈ¡MVµäÈÁÄ?Mœ˜y‡%V”UÈOJš`Rß@ttƒƒoXXx ÃÇššVšHõƒ©É¡HMšÈ‰$Ç­[+rüœ8‚Wê>¨xàÁB˜ (œ’2…Š€*~z˜Rà GŽ=ªó¨²åÍ›5kæ :thH€ ‘6]:õiÒ€ø*͇µë×´k¿æ3Ûvm8¯y·~ýçí?&ਤÏq(q ø9â'NŸ#}ìúyGjöìM›U‚)’?JÖ¬Ád¥&¡&²i…Áz› œr¨K(>µýÔ@õÿ¯QMXñQGeÿ™tÔgøpAhp :Ä‚ œ U΄.5ÁP€Âp¼aÆfaNüažœpˆ3É…Iô€Áñ"?²ÄÎ凄ñ^GÁÁ4 AA < ƒH8@`† M)qRH}p@ FE5Ö¼áÁT&P@Ô1&¡†['ì O<òA™,ûÁ‘TáG‡ãv¤DU@²†ñ¾Ì¯Ñ!dÆ!GºqpHòj|ð"4@€C¨N> "t˜Âš·„$8È ð~Ј>hV£>Ø—Qa0ƒ|`†À˜À¨@‘ Åxpå‡^~Ä&@%L8Ð!tÄÒ2 "°ì½§ 0 x „ðÀT°àH¹+ø  V: Áð@KHI p†L@ÀÎ@+¬!€P$¶è€Xð“á1ê †°4!˜ÿB I„Œ†ð†"‡2U,éfJ3*-Nn6±‘ä¹3¶ê«rͬZåš2â88C®>·¼Äá8qhD#æ$ý * „úFªÇ ŠPµØã ›Ì‡ðµ()%4‘ ÀÄð6RÌ0 yFaŽð0 Äac¸ Ôé¬SAFmŠÀqˆ5˜A8! °ƒ#l¨#ÜÐKœÄ(Œ01,)PýxBÉ@çì™æºœÀ‚á VàŸ%}ð˜aŽ OM@<è  ‹ð 3hedà€4@,`µL¡ j‘–¬#\íÿ% @N*¼á0ÁL !D@N¨`€9 éÄd¦hRN¥4¥(EkÄxßÅ94u MÑ(SXÝF§d\c­Q…žuP8A±áœ#lç,RAR”µž¨ÅZÀ„µnGg4õ=„ÀÄ&ØcLL‚¶«"Á#MÏCÅ$dÖà°>ÞL ?(“®&€ÊžfH@eA±†#$OƒÁ0¬Õ?‡èCBˆ&ø¢ÃRqe»eU_X!i0À €€F Å PÃU0ð @õàÁ ¯)TI…¡€P‚pFFNo˜\ +ÿz è@´ƒáZú f<å˜À ÎÐrJmP+õÊ{^¨ÁSSð@!„ßàßG¨á¤¡¢ïáºø*—Âfr«°i³Fà”Q8–;cæ{_AqÈ•]’â|gDy #¹m;LtÂZƒœIÉi¼úío P`Žƒ2Ô2w9‚‚â`3, j&`ÉP$®ý™è;(K  À€ñT§³-)`ý?¬¡ãkU‚Ò†LáäI‚z` í &HÃÕà„7` «ðÀ tè xà©Õ€:ÿ¯D ,A d0°€ &¨áÔÍ{^*¡·;œª`G¸ àƒ4`æ;ç5CÎp„A…€ÓÛ å^\_Jâfz­Òü~6À^\ªŽýß˽æ¿j¼„«x³FËY;@T•3‘ã CsŒŠûXž5x‡½( x ; Bhš«„ØòL<¼‰M°[õ~ØÐµ’GÉLbÂ,f €ÐÅŸqÀ,щãçú t’ç[R)ÂÑL`ІG Eз~ ƒ À¡ S€¸öã¤Ìµ€AT¬~l 4U¨BÂU% i‚ àà ˆd:H‚ÎPÿ à3zåõ \Pá°cÊa3æ±<xn75Æ J`R TÀP* ( @S rCPá(`9E`snco@Sšâ7¢Áwœ‘ ‚R®±8‚·_ÀÖƒŽcF•ãl­‘9ÌF9ÆÖ*¸’N0FQm¾sÎÑ8öV;ëa- Ð ‚„H,v¾{š¦z€µ ¶#IW2Übä„ð{‘otHk€3ÎÑoG@/pÀ9œ#PÀkP'0pÐp7GàGíCP&ÀG@àM°(T dá ó1TB‡û#ùónp“ÿ–”Nq)AFÀN  Ð0@% =àg#,To=rb; j6mÎrPHw$Æpoó•$16ìµ([3ƒ<@)(Q0(æEƒ“‘|—ƒ„óE[¤8±Al1Å_ïH7uÂÁRitFÌ&UÐ*ÈÈG€Jð`F±<Ã2 {Ô†õih-Áæ· {å:±ÇI5Rb×b#šÔ,·£0äã òÃï&à·;DQ̡ˣg0s4'CvqgàŒ„ô0  ,Oå^Æ-A ¾ ÔÀGà TÀ\7á ”t@7& &!ÿô¢T>ÐWĸ_YT|>ðIð’v^ÇõØPÒ`j°C@]S` ð‰5|0Ü4ìtU€'ÿ q Hœ–('Xp1RÀ‹BB*Ç("R‘BE›Ùƒ#8W$8–Q_öåƒõ¥_‹w_ñXl‹wl³ASJ8+— ¶ò‡FÀp°}Nx:À‚Ù–mü³Š¥I&Àr=iÿq°#ÇMP°D¤µÃ÷\¯øo zPpfiÈ¥J F Îh6‚-J0f03°AbL'pCÐgpjBª‰¬ñazÖJð @0ÑE€+ðI4$D­ p^ä56TuBàg~R‚ ›“)&…k~g_Ã&x¦òRİÿ4ÅxÃáxht`­2›´Eà|wÅÒkÃuÚV§Ý‘ éYôC.ä’ãÂ1iÈnYV3Á1'éG0d™Ä~P ÁôV i Ë>ÍaœÆˆwÚeH2¥ÈÿGÐ;ß—³fà(}ЄPT`f^0p# `;m1BÞq&€"« @ D2IN"FÑ.9bˆÜÂo&À"aÁê `c…² <:u*Àƒ+€fE°¥&Óq0C  *@ºôJ' 6ëŠ&|V]Bð äø騙UÔkˆS_>Ø¥Ç&¶ñ_´‘xÂAS¼1¼Žyg [³9?pO±|èa æ²!Y‡ÙÛ‰½ §Ó{ò‘†NâËwYVH}00P!Md1!PØQ“ V‹Eq$ë®ÏR-ÉdTóÿ-€` ª €½äBoèÂUM & eA™œ6âK eû³V¥Õkpq@2Ój–e¡"0& Ð%xà?a8÷`›PÐG µCeÒºn—g €ÚµÂzˆv3Gº} ŰDó$¤Z0ÒU`F°¸S@k€°Uº)Žp¥¿¥³ÑE±"9¿K+ȶx°¶9±È‹F›¼iÐPȈ°½gaajÁH&Ö¨å‰!9?\<³f+¨6a¿M %â‘0˜0à ãÔ0JY$bß¡ÈÄ-ãQaR‘O„PP& ÿDùq‚l-]Éç²;‚Ôtáb ¬úÈúEQ5gpÜ Yµ PÑYr|Pp`à40œiðv¦ˆ¸ñ©cÐàUl–`ÐaGqä:/AHÚâG?‹$RÑ"ØfÆP×ÅföR@(cCDT0»ž8¡qÏ¢áwW´¥©™š|Ð_ˆ·šª997u`¿ ±kL±e ý… ±¯öv›zÓAa# býã²ÎÐ Ø”þñÇ!;€ 0ð½Î`~i{ñWáêTjPZfÑÃ'HñÁMG"ájæáÒQIÓI"pM1ö£ñ¢ßg<àgâÄéÿ•ª—2ðÀ0GP(äÛµP5ùÁޤ-ù 8ÓŒ/`Ü‚ÀøI¡;`€ˆf`2ð ,…/ñ³Ó@0nOAÖÄÇGmHGL"@'WsgëEÙéuQ4_Zü7œÙ)[ÜÏù厲¦¬Ù»eJÐfj¦ =¼À«›Î¦(EP p°6IApSQaß’ÇY#M.AÙÊAÒóC Þkb˜` ë!{”䆜ÈNEeÕ¶N%V’ÔUb5zl……FqÍÕe‘`‹K ]©Ô’>3ÞP0 ë8’£jb›@2EÑ£UÀpˆ Ì3àIª AHt‚P¶–ùl¥•šŸ©ƒ_üÅÃÖ3Ú¥]j´¦3u„ `³Éxfª¼;°°£w$,xÒ“PA²ÖùÇæµ@ O È0æÝÑΠ-Qa~Œ‡Ë q°G&©:ß2J&žJઓ0MaìÑTÈGs&@3°pJ V€'–#óå%Æ{t˜oDéUYQ›BVð F >R"U`ÿRŸùX5!ë¾LÈöËÐWÑI\U 00`²6LWÆY_kÌåË÷fp*P}¤ ]u¢u—Öì|ðô°`±ðÂEƒ£~'[|*«áŽ¡°¿®éîÂû°g±•Ól°ä 9"•à‡¹ò±xÑo~ Ù$(»ÔdÞ Ð ²·óSæýáÕ›`~šV µà?mäá}$ßÔ"gU9Kb;nþ-ñ± /p­q=uBÔ€ ‚'[÷}ž 0Ó_Ö GJNϵ¾tSÐBàòf /oð4fÅ 6waýäAHíëÿT;:`QìtB CÁhâ'Ð PéC‰‡M"ÔDIœ¦ibJœ>;&@Q²F ?~”üPâ$Â<Þ,8’ÒO‚ ì4ðæ G„%4ÑPGŒ)}”($@|‚J•*¬Q§N•*uëW¯SòùÃÎW8—¤Â9 èÏO·—Îþùã–îŸ*L˜€(A >j tDˆ„6MÜäÌ(ÈÔ G¦VÙ5_™5kv†  LžýÚԄС‡©×¬Q©Äµ¬R›AB €(!ì§cÁ‚(­XŒs2ŽŸÕðõ‘!ƒ™¬08²Ã7(ÿÉé½€€`2vÈVÔX£‘’"EFƒ’ÓäÄ ’Pû-Jv4Ys†|‰ÞÈÀ‚¨Ø!”`ƒ7‚ðpŒ(¢p ?Úƒ¡–Z 8!˜‚Š" b3¨b %LS"3¨øÃÀ*‚¿‡^ðcððá‚,°ÀŒ3â€âˆ*¨àa †xCŸœ"J(£¤¤R(¥˜ .¹´*,¨ âµ´šªª¯àú Ÿê¢ ¶~’K.7á¼ÄÍ?Ør3 ¼v8C…@ü:âˆÀlR B8B|a 3Ì&à ³Ë.£4³^ëŒLš8ì´&=ì!ß,ŠÄ"ÿßP´#PPå¶á±Â ?Ôð͵T9¨p âàO°R ¤Š½ û QEiµ¢²CÎXƒ)Œà@Q°ËÎ"5>ࣉï8Pc¨HC ”ðA†((ÁŒ“" â $à¡„)x( %Ôð` &ƒƒ"´:®šp30ðTü +œáqøÃg-ôÁbàR•î¹ÆT&ráÀŠ ®C¬Á28YªÐô`I(müÀ t€D@ Ðk3àAŒ  ÏOÆ*è!>È øŸÌp€@!éá _ê@º8ì €Á¬*r‘@œagPÀdĽ À!ÿÐA V!…)øì ö‹H%¡$ÂH£R"z-9mM í ÕØ´Ð­4-kY;Ëœ*ÊC­]Ô.yâè0–ž¡ PAúЛ4"Tž‚AÞ)HE†20íAтԇðT³¹»ñ”?&QÕç‡â0€~t‘ä&¤®ª©‰D­œ`«¡ G@‰ŽE*  „„§„©œ)‘€ÜœFrMp(”%@¦Z¤T*ò¤!•ÈáoXˆ¦¥(9üÀa €>àƒ$ +àd²|`IâCJÚI… $ƒøêøP&€X"5AÿLp„8T¡‚ ‘íh3•äÐ`ÌÀðQ€ >‡0XOŠS”¶&†ÓÝ Ô:Ã5ýM ­ Y¦’±À¡Nw "¢B—Käì@ ‚ô!P51ÔgBÕÍŒñ‹¢ £/ô[SÀy4› °g•ÓT¤# k˜A¹ØªZ<]$Nò<´ÌmJH,rJ‚º@ø ¶ËÙNp‚3Â#òMÃÀP@a0+$w‰¨„§'PÃéǵN ÿ°xàB „0ʱFd†>ÈÎ4žœMEã8H ‚5{ÀJ@DKAMÒ‰“l8Ð¥1BJ’nÊP¢éyMU‘JU¶»5°Ieˆsú®Ö€§¶\´,J @P„TaL}˜€1R‚‡$4¡r)¦*ÕEÿŽ‘‹nL/BÓ˜C î6KîëlL#àr,Îa«å0?§ÄŽÚVᆩ08ÃvP“@ü¶2Á”p¨GuÏŽ TjG2 2QA 2„*0 ÂqþƒQZÁð+2_Àã8œQ‹»N¥+Á n€0-ÿ7Nà? rÎ#¨¡bÀWè< Î‰à « ®PÁT’š,® µPÂN 'lý»³Ì&jÑRgdª1YÌ ™‰˜&‚¥*Hj:¢*Y=Oޱ™ŽR‡#Èã¸-X&) Dn G*!ËV ŒDªƒ3üGhjÏž%T`kà©„`†&ÀÁÐjÂaäÈ ÄA x¤Ã”03áB Â æà Wÿ ‘°B$€à OæT0èö¡²‚ˆœC[‰ÈJwóžHƒÈ€>h„F¨„>PbÈ”›Qƒ€ h øÿ)Ä7©@@µ8¹Å±·h(S€Å 7P€üC€0ƒ&y ªc¡«›’Ü@L›Æë ;°Ã6IA·(¯°Ù¡91 |‹²àƒô¬(t 3i(=óŨ…MØ ÀA_ÛŒÊ ,„œ{£Ã(ŽÏHB?2½ÄiЉ¶ÚÂN‚Gä9Y)§È±‚ÕÉ­‡7Ú£0B8h„@—‚)‚)XÈPƒ)P‚ÞAH(0ÿAúÿh¸Ñ¬Z$È¡+(‚7@°ÈAÈ̘‚@Еˆh€p·”¸#h" H °C©Ÿò cH€7èJ|¡‚¸² ¨€ˆ³ô ‚‚‚l9@>0Ð8gPgà©# ‚(ø3x3Hƒ˜Å)(*š*K ñC¨ƒjL,¡ÀG@ “©©®iü´3Q“ŠÊ®©(‹ëº“!2Á/!²˜¿h¢P#h> ÄRHÂéA Ǩ)»¹ +Ä©”à;Ø PL÷³ÓYœÙQ^q½›’Šð8L0’Ù9NÁÛ»1@ §Ñ Õÿé#ƒp`©=0ƒ ˜ÈF ‰“8P­ߘ–'3ƒÊâª7¨€ œ3(‚êÈ+]©‚?X öq€0€58$xײŽÄªyI5X±“±€3¨"©•S9p3¨€À€S(ŽÙ È#H€*(ÑÀ¬‚3°„ÏЩ¹ÔÂ$L€q—ÓØ ¹Qx1°€0ƒ&¡(q.èšIcŠÒŠ$µÆiÌ¡êj‹ÎGð*5 Š ô/7is4ƒ1) Àˆ›¸ÑœÀÉ Út†ÅC†b£M{NA£d3=6¢ˆÉ+§‡Q?¢ˆ•Bž»Š8#B€6„ ÿ«¼ã³Æi ã8’jI¹“ÐðT‰iùÂ$ȹ È­”8D21”ˆ&ø˜‚€ ð‚@˜£*‘ƒ1U'xÈ䉄Nù<·1‰ hÂZ˜\œZh1XH˜8XT#•ˆh‚Qƒxò•eËÁ㡈’:œ²¬€à0põKAðÑ !Ÿ˜@ Š l F˜LÌt>¸„OC°›¯±‹69»mœWT›Kµ”¨‰Õ9 Ó`)X Àñ/b#0gøŒdàÅÛ)» •²ÚPñ£ã€‚0@}žM©F,‚€ Oñ¤U9‰–‰?ŒÿKU‘/tAÐÔS…ýL‰þ(¥r²B±»¹ ¸ Y‘¾Ü²0+Ua9mÊ€ Éx¥>ð<¥‚‚*H€ã+²É •c$?@³¨À ‚¸4¥ˆN9„^иQQƒ0œЍ[û™¨¢>x¯rš>ƒ Xû«`ƒ1Ø‚*&*‚ºxFGhL¥@¥˜!©™ÌêÚ4«pÒR5ðŠ8 "#2"±XsDQö$Œ0L ][- œjœ4Jbë„^äÅø+ÆCÕ!ˆ ”C‰`1Œ“I‰‘Ä•³Ý«™ŒÚC *² ˜ñ)Ó€ªÜÿ²¨‚-(p‚`9ÈC¯¤#i™ ™¶@„ŽL‰DÖ50 £N¥z7œU´4€Gš #3ž†Ù«˜Í<Ú)ˆ ¬´¬€8« @•…Ñሃð *Ћô¢J°„Ã3ˆ*ˆ¨§ JQSÛ¾ã0°€$𣨃BHƒòɨHS«{‡ªÆxU( »kìá)E/» º0¢m ¢ôøƒ¿ƒ=‹è”ÆÛ„jI£¤ØM^H#y$0NÝÅ9C=:›€‚Å;•𤇩KÙ¸Ô@HlÅ„j¡†EÙ+‰ð$zˆ3LÚ“@‰ãˆ0;²ÄÃÿøÈ°€Ô –•cƒØ  ½ÆÃk³=’ø¼Þ78ÈA-Lžây£ãóää‰5˜¿" ‘»Û„FD[ÚYHC(CðfLŠ€‚F¦`„ƒú’ÊdRε (½F9ÙŠÐ gðbÁ$¯µûƒ"„?˜€ãhÝÄùŒN1fÇÀ›Ø­©ÀI†ÏØ„d@£ÆÀ¢ÅÁ¢Åð”?$—I ×p™è´/ÅØ;•è8ž ÀZ8Y©·»iŒë$\¡‰²â)•p_Ñ8•èÇb Z¡þ©‚¾ÿ@Ñä  ‹XO¿Ú¤Äi :Lƒmú—…èˈ=ˆ¿NöäC¸Ëüñ_ŠˆN†½€ùŸŠ©…¡žˆ„V8Huk„O< >@@?»*ȬkT¾e'ò ÏÀ{(ò‚? ÆtF‚4#­´§èOãf†¨¾® ú®Ÿ¯ⴛ׺(„H¹qµ•’b_`ÛâùA^ĺ„X&„ºšÈý¡<ÆA R‘Ïè;ãœËOªŒ N‰µ%„JÐjßh±Ê¹œîƒ¶5„FT¹ŽÙ‘· _¹Ø27$¡@è±{›õ)\7q‹ƒF·¡«Á8î ÿ`Ð5˜Y¦5p‚h€P‰lãÙ£ð8‚!È 8–Ð`£‡ñˆl©ép§8‚H –NŠ¿€k²Œëm0€7%Âêc5V(€XXG0œ^t?¸:‹©sÌÈœ¢I*QŠíŠšm¶Ì0 z5P£¨;!b°"#ú!Ó- uÆÙ¨^FáÓ0œGL©)ÂI£–Z<“Ó;‡˜½ûˆ8 ¾»CäÁ#ξÃÞ¤a_ŠÔTK(•MpÔ(§“ø%³0݆6¦"qã½*¤[ªˆ#$o„¥B€Lu›n;*еLeY×ð¸‹Èƒ5ÿ@>9ÀÎ&È€:‚5H›ÚÐ+Bm¯¢½è,ˆ3°Ÿ  '0€è»ø‹?ù¨àò-ßêÏ„ðµ,Œ*0ƒ!à÷z/ú:P?‹õ œH±¨s8g¤áJC¨I OqêÚ@ìk´x¨Áìm<âÇR7‹ná—/D”]Cœ½ãlÉæÁ`Û"4åÅ 9ÿ(«p·pˆ¥xŸ ÅxŽˆ0pƒhʆÉ3@e4*h· Ì(§¾ßèt7´>aY"€øó C=J˜á£D >„H¢D‚$òÄ'ãD>—‚¬øñ#H8—L2 ÐI@OüóQ&*]z䣢 „a‚Q«IO?µ€nò¥Ô™3_L™Â`ºi*&¦D Êj¥ &?JüÄi¤¤‰+@18dåg“Ÿ‡€*ÛÕO“C Ò’U¬Ÿ¾˜š(Co‡7œxЯ €|ý*59G¾Bñ™ƒŸ ~80ðs„PÛ&gŽÿj²£J_?0N¨QsJ“@š0hâGM•>\Ó]»7P%% 8X‰ºI%v ùl‚pâ˜10øÀ”)CÞð€`"Ð3>N,1R¢•扊Àã!Tâ†èð¡†fxP@{˜|åW[@ù…oL1P„AÅoPA… ÂÐAŒ$äÈB':B¢E]rÑŠ­K‘$’Œ7~¤I3ÁQSL|Ð$EèÄÓO?ÁÀUOKnÒÔRN:ÓË&0L‰ &U5!q‰Ç qô×Z‡ GÈ!d2`¦]d¾EHYV`òœšVÄ…É–}™I`=¹¹ÿ×XœÄÕGÀ@Ù}A¡eM¬a~MÈVa»}fE c)AZ£5!›Yp@gøñ‚äeGp˜PE …ÝÅ jÒGhE¢DXkܵ [{õ5ˆ &˜QE-T¡W TQDTàÇ]‡ÈÅmC#g(p€ÁRH!„ÁB¼‹ €@Ô0#"’èHEYÄ ÏHG$e¼QÆ4Ò(È+‰l’L¡<¹Â.]„L…”•\]é 5Iõ’³R½<µ Ï=õiÀÍef~Øiÿæ]0Ÿ™Ú!ÔPƒ–ZV$YÚ_}Á°æ™0€©Ä_[ê ‘§Ó~Y‚¼2 g~ÈaÅÐ6Öoma…ƒùÑGk„œ•&ZJœaB&|`ÂGœpªgôq¤ÎZ… a*¡ÆxZÒà>aÐÅÉ•]ÇõÛ!™Ë÷€:P]€q†œQÅì°FÓ©©aF„ íÒø-š \¦Û; À¾1Ä%”@@ R˜¢ÃEtP%:ÔpBŒLRHYÄqŒ7‚4’!òL-õxL(_ò;ø&IWJÍ•¬äŒ&õj:ëÅÎx&¥ž5¡XKÿLƒ\—Î.Y‰Õ]|ŠC`"VYá@'8”#•ÅJ tV¯øe-}iB$rõž¾é‹'˜òJad¨„5$f5}1L ü`…!êJ]— áAƒ–o!UHÃ¥1|à˜M#u‚ ”ç&8CâB¬ð.¦¡B”ˆ!AI ºÂÄ»8CP0\«Š@$º(G7][ƒ^2«3)!T¨€(P‚ˆ¾éPHx¥­Ø¤€ò`×ãÞ ð@8"•1Q‰±ƒXdbƒŸ‹Þ÷1÷Ýh%5Ñ%N|“Íä&ó[OÚ”Nå)JY&ÿsƳžQ1® ü7½çYÙ à ‚ g§Óò–¦!7uô‰aê¤+”%LwùË[üЈÄì¹ ‚è”7úápÀS؃‰#Êmm‰š7³µ|åUxkF•$˜à?lP[Nu¹¤ÁjŒq 8Àj8Á°ƒþÀ'}ëàÐ)Tž¾P0—Vc*Üú_TàCÖdˆF u³ ÜËo8³®Bzý¡BÓ£¥o B„¤ J±vEðà ‚V´&­ðƒë,Å]W¹d&4RILZ²W! äÀ$5‰2B0eÿgËl T›3*9ÃË›ÝÒ‚ó;qVàYɲ9§u¦x6+Q»/(8GÖVÜN¹ÙËY"qºÚ&‰k®ùKVì‰4Y™É+mÄŠëSݨàÈÁr*XÁ8,îÙ^iÔqäÀí(Bv͸*x5z`ý–ð†8` gàÌ($;@HÀ PH` %BêåÆ7x×å @úbŒ>üú'Gd°¥Ò„#$ ª•°§ L0=fë7æ¿©EL÷¢‚ !”¢¬€X…0*€!">ÈAÊw¾i$}.ªå¸Ñ}n—Ð$2!ˆÈxtcš|H—øëo¨¹—Z$3È>ÿÛw2(% %ÈR9ÒO6‘š&pV)ží&­|ßCØ,âÝ Í Ÿ|N^Ú™@ _xM œðJQVƒ®$Éei„6-å6ºx-7GH^aÞ®$hÌ[ hè—5¸)T ª]áüت"zÍê$Û¸|ÀÀÁD øÂZ UÅm 8@„ÁxÀDÕâd€ÀQ­@‚ߘI` @›7¥† tÈ, ÏtéD_¨AÛ¹Ç^ @vXx@x @)QA„ˆC ÈäH*‘È#|„¸}Œ\±ˆú@aç I¼ÄKô•ɬDJøU €1dF\ ÿU0Å3 ™R Y”8&C“ôÛ9ÃÃØ_@ xÄE(,…òéam“f1CùD!†^X‚= V°œ|Ÿ×`B-„PŸì…%tN#Xß!ÜÓ¦`Ó]PV¹F]p|Wd¤ s!)ÎPYÈÁ œ lĆ$$ÀÙÔ…VðÀ—#ÚE.)Š—Dy˜A Á_´…8•…Z‚øÁøË\X ¢`éT< €XB`€Ñ|Å´õǨ  LOÚUDÈ„Áwa*X&ÂBDL=®˜Å°¹½ÏÒUΈº¥›Ê¤DÿøHAòÏ«œÍÿ÷P“øJ2T…*SJÉìP’9ÅTl‚d‘NÀE\Ô,Ó’dz~YV‚±àÛ =øéÆ’Ð#Z‰š|Ÿ™Á‰k€òGmÜÓ(B9½‡ŸDÂV¸‰^˜ ÐIY(¬A㑃$Џb `¥ªJ^(eð€ð€q´Í=ù”èYn¨©4HT¸äÇ¡I YšBvPˆ2›K†Vž4‚ô˜+ü†+tHÄm ,P Ä~ølXwDˆ‚ „#ÈZ‰H>‚ÆÀÕgŠ›Å` ÇìÈüˆÈÄKÐDºÍˆM¤ cC*åbÐ÷ÿÀE G"Ö™®a$Z‰OŸIFܾéazÙ™ …dQÆatB“EÍÁqE€åOX¯èá¯Ü…¾xÊ™ 5ä°`CmS †] fÝ˹ ):ÈJA½FfL€g(Á `%üÑWÀ¡k¤E4¾ŠlÈ­A‹å@B´‚ üZ#| s0@G¢‘i¼Á†H| …!ÀNÐE¤;N4H;ÆNÈ¢ fo`edGˆ’R¦0¡R‰•Ø*=ÌŽvf¹½ÕŒøã?ÂXýÜØéÏJôOŽÓýÈÄ%­ßoLP29•LE2H….V28ÓR ƒÍø‚•\Éÿ÷å[¾™Nr'Zßð­PGæQ[Xß”¬Pn%ICé!˜…õáQ“% ò=\/E$\¢€©5èFÓäR©çÁia r4cb| 2B©$FMÀ€ lœA§ºbd ¼ ¤ÈÁx€ xE°À$@’ð‡iv µ€HÃôp#Ìõ”(Áj-ú"A¸Bs”@Ã+ ,$€~½‹¼®ö†VÂô‡Àc!ÂJBˆÏ‰•CHÌDL ¹áRŒ@‚ûäHJxÞijáþØø• \ŽhL“$öăϤ…úŒ3Ä”“8Д:ÉÿõõŒ2¥é®iÔœ©—yÄêa™Þ •å•°'t ¢Í\_Z§ÖhSGÒS…zÐÃ5YXÂ:…PÔŒ†ÔèFÁ•…Å™ÔEà°¢rdEÍZå¬$Á|@U®Ô 8Á° ÑÔèF~RÁnT ]‡Â!@AÎ!¬ÐÂótˆo´‚'V4RH²DJÎÍWôRü† xB| ˜€€˜AÌüǾ6¸‚\Âêù‘ ÂP&ˆX"aCœOæÍ«>F!‘Â+jÎ’ÚK€nÊ,i¼µ%„€1@N¿6IOl&äÌ• …:EÿÎ$Ùõí[cYÙRFÅ^,îŠäÅ–duVgùÞ¥ÉÃ5%DEÔ<Ü7QÆmÉ^t‚7ý5ddR<Ù^ß&TBG¹†ˆ' ¤…°u$É®Z`ˆYj U¾Ü”V¼/£œ@˜œAlœÀ tjlDÑÙðáüÁŒ‹íì@]äFPA²èEà0@®¨Á|@ß‘mÅ @;€F Óþ†O¡ã´*s\Ðí…@Z*@@,Ìmòô‹¨Þ%¼‚ãÙÂÀgjæA DæmžŒØÈ¸yÄ‹aÌȜĎžKÄ[øOqU‡V…ÅGN‰3õ¿Î5Ø.ÿc)ÅõF eHçï¦ð%ßÅB,ïÞ)Ŧ…šlï—úó6Ig%_ÕÓ{QCnŒÙ[–fñnÓUïùÁùV€P85ÙÓ—KªnØßX$ÆV¬ÁL D€\@ªQaÒÊĆlN½ŠÁ'«RUK„˜ œ8 Xd@‡È\±ª€PÍ€V±îœ ‚@ApHH"ßIàÔå†Àâ$@ã~’*l„ h³ P‚DÀAà )TGY™ÈB¨U=¢Ï»‚Œ>©ú¤Þ,Í•@º›þžà˜þüATICTCC-ü³PÀ—aby©íÿ.Ób=b™1{ñn>ôõ'î–iÅRôvÚ òY_Ôl‚ù+Ì4ILBÚ\i0™ ô~–KRCçøÊòf¢˜QCjÄ¡ûjÅ ùqÅ%ÈÙ4#SúœÀ˼Áìo¢ÌÆâÈ"ã¼-AAJ øD‚ š €òjÈ̓PÁH‡PèD£«Xå€àm# zÀÁ sÕv´tȘÁ$À³@KHR%´ ²ðT‡áBÞe>ZÍãAlÌEÀÈ‹¼XèuÞ\m!0yD_¥& Þ­+C1ìÄ?ƒO Yìꦓ„ñ¾!,oòf$Ò.ÔÀöîÛÿ¾‰äõá.7¥)gE•áòQ†H.™&Å#ËŠ1TE…NE÷²P"ª:ƒkÀd Õ40ël²²oÑÉ%ß_V‰!Y˜¼Á\€'ãNlî<Ï@ØÙüFa€Î `€ø–quLÁ¬$d i@¤˜ õ´J œAôÀ"68žÀˆ^´ žX_í @ôðA œÁòTÕôLf˜xeaŽ–3#œELLÀ#ìÈhd;ßóçæHKIºQÁ,€g»‚*¨À?Ÿ`éaBi³¶¾Í¶ðÅ®i“©Èæ6ÅRìHöî”–ð=¯iÿEWùIÐ_¬¡G2 LÞ…HÎT¡ì–ôñP¤Q[P†¬dJ›ˆ/!ôA¬¤ ­Áú–Qp@Z§ÞÚtê»@ÈâvA(œAè삵êâ›ïÍS @Ô8G_œšèh#9ö·ÀH€hTUw¸1ÙoàÝøKZïN‡€ã¡TÄÁ€ÕcUXæäRnŠ Õˆ„›Ã.a˜¦Œ•D@α&kîKÀ,PÁ(xö0TÂhS‰kS)GÚîp«á _瓼îH™ì9´gMì™2·RxS‡qïÎ;Zœ{•›YU`öt—AìõEÔÐEMsÿelÉo‡ =a'5(A"zMbD0ß@ÁzÆ˜ÈæH]À1ª‹\Vm¡ìVÁ“¥@#†7¥É÷«¿È– $°@ÁA‡Ú¼ÐótÝð@n˜x‚”  ª³Ñà *ÉAÜDJ¶ ‹Ò8÷p"°øŽî¨Š'Â$¨+ÅÀsÎëH´³Û’fvºÕÄâªÂ4Ã0ÈÂh,ìEÅTÞ‘Á’ñæ-¹Ã!‘yùo‹±”6ÅáWsOÜE§éâò=HÊvr>ÜÄÞ!t¼®3ˆdr?\R„¤ÂÖ´KæÉBb|Öï… h M˜ÐÜz&È‚Q¥ÿ˜˜œÁD œwá\š)Ÿ†XªÑ^ÜÊå‘›Ô^Š˜€üD%›uj%É"7A#(€€} Bä†8 vN]²£ìŽ‚¦<Öô ‚i¦AXA…ˆ*q=ŽÈ‰=‚Ø·ÈÂÏGB»©‘@/ýcð „—ðqõ«­Zµx9ëEQX­MœÁ¨…ÉŒM"}ùÚäÌbÉ^¾¨­UÒYIj¾^R£ö’¦Mš%wÒêæO–?k5zÓ'(<6u(©Ig?m¥æ ÓHgHOÆ,)Ôª³M?1ajBˆ!B‡5ibsiZ³j4Qb¥–ÿ?Jž¶Õ«DÎ%P)QHΉ@Ì8³ÁoÌçÀ?V0BÈÏæ›Îš„tÀŒ8JyêCF#P2ÙqÆÚ¥ÎX’ÄC)¨ ð³)RïØ*,Áh#•¨x:p€ 4*(òg ¤Ej2ñÆ@TŠr”È£øòå'‚ÿ~x…ò_ˆ?…1ä>(!‚<¼Žÿï?.iÅ•b*±Ä˜‰œá…—‰ŒáE˜N:ÉZ`@ ¥MVêe%™`¼)F™^ªi¨¯¾zi)§’ºñGÁ2 §£~²¨Ñœ*Éš°‰%_ÿÁÄ—©„úq¦#›ÀŠšœ!Ĭ&~:ä©ÎÀ´"ÔÊm/8ì?0B/?Sb05`½ N8AÄ#L(âŒ8káL‰#``€œx#<( ?øÀ’çxcˆ!Þ F0a@©Cà  (ÔPÃ3¤;†N¦ô£ú€ÏBWU°£‚ Ya1–í „Ž"yÚ7Ús$¾÷ð«V¾k /!ÿ\Å0!,ÂtDè tÿ€D–aT(F•b6ñå¢Z8ê†aÜ$+‹6¹÷Ežtâ F¦fŠJGœ|YŠ©"¼‘✒ʒb"‘Bµ)˜bÿ"Š%±:*à­~ê‘Hš«-H0Ë,¥ÐRµ¬À³-¬ð£ U9Ð Š5üˆc°#ŽPbâ8aÒ7>H‡$}#ÔÈ’Ñ•ç&9Vá0à <͘â?Th…×<mžaÀDU+š@³45üp⃠(’&6©%ì<ÑL ·8#äà€Ç‰]Ï“4d€õ¹$!÷ª}Ä‘G@‡¯>üÔOÜÓÃM]¡väã> ÈBÓm·ZâUÁ`è¥%a„ù—¢ßñEø^|W)dàæ)Êæ±3x£©³©z|Xú}’žÈð;6jGòYê%¦±fÿÚÒ¥+©ù©M®zt&µiâá&zû©g+ÌbÕ9{á „†´8 ¢Q*P«â€(˜ ÑbÁÀÇ @ˆShÑ9dÀfðƒ”ð‡"¸Šqs !¬ƒ#Hƒ €Üð”¸~aX¡B „)xÂÏvÐ KÔ¢}pTl`›85‚w8Ð3!b@†p|H÷žø€NtÔb„~´Ö è?h$…Ј E¨ ªC8Ñ‘a £pEò:²•*Y$a ;É‹jÄ“” z<Ù[Aˆ®lÂzKb$Te½Î¿Äa-Κ*PaEèCኃÀèåjXB!ˆ?xŽZ÷¹O踘Ð1"?eLãê6 ®)<:€*¡…4Bu Œ¯Q<£2JÞL`T#”ÐÔ•å«’OÚ'–—4-¾CÒO›ÙÏ tÙ%obðyò“V %ùšb¤ôâ%, Ù½@ö1Dfÿ²’GZ TñÍU¡ÊLh±(r©L˜“³iB#Ö?p H¨Ò p‚ ø 5,¸€ŠP…$` wUÎ^ü` y]ÃÌ0O 'SJL0>ø²0ƒ]7ÄÏ·Z¡@èL#™ô0Þ€‚G Â¦ÀžÙb i ÍΈ@,ÂY¬CèAŸD`´Z“à"µú çvkuçiëÀe®Ö„A 9H…æ!I²J#©&¶’…EÌ"  Vs²$¢ Ä’h 'Ô„‰84¢ƒÀohèëÖ&`B œÈMRUUIˆM¬|âSðM“ÛÄ+èsÆD†’@~ŒEP‘^g”Ò™Ò,-OñfýÀ?ú!™xç™Ü'5ôáO°Š@p’J Tðÿ⤦êÑdg7b7Å2¡Êc›ÐKBµ¬ b‡`MÒ!Yä¦3Jè*ñc?À»p§Ódn;0DÄ`R‹$èrÇ K \Ϭsc¸´[®… t]é¢yA~#DzÝ`äƒ8H4"4râ€qèë÷m.Ð";!ÑXsvµ*$x: ŒùS,(:)§ª“¢¤ÁºgZa Xža6a4ÂEÄ®E¬ä’´¬z8—€—Ò‚ÒêBLìÂnìªUö„foðî0\EPÞ>àÀ9&`¶Šà‰jaÙš€~‚Ô†M6ÿÅvÖ¬g®ŠÀ+ŒA$*)ž­ú@ ¡BÂjá\A^ãg¡   øT Èü@†…öLà¾- Ô#JŒ(*”‹¢À¥Œ¤kÏÞHA^N]‚ Ljvº«BŠ "!‘DÉúÜçeBcB­Á;-ð@ð$Ááøƒ?*¾…i'!„?–ŰÁ®ìjÕÔ‚‘\í¢BÖ¢ÊÖ4&YB½0Á Rá„àbÁ^ÁLábÊ"PB—JBØ´G—Èzæ&43Œâ,8 ¬„æhBiìb0¡P|ËÔ€RÌ€Þà–OL€ö¦M¨ÿ€^¦ÈP%¶ú@ý@Ô,¤QS„¸i=¨Àäd—¦Š:…¥žPv WºK#Û:gÖ¾6å:ˆå ¨Àêø¢Kº$ÄAj»Ô(Ð\]Ö…$ÿàT¼¢+¼âFn‚º¯~«ŒÊh±ÓÚ \v Á¸ M(Þ($v*¤þ¬ÌÓ8Á¿ªN—.éÀ¾çG¶ÎÁÄGçFãt@`XONárÁEXdŠq¬ ‚’Òb­¥Jc?y¾RbVAPáP¡Naj¡¦Ä‚íÆ UȤ-Äd”BÇDq°± ˆêü` ä@ Ž@ v`˜üÀ>` à xàâ@ÞB£bh„ª€:â ‹à4“˜¤c;ÁØÚÿŽU®P4k/4œCõt… 5³¬ˆ X´ÍQVLXH0ab(sÂ@T>8ტ( £¶…ùž $=Ru´Ë™…sj‡ç!,¤.L½²“ÀP<  ¥@ºÂåå˜Ó À…B aM ­B†ŒÍÀÏݪ.%©lHj­*Lë¨Âª¼®`ÀT (RAl!‚Á@O¡fa`æ¾Ðª’* ›Vk­6SÁlÀ"“gˆF/' ´åÚš¥Æå&²1L þîŠÀ.þ`jO/îBõ.®œÐjUŒ‚üàÀ(:á~‚†¨@\×ÿbUAðÎ E¢ ÌðÚþÀ €› @Tä ä¸èZ&* á#¹åŒ<ê‚«uAjgºž¯uj'B䈦¬Æ $|²[ „aÇÏÀ…"¤‚kvÆs¤fÇø m» Í8Ñ·ú`â@ÀVÍ ”1obpc0uS]•×|"GaT€<n!n!ÄrVáNaÔFJ˜j)Ö¢’î§–.ךּÎMVe/ÖÄnŽæÙôÛŽ QÔ ·$À LÀ"@(ÇPc*¡ÈNƒX ÀÏh᳔Ñ$èæd&‹ *` 2¥q C¶fAG²_zE Tÿ‰*êÁâ¦`„`¨# @޹B7>H'ù@2Lÿ4$„99‡º´ëÔeŽ1éd'LaAHÒuý´\F(=v@äd)ä õx/;Ö,&· À)9*£²©VÉa2û``^ø@W‚hg©aT@”lb*AôÅ#hrAniS!,Sa ´`àÚrIЕ-zF-ÚŽíî³}agÜ‚W>ƒPEõŽmM#ª€m-gª °ðxfš€d…=0ˆ1Š…ôv€{sc*L‚$@A ’À ltPð.ø€¢r À€å0#5®Cÿ ð Àpà Þ@86W @2’ø@ç=¸£  åÒh£¤˜Ð˜3v ¤VаËÏf®fNÏn‡ 8‡YÀ`© ,Ä#vAÒÅ6Q·ëa…=a † @À.A -ûp(+F—¨³§ÇHDÌî&jÁ@WŽ` Òwjá@Û’zÁTa”Ç:sániƒA”E~M]!_rµØÂ•6¬eäòa«“)ÄÎÂ,Dš@o qô Ü-vÀðÌà 1 PteE™ ÒhŠ À  îIáNå%0ÁhS >@8à`ž@C ›ÿ@ø Zá³eƒ `:—¡°v€!5† …h‹lþ –«¢FG8;Q$Q÷ŒÈv zùB*¤Æ¥cýŒɸ$³˜YüPvHáÀ0AĤ²ø¹Bjæ|÷‡=Xb!f^HðË%¢æ¦Œ¨zqb6Áfár¡da$„´üb ýÀ”°ø@XÈ…d£\6A6~anÁbávn¡hW˜c¨@#è¦EØB.)é,^f”Œ(à’vé¿ü€-0Dã 3(D•ÀÚáee= Þ:í*á ý ‰ÔÄ.NPF lèç,ÿÍX À΀ 8wÖº‘ÒÒ-ìXúÀFj €¨òèšá bH4ÃÀ<®܃>¼(ŒêcŒ2º?¤˜ Og£¯<vcQ(m‡¤ñuy—sHá Z=Áþà Ú¦.¨€8‡sš{sæ˜s BP`aåw@aá”tfÁ~TJ FzœaHáHáFÁ:TA$êB ¡j¡90!¦é¦4bÚHáp¡ZF¡½gÁfÁ}gÁ¤ñûŠ`aØ ¨ •4HÜLîR€¢-Ÿ‚3œÁ­ìÆnô.CÕ ìʪÿQ ø€Eà=`@/š£4ÀšÅ•–H¨ ´G-j:²“hbe=‘¸G)&–­ØÙ ‡ìÊîGmH ¡ *+=ðUZ22¢¶tÍE΢8hm:ÄÐWr]øi"jAšáhYh{k¡Zaïo}C,áˆaØqX8¡8A(ÁLátÿa‚A‚iKZÙ'°JŒsù¿Ô"L(I,bö€ /Úú}ÒB¥qó]ygž­íìŠ=Cã¨i1Ä äYáÎA™qh­!}£„r%ɔ¤Ã^ï…AU0ŠÄ0¦‹t-@#’`ƒ”_ Áhò;2Gs:±‹ê£ä¿e O§£ÚX9êÎÐ6³ËýÕØuºGš]~IxAJõp `D"´ F&R¬DÁ’Õ+T.]±paÊk–§X¶lUœå †®W°t‘úE,×(R¹v6 ×.cÃú¨€©O¥J–jÁعËÕ¯Y£†ÕÂT‹ÓN¢*Zÿå¬e‰S­F•üÔšJKg'_¾6]ò¤"¬`·lU,À°^h}aÚÙ§ÑNR›`"D†³C m:䌃½ ¨ dgGhD¬ª,òÂ…(D ñ÷8_óa„¾įå¯_Ïd&þêpføuüð OpÍžÀE.8¶!ƒ9¬A”ØE,XáŠOt ¦¸‘Fq fгO:ÁQ$|*–½eHÆ0‚ô aœð³H!Ó\¡ £åâ¡- §˜úÄ‹KàÂ@Ó!%|È©õ°µ…'n‹%…´Hc•‰*D±œè÷¤æ@ wœÿèÛZ`Ƙ]eeet ¨¶¨P¦o¡Kdte(ÊPšº#ã\¹ 8ŽY–Ac²ÆT!~€BbÕH?,¦ @v’Hð¦0¾ð£K)CˆJãMMØKo”s„"¨:—\â&öÊ€ºÈoÚ„ä>P¡žèÃdŽ Ø<Öo€C á@3ðaûàóˆþõ«~²ßƒ„?Ñd\ Å >Q‰Cô"™ÓD.2Á‹] ã ÜXœ.™B¡°ØTbQ€#cËpÅ-‚ñ &¡eŸ›pZ/`4bèðœe"p ØÐ*­ÐÄF—€± Nã'®¨EÿIrÁÐ ¹‚”¨‰[Øf U¬3»øb'ü9¶ª  ;š1Á‡üô!lÛ©Ns*F´|ÐføâÊ2GHÜQ “š Ì3˜ÞøÂ©™²#ÇÃô/K< ås„8(AP¨Âºs„3T¡*Pâð8à Ø$k0ÑJ½À ÁnãK]t¢Ÿx«P¨DMü Óçe Ò€KÝr*5Ù­˜AxChϽŽÚ|É'™ïÁ¿ ÙŸÔ&hA­P€ %[°‚0àX#dÑ N´¢˜…,¶ÖŠvºâä%ZÑ YäW¦Ãp[]P ï0š<ÿዳlŒL\Ë%(‘ ‡=C#.F†Þ¡ %Ù/„Aa`‹éÆEG¦ OPBˆ–ÛT8Q pŽB²`’ïÖ¢9²i¹-~ˆCØúšÌ‰‰dëà:á²@ñBGCÆ.Þ­Öâ€kB¦|A÷û.TTWlÇC¹˜Êa²dSËÈÁPCŽpmUáu‡ Þ03$@N„¢†d`)>°l­ô‹3çJMÂ@ ɉŒïÞ–—Ê¢9b¦),‹0Š ï}PƒL ÉI¦Á= µÏ#–þžIÜç}øÑO€PËQ}êùD^Á S`¤³(Xd¡ÿYðFàô„Ù]áÄ FÑ&«'B±“P`¢}€)¨€¢’ÀâÂ@Ë€U¶‰ZЂ¾¥õ˜¾{ ¦i:LcRA„ƒí¥¢®Æ /¡§>$C¹˜J®©=¶)ÞÄS¡×2•h¿Ém™ îЦŸA¼ŒN0`[" aw)÷”8Z- µ‰%Ê¥.”ÌÊÞÊ}ÃuàRU±Œøbâ½<ÊqŒy$!•à¼h•Êy§‹¬ü ‚ÇÖ3ëb6žÊ¹ÍŽ»‹>³d5«üäÅoÂ2C>c5”mEH'tgðfSÀ qæǤ/xö¤}FÌ”Zü‚5 ó/[A-ÿ£ð · %±ðB·p Á0 ]t ªÐµ®mžð¡ ± ¤€ f ž¦ ;U|µpw•'x,Ó µ@w0 Ç&¿€C¸@ 0³aµ ,#PÖ3ºÐ@$1 ¼À Ä1ÄðEÁO„L±%UrroÑ&RtoPA6OÔƒ0nnÃD¹ç&’p‡¡° ¾Å4¹· ¸ð Ä#+÷6ÅGµ€ü–b)ÖJ¸b»Ã8G}{ÕVÐ7&¦U“a ¾y„­CJc$ÄPÿ²Ð6¡²0WT#Œ9 !”Ù%\ÖÙ„H3 *¡yÄ` ½°7“È|*}R}'ºb&šG'fœr}΀‰ ‰à29“7ºkÙW¸TÑØ ìz},°0ðpZ§}•fó2“{|P[M0ƒƒ¾s¿K·Ås± P‹0i oP§EHtFZø§hÿòžð ­ÐM®`W±9 Ú ïøBB "¦0 á‰R)U 8Ñ ~ mÐi » ©€ ž`y®§ M‘ìfe0RxÞêO»à45 £€QQ‚P >QPbâ d¡nDQCÿoa'M¢yJY%iÄ’UÁ1¤ð'@&ï¶ –@ o¬¬W6;!nqPŸAÉ x”[¡ ¥:%æé ”W”„BXq®á*¢(º)š[bÒÿ†"§IÆâJ±U6¦k q€`kÙ•!«¢¤f‚ÑXÝÓ£HCP}ÀOj gÀµ¨ˆŽ²‡QÉ»U”s}@H¡Bƒ –E/¬,oP/H •K·tÉÄùauå{¾Ûx Ÿp ­0‚ Ê ¿¥ Hc4¤ ,þuÆPx5› ]ÔnC K¸0H@£€R¹§i# þ bì¦a.“aLR êiª·ï˜·ÿ?Qª³`$ôPy+ñ‘/ƒ‡i% z…§{t ü© y»pBQ4â´ É’FKñGL¤ m¡(Ü7e#b?bQ`¢C9„kœ 5˜®ñˆ’8‰Y©bçª)GÅVp)…¡I„e`©9JðHÀGÀ.M „ ×|ðV@0³—«¤;Ð\}@G~Pñ2P[«$™(S}€¥hndór¢²‹4>ÑaÁB‚€²È>óšÙˆ¾¸ `§­ …Q•° à ¿º 2Jc&C‘aP˜·² Â=ä Ì6±ô6¾s„Žæ É™œýÄ$ œ]''(ãd2­%ÿ`;ÌŸ0 iw¼ N¸vªàUR¡‘‘|£¡>„:E9ó F‚ ~g Ÿð$³@Rá4 Æ%™Ö†Ðú{qÐ%Ò”“Є?¡ ³4,k™ÂÄPŒ¹ðþüÄ·•È)wƒ»*yq€‰‡€*¦7* Ê•¥FJ ¸Á<úv)–Í,ŸÌVà P0àNV˜pJÎÔñr“'ÆeMÐxoà˜%>Ú[€ð™õ‘/J?{&u}& °€"Ÿ Õ¾(AA»F@¬ F ƒR¤ð‚Æ GS³Fól:H 8q‡v4CcŸÿ(… ó6`0à‡'÷§ŒÖªÁL‘`«!”à…bD ?‘ ¯À2yyéä5;_¸ð!IÔƒÀ"DDd$"!DO’ê¢ *n¿g©¹G9lC¸œ0k}QF2%Ä€Q)aC¡ÇÄRL¢'Ű-¢š²•U‰ñZb%}ÅÉ‘ÓPº°¸–pFÒ|J¯×2‰‘B)ïEUv±p¦n59×QtÑHÒ@9k66ÆÐšƒð<0uj² ¾¢é>* ù1?öÍ!—0R` Ò'®ðŽ}ò³zTð ª éT4$ÁÂs‚Ÿv7{xžF <´ÿ”0 ºP%Lä4á ¼Ð ¼@_äÉ2Ž6Ŭ ž!á„â┑+cœ"É ¡§ÀEÉiäÉz`=k®SügŠVb¡0R· Ê/ñ‘(UNœ˜ÿVX¶A½’ÑfÙJpý Hid,V°ÑȂ㘔¢œ@–{ÔÇÈ Òâ¶¥±f‚ ÖS­/œ9Löº XÊ„êPG?S!ñs oÀ § ²À ¡0 N! Àp ·@ à ¦P".¡j] `›ÿ>A&ï.(øE”Œ¦C¶=’†‡í4k] y{ê ªô5³ªð ?&Z/ž#ÕP:’ l×5 ™œ´& Çj ™0™øÕiý¤ª}RyÀÇ›!ùfgS´1o²Fa6‡›{½—Ì d$’jÄYžz˜àÚŸ•¸•´ý¹‘HÅN|b³”ÓzAM˜xçÄxŠÀè!ª +Qä—„`(˜àˆ‘~€èá Onȶ‘ˆ‡!9”óÒ°Ä ÎQ©ãÓ<`‚àY†0xZ¡ ¾ŽðôÃL—P!d€Ã\åFLدU·„mâÔg”+WºpaÂÿ£¥Jœ(áÂåÉ“«Q%qñRA«–'Xºr Óƒ'N¡bbÚ„)TÍKµ`ÀØÄkØ¥VµB]²51ä¨O—†œr/L½zmÚ3×(O—rQ¢äŠR-N+i’E©ØO#kaâ5‰BLµ†årõ,–§bÃTÈêå«WÝF•,æä‡ š–ù‰ã§’§Q—~YviÖ¯˜œ`bÜä‹5P¥A‘6}šôèÒ«[Ÿ†º´èØ |ùJ}ˆm+0qÀt¨ !+M†7Q#Α#U색P#„Hû   cŒùÁêÌ4ƒCV~7id¦ÀG8àª&gΚøy¬¤ ”"ÿT†P9ÇŽøã3xcˆ  ¢8IÂa$F¡à ¹’KÄC?Ä?.Q¥B0 i™†!f–T‚É…”W`%R\ ͬzé“­<Éå“\Z±bÂ"‹¯\ &Tð +^4Ê“aFÁ(BÉe^dq…”OÚ —avɘ\.Ù…Ю †]<‰?sºŠbpùŃܢ/°Û²:̰Äid18õ¿C_Ir–ž„¹„Ÿ0FN| ̶ÚLsµÑj¥Õ4ÜvÅ-5ÒvÃòNc“&Š#dÿ8 `8ÖØ5 ;b‡ŽÀ¤bš€Á'¨±¢¨¤‰C|9d“úœéòÙ„%`pA ‚A>`è½*¸$LŽ8À€)¦( À8ÀÀ7êâB q$âG0¼Ð‘GIä/¼DG )K AôtIF!ÅEa¢Â%˜SL™å™ÅHéóL|¬*YjqÅ\By †±BæU©âäåJƒpÙE£Mj! Kré``@•“\D—Op‘ô+^Þfçì…ëK<Ñ¥$¦\ÙÅ'K<¼DZ›r,,7± ”^† #^|*°Áh©ÄZ*‹ÓÇhê£ÿP ýäVn‰E—ƒz¯TiÖr½ÕÖØl] 5Ùl 6ØÓnKmAé8ãäàà>+Š+.Ô8þàÃØ>T0– Ò9B€¢M𬘅ñ@i’ªPb>øpE?0ñ#ÚF9Àò8ª0Cà¨ð$áÍ0cˆ!yPC!¬0‰#´ÆH6"…Hd @,†@ H‚ž „£t1Á[”§&ˆ•PX%N;ÜÛˆ$ Y oÆQXñ bl"T)Ó(:‘ñÙ)#YK]p‘‹;½iO¹ÉØ&qKp‰^YT¶„Ñ´aP¦$cs…OvQ >¨â†©ÿD% Ñ N.#‰ ÌôpR'ŸÕ]S[KG<¢–>4â0~pŒ&BʼnJ¸R¿ÀÅ%\AŒaàbG±˜…+.q aôÂW¯ jZ§_¹NV³© j¬§šMXGXJ0–q‚Ã?(¡<¿S  ÐP‹|µ8ÄOvÜxÇO¤Ù €€@X’VMDvÐ,q% GPAÁ>4"9ÀTŨ oA~o0ê`1 MÌšýãØþa@H¢C% YUANH"¡øÅ-D± vš¢*€ n£“«aÍ™ ¤(±‹KBÀ %d!ŒTÂj?RÜU0A ZÀ€qIdX,”ˆô¡nÌâø^EÔV%„,¼ÉAtáQ±åBžŠ¤U­©H\AòuŽ,ÍnfׄmQƒ˜4ÎÊÓ„#(Á ú‘C` H@b¨Ãa@ÚÈBÀ€<Þ‘gX`…8Àë~pÄÊ%T ¨Î!`—ÊÊÕP#iƒ œŸKüÁÎ<€ ðW ñ/c¢XÆ22•ˆµß$.±Hüä±*,h ô"VYÑUjñj”Û0(ÿ Vœí »ð/Úv ]ô"°ÈÅU~bÓMìb‡°ÊJ/jJ4mvl‹‘‚(Bñ. 9è%¨²¥Q\æ+Í -d‘EH¨ ,*Ä·lʘUe…WªÚOxš-Æeñ,>‘1]a×JôAN0ÕQvˆµÏd‚8ñ®SZ1‘èe5‘'f"S=ÚÈ.6²#!ˆeLº•¬JhëY#¡?ô†˜xKi*q€Fl‚:äªÅóJÓ›¹6B*òbáe ô± y`pTD‚‘8D²0‡>ìø ñ oHÃq!ÔÒYc»# ¢ÖŠÌ!B¤ šÿdâ¯xà(j!˜Mt¢‘0ZÝ`’¡@­Ÿ˜È'ZaG–å"”¸ )ì8 ÍaÄM2R“( ã-S“\ö™­@Ù±™"S(á‰Oì‚£h ¥×ÝV8<„o¬@ˆ0ÿD²3„s 3ËX‘-O²hˆ@„¨’ÿ` Šð†7Ó̘ý©FøŸ9³Ö: * 9 Ù¢ŒðÁg°”ÛPœ"…_x1a’Ê#Xp^…YH?!ÏѧÀŠ¢1ŠŒ˜„K0¡jû"^h…»h…V Š»@©â5–I\Ál‘ =¼VØ!0‘h 3¡„)‘¼‰ƒ„¸Ã>X“¨±ŠÙ³„žâ½‘…Mkª„Ÿ‘…O€Rhž C >Œ¸šÍð“V9©©H Yà…°Ø…èÁ*®jEÊ•KX’^+Pˆ±°ú·"Ûa?PƒNÂ1?ð2lù”" 8L¨‚"À‘d1«àƒû¨Ž>(ÿ?€9_°üðÙà+ {9gðƒb¸²:qœL?úƒ„€„@h„80„?Ÿ{:£Œù¬¦£s-ú$‘9Mè1$ 1$Á¸ _à„OÀ#\„LØ!A §¸]`……š…WíºÆaˆ5!”‰79¢VØ`¢aÈ„K ¼„3¹¯·¡LÓ4±"<"?†b3²Q"Áš]ààƒÊQ‰¯è±‹œhŒW¡¢Ñ»Ê„V(/^Ë„PI¿yŒhœ(?ÒÒÉ£]¨›/š¡O«»FR \ѪÙ%©“:¯*D€# ÝBX¾Ý`ÿ«#ˆä8‚ê8«P™—@> ‚>P—ì¨ÉHHH™,›ŽpÁ gØ„CXƒZh‚­¼A¿J%‰<N¨E„ ¦E„8X„?xOø9ˆÁjÚ I:QÀKøËAJ ®€'«`´Ð˜ãU<-!ÃÛ„Oãˠɉȅ  ¼Zh…Oè ©Mhi{µ¸®Áº¢ƒ¸¨û‰ÏiÊ‹V š7Ù…‰¢\ø…5<Ì…Y …PÀ° „º’È’¬pÈš¤š˜H •ˆ°/ìÂ} œÀ’¼» Ä„NPœà<"˜À‹º©ÆÙÀ =<ÖÉ=ãÉÖ ÿà£KCtaÑ +À„ూÒêk¹ºä8Åø 3xñƒ>@>Ë9Ì;WL¹k<¥MP¬@càP#9òÄ@WIHà3#CИ^¤O(‚?0„  <;­ ´Öê·…7$D™…OpÄqÇh ¾N€"Òˆƒr᪋Qˆ…]˜[P¸0’¯¦¡Í·`R9É à¬„¿øNx.¡7P³#â Oàƒ2‚*5áF²‰›¸ñ(媒:åR JÀÅ-º¯Ôœ Àù £ð‰P )p»(çÜ4JxˆÁ®¿3•ª¸Â+Ἲˆ=kkäCFŠÿÏøìÉú|Ø9H’¤Ö(°Âfq·"9ÈØËP‘1Òà±&H °R€Jj…pÉÝÀ˜«_@ClÊDKB°„a0#_hްé¨>HðƒA`QA;3@€CXC€ƒBøEAø¢#À%º ©«¤ã¦yR >˜)"ÁN¸AZ8Ökt´Gô#…Y®l9ŠŽ’×Q\à"(™šò¢ý:S¸¼Ñk¹pYP.U¡M-!ÉVÀ="©ÖS…•…Bk`à„Lð5\ˆ…2”Mâ…ÙK ;*åGU¡»ÃÇP¸A¡PÊp½‘­A°ó¨Ÿ©Ûû…¤uÿ áb“EɊùÆF«8¤üT×H$?Ô¡|¤®U,û”1u–&0–;³zŒ> Lš üt9O¨Wì/‚ c5—Ù0Vܨ:•C¾ Ž0‹ÐF8?àƒ" ×¨> 4K3C€\8€ƒÎúVÓ¢˜j*-Q@´ô¢B›x ¬ØT;F«—\´Ý㪟ܪ><¤üT¬tùÚñØ±Ý ã…ÞÁ„äЃã±Qzʹ’,Æú?( Õ Ž¯¬cÀ ¾X¢@Òp†#?ëi? ÕÛŽd!¥ì )ÆýƒBè,@LG€\ Žÿ!Æ 1ÀŒ©Îm×ùÑE„KàƒB‰¼‘´  ‹^¾ú˜¡h„O˜ÝŒlñƒWˆ…·°Šñú4É ¨2<Ó´)ÄᄽɈ–Ê /«¢Á[ã£â$ ¦xßM¤ƒ¢0‘“¶‰VˆR“ÌJø #š;R ü¸0œÈ¶/¯ð ãZhÿß_ðØ\(!ªid^“KHˆtй É©8_aÈ:„pµE1ÏhüÃPÍÚ\>AÄGרHËI–Þ¹ý€+hD ƒ„à`±"ÉhKPÀu¹PŒ8VP@ËÙL_¨áñ—»ü Ÿã™³„*ÈŽ4;3ǽÁL™ŒAbùŸjÂä3DÌm•­‰$4ª1MJ0PèWªÛÂРƀL…0öžÅ í2O¸’]‹ªñ¼¢¸CÍ+Š—ô‰¦ÇÒÛ!OPÛÔ#²y“mœ{œš_ µŒHIޏÁ¯P.ò”ËËLpVˆ…óú…¦¡–!…fàÿÆ‘ ‡=§.¬G¬!"ò >Ð4» ÇP šT|²6Ü{ ùÕ°öIZÙÏ,#ÄBT,±¢†r±I—ûX?@>ˆ3ÅŠ%9C²&èOa¦Lmf–³D—¼j#»Ý¼ú8¹2”Ʊh„?¨‚o…˜"ÀD˜g<ã˜ÁÍíÖjW¡×º’b‘¡„†‚ ?­…ÀcÜŠØsCM…”È “¬‰¬)¨^QË¢™cšx•ŒÈ…Ũ’†šár’7=Í‹¬´È£0Áµ#Ù!èòmbÝ´Ð4Oó™}°8è¢Í+¡œ(!'yŠòRÙÄ…ŸMop+YRæŠK€”"ÿbXî½ gå„Ìð1©»Ø» -Õ=<±ð×q`Ó¨Iz`jxaÝ$Ûá¤&èñy>êø·TÄ„i½•Flë(ºèkP˜m?`€« —-kœj +?Ø¢²î8„?bÈu„iFt=-%ÆkJwíg*‘-éü’í–|™ÿŽíÚ†À´ ’ŸXáp‘è…° W •àª1<«ñ”MPJµ¡À#øš“ ’:‹Ú'6i=Ñ´}º ‹A&š}ä¿*óÄjœ½O{ ¬9œ.tU@tXj ð¼¶˜ï’h¡Îüø! ›x/<󴊪ÿó‚ÞC­â=NÚàÚÒ(—ñp†ó;JÛy0c¬d.ò±œ¾2¾JR—Â0>Ò0†àƒþ4+c,³ „*€Þ€@Ÿ,a˜#*j#Na–Mø9ÈÖ*ø‰˜mL Aâ¿;³$^L\ÀrG”ŽÒ ˆzª“œÀ‰ššM¸¯U{ ²1e‘"‹î’•µ‰n«L¨I®9Ô¯À -y=¥7ð‰Í4Hc~j=ÅA…ÝGä5£˜ß’X/YŒœh´« ‰¤9¯J²õ>t‹z¡Îx‹ÏÄN¸”´`ô XWæP¼¥ºÀØ=]ÖÉÇ•N¾>WGÿDÉb áÐü2 3ŽS¤?q¹*sYëÛ&€Y°Öpʤ%?øÂV8`—´D¾CÀ„¤ ÷»`<Àƒ@(ApÒ*­zÞñj"À‹ @ÕúÑÄ‘= |‘©©¡êL¨ ô“Ôí¢§U®\Àµ]¨c² –šc›S1œcŒ´¸0¯™ F?ÍÀ…°0R,ç5ô’×¶Ðd‘‰¾ƒo¡ù°HòîÕ/²è”/±„ì-Ï«ØÇW9Mw†Ó¬A¼À‹@Ir:a>RˆM &uZ RX´Nõ‘Ÿ¨Š]öɱF`¬µ¡ë¹PbA¾DJ¥Y‰1¾ê$cá€dÏÿI€ó‘Ó8„ïHE¬ïÕѨasù`º"¦bB `¨°´éBL00jâÇ¥…M”øáäg!8½¹Ç#G‰‰dôhd"F"±tÄèeIH2Éœ ÍK8!]‚ć'L›|õªµ †APEõòc˜PN²8 sE‰/µ,ɪĩ&®”¦Â5 ­O0Ze…á6ÓS›0 £ÔŠX­_®vQÂåi˜ÝVc[¹ÊEÉÕ§OžFéÍåÊ®K…qEÎ…KÛZ 1qª$kjÄZ}Y´Ä‰Ó¹B7ÕÊäéï.>£<ñÉåØöUJFav©r.aš›v¾I®MÔˆörÿæv5¨è ¨Q‹N½útêÓ·WïÎ}»/éÑÃK?DÍ!Õ ™ÏÞP:vV@qxˆ© (~M÷Þ—3Ô1ƒÆBÍ&ÅX2„8ãŒCV0 „ E¨â‘¸Å!÷¡¶ „T‡˜(Å ƒ,bȼ‘Ɔ’HI*¡t’I‰è8Ò#0=BM3éHO:ñ„—ðáJ(›ôâV/J9¹ /µø²É.¡€µKP‡QŠi[Y’&µ„RËUµ ‹nsñò¤fUµå ½PË+·ƒÉ0—xâŠ+‚Q2 ¸<Ùb³ÝöÚ(‘ýæ§'— ³Ë.YmuU%™rbI}XÿR j&ÂÀ‰f ÉrU.|¨òdŸz•,\zI.Ã\vÉ.Âp 0šÑ¢Y'˜´RŒ•On¢š‰MY×vÙ}ç]³Ì‚çKwþIçÌ! È@~‡¨g!Y—(Þ‚B‘M¨GH04 _u¸¥ž3›Dwˆ3Ú6ÑǘXá@ƒ·õ6D 0 }´¢BPè6’â"€!H…ÀˆH<ÞH£Žôhc‰ô$‘ŽøtÊD^"Y+µôš½ÓÍÜK'Nr†I'œhÒZb¡€Y‹,¡Œ ¡´Ò .¼=ŒcFu¨HÃÀ‹'”,ÄË'¤r&1¹\2J.œxé ­ÿæÊ(Šýò›×‰¾ý )ºXÙ0`žº$%UÒ ^©‰ZÒEke/œ<¦Êªž¨(Ô™Xb %‹å’‰m2EçjTW"s/`un"'ÊA»¬³§c§wâ‘7^xØú­3 0pµÛ5‘ïvåå;‘ìQsH#µ˜wž½ÌV×&΂rìt‡øÑ $ @à~ÔÜ Â 5؇*/Dàă<ÇÅò ¹4’K$åø’I#ŸôˆL|ðdÓþFžìg.Íi«8ðO™Ü¢Mhâ± ÅÑ*q¦Vh‚»)Z‘ ­T…5šá…¨ÌtµKbZ!Z,øÐ”LàsžÈÅ.–ÿÖ Å¸¢O“iÔbt±R$f³ñ)pA º &•PÁ0>£‚¾­l‰`ªDDFE*³!GTÁc ŠOH†|P-Ê2 NœÉI3;Vè¢t%¡8ƒ(:–BžƒšÔ¥ZÊ«cïÆ“òÌîy¼‹Bz× ñˆÇv à!æ3 &€ ¡ÖêžW \ǘ€¤ô ¡‚>Œ~¨-²U.æ)M8!¨>~8BŠa±7x"c€¨ƒŽpd£‘„F;I"òW“! '9‘ PDµÜù¢hÊ&BÁ%JÀ%‹p ­>cKd‚¤Ä'xáM®ÍbáD -¸´4ÿ É,Ÿj¾2ö%2V©Ä%>!4b 9ª…×táCWùå¯T+ÚŠJØ…´X¢ T ¨…Z¢ÐDjL´‰`ÑâiÅX d…‹O´‚˜]qN:ªeþ‡Z¡ÓÖƒ$ª„¹%+ä‘V$Y·:œ²§Úz¤Ã€ð R¨‰$Wu %¤ óÑŠ/Ò+ÙñáÝr2.Bì§ð$R`ÐÆ†”¨Dáò$ µCü«gDF.ñ*¼¡p‰KD–F€ì%öëQ^obCì''“É%2”ñ gM ¨4–L$–š¹)‹àºR M$Î(Â"Å/tÁ O¨ÿi*²p‹,v“9¢ÍI5}F+.¡ÁA$èŠcþI €Æ­m~aUdˆA©,iâT”ÈT¬*oZ¥+*€bjÒˆ‰PÈ¢JÃÀlHº4¤DÎ$DèÜâ¤ÿhËZþqFsš0¾Põ,J˲#¯Ó»ëT ;?í£¹ÆC/Qæ'=ùṌz;ŠÀ€êµ!jQ‰Ùw9µðÃ%ã“­>fµ  „ë­©Ú§”âdõ¢„Aâ#p(Ä%AŠ"pì}|U Œ=†×‘ÐHˆfamÜ“>øA’Ð(kê䟬R7§Z>/áÍ ÂÀ+ • ¬äOÜ‚¦ˆ…#Ë”cÍÿ± %NZ&ÕBœ”Ñ /ŒLM¾¸b¤(cºFŠD©>Ôe.B^LNš§Šh%¶ÄŸ„‚¡ž:\Žƒ\´bR­˜M1eZŠËsy&ÑH”z¹w<‡Ê}Ô+¡DòY¥Þ©óijºÿ´¨áIª¶ y;oqKÖf#9°‰‡tH ’^Ar‡<ù(D9ýÉVC"œTWb"‘ÞjëhöNô!¢GàEH\…ÁÛì3„üBòË÷õÈ~<ª‰1Dý‰'=áC&L$‰-;V[˜…a`{ZJH&Ÿc(žË© »¢J ŒÅ%:AŠ„_‰©=! 2 ^¸¢ ¤ÿË© ÖŠL¤y²È„ Äƪw>c­øE,bñ§FÛÙ‡vö^¸E†R‚ t¦’ø+»l“´ckr1 C†‡‘­á6ª<3ŽNÊ™F{^d)ä¤8»)븓uùêÔ¾ªfõR¯µT#$[µ®µª’žƒ),ÁÙWšW³ÙË &¢VT×þàËBRÂ!"‰>ȤSØO :5ˆ8 â (·Câ…$G7bÉÇV2¿ ¡±DÒÿn¢Plù(j,s&C M-õ‹I=\j^mYdÉÔ­¨…²•©p‰K ´`´’´w’T7¡0 Í—6(\8f¤¬Š›'ÿ4È´Uù°Q¹(š%ŠK]@=ç}€¢iºB‹Oöá*U¢J›]!‹tÆ6PQT4çž©¨›Ò”„ØÄýáϹ^|z(ãzÖÿåQë¼KHt´ÚÒ¬q ­ÙέaG³ÕÎ!”’„$Œ·ÀÀádJ«Yï‚XIO#,¼Ï´B#4àU$ìÀ¨ÀáÅÁ^+B\B@H舸…ÌýäŒ™Û »–`}žËlÜi„\p™\\‰[0aÍáB+ìÊB€IgÀ@› CÒð‚¢MœB Žý é½É“Ä–V¸‚ HÓX\ÐX|†]Ð^a0š'¸Ê(ÀÂl䙟À)ÿ¨sÅáä°'tß÷F¦,Íiu†‘ÑÄ]Ðo؆,`‘Í¥–fl…It‚ß)ÌQ(hDˆ'tBƒÝ‘|E OÉWVÞZ•‡ŽÝÎ(4Azô‚Ý)Œ#Y`¹˜P^' U~ø_‚¯áΪù+€4‚DEB BEìÇü A˜Ö#L‹„K˜ŒiüÐØýÔ;Ú˜ Oü’aŽ’Į́œŠÅQ“¤ðÉ™èžáøŒdpœ>*fpB.¨ÉS$d•ÅÕ|B.`IrÜíS+삚  0†æ‚Ñ'´™íVôÕ b$ÑÏÿÈB×xÂÌuÊ÷q……“‚}N-†š„B›‘ÔúÉa(-T”%€ç‹š°Q™ÈÒ‰ Ç•$N¡Žó4Ø|±buø‡y½Z~Ä¢¹(•šK´’(}šà‡~^îàÎ!0ÐPàP1z( XïR7ò%D£CôA lÒCÄÁ\O¤Aè ¸¥ãÈ”JðU/¥Ä: $ÉÊÌDè„ÿlÄ˸ TœÑQ…®¤™ÄÑ“P ƒ&ìÊMZbÑdIÞ\+ÅP(œT+¬)œÖ.—8I-¤00š,hBBÅ¡m¡H=± I>ÎHîÖ/ÔÊ©¸‚‘Y‚ÿð PBE¹äáͪ‰ÃHâ\ ÓJ%$ŒTôÅ'@ šÏE#mÂTiâf4jàN3 *>å¦ZêXeyYGT±ïÜšúW*c~,„„Ü¢1 Œ³0€ˆ`8Ézà" 6%P’P%(5ÊD†YC4‚ @Â0ÁæúpÌý$æbæÕ9úU/Á#°£Mè‘è˼Ìkh¦zÎÅÖ ƒšˆSjÙÖBH/Lš¨Ÿ­XŨðŕ͙PW¥áp i™Ÿ9ÁÂ_†~†g0ÐaØÆ¡(Æ(<Ãn%Æ;½Æ,4 Dºa¬—,TEIqÊ&yåœ&Ýqÿ-„ÅÕ£†lUÂøðÂ?=ÌçpY½„"¨×Þ©W¨—BDDg Ÿ|%nv År4ÇP¼Žx<ˆ[æ!)Ò‚’.•[ðN}øeä'Ä€ðNÕ…Ë„’`yB/+=„E…ÈôÁ ^‹xÆÄˆ#ÔA/‘ÄcÞÏü0æ82æ´ã‘áMId¾Œlµ…z.D¬r 'ì QéP—%ìB-ì ÈMB[ÔÂmÍ…]°kœ– ÖA͆Bô•ÅXtøqÅ'¨Üœ"ç,ÌY¢|¤'ÌŸü öi‚X| ÑÄJEQ£`D”gU”W(SMÊ`@Ѹ‚Sô­ßsÿ” —=X#O-¬,ó¼§RŠ kt‚ÖÅWvœZy9Ã3ÇQäÎOùŽíX‹|­ñW!q ú€AȰòTÁº…¶¤‚@Ø2Dï ’ˆÁ€(D.RÄMì<Þ˜A!ÜÒŒ‘#¹^©æ•#<Ö-¶žLNø¼EÕJM+8Å” N e ¥hk¸ë¢Õ  ƒDÍ y“%0|Oò¨LŽ,\ý¦qÙ†¿í)PþÂBÌ)F1bE ÍÃF+|߈öM(ü ¨lŠ\hFÚ¸kWäîßTgý¤14BPrbÎ(PÂH-ÿ”R{Ž !䌼ÈêÐNQ‡¼$Úp¸Úr|¾ø€Y) •[> Pù,5(D€TN@TA#Á&@‚&D‡z!ļ܎¨zþ¡Ò¨LZ%@p!4A4_‚<Á%HÐOšDü¸˜å… ýȶÊÀ£1) 5eÔQÊÕ¸Iå˜ÄE.x©ì‚¤lÜ–(ÄEÄåœÍP•l m‚+°‚,<'ì4‘ÑOö ¨hÒMÍùÉnµÙU_«Œ2TA„ѦœÉ;ÇNâqŠB”JÒ8Œ7mudêF°¨ì÷Õ#=|Ò‰C ëRJ‘E4ˆ0ÝÍÿfjöRŠ×\ ”ÏöN€º%yX†‚ØNíÀÇØ©Ú§uȬ¬Aø-aT¡¢R%K+µ¢T”©%KK+q %ë“§O¯„¸”IÖ0Y²^ÎŒy)××]œhùiDÔi#?AvTb©OŸFµÔö¡ägÓ&Lœ8b:t((jÔ|ùµ˜E¦ªXå¦_Tad1’–J–rê$Y”R¢*¹‹©8ùÊHN …U”ò*ÄKÿf‚ Jv᪤Z*Qá.µÞ‚á­&`°¤cî´Ì@,ñ«#Má$’åÍ—^ 3Œ*”h‚ÌúêÈ/Ì:©L$Ô³t±ÒJ;„Óc”^”XD?QÒ³b@ ‘8ì@‘ŽÅ¢ =Yà +8¤Nš¬‰àäÀ£'äØÐ`ôÀ¬8¤¼8üÀIÙøŠ(D¾,¾ýðPßúüÓ¿û ¸Á€,¸`/¡äBŽ8Éd˜]rÙ¥—M¦ª*”ÖfjåFWó¥PúªE \pq%Lºl>+¡-Y,‰“]^ ¥G—‹<êC°\!ˆãÿ}råRf!å“\J¦9”¢²lª.‡"J…VTðR*.;Ûd²‘4ˆ—L`r¥•VfÊe*Jlæ“(>‹é#.Ì`P¡óBÂk­FBêÈ$¾!¤ÃzQlUPubÍ6él¤¾6éd4Gû8Â%qæ4œQA‘Œm±HÉ“LWBFð(d 2~à ¸b•Ä䢰a ôã:Àðã‡6êP $@ÁDÞšH8QB:I$é´¼F6j$@©‚6ø 1Ä‘Dþ°¿úèM$?ðÿ«×>~ÂVð’ )ŒŠ—sÑÄ N.­O<ã‹Z|,2Q Ùr’]ÿ¬l²ˆ ‹(Á‘FœlTûˆS8R#!)(–(‰1L´©@ì&ÃàE+Tá \,)SˆE+vñ ¥|ftSŒò”„l9J¡Š’ ^˜êq+3ˆÈ>A'±¡…S†3¢tƉËËÜRó%\€ÌÉNžÀ…†U³êÈÄ&Ã85VÑQ~DP¨ uQ+T` CxPáN@Áw?ðQ†.tÁ ¿‚€pœÞ€ QÀA Êp!y@ƒ²0‡|”_ÀÂì ;Ac'ÆÕêqb]ƒe ½?á ‚DQ‡G|ïÿ?ÿr„#ä/óé+_õ¡Á  ¿ƒ5 ÊD¸,B‰ŠÀ`bœh…%ø7±P|‚K(Š*|¢#‘À€,áÄŠpá"Ö‚-«…,°¤# e¢¡À ÷TK„¢j²pE,`1Œ}B %AXÒN‡hÂ)}€+ CYN K•(†Ÿô襺¨2›FvŠ]„¥N1‘IÊ¥VE“©b,A¦ºøÁP'q‹l8R$45B$„ÜàH'`(jÌ&á—À`Â8ÜâPtôLÈ¢ — Å8Aˆ? á &0ƒz-0 mµÃ'!;b ‰ÐÃ쀅9Ì¡”¥ÿœn 4<Áeˆ‚zÓ†IˆîÓ‰Ä!$A½FØ2²ƒD±ˆEìÒ ¸Ä.á½õíç|÷f¾Îǯ““4][ÍjÎOa~IJ0Ñ P $/ªÅ0>A‰’‰òäæÄ¾æ—\x"Ÿâ)˜PTC0ùÖGhÉáGü@‹Z`L¹h…'fá‰;zB+"H1\±“&¶m–KB A ö‰Kø”¯%üP‰Œž$$‰SãprK’PÍ—ˆIy Ò#¦Y½–MGú0¶JÔå–0TXGÒÅŠP‚™ˆCns©‰íÂ&ºÀINx‘á)Žª~€* ¤…7¼lÓ2‰ÿ,Âu%(á   ˜PƒhA zÃö€E(w@ò^Ì6Øzð‚Úe+`€`„$öˆ¿L¢V u ÷ˆEXz|–! 8\€@&iïãÌzáÇ^ÿ1_˜YH,µ‚Ħ9¿K\ÂB6ûPT^Ô—³d*KYöDt%¼HB8>ˆ·‰+(%hÑéZ¨`K_±AX¤&’ä¤ÅÔêä‰gMämE&Ȇã¥E%§‹¦ZQÆ4YNX)FáD¨D¸À] 3½€Á0.¡W(ă&yZ%l[ UT$[,$˜bá ÅÅiœ_Dÿæ >Tâ5³’1–KŠ_ü¬ˆE,p‰Êl&$GOHžÒâÐ"CZ Gdó¨b‚rr°Â¤ €2@ x(êðñëAnÈÃÉóp•oa y¬ðˆKˆ:šøK&± h5Ì’XÄ#ØŒYG,€- ñ‡I b_ÈÔ¿T §H_ù)ô¡– .OhÑ|hâ@-¡'À„+—¨‘,2± ƒî ³„ØŠP$Ä @ú ftÒ „hC”xÅ(ʱV…§ñçWÐ6 –¼w&UºI,H±m¯d¢‰HbJQ,Ñž¯¨`R+ …OR$ e3"éD/t›[ÿ”‘L&²’ôhü"Éo©ª…aFݺ@‚µMn'.aß™¨E$x1‹XxB¿0ð/”ÿ‹Qˆˆq…ÊÛ_tƒËOPÏ.‰Q’BJÄå$§jl†Ôc‰6p¢ ’ðÂ}$AIøCï>`0y˜ŒÊDü@“ø²&„Z4aÁ ” A @,KÍ~®Ëà`ÎÁ|éaéÒêüã{öƒµîƒ>ì%šb+ë$$aÈLîÀ¢Q"a8v¡¸FâB¬*FA&ê$cTêD†Õ*¡/j e4¡ûb&Lhfa´fÞ(M\!x!O,!øÀªâtB…¶ÍÿÕhKŠDÞ‚(AÝb(ê¢L,ŒH¼ÈKȤKð‹(A¾fÊâ(¢­ë<ªjª×à'e 䀀#è  >é­NÎAÖ%Í4¡Zþ£9Áçd4kÒ‡éÌç˜.át`VÁF"H4¡3xÊŸ`@ž"mapÁ·n­^$»¶äîÇr(Ï*èúzÂM¬"ªÆŸ*ájÊ)z²G`¦OJ²ÂÒ-œ/ú#*›‚/AJ|³½¾­jja-> Q,Ì·° '=T¢EGH¤ùö-la(šrt(]Œòh ¥Áú2,\ EóÀDóŠÄZÁëú€¿Âªh3Ðãi¼®.ܶc#"ap0z!’Ê ´ rÀ Ê€/!²báã$¥ù€X˜ÿH¼Š H!äqfþVáÞ`ŠI!ÆÀ· DàK ²€ „ІÐì¬Ðd¶øàKda¥F²Íf„‹›h“Æ!Ú©Nx!ET*Rånü´=ï0#\aDn¡D "K„ï …T¨Ö¤ €0È 2=ÄK0/KäFŽ`§ðâ4\,¬öŠ ! Õùpaß”/à8á/ÄÕÀòÚH-t$3FCÅÂ#h5‡ÖbE9웜‚ô*£%3Ã(AE# ÛÍÅ‹ÿ"!Y^à j aS€“¶à âl Ôà1-ÛDáNa`Ála4+>d~``áXá^ÁHAM¡¢ ^àü¨@>Ž ¸€ÚJOÆgËaª©ÃlÀda8sÁ†('ƒõu€¶&v‚&ã°%@‚>%qŠ$,[¡¶$Û~³îÇø kGu€"/¥^‚¡ªbSè&| ÝK>‚ oµHÔĆ üõV:‚¿ìÐE3!i“HF(¡F` ËÄH0O>AŠo*¢^1¡HþÄGyôzNB8AÀU Qr, Qh4rÑ:ˆÈ-$ª(ÿCþ–á`àÖˆÂ.ìÐT ¥jŠ„3Þ-ÃdKãk)î¢.8Â<þbâá± Ã ð ¸à P®j€ ò d@ Þਠ{‡ „À^Áúí2¯” `À6DF¡eca&Há.a:¡ôàäà˜$,u˜>êàê|–5Ñ‘Aè6ÞP$q€Ma¬vÁZùˆFÞV$…d;=aÖÀŒ¼­À²ON}µF*>â‰2B¡ÊbˆIšDJÊKf!¼Za|ÄGŒäÛj5g¼dz("§LÊ ªöÆ$”°#vÁ eâaÒ(\î°L üŽÍ-þ¶L…ÿvOb4¬•¨N„Á~sat¡d q†!1È#Öp£",¬"4K–ŸÆf(ø€Lø¤:b e¡s&£¤å/L=vJ#$Î#y}¡2Ä#]€àî* ˜ÀNµàZ "@†``¦ ¤ h`Aè‰0b&7Å0aIÏ“ÝVN¾Ž†ÆÄ½üù½ÿfpIW' ‡23 Y‹L¢øl;BJÒF¤ —ÊDnˆQ¢¿îb4Ѓ/JcbF7C÷ÍÄtAeƒt!na–Ù¿,ã*×ÐTô€ä ¾ä¦Oìâv σ¨Î¯%Et¨¥üD”Z¨J0¤#!(/ ÔÀ Æ€+ŠÔ¡Ì@úÀ¨`lfÁ"˜Jy !s0´ô®±#X-ó ¡ ä@ TáJGA”€—€ÉÎø%hW³Aøà×>Â"È$àñ»Ÿ 8`›À«¦Î˜5KÆÛÇO½îB¸¢g„ráB¬Â+”¢ÿø@ös†8ŒCÇȦ†cÂÀ±«ÐÂk–werÏe e`C 1½ª¤UShžŒ}¢#ƒbKhªƒèËÕÜÙ"g×ÂmlÔÐîˆeÉÂbËýÜ&<ÁNèÖrÝ–ò«æ—{£äF–ü ±èBDF…æ†ï±B/T\1#tAù¼ŽN£œBEÃr)äFH`@ .ƒk*ˆÝÓÀ'ã£ù«Gâ8\ÀÍZMbÔHA©©Š F7\¶•*Tdqîª&Ú¶ PölA>!Ã#Âï;P¯rÂVáú‚›¥³¨ÁÃu¤Z|Éÿöhg|5Da ›´ÿØBap]ïlTÝ ½ŽI~·ñ`ÀÃE›\¯®òŽòØÌò·ÌÕA»ž¨¸R'ˆ>~çÐ**û‰Êäe˜¢†0ÏGÐü?áSÝðo]0ò¢kÁÂ&dbFº"OÊÆ†kˆ£±(,¸ý º‡ŠdkHQc(›,šÞ(OŒÓe„ÛkaŒÂ®\00Á¨ã`#}*URAÉÒCK–%„á“’‚~8Áh#P#?G¬¤‰B,u,HÈO#ƒ*\¹¢tI¦M¾ÁØTk˜'a¾.ájŒ^02Qªd)!µrµâ”)!®L˜x Ã5ë°\º†mêÕ Æ+T°(©ÿÕ W-PZÅàÉÓ"J rĤEAâ+8±bH|cêi'N˜jÉ …I%N•\©Ú%‹Ï¨O¹.yʥ¸—`åªÅ«V-ƒ–6%ÜD¨–`ùxºÜ*T¯M´dÑâdé¸%¥@]µ"ÅÊU­]®<Â%ËÕ¨í¤<© Ê!EK²*ÉâdŒtŠmŠˆ®`à‹Md‚TªÅ}TP:çð¡© äC®‚‰›À0|Ü#:J”®HÐAmVFže¤šhÿ…ç Oºj³èïFQ Z¸Ë!¼1-(b.Y ƒ•ÅPŸŒ× ±gTÇáLE`†/áb˜®øÕ©È‹wl22i‰„$Ä0?T¨ÈÙRŠb” þèG àMƒžå>úeTü Þ\¢‘n±ÄN*3$áí ÎxHüÀÈŸ}ð‡0“”’8ô!#Jà·Z‹Kü„2U50± ´p…' à"‡ñ+^°­¾Ë(8a5Û€+àÃ@xÅU˜âÓ Å}Hgç\EJ“Áƒ/ñ‰W ASˆyœÓ˜>`"‘€A+d¡!ßÝçP’_ht´ õXK¡È.ÿœ‘>ì`Œ±IÅåJ¸´°P…/|a™Z‡ª°Á,>¡:¹hˆŸ¨kušG±O@%?êQŒˇ$Ê-×Þ>¡£Jì"ª¤W-I‰LhÆ9ÃÄEÅr1ŒL˜ (ác·T?T"Ïl„CLë–É„‚V½Ä%~q Cy,M.˜ í#A>aÞÈS³+›ÃáH8œh}´íi„<’W›ïñH$ž ¯Ç#ñx8‰8ä!’øxnm×ѭ­-ía ¢Û±hóÙV,F¶Ècó‹XGðG’6AyÓ{à žHðæp0$4@. eB{åûG$ÿ ~0? , ’ˆ‡[ a1ñh$oa>Ùz%˜£ä­­í- 5|n¾¶½Õ„ÝÄþx«#¸ý4ß*:Aý¾â.ªÍ›á-ŽòQÞv,á&îkÝ.rXC ·×HJ h#ðŸÃMèñfÑÉñ$ßÒ Nž6ákX5ì­#‹ÝoW<kßN£I v2Á· ®/©¹ þe³‹DŒVÃHäíŸ:"§@`!‰¶¸VôSèm®D òKÞ(A­­ …zë~«â­Ç÷T‰žVÝÔÂh×ÜÌ»\á¨9‰˜ ËÛˆ#ùúúûÊ“‡97q=ÂöˆÆ”°Æø¢ImMzkÅÞn³üôQÞä !øææVGT+7TúÆäÑ vp;á"ýèJ˜›Œ Gøï1ãûÅ^ÿ~éq‚—,>i €Úk° ƒâMŠkE×8Õ8~Ú ­Šß?ýÓ¨²Õ¬xd$ ņè¢f¹­Š»Q êf3”=âj×9¢‰GóiT«µVoRñH¨ ú=óM¬ä5ä‘pSZNëÕ¶¶NËüž&m–Üo·&9:’Ád«ÚÍÖ4µû2Ø–s"jŽš]‰h$ÌG>lÈv{>X€—×­áuÝÚXd-özÃmôñæ·³0€%¯ÅãÍrGâ-U$üÖÞ£[‘­ø©§í÷Oß÷è&©øcB•íðh4©×MMÈ2H˜vÍ‘D‹Á‘Ön÷YÑ KdqzèÎ"ëuö‘ªßY8m…ÐÚ¼•ð'Òó5ዦäD_ZØ›ÝI·Èç'Ñ÷BÞÇp—û1 üãŽd“*QxK5–C¢|¢-â. è‰+Âbóïµ/ÒdÍZÿ¹‰…ÙÅÁ¾¥™Åiç¹þésÃÞ±Ÿ^ê ?°†4nx‡.mD¼ká±Û ÿºޝ‡€Ù!+(|¢Ý¡üÖ)Ë·š4ßzߢÛr´ÝžPòÇ[O¶šQkÊæÜL4 O°«-.èш9Õè; Ü}×î~~ëÓѾ›Ã3·l]ÞÑÁÞ™™ž÷:¼=NXÛâéÁ ï´ã¥ßÒdž"?w„"‘ Z½#Ѷžo‘ŠoÅO;3ú=†Üߟ€û~l3Ö±M8’ˆ“Q­ñ€'Ús¾%ãØ t‰š?PèH„?çu<¾d›ú¬oú“Ëý–~‡-pÍ0u¾ÏÐ3uyz°¯æÖƒDŸS74à¸};Ü}©¨d¾½ö`ÍѳiŠKh½5†âñ'ú)™£2ûŠÃ¼#J(j¬NYIþÙI$ÜEFfÔïjë3hÞZ¤ûÜâ9kߦg®LÚΘ/ -݆»Wû{‡ ýƒŸv ý¨oæ¶ÝàeuÞÁ,K}ÓzCÿ¢Á²Øï`»n„zBmÜZƒ’ºGŸœrûþ‡ªø~!МÉd”:š 3³© >ÙÒBÐo÷ Þ|”°ø ›‰ø­w{uk·–úŸ±˜žô0=´×~ë=êñ^¸¹v˱d¸58s­ï‹s]\¼ÕcñºÇ¼ãƒýy½ã£ çðçƒC}^ïšezlcÁ‰>G5²¦ÄÛ2m»–6å?œþ[DÇ<”’Ô:¨EƒÔê ‡‘æ$‹ÈŠÖ• çlÇ´Ã2³ü¹{øÊÝqqöÚÐJŸwÂ5sîÖ¥™¿øÌrÓï½9‰0{óÜ­™k¸w¹L781Ü?ÔïÔ;¼^‹.²¶`“üžß#Iôû¸ªhJÕj¢Ò”ø R…wÐn` ‘Èka²oÑò‰e~pqfpf¥žüÑÀ•Õ?3p}pÌyå–qÁÍŒ|~Éhð8{g-ç/~vÏòÙç74àê¸éb‡Ïýõè§–A÷ªÕ;‚ÇY—÷¬×°Ð9²ì\ðöMoŒéz¬„éqÍo‡?þ??gð^ñ]ZÄX§Y\ô2Ε‰ ƒw<Ÿ Á?4Þ´žvݼn¡¿¼ùùŸ]›Äã—/÷»k™=îÖàGýƒýÝÞÝÝ=þƒë„nÐà´8{{`+²‘9…ªiÌŸ<îUš‚·¦f»ò-¢ÀJD ¬mô…øÅ;‹–ÁÑëýýÓ_ÞùÂ>ârÛ&-˜8GÍ+3>û,·ÒçDœç™tyž!ÿ°Qüñ’ÀÔ~>­ Üóû8ŸaÞè¦é¡‹±çÎÀÀù[Wæ8ÿÄ'wÇfFÏaÛü@¿sâ3Ã…þ>Ƈm&¬gÏ õÁ¢‰y˼.ŠoýxüCMÙ<­¸6èùöøiòƒ7‡¿ 4Åâ\e'ŸÝ4 ~~Îvuž÷ÙoM¸/z°ßbá¦Äµ‹£8i¤)î£3_Î0öÑ9%ä£i+næÒÐŒý¼Áí1.ÿèË¿èw³Ã×.ÐAƳtnú3væægË®Ñ+]´ÕÁŽ>¹ˆ :cp°÷ÝàaZ³Þ5}ü#A$À5! ¶%¥ÕšÚÓ0yâuN^º´dpzÝ–Þ[#}f³#®;Ën†iÿ9Ê;·Þo·SVå–"¸î_ºfŸôÛç=Ó×ûw¯/ 4ƒûoüÙ ƒ‡?=K cÿrÐ;`4¸ûûX“¡oÌÆZ&ÇWXVop:ÍV/X°­x¤5uâʯ@v?ün–:šhË!LÊ0ÌKàŠ9|©ÏÉŽR£# {낸IûŠÇsÕcd<×ì¾ë‹ƒ“¾QýÜf&9; 8S<Âýlÿƒ‡ÔýåØ׺?þì³sÓ¬sÊrE7=xÑ£?Û9òãÎcŸt\þâ|w‡®ß ëa{¦½‘­{ĶG›f7¾õýšßßÔjÀÅÍÃÜSè Èá¡Ïuz½n†C:Ì-sÜWœà´dŸò¯ÏÎ0Ÿô}bY›5Þt »@) Å`#¥Ì-›é¬`ZBÔ¬Û¿8‰—~ôÉõá ƒ3—G?ÿÑ'³N6HÛ½^η<âZÑõAÛè`uëõ†‰ykün ßÔóøŸ" ‘CÍ¢$NÇ„lS‘ÄFLl÷b?=1f·|j@žUÍ̺@`£g‰öù]–[Ø=;KóŸLÌÎ]…Y04Æ ”‘¾ÖaŒ~ÏÐ%†¨Å!ã¥/ô£ÏÀàШ^?}nôæ­þ!çE‡ïÂÕ+§‹7OI¼ú zoC7Ô7oítüúßn/h©´©…‚ç¤ØÉD¢]è„æG¢Ú{"š´t/r†3”ÇM£wtÿ8…—o|u}Í3{í÷~â¾k·ùDl¼0ä˜á/?ÁžY£‘ár-ö/cšqû<‹cÌ’að³Ñk³Èë¿xmÉ)™•ëwW>íûrÂãbûû¯tŸ±¹''{ÏÐÞ±ÞÞó'«Ïäô ºžoøCÀñ­{ß@DU¼©I”0Ù§j.#lYyÝÍéQž»µ P‚‚w–&‘çžó}Þ»ÿ|åoîºìÞž2¿iå²™ZcíŒÇîö/oœ£Ù[zú®Ýê]üÛŸ~餘þQís_Xº;¦-ãk—>ùdphäÿüÑg^ïk™×cë€_èîéu™‚6Ÿû²R8¢éb“æñ?ªx‹ßQâ[5rƒëºÅo»ú—¼»Ü)ðÃ85{cꮾví«W®ÿdyÙ¾d£íöY-Ø{å¢]Gc3ƒÃ}~ûÝeŠ¢4n¹~Dzr÷Æ#ãr‡ýÇ?ÓM_èï˜øøÇŸY®]¾Ó?û£Áez°ß wÄÞ±ýƒ^–íuÞ¾Ý=Ø7áð†ÖÇØø©Žÿ°EAùv_’ FfN4JHGhÑá­9i±_í£eÇ åùñ¬ßsueé«ëËw²²²ä»OØi¬ ,SÃ>›b¤=s7®z‰ 2C¿öòý—Gís”{ÆÝwõ¯?9瘵ÌBSÚÏß]¹zçÓéÉ©•þkÓ]¶”:rGßköÿì68oÞœ_`ç½-ŠGþˆáðSÜ€šH ¶ë ïÍÚ6a à)n6èánX©9Ú¾dôû—î._X^¹zÏ·lwc³›ÆxÄ8¼ÄbS½8¤@µ9ÊxÕáÖŸýõ…ç4g\£9jz˜æ°µotÚ{ëÒª³ãÖÍÑ•;w.z}DøíÃÝ.ëøÄÚs~è¶Nï\ŵJßû!SÈüì8 eN„›ðOw{¢·X¬£¹®ÎÎќϿæŸ3Þ½gôPž«_­¬ßóÙí6øé)ls»½W`|N®PŒ-¸)ãEcãúÊÀ „6UŠ¢nÄcìœßÆ_ñ¢ë}çîÜ™×Ù]gißj€¡Ï:LgØAkuckϪÛú ÞV”hüž6‹>èOMUÂðp«Î‘»ïÜÁ«s §Ü÷Sûœçªß?ëwç쾕 nÚ‡íì^uMMºF–GhÚmÅ>¶81'Ê´wæç?»e¤/¬ÐÏ»È0FšÓù+g§>]^1LÒúlsÙ~U·ê ÛÇýýcì*oÐ ~äxÐܨ;åxüìߑˆ6«Üz ¿¯x€„âÈú°›†ÆTüƯ|Œñ‚gÎ~ÕwC±ÓöÙ{W1¢ÝCóò.·k„_wÏ^ê5r ¾3(*._¢|ÆG7–œV,R‚äí¸i¸444z{Ò§¼?½{Ñ`™¾3Ú74¨Ç“ö=¾Òß÷‘ž·#ÞÛÿÑ¥iï¾.¤Õü^³E?¤K‡6Ù[dÑÈx¿;Њ¾î£±ßçYãðU£ÏCÛç®Úéõ àBV˜FÂ6ãéYïÒ§˜ã¦\˜®pá 3æ˜9NDúê•/½Ÿ_6ÌôOñøÆ'3}ƒ–Ñ[?ýä'_,Ó mícù/ Ÿ;ôN«ÉdîÚèØP&~¯¥,‘È÷U%nê`â.‰ý× ßWœñMßpÝÆ?ó߸á¹K™e §@ià ´™r·[xz„µÃƒ.ʲkúö”K6«Š"mq¹ëÓÓS4ãë¾uá³v˹řŸŽ:<úî˜ýŠW¯¶¬²cºI}7óŽ;ìÙljÿI9l8’4«ý!j­èë<Æ> müŠÁ~Ç5÷¯Ð7ì_MQSœGÜ¥(ï0òLͺV–,K“ë¼ÍMÃk |Pdš.M9Ï ÎÈ…‹¥o,6bY>ÿùGó®-\¹¼Â $â©»†i=ÿñ˜îìùC7Û i$½G÷»žÌÖŸpm^·©òþ´//ÜÿŠñp~LåñÓ˜òûìÁç!ì}Å) žÒiÊOO¹®\ mS~Æc6‰æ~V¡‚]Ë·˜Û^îcåÖMfibj}è¬aÚ²4xóάá³q;À"-ð4Âg–ܴݵnw /œÑë‡ z‡Açuüj!¼y_p÷is¾gx ‰=ÐÆ­íp¯‡Â®¯nø9ŽIa°g3v¿ÏOûa’ÒXTda6T‰ŒÝ=;îµL‚a²8çÌkëÎ)~šºá\š³ ØF®]ë½rçæ½r}å'–IzÕ¥w‰.ƒcퟘ_ÛÝ30£÷êõ ~lÐ0æ€YÔÝ&ünêbüCªhrؖš²E‚þ+Œ™G´ÿ*Î C6›ó) çá8?eh™ԼΠÚÎÐ6÷òìÀµkW&Eã#XR]Ÿ]šïcæ(åÆe M;?µXffÎÍó®5ç‚ÛåíÅŒhdf¯±ö©±îéþꔋ±™é^}Bߣ[‹hã?t‡§‚’7@nv§Ùí[Á˜óq4  ãó@üa@"áM¤0Lj bÀŽû§–®\¿`sqôÑËŽÎwŒ9Q6ÁÛÔ†2Rsׯa#wc€7Ûx·Gp±«´À˜cº!Ãù³õ=,¯[˜ôÙXƒEÇ’í ~ïšSÓ@èÍ€F•À‡èõðêºï¾ÝîöÙ@Cnø|>ÎŽi‘Æ Çv3šC„) ´¼ÊŠýî•Ë—¿€Ã²º¼‹q_š¤à[}.G ô}nðR`DÑ#ÎUzÊ;vÁ߯qFÿŠá£i¯sj|Õ†lcýÝÿÑÉö8ãNgæÃöVsÇûÎü°ÜÓ¯Ca+ï†án·ßÅ@_ì~˜vœx@Q60]®Ð0mv·ÝõÅÒ'K—ÏëÒ·SýŠÑݪiœ“á©I¼âÂмÒÖÞìóO{D†ì^øÉ1VK?f¹ÓÿkGW§×á…ùÿAØo…åÓq e×.žbí9ðeÕ½âÆ>ŸÍmÇ>xc#1ô#ARµ~ËÍŠâ÷s~ûÒ…•å+³‹¶ÜåQþ†÷Ö|§¢êÁ;³ U_q-Z, ´}Ä}õÇÞ+†EÖa¶{»-ú5ÞÙ=Ò3ävéÆÎêÏð:ÇÆ’׊Þû¡Cìø@ ôe Un²‚ˆÛçÈÛl|Íñ4ÇFI íECæQê:ÑmèÍåëKËî34X… ð„s¼‰è%æ[âMÍ~š¸Âˆèʼ…µÓ+³#î•ÙËwÎZι. /Ð܈Á;Ö3Ø}ÅkuêÙžùÛ¿ëY°†ÿh%Ng›™@¦…(¾¾¾¾êòÙ§làá ¡Þ˜u]%F‘ CI‚Ò<8Êc¤¯Þp»/ LŽðXñMŠÃx;­Œ#bwn­û æîtô§,†+ƒÓú½ìýW¾ì˜ê¾3ÔC4?¥ÓŸÕëõc¬æ—×ñÂùcª4u€ª‚d4 Ág€˜Í>7¶MÙØ#p´È’X%¹&@¶€¯ë"©©B”“† WÀ¢›' xB•C«Úl•UÄ5(Šó­Ê=·féôY>[r½2;¹Î=kwéÁ#NÓ;ÑyÓȤïb»œŽ…Õ©ÓeâßÛŠ{ØÑ’ÂÓn̼oËÖ ­®»}_AÔÁ(Q"H‘!ÀËõº‚Á0 ®aiø ïØwÕm9?>A4*8uVj"•[…Oôt7g4â gÇ'‡\FÊn°Ï. ±–qûœÝ½0ásèñ½«S¶š2³zýíéžn‡wcÌÿTi­MªZ+‘·ÐzÈjH¦2ðYjB­^¯Õê‚,×ê¢Hqm;E ¼{ì>;탓ƒ0^5rŒé1Ç›auºN1â²x—wØ}~ƒ«ƒ5s~áW¦À ÚœÓÓ,M‘7Ò?¸À²«A¶›5±Þ1Ý€e¾¯o#t*äñöÈ×Èø°êï1CìŠÕºêróSü¥#ˆµ¡ëõºLÉ”"Ñž *DVqÕÇû9;LX†V07‚'\M© @#f’ªÉu<®Ë¨x|$ÁðrÞŸ]ú±×=î´ÓÎf`ÁêºâfÆè©“écC·<ãâ‡÷{{qq¢ãš¢dšÔgNŤéSÖC™Ðk—Ë„ƤALÄ:àhÔjµFC’)$ÉåÝFlD´ÇƒƒœÝ§è H+6КÕ²oD®~D)B¦$Õ郄$ 8wæê£Çfýä°×¼gÉH=“có— ݆žë·§Ï{wØ™mvd™L>…2­9aEÖ®U_Œ–`ÀnÔêFµV•ñ£ŒiÆÎÀLÂÌrä§IuÁ­èm½Š2æ˜ãHëÚpƒ<Æ1‹[qŽÞ¡¨%˜ÙUFÀüÓwŒ1÷ìÌĬ(û*-S\̼êÂöÉ/†t‰ ÕûàTTâ[Í©û–=l·& ^à¡@h}p<T±JhKB”Ú³*½ªH©„—!üØÃQnÚð¡Œn÷ˆÛ9ë²Y)xNArrRsŽù‘%¯^±{àGl. •À½g?\€)ÚÍB‰=î`ìÁ ð ÷¯ ÷êzNUø½yÚœx ó^U2!b°½üzxmÕÅ÷ÚHº¤$ 'E¯Uk’„(ЙÁ”ȉ x` #k’ïEÇ5\ÆE ðc½Àè_`iúÚ ÓÎ^´8zè±a¿uåê Q”}ºn}—WÇ FæúÐĘ#„G®u;ôÖžEöADÛ¥xØt*[›-U hbž!?Cgs沄¡ÎUs>hC ß 'vÂòÌ~xME,AÌé¦àÁH¥ì˜3CI­AfUqùôLƒÒ33NPžk«+3K4}etø·¼_X A£Û«svÖ©·[''ïÑæ.N ù g»#Ó¿u°Þý½ðÖC@þ0Þ®xkØL¢¥àë¤ìrÃO(ã·š‚à0Ü@PøG²Œ(,€µ±ßHcPñGv0bô)Ëls›§\³ Œ±Á)fø3Ì`qŠƒ.a´Ì„×0Di÷´wiÌÖ;>ÙÛ‹Gp×dÿ;žNÞºÊ:A|9!Ÿ×ÐÝÿÑGó =ÞÈCMQ6›^% o6g¦Å–Y`ö:Qšq§©xÛ†%À[«ÂG£¦Ö«2d ¡7AÆEA1pdS^[¥m6†B þÊ?äaæ™~72R¾sŠxaqþ¾S”GjsÊ#äîé|>È(Ù?3œ5_õ¹0'Š"zÇêÝ#–îï‚5ÞºD³ÙÑÎ=‰¶¦ÖÔšÖ ¬ð憊3‚ üøÿšdçHÆ0hD ,‰ãbŒXWaŽJN»m"7£Á«:ˆÎF;{†s{aì[a‘Æ9£wÁ8p®›Æ‹·,ÃÐAªŒz»û&XçP7kíî¶²úwRm±Þ5½®géÁÒƒÙ{À•͇ͭZælŶÓ[ bpž‡¬žƒe—°\‡™)×åj] ÄJlC"‘°ZŠ"XàbXá°L#mâ²Ñ6ÆHSô’¸fciFwpsÞÆw”QyÄ0>Ï…K˜ä¿j×û˜¹9è†ñ þÚÆBðÔY¼w ™öþ-©x 9™Ó­ RrCrVyÌ“áÃÀúkò¿ËϤº _!Hf6žP•†LŒÉR‘¼Ä0~òÉ· Òf÷s|/ŒÁ¨PFÍêHȨQä+NdF ·õ*0ƒX0;i ¦?0íè…å’dƒP·ôðÞÚš¦á›Ú{Gøƒœœhß1˜!JZ‚‡Ö­!Ÿ ÖµNIõjÉ’,3ðNÄt×.ˆˆ‘UÚȈª  ²OKƒñmPrM®Ùu̹ÖW§fŠ3C¯èø1ƒs€‘ÈF—ÈÚH|åêbY=¼ ÐnëÈZzl±Ž°Ž.ƒÔ˜sb>Ô4†?Ø:õá~&š/„Š“¢¯ß€eÃô‘úRB`  £Çî£%ÈËàÀÝBa1N3²Hsv^ ­)2+.c¯‘Š¡ŸÛŒÍ#°Ü9ߪò›Dy…ºÏ+6ðœØ;BénÓ’d=qJ¼®›_]pž1a›I,¢×Jn“‹·t¥Cš÷þ*£!^׬8ðF~¢áG%L4¼%‡bàQ&#‚´!É Y4gÎp¼ |ž¿ç¤y0¾FcïÅhÕsÆf”ìÄÜT·«§«N­NÒ^¡—^±œ³ uX´yÖ밉茎uéÍ´>bhvBgX´†ÈnÜÃfÑ›ÀSÔ™¶)Ìî$˜¸¡â€»VEðpÒ¶)ÀÓÒóG8 ´–h,©8P™ M”×ðøˆ|cZÄÆØŒFPy=D*†¢ÜAå‘ÏFãI§ºŠz­,¦üw‡ÆÂ‚oÜkY…JÇõ=9 CçÇÎêz ·çç¿Þh÷f¼£InM [ÂÑt1CªM†P‚øp* IDAT ˆ$Q’êõ‘p"**ÁR‚C( ”vÀƒµ…îG€<€‡YÅЮFOS ØY×*ÏÏŽƒkqNúàDQ®%^O!°$ØMNZò°þn‘foOôbg¬8t:»'~ÕŽ?Œk¸ãFå÷é‡$¤¹ÚP¨žDA±5ÌœªøNæÈq¦FÕ‰š@Õ)¢°<À-BF´âD|é£9ÁÈÛ‰{ôØi0µ¢ÈØùq÷ìoOc‡tª×¼ îaÅȳs…—D¦ÚœÑã3ó¼ £Xñ?=Ó÷4(y|SkÎnaor%¤U¼©*™ô%S¯5Ë T©ƒ 0ð&Ô•š˜)QÃO)u¼a0¼†b”˜D$‰1%HBÒ¶‡ò3àdFÆ“«]¬~¹ßaïÁ¼wèüD§Ä9½8Ugzؤg»L1¬cO÷P÷<iöçæf‡æN@O2ßÛ© 5'Ãêø˜W×}ǫݎûp3þ°£i ÛõÎhwCjg4š‡Bćø„9I¼ 1W ‡ ‰Jv­ä€èrÕ‘ã“À½2<êrX‹ž“ ØÁ@¸Oín—} Ðü™mídx,š¯“]MøXP”Æë`±31ë]:]o¯¾+ƃèÙ…öCRôæ6³ÆîD‹ãm]!*n5O.‚J«dâM„ÌÚP­ ¿!Ô$%«@”nP¢Dˆþжõ EÒÅ0#B÷þdÊíµã©•õ39iÖŠugƒÌ6³±\Ð܆ØFºpŽ׳n§Á¡Ç±bÆjµz­÷š\Ñv²NÑfZn$BóÕ`"¦ª¼ ä®6ªõ*±Xð Aßh‡á ²XÈŸpƒ¡D¹F®SˆŒ 1G‘`–Ò‚–òÈõ…‹ë˜çÝ6DëõŒÍÉù—zœà»ðk쥨£Þ&Ù½Rì?mN‡­×Úù<`2%Ö{4aÑÜa@ñV:}£BTÜš+~ñïU­È$<€¥­ª5²SHV@Š^kÑ…œŒ†ã©^¨wð™P·!( Ð¥†©ê7íŠ8£÷â€kdÄæWh¤]LWLT8‡˜™ó,îéZ]p9{¾cÇ,mí6èX|¦‹7­ê7ÖÖÖ5’?„ÌhoÕf>¸Df>ü—»ß¥¬U\Ö6Sˆ*R€EðBà×Z”"ªË¡”vÚh SP~E€%=0,1h;çÃn›Ûis/ÙzAíck‚Dë3wí‘ÍÛm6 ˜us¼ÞÉZ½¼±ÏªëžßˆonnèO:Þ_ÙÌDÞÿf‰¶ŸÒU,¨GÕ#õ™›5Ò™&òF›#äQƒ¯h1ZT™¼gH‘ëÚ·È '²% ­‚\Ò4ˆ:?5¢_vymëfŽP«Žyç:DhÄ 'ˆ²C±ñ#.–føVϲ]ÖpÂñö°‘‡8(¹$â§é‡°›ÚØLœ|÷]M}öØ NVË$"7I ¬®ÕšrØlTí9Y9äôr-¢Õ S0QhaÑYÚnóøV¼KKÖw‚2P36KNX¥4 /ÇáTv³¿Ûÿ}Ço½ÿ+âÒDJàÀ:‘o5RX€¸áÃv—›wNž×›8Ƴ]1›ÍþŸˆ >}Èjãm/{Ò`“Ý »³:æ{Ö4Q›O4õ¤=³Þ2‡äÅŒ¶A¡. Ð>ùsêâä|„2ÎÜB gJga>‘’Ãñ¦^Ur&[¯ZW»lïªÏkUùßþþÛßü*wß"Šuh‘ƒ<¡à€!ÀÑfº—áGœgGzmÁzÚ N+JþÎ8î@Ž•‚:ÐÓÍc™°~Ááð«ò0Þ¦Êû±™i½¹épa¾7“ íïÁ2ØL&·2Ÿÿ·û¿ù·Ì‹ý—¹=‰påäÛãœî¢èT¼8F{åÂîËo*/÷¿ý®+&È"À†Ð©§Ñ€ _—†gܾIÚ}F¯[ ÓL¯Uà“äƒÃd€g+*T¡Ìë²Z©ìUT5›Š¥ÞÁœDj A­cÁ°„²Ù¬œ?Ì¢d¥&“‹J]óîmàÄ@’ÓØÍûÜ«‚³ú.¬¸*Ò²•h¾¯Ôd>Àc_ón§caV»Åy³å5ðì¯6û¿*î<ß}ñû¯c…€)]8xþr/–’²2•N´AÁs¹ÝãCx¥"UËHÚÿMù0s"«Ûé4zW‚¥`#)ˆƒ÷ƒY!› f·_£7e²=-×Úµ®µæ%6ÚÐH¯ÚÌ6žç1l16ÕóNa…ì%èMT]FˆÇ1Œ‚Á®ÐºWç…DŒmsÓS»†²‘ÛÝ*^æ^ü¾ŠÔijX¬€÷è´š‚àP=’Q^ÝÙ=>Îퟠã]^f!Í–U)HåË'{o³i ³zÄY$e¥ÜqåÉë·Ù7ÕZ£mb´{ÏZ×Ï!w0u²±Î¬›Í6³•åDè­6ƒÀc¥˜„@ÉðÌfNIž^VÚØ°‚!‡‚[›ÑŒm&±SØUO^½-²Ïõr¡"¥åF©»Ï²Éäª?«={&«‡É½ç{ÇÇ/_e*»E$ÉY©z’QÕ´ŠPñeåpO-VT_A©QVÊ (sœ)¿Îž(-‚4ÚNF‹{à_ H“ÝRš˜¡·+@Íá¤ó~½nÕéE  x[ù0-x& Q¬?Ô¶õ7µkùšyñõvq¿rüro/u€JÅB¶²S<(¥”«’,ÊònAÍíîî%ªo_~mÊ#XJ¾(ÇÜ:Üß{õê%HÏÞs¨6ÀÆél6yXÞ«¼-¾U[f½ÑòÍçH^¢0X]!FãõXZ r:š£"¬Å…^H0AÖÁþ'Æ©w@À‘K³â€=î°µ´‘ûUñ¨RùVþºò¶’“Owö’¥§Ðu/_«yIJªÛ ƒG€ä¸\AÒÞ«ÜQV-æKɪ¼ÿTE™ò«7åýãâóç«ÁTe–pöÕ+øþW•²Ú¼§Ñ|x;À/ Dä*O!ˆ>º £(–Gwš ^3ˆf|æ3I½ ukëabiÉŽmSUÈØ™Ç'•·ÇßÊÁâ+ êœ,Cqr¯ÞHGY„ä|^EG5³[ÞÍœ<)‘ËÊ»™dQM§JÁdN=J¾V+È”jR,Æ(ó¥vË™c)Ût]Mr7mó«¥#˜ü¢Äp ƒl«8( î„îÕEƹ`ë,JuŒë‚>fÓëtV¢á ˆÚNV¼)ƒ{ÅÇ{èIù×/³{@Œj©XV‘z¢–PñPR³ª€üUrÀ ÊQæIU”yµ»sˆ™Ìð#Õ̉¤‚fàTòQǾþöUåu¦øöÜh÷äûŠ“‹¼„2ˆcŒ˜ã°/À˜¤ØLðÍ “¶«ž€I²uêñª®'§×;Öµ¡©éaG¸õÿŒdžgç¿ýío{dTËW*Û'LJ{¯+¥½ì1AÛðQÍ=ÙÙ­”÷Ë9$·w¡CóIS2Ý•‚€¦û¥d”JBsÆR +Ù7o³åâ«òj´ÞäK3WkugÄÁ04íG‰4C)$¾ƒ¬çÓa°í«!A©¡ „©K²ê7îALÖÌŠf²Z^åiöëÀnM~†Q9s¸S,”÷ò'{å“—UPlñ¤JIT(*»É·/Ê'êá^®x¨¦`º2*ˆx üm¾”†·L!¥¦|¹{eèjµ˜Ün(§mÙLG§ãSi4gŒ‘ FVÄ0]‚ DÓ&TWæ¬uÐCµfpÐÌÃl}ßÔæ¦v¹0ÓÄH’ÓMÌ…´W99,–_½,ËÅ¢t"ä'y >*T …J®øjg¯ü¡½W…JÅ”Û1‰“À!Ìö4*•Š¥”º³wBI^ªËo’GÅÚi krœìb4;TPD‚³›¶=b­"¡ÑÉ  ¦¸d8$Ô¿“d,.&±Èư„\KÙl߯’Éeösädëž¿~Y,Vöät2aÚ=‘w ¤ÒA©PJžd¤jµ’AEÊ@+Í­ÒVÍ…†W°A †3£?(A«"®×$U‘™wJ,&òEûáÀV¤3"{*-wH7èªHÙB]A#í¿¬ª™½\¾pRUÔ8Õí'Å“·’z’¬dŠ{¹r)[È–_ìK²šL¥… |ŒÒ£ç $';eu;sœSåC•œg™ìÆ4•°¥,J{ ‘K0@%šiÄÀQ)×m) ,©Z¼dLqŒ ÌÈÈg`²€ãÚÈ×~ (ó4±GÅj­.×vª@Ž¯ÕªšGòQRM©è@ÊË/ª•£ÂÛãâîóB±ø¤’­îÑv>y¢–Ô˜$U^¨™L¥¼ÛÕY¨äÕd>ó6sRI½y[y£ÊÕZ³àÍùÓ2,ÀïAb½a·N¡„È(BJƒ(ÕAS ´ª’°±I¢W;ɾd6MÅãqí¶2óð˜D€ê#™ Ö(7Ú/–Ôƒ, q¾úv7·S<)çÁ÷6Ÿ,äKäó——ò™“£Ýâó2üÄv®\~[Èå’êëÜÈQõƒÞlmk/`W 7É0lĘF¢(I *ÖP``™(YL‘[ئŠF¹q?¾Ù ­Û÷2ZÌO$ w=Êj°5Ù£§E¤–àÙávÌÇ¡ôUdéx·\(æÕq2³W(”“É=5¹MËYHœÊZ.>/‚à«ÙrMNÊÒÞá¡R¯j×€· ßÜ€¢"Â2àË1/B/¤¥3Ý€DÞQAŸ køýUhl qWÚÝ67ßß¾—HJ5ÔøuíD.$ÛY©TB/бÞRòíñaù¤,T@Ë‹År±œ) +€afÓàe5wÈUŠ•¤Š^—+oPM­>'—»H~h!nMEiðÖ5ªc 8¼Vo wïÀ 0mÅ !ee&EKöû‘Î5âhI½µ(:H¬o^“(ª²¬€°HRVÝɧAò…£¨³,A<–$5 :—<,îäöŽ÷rà¶Ê)/™R€>\F…ÃÝïŠI ¼T•›S¡&–­¯´Å¼Ad£A#'ûŽÐ¢àWºŽÓ†Ì!à?#IiÊ4e±vçO„l3k·} Ž`¬³Ò!ˆ#ØñJ*Y8©@±÷rð¸[†ñ^*¦‚Át6…ƒIõ¤\:Ì`àÁTr#Ž@nM¬Jµ–¿[SêíĬíÉIu‘ŠÕ©œ%€CßšcRf¶z€7‡½vq¹yß!Ñ•D(YIB©älRÚ>9QåzZÊ&Kådö¨’ÏgåL"Äá‹“d©”z𬀠þawg7·»“O¦“¥âA0XJ¢X¤  ¡çȨPjÌÀ ` ʲò^È­«^ä¥ÝsNiW§)¤M¸¦l× àä~iE¬J8•å°9ÊY#ÚïĵüCÜJû·R´)š™!»#•NÔâ!LìT99,{•]y§ ¦K¦R)YÙÙe úÎÜN.ŸŽ£bД̫ æêvᤔO“(“ Ÿc ÈQLD£•Ü ¶Ï€IÍÈ ð9F¡Z©à}¥ «s …ÖÀCy”JorÏôrÅ¢) ‹© R ŒXIM ¦¸–gê»`Z•,c¥E2ÙÛ2®TÉ…j™\­QŠQb4 ¬)UÐtÅïç¾züˆ2 ÏЍ¢ eCŒG#âP¶Èm6›ßß?Nú3“ÉJê›|ù Ú®œìªyU-ÉpÌ@¦¥‚Œ²ÙƒR> z§è»É\ñ$‹%¥5héʤSS¡ >Kc Í‘FLpɽ‰J{rVëDŸ$ø’Ü»@)OÉXŠË Úãó)ÛýgJŒÜâU”æö|,Œfšû@dv6w'¶~+EÛÇÊ$zz¤‚£…¢¢|±TQsɃþÙæãÍŸýÏý—‡7Ÿn1O¸Øã(`ß ¯ÿëFè )·¦ˆ$æ7›3Þ¤Ëv©T•“Ù %wUÓó\aWVÉ?’5©2ôN-åNŠÏY–øÂ¤£,x“ Ó8 :"ɯÁМ l,•Žö,°?–Ëo+¹½o^ìƒfÉ䤠Ϧ`!•J™`LÈÏà'JÉ,5‰™ûÙý«¿ú/›ŸO¸,XÇ[Ñ-’û;¿óÞÇï]ÿó/û—ÿ‡ö[âQ*áLºt˜G™<ˆK汘Ïå“2ÔµTüå·0ÓÓª)ytXÈv÷v `SÒ)xO§‚¶ Š³ÄÓd+åÊn±/¥M]±tZʦ‰£ãòñ¾tœypM(R—: '̤Ӱ` hW€oÎJ¢ðhîÿúË?ÿ«¿±ÆÃ›ÑLæ—¿~ñÍÓRþ½øÝ×{›÷Þp?|øßþËÿèxÿÿ $2%µ˜G…íÃXâ¤X|¾SÌ•Jy ìvŠÜö‘Í«éƒ"ø•ÝçÏ_ît Ê”N§OLÁ”Š…4ÉŰ9Y@¥ŒÁÅÒУϤܛיò«—¯öUN]*Y*˜)5ˆbïÔg$dƒ˜ä‘ì£gžû祟þô/ôŽÛ{¯Ž¿ù:÷ü·ŽJõ4ûwü®šm¶~¹£5„Ûj¾ˆ2¹LÁ—(L¹B9wˆT)(^£#ê' jñùî.ÌŸbLx:­AÔö­ÔtTs§˜Ü>I!XNð]hžŠ¥«ƒCÍì—÷¿ýæÛðJ8R‰@1QHÇÔD~ºš}ªÆ0è JH¼å#9¿Xu¯L8sü¶ü2^³ºÑ}5õíîãÇ^­9£­ÿ_%“ßQÉnƒÜź …R LS°+PÌÉ@ð´› ¸s8.æK¸ JþÎâ+n§Q,½‘.n7–¾¡Ü1S0&¦Ÿ&Ëå7Çû¯Š¯¥ÊË"Š¡`,]0¥‚*™E ¨YœÍe`öÄF œÉ¿RQÞóõ‹ovžíBتîå¾–sjcOÊnýñh¼‰;}&gÕ|)[< ìd*¹R¦r “)—ÏË0#AÍ ¿S‹»%¨ù)w–¼„mïÒd#Çøíb¥ ªðb`°‚Á`*˜ˆIIøëÊûoßf²Ù“JY´%¹9XÀ öA ŀߧÙ#$QHμ©iL|Þ7Hyòªôê•Z®eÔÃÒîa*³§ý¿µä¿ÖÔ ?­¢dtuG- }©˜F™ ©”L%“òÉîI> †e¯ˆA ws9Âô'ˆa,÷²ƒÅî“™Lå°PˆÎÅ‚¶T>•ß~òæM~ZÎmCœ-{à_0²›hzÌæ×.xh~QÌC=µ,ÚË*èuñ ’^¾ÉÊoNö*¯~yüZ…ú태’ÿI¥Cû/a´Š!öyH˜¥Âa© àð¿‡IDATPÌÃ7'Š9bS_Ô€`ù£ìÐgg'—ÛÙI$‰ ¤ÀèšNŠ;ÉÃÀ´„¾¨l#5 ËsôM™²GåLæuñu¥RrBî@G\ ¤«Ù㕟ÉB‚–d‘f~¶ÿ(y˜WUðWÕZ¥!‘_~‘Õ7©xRþ_ÅR~/™ËÉiÌìýÿÂŒÒ"MIEND®B`‚sonic-visualiser-3.0.3/icons/image.png0000644000000000000000000000073613111512442016045 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§““IDATxÚÕ’¿K•QÆ?ç=ç¼ïy¯tÒš] „ÐAÝÚD … 7[¢µ!¥? !’È@Œ†ð”FEÞA0úEe·I¹Üº˜×Þ_ç4D7J¡ zÆïó<ŸåûÀ¿–ÜŸô@qósÏÞ¸UX}Âá (€kE^Kû†›§ÛÆïïð5þ~Kåᚯ-©3z_@gH}¾‘sÝ&Ê$ªùÞ@ÎhrF£=Ë£{hÏ’3š™åˆRe“§/“Z& ôïEñ Óm¦GÎpôÄ.·®ôHÁn2± X.¼áúå¶6^‘Ûð%ATfvä,'º0ÊÐ>ØÍí¡~Ž„šÇ«kÌ ÒÖsœ›×.ñyëã¯o\)¼fô|;Çú:pRᄇ0 [ÙféÎ"-‡ª´tœB57’|©2uõ.Q¸Ñá‹|È—@ûddÖ"ŒbœÍ°~€ŒS`µÇûçÌ=ü¹ƒ|kë…·Xâp¥È$…8Áúé@¦.ÊÈ”¤ZÞù{Käÿ×7[ŒáØ<œIEND®B`‚sonic-visualiser-3.0.3/icons/info.png0000644000000000000000000000014513111512442015710 0ustar 00000000000000‰PNG  IHDR 2Ͻ,IDAT•c` ü‡bÀD‰‰X#k±Ê¡[®§Bœ€h…øÜˆ×)8åb NŒi8IEND®B`‚sonic-visualiser-3.0.3/icons/instants.png0000644000000000000000000000015113111512442016615 0ustar 00000000000000‰PNG  IHDRóÿa0IDAT8c`F ¡á?9Ú˜°ˆý'…ÍŠ]0j#)lƒÌ4€ ¨˜†¥ Š(qƒIEND®B`‚sonic-visualiser-3.0.3/icons/invert-vertical.png0000644000000000000000000000015213111512442020071 0ustar 00000000000000‰PNG  IHDR Vu\ç1IDAT(‘c` øñŸhÅ0LŒ&˜"tš|'1ëÎÓ€îvâBŠ„`%Éd¢ns"AKÿÙIEND®B`‚sonic-visualiser-3.0.3/icons/lines.png0000644000000000000000000000027413111512442016072 0ustar 00000000000000‰PNG  IHDR ÍäñsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙQU¹tEXtCommentCreated with GIMPWIDATÓc` ü'–ÍDªÉÃAÉøx²pØ IEND®B`‚sonic-visualiser-3.0.3/icons/measure.png0000644000000000000000000000113513111512442016416 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“IDATxÚÅÔMHTaÆñßÌèdF£}‘bÄ1mt!!Q‹>„@iaD¤›À½!Aµ‰BlѦUI[AÚ·iEŒ«–‚.Ì©ÔdºmÞ‰AMgÑ —Ë{þïsÏyøÏ•@ŒO؇]á[e5:<Ú„ãÁþÁaFuE¢}=}·ƒè]< ïWPT%¼Ç=t Û|ªy"ˆŸ@m9K’ÿ œFÖ0¿ººšÆö¢f§^'õãÎöÎMM“ø†‹h v$wjÅ LOOÇÁ‚èDc%ĉ¶–¶çQÅ333EḉC•LFwEq.—+ŠŸW8ŽÝ;!NdOgŸMNNÆõõõ³¸7Aø Îc¹‘ÛÌøVU†æææ,..Nác 'q'LFõv¨ÿÒf2™HIDAT8Ëc`tŒ¤)ÿÿŸHc šK¤ÅÄZH¼XŒËB\¯ž‰Z> Nžl‹©†ŠÅ„ñ‰p°¦jr@|"4†pöˆ‚IEND®B`‚sonic-visualiser-3.0.3/icons/move.png0000644000000000000000000000077613111512442015735 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDùC»³IDATxÚÝ•OKBAÅÏ'RZi»¢Å£¿XA†`"µ )pY Wµ°]{ÝúüTmZµHÜD‹¤*JÔ(§ÍM ‚ gfν÷œ;óà?yÀœß$XB€ï7H—<Ï3Åbш| ˜ü)ù`òù¼I&“–Ø 8ˆ|˜^®²›.C਷À ðÑï o@¦®æ-àAó{Ö…{Ú÷-YUnÓ¡€°˜²7Àš ue<\ D0øûHæþL&PVÀ`7y7ñP+•JT*¤éÐVÙÒ·´Ãá0Ñhà Xíªð‹ÞË]Î;Ê&&lضX:¶{O€80m³vzÊÖs`_F=j½ª@Oú,v¤}7@ h§OÖ!Ý´†ÜRа)¬®L—´ÖÖ°íçï!îh±,ç[À{Ÿ}Føµt}“ÃZÎ'­f“ËåL"‘0©TÊj¡;J÷Øð<Ïd³YKz,"½½;ÊpÔŸ{"=vu‰B?y+ì{Rù/À³®vc¦ß}´]µb@F5‡匨·#I:öûõ¾õ¤Oÿ4Fð´h¿¶IEND®B`‚sonic-visualiser-3.0.3/icons/new.png0000644000000000000000000000126213111512442015547 0ustar 00000000000000‰PNG  IHDRísO/gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<DIDATxÚb`À>U1Ì_Î0Ÿ€bÄ%ñ¡’A€‰Ÿýþïß ¿ÞüT”œÈð›:€bÂeÀÿÿ ¬ºòlzZÿ0àR@8 ``cŠgsÐcàrRføÇÊK@a5àmC³ª´#çcFîÇ ê OšDþýÛ-€® €ÿu1ÌÿûAá/Я9Ùþqó3€ØÜ– Ì"/ÁŠþ¼”cx>ãÃß¿ ß_|d``çøðñþ§ @¯= Æ¿ óÿ©ª'0;Y%ÞAÍ}ŠÃÁ"@ÌÎð÷é†{³N2¼<÷n@cá{CÁ?>æ~Ž}Fæo¸ãì#P3Õi·>¿ü[h·›a@Á£ñ}CƒÇ|n+>LÍ?™¾ÞÚ¼ùç×ÿmw2, J:x?Y²à÷›—ý"îÂX ¸¾è Çç­w0l€  JˆJ« °~}ÅÀðñ'DàR<“‘áß?Ô@(üzúÈž“” 1#ïÿÑñŸMèP âfàŠ0=„bÀßO_Ø9ÿ3ü½ý›áù“ oßþ¿ð¥BŒ :L ¼@5ì‘õÜþÇpûÆßÞÿO4\Ë`hº‰ÁðÕ‹ÿ‰§výýðôö_  x ÞNdPúï>05é :+PýºÏœ'€^¨&:–§žÀ݃IEND®B`‚sonic-visualiser-3.0.3/icons/notes.png0000644000000000000000000000044013111512442016103 0ustar 00000000000000‰PNG  IHDRóÿaçIDAT8¥“A ‚@†¥] …Aû`Að@pá)ÞÂ#ž¢Uu÷n&È㢖¼¡¨9¥õÃ0óóÞ|?ÃÊp]—@Û¶ßæJ:o8Žsø ™}fö‰èT­Çx#Žãƒ”r§”J?]†á¶»EÑm0N6›z¼àÙŸŒ‰»¾\ÞöêAÌûŠˆè¬khYÖ:Ä&fO$·ò­}ˆ­šR)åB)uïJ¾uiE ¢¢ó ƒ¼9”Y'Ãó¼Ô4ÍYY–1…Y–`RÅ„Ó!Ÿ§Ržçû¦ÿYOìC>7H~IEND®B`‚sonic-visualiser-3.0.3/icons/opaque.png0000644000000000000000000000027313111512442016251 0ustar 00000000000000‰PNG  IHDRàÌïHsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ©©²6tEXtCommentCreated with GIMPWIDAT×cd``øÏ€01àô•ˆ úmP¾IEND®B`‚sonic-visualiser-3.0.3/icons/pane.png0000644000000000000000000000014613111512442015701 0ustar 00000000000000‰PNG  IHDRóÿa-IDAT8c`ŒPú?¹°Àÿÿc7ƒ‘‘¯¹6ÃÀ¨T0€ât0 XÂ'§óëIEND®B`‚sonic-visualiser-3.0.3/icons/playfollow-on.png0000644000000000000000000000031413111512442017555 0ustar 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ#‰<LIDAT8Ëc`ôÀbƒáš‚Mpòý>L þŸ8ψ.ÌHªØ X@±˜ˆµ)Z?«ÿYˆÑ˜«XÄx‚á€B¸é¦L“~_"bë$ð byO0`ª¤KšmÄÞ&éBz Is‚Oÿn—ý¿ýgv™–š|À,†ôƒ£2à ˜ojrí o©ÉïÎzL€q ióŸ±æûŒ!uë{YÍÓîw5)<Ú²OEuÁƒš´½á»U,ÕäÖ¾UxQ“'5¹ô†o5Vjrs8@¸8|ôcHÏM yƒ3_À(†Tû yƒ´ÃÒÇ)¿%÷N{¨çeÕÛÒs¶¬»Ò«çT˜WiÝÀ2‡CYg$“IEND®B`‚sonic-visualiser-3.0.3/icons/playpause-orig.png0000644000000000000000000000037213111512442017720 0ustar 00000000000000‰PNG  IHDR$åzŸ5 pHYs  šœ¬IDATH‰íÔ; 1EáÅFtîÀÎ%ظ ×â6,Ý‚›+k;A°¬mÆfA2_ÉsàHøÃáBG5ýšó[¾îýÙ¥Yž=¦‰]ðÊpÇ ƒ7ç.{_ 9`Ö&¡&mE*rÄ¢MBEÖ·I(Ãóo…zŸšbôÃû‚4mg‹IÉ\Ô'»bY3M赕dBe­$Ú(o%ªÐIøŒNèÓëHÊ ¸ŒÚJ!IEND®B`‚sonic-visualiser-3.0.3/icons/playpause.png0000644000000000000000000000032213111512442016755 0ustar 00000000000000‰PNG  IHDRý/ä™IDAT8µÓ± A„áÅD´;0³Û°Û0¼lBŒŒÍÁL06Y½Döν½ÛIÌϼoŒ§ŽVøú„e)xÀ ;L:æîM³ñ«Rð”-zÁk_°)¯½Ç¼<à†u*|Y·MS̺R[°hÈeŸåíŸRYðß¶ƒÀ›Úö†W-m³áWñg饨ƒ ¢7ú`¸ŒOÊwIEND®B`‚sonic-visualiser-3.0.3/icons/playselection-on.png0000644000000000000000000000035213111512442020242 0ustar 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ#.?v jIDAT8Ëc` ñVõÿÆ[ÕÿÉQËD©åXl0ü?ù~ß² ````Xzq1Ñáõ10ƒÈ6€l/À@´~,É€óŒØäXiÌU,b<Áp§r5â4àDÀy¢4R-} 0eæWŒIEND®B`‚sonic-visualiser-3.0.3/icons/playselection.png0000644000000000000000000000022113111512442017623 0ustar 00000000000000‰PNG  IHDRóÿaXIDAT8ͱÀ Ä Ç¬žC±¢ÓÄá(‚JÎ/?.å ̺›uß™}N—g¤6À,š~AI7Ѷ`ÆJƒº,ˆ †‡%´ä­~‰ã#þÏ Âè"ü{“öNIEND®B`‚sonic-visualiser-3.0.3/icons/playselectionloop.png0000644000000000000000000000024313111512442020521 0ustar 00000000000000‰PNG  IHDRóÿajIDAT8Í’Q À Cuì¬=GNä» eDîg‚ˆyÆÖR~!³æfÍOÎ^_/g ¥& ƒ¦OP@Rt ˜i'AÝ„5Š1t“½Ú’ w{™€ÉËkö}-ÿNO†\T—m3s'ÜÅûIEND®B`‚sonic-visualiser-3.0.3/icons/qm-logo-larger.png0000644000000000000000000001127113111512442017604 0ustar 00000000000000‰PNG  IHDRJ`¿KÄbKGDÿÿÿ ½§“ pHYs  šœtIMEÝ  ,¯µ²FIDATxÚí]íu;ùäÿå­ › ²© ë Œ+0©À¸‚à p*XRqà àV°¤¸Ìûƒ‘I+íjùŠæŽm¼«o=šo)D„S“Rjˆß Q¢DWE7g.Èég¢D‰®ˆÔ©9¥Tlà "nÒ´$J”8˜XÜKFö`˜¦$Q¢ÄÁĘäì« "þ/MK¢D‰ƒ‰A¹ø»§”*Ò´$J”&™ô-«4-‰%€ ‡zJ©™R éSÀd%{f¡”ÊÓ4%Jt™t4ŒRª€AƒWçˆx›¦*Q¢0.€YÃÖRLˆ¨ÒT%J”D$qqhs0ë`æô0‰%€ ¤7ú¹„­CÝ-üÏu䬞U 9^÷ÝéÜGÏöÉu #—?4^óýéQyù@i¿§?Ô¿U/Qfj7+÷+—wjï´­¹_˜©oq.R|óõ×¢¶®ÙW_qÅëp™©éý‚úù•Ú°€]ýã··fØ<ë9y¢23f’_ŽYÁíîúÄ”§zÕ‚õ‹n™‰ÁÅX¸—Q¤v½ÆÔéH]Œ0á7µÊÍêÆÊ¯æÙ ·Z[#Á‘™>¥m½ˆy+X¹ãš2×ôh¨»‘˜d|8˜€14¶GŒßÈaåÕ\Ú ä{ãïÐKé& ï—±¬ã¦:ËÆ)"µk}Œ2»Ã!±¦wfâÝ=?Pá_±ò*C}yÀÐ"–ïºÚÙ 0Ä$“xT0–1”ó"gæK™²”Ùb–®ëÎÇ¡AGS4qN²97E´EçÜÄfv 0\Öz!ú9ö™gÃ"^X@­ÏU†zG¬»–¦Æ«±.вùä|ç ÖHV0†1¬ã]Øôv€‘eeZpiÕÞaàPÐzûaXÄ£ìˆÞ•E`Šåg"Ê^wÄ­º¾ëº c£^MÛ¾K†Tzˆ¶•G;«~Xh³ ‘Ø%v8fì#BZÖáÌf•ôKƒ¹4!Uˆ¸—¦M]fˆ©XAw$•Ny“6’2°ë¶µ¡ÿØïß;ÏŸB1ïìÅléLƒ7r’RqÈâÉœ±Uô¿{Ø¥PP®1öQ®þb¿¨ZˆIýXâ‘Tr¥Ô˜<æ+âÐú¥ÿZ€hßÒ.ž­qɪ›šS©Žm²nW"”`Áy›û›»wýKÌ~nÉ “z— ‹I]ˆG¤SœÁÖ”?„Ã4³/°Uÿ/¶èO`±¬“îlÚ'‹\=ôå$HL* %›d7ˆ¸¤Ø&¬}ŒI˜+¥öØ×HfzV«#l–6wP­,ãü¹Ìs“t ZÎç¾­xDï—ÎaIeÄpñu‘~³µxgʾ D?yl¾ÉaKÚHUöHHZ â‹Rj.6ÿ!klº³°p“ÿÞ¨:0ðNèfºòÉY[&>œ˜eAÑAÑ”£ÈE¾wPæÙ‰IJ©)Ûd}¶îÛŠG3Ãx>õs»å}`7² ñh.ïÆ"WêxFÄ/ä±bf¯ E O`§µ–èœÇVÒN€_Ô.í|õ§ˆ¸!3ß”lþߘ£‹ âeú8Åå°PJUdRï98µU‡Ž‹›Ç៿\Lj,‘Á‚ƒ‹¾VùØà"uMRLºsqh7ŽE2EÄi«u`ÚX‘9øIsäï úgä¾á0ÕÂ’¾»…­²·TJÍèƒô3§çn;Ô¿ðÁõñ¦³øI`“[j—÷ss«MqÆú¨s“Lkëу——÷ñM‚ŠáÀŸšÐÉ‡ÑÆ­€Å§À~<ËØ#Þ'·ÄLðOÏ3XQ&ÅÎ,IšÖ°»sIǸôuÎÜc¤xœÇ(0mçGÒ*ZƸl‹ûñ.ÃbÅb$óAÃHuhwž1op˜g—Çò¬}ë0F®#ÌñZ¦'‘ûË_eÌjpca‰´òhL‹}ÂäÇÂvBg …¥>ÍI¡æ3X“¨P:<…KÁ½< ±'SêÁ6¸m;7ëR)Õëø$à}t‰ˆˆ¸¤»u~01EûɤZ+÷"^šžçú¨ÇГÙTŠxs‹Ч¼L)õÚ7Õ5ýÜGëQnâ0O­k2ˆIwÇÍÁu`Aȱg^ÞÒð]ÝçU×k*Ï#ÃÀÀY ±û‹{) &!·F¥‹~V§1ï2´HÏ –ˆ[q²¥_ëkpALfàF½òÑ8˜¢I»áðê›hŒa¾½Òaø†~ÅbBýåi¦‹Çú–Í5{ÏDV4¯H ròЫGx¦Ä´Hù%é`‡D 0N®¬™‹ºìt1Æ”˜® 0¥eYsš•`¸kÈ2¥ hXYuœL¥uD5¢A[‰Ù]å©Gô)Áÿ6÷TxWTžVšKް¢que´3‰i3*K—;€Ã<®‹€Å¸†{».sdƒÁ¥)yYû ¦pÌEŸÆÖ”6´ì`ò-”m¯<:i<…iQÍ ,·è+«ÇÅÕhêœËÀp*õ*VZp³½S%ž_Û¨Àlº¬žgNÞÐöŽ­+Iwq‰V$‹˜´­Ã#S¤3¹¹«~l€ aÝû`NÃØoО“ß-D¨?¶°²•Ph»e €`â‚ôŽBs^ÃvÛ¸+d—š8‡ðÒ§sÏRµív(gÐð¦±6sO@ýXË¡uX@¿´pïT_O¬5]ÞÀЦA„õ<ó]¥ïõð*|w0áÞ µõè½ó0ƒn`›²q BÔ?cè½ëÞœD‰Ž´6õÝNµ÷y +¸6ú PŒÒ‰;,/ÞÒm{ƒ—o°oö<L¢3Y“CØÅ%½ âSL€¹D×ï.ãxŽ9±Ì<-óD'<̰sØüR··>œ¤åÌÄ3ÉñÙR–Dg@c.sŸƒÛWƒW08·i“&JÔøÖîAûé“gùsèæj™¢3ƒn2¢µ¹’%Q¢¿ L Øôžáq~[Ý‹×aí 0÷Ä <70 [Á.3Ù&$é jÀ‘: ¯°Ÿ¦1s€ãÓ¥*z%:õ,LÅsH1o%¯@7€­õè,7í%´1Q¢3æ`2b&ô!þNLÄ4Ô` 0‰Ž2Á „Cˆx{ÂvŒ‰k\Ö™#;ªŸs­é°¸@ºICkb×oŒÄÿô÷3Ïâ2ØÅ꜒r8ô}:&ª=˜MwséüBÆ1ï¸m#vÍJ"}JCp–´‚ó¸yrÉÒ¦× ÙµU®Îs‡˜Q‰öº½ `6TW¯áX÷Ÿ,x›D‡¬M366G%ì_ˆgëÏŒ§ý¬›ók>-Ó'NÄt–x)Àõ ¯)†Ìb¯`NtÄ“Ÿ`Ž`.ÀžþBßKîzvû‰¥†4}Ïìk)BÁu]—ÆaT3'Æèzp§§Ð·XXÓMøôÇgίu_$æôº–[Ø^ÿ"ENsÆ5ôˆSÐϽÃ.Y÷ ¶>KO¬,™È{ÛääKØW"ó÷r8ŒR—¾NKØZv¦°KZ®ïƒúÊ0Sû+óì'KPÙöÌšÝßįþx†ýë†þý ùàsÁ¹©0_ÏêêÏcÃ9O"R¢Öô›¥u·OX¹…ThS[d›ùso¤ z·Ô31ô'o8ç `MŒ‹«9yéÐÃ|º2pFÛk]f´ÑVMÔ˜ ]ÍÛ_6Uÿ¥ÕšæRiÊÄ:!¸î™ØPÀŒ™!ÄÛñÓò}¢0‰b“¸¶ ½3ÈÄwzDTâs[2SøBâšÍúc)cÅX~méÚ4k%€ITCß-2üªE™sW£é36m;Ào¤”ZÀ6_í |3蚶χ{ùÇð]þ.½õ„´çsZúû”íâ‘¶|ô PJUôwnàBšˆ3K¥ÔŠm|›³¤zúJ© ìLÓuu~¦÷rz/dc•R¿˜2øq/úo×Xå°ÕÉ+m›ŽÑO¥ϸ¥,'ýÒªxɹ°Gjï¥?¥”ç·¿zW$–N/\Û»>Äà32øk ü`,7<Œ=ü=Ö° »·]¸¶p¼÷ác¹gæ¸â#ó¼‚ô ^áŸ2 ¼Íðcláðþ(Ó¥dõæÇtk÷ƒñésίuO$&.XO”RKØúEäL,zfßgqŠ®Øw+ÇéúþÐïVï\)õö„/I'³!ÎçYŠiô¿[Ø*fMïý&ŽbŸ¨{ê_M­ú$wæAFÄ)ÕûÀ92]/ëë{XéâB戸RJ}㲂­y|é¨GÎÏ=‘N]0æ'äÙŸº9¿NdJרÕÚ™¥ ØY^NÇ”(L¢+˜vÖZwóínrHÔž’)QLZÁö’».‰àÿ€ƒ«³BÌIEND®B`‚sonic-visualiser-3.0.3/icons/qm-logo-smaller.png0000644000000000000000000001024513111512442017767 0ustar 00000000000000‰PNG  IHDR¹1†NébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ  ÉS2IDATxÚíyœVUÇ¿ïÌ00(È B(e扑h¥&š¦bb¶øI-ÜÉÒÌJm±B%3Ë03·LBEDÅÔ $H‘U6Þ·?ÎïxŸ¹Ý{ße^‡îóù¼Ÿ{Ÿç<û9 t.$…vb˜ ¼—NC ;+ rúÝœNG ;#üØ ù ]:%)lO¨*c]C€Ö!¤~¤ôÿ+Ó)OaG…ê]zÏêý_é4¥°#Ú$ÏIõï)¤ÐìPQ¦z&ê9ø”I¿èÌV¥ÓÂŽ¾Y~¤÷î†r¯´ÁÀié4¥°= SfDÏ_&0#vF›¶R‘%…ÉözU÷[ÀV`P߸Í0àPàœÅg)ð,0x3EN4Äh-0½Àr­€@­¾W3[Ê Î*Cç¯ À‹À Àxà)¢k€«ÊÐÎ!f‹jÁ¶…”bÿ{¸&Åoˆ˜›B¡OÈÈ0«% ê%à;%–=˜¯A=, †J!xx8¶Ä¶®S¼mÿ“ÀfµÿðE °'0øú•îLqü}$ݪg¡Dð«Ê¿IÏ'[Ò ®Q§ÆYn”Ù¹¿·™ÀŸÙÖe*7¾Èrý LšßJÈ··éÛ )’“~«çœ˽ªü¿h‰H>Lªe+†˜É¸©ˆ¶6ãôË|Ñ´ut‘cû³ÊÝZ >Q'Ñ¥OŠä ÜŠ‹*M‚ž¦ÜÇ["’ï¬SÇ q»w6Y¶X¸ÅLÈ>yòvÃÙ×Kq&ÕšrÝ ,3Iù–"9C%Þe/ä)3Ne~ó•´8$¯^1ƒ»¤@Ñ!œPB{{˜òÏäÉ{®Éûh‘íü@å¦QÆ›>×뻳Øöè<徂‹¸Jo/¥|šóùÀ]À—òèŸØ4KJû,àúNÛw™¬G5À×ɲý¸Y’ \¬÷[òWÿV¾aÒ¢¼Ü­~­ÔÚŒW[z¿2âó^ÀµÀB`‰æø¦DÞŒúýKŸpÜ 8óZxþk”àuA”âGòm4ýSdžQ"%ÛGbK¸£ÀñŒ2i=´Y<Ç{˜­ï¬¸F|ßXÞž2s^œbòvÞ–Ek/œÙÎ+³CÄë¤"ÇЯŽÝ]’À[kŠAò7LÝsE༒º 8SùTÚlqã5!kO…™Ÿ^yOxÄ'œd*Y# 3ù&QºýPSÏ© ¢Š\"êoeÊ»W¹ÓŒ²\ ’¿¬´‹"ä×' {·p¬Ò_Q7pN6ì6Ø Ø*ý¶ áÃÜõx3»‰ä˜st‚Â*¨a$¯•U,܈ó¡X8NãZ(®p ¾Ÿ6H‡»Z›ØÃuªïO 㘦<#£·)A†kò§tèbÐ?Ää9´õ:°{‘"QV T,ܬ6§‰-É®ï+còW+p~…öšSZœ/àh噯üÝ ÇZ)$‰‚”çó% ¹_ógcòÏ YçÂHî)j’Âs¸jƒäÙ($t0¹:âï5¿k=m€Ö¿Ídg å¶T}„y_Ü$ÏÊ’Ay?ì¯÷m&}Ζ](ô3 V*”Ê¥ÚçKœ»*¦ž`‚ò(¥}SÏ+%ÆEÁ“2ÕõÄÙù=¬ö Í™…†æ¥ø£æq ¸k™|@Þ¯bÊO”2.¡§ôÜÓà^FzÈCù7KäÙÝlF ýE–Ë,’ÿMÏuʰ˜'8Ì,ïMÕæb,Ç…,ÐbÚÅ͹‰¶ Ô=Kr¼Î =‡ójC«Ä`‘(™å¶«%®ÄÁ²&ÌË&!T­ÌƒÎÖsjžõ¹7áo}ŒBÝÏô1GüaøzÍS%A …Ëõœ@H^† m'yȲ¾™@!¡Õ‚›B%« ÅîjÌv)£Óµxe-(Þ6š)\¦)›¸»ÆÖGV8¨1 *Fæ<žÆáÊá¾yQf€(U1„¤¨×ú8\íqçKz/ÔÖ 8F:ÙPÕÙ&&o>'Ô¯qNÈÓiìŒl£6ð:OUHûÝ ûþ¸8Gß})=²°‹ÜcÀ×"d«¾æýé¨JN!ÐËLr)ñöµF6=¨€üÒ³«Öã‚ÛiOóEuþE ô7ŒØÑQyƒ8o>ø†³µ±œÝ&eôç1 寝‹Û÷#ˆ•ñÜåV«yxSr¯Gò%Ë ”<<$WÜ$?ËPËGE‘Vé}•(¹×æ-¡þ5¢æ]EŸŠÈSmô ^F~†¦*™$ûn!”²JmÕgHžÏÇ —PÞ3ºIðœÖ¥+Ά?OˆÕAæË¤þvW$ľg²ž“‡Ó¢Õ<_,$¯0ÜåŽ$Ùi™LM5’Å?nä®Ö®ò°o‰“æíœËŒhÒZË6^Š}œ…#Îzs¬6ÙE¦Í!»ð‡K°®œ@ûQ(TSdq\¤h´JFƒ$߯hõéü¬+aËÚTÃ]£bžÂÖ•¿ê{¡ÑÂðò%cG6Ášca7³µ²¨uÒ÷J}¿?¹”}x4.:±«XÊ›Òú€Ÿ˜üS#Äÿ‹ƒ+L»ç‹Ý(j;çÉZ$M{ˆt…Ràj=ÇhðQ´RºÀLQÅoÇX ò]«‘ ±Ñziø•Zo¼é¶ùC¶üÙpðnZ0Å8Á”ÛZæ>mž²÷>-î9!~,ì/d>5´³­SãB“~©v7›µA0H½óÆø’3"Æqe’7'«žÇü}0×í)ºï‰šx½ ‡sC'Á? %ï ±geNL‚›€#õ~ù¨þ{$“7'%o£vê%£ÇÅŒ{J>Cœ>'‘& ¦”HÉ=ËIgœ©÷#óúZ(ãÅNz‡(_¯Á_-ä‹s-6ö.n{«Õ²®~¸{Yn•¬<@ùÎm"’[í™ 2ã “ïÖ˜EoQ¶ ¸Ïäeľ\.4:´v3õ|.ò{ÇÉ9¢ZÍ…äˆhù°„Ñ1=Égš1%b¿Pâa©Hî½Û~ —RÈOÈí1]!ñb€¨»Ÿ”ŸD(B½ •³¿ GâØ¹I¾¢ ÔütÓîíê£ÿe4–õf3ÆQ™»Õߌž}4¡u1"£ òûC÷ + G;†À»9Ô´u AŒÊµcË=¡¿/Pݛɣ±g¼’{™|±iÛÅ÷}Ž™‡R‘é]¾_?,¤À~j´NÊ[!ë’ËÞ1Ž“ y·¾ß’mòÖåù²?/0Èl"yسL²ÛH‡ìþwÙ‘ [IôŽ>&ßbœÓÌ‹f«…¤~ü'šrH>÷'¢¦i|ÄÞ\¬|¾gú´X\ô!‚ÓMSR僣æArïZÿNH~hÌßë Aˆ²€¬¿{³¯½sžæ`¾I»œààα†ûÎ)b}ûÜùó±B }賞ʬ0öÜLˆÝŽ; ÷°dâÓB¬¾¿äÎzâÏ\æ€ï~ÊÓiÚt[D‰ÞЦì,ûøFƒ”3e]ñ¶ï{Eñ7 ¹/3c¿TTvhŒÌø¢is¥ô‘L¹ûqƒMnìQ¡|qGö&ĈS>£õ(äèáTe¿{÷ãÆ†}UÇu!›þÍïfÍÁµJ÷efI¤ì-ÈõE¬kgÍÓò N$ —ñþQuúvÉëƒË„pí$÷â½.ê0)b1› sVNȱ+Afí÷©IfÛ¤Aµeª0öëÊ ƒYQô¬Q$9w{Á‰I¡¥oÌwD4k‹5S®K%šãw\º~)(^ådÖŒ„$·ð’ ÃРÝSg¾s†×ã\â9É´½•î­U†+T„¬¶åéú¥=q¦èg BKV“Ê›É#3VZöËRºd¥¨TC¸8‘:òÇ{× Á;áláí¤x´‘µ •æ|=·±Óôz¼òÁ8³ìþ²ÖÌ—âýú®8Õ¸ø—¶ÙzÄp'¿ Ô¯Ü0AÖƒr*v=qGâl´f%ÎcܹLmUãÌ”mÒ½Õ2a¸(èÕfÁr8óWœ¢=[¿rÃ8nç¹—À|V t#8àkCs÷W]ÑÄú=|–¦ɵ¨Ú‰‘Ü _4ú®Ä¬Ž¸8•Ý„« Né쮹Y'Äì ú¶ˆ]VI<{G ­´úZ‰s]pΙͪcŒÑ;Á™H¿Eß²Zï]Ô— ¦¿mÔ×Jœ-x½úÜágíÉYõqkHDʈº·Ö|¬‘x؉ P­­Ò·*½Á€¤³ÒëÕçmêó»ÊÛµ%¥±Íþf°+B”ü!œ#b.ºÒ+ͽpN›ál÷kq‘~Z´Û$ÊØxœ½qŽ -Ò%^N&ðN®Æ¹ª'Ifü„AÀG‚‹†ãNÕÑ8v¦u¨Í•8ÞdS¿=ßK›àUGNžmúÔ@p}‰t+;2QˆºÑԟӘƘ|9Üô¾Äüm*åûçeŠ]tøàõ}±û !HÒ§‰zöÇ…ÔGâ"Tþë…45¸…‰8¯j­ö\ÜH­êÝ"Êî­W·éýLœ“­ƒº:ªÍ¹¸€n8Oð"!Ô:S_Œ)«ÕÙ¢îíÔæ ³IŽPú%‘§[®ŽùrQÀÑ#*q1&þ>±J›‡»†mˆ(ù‚" Γ÷€ÞÄýWm¢ò…ÜÖIe ÎÁUCl÷A$dÁ}/3ÎfUæqÜqÅWµ9¼Rÿ¸tŽ÷Z¢%©j@æœW¢6yÜF -ØMÈáåÒ.ZðEZìŠP;爚ÀÝsòcé°^ãj‰sEÅOË_˜g²æ»²ˆ9°}H"tYSwÜßÂuT¶dØ™)¹G„zú« Öh^»8´;îîø3NéSpL­"Dƒ¿ãœ`ïᚢæÙ+gO¨¯ýq‘{Qw§ØþÖÐÿm‡¹=ÖÄ(âáv¼[|+ÿ¶½¡øvX—ÉgkAOÆ…û7 â»3¡¶”ýî‹RèêpqóÓ…ÌÝ"Ú Qþ™¨õzS·mË_øÿ°I%óQˆ7\ô êâB¾~4¾Z{îüêÓ¸p‰%[xªNðkcž¬Æy×¼-ËÒÒÐ&¬h‰8U¹#¹¿  ‡dÒçq§P¦(m£,-œcåo¢T‹e!ÈÊ\8W¦º·pá ˆJß!%°³à~!å$!Ù0m´¯Êä·B~­”´ö¸pÚ:)žp1ûasç|\xDÉåã„H=qžáLþV¸+.©ÜB‚›cûâ/wY¦~¾€ +ÞÃ}'Á…?“¥ØNÇ9´öRß_‘‚ý¦t„éÚ„{kþ¦±}/xJ¡Ážâ Þ´¹½ ÓÌåRØ…À{—’|…u M€ÿ O@éœ,* IEND®B`‚sonic-visualiser-3.0.3/icons/redo.png0000644000000000000000000000116413111512442015710 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  d_‘tIMEÓ 8v«òeIDATxÚÍ’;hQ†ÿ{wfgggfwöÅnVɈ² P4 ¥¥’•€ŠDEÁTŠXXˆXˆ…M°Ñ"ˆFERX(‘!M‚EÁ ìK3™ç{ÇbI×W§uNq>ÎÎük‘ïãlDe*¡P·™­XŸº‚§õH0¸¡ÛºFÄi­PÆ¢¤jûû¶ÝZ¹¬íÌ(y3®CÒ¹·\·žÏ·Ô›ÞÑè!»MüÞ ‹L6É/ÙÙÛ1¨æ6mHÀP»lŸ ,Õ]<™]mÜ™-^f<šÀ]~ н2¼±q0¯ùí…vÑrB9ÚZhéCÚW)› E–àù̬~zñ.}’ÁcLêQׂ`gºûÕÇÌu÷,!¯·Ó›§1²«b]¨ö§ÌlP4³lÄÙh;À3NÀý= Ò)ú“z°n®Öldzî=­t¼ðø@)!{ ˆÑ`ÜߎZÓêùº,ÇŒƒ*—t#­*AHÄ- eE°Wpßš£?Ü/á-pç†!;(¤ÆË²×…„=ÁN“ߦddɈŤ«©´y¬”ו(:¶@§Yì€yòǨí_È€Hçµta\’måsãmÄìQLUßüú½ˆ4*»ç<ÂT•ÿ=  1Ⱦ¬ ÿú 0ÄÉþÛIEND®B`‚sonic-visualiser-3.0.3/icons/regions.png0000644000000000000000000000020313111512442016416 0ustar 00000000000000‰PNG  IHDRóÿaJIDAT8c`F ¡á?”õ* 9b⸠`$Ö`&4c•Ãf^ÑåpyXCˆ2oxòÁð€(@¤ ™†ò©= ÙÈœIEND®B`‚sonic-visualiser-3.0.3/icons/rewind-start.png0000644000000000000000000000050213111512442017375 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ95BÜtEXtCommentCreated with The GIMPïd%n¦IDAT8ËíÔ+ BAЃ Š»p ‚M5ØÜ›‚јMfÁ,Ø,š ®àZ&ÈE‡ûÃý`øÃÌæÁ Mþ=¬òLX# 5†Þ±Í'í[†x†þ¯p»Àö‡8 ÔªÍ O³¢yŽb=:YW‘uÅ»Ú+/ñøÑ×-Ÿ1Žà¥.ïŠQ¨•Âpתaáp*oR5æ8Öõ»u0k>ùhÞ«*H=¸ÆIEND®B`‚sonic-visualiser-3.0.3/icons/rewind.png0000644000000000000000000000051713111512442016250 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ1 õû¯tEXtCommentCreated with The GIMPïd%n³IDAT8ËíÓ¡ B1†á1³`ö› j°ywÞ€Ùb1ÙÁ,Ø,G«É¨Á“äœM‹ÁÆÂ»½ûù·ñÏ/¤‹ù¬Rša‘ÈÔÒvh'2PH7h%²`Å_K‹Ä£ÀÆQ¬ô½S¬Ð(X×Áº„UæŠGɸزª3\JÝX³J|À Dp °¨Ë;¡ŸÏXÔs;cˆc"‹úyY^Ý>‘E}é&Ø&²è40þ€ýóÊB¬4p4`jIEND®B`‚sonic-visualiser-3.0.3/icons/select.png0000644000000000000000000000145613111512442016242 0ustar 00000000000000‰PNG  IHDR üìbKGDÿÿÿ ½§“ pHYs  šœtIME×  q'™tEXtCommentCreated with The GIMPïd%n’IDAT8Ë•ÔÏKÓqð÷û³ïÜš¿› ÍÚ@Z¤8C1Q0¡K H:Ñ¡ƒ§êý¬C‡þÁƒ‡ŠAÑa™6 )R "áü±øÌ¹ïwß§CßɦQîÏásy}žÏó<’Ìd2!’.’Š$QiT"’]YY “ô’4*‚ø' qbnn®‹d I7IU R%"2==-""³³³=$k •"J¹ ™™™ÞcCâñúäL°¿r¨©«H¤{L‚mC•A¥ˆ¿9,CwÅß‘`èÒ±!£ôRå®Åɦ<'š ÷61yï ¾pq||ü3€IˆˆýWÄ0<¨®n@½?ŒÍŸZo`bâþ¡2IJöaæsp{j`ˆe!›ßÅ­Ûwþ •!yóvvSÈë-ä÷5l;ÛÞlA,;€”R½£££EHʧ. ‘$Ü~UΆ¯ÈúƆÛ¶÷âñøgDTY¥óV;é5ÄŸ?ÅxôÜÞÌÏ¿†Öú‹Rj@)Õ­”jw¹\çGFF~ –ebTùdáý’ …܇ä'éê¹)ýƒ7Dë¬M²‡d˜d€¤ß™¯ª#™¼}ó ‘ÎŽï†a uEÎZ[[°¾žÂââS©ÔCy{4€ €”ÍŽišßHv’ìÐZ'^¼œ—`hP†‡Ç¤P(äH¶‘l,fp¸cÝ–e%Iž&"ÙšH$®ooïH Ø'õ AY]]“d29I²¥XÐ#û„¤Ïy¥ÑiñÓ4¿>~òLÚ;údyù£h­NM|$]G6›3ç¸IzÓéôƒ­­m±mÛÊd2 SSS—Iž"Y]а4£’»pð¨à ì;EÕÌbÛÿÞ~i¼³²©‹IEND®B`‚sonic-visualiser-3.0.3/icons/sharpen.png0000644000000000000000000000024413111512442016415 0ustar 00000000000000‰PNG  IHDRóÿakIDAT8Ý‘Á À M§aÃ8؆¾Z¡T5ð«z¯Á1ÀWé 8â¤NÒúH2/;î{1A"‰RŠu»B­9gë3– |$Ôgn´Öp5ý摱íˆ IH²>›¾UàO8 e9wþóIEND®B`‚sonic-visualiser-3.0.3/icons/show-peaks.png0000644000000000000000000000023213111512442017033 0ustar 00000000000000‰PNG  IHDR Vu\çaIDAT(‘µ‘Ñ À0DNy#d¤ŽàgF0“]?ZBBLAJý•{' | ’z«,pJNr IcŽ'Õâ„Õ¶tÁØŒóœ.Ðo)šºhR?ë3_è»?DüÊ2>ãÉ2IEND®B`‚sonic-visualiser-3.0.3/icons/smooth.png0000644000000000000000000000046013111512442016266 0ustar 00000000000000‰PNG  IHDR à‘sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ *%hÀëHtEXtCommentCreated with GIMPW‹IDATÓÐÁ à¿RJrઔ“\\½â 88¨?JÉÁˆ£½l;ÍÎÌnÅ»hcè[{œp¯…0ÂcÌÑAW\‹(̰Ä]”ØDñ\Ä¢Â-\BXcXÍ0ˆB õônpÒ!<ÒËàjx&d3K7ì’i‹u‘3W?Q8?UþùÓ _z!}¦Û•IEND®B`‚sonic-visualiser-3.0.3/icons/solo-on.png0000644000000000000000000000054713111512442016351 0ustar 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ$"yzí!iTXtCommentCreated with The GIMPm°—ºIDAT8ËÕÒ1jBQ…áïùnb»4B:É^“\ Ëô)Ý‚» ¸ Áò.À"¤J'BVÓDH“ Í „4ún#žnþ3‡™áÔ* ¦ªÄ=\4àSˆ©ºÄ3úÞZxÈ„AÀõŸú‹cá×ÇÅwø×âþ÷ƒ5æØ1U¼d¤_#–«ÙÇûͰû…[tÐ:Ò ƒÏ¢éؘª+lês?…úF <Ú(÷j§qæ—!ÚÕ œ`êüµ‘Þ åmqIEND®B`‚sonic-visualiser-3.0.3/icons/solo.png0000644000000000000000000000047113111512442015733 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIME×  +#Q^iHtEXtCommentCreated with The GIMPïd%nIDAT8ËÍÒ=AQàïñü4:µFlH(íA¥·­­X€Zk”ÉKÄCs%¢áÞ†I&“™äLÎ93ü:²P«£‹Z~ulpOÈQ S%äh¿ô}l#ð×üm0Åà¨ÄkœóRôЩb‡=´Pù’~ §ßš¸Ë<üÀ¶ ¼kš&˜¦‰ÝnÇívS,1MÓ4©T*¸Ýn ÃxÌ!ðù|!k³ÙDªª†A«ÕâüüY–0 ]×1MUUQ»ÝŽ®ëhšfµ&“É?*•Ê[@€v»M£Ñàòò’V«…$I!ÐuÞÞ^TUE–eE!™L’Ë室x<¾ÇÑuUUéëë#‰`/^¼ ŸÏãt:Ããñàñx¨ÕjˆL&óàÉÉÉ_×ÖÖD&“†aÓ4Åýý½8;;étZ4 aš¦Ðu]$ ±²²""‘È€M®¯¯“$éi½^ï’e—Ë…Ûí¦··—îîndYæöö–ÃÃCöööØÞÞþkÿKàöqÊŠ¢„£Ñè·ápøIOO^¯—Ë…aÜÝÝ‘ÏçÑ4ýýý_NNN¾Î§ `šf±P(ü¾h6›r6›%›ÍR*•èèè`||œl6{¿¹¹ùéKøµ€‡‡‡¿ëõú?>Ÿo, Ù'&&˜žžfdd„ããã»åå坯óÿ}ã«Råm¿ßÿIÿÕj%•J%3™ÌÏÀŸÿÍþ  ‹P‘e;IEND®B`‚sonic-visualiser-3.0.3/icons/spectrogram-22x22.png0000644000000000000000000000245213111512442020063 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs ‰ ‰7ÉË­tIMEÕ  ,P4x¤RÒÿߑ|x €„ˆ|Ç$‚•éˆî-¢JìÆW-¤) ÅÓüm *ÄaDT-1úÇqm†Úg»m­4[L¬Á /žnz°`–‰"?¦÷‚YNÀ*ö¦Fz%EOˆA@1æÑ‰w”íìüí´BQÆ¿.‰Ç¿Ý å)¡AÀÌ3´qT›s®þNL‰”"jâ,bí{ `ñY‡ÐñË[˯îø6â.†ˆ»8´ó$PëˆaĹúqyF>ÜÛ#q…˜à´JdÓ{BU#¢¤ˆm”Ô¤4ˆ&¯è» Dóˆ èßvÊoÞXŽòħß[aŽ:$Hq;¢}¶G§‰#É{²¢!+\=EË TÞ“M€æ‰Û½ÐŽðé<Ð<¹r‡Ô#Éú?m ¯sˆŠ;ÄXêÓ òÉ‚0`Í3Ô8ŒÉÞ!¾W^þëˆß½vLœ.:¤Þ#õLÄov¤NI½`« "ÇìhI6Ÿ#•C2KJéñ{ÿËl†Ï/.»Ûz30Oá"w²# H·ÄLjÄ*Z&ì¼$¶4zl] {<%‘þú††ÿ=ÛŒtWÒ^óåŸOà‹§ž³£)=fž°[d±Å,•ìü“çŒwk̤B2§€ ¢|{к»¯«@¸V¥…‰M|Ô?{…œ´08Â*¢e†6v6a\oï63›SM±63ýèÅel#’;’ϸ¯·ÌkÏg‘f2pÝ CëÝ—-~³£x~„iJ‡9rć‘ÔzRˆJð=¦yññåxµ&Üuˆä ®b~¼¦…›½òì`ÏGdrϰ^ÒÿcEþl}2{4³¨N0yÎ~õšFL5»¸LûÓThnÐE¤Ÿ´\µ† _œüøpà.ÀÍ7Ó@T`Ïdº…1£ûê;©P,q?`šç?¸þý¿Zã·{²³)q±fìJÚÛ%+³c= 3ÕÙ†;;E+‹8ƒ¿²he< q(vZ#£`Šìà2ù€5ˆ´ÈàÉž,éö‡½åùEËæOš@?¹§ ŸèÒ#Ó{èsÌaÂ4ŽñjKê=Vç5ýíŠa}‡›ÏbÁÀ˜á¿N)¿£üö•ã ?qKià××–vºªcû‡ï£‡Åç5ÃËS¸Ùeòž¬™ö Æàá›­Àn¼²úúŒÍ¦¦w=ϳH~¶‹­kRˆˆRˆÑˆd`ÑÆ¢~y5E€¯=û;+$÷èqÂÝ#õ=z[á&è,£¿Y ‡â@¬zH¤ä†&qR=»B¯ÀõÐYÂ<¢r‡ª ÌÖ~±@œF› f5¿¾]a>­u¶ä‡ ܽ"yÇæuCЉü“=R ³5’%ÒÒã¶&èòñÏ;[0Þ]°ê…ëµâx²Æg=2¼¥[l³ùsNv\cö:À¢Æå J 1"A¸Xj6^;á‹'k>ŸÜñý?–ÅXÈ?< .#$…9Ü@ÞB¨è®fh#ås·?"Ö ú6g5Ûf®½°e¡Ø_rcF¨Â Vã/ ªÐHPq £MF˜Eú÷ iQqy9ýìožU&PØ7¼º˜Ðl¶¶0h`UaŸö˜°nA ACïð%pŠŸÿUüte™ Z÷ÏÈ5üøÖ°ê„¶h¹ñ#¢IëÞ=¤µ£é…Î o^¢L@…_¬ùî£ ­â·ÿçrÉÿ™o6ñ—ÆÅIEND®B`‚sonic-visualiser-3.0.3/icons/spectrum.png0000644000000000000000000000025613111512442016622 0ustar 00000000000000‰PNG  IHDRóÿauIDAT8c`,à?¹™` ² ÁꂈÿI2SqÄ¢  Ø p.\¸À·ê|doòª$ÌùP:bÅÿÿ þã3ä?Ì 0ÅØ  ‘ €kD’Äf3.×ü'6ÔqzÆ@Ž bذ'×vFÂJh èßW„eâ«ÑIEND®B`‚sonic-visualiser-3.0.3/icons/stereo.png0000644000000000000000000000026113111512442016255 0ustar 00000000000000‰PNG  IHDRkFI bKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk>QIDAT8Ëc`tŒØ…ÿÿ'R;#yê1,&ÖŠýKÈÅŒ$†ñê™H3€|i1.@½¨ Ñbê…‹©È0ͰTÍ„.@ª´U? ¨¯@`FTwIEND®B`‚sonic-visualiser-3.0.3/icons/sv-128x128.png0000644000000000000000000000702613111512442016345 0ustar 00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsA›A›œU:ÏtEXtSoftwarewww.inkscape.org›î< “IDATxœík¬eÇOÏiO½Ðž{z¡ÔHKSÊE.¦5ˆEn1&¶&€šh”ÿ¨ÄDIŒ&Ä^B0Aý Ñ BVM$⥥Tè…Þ€–Þ8…öœÇ;Ûngçyç}çìÎΞ™r²ÛyŸywºóŸÿsy/+›Ö T(-Æuú*tJŽŠ%GE€’£"@ÉQ ä¨PrT(9z=ížÖ·ñ:*´«€«ÒŒ| °~é#z×h®¦B¾Ø¼V (9*”¾. ð‘Ï7ýÀ ªêÏ:ymEƘ €ˆL~ &4_ "©ê¾œ/«+0V\À­$ß|€)Àí9^KWa¬àË)íËr¹Š.D×@DƧ˜-ÎãZº]Oà|jÁž çED©ÃXÓž~€‰Àà¡‹È 5fG¯ƒÀßTõžÐþІ²2ø%pcÂñ5QvñN†> ƒ± ‹yÚYY‚ ™ \k4÷„öY4Œø*@0€ë¨¹ s3ôY(t5Dd0ÓÓ|v†øtJû¼ } ]Müå²)À%)ís2ôY(t;Î ° R`aŠY¥ÆüÛP0‡Z çBE€ãœÛP°Èæ"@‡¢"Ò`®‡Í`·W»úâ #À¬[è%[pYt-D¤8+ð´8ÀG ËÝ@×€ð§Âà£P c ë©ÜU PpdQ/-"3€3=ûìêrpGGEäóÀ jãù“¢ëù¢ª¾çqº¥ûH~2}ËÆ¾O?Æçt :F™ Ü LŽ5Ý |Ë£ Kv|ý?Æçt :é¾Aó͸CD|‚5K¶Ö}¥1t„"2øºÑÜß,^K¶3z„(@P "}"r‘ˆÜ&"w‹Èã"²:¤V¢S.àk¸ƒ,ç(\T}³ž¼mÀt£­ Ð'"3}f‰Èg‡€žXÓjY®ª¯|nKÐ)pKJ{Ú4îÙÀx£Í¥3Rú­#DÀß |Ÿæ›µÿË'?³%È‘¿0Åì™âhw¥€®`¼ˆ8Ó»hXHÉ< "‹pOO¿:ð3[‚N(Àu6‚[\E —@º}úÁOV¦´_‘ásGNàSžvu´Y  Ôð¶ãÜ4„øÿ:ZA€AqÍ?l r%@¼ùú:—¿¶`Ÿª~ÀèÀ"€»Œ6ŸLàÊ”v![y{TÈ[.¨ªGTu„ðbÐB’€,ää¥w|Ö£Žó’VªÃ"@öp±¥;Þ‡¦‚¾þ¿Žö£B^°ä_ß9ÎKŠF«`»ë&î4Þûœ[;xø¯ã¼Ón”ˆŒÇžÛW€,B> ð–ac d3¸ÁZ޶ ºi—Í{Rça_³¯ Hê·^²Èå£Ñj¥8B`y ý¨‡\Œ½Ìzc`ÙÖ7„p0;-ö‰ 9 %ÀbƒHmAp¥¢Wߢoà0lØ&À•Çû(@SQ h©Ê&ãx9ª@°üÿU­oÛæ;‡ÏR€ÄÒ3UU`²y"ÒjIï㈓h.µÜ> ¿wôã»ñÕ¨ÑIØÐðÞºQñ¹–¼¥ªIO{H1(­ XÇn`İ‹÷á"Õ³ÀQ£-mo¢–Á«|ïf¾w¯Èw£jìãxý5q|ÑT¶l^+‹¦OàÄ›m&ö0»n0©—%Gêpý=¼Óh×püý¡ZLÏ‚¸ý¬~–ïj¶‡ÿµ†y›×ÖäMk`ùoØ?¬Í$:k"Ëû]>Àåÿ4¨}ûzî-CÃÍ]õ 7Íê—F G•^……^UÆiìµc½#Jßñ‡•ùùJ^ü„Çòš±‰½Ž ?¸Œ;©-ãúùðàëÍ63'²”ZªÀŒ‰pôH³Ýµs¹´Ñ®ŽƒðLBÒ¶p*WÇí/šëÄ}áT¦ÄmOƒÍšm— p SÞ¯™ ¾º„uï}omn;¡ î;ÆmÉgúab_ðÙ‘uý=µ/±Ž©Æ\™ƒ ªp|v‚9/iĘfls a¨eOÂÓ0+aêYFŒWÝï'ÛM¸â#Éíy¢#X6z>yª±Äãðq‰É›‡O½c‘1cºA¬÷°×¸Yƒ 7;‰ÐL¢$—ÒØç5s’ûÏ!ÀűØþLÇl¹ÃÇk¯[Ù6& 8t†È4¬ðö±dÛÁج¦Tuì1HU'Pï8¸5´NØbtdmà¬~ž !²>z‚s0Ö l?¯— pèÅÝ\ |,Þ. ó&ñ+rþ£'8cÅÍ®£Üöd†Þ8ĤaMö¹'FxøOìØyÀ5q[¶äÁÅÓ9]ûH(‚©²™( ºi>ÙÊ;ŽÒR‡pB9€; @6­iŠæ›ðÜ.Öݱ‘u篮6¡Väè~ªª'«"²xÑøøËTõ%yX›Ð¾EU¹xÂèw©ª¾Ù] üŰ[­ªOÇú];‚® µ¹úV¨èZS?Z8¨ªM•UÂ^|2/öš—‚äŠB@UFÎî_æ0 ºyÖK¸žTKê#‚–¨ãÜÜQD°â€éÀ£M‰Eè ð°n–ëIM›d‘j¯ª&¾;ƒ"ÀrÓ±`»ªZ*uøÀg*˜o[}ÀÊgvQÇQ¤_ ³0€= ì ëp 0­K®›Ÿ€RÇ9ƒln%wI,0ÛøÀÊê 0ˆ=mÛ¥ÖRq¡´fq+¹£H°àBì_µ=]³µím¬Ì+0`¥UÓŒãàNëH#@Öt-aû$V9Ú*È"£Q€)Ñœ½L  ª‡©-K‚kǯŠB¿˜]ã ¤ƒ‚Š@1XnÀµÑT%€ï®šiM°æŠ’àZ[Øt3þíi—U|®Ç$a·ªZ«‹;‚"`µ!M_¼ìi—6 ”§ÊÿC²ô: ÿð´sí6 {á†ÏͪÐbø~AàD»m6š—‘­TG¨ ¨ß/hs´¦ÐVàúñéÔk‰²„=×J˜¶£[ à+ÿuXpmHí›®…¸×lsA·àïýZpmÎÜ„Æ mGÑ`MÌŒãýº2$Œ*}>ð•õ!ª /ãž µYÀ¡ORêϹÄR­ó½–­ÑŠåB¡PˆRAkºuÈÐu(BžT_ÎÿCÁá™”ö<¢¾. pþŠI€?9Ú¶Ïgè³m MIÛíaZ)€"ÿþTBÓð™Àü¿Žv*ø=Ý•øBU¯n67¾]U}ëÿq…T€"M = ªú¸ˆ< | ˜¯ªŒ¢»Ð404]KØæá4RUkòHGQXDûþü¢]í§6ï«x¡ ð4ðCG{áJÀuÒ´QzéZ~Öˆ"P½ÿ—pÏOȸæ‚R ‚ouÊÖ}޶ßfì³í¨ÐŒLåZU½‡Ú æo9µ•ÜSªº1KŸy "@32OÚTÕ-ªú#U]Im¢É Ñ_aQè °Åð%@KòuUÝ<ÙŠ¾Ú‰2)€o*XÈ|½](rU€nAE€Ó1Bsöv LØça³=ÏŸl+ÊDŸ'»Tòå"À›Ø? QG©@(¢adkW:*ãHsRÚÇÊF×þ.þë Ç ÊFרܳѨa©P6<X›><›ç…¥"@´Å«õSµës¼” LƒAuÜŒ§æóFïªjÚŽ£c¥#€ª¾¼Ðéë( Jå*4£"@Éáõ“1ÔÒ§õm¾– ­Å*àª4#ßà*ŸÎ*t*PrT(9*”JŽŠ%GE€’£"@ÉQ äø?O4lãÏ °—IEND®B`‚sonic-visualiser-3.0.3/icons/sv-16x16.png0000644000000000000000000000100513111512442016164 0ustar 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs33¡HtEXtSoftwarewww.inkscape.org›î<‚IDAT8¥ÓÁj@àoÓ„j¤¡…Z%Vb«¶ =Ô>€‚xP%PßA<ûzñ*¾@ôô¨'D£ÒjÐj•”€Û¤ëe+1m5âÀ°³Ìüÿü3ˆjYô–Mç<ºwk&N°<ºËúØiTTËbµl&ƨÛñ³©ÉÕÞ|µl¦Z3ÛQ‡ޤ.Gq3„0ð§6û0‰ÄA4S]1„ÑŒ1671½ .á:¦PÅhRð%ÜÁåà%ÐÃDãD0™üw‚Û¯]{5V 9'6ÈóÎ.Xxºjv c­˜÷¦YøbO6ã¹Rh±ûÊT¡Õ6ô£cø|ɽ¡œFý«¹‹×7 ·:öžS[ùæØÈ úܘ–ñïØòŒ¸zŠŸ$ߟöp«Ÿg\ij®%·ñ y¼ï-î]"ÜÇÛ¯a%ÆC˨ý• Ƹ„¥tmàCŠçñ¢Ýö/ñãí Bú[>S6ʦ‚Ê?‚ÙOîÞš£‰WŒIEND®B`‚sonic-visualiser-3.0.3/icons/sv-22x22.png0000644000000000000000000000126413111512442016165 0ustar 00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs G GIRN©tEXtSoftwarewww.inkscape.org›î<1IDAT8µ•MkSQ†Ÿ7^kJ´IM?ÔÔØ66ÅDð ± ©;‚HJ]Á wú Ä+@vŠK×"(Wn$õ+Z«5XK IÓ䎋œ`ToK:pæ<óž3çÞQ.ƒ±æ9ÿ˜ns H5ÀÓÚåVY’N§ÌìnêÌ„²@* ÷,p³©Ð”¤óÿÛœú%E]|¸Òð¨ó{’ëKº'é¤ Ó@‘ºê> «–””4,ip“”:@Ü©]º%m.÷%E‚(w~˜ú5ÌŸ`x œê”ËÝ|øæ ià wàà‹+–ݞѿ!À\#Wûõ(~x§÷wó|v‰CÃ] â±{±B,þæ+?Êø‡ãL>Yà`Äc6$îŒ'4¹âãÝ>F4vŠ«FÇrx©Fï¾3ç’¼-׈åË ŽDYìí¤Z©±½X¥/¡Ô¦ðs™R•î©Ç:(~/1T¨°³fîkÎe°\†¬™ÑX@ð]£ŽÀSêM¼Üž Ô¼7—!›Ë`­-Øä¨?±·æà80of~+@K°™-K*ŸÌ¬,)ì¢ì[\[ÚjŠ8åÄ€ê/¦ñšÞ­lfךÂF3ó%}–€WëQÜ\¤â®æ£‹}I=°úvöxÙT¬ú¯äµ€/¿‚&Ëͼ M)þüPÚb¿µïµ‹Šå¼¯IEND®B`‚sonic-visualiser-3.0.3/icons/sv-24x24.png0000644000000000000000000000136113111512442016167 0ustar 00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs M MÒέNtEXtSoftwarewww.inkscape.org›î<nIDATH‰µ–ÏKTQÇ?GgÆtÆrÔiL_f?P¡¢éQPË iݺ}´iQÿA« !ZB®¤° JÁ+ÉÒmÒÌùáiñŽø°gFôÂãÜçžÏýžûî}Oq”=,>³ËÀØ.ÇîB€±Þgz¾˜§ˆœüªú®Üèc·eèó•ôtËC ¸b@hPÕÑRËœxÚ€«@{©‰U¥D¤ èÚD$hÝ=@«ˆv‘€ˆ„¬é5V?ê±Ävîß­~XVfiÂ6Öa z!"w*\êE$b€ 4ã¦K¯@‡ˆt7€‹…ý·É–×KÖìòüÈsÖçæ{¸\ýNz“¦  ÷ÍIÓ¸)Út‹ˆTÎÐv6"C-µÄD˜Vž0·ÞüäÜÍN’oçý\ö ¹Ô_|N=ÑÉ_sB´N¥™š_Å9ÝÌËYˬãz`MµòŠ-O i™ƇgéYZÃYÉÑØ%ó9Íz:K$«p¨Ž•#ûÉ.pðw–œSÏbw˜3ËÄVªÈW yU\5‰8šˆ3¢ªxà‰¥bÕ”>aàî¦þ^÷·ÎOÄIÄÑíÚœåû£ªæØ|‹6öàP œ²ý(X¶»*æÍ¾7›"@Ô3@_ŠÙNÁx@;’¦jÖÆ> RTª‰ÈuàµuÍã^ëlžòi NU—*dÐÓL™µÕ\(€.œ?!¯‹°á=ªúçª-ªØ-æÅ²¥ÅUä¿ÿ5'úXEíÕIEND®B`‚sonic-visualiser-3.0.3/icons/sv-48x48.png0000644000000000000000000000261313111512442016204 0ustar 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYsšš›2aptEXtSoftwarewww.inkscape.org›î<IDAThÕšßoEÇ?ßB@¡Ôò«Xi) #!©< ¡1`H°ÆÛÄ'#úbâ+ñE£ÑÄWõ0èƒÆH0D MDŒ ¶Ô R)XŠBÑr|¸3ìÜé½pïv/ä~“Íœsfvæ|÷œ=³w÷ª¿£ŠQs¯˜-ªžÀÜH?ôÝ GÊÀv`“Wb}ÚKwןò0Ыwd–B’6HúÖ]YÍ{'dy<lqÇ“Î{[Ä)4<ÈÛ ´—ÜEûÚ̾ÊbÑLHªºSK1mÀ«NýÈ„@V)´Xè’æEc:y}FëfF`MÛªHoäfµY#+3RhŠôu<™S!ëL¶•јöH/Dºl”E@R‡¤]’¶qæ—À¶,SåV¡}@pMÒ 3‹œùÍÉ‹ HZÈ̔ʻo$í6ƒföF©•L@ÒCÎy€:`'ðiäÌŸÀe"äç¿"ˆ€¤Zàmr•lZÒ{fv¥¿ÊI¡žH_ëð@Dò „é3àÚ0…&)Ãs˜™nEQ®Hotm¹ªÅ ´¹v8êä@k4w¬EIܦÔ™½ƒa.#à#tщÏkæŽõ¢(5À'»Ö;^ɳ$–vO`„ÀI>mZ£õb½(J%ð¨k§H~ðøòWòº™]æö8Gޤ‡'ß­ëEQ.ãq¼ý’kë%ù*×ìÚ0oÖ{°D¿ò ³XÒIÍ’î—Ô$© Øê†fæö¼c¾_äêjIvåsî°è\Oà´×}zIª•´HRƒ¤“Óù¥?ÀAö8GÝB¹£àµNžz±ƒç抦^h©cÀî5tôêÄ»ÛxÓÏ·o}ûwñ£_çõGx¹¿‡£ ó™èiã•CÝê<»Žº[މaIL×€aàâ©‘¼ßåíÄ[W²úȘ242ÁÆ £ÌØPO=P·ja®àú ÚÆ§’ó×.f5ÐÔ¼ˆ9W&àê$Qïû»[Xziœ›_œ§æ¦%óäAÔæ©á‹­_¯òñÓyŸ\øk\ë)3Û/i'pвØïä'\ÿr`ÈÙžjœ¾ÊÌ.JÚôßo¹þÀð¹‚1A.^î릻qÏ{Ÿó"°¾ž³fv  ó—¹+Oºv˜äqa°ÄÙ'bþ~i!ÉÿQ3ósßJýÊû¹šæqz(»\;æ2³iÀ?Ç,')¡çÍÌGÛW¬•À'‡Õ©d¤!F`³kO™ÙÍÀVª°„zxgl‹le¡lfvƒä ÏqíÉhXH ÜÄ<ÂÍì®Gò£ðC¤—î`»#ÒŠôÃ‘î ¬&ÀÌF€ÿ¢sΤq$ ãÀF¸UÏÏEcâ+~šHKàx of“Q¿'n:ƒÑ˜³‘þ{GÒø¸àä#ú/°Å Œ˜Ù?iIõjÑÌú%µ“{z¨À˜@¸‰y„)”êêÃ,ÞšÙ(ðY‘î˜@¸‰y|ÈÇÒú‘åÛéq™ó3;&i-pðGÚ…*E Ž@¼Ñ`fgHY>=*õ‘ï*p=ЪÐ:•!àòýh`ú¹ë@e?³~CîeïÕHÀÌöšÙ\3[`fÿVjªÿЭè¿Uÿ¡{SØY ¨úªzÿ^$^K¿ÚP›IEND®B`‚sonic-visualiser-3.0.3/icons/sv-64x64.png0000644000000000000000000000354013111512442016200 0ustar 00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYs Í ÍηͱtEXtSoftwarewww.inkscape.org›î<ÝIDATxœí›Kl”UÇgú¤R@(´<¬¥ƒ ‚ˆ" ‰aá‹F’]ƒ ãÎ÷&Ƙ•°0‘¨¢à[ÁG‘”GÊK¬åQ´S:ÇÅ÷ =ßûMg¦óÍ4Ö2™sϽ3÷|ÿïÜ{ÎwîŒüü Ê$FªÚTÿPmªZî°¯Ò†T+€éVá#`ßÒwuMEÌ©0~é’]À]Vç# ì‘UÀ<à*àcUí«Ä¼… qD¤Ø 4„ª7€ IÏ[(*± ®gôâÖT`΂Q nvÚí"2%n°ˆL‘º„mº‚J°Â3g»o ˆÔ‡´ˆ ŠÈSI—(á\âéšó‘U@K(7·'a—EÒpPïÑǰÒi/*¯9¹Hš€…1ú8®sÚ Êh‹IpmŒ¾Pæ$½!&M€w³#HŠ|p HOVYP-hu"R\ã›è27"Ò""ëDä*O·õ€£Fnq1öL\Dd;pØJ⺰ð½‘}¸îŸÅÄ$@Dnî7ß±ÒéoæÕwF"²\D>‘½"ò­ˆL-Üò(Æã;íù"2Ó´¯Ä´- "Òì|>Ž€ùÝ#À}¤ß <4¶¹~Œ‡ß¤F¶î?t;c]/° Ù·pÚK=c BIˆÈb ÓÓe/Ên€¿ä ѬïK#G‘r3ĸh3&Jõ€;bô³lúMU‡€ Fç`³ÆOî¼»ý1vÅ=wäE)X÷ÿ 8iÚY·žK´0–Ø <¾÷ÅôÇÝi_áeLŒ×ö oÙ‹²w#ÃèÝ,d ã|«ßÜüÈ)‹¿ÈÂÕò" JðBäÊ)ò•"ç’üòÏS„ÁM`Nw—´u4³¼7Ô¥àÌO2³»K˜×DúÄ¥@_#Ìíî’6€úépË›ÙÀ@w—´µ4rþì?®>Egw—´ýÜOæñxJ »þa-@JXµx†¦L¥ýà9ÞÌgóЇ]r–@¡?¸~:L­ƒ™¦âŸQ8? GMºÓn‚ÓÕfì¹t0àô¥Q}[SðÞj çÙþ¾ÁQ]­À= `Ñ´ ŽAŽL­ã|K#‡T¯d\ˆŽÊ4×ñ­ÀÖ ÃLÞÉ~þ“>ßÙÇ&‚‚(}ƒ¼!aÿáó´¯B@ôOý¬HgF?ß7ÈÇN 2x-ìgÿŸ¬«‡Û§jSœª6Ü»€ÅâÉ i:EN é”0œ‚áš }Ô#îõŠç"»‹9 C^Úy'ð>£§°¨ê{áØ9õƒ,S€Œ®YU/†»É­Öχíªzw¡v‚ÿptÜ!UU¢»»{}ÀÈýDWÙl¢;ü€ª^ ¿w0} ˆF€Þ’6(WMІÂ5FNœô ª—‰^T þ˜…› t˜voñfæ¢\Ø´uµ‘{TÕ]wn.à˳è5r'˜ëö!Ç-‚@~Ž9cy ÑrúQÊ€$<Àâ€Gço Ø­ÕDíí-Ô¸|HÂ,ö{tî#q¾%`=ÀFü4Ñg’‘´ìñèJ]¿«j&¦¯($IÀaU=íÑ[²y@®ü {¾£,ë’]¾»QÜÓãaØìõ|Gœgr°ŸÜ;µ×7(¶¸yNU/¸ƒñ_ìÄ" ÌÞ¾pÔ…x€…ëþYô¨+ å<~ßÈ»ñçP<ßTõ%àà +Ï.=^ÈGŠ·Ð²þPRUw-’úð08¥‰œ˜Åç*ٳĞð¥,¨ÈOe-TUE¤ŸhÊ 1>onfÛËiOÅ q–\bc»ªn¶%aHµþ/àÛ~¬¸T€SNû¤ªÆmމ¢Z¸a¬*wªG€Æ&vÕþ¢S•( ªŸ‰È&à°GUãr€ÄQ­0ˆª¾R­¹-&ýßæ|#“þosÓqNOþ˘ôKàªm@µñ/SÿÏçJŒU-IEND®B`‚sonic-visualiser-3.0.3/icons/sv-icon-light.svg0000644000000000000000000004365413111512442017467 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/sv-icon.svg0000644000000000000000000004363313111512442016357 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/sv-macicon.icns0000644000000000000000000007553013111512442017176 0ustar 00000000000000icns{Xics#Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿis32ÊŽÔld‡™ƒdlÔÔdÿÿdÔÔd€ÿƒ€ÿdÔÔdÿ‡ÿdÔÔdÿ‡ÿdÔÔdÿ‡)ÿdÔÔªw 5‡PJŒÒÔÔ‘_¯ ‘ÕpU±ÔÔdÿÿÿ‚ ÿÿdÔÔdÿÿÿ‚ÿÿdÔÔdÿÿÿÿÿÿdÔÔd‚ÿ ÿÿÿdÔÔd‚ÿ‚ÿdÔÔl‰dlŽÔŽUö¿šnƒ¿öUU¿ÿÿ¿UU¿€ÿƒ€ÿ¿UU¿ÿ‡ÿ¿UU¿ÿ‡ÿ¿UU¿ÿ‡)ÿ¿UUC/4 7RUU8%D žU ,!EUU¿ÿÿÿ‚ ÿÿ¿UU¿ÿÿÿ‚ÿÿ¿UU¿ÿÿÿÿÿÿ¿UU¿‚ÿ ÿÿÿ¿UU¿‚ÿ‚ÿ¿UUö‰¿öŽUŸÿÿ€ÿƒ€ÿÿ‡ÿÿ‡ÿÿ‡ÿ¡ÿÿÿ‚ÿÿÿÿÿ‚ÿÿ ÿÿÿÿÿÿ‚ÿÿÿÿ‚ÿ‚ÿŸs8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿW0000Q5000000Wÿÿ0Ò4p0ÿÿ0ö[)û0ÿÿ09ýxMÿ0ÿÿ0jµBÑŒrî<·h0ÿÿ0¬Õg• ‘³[ÙŠ0ÿÿ¢ÙݯˆÉÞ¡äÚ†ÿÿ¯ƒÉåbÙØ{ËÉ–¢ÿÿ0ŠåÌÌï0ÿÿ0dµÎÈùp0ÿÿ0@ȰÝM0ÿÿ0´’50ÿÿ0“g0ÿÿW000000000000WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿICN#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿil32K¿ÔY—2YÔ2†ÿ€‹ÿ2Ô2†ÿ€€ÿ‡ÿ2Ô2†ÿ€ÿÿ€†ÿ2Ô2…ÿÿÿ€†ÿ2Ô2…ÿÿÿ…ÿ2Ô2…ÿÿÿ…ÿ2Ô2ÿ€ÿÿÿÿ€ÿ2Ô2ÿ€ÿ‚ÿÿ€ÿ2Ô2€ÿÿ‚ÿÿ€ÿ2Ô2€ÿÿ‡ÿ€ÿ2Ô2€ÿÿ‡ÿ€ÿ2Ô2€ÿŒÿ€ÿ2Ôs€!?8ßzëz|×?W4-&¨Ôd Sy¶d^e±l? “Ô2‚ÿ‚ÿ2Ô2‚ÿÿÿÿ‚‚ÿ2Ô2‚ÿÿÿÿ‚‚ÿ2Ô2‚ÿÿÿÿ‚‚ÿ2Ô2‚ÿÿÿÿÿ€ƒÿ2Ô2‚ÿÿÿÿÿ€ƒÿ2Ô2ƒÿ€ÿÿÿ€ƒÿ2Ô2ˆÿÿÿ€ƒÿ2Ô2ˆÿˆÿ2Ô2ˆÿ€‰ÿ2Ô2ˆÿ€‰ÿ2Ô2—ÿ2ÔY—2Y¿Ô¿U‰—߉U߆ÿ€‹ÿßU߆ÿ€€ÿ‡ÿßU߆ÿ€ÿÿ€†ÿßUß…ÿÿÿ€†ÿßUß…ÿÿÿ…ÿßUß…ÿÿÿ…ÿßUßÿ€ÿÿÿÿ€ÿßUßÿ€ÿ‚ÿÿ€ÿßU߀ÿÿ‚ÿÿ€ÿßU߀ÿÿ‡ÿ€ÿßU߀ÿÿ‡ÿ€ÿßU߀ÿŒÿ€ÿßU,€ W.[.0U†  BU'>/Hd&%d'E*:Uß‚ÿ‚ÿßUß‚ÿÿÿÿ‚‚ÿßUß‚ÿÿÿÿ‚‚ÿßUß‚ÿÿÿÿ‚‚ÿßUß‚ÿÿÿÿÿ€ƒÿßUß‚ÿÿÿÿÿ€ƒÿßU߃ÿ€ÿÿÿ€ƒÿßU߈ÿÿÿ€ƒÿßU߈ÿˆÿßU߈ÿ€‰ÿßU߈ÿ€‰ÿßUß—ÿßU‰—߉¿Uà†ÿ€‹ÿƒ†ÿ€€ÿ‡ÿƒ†ÿ€ÿÿ€†ÿƒ…ÿÿÿ€†ÿƒ…ÿÿÿ…ÿƒ…ÿÿÿ…ÿƒÿ€ÿÿÿÿ€ÿƒÿ€ÿ‚ÿÿ€ÿƒ€ÿÿ‚ÿÿ€ÿƒ€ÿÿ‡ÿ€ÿƒ€ÿÿ‡ÿ€ÿƒ€ÿŒÿ€ÿÂÿ‚ÿƒ‚ÿÿÿÿ‚‚ÿƒ‚ÿÿÿÿ‚‚ÿƒ‚ÿÿÿÿ‚‚ÿƒ‚ÿÿÿÿÿ€ƒÿƒ‚ÿÿÿÿÿ€ƒÿƒƒÿ€ÿÿÿ€ƒÿƒˆÿÿÿ€ƒÿƒˆÿˆÿƒˆÿ€‰ÿƒˆÿ€‰ÿƒ—ÿàl8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ``````````````````````````œÿÿÿÿ`<„`ÿÿÿÿ`¨ÿh`ÿÿÿÿ`çÿ˜úÄ`ÿÿÿÿ`ÿÿ±@ÿî`ÿÿÿÿ`?ÿÿÉcÿÿ `ÿÿÿÿ`^ÿ÷߆ÿÿ*`ÿÿÿÿ`kÙB|ÿÈó©ÿÿI ^4`ÿÿÿÿ`ÀÿŒ›ü™ÿÍûÿg[ÿ¹`ÿÿÿÿ` ùÿ¤ºâÿðÅÿ…ŠÿÜ`ÿÿÿÿ`Fÿÿ¸ØÄmÿ/ÿö£ªÿú`ÿÿÿÿ`ŠÿëÌö¦YÿC1ÿrÙÂÊÿÿ`ÿÿÿÿ`Íß¹áÿˆDÿWMÿUºàéýÿG`ÿÿÿÿëâââþÑÕû¡ÿ¹žÿº¹ÿ¢ÑýŽÿãÿæÖÛßÈÿÿÿÿöòóôôÄÙÿÍÿ¿²ÿÓÕÿ²ÓÿÀÿÑàüú÷õÖÿÿÿÿ`zÿ´ÿÿ”¢û_ÿ„ÿX`ÿÿÿÿ`eÿôâó¨¾âAÿÂÿ9`ÿÿÿÿ`Pÿÿ²ß¼ÚÅ#ÿøÿ`ÿÿÿÿ`;ÿÿ‚ËÐö¨þÿø`ÿÿÿÿ`%ÿÿR·ôÿ‹æÿ×`ÿÿÿÿ`ñÿ"£ÿÿnÈÿ°`ÿÿÿÿ`7zŽÿÿQªÿ‰`ÿÿÿÿ`zÿÿ4SÅF`ÿÿÿÿ`fÿÿ`ÿÿÿÿ`Fÿé`ÿÿÿÿ`û¸`ÿÿÿÿ``ÿÿÿÿœ``````````````````````````œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿich#Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿih32uÿÔŽÔ¥vƒÔv¥ÿvƒÔv‹ÿ“ÿvƒÔv‹ÿ“ÿvƒÔv‹ÿ‚ÿ€‹ÿvƒÔvŠÿ‚ÿ‹ÿvƒÔvŠÿƒ€ÿ‹ÿvƒÔvŠÿƒ€ÿ‚ŠÿvƒÔvŠÿƒ€ÿ‚ŠÿvƒÔvŠÿƒ€ÿ‚ŠÿvƒÔv„ÿ€€ÿƒ€ÿ‚ŠÿvƒÔv„ÿÿÿƒÿÿƒ€ÿ€„ÿvƒÔvƒÿ‚ÿÿƒÿÿƒÿÿ‚ƒÿvƒÔvƒÿ‚ÿ„ÿÿƒÿÿ‚ƒÿvƒÔvƒÿ‚ÿ„ÿÿƒÿÿ‚ƒÿvƒÔv‚ÿƒÿ„ÿÿƒÿÿ‚ƒÿvƒÔv‚ÿƒÿ„ÿÿ„ÿ‚ƒÿvƒÔv‚ÿƒÿ€ÿ€ÿÿ„ÿ‚ƒÿvƒÔv‚ÿƒÿ€ÿÿ„ÿ‚ƒÿvƒÔ:ˆÿ€ÿ‰ÿƒÿ`ƒÔy„•vO°ÆÖ™[ä`‚ŃÔy„‡ÈrØ´ £«Ø,EªªC„ÁƒÔÿ„ÿ„ÿ…ÿŒ6ƒÔv…ÿ„ÿ…ÿƒ†ÿvƒÔv…ÿ„ÿÿƒÿÿƒ†ÿvƒÔv…ÿƒ€ÿƒÿÿƒ†ÿvƒÔv†ÿ‚€ÿƒÿÿƒ†ÿvƒÔv†ÿ‚€ÿƒÿÿƒ†ÿvƒÔv†ÿ‚€ÿƒ€ÿ‚†ÿvƒÔv†ÿ‚€ÿƒ€ÿ‚†ÿvƒÔv†ÿÿƒ€ÿ‚†ÿvƒÔv†ÿÿƒ€ÿ‡ÿvƒÔv‡ÿ€ÿƒ€ÿ‡ÿvƒÔvŽÿ‚ÿ‡ÿvƒÔvŽÿ‚‚ÿ€‡ÿvƒÔvŽÿ‚ÿvƒÔvŽÿ‚ÿvƒÔvÿÿvƒÔvÿÿvƒÔv¥ÿvƒÔv¥ÿvƒÔ¥vÿÔŽÔÿUŽUg¥”gƒU”¥ÿ”ƒU”‹ÿ“ÿ”ƒU”‹ÿ“ÿ”ƒU”‹ÿ‚ÿ€‹ÿ”ƒU”Šÿ‚ÿ‹ÿ”ƒU”Šÿƒ€ÿ‹ÿ”ƒU”Šÿƒ€ÿ‚Šÿ”ƒU”Šÿƒ€ÿ‚Šÿ”ƒU”Šÿƒ€ÿ‚Šÿ”ƒU”„ÿ€€ÿƒ€ÿ‚Šÿ”ƒU”„ÿÿÿƒÿÿƒ€ÿ€„ÿ”ƒU”ƒÿ‚ÿÿƒÿÿƒÿÿ‚ƒÿ”ƒU”ƒÿ‚ÿ„ÿÿƒÿÿ‚ƒÿ”ƒU”ƒÿ‚ÿ„ÿÿƒÿÿ‚ƒÿ”ƒU”‚ÿƒÿ„ÿÿƒÿÿ‚ƒÿ”ƒU”‚ÿƒÿ„ÿÿ„ÿ‚ƒÿ”ƒU”‚ÿƒÿ€ÿ€ÿÿ„ÿ‚ƒÿ”ƒU”‚ÿƒÿ€ÿÿ„ÿ‚ƒÿ”ƒU{ˆÿ€ÿ‰ÿƒÿ‹ƒU0„;.f fEOT€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ëÿÿÿÿÿÿÿÿÿrSÿÿÿÿÿÿÿY€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ‹¢ÿÿÿÿÿÿÿu€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Lÿÿÿÿÿÿÿÿÿÿ£Ôÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€qÿÿÿÿÿÿÿÿÿÿ¼öÿÿÿÿÿÿÿ«€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÕÿÿÿÿÿÿÿÿÇ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€®ÿÿÿÿÿÿÿÿÿÿí>ÿÿÿÿÿÿÿÿã€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ìÿÿÿÿÿÿÿÿÿÿÿbÿÿÿÿÿÿÿÿû€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€êÿÿÿÿÿÿÿÿÿÿÿ…ÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ ÿÿÿÿÿÿÿÿÿÿÿÿ7©ÿÿÿÿÿÿÿÿÿ6€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€'ÿÿÿÿÿÿÿÿÿÿÿÿPÌÿÿÿÿÿÿÿÿÿR€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Fÿÿÿÿÿÿÿÿÿÿÿÿkðÿÿÿÿÿÿÿÿÿn€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€dÿÿÿÿÿÿÿÿÿÿÿÿƒÿÿÿÿÿÿÿÿÿÿ‰€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€]˜¢­±ƒÿÿÿÿÿùãÿÿÿÿÿ—7ÿÿÿÿÿÿÿÿÿÿ¥€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€óÿÿÿÿ‰¡ÿÿÿÿÿÜÍÿÿÿÿÿ«ZÿÿÿÿÿÿÿÿÿÿÁ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€…ÿÿÿÿÿöÀÿÿÿÿÿ½¹ÿÿÿÿÿ¿~ÿÿÿÿÿÿÿÿÿÿÝ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ðÿÿÿÿÿÿ€ÞÿÿÿÿÿŸ¥ÿÿÿÿÿÓ¡ÿÿÿÿÿÿÿÿÿÿø0\‰´F€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€wÿÿÿÿÿÿÿ²úÿÿÿÿÿ€‘ÿÿÿÿÿçÅÿÿÿÿÿÿÿÿÿÿÿTüÿÿÿÿú)€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ñÿÿÿÿÿÿÿßÿÿÿÿÿÿb}ÿÿÿÿÿúèÿÿÿÿÿÿÿÿÿÿÿ0×ÿÿÿÿÿÿn€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿþ 9ÿÿÿÿÿÿCiÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿL#ÿÿÿÿÿÿÿ¯€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€`ÿÿÿÿÿÿÿÿÿ:Xÿÿÿÿÿÿ%Uÿÿÿÿÿÿ#/ÿÿÿÿÿÿÿÿÿÿÿÿh_ÿÿÿÿÿÿÿæ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¨ÿÿÿÿÿÿÿÿÿ[vÿÿÿÿÿþ@ÿÿÿÿÿÿ7Sÿÿÿÿÿÿÿÿÿÿÿÿ„›ÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€íÿÿÿÿÿÿÿÿÿn•ÿÿÿÿÿè,ÿÿÿÿÿÿKwÿÿÿÿÿþåÿÿÿÿÿŸÓÿÿÿÿÿÿÿÿ'€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€4ÿÿÿÿÿÿÿÿÿÿ‚³ÿÿÿÿÿÉÿÿÿÿÿÿ_šÿÿÿÿÿäÀÿÿÿÿÿ»ùÿÿÿÿÿÿÿÿG€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€oÿÿÿÿÿÿÿÿÿÿ–Òÿÿÿÿÿªÿÿÿÿÿÿs¾ÿÿÿÿÿÀ¤ÿÿÿÿÿ×!ÿÿÿÿÿÿÿÿÿf€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ªÿÿÿÿÿÿÿÿÿÿªðÿÿÿÿÿŒðÿÿÿÿÿ‡áÿÿÿÿÿ›ˆÿÿÿÿÿóGÿÿÿÿÿÿÿÿÿ†€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€åÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÿmÜÿÿÿÿÿ›ûÿÿÿÿÿzlÿÿÿÿÿÿmÿÿÿÿÿÿÿÿÿ¦€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ ÿÿÿÿÿÿÿÿÿÿÿÑ-ÿÿÿÿÿÿOÈÿÿÿÿÿ¯ÿÿÿÿÿÿaPÿÿÿÿÿÿ*’ÿÿÿÿÿÿÿÿÿÅ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€\ÿÿÿÿÿÿÿÿÿÿÿåLÿÿÿÿÿÿ0³ÿÿÿÿÿÂ7ÿÿÿÿÿÿE4ÿÿÿÿÿÿF¸ÿÿÿÿÿÿÿÿÿå€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€—ÿÿÿÿÿÿÿÿÿÿÿøjÿÿÿÿÿÿŸÿÿÿÿÿÖSÿÿÿÿÿÿ(ÿÿÿÿÿÿbÝÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Òÿÿÿÿÿÿÿÿÿÿÿÿ ˆÿÿÿÿÿó‹ÿÿÿÿÿêpÿÿÿÿÿÿ ûÿÿÿÿÿ~üÿÿÿÿÿÿÿÿÿÿ%€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ýÿÿÿÿÿßÿÿÿÿÿÿ §ÿÿÿÿÿÕwÿÿÿÿÿüŒÿÿÿÿÿðáÿÿÿÿÿ™(ÿÿÿÿÿÿÿÿÿÿÿD€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Iÿÿÿÿÿÿÿÿÿÿÿÿ4Åÿÿÿÿÿ¶cÿÿÿÿÿÿ©ÿÿÿÿÿÓÅÿÿÿÿÿµNÿÿÿÿÿÿÿÿÿÿÿd€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€„ÿÿÿÿÿþ@ÿÿÿÿÿÿGäÿÿÿÿÿ˜Oÿÿÿÿÿÿ&Åÿÿÿÿÿ·©ÿÿÿÿÿÑtÿÿÿÿÿÿÿÿÿÿÿ„€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÀÿÿÿÿÿÕÿÿÿÿÿÿ[ýÿÿÿÿÿy:ÿÿÿÿÿÿ:âÿÿÿÿÿšŽÿÿÿÿÿí™ÿÿÿÿÿÿÿÿÿÿÿ¥€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€öÿÿÿÿÿ™ÿÿÿÿÿÿo!ÿÿÿÿÿÿZ&ÿÿÿÿÿÿNûÿÿÿÿÿ~rÿÿÿÿÿÿ ¿ÿÿÿÿÿÿÿÿÿÿÿÔ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€6ÿÿÿÿÿÿ^ðÿÿÿÿÿƒ?ÿÿÿÿÿÿ<ÿÿÿÿÿÿbÿÿÿÿÿÿaVÿÿÿÿÿÿ$åÿÿÿÿÿÿÿÿÿÿÿü €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€qÿÿÿÿÿÿ"Ûÿÿÿÿÿ–^ÿÿÿÿÿÿüÿÿÿÿÿv7ÿÿÿÿÿÿE:ÿÿÿÿÿÿ@þÿÿÿÿÿÓÿÿÿÿÿÿ8€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€­ÿÿÿÿÿçÇÿÿÿÿÿ©|ÿÿÿÿÿûêÿÿÿÿÿŠTÿÿÿÿÿÿ)ÿÿÿÿÿÿ\!ÿÿÿÿÿÿ…ÿÿÿÿÿÿi€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€èÿÿÿÿÿ«µÿÿÿÿÿ»›ÿÿÿÿÿàÖÿÿÿÿÿžpÿÿÿÿÿÿ ýÿÿÿÿÿx>ÿÿÿÿÿÿCôÿÿÿÿÿ›€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýüüüüûûúúùùÿÿÿÿÿÿ†((±ÿÿÿÿÿÔ(((ÄÿÿÿÿÿÌ(((((Ìÿÿÿÿÿ¾((((Ÿÿÿÿÿÿò((((ëÿÿÿÿÿ¥(((tÿÿÿÿÿÿFÏÿÿÿÿÿ磦ª­±³¶º½ÁÃÇÎæøù¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ˜˜˜·ÿÿÿÿÿÿ¦˜Ëÿÿÿÿÿþ›˜˜˜˜˜¾ÿÿÿÿÿÿ¡˜˜£ÿÿÿÿÿÿÀ˜˜˜˜½ÿÿÿÿÿÿ¥˜˜öÿÿÿÿÿÔ˜˜žéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸qqqrrsstttuuvvwwx{~<ÿÿÿÿÿÿ4©ÿÿÿÿÿÚIÿÿÿÿÿÿ*8ÿÿÿÿÿÿE@ÿÿÿÿÿÿ:þÿÿÿÿÿwMÈçäàÜØÔÐÌÈÄÀ¼¸´¯›xšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€*ÿÿÿÿÿÿFÓÿÿÿÿÿ°5ÿÿÿÿÿÿ>Tÿÿÿÿÿÿ)$ÿÿÿÿÿÿV"ÿÿÿÿÿÿZ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿWùÿÿÿÿÿ† ÿÿÿÿÿÿRqÿÿÿÿÿÿ ÿÿÿÿÿÿr?ÿÿÿÿÿÿ=€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿh&ÿÿÿÿÿÿ] ÿÿÿÿÿÿfÿÿÿÿÿðìÿÿÿÿÿŽ[ÿÿÿÿÿÿ!€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€÷ÿÿÿÿÿzPÿÿÿÿÿÿ3øÿÿÿÿÿz©ÿÿÿÿÿÓÑÿÿÿÿÿ©xÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€åÿÿÿÿÿ‹yÿÿÿÿÿþ äÿÿÿÿÿŽÆÿÿÿÿÿ·µÿÿÿÿÿÅ”ÿÿÿÿÿç€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ôÿÿÿÿÿœ£ÿÿÿÿÿàÐÿÿÿÿÿ¢âÿÿÿÿÿ›™ÿÿÿÿÿä±ÿÿÿÿÿÊ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ãÿÿÿÿÿ®Ìÿÿÿÿÿ¶¼ÿÿÿÿÿ¶üÿÿÿÿÿ~{ÿÿÿÿÿþ Íÿÿÿÿÿ­€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€±ÿÿÿÿÿÁõÿÿÿÿÿŒ§ÿÿÿÿÿÊÿÿÿÿÿÿbVÿÿÿÿÿÿ-êÿÿÿÿÿ‘€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ ÿÿÿÿÿïÿÿÿÿÿÿb“ÿÿÿÿÿÞ8ÿÿÿÿÿÿE1ÿÿÿÿÿÿZÿÿÿÿÿÿt€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ9ÿÿÿÿÿòTÿÿÿÿÿÿ) ÿÿÿÿÿÿšÿÿÿÿÿÿW€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€qÿÿÿÿÿÿÿÿÿÿÿÿkÿÿÿÿÿÿqÿÿÿÿÿÿ èÿÿÿÿÿÛÿÿÿÿÿÿ:€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€TÿÿÿÿÿÿÿÿÿÿÿåWÿÿÿÿÿÿÿÿÿÿÿðÃÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€7ÿÿÿÿÿÿÿÿÿÿÿ¼Cÿÿÿÿÿÿ.ªÿÿÿÿÿÔžÿÿÿÿÿÿÿÿÿÿÿý€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ/ÿÿÿÿÿÿBÆÿÿÿÿÿ·zÿÿÿÿÿÿÿÿÿÿÿä€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€úÿÿÿÿÿÿÿÿÿÿ^ÿÿÿÿÿÿVãÿÿÿÿÿ›UÿÿÿÿÿÿÿÿÿÿÿÇ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€àÿÿÿÿÿÿÿÿÿÿ.ÿÿÿÿÿÿmüÿÿÿÿÿ~0ÿÿÿÿÿÿÿÿÿÿÿª€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ãÿÿÿÿÿÿÿÿÿøòÿÿÿÿÿšÿÿÿÿÿÿb ÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¦ÿÿÿÿÿÿÿÿÿÍÞÿÿÿÿÿÊÿÿÿÿÿÿEçÿÿÿÿÿÿÿÿÿÿi€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€‰ÿÿÿÿÿÿÿÿÿÊÿÿÿÿÿ÷ÿÿÿÿÿÿ)ÂÿÿÿÿÿÿÿÿÿÿC€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€lÿÿÿÿÿÿÿÿÿk¶ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€3ÿÿÿÿÿÿÿÿÿ%¡ÿÿÿÿÿÿÿÿÿÿÿðyÿÿÿÿÿÿÿÿÿö€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€íÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÔTÿÿÿÿÿÿÿÿÿÓ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¬ÿÿÿÿÿÿÿyÿÿÿÿÿÿÿÿÿÿÿ·/ÿÿÿÿÿÿÿÿÿ­€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€hÿÿÿÿÿÿÿDeÿÿÿÿÿÿÿÿÿÿÿ› ÿÿÿÿÿÿÿÿÿˆ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€%ÿÿÿÿÿÿàQÿÿÿÿÿÿÿÿÿÿÿ~æÿÿÿÿÿÿÿÿb€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€·ÿÿÿÿö1=ÿÿÿÿÿÿÿÿÿÿÿbÁÿÿÿÿÿÿÿÿ=€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€LÔÿÿ])ÿÿÿÿÿÿÿÿÿÿÿFœÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€eƒÿÿÿÿÿÿÿÿÿÿÿ)yÿÿÿÿÿÿÿñ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ýÿÿÿÿÿÿÿÿÿÿ 4ÿÿÿÿÿÿÿÍ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ìÿÿÿÿÿÿÿÿÿðÒÿÿÿÿÿÿŽ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ØÿÿÿÿÿÿÿÿÿÔlÿÿÿÿÿÿ;€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Äÿÿÿÿÿÿÿÿÿ·%uÄýÿ·€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€°ÿÿÿÿÿÿÿÿÿ›I€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€œÿÿÿÿÿÿÿÿÿv€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€‡ÿÿÿÿÿÿÿÿÿP€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€sÿÿÿÿÿÿÿÿÿ+€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€_ÿÿÿÿÿÿÿÿý€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Iÿÿÿÿÿÿÿÿ߀ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€%ÿÿÿÿÿÿÿÿº€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿÿÿÿ”€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Þÿÿÿÿÿÿÿo€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ºÿÿÿÿÿÿÿ3€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€•ÿÿÿÿÿÿì€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Vÿÿÿÿÿÿª€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ óÿÿÿÿÿh€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¤ÿÿÿÿÿ(€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€>©–‡xe€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsonic-visualiser-3.0.3/icons/sv-splash.png0000644000000000000000000004645213111512442016710 0ustar 00000000000000‰PNG  IHDRHB m"TsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœíÝyXTeÿ?ð÷°Ë*²¨ˆ¢¸=®¸¥¹V¦f–¹f꣕šeiÚ¢•e«©i©™©™­_Í%-w-÷Ê%—TKAAPdîßüff9gæÌÂð~]—2çœû|†áͽœ£ @DDDD:nŽ.€ˆˆˆÈÙ0 éa@""""ÒÀDDDD¤ÇÃЃ¡¡¡èر£½k!"""²«“'O"33³ÒãRÇŽ±k×.›EDDDäHýúõÃîÝ»+=Î!6""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒãáèˆìM”jPœyÕÑeU9î¡p÷ñwtDvÁ€DÕNIn_läè2ˆªœˆIß ¸×SŽ.ƒÈ.8ÄFDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆôx8º¢ª¦éÒËp÷ rtDIž‹Â«ç]‘Óc@"’ÉÝ7î~5]†SÉÈÈÀÌ™31oÞ<;º2ÅÍÝÑU b#"«”””`ذaX¹r%Ú·o¿þúËÑ%Y‰ˆ¬2mÚ4þúõë Vó?ééé8zô¨äýãããmR¹$"’ÄšÞ#ÈÎÎFAABÕüÏï¿ÿ.kÿ´´4Åk "×ÀDD’X3ÿH+==]J*:tè¬ýSSS¯ˆ\I⬉=HDd HD$‰3¤œœœ;wNö1·oßV´"r= HDd–Z­Æµk׬nGé€tîÜ9”––Ê>޽HDd™¥Ô5Œ”YåYZ×Õ«W­ƒˆ\™¥Ô5Œ”îA²4 q¢6™Ã€DDf]ºtI‘vˆ¨ª`@""³\- qˆˆÌa@""³œqˆ-??W®\±èXö ‘9 HDd–R=H™™™(..V¤­ÿýB‹Že™Ã€DD&ݺu YYYŠ´%„PìžlÖ¬¬c™Ã€DD&)Õ{¤¥Ô0›5);;ùùùŠÔAD®‰‰ˆLrÅ€p˜ˆLc@""“”š ­¥ÔÅ"­ Hf#"SˆÈ$gìA*))Abb¢Um0 ‘) HDd’3¤‹/Z½ŽClDd ™¤t@R«ÕV·¡Ä½á؃DD¦0 ‘QEEE’ƒDݺu%í—™™iMIˆÈöˆÈ¨ääd”––JÚ÷Þ{ï•´ŸéòåËV·Á!6"2ÅÃÑ‘åvìØ¯¾ú ………(((€F£Aaa! „_ýžžž·/g[—.]ðóÏ?›ÝO‰€”œœluìA""Sˆª¨ÒÒR¼òÊ+øçŸŒî³|ùrLž<ÙâsH„æÍ›KÚ÷Ö­[Ðh4pww·¸.%z²²²ŸŸ___«Û""×Ã!6¢*jýúõ&üÿþûÈÍ͵øRRãÆ&i_!nÞ¼iqM¥¥¥HII±øøòØ‹DDÆ0 UAB|ðÁf÷ËÌÌÄœ9s,>œ€*¹]k†ÙÒÒÒPTTdññå1 ‘1 HDUÐÆ‘ ißE‹Y|í!g HJÌ?Ò²u@BàÒ¥KŠÝì—ˆì‡sˆª©½GZصkž~úiÙç‘F7nŒàà`¸¹¹IZõ–‘‘!«–ò”˜¤¥äJ¶ôôtÄÅÅáܹsº„„ܹs5®]»Ð¬Y3ÅÎGD¶Å€DTÅlÞ¼gÏž•uÌéÓ§eŸ'==wïÞ•´oãÆáææ†ZµjIêr¥¤ììl´nÝÚä=æ’““Ñ£G?~QQQVŸ“ˆlClDUÌ’%KdsæÌÙÇȹ‚vãÆ@ò0›+¤yóæIºoFF¶nÝjõùˆÈ>ˆª¼¼<üþûﲓÛãHH^^^ˆŒŒPõ’µCløì³Ï$ïàÀ«ÎGDöÀDT…ìÝ»×¢›´fggË^/õ"‘5‚›[Ù[‰=’’s¬íAÚ·oŸäaHØ¿?„V“ˆìƒ‰¨ Ù¹s§ÅÇÊf“Ú»¢í=lŠ‹‹]yvóæMYGßÁƒeퟕ•eÑ|0"²?$¢*ÄRýúõuÿ·u@JII‘|o8©¬ \r=zÔâó‘ý0 UñññVÍ™‘;wGjp°$ YºÌ_ÉùGZ–¤ŒŒ œ?^öq/^´è|Dd_ HDU„5½GdßÞÃ{¤Î?ªQ£¼½½%íki@úý÷ß-šO¤ä*"²$¢*b×®]V/§×F{#W),™ƒtçÎH®GKjRÆ +ÔeŠ¥½r‡¶è8$¢ª‰¨ ¸}û¶EËûË“Ók#§WÅ’$¹õhI H5’,íAú÷ß-:މ¨j`@"ª:dõ Zå9½*Õ5 ]¸pÁ¢ã²²²——gѱDd? HDU€µ½G@Ùµ4¤}¥¤€€é>·u@’Úû]!¸™bÉ[II‰äëDÂ^$"çÇ€DT(„’'j[2A‚‚‚àéé)éX¹éîÝ»¸~ýº¤}m݃”””„’’ÙÇi1 9?$"'WPP€ãÇ+Ò–ÔP"54 !¶Zê/'TÈ H™™™²'Œ[:¼¦Å€DäüˆœÜ_ýeõü#-©ÉÒ$ÀvKýå …É H€ü^$K'hk1 9?$"'§Äðš–Ô^›ªüýý$y ? ±‰Èõ1 99%’ÒClÎ"""aaaðòò’t éc@"rbÆâ "%”È™“cÍ$[$mhS©T¨W¯ž¢mkY;Äf‹[¦‘²ˆœØ™3g½fŽ”!6K¯¤åè€Ô AÝÿm±’-//ééé’÷7$;;¹¹¹VµAD¶Å€DäÄþøãEÛ“J,½Š¶–­V±Y2/Jê<$9ÏÙÚá5-³97$"'¦äü#@Z@’DjÖ¬ ÿJK Hö¸y®-îÇÆ€DT=0 91¥’’ClÆzg¤¤¢¢"ÉÃLÙÙÙ¸sçŽìºl1ÄÆ€DT=0 9©ÄÄD¨ÕjIû6kÖLÒ~J± ¶¸Ýˆ¥ó¢¤±edd °°PÒ¾ÖNÐÖb@"rn HDNJNïÑ Aƒ$í§ä›µ=HRë‘S`Y =²‰¨z`@"rRRRÍš5qÿý÷KÚ7??ùùù&÷©Ê)((ºÏˆÈR HDNJj@êÞ½;ÂÃÃ%·k*”!––&©cÉ××5jÔ°º–òRRR,ª©víÚ’ož+% ¥§§+vÙ$"çÆ€Dä„ÒÓÓqéÒ%IûÆÆÆ",,LrÛ¦B‰œ¹8¦æ÷(½ÔßÒ^-¥/©TïÀk!9;$"'$çúG±±±²†µL…9s}L _)}±Hk†ý”\ɦd@Ø‹Dä̈œÔá5têÔ >>>ðóó“tŒ©PbíU´µ¤öh9S@’r¥V°iÅÇÇ+Ú)‡‰È I H;wÖÝU‰P"u¢rHHˆÉyFJö É™Uþ6#ZÎ܃tòäIEÛ#"å0 9™œœœ={VÒ¾±±±ºÿ+1ïÇÚlrk‘nܸaÕ¼(%o7¢t‘ób@"r2‡Fii©¤}- HJ ±™ë•Q2 Y;ì'µÉÜu!„ä9CR{óN:!„¤}‰È¾ˆœŒÔá5wwwtëÖM÷¹=‡ØìÙƒdíÄq©ÉÜPžZ­FQQ‘¤¶,i¿ÜÜ\\¼xQÒ¾Dd_ HDNFj@Љ‰©pQD{ö )²²²Ìö–I­),, >>>•Wêb‘r‚Úã?.y_³9'$"'RXXˆãÇKÚ·üð /”¢ÄE"åÖRZZj´-kC[:uàáá!© Sç’Z‡J¥Âý÷ßÀÀ@Iû3 9'$"'ò×_Iž¬‚ƒƒ%g,¨ÕjKjC©€˜f³6 ¹¹¹!""BRJô Õ®]ÞÞÞhß¾½¤ýˆœ“´?«ˆHgòäQäæ•JUé€ÁÇ¥~üý÷ß’ëèÑ£G…ÏkÕª%é8cI©‹D΀²z¥Ü®ÄT@’{»“N:áàÁƒf÷×NÔÖ¾~ÊB ¤¤DÒ‡F£Ñý???éééHKKCfff…aÌñ’ž1 Éôÿ·yÒ:Zl¦IƒzðMÿyéÿ{Ì'KÚ­IîÞ½‹Œc[àãíUáñ ‡þ”|þ ›ñÈËK4ºÝ»¸Dr[WÿŠ<ÿÛF·_¹$íÚCáîùÈ;½Ëà¶:þÒÞê’Î0ÚFRœ´¡Ï:žÈ;½ -C¤3''¡µjB”–¢DSŠ%%”h46Yá6þåÖŠ·I䊈ª ¶îiHùèá fK?>þÃÓ»Îã9ãy§‚ZÞ€zÁ@³ûùyw$ä¤ «?@ÊÃÛ4H¿!­.Ÿ£_#åÚ×·\–ÖÆå3G+}]µ’$Ž„]=Œ”Fm÷´Íºe¿{²‰â»‹¨*ã$¢*¨£¬@i7­äX­žb¼§‚:¾Òö ö–¶ß-+ç3î¥;QLÕUÛøE¿+Pçßvý®´6êþÿ:¢ü_þ JTe1 UA ¤ ¯Êc( ]”؉QWb@ª)1 e™˜“.5”¦ë’ênÅ®:PRZÖ¤¨óÿØJt¯-í"r> HDUL˜Pß¿òãž@åi¾† H—r¤`~–Øn™ H&ztÊS¡ìëbL‰=H 6„nܤÎ*ÆþÛLúy‰È¹0 U1†z€²‹‰¡D? å•õžHÑ$HÚ~R‡Ø²Mœ7]b@ «x˜x7«-± 0<Ì&§'«|@ê ´’võ"r2 HDULGw‘:Ì–«· ï¢ÄÞ#h,íú‡’‡Ø²MÌA’Úƒd®‡(Ôp“ؽf( I­Ã]U¹'k {‘ˆª$$¢*ÆX = é÷ Iä¦Ib«%u’¶sÌÍ12\ŒžÓ@’Ó“¥ÄúFM%öº‘óà ¢*$ÐϾÿÜÜ ÿmS;å=œ;vÚl;šýPÿÕ‰ºÏo,X œÚaö¸†‘uÑdÆ’jÞüg~ßÔ@ýW×Ü–5öUæ¯ïÔ4ö1ÔŸú´É}œêsÿšm+ÿ?ýQÿÕ »³`%gþëÕä?¨ÿêœJÿ:1C§}€“ñ¯¥`C*O‰É•¨šc@"’iàãQ/!*|°ø1Sû–×®];Ô¼×øâã×ÒmÏ vþß Uo.‘ôÜÛvìRá8Sê_ó)ïÎ]ø´ë/¯ÊÝ_ײŸ“t®&ï7[WÃkp\B@R{Ujëzá7’êˆnÕÞ`ŒáÇcÇóAK *• µk×Fdd$üüüþ·Áí–]ÎOTÕ1 Éôí7ßÂݯ¦£Ë0ÈÒÛÄÇÇK:®U«V’k‘{»ýû¥áÆ iW‰4wo8ÀüíQ´ ÝnD‰ÛøùùaË–-¸pá®^½Š”””––ÂÃÃîîî&ÿ•²þ¾µjÕ2:/¾ÖNÒs!ªîˆ\ˆ%7¬ÍÊÊ‚Z­–t\Ë–-%×bm@JMM•|«ªÀÝÝ-Z´@‹-$µGDŽÃIÚD.DjRvöÿîK"µ÷°m’>97Ï•¤ìjµÅÅÿ[æw÷î]³7Ô•{"r~ HD.Ä’!6©ÉÝÝÍ›7—U‹±Éäú¬ Hžžž¨S§ŽÙý¤ö !––¦ûÜP’1 HD®ƒ‰È…H H999Ðh4€„„IÇDGGÃÇGâZynnn’‡ü¬ H‘‘‘P©Ì_äHj@*†¢””ÉÇ1 ¹$""5!pëVÙj&[LÐÖ’:ÌfM@’JêÖ­ wwwIû–?·Ô:|||fâ*žDT¥0 ¹©=HÀÿ†Ùœ! eddTzLé€äáá!i(¨Øƒ¤tDT50 ¹9);;[Ö ¶ªÞƒX¶’‰¨zb@"r!R‡Ø€²$9+Øä,ñ×b@"¢ªŠ×A"r!ÞÞÞðõõE~¾ù›‡eeeáòåË’ÚuwwÇþóÙõXîܹSéb–ÆØ" ]¹rE÷©“´ˆ\ {ˆ\Œœ¥þRW°5nÜÞÞòïáei@²ÕÒz©û&''ëþÏ$¢ê‰‰ÈÅȹš¶Ô!6K†×Ë’Ò‰ÔŠŽŽ–´_VVrrr““ƒ¼¼<Åë "çÇ!6"#§É–+ØH^ö^PP€;wîènª*uXË××!!!’ëiÔ¨‘ä}“““áá!ý-’‰Èµ0 ¹©éâÅ‹6]ÁÈ»ÝHFF†. ɹH¤R{€²€$ç˜ 4U 97±¹©Cl”ܦ=Rùa6[Íû ” “’’$÷d"00PV-Dä܈\ŒÔ^•Û·oKÚOî=ØÊs¶€HïEJNNæm¢jŒ‰ÈÅ(ýËÚÒlOOOIûZ,Ö’:)))‰‰¨c@"r1Jÿ²¶txMKê$jí½áÛö I HìA"ªÞ8I›ÈÅ(=YØÒ%þZ¡¡¡¸~ýºÙý´†¼uë–äá?[±]¾|EEE6«ƒˆœ{ˆ\Œ³õ I]꯽a­­®¤%µ©   Â#•®ƒˆœ‘‹ñ÷÷GÍš5k¯uëÖV/5 ݸq€í’œ¥þBIûq‰?‘ëa@"rAJõhøøø E‹Vµa«¤   È®§AƒpsSö­=HD®‡‰È)õ »uëÖ²®&mHxx¸¤ýäö Yú½¼¼P¯^=‹Ž5Fî+‰Èù1 ¹ ¥Rûöí­nÃV=HÖ HD.Êš!²Î;£V­ZŠÕbípŸ>%’µ·P8¼Fäʈ\”5=@>ú¨‚•È[ê/…ÉÚ›ð^#re HD.ªcÇŽ«t@rÆ$%{ˆ\‘‹ ³èZAQQQŠ\ R¿%)Z¶l 77ëÞÙƒD予\X·nÝd£tïàœCl¾¾¾V_0’‰Èu1 ¹°Ñ£GË>ÆÉ{ë‡Ù8ÄF予\X¿~ýP¯^=Éûûûû£W¯^Š×¡d@rss“õœL±& Õ¨Qƒ÷a#ra HD.ÌÝÝO?ý´äý'L˜///ÅëP2 Õ­[Š´eM@Rb9/þt¹¸qãÆIº/[¯^½ðñÇÛ¤†Å„RÃkЦM‹Ub9/$"×°aClܸÍ›77ºOTT6lØ XÏŒ>9÷c3GÉ€Ô¬Y3‹{̈\Q50hÐ œ;w_~ù%"""*l«Q£~þùg„††Ú´¥†Ù” H&ƒ£) HD®‰¨šðððÀ„ ˜˜ˆÙ³g#00ðÕW_Yu[©”Zê¯d@,: HD®‰¨šñõõÅ›o¾‰K—.aíÚµ9r¤]ÎëŒ=H€e÷¬ Bdd¤¢u‘sa@"ª¦BCCñÄOØí|Îúöí+ûö¹>$"² g HmÛ¶•}K–:(Z9$"² %æ yzz¢N: TSÑ€dí?tèPÅk "ç€DDv¡DR½zõ$]ÓI®ʪ!66VñˆÈ¹0 ‘](ä…IÕ§OɽBO<ñ„MB9Û\ŽˆHClJÏ?*ï‹/¾@›6mpòäIœ8q×®]«´OóæÍ1iÒ$›Õ@D΃‰ˆìB‰$[¤°°0Ìš5K÷ùõë×qâÄ ]`jÙ²%Þ{ï=øøøØ¬"r HDdÚû±•––ZÜF½zõ¬È´:uê`À€²'p‘kà$"² 777ÔªU˪66l¨L1DDf0 ‘ÝX;©Y³f UBDdÙ5ó<<<ШQ#«!"2މˆìÆš€Ô¨Q#xzz*X ‘q HDd7Ö ±qxˆì‰‰ˆìÆš$$"²'$"²k®cÄ€DDöÄ€DDvÓ¤I‹e@""{b@""»iÚ´©ÅÇ2 ‘=1 ‘ÝDDDÀÏÏOöq¾¾¾v½Š6Ù•%ÃlM›6…J¥²A5DD†1 ‘]Y2ÌÖ¼ysTBDdÙ•%©[·n6¨„ˆÈ8$"²+KÒC=dƒJˆˆŒc@""»’êÕ«‡–-[Ú¨""ÈȮš7o.kÂ5{ˆÈˆÈ®ÂÂÂ+y$"r$"²»'Ÿ|RÒ~*• ½{÷¶q5DD•1 ‘Ý 6 žžžf÷kݺ5ÂÃÃíPQE HDdw!!!èׯŸÙýØ{DDŽÂ€DD1zôh“ÛýýýÑ·o_;UCDT‘‡£ ¢êé±ÇÃòåËQ³fM£fÍš Bpp0‚ƒƒ% ÁÙ 9„&Nœèè2ˆˆ â‘$""""= HDDDDzˆˆˆˆôp’6‘L©Ÿ‚Ê+¬¨j*¾‘ì航$"™nÿ½ÃÑ%‘qˆˆˆˆH‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆôx8º"{sóñGØÐw]Q•ãÓ°£K ²$ªvÜ}ü>ü]G—ADDNŒClDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""=Ž.À˜›7o⯿þÂÕ«W‘ššŠŒŒ !ìvþ`À€F· !€S§N!99¹¹¹¸s玢5z{{#00ááሉ‰AÇŽáççgtÿÉ“'£¸¸¸Òã¨U«ÂÃÃÑ«W/´nÝZ±`Íš58tèP¥Çûõë‡Ç¹¹¹˜>}ºÁcß{ï=Ô®]Ûà¶øøxœ?©©©¸zõ*îܹ£hÝR,_¾Üªã¿ùæ;vÌà¶ûï¿O<ñ„UíKñÅ_àìÙ³· 8………صkW¥m­ZµÂäÉ“ wûöm>|X÷½Q«Õ(--U´nSºv튱cÇ’““1oÞ<ƒû}þùçðð°íÛœ±×»víðÜsÏYÜnJJ þüóOœ8qÂèk¿^½zèÞ½;ºvíŠ5jÈ>Ç… ðé§ŸÜf¯13gÎÄÍ›7+=>vìXtíÚÕà1ÉÉÉ8sæ RSS‘ššŠœœ¹œ°Ï IDAT»þΘ2e Z¶lip[zz:Nž<©ûyÉÊʲkmÏ?ÿ¬_¿Þnç-ÏËË ‘‘‘¨_¿>š6mŠN:9¤¹„þGß¾}…£¨ÕjñÚk¯ ??¿JuÙóãwÞ1X_QQ‘X¸p¡hÚ´©ÝkòóóãÆW®\1X›···¤vZ´h!vîÜ©Ø÷lâĉÏ3cÆ !„éééFk9þ|¥öþøãѧO‡~ÿµÖ:uê”pss3ØvPP¸qã†Õç0åܹsÂÝÝÝàù…Z­3fÌ0¸ÝÐû@nn®˜={¶ qè÷eìØ±ºšŽ9bt¿»wïÚôë+„ñ×ÿÀ-ns÷îÝÂÃÃCò×£uëÖB­VË>Ïþýûúµ3&**Ê`Mß|óM¥}ÄÈ‘#þœÙëÃÐ{jJJŠxþùç%¿7ÛêãçŸB±páB‡ÖQþ£{÷îbß¾}¶~)IÒ·o_ƒ5:Õ[NNºvíŠùóç;¤·Àœ´´4têÔ Ó¦MCbb¢ÝÏçάZµ ­ZµÂO?ýdq;çÏŸÇÃ?ŒgŸ}FÁ ­·uëVôèÑ¿þú«£KQDûöíñôÓOÜ–““ƒwÞyǦçŸ6mšÑïñÌ™3.¹­ââbôéÓÇè_÷¤ŒK—.aøðá())‘|̹sçЫW/ܾ}Û†•9Ÿ¸¸8tèÐkÖ¬±k¦×®]CÇŽ±lÙ2:º§óçŸâÀ/¿üâèRŒrª€4aÂ$%%9º ƒ ððê°§Û·ocäÈ‘8xð Uí¬\¹C† qšÞÔÔT<õÔSŽ.Cq³gÏF@@€Ám_~ù%lrÞmÛ¶á·ß~3¸-::S§N•ÕÞÌ™3qôèQ%J#^~ùeäääÈ>îüùó˜3gŽ *rNùùù>|8 ]J%¥¥¥5j222]ŠÓ?~<ÒÓÓ]†AN233±aÃG—aÔ¢E‹çè2tŠ‹‹1eÊ«ÿjÚ¼y3ÆŽk×ñpcÖ­[‡¬¬,G—¡¸ÚµkcæÌ™·i4¼òÊ+ŠŸ³¸¸Ød» ,€———äö„VÏÇ"óöîÝ‹-[¶X|ü§Ÿ~Š+W®(X‘óÚ¿?þùçG—aÐùóçqàÀG—Q%ܼy?ÿü³£Ë0ÈiÒ™3g]‚IË–-st •œ={‡¶ºuëÖáÍ7ßT "ëœ>}ÚÑ%ØÌÔ©SmpÛ®]»°{÷nEÏ÷ùçŸãÂ… ·õêÕ ƒ ’Õ^RRòòò”(ŒÐh4˜6mšUm]ájœùý™ksFçÎst 9Í*¶øøxƒ«T*LŸ>111P©Tv«§üJ¯¤¤$¤¤¤ÜÏÛÛݺuC×®]ѪU+¸¹)—9ÓÓÓqôèQ:tׯ_7¸Ïo¿ý†=z˜lç£>Âßÿ]»vý%7wî\DGGc„ V×m)c¯ˆˆL›6 ‘‘‘v®H9ÞÞÞ˜?>† bpû+¯¼‚Þ½{ÃÝÝÝêseffâý÷ß7¸ÍÍÍ .”ݦ±ï P64~ß}÷ÙuÅS£Fìv.{Y¹r¥Ñ^ꘘ<ÿüó \¼xsæÌA~~~¥}ׯ_)S¦ {÷î6­×ÑŒ½&kÕª…éÓ§#**Ê®õ´k×N÷S¿Ï^{í5´oßÞ^eî¹ç“Û£¢¢0wî\›ÖpçÎüßÿýŸÁžµóçÏÛôÜ–rš€dè(›äjëoœ9¦º¬gÍšeóÞ—Ë—/£Y³f—ð_½zÕìñO>ù$Þxã ¤¥¥aÈ!F—Oš4 4@ß¾}­®ÙÆ^&LÀ«¯¾jçj”7xð`ôêÕËàD|| ì² åý÷ßG=0wî\—™€¼gÏlݺÕà¶Ç{ ÷ß¿Ù6Þÿ}¬Y³Æà¼³ `„ ¨_¿¾Õµ:S¯ÉŒŒ »\ƒè­·ÞÂSO=…?üÐh/yyyyY±]TTdrûÍ›7±bÅ ;USYÛ¶mvnSœfˆ­sçÎŽ.@ÙÅõúõëW-®ܾ}{üøãFÐÎ;ñ /عªêᥗ^BãÆ nÛ°aþüóOYí-Y²ÄèÐBÏž=®ž“ªeË–NÑ›øÇ ÿþ¸xñ¢£K±š©eýžžž˜?¾¤vBBBŒ^‘ýîÝ»Ÿ°l+Îð;£°°+V¬Àˆ#œîJÞUEûöí­~²§ Hááá]b^^jj*ž}öYG—a 0¹ì{ÅŠøøãíXQõàåå… Ý>mÚ4Éï´Å²~Cí¼ñÆV·£„ÜÜ\»Üä×Ö¾üòK£=oÏ?ÿ<š5k&¹­^xÍ›77¸íÇÄ‘#G,ªÑ™õéÓÇ)BPvÏO>ùÄÑeT9þþþøþûïvb½Ó$Xºt©ÑVö¶sçN§»O™­Lž<Ùäj¼×_Ý©¯r^U=þøãxà n;~ü8V¯^-©·ß~ÛèjƧžzJ±k®¼ùæ›?~¼"mYëÔ©SN{{)nݺ…Y³fÜ,û}žžž&AË ÜU…6oÞŒ¦M›:ºe£$——¦L™‚K—.U¸æ ³qš9H@ÙùöíÛqäÈ,Y²‡FzzºÙñS[¸{÷..\¸`rœÛ•,\¸IIIÈ…3f êÕ«‡nݺ9 :×µpáBtèÐÁ`ã70dÈÔ¨QÃèñqqqX¹r¥ÁmV¯ŠÓ·råJ¼ôÒKX²d öìÙƒôôt‡]ÃäôéÓ¨[·®CÎm-SËúƒ‚‚0iÒ$‹Úõöö6¸ê÷رcX½z5FmQ»ÎªN:8þ<¶lÙ‚åË—#..7nÜpÈ·Î~7SüüüЩS'‹Žý矠V«nðÁ1`Àx{{£~ýúhذ!5j???K˵§ HZ]»vE×®]”ýr¾yó&nÞ¼©ø_@üñ‡ÑÙû/^¬6ÉÍÍ k×®Ell,þþûïJÛ 0pà@9rMš4q@…®©mÛ¶?~¼Á ’©©©X°`Ñ ¦—õ¿ù曨S§ŽbµjµnݺB½ÙÙÙÈÈÈP|†ñññ5j”Á?’ªê<¤ .àóÏ?7ºýòå˸|ù²âç}ã70xð`øúú*Þ¶#¹»»cРAºÛçh4¨Õjäåå)þ;ãîÝ»øî»ï°xñâJÛrrr‘‘aðšUZ=zô0ú-Õ«WÏäö&MšX|︤¤$ôìÙ©©©·ðóóÓ-ÿ7ôbÏÌÌDÿþýqäÈ„„„(vÞêîƒ>ÀÚµk ¾çÍ›‡ñãÇì)Ù²e öîÝk°ÍFY}_/©‚ƒƒl“¶[´h?üÐà_çUuÜÔ²~[JMMÅüùóeßU5îîî6Yâ¯U£F ƒ 0ÿšôóóÃþó[”å0ÑÑÑØ»w/zöìið–X%%%9r$T¹äTsœU@@€ÁÇsssþ‚RRqq±Ññm¥ÿŒˆˆÀ¶mÛŒ®XJLLDïÞ½%ÝâD)®¾:$,,Ìè|”;wMQQ‘ÉÛ¯|üñÇV-ë'Ûøí·ß:Wåã?6ú—¾>W›³ä \õ½¬Y³fØ»w¯ÑÞ3mH’{ùG«öéĉ¯@w¶ððp£ÇO›6 ëׯ·I`¸}û6öïß_|III÷©U«–â牉ÁºuëŒ.ÿ?}ú4î¹ç,[¶LÑçmì‚xÛ·o7zVW1yòd£“M¿ýö[,Y²DwE÷¼¼<<õÔSF—õÇÆÆbèС6«Õž’““Þ Qûz1u!Å_ýÕ¦¿è³³³qêÔ)ƒÛôë2µ¬ß^òóó+¬F4õµÛ°aƒËþB·”F£Á¡C‡Œn7÷š>>(((¨´O\\œnÉq@@€É7¹nß¾m¶ËöÞ{ïUì|åõïß‹/Æ‹/¾hp»Z­Æ¤I“0iÒ$£÷ב«qãÆïê¼oß>„‡‡;ä:<.\0•¢]…ôØcÜ>eÊ̘1^^^ÈÏÏ7:Dãææ†E‹٤ƹsçÚõÆÑB“÷¦Óþ|»ž 8¾¾¾6[Fœ››k4€iëÓZ±b…Ñ»¼{xx(~AÖââbƒgõêÕ˜Óö {Mæææ¢yóæ ²Y†,\¸O?ý´Íσݻw£wïÞF§­Œ5 ªÄ¥:œ* åçç˺ùª-yyyé&hûøø _¿~øå—_L“——gÒt|}}ѯ_?›µÿ / 11Ñèx»–R« Û¶mktøA£Ñ8äµaÏ¿ }ôQôîÝÛèåøïÞ½kvÅØØ±cÑ¡C[”‡‚‚§ùù »-PHH"""píÚ5ƒû»³º­•¿m‘©eý*• Gޱx‘1Ÿ~ú©Á«« !0uêT>| 4@pp0²³³ ¶aï¯Ü÷’ÜÜ\§yM¶iÓF7'ÔÜ•¡í]³=ïgÚ©S'ìܹ}úô1Ø¡ IBŒ1ÂnuY¢Ú±Ó½{÷ 9}ôÑGNw1«W_}Õæ“¥?ýôS» ×»&Pubêæ£æøûûã£>R¸"稨(Ýç>ø «©ÌÓÓ=zôÐ}þÞ{ï½:ÿèÑ£G€éaÛ#GŽàÇôêÕKñsWGåo Ó®];›L¨*ºvíŠíÛ·#«Ñh0zôh¬]»ÖΕÉÀd@PPV­ZUá±-Zà믿Vü†¹–zôÑGM.ÿVŠ››Ö¬YƒÚü\>ø Ío˜èìZ·nmñ×`æÌ™6YÖïl<==+ Å/\¸ÐìRf{š;w®n˜åßÿÅÒ¥K îçëëk³Pkî⑯¿þ:îÞ½‹/¾øÂ.ÃÈ®¬mÛ¶zðõ×_;°"Ç»ï¾û°yóføøøÜ® IÚ îŒô4iÒ6l0x7õÑ£Gcß¾}]¦éëë‹Ù³gcÓ¦Mðð°Ï©§§'~úé'Ì›7Ïæ×PY¸p!ÆŽk·çæŒæÏŸŽ;Ê:f̘1o~ëjêÖ­‹ï¾û]ºt©ðxHH6mÚä;¥—W£F ̘1/¿ü²î1SËú_}õUDFFÚ¬í°­!)))X°`êÔ©ƒM›6¹ü ºm%66?ýôS¥ 0pà@,Z´¨Z÷$õîÝ7n4:OU£Ñà¿ÿý¯]çËQ} ¡¬w¤víÚˆŒŒDýúõ1hÐ <ùä“&‡8zõê…„„ìÛ·¿üò N:…äädäææâÎ;ŠÖçåå…ÀÀ@„‡‡#&&={öÄ“O>‰ÀÀ@EÏ#…‡‡¦OŸŽ1cÆà§Ÿ~ÂÖ­[‘””¤» ›R|||ðí·ßâwÞÁÒ¥K‘€+W®àÊ•+Š}U5°yófÌž=GŽA\\œÁÉú~~~èÒ¥ z÷î3f(º@ÀY„……¡~ýúˆŒŒÄC=„ñãÇý‹´sçÎøû￱}ûv¬[·—/_Æ•+W––f³k&!22‘‘‘èС^zé%Ô®][·ý×_ÅöíÛ a—P»páB´k×Îà×`Þ¼y7nºw¸8lܸëÖ­ÃÕ«W‘ššŠëׯWÙëMÙ‚§§'"""P¿~}DEEaܸq†Öô½ôÒK7nV¬X?ÿü)))¸råŠÑ«¨»¢þýûcݺu6l˜n%nycÆŒYôíA ÒŒ¾}ûb×®](‡ˆˆˆÈ~úõë‡Ý»wWzÜõþä$"""²‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆHOµ¼ÕHii)®_¿ŽŒŒ QéBâ:*• !!!ˆˆˆ¨p‡øøxÃÇÇGò}Ù4 âââ5kÖDÆ ÅÅÅHKKCNNŽÉZôEFF"44pûöm¤¦¦¢  @òñ@ÙQÏŸ?F•J…úõëKºoPJJ ²²²111Foà{çÎ$&&ÜÝÝ&ëfª%%%HIIAnn.€²@jojhßÄÄDêöŽŽ6Z[bb¢ì[—¸¹¹éžCff&ÒÒÒ”ÝnÂнû´„8{ö¬îûÛ¢E x{{ÜW­V#==@Ù}ýýý%ÕVþ{ÒªU+$&&¢¨¨*•  3ÛFZZ222”½6´_O///„……I~¾úΜ9SṫT*¤¥¥!77WÖk¾AƒÈËËCvv¶äc€²ŸãZµj!""¢Âm„4 ÒÓÓqóæMYu„……¡nݺ8{ö,€ÿ}=Ê?O¹QPP€¢¢"@ãÆ`tÿÌÌL¤¦¦êŽŽŽ6{Fƒ´´4dgg›}ß G:u*ýü! V«qãÆ ”––Jyj€Úµk£nݺF·'$$ ¨¨ÞÞÞhÑ¢…äv ¹}û6®^½ª{/0ÆÛÛõëׯð3–‘‘¡{ûúú¢qãÆ&o=EEEHHHPö<===uß©ÜÜÜP§N£7 Öh4¸ví²²²,úÞ>}Z·½aÆ 2[Srr2rrràîîŽ6mÚÈz>®DèôíÛW¸¢¢¢"1}útáïï_é9›úðññ“'OwîÜB.ˆ-ZH>wVV–®½Aƒ !„X¹r¥–U‹öcéÒ¥¢¸¸XŒ=Z¸¹¹YÔFzzº ¬ðX£FÄž={L>—1cÆèö/,,4ºßï¿ÿ^éœ÷ß¿¸~ýºÙ¯×š5kDíÚµ+Û»woƒûÞºuK4mÚ´Ò¹zõêe´¾{î¹Ç¢¯ѪU+ñûï¿‹ ÂÛÛ[?~Üès™={¶îØ¡C‡š|Þï¿ÿ¾nß½{÷šý:i9Rw\ZZš®6íGdd¤Ø¼y³É6¦L™¢Û_­V‹†  "**J$&& ///@ µZ-©®üQ×f‡ÄgŸ}Vé5'õã›o¾Ç·øûÖ AqðàA!„[·nõêÕ³¨I“&‰Û·oë>ä‘G„Â⺀²÷Ü•+WVx­—””üšÞºuK4kÖLîîîf_'999bâĉºïŸÔ   ñöÛo F#„âøñã¢yóæ=¿éÓ§›¬Qû½hÒ¤‰¤×•!‡;v”][‡Ä„B,\¸°Â61vìXÝ{¿!ÉÉɺý_ýu±xñb‹_¡¡¡bþüùº¶óòòÄóÏ?/¼½½eµ(fΜ)JJJ„F£©´½yóæâÈ‘#&¿ž>ú¨ |}}-þžT}ûö5öµ4üÃêŠfÍšeÕ›ØÄ‰…ʤk×® ‹kYºt©X±b…UÏÇP@ÊÞt¿ûî;£ÏÅš€@ôìÙS”––=îÈ‘#CŸ±€4uêT£Ï±ü›MyÖ$m-ÿý·ðõõ@Ù/ߌŒŒJçÙ±c‡î¹´nÝZäåå}ÞBØ. *•J,Y²Äh¦’B¼ú꫺íÏ>û¬Ùšòóó+Ô±nÝ:‹Ã<`}@ 7n,4ض HBñâ‹/ê›1cF¥¯iii©0`€nŸO?ýÔì÷áé§Ÿ¶ª¶Ù³g !„hß¾½ÅmØ: ]»vMÔ¬YÓâúÅåË—+$íG‡DNNŽÁs+´+W®B1a«Úyï½÷ $ÂËËKüüóÏF¿¦ HÕjˆíÇPÖÍ8iÒ$´jÕÊèŒVbb">ûì3”””`íÚµX¾|¹"µÄÅÅéîlÜ¢E L™2EÖñ±±±X²d‰îó‘#G"66VVºÿ7kÖ ={öĪU« Ñh0~üxÔ«W>ø ¬64h> µZƒbãÆ:t¨Á}§Nªë¾6l~ûí7ܺuËà¾ÿþû/–.] Æ›o¾ Fƒwß}øàƒ0fÌ£]×^^^X¼x±¤çPXXˆ9sæ@­V#..íÚµÃ7ß|ƒ'žx)))1bvïÞ­ë’¿xñ"FމÒÒRã—_~‘nÜ8Ýï,///L™2Åè-ñÿ‡óµ¿§~üñG¼õÖ[ºí111hÛ¶-~øáaÔ¨QØ¿?:wî,ù9U7Fÿšq%F÷×k×®]eûÈ#è¾6YYYŠô mÙ²E÷ù'Ÿ|"÷é!„xê©§tm$''[Ô†¶éþûïB±nÝ:¡R©PÖÅ_éKz¾úê+±qãFÝç­ZµÒuÝ—·}ûvÝ>111¢´´T÷×¥¡¤òß› 6è÷ÝwuO˜0¡ÒqÚ$¹õïß_áááºÇfΜ©;×k¯½&„(ëoÕª• ÜÜÜÄ®]»$µ¯tRûöí…e=YÚK___ñ×_UjÃ\’B|ùå—º}Œõè !Djjªðóó@Ù0Err²X»v­îØeË–I~nå•ïA’:Ì'„“&MÒwîÜ9ÝÿŸxâ ‹ê0ÔƒdÌ¢E‹tûîܹÓlÛ™™™¢Q£F€ B!~þùgÝÏfûöíE~~¾Ù¶RRR,~®mÚ´„ŸŸŸ(,,ÔµÓ§OYíHamÒ믿®«O;Œ*Eù÷¨×^{­BÒD^^žèÒ¥‹î±ñãÇWjÃTÒ¦M›d=ºuë  lªÃµk×tí 2DV;ÚÞ>ooï =HƒBˆ £µk×6øûƒ=HÕ¨I¡ûëÕ××WÖ±5jÔÐý_£Ñ(Z¼ûî»øøãe³jÕª ŸßsÏ=²þ €ëׯWzløðá¸|ù2f̘œœôïßG•5¹Ú˜Áƒ£cÇŽ8yò$âãã±~ýzŒ1¢Â>ï¾û®îÿï¿ÿ¾É¾Ý»wcûöíÊzÔÊ÷H½öÚkøê«¯ššŠU«Vá…^@LLL¥6îW±Á¹ IDATÞ½+é/< l"x||<€² ÔZ|ðΞ=‹­[·bþüù¸çž{°víZݾ}ôúöí+é¶òðÃcéÒ¥˜8q"òóóñè£âèÑ£ºÅR7K—.Å™3g°gÏlÛ¶  ¨´ß믿®›ÿòË/£aÆ8vì˜nûŒ3*|¯¥Ðþ5­õÀHþk^»@"""B·¸Ö­[‡½{÷šýÙqwwGxx8úöí‹·ß~[VÝr…„„`óæÍèÚµ+òòò0hÐ |÷Ýw3f „ Å/¿üRá}ɘòïWRö/Oû>©ÿžwìØ1Ü{ï½²Úš:uj¥Ÿu%Yú<Ëÿ.0ôÞîïï-[¶ K—.¸|ù2¾úê+DGGã7Þ°®`#|||tµØâ{§õì³Ï")) óæÍƒZ­FÿþýqøðaÔ¬YÓÂÊ]Sµ H¦lÙ²Ï<ó JJJàîîŽo¿ý>ú¨ÝΟ——‡¼¼uêTÝ\œ9sæœw#»÷ªvíÚ>Ÿˆ½{÷V˜ÇRž———îÿ–tU—ÿžNž<÷ÝwŸÙcŠŠŠðË/¿è>÷óó3¹5tó*®\¹‚Õ«WãäÉ“²z£££1uêTÌ›7YYYèܹ3xà¬_¿^·ÏâÅ‹+ü|•nï¾û®n^T£F’´Ÿ››¾ÿþ{á§Ÿ~Bjj*zõê…èzjç΋˗/K>wnn®îb{æ¾¾JR©Tº×‘œÕSZuëÖEÍš5qëÖ-ìØ±}úô‘´ŠíÌ™3¸té iÓ¦ò —IÛ˘””„𼍤¾¶mÛVXøÌ3ÏàÁ”´Šmß¾}ºÏ›6mŠœœ“ÇŒ7/^ÄܹsqóæMtíÚ=zô0ºÿŠ+°{÷n³ÏA£ÑàÔ©S¸y󦮖°°0„††"33¿þú+zè!I«Øââât¿o¤|ïÂÃñcÇtëÖ ·nÝÂܹs±gÏܸqÃì±ÕAµèABˆU«VÉîu(ÿ1gÎ!„ãÇ·ª¯¿þZdgg[uÝŽO>ùDlڴɪ:’““Mö i8q¢ÒEµ–ô QvÑ9Cíúë´|RBB‚n5Vpp°®ç”þùG×{ ÒÓÓe­bËÉÉ©Ðãbª'iÞ¼yºývìØ!„âìÙ³¢gÏž¢gÏžbÕªU&ÏuêÔ)«®Ô¡C!„0Ùƒ¤•`ðzI€ù$!„ÈÍÍ5úº1bD¥ýÕjµì‹´–ÿX¶l™¬UlEEEâ±ÇÓí_¾'Éšë`9Òn=HB)€²k8Y¢üŠNK>V¯^mó¤çž{Îâú  òòòDtt´ÅmDEE‰ììl³=HB”õ®=ûì³ÛQâ:H*•JìÞ½[!ć~hU[ß}÷Ù$­ƒ¼>XuîAªV÷b{æ™g°fÍtëÖMÒ­€² ¹÷ÜsV­Z…éÓ§>ùäLœ8±Ò-HLñòòBtt4æÌ™ƒ§Ÿ~5kÖĶmÛ+é²ï† 4‹/F³f͌޺B ;vĉ'0bÄ“·ï£S§N4hP¥Ç?øà“ǽüò˺ëG½óÎ;’zïš7o®»ÎT^^fΜ)«ÖÀÀ@ìÞ½:t]O’Ôɽ9998xð <ˆääd“û¶oßkÖ¬AÛ¶meÍ) Åã?®»ÞŽ-Z´ÀñãÇ1fÌ4mÚTö÷5 ßÿ}… ÃxàðùçŸWÚ?<<[¶lA×®]+Íá²OOOlذA·(@Û“¤í‘C{+í*¾ªä­·Þ²eËбcGK:&<<±±±Ø¸q#FŽiã Ë®iõüóÏWºŒTþþþØ·oƇÆWèÉ5ÆËË 7Æ3Ï<ƒH^¬ R©°bÅ ,_¾Ý»wWäÚf*• uëÖŃ>ˆ]»véæ¿¾þúëX±b:uê$é6P@Ù÷®GذaÆŒ#¹†ûî»ýõŒ¨¨(‹ž‡«Q¡,)Uзo_ìÚµË幦={öࡇ¡C‡d_Гˆˆl§_¿~‡B«U‘£¨Õj<ûì³ GDDUDµ™¤MäH£F’<ɘˆˆ=HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""= HDDDDzˆˆˆˆô0 éa@""""ÒÀDDDD¤‡‰ˆˆˆH‘$""""=*BÿÁÐÐPtìØÑåÙÏÉ“'‘™™Yéqƒ‰ˆˆˆ¨:ã‘$""""= HDDDDzˆˆˆˆôü?ÕßÁ6˜{\ÉIEND®B`‚sonic-visualiser-3.0.3/icons/sv-splash.svg0000644000000000000000000001101713111512442016710 0ustar 00000000000000 image/svg+xml SONIC VISUALISER QUEEN MARY, UNIVERSITY OF LONDON sonic-visualiser-3.0.3/icons/sv-winicon.ico0000644000000000000000000004107613111512442017047 0ustar 00000000000000@@ (B(@€ NØ UÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÔÝUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿSÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"SÒ"UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð‰ÿÈUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðïÿÿ/UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÿÿÿmUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð=ÿÿÿ•UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðWÿÿÿºUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðnÿÿÿß;UUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÿÿÿû2ýÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð–ÿÿÿÿ‹ÿÿÚUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÁ«ÿÿÿÿ7ÀÿÿüUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðŽÿÿœ¿ÿÿÿÿSíÿÿÿ*UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÔÿÿéÖÿÿÿÿpÿÿÿÿNUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÿÿÿÿ-éÿúÿÿŒ@ÿÿÿÿuUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð.ÿÿÿÿ_üÿÊÿÿ¨`ÿÿÿÿ™UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðJÿÿÿÿÿÿ£óÿÆ‚ÿÿÿÿ·UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðfÿÿÿÿ½(ÿÿ×ÿâ£ÿÿþÿÓUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð‚ÿÿüÿç=ÿÿ|»ÿûÃÿöÊÿïUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð–ÿÿÐÿÿQÿÿgžÿÿãÿÖ¬ÿÿ UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð¨ÿÿ•ÿÿ<cÿÿT‚ÿÿ7ýÿ·ÿÿ*UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð¸ÿþZÿÿfwÿÿAfÿÿSÿÿœsÿÿFUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿTÑôffffffffÉÿí/ÿÿŒÿÿ,Hÿÿp9ÿÿ€WÿÿbO¹’ˆˆˆ„tœUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿRÌÿÿÿÿÿÿÿÿÿ0xÿUÔÿ ÿÿ ÿRÍÿÿÿ9ÿUÔÿUÔÿ QÿÿÿMÀÿF¯ÿÿÿ&^ÿUÔÿ9ÿÿÿ4ÿA£ÿÿÿ+jÿ<–ÿÿÿÿÿÿÿ ÿÿÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿRÍÿÿÿÿÿÿÿÿÿGÿUÔÿÿÿ+ÿUÔÿÿÿ ÿUÔÿUÔÿAÿÿÿSÏÿPÇÿÿÿGÿUÔÿ/vÿÿÿ=˜ÿK¼ÿÿÿ!RÿFÿÿÿÿÿÿÿ ÿ1{ÿÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿTÒóUUUUUUÿÿåÿÿ»»ÿúÇÿñóÿÆŒÿÿ,üÿ¹æÿå""333OUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð§ÿÿ1ÿÿ¨žÿÿÚÿÜ×ÿâ¨ÿÿäÿêÿÿžUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðkÿÿÿÿ’‚ÿÿ5ìÿÊ»ÿûÄÿõÂÿÿÿÿoUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð/ÿÿÏÿÿhÿÿRÿÿ·žÿÿàÿÙ›ÿÿÿÿNUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕððÿþÿÿlLÿÿnÿÿ¡€ÿÿ8ùÿ¼uÿÿÿÿ/UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð·ÿÿÿÿV0ÿÿŠ(ÿÿŽdÿÿlÿÿ¡NÿÿÿÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð|ÿÿÿÿCÿÿ¦=ÿÿ|Gÿÿ¨ÿÿ†*ÿÿÿîUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð>ÿÿÿÿ1÷ÿÂQÿÿf(ÿÿâÿÿjûÿÿÐUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕððÿÿÿÚÿÞcÿÿS ÿÿÿÿÿNÊÿÿ©UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð«ÿÿç½ÿú{ÿÿAçÿÿÿÿ4yÿÿbUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð7ÿÿžšÿÿ¬ÿÿ,Çÿÿÿÿ ŒvUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðJp xÿÿáÿÿ§ÿÿÿùUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðWÿÿÿÿþƒÿÿÿÞUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð4ÿÿÿÿéZÿÿÿÃUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÿÿÿÿÑ2ÿÿÿ¨UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðíÿÿÿº ÿÿÿ‘UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð¾ÿÿÿŸÔÿÿpUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðŽÿÿÿ…ÿÿ1UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕð]ÿÿÿ]vUUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðüÿÿ(UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðÿ£UÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÕðUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÌUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿUÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøøøÿÿÿÿþøÿÿÿÿþøÿüÿþøÿüÿþøÿüÿþøÿü?ÿþøÿü?ÿþøÿü?ÿþøÿø?þøÿø>þøùø>þøðø>þøðø>þøðøþøðøþøðxþøðxþøàyþøàyþøàyþøâyœOþøâ1œNøøø~"1ˆÀþø~"1ˆÀþø1ˆÁþø1ˆÁþø1ˆáþøÈáþø‡Àáþø‡Ááþø‡Ááþø‡ÁóþøÇÁ÷þøÿƒÁÿþøÿƒÁÿþøÿƒáÿþøÿƒáÿþøÿƒáÿþøÿƒãÿþøÿƒãÿþøÿÇÿÿþøÿÇÿÿþøÿÇÿÿþøÿÿÿÿþøøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsonic-visualiser-3.0.3/icons/sv.rc0000644000000000000000000000005413111512442015224 0ustar 00000000000000IDI_ICON1 ICON DISCARDABLE "sv-winicon.ico" sonic-visualiser-3.0.3/icons/svicon16.png0000644000000000000000000000050613111512442016426 0ustar 00000000000000‰PNG  IHDRóÿa pHYs  šœøIDAT8¥Ò¿JAÇñÏIj᪠‚±T¬R¥±W [Á8lôlS^oé3VvWM©`ã, (Øœ…+9ÈæNâ4»3³ó›ï°“ òë@™õ*NóTeÖRÌ‹×rÕRS‡Õ‹ÑkÅŒ@½ëçÇW·fFàw.ìVÓ’õ4/F1NÝ9ÎÐÃvÚº¦_º…\b‡x ¹}Œc/á¼Çm¸ãkxÇ)†óFèá ›d ð†=<º»ØeÖߨù“pàÏÁ#‰ Hó"!º™ùœ861ØM,ø§M Mù$´éD-Í‹…ªƒ}QmJd]ÕɘIEND®B`‚sonic-visualiser-3.0.3/icons/svicon32.png0000644000000000000000000000103513111512442016422 0ustar 00000000000000‰PNG  IHDR szzôäIDATX…í–1Kä@Çÿ¹J¬îb°¸&\cñX6bqŸÀ@šù ‘…Å/à4öÓx×&°Å– ~„  KÚƒ \—Fˆ½Å»B3dãfMð,öC2o&ïýÞdæ1ÀN;}FI)™ˆÀ ˆXJÉ›bYuƒ‚üM09ƒ&¥V9þ|ÿ‰ù|þ*¦‘”’/O¹=¾<9äÀµ{g¸öšÏ¦•‘™HDE÷UELDâå×6Š‹ÐãÀµ ^…\›‹Ð+Wf;€NŽ‹Ðë Qõ] øeM›¾ýºïóùûÏßd Ì:IcÓZãôöécJM&,—Kh­1›Í¦©{ËjtxAkÝ¢*³S‹Ðã"ôXÁãñx­¬–ï/E¥±/„0~Ðp êÊ²ÌØp–eÌÌ,„0ýú³Ë1ì P=÷Õñ2Óª}S} R_m…iP€ªÊìÛÔЫÀoû}»}+@àڈ㸓ƒ¯×w­sâ8FàÚíD8:؇Rª3D[p¥Žö×blð}j•c:rp¶÷€›« X–Õ«Ý\]àlïÓ‘µÊáûþÀ纒•úÈKéN;ýwý3 v̆™tIEND®B`‚sonic-visualiser-3.0.3/icons/text.png0000644000000000000000000000103313111512442015736 0ustar 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ÐIDATxÚÕÕ»jTAÇñÏÙÍî²—ÄHbñ‚Ic#¦°´²Òðl|ŸÁÂÞN°Sð D´MÒb‘B" !FsÛs²g,2›÷‚Ç ‚æpfæËoþ—ùó¿Y2æ_RXKJpÂÀ:”<r/_Z^³±¹£›j5ëºiO¯×“æÚÍúµZI<{¹r;èöáE«<|p+`Ÿ°„W§¦azª‘áMï‘EÐ"fQ…‰AÅÛ_÷2¬Dèë¨âÃÞ^ æçÒ¥•µÇøˆË¸»˜D£ï…A°n·WÃ#ìc=Îêµ ÙaÖß–aoñ.‚÷‘_}0O_,Ï` ø‚¨×‡4ôâÚgœÇfôo>JqˆWÏÆùÈgÕʨ,è«ß \e8ÃnG·Ó©KÓ<w öñ€šc›l5Êä±q>kNíȱyÞ,S8¥Áífã—Ε'IˆUVÙ/³¿4¸õ£âüo€áâ…Ó'abþOÁ‹¸sóÆ%3Ó-pöª¸ë1«’ßyRµ…¹pò}6\½2&Ûµuœ+¾?{‹·iÇóè V(¢o±ì×cq„²à$‚:QU¥°?Ä Vœ’Ýa\7 #:Ç¿±ï™ ªn"IEND®B`‚sonic-visualiser-3.0.3/icons/timeruler.png0000644000000000000000000000014513111512442016765 0ustar 00000000000000‰PNG  IHDRóÿa,IDAT8c`tÿñI2Qj:Í Àål q&|’À|. 0’iû(@X‰ÏIEND®B`‚sonic-visualiser-3.0.3/icons/undo.png0000644000000000000000000000111113111512442015714 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÓ 9Ú7«ÖIDATxÚÍ’=ka…ŸwæÙÌNf¿ŒYA]³"a;Å F…X(ˆ–‚M‚… ;!,‚µI#kio!ØX»DM²Ùuw2ß³¯…ˆ«Á¯JOuï¹Ü§8ø×ƒKñ–Ò<·çDïOÚ×Á˜Vz´ÎÉ}Yÿ…Œiµí¯i_Úë„÷.ÇÕ³£ã%Ë»ÉÅ~ñ÷€©@ãBtxg!œ?S«2ã°¿bÛGh7쌚c*p~ Hãz~H=¨ïIë«~ŽWË‚×ïtFò2SU×AÍp®;òó';/-Ë/8¦VÎA¥I +-Øpaµí»¤Ámà> ¥èG€DEW|/Â÷”ã{VÃÃc†Ý(^ku  VX,{>ýÖDhGrV ˜Y#“}¸k4©0,ñBXþèw‚ÀSà  cÀ$BœíÉ @ÐOÙÒüîùŠ© ¢ZŸÂÀu{ïEÜu•ÐE_wÕOKÄ„œù®HL,Iàš´Ë³Åœ½Ý4M¤þå'E!½Í ºkQéšµ¶ØëÄR¡B·®š†<&¥1Š8IÖã8yN²¹<£Yó¶Ty¢6`¡[¤A ø€O³Öç¿ÑgÒT±YiÒÏIEND®B`‚sonic-visualiser-3.0.3/icons/values.png0000644000000000000000000000021713111512442016254 0ustar 00000000000000‰PNG  IHDRóÿaVIDAT8Ý’; C‹'÷æ8˜?#“±“!¯€R«^6Jr-; t„—²œJÞS9Œ ™… (dþ`PÐK‡ïo€$)ÉÒCiH‡ái¨îIEND®B`‚sonic-visualiser-3.0.3/icons/waveform.png0000644000000000000000000000036313111512442016605 0ustar 00000000000000‰PNG  IHDRóÿa pHYs  šœ¥IDAT8ÝÐ=aà‡F¥%4„DÃ!@!q•Ê ÜB¯p*‰ht$DåŸf¿?¡ašw2»³³ûò÷Hž5do…LFî[©í ^ÁêÝsôQÇЃs (£M Z؆ÞÅ»èï`¾"Œ±À1Ì›‹A샟b£´vÀªh ©éùàÓØ z3Þjx®Ð»ù‡”îè/#¹—ôfŸ˜gÂÙ(Wÿç5IEND®B`‚sonic-visualiser-3.0.3/icons/zoom-fit.png0000644000000000000000000000151613111512442016524 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIMEÔ &O)¨¿ÛIDATxÚmÒKh\eÆñÿw¾ï;çÌ™[æLg’Œx©6Ò&*© q¥YLAð‚‚(Ò…tQE[ ‚ˆëîŠëº¸ŒE¦]RI)­­)h2íÌ4™L“L29s=7*1λ~ùñ>/8þÛ”aªã¶m~lhù¤4P†ÍÀ.¶=ï‹~‡Û'N¼ÜgȈsçæRÚ–ï%ÝôéÔHÒÅl À¢0`§Ùümûþæ§­þÔ©7ƒý€ê‡~1‘HžÎæ\×ͤ°,MÐíöÒ‰Ǧüþà3¯½~XÞ¾ŸqÓîÈHŠÙònS)ÜL DZH&ãb¬ 8>,‚9ñ–©°M%JIÛ&áĈÙ6ù±<¾ß›(©„-¥¤Ýîro}ÛÔ$â¦VD‘‚ÐÔô{ÝÄÐ vvc[*Öë[›Þ¼’öb>î¿:!^™tï†÷î¬_¨m'ßþj­ bgy Xü»$¯?wÎü·0_¾>þî³/=wöÐäÁÄú•¹vµòÝRM~øÉ÷«e©‹Ì߈¾ÑDpAä—¸¾x~"YÞmµœÔhá™ñÓ˜^åÑíÆváp.½ u‘¯;g¨äÊGüÞÑKÈè¦_Âß ”–v;OdôB½R7Sc…釦¦b‰`íÈj{Zê"/ú%nµ¶¨¢ÇŒ_â¿üG«7*ÄâýJMå>ü´JåÍë+ê1©‹\ÖE–u‘Uà°²?Â?smÕë/ò>„T?Æ ú½P‹‡vhtšÀXµŠK†(0H‚F£P$ nE†,I†`Ù:'£ŒH”R¤RÌÍ/Bx¸] žÁ¶8B` <ôlÆíhHh!¶ PŽ@àxFAˆ<IËB:]q,.,hkLË„aZ°˜–J)ž‡Ä󘚘D2™pÌFcíßFÌpmÛ°ÿ9ˆÇâ~ûkIcÁ @‹  ÙljÕ4Ú`(àVŒr „ âEßkäråš±z¬äx+Úý!¹1‡@Ù½Ê`SUù<¸‡öOI"“³™ÜÂò’ÖǨô)ä2ŽV’‘¦*õ—57=ÿrv‰k=ý(ßЇÈ`½¬·4ï+:û¥çDRû|Íž|Pc÷¶†zo**ò¿§»ud½ß9\•®îiÜ))ö`æÍsýýHìéXŒ¿L÷6WÜt¼{<ѾÞûÇÖÒÛüüH|&.x ‹«KÃaÙmƶNGSÕlqÎ9††Fý‚Ä:9—‘n¢˜@Hֶ쉂a\.›xüøž2ªˆ ûENOú´š^À§) ‡ € ¸Ž|6û*÷=s^Ï[c==‡ìåVv¬¯×תÕ4-è‡,‹(Wl‹%P*Cõ(Q«\¹`ægÌ.€s*¨Õh€+B„µ $Æ ýPU>Ÿ‡Ô7„7è¬6AqÚTYbà’F£P9‡WU pŽp}–Uj¯`”N)E¡PÄ·ùà’¯G…$2¸.ƒ@ID¹TôVmÏ!® P@DFAÈ¢.Ë€ãÀ4KÙª€é…)cÑ€íØ°lÛq@)…$Šà¢ˆO³¡ëæDUÀ\"yñõÌÛ9BA p]îT2…ÉÇϰ¨[éj©‹¦K¥Bζ­¶ÚpÈ«ª*@ A"‘Àƒ±G¨T(Ö„èŠÓ±wZ=‰á§úï9ÚÛ»x]CM‹¦Õôk!O+—™R*VÒ cŒQþ<ì±ö5‘©½´/ηÏóç2B÷‘[ÉþU7öGN¼9¨/ιo¶º÷ºÃ÷®ìЬ¦Lâö_éÒ8iö!·d™%Ü~2½^ „z·v Ù¼¿#—OšÛëÏÒæ®Èèimw|Å·ñX<“Öã)={݇±·hn ŠS©¯)É_ß[*^;Ùü9Qˆå®Vi}É샾Ü<¶¥.´nm çáŽ3’mÈwFgø?:ÚRl\‘k›:?™«ßü˜ úM[î¹ÿIEND®B`‚sonic-visualiser-3.0.3/icons/zoom-reset.png0000644000000000000000000000042213111512442017057 0ustar 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8í’± 1 EŸ¹lÉMv aê똅Žúö¡a‡¤°tädª £ i(peïëûë‹»32‡!m‘3p¦Ì\Ý}ö‚ˆÜCGU]{´™ÅZëÃÝOo€IUלó­'RšK)/—Ãü~A`߃ÍÌbJiîfÜî}Ǫüí gð\4;¶ë(]IEND®B`‚sonic-visualiser-3.0.3/icons/zoom.png0000644000000000000000000000145713111512442015750 0ustar 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIMEÔ %Ï;ÈD¼IDATxÚm“KHTqÅÏÿþÿ÷93×™;Îè(¥5¦%…ºh•InÚdP$¸‹˜UPÑ¢]›¤Eh ËÜX Mˆ(ÃB¨ìaP9ê(3Žïëç}´Ìäžõá÷Ã÷}úûŸ©œÀ:$I¸Éñô(åÀ8B6,ÓËƽb?º»Ïá"Ò×7¨ò½æÓÊâªß§É²Žãpl [_6WÖnë[æHoï%k/€mó´×ë‹Cš¦Tˆ"bÉB>_¥"ÜhKwŒìò4€ß{`_hešß¯¢<èGX @` Z@…¢ˆðù<¤²*|@‡[ÄnQ<2DA0ÊÀ…"Ið*2dIB¸2 Ó,´¹eD¢”"›Íciy’ÀÃëQ ð ŽÃÀ[àQ,ä½® ¶¶ ƒÇ(G ð <£ Dž‡$Š€m#—+l¸V3ë“Æ¶˶`Z6l–mƒR ç!ñ<¿g¡ë¹1WÀb2u÷ëô÷EBŽ#pÎ.C:•ÆÄ›ØÖÍŒ€F*3…BvӲ̖P8èUŒr „ ™LâùÈK”JµAZ~£i¦úB³'9ø^ß©C æa]¨³¡6ã}{ÊD&ò¥Ìúš1¨4ö˜çêÈdgƒ6o/Í-¿X\ãz.¤Ò;1ä >ÞŽøx»[J<:¹òiè¢n|¼åÌ>nv†{ÂÃ÷ÏDj€ÆÇÛÑjFw̱®(b]Q¼{úïèNÖùÛº®¨U±H}cáàff³ª>T6Ic]Qש»£3Û¹#~2½Ôʪ¦ý²×JžKf›è¡äÖKP4°ú+‹ùW>sÿ}ßëŸz¡‚©•…E:PÓÊÔ°ðy–E ÈO€«µû?hs]÷ŽºŽUª÷ù‡ÄP]G"WóíH´`•¾âIEND®B`‚sonic-visualiser-3.0.3/install-sh0000755000000000000000000003246413111512442015151 0ustar 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-3.0.3/main/MainWindow.cpp0000644000000000000000000053331113111512442016646 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "../version.h" #include "MainWindow.h" #include "PreferencesDialog.h" #include "view/Pane.h" #include "view/PaneStack.h" #include "data/model/WaveFileModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/AggregateWaveModel.h" #include "data/model/Labeller.h" #include "data/osc/OSCQueue.h" #include "framework/Document.h" #include "framework/TransformUserConfigurator.h" #include "view/ViewManager.h" #include "base/Preferences.h" #include "base/ResourceFinder.h" #include "layer/WaveformLayer.h" #include "layer/TimeRulerLayer.h" #include "layer/TimeInstantLayer.h" #include "layer/TimeValueLayer.h" #include "layer/NoteLayer.h" #include "layer/Colour3DPlotLayer.h" #include "layer/SliceLayer.h" #include "layer/SliceableLayer.h" #include "layer/ImageLayer.h" #include "layer/RegionLayer.h" #include "view/Overview.h" #include "widgets/PropertyBox.h" #include "widgets/PropertyStack.h" #include "widgets/AudioDial.h" #include "widgets/LevelPanWidget.h" #include "widgets/LevelPanToolButton.h" #include "widgets/IconLoader.h" #include "widgets/LayerTreeDialog.h" #include "widgets/ListInputDialog.h" #include "widgets/SubdividingMenu.h" #include "widgets/NotifyingPushButton.h" #include "widgets/KeyReference.h" #include "widgets/TransformFinder.h" #include "widgets/LabelCounterInputDialog.h" #include "widgets/ActivityLog.h" #include "widgets/UnitConverter.h" #include "audio/AudioCallbackPlaySource.h" #include "audio/AudioCallbackRecordTarget.h" #include "audio/PlaySpeedRangeMapper.h" #include "data/fileio/DataFileReaderFactory.h" #include "data/fileio/PlaylistFileReader.h" #include "data/fileio/WavFileWriter.h" #include "data/fileio/CSVFileWriter.h" #include "data/fileio/MIDIFileWriter.h" #include "data/fileio/BZipFileDevice.h" #include "data/fileio/FileSource.h" #include "data/midi/MIDIInput.h" #include "base/RecentFiles.h" #include "plugin/PluginScan.h" #include "transform/TransformFactory.h" #include "transform/ModelTransformerFactory.h" #include "base/PlayParameterRepository.h" #include "base/XmlExportable.h" #include "widgets/CommandHistory.h" #include "base/Profiler.h" #include "base/Clipboard.h" #include "base/UnitDatabase.h" #include "layer/ColourDatabase.h" #include "widgets/ModelDataTableDialog.h" #include "rdf/PluginRDFIndexer.h" #include "rdf/RDFExporter.h" #include "Surveyer.h" #include "NetworkPermissionTester.h" #include "framework/VersionTester.h" // For version information #include #include #include "plugin/api/ladspa.h" #include "plugin/api/dssi.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::vector; using std::map; using std::set; MainWindow::MainWindow(SoundOptions options, bool withOSCSupport) : MainWindowBase(options), m_overview(0), m_mainMenusCreated(false), m_paneMenu(0), m_layerMenu(0), m_transformsMenu(0), m_playbackMenu(0), m_existingLayersMenu(0), m_sliceMenu(0), m_recentFilesMenu(0), m_recentTransformsMenu(0), m_templatesMenu(0), m_rightButtonMenu(0), m_rightButtonLayerMenu(0), m_rightButtonTransformsMenu(0), m_rightButtonPlaybackMenu(0), m_soloAction(0), m_rwdStartAction(0), m_rwdSimilarAction(0), m_rwdAction(0), m_ffwdAction(0), m_ffwdSimilarAction(0), m_ffwdEndAction(0), m_playAction(0), m_recordAction(0), m_playSelectionAction(0), m_playLoopAction(0), m_soloModified(false), m_prevSolo(false), m_playControlsSpacer(0), m_playControlsWidth(0), m_preferencesDialog(0), m_layerTreeDialog(0), m_activityLog(new ActivityLog()), m_unitConverter(new UnitConverter()), m_keyReference(new KeyReference()), m_templateWatcher(0) { Profiler profiler("MainWindow::MainWindow"); SVDEBUG << "MainWindow: " << getReleaseText() << endl; setWindowTitle(QApplication::applicationName()); UnitDatabase *udb = UnitDatabase::getInstance(); udb->registerUnit("Hz"); udb->registerUnit("dB"); udb->registerUnit("s"); ColourDatabase *cdb = ColourDatabase::getInstance(); cdb->addColour(Qt::black, tr("Black")); cdb->addColour(Qt::darkRed, tr("Red")); cdb->addColour(Qt::darkBlue, tr("Blue")); cdb->addColour(Qt::darkGreen, tr("Green")); cdb->addColour(QColor(200, 50, 255), tr("Purple")); cdb->addColour(QColor(255, 150, 50), tr("Orange")); cdb->setUseDarkBackground(cdb->addColour(Qt::white, tr("White")), true); cdb->setUseDarkBackground(cdb->addColour(Qt::red, tr("Bright Red")), true); cdb->setUseDarkBackground(cdb->addColour(QColor(30, 150, 255), tr("Bright Blue")), true); cdb->setUseDarkBackground(cdb->addColour(Qt::green, tr("Bright Green")), true); cdb->setUseDarkBackground(cdb->addColour(QColor(225, 74, 255), tr("Bright Purple")), true); cdb->setUseDarkBackground(cdb->addColour(QColor(255, 188, 80), tr("Bright Orange")), true); SVDEBUG << "MainWindow: Creating main user interface layout" << endl; QFrame *frame = new QFrame; setCentralWidget(frame); QGridLayout *layout = new QGridLayout; m_descriptionLabel = new QLabel; m_mainScroll = new QScrollArea(frame); m_mainScroll->setWidgetResizable(true); m_mainScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_mainScroll->setFrameShape(QFrame::NoFrame); m_mainScroll->setWidget(m_paneStack); m_overview = new Overview(frame); m_overview->setViewManager(m_viewManager); int overviewHeight = m_viewManager->scalePixelSize(35); if (overviewHeight < 40) overviewHeight = 40; m_overview->setFixedHeight(overviewHeight); #ifndef _WIN32 // For some reason, the contents of the overview never appear if we // make this setting on Windows. I have no inclination at the moment // to track down the reason why. m_overview->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); #endif connect(m_overview, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); m_panLayer = new WaveformLayer; m_panLayer->setChannelMode(WaveformLayer::MergeChannels); m_panLayer->setAggressiveCacheing(true); m_overview->addLayer(m_panLayer); coloursChanged(); // sets pan layer colour from preferences m_playSpeed = new AudioDial(frame); m_playSpeed->setMinimum(0); m_playSpeed->setMaximum(120); m_playSpeed->setValue(60); m_playSpeed->setFixedWidth(overviewHeight); m_playSpeed->setFixedHeight(overviewHeight); m_playSpeed->setNotchesVisible(true); m_playSpeed->setPageStep(10); m_playSpeed->setObjectName(tr("Playback Speed")); m_playSpeed->setRangeMapper(new PlaySpeedRangeMapper); m_playSpeed->setDefaultValue(60); m_playSpeed->setShowToolTip(true); connect(m_playSpeed, SIGNAL(valueChanged(int)), this, SLOT(playSpeedChanged(int))); connect(m_playSpeed, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_playSpeed, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_mainLevelPan = new LevelPanToolButton(frame); connect(m_mainLevelPan, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_mainLevelPan, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_mainLevelPan->setFixedHeight(overviewHeight); m_mainLevelPan->setFixedWidth(overviewHeight); m_mainLevelPan->setImageSize((overviewHeight * 3) / 4); m_mainLevelPan->setBigImageSize(overviewHeight * 3); m_playControlsSpacer = new QFrame; layout->setSpacing(m_viewManager->scalePixelSize(4)); layout->addWidget(m_mainScroll, 0, 0, 1, 4); layout->addWidget(m_overview, 1, 0); layout->addWidget(m_playSpeed, 1, 1); layout->addWidget(m_playControlsSpacer, 1, 2); layout->addWidget(m_mainLevelPan, 1, 3); m_playControlsWidth = m_mainLevelPan->width() + m_playSpeed->width() + layout->spacing() * 2; m_paneStack->setPropertyStackMinWidth(m_playControlsWidth + 2 + layout->spacing()); m_playControlsSpacer->setFixedSize(QSize(2, 2)); layout->setColumnStretch(0, 10); connect(m_paneStack, SIGNAL(propertyStacksResized(int)), this, SLOT(propertyStacksResized(int))); frame->setLayout(layout); SVDEBUG << "MainWindow: Creating menus and toolbars" << endl; #ifdef Q_OS_MAC // Mac doesn't align menu labels when icons are shown: result is messy QApplication::setAttribute(Qt::AA_DontShowIconsInMenus); setIconsVisibleInMenus(false); #endif setupMenus(); setupToolbars(); setupHelpMenu(); statusBar(); m_currentLabel = new QLabel; statusBar()->addPermanentWidget(m_currentLabel); finaliseMenus(); connect(m_viewManager, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(m_playSource, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(CommandHistory::getInstance(), SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(this, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(this, SIGNAL(replacedDocument()), this, SLOT(documentReplaced())); m_activityLog->hide(); m_unitConverter->hide(); setAudioRecordMode(RecordCreateAdditionalModel); SVDEBUG << "MainWindow: Creating new session" << endl; newSession(); connect(m_midiInput, SIGNAL(eventsAvailable()), this, SLOT(midiEventsAvailable())); SVDEBUG << "MainWindow: Creating network permission tester" << endl; NetworkPermissionTester tester(withOSCSupport); bool networkPermission = tester.havePermission(); if (networkPermission) { if (withOSCSupport) { SVDEBUG << "MainWindow: Creating OSC queue" << endl; startOSCQueue(); } SVDEBUG << "MainWindow: Starting transform population thread" << endl; TransformFactory::getInstance()->startPopulationThread(); SVDEBUG << "MainWindow: Creating surveyer" << endl; m_surveyer = new Surveyer ("sonicvisualiser.org", "survey23-present.txt", "survey23.php"); SVDEBUG << "MainWindow: Creating version tester" << endl; m_versionTester = new VersionTester ("sonicvisualiser.org", "latest-version.txt", SV_VERSION); connect(m_versionTester, SIGNAL(newerVersionAvailable(QString)), this, SLOT(newerVersionAvailable(QString))); } else { m_surveyer = 0; m_versionTester = 0; } /* QTimer::singleShot(500, this, SLOT(betaReleaseWarning())); */ QString warning = PluginScan::getInstance()->getStartupFailureReport(); if (warning != "") { QTimer::singleShot(500, this, SLOT(pluginPopulationWarning())); } SVDEBUG << "MainWindow: Constructor done" << endl; } MainWindow::~MainWindow() { // SVDEBUG << "MainWindow::~MainWindow" << endl; delete m_keyReference; delete m_activityLog; delete m_unitConverter; delete m_preferencesDialog; delete m_layerTreeDialog; delete m_versionTester; delete m_surveyer; Profiles::getInstance()->dump(); // SVDEBUG << "MainWindow::~MainWindow finishing" << endl; } void MainWindow::setupMenus() { if (!m_mainMenusCreated) { #ifdef Q_OS_LINUX // In Ubuntu 14.04 the window's menu bar goes missing entirely // if the user is running any desktop environment other than Unity // (in which the faux single-menubar appears). The user has a // workaround, to remove the appmenu-qt5 package, but that is // awkward and the problem is so severe that it merits disabling // the system menubar integration altogether. Like this: menuBar()->setNativeMenuBar(false); // fix #1039 #endif m_rightButtonMenu = new QMenu(); // We don't want tear-off enabled on the right-button menu. // If it is enabled, then simply right-clicking and releasing // will pop up the menu, activate the tear-off, and leave the // torn-off menu window in front of the main window. That // isn't desirable. m_rightButtonMenu->setTearOffEnabled(false); } if (m_rightButtonTransformsMenu) { m_rightButtonTransformsMenu->clear(); } else { m_rightButtonTransformsMenu = m_rightButtonMenu->addMenu(tr("&Transform")); m_rightButtonTransformsMenu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); } // This will be created (if not found) or cleared (if found) in // setupPaneAndLayerMenus, but we want to ensure it's created // sooner so it can go nearer the top of the right button menu if (m_rightButtonLayerMenu) { m_rightButtonLayerMenu->clear(); } else { m_rightButtonLayerMenu = m_rightButtonMenu->addMenu(tr("&Layer")); m_rightButtonLayerMenu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); } if (!m_mainMenusCreated) { CommandHistory::getInstance()->registerMenu(m_rightButtonMenu); m_rightButtonMenu->addSeparator(); } setupFileMenu(); setupEditMenu(); setupViewMenu(); setupPaneAndLayerMenus(); setupTransformsMenu(); m_mainMenusCreated = true; } void MainWindow::goFullScreen() { if (m_viewManager->getZoomWheelsEnabled()) { // The wheels seem to end up in the wrong place in full-screen mode toggleZoomWheels(); } QWidget *ps = m_mainScroll->takeWidget(); ps->setParent(0); QShortcut *sc; sc = new QShortcut(QKeySequence("Esc"), ps); connect(sc, SIGNAL(activated()), this, SLOT(endFullScreen())); sc = new QShortcut(QKeySequence("F11"), ps); connect(sc, SIGNAL(activated()), this, SLOT(endFullScreen())); QAction *acts[] = { m_playAction, m_zoomInAction, m_zoomOutAction, m_zoomFitAction, m_scrollLeftAction, m_scrollRightAction, m_showPropertyBoxesAction }; for (int i = 0; i < int(sizeof(acts)/sizeof(acts[0])); ++i) { sc = new QShortcut(acts[i]->shortcut(), ps); connect(sc, SIGNAL(activated()), acts[i], SLOT(trigger())); } ps->showFullScreen(); } void MainWindow::endFullScreen() { // these were only created in goFullScreen: QObjectList cl = m_paneStack->children(); foreach (QObject *o, cl) { QShortcut *sc = qobject_cast(o); if (sc) delete sc; } m_paneStack->showNormal(); m_mainScroll->setWidget(m_paneStack); } void MainWindow::setupFileMenu() { if (m_mainMenusCreated) return; QMenu *menu = menuBar()->addMenu(tr("&File")); menu->setTearOffEnabled(true); QToolBar *toolbar = addToolBar(tr("File Toolbar")); m_keyReference->setCategory(tr("File and Session Management")); IconLoader il; QIcon icon = il.load("filenew"); QAction *action = new QAction(icon, tr("&New Session"), this); action->setShortcut(tr("Ctrl+N")); action->setStatusTip(tr("Abandon the current %1 session and start a new one").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), this, SLOT(newSession())); m_keyReference->registerShortcut(action); menu->addAction(action); toolbar->addAction(action); icon = il.load("fileopen"); action = new QAction(icon, tr("&Open..."), this); action->setShortcut(tr("Ctrl+O")); action->setStatusTip(tr("Open a session file, audio file, or layer")); connect(action, SIGNAL(triggered()), this, SLOT(openSomething())); m_keyReference->registerShortcut(action); toolbar->addAction(action); menu->addAction(action); // We want this one to go on the toolbar now, if we add it at all, // but on the menu later QAction *iaction = new QAction(tr("&Import More Audio..."), this); iaction->setShortcut(tr("Ctrl+I")); iaction->setStatusTip(tr("Import an extra audio file into a new pane")); connect(iaction, SIGNAL(triggered()), this, SLOT(importMoreAudio())); connect(this, SIGNAL(canImportMoreAudio(bool)), iaction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(iaction); // We want this one to go on the toolbar now, if we add it at all, // but on the menu later QAction *raction = new QAction(tr("Replace &Main Audio..."), this); raction->setStatusTip(tr("Replace the main audio file of the session with a different file")); connect(raction, SIGNAL(triggered()), this, SLOT(replaceMainAudio())); connect(this, SIGNAL(canReplaceMainAudio(bool)), raction, SLOT(setEnabled(bool))); action = new QAction(tr("Open Lo&cation..."), this); action->setShortcut(tr("Ctrl+Shift+O")); action->setStatusTip(tr("Open or import a file from a remote URL")); connect(action, SIGNAL(triggered()), this, SLOT(openLocation())); m_keyReference->registerShortcut(action); menu->addAction(action); m_recentFilesMenu = menu->addMenu(tr("Open &Recent")); m_recentFilesMenu->setTearOffEnabled(true); setupRecentFilesMenu(); connect(&m_recentFiles, SIGNAL(recentChanged()), this, SLOT(setupRecentFilesMenu())); menu->addSeparator(); icon = il.load("filesave"); action = new QAction(icon, tr("&Save Session"), this); action->setShortcut(tr("Ctrl+S")); action->setStatusTip(tr("Save the current session into a %1 session file").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), this, SLOT(saveSession())); connect(this, SIGNAL(canSave(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); toolbar->addAction(action); icon = il.load("filesaveas"); action = new QAction(icon, tr("Save Session &As..."), this); action->setShortcut(tr("Ctrl+Shift+S")); action->setStatusTip(tr("Save the current session into a new %1 session file").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), this, SLOT(saveSessionAs())); menu->addAction(action); toolbar->addAction(action); menu->addSeparator(); /* icon = il.load("fileopenaudio"); action = new QAction(icon, tr("&Import Audio File..."), this); action->setShortcut(tr("Ctrl+I")); action->setStatusTip(tr("Import an existing audio file")); connect(action, SIGNAL(triggered()), this, SLOT(importAudio())); m_keyReference->registerShortcut(action); menu->addAction(action); */ // the Replace action we made earlier menu->addAction(raction); // the Import action we made earlier menu->addAction(iaction); action = new QAction(tr("&Export Audio File..."), this); action->setStatusTip(tr("Export selection as an audio file")); connect(action, SIGNAL(triggered()), this, SLOT(exportAudio())); connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); action = new QAction(tr("Export Audio Data..."), this); action->setStatusTip(tr("Export audio from selection into a data file")); connect(action, SIGNAL(triggered()), this, SLOT(exportAudioData())); connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Import Annotation &Layer..."), this); action->setShortcut(tr("Ctrl+L")); action->setStatusTip(tr("Import layer data from an existing file")); connect(action, SIGNAL(triggered()), this, SLOT(importLayer())); connect(this, SIGNAL(canImportLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Export Annotation La&yer..."), this); action->setShortcut(tr("Ctrl+Y")); action->setStatusTip(tr("Export layer data to a file")); connect(action, SIGNAL(triggered()), this, SLOT(exportLayer())); connect(this, SIGNAL(canExportLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Export Image File..."), this); action->setStatusTip(tr("Export a single pane to an image file")); connect(action, SIGNAL(triggered()), this, SLOT(exportImage())); connect(this, SIGNAL(canExportImage(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); action = new QAction(tr("Export SVG File..."), this); action->setStatusTip(tr("Export a single pane to a scalable SVG image file")); connect(action, SIGNAL(triggered()), this, SLOT(exportSVG())); connect(this, SIGNAL(canExportImage(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Browse Recorded Audio Folder"), this); action->setStatusTip(tr("Open the Recorded Audio folder in the system file browser")); connect(action, SIGNAL(triggered()), this, SLOT(browseRecordedAudio())); menu->addAction(action); menu->addSeparator(); QString templatesMenuLabel = tr("Apply Session Template"); m_templatesMenu = menu->addMenu(templatesMenuLabel); m_templatesMenu->setTearOffEnabled(true); // We need to have a main model for this option to be useful: // canExportAudio captures that connect(this, SIGNAL(canExportAudio(bool)), m_templatesMenu, SLOT(setEnabled(bool))); // Set up the menu in a moment, after m_manageTemplatesAction constructed action = new QAction(tr("Export Session as Template..."), this); connect(action, SIGNAL(triggered()), this, SLOT(saveSessionAsTemplate())); // We need to have something in the session for this to be useful: // canDeleteCurrentLayer captures that connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); m_manageTemplatesAction = new QAction(tr("Manage Exported Templates"), this); connect(m_manageTemplatesAction, SIGNAL(triggered()), this, SLOT(manageSavedTemplates())); menu->addAction(m_manageTemplatesAction); setupTemplatesMenu(); action = new QAction(tr("&Preferences..."), this); action->setStatusTip(tr("Adjust the application preferences")); connect(action, SIGNAL(triggered()), this, SLOT(preferences())); menu->addAction(action); menu->addSeparator(); action = new QAction(il.load("exit"), tr("&Quit"), this); action->setShortcut(tr("Ctrl+Q")); action->setStatusTip(tr("Exit %1").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); m_keyReference->registerShortcut(action); menu->addAction(action); } void MainWindow::setupEditMenu() { if (m_mainMenusCreated) return; QMenu *menu = menuBar()->addMenu(tr("&Edit")); menu->setTearOffEnabled(true); CommandHistory::getInstance()->registerMenu(menu); m_keyReference->setCategory(tr("Editing")); menu->addSeparator(); IconLoader il; QAction *action = new QAction(il.load("editcut"), tr("Cu&t"), this); action->setShortcut(tr("Ctrl+X")); action->setStatusTip(tr("Cut the selection from the current layer to the clipboard")); connect(action, SIGNAL(triggered()), this, SLOT(cut())); connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(il.load("editcopy"), tr("&Copy"), this); action->setShortcut(tr("Ctrl+C")); action->setStatusTip(tr("Copy the selection from the current layer to the clipboard")); connect(action, SIGNAL(triggered()), this, SLOT(copy())); connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(il.load("editpaste"), tr("&Paste"), this); action->setShortcut(tr("Ctrl+V")); action->setStatusTip(tr("Paste from the clipboard to the current layer")); connect(action, SIGNAL(triggered()), this, SLOT(paste())); connect(this, SIGNAL(canPaste(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(tr("Paste at Playback Position"), this); action->setShortcut(tr("Ctrl+Shift+V")); action->setStatusTip(tr("Paste from the clipboard to the current layer, placing the first item at the playback position")); connect(action, SIGNAL(triggered()), this, SLOT(pasteAtPlaybackPosition())); connect(this, SIGNAL(canPaste(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); m_deleteSelectedAction = new QAction(tr("&Delete Selected Items"), this); m_deleteSelectedAction->setShortcut(tr("Del")); m_deleteSelectedAction->setStatusTip(tr("Delete items in current selection from the current layer")); connect(m_deleteSelectedAction, SIGNAL(triggered()), this, SLOT(deleteSelected())); connect(this, SIGNAL(canDeleteSelection(bool)), m_deleteSelectedAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_deleteSelectedAction); menu->addAction(m_deleteSelectedAction); m_rightButtonMenu->addAction(m_deleteSelectedAction); menu->addSeparator(); m_rightButtonMenu->addSeparator(); m_keyReference->setCategory(tr("Selection")); action = new QAction(tr("Select &All"), this); action->setShortcut(tr("Ctrl+A")); action->setStatusTip(tr("Select the whole duration of the current session")); connect(action, SIGNAL(triggered()), this, SLOT(selectAll())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(tr("Select &Visible Range"), this); action->setShortcut(tr("Ctrl+Shift+A")); action->setStatusTip(tr("Select the time range corresponding to the current window width")); connect(action, SIGNAL(triggered()), this, SLOT(selectVisible())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Select to &Start"), this); action->setShortcut(tr("Shift+Left")); action->setStatusTip(tr("Select from the start of the session to the current playback position")); connect(action, SIGNAL(triggered()), this, SLOT(selectToStart())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Select to &End"), this); action->setShortcut(tr("Shift+Right")); action->setStatusTip(tr("Select from the current playback position to the end of the session")); connect(action, SIGNAL(triggered()), this, SLOT(selectToEnd())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("C&lear Selection"), this); action->setShortcut(tr("Esc")); action->setStatusTip(tr("Clear the selection")); connect(action, SIGNAL(triggered()), this, SLOT(clearSelection())); connect(this, SIGNAL(canClearSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); menu->addSeparator(); m_keyReference->setCategory(tr("Tapping Time Instants")); action = new QAction(tr("&Insert Instant at Playback Position"), this); action->setShortcut(tr("Enter")); action->setStatusTip(tr("Insert a new time instant at the current playback position, in a new layer if necessary")); connect(action, SIGNAL(triggered()), this, SLOT(insertInstant())); connect(this, SIGNAL(canInsertInstant(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); // Laptop shortcut (no keypad Enter key) QString shortcut(tr(";")); connect(new QShortcut(shortcut, this), SIGNAL(activated()), this, SLOT(insertInstant())); m_keyReference->registerAlternativeShortcut(action, shortcut); action = new QAction(tr("Insert Instants at Selection &Boundaries"), this); action->setShortcut(tr("Shift+Enter")); action->setStatusTip(tr("Insert new time instants at the start and end of the current selected regions, in a new layer if necessary")); connect(action, SIGNAL(triggered()), this, SLOT(insertInstantsAtBoundaries())); connect(this, SIGNAL(canInsertInstantsAtBoundaries(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Insert Item at Selection"), this); action->setShortcut(tr("Ctrl+Shift+Return")); action->setStatusTip(tr("Insert a new note or region item corresponding to the current selection")); connect(action, SIGNAL(triggered()), this, SLOT(insertItemAtSelection())); connect(this, SIGNAL(canInsertItemAtSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); QMenu *numberingMenu = menu->addMenu(tr("Number New Instants with")); numberingMenu->setTearOffEnabled(true); QActionGroup *numberingGroup = new QActionGroup(this); Labeller::TypeNameMap types = m_labeller->getTypeNames(); for (Labeller::TypeNameMap::iterator i = types.begin(); i != types.end(); ++i) { if (i->first == Labeller::ValueFromLabel || i->first == Labeller::ValueFromExistingNeighbour) continue; action = new QAction(i->second, this); connect(action, SIGNAL(triggered()), this, SLOT(setInstantsNumbering())); action->setCheckable(true); action->setChecked(m_labeller->getType() == i->first); numberingGroup->addAction(action); numberingMenu->addAction(action); m_numberingActions[action] = (int)i->first; if (i->first == Labeller::ValueFromTwoLevelCounter) { QMenu *cycleMenu = numberingMenu->addMenu(tr("Cycle size")); QActionGroup *cycleGroup = new QActionGroup(this); int cycles[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16 }; for (int i = 0; i < int(sizeof(cycles)/sizeof(cycles[0])); ++i) { action = new QAction(QString("%1").arg(cycles[i]), this); connect(action, SIGNAL(triggered()), this, SLOT(setInstantsCounterCycle())); action->setCheckable(true); action->setChecked(cycles[i] == m_labeller->getCounterCycleSize()); cycleGroup->addAction(action); cycleMenu->addAction(action); } } if (i->first == Labeller::ValueNone || i->first == Labeller::ValueFromTwoLevelCounter || i->first == Labeller::ValueFromRealTime) { numberingMenu->addSeparator(); } } action = new QAction(tr("Reset Numbering Counters"), this); action->setStatusTip(tr("Reset to 1 all the counters used for counter-based labelling")); connect(action, SIGNAL(triggered()), this, SLOT(resetInstantsCounters())); connect(this, SIGNAL(replacedDocument()), action, SLOT(trigger())); menu->addAction(action); action = new QAction(tr("Set Numbering Counters..."), this); action->setStatusTip(tr("Set the counters used for counter-based labelling")); connect(action, SIGNAL(triggered()), this, SLOT(setInstantsCounters())); menu->addAction(action); action = new QAction(tr("Renumber Selected Instants"), this); action->setStatusTip(tr("Renumber the selected instants using the current labelling scheme")); connect(action, SIGNAL(triggered()), this, SLOT(renumberInstants())); connect(this, SIGNAL(canRenumberInstants(bool)), action, SLOT(setEnabled(bool))); // m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Subdivide Selected Instants..."), this); action->setStatusTip(tr("Add new instants at regular intervals between the selected instants")); connect(action, SIGNAL(triggered()), this, SLOT(subdivideInstants())); connect(this, SIGNAL(canSubdivideInstants(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); action = new QAction(tr("Winnow Selected Instants..."), this); action->setStatusTip(tr("Remove subdivisions, leaving only every Nth instant")); connect(action, SIGNAL(triggered()), this, SLOT(winnowInstants())); connect(this, SIGNAL(canWinnowInstants(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); } void MainWindow::setupViewMenu() { if (m_mainMenusCreated) return; IconLoader il; QAction *action = 0; m_keyReference->setCategory(tr("Panning and Navigation")); QMenu *menu = menuBar()->addMenu(tr("&View")); menu->setTearOffEnabled(true); m_scrollLeftAction = new QAction(tr("Scroll &Left"), this); m_scrollLeftAction->setShortcut(tr("Left")); m_scrollLeftAction->setStatusTip(tr("Scroll the current pane to the left")); connect(m_scrollLeftAction, SIGNAL(triggered()), this, SLOT(scrollLeft())); connect(this, SIGNAL(canScroll(bool)), m_scrollLeftAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_scrollLeftAction); menu->addAction(m_scrollLeftAction); m_scrollRightAction = new QAction(tr("Scroll &Right"), this); m_scrollRightAction->setShortcut(tr("Right")); m_scrollRightAction->setStatusTip(tr("Scroll the current pane to the right")); connect(m_scrollRightAction, SIGNAL(triggered()), this, SLOT(scrollRight())); connect(this, SIGNAL(canScroll(bool)), m_scrollRightAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_scrollRightAction); menu->addAction(m_scrollRightAction); action = new QAction(tr("&Jump Left"), this); action->setShortcut(tr("Ctrl+Left")); action->setStatusTip(tr("Scroll the current pane a big step to the left")); connect(action, SIGNAL(triggered()), this, SLOT(jumpLeft())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("J&ump Right"), this); action->setShortcut(tr("Ctrl+Right")); action->setStatusTip(tr("Scroll the current pane a big step to the right")); connect(action, SIGNAL(triggered()), this, SLOT(jumpRight())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Peek Left"), this); action->setShortcut(tr("Alt+Left")); action->setStatusTip(tr("Scroll the current pane to the left without moving the playback cursor or other panes")); connect(action, SIGNAL(triggered()), this, SLOT(peekLeft())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Peek Right"), this); action->setShortcut(tr("Alt+Right")); action->setStatusTip(tr("Scroll the current pane to the right without moving the playback cursor or other panes")); connect(action, SIGNAL(triggered()), this, SLOT(peekRight())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); m_keyReference->setCategory(tr("Zoom")); m_zoomInAction = new QAction(il.load("zoom-in"), tr("Zoom &In"), this); m_zoomInAction->setShortcut(tr("Up")); m_zoomInAction->setStatusTip(tr("Increase the zoom level")); connect(m_zoomInAction, SIGNAL(triggered()), this, SLOT(zoomIn())); connect(this, SIGNAL(canZoom(bool)), m_zoomInAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_zoomInAction); menu->addAction(m_zoomInAction); m_zoomOutAction = new QAction(il.load("zoom-out"), tr("Zoom &Out"), this); m_zoomOutAction->setShortcut(tr("Down")); m_zoomOutAction->setStatusTip(tr("Decrease the zoom level")); connect(m_zoomOutAction, SIGNAL(triggered()), this, SLOT(zoomOut())); connect(this, SIGNAL(canZoom(bool)), m_zoomOutAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_zoomOutAction); menu->addAction(m_zoomOutAction); action = new QAction(tr("Restore &Default Zoom"), this); action->setStatusTip(tr("Restore the zoom level to the default")); connect(action, SIGNAL(triggered()), this, SLOT(zoomDefault())); connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); m_zoomFitAction = new QAction(il.load("zoom-fit"), tr("Zoom to &Fit"), this); m_zoomFitAction->setShortcut(tr("F")); m_zoomFitAction->setStatusTip(tr("Zoom to show the whole file")); connect(m_zoomFitAction, SIGNAL(triggered()), this, SLOT(zoomToFit())); connect(this, SIGNAL(canZoom(bool)), m_zoomFitAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_zoomFitAction); menu->addAction(m_zoomFitAction); menu->addSeparator(); m_keyReference->setCategory(tr("Display Features")); action = new QAction(tr("Show &Centre Line"), this); action->setShortcut(tr("'")); action->setStatusTip(tr("Show or hide the centre line")); connect(action, SIGNAL(triggered()), this, SLOT(toggleCentreLine())); action->setCheckable(true); action->setChecked(m_viewManager->shouldShowCentreLine()); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Toggle All Time Rulers"), this); action->setShortcut(tr("#")); action->setStatusTip(tr("Show or hide all time rulers")); connect(action, SIGNAL(triggered()), this, SLOT(toggleTimeRulers())); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); QActionGroup *overlayGroup = new QActionGroup(this); ViewManager::OverlayMode mode = m_viewManager->getOverlayMode(); action = new QAction(tr("Show &No Overlays"), this); action->setShortcut(tr("0")); action->setStatusTip(tr("Hide times, layer names, and scale")); connect(action, SIGNAL(triggered()), this, SLOT(showNoOverlays())); action->setCheckable(true); action->setChecked(mode == ViewManager::NoOverlays); overlayGroup->addAction(action); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Show &Minimal Overlays"), this); action->setShortcut(tr("9")); action->setStatusTip(tr("Show times and basic scale")); connect(action, SIGNAL(triggered()), this, SLOT(showMinimalOverlays())); action->setCheckable(true); action->setChecked(mode == ViewManager::StandardOverlays); overlayGroup->addAction(action); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Show &All Overlays"), this); action->setShortcut(tr("8")); action->setStatusTip(tr("Show times, layer names, and scale")); connect(action, SIGNAL(triggered()), this, SLOT(showAllOverlays())); action->setCheckable(true); action->setChecked(mode == ViewManager::AllOverlays); overlayGroup->addAction(action); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Show &Zoom Wheels"), this); action->setShortcut(tr("Z")); action->setStatusTip(tr("Show thumbwheels for zooming horizontally and vertically")); connect(action, SIGNAL(triggered()), this, SLOT(toggleZoomWheels())); action->setCheckable(true); action->setChecked(m_viewManager->getZoomWheelsEnabled()); m_keyReference->registerShortcut(action); menu->addAction(action); m_showPropertyBoxesAction = new QAction(tr("Show Property Bo&xes"), this); m_showPropertyBoxesAction->setShortcut(tr("X")); m_showPropertyBoxesAction->setStatusTip(tr("Show the layer property boxes at the side of the main window")); connect(m_showPropertyBoxesAction, SIGNAL(triggered()), this, SLOT(togglePropertyBoxes())); m_showPropertyBoxesAction->setCheckable(true); m_showPropertyBoxesAction->setChecked(true); m_keyReference->registerShortcut(m_showPropertyBoxesAction); menu->addAction(m_showPropertyBoxesAction); action = new QAction(tr("Show Status &Bar"), this); action->setStatusTip(tr("Show context help information in the status bar at the bottom of the window")); connect(action, SIGNAL(triggered()), this, SLOT(toggleStatusBar())); action->setCheckable(true); action->setChecked(true); menu->addAction(action); QSettings settings; settings.beginGroup("MainWindow"); bool sb = settings.value("showstatusbar", true).toBool(); if (!sb) { action->setChecked(false); statusBar()->hide(); } settings.endGroup(); menu->addSeparator(); action = new QAction(tr("Show La&yer Summary"), this); action->setShortcut(tr("Y")); action->setStatusTip(tr("Open a window displaying the hierarchy of panes and layers in this session")); connect(action, SIGNAL(triggered()), this, SLOT(showLayerTree())); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Show Acti&vity Log"), this); action->setStatusTip(tr("Open a window listing interactions and other events")); connect(action, SIGNAL(triggered()), this, SLOT(showActivityLog())); menu->addAction(action); action = new QAction(tr("Show &Unit Converter"), this); action->setStatusTip(tr("Open a window of pitch and timing conversion utilities")); connect(action, SIGNAL(triggered()), this, SLOT(showUnitConverter())); menu->addAction(action); menu->addSeparator(); #ifndef Q_OS_MAC // Only on non-Mac platforms -- on the Mac this interacts very // badly with the "native" full-screen mode action = new QAction(tr("Go Full-Screen"), this); action->setShortcut(tr("F11")); action->setStatusTip(tr("Expand the pane area to the whole screen")); connect(action, SIGNAL(triggered()), this, SLOT(goFullScreen())); m_keyReference->registerShortcut(action); menu->addAction(action); #endif } void MainWindow::setupPaneAndLayerMenus() { if (m_paneMenu) { m_paneActions.clear(); m_paneMenu->clear(); } else { m_paneMenu = menuBar()->addMenu(tr("&Pane")); m_paneMenu->setTearOffEnabled(true); } if (m_layerMenu) { m_layerActions.clear(); m_layerMenu->clear(); } else { m_layerMenu = menuBar()->addMenu(tr("&Layer")); m_layerMenu->setTearOffEnabled(true); } if (m_rightButtonLayerMenu) { m_rightButtonLayerMenu->clear(); } else { m_rightButtonLayerMenu = m_rightButtonMenu->addMenu(tr("&Layer")); m_rightButtonLayerMenu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); } QMenu *menu = m_paneMenu; IconLoader il; m_keyReference->setCategory(tr("Managing Panes and Layers")); QAction *action = new QAction(il.load("pane"), tr("Add &New Pane"), this); action->setShortcut(tr("N")); action->setStatusTip(tr("Add a new pane containing only a time ruler")); connect(action, SIGNAL(triggered()), this, SLOT(addPane())); connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); m_paneActions[action] = LayerConfiguration(LayerFactory::TimeRuler); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); menu = m_layerMenu; // menu->addSeparator(); LayerFactory::LayerTypeSet emptyLayerTypes = LayerFactory::getInstance()->getValidEmptyLayerTypes(); for (LayerFactory::LayerTypeSet::iterator i = emptyLayerTypes.begin(); i != emptyLayerTypes.end(); ++i) { QIcon icon; QString mainText, tipText, channelText; LayerFactory::LayerType type = *i; QString name = LayerFactory::getInstance()->getLayerPresentationName(type); icon = il.load(LayerFactory::getInstance()->getLayerIconName(type)); mainText = tr("Add New %1 Layer").arg(name); tipText = tr("Add a new empty layer of type %1").arg(name); action = new QAction(icon, mainText, this); action->setStatusTip(tipText); if (type == LayerFactory::Text) { action->setShortcut(tr("T")); m_keyReference->registerShortcut(action); } connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type); menu->addAction(action); m_rightButtonLayerMenu->addAction(action); } m_rightButtonLayerMenu->addSeparator(); menu->addSeparator(); LayerFactory::LayerType backgroundTypes[] = { LayerFactory::Waveform, LayerFactory::Spectrogram, LayerFactory::MelodicRangeSpectrogram, LayerFactory::PeakFrequencySpectrogram, LayerFactory::Spectrum }; std::vector models; if (m_document) models = m_document->getTransformInputModels(); bool plural = (models.size() > 1); if (models.empty()) { models.push_back(getMainModel()); // probably 0 } for (unsigned int i = 0; i < sizeof(backgroundTypes)/sizeof(backgroundTypes[0]); ++i) { const int paneMenuType = 0, layerMenuType = 1; for (int menuType = paneMenuType; menuType <= layerMenuType; ++menuType) { if (menuType == paneMenuType) menu = m_paneMenu; else menu = m_layerMenu; QMenu *submenu = 0; QIcon icon; QString mainText, shortcutText, tipText, channelText; LayerFactory::LayerType type = backgroundTypes[i]; bool mono = true; // Avoid warnings/errors with -Wextra because we aren't explicitly // handling all layer types (-Wall is OK with this because of the // default but the stricter level insists) #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wswitch-enum" #endif switch (type) { case LayerFactory::Waveform: icon = il.load("waveform"); mainText = tr("Add &Waveform"); if (menuType == paneMenuType) { shortcutText = tr("W"); tipText = tr("Add a new pane showing a waveform view"); } else { shortcutText = tr("Shift+W"); tipText = tr("Add a new layer showing a waveform view"); } mono = false; break; case LayerFactory::Spectrogram: icon = il.load("spectrogram"); mainText = tr("Add Spectro&gram"); if (menuType == paneMenuType) { shortcutText = tr("G"); tipText = tr("Add a new pane showing a spectrogram"); } else { shortcutText = tr("Shift+G"); tipText = tr("Add a new layer showing a spectrogram"); } break; case LayerFactory::MelodicRangeSpectrogram: icon = il.load("spectrogram"); mainText = tr("Add &Melodic Range Spectrogram"); if (menuType == paneMenuType) { shortcutText = tr("M"); tipText = tr("Add a new pane showing a spectrogram set up for an overview of note pitches"); } else { shortcutText = tr("Shift+M"); tipText = tr("Add a new layer showing a spectrogram set up for an overview of note pitches"); } break; case LayerFactory::PeakFrequencySpectrogram: icon = il.load("spectrogram"); mainText = tr("Add Pea&k Frequency Spectrogram"); if (menuType == paneMenuType) { shortcutText = tr("K"); tipText = tr("Add a new pane showing a spectrogram set up for tracking frequencies"); } else { shortcutText = tr("Shift+K"); tipText = tr("Add a new layer showing a spectrogram set up for tracking frequencies"); } break; case LayerFactory::Spectrum: icon = il.load("spectrum"); mainText = tr("Add Spectr&um"); if (menuType == paneMenuType) { shortcutText = tr("U"); tipText = tr("Add a new pane showing a frequency spectrum"); } else { shortcutText = tr("Shift+U"); tipText = tr("Add a new layer showing a frequency spectrum"); } break; default: break; } std::vector candidateModels = models; for (std::vector::iterator mi = candidateModels.begin(); mi != candidateModels.end(); ++mi) { Model *model = *mi; int channels = 0; if (model) { DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) channels = dtvm->getChannelCount(); } if (channels < 1 && getMainModel()) { channels = getMainModel()->getChannelCount(); } if (channels < 1) channels = 1; for (int c = 0; c <= channels; ++c) { if (c == 1 && channels == 1) continue; bool isDefault = (c == 0); bool isOnly = (isDefault && (channels == 1)); if (isOnly && !plural) { action = new QAction(icon, mainText, this); action->setShortcut(shortcutText); action->setStatusTip(tipText); if (menuType == paneMenuType) { connect(action, SIGNAL(triggered()), this, SLOT(addPane())); connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); m_paneActions[action] = LayerConfiguration(type, model); } else { connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type, model); } if (shortcutText != "") { m_keyReference->registerShortcut(action); } menu->addAction(action); } else { if (!submenu) { submenu = menu->addMenu(mainText); submenu->setTearOffEnabled(true); } else if (isDefault) { submenu->addSeparator(); } QString actionText; if (c == 0) { if (mono) { actionText = tr("&All Channels Mixed"); } else { actionText = tr("&All Channels"); } } else { actionText = tr("Channel &%1").arg(c); } if (model) { actionText = tr("%1: %2") .arg(model->objectName()) .arg(actionText); } if (isDefault) { action = new QAction(icon, actionText, this); if (!model || model == getMainModel()) { action->setShortcut(shortcutText); } } else { action = new QAction(actionText, this); } action->setStatusTip(tipText); if (menuType == paneMenuType) { connect(action, SIGNAL(triggered()), this, SLOT(addPane())); connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); m_paneActions[action] = LayerConfiguration(type, model, c - 1); } else { connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type, model, c - 1); } submenu->addAction(action); } if (isDefault && menuType == layerMenuType && mi == candidateModels.begin()) { // only add for one model, one channel, one menu on // right button -- the action itself will discover // which model is the correct one (based on pane) action = new QAction(icon, mainText, this); action->setStatusTip(tipText); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type, 0, 0); m_rightButtonLayerMenu->addAction(action); } } } } } m_rightButtonLayerMenu->addSeparator(); menu = m_paneMenu; menu->addSeparator(); action = new QAction(tr("Switch to Previous Pane"), this); action->setShortcut(tr("[")); action->setStatusTip(tr("Make the next pane up in the pane stack current")); connect(action, SIGNAL(triggered()), this, SLOT(previousPane())); connect(this, SIGNAL(canSelectPreviousPane(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Switch to Next Pane"), this); action->setShortcut(tr("]")); action->setStatusTip(tr("Make the next pane down in the pane stack current")); connect(action, SIGNAL(triggered()), this, SLOT(nextPane())); connect(this, SIGNAL(canSelectNextPane(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); action = new QAction(il.load("editdelete"), tr("&Delete Pane"), this); action->setShortcut(tr("Ctrl+Shift+D")); action->setStatusTip(tr("Delete the currently active pane")); connect(action, SIGNAL(triggered()), this, SLOT(deleteCurrentPane())); connect(this, SIGNAL(canDeleteCurrentPane(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu = m_layerMenu; action = new QAction(il.load("timeruler"), tr("Add &Time Ruler"), this); action->setStatusTip(tr("Add a new layer showing a time ruler")); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(LayerFactory::TimeRuler); menu->addAction(action); menu->addSeparator(); m_existingLayersMenu = menu->addMenu(tr("Add &Existing Layer")); m_existingLayersMenu->setTearOffEnabled(true); m_rightButtonLayerMenu->addMenu(m_existingLayersMenu); m_sliceMenu = menu->addMenu(tr("Add S&lice of Layer")); m_sliceMenu->setTearOffEnabled(true); m_rightButtonLayerMenu->addMenu(m_sliceMenu); setupExistingLayersMenus(); menu->addSeparator(); action = new QAction(tr("Switch to Previous Layer"), this); action->setShortcut(tr("{")); action->setStatusTip(tr("Make the previous layer in the pane current")); connect(action, SIGNAL(triggered()), this, SLOT(previousLayer())); connect(this, SIGNAL(canSelectPreviousLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Switch to Next Layer"), this); action->setShortcut(tr("}")); action->setStatusTip(tr("Make the next layer in the pane current")); connect(action, SIGNAL(triggered()), this, SLOT(nextLayer())); connect(this, SIGNAL(canSelectNextLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonLayerMenu->addSeparator(); menu->addSeparator(); QAction *raction = new QAction(tr("&Rename Layer..."), this); raction->setShortcut(tr("R")); raction->setStatusTip(tr("Rename the currently active layer")); connect(raction, SIGNAL(triggered()), this, SLOT(renameCurrentLayer())); connect(this, SIGNAL(canRenameLayer(bool)), raction, SLOT(setEnabled(bool))); menu->addAction(raction); m_rightButtonLayerMenu->addAction(raction); QAction *eaction = new QAction(tr("Edit Layer Data"), this); eaction->setShortcut(tr("E")); eaction->setStatusTip(tr("Edit the currently active layer as a data grid")); connect(eaction, SIGNAL(triggered()), this, SLOT(editCurrentLayer())); connect(this, SIGNAL(canEditLayerTabular(bool)), eaction, SLOT(setEnabled(bool))); menu->addAction(eaction); m_rightButtonLayerMenu->addAction(eaction); action = new QAction(il.load("editdelete"), tr("&Delete Layer"), this); action->setShortcut(tr("Ctrl+D")); action->setStatusTip(tr("Delete the currently active layer")); connect(action, SIGNAL(triggered()), this, SLOT(deleteCurrentLayer())); connect(this, SIGNAL(canDeleteCurrentLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonLayerMenu->addAction(action); m_keyReference->registerShortcut(raction); // rename after delete, so delete layer goes next to delete pane m_keyReference->registerShortcut(eaction); // edit also after delete finaliseMenus(); } void MainWindow::setupTransformsMenu() { if (m_transformsMenu) { m_transformActions.clear(); m_transformActionsReverse.clear(); m_transformsMenu->clear(); } else { m_transformsMenu = menuBar()->addMenu(tr("&Transform")); m_transformsMenu->setTearOffEnabled(true); m_transformsMenu->setSeparatorsCollapsible(true); } TransformFactory *factory = TransformFactory::getInstance(); TransformList transforms = factory->getAllTransformDescriptions(); if (factory->getStartupFailureReport() != "") { pluginPopulationWarning(); } vector types = factory->getAllTransformTypes(); map > categoryMenus; map > makerMenus; map byPluginNameMenus; map > pluginNameMenus; set pendingMenus; m_recentTransformsMenu = m_transformsMenu->addMenu(tr("&Recent Transforms")); m_recentTransformsMenu->setTearOffEnabled(true); m_rightButtonTransformsMenu->addMenu(m_recentTransformsMenu); connect(&m_recentTransforms, SIGNAL(recentChanged()), this, SLOT(setupRecentTransformsMenu())); m_transformsMenu->addSeparator(); m_rightButtonTransformsMenu->addSeparator(); for (vector::iterator i = types.begin(); i != types.end(); ++i) { if (i != types.begin()) { m_transformsMenu->addSeparator(); m_rightButtonTransformsMenu->addSeparator(); } QString byCategoryLabel = tr("%1 by Category") .arg(factory->getTransformTypeName(*i)); SubdividingMenu *byCategoryMenu = new SubdividingMenu(byCategoryLabel, 20, 40); byCategoryMenu->setTearOffEnabled(true); m_transformsMenu->addMenu(byCategoryMenu); m_rightButtonTransformsMenu->addMenu(byCategoryMenu); pendingMenus.insert(byCategoryMenu); vector categories = factory->getTransformCategories(*i); for (vector::iterator j = categories.begin(); j != categories.end(); ++j) { QString category = *j; if (category == "") category = tr("Unclassified"); if (categories.size() < 2) { categoryMenus[*i][category] = byCategoryMenu; continue; } QStringList components = category.split(" > "); QString key; for (QStringList::iterator k = components.begin(); k != components.end(); ++k) { QString parentKey = key; if (key != "") key += " > "; key += *k; if (categoryMenus[*i].find(key) == categoryMenus[*i].end()) { SubdividingMenu *m = new SubdividingMenu(*k, 20, 40); m->setTearOffEnabled(true); pendingMenus.insert(m); categoryMenus[*i][key] = m; if (parentKey == "") { byCategoryMenu->addMenu(m); } else { categoryMenus[*i][parentKey]->addMenu(m); } } } } QString byPluginNameLabel = tr("%1 by Plugin Name") .arg(factory->getTransformTypeName(*i)); byPluginNameMenus[*i] = new SubdividingMenu(byPluginNameLabel); byPluginNameMenus[*i]->setTearOffEnabled(true); m_transformsMenu->addMenu(byPluginNameMenus[*i]); m_rightButtonTransformsMenu->addMenu(byPluginNameMenus[*i]); pendingMenus.insert(byPluginNameMenus[*i]); QString byMakerLabel = tr("%1 by Maker") .arg(factory->getTransformTypeName(*i)); SubdividingMenu *byMakerMenu = new SubdividingMenu(byMakerLabel, 20, 40); byMakerMenu->setTearOffEnabled(true); m_transformsMenu->addMenu(byMakerMenu); m_rightButtonTransformsMenu->addMenu(byMakerMenu); pendingMenus.insert(byMakerMenu); vector makers = factory->getTransformMakers(*i); for (vector::iterator j = makers.begin(); j != makers.end(); ++j) { QString maker = *j; if (maker == "") maker = tr("Unknown"); maker.replace(QRegExp(tr(" [\\(<].*$")), ""); makerMenus[*i][maker] = new SubdividingMenu(maker, 30, 40); makerMenus[*i][maker]->setTearOffEnabled(true); byMakerMenu->addMenu(makerMenus[*i][maker]); pendingMenus.insert(makerMenus[*i][maker]); } } // Names should only be duplicated here if they have the same // plugin name, output name and maker but are in different library // .so names -- that won't happen often I hope std::map idNameSonameMap; std::set seenNames, duplicateNames; for (unsigned int i = 0; i < transforms.size(); ++i) { QString name = transforms[i].name; if (seenNames.find(name) != seenNames.end()) { duplicateNames.insert(name); } else { seenNames.insert(name); } } for (unsigned int i = 0; i < transforms.size(); ++i) { QString name = transforms[i].name; if (name == "") name = transforms[i].identifier; // cerr << "Plugin Name: " << name << endl; TransformDescription::Type type = transforms[i].type; QString typeStr = factory->getTransformTypeName(type); QString category = transforms[i].category; if (category == "") category = tr("Unclassified"); QString maker = transforms[i].maker; if (maker == "") maker = tr("Unknown"); maker.replace(QRegExp(tr(" [\\(<].*$")), ""); QString pluginName = name.section(": ", 0, 0); QString output = name.section(": ", 1); if (duplicateNames.find(pluginName) != duplicateNames.end()) { pluginName = QString("%1 <%2>") .arg(pluginName) .arg(transforms[i].identifier.section(':', 1, 1)); if (output == "") name = pluginName; else name = QString("%1: %2") .arg(pluginName) .arg(output); } QAction *action = new QAction(tr("%1...").arg(name), this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); m_transformActions[action] = transforms[i].identifier; m_transformActionsReverse[transforms[i].identifier] = action; connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); action->setStatusTip(transforms[i].longDescription); if (categoryMenus[type].find(category) == categoryMenus[type].end()) { cerr << "WARNING: MainWindow::setupMenus: Internal error: " << "No category menu for transform \"" << name << "\" (category = \"" << category << "\")" << endl; } else { categoryMenus[type][category]->addAction(action); } if (makerMenus[type].find(maker) == makerMenus[type].end()) { cerr << "WARNING: MainWindow::setupMenus: Internal error: " << "No maker menu for transform \"" << name << "\" (maker = \"" << maker << "\")" << endl; } else { makerMenus[type][maker]->addAction(action); } action = new QAction(tr("%1...").arg(output == "" ? pluginName : output), this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); m_transformActions[action] = transforms[i].identifier; connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); action->setStatusTip(transforms[i].longDescription); // cerr << "Transform: \"" << name << "\": plugin name \"" << pluginName << "\"" << endl; if (pluginNameMenus[type].find(pluginName) == pluginNameMenus[type].end()) { SubdividingMenu *parentMenu = byPluginNameMenus[type]; parentMenu->setTearOffEnabled(true); if (output == "") { parentMenu->addAction(pluginName, action); } else { pluginNameMenus[type][pluginName] = parentMenu->addMenu(pluginName); connect(this, SIGNAL(canAddLayer(bool)), pluginNameMenus[type][pluginName], SLOT(setEnabled(bool))); } } if (pluginNameMenus[type].find(pluginName) != pluginNameMenus[type].end()) { pluginNameMenus[type][pluginName]->addAction(action); } } for (set::iterator i = pendingMenus.begin(); i != pendingMenus.end(); ++i) { (*i)->entriesAdded(); } m_transformsMenu->addSeparator(); m_rightButtonTransformsMenu->addSeparator(); QAction *action = new QAction(tr("Find a Transform..."), this); action->setStatusTip(tr("Search for a transform from the installed plugins, by name or description")); action->setShortcut(tr("Ctrl+M")); connect(action, SIGNAL(triggered()), this, SLOT(findTransform())); // connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); m_transformsMenu->addAction(action); m_rightButtonTransformsMenu->addAction(action); setupRecentTransformsMenu(); } void MainWindow::setupHelpMenu() { QMenu *menu = menuBar()->addMenu(tr("&Help")); menu->setTearOffEnabled(true); m_keyReference->setCategory(tr("Help")); IconLoader il; QString name = QApplication::applicationName(); QAction *action = new QAction(il.load("help"), tr("&Help Reference"), this); action->setShortcut(tr("F1")); action->setStatusTip(tr("Open the %1 reference manual").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(help())); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("&Key and Mouse Reference"), this); action->setShortcut(tr("F2")); action->setStatusTip(tr("Open a window showing the keystrokes you can use in %1").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(keyReference())); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("%1 on the &Web").arg(name), this); action->setStatusTip(tr("Open the %1 website").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(website())); menu->addAction(action); action = new QAction(tr("What's &New?"), this); action->setStatusTip(tr("Show changes in this release of %1").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(whatsNew())); menu->addAction(action); action = new QAction(tr("&About %1").arg(name), this); action->setStatusTip(tr("Show information about %1").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(about())); menu->addAction(action); } void MainWindow::setupRecentFilesMenu() { m_recentFilesMenu->clear(); vector files = m_recentFiles.getRecent(); for (size_t i = 0; i < files.size(); ++i) { /* F. Nicol patch 13 Aug. 2016 */ const QString& path = files[i]; QAction *action = new QAction(path, this); connect(action, &QAction::triggered, [this, path] { openRecentFile(path);}); /* end of patch */ if (i == 0) { action->setShortcut(tr("Ctrl+R")); m_keyReference->registerShortcut (tr("Re-open"), action->shortcut().toString(), tr("Re-open the current or most recently opened file")); } m_recentFilesMenu->addAction(action); } } void MainWindow::setupTemplatesMenu() { m_templatesMenu->clear(); QAction *defaultAction = new QAction(tr("Standard Waveform"), this); defaultAction->setObjectName("default"); connect(defaultAction, SIGNAL(triggered()), this, SLOT(applyTemplate())); m_templatesMenu->addAction(defaultAction); m_templatesMenu->addSeparator(); QAction *action = 0; QStringList templates = ResourceFinder().getResourceFiles("templates", "svt"); bool havePersonal = false; // (ordered by name) std::set byName; foreach (QString t, templates) { if (!t.startsWith(":")) havePersonal = true; byName.insert(QFileInfo(t).baseName()); } foreach (QString t, byName) { if (t.toLower() == "default") continue; action = new QAction(t, this); connect(action, SIGNAL(triggered()), this, SLOT(applyTemplate())); m_templatesMenu->addAction(action); } if (!templates.empty()) m_templatesMenu->addSeparator(); if (!m_templateWatcher) { m_templateWatcher = new QFileSystemWatcher(this); m_templateWatcher->addPath(ResourceFinder().getResourceSaveDir("templates")); connect(m_templateWatcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(setupTemplatesMenu())); } QAction *setDefaultAction = new QAction(tr("Choose Default Template..."), this); setDefaultAction->setObjectName("set_default_template"); connect(setDefaultAction, SIGNAL(triggered()), this, SLOT(preferences())); m_templatesMenu->addSeparator(); m_templatesMenu->addAction(setDefaultAction); m_manageTemplatesAction->setEnabled(havePersonal); } void MainWindow::setupRecentTransformsMenu() { m_recentTransformsMenu->clear(); vector transforms = m_recentTransforms.getRecent(); for (size_t i = 0; i < transforms.size(); ++i) { TransformActionReverseMap::iterator ti = m_transformActionsReverse.find(transforms[i]); if (ti == m_transformActionsReverse.end()) { cerr << "WARNING: MainWindow::setupRecentTransformsMenu: " << "Unknown transform \"" << transforms[i] << "\" in recent transforms list" << endl; continue; } if (i == 0) { ti->second->setShortcut(tr("Ctrl+T")); m_keyReference->registerShortcut (tr("Repeat Transform"), ti->second->shortcut().toString(), tr("Re-select the most recently run transform")); } else { ti->second->setShortcut(QString("")); } m_recentTransformsMenu->addAction(ti->second); } } void MainWindow::setupExistingLayersMenus() { if (!m_existingLayersMenu) return; // should have been created by setupMenus // SVDEBUG << "MainWindow::setupExistingLayersMenu" << endl; m_existingLayersMenu->clear(); m_existingLayerActions.clear(); m_sliceMenu->clear(); m_sliceActions.clear(); IconLoader il; vector orderedLayers; set observedLayers; set sliceableLayers; LayerFactory *factory = LayerFactory::getInstance(); for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; if (observedLayers.find(layer) != observedLayers.end()) { // cerr << "found duplicate layer " << layer << endl; continue; } // cerr << "found new layer " << layer << " (name = " // << layer->getLayerPresentationName() << ")" << endl; orderedLayers.push_back(layer); observedLayers.insert(layer); if (factory->isLayerSliceable(layer)) { sliceableLayers.insert(layer); } } } map observedNames; for (size_t i = 0; i < orderedLayers.size(); ++i) { Layer *layer = orderedLayers[i]; QString name = layer->getLayerPresentationName(); int n = ++observedNames[name]; if (n > 1) name = QString("%1 <%2>").arg(name).arg(n); QIcon icon = il.load(factory->getLayerIconName (factory->getLayerType(layer))); QAction *action = new QAction(icon, name, this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_existingLayerActions[action] = layer; m_existingLayersMenu->addAction(action); if (sliceableLayers.find(layer) != sliceableLayers.end()) { action = new QAction(icon, name, this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_sliceActions[action] = layer; m_sliceMenu->addAction(action); } } m_sliceMenu->setEnabled(!m_sliceActions.empty()); } void MainWindow::setupToolbars() { m_keyReference->setCategory(tr("Playback and Transport Controls")); IconLoader il; QMenu *menu = m_playbackMenu = menuBar()->addMenu(tr("Play&back")); menu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); m_rightButtonPlaybackMenu = m_rightButtonMenu->addMenu(tr("Playback")); QToolBar *toolbar = addToolBar(tr("Playback Toolbar")); m_rwdStartAction = toolbar->addAction(il.load("rewind-start"), tr("Rewind to Start")); m_rwdStartAction->setShortcut(tr("Home")); m_rwdStartAction->setStatusTip(tr("Rewind to the start")); connect(m_rwdStartAction, SIGNAL(triggered()), this, SLOT(rewindStart())); connect(this, SIGNAL(canPlay(bool)), m_rwdStartAction, SLOT(setEnabled(bool))); m_rwdAction = toolbar->addAction(il.load("rewind"), tr("Rewind")); m_rwdAction->setShortcut(tr("PgUp")); m_rwdAction->setStatusTip(tr("Rewind to the previous time instant or time ruler notch")); connect(m_rwdAction, SIGNAL(triggered()), this, SLOT(rewind())); connect(this, SIGNAL(canRewind(bool)), m_rwdAction, SLOT(setEnabled(bool))); m_rwdSimilarAction = new QAction(tr("Rewind to Similar Point"), this); m_rwdSimilarAction->setShortcut(tr("Shift+PgUp")); m_rwdSimilarAction->setStatusTip(tr("Rewind to the previous similarly valued time instant")); connect(m_rwdSimilarAction, SIGNAL(triggered()), this, SLOT(rewindSimilar())); connect(this, SIGNAL(canRewind(bool)), m_rwdSimilarAction, SLOT(setEnabled(bool))); m_playAction = toolbar->addAction(il.load("playpause"), tr("Play / Pause")); m_playAction->setCheckable(true); m_playAction->setShortcut(tr("Space")); m_playAction->setStatusTip(tr("Start or stop playback from the current position")); connect(m_playAction, SIGNAL(triggered()), this, SLOT(play())); connect(m_playSource, SIGNAL(playStatusChanged(bool)), m_playAction, SLOT(setChecked(bool))); connect(m_playSource, SIGNAL(playStatusChanged(bool)), this, SLOT(playStatusChanged(bool))); connect(this, SIGNAL(canPlay(bool)), m_playAction, SLOT(setEnabled(bool))); m_ffwdAction = toolbar->addAction(il.load("ffwd"), tr("Fast Forward")); m_ffwdAction->setShortcut(tr("PgDown")); m_ffwdAction->setStatusTip(tr("Fast-forward to the next time instant or time ruler notch")); connect(m_ffwdAction, SIGNAL(triggered()), this, SLOT(ffwd())); connect(this, SIGNAL(canFfwd(bool)), m_ffwdAction, SLOT(setEnabled(bool))); m_ffwdSimilarAction = new QAction(tr("Fast Forward to Similar Point"), this); m_ffwdSimilarAction->setShortcut(tr("Shift+PgDown")); m_ffwdSimilarAction->setStatusTip(tr("Fast-forward to the next similarly valued time instant")); connect(m_ffwdSimilarAction, SIGNAL(triggered()), this, SLOT(ffwdSimilar())); connect(this, SIGNAL(canFfwd(bool)), m_ffwdSimilarAction, SLOT(setEnabled(bool))); m_ffwdEndAction = toolbar->addAction(il.load("ffwd-end"), tr("Fast Forward to End")); m_ffwdEndAction->setShortcut(tr("End")); m_ffwdEndAction->setStatusTip(tr("Fast-forward to the end")); connect(m_ffwdEndAction, SIGNAL(triggered()), this, SLOT(ffwdEnd())); connect(this, SIGNAL(canPlay(bool)), m_ffwdEndAction, SLOT(setEnabled(bool))); m_recordAction = toolbar->addAction(il.load("record"), tr("Record")); m_recordAction->setCheckable(true); m_recordAction->setShortcut(tr("Ctrl+Space")); m_recordAction->setStatusTip(tr("Record a new audio file")); connect(m_recordAction, SIGNAL(triggered()), this, SLOT(record())); connect(m_recordTarget, SIGNAL(recordStatusChanged(bool)), m_recordAction, SLOT(setChecked(bool))); connect(this, SIGNAL(canRecord(bool)), m_recordAction, SLOT(setEnabled(bool))); toolbar = addToolBar(tr("Play Mode Toolbar")); m_playSelectionAction = toolbar->addAction(il.load("playselection"), tr("Constrain Playback to Selection")); m_playSelectionAction->setCheckable(true); m_playSelectionAction->setChecked(m_viewManager->getPlaySelectionMode()); m_playSelectionAction->setShortcut(tr("s")); m_playSelectionAction->setStatusTip(tr("Constrain playback to the selected regions")); connect(m_viewManager, SIGNAL(playSelectionModeChanged(bool)), m_playSelectionAction, SLOT(setChecked(bool))); connect(m_playSelectionAction, SIGNAL(triggered()), this, SLOT(playSelectionToggled())); connect(this, SIGNAL(canPlaySelection(bool)), m_playSelectionAction, SLOT(setEnabled(bool))); m_playLoopAction = toolbar->addAction(il.load("playloop"), tr("Loop Playback")); m_playLoopAction->setCheckable(true); m_playLoopAction->setChecked(m_viewManager->getPlayLoopMode()); m_playLoopAction->setShortcut(tr("l")); m_playLoopAction->setStatusTip(tr("Loop playback")); connect(m_viewManager, SIGNAL(playLoopModeChanged(bool)), m_playLoopAction, SLOT(setChecked(bool))); connect(m_playLoopAction, SIGNAL(triggered()), this, SLOT(playLoopToggled())); connect(this, SIGNAL(canPlay(bool)), m_playLoopAction, SLOT(setEnabled(bool))); m_soloAction = toolbar->addAction(il.load("solo"), tr("Solo Current Pane")); m_soloAction->setCheckable(true); m_soloAction->setChecked(m_viewManager->getPlaySoloMode()); m_prevSolo = m_viewManager->getPlaySoloMode(); m_soloAction->setShortcut(tr("o")); m_soloAction->setStatusTip(tr("Solo the current pane during playback")); connect(m_viewManager, SIGNAL(playSoloModeChanged(bool)), m_soloAction, SLOT(setChecked(bool))); connect(m_soloAction, SIGNAL(triggered()), this, SLOT(playSoloToggled())); connect(this, SIGNAL(canChangeSolo(bool)), m_soloAction, SLOT(setEnabled(bool))); QAction *alAction = 0; if (Document::canAlign()) { alAction = toolbar->addAction(il.load("align"), tr("Align File Timelines")); alAction->setCheckable(true); alAction->setChecked(m_viewManager->getAlignMode()); alAction->setStatusTip(tr("Treat multiple audio files as versions of the same work, and align their timelines")); connect(m_viewManager, SIGNAL(alignModeChanged(bool)), alAction, SLOT(setChecked(bool))); connect(alAction, SIGNAL(triggered()), this, SLOT(alignToggled())); connect(this, SIGNAL(canAlign(bool)), alAction, SLOT(setEnabled(bool))); } m_keyReference->registerShortcut(m_playAction); m_keyReference->registerShortcut(m_recordAction); m_keyReference->registerShortcut(m_playSelectionAction); m_keyReference->registerShortcut(m_playLoopAction); m_keyReference->registerShortcut(m_soloAction); if (alAction) m_keyReference->registerShortcut(alAction); m_keyReference->registerShortcut(m_rwdAction); m_keyReference->registerShortcut(m_ffwdAction); m_keyReference->registerShortcut(m_rwdSimilarAction); m_keyReference->registerShortcut(m_ffwdSimilarAction); m_keyReference->registerShortcut(m_rwdStartAction); m_keyReference->registerShortcut(m_ffwdEndAction); menu->addAction(m_playAction); menu->addAction(m_recordAction); menu->addAction(m_playSelectionAction); menu->addAction(m_playLoopAction); menu->addAction(m_soloAction); if (alAction) menu->addAction(alAction); menu->addSeparator(); menu->addAction(m_rwdAction); menu->addAction(m_ffwdAction); menu->addSeparator(); menu->addAction(m_rwdSimilarAction); menu->addAction(m_ffwdSimilarAction); menu->addSeparator(); menu->addAction(m_rwdStartAction); menu->addAction(m_ffwdEndAction); menu->addSeparator(); menu->addAction(m_recordAction); menu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_playAction); m_rightButtonPlaybackMenu->addAction(m_recordAction); m_rightButtonPlaybackMenu->addAction(m_playSelectionAction); m_rightButtonPlaybackMenu->addAction(m_playLoopAction); m_rightButtonPlaybackMenu->addAction(m_soloAction); if (alAction) m_rightButtonPlaybackMenu->addAction(alAction); m_rightButtonPlaybackMenu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_rwdAction); m_rightButtonPlaybackMenu->addAction(m_ffwdAction); m_rightButtonPlaybackMenu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_rwdStartAction); m_rightButtonPlaybackMenu->addAction(m_ffwdEndAction); m_rightButtonPlaybackMenu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_recordAction); m_rightButtonPlaybackMenu->addSeparator(); QAction *fastAction = menu->addAction(tr("Speed Up")); fastAction->setShortcut(tr("Ctrl+PgUp")); fastAction->setStatusTip(tr("Time-stretch playback to speed it up without changing pitch")); connect(fastAction, SIGNAL(triggered()), this, SLOT(speedUpPlayback())); connect(this, SIGNAL(canSpeedUpPlayback(bool)), fastAction, SLOT(setEnabled(bool))); QAction *slowAction = menu->addAction(tr("Slow Down")); slowAction->setShortcut(tr("Ctrl+PgDown")); slowAction->setStatusTip(tr("Time-stretch playback to slow it down without changing pitch")); connect(slowAction, SIGNAL(triggered()), this, SLOT(slowDownPlayback())); connect(this, SIGNAL(canSlowDownPlayback(bool)), slowAction, SLOT(setEnabled(bool))); QAction *normalAction = menu->addAction(tr("Restore Normal Speed")); normalAction->setShortcut(tr("Ctrl+Home")); normalAction->setStatusTip(tr("Restore non-time-stretched playback")); connect(normalAction, SIGNAL(triggered()), this, SLOT(restoreNormalPlayback())); connect(this, SIGNAL(canChangePlaybackSpeed(bool)), normalAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(fastAction); m_keyReference->registerShortcut(slowAction); m_keyReference->registerShortcut(normalAction); m_rightButtonPlaybackMenu->addAction(fastAction); m_rightButtonPlaybackMenu->addAction(slowAction); m_rightButtonPlaybackMenu->addAction(normalAction); toolbar = addToolBar(tr("Edit Toolbar")); CommandHistory::getInstance()->registerToolbar(toolbar); toolbar = addToolBar(tr("Tools Toolbar")); QActionGroup *group = new QActionGroup(this); m_keyReference->setCategory(tr("Tool Selection")); QAction *action = toolbar->addAction(il.load("navigate"), tr("Navigate")); action->setCheckable(true); action->setChecked(true); action->setShortcut(tr("1")); action->setStatusTip(tr("Navigate")); connect(action, SIGNAL(triggered()), this, SLOT(toolNavigateSelected())); connect(this, SIGNAL(replacedDocument()), action, SLOT(trigger())); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::NavigateMode] = action; m_keyReference->setCategory (tr("Navigate Tool Mouse Actions")); m_keyReference->registerShortcut (tr("Navigate"), tr("Left"), tr("Click left button and drag to move around")); m_keyReference->registerShortcut (tr("Zoom to Area"), tr("Shift+Left"), tr("Shift-click left button and drag to zoom to a rectangular area")); m_keyReference->registerShortcut (tr("Relocate"), tr("Double-Click Left"), tr("Double-click left button to jump to clicked location")); m_keyReference->registerShortcut (tr("Edit"), tr("Double-Click Left"), tr("Double-click left button on an item to edit it")); m_keyReference->setCategory(tr("Tool Selection")); action = toolbar->addAction(il.load("select"), tr("Select")); action->setCheckable(true); action->setShortcut(tr("2")); action->setStatusTip(tr("Select ranges")); connect(action, SIGNAL(triggered()), this, SLOT(toolSelectSelected())); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::SelectMode] = action; m_keyReference->setCategory (tr("Select Tool Mouse Actions")); m_keyReference->registerShortcut (tr("Select"), tr("Left"), tr("Click left button and drag to select region; drag region edge to resize")); #ifdef Q_OS_MAC m_keyReference->registerShortcut (tr("Multi Select"), tr("Ctrl+Left"), tr("Cmd-click left button and drag to select an additional region")); #else m_keyReference->registerShortcut (tr("Multi Select"), tr("Ctrl+Left"), tr("Ctrl-click left button and drag to select an additional region")); #endif m_keyReference->registerShortcut (tr("Fine Select"), tr("Shift+Left"), tr("Shift-click left button and drag to select without snapping to items or grid")); m_keyReference->setCategory(tr("Tool Selection")); action = toolbar->addAction(il.load("move"), tr("Edit")); action->setCheckable(true); action->setShortcut(tr("3")); action->setStatusTip(tr("Edit items in layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolEditSelected())); connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::EditMode] = action; m_keyReference->setCategory (tr("Edit Tool Mouse Actions")); m_keyReference->registerShortcut (tr("Move"), tr("Left"), tr("Click left button on an item or selected region and drag to move")); m_keyReference->registerShortcut (tr("Edit"), tr("Double-Click Left"), tr("Double-click left button on an item to edit it")); m_keyReference->setCategory(tr("Tool Selection")); action = toolbar->addAction(il.load("draw"), tr("Draw")); action->setCheckable(true); action->setShortcut(tr("4")); action->setStatusTip(tr("Draw new items in layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolDrawSelected())); connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::DrawMode] = action; m_keyReference->setCategory (tr("Draw Tool Mouse Actions")); m_keyReference->registerShortcut (tr("Draw"), tr("Left"), tr("Click left button and drag to create new item")); m_keyReference->setCategory(tr("Tool Selection")); action = toolbar->addAction(il.load("erase"), tr("Erase")); action->setCheckable(true); action->setShortcut(tr("5")); action->setStatusTip(tr("Erase items from layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolEraseSelected())); connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::EraseMode] = action; m_keyReference->setCategory (tr("Erase Tool Mouse Actions")); m_keyReference->registerShortcut (tr("Erase"), tr("Left"), tr("Click left button on an item to remove it from the layer")); m_keyReference->setCategory(tr("Tool Selection")); action = toolbar->addAction(il.load("measure"), tr("Measure")); action->setCheckable(true); action->setShortcut(tr("6")); action->setStatusTip(tr("Make measurements in layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolMeasureSelected())); connect(this, SIGNAL(canMeasureLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::MeasureMode] = action; m_keyReference->setCategory (tr("Measure Tool Mouse Actions")); m_keyReference->registerShortcut (tr("Measure Area"), tr("Left"), tr("Click left button and drag to measure a rectangular area")); m_keyReference->registerShortcut (tr("Measure Item"), tr("Double-Click Left"), tr("Click left button and drag to measure extents of an item or shape")); m_keyReference->registerShortcut (tr("Zoom to Area"), tr("Shift+Left"), tr("Shift-click left button and drag to zoom to a rectangular area")); toolNavigateSelected(); Pane::registerShortcuts(*m_keyReference); } void MainWindow::connectLayerEditDialog(ModelDataTableDialog *dialog) { MainWindowBase::connectLayerEditDialog(dialog); QToolBar *toolbar = dialog->getPlayToolbar(); if (toolbar) { toolbar->addAction(m_rwdStartAction); toolbar->addAction(m_rwdAction); toolbar->addAction(m_playAction); toolbar->addAction(m_ffwdAction); toolbar->addAction(m_ffwdEndAction); } } void MainWindow::updateMenuStates() { MainWindowBase::updateMenuStates(); Pane *currentPane = 0; Layer *currentLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentLayer = currentPane->getSelectedLayer(); bool haveCurrentPane = (currentPane != 0); bool haveCurrentLayer = (haveCurrentPane && (currentLayer != 0)); bool havePlayTarget = (m_playTarget != 0 || m_audioIO != 0); bool haveSelection = (m_viewManager && !m_viewManager->getSelections().empty()); bool haveCurrentEditableLayer = (haveCurrentLayer && currentLayer->isLayerEditable()); bool haveCurrentTimeInstantsLayer = (haveCurrentLayer && dynamic_cast(currentLayer)); bool haveCurrentTimeValueLayer = (haveCurrentLayer && dynamic_cast(currentLayer)); bool alignMode = m_viewManager && m_viewManager->getAlignMode(); emit canChangeSolo(havePlayTarget && !alignMode); emit canAlign(havePlayTarget && m_document && m_document->canAlign()); emit canChangePlaybackSpeed(true); int v = m_playSpeed->value(); emit canSpeedUpPlayback(v < m_playSpeed->maximum()); emit canSlowDownPlayback(v > m_playSpeed->minimum()); if (m_viewManager && (m_viewManager->getToolMode() == ViewManager::MeasureMode)) { emit canDeleteSelection(haveCurrentLayer); m_deleteSelectedAction->setText(tr("&Delete Current Measurement")); m_deleteSelectedAction->setStatusTip(tr("Delete the measurement currently under the mouse pointer")); } else { emit canDeleteSelection(haveSelection && haveCurrentEditableLayer); m_deleteSelectedAction->setText(tr("&Delete Selected Items")); m_deleteSelectedAction->setStatusTip(tr("Delete items in current selection from the current layer")); } if (m_ffwdAction && m_rwdAction) { if (haveCurrentTimeInstantsLayer) { m_ffwdAction->setText(tr("Fast Forward to Next Instant")); m_ffwdAction->setStatusTip(tr("Fast forward to the next time instant in the current layer")); m_rwdAction->setText(tr("Rewind to Previous Instant")); m_rwdAction->setStatusTip(tr("Rewind to the previous time instant in the current layer")); } else if (haveCurrentTimeValueLayer) { m_ffwdAction->setText(tr("Fast Forward to Next Point")); m_ffwdAction->setStatusTip(tr("Fast forward to the next point in the current layer")); m_rwdAction->setText(tr("Rewind to Previous Point")); m_rwdAction->setStatusTip(tr("Rewind to the previous point in the current layer")); } else { m_ffwdAction->setText(tr("Fast Forward")); m_ffwdAction->setStatusTip(tr("Fast forward")); m_rwdAction->setText(tr("Rewind")); m_rwdAction->setStatusTip(tr("Rewind")); } } } void MainWindow::updateDescriptionLabel() { if (!getMainModel()) { m_descriptionLabel->setText(tr("No audio file loaded.")); return; } QString description; //!!!??? sv_samplerate_t ssr = getMainModel()->getSampleRate(); sv_samplerate_t tsr = ssr; if (m_playSource) tsr = m_playSource->getDeviceSampleRate(); if (ssr != tsr) { description = tr("%1Hz (resampling to %2Hz)").arg(ssr).arg(tsr); } else { description = QString("%1Hz").arg(ssr); } description = QString("%1 - %2") .arg(RealTime::frame2RealTime(getMainModel()->getEndFrame(), ssr) .toText(false).c_str()) .arg(description); m_descriptionLabel->setText(description); } void MainWindow::documentModified() { //!!! MainWindowBase::documentModified(); } void MainWindow::documentRestored() { //!!! MainWindowBase::documentRestored(); } void MainWindow::toolNavigateSelected() { m_viewManager->setToolMode(ViewManager::NavigateMode); } void MainWindow::toolSelectSelected() { m_viewManager->setToolMode(ViewManager::SelectMode); } void MainWindow::toolEditSelected() { m_viewManager->setToolMode(ViewManager::EditMode); } void MainWindow::toolDrawSelected() { m_viewManager->setToolMode(ViewManager::DrawMode); } void MainWindow::toolEraseSelected() { m_viewManager->setToolMode(ViewManager::EraseMode); } void MainWindow::toolMeasureSelected() { m_viewManager->setToolMode(ViewManager::MeasureMode); } void MainWindow::importAudio() { QString path = getOpenFileName(FileFinder::AudioFile); if (path != "") { if (openAudio(path, ReplaceSession) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Audio file \"%1\" could not be opened").arg(path)); } } } void MainWindow::importMoreAudio() { QString path = getOpenFileName(FileFinder::AudioFile); if (path != "") { if (openAudio(path, CreateAdditionalModel) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Audio file \"%1\" could not be opened").arg(path)); } } } void MainWindow::replaceMainAudio() { QString path = getOpenFileName(FileFinder::AudioFile); if (path != "") { if (openAudio(path, ReplaceMainModel) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Audio file \"%1\" could not be opened").arg(path)); } } } void MainWindow::exportAudio() { exportAudio(false); } void MainWindow::exportAudioData() { exportAudio(true); } void MainWindow::exportAudio(bool asData) { if (!getMainModel()) return; RangeSummarisableTimeValueModel *model = getMainModel(); std::set otherModels; RangeSummarisableTimeValueModel *current = model; if (m_paneStack) { for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; cerr << "layer = " << layer->objectName() << endl; Model *m = layer->getModel(); RangeSummarisableTimeValueModel *wm = dynamic_cast(m); if (wm) { cerr << "found: " << wm->objectName() << endl; otherModels.insert(wm); if (pane == m_paneStack->getCurrentPane()) { current = wm; } } } } } if (!otherModels.empty()) { std::map m; m[tr("1. %2").arg(model->objectName())] = model; int n = 2; int c = 0; for (std::set::const_iterator i = otherModels.begin(); i != otherModels.end(); ++i) { if (*i == model) continue; m[tr("%1. %2").arg(n).arg((*i)->objectName())] = *i; ++n; if (*i == current) c = n-1; } QStringList items; for (std::map ::const_iterator i = m.begin(); i != m.end(); ++i) { items << i->first; } if (items.size() > 1) { bool ok = false; QString item = QInputDialog::getItem (this, tr("Select audio file to export"), tr("Which audio file do you want to export from?"), items, c, false, &ok); if (!ok || item.isEmpty()) return; if (m.find(item) == m.end()) { cerr << "WARNING: Model " << item << " not found in list!" << endl; } else { model = m[item]; } } } QString path; if (asData) { path = getSaveFileName(FileFinder::CSVFile); } else { path = getSaveFileName(FileFinder::AudioFile); } if (path == "") return; bool ok = false; QString error; MultiSelection ms = m_viewManager->getSelection(); MultiSelection::SelectionList selections = m_viewManager->getSelections(); bool multiple = false; MultiSelection *selectionToWrite = 0; if (selections.size() == 1) { QStringList items; items << tr("Export the selected region only") << tr("Export the whole audio file"); bool ok = false; QString item = ListInputDialog::getItem (this, tr("Select region to export"), tr("Which region from the original audio file do you want to export?"), items, 0, &ok); if (!ok || item.isEmpty()) return; if (item == items[0]) selectionToWrite = &ms; } else if (selections.size() > 1) { if (!asData) { // Multi-file export not supported for data QStringList items; items << tr("Export the selected regions into a single file") << tr("Export the selected regions into separate files") << tr("Export the whole file"); QString item = ListInputDialog::getItem (this, tr("Select region to export"), tr("Multiple regions of the original audio file are selected.\nWhat do you want to export?"), items, 0, &ok); if (!ok || item.isEmpty()) return; if (item == items[0]) { selectionToWrite = &ms; } else if (item == items[1]) { multiple = true; } } else { // asData selectionToWrite = &ms; } if (multiple) { // Can only happen when asData false int n = 1; QString base = path; base.replace(".wav", ""); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { MultiSelection subms; subms.setSelection(*i); QString subpath = QString("%1.%2.wav").arg(base).arg(n); ++n; if (QFileInfo(subpath).exists()) { error = tr("Fragment file %1 already exists, aborting").arg(subpath); break; } WavFileWriter subwriter(subpath, model->getSampleRate(), model->getChannelCount(), WavFileWriter::WriteToTemporary); subwriter.writeModel(model, &subms); ok = subwriter.isOK(); if (!ok) { error = subwriter.getError(); break; } } } } if (!multiple) { if (asData) { CSVFileWriter writer(path, model, ((QFileInfo(path).suffix() == "csv") ? "," : "\t")); if (selectionToWrite) { writer.writeSelection(selectionToWrite); } else { writer.write(); } ok = writer.isOK(); error = writer.getError(); } else { WavFileWriter writer(path, model->getSampleRate(), model->getChannelCount(), WavFileWriter::WriteToTemporary); writer.writeModel(model, selectionToWrite); ok = writer.isOK(); error = writer.getError(); } } if (ok) { if (multiple) { emit activity(tr("Export multiple audio files")); } else { emit activity(tr("Export audio to \"%1\"").arg(path)); m_recentFiles.addFile(path); } } else { QMessageBox::critical(this, tr("Failed to write file"), error); } } void MainWindow::importLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindow::importLayer: no current pane" << endl; return; } if (!getMainModel()) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindow::importLayer: No main model -- hence no default sample rate available" << endl; return; } QString path = getOpenFileName(FileFinder::LayerFile); if (path != "") { FileOpenStatus status = openLayer(path); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Layer file %1 could not be opened.").arg(path)); return; } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(path)); } } } void MainWindow::exportLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; Layer *layer = pane->getSelectedLayer(); if (!layer) return; Model *model = layer->getModel(); if (!model) return; FileFinder::FileType type = FileFinder::LayerFileNoMidi; if (dynamic_cast(model)) type = FileFinder::LayerFile; QString path = getSaveFileName(type); if (path == "") return; if (QFileInfo(path).suffix() == "") path += ".svl"; QString suffix = QFileInfo(path).suffix().toLower(); QString error; if (suffix == "xml" || suffix == "svl") { QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { error = tr("Failed to open file %1 for writing").arg(path); } else { QTextStream out(&file); out.setCodec(QTextCodec::codecForName("UTF-8")); out << "\n" << "\n" << "\n" << " \n"; model->toXml(out, " "); out << " \n" << " \n"; layer->toXml(out, " "); out << " \n" << "\n"; } } else if (suffix == "mid" || suffix == "midi") { NoteModel *nm = dynamic_cast(model); if (!nm) { error = tr("Can't export non-note layers to MIDI"); } else { MIDIFileWriter writer(path, nm, nm->getSampleRate()); writer.write(); if (!writer.isOK()) { error = writer.getError(); } } } else if (suffix == "ttl" || suffix == "n3") { if (!RDFExporter::canExportModel(model)) { error = tr("Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values)"); } else { RDFExporter exporter(path, model); exporter.write(); if (!exporter.isOK()) { error = exporter.getError(); } } } else { CSVFileWriter writer(path, model, ((suffix == "csv") ? "," : "\t")); writer.write(); if (!writer.isOK()) { error = writer.getError(); } } if (error != "") { QMessageBox::critical(this, tr("Failed to write file"), error); } else { m_recentFiles.addFile(path); emit activity(tr("Export layer to \"%1\"").arg(path)); } } void MainWindow::exportImage() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; QString path = getSaveFileName(FileFinder::ImageFile); if (path == "") return; if (QFileInfo(path).suffix() == "") path += ".png"; bool haveSelection = m_viewManager && !m_viewManager->getSelections().empty(); QSize total, visible, selected; total = pane->getRenderedImageSize(); visible = pane->getRenderedPartImageSize(pane->getFirstVisibleFrame(), pane->getLastVisibleFrame()); sv_frame_t sf0 = 0, sf1 = 0; if (haveSelection) { MultiSelection::SelectionList selections = m_viewManager->getSelections(); sf0 = selections.begin()->getStartFrame(); MultiSelection::SelectionList::iterator e = selections.end(); --e; sf1 = e->getEndFrame(); selected = pane->getRenderedPartImageSize(sf0, sf1); } QStringList items; items << tr("Export the whole pane (%1x%2 pixels)") .arg(total.width()).arg(total.height()); items << tr("Export the visible area only (%1x%2 pixels)") .arg(visible.width()).arg(visible.height()); if (haveSelection) { items << tr("Export the selection extent (%1x%2 pixels)") .arg(selected.width()).arg(selected.height()); } else { items << tr("Export the selection extent"); } QSettings settings; settings.beginGroup("MainWindow"); int deflt = settings.value("lastimageexportregion", 0).toInt(); if (deflt == 2 && !haveSelection) deflt = 1; if (deflt == 0 && total.width() > 32767) deflt = 1; ListInputDialog *lid = new ListInputDialog (this, tr("Select region to export"), tr("Which region of the current pane do you want to export as an image?"), items, deflt); if (!haveSelection) { lid->setItemAvailability(2, false); } if (total.width() > 32767) { // appears to be limit of a QImage lid->setItemAvailability(0, false); lid->setFootnote(tr("Note: the whole pane is too wide to be exported as a single image.")); } bool ok = lid->exec(); QString item = lid->getCurrentString(); delete lid; if (!ok || item.isEmpty()) return; settings.setValue("lastimageexportregion", deflt); QImage *image = 0; if (item == items[0]) { image = pane->renderToNewImage(); } else if (item == items[1]) { image = pane->renderPartToNewImage(pane->getFirstVisibleFrame(), pane->getLastVisibleFrame()); } else if (haveSelection) { image = pane->renderPartToNewImage(sf0, sf1); } if (!image) return; if (!image->save(path, "PNG")) { QMessageBox::critical(this, tr("Failed to save image file"), tr("Failed to save image file %1").arg(path)); } delete image; } void MainWindow::exportSVG() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; QString path = getSaveFileName(FileFinder::SVGFile); if (path == "") return; if (QFileInfo(path).suffix() == "") path += ".svg"; bool haveSelection = m_viewManager && !m_viewManager->getSelections().empty(); sv_frame_t sf0 = 0, sf1 = 0; if (haveSelection) { MultiSelection::SelectionList selections = m_viewManager->getSelections(); sf0 = selections.begin()->getStartFrame(); MultiSelection::SelectionList::iterator e = selections.end(); --e; sf1 = e->getEndFrame(); } QStringList items; items << tr("Export the whole pane"); items << tr("Export the visible area only"); items << tr("Export the selection extent"); QSettings settings; settings.beginGroup("MainWindow"); int deflt = settings.value("lastsvgexportregion", 0).toInt(); if (deflt == 2 && !haveSelection) deflt = 1; ListInputDialog *lid = new ListInputDialog (this, tr("Select region to export"), tr("Which region of the current pane do you want to export as a scalable SVG image?"), items, deflt); if (!haveSelection) { lid->setItemAvailability(2, false); } bool ok = lid->exec(); QString item = lid->getCurrentString(); delete lid; if (!ok || item.isEmpty()) return; settings.setValue("lastsvgexportregion", deflt); bool result = false; if (item == items[0]) { result = pane->renderToSvgFile(path ); } else if (item == items[1]) { result = pane->renderPartToSvgFile(path, pane->getFirstVisibleFrame(), pane->getLastVisibleFrame()); } else if (haveSelection) { result = pane->renderPartToSvgFile(path, sf0, sf1); } if (!result) { QMessageBox::critical(this, tr("Failed to save SVG file"), tr("Failed to save SVG file %1").arg(path)); } } void MainWindow::browseRecordedAudio() { if (!m_recordTarget) return; QString path = m_recordTarget->getRecordContainerFolder(); if (path == "") path = m_recordTarget->getRecordFolder(); if (path == "") return; openLocalFolder(path); } void MainWindow::newSession() { if (!checkSaveModified()) return; closeSession(); createDocument(); Pane *pane = m_paneStack->addPane(); connect(pane, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); if (!m_timeRulerLayer) { m_timeRulerLayer = m_document->createMainModelLayer (LayerFactory::TimeRuler); } m_document->addLayerToView(pane, m_timeRulerLayer); Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform); m_document->addLayerToView(pane, waveform); m_overview->registerView(pane); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); documentRestored(); updateMenuStates(); } void MainWindow::documentReplaced() { if (m_document) { connect(m_document, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); } } void MainWindow::closeSession() { if (!checkSaveModified()) return; while (m_paneStack->getPaneCount() > 0) { Pane *pane = m_paneStack->getPane(m_paneStack->getPaneCount() - 1); while (pane->getLayerCount() > 0) { m_document->removeLayerFromView (pane, pane->getLayer(pane->getLayerCount() - 1)); } m_overview->unregisterView(pane); m_paneStack->deletePane(pane); } while (m_paneStack->getHiddenPaneCount() > 0) { Pane *pane = m_paneStack->getHiddenPane (m_paneStack->getHiddenPaneCount() - 1); while (pane->getLayerCount() > 0) { m_document->removeLayerFromView (pane, pane->getLayer(pane->getLayerCount() - 1)); } m_overview->unregisterView(pane); m_paneStack->deletePane(pane); } delete m_layerTreeDialog.data(); delete m_preferencesDialog.data(); m_activityLog->hide(); m_unitConverter->hide(); m_keyReference->hide(); delete m_document; m_document = 0; m_viewManager->clearSelections(); m_timeRulerLayer = 0; // document owned this m_sessionFile = ""; setWindowTitle(QApplication::applicationName()); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); documentRestored(); } void MainWindow::openSomething() { QString orig = m_audioFile; if (orig == "") orig = "."; else orig = QFileInfo(orig).absoluteDir().canonicalPath(); QString path = getOpenFileName(FileFinder::AnyFile); if (path.isEmpty()) return; FileOpenStatus status = openPath(path, ReplaceSession); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

File \"%1\" could not be opened").arg(path)); } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(path)); } } void MainWindow::openLocation() { QSettings settings; settings.beginGroup("MainWindow"); QString lastLocation = settings.value("lastremote", "").toString(); bool ok = false; QString text = QInputDialog::getText (this, tr("Open Location"), tr("Please enter the URL of the location to open:"), QLineEdit::Normal, lastLocation, &ok); if (!ok) return; settings.setValue("lastremote", text); if (text.isEmpty()) return; FileOpenStatus status = openPath(text, AskUser); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Open failed

URL \"%1\" could not be opened").arg(text)); } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(text)); } } void MainWindow::openRecentFile(const QString& path) { /* F. Nicol patch 13 Aug. 2016 */ #if 0 QObject *obj = sender(); QAction *action = dynamic_cast(obj); if (!action) { cerr << "WARNING: MainWindow::openRecentFile: sender is not an action" << endl; return; } QString path = action->text(); #endif /* End of F. Nicol patch 13 Aug. 2016 */ if (path == "") return; FileOpenStatus status = openPath(path, ReplaceSession); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Open failed

File or URL \"%1\" could not be opened").arg(path)); } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(path)); } } void MainWindow::applyTemplate() { QObject *s = sender(); QAction *action = qobject_cast(s); if (!action) { cerr << "WARNING: MainWindow::applyTemplate: sender is not an action" << endl; return; } QString n = action->objectName(); if (n == "") n = action->text(); if (n == "") { cerr << "WARNING: MainWindow::applyTemplate: sender has no name" << endl; return; } QString mainModelLocation; WaveFileModel *mm = getMainModel(); if (mm) mainModelLocation = mm->getLocation(); if (mainModelLocation != "") { openAudio(mainModelLocation, ReplaceSession, n); } else { openSessionTemplate(n); } } void MainWindow::saveSessionAsTemplate() { QDialog *d = new QDialog(this); d->setWindowTitle(tr("Enter template name")); QGridLayout *layout = new QGridLayout; d->setLayout(layout); layout->addWidget(new QLabel(tr("Please enter a name for the saved template:")), 0, 0); QLineEdit *lineEdit = new QLineEdit; layout->addWidget(lineEdit, 1, 0); QCheckBox *makeDefault = new QCheckBox(tr("Set as default template for future audio files")); layout->addWidget(makeDefault, 2, 0); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, 3, 0); connect(bb, SIGNAL(accepted()), d, SLOT(accept())); connect(bb, SIGNAL(accepted()), d, SLOT(accept())); connect(bb, SIGNAL(rejected()), d, SLOT(reject())); if (d->exec() == QDialog::Accepted) { QString name = lineEdit->text(); name.replace(QRegExp("[^\\w\\s\\.\"'-]"), "_"); ResourceFinder rf; QString dir = rf.getResourceSaveDir("templates"); QString filename = QString("%1/%2.svt").arg(dir).arg(name); if (QFile(filename).exists()) { if (QMessageBox::warning(this, tr("Template file exists"), tr("Template file exists

The template \"%1\" already exists.
Overwrite it?").arg(name), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel) != QMessageBox::Ok) { delete d; return; } } if (saveSessionTemplate(filename)) { if (makeDefault->isChecked()) { setDefaultSessionTemplate(name); } } } delete d; } void MainWindow::manageSavedTemplates() { ResourceFinder rf; QDesktopServices::openUrl("file:" + rf.getResourceSaveDir("templates")); } void MainWindow::paneAdded(Pane *pane) { if (m_overview) m_overview->registerView(pane); } void MainWindow::paneHidden(Pane *pane) { if (m_overview) m_overview->unregisterView(pane); } void MainWindow::paneAboutToBeDeleted(Pane *pane) { if (m_overview) m_overview->unregisterView(pane); } void MainWindow::paneDropAccepted(Pane *pane, QStringList uriList) { if (pane) m_paneStack->setCurrentPane(pane); for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) { FileOpenStatus status; if (i == uriList.begin()) { status = openPath(*i, ReplaceCurrentPane); } else { status = openPath(*i, CreateAdditionalModel); } if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open dropped URL"), tr("Open failed

Dropped URL \"%1\" could not be opened").arg(*i)); break; } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open dropped URL"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(*i)); break; } else if (status == FileOpenCancelled) { break; } } } void MainWindow::paneDropAccepted(Pane *pane, QString text) { if (pane) m_paneStack->setCurrentPane(pane); QUrl testUrl(text); if (testUrl.scheme() == "file" || testUrl.scheme() == "http" || testUrl.scheme() == "ftp") { QStringList list; list.push_back(text); paneDropAccepted(pane, list); return; } //!!! open as text -- but by importing as if a CSV, or just adding //to a text layer? } void MainWindow::closeEvent(QCloseEvent *e) { // cerr << "MainWindow::closeEvent" << endl; if (m_openingAudioFile) { // cerr << "Busy - ignoring close event" << endl; e->ignore(); return; } if (!m_abandoning && !checkSaveModified()) { // cerr << "Close refused by user - ignoring close event" << endl; e->ignore(); return; } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("maximised", isMaximized()); if (!isMaximized()) { settings.setValue("size", size()); settings.setValue("position", pos()); } settings.endGroup(); if (m_preferencesDialog && m_preferencesDialog->isVisible()) { closeSession(); // otherwise we'll have to wait for prefs changes m_preferencesDialog->applicationClosing(true); } closeSession(); e->accept(); return; } bool MainWindow::commitData(bool mayAskUser) { if (mayAskUser) { bool rv = checkSaveModified(); if (rv) { if (m_preferencesDialog && m_preferencesDialog->isVisible()) { m_preferencesDialog->applicationClosing(false); } } return rv; } else { if (m_preferencesDialog && m_preferencesDialog->isVisible()) { m_preferencesDialog->applicationClosing(true); } if (!m_documentModified) return true; // If we can't check with the user first, then we can't save // to the original session file (even if we have it) -- have // to use a temporary file QString svDirBase = ".sv1"; QString svDir = QDir::home().filePath(svDirBase); if (!QFileInfo(svDir).exists()) { if (!QDir::home().mkdir(svDirBase)) return false; } else { if (!QFileInfo(svDir).isDir()) return false; } // This name doesn't have to be unguessable #ifndef _WIN32 QString fname = QString("tmp-%1-%2.sv") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")) .arg(QProcess().pid()); #else QString fname = QString("tmp-%1.sv") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); #endif QString fpath = QDir(svDir).filePath(fname); if (saveSessionFile(fpath)) { m_recentFiles.addFile(fpath); emit activity(tr("Export image to \"%1\"").arg(fpath)); return true; } else { return false; } } } bool MainWindow::checkSaveModified() { // Called before some destructive operation (e.g. new session, // exit program). Return true if we can safely proceed, false to // cancel. if (!m_documentModified) return true; emit hideSplash(); int button = QMessageBox::warning(this, tr("Session modified"), tr("Session modified

The current session has been modified.
Do you want to save it?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Yes) { saveSession(); if (m_documentModified) { // save failed -- don't proceed! return false; } else { return true; // saved, so it's safe to continue now } } else if (button == QMessageBox::No) { m_documentModified = false; // so we know to abandon it return true; } // else cancel return false; } bool MainWindow::shouldCreateNewSessionForRDFAudio(bool *cancel) { //!!! This is very similar to part of MainWindowBase::openAudio -- //!!! make them a bit more uniform QSettings settings; settings.beginGroup("MainWindow"); bool prevNewSession = settings.value("newsessionforrdfaudio", true).toBool(); settings.endGroup(); bool newSession = true; QStringList items; items << tr("Close the current session and create a new one") << tr("Add this data to the current session"); bool ok = false; QString item = ListInputDialog::getItem (this, tr("Select target for import"), tr("Select a target for import

This RDF document refers to one or more audio files.
You already have an audio waveform loaded.
What would you like to do with the new data?"), items, prevNewSession ? 0 : 1, &ok); if (!ok || item.isEmpty()) { *cancel = true; return false; } newSession = (item == items[0]); settings.beginGroup("MainWindow"); settings.setValue("newsessionforrdfaudio", newSession); settings.endGroup(); if (newSession) return true; else return false; } void MainWindow::saveSession() { if (m_sessionFile != "") { if (!saveSessionFile(m_sessionFile)) { QMessageBox::critical(this, tr("Failed to save file"), tr("Save failed

Session file \"%1\" could not be saved.").arg(m_sessionFile)); } else { CommandHistory::getInstance()->documentSaved(); documentRestored(); } } else { saveSessionAs(); } } void MainWindow::saveSessionAs() { QString orig = m_audioFile; if (orig == "") orig = "."; else orig = QFileInfo(orig).absoluteDir().canonicalPath(); QString path = getSaveFileName(FileFinder::SessionFile); if (path == "") return; if (!saveSessionFile(path)) { QMessageBox::critical(this, tr("Failed to save file"), tr("Save failed

Session file \"%1\" could not be saved.").arg(path)); } else { setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(QFileInfo(path).fileName())); m_sessionFile = path; CommandHistory::getInstance()->documentSaved(); documentRestored(); m_recentFiles.addFile(path); emit activity(tr("Save session as \"%1\"").arg(path)); } } void MainWindow::preferenceChanged(PropertyContainer::PropertyName name) { MainWindowBase::preferenceChanged(name); if (name == "Background Mode") { coloursChanged(); } } void MainWindow::coloursChanged() { QSettings settings; settings.beginGroup("Preferences"); QString defaultColourName(tr("Green")); if (m_viewManager && m_viewManager->getGlobalDarkBackground()) { defaultColourName = tr("Bright Green"); } ColourDatabase *cdb = ColourDatabase::getInstance(); QColor colour = QColor (settings.value("overview-colour", cdb->getColour(defaultColourName).name()).toString()); settings.endGroup(); int index = cdb->getColourIndex(colour); if (index >= 0) { m_panLayer->setBaseColour(index); } } void MainWindow::propertyStacksResized(int width) { // SVDEBUG << "MainWindow::propertyStacksResized(" << width << ")" << endl; if (!m_playControlsSpacer) return; int spacerWidth = width - m_playControlsWidth - 4; // SVDEBUG << "resizing spacer from " << m_playControlsSpacer->width() << " to " << spacerWidth << endl; m_playControlsSpacer->setFixedSize(QSize(spacerWidth, 2)); } void MainWindow::addPane() { QObject *s = sender(); QAction *action = dynamic_cast(s); cerr << "addPane: sender is " << s << ", action is " << action << ", name " << action->text() << endl; if (!action) { cerr << "WARNING: MainWindow::addPane: sender is not an action" << endl; return; } PaneActionMap::iterator i = m_paneActions.find(action); if (i == m_paneActions.end()) { cerr << "WARNING: MainWindow::addPane: unknown action " << action->objectName() << endl; cerr << "known actions are:" << endl; for (PaneActionMap::const_iterator i = m_paneActions.begin(); i != m_paneActions.end(); ++i) { cerr << i->first << ", name " << i->first->text() << endl; } return; } addPane(i->second, action->text()); } void MainWindow::addPane(const LayerConfiguration &configuration, QString text) { CommandHistory::getInstance()->startCompoundOperation(text, true); AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); if (configuration.layer == LayerFactory::Spectrum) { pane->setPlaybackFollow(PlaybackScrollContinuous); pane->setFollowGlobalZoom(false); pane->setZoomLevel(512); } if (configuration.layer != LayerFactory::TimeRuler && configuration.layer != LayerFactory::Spectrum) { if (!m_timeRulerLayer) { // cerr << "no time ruler layer, creating one" << endl; m_timeRulerLayer = m_document->createMainModelLayer (LayerFactory::TimeRuler); } // SVDEBUG << "adding time ruler layer " << m_timeRulerLayer << endl; m_document->addLayerToView(pane, m_timeRulerLayer); } Layer *newLayer = m_document->createLayer(configuration.layer); Model *suggestedModel = configuration.sourceModel; Model *model = 0; if (suggestedModel) { // check its validity std::vector inputModels = m_document->getTransformInputModels(); for (size_t j = 0; j < inputModels.size(); ++j) { if (inputModels[j] == suggestedModel) { model = suggestedModel; break; } } if (!model) { cerr << "WARNING: Model " << (void *)suggestedModel << " appears in pane action map, but is not reported " << "by document as a valid transform source" << endl; } } if (!model) { model = m_document->getMainModel(); } m_document->setModel(newLayer, model); m_document->setChannel(newLayer, configuration.channel); m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentPane(pane); m_paneStack->setCurrentLayer(pane, newLayer); // SVDEBUG << "MainWindow::addPane: global centre frame is " // << m_viewManager->getGlobalCentreFrame() << endl; // pane->setCentreFrame(m_viewManager->getGlobalCentreFrame()); CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); } void MainWindow::addLayer() { QObject *s = sender(); QAction *action = dynamic_cast(s); if (!action) { cerr << "WARNING: MainWindow::addLayer: sender is not an action" << endl; return; } Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { cerr << "WARNING: MainWindow::addLayer: no current pane" << endl; return; } ExistingLayerActionMap::iterator ei = m_existingLayerActions.find(action); if (ei != m_existingLayerActions.end()) { Layer *newLayer = ei->second; m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); return; } ei = m_sliceActions.find(action); if (ei != m_sliceActions.end()) { Layer *newLayer = m_document->createLayer(LayerFactory::Slice); // document->setModel(newLayer, ei->second->getModel()); SliceableLayer *source = dynamic_cast(ei->second); SliceLayer *dest = dynamic_cast(newLayer); if (source && dest) { //!!!??? dest->setSliceableModel(source->getSliceableModel()); connect(source, SIGNAL(sliceableModelReplaced(const Model *, const Model *)), dest, SLOT(sliceableModelReplaced(const Model *, const Model *))); connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), dest, SLOT(modelAboutToBeDeleted(Model *))); } m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); return; } TransformActionMap::iterator i = m_transformActions.find(action); if (i == m_transformActions.end()) { LayerActionMap::iterator i = m_layerActions.find(action); if (i == m_layerActions.end()) { cerr << "WARNING: MainWindow::addLayer: unknown action " << action->objectName() << endl; return; } LayerFactory::LayerType type = i->second.layer; LayerFactory::LayerTypeSet emptyTypes = LayerFactory::getInstance()->getValidEmptyLayerTypes(); Layer *newLayer = 0; if (emptyTypes.find(type) != emptyTypes.end()) { newLayer = m_document->createEmptyLayer(type); if (newLayer) { m_toolActions[ViewManager::DrawMode]->trigger(); } } else { Model *model = i->second.sourceModel; cerr << "model = "<< model << endl; if (!model) { if (type == LayerFactory::TimeRuler) { newLayer = m_document->createMainModelLayer(type); } else { // if model is unspecified and this is not a // time-ruler layer, use any plausible model from // the current pane -- this is the case for // right-button menu layer additions Pane::ModelSet ms = pane->getModels(); foreach (Model *m, ms) { RangeSummarisableTimeValueModel *r = dynamic_cast(m); if (r) model = m; } if (!model) model = getMainModel(); } } if (model) { newLayer = m_document->createLayer(type); if (m_document->isKnownModel(model)) { m_document->setChannel(newLayer, i->second.channel); m_document->setModel(newLayer, model); } else { cerr << "WARNING: MainWindow::addLayer: unknown model " << model << " (\"" << model->objectName() << "\") in layer action map" << endl; } } } if (newLayer) { m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); } return; } //!!! want to do something like this, but it's not supported in //ModelTransformerFactory yet /* int channel = -1; // pick up the default channel from any existing layers on the same pane for (int j = 0; j < pane->getLayerCount(); ++j) { int c = LayerFactory::getInstance()->getChannel(pane->getLayer(j)); if (c != -1) { channel = c; break; } } */ // We always ask for configuration, even if the plugin isn't // supposed to be configurable, because we need to let the user // change the execution context (block size etc). QString transformId = i->second; addLayer(transformId); } void MainWindow::addLayer(QString transformId) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { cerr << "WARNING: MainWindow::addLayer: no current pane" << endl; return; } Transform transform; try { transform = TransformFactory::getInstance()-> getDefaultTransformFor(transformId); } catch (std::exception &e) { // e.g. Piper server failure QMessageBox::critical (this, tr("Failed to query transform attributes"), tr("Failed to query transform attributes

Plugin or server error: %1

") .arg(e.what())); return; } std::vector candidateInputModels = m_document->getTransformInputModels(); Model *defaultInputModel = 0; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; if (LayerFactory::getInstance()->getLayerType(layer) != LayerFactory::Waveform && !layer->isLayerOpaque()) continue; Model *model = layer->getModel(); if (!model) continue; for (size_t k = 0; k < candidateInputModels.size(); ++k) { if (candidateInputModels[k] == model) { defaultInputModel = model; break; } } if (defaultInputModel) break; } AggregateWaveModel *aggregate = 0; if (candidateInputModels.size() > 1) { // Add an aggregate model as another option AggregateWaveModel::ChannelSpecList sl; foreach (Model *m, candidateInputModels) { RangeSummarisableTimeValueModel *r = qobject_cast(m); if (r) { sl.push_back(AggregateWaveModel::ModelChannelSpec(r, -1)); } } if (!sl.empty()) { aggregate = new AggregateWaveModel(sl); aggregate->setObjectName(tr("Multiplex all of the above")); candidateInputModels.push_back(aggregate); } } sv_frame_t startFrame = 0, duration = 0; sv_frame_t endFrame = 0; m_viewManager->getSelection().getExtents(startFrame, endFrame); if (endFrame > startFrame) duration = endFrame - startFrame; else startFrame = 0; TransformUserConfigurator configurator; ModelTransformer::Input input = ModelTransformerFactory::getInstance()-> getConfigurationForTransform (transform, candidateInputModels, defaultInputModel, m_playSource, startFrame, duration, &configurator); if (aggregate) { if (input.getModel() == aggregate) { aggregate->setObjectName(tr("Multiplexed audio")); m_document->addAggregateModel(aggregate); } else { aggregate->aboutToDelete(); delete aggregate; } } if (!input.getModel()) return; // SVDEBUG << "MainWindow::addLayer: Input model is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl << "transform:" << endl << transform.toXmlString() << endl; try { Layer *newLayer = m_document->createDerivedLayer(transform, input); if (newLayer) { m_document->addLayerToView(pane, newLayer); m_document->setChannel(newLayer, input.getChannel()); m_recentTransforms.add(transformId); m_paneStack->setCurrentLayer(pane, newLayer); } } catch (std::exception &e) { // e.g. Piper server failure QMessageBox::critical (this, tr("Transform failed"), tr("Failed to run transform

Plugin or server error: %1

") .arg(e.what())); return; } updateMenuStates(); } void MainWindow::renameCurrentLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (pane) { Layer *layer = pane->getSelectedLayer(); if (layer) { bool ok = false; QString newName = QInputDialog::getText (this, tr("Rename Layer"), tr("New name for this layer:"), QLineEdit::Normal, layer->objectName(), &ok); if (ok) { layer->setPresentationName(newName); setupExistingLayersMenus(); } } } } void MainWindow::findTransform() { TransformFinder *finder = new TransformFinder(this); if (!finder->exec()) { delete finder; return; } TransformId transform = finder->getTransform(); delete finder; if (getMainModel() != 0 && m_paneStack->getCurrentPane() != 0) { addLayer(transform); } } void MainWindow::playSoloToggled() { MainWindowBase::playSoloToggled(); m_soloModified = true; } void MainWindow::alignToggled() { QAction *action = dynamic_cast(sender()); if (!m_viewManager) return; if (action) { m_viewManager->setAlignMode(action->isChecked()); } else { m_viewManager->setAlignMode(!m_viewManager->getAlignMode()); } if (m_viewManager->getAlignMode()) { m_prevSolo = m_soloAction->isChecked(); if (!m_soloAction->isChecked()) { m_soloAction->setChecked(true); MainWindowBase::playSoloToggled(); } m_soloModified = false; emit canChangeSolo(false); m_document->alignModels(); m_document->setAutoAlignment(true); } else { if (!m_soloModified) { if (m_soloAction->isChecked() != m_prevSolo) { m_soloAction->setChecked(m_prevSolo); MainWindowBase::playSoloToggled(); } } emit canChangeSolo(true); m_document->setAutoAlignment(false); } for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; pane->update(); } } void MainWindow::playSpeedChanged(int position) { PlaySpeedRangeMapper mapper; double percent = m_playSpeed->mappedValue(); double factor = mapper.getFactorForValue(percent); // cerr << "play speed position = " << position << " (range 0-120) percent = " << percent << " factor = " << factor << endl; int centre = m_playSpeed->defaultValue(); // Percentage is shown to 0dp if >100, to 1dp if <100; factor is // shown to 3sf char pcbuf[30]; char facbuf[30]; if (position == centre) { contextHelpChanged(tr("Playback speed: Normal")); } else if (position < centre) { sprintf(pcbuf, "%.1f", percent); sprintf(facbuf, "%.3g", 1.0 / factor); contextHelpChanged(tr("Playback speed: %1% (%2x slower)") .arg(pcbuf) .arg(facbuf)); } else { sprintf(pcbuf, "%.0f", percent); sprintf(facbuf, "%.3g", factor); contextHelpChanged(tr("Playback speed: %1% (%2x faster)") .arg(pcbuf) .arg(facbuf)); } m_playSource->setTimeStretch(1.0 / factor); // factor is a speedup updateMenuStates(); } void MainWindow::speedUpPlayback() { int value = m_playSpeed->value(); value = value + m_playSpeed->pageStep(); if (value > m_playSpeed->maximum()) value = m_playSpeed->maximum(); m_playSpeed->setValue(value); } void MainWindow::slowDownPlayback() { int value = m_playSpeed->value(); value = value - m_playSpeed->pageStep(); if (value < m_playSpeed->minimum()) value = m_playSpeed->minimum(); m_playSpeed->setValue(value); } void MainWindow::restoreNormalPlayback() { m_playSpeed->setValue(m_playSpeed->defaultValue()); } void MainWindow::currentPaneChanged(Pane *pane) { MainWindowBase::currentPaneChanged(pane); if (!pane || !m_panLayer) return; // If this pane contains the main model, it usually makes sense to // show the main model in the pan layer even if it isn't the top // layer in the pane (e.g. if the top layer is one derived from // the main model). bool containsMainModel = false; for (int i = pane->getLayerCount(); i > 0; ) { --i; Layer *layer = pane->getLayer(i); if (layer && LayerFactory::getInstance()->getLayerType(layer) == LayerFactory::Waveform && layer->getModel() == getMainModel()) { containsMainModel = true; break; } } if (containsMainModel) { m_panLayer->setModel(getMainModel()); return; } for (int i = pane->getLayerCount(); i > 0; ) { --i; Layer *layer = pane->getLayer(i); if (LayerFactory::getInstance()->getLayerType(layer) == LayerFactory::Waveform) { RangeSummarisableTimeValueModel *tvm = dynamic_cast(layer->getModel()); if (tvm) { m_panLayer->setModel(tvm); return; } } } } void MainWindow::updateVisibleRangeDisplay(Pane *p) const { if (!getMainModel() || !p) { return; } bool haveSelection = false; sv_frame_t startFrame = 0, endFrame = 0; if (m_viewManager && m_viewManager->haveInProgressSelection()) { bool exclusive = false; Selection s = m_viewManager->getInProgressSelection(exclusive); if (!s.isEmpty()) { haveSelection = true; startFrame = s.getStartFrame(); endFrame = s.getEndFrame(); } } if (!haveSelection) { startFrame = p->getFirstVisibleFrame(); endFrame = p->getLastVisibleFrame(); } RealTime start = RealTime::frame2RealTime (startFrame, getMainModel()->getSampleRate()); RealTime end = RealTime::frame2RealTime (endFrame, getMainModel()->getSampleRate()); RealTime duration = end - start; QString startStr, endStr, durationStr; startStr = start.toText(true).c_str(); endStr = end.toText(true).c_str(); durationStr = duration.toText(true).c_str(); if (haveSelection) { m_myStatusMessage = tr("Selection: %1 to %2 (duration %3)") .arg(startStr).arg(endStr).arg(durationStr); } else { m_myStatusMessage = tr("Visible: %1 to %2 (duration %3)") .arg(startStr).arg(endStr).arg(durationStr); } if (getStatusLabel()->text() != m_myStatusMessage) { getStatusLabel()->setText(m_myStatusMessage); } updatePositionStatusDisplays(); } void MainWindow::updatePositionStatusDisplays() const { if (!statusBar()->isVisible()) return; Pane *pane = 0; sv_frame_t frame = m_viewManager->getPlaybackFrame(); if (m_paneStack) pane = m_paneStack->getCurrentPane(); if (!pane) return; int layers = pane->getLayerCount(); if (layers == 0) m_currentLabel->setText(""); for (int i = layers-1; i >= 0; --i) { Layer *layer = pane->getLayer(i); if (!layer) continue; if (!layer->isLayerEditable()) continue; QString label = layer->getLabelPreceding (pane->alignFromReference(frame)); m_currentLabel->setText(label); break; } } void MainWindow::monitoringLevelsChanged(float left, float right) { m_mainLevelPan->setMonitoringLevels(left, right); } void MainWindow::sampleRateMismatch(sv_samplerate_t requested, sv_samplerate_t actual, bool willResample) { if (!willResample) { emit hideSplash(); QMessageBox::information (this, tr("Sample rate mismatch"), tr("Wrong sample rate

The sample rate of this audio file (%1 Hz) does not match\nthe current playback rate (%2 Hz).

The file will play at the wrong speed and pitch.

Change the Resample mismatching files on import option under File -> Preferences if you want to alter this behaviour.") .arg(requested).arg(actual)); } updateDescriptionLabel(); } void MainWindow::audioOverloadPluginDisabled() { QMessageBox::information (this, tr("Audio processing overload"), tr("Overloaded

Audio effects plugin auditioning has been disabled due to a processing overload.")); } void MainWindow::audioTimeStretchMultiChannelDisabled() { static bool shownOnce = false; if (shownOnce) return; QMessageBox::information (this, tr("Audio processing overload"), tr("Overloaded

Audio playback speed processing has been reduced to a single channel, due to a processing overload.")); shownOnce = true; } /* void MainWindow::betaReleaseWarning() { QMessageBox::information (this, tr("Beta release"), tr("This is a beta release of Sonic Visualiser

Please see the \"What's New\" option in the Help menu for a list of changes since the last proper release.

")); } */ void MainWindow::pluginPopulationWarning() { QString scanWarning = PluginScan::getInstance()->getStartupFailureReport(); QString factWarning = TransformFactory::getInstance()->getStartupFailureReport(); QString warning; if (factWarning != "") { // The order of events on startup implies that, if scanWarning // and factWarning are both present, then we have already been // called once for scanWarning so don't want to report it again warning = factWarning; } else if (scanWarning != "") { warning = scanWarning; } if (warning != "") { emit hideSplash(); QMessageBox::warning(this, tr("Problems loading plugins"), warning); } } void MainWindow::midiEventsAvailable() { Pane *currentPane = 0; NoteLayer *currentNoteLayer = 0; TimeValueLayer *currentTimeValueLayer = 0; if (m_paneStack) { currentPane = m_paneStack->getCurrentPane(); } if (currentPane) { currentNoteLayer = dynamic_cast (currentPane->getSelectedLayer()); currentTimeValueLayer = dynamic_cast (currentPane->getSelectedLayer()); } else { // discard these events while (m_midiInput->getEventsAvailable() > 0) { (void)m_midiInput->readEvent(); } return; } // This is called through a serialised signal/slot invocation // (across threads). It could happen quite some time after the // event was actually received, which is why event timestamping // happens in the MIDI input class and not here. while (m_midiInput->getEventsAvailable() > 0) { MIDIEvent ev(m_midiInput->readEvent()); sv_frame_t frame = currentPane->alignFromReference(ev.getTime()); bool noteOn = (ev.getMessageType() == MIDIConstants::MIDI_NOTE_ON && ev.getVelocity() > 0); bool noteOff = (ev.getMessageType() == MIDIConstants::MIDI_NOTE_OFF || (ev.getMessageType() == MIDIConstants::MIDI_NOTE_ON && ev.getVelocity() == 0)); if (currentNoteLayer) { if (!m_playSource || !m_playSource->isPlaying()) continue; if (noteOn) { currentNoteLayer->addNoteOn(frame, ev.getPitch(), ev.getVelocity()); } else if (noteOff) { currentNoteLayer->addNoteOff(frame, ev.getPitch()); } continue; } if (currentTimeValueLayer) { if (!noteOn) continue; if (!m_playSource || !m_playSource->isPlaying()) continue; Model *model = static_cast(currentTimeValueLayer)->getModel(); SparseTimeValueModel *tvm = dynamic_cast(model); if (tvm) { SparseTimeValueModel::Point point(frame, ev.getPitch() % 12, ""); SparseTimeValueModel::AddPointCommand *command = new SparseTimeValueModel::AddPointCommand (tvm, point, tr("Add Point")); CommandHistory::getInstance()->addCommand(command); } continue; } // This is reached only if !currentNoteLayer and // !currentTimeValueLayer, i.e. there is some other sort of // layer that may be insertable-into if (!noteOn) continue; insertInstantAt(ev.getTime()); } } void MainWindow::playStatusChanged(bool ) { Pane *currentPane = 0; NoteLayer *currentNoteLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) { currentNoteLayer = dynamic_cast(currentPane->getSelectedLayer()); } if (currentNoteLayer) { currentNoteLayer->abandonNoteOns(); } } void MainWindow::layerRemoved(Layer *layer) { setupExistingLayersMenus(); MainWindowBase::layerRemoved(layer); } void MainWindow::layerInAView(Layer *layer, bool inAView) { setupExistingLayersMenus(); MainWindowBase::layerInAView(layer, inAView); } void MainWindow::modelAdded(Model *model) { MainWindowBase::modelAdded(model); if (dynamic_cast(model)) { setupPaneAndLayerMenus(); } } void MainWindow::mainModelChanged(WaveFileModel *model) { m_panLayer->setModel(model); MainWindowBase::mainModelChanged(model); if (m_playTarget || m_audioIO) { connect(m_mainLevelPan, SIGNAL(levelChanged(float)), this, SLOT(mainModelGainChanged(float))); connect(m_mainLevelPan, SIGNAL(panChanged(float)), this, SLOT(mainModelPanChanged(float))); } } void MainWindow::mainModelGainChanged(float gain) { if (m_playTarget) { m_playTarget->setOutputGain(gain); } else if (m_audioIO) { m_audioIO->setOutputGain(gain); } } void MainWindow::mainModelPanChanged(float balance) { // this is indeed stereo balance rather than pan if (m_playTarget) { m_playTarget->setOutputBalance(balance); } else if (m_audioIO) { m_audioIO->setOutputBalance(balance); } } void MainWindow::modelAboutToBeDeleted(Model *model) { if (model == m_panLayer->getModel()) { if (model == getMainModel()) { m_panLayer->setModel(0); } else { m_panLayer->setModel(getMainModel()); } } MainWindowBase::modelAboutToBeDeleted(model); } void MainWindow::setInstantsNumbering() { QAction *a = dynamic_cast(sender()); if (!a) return; int type = m_numberingActions[a]; if (m_labeller) m_labeller->setType(Labeller::ValueType(type)); QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("labellertype", type); settings.endGroup(); } void MainWindow::setInstantsCounterCycle() { QAction *a = dynamic_cast(sender()); if (!a) return; int cycle = a->text().toInt(); if (cycle == 0) return; if (m_labeller) m_labeller->setCounterCycleSize(cycle); QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("labellercycle", cycle); settings.endGroup(); } void MainWindow::setInstantsCounters() { LabelCounterInputDialog dialog(m_labeller, this); dialog.setWindowTitle(tr("Reset Counters")); dialog.exec(); } void MainWindow::resetInstantsCounters() { if (m_labeller) m_labeller->resetCounters(); } void MainWindow::subdivideInstants() { QSettings settings; settings.beginGroup("MainWindow"); int n = settings.value("subdivisions", 4).toInt(); bool ok; n = QInputDialog::getInt(this, tr("Subdivide instants"), tr("Number of subdivisions:"), n, 2, 96, 1, &ok); if (ok) { settings.setValue("subdivisions", n); subdivideInstantsBy(n); } settings.endGroup(); } void MainWindow::winnowInstants() { QSettings settings; settings.beginGroup("MainWindow"); int n = settings.value("winnow-subdivisions", 4).toInt(); bool ok; n = QInputDialog::getInt(this, tr("Winnow instants"), tr("Remove all instants apart from multiples of:"), n, 2, 96, 1, &ok); if (ok) { settings.setValue("winnow-subdivisions", n); winnowInstantsBy(n); } settings.endGroup(); } void MainWindow::modelGenerationFailed(QString transformName, QString message) { emit hideSplash(); QString quoted; if (transformName != "") { quoted = QString("\"%1\" ").arg(transformName); } if (message != "") { QMessageBox::warning (this, tr("Failed to generate layer"), tr("Layer generation failed

Failed to generate derived layer.

The layer transform %1failed:

%2") .arg(quoted).arg(message), QMessageBox::Ok); } else { QMessageBox::warning (this, tr("Failed to generate layer"), tr("Layer generation failed

Failed to generate a derived layer.

The layer transform %1failed.

No error information is available.") .arg(quoted), QMessageBox::Ok); } } void MainWindow::modelGenerationWarning(QString /* transformName */, QString message) { emit hideSplash(); QMessageBox::warning (this, tr("Warning"), message, QMessageBox::Ok); } void MainWindow::modelRegenerationFailed(QString layerName, QString transformName, QString message) { emit hideSplash(); if (message != "") { QMessageBox::warning (this, tr("Failed to regenerate layer"), tr("Layer generation failed

Failed to regenerate derived layer \"%1\" using new data model as input.

The layer transform \"%2\" failed:

%3") .arg(layerName).arg(transformName).arg(message), QMessageBox::Ok); } else { QMessageBox::warning (this, tr("Failed to regenerate layer"), tr("Layer generation failed

Failed to regenerate derived layer \"%1\" using new data model as input.

The layer transform \"%2\" failed.

No error information is available.") .arg(layerName).arg(transformName), QMessageBox::Ok); } } void MainWindow::modelRegenerationWarning(QString layerName, QString /* transformName */, QString message) { emit hideSplash(); QMessageBox::warning (this, tr("Warning"), tr("Warning when regenerating layer

When regenerating the derived layer \"%1\" using new data model as input:

%2").arg(layerName).arg(message), QMessageBox::Ok); } void MainWindow::alignmentFailed(QString message) { QMessageBox::warning (this, tr("Failed to calculate alignment"), tr("Alignment calculation failed

Failed to calculate an audio alignment:

%1") .arg(message), QMessageBox::Ok); } void MainWindow::rightButtonMenuRequested(Pane *pane, QPoint position) { // SVDEBUG << "MainWindow::rightButtonMenuRequested(" << pane << ", " << position.x() << ", " << position.y() << ")" << endl; m_paneStack->setCurrentPane(pane); m_rightButtonMenu->popup(position); } void MainWindow::showLayerTree() { if (!m_layerTreeDialog.isNull()) { m_layerTreeDialog->show(); m_layerTreeDialog->raise(); return; } m_layerTreeDialog = new LayerTreeDialog(m_paneStack, this); m_layerTreeDialog->setAttribute(Qt::WA_DeleteOnClose); // see below m_layerTreeDialog->show(); } void MainWindow::showActivityLog() { m_activityLog->show(); m_activityLog->raise(); m_activityLog->scrollToEnd(); } void MainWindow::showUnitConverter() { m_unitConverter->show(); m_unitConverter->raise(); } void MainWindow::preferences() { bool goToTemplateTab = (sender() && sender()->objectName() == "set_default_template"); if (!m_preferencesDialog.isNull()) { m_preferencesDialog->show(); m_preferencesDialog->raise(); if (goToTemplateTab) { m_preferencesDialog->switchToTab(PreferencesDialog::TemplateTab); } return; } m_preferencesDialog = new PreferencesDialog(this); connect(m_preferencesDialog, SIGNAL(audioDeviceChanged()), this, SLOT(recreateAudioIO())); connect(m_preferencesDialog, SIGNAL(coloursChanged()), this, SLOT(coloursChanged())); // DeleteOnClose is safe here, because m_preferencesDialog is a // QPointer that will be zeroed when the dialog is deleted. We // use it in preference to leaving the dialog lying around because // if you Cancel the dialog, it resets the preferences state // without resetting its own widgets, so its state will be // incorrect when next shown unless we construct it afresh m_preferencesDialog->setAttribute(Qt::WA_DeleteOnClose); m_preferencesDialog->show(); if (goToTemplateTab) { m_preferencesDialog->switchToTab(PreferencesDialog::TemplateTab); } } void MainWindow::mouseEnteredWidget() { QWidget *w = dynamic_cast(sender()); if (!w) return; if (w == m_mainLevelPan) { contextHelpChanged(tr("Adjust the master playback level and pan")); } else if (w == m_playSpeed) { contextHelpChanged(tr("Adjust the master playback speed")); } } void MainWindow::mouseLeftWidget() { contextHelpChanged(""); } void MainWindow::website() { openHelpUrl(tr("http://www.sonicvisualiser.org/")); } void MainWindow::help() { openHelpUrl(tr("http://www.sonicvisualiser.org/doc/reference/%1/en/").arg(SV_VERSION)); } void MainWindow::whatsNew() { QFile changelog(":CHANGELOG"); changelog.open(QFile::ReadOnly); QByteArray content = changelog.readAll(); QString text = QString::fromUtf8(content); QDialog *d = new QDialog(this); d->setWindowTitle(tr("What's New")); QGridLayout *layout = new QGridLayout; d->setLayout(layout); int row = 0; QLabel *iconLabel = new QLabel; iconLabel->setPixmap(QApplication::windowIcon().pixmap(64, 64)); layout->addWidget(iconLabel, row, 0); layout->addWidget (new QLabel(tr("

What's New in %1

") .arg(QApplication::applicationName())), row++, 1); layout->setColumnStretch(2, 10); QTextEdit *textEdit = new QTextEdit; layout->addWidget(textEdit, row++, 1, 1, 2); if (m_newerVersionIs != "") { layout->addWidget(new QLabel(tr("Note: A newer version of Sonic Visualiser is available.
(Version %1 is available; you are using version %2)").arg(m_newerVersionIs).arg(SV_VERSION)), row++, 1, 1, 2); } QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok); layout->addWidget(bb, row++, 0, 1, 3); connect(bb, SIGNAL(accepted()), d, SLOT(accept())); text.replace(QRegExp("(.)\n +(.)"), "\\1 \\2"); text.replace(QRegExp("\n - ([^\n]+)"), "\n
  • \\1
  • "); text.replace(QRegExp(": *\n"), ":\n
      \n"); text.replace(QRegExp("\n\\s*\n"), "\n
    \n\n"); text.replace(QRegExp("\n(\\w[^:\n]+:)"), "\n

    \\1

    "); // text.replace(QRegExp("
  • ([^,.\n]+)([,.] +\\w)"), "
  • \\1\\2"); textEdit->setHtml(text); textEdit->setReadOnly(true); d->setMinimumSize(m_viewManager->scalePixelSize(520), m_viewManager->scalePixelSize(450)); d->exec(); delete d; } QString MainWindow::getReleaseText() const { bool debug = false; QString version = "(unknown version)"; #ifdef BUILD_DEBUG debug = true; #endif // BUILD_DEBUG #ifdef SV_VERSION #ifdef SVNREV version = tr("Release %1 : Revision %2").arg(SV_VERSION).arg(SVNREV); #else // !SVNREV version = tr("Release %1").arg(SV_VERSION); #endif // SVNREV #else // !SV_VERSION #ifdef SVNREV version = tr("Unreleased : Revision %1").arg(SVNREV); #endif // SVNREV #endif // SV_VERSION return tr("%1 : %2 configuration, %3-bit build") .arg(version) .arg(debug ? tr("Debug") : tr("Release")) .arg(sizeof(void *) * 8); } void MainWindow::about() { QString aboutText; aboutText += tr("

    About Sonic Visualiser

    "); aboutText += tr("

    Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.
    http://www.sonicvisualiser.org/

    "); aboutText += QString("

    %1

    ").arg(getReleaseText()); if (m_oscQueue && m_oscQueue->isOK()) { aboutText += tr("

    The OSC URL for this instance is: \"%1\"").arg(m_oscQueue->getOSCURL()); } aboutText += "

    "; aboutText += tr("With Qt v%1 © The Qt Company").arg(QT_VERSION_STR); aboutText += ""; #ifdef HAVE_JACK #ifdef JACK_VERSION aboutText += tr("
    With JACK audio output library v%1 © Paul Davis and Jack O'Quin").arg(JACK_VERSION); #else // !JACK_VERSION aboutText += tr("
    With JACK audio output library © Paul Davis and Jack O'Quin"); #endif // JACK_VERSION #endif // HAVE_JACK #ifdef HAVE_PORTAUDIO aboutText += tr("
    With PortAudio audio output library © Ross Bencina and Phil Burk"); #endif // HAVE_PORTAUDIO #ifdef HAVE_LIBPULSE #ifdef LIBPULSE_VERSION aboutText += tr("
    With PulseAudio audio output library v%1 © Lennart Poettering and Pierre Ossman").arg(LIBPULSE_VERSION); #else // !LIBPULSE_VERSION aboutText += tr("
    With PulseAudio audio output library © Lennart Poettering and Pierre Ossman"); #endif // LIBPULSE_VERSION #endif // HAVE_LIBPULSE #ifdef HAVE_OGGZ #ifdef OGGZ_VERSION aboutText += tr("
    With Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia").arg(OGGZ_VERSION).arg(FISHSOUND_VERSION); #else // !OGGZ_VERSION aboutText += tr("
    With Ogg file decoder © CSIRO Australia"); #endif // OGGZ_VERSION #endif // HAVE_OGGZ #ifdef HAVE_MAD #ifdef MAD_VERSION aboutText += tr("
    With MAD mp3 decoder v%1 © Underbit Technologies Inc").arg(MAD_VERSION); #else // !MAD_VERSION aboutText += tr("
    With MAD mp3 decoder © Underbit Technologies Inc"); #endif // MAD_VERSION #endif // HAVE_MAD #ifdef HAVE_SAMPLERATE #ifdef SAMPLERATE_VERSION aboutText += tr("
    With libsamplerate v%1 © Erik de Castro Lopo").arg(SAMPLERATE_VERSION); #else // !SAMPLERATE_VERSION aboutText += tr("
    With libsamplerate © Erik de Castro Lopo"); #endif // SAMPLERATE_VERSION #endif // HAVE_SAMPLERATE #ifdef HAVE_SNDFILE #ifdef SNDFILE_VERSION aboutText += tr("
    With libsndfile v%1 © Erik de Castro Lopo").arg(SNDFILE_VERSION); #else // !SNDFILE_VERSION aboutText += tr("
    With libsndfile © Erik de Castro Lopo"); #endif // SNDFILE_VERSION #endif // HAVE_SNDFILE #ifdef HAVE_FFTW3F #ifdef FFTW3_VERSION aboutText += tr("
    With FFTW3 v%1 © Matteo Frigo and MIT").arg(FFTW3_VERSION); #else // !FFTW3_VERSION aboutText += tr("
    With FFTW3 © Matteo Frigo and MIT"); #endif // FFTW3_VERSION #endif // HAVE_FFTW3F #ifdef HAVE_RUBBERBAND #ifdef RUBBERBAND_VERSION aboutText += tr("
    With Rubber Band Library v%1 © Particular Programs Ltd").arg(RUBBERBAND_VERSION); #else // !RUBBERBAND_VERSION aboutText += tr("
    With Rubber Band Library © Particular Programs Ltd"); #endif // RUBBERBAND_VERSION #endif // HAVE_RUBBERBAND aboutText += tr("
    With Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam and QMUL").arg(VAMP_API_VERSION).arg(VAMP_SDK_VERSION); aboutText += tr("
    With Piper Vamp protocol bridge © QMUL"); aboutText += tr("
    With LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld").arg(LADSPA_VERSION); aboutText += tr("
    With DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton").arg(DSSI_VERSION); #ifdef REDLAND_VERSION aboutText += tr("
    With Redland RDF datastore v%1 © Dave Beckett and the University of Bristol").arg(REDLAND_VERSION); #else // !REDLAND_VERSION aboutText += tr("
    With Redland RDF datastore © Dave Beckett and the University of Bristol"); #endif // REDLAND_VERSION aboutText += tr("
    With Serd and Sord RDF parser and store © David Robillard"); aboutText += tr("
    With Dataquay Qt/RDF library © Particular Programs Ltd"); aboutText += tr("
    With Cap'n Proto serialisation © Sandstorm Development Group"); aboutText += tr("
    With RtMidi © Gary P. Scavone"); #ifdef HAVE_LIBLO #ifdef LIBLO_VERSION aboutText += tr("
    With liblo Lite OSC library v%1 © Steve Harris").arg(LIBLO_VERSION); #else // !LIBLO_VERSION aboutText += tr("
    With liblo Lite OSC library © Steve Harris"); #endif // LIBLO_VERSION aboutText += "

    "; #endif // HAVE_LIBLO aboutText += "

    "; aboutText += tr("Russian UI translation contributed by Alexandre Prokoudine."); aboutText += "
    "; aboutText += tr("Czech UI translation contributed by Pavel Fric."); aboutText += "

    "; aboutText += "

    Sonic Visualiser Copyright © 2005–2017 Chris Cannam and " "Queen Mary, University of London.

    "; aboutText += "

    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.
    See the file " "COPYING included with this distribution for more information.

    "; // use our own dialog so we can influence the size QDialog *d = new QDialog(this); d->setWindowTitle(tr("About %1").arg(QApplication::applicationName())); QGridLayout *layout = new QGridLayout; d->setLayout(layout); int row = 0; QLabel *iconLabel = new QLabel; iconLabel->setPixmap(QApplication::windowIcon().pixmap(64, 64)); layout->addWidget(iconLabel, row, 0, Qt::AlignTop); QLabel *mainText = new QLabel(); layout->addWidget(mainText, row, 1, 1, 2); layout->setRowStretch(row, 10); layout->setColumnStretch(1, 10); ++row; QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok); layout->addWidget(bb, row++, 0, 1, 3); connect(bb, SIGNAL(accepted()), d, SLOT(accept())); // mainText->setHtml(aboutText); // mainText->setReadOnly(true); mainText->setWordWrap(true); mainText->setOpenExternalLinks(true); mainText->setText(aboutText); d->setMinimumSize(m_viewManager->scalePixelSize(420), m_viewManager->scalePixelSize(200)); d->exec(); delete d; /* QMessageBox about(QMessageBox::Information, tr("About Sonic Visualiser"), aboutText, QMessageBox::StandardButtons(QMessageBox::Ok), this); QIcon icon = QApplication::windowIcon(); QSize size = icon.actualSize(QSize(64, 64)); about.setIconPixmap(icon.pixmap(size)); about.setMinimumSize(m_viewManager->scalePixelSize(400), m_viewManager->scalePixelSize(400)); about.exec(); */ } void MainWindow::keyReference() { m_keyReference->show(); } void MainWindow::newerVersionAvailable(QString version) { m_newerVersionIs = version; QSettings settings; settings.beginGroup("NewerVersionWarning"); QString tag = QString("version-%1-available-show").arg(version); if (settings.value(tag, true).toBool()) { QString title(tr("Newer version available")); QString text(tr("

    Newer version available

    You are using version %1 of Sonic Visualiser, but version %2 is now available.

    Please see the Sonic Visualiser website for more information.

    ").arg(SV_VERSION).arg(version)); QMessageBox::information(this, title, text); settings.setValue(tag, false); } settings.endGroup(); } sonic-visualiser-3.0.3/main/MainWindow.h0000644000000000000000000002301613111512442016307 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MAIN_WINDOW_H_ #define _MAIN_WINDOW_H_ #include "framework/MainWindowBase.h" class VersionTester; class Surveyer; class LayerTreeDialog; class ActivityLog; class UnitConverter; class QFileSystemWatcher; class QScrollArea; class MainWindow : public MainWindowBase { Q_OBJECT public: MainWindow(SoundOptions options, bool withOSCSupport = true); virtual ~MainWindow(); signals: void canChangeSolo(bool); void canAlign(bool); public slots: virtual void preferenceChanged(PropertyContainer::PropertyName); virtual void coloursChanged(); virtual bool commitData(bool mayAskUser); void goFullScreen(); void endFullScreen(); protected slots: virtual void importAudio(); virtual void importMoreAudio(); virtual void replaceMainAudio(); virtual void openSomething(); virtual void openLocation(); /* F. Nicol patch 13 Aug. 2016 */ virtual void openRecentFile(const QString& ); /* End of F. Nicol patch 13 Aug. 2016 */ virtual void applyTemplate(); virtual void exportAudio(); virtual void exportAudioData(); virtual void importLayer(); virtual void exportLayer(); virtual void exportImage(); virtual void exportSVG(); virtual void browseRecordedAudio(); virtual void saveSession(); virtual void saveSessionAs(); virtual void newSession(); virtual void closeSession(); virtual void preferences(); virtual void sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool); virtual void audioOverloadPluginDisabled(); virtual void audioTimeStretchMultiChannelDisabled(); virtual void toolNavigateSelected(); virtual void toolSelectSelected(); virtual void toolEditSelected(); virtual void toolDrawSelected(); virtual void toolEraseSelected(); virtual void toolMeasureSelected(); virtual void documentModified(); virtual void documentRestored(); virtual void documentReplaced(); virtual void updateMenuStates(); virtual void updateDescriptionLabel(); virtual void setInstantsNumbering(); virtual void setInstantsCounterCycle(); virtual void setInstantsCounters(); virtual void resetInstantsCounters(); virtual void subdivideInstants(); virtual void winnowInstants(); virtual void modelGenerationFailed(QString, QString); virtual void modelGenerationWarning(QString, QString); virtual void modelRegenerationFailed(QString, QString, QString); virtual void modelRegenerationWarning(QString, QString, QString); virtual void alignmentFailed(QString); virtual void rightButtonMenuRequested(Pane *, QPoint point); virtual void propertyStacksResized(int); virtual void addPane(); virtual void addLayer(); virtual void addLayer(QString transformId); virtual void renameCurrentLayer(); virtual void findTransform(); virtual void paneAdded(Pane *); virtual void paneHidden(Pane *); virtual void paneAboutToBeDeleted(Pane *); virtual void paneDropAccepted(Pane *, QStringList); virtual void paneDropAccepted(Pane *, QString); virtual void setupRecentFilesMenu(); virtual void setupRecentTransformsMenu(); virtual void setupTemplatesMenu(); virtual void playSpeedChanged(int); virtual void playSoloToggled(); virtual void alignToggled(); virtual void currentPaneChanged(Pane *); virtual void speedUpPlayback(); virtual void slowDownPlayback(); virtual void restoreNormalPlayback(); virtual void monitoringLevelsChanged(float, float); virtual void layerRemoved(Layer *); virtual void layerInAView(Layer *, bool); virtual void mainModelChanged(WaveFileModel *); virtual void mainModelGainChanged(float); virtual void mainModelPanChanged(float); virtual void modelAdded(Model *); virtual void modelAboutToBeDeleted(Model *); virtual void showLayerTree(); virtual void showActivityLog(); virtual void showUnitConverter(); virtual void mouseEnteredWidget(); virtual void mouseLeftWidget(); virtual void handleOSCMessage(const OSCMessage &); virtual void midiEventsAvailable(); virtual void playStatusChanged(bool); /* virtual void betaReleaseWarning(); */ virtual void pluginPopulationWarning(); virtual void saveSessionAsTemplate(); virtual void manageSavedTemplates(); virtual void website(); virtual void help(); virtual void about(); virtual void whatsNew(); virtual void keyReference(); virtual void newerVersionAvailable(QString); protected: Overview *m_overview; LevelPanToolButton *m_mainLevelPan; AudioDial *m_playSpeed; WaveformLayer *m_panLayer; QScrollArea *m_mainScroll; bool m_mainMenusCreated; QMenu *m_paneMenu; QMenu *m_layerMenu; QMenu *m_transformsMenu; QMenu *m_playbackMenu; QMenu *m_existingLayersMenu; QMenu *m_sliceMenu; QMenu *m_recentFilesMenu; QMenu *m_recentTransformsMenu; QMenu *m_templatesMenu; QMenu *m_rightButtonMenu; QMenu *m_rightButtonLayerMenu; QMenu *m_rightButtonTransformsMenu; QMenu *m_rightButtonPlaybackMenu; QAction *m_deleteSelectedAction; QAction *m_soloAction; QAction *m_rwdStartAction; QAction *m_rwdSimilarAction; QAction *m_rwdAction; QAction *m_ffwdAction; QAction *m_ffwdSimilarAction; QAction *m_ffwdEndAction; QAction *m_playAction; QAction *m_recordAction; QAction *m_playSelectionAction; QAction *m_playLoopAction; QAction *m_manageTemplatesAction; QAction *m_zoomInAction; QAction *m_zoomOutAction; QAction *m_zoomFitAction; QAction *m_scrollLeftAction; QAction *m_scrollRightAction; QAction *m_showPropertyBoxesAction; bool m_soloModified; bool m_prevSolo; QFrame *m_playControlsSpacer; int m_playControlsWidth; QLabel *m_descriptionLabel; QLabel *m_currentLabel; QPointer m_preferencesDialog; QPointer m_layerTreeDialog; ActivityLog *m_activityLog; UnitConverter *m_unitConverter; KeyReference *m_keyReference; QFileSystemWatcher *m_templateWatcher; Surveyer *m_surveyer; VersionTester *m_versionTester; QString m_newerVersionIs; struct LayerConfiguration { LayerConfiguration(LayerFactory::LayerType _layer = LayerFactory::TimeRuler, Model *_source = 0, int _channel = -1) : layer(_layer), sourceModel(_source), channel(_channel) { } LayerFactory::LayerType layer; Model *sourceModel; int channel; }; typedef std::map PaneActionMap; PaneActionMap m_paneActions; typedef std::map LayerActionMap; LayerActionMap m_layerActions; typedef std::map TransformActionMap; TransformActionMap m_transformActions; typedef std::map TransformActionReverseMap; TransformActionReverseMap m_transformActionsReverse; typedef std::map ExistingLayerActionMap; ExistingLayerActionMap m_existingLayerActions; ExistingLayerActionMap m_sliceActions; typedef std::map ToolActionMap; ToolActionMap m_toolActions; typedef std::map NumberingActionMap; NumberingActionMap m_numberingActions; QString getReleaseText() const; virtual void setupMenus(); virtual void setupFileMenu(); virtual void setupEditMenu(); virtual void setupViewMenu(); virtual void setupPaneAndLayerMenus(); virtual void setupTransformsMenu(); virtual void setupHelpMenu(); virtual void setupExistingLayersMenus(); virtual void setupToolbars(); virtual void addPane(const LayerConfiguration &configuration, QString text); virtual void closeEvent(QCloseEvent *e); virtual bool checkSaveModified(); virtual void exportAudio(bool asData); virtual void updateVisibleRangeDisplay(Pane *p) const; virtual void updatePositionStatusDisplays() const; virtual bool shouldCreateNewSessionForRDFAudio(bool *cancel); virtual void connectLayerEditDialog(ModelDataTableDialog *); }; #endif sonic-visualiser-3.0.3/main/NetworkPermissionTester.cpp0000644000000000000000000001026413111512442021460 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "NetworkPermissionTester.h" #include "../version.h" #include "base/Debug.h" #include #include #include #include #include #include #include #include #include bool NetworkPermissionTester::havePermission() { QSettings settings; settings.beginGroup("Preferences"); QString tag = QString("network-permission-%1").arg(SV_VERSION); bool permish = false; if (settings.contains(tag)) { permish = settings.value(tag, false).toBool(); SVDEBUG << "NetworkPermissionTester: Asked already, result was " << permish << endl; } else { SVDEBUG << "NetworkPermissionTester: Asking for permission" << endl; QDialog d; d.setWindowTitle(QCoreApplication::translate("NetworkPermissionTester", "Welcome to Sonic Visualiser")); QGridLayout *layout = new QGridLayout; d.setLayout(layout); QString preamble; preamble = QCoreApplication::translate ("NetworkPermissionTester", "

    Welcome to Sonic Visualiser!

    " "

    Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.

    " "

    Developed in the Centre for Digital Music at Queen Mary University of London, Sonic Visualiser is open source software under the GNU General Public License.

    " "


    " "

    Before we go on...

    " "

    Sonic Visualiser would like permission to use the network.

    "); QString bullets; if (m_withOSC) { bullets = QCoreApplication::translate ("NetworkPermissionTester", "

    This is to:

    " "
    • Find information about available and installed plugins;
    • " "
    • Support the use of Open Sound Control; and
    • " "
    • Tell you when updates are available.
    • " "
    "); } else { bullets = QCoreApplication::translate ("NetworkPermissionTester", "

    This is to:

    " "
    • Find information about available and installed plugins; and
    • " "
    • Tell you when updates are available.
    • " "
    "); } QString postamble; postamble = QCoreApplication::translate ("NetworkPermissionTester", "

    No personal information will be sent, no tracking is carried out, and no individual information will be shared with anyone else. We will however make aggregate counts of distinct requests for usage reporting.

    " "

    We recommend that you allow this, because it makes Sonic Visualiser more useful to you and supports the public funding of this work. But if you do not wish to allow it, please un-check the box below.

    "); QLabel *label = new QLabel; label->setWordWrap(true); label->setText(preamble + bullets + postamble); layout->addWidget(label, 0, 0); QCheckBox *cb = new QCheckBox(QCoreApplication::translate("NetworkPermissionTester", "Allow this")); cb->setChecked(true); layout->addWidget(cb, 1, 0); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok); QObject::connect(bb, SIGNAL(accepted()), &d, SLOT(accept())); layout->addWidget(bb, 2, 0); d.exec(); permish = cb->isChecked(); settings.setValue(tag, permish); SVDEBUG << "NetworkPermissionTester: asked, answer was " << permish << endl; } settings.endGroup(); return permish; } sonic-visualiser-3.0.3/main/NetworkPermissionTester.h0000644000000000000000000000147113111512442021125 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef NETWORK_PERMISSION_TESTER_H #define NETWORK_PERMISSION_TESTER_H class NetworkPermissionTester { public: NetworkPermissionTester(bool withOSCSupport) : m_withOSC(withOSCSupport) { } bool havePermission(); private: bool m_withOSC; }; #endif sonic-visualiser-3.0.3/main/OSCHandler.cpp0000644000000000000000000005364513111512442016523 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "MainWindow.h" #include "data/osc/OSCQueue.h" #include "layer/WaveformLayer.h" #include "view/ViewManager.h" #include "view/Pane.h" #include "view/PaneStack.h" #include "data/model/WaveFileModel.h" #include "widgets/CommandHistory.h" #include "audio/AudioCallbackPlaySource.h" #include "framework/Document.h" #include "data/fileio/WavFileWriter.h" #include "transform/TransformFactory.h" #include "widgets/LevelPanWidget.h" #include "widgets/LevelPanToolButton.h" #include "widgets/AudioDial.h" #include #include void MainWindow::handleOSCMessage(const OSCMessage &message) { SVDEBUG << "OSCHandler: method = \"" << message.getMethod() << "\"" << endl; // This large function should really be abstracted out. if (message.getMethod() == "open") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString path = message.getArg(0).toString(); if (open(path, ReplaceMainModel) != FileOpenSucceeded) { cerr << "OSCHandler: File open failed for path \"" << path << "\"" << endl; } //!!! we really need to spin here and not return until the // file has been completely decoded... } } else if (message.getMethod() == "openadditional") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString path = message.getArg(0).toString(); if (open(path, CreateAdditionalModel) != FileOpenSucceeded) { cerr << "OSCHandler: File open failed for path \"" << path << "\"" << endl; } } } else if (message.getMethod() == "recent" || message.getMethod() == "last") { int n = 0; if (message.getMethod() == "recent" && message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::Int)) { n = message.getArg(0).toInt() - 1; } std::vector recent = m_recentFiles.getRecent(); if (n >= 0 && n < int(recent.size())) { if (open(recent[n], ReplaceMainModel) != FileOpenSucceeded) { cerr << "OSCHandler: File open failed for path \"" << recent[n] << "\"" << endl; } } } else if (message.getMethod() == "save") { QString path; if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { path = message.getArg(0).toString(); if (QFileInfo(path).exists()) { SVDEBUG << "OSCHandler: Refusing to overwrite existing file in save" << endl; } else { saveSessionFile(path); } } } else if (message.getMethod() == "export") { QString path; if (getMainModel()) { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { path = message.getArg(0).toString(); if (QFileInfo(path).exists()) { SVDEBUG << "OSCHandler: Refusing to overwrite existing file in export" << endl; } else { WavFileWriter writer(path, getMainModel()->getSampleRate(), getMainModel()->getChannelCount(), WavFileWriter::WriteToTemporary); MultiSelection ms = m_viewManager->getSelection(); if (!ms.getSelections().empty()) { writer.writeModel(getMainModel(), &ms); } else { writer.writeModel(getMainModel()); } } } } } else if (message.getMethod() == "jump" || message.getMethod() == "play") { if (getMainModel()) { sv_frame_t frame = m_viewManager->getPlaybackFrame(); bool selection = false; bool play = (message.getMethod() == "play"); if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "selection") { selection = true; } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "end") { frame = getMainModel()->getEndFrame(); } else if (message.getArg(0).canConvert(QVariant::Double)) { double time = message.getArg(0).toDouble(); if (time < 0.0) time = 0.0; frame = lrint(time * getMainModel()->getSampleRate()); } } if (frame > getMainModel()->getEndFrame()) { frame = getMainModel()->getEndFrame(); } if (play) { m_viewManager->setPlaySelectionMode(selection); } if (selection) { MultiSelection::SelectionList sl = m_viewManager->getSelections(); if (!sl.empty()) { frame = sl.begin()->getStartFrame(); } } SVDEBUG << "OSCHandler: Setting playback frame to " << frame << endl; m_viewManager->setPlaybackFrame(frame); if (play) { if (!m_playSource->isPlaying()) { SVDEBUG << "OSCHandler: Play source is not yet playing, calling play()" << endl; // handles audio device suspend/resume etc, as // well as calling m_playSource->play(frame) MainWindow::play(); } else { SVDEBUG << "OSCHandler: Play source is already playing, not starting it" << endl; } } else { SVDEBUG << "OSCHandler: Jump only requested, not starting playback" << endl; } } } else if (message.getMethod() == "ffwd") { if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "similar") { ffwdSimilar(); } } else { ffwd(); } } else if (message.getMethod() == "rewind") { if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "similar") { rewindSimilar(); } } else { rewind(); } } else if (message.getMethod() == "stop") { if (m_playSource->isPlaying()) { // As with play, we want to use the MainWindow // function rather than call m_playSource directly // because that way the audio driver suspend/resume // etc is handled properly MainWindow::stop(); } } else if (message.getMethod() == "loop") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString str = message.getArg(0).toString(); if (str == "on") { m_viewManager->setPlayLoopMode(true); } else if (str == "off") { m_viewManager->setPlayLoopMode(false); } } } else if (message.getMethod() == "solo") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString str = message.getArg(0).toString(); if (str == "on") { m_viewManager->setPlaySoloMode(true); } else if (str == "off") { m_viewManager->setPlaySoloMode(false); } } } else if (message.getMethod() == "select" || message.getMethod() == "addselect") { if (getMainModel()) { sv_frame_t f0 = getMainModel()->getStartFrame(); sv_frame_t f1 = getMainModel()->getEndFrame(); bool done = false; if (message.getArgCount() == 2 && message.getArg(0).canConvert(QVariant::Double) && message.getArg(1).canConvert(QVariant::Double)) { double t0 = message.getArg(0).toDouble(); double t1 = message.getArg(1).toDouble(); if (t1 < t0) { double temp = t0; t0 = t1; t1 = temp; } if (t0 < 0.0) t0 = 0.0; if (t1 < 0.0) t1 = 0.0; f0 = lrint(t0 * getMainModel()->getSampleRate()); f1 = lrint(t1 * getMainModel()->getSampleRate()); Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = 0; if (pane) layer = pane->getSelectedLayer(); if (layer) { int resolution; layer->snapToFeatureFrame(pane, f0, resolution, Layer::SnapLeft); layer->snapToFeatureFrame(pane, f1, resolution, Layer::SnapRight); } } else if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString str = message.getArg(0).toString(); if (str == "none") { m_viewManager->clearSelections(); done = true; } } if (!done) { if (message.getMethod() == "select") { m_viewManager->setSelection(Selection(f0, f1)); } else { m_viewManager->addSelection(Selection(f0, f1)); } } } } else if (message.getMethod() == "add") { if (getMainModel()) { if (message.getArgCount() >= 1 && message.getArg(0).canConvert(QVariant::String)) { int channel = -1; if (message.getArgCount() == 2 && message.getArg(0).canConvert(QVariant::Int)) { channel = message.getArg(0).toInt(); if (channel < -1 || channel > int(getMainModel()->getChannelCount())) { cerr << "WARNING: OSCHandler: channel " << channel << " out of range" << endl; channel = -1; } } QString str = message.getArg(0).toString(); LayerFactory::LayerType type = LayerFactory::getInstance()->getLayerTypeForName(str); if (type == LayerFactory::UnknownLayer) { cerr << "WARNING: OSCHandler: unknown layer " << "type " << str << endl; } else { LayerConfiguration configuration(type, getMainModel(), channel); addPane(configuration, tr("Add %1 Pane") .arg(LayerFactory::getInstance()-> getLayerPresentationName(type))); } } } } else if (message.getMethod() == "undo") { CommandHistory::getInstance()->undo(); } else if (message.getMethod() == "redo") { CommandHistory::getInstance()->redo(); } else if (message.getMethod() == "set") { if (message.getArgCount() == 2 && message.getArg(0).canConvert(QVariant::String) && message.getArg(1).canConvert(QVariant::Double)) { QString property = message.getArg(0).toString(); float value = (float)message.getArg(1).toDouble(); if (property == "gain") { if (value < 0.0) value = 0.0; m_mainLevelPan->setLevel(value); if (m_playTarget) m_playTarget->setOutputGain(value); } else if (property == "speed") { m_playSpeed->setMappedValue(value); } else if (property == "speedup") { // The speedup method existed before the speed method // and is a bit weirder. // // For speed(x), x is a percentage of normal speed, so // x=100 means play at the normal speed, x=50 means // half speed, x=200 double speed etc. // // For speedup(x), x was some sort of modifier of // percentage thing, so x=0 meant play at the normal // speed, x=50 meant play at 150% of normal speed, // x=100 meant play at double speed, and x=-100 rather // bizarrely meant play at half speed. We handle this // now by converting to speed percentage as follows: double percentage = 100.0; if (value > 0.f) { percentage = percentage + value; } else { percentage = 10000.0 / (percentage - value); } SVDEBUG << "OSCHandler: converted speedup(" << value << ") into speed(" << percentage << ")" << endl; m_playSpeed->setMappedValue(percentage); } else if (property == "overlays") { if (value < 0.5) { m_viewManager->setOverlayMode(ViewManager::NoOverlays); } else if (value < 1.5) { m_viewManager->setOverlayMode(ViewManager::StandardOverlays); } else { m_viewManager->setOverlayMode(ViewManager::AllOverlays); } } else if (property == "zoomwheels") { m_viewManager->setZoomWheelsEnabled(value > 0.5); } else if (property == "propertyboxes") { bool toggle = ((value < 0.5) != (m_paneStack->getLayoutStyle() == PaneStack::NoPropertyStacks)); if (toggle) togglePropertyBoxes(); } } else { PropertyContainer *container = 0; Pane *pane = m_paneStack->getCurrentPane(); if (pane && message.getArgCount() == 3 && message.getArg(0).canConvert(QVariant::String) && message.getArg(1).canConvert(QVariant::String) && message.getArg(2).canConvert(QVariant::String)) { if (message.getArg(0).toString() == "pane") { container = pane->getPropertyContainer(0); } else if (message.getArg(0).toString() == "layer") { container = pane->getSelectedLayer(); } } if (container) { QString nameString = message.getArg(1).toString(); QString valueString = message.getArg(2).toString(); Command *c = container->getSetPropertyCommand (nameString, valueString); if (c) CommandHistory::getInstance()->addCommand(c, true, true); } } } else if (message.getMethod() == "setcurrent") { int paneIndex = -1, layerIndex = -1; bool wantLayer = false; if (message.getArgCount() >= 1 && message.getArg(0).canConvert(QVariant::Int)) { paneIndex = message.getArg(0).toInt() - 1; if (message.getArgCount() >= 2 && message.getArg(1).canConvert(QVariant::Int)) { wantLayer = true; layerIndex = message.getArg(1).toInt() - 1; } } if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) { Pane *pane = m_paneStack->getPane(paneIndex); m_paneStack->setCurrentPane(pane); if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) { Layer *layer = pane->getLayer(layerIndex); m_paneStack->setCurrentLayer(pane, layer); } else if (wantLayer && layerIndex == -1) { m_paneStack->setCurrentLayer(pane, 0); } } } else if (message.getMethod() == "delete") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString target = message.getArg(0).toString(); if (target == "pane") { deleteCurrentPane(); } else if (target == "layer") { deleteCurrentLayer(); } else { cerr << "WARNING: OSCHandler: Unknown delete target " << target << endl; } } } else if (message.getMethod() == "zoom") { if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "in") { zoomIn(); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "out") { zoomOut(); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "default") { zoomDefault(); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "fit") { zoomToFit(); } else if (message.getArg(0).canConvert(QVariant::Double)) { double level = message.getArg(0).toDouble(); Pane *currentPane = m_paneStack->getCurrentPane(); if (level < 1.0) level = 1.0; if (currentPane) currentPane->setZoomLevel(int(lrint(level))); } } } else if (message.getMethod() == "zoomvertical") { Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = 0; if (pane && pane->getLayerCount() > 0) { layer = pane->getLayer(pane->getLayerCount() - 1); } int defaultStep = 0; int steps = 0; if (layer) { steps = layer->getVerticalZoomSteps(defaultStep); if (message.getArgCount() == 1 && steps > 0) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "in") { int step = layer->getCurrentVerticalZoomStep() + 1; if (step < steps) layer->setVerticalZoomStep(step); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "out") { int step = layer->getCurrentVerticalZoomStep() - 1; if (step >= 0) layer->setVerticalZoomStep(step); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "default") { layer->setVerticalZoomStep(defaultStep); } } else if (message.getArgCount() == 2) { if (message.getArg(0).canConvert(QVariant::Double) && message.getArg(1).canConvert(QVariant::Double)) { double min = message.getArg(0).toDouble(); double max = message.getArg(1).toDouble(); layer->setDisplayExtents(min, max); } } } } else if (message.getMethod() == "quit") { m_abandoning = true; close(); } else if (message.getMethod() == "resize") { if (message.getArgCount() == 2) { int width = 0, height = 0; if (message.getArg(1).canConvert(QVariant::Int)) { height = message.getArg(1).toInt(); if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "pane") { Pane *pane = m_paneStack->getCurrentPane(); if (pane) pane->resize(pane->width(), height); } else if (message.getArg(0).canConvert(QVariant::Int)) { width = message.getArg(0).toInt(); resize(width, height); } } } } else if (message.getMethod() == "transform") { Pane *pane = m_paneStack->getCurrentPane(); if (getMainModel() && pane && message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { TransformId transformId = message.getArg(0).toString(); Transform transform = TransformFactory::getInstance()-> getDefaultTransformFor(transformId); Layer *newLayer = m_document->createDerivedLayer (transform, getMainModel()); if (newLayer) { m_document->addLayerToView(pane, newLayer); m_recentTransforms.add(transformId); m_paneStack->setCurrentLayer(pane, newLayer); } } } else { cerr << "WARNING: OSCHandler: Unknown or unsupported " << "method \"" << message.getMethod() << "\"" << endl; } } sonic-visualiser-3.0.3/main/PreferencesDialog.cpp0000644000000000000000000010260613111512442020152 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PreferencesDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "widgets/WindowTypeSelector.h" #include "widgets/IconLoader.h" #include "widgets/ColourMapComboBox.h" #include "widgets/ColourComboBox.h" #include "base/Preferences.h" #include "base/ResourceFinder.h" #include "layer/ColourMapper.h" #include "layer/ColourDatabase.h" #include "bqaudioio/AudioFactory.h" #include "../version.h" using namespace std; PreferencesDialog::PreferencesDialog(QWidget *parent) : QDialog(parent), m_audioImplementation(0), m_audioPlaybackDevice(0), m_audioRecordDevice(0), m_audioDeviceChanged(false), m_coloursChanged(false), m_changesOnRestart(false) { setWindowTitle(tr("Sonic Visualiser: Application Preferences")); Preferences *prefs = Preferences::getInstance(); QGridLayout *grid = new QGridLayout; setLayout(grid); m_tabs = new QTabWidget; grid->addWidget(m_tabs, 0, 0); m_tabs->setTabPosition(QTabWidget::North); // Create this first, as slots that get called from the ctor will // refer to it m_applyButton = new QPushButton(tr("Apply")); // Create all the preference widgets first, then create the // individual tab widgets and place the preferences in their // appropriate places in one go afterwards int min, max, deflt, i; m_windowType = WindowType(prefs->getPropertyRangeAndValue ("Window Type", &min, &max, &deflt)); m_windowTypeSelector = new WindowTypeSelector(m_windowType); connect(m_windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)), this, SLOT(windowTypeChanged(WindowType))); QCheckBox *vampProcessSeparation = new QCheckBox; m_runPluginsInProcess = prefs->getRunPluginsInProcess(); vampProcessSeparation->setCheckState(m_runPluginsInProcess ? Qt::Unchecked : Qt::Checked); connect(vampProcessSeparation, SIGNAL(stateChanged(int)), this, SLOT(vampProcessSeparationChanged(int))); QComboBox *smoothing = new QComboBox; int sm = prefs->getPropertyRangeAndValue("Spectrogram Y Smoothing", &min, &max, &deflt); m_spectrogramSmoothing = sm; for (i = min; i <= max; ++i) { smoothing->addItem(prefs->getPropertyValueLabel("Spectrogram Y Smoothing", i)); } smoothing->setCurrentIndex(sm); connect(smoothing, SIGNAL(currentIndexChanged(int)), this, SLOT(spectrogramSmoothingChanged(int))); QComboBox *xsmoothing = new QComboBox; int xsm = prefs->getPropertyRangeAndValue("Spectrogram X Smoothing", &min, &max, &deflt); m_spectrogramXSmoothing = xsm; for (i = min; i <= max; ++i) { xsmoothing->addItem(prefs->getPropertyValueLabel("Spectrogram X Smoothing", i)); } xsmoothing->setCurrentIndex(xsm); connect(xsmoothing, SIGNAL(currentIndexChanged(int)), this, SLOT(spectrogramXSmoothingChanged(int))); QComboBox *propertyLayout = new QComboBox; int pl = prefs->getPropertyRangeAndValue("Property Box Layout", &min, &max, &deflt); m_propertyLayout = pl; for (i = min; i <= max; ++i) { propertyLayout->addItem(prefs->getPropertyValueLabel("Property Box Layout", i)); } propertyLayout->setCurrentIndex(pl); connect(propertyLayout, SIGNAL(currentIndexChanged(int)), this, SLOT(propertyLayoutChanged(int))); QSettings settings; settings.beginGroup("Preferences"); m_spectrogramGColour = (settings.value("spectrogram-colour", int(ColourMapper::Green)).toInt()); m_spectrogramMColour = (settings.value("spectrogram-melodic-colour", int(ColourMapper::Sunset)).toInt()); m_colour3DColour = (settings.value("colour-3d-plot-colour", int(ColourMapper::Green)).toInt()); m_overviewColour = ColourDatabase::getInstance()->getColour(tr("Green")); if (settings.contains("overview-colour")) { QString qcolorName = settings.value("overview-colour", m_overviewColour.name()) .toString(); m_overviewColour.setNamedColor(qcolorName); cerr << "loaded colour " << m_overviewColour.name() << " from settings" << endl; } settings.endGroup(); ColourMapComboBox *spectrogramGColour = new ColourMapComboBox(true); spectrogramGColour->setCurrentIndex(m_spectrogramGColour); ColourMapComboBox *spectrogramMColour = new ColourMapComboBox(true); spectrogramMColour->setCurrentIndex(m_spectrogramMColour); ColourMapComboBox *colour3DColour = new ColourMapComboBox(true); colour3DColour->setCurrentIndex(m_colour3DColour); // can't have "add new colour", as it gets saved in the session not in prefs ColourComboBox *overviewColour = new ColourComboBox(false); int overviewColourIndex = ColourDatabase::getInstance()->getColourIndex(m_overviewColour); cerr << "index = " << overviewColourIndex << " for colour " << m_overviewColour.name() << endl; if (overviewColourIndex >= 0) { overviewColour->setCurrentIndex(overviewColourIndex); } connect(spectrogramGColour, SIGNAL(colourMapChanged(int)), this, SLOT(spectrogramGColourChanged(int))); connect(spectrogramMColour, SIGNAL(colourMapChanged(int)), this, SLOT(spectrogramMColourChanged(int))); connect(colour3DColour, SIGNAL(colourMapChanged(int)), this, SLOT(colour3DColourChanged(int))); connect(overviewColour, SIGNAL(colourChanged(int)), this, SLOT(overviewColourChanged(int))); m_tuningFrequency = prefs->getTuningFrequency(); QDoubleSpinBox *frequency = new QDoubleSpinBox; frequency->setMinimum(100.0); frequency->setMaximum(5000.0); frequency->setSuffix(" Hz"); frequency->setSingleStep(1); frequency->setValue(m_tuningFrequency); frequency->setDecimals(2); connect(frequency, SIGNAL(valueChanged(double)), this, SLOT(tuningFrequencyChanged(double))); QComboBox *octaveSystem = new QComboBox; int oct = prefs->getPropertyRangeAndValue ("Octave Numbering System", &min, &max, &deflt); m_octaveSystem = oct; for (i = min; i <= max; ++i) { octaveSystem->addItem(prefs->getPropertyValueLabel ("Octave Numbering System", i)); } octaveSystem->setCurrentIndex(oct); connect(octaveSystem, SIGNAL(currentIndexChanged(int)), this, SLOT(octaveSystemChanged(int))); settings.beginGroup("Preferences"); QComboBox *audioImplementation = new QComboBox; connect(audioImplementation, SIGNAL(currentIndexChanged(int)), this, SLOT(audioImplementationChanged(int))); m_audioPlaybackDeviceCombo = new QComboBox; connect(m_audioPlaybackDeviceCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(audioPlaybackDeviceChanged(int))); m_audioRecordDeviceCombo = new QComboBox; connect(m_audioRecordDeviceCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(audioRecordDeviceChanged(int))); vector implementationNames = breakfastquay::AudioFactory::getImplementationNames(); QString implementationName = settings.value("audio-target", "").toString(); if (implementationName == "auto") implementationName = ""; if (implementationName == "" && implementationNames.size() == 1) { // We won't be showing the implementations menu in this case implementationName = implementationNames[0].c_str(); } audioImplementation->addItem(tr("(auto)")); m_audioImplementation = 0; for (int i = 0; in_range_for(implementationNames, i); ++i) { audioImplementation->addItem (breakfastquay::AudioFactory::getImplementationDescription (implementationNames[i]).c_str()); if (implementationName.toStdString() == implementationNames[i]) { audioImplementation->setCurrentIndex(i+1); m_audioImplementation = i+1; } } settings.endGroup(); rebuildDeviceCombos(); m_audioDeviceChanged = false; // the rebuild will have changed this QCheckBox *resampleOnLoad = new QCheckBox; m_resampleOnLoad = prefs->getResampleOnLoad(); resampleOnLoad->setCheckState(m_resampleOnLoad ? Qt::Checked : Qt::Unchecked); connect(resampleOnLoad, SIGNAL(stateChanged(int)), this, SLOT(resampleOnLoadChanged(int))); QCheckBox *gaplessMode = new QCheckBox; m_gapless = prefs->getUseGaplessMode(); gaplessMode->setCheckState(m_gapless ? Qt::Checked : Qt::Unchecked); connect(gaplessMode, SIGNAL(stateChanged(int)), this, SLOT(gaplessModeChanged(int))); m_tempDirRootEdit = new QLineEdit; QString dir = prefs->getTemporaryDirectoryRoot(); m_tempDirRoot = dir; dir.replace("$HOME", tr("")); m_tempDirRootEdit->setText(dir); m_tempDirRootEdit->setReadOnly(true); QPushButton *tempDirButton = new QPushButton; tempDirButton->setIcon(IconLoader().load("fileopen")); connect(tempDirButton, SIGNAL(clicked()), this, SLOT(tempDirButtonClicked())); tempDirButton->setFixedSize(QSize(24, 24)); QCheckBox *showSplash = new QCheckBox; m_showSplash = prefs->getShowSplash(); showSplash->setCheckState(m_showSplash ? Qt::Checked : Qt::Unchecked); connect(showSplash, SIGNAL(stateChanged(int)), this, SLOT(showSplashChanged(int))); #ifdef NOT_DEFINED // This no longer works correctly on any platform AFAICS QComboBox *bgMode = new QComboBox; int bg = prefs->getPropertyRangeAndValue("Background Mode", &min, &max, &deflt); m_backgroundMode = bg; for (i = min; i <= max; ++i) { bgMode->addItem(prefs->getPropertyValueLabel("Background Mode", i)); } bgMode->setCurrentIndex(bg); connect(bgMode, SIGNAL(currentIndexChanged(int)), this, SLOT(backgroundModeChanged(int))); #endif settings.beginGroup("Preferences"); #ifdef Q_OS_MAC m_retina = settings.value("scaledHiDpi", true).toBool(); QCheckBox *retina = new QCheckBox; retina->setCheckState(m_retina ? Qt::Checked : Qt::Unchecked); connect(retina, SIGNAL(stateChanged(int)), this, SLOT(retinaChanged(int))); #else m_retina = false; #endif QString userLocale = settings.value("locale", "").toString(); m_currentLocale = userLocale; QString permishTag = QString("network-permission-%1").arg(SV_VERSION); m_networkPermission = settings.value(permishTag, false).toBool(); settings.endGroup(); QComboBox *locale = new QComboBox; QStringList localeFiles = QDir(":i18n").entryList(QStringList() << "*.qm"); locale->addItem(tr("Follow system locale")); m_locales.push_back(""); if (userLocale == "") { locale->setCurrentIndex(0); } foreach (QString f, localeFiles) { QString f0 = f; f.replace("sonic-visualiser_", "").replace(".qm", ""); if (f == f0) { // our expectations about filename format were not met cerr << "INFO: Unexpected filename " << f << " in i18n resource directory" << endl; } else { m_locales.push_back(f); QString displayText; // Add new translations here if (f == "ru") displayText = tr("Russian"); else if (f == "en_GB") displayText = tr("British English"); else if (f == "en_US") displayText = tr("American English"); else if (f == "cs_CZ") displayText = tr("Czech"); else displayText = f; locale->addItem(QString("%1 [%2]").arg(displayText).arg(f)); if (userLocale == f) { locale->setCurrentIndex(locale->count() - 1); } } } connect(locale, SIGNAL(currentIndexChanged(int)), this, SLOT(localeChanged(int))); QCheckBox *networkPermish = new QCheckBox; networkPermish->setCheckState(m_networkPermission ? Qt::Checked : Qt::Unchecked); connect(networkPermish, SIGNAL(stateChanged(int)), this, SLOT(networkPermissionChanged(int))); QSpinBox *fontSize = new QSpinBox; int fs = prefs->getPropertyRangeAndValue("View Font Size", &min, &max, &deflt); m_viewFontSize = fs; fontSize->setMinimum(min); fontSize->setMaximum(max); fontSize->setSuffix(" pt"); fontSize->setSingleStep(1); fontSize->setValue(fs); connect(fontSize, SIGNAL(valueChanged(int)), this, SLOT(viewFontSizeChanged(int))); QComboBox *ttMode = new QComboBox; int tt = prefs->getPropertyRangeAndValue("Time To Text Mode", &min, &max, &deflt); m_timeToTextMode = tt; for (i = min; i <= max; ++i) { ttMode->addItem(prefs->getPropertyValueLabel("Time To Text Mode", i)); } ttMode->setCurrentIndex(tt); connect(ttMode, SIGNAL(currentIndexChanged(int)), this, SLOT(timeToTextModeChanged(int))); QCheckBox *hms = new QCheckBox; int showHMS = prefs->getPropertyRangeAndValue ("Show Hours And Minutes", &min, &max, &deflt); m_showHMS = (showHMS != 0); hms->setCheckState(m_showHMS ? Qt::Checked : Qt::Unchecked); connect(hms, SIGNAL(stateChanged(int)), this, SLOT(showHMSChanged(int))); QFrame *frame = 0; QGridLayout *subgrid = 0; int row = 0; // Appearance tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; #ifdef Q_OS_MAC if (devicePixelRatio() > 1) { subgrid->addWidget(new QLabel(tr("Draw layers at Retina resolution:")), row, 0); subgrid->addWidget(retina, row++, 1, 1, 1); } #endif subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Property Box Layout"))), row, 0); subgrid->addWidget(propertyLayout, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("Default spectrogram colour:")), row, 0); subgrid->addWidget(spectrogramGColour, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("Default melodic spectrogram colour:")), row, 0); subgrid->addWidget(spectrogramMColour, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("Default colour 3D plot colour:")), row, 0); subgrid->addWidget(colour3DColour, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("Overview waveform colour:")), row, 0); subgrid->addWidget(overviewColour, row++, 1, 1, 2); #ifdef NOT_DEFINED // see earlier subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Background Mode"))), row, 0); subgrid->addWidget(bgMode, row++, 1, 1, 2); #endif subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("View Font Size"))), row, 0); subgrid->addWidget(fontSize, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Time To Text Mode"))), row, 0); subgrid->addWidget(ttMode, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Show Hours And Minutes"))), row, 0); subgrid->addWidget(hms, row++, 1, 1, 1); subgrid->setRowStretch(row, 10); m_tabOrdering[AppearanceTab] = m_tabs->count(); m_tabs->addTab(frame, tr("&Appearance")); // Analysis tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Tuning Frequency"))), row, 0); subgrid->addWidget(frequency, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Octave Numbering System"))), row, 0); subgrid->addWidget(octaveSystem, row++, 1, 1, 2); subgrid->addWidget(new QLabel(prefs->getPropertyLabel ("Spectrogram Y Smoothing")), row, 0); subgrid->addWidget(smoothing, row++, 1, 1, 2); subgrid->addWidget(new QLabel(prefs->getPropertyLabel ("Spectrogram X Smoothing")), row, 0); subgrid->addWidget(xsmoothing, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Window Type"))), row, 0); subgrid->addWidget(m_windowTypeSelector, row++, 1, 2, 2); subgrid->setRowStretch(row, 10); row++; subgrid->addWidget(new QLabel(tr("Run Vamp plugins in separate process:")), row, 0); subgrid->addWidget(vampProcessSeparation, row++, 1, 1, 1); subgrid->setRowStretch(row, 10); m_tabOrdering[AnalysisTab] = m_tabs->count(); m_tabs->addTab(frame, tr("Anal&ysis")); // Template tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; subgrid->addWidget(new QLabel(tr("Default session template when loading audio files:")), row++, 0); QListWidget *lw = new QListWidget(); subgrid->addWidget(lw, row, 0); subgrid->setRowStretch(row, 10); row++; subgrid->addWidget(new QLabel(tr("(Use \"%1\" in the File menu to add to these.)") .arg(tr("Export Session as Template..."))), row++, 0); settings.beginGroup("MainWindow"); m_currentTemplate = settings.value("sessiontemplate", "").toString(); settings.endGroup(); lw->addItem(tr("Standard Waveform")); if (m_currentTemplate == "" || m_currentTemplate == "default") { lw->setCurrentRow(lw->count()-1); } m_templates.push_back(""); QStringList templates = ResourceFinder().getResourceFiles("templates", "svt"); set byName; foreach (QString t, templates) { byName.insert(QFileInfo(t).baseName()); } foreach (QString t, byName) { if (t.toLower() == "default") continue; m_templates.push_back(t); lw->addItem(t); if (m_currentTemplate == t) { lw->setCurrentRow(lw->count()-1); } } connect(lw, SIGNAL(currentRowChanged(int)), this, SLOT(defaultTemplateChanged(int))); m_tabOrdering[TemplateTab] = m_tabs->count(); m_tabs->addTab(frame, tr("Session &Template")); // Audio IO tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; if (implementationNames.size() > 1) { subgrid->addWidget(new QLabel(tr("Audio service:")), row, 0); subgrid->addWidget(audioImplementation, row++, 1, 1, 2); } subgrid->addWidget(new QLabel(tr("Audio playback device:")), row, 0); subgrid->addWidget(m_audioPlaybackDeviceCombo, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("Audio record device:")), row, 0); subgrid->addWidget(m_audioRecordDeviceCombo, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Use Gapless Mode"))), row, 0); subgrid->addWidget(gaplessMode, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Resample On Load"))), row, 0); subgrid->addWidget(resampleOnLoad, row++, 1, 1, 1); subgrid->setRowStretch(row, 10); m_tabOrdering[AudioIOTab] = m_tabs->count(); m_tabs->addTab(frame, tr("A&udio I/O")); // General tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; subgrid->addWidget(new QLabel(tr("%1:").arg(tr("User interface language"))), row, 0); subgrid->addWidget(locale, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("%1:").arg(tr("Allow network usage"))), row, 0); subgrid->addWidget(networkPermish, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Show Splash Screen"))), row, 0); subgrid->addWidget(showSplash, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Temporary Directory Root"))), row, 0); subgrid->addWidget(m_tempDirRootEdit, row, 1, 1, 1); subgrid->addWidget(tempDirButton, row, 2, 1, 1); row++; subgrid->setRowStretch(row, 10); m_tabOrdering[GeneralTab] = m_tabs->count(); m_tabs->addTab(frame, tr("&Other")); QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal); grid->addWidget(bb, 1, 0); QPushButton *ok = new QPushButton(tr("OK")); QPushButton *cancel = new QPushButton(tr("Cancel")); bb->addButton(ok, QDialogButtonBox::AcceptRole); bb->addButton(m_applyButton, QDialogButtonBox::ApplyRole); bb->addButton(cancel, QDialogButtonBox::RejectRole); connect(ok, SIGNAL(clicked()), this, SLOT(okClicked())); connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyClicked())); connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked())); m_applyButton->setEnabled(false); } PreferencesDialog::~PreferencesDialog() { SVDEBUG << "PreferencesDialog::~PreferencesDialog()" << endl; } void PreferencesDialog::rebuildDeviceCombos() { QSettings settings; settings.beginGroup("Preferences"); vector names = breakfastquay::AudioFactory::getImplementationNames(); string implementationName; if (in_range_for(names, m_audioImplementation-1)) { implementationName = names[m_audioImplementation-1]; } QString suffix; if (implementationName != "") { suffix = "-" + QString(implementationName.c_str()); } names = breakfastquay::AudioFactory::getPlaybackDeviceNames(implementationName); QString playbackDeviceName = settings.value ("audio-playback-device" + suffix, "").toString(); m_audioPlaybackDeviceCombo->clear(); m_audioPlaybackDeviceCombo->addItem(tr("(auto)")); m_audioPlaybackDeviceCombo->setCurrentIndex(0); m_audioPlaybackDevice = 0; for (int i = 0; in_range_for(names, i); ++i) { m_audioPlaybackDeviceCombo->addItem(names[i].c_str()); if (playbackDeviceName.toStdString() == names[i]) { m_audioPlaybackDeviceCombo->setCurrentIndex(i+1); m_audioPlaybackDevice = i+1; } } names = breakfastquay::AudioFactory::getRecordDeviceNames(implementationName); QString recordDeviceName = settings.value ("audio-record-device" + suffix, "").toString(); m_audioRecordDeviceCombo->clear(); m_audioRecordDeviceCombo->addItem(tr("(auto)")); m_audioRecordDeviceCombo->setCurrentIndex(0); m_audioRecordDevice = 0; for (int i = 0; in_range_for(names, i); ++i) { m_audioRecordDeviceCombo->addItem(names[i].c_str()); if (recordDeviceName.toStdString() == names[i]) { m_audioRecordDeviceCombo->setCurrentIndex(i+1); m_audioRecordDevice = i+1; } } settings.endGroup(); } void PreferencesDialog::switchToTab(Tab t) { if (m_tabOrdering.contains(t)) { m_tabs->setCurrentIndex(m_tabOrdering[t]); } } void PreferencesDialog::windowTypeChanged(WindowType type) { m_windowType = type; m_applyButton->setEnabled(true); } void PreferencesDialog::spectrogramSmoothingChanged(int smoothing) { m_spectrogramSmoothing = smoothing; m_applyButton->setEnabled(true); } void PreferencesDialog::spectrogramXSmoothingChanged(int smoothing) { m_spectrogramXSmoothing = smoothing; m_applyButton->setEnabled(true); } void PreferencesDialog::spectrogramGColourChanged(int colour) { m_spectrogramGColour = colour; m_coloursChanged = true; m_applyButton->setEnabled(true); } void PreferencesDialog::spectrogramMColourChanged(int colour) { m_spectrogramMColour = colour; m_coloursChanged = true; m_applyButton->setEnabled(true); } void PreferencesDialog::colour3DColourChanged(int colour) { m_colour3DColour = colour; m_coloursChanged = true; m_applyButton->setEnabled(true); } void PreferencesDialog::overviewColourChanged(int colour) { m_overviewColour = ColourDatabase::getInstance()->getColour(colour); m_coloursChanged = true; m_applyButton->setEnabled(true); } void PreferencesDialog::propertyLayoutChanged(int layout) { m_propertyLayout = layout; m_applyButton->setEnabled(true); } void PreferencesDialog::tuningFrequencyChanged(double freq) { m_tuningFrequency = freq; m_applyButton->setEnabled(true); } void PreferencesDialog::audioImplementationChanged(int s) { if (m_audioImplementation != s) { m_audioImplementation = s; rebuildDeviceCombos(); m_applyButton->setEnabled(true); m_audioDeviceChanged = true; } } void PreferencesDialog::audioPlaybackDeviceChanged(int s) { if (m_audioPlaybackDevice != s) { m_audioPlaybackDevice = s; m_applyButton->setEnabled(true); m_audioDeviceChanged = true; } } void PreferencesDialog::audioRecordDeviceChanged(int s) { if (m_audioRecordDevice != s) { m_audioRecordDevice = s; m_applyButton->setEnabled(true); m_audioDeviceChanged = true; } } void PreferencesDialog::resampleOnLoadChanged(int state) { m_resampleOnLoad = (state == Qt::Checked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::gaplessModeChanged(int state) { m_gapless = (state == Qt::Checked); m_applyButton->setEnabled(true); } void PreferencesDialog::vampProcessSeparationChanged(int state) { m_runPluginsInProcess = (state == Qt::Unchecked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::networkPermissionChanged(int state) { m_networkPermission = (state == Qt::Checked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::retinaChanged(int state) { m_retina = (state == Qt::Checked); m_applyButton->setEnabled(true); // Does not require a restart } void PreferencesDialog::showSplashChanged(int state) { m_showSplash = (state == Qt::Checked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::defaultTemplateChanged(int i) { m_currentTemplate = m_templates[i]; m_applyButton->setEnabled(true); } void PreferencesDialog::localeChanged(int i) { m_currentLocale = m_locales[i]; m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::tempDirRootChanged(QString r) { m_tempDirRoot = r; m_applyButton->setEnabled(true); } void PreferencesDialog::tempDirButtonClicked() { QString dir = QFileDialog::getExistingDirectory (this, tr("Select a directory to create cache subdirectory in"), m_tempDirRoot); if (dir == "") return; m_tempDirRootEdit->setText(dir); tempDirRootChanged(dir); m_changesOnRestart = true; } void PreferencesDialog::backgroundModeChanged(int mode) { m_backgroundMode = mode; m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::timeToTextModeChanged(int mode) { m_timeToTextMode = mode; m_applyButton->setEnabled(true); } void PreferencesDialog::showHMSChanged(int state) { m_showHMS = (state == Qt::Checked); m_applyButton->setEnabled(true); } void PreferencesDialog::octaveSystemChanged(int system) { m_octaveSystem = system; m_applyButton->setEnabled(true); } void PreferencesDialog::viewFontSizeChanged(int sz) { m_viewFontSize = sz; m_applyButton->setEnabled(true); } void PreferencesDialog::okClicked() { applyClicked(); accept(); } void PreferencesDialog::applyClicked() { Preferences *prefs = Preferences::getInstance(); prefs->setWindowType(WindowType(m_windowType)); prefs->setSpectrogramSmoothing(Preferences::SpectrogramSmoothing (m_spectrogramSmoothing)); prefs->setSpectrogramXSmoothing(Preferences::SpectrogramXSmoothing (m_spectrogramXSmoothing)); prefs->setPropertyBoxLayout(Preferences::PropertyBoxLayout (m_propertyLayout)); prefs->setTuningFrequency(m_tuningFrequency); prefs->setResampleOnLoad(m_resampleOnLoad); prefs->setUseGaplessMode(m_gapless); prefs->setRunPluginsInProcess(m_runPluginsInProcess); prefs->setShowSplash(m_showSplash); prefs->setTemporaryDirectoryRoot(m_tempDirRoot); prefs->setBackgroundMode(Preferences::BackgroundMode(m_backgroundMode)); prefs->setTimeToTextMode(Preferences::TimeToTextMode(m_timeToTextMode)); prefs->setShowHMS(m_showHMS); prefs->setViewFontSize(m_viewFontSize); prefs->setProperty("Octave Numbering System", m_octaveSystem); QSettings settings; settings.beginGroup("Preferences"); QString permishTag = QString("network-permission-%1").arg(SV_VERSION); settings.setValue(permishTag, m_networkPermission); vector names = breakfastquay::AudioFactory::getImplementationNames(); string implementationName; if (m_audioImplementation > int(names.size())) { m_audioImplementation = 0; } if (m_audioImplementation > 0) { implementationName = names[m_audioImplementation-1]; } settings.setValue("audio-target", implementationName.c_str()); QString suffix; if (implementationName != "") { suffix = "-" + QString(implementationName.c_str()); } names = breakfastquay::AudioFactory::getPlaybackDeviceNames(implementationName); string deviceName; if (m_audioPlaybackDevice > int(names.size())) { m_audioPlaybackDevice = 0; } if (m_audioPlaybackDevice > 0) { deviceName = names[m_audioPlaybackDevice-1]; } settings.setValue("audio-playback-device" + suffix, deviceName.c_str()); names = breakfastquay::AudioFactory::getRecordDeviceNames(implementationName); deviceName = ""; if (m_audioRecordDevice > int(names.size())) { m_audioRecordDevice = 0; } if (m_audioRecordDevice > 0) { deviceName = names[m_audioRecordDevice-1]; } settings.setValue("audio-record-device" + suffix, deviceName.c_str()); settings.setValue("locale", m_currentLocale); #ifdef Q_OS_MAC settings.setValue("scaledHiDpi", m_retina); #endif settings.setValue("spectrogram-colour", m_spectrogramGColour); settings.setValue("spectrogram-melodic-colour", m_spectrogramMColour); settings.setValue("colour-3d-plot-colour", m_colour3DColour); settings.setValue("overview-colour", m_overviewColour.name()); settings.endGroup(); settings.beginGroup("MainWindow"); settings.setValue("sessiontemplate", m_currentTemplate); settings.endGroup(); m_applyButton->setEnabled(false); if (m_changesOnRestart) { QMessageBox::information(this, tr("Preferences"), tr("Restart required

    One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.

    Please exit and restart the application now if you want these changes to take effect immediately.

    ")); m_changesOnRestart = false; } if (m_audioDeviceChanged) { emit audioDeviceChanged(); m_audioDeviceChanged = false; } if (m_coloursChanged) { emit coloursChanged(); m_coloursChanged = false; } } void PreferencesDialog::cancelClicked() { reject(); } void PreferencesDialog::applicationClosing(bool quickly) { if (quickly) { reject(); return; } if (m_applyButton->isEnabled()) { int rv = QMessageBox::warning (this, tr("Preferences Changed"), tr("Some preferences have been changed but not applied.\n" "Apply them before closing?"), QMessageBox::Apply | QMessageBox::Discard, QMessageBox::Discard); if (rv == QMessageBox::Apply) { applyClicked(); accept(); } else { reject(); } } else { accept(); } } sonic-visualiser-3.0.3/main/PreferencesDialog.h0000644000000000000000000000722013111512442017613 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PREFERENCES_DIALOG_H_ #define _PREFERENCES_DIALOG_H_ #include #include #include #include "base/Window.h" class WindowTypeSelector; class QPushButton; class QLineEdit; class QTabWidget; class QComboBox; class PreferencesDialog : public QDialog { Q_OBJECT public: PreferencesDialog(QWidget *parent = 0); virtual ~PreferencesDialog(); enum Tab { GeneralTab, AudioIOTab, AppearanceTab, AnalysisTab, TemplateTab }; void switchToTab(Tab tab); signals: void audioDeviceChanged(); void coloursChanged(); public slots: void applicationClosing(bool quickly); protected slots: void windowTypeChanged(WindowType type); void spectrogramSmoothingChanged(int state); void spectrogramXSmoothingChanged(int state); void spectrogramGColourChanged(int state); void spectrogramMColourChanged(int state); void colour3DColourChanged(int state); void overviewColourChanged(int state); void propertyLayoutChanged(int layout); void tuningFrequencyChanged(double freq); void audioImplementationChanged(int impl); void audioPlaybackDeviceChanged(int device); void audioRecordDeviceChanged(int device); void resampleOnLoadChanged(int state); void gaplessModeChanged(int state); void vampProcessSeparationChanged(int state); void tempDirRootChanged(QString root); void backgroundModeChanged(int mode); void timeToTextModeChanged(int mode); void showHMSChanged(int state); void octaveSystemChanged(int system); void viewFontSizeChanged(int sz); void showSplashChanged(int state); void defaultTemplateChanged(int); void localeChanged(int); void networkPermissionChanged(int state); void retinaChanged(int state); void tempDirButtonClicked(); void okClicked(); void applyClicked(); void cancelClicked(); protected: WindowTypeSelector *m_windowTypeSelector; QPushButton *m_applyButton; QTabWidget *m_tabs; QMap m_tabOrdering; QLineEdit *m_tempDirRootEdit; QComboBox *m_audioPlaybackDeviceCombo; QComboBox *m_audioRecordDeviceCombo; void rebuildDeviceCombos(); QString m_currentTemplate; QStringList m_templates; QString m_currentLocale; QStringList m_locales; WindowType m_windowType; int m_spectrogramSmoothing; int m_spectrogramXSmoothing; int m_spectrogramGColour; int m_spectrogramMColour; int m_colour3DColour; QColor m_overviewColour; int m_propertyLayout; double m_tuningFrequency; int m_audioImplementation; int m_audioPlaybackDevice; int m_audioRecordDevice; bool m_resampleOnLoad; bool m_gapless; bool m_runPluginsInProcess; bool m_networkPermission; bool m_retina; QString m_tempDirRoot; int m_backgroundMode; int m_timeToTextMode; bool m_showHMS; int m_octaveSystem; int m_viewFontSize; bool m_showSplash; bool m_audioDeviceChanged; bool m_coloursChanged; bool m_changesOnRestart; }; #endif sonic-visualiser-3.0.3/main/SVSplash.cpp0000644000000000000000000000454013111512442016272 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "SVSplash.h" #include "../version.h" #include #include #include #include #include #include using namespace std; SVSplash::SVSplash() { setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); QPixmap *p1 = new QPixmap(":icons/scalable/sv-splash.png"); int w = p1->width(), h = p1->height(); QRect desk = QApplication::desktop()->availableGeometry(); double dpratio = devicePixelRatio(); double widthMultiple = double(desk.width()) / double(w); int sw = w, sh = h; if (widthMultiple > 2.5 || dpratio > 1.0) { // Hi-dpi either via pixel doubling or simply via lots of // pixels double factor = widthMultiple / 2.5; if (factor < 1.0) factor = 1.0; sw = int(floor(w * factor)); sh = int(floor(h * factor)); delete p1; m_pixmap = new QPixmap(int(floor(sw * dpratio)), int(floor(sh * dpratio))); // cerr << "pixmap size = " << m_pixmap->width() << " * " // << m_pixmap->height() << endl; m_pixmap->fill(Qt::red); QSvgRenderer renderer(QString(":icons/scalable/sv-splash.svg")); QPainter painter(m_pixmap); renderer.render(&painter); painter.end(); } else { // The "low dpi" case m_pixmap = p1; } setFixedWidth(sw); setFixedHeight(sh); setGeometry(desk.x() + desk.width()/2 - sw/2, desk.y() + desk.height()/2 - sh/2, sw, sh); } SVSplash::~SVSplash() { delete m_pixmap; } void SVSplash::finishSplash(QWidget *w) { finish(w); } void SVSplash::drawContents(QPainter *painter) { painter->drawPixmap(rect(), *m_pixmap, m_pixmap->rect()); QString text = QString("v%1").arg(SV_VERSION); painter->drawText (width() - painter->fontMetrics().width(text) - (width()/50), (width()/70) + painter->fontMetrics().ascent(), text); } sonic-visualiser-3.0.3/main/SVSplash.h0000644000000000000000000000156613111512442015744 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_SPLASH_H #define SV_SPLASH_H #include class QPixmap; class SVSplash : public QSplashScreen { Q_OBJECT public: SVSplash(); virtual ~SVSplash(); public slots: void finishSplash(QWidget *); protected: void drawContents(QPainter *); QPixmap *m_pixmap; }; #endif sonic-visualiser-3.0.3/main/Surveyer.cpp0000644000000000000000000001147213111512442016415 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "Surveyer.h" #include #include #include #include #include #include #include #include "../version.h" #include "transform/TransformFactory.h" #include "plugin/PluginIdentifier.h" Surveyer::Surveyer(QString hostname, QString testPath, QString surveyPath) : m_httpFailed(false), m_hostname(hostname), m_testPath(testPath), m_surveyPath(surveyPath), m_reply(0), m_nm(new QNetworkAccessManager) { QSettings settings; settings.beginGroup("Survey"); if (!settings.contains("countdown")) { settings.setValue("countdown", 15); settings.endGroup(); return; } int countdown = settings.value("countdown").toInt(); if (countdown == 0) { // The countdown value will now remain 0 until we have // successfully tested for a survey and offered it to the // user. If the survey doesn't exist any more, then we'll // simply never present it to the user and the countdown will // remain 0 forever. If the survey does exist, then we offer // the user the chance to respond to it and (regardless of // whether they want to or not) set the countdown to -1 so // that it is never offered again. QUrl url(QString("http://%1/%2").arg(m_hostname).arg(m_testPath)); cerr << "Surveyer: Test URL is " << url << endl; m_reply = m_nm->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError))); connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); } else if (countdown > 0) { settings.setValue("countdown", countdown-1); } settings.endGroup(); } Surveyer::~Surveyer() { if (m_reply) { m_reply->abort(); m_reply->deleteLater(); } delete m_nm; } void Surveyer::error(QNetworkReply::NetworkError) { cerr << "Surveyer: error: " << m_reply->errorString() << endl; m_httpFailed = true; } void Surveyer::finished() { if (m_httpFailed) return; QString title = "Sonic Visualiser - User Survey"; QString text = "

    Sonic Visualiser: Take part in our survey!

    We at Queen Mary, University of London are running a short survey for users of Sonic Visualiser. We are trying to find out how useful Sonic Visualiser is to people, and what we can do to improve it.

    We do not ask for any personal information, and it should only take five minutes.

    Would you like to take part?

    "; QMessageBox mb(dynamic_cast(parent())); mb.setWindowTitle(title); mb.setText(text); QPushButton *yes = mb.addButton(tr("Yes! Take me to the survey"), QMessageBox::ActionRole); mb.addButton(tr("No, thanks"), QMessageBox::RejectRole); mb.exec(); QSettings settings; settings.beginGroup("Survey"); settings.setValue("countdown", -1); settings.endGroup(); if (mb.clickedButton() == yes) { QString svarg = SV_VERSION; QString platformarg = "unknown"; #ifdef Q_OS_WIN32 platformarg = "win32"; #else #ifdef Q_OS_MAC platformarg = "osx"; #else platformarg = "posix"; #endif #endif QString plugsarg; TransformFactory *tf = TransformFactory::getInstance(); if (tf) { TransformList tl = tf->getAllTransformDescriptions(); std::set packages; for (size_t i = 0; i < tl.size(); ++i) { TransformId id = tl[i].identifier; Transform t; t.setIdentifier(id); QString plugid = t.getPluginIdentifier(); QString type, soname, label; PluginIdentifier::parseIdentifier(plugid, type, soname, label); if (type == "vamp") packages.insert(soname); } for (std::set::const_iterator i = packages.begin(); i != packages.end(); ++i) { if (plugsarg != "") plugsarg = plugsarg + ","; plugsarg = plugsarg + *i; } } QDesktopServices::openUrl(QUrl(QString("http://%1/%2?sv=%3&plugs=%4&platform=%5").arg(m_hostname).arg(m_surveyPath).arg(svarg).arg(plugsarg).arg(platformarg))); } } sonic-visualiser-3.0.3/main/Surveyer.h0000644000000000000000000000216013111512442016054 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SURVEYER_H_ #define _SURVEYER_H_ #include #include #include #include class QNetworkAccessManager; class Surveyer : public QObject { Q_OBJECT public: Surveyer(QString hostname, QString testPath, QString surveyPath); virtual ~Surveyer(); protected slots: void finished(); void error(QNetworkReply::NetworkError); private: bool m_httpFailed; QString m_hostname; QString m_testPath; QString m_surveyPath; QNetworkReply *m_reply; QNetworkAccessManager *m_nm; }; #endif sonic-visualiser-3.0.3/main/main.cpp0000644000000000000000000004455313111512442015523 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "MainWindow.h" #include "SVSplash.h" #include "system/System.h" #include "system/Init.h" #include "base/TempDirectory.h" #include "base/PropertyContainer.h" #include "base/Preferences.h" #include "data/fileio/FileSource.h" #include "widgets/TipDialog.h" #include "widgets/InteractiveFileFinder.h" #include "svapp/framework/TransformUserConfigurator.h" #include "transform/TransformFactory.h" #include "svcore/plugin/PluginScan.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_FFTW3F #include #endif /*! \mainpage Sonic Visualiser \section interesting Summary of interesting classes - Data models: Model and subclasses, e.g. WaveFileModel - Graphical layers: Layer and subclasses, displayed on View and its subclass widgets. - Main window class, document class, and file parser: MainWindow, Document, SVFileReader - Turning one model (e.g. audio) into another (e.g. more audio, or a curve extracted from it): Transform, encapsulating the data that need to be stored to be able to reproduce a given transformation; TransformFactory, for discovering the available types of transform; ModelTransformerFactory, ModelTransformer and subclasses, providing the mechanisms for applying transforms to data models - Creating the plugins used by transforms: RealTimePluginFactory, FeatureExtractionPluginFactory. See also the API documentation for Vamp feature extraction plugins at http://www.vamp-plugins.org/code-doc/. - File reading and writing code: AudioFileReader and subclasses, WavFileWriter, DataFileReader, SVFileReader - FFT calculation and cacheing: FFTModel, FFTDataServer - Widgets that show groups of editable properties: PropertyBox for layer properties (contained in a PropertyStack), PluginParameterBox for plugins (contained in a PluginParameterDialog) - Audio playback: AudioCallbackPlaySource and subclasses, AudioCallbackPlayTarget and subclasses, AudioGenerator \section model Data sources: the Model hierarchy A Model is something containing, or knowing how to obtain, data. For example, WaveFileModel is a model that knows how to get data from an audio file; SparseTimeValueModel is a model containing editable "curve" data. Models typically subclass one of a number of abstract subclasses of Model. For example, WaveFileModel subclasses DenseTimeValueModel, which describes an interface for models that have a value at each time point for a given sampling resolution. (Note that WaveFileModel does not actually read the files itself: it uses AudioFileReader classes for that. It just makes data from the files available in a Model.) SparseTimeValueModel uses the SparseModel template class, which provides most of the implementation for models that contain a series of points of some sort -- also used by NoteModel, TextModel, and SparseOneDimensionalModel. Everything that goes on the screen originates from a model, via a layer (see below). The models are contained in a Document object. There is no containment hierarchy or ordering of models in the document. One model is the main model, which defines the sample rate for playback. A model may also be marked as a "derived" model, which means it was generated from another model using some transform (feature extraction or effect plugin, etc) -- the idea being that they can be re-generated using the same transform if a new source model is loaded. \section layer Things that can display data: the Layer hierarchy A Layer is something that knows how to draw parts of a model onto a timeline. For example, WaveformLayer is a layer which draws waveforms, based on WaveFileModel; TimeValueLayer draws curves, based on SparseTimeValueModel; SpectrogramLayer draws spectrograms, based on WaveFileModel (via FFTModel). The most basic functions of a layer are: to draw itself onto a Pane, against a timeline on the x axis; and to permit user interaction. If you were thinking of adding the capability to display a new sort of something, then you would want to add a new layer type. (You may also need a new model type, depending on whether any existing model can capture the data you need.) Depending on the sort of data in question, there are various existing layers that might be appropriate to start from -- for example, a layer that displays images that the user has imported and associated with particular times might have something in common with the existing TextLayer which displays pieces of text that are associated with particular times. Although layers are visual objects, they are contained in the Document in Sonic Visualiser rather than being managed together with display widgets. The Sonic Visualiser file format has separate data and layout sections, and the layers are defined in the data section and then referred to in the layout section which determines which layers may go on which panes (see Pane below). Once a layer class is defined, some basic data about it needs to be set up in the LayerFactory class, and then it will appear in the menus and so on on the main window. \section view Widgets that are used to show layers: The View hierarchy A View is a widget that displays a stack of layers. The most important subclass is Pane, the widget that is used to show most of the data in the main window of Sonic Visualiser. All a pane really does is contain a set of layers and get them to render themselves (one on top of the other, with the topmost layer being the one that is currently interacted with), cache the results, negotiate user interaction with them, and so on. This is generally fiddly, if not especially interesting. Panes are strictly layout objects and are not stored in the Document class; instead the MainWindow contains a PaneStack widget (the widget that takes up most of Sonic Visualiser's main window) which contains a set of panes stacked vertically. Another View subclass is Overview, which is the widget that contains that green waveform showing the entire file at the bottom of the window. */ static QMutex cleanupMutex; static bool cleanedUp = false; static void signalHandler(int /* signal */) { // Avoid this happening more than once across threads cerr << "signalHandler: cleaning up and exiting" << endl; cleanupMutex.lock(); if (!cleanedUp) { TempDirectory::getInstance()->cleanup(); cleanedUp = true; } cleanupMutex.unlock(); exit(0); } class SVApplication : public QApplication { public: SVApplication(int &argc, char **argv) : QApplication(argc, argv), m_readyForFiles(false), m_filepathQueue(QStringList()), m_mainWindow(0) { } virtual ~SVApplication() { } void setMainWindow(MainWindow *mw) { m_mainWindow = mw; } void releaseMainWindow() { m_mainWindow = 0; } virtual void commitData(QSessionManager &manager) { if (!m_mainWindow) return; bool mayAskUser = manager.allowsInteraction(); bool success = m_mainWindow->commitData(mayAskUser); manager.release(); if (!success) manager.cancel(); } void handleFilepathArgument(QString path, SVSplash *splash); bool m_readyForFiles; QStringList m_filepathQueue; protected: MainWindow *m_mainWindow; bool event(QEvent *); }; int main(int argc, char **argv) { svSystemSpecificInitialisation(); #ifdef Q_WS_X11 #if QT_VERSION >= 0x040500 // QApplication::setGraphicsSystem("raster"); #endif #endif #ifdef Q_OS_MAC if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) { // Fix for OS/X 10.9 font problem QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); } #endif SVApplication application(argc, argv); QStringList args = application.arguments(); signal(SIGINT, signalHandler); signal(SIGTERM, signalHandler); #ifndef Q_OS_WIN32 signal(SIGHUP, signalHandler); signal(SIGQUIT, signalHandler); #endif bool audioOutput = true; bool oscSupport = true; if (args.contains("--help") || args.contains("-h") || args.contains("-?")) { cerr << QApplication::tr( "\nSonic Visualiser is a program for viewing and exploring audio data\nfor semantic music analysis and annotation.\n\nUsage:\n\n %1 [--no-audio] [--no-osc] [ ...]\n\n --no-audio: Do not attempt to open an audio output device\n --no-osc: Do not provide an Open Sound Control port for remote control\n : One or more Sonic Visualiser (.sv) and audio files may be provided.\n").arg(argv[0]) << endl; exit(2); } if (args.contains("--no-audio")) audioOutput = false; if (args.contains("--no-osc")) oscSupport = false; QApplication::setOrganizationName("sonic-visualiser"); QApplication::setOrganizationDomain("sonicvisualiser.org"); QApplication::setApplicationName(QApplication::tr("Sonic Visualiser")); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); SVSplash *splash = 0; QSettings settings; settings.beginGroup("Preferences"); // Default to using Piper server; can change in preferences if (!settings.contains("run-vamp-plugins-in-process")) { settings.setValue("run-vamp-plugins-in-process", false); } settings.endGroup(); settings.beginGroup("Preferences"); if (settings.value("show-splash", true).toBool()) { splash = new SVSplash(); splash->show(); QTimer::singleShot(5000, splash, SLOT(hide())); application.processEvents(); } settings.endGroup(); settings.beginGroup("RDF"); if (!settings.contains("rdf-indices")) { QStringList list; list << "http://www.vamp-plugins.org/rdf/plugins/index.txt"; settings.setValue("rdf-indices", list); } settings.endGroup(); QIcon icon; int sizes[] = { 16, 22, 24, 32, 48, 64, 128 }; for (int i = 0; i < int(sizeof(sizes)/sizeof(sizes[0])); ++i) { icon.addFile(QString(":icons/sv-%1x%2.png").arg(sizes[i]).arg(sizes[i])); } QApplication::setWindowIcon(icon); QString language = QLocale::system().name(); SVDEBUG << "System language is: " << language << endl; settings.beginGroup("Preferences"); QString prefLanguage = settings.value("locale", language).toString(); if (prefLanguage != QString()) language = prefLanguage; settings.endGroup(); QTranslator qtTranslator; QString qtTrName = QString("qt_%1").arg(language); SVDEBUG << "Loading " << qtTrName << "... "; bool success = false; if (!(success = qtTranslator.load(qtTrName))) { QString qtDir = getenv("QTDIR"); if (qtDir != "") { success = qtTranslator.load (qtTrName, QDir(qtDir).filePath("translations")); } } if (!success) { SVDEBUG << "Failed\nFailed to load Qt translation for locale" << endl; } else { cerr << "Done" << endl; } application.installTranslator(&qtTranslator); QTranslator svTranslator; QString svTrName = QString("sonic-visualiser_%1").arg(language); SVDEBUG << "Loading " << svTrName << "... "; svTranslator.load(svTrName, ":i18n"); SVDEBUG << "Done" << endl; application.installTranslator(&svTranslator); StoreStartupLocale(); // Make known-plugins query as early as possible after showing // splash screen. PluginScan::getInstance()->scan(); // Permit size_t and PropertyName to be used as args in queued signal calls qRegisterMetaType("PropertyContainer::PropertyName"); MainWindow::SoundOptions options = MainWindow::WithEverything; if (!audioOutput) options = 0; MainWindow *gui = new MainWindow(options, oscSupport); application.setMainWindow(gui); InteractiveFileFinder::setParentWidget(gui); TransformUserConfigurator::setParentWidget(gui); if (splash) { QObject::connect(gui, SIGNAL(hideSplash()), splash, SLOT(hide())); QObject::connect(gui, SIGNAL(hideSplash(QWidget *)), splash, SLOT(finishSplash(QWidget *))); } QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = (available.width() * 2) / 3; int height = available.height() / 2; if (height < 450) height = (available.height() * 2) / 3; if (width > height * 2) width = height * 2; settings.beginGroup("MainWindow"); QSize size = settings.value("size", QSize(width, height)).toSize(); gui->resizeConstrained(size); if (settings.contains("position")) { QRect prevrect(settings.value("position").toPoint(), size); if (!(available & prevrect).isEmpty()) { gui->move(prevrect.topLeft()); } } if (settings.value("maximised", false).toBool()) { gui->setWindowState(Qt::WindowMaximized); } settings.endGroup(); gui->show(); // The MainWindow class seems to have trouble dealing with this if // it tries to adapt to this preference before the constructor is // complete. As a lazy hack, apply it explicitly from here gui->preferenceChanged("Property Box Layout"); application.m_readyForFiles = true; // Ready to receive files from e.g. Apple Events for (QStringList::iterator i = args.begin(); i != args.end(); ++i) { if (i == args.begin()) continue; if (i->startsWith('-')) continue; QString path = *i; application.handleFilepathArgument(path, splash); } for (QStringList::iterator i = application.m_filepathQueue.begin(); i != application.m_filepathQueue.end(); ++i) { QString path = *i; application.handleFilepathArgument(path, splash); } #ifdef HAVE_FFTW3F settings.beginGroup("FFTWisdom"); QString wisdom = settings.value("wisdom").toString(); if (wisdom != "") { fftwf_import_wisdom_from_string(wisdom.toLocal8Bit().data()); } #ifdef HAVE_FFTW3 wisdom = settings.value("wisdom_d").toString(); if (wisdom != "") { fftw_import_wisdom_from_string(wisdom.toLocal8Bit().data()); } #endif settings.endGroup(); #endif int rv = application.exec(); gui->hide(); cleanupMutex.lock(); if (!cleanedUp) { TransformFactory::deleteInstance(); TempDirectory::getInstance()->cleanup(); cleanedUp = true; } application.releaseMainWindow(); #ifdef HAVE_FFTW3F settings.beginGroup("FFTWisdom"); char *cwisdom = fftwf_export_wisdom_to_string(); if (cwisdom) { settings.setValue("wisdom", cwisdom); free(cwisdom); } #ifdef HAVE_FFTW3 cwisdom = fftw_export_wisdom_to_string(); if (cwisdom) { settings.setValue("wisdom_d", cwisdom); free(cwisdom); } #endif settings.endGroup(); #endif FileSource::debugReport(); delete gui; cleanupMutex.unlock(); return rv; } bool SVApplication::event(QEvent *event){ // Avoid warnings/errors with -Wextra because we aren't explicitly // handling all event types (-Wall is OK with this because of the // default but the stricter level insists) #pragma GCC diagnostic ignored "-Wswitch-enum" QString thePath; switch (event->type()) { case QEvent::FileOpen: thePath = static_cast(event)->file(); if(m_readyForFiles) handleFilepathArgument(thePath, NULL); else m_filepathQueue.append(thePath); return true; default: return QApplication::event(event); } } /** Application-global handler for filepaths passed in, e.g. as command-line arguments or apple events */ void SVApplication::handleFilepathArgument(QString path, SVSplash *splash){ static bool haveSession = false; static bool haveMainModel = false; static bool havePriorCommandLineModel = false; MainWindow::FileOpenStatus status = MainWindow::FileOpenFailed; #ifdef Q_OS_WIN32 path.replace("\\", "/"); #endif if (path.endsWith("sv")) { if (!haveSession) { status = m_mainWindow->openSessionPath(path); if (status == MainWindow::FileOpenSucceeded) { haveSession = true; haveMainModel = true; } } else { cerr << "WARNING: Ignoring additional session file argument \"" << path << "\"" << endl; status = MainWindow::FileOpenSucceeded; } } if (status != MainWindow::FileOpenSucceeded) { if (!haveMainModel) { status = m_mainWindow->openPath(path, MainWindow::ReplaceSession); if (status == MainWindow::FileOpenSucceeded) { haveMainModel = true; } } else { if (haveSession && !havePriorCommandLineModel) { status = m_mainWindow->openPath(path, MainWindow::AskUser); if (status == MainWindow::FileOpenSucceeded) { havePriorCommandLineModel = true; } } else { status = m_mainWindow->openPath(path, MainWindow::CreateAdditionalModel); } } } if (status == MainWindow::FileOpenFailed) { if (splash) splash->hide(); QMessageBox::critical (m_mainWindow, QMessageBox::tr("Failed to open file"), QMessageBox::tr("File or URL \"%1\" could not be opened").arg(path)); } else if (status == MainWindow::FileOpenWrongMode) { if (splash) splash->hide(); QMessageBox::critical (m_mainWindow, QMessageBox::tr("Failed to open file"), QMessageBox::tr("Audio required

    Please load at least one audio file before importing annotation data")); } } sonic-visualiser-3.0.3/misc/ladspa.cat0000644000000000000000000003451113111512442016030 0ustar 00000000000000ladspa:adsr_1653:adsr::Amplitude > Dynamics ladspa:adsr_1680:adsr_g+t::Amplitude > Dynamics ladspa:alias_1407:alias::Amplitude > Distortions ladspa:allpass_1895:allpass_c::Time > Delays ladspa:allpass_1895:allpass_l::Time > Delays ladspa:allpass_1895:allpass_n::Time > Delays ladspa:amp_1181:amp::Amplitude > Amplifiers ladspa:amp_1654:amp_gaia_oa::Amplitude > Amplifiers ladspa:amp_1654:amp_gcia_oa::Amplitude > Amplifiers ladspa:amp:amp_mono::Amplitude > Amplifiers ladspa:amp:amp_stereo::Amplitude > Amplifiers ladspa:am_pitchshift_1433:amPitchshift::Frequency > Pitch shifters ladspa:analogue_osc_1416:analogueOsc::Generators > Oscillators ladspa:bandpass_a_iir_1893:bandpass_a_iir::Frequency > Filters > Bandpass ladspa:bandpass_iir_1892:bandpass_iir::Frequency > Filters > Bandpass ladspa:blvco:Pulse-VCO::Generators > Oscillators ladspa:blvco:Rec-VCO::Generators > Oscillators ladspa:blvco:Saw-VCO::Generators > Oscillators ladspa:bode_shifter_1431:bodeShifter::Spectral ladspa:bode_shifter_cv_1432:bodeShifterCV::Spectral ladspa:branch_1673:branch_ia_oaoa::Utilities ladspa:branch_1673:branch_ic_ococ::Utilities ladspa:butterworth_1902:butthigh_iir::Frequency > Filters > Highpass ladspa:butterworth_1902:buttlow_iir::Frequency > Filters > Lowpass ladspa:butterworth_1902:bwxover_iir::Frequency > Filters > Bandpass ladspa:caps:AmpIII::Amplitude > Distortions ladspa:caps:AmpIV::Amplitude > Distortions ladspa:caps:Cabinet::Amplitude > Distortions ladspa:caps:CEO::Generators > Oscillators ladspa:caps:Chorus::Time > Chorus ladspa:caps:Click::Utilities ladspa:caps:Clip::Amplitude > Distortions ladspa:caps:Compress::Amplitude > Dynamics > Compressors ladspa:caps:Eq::Frequency > EQs ladspa:caps:HRTF::Utilities ladspa:caps:JVRev::Time > Reverbs ladspa:caps:Lorenz::Generators ladspa:caps:Pan::Utilities ladspa:caps:Phaser::Time > Phasers ladspa:caps:Plate2x2::Time > Reverbs ladspa:caps:Plate::Time > Reverbs ladspa:caps:PreampIII::Amplitude > Distortions ladspa:caps:PreampIV::Amplitude > Distortions ladspa:caps:Roessler::Generators ladspa:caps:Sin::Generators ladspa:caps:StereoChorus::Time > Chorus ladspa:caps:SweepVF::Frequency > Filters ladspa:caps:VCOd::Generators > Oscillators ladspa:caps:VCOs::Generators > Oscillators ladspa:caps:White::Generators ladspa:chebstortion_1430:chebstortion::Amplitude > Distortions ladspa:cmt:am::Amplitude > Modulators ladspa:cmt:amp_mono::Amplitude > Amplifiers ladspa:cmt:amp_stereo::Amplitude > Amplifiers ladspa:cmt:analogue::Generators ladspa:cmt:bf2cube::Utilities > Ambisonic ladspa:cmt:bf2quad::Utilities > Ambisonic ladspa:cmt:bf2stereo::Utilities > Ambisonic ladspa:cmt:bf_rotate_z::Utilities > Ambisonic ladspa:cmt:canyon_delay::Time > Delays ladspa:cmt:compress_peak::Amplitude > Dynamics > Compressors ladspa:cmt:compress_rms::Amplitude > Dynamics > Compressors ladspa:cmt:delay_0.01s::Time > Delays ladspa:cmt:delay_0.1s::Time > Delays ladspa:cmt:delay_1s::Time > Delays ladspa:cmt:delay_5s::Time > Delays ladspa:cmt:delay_60s::Time > Delays ladspa:cmt:disintegrator::Amplitude > Distortions ladspa:cmt:encode_bformat::Utilities > Ambisonic ladspa:cmt:encode_fmh::Utilities > Ambisonic ladspa:cmt:expand_peak::Amplitude > Dynamics > Expanders ladspa:cmt:expand_rms::Amplitude > Dynamics > Expanders ladspa:cmt:fbdelay_0.01s::Time > Delays ladspa:cmt:fbdelay_0.1s::Time > Delays ladspa:cmt:fbdelay_1s::Time > Delays ladspa:cmt:fbdelay_5s::Time > Delays ladspa:cmt:fbdelay_60s::Time > Delays ladspa:cmt:fmh2bf::Utilities > Ambisonic ladspa:cmt:fmh2oct::Utilities > Ambisonic ladspa:cmt:fmh_rotate_z::Utilities > Ambisonic ladspa:cmt:freeverb3::Time > Reverbs ladspa:cmt:grain_scatter::Generators ladspa:cmt:hard_gate::Amplitude > Dynamics > Gates ladspa:cmt:hpf::Frequency > Filters > Highpass ladspa:cmt:identity_audio::Utilities ladspa:cmt:identity_control::Utilities ladspa:cmt:limit_peak::Amplitude > Dynamics > Limiters ladspa:cmt:limit_rms::Amplitude > Dynamics > Limiters ladspa:cmt:lofi::Amplitude > Distortions ladspa:cmt:logistic::Utilities ladspa:cmt:lpf::Frequency > Filters > Lowpass ladspa:cmt:mixer::Utilities ladspa:cmt:noise_source_white::Generators ladspa:cmt:null_ai::Utilities ladspa:cmt:null_ao::Utilities ladspa:cmt:null_ci::Utilities ladspa:cmt:null_co::Utilities ladspa:cmt:organ::Generators ladspa:cmt:peak::Utilities ladspa:cmt:phasemod::Generators ladspa:cmt:pink_full_frequency::Generators ladspa:cmt:pink_interpolated_audio::Generators ladspa:cmt:pink_sh::Generators ladspa:cmt:sine_faaa::Generators ladspa:cmt:sine_faac::Generators ladspa:cmt:sine_fcaa::Generators ladspa:cmt:sine_fcac::Generators ladspa:cmt:sledgehammer::Amplitude > Dynamics > Limiters ladspa:cmt:syndrum::Generators ladspa:cmt:track_max_peak::Utilities ladspa:cmt:track_max_rms::Utilities ladspa:cmt:track_peak::Utilities ladspa:cmt:track_rms::Utilities ladspa:cmt:vcf303::Frequency > Filters > Lowpass ladspa:cmt:wshape_sine::Amplitude > Waveshapers ladspa:comb_1190:comb::Frequency > Filters > Combs ladspa:comb_1887:comb_c::Time > Delays ladspa:comb_1887:comb_l::Time > Delays ladspa:comb_1887:comb_n::Time > Delays ladspa:comb_splitter_1411:combSplitter::Frequency > Filters > Combs ladspa:const_1909:const::Utilities ladspa:crossover_dist_1404:crossoverDist::Amplitude > Distortions ladspa:cs_chorus:Chorus1::Time > Chorus ladspa:cs_chorus:Chorus2::Time > Chorus ladspa:cs_phaser:Phaser1+LFO::Time > Phasers ladspa:cs_phaser:Phaser1::Time > Phasers ladspa:dahdsr_2021:dahdsr_cg+t_control::Amplitude > Dynamics ladspa:dahdsr_2021:dahdsr_g+t_audio::Amplitude > Dynamics ladspa:dahdsr_2021:dahdsr_g+t_control::Amplitude > Dynamics ladspa:dc_remove_1207:dcRemove::Frequency > Filters > Highpass ladspa:decay_1886:decay::Utilities ladspa:decimator_1202:decimator::Amplitude > Distortions ladspa:declip_1195:declip::Amplitude > Waveshapers ladspa:delay_1898:delay_c::Time > Delays ladspa:delay_1898:delay_l::Time > Delays ladspa:delay_1898:delay_n::Time > Delays ladspa:delay:delay_5s::Time > Delays ladspa:delayorama_1402:delayorama::Time > Delays ladspa:difference_2030:difference_iama_oa::Utilities ladspa:difference_2030:difference_iamc_oa::Utilities ladspa:difference_2030:difference_icma_oa::Utilities ladspa:difference_2030:difference_icmc_oc::Utilities ladspa:diode_1185:diode::Amplitude > Distortions ladspa:divider_1186:divider::Generators ladspa:dj_eq_1901:dj_eq::Frequency > EQs ladspa:dj_eq_1901:dj_eq_mono::Frequency > EQs ladspa:dj_flanger_1438:djFlanger::Time > Flangers ladspa:dyson_compress_1403:dysonCompress::Amplitude > Dynamics > Compressors ladspa:fad_delay_1192:fadDelay::Time > Delays ladspa:fast_lookahead_limiter_1913:fastLookaheadLimiter::Amplitude > Dynamics > Limiters ladspa:filter:hpf::Frequency > Filters > Highpass ladspa:filter:lpf::Frequency > Filters > Lowpass ladspa:filters:Parametric1::Frequency > Filters ladspa:flanger_1191:flanger::Time > Flangers ladspa:fmod_1656:fmod_fama_oa::Frequency ladspa:fmod_1656:fmod_famc_oa::Frequency ladspa:fmod_1656:fmod_fcma_oa::Frequency ladspa:fmod_1656:fmod_fcmc_oc::Frequency ladspa:fm_osc_1415:fmOsc::Generators > Oscillators ladspa:foldover_1213:foldover::Amplitude > Distortions ladspa:foverdrive_1196:foverdrive::Amplitude > Distortions ladspa:freq_tracker_1418:freqTracker::Frequency > Measurement ladspa:g2reverb:G2reverb::Time > Reverbs ladspa:gate_1410:gate::Amplitude > Dynamics > Gates ladspa:giant_flange_1437:giantFlange::Time > Flangers ladspa:gong_1424:gong::Simulators ladspa:gong_beater_1439:gongBeater::Generators ladspa:gsm_1215:gsm::Amplitude > Distortions ladspa:gverb_1216:gverb::Time > Reverbs ladspa:hard_limiter_1413:hardLimiter::Amplitude > Dynamics > Limiters ladspa:harmonic_gen_1220:harmonicGen::Generators ladspa:hermes_filter_1200:hermesFilter::Frequency > Filters ladspa:highpass_iir_1890:highpass_iir::Frequency > Filters > Highpass ladspa:hilbert_1440:hilbert::Utilities ladspa:imp_1199:imp::Spectral ladspa:impulse_1885:impulse_fc::Utilities ladspa:interpolator_1660:interpolator::Utilities ladspa:inv_1429:inv::Utilities ladspa:jamincont_1912:jaminController::Utilities ladspa:karaoke_1409:karaoke::Utilities ladspa:latency_1914:artificialLatency::Utilities ladspa:lcr_delay_1436:lcrDelay::Time > Delays ladspa:lowpass_iir_1891:lowpass_iir::Frequency > Filters > Lowpass ladspa:lp4pole_1671:lp4pole_faraia_oa::Frequency > Filters > Lowpass ladspa:lp4pole_1671:lp4pole_fcrcia_oa::Frequency > Filters > Lowpass ladspa:ls_filter_1908:lsFilter::Frequency > Filters ladspa:matrix_ms_st_1421:matrixMSSt::Utilities ladspa:matrix_spatialiser_1422:matrixSpatialiser::Utilities ladspa:matrix_st_ms_1420:matrixStMS::Utilities ladspa:mbeq_1197:mbeq::Frequency > EQs > Multiband ladspa:mod_delay_1419:modDelay::Time > Delays ladspa:multivoice_chorus_1201:multivoiceChorus::Time > Chorus ladspa:mvchpf24:Mvchpf-1::Frequency > Filters ladspa:mvclpf24:Mvclpf-1::Frequency > Filters ladspa:mvclpf24:Mvclpf-2::Frequency > Filters ladspa:mvclpf24:Mvclpf-3::Frequency > Filters ladspa:mvclpf24:Mvclpf-4::Frequency > Filters ladspa:noise:noise_white::Generators ladspa:notch_iir_1894:notch_iir::Frequency > Filters > Notch ladspa:phasers_1217:autoPhaser::Time > Phasers ladspa:phasers_1217:fourByFourPole::Frequency > Filters > Allpass ladspa:phasers_1217:lfoPhaser::Time > Phasers ladspa:pitch_scale_1193:pitchScale::Frequency > Pitch shifters ladspa:pitch_scale_1194:pitchScaleHQ::Frequency > Pitch shifters ladspa:plate_1423:plate::Time > Reverbs ladspa:pointer_cast_1910:pointerCastDistortion::Amplitude > Distortions ladspa:product_1668:product_iaia_oa::Utilities ladspa:product_1668:product_iaic_oa::Utilities ladspa:product_1668:product_icic_oc::Utilities ladspa:pulse_1645:pulse_fapa_oa::Generators > Oscillators ladspa:pulse_1645:pulse_fapc_oa::Generators > Oscillators ladspa:pulse_1645:pulse_fcpa_oa::Generators > Oscillators ladspa:pulse_1645:pulse_fcpc_oa::Generators > Oscillators ladspa:pvoc:Accumulate::Spectral ladspa:pvoc:Exaggerate::Spectral ladspa:pvoc:Transpose::Frequency > Pitch shifters ladspa:quantiser100_2029:quantiser100::Utilities ladspa:quantiser20_2027:quantiser20::Utilities ladspa:quantiser50_2028:quantiser50::Utilities ladspa:random_1661:random_fasa_oa::Generators ladspa:random_1661:random_fasc_oa::Generators ladspa:random_1661:random_fcsa_oa::Generators ladspa:random_1661:random_fcsc_oa::Generators ladspa:rate_shifter_1417:rateShifter::Frequency > Pitch shifters ladspa:ratio_2034:ratio_nada_oa::Utilities ladspa:ratio_2034:ratio_nadc_oa::Utilities ladspa:ratio_2034:ratio_ncda_oa::Utilities ladspa:ratio_2034:ratio_ncdc_oc::Utilities ladspa:retro_flange_1208:retroFlange::Time > Flangers ladspa:revdelay_1605:revdelay::Time > Delays ladspa:ringmod_1188:ringmod_1i1o1l::Amplitude > Modulators ladspa:ringmod_1188:ringmod_2i1o::Amplitude > Modulators ladspa:satan_maximiser_1408:satanMaximiser::Amplitude > Dynamics ladspa:sawtooth_1641:sawtooth_fa_oa::Generators > Oscillators ladspa:sawtooth_1641:sawtooth_fc_oa::Generators > Oscillators ladspa:sc1_1425:sc1::Amplitude > Dynamics > Compressors ladspa:sc2_1426:sc2::Amplitude > Dynamics > Compressors ladspa:sc3_1427:sc3::Amplitude > Dynamics > Compressors ladspa:sc4_1882:sc4::Amplitude > Dynamics > Compressors ladspa:sc4m_1916:sc4m::Amplitude > Dynamics > Compressors ladspa:se4_1883:se4::Amplitude > Dynamics > Compressors ladspa:sequencer16_1677:sequencer16::Simulators ladspa:sequencer32_1676:sequencer32::Simulators ladspa:sequencer64_1675:sequencer64::Simulators ladspa:shaper_1187:shaper::Amplitude > Waveshapers ladspa:sifter_1210:sifter::Amplitude > Distortions ladspa:sin_cos_1881:sinCos::Generators > Oscillators ladspa:sine:sine_faaa::Generators > Oscillators ladspa:sine:sine_faac::Generators > Oscillators ladspa:sine:sine_fcaa::Generators > Oscillators ladspa:sine:sine_fcac::Generators > Oscillators ladspa:single_para_1203:singlePara::Frequency > EQs > Parametric ladspa:sinus_wavewrapper_1198:sinusWavewrapper::Amplitude > Waveshapers ladspa:smooth_decimate_1414:smoothDecimate::Amplitude > Distortions ladspa:split_1406:split::Utilities ladspa:square_1643:square_fa_oa::Generators > Oscillators ladspa:square_1643:square_fc_oa::Generators > Oscillators ladspa:step_muxer_1212:stepMuxer::Utilities ladspa:sum_1665:sum_iaia_oa::Utilities ladspa:sum_1665:sum_iaic_oa::Utilities ladspa:sum_1665:sum_icic_oc::Utilities ladspa:surround_encoder_1401:surroundEncoder::Utilities ladspa:svf_1214:svf::Frequency > Filters ladspa:sync_pulse_2023:syncpulse_fapaga_oa::Generators > Oscillators ladspa:sync_pulse_2023:syncpulse_fcpcga_oa::Generators > Oscillators ladspa:sync_square_1678:syncsquare_faga_oa::Generators > Oscillators ladspa:sync_square_1678:syncsquare_fcga_oa::Generators > Oscillators ladspa:tap_autopan:tap_autopan::Amplitude > Modulators ladspa:tap_chorusflanger:tap_chorusflanger::Time > Flangers ladspa:tap_deesser:tap_deesser::Amplitude > Dynamics ladspa:tap_doubler:tap_doubler::Simulators ladspa:tap_dynamics_m:tap_dynamics_m::Amplitude > Dynamics ladspa:tap_dynamics_st:tap_dynamics_st::Amplitude > Dynamics ladspa:tap_echo:tap_stereo_echo::Time > Delays ladspa:tape_delay_1211:tapeDelay::Time > Delays ladspa:tap_eqbw:tap_equalizer_bw::Frequency > EQs ladspa:tap_eq:tap_equalizer::Frequency > EQs ladspa:tap_limiter:tap_limiter::Amplitude > Dynamics > Limiters ladspa:tap_pinknoise:tap_pinknoise::Utilities ladspa:tap_pitch:tap_pitch::Frequency > Pitch shifters ladspa:tap_reflector:tap_reflector::Time ladspa:tap_reverb:tap_reverb::Time > Reverbs ladspa:tap_rotspeak:tap_rotspeak::Simulators ladspa:tap_sigmoid:tap_sigmoid::Amplitude > Distortions ladspa:tap_tremolo:tap_tremolo::Amplitude > Modulators ladspa:tap_tubewarmth:tap_tubewarmth::Simulators ladspa:tap_vibrato:tap_vibrato::Amplitude > Modulators ladspa:tracker_2025:tracker_gaaadaia_oa::Amplitude > Waveshapers ladspa:tracker_2025:tracker_gaacdcia_oa::Amplitude > Waveshapers ladspa:transient_1206:transient::Amplitude > Dynamics ladspa:triangle_1649:triangle_fasa_oa::Generators > Oscillators ladspa:triangle_1649:triangle_fasc_oa::Generators > Oscillators ladspa:triangle_1649:triangle_fcsa_oa::Generators > Oscillators ladspa:triangle_1649:triangle_fcsc_oa::Generators > Oscillators ladspa:triple_para_1204:triplePara::Frequency > EQs > Parametric ladspa:valve_1209:valve::Amplitude > Distortions ladspa:valve_rect_1405:valveRect::Amplitude > Distortions ladspa:vco_sawpulse:Pulse-VCO::Generators > Oscillators ladspa:vco_sawpulse:Rec-VCO::Generators > Oscillators ladspa:vco_sawpulse:Saw-VCO::Generators > Oscillators ladspa:vynil_1905:vynil::Amplitude > Distortions ladspa:wave_terrain_1412:waveTerrain::Generators > Oscillators ladspa:xfade_1915:xfade4::Amplitude > Dynamics > Compressors ladspa:zm1_1428:zm1::Utilities sonic-visualiser-3.0.3/misc/update-i18n.sh0000644000000000000000000000075313111512442016467 0ustar 00000000000000#!/bin/sh LUPDATE="lupdate" LRELEASE="lrelease" if lupdate-qt5 -version >/dev/null 2>&1; then LUPDATE="lupdate-qt5" LRELEASE="lrelease-qt5" fi LANGUAGES="ru en_GB en_US cs_CZ" for LANG in $LANGUAGES; do $LUPDATE \ svcore/*/*.h svcore/*/*.cpp \ svcore/*/*/*.h svcore/*/*/*.cpp \ svgui/*/*.h svgui/*/*.cpp \ svapp/*/*.h svapp/*/*.cpp \ */*.h */*.cpp \ -ts i18n/sonic-visualiser_$LANG.ts done for LANG in $LANGUAGES; do $LRELEASE i18n/sonic-visualiser_$LANG.ts done sonic-visualiser-3.0.3/noconfig.pri0000644000000000000000000000604613111512442015460 0ustar 00000000000000 CONFIG += release #CONFIG -= release #CONFIG += debug DEFINES += NDEBUG BUILD_RELEASE DEFINES += NO_TIMING NO_HIT_COUNTS DEFINES += HAVE_PIPER HAVE_PLUGIN_CHECKER_HELPER # Full set of defines expected for all platforms when we have the # sv-dependency-builds subrepo available to provide the dependencies. DEFINES += \ HAVE_BZ2 \ HAVE_FFTW3 \ HAVE_FFTW3F \ HAVE_SNDFILE \ HAVE_SAMPLERATE \ HAVE_RUBBERBAND \ HAVE_LIBLO \ HAVE_MAD \ HAVE_ID3TAG \ HAVE_PORTAUDIO # Default set of libs for the above. Config sections below may update # these. LIBS += \ -lbz2 \ -lrubberband \ -lfftw3 \ -lfftw3f \ -lsndfile \ -lFLAC \ -logg \ -lvorbis \ -lvorbisenc \ -lvorbisfile \ -logg \ -lmad \ -lid3tag \ -lportaudio \ -lsamplerate \ -lz \ -lsord-0 \ -lserd-0 \ -llo \ -lcapnp \ -lkj win32-g++ { # This config is currently used for 32-bit Windows builds. INCLUDEPATH += sv-dependency-builds/win32-mingw/include LIBS += -Lrelease -Lsv-dependency-builds/win32-mingw/lib -L../sonic-visualiser/sv-dependency-builds/win32-mingw/lib DEFINES += NOMINMAX _USE_MATH_DEFINES CAPNP_LITE QMAKE_CXXFLAGS_RELEASE += -ffast-math # Don't have liblo DEFINES -= HAVE_LIBLO LIBS -= -llo LIBS += -lwinmm -lws2_32 } win32-msvc* { # This config is actually used only for 64-bit Windows builds. # even though the qmake spec is still called win32-msvc*. If # we want to do 32-bit builds with MSVC as well, then we'll # need to add a way to distinguish the two. INCLUDEPATH += sv-dependency-builds/win64-msvc/include ## This seems to be intruding even when we're supposed to be release # CONFIG(debug) { # LIBS += -NODEFAULTLIB:MSVCRT -Ldebug \ # -L../sonic-visualiser/sv-dependency-builds/win64-msvc/lib/debug \ # -L../sonic-visualiser/sv-dependency-builds/win64-msvc/lib # } CONFIG(release) { LIBS += -Lrelease \ -L../sonic-visualiser/sv-dependency-builds/win64-msvc/lib } DEFINES += NOMINMAX _USE_MATH_DEFINES CAPNP_LITE QMAKE_CXXFLAGS_RELEASE += -fp:fast # No Ogg/FLAC support in the sndfile build on this platform yet LIBS -= -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile # These have different names LIBS -= -lsord-0 -lserd-0 LIBS += -lsord -lserd # Don't have liblo DEFINES -= HAVE_LIBLO LIBS -= -llo LIBS += -ladvapi32 -lwinmm -lws2_32 } macx* { # All Mac builds are 64-bit these days. INCLUDEPATH += sv-dependency-builds/osx/include LIBS += -Lsv-dependency-builds/osx/lib QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math DEFINES += HAVE_COREAUDIO HAVE_VDSP LIBS += \ -framework CoreAudio \ -framework CoreMidi \ -framework AudioUnit \ -framework AudioToolbox \ -framework CoreFoundation \ -framework CoreServices \ -framework Accelerate } linux* { message("Building without ./configure on Linux is unlikely to work") message("If you really want to try it, remove this from noconfig.pri") error("Refusing to build without ./configure first") } sonic-visualiser-3.0.3/platform-dataquay.pri0000644000000000000000000000141613111512442017305 0ustar 00000000000000 exists(config.pri) { include(./config.pri) } CONFIG += staticlib c++11 DEFINES -= USE_REDLAND QMAKE_CXXFLAGS -= -I/usr/include/rasqal -I/usr/include/raptor2 QMAKE_CXXFLAGS -= -Werror EXTRALIBS -= -lrdf DEFINES += USE_SORD # Libraries and paths should be added by config.pri win32-g++ { INCLUDEPATH += ../sv-dependency-builds/win32-mingw/include LIBS += -L../../sv-dependency-builds/win32-mingw/lib } win32-msvc* { # We actually expect MSVC to be used only for 64-bit builds, # though the qmake spec is still called win32-msvc* INCLUDEPATH += ../sv-dependency-builds/win64-msvc/include LIBS += -L../../sv-dependency-builds/win64-msvc/lib } mac* { INCLUDEPATH += ../sv-dependency-builds/osx/include LIBS += -L../sv-dependency-builds/osx/lib } sonic-visualiser-3.0.3/samples/README0000644000000000000000000000024413111512442015460 0ustar 00000000000000Samples from standard Hydrogen drum machine kits, except for piano.wav (ancestry unknown), elecpiano.wav (recorded by Matthias Mauch) and click.wav (random noise). sonic-visualiser-3.0.3/samples/bass.wav0000644000000000000000000005506413111512442016261 0ustar 00000000000000RIFF,ZWAVEfmt D¬±dataZ ""''--44<<DDMMXXccpp~~ŽŽŸŸ±±ÆÆÛÛóó  ))GGiiŒŒ²²ÛÛ77iiŸŸÙÙYYçç66‡‡ßß<<žžrrãã\\ÛÛ__ééw w   ¯ ¯ Q Q ÿ ÿ ± ± m m --÷÷ÇÇ  €€kkYYUUQQ\\oo££ÏÏýý55||¾¾!!e"e"Ä#Ä#1%1%˜&˜&(())++›,›,(.(.Á/Á/\1\133¥4¥4P6P688»9»9v;v;4=4=ô>ô>·@·@zBzBJDJD F FÜGÜG«I«IvKvKFMFMOOÜPÜP¢R¢RqTqT8V8VøWøW¶Y¶Yu[u[*]*]â^â^‰`‰`2b2bÐcÐcieieÿfÿf‡h‡h j j‚k‚kólólUnUnµoµoþpþpIrIrss­t­tÌuÌuÜvÜváwáwÙxÙxÂyÂy˜z˜zi{i{ | |Ï|Ï|m}m}ø}ø}s~s~Þ~Þ~99¹¹ää÷÷ûûïïÏÏ¢¢^^  ­~­~5~5~²}²}}}t|t|¹{¹{ðzðzzz0y0y6x6x/w/wvvîtîtÀsÀsrr,q,qÐoÐoknkn÷l÷lukukäiäiNhNh¶f¶feeOcOc—a—aÌ_Ì_^^5\5\TZTZ~X~X—V—VªTªTÃRÃRÔPÔPÝNÝNñLñLõJõJùHùHGG E ECCAA"?"?4=4=?;?;P9P9q7q7Ž5Ž5«3«3Õ1Õ1þ/þ/,.,.c,c,ª*ª*é(é(6'6'%%ì#ì#Q"Q"à à 55¼¼KKÞÞ}}))ØØ™™__--))BBdd‘ ‘ Á Á ý ý < < „ „ Ô Ô * * ŒŒïï[[ÐÐLLÏÏWWçç||½½ccÅÅ{{;;ýýÄÄ``55  ééÉɬ¬’’{{ggUUFF99--$$  ''eeáá¾¾''JJRRj j     C(C(¾1¾1ß;ß;DFDF¶P¶PÇZÇZ/d/d‡l‡l§s§sByBy;};}wwóóµ~µ~Þ{Þ{’w’wôqôqKkKkÇcÇc®[®[2S2SŽJŽJüAüA™9™9Ÿ1Ÿ1(*(*J#J#……³³””  @@÷÷''ËËÊÊ››NN"" ýÿýÿõÿõÿâÿâÿÀÿÀÿŠÿŠÿ;ÿ;ÿÌþÌþ9þ9þ}ý}ý—ü—ü~û~û4ú4úµøµø÷÷õõùòùò¤ð¤ðîîkëkë†è†è|å|åDâDâðÞðÞ„Û„Ûò×ò×ZÔZԢТÐìÌìÌ.É.ÉeÅeÅ£Á£Áð½ð½;º;º–¶–¶³³„¯„¯%¬%¬Û¨Û¨¦¥¦¥•¢•¢¦Ÿ¦ŸÐœÐœšš–—–—,•,•ç’ç’ÆÆÂŽÂŽîŒîŒ;‹;‹¨‰¨‰7ˆ7ˆã†ã†»…»…ª„ª„¿ƒ¿ƒð‚ð‚8‚8‚  ""½€½€o€o€9€9€€€ € € € €%€%€K€K€‚€‚€Ä€Ä€ssÚÚJ‚J‚łłGƒGƒÑƒÑƒ^„^„ö„ö„‰…‰…,†,†È†È†n‡n‡ˆˆµˆµˆ^‰^‰ŠŠ©Š©ŠS‹S‹ø‹ø‹–Œ–Œ==ÚÚ|Ž|ަ¦77ÊÊ]‘]‘ã‘ã‘d’d’ç’ç’_“_“ܓܓI”I”»”»”)•)•‡•‡•î•î•B–B–––––å–å–5—5—y—y—¼—¼—û—û—4˜4˜f˜f˜˜˜¶˜¶˜Ó˜Ó˜ò˜ò˜ ™ ™™™1™1™;™;™>™>™>™>™4™4™1™1™™™™™ø˜ø˜Ý˜Ý˜À˜À˜š˜š˜z˜z˜J˜J˜˜˜ä—ä—«—«—k—k—/—/—ë–ë– – –V–V–––»•»•f•f•••µ”µ”W”W”ø“ø“š“š“7“7“Ë’Ë’d’d’ø‘ø‘‹‘‹‘‘‘¯¯77ÅÅWW׎׎cŽcŽííssùŒùŒŒŒŒŒŽ‹Ž‹‹‹™Š™ŠŠЍ‰¨‰2‰2‰¸ˆ¸ˆEˆEˆÑ‡Ñ‡^‡^‡ç†ç†{†{† † †¤…¤…:…:…Ó„Ó„r„r„„„³ƒ³ƒVƒVƒƒƒ¯‚¯‚]‚]‚‚‚Ëˉ‰OO߀߀±€±€…€…€c€c€G€G€-€-€€€ € € € € € €€€€€1€1€K€K€g€g€‰€‰€±€±€ß€ß€OOÖÖ ‚ ‚u‚u‚ЂЂ-ƒ-ƒ”ƒ”ƒ„„u„u„ó„ó„s…s…û…û…‰†‰†‡‡¼‡¼‡[ˆ[ˆ ‰ ‰»‰»‰rŠrŠ0‹0‹ø‹ø‹ÁŒÁŒ’’qŽqŽPP;;*‘*‘’’““””"•"•.–.–B—B—^˜^˜z™z™žšžšÇ›Ç›ûœûœ/ž/žjŸjŸ® ® ï¡ï¡9£9£ˆ¤ˆ¤Þ¥Þ¥-§-§‰¨‰¨æ©æ©K«K«­¬­¬®®z¯z¯ç°ç°Q²Q²Ç³Ç³8µ8µ®¶®¶ ¸ ¸¹¹»»‹¼‹¼¾¾}¿}¿õÀõÀmÂmÂæÃæÃaÅaÅÎÆÎÆDÈDȹɹÉ0Ë0˘̘ÌÎÎpÏpÏÛÐÛÐ<Ò<Ò¢Ó¢ÓÕÕYÖYÖ®×®×ÙÙSÚSÚžÛžÛãÜãÜ"Þ"Þaßaß–à–àÅáÅá÷â÷âää;å;åUæUæjçjç|è|è‚é‚é…ê…êëëvìvìbíbíQîQî0ï0ïððáðáð±ñ±ñzòzò;ó;ó÷ó÷ó©ô©ôVõVõúõúõœöœö6÷6÷É÷É÷UøUøÝøÝø^ù^ùÙùÙùMúMú½ú½ú%û%ûˆûˆûæûæû?ü?ü“ü“üáüáü)ý)ýoýoý¯ý¯ýëýëý!þ!þUþUþ„þ„þ¯þ¯þ×þ×þûþûþÿÿ:ÿ:ÿUÿUÿnÿnÿƒÿƒÿ–ÿ–ÿ¨ÿ¨ÿ·ÿ·ÿÄÿÄÿÏÿÏÿÙÿÙÿáÿáÿèÿèÿîÿîÿòÿòÿöÿöÿùÿùÿüÿüÿýÿýÿÿÿÿÿ %%//::GGVVgg{{‘‘ªªÆÆåå..XX‡‡¹¹ïï++kk±±ýýKK££ÿÿbbËË::®®++¯¯77ÌÌee  ¯ ¯ ` `   Ú Ú ¤ ¤ v v OO6633TT{{¨¨ÞÞff³³  k k Ñ!Ñ!<#<#®$®$(&(&­'­'5)5)Ç*Ç*[,[,ó-ó-—/—/:1:1ç2ç244C6C6ý7ý7±9±9v;v;4=4=û>û>¼@¼@€B€BJDJDFFÜGÜGIIiKiK4M4M÷N÷N¿P¿PRR7T7TöUöU²W²WlYlY[[Ä\Ä\o^o^ ` `«a«a=c=cÈdÈdRfRfÌgÌgGiGi³j³jllpmpmÁnÁn p pHqHq|r|r s s¿t¿tÐuÐuÑvÑvÆwÆw±x±xyyazaz%{%{Û{Û{||}}§}§}"~"~‘~‘~ó~ó~CC……¹¹àà÷÷ûû÷÷à๹……??ï~ï~‘~‘~"~"~£}£}}}||×{×{!{!{azaz‘y‘yµxµxÍwÍwÕvÕvÓuÓuÅtÅt¯s¯s†r†rRqRq"p"pÖnÖnŽmŽm2l2lÔjÔjœiœichch g gÔeÔedd6c6cåaåa~`~`$_$_¸]¸]I\I\àZàZoYoYöWöW{V{VUUƒSƒSùQùQPPüNüNtMtMíKíKcJcJÔHÔHIGIGÅEÅE7D7D¨B¨B!A!A›?›?>>‹<‹<;;9988‡6‡6 5 53322«0«0è>X9X9ÿ3ÿ3ß.ß.þ)þ)_%_%!!MMååÄÄýý  E E U U ££,,îîßßÿÿGG²²;;ÞÞ˜˜dd>>%% ÿÿÿÿûÿûÿõÿõÿëÿëÿÝÿÝÿÉÿÉÿ®ÿ®ÿŒÿŒÿ`ÿ`ÿ*ÿ*ÿêþêþþþEþEþÝýÝýiýiýçüçüUüUü´û´ûûûAúAúqùqùŽøŽøŸ÷Ÿ÷ ö öŽõŽõoôoôCóCóòò¹ð¹ðcïcïîî’ì’ìëë’é’éèèoæoæÑäÑä-ã-ãxáxáÉßÉßÞÞZÜZܕڕÚÕØÕØ××EÕEՂӂӾѾÑòÏòÏ0Î0ÎpÌp̪ʪÊôÈôÈ8Ç8Ç~Å~ÅÎÃÎÃ!Â!ÂyÀyÀÓ¾Ó¾:½:½Ÿ»Ÿ»ºº†¸†¸··†µ†µ´´ª²ª²B±B±å¯å¯®®=­=­÷«÷«¹ª¹ª€©€©Q¨Q¨'§'§¦¦ð¤ð¤Þ£Þ£Ù¢Ù¢Ø¡Ø¡Ù Ù ëŸëŸŸŸžžAAgœgœ™›™›ÙšÙš š šT™T™¥˜¥˜õ—õ—L—L—¨–¨– – –~•~•è”è”[”[”ܓܓY“Y“ْْd’d’í‘푇‘‡‘‘‘¶¶YYûû¦¦PP¸Ž¸ŽmŽmŽ&Ž&Žææ¬¬ss==׌׌¦Œ¦ŒŒŒYŒYŒ2Œ2ŒŒŒô‹ô‹Ó‹Ó‹·‹·‹ ‹ ‹Ž‹Ž‹€‹€‹n‹n‹[‹[‹P‹P‹E‹E‹A‹A‹;‹;‹;‹;‹;‹;‹?‹?‹A‹A‹I‹I‹P‹P‹[‹[‹n‹n‹y‹y‹Š‹Š‹™‹™‹¯‹¯‹È‹È‹Þ‹Þ‹ÿ‹ÿ‹ŒŒ@Œ@Œ`Œ`Œ„Œ„Œ©Œ©ŒÓŒÓŒ//\\ÁÁ÷÷4Ž4ŽmŽmŽªŽªŽîŽîŽ11uu»»OOœœññE‘E‘™‘™‘ñ‘ñ‘J’J’­’­’““u“u“ܓܓC”C”®”®”••ޕޕ––y–y–ò–ò–o—o—ñ—ñ—s˜s˜õ˜õ˜€™€™ š ššššš2›2›¾›¾›VœVœòœòœ‘‘)ž)žÑžÑžsŸsŸ  Ã Ã v¡v¡'¢'¢Ù¢Ù¢Ž£Ž£B¤B¤¥¥Ã¥Ã¥€¦€¦J§J§¨¨Û¨Û¨£©£©SªSª « «Á«Á«u¬u¬2­2­é­é­ª®ª®`¯`¯"°"°ï°ï°­±­±u²u²=³=³´´Ö´Ö´µµk¶k¶A·A· ¸ ¸à¸à¸¼¹¼¹ŽºŽºc»c»<¼<¼½½õ½õ½Î¾Î¾¬¿¬¿ÀÀgÁgÁKÂKÂ-Ã-ÃÄÄïÄïÄ×Å׿ƼƜǜDžȅÈhÉhÉHÊHÊ0Ë0ËÌÌùÌùÌÜÍÜÍÈÎÈΣϣόЌÐpÑpÑPÒPÒ6Ó6ÓÔÔúÔúÔÚÕÚÕ¸Ö¸Ö™×™×xØxØVÙVÙ.Ú.ÚÛÛãÛãÛ·Ü·ÜÝÝfÞfÞ4ß4ßààØàØà¡á¡ánânâ;ã;ãýãýãÇäÇä‡å‡åEæEæçç¿ç¿çwèwè1é1éâéâéšêšêHëHëñëñëžìžì@í@íèíèí‡î‡î"ï"ïÁïÁïYðYðîðîðññòò›ò›ò&ó&ó©ó©ó.ô.ô¬ô¬ô)õ)õ¢õ¢õööŠöŠöúöúöh÷h÷Ñ÷Ñ÷6ø6øšøšøüøüøXùXù±ù±ù ú ú]ú]ú­ú­úúúúúFûFûûûÔûÔûüüUüUü‘ü‘üËüËüýý9ý9ýkýký›ý›ýÉýÉýóýóýþþDþDþiþiþ‹þ‹þ«þ«þÉþÉþæþæþÿÿÿÿ0ÿ0ÿEÿEÿYÿYÿkÿkÿ|ÿ|ÿŒÿŒÿšÿšÿ¦ÿ¦ÿ²ÿ²ÿ½ÿ½ÿÆÿÆÿÏÿÏÿÖÿÖÿÝÿÝÿãÿãÿèÿèÿìÿìÿðÿðÿôÿôÿöÿöÿùÿùÿûÿûÿüÿüÿþÿþÿÿÿÿÿÿÿÿÿ ##**22;;EEQQ]]ll{{ŸŸ´´ËËääÿÿ;;^^‚‚©©ÓÓ11cc››ÓÓQQ••ÝÝ**xxËË&&ããGG°°““  ††    ¬ ¬ B B Þ Þ € € ' ' Ñ Ñ ::÷÷¶¶}}LLóóÒÒ³³ššŠŠzzqq{{……¤¤¾¾Ý Ý ÷!÷!$#$#J$J$}%}%²&²&ë'ë'*)*)l*l*³+³+ý,ý,D.D.//ñ0ñ0G2G2ž3ž355\6\6Ä7Ä7(9(9::ÿ;ÿ;i=i=Ý>Ý>D@D@¹A¹A*C*C˜D˜D F FGGôHôHkJkJÜKÜKKMKM»N»N5P5PœQœQ S SvTvTäUäUDWDW­X­X Z Zo[o[Ê\Ê\+^+^__Ì`Ì`bbcccc¨d¨dìeìe#g#gUhUh‡i‡i¯j¯jØkØkðlðl n noo)p)p)q)q&r&rssttêtêtÈuÈužvžvnwnw/x/xíxíx¡y¡yIzIzìzìzƒ{ƒ{||||}}‹}‹}ô}ô}S~S~­~­~ú~ú~<<ww¥¥ÇÇää÷÷ûûûûììÓÓµµ‰‰SSË~Ë~{~{~~~¶}¶}F}F}Ë|Ë|I|I|À{À{){){zzäyäy8y8yyxyxÜwÜw6w6w„v„vÓuÓuuu`t`ttttt}t}t(u(u v vww@x@xwywy°z°zÛ{Û{ò|ò|ì}ì}¼~¼~^^ÇÇûûìì-~-~}}ª{ª{zzxxòuòu‘s‘súpúp7n7n?k?khhØdØd|a|aÿ]ÿ]hZhZÏVÏV!S!SoOoO¸K¸KHH]D]D·@·@(=(=Ÿ9Ÿ93636×2×2—/—/j,j,Z)Z)p&p&ž#ž#ð ð \\ææ––ffQQcc‘‘ßßIIÒ Ò w w 7 7   //dd¯¯  yy÷÷ƒƒÅÅxx55ûûÊÊ¡¡bbKK88)) ÿÿÿÿþÿþÿüÿüÿùÿùÿöÿöÿñÿñÿìÿìÿåÿåÿÜÿÜÿÒÿÒÿÆÿÆÿ¸ÿ¸ÿ¨ÿ¨ÿ–ÿ–ÿ‚ÿ‚ÿkÿkÿRÿRÿ6ÿ6ÿÿÿõþõþÑþÑþªþªþþþQþQþ þ þíýíýµýµý{ý{ý=ý=ýýüýü¹ü¹üsüsü'ü'üÜûÜûŠûŠû6û6ûáúáúˆúˆú)ú)úÍùÍùjùjùùùžøžø4ø4øÊ÷Ê÷Z÷Z÷ëöëöyöyöööõõõõžôžô!ô!ô¡ó¡ó&ó&ó¤ò¤ò#ò#ò¢ñ¢ñññ˜ð˜ððð‘ï‘ïïïîîýíýísísíïìïìdìdìÜëÜëVëVëÏêÏêEêEêÀéÀé7é7é²è²è0è0è¦ç¦ç$ç$ç¡æ¡æ æ æåå!å!å¡ä¡ä#ä#ä¨ã¨ã-ã-ã±â±â6â6âÁáÁáFáFáØàØàcàcàïßï߀߀ßßߨިÞ<Þ<ÞÒÝÒÝkÝkÝÝÝŸÜŸÜEÜEÜãÛãÛ„Û„Û+Û+ÛÒÚÒÚvÚvÚ!Ú!ÚÎÙÎÙ~Ù~Ù+Ù+Ùߨߨ’Ø’ØHØHØØؽ׽×z×z×A×A×××ÁÖÁÖˆÖˆÖNÖNÖÖÖåÕåÕ°Õ°ÕÕÕVÕVÕ*Õ*ÕÕÕÖÔÖÔµÔµÔ•Ô•ÔtÔtÔUÔUÔ:Ô:ÔÔÔÔÔîÓîÓßÓßÓÇÓÇÓ¸Ó¸Ó¬Ó¬ÓÓӘӘӌӌӇӇӂӂӂӂӂӂӂӂӇӇӌӌӘӘӢӢӬӬӸӸÓÎÓÎÓÙÓÙÓîÓîÓÔÔÔÔ5Ô5ÔNÔNÔiÔiÔŠÔŠÔ¤Ô¤ÔÊÔÊÔêÔêÔ Õ Õ5Õ5Õ`Õ`Õ…Õ…Õ°Õ°ÕßÕßÕÖÖ>Ö>ÖnÖnÖ£Ö£ÖØÖØÖ××E×E×z×z×´×´×ò×ò×0Ø0ØnØnثثØîØîØ0Ù0ÙtÙtټټÙýÙýÙCÚCÚÚÚ×Ú×Ú!Û!ÛlÛlÛ¼Û¼Û Ü ÜUÜUܣܣÜ÷Ü÷ÜCÝCݘݘÝîÝîÝEÞEÞ—Þ—ÞëÞëÞAßAߜߜßïßïßMàMà¡à¡àþàþàSáSá²á²á â âhâhâÆâÆâ#ã#ãããÝãÝã8ä8äääüäüäZåZå¶å¶åæævævæÖæÖæ4ç4ç–ç–çóçóçSèSè·è·èéévévéÒéÒé2ê2ê•ê•êòêòêSëSë°ë°ëììoìoìÌìÌì+í+í„í„íáíáíAîAîœîœîøîøîQïQï¬ï¬ïðð`ð`ð·ð·ðññcñcñ¾ñ¾ñòòfòfò»ò»òóóaóaó±ó±óôôVôVô¦ô¦ôïôïô<õ<õŠõŠõÖõÖõööiöiö±ö±ö÷ö÷ö1÷1÷k÷k÷¤÷¤÷Ü÷Ü÷øøJøJøøøµøµøêøêøùùPùPù„ù„ùµùµùåùåùúúDúDúrúrú¡ú¡úÌúÌúùúùú$û$ûMûMûxûxû û ûÈûÈûðûðûüü9ü9ü_ü_üƒüƒü§ü§üÇüÇüéüéü ý ý)ý)ýIýIýgýgýƒýƒý¡ý¡ý»ý»ý×ý×ýñýñý þ þ#þ#þ;þ;þRþRþhþhþ}þ}þ’þ’þ¦þ¦þ¹þ¹þËþËþÝþÝþïþïþÿþÿþÿÿÿÿ,ÿ,ÿ:ÿ:ÿHÿHÿTÿTÿaÿaÿkÿkÿvÿvÿÿÿ‹ÿ‹ÿ”ÿ”ÿœÿœÿ¥ÿ¥ÿ¬ÿ¬ÿ´ÿ´ÿ»ÿ»ÿÁÿÁÿÇÿÇÿÍÿÍÿÒÿÒÿÖÿÖÿÛÿÛÿßÿßÿãÿãÿæÿæÿéÿéÿìÿìÿïÿïÿñÿñÿôÿôÿöÿöÿ÷ÿ÷ÿùÿùÿúÿúÿûÿûÿüÿüÿýÿýÿþÿþÿÿÿÿÿÿÿÿÿ ""'',,2288??GGOOXXbbllwwƒƒžž­­¼¼ÍÍÞÞòò11HHbb||˜˜¶¶ÕÕôô;;__‡‡±±ÛÛ55ee™™ÍÍ<<xx³³óó77zz¿¿TT££óóFF››óóNN­­ q q Ø Ø ? ? ¬ ¬     z z ô ô r r õ õ yyˆˆ¦¦;;ÔÔoo¬¬QQóó  PPÿÿ±±ffÞÞŸŸ``))ïïÁÁ’’^^8 8 !!ç!ç!Æ"Æ"¨#¨#Œ$Œ$r%r%W&W&G'G';(;(%)%)**++,,--ø-ø-û.û.ÿ/ÿ/ü0ü0 2 23344"5"5,6,68787I8I8X9X9l:l:‚;‚;•<•<«=«=Ã>Ã>Ù?Ù?î@î@BB#C#C?D?DVEVErFrFŽGŽG¤H¤HÆIÆIåJåJúKúKMM1N1NJOJOlPlP~Q~Q•R•R´S´SÃTÃTØUØUíVíVXXYY%Z%Z8[8[@\@\Ù\Ù\]]]]©\©\\\,[,[ZZÖXÖXbWbWÌUÌU T T1R1R5P5PNNúKúKÁIÁI}G}GEE½B½BV@V@í=í=‚;‚;99¦6¦6C4C4â1â1‹/‹/?-?-ü*ü*Á(Á(˜&˜&$$t"t"z z ’’µµéé22ýý~~  ­­__&&ú ú à à Ø Ø Þ Þ ò ò   GG‡‡ÔÔ//””ƒƒ™™55××55îî°°wwDDïïÌ̬¬‘‘xxddRRBB55**!! ÿÿÿÿþÿþÿýÿýÿûÿûÿùÿùÿ÷ÿ÷ÿõÿõÿóÿóÿðÿðÿíÿíÿéÿéÿåÿåÿáÿáÿÜÿÜÿÖÿÖÿÑÿÑÿÊÿÊÿÃÿÃÿ¼ÿ¼ÿ´ÿ´ÿ«ÿ«ÿ¢ÿ¢ÿ˜ÿ˜ÿŽÿŽÿƒÿƒÿwÿwÿkÿkÿ^ÿ^ÿQÿQÿBÿBÿ4ÿ4ÿ$ÿ$ÿÿÿÿÿñþñþßþßþÌþÌþ¹þ¹þ¤þ¤þþþzþzþdþdþMþMþ6þ6þþþþþëýëýÑýÑý·ý·ýýýýýcýcýGýGý)ý)ý ý ýïüïüÏüÏü±ü±ü‘ü‘üqüqüQüQü/ü/üüüíûíûÌûÌû©û©û†û†ûdûdûAûAûûûúúúúÕúÕú²ú²úúúiúiúEúEú ú úúùúùØùØù±ù±ùùùiùiùDùDùùùüøüøÕøÕø°ø°øŒøŒøeøeøAøAøøøù÷ù÷Ô÷Ô÷±÷±÷‹÷‹÷i÷i÷F÷F÷!÷!÷÷÷ÞöÞöºöºö™ö™öwöwöWöWö3ö3öööñõñõÒõÒõ³õ³õ”õ”õtõtõVõVõ8õ8õõõûôûôàôàôÁôÁô©ô©ôôôqôqôXôXô>ô>ô#ô#ô ô ôóóóóÙóÙóÁóÁó«ó«ó–ó–óóójójóZóZóCóCó1ó1óóó ó óùòùòéòéòØòØòÇòÇò¹ò¹òªòªò™ò™òòò‚ò‚òtòtòiòiò^ò^òTòTòIòIòAòAò8ò8ò/ò/ò)ò)ò!ò!òòòòòòò ò ò ò òòòòòòòòòòòòòòòòòòòòò ò ò ò òòòòòòò!ò!ò'ò'ò/ò/ò4ò4ò>ò>òGòGòOòOòXòXòbòbòoòoòzòzò†ò†ò“ò“òŸòŸò®ò®ò»ò»òÇòÇòØòØòæòæò÷ò÷òóóóó)ó)ó9ó9óIóIó^ó^ónónóóó“ó“ó©ó©ó»ó»óÓóÓóçóçóûóûóôô)ô)ô>ô>ôVôVôlôlôƒôƒôžôžô´ô´ôÉôÉôâôâôûôûôõõ0õ0õIõIõaõaõ|õ|õ—õ—õ±õ±õËõËõèõèõöööö6ö6öQöQöpöpöŠöŠö¦ö¦öÃöÃöÞöÞöúöúö÷÷1÷1÷N÷N÷k÷k÷‰÷‰÷¤÷¤÷Â÷Â÷ß÷ß÷þ÷þ÷øø4ø4øQøQøpøpøøø©ø©øÅøÅøâøâøùùùù9ù9ùTùTùqùqùùù©ù©ùÅùÅùäùäùýùýùúú5ú5úQúQúmúmúˆúˆú¢ú¢ú½ú½úØúØúñúñú û û&û&ûAûAû\û\ûuûuûûû¨û¨ûÀûÀûÙûÙûñûñû ü ü!ü!ü9ü9üOüOügügü}ü}ü•ü•ü­ü­üÁüÁü×ü×üíüíüýýýý-ý-ý?ý?ýUýUýiýiý{ý{ýýý£ý£ý³ý³ýÅýÅýÙýÙýëýëýûýûý þ þþþ.þ.þ>þ>þNþNþ]þ]þlþlþzþzþ‰þ‰þ—þ—þ¥þ¥þ³þ³þ¿þ¿þÌþÌþØþØþåþåþðþðþüþüþÿÿÿÿÿÿ'ÿ'ÿ1ÿ1ÿ;ÿ;ÿDÿDÿMÿMÿVÿVÿ_ÿ_ÿgÿgÿoÿoÿvÿvÿ~ÿ~ÿ…ÿ…ÿŒÿŒÿ“ÿ“ÿ™ÿ™ÿŸÿŸÿ¥ÿ¥ÿ«ÿ«ÿ°ÿ°ÿµÿµÿºÿºÿ¿ÿ¿ÿÃÿÃÿÈÿÈÿÌÿÌÿÐÿÐÿÓÿÓÿ×ÿ×ÿÚÿÚÿÝÿÝÿàÿàÿãÿãÿåÿåÿèÿèÿêÿêÿìÿìÿîÿîÿðÿðÿòÿòÿóÿóÿõÿõÿöÿöÿ÷ÿ÷ÿøÿøÿúÿúÿúÿúÿûÿûÿüÿüÿýÿýÿýÿýÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿ !!$$''**..2266::>>BBGGLLRRWW]]ccjjqqxx‡‡˜˜¡¡ªª´´¾¾ÈÈÓÓßßëëøø..==LL\\mm~~¢¢µµÉÉÞÞòò  77OOee››µµÑÑíí  ))GGgg‰‰««ÍÍïï;;cc‡‡²²ÛÛ22\\‹‹»»ëëNNƒƒ··ëë""[[““ÏÏ  GG„„ÅÅ  H H Š Š Ï Ï   \ \ § § ñ ñ > > ‡ ‡ Ø Ø ' ' z z Ê Ê   v v Ì Ì ""ÙÙ77‘‘÷÷UU»»€€êêRR»»((••  zzéé??vv””  ””vvBBµµ]]öö‹‹œœ‘‘  ƒƒòòiiÝÝMM  5 5 © © % % Ÿ Ÿ   Ÿ Ÿ " " ¨ ¨ 2 2 ÂÂQQä人[[¬¬ZZ  ¿¿ww22ïï±±ss;;ÑÑ¡¡ssGGööÒÒ¯¯ŽŽppSS88ññÜÜÉɸ¸§§˜˜‰‰||ppeeZZQQHH@@9922,,''"" ÿÿÿÿÿÿÿÿþÿþÿþÿþÿýÿýÿýÿýÿüÿüÿûÿûÿúÿúÿúÿúÿùÿùÿøÿøÿöÿöÿõÿõÿôÿôÿòÿòÿñÿñÿïÿïÿîÿîÿìÿìÿêÿêÿèÿèÿæÿæÿãÿãÿáÿáÿßÿßÿÜÿÜÿÙÿÙÿÖÿÖÿÔÿÔÿÑÿÑÿÍÿÍÿÊÿÊÿÇÿÇÿÃÿÃÿÀÿÀÿ¼ÿ¼ÿ¸ÿ¸ÿ´ÿ´ÿ°ÿ°ÿ¬ÿ¬ÿ¨ÿ¨ÿ¤ÿ¤ÿŸÿŸÿ›ÿ›ÿ–ÿ–ÿ‘ÿ‘ÿŒÿŒÿ‡ÿ‡ÿ‚ÿ‚ÿ}ÿ}ÿxÿxÿrÿrÿmÿmÿgÿgÿbÿbÿ\ÿ\ÿWÿWÿQÿQÿKÿKÿEÿEÿ?ÿ?ÿ9ÿ9ÿ3ÿ3ÿ-ÿ-ÿ&ÿ&ÿ ÿ ÿÿÿÿÿ ÿ ÿÿÿÿÿùþùþóþóþìþìþæþæþßþßþØþØþÑþÑþËþËþÄþÄþ¾þ¾þ·þ·þ°þ°þªþªþ£þ£þœþœþ•þ•þþþˆþˆþ‚þ‚þ{þ{þuþuþoþoþhþhþbþbþ\þ\þUþUþOþOþIþIþCþCþ<þ<þ6þ6þ1þ1þ+þ+þ%þ%þþþþþþþþþ þ þþþÿýÿýùýùýóýóýïýïýëýëýåýåýáýáýÛýÛý×ý×ýÓýÓýÏýÏýÉýÉýÅýÅýÃýÃý¿ý¿ý»ý»ý·ý·ý³ý³ý¯ý¯ý­ý­ý«ý«ý§ý§ý¥ý¥ý¡ý¡ýŸýŸýýý™ý™ý—ý—ý•ý•ý“ý“ý‘ý‘ýýýýý‹ý‹ý‹ý‹ý‰ý‰ý‡ý‡ý‡ý‡ý…ý…ý…ý…ýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒýƒý…ý…ý…ý…ý‡ý‡ý‡ý‡ý‰ý‰ý‹ý‹ýýýýýýý‘ý‘ý“ý“ý•ý•ý•ý•ý—ý—ý™ý™ý›ý›ýŸýŸýŸýŸý¡ý¡ý¥ý¥ý§ý§ý©ý©ý«ý«ý­ý­ý¯ý¯ý³ý³ýµýµý·ý·ý»ý»ý½ý½ýÁýÁýÅýÅýÇýÇýÉýÉýÍýÍýÑýÑýÕýÕý×ý×ýÛýÛýßýßýãýãýçýçýéýéýíýíýñýñýõýõýùýùýýýýýþþþþ þ þþþþþþþþþþþ#þ#þ'þ'þ+þ+þ0þ0þ4þ4þ9þ9þ=þ=þBþBþFþFþKþKþOþOþTþTþYþYþ^þ^þbþbþgþgþlþlþqþqþuþuþzþzþþþƒþƒþˆþˆþþþ’þ’þ—þ—þ›þ›þ þ þ¥þ¥þªþªþ¯þ¯þ´þ´þ¸þ¸þ½þ½þÁþÁþÆþÆþËþËþÐþÐþÕþÕþÙþÙþÞþÞþãþãþèþèþìþìþñþñþöþöþúþúþÿþÿþÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿ#ÿ#ÿ'ÿ'ÿ+ÿ+ÿ/ÿ/ÿ4ÿ4ÿ8ÿ8ÿ<ÿ<ÿ@ÿ@ÿDÿDÿHÿHÿLÿLÿPÿPÿTÿTÿXÿXÿ\ÿ\ÿ`ÿ`ÿdÿdÿgÿgÿkÿkÿnÿnÿrÿrÿvÿvÿyÿyÿ}ÿ}ÿ€ÿ€ÿ„ÿ„ÿ‡ÿ‡ÿŠÿŠÿÿÿÿÿ”ÿ”ÿ—ÿ—ÿšÿšÿÿÿ ÿ ÿ£ÿ£ÿ¦ÿ¦ÿ¨ÿ¨ÿ«ÿ«ÿ®ÿ®ÿ°ÿ°ÿ³ÿ³ÿµÿµÿ¸ÿ¸ÿ»ÿ»ÿ½ÿ½ÿ¿ÿ¿ÿÂÿÂÿÄÿÄÿÆÿÆÿÈÿÈÿÊÿÊÿÌÿÌÿÎÿÎÿÐÿÐÿÒÿÒÿÔÿÔÿÖÿÖÿØÿØÿÙÿÙÿÛÿÛÿÝÿÝÿÞÿÞÿàÿàÿáÿáÿãÿãÿäÿäÿæÿæÿçÿçÿèÿèÿéÿéÿëÿëÿìÿìÿíÿíÿîÿîÿïÿïÿðÿðÿñÿñÿòÿòÿóÿóÿôÿôÿôÿôÿõÿõÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿùÿùÿùÿùÿúÿúÿúÿúÿûÿûÿûÿûÿüÿüÿüÿüÿüÿüÿýÿýÿýÿýÿþÿþÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !!$$&&))++..114477;;>>AAEEIIMMRRVV[[``eejjoouu{{‡‡ŽŽ••››££ªª²²ººÂÂÊÊÓÓÝÝææððúú%%11==HHUUbbpp~~ŒŒšš©©¹¹ÈÈØØééúú  11CCUUii}}››¥¥««­­­­««¥¥““‰‰{{mm]]OO==--ôôããÐн½ªª˜˜††ttbbQQAA11!!õõççÚÚÍÍÁÁµµªªŸŸ––ŒŒ‚‚zzrrjjbb[[TTNNHHCC==884400++(($$!! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿýÿýÿýÿýÿýÿýÿýÿýÿüÿüÿüÿüÿüÿüÿûÿûÿûÿûÿûÿûÿúÿúÿúÿúÿúÿúÿùÿùÿùÿùÿøÿøÿøÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿõÿõÿõÿõÿôÿôÿôÿôÿóÿóÿóÿóÿòÿòÿòÿòÿñÿñÿñÿñÿðÿðÿïÿïÿïÿïÿîÿîÿîÿîÿíÿíÿìÿìÿìÿìÿëÿëÿêÿêÿêÿêÿéÿéÿèÿèÿèÿèÿçÿçÿæÿæÿæÿæÿåÿåÿäÿäÿäÿäÿãÿãÿâÿâÿáÿáÿáÿáÿàÿàÿßÿßÿÞÿÞÿÞÿÞÿÝÿÝÿÜÿÜÿÛÿÛÿÛÿÛÿÚÿÚÿÙÿÙÿØÿØÿ×ÿ×ÿ×ÿ×ÿÖÿÖÿÕÿÕÿÔÿÔÿÔÿÔÿÓÿÓÿÒÿÒÿÑÿÑÿÑÿÑÿÐÿÐÿÏÿÏÿÎÿÎÿÎÿÎÿÍÿÍÿÌÿÌÿËÿËÿËÿËÿÊÿÊÿÉÿÉÿÈÿÈÿÈÿÈÿÇÿÇÿÆÿÆÿÅÿÅÿÅÿÅÿÄÿÄÿÃÿÃÿÃÿÃÿÂÿÂÿÁÿÁÿÁÿÁÿÀÿÀÿ¿ÿ¿ÿ¿ÿ¿ÿ¾ÿ¾ÿ½ÿ½ÿ½ÿ½ÿ¼ÿ¼ÿ¼ÿ¼ÿ»ÿ»ÿºÿºÿºÿºÿ¹ÿ¹ÿ¹ÿ¹ÿ¸ÿ¸ÿ¸ÿ¸ÿ·ÿ·ÿ·ÿ·ÿ¶ÿ¶ÿ¶ÿ¶ÿµÿµÿµÿµÿ´ÿ´ÿ´ÿ´ÿ³ÿ³ÿ³ÿ³ÿ²ÿ²ÿ²ÿ²ÿ²ÿ²ÿ±ÿ±ÿ±ÿ±ÿ°ÿ°ÿ°ÿ°ÿ°ÿ°ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ­ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ°ÿ°ÿ°ÿ°ÿ°ÿ°ÿ±ÿ±ÿ±ÿ±ÿ±ÿ±ÿ²ÿ²ÿ²ÿ²ÿ³ÿ³ÿ³ÿ³ÿ³ÿ³ÿ´ÿ´ÿ´ÿ´ÿµÿµÿµÿµÿ¶ÿ¶ÿ¶ÿ¶ÿ·ÿ·ÿ·ÿ·ÿ¸ÿ¸ÿ¸ÿ¸ÿ¸ÿ¸ÿ¹ÿ¹ÿºÿºÿºÿºÿ»ÿ»ÿ»ÿ»ÿ¼ÿ¼ÿ¼ÿ¼ÿ½ÿ½ÿ½ÿ½ÿ¾ÿ¾ÿ¿ÿ¿ÿ¿ÿ¿ÿÀÿÀÿÀÿÀÿÁÿÁÿÂÿÂÿÂÿÂÿÃÿÃÿÃÿÃÿÄÿÄÿÄÿÄÿÅÿÅÿÆÿÆÿÆÿÆÿÇÿÇÿÈÿÈÿÉÿÉÿÉÿÉÿÊÿÊÿÊÿÊÿËÿËÿÌÿÌÿÌÿÌÿÍÿÍÿÎÿÎÿÎÿÎÿÏÿÏÿÐÿÐÿÑÿÑÿÑÿÑÿÒÿÒÿÒÿÒÿÓÿÓÿÔÿÔÿÔÿÔÿÕÿÕÿÖÿÖÿÖÿÖÿ×ÿ×ÿØÿØÿØÿØÿÙÿÙÿÚÿÚÿÚÿÚÿÛÿÛÿÜÿÜÿÜÿÜÿÝÿÝÿÞÿÞÿÞÿÞÿßÿßÿßÿßÿàÿàÿáÿáÿáÿáÿâÿâÿãÿãÿãÿãÿäÿäÿäÿäÿåÿåÿæÿæÿæÿæÿçÿçÿçÿçÿèÿèÿèÿèÿéÿéÿéÿéÿêÿêÿëÿëÿëÿëÿìÿìÿìÿìÿíÿíÿíÿíÿîÿîÿîÿîÿïÿïÿïÿïÿðÿðÿðÿðÿñÿñÿñÿñÿñÿñÿòÿòÿòÿòÿóÿóÿóÿóÿôÿôÿôÿôÿôÿôÿõÿõÿõÿõÿöÿöÿöÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿøÿøÿøÿùÿùÿùÿùÿùÿùÿúÿúÿúÿúÿúÿúÿúÿúÿûÿûÿûÿûÿûÿûÿûÿûÿüÿüÿüÿüÿüÿüÿüÿüÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !!""##%%&&''(())**++,,----..............----,,,,++**))))((''&&%%$$##""!!  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsonic-visualiser-3.0.3/samples/beep.wav0000644000000000000000000013502013111512442016233 0ustar 00000000000000RIFFºWAVEfmt D¬ b fact7PEAK/©"Dø?ö?data¸¹t;p;¢;¤;Í;Ì;ñ;ò;€ <€ <<€<€1<€0<€D<€D<€X<Y<€j<k<€v<v<{<{<€{<{<v<w<€n<€n<€b<€b<L¼€K¼a¼€a¼€¼¼€¼À¼@¢¼¢¼@¾¼€¾¼ï¼€î¼à$½%½ h½Àh½0œ½œ½€Á½°Á½à½à½0ü½ ü½H ¾X ¾°¾ ¾¾¾¸%¾¸%¾¨+¾°+¾ 3¾3¾(=¾(=¾H¾ H¾€U¾€U¾(b¾8b¾n¾ðm¾ˆy¾ˆy¾¨‚¾¬‚¾‰¾‰¾ü¾ü¾\—¾\—¾Ÿ¾Ÿ¾Ð¦¾Ì¦¾ ®¾¤®¾¶¾¶¾¨¾¾¬¾¾äÆ¾ÜÆ¾¸Ï¾¸Ï¾Ù¾Ù¾0à¾4à¾Lå¾Hå¾Èæ¾Ä澀往å¾ä¾ä¾¸ä¾¸ä¾(é¾0é¾øï¾ìï¾ ÷¾$÷¾ý¾ý¾`¿`¿¼¿º¿È¿Æ¿¸¿¼¿`¿`¿ ¿ ¿H¿L¿*¿&¿`ã¾dã¾(‘¾(‘¾pþ½`þ½¼¼€¬<€¬<€w<x<ò»ò»@§¼@§¼€—¼€—¼€s¼€s¼H¼€G¼O¼P¼^¼€]¼€n¼€n¼€Ñ¼@ѼÀK½L½p½`½P¾X¾€_¾€_¾оо¾ ¾D¬¾@¬¾\¸¾`¸¾H¾@¾àȾàȾL̾L̾ÔξØÎ¾Ó¾Ó¾ Ù¾œÙ¾Dá¾Dá¾ê¾$ê¾\ò¾\ò¾°ù¾°ù¾N¿L¿´¿¶¿D¿@¿ö ¿ö ¿º¿º¿x¿|¿$¿$¿Ò¿Ô¿†¿„¿!¿!¿Z$¿Z$¿š'¿œ'¿Ì*¿Ì*¿L-¿P-¿H.¿H.¿Ð,¿Ò,¿Ž)¿ˆ)¿ &¿ &¿,$¿.$¿h$¿d$¿Ê%¿Ì%¿†'¿†'¿Ø(¿Ø(¿Ä)¿Â)¿À*¿À*¿¼+¿¾+¿„,¿„,¿ð,¿ð,¿-¿ -¿L-¿H-¿®-¿°-¿z.¿x.¿x/¿v/¿„0¿Š0¿€1¿|1¿D2¿D2¿è2¿è2¿ž3¿ž3¿4¿’4¿ö5¿ô5¿¨7¿ª7¿d9¿b9¿º:¿º:¿Î;¿Ð;¿º<¿º<¿¢<¿¦<¿Ž;¿Š;¿ì8¿ì8¿ø4¿ø4¿00¿20¿ì+¿ì+¿,)¿,)¿Ž(¿Œ(¿D&¿B&¿%¿%¿Ž$¿Œ$¿Ð$¿Ð$¿r%¿r%¿&&¿*&¿'¿'¿((¿,(¿Š)¿Š)¿Ö*¿Ø*¿,¿,¿b-¿b-¿ .¿ .¿Ö/¿Ö/¿â0¿à0¿Ü1¿Ü1¿Ø2¿Ø2¿þ3¿ü3¿~5¿€5¿F7¿H7¿ê8¿ä8¿:¿ :¿ä:¿è:¿”;¿Ž;¿˜;¿š;¿X:¿\:¿ê6¿æ6¿Ö1¿Ø1¿²,¿°,¿)¿)¿~'¿~'¿þ&¿'¿H'¿H'¿(¿(¿”)¿’)¿è+¿æ+¿f.¿f.¿t0¿t0¿Ê1¿Ì1¿Ê2¿Ê2¿È3¿Ê3¿ú4¿ø4¿6¿”6¿`8¿`8¿.:¿*:¿¾;¿À;¿ì<¿ì<¿Ò=¿Ö=¿¸>¿¸>¿è?¿ê?¿ªA¿¨A¿ÂC¿ÆC¿ÂE¿¾E¿G¿G¿ðG¿ðG¿‚H¿‚H¿6H¿8H¿ˆF¿†F¿‚B¿„B¿°<¿²<¿Þ6¿Ü6¿¨2¿ª2¿ 0¿ 0¿Î/¿Ì/¿Ò/¿Ô/¿`0¿^0¿¾1¿À1¿þ3¿4¿r6¿p6¿R8¿P8¿\9¿Z9¿î9¿ò9¿j:¿h:¿4;¿8;¿ˆ<¿‚<¿>¿>¿¼?¿¾?¿"A¿ A¿hB¿jB¿¨C¿¨C¿ŒD¿ŒD¿ÚD¿ØD¿D¿D¿dC¿`C¿ŠB¿ŒB¿BA¿FA¿A¿A¿†A¿ˆA¿œA¿œA¿D@¿D@¿x<¿z<¿7¿ 7¿”1¿’1¿¬-¿®-¿¼+¿º+¿è*¿ì*¿î*¿ì*¿†+¿†+¿ -¿ -¿x/¿z/¿2¿2¿44¿44¿€5¿~5¿h6¿l6¿V7¿T7¿†8¿†8¿2:¿.:¿<¿<¿þ=¿ü=¿ ?¿¢?¿Î@¿Î@¿°A¿®A¿B¿’B¿ÌC¿ÌC¿¤E¿¤E¿äG¿ÞG¿øI¿úI¿\K¿`K¿8L¿6L¿ÄL¿ÀL¿zL¿|L¿ÌJ¿ÌJ¿ÂF¿ÄF¿è@¿è@¿ú:¿ú:¿Â6¿Â6¿°4¿°4¿â3¿Þ3¿ò3¿ò3¿Ž4¿’4¿6¿6¿†8¿„8¿ ;¿ ;¿$=¿&=¿F>¿D>¿ê>¿è>¿|?¿€?¿n@¿l@¿ôA¿øA¿ÐC¿ÎC¿ªE¿ªE¿LG¿LG¿xH¿xH¿^I¿`I¿NJ¿LJ¿|K¿|K¿VM¿XM¿ŠO¿ŠO¿šQ¿šQ¿üR¿øR¿ÖS¿ÚS¿\T¿ZT¿öS¿öS¿(R¿*R¿þM¿üM¿H¿H¿üA¿B¿¬=¿¬=¿ˆ;¿ˆ;¿˜:¿˜:¿š:¿ž:¿D;¿B;¿ò<¿ö<¿°?¿®?¿žB¿žB¿àD¿àD¿VF¿TF¿VG¿XG¿(H¿(H¿îH¿êH¿BH¿FH¿ðF¿ìF¿žE¿ E¿E¿E¿hE¿jE¿VF¿TF¿šG¿˜G¿I¿I¿àJ¿ÞJ¿M¿ M¿6O¿4O¿–P¿”P¿fQ¿jQ¿äQ¿âQ¿ŒQ¿ŒQ¿¾O¿ÂO¿ŒK¿†K¿tE¿vE¿R?¿P?¿ì:¿ð:¿Â8¿Ä8¿à7¿à7¿è7¿ä7¿„8¿„8¿:¿ :¿Ž<¿Ž<¿>?¿¿„>¿˜=¿œ=¿>¿>¿A¿A¿D¿D¿4F¿8F¿HG¿HG¿ÚG¿ÖG¿jH¿hH¿VI¿ZI¿äJ¿ÞJ¿ºL¿ºL¿œN¿œN¿:P¿]¿>]¿|^¿z^¿p_¿r_¿ `¿ `¿T`¿X`¿¾`¿º`¿ð`¿ô`¿Ž`¿Œ`¿À`¿¼`¿6a¿6a¿a¿a¿_¿_¿JZ¿JZ¿fS¿dS¿vL¿zL¿ˆG¿„G¿$E¿*E¿8D¿4D¿XD¿XD¿E¿E¿ÆF¿ÆF¿|I¿zI¿fL¿fL¿¶N¿´N¿ P¿ P¿êP¿èP¿ÂQ¿ÆQ¿ôR¿ðR¿¶T¿¶T¿ÈV¿ÈV¿àX¿äX¿°Z¿¬Z¿ü[¿þ[¿ ]¿ ]¿^¿^¿h_¿f_¿Za¿Za¿¨c¿¨c¿Îe¿Îe¿2g¿0g¿h¿h¿¶h¿´h¿Lh¿Rh¿,f¿,f¿&a¿"a¿äY¿æY¿–R¿”R¿dM¿dM¿äJ¿æJ¿êI¿èI¿þI¿þI¿¸J¿ºJ¿vL¿tL¿HO¿HO¿HR¿FR¿šT¿žT¿ÖU¿ØU¿~V¿|V¿W¿W¿"X¿X¿ÜY¿ÞY¿ü[¿\¿*^¿(^¿`¿`¿Za¿Za¿^b¿`b¿fc¿hc¿¸d¿¸d¿²f¿¬f¿ i¿i¿@k¿@k¿¤l¿¢l¿~m¿€m¿úm¿þm¿jm¿jm¿"k¿ k¿ôe¿ôe¿Ž^¿Œ^¿"W¿"W¿ÖQ¿ØQ¿PO¿NO¿VN¿VN¿xN¿zN¿BO¿@O¿úP¿úP¿ÖS¿ÖS¿ÞV¿àV¿FY¿FY¿ÔZ¿ÒZ¿ö[¿ø[¿ò\¿ð\¿ò]¿ö]¿@^¿>^¿*^¿.^¿$^¿ ^¿r^¿v^¿8_¿4_¿B`¿@`¿€a¿†a¿üb¿üb¿öd¿öd¿Xg¿Xg¿Ši¿Ši¿ðj¿ðj¿Äk¿Äk¿c¿@c¿Øc¿Öc¿Zd¿Zd¿he¿he¿Tg¿Xg¿ºi¿¸i¿&l¿&l¿*n¿,n¿o¿Œo¿˜p¿˜p¿¤q¿¦q¿s¿ s¿*u¿*u¿¸w¿¶w¿z¿z¿v{¿v{¿H|¿F|¿®|¿²|¿ð{¿ò{¿@y¿@y¿6s¿2s¿¤j¿¤j¿b¿b¿Ø[¿Ú[¿ÎX¿ÎX¿’W¿”W¿¨W¿¤W¿vX¿xX¿vZ¿tZ¿¶]¿¸]¿0a¿0a¿Úc¿Øc¿De¿De¿ f¿ f¿®f¿°f¿°g¿°g¿ðh¿ìh¿Lj¿Nj¿Àk¿Âk¿$m¿"m¿nn¿ln¿¬o¿¬o¿q¿q¿ˆr¿Šr¿žt¿žt¿ w¿ w¿:y¿x¿>x¿´z¿´z¿ò|¿ò|¿H~¿J~¿¿¿z¿t¿¦~¿ª~¿Ò{¿Ð{¿Œu¿Œu¿¨l¿¨l¿²c¿´c¿:]¿:]¿ðY¿ðY¿tX¿xX¿FX¿DX¿äX¿äX¿ÌZ¿ÊZ¿þ]¿^¿~a¿~a¿d¿d¿be¿be¿þe¿üe¿~f¿~f¿”g¿’g¿zi¿~i¿âk¿Þk¿Hn¿Ln¿Tp¿Rp¿´q¿´q¿°r¿°r¿²s¿°s¿u¿u¿Fw¿Dw¿òy¿òy¿d|¿b|¿Ø}¿Ø}¿€~¿„~¿®~¿¬~¿ª}¿ª}¿Âz¿Àz¿˜t¿št¿ôk¿ôk¿Lc¿Lc¿ ]¿ ]¿ðY¿îY¿˜X¿šX¿†X¿†X¿FY¿DY¿:[¿8[¿~^¿|^¿úa¿þa¿®d¿®d¿f¿f¿Úf¿Þf¿|g¿~g¿¢h¿¢h¿ˆj¿ˆj¿Ül¿Ül¿~¿H{¿H{¿u¿u¿Ll¿Hl¿†c¿ˆc¿6]¿8]¿Z¿Z¿šX¿šX¿|X¿|X¿2Y¿2Y¿2[¿2[¿Œ^¿^¿*b¿*b¿êd¿æd¿Ff¿Ff¿ôf¿ôf¿ˆg¿„g¿¢h¿¤h¿–j¿–j¿m¿m¿po¿po¿‚q¿€q¿êr¿ìr¿ôs¿ôs¿üt¿þt¿fv¿fv¿žx¿šx¿N{¿P{¿À}¿Â}¿.¿,¿Ú¿Ú¿ø¿ö¿ä~¿æ~¿à{¿à{¿‚u¿‚u¿˜l¿˜l¿ c¿žc¿"]¿(]¿ÔY¿ÐY¿HX¿LX¿X¿X¿ÂX¿ÂX¿ÆZ¿ÈZ¿0^¿0^¿Þa¿àa¿šd¿˜d¿ðe¿îe¿xf¿zf¿ôf¿öf¿üg¿þg¿üi¿þi¿†l¿€l¿o¿o¿4q¿2q¿Šr¿Œr¿|s¿zs¿bt¿bt¿°u¿°u¿âw¿âw¿˜z¿œz¿}¿}¿Ž~¿Ž~¿.¿2¿L¿H¿~¿~¿úz¿øz¿|t¿~t¿vk¿xk¿nb¿pb¿è[¿ä[¿tX¿tX¿ÎV¿ÎV¿tV¿vV¿W¿W¿*Y¿,Y¿Ò\¿Ð\¿¶`¿¶`¿žc¿ c¿ød¿öd¿xe¿te¿Òe¿Òe¿Êf¿Ìf¿i¿i¿l¿l¿o¿o¿„q¿†q¿s¿s¿t¿t¿ìt¿ðt¿Fv¿Hv¿|x¿|x¿>{¿<{¿´}¿¸}¿.¿,¿Ú¿Ú¿ö¿ô¿Ú~¿Ü~¿Ä{¿Ä{¿Nu¿Pu¿Dl¿Fl¿2c¿.c¿¢\¿¦\¿FY¿FY¿ºW¿¸W¿ŠW¿ˆW¿4X¿4X¿FZ¿DZ¿¼]¿º]¿pa¿ta¿2d¿0d¿xe¿xe¿øe¿øe¿bf¿df¿jg¿lg¿pi¿ji¿úk¿þk¿’n¿’n¿¬p¿ªp¿r¿r¿ðr¿ðr¿Òs¿Ôs¿ u¿ u¿Vw¿Tw¿ z¿z¿~|¿z|¿æ}¿æ}¿€~¿€~¿’~¿–~¿p}¿p}¿Lz¿Lz¿ºs¿ºs¿Žj¿Žj¿Na¿Na¿–Z¿”Z¿W¿W¿~U¿~U¿JU¿JU¿üU¿þU¿X¿ X¿ˆ[¿ˆ[¿:_¿<_¿b¿b¿\c¿^c¿d¿þc¿†d¿ˆd¿ªe¿¨e¿¤g¿¦g¿(j¿&j¿¦l¿ªl¿Æn¿Än¿4p¿4p¿>q¿>q¿Jr¿Lr¿´s¿¶s¿òu¿ðu¿®x¿®x¿"{¿${¿|¿Ž|¿<}¿:}¿`}¿d}¿D|¿@|¿y¿y¿nr¿nr¿ i¿ i¿º_¿¸_¿6Y¿4Y¿V¿V¿dU¿bU¿V¿V¿bW¿bW¿ˆY¿ŠY¿à\¿Ü\¿T`¿V`¿c¿c¿^d¿\d¿e¿e¿–e¿˜e¿²f¿¬f¿¢h¿¦h¿k¿k¿†m¿†m¿šo¿œo¿ q¿ q¿r¿r¿*s¿(s¿Št¿Œt¿¦v¿¤v¿4y¿6y¿ˆ{¿„{¿è|¿è|¿¤}¿¤}¿ü}¿þ}¿}¿}¿ìy¿èy¿(s¿&s¿¤i¿¦i¿"`¿ `¿JY¿PY¿òU¿îU¿ŽT¿ŒT¿ŒT¿ŽT¿RU¿PU¿JW¿LW¿œZ¿œZ¿*^¿*^¿è`¿ê`¿Hb¿Fb¿öb¿öb¿†c¿†c¿¦d¿¢d¿–f¿šf¿i¿i¿€k¿~k¿Žm¿Žm¿o¿o¿p¿p¿&q¿$q¿Šr¿Žr¿¸t¿¶t¿Vw¿Tw¿®y¿²y¿{¿ {¿º{¿º{¿î{¿ò{¿âz¿Þz¿ºw¿¼w¿úp¿üp¿|g¿zg¿ú]¿ø]¿ W¿W¿¼S¿ºS¿VR¿XR¿XR¿VR¿S¿S¿U¿U¿lX¿jX¿ú[¿ü[¿¨^¿ª^¿`¿`¿´`¿¶`¿Va¿Ta¿vb¿xb¿jd¿hd¿Êf¿Îf¿8i¿6i¿Jk¿Jk¿²l¿´l¿Âm¿Âm¿ân¿ân¿†p¿„p¿Js¿Ns¿|v¿|v¿”y¿”y¿ {¿ž{¿š|¿š|¿ê|¿ì|¿Ô{¿Ô{¿¬x¿ªx¿òq¿ôq¿zh¿zh¿ø^¿ú^¿(X¿(X¿ÌT¿ÎT¿nS¿lS¿rS¿rS¿8T¿4T¿V¿”Y¿–Y¿2]¿4]¿î_¿ð_¿Na¿La¿úa¿øa¿‚b¿€b¿˜c¿šc¿ˆe¿ˆe¿îg¿ðg¿jj¿dj¿zl¿zl¿ìm¿ìm¿o¿o¿p¿p¿xq¿xq¿šs¿˜s¿$v¿$v¿vx¿xx¿Îy¿Ðy¿|z¿|z¿ºz¿¸z¿¤y¿¤y¿pv¿rv¿šo¿˜o¿f¿f¿p\¿j\¿†U¿ŠU¿R¿R¿¬P¿¨P¿œP¿œP¿PQ¿TQ¿FS¿DS¿ŠV¿V¿Z¿Z¿È\¿È\¿^¿^¿²^¿²^¿4_¿6_¿@`¿@`¿$b¿ b¿‚d¿†d¿ôf¿ðf¿üh¿þh¿bj¿bj¿bk¿dk¿bl¿`l¿´m¿²m¿Îo¿Ðo¿br¿br¿´t¿´t¿ v¿ v¿¨v¿¦v¿Ìv¿Ìv¿¦u¿¤u¿br¿hr¿€k¿~k¿Öa¿Ôa¿(X¿(X¿2Q¿4Q¿ÌM¿ÊM¿hL¿hL¿lL¿nL¿6M¿4M¿0O¿.O¿xR¿vR¿üU¿V¿°X¿®X¿úY¿üY¿˜Z¿–Z¿"[¿"[¿b\¿`\¿t_¿v_¿‚c¿€c¿ˆg¿ˆg¿²j¿®j¿zl¿~l¿zm¿xm¿Jn¿Jn¿Œo¿Žo¿¸q¿¶q¿^t¿^t¿Àv¿Äv¿"x¿x¿Èx¿Êx¿òx¿öx¿Èw¿Êw¿Št¿„t¿¸m¿¶m¿.d¿0d¿ Z¿¢Z¿¾S¿¾S¿BP¿@P¿¸N¿¸N¿”N¿”N¿FO¿JO¿DQ¿DQ¿¬T¿ªT¿LX¿NX¿[¿[¿L\¿L\¿Ì\¿Ì\¿,]¿0]¿*^¿(^¿`¿`¿„b¿„b¿þd¿üd¿g¿g¿Th¿Xh¿¿,>¿@¿@¿XC¿RC¿ÒF¿ØF¿vI¿rI¿²J¿²J¿B¿C¿>C¿æC¿âC¿tD¿vD¿ŒE¿ˆE¿zG¿zG¿ØI¿ÚI¿@L¿@L¿FN¿HN¿°O¿°O¿ÊP¿ÈP¿ÜQ¿ÜQ¿@S¿@S¿^U¿`U¿îW¿êW¿6Z¿4Z¿Š[¿Œ[¿B\¿@\¿€\¿„\¿Š[¿Š[¿dX¿fX¿bQ¿bQ¿rG¿rG¿´=¿´=¿<7¿87¿„4¿Š4¿&5¿&5¿j7¿h7¿²9¿´9¿B<¿B<¿’?¿’?¿èB¿æB¿pE¿pE¿¸F¿¸F¿HG¿FG¿¨G¿¬G¿¤H¿ H¿‚J¿‚J¿èL¿æL¿LO¿NO¿NQ¿NQ¿ŽR¿ŒR¿pS¿rS¿PT¿PT¿U¿’U¿®W¿¬W¿XZ¿XZ¿¸\¿º\¿ ^¿ ^¿^¿Ž^¿Œ^¿^¿0]¿.]¿ÈY¿ÆY¿ÔR¿ÔR¿2I¿2I¿?¿?¿8¿’8¿ô4¿ò4¿D3¿H3¿þ2¿ø2¿Š3¿Œ3¿~5¿~5¿Ú8¿Ü8¿|<¿z<¿2?¿4?¿Œ@¿Œ@¿*A¿(A¿žA¿žA¿ B¿ B¿|D¿zD¿ÌF¿ÌF¿(I¿,I¿"K¿"K¿zL¿xL¿lM¿jM¿XN¿XN¿žO¿žO¿²Q¿´Q¿PT¿NT¿¨V¿¦V¿úW¿üW¿ŒX¿ŠX¿šX¿œX¿^W¿^W¿T¿T¿M¿M¿rC¿pC¿È9¿È9¿Ú2¿Þ2¿`/¿`/¿Þ-¿Ü-¿¼-¿¾-¿h.¿d.¿V0¿V0¿ž3¿¢3¿27¿.7¿Ú9¿Þ9¿;¿;¿ ;¿ž;¿<¿<¿=¿=¿?¿ü>¿bA¿dA¿ÎC¿ÎC¿ØE¿ØE¿ G¿ G¿ÈG¿ÆG¿ºH¿¸H¿œJ¿žJ¿^N¿`N¿´R¿´R¿úV¿øV¿þY¿üY¿"[¿"[¿ [¿$[¿ˆY¿ˆY¿V¿V¿¿>¿’>¿Œ>¿ò>¿ô>¿à?¿à?¿ÀA¿ÂA¿D¿D¿€F¿~F¿xH¿vH¿¶I¿¶I¿ŒJ¿ŽJ¿dK¿fK¿¤L¿¢L¿ÄN¿ÄN¿jQ¿jQ¿ÐS¿ÐS¿U¿ U¿œU¿œU¿ŒU¿ˆU¿ T¿"T¿®P¿²P¿ÂI¿ÂI¿"@¿ @¿€6¿~6¿„/¿†/¿è+¿æ+¿8*¿:*¿ð)¿ò)¿„*¿€*¿h,¿j,¿¶/¿´/¿F3¿F3¿æ5¿è5¿7¿7¿j7¿j7¿¬7¿¨7¿‚8¿‚8¿N:¿N:¿š<¿š<¿ú>¿ú>¿ê@¿ê@¿$B¿&B¿C¿C¿ÚC¿ÖC¿E¿E¿G¿G¿~I¿€I¿¸K¿¸K¿ìL¿êL¿\M¿\M¿BM¿FM¿êK¿èK¿~H¿zH¿”A¿”A¿8¿8¿h.¿h.¿z'¿z'¿Ð#¿Ð#¿"¿"¿ª!¿ª!¿<"¿:"¿N$¿N$¿â'¿â'¿À+¿Â+¿œ.¿š.¿¬/¿¨/¿Ì/¿Ì/¿Þ/¿â/¿î0¿ì0¿ø4¿ø4¿†:¿„:¿@¿@¿¿*>¿ú>¿ø>¿È?¿Ì?¿ò@¿ô@¿èB¿èB¿ZE¿VE¿zG¿~G¿¢H¿ H¿I¿I¿ìH¿îH¿ˆG¿ˆG¿D¿D¿=¿ =¿N3¿R3¿‚)¿‚)¿d"¿^"¿¤¿¨¿è¿è¿ ¿ ¿6¿4¿4¿8¿¦"¿¤"¿T&¿V&¿ )¿)¿H*¿D*¿¸*¿¼*¿&+¿(+¿(,¿(,¿.¿.¿Š0¿Œ0¿3¿ 3¿5¿5¿~6¿~6¿z7¿|7¿x8¿v8¿Ð9¿Î9¿ø;¿ü;¿¦>¿ >¿A¿A¿`B¿`B¿æB¿ìB¿êB¿ìB¿²A¿¬A¿n>¿n>¿~7¿‚7¿Ê-¿Ä-¿P$¿T$¿¿¿†¿Š¿l¿j¿ø¿ø¿p!¿n!¿$¿$¿J'¿H'¿€*¿„*¿þ,¿ü,¿F.¿H.¿Ô.¿Ò.¿6/¿6/¿ 0¿&0¿ò1¿î1¿24¿04¿~6¿~6¿t8¿t8¿Î9¿Ì9¿Ê:¿Î:¿Ê;¿Ì;¿=¿=¿?¿?¿fA¿fA¿zC¿zC¿®D¿¬D¿FE¿JE¿zE¿xE¿LD¿JD¿ì@¿î@¿Ò9¿Ð9¿Þ/¿à/¿ô%¿ð%¿È¿Ì¿8¿:¿´¿´¿ž¿œ¿J¿L¿8¿:¿†¿€¿#¿#¿¸%¿¶%¿ö&¿ø&¿|'¿z'¿à'¿à'¿Ö(¿Ò(¿¨*¿®*¿-¿-¿p/¿l/¿h1¿l1¿¼2¿º2¿²3¿®3¿š4¿ 4¿æ5¿ä5¿î7¿î7¿h:¿f:¿ž<¿¢<¿Ü=¿Ø=¿^>¿^>¿j>¿n>¿.=¿,=¿Þ9¿Ü9¿î2¿î2¿>)¿:)¿‚¿‚¿„¿‚¿ú¿¿x¿x¿d¿`¿¿¿¿¿\¿\¿è¿è¿ˆ¿ˆ¿¼ ¿¼ ¿*!¿*!¿’!¿’!¿"¿"¿v$¿t$¿Ø&¿Ö&¿F)¿F)¿P+¿N+¿x,¿z,¿$-¿"-¿.¿.¿ú/¿ü/¿Þ3¿Ú3¿N8¿R8¿²<¿°<¿è?¿ê?¿8A¿6A¿`A¿`A¿î?¿ð?¿v<¿v<¿Œ5¿Ž5¿à+¿â+¿."¿,"¿8¿8¿È¿Ê¿`¿b¿Z¿X¿¿¿¿¿l¿p¿þ¿ ¿®"¿®"¿ò#¿ð#¿z$¿z$¿Þ$¿Ú$¿È%¿Ê%¿œ'¿œ'¿ê)¿ì)¿J,¿J,¿B.¿@.¿/¿/¿€0¿€0¿n1¿n1¿¦2¿¤2¿ 4¿¢4¿7¿ 7¿49¿29¿b:¿b:¿è:¿ê:¿ö:¿ö:¿¬9¿ª9¿>6¿>6¿./¿./¿f%¿f%¿–¿˜¿„¿„¿ð¿î¿X¿X¿&¿*¿À¿¾¿š¿˜¿Ø¿Ú¿T¿V¿è¿è¿¿¿d¿h¿ª¿ª¿|¿z¿8¿<¿|!¿|!¿Ð#¿Ð#¿¶%¿´%¿è&¿ê&¿¼'¿¼'¿ˆ(¿Š(¿°)¿°)¿¤+¿¢+¿.¿.¿P0¿N0¿€1¿€1¿è1¿è1¿Ð1¿Î1¿t0¿t0¿þ,¿ü,¿ò%¿ò%¿$¿"¿X¿Z¿R ¿T ¿Ð¿Î¿\¿^¿R¿N¿¿¿ì¿ê¿ ¿ ¿¿Ž¿0¿2¿R¿R¿¬¿¬¿¿ ¿Z¿Z¿ž¿ž¿j¿j¿0%¿.%¿|)¿z)¿”+¿–+¿h,¿h,¿Þ,¿Ü,¿Ö-¿Ú-¿ì/¿ê/¿t2¿t2¿¾4¿º4¿ú5¿þ5¿~6¿|6¿r6¿t6¿5¿ 5¿˜1¿˜1¿¢*¿¢*¿ú ¿þ ¿P¿J¿L¿N¿ª ¿ª ¿ ¿þ ¿º ¿º ¿L ¿R ¿8 ¿8 ¿¿Œ¿¿¿À¿Â¿Ü¿Ü¿.¿0¿\¿Z¿$¿"¿â¿à¿.¿.¿†¿‚¿b!¿f!¿ˆ"¿†"¿:#¿8#¿è#¿î#¿%¿%¿þ&¿'¿„)¿‚)¿È+¿È+¿ö,¿ô,¿H-¿H-¿ -¿ -¿z+¿|+¿â'¿â'¿Ê ¿È ¿¿¿H ¿J ¿:¿<¿’¿Œ¿Ú¿Ü¿€¿„¿¿ ¿ô¿ô¿P¿R¿ú ¿ú ¿º ¿¶ ¿þ ¿¿|¿z¿à¿ä¿Ü¿Þ¿Ì¿Ê¿D¿D¿Ê¿È¿â¿æ¿B¿>¿.¿.¿¿¿b¿d¿Š¿ˆ¿B"¿B"¿´$¿´$¿&¿&¿¢&¿¢&¿š&¿š&¿R%¿P%¿"¿"¿þ¿þ¿2¿2¿°¿°¿z¿v¿ôý¾þ¾¿øÿ¾´¿´¿P¿R¿¿¿h ¿d ¿²¿´¿6¿6¿p¿r¿Ø¿Ú¿¿¿ø¿ø¿Ô¿Ð¿4¿6¿¤¿¦¿¢¿ ¿Þ¿Ü¿ž¿ ¿h¿f¿˜ ¿˜ ¿´"¿´"¿`%¿^%¿¼'¿À'¿)¿)¿d)¿f)¿()¿&)¿”'¿”'¿$¿$¿¿¿|¿|¿ä ¿ä ¿ä¿ä¿Tþ¾\þ¾Àú¾Àú¾ú¾øù¾û¾û¾ÿ¾ÿ¾þ¿ú¿¶¿¸¿v ¿p ¿¢ ¿¢ ¿ ¿ ¿P ¿L ¿, ¿0 ¿¿¿~¿~¿ú¿ú¿ø¿ú¿8¿:¿ ¿ ¿â¿â¿¿¿0¿2¿Ô¿Ò¿$ ¿( ¿l!¿j!¿à!¿Ü!¿¾!¿À!¿` ¿^ ¿ð¿ò¿¿¿l ¿n ¿Ð¿Î¿¸÷¾´÷¾ ð¾¤ð¾tí¾tí¾í¾í¾dî¾\î¾Lò¾Pò¾ù¾ ù¾&¿ ¿Ò¿Ö¿ü¿ü¿^¿\¿®¿°¿¤¿ ¿Ž¿¿ ¿ ¿’ ¿’ ¿ª¿¦¿¾¿À¿B¿F¿ ¿¿ê¿ê¿ö¿ò¿¨¿®¿P ¿N ¿¦#¿¤#¿æ$¿è$¿ä$¿à$¿0#¿2#¿ž¿œ¿À¿Ä¿6¿8¿ª¿¦¿ý¾Œý¾œö¾ ö¾¨ó¾¨ó¾xó¾|ó¾äô¾àô¾äø¾äø¾¤ÿ¾°ÿ¾x¿t¿$¿(¿b¿\¿Ô¿Ö¿¿¿þ¿ü¿Ö ¿Ö ¿2 ¿0 ¿š¿œ¿”¿’¿Ò¿Ô¿¨¿¦¿x¿z¿®¿®¿¶¿¸¿H¿F¿Œ¿Ž¿Ê¿È¿8¿6¿¿¿ª¿¨¿&¿*¿"¿¿h¿l¿\ý¾Tý¾Dï¾Dï¾è¾è¾Ðä¾Ôä¾hä¾d侘徔å¾\é¾`é¾Ôï¾Øï¾Ìö¾Èö¾Øû¾Øû¾þ¾þ¾¸þ¾´þ¾0ÿ¾0ÿ¾v¿v¿B¿B¿Œ¿Š¿è¿ê¿Ê¿Ê¿ø ¿ø ¿À ¿¾ ¿„ ¿„ ¿¤ ¿¢ ¿œ¿œ¿¿¿:¿6¿X¿Z¿À¿À¿¤¿¦¿L¿H¿Ü¿Ü¿Ð¿Ò¿þ¾üý¾\ê¾dê¾4ܾ4ܾ Õ¾ Õ¾Ò¾øÑ¾ÄѾÀѾ4Ó¾8Ó¾@×¾D×¾$Þ¾(Þ¾€å¾|å¾üê¾øê¾í¾í¾Tí¾Pí¾Œí¾Œí¾èï¾äï¾tø¾tø¾¿¿ö¿ö¿X ¿X ¿†¿†¿l¿l¿ò¿ð¿ô¿ô¿ü¿þ¿x¿x¿ª¿¬¿è¿æ¿l¿j¿v¿x¿"¿ ¿´¿´¿  ¿¤ ¿Î¿Ì¿ôó¾ðó¾Ìå¾Ôå¾ÈÞ¾ÄÞ¾èÛ¾èÛ¾ÌÛ¾ÐÛ¾ ݾݾÐà¾Ìà¾ç¾ç¾Øí¾Ðí¾àò¾äò¾4õ¾,õ¾ö¾ö¾°ö¾°ö¾pø¾lø¾Øû¾Øû¾¿¿^¿`¿8¿2¿f¿h¿2¿0¿ú¿þ¿¿¿ú ¿ü ¿` ¿b ¿~¿|¿š¿œ¿ü¿ü¿à¿Ü¿d¿d¿Ò ¿Ö ¿¦¿¤¿|ó¾€ó¾Äß¾Àß¾€Ñ¾|ѾHʾLʾ(Ǿ(Ç¾ØÆ¾ÔƾȾȾè˾ì˾|Ò¾xÒ¾|Ù¾xÙ¾ÐÞ¾ÐÞ¾\á¾\á¾”â¾â¾¨ã¾ ã¾Ôå¾Øå¾°é¾°é¾€î¾€î¾Xó¾Tó¾d÷¾h÷¾ ú¾ú¾$ü¾(ü¾0þ¾,þ¾r¿p¿Ž¿¿*¿,¿|¿~¿Î¿Ê¿X ¿X ¿h ¿j ¿8¿4¿ô¿ø¿Ðû¾Ìû¾ìç¾ð群Ծ¨Ô¾$Ⱦ ȾTþXþ¸Å¾°Å¾|˾€Ë¾ìоìо4Ö¾0Ö¾´Ü¾´Ü¾ã¾øâ¾Øç¾àç¾Tê¾Tê¾Të¾Pë¾øë¾ì¾àí¾Øí¾€ñ¾„ñ¾8ö¾0ö¾û¾û¾èþ¾ðþ¾´¿°¿€¿‚¿T¿R¿†¿ˆ¿ ¿ ¿J¿L¿¤ ¿  ¿ê ¿ê ¿B ¿B ¿ ¿þ ¿d ¿h ¿Î¿Î¿|ÿ¾„ÿ¾ì¾ì¾ÈØ¾ÐØ¾ÐʾÌʾ°Ã¾´Ã¾ À¾œÀ¾PÀ¾TÀ¾ŒÁ¾ˆÁ¾LžHžÄ˾Ä˾¼Ò¾ÀҾؾؾ”Ú¾Ú¾ÈÛ¾ÄÛ¾´Ü¾´Ü¾¨Þ¾¤Þ¾Xâ¾`â¾ ç¾ç¾Ðë¾Ìë¾Àï¾Äï¾Hò¾Lò¾ ô¾ô¾Àõ¾Àõ¾8ø¾8ø¾hü¾dü¾Ì¿Î¿&¿&¿l¿j¿Ú¿Ü¿¶¿´¿F¿F¿˜ÿ¾”ÿ¾¨ñ¾¤ñ¾hÞ¾hÞ¾,˾4˾l½¾d½¾|¶¾€¶¾¨³¾¤³¾€³¾„³¾ô´¾ð´¾´¸¾¸¸¾4¿¾0¿¾(ƾ,ƾd˾h˾ä;Ü;ðξôξðϾøÏ¾üѾôѾ¬Õ¾°Õ¾`Ú¾\ھ߾߾ã¾ã¾på¾på¾Ôæ¾Ô澰辬辜쾠쾰ô¾´ô¾þ¾üý¾ˆ¿ˆ¿Æ¿È¿ê¿è¿¸¿º¿è¿æ¿>¿>¿Äö¾Àö¾Èã¾Ìã¾àоØÐ¾4þ8þp¼¾p¼¾˜¹¾”¹¾|¹¾„¹¾üº¾üº¾ð¾¾ð¾¾ŒÅ¾ŒÅ¾ Ì¾œÌ¾ôѾôѾtÔ¾tÔ¾tÕ¾xÕ¾<Ö¾8Ö¾ؾؾÔÛ¾ÔÛ¾Œà¾à¾lå¾hå¾Pé¾Lé¾Àë¾¼ë¾Lí¾Pí¾äî¾äî¾Hñ¾@ñ¾xõ¾|õ¾Àú¾Àú¾xÿ¾|ÿ¾¿¿^¿\¿(¿&¿,ÿ¾,ÿ¾ ø¾ø¾ê¾ ê¾¼Ö¾¸Ö¾`þdþpµ¾hµ¾X®¾X®¾@«¾D«¾üª¾ôª¾,¬¾8¬¾ì¯¾ä¯¾H¶¾L¶¾ ½¾$½¾<¾4¾xľ€Ä¾PžLžìžðž¤Ç¾ Ç¾ ˾(˾¤Ï¾¤Ï¾HÔ¾DÔ¾ ؾ ؾ|Ú¾€Ú¾ܾܾ´Ý¾´Ý¾ ྠà¾ä¾ä¾é¾$é¾¨í¾ í¾ð¾ð¾”ð¾”ð¾ð¾ð¾Ôì¾Øì¾°å¾°å¾Ô×¾Ð×¾°Ä¾°Ä¾”±¾œ±¾Ü£¾Ø£¾¨œ¾¤œ¾`™¾`™¾Ð˜¾Ì˜¾š¾š¾ž¾ž¾0¥¾,¥¾Ì¬¾Ð¬¾x²¾t²¾Œ´¾´¾à´¾Ü´¾µ¾ µ¾`·¾`·¾Ü¿¾Ü¿¾h˾d˾׾׾”߾߾ ã¾ ã¾ å¾徨å¾Üå¾Ìç¾Èç¾ì¾ì¾hñ¾lñ¾,ö¾,ö¾Øø¾Üø¾¸ù¾´ù¾lù¾hù¾\ö¾dö¾Lï¾Lï¾Há¾Há¾ì;ð;œº¾˜º¾¨¬¾ ¬¾œ¥¾¤¥¾ ¢¾œ¢¾d¢¾d¢¾°£¾¬£¾x§¾t§¾ô­¾ô­¾Ü´¾à´¾ü¹¾ø¹¾@¼¾@¼¾ø¼¾½¾€½¾|½¾0¿¾0¿¾¨Â¾¬Â¾8Ǿ4ǾÐ˾Ì˾„ϾˆÏ¾àѾØÑ¾hÓ¾hÓ¾èÔ¾äÔ¾,×¾0×¾HÛ¾HÛ¾dà¾\à¾Üä¾ää¾,ç¾(羬羨ç¾ðæ¾ð澜㾜ã¾`ܾdܾPξPξ຾ܺ¾|§¾x§¾d™¾h™¾’¾’¾ÜŽ¾àŽ¾|޾x޾à¾ä¾Ü“¾Ô“¾”š¾œš¾Ð¡¾Ð¡¾0§¾0§¾¬©¾¬©¾¼ª¾Àª¾¬«¾¨«¾Ì­¾Ä­¾¸±¾¼±¾°¶¾°¶¾À»¾À»¾Ü¿¾à¿¾”¾”¾tľpľLƾTƾðȾðȾT;P;¸Ò¾´Ò¾×¾×¾DÚ¾@Ú¾<Û¾<Û¾Û¾Û¾XؾXؾ¬Ñ¾¬Ñ¾¬Ã¾°Ã¾(°¾(°¾8¾4¾ä¾Ü¾Œ¾ Œ¾޾޾|“¾|“¾”˜¾˜˜¾°¾´¾ü£¾ü£¾<ª¾<ª¾¯¾¯¾ ±¾˜±¾Ì²¾Ô²¾¬³¾°³¾¨µ¾¤µ¾H¹¾H¹¾à½¾Ü½¾x¾|¾hƾhƾðȾðȾÌʾÐʾ Ì¾˜Ì¾ ϾϾ<Ó¾@Ó¾PؾXؾàܾÔܾHß¾Tß¾0à¾,à¾üß¾üß¾ݾݾ־øÕ¾°Ç¾°Ç¾ô³¾ô³¾D ¾H ¾ ’¾$’¾P‹¾H‹¾˜ˆ¾ ˆ¾Äˆ¾¸ˆ¾PоPо ޾ ޾˜”¾˜”¾ˆ›¾Œ›¾À ¾À ¾L£¾P£¾p¤¾d¤¾L¥¾T¥¾P§¾H§¾ «¾«¾Ì¯¾Ô¯¾œ´¾”´¾¸¾”¸¾0»¾0»¾ü¼¾ø¼¾Ä¾¾Ä¾¾TÁ¾XÁ¾„ž|ž¨Ê¾¬Ê¾XϾTϾÜѾØÑ¾¼Ò¾ÄÒ¾ˆÒ¾ˆÒ¾ÔϾÐϾôȾôȾüº¾øº¾§¾§¾0”¾0”¾L†¾T†¾¾¾¸y¾°y¾z¾z¾@}¾@}¾„‚¾„‚¾‰¾üˆ¾Ü¾Ü¾ü”¾•¾€—¾€—¾”˜¾”˜¾¨™¾¨™¾È›¾Ä›¾˜Ÿ¾˜Ÿ¾\¤¾\¤¾4©¾4©¾,­¾,­¾ˆ¯¾„¯¾Ô°¾Ü°¾¬²¾ ²¾t¶¾t¶¾¾¾,¾¾ ǾǾÐϾÌϾøÕ¾üÕ¾4ؾ4ؾؾؾ´Ô¾°Ô¾€Í¾€Í¾¿¾œ¿¾D¬¾@¬¾ø˜¾™¾D‹¾<‹¾¤„¾¤„¾4‚¾<‚¾˜‚¾”‚¾X„¾X„¾Hˆ¾Hˆ¾ÔŽ¾ÌŽ¾À•¾Ä•¾üš¾›¾”¾Œ¾´ž¾°ž¾Ÿ¾Ÿ¾|¡¾€¡¾(¥¾,¥¾Ø©¾Ø©¾„®¾ˆ®¾x²¾x²¾ µ¾µ¾à¶¾à¶¾¨¸¾¨¸¾,»¾(»¾P¿¾L¿¾hľtľüȾôȾ|˾€Ë¾d̾\̾(̾0̾LɾLɾD¾H¾´¾´¾| ¾€ ¾øŒ¾ìŒ¾Ø}¾ð}¾8p¾0p¾Ðj¾Ðj¾èj¾àj¾Ðm¾Èm¾(u¾0u¾à€¾è€¾œ‡¾œ‡¾´Œ¾°Œ¾ ¾¾ ¾ ¾È¾Ì¾ ’¾ ’¾8–¾4–¾Àš¾Äš¾hŸ¾lŸ¾@£¾@£¾¸¥¾¬¥¾d§¾h§¾©¾©¾p«¾l«¾t¯¾|¯¾œ´¾˜´¾,¹¾,¹¾œ»¾ »¾`¼¾X¼¾ð»¾ì»¾ô¸¾ø¸¾è±¾ä±¾Ä£¾Ä£¾8¾<¾y¾ˆy¾È]¾À]¾ P¾(P¾øJ¾K¾pK¾hK¾°N¾°N¾V¾V¾˜c¾c¾€q¾ˆq¾8|¾0|¾l€¾l€¾<¾<¾‚¾‚¾ „¾ „¾€Œ¾„Œ¾—¾—¾¤¡¾˜¡¾ˆ©¾Œ©¾­¾”­¾H¯¾D¯¾T°¾T°¾t²¾x²¾Ì¶¾Ð¶¾$¼¾ ¼¾ðÀ¾ôÀ¾ˆÃ¾€Ã¾dľdľ ľľÁ¾Á¾ð¹¾ì¹¾ì«¾ð«¾Œ˜¾ˆ˜¾<…¾D…¾Èn¾¸n¾ø`¾a¾P[¾H[¾8[¾@[¾ ^¾ ^¾Øe¾Øe¾àr¾Ðr¾h€¾d€¾„…¾ˆ…¾Ô‡¾Ô‡¾¤ˆ¾ ˆ¾4‰¾,‰¾èŠ¾ðŠ¾ŒŽ¾ˆŽ¾D“¾D“¾˜¾˜¾à›¾ä›¾@ž¾@ž¾¸Ÿ¾¸Ÿ¾$¡¾$¡¾|£¾x£¾œ§¾˜§¾Ô¬¾Ø¬¾x±¾|±¾ì³¾ì³¾|´¾€´¾è³¾à³¾”°¾˜°¾T©¾P©¾$›¾(›¾¸‡¾¸‡¾ h¾¨h¾àL¾ÐL¾Ð>¾Ø>¾è8¾è8¾x8¾x8¾X;¾P;¾0C¾8C¾¨P¾ P¾(_¾ _¾j¾j¾Xo¾`o¾€q¾pq¾Xs¾`s¾xw¾xw¾h¾X¾´„¾¸„¾à‰¾Ü‰¾ ޾Ž¾È¾È¾˜’¾˜’¾\”¾\”¾ô–¾ð–¾d›¾h›¾ ¡¾¡¾ ¦¾$¦¾ü¨¾©¾ð©¾ì©¾ ©¾ ©¾Ä¦¾¼¦¾ìŸ¾ðŸ¾ä‘¾ä‘¾ |¾¨|¾°V¾ V¾€=¾ˆ=¾˜3¾3¾p6¾p6¾Ø?¾è?¾pI¾`I¾ØS¾àS¾Ha¾Ha¾ n¾˜n¾Àx¾Àx¾ }¾°}¾p¾`¾P€¾P€¾ ‚¾ ‚¾ü…¾ü…¾äŠ¾äŠ¾ð¾ô¾”¾”¾–¾”–¾4˜¾4˜¾ä™¾ä™¾Xœ¾Pœ¾ ¾œ ¾¦¾ø¥¾Èª¾Ìª¾P­¾T­¾®¾®¾x­¾p­¾<ª¾Dª¾£¾£¾,•¾ •¾ø¾‚¾]¾ˆ]¾øA¾B¾ø3¾ø3¾ð-¾ø-¾€-¾-¾€0¾x0¾˜8¾ 8¾PF¾HF¾ðT¾ðT¾¸_¾¸_¾Àd¾¸d¾˜f¾¨f¾(h¾h¾l¾l¾Øs¾às¾À}¾°}¾äƒ¾àƒ¾ð‡¾ô‡¾xоxо,Œ¾(Œ¾ä¾è¾p¾p¾È”¾Ä”¾<š¾<š¾Ÿ¾Ÿ¾´¡¾°¡¾|¢¾„¢¾ ¢¾ ¢¾Ÿ¾ Ÿ¾˜¾˜¾@о<о0n¾ n¾øG¾øG¾˜,¾ ,¾ ¾¾Ø¾Ø¾ð¾¾H¾P¾`%¾P%¾Ð2¾à2¾0A¾0A¾àK¾ØK¾ØP¾ØP¾¸R¾°R¾XT¾`T¾XX¾XX¾H`¾@`¾@j¾Pj¾pt¾ht¾Ð|¾Ø|¾¼€¾°€¾ø¾ø¾ƒ¾”ƒ¾‡¾‡¾L޾TŽ¾è–¾à–¾Ÿ¾Ÿ¾Ø¤¾Ø¤¾ì¦¾ð¦¾À¦¾¼¦¾l£¾l£¾Hœ¾Hœ¾x޾x޾v¾˜v¾XP¾PP¾5¾5¾è'¾ð'¾ø"¾ð"¾#¾#¾('¾0'¾H/¾8/¾<¾˜<¾ÐJ¾ÐJ¾€U¾xU¾ˆZ¾Z¾È\¾Ð\¾h^¾h^¾`b¾Xb¾øi¾ði¾xs¾ˆs¾`}¾X}¾¬‚¾¬‚¾H…¾H…¾‡¾‡¾Äˆ¾Àˆ¾L‹¾L‹¾Œ¾Œ¾ä”¾à”¾œ™¾ ™¾0œ¾4œ¾üœ¾üœ¾œ¾œ¾t™¾x™¾p’¾p’¾t„¾x„¾@b¾@b¾°;¾°;¾ ¾ ¾h¾x¾ ¾ ¾P ¾H ¾p¾€¾H¾P¾`%¾X%¾@3¾83¾=¾ˆ=¾HB¾HB¾D¾D¾ˆE¾xE¾`I¾`I¾ØP¾ØP¾hZ¾`Z¾ðc¾ðc¾Øk¾Øk¾Øp¾àp¾Ht¾8t¾ w¾w¾ˆ|¾|¾l‚¾p‚¾˜‡¾˜‡¾4Œ¾4Œ¾œŽ¾œŽ¾T¾X¾ðŽ¾èŽ¾ü‹¾ü‹¾…¾…¾n¾n¾pG¾xG¾Ø ¾È ¾ ¾ ¾`ï½€ï½på½`å½pæ½pæ½í½í½ðý½ðý½` ¾h ¾˜¾ ¾p%¾p%¾*¾ð)¾X+¾h+¾¸,¾¨,¾ 1¾¨1¾@¾@¾ˆS¾ˆS¾g¾g¾Øu¾Øu¾°}¾°}¾°€¾°€¾ ‚¾‚¾X„¾\„¾˜ˆ¾˜ˆ¾Ø¾Ð¾x’¾t’¾•¾•¾ô•¾ô•¾Ø•¾Ø•¾ü’¾ü’¾Œ¾Œ¾ð{¾ð{¾èT¾ØT¾ð-¾ø-¾H¾H¾ø¾¾H¾@¾¾¾€¾¾0 ¾( ¾ð¾è¾p&¾p&¾ˆ0¾˜0¾5¾ˆ5¾Ð7¾Ð7¾h9¾x9¾X=¾X=¾ D¾˜D¾ÐM¾ÐM¾HW¾8W¾_¾_¾d¾ d¾Èg¾¸g¾@k¾@k¾p¾ p¾Px¾Px¾,¾0¾°…¾°…¾ ˆ¾ ˆ¾àˆ¾àˆ¾|ˆ¾|ˆ¾x…¾t…¾°|¾¨|¾X`¾``¾ 9¾ 9¾H¾P¾í½ðì½pÒ½pÒ½`Ƚ`ȽðɽÐɽ€Ð½Ð½`à½`à½Pú½0ú½ ¾ ¾¨¾ ¾ø¾¾¸¾À¾( ¾( ¾°$¾¸$¾,¾,¾X6¾H6¾ @¾ @¾hH¾pH¾0N¾0N¾ˆR¾ˆR¾ØV¾èV¾x\¾x\¾e¾ e¾˜o¾o¾èx¾àx¾~¾~¾€¾€¾,€¾0€¾x{¾x{¾Hn¾Pn¾R¾R¾°*¾°*¾¾¾ÐÔ½àÔ½pÀ½pÀ½Ä½Ä½ÐÕ½ÀÕ½pç½€ç½@û½Pû½  ¾  ¾¸¾¸¾¨!¾°!¾à&¾Ð&¾)¾)¾Ø*¾Ø*¾ð.¾à.¾˜6¾¨6¾`@¾`@¾XJ¾XJ¾xR¾pR¾ W¾°W¾0[¾ [¾˜^¾ ^¾Èc¾Ðc¾ˆl¾€l¾w¾˜w¾¬€¾¬€¾Xƒ¾Xƒ¾„¾„¾|ƒ¾|ƒ¾4€¾0€¾r¾r¾V¾V¾ /¾¨/¾` ¾X ¾ð۽ܽ€Á½Á½·½p·½ ¸½°¸½p¿½`¿½@ϽPϽ`é½pé½À¾¸¾h ¾p ¾È¾À¾H¾H¾h¾`¾€¾¾P#¾@#¾ð,¾-¾Ø6¾Ð6¾?¾ø>¾xD¾€D¾hH¾xH¾0L¾ L¾€Q¾€Q¾Z¾Z¾˜d¾ d¾0n¾ n¾xs¾xs¾@u¾Xu¾àt¾àt¾o¾ o¾`a¾Pa¾€E¾ˆE¾ð¾è¾Pñ½Pñ½ º½ º½  ½  ½@—½@—½ð˜½™½@ ½0 ½`°½p°½˽˽€ç½€ç½Àü½Àü½x¾x¾˜¾¾ˆ¾ˆ¾È ¾Ø ¾¸¾°¾È¾À¾à'¾è'¾P0¾P0¾`5¾P5¾X8¾`8¾ø;¾<¾øB¾ðB¾`P¾hP¾ˆ`¾h`¾€o¾ˆo¾¨y¾¸y¾}¾ø|¾|¾|¾u¾u¾¸f¾¸f¾8K¾@K¾P%¾H%¾0ÿ½0ÿ½pɽpɽ`¯½p¯½à¥½à¥½P§½P§½€®½€®½ ¿½¿½Ú½Ú½Àö½Àö½0¾(¾P ¾X ¾ˆ ¾ ¾@¾8¾P¾P¾¾ ¾%¾ø$¾/¾/¾X7¾`7¾<¾<¾@¾@¾C¾ C¾ÐH¾ÈH¾pQ¾xQ¾X\¾X\¾f¾f¾Xk¾`k¾m¾m¾Pl¾Hl¾8f¾0f¾0X¾0X¾X<¾X<¾È¾À¾ÀÞ½Ð޽৽¨½ ½€½€ƒ½ƒ½à„½Ð„½Ð‹½Ð‹½ð›½œ½`¶½P¶½`Ò½pÒ½€ç½€ç½0ñ½0ñ½õ½õ½ø½ø½ðÿ½¾°¾˜¾€¾ˆ¾x¾x¾ #¾¨#¾è(¾Ø(¾`,¾p,¾è/¾à/¾5¾ø4¾ =¾ =¾H¾˜H¾PR¾PR¾W¾xW¾ØX¾èX¾¨W¾˜W¾PQ¾PQ¾(C¾8C¾˜'¾ˆ'¾˜¾ˆ¾p·½·½½€½ÀM½àM½@8½ 8½À8½à8½@F½@F½@h½`h½`½`½p®½`®½Ž Ž Î½Î½0ѽ@ѽ€Ó½€Ó½ Ü½ Ü½Àö½Àö½ð ¾ð ¾p¾x¾ø+¾è+¾ø2¾ø2¾P6¾P6¾Ø8¾Ð8¾p=¾x=¾HF¾@F¾hQ¾pQ¾`[¾h[¾à`¾Ð`¾ b¾ b¾b¾øa¾Ø[¾ð[¾ØM¾ØM¾2¾2¾  ¾  ¾ÀʽÐʽ ”½ ”½Às½ s½``½@`½c½c½ q½@q½ðˆ½àˆ½p£½p£½Ð¿½Ð¿½ÐÔ½ÐÔ½àÞ½ÐÞ½°â½Àâ½àå½Ðå½í½ í½Ðü½Ðü½0¾0¾¾¾0¾0¾h¾x¾#¾#¾˜&¾ &¾È+¾È+¾p4¾`4¾?¾ ?¾ H¾˜H¾˜M¾˜M¾O¾O¾øM¾øM¾ÈG¾ÈG¾¸9¾À9¾ø¾ø¾ ï½ ï½¢½€¢½€W½`W½€!½`!½À ½ ½à½½€½@½à>½À>½u½ u½`—½P—½­½0­½à·½À·½½½ð¼½Á½°Á½ÐʽÀʽðÚ½ðÚ½Àî½°î½P¾h¾À ¾¸ ¾H¾P¾h¾h¾x¾€¾¾ ¾`&¾X&¾€1¾€1¾ˆ;¾ˆ;¾A¾A¾ÐB¾ÀB¾B¾B¾ <¾(<¾€.¾€.¾à¾à¾àØ½àØ½°½½ 4½à4½` ½ ½` ½€ ½€%½€%½àB½ÀB½€h½€h½޽ Ž½Ð¨½°¨½½½ ½½Ƚàǽ ͽ0ͽ Ñ½Ñ½`Ú½`Ú½ é½°é½ý½ý½@¾@¾h¾h¾¾¾@¾8¾X¾`¾Ø#¾È#¾X,¾`,¾Ø6¾Ø6¾ @¾(@¾PE¾XE¾PG¾8G¾G¾G¾xA¾€A¾¸3¾¸3¾˜¾˜¾á½ á½ “½ “½ 9½ 9½€½€½Àè¼Àè¼€ò¼@ò¼ ½ ½)½ )½`]½@]½ÀнÀн ½ ½ «½ «½°°½Ð°½€µ½€µ½`¾½P¾½ðͽàͽá½0á½àô½Ðô½ ¾ ¾H¾@¾` ¾p ¾ˆ¾x¾¾¾ø¾ø¾È)¾Ð)¾ˆ3¾€3¾Ø8¾à8¾¨:¾ :¾(:¾ :¾h4¾x4¾À&¾È&¾ø ¾ø ¾àȽÀȽÀw½àw½@ ½@ ½€±¼@²¼@’¼À‘¼ÀŸ¼€Ÿ¼À¼@À¼@½ ½€3½ 3½Ài½ài½à‰½°‰½€”½”½Pš½`š½ Ÿ½ Ÿ½ð¨½ð¨½ð¸½à¸½0̽@̽àß½Ðß½pð½pð½û½û½H¾@¾`¾h¾ ¾ ¾(¾(¾x&¾€&¾à3¾Ø3¾x<¾x<¾?¾˜?¾P?¾H?¾ 9¾9¾ +¾(+¾ˆ¾x¾0Ò½PÒ½°…½À…½@½ ½€Ù¼€Ù¼€·¼€·¼Ã¼Ã¼€â¼Àâ¼ ½€½ÀG½ G½à½à½€•½€•½p ½p ½à¥½à¥½0ª½0ª½³½ð²½P½`½àÕ½àÕ½pé½pé½ðù½àù½ ¾¨¾Ø¾Ð¾è ¾è ¾h¾p¾0¾0¾ø#¾$¾ -¾˜-¾è2¾à2¾Ø4¾à4¾p4¾`4¾ .¾ .¾° ¾À ¾À¾¸¾¼½ð»½ ]½^½â¼Àá¼z¼z¼€;¼€:¼Q¼€R¼€ˆ¼ˆ¼ÀǼÀǼཽàM½àM½€w½`w½P†½`†½ð‹½à‹½`½`½ð˜½™½p¨½`¨½à»½¼½Ï½pϽðß½ðß½ë½ë½Ðò½ðò½Ðú½Àú½À¾È¾˜ ¾ ¾ ¾ ¾€ ¾p ¾è%¾è%¾'¾ˆ'¾¨&¾¸&¾¨ ¾° ¾¸¾¨¾Ðí½ðí½¡½¡½`)½@)½€t¼u¼,»,»´:´:¸~»»€E¼€D¼Ì¼@̼€½€½€I½ I½ _½ _½`i½@i½Àr½s½ƒ½€ƒ½š½š½@·½@·½`Ô½pÔ½`ë½Pë½pø½`ø½ðÿ½ðÿ½0¾0¾P¾P¾h¾`¾ ¾¸¾Ø&¾Ø&¾p,¾`,¾.¾ .¾X-¾X-¾'¾'¾ ¾¾àú½û½p®½€®½ E½àD½@²¼²¼¼¼Ÿ»¡»Â»Á»¼¼‘¼@‘¼ý¼ý¼`7½`7½b½b½ v½Àv½ ½€½`ƒ½pƒ½À‹½À‹½°›½ ›½à¯½Ð¯½ Ľ0ĽÐÔ½ÐÔ½ ß½ ß½àæ½àæ½0î½0î½Àø½Ðø½p¾h¾ ¾°¾À¾°¾ ¾( ¾¸!¾¨!¾ ¾ ¾@¾@¾ ¾ ¾ðà½àà½`”½`”½€½€½¼¼d;d;€<<î;ï;h;j;™»š»–¼–¼à½à½3½à2½`H½`H½`Q½@Q½àX½Y½ i½ài½…½p…½ š½°š½°½°½àÁ½àÁ½ð̽ͽpÔ½€Ô½°Û½Û½Pæ½@æ½Àø½àø½¾¾ ¾˜¾p¾p¾X¾P¾X¾`¾@¾@¾X¾P¾pÓ½€Ó½à†½à†½î¼€î¼x»t»ï;î;€<€<’;’;Ⱥĺ-¼€-¼€Ä¼Ä¼à½à½@F½@F½À[½à[½`e½€e½ m½m½`~½€~½ ½ ½@£½0£½ ·½ ·½€È½È½àÓ½àÓ½àÛ½ÐÛ½Àã½Àã½ï½ï½ˆ¾€¾Ø ¾Ø ¾è¾è¾X¾h¾ð¾ø¾ø¾ø¾È¾È¾Ð¾È¾°Ø½Ø½ÀŒ½àŒ½`½@½¶»µ»ë;é;€B<C<6<5<ð;ñ;º”º€t¼€t¼ò¼ò¼€%½@%½@:½`:½`B½€B½ I½ÀI½àZ½ÀZ½@|½ |½“½“½@¨½@¨½¹½ ¹½Ä½Ä½̽̽pÓ½€Ó½pÞ½`Þ½àð½Ðð½Ð¾È¾è ¾è ¾x¾x¾(¾8¾p¾p¾p¾h¾¨¾¨¾€Ê½€Ê½`}½`}½€Ì¼À̼:”:]<€\<€‘<À‘<@ˆ<@ˆ<R<Q<–;•;¼¼@»¼@»¼à ½à ½`½@½@)½`)½ 2½2½àC½D½e½e½@‡½@‡½`œ½pœ½ ­½ ­½€¸½p¸½P¿½p¿½ Æ½ Æ½ Ò½ Ò½pè½`轘¾¾À ¾¸ ¾H¾P¾¾¾ˆ¾ˆ¾˜¾€¾¸¾È¾pнpÐ½ðƒ½„½€ß¼@ß¼xºpº9<8<€y<z<€c<c< < <¼:´:C¼€B¼@Õ¼Õ¼ ½À½ ,½@,½ 6½à5½@>½€>½ÀO½ÀO½`p½`p½ Œ½Œ½P¡½P¡½€²½€²½°½½°½½ÀްŽ€Í½°Í½°Ø½ Ø½ê½ ê½€¾h¾p ¾p ¾ð¾ø¾¸¾°¾ ¾ ¾@ ¾H ¾ û½ û½Ä½Ä½Ào½Ào½À¯¼À¯¼œ;š;€Œ<ÀŒ<€¯<€¯<€¤<À¤<À„<À„<€<<­»¬»À¼À¼€ô¼Àô¼à½À½ ½ ½`"½`"½@4½`4½U½àT½}½}½Ð’½à’½ð£½ð£½@¯½0¯½`·½€·½À¿½À¿½Ë½Ë½`ݽ0ݽ@ó½`ó½¾€¾è¾ð¾è ¾è ¾€ ¾ˆ ¾¾¾Ðî½ðî½`·½P·½@S½@S½c¼€b¼P<P<É<@É<ä<Àã<@Ð<@Ð<Àª<Àª<N<€M< ¹@¹`¼_¼Ä¼€Ä¼@î¼€î¼ ½ ½` ½€ ½`½`½àD½àD½€v½`v½ ”½”½`¨½`¨½`µ½pµ½¾½¾½pƽpƽpѽ€Ñ½`ã½Pã½ù½ù½ ¾ ¾€ ¾ˆ ¾ ¾ ¾€ ¾€ ¾¾¾ðô½àô½½½½½ `½À`½@¼€¼€<<@«<€«<ÀÉ<€É<À»<¼<™<™<.<.<»»À‚¼À‚¼Ù¼Àؼ`½ ½à ½½`½€½À)½ )½€I½`I½@p½€p½@Œ½Œ½½ ½©½à¨½²½²½ðº½ðº½`ƽPƽà×½ð×½pí½pí½P¾P¾Ð¾Ø¾ð¾è¾ð¾è¾x¾x¾ é½Àé½±½p±½ G½@G½4¼3¼€}<}<€Þ<ß<@ø<ø<Àå<æ<@Á<ÀÁ<€<<F;H;€)¼)¼€©¼À©¼@×¼@×¼€ñ¼€ñ¼`½@½ ½@½À8½9½€`½@`½P„½P„½•½•½¡½ ¡½ª½ª½³½ ³½¿½ð¾½ ѽPѽ@ç½0ç½Àú½°ú½Ð¾à¾è¾à¾ ¾˜¾Àþ½Ðþ½ðã½àã½à¬½à¬½À?½À?½€¼¼€…<€…<å<å<Àú<€ú<ã<ã<@¹<@¹<€d<€d<0:8:W¼€W¼À¼À¼€î¼@î¼€½€½@ ½` ½`½@½à<½à<½€e½€e½`‡½p‡½À˜½Ð˜½`¤½P¤½Ð¬½Ð¬½µ½ µ½ À½ À½0Ó½ Ó½àé½àé½ þ½ þ½ ¾¨¾€¾h¾ ¾¨¾0ÿ½0ÿ½ã½ ã½ ¬½€¬½A½ A½'¼€'¼@<@<€ã<ã<à==Àó<Àó<€Ñ<€Ñ<@<@<•;•;¼¼£¼À¢¼Àм@Ѽé¼Àè¼þ¼þ¼½½`2½ 2½€Z½`Z½ ½°½à’½Ð’½°ž½°ž½P§½P§½à¯½Ð¯½`»½p»½°Í½Í½@ä½0ä½pø½ø½ø¾ð¾à¾à¾@¾8¾Àú½Àú½0ß½Pß½p¨½p¨½€9½`9½ ¼€ ¼€Ž<Ž<ñ<€ñ< =à=@=`=å<€å<À <@ <Ë;Ë;¼€¼Àš¼€š¼ÀżƼ€Ú¼@Ú¼€ë¼ì¼½à½`)½`)½ÀR½àR½@}½@}½@½@½ð›½œ½¤½¤½€¬½`¬½0¸½@¸½à˽Ð˽°ã½àã½pù½`ù½Ø¾Ø¾è¾è¾ø¾¾Ðû½°û½ འà½`©½p©½À;½ ;½¼¼€‰<‰<ì<€ì<`=`=€=`=Àß<€ß<@š<@š<¯;­;€¼€¼€ ¼€ ¼À̼€Ì¼á¼€á¼€ó¼@ó¼À ½à ½-½À,½@V½€V½0€½ €½p‘½`‘½½½ ¥½0¥½@­½0­½€¸½ ¸½`˽P˽pâ½Pâ½÷½0÷½H¾H¾¾¾ ¾@¾`ø½Pø½ݽݽ`¦½`¦½à5½6½þ»ÿ»@”<À”<ù<ù< =@ =à=À=€î<€î<€¨<@¨<à;á;ó»ô»À•¼À•¼À¼@À¼ÀѼÀѼá¼À༽ ½à#½À#½O½O½{½{½p½p½àš½àš½€¢½¢½à©½Ð©½ð´½ð´½€Ç½pǽ ߽߽Pô½Pô½ðÿ½àÿ½À¾È¾¨¾°¾õ½õ½ Ù½ٽࢽ£½à0½À0½ä»å»@™<@™<Àþ<ÿ<@= =`=`== =º<À¹<€<€<ȻȻ€Ž¼@޼@º¼@º¼À˼€Ì¼ÀÚ¼€Ú¼Àý¼þ¼à!½À!½ N½@N½`{½@{½ ½0½À›½À›½`£½`£½ðª½ðª½ðµ½ðµ½È½€È½ðß½ðß½õ½õ½X¾X¾P¾H¾€¾€¾÷½÷½Û½€Û½¥½ð¤½ 2½ 2½à»à»<<`=`==À=à =@ =@ô<@ô<­<­<ô;õ;á»ã»’¼€‘¼»¼»¼Ì¼Ì¼Ú¼€Ú¼þ¼Àý¼@!½ !½àL½M½ y½y½p޽޽ð™½À™½P¡½p¡½à¨½à¨½´½à³½ÀÆ½àÆ½PÞ½@Þ½Pó½`ó½ðþ½Àþ½¾¾¾ ¾ô½ðó½ Ø½Ø½`¢½p¢½€.½€.½Æ»Ç»@£<À£<€=@=à= =à=À=€ÿ<Àÿ<€¹<À¹<€<<±»¯»À„¼À„¼À°¼À°¼ÀļÀļ€Ö¼@×¼@ü¼ü¼€½ ½@I½ I½@s½`s½ ‹½‹½à–½Ð–½Ÿ½Ÿ½`§½€§½ð²½³½€Å½`Žܽ ܽð½`ð½û½°û½`ÿ½pÿ½þ½þ½ò½€ò½p×½`×½ ½  ½à)½*½œ»›»À¬<­<à==À= = = =@ó<ó<À®<À®<€<€<¸»º»@…¼@…¼À±¼À±¼Ç¼@ǼÀÚ¼€Ú¼½ ½`!½@!½`J½`J½`t½`t½ ‹½ ‹½—½ —½€ ½` ½©½©½ ´½´½ÐÆ½ÐÆ½àܽðܽàð½ðð½ü½ðû½ ¾0¾¾ðÿ½ õ½0õ½Ú½ðÙ½ ¢½¢½+½ +½»»@³<À²<À =à == =à=À=Àû<€û<@·<€·<<<™»›»€|¼€{¼@ª¼@«¼Á¼€À¼€Ó¼ÀÓ¼ù¼€ø¼@½€½€F½ F½Ào½p½p‰½p‰½@•½0•½Ð½ð½@¦½@¦½à±½À±½ðýðýPÚ½pÚ½pî½`î½pù½`ù½Ðý½Ðý½@ý½@ý½€ò½pò½`×½€×½0 ½ ½`&½`&½T»V»@¼<@¼<À=à= = =`=`=à= =À½<À½<€'<(<V»X»a¼a¼À¼À¼Àµ¼Àµ¼€Ë¼Ì¼ó¼€ò¼ ½À½àC½àC½€m½`m½À‡½À‡½“½“½›½ðš½Ð¢½ð¢½p®½`®½ÀÁ½°Á½Ù½°Ù½ï½pï½°û½Ðû½ðÿ½àÿ½ðþ½àþ½ó½ ó½×½×½  ½ ½`(½€(½ƒ»„»€´<µ<€ =` =€=€= =à=`=@=À¼<À¼<€<<Ž»»€w¼€v¼À§¼À§¼½¼€½¼ÀϼÀϼ€ô¼@ô¼À½À½àC½D½ m½@m½ˆ½ ˆ½Ð“½à“½œ½œ½¥½ ¥½€°½€°½À½°Â½ðؽٽí½àì½ ø½ ø½€ü½ ü½ü½pü½ñ½ ñ½€Ö½pֽ𞽟½@#½`#½"» »Ã<Ã<€=`=À= =À=À===Ä<@Ä<€5<5<"»$»V¼V¼À˜¼À˜¼€°¼@°¼Æ¼Àż€ë¼ì¼ ½à½@½ @½ i½Ài½ †½†½p‘½`‘½@™½P™½¡½¡½`¬½`¬½0¿½0¿½ Ö½Ö½Ðë½àë½÷½÷½Pû½@û½ ù½°ù½pí½`í½Ñ½Ñ½`š½pš½À½½ˆº€ºÌ<@Ì< =à=@#=@#= =`===@Í<Í<J<€J<ˆºŒº;¼€:¼‹¼‹¼£¼£¼À¹¼À¹¼@á¼@á¼ ½à½?½à>½`j½€j½0‡½ ‡½à’½à’½àš½Ðš½¢½ ¢½à­½À­½PÀ½pÀ½`×½P×½ ì½ì½°÷½ ÷½°û½Àû½Àú½Àú½0ï½@ï½àÓ½ðÓ½àœ½àœ½€ ½  ½»»Ä<@Ä<= = "="= = = = =€Í<Í<€A<€A< » »S¼€R¼À•¼À•¼@«¼@«¼¾¼@¾¼@ä¼Àã¼@½@½@=½`=½€g½`g½…½…½P½@½°—½°—½@Ÿ½PŸ½`ª½Pª½`½½p½½ Õ½ Õ½€ê½€ê½`ö½pö½°ù½ ù½p÷½`÷½°ê½Àê½ÀνÐν˜½ð—½à½À½PºHº€Í<@Í<À=À=(= (=€"=€"=`= =@ß<à<€c<€c<°¹°¹€8¼9¼Àˆ¼Àˆ¼Àœ¼Àœ¼À­¼€­¼Ò¼Ò¼ ½` ½5½à4½à_½`½À½À½P½P½ð”½ð”½`œ½pœ½p§½`§½pº½pº½`Ò½`Ò½àç½ðç½ô½ô½°÷½ ÷½põ½`õ½ðè½ð轰̽À̽ •½•½`½€½@:@:€Ù<@Ù<À=À=*=*=`!=€!=€=€=ÀÖ<ÀÖ<R<€Q<°º¤º€D¼F¼¼À޼€£¼@£¼Àµ¼¶¼€Ú¼@Ú¼à½à½9½à8½Àc½àc½`ƒ½`ƒ½ÀŽ½ÐŽ½p–½`–½ ž½ ž½P©½@©½¼½ ¼½Ó½€Ó½Ðè½Ðè½@ô½@ô½÷½p÷½Põ½Põ½°è½Àè½ͽÍ½à–½Ð–½½À½0º@ºÀÍ<@Î<=à=À+= +=à'=à'=`=`=@è<@è<€m<n<8€3¼3¼À„¼…¼@—¼@—¼À§¼¨¼À˼€Ë¼`½ ½ 2½2½]½à\½à½€½`‹½`‹½ð’½ð’½Ðš½Ð𽦽¦½ ¹½¹½àнàнæ½æ½Ðñ½àñ½õ½õ½ ó½ 󽿽 æ½ðʽàʽ”½”½À½à½¤:¨:ß<ÀÞ<à =à =€0= 0=@*=*=à=à=€ì<í<|<}<œ:œ:¼€¼€t¼u¼Ž¼€¼@Ÿ¼@Ÿ¼@ü€Ã¼@½`½ .½.½`Y½ Y½à|½}½À‰½Ð‰½P‘½P‘½Ð˜½°˜½ð£½¤½0·½ ·½ÀνÐν`ä½Pä½€ð½ ð½õ½ðô½ô½ô½€è½pè½0ͽPͽp–½`–½@½`½8:0:€Û<@Ü<€=@=À.=à.=€(= (= =à=€è<Àç<t<u<8:8:€#¼€$¼€|¼€|¼À’¼À’¼€¤¼€¤¼€É¼@ɼà½À½ /½`/½`Y½€Y½`|½@|½ ‰½ ‰½°‘½°‘½à™½à™½@¥½P¥½¸½ð·½`ϽpϽ@ä½@ä½°ï½°ï½Pó½Pó½ñ½€ñ½`å½`å½É½ É½Ð’½À’½À ½à ½;;ç<Àç<%=À$=@4= 4= -=€-=`=@=ò<Àñ<„<@„< ;; ¼ ¼b¼€a¼€„¼€„¼À–¼—¼¼¼À»¼€þ¼€þ¼€)½€)½T½àS½ w½`w½ ‡½‡½½ ½0—½ —½`¢½`¢½Ð´½Ð´½˽ ˽ ß½ ß½0ê½0ê½@î½@î½€í½€í½â½ â½Ç½€Ç½€½€½à½½;;Àú<@û<@.= .=À;=À;=3=3= =@ =ü<@ü<’<À‘<…;ƒ;һѻ€A¼A¼n¼o¼Œ¼À‹¼²¼@²¼À÷¼÷¼ &½@&½àQ½ R½ v½àu½`‡½p‡½P½`½0™½™½À¤½Ð¤½·½·½@ͽ@ͽðà½á½ì½ì½ð½ð½pï½pï½`ä½€ä½0ɽɽÀ‘½Ð‘½` ½` ½t;t;õ<€õ<€*=€*=À7= 7=€.=€.=à==€ô<ô<Š<€Š<P;P;î»î»€N¼O¼€{¼{¼‘¼À¼@¶¼€¶¼ø¼ø¼@%½`%½€O½`O½€r½`r½à„½ …½ ½½à•½à•½0¡½¡½à²½³½É½ðȽܽ€Ü½ç½ç½ì½ì½p뽀뽠à½à½PŽ`ŽÀ½°½€½€½·;¸;`= =à1=à1=`?=@?=`6= 6= $= $=à==@<@<¹;¹;»ž»€)¼€*¼€]¼]¼†¼À…¼€¬¼À¬¼Àí¼€í¼à½½G½ÀF½ i½ i½€€½€½Ð‰½À‰½à’½à’½°ž½Àž½à°½Ð°½Æ½Æ½Ú½Ú½Àä½Ðä½ è½è½è½è½Ý½ ݽ ½½Њ½àн@ø¼@÷¼æ;ã;@= =À6=À6=àA=B=@6=`6=@"= "=ý<ý<@<€<v;t;߻߻D¼€D¼k¼€j¼†¼†¼€ª¼@ª¼€í¼î¼€!½`!½ÀL½àL½@p½ p½pƒ½`ƒ½‹½ ‹½Ð’½°’½Ð½à½`°½p°½ÀǽÐǽÀܽÀܽ@è½@è½ë½ë½€é½pé½Ý½ðܽÁ½ Á½PнPнû¼Àú¼Å;Ä;@=`=À2=À2= A= A=@:=@:=à(=à(=@=@=À£<€£<É;Ç;‘»’»€$¼€#¼€R¼€R¼€z¼€{¼€£¼@£¼Àä¼å¼ ½à½€D½ D½`g½`g½ ½@½Pˆ½@ˆ½½€½ð›½ð›½@®½@®½àĽðĽ Ù½ Ù½pä½pä½àç½Ðç½Pæ½`æ½ Ú½Ú½@¾½P¾½0‡½0‡½@í¼€í¼þ;þ;à =À =:=:=`H=€H= @=À@= /=/=€ =  =­<­<è;è;h»f»¼¼;¼€:¼`¼`¼€•¼@•¼€×¼À×¼`½`½€?½`?½`b½€b½ày½Ày½ð„½…½P½P½™½ð˜½¬½°¬½àĽÀÄ½Ú½Ú½àæ½ç½Pê½@ê½Ðç½Ðç½ÀÚ½ÀÚ½ ¾½¾½ð‡½ð‡½@ó¼Àó¼Ü;Ü; =À=À5=6=@E= E=À>=`>= -=@-=€ =` =À¦<@§<Ê;Ê;”»•»€ ¼€ ¼G¼€G¼h¼h¼€˜¼@˜¼Àۼܼ@½`½`C½@C½ f½ f½ }½À}½ †½†½p޽`޽€™½°™½p¬½`¬½Ã½€Ã½€Ø½€Ø½Ðã½Ðã½ç½ç½ä½ä½ð׽ؽð»½ð»½0…½0…½æ¼@æ¼ <€ <À = =`==@==`L=`L=àD=ÀD=@3=€3=À=À=´<€´<<€<,»,»¼€¼+¼€*¼O¼€N¼€‹¼À‹¼@μ@μ ½`½À:½à:½@]½`]½`t½@t½ð½ð½À‰½À‰½•½•½ð§½¨½P¿½p¿½ÀÔ½ Ô½0à½0à½Pã½pã½À཰཰ӽӽp·½€·½Ð€½Ð€½×¼×¼€%<€$<@=`=`C=`C=T=T=@N=`N=`==@==`=`=@Ä<€Ä<<€<Àº¼ºÚ»Ù»€¼€ ¼+¼€+¼€r¼r¼ÀÁ¼ÀÁ¼ ½`½ >½`>½ d½@d½`{½@{½ð„½…½ð‹½ð‹½ð–½à–½À©½À©½€Á½€Á½°Ö½ÐÖ½€â½`â½°å½ å½ã½0ã½0Ö½0Ö½º½º½ƒ½ƒ½Àݼ޼€<€< =@=B=ÀA=`P=€P=I=ÀH= 7=`7=`=`=€¼<@¼<<€<ܺäºç»è»€¼€¼C¼€C¼€†¼@†¼@ȼ@ȼ ½à ½@6½`6½àX½ÀX½€o½`o½@½€½Ð‡½°‡½“½ “½¦½¦½€½½`½½@Ò½PÒ½€Ý½Ý½Ðà½Àà½`Þ½`Þ½Ðѽàѽ¶½ðµ½€~½`~½€Î¼Ï¼;<€;<`=@= J=`J=àX=ÀX=@Q=`Q=à>=À>=`=`=Ì<@Ì<€4<4<ð9à9ž»»ô»ó»€¼!¼m¼€k¼€¸¼¹¼À½ ½`/½`/½R½àQ½€i½`i½ày½z½€…½€…½‘½à½À£½Ð£½Ðº½àº½@Ͻ@Ͻ€Ú½€Ú½ Ý½Ý½pÛ½€Û½ðνàν³½³½`x½`x½€Á¼€Á¼€T<€T<à=À=ÀL=àL=€X=`X=`M=€M=à9=À9=À=À=Æ<ÀÅ<€-<€-<€8 9³»´» ¼€ ¼€9¼9¼ƒ¼@ƒ¼@ü@üÀ½ ½ 0½ 0½@R½@R½j½j½`|½€|½@‡½‡½Ð’½“½¥½¥½P»½@»½ϽϽðÙ½Ú½ðݽðݽPݽ0ݽðѽðѽp¶½p¶½À}½à}½€Æ¼€Æ¼U<€U<  =  =P=ÀO= [=\= Q=€Q=`>=`>=à=à=Ñ<ÀÐ<€C<D<È:È:|»z»Ú»Ú»€¼¼€a¼b¼³¼€²¼½ ½`+½@+½ N½€N½ e½àe½Àv½ v½Ðƒ½Ðƒ½@½P½À¡½°¡½¸½€¸½à̽à̽ð×½à×½`Û½pÛ½€Ù½€Ù½`ͽPͽ±½±½u½àt½@¸¼@¸¼€l<€l<à%=&=V=àU=@c= c= Z=@Z=@G=€G=à$=À$=€Þ<@Þ<€Y<€Y<4;2;0».»´»³»¼¼€N¼N¼@¨¼¨¼Àø¼ù¼€%½@%½€G½ G½@_½`_½àp½ p½ ½ ½@½0½p ½€ ½à·½Ð·½ð̽ð̽ÀØ½ÐØ½Ü½ Ü½@Û½۽ϽϽp³½`³½@x½€x½@¾¼@¾¼€a<b<à"=À"=€R= R=@_=€_= V=V=`C=`C=!=à =×<@×<€M<M<;;Z»Z»Ã»Â»¼€¼€S¼R¼@«¼À«¼Àþ¼@þ¼à(½à(½ÀK½ K½@c½ c½Às½às½P‚½P‚½ ½°½  ½ ½à¶½ð¶½˽˽pÖ½`Ö½ÐÙ½ÐٽؽؽÀ˽À˽Я½ð¯½àp½Àp½€°¼@°¼€}<€|<€)=€)=`Y=`Y=`f=@f=€]=€]=`K=`K=À(=À(=€æ<@æ<€i<j<l;l;äºäº’»”»â»â»:¼€9¼ž¼ž¼€ï¼€ï¼à ½!½€C½@C½àZ½[½àk½Àk½@|½€|½°‰½€‰½ œ½0œ½ ³½³½ Ç½°Ç½ðÒ½àÒ½ Ö½0Ö½àÓ½ðÓ½`ǽPǽ«½ðª½Àf½àf½Àš¼›¼@”<@”< 4=€4=@c=`c=`n=`n=€c= c=ÀO=àO=€.=`.=Àô<Àô<À‡<€‡<Ì;Í;8:0:»»¨»¨»%¼€$¼@™¼™¼Àñ¼ò¼%½ %½`I½`I½€`½``½p½p½@½ ½ Š½°Š½p½€½ð´½à´½ ʽʽpÕ½pÕ½pؽpؽֽֽÐȽàȽ ¬½¬½@k½`k½¨¼€¨¼ƒ<€ƒ<`+=@+=\=\=@j=@j= b= b=€P=€P=€-=`-=€í<í<€r<€s<ˆ;‡;˜º˜ºj»j»¹»¹»$¼€$¼À”¼€”¼è¼€è¼`½`½`A½€A½ X½ÀW½@g½`g½w½w½À†½Ð†½°™½ ™½@±½@±½Pƽ`ƽpѽ€Ñ½€Ô½€Ô½ÀѽÀѽpĽpĽð§½Ð§½`a½`a½@’¼@’¼Àš<Àš<7=À6=@f=`f= s=às=k=àj=ÀX=àX=@6=@6=@==ÀŒ<<Ö;Õ;”:”:°º¬ºb»b»€¼€¼€„¼…¼@Ú¼Ú¼½ ½ <½`<½àR½ÀR½ a½`a½`o½`o½p‚½`‚½€•½€•½­½­½pýpý`Ͻ`Ͻ`Ò½@Ò½ Ͻ ϽpÁ½€Á½Ð¤½à¤½`[½`[½@ˆ¼@ˆ¼À¢<£< :=@:=€i=@i=@u=@u= j=àj=àV= V=à2=à2=€÷<À÷<Àƒ<„<°;®; »»—»•»¼¼@Œ¼Œ¼Àß¼Àß¼à½à½à<½à<½T½T½`d½`d½@t½ t½€…½€…½@˜½ ˜½€¯½¯½pĽPĽpϽpϽ`Ò½`ҽϽ€Ï½P½`½ð¥½ð¥½^½`^½€Ž¼@޼<@<€8=`8=Àh=àh=@w=`w=@o= o= \=À\=`9=@9=`= =À‘<@‘<æ;å;è:è:ºº,».»ì»ë»€}¼€}¼@Ô¼@Ô¼½à½@8½@8½@N½€N½@]½@]½`l½ l½`½`½@”½0”½ð«½ð«½Á½Á½p̽`̽PϽPϽ€Ì½€Ì½p¿½€¿½0£½£½€X½`X½À€¼€¼@ª<«< ?= ?=àn= n=€|= |=€s=`s=à`=à`=à==à==À= =€™<š<<<:;<; : :¬º°º»»¹»€d¼€d¼ÀǼ€È¼½À½@3½€3½ÀI½ I½X½X½`f½`f½€|½ |½à‘½Ð‘½0ª½ ª½PÀ½PÀ½À̽Ð̽`нpнpνPνÁ½Á½p¥½p¥½à[½\½À„¼€„¼€ª<€ª<`?=@?=@n=@n=Ày=ày=@o=`o= [=`[= 9=`9=€=@=@™<€™<<<6;:;€8€8»»ã»ä»€w¼€v¼@μ€Î¼½ ½ 3½ 3½ J½ J½€Z½`Z½@j½`j½€€½€€½“½“½Pª½`ª½¿½¿½`ʽPʽ€Í½€Í½àʽðʽ ¾½¾½¢½ð¡½ U½€U½u¼u¼À²<À²<`C= C=s= s=à=À=`v=€v= c=€c=`@=€@=€ =` =À¢<À¢<<<‡;†;Ô:Ø:ºº¤»£»X¼€W¼€¿¼@À¼ ½À ½-½à,½àC½àC½ T½@T½€d½ d½@{½@{½`½P½ §½ §½p»½p»½@ƽ@ƽPɽ@ɽðƽǽpº½pº½Pž½`ž½àM½ÀM½R¼€R¼@Æ<@Æ<`M=€M=€|=`|=Ѓ=Ѓ=€|=@|=`h=`h=ÀE=F=€=€=À³<À³<=<><Ê;È;X;V;@:@:‚»»€J¼€K¼€»¼€»¼ ½à½ -½`-½`E½@E½àV½àV½h½àg½`½`½’½’½ ¨½À¨½à¼½à¼½àǽÐǽ˽˽@ɽ@ɽð¼½ð¼½¡½¡½ÀR½ÀR½€e¼€e¼€¼<À¼<I=ÀH=€w=€w= ==`x=`x=@e=`e=@C= C= = =®<@®<1<1<¯;®;; ;¹¹›»š»€O¼P¼¹¼À¸¼`½`½À'½À'½à?½À?½@Q½€Q½àb½àb½z½Ày½½ ½p¥½p¥½`¹½P¹½0Ľ0Ľ`ǽPǽ Ž0Žp¸½p¸½0œ½@œ½ I½àH½=¼€=¼@Ð<Ð<àQ=àQ=€= €= …=…=@€=0€=àl=àl=àJ=K=`=€=¾<¾<€Q<€P<ë;í;;Œ;Ð:Ô:F»H»6¼6¼¬¼€¬¼€þ¼€þ¼"½à!½@9½`9½€J½@J½`[½€[½ r½€r½à‹½Œ½à¢½À¢½·½·½½½€Å½pŽpý€Ã½`·½p·½`›½`›½`F½`F½.¼€-¼@Û<Û<@X=`X=ƒ=ƒ=p‡=p‡=`€=p€=àj=k=ÀG=@G= =`=µ<À´<><€><Í;Ì;h;j;”:”:Z»\»€=¼€<¼€±¼À±¼@½½à%½&½à<½À<½ÀL½M½à\½€\½@s½`s½ Œ½°Œ½`¤½`¤½p¹½`¹½ Ä½°Ä½Ç½Ç½€Ã½€Ã½€µ½µ½ð˜½Ð˜½`C½€C½2¼2¼ÀÑ<Ò<àQ=ÀQ=`€=P€=À†=І= ‚=‚=@q=`q=O=O=`=`=ÀÁ<ÀÁ<V<€V<ù;÷; ;¡;";";»»&¼€%¼@¦¼¦¼ú¼€ú¼` ½` ½`7½@7½€G½ G½`W½@W½àm½n½ ‰½ ‰½¡½¡½¶½¶½pÁ½pÁ½`Ľ`ĽàÁ½ÐÁ½`´½`´½à—½ð—½`@½@@½€¼¼ß<ß<@Y=@Y=ðƒ=ðƒ=`‰=€‰=P„=0„=Àt=u=€R=@R=@=€=Ë<ÀÊ<€h<€h<€<<Ç;Æ;p;r;hº`º¼¼@š¼Àš¼€ì¼Àì¼ ½À½`0½€0½@A½@A½€R½€R½`j½ j½ðˆ½‰½ ¡½ ¡½à¶½°¶½Â½ Â½@Ž`ŽÀÁ½°Á½³½ ³½ð–½°–½À?½@½&¼€%¼@Ö<Ö<àS=T==€=`ˆ=`ˆ=àƒ=ðƒ= u=@u=`R=@R=@=`=Ä<€Ã<€X<Y<€<<µ;µ;d;f;„º„º¼¼@¡¼@¡¼€÷¼÷¼à½½ 5½`5½ÀD½àD½àS½ÀS½ j½@j½ˆ½ˆ½ÐŸ½ÐŸ½ µ½ µ½ À½À½@ýPýÀ½À½€²½`²½À•½À•½À<½=½¼€¼Àâ<Àâ<àZ=ÀZ=à„=Є=‹=‹=†= †= y= y=`V=`V=À =à =€Ð<ÀÐ<u<€t<<<ä;å;œ;™; 9`9ÿ»¼À’¼À’¼À漀漽½ -½`-½`=½`=½N½ÀM½Àd½e½P…½`…½ðœ½Ðœ½À±½à±½½½à¼½@¿½P¿½Ð»½À»½°­½Ð­½à½à½`3½@3½á»á»@ñ<@ñ< a=@a=ˆ=ˆ=pŽ=pŽ=ð‰=Š=`€=`€=€]=À]=€&=`&=ÀÙ<€Ù<@<@<,<,<€<<Ð;Ò;;;Ö»×»€¼€¼Àë¼€ë¼@½ ½`2½€2½`A½€A½àO½P½àe½àe½ †½0†½ð½à½`³½`³½à¾½Ð¾½pÁ½€Á½ ¾½¾½`°½p°½ “½ “½ 9½9½¼¼€è<@è<@]=`]=`†=P†=Œ=Œ=ð‡=ð‡=À|=à|=@Z=àY=@$=@$=@Ö<ÀÖ<@€<€<€)<)<ü;ý;²;±;p:p:è»é»ÀŒ¼ÀŒ¼@à¼@༠½à½@*½ *½À:½à:½`K½`K½@b½`b½„½„½`›½P›½à¯½à¯½àº½àº½½½ ½½ð¹½Ð¹½¬½¬½°½½À0½1½È»È»@ú<@ú<Àf= f= Š= Š=p=p=‹=àŠ=à€==à^=à^=à)=À)=€ã<ä<€Ž<€Ž<F<€F<<€<æ;ä;;;¾»À»€ƒ¼ƒ¼€×¼€×¼@½ ½À%½ %½ 6½6½`F½€F½`]½`]½€½½ð˜½À˜½`­½€­½p¸½p¸½ðº½àº½À·½Ð·½ ª½ ª½½€½À,½À,½¤»¤»`= =j=ài=Ћ=Ћ=P=p=Š= Š==à~=`\=€\=(=À'=€à<Àà<À‹<À‹<€;<<< <€ <Á;Â;¤: :ݻܻ€‡¼€‡¼Ù¼€Ù¼ ½à½À&½à&½@8½`8½ I½àI½à`½À`½Ð‚½Ð‚½`™½`™½`­½P­½ ¸½0¸½0»½0»½¹½ ¹½`¬½`¬½ð½ð½`0½@0½²»³»à==àk=Àk= Œ= Œ=`‘=`‘=‹=‹=Ѐ=ð€=à_=à_=à+=,=€ë<ë<À–<€–<€R<€R<€#<$<ð;î;(;(;´»²»}¼€}¼ÀѼҼ€ ½` ½à"½À"½À3½à3½`D½`D½ [½ [½p€½p€½`—½`—½¬½¬½ð¶½ð¶½¹½¹½Ð¶½°¶½p©½p©½àŒ½ðŒ½`*½@*½†»‡» =À=€p= p=P=0=”= ”=Ž=ð=pƒ=pƒ=`d=`d= 0=à/=ò<€ò<À<À<€a<a<2<€3<<<h;f;’»“»k¼k¼ÀǼ@ȼ@½½`½€½ .½à.½@½à?½àW½X½à~½ ~½—½—½ ¬½ ¬½ ·½ ·½pº½€º½€·½€·½ª½ª½`½P½,½à+½˜»š»@=€=Àl=Àl=p=P=p’=’=ÐŒ=ÀŒ=‚= ‚=c=c=à.= .=€î<Àî<À™<@š<€Y<X<€(<*<û;ü;H;D;¦»¥»u¼€u¼@ͼÀͼ€ ½` ½à ½À ½à1½2½ÀB½ÀB½àY½ÀY½À~½½p–½p–½«½àª½àµ½ðµ½°¸½À¸½Àµ½°µ½p¨½p¨½ ‹½ ‹½€'½ '½`»\»€ =@ =Àr=àr=@=@= •=0•===ð„=ð„=`g=€g=€3=@3=À÷<À÷<À¢<À¢<j<j<=<€<<<<;;j»j»^¼€]¼€Â¼@¼à½½½½`+½€+½<½À;½ R½ÀR½€x½€x½ð“½ð“½ ©½ ©½`´½`´½ð¶½ð¶½ ³½ ³½ð¤½à¤½Ð‡½À‡½sonic-visualiser-3.0.3/samples/bounce.wav0000644000000000000000000012234013111512442016574 0ustar 00000000000000RIFFؤWAVEfmt D¬±data´¤ÿÿåÊåÊ®®?’?’§‹§‹›‡›‡ÝØÝØÏÏ. . î0î05;5;~A~AZEZE·G·G)I)I J J‘J‘JåJåJKK3K3KBKBKKKKKNKNKOKOKOKOKMKMKJKJKGKGKhUhUÂPÂP­N­NTMTM€L€LþKþK­K­KyKyKWKWKBKBK4K4K*K*K!K!KKKKKKK K K K KKKKKÿJÿJûJûJøJøJôJôJñJñJíJíJêJêJæJæJãJãJàJàJÛJÛJ×J×JÔJÔJÑJÑJÍJÍJÉJÉJÆJÆJÂJÂJ¿J¿J¼J¼J¸J¸JµJµJ±J±J®J®JªJªJ¦J¦J£J£JžJžJ›J›J—J—J”J”JJJŒJŒJ‰J‰J…J…JJJJJ|J|JxJxJâ]â]uUuUKQKQªNªNMMLLbKbKûJûJ»J»J‘J‘JwJwJfJfJXJXJOJOJGJGJBJBJ>J>J:J:J5J5J1J1J.J.J+J+J'J'J#J#J J JJJJJJJJJ J J³S³S€O€OmMmMLLIKIKÇJÇJvJvJ@J@J J JJJùIùIïIïIèIèIáIáIÚIÚIÖIÖIÓIÓIÎIÎIÊIÊIÇIÇIÃIÃI¿I¿I½I½IºIºI¶I¶I²I²I¯I¯I¬I¬I¨I¨I¤I¤I¡I¡IœIœI˜I˜I•I•I‘I‘IŽIŽIŠIŠI‡I‡I„I„I€I€I}I}IzIzIvIvIsIsIoIoIlIlIiIiIfIfIbIbI]I]IZIZIVIVIRIRIOIOILILIIIIIEIEIAIAI?I?I;I;I7I7IsRsR§N§N˜L˜LKKKK{J{J÷I÷I¤I¤ImImIJIJI5I5I%I%IIIII I IIIIIüHüHøHøHôHôHñHñHíHíHêHêHçHçHäHäHàHàHÜHÜHØHØHÕHÕHÑHÑHÍHÍHÊHÊHÆHÆHÃHÃH¿H¿H½H½H¹H¹HµHµH²H²H®H®H«H«H¨H¨H¤H¤H¡H¡HœHœH˜H˜H•H•H‘H‘HŽHŽHŠHŠH‡H‡HƒHƒHHH}H}HzHzHwHwHsHsHoHoHlHlHiHiHeHeHbHbH^H^HZHZH1Q1QÂMÂM½K½KtJtJ¥I¥I!I!IËHËH”H”HqHqHYHYHJHJH>H>H6H6H/H/H)H)H$H$H H HHHHHHHHH H H H HHHHHÿGÿGüGüGøGøGõGõGòGòGîGîGëGëGYY±R±R°N°N(L(LŒJŒJˆIˆIæHæH|H|H9H9H H HïGïGÜGÜGÎGÎGÄGÄG¾G¾G·G·G²G²G­G­G©G©G¥G¥G¢G¢GGGšGšG–G–G“G“GGGŒGŒGˆGˆG…G…GGGGG{G{GxGxGtGtGqGqGmGmGkGkGhGhGdGdG`G`G\G\GYGYGUGUGQGQGNGNGJGJGGGGGCGCG@G@G=G=G:G:G6G6G3G3G0G0G,G,G(G(G%G%G"G"GGGGGGGGGGG G GGGnOnO^L^LgJgJ&I&IWHWHÔGÔGGGHGHG#G#G G GúFúFîFîFæFæFÞFÞFØFØFÓFÓFÏFÏFËFËFÆFÆFÃFÃFÀFÀF¾F¾FºFºF¶F¶F³F³F°F°F¬F¬F¨F¨F¥F¥F¢F¢FFF™F™F–F–FïNïNäKäKðIðI±H±HäGäGbGbG G GÕFÕF±F±F˜F˜F‡F‡F|F|FsFsFmFmFhFhFbFbF]F]FZFZFVFVFRFRFNFNFKFKFHFHFDFDF@F@F>F>F;F;F7F7F3F3F0F0F-F-F)F)F%F%F"F"FFFFFFFFFFF F F F FFFFFÿEÿEüEüEøEøEõEõEòEòEðEðEìEìEèEèEåEåEâEâEÝEÝEÙEÙEÖEÖEÓEÓEÏEÏEËEËEÈEÈEÅEÅEÁEÁE¾E¾E»E»E¸E¸E´E´E±E±E®E®EªEªE¦E¦E£E£E E E›E›E—E—E”E”E‘E‘EEE‰E‰E†E†EƒEƒE€E€E}E}EzEzEvEvEsEsEqEqEmEmEiEiEfEfEcEcE^E^EZEZEWEWETETEPEPEMEMEJEJEFEFECECE?E?E=E=E9E9E$M$MmJmJŠHŠHSGSGˆFˆFFF³E³EzEzETETE=E=E,E,EEEEEEEEEEEÿDÿDüDüDøDøDõDõDòDòDîDîDëDëDèDèDäDäDáDáDÝDÝDÙDÙDÕDÕDÒDÒDÏDÏDËDËDÇDÇDÄDÄDÁDÁD\L\LíIíIHHãFãFFF—E—E@E@EEEãDãDÈDÈD¶D¶DªDªD D D˜D˜D’D’DDDˆDˆD„D„D€D€D}D}DyDyDwDwDsDsDqDqDnDnDjDjDfDfDcDcD`D`D[D[DWDWDTDTDQDQDMDMDJDJDFDFDCDCD@D@D=D=D:D:D7D7D3D3D/D/D,D,D)D)D%D%D"D"DDDDDDDDDDD D D D DDDDDÿCÿCüCüCùCùCöCöCóCóCïCïCìCìCéCéCåCåCâCâCÝCÝCÚCÚC×C×CÔCÔCÐCÐCKKêHêH#G#GõEõE/E/E¬D¬DUDUDDDôCôCÙCÙCÇCÇCºCºC±C±C©C©C¢C¢CœCœC˜C˜C”C”CCCŒCŒC‰C‰C…C…CCCCC|C|CxCxCuCuCsCsCoCoClClCiCiCeCeCbCbC]C]CZCZCWCWCSCSCPCPCLCLCICICECECBCBC?C?C=C=C9C9C5C5C2C2C/C/C+C+C(C(C$C$C!C!CCCCCCCCCCC C CCCCCCCÿBÿBüBüBùBùBöBöBóBóBïBïBìBìBéBéBåBåBâBâBÝBÝBÚBÚBÖBÖBÓBÓBÐBÐBÍBÍBÉBÉBÆBÆBÂBÂB¿B¿B½B½B¹B¹BµBµB²B²B¯B¯B¬B¬B¨B¨B¤B¤Bé%é%[[³³±ú±úÂôÂôÙðÙðEîEî”ì”ìuëuëºêºê>ê>êîéîé·é·é•é•éÐÐUUý'ý'þ0þ0ê6ê6Ò:Ò:c=c=ñEñEìRìR9N9N8J8J‚G‚GºEºE‰D‰DÁCÁC;C;CãBãB¦B¦B~B~BcBcBNBNB?B?B6B6B.B.B(B(B"B"BBBBBBBBB B B B BBBBBBBýAýAúAúAøAøAôAôAñAñAíAíAêAêAçAçAãAãAàAàAÛAÛAØAØAÕAÕAÒAÒAÎAÎAËAËAÈAÈAÄAÄAÁAÁA¾A¾A»A»A¸A¸A´A´A±A±A­A­AªAªA§A§A£A£A A A›A›A™A™A•A•A’A’AAA‹A‹AˆAˆA„A„AAA~A~A{A{AyAyAuAuArArAnAnAkAkAhAhAeAeAbAbA]A]AZAZAVAVASASAPAPAMAMAIAIAFAFABABA?A?A=A=A9A9A6A6A3A3A0A0A,A,A(A(A%A%A"A"AAAAAAAAAAA A A A AAAAAÿ@ÿ@ý@ý@ú@ú@ø@ø@ô@ô@ñ@ñ@î@î@ê@ê@æ@æ@ã@ã@à@à@Ü@Ü@VGVG²E²EDDýBýB?B?B¿A¿AjAjA/A/AAAì@ì@Ø@Ø@É@É@¿@¿@·@·@±@±@«@«@§@§@¢@¢@@@™@™@–@–@“@“@@@Œ@Œ@ˆ@ˆ@…@…@‚@‚@@@|@|@z@z@v@v@s@s@p@p@m@m@i@i@f@f@c@c@`@`@[@[@X@X@ÅFÅF$E$EŽCŽCuBuB¹A¹A9A9Aä@ä@ª@ª@@@g@g@S@S@F@F@<@<@3@3@-@-@(@(@#@#@@@@@@@@@@@ @ @@@@@@@ÿ?ÿ?þ?þ?ü?ü?ø?ø?õ?õ?ò?ò?í?í?ê?ê?ç?ç?ã?ã?à?à?Ý?Ý?Ú?Ú?×?×?üEüEDD C CøAøAÿ>ü>ü>ù>ù>ö>ö>ò>ò>î>î>ê>ê>ç>ç>ä>ä>á>á>ß>ß>Û>Û>Ø>Ø>Ô>Ô>Ñ>Ñ>Í>Í>Ê>Ê>¡D¡DeCeCöAöAë@ë@3@3@·?·?a?a?$?$?ý>ý>ß>ß>Ê>Ê>¼>¼>°>°>¦>¦> > >œ>œ>–>–>’>’>Œ>Œ>‰>‰>…>…>‚>‚>€>€>}>}>z>z>v>v>s>s>p>p>k>k>h>h>e>e>b>b>_>_>]>]>Y>Y>V>V>R>R>N>N>K>K>H>H>E>E>A>A> D DÑBÑBgAgA]@]@©?©?,?,?Ø>Ø>œ>œ>t>t>W>W>A>A>3>3>'>'>>>>>>> > >>>>>>>ÿ=ÿ=ü=ü=ø=ø=õ=õ=ò=ò=í=í=ê=ê=ç=ç=ä=ä=à=à=Þ=Þ=Û=Û=×=×=Ô=Ô=Ñ=Ñ=Í=Í=É=É=Æ=Æ=Ã=Ã=À=À=¾=¾=º=º=BCBCRMRMäIäI4F4FCC¤A¤A\@\@~?~?â>â>y>y>.>.>ü=ü=×=×=½=½=©=©===’=’=‰=‰=‚=‚===z=z=u=u=q=q=m=m=i=i=f=f=c=c=_=_=]=]=Z=Z=V=V=S=S=P=P=L=L=H=H=E=E=B=B=?=?=<=<=9=9=6=6=3=3=0=0=+=+=(=(=%=%="="============= = =======ÿ<ÿ<ý<ý<ú<ú<ö<ö<ó<ó<ð<ð<ë<ë<è<è<å<å<â<â<ß<ß<Ü<Ü<Ù<Ù<Ö<Ö<Ó<Ó<Ð<Ð<Ë<Ë<È<È<Å<Å<Á<Á<¿<¿<¼<¼<¹<¹<¶<¶<³<³<®<®<«<«<§<§<¥<¥<¢<¢<Ÿ<Ÿ<œ<œ<™<™<•<•<’<’<Ž<Ž<‹<‹<ˆ<ˆ<„<„<‚<‚<<<|<|ù>>>a=a=î<î<ž<ž<>< < < < <þ;þ;ò;ò;é;é;â;â;Ü;Ü;×;×;Ó;Ó;Í;Í;É;É;Æ;Æ;Â;Â;¿;¿;½;½;º;º;¶;¶;³;³;°;°;¬;¬;©;©;¦;¦;¢;¢;Ÿ;Ÿ;;;™;™;–;–;“;“;;;Œ;Œ;‰;‰;†;†;ƒ;ƒ;€;€;~;~;{;{;x;x;t;t;q;q;m;m;j;j;f;f;c;c;`;`;^;^;[;[;W;W;T;T;Q;Q;M;M;J;J;G;G;D;D;A;A;>;>;;;;;8;8;4;4;1;1;-;-;););&;&;#;#; ; ;;;;;;;;;;; ; ; ; ;;;;;;;ÿ:ÿ:ü:ü:ù:ù:õ:õ:ò:ò:î:î:ë:ë:Ø?Ø???ñ=ñ===ZB>==-<-<”;”;';';Þ:Þ:§:§:::e:e:S:S:õ&õ&– – ÃÃúú7ö7ö)ó)óOO­­''¸,¸,®0®0v3v3&"&"­­??%ÿ%ÿqùqùrõrõ¤ò¤òççVV¼¼Ð&Ð&~,~,z0z0B3B37575“6“6‡7‡71818¦8¦8ú8ú8Ü=Ü=l=l=s9>9;9;9898959592929.9.9*9*9'9'9Á=Á=*=*=<<6;6;“:“:::Ì9Ì9’9’9f9f9H9H93939!9!999 9 999ÿ8ÿ8ú8ú8õ8õ8ð8ð8ë8ë8ç8ç8ä8ä8á8á8Þ8Þ8Û8Û8Ø8Ø8Õ8Õ8Ò8Ò8Î8Î8Ë8Ë8È8È8Å8Å8Â8Â8¿8¿8¼8¼8¹8¹8¶8¶8³8³8®8®8«8«8¨8¨8¥8¥8¢8¢8Ÿ8Ÿ888š8š8—8—8”8”8‘8‘8ó<ó8>8:8:8787848481818-8-8*8*8'8'8#8#8 8 88888888888 8 8 8 8 8 88888ÿ7ÿ7ý7ý7ú7ú7÷7÷7ô7ô7I7>7;7;7878757572727.7.7+7+7'7'7$7$7!7!7777777777777 7 7 7 7777777ÿ6ÿ6ü6ü6ø6ø6õ6õ6ò6ò6î6î6ë6ë6è6è6å6å6â6â6ß6ß6Ü6Ü6Ù6Ù6Ö6Ö6Ó6Ó6Ð6Ð6Ì6Ì6É6É6Æ6Æ6Ã6Ã6À6À6¾6¾6»6»6¸6¸6Í:Í: B BAAg>g>?5>5;5;5858555552525.5.5+5+5(5(5%5%5"5"555555555555555 5 5555555ÿ4ÿ4ý4ý4ú4ú4ö4ö4ó4ó4ð4ð4ì4ì4é4é4ç4ç4ä4ä4á4á4ß4ß4Ü4Ü4Ø4Ø4Õ4Õ4Ò4Ò4Î4Î4Ë4Ë4r8r8”?”?v>v>5<5<>:>:¾8¾8¡7¡7Ó6Ó6;6;6Ê5Ê5z5z5>5>555ñ4ñ4Ø4Ø4Ä4Ä4·4·4ª4ª4¢4¢4›4›4•4•4‘4‘4‹4‹4‡4‡4ƒ4ƒ444}4}4z4z4v4v4s4s4p4p4l4l4i4i4f4f4c4c4`4`4^4^4[4[4X4X4U4U4R4R4N4N4K4K4H4H4E4E4B4B4?4?4=4=4:4:4646434340404-4-4*4*4'4'4$4$4!4!444•7•7z7z7Á6Á666Š5Š5!5!5Ö4Ö4œ4œ4q4q4Q4Q49494%4%444 4 444ü3ü3ö3ö3ð3ð3ë3ë3ç3ç3â3â3ß3ß3Ü3Ü3Ù3Ù3Ö3Ö3Ò3Ò3Î3Î3Ë3Ë3È3È3Å3Å3Â3Â3¿3¿3½3½3º3º3·3·3´3´3±3±3­3­3ª3ª3§3§3¤3¤3¡3¡3Ÿ3Ÿ333š3š3—3—3•3•3’3’3Ž3Ž3‹3‹3ˆ3ˆ3…3…33333|3|3y3y3w3w3t3t3q3q3m3m3j3j3g3g3d3d3a3a3_3_3\3\3Y3Y3V3V3S3S3P3P3L3L3I3I3F3F3C3C3@3@3>3>3;3;3838353532323.3.3+3+3)3)3&3&3#3#333333333333333 3 3 3 3333333þ2þ2û2û2ø2ø2õ2õ2ò2ò2î2î2ì2ì2è2è2å2å2â2â2ß2ß2Ý2Ý2Ú2Ú2×2×2Õ2Õ2Ò2Ò2Î2Î2Ë2Ë266?9?9’8’8L7L7(6(6D5D5˜4˜444·3·3n3n3:3:333ó2ó2Ü2Ü2È2È2¼2¼2°2°2¦2¦2Ÿ2Ÿ2™2™2•2•222‹2‹2ˆ2ˆ2„2„2€2€2~2~2{2{2w2w2t2t2q2q2m2m2j2j2g2g2d2d2b2b2_2_2]2]2Z2Z2W2W2T2T2P2P2M2M2J2J2G2G2D2D2A2A2%%ÞÞR R SSaÿaÿùúùúï便dd $ $¸'¸'n*n*n,n,è-è-ÿ.ÿ.É/É/_0_0Ì0Ì011)$)$BBå å -ÿ-ÿØúØú£÷£÷oo¿ ¿ ïïíí"#"#ý&ý&Õ)Õ)í+í+y-y-œ.œ.r/r/0000Ö0Ö011?1?1_1_1v1v1…1…1‘1‘1™1™111Ÿ1Ÿ1 1 1 1 1Ÿ1Ÿ1Ÿ1Ÿ1ž1ž1›1›1š1š1˜1˜1–1–1“1“111Œ1Œ1Š1Š1‡1‡1„1„11111|1|1y1y1v1v1t1t1q1q1m1m1i1i1f1f1c1c1j4j4q4q4Ü3Ü3C3C3Æ2Æ2f2f222å1å1½1½111ƒ1ƒ1q1q1a1a1V1V1K1K1D1D1>1>191914141.1.1*1*1&1&1#1#1 1 1111111111111 1 1111111ÿ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¬3¬3³3³333Š2Š222°1°1g1g1212111è0è0Ð0Ð0½0½0­0­0¢0¢0š0š0“0“0‹0‹0…0…000~0~0y0y0v0v0r0r0n0n0k0k0h0h0d0d0a0a0_0_0\0\0Y0Y0V0V0S0S0Q0Q0M0M0J0J0G0G0D0D0A0A0?0?0=0=0:0:0707040401010-0-0*0*0'0'0%0%0"0"000000000000000 0 000000000þ/þ/û/û/ø/ø/É2É2Ü2Ü2W2W2Ê1Ê1T1T1ù0ù0±0±0{0{0R0R020200000ø/ø/ê/ê/à/à/Ù/Ù/Ó/Ó/Ì/Ì/Ç/Ç/Ã/Ã/¿/¿/¼/¼/¹/¹/µ/µ/±/±/­/­/«/«/§/§/¤/¤/¡/¡/Ÿ/Ÿ///š/š/—/—/•/•/“/“/Ž/Ž/‹/‹/ˆ/ˆ/†/†/ƒ/ƒ/€/€/~/~/{/{/x/x/u/u/r/r/p/p/l/l/i/i/f/f/c/c/a/a/_/_/\/\/Y/Y/V/V/S/S/P/P/L/L/J/J/G/G/D/D/A/A/?/?/=/=/:/:/7/7/4/4/1/1/-/-/*/*/(/(/%/%/"/"/////////////// / / / ///////þ.þ.ü.ü.ù.ù.ö.ö.ó.ó.ð.ð.ì.ì.é.é.ç.ç.ä.ä.á.á.ß.ß.Ý.Ý.Ú.Ú.×.×.Ô.Ô.Ñ.Ñ.Í.Í.Ê.Ê.Ç.Ç.Å.Å.Â.Â.¿.¿.½.½.º.º.¸.¸.µ.µ.².².®.®.«.«.¨.¨.¦.¦.£.£. . .Ÿ.Ÿ.œ.œ.™.™.–.–.”.”.‘.‘...Š.Š.ˆ.ˆ.….….#1#1ä3ä3Ž3Ž3™2™2©1©1å0å0K0K0Ö/Ö/|/|/6/6///Ù.Ù.º.º. . .....r.r.h.h.`.`.Y.Y.S.S.M.M.H.H.D.D.@.@.>.>.:.:.7.7.4.4.2.2.-.-.*.*.'.'.$.$.!.!. . ............. . . . .......ÿ-ÿ-ü-ü-ù-ù-ö-ö-ó-ó-ñ-ñ-í-í-ê-ê-ç-ç-ä-ä-á-á-ß-ß-Ý-Ý-Ú-Ú-Ø-Ø-Õ-Õ-Ò-Ò-Î-Î-Ë-Ë-È-È-Å-Å-Ã-Ã-À-À-:0:0`0`0ø/ø/////¿.¿.}.}.H.H. . ...ç-ç-Õ-Õ-Ä-Ä-¹-¹-­-­-¥-¥-Ÿ-Ÿ-™-™-”-”---‹-‹-†-†-ƒ-ƒ-€-€-}-}-z-z-w-w-t-t-q-q-m-m-j-j-g-g-d-d-a-a-_-_-]-]-Z-Z-X-X-U-U-R-R-N-N-K-K-H-H-F-F-C-C-@-@->->-;-;-8-8-6-6-3-3-0-0-----*-*-'-'-$-$-"-"- - ------------- - - - -------ÿ,ÿ,ü,ü,ù,ù,÷,÷,ô,ô,ñ,ñ,í,í,ê,ê,è,è,å,å,â,â,ß,ß,Ý,Ý,Û,Û,Ø,Ø,Õ,Õ,Ó,Ó,Ð,Ð,Ì,Ì,É,É,Æ,Æ,Ã,Ã,Á,Á,¿,¿,¼,¼,¹,¹,¶,¶,´,´,±,±,­,­,«,«,¨,¨,¥,¥,£,£, , ,Ÿ,Ÿ,œ,œ,™,™,–,–,“,“,‘,‘,,,Š,Š,‡,‡,„,„,‚,‚,€,€,~,~,{,{,x,x,u,u,s,s,p,p,k,k,i,i,f,f,d,d,a,a,_,_,\,\,Y,Y,W,W,T,T,Q,Q,N,N,K,K,H,H,E,E,B,B,@,@,>,>,;,;,….….N3N3U3U32222÷0÷0å/å/ / /^.^.×-×-n-n---ß,ß,°,°,‰,‰,k,k,T,T,@,@,2,2,%,%,,,,, , ,,,,,þ+þ+ù+ù+õ+õ+ò+ò+í+í+ê+ê+æ+æ+ã+ã+à+à+Þ+Þ+Û+Û+Ù+Ù+Ö+Ö+Ó+Ó+Ð+Ð+Í+Í+Ê+Ê+Ç+Ç+Ä+Ä+Á+Á+¿+¿+½+½+º+º+·+·+µ+µ+²+²+®+®+¬+¬+©+©+§+§+¥+¥+¢+¢+Ÿ+Ÿ+++›+›+˜+˜+•+•+’+’+++Œ+Œ+‰+‰+†+†+„+„+++++|+|+z+z+w+w+t+t+q+q+n+n+–-–-Ê-Ê-z-z---´,´,f,f,(,(,ù+ù+Ò+Ò+³+³+›+›+‡+‡+x+x+j+j+_+_+X+X+P+P+I+I+C+C+?+?+;+;+6+6+3+3+.+.+++++(+(+&+&+#+#+ + +++++++++++++ + + + +++++++ÿ*ÿ*ý*ý*ú*ú*÷*÷*õ*õ*ò*ò*î*î*ë*ë*""ffòò  ¯¯yÿyÿ1ü1üoo& &  ´´//®®d!d!## % %a&a&['['((°(°(!)!)z)z)½)½)ñ)ñ)**6*6*L*L*]*]*«!«!··îî••jÿjÿ+ü+üaa é鈈ûûtt!! # #º$º$ú%ú%ò&ò&´'´'I(I(¿(¿())_)_)–)–)¿)¿)ß)ß)ø)ø) * ***"*"*)*)*-*-*1*1*4*4*5*5*5*5*4*4*4*4*2*2*1*1*.*.*,*,*****)*)*&*&*$*$*!*!*************** * * * *******ÿ)ÿ)ý)ý)ú)ú)÷)÷)õ)õ)ò)ò)î)î)ì)ì)é)é)æ)æ)ã)ã)á)á)ß)ß)Ü)Ü)Ú)Ú)×)×)Õ)Õ)Ñ+Ñ+ 0 0=0=0Y/Y/L.L.[-[-•,•,õ+õ+w+w+++Ä*Ä*†*†*W*W*.*.***ø)ø)ä)ä)Ô)Ô)Æ)Æ)¼)¼)³)³)«)«)¥)¥)Ÿ)Ÿ)›)›)–)–)’)’)Ž)Ž)Š)Š)‡)‡)ƒ)ƒ)€)€)~)~){){)y)y)v)v)s)s)p)p)l)l)i)i)g)g)d)d)b)b)_)_)^)^)Z)Z)X)X)V)V)S)S)P)P)L)L)J)J)G)G)D)D)A)A)?)?)=)=):):)8)8)5)5)3)3)0)0),),)*)*)()()%)%)")") ) ))))))))))))) ) ) ) )))))))))þ(þ(Ú*Ú*++Ü*Ü*…*…*5*5*î)î)¶)¶)‡)‡)c)c)E)E).).))) ) )ÿ(ÿ(ô(ô(ê(ê(â(â(Ý(Ý(×(×(Ñ(Ñ(Ì(Ì(È(È(Ä(Ä(Á(Á(¿(¿(»(»(¸(¸(µ(µ(²(²(®(®(¬(¬(©(©(§(§(¤(¤(¡(¡(Ÿ(Ÿ(((š(š(—(—(•(•(’(’(((Œ(Œ(‰(‰(‡(‡(„(„(‚(‚(((}(}({({(x(x(u(u(r(r(p(p(l(l(j(j(g(g(d(d(b(b(_(_(](]([([(X(X(V(V(R(R(P(P(M(M(J(J(G(G(D(D(B(B(?(?(>(>(;(;(8(8(6(6(3(3(0(0(-(-(+(+(((((ü)ü)8*8*þ)þ)¨)¨)Y)Y)))Þ(Þ(±(±(Œ(Œ(q(q(Z(Z(E(E(7(7(*(*( ( (((((((((þ'þ'ú'ú'õ'õ'ò'ò'í'í'é'é'æ'æ'ã'ã'à'à'Þ'Þ'Û'Û'Ø'Ø'Ö'Ö'Ò'Ò'Ð'Ð'Í'Í'Ê'Ê'È'È'Å'Å'Â'Â'¿'¿'¾'¾'»'»'¸'¸'¶'¶'³'³'°'°'®'®'«'«'¨'¨'¦'¦'¤'¤'¡'¡'Ÿ'Ÿ'''š'š'˜'˜'•'•'’'’'''Œ'Œ'‰'‰'†'†'„'„'''''}'}'{'{'x'x'v'v's's'p'p'm'm'j'j'g'g'e'e'b'b'_'_'^'^'['['X'X'V'V'S'S'Q'Q'))´,´,--[,[,|+|+©*©*ú)ú)g)g)ó(ó(•(•(H(H( ( (Ý'Ý'¶'¶'˜'˜'~'~'i'i'Y'Y'I'I'?'?'5'5'-'-'&'&' ' ''''''' ' ' ' '''''''þ&þ&ú&ú&ø&ø&õ&õ&ò&ò&î&î&ë&ë&è&è&æ&æ&ä&ä&á&á&ß&ß&Ý&Ý&Ú&Ú&×&×&Õ&Õ&Ò&Ò&Ð&Ð&Ì&Ì&É&É&Ç&Ç&Å&Å&Á&Á&¿&¿&¾&¾&»&»&¸&¸&¶&¶&³&³&±&±&®&®&«&«&©&©&¦&¦&¤&¤&¡&¡&Ÿ&Ÿ&&&š&š&˜&˜&•&•&“&“&&&Œ&Œ&Š&Š&‡&‡&…&…&ƒ&ƒ&€&€&~&~&|&|&y&y&v&v&t&t&q&q&((J(J(!(!(Ú'Ú'•'•'X'X'$'$'û&û&Ø&Ø&¼&¼&¥&¥&“&“&ƒ&ƒ&v&v&j&j&a&a&Z&Z&S&S&L&L&G&G&B&B&?&?&;&;&7&7&4&4&2&2&-&-&*&*&'&'&%&%&!&!&&&&&&&&&&&&&&& & & & &&&&&&&&&þ%þ%ü%ü%ù%ù%÷%÷%ô%ô%ñ%ñ%î%î%ë%ë%è%è%ç%ç%ã%ã%á%á%ß%ß%Ý%Ý%Ú%Ú%Ø%Ø%Õ%Õ%Ó%Ó%Ð%Ð%Ì%Ì%Ê%Ê%Ç%Ç%Ä%Ä%Â%Â%À%À%¾%¾%¼%¼%¹%¹%·%·%´%´%²%²%°%°%¬%¬%©%©%§%§%¥%¥%¢%¢% % %ž%ž%›%›%™%™%—%—%”%”%‘%‘%Ž%Ž% ' 'N'N',','ë&ë&«&«&r&r&?&?&&&÷%÷%Ü%Ü%Ã%Ã%³%³%£%£%–%–%Š%Š%%%z%z%s%s%l%l%f%f%b%b%^%^%Z%Z%V%V%S%S%P%P%L%L%I%I%F%F%B%B%@%@%>%>%<%<%9%9%6%6%4%4%2%2%.%.%,%,%)%)%&%&%$%$%!%!%%%%%%%%%%%%%%% % % % %%%%%%%%%ÿ$ÿ$ü$ü$ú$ú$ø$ø$õ$õ$ò$ò$ð$ð$í$í$é$é$ç$ç$å$å$â$â$à$à$Þ$Þ$Û$Û$Ù$Ù$Ö$Ö$Ô$Ô$Ò$Ò$Î$Î$Ì$Ì$É$É$Æ$Æ$Ä$Ä$Á$Á$¿$¿$½$½$º$º$¸$¸$¶$¶$´$´$²$²$®$®$¬$¬$&&M)M)·)·)8)8)‚(‚(Ð'Ð'4'4'²&²&F&F&ñ%ñ%©%©%p%p%@%@%%%ü$ü$â$â$Í$Í$¼$¼$­$­$¡$¡$˜$˜$Ž$Ž$†$†$$${${$v$v$q$q$l$l$h$h$d$d$a$a$_$_$\$\$Y$Y$V$V$S$S$Q$Q$M$M$J$J$G$G$D$D$B$B$?$?$>$>$;$;$8$8$7$7$5$5$2$2$0$0$,$,$*$*$'$'$%$%$°°OOÊ Ê //ggQQss00è è ““vvÒÒ¿¿MM””f f !!œ!œ! " "c"c"«"«"å"å"##9#9#W#W#n#n#####›#›#£#£#ª#ª#®#®#aaŸ Ÿ UU88½ ½ ïï‹‹©©úú  éé ,!,!¢!¢!ÿ!ÿ!I"I"‡"‡"¹"¹"ß"ß"ÿ"ÿ"##+#+#:#:#E#E#P#P#W#W#\#\#_#_#a#a#c#c#d#d#d#d#d#d#c#c#b#b#`#`#_#_#^#^#]#]#[#[#Y#Y#W#W#T#T#R#R#P#P#L#L#J#J#H#H#F#F#C#C#@#@#?#?#<#<#:#:#8#8#6#6#3#3#1#1#.#.#+#+#)#)#&#&#$#$#!#!############### # # # #########ÿ"ÿ"ý"ý"û"û"ø"ø"ö"ö"ô"ô"ñ"ñ"í"í"ë"ë"è"è"æ"æ"ã"ã"á"á"ß"ß"Þ"Þ"Û"Û"Ø"Ø"Ö"Ö"Ó"Ó"Ñ"Ñ"$$V$V$?$?$ $ $Ø#Ø#¦#¦#{#{#W#W#8#8### # #ø"ø"é"é"Ý"Ý"Ò"Ò"Ç"Ç"¿"¿"¹"¹"´"´"­"­"¨"¨"¤"¤" " """™"™"–"–"“"“"""Œ"Œ"‰"‰"‡"‡"„"„"""""}"}"z"z"x"x"u"u"s"s"p"p"l"l"j"j"h"h"f"f"c"c"a"a"_"_"]"]"Z"Z"X"X"V"V"R"R"P"P"M"M"J"J"H"H"F"F"C"C"A"A"?"?"="=";";"9"9"7"7"4"4"1"1".".",",")")"'"'"$"$""""" " """"""""""""""" " " " """""""""þ!þ!ü!ü!ú!ú!ø!ø!õ!õ!ó!ó!ð!ð!í!í!ê!ê!è!è!æ!æ!â!â! # #{${$''Y'Y'à&à&1&1&~%~%Ý$Ý$S$S$ß#ß###.#.#ë"ë"¶"¶"†"†"`"`"@"@"'"'"""þ!þ!í!í!à!à!Ö!Ö!Ë!Ë!Â!Â!¼!¼!¶!¶!°!°!ª!ª!¥!¥!¡!¡!ž!ž!›!›!—!—!“!“!‘!‘!!!Š!Š!ˆ!ˆ!…!…!‚!‚!!!}!}!{!{!y!y!v!v!s!s!q!q!m!m!k!k!h!h!f!f!d!d!a!a!_!_!]!]![![!X!X!V!V!T!T!Q!Q!N!N!K!K!I!I!F!F!D!D!B!B!@!@!>!>! > = = ; ; 8 8 6 6 4 4 1 1 . . + + ) ) & & $ $ " "                         ÿÿýýúúøøõõóóððïïììö ö 9!9!,!,!!!Ú Ú ± ± Š Š j j P P 9 9 $ $     ûûïïææßߨØÑÑÌÌÆÆÂ¿¿¼¼¸¸´´±±¯¯¬¬©©¦¦££  žžœœ™™––““‘‘‹‹ˆˆ††ƒƒ}}zzxxttrrppoolljjffddbb``^^\\YYVVTTRROONNKKIIFFCCAA??>>==::884422//..,,**&&$$!!    ÿÿýýûûøøööóóññåå!!F#F#¤#¤#S#S#È"È"8"8"±!±!;!;!Õ Õ   6 6 úúÅÅ››uuVV>>))øøëëààÙÙÐÐÊÊ¿¿ººµµ±±­­ªª¦¦¢¢ŸŸ››˜˜””’’‹‹‰‰……ƒƒ}}zzxxuussppoolljjhheecc``__\\ZZXXUURRPPNNLLJJHHDDBBAA??==;;99553311//--++((%%##!!    ÿÿýýûûøøööóóññïïEE““éé   óó++ll  É É AAcc44½½ÆÆiiððbbÂÂSS‹‹¹¹ÞÞþþ..??NNZZbbjjoottyy{{~~áá@@¨¨x x ÕÕ¶¶pp006 6   ––ÅÅŸŸ11‚‚ŸŸŒŒRRùù„„ùùZZ¬¬ïï((UU}}žž¹¹ÏÏààïïüü  !!""""!!""        ÿÿÿÿüüúúööôôòòððîîììêêææååââààßß­­ééèèÏϯ¯ppUU??++  ýýññèèßßÖÖÏÏÊÊÄÄ¿¿¼¼¶¶²²¯¯¬¬©©¥¥¢¢ŸŸžž››˜˜••’’ŽŽŒŒ‰‰††„„~~||yyvvttrroonnlljjffddbb__^^\\ZZXXUUSSPPOOLLKKHHEEDDAA??>><<9966442200..,,**((%%""        ÿÿþþûûùùööóóòòððîîììêêèèääââààßßÝÝÚÚØØÕÕ‘‘‹‹CC¬¬$$ººOOððžžSSßß°°‰‰ffII00  øøêêÝÝÑÑÈÈÀÀ¹¹±±­­¦¦¡¡žžšš••‘‘‹‹ˆˆ„„}}zzxxttrrppnnlljjffddbb``^^\\ZZVVTTRRPPOOLLJJIIFFDDBB??>><<::88552200//,,++))%%##!!    ÿÿýýûûùùõõóóññïïîîëëééææääââààÞÞÝÝÚÚØØÕÕÓÓÑÑÏÏÍÍËËÉÉÈÈÄÄÂÂÀÀ¿¿ii  ¤¤‘‘yy^^EE//ööêêÝÝÒÒÊÊÁÁºº²²­­¨¨¡¡™™””‘‘ŽŽ‹‹ˆˆ„„}}zzxxuurroonnkkiiffddaa__^^\\ZZXXTTRRPPOOMMJJJJFFDDBB@@??==::88553311//..++))&&$$""        ÿÿÿÿüüúúøøõõóóññïïîîëëééææääââààÞÞÜÜÚÚØØÕÕÓÓÑÑÏÏÍÍÌÌÊÊÈÈÅÅÃÃÁÁ¿¿½½»»ºº¶¶´´²²°°¯¯¬¬ªª¨¨¥¥JJppXX??((þþììÝÝÏÏÄÄ»»±±©©¡¡››••‹‹††{{xxssppnnkkhheebb``^^\\ZZVVTTQQOONNLLJJIIEECC@@??==;;9966442200//--**))%%##!!      ÿÿÿÿüüúúøøõõóóññïïííììééææååââààßßÝÝÛÛÙÙÕÕÔÔÒÒÏÏÎÎÍÍËËÉÉÆÆÄÄÂÂÀÀ¾¾½½ºº¸¸µµ³³±±¯¯®®¬¬ªª¨¨¤¤££  ŸŸ››™™––””’’##ìì½½dd==ååÄÄrr,,íí¶¶††^^;;ÿÿééÓÓ²²¥¥šš……~~uuooiibb^^üü¿¿© © Þ Þ ``ssŸŸ. . Ì Ì U U ¸¸õõ  ýýÏÏ……""¬¬!!……ÞÞ**kk¢¢ÒÒýý??YYnn‘‘ŸŸ¬¬´´¾¾ÄÄÊÊÏÏÐÐÔÔÖÖÙÙÚÚÛÛÛÛÛÛŸŸ••ggb b ¤ ¤ 22  ggÎÎW W   ‰ ‰ ààúú¿¿jjþþ}}ììKKââ  SS©©ÊÊååþþ$$33@@LLSS\\aahhkkooppssttuuuuvvvvuuttttssrrqqppoonnlljjhhffddbbêêííÙÙÈȵµ¦¦šš‚‚yyooii``[[UUOOMMHHDD??==::552200..++))%%##      ÿÿüüûûùùööôôòòððîîííëëèèææääááßßßßÜÜÛÛÙÙÖÖÔÔÑÑÐÐÏÏÍÍÌÌÊÊÆÆÄÄÃÃÀÀ¿¿¾¾¼¼ºº¶¶µµ³³°°¯¯®®««©©¨¨¤¤¢¢¡¡ŸŸžž››šš˜˜””““‘‘ŒŒ‰‰††……ƒƒ€€~~||zzxxuussppoonnkkjjhheebbaa__^^\\ZZXXUUSSQQPPOOMMKKIIFFDDBB@@??¶¶]]’’’’{{ZZ99ùùÝÝÄ᝛›ŠŠ{{mm__UUMMDD<<55//))##  ÿÿýýúúööôôòòïïîîììêêææååââààßßÝÝÛÛÙÙÖÖÔÔÒÒÑÑÏÏÍÍËËÊÊÈÈÅÅÃÃÁÁ¿¿¾¾¼¼ºº¸¸µµ³³±±¯¯®®¬¬ªª©©¥¥¤¤¢¢  žž››™™––””’’‹‹‰‰††„„ƒƒ€€~~||yyvvuussppoonnlljjhheeccaa____\\ZZXXVVTTRRQQOONNLLJJHHEECCAA??>><<::9966331100//--++))&&$$""  ‚‚»»SSPPss11ààCCýý¾¾ƒƒQQ%%þþÛÛ½½¡¡ŠŠttaaQQBB55))  ýýööññììææââßßÛÛÖÖÓÓÐÐÎÎËËÈÈÄÄ¿¿¾¾¼¼¹¹¶¶´´²²¯¯®®¬¬ªª¨¨¥¥££¡¡ŸŸžžœœšš™™––““‘‘‹‹ˆˆ††„„‚‚€€}}||zzvvuussqqoonnlljjhheeddbb____]][[YYVVUUSSRRPPNNMMKKIIFFDDBBAA??>><<::8855331100//,,**))&&$$""        ÿÿýýüüúúøøõõóóññïïîîììëëééææääââààßßÞÞ==ÃÃóóùùééÑѸ¸ƒƒmmXXEE44%%  ööîîååßߨØÒÒÍÍÈÈ¿¿»»µµ²²¯¯¬¬©©¥¥££  žžœœ™™––””’’ŽŽŒŒŠŠˆˆ……ƒƒ~~||zzxxuussrrppoommjjiiffddbb``__^^\\ZZXXVVUUSSQQOONNLLJJHHEEDDBB@@??==;;::ËË e e \ \ Ðл»hhhh€€– – œ œ Š Š b b $ $ Ð Ð hhððggÒÒ//ÌÌ  EEvv¢¢ËËíí  $$==PPaapp‹‹””žž¥¥¬¬±±¶¶»»¾¾ÀÀÂÂÄÄÅÅÆÆÈÈÈÈÈÈÈÈÈÈ``ee> >   OOffW W I I / /   Á Á l l ŒŒnnÍÍhh©©áá––88‰‰¯¯¿¿ÄÄÃÃÀÀ¼¼µµ°°¬¬¦¦¡¡žžšš••’’ŒŒ‰‰……‚‚€€~~||zzvvttrrppnnlljjhheeccaa__^^]]ZZZZXXUUSSQQOONNMMKKIIFFDDBB@@??>>==;;9966442211//..,,**((&&$$""        ÿÿýýûûúúøøõõóóññïïïïííììêêèèååããááààßßÝÝÛÛÚÚØØÖÖÔÔÒÒÑÑÏÏÎÎÌÌÊÊÉÉÆÆÄÄÂÂÀÀ¿¿¾¾¼¼ºº¹¹¶¶´´²²±±¯¯®®¬¬ªª¨¨¦¦¤¤¢¢¡¡ŸŸžžœœšš™™––””““‘‘ŽŽŒŒ‹‹‰‰††„„‚‚€€~~}}{{yyvvttrrqqooºº%%››ÊÊ››ÕÕÅÅ‘‘OOÁÁCC  ÛÛ¯¯††bbBB%%  ôôßßÎν½®®  ““‰‰~~ttllcc]]XXQQLLFFBB>>::5511//,,))%%""      ÿÿþþüüúúøøööôôòòððïïîîììêêééææääââààßßÞÞÝÝÛÛÚÚØØÖÖÔÔÒÒÐÐÏÏÍÍÌÌÊÊÉÉÆÆÄÄÂÂÁÁ¿¿¾¾¼¼»»¹¹¶¶´´³³±±¯¯®®­­««©©¦¦¥¥££¡¡  ŸŸ››šš˜˜••““’’ŒŒŠŠ‰‰††„„‚‚€€~~||{{yyvvuussqqoooommkkjjhheeddbb``__^^]][[ZZXXUUTTRRPPOOMMLLJJHHFFDDBB@@??>><<::9966553311////--++))((hhÆÆììôôîîßßÏϾ¾¬¬œœqqee\\QQII@@::22,,%%    ÿÿýýùù÷÷õõññïïîîêêèèççååââßßßßÝÝÚÚÙÙ××ÖÖÔÔÑÑÏÏÎÎÍÍÊÊÈÈÇÇÅÅÄÄÁÁ¿¿¾¾¼¼ºº¸¸··¶¶µµ²²°°¯¯®®¬¬©©§§§§¥¥¢¢  ŸŸžžšš™™——––””’’ŒŒ‰‰ˆˆ‡‡……„„€€}}zzyywwvvttrrppoonnlljjhhggffddaa``__^^\\ZZXXWWVVTTRRPPOONNLLIIHHGGEEDDAA????==<<998877552211//..,,**((''&&$$""        ÿÿÿÿýýúúøø÷÷ööôôòòððïïîîììêêèèççææääââll——’’‡‡yyii\\NN??44''  ùùôôííççààÝÝ××ÔÔÏÏÌÌß ß … …   ¤ ¤ ??ððººww¶¶33ÎÎoo  ¤¤0 0 ± ± ' ' ’ ’ ô ô L L š š â â $ $ ^ ^ ‘ ‘ Á Á ì ì   6 6 U U o o ˆ ˆ Ÿ Ÿ ´ ´ Æ Æ × × å å ð ð ý ý &&,,005588<<>>@@BBDDEEGGGGGGGGGGGGGGGGq q 7 7 Ö Ö m m ËË››[[––¤¤@@ÛÛnnõõr r æ æ N N ¬ ¬ O O ’ ’ Ò Ò > > l l • • º º Ý Ý ù ù   . . D D W W g g w w † † ‘ ‘ ž ž § § ° ° ¸ ¸ ¿ ¿ Æ Æ Ê Ê Ï Ï Ô Ô × × Ú Ú Ý Ý ß ß á á â â â â ä ä å å å å æ æ å å å å å å å å å å ä ä ä ä â â â â á á à à ß ß ß ß Ý Ý Ý Ý Ú Ú Ù Ù Ø Ø × × Ö Ö Õ Õ Ô Ô Ñ Ñ Ï Ï Ï Ï Î Î Í Í Ê Ê È È Ç Ç Æ Æ Ä Ä Â Â Á Á ¿ ¿ ¿ ¿ ½ ½ ¼ ¼ ¹ ¹ ¸ ¸ · · ¶ ¶ ´ ´ ± ± ° ° ¯ ¯ ® ® ¬ ¬ © © ¨ ¨ § § ¦ ¦ ¤ ¤ ¢ ¢     Ÿ Ÿ Ï Ï gg¸¸‚‚®®­­••rrMM&&ÿÿÝݼ¼€€ggOO::''÷ ÷ ê ê ß ß Ô Ô É É À À · · ¯ ¯ § §     š š ” ” ‰ ‰ … …   | | w w u u p p n n i i g g d d a a _ _ ] ] Y Y W W U U R R P P O O M M J J H H G G E E B B @ @ ? ? > > < < 9 9 7 7 6 6 5 5 2 2 1 1 / / . . , , * * ( ( ' ' & & % % " "                                   ÿ ÿ ý ý ü ü ù ù ø ø ÷ ÷ ö ö ô ô ò ò ð ð ï ï î î ì ì ê ê è è ç ç ç ç å å å å â â á á ß ß Þ Þ Ý Ý Ú Ú Ù Ù × × × × Õ Õ Ô Ô Ñ Ñ Ð Ð Ï Ï Î Î Ì Ì Ê Ê È È Ç Ç Æ Æ Ä Ä Â Â À À ¿ ¿ ¾ ¾ ½ ½ º º ¹ ¹ · · ¶ ¶ µ µ ² ² ± ± ¯ ¯ ¯ ¯ ­ ­ ¬ ¬ © © ¨ ¨ § § ¦ ¦ ¤ ¤ ¢ ¢     Ÿ Ÿ ž ž š š ™ ™ — — — — • • ” ” ‘ ‘ Ž Ž Œ Œ Š Š ˆ ˆ ‡ ‡ † † … … ‚ ‚   ~ ~ } } z z y y w w w w u u t t q q p p o o n n l l j j h h g g f f f f d d b b ` ` _ _ ^ ^ ] ] \ \ Y Y X X W W U U T T Q Q P P O O N N L L t t ° ° Ì Ì Ô Ô Ò Ò Í Í Ä Ä ¹ ¹ ¯ ¯ ¥ ¥ ™ ™ ‡ ‡   w w o o h h d d ^ ^ X X T T O O I I F F A A > > 9 9 7 7 2 2 / / - - ) ) ' ' % % ! !                             ÿ ÿ þ þ ü ü ù ù ø ø ÷ ÷ ö ö ô ô ñ ñ ð ð ï ï í í ì ì ê ê è è ç ç ç ç æ æ ä ä â â à à ß ß Þ Þ Ü Ü Ú Ú Ù Ù × × × × Õ Õ Ô Ô Ñ Ñ Ð Ð Ï Ï Í Í Ì Ì Ê Ê È È Ç Ç Æ Æ Å Å Â Â Á Á ¿ ¿ ¿ ¿ ¾ ¾ ¼ ¼ º º ¸ ¸ · · ¶ ¶ µ µ ² ² ± ± ¯ ¯ ¯ ¯ ­ ­ ¬ ¬ © © ¨ ¨ § § ¦ ¦ ¥ ¥ ¢ ¢ ¡ ¡ Ÿ Ÿ Ÿ Ÿ œ œ ™ ™ ˜ ˜ — — – – ” ” ’ ’ ‘ ‘ Ž Ž Œ Œ Š Š ˆ ˆ ‡ ‡ † † „ „ ‚ ‚ € €     } } | | y y x x w w v v u u r r q q o o o o m m l l i i h h g g g g f f d d b b a a _ _ ^ ^ ] ] Z Z Y Y W W W W V V T T R R P P O O O O M M L L I I H H G G F F D D B B A A ? ? ? ? = = < < : : 8 8 7 7 6 6 4 4 2 2 1 1 / / / / . . , , * * ( ( ' ' & & % % " " ! !                                       ÿ ÿ þ þ ý ý   M M … … ž ž ¦ ¦ ¢ ¢ š š … … x x m m b b W W M M D D 9 9 1 1 * * " "         ÿ ÿ ú ú ÷ ÷ ò ò ï ï ê ê ç ç å å á á ß ß Ü Ü Ù Ù × × Ô Ô Ñ Ñ J J   ––££´´ÏÏöö¯¯¼¼ööGG  üüWW®®ÿÿKKÐÐ  AAtt¡¡ÊÊðð  4 4 P P l l ‚ ‚ ™ ™ ® ® À À Ñ Ñ ß ß í í ù ù       ( ( / / 6 6 < < @ @ F F H H M M O O R R U U W W X X Y Y \ \ ] ] ] ] ^ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ^ ^ ] ] Ý Ý   88OOhh‹‹»»ww„„¾¾  cc¾¾jj¸¸FF„„¿¿óó$$PPxxžž¿¿ßßúú  , , A A V V g g w w † † ’ ’ Ÿ Ÿ © © µ µ ¾ ¾ Æ Æ Í Í Ô Ô Ù Ù ß ß ä ä è è ê ê ï ï ñ ñ õ õ ÷ ÷ ø ø ú ú ü ü þ þ þ þ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ þ þ þ þ ý ý ü ü ú ú ù ù ù ù ÷ ÷ ÷ ÷ ÷ ÷ ö ö ô ô ò ò ñ ñ ð ð ï ï ï ï î î í í ê ê ê ê é é è è ç ç æ æ å å â â á á à à ß ß Þ Þ Ý Ý Ú Ú Ú Ú Ø Ø × × × × Õ Õ Ô Ô Ñ Ñ Ð Ð Ï Ï Î Î Í Í Ì Ì Ê Ê È È Ç Ç Æ Æ Å Å Ä Ä Á Á À À ¿ ¿ ¿ ¿ ½ ½ º º ¹ ¹ ¸ ¸ · · ¶ ¶ µ µ ´ ´ Î Î õ õ % % V V † † Ð Ð ' '   ¤ ¤ § § ˜ ˜   b b D D & &   ê ê Ð Ð · · Ÿ Ÿ ˆ ˆ u u a a O O ? ? 0 0 " "     þ þ ô ô é é á á Ø Ø Ð Ð É É Â Â ½ ½ ¶ ¶ ° ° ª ª § § ¡ ¡ ˜ ˜ • • Š Š ‡ ‡ „ „ € € ~ ~ | | x x v v t t q q o o m m l l i i g g f f e e b b ` ` _ _ ] ] \ \ Y Y W W W W U U T T Q Q O O O O M M L L J J H H G G F F E E B B A A @ @ ? ? > > < < : : 9 9 7 7 7 7 6 6 4 4 2 2 0 0 / / / / . . , , * * ( ( ' ' ' ' & & $ $ " " ! !                                           ÿÿþþýýüüùùøø÷÷÷÷ööôôòòððïïïïîîííììééèèççççææääââààßßßßÞÞÜÜÚÚÙÙ××××ÖÖÔÔÒÒÑÑÐÐÏÏÎÎÍÍÊÊÉÉÈÈÇÇÆÆÅÅÄÄÂÂÀÀ¿¿¿¿½½¼¼ºº¹¹····¶¶´´²²±±°°¯¯®®­­¬¬©©¨¨§§¦¦¥¥¤¤¢¢  ŸŸŸŸžžœœšš˜˜————––••’’‘‘ŽŽŠŠ‰‰ˆˆ‡‡‡‡……„„‚‚~~||zzyyxxwwvvuuttqqppoooonnmmlliihhggggeeddbbaa``__^^qq’’¹¹ÌÌÒÒÒÒÏÏÇÇÀÀ¸¸¯¯§§  ˜˜’’ŠŠ††yyuuoollggdd__\\WWUUQQOOLLHHFFDD@@??==9977664411//..,,**((''&&$$""        ÿÿþþüüûûûûøø÷÷÷÷ööóóóóòòððïïïïîîììëëêêèèççççääããããââààßßÞÞÜÜÛÛÚÚØØ××ÖÖÖÖÓÓÓÓÒÒÐÐÏÏÎÎËËËËÊÊÈÈÇÇÆÆÄÄÃÃÃÃÂÂÀÀ¿¿¾¾¼¼»»»»ºº····´´³³³³²²¯¯¯¯¯¯¬¬««««ªª¨¨§§¦¦¤¤££¢¢  ŸŸŸŸžž››››šš˜˜——––””““““ŽŽŒŒ‹‹ŠŠˆˆ‡‡††„„ƒƒƒƒ‚‚~~||{{zzxxwwwwvvttssrrppoooooollkkkkjjgggg££„„ðð__88__‡‡³³ßß//SSvv––´´ÐÐëë..@@SSccrrŒŒ——££¬¬··¿¿ÇÇÎÎÔÔÛÛßßääêêîîððôô÷÷ûûüüÿÿ                              ÐÐ{{˜˜ˆˆÇǹ¹ÉÉçç  77cc‹‹´´ÜÜ##CCbb||——®®ÄÄØØëëüü  **77CCLLWW``hhppww~~ƒƒˆˆŽŽ““——ššžž  ££§§¨¨««««®®¯¯¯¯²²³³³³³³³³´´´´´´´´´´´´´´´´³³³³³³³³³³²²°°°°¯¯¯¯®®¬¬¬¬««««ªª¨¨§§§§¦¦¦¦¤¤££££¢¢  ŸŸžžžžœœ››››˜˜——————””““““’’ŽŽŽŽŒŒ‹‹ŠŠˆˆ‡‡‡‡††„„ƒƒ‚‚€€~~||{{{{zzxxwwvvttssssrrrrppoonnllkkkkjjhhggffddddccbb``__^^\\\\[[ZZXXWWWWVVTTSSRRPPOOOONNLLKKJJJJHHGGFFDDCCCCBB@@??>>>>;;;;::8877776633333300////..,,++++**''''&&$$####""          ÿÿÿÿþþûûûûûûøø÷÷÷÷ööôôóóóóóóòòððïïîîîîëëëëêêèèççççææääããããààßßßßÞÞÜÜÛÛÛÛÚÚØØ××××ÖÖÔÔÓÓÓÓÒÒÏÏÏÏÎÎÛÛïï  <<WWoo””ÀÀÔÔØØÓÓÊʼ¼¯¯ŸŸ‚‚ssgg[[OOCC88..$$  þþ÷÷òòëëææààÜÜ××ÓÓÏÏËËÇÇÃÿ¿¼¼ºº··³³°°¯¯««¨¨§§¤¤££ŸŸŸŸœœ››˜˜——––““’’ŽŽ‹‹‹‹ˆˆ‡‡‡‡„„ƒƒƒƒ€€||{{{{zzxxwwvvttssssssppoooonnllkkkkjjggggffddccccbb``____^^\\[[ZZXXXXWWVVVVSSSSRRPPOOOONNLLKKKKJJHHGGGGFFCCCCBB@@@@??>>>>;;;;;;887777664433332200////..,,++++**((''''&&$$####""        ÿÿþþþþûûûûûûøø÷÷÷÷ööôôôôóóóóóóððððïïîîîîëëëëëëèèççççææääääããããààßßßßÞÞÜÜÜÜÛÛÚÚÚÚ××××××ÔÔÓÓÓÓÒÒÒÒÏÏÏÏÏÏÌÌÌÌËËÊÊÊÊÈÈÇÇÇÇÄÄÃÃÃÃÂÂÂÂÀÀ¿¿¿¿¾¾¼¼»»»»ºº¸¸····¶¶´´³³³³²²°°¯¯¯¯®®¬¬««««ªª¨¨§§§§¦¦¤¤££££¢¢¢¢ŸŸŸŸŸŸœœ››››ššššnn((××''ÍÍwwOOCCKK[[qq‹‹¥¥ÁÁÛÛóó  ##CCgg©©¿¿ÑÑßßëëõõýý  ##''++//3366::;;>>@@CCDDFFGGHHJJKKKKNNNNOOOOOOOOOOPPOOPPOOOOOOOOOOOOOOOOOONNLLLLKKKKKKKKJJHHHHGGGGÝÝ==éé••EE))??WWqq‰‰££»»ÑÑççûû  !!11AAOO]]iiww‹‹••¥¥­­µµ»»ÁÁÇÇÍÍÑÑÕÕÙÙÝÝááããççëëííïïññóóõõõõ÷÷÷÷ùùùùûûûûûûýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýûûûûûûûûùùùùùùùù÷÷÷÷÷÷÷÷õõõõõõóóóóóóññññïïïïïïííííííëëëëééééççççååååååããããááááááßßßßÝÝÝÝÛÛÛÛÙÙÙÙÙÙ××××ÕÕÕÕÓÓÓÓÓÓÑÑÑÑÏÏÏÏÍÍÍÍËËËËËËÉÉÉÉÇÇÇÇÅÅÅÅÃÃÃÃÁÁÁÁ¿¿¿¿¿¿½½½½»»»»¹¹¹¹¹¹····µµµµ³³³³±±±±±±¯¯¯¯­­­­««««««©©©©§§§§¥¥¥¥££££££¡¡¡¡ŸŸŸŸ››››™™™™————••••••““““‘‘‘‘‹‹‹‹‰‰‰‰‡‡‡‡‡‡…………ƒƒƒƒ}}}}{{{{yyyyyywwwwwwuuuussssqqqqoooooommmmkkkkiiiiiiggggeeeeccccccaaaa______]]]][[[[YYYYYYWWWWUUUU[[eess‰‰‹‹‰‰……}}{{wwuuqqmmkkggeeaa__]]YYWWUUSSQQOOMMKKIIGGEECCCCAA??==;;;;9977775555331111////--++++++))''''%%%%####!!!!              ÿÿÿÿýýýýûûûûûûùùùùùù÷÷÷÷÷÷õõõõóóóóóóññññññïïïïííííëëëëééééééççççççååååããããááááááßßßßÝÝÝÝÝÝÛÛÛÛÛÛÙÙÙÙ××××ÕÕÕÕÓÓÓÓÓÓÑÑÑÑÑÑÏÏÏÏÍÍÍÍÍÍËËËËÉÉÉÉÇÇÇÇÇÇÅÅÅÅÅÅÃÃÃÃÁÁÁÁ¿¿¿¿¿¿½½½½½½»»»»¹¹¹¹········µµµµ³³³³±±±±±±¯¯¯¯­­­­­­««««©©©©©©§§§§§§¥¥¥¥££££££¡¡¡¡ŸŸŸŸŸŸ››››››™™™™——————••••••““““‘‘‘‘‘‘‹‹‹‹‰‰‰‰‰‰‡‡‡‡‡‡…………ƒƒƒƒƒƒ}}}}}}{{{{yyyyyyyywwwwwwuuuussssssqqqqoooooooommmmkkkkiiiiiiggggggeeeeccccccaaaaaa____]]]]]]GG##øøÉɘ˜ii99  &&11>>JJWWddpp{{††››¤¤¬¬µµ½½ÄÄËËÑÑ××ÝÝââççììððôô÷÷úúýý      ++77CCOO[[ggww‰‰››§§©©©©§§££——‘‘‹‹……{{wwqqkkggcc__[[WWSSOOKKIIEECCAA==;;99775511úúÑѤ¤wwII00%%""%%++33<<EEOOYYaajjss{{‚‚ˆˆ••››¡¡¦¦««¯¯´´¸¸»»¿¿ÂÂÅÅÇÇÊÊÍÍÎÎÑÑÒÒÔÔÖÖ××ÙÙÚÚÛÛÜÜÝÝÞÞßßßßßßààààááááââááââââââââââááááááááááááááààààààßßßßßßÞÞÝÝÝÝÝÝÜÜÜÜÛÛÛÛÚÚÚÚÙÙÙÙØØØØ××ÖÖÖÖÕÕÕÕÔÔÓÓÓÓÒÒÒÒÑÑÐÐÐÐÏÏÏÏÎÎÍÍÌÌÌÌËËËËÊÊÉÉÈÈÈÈÇÇÇÇÆÆÆÆÅÅÄÄÃÃÃÃÂÂÁÁÁÁÀÀ¿¿¾¾¾¾½½½½¼¼»»»»ºººº¸¸¸¸····¶¶µµµµ´´³³²²²²±±±±°°¯¯¯¯®®­­¬¬¬¬««««ªª©©©©¨¨¨¨§§¦¦¥¥¤¤¤¤££££¢¢¡¡¡¡  ŸŸžžžžœœ››››šššš˜˜˜˜——––––••••””““““’’’’ŽŽŒŒŒŒ‹‹ŠŠ‰‰‰‰ˆˆ‡‡‡‡††…………„„„„ƒƒ‚‚‚‚€€~~~~}}||||{{{{{{zzzzyyxxwwwwvvuuuuttttssrrrrqqqqppoooonnmmlllllljjjjiiiihhggggffffeeddddccccbbaaaa``____^^]]\\\\[[[[ZZYYYYXXXXWWVVVVUUUUTTSSSSRRQQQQPPPPOONNNNMMMMLLKKKKJJIIHHHHGGGGFFEEEEDDCCCCBBBBAA@@@@????>>====<<<<;;::::99998877776655554444332222111100////....0055::@@DDEEEEEEDDBBAA??==<<::886655332200//--,,++))((''&&%%$$""!!                ÿÿÿÿþþýýýýüüüüüüûûûûúúùùùùøøøø÷÷÷÷ööööõõôôôôóóòòòòññññððïïïïîîîîîîííììììëëêêêêééééèèççççææææååååääääããããââááááààßßßßÞÞÞÞÝÝÝÝÜÜÜÜÛÛÛÛÚÚÙÙÙÙØØØØ××ÖÖÖÖÖÖÕÕÔÔÔÔÓÓÓÓÒÒÑÑÑÑÐÐÐÐÏÏÏÏÎÎÎÎÍÍÍÍÌÌËËËËÊÊÊÊÊÊÉÉÈÈÈÈÇÇÆÆÆÆÅÅÅÅÄÄÄÄÃÃÃÃÂÂÂÂÁÁÀÀÀÀ¿¿¿¿¿¿¾¾½½½½¼¼¼¼»»ºººººº¹¹¸¸¸¸····¶¶µµµµµµ´´´´³³²²²²±±±±±±°°¥¥••€€kkTT==00**(()),,//4488>>BBGGKKPPTTWW[[__bbeehhjjmmoorrttvvwwyyzz||}}~~€€€€‚‚ƒƒ„„„„………………††††‡‡‡‡‡‡‡‡‡‡‡‡ˆˆˆˆ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡††††††††††………………„„„„„„ƒƒƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~}}}}}}ttffTT@@,,ûÿûÿöÿöÿöÿöÿ÷ÿ÷ÿûÿûÿÿÿÿÿ !!%%)),,00336699;;==@@BBDDFFGGIIKKLLMMNNOOQQQQRRSSSSTTUUUUVVVVWWWWWWWWWWXXXXXXXXXXXXXXXXXXWWXXXXWWWWWWWWWWVVVVUUVVUUUUTTTTTTTTSSSSSSRRRRQQQQQQPPPPOOOOOONNNNNNMMMMLLLLLLKKKKJJLLNNQQUUYY[[[[[[[[ZZYYXXVVUUTTRRQQPPOONNLLLLKKIIHHHHGGFFEEDDCCBBAA@@@@??>>>>==<<<<;;;;::999988777766665544443333222211110000////....----,,,,++++++**))))))((''''''&&%%%%%%$$######""""""!!  ÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿýÿýÿýÿýÿüÿüÿüÿüÿüÿüÿûÿûÿûÿûÿúÿúÿúÿúÿúÿúÿùÿùÿùÿùÿøÿøÿøÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿõÿõÿõÿõÿõÿõÿôÿôÿôÿôÿôÿôÿóÿóÿóÿóÿòÿòÿòÿòÿòÿòÿñÿñÿñÿñÿñÿñÿðÿðÿïÿïÿïÿïÿïÿïÿîÿîÿîÿîÿîÿîÿîÿîÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿíÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿëÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿéÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿèÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿæÿçÿçÿéÿéÿëÿëÿîÿîÿðÿðÿóÿóÿöÿöÿùÿùÿûÿûÿÿÿÿÿ  ýÿýÿñÿñÿäÿäÿ×ÿ×ÿÏÿÏÿÊÿÊÿÇÿÇÿÆÿÆÿÅÿÅÿÅÿÅÿÆÿÆÿÇÿÇÿÈÿÈÿÉÿÉÿÊÿÊÿÌÿÌÿÍÿÍÿÎÿÎÿÏÿÏÿÐÿÐÿÑÿÑÿÒÿÒÿÒÿÒÿÓÿÓÿÔÿÔÿÕÿÕÿÖÿÖÿÖÿÖÿ×ÿ×ÿØÿØÿØÿØÿÙÿÙÿÚÿÚÿÚÿÚÿÛÿÛÿÛÿÛÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÝÿÝÿÝÿÝÿÝÿÝÿÞÿÞÿÞÿÞÿÞÿÞÿßÿßÿßÿßÿßÿßÿßÿßÿßÿßÿàÿàÿàÿàÿàÿàÿàÿàÿàÿàÿáÿáÿàÿàÿàÿàÿàÿàÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿáÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿáÿáÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿâÿÝÿÝÿÕÿÕÿÌÿÌÿÁÿÁÿ¶ÿ¶ÿ«ÿ«ÿ ÿ ÿšÿšÿ—ÿ—ÿ–ÿ–ÿ—ÿ—ÿ˜ÿ˜ÿ›ÿ›ÿÿÿ ÿ ÿ¢ÿ¢ÿ¥ÿ¥ÿ¨ÿ¨ÿ«ÿ«ÿ­ÿ­ÿ°ÿ°ÿ²ÿ²ÿµÿµÿ·ÿ·ÿ¹ÿ¹ÿ»ÿ»ÿ½ÿ½ÿ¿ÿ¿ÿÀÿÀÿÂÿÂÿÄÿÄÿÅÿÅÿÆÿÆÿÈÿÈÿÉÿÉÿÊÿÊÿËÿËÿÌÿÌÿÍÿÍÿÎÿÎÿÏÿÏÿÐÿÐÿÑÿÑÿÑÿÑÿÒÿÒÿÓÿÓÿÔÿÔÿÔÿÔÿÕÿÕÿÕÿÕÿÖÿÖÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿØÿØÿØÿØÿÙÿÙÿÙÿÙÿÙÿÙÿÚÿÚÿÚÿÚÿÚÿÚÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÞÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÜÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿ×ÿ×ÿÙÿÙÿÛÿÛÿÝÿÝÿàÿàÿâÿâÿäÿäÿåÿåÿåÿåÿåÿåÿäÿäÿäÿäÿãÿãÿâÿâÿâÿâÿáÿáÿsonic-visualiser-3.0.3/samples/clap.wav0000644000000000000000000005715413111512442016252 0ustar 00000000000000RIFFd^WAVEfmt D¬ˆXdata@^÷ÿ Íþtý•þû£8ûk%%ŒX3*ýtý!•%šýtùtùÛûþòþ¶ýßø¨ôk÷¶÷ßü•Û¨ôéòÖ¿ù¿ñpþbÍkfb3û•ðŒ !tùOéTâF×PÉYÛí 9ÿ?*!!÷TâTò 2ûFÍ!f&±Òåžúº(a-}#à *ùtýéò•ðôYÛòÔüæ¨ôéòòÔPÉ*ñ•þAî£ëš •33ûäÿ*  kp ±X b*ýkûk÷*ùžúµ3X±¬ í pôOé¿ñÖîÍìTòÒåàyê=õô¶÷Œpþkí í * * à ptù¨ôžúKø¶÷FÍíý%üp±AJ3±T¬ . Íßþ3ûßø*ùTú¶÷tùpþÛf=õ!÷äÿ3üÖAb ¶ûßøKø•üÑÿÖ%ü¶û~•à µ±ßøý±±Ûÿfö¿ùkkžŒbÿý%AÍ!÷J¶ûßøßøøk÷ßü%!8bÿºüüûßüÑÿÖÍ!íý•øk÷¶ûFš Ítÿ¬ÛȬÖ%ŒÑÿ/ýtý•þýTúøßøpüšýOÿFžûkÞ‡ÿºüéúpþÖ÷ÿJ*ý‚þfk%FÛûKü¶ûºütýÿšýTú¶÷tù=ÿŒŒíý3ûéúžútùÒõ]°6* ŸÒTâ‚¬í‚ ¬  ßûéúºþµkš . ßþ¬ÿ¬ Öžú ú¶J•þ3ûKø¶÷TúýßüžµÿKüükû úý¬ÿT¬•ük÷ºþbk úºüXÛý%üí¶ýX . bÿ3ûÛý kŒbÛÛû*ù*ý3‡ÿÿÛ±týºü¬ÿ¨þ•øpü£Tú=õKøßü¶û*ù*ùžúßøkûOÿ¶ýfÖà ÷fkFµ¬÷Œ÷žòþÑÿbÿ%%pÈÑÿAßþéú úþþ]þÈÍþtýòþ•ü*ù¿ùOÿŒ¬ÿFÛ8ÿOýÈFŒþ‡ÿµÍOÿøßøòþ òþ±F3!!Af%µfFéÿékßüžú%üÿ‡ÿšýTútùßüºü úéúòþfk¬kÖ. * !û!÷ÿTúTúßüû•ø3ûÛýTú3û%üÛûžb÷µŒJfÛ!kpßükû*ùtùíýºþ]þ•øø¬ÿf*ÿ•þy÷ÿÑÿ!fépAý÷ÿf/šÿ±A¶ý¨þšÿýtýkk¶ýXfOÿšýûJûÛüJþý¿ù/µfÃŒ÷•þ¶ûšÿµÖtýü*ýûbÿOýkû£ŒFû± *ÿOÿOÿ*ÿ¿ÿ Íþ•ü•üÛý%þšýßüíýŒ/X%¿ÿ]þšýbÿŒšÿ¨þbÿtý3ûäÿÛÖf±ßþOÿbÿ•þòþpþ¶û%ü‡ÿÈyäÿ y~žÿÿ/Jþ%þXOÿšý¨þÃ%ÍÖÛJT3!Ñÿäÿ£=ÿüÛûOýòþÑÿ£f÷ÿ¶ûý±~/Èpíý•øý÷J%ü‚þJAp•ü•üT~f‡ÿÛAbßþtùéúþíµ=ÿ3û•üÈÖû¬ÿÃfÈ]þéú¶û%þ%þýßþ¶!Ñÿ*ÿ=ÿ¿ÿ%þºüÈý¨þû!͵ŒûÃÑÿÛûÛýXfíŒ÷ÿ%þºþ÷ÿÿAŒ*ÿ/F!8þ3ûtý¬ÿÛýpþOýéúÈýÿ¨þÿþ%þ/Û/A¶týûtýbÿTOÿ‡ÿûšÿyÑÿf%%fOÿòþ¨þJþ%þÛý=ÿäÿþ=ÿ yOÿ•ü%ü¿ÿ!ûšýäÿ=ÿbÿkX±ÃbÿtýÛûžúOýytÿû!ºüpüžÖ=ÿOýfµAtýþ]þºþOÿÍþ•üA•±ûÛfA3kFŒ pþ‡ÿÃŒkFÈOÿJþÖTßø•ð¿ñðüæð%èšÙéò¬±àüÆ*á‡tQÿV•øƒÜà °69 2Ûžú!÷¶ûÖîòԨĹÀYÛ*ášÙàOý]T"a-a-‡ ‡ÿûíýk÷¿ñ¿ñ¨ô úA‡.].*!¬šýéò=õOýßß•øðôû•Té£ë%èTâƒÜ¨äôÖök÷•b~óAî‚þJšÿû¨þ~ßø¨ô úÑÿþ¶÷±à ¿ÖA¬+º(}#±Œ3AtÿÍìüæTâ¬Ý¬Ýà£ëø¶÷*ùkkÖ•šÿ•¿• ]3µKøOéüæ£ëÖîkû3û*¬ !Aôðkû3Ûí *ÿ8þéú¿ñ¶÷¨ôAîKøpü . ** b*ÿk÷Tò£ëOéTòÍþÈA±kÈý%Fk÷tùfö*ñfößø¶÷Tú¶k÷¿ñXX ÖøéútùÍþ ]kûéúþFÛÛÛ‡ÿpJÛp* •ðOé¬í¿ñ¬íÒå*áTâüæAîÍì£ëÖöfö•ø]A¬í Œfö£ëTò3ûkû*ÿ §Dÿ?‡a-+•š k÷OéüæüæÒåÒõÒõ~ã%èFb*ù¿ñ~óšýäÿûÖ. Œýôk÷¿ÿÖ ¬ Ö•. 8Û¬  ŒßJûÿß!ÒõÒõ¶÷¶÷¿ù•ü¿ñ¨ä%è•ø8þ~óÒåÒåüæ¨äüæyê*áPÉÀ¨ÄŸÒOéT"SB]4º(a- Œ‡Ö3.f&f&*!*!‡¬ TÖÖ]f&Ö•¬ ¬ ßü£ëð•ø¿ùôð ú•þOééòtÿ¬íÒõükïyê£ëOéAîX 3‡ÿéò3ûµÿ¶÷Køßø¿ù¬ .k/¬ 3Œí ‡¿p¶÷£ëðüæTâ•ðpüéòkïí‡ÿéútÿþÒõ¿ù!Öºüßø*ñÛfðôüßø¿ñ¶÷üÖ•÷%þ¿ùTúü=õtùTšý¨ôkûAßbþ¿ÿà Jk* ‡Û]]ÛAbí X Û. . ±•üšý/X‡ÿ¶÷Òõkûtýéúföô=õ=õôföTúýtù¿ñ~ók÷!÷éA3í . ••Œà  X ¬FŒX  *]‚ X Ö¬ kkí JßÖTýkŒJ*ýôÍìüæà¨ä•ð•ðyêÒå¨äOéTòkûýžúéòô]ŒAøÒå~ãôtù*ùKüô£ëƒÜ±¶– PÉOýTâ£Ë÷ÍŸÒ±§DdSB}#AX 2]4 §$XXí JT.±* }#µ/]4]4]4}#•ßà Ítùßø•fÛ*ý£ëYÛòÔüÆÀ¨Ä¨Ä÷ÍŸÒ£ËòÔàTâYÛàyê!÷ŒX . ‚  Ö±f&µ/ 2µ/f&XÛ T".•ôyêÖîfötùø*ñTâÖÞOéðyê%èÍìÒå¬ÝšÙòÔƒÜTâüæ•þkÖšÿûÖöÖöºþÖkÖT±‡*‚Öµ/]4º(X‡Û3‚ JJ µ•ðkïéòkï%èOéOéTâÖÞ%èÍìüæ%è%è%è£ëyê%è£ëôÒõ3ûÖFÒõ¿ñ•ü±¬]Tí Ökí ‚ . ±.. £b•ÍÍOýý鬵Œ%üOýbÖÈýfö‡ÿÛfö3û‚ •Oý=õtùÑÿ÷* A‡3à ŒA3ûÖîÒõ£ë¨äföÍø%•£ëüæéòÖöÍìô% ú¿ùyüOéÖöbôOÿ. £ºüí TÍÖ¬ ¶ûAš *ýòþ. Œ~óTò=õ~ó¨ô3X ¶ýföôfößþºüTòÍìyêÒõA‚T¬Akk‡kµ•ÍAÛ*Jì * !bb3ûk÷XtýÑÿ. Œ!í ±ÖJ±=õÒõpük•%k÷ŸÒKÐ3ÌLôŸÒXbKÐÖÞ ¬%£X í püÍì¿ñk÷ýtùyê¨äTâòÔKÐ%è‡k‡ÿ‡*ñ¿ñk±‚¿ýTò¶÷tùµ‡ÍŒßkÛûûb=õ/J/ÛÍýk÷fX òþéúÒõ=õFké* ¿ù•ø=õÖîüæÒå=õF¿ùŒA•ðð!÷Ûû‡ÿ.  Íéú úÛû8þßøð=õOÿAbû‚ ‚‚‡ÖÖ3X.¿•kµ~ÖßTú•øÖîOéAîÍìOéOékï¬íyêyêOéÍì=õºüÿ]þºüºüÈ!ßJ!. ¬ * ÷Ö÷pþéúOýüžúüíýûÈýÖp. š ‚ •*¬ X •A!š !ŒÛû¨ôAîkïTòÍìüæ£ë¶÷%þtù*ñÒõtÿFûJí *¬k. F8þÈýKø=õfö!÷¿ñô¶÷•ø¨þþOý!í í ‚  í ‚ ¿¿. Û¬ÿ±pü*ùfö¿ñÖîð~óKø8þ~¿ÿpütýíŒí ¬ JÃÿéú¨ô•øk÷TòéòôÖî£ëk÷ŒÍ•š š ßš Ö••. ¬ * bµtý*ù*ù¿ùKü*ù¨ôô=õk÷pü8Í÷]þßø8þà . ßütÿÍþûKøôfötùfö*ùOý*ýéúéúpüý*ýºþbÿ]þ±š ‚ š µb¶éÛ8þ*ù•øþ£éòéòX Œ!à éú¶µ¶÷£ëÖ}#à ¨þàyê£=ÿüæ~ã~óßüý]*ùšÙ‡+X¨ä3ÌLX;~óJ}#£ƒÜéò¿ñföF×­½F׌®4³÷ +9]4Û+ÿ? tQtQXÌL¬=žúüæ!÷=õšÙÀ4³Œ®å©– ­½£Ë±¶*ᬠXµ/ÿ?tQVOI}#Öyê£ËòÔŒ•A=ÿ• +ÿ? 2]4a-.3š ºþ~ãšÙÖÞšÙüÆTÂüƨÄKÐÖÞTâÒåyêyêOéôkT"§$*! ‚ í à Öbš •*ù=õ¿ñyêüæ%è%èÒåyê£ë•ð£ÖXT".í ‚ ¬ š ¬ X Tšý•ø•ð£ëyêéòºþJbßÖÖ. pà •Œ±fžú%þXþ•øéú!bkûk*ýÿAk÷ ߬¬û*ù¿ñÍì%èyêÍì•ð útýÈýíbÍ  * ÖXpþÛûKøTútýÛûföfö3û ±é‡ÿ!]þ úTúŒFÛF‚þÍþ±bÿÖ%Í•JJŒ!AkÍÛ÷Ûÿºþßþ¶ûk÷Òõföô¨ôºü•þ¶ûûpüºþŒÛk ßµà X X µû!JXßþKü úíýOýøßøOýtý¶ûJtÿ¿ù=ÿŒX±š b~¬A* ‚ Jf]þþô•ð*ñÖîð¿ñÒõžúø¨ô!÷*ýû3¬ÿ‡ÿà . . ‚  š Jpßþpüž!È*ùéúÖ¶ûÖ. ÖÛûtý•à Íþb!òþJþyÿük÷ôÒõºþ¬ûžúpüû¬p%y¶÷ôtù~]þ¶÷föø •šÿ8þ3bš ¬ ¬ ߬¬%¿ÿfJ¬!÷*ñ¶÷tÿ3û¨ô=õ¿ù3û¬ÿJ¨þ ÛŒÑÿ!¬Ö/%ü•ø•ø•üOý¿ù¶÷]þÍ%f ÛTAJÍ!%ü*ùKø•øžú*ý¶ûéúÿÍÛff!Í. ÷ŒÛ•ûž%üfö=õûTúTò=õ!÷=õéòéòøòþ Íþ%Ítýà k¬ ÖÛX¨þ÷ÿÖŒtýûºþ8ÍÍb!£ûûû!!AAÖ¬ÿTéú¨ô¿ñéòÒõföfö¶÷tù•øk÷ ú8þTfûÛ¬pŒ±Oý¿ùKü±Ö¶%µ¬%Öš k¶ßüÈý/•þ*ù!÷Òõ=õ úKü3ûžú‡ÿkí X %fJŒAûºþKü3û úºüfßþTJ÷ûtÿšÿkÛ‡ÿtý*ýþbÿJíkþütýòþÈýKü•üéú*ùKø•øü*ÿÿ*ÿ¿ÿÛµkû±FÛfkûø ¬¶žúûäÿ!Ûk͵•þžµäÿ•ø3ûkbòþ úßøk÷!÷3ûÖ±‡ÿþ¶ûßüTJÃÖfkÛµkßþȱkûtù=õ=õ•ü•üéúýíÈ3ûšýf%ükûûTútùžúÛý!ßà •÷•‚  * û£!JJ/fJ•þÛýŒÖkÖbJk÷ÿKüÛû‚þFßþ*ù ú¨þfºü¿ùéúßþyJþ¶ýffF=ÿéútù¿ùø úßüKü*ùÒõÖö%üßüû•üßþ÷ÿ*ÿtÿÖÛkk=ÿÿýtùøTúJþ JþÛýÛ¬F¶ýÍþéšÿºüßüAOý*ùkûbûyFíOýbÿyJ!¬Ff÷ÿ*ýfA¿ÿA. pßü¶û¶ý8þšýpü¿ÿtùk÷fFÛÖûµ¬ŒÖ . Íäÿéúfö¨ô~óTò=õÒõéò¿ñ~óøû úºüXkkßÖJºþKøéúKüžúÛûšýpü ú¿ù úpüšÿÛûûf£‚þtÿ!=ÿ%þT3¶Œ•••Ö¬AŒ%±!Ö¶ÈXšýÛûpü%üKü3ûßøKø3ûÛýÛýÿ±£Û÷ÿû!÷!÷¶ûÑÿ÷ÿÑÿÛ!JŒ%Xµ÷ÛÖŒbÿÑÿ/ºþüšýŒtÿýpüßüÛûßü]þ‚þpþßüšýÖûéûÍbŒJ%JþžúßøKøéúKüÛýÑÿþ¨þ Oý¶ûºüšýºü‡ÿfpü¶ý±±òþšÿßþ3ûtùtùû8þ•ü‚þkŒ8þü*ýšýºü•üÿJßAfÛµ±ü úkû úßøKüÖbŒ÷ÿÖÍ%%Fž¶ýšý‡ÿýžúûÈýýòþÛ%Ík•T¨þ÷ÿ=ÿþÈý¶ûTúÛûtý ú¶÷tù3ûKüÍþÖÖ* à X X X . ŒÖšÿºü ú!÷¨ô¨ô=õø3ûßü¶ý±%ÛÖ±%¬Ö/Tútùûþÿpþ*ýtýAÛépþtÿÖfÛ3ûøéúpüKü%þ¶Íþßþ!ͱkXÿžúßø*ùTúTú úKütÿ ‚þ‡ÿÖÖÿ~•û/=ÿé±ÈŒkÍÖòþ¶ýfÖÖFÖ%þÛý¶ûKøÒõ!÷éúû*ùžúºþ±‡ÿ£Ûp¶püéú%þXÛÃ*ýtýòþòþßþÑÿT%Jµ¬Ík•þ%üýþšýßüüéúûüüþJþ*ýÈý÷ÿ‡ÿ=ÿ±£Í•±kÖ¬•í µ~žÖ•øÖöžú¶û•ø*ùéú*ùøTúšýšýéúpüÖí•!ÖkžA!Í%Ñÿtÿ‡ÿ•þÛýÍþ¶y¬ÿFk‡ÿ*ÿF÷pF!±Fû!bkÖütù3ûºü‚þžšÿÈýKü úKøßø3ûûßøžúÛÖfµ!Œíµ÷J‚þ úéú•øÖötùÛû%ü3û ú¿ùTúéúéúpü¬ÿJÃ=ÿ/¶Ñÿ*ÿ%FfäÿbÿbÿX!kAbÍk%ž*ýÃŒÿ•þÃyOýpþÑÿ¬ÿ/ òþOýkûûOýÈýûéúÛûéúpüŒ!ž¬ÿ¶Ff¿ÿ*ýKütýÿäÿÑÿý3ûpþíÖfFŒF8Í8£µ•%ßþšýtýKüžúkû%þ ÖpFäÿý•üJþäÿAOÿÿ±ÍfÃTþtùßøKø!÷•øtùü¿ÿÑÿFž•þTŒŒ£µ±•üéúéú ú ú¶ûšý‡ÿ÷ÿºþßþkµJÖÍŒš •ÖXÖäÿpü¿ùøtù%ü•þtÿòþKü¶ûfû‚þšýþÛý8þžf3ÿ¬ÿíµ£AŒûòþ%þbÿÿßüþû•%ÑÿäÿOÿ=ÿ÷ÿÿOÿ=ÿpüKø*ùOý‡ÿkkÛ÷p~ûJJÖFÛÑÿÍþ~yòþtÿ¬ÿþºüKüžúéúºüKükûKüÛý¶ýOÿÖÑÿšýüºüßþšýšýTûÛpfÖÍp͵!ßü úžúžú3ûüéú¿ù3ûíýtý=ÿŒÛÍpJAb!íÖ ÖûÍb±!JkÛ!Œÿ‡ÿšÿßü¶ûÛý%þÛûtù•ø*ùtù úºü¶ýÛû ú*ýßþíý%þ8þßüéúéúÛû¨þJŒ~Œ*ÿþºþ±ûTÖJ3±ÖÍff±•fAÖAÍAbXºüžú¶ûºükû¶û*ýÈýtý%þ¨þÿ±±Íþ¿ÿž±Œp•¶=ÿ‡ÿF¿ÿ•þšÿ•þýýþ*ýtýºþíýbÿ~Œ•¬8•üßøTúòþíûJ‡ÿßþþ¿ù¿ù•üšýºüOÿfíûpÍf¬ÿ*ÿTšÿ‚þ*ÿäÿf!kÍþšýûÍkApºþÛýÛýÈýßüßü*ýÛûTú úéú¶ûû¶ûpüºüûžúûßüßüšýA¿ÿÛ±b±ÃÑÿ•þ8AŒk8£ÍJ%A*ÿ¨þÈ•kŒ=ÿbÿ*ÿ•þÛý•üéúžúéú3ûkûÛû¶ûKü 3ûÍbbb¬b%͵!%k*ÿéú úû•ü•þ±F*ÿ%üéúºüÍþßþþ]þšýý*ýºüºüÛûtùKøßø¿ù úTú3ûßüòþ÷ÿX•Œ÷•b¬pkûJ3fÖ¬pµkp‡ÿ/¿ÿOýºüºü%üžú*ù¿ùžúßø ú8þXȶýKüþÖX÷ÿT8žòþòþšÿA¶kkÖÛkÛÖOÿ‚þ¿ÿ¬ÿ‚þpüûžú úûÛû¶û*ÿ ÖÍ÷pÖÛT‚þ*ýOýOÿ=ÿÛû%üûtùTú%üºüý8þòþy!ŒÛûJJppffFbÿOýKütý*ÿbÿºþšÿé8ÛµkŒ±Ö%3ÖžTÛ!Œkšÿ8þþ•þšýû ú*ù úû%üJþºþ%üÛýÖ£ífkF¶ÈŒÈýšý*ÿž±/f±T¶±ík!F¶ÛÛFÑÿbÿ¬ÿ=ÿJþ•þòþþOýßüßüíýòþÿ•þšýºü%üpü‚þtÿJþOýtýßþŒX÷ÿJþ*ÿ¶ÈTF±µ÷!¶¨þºü*ýºü*ýÍþ/ y *ÿòþÿOÿf!£pÖÖ!~•þéú¿ù3ûtù¿ùtýÑÿJþtýÿòþºüÛûšý8þbÿûéÛÛpÛÍ8šÿþšýþþßüü•üJþÿßþäÿÈÿOÿ =ÿ•þšýšý•þ¿ÿŒŒÖžéÖ¿ÿÍþOÿé8%Ã/k¨þ•üüpütýÍþ¨þ]þÍþÿ‚þ‚þÿ]þOýOý•þ‡ÿbÿºþJþÿž~Ãû%f8~38k‡ÿOÿ3žJþÿíFtýßüOýßü•üÈý•þ%þ]þäÿkJ÷ŒŒ±£k%kJT]þ•üûéúéúÛûtý8þþÍþ÷ÿÑÿ*ÿ÷ÿ¶ÛÛFtÿÈýÛýþºü*ýJþßþ¬ÿÃ~!ȶbÿ8þºþ=ÿßþ=ÿ¿ÿ*ÿ*ÿÿ‡ÿ£!Œ!~!ÖfAÑÿ¨þÿ•þ•ükû*ýOý%üßüþ8þJþžŒÖJ±µ%ÛÍbµAtýpüpüKüûÛûJþFfkpÍÛÖ±F%µ¶*ÿtý•ü•üßü%üéú3û*ýßþ ÖÛÖ±!yžyÈý úTúºüÿÑÿšýpüÈýßþÑÿžž û¶*ÿýý*ý¶ûKüßþ ßþòþÑÿOÿÛbŒ•pk%ÛfíÖÑÿ/XX ¨þ*ý%ü¶ûüOýpþÿÃJféATA=ÿtýºüþf]þJþ±!éFŒ!bÛŒ~é÷ÿòþ•þßþbÿ /=ÿ%þšýþßþ¨þÛýtýKüžú3ûßþ ÿòþyíkÍ!y é=ÿºü¶ûéúýAk%íÞÛfFFk3±=ÿ•þÿ•þtýüžúTúÛûšý¶ýJþtÿTyÑÿ¿ÿ3Œ±JÖ±étÿÃûJµ±ŒÛ~Öòþ%þÿ±Fäÿ*ý¶ûºü=ÿäÿÍþíý8þÛýý*ýßþ=ÿJþþ‚þOÿšÿ=ÿòþÿÑÿ!fJyOÿÑÿk±ÖÈŒT!ÈJJF¿ÿOÿ¬ÿ *ÿÛýíýtÿ]þíý‡ÿ¿ÿÿÈýºütýòþbÿÿ±fí/bÿ¿ÿ/Œ£JŒÍþšÿ%µŒX÷ÿOÿy Oÿ•þÈýšýþÈýtýÈý%þ=ÿéJffÿÖFp£Œ¿ÿ¨þ8þºþOÿ•þºüpüÈý]þ¶ýþtÿÿ¨þbÿ÷ÿšÿ*ÿ¿ÿFŒkÛŒéäÿòþ8þtýýšý¨þ¿ÿftÿOÿ3!Œ¶±!ÖÖÖ¶¿ÿßþ/A8þKüºüOýKüéú%ü*ÿkk±bŒÑÿ¿ÿ±¬ÿ=ÿAäÿ8þ*ýOýýOýºþŒ~!žk/¬ÿž%fäÿþšýtýßüßüýºü*ýþ*ÿÖ±k±FŒÃFXû/‡ÿ T=ÿ]þJþòþ k£Œ÷ÿšÿ¬ÿ¿ÿ=ÿ¨þÛýíýþÛý8þÿÍþ*ýtýþßþXÖûŒí¶~ûŒÿšý¶ýòþ‡ÿ=ÿºþ*ÿÃfÖŒ88/tÿ‚þšýšý8þÍþbÿäÿ±ÖTyTÖJJž÷ÿ¬ÿbÿOÿ=ÿ=ÿÿÿŒ¿ÿAfOÿºþ‚þpþ=ÿéX¿ÿpþJþ•þ•þ¨þ8þtýtýšý]þOÿ*ÿ‚þpþOÿbÿòþÍþßþ*ÿ‚þßü%ütýbÿAû±•%!%JpF±ÿAé÷ÿ]þýý*ýükûûKü¨þ÷ÿÿOýÛý=ÿ÷ÿA£tÿþšýpþ‡ÿ¬ÿ¿ÿF!yŒ%ûfJ%£ñûßþOý*ýýºüüûOýOÿ!ÖA//÷ÿ¬ÿäÿ ¿ÿÑÿTÃA=ÿÿ/FFûX!~%íÈéºþOýþºþ*ýOý¶ýšýJþ‚þ‚þºþÍþÿ‡ÿAkŒ!FF±Ö%f‡ÿOÿOÿbÿºþKütùßøTúéú3ûtýtÿÿþñJé÷ÿFÛ%!Œû±kF±yŒÿ*ýKü•ütýšýýý%þ‚þºþ‡ÿÃȱkµ!¶Ö±¿ÿºþíýšý‚þbÿßþÛýÍþ÷ÿ¿ÿšÿOÿbÿyí!éÖéûA¬ÿbÿÿÍþOÿšÿ•þ]þÿÑÿäÿž¶Œ%ûéû!±kÑÿ‚þšýßüKüKüýþpþtýKüºüÍþºþíý%þºþÈýtýÑÿJÖF¬ÿ‡ÿ÷ÿf%JFk%%!~!%Ȭÿþpþ]þþ•þtÿ¿ÿ=ÿ]þ¶ýÛýpþòþÿßþÿäÿÖŒ =ÿ%þšýÈýºþbÿ‚þÛý‚þtÿ¨þ%þßþšÿÃÛkÛk!Û~£û/÷ÿ÷ÿyÃäÿÿþ*ýý*ýýßü¶ýJþ¨þ‡ÿTÑÿ8þOýÛýÿûé±û3F3žy±fòþ8þÍþ¬ÿT Oÿ¿ÿ÷ÿOÿºþTFFŒFŒ¿ÿšÿ‡ÿ‡ÿäÿTbÿpþ¨þpþ‚þÿtÿ¬ÿ÷ÿäÿÿ‡ÿé3¿ÿ¨þ¨þ•þ*ýßüþÿÑÿ÷ÿ¬ÿûkTäÿ!íé¿ÿOÿOÿ*ÿòþ¿ÿéŒOÿbÿyÑÿbÿà !ÛÈ3/¬ÿ÷ÿTk ¨þšýOýšýÈý¶ýþšýtýºþ/Abÿbÿé8fÛÛ±!~¬ÿÍþºþºþþšý‚þ=ÿpþý¶ýÿ/X8%ûbÿ‚þpþ•þ‚þ•þÿÑÿAÖ¶fÖÖûûé/‡ÿ=ÿ*ÿ]þtýOýÛýþ8þ%þÛýÈýJþ‡ÿéX±Ñÿtÿ÷ÿû¶±äÿ*ÿÿbÿšÿÑÿA±ŒÖ¶£ûžŒAbÿpþ]þÛýKü¶ûßüºþäÿ¿ÿtÿ¿ÿ Oÿ•þpþ%þJþÿ ŒT¿ÿÑÿAA÷ÿ*ÿ]þ]þÿ¬ÿäÿÖ3ÃyžT¿ÿšÿ éÈÈûTŒž÷ÿbÿ¬ÿ‡ÿOÿ‡ÿšÿšÿA3Œ‡ÿOÿbÿtÿOÿÿÍþºþÿ¿ÿTf ¿ÿÑÿÑÿšÿ ÃéŒûké äÿ÷ÿOÿºþßþ=ÿ*ÿ=ÿÿJþšý%þ¬ÿ3X ‚þ8þ]þ‚þ8þOýOý‚þ÷ÿ/±k±fûíŒûž~ÛûŒé3ybÿ]þ%þpþ¨þßþ*ÿßþ¨þ*ÿßþJþpþÿÿpþ8þßþ¨þ8þÿäÿÿÈýpþ*ÿtÿäÿÃÃf‡ÿbÿ ÑÿOÿ¬ÿy¿ÿOÿ ûfTFfÖŒfíûÑÿ*ÿºþ•þßþÍþþOýOýšýÈý¶ýJþºþ]þ8þ•þÿòþºþºþ‡ÿ3fŒ88Œf£ûfOÿ]þíýJþOÿ¬ÿ*ÿÍþOÿ÷ÿ÷ÿ/ž±ŒŒ*ÿºþÿbÿ‡ÿ¬ÿ¿ÿ÷ÿÃéOÿ=ÿÿ]þJþ=ÿ¿ÿtÿ¿ÿfpþ¶ýšýšýòþÑÿ/±!T‡ÿ±ÈÛ!Œéûžäÿ‚þþºþ‡ÿšÿ¿ÿ÷ÿ¿ÿ=ÿ¨þ%þšý*ýÈýbÿT X~ž÷ÿé¶£ÈÈkkkÖ¿ÿ=ÿÿ•þÛý8þbÿäÿOÿºþÍþbÿOÿºþJþ]þßþtÿ¿ÿÑÿ÷ÿ äÿ/ûÚÿºþÿòþÍþ=ÿ¬ÿ‡ÿ=ÿtÿ/Ã!ŒŒfFûf~/bÿßþòþšÿšÿÿpþpþOÿ‡ÿpþšýºþAžAOÿbÿ / ÷ÿ/äÿtÿäÿûA=ÿ¬ÿA÷ÿÿ•þpþ]þpþÿ÷ÿŒyšÿ*ÿ÷ÿ3ÖÑÿ‡ÿ¿ÿy± ¬ÿ÷ÿäÿÖF3X£à fk£3ûûà OÿOÿ*ÿ‚þþþ¨þbÿ‡ÿOÿ=ÿbÿ¬ÿÑÿ÷ÿA Ñÿäÿ¬ÿ‡ÿbÿOÿšÿäÿšÿÑÿTf/bÿ%þOý¶ý¨þ=ÿšÿOÿòþÿ‡ÿtÿòþºþßþbÿ fÃFÛ%ûA¬ÿ¬ÿšÿšÿ žŒ äÿ¬ÿÑÿAäÿšÿ‡ÿ‡ÿÑÿŒÃ*ÿÈýšýíý%þ]þ¨þÍþòþòþOÿžXûf±Œ fûÖ± *ÿòþtÿÑÿOÿºþÍþ*ÿ¿ÿy±÷ÿšÿ¿ÿ¿ÿ*ÿ‚þßþšÿšÿòþ¨þºþßþÍþ=ÿ ÃÃA TŒf äÿ ¬ÿšÿA±äÿ*ÿ‡ÿyfÑÿ¿ÿff¬ÿÍþ¨þÿÿÍþ*ÿÑÿAA÷ÿ/±Tbÿÿbÿ¿ÿT±/ Té33éžžŒf¬ÿºþþºþtÿtÿ=ÿäÿ÷ÿ*ÿºþ=ÿžé!Ö/Öûf//äÿ¿ÿšÿ¿ÿATÑÿ*ÿòþòþ*ÿ=ÿßþÍþÿÿtÿšÿtÿÿ‡ÿŒfA±ŒAA ßþ8þßþ÷ÿ šÿšÿŒÖû!ÿÿ¬ÿ‡ÿÿpþÈýÛýÍþbÿbÿ*ÿ=ÿbÿtÿšÿyéFÖŒ/äÿÑÿ¬ÿÿÿ¿ÿŒž/äÿ T¬ÿ÷ÿfAšÿ‡ÿäÿÑÿpþßüßüþ]þ¨þ=ÿšÿšÿäÿŒ±ŒA ¿ÿ!8ŒŒÛŒ ¿ÿ=ÿOÿ¬ÿäÿÑÿ‡ÿ*ÿßþºþ]þ‚þ=ÿäÿAff/÷ÿäÿ/ÃéT÷ÿÑÿÑÿ ÷ÿÑÿ¬ÿtÿºþÛýtý¶ýþíý‚þOÿ¬ÿäÿ÷ÿ /±ûÃfT‡ÿtÿ¿ÿÑÿtÿbÿÑÿ÷ÿ=ÿÿÑÿžäÿOÿ‡ÿÑÿ¬ÿšÿ¬ÿOÿßþÿbÿÿ•þþšý%þÿÑÿAäÿAÖû!£3¿ÿfž/ÑÿÑÿäÿÑÿÑÿOÿòþòþßþ¨þßþOÿ=ÿÿtÿTéÃ/¿ÿšÿšÿtÿOÿòþ8þšýÈýpþ=ÿ / ÷ÿšÿbÿäÿ/y!!T¬ÿ¿ÿ÷ÿÑÿ*ÿ•þÿšÿ¬ÿ/yäÿOÿtÿ*ÿpþÿ¬ÿ Œûé±ÖÖ/¬ÿ=ÿÿ*ÿ¬ÿ÷ÿ÷ÿ¿ÿ=ÿßþ¨þ]þ8þ]þºþ=ÿ/!!y/¿ÿ¿ÿ÷ÿ¬ÿšÿäÿ Ñÿbÿ*ÿbÿ‡ÿÑÿyyÑÿbÿ‡ÿšÿ¿ÿT!¶¶Fžäÿßþ%þþ‚þºþÍþÿ¬ÿ fû££~ÃyT÷ÿšÿ‡ÿ*ÿ¨þÍþßþ•þ8þ%þºþ¿ÿTffy ÑÿA3±/AÑÿ¿ÿtÿÿOÿA¿ÿOÿOÿ¬ÿ ATŒÖÖ±Täÿšÿtÿ‡ÿ¿ÿ÷ÿ ÷ÿ¬ÿšÿÑÿ f±ÃûÖf ÷ÿ¿ÿ*ÿÿÿºþ8þJþºþÿOÿ*ÿòþÿbÿ¿ÿ TA//÷ÿ‡ÿtÿ¿ÿäÿ¬ÿtÿtÿ¿ÿäÿ÷ÿ Tž±žf ‡ÿšÿ±ÖyTžž tÿOÿ*ÿOÿ‡ÿšÿ÷ÿfžA÷ÿ‡ÿÿšÿAžÃ±ŒyfÑÿ¬ÿ*ÿßþÿ=ÿ*ÿ•þíý%þòþÑÿfÃ!FéžÃÖA÷ÿ÷ÿÑÿ¿ÿ¿ÿbÿßþ¨þºþßþòþ*ÿšÿ¬ÿ‡ÿ‡ÿšÿäÿ/T±ž bÿ*ÿ*ÿtÿÑÿäÿ Œéé±f ‡ÿ*ÿ¬ÿyÃtÿ*ÿ*ÿbÿ‡ÿbÿÿºþÿ¿ÿäÿäÿ¬ÿOÿòþÿbÿ¬ÿäÿA/äÿšÿ¿ÿTé3Öyyé!!!Ö/‡ÿ*ÿ*ÿ=ÿ*ÿÿtÿäÿ ÷ÿ¿ÿtÿ=ÿOÿÿßþÿ*ÿ=ÿtÿ‡ÿ‡ÿšÿtÿtÿ¿ÿ÷ÿ¿ÿ¬ÿ÷ÿfyATéû±yÃÃŒž±ŒÑÿÿÍþºþ•þ]þ•þÿšÿAÃû!ûŒ÷ÿšÿbÿÿ¨þJþþíýíýþ]þßþšÿ /±Fkk¶%í±éûF!žyf÷ÿ*ÿ‚þpþ•þ¨þJþJþ¨þòþ‡ÿfÃ/ ffÑÿOÿÿòþÍþ¨þ¨þÿ‡ÿÑÿbÿßþÿtÿ¬ÿ¬ÿÑÿ÷ÿ ŒÃÖÖÃyAT±Ã/tÿOÿtÿbÿšÿäÿ¿ÿšÿ¬ÿšÿ=ÿOÿOÿßþÿ=ÿÿ¨þ¨þßþÿOÿ¿ÿž~~!ééÃñ÷ÿOÿòþßþÿ‡ÿ¬ÿ¬ÿ¿ÿÑÿÑÿ¿ÿšÿ¬ÿÑÿ¿ÿšÿbÿbÿšÿÑÿ÷ÿAyyT ÷ÿ¬ÿòþ¨þ¨þºþºþßþÿ*ÿÿÿOÿbÿtÿšÿ¿ÿäÿäÿ¿ÿ¿ÿÑÿffTfžy fy¬ÿšÿÑÿ¬ÿ=ÿ*ÿ‡ÿÑÿ¬ÿ¬ÿ/ÃÃf/¿ÿOÿ=ÿ‡ÿtÿÿòþ=ÿšÿÑÿšÿ¬ÿäÿ¬ÿ¨þJþºþOÿÑÿ /÷ÿ¿ÿäÿAT šÿ*ÿòþÿ=ÿšÿÑÿ¿ÿäÿ÷ÿ÷ÿ¿ÿ‡ÿ*ÿßþÿOÿOÿ*ÿ*ÿbÿ¬ÿäÿfÖÃ/Ñÿ÷ÿ¬ÿÿÿšÿšÿtÿtÿ‡ÿšÿšÿšÿ‡ÿ¿ÿA ¬ÿ‡ÿšÿ¬ÿ¬ÿbÿÿÿbÿtÿ¿ÿ/žÃyAyÃÃTäÿ‡ÿ*ÿÿÿÿtÿ‡ÿtÿ‡ÿtÿ=ÿÿ*ÿbÿšÿ¬ÿ¬ÿbÿÿ*ÿÿ*ÿšÿ/ffž±±Œ÷ÿšÿbÿ=ÿ*ÿšÿ/fT/÷ÿšÿtÿtÿtÿ=ÿ=ÿ‡ÿÑÿ äÿšÿšÿšÿšÿäÿAžž/¬ÿšÿ¬ÿšÿšÿ¿ÿÑÿÑÿ¿ÿ¬ÿšÿbÿÿÿ*ÿ=ÿšÿTéXÛ¶X!± OÿÿOÿbÿ*ÿßþ‚þJþ]þ¨þOÿ¿ÿ¿ÿ‡ÿ‡ÿÑÿ Ažéûž šÿ=ÿÿÿOÿšÿäÿÑÿtÿ=ÿtÿ¿ÿ¬ÿbÿtÿÑÿT±ž/ÑÿÑÿÑÿÑÿÑÿ¿ÿÑÿ÷ÿÑÿÑÿäÿ¿ÿ‡ÿÑÿfyTAA ¿ÿ¿ÿ¿ÿ¿ÿäÿ¬ÿtÿ‡ÿ¬ÿ¿ÿ¿ÿšÿšÿ¬ÿ¿ÿ¬ÿ÷ÿAŒ3éyAÑÿbÿtÿäÿ//TTAA÷ÿ‡ÿtÿšÿ¬ÿ¿ÿ /äÿtÿtÿ¬ÿÑÿÑÿÑÿäÿÑÿ‡ÿšÿ šÿÑÿA/äÿ¿ÿäÿ/T Ñÿ÷ÿ÷ÿšÿOÿbÿtÿ‡ÿ‡ÿ‡ÿtÿ=ÿòþÿbÿ‡ÿ‡ÿ žÖžT/äÿÑÿÑÿ¿ÿtÿ‡ÿšÿtÿbÿ¬ÿ÷ÿÑÿÑÿTûéŒ/ /Ñÿÿ¨þ•þÍþ=ÿbÿÿßþÿtÿOÿòþºþòþtÿ÷ÿT±!F!û±fAäÿ¬ÿbÿòþÍþÿOÿ=ÿ*ÿtÿ žéÖ±fŒÖy Ñÿ¬ÿšÿtÿtÿšÿÑÿäÿ¬ÿ=ÿÍþ•þ•þºþßþOÿÑÿ/÷ÿ÷ÿ AŒŒäÿ ÷ÿ¿ÿ¬ÿ‡ÿšÿÑÿ¿ÿOÿòþÿbÿ¬ÿäÿ¬ÿšÿ÷ÿŒfäÿtÿÿÿÿOÿyA÷ÿA±ÃÃy ¿ÿ¿ÿÑÿäÿäÿäÿÑÿÑÿšÿ=ÿòþòþbÿÑÿ÷ÿ¿ÿ¬ÿÑÿA šÿòþ¨þßþOÿ‡ÿ‡ÿ¿ÿf±ÃÖÃŒŒžT Ñÿšÿtÿbÿ=ÿßþÍþÿbÿ*ÿÿòþÍþòþ=ÿtÿtÿšÿ÷ÿyéûÖÃyAäÿšÿ‡ÿšÿtÿOÿOÿ‡ÿ¿ÿÑÿÑÿÑÿäÿ÷ÿÑÿ¬ÿ‡ÿ‡ÿ¬ÿ÷ÿ/AT/ äÿtÿ=ÿbÿ¿ÿäÿ /A¿ÿtÿOÿ¿ÿTžy¿ÿ*ÿÿbÿšÿOÿ*ÿtÿ¬ÿ¿ÿ¿ÿ¿ÿšÿtÿ‡ÿÑÿ / ¿ÿ¿ÿ÷ÿ Ñÿ‡ÿbÿtÿ‡ÿ¬ÿ¿ÿšÿbÿOÿtÿšÿtÿ=ÿ*ÿbÿtÿtÿ¬ÿ / äÿ yÖŒ ¿ÿAäÿbÿ=ÿ=ÿ*ÿbÿbÿ*ÿÿ*ÿ‡ÿäÿ/ ¿ÿšÿšÿ¿ÿ Aäÿ¬ÿ‡ÿOÿÿÿÿ=ÿOÿbÿbÿ‡ÿÑÿ÷ÿ äÿ¬ÿ¿ÿäÿ÷ÿ÷ÿ¿ÿ‡ÿtÿšÿÑÿ÷ÿ äÿšÿbÿ‡ÿ¿ÿÑÿšÿ‡ÿ¿ÿ/÷ÿšÿtÿtÿšÿ¬ÿ¿ÿ÷ÿ÷ÿ¬ÿšÿäÿ/yŒfÑÿtÿ=ÿOÿOÿbÿtÿbÿOÿ=ÿÿòþßþ¨þ‚þºþòþÿOÿ‡ÿtÿÿ=ÿÑÿfŒŒŒ±!££3ÃAäÿ¿ÿšÿOÿÿ=ÿ¬ÿ ÷ÿšÿtÿtÿbÿ‡ÿ¿ÿäÿäÿ¿ÿtÿÿÿ=ÿbÿ=ÿtÿ¬ÿšÿ=ÿÿ=ÿbÿtÿ¿ÿ ÷ÿ÷ÿ ÷ÿÑÿ¿ÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿäÿ ÷ÿÑÿ÷ÿ÷ÿ¿ÿbÿšÿT!FÞTÑÿ‡ÿ‡ÿtÿOÿbÿ¬ÿäÿäÿäÿ¬ÿšÿ¬ÿ¿ÿ¬ÿ‡ÿ‡ÿ¬ÿšÿbÿ=ÿtÿšÿšÿ¬ÿÑÿ ¬ÿOÿ*ÿOÿbÿOÿbÿ¿ÿATyÞŒ±ÖžfA ‡ÿOÿOÿ=ÿ=ÿtÿ¬ÿ¬ÿ¬ÿäÿäÿäÿ TŒy/äÿÑÿ¬ÿšÿ‡ÿ‡ÿtÿ=ÿ*ÿ=ÿOÿtÿšÿ¿ÿÑÿ÷ÿ TŒŒ¬ÿšÿäÿ÷ÿ÷ÿ÷ÿ¿ÿtÿbÿšÿäÿ/fŒžžy/ ÷ÿäÿ÷ÿ÷ÿ÷ÿ ÷ÿÑÿÑÿ¿ÿ‡ÿbÿ¬ÿAyŒ±Ãy ¿ÿšÿOÿòþÍþÍþ¨þºþÿ‡ÿšÿOÿOÿ¬ÿ÷ÿ÷ÿ/fŒžT//A/Tžf÷ÿ¬ÿ¿ÿ‡ÿÿßþ*ÿ‡ÿšÿ‡ÿ‡ÿšÿ¿ÿÑÿ¿ÿ¬ÿÑÿ÷ÿ /AäÿšÿÑÿ/A Ñÿäÿ/ffyfäÿäÿ / ¬ÿšÿ¬ÿšÿOÿÿÿÿ*ÿtÿÑÿTyAäÿ¬ÿäÿÑÿ‡ÿbÿtÿ‡ÿtÿOÿ‡ÿäÿ/yy/Ñÿäÿ ÷ÿÑÿ¿ÿ¬ÿ‡ÿbÿbÿ¬ÿäÿäÿ÷ÿ÷ÿÑÿ¿ÿ¬ÿšÿšÿ¬ÿ‡ÿšÿÑÿäÿšÿtÿ¬ÿÑÿÑÿ¬ÿ¬ÿ¿ÿÑÿ÷ÿ/AA ÷ÿ¬ÿ¬ÿäÿ /÷ÿäÿ¿ÿšÿtÿtÿšÿ¿ÿäÿäÿ‡ÿ‡ÿ¬ÿ¬ÿÑÿÑÿ¿ÿÑÿ  ÷ÿ÷ÿÑÿšÿtÿtÿbÿ=ÿÿbÿ¿ÿÑÿ¿ÿ¿ÿäÿ¿ÿ¿ÿÑÿ÷ÿ ÷ÿäÿÑÿÑÿäÿ÷ÿ/ffäÿÑÿ¿ÿ‡ÿ¿ÿÑÿšÿtÿšÿšÿOÿOÿ‡ÿ¿ÿ ÷ÿ÷ÿ÷ÿAT/äÿ¬ÿšÿ¬ÿ‡ÿOÿOÿtÿšÿÑÿ÷ÿ AyyA äÿ÷ÿ÷ÿäÿ¬ÿtÿ=ÿÿ*ÿ=ÿOÿbÿšÿ÷ÿAT÷ÿäÿäÿÑÿäÿäÿÑÿ¬ÿ‡ÿtÿ‡ÿšÿ‡ÿ‡ÿ¿ÿäÿ÷ÿ /fT ¿ÿ‡ÿtÿtÿtÿbÿOÿ=ÿbÿtÿOÿ=ÿbÿtÿ‡ÿäÿTžžf/AA÷ÿ¬ÿtÿtÿtÿ=ÿÿÿbÿ¿ÿäÿäÿÑÿÑÿÑÿ÷ÿTžžyTA/÷ÿšÿ=ÿ*ÿOÿ‡ÿ¿ÿ¿ÿšÿtÿtÿtÿbÿbÿ‡ÿ¬ÿ¿ÿ¬ÿ¿ÿ¿ÿ¬ÿ‡ÿ‡ÿ¿ÿÑÿ¿ÿ¬ÿ¿ÿ / äÿäÿ÷ÿäÿ÷ÿ Ñÿšÿ¬ÿäÿ÷ÿ÷ÿäÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿšÿšÿšÿ‡ÿ¬ÿ¿ÿ¿ÿšÿ‡ÿOÿÿÍþ¨þ•þºþÿbÿšÿ¬ÿäÿ äÿÑÿÑÿ y±±yTAAÑÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿ¬ÿtÿOÿbÿ¿ÿÑÿ¬ÿÑÿ AT/¿ÿbÿ=ÿ*ÿtÿÑÿäÿ¿ÿšÿšÿšÿšÿšÿ‡ÿ‡ÿšÿ¿ÿÑÿäÿ÷ÿ äÿ¿ÿ¬ÿ‡ÿOÿ=ÿOÿOÿ=ÿ*ÿOÿOÿ‡ÿ¿ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ ÷ÿAA/ ÷ÿäÿšÿOÿOÿ‡ÿ¬ÿ¿ÿ¿ÿ¬ÿtÿOÿOÿ‡ÿšÿšÿšÿ‡ÿšÿ¬ÿ¿ÿ¬ÿšÿ‡ÿšÿÑÿ÷ÿTŒy šÿtÿtÿšÿ¬ÿ¿ÿÑÿ÷ÿ÷ÿ÷ÿ /¿ÿšÿšÿÑÿÑÿ¬ÿ‡ÿšÿ¬ÿ¿ÿ¿ÿÑÿäÿ äÿ¿ÿäÿ ÷ÿÑÿäÿäÿ¿ÿšÿ‡ÿtÿ‡ÿ¿ÿäÿäÿ¿ÿšÿšÿ¬ÿ¬ÿ¿ÿÑÿ÷ÿäÿÑÿÑÿÑÿäÿÑÿ¬ÿÑÿ Ñÿäÿ  Ñÿšÿbÿ=ÿ*ÿ=ÿšÿäÿ /TŒžžžf ¬ÿtÿtÿšÿšÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿšÿšÿšÿ¬ÿ¿ÿ¿ÿÑÿ äÿ¬ÿ‡ÿ‡ÿ‡ÿšÿšÿšÿ¬ÿ÷ÿAATA//// äÿ¬ÿ‡ÿšÿäÿ  ÷ÿ÷ÿ äÿ¿ÿ‡ÿ=ÿ=ÿbÿtÿ¬ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿšÿ¿ÿ TfffT äÿäÿ÷ÿÑÿšÿ¬ÿäÿ÷ÿäÿäÿäÿ÷ÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿäÿ÷ÿäÿ÷ÿ ÷ÿÑÿÑÿäÿ÷ÿÑÿ¿ÿ¿ÿ¿ÿäÿ / äÿÑÿÑÿ÷ÿ÷ÿÑÿÑÿÑÿÑÿäÿ÷ÿäÿ¿ÿ¬ÿ¿ÿ¿ÿÑÿÑÿäÿ äÿšÿbÿOÿbÿ‡ÿ‡ÿšÿ¬ÿ¿ÿ Tf AfyyfTfT šÿ=ÿÿ*ÿ*ÿ*ÿOÿtÿtÿtÿ¬ÿ÷ÿ ÷ÿäÿäÿ÷ÿ //TfA÷ÿ¿ÿtÿ*ÿÿ*ÿ‡ÿäÿ÷ÿ ÷ÿ¿ÿšÿ‡ÿšÿäÿAyyfŒ±±yA÷ÿšÿbÿOÿbÿ‡ÿšÿšÿšÿ‡ÿ‡ÿ¬ÿÑÿ¿ÿ¿ÿäÿ //÷ÿ‡ÿOÿbÿ¿ÿÑÿÑÿÑÿäÿÑÿÑÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿäÿ /AA÷ÿäÿ÷ÿ÷ÿäÿäÿÑÿ¿ÿ¬ÿšÿ‡ÿšÿ¿ÿÑÿäÿ÷ÿ äÿ¿ÿ¬ÿÑÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿ¿ÿÑÿäÿÑÿÑÿäÿ÷ÿäÿäÿäÿ /A Ñÿ¿ÿÑÿäÿäÿ÷ÿ Ñÿ¬ÿÑÿÑÿÑÿäÿ÷ÿ÷ÿÑÿ¬ÿ‡ÿtÿbÿbÿbÿOÿbÿšÿÑÿäÿäÿÑÿÑÿÑÿ÷ÿ÷ÿ¿ÿ¬ÿÑÿ÷ÿ ÷ÿ AA/÷ÿ¿ÿšÿ¬ÿ¬ÿ¬ÿšÿtÿtÿ‡ÿšÿ¬ÿ¿ÿ // äÿ¿ÿšÿ¬ÿšÿ‡ÿ‡ÿ¬ÿÑÿÑÿ¿ÿ¿ÿÑÿ÷ÿ/ Ñÿ¿ÿ¿ÿ¿ÿšÿ‡ÿšÿ¬ÿ¬ÿ¿ÿäÿäÿÑÿÑÿÑÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿ¬ÿšÿtÿtÿ‡ÿtÿtÿ‡ÿ¬ÿäÿ÷ÿ÷ÿ /ATffTAA/ ÷ÿ÷ÿÑÿ¬ÿtÿbÿOÿbÿbÿbÿOÿOÿtÿšÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿäÿ  ÷ÿ÷ÿäÿ¬ÿ‡ÿbÿbÿtÿ‡ÿtÿ‡ÿšÿ¬ÿ¿ÿ¿ÿäÿ äÿäÿÑÿÑÿ¬ÿ¬ÿäÿ÷ÿÑÿ¬ÿ‡ÿ‡ÿšÿšÿšÿ¬ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¿ÿ¿ÿ¬ÿ¬ÿšÿšÿ‡ÿšÿÑÿ÷ÿ ÷ÿÑÿ¬ÿšÿ¿ÿÑÿÑÿÑÿÑÿäÿ÷ÿ÷ÿäÿ¿ÿšÿ‡ÿšÿ¬ÿ¿ÿÑÿÑÿ¬ÿ‡ÿbÿbÿ‡ÿšÿ¬ÿ¿ÿ÷ÿ ÷ÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿÑÿ¬ÿ¬ÿ‡ÿtÿtÿ¬ÿÑÿäÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿšÿ¬ÿ¿ÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿäÿÑÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿ¬ÿÑÿ÷ÿ ÷ÿ÷ÿäÿäÿ÷ÿäÿ¿ÿ‡ÿtÿšÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ‡ÿbÿbÿtÿ‡ÿ¿ÿäÿäÿäÿäÿÑÿÑÿäÿ÷ÿäÿÑÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿÑÿäÿ÷ÿ äÿÑÿÑÿäÿäÿ÷ÿ÷ÿäÿäÿÑÿ¬ÿšÿ‡ÿ¬ÿ¬ÿ‡ÿ‡ÿšÿ¬ÿ¬ÿ¿ÿÑÿäÿäÿÑÿÑÿ÷ÿ ÷ÿ ÷ÿÑÿÑÿÑÿ¿ÿÑÿäÿ÷ÿ÷ÿ ÷ÿÑÿ¿ÿ¿ÿ‡ÿbÿbÿtÿ‡ÿšÿ¬ÿ¿ÿ¿ÿ¿ÿÑÿäÿ÷ÿ //// ÷ÿäÿÑÿ¿ÿ¿ÿ¬ÿ¿ÿäÿ÷ÿ  äÿÑÿäÿ÷ÿ÷ÿäÿÑÿÑÿäÿ÷ÿ÷ÿäÿÑÿ¬ÿ¬ÿ¬ÿšÿšÿtÿOÿbÿšÿÑÿäÿ÷ÿ ATAAA÷ÿäÿ÷ÿ÷ÿÑÿ¬ÿšÿšÿšÿ¬ÿ¿ÿÑÿ¬ÿ‡ÿšÿ¿ÿäÿ÷ÿ äÿÑÿÑÿÑÿ¿ÿ¿ÿäÿ  ÷ÿäÿÑÿÑÿäÿäÿÑÿ¿ÿ¬ÿ¿ÿÑÿ¿ÿ‡ÿtÿ‡ÿšÿ¬ÿ¿ÿÑÿäÿäÿäÿ /// ÷ÿ  ÷ÿäÿÑÿ¬ÿšÿ‡ÿ‡ÿ‡ÿ‡ÿšÿÑÿ÷ÿäÿ¿ÿäÿ  ÷ÿäÿäÿÑÿ¿ÿ¿ÿÑÿ÷ÿäÿ¿ÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿ¿ÿÑÿäÿäÿÑÿ¿ÿ¿ÿšÿ‡ÿšÿ¬ÿ¬ÿÑÿ÷ÿ ÷ÿ÷ÿ /// ÷ÿ÷ÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿÑÿÑÿÑÿÑÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿäÿÑÿ¬ÿ¬ÿ¿ÿäÿ÷ÿäÿ¿ÿ¬ÿ¿ÿäÿ÷ÿäÿäÿäÿ÷ÿ÷ÿÑÿ¿ÿ¿ÿ¿ÿäÿ÷ÿ ÷ÿäÿ÷ÿ ÷ÿÑÿÑÿÑÿÑÿÑÿÑÿäÿ÷ÿÑÿÑÿÑÿÑÿ¿ÿ¬ÿšÿ‡ÿšÿ¿ÿÑÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ ÷ÿ÷ÿäÿäÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿšÿ‡ÿšÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿ÷ÿ  ÷ÿ÷ÿÑÿ¿ÿÑÿÑÿ¿ÿšÿ¬ÿÑÿ¿ÿ¿ÿ¬ÿ¿ÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿÑÿ÷ÿ ÷ÿÑÿ¿ÿ¿ÿ¬ÿšÿ‡ÿ‡ÿ¬ÿÑÿ÷ÿ÷ÿ ÷ÿäÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿšÿšÿšÿšÿ¬ÿ¬ÿ¬ÿÑÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ / äÿ¿ÿ¿ÿÑÿ÷ÿ÷ÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿäÿ¿ÿ¬ÿšÿ¬ÿ¿ÿäÿ÷ÿ÷ÿ¿ÿšÿšÿ¬ÿ¬ÿ¬ÿšÿšÿ¬ÿÑÿÑÿÑÿäÿäÿäÿäÿ÷ÿ ÷ÿäÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¿ÿÑÿÑÿ¿ÿ¿ÿ¿ÿÑÿäÿäÿäÿ¿ÿ‡ÿ‡ÿšÿ¬ÿ¿ÿäÿ÷ÿ ÷ÿäÿäÿÑÿÑÿÑÿäÿ÷ÿ÷ÿ÷ÿäÿäÿÑÿ¿ÿ¿ÿäÿäÿäÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿšÿšÿ¬ÿ¬ÿ¬ÿ¿ÿÑÿäÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿšÿšÿšÿ¬ÿšÿšÿšÿ¬ÿ¿ÿ¿ÿÑÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿÑÿ¬ÿšÿšÿšÿ¬ÿ¿ÿÑÿÑÿ¬ÿšÿšÿšÿ¬ÿšÿ¬ÿ¿ÿÑÿÑÿÑÿ¬ÿšÿ¬ÿ¬ÿ¬ÿšÿ‡ÿtÿbÿtÿ‡ÿšÿ¬ÿäÿ ÷ÿ ÷ÿäÿÑÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿÑÿÑÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿäÿ÷ÿäÿÑÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿäÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿäÿäÿäÿäÿÑÿÑÿÑÿÑÿ¿ÿäÿ÷ÿ÷ÿäÿÑÿÑÿ¿ÿÑÿÑÿÑÿÑÿäÿäÿÑÿÑÿÑÿÑÿ¿ÿÑÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿäÿ÷ÿ÷ÿäÿÑÿÑÿäÿÑÿ¿ÿÑÿÑÿÑÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿÑÿÑÿ¿ÿ¿ÿÑÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿäÿÑÿ¿ÿÑÿÑÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿäÿäÿ÷ÿ÷ÿ÷ÿ ÷ÿ  ÷ÿÑÿ¿ÿ¿ÿÑÿäÿ÷ÿ÷ÿ ÷ÿäÿÑÿ¿ÿ¿ÿ¿ÿ¬ÿ¿ÿÑÿÑÿäÿäÿÑÿ¿ÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿ¿ÿ¿ÿ¿ÿÑÿÑÿ¿ÿÑÿäÿ÷ÿ ÷ÿ÷ÿ  ÷ÿäÿäÿäÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿÑÿäÿ÷ÿ÷ÿ ÷ÿ÷ÿ÷ÿ ÷ÿäÿäÿäÿäÿäÿÑÿÑÿ¿ÿ¿ÿÑÿäÿäÿäÿäÿÑÿÑÿÑÿÑÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ ÷ÿ÷ÿ÷ÿ÷ÿÑÿ¿ÿÑÿÑÿ¿ÿ¿ÿ¿ÿÑÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿÑÿÑÿ¿ÿ¿ÿÑÿÑÿäÿäÿäÿäÿÑÿ¿ÿ¿ÿäÿ÷ÿäÿÑÿ¿ÿ¿ÿÑÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿÑÿ¿ÿ¿ÿ¿ÿÑÿäÿäÿäÿäÿäÿäÿäÿäÿÑÿÑÿ¿ÿ¿ÿÑÿÑÿÑÿ¿ÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿÑÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿäÿ ÷ÿ÷ÿäÿäÿäÿÑÿ¿ÿ¿ÿÑÿÑÿÑÿäÿ÷ÿ÷ÿ÷ÿäÿäÿÑÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿ÷ÿ÷ÿäÿäÿäÿ÷ÿ÷ÿäÿÑÿ¿ÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿÑÿäÿ÷ÿäÿÑÿäÿäÿÑÿÑÿ¿ÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿÑÿäÿ÷ÿ ÷ÿ÷ÿ÷ÿ÷ÿäÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿäÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿÑÿÑÿ¿ÿ¿ÿÑÿäÿäÿäÿÑÿÑÿ¿ÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿÑÿÑÿÑÿäÿäÿ÷ÿ÷ÿ ÷ÿäÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿäÿäÿäÿäÿÑÿÑÿ¿ÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿÑÿÑÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¿ÿÑÿäÿäÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿšÿ¬ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿäÿäÿäÿ÷ÿäÿäÿäÿÑÿäÿäÿäÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¬ÿ¿ÿÑÿäÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿ¿ÿÑÿ¿ÿ¬ÿ¬ÿ¿ÿ¿ÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿÑÿÑÿÑÿäÿÑÿÑÿ¿ÿ¿ÿ¬ÿ¬ÿ¿ÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿäÿäÿäÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿÑÿÑÿÑÿäÿäÿ÷ÿäÿäÿäÿäÿÑÿÑÿäÿäÿÑÿÑÿÑÿ¿ÿ¿ÿÑÿÑÿäÿäÿäÿäÿÑÿÑÿÑÿ¿ÿÑÿäÿäÿäÿäÿäÿÑÿÑÿÑÿÑÿ¿ÿ¿ÿÑÿÑÿäÿäÿäÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿäÿäÿäÿ÷ÿäÿäÿ÷ÿäÿäÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿäÿäÿäÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿÑÿÑÿäÿäÿäÿ÷ÿ÷ÿ÷ÿäÿäÿäÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿÑÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿÑÿÑÿäÿäÿäÿäÿäÿäÿÑÿÑÿÑÿÑÿÑÿÑÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿÑÿÑÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿäÿäÿÑÿÑÿäÿäÿÑÿÑÿÑÿÑÿÑÿÑÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿäÿäÿäÿÑÿÑÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿ÷ÿäÿäÿäÿÑÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿÑÿÑÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿäÿäÿÑÿÑÿäÿäÿäÿÑÿäÿäÿäÿÑÿÑÿäÿäÿÑÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿäÿäÿäÿÑÿÑÿäÿäÿÑÿäÿäÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿÑÿÑÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿäÿäÿäÿäÿäÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ sonic-visualiser-3.0.3/samples/click.wav0000644000000000000000000000020413111512442016400 0ustar 00000000000000RIFF|WAVEfmt D¬ˆXdataXÃ÷rÆeýaãt(eøäù ßbÒyÓ ÕCrÜaîéïçÓ èS%ôõárÿôñ +S:a+p>ðÄ Â-ã-- Ý7Ý áA?ðÏróéÇì頲Ͱû0î6ñsonic-visualiser-3.0.3/samples/cowbell.wav0000644000000000000000000003225413111512442016754 0ustar 00000000000000RIFF¤4WAVEfmt D¬ˆXdata€4,ñÿ¡Ôÿ|ùBíðI $3 uýBõuøÅ‹ãÛP¡¾ü’þ„üùšÿšnïnënýãýêðI2¾Õ;È„êãø*Pñù©Ã¸­BíI2Å7¡.Å7¡.êð¿¢v©Ãšñšñ ñUñUê¨Cÿu0XÜ| HR ©Ã·Í‹÷¡öBù¡.|%øÍô‹BõÍô¾| në_fÅ3ãêð÷ä‹Ï„ÚàÔáø4W<’ äµ_Ñø*Àêø*Å7W<Ì,Bí_Ñ_ÑX܋ϰ¸µãË©ÃãË;üXìÔá ’åòå,î;È·ÍÔ!PG$ù¾ê÷3Å7@4øJŠo:hPGÅ7|%PP'¾¨PG:hHRÔ!šÔ Pø|%ÍfúÔáÅø*ø*¨#¡.|%Ô!$)¨#¡ü°Ø4Ó„ÚgÆ©Ã,ö,¨BíXÜãËg¦ŸX¼‹ÏãËÕ°èÔá©Ã¸­Ÿ”¿¢°Ø,î°¸g¦°ØãóÜÖãËà°ØÊÕòåà,Þ¡ ê‹’_„êýøÊÀ,@ N™YA]@ ¾Ô!u0I2W< NPGøJâk:hW<Å7HRPGÅ7HR™YW<4¨CPGÅ7P'P’,ã¨þ3ãÆçñÿ3‹÷Pû3ý„Ú`±¸­`±À,ÞXþÅuøXôÔá`±o›¿¢`±ª¿¢©ÃÜÖÊ`±`±;È_Ñ4Ó_ѵg¦¸­¸­°¸°Ø°è_ыϰèÜæÕÕÜæuø÷|ùf4™9™9™9Ô!Ô PGA]é`ŠoâkHR@I2Ô!ÔÍI2W<øJñU™YA]™YHR¨CI2$)Ì,$)¨ÔP'Ì,Ô!P ø*|%ÍPÆû,Þ„ÚÔáêðX_Bí·ÍX¼©Ã°¸g¦`±_ÑXÜãËÀµg¦o›Ÿ`±X¼°¸X¼4ÓàXÜ,Þ„ÚÀµ_Ñ,ީõgÆÕ‹ÏÜÖñù:ÍÍ|%Í‹û3ãnóê|P'P'P'u0ñ5I2u0u0ñ5PGñUé`A]A] Nñ5Å7¨C¨CPG NñUHR™9 ,Ô!ã,P':‹ýXôPû„ù¨üXì„Úµ¿¢X¼„Ú„êšé°è3ãթé÷͋ÏãË4Ó°Ø·ÍX¼µ°¸°¸X¼X¼°¸©Ã_ÑÜÖÕÕ4Ó_ÑXÜïøønóððò|ù:$)u0I2Ô!3  Pu0PGHR NøJøJ@u0¨#,,P'4™9ñ5ø*ø*ø*|%|%Ì,Å7@™9ø*,¾_3øP'øêûBí,Þ„ÚÔášéãó¡ú·õÜæ_ÑÀÀ;È·ÍÜÖàXÜÜÖÕ·ÍX¼µ°¸ÀÊÕ,Þà,ÞXÜÔáåÔáÜæêðïšéÜæ3ãXÜXܰè¡öB’,fùònóf| ãÌ,I2Ì,$)¨#$¨$|%ñ5¨C¨CW<4u0$)|%$)I2W¥A¨DÒGíJüMëPÑSÀV¹Y°\o_·aScd×c¼bÄ`æ]àY„ThM“D÷9.J!1=úÄíÊá•ÖÌîÃ-½L¸µM³u²P²¸²ª³?µp·.º<½`À\ÃƧÈËÍ8ÐóÒœÕ$ØcÚ^Ü/Þûßðáäyæ÷èhëÜí4ð³ò^õrøÛû–ÿpEø ‘½u>Ú $‹&5())a(û&§$&!$z6 ž&ù8î,ã2ØpÍÿÂA¹„°M©ë£€ ëžÛžñŸÜ¡y¤«§‚«ä¯½´Ñ¹ç¾ÉÃkÈÀÌñÐÕÙÝîàƒäÛçÑêí4ðËòSõâ÷Pú­üÐþáÕÓâ ; g އoabjyoN!#©$B&ç'¡)o+I-/ä0©2p4b6~8à:u=-@öB¾E‹HmKvNµQ$UœX\_Ûa%df®gÜh‡iPiõg#e¼`ËZlSÜJ&Ab6‚*Ÿÿœôèý܄ӖËÅ¿¿™»ª¸ý¶•¶M·Þ¸ñº6½…¿ÉÁ&ħÆgÉMÌ>ÏÒÔÀÖÁبڛܷÞààã0å&çøèÌêÁìï“ñoôv÷…ú’ýŸÁ#Ä ³´ªN”j î"-%%'°(‡)])á' %à TÌK Ë-ûƒðõäòØ!ÍÂQ¸°i©7¤b ãÜ µž–¡W¥¬©8®Î²_·é»ˆÀ8ÅïÉ’ÎúÒרÚXÞ¤áÜäèëîÖðcó¼õð÷úJü‰þÎ;SS Q V m›ÆòûîÁ‘`;!$#%Û&”(;*Ý+…-U/J1f3 5Þ7+:u<å>yASDhG¯JNTQ~T–W‘Z•]`tc fhfi»i igödXaˆ\4V3NeD 9y,Cåº øåëàÖòÌqŸ¿Ð»z¹a¸%¸¸W¹¡º|¼Ð¾™ÁÄ‘ÇYÊíÌAÏŒÑÕÓ@Ö¶Ø#ÛhÝoß>áïâ©ä‹æ«èöêcíÎï/ò”ô÷ÌùÛüAé£V ÞP«Ž 7#ñ%í')P)È(o'Q%("ÀÓ=.áüÜñ‹æ<Û7ÐÅŒ»^²~ª7¤ÛŸh·œk/Ÿ¬¡Ì¤i¨‘¬,±¶/»,ÀøÄqɰͺѰ՘ÙfÝá~ä¬ç†ê6íÅïGòÏôJ÷¸ù ü2þHGVnž× ,7.$î ©"Q$ô%©'p)S+9-#/1ã2Ó4å6,9±;d>9AD÷FßIÑLõO6S­VZg]_`öbeÖf+hi;ixhyfêbÃ]WÝNE;Š/#ÈJú6íRá×`Î^ǸÁZ½º ¸*·j·ª¸–ºí¼[¿ÉÁ)ÄŽÆ ÉÎˤÎrÑÔxÖ‘Ø~ÚZÜLÞ[à‡â´äÒæËè·ê§ìÂî-ñÚó×öîùý2QŒö   ~h4§¸R"$Ž&*(G))Ì(°&!#>à«yÿEõ#êXÞ^ÒÏÆC¼&³±«Ø¥‹¡œž Μç@ ¦£Ë§`¬±Çµbºö¾Ã,ÈÁÌ:ÑrÕ]ÙùÜQà‚ã™æ¥éžìuï"òœôæöùBûuý³ÿ÷5awv | }˜¼ßü÷Ý©q8 "ì#Ë%š'U)+¬,p.J0[2„4Õ6"9ˆ;ã=r@C F+IwLËOS2V:Y)\_ça›dèf¦hiiiAhfÝb|^ÐX‘Q Hü=æ1Ð$Fà ±ü;ð•ä×ÙDÐÈ Áï¼í¹h¸ù·L¸%¹bº ¼#¾©À|ÃwÆ]ÉÌˆÎØÐÓGÕ—×÷ÙKÜwÞpà?âøãÆåÀçòé\ìÕî_ñØóaöùãûÿ;ü '~Öz©!š$ø&Ž(I)) (*&b#„Q@ |´öJëÇßrÔÉG¿Òµq­€¦J¡ó„œªœ%ž‚ •£§"«†¯Q´I¹Y¾AÃìÇKÌfÐVÔ+ØîÛ˜ßã]æeé(ìÂîFñ½ó;ö­øû[ý†ÿ™£´Ó : e„‚uaLIA? ò!£#K%ò&®(z*f,Q.J052,416b8¾:]=@CìEÑHÇK¾NåQ(U‰XÞ[ _Õa8d'f—ghi³hMgŠd1`-Z—R“If?'4ÿ'{ ºÿMòÂå¥Ú+Ñ{É]é¾,»Ê¸…·R·)¸È¹ ¼¾Á‰ÃñÅ_ÈçʉÍEÐîÒoÕ°×µÙ”ÛnÝ]ßná™ãÊåêç÷éùë îPðØò¯õ¿øïû!ÿU‚Î? 긇&mA!­#«%V'‘(1)ò(Š'¼$… á  :dù§î3ãFׂË]Àx¶(®‘§«¢OŸW³œS0Ÿ*¢¦ª>¯´Õ¸t½ÂÆËŠÏÕÓáסÛßPâdådèWë7îùð‘óüõBøqú¡üÑþT•¹Ï Õ Ò Þì#4!þÁƒG!#ï$Ñ&–(_* ,Í-—/‘1ª3ð5I8¯:=š?1BùDïG!KgNºQïT XüZÛ]¢`UcÆeÎgi‘iîh=gedo`>[£TqL•B7b*Ûš¾ô±è©Ý±ÓËìÀ¾Âºª¸Ù·¸Ø¸º°»›½ç¿€ÂaÅDÈ˱ÍÐBÒkÔ•Öר#Û]Ý€ßláCãåïæþèNëÆí`ðôò’õ4øöúýý<Î{6 ÎEÊ" &#¼%Â'ï(8)Ž(ü&‚$ !kgÚÈjû'ð|äÜØ¡ÍÃ?¹{°©£ïž¥œ#œ$FŸ?¢¿¥®©û­“²t·q¼kÁ;Æ¿ÊþÎùÒÊÖÚÞ¢áÿä"èë»íAð¿ò-õ£÷úlü²þÛï; a ™ »Í˲™ncP,!ò" $M&õ'¾)’+ƒ-€/}13†5¦7ê9d<?åAÑDÀGµJ¥M®PÎSW[Zš]–`=cceg¼ž¹ ¸|·á·1¹&»˜½.ÀÉÂGŲÇÊ”Ì0ÏÃÑUÔ²ÖÛØÐÚ¦ÜÞràŠâ¸äñæé=ëXíŒïöñô•÷´úùý:q´ ~Û‡ü «"Ú$’&ê'»(Ú((ò%q"{Žì_ýôòÊçÜ@ÐÄÄ;º±¬©¤ µ®œîœ\žæ e¤¥¨X­@² ·á»‚ÀÅ{ÉÜÍ0ÒLÖ,ÚÆÝá7ä/çê÷ìÆïròüô]÷žùÎûþ3wµð & + )-=P^_DÔ R"#$ú%Ò'¤)g+*-ò.×0Ý25e7Ê9F<Â>QAüCÐFØI MRPšSÈVÎY³\v_"bŸd×fhliZi/h×eKb‰]rWæOÃFú;Ì/|"«Õ‚ùíˆá9×(΂ÆmÀÿ»8¹è·Å·y¸³¹L»#½H¿­Á[Ä/ÇʽÌ8ςѠӷÕÔ× Ú@ÜvÞ„à{âPä/æ*èUêÀìKïúñ¦ô\÷úþür´ cëRˆª½¯!q$¸&Y()ê(¿'š%}"Mᯠèÿ÷ô[é}ÝéÑ鯻¼™³§«#¥J 6õ›Zœžà O¤<¨q¬ú°®µº‹¿oÄÉyÍ–ÑjÕ#Ù±Ü5à”ãÑæÒé¦ì>ïÅñ.ô£ö ùuûËý 6I^u– Ä ê ëŪŽ|^ 1"õ#Ÿ%R')Ó*µ,°.¸0Ä2Õ4ð6&9€;>Ê@­C¡F—IŽLˆOŽR²UåX \@_b…dpfÖg¦hÚhEh®fÑch_EY{QHk=²1 %ül Öü–ï?ã5ØåÎ[ÇšÁ^½sº¸Æ·Ù·Ä¸rº¬¼<¿çÁ€ÄþÆ`ÉÆË.βÐ/Ó Õç×øÙã۷ݘߎá±ãæå(èfê•ìÒî"ñ°ótö‡ù´üO”Ú / ¨?äl³!õ#Ü%Q'C(ª(:(Æ&ý#¾é M÷7ì¹àùÔKÉQ¾r´3¬¼¥¡.ž¿œ¡œ´ØŸý¢ë¦y«T°Pµ/ºí¾xÃìÇB̋ЭԧØ[ÜÏßã æîèÇë‘îLñèóiö½øû-ýcÿš×Im | {v}{‘‹ƒ]$à›!]#.%'Ý(·*~,Q.&0!2:46á8\;à=m@CÃE±H¸KôN4RwUXŒ[X^a‡cÐe¹giyißhgd¼_ZSŒJ@ã4(RO ”þ“ñ—åÒÚZÑ>ɡ’½#º9¸£·¸:¹Ðº©¼·¾úÀyÃ$ÆíÈ«ËCΫÐÖÒìÔóÖÙ3Û`݉ߚáŒãxåfç}éÃëAîìð¥óoö1ùüÿ5ž3 à ~üGmn\ #•%„'À( )\(¡&Ü# á) œù9îQâkÖËbÀ̶j®f§î¡'ž'œÞ›‹ŸÔ¢¶¦êªc¯´Ö¸¶½šÂWÇÝËÐ ÔÆ×YÛÍÞ2âqå‘èyë4îÅð=ó¦õøxúÛü+ÿi‘¥ÀÎ ø <PM:ïÈ«g!<#ñ$®&X(*ò+â-ë/ú1486f8¯:=Á?ŠBwEpHjKjN^QpT†W´ZÖ]Ð`|c°e]gmhÝhhdgeda \U?LÿAŠ6 *ž ¬ôóçYÜ<ÒìÉiâ¾P»7¹"¸ì·¸ä¹à»F¾ïÀšÃ0Æ¥ÈûÊWͯÏÒ…ÔÜÖ ÙÛðÜÑÞ±à¼ââä)çséÃëî`ðÎò|õYø~û¾þf¯÷ SÀPÐ:J ó"%¸&Ú'g(Q(I'*% !96:û‡ð4åŽÙÜÍÂ-¸'¯Ý§n¢Øžèœgœ$÷žÂ¡a¥¯©n®h³e¸<½éÁ^ƺÊðÎÓ×äÚoÞÃáÚäÊçžêkíðÓò\õÔ÷$úcü’þÊý?v§ À Ë Åù¼¿±¢m4ê ¦"i$<&(ô)Ï+¤-/n1r3§5õ7m:ñ<…?BÍD”G†JœMÒPTCWVZ8]ñ_ybÕdÚfshQiBi h•eÀa¡\VN£D«9S-ëîíröêé›Þ¦ÔÌÅl¿\»Ü¸··Î··¸Cº¼'¾VÀ²Â7ÅßÇ•Ê8Í·ÏÒÔ%Ö$Ø6ÚU܂ޡà¸â±ä¯æ³èäêEíÛï˜òcõ?øûþTÃ\ üó04Û!b$Ž&!(ì(¼(}'+%º!2nXÚþüò3ç,ÛYÏHÄ)ºM±Ë©È£cŸ´œ¶›]œSža¡ ¥T©É­g²!·ò»ÆÀÅ&ʄΘÒgÖÚvÝÔàä>çCêíÂïDò¸ô÷†ùâûFþÈì 2 G m€‚c<ãÁœ u">$ÿ%´'q):+-//1K3w5¤7è9@<È>uAND?G?J?MùûÅýþÿ+gŸÒ  öîçÔµ€= ø!¯#}%L'0)+ò,Ö.¾0»2Ø47~9ø;>+AÕCFcI]LzO°RçUY \Þ^uaßcüeÄgôh[i·hÙfœcÿ^ïXvQˆH >W2[%s žû‹î¥â!ØσÇnÁܼ¹¸­·M¸¥¹v»ƒ½µ¿þÁbÄîÆÉ+Ì®ÎÑJÓZÕS×RÙ\Û}Ý£ßËáàãèåùçêdìÔî‰ñMô3÷úý"oä y àì­ <#‡%X'Ž(Ö(%(K&O#+Ö>V ‰÷ìàøÓhÈ˽[´W¬Æ¥Ù ‡ç›å›Z ‘£«§%¬Á°yµ;º¿ÂÃgÈÙÌÑýÔ©Ø*ÜßÄâðåýèíë©îMñÀó5öŽøùúRý¬ÿô&L[r ²Â®‰[(üѯ!|#O%'Ì(‹*g,P.a0z2©4Ü69n;Ý=r@.CF ILOR UX"[&^a¼cùe«g¬hûhmhúf]di`âZS¡J @,4['÷Z Ëþ©ñEåÚ<Ð+ÈôÁ|½Œºè¸A¸k¸C¹¶º§¼ ¿›ÁPÄèÆhɼËýÍ7ÐxÒ¼Ô×/ÙOÛ;Ý-ß áã/åçØéHì¶î*ñ°óXö3ù?ü€ÿÐ6‚ Õ mÊ*s€ *#T%ì&é'E(æ'©&W$¯ ”äË jùþí}âÌÖ@Ë2À¶S­G¦¡ÑIœ<œr©Ÿ¾¢‚¦Þª¯™´–¹~¾*áÇäËüÏüÓÐ×ŽÛ ß`âsåaè/ëæí™ð7óÐõHø¬úøü/ÿb“Êý- L ZYI8) ðÅŽL!þ"Æ$Œ&i(L*7, .024B6’8;=1@ÕBEMH5K2NTQ‡T¸WÍZ¾]n`íb$egyh6iiÌg9e'a«[«Tà À"Š$]&(ä)µ+“-—/¥1Õ3 6M8ž:û<~?BêDÓGÕJÙMßPÜSÜVÙYß\Ì_™b e gdhiÔh¸ge$bG]ÁVND 9,=”è—öëé>ÞáÓ#Ë$Äù¾s»`¹q¸g¸¹Nº ¼2¾¦ÀIÃëÅ}ÈæÊ-ÍaÏŽÑÁÓþÕ1ØZÚhÜ_ÞMàDâTäˆæÞèPëÄíLðÍòoõ,øû8þ€Ú7 Ôd·û ü!k$N&•'0((2'H%?"ÃÎMdXýiò÷æ<ÛŸÏWÄṎ°È¨Ï¢¾ž‡œñ›Ëœ°ž‘¡¥@©Õ­®²´· ¼tÁþÅ\ÊxÎ{ÒOÖÚžÝá:ä6çêÒìƒï&òÁôH÷Áùüdþ“É÷'Y  – ž”jR?&ט Y"$Ø%¤'‰)q+f-X/T1Y3x5´7:’AÔC¥FšIL©O©R®U£X¡[Œ^iadBfìgîhi[hšf¦c^_ŠYÿQÆHä=¶1Ž$ã ’û¢î˜âÃ×aγÆÈÀ›¼º¬¸i¸á¸ô¹‰»x½È¿KÂåÄ„ÇýÉXÌεÐÚÒÕ2×aÙۊ݈ßáƒã§åéçQêÎìXïéñ„ô5÷úý4ß< ÖX¾µ ]#‰%!'(<(š'&ƒ#¦[0 „×ötë¸ßúӈȽý³˜«â¤ à›3œÖc È£±§#¬Þ°ÊµÃº¡¿PÄÃÈöÌûÐØÔ’Ø/Ü¢ßìâæ÷è¼ëxîñ·óEöÆø3û†ýÌÿù/T‡© Ï ÚÚ˯•x]?æ§!f#%%ï&Ç(­*¢,›.š0¡2µ4å6-9ž;&>Ì@}C9FIÜKÍNÞQþT+XA[9^ó`hc‹eLgh)iàhwg³dp`›Z1SMJø?_4¦' þ®ðLä[ÙÐWÈIº½˜º¶¸ ¸\¸¹K»s½À¿ÂyÄÎÆ1É™ËÎdгÒÖÔæÖÛØÎÚÔÜåÞáEãåµçïé5ìœî(ñãóÄö»ùÂüÌÿáC ž ø6? ‚"´$‹&Ý'‚(6(Û&7$Q ˆ³ ¨lù:îVâ4ÖVÊ;¿]µô¬B¦7¡Þ œç›|ŸÜ¢û¦ƒ«O°µæ¹’¾2õÇÌMÐJÔØ—ÛðÞ â:å<è,ëî½ðUóÔõ>ø™ú÷üHÿšÝ6J S YZfYY2Õ¤d9!#ä$´&‹(Y*5,.0-2X46ê8G;­=/@ÈB‡EhH\KmNqQ{TvWmZ[]5`ìbUeMg¦h1ißh}ge8a\(U¥LjB½6Ú)Hb¨só çÍÛÝÑÉí¾ֺ¹o¸¹¸¡¹»Û¼¿]ÁæÃÆÉt˹ÍäÏÒÔ?Öe؎ڨܷ޷à½âÐäçYéÑëZîõð”ó@öùèûüþ+„Ý> ‰Í7\f4"œ$„&¼'C(õ'Ë&œ$E!h®7ûùïHäeØÊ̹Á·§®F§©¡ñ œÔ›OŸt¢?¦‚ª¯ó³Þ¸È½‹ÂÇhË}ÏaÓ!×¾Ú;Þ—áÅäÊçªêdíð¬òAõÊ÷@ú§üòþ2aŠµÚ û øÜº˜zV*ö ¹"y$=&(î)Ý+Ø-Ø/å1ô36T8°:+=À?pB(EïGÁJ¥MœP´SÐVöYþ\ß_wbÄdªfhûhi'hfdb6]mVN4Dý8©,cŽ„ÛõúègÝ\Ó ËbÄW¿½»r¹[¸F¸¹ º£¼ç¾DÁ©ÃÿÅVÈ®ÊÍhϱÑïÓ ÖØÚüÛ Þ àYâäÙæédëÀí8ðÙò¨õŽø›û þ½ÓG ¢€Øýçƒ!Ô#Ç%M'8(\('q%"^QéL{ý¤òçòÚìÎlÃû¸å¯ƒ¨Ò¢æž™œÝ›œyžƒ¡S¥½©x®N³%¸à¼ƒÁÆjʦμґÖ9Ú¡ÝãàäçüéÛì¡ïPòÝôV÷¹ùüiþµ>lˆ – ™ œ—•ŒtZ$ñ³| K" $ù%Ò'«)†+e-[/`1†3»5 8c:Ê<@?ÌAsDAG#J+M0PDSBVBY)\_ÊaWdˆf(h#i,iFh3fíb>^ X1P¨FŒ;/´!Îêcøªë÷ßÕªÌeÅÙ¿ø» ¹™¸¸U¹˜ºK¼I¾…ÀóÂyÅÈ{ÊØÌ Ï0Ñ>ÓWÕrךٸÛÚÝåß÷áä+æpèÔê[íòï™òKõøÜúËýê*{ß 5}¼çø •#º%K'((4(c'”%®"‰÷êY xÿƒôàèôÜ"ÑÍÅH»â±ð©¡£(ŸŠœ®›WœKž.¡Ì¤ì¨i­$²·ç»»À\ÅÉÉõÍéѲÕSÙÕÜ:àzã“æ‡éTì ï¨ñ@ôÆöKù¸ûþ^•Âç * C SPB#Ú¸n: "Ë#Ž%_'-) + -/183O5‡7Ë96<½>^AD×F¨I‚LmOrR€U¦X¸[´^saècþe¢gµh#i›hg d†_jY˜QJH‚=Ž1•$òø'ûèíÇá ×κÆÁ½OºÍ¸^¸×¸ºà»¾fÀÉÂ,Å€ÇÌÉÌhζÐöÒ#Õ9×7Ù4Û0ÝAßláŸãïå5èŽêâìUïßñ“ôm÷fúsýЦÊü C ¤l¨·w î"%²&Õ'R(â'g&š#~ëÌ eéö‘ë¨ß–ÓÒÇâ¼,³«±¤ @þ›0œ­L Ì£¨Ÿ¬x±V¶#»Î¿YľÈÍÑÕÆØKܠ߯âÚåÇèµë€î@ñÜóeöÓø1û‰ýÔÿ$`œ¼× Ù ÜÓÍÄ®›l?Ç’!d#8%'ó(Ó*´,¡.Ÿ0´2ã4%7}9ã;R>Ù@kC&FøHêKòNÿQUX[é]¬`Tcže”gÐhWiÒhCgndI`§ZpS—J@,4'OJ …ýhðMägÙüÏÈëÁ`½rºã¸‡¸¹(º¾» ½Â¿€ÄÇ}ÉæË,ÎYÐlÒ{ÔŽÖ§ØÎÚìÜß"á=ãZå’çåé]ìíî–ñFô÷Ïù´ü´ÿÝ| Ó .m£¿Ó»w"Ò$®&ã'M(Þ'j&ø#B HÓå ˆùø€í˜á›ÕÊ¿NµË¬à¥´ VЛá›böŸa£_§¿«e°2µ ºä¾’ÃÈ^ÌlÐ>Ôî×oÛßÞ'âRåYè;ëúí¨ð=óËõPøÅú/ýÿÇõ ;] r ˆŠ„kJ#øÒ¨€Q!#ã$­&|(`*J,M.Y0j24³6ö8I;Á=S@ÿBÀE‰HdKEN;Q@TVWqZv]\`öb>egchiíhÇgceŠa\òT4LèAW6­)Ab~ógæÛXÑTÉÃs¾H»b¹–¸¶¸¦¹0»7½y¿éÁFÄ®ÆðÈ<Ëz;ÏÿÑ2ÔUÖiØcÚiÜiÞˆàµâþäLçªéìsîïð’óQö>ù;üUÿo–¼ø ?ùIq[ù!5$ &h'!(('Û$R!Võ.) ûøïFä;ØTÌÁÁ¶ò­Ü¦’¡žFœœ AŸp¢\¦Öª˜¯´V¹¾©ÂÇaË„ÏÓJ×éÚOÞá£ä¤çˆêcí$ðÖòhõê÷Nú«ü÷þE†Áï   ýêÕ²‰OÛ ­"|$Z&8(*ý+ñ-Þ/ò1 4H6”8÷:d=å?mBEÒG¼J­MÀPÌSÝVÙYÆ\—_Cb¸dÏfdh?i5ihÆe$b ]rV5N`D9\,ÈÇÎYõËènÝvÓË<Ä¿ƒ»k¹š¸É¸¹¹1»ú¼ ¿=ÁšÃÆÈèÊCÍyϜѧӶÕÃ×âÙÜ+ÞJàmâŽä»æéeëíí‹ð?óüõÉøœû’þœÏs ÍZ~“ƒQ!Ò#ì%q'<(,(''%Ú!W~^=ýòEæ5Ú[ÎÃØ¸Û¯V¨¢zž5œ¯›£œØž¢Ô¥ª¯®g³>¸ ½ÇÁ[ƺÊÝÎÎÒÖÚ€ÝÖà ä çêçì¡ï>òÐôW÷ÏùDüþï'TvŽ ¨ ¶ ý±lAí½™ c"5$þ%Ë'¨)+†-/¡1Â3ç5#8f:ÒwA DÅFŒI{L{OŠRžU©XŸ[^7aÁcfËgiZi½hèfÐcA_UR) Å"%Ô&(K(º' &I#<çë W‘ö÷êäÞÞÒMÇ—¼³«’¤ÛŸîœ»›œÜ³ N¤{¨ö¬©±o¶6»ú¿’Ä ÉFÍFÑÕ±Ø*܃ßÂââåëèÉë–î:ñÙó[öÝøQû´ýR†¬ÄÜ ë ö÷îÖµŠ[0Ù¬!€#M%'ò(Ô*Å,Ä.Ö0ð25J79ä;V>ã@CNFILâNÞQØTæWøZô]Ú`qc¶eyg«h%iÃhZgªdŒ`ÊZVS6J“?œ3²&6 oý3ðæãèØ‚ÏÖÇðÁ­½ãºW¹Ô¸)¹2ºÉ»È½ ÀpÂÚÄ:ÇÉÀËìÍ ÐPÒzÔ§Ö¹ØËÚÔÜÜÞþà&ãtåÉç3ê¢ìï¤ñEô÷àùâüðÿ?q ¢ ä*{¾áÏd"Ÿ$W&'(Ø'”&/$f 0}` ‹øFíváxÕ·É£¾¨´,¬j¥† qœ/œ™ m£u§ó«º° µyº5¿ÁÃ#ÈRÌ`ÐDÔÿ×”ÛõÞ3âHå@è!ëñí°ð^óöõxøäúAýŠÿÒ Cj‹ – –wfK/å³B!#â$½&£(‰*{,n.n0x2›4Í6 9;ø={@ C¶EqHLK?NGQ\TnWtZ_],`Æb#e g”hSi!iÙg@eKaÊ[ÅT!LöAS6)Ôà Îÿròæ ÛuÑ…É'Ãi¾0»S¹¸¸ ¹"º±»½³¿ìÁ6Ä“ÆïÈUËŸÍÝÏÿÑÔÖ#Ø:ÚY܂޶ààâåOçžéìƒî%ñÛó¢özùVüJÿQs´ ]°ò!´!$ &Œ'H((ã&†$ü à@-åú‘ïŸãצËÀ…¶å­×¦{¡ë œÚ›ŸÚ¢Ù¦C«å¯¥´n¹'¾ÍÂNǜ˽ϘÓO×ÐÚ1Þyá äµç¤êí3ðÛògõå÷búÇü)ÿw±áü ! *-'úÖ¥xHó Æ"™$o&?(#*,.0#2G4x6¶8;g=ã?}B1EûGÖJ½M¯P§S¯V¹Y½\°_lbÜdáfOhiiháePbC]wV NðCq8Ô+`’´Eõ˜èÝ Ó¬ÊÄ0¿Û»â¹¹¹Û¹7» ½+¿ƒÁçÃPÆ ÈåÊÍ>ÏgÑ’Ó·Õß×ïÙÜÞ*àMâ‹äÚæ@é±ë-î´ðKóöõÆø­û¹þÒÿ+_ ˜Õ`“š^!Æ#º%&'ò'($';%"hM»Ë²ü¦ñÿåÚ)ÎÌÂ_¸F¯Ï§+¢ežaœþ›ôœŸ"¢ê¥:ªæ®»³ ¸f½ ÂzÆ¿ÊÐÎÁÒ„Ö)ÚÝïàäçêÚì›ïTòðôƒ÷ùù^ü²þõ7f›µ Ñ Ó Ð¼©ŠpO*þÌ• _".$&ç'Ì)¾+±-²/²1Ò3ó5;8‘:ÿ<‚? B°D\G+J M PS3V;Y?\_Ëa?dafhiRiˆhzfc)^·W©OFù:™.>!I<÷Àê#ßÿÔnÌ‚Å.Àf¼ºí¸ä¸«¹»á¼ò¾Á`ìÅÈXʬÌòÎÑ@ÓFÕV×^ÙzÛŸÝÎßâ=äyæÃèëí!ðÇòõ[ø@û%þ'4c¥ ú P ÒðÜ¥ !#T%þ& (A(~'Ÿ%‰"-nTËüþ ôOè2Ü'аÄ+ºþ°P©\£Ÿ£œÍ›~œwž~¡B¥©#®à²¤·\¼ ÁŒÅôÉÎÒÛÕxÙßÜ1à`ã|æyébì'ïÙñmôöönùßû=þ–Ù3J [ _ h\Z:ðÔa9 "ä#¼%'n)N+B-A/R1w35â7:‚<é>wADÛF°I”L‚O}R|U‚Xˆ[€^Xaíc&fÙgíh6i—hÜfÞcf_SYQH=Ù0ª#ígúhíváØÖÑ̓ÆôÀ½ŽºR¹ ¹›¹¼ºc¼Z¾œÀóÂ^ŸÇÊ<ÌcΉЫÒÒÔõÖÙ0ÛCÝ\ßxá¬ãòåKèÁê5íÂïQòõô³÷‡ú…ý¸â N ŠÊAY? Õ"%¨&º'(’'&a#YßÚu ºö~ê—Þ¦ÒÇE¼ ²„ª$¤ Ÿõœõ›tœ4ží z¤”¨­â±»¶”»EÀËÄ"É>Í>ÑÕ¹Ø=ÜžßØâíåãèÂë‰îCñîó‚ö ùtûÖýa‘Åä èÒ­”kFã¯!}#M%+')þ*ô,î.÷03)5X7©9 <‚>A¤CSF IèKÒNÛQîTX[ú]Æ`Rc–eugÁhYiõh{g›dV`pZSòIl?„3‰&Ǻ Ûü¤ï‚ãÃØ–ÏÈ'ÂÒ½íºW¹â¸Y¹ˆº1¼)¾QÀˆÂÑÄÇkɹËÿÍ9Ð`ÒwÔ„ÖŽØ Ú¿ÜëÞá`ã›åèç9ê¡ì#ï¾ñwô@÷ úýýÿQ ™ ïAˆ±µ&"v$V&ª'<(é'&ë# Ñ62 äZøïìæàÊÔɾO´¬p¥ rœœ¡< Ä£Ý§e¬±Úµ—ºC¿ÑÃ@È{ÌŽÐeÔØŒÛèÞâCåJè<ëîÏðsóö€øîúYý¬ÿÿ7g€• ˜ ¡–“{b= à«T!)#%Û&º(›*†,|.‰0Ÿ2Í47E9™;ú=z@ CÁEˆHlKTNOQOTKW\ZK]<`æbSeAgžh>iúh°g1eMaà[ÆTýK™AÊ5ç(Jd šÿ]òæàÚ<Ñ>ÉÃn¾m»¹¹%¹f¹YºÌ»Ÿ½¿¿ÂiÄÉÆÉ^ˉͰÏËÑðÓÖ4ØUÚoÜŽÞ¦àÕâåaçÆéAìÅîYñöó¥örùRüVÿo™Ï >~µïÍ!,$&e'(Û'»&ˆ$!&Âä §Aú÷î)ã-×jËOÀ4¶|­o¦)¡Ê'œœpÔŸ£§a« °à´³¹y¾ÃxDZ˳ÏÓF×ÚÚEÞ—á³äÄç¡ê{í3ðçòõø‰úðüDÿ„Äç- F HA/õÓ¯‰a0!Ê"ž$r&U(=*2,/.10@2W4‡6Á8;‡= @¡BDEüGÆJ§M¢P­SÅV×YÖ\µ_]bÃdÆfQh0i;i2hïe4bù\V¨M£CB8¦+09@¸ôèÊÜûÒÔÊRÄn¿¼ó¹ ¹*¹ º‰»g½~¿µÁõÃ=ƃÈÉÊÍJςћӵտ×ÏÙåÛ Þ9à|âºä çZé¹ë0î»ðeó'öûøâûÒþÒäF Œå1i‡n&!#š%-' ($()'%´!ãoƒüeñ–åwÙ}Í)Ââ·¯À§=¢zžpœü›öœ,ŸX¢A¦¡ªK¯ ´Ñ¸|½†ÆÙÊóÎèÒ¤Ö3Ú›ÝÞàäçêùì½ïrò õŽ÷úlüËþ_‘¸É Ú Ó ØÉ»¤ƒW0óÏ– v"H$(&(ä)Ð+½-Ã/Ñ1ö3%6g8³:=? B¬DkG?J)M PS"V$Y$\_Ùagd‹f.h i8i^hNfûb'^¶WœOÔE‘: .¨ Ëçh÷³êßäÔ@ÌYÅÀ¼LºQ¹K¹ÿ¹G»ó¼ó¾#ÁxÃÕÅ/ÈyʯÌÙÎòÐÓ+ÕT×sÙ˜Û·Ý×ßâ2ä{æÕèHëËíXðùòõ_ø1û!þ1Mƒ¹ õ 4h¦Äݯ ?#^%ï&Þ'(D'{%€")cbgþeó¸ç½ÛÙÏtÄö¹°°ý¨£èžšœü›ËœÚžÎ¡ƒ¥·©D®³×· ¼MÁÇÅÊ*ÎÒÖÕpÙíÜDà{ã“æ†écì'ïÝñ~ô÷–ùüdþ¬ëC_ v € p]7òϦ{K "é#Á%œ'€)t+j-n/y1Ž3³5æ73:“< ?›A8DëF¬I„LqOtR„U›X¨[–^`aÞc fÉgëhOi¹húfÛc;_þX$Q²GÐ<¡0€#°³öùóìá¤ÖØÍ¶Æ:ÁG½¹ºd¹ ¹±¹ôº¨¼¯¾ÝÀÃcÅŸÇåÉ%Ì^ΚнÒßÔîÖÙÛ2ÝYß–áÖã&æuè×ê?íÃïYòõÙ÷½ú§ý¦­Ç÷ 3 ˆÑDN ¡"Ó$‘&½')(¤' &3#mv |¼õ/ê(ÞÒsƲ»=²Sª&¤¾Ÿœ~œDž¡µ¤ê¨{­<²þ¶»»UÀÖÄ(É]ÍWÑ0ÕÏØHÜßÌâèåæèÙë¦îkñ ôœöùƒûãý8€ºå   öåĤuHä¼!‘#n%N'-)+-/1$3I5Š7Î9(<‘> A¡CTFIþKïNìQóTöWùZë]Æ`fcÀe˜gÞhPiÞhCgtd/`cZðRÑI#?3û%5K ’ü‰ï|ã¿Ø…ÏòÇÂϽ»¤¹B¹»¹Éº[¼/¾SÀŠÂåÄ<ÇŽÉÑËûÍ"Ð7ÒVÔq֓غÚÜÜß(á^ã—åîçRêÏìYïôñ™ôP÷úüüòÿ 1m § è!Z„œŠ<"Œ$a&•'(«'G&Ä#õÁé g¿÷BìXàUÔ»È×½´Ê«,¥R SœYœ÷› ¤¨Œ¬2±¶Åº€¿ Äoȕ̖Ð\Ô ØŒÛõÞ6â_å_èKëîÖðyóöŸøû}ýÒÿLj–¢ ¹ ·°_;ìÄ•k!:#%è&Ä(µ*¥,ª.±0Ã2ã47O9¦;>–@/CÚE–HfKFNAQIT\WrZp]L`ñbCe,g‘h:iiÌgËzͬÏÞÑþÓÖ/ØBÚ[ÜÞ±àòâ<å‘çîéVìÌî\ñüóÁö‘ù€üsÿ{°ä +xÅÿý¯!ù#ì%P' (í'Ç&r$Ì ÅJt Eðù°îÎâ¹Ößʺ¿ºµ-­Q¦>¡îTœ;œƒòŸ?£D§´«c°/µê¹˜¾Ã~ǺËÇϰÓa×òÚNÞ’áµäºç³êíUð óõ*ø—úþüUÿ Þ2H O LE3#èÁ“d2!Ü"²$—&u(_*J,>.C0P2x4¦6í8?; =@žBBEüGÔJ¾M¼P¿SÈVÎYÅ\©_dbÙdífuh>i3i h¹ebÏ\V‰MyCé76+¢»Ú…ô èÒÜÓÎÊDÄa¿¼º^¹€¹dºÁ»ƒ½‚¿¯Á÷ÃKÆŸÈçÊÍJÏcÑÓ•Õ·×ÚÙÜ+ÞVà…â¿äçcéÕëZîíð”ó@öù×ûÅþËéV ›Ö@_\*!£#²%,'ö'ï'î&Û$‹!åÉ77ýûÇðôäêØÍåÁº·Õ®”§¢Užeœœ8„Ÿ²¢¦Öªk¯*´í¸¯½F¼ÆüÊ ÏéÒÖ.ÚžÝîà#ä2ç,êíÇïzòõ©÷!ú—üêþ;qžÁ× ê ð ìáªY5ã´ ˆ"]$2&(÷)å+æ-æ/ü14?6n8Á:=™?$BËDGIJ$MPS#V6Y@\3_ïaid‚fhi6ijh`fúb^nW5O`E*:¸-o ˜° ÷[êÉÞ¯Ô8Ì|Å^À̼Œº{¹^¹º_»"½*¿_ÁžÃèÅ!ÈaÊ’ÌÈÎøÐÓFÕZ×uÙ‰ÛªÝÓß âU䩿ékëÚíaðøò§õvøPûGþETqš Ù k²Úߢ #5%Ì&Ï'(P'x%\"ãó¡éþódçaÛfÏðÃw¹K°Ä¨£ŸÎœ(œôœóžï¡°¥ö©‘®V³¸Ò¼aÁÒÅÊ3Î(ÒïÕŒÙÝMàãæŒéqìBïþñ¢ô4÷ªùünþÃþ<] ˆ Š ‚taI,â®R ""ÿ#Ú%¼'¦)Ž+ƒ-/ˆ1¢3Í5 8V:´< ?¡A8DçF°I“L†OŽR”U¡X[Ž^Taëc%fêg iWi¦hÌfžc_ÎXÿP‰G”AÃCfF3ILëNäQêTýW [ ^â`}cÂe‹gÉh?iØhIgxd`5ZšRdI«>«2¨% `üGï8ãØfÏøÇ>¾[»à¹f¹Ð¹Üºr¼Y¾ƒÀ¹ÂÅCÇÉµËæÍÐAÒcԇ֟عÚÖÜûÞ-áoã»åèyêïìfïøñ›ôX÷)úý !1Z É[•¬,"l$9&u'þ'¨'H&²#Ähœe ìS÷ëëÿßûÓJÈg½­³‚«¥` |HœŽœžÁ 2¤N¨Á¬±?¶»¤¿ÄtÈ›ÌÐtÔ$اÛßCâ`ådèSë)îððžó6ö¿ø(ûýÝÿ%a‰¯¼ È ¾¶¡‰oM&Ì q!E#%%'ê(Ó*Å,¿.Á0Ö2ó4-7n9Æ;/>§@3CÙE”HlKWNYQaToWwZh]G`êbPeEg­hSi i­geú`a[2T^Kü@55J(§­ çþµñ…åŸÚ6ÑlÉIý¾¸»ºn¹Á¹¼º;¼¾À9ÂwÄÄÆÉRˎͶÏÖÑîÓÖ!ØHÚoÜŸÞÔà ãJå—çñéeìèî~ñ)ôÝö¥ù}ühÿk‰´ø 7¶éõëž! $ý%['(Ã'‹&'$† ƒ0 òzùî/â%ÖkÊp¿µ­=¦+¡ÜQœRœ¸: ˜£’§ò«°Iµº²¾CçÇßËæÏºÓh×ëÚVÞ™áËä×çÍê§íiðó¯õ8ø³úýwÿ¾ø =Q [ `XL0ìÛpF!õ"Ì$¨&†(l*a,Y.f0u2˜4¾69E;«=!@²B\EHåJÆM¸P¹SÆV×YÛ\É_bèdðf_h.iih³eùa³\¿U.MCx7Í*Z„²UôÛç˜ÜÖÒÀÊXÄš¿X¼gº‘¹¥¹uºÐ»›½¤¿ÙÁÄaÆ¥ÈÔÊ Í.ÏdтӫÕË×åÙÜ#ÞTàŠâ×ä*çŽéøëuîøð•óBö ùìûÜþäøJ zÅInn+!“#“%'×'Ø'æ&Í$j!¤_º«~ûYð—ä–Ø¼ÌƒÁM·‚®W§ü¡lž™œWœo²ŸÔ¢´¦«§¯k´-¹ß½fÂËÆËÏôÒ³ÖEÚ»Ýÿà/ä;ç/êíÜï–ò8õÅ÷@ú¥üÿþD‡²Ýñ ÿ ý õáÍ­”kJî½ “"j$J&.(* ,þ-ý/ 2"4O6‹8Ü::=±?4BÍD€GIJ,M&P+SÑÆÅ!»Å±ò©à£ŸŸ&MœíœÀž—¡-¥V©×­“²R·¼¦ÀÅ_ÉÍnÑ?ÕÞØcܸßõâ æéóëÌî„ñ8ôÇöQù¼ûþi¦ß% 3 : 2$óÖ³d< à!µ#‘%t'Z)K+>-;/C1R3x5ª7ò9N<¶>8AÅCsF,I LñNúQUX[^Û`{c¿e—gÚhQiÙh4gDdÛ_ãYQR"Ip>n2]%¥´ üïã…Ø„ÏÈ^Â+¾n»ò¹‹¹º»­¼¾•À¾ÂøÄ=Ç€ÉÀËöÍ&ÐCÒeÔw֗ظÚâÜßMáãÓå$è‚êòìvïò¸ôu÷@úý )T • Ü b‰–w"i$B&}'ý''&f#nN ˜ìömërßnÓ×ǽƒ³o«¥f ~Rœ¡œGžû }¤–¨­¯±b¶»¹¿6Ēȼ̻ЈÔ/Ø«Û ßJâsåzèqëDî ñ­óIöÈøBû¥ýüÿAwºÆ Ï ÍÄ´›~W.Ö´„!f#9%'ø(é*Ó,Õ.Þ0ñ25D7‚9Ô;4>¯@ACëE¬H‚KfN`Q_TrWuZ~]Z` cdeNg¢h;iðhgðdâ`C[üSK•@¿4å'K{ ½þžñkå~ÚÑ^ÉSÃç¾ñ»Hº¨¹í¹ÒºH¼¾#ÀO˜ÄÚÆÉNˀ͢ÏÍÑïÓÖ:ØZÚ‚Ü£ÞÖàãWå°çê†ìïŽñ0ôÙö¥ùüyÿ|›»ñ (i¬ãø­!$æ%='Ö'¤'j&$^ L·¼ gðø¤íÉáÑÕ"Ê ¿HµÎ¬¦¡íœœûn Å£´§¬º°{µ:ºâ¾füÇéËëÏÁÓv×ÛkÞµáÚäçç×ê²íxð.óÈõ\øËú7ý…ÿÍ1Qh p qaS7úÔ°…Y,!#Ü$¹&¡(ˆ*€,w.{0‹2¡4Ò6 9`;Â=<@ÄBfEHæJÌMÂPÑSÝVðYì\Î_{bédéfnh5i#iúg“e¿ac\pUÜL¾B;7*-Y ô¨ç‡ÜæÒâʃļ¿o¼{º¦¹Ê¹¡º ¼È½Æ¿çÁÄXÆœÈ×ÊÍCÏnÑÓ¨ÕÃ×âÙÜ7Þoà«âôä?ç˜éìzîñ©ó^ö$ùùûãþÙëD ˆÐHfY!‡#Œ% 'Ù'Ì'Â&Š$!A][ûíïä Ø@ÌÁ ·d®N§ ¢vž©œgœŽÛŸ£ö¦K«â¯“´K¹ï½{ÂáÆË/ÏÓÈÖRÚ¾Ý á7äPçIê0íøï­òHõ×÷Oúºüÿ^¢Éêþ  òÞÄŸzN$ûÒ ª"ˆ$c&E(-*,.0%2@4l6£8í:F=¶?;BÝD’GbJBM3P5S?AÎCFAILO RUX[^ð`c×e¦gÓh@i²hgdµ_¼YRÝH>2ö$Mt ßûòîã|ØzÏÈhÂF¾œ»-ºÄ¹/º6»µ¼Œ¾šÀÊÂÅRÇÉÈËðÍÐ7ÒdÔÖ«ØÐÚøÜ%ßVá’ãÜå2è›êí“ï!òÅôr÷?úý7a ™ ÑM…—„("n$5&c'Ð'^'á%:#<Öù« föçê ßÓ“Ç×¼O³>«ä¤R vœÚœ‡ž6¡±¤º¨)­Ì±‹¶?»ã¿YĬÈÌÌÄÐÔ=ظÛ&ßaâŠå‘è}ëTîñÃóaöæø[û¾ý Pƒ«ÇÛ â ßÓ¾¤„b?ðÃ!q#M%*')þ*ô,î.ù03'5P79æ;F>Ê@SCûE¸H‚KmNiQmTŠWZ‘]h` c^eHgžh:iïh†gÓd°`öZ©S´JI@|4©': {þañ:åqÚ Ñ…É|ÿ¼`º¾¹ÿ¹ùºf¼>¾;Àj™ÄׯÉL˃ͱÏÝÑüÓÖ9Ø[ڀܯÞëà(ãvåÆç#ê‘ìïšñ4ôòö³ù—üyÿ‚Œ±ë (x¸îï˜!ó#Ø%4'Ñ'–'G&Ö# çRR “øAí^á_Õ±Éþµ°¬ ¦(¡ ž–œ­œž” õ£í§U¬ð°¨µWºõ¾vÃÌÇüËÐØÓ×ÛwÞ¿áää÷çíêÍí•ðFóáõgøàúBýšÿãHbt z wo[L(â¼f=!#ô$Õ&¶(¢*Ž,Š.‹02¼4ê6%9u;Ï=D@ÎBkE,HùJâMÙPÝSçVóYð\Ø_bødgmh1iiÕgce‘a9\>U¦LrBß6,*¯ä!ðóžç†ÜèÒßʇÄÊ¿¼ªºß¹ü¹Ëº¼Ô½Ë¿íÁ'ÄkƬÈéÊÍCÏfÑ…Ó«ÕÏ×õÙ"ÜJÞà³âùäIç¥éìî$ñ¶óiöùøûÞþàöO ‹Ë ?a]!!#%÷&»'š'&T$ä Âý åšúeïã¨×ðËàÀß¶6®4§í¡zž¼œ”œÉ Q£"§q«ÿ¯²´o¹¾¢ÂÿÆ7Ë:ÏÓÊÖcÚÎÝ!áRäfç]ê@íð¿ò\õï÷húÖü)ÿvªÖù  éÊ«‚c7ç ½"™$r&X(=*4,*./0;2R4z6°8ù:X=É?UBîD£GjJGMfïgûh0ijh{f/cw^X(P—F‰;?/ "N€ù\ìÀà’ÖæÍêÆŠÁ¼½Q»ºä¹sº•»(½¿ÁIÂÅÉÇÊ<ÌjÎгÒÑÔ÷ÖÙIÛnݧßÓáä^æ»èë—íð³òUõøÔú¶ý¬¶Ú B Àý"2 ¢"Ë$y&~'º' 'G%R"J †°þÌó2èBÜiÐÅŸºk±Å©Ñ£«ŸA„œ2"Ÿ¢¡¥À©:®ß²™·D¼ßÀMŖɮ͛Ñ_ÕþØ{Ü×ßã5æ:é#ìøî°ñ]ôïövùåûGþÕý(< O P P?.ðΨ\/ "â#¼%ž'ƒ)p+j-e/q1„3¤5Ô7:h<Õ>OAëCFWI$LORU,X7[1^a˜cÐežgÂh6i¥hüfþcƒ_wYÇQ€H¾=¸1³$? ­û¿îèâfØ}Ï.È’Âs¾Ç»KºÜ¹AºL»Ò¼©¾¸ÀâÂÅSÇÉÀËõÍ#ÐJÒtÔÖµØÔÚýÜ+ßgá¦ãöåLè¬êí•ï'òÈô~÷Mú(ý6[ ‘ Ó]’¡"Y$!&M'¾'G'¿%#íq‡9 ¡ö„ê¥Þ°Ò0Ǽ³«Ý¤e ¯˜œ§ž\¡Ú¤é¨^­þ±¹¶c»ú¿mĺÈÝÌÛШÔSØÕÛ4ßrâ—å è‘ënî.ñßóvöúøkûÐýe–ÁÛê î èßÉ´—uR&ÿÓ«!†#b%E'+)+-/1385j7§9û;[>Ô@_CFÂH™K‚N€Q‡T“WžZ“]s`cneTg£h5iÑh_g›dw`ºZmSwJÿ?+4I'»ä Dþ9ñ2åpÚ-ыɈÃ"¿+¼ƒºë¹0º»ˆ¼J¾GÀj¡ÄâÆ#É]Ë͸ÏÜÑýÓÖCØlÚ—ÜÊÞûà:ã{åÏç.êìï¬ñKôúö»ù‘ü}ÿ–À÷ 6z´çþìŸ!ø#Ù%''²'d' &#Çœÿö ”ø¶ìáàîÔ]Ɇ¾Ø´“¬ö¥¡ žªœÔœFžÖ *¤%¨z¬±Çµrº¿’ÃòÇÌÐéÓš×"ÛŠÞÔáåè ëàí¨ðXóðõøñúbý«ÿú'Vn ‰ Š€pT:õȦzW!,# %â&Í(°*ª,Ÿ.©0´2Ô4ú649;Þ=X@âB…E=H KëMåPæSùVZ ]í_œbÿdøfahiñhÂgEemaú[ôTFLB…6Ü)t©õÁóqçjÜÖÒêÊ¥Äñ¿¿¼Ìºþ¹ºÞº2¼ì½è¿Â=ÄuÆ­ÈèÊÍGÏqљӼÕà×Ú&ÜTÞƒàÇâ åaçÀé'ìžî$ñ¾óiö/ùüóþêýL ‡ÍMod!ƒ#t%ä&ž'ƒ'k&($ž °Qˆ n(úþî;ãGהˇÀ•¶®§ò¡•žáœ¾œï? u£M§ «/°å´”¹8¾µÂÇEËOÏ/ÓçÖ{ÚæÝ5ácärçsêQí!ð×òwõø~úáü>ÿ¾ë  ' % öÜ»šsH"õ Ï"¬$Š&q(X*I,=.A0J2f46È8;m=Ý?_BûD­GwJ^MOPWScVnYp\V_b‰d¡f.hii hÔe8b ]mVNºº‚º¨»8½¿-Á`Ã’ÅÔÇÊ<ÌgΖпÒâÔ ×+ÙOÛ{ݧßäá'ävæÏè3ë§í"ð¸òWõøßúÄý¹ÃÝ @ }Å/> ™"¸$`&`'ž'é&"%"ºè­7þ_óÐçæÛкÄSº4± ©Ë£¶Ÿe«œ`FŸ)¢Â¥î©`®³½·p¼õÀgŤɿͭÑwÕÙ•Üíß)ãDæLé5ì ïËñrô ÷ˆùúûSþ¢á:O ` ^ \J9⻓m@ "ñ#Ô%´'œ)Š+|-{/1•3³5é7):€<æ>cAõC›FaI4L)O"R2U>XC[;^aœcØežgÌh&i“hÔfÄcH_0YˆQ=H{=q1g$ÇörûîÙâp؆ÏGȇ¾×»hºý¹hºp»ñ¼¾¾ÃÀæÂÅ[ǘÉÓËÎ0ÐRÒuÔ•Ö¼ØßÚÝBßyáºãæSè¶ê"í¦ï7òÙôŒ÷Uú+ý 9e ž ã$d‹œz"W$&B'¡''~%¸"™!+Ü ;‡õê)ÞFÒÜÆC¼é²«Ö¤f µ¯œÖž‘¡¥"©…­%²Ò¶~»ÀŠÄØÈûÌòлÔdØâÛCߊâªå¼è©ë„îEñíóˆö ùûâý4u©Ìèó ü ùîÜÄ¥ƒ_6éÀ!ž#w%Y';)'+-/1.3Q5y7º9á@uCFÚH©K•N‰Q“T W«Z«]€`(cpeRg“hi¸h>g}dI`‰Z#S(J ?×3ù&{· þñå]Ú"ёɟÃE¿U¼­º ºIº.»˜¼Y¾^À~¸ÄðÆ*É`Ë;ÏàÑÔ/ÖUØ|ÚŸÜÑÞáAãåàçCê­ì-ï­ñRôøöÃùšüŒÿŠ¡Ã÷ 4x¹ð ôŸ!ë#Ä%'‘'?'å%^#…G™~ "Ÿ÷Oì‚à™ÔÉ=¾Ÿ´d¬å¥ ¡$žÒœüœužú S¤F¨£¬<±îµº7¿°ÃÈ+Ì'ÐÔ®×=Û¢ÞêáåèëðíÀðkó ö”øûný¾ÿ8f– — š‰|bG)à¶Žf!=#%ú&à(Í*¼,·.·0Ç2à4 7G9•;÷=g@õB‘EJHKÿMöPT WZ]ò_ beùfehiåh¡ge.a¸[ªTLÑAB6˜)&e²“óZçdÜãÒÿÊ·ÄÀм⺺.º»S¼ ¾÷¿Â?ÄxƺÈíÊ,ÍRÏ~Ñ ÓÀÕå×Ú8Ü`Þ àÔâåkçÄé/ì¦î2ñÌó{ö8ù üóþéÿX ’ÞRh]!y#u%Ö&Ž']'8&á#M Y÷- ½ùŒîÄâÛÖ1ËCÀc¶ï­§ø¡™žôœÕœžm ¨£§Ð«U°µ­¹R¾ÍÂ2Ç_ËlÏGÓùÖÚôÝGáväŽçˆêlí4ðêò‡õøúùüMÿ™Íþ. / 8) êͧ\1 !é"¾$¤&~(m*W,U.Q0f2w4§6Ö8#;x=ê?qB EÄGŽJoMbPcSmV|Y\j_"b—d¡f&hüh÷híg°ebñ\.VÔMãC“8,Òi&ö´éwÞ¡ÔhÌÒÅÛÀc½;»>º ºÑº¼«½Œ¿ªÁÔÃÆKȄʳÌâÎ Ñ3ÓXÕ~×¥ÙÊÛ÷Ý'àbâ¦ä÷æPé¼ë-î³ðFóíõ¤øzû[þYf„³ ì ,qªÑÓ” #%’&l'k'€&j$!jM¾ÙÀû½ðå2ÙsÍZÂ6¸p¯B¨Í¢$Ÿ/ËœÎëŸý¢´¦íªo¯´É¸s½õÁZƎʠ΂ÒDÖÝÙPݪàÙã÷æòéÚì«ïbò õ˜÷úƒüÚþ$aŠµÂ Ô Ò Ë½¥lP%ذ Š"a$D&#(*ú+ô-ó/ù1436h8®:=q?öA‰D8GýIÚLËOÎRÛUçXî[Ø^™ad>fãgähi;h9fÛb^˜WˆOöEæ:¦.~!Ωøì‘àÖôÍÇÂÁü½»Zºº§ºÅ»\½2¿AÁcÛÅÕÇÊEÌ~ΡÐÎÒêÔ×0Ù]Û…Ý¿ßõá;䂿Úè;ë¬í/ðÃòiõ øíúÊý»ÇÚ E ‘Ð37 Ž"³$U&O'‚'¹&ä$Ç!^ˆK«ÏýðòWçwÛ¦Ïhĺ±©É£ÂŸtœ~nŸV¢ù¥ª”®2³ä·‚¼Á|ÅÄÉÚÍÈÑÕ(Ù©Üûß>ãYæeéMì$ïßñˆô÷œùüiþµõ&F_ i o h^I2òË£~U ." $æ%Í'¬)Ÿ+‹-/“1«3Ì5ü7;:<ó>sAD±FwIJL=O4R?UKXQ[H^aªcÝe¡g·himh®f›c_ùXDQîG$=1$€ÆIû†îÄâcØÏHȰ¢¾þ»º"º‚º†»þ¼Î¾ÓÀúÂ0ÅmǦÉÚËÎ2ÐYÒ‚Ô¤ÖÎØòÚ ÝJ߃áÂã æcèÆê6í³ï@òßô÷Yú2ý(+Hm ¦ á&e‘¥€"P$&#'x'ê&N%x"ZÄÊe ½ÿõ˜éËÝîіƼ·²ãªÁ¤h ÈÓœJŸ·¡?¥>©¯­H²ù¶¤»7À¨ÄðÈÍÿÐÔÔuØýÛ_ßžâÆåËè¿ë“îYñôŸö$ù’ûöýA†µÞô úëÑ´“sI&úÕ!¬#Œ%i'R)>+0-///1A3a5Š7Ì9<‚>ö@‡C+FåH¾KŸN¢Q¥T¹WÀZ¹]Œ`&cueGg”h i«hgOd `AZ×RÛIX?‘3·&8t ãýíðûäOÚ0ѠɼÃZ¿n¼¾º#ºaºO»´¼w¾rÀŒÂÂÄòÆ3ÉhËÍÌÏóÑÔ8Ö`ØÚ°ÜÚÞáRãŸåîçIê·ì1ï·ñ_ô÷Ñù¦üÿ¢Éþ C„Èõ î•!á#¸%ø&|''±%#1æ4 ¶5÷äëà6Ô¬Èû½h´R¬Ü¥)¡4žçœ—ž"¡¤{¨Ï¬j±¶¼ºO¿ËÃÈHÌDÐÔÉ×MÛ·Þúá(å7è.ë îÑð„óö§øûýÑÿKw¡ ¦ ¦™s]6íÇ x!U#0%'ô(ß*Í,É.Ê0Û2ø4 7\9¤;>w@C£E^H0KN QTW%Z ]`¬b eýfZhiÂh~gìda„[nT½KƒAë5F)Û)‰vóGç[ÜÛÒËÀÄÀí¼ »=ºOº»d¼¾À ÂQÄŒÆÈÈýÊ/ÍZσѨÓÏÕò×ÚDÜtÞ¤ààâ&åvçÕé;ì»î:ñØó~ö<ùü÷þù +` œÚPpc!x#d%Á&b'6'ü%«# ˜ ‘Eùî]â{ÖéÊÀ1¶Å­ù¦í¡¦ž =ž  Ï£«§ò«z°)µÔ¹r¾óÂHÇ{Ë}Ï[ÓסÚÞaáŒä¥çœê{íKðúò õ)ø¥ú ýcÿ¤ß(: F E;.úܸ–oE"!ö"Ó$³&•(€*r,e.l0r2Ž4²6ê81;Ž=@„B#EÔGžJMqPySV”Y\v_)b•džfhðhêhÒgŠeÜa«\çU‚MšCH8Ô+’Ü0ôõécÞ¡ÔvÌëÅöÀ{½U»Pº<ºæº#¼À½«¿»ÁàÃÆPÈŒÊÁÌïÎÑDÓdՊשÙ×ÛÿÝ:àqâºäç\éÃë4î¹ðPóøõ´ø†ûeþbhж ÷ 8€´ØÎ ÿ"%„&P'P'M&.$Ë âZiZûNð¨äÅØÍÂü·I¯4¨Ï¢5ŸDçœí  )£á¦ «¯B´î¸Œ½ÂqƪʻΞÒ_ÖñÙgÝ»àíã çêõìÀï|òõ¬÷'ú”üêþ:q ÃÒ á ß ÛÌ·¡~b6ë "{$V&=(!*,.0 2&4G68À:=ƒ?BœDIGJðLâOàRêUõXú[á^¨a$dDfâgÔhöhh fªbÍ]YWMO¦E–:S.,!‹Û†øùë†àwÖõÍÇÐÁ¾°»{º;ºÃºÜ»j½B¿KÁtíÅåÇ%ÊR̃άÐÏÒûÔ×EÙjÛ›ÝÆßâ;䓿ßèLëºí?ðÌòrõ$øòúÎýÇÎî Q •Ò5; ‘"¨$D&/'S'‰&¥$†!2ç;UýxòææÛRÏ#Äß¹æ°r©¼£ÀŸˆãœ§ Ÿ¢%¦Bª¸®S³¸¤¼:ÁšÅÝÉõÍØÑ§Õ;Ù¾ÜàTãtæxébì4ïôñ™ô1÷®ù üyþÉ4Vn {  ynXA!ݸ‘k B"$ù%Û'Å)¯+¥-¤/©1¼3Ý5 8N: < ?…ADÄF‡I\LJOFRQU`Xd[Z^a®cÙe—g®hÿhZhfocÝ^²XöP G×<Ð0Õ#F‹ûXî¬âV؆Ï_ÈÄÂľ¼¨º4º™ºž»½è¾èÀ Ã=ÅrǯÉàËÎBÐhÒ’Ô²ÖרûÚ(ÝWß”áÓãærèÏê=í¹ïIòåô ÷aúEý-6Is ¬ ì2q™©{"@$ó%'Z'Å&%4"ÿd_ûSÿ¦ô5é]ݘÑ5ÆÈ»„²ÊªÁ¤n ãëœk'Ÿà¡e¥o©Û­r²·Ã»RÀÀÄ É)ÍÑëÔ’ØÜuß°âÚåßèÔë¬îmñô®ö5ù¢ûþS–Éî    úãǧ„Y9 é!Á# %'g)P+D-A˜C:FüHÍKºN³QºTÄWÎZ¿]™`,c{eIgˆhÿh…húfdÜ_ZšR—I?C3f&ô5 ¼ýÐðíäNÚ-ѪÉÅÃl¿ˆ¼ßºDº‚ºh»É¼ˆ¾{ÀÂËÄÇBÉxË«ÍÒÏýÑÔHÖhØ–Ú¼ÜíÞ"á`ã£åúçRêÆì:ïÍñ`ô÷Òù©ü˜ÿ—°Ö HŽÄûô”!Ý#©%ß&Q'ì&n%×"á—Õ³ BÀöiëªßÓÓhÈÀ½<´4¬É¥$¡?žÿœ=ÄžQ¡¯¤¢¨÷¬‡±3¶Ûºr¿ëÃ6ÈbÌXÐ1ÔØ×gÛÉÞâ?åLèGëîéð’ó0öºø+û”ýäÿ&]€¢­ » ´®›†iI%Úµ!f#D%"')ò*á,à.Ý0ñ2557i9º;>@C¼EpH@K%NQ!T,W9Z1]`°b eôfNhõh­hagÄdÎ`D[%TmK4A¡5)¡ò [Jó)çFÜÛÒ ËØÄ8À ½#»Rºgº-»€¼,¾!À2ÂcÄ•ÆÒÈË>ÍaϗѶÓßÕÿ×%ÚNÜ}Þ°àðâ4å†çàéGì¼îFñÙó‹öFùüÿ2c £æ(\ub!h#S%¤&J' 'Ñ%h#º­0T 'Öø®íôá Öʹ¿öµ£­ì¦ò¡¸ž(bžÂ ÷£Ö§¬¨°Nµø¹¾ ÃaǓ˕ÏvÓ(×¹Ú&Þrá¢ä¶ç±ê“í^ðó²õ<ø´úýpÿ·ï7M Q VI:) ð̦€Y0! #é$Æ&­(“*ƒ,{.x0ˆ2ž4Æ69B;¥= @˜B0EèG°J–M†PS”VŸYœ\~_1bœdŸfhãhÏh®g[e¥au\¨UDMRC8‡+IšþÑõ~é\Þ¡Ô|ÌôÅÁ½r»lº_º»:¼Ö½¶¿ÇÁïÃ(ÆdÈšÊÐÌûÎ$ÑKÓmՔ׺ÙâÛÞDà€â¿ä çféÌëBîÅð[óö¹øŒûjþht“È þ D·×ÎŽ ý"ú$q&2''&é#„ ¼Žò åúÙï9ä`ØÃÌÃÁÍ·)¯¨É¢6ŸXž@ R£§C«Â¯c´ ¹®½-“ÆÅÊÔζÒnÖ ÚzÝÑà äç!êíÒïò-õÀ÷<ú¤üÿFƒ®Îå î ó èàǰoL$× ±"Ž$j&N(3*#,.0$284Y68Ñ:+=•?B¯DdG%JMóOïRÿUY\ñ^³a%dEfÑgÉhÛhhæeb”]WÿNWEI: .î S¨]øÕëmàmÖ÷Í%ÇèÁ0¾È»—ºOºØºó»€½Y¿bÁ‰ÃºÅóÇ*Ê\̎ιÐàÒÕ*×PÙvÛ¢ÝÓß âQ䛿ôèSëÇíBðÕòxõ0øûúÞýÒÙö [ ›Ý=@ …"˜$*&'2'[&n$@!¾Ï{Êèü òæ²ÚûÎÓã¹³°_©µ£ÍŸ Êߨ¢K¦kªâ®~³,¸È¼TÁ´Å÷É ÎöѽÕYÙÖÜ-àiã†æŒévìLïò±ôB÷Àù/ü‰þÖCh€ ‰ ˆ{lM9óÉ¢~ R"2$&ð'Û)Á+º-³/»1Ï3î5$8^:»<?žA'DÛF–IuL]O^RdUrXq[c^%a±càe“g§héh=h_f?c^xX±P]G<ˆ0‡#Níú>îšâU؈ÏfÈÓÂо-¼¿ºTº¸ºº»/½û¾õÀÃJłǿÉñË$ÎNÐtÒ˜Ô¼ÖáØÛ2ÝmßœáÞã'æuèÝêGíÄïXòòô©÷lúFý8<W ¸ ú9uœ¦{ "8$ç%ð&7'&Ö$ì!¯ ’äþ2ô¾èõÜ4Ññň»_²±ª°¤s éOŸ¢Ž¥Ÿ©þ­–²A·à»uÀÞÄ'ÉEÍ7ÑÕ§Ø(܇ßËâîåùèêë¿î‚ñ+ôÃöGù¶ûþd©Øû $ + ) 󨏓pH# û!×#²%“'z)`+\-M/[1i3…5´7ï9?<£>A©CUFIäKÌNÄQËTØWÝZÔ]¢`:cxeFgwhêhlhÕf÷c¢_ÊYPRCIÂ>ê2&&¬ …ý­ðËä;Ú%ѯÉÖÆ¿¢¼ûº[º—º}»Ý¼ž¾“À°ÂàÄÇOɀ˴ÍáÏÒ2ÔSÖ{ØÚÊÜõÞ/ájã³åèeêÍìHïÏñlô÷Þù¹ü¥ÿ¤¼Ý S×ô!Ï#•%À&1'¾&?%•"—6p> ÔNöëDß{ÓÈz½´¬¹¥)¡Pžaäž{¡Ñ¤Ì¨­³±Z¶»“¿ÄTÈxÌsÐJÔó×ÛäÞ)âXå^è[ë0îýð¨óGöÊøAû ýõÿ7l“±À Ê Ä¾§šx]:ñÅž!{#T%:')+÷,ð.ð035I79Ì;,>¡@)CÌE„HRK;N0Q6T?WHZ=]`ºb eùfEhæh—h9g—d’`[âS,Kè@]5²(]­ $#óç<ÜÜÒËãÄFÀ½9»nº‚ºN»—¼C¾.ÀBÂnĦÆÝÈËFÍzÏšÑÇÓãÕ Ø3ÚZÜŽÞ½àþâ?åççéQìÉîNñìó‘öSù&ü ÿ >r °ï1]w^!b#E%’&('à&–%"#nV×ñ ½iø;íŠá»Õ<Êw¿Êµ‡­Ú¦ñ¡½ž<7‰žé )¤¨F¬Í°nµº®¾+Àǯ˰ώÓ>×ÏÚ:ÞŠá¸äÎçÇê§ítð#óÅõLøÈú+ý…ÿÇ(IX e b^L8þܸ’jG!#ý$Ø&¿(¤*—,‹.‘0š2³4Ú69W;³=$@¨BKEøGËJ¤MœPšS¦V­Y¯\‰_=b dšfhÏh³h‘g5eva@\bUýLC²7=+dÍ©õ_éDÞ—ÔzÌÆÁª½‹»‹ºoº»H¼í½Ê¿ÜÁÄ;ÆoÈ§ÊØÌÏ3ÑWÓ~Õ£×ÇÙðÛÞPà‡âÌäçréÙëMîÌðdóöÄø–ûwþw} Î K‰ÀßÑ î"î$R&'ø&ç%²#= g/‰ ’wúoïÖã ØnÌ€Á‘·¯¨Ã¢CŸn'5žc x£6§i«é¯‰´4¹Í½O¨ÆâÊèÎÑÒ‡Ö$Ú‘Ýëàä6ç3êíçï£òBõÓ÷Oú´üÿU”¾àö þ øîÖÁ ‚^8é Ã"ž$}&`(H*7,-.(052G4p6ž8è:<=¬?*BÄDpG;JMPSVY\û^¹a)d@fÑg¸hÎhÝg¿eHbY]ÕV½NE:Ã-¨ m1ø·ë]àlÖûÍ1ÇöÁ?¾à»©ºmºðº¼—½m¿rÁ“ÃÊÅýÇ;ÊmÌ›ÎÊÐéÒÕ/×^ÙÛ²ÝáßâZ䦿ùè^ëÉíTðÙò‹õ6øûäýÚâý- d ªå ?= {"Ž$&÷&'%&/$ó ltdüžñæKڥ΋Ãm¹“°L©¬£ÖŸªëæŸÔ¢v¦—ª¯£³H¸è¼pÁÓÅÊ(Î ÒÖÕlÙëÜBà~ãœæ¡éì^ïò¾ôV÷ÏùCüšþé$UuŽ ™ ž š‹~_I!ܳ‘ h"D$"&(é)Õ+Ë-Å/Ñ1à3618u:Ä<0?ªABDêF°I„LtOkRxU{X†[k^4a·cße‹g–hÒhh3A»CgFIöKÞNØQÞTèWîZÝ]¨`´2Û%xÈ [ýŠð¸ä5Ú+Ñ»ÉåÛ¿µ¼»tº´º”»ü¼°¾§À¿ÂëÄ$ÇYÉ“ËÀÍðÏÒ;Ô]քاÚÕÜß:ávãÀå èmêÓìPïÚñvô)÷åùÅü§ÿ²½ê ^Ûî†!Â#…%©&'&%M"FÝÝ oäõœêÞÞÓÈÇ<½ß³ø«°¥-¡\ž0}Ÿ ¡ÿ¤õ¨H­Ù±x¶!»¬¿%ÄmÈ”ÌÐ^Ô Ø‘ÛøÞ?âiåxèlëHî ñ½óSöÞøOû´ýG~£ÁÎ Ø ÕÌ¿¤jM#׳!Œ#l%G'0)+-/13/5X7”9Ú;B>®@?CßE—HkKJNDQDTOWSZK]"`¾beëfAhËh}hgqda`ÓZ¢SæJ¢@5p(} ûÿóûæ/ÜØÒËïÄ\À5½V»‹ºšºe»©¼V¾AÀT‚ĶÆíÈ$ËSÍÏ©ÑÎÓôÕØ>ÚiÜ“ÞÌàãLå–çöéZìÔîYñïóœöZù.üÿ&H| ´ø2exc !V#1%t&'²&_%è""w‡ Qû÷Óì*ágÕôÉ:¿œµa­Ì¦ì¡ÌžTY¬ž¡H¤*¨e¬ô°µ>ºÎ¾HÃ›ÇÆËÈϦÓS׿ÚRÞžáÐäßçÛêºíƒð9óÓõcøÖú>ý‘ÿØ8Xi u snXL*ìˤ€U!3# %í&Ð(¹*¨,¢.Ÿ0­2Ã4ì6!9m;Ä=:@¼B[EHÙJ¸M¯PªS¼V¼Y»\“_>bžd˜fhÁhŸhogeBa\%U¶LÂBm7+Ä1™ˆõCé=Þ”Ô‰ÌÆ.ÁÀ½Ÿ»¢ºŠº4»h¼¾à¿îÁÄFÆ}È³ÊæÌÏ=ÑfÓ‡Õª×ÒÙ÷Û*ÞVà™âÓä'çxéàëSîÖðnóöÑøŸû€þƒ©Ø XÆÞÏ„ å"Ù$=&õ&Î&²%o#ïÏ& /ú ïpãª×Ì<Á`·â®ù§Ã¢MŸ€@Užˆ ¡£^§—« °±´M¹ï½gÂÈÆùÊÏåÒ£Ö5Ú©Ýüà-äMçDê2íùï´òUõâ÷]úÈüÿj Ñî   üëе‘oH#ú ×"²$&t(Y*H,>.<0E2_4|6¸8õ:Q=»?fÈg§h±h½g“e!b] VyNÎD¼9~-g ÝEø£ëOàfÖþÍ;ÇÂX¾û»Èºˆº »%¼«½}¿†Á¥ÃÚÅÈGÊy̧ÎÐÐ÷ÒÕA×gÙŽÛºÝéß$âaä°æéeëÛíVðêòŒõ?øûìýåî 7 n ¬í!D= s"~$ý%Ö&à&ó%ñ#²  µþü4ñµåðÙXÎKÃ7¹o°0©¦£ÛŸ¾6ž  þ¢š¦»ª-¯Â³o¸½ÁðÅ-Ê=Î(ÒéÕ„ÙÝVà–ã±æ¶éìrï+òÔôe÷åùPü­þ÷3c‡ ­ « ­šŽqV8ñÆ¡ |"R$7&(ÿ)ç+Þ-Ú/á1ô36D8‡:Ùæ‹èðêWíÚïcòõ¹÷ú`ýITh’ Ì L§¨vú!$·%¸&è&3&c$d!X:Âþ`óöç9ÜŽÐ^Å» ²€ªŸ¤~  ž9Ì™ŸZ¢à¥é©N®á²„·%¼­ÀÅZÉvÍiÑ0ÕØØQܸßñâæéìæî§ñRôåökùØû8þ‡Åù9 C M D?*úÚ·‘nB ""ø#Ù%¸'Ÿ)‡+}-u/{13©5Ù7:e<É>CAÏCzF4I LñNëQíTöWùZé]­`Dcue;g_hÂh3hf˜c;_SYÐQÁH4>f2ž%4› 3ýpð§ä-Ú(ÑÄÉðð¿Î¼/»ŽºÏº­»½Ä¾¸ÀÑÂþÄ4ÇlÉËÐÍøÏ!ÒDÔlÖØ¹ÚÝÜßAáãÅåèsêâìYïäñô,÷óùÈü¶ÿ¹Ëö& e£Þí!¶#l%&ä&a&È$ "ùвv zõ/êƒÞÉ҂ǽµ³Û«£¥,¡ižIž.ŸÊ¡$¥©m­û±œ¶D»Ì¿DĈȮ̥ÐvÔ!Ø©ÛßTâ€å‰è€ëZîñÊóköêødûÂýXеÍá ç åÞͶžz_4éÄ! #z%\'?)++-/1&3B5g7§9î;S>Æ@OCöE©H|K^NSQWTaWaZZ]'`Ãbeåf/h½hbhöfCd0`“ZdSŸJ^@Í42(ãG Ñÿàòææ!ÜÙÒËÅqÀL½o»žº¶ºz»Ã¼p¾UÀiÂÄÅÆúÈ/Ëa͌ϺÑÚÓÖ#ØGÚrÜžÞÔàãVåŸçþécìÛî`ñûó¥öeù:ü ÿ!,S‚ ¿:ly]!F#%W&â&†&)%¤"Ôª% æ˜÷kìÌà Õ¨Éö¾mµE­¾¦ð¡ÙživÍž7¡s¤O¨”¬±¹µYºð¾cöÇâËáϾÓn×ûÚhÞ²áâäóçðêÌí—ðKóåõtøåúOý ÿêHix … ‚|mY@"Û·Ži!D#%'ã(É*¼,±.²0Á2Ô4749€;Ù=K@ÏBmE"HíJÎMÁP¾SÊVÉYÆ\š_Fb d•fûg®hhPgÝdaÇ[ëTtL|B'7¸*ˆõocõ1é,Þ–Ô‡ÌÆ<ÁÖ½¼»»º«ºL»¼¾ô¿ýÁ%ÄWÆÈÄÊõÌ ÏJÑoÓ’Õ¸×ÝÙÜ3Þdàœâàä,ç„ééë`îàðwóöÖø©ûŠþ†“³â Z™ÆáÌ€ Û"É$#&Î&¡&w%1#£ÂrÄ Ã¡ùœî ãO×ÐËýÀ0·À®æ§¼¢SŸ–[zž° Ê£‡§¼«0°Ó´s¹¾ŠÂâÆËÏÿÒ·ÖMÚ¿ÝáGä]ç\ê@í ðÄòfõô÷pú×ü0ÿx²Þ #  úàÅ£‚Y6 !é"Ä$¡&‡(j*\,Q.N0]2k4•6Ä8 ;e=Í?UBéD›G_J=M)P)S/V5Y2\_Äa.d9fºgšh—h gpeìaî\ZV6N†Dv9<-* ¦ç÷‚ë@à]ÖÎIÇÂq¾¼àºžº$»<¼Ã½•¿™Á¸ÃìÅÈVÊ…Ì´ÎàÐÓ)ÕN×pÙ˜ÛÃÝõß-âoä·æénëáíaðïò—õKøûúýî÷> w µ÷'H:úf"j$æ%³&»&¾%µ#g ÂÂO–¨ûÎðOå˜ÙÿÍ Ãþ¸J°©££ãŸÔO-ž2 £Ç¦áªU¯é³‘¸(½¯ÁÆJÊTÎEÒþÕ¢ÙÝqà¦ãÇæÇé³ìïCòãôy÷ôùaü¼þEqš« ¼ ½ ¹¯š†fJ$Ù² Œ"h$G&'(*ú+ð-ê/ô14'6Y8š:ìXAäCŽFHILOûQþTX[ò]»`Acue3gLh²hhkfoc_YŽQzHï=#2_%þh ýQðä!Ú)ÑÌÉÄÆ¿æ¼E»¨ºåºÆ»%½Û¾ÐÀáÂÅ=Ç}ɧËÞÍÐ.ÒUÔt֛ؿÚèÜßMá‰ãÓåèêçìcïìñ‡ô9÷üùÔüÄÿÁØû1 l®ã çw!¤#Y%j&Å&.&’$Ç!¨0N —ÿõÌé#ÞrÒ7Çļˆ³½«™¥.¡yžaºQŸì¡L¥D©”­#²Á¶d»í¿_Ä¥ÈÇ̾ВÔ8ØÂÛ#ßiâ”åè”ëlî4ñÞó{öýøuûÏý)cŸÂáî ù õîÝʬ‘mJ#üÖ!°#Ž%o'R)>+,-'/*173T57·9Ü@cCF¾HKrNiQiToWqZa]2`Åbeáf&h«hEhÑfdú_]Z!S`J@‰4ë'£  ÿÂòÌæÜÕÒ#Ë ÅÀd½‚»¾ºÎº•»Þ¼€¾mÀx¢ÄÖÆ É@ËoÍ™ÏÅÑãÓ Ö.ØSÚ~Ü«ÞÝàã\åªçêmìäînñô²öoùAü,ÿ(;\ É AmzZú <# %>&¼&W&ò$^"‹R¾¿ )÷ìeà³ÔTÉÀ¾9µ*­¬¦ê¡âž|’ñž]¡œ¤x¨º¬<±Úµº ¿‰ÃÑÇÌûÏÔÓ†×Û~ÞÉá÷ä èëâí©ð[óùõ‚øøúaý°ÿü,\uŠ • ’}kO3ïÅ¥y!X#0%'ö(Ú*Ñ,Á.É0Ð2ì47I9‘;ì=_@äBƒE6HKßMÓPÐSØVÚYÒ\¥_Mbždfîgœhjh.g¸dä`‘[¨T2L1Bá6u*I¿@=õéÞÔ‹Ì&ÆQÁë½Ô»Õº¾ºg»’¼.¾ ÀÂ:ÄeÆžÈÏÊÍ/ÏTÑÓœÕÇ×åÙÜ:Þmà¨âèä:çéôëhîéð€ó&öäø²û™þ‘Ÿ¼ì #džÏâÍy Í"´$&¬&w&F%ó"[m^ \9ù9îªâùÖ˼Àû¶Ÿ®Ð§¼¢^Ÿ§{–ž× ì£¯§à«[°õ´™¹-¾¨ÂþÆ1Ë7ÏÓÏÖeÚÕÝ)áXäsçnêTí ðÖòzõøúèü>ÿ‹Àð# 3 0* 󨳕jH!û"Õ$¶&•(*l,c.b0i2ƒ4£6Ü8;z=à?fBÿD«GwJMM@P9SCVAY?\_Ça3d2f·g‡h„h~gIe¹a·\VõMED/9ø,êgã¾÷hë/àWÖÎOÇ+Â~¾+¼öº»º>»V¼Ú½©¿«ÁÊÃùÅ.ÈdÊ–ÌÀÎíÐÓ6ÕU×}Ù£ÛÏÝà7âzä¿æéwëìíiðÿò õXø#ûþöO ~ Äø0E;ô\"\$Í%˜&Š&Ž%s# ugð 3<ûgðéä9Ù®ÍÆÂɸ(°©œ£çŸâhOžU L£ë¦ «z¯ ´³¸I½ÊÁ-ÆbÊrÎ\ÒÖ·Ù*Ý…à½ãÙæÞéÃì—ïQòöô‰÷úuüÉþS„§¼ Ë Ï Ì»²}Y4êÄ ¡"x$Z&9(!* ,.ü/ 24=6j8¬:=h?çA|D&GèIÀL©O¤R¦U®X¨[Ž^Ea¾cÔetgeh”hÂgÍe‡bÎ]„W¬OCFs;p/†"ŒLúÉíOâ.ØÏ‡ÈÃ%¿¼&»ºº»¼†½N¿DÁcËÅÃÇôÉ'ÌUÎТÒÎÔèÖÙ3ÛbÝ߯áäNæ èëlííïvòõÉ÷–úpých§ Ý U©ªlè!ù#Š%v&•&Î%ë#Ö o¦tö8ýŒò+ç~ÛçÏÔÄ¥º¹±Mª‰¤† *žm žãŸª¢-¦9ªš®*³Î·e¼ñÀQŕɪ͚Ñ`ÕÙ~Üäßã@æHé7ì ïÐñpô ÷‰ùýûWþ©ä=V h j k[P5üÚ¸Žk B"$ü%Ý'Ã)®+¡-œ/¡1²3Ð5þ7<:Œ<ò>hAûCžF_I/LORUX[ý]¾`Gcqe+gEh™hþgCf@cÓ^ÛXOQ7Hª=Ý1%½1 Ýü-ð}äÚ*ÑÒÉÄÕ¿ü¼]»Áº»Ý»A½ï¾äÀôÂ#ÅOnjɷËîÍÐ>ÒZÔƒÖ£ØÊÚõÜ!ßXá”ãÚå+è†êòìlï÷ñ•ôA÷ úÛüÐÿÉæ < w³í àp!•#E%M&Ÿ&ü%Y$}!\×ñ¬/ÿ«ôbéÁÝÒ鯼[³£«Œ¥/¡ƒžwÔwŸ¢v¥m©º­I²ä¶…»À}ÄÁÈåÌØÐ©ÔQØ×Û8ßâ¥å¶è¥ëîDññó‹öù†ûàý<s°Ñð  ýîܽ£~Z7 ê!Á#¢%~'e)N+@-9/=1K3f5“7Ê9ì@{CFÔH¤KƒN{QxTW~Zm]9`Íb eÝfh–h*h®fîcÌ_ZçRJÑ?B4¥'jØ wÿò¶æÜÏÒ)ËÅ—Àv½¡»Ôºêº«»ô¼˜¾€ÀŽÂ·ÄãÆÉJË~ͦÏÏÑòÓÖ:Ø_ڈܳÞèà!ãgåµçêzìíîwñ ô¼öxùOü8ÿ4Hfš ÏDux\í 2#ñ$#&“&+&¶$ ":XZ ¿öœëà[Ô É{¾µ­ž¦ç¡ïž±Ÿ¡Æ¤ž¨â¬c±¶Ÿº2¿¢ÃñÇÌÐíÓŸ×(Û—ÞÝá åèëõí¼ðmó ö•ø ûqýÁÿ =m†œ ¤ ¦žŽ|aE"ÙµŒ!g#E%"' )ï*à,Ø.Ø0ã2ÿ4#7]9¥;>t@øB–EKHKõMãPæSäVïY×\²_Kb£d†fçg‡hSh gŒdµ`Q[nTêKîAœ6.* €õüè ÞˆÔ’Ì0ÆbÁÿ½ê»ïºÙº»®¼G¾À&ÂIÄwƬÈáÊÍ=ÏdчӬÕÍ×ôÙÜIÞwà²âõä?ç˜éûëqîóðŒó2öìøÁû þž©Æø -o¤ÔáËm Ä"Ÿ$ñ%ˆ&J& %±" ·ú ôÍøÍíEâ™Ö.ËyÀɶ}®½§¸¢cŸ¾’ºžý ¤Ú§ ¬°µº¹O¾ÇÂÇNËRÏ5ÓæÖÚéÝ@ámä‰ç‚êgí5ðèò‹õø“úùüRÿšÑ9 < E;1æÈ¤~Z/!#æ$È&ª(*,w.r0‚2’4»6í81;Œ=ö?{BEÅG†JgMNPNSOVRYJ\#_Ïa2d0f¬grhlh\gea{\äU±MüCè8±,¦1°˜÷MëàNÖÎVÇ=•¾D¼»ÔºX»l¼ñ½¾¿ÀÁßà Æ@ÈqÊ£ÌÐÎöÐÓAÕa׉٭ÛÙÝàBâ€äËæ"éƒëõívðó¬õ`ø1û þ  +V ‰ É2K7ñN"J$°%u&]&[%1#Ø Š ÅÒúöïˆäרaÍy˜¸ù¯ò¨£îŸó…nž~ n£§0«£¯6´Ö¸p½éÁMÆ{Ê“ÎoÒ4ÖÌÙCÝœàÑãðæïéÚìªïdò õ™÷úƒüÞþ)d–¶Ñ Ù ã ÙÒ¾¦ŒjI%þÕ ´"ˆ$o&J(4* ,.02.4M68¿:=?ûA‘D:GüIÓL¾OµR»U¼X¶[–^Ka¾cÓejgXhh£g¨eUb˜]DWkOûE-;,/@"ÝQ#ú¤í;â#ØÏ“È"Ã;¿¢¼?»Ôº4»0¼¤½`¿_ÁoáÅÏÇÊ6Ìc΋гÒÒÔùÖÙCÛjÝ›ßÑáäXæ¨è ëuí÷ï‚ò#õÚ÷žú~ýluв ê !c‘­¨dß!ç#v%T&q&–%¯#Œ KÎü"òÃæۑχÄmº±2ª‚¤† ;ž€-ž Ô¢V¦dªÁ®S³ï·Œ¼ ÁsűÉÇ͵Ñ{ÕÙ˜Üøß2ãXæ\éIì!ïÝñ‡ô÷ù üjþ¸ø(Qd z { zq_I.ìÊž€ S"3$&ï'Õ)Á+±-°/³1Æ3ä58N:¢<?AD´FrIEL+O!R#U#X#[^É`Gcte g7hhâgfc˜^¦X QòG`=•1Ö$€û °ü ðfäÚ)ÑÒÉ!Ä俽t»àº»û»T½¿÷À Ã0ÅiÇ•ÉÊËøÍÐIÒiÔÖ°ØÕÚýÜ.ß_áŸãáå6èêÿìvïòŸôM÷úëüÖÿÞê B ‚»ñße!…#.%-&v&Ë%$;! ‹G¿þ=ôüè]ÝÇÑŸÆN¼/³„«}¥.¡žŽ÷™Ÿ:¢Ÿ¥“©å­m² ·ª»/ÀÄÞÈÍòÐÂÔjØíÛRß•â¼åÈèºë”îWñôžö!ù•û÷ýF‰¾ã   êÑ´oH ý!Ô#²%”'v)b+S-M/N1b3u5§7Þ9-<Ž>AŽC/FèH·K—NŽQ‰TWZy]@`Ïb e×f h‚hhŠfÃc–_æY¤RÔIŠ?û3d'(  Eÿwò˜æüÛÈÒ/Ë$Å¥À½µ»îº»Ç» ½³¾”À¤ÂÆÄ÷Æ(É_ˈͷÏÛÑÿÓ"ÖCØiڒܽÞòà-ãrå¾çê€ìøîñôÅö†ù[üBÿCOs¥ ÚNv|Sé #à$&r&ú%€$Ø!î¥úõ ©Uö3ëŸßÔºÈ<¾Û´ç¬‹¦é¡öž§Ë6Ÿ¨¡ï¤Æ¨­‡±)¶ÂºR¿ÁÃÈ2Ì6ÐÔ¸×AÛ©Þöáå3è)ëîÏðóö¥øûý×ÿR{˜® ³ ·¯ rX3ìÆ !y#W%6')+ï,í.è0ú2587q9¸;>‡@CªE_H*KNûPòSûVôYê\µ_Sb¤dfÜgvh7hèfed` [,T©K§AQ6ì)ÇHàíôßèûÝ{Ô–Ì5ÆtÁ¾¼»õºš»Æ¼\¾2À=Â[ċƽÈíÊ ÍHÏpєӴÕÛ×þÙ$ÜRÞ€à½âüäKç é ì{îñ•ó=öùøÊû®þª´× :u«ÖçÄn ±"$Ð%g&&Ø$k"ÄÀ\“ Š_ødíàá=ÖßÊ7À“¶Z®§§°¢mŸÌ²Úž#¡>¤¨1¬ª°@µß¹t¾äÂAÇfËqÏIÓבÚÞQá†äœç—êzíFðüòõ)ø¢ú ýcÿªä0G R SP>1úÙµ‘lC!#ú$×&¾(¢*”,‰.†0•2¥4Ï69G;ž= @B*EÔGŸJsMgP\SaVcYS\0_Ða4d+fŸgfhRh?g÷d_aD\¦UlM·C£8l,gó~m÷-ëàGÖÎeÇHª¾Y¼*»ìºq»…¼ ¾Ô¿ÖÁðÃÆNȂʱÌÜÎÑ*ÓJÕp×Ù·ÛâÝàHâŽäÓæ+éëûí‚ðó·õmø<ûþ:[ ˜ Î 4N5èC"6$š%P&7&#%õ"É®+ [múï#ä}Ø Í8Â]¸Ø¯Ú¨Š£õŸžžž ™£=§^«É¯]´÷¸’½ ÂiƛʩΎÒKÖåÙYݰàèãçêëì¾ïvòõª÷)ú•üîþ:v§Æá ë ó ëáѵ¡z\3ç Ä" $z&c(C*4,&.$0-2?4c6’8Õ:+=?B¡DQGJèLÏOÈRÉUËXÃ[Ÿ^RaÁcÐecgFhjh€g„e&ba] W'O¸Eç:á."œ öùˆí#âØŽÏ“È6ÃF¿¿¼T»òºJ»N¼¶½z¿pÁ…óÅáÇÊEÌpΘнÒàÔ×&ÙLÛvÝ£ßÛáäaæ´èë‚íðò-õå÷ªúˆý|{›½ ò 1a™±¡hÌ!Ý#X%6&E&d%s#C Ñì¸"gü´ñ^æ¾Ú=ÏCÄ2ºh±ªz¤ƒ Mž–Mž+ ø¢¦Šªç®z³¸°¼-Á’ÅÍÉãÍÌÑ–Õ0Ù²Ü àJãjæqé[ì3ïòñ•ô2÷¨ù#üwþÌ<^z † ‹€sX@ ýÜ²Ž j"@$$&þ'é)Ó+Å-Ã/Ç1Ø3ø5$8e:µ<?’A$DÉF†IYL;O7R/U9X,[^Ì`Mcmeg'hohÄgúeèbj^bXÎP¨G=O1”$CÄ ‚üçïJäùÙ"ÑÚÉ,Äù¿*½»÷º0»¼n½¿ÁÃDÅwÇ¥ÉØËÎ+ÐTÒvÔ˜ÖºØßÚÝ7ßká§ãðå=èêí‚ï ò©ôZ÷úøüãÿçù M ŒÁùÚZ!w#%&M&ž%à#÷ º'-ÞYþÓó—èþÜnÑSƼ³g«p¥/¡žž¤ž½Ÿ^¢Ê¥»©®•²1·Ë»RÀ¸ÄÉÍÑÚÔ‚ØÜgߪâÑåÛèÐë¥îkñô®ö5ù£û þSŸÊù % ' -þàÈ €Z1 "ç#Ä%¦'‹)q+i-Z/g1m3’5´7ö9@< >A CDFýHÈK­NŸQ›T W˜Z…]D`Öb eÑfþgnhögff™cc_®YeR‘IC?¶3'éf ÿRòæëÛÄÒ0Ë.ŵÀ£½Ì» »»â»%½Å¾¬À´ÂÛÄÇ:ÉlË–ÍÂÏçÑ Ô.ÖMØtÚœÜÇÞüà5ãzåÉç"êìï‹ñ%ôÏö’ùbüQÿI`}° ã$PzzQà #Ì$ç%L&Ì%C$›!ŸT‘ BîõÊêCߦÓtÈü½±´Ä¬~¦á¡Ÿ¸éWŸÐ¡¥ò¨0­²±I¶çºr¿àÃ/ÈNÌOÐÔÏ×XÛÀÞ â4åGè<ëîáð’ó/ö¶ø/ûýèÿ*`§¾ Ç Å° ƒiD$þ׳!‰#k%E'/)+-þ.ý0 3#5M7‚9Í;+>š@#C¾EsH=KN QTWZô\¿_Wb¡d~fÍgfhhÈf>dN`çZíSdKbA 6¦)Š®Éô¿èèÝyÔ“ÌEÆÁ)¾¼»»±»à¼u¾HÀRÂoÄ™ÆÐÈúÊ0ÍSÏ~ÑžÓÄÕâ× Ú,Ü[ÞàÂâ åPç°éì‡îñ óHöùÔû»þµ¿â Ez¶ØèÄ` ¨"x$¹%A&ï%¡$,"zmú6 ý÷ûì‚áâÕ‘Êö¿`¶8®”§­¢uŸáÉþžG¡e¤+¨X¬Ô°cµºŒ¾ ÃWdžˊÏcÓתÚÞfáä¬ç­êíYðó¬õ>ø°ú ýpÿ½ô"@Z _ f^RA% éÉ£zW!0# %ï&Ë(¹*£,œ.›0¢2¾4Þ69X;¶=@¦B8EëG¯J‹MvPqSnVpY`\4_Ûa0d)f•gTh;hgÑd+a\dU1MnC^8%,%¼FL÷ëúß:Ö ÎiÇY¼¾p¼F»»»›¼$¾ê¿êÁÄ0Æ_È’Ê¿ÌëÎÑ5ÓUÕy×›ÙÃÛìÝàVâ“äßæ5é•ë î‰ðóÁõyøGû%þ$Cj ¡ Ø<J7Ý;""$€%/&&ï$³"DxSÇ õÿù'ï¼ã!ظÌôÁ(¸³¯Ã¨ƒ£øŸž¸®žÇ ¿£i§…«ñ¯´¹²½,‡ƷÊÅΧÒdÖûÙqÝÆàüãçêíÌïŠò.õ»÷<ú¤üÿL„ºÕó ý ïäȯnE"û Õ"°$&q(W*G,7.:0<2W4r6©8å:?=¦?$BºDcG%JûLâOÛRØUÚXÍ[©^YaÁcÍeUg;hMhjgYeûa-]ÌVèNpE :.¿!bêÎùdíâØŠÏ È?Ã`¿Ò¼q» »f»e¼Ï½“¿‚ÁÃÂÅòÇ#ÊRÌ~Î¥ÐËÒêÔ×/ÙTۂݪßéáäoæºè#ë‡íð•ò<õí÷¸ú“ý†Œ¡Ê û 5mœ°¦XÉ!Â#D%&&1%3# {•T»þûMñúå`ÚèÎûÃû¹>±ÿ©l¤Ž WžµhžP £¨¦´ª¯ ³8¸Ò¼MÁ±ÅêÉüÍêÑ©ÕMÙÇÜ"à^ãæ„épìEïò©ôB÷¼ù2ü‰þÜMm ” ¢ š“‚lQ1ìÅ¢ x"V$3&(ú)æ+Ù-Ô/Ú1í3 6;8v:Ç,A´CZFIÛKÁN¬Q¯T¬W§Z]N`ÕbeÇfògWhÞgAfnc4_qY)RJI?o3ß&¬4 ëþ1òhæÞÛÁÒ7Ë<ÅÊÀ·½ë»»:»ö»A½Û¾ÄÀÉÂíÄÇJÉyË¥ÍÍÏõÑÔ9ÖZØ|Ú¦ÜÐÞá>ã„åÑç-ê•ìï“ñ0ôÙöžùoü\ÿVjˆ¶ ð%]w}I× #´$È%'&™%$S!Tû=+ Úÿ‚õhêßÞRÓ$Ƚ~´ª¬j¦ç¡ ŸÓž{Ÿ÷¡9¥©[­×±r¶»–¿þÃLÈjÌhÐ6Ôé×mÛÙÞâLåXèQë-îôð¥óAöÈø>û¢ý÷ÿ:r¸Ð Ö ØÒ¯–yY3çÅ!#y%\'<)(+- /13:5^7–9â;>>¯@6CÒE‡HPK-NQTWZú\Ç_Yb dwfÃgPhh¢fd`²Z¯S'KAË5h)JÞ¨ô©èÜÝwÔ˜ÌTÆ‘Á?¾6¼9»,»Ì»ù¼‹¾_ÀdÂįÆÙÈË8ÍcφѬÓÊÕð×Ú8ÜdÞ•àÎâå\çµéìîñ¬óPöùÞûÆþ¿Ëé Kƒ»Ùæ½Y —"f$–% &½%i$ë!)žÏ ¹’÷”ì áˆÕDÊ´¿3¶®‡§§¢Ÿóå Ÿm¡¤T¨¬ù°‰µ(º±¾)ÃvǢˤÏ{Ó3×ÀÚ/Þ~á­äÃç¿êŸíkð!ó¿õMøÄú.ýƒÿÍ3Qh r wofO:ýÙ³e!F#%ÿ&á(È*¹,¬.¯0¸2Ï4ô6(9n;Ç=4@·BPEHÃJžM†P‚SV}Ym\;_àa/d&f‰gAh%húf¬dû`Ü[(UíL+C8ã+è÷öêáß7Ö ÎsÇmÂÏ¾Ž¼Z»#»¦»¶¼:¾ÀÿÁÄ@ÆoÈ¢ÊËÌúÎÑDÓ^ՇףÙÎÛõÝ&à^âžäèæ>é¡ëî”ð&óËõ„øQû2þ(1Kt ¨ á>M1Ù)"$a% &Þ%·$w"ø)òh ‹—ùÀîYãÆ×i̱Áó·¯­¨}£þŸ)žÐОì ç£§­«°§´C¹Õ½J§ÆÓÊàοÒ}ÖÚ‰ÝÙàä)ç-êíäïšò?õÐ÷Jú¹üÿ\˜Çê  ñݽ¢|Y3 !è"Á$¤&€(l*Y,J.M0O2i4‡6¼8ü:R=¼?7BÏDvG8JMóOîRçUéXÙ[²^\aÃcÉeMg+h8hIg5eËa÷\“V¦N-E^:W.!$»¡ùJíùá؋ϪÈLÃv¿æ¼Œ»!»ƒ»}¼ê½¨¿˜Á°ÃÓÅÈ3Êa̋βÐÕÒöÔ×9Ùaۇݹßîá+ävæÅè(ë–íð¥òCõû÷Àú ý‘•¯Ñ <vœ¶žW¸!·#'%ö%ñ%ÿ$ö"¸+<ñ Y“ûçð”åږδÃűè©b¤‘ fžÉŒžp H£Ò¦Ùª<¯Â³_¸ñ¼qÁÍÅÊÎÒÆÕaÙÞÜ7àsã’æ™é„ìXïò½ôO÷Óù?üþë*\‚™ © ¯ ­£”{dA"ýر Œ"f$G&$(*ö+í-å/ï1ý3 6J8:Ú@AÈCnF IòKÑNÀQÀT¹WµZ–]V`×beÀfãgGh½g$fAcÿ^*3ž&lþ »þ òRæÎÛ¿Ò9ËIÅÙÀν¼;»R»¼U½ø¾ÔÀàÂüÄ+ÇXɊ˱ÍÜÏÿÑ!ÔAÖeØ…Ú°ÜÜÞ áMã‰åßç5êžìïñ;ôäö¨ù}ücÿeq” ö/_}zGÉ õ"š$¯%ü%n%Ô#!£àÊqÿõêÞûÒÙǃ½R´ˆ¬`¦ß¡Ÿß&žšŸ¢d¥C©‚­²”¶.»´¿ÄiȆ̂ÐRÔüׇÛêÞ6â[åqèaëAîñ³óUöØøPû´ýK…ªÏÚ ë çãÔÀ¦‹iF!ûÔ!²#Œ%l'P)9+,-!/%1/3L5t7©9ù;L>È@FCéEšHbKBN,Q(T$W Z]Í__bždsfµg?hëg…fêcî_xZsSàJÝ@~5') ¤QôŒèÌÝlÔÌYÆ£ÁU¾J¼V»C»æ»½¢¾uÀy”ĽÆîÈËHÍnϕѶÓÖÕú×ÚAÜoÞœàÛâåhç¿é$ì›îñµó_öùíûÏþÍÕ÷ T‹½àå»P ‰"Q$}%ø%”%0$­!áÅDm S(÷1ì¼à3ÕöÉs¿¶ò­r§¥¢„Ÿ žýDŸŽ¡¹¤z¨ª¬±¯µMºÒ¾IÑÇÁ˼ϗÓHרÚEÞ•áÁä×çÒê±íð/óÔõ]øÖú?ý”ÿÞDcw † ƒƒscJ, ëÅ¡x!T#0%'ò(Ü*É,Á.¾0Î2à47<9;Ü=G@ÌBbEHÖJ±M˜P”SŒVŒYw\D_âa2dfg2h háfdÑ`¤[íT­LèBÓ7¡+¨HéùöÕêÑß/Ö ÎÇxÂæ¾ ¼w»:»Á»Ï¼S¾ÀÂ%ÄVÆ{ȱÊÙÌÏ'ÑLÓmՋ׳ÙÒÛÞ/àhâ¦äóæGé¬ëîžð1ó×õŽø\û=þ3<U~ ± è@O,Ò"ý#J%ì%²%†$8"²Öœ '5ùZîûâo×ÌqÁÁ·j¯š¨v£ 7žéñž ¡¤µ§×«>°Ì´e¹ô½kÂÁÆòÊ÷ÎÛÒÖ-Ú˜Ýôà"ä@ç>ê$íöï¬òOõâ÷ZúÉü ÿmªÕü " #ëÓ®‘fH!ü"Ñ$µ&“(}*k,].^0c2{46Ë8;a=Ò?IBáDŒGIJ"MPûRúUóXç[¹^baÅcÃeFghh.g e£aÂ\YVhNêD:.?!îˆzù*íæáþ׉ϱÈ[Ç¿½£»=»œ»”¼¾¹¿´Á½ÃèÅÈBÊp̗ξÐßÒÕ#×BÙlÛÝÂßùá1äæÎè4ëŸí ð¬òRõøÍú¬ý˜¦´à  D{¢¶›Q¬!¢#%Ï%Ê%Ì$¹"sÙè“ ó0ûð4å«ÙCÎuùð°Ï©Z¤” vžä¦žš j£ü¦«a¯é³€¸½ÁëÅ$Ê2ÎÒÞÕvÙöÜHà‹ã£æ®é”ìhï)òÍôc÷âùOü¯þú;l‘ª ¼ ¼ ð§ŒsU2é Ÿ"u$Y&6(* ,þ-ù/24/6c8™:ô j ¤ÖÌ6!G#Í$´%Ö%%2#' Ð$µ$ýòlçåÛsÐÅc»†²«P¥0¡Çžænž% Ô¢=¦7ª‚®³›·3¼¯ÀÅPÉoÍYÑ%ÕÇØHܦßéâ æéìßî ñKôåöeùÛû7þ‹Ë%E R ^ \SD/÷Ù°d D"$ø%Þ'½)¬+ž-•/ž1§3É5ð70:{<Ý>RAÝCF7ILãNÓQÍTÉW¾Z¢]Y`Þbe¾fÔg5h£gþecÎ^Y©QÊHw>è2\&2É ‘þîñ9æÃÛ»Ò=ËWÅèÀç½¼T»l»-¼n½¿êÀòÂÅ;ÇjÉ”ËÂÍåÏ Ò+ÔMÖmؓڷÜçÞáSã•åçç>êªì ï«ñDôñö±ùˆüpÿp|ŸÊ 4d}z@ á"‡$%Ù%:%#Ì ¼O„cÿ³ôœé$Þ£Ò”ÇE½(´i¬Q¦à¡"Ÿü<žÁŸ@¢Œ¥k©§­'²¹¶M»Ø¿;Ćȣ̙ÐkÔØÛßJâoå„ètëRîñÇódöëø_ûÅý^’¾Úð ø úóåѹ™|U4 æ!Â#›%‚'_)N+;-5/61G3[5ˆ7½9Ö@^CúE®HxKONAQ5T5W,Z]Ø_^bŸdjf©g/hÏgefÂc¾_>Z:SœJš@=5å(Îo"]ôtè»ÝhÔ¡ÌeƵÁh¾e¼l»_»ý».½¸¾‹ÀŽÂ£ÄÑÆúÈ*ËSÍ}Ï ÑÀÓäÕØ&ÚKÜwÞ§àãâ!årçÇé0ì£î(ñÁógö(ùõûÞþÒäý) ]Ããá¹C }"8$b%Õ%d%ý#f!œmì ñÃöÌë_àÚÔ®É5¿ÒµÕ­`§£¢ŸžžbŸ´¡á¤ ¨Ó¬C±×µiºú¾aôÇÙËÕϱÓ^×ðÚXÞ©áÔäìçâêÆíðDóäõløèúOý£ÿï&St‡ – •“ƒs[=úذ‹!g#A%"')í*Ü,Ô.Ñ0à2ô47R9‘;ò=Y@ßBwE%HêJÂM«P S V•Y‚\M_ãa5dfug hóg½f^dœ`s[°TmL¦B7`+i¼Òö¾ê¿ß(Ö Î†Ç‹Âù¾»¼Ž»X»Ö»î¼c¾4À"ÂAÄaÆÈ¾ÊæÌÏ4ÑUÓxÕ•×»ÙáÛÞ<àmâ³äúæRé³ë*î¦ð>óàõšøgûHþ>F`‰ · óHJ,Æ"å#1%Å%‡%Q$ö!k‚D¤ ÅÉøöí—â×ÌË.Á·F¯ƒ¨r£  KžžŸ0¡;¤Û§¬c°ò´Š¹¾ŒÂ߯ ËÏñÒ¬Ö@Ú±Ýá7äVçPê9íð¾òaõò÷núØü2ÿ}¸é ! 2 21$ýàß|V/! #å$Æ&¦(*z,r.n0z2Š4³6Ü8(;v=ã?`BóDŸG^J2MP S VYò[Á^faÅc¿e=gh h gèduaŒ\ V&N¨DÔ9Ò-!±YQù íÖáñ׌ϸÈlÚ¿½¼»W»µ»°¼¾Ô¿ÅÁÒÃûÅ ÈQÊ}Ì£ÎÊÐìÒ Õ/×LÙtÛ›ÝËßÿáA䄿Þè9ëªí+ðµò]õ øÙú¶ý¦®¿ê  N€¥¶šG¡!#ø$®%¡%–$€")‹Œ4 ŽÊúðÓäMÙõÍ+Ã[¹Å°¼©M¤š „žþÅž¼ ‘£#§*«ˆ¯ ´¨¸2½±Á Æ@ÊLÎ5ÒóÕ‘Ù Ý`àãºæ½é«ìyï<òÞôt÷óùaü¾þ J~£¸ Î Ï ÏÆ³¡ƒfD!ø× ¬"‹$h&J(/*, .02&4D6t8°:=i?áAtDGÕI¡LŠOvRsUmX^[6^è`NcheöfðghRgge9b›]~WÐO¡F¥6¡ÑžÿžH û¢g¦]ª®®*³Æ·P¼ÕÀ4ÅpɉÍsÑ>ÕÝØ_ܽßýâ!æ*éìóî°ñ_ôóözùèûLþ›Ü6U e l ndUA' çÆz T"-$&ë'Ó)½+¯-ª/®1¾3Ú58@:‘<ñ>fAñC•FGILñNçQÚTÚWÌZ©]c`Übe³fÇghˆgÜeïbš^ÍXiQˆH1>¢2&ò— `þËñ æ´Û¸ÒCËaÅÿÀú½1¼p»…»H¼†½%¿ÁÃ"ÅLÇvɧËÊÍõÏÒ5ÔZÖuØžÚ¿ÜñÞá\ã¡åîçLê±ì-ï³ñPôûö¿ùüÿwŠ§Õ =hx:· Ô"m$s%®%%a#Š oø&§þJô;é¿ÝSÒDÇ ½÷³N¬@¦á¡.Ÿž]žßŸi¢²¥”©Ò­J²â¶o»ù¿ZĤȼ̴ЅÔ)صÛß]â‡å“èŠëdî,ñÙóvöüøsûÔý*n£Ïë óåÇ­ŒiC õ!×#¬%“'r)a+M-H/J1V3r5š7Ò9ê@tC FÃH‡KfNRQDTGW4Z]Û_ebœdhfšgh³gDf—cŒ_ Z÷R_JQ@ú4ž(5ò8ôWè­ÝbÔ¢ÌpÆÃÁ~¾}¼†»z»¼C½Ò¾¢À Â¹Ä߯É5Ëf̈́ϭÑÌÓëÕØ,ÚYÜ~Þ´àëâ+å}çÐé:ì¯î2ñÎóqö2ùüæþäé 2 dœÄåä¯A i"'$C%°%7%Ä#'!M¨ ˆ[öeëÿßÔaÉô¾¥µ±­Q§¢—Ÿ.ž7ž„ŸÜ¡¥Ê¨ý¬i±ýµº¿‡ÃÌÇøËïÏÉÓz×ÛrÞ»áëäÿçöêØí£ðUóõõøöúeý±ÿ3gƒš ¦ ¥§“†kO0æÅœ!w#T%3')+í,ç.æ0ð2 5+7g9¥;>l@öBˆE;HüJÕM½P³S¬V¥Y‹\U_èa4dfighÚgŸf3dq`7[xT'LaBI7+.Ô‹ªö›ê°ßÖÎǘ¿м¨»s»ñ»½€¾FÀ<ÂQÄvÆžÈÎÊõÌÏBÑ`Ó…Õ ×ÅÙèÛÞEàxâ¼äçZéÃë,î¸ðCóïõ¤øtûTþJRj” À ú&FQ!Ä"Ó#%¢%Y%$·! 1åC \bøí8âµÖ€ËæÀ^·¯s¨g£ Yž ž/Ÿ\¡Z¤ ¨#¬°µ±¹5¾®ÂûÆ)Ë/Ï ÓÄÖVÚÉÝáNähçcêMíðÑòuõøúéüCÿÈû4 @ G>9#ôÒ²Œh?! #ô$Ú&·(¤*,†.€0Œ2 4Â6ô87;=ö?tBE²GqJDM-PSVYù[Ï^faÊc¸e2gûgògðfÂdDaY\äUäMhDŠ9-Á y#*ùêìÄáå׎ϽÈ{î¿.½Ö»q»Ó»Å¼7¾å¿ÛÁèÃÆ6È]ʌ̯Î×ÐöÒÕ6×WÙ€Û¢Ý×ßâLäæåèCë¶í1ðÆòbõøâúÃý°¹Ìñ T…ªµ˜?”!}#Ü$%u%b$C"à=0Ó *`ú²ïnäòØ¢Íê ¹£°¢©F¤ž –žžéžÞ »£K§T«®¯6´Ê¸V½ÒÁ%Æ_ÊeÎRÒÖ«ÙÝ}à«ãÔæÎé¾ìŽïKòóô„÷úrüÑþ]Œ²Í Û â áÒË«šrY.ä À"$x&_(@*1,".0&284X6‡8Å:={?øA„D.GåI¹L—O‰RƒUzXj[@^è`Vc^eòfÞgh3gDe bl]?W–OWFÇ;ú/R#¬ûGïÝãÃÙÑûÉoÄWÀ™½ ¼v»¸»‘¼æ½“¿wÁ€Ã ÅÆÇôÉÌFÎkЊҮÔËÖíØÛ7Ýeß›áÕãæpèÊê;í³ïAòÞô‘÷Tú2ý -S } ³ã »#! #Ÿ$s%ƒ%¦$¹"œ5pVèXüÏñ£æ/ÛÈÏõÄîº3²áª4¥9¡Ýžž«žk #£Ž¦…ªÕ®P³é·v¼ñÀVňɦÍÑRÕúØpÜÔßã4æ>é-ìÿîÉñkô÷Šùúû[þ®ë%Gf u  }tgQ9úձРf"?$ &ü'è)Î+Â-¾/¾1Ó3î58W:¢<?{AD§F\I)LOõQíTåWÖZµ]f`ábþd¬fºg hkg»eÂbk^X0QBHð=\2Ú%·^ 5þ¨ñæ©Û°ÒLËiÅÁ ¾K¼‡»¢»_¼ ½<¿ÁÃ5Å\džɵË×ÍÐÒEÔaÖ‚Ø¥ÚÌÜøÞ+áeãªåùçTê¾ì6ï¿ñYô ÷Æù¢üƒÿ‡µÛ Bk„t7ª Ã"Y$R%Š%Ý$&#H !¢ÊœAþãóÔèbÝùÑýÆÎ¼Ê³2¬0¦à¡:Ÿ"ž{ž ¢Ü¥¼©ø­t²·—»À}ļÈÛÌÏЙÔGØÆÛ.ßrâ›å¨èëvî?ñêó‰ö ù„ûåý={ºÛÿ  ñÞº¢uY, "â#Ä%¢'†)r+`-Z/^1j3ƒ5¯7å9/<>û@‰CFØHšKyN`QYTQWEZ&]ã_gbžd]f’gh›g$fkca_ÎY¼RJ @´4](Pþ Åô@è™Ý[Ô¦ÌyÆÖÁ“¾’¼¤»»6¼[½é¾·À¶ÂËÄòÆÉFËq͒ϺÑÖÓøÕØ7Ú`ÜŠÞºàõâ7åƒçÞéCì·îAñÓó€ö<ù üõþêú; pœÐää¬3 ]"$'%‰% %‹#è È/F óõëœß+Ôɵ¾uµ­=§¢ŸŸCžRž§Ÿ¢,¥ø¨­—±¶¶º9¿£ÃïÇÌ ÐáÓ×ÛƒÞÔáüäèëîí²ðjóö‘ø ûoýÉÿIu•ª ¸ ¸µ¥—{c?!öت!Œ#e%F'))+-ø.ú035B7v9½;>ƒ@CŸELHKèMÎPÄS»V±Y—\[_îa2d fagýgÁg€f d?`[6TêKB7Ø*ëZ…ö€êßÖΘǪÂ!¿ë¼¿»» ¼!½–¾]ÀPÂdĆƯÈÜÊÍ)ÏNÑkӌծ×ËÙöÛÞMàƒâÅä çhéÇë=î½ðRóùõ±ø}ûbþR`t Ì ý-JN"¶õ!¾#ù$~%0%à#y!ÕÜŒâ óý÷$í×á\Ö-˧À)·þ®[¨d£ lž:žPŸ€¡ƒ¤3¨N¬´°?µÎ¹^¾ÈÂÇEËIÏ%ÓÜÖmÚßÝ1áaä}çxê^í-ðáò‰õø”úøüXÿœÞ.D Q WRG6åÞyS!.# %ê&Ì(²*£,”.˜0œ2´4Ö69L;¡= @ˆBEÇG„JZM;P.S)VY\Ó^naÉc¶e'gégÝgÐfšda\¬U¡M"DF9J- =òþøÎì¬áÞ׊ÏÈȇÃÄ¿D½ð»‹»ë»á¼K¾ÀíÁÿÃÆIÈkÊšÌÀÎàÐÓ"ÕA×dÙ‡Û®ÝàßâTäšæïèRë»íCðÈòvõ#øñúÌý¿ÀÝö 1 U‘©¹“9†!k#Á$m%G%2$ý!ŸâÝk ÅòùKï 䓨QÍ Âë¸y°ˆ©@¤Ÿ ¨ž+ž Ÿ¡ã£u§{«Ù¯[´ï¸{½ñÁGÆyÊ…ÎfÒ'Ö¾Ù6ÝŽàÃãçæâéÓìŸï`òõ™÷ú†üßþ1mŸÅÛ ñ ð òèÕæ‰gCù Ò"°$‹&q(U*C,5.4082M4k6œ8Ù:-=‘? BœD@GúIÌL©O›R”U‡Xy[G^ò`Uc_eçfÑgíggeßa2]WPOF;²/ #Ù‹~û"ïÄãµÙÑÊyÄiÀ±½$¼“»Ñ»ª¼¾§¿Á”òÅÙÇÊ-ÌTÎwÐ˜Ò¸ÔØÖ÷ØÛDÝnß§áßã(æxè×êFí½ïPòæô ÷`ú<ý((<\ ‡ »é´!#‡$R%\%q$}"Uâð ‡èûiñ:æÎÚwϥĻº²Êª&¥;¡ìž-žËž H£»¦«ª¯w³¸–¼ÁoŭɾͧÑpÕ ÙÜçß(ãHæSé>ìïÖñ‚ô÷œùülþ½2[v … ’ ˆxaN'àÉ— }"N$4&(ø)ã+Ó-Ò/Ò1å36,8m:´<?ŒAD¼FpI;LORþTõWâZ¾]n`âbþd£f­gôgSg’e›b6^VXîPÿG¦=2•%x) þƒñðå˜Û®ÒMËyÅ!Á'¾c¼¥»¹»|¼¸½S¿/Á,ÃJÅnÇ–ÉÃËæÍ Ð.ÒMÔmÖØ¯ÚÖÜß6ámã¶åè_êËì=ïÏñ`ô÷Ñù«ü’ÿ’œÀå Ho„t0  ²"@$2%c%ª$ï"ÿÔJj6ØýyóoèݤѱƓ¼³¬!¦ã¡AŸ?ž”ž* ´¢¦ã©#®›²(·º»8ÀšÄÝÈõÌèжÔXØãÛ@ߊâ®å¼è°ë‹îPñüó›öù—û÷ýK‘Åð ! + -$ìϯeC "ö#×%²'›)‚+t-m/p1~3˜5Â7ù9D< >A˜C7FçH¯K‰NtQgTaWPZ/]é_lb™dYfƒgõg‚gfDc,_—YRÙIÇ?r4(Å ™ëó(èˆÝ\ԥ̊ÆåÁª¾¬¼½»¬»P¼t½¿ÏÀÈÂàÄÇ*ÉWËyͤÏÁÑãÓÖØGÚdÜ™ÞÁàã@åçééJìÆîGñáóŠöGùüÿôF u¥Ñèߨ( M"ú# %c%Û$S#£ ·o×à»ÿŒõšê>ßÔÓÆÈ{¾Cµr­/§—¢­ŸUžpžÈŸ(¢T¥©I­º±F¶Öº[¿ÄÃÈ0Ì"ÐüÓ©×/Û Þâáå%èëÿíÇðyóö øû€ýÛÿ^‚©¹ Ç ËÄ·§sQ2 ç¿!œ#x%X';)#+- / 13.5W7‡9Ó;*>—@C²E^H&KøMàPÕSÈVÀY¡\b_òa1d fTgëg©g]fãc`ÉZÿS¥KÙAÀ6“*¬f)`öcêß ÖΡǺÂ9¿½Þ»¦»'¼7½°¾sÀbÂ{Ä“ÆÄÈæÊÍ5ÏYÑvәնרÙþÛ$ÞXàŒâÐäçpéÔëFîÉð]óö¾ø‡ûmþ_h€¦ Ò .OK®ç!©#Ü$Z%%¬#:!ˆŒ- “÷ÀìráÖßÊhÀõ¶Þ®E¨c£ žTžrŸ¦¡¬¤Z¨x¬Ù°fµô¹|¾ìÂ7ÇdË`Ï@ÓñÖ†ÚõÝDáyäçŽêoíAðòòšõ&ø úýeÿ±ë=U d eeXE2øÓ±‰g!?#%û&Ý(Ç*´,©.ª0°2È4ê69a;³= @™B3EÖG›JiMLPBS3V-Y\Þ^qaÈc³egÝgÁg³ftdè`î[kUbMÞC9-B ÃÕø±ì˜áÕ×ÏÎÈšÃÖ¿\½ ¼¥»¼û¼c¾ÀÂÄ*ÆVÈ}ʧÌÊÎîÐÓ-ÕL×mÙ’Û·Ýéßâ\䦿÷è\ëÈíIðÚòxõ5ø÷úÚýÈÌå 4 b³±”+|!U#¥$L%%ý#À!T“€ _Žùäî¥ã<ØþÌb³¸W°p©<¤£ ¸žEž(Ÿ)¡ ¤š§§«þ¯ƒ´¹½ÂfƔʠ΀Ò>ÖÓÙNÝŸàÝãõæúéáìµïoòõ¨÷'ú–üñþA|³Òð ý öëμ˜wW+!á"Â$ &~(m*O,N.B0N2]4‚6ª8ò:==¦? B¬DUG JÞL½O«R U˜X[P^÷`UcZeáf»gÜgôfüd¯a]ÊVOÔE7;t/Ê"¢VYûïµã¨ÙÑ ÊŠÄ{À˽;¼°»ê»Æ¼¾¾¿¤Á¦ÃÆÅèÇÊ;Ì_΅СÒÃÔáÖÙ$ÛNÝvß°áèã2æ‚èáêNíÊïWòõô§÷lúGý15Cf Áî« !ý"k$2%0%@$A"•¿– †ûþðÝåoÚ'Ïcĺ߱­ª!¥:¡ÿžCžëž´ o£á¦×ª#¯¡³.¸¿¼2Á’ÅÅÉÛÍ¿ÑˆÕ Ù¥Üûß=ã\æeéTì(ïëñô-÷«ùü€þËAl‡ ˜ Ÿ  –ŠtY>ùÕ­ Š"c$C&#( *ô+ç-ä/ä1ú36A8:Èáwã¿å èjêÒìIïÖñoô÷áù±ü¢ÿ—©Çí !Mt„r'™ œ"+$%:%|$°"Áö Òsýó è¨ÜKÑoÆT¼u³ø«¦â¡PŸTž²žN Ø¢0¦ ªN®½²P·Ü»XÀ»Ä÷ÈÍÑËÔvØóÛZß›âÂåÓè¿ë¢î_ñô©ö1ù¦û þ[¢Õ 3 ; >6+ÞÁwT -"$ç%Ç'«)˜+„-ƒ/1’3«5Ó7:U<¹>"A°CGFüHÂK›N„QxTnW]Z8]ò_jbœdMfygàghgÝec÷^eY"à#ì$=%©$#` jw}Tÿ%õ1êâÞxÓÈ9¾µR­§—¢µŸjžŒžëŸN¢¥B©x­Ý±m¶ùº{¿âÃ)ÈFÌBÐÔ¿×IÛ³Þøá-å4è6ë îÝðˆó-ö²ø/û”ýéÿ2i˜·Ì Ø ÛÖÉ·ŸƒdAøÑ!¯#ˆ%l'M)7+'-/1+3D5h7ž9å;=>®@-CÆEtH6K NôPáSÚVÌY¨\n_ña4dfIgØgg=f¹cã_’ZÀSaK–Aw6S*k0ô>öCê€ßÖΪÇÍÂM¿½ú»¿»C¼Q½È¾‰À{‰īÆÏÈøÊÍBÏfуӢÕÂ×àÙ Ü.Þbà–âÙä!ç}éÚëUîÎðjó öÇø–ûuþlpŒ­ Ü 1TE¢Õ!—#»$9%Ð$v#ö A4Õ ,(÷\ìá­Õ“Ê'ÀŶ»®8¨Y£- žuž’ŸÌ¡Ò¤„¨¬±„µº˜¾ ÃUÇ}Ë~ÏUÓ ×™Ú ÞYáŒä¢ç êíRðóªõ9ø²úýwÿÁý,Od t xskVC&连u!S#.% 'ñ(Ú*Å,¿.¹0Ç2Ù4þ6/9s;Ê=1@±BBEîGªJ}MaPNSFV8Y\æ^vaÉc¬egËg¨g–fHd¿`²[4UM›C¼8Ã,ÿËŽ°ø“ì…áÏ׎ÏÙÈ©Ãì¿t½'¼¿»"¼½z¾0ÀÂ#Ä?ÆdȎʳÌÙÎúÐÓ9ÕU×yÙ˜ÛÄÝñß&âg䬿ébëÖíQðæò„õ?øûèýÎÞè : h—±¶‹'i!D#Š$'%ò$Å#ƒ! D"± ô)ù~îDãàװ̃¸1°]©2¤« ÈžažGŸO¡2¤Ã§Ð«$°ª´6¹¿½/…ưʹΛÒRÖïÙ`ݶàñã ç êõìÆïƒò(õº÷9ú¦üÿQÀåþ   ÷äÉ«‰eC!ú"Ï$±&•(w*k,X.Y0^2t46Æ8ý:V=·?1BÃDfG JòLÊO¾R­U§X‹[Y^ù`XcTe×f®gÂgÚfÕd„aÍ\’VÒN‘Eõ:1/Œ"h'-ûéîã£ÙÑÊ™ÄÀã½T¼Ì»¼â¼0¾Ö¿ºÁ¸ÃÚÅôÇ$ÊGÌmÎЮÒÎÔéÖ Ù,ÛXÝß¹áòã:æèéêYíÓïaòõ°÷yúOý@<Qn ˜ Éôþ¤þ è"R$%%$"ÈDh4 »û›ðwåÚÔÎÄNºµ±˜ª¥?¡ Ÿ\ž ŸØ —£ §«J¯Ç³R¸á¼SÁ®ÅåÉòÍÜÑÕ;ÙµÜàMãtævéfì<ïüñ£ô>÷»ù0üþÝ$Q~• ¬ ® ³¥›…jQ+ å¾ "s$W&4(*,ù-ö/ú1 4(6T8‘:ß<@?¶A@DáF—IaL=O(RUXùZÐ]w`çböd”fgÎggOeAbÔ]äWsPyG$=1%Á ¶ýBñÆåƒÛªÒ_Ë’ÅJÁV¾•¼Ú»ð»°¼ë½‚¿XÁUÃmŎǶÉÝËÎ$ÐDÒbÔÖ ØÂÚéÜßGá‚ãÆåèrêÛìWïÝñ|ô&÷ëù¿ü¨ÿ¤´Íú $Tx‚qŠ Ž"$ô$%I$w"z6 ¬uý³ò£çOÜúÐ&ƼK³Ü« ¦ä¡]ŸjžÏžq ÿ¢W¦2ªs®å²t·ü»zÀØÄÉ-ÍÑæÔŠØÜpß®âØåãèÕë°îtñ"ô¼öBù·ûþk´å/ C N NF;%óÏ®Œa B"$ù%Ø'À)¥+œ-‘/—1£3À5å7#:j<Æ>?AºCaF IÔK°N‘Q‹TwWkZB]ö_ob•dLfggÏgMg»eóbÉ^*YRZI>?ï3•' Z C¥óûçmÝU԰̤ÆÂÙ¾Þ¼ð»å»~¼¬½,¿üÀñÂÅ#ÇJÉq˘͸ÏÞÑóÓÖ2ØYÚ{ܨÞ×àãUåŸçýé^ìÙî]ñõó¡ö[ù1üÿ /X „²ÙêÜš )"Í#Ê$%y$ã" Åîþ¿ôÒé~Þ,Ó0Ⱦê´2­§¢ÅŸ}ž©ž r¢¥¥o©—­ ²‹¶!»™¿ÄBÈbÌZÐ*ÔØ×]ÛÈÞâ<åNèCë%îèð ó;öÆø?û£ýüÿA{¨ÆÞ è éèÙɯ•sU+ à!Â#™%'])L+6-4/.1?3T5|7³9ô;W>º@EC×E†HIKNQñSêVÔY·\p_öa1dûe;gÇgugf‘c´_\Z†S#KVA46*/ûÌö1ênßÖθÇÝÂc¿3½¼Ü»\¼j½ß¾¡ÀŒÂ Ä¶ÆâÈË-ÍOÏoÑÓ©ÕÎ×éÙÜ7ÞjàŸâáä.çéèëZîÜðróöÐø¡û~þv|“· ã ;NI™Ç!}#£$%§$<#¹ õåy¾ ÆÆöøë·àUÕKÊê¿™¶š®%¨Y£3 ¤žŒž¶Ÿî¡ü¤«¨Ä¬.±¨µ?º»¾*ÃqǙ˖ÏpÓ ×´ÚÞqáä·ç±ê—íaðó¹õJøÃú0ý„ÿÖ ?^u † †…zhS7ùϰ…!e#?% ')ê*Ú,Í.Ò0Ñ2ó4 7D9†;Ú=F@ÃBVEÿG¼JMmPbSNVFY#\ê^|aÄc«eg¹g–gpf+d‹`„[÷TäLXC}8…,Å–bŒø{ìváÊ×’ÏãȼÃÀ½B¼×»@¼+½•¾EÀ+Â6ÄPÆrÈžÊ½ÌæÎÑ$ÓCÕ^׃٠ÛÍÝùß0âoä¶æ ékëàíZðïòõFøûíýÝâó ? p˜´´†Z!0#k$%Á$“#D!ÃôÎN ˜Ãøîèâ‹×fÌÞÁU¸°K©-¤± ÝžvžlŸn¡\¤é§õ«N°É´[¹Ý½N ÆÌÊÐγÒiÖÚtÝÎàþã!çê íÖï•ò8õÊ÷Mú³üÿ`žÒô  &ø×¼švS+!#å$¿&©(‡*~,h.n0o2†4£6Õ8;g=Ë?EBÓD{G/JMÜOÎR¼U±X–[_^þ`YcOeÌf¡gªg¿f°dZa™\]V“NUE³:ò.R"3ù ûÊî’ã˜ÙÑʩħÀø½r¼â»!¼ø¼K¾í¿ÌÁÎÃåÅ È.ÊUÌzΗоÒÒÔùÖÙ6Ûb݉ßÂáüãCæ•èõê`íÝïkò õ¼÷‚úYýJEYx Óòúœï Ö"7$ï$Û$Ü#Å!„öÚ W¼ú7ðåÀÙ„Îßú•±~ª¥E¡Ÿwž%Ÿþ º£2§&«q¯ê³y¸ý¼vÁÉÅÊ ÎòѵÕPÙÌÜ)à_ã‰æ…é|ìJïòµôM÷Îù@üžþð0e‹© ¸ Á Á¶¬“~]?óÕ ¨"‡$h&E(.*, .024@6c8¥:òJAÔCoF!IåK¿N£Q˜TˆWvZH]ý_pb“dDfYg¼g1gšeÉb™^óXÇQIý>®3V'h' ‡óáçfÝOԺ̯ÆÂò¾ó¼¼ú»ž¼Á½G¿ÁÃÅ6ÇWɀˣÍÇÏâÑÔÖBØ^چܯÞãàã_å¨çêhìåîcñô¨öhù8üÿ :^ ´ßçÜ“ "°#²$í$L$ª"ÙÖqÀ¾‰þ]ôné'ÞÖÒìÇȽ¾´­§“¢ÑŸŽžÊž+ š¢Í¥“©Ã­,²³¶>»»¿Ä_ÈÌqÐBÔî×rÛÜÞ%âNåaèUë4îñ¬óPöÓøQû´ý RйÖî ù ú÷éÙÁ¤†aB ö!Ð#¬%Ž'r)Z+M-A/E1O3i5Ž7Ä9 Ó@SCîE–H\K/NQTóVãY½\w_ùa1dñe3g±g\gÿeic†_'ZKSæJAö5Õ)ùÆ£õõêcßÖ ÎÇÇîÂ{¿J½-¼ö»v¼ƒ½ö¾¶À Â°ÄÉÆîÈË9Í\ÏyÑÓ°ÕÚ×ðÙÜ@Þrà«âæä:ç‡éõë`îæð}óöÞø§û‹þ~…›½ ë >OE޵!j#‚$î$w$#y ¬’"[ ebö—ëZàÕÊ®¿l¶y®¨Q£A ´ž«žÒŸ¢#¥Ï¨ð¬K±Óµ\ºÞ¾GÎDz˰τÓ;×ÃÚ6Þá³äÈçÅê¥ívð(óÍõYøÕú=ýšÿàLnˆ ’ š“‹yaI' àÁ—!v#O%2')+ç,å.Ü0î2ü4$7V9—;ð=W@ÖBjEHÏJ¡M€PoS_VPY.\ñ^~aÅc¢eüf§g|gUfda`O[½T¨LC>8E,‹b4kø`ìiáÃ×”ÏñÈÉÃÀ¤½[¼ô»W¼G½¬¾ZÀCÂEÄcÆÈªÊÏÌîÎÑ,ÓNÕi׊٭ÛÖÝà<âuäÂæéwëèífð÷òšõOøûöýèê L rŸ´³M!#S$à$š$[#!y¢sò 1`øµíŒâ2×ÌŸÁ!¸ì¯9©"¤¿ åžšžƒŸ™¡~¤¨¬p°ò´|¹ÿ½l¾ÆåÊíÎÊÒ‚ÖÚŒÝÜàä/ç2êíèï¦òIõÞ÷YúÊü!ÿt­ä! . 54(ìˬ‡e:!#ò$×&³(¡*‰,€.}0‚2š4¶6è8';x=à?XBæDŽGBJMîOÛRÎUºX£[f^aYcIeÄfg”g¡fŠd.af\#VUNEo:³."þÆçú«î€ãÙÑ!ʽķÀ¾‰¼ÿ»8¼½]¾ ÀÞÁâÃûÅÈBÊ_̉ΥÐÄÒâÔ×ÙCÛfÝ–ßÉáäMæžèÿêjíçïwòõË÷‡úiýOT_ƒ ¥ ×úúã Ã"$Ì$³$£#Œ!8§¸y ôUúÒïºäbÙ:Î–Ãæ¹i±lª¥J¡+ŸžHŸ¡â£Z§M«™¯´š¸½”ÁèÅÊ(Î ÒÏÕgÙáÜ>àuã›æœéŠì_ïòÇô_÷ßùPü±þþCt· É Ò Ðʺ¥lT(â ½"™$z&V(B*), .0214M6{8¶:=g?ÞAdD G¹I‡L_OGR:U(X[Û]†`åbñdƒfrg gãfeíao]vWöOþF™<1˜$”_ dýñœåpÛªÒm˰ÅpÁ…¾Ç¼¼"¼ä¼¾¬¿‡ÁyÓŭÇÔÉ÷ËÎ:Ð[ÒxÔ•Ö´ØÔÚüÜ&ß[á‘ãÛå(è…êòìeï÷ñŒô?÷ýùÕü¼ÿºÅß 2]}ƒgn k"Þ#²$Á$å#"òšõó ­Büèñãæ˜ÛYМű»ú²««õ¥ç¡zŸ•žŸ² M£¤¦…ª¾®3³¸·A¼¹ÀÅMÉ`ÍMÑÕ¶Ø6ܘß×âÿå éùëÕî—ñDôàöaùÛû9þÐ 1Q d m ni[H/ñÔ¨Š _"=$&ú'â)Ë+¿-·/¹1Ê3ã58E:“<ì>cAåC‚F4IöKÑN³Q¦T”W€ZS]`tbd;fNg§gg{eœbl^ºXQ×HÁ>f3'*ù íÿhóËç\ÝLÔÁ̺Æ1¿½!¼¼´¼Ú½\¿&ÁÃ*ÅCÇiɌ˰ÍÒÏïÑÔ)ÖJØiÚܸÞëà"ãhå¯çêpììîqñôµöqùAü+ÿ*Be ’¼ÝíÔú "›#$È$$o"š‰g[)þ÷óéË݄ҧǽ—´û¬ö¦–¢×ŸªžâžN Á¢ñ¥¼©é­P²Ø¶_»Ü¿;Ä}ȕ̎ÐVÔ؇ÛòÞ8â`åuèfëJî ñÂó]öéø^ûÅýa›Çèþ   øìζ–sQ, "å#º%¤'€)n+]-T/W1a3}5ž7Ú9æ@fCÿE«HkKAN"QTWïYÆ\{_ÿa)dòe!g¢gCgÝeCcV_òYS¦JÕ@³5™)¼•wÔõêRßÖ"ÎÕÇþ¿d½E¼¼¼½ ¿ÍÀ´ÂÂÄÚÆýÈ"ËEÍhτѥӿÕÞ×ÿÙ ÜLÞ|à°âöä;ç–éúëmîðð†ó*öèø±û•þ‰§à ó CNF„§!S#g$Æ$L$Í"< aCÆ ö4ëÿß°Ô¸Éu¿:¶`®¨U£E ÍžÀžùŸ4¢K¥÷¨­s±öµ}º¿aîÇÊËËÏÓO×ÞÚEÞ›áÁäßçÔê¼í„ð<óÜõjøåúOý¨ÿò.[€– £ ª¢‡uU=÷Ω!†#c%?')) +ý,õ.ï0ÿ2567g9­;ÿ=n@æB|E&HÞJ³M’PzSrVWY<\ö^‚aÃcžeðf•gfg3fÞc0` [€TmLÖBû7,N, DøHìWáÁדÏÿÈÖÃ/À¼½s¼¼n¼c½Á¾qÀUÂZÄrƓȷÊÛÌüÎÑ9ÓVÕtבٸÛÝÝ àBâäÊæé€ëðípðó¤õ\ø$ûþòõ) N } ·°} ?!#6$¾$l$&#Ê 2U” Ðý÷Ví.âÜÖÐË_Áò·Ì¯"©#¤À üž¯ž¥Ÿ»¡¢¤<¨@¬›°µ¡¹¾ÂÖÆËÏåÒ—Ö.Ú¢Ýðà.ä?çIê&íð²ò]õí÷júÙü5ÿÂî- A EB;(úÞ»˜tO!)#%ã&Ë(¬* ,.0˜2©4Ì6ù8;;Š=ô?jBúDžGWJ"MPéRÛUÉXª[q^a[cEe¹f€g~g‚ffda2\ìUNÓD0:p.Ù!Ù¾ú‘îkãŒÙÑ2ÊÅÄÐÀ&¾¤¼¼S¼.½v¾ÀõÁóà Æ&ÈNÊp̑δÐÌÒïÔ×,ÙFÛtÝœßÔáäUæ«èëzííï‚òõÒ÷•úpý\[lˆ ° ÜõŠÔ ²"ý#±$‚$w#K!öWc ‘ôùkï^ä ÙêÍWî¹H±Sªþ¤K¡<Ÿ¥žeŸD¡¤‚§u«¾¯6´»¸D½±ÁÆ9Ê<Î)ÒàÕÙ÷ÜPàŒã«æ±é›ìtï.òÛôn÷òù`üÁþQ†«Ê Ù â âØÌ·ž€`>õ Ì"­$ˆ&k(S*=,1.-002E4`68Ë:=z?ïAzDGÐI“LvORRNU3X[æ]‰`çbïdxfdggÃfädÄa;]?W¹OºF[<Í0\$X, ;ýåðˆåcÛ©Òr˾ŃÁ™¾ã¼'¼@¼þ¼1¾Ê¿”Á’âžÇãÉÌ'ÎIÐeÒ„ÔžÖ¿ØÞÚÝ0ßdáãäå2èêûìrïò–ôK÷úãüÆÿÄÏë 9c‚ii U"Æ#’$˜$¶#Ä!¯J¡” MÛûñƒæ;ÛÐWÅw»Ó²Ž«ì¥è¡‡Ÿ«ž,Ÿ× q£Í¦«ªç®X³Û·d¼ÙÀ1ÅiÉ|ÍdÑ.ÕÌØMÜ­ßìâæé ìçîªñUôòöuùéûMþæG^ v ~ }{j[<)ÿ庚 r"O$.& (ö)Ü+Ò-É/Î1Ù3û58_: <?pAþC’FGI LáNÅQ¶T¢WZ[]`ubd3fAg‘gþfRexb6^†XJQ›Hv>'3×&î ½ÿGó¯çMÝGÔÅÌÅÆD¿*½?¼2¼Ï¼ô½s¿<Á-Ã:ÅVÇyə˿ÍßÏúÑÔ2ÖTØuÚ—ÜÅÞóà-ãqå»çê}ìøîyñô¼öùOü2ÿ,4Mo ›Âãîщñø!†#p$¡$í#4"Y7ÍúÀýŽó®èiÝ0Ò[ÇP½j´Ý¬è¦”¢âŸ¿žþžt ä¢¦ç©®|²ú¶„»ü¿\ęȵ̣ÐtÔØ¢ÛßOâtåŠèwë^îñÔóoöúøpûØý,u«Ùù   úáȦ†a; "ó#Ð%²'•)€+p-g/j1u35´7ì91<>ø@{CF¿HKSN3Q"TWùYÓ\‚_b+dèegŽg+g»ec(_ºYÒRdJŽ@p5R)~WIªõèé?ß÷Õ%ÎÝÇÃ¥¿y½a¼*¼©¼µ½%¿áÀËÂÒÄíÆÉ2ËQÍwώѳÓÇÕí×Ú1ÜSÞ‡à»âþäIç éìxîûð’ó4öõø»û£þ’›¯Ð ø $DSEþ~–!>#K$ $$—"÷ël™œÿ“õÓê™ß[ÔhÉ4¿ ¶9®÷§L£Q ÞžÜž [¢r¥!©=­›±¶¢º"¿‚ÃËÇçËåϸÓf×÷Ú[Þ°áØäñçëêÍí™ðNóïõ}ø÷ú`ý¼ÿAl‘§ · ¸·¬š…iK*â»!—#v%R':) +-/13$5K7z9Â;>@ûB‘E9HòJÆM¢PS€VhYD\ÿ^‡aÄc˜eéf€gQgfµc`æZET%L’B³7Â+ ðÓø%ìEá±×šÏþÈëÃ<ÀÖ½‹¼+¼‰¼z½Ü¾‡ÀkÂnăƦÈÅÊêÌ Ï'ÑGÓ`ՀןٿÛëÝàOâŠäÔæ*é‰ëÿíyðó¯õgø1û þÿ0 Y ‚§¸³v.!ð"$š$?$ñ"ˆ è¼2 f•÷ììÌáÖËÁ¾·¤¯©¤É  ŸÆžÊŸÞ¡Í¤e¨k¬Á°<µÃ¹C¾­ÂøÆË#ÏúÒ´ÖFÚ¶Ý á=äYçWê@íðÉònõþ÷úêüFÿ–Í&@ R VUM:) ñͪ†a!;#%ö&Ü(Â*¯,¦.¢0©2À4Ý69P;ž= @|BE¯GlJ4MPûRêUØX³[|^a[cCe®fqgfgdf?dÔ`ü[®UÕMŒDê9*.•!‡c“úqîUãÙÑ6ÊÒÄäÀ=¾¾¼3¼o¼E½”¾0À ÂÄÆ:È\Ê̟ξÐÛÒøÔ×2ÙWÛyÝ«ßÛáä`æ²èë€íüï‹ò*õÜ÷¡ú|ýgis– · ãíƒÈ ™"ì#ƒ$b$7#!ª¸ 0…ù ïöã­ØšÍÃ{¹±<ªõ¤Q¡KŸ¾ž…Ÿi¡0¤ª§Ÿ«æ¯]´â¸e½ÕÁ#ÆTÊ[Î?ÒýÕ•ÙÝeà¢ã¿æÅé²ìƒïFòéô„÷úvüÏþ%`š»Ý é ó ôéàű‘rP)!â"¼$&~(c*Q,D.?0F2W4q6¥8Ú:.=Ž?BD-GáI«LƒOhRXUDX)[î]`çbídnfWgwg¦fÁd“a ]W|OtF<†0$ö ýÃðråTÛ¦ÒwËÊÅ–Á¯¾û¼B¼Y¼½I¾á¿«Á§Ã²ÅÒÇðÉÌ5ÎTÐrÒÔ¨ÖÊØèÚÝ;ßlá©ãìå=èšêí~ïò¥ôR÷úêüÓÿÎÚô Bh‚‡`X D"¯#o$q$€#‹!güG5 èsûñæßÚ´ÏÅ@»§²v«Þ¥ê¡•ŸÃžJŸû ™£ô¦Õª ¯€³ÿ·‰¼öÀSņɔ̈́Ñ@ÕéØaÜÂßã#æ2é!ìùî½ñhô÷‡ùýû[þ³ñ,Tq † ’‰}kP8õΪ †"`$@&(*ò+á-à/Ý1ñ3 678j:¾<?‹A D­FVILòN×QÄT²W—Zg] `{b‰d.f3g~gáf2eHb ^HXQSH5>ß2˜&¯Œ ’ÿ ó›ç=ÝBÔËÌÏÆVÂ-¿D½V¼Q¼æ¼¾‹¿QÁBÃLÅiDžɪËÌÍèÏ Ò#ÔAÖ\Ø€Ú ÜÑÞûà9ãxåÈç!ê‰ìÿîˆñôËöˆùYü?ÿ6>Xw ¢ÉæîÒæé!k#U$w$¿#ù!îrª”Zý'óHè ÝÛÑǽ8´Å¬Ö¦—¢êŸÕžŸ”  £A¦ª7®¡²·¨»ÀzĹÈÍÌÂЊÔ5ضÛßaâŒå›è‘ëlî4ñæóöù~ûìý<„Áç  , -* òÙ¸˜rO ("$â%Ä'¨)“+-|/z1‹3 5È7ÿ9D<¡> AC&FÒH’KdNGQ.T$WZß\ˆ_b)dãe g}gg˜eòbõ^‚Y—RJL@)5)=#‰õËé/ßòÕ'ÎæÇ Ã¸¿”½y¼F¼Ã¼Î½?¿öÀàÂæÄüÆ!É=ËcÍ€ÏÑ»ÓÕÕô×Ú6ÜaÞŽàÇâåRçªéìî ñ˜óDöüøÉû«þ £ºÙ (JUAýoˆ!%#-$z$í#_"³Í”72ÿ/õiê:ßÔÉ÷¾Úµ®á§L£V óž÷ž> €¢œ¥I©f­Ä±A¶ÅºE¿¡ÃéÇÌýÏÓÓ|×ÛqÞÆáëä èùêäí©ðdóÿõ‘øûtýËÿQ}£¸ Ç ÊǾ«–|[=ôÌ!­#‚%m'F)7+-/1%365a7Œ9Ö;)>’@C¡ELHKÖMµPžSŒVvYN\_ŒaÁc”eÛfpg7gñecÑ_°Z TäKOBk7+˸¢ô÷ ì2á«×™ÏÉýÃNÀò½£¼E¼¤¼•½ó¾ À|…ĒƸÈÓÊøÌÏ5ÑNÓqՃ׭ÙÈÛóÝ àUâ—äÜæ5é”ëî†ðó¼õpø=ûþ  ; a ‰«¼¯uö#!×"$q$$¸"G ž¬cÏ )÷Šìfá*Ö/ËÛÀŠ·…¯ù¨¤Ì "ŸßžìŸ¢ó¤’¨Ž¬î°^µé¹d¾ÏÂÇ=Ë;ÏÓÉÖ_ÚËÝ áTämçkêTí"ðÛò‚õøúýüXÿ¤â7S a gg]L9ÿṜn!S#(% 'í(Ô*Ä,¸.µ0¼2Ò4ñ6#9b;´=@”B!EÆG~JIM#PSöUçX¿[^aXcAe fdgMgFfd§`Æ[tU•MHD¦9å-W!J4fúUî>ãuÙÑ;ÊãÄõÀV¾×¼M¼ˆ¼a½©¾KÀÂÄ-ÆIÈlʌ̫ÎËÐæÒÕ ×<Ù`ۅݲßçá!ämæ»èë‹íð–ò4õè÷¬ú†ýunƒ™ à è é{º …"Ñ#b$4$ #Ï h±±[ Å$ùžî–ãUØFÍÏÂC¹ú°$ªí¤U¡[ŸÖž¥Ÿ‹¡Y¤Ñ§Æ«°´¹‡½óÁDÆpÊvÎZÒÖ°Ù"Ý}àµãÖæÕéÇì–ïUòõ÷ú„üæþ0w¤Óè ÿ üîÚ¾¤‚c8!ð"Ð$¯&({*_,Y.P0Z2h4Š6²8õ:<=¦?B¦D;-êʪ…_ ="$ö%×'¹)¦+•-Ž/1œ3µ5Û7:V<¶> A¢C¤@)C²EdHKìMÄP°S›VƒYY\_aÄcŒeÒf^ggÓecc¥_tZÏSŸK B'77+xuÆ÷ðëá¦×”ÏÉ ÄeÀ¾½¼a¼¾¼­½ ¿²À—“ħÆÄÈåÊÍ$ÏBÑZÓyՔײÙÖÛýÝ*àbâžäéæ?éŸëîð#óÇõ{øIû#þ%F g ’¯¾®nð!Æ"â#N$ç#" P\p ™Æöì áÍÕãÊšÀW·b¯è¨¤× 0ŸŸ -¢¥¸¨½¬±ˆµ º‡¾íÂ4ÇXËVÏ/ÓãÖtÚäÝ5áiäç€êfí5ðîò“õ#ø¡ú ýiÿ·ò'Hc s ywn_G1óÍ©…!a#;% 'ý(é*×,Æ.Ï0Ê2é4779w;Æ=0@¥B7EØGJ]M4PSVñXÊ[‹^a_c6eœfOg7g&fòcw`”[6UTMD]9¤-!=ú3î-ãiÙÑDÊðÄ Ál¾ò¼h¼£¼{½Á¾aÀ4Â1Ä@Æ[ÈzÊœÌ¹ÎØÐóÒ Õ+×GÙjÛݽßïá-ävæÆè'ë•íð ò@õó÷¸ú‘ý€z‹¦ Ç ò$çq¬ t"°#C$$Ó"‘ _Uõ b¸ø8î1ãù×õ̉¹Ұªå¤Z¡kŸðžÇŸ¯¡‚¤ø§ó«7°¨´-¹ª½ÂeÆŠÊ•ÎsÒ)ÖÉÙ7Ý–àÈãëæëéØì«ïhòõ¥÷&ú˜üóþG„»Þþ  êÒ¶“tM)!#á$À&£(Š*u,l.d0m2|4ž6Ç8;R=¸?*B¶DVGJÐL§OŠRxUaX=[^—`ìbåd\f:gHgnfrdÁÅÄÉÌÍ·ÑuÕÙ’Üíß/ãNæZéHì ïâñô'÷¬ù üþÖNx“ ª ¯ ¶«¡Žr]5ñÐ §"ˆ$b&H(**, .0 2456Z8—:à5A¹CKFûH¶K‹NgQST;W Zï\™_b(dÔeñfWgÙfVeb^YR¢I·?¥4„(Á±µ<õ“éßáÕ-ÎüÇ?Ãå¿Ä½¬¼|¼ø¼¾o¿!Á à Å#Ç=É^Ë}͜ϵÑÕÓêÕ Ø&ÚLÜtÞ£àÜâågçÂéìžîñ·óUöùÞûÃþ¶¸Ïê 4SX=òYi!÷"ð#-$#í!,2èSmdþ]ô›ézÞOÓ…Èv¾|µÙ­À§G£i Ÿ.Ÿ‚ Í¢ì¥©¸­²Ž¶»†¿æÃ"ÈAÌ2ÐÔ­×<Û Þîáå,è&ëîÑð‰ó%ö´ø-û•ýñÿ6t¡ÅÚ ê íëßиŸ`: ñ!Ï#ª%'l)]+D-C/;1N3\5ˆ7¶9ý;R>º@:CÊEtH.KûMÚP½S¯V‹Yj\_˜a¿cˆeÅfMgg³e:ct_?ZS`KÂAá6ò*K?@ž÷Ðë á˜×™ÏÉÄwÀ¾Ö¼{¼×¼É½"¿ÏÀ©Â¨ÄºÆÕÈôÊÍ1ÏMÑhÓƒÕ ×¼ÙãÛÞ7àkâ¨ä÷æEé®ëî ð-óÔõ‡øTû0þ#/O r —´Ãªnä!±"Ã#.$³#N"À þ­ 3Xö¸ë¢àuÕŽÊYÀ!·=¯Ò¨¤Ý DŸŸ0 L¢H¥Ý¨é¬8±±µ.º¬¾ÃRÇzËmÏNÓùÖÚùÝKá€ä•ç—êxíJðó¨õ4ø¶úý}ÿÉ;Xu ‡ †{sYC"Þ¾–!s#P%0')ü*ç,à.Û0å2ù47J9‹;Þ=@@½BJEíG¥JpMFP0SVYÕ[“^aYc8efAggfÈcK`X[úTM»C9T-Õ ÎÊúîã]ÙÑKÊüÄÁ¾ ½~¼Â¼½Þ¾vÀLÂCÄSÆkȋʩÌÉÎãÐÓÕ3×VÙqÛžÝÆßúá9äæÑè4ëžíð¬òKõøÂú ý‰†—® Ò ø(àl› b"“#$$Ò#£"N Ôø” üMøÒíÍâפÌCÂÚ¸ª°ø©Û¤_¡|ŸŸçŸÔ¡©¤$¨¬`°Î´S¹Ë½8ÂÆ«Ê¯ÎÒHÖÛÙUݤàåãûæêêìÀï{ò$õ¸÷9ú©üÿW—Ëò %*úæÆ¨‚c8!#ñ$Ö&²(Ÿ*†,.x0€24±6Û8;g=Ê??BÉDhGJáL¹OR…UnXK[^ `ëbâdSf(g5gNfPdaj\UVµN­E?;¼/O#gW …üdð#å6Û™ÒŠËòÅÊÁõ¾D½’¼©¼e½—¾&ÀìÁäÃèÅÈ!Ê?Ì`ÎwЙҭÔÏÖåØ Û.ÝXߎáÅã æ]è¹ê$íŸï*òÅôw÷5úýóÿñø 1 Yy†Yê5 "a# $ñ#æ"Ó  8 ·9úåïðäÆÙ»Î8Ä–º*²)«¼¥ó¡¿ŸŸªŸa¡¤j§T«…¯ô³r¸ï¼_Á®ÅÞÉëÍÏÑÕ-Ù©ÜàEãdæmé\ì4ïõñ¢ô8÷¿ù.ü—þâ,[Œ¡ À » ̸¶š‰hL(Ý ¿"•$z&V(?**,.02-4D6q8©:öMAÈCdF IÌKžNwQfTHW/Zø\ _ b&dÌeæfAgÀf0eub\^ÜXÔQXIu?X4>(‚s„õuéýÞÚÕ-ÎÈOÃû¿Ø½É¼”¼½¾ˆ¿:ÁÃ"Å1ÇPÉlˎͤÏÇÑÚÓûÕØ3ÚVÜÞ®àæâ'åqçËé0ì¤î(ñ½óeöùïûËþÅÂÚô =V\<êSU!ä"Î#$Z#´!çã’ñ úýòó5éÞöÒ9È5¾Nµ¸­±§B£s 1ŸLŸ¤ ô¢¦Ç©â­9²µ¶3»«¿ÄCÈ\ÌPÐÔÊ×PÛ½Þâ2åAè;ëîåðšó:öÆø@û©ýJ†°Úê þ üþïãʱsL+ "à#¿%Ÿ'ƒ)l+\-R/T1^3s5›7Ê9Ï@NCßEˆHAK NëPÏSºVžYm\_•aÃce¹f]AàCtFIàK¬NŒQrTWW9Z]¤_b#dÆe×f-g¥feIb.^žXœQI3?4ý'E=Yïô^éîÞÕÕ2ÎÈcà Àô½â¼¯¼,½5¾›¿SÁ1Ã3ÅEÇ\É~˔͸ÏËÑìÓÖ Ø=Ú`܉޸àïâ/å~çÒé<ì¬î3ñÇórö(ùøûÙþÊÑßþ !AZZ:åDE!Ê"±#ß#+#y!¦—>“«•ýŽóÓè¹Ý§ÒëǾµ¡­ž§D£~ DŸiŸÅ £;¦ñ©®b²Ù¶V»Ê¿$Ä^ÈyÌgÐ;ÔÜ×mÛÌÞâDåVèLë3îòð±óHö×øSû·ýX™Áêú  óÜÀ¤_= "õ#Í%´'’)+l-f/f1o3ˆ5«7à9"ä@_CóE˜HSK"NúPáSÆV©Yw\$_˜aÁc{e¬f)gÑfoeêb_ÓYSßJ7AY6k*ÍÎàS÷•ëçàˆ×œÏ-É6Ä¥ÀK¾ ½®¼½ú½U¿ùÀÒÂÏÄÜÆ÷ÈË.ÍLÏeÑÓ˜Õ¶×ÒÙöÛÞLà|âÁäç^é¿ë2î²ðCóéõølûCþ82G^ „ ŸÁÁ«`Îæ "‹#ß#X#Û!@sXóDfÿõíêåßÅÔúÉØ¿Ä¶ù®±¨¤î iŸNŸp ˜¢˜¥.©:­†±úµwºï¾NÎǰ˦Ï}Ó-×¹Ú)Þvá¨ä¿ç¼ê¡ímð)óÈõ\øÕúEýœÿì&Z}˜ ¤ ¯©¤cF&ß¼!–#t%U'6)!+ -/1 35@7s9¯;>i@äBpEHÉJ”MiPQS1VYç[¢^!aWc/evfgñfÅecé_óZ€T‘L7CŒ8Ø,N ebÄùÕíîâJÙÑVÊ ÅBÁ²¾=½´¼ô¼Ä½¿¤ÀtÂmÄuƌȬÊÁÌçÎùÐÓ.ÕM×eÙÛ«Ýßß âM䓿æèGë³í5ð¿òdõøÛú´ýž¨ â .ÚV~ 9"Z#Ú#{#4"Ð@iDÑ 1÷í âìÖÌÅÁn¸g°Ë©Ï¤l¡›Ÿ?Ÿ" #¢ò¤x¨i¬¯°µ™¹¾tÂÀÆáÊèξÒyÖ Ú~ÝÕà ä&ç*êíãï¢òGõÜ÷^úÌü)ÿz¹î0 @ KFE/"é˧ƒa!9#%õ&Û(Á*®,£.Ÿ0¦2¸4×69A;=ò?fBóDŽGBJMÙOÁR UX\[^§`ïbÖdCfg gfdµ`\ßU6N%E¸:2/Ï"ðî5üðþäÛ™Ò”ËÆîÁ%¿v½Ç¼ß¼–½Ê¾SÀ ÄÆ%ÈAÊ\ÌzΒЭÒÇÔâÖüØÛAÝmß¡áÚã!æpèÏê7í·ï;òàôˆ÷Oú ý # C g‚“„QÛ ä!*#Ç#š#€"T i‰U ínùï2ä ÙέÃ/ºÙ±ýª§¥û¡ÝŸ9ŸåŸ¯¡]¤À§¡«×¯@´»¸4½ŸÁìÅÊ"ÎÒÁÕ^ÙÓÜ3àkãŽæ—é€ì]ïòÈô]÷áùUü´þ J‚©È Ú ç æàÔ¿ªmO$!Û"À$˜&~(d*M,E.:0C2P4m6˜8Ï:=x?íApD GºI{LNO,RU÷WÔZ’],`~bdfífgSf}dra]-WÏOGÖ<‡1F%~y ­þnòçòÜ0ÔÛÌǨ ¿¹½à¼Î¼o½ˆ¾ÀÂÁ¤Ã°Å¸ÇÜÉïËÎ(ÐFÒ^Ôw֔شÚÔÜß.álã¬åýçUê¿ì7ï½ñXô÷Âù“üvÿns‰¥ ÇäûïÇ\ª!ò"°#«#Ã"Î ·bºÏ ›Rû"ñLæ8Û.ЩÅî»a³4¬—¦•¢+ CŸ°ŸG¡Ì£§Üª¯d³ß·V¼ÉÀÅOÉ[ÍDÑ Õ«Ø*ÜŒßÐâñåéñëÎî”ñCôÝöhùØûEþ”Ü=b u  ‡|vbJ1ñÌ© ƒ"b$?&(*ð+à-Û/Ü1ì36-8`:«<?qAóC‡F6IìKÆN—Q…TdWEZ ]¬_bdÁeÇfgˆfîdbû]jXZQÕHë>Ð3»')Ìô@éáÞÍÕ6ÎÈoÃ'À¾þ¼Ê¼G½L¾·¿fÁIÃFÅUÇqɉ˧ÍÄÏ×ÑúÓ Ö*ØJÚgÜ—ÞÀàúâ<å…çáéCìºî;ñÕóyö7ùüåþÔÜé 'I\\7Þ85!°"’#·#ù"@!_Gé2G,ý#óoèYÝOÒ¢ÇÁ½ï´„­Œ§G£… ZŸ‰Ÿâ H£_¦ª1®‰²ÿ¶|»ë¿DÄȓ̆ÐPÔú×ÛçÞ.âYålèaëBî ñ¼óaöçøeûÊý$k¨Õù  !ìÕ³–oN )"$å%Â'¨)+‚-x/|1€3Ÿ5»7ø95<>ø@sCF­HgK2N QðSÖV¶Yƒ\)_ža¾cwežfg´fQe¿bâ^—YÙR—Jô@6(*•«-÷vëÖàלÏ6ÉGĸÀc¾'½Æ¼+½¾n¿ÁêÂáÄïÆÉ"Ë<ÍZÏqыӧռ×áÙüÛ(ÞSàŠâÆäçgéËë>îºðQóôõ¨øwûOþ@BLk ˆ ªÀƨYÇÓ m"l#»#%#§!ú(–àÿ#õ‰êƒßmԬɘ¿”¶Ö® ¨ø£û xŸmŸŽ Á¢¼¥[©`­¯±"¶›º¿mîÇÌËÂÏ–ÓG×ÐÚBÞ‰áÀäÑçÒê´í‚ð;óÛõoøåúYý­ÿý<f“¥ º ¾º¶¡’s[4ìÑ!§#†%g'K)1+#-/1 305V7†9Ä;>|@÷B‡E#HâJ¡M€P^SDV(Yô[©^#a[c%epf gÙf¦eWc¹_½ZBTPLñBI8, #4—ù¶íÚâ@ÙÑ`Ê,ÅUÁ˾U½Ñ¼ ½à½$¿¾ÀŠÂĉƛȼÊÑÌñÎÑ"Ó;ÕW×pÙ•Û·ÝçßâVäŸæîèUë¼íBðÉònõ øåúÁý¨¨³Ë ê &+ÑOp ""?#´#O#þ!Žøèr È÷žì¬áָˀÁ=¸B°¸©Ç¤t¡«ŸYŸD F¢¥ ¨’¬Ø°Aµ¿¹4¾–Â߯ÿÊÏÚÒÖ$Ú–Ýêàä<ç<ê'íøï³ò\õî÷núÞü<ÿŠÍü&A Q \WW?6ûÞ¶™o!N#)% 'ì(Õ*À,·.±0¹2Í4ç69S;¥=@{BE£GTJMíOÍRµU’Xo[^«`ñbÐd:fõfòfñeác„`Î[¡UùMÞDu:ê.‘"³½ üþïêä Û—ÒœËÆÂ9¿½ã¼÷¼²½â¾iÀ0ÂÄ"Æ8ÈMÊl̆ΟкÒÒÔìÖÙ'ÛNÝxߪáåã)æ|èØêDí¿ïIòèô–÷Xú.ý, M l‡•„LÒ Ð!#£#n#K" ¹+ö …ù³îÉã·ØÆÍlÃö¹´±âª¡¥ý¡ëŸUŸ ×¡¤ë§É«ÿ¯h´Ý¸\½¼Á Æ3Ê>ÎÒÛÕrÙïÜDà…ãŸæ®é‘ìrï+ò×ôr÷ðùjüÄþ[”¹Ü é û õóæÐ¼ž];!ô"Ê$±&Œ(y*_,V.Q0R2g4}6­8ä:0=?þA…DGÊIL\O?R!UXàZ˜]3`b}d÷eÝfg6fYdFaÐ\ôV‘OÂF•%þḠ–"r$O&3(*,ó-í/î1þ36B8q:À<?†AD›FHIýKÖN¦Q”TqWPZ]¯_bd·eºfgmfÍdòaÎ]1X!Q—H®>‘3‚'ÌÛ ¯ô,éØÞËÕAÎ$ȈÃ9À%¾½ã¼b½d¾Ï¿yÁ^ÃUÅhÇ}ə˳ÍËÏêÑüÓÖ3ØPÚuÜœÞËàãFåçëéMìÁîIñÚó‰ö;ùüëþßäð )P]\3Õ*$!–"r#Ž#Å"!ü”Ø æËüÁòèÝüÑaLj½É´f­†§@£™ kŸ§Ÿ¡h£ˆ¦BªU®²²·Ÿ» ÀcęȯÌÐhÔØ”ÛüÞ@âpåzèwëSîñÐóoöúøtûÜý4}¸æ  0 /1#ÿãÆ¦€` 9"$÷%Ñ'½)¡+”-‹/Š1˜3­5Ô7:L<Ÿ> A‡CF¿HyKANQûSåVÀYˆ\3_›a¾cme“fgžf,ešb²^cYŸRYJ·@Ð5ì)Ud‚÷`ëÊà}פÏBÉZÄÍÀ~¾@½â¼D½*¾†¿%ÁýÂôÄÇÉ0ËIÍeÏ{ÑšÓªÕÎ×áÙ Ü-Þ]à‘âÒäçtéÑëHîÄð[óüõµø}û[þHIXo ®ÂÅ¥Q»Á T"P##ü"i!»Þ±<ŸþÁô+ê'ßÔdÉa¿h¶»®¨ú£¡‘Ÿ„Ÿ³ ã¢ä¥©†­Ø±?¶Ãº-¿ŽÃÉÇæËÚϱÓY×êÚQÞ£áÏäççáêÇí“ðMóëõ€øøúfýÀÿ Kzžº Å ÑÌö‰gK# Û!½#–%y'[)E+2-+/%143B5j7•9Ü;(>”@C›E6HòJ³MPlSRV2Yý[¯^'aWc!e`fúf¿f…e4c‡_ZTL°B8R,Ôôyù™íÏâ9ÙÑnÊ9ÅoÁá¾p½ë¼&½ü½:¿ÖÀœÂ”ĚƬÈÈÊàÌüÎÑ,ÓHÕ]×€Ù˜ÛÆÝêß&â[䫿öè^ëÆíHð×òtõ.øíúÊý³¯½Ñ ò (+ÊF] "!##!#Ç!O¯Â f¹ö=ìOá;ÖoËCÁ¸ °§©Â¤}¡»ŸuŸb l¢A¥Æ¨»¬ü°gµâ¹S¾·ÂúÆËÏñÒ¦Ö<Ú©Ýá1äRçMê:í ðÆòkõø~úïüKÿœÚ4R a mhfRD' ëʨ!_#;%'ÿ(å*Ô,Ç.Å0Ê2Þ4ü6,9f;¸=@ŒBE°GjJ&MPÙRÃUžXv[(^°`íbÏd)fêfÙfÖe»cX`Ÿ[gUÀMžD8:­.V"€ŽçûäïÙäÛšÒ¥Ë*ÆÂP¿«½ø¼½È½ú¾ÀBÂ1Ä2ÆGÈ^Êw̔ΩÐÈÒØÔùÖÙ4ÛTÝß³áìã6æ‚èâêMíÇïUòñôŸ÷dú4ý#!5 Q s‰—GÇú»!ó"#D#"ÞpÊØ– *¢øQîqã]Ø‚Í*Ãǹ±Ðª™¥¢ùŸlŸ" õ¡¬¤ ¨ð«'°ˆ´¹y½ÜÁ*ÆNÊWÎ5ÒðÕŠÙÝYà—ãµæ¼éªì~ï@òèô÷úvüÙþ'pŸÍè ý ôã˰ŽpI)!#â$½&¢(‰*r,h.b0f2v4”6º8û:?=¤?B˜D1GÞIŸLoOLR/UXèZ¡]5`bvdñeÍféff7da¤\¹VWOƒFU<1Î$  ]þ2òôæßÜ.ÔéÌ*ÇÑÂÉ¿ò½½½ ½¸¾4ÀçÁÑÃÎÅÞÇöÉ Ì,Î?Ð_ÒpÔÖ¨ØÆÚêÜßFázãÃåèhêÔìGïÕñiô÷Õù¦üŒÿ‡—¶ Ñïúð»Ld!¿"i#\#X"[ (Æ Ú‹úZð‘å„Ú’Ï"Ń»³¬ƒ¦›¢H oŸíŸ‹¡¤\§+«P¯°³$¸›¼ÁSÅ…ÉÍxÑ8ÕÚØWܵ߸âæ'éìñî¸ñfô÷Šùýûcþ¶3c€ – ¢ ¦Ÿ—ƒlT1îÊ ©"$f&A(**,.024'6R8ˆ:Ð<*?—AD°FUILáN»QŸT€W[Z]¸_bd®e«fófQf©dÊa›]úWæPSHn>K3C'“¥ ÙˆôéÆÞËÕCÎ3È—ÃQÀ>¾/½½x½¾æ¿ÁqÃiÅwÇɨ˾ÍÜÏñÑ Ô$Ö;Ø]Ú|Ü¥ÞÔà ãMå™çñéVìÍîQñæó‘öGùüöþêëý 3Q`\.Ï!}"R#d#›"Æ Ý­@€ ƒjü]ò±ç©Ü¬ÑÇP½Ÿ´L­w§D£¡ ƒŸÀŸ*¡£¯¦iª{®Ø²C·À»,À~ĸÈÈ̶ЃÔ%Ø­ÛßVâå‘è‰ëeî1ñàó‚ö ù…ûíýEŒÊõ 0 = B@4#ôص“o L"'$&æ'Ì)¶+¤-ž/ž1§3Ã5ã7:\<µ>AšC*FÒH‰KWN'QTëVÒY\;_ša¿cde†fðf‚f esb^0YaRJu@5®)3UëöIë¹à{פÏQÉfÄçÀ’¾[½ü¼]½D¾œ¿<Áà ÅÇ&É>ËWÍqωѡӹÕÓ×ðÙÜ8ÞfàœâÛä%çzéÜëQîÏðeóöÀø†ûfþQT_y ” µÅÅ¢I¯° <"/#k#Ì"1!|‘_â"<þ^ôÉéÎÞËÓÉ)¿9¶ ®¨ù£ ¡¤ŸžŸÕ £ ¦¦©®­ü±f¶ãºN¿¯ÃãÇÌõÏÅÓu×ýÚhÞ·áãäûçöê×í¨ð[óöø ûxýÏÿX­Ê Ø ßÝÔů˜zZ7 í!Ï#§%‹'n)U+G-8/=1@3[5y7ª9í;=>¤@C¨ELHKÄM¢PySbV=Y\·^(aYceYfçf§fhe c__TZÏSÕKoBÇ7,›»ÙPùƒíºâ5ÙÑxÊHÅ„Á÷¾Š½½A½¾W¿æÀ¸Â¡Ä¯Æ¹ÈØÊîÌÏ"Ñ6ÓRÕi׆٧ÛÊÝúß+âi䱿éaë×íNðáò‚õ2øûúÔý¼¼ÃÚ ú -,Å9P ó! #g#ô"!fr6´TöÛëòàæÕ&ËÁâ·ý¯—©½¤‚¡ÑŸŒŸƒ ¢h¥î¨á¬#±‹µºu¾ÕÂÇ4Ë7Ï Ó¿ÖRÚ¾ÝáFäcçcêJíð×ò~õø“úüü`ÿ©îEc q ~xwcT9üßµ–!o#N%.')ù*å,Û.Ö0à2î47:9~;È=-@¡B)EÉGxJ=MPîRÏU­X€[,^¸`ëbÊd#fÔfÅf´e–c+`j[-U~M]Dó9j."D]½ûÄïÅäûÚ›ÒªË:Æ*Âi¿Á½½+½å½¿–À[ÂAÄGÆWÈjʊ̟θÐÐÒèÔ×Ù:Ûb݉߾áøã<æèéê\íÎïdòöô¯÷lúAý+!+= \ t”’†>Àì¦!×"^##á!š,x~8 Ã?øìíãØ1Íë¹q±´ª•¥¢  „ŸC ¢Ò¤7¨¬O°®´(¹œ½üÁGÆmÊoÎPÒ ÖžÙÝlà­ãÊæÎé¾ìïSòùô–÷ú‹üçþ<~³Üù   òÝÀ ‚Y;!#õ$Ï&´(™*‡,x.u0y2ˆ4§6Ñ8 ;X=²?&BªDEGîIµL|O_R=UXóZ«]8`‚bsdæeÀfÓfûedë`r\VOAF<Â0Œ$Ñä 3þòßæÒÜ+ÔðÌ7ÇâÂ࿾+½½»½Ð¾IÀÂäÃßÅñÇÊ!Ì6ÎNÐhÒ~Ô–Ö³ØÐÚòÜ ßIá‰ãÈåèrêÜìSïÞñuô"÷àù°ü—ÿ‰¡» Ùóúô±J{Y!Ÿ"L#.#(" åvºµ x(úôï5å(ÚFÏÛÄO»î²ë«z¦œ¢X „Ÿ ª¡A¤„§P«z¯Ò³J¸½¼%ÁrŢɩ͓ÑOÕñØmÜËß ã1æ9é,ìïÊñxô÷˜ùürþÊ Gq” ¥ µ ³³¦”€`H Ú ¹"”$v&S(>*%,.02"4;6f8š:ã<>?¨A-D¿FkI$LõNÉQ¯TŽWcZ&]º_bd¡e£fÛf8f…d£ai]ÃW©PH-> 3'Wr ¬iôé»ÞÇÕFÎBȦÃfÀW¾H½½•½“¾À¤Á†Ã{ŊǛɷËÌÍèÏüÑÔ+ÖKØbډܮÞÞàãVå¤çúébìÕî\ñðóšöSù"üÿõò >SeZ*Æý f"1#<#h" •fç& !üúñPçMÜ]ÑÕÆ½w´/­m§B£° –ŸÞŸM¡¯£Û¦Œª§®ú²i·ã»IÀ¢ÄÐÈçÌÏКÔ=ØÃÛ$ßkâ—å¡èžëwîBñóó“öù—ûþýTŸØ) A M UMJ1#çÈ¥€ _"7$&û'Û)È+¸-®/²1º3Õ5ö7.:o<É>/A­C>FäHœKfN;QTüVØY\9_¤a·c_ezfÛfifìdIbR^úX$RßI2@L5p)Ú&Éö.ë«àtשÏYÉ|ÄöÀ¯¾o½½q½b¾±¿SÁ%ÃÅ"Ç6ÉLËd̀ϑѱÓÃÕÜ×þÙÜDÞpà¤âçä-ç„ééëWîÜðnóöÉø’ûpþ\^fƒ › ¹ÉÅ E ¢ #"#D#"ö ;C †Á×ýùófépÞvÓÔÈé¾¶}®q¨õ£¡´Ÿ¾Ÿò .£2¦Î©×­ ²¶»u¿ÈÃÈÌÐáÓ‰×ÛÞÊáùäè ëìí¸ðoóöžøûƒýæÿ+n™ÂÙ é ñìèÒÆ¥jI% "Ý#¼%›'€)i+Y-M/M1W3i57½9ÿ;S>µ@2C»EaHKÛM«PŽSkVLY\¿^(aXceLfØfŠfKeßb2_Z•S•K.B„7Ð+_†ª,ùgí¨â/ÙÑ€ÊZÅ•Á¿ ½#½Y½-¾m¿þÀÊ¸ĻÆÐÈáÊÍÏ-ÑGÓVÕy׋ٵÛÒÝà4âtäºæémëÞíZðìòˆõAøûàýÆÃÎá  /.Á,A Ý!è"C#Ç"V!Ò ÞR¢ÿïõzë”à“ÕÚÊÇÀ±·Þ¯ƒ©º¤Š¡ãŸ¥Ÿ§ ®¢•¥© ­F±²µ'º–¾÷Â1ÇUËLÏ&ÓÕÖhÚÖÝ)á[äzçqêcí+ðíòŽõ$øŸúýlÿ¾ý/Xr ƒ Œ„y`N,íȦ!‚#^%A' ) +ù,ë.ì0ð25$7O9Ž;Ý=@@²B?EÙG‹JMMPüRÝU»X‡[7^¶`ïbÁdfÃf¬f˜encþ_7[õT@MD¯9,.Û!/—ûªï³äôڜҲËKÆ>€¿Ü½0½E½¾&¿²ÀjÂZÄTÆgÈ|ʓ̯ÎÀÐàÒìÔ×!ÙHÛiÝ“ßÇáäGæ™èôêbíÛïkòõ¸÷uúLý4+4F ` ›};¶Ú“!º"8#ê"ª!]ã(&Ù cÙ÷‹í²â±×å̪Âc¹G±©ªˆ¥¢ œŸc <¢ø¤]¨@¬t°Ô´L¹¹½ÂcƈʌÎeÒ#Ö¸Ù-݆à¿ãÝæåéÍì¥ïcò õ¤÷'ú™üùþLÆê  ,'' èÕ¯”kL!%#%á&Æ(«*˜,Œ.†02œ4·6ä8;j=Ç?7B¿DTGJÄLŽOnRJU*XþZ¯]?`bmdÞe®f½fâeëcÅ`>\GVàNþEÖ;0V$—¹ þ÷ñÊæÍÜ'ÔüÌDÇöÂù¿¾G½9½Ô½ê¾_ÀÂ÷ÃñÅÈÊ-ÌCÎZÐsÒˆÔ¢Ö¼ØÚÚüÜ&ßXáŽãÕåè}êèì]ïåñ‚ô(÷íù¹ü ÿ’™¨à Þôêµ5w:!Š"&##ô!Þ¡%dW Âù–ïÏä×ÙôΜĻƲիr¦Ÿ¢h Ÿ) Ñ¡b¤°§u«¢¯ö³n¸Þ¼GÁžÉÄÍ©ÑjÕÙƒÜàß!ãBæOé=ìïÜñŠô$÷«ù ü„þÜ\~¦ ´ È ÄÅ´§vU5ì Í"¤$ˆ&g(O*7,..!0)254M6y8¬:ù:…<Ú>BAÁCQFõH°KtNNQ*T WàY¦\?_¥aµcXekfÊfKfÍdb$^ÄXèQŸIò? 5/)¤Éý©öë¡ànׯÏfÉ‹ÄÁľ޽1½½x¾Ë¿hÁ9Ã.Å2ÇFÉZËs͋ϠѹÓÎÕè×Ú$ÜNÞvà±âîä7çéïëcîçðvóöÑøžûyþgeq† ¥ »ËÅ›;˜Š "ï"#m"¼ ÷ùµ,`tý”óéÞ$ӌȲ¾áµd®a¨ö£¡ÌŸÕŸ¡O£]¦ó©®B²µ¶'»‘¿êà È7Ì+Ð÷Ó¤×'Û™ÞÛáå!èëîÈð„ó!ö±ø/û—ýóÿ@z¯Ðê ú üúã×¶|[5 "í#Î%¯')|+k-]/d1f35¡7Ï9È@ECÏEpH(KæMÂP˜S|VUY\Ã^,aWc eAfÁfuf'e»bÿ^êYYSVKïA?7”+S| ùMíšâ'ÙÑŒÊjŬÁ)¿»½=½s½G¾„¿ÁßÂËÄÍÆßÈòÊ Í"Ï8ÑNÓhÕ}×›ÙºÛßÝ àAâyäÈæé{ëäíhðòò™õFøûæýÒÎÔí  2. »!0 Æ!È" #”"!!ÏÐ}÷;ÿ‹õë5à<ՑʆÀ…·»¯t©³¤•¡òŸÂŸÆ ×¢¸¥=©0­p±×µIºº¾ÃRÇpËgÏ=ÓïÖ|ÚðÝ:átä‡çŒêpíBðûò£õ3ø´ú#ýÿÎ?j‚ • ž›˜‡t]? ÿÚ¸!“#r%P'6)+ -/û03567f9ž;ô=M@ÌBMEîGžJ]M1P SèUËXŒ[B^¶`îb¾d f·f‘fyeIcÑ_[¹TM×Ct9æ-Ÿ!Ùþrûï äîÚšÒ¿ËVÆU•¿÷½I½c½¾D¿ÄÀƒÂmÄgÆzȈʤ̹ÎÑÐæÒþÔ×1ÙPÛrÝŸßÎá äOæ¡èëiíêïpòõ½÷ƒúWý;88Q f „•™|3®È~!œ"#½"r!™ØÊ~ üv÷)íPâ^וÌnÂ,¹+±ŒªŒ¥¢2 ³Ÿ‚ c¢¥ˆ¨h¬˜°þ´j¹á½9…Ƣʧ΀Ò9ÖÎÙGÝ–àØãîæùéáì·ïvòõ·÷8úªü ÿ]žÕþ / :96'þãÅ ‚W!;#%ô&Ú(º*¯,›.œ0Ÿ2­4Î6õ84;z=Ü?IBÑDjGJÖL O|R[U7X[º]@`„bgdÖe›fªf¿eËc•` \V¡N»E“;<0$`… áýÚñ²æÅÜ$ÔÍPÇ Ã À;¾`½U½í½¿vÀ* ÄÆÈ"Ê:ÌPÎjÐ|Ò—Ô¨ÖÊØàÚ Ý-ßbá™ãÝå+èˆêîìkïîñ‹ô6÷õùÆü«ÿš¤¯Î áûë®/d*!l"#Ô"Ä!›]Ô ù ´]ù1ïqä|Ù¥ÎZÄ交²»«j¦£¢t ·ŸG ô¡Œ¤Ñ§¥«Â¯#´¸½eÁ¯ÅÙÉáÍÀцÕÙÜõß4ãZæ^éUì)ïðñšô7÷¼ù4ü”þì-k¶ È Ó ÙÒɶ „hF"!Û"º$—&z(a*J,>.50<2G4c6‰8Á: =d?ÏARDåFIHLOìQÉT©WzZ3]Å_bd“eƒf®ff:dQa]YW,P—G¥=ˆ2ˆ&å X)ôÖè¥ÞÀÕVÎXÈÎÕÀ†¾½O½È½Ê¾)ÀÕÁ«Ã¢Å«ÇºÉÔËçÍÿÏÒ)ÔEÖZØ{ÚšÜÂÞñà)ãkåµçêuìëînñô­öiù7üÿ+ G^fY"²úÒ 3"î"ç"" Ä?g b:û4ñŽæšÛ»ÐJÆ«¼#´ÿ¬T§G£È ÄŸ ¡ý£'§Þªô®G³²·&¼ŒÀÜÄ ÉÍÑÈÔnØìÛRß“â¿åÊèÃëîgñô·ö?ùºûþwÀü&N ^ s triUD& æË¡ ‚"\$:&(*ë+à-Ð/Û1ß3ú58R:–<ï>TAÔCdFIÁKˆN\Q:TWéY±\A_©a¯cSeZf¸f.f«dôaô]X­Q_I®?Ë4ð(g—Ó‚öëàp×°ÏtÉšÄ(ÁÛ¾«½I½®½¾â¿€ÁMÃ?ÅGÇQÉoË{ÍœÏ©ÑÆÓ×Õö× Ú2ÜSÞ„à·âùäAç™éúëoîìð…ó$öÞø§ûƒþqm| ª ÁÍÅ—4‡| ò!Ñ"ó":"„ ±­`Ñ þý/ó¥èºÝÐÒFÈv¾¸µF®T¨ô£+¡ßŸõŸ6¡x£€¦ª%®m²×¶H»µ¿Ä@ÈRÌDÐÔº×BÛªÞôá"å5è/ëîßðó9öÀøAû©ýPŽ»äú  öæÈ¯ŒmF &"ÿ#á%¾'¦)Œ+|-t/q1|3’5²7ä9&à@RCçE€H9KùMÐP¨SŠV_Y#\Ç^2aPce2f¯f\fe’bÔ^²Y#SK¯Aÿ6T+æOçø2íâ!Ù#Ñ”Ê}ÅÀÁA¿×½U½½^¾Ÿ¿*ÁõÂÝÄàÆîÈËÍ-ÏHÑWÓsՈץÙÅÛèÝàJâ„äÐæ é‚ëòínðóœõWøûõýÙØÞñ  8, ± ¬!®"ð"k"ä N‚|"—×þ%õ¶ê×ßêÔEÊNÀR·¢¯^©¶¤˜¡  ÚŸé ú¢á¥c©Z­•±üµlºÛ¾2ÃpÇŠË€ÏZÓ×™ÚýÝWáä¡ç›ê…íTðó³õEøÅú3ý‘ÿàTw” § ¬°¦š„nO4 ðÇ!¦#ƒ%c'G)/+-/13-5E7y9¶;>f@ÚBbEH­JsM=PSõUÕX™[F^º`íbµdf£fyf[e c¤_ÍZ‚TÁLC*9¬-`!¢ÏNûoï‘äæÚœÒÉËfÆj®¿¾c½}½2¾Z¿ÝÀ™Â|ÄÆ†ÈœÊ°ÌÆÎÞÐòÒÕ ×;ÙXÛÝ¥ßÛáäZæ«è ësíôïyòõÆ÷ú_ýI=FU o ‡™™z-¢·i!{"ñ"‹"=!ÜP‚r ˜÷Ãìóá×JÌ,Âý¸±|ª‚¥¢A ÎŸ¡ ˆ¢C¥±¨Ž¬Ä°µ”¹ý½_ŸÆÀÊÁΚÒPÖçÙYݱàèãç êöìÈï‰ò0õÉ÷FúÁüÿs«ê / ? JLF9'óÖ´o!G#*%'ì(Î*¿,°.­0±2Ã4Þ6 9D;‘=í?_BãD{G)JäL³ORfUFX [Â]B`ƒbcdÇeŽff¤e¢cj`Õ[ÙU]N€EK;0Ó#,P ¿ý¸ñ£æºÜ'Ô ÍaÇÃ(ÀT¾z½r½¾ ¿ŒÀAÂÄÆ#È0ÊKÌ\ÎuЊҟԷÖÓØëÚÝ7ßlá¢ãèå4è’êùìsïúñ–ô@÷úÏü´ÿ§©¼Î íûé§&S!N"à"ª"Š!_²– PõøÍîä"ÙUÎÄ®º~²¥«`¦©¢ƒ ÐŸe ¢­¤¨Ç«ð¯D´·¸"½ŠÁËÅøÉùÍßјÕ8Ù®Ü àHãnæséfì>ïò­ôJ÷ÌùFü¥þý@z¤Å Ù ç èåØÉ°˜w[2!í"Ê$­&ˆ(v*[,R.H0O2Y4w68Ô: =s?çAcDøF¤IVL,OöQÞT±W„Z=]Æ_b dŠerfœfãed$aÑ\WðOSGf=E2J&©Þ , ôÁè˜ÞÃÕYÎhÈáìÀŸ¾ž½d½ç½à¾CÀëÁ¿ÃµÅ¼ÇËÉáËôÍÐÒ;ÔKÖi؂ڤÜÏÞ÷à7ãoåÄçêìõîyñô·ötù?ü ÿ4 L`kT"¦î½ "Ë"½"Ï!ÙÅuç þÓúÐð)æCÛfÐ Æo¼ÿ³á¬K§G£Ö ÛŸ7 ³¡%¤N§«¯m³×·K¼ªÀþÄ&É8ÍÑãÔƒØÜfߪâÑåáèÓë´îwñ+ôÇöSùÉû3þ‡Ó <[ s †ƒyiT8ûÙ· ‘"p$M&/(*,í-ê/ç1÷3 648d:­<ÿ>lAãC{FIÖK•NoQIT$WúY³\L_§a®cHeNf¢ff…dËaÄ]SXrQIj?‹4­(/`¦cöèê‚àj׵πɮÄ:Áú¾¾½l½Â½¬¾û¿•ÁbÃUÅTÇgÉwËͥϷÑÏÓåÕý×Ú8ÜaÞŠàÅâÿäMçžé ìrîþðˆó3öèø±ûŒþ{wƒ— ® ÆÏÅ“+{k Ö!²"È""J m\o ¬üÈòCè^Ý|ÒÿÇ=¾Šµ*®H¨ñ£8¡óŸ Z¡ž£¨¦FªO®’²þ¶l»Ó¿)ÄZÈqÌ]Ð)ÔÑ×[Û½Þ â3åKèAë&îðð¦óHöÓøSûºý`ŸÍó  # öÛÀž~Z 5"$ð%Ó'·)Ÿ+-„/ˆ13¤5É7ô9><†>õ@gC÷E–HGKNÝPºS–VjY-\Í^3aOce#fžf@fådkb¢^YáRÛJdAÃ6 +®ä#Áøí|âÙ%Ñ Ê‹ÅÖÁY¿ò½o½«½y¾³¿FÁÃöÄìÆÉ Ë*Í9ÏSÑeÓ|ՔׯÙÍÛõÝàRâŽäÙæ)éŽëúíyð ó¨õ`ø!ûýýæàèù  (8, ¨  —!‹"Î"8"­ :$Ì1uþÁôRê}ß•ÔüÉÀ%·¯O©²¤¡¡ ôŸ ¡£¦‹©‚­»±#¶Žºþ¾PÃǧ˜ÏpÓ׬ÚÞgá›ä±ç±ê—ídð#óÃõXøÖúCý£ÿð/dˆ¦ µ À½º¨–aC#úß!²#˜%t'Y)B+--&/ 1,395_7‡9Ê;>w@îBtEHÀJƒMOP-SVàX¢[M^½`íb­d÷efbf;eúbw_—ZJTL^Cæ8n-"!m¢&ûXï|äâÚÒÓËwÆ|ÂÇ¿*¾½”½N¾q¿õÀ®ÂÄÆ•ȬʽÌÔÎçÐÓÕ-×EÙbۈݱßáá"ä`æ¸èëíýï„ò(õÏ÷šúhýRHM] w ‰ –y(’®J!e"È"_"!š4À2²ö\ìœáªÖÌëÁ͸å°hª~¥¢U ãŸÈ ¥¢p¥Ó¨º¬å°Gµ¶¹¾ºÆßÊØÎµÒgÖÿÙnÝÆàýãçêíßï—òFõ×÷]úÌü/ÿ~Ãõ!< R Z]WI9!è¦{!_#5%'ú(å*Î,Ä.¿0Å2Õ4ñ69V;¥=ÿ?tBôDG9J÷LÄO›RwUQX[Ê]F`‚b`d¼efvf†e~c<`¦[›U#N=E ;¿/–#ñ" ”ýšñæ­Ü'ÔÍlÇ4Ã<Àp¾“½‹½¾7¿¤ÀWÂ1Ä*Æ3ÈAÊVÌlÎЖҩÔÂÖÚØùÚÝCßrá¯ãíåCè–êíxïòžôK÷ úÛü»ÿ³²ÂÙ îè¢E!2"½"~"U!"É4Y= ë–øgî´ãÊØ ÎÕÃ~ºV²’«V¦¯¢‘ çŸ† ;¢×¤%¨ï«°j´Ø¸G½£ÁíÅÊÎöѳÕMÙÇÜ à^ã€æŠévìTïòÅôU÷âùTü¸þ Q‹´Õ ë õ ûóíÕÇ£hF#!ÿ"Ý$¼&ž(…*p,b.\0`2n4ˆ6±8è:1=ˆ?ùAuDG±IoL4ORåTÂWZC]Í_bd‚ecf‡fÅeúcò`¥\äV²OG =2&s§ èóªèŠÞÀÕ^ÎtÈóÃÀÀº¾´½‚½þ½ú¾[ÀþÁÕÃÇÅËÇÜÉïËÎÐ+ÒCÔWÖs؋ڰÜÖÞá>ã{åÌç ê‹ìýîƒñôÂö~ùHü,ÿ!> QfkV¢Û¬ ý!©"”"š! }.‹² ™uújðÏåæÚÐÄÅ:¼Ú³Å¬D§F£æ îŸV Õ¡J¤v§.«B¯“³ü·j¼ÏÀÅIÉNÍ8ÑúÔœØÜ}ß»âéåðèéëÄîŠñ=ôØöcùÜûAþ›áKk … –”ˆydJ-çÊ ¡"‚$]&B(&*,.ö/ÿ14"6C8y:¾<?A÷C‹F+IåK©N}QWT2WZ½\P_¨a¬c>eCf‹füedd¡a•]X8QÜH.?F4s(ó0{BöÑêvàc׾φÉÅÄMÁ¿Ü½€½â½À¾À¨ÁyÃcÅiÇrÉ‰ËšÍ¯ÏÆÑØÓïÕØ ÚFÜgÞ˜àÉâ åRç®é ì‚îñ•ó;öóøºû˜þƒ‚‰  ´ ÉÓÂŽ$nW ¿!" "Ù! ,¸ =JühòåçÝ/ҹǾbµ®8¨õ£A¡  + |¡À£Ñ¦kªv®¶²!·»õ¿DÄyȉÌuÐDÔå×pÛÕÞâJå\èVë8îñ·óXöæøcûÊý)m³Û  . 21*îϰg L"$&ß'Í)­+¦-”/š1Ÿ3·5Ø7 :K<>A{C F§H[KNïPÇS¤VuY6\Ð^8aIcúdfŠf)fÄdBby^DY°R—J,A€6Ô*q¶õ¢øínâÙ)ѪʞÅêÁq¿ ¾‹½Ã½’¾Ì¿ZÁÃÅÇÉË5ÍDÏaÑmÓˆÕž×¶ÙÚÛùÝ+àXâšäàæ3é–ëî‚ðó´õfø.ûþðçòÿ  ,9.£üû~!m"§" "t ËïÔsÕþ_ôôé$ßDÔ¶É׿ú¶c¯A©­¤¯¡-  %¡F£,¦²©ª­Þ±H¶°º¿qçÇÃ˴ωÓ3×ÃÚ*Þ€áªäÈçÁêªíxð2óÖõjøäúYý®ÿ=t™· Ä ÓË˸¨ŽuR4 í!Æ#©%„'m)P+C-5/51;3O5m7œ9Û;'>Ž@üBŠE#HÐJ•M]P;SVìXª[S^¾`ëb¨dëe€fGf!eÏbO_cZTKLC¯8,-î 6{ÿúCïjäÞÚÒÞË…Æ”ÂÜ¿F¾–½²½c¾‹¿ ÁâĠƦȹÊËÌáÎòÐ ÓÕ7×MÙlÛݺßëá)äkæ½èë„íðò/õÞ÷úvýYPUe { ‘ž˜v‹—8!E"¤"3"Ð ]ÀäÃ_ÙÿMöì@á\ֻ˲Á ¸Ã°[ªu¥*¢`  à Î¢¥©Ø¬±iµÔ¹C¾˜ÂÛÆöÊòÎÎÒ{ÖÚÝÞà ä1ç+êíìï­òRõë÷kúßü=ÿÐ0M a kkiXJ/öر‘!k#K%)')ó*â,Ô.Ó0Ò2ì4719k;±=@~B EŸGJJ MÑOªR„U[X#[Í]L`~b\d±enfbfge[c`s[gUèMÿDÏ:/_#½÷ ný„ñ{æ©Ü'ÔÍ|ÇHÃRÀˆ¾­½¦½9¾M¿½ÀhÂIÄ8ÆCÈQÊcÌz΋ПҶÔÊÖæØÛ#ÝNß{á·ãùåGè¥ê í†ïòªôT÷úäüÆÿ¹½Èà òåœ3í "›"Q"!!æ‚çã Š5øîWãvؿ͖ÃOº1²«N¦³¢¢ þŸ£ ^¢ü¤J¨¬9°Ž´ý¸e½ÆÁÆ-Ê/ÎÒÉÕcÙÜÜ5àrã•æ™éìaï'òÑôl÷ðùeüÉþc™Åå û  ûéÓº™{W4!#î$Ì&²(“*†,o.t0l2„4™6Ä8û:C=œ? B‰D GÃILFORóTÎW™ZI]Ô_bdveVfpf©eÔcÌ`s\®VxO×Fß<Ê1Ë%=x ßÿÉóšè~Þ¾Õg΀ÈÄÕÀԾ˽ ½¾¿qÀÂèÃÚÅÛÇíÉûËÎ%Ð5ÒRÔ]րؓںÜßÞ áGã„åÖç)ê–ìïŽñ%ôÍö†ùVü1ÿ&#-D UkkWœÈž Ý!Š"h"j!`;Ü8T :ú ðlåÚÍÏ}Å ¼ª³´¬3§N£í   p ø¡q¤™§X«h¯¸³ ¸Œ¼íÀ6ÅcÉkÍPÑÕ¯Ø4ÜßÕâ÷å éøëØîñMôìöuùëûVþ¦ø(_z – ¡ §¥˜r\?þ× µ"’$q&S(8*$,.0 2416X8:Ð<(?ŽAD›FAIôK»NQfT@W ZÅ\V_§a«c6e3fxfáe@d{ab]çWúPžHê>41(ºûO"ö¶êjà_×ÀÏ•ÉÒÄfÁ'¿÷½š½û½Û¾*ÀÃÁ‰Ã{ÅwDžɖ˩ͼÏÒÑäÓûÕØ)ÚRÜnÞ¥àÐâå[ç¸éì‹îñžóIöøøÈû¡þ‹”¥ ¼ ÎÓÊc@ ª!k"z"¤!ÔåÆa» Úåûò‚ç©ÜÜÑqÇͽ6µô­+¨ó£M¡ K ›¡é£õ¦—ª›®ß²E·³»ÀbėȤ̑Ð\ÔþׇÛíÞ/âcåoèiëKîñÊólöôøwûÚý:ƒ¾ñ + A @E9*üãÁŸ X"5$&ñ'á)¾+¹-§/¬1µ3Ç5ï7:_<´>A’CF¾HkK0NþPØS¯V„Y;\Ú^5aMcîd fxf f¦dbE^YmR[Jæ@=6‘*6|Ézøèì[âÙ*ѲʰÅüÁ‹¿"¾§½Ü½­¾ã¿qÁ0ÃÅÇ É.ËBÍTÏiÑ}Ó“Õ¨×ÃÙãÛÞ4àeâ£äìæ<é¡ë îðó¿õrø9ûþûñù  2=,™óèe!O"~"Ù!< …¦|r¯ýúóéÆÞíÓmÉ™¿Ì¶D¯/©«¤¸¡? / G¡k£S¦Ý©Ì­ ²f¶Úº;¿ÃÈÇÛËÕÏÓO××ÚEÞ’áÃäÛçÕê¿í‰ðFóèõzøúúeýÆÿR„¬Ä Û ÝâØÍ·¡ƒgA$ ú!Ü#¹%–'€)b+W-F/J1K3d5‚7®9ð;;> @C›E6HäJ¤MqPISVöX´[Y^Â`éb¢dßekf2fûd®b_1ZÓS LØBj8î,¬ FÞú!ï^äÑÚ£Òä˖ƧÂó¿`¾¯½Ð½x¾¨¿ÁÙ¶İƸÈÈÊ×ÌðÎüÐÓ%ÕB×VÙxÛ—ÝÄßôá2äuæÉè&ë‘íð›ò7õê÷¨úýdY`k ƒ –¢šr}Œ!+"z""™ wgqÿèõŸëßàÖlËtÁm¸¤°Dªr¥1¢s  ¡ë¢¿¥© ­1±’µù¹d¾¹ÂüÆËÏàÒÖ&ÚŸÝîà%äCçBê0íÿï¿ògõü÷~úïüNÿ¡ã@` r {tnZA)éÅ¡!€#Y%?')+ô,ç.å0ê2ù47@9;Ç=(@˜BE´G^JMåO¸R’UgX.[Ô]O`bVd¨e]fKfGe8cá_C[*UªM¿D‡:?/!#Ç DýcñjæœÜ)Ô ÍŽÇVÃpÀš¾Í½¼½T¾g¿ÒÀ€ÂYÄNÆSÈaÊr̅ΙЬÒÀÔÖÖïØ Û/ÝT߉á¾ãæTèªêíŒïò²ô_÷úîüÐÿÃÅÒå ûã• $Ö ÷!v"$"ì ¤;“« +Í÷¦í÷âØpÍVú²i«E¦º¢°  Ã €¢%¥q¨@¬b°¶´¹‹½äÁ'ÆKÊJÎ(ÒãÕyÙóÜJà‡ã©æ®éŸìuï8òâô€÷úyüÚþ,v¨Ùõ ÿâÊ­ŠjE!##ÿ$á&¿(«*‘,‰.0„2•4«6Ù8 ;Y=®?BœD1G×IŽLXO)RUÙW¢ZR]Ó_bþcmeEfZfe¯c¢`?\xV8O™F<Š1Œ%H ´ÿ±ó~è|Þ¶ÕsΊÈÄéÀï¾ç½¸½1¾*¿ŠÀ)ÂþÃëÅîÇûÉ Ì Î/ÐFÒXÔkև؟ÚÃÜëÞáSãŒåàç5êìï˜ñ-ôÚöŽù_ü=ÿ-+7F ^mnPŒ¿„ Å!b"A".!*í‘Þö ׫ù¦ïå7Ú|Ï@ÅÒ»ˆ³š¬*§Q£ý  ‘ ¢™¤Â§«¯Ý³D¸¯¼ÁVÅ~ɇÍiÑ+ÕËØGÜ¥ßêâ æé ìëî¯ñ_ôþö…ùÿûdþ¾Ai‘ £ ´ ·¶«š‡mN1 í Å"¦$&g(I*6,&.0!2,4G6g8£:á<;?¤AD²FNILÉNžQrTMWZÎ\Z_§a§c,e&fbfÄedPa0]´W»PdH§>É3ó'„È)ö£ê_à\×ÉÏ¡ÉæÄ|ÁB¿¾¸½¾ö¾AÀ×ÁŸÃŇǕɤ˵ÍËÏÚÑñÓÖØ7ÚVÜ|Þ©àßâåhç¾é"ì•îñªóOöùÏû«þ—“›¬ Á ÑÕÁ…Q/ !J"Q"o!š x \ }û¤ñ çS܉Ñ1Ç“½µ×­"¨ó£Z¡2 g ¿¡ ¤§¾ªÁ®³g·Ö»5ÀĵȻ̰ÐpÔØŸÛüÞKâqå†èzë_î%ñÝó|ö ù„ûîýH’Óý) : R RUI>'òÓ± i"J$%& (ë)Ø+Ä-¿/»1È3Ü5þ72:p<Ç>'A¦C)FÒH{KANQåS½VŒYF\Ý^7aJcådÿeefîeˆdìa^ÝX3RJ§@ÿ5S*þKž]øÏìQâ Ù0ÑÀÊÀÅ¡¿A¾½½û½Â¾ÿ¿„ÁIÃ'Å(Ç-É=ËQÍ^ÏwÑ…ÓžÕ³×ÍÙêÛÞ8àqâ¬äóæJé¦ëî–ð'óÉõ{øBûþü $ 5>-ù•âÖL!-"V"¨! DW+» Ký˜ó1élÞžÓ'Éb¿¡¶)¯#©©¤Ã¡T J i¡Ž£{¦ªø­-²¶÷º^¿­ÃæÇöËìÏ·Óe×îÚ[Þ¤áÙäêçîêËí¡ðSóüõøûzýÔÿ$`—¹Ù ç ðóéÜʯ–xQ7 "ð#Ç%®'‹)|+a-_/V1c3s5–7Â9°@'C¬EIHøJ²M„PTS/VY¾[]^Ç`âb¡dÍe_ffÞd†bì^ýYšSËK™B)8­,t ̺úïMäÌÚ¤Òï˨ƺÂÀw¾Ï½ä½š¾¹¿:ÁëÂÌÄÂÆÊÈÕÊêÌøÎÑÓ5ÕJ×bÙ‚Û ÝÑßûá=ä~æÒè2ë›íð£òDõò÷´ú‰ýleht ‰ ™¤šmqx!"W"Ó!` Ù)=   ÿ„õ;ëƒà²Õ!Ë8Á>¸ƒ°3ªo¥6¢‡ 4 #¡£ã¥H©1­W±·µº…¾ÚÂÇ/Ë+ÏüÒ²Ö?Ú²Ýá:äTçYê>íðÌò}õø•úüücÿ°ó*Ro ƒ Ž‹{mR:øÚ®!–#i%Q'0)+-ú.ö0ü25(7X9;Þ=9@ªB/EÃGpJ,MòOËRœUvX5[Û]Q`}bPd›eMf1f+ec¶_ [òTnM|DK:ý.æ"N— $ýDñ\æ”Ü+Ô+Í›ÇnÄÀ¹¾å½Ù½m¾¿èÀ—ÂmÄ_ÆeÈnÊ̒ΤйÒÌÔÞÖüØÛ8ÝaߎáËã æ\è¸êíœï"ò¼ôk÷%úúüØÿÎÊÜé â‹À Ù!P"÷!´ eðEO& Ãp÷?íâÈ×'ÍÃé¹í±U«@¦À¢Á 0 ã ¥¢K¥š¨e¬‹°Ù´C¹«½ÂDÆhÊbÎEÒöÕ”ÙÝaàœã»æÄé°ì‰ïHò÷ôŽ÷ú‰üêþ?†¹ê  ',(ñมyX!4#%ò&Ó(¼*§,˜.•0—2§4À6é8";h=Ä?.B¯DDGèI¢LfOVOUF`ˆ3º'JšÿåõêVà[×ÎϱÉöÄ–ÁY¿+¾Ó½,¾¿[ÀêÁ¸ÃšÅœÇ¢É²ËÃÍÕÏéÑúÓÖ&Ø@Ú_܈ޭàíâ#åsçÈé*ìžî"ñ²ó\öùÙû´þ¡š£³ Ä ×Ô¾‚G q!+"""C!Y`(» ûBñÅæûÛ>ÑíÆ`½è´Á­¨÷£e¡J ‚ á¡2¤C§åªé®+³Œ·ô»VÀ ÄÎÈÚÌÄЊÔ.زÛß_âƒå›èŒëqî8ñíóöù–ûýý\¡ä8 L a db_H<æ¿¢ y"\$6&(ü)é+×-Ð/Ï1Ù3î58C:…<Ö>=A²CAFßHKRNQòSÌV’YR\Þ^Å7Ç=ÉMË[ÍoÏєӦս××ÙôÛÞBàyâ¶äüæRé±ë"î¢ð0óÓõ„øLû þ   , 8@*øŠ×Á2!"+"z!Ä ×b ±íü4óÓèÞOÓÝÈ.¿r¶¯©®¤È¡m ` ¡¯£¦¦&ª ®S²³¶»}¿ÎÃÈÌÐÑÓz×ÛlÞ¾áéäèûêãí®ðjó öŸøû‹ýãÿ4r§Êè ù ûìÜÀ§†gD "ü#Ý%¼'¢)‰+w-o/k1u3‡5¥7Ù9Æ@5CÃEXHKÇMPfS;V YÉ[`^É`ãb–dÄeIfþe½d_bÀ^ÉYbSK[Bé7p,< —ò–úñî>äÈÚ¦Òû˵ÆÒÂ%À‘¾ê½þ½²¾Ó¿MÁÃÞÄÔÆÚÈãÊ÷ÌÏÑ.Ó:ÕX×kÙŠÛ­ÝØßâEäˆæÛè:ë¥í#ð­òLõý÷¼ú•ýtnm} ž§—l eeð é!0"¥!' ›Þì´A°þ õÞê)à^ÕÞÊùÀ¸b°$ªj¥@¢˜ P @¡;£¦v©R­‚±Øµ@º£¾ýÂ.ÇNËAÏÓÈÖXÚÅÝáLäjçjêSí&ðßòõø£úýqÿÁ7d~ • ›¡˜yfG.ìÁ!¦#}%a'C)*+- / 13"5:7k9¡;ð=L@¼B@EÙG~J?MÿOÜR©UX<[ä]S`}bJde³m¬§Y£¡O É a¢á¤¨Ë«Þ¯(´‹¸ó¼KÁ’Ÿɺ͠ÑWÕûØsÜÑßã2æEé0ìïÑñ†ô÷«ùü‡þÝ%`Ž­ É Ó ÚÖͽ©ŽsP2 !ê"È$¥&‹(n*[,J.E0E2S4k68Æ: =a?ÈABDÖFrI+LëN»QTdW,ZÜ\b_«aœcef;fŠeÞcö`Ö\@WLPÞG+>E3|'eÖ¿õzêCà[×ÐϼÉŪÁq¿D¾í½G¾&¿rÀÂÌîŮDZÉÂËÐÍâÏöÑÔÖ.ØKÚl܌޿àðâ2åzçÓé6ì§î-ñºógöùäû½þ«£¬º Ê ÛØ½|ÿ6 T! "ø!!Ýc¦ »»úßðeæ ÛíЩÆ'½Â´¢­ ¨õ£r¡a › ¢U¤l§ «¯Q³±·¼vÀÀÄêÈõÌáРÔIØÅÛ-ßpâœå«è ë…îGñôœö.ù¦ûþm±÷J ] q uum\L0÷Ò³ "k$I&-(*ú+ë-à/ä1ë36%8W:—<ë>MAÉCPFóHžKdN*QTÕV¡YW\ä^=aAcØdãe»¿ìÃÈ-Ì!ÐçÓ•×Û„ÞÒáüäèëõíÁð{óö¯ø,û›ýõÿE„µÞ÷  ÿêÔ¶šuX 0"$î%Í'³)ž+‡-ƒ/|1‡3™5»7è9(Ù@HCÔEmHKÙMžPwSFVYË[m^Æ`æb‹d½e2fèe›d9b“^’Y*SMKB§7/,ÿ`Ãoú×î*äÀÚ¦ÒÌÄÆäÂ<À©¾¾¾È¾í¿cÁÃòÄåÆêÈóÊÍÏ&Ñ6ÓKÕ_×vÙ•Û¶ÝãßâOäæèèBë°í,ð¸òXõøÇúý~ys‡ ‘ ¤¨™g\QÝ Æ! "u!ðY—š[ãLþÁôzêÐß Õ–Ê¾Àæ·B°ªc¥K¢§ l _¡_£)¦ž©x­¨±þµ`ºÉ¾ÃPÇgË]Ï-ÓâÖkÚàÝ,ácä{ç~êeí9ðóòõ/ø²ú#ý€ÿÕHvŒ ¨ ¬°«t[:öÙ!±#’%q'V)<+,-/1355M7}9¶;>a@ÏBSEëG’JMMPçRºU‹XH[è]W`|bCd†e*ffïdÃb`_§Z‚TóLþCÉ9.q"ß< Õüñ5æƒÜ-Ô8ͺǔïÀî¾¾¾¡¾­¿Á½Â–ăƅȌʟ̪οÐÎÒáÔöÖÙ'ÛMÝqߤáÝãæqèÊê5í®ï7òÑô}÷<ú ýïÿÝßéö Ú€èò“ Ÿ!"!H èb¤ i¨öìäáו̖Œ¹¥±.«3¦Ë¢á b ¡î¢”¥è¨¶¬Ó°&µ‰¹í½DÂ~ƠʘÎuÒ(ÖÁÙ3Ý‹àÆãâæëéÕì¯ïmòõ°÷6ú­ü ÿd£ß) = KLI@)ùᾞy!X#4%'ù(Þ*Ì,½.º0¼2Ì4æ69H;Ž=ê?UBÕDeGJÁLŒOVR.UýWÁZg]ß_bícSeff5eBc `©[ÐU†NÕEà;Ä0Ù$\¶ <ÿSóCèY޷ՃεÈRÄ/Á8¿5¾¾|¾x¿ÍÀmÂ6Ä%ÆÈ+Ê6ÌDÎXÐeÒ{Ԍ֤ؿÚßÜß5ájã°åöçWê·ì2ï¶ñKô÷ö®ù~üYÿIFN] mwqKýp‘D r!ú!»!— m¤Ùå °ˆø~îøã2Ù–Î{Ä6»³S¬§W£*¡c ç ‡¢¥;¨ó«°M´°¸½nÁ¯ÅÓÉØÍ´ÑuÕÙ‰Üçß&ãIæWéDì$ïäñ—ô2÷ºù4ü–þï6o ½ Ú ã ìåßͺ ƒc@!û"Ù$¸&š(‚*l,].V0W2f4}6£8Ø:=r?ÝAUDçFˆI:LþNËQžTrW6Zå\f_­a˜ceöe&foe¹cÐ` \W P£Gè=3='Õ3«œõbê5àU××ÏÃÉŽÁŠ¿_¾¾c¾;¿ŽÀÂàÃÂżÇÅÉÎËáÍîÏÒÔ%Ö:ØXÚqÜ›ÞÅàûâ;å†çÚéBì²î6ñÊólö'ùìûÉþ´®³Ä Ð ÞÚ¼x÷)ô=!æ!Ó!Ù çÑ‘I ZXúzðæFÛœÐeÆï¼—´Œ­ü§ø£~¡r ½ "¢¤‘§4«7¯w³Õ·;¼—ÀÞÄÉÍöоÔ\ØàÛA߆â°å¾è¸ë’îañô²ö@ùµû&þzÆ2W r  ‡‡|pZC% âÇ ›"€$[&;('* ,.ñ/õ146<8g:¬<ÿ>_AÞCaFI±KsN>QTâV°Y]\ì^?a;cÕdÒe)f¤edza†]?X‚QbIä?:5™)O­ñ÷‡ì%âüØ;ÑáÊïÅXÂ俾 ¾G¾¿AÀÊÁƒÃdÅYÇ^ÉkËv͋ϔѮӺÕÔ×êÙ Ü-ÞXàâÈäçféÄë8î´ðEóèõ™ø`û8þ( 6 AF(ð{»Ÿ!Ì!ß!!Wxv/¬ õ$üoòè\Ý©ÒSȶ¾!¶Ð®ø¨¤¤á¡  Ê¡¤ê¦}ªh®¤²ú¶b»¿¿ Ä:ÈKÌ:ÐÔ®×0ÛÞãáå*è#ëîÕðŒó2ö¿øAû©ý R˜Äñ  % " ÿãʪ‰f E"!$ÿ%ã'Ã)¯+œ-•/Ž13©5Ð7ù9><…>í@]CäEH*KéM²PƒSVV"YØ[o^Ì`áb†d¯e!fÎe|dbc^_YìRKÖAe7î+Á+’Kú¸îä³Ú¬ÒÌÖÆ÷ÂQÀƾ¾6¾â¾À{Á*ÃÅõÆýÈËÍÏ5ÑAÓUÕkׂٞÛÂÝêßâZ䛿ðèNë¹í9ðÂòaõøÓú¦ý‹€~ ™ ©«™cþKF¿ ¬!ã!G!·MFƒèý[ôêqß¶ÔLÊÀ··$°ª`¥R¢¹ … ¡‚£R¦Ä©¡­Ï±#¶†ºé¾8ÃmdžËuÏLÓöÖ†ÚóÝCáyäç“êwíLðó­õDøÂú5ý”ÿã(Y…¢ ´ ÀÁ¼¯ž‡lO+ ç!Å#¤%ƒ'h)N+>-//1123F5c79Í;>t@âBgEûG§J[M'PôRÉU•XS[ì][`{b.3"§ ­üõðæ~Ü'ÔDÍÆÇ¨ÃÇÀ¿1¾(¾¹¾È¿-ÁÖ§ĖƖÈʬ̹ÎËÐÙÒíÔ×Ù4ÛUÝ|ß®áæã)æ{èÓê@í¸ï@òÞô†÷Húýúÿçæòý ÚyÝâ{ ƒ!à!o! §PI¢ÿBöìƒáËÖBÌ^ÂT¹‡±«.¦Ð¢ò z ?¡£»¥©Û¬þ°Hµ±¹ ¾h™ƿʲÎÒAÖ×ÙIÝ àÛã÷æþééìÁï€ò+õÆ÷Fú¿üÿs·î7 R Y_ZN@)ðÒ®Ž!f#K%"')í*á,Ð.Ê0Ò2Ü4ü6!9Z;¢=ü?hBèDzGJÕL™OhR:U XÈZp]â_bëcEefÿeecó_y[“ULN‘E ;‚0œ$"„ ÿ0ó4èHÞºÕ„ÎÆÈcÄIÁN¿P¾!¾—¾¿åÀ€ÂNÄ5Æ2È9ÊEÌSÎcÐsÒ…Ô™Ö®ØÉÚéÜß=áwã´åèZêÇì8ïÁñVô÷ºù…üeÿQPUe ryqIøf€0 T!Ö!!` /ØP†€ Sø î—ãÚØIÎ8Ä»ò²>¬ §[£:¡y ¡¦¢-¥a¨¬+°t´Ò¸9½‹ÁÑÅïÉòÍÑÑ‹Õ(Ù Üýß9ãbæeé^ì2ïûñ§ôC÷Ïù?ü­þýHƒ®Ñ è ÷ úùðÝ̱‘yN3! #ë$Ê&­(“*,n.k0h2|4Œ6¹8é:1=†?îAjDøFšILLOÜQ¬T~W?Zì\l_ªa˜ceìefTe–c¦`n\ØVÊOgG¢=Æ2ü&œ€~õJê*àP×ÝÏÏÉ.ÅÐÁ¤¿u¾#¾w¾[¿œÀ1ÂñÃÕÅÎÇÒÉßËìÍüÏ ÒÔ1ÖFØ_Ú~Ü£ÞÎà ã@å’çäéKì½î?ñÕóvö0ùøûÑþ¿µ»Ê Ô ãÚºsëß!!Ã!©!£ ­ŠDµñ ÷÷ùð¦åðÚOÐƾ¼m´u­ï§û£Š¡‹ Ø H¢Ÿ¤¼§Z«]¯Ÿ³ö·`¼¶ÀûÄ(É)ÍÑÒÔvØöÛUßâÂåÔèÈëªîoñ&ôÁöQùÊû3þ×Dh ‘ ˜—Ž€lT5õ× ¯"$o&N(6*,.024*6H8:¹<?qAðCvFIÂK‡NJQ#TìVºYf\ð^@a8cÌdÆefŠeúcPaZ]XKQI£?ú4X){ïÐ÷mìâöØ?ÑêÊÆiÂÀ¦¾(¾a¾*¿ZÀáÁ–ÃyÅjÇrÉvˈ͓ϧѴÓÊÕÛ×÷ÙÜ6Þdà”âÔäçnéÓë@î¿ðRóðõ¦økû?þ+#. < GE)ër®‹ç ¬!³!ä 7&ÚP ’Áû ò²çÝYÒ È}¾ôµ·®æ¨¨¤ç¡© ³ ò¡¤§žª–®Å²#·„»ß¿.ÄVÈiÌSÐÔÆ×HÛ±Þýá%åAè6ëîçð óAöÕøOû¾ýh¥Ø  - 44/ôܺ›z S"5$&ô'Ö)Â+¬-©/ 1¯3¾5á7:M<›>þ@qCøE’HÑOÓ]Õx׉٫ÛÊÝõß%âb䥿üèUëÈí>ðÑòjõøÜú±ý”І– ž °«œ^ôC.« Š!¹!!z×ÿó¥ "‡ýõó¹éßcÔÿÉIÀ…·°ï©^¥Z¢Î Ÿ ¡¡¦£{¦ç©Î­ó±H¶­º¿ZËǡ˒ÏcÓ×ŸÚ ÞZáŒä¦ç£êí[ðó¾õWøÕúGý¤ÿ÷7n•² Ç ÐÒÍÀ±–]@ ü!Õ#¶%–'x)e+M-G/?1G3Z5u7¤9Ú;+>†@õB{E H¹JpM5PSÕU£X[[ö]Z`~b3dsefÕe¯dxb_ÅæÁ¾¿Ž¾=¾“¾s¿¸ÀCÂÄçÅâÇãÉíËýÍÐÒ(Ô<ÖQØkڇܰÞÙàãQå•çôéRìÊîIñßó‚ö:ùüÚþʽÆÏ Þ äݹmã Ê!¡!|!p mEò] “ùµïAå—ÚùÏÜÅ‚¼F´W­å§ü£•¡¡ ÷ g¢Ë¤à§„«‡¯Å³¸…¼ÖÀÅBÉJÍ-ÑîÔØ Üp߯âÜåæèàëºî…ñ7ôÕöcùÜûEþžê%Vz ’ ¥ ¦«ž“~eH+ æ Ã"¡$&c(H*2,".02$4>6[8”:Ï<&?‰AD‹F)IÖK–N^Q,TW¿Ys\ó^Ba7cÁd¸efleÜc#a)]ÍW QßH_?¶4)×DÁ¬÷PìâòØ=Ñ÷ÊÆ~ÂÀÀ¾B¾{¾B¿uÀõÁ¯ÃŠÅ}ÇɅ˗͟ϵѽÓÖÕç×ÿÙ Ü?Þmà¡âÜä%çxéÝëHîÎðWóÿõ­øvûKþ2*+4 C JH)äj¡xÍ ‹!‰!² Üó؇ñ 2\û¨ñOç©ÜÒÆÇD¾Êµ˜®Ü¨£¤ö¡º Ñ ¢E¤?§Èª½®ì²I·¥»ÀHÄxȃÌmÐ8ÔÚ×bÛÇÞâ@åOèNë,îüð²óVöâøgûÊý/v¶ì , = FF?2 êά‰ i"C$%&(ë)Ò+Ã-·/¸1½3Ö5ð7':\<´>A†C F¥HOK NÓPŸSsV7Yê[{^Ð`Úb{d’eÿe—e;dÁa^öXuR’JTAß6o+J¼:ýù†îöã©Ú­ÒÌôÆ ÃÀ÷¾Q¾g¾¿5À¦ÁYÃ)ÅÇÉ"Ë.Í=ÏIÑ\ÓiÕטٲÛÖÝýß2âhä´æédëÍíLðØòuõ(øåú»ýž’› § °±—]ì4 j!•!ä G¶ŸJ Åý—óVé»ÞÔ¸É À\·ç¯ß©[¥c¢à ¼ Á¡Ì£Ÿ¦ªð­²m¶Íº,¿wèǾ˪ÏÓ&×µÚ Þná£ä¸çºê íqð,óÔõdøèúWý¸ÿLz©Ã Ö ãáàЧ’mT+ "ë#Ä%ª'Š)v+a-X/S1Y3n5…7º9ê;B>”@ C‹E!HÉJMGPSçUªXe[ü]^`zb/deeóe»edRbÓ^ ZÓS7L:C9¿-µ!:¬]üºðùåiÜ+ÔOÍæÇËÃùÀ4¿j¾Y¾ñ¾÷¿^ÁÃÒĹƹȻÊÊÌÔÎäÐñÒÕ×.ÙGÛjÝßÂáùã?æŒèëêQíÎïUòòô÷[ú)ý úúÿ ÍpÁÄI F!”!!¤#…ª–Fàþuõ\ëÊàÖ²ËÛÁ÷¸A±óª ¦ß¢¡¬ €¡V£ ¦^©-­K±”µö¹T¾£ÂÞÆðÊïοÒuÖÚxÝÌàä"ç$êíåï¦òSõæ÷núÜüDÿ•Ú;] p ~raJ3õÒ¯!#h%N',)+-õ.ò0ô25!7H9;È="@B E¢G@JúL¹OˆRUU#XÜZ{]ë_bác.eåeÏeÞdÐbœ_["UÐME;0$³$ Âþûòè;Þ³Õ”ÎâȆÄwÁ¿„¾W¾Ë¾¿¿ÁªÂwÄXÆWÈVÊcÌmÎ~ЇҡԩÖÈØÜÚþÜ#ßSáˆãÌåèrêØìMïØñhô÷ËùŸüuÿf`er {sDëNcþ!‰!4!÷«L«ÕÆŠY÷YíØâ0ج͸ú«²¬÷¦h£S¡® D¡í¢z¥®¨l¬{°¾´¹x½ÒÁÆ-Ê%ÎÒ»ÕYÙÌÜ(àfã†æ“é€ì\ïòÐôd÷ôùdüÎþ l¢Óñ ìÕ·—vV!/#%ì&Ô(¶*¥,“.0‘2ž4¶6Þ8;U=®?B“DGÀImL3OöQÌT•WTZü\r_¬aŒcödÊeãeeHcT`\fVVOßF#=B2€&+› .;õ êàL×çÏèÉRÅýÁ׿©¾X¾¬¾Ž¿ÍÀ]ÂÄûÅñÇòÉþËÎÐ$Ò3ÔGÖ[ØsÚ“Ü·ÞãàãTå¨çõébìÏîUñçóöEù üèþÏÈÌÖ á éÛ¹dÛúµë {!P!= .ÿ¢3 3-ùNïêä9ڲϗÅP¼ ´A­Û§ÿ££¡¸ ¡Œ¢í¤ ¨ª«¯¯è³D¸£¼úÀ;Å_ÉeÍGÑÕ¥Ø#ÜƒßÆâîåüèïëÑî”ñKôçötùîûXþ®ý2jˆ ¥ ² »·³¢wX=ú Ô"³$“&r(]*A,8.)0/274O6p8£:å<7?œAD›F.68 J MF)Þ`’d° h!`!| ¥©/– ÑùúDñòæKܸÑǾ µ®Ì¨¨¤þ¡Ñ î 3¢l¤e§ðªä®³m·È»%ÀgÄ–ÈÌŠÐLÔõ×vÛßÞ$âUåaècë>îñÂóiöõøuûßý;‹Çû" : S R[LF/ü༞ x"X$6&(ý)ã+×-É/Ê1Ó3ä5 85:r<Å>"A™CF¸H_KNâP®SVAYô[~^Ñ`Ùbqd…eée€ed›aÕ]¾X>RSJA¢6.+Š Þùlîéã¥Ú¯Ò)ÌÇ6ÚÀ¿j¾„¾/¿LÀÀÁjÃAÅ-Ç-É.Ë?ÍGÏWÑdÓwՉעٽÛÞÝà;ât仿 ékëÙíUðáò€õ0øðúÆý¥œ˜¢ ¬ ¶°˜Vä& u K!i!µ OiHó `Âü/óøè^Þ¿ÓqÉÓ¿.·Ê¯Ï©[¥j¢õ Ô ä¡ï£È¦8ª®B²‘¶ñºN¿–ÃÉÇÖËÈÏ•ÓA×ÊÚ8Þ€á¹äÍçÌêµíðAóãõ{ø÷úkýÅÿW’µÖ è òóðãнž„`B "ÿ#Õ%¾'š)‹+q-m/b1q3{5 7Ä9°@C¢E3HÚJ”MTP$SñU¸Xl[^^`zb'dYeáe eqd(bª^ÔYšSùKøBÀ8-x!{<üšðëå`Ü,Ô[ÍñÇäà ÁP¿‚¾u¾¿ÀsÁÃäÄÎÆÆÈÐÊÒÌæÎìÐÓ Õ"×8ÙRÛrÝßÉáäIæ”èöê\íÕïbòùô¨÷fú2ý  Ða»«6 &!l!ã fè6^9ëyþõúênàËÕfˤÁŸ$±ßª¦å¢$¡É œ¡£,¦‰©R­r±¼µºu¾ÃÂøÆËÏÜÒŠÖÚŽÝààä2ç<ê!íüïµòfõ÷÷úîüVÿ¤ì"Lo € t\B(çÀ!ž#~%]'A)'+-/1 3557Y9—;Ø=9@žB!E²GRJ MÆOšR`U0XäZ„]ê_bØc&eÑeºe½d®bm_ßZëT‘MÔDØ:Å/á#~ô þÚòóç/Þ²ÕžÎíÈœÄÁ™¿ ¾o¾å¾Ù¿-ÁÁ‰ÄlÆeÈjÊmÌ~ΈЗҨԸÖÏØæÚ Ý,ß^á’ãÕåè~êßì[ïÝñvô÷Ùù¤ü„ÿklkx €…pCâFPìü g!!¿p\~e.ñöûìzâÜ×_Í{ÃjºŠ²ü«ó¦j£d¡Æ `¡£ž¥Ù¨’¬¡°ä´?¹½ïÁ*ÆHÊBÎÒÔÕpÙáÜ@àzãšæ§é“ìnï2òÝô|÷úwüßþ3{¶á  *-- ûçÈ©ˆf!A##%'ã(Ë*³,©. 0¥2¯4Í6ì8);f=Á?'B£D.GÒI€L@O RÕT¤W^Z]w_­a…cîd¹eÌee$c(`Ù[.VO¡Fâ<2D&ñi õêàH×ìÏùÉ^ÅÂê¿È¾m¾Ê¾¤¿çÀsÂ,ÄÆÿÇÊ ÌÎ$Ð/Ò@ÔRÖdØ€ÚœÜÂÞìà&ã_å¯çêjìÚî_ññó˜öMùüñþ×ÔÑà ä íÚ·^ÐìžÎ Y!"! îºS±Ö ÒËøïîˆäæÙaÏXżù³)­Ô§þ£µ¡Í 0¡°¢¥3¨Ò«Ó¯´e¸Æ¼ÁXÅ~É€Í`ÑÕ¾Ø9ÜšßÛâæéìÞî­ñWôþöùüfþ Hv ³ Å ËÊò¢†nL, !ç"Ä$¦&„(n*T,H.?0@2K4a6„8¶:ø64œ(eàmk÷#ìîáêØIÑË3ƪÂKÀò¾y¾°¾t¿§À ÂØÃ°Å Ç¢É£Ë³Í¹ÏÍÑÕÓëÕû×Ú1ÜUÞ€à´âîä;çŠéïë`îÜðróöÃø‰û\þH8;B N QK#ÚXQ’ I!2!N ai<Ú: p–úáð’æôÛfÑ<ÇÕ½xµc®Ä¨¡¤¢á ¡S¢‘¤Ž§« ¯:³·î»DÀ†Ä³È¹Ì¤ÐgÔ ØŽÛóÞ<âeå|èpëWî ñÖóyö ùû÷ýGžØ 4 K b fiaSC(ðϰ ‰"k$F&+( *û+æ-Ü/ß1á3ü58J:…<Ø>5A¬C/FÉHrK.NðP¿SˆVNYû[„^Ñ`ÖbhdxeÖebeúcmaª]…XRJÖ@\6ó*ÕWàºùRîØã¢Ú°Ò5ÌÇLòÀ+¿…¾¾J¿dÀÖÁ~ÃUÅ?Ç=É@ËJÍVÏcÑrÓՖשÙÈÛêÝàEâ|äÅæéuëâí_ðìò‰õ=ø÷úÒý­§¬ ¯ º´“UÙùZ +!?!… Î õ– ^üÌò™èÞmÓ+É™¿·±¯¼©]¥s¢ ¡ð ¢¤ï¦_ªD®f²¹¶»n¿·ÃâÇöËáÏ­Ó[×ÞÚPÞ•áÎäàçâêÄí˜ðRóõõøû}ýØÿ*j Éä ü ÿõâή˜nW +"$é%Í'¯)™+ˆ-{/z1~3’5°7Ù9<^>Ã@,C³EEHíJ¤MeP1SÿUÂXw[^c`vb dNeÌeŠeOdb{^ YbS¸K¼B~8?-?!ÐNü}ðÜåXÜ/ÔbÍÈôÃ)Ág¿ž¾¾!¿,ÀŠÁ+ÃúÄÛÆÝÈØÊèÌïÎüÐ ÓÕ,×BÙ]Û}Ý¥ßÔá äQæ èüêgíàïjòõ±÷nú@ý  Ê[¬š !F!² 0¤ïã Šþ²ô›êàxÕËdÁœ¸±Ïª¦ê¢:¡ß ¿¡ £V¦®©|­—±áµ<º–¾åÂÇ-Ë!ÏòÒ¦Ö2Ú¥Ý÷à,äLçKê9í ðÌòuõ øúýdÿ¸ü2`z — œ¦œ—qR7ôÔ!±#Ž%q'S):+)-/13*5H7l9ª;í=J@´B2EÅGfJMÛO¤RsU8XðZ‰]î_bÒce¾e¥e›dŠb@_©Z´TOM—D:ˆ/ #GÁ uþ¼òàç"Þ´Õ£ÎýȭĤÁ±¿»¾Š¾ÿ¾ó¿BÁÚÂœÄÆvÈxÊ~̋ΕФҳÔÃÖÚØòÚÝ7ßhášãâå'è‰êèìgïåñ…ô$÷çù¬üŽÿwrs€ „†s;à4CÒà ?!Ú „2´ %Èÿ‘ö•ìâ…×Í=Ã7ºg²è«é¦s£s¡ß ¡7£Ã¥©º¬È° µb¹Á½ÂGÆfÊ\Î<ÒêÕŠÙøÜTà’ã­æ½é£ì…ïBòòô÷ú‹üîþFŠÈó / 8B<5"öÚ½•{!R#4%'ô(Þ*Æ,¼.²0¹2Ã4Þ698;}=Ô?:B·DBGâI’LRORêT¨WoZ]~_ªa…càd¬eµeßdcö_ª[õUÜNbFœ<Á1&¹6 ÚýôòéúßE×òÏÊtÅ*ÂÀྊ¾ä¾¼¿ÿÀˆÂCÄ#ÆÈÊÌ#Î2Ð;ÒLÔ\Öp؋ڤÜÎÞöà.ãlå´çêpìæîhñýó öZùüûþãÚÚå ë íÞ²YÆÛ‰² 3!ø Ò´oZv tcøî)äŽÙÏÅè»Ò³­È§¤Â¡â Q¡Ð¢:¥X¨ú«ü¯6´‹¸é¼9Á{Å–ÉŸÍxÑ9ÕÕØOܱßïâæ$éìøî¹ñpô ÷˜ùüzþÑ[†­ Å Õ ÞÙÔı›z`<!ø"Ø$µ&˜(*h,[.R0Q2`4q6›8Ç: =_?¿A=D¾FaI LÆNQYT#WáY‡\_Ca,c¥deÀeerc¦`—\)W[PH >ó3`(*®AJ÷ìÝáèØKÑËEÆ¿ÂdÀ ¿“¾É¾¿»À:ÂìÃÂŵǮɷ˼ÍÊÏ×ÑâÓöÕØÚ<Ü_Þˆà¿âøäCç–éúëgîëðwóöÎø’ûhþOCBI R TL!ÙIy7} !! ! )!ðá 5ú}ð2æšÛÑ÷Æœ½OµH®¶¨¤¤¢ø (¡v¢·¤²§D«-¯e³²·¼fÀ¨ÄÐÈÔÌÁÐ~Ô$اÛßSâzåè„ëiî4ñçóŽöù™ûþb©íD ^ r wzsfS< â½  "w$_&7(&*,ü-ï/ð1ø3 6+8_:˜<é>LAºCFFÙH†K"!$ü%ß'Ä)©+-‹/13¦5Ä7î9*Ñ@ECÂEXHK³MwP@S VÒX}[ ^f`rbdAeºeqe/dÚaN^hY*SwK}B88-ý šñûcðÇåPÜ,ÔnÍ È Ä9Á†¿´¾¬¾:¿CÀ¡ÁBà ÅòÆëÈêÊõÌüÎ ÑÓ%Õ8×KÙjۄݲßÛáäYæ­èëqíëïsòõº÷yúHý(  %ÄWœ ê !„ öc£¶‡ +´ýPô4ê»ßÕØÊ$Ál¸ß°¿ª¦õ¢H¡ú Þ¡Æ£|¦Ö©¥­¾±¶`º·¾Ã3ÇJË<Ï Ó¿ÖIÚ¼Ý áBäaç]êOíðâò„õ ø úýsÿË DpŽ ¥ ®·­§”€dK& ä!Â#¢%€'h)I+>-*/+1-3=5Y7ƒ9¹;>]@ÅBIEÓG{J*MíO²R€UFXöZ“]ï_bÎce²eˆeƒd`b_vZyTMSDT:A/i# “ LþŸòÊçޱժΠÉÁÄ·ÁοѾ§¾¿ À[ÁìÂ³ÄÆ‰È†ÊŽÌ˜Î Ð²Ò»ÔÑÖãØýÚÝAßqá¦ãèå6èŽê÷ìlïôñ‰ô4÷ìùºü”ÿ‚y}ƒ ‹‰q=Ò/,½ !¨ Rïm»Ê«dÿ/ö3ìÂá-×ÉÌûºA²Õ«á¦v£‡¡ñ ¥¡T£í¥'©â¬í°3µ…¹ã½2ÂcÆ…ÊwÎTÒÖÙÝià¦ãÄæÎé»ì•ïUòõœ÷)ú™üÿSŸØ( < MQMF6 çѧ‹!f#D%&')î*Û,Ì.È0É2Ö4ñ69M;=é?LBÉDUGóI¥LaO(RóT¹WuZ ]‚_¦aƒcÔdœe eÁdâbÌ_x[»U¡NF`<|1È%~ ²ÛôÞéìßD×÷Ï Ê‰Å<Â!Àö¾§¾ø¾Ú¿Á¡ÂVÄ5Æ%È$Ê*Ì1Î>ÐHÒWÔhÖzؔڰÜÕÞá5ãyå¾çê{ìðîsñôªöeù'üÿêåâé ó îã¬U¹Ìs• !Ë v'·ÿ ø(îÎã3ÙÉÎÒij»­³û¬¿§¤Ï¡ú n¡ô¢_¥¨$¬ °^´¯¸ ½^Á•Ÿɷ͕ÑPÕîØfÜÇßã-æ6é,ìïÏñ€ô÷¨ù$ü‹þã/i›½ Ø æ ïìåÖĪpO-! #ç$Ê&©(“*y,o.b0h2p4‡6¬8Ü:=p?ÖAKDÖFpIL×NžQfT1WêY\_Aa*cšd~e­eûdQcz`f\óVPáG[>°3"(ë|'÷ôëÐááØQÑ!ËYÆÐÂ}À%¿­¾ã¾¨¿ÒÀRÂÿÃÙÅÂÇÂÉÃËÍÍ×ÏáÑòÓýÕØ'ÚIÜgÞ–àÄâåJç¢éìrîôð„ó"öÛøšûuþWKMN Y YK!Ó?k!d ý â âíܤ- °ÎùðÒåCÛÆÐ´Æh½&µ1®ª¨¦¤%¢¡D¡˜¢Ü¤Ú§h«X¯ˆ³Ø·4¼„ÀËÄèÈöÌÔМÔ:ؽÛ!ßdâ”å èšë|îEñüó ö)ù«ûþo¾û.U o ƒ ‡ycN1ðÓ ®"Œ$m&L(3*, .024#6=8p:®<ú>`AÌCYFêH˜KLNQØS¦VaY \^×`Ìb\d\e­e0e²c!aF]XŠQ—IM@ß5q*^íƒtùî¹ã’ÚµÒHÌ2ÇrÃäÀZ¿½¾Ï¾|¿–À­ÃxÅeÇ]É^ËhÍpÏ{ÑŠÓ˜Õ©×ÂÙÜÛýÝ&àWâ’äÙæ+éˆëùírðó õLøûáýÅ·°¸ ¾ Á¶“IÉÿÑ' è î  [‚„LÞ @–ûòÕçPÝÇÒŸÈ"¿¬¶q¯£©S¥‹¢+¡,¡A¢c¤8§³ª®¶²·[»²¿õÃ!È-ÌÐâÓˆ×ÛwÞÇáôä è ëíí½ðxóö°ø.ûžýüÿMŒÄê  %(#ñÔ¶šq V"/$&ð'Õ)½+­- /¡1¤3·5Ø7þ9B<…>é@SCØEkHKÆM‡PMSVØXˆ[^e`sbd4e¨eWe dµa^9YëR=K7Bû7À,Ä cîÍûGð´åJÜ+ÔvÍÈÄSÁ¿Ï¾Å¾V¿YÀ¼ÁTÃÅÇøÈýÊÍ ÏÑÓ3ÕB×VÙrÛݺßçá"äeæ²èëyíõïòõÈ÷úSý0  % &"ÁM‘yêÈ ö Q Á[b+ ÏPýîó×é[ßÑÔŒÊîÀ:¸Å°¨ª¦ù¢\¡¡ý¡ê££¦ý©Ì­ä±,¶‚ºÜ¾"ÃTÇdËXÏ&ÓÖÖaÚÒÝ!áYärçuê`í1ðñò™õ0ø´ú%ýˆÿÙSƒ · ÁÃÄ´¨‘u]7 ö!Ô#´%“'w)_+L-A/;1B3O5l7–9Ì;>n@ÛBVEíG†JAMùOÅRUOX[–]ô_bÇcežesead;bè^BZCTÔLD:/-#Óc 'þ~òºç Þ²Õ°ÎÉÑÄÒÁâ¿ï¾¾¾3¿"ÀsÁÃÅĦƗȘʜ̤ΰлÒÊÔÜÖíØÛ%ÝMßxáµãíåCè–êíyïûñ—ô<÷÷ùÄüžÿ‹…‰ ‰s5Ѩ¡ õ | ²"iqKÿËõÒëdáØÖ€ÌºÂÚ¹²Á«Ü¦{£—¡ ¡À¡{£¦R©­±Tµ­¹¾O†ƜʗÎjÒ!Ö´Ù'݃à·ãÛæâéÌì«ïeòõ¯÷8ú­üÿj¬í< M ^aaUH2þÞ½›!x#V%9')+í,ß.Ù0Ü2é47'9`;¢=ø?cBÙDjGJµLrO7RUÃW€Z]…_©aycÏd‰eŠe¥dºb¤_B[†UaNàE<>1‡%IÏ ‰»ôÇéáß?×ýÏÊ™ÅTÂ9À¿Â¾¿ò¿-ÁµÂlÄHÆ5È7Ê5ÌCÎGÐWÒaÔuÖ…ØŸÚ¹ÜâÞ áCãåÌç ê‰ìöîñô¸ökù7ü ÿøéìñ ö ôß­M¯¼]w ì ž f8ßg§Áª£÷ÇíoãáØwΔÄ}»‰³å¬µ§ ¤Ý¡¡¡£…¥§¨I¬L°´Ö¸,½|Á¶ÅÔÉÒͰÑhÕÙ~ÜÛßã?æLéAìïåñ‘ô2÷ºù6ü™þû8‚¥Ó æ ù þÿõèÔº£dq3â'´Eí÷âë¼ááØPÑ/ËgÆèÂ’ÀB¿Ä¾¿¾¿îÀcÂÄæÅÙÇÏÉÔËÙÍæÏìÑÿÓ ÖØ6ÚOÜtÞžàÐâåTç¬é ì|îÿðŒó0öâø§û{þcURY Z _I#Ç;WD à ± ´¬™RØ' Kpù¸ïvåéÚyÐoÆ2½ü´®Ÿ¨¤¤5¢¡d¡¹¢ÿ¤¨Œ«„¯ª³¸U¼§ÀèÄÉÍîеÔPØ×Û5ß{â¥å¶è­ë‘îUñô®ö?ù»û%þ„Ë<i } • ™œ•‰rc=+ç ½"¡$|&c(A*3,.02446R8ƒ:À<?qAâCiFÿH©K]N$QåSµVlY\“^Õ`ÍbQdOe˜ee‘cø`]ëWJQ]I @ž50*#¸USùüí¯ã…Ú¼ÒMÌDÇ„ÃüÀr¿Ù¾æ¾™¿«À¾ÑÅrÇrÉlËvÍ~ψїӢն×ÊÙèÛÞ1à`âœääæ3é“ëî}ð ó©õYøûíýξ¼» Ç Ã¹‘FÀð½ È Ã ð@7ø‚ á1û¥ñvçöÜuÒYÈ辄¶R¯•©S¥’¢E¡>¡j¢€¤f§Øª·®ß²$·‚»Ñ¿Ä>ÈIÌ3ÐúÓ¢×(ÛÞÚá åèëîÏð‰ó1ö¾øFûªý[ Óü + 969"úëÅ©‡ e"A$#&(ë)Ì+Â-²/²1¸3É5ê7:O<>ø@iCèE~H KÙM“PaS$VæX[^h`pb d%e˜e;eðc‹añ]Y³RÿJõA»7,Š -¤û0ðžåEÜ*ÔÍ)È3ÄhÁ·¿è¾à¾n¿rÀÒÁjÃ4ÅÇ É ËÍÏ"Ñ-Ó=ÕK×eÙyÛÝÂßòá,änæ¾èë…íðˆò$õÑ÷Œú]ý:)## * - ºG‚hϪ Í ! ‰Ù Ù iôüˆóxéß}ÔEʱÀ¸¥°˜ª¦£n¡.¡¢ ¤Ì¦#ªô­ ²O¶¨ºü¾BÃrÇËsÏ@ÓíÖyÚêÝ5ápä†ç‡êtíCðó¬õAøÆú7ý™ÿê1g³ à ÖÓÔÆ¹ ‹hN* "ç#Ä%¦'‹)o+b-P/Q1O3g5|7ª9ß;)>ƒ@ìBkEûGJOM PÒRšU\X [™]ù_bÀcûdˆe_e@db½^ Z T•LÖCÍ9Ä.î"œ6 úýdò£çÞ²ÕµÎ&ÉåÄåÁý¿¿Ø¾M¿:ÀŒÁÃÛĸƨȪʩ̳νÐÇÒÕÔçÖöØÛ-ÝXß„áºãþåGè¤ê í€ï òŸôF÷úËü©ÿ’ŒŠ’ ’Žq4É … Ï N ânßì¤þhõsë á„Ö8Ì{¬¹û±¯«Ô¦ƒ£¤¡'¡Ý¡ £5¦w©2­<±|µÏ¹%¾q¢ƻʯΆÒ9ÖËÙ>Ý—àÌãñæòéåì·ïò&õÅ÷Gú¿ü$ÿz¾ý$K _ nsqgVG'ëЫ!‹#h%H'-)+-ò.ì0î2þ47?9p;µ= @rBîDzGJÇL€OIR UÕW‚Z]…_¨avcÀd{ere‡d–by_[QU$N¢EÜ;ý0O%£ `ô³éÖß>×Ð&ʪÅlÂOÀ,¿Ù¾.¿ ÀEÁȃÄWÆIÈBÊGÌMÎWÐ_ÒoÔ}ÖØ«ÚÂÜêÞáGãåÑç,êìï†ñô½öyù<üÿþòó÷ û õá§H¢«IX É n 6ôŸW`P=÷kíãŽØ-ÎVÄM»e³Ï¬®§¤ë¡+¡¦¡;£©¥Ì¨u¬m°¨´÷¸O½œÁÕÅïÉíÍÈÑ‚ÕÙ•Üòß.ãVæ^éRì/ïòñ¨ô@÷ÎùEü®þQ‹¼Þ ù öç̱”pS!+#%ê&Ï(¶* ,.‹0‰2—4¬6Ò8ÿ:H=’?þAoDúF“I@L÷N¼Q‚THWýYŸ\ _Fac‹d^eƒeÁd c'`\ˆV¤OeGÜ=03¨'|ÁçöÈë¶áÚØZÑ:ËzÆþªÀZ¿à¾¿Û¿Á~Â'ÄÆåÇáÉáËèÍñÏûÑÔÖ'Ø?ÚYÜ~Þ¦àÛâå^ç·éìŠîñ˜ó8öíø¯û†þi_W` _ `LÄ-Iù* ¸ Š |tQ‚Ë ð ù\ïå—Ú-Ð2Æý¼Û´ý­–¨©¤?¢9¡~¡Ú¢'¥'¨¶«§¯Ò³!¸y¼ÆÀÅ%É)Í ÑÊÔkØèÛNßâ¼åÆèÂë¢îjñ!ôÁöMùÎû6þ“ßPw ¤ ©¯¢š…oT6ô Ò"±$Œ&u(S*D,..(0'204D6d8•:Ô<?‡AðC}FI¸KoN1QõS¾VvY\–^Ø`ÇbJd?e…eûdocÎ`ê\±WQIÏ?_5ö)í†1.ùïíœã‡Ú½Ò\ÌSÇžÃÁ¿ï¾¿®¿ÅÀ2ÂÒãņÇ}É~˂͌ϒѢӬÕÀ×ÕÙïÛÞ:àhâªäéæ?éë î†ðó±õaø$ûõýÕÈ¾Ç Æ È¸?¶àªô¢ ¹çúí¤+ „ÔúGñç¤Ü'Òȵ¾\¶;¯Š©R¥ ¢U¡_¡‡¢§¤‰§þªá®ý²N·œ»õ¿2ÄYÈeÌIÐÔ¶×=Û¦Þîáå3è,ëîáð›óAöÑøQûÀýo®å , < GJB;&÷Ù¹˜ v"U$1&(ø)á+Ó-Ã/Æ1Ç3à5÷7,:^<°> AyCûEH/KëM¡PmS1VíXš[^m`ibdeƒe#eÏccaÆ]ÌX~R¾J¾Ax7H,N þ–…ûð“å=Ü1Ô…ÍBÈAćÁË¿¿÷¾‡¿ŒÀæÁÃEÅ)ÇÉËÍ%Ï.Ñ9ÓHÕV×mÙ„Û¥ÝÌßýá0ä|æÄè%ëí ðò1õÕ÷™úcýE.+( 0 .$ý»7{M»„ § ðM›Æ» ’ü-óé¬Þ0ÔÊzÀç·†°Žª ¦ £ƒ¡F¡@¢-¤ò¦Iª®3²p¶Îº¿fÈǠˇÏ\ÓדÚúÝNáä›çšê†íTðó»õSøØúFýªÿü?x¡Ã Ô çâåÙÅ·•\; "ô#Ù%µ'œ)ƒ+o-e/_1f3t5’7º9ð;>>@C{E H®J]MPàR§UeX[Ÿ]ú_ b½cçde>e&dïaŽ^ßYÎSaL’C•9„.¶"n àýHò–çÞ³Õ¿Î8ÉøÄþÁÀ¿õ¾e¿TÀ Á/ÃîÄÈÆºÈ·Ê¶ÌÄÎÃÐÖÒßÔïÖÙÛ:Ý_ߎáÂãæOè®êí‹ïò©ôP÷ úÕü²ÿš“’” —Žn1» ÷we ¥ ! §1È Dþ õëµà0ÖòËDÂ|¹à±›«Ò¦ˆ£¹¡=¡¢¾£`¦˜©]­]±¤µî¹J¾ÂÀÆÖÊÊÎÒQÖáÙTݬààãçê÷ìËïò9õÕ÷XúÓü2ÿ‹Ð 6[ m €„ukS=Ý¿!š#{%Z'=)&+-/ý03 5+7L9„;É=@‡BÿDG(J×LOVRUÝWZ$]„_«ajcºdheZeldnbO_ßZUëMcE;Ã0%Üw 9‡ôžéÏß@×Ð:ʼńÂiÀD¿÷¾F¿$ÀYÁâÂ’ÄpÆUÈVÊRÌ^Î^ÐqÒuԌ֗شÚÎÜóÞáVãåâç0ê›ì ïñ$ôÊö~ùHüÿûúû ÿ öߤ?–›.= ¡ B ÿµXÂÿìÿãöí¼â9ØåÍÄ»F³¹¬¨§¤ù¡C¡Ä¡]£Ï¥ó¨˜¬–°Ì´¹p½»ÁòÅ ÊÎâјÕ4ÙªÜàBãkæoéhì=ï ò´ôX÷ÚùYü¿þ`žËñ !úÚÅ¢„`!A#%'Ý(Ê*¯,¦.™0Ÿ2¨4¾6å8;Y=¨?B€DG¢IRLOÊQ‘TRWZ£\_Dac|dTefe¬dåbý_Ö[OVkO'G›=õ2i'Hæ›Æö¶ë¨áÛØ^ÑHËŒÆÃÇÀq¿þ¾/¿õ¿Á”Â<ÄÆùÇïÉôËðÍÐÒÔÖ8ØCÚh܃޳àãâ!åjç¼é#ìîñŸóEöôø¼ûŽþseac f bJ¼#9â ” _ G5 ¶.n Ž­øöî¾ä=ÚáÏîÅʼ²´é­ˆ¨­¤J¢R¡˜¡£H¥P¨Þ«Í¯ù³E¸š¼èÀ#ÅCÉEÍ$ÑäÔ‚ØÿÛdߢâÐåÛèÖë²î€ñ0ôÕö`ùÝûIþ¢ò-c† ¢ ´ »¿³®”eG& !ß"Æ$ž&„(j*Q,E.9092D4U6{8£:ëë*îñð¯óQöâøeûÐý0Àô 9 P V[UJ8" éÎ¥ Œ"`$I&$( *ó+ä-×/×1Ý3î589:v<À>AC F HEKõM¶PxS?VøX [!^j`jbúceme e®cŸe { ÂZxh$ °/üÉò»èPÞÞÓ¹É?Àº·g°~ª¦£¡d¡_¢Q¤§mªE®T²›¶ëº=¿‚ìǸ˨ÏpÓ×§ÚÞcá–ä®ç±ê–ílð$óÒõeøæú^ý¶ÿQ…·Ï ê óøôéÚ­ŒpK -"$é%É'­)•+ƒ-w/s1x3ˆ5¤7Í9©@C’EHÀJnM,PìR´UpX[¥]ü_ b³càdhe*edÈab^«Y–S"LTCS9H.y"7Ø ¹ý+ò†çóݶÕÇÎEÉ ÅÂ0À;¿¿~¿mÀ·ÁDÃÅÝÆÉÈÈÊÆÌÍÎÖÐÞÒëÔüÖ Ù(ÛDÝgß›áÈãæWè»êí˜ïò³ôZ÷úÞü»ÿ£›–Ÿ –”h1±ÿä\H | òoïHvh 5àý¨ô´êXàßÕ¨ËÂN¹¾±‹«Ì¦£È¡V¡¢ä£„¦Ã©~­‰±Äµºi¾¬ÂàÆðÊçζÒhÖúÙiÝÁà÷ãçêíßï¡òLõç÷lúàüFÿœâJf … Œ—ŒwiK2óÍ!¯#Š%m'P)8+!-/13#577e9’;ß=.@šBEG>JãL¥O_R,UåW™Z&]‹_§afc¯dUeEeLdJb#_®ZÞT²M"E_;‚0×$¦E gôŠéÈß;×ÐDÊÐŗ„À]¿¿b¿8ÀvÁò«ÄÆhÈeÊbÌgÎrÐv҅Ԕ֣ؽÚÚÜûÞ(á^ãšåêç<ê£ìï™ñ0ôÐö‹ùPü*ÿþ õß 7Љ {  Èvsª§’ÿyö®ì]âæ×œÍÙÃíº#³¥¬¢§¤ ¢U¡ç¡}£ô¥©»¬À°î´@¹‘½ÚÁÆ&Ê&ÎøÑ³ÕIÙÀÜàYã|æ†éwìTïòÈôh÷íùküÍþ+o°Ú  -.3%îÔ´–r!S#-%'ñ(Ù*Ä,µ.­0°2º4Ó6ô8);h=¼?B–DGµIaLO×QŸT[WZ¦\_@acsdAeSedÁbÖ_ [V.OìF\=¹2-'¶u¬ö ë¡áØØfÑUËŸÆ)ÃÞÀŽ¿¿M¿ À4Á§ÂQÄ#Æ ÈÊýËÎÐÒÔ+Ö<ØRÚnÜÞ»àíâ)åtçÄé+ì™îñ©óLöÿøÀûšþxnej h dJ³$Ïðo 2 ùÅlÖ 0Løœîcäìٕϳŗ¼´Ó­¨±¤X¢h¡µ¡"£l¥w¨¬ó¯´f¸¾¼ÁDÅ[ÉcÍ9ÑÿÔ”ØÜsß»âàåïèéëÅî‘ñCôäötùìû[þ²=s• ´ Ä ÍÎǹ©wW9!ô"Ô$²&•(|*b,X.J0K2V4h6‹8¹:ú0AC F°HUKNÅP„SKVY¦[&^k`dbôcýd\eïdŒcaf]gX RIJ;4 : 5"þª+V-F S Ù/É RÑûfòbèõÝ‘ÓtÉ À·M°pª¦$£¡¡ƒ¡z¢z¤=§˜ªh®}²¼¶»\¿ ÃÈÇÔËÀωÓ5×¾Ú)Þvá¬ä¿çÆê¦í~ð9óàõwøùúiýÐÿg•Æã ö ùëÓÀ›ƒ\ ="$÷%ß'»)ª+“-‹/ƒ1Œ3—5º7Ü9<]>º@$C¡E0HÑJ}M;PûRÀUzX#[ª]ý_b©cÖdQeeàc¦a3^{Y^SèKC9 .B"® –ýòtçóÝ´ÕÔÎTÉ"Å-ÂHÀV¿)¿˜¿…ÀÎÁZÃÅìÆÝÈÔÊÕÌÚÎáÐêÒöÔ×Ù3ÛIÝußžáØãæeè¿ê&í ï#ò¼ôe÷úêüÁÿ® ž  ›“h*©ïÒD& V À7®þ# ÔƒýGôUêàŒÕdËÌÁ"¹Ÿ±y«Ê¦–£Ü¡o¡=¢¤¦¦î©¡­³±æµ:ºˆ¾ÍÂüÆ ËÿÎÑÒ~ÖÚÝÖà ä-ç+êíîïµò\õù÷|úôüUÿ­ó,X~ Ž £¤¢œŠva>'ÿã!¾#ž%'a)J+3-*/!1*3/5Q7q9ª;ð=@@­B#E®GOJôL´OmR8UñWŸZ-]Ž_£acc dEe.e,d)bó^~Z¦TvMæD;F0$q îÿLôxé¾ß<×ÐRÊäٜÀz¿(¿}¿QÀ‹Á Ã½ÄÆ}ÈoÊvÌsÎ|Ð†ÒŽÔ Ö®ØÆÚâÜß2áhã¥åñçFê¯ì ï¤ñ9ôÛö•ùYü2ÿ þÛž-tÿT è8Å%MN+ÿöHìâ×S͛üº³¬š§¤¢s¡¢¥£¦D©å¬ä°µb¹³½üÁ.ÆEÊ<ÎÒÈÕdÙÖÜ1àpãŽæé‰ìfï-òØô{÷ÿù{üáþ8…¼ñ + <AB8+þçǤˆ!_#E%')è*Ø,Ç.À0Ã2Í4æ69>;y=Ð?2B¥D3GÅIrL*OâQ°TgWZ°\_Aackd-eBeld¡b©_q[æUóN®F=x2ó&Ù‡LˆöŽëáØØiÑcË­ÆBÃòÀ«¿,¿g¿"ÀLÁ¼ÂjÄ2ÆÈÊÌÎÐÒ*Ô5ÖHØ\ÚxÜ›ÞÃà÷â5åzçÓé2ì¤î$ñµóVö ùÎûŸþ…uoo n fK® ·ÔI  Þ¹ºÌì÷7îä—ÙDÏrÅd¼e´½­t¨´¤e¢~¡Ò¡D£“¥œ¨-¬°E´‹¸á¼%ÁcÅzÉ{ÍYÑÕ²Ø,ÜŒßÐâõåéùëÚî¤ñUôùö„ùüjþÇR‚ª Ã × ÝáÖ飉iK'! #â$Ç&§(‹*y,g._0`2g4~68Î: =\?·A0D«FLIçK£N[Q!TáV•Y0\¢^Ù`»b.deGe¦d cQ`[\WfPbH ?¡4;)Eí°Ìø¤íwãwÚËÒ{̆ÇÜÃXÁÞ¿<¿U¿ù¿ÁtÂÄÛŽǯɫˮͰϺÑÄÓÎÕâ×òÙÜ.ÞWà‡âÅäç\éºë'î¦ð2óÐõ‚ø=ûþîâÖØ Ö Ïº‡.–´i¢:  !2,¥ e¬ù'ðúå Û9ÑPǾàµï®a©U¥Á¢’¡´¡ê¢¥ý§t«U¯o³½·¼WÀıȸ̚Ð]ÔØ‚ÛåÞ2âYåqèhëNîñÕósö ù…ûõýQ¡ä@ ] o {|vm[E+ ìÏ ©"‹$e&L(-*,.0ö14618c:˜<è>BA²C0FÇHbKNÏP™STVY¬[.^i`ebëcñdIeÔdlcí`6]2XÌQ J÷@¾6ˆ+¥^ûÈïdå)Ü6Ô¦ÍjÈ‚ÄÉÁÀS¿G¿Ñ¿×À(ÂÂÀÅ^ÇNÉGËHÍMÏTÑ^ÓgÕy׊٤ÛÄÝèßâPä–æäèBë«í'ð¯òLõ÷÷´úý^K@? ; ="þ¤"Ji$ ) ^ÓãÃn õlûòèÝ>Ó/ÉÏ¿d·0°^ª¦*£¶¡›¡œ¢¤b§Áª®¤²á¶4»~¿ÁÃåÇóËÙϦÓJ××Ú>Þá½äØçÕê¿íðMóòõŒøû‚ýÙÿ4p¬Ôô  ýäϯ‘p O"+$&ì'Ñ)º+¨-š/š1›3¯5Ê7ó9+Î@6C¶E@HåJMMP SÌU‰X)[³]þ_b¥cÆdBeûdÁca^FY$S¦KÖBÑ8Ê-"Ë{ nýóñ_çåݲÕÚÎ]É6Å?ÂcÀn¿C¿°¿ ÀãÁrÃ(ÅÇíÈåÊåÌèÎîÐ÷ÒÕ×$Ù8Û[Ýyß®áÞã%æoèËê1íªï-òÊôm÷+úñüÎÿ¶ª¦¦ ¢’n©ÜÆ' / l´Ò¸ w ýäóõé£ß:ÕËÁó¸~±f«Å¦£ë¡Š¡[¢,¤Î¦ªÌ­Ö±¶[º­¾íÂÇ*ËÏìÒ—Ö*Ú–Ýìà"ä>çDê.íðÅòpõ øŽúýeÿÁ@h £ °¸³¬›‰nU4 ñ!Ñ#°%'u)Z+H-;/5193G5_7‰9º;>W@½B8EÂG]J M¾O„RAUÿW©Z3]_¤aZc—d5eedbÊ^IZoT6M¦DÛ:0\$9ä Çÿ)ôdé°ß8×Ð_ÊòÅÈ®À˜¿?¿™¿hÀ¤Á ÃÑĥƌȃʂ̂ΊÐÒÔ¨Ö»ØÐÚíÜß=áoã³å÷çVê³ì/ïªñFôäöžùdü<ÿ ýߘ*qhçã. ºXú}Òù ïÊþ½õæë©á;× ÍZúܲ{¬”§!¤*¢‡¡#¢Â£C¦g© ­ ±;µ†¹×½ÂNÆaÊ[Î,ÒçÕvÙòÜDà‡ã¢æ²éœì|ï;òñô‡÷ú‹üñþN‘Óý# = KTRIA%òÚ¹“!x#O%7')ü*ê,Û.Ð0Ù2Ü4ú69M;=à?FB¹DCGÚIL;OóQ»TtW$Z·\_Aa c`d e)eQd{b€_>[±U³NnFÛ<42¶&žS"göuë„áÒØmÑl˾ÆVà ÁÁ¿H¿¿:ÀeÁЀÄGÆ-È"ÊÌ!Î#Ð*Ò6ÔCÖPØiڀܤÞÑàýâBå‚çÞé;ì°î,ñÁó_öùÖû¬þŒ€tw r hL¨¡µ) Ù©|8Ê-Zp‡÷Ùí§ã?ÙýÎ,Å4¼?´§­i¨·¤r¢”¡ñ¡e£¸¥Ä¨R¬B°i´²¸½GÁÅ—É™ÍpÑ.ÕËØAÜ¥ßââ æé ìïî´ñkô÷šùüþÓ&b“» Õ æ ñîëÝʶ–€X`4)¿ƒ¬øŒígãrÚÍÒ…Ì—ÇïÃpÁõ¿W¿m¿À%ÁŠÂ'ÄîÅÎǿɺ˽ͺÏËÑÌÓÝÕé×ýÙÜ6ÞdàâÎäçeéÅë0î±ð;óÙõŒøHûþøêÜá Ø Ôº…'¤T‡ óíöé·S¾ PùÀï¦åCÛñÐ ÇÛ½½µÐ®[©P¥Ñ¢¥¡Ñ¡£<¥!¨«{¯–³à·&¼{À©ÄÕÈÍ̸ÐtÔØ™ÛýÞDâpå‚èë]î0ñâó‰öù—ûþa¶ñ+N n ŠŽˆ|nT= üá »"›$z&\(@*-,.0 24)6D8t:­<ø>XAÂCFFÔHzK&NäP¤ScVY¶[/^m`bbácæd2e»dKcÆ` ]ûW•QÊI½@|6K+j+æùú¬ïWå Ü:Ô®ÍyÈ™ÄÛÁ7Ài¿c¿ê¿îÀ@ÂÕÔÅpÇ^ÉWËWÍZÏaÑgÓvÕט٭ÛÍÝôß!â]äžæïèLë¶í0ð»òTõø¾úŒýfVEG C :*ö¦AQ ,c–p – û§ñ çHÝìÒìÈ”¿=·°Sª¦2£Í¡±¡Á¢½¤‹§çªµ®Ê²·T»¤¿ÚÃÈ ÌöϽÓf×êÚYÞžá×äêçêêÑí£ð^óöœøûýíÿB…»æ  '+'÷Þ¢„ ^"@$&(ã)Ë+»-®/©1±3¿5Ý7:?<…>ß@JCÅETHôJŸMYPS×U”X1[¸]þ_bŸc¸d1eßd¤cXaØ]YìRkK•B”8‹-Í!•Q HýÛñOçÝݳÕãÎmÉHÅYÂyÀŠ¿Z¿Ë¿¶ÀüÁ†Ã;ÅÇÿÈòÊõÌôÎûÐÓÕ×-ÙEÛ`݉ߴáêã-æxèÔê;í²ï9òÐôw÷4úúüØÿ¼²­« ¥“jŸÏ²æ ]Ê'm}c Âüƒó—éLßèÔÕÊTÁǸ`±V«À¦¦£û¡£¡}¢L¤ö¦7ªô­ü±3¶ºÍ¾ Ã7ÇGË5ÏÓ±Ö?Ú­Ýá5äUçUêDíðÚòõøŸúýxÿÐL| ³ ÄÅŽ«|iC( "á#Â%¡'‡)m+Z-K/K1H3\5q7š9Ð;>j@ÏBIEÕGlJMÎORQUX³Z:]_£aTcˆd(eødöcÙa ^Z;TùLiDŸ:Å/'$¸ £ÿ ôTé¦ß:×%ÐmÊÆÜÂÌÀ¬¿\¿°¿‚À¹Á8ÃâĸƜȓʎ̒ΔÐÒ§Ô²ÖÅØÛÚöÜßEáyã»åè_ê¾ì4ï»ñGô÷ö¢ùpüCÿ) þÛ– fTР‹#º4…£ ’oþYõŽëLáíÖ¿Ì Ã`º¸²n¬‰§+¤5¢¤¡=¢ç£f¦Ž©6­0±`µ©¹÷½;ÂiÆ€ÊqÎJÒûÕÙÝXàœã·æÄé±ìïNòõ›÷%úžüÿ_£ã3 N ]ddYN:#éȪ!ƒ#i%@'-) +ý,ê.æ0æ2ô4 7-9a;¢=ó?YBÉDVGéI”LGORÇT}W0Z¹\"_;acVdee.d^bN_[qUN,Fž<û1x&n"üMö^ë}áÏØtÑyËÑÆjÃ&Á׿f¿–¿VÀyÁèÂÄ]Æ<È0Ê-Ì)Î2Ð7Ò>ÔOÖZØqÚÜ­ÞØà ãGåçãéHìµî;ñÅólöùàû³þ—„}{ u lJ  õ÷‰œ ¬u>ô}Ø(÷}íNãíØ³Îñļ´‘­_¨¿¤|¢¬¡ ¢†£Ý¥ê¨y¬f°Ž´Ô¸!½jÁšÅ¶É²ÍˆÑIÕÛØ]Ü·ßøâ!æ)é%ìûîÌñxô÷¨ù#üþé2u¢Ì å ö ÿûîÚǨŽjN!&# %æ&Í(¯*œ,Š.…02Ž4 6Ã8ò:0=?ßAPDÔFhIL¼N~Q:T÷V¨Y;\«^×`³bdõdendÈb`û[ªVñOéG“>#4È(ÓŽ_‹ø{íZãsÚÐҕ̧ÇćÁÀp¿ˆ¿+À;Á Â<ÄÆßÇÏÉÇËËÍÈÏÓÑÙÓåÕô× Ú!ÜBÞkà™â×äçnéÎë:î¹ðDóåõ’øSû$þòãä Ý ×¶„ €˜:mòʸ½£lf ªóøbïPåíÚ¬ÐÈÆ®½’µ¿®L©X¥Ö¢¿¡è¡.£\¥H¨Â«Ÿ¯¾³ý·L¼–ÀÊÄîÈéÌÏÐŒÔ1جÛßUâ†å•è‘ëoîAñôó™ö,ù¦ûþrÄ9_ € šŒ~cP,î Î"«$Œ&k(V*9,..0!2'486Y8ƒ:Á< ?hAÓCXFãH‹K4NóP®SqVYÀ[/^p`ZbÛcÖde¤d&c¤`Õ\ÐWWQ•I{@C6+8÷ÅÖú›ïGåÜ=Թ͎ȨÄùÁKÀ†¿}¿ÀÁUÂëæłÇmÉhËaÍjÏiÑvÓ~ՋסٷÛÖÝýß-âbäªæ÷èTëÀí7ðÅò]õ øÅú“ýp[MM D ?(óž .ï5ßÛ÷,LN½ ;­úLñEçôܡҪÈb¿·û¯Bª¦>£Þ¡Î¡Þ¢â¤±§ «Þ®ì²*·w»À¿ýà È%ÌÐÓÓ×ÛlÞµáêäýçþêãí´ðpóöªø0ûýP—Ê÷ * 999*!òÒ²• n"S$-&(ó)ß+È-Ã/º1Ã3Ò5í7:P<—>ò@ZCØEeHK¯MiP%SçU˜X=[¹]`b–c®deÈd„c/a²]ØX½R*K`BS8S-•!e( &ýÄñ?çØÝ¸ÕéÎÉXÅq“À¢¿w¿â¿ÍÀ•ÃRÅ"ÇÉËÍÿÎ Ñ ÓÕ$×6ÙQÛgݓ߼áóã7æ€èÞêBí½ï@òÛô÷=úýàÿÄ·µ« ¬‘j’Æ™úÄâ.ê"1 ¾hü#óAéõÞÔ“ÊÁ¢¸?±N«¹¦²£ ¢º¡ž¢l¤§Zª®²X¶Ÿºî¾)ÃUÇaËNÏÓÈÖVÚÀÝáIäeçlêQí,ðçò•õ,ø²ú&ýŠÿß$`‰¯  ÔÖÖ̾©‘tY4 "ñ#Ô%²'—)~+l-\/[1\3k5†7©9â;$>|@àBZEåG~J*MÝOœR\UX¹Z<]”_žaOc|deãdÕcµaw^äYTÁL.Dc:Œ/ï#Ñ ~ÿøóBé¢ß<×.Ð}ÊÆôÂãÀÇ¿w¿Ç¿œÀÏÁLÃ÷ÄËÆªÈ¥ÊšÌ ÎŸÐ©Ò²Ô»ÖÒØàÚÝ$ßKá†ã¿åèaêÌì:ïÃñTôúö°ùtüNÿ/$ þÜVB·¤ã[ìyï6L ;þÿô/ë÷àžÖzÌçÂ2º›²Y¬ˆ§.¤H¢º¡\¢ ¤‰¦´©Z­V±‚µË¹¾ZˆƗÊÎ^ÒÖ¥ÙÝqà¬ãÍæÖéÃì ïaòõ®÷4ú°üÿl¶ï#B ^ kwoqZL4ý×»!–#w%U';)+ -ý.ø0ø257A9q;µ=@jBÝDgGùI¥LWORÖT†W:Z½\%_;acHdeûdd7b(_âZAUCNòE_<¼1A&6ø Ó0öLësáÍØ}Ñ„ËçÆÃ>Áó¿}¿³¿mÀ’ÁþÂ¥ÄlÆRÈ<Ê?Ì5ÎAÐ@ÒMÔXÖfØ|ڗܶÞâàãOå›çíéOìÃî@ñÔóqö'ùèû¾þ›„ x mI –ìáu{Ý€=¬0ª°ÿÊöíòâžØfζÄλ´w­_¨¼¤’¢¾¡.¢¤£¦© ¬°±´ù¸A½ŠÁ¹ÅÒÉÌÍ£Ñ`ÕõØqÜËßã1æBé3ìïÚñŒô-÷¹ù3ü þöH€¸Ø ú  þìÖºŸ{_!9#%ø&Ý(Á*¯,š.™02¤4±6Õ8;@=”?ïAcDäFzILÐN†QKTþVµY@\­^×`­bdædeRd¦bÕ_Î[rVºO¬GT>æ3Ž(Ÿ^8nøeíQãoÚØÒžÌ¼ÇÄ£Á(À‹¿¢¿BÀVÁ³ÂRÄÆòÇßÉ×Ë×ÍÖÏßÑåÓðÕØÚ,ÜLÞsà¤âßä&çvé×ëEîÁðQóëõžøZû-þ öíè â Ø·vƒ)LÑ™‡|`­ N‹ø ïëäŸÚYÐŒÆv½oµ¥®C©Z¥ã¢Ö¡¢Q£¥p¨ç«É¯ß³'¸k¼·ÀéÄ ÉÍêЦÔFØÇÛ&ßoâ–å­è¡ë†îOñ ôªö=ùºû&þˆÑHq £ «°ªub=%ý â"¼$Ÿ&}(g*L,?.3022:4L6k8˜:Ò<?xAêCeFúH˜KHNQ¾S{V*YÆ[4^r`VbÑcÊdeŠdcy`ª\˜W QUI>@6Õ*üÈ•¶úï<åÜCÔÀ͞ȾÄÂcÀ£¿“¿ÀÁkÂĸŗÇ}ÉuËuÍqÏ|Ñ~ÓŠÕš×§ÙÅÛßÝà8âk䵿é`ëÊíDðÎòhõøÐúýxdTS J A)ó— Ù¼®Çí þÊc ÙNúäðìæ•ÜVÒaÈ,¿ç¶Ý¯7ªÿ¥K£ð¡ê¡ý¢ ¥Ô§6«¯³Q·™»á¿ Ä8ÈJÌ&ÐðÓ–×Û„ÞÊáÿäèëùíÅð†ó'öÁø>û±ýa©Û ' ; IKK<1äŤ ƒ"b$@&"(*ð+ß-Ò/Í1×3å5ÿ7.:`<­>AmCëEvHKÀMyP4SóU¤XE[¾]`þaŒc¥de³d_ca{]­XyRõJB8-W!2óý¢ñ0çÍݸÕôΊÉpҬÀ¾¿Ž¿ÿ¿äÀ-«ÃhÅ4Ç!ÉËÍÏÑÓ"Õ3×@Ù[ÛsÝŸßÂáä<æèçêLíÇïKòãôŽ÷Cúýåÿн¼´ «–f‰¶ˆÞ¦¶S©Öܲ ]üÃòÝèÞKÔHÊåÀo¸&±8«º¦·£ ¢×¡·¢š¤:§Œª>®I²{¶Çº ¿NÃqÇËiÏ7ÓÞÖoÚ×Ý-á]ä}ç}êfíAð÷ò«õ=øÅú7ýœÿò5sšÀ Õ ãéçßμ¢†jG ("$æ%Ã'«)+~-q/l1q3|5›7»9ø;6>@ôBmEøGJ;MîO¬RfU!X¿ZE]”_ŸaFcsdÿdÎd´c’aD^´YÈS†LêC :K/¯#š] Uÿ×ó,é–ß:×4ЈÊ+Æ ÃùÀä¿¿á¿¶ÀäÁdà ÅÝÆ¾È³Ê¬Ì«Î±Ð³Ò¾ÔÉÖÙØðÚ Ý/ßYáãÎåèpêÔìGïÎñ^ô÷ºùüXÿ8+! × O,£€¾+´:£äô Ù°ý˜ôÐêœàGÖ1Ì«Âþ¹~²C¬ƒ§4¤X¢Ñ¡|¢,¤¯¦Ý©­|±«µï¹;¾y¦ƸʨÎ|Ò*ÖÁÙ-ÝŒà½ãæææéÜì®ïxò"õÀ÷Hú¾ü(ÿ|É4R s {‡ƒ~n^C+ íÊ!¨#‰%h'N)2+-/ 1 35-7U9„;Ç=@|BñDwGJ´LgO!RßT•WAZÃ\*_7aýb?dídådøcbü^±ZUN´E<€1&Å ®ö6ëiáÉØƒÑË÷Æ•ÃWÁÀ—¿Ë¿ˆÀ§Á÷ĂÆaÈPÊKÌEÎNÐKÒ[Ô]Öw؂ڣܿÞìàã\å çûéXìÌîKñÜó|ö0ùòûÅþ§”Ї | oGÞÑ]ZºN ÀeÝ,HUÿeö½ì˜âFØÎxÄš»Þ³a­X¨À¤ž¢Ø¡I¢Í£$¦:©Ä¬´°Ú´¹f½ªÁ×ÅòÉäÍÂÑsÕÙ†Üäß"ãIæSéHì&ïìñ¡ô>÷ËùGü¯þ U–Åí  $ þéʲo!M#+% 'î(Ö*¿,¯.©0§2²4È6ç8;W=¢?BsDúFŠI/LßN—QVTWºYI\±^Õ`«bd×dñd8d~b¯_™[>V{OmG>¤3Q(a0RøHíDãjÚÙÒ®ÌÇÇ1ĺÁAÀ©¿¸¿_ÀkÁÌÂgÄ&ÆÈïÉèËãÍèÏçÑôÓùÕØÚ9ÜSÞ€à¬âêä/ç€éâëOîÊð\óôõ¨øeû3þüöí è Ø¹zkt2ªnS=ÍV¯î-ø§î“äFÚÐJÆC½IµŒ®9©\¥ñ¢ê¡!¢n£ª¥“¨¬í¯´J¸Ž¼×À Å#É&ÍÿÐÂÔ\ØÛÛA߀â°å»è¸ë—îeñô¾öOùËû9þ˜ã(Y ¢ ² ¾À»¯¡‡qQ2!ï"Ñ$­&“(u*b,N.G0E2J4`68§:ê<,?‘A÷C|FI«KVNQÌS†V4YÌ[9^q`PbÊc¸d÷dldåbN`|\aWèPIÿ?Â5—*Å”n‘úlï*åÜCÔÏÍ©ÈÙÄ!„À¹¿¯¿8À4Á…ÂÄÏŦÇɇË~̈́ςюӕա״ÙÍÛèÝà?âw仿 éfëÖíKð×òsõøÚú¥ýlZY M E&ñ÷Åûœ•±Ä´t }ëùŠðŒæEÜÒ%Èô¾Á¶Æ¯(ª¦Q£ ¢¢"£*¥ý§\«(¯:³s·¼»À;Ä[È`ÌAÐ Ô¨×1Û˜Þàáå%è%ë îÛð”ó=öÎøRûÁý$r·ð : K Z]YN@*ó×µ –"q$U&2(*,í-é/Ý1ê3ö58?:t<À>A€CüE‰H&KÐM†PBSþU­XN[À]`øaˆcdød’dCcã`Q]vXER´JÞAÖ7Ø,!Ëãüñ çËݸÕÿΜɃşÂÅÀØ¿ª¿ÀÁ@ÂÆÃwÅIÇ/É%ËÍÏ Ñ&Ó/Õ;×KÙdÛ}Ý¥ßÑáäJæ”èñêXíÏïWòìô•÷OúýòÿÕȾº ­–c ~ªpÅ‚ŽÍbކ[ £ûbòèDÞüÓʬÀE¸ ±&«»¦½£4¢ñ¡Ú¢¹¤f§­ªh®m²¢¶æº1¿kÃǛ˄ÏMÓúÖ‚ÚðÝBáräçê{íQðó»õNøÙúHý®ÿG‚®Î ç óû÷ðß̵–}W :"$ø%Õ'½)¡+’-‚/€1‚3‘5ª7Ñ9¡@CƒEH¥JHMP¶RzU"XÎZG]–_œa=chdîd³d–cja^€YSIL¬Cä9 /x#d0 5ÿºóéŽß;×<КÊ<Æ#ÃÁþ¿©¿þ¿ËÀÂwÃ"ÅîÆÐÈÃʺ̼κÐÁÒÉÔÕÖâØüÚÝ8ßcá•ãØå!èvêáìOï×ñiô ÷Äù‰ü]ÿE/(# Õ‡<…b•ûyùX‘ yPý7ôqêBà÷ÕçËrÂϹ`²1¬|§>¤f¢î¡š¢N¤×¦ª§­¦±Íµº^¾—ÂÇÆÑÊÅΓÒFÖÓÙJÝ›àØãöæýéíìÁï‹ò2õÕ÷WúÒü8ÿØCf Œš’’}rR? Ù!¼#š%z'^)F+/-%/1 3)5B7g9–;Ü=+@ŽBEŠGJÅLvO0RíT¡WEZÑ\"_?aïb6dÜdÌdÝcêaÑ^ZÏTÎMsEÞ;A1Ä%Α ‹ïõ%ë]áÉØ‰ÑŸËÇ®ÃmÁ)À²¿å¿¡À¿Á-ÃÍÄ“ÆtÈ`ÊYÌUÎXÐ\ÒbÔoÖ|ØÚ¬ÜÊÞöà'ãdå­çêdìÔîWñäó‰ö7ùþûËþ²› ~ rF‡Ò¾E;“Ñ‚Ñ ìôþö`ì;âõ×ÑÍ<Äj»º³N­N¨È¤¬¢ð¡h¢ë£O¦^©î¬Ü°û´B¹…½ÌÁõÅ ÊÎÙÑÕ%Ù Üõß<ãXæméVì<ïüñ´ôO÷ßùVüÄþh¦×ý  +08)% ùÝ ‚!\#A%')è*Ñ,Ã.¼0¸2Ä4Ü6÷8/;e=¹?B†D G›IBLìNªQ`TWÂYQ\´^Õ`¤bûcÈdÚdd\b~_o[VHO'GØ=`3((Þ2ø4í8ãfÚàÒ¶ÌÝÇDÄÓÁ[ÀÁ¿Õ¿vÀ‡ÁáÂ}Ä:ÆÈÊòË÷ÍðÏùÑûÓ ÖØ*Ú>ÜbÞ…à¹âóä9ç‹éëëYîÕðeóÿõ²ømû@þ ùô ë Û¸w ^dù…BЀþR‹Ë÷Cî8äíÙÄÏÆ½µy®*©a¥ü¢¢?¢‘£Ï¥¹¨=¬°5´g¸·¼öÀ)ÅDÉ>ÍÑ×ÔxØòÛUߘâÂåÒèÉë­îvñ/ôÍöcùÜûLþ¨ö9l” ± Ä ÎÒÌÀ²—„aH!!#ß$Â&¤(ˆ*u,`.[0U2`4r6’8º:ü<@?£A DFI¼KhNQÛS‘V?YÑ[?^n`Ob¿c©dádPdÃb$`N\)W­PØH¾?‚5[*†f=súQïåÜCÔÛͼÈêÄ>šÀÔ¿Ë¿RÀJÁŸÂ'Ääŷǡɒ˒͌ϓљÓÕ°×½ÙÖÛöÝàKâ€äÆæérëÝíWðáò|õ'øâú°ýŠrc] S H$ð‡ë¬áwV^w|f¬ ˆù'ð.æëÛ¹ÑÞǾ¾˜¶ª¯ª¦Z£¢¢B£Q¥!¨†«M¯e³•·á»"À[ÄyÈ{Ì^Ð ÔÅ×HÛ­Þùá$å<è8ëîíð¨óNöâøcûÓý4…É( L [ lmkbQ:&íÄ ¨"„$f&E(-*,.õ/õ1ù3 6'8O:Š<Î>,A‘CF™H7KâM•PQS V¹XS[Å]`óac‚dädyd!c»`#]AX RuJŸA“7œ,ã Ì ¼üuñçÃݼÕÏ­É–Å·ÂÝÀô¿Ä¿1ÀÁVÂÜËÅ^Ç?É5Ë)Í.Ï*Ñ6Ó6ÕI×TÙpۇݲß×áäQæ èúêbíÚï_òøôž÷Yú ýúÿÞÎÈ» ´”buš\ª^f˜à?5û ¢=ûòèêݫӼÉtÀ¸ë°«³¦Ì£B¢¢õ¢â¤‡§ÜªŠ®™²Ã¶ »S¿ŠÃ¯Ç¸ËžÏlÓ ×ŸÚÞXá‰ä¤ç¦êŽícð#óÊõføåú_ý¼ÿY’ÁÞ ú  óÜǪŒm I")$&ë'Í)·+¢-–/“1’3¦5½7æ9¯@C‘EH·JYMPÈRƒU2XÒZO]–_›a6c[dÙddscFaë]KYZSLqC9Ò.7#2 ÿžó é†ß9×EÐ¥ÊQÆ:Ã+ÁÀÿÀæÀÂÃ3ÅÇàÈÓÊÊÌÇÎÊÐÌÒ×ÔÝÖòØÛ!ÝBßlá¢ãßå,èêèì]ïÞñtô÷Íù”üfÿN53% Ö€ÿ.n?mÊ?¸ @A îüÔóêæß¡Õ¢Ë0¨¹6²%¬v§B¤}¢ÿ¡Á¢m¤§&ªÔ­É±õµ8º}¾»ÂäÆïÊáάÒaÖëÙ`ݳàìã çêþìÙï›òJõã÷múáüLÿ ê&R{ Ž £§¦£fO. ï!Ë#­%Ž'o)Y+C-5/1103>5T7x9­;ë=A@ BEG0JÖL‡O=RûT¬WQZÒ\+_6aïb(dÌdµd½cÄa¨^GZœT‹M7Eœ;þ0Œ%h ]ÔõëQáÈØÑªËÇÁÉÁAÀÍ¿þ¿»À×ÁBÃãĥƆÈoÊkÌ`ÎjÐbÒuÔtÖŠØšÚ´ÜÙÞûà5ãjåºç êmìáî\ñóóöEùüÛþ´¨–‘ … qHû¯+iô˜AÒ<z Žþ¦õúëâá׊Í÷Ã?»³>­C¨Í¤º¢¢…¢¤q¦‰©­±µj¹¥½ïÁÆ*ÊÎóѨÕ@Ù³ÜàNãqæ{éqìKïòÃôe÷íùküÓþ-|³í - :CG=4  ñÒ´!s#N%2')ú*á,Ú.È0Ñ2Ô4ï6 9@;x=Î?%BžDG³IMLO·QnT'WÊYY\´^×`›bôc´dÆdüc9bV_:[ÌUOëF—=!3Ú'ðͶøí.ã_ÚèÒÁÌìÇ]ÄèÁyÀØ¿ò¿ÀžÁûÂÄNÆ(ÈÊÌÎüÏÒÔÖØ3ÚJÜkÞ’àÁâþäCç“éùë^îåðió ö¹øyûHþ&ø ï ݹqSNçñcçÀ‹/¦õ,e÷æíÓãÙpÏÊÅÚ¼ý´]®$©`¥ £¢W¢¹£ð¥å¨a¬<°T´’¸Ö¼ÁHÅbÉ\Í6ÑôÔ‹Ø Ükß®â×åçèÞë¾îŒñ>ôåöqùðû]þ¹ G€¡ Å Ó äààÑì“wV5!#ò$×&³(Ÿ*‚,z.f0n2p4…6¥8Ï: =X?°A"DF-IÌKyN,QêS›VIYÚ[A^p`Ib¸c˜dÏd1d£bù_\óVsP™H?A5*O1Oú8ïåÜNÔÝÍÓÈúÄY°Àó¿â¿lÀfÁ²Â@ÄõÅÊDzɢˡ͚ϠѦӨս×ÇÙãÛþÝ&àRâŒäÑæéëåíaðíòƒõ4øêú»ý’|kb Z G+å†Ýñ˜ÂT(.5:ËO ¼&ùÃïÏå•Ûeћdž¾n¶“¯ ª¦d£4¢;¢b£z¥E¨°«w¯‡³À·¼FÀ{ėȘÌzÐ9Ôß×^ÛÇÞ â<åQèIë6îýð¿ó^öõøuûæýF—Ù; Z p {|qeL6÷Þ ´"›$t&Z(>*',. 02 4 688f:š<æ>:A¨CF­HIKïM¨P]SVÃXY[Ì]`ôascydÍd^dc‘`ô\ XÐQ9J\AU7Z,¨ —pšüWñÿæºÝ¾ÕϽɨÅÐÂöÀ Àà¿KÀ0ÁoÂðàÅoÇRÉBË>Í7Ï<Ñ=ÓGÕS×`ÙzےݺßãáäYæ®èëpíàïlòõ©÷cú)ýæ×ËÄ ´•`ÿk‰IŒ>9g¤ØõÝ¥ >àú›ñÇçŒÝ^ÓvÉ:Àï·Î° «³¦Ô£X¢&¢£¥´§ýª·®º²î¶,»w¿©ÃÏÇÑ˼ÏÓ,×°Ú"Þhá¢ä¶çºê¢íwð4óÝõvøùúoýÑÿ$l£Ñò  îØ» { _"8$&ù'â)È+µ-«/¡1«3´5Ô7ö9.Æ@-C¦E)HÉJgM"PÔRŽUAXÕZX]•_˜a1cKdÊddUca½]YSÌK-C_9.#öÕ äþƒóöè{ß9×NбÊhÆKÃIÁ0Àß¿3ÀþÀ1¢ÃLÅÇôÈâÊÙÌÖÎÖÐÚÒßÔîÖöØÛ%ÝOßváªãëå4èŽêïìiïæñô"÷ÕùŸüoÿSB4- Ðï#óSC— qÃìæ ¿‰üsó²é‹ßQÕYËõÁy¹²¬t§H¤Ž¢¢Ú¢˜¤"§Uªø­ð±¶Xº¥¾ØÂÇ ËûÎÉÒwÖÚtÝËàä!ç&êíëï®òZõø÷{úúüTÿºó>aŒ   ³¹¹±¤|\E "Û#Á%ž'‚)m+R-L/?1E3Q5f7Ž9¼;>R@²B)E­GAJèL”ONRU¶WZZ×\*_9aãb d¹d›d¡cœa{^Z`TTMòDb;¼0R%Y7 8µõýêDáÊØ“Ñ»Ë-ÇØÃ¡Á[Àè¿ÀÓÀïÁ[ÃôĽƔȂÊxÌoÎuÐsÒ|Ԃ֔أÚÀÜàÞá=ãvåÁçêwìëîfñýó™öNùüßþħ¢“ ‰ tCùu¶›þBÂ`†í 2-þCõšë†áI×?ͺà »p³(­>¨Ñ¤Ì¢¢¤¢5¤˜¦®©@­'±Lµ‡¹Ì½Â2ÆHÊ9ÎÒÃÕVÙËÜ'àbã†æ’é‚ìaï#òÚôt÷ú{üåþ?ŠËø! ; LWUQD2ãÇ¡!‡#^%E'$) +ù,æ.â0Þ2ë47 9S;Œ=à?9B¯D-GÀIbL OÇQ|T0WØYY\¿^Î`båc¦d®dßcb+_[•UÎN«FV=â2›'¹›ï÷í ã]ÚëÒÍÌþÇqÄÂŽÀ÷¿ ÀªÀ¶ÁçÄaÆ:È ÊÌ ÎÐ ÒÔÖ.Ø:ÚWÜsÞœàÍâåOçžéÿëkîìðtóö¾ø…ûPþ- ñ à´püCCÈÙ8箃CÜT•Íÿ÷…í{ãFÙ(ψŪ¼Ø´G®©c¥£,¢y¢×£¦ ©…¬d°{´µ¸ú¼:ÁeÅÉuÍRÑ Õ¦Ø"܀߯âêåýèðëÔî›ñUôóö†ùüpþÉZŽ· Ñ é ï÷íäÔ»¨ƒjG!'#%ç&Æ(°*˜,….0z2‡4˜6¶8ä:=i?ÆA2D¯FAIÚK‹N:Q÷S¨VSYà[F^o`Eb¬cŒd¶dd}bÒ_í[¾V7P\H=?5Þ)ç0ú ïÿäÜLÔîÍÜÈÅkÂÎÀ Àþ¿†À{ÁÌÂRÄ ÆÚÇÄɲ˭ͩϬѮӺÕÁ×ÔÙìÛÞ/à\â–ä׿,éƒëôíhð÷òŽõ;øöúÀýŸvf ] L&èzÖÝ…¤2ûùúòËrùZÈødïså=ÛÑXÇT¾G¶v¯ª¦u£E¢X¢„£›¥o¨Ô«Ÿ¯­³â·&¼hÀ™ÄµÈ´Ì“ÐWÔò×yÛÙÞ$âQåbècë@îñÇóyöùŠûõýX¨ë"L k € Ž„t_E, ð Ä"®$†&m(O*9,'.02416L8w:­<ø>NA¸C3F½HYKN´PlS#VÌXa[Ð]`îaocfd½dBdâbh`Ç\×W—QýIA7,p cGtüAñíæµÝÀÕÏÊÉÁÅáÂÁ%Àù¿fÀFÁ‡ÂIJłÇaÉTËHÍIÏDÑLÓPÕ\×mÙÛŸÝÁßîá&äeæ´è ëtíðïqòõ¯÷nú0ý ìàÏÊ ³˜\ùaz5r4i˜¨ŽH æ}úAñgç7ÝÓ2ÉÀ·´°ûª±¦Þ£h¢B¢9£&¥Ù§#«ß®ß²·Q»“¿ÌÃèÇñËÓÏÓ@×ÌÚ3Þ‚á±äÑçÊê¹í†ðHóñõˆø ûýàÿ8{µá  '-+$çÍ°Ž n"M$+&(ñ)Ú+È-º/¶1»3Ç5æ7:B<€>Ý@;C·E=H×JzM/PàRUEXãZW]š_”a(c?d¹ded:cô`”]äXêRKòB"9S.È"ê ¿þlóãèxß6×YнÊ|ÆbÃaÁJÀù¿KÀÁF¹Ã]Å(ÇÉòÊçÌãÎáÐçÒéÔ÷ÖÙÛ5ÝR߃á²ãôå>è•êýìlïõñ„ô,÷àù¥üxÿ\F=- $Òwçß:ÿhÐ1|›’ d-üóWé6ßÕ˾ÁO¹ü±¬m§T¤š¢:¢õ¢½¤E§yª®²>¶~ºÁ¾úÂÇ+ËÏäÒŒÖÚ‹ÝÝàä5ç8ê'íþï¾òpõø”úýnÿ Huš ´ ÁÍÅÅ´ kU2 "ò#Î%°'•)z+h-[/R1Y3_5|79Ð;>b@ÆB9E¿GQJøL£O]RUÂW_Zà\*_8aÜbd§d‡dc|aP^æY.TM¼D ;‡0%, šõêê=áÇØšÑÊË<ÇñøÁsÀÀ0ÀìÀÂnà ÅËÆ¨ÈÊ…ÌÎ~ÐÒ…ÔÖØ­ÚËÜéÞáGãåÊç!ê~ìõîqñô¢öWùüéþÇ´¡ ‹ qDðo¨‰øà—(ÁBœÎ ×Òýæô@ë0áûÖúÌ€ÃáºQ³­7¨Ø¤Ú¢7¢Â¢T¤½¦Ô©b­P±lµ«¹î½(ÂUÆ]ÊYÎ"ÒÛÕmÙâÜ9àxã™æ¥é–ìqï9òèôˆ÷úŽüõþQšÙ . N YjdcSC,õ׳!—#o%X'4)+-÷.ó0ñ2ü4719d; =ï?OB¼DAGÐIqL OÎQT7WáY`\½^Ñ`“bÜc—d–dÄcða_ØZdU‘NtF=¨2b'‡lkÏ÷øìãaÚïÒÙÌȃħÀÀ ÀÆÀÇÁ*÷ÄtÆLÈ.Ê'ÌÎÐÒÔ*Ö3ØIÚ\ÜÞ¡àÙâ åYç¦é ìvîòð‚óöÍø‹ûXþ7 ø ݶlð<,´º¼xGü“þ >qÿ§ö)í$ãòØæÎGÅ~¼²´4®©g¥'£B¢•¢ø£:¦2©­¬ˆ°ž´Ú¸½^Á€ÅœÉ’ÍiÑ%Õ»Ø9Ü•ßÙâæéìæî®ñfô÷•ùü€þÛ,i Ç ã ù ôäε˜yZ!6#%ö&Ú(¾*©,š.02–4ª6Ê8ô:1=|?ÖADDÃFMIïK–NLQT·VVYê[G^n`Ab¢c}d¢dûc]b¨_À[ˆVP H?Æ4£)áÎÁú ïôäÿÛRÔøÍîÈ'ņÂåÀ%ÀÀžÀ–ÁßÂjÄÆïÇÓÉÁ˾ͲϽѶÓÇÕÌ×àÙôÛÞ8àgâžäãæ1éëûítðó˜õEøÿúÉý¥‰zm ` M&âuÉÍn‡ÑÄ¿­~ žhøïåêÚÑÐÇ!¾ ¶b¯ö©¦~£Z¢u¢ £Ä¥‘¨ü«Ä¯Ò³¸I¼†À¸ÄÑÈÏÌ­ÐoÔ ØŽÛñÞ5âiåtèuëWî%ñàó„öù™ûþh¹ü2^ z “ ¢ž”…pW;ü Ú"»$š&{(c*H,<.,0,214C6_8ˆ:Â<?dAÇCGFÌHkKNÄPxS.VÕXi[Ó]`ëadcZd§d(dÃb>`\¢W^QÃIÝ@Ý6Ý+> - Rü)ñßæ°ÝÀÕ$ÏØÉÕÅûÂ*ÁAÀÀ~ÀaÁœÂÄÆÅ“ÇuÉ`Ë[ÍPÏWÑSÓ^Õg×vÙÛ¨ÝÊßùá.ämæÀèëíøïzòõ¼÷rú?ýúáØÌ µ™XóUkY÷ç1R^:ð ‰úâð çåÜÀÒóÈÍ¿œ·™°îª±¦ç£|¢^¢X£J¥ÿ§H«¯³4·t»¶¿èÃÈ ÌïϵÓY×áÚJÞ•áÉäßçáêÉí›ð[óöøû–ýíÿM‡Ëï * 9>=2(ÿÚŸ "_$>&(*ë+Û-Ì/Ê1Ì3Ü5ô7:P<˜>ê@RCÆEOHæJŒM;PòR¤UTXçZ]]œ_Ža#c1d¢dOdcÐ`g]°X°RVK²Bã8.Œ"”x ¢þJóÚèiß=×]ÐÎÊŽÆ|ÃwÁgÀÀeÀ/Á\ÂÐÃrÅ:ÇÉËóÌóÎîÐñÒøÔÿÖÙ!Û?Ý^߉áÀãûåIè êí|ïúñ’ô5÷éù­üƒÿaR?5 &ÐqÝÉ Ýñ8“ñ-H9 Ïû²òøèÜÞ±ÔÏÊ„Á¹ß±î«k§Z¤­¢O¢£Û¤p§žªH®;²f¶ ºå¾Ã?ÇDË2ÏùÒ©Ö1Ú¦Ýïà0äEçNê:íðÔòõøŸúý}ÿÖX‡ª Å ÔÚÞÏʯŸ€dD #"$ä%Á'§)Ž+x-q/b1l3s5Ž7±9ã;$>x@×BKEÒGaJ M²OkRUÎWhZä\._3aØbd•dndbcUa#^·YîSáLuDâ:C0Ú$ðÜ ê}õÔê3áÄØ¢ÑÒËSÇÄÒÁÀÀMÀÁ!ƒÃ"ÅÞÆ»È Ê—̌ΎЌҒԛ֦ػÚÔÜòÞáLãŒåÕç'êìûî~ñ ô°ö^ù#üñþѺ«Ÿ tBíetá¿ôfñ~ùJv vtýôãêÓà¦Ö°ÌEëº4³ý¬4¨Û¤ë¢N¢ß¢y¤â¦ù©Ž­r±˜µË¹¾GÂuÆ|ÊsÎ?ÒôÕ„ÙúÜPàã¬æ»é¨ì…ïLòûô›÷%úžüÿb®êB [ rs|oiQ@" æÉ!¥#…%f'I)0+- /135%7E9w;³=@`BÑDRGáI„L-OáQ—THWåYl\»^Ô`ŒbÓcƒdƒd¢cÐaÕ^¨Z*UUN4FÖØUÚfÜŠÞ¯àßâå_ç²éì~îñŠó*öÖø•ûdþ=) ý Þºbï,Ÿ˜ñŠA ²C¦ ßÿAöÊìÅâØ—ÎÅH¼Ž´® ©i¥6£V¢´¢¤c¦V©Ö¬°°Å´ÿ¸;½}Á¢Å¼É©Í‹Ñ8ÕÛØKܱßëâæ éìöîÅñxô÷«ù"ü”þí=zµÒ ü õáŬŠl!J#'% 'é(Ô*»,¬.¤0 2¬4»6Þ8;H=‹?îARD×F`IÿK©NWQT¿VdYï[J^n`=b—cnd‹dàc9b_Ž[QVÆOÞGÁ>ƒ4e)¨™•íùòîâäüÛRÔÎÿÈ9ÅŸÂþÀ=À4À´À²Áò‚Ä/ÆÈäÉÔËÆÍÈÏÃÑÊÓÌÕÛ×êÙÿÛÞ@àsâ§äîæ<é˜ëî}ð ó¡õOø ûÔý¬•}x a R$âk¿½Ukç¥~g,ÊA›ø¡î¼ä‘ÚÐÖÆé½ùµF¯ì©¦‹£p¢¢Ç£ã¥½¨#¬ì¯ù³,¸k¼©ÀÙÄïÈíÌÈЈÔ$اÛßPâyåŽè‡ëmî9ñóó™ö(ù­ûþzËDo ¡ ±±²¥—ƒgO.!ï"Ë$°&Œ(v*\,L.B0>2F4T6t8›:Ô<?pAáCTFãHzK#NÒPˆS:VáXq[Ö] `äa]cKd’ddŸb`k\lW%Q€IŸ@–6¡+þùï-ü ñÍæ§ÝÂÕ)ÏéÉåÅÃCÁ[À+À›ÀvÁ·Â/ÄÜŨǃÉsËfÍcÏaÑcÓhÕsٕׄ۳ÝÕßâ;äxæÈè ëŒíþï‹òõÈ÷|úGýþîÜÑ »—VïI\ :×¹Ðï è“ &¾ù|ð¬æŠÜmÒ­È”¿o·}°Þª°¦î£“¢t¢}£m¥&¨u«*¯/³Z·—»Û¿Ä(È'Ì ÐÍÓv×öÚdÞªááäóçøêÛí°ðnóö®ø-û¦ý[ŸÖ % < LPLJ3'õε "p$R&0(*ÿ+ê-ã/Ú1â3ì5 8.:f<«>û@gCÙEaHøJœMMPþRµU[XòZb]_Žac'dd:dòb«`5]}XvRKpB¡8Ô-P"YK uþ1ó¾ècß:×`ÐàʜƒÒÁ{À1À{ÀJÁtÂäÉÅJÇ)ÉËÍÏúÐÓÕ×Ù0ÛGÝjß•áÈãæRèªêíƒïò›ô>÷öù³üÿg[F< $ÊnÔ÷·½È\ªæôß ¨iûUò—è…Þ`ÔˆÊKÁñ¸Â±Þ«h§b¤¿¢i¢8£¥“§Êªk®f²ˆ¶Åº¿:Ã\ÇdËKÏÓ¿ÖKÚºÝ áDäZçcêMí$ðçò‘õ,øµú)ý’ÿä0j˜¾ Ô çëìåÖǬ•sW 5"$ô%Õ'¸)¢+Š-/x1{3Š57Ç9ó;:>‰@êB_EâGuJMÂOxR-UÔWuZå\3_/aÓbùc„dUdCc/aö]ƒY¸S£L7D¢:0›$¼¦ Ç\õ¾ê)áÁØ©ÑÞËdÇÄêÁ©À5ÀgÀÁ9™Ã5ÅóÆÉȵʢÌΘЛÒÔ¨Ö°ØÉÚÚÜß&áXã™åÙç9êì ïñô¶öjù+üúþÚÁ³¤ • rCå_ŒdÆŸÌ6¸?­ú ýôƒêxàUÖfÌú³ì¬,¨â¤ø¢j¢û¢¤§!ªµ­š±¼µñ¹4¾kÂÆžÊ‰Î]Ò ÖœÙÝdà¦ãÂæÏé»ìœïZòõ©÷9ú°üÿs¿û-T m ‰‰†uhN8øÛ!¶#™%v'\)B+--/13"587W9‰;Ç=@tBâDcGôI“L=OñQ¢TSWïYo\Á^Ñ`…bÉcrdkdˆc§a®^tZóTNñE™<'2ç& ‘÷ÈìúâWÚøÒñÌ2ȰÄKÂÛÀFÀTÀ÷ÀùÁUÃáÄÆmÈSÊDÌ8Î7Ð4Ò8Ô@ÖLØ[Úuܑ޹àêâ#ålçºéì‰î ñ’ó6öÛø£ûhþJ+  à¶aâ#‰vÍ[ ÈjõL †¯þãõkìlâIØNÎËļn´®©n¥A£r¢Í¢>¤…¦€©ú¬Ù°è´%¹^½›ÁÅÅÒÉÎÍÑXÕìØfÜÅßã)æ:é)ìïÒñŒô)÷¼ù5ü¥þþPŒÂé  (#&ò×½›!X#>%'ÿ(ã*Ï,¾.µ0´2»4Ð6î8;T=¢?üAgDçFqIL·NhQTÌVmYò[R^i`:bŒc^dwdÃcbU_^[VŠO¢Gƒ>E4*)qimËùÝîÓäûÛSÔÎ ÉRŲÂÁWÀLÀÑÀÃÁÓÄEÆÈóÉâË×ÍÓÏÏÑÖÓ×Õæ×óÙ Ü(ÞJà}â°äøæEé£ëî‡ðó¬õXøûÞýµ™ˆy i P%Úg°­@MÄyXE ßxäC¤÷Hî^äCÚ4Йƶ½Öµ-¯å©¦›£‚¢­¢ç£¦ã¨I¬° ´N¸¼ÊÀöÄÉÍâТÔ:Ø¿Ûßdâå¡èšë€îKñôªö;ù½û+þŒÛ Sƒ š ¹ ¼ÆÁ¶¨’{^A!ÿ"ß$½&£(…*o,_.R0T2S4l6‚8±:åAvCëEtH K«M\P SÂUcXûZd]ž_Œacdwd dÒb†`]MX ,ÊfËç¥æžÓ#e› … I ûõñ9è,ÞÔAÊÁƸ¥±Í«f§k¤Ð¢…¢U£&¥º§îª”®²ª¶íº$¿[Ã{Ç}ËiÏ.ÓÙÖaÚÒÝáVärçuêbí9ðöò§õ<øÈú:ý£ÿ÷@|¨Ð æ öþþõêÔÁ£ˆf G"'$&è'É)µ+œ-”/‹1Ž3œ5±7×9 š@CmEöG†J(MÔO‡R7UãWxZî\3_-aÌbìctd;d$c aÉ]OY‚ScLúCb:Ä/c$…y ¡<õ°êáÃØ«ÑïËtÇ2ÄÂÄÀMÀƒÀ6ÁL³ÃHÅÇßȿʶ̩ΦЦҪԱֿØÏÚèÜ ß0ádãŸåéç=êžìïñ"ôÂörù4üÿáʹ© – w<æQN°}¥€üd¨ À®üÂó!ê àÖÌÍÂOºñ²Ù¬(¨æ¤ £¢£Á¤-§IªÛ­Â±áµºW¾‰Â°Æ¹Ê¦ÎwÒ#Ö¶Ù(Ý}à¸ãÙæáéÒì­ïoò%õ»÷Nú¾ü0ÿ‚Ò @b ‚ ˜–ŠtfA0 ï!Ç#«%‰'m)U+>-4/&1.325L7j9;Ø=+@‚BùDqG J¡LOOýQ±T^WöYw\Â^Ð`b¼cbdSdkcƒa€^DZ»TßMµEV<ë1¨&àÚìu÷®ìðâRÚÿÒùÌGÈÀÄiÂðÀ`ÀqÀ ÁÂhÃøÄ°ÆÈdÊSÌFÎEÐAÒEÔKÖVØfڀܛÞÅàñâ0årçÇé'ì’îñžó;öìø§ûuþO5#  â´\Üøk\¢.Ö„'Ÿù )Mþ‡õìâð×΋Äç»J´ð­ù¨t¥O£Š¢ì¢_¤¬¦¥©%­ý°µG¹€½¾ÁáÅôÉæÍºÑoÕÙ~ÜÙßã?æLéAì!ïçñŸô=÷ÌùJü´þ_žÕø  )775(ë̯!n#M%-')ö*â,Ñ.Ç0È2Î4â69-;i=µ? B~DôF†ILÉNvQ*TÕVxYø[T^j`3b„cKdad©cða0_([êUNOdGC>4í(96EªùÅîÈäóÛ]ÔÎ ÉdÅÍÂ2ÁuÀdÀëÀÝÁ$ëÄVÆ&ÈÊðËèÍÞÏàÑßÓåÕñ×ýÙÜ0ÞVà†â¼äÿæRé¬ëî“ðó¸õbøûæý¿ ‘{ o Q%Ö^£ž$3›K#ÜŒ#…äÿA÷çíäëÙçÏYƽ®µ¯Ô© ¦¡£¢Æ¢ ¤,¦ ©p¬9°G´q¸µ¼èÀÅ*É&ÍüлÔRØÕÛ4ßxâ¥åµè°ë“î`ñôÀöLùÑû>þœï1f’ ° Å ÑØÏ͵¨ŠqR2!#ó$Î&·(•*…,o.g0d2j4{6—8Ä:ø$AˆCýE†HK¿MiPSÍUnX[i] _„a c dfdd²b\`Ú\XR JòA"8\-Ü!óó /þûò¡èPß@×rÐýÊÄÆÀÃÄÁ±ÀeÀ¯À}Á ÂÄ®ÅsÇJÉ1Ë$ÍÏÑÓÕ!×0ÙDÛ\Ý|ß«áÙãædè½ê$í–ïò¬ôS÷úËüÿ{fSC .É]Á×ÏvuŸå#NL, èªú’ñÝçÒÝÁÓþÉÖÀŸ¸‚±Ã«_§u¤á¢Ÿ¢v£H¥â§«½®²²Ó¶ »I¿{ÙǛ˂ÏIÓñÖ{ÚçÝ7ájä‰çˆêvíKð ó¹õQøØúNý³ÿ TŒ»ß ø  üçѶ™x ["6$&÷'Þ)Å+±-¦/œ1¢3®5Å7é9<]>­@C€EH–J9MãO“RFUéW…Zï\6_)aÅbác]d'dcæ`œ]YLS%L½C :ˆ/'$OL w&õ•êá¾Ø¶ÑûˇÇGÄÂÝÀiÀœÀNÁfÂÉÃ\ÅÇíÈÓÊÄ̶ζаҹԻÖËØ×ÚöÜ ß@áiã¬åïçJê¦ìï›ñ)ôÐöxùAü ÿêÓ¼± — v>ÚMn<“\}ÒH·Rm _PüaóÂéÉ߯ÕÙË’Â ºÒ²Æ¬#¨î¤£˜¢>£Þ¤Y§lª®ç±¶;ºw¾­ÂÎÆÖÊÄÎÒAÖËÙ@Ý“àÏãíæ÷éãìÃïò7õÏ÷[úÖü<ÿ˜áQu ’  ®©©—‹rZ; ú!ß#¸%Ÿ'})i+Q-E/;1>3F5^7~9¯;ë=;@˜BE‰GJ·L[O R½TfWZw\È^Ë`{b°cPdÇ3°(‰ù­îºäíÛaÔ Î3ÉvÅéÂFÁ“À|ÀÁõÁ<þÄmÆ6ÈÊÌóÍðÏêÑìÓòÕø×ÚÜAÞ]à’âÆä çYé¹ë!îžð'óÁõlø$ûñýŬ”„ q U!ÕU™‰wîÔ?È .~ÿäö„í§ã–ÙšÏÆN½‡µ¯Ê©¦¯£°¢å¢)¤U¦.©œ¬]°p´•¸×¼ Á5ÅKÉ>ÍÑÔÔlØíÛJߎâ¼åÉèÆë¤îuñ)ôÑö`ùàûRþ­Ax¢ Â × ãçäÚ˶ž‚dD!##%á&Ç(ª*•,….w0y2z4‘6¨8×: =T?®ADFI®KSNþP°S]VþX‚[æ]`Üa=c"dQdÀc4b _Ù[ÏVuPÈHà?Ø5ê*PdhÌû¼ð£æ’ÝÉÕIÏÊ$ÆXÃÁ­ÀxÀéÀ¿ÁýÂpÄÆßǷɣ˒͌χшӌՓףٶÛÑÝôßâXä˜æåè>ë©íð¨ò:õä÷šú`ý8íÞ ¿˜IÙ))Çäi73;?'å† šø`ï•å‰Û…ÑåÇô¾÷¶.°¸ª°¦¤Î¢Ç¢ß£Ú¥š¨è« ¯¢³Æ·¼:ÀkÄÈ}Ì\ÐÔ¼×?Û¦Þìáå4è/ëîèð¥óMöãødûÚý9ŽÔ : X p ‚„xkX@&ê Ã"ª$‚&l(J*8,".024(6@8i:<á>6AšCF˜H*KÍMxP(SÖU}X[t]™_…aÿbücTdèc’b5`¬\áWÌQaJ´Aå7-£!ÁÅ þáòèKß=×~Ð ËÚÆÖÃÝÁËÀ~ÀÊÀ“ÁºÂ&ÄÃÅ…Ç\ÉBË2Í)Ï#Ñ%Ó$Õ0×8ÙOÛdÝŠß°áèã#ærèÅê/íŸï&ò¶ô]÷úÑü§ÿmWI -ÄU¹Ä{°UHo¦åûÿÎ ŒIú3ñç|ÝrӷɤÀp¸j±°«a§|¤ö¢¸¢–£l¥ ¨9«é®Ñ²ÿ¶+»n¿›Ã´ÇºËœÏcÓ ×ŽÚÞHá…ä˜çŸê‰í^ðóÉõdøêú_ýÅÿb Ëñ   ÷䯫‹ l"H$+& (ñ)Õ+Æ-´/³1´3¿5Ú7ú92Ä@ C–EH©JGMôOžRTUóW‰Zø\3_+a¸bÖcKd dåb¼`o]êXSëK|Câ9I/î# Q õ…êá¿Ø¼Ñ ̘ÇbÄ/ÂûÀ‚À¸ÀfÁÂÞÃrÅ.ÇÿÈäÊÑÌÇÎÀÐÀÒÀÔÊÖÑØæÚýÜßFávã²åýçNê´ì$ï£ñ7ôÓö‡ùFüÿñׯ° t;ÕB`&{7U  wÎ ðûþòeépß[Õ•ËSÂ÷¹²²²¬#¨ð¤1£®¢^£¥~§•ª*®²+¶_ºš¾ÌÂìÆóÊàΨÒXÖåÙVݪàããç êûìÒï–òIõá÷núèüMÿ©ó.e„ ¥ ²½¿·¬›ƒlM0 "î#Ï%«'•)w+e-W/O1N3^5k7–9¿;>L@¬BEšG(JÄLmORËTrWZ‚\Ã^Ð`ob§c=d$d-c8a+^ÞYMTgM7EÙ;k12&sv¢2÷Šì×âMÚ ÓÍkÈïÄ”Â*Á‘À¥ÀBÁAšÃÅØÆ¤È„ÊrÌdÎ^Ð\Ò\ÔcÖlØ~ڒܲÞ×àãAå‰çÙé;ì§î&ñ±óQöýø¹ûˆþ\I,"  è­TÇ÷Ó6PÏcD rŠýÄôHë\áP×pÍă»´Å­ï¨u¥u£°¢/£ ¤ú¦ñ©u­J±^µ¹Ê½ùÁ&Æ(Ê"ÎìÑ¢Õ7Ù«ÜàEãiæsélìDïòÃôa÷ôùjüÛþ4‚Ãô : NZX[I=% òѳ!#r%Q'6)+-ó.ï0ë2õ4 7%9W;Œ=Û?3BŸDG¦IBLæN•QBTîVˆY\W^l`"btc'd6dic­aÖ^ÊZzU×NèFÂ=†3u(Å×îjù—î­äëÛcÔ-ÎAÉÅüÂfÁ¨À™ÀÁ ÂSÃÕÄ~ÆLÈ%ÊÌÎûÏùÑöÓþÕØÚ-ÜCÞmà™âÐäçcéÂë,î¥ð2óÇõwø,ûùýϰœ‰ t U"ÍOŠyõôPî·„Kñq Óÿ†ö"íOã>ÙRÏÚŽjµã®Ç©¦¾£Æ¢£J¤y¦W©À¬Š°‘´¼¸ø¼-ÁVÅeÉ]Í2ÑïÔ„ØÜaߤâÏåÞèÚë¸î‡ñ>ôàöwùîûgþ½Sг Ô ç õ÷öëÛÉ®”yR!9#%ù&Õ(¾*§,•.Œ0‰24¢6½8æ:!=c?ÂA"D¢F#IÁK_NQºSlVY‹[æ]`Öa4cdJA¬C"FªH9KàM„P8SâU„X[q] _~aøbîc@dÎcrb `€\«W’Q#JsA¥7Ý,i!Š— éýÄòèAß?ׄÐËïÆéÃùÁäÀ˜ÀäÀ«ÁÓÂ<ÄÛÅ•ÇqÉMËFÍ3Ï3Ñ/Ó3Õ8×GÙWÛqݓߺáóã-æ{èÑê6í¬ï.òÁôf÷úÛü¯ÿ‹s`J 2ÀRª·d”3=j ®«s 1åùÓð!ç%Ý"ÓsÉjÀE¸N±¡«]§„¤ £Ï¢¹£Ž¥0¨c« ¯þ²·V»‹¿½ÃÔÇÕ˹Ï}Ó#׫ÚÞcá–ä°ç²êžípð2óÝõvøýúoýÙÿ,v¯ß  (5.,ñܸ¡ z"_$:&(*é+Ö-Ê/Ã1Ç3Ò5ë7:C<‚>Õ@3C©E(H»JXMP°R\UXZý\6_%aµbÅc;dòcÄb—`B]µXØR¯K=C 9/°#åð +ëôtêá¿ØÂÑÌ®ÇsÄNÂÁžÀÑÀ~Á˜ÂòÈÅ?ÇÉðÊæÌÑÎÑÐÉÒÐÔÏÖäØéÚ Ý%ßOáƒãºåèWêÀì,ï¯ñ?ôÞö’ùNüÿùáɹ œ x7Ñ7R^*oÒ6€´µ ¨Žûò éßÕKËÂɹ’²¥¬¨ÿ¤:£Í¢w£+¥ž§ÀªO®8²O¶…º¹¾ñÂÇË÷ÎÅÒpÖüÙnÝ¿àûãç ê íéï¨ò\õô÷‚úõüeÿ¶ >v— ´ ÅÍÒŧšya? !"ÿ#à%¿'§)ˆ+y-h/a1c3k5…7£9Ö;>b@»B.E©G;JÓL~O(R×T}WZ†\È^É`lb˜c.d d caû]¯YT/MöD›;*1ù%<Gy÷uìÌâLÚ Ó$ÍuÈ ÅªÂBÁ±À¹À^ÁX¯Ã7ÅéÆ¶È”ÊÌsÎkÐhÒiÔnÖx؇ڞܻÞãàãLå’çäéEì±î0ñºó[öùÆûŽþhK6" èªQ»ë¿ü,-ÃI°ï -ýdôéêáþÖ&ÍÙÃR»æ³³­ä¨¥€£Ë¢K£Â¤ §ªœ­p±…µ°¹í½ÂBÆIÊ;ÎÒ¼ÕNÙÃÜàZã}æ‹ézì^ïòØôt÷úüèþH“Ô/ L _jlh^J;ãÃ!¤#ƒ%d'G)-+-/ÿ0ÿ257;9d;£=ê?HB°D.G¶IRLöN¢QPTùVY\W^l`bgcddNcŠa¬^œZEUN­Fƒ=I39(‘¤ÉIù‚îŸäèÛfÔ9ÎQÉ¢ÅÃÁÀÀ¶À2Á*ÂfÃìÄ‘Æ\È8ÊÌÎÐÒÔÖØÚ4ÜRÞpà¦â×ä!çkéËë7î¯ð;óÓõ€ø5ûþÓº¡ y T!ÉF~gÜ×)ÃI£ vÃþ$öÇìõâíØ ÏšÅé¼DµÐ®¼©¦Ì£Ü¢£m¤œ¦|©é¬¬°¹´à¸½NÁuÅ‚ÉxÍMÑÕŸØÜxß¹âäåñèíëËî›ñOôôö…ùüuþÐ#ešÇ á ü  ýîØÂ¥…j!D#(%'ê(Î*º,§.ž0›2£4²6Ñ8ù:2=z?ÎAÑ;Ó@ÕB×QÙbÛzÝžßÄáûã9æ‚èÝê?í¶ï8òÊôq÷ úçü³ÿ–wfP 0¼J¡¥Pxó3XhT Ò‰ùtðÇæÎÜ×Ò1É3À¸3±“«]§¤£ì¢Ö£³¥T¨‰«5¯ ³E·u»°¿ÙÃóÇòËÑϘÓ:×ÁÚ,Þwá«äÆçÄê³í‚ðFóîõˆøûýëÿ:‹½ñ , <CA;.ì˰ "m$N&-(*ø+í-Ö/Ú1Ö3è5ü7%:Q<—>å@GC¸E;HÉJlM P¿RhU X˜Z]6_"a­b¹c)dÕc¦bo`]‚X¢RrKþBf9Ì.{#® Ïô`êúà¼ØËÑ#̽ÇÄaÂ.Á¶ÀéÀ—Á°ÂÄžÅRÇ#ÉËíÌåÎÙÐÚÒØÔÝÖëØøÚÝ/ß[á‡ãËå èhêÃì8ï¹ñFôêö˜ùXü'ÿæÐ¼ Ÿ w4Ê,CýCùÿA–ö8`c I1ûBòªèÃÞ¿ÔËåÁ¹u²•¬¨¥N£ã¢—£L¥Ç§âªz®Y²v¶¥ºÝ¾ Ã(Ç.ËÏÝÒ‰ÖÚ„ÝÕàä,ç1ê#íõïÁòhõ øú ýqÿÌTƒ« Á ÙÝàÜËÀ¥qR 0"$î%Ô'¶)+ˆ-~/n1z3z5˜7¶9æ;%>p@ÑB ] p{}yn^H.ó×!³#”%u'X)@+)-/135-7M9x;³=ÿ?WBÃD?GÇIcLO°Q]TWšY\]^g`bXc dd4cca„^jZUcNoFG= 3(X{›3ùgî™äâÛnÔEÎbɹÅ+ØÁÜÀÌÀQÁ=ÂÃÿÄ¥ÆqÈFÊ0Ì!ÎÐÒÔÖØ*Ú?ÜYÞàªâçä%çzéÐëDî¶ðGóÚõ‰ø?û þß¿¨ | S"Á=pRƶ–F »SÈ fþÃõlì™âœØÁÎ[Å»¼µ½®´©¦Û£ï¢>£Œ¤Ä¦¡©­Ô°Ý´¹;½oÁ’šɒÍhÑÕµØ0ÜŽßÏâùåéÿëáî«ñeô÷›ùüˆþà6t®Õ ö  ëѸ˜y!X#9%'û(â*Ê,º.°0®2´4Ç6á8 ;B=?áAJDÄFFIáK€N)QÚS{VY“[ð]`ÍacòcdlcÌa'_I[3VÆOH%?56*«Ëòaû|ðsæ‡ÝÏÕjÏCÊcÆÃÜÁøÀÉÀ2Á Â?ñÄTÆÈëÉÓ˼ͷϬѭӭշ×ÀÙØÛíÝà=ât䵿éZëÈí8ðÆòVõøµú{ýN. â ÊŽC½ô‚Œù³‘…m<ê uðÿ|÷Bîƒä‹Ú¢Ð$ÇW¾„¶ä¯–ª±¦5¤££=¤I¦ ©_¬°´4¸m¼œÀÊÄ×ÈÑÌ­ÐeÔ؃ÛèÞ1âYåtèjëTî"ñÛó‡öùû þmÄ@j ¢ ´¶·¬Ÿr\8 !ú"Ü$½&œ(…*j,\.M0M2O4_6y8¡:Ò<?jAÓCFFÈH_KûM¤PQSøU–X[w]¡_uaæbÑcd—c2b¸_%\CW Q¬Iö@)7g,ö '@ ¤ý“ò]è6ßB×—Ð6ËÇÄ*ÂÁÌÀÁÜÁÃhÄƼǑÉqËaÍPÏMÑEÓLÕM×\ÙmۄݧßÏáäAæŽèãêKí½ïBòÔôy÷*úðü»ÿœkS 3¹B”–8[ìÆÕöÆq-ùðlæ{܆ÒóÈú¿ú·±Š«Y§š¤/££ø£Õ¥{¨°«[¯F³i·˜»Ñ¿ùÃÈ ÌíϲÓQ×ÜÚ=Þ‘á¾äÚçÛêÂí™ðWóöšø!û’ýýÿM™Ñ $ = MRWHC+ýÝ Ÿ"€$^&B($*,ù-ï/ç1ì3÷583:g<¦>ø@ZCÉELHÛJvM PÊRsUXZ]5_ a¡b®cd¿c„bJ`é\RXhR;KÀB*9“.@#– èÿ¶ôRêôàÀØÕÑ2ÌÕÇ ÄÂCÁÕÀÁ´ÁÂÂ!įÅeÇ4ÉËÿÌîÎêÐãÒãÔìÖïØÛÝ<ßaá“ãÓåèqêÍìBïÁñQôðö£ù_ü/ÿìÔÀ   x.Å5æ)Ó× `®ñ  îÏúåñMèkÞqÔÆÊ©Áx¹S²Š¬¨ ¥a£û¢¹£m¥ë§ «ž®²›¶Æº¿*ÃHÇHË0ÏöÒ¡Ö*ÚšÝêà#ä@çDê7í ðÑòõø¤úý„ÿÝ(b—¸ Ö èîóêà͸…` E""$&æ'Æ)±+š-Œ/‰1‚3—5£7Ì9ö;7>ƒ@áBQEÊG]JñL›ODRíT’WZ\Ê^Ä`]bcdÜcÑbË`¨]KYªS·LD;¶0‡%Óñ +åöMì½âHÚ Ó:Í È2ÅÝÂwÁáÀóÀŒÁŠÂÚÃ_ÅÇØÈ·ÊœÌ‘Î„Ð€ÒÔƒÖØœÚ±ÜÐÞôà%ã^å¥çõéWìÃîCñÍólöùÒû¢þs^=- ç¥D§Ñ‘ð¶Ý>»C¶B ^qü¦ó3êUà_ÖœÌdÃúº¥³‘­Ø¨‹¥ž£ý¢£¥c§jªæ­¾±Ìµù¹-¾^ÂzÆ…ÊnÎ=ÒíÕ{ÙòÜGà„ã§æ±é£ìïEòüô—÷(ú¡ü ÿj´ø(R m ‚‹‰€n\>( ê!Ä#§%‡'i)R+<-+/%1#3*5C7[9Ž;Ä=@iB×DMGÞImLO¼QiTWžY\^^d`bMc÷còccCaU^=Z×T,N0F =Ñ2Á'+C}ùUîäâÛrÔSÎsÉÐÅEòÁöÀéÀiÁW•ßƂÈXÊ?Ì0Î ÐÒÔ!Ö'Ø3ÚHÜdÞˆà·âîä/çƒéÜëKîÂðNóäõ’øHûþæÆ®– } U¾3a@«—ÛcÇup ÃþiõìEâHØyÎżù´¬®¨©¦æ£ £W£²¤æ¦É©6­ù°µ'¹_½Á°Å¿É¬ÍƒÑ8ÕËØKÜŸßèâ æéìóî¾ñuô÷©ù(ü–þõDˆ½æ  &-(üâʧ!h#J%,' )ø*Ù,Î.Á0À2È4×6ö8;V=ž?óA\DÒF[IîKN9QâS‰VYœ[ï]`ÅacãcùcRc¨a_[ÿUOØGé>â4þ)u£ÅKûcðkæ…ÝÔÕwÏTÊ{ƲÃúÁÁèÀGÁ&ÂTÃÇÄgÆ(ÈûÉàËÎͿϽѴӻտ×ÍÙÞÛùÝàGâ}ä¿æ égëËíFðÉòcõø¾ú„ýT3 ê Ä‘8¸÷âjnÒˆ[H)íš –ÿ÷çí-ä9Ú[ÐæÆ(¾`¶Ï¯‹ª·¦<¤"£6£_¤m¦0©„¬:°9´V¸¼»ÀèÄôÈìÌÅЀÔØ›ÛþÞDâqå„è€ëdî6ñîó•ö,ùªû þÓSx ¡ ± ÃÉÄÀ¯…jN,!#é$Ñ&­(—*},l.b0\2a4q6Œ8°:ê<(?€AáCVFÚHlK N±P\SVX#[z] _oaÝbÂcdc b–_ô[WéPqIÀ@ë61, ù †ý|òVè/ßJ× ÐHË)Ç2ÄBÂ3ÁçÀ/Á÷ÁÃ~ÄÆÍÇ¢É~ËpÍ\ÏYÑSÓSÕ[×eÙuÛÝ¯ßØáäIæ˜èëêUíÅïKòÝô€÷3úõüÅÿ ‡kX 2³:…‡CÄ¢·ÔͱkÌø»ïæ'Ü@Ò³Èʿҷ±z«_§¡¤D£ £¤ù¥Ÿ¨×«¯m³‹·º»ï¿Ä.È&Ì ÐÅÓl×ðÚUÞ¥áÓäìçíêÖí©ðióö¨ø4û£ý ^©á 4 L _ag[Q>&ïÓ ¯"‘$p&S(7*, .0ú1ü3 6 8H:v<º> AlCÙE]HèJŠM*PØR}UX¢Z ]5_a›bcd¢chb!`¿\X3RKˆBé8]. #Oq Äÿ¡ôBêïàÁØßÑAÌçǻēÂcÁêÀÁÉÁÛÂ5ÄÅÅwÇEÉ#Ë ÍÿÎòÐóÒëÔøÖûØÛ#ÝFßiážãÙå èwêÙìJïÈñ]ô÷ö¬ùjü3ÿðÛ ¢ w*¾%Ñ °­Û$n¥»³ ’uúƒñùçÞ+ÔÊwÁJ¹=²u¬¨¥q££Ô£‘¥¨.«È®£²Â¶çº"¿JÃcÇgËFÏÓµÖCÚ¯Ýÿà9äRç[êEí ðáòõ+ø¶ú+ý—ÿë:t¦Ë æ øÿìãÆ²‘v S"5$&÷'Ø)Ä+«- /—1š3¤5¹7Ý9”@ôB_EßGiJM§OQRûT™W(Z‘\Ì^Á`UbtcõcÆc°b§`z]YsS|LDDà:z0M% Ä Èö;ì´âHÚ'ÓFÍ´ÈFÅøÂÁüÀ Á£Á¤ÂïÃwÅ ÇìÈÆÊ­ÌÎ’ÐŒÒÔ֙ؤڼÜÙÞýà2ãdå±çþé`ìÐîIñÚósö"ùÝû¨þ~`D0  ç¤9¢½€Ô•¶ †ÿpÀë üLóÕéàÖZÌ(ÃѺ„³­Ó¨”¥­££Ÿ£/¥‰§Žª®ã±ñµºN¾~šƟʊÎWÒÖ–ÙÝ_à˜ã»æÆé´ì–ïVòõª÷8ú´üÿzÈ=^  œžŽkP9 û!Ö#·%š'z)f+K-@/5153>5Q7q9ž;Ö=$@{BæDbGéI‚L#OÊQvTW©Y\_^c` bAcêcÖcúba.^ Z¤TñMöEÊ<”2Š'óVòøBîäÞÛzÔ]ΆÉãÅ^ÃÉÁÁÁƒÁn¬Ã)ÅÍÆ”ÈgÊPÌ:Î1Ð*Ò'Ô*Ö1Ø>ÚSÜlÞ”à½âùä9çŠéçëSîÊðXóíõ›øQûþîΰ } Y¹(U+•uµ7Ú‹.µ g©ý õ°ëëáû×/ÎèÄZ¼Þ´’®§©¦û££w£Ñ¤ §ñ©Z­!±&µL¹~½±ÁÍÅÜÉÇÍžÑMÕæØ^Ü·ßýâæ2é$ìïÒñ…ô,÷¸ù;ü¥þ SšÎ÷  +9;:/" õؼ›!|#Z%<' )+ñ,Ý.Ô0Ò2Ú4è6 90;i=±?BoDâFnIûK¢NEQîS–V$Y¦[î]`¾acÏcèc2cˆaÖ^ëZÊUUO›G«>£4Ã)?o¡%ûOð[æÝÚÕ~ÏeÊŒÆÌÃÂ,ÁüÀeÁ;ÂmÃÚÄ~Æ6ÈÊíËÞÍÍÏÊÑÂÓÅÕÌ×ÕÙíÛÞ(àOâŠäÅæélëØíPðÑòqõ øËúŠý]< é É5¯êÓNS¬Z'ä C Á9ÿ¾ö‰íÔãäÙШÆò½@¶²¯…ªµ¦K¤6£Q£¤‘¦U©­¬^°`´z¸²¼ÝÀÅÉÍáЙÔ3صÛß\â†å˜è•ëwîHñô«ö9ùÁû.þ‘ä)b ­ Æ ÑÜÔÑÁ¬šy`>! #þ$à&Á(¨*,€.p0q2s4„68Æ:ø<@?ŽAöCgFëH~KNÄPgSV¦X)[]ž_naÑbµcícbcían_Ä[áV­P6I|@°6ï+Š Æíaýeò>è/ßB×°ÐNËBÇDÄ]ÂLÁÁHÁÂ,ÓÄ*ÆàǵÉË~ÍlÏdÑaÓ_Õf×oقۘݺßäáäXæèúê\íÑïUòçô‰÷>úþüÎÿª‹tW :þµ.p¦mn}Œ‚[»løZï¶åÑÛñÑoÈ”¿¨·ã°p«Y§¯¤T£=£5¤!¦Á¨¬¡¯™³­·á»À8ÄMÈDÌ%ÐáÓ„×ÛmÞ¸áíäþçëçí¾ð|ó&ö¾øCû¸ýt¸ö H ^ owuocN:ã Ä"¡$„&d(J*0,".024638\:ˆ<Î>A|CíEoHøJœM8PæR‹U%X­Z ]8_a•bcïc‡cHbû_\ëWùQÃJGB¬8.Ï"= £ÿ~ô4êßàÄØãÑNÌüÇÊijÂvÁ Á6ÁâÁõÂHÄÛʼnÇYÉ2ËÍ ÏÑûÒýÔ× ÙÛ1ÝNßuá©ãáå/è~êæìQï×ñbô÷µùqü@ÿøáÆ ¥ t+² Àì“}«æ,Yh[ 1ú$ñ™ç½Ý×Ó<Ê>Á¹²i¬ ¨¥…£.£ø£²¥8¨V«í®Í²å¶ »D¿hÄǃËcÏ,ÓÑÖXÚÉÝáOäiçlê]í/ðùò¡õ>øÈú<ý«ÿüK…·Ý ù  îÜ£ˆ e"F$'&(î)Ñ+Á-°/ª1«3¹5É7ñ9<\>¨@CuEíGJMºO^RU¦W-Z™\Ë^Á`Kbicäc©c–b}`P]çX:SALD¡:90%f˜ ߨö)ì¦âHÚ+ÓSÍÄÈ\ÅêÁÁ$ÁÀÁ¸Â ĈÅ6ÇþÈ×ʼ̮ÎÐœÒ˜ÔšÖ¤Ø°ÚÆÜäÞá9ãqå»çênìÕîWñáó€ö)ùéû°þˆgL4  è¡5—¯l¹vŠÝH¿"m §®ûêòté¨ß¹ÕÌꟺf³j­Ï¨—¥½£,£Â£M¥´§³ª6® ²¶Bºq¾ŸÂºÆ¼Ê©ÎnÒ Ö¬ÙÝtà°ãÐæÚéÌì¥ïpòõÀ÷JúÆü2ÿŠÛLs ¤¯¯°ž–zfG+ "ì#É%¬')s+c-P/J1G3Q5f7‚9´;ç=9@BùDuGøI—L/OÜQT#W°Y"\a^a`b6c×cÀcÚb÷`^ØYlT´M¶EŠÅâÆ¢ÈÊYÌPÎ;Ð9Ò3Ô7Ö<ØJÚ_ÜuÞ àÇâåDç•éòë\îÚð\óþõ ø\û#þôÖ·¢ X´J€Q£HåcÄ Hý§ôQëá§×çͧÄ)¼º´}®©"¦¤7£”£ó¤2§ª‚­I±Nµo¹¥½ÏÁïÅøÉæÍ·ÑiÕþØuÜÐßã9æBé<ìïçñ˜ôB÷ÆùSüµþg©â ( >IPJB3 éϬ!#n%N'1)+-ï.é0ã2î4û69C;|=Ã?BDùFyIL¯NVQûS V/Y«[ñ]`¶acÀcÐccda«^»Z’UOZGl>c4„):uû8ðJæzÝÜÕ†ÏyÊžÆåÃ(ÂFÁÁ~ÁSÂ…ÃðÄÆLÈÊÌëÍÜÏÕÑÐÓÑÕ××âÙ÷Û Þ4àXâ”äÑæé|ëàí[ðÝòxõøÕú’ýhB& î ÌŠ3¦Þ¾<-‹'ñʘRç gÔþ[ö(ísãÙÄÏbÆÃ½¶ ¯vª¸¦W¤K£o£¤¤´¦€©Ò¬‹°ƒ´¥¸Ð¼Á Å7É ÍѲÔNØÍÛ(ßtâšå¯è¨ëŽî[ñô¼öNùÒûBþ¤ö:u Â Ö æìèãѨŽqQ!3#%ô&Ò(»*£,‘.†0‚2‡4•6²8Ø: =P?¥AD|FýHK,NÏPxSV²X-[„]_haÊb£cÚcEcÊaC_–[§VvPôH<@o6®+S ‹Ä:ýIò0è"ßI×±ÐdËOÇaÄrÂjÁÁcÁ)ÂDêÄ>ÆôÇÆÉ ËŒÍ|ÏrÑmÓlÕq×{ÙÛ¢ÝÆßìá#ä_æªèëeíÞï[òóô“÷HúýÖÿ²’z] 7¬*q`õA8?E6ºWø÷î[åxÛ¤Ñ-È]¿€·Ê°_«]§¶¤k£X£V¤E¦ì¨&¬Î¯»³Õ·¼3ÀXÄlÈ`ÌBÐûÓž×Û…ÞÑáÿäèëîÍð“ó6öÓøSûÌý,†Ê3 X o ‡‰~u_L1õ Õ"´$—&u(]*E,..(02$416E8o:œ<à>/AŽCF~H K§MJPôR–U0X´Z]8_aˆbƒc×crc"bÕ__\¶WÂQƒJBl8Ü-–"ã {ÿfôêÚàÁØêÑ_Ì ÈæÄÈ“Á!ÁPÁüÁ ÃdÄëÅ ÇfÉGË)ÍÏÑ ÓÕ ×Ù(Û7Ý\ß}á´ãêå;è†êñì[ïàñlô÷¹ùüDÿ åÊ § t%®þ¦ÖhYs¬è ÿÖµùÄð<çf݇ÓûÉÁ÷¸²[¬ ¨'¥•£K£¤Ù¥\¨€«¯õ²·4»c¿Ã¡ÇžË‚ÏAÓíÖpÚßÝ-ábä}çƒêníFð óµõRø×úSý·ÿZ˜Êì ) #îÒ·™ w"X$9&(þ)ç+Ð-Ç/¹1Ä3Ä5ã7ÿ90º@C„EH‰J&MÆOkRUªW8Zœ\Î^»`GbYcÑc“cqb\` ]·XSLÆC_:ÿ/Ô$7c ¾‡öì›âFÚ0ÓbÍÔÈtÅ%ÃÅÁ0ÁAÁÖÁÓÂÄÅKÇÉèÊÏ̷ΰХҥԥ֯ػÚÒÜìÞáCãzåÅçêvìàîañêóŠö2ùñû·þkT5  æž/‹žZšU^­ €Ö: IUûˆòéOßnÕÌË´ÂuºF³\­Ê¨ ¥Î£F£Þ£t¥Õ§Ýª\®0²=¶cº•¾¾ÂׯÛʿΎÒ4ÖÇÙ3ÝŠàÅãäæîéàì¹ïò1õÐ÷\ú×üCÿ›ì)]„ ¡ µÀÀÀ²£ŽuZ; "ù#Þ%»'¡)‡+r-c/Z1\3`5z7”9Å;û=I@žBE€GJ LAOèQŠT0W´Y(\b^^`b)cÆc¨c¼bÓ`Ö]©Y5T|MxEN<2'…ºµøîfäÜÛÔxΤÉÆŠÃÂEÁ3Á¸ÁšÂÝÃQÅôƸȉÊoÌWÎNÐAÒBÔ@ÖFØWÚc܆ޣàÕâ åNçžéüëeîáðhóö¬ødû)þÿØÂŸ ˆ T«8b3hÕk ›n °íüJôõê:áUפÍkÄþ»˜´k®—©$¦¤J£³£¥V§;ªª­m±tµ¹È½íÁÆÊýÍÔÑÕÙÜäß'ãIæZéLì/ïõñ®ôP÷Ýù`üÇþ,x»ð 9 M^[_QC3ÛÂ!ž#%`'C))+-/û0ô25 7.9S;‘=Ñ?-B‘DGŽIL½NcQT¨V:Y¬[÷]ÿ_²aùb¯c¼c÷bEa}^‘ZZUäN G->*4I)Ó Pãú!ðBæqÝæÕŽÏ‹Ê±ÆüÃBÂ^Á3Á–Ál›ÃÅ£Æ^È.ÊÌøÍêÏãÑÙÓßÕÞ×ïÙýÛÞ:àdâšäÜæ'é„ëêíbðéò}õ$øÚú›ýpF- ó ÇŒ*Ь!aþºS˜ zþöËì"ã<ÙÏ(ƽõµ‡¯oªº¦e¤`£Š£Â¤Ù¦£©û¬¬°ª´Å¸ó¼$ÁAÅNÉAÍÑÍÔcØäÛ>߈â®åÂè½ëŸîoñ&ôÍöbùàûVþ± I…± Ï ê ôýùôâÓ¸Ÿƒc!B#$%'é(È*·,¡.™0”2˜4©6Ä8ç:#=^?¸ADŠFIœKÂ]ýÄQÆÈÓɳ˙͊Ï~ÑzÓwÕ}׆ٖ۬ÝÑßõá-ägæµè ëpíåïfòüôœ÷OúýÝÿ¸˜~^ <üª!cPÞä\ê² aÿÿ±÷œîå'Û\ÑìÇ-¿Z·´°S«_§¾¤ƒ£m£{¤b¦©J¬ö¯ß³ø·&¼RÀxćÈ}ÌZÐÔ³×7Û›Þäáå)è*ëîäð¡óJöäøeûÜý@“ÞH f ƒ ™—’ƒs[D" !ä"Ç$¦&‰(m*V,C.701254?6\8|:²<ð>@A CFHKµMXPÿRŸU;X¸Z]6_abtcÃcXcb®_6\‚WQJJÍA08¢-`"³ê XÿPô êØà¿Ø÷ÑiÌ#ÈøÄãªÁ;ÁjÁÂ"ÃvÄưÇ{ÉSË;Í'ÏÑÓÕ× Ù,ÛGÝ_ß‹áºã÷å@è“ê÷ìfïçñyô÷ÉùüRÿ%ëË ª q!¦òò‘·I+Br£Å­x\ùfðéæÝBÓ¶ÉÕÀ̸ê±K¬ ¨0¥§£d£3¤ú¥‚¨¥«8¯³*·X»‚¿¬Ã¼ÇºË›Ï\ÓׇÚóÝCávä”ç’ê…íUðóÆõaøíú`ýËÿ n¨Ù  -27/$ýäÈ© ‰"j$H&-( *ù+â-×/Ì1Õ3Ö5õ7:B<>Ë@)C–EHJ2MÕOxRU·W:Z¢\Í^¹`Y@³BE’G J­LTOòQ›T3WÁY*\d^\`øac´c’c›b±`©]yYTAM=E<Û1Ú&U‡â•øî`äÓÛŒÔ}μÉ$Æ£ÃÂ]ÁQÁÍÁµÂñÃfÅ ÇÇÈÊ|ÌiÎXÐQÒKÔMÖPØbÚpÜÞ±àÛâåVç©éìrîæðuó ö³øpû0þÞÆ§ † Y§ )ñF<¨/ËRÆ Tüêóšêãà×_Í/ÄÑ»v´Y®©,¦"¤e£Í£9¥x§dªÐ­”±—µ·¹ç½Â-Æ1ÊÎêÑœÕ,Ù¤Üüß:ãaæjédì>ï òÀô_÷ôùlüßþ:ŠÌ) M \pmocUA* òÐ!±#’%q'V):+%-/ 1 3 5$7>9h;¡=æ?>B¡DGšI2LÊNpQT²VCY°[û]ø_²aèb¢c¢cÜb aT^`Z&U«NâFó=ç3)—á$Èú ð6æpÝç՛ϚÊÉÆÄ]ÂyÁKÁ²ÁƒÂ²ÃŶÆoÈBÊÌ ÎøÏìÑéÓèÕì×ùÙÜ%ÞAàrâ¢äææ1éëòíoðíòŒõ*øäú¤ývO2 ö ȉ&“× ï<ÍO ¹> µþ¢õoìÄâîØ3ÏïÅ[½Ôµn¯iª¼¦r¤v£¦£ç¤û¦Í©­Ö°Ï´ê¸½DÁaÅlÉ\Í0ÑçÔ|ØüÛRß¡âÀåÙèÏë³î€ñ<ôÝöwùðûhþÄ[–Â ß þ  øÞÏ­–s!T#4%'ø(Þ*Å,·.¨0¨2«4»6Õ8ü:2=s?ËA&D FI¯KHNìPŽS2VÂX8[Š]š_]a¶bƒc°c c‰añ^:[CVPHÄ?ò5@+á3mÿüòèßO×ÆÐ…ËuǑĤžÁOÁ”ÁZÂqÃ×ÄdÆÈæÉÀ˩͗ϊцӂՈ×Ù¢ÛµÝÛßþá7äpæÁèë}íìïqòõ£÷\úýèÿ¾ƒb :ý¢V>ÅÆ5çÏŽ™` £ÿQ÷>î«äÓÚÑ®Çù¾4·œ°I«^§Í¤”£Ž£–¤Œ¦5©t¬°´¸F¼vÀ”ĨȗÌtÐ0ÔË×PÛ®Þûá*å=è@ë"îøðµó[ööøyûëýT£ï'X v – ­§¢—€pP9!ù"Ø$·&œ(}*j,S.K0B2I4Q6p8Ž:Ä<?RA´C F¢H*KÉMeP SªUDX½Z]7_ axbec°c>càa‰_\RWTQJ‘Añ7i-&"ƒ¾ 7ÿ5ôÿéÍàÅØýÑ{Ì3ÈÅùÂÉÁTÁ…Á,Â:ÃÄÆÆÇˆÉgËGÍ6Ï*Ñ!Ó Õ!×*Ù8ÛOÝkß“áÅãæJè›êíoïóñô!÷ÌùŽüVÿ- ìÒ ¨ r åâyš#5`urN÷ø ð†æ¿ÜîÒxÉ›À¤¸Î±;¬ ¨5¥½£|£T¤¦¦¨Í«_¯?³R·z»£¿ÎÃØÇÛ˵ÏwÓ×¡Ú ÞZáŒä§ç«ê”ímð-óÙõxøùúxý×ÿ6|ºì , =FH?8"ôÛ¹ "x$_&;(#* ,ó-ë/ß1ä3î58&:U<‘>à@;C§E#H­JCMáO‰R'UÃWBZ£\Ï^²`8bn@ÁB0E£G.J¿L_OR¥T?WÅY/\d^Y`ðacŸc{c~bŠ`ƒ]DYÏSMEÐ;¤1¢&b·ƒøîíYäÕÛ‘ÔÎÏÉ9ƾÃ3ÂxÁlÁäÁÏÂÄ|ÅÇÛÈ©ÊÌtÎgÐ\ÒVÔXÖ\ØjÚ{Ü—Þ¹àçâåbç¯éìvîôðzóö»øvû8þåÊ© ‰ UžØ0îv÷ˆ tÄ û.üó>êŒà¹ÖÍùä»X´I®ˆ©5¦/¤~£é£Z¥¡§…ªú­·±½µÜ¹¾3ÂGÆPÊ7ÎÒ´ÕCÙ¹ÜàNãtæ€éuìTïòÑôs÷úƒüëþNšÜ; [ q{ƒ|xcT8  à!Ä# %„'g)M+7-'/13"547Q9{;²=÷?OB´D)G­I>LÜN}Q T½VIY·[ù]ú_¥aãbcŒc¾bý`*^2ZïTtN¨F³=´3Ò(n¬©úùï)ærÝëիϪÊàÆ,Äw‘ÁiÁÉÁœÂÉÃ/ÅÌÆÈSÊ,ÌÎÐýÑñÓöÕõ×ÚÜ+ÞMàxâ¯äíæ<é”ëýíuðúòõ6øéú¯ýzX4 ÷ Ƈ‹°‡íÒ›N Åhë Z½ýFõìqâ›ØîίÅ1½¯µ]¯`ªÀ¦¤Š£Æ£¥#§ï©G­û°ô´ ¹:½bÁňÉxÍIÑÕ’ØÜjß³âÖåíèáëÆî•ñKôóö„ùüuþ×,j«Î õ ôÛä†!f#F%(')ñ*Ö,Ê.º0¹2¾4Ì6é8 ;D=‡?ØA>D­F.IÀKUNüPšS;VÊX>[‹]™_Ya¨bvc˜còbfaÉ^ [VÌODHˆ?¹5+±ÿJÞüò èßS×ÒДˎǤĶÁhÁ²Áo‹ÃëÄuÆ1ÈòÉÔ˴ͨϕєӌՕי٬ÛÂÝàß â<ä}æÆèë…íõï|ò õ²÷^ú!ýîÿÁ§„g 8ý™D.©« ¼™…yK ¬FÿôöäíOä†ÚÅÐsÇž·°D«[§Þ¤££¬£µ¤°¦[©š¬?°,´@¸j¼–À²ÄÇȰ̑ÐEÔç×cÛÇÞâ<åUèPë9îñÉókö ùˆûþýcµ6j ˆ £ ´º¸·¢˜|eH)! #é$Ê&­(*|,f.[0W2X4f68¡:×<?cAÄC4F¯H@KÓMtPSµUMXÂZ]3_ambWc›c"cÁa`_Û[W QÑIUA¸7)-ø!L› ÿôðéÉàÇØÒ‰ÌIÈ)ÅÃàÁpÁÁEÂPäÄ(ÆÙÇ™ÉuËYÍBÏ9Ñ+Ó,Õ*×7Ù>Û]Ýqß¡áËã æSè¥ê í{ï÷ñô$÷Ûù‘ü`ÿ1ñÕ © p˜ÕÓa|ÒÛû* ùßø¬ï2ækܧÒ7ÉgÀ€¸³±1¬¨B¥Ï£–£t¤@¦Í¨ò«…¯e³t·œ»Ä¿ìÃ÷ÇõËÎÏ“Ó.×½ÚÞqá ä»ç¾ê¨íð=óïõƒøû‚ýïÿA‘Èþ < NUYQF6èÎ ¬"$n&N(3*,.ü/ò1õ368::e<¦>ï@LC¸E4H»JUMìO˜R/UÎWGZ©\Î^°`,b4c–cHcbë_›\#X\RXKC¨9N/1$œæ S:öçëâKÚGÓÍ É¹ÅmÃÂ}ÁŽÁ!ÂÃ_ÄÝÅ‚ÇDÉËûÌâÎ×ÐÊÒÇÔÉÖÍØÜÚîÜ ß/á`ã˜åßç/ê‘ìþîzñô£öLù üËþ§~_C  æctLéæc¶ú+6 7;úrñ èOÞˆÔËÂò¹ò²*­Ã¨³¥¤‹£>¤×¥G¨N«Ï®¢²ª¶Ìºú¾Ã2Ç/ËÏÚÒ~Ö ÚwÝÌàä!ç*êíôï¸òhõø‘ú ýuÿÓ^µ Ø äõóòæÖÁªq P"/$&ñ'×)»+«-•/–13œ5­7Ì9û;3>~@ÔBAEµG?JÏLmOR°THWÎY2\g^R`íac‘c`cbbd`X]Y–SÌLÈD”;f1j&é5’døÜíOäÓÛ—ÔšÎßÉNÆØÃJ”Á‚ÁÂåÂÄÅ0Çéȿʘ̈ÎnÐnÒ^ÔhÖcØwڃܢÞÂàðâ)åjçºéì‚îüð†óöÆø}ûCþïͯ ˆ Wœõ ÇÒëFÀGÄ%n ž×û.óçé5àhÖÕ̽Ãy»9´5®…©7¦B¤“£¤~¥À§²ª®â±àµÿ¹)¾PÂhÆkÊSÎÒÎÕZÙÒÜ&àfãˆæ“éŠìcï3òàôˆ÷ú“üÿþ]¬í%L k ƒŒ”ކveI2 ó!Ô#´%–'w)_+H-://1-335H7`9‘;¿=@\BÈD8G¾IPLæNQ)TÉVMY¿[÷]û_aÕb~cuc¡bÙ`^Z»T:NnFv=x3(6‚Üúãï ælÝôÕ³ÏÀÊïÆJċ±ÁÁáÁ·ÂÜÃHÅÞÆ‘ÈeÊ:Ì'ÎÐÒÔþÕØ ÚÜ8ÞUà‚â¸äöæEéžëî~ðó—õAøðú¶ýƒ[; õ Ë€~¥qÕ°îlÏ|“ aýèô¶ëâLاÎv޵J¯UªÆ¦Œ¤¤£ß£(¥C§ªh­$±µ2¹[½‚ÁŸÅ£É•ÍaÑÕ¬Ø&Ü„ßÄâïåýè÷ëÚî¤ñbô÷›ùü‹þç=}ºÞ -+/%éÕµ™!t#Z%6')+ë,Ø.Ð0È2Ñ4Þ6ú8!;T=™?êAMDÀF?IËKhNQ¨SGVÎXH[‰]œ_Oa¢bdc‚cÚb@a¤^ÛZÛU”O HL?|5Ì*vÕ¿üññùçßW×ÙШ˞ÇÀÄØÂÐÁ„ÁÇÁŒÂÃʼnÆAÈÊâËÇͰϧњӞ՚רٳÛÎÝêßâEäˆæÏè'ëŽíüï‡òõ¹÷hú)ýóÿΦŒf :ú” 6ŠéŒeJ0· Têþ–ö‡íøã1ÚÐ2Ç–¾ì¶k°6«_§ç¤º£Ç£Õ¤Õ¦©Â¬e°Q´f¸Š¼·ÀÒÄáÈÐ̨ÐaÔý×{ÛßÞ#âTåeègëJîñÙó‚öùœûþsËLv ± ÈÇÎÄ·¨ŽwY:!#û$Ü&½(¤*‹,z.m0g2l4y68·:ä<*?tAÙCBFÃHMKãM„P#SÃUSXËZ]7_ÿ`fbFcŠcc¢a7_ª[îVàP›IAy7ï,»!l óþôâé½àÌØ Ò›ÌYÈAÅ+ÃüÁŠÁµÁ_ÂhúÄ>ÆëÇ­É…ËhÍQÏDÑ<Ó7Õ7×@ÙKÛfÝ~ߨá×ãæ^è®êíƒïò•ô0÷âùšügÿ:öØ ¨ r“ÉÁJ`Ù¨¦¾×ÝË Ÿf>øMïØåÜ\ÒôÈ1ÀX¸—±$¬¨L¥â£±£”¤c¦ô¨¬¬¯Œ³™·¿»è¿ ÄÈÌëϪÓL×ÎÚ9Þƒá¶äÑçÐê¿í‘ðRóÿõ™ø!û™ýüÿXžÞ 1 O ]iidWI/úß ¿"ž$&_(G*-,.02 46*8H:z<¸>AaCÉEDHÐJ_MPŸR?UÓWRZª\Ñ^ª`%b#c†c+cõaÂ_n\òW"RKÓBk9/ö#j¶ -!öÎë}âEÚPÓ™ÍÉÎňÃ-—Á«Á6Â5ÃrÄòÅ—ÇSÉ.ËÍõÎáÐ×ÒÕÔÒÖÙØçÚøÜß8ákã£åçç;ê˜ì ïƒñô­öUùü×þª‰aH  ã bY-ƺà't¯×ÝÝÙùñ­çþÝ3ÔÄÊÒÁ͹ղ­Ã¨¸¥¤§£Y¤ý¥j¨u«ö®Ê²Í¶óº¿<ÃRÇJË0ÏñÒ™Ö#ÚÝâàä7ç?ê,íðÊò{õø¢ú!ý†ÿä.n¢È ç ø÷êѼž‚ b"A$#&(æ)Ò+¹-¬/¦1Ÿ3±5¼7â9 Ž@éBOEÉGKJâLyOR¹TUWÒY9\f^S`àaûbzcKcAb?`-]ãX`S“LˆDY;(10&¸s@øÎíAäÑÛ Ô£ÎôÉbÆðÃd¯ÁœÁÂûÂ6ĤÅCÇýÈÎʩ̔ÎÐvÒpÔlÖvØ{Ú’Ü©ÞÍàûâ1åsçÅéì‹îñŒó(öÎø†ûJþõÒ³ ‹ T’ëû²õ°Ã‹|Ó EwûÑò‰éÞßÖÌ…ÃJ»´#®€©>¦O¤®£"¤¢¥ä§Øª@® ²¶$ºJ¾q…ƉÊnÎ8ÒæÕrÙèÜ>àyãŸæ¥éŸìxïCò÷ô–÷*ú üÿm¿5]  ¢¡¡–‰t^A% "æ#Æ%¦'‹)q+Z-M/@1A3H5U7y9›;Ú=@tBÕDMGÌI`L÷N—Q:TÐVXYÂ[ú]÷_šaÇboc\c„b¶`×]ÏYŠTûM7F5=:3d(üX®rúÍïæjÝöÕ¿ÏÏÊÇ_Ä¥ÂËÁšÁûÁÎÂôÃ]ÅñƧÈqÊNÌ2Î"ÐÒÔÖØÚ&ÜBÞ_àŽâ¿äçOé¦ëî…ðó¡õGøüúºý_E û Ç€s—\¼ŽÇ=ß3Î@ ¥ýˆô]ë¿áþ×^Î<ÅÒ¼lµ7¯NªÊ¦›¤¸£ÿ£F¥m§;ª“­F±@µQ¹‚½žÁÀÅÂɬÍÑ,ÕÈØ=Ü—ßÞâÿåéìîî¹ñoô÷§ù)ü›þ÷NÈõ  ,;>A4+ÿåÅ«!ˆ#j%I'.)+ÿ,è.ã0Ú2å4î691;g=¬?ùAdDÌFRIÜKuNQ³SPVØXM[]—_Na’bXckc¾ba}^«ZªUZOÏG?A5*D¢ûüÛñìçßY×èг˶ÇÖÄñÂìÁ›ÁãÁ¡Â·ÃÅŸÆTÈÊõËÑÍÂϲѧӨզ׳ټÛÙÝòß âPäæÚè.ë™íðŽòõÀ÷qú1ýûÿÓ­‘f <õ‘ÿ+zkÂ^0ð¯g ùþ9ö+í¡ãáÙ6Ð÷Æc¾Ë¶S°0«_§õ¤Ð£Þ£û¤ô¦§©æ¬‹°v´Š¸­¼ÕÀöÄùÈïÌÁÐ{ÔØ–ÛîÞ@âcå}èwë_î.ñìó”ö(ù±ûþ‡Ú^† ¯  ØØáÑ̵¢†kK!-# %ì&Ñ(´*Ÿ,Š.0z2~4Š6¤8Æ:ø<;?‡AèCTFÒH]KôMP1SÌU[XÑZ]4_û`Zb9crcíb~a_€[·V®P^IØ@>7¶,‡!ìE ÐþðóÑé½àÊØÒ«ÌlÈZÅDçÁÍÁyÂÃÍÄVÆúǿɖËtÍcÏMÑJÓ?ÕE×IÙXÛm݋߯áããæeè»êíï òŸô6÷ìù¡üpÿ@þ× ­ l†¾­4A·ys’“v Kä÷ðî~åÃÛÒµÈþ¿2¸}±¬¨W¥õ£Ê£µ¤†¦©<¬Õ¯¯³¿·à» À&Ä:È'Ì ÐÀÓg×åÚOÞ™áËääçäêÑí¤ðfóöªø2û©ýg²ë D [ sxywgYC* ò Ë"¶$‹&x(S*B,*.024#6<8Z:Œ<È>ApCÜERHàJnMP«RKUÜWVZ¯\Î^¨`bcqccÕa_B\¿WîQäJ™B/9Ù.¾#;  ö¾ëwâGÚXÓ§Í4ÉãÅ¢ÃCµÁ¿ÁRÂJÊÄƨÇeÉ;ËÍÿÎñÐáÒàÔÞÖãØñÚÝßEáqã­åðçDê¢ìïñô¸ö\ùüÜþ´ˆmE  ߌTJ즮î/g†‡‚~ù¹ðVç©ÝëÓÊ¡Á£¹¹² ­»¨Æ¥&¤¿£z¤¦‘¨š«¯ì²÷¶»@¿XÃpÇhËGÏ Ó±Ö9Ú¨Ýôà1äHçUê<íðÚòõ*ø¶ú/ýšÿóB}´Ö ú úä˲‘ t"S$4&(ù)à+Î-¼/·1²3Â5Ð7ó9¢@ùBaEØG^JîL‹O)RÆT]WÙY=\e^P`Ùaìbic2c b`û\¸X&S\LJD;í0ù%„×L)ø¹í8äÑÛ¤Ô´ÎÊzÆÄ€ÂÆÁºÁ.ÂÃGļÅTÇÉÝʻ̠ΎЂÒ|ÔyÖ؆ڜܲÞÚàã?å{çÎé+ì“îñ—ó0ö×øŽûRþ!úص VŽÝíšÝ‹šâMÆ.†À êûvò.é‰ßÍÕJÌLà »û³®|©B¦c¤Á£D¤Á¥ ¨ýªh®-²+¶Dºp¾Â¨Æ ÊŽÎMÒÖŠÙüÜWà‹ã·æ¶éµìŠïWòõª÷8ú¶ü#ÿÏDq ¤±²´§™†nS6 "ö#Ù%·')ƒ+l-_/R1T3W5m7†9³;ç=1@ƒBéD]GßInLO¥QCTÝV]YÈ[û]ô_’a½bZcIccb“`¬]ŸYTTÂM÷E÷<ÿ2'(Ë#ŒPúºïæjÝ÷ÕÎÏÜÊÇrÄÅÂßÁ¹ÁÂæÂ ÄqÅǸȅÊ]ÌDÎ+Ð$ÒÔÖØ!Ú3ÜIÞkà—âÊä çWé³ëî’ðó­õOøûÄý“iE$ ÿ Å€pNžoŸ ¨Lïyî G«ü(ôëhá«×ÎûĨ¼Fµ%¯DªÐ¦¨¤Ð£¤i¥§eª¸­q±`µ|¹ž½ÆÁÚÅâÉÈÍšÑGÕߨSܯßôâæ-éìïËñƒô+÷¹ù=ü©þ]¡Ü ( <KQPH:'õÛ·!ž#y%]'?)$+-ü.õ0ì2÷479D;|=º?BnDâFaIìK†N QÃSWVãXO[‘]”_HaˆbFcTcŸbþ`N^€ZpU#OGÓ>5W*nÕzüÆñÞç ß\×ñÐÄËÊÇìÄ Ã´ÁµÂÓÃ(Å·ÆaÈ,ÊÿËäÍÏÏ½Ñ¸Ó±Õ³×½ÙÆÛåÝúß,âZä—ææè7ë£íð˜ò&õË÷{ú6ýÕ·‘k ;ó‹ôõ`Kš2õÏ f  0þÙõÌìIãŠÙñϵÆ4¾¤¶?°#«c§¥ã£ý£¥§Î© ­´°š´°¸Ï¼úÀÅÉÍÝДÔ.Ø¨Û ßOâ}åèëpîEñûó©ö:ùÀû4þ–ì3i º Ù äïíèÚdz—€Y!C#%'ã(Å*±,.0Ž246µ8Ù: =J?šAùCgFãHnKNP@SÓUhXÔZ#]4_õ`Qb(c^cÐb_aç^Q[…VrP$I›@7{,N!» °þÕóÂé·àËØ#Ò¶Ì…ÈlÅbÃ,ÂÀÁêÁÂ˜ÃæÄeÆÈÑɤˇÍlÏ_ÑSÓNÕM×WÙ`Ûxݔߺáêã)ælèÆê$í—ïò¤ôE÷îù¯ürÿL× ¯ h {´˜ ’N=EKG" ñ¬ÿ„÷˜î#åqÛÇÑvÈο¸i± ¬¨a¥ ¤å£Ö¤©¦@©d¬ù¯×³â·¼(ÀJÄNÈLÌÐÞÓ|×þÚdÞ¯áßäúçøêäí¶ðyó!öÀøAû¼ý yÂ- W l ƒ‰Œ…{gW9 !á"Â$£&ƒ(i*Q,>.10(2.466M8q:š<Ý>$A„CéEjHéJ„MP»RRUèWYZµ\Ì^¤`bc[cúb³aw_\W¶QªJ[Bó8.†# ` ëìõ²ëlâLÚ^Ó¸ÍFÉúżÃ`ÂÍÁÛÁlÂ_ãÄƼÇyÉHË)Í ÏýÐñÒêÔêÖðØøÚÝ(ßNá|ãµåûçNêªìï”ñ#ô¿öfù#üåþ¹‘nJ  ß„E:Õòb|¯ï6.%"ùYðçQÝ¢Ó<ÊjÁ{¹²ÿ¬¼¨Ë¥<¤×£›¤@¦·¨Á«D¯³·5»]¿{ÌDžËcÏ%ÓËÖOÚ¿Ý áFä_çeêUí*ðñò¡õ;øÊú?ý­ÿTÄë  (&' öܦ ‚"h$D&)( *ó+ß-Ð/È1È3Ò5ä7:0´@ CrEëGmJþL™O4RÔTeWàY@\g^K`ÒaÜbXccb÷_Ð\†XïR!LDÛ:µ0½%Q¬$ø¥í2äÏÛ¬ÔÁÎÊ–ÆÄžÂßÁÔÁKÂ+ÃeÄËÅnÇ ÉðÊÉ̱ΚÐ҇ԅֈؕڤܾÞãà ãFå‰çÕé6ìœîñŸó;öÞø˜ûXþ+þÞº ‹ Xû‡Ñ݃Âgr®€æ2i ¼úòÓè2ßÕÌÃïºâ³ý­y©I¦s¤Ù£f¤ß¥5¨!«®T²M¶lºŽ¾±ÂÅÆÀʦÎkÒÖ¥ÙÝmà¢ãÊæÎéÆìœïlòõ¿÷GúËü0ÿ–Þ$V‚ ž ·ÀÆÄ¹«—€fF )" $ç%Î'«)—+-n/j1_3q5z7š9Æ;ù=B@–BúDnGîI~LO²QQTâVhYË[û]õ_†aµbFc/cJbi`†]kY!T‡M»E½<¿2ò'”÷g1ú¨ïûåeÝÖÖÏôÊ-Ç’ÄÖÂÂÍÁ0ÂüÂ%Ä…ÅÇËÈ•ÊmÌPÎ<Ð-Ò$Ô!Ö#Ø,Ú<ÜTÞuàžâÖäçbé»ë#îšðó´õZø ûËý›lO#  Ã{bu6…MvÚq ©'˜ îKüÍó£êá\×ÓÍÃÄw¼)µ¯CªÏ¦»¤ä£9¤‹¥³§‰ªâ­’±‹µ™¹Å½äÁûÅþÉä͵ÑaÕõØmÜÂß ã(æ?é0ìïàñ–ô;÷ÎùKüÀþq²ë 6 O^abXK9#ìÊ!¯#Š%q'N)9+ -/135729V;=Í?!BƒDðFsIüK“N/QÎSaVìXS[’]”_>a€b3c@cƒbØ`*^LZ@UèNXG“>Æ4*ØB©`ü«ñÖçßc×üÐÖËÞÇÅ%ÃÂÒÁÂÐÂéÃ=ÅÌÆsÈ=ÊÌôÍÛÏÌÑÂÓ½Õ¿×ÄÙ×ÛçÝ à0âd䤿éèGë¥í ðò1õÓ÷€úBý ݼ“q 7ó‚í ãD.qÀŽ]¸ HÔý{õrìòâ:Ù¨Ïyƾƒ¶)°«f§ ¥ù£¤6¥B§ñ©6­Ø°Â´Ð¸ô¼Á1Å8É$Í÷ЮÔCØÄÛßgâ“å¢è¢ë„îUñô¹öNùÒûFþ¦þD}­ Í ê õüúéÜêm!R#/%'õ(×*Ä,®.¥0ž2¢4¯6È8ë: =[?®ADyFôH}KN¬PHSäUkXÜZ$]2_ñ`HbcIcµb8A“CþEwHüJ‘M'PÈR_UìWfZ²\Ñ^` bûbGcàb“aO_é[ZW~QpJBº8\.R#Õ4 ÈÓõœëiâFÚiÓÄÍVÉÆÏÃ~ÂâÁúÁÂ}ôÄ2ÆÍÇ‹É\Ë4Í!ÏÑÓòÔøÖùØÛÝ1ßZá„ãÁåèZê²ì'ïžñ-ôÇöqù(üóþºœoO  ßû6+¾Õ_4Ht©Ïß ×ÈÁøÿïžæÝOÓþÉ/ÁV¹|²ó¬´¨Ø¥J¤ò£¸¤d¦Û¨é«j¯:³=·Z»~¿Ã«Ç¢ËÏ?ÓâÖkÚÒÝ$áZärç~êdíCðó²õRøÖúWý»ÿa¤Óþ  .5<4-ïÔµ ™"u$Y&;(*,ï-ä/Ø1Ü3ã5÷7:DË@C‹EöG‚J M§OCRßTlWíY@\k^G`ÉaÓbCcÿbåaÏ_¨\NX½RäKÑC¡:s0†%|ï÷í'äÍÛ¯ÔÏÎ#ʪÆ3ĵÂûÁìÁeÂDÃwÄæÅ{Ç6ÉþÊÝ̻άКҕÔÖ•ØÚ®ÜÌÞèàãKå•çÝéAì¥î"ñ«óAöéøŸûbþ0 ß¿ UûÅÎo£JAƒÖA›â 1`úµñyèÜÞ-ÕÂËÚÂǺÀ³î­q©R¦¤ò£‚¤¦W¨K«²®²o¶‘º®¾ÓÂãÆÝÊÄ΃Ò4Ö¹Ù.Ý~à½ãÚæçéÖìµï|ò-õÒ÷YúÝüEÿ¤ñ4h” ° ÆÔÔØÇÀ¦“uX ="$ý%Ü'¿)ª+-„/v1y3|5“7ª9×;>Q@«B EGþIL!OÃQXTñVlYÐ[ÿ]ï_ƒa¥b6cc(bJ`V]?YçSQM|E€<2·'^È>ú‘ïìåeÝÿÕæÏýÊHǤÄòÂÂçÁHÂÃ8ÄÅ,ÇàȣʀÌ\ÎNÐ6Ò4Ô+Ö0Ø8ÚDÜbÞ}à«âßäçnéÃë.î¤ð)ó½õcøûÕý¡vQ, ÇuUg#h1I®6Ì_ÙA •îûnóHê¹à ×͈ÄH¼ µø®?ªÒ¦Ë¤ø£X¤«¥Û§­ª®»±¬µÃ¹á½ÂÆÊÎÌÑ}Õ Ù…ÜÛßãBæOéHì'ïññ«ôM÷àù_üÍþ3|Êø* I `nssi^J2ûß!¾#œ%„'^)N+/-$/135(7C9k;=â?2B•DGƒI L£N‡4à) ~?ü“ñÆçüÞf×ÑæËñÇÅ=Ã:ÂéÁ2ÂèÂÄRÅáÆ†ÈNÊ ÌÎêÏØÑÏÓÈÕÌ×ÏÙàÛõÝà=âo䫿øèMë´í%ðªò9õß÷ˆúLýæÁ—u 6ó|ãÌ/ K׆RÈd îsý õì˜âêØ^Ï:ÆÔ½Y¶° «l§¥¤2¤\¥b§ªY­±æ´ö¸½:ÁOÅWÉAÍÑÈÔ\ØÛÛ7ß}â¦å»è³ëœîfñ'ôÊöaùäûWþ»V¿ ß ú   ûëÖ» €!c#A%$')ë*Õ,À.¸0°2¶4À6Ü8ü:5=k?ÂADŠFI‹K#N¶PZSêUwXáZ(]/_í`JA¦CFŠH K M8PÓRkUöWlZ¶\Ð^˜`bêb5cÃbua&_½[#WIQ1JâAv8$.#¢ ¤µõëYâJÚmÓÓÍhÉ(ÆêÓ ŸŽÃÐÄBÆäÇœÉjËGÍ)ÏÑ ÓÕ×ÙÛ"Ý<ßcáãÉåè_êÀì,ï¬ñ3ôÑöyù3üöþÈ›yP  Þzò,¦¹9 8f…Š „hkøïJæ¨Ü Ó¹ÉÁ)¹e²ä¬³¨á¥Y¤¤Ò¤Œ¦þ¨¬’¯]³e·{»¡¿»ÃÊǾ˙Ï[ÓøÖ†ÚçÝ;ánä‰çê{íRðóÇõ_øïúcýÐÿ(v²ç + =IKE@+âË ¦"Š$i&K(/*,.÷/ê1î3ö5 8+:R<’>Õ@1C”E HŽJMµOPRèTxWïYG\h^E`ÀaÅb/cçbÃa«_z\X„RªK•Cb::0J%éMÞÐ÷‚íäÎÛ·Ô×Î9ʼÆMÄÏÂÂÂ|Â_ÃŒÄüÅŽÇHÉËèÌÎεЩҢԘ֤إڼÜÓÞôà#ãXåœçééHì²î)ñ·óIöóø§ûiþ9 ë¼ ” Q÷x»¼\„)M¡ûS¹Ùÿù[ñè…ÞäÔ}ˡžº¡³ß­o©V¦“¤ ¤¤*¦y¨r«Ü® ²™¶²ºÑ¾ôÂþÆÿÊÙΣÒHÖÕÙBݘàÎãóæøéíìÅïò?õã÷lúðüTÿ¸Fz¢ Ä ÕåèäÝÏ·§…l L",$ &ñ'Î)¼+£-“/1‡3‘5¢7¿9è;>e@¹BEGJŸL0OÏQeTùVuYÒ[^è_€a–b&cc b$`.] YµSM@EDN4¦)nà[ü‚ñ¶çýÞf×ÑòË È/Å[ÃOÂÂEÂÃÄlÅñÆšÈ^Ê1ÌÎøÏåÑÛÓ×ÕÒ×ßÙæÛÞàEây䵿éXë»í0ð±òDõâ÷–úQýíÞs 9ìyÖó¸ë$¦PÍ{ ’ý¾ô½ë>âœØÏÆ£½;¶þ¯«m§%¥'¤N¤~¥…§Aª€­'± µ¹5½]ÁmÅsÉ]Í-ÑàÔuØñÛKß•â¸åÑèÆë®î|ñ6ôÝösùõûjþÉ!fŸÐ î $üåα’!s#S%5')ý*æ,Ô.È0Ã2Ç4Ó6î8;F=}?ÕA*DFIK1NÅPeSõU}XèZ(]1_ä`4b÷b"cxbý`k^ÈZéUËOrHâ?K6È+¬ ' KþŒó•é¤àÑØ?Òã̾ȳũÃ|ÂÂ6ÂÚÂÝÃ%ŦÆFÈÊÔ˳͘τÑzÓnÕt×qÙ…Û”Ý³ßØá äCæŽèÞêCí³ï1òÂô^÷ úÆü‹ÿ^2 å © ióe‡cÓÆ Ç›Žz`+ ä™þiö‚íä|ÚæÐ¼Ç2¿™· ±ç« ¨¥G¤3¤7¥§¯©Û¬i°L´K¸o¼‹À¨Ä«ÈžÌnÐ.ÔÁ×HÛ§Þðá"å5è5ë îïð±ó\öðø~ûìýY«ö5a Š   ¶½¿¹­ž‡qQ9!#ø$Ø&¹( *‡,t.f0b2a4o6„8¤:Ô<?\A¸CF˜HK­MEPßRuUÿWpZ¹\Í^•`öaÛb#c¦bWaû^”[ïVQôI¦A=8è-â"qß ‚Ÿõ}ëVâJÚwÓâÍ{É@ÆįÂÂ)µ¨ÃäÄWÆöÇ­É}ËRÍ=Ï!ÑÓ Õ ×ÙÛ/ÝGßkáãÐåèhêËì4ïµñ=ôÙö‚ù9üÿË¥{R " Øxæ ŽœßÞþ9: ( ø?ïòåSܾÒvÉÊÀ¹J²Ö¬²¨ë¥m¤(¤ó¤­¦#©:¬²¯‹³·¤»¿¿ÜÃèÇÚ˶ÏrÓ×—ÚÞLá†äœç¥êŒíjð'óØõuøþúvýâÿ7ˆÅö ; NZ[ZKA'ôÜ ·"$z&^(@*,,. 0þ1ÿ3 68<:e<¤>ç@BC¦EHŸJ-MÃO\RöT~WùYH\j^@`¸a¶bcÍb¤a†_M\ïWLRrKWC*:ù/%±&¸¹÷níäÎÛ¼ÔçÎJÊÑÆiÄäÂ2˜ÂrÃ§Ä Æ§ÇVÉ!ËúÌ×ÎÊбҮԨ֩شÚÃÜÞÞþà,ãaå¦çóéQì»î3ñ½óSöüø¯ûqþ>íÀ – Löl°¨FgíeºC_ƒùñ½ç9ÞÔAËhÂwº‚³Ò­g©a¦£¤$¤¼¤K¦Ÿ¨–«¯Ä²¾¶Öºñ¾ÃÇËøÎ¹ÒdÖìÙYÝ®àäã ç êí×ï¤òQõö÷úýükÿÃTŒ´ Ô èõûóòÜͲœx b";$ &(â)Î+³-§/ž1š3¤5³7Ò9ú;3>v@ÌB-E¢GJ­L?OÝQoTW{YØ[ÿ]ë_qabcèbîaþ_]ÛX~SÜLE< 2F'ôoñÚùfïÚå[ÝÖûÏ ËrÇÕÄ$ÃNÂÂzÂHÃeÄÇÅSÇÉÆÊžÌzÎhÐQÒLÔAÖHØJÚ_ÜqÞ”à¼âôä/ç‚éÖëAî¶ð;óÑõsø(ûâý³~_1  Çkô>Iö5êúIÆHÍ9“ à4û°ò–é àrÖÍÄð»Ç´×®,ªá¦å¤)¤‘¤î¥"¨þªQ® ²óµ º&¾GÂYÆSÊ;ÎÒ®Õ>Ù²ÜàHãjæ{élìQïòÏôs÷ú…üñþS£èL k ‘••}nV;! ÿ!ã#Â%£'‡)m+V-H/:1:3<5O7f9;Ã=@XBµD'G£I+LÁNVQòSVYc[™]Š_1aUbc÷b.bn`ª]ÀYŸT>N¡FÛ=4m)7°2þûkñ©çùÞh× ÑþË!ÈFÅqÃm ÂaÂÃ+ÄÅ Ç«ÈqÊ@Ì ÎÐöÑäÓãÕß×èÙòÛ Þ(àOâƒä¾æ é`ëÇí9ðºòNõì÷œú[ýóÉ£s <äwËä¦ùÌýuÒ…,º :½üaô`ëèáJØÏÎÆÅq½¶ç¯ÿªq§1¥>¤j¤¥¬§cª¬­H±5µ<¹]½zÁ‘ÅÉ|ÍFÑúÔŽØÜdß©âÏåäèÚëÂîŒñMôíö‰ùü€þÙ5v³ß  .06*! ùÞã!†#d%H'()+÷,ç.Ù0Ö2Ù4ä69;W=“?áAAD©F'I­K?NÓPpSÿU‡XìZ+]/_Þ`*bçb c]bÚ`C^™Z´U’O6H¦? 6+r ùr .þsó‰é›àÖØHÒôÌÐÈËÅÂÖÂ)ÂMÂöÂòÃ=ŸÆ\ÈÊåËÂͤϕфÓ}Õ}×~َ۟ݼßãáäOæ”èëêKí½ï:òËôe÷úÈü—ÿ`;æ ¬ `óW|Oº¦ø™dN5Ö ‰;þ ö!íÂã#Ú ÐzÇ¿t·±Ü« ¨‹¥Z¤O¤V¥9§Ö©­“°n´s¸’¼­ÀÈÄÉȻ̋ÐGÔÚ×bÛºÞ â2åMèIë3îñÅólöùŒûþh¿Es œ ² ÈÍÒË¿±—ƒeG!+#%í&Ê(³*˜,‰.v0w2q4„6“8¹:ç<#?pAÇC4F¨H.K¾MQPîRUXwZ»\Ï^`îaÍb cb0aÙ^a[¾VÙP»IgAþ7«-ª":¸ Y‡õjëMâJÚ€ÓîÍÉUÆÄÉÂ5ÂAÂоÃûÄlÆ È¿ÉŒËcÍKÏ/Ñ&ÓÕ×Ù"Û:ÝQßtá¨ãØå'èpêÖì=ï¿ñFôãö‹ùAüÿÔ¨ƒS " Öqá÷t}ñ°¬ÀÚïå ѳÿ«÷æî–åÜsÒ7ɘÀÙ¸2²Ç¬´¨ò¥‚¤A¤¥Ò¦H©_¬Ú¯®³ª·Ã»ä¿úÃÈ÷ËÐÏÓ-×±ÚÞeá™ä³ç¶ê£ízð;óíõ„øû‡ýóÿL˜Ö 0 M ahrgaO;%ì Ê"­$&o(T*;,'.024608L:|<±>ü@RCºE-H®J=MÐOkRþTŠWýYK\l^9`²a¦b c´bƒaa_\½WR7KCë9¾/Ý$€ø ‘ž÷Xí äÇÛÈÔïÎ`ÊæÆÄÃFÂ?«ÂùÄ$ƺÇgÉ6ËÍìÎÓÐÁÒ¹Ô´ÖµØÀÚÎÜèÞ á3ãoå¬çêWìÇî>ñÄóböÿø¼ûwþEîÈ ’ Píe¤˜/LÞÅå*w»ï  FùžðjçÛÝJÔöÊ6ÂHºg³Á­e©h¦´¤;¤Ý¤m¦Æ¨½«*¯ë²å¶õº¿-ÃCÇ1ËÏÕÒzÖÚrÝÂàûãç êííï´ògõø’úý|ÿÖ*eŸÄ æ û ÿóÚÉ© o"O$2&(÷)Ý+Ç-º/¯1­3¶5Æ7å9 ˆ@ÞB?E³G0J¼LROåQTW†YØ[^ã_labýbÒbÎaÙ_×\ªXGS¡LÇDÇ;Î1 'Ã:жùXïÊå^ÝÖÐ3ˆÇìÄAÃeÂ6Â’Â_Ã}ÄÝÅhÇÉÛʩ̎ÎpÐeÒRÔSÖOØYÚgÜ}ÞàÈâúä>ç‡éãëIîÁðDóÚõ|ø-ûîý¶‰^6  Æhë39áÈÐŒ…è? …ÖúXò8é·ß#Ö»ÌÞûª´Å®)ªå¦ö¤A¤¬¤¦H¨«®+²¶,ºJ¾iÂuÆsÊTÎÒÉÕTÙÊÜà\ãƒæ‹é„ì_ï.òàô‡÷ú–üÿb·÷1\ { •Ÿª¤ŸgO0 "ð#Ø%°'ž){+k-W/O1I3Q5^7{9Ÿ;×=@iBÇD7G³I=LÌNgQúSŽVYi[–]‹_&aObñbâbbJ`‚]YjTNdF =Ô32)‚ âûUñçõÞn×'ÑÌ1ÈaŋÆÂ:Â|Â2ÃEÄ•ÅÇÄÈ{ÊVÌ*ÎÐýÑõÓêÕí×ñÙÿÛÞ2à[âŠäËæéjëÐí@ðÇòTõø÷£úcý&ü˨u 8çiÂÕŽá¨ÓGà=Ûd ß_üôëáüׇΉÅE½öµÖ¯÷ªt§@¥Q¤Š¤¾¥Ð§ŽªÊ­y±Qµf¹~½œÁ®Å¯É“ÍfÑÕ©ØÜ{ß½âæåøèïë×îžñ`ô÷˜ùüŒþïD‰Âò  ->CE>1 ïÕ¶!–#x%X'=) + -÷.í0é2ë4ú695;h=¥?õAPD¾F5I½KKNçPuSV‡XöZ+],_Û`bÝbîbHb°`^fZƒUWOúGi?Ï5T+< ÆL þ\ózé•àÛØPÒÍæÈßÅÝðÂ@ÂmÂÃÄNÅÏÆnÈ'ÊùËÏͷϞєӆՊ׊ٙ۩ÝÉßéáäVæ èóêTíÈïBòÖôm÷úÒüÿf@è ¬ ^êOl< ‡Ðk+íÁ… +ãý«õÇìiãÓÙWÐ<ÇξQ·ï°Ô« ¨š¥l¤m¤v¥\§û©'­º°”´™¸³¼ÐÀåÄéÈÕÌ©Ð^Ô÷×tÛÖÞâMå^è`ëDîñÔóƒöù¡ûþzÒY„ ¬ Å ØàâÝÑÀ­‘yX!9#%û&Þ(Ä*ª,›.Œ0ƒ2Š4‘6©8Ì:ö<8?€AÙCDF¹H?KËMbP÷R‹UXzZÁ\Ë^‹`ãa¿bôbvba±^5[‰V¤PI)AÃ7n-u" ‹ ;kõ\ëHâJÚˆÓüÍ£ÉlÆ4ÄáÂQÂ[ÂéÂØÃŃÆÈÒÉžËrÍXÏ=Ñ2Ó'Õ"×(Ù-ÛDÝ\ßá®ãåå+èêÙìLïÂñSôëö“ùKü ÿÛ­‡T % ÒnÕã_\Ë„vƒ– “ xUÿP÷‰î<å°Û'Ò÷ÈdÀ±¸²¹¬¶¨ú¥•¤]¤1¥õ¦o©ƒ¬°Ó³Ï·ç»ÀÄ#ÈÌêϨÓF×ÈÚ/Þ|á®äÇçÎê³í‘ðKóö–ø$ûšý_¨ç < c n}{ofG:ý Ý"¾$ž&ƒ(e*L,;.)0%2"4,6B8_:Œ<Æ> AeCÌE:HÄJFMâOvR U’WZN\k^4`§ašböbšbca9_ö[‰WáQúJãBª9ˆ/¤$PÏ n…÷IíäÌÛËÔÏnÊÿÆ•ÄÃcÂTÂȤÃÑÄ9ÆÊÇ}ÉAËÍ÷ÎáÐÎÒÅÔ¾ÖÁØÈÚÚÜðÞá>ãwå·çêbìÏîFñÐófö ùÃû}þNõÆ – Iì[—ˆ0º™²ò1sž ³ÉåøIð çŽÝúÓºÊÿÁ!ºM³°­f©n¦Ç¤T¤û¤Ž¦ì¨ã«P¯³·»6¿RÃ[ÇTË+ÏòÒ‘ÖÚŠÝÖàä/ç5ê(íðÇòzõø¥ú"ýŒÿê9w°Ö ö íØ¼Ÿ €"c$>&)(*ñ+Ù-Ë/À1Á3Ç5×7ù9›@íBREÂG@JÍLZOøQ…TWˆYà[^à_fapbîb·b®a·_ª\}XSnLˆD;’1Ó&’« ùAïÆåWÝÖÐEËžÇÅZÀÂO¬ÂwÓÄòÅ|Ç&Éêʻ̛ÎÐoÒ_Ô]ÖZØbÚr܆ަàÓâåHçŽéíëPîÊðNóâõ…ø7ûòý¾Žb;  Åcã&)Éþ¤¦çRÄ=•ì(}úüñÛèfßÕÕz̨ջ޴²®&ªì¦¥Y¤Ê¤5¦j¨J«ž®W²<¶Tºj¾ˆÂ”ÆÊoÎ7ÒàÕlÙáÜ2àuã”æ é˜ìqïAòòô˜÷&ú¨üÿwÂ>p ‹ ¤³º·­¥‹~[D #"$æ%Æ'ª)’+z-k/_1\3c5p79±;ê=%@~BÔDJGÂIJLßNoQT•V Yo[–]‰_aEbÞbÌbòa&`W]aY5TÎM+Fc=˜3ü(ÍYãÈû;ñ›çêÞ}×,Ñ+ÌCÈzţáÂU“ÂMÃXÄ­Å-ÇÒÈ“Ê_Ì>ÎÐÒÔ÷Õù×ùÙ ÜÞ=àcâ•äÒæ éoëÜíGðÑò\õþ÷¬úhý/ÿÒ¨w 7âb¸Â|ć¬ªO÷ ‡üªó¨ê<á¬×DÎPŽص¿¯óªv§O¥i¤£¤â¥ô§°ª÷­–±}µ†¹ ½»ÁÏÅÉɲÍ|Ñ,Õ¾Ø8ÜßÔâüåéìåî·ñmô÷©ù+ü¡þüW™Õ % >LWRS>5áË!¥#Š%j'M)3+- /ÿ0ú2ü4 7!9I;v=¹?BcDÌFFIÌK[NðP†SV”X÷Z/])_Ô`bÉbÛb)b`÷]8ZNU#O¾G.?”5+ š" îýFóné‘àÝØ[ÒÍûÈ÷ÅõÃËÂZÂ…Â"Ã%ÄgÅáÆ€È:ÊÌàÍÀϰћӗՒו٢۵ÝÏßøá%ä`æªèûêaíÎïMòÞôw÷$úÝü¢ÿmEç ¯ WèA^'‡g©=õÔ¦w- Ø„ýRõnìã†ÙÐÇ£¾)·ß°È«¨¥¥ƒ¤‡¤–¥§ ªM­â°¶´¿¸Ó¼ñÀÅÉòÌÁÐwÔ ØŽÛéÞ4â]åwèoë\î'ñíóö,ù°û#þŽÞ/d™ ¼ Ô êðóîàÓº¦‡j!L#-% 'ó(Ñ*Â,¦.¡0”2›4¤6»8Ú: =G?AîCOFÎHJKÜMmPS•UX€ZÂ\Ë^„`Ùa­bâbYbï`Š^[\VkPGIï@ˆ77-@"Ûc UõPë@âPÚÓ Î¸É‚ÆNÄýÂhÂxÂÿÂïÃ(Å•Æ0ÈäɩˇÍaÏOÑ<Ó2Õ/×/Ù=ÛHÝj߆á¹ãïå5è†êæìQïÑñUô÷ö™ùTüÿ೉V $ ÎjÉöÐE?¢Y>HOS@ !ùþóö-îåä]ÛàѶÈ3À‹¸²®¬´¨¦¦¤x¤Q¥§—©§¬,°ö³ô· ¼%À;ÄAÈ0ÌÐÂÓ\×áÚFÞáÅäÛçàêÊíŸðcóö«ø3û¯ýs·û( V l „‹‘‹„p_E, !ð"Ð$°&”(w*_,K.<07244A6Q8s:ž<×>AtCÝEKHÓJUMòO~RU˜W ZT\g^4`aŠbäb~bDa_É[WW«QÀJ¦Bn9O/l$!¡ Nj÷9íùãÏÛÒÔÏÊǯÄ4ÀÂmÂâ¼ÃèÄOÆÝÇÉRË'ÍÏìÐÝÒÐÔÈÖÎØÏÚèÜöÞ!áFãåÂçêmìØîOñÙónöùÅû‰þQ#ùÈ • HçQŒsÿ”m€²ð'I ag‘øãï½æ2ݶÓuÊÌÁø¹2³¢­e©v¦Ú¤l¤¥²¦© ¬v¯8³+·?»Y¿rÃyÇoËGÏ Ó§Ö8ÚšÝñà%äEçIê;íðÛòŠõ+ø¶ú4ýžÿûH‹¾ê  '.)#çϱ ’"s$T&6(*,î-Ú/Õ1Ð3Ú5ë7:2¬@ÿBdEÏGTJÖLnOþQ•TWYâ[^Ý_Yagb×b¡bŽa_‚\IXÝR1LNDT;U1¡&Y낈ù.ï¾åWÝ#Ö ÐY˰ÇÅsÛÂkÂÅ‘éÄÆÇ8ÉüÊȨ̈ΑÐvÒtÔbÖjØlÚ{ܓްàÚâåPçšéôë]îÑðXóéõŽø=ûýýÁ”h:  ¾b׳ã{¯ðI‘Ðú ñ‚èß…Õ:ÌlÃo»n´¥® ªõ¦¥r¤è¤W¦¨p«Ä®}²d¶tº¾¨Â²Æ¬Ê‹ÎNÒýÕÙùÜJà‡ã«æµé¨ì‰ïPòõª÷7úºü%ÿ‰ÖO‚ š »ÀÍÅᦆrT 3"$ò%Þ'¸)¥+Œ-}/r1o3t5ƒ7 9Ã;û=:@ŠBëDXGÒI\LçN‚QTžVYm[]€_a5bÌb¶bÐa`)]4YþS—MíE*=[3Ä(œ'¦û.ñŠçïÞz×@Ñ8Ì\ȒżÿÂl°ÂcÃrÄÁÅBÇæÈ£ÊpÌMÎ-ÐÒ ÔÖØÚÜ(ÞDàoâžäÜæ&é|ëãíRð×òhõø·úný3 Ѱv 6Ü]ªµd¨e‚ãp­=¹ .¥ûNóKêçà^×ÿÍÅ꼸µ®¯ëª|§^¥¤Â¤¦¨Ùª®Á±Ÿµ«¹¿½ßÁèÅëÉÌÍ–ÑGÕÔØNܨßåâæéì÷îÉñô'÷»ù>ü¯þg«ä 5 P^ff`TA,õÛ!¹#š%}'])G+,-/1 35739[;‰=È?BqDàFUIÚKkNûP’SV˜XþZ.](_Ì`b¹bÃbbl`Í] ZUíNGõ>W5æ*ÓlüÍý6ó]é“ààØfÒ&Í ÉÆÄåÂx›Â>Ã:Ä~ÅöÆ’ÈMÊÌòÍÌϽѨӢ՜ע٬ۿÝÙßâ.älæ°èëdíÛïTòæô÷.úáü«ÿsIè ­ Tâ4QmDƒ Âb$Ü |+ýòôì¼â5ÙÈÏÆÆq¾ ·É°½«¨±¥˜¤£¤¸¥¢§Jªq­±Ü´â¸õ¼Á$Å!ÉÍÜÐÔ)Ø ÛßFâuå‰è†ëlî>ñûó¥ö<ùÂû7þô:z§ Í é ÷ñåͶ™|!]#?%')æ*Ï,¾.¯0©2­4´6Ð8ë:=X?¤AýCbFÜH[KêM{PS¡UX†ZÄ\Ç^`ÐaœbÍb=bÌ`a^ÙZ&V5P I´@J7þ, "ª; ûÿ;õCë:âRÚÓÎÏÉ•ÆkÄÆÂÂÃÄ@Å©ÆCÈôɽ˔ÍoÏ^ÑEÓAÕ8×=ÙDÛXÝmß—á½ãûå=è‘êîì^ïÔñeôùö¨ùUüÿ㻊\  Ð^Ää¿* |(  í Æ¢þöÕí‰äÛ”Ñ|Èý¿j¸æ±§¬°¨¦¹¤“¤q¥;§º©Ï¬Q°´¸,¼HÀYÄaÈLÌ ÐÜÓu×øÚ]Þ§áØäñçòêßí´ðvó!ö¼øHû½ý)Ë = ` ƒ ’ž£›”ƒqW?!#á$Á&¦(‰*q,].N0I2E4T6c8…:¯<ë>.AŠCêE_HÞJiMúOŽRU¢WZV\e^-`“a}bÎbdb%aê^[&WsQˆJhB59/9$ëy -P÷(íôãÌÛÝÔÏ“Ê.ÇÈÄNڇÂùÂ×ÃýÄcÆóÇžÉgË4ÍÏùÐçÒàÔÐÖÞØ×ÚñÜß'áTã†åÍçêyìÝî\ñÞówöùÌû‘þU+ùÍ “ FßJ{cçór=Nt­Ûø 1øï^æçÜeÓ9Ê–ÁÓ¹³˜­^©…¦ç¤‰¤8¥Ô¦7©-¬ž¯\³S·_»}¿Ã™Ç‹ËdÏ$ÓÄÖKÚµÝá<äWç^êOí%ðòò™õ@øÈúDý²ÿ [›Ïû  /8?=0( ÿÜà ¥"ƒ$f&G(+*,ü-ð/ä1ä3ì5û7:B½@CtEáGbJçLyO RŸT#W™Yá[^Ô_WaTbÇb†boam_T\X¨R÷KD;1f&-¹djù ï³åYÝ)Ö-ÐlËÇÇ8ŋ÷ÂÂã¤ÃÁÄÆŸÇPÉËÞ̵ΛЈÒxÔsÖqØuڈܘ޼àãâåWç¥éüëeîÜð\óöõ“øEûþÇšl<  ¾ZÓ  šÆ[S‚ÞB¥ü :yÁùDñ*è¾Þ;ÕöË;Ã=»Y´®!ªö¦)¥†¤¥w¦µ¨”«ë®¢²†¶šº¬¾ÉÂÏÆÉʧÎjÒÖ›ÙÝaàã¿æÉé½ì›ïdòõº÷MúÈü:ÿ™æ0_“ ¬ ËÐáÔÖÀµš‚f F"($ &é'Ï)³+ -Œ/‡13†5—7®9Ù; >J@ŸBøDjGãIgLûN‰QT¨VYu[›]~_a)bºbŸb´aà_]YÏSZM¸Eè<'3‰(iüšûñ€çëÞ€×LÑFÌsÈ¥ÅÚÃÔˆÂÇÂ|ÉÄÕÅWÇöȶÊ}Ì\Î<Ð'ÒÔÖ ØÚÜ2ÞPàuâ©äåæ/é‡ëëí\ðàòpõø½úwý; Û®z 4ØV¦OŒGV´9Îeîf ÓLûïòöéà×»ÍÛÄ¿¼˜µ™¯çª}§n¥•¤Ü¤%¦:¨ýªC®ã±ÆµÎ¹ã½þÁ ÆÊêÍ®ÑaÕíØeܾßüâ(æ1é/ì ïÜñ•ô9÷ÍùPü¾þ't¾÷$ F bmzurdU;% é!Í#«%'q)V+@-//!13"507F9l;›=Û?*BDñFcIíKtN QšS+VŸX[0]%_Ç`ùa§b¯bîaK`¤]ÜYæTµNHG¸>5­*ž=Õ¯ýóSé‹àåØoÒ6Í!É(Æ&ÄѵÂVÃPēŠǧÈ[Ê(ÌüÍÝÏÊÑ³Ó±Õ¦×­Ù·ÛÆÝéßâ=äpæ¾è ësíàï_òíô‰÷4úìü°ÿzMí © T×-@þT#]ÙŽNÕ‰ %Îü–ôºëcâçØÏÆ=¾ì¶­°»«¨¿¥­¤¾¤Ø¥Ç§lª›­+±µ¹½2ÁCÅ?É+ÍöЪÔ=ؽÛßaâ‡åžè™ëîQñô¸öOùÓûJþ®M‰¸ à ÷ õ߯¬Ž!m#P%1')û*à,Î.Ã0¹2¾4É6Þ8;-=l?´ADtFìHiKúM…P S¦U)XŠZÆ\Ç^y`Äabºbb°`5^°ZñUPÏHz@7Å,Ò!} Úÿ'õ0ë8âQÚ¦Ó)ÎàɱÆÄ0ß§Â5ÃÄUÅ¿ÆUÈÊÌˡ̀ÏhÑVÓKÕC×JÙLÛbÝyßžáÉãæCèêöìeïáñjô÷«ùbü!ÿa  ÏW¹Ù©ÿWú×ÈǸœ oEþ9öví8ä¼ÚNÑ?ÈÌ¿E¸Ð±›¬²¨ ¦Í¤¬¤’¥[§â©ó¬x°@´=¸O¼hÀyÄ~ÈfÌ@ÐïÓ’× ÛtÞ½áìäèëóíÃðŠó2öÐøYûÎý9’ÜL s “ £±±®¤–€jM1!#ò$Õ&µ(›*„,m.d0U2^4`6z8’:Æ<ø>DA—CûErHêJ|MP R&U­WZ[\c^*`ˆanbºbJbaÅ^p[óV=QMJ.B÷8Ø.ÿ#½M 4÷íçãÑÛâÔ,Ï«Ê>ÇåÄgò¥ÂÃðÃÅyÆȰÉwËCÍ&ÏÑ÷ÒæÔäÖàØêÚøÜß2áZã”åÓç%ê}ìëîbñéó‚ö#ùØû•þ^0þÑ GÚ>rNÐÖJ<f¦ ®µÿÒ÷0ïæÜÓôÉdÁ¨¹þ²ˆ­^©¦û¤¢¤W¥÷¦[©V¬Ã¯…³t·…»œ¿±Ã¹Ç¦ËÏ<ÓßÖbÚÎÝáPäoçpêeí8ðó®õRøØúYýÁÿj°Ý $ AIPMC7î× ³"—$w&X(?*",.0õ1ø3ý58,:U<‹>Ñ@"C„EôGqJ÷L‡OR¨T.WœYæ[^Ñ_LaIb³bmbQaF_)\êWoR¿KÙCÙ:â0.&ùŽ?Lùï¨åXÝ.Ö:Ð}ËÜÇOŦÃÐÂŸÂøÂ¿ÃØÄ0ƹÇ]ÉËëÌÆÎ©Ð”Ò‡Ô{ÖØ}Ú–Ü ÞÊàêâ$åaç­é ìlîåðgóþõœøOûþÑžp?  »WÈõƒ©6(N£þ\§ çgùäðÓçhÞîÔµËû5´ƒ®ª§6¥ ¤&¥˜¦Û¨¹«¯Å²°¶ººÑ¾éÂîÆæÊÂ΃Ò-Ö³Ù%Ýwà²ãÕæÝéÒì®ïwò-õÌ÷aúÙüMÿ©ü<xœ Å ÕèêíáØÁ¯‘y X"9$&ú'â)Å+±-¡/”1”3š5¦7Å9å; >]@®B EyGóIxLO™Q'T²V!Yz[˜]_a b¨b„b—aº_Ø\ÑX—S#MyE¯<æ2S(3ÏtnûñtçêÞ…×VÑỶȾÅôÃî¤Âà—ÃÄïÅgÇ ÉÃÊ’ÌgÎMÐ3Ò$ÔÖØÚ(Ü=ÞWàâ±äñæ7é‘ëñíjðæòyõøÅú}ýDà±x 4ÒN‘–8q".‚‰ œ xïú”òšé=àÃÖwͦļ{µˆ¯ßªˆ§x¥¯¤ù¤F¦_¨$«g® ²ëµï¹ ¾Â-ÆÊÎÊÑwÕÙyÜÖßã:æIé>ì#ïìñªôI÷àùaüÓþ6‡Î5 Y o„…‹veN6 ý!Û#À%'ƒ)h+R-@/312315E7U9€;¬=î?:B•DþFwIøK†NQªS.V«X[3]!_À`ëa™b•bÓa'`{]®Y±T}NGy>æ4o*p ±‘ý óFéŠàçØ}ÒFÍ5ÉDÆ=ÄèÂÑÂnÃhĨÅǹÈnÊ6Ì ÎëÏÖÑÁӹճ׸پÛ×Ýéßâ@ä}æÆèëíæïjòôô‘÷=úòüµÿO$é « NÎ$,ì41¬RÔ‹3 Ìtü<ô^ëâ˜Ø>ÏPƾȶœ°³«¨Ï¥À¤Þ¤ö¥ì§“ª¾­T±'µ(¹<½PÁcÅ\ÉFÍÑÄÔTØÔÛ*ßxâ™å¶è©ë–îañ#ôÈöbùäû[þ¿^šÉ ñ #'!îÛº !#b%A'&) +ò,á.Ó0Ì2Ð4Ú6ñ8;B=y?ÈAD…FûH{KN˜P#S·U*X‘ZÇ\Â^v`µa€b bbŽ` ^ƒZ¿UÇOšH;@Ù6Œ,¡!Pë ¼ÿõ$ë3âXÚ¯Ó;ÎõÉÅÆžÄGýÂÀÂLÃ6ÄgÅÖÆfÈÊÛ˳͊ÏxÑ^ÓYÕM×RÙYÛj݄ߤáÔã æOè¤êüìpïèñrô÷±ùjü'ÿñÁ‘^  ÊQ­É•÷â-Π‹ƒjN ðýÛõ"íàãpÚÑÈž¿"¸»±‘¬µ¨*¦â¤È¤¯¥ƒ§ª­œ°e´a¸o¼‡À™Ä˜È…ÌTÐÔ¥×%ÛŠÞÑáåèëîÖð›óDöäøeûæýC¨é0\ … £ ´Àż·¥’|]B!$#%æ&È(«*–,~.t0k2j4w6…8©:Ò<?PA¬C F~HÿJ‚MP£R5U¯WZW\g^ `‚a]b¥b0bâ`Ÿ^E[ÂVQJóAÁ8ž.Ï#' ì!÷ íçãÓÛìÔ?ϹÊ]Ç÷ĆÃͺÂ/ÃÿÃ/ňÆÈÀɆËRÍ5ÏÑÓòÔëÖïØðÚÝß:áfã™åàç)êŠìñîkñðó‰ö+ùßû›þe1Ð DÏ:^=µ¸$èáÿ#EW W_ÿv÷Úî¯åBÜØÒ¸É2Á†¹á²€­]©–¦¥¼¤u¥§€©z¬é¯©³–·©»º¿ÑÃÓÇÂË›ÏTÓõÖ{ÚßÝ3ábä„ç„êuíMðóÃõ_øîúgýÕÿ,€»ô ; O[b[XD4ä É"¥$‰&k(N*8,.0 246!8=:i<›>â@4C”EH}JM“O%R³T5W¢Yí[þ]Ñ_?a=bŸbTb1a _ÿ[·W?RƒK¡Cœ:«0ù%Æg8ùûî£åXÝ8ÖGБËòÇjÅÀÃê¹ÂÃÙÃíÄGÆËÇpÉ-ËûÌÑλÐÒ•ÔˆÖˆØÚšÜ°ÞÎà÷â+åkç¸éìyîëðsóö¦øVûþÖ£t@  ·RÀóämˆùf»U ‘À ù‰ð{çÞ¤ÔvËÊÂñº´s®ª §G¥º¤C¥¼¦þ¨á«9¯ì²Ó¶Ýºô¾ÃÇËÛΡÒ@ÖÎÙ9ÝàÅãëæïéçì¿ï‹ò=õá÷oúîü[ÿ½ R„± Ô æúúÿñêÒ¿¤‡ k"K$+&(ï)Ú+À-´/¦1¦3«5¸7Ö9ù;->r@»B!E†GJ‡LO¤Q3T¸V(Y|[™]z_þ`b—bkbya–_®\ XeSèLCEr<°2(§NWûòðnçèÞŽ×dÑmÌœÈÙÅ Ä Ã¿Âú­øÄþÅÇÉÙÊžÌxÎXÐ@Ò1Ô&Ö"Ø(Ú0ÜGÞbà‹âºäùæAé™ëûípðïòõøÌúƒýJä±z /ÏAˆ!XùNÅKÖM½–ú:òAéìßuÖ7ÍkÄk¼Yµ}¯Öª§Š¥Ã¤¥e¦„¨J«®0²¶º)¾<ÂHÆ=Ê!ÎâÑ’ÕÙ“Üéß*ãKæ^éRì3ïò¶ô_÷ñùsüäþF™ßF h …Ž•–…w^H, "ò#Ì%²'•)w+g-O/H1A3D5U7j9;¾=@GBªD GˆIL”N!QµS7V²X[3]_µ`åa€b…b°a `O]Y€T@NÙF>>«4<*:âŒvýôò@é‚àó؆ÒXÍMÉWÆ[Ä5ÃÅÂê‰Ã}ÄÀÅ3ÇÈÈ„ÊBÌÎûÏßÑÒÓÀÕÃ×¾ÙÎÛÚÝúßâNä…æÎè ë„íðïtòûô÷?úýü¹ÿˆR&è « FÊÔãzÎ9ß uüáóë»áJØøÎÆå½©¶‡°ª«¨Ú¥Ù¤ö¤¦¨¹ªå­x±MµK¹]½sÁ€Å{É`Í+ÑÛÔoØçÛGß…â¶åÃèÂë¥îxñ2ôÝörùöûmþÐ)n¬Ú  ,672'çѬ!–#o%U'8)+ -í.é0Ü2â4î69&;R=?×A0D•F I‡KN P4SºU6X•ZÇ\Â^k`°akbbçai`é]QZUO`H@œ6U,j!#Á Ÿÿúôë-â\Ú¸ÓMÎÊáÆ°ÄhÃÒÂÞÂdÃKÄ€ÅéÆ{È)ÊîËÀÍœÏÑoÓ`Õ\×\ÙcÛu݌߱áÜãæZè©ê íqïöñzô÷½ùlü1ÿöÇ“b  ÈH£»~ᾡeP: ÷ ¿ýƒõÁìŽãÚÄÐÄÇo¿ÿ·£±‰¬¶¨6¦÷¤á¤Ñ¥¦§'ªD­Á°‹´†¸’¼§ÀºÄ²È¦ÌkÐ)Ô¾×<Û¡Þæáå,è0ëîîðªóZöóø{ûóýZ¶ý>o • ´ ÆÐÕП£ŠqS!3#%ô&Û(½*¦,“.„0}2~4…6œ8¸:å<?dA»CFH K”M#P±R>U¹WZ[\c^`vaObŽbbÁ`x^[VÓPÛIºAƒ8h.˜#^þ Ë÷þìÞãÕÛõÔLÏÎÊqÇÅžÃçÂ×ÂDÃÄ?ŤÆ)ÈÙÉ’ËfÍ=Ï&Ñ ÓÕ÷Ö÷ØþÚ Ý#ßEánã¦åäç8êŽìþîpñüóö5ùäû¤þh7Ð ” ;Ï)W$¢”¹®Àáø ÿ÷~îWåñÛŒÒzÉÿÀ^¹Í²o­^©Ÿ¦ ¥Ö¤”¥=§¤©¢¬ °Ï³¼·É»ß¿íÃôÇÝË·ÏnÓבÚùÝEá}ä“çœê‡íað%óÖõqøûxýãÿBŒÐ ) N ^mslhXB0û Ò"¿$•&€(]*J,2.$024#628O:y<­>ò@FC¤EHŽJM O2R½T;WªYë[^Ì_6a-b‹b:baü^Ò[ˆWRPKcCe:s0Á%š;úùìîšåZÝ?ÖWÐ¢Ë È~ÅÞÃÃÒÂ,ÃîÃÅYÆáÇÉAËÍäÎÃЯÒԖؘ֑ڤܷÞÜàüâ9åpçÂéìî÷ðwó ö­ø[ûþÚªuD  ¶K´èÍYhðÎé)|Ä 7k¬ø3ð!çÅÝ[Ô4Ë–Â˺þ³h®ª§U¥Õ¤_¥ß¦#©¬`¯³÷¶»¿(Ã+ÇË÷ιÒ[ÖåÙPݤàÛãÿæêûìÒïòQõñ÷‚úÿülÿÎa—Á å ù ÷æÐµ™ |"Z$@&(*ç+×-Á/¾1³3¿5É7é9 @ÑB.E˜GJ“L$O¯Q>TÃV,Y€[˜]x_ó`bƒbTbZas_‚\qX/S±LE7j4*¸aYýÝò3éàôØ”ÒfÍdÉoÆtÄPÃÝÂߨÄÔÅGÇßÈ‘ÊXÌ)Î ÐîÑÝÓÐÕÊ×ËÙ×ÛæÝà'âT䓿Ôè-ëŒíúï|òõ¡÷NúþüÄÿŠY'î £ GÀ ¼¾àJà”@ñ… ¹ûó­êaáü×±ÎÝŶ½ˆ¶r°£«¨é¥ë¤¥8¦4¨Ýª®œ±vµm¹‚½“Á Å˜É}ÍEÑ÷Ô†ØÜ\ßâÌå×èÖë»îˆñGôðöƒù ü}þã9¾ì  ,=IHB8(üÞÂ!¤#‚%i'F)0+-/õ0ó2ó4ÿ696;c=¢?èABD¥FI—K%N­P@SÄU=X™ZÈ\Â^d`£aZbwbÌaF`À]$ZWU[O!HÇ?\6,2!ô˜ €ÿáô ë'â_ÚÃÓZÎÊõÆÎÄ}ÃïÂ÷Â|ÃfÄ”ÅýÆÈ9ÊÌËÍ®ÏÑ|ÓmÕg×fÙqÛ|ݚ߸áèãæcè³êí€ïûñ„ô÷Áù{ü2ÿɘ`  ÂD˜©n¢Ýp0÷Î¥ d4ý%õfì5ãÊÙ|Ð…Ç@¿×·±{¬º¨?¦¥ù¤ó¥Ç§Pªj­è°±´«¸´¼ÌÀÖÄÔȿ̊ÐCÔÕ×WÛµÞýá0å@èDë,îÿðÀóköùûþmÅQ~ ¬ Á Ûáèá×Ë´‚d!I#&% 'ê(Ò*¶,§.•0‘24˜6°8È:û<-?yAÉC1FHK¢M0P¾RGUÂW$Z^\a^`kaAbybúa¢`M^íZZVPžI|AE8-.`#-Ð ¨íöíìÖãÔÛþÔXÏãÊ…Ç,źÃÃòÂ^Ã3ÄZŵÆ@ÈèÉ¥ËuÍNÏ1ÑÓ Õ×Ù ÛÝ1ßJá}ã«åôç<êìï|ñô™ö>ùìû­þl? Ó ’ ;Æ#D„xÙu‡—­± §¦þÀöîÿäÛBÒ<ÉÊÀ8¹°²e­]©§¦6¥ì¤·¥]§Ì©Å¬8°ó³á·ð»þ¿ÄÈúËÓψÓ(רÚÞ\á‘ä«ç®êísð9óèõ†øûýöÿQ¢Þ > \ s~‚whX<(!í"É$®&‹(u*Y,F.60,2-436F8a:Œ<¿>AUC¶E%HJ&M¬O?RÇTGW¬Yò[þ]Æ_/abyb bò`Õ^¥[WWÏQK'C(:50Š%f ØùØî‘åXÝBÖgаË#È–ÅöÃÃíÂEÃÄÅnÆõÇ‘ÉRËÍñÎÔÐ¹Ò«Ô ÖØ¤Ú­ÜÅÞâà ã=åçÅé%ì‡îþð„óö¸øaû þâ¬}B ±I§ß¸AMË¡·ï6~³ ã UøÏïÏæjÝÔîÊdºå³T®ª§k¥é¤€¥§H©+¬‰¯3³ ·!»7¿FÃKÇ:ËÏÑÒvÖüÙgÝ»àñãçê íêï®òeõø”úýÿÞ.r¨Ô õ # öáȪ "n$O&1(*ü+æ-×/Ê1Ë3Ì5á7õ9!—@àB>E­GJ©L,O¾QHTÈV8Y[œ]q_ì`÷aqb:bQÈSLV¾X[7]_«`ÆadbOb{a½_ü\"YTÕM_FÇ=44Ê)Ј:<ýÉò%é€àõØŸÒwÍvɇÆÄiÃùÂõñÄêÅ[ÇòÈ ÊiÌ8ÎÐûÑèÓÝÕÒ×ÚÙÝÛôÝ à3â]äšæáè3ë•íð‚òõ©÷TúýÉÿ’\*í ¥ ?¼ü§åž¶¨Qýž5 Â_û(óRêá®×nΤʼn½g¶`°œ«$¨õ¥¥2¥X¦Z¨«2®Ç±”µ—¹ž½¸Á»Å·É™Í_ÑÕžØÜrß´âÝåïèéëÍîŸñVô÷”ùüþóLÏý # <PXXXG<# ðÔ!·#”%x'Y)A+(-/1357(9H;t=´?øAUD¶F+I¨K1N½PHSÑUBXžZË\½^``—aKb`b®a&`•]øY#U$OæGŠ?#6á+!Às ]ÿÎôûê#â`ÚÌÓkÎ0ÊÇåĚà ÃÕÃ|Ä­ÅÇ¥ÈKÊÌÝͽϙьÓwÕs×sÙvÛÝŸßÆáïã+ælè¿êí‰ïòô%÷Ëùü<ÿÏ›a  ¾<Ž™Y¨~·@úÏ®ƒN ×üËô ìàâzÙ5ÐJÇ¿³·{±q¬»¨N¦¥¥¦ê§xªŒ­±Ô´Ð¸Ö¼îÀõÄõÈÖ̪ÐVÔó×lÛÌÞâBåVèZë<îñÑóöùŸûþ}Ú a’ ¸ × èöô÷äß°”v!Z#7%'ý(á*Ì,µ.«0 2¢4«6¿8Þ: =C?†AÞC>F¯H,K¯M?PÇRTUÆW+Z_\_^`_a1bdbàa`'^¾Z*VePgIAA 8ô-)#§ ‰ÖöÝìÓãÖÛÕiÏöÊœÇHÅÏÃà ÃwÃMÄnÅÉÆVÈ÷ɹ˃Í]Ï=Ñ)ÓÕ×ÙÛ!Ý8ßVá…ãµåüçFê¥ìï„ñ ô¢öAùùû®þx? Ô ‘ 9½3iZ°`@GU_] QIþeöÃí«äKÛüÑüÈ™À¹š²X­^©²¦H¥ ¥Õ¥§ñ©í¬\°´¸¼À2Ä,ÈÌéÏ¥Ó>×ÂÚ'Þqá§ä¾çÅê®í‰ðKóúõšø!û ýf°ñ( M o „Œ—ˆ}eR6!ý"Û$Á&œ(ˆ*i,Y.G0?2?4D6Y8r:<Ó>AiCÅE5H®J2M»OKRÐTPW±Yô[þ]Á_%abcbbÓ`­^|[$W™QÜJéBò9ö/Z%/ç³éøÇî‹åXÝLÖtÐÃË:ȰÅÄ:ÃÃ`ÃÄ2ņÆȧÉaË)ÍÏáÐÆÒ¸Ô«Ö©Ø®Ú·ÜÐÞëàãIå†çÓé-ìî ñˆóö½økû&þæ´}H  ³>¤Ì§)-¨r„¯õ-f ‡¶ÿó÷xïsæÝÈÓ°Ê.ÂwºÇ³I®ª!§|¥¥œ¥'§h©W¬©¯^³A·H»W¿hÃhÇXË/ÏìÒÖÚÝÐàä'ç0êíýïÄòtõø£ú$ý’ÿîC€¼ä  )3.* ñÙ½ Ÿ"$_&F(#*,õ-é/ß1Ø3å5í7 :3¨@ïBSE¸G5J²L>OÉQQTÕV:Y…[›]l_ç`æaabba(_-\XÄR@LDÀ;ý1v'jãÿúºðMçâޠ׆ѢÌÝÈÆ[ÄVÃÃFÃøÃùÄCƹÇVÉ ËÍ̧ÎÐkÒTÔKÖDØHÚQÜfÞà¦âÚäçaé²ëî‹ðóžõ4øæú˜ý]$ï»x -¼+aKáþ’…ºˆ÷_ º€ù'ñ6èîÞ’ÕmÌÈÃ廵@¯Ñª™§¾¥¥r¥É¦ó¨¹«¯¡²¶º¾¡Â Æ˜ÊpÎ5ÒÜÕeÙØÜ+àkã‹æ›éŽìoï:òñô•÷)ú§üÿzÎK} ™ º¿ÒÊȼ¨•|] D"!$&å'É)¯+™-‰/z1z3{5‰7¡9Å;õ=4@}BÛD@GµI6L»NKQÓSVVÃX[5]_¢`»aQb8b_a˜_Õ\ñXäSšM'F=÷3–)[ý¸òé~àûت҉͉ɡƥąÃÃ6ÃÒÃÃÄÆmÇɳÊwÌIÎ"Ð ÒñÓêÕÝ׿ÙèÛüÝà9âj䢿ëè=ëží ðŠòõ±÷]ú ýÐÿ–`-ë ¥ :³ðï‘Ê{êo´QßlûÏò÷é¾à]×/ÎhÅ_½H¶K°—«&¨¦¥M¥{¦}¨'«Z®é±¼µ¸¹Ã½ÖÁÛÅÔɲÍ~Ñ$ÕºØ,܈ßËâñåéþëàî±ñjô÷¨ù.üŸþ X¦Þ 6 Lbgmd\J6 â!É#¥%‹'j)R+9-)/135"7:9Z;ˆ=Ã? BcDÈF:I·K>NÉPTSØUKX¡ZË\¼^X`Ša´)¸2¼CÀNÄJÈ6ÌмÓZ×ÕÚ@Þ…á¼äÓçØêÂí›ð\óö¨ø6û®ýtÃ9 ] ”ž©ž‰ybF-! #ð$Í&²(˜*z,m.V0S2O4X6h8†:­<ä>(AwC×EEH»JBMÈOURÝTTWºYó[ÿ]»_abPbëa³`‰^M[õVcQ£JµB°9Å/ %¼–Ìø¿î~å]ÝTÖ€ÐÛËLÈËÅ)ÄSÃ"ÃuÃ9ÄHÅÆÈ»ÉoË9ÍÏìÐÓÒÅԴֵضÚÃÜ×Þ÷àãUåŒçÞé3ìœîñ•ó#öÇøqû,þí¶‚G  ­:˜»™ ~INv±æ 6Zÿ÷ïæÍÜÓsÊýÁRº¯³=® ª+§Ž¥¥»¥F§©x¬Ò¯‚³e·j»w¿†Ã†ÇuËIÏÓ§Ö)Ú˜Ýáà ä7çGê.íðÔò‡õ,ø´ú6ý¢ÿR’Ìô  .8E<<*êÍ ±"$t&R(:*, .ù/î1î3ð58:D¶@C`EÊGBJ¿LKOÕQ]TÚVAY†[œ]g_Û`ÝaGbbú`_\âWR LXD‡;Æ1B';÷Ãåú­ðBççޥזѵÌðÈ>ÆmÄyÃ"Ãcà ÄÅXÆÌÇgÉËà̱ÎÐsÒcÔTÖPØPÚ[ÜnÞŠà±âàäçfé¿ëî•ðó£õ?øéú¡ýa'ôº{ '·"Q<Æâm[…ÝD± i¹'ùÏðÝç ÞEÕ0ÌÃÁ»å´7¯Çª§§É¥"¥Ž¥ë¦©ß«'¯Æ²£¶ º°¾»ÂÃÆ²ÊŒÎMÒóÕ~ÙîÜAàãŸæ°éŸì„ïIòõ¥÷;ú¸ü-ÿ‰â"_‰ ® ÅØÜàÕз§Šr R"4$&ô'à)¼+¯-–/1‹3Œ5›7³9Ö;>D@BèDTGÀIILÇNXQÜS_VÉX[4]_—`±a°«-¨¦1¥g¥ž¦œ¨O«}®²ÞµÜ¹á½øÁ÷ÅòÉÊ͘Ñ;ÕÓØAÜ ßÝâæéìôîÂñ~ô#÷¼ù<ü³þk´ð G \rx|vk[F. ø!Õ#º%˜')a+N-7//1&3)547J9k;š=Ò?BrDØFIIÆKKNÖP\SãUOX§ZË\¹^P`a*b1bzaÞ_H]œY¾T»NrG?±5s+ž f* #ÿ¤ôäêâhÚãÓ‰ÎZÊ;ÇÅÍÃ>ÃAÃÊçÄÚÅ9ÇÈÈoÊ0ÌûÍÖϷўӔՅ׉َۜݵß×áä>æ|èÑê-íšïòô6÷ÙùüHÿÔ£`  ².uz0q>fâŒS"ë© b%üô\ë9âáØ­ÏÚÆ²¾v·P±b¬Â¨d¦L¥L¥S¦0¨¾ªÛ­W±!µ¹½(Á7Å(ÉÍÚЊÔ!Ø™ÛøÞ?âjåè{ëfî7ñ÷ó£ö<ù¿û<þžûE€µ Ú ö øì̹—!|#[%=')+è,á.Ä0Ë2À4Ñ6á8;,=d?ªAýC_FÎHHKÌMVPÞRdUÖW3Za\[^`Iab8b©a?`Ù]gZÈUùO÷HÎ@š7„-Æ"¡^ I«öÃìÇãÜÛÕ‡ÏËÍÇvÅÄQÃ<ëÃxÄÅòÆzÈÊÖË£ÍyÏWÑAÓ.Õ&×"Ù%Û8ÝGßoá’ãËå èZêµìï–ñô²öSùü½þJ× 1°Û7fÖÎÉ̹ §–ý°õíä®ÚqуÈ:À˸m²B­a©Å¦p¥;¥¦Ê§5ª;­¦°b´P¸Q¼dÀkÄiÈQÌÐÕÓp×ïÚSÞžáÍäêççêÙí«ðróö½øCûÄý'‰ÒH p ‘ £³³·¦ „vW;A‡CéESHÍJMM×O_RæT\W¿Yô[ý]µ_aòaÊ@CsEÙGQJÐLVOâQfTãVGY‰[˜]f_Ð`Ña4bóaß`ß^Û[­W^RÐKDO;Š1 ' Ç£Çú™ð:çãÞ­× ÑÇÌÉSÆŒÄÃ@ÃzÃ'Ä'ÅlÆâÇxÉ,ËîÌÂΜЃÒmÔbÖZØ]ÚeÜyÞ“àºâíä#çtéÃë,î›ðó«õHøòú¨ýf0õ¿x &³G'²ÁN.T¢fÁ fÇøxð…çKÞüÔíË\׻ȴ(¯Áª°§Õ¥<¥¨¥§7©¬J¯ï²Ã¶ÉºÌ¾àÂ߯ÍÊ«ÎeÒÖ“ÙÝWà•ãµæÂéµì–ï^òõ»÷JúÍü:ÿ î9lŸ » ÜâôëëÝË·ž f"C$*&(ð)Ñ+¿-¨/¤1—3¤5ª7Æ9è;>V@¡BùDbGÕIPLÚN_QìSeVÒX[7] _‘`£a+b b aT_‚\’X}S*M²E=€3))4ÊåüòéwàٿҪʹÉÌÆÜÄ´ÃJÃgÃÄñÄ.Æ–Ç)É×Ê–ÌfÎAÐ!ÒÔûÕú×öÙÿÛÞ+àJâ€ä²æÿèOë°íðœò)õÂ÷júýÛÿŸk.ñ œ 4žÛÊh89ˆþ’"· 4½MúòHéàÉÖ¦ÍúĽ ¶(°Š«2¨¦J¥¥À¦¿¨w«¡®7²¶º¾ÂÆ ÊëͯÑXÕêØYÜ·ßóâæ+é$ìïÖñô7÷ÏùOüÆþ&€Ä/ W p‚Іj[=) "ê#Ê%«'‘)s+`-I/A173=5D7]9~;©=ç?,B…DèFYIÕKYNâPjSéUZX§ZÐ\³^L`qabb`a¸_"]iYT|Nu5<+d :þ ÿôÓêâiÚìÓ˜ÎnÊOÇ3ÅåÃWÃ^ÃßÃÂÄíÅNÇÜÈÊBÌ ÎåÏÄѬӟՑוٗۨݾßâá äFæˆèÙê8í¢ïò¦ô>÷äù‘üRÿÛ¥b  ¯(go]B¯VÚ R Ëû¹óëàá”ØfϠƾW·6±^¬À¨v¦[¥m¥o¦U¨åªÿ­‚±Dµ9¹<½OÁQÅKÉ,ÍöÐ¥Ô8Ø³Û ßXâ|å—èëyîMñ ô¶öLù×ûKþ³ T•à î #." ùâȧ!#j%Q'0)+û,ð.Û0Ù2Ö4à6ô8;?=t?½A DrFÜHYKÛMdPèRpUÜW8Ze\X^ÿ_Aaÿa(b‹a`°]:Z“UÄO»H’@_7H-“"l8 $”ö²ìÀãÞÛ!Õ–Ï/ËâÇÅ ÄjÃXÃÂÑıÅÇÈ/Êç˲͈ÏeÑNÓ;Õ2×,Ù5Û<ÝXßsáŸãÕåèbêÀì'ï ñ%ô¸ö^ù üÄþˆIÔ +«÷ Åú=Õ Žˆ{i M>ýUõºìªã_Ú)ÑGÈ À¦¸V²6­c©Ï¦…¥U¥0¦î§Zªa­Ì°ˆ´r¸x¼ƒÀĆÈmÌ;ÐðÓ‡×ÛhÞµáâäÿçüêìí¿ð…ó0öÍøZûÑý=—å%Z ¢ ´ÅÄÆ»®›„jN!1#%ö&Ñ(¼* ,‹.0t2t4|6‹8«:Ð<?GAœCøEdHÝJZMèOiRòTcWÄY÷[ý]®_ aâa(b¸ap`>^öZ‘VúP0J=B>9O/¶$¡jNœø™îråXÝeÖ˜ÐÌxÈúÅ]ĆÃVèÃhÄwÅÄÆ?ÈÞÉ’ËXÍ,ÏÑïÒÛÔÏÖÊØÌÚÙÜìÞá3ãaå¦çíéGì¬î#ñ¤ó7öÖø€û:þùÂ…O ÿ ¬*‡ŸqÜÓ6ïåþ+Qp Œ¥þêökînå/ÜëÒùÉ–Áº~³® ª:§´¥J¥ü¥‡§Û©Ã¬°Ì³¯·­»½¿ÃÃÄǫ˃Ï6ÓÙÖYÚÅÝáJäaçkê[í3ðüò®õKøÝúVýÇÿ!u´î 5 RZg_\M<)ô Ð"µ$–&u(]*C,,.0246'8=:f<˜>×@(CEìG]JàLfOëQtTéVMY[—]a_É`¿a$b×aÃ`¶^±[~W'R›KÜC;M1×&Ö~ªúŠð,çåÞ®×°ÑÕÌÉmƟįÃSØÃ:ÄBÅ€ÆöÇÉ:ËÍÐΫÐÒzÔlÖeØiÚo܄ޜàÆâòä5çwéÒë2î¥ð%ó³õQø÷ú²ýj7÷Áy "­8˜§$mº!m ¼ qøð3çõÝ·Ô§Ë+Ãj»¯´¯Àª²§ì¥O¥É¥0§\©-¬q¯³é¶êºð¾þÂþÆíÊÂ΄Ò#Ö°ÙÝoàªãÊæ×éÉì¨ïsò(õÌ÷^úÜüPÿ®G€­ Ð êöþüì߯±‘ x"U$;&(þ)ä+Î-¼/µ1©3µ5¼7Ø9û;(>i@±B ErGãIaLæNnQôSpVÕX [3] _‡`•abîaa,_X\eXDS÷LuEÜ<5+. Ô êþrôÍêâpÚõӨ΂ÊgÇJÅÄrÃtÃüÃÕÄÆbÇîÈ“ÊRÌÎõÏÏѽӦբך٥۲ÝÇßíáäQæèãê?í®ï#ò²ôC÷íù™üXÿà¥d  «]^þB÷…Ø“O ±qû`ó©êŽáGØ!ÏeÆW¾/·*±N¬Ê¨{¦x¥€¥•¦u¨ «&®¤±lµZ¹b½lÁrÅiÉGÍÑ»ÔTØÆÛ)ßhâ•å«è£ëî]ñôÆöaùæû^þÄh¤Ø û +9<5/ ô׿!›#%`'D)'+-ü.ò0è2è4ó69';L=Š?ÊA!D€FìHjKæMrPöRtUéW8Zh\V^ú_5aðabraú_]ZfUˆO†HT@%7-X"C wö§ì¶ãàÛ)Õ£ÏDËôǬÅ5ĈÃmÃÞèÄÈÅÇ¡È@ÊúËÁÍ•ÏuÑYÓHÕ>×8Ù>ÛJÝ^߀á¨ãÝå èmêÈì1ï¨ñ-ôÃöcùüÊþŒRÙ &¥ëú±ÛªhRC0 ùäüûôaìVãÚãÐ ÈÚ¿ƒ¸@²,­a©Ý¦•¥r¥O¦¨€ª‡­ñ°®´•¸˜¼§À§Ä¨È†ÌXÐÔ£×Û€ÞÊá÷äèëþíÕð”óDöàøjûåýL«ô8h • ° ÉÑÙÕν®“|`!?#$%'å(Í*°, .0‡2„46œ8»:â<?YA­CFtHíJhMôOvRúTlWÉY÷[þ]§_aÐabœaR`^ËZaVÄPùIB9/‚$r@/‚ø‡înåVÝqÖ£ÐÌÈÆxÄŸÃoÃÀÃÄŒÅÚÆSÈîɤËgÍ;ÏÑüÒçÔØÖÙØÒÚæÜôÞá=ãlå¬çùéMì¹î)ñ­ó@öÚøŒû>þÄŒL  ¤%{’_´ñÂç$ 3PþŽöîåÝÛ¥ÒºÉdÁà¹b³®ªJ§¿¥i¥¦«§þ©é¬B°ò³Ñ·Ñ»Ý¿âÃâÇÇËÏRÓðÖsÚ×Ý+áXä~çyêqíGðóÁõ^øìúmýÔÿ8‚Éü, F ckvrm^M8!à"Ç$¦&‰(n*T,>.00#2%4%6:8N:z<§>ê@6C‘EûGnJíLqOúQyTõVOY’[•]\_¿`±abÀa `–^€[SWðQcK¥CÚ:1¡&¤vY“úyð#çæÞµ×½ÑçÌ2ɂƽÄÃÃqíÃVÄVÅ—Æ ÈœÉOËÍßκЛ҆ÔyÖoØuÚxÜÞ¦àÏâüä<çéÙë<î¬ð.óºõYøýú¸ýo;ûÁx §)~ŠØï,Ô i±ÿøÁïÛæ«ÝiÔpËõÂG»”´¯¿ª»§ý¥f¥ç¥P§ƒ©N¬™¯6³· »¿ÃÇËÞΜÒ<ÖÅÙ3Ý‚àÁãÜæëéÛì¾ï‚ò=õÜ÷qúíübÿ¼T”» â ø ûòÖÀ¥ …"k$G&/( *ø+à-Ì/Å1¾3Ä5Î7ê9 <;>y@ÁBE€GôImLöNvQTtVÞX[4]_|`‹abÚaæ` _-\7XS¿L>E¥<3»(Ô«‡ªüjòïèsàÙ×ÒËÍßÉýÆ ÅìÃxàÃ.Ä#ÅUƾÇPÉ÷ʹ̂Î]Ð=Ò&ÔÖ ØÚÜ$Þ=à`âŽäÊæ écëÀí3ð­ò9õÓ÷vú.ýäÿ¬o4ð — 'Ž¿©8Xîè!Ž” Ž šùhñ˜ètß1Ö&͌ĵ¼Ïµ°€«:¨?¦s¥¿¥ü¦ ©»«ò®}²P¶BºM¾SÂXÆEÊ$ÎàÑÕÙ‰ÜâßãDæUéJì/ïûñ´ô^÷íùyüãþM ç#T v ’¥«±©ŸxdE ," $í%Ð'±)™+€-o/d1Y3a5h79¢;Ë=@RB¢D GvIòKvNøP‚SøUgX°ZÎ\¯^:`\a÷aìa$av_Ï\Y,TNÊFg>5Ñ*ÿൠÉþdô¾êârÚԷΘÊ}ÇgÅÄŽÃÃÄïÄÆxÇɦÊ_Ì+ÎýÏáÑÄӷզ׬٪ۼÝÔßòá"äUæèéêJíµï/ò·ôN÷ðù£üXÿ!à§g «SJì#ÖîRâ™K±VûóWê9áú×áÎ,Æ+¾·±J¬Ì¨Œ¦Š¥ž¥´¦—¨2«I®Ë±µ{¹†½‹Á‘Å„ÉcÍ+Ñ×ÔhØâÛ9ß‚â¨å¾èºëîuñ*ôßömùûûmþÖ0v¶è ,=IMFA,íË!°#%r'T)=+-/ý0ý2ø4793;d=“?âA-D‘FýHuKõMPüR„UéWBZe\T^ó_(aàaûaSaÜ_a]ßY2UUOMH@ì6Û,'"ã ìbö›ì³ããÛ5Õ²ÏWËÈÁÅTĜÌÃòÃÂÄÜÅ3DZÈUÊÌÑ͡σÑeÓTÕG×CÙGÛTÝgߊá°ãéå'èuêÐì9ï°ñ6ôÊöhùüÏþVÛ ‰ #›ßêšëµðv5ýäÇ  ŽüŸô ìãÅÙ¡ÐÒÇ®¿b¸*²'­a©í¦¥¥¥l¦3¨£ª­­±Ò´¹¸º¼ÅÀÉÄÂÈ£ÌqÐ!Ô¹×4Û—ÞÝáå&è%ëîåð¨óWöðø~ûóý_¼Jz £ Ä ÕåéæÞϽ¥Žn!T#1%'÷(Ü*Ã,±.ž0š2•4Ÿ6¯8Í:ñ<-?gA¾CFƒHùJxMýO‚RUtWÉYÿ[ó]§_ð`Çaûa…a0`ð]¡Z0VŽPÅIÇAÍ8á.N$F qøwîjå[ÝvÖ¸Ð#̦È,ÆÄ¼Ã‰ÃØÃ›ÄÅóÆcÈʰËyÍEÏ&ÑÓòÔæÖÜØäÚêÜßáFãtå¸çþéYì¾î3ñµóFöäøûFþÉ‹O ÿ ¡l†G­‘ê”}†¢»Ñ Þ÷ý4öºíÆäÛbÒ{É6Á¹¹L³ ®ªS§Ó¥‚¥5¦Í§%ª ­j°´õ·õ»û¿ÄýÇå˵ÏlÓ׋ÚïÝ=áqäŒç”ê€í\ðóÔõoøûxýëÿC™Ö 9 \ o€…ƒo]I/!÷"Ô$»&—(‚*d,Q.?0625486J8b:ˆ<¼>ø@JCžEHxJMyORƒTüVWY’[–]V_¸`¢aüa§a€`p^X[WÀQ&KnCœ:ß0l&qN2}ú`ð!çáÞ½×ÇÑùÌFÉžÆÓÄáÈÃÉÃmÄmŬÆȱÉ_ËÍïÎÆÐ©Ò”Ô‚Ö~Ø}Ú„Ü—Þ²à×âåDçŠéäëCî·ð7óÂõaøû»ý|9Áy ¢ûófmÛ¯¸ô;‰Ò [ÿ½÷fï†æUÝ#Ô.˿ »u´ü®¹ªÅ§ ¦ƒ¥¦u§¥©v¬¾¯]³3·.»4¿=Ã;Ç$ËûεÒXÖÜÙIÝàÑã÷æûéôìÍï™òLõñ÷€úýpÿÓ#i¢Ð ñ "#ÿëз –"}$W&B(* ,ï-á/Õ1Ñ3Ö5ß7þ9Š@ÑB0EGJ~LÿN‡QT}VåX [6]_x`{aôaÃaÆ`ê^\XÞR‡LEj<Ø2€(¥zdüUòãèpàÙáÒÞÍðÉÇ$ÅĔöÃKÄ7ÅmÆÓÇaÉ ËÆÌ“ÎkÐIÒ2Ô"ÖØÚÜ,ÞIàiâšäÑæéjëÌí:ð¶òCõÙ÷ú1ýîÿ¯r9í – $‚´— <˽ïVÉQÄ <²@ù ñ?è ßäÕãÌUĈ¼¯µö¯z«@¨O¦ˆ¥Ú¥"§,©æ«¯¨²p¶mºi¾yÂrÆgÊ;ÎÒ¢Õ1Ù Üùß5ã[æhé_ìDï òÊôm÷ú…üùþ^°ý2f ‰ ¢¶½À½­¤‡yU ?"$&á'Ã)«+’-‚/t1m3q5}79´;Ü=@`B·DG†ILNQŒSVlX¶ZÌ\­^3`OaæaÕaaU_¥\ßX÷SÖM‘F)>È4’*Î¯Ž ¨þMô¯ê âuÚ ÔÉΦʙÇzÅ6ĢìÃ'ÄÅ0ƉÇɶÊpÌ:ÎÐëÑÔÓÀÕ¶×´Ù¶ÛÉÝÚßÿá*äaæ¥èóêTí¼ï:ò¿ôV÷ùù©ücÿ!é¨g  ¡ F;ÖµÃ"¬U ² ]»ú°òùéèà¯×™ÎöÅü½ô¶þ°D¬Î¨˜¦¢¥¹¥Õ¦½¨T«q®ð±´µ¢¹¦½­Á°Å¢ÉÍDÑóÔ~ØúÛQß–â¾åÔèÊë·î„ñ@ôðöùü}þê=ŠÇø <OY_WR?-ùá!½#¥%'i)J+5- /1 3 57(9I;r=ª?ïAAD FI„KN‡P SˆUóWEZe\V^ç_"aÌaæa8aº_:]²YýT OHã?¯6¢,ò!æº ËKöˆì¯ããÛ>ÕÀÏjË$ÈÛÅkÄ¹Ã¤Ã ÄØÄôÅFÇÆÈgÊÌãͰÏÑrÓaÕS×NÙTÛ[Ývßá¾ãîå2èêÙìDï¶ñAôÏöuùüØþ•Y× Š “×׆ЖÇHüÖµšq M1üFô²ë­âxÙZЗÇ¿<¸²­i©ò¦¿¥¤¥‘¦R¨ËªÐ­>±ö´Ý¸Ý¼åÀéÄßÈẨÐ=ÔÐ×LÛ®Þóá#å;è9ë$îüð·ólöù‘ûþtÈVŒ · Ð ìòýõïâ̺›‚!b#F%%' )î*Ô,Â.±0ª2§4°6Â8Ü:=8?~AÊC,FH K‡MP’RUWÍYÿ[õ]œ_ì`±aêaha`Í]qZVXP‰I’A8¬.$ñ ìXøiîaå\ÝÖÄÐ9̸ÈEƨÄ×àÃôîĹÅÇxÈÊġÍVÏ2ÑÓÿÔñÖéØíÚöÜ ß&áNãåÀçêcìÅî=ñ¼óPöêø˜ûJþ ËN œer6tÃgFJ]q ‰žýÙõdíoä@ÛÒBÉÁ˜¹3³®ª]§å¥œ¥R¦ò§Eª5­°;´¸¼À"ÄÈÌÎχÓ×¢ÚÞRá†ä¢ç¦ê”íoð1óæõ‚øûýúÿW§é K k ‚˜“€nZ@$!#å$Ì&ª(’*v,a.S0H2E4J6[8s:›<É>AUC´EH‰J MˆORŒTWZY”[•]P_¬`–açaŒab`K^,[ôV†QöJ1Cf:ª05&I!cúTðçãÞÇ×ÕÑÍ]É´ÆðÄùãÃáÅăÅÂÆ/ÈÃÉpË,ÍÿÎÑзÒÔֈ؅ڑܞ޽àÞâåJç–éèëOî¼ð?óÉõhø ûÁý~?Âx ›ï àNJ¹~†·ø@ƒ »ÿb÷ï.æ ÝÙÓôÊŽÂøºa´í®»ªÌ§¦™¥!¦“§Ë©˜¬æ¯~³Z·M»U¿\ÃUÇDËÏÑÒnÖóÙaÝ®àéã çêíáïªò_õø‘úýÿå3|²á )42-!ûâÈ ¦"$h&Q(0*,.ô/ä1ã3æ5ó7 :1@ãB;E¢GJL O“QTˆVçX&[3]ý^m`paÞa«a§`Ä^Ú[ØW¬RQLÌD1<¡2N(sV@vüFòØètàÙóÒíÍ Ê-Ç@ÅIJÃÌÃcÄPÅÆìÇrÉË×Ì¡ÎyÐWÒ>Ô-Ö#Ø#Ú)Ü7ÞRàtâ äÝæévëÒíDð»òLõÞ÷‹ú4ýõÿ±v8î ‘ x¦…¦‘¾{ æ]æø¶ðêçÒÞÕ¤Ì#Ä`¼•µç¯w«H¨]¦£¥ô¥D§N© ¬8¯Í²“¶º¾”–Æ|Ê\ÎÒÀÕDÙ¹Ü àKãoæ}éqìVïòÛô÷úšüÿpÁ Cv ™ ³ÆÎÓʰ„j L"0$&ó'Õ)»+¤-“/‚1„357¡9Å;î=,@pBÈD&G™I L‘NQ•S VnX»ZÌ\¨^,`@aÔaÀaç`1_}\±XÅS MZFî=‘4^*›‡h þ8ôªêâ~ÚÔÝμʲǓÅPľÃÅÃBÄÅCÆ¢Ç%ÉÉÊ€ÌFÎÐöÑâÓÉÕÃ×¼ÙÅÛÍÝéßâ3äkæ«èÿêZíÆïAòÅô_÷þù±üeÿ)éªf 7)½ë‘šðuÂd «dúUò£é˜àd×YοÅÔ½Ô¶ñ°:¬Ö¨¨¦µ¥Ù¥ñ¦â¨z«“®²ÔµÈ¹Ä½ÏÁÊÅÂÉ—ÍbÑÕšØ ÜjߪâÓåçèÞëÈî—ñSôÿö”ùü’þøOšÙ 0 K`kml]S>$ ì!Ô#±%•'y)\+G-0/%135*769];=¾?üASD¯FI•KN–PS‘UúWFZh\N^ä_a¾aÍaa’_]YÑTçNÛG§?z6j,Å!¶œ ©<ö|ì¬ãëÛEÕÔÏ~Ë;È÷ŃÄÕÿÃ$ÄñÄ Æ[ÇÚÈvÊ)ÌñͽϟÑ}ÓnÕ]×[Ù]ÛhÝ|ßáÄãûå:è‡êãìJïÂñGô×ö}ù#üÞþš] Ù † †ÏÃs²sŸÇ“tF$ ðÚûëó[ëXâ,ÙÐ`ÇM¿ ¸ÿ±­h©§Ó¥À¥°¦u¨ñªõ­e±µ¹ý¼ ÁÅÿÈŲ́ÐTÔê×cÛÅÞ â8åOèMë9î ñÎózöùŸûþ„Ú.d¢ Á ê ö   òÞˬ–!t#V%8')þ*é,Ò.Ä0½2¹4Á6Ö8ë:=G?’AÚC;F¢HK“MP—RU‚WÔY\ñ]š_Ü`¥aÓaNaí_¤]DZÏU"POIUAU8q.á#éÆ Ï<ø\îYå`Ý„ÖÔÐIÌÒÈ]ÆÄÄðüà ÄÅÄÓÅÇÈ%ÊÕË–ÍhÏ=Ñ"Ó ÕüÖøØõÚÝß/áXãŠåÈçêmìÎîHñÃóWöôøûUþ Ô‘P þ —VhwU—: &) 3Cý{õ íäòÚÑÑÉÑÀr¹³ô­ ªc§ý¥±¥w¦¨oªX­¶°`´>¸8¼@ÀCÄ9ÈÌìÏŸÓ:׸ÚÞjá›ä¸çºê©í‚ðEóøõ•ø$ûŸý k¶þ/ ^ z •Ÿª¥¡‘€kQ6!#ø$Þ&¹(¦*†,v.c0Z2W4]6l8†:«<Ý>AhCÄE)HœJM—OR˜TWbY”[•]J_¢`…aÕapaE`#^[ÀVRQ»JùB':r0þ%ùðKú@ðçáÞÎ×áÑÍqÉÍÆÅļÃüÃœÄ›ÅØÆBÈØÉ|ËBÍÏäÐÁҫԛ֒ؓژܭÞÄàéâåSç éòëWîÇðGóÓõnøûÊýGÇt ‘çþÍ5*“RRzµô1 f¨þ÷µî×åºÜÓ±Ê]ÂϺH´Ý®¸ªÓ§/¦°¥A¦µ§î©Â¬°§³}·q»y¿{ÃvÇ_Ë/ÏèÒŠÖ ÚwÝÆàþãç&êíóï¿òpõø¤ú&ý’ÿöEŽÃñ  *>BF<5ðÜ ¸"Ÿ$|&b(B*-,.0ö1õ3ø58 :<©@öBLE°G J™LOœQTŽVîX'[2]ú^b`caÊa’a‹`^²[¤W}RL”Dó;k2(E'Yü3òÏèpà"ÙüÒÎÊEÇYÅ9ÄËÃèÃ{ÄgÅ–ÆüLJÉ,Ëḛ̀·ÐcÒLÔ9Ö.Ø.Ú3ÜAÞ\à}âªäææ'éëÛíLðÇòPõê÷ú@ý÷ÿ¹y8í u“sòý†bÝKº) “øUð™çzÞVÕaÌìÃ9¼uµÙ¯o«Q¨k¦¹¥¦a§v©-¬a¯ñ²º¶®º°¾µÂ±ÆžÊqÎ5ÒÔÕ`ÙÎÜ"àaãƒæ‘é†ìhï5òëô•÷&úªüÿ}ÖW† « Å×àâÜÔÀ¯–z `"?$ &(å)Ï+µ-£/š13˜5›7¸9Ò;>9@„BÖD9G¥ILNQ SVwX¼ZÌ\¦^ `7aÀa©aÈ`_N\ˆXSmMF·=V4**kXI nþ)ô›êâÚ"ÔêÎÒÊÈÇ®ÅhÄÛÃÚÃ]Ä4Å[ƵÇ9ÉÚÊ‘ÌWÎ*ÐÒéÓÚÕÊ×ÊÙËÛÜÝîßâ;äuæ³è ë_íÓïFòÑôe÷úµünÿ+î¬d •ü*¨Îmr¼;Öv ²W úúñMéDà×΅Ū½´¶Þ°7¬×¨¸¦È¥õ¥§©Ÿ«»®;²þµæ¹ë½ëÁïÅÙɸÍwÑ$Õ°Ø%܀߾âêåúèõëÛî©ñfô÷§ù/ü£þd¨í D [r|{rcN: "ã#Ã%§'ˆ)n+X-C/71.30597M9i;–=Ë?BcDÀF-I K N P"S™UþWNZd\Q^×_ aªa¹aas_ì\UY›T´N¡Gn?=66,Œ!m ’ öqì¨ãêÛRÕáÏ’ËSÈÆžÄðÃÖÃ>ÄÅÆqÇëȉÊ8ÌÎÊÏ­ÑŠÓvÕm×aÙiÛpÝŠß¡áÓãþåFèêëìUïÈñQôßö„ù*üãþ¡_$Ø „ ¿·[˜RwèŽX'É¡{û•óëâÝØÏÏ&Ç ¿ÿ·ë± ­k© §ç¥Ü¥Î¦›¨«®‰±?µ&¹ ½(Á&ÅÉ÷ÌÂÐkÔØyÛÛÞ âMåcèbëKî ñàóö)ù¯û-þñ:{® × õ ñÚÀ£!ˆ#f%J',)+û,ã.×0Í2Ì4Ò6ç8þ:,=Z?ŸAíCHF´H%K¢M#P¤RUŠW×Y\ï]“_Ó`“aÀa0aÏ_{]ZšUðOIA8=.­#¹¢ ª)øIîVå]ÝÖâÐ]ÌèÈuÆÜÄ ÄÓÃ)ÄÛÄéÅ,Ç¢È6ÊæË§ÍrÏOÑ+ÓÕ×ÙÛÝ ß8ácã‘åÔçêvìØîNñÍó_öùø§ûUþÓ•P ý ”OT ^1u ÜÎÔÙÝ Üíü$õ²ìÅã¥Ú‰ÑÌÈ¡ÀM¹ ³ã­ªj§¦Ë¥•¦3¨’ª~­Ù°‡´_¸^¼^ÀcÄUÈ;ÌиÓT×ÍÚ6Þ~á²äËçÍê¼í”ðYóöªø4û±ý{ÈA l ¡µ´»¬§Ž~`I!'# %ê&Ñ(±*œ,ƒ.v0k2h4q6y8š:»<ï>.AxCÓE9HªJ%M¦O%R¢TWdY™[‘]E_š`uaÀaYa!`ÿ]×ZV Q‚J¾Bò970Ì%åÐÎ3ú.ð çÞÞ××íÑ3͇ÉãÆ%Å*ÄÛÃķİÅíÆWÈèÉ‘ËNÍÏïÐÑҵԨ֜؜ڥܳÞÑàóâ$å^ç¨éúëbîÍðQóØõyøûÐýˆH Ås Šßíºj(=v¨æ Tþ¯ö_î…åjÜKÓvÊ*¬º,´Ó®·ªÜ§?¦È¥_¦Ö§ªâ¬2°È³¢·”»˜¿›Ã•ÇwËNÏÓ Ö$ÚŒÝÝàä1ç:ê+í ðÍò‡õ"øºú6ý¤ÿXœÖ & ;OTVME0é Ì"®$Ž&t(S*=,%.0 2468-:R<€>»@CYEÃG-J©L'O§Q&T–VôX([4]ò^]`Raºawan`x^‡[wWERâKXD¼;.2ã'õDüòËèmà&Ù Ó Î5Ê]ÇpÅWÄàÃÄ’ÄŬÆÈšÉ=ËøÌ¿Î•ÐpÒXÔDÖ<Ø7Ú?ÜLÞcàŠâ²äðæ2é‡ëãíVðËò\õï÷˜úBýþÿ¼|9í Š h†a×â^9X£ pÜ =¬ÿ5øð>ç0Þ Õ%̻ü_µÇ¯p«U¨¦Ï¥2¦ƒ§˜©T¬…¯³ß¶ÐºÑ¾ÕÂÍÆ½Ê‹ÎOÒëÕyÙãÜ;àsãšæ¢éœìyïIòýô§÷6ú½ü+ÿ’ã/g— » ÖæôïðáÔÀ¥Ž m"S$1&(ú)Û+Ë-²/¨1¥3¢5´7Â9é;>M@“BçDGG¶I)L©N-Q£S!VxX¿ZÏ\œ^`%a±aŽa¬`ë^)\XX[S7MæE=4õ)91" Xþô”êâ‹Ú*ÔÿÎçÊÞÇÊÅ‚ÄõÃõÃuÄKÅrÆÇÇMÉéÊ¢ÌdÎ:ÐÒùÓâÕÙ×ÑÙÙÛâÝüßâGäzæÁè ëoíÕïQò×ôl÷ú»üqÿ1ð¯b  ñ’®LEŒ•1Ì cÿ±ù¤ñ÷èôßÐÖØÍRÅ~½›¶É°6¬Ú¨É¦Þ¥¦3§'©Ä«à®a² ¶ º ¾  ÆöÉÔÍÑ@ÕÄØ<Ü–ßÔâþå éìíî¾ñxô#÷·ùBü±þo¾ø, Q oŒ„odF1 "ô#Õ%·'š)‚+d-Y/D1B3@5J7^9z;¦=Ü?!BqDÑF9I¯K-N«P+S£UXSZb\M^Ñ_ü`œažaç`P_Æ\(YiT€NiG7?6,\!bM söeì§ãíÛ`ÕðϨËjÈ'Æ¹Ä ÄïÃYÄÅ8Æ‚ÇÉ•ÊNÌ ÎÝϸіӅÕu×nÙrÛ{ݑ߭áØã æLèšêòì^ïÑñWôæö‰ù0üéþ£d Ü } v²¤F{/N¶Yå± }G)û;ó«ê¹áØ”ÏëÆø¾Þ·Ú±­o©§û¥ø¥ì¦¿¨6«C®¬±dµH¹B½GÁDÅ7ÉÍÙЈÔØ”ÛíÞ9â]åxèuë\î5ñðó ö9ùÂû<þ£JŒ¿ ç ),(&åÕ³!—#z%X'?)!+ -ô.ê0Ú2á4ã6ö8;8=n?¯AüCZFÀH5K­M.P°R#U“W×Y\ë]Œ_Æ`ƒaªaa¯_U]îYmU¸OâHå@â7 .y#’z ‘ø>îSåcÝ™ÖôÐoÌÉŒÆúÄ"ÄóÃ<ÄøÄúÅEDZÈNÊñ˹ÍÏ[Ñ9Ó#Õ× ÙÛÝ*ßAákã›åÛç#ê~ìÞîWñÓógöùªû]þÕ˜M ü Œ?EöALÚ¦‘Œ ˆ•üËô]ìrãYÚHÑ’ÈrÀ0¹ï²â­ ª|§"¦æ¥³¦V¨´ª¦­ü°¬´‚¸¼~ÀÄsÈVÌÐÓÓh×èÚHÞ—áÂäâçßêÒí¤ðnóö¹øHû¿ý2‡ÝR € œ ¶ÃÉȱ¥ŠuX!7# %û&â(Ä*ª,™.‡0|2{468§:Ð<ü>AA‡CæEFHºJ1M²O1RªTWiY˜[“]:_”`aa®a>a`Û]©Z_VìPJJˆB·90—%º¨³ú"ðçâÞß×ÿÑDÍ ÉüÆ?ÅEÄöÃ)ÄÐÄÇÅÇnÈøÉ£Ë]Í)ÏýÐÜÒÂԳ֨ئگܽÞÙàüâ.åfç³éìhîÙðUóæõ{ø#ûÕý‹N Æq €ÔݤíE÷è0`Ž ÀöýZöî/åÜÓ;ÊùÁ„º´Ã®¸ªå§P¦ä¥y¦ý§4ª ­R°ñ³Ä··»¼¿¶Ã´Ç”ËgÏÓ·Ö=Ú¢Ýðà,äBçQê<íðàò›õ5øÉúJý²ÿb³ã 6 L`dh^VA/ù Ý"À$ž&ˆ(b*Q,5.)0246+8=:d<‘>Ì@CnEÎG?JµL5O±Q1TVöX/[,]ñ^Q`Ba¨a\aO`S^][GWR©K!D‚;÷1°'ßÙÕ'üòÂèkà1ÙÓ$ÎJÊsÇÅpÄüÃĩĖÅÃÆ%È©ÉSËÍÒΡÐ}ÒeÔOÖFØAÚJÜSÞràŒâÁäôæ?éŒëðíZðØòaõ÷÷žúIýÀ~;ë ‡ Z|IÁÁ: 'fÇ(‹ êRÿÛ÷©ïéæßÝ¿Ôé˃Ãë»Bµ·¯o«[¨¦æ¥O¦§§»©z¬ª¯<³·öºî¾øÂêÆ×ʪÎeÒÖÙúÜPà‰ã¯æ¶é°ìŒïZòõ´÷NúÉüCÿý8£ Ï åúûøáÒ¶Ÿ ~"e$A&((*ñ+Ø-Ç/»1´3·5Ã7Õ9û;!>_@£B÷DYGÃI:L·N4Q´S#V‚XÂZÊ\ž^`ažata`Æ^\'X)SÿL­ED=å3¾)ü=þÿóˆêâŠÚ;Ô ÏýÊ÷ÇâÅŸÄ ÄĉÄjÅÆáÇ^ÉýʲÌtÎHÐÒÔíÕå×ÝÙâÛïÝà%âN䇿ÇèëtíâïVòâôq÷ú¿ü{ÿ1õ®c  âðy•#UÌPê| ©VùJñ è ß†Ö•ÍÅU½|¶¸°/¬à¨Ö¦÷¥+¦U§J©ê«¯ˆ²E¶/º,¾/Â'ÆÊìÍ®ÑUÕߨUÜ©ßíâæ!éìýîÔñ‰ô7÷ÉùRüÇþ*‡Ê9 e }•›£œ”†o[A ""$å%Ë'«)“+y-g/Z1Q3T5[7p9;¶=ð?.B…DÞFKI¾K8NºP4SªUXNZm\A^Î_í`‹a‡aË`-_›\üX4TGN1Gù>Î5Æ+*!3' TøõZìŸãóÛhÕþÏ¿ËÈ@ÆÕÄ#Ä ÄpÄ7ÅMÆ™ÇÉ©Ê_ÌÎíÏÃѧÓÕ„×wÙ~ۆݛߺáàãæUè£êþìdïÜñ^ôñöù9üîþªe'Ö r£•.` $†×Ÿ` ,ëÏúàòSêbáCØNϲÆË¾¼·Æ±û¬q©)§¦¦§à¨^«i®Ò±Šµk¹e½jÁcÅVÉ.ÍöСÔ2Ø©ÛßKâwåŒè‡ëtîDñô³öKùÖûLþ¶^›Ó õ &>;=2%üâÇ!¦#%h'R)3+-/ù0ï2ñ4ô6 9 ;N=}?ÁADhFÒH?KÀM7P¼R-U–WßY\è]†_¹`ta’aú`Œ_-]ÂY9U…O¦H­@¨7Ï-J#^Y mÿ÷1îLåfݤÖцÌÉ©ÆÅAÄ ÄVÄÅÆXÇÇÈ\ÊÌÇÍÏgÑHÓ.Õ ×ÙÛ Ý1ßLáuã¢åæç,êƒìîîXñâókö ù³û`þÙšN ø ‰÷53à&ð"­kTGA8 0:ürôìã ÚÑXÈCÀ ¹Û²Õ­ ª‡§2¦¦Ì¦~¨ÖªÍ­$±Ï´ª¸ž¼¢ÀŸÄ’ÈsÌ:ÐìÓƒ×üÚdÞ¨áÛäöçòêæí¸ðó-öÌøXûÖý= é0d Ž ° ÆÓÛÙÓĵ†h!M#-%'ñ(×*½,¨.š0246¡8»:Ý<?KAžCïE\HÄJBM¼O>R²T!WkY[‹];_ƒ`Wa–a#aâ_²]~Z/V´PJKB~9Ê/b%Š€úðýæäÞä×ÒRͼÉÇ]Å]ÄÄBÄèÄàÅÇ‚È Ê´ËnÍ8Ï ÑìÒÌԿֳذڻÜÄÞçàã:ånç»é ìrîßð`óéõ†ø(ûÜý’O Èm zÇΑåÏɳÃìA c¢ýûõ¬íÜäÊÛ¾ÒüÉÆÁdºü³¹®¸ªí§f¦ü¥˜¦¨Xª3­y°´é·Ú»Û¿ÙÃÐDz˂Ï6ÓÑÖTÚ¹Ý á<ä]ç_êUí+ðøò§õLøÛúXýÊÿ&{¿ö& E `owwqeUA%!ì"Ô$¯&—(x*a,F.;0*2+4-688T:q<¥>Ý@(C{EâGIJÇL@O½Q;T¢VýX0[,]ì^F`8aaGa,`0^1[WÚQvKâCM;¼1z'°­µ üýñ¹èlà7Ù"Ó5Î_ÊǥʼnÄÄ4ÄÆÄªÅÙÆ8ȽÉcËÍáήÐÒpÔ[ÖRØNÚOÜcÞuàâÅäçDé˜ëõíhðÛòmõþ÷£úRýÅ€?å ˆ ÿRl5©£áð,ƒÞ9 •úþ÷Nï”æ‹Ý|Ô£ËTÿ»)µª¯i«f¨ž¦ÿ¥n¦Ã§æ©š¬Ô¯_³)·»¿à ÇõÊÄ΂ÒÖ©ÙÝgàžãÄæËéÄì¡ïmò%õÊ÷\úáüPÿ´OŒ¸ Þ ø õãȰ ’"s$X&7(*,ê-Ø/Ï1Â3Ï5Ï7ì9<7>o@µBEgGÔIHLÃNDQºS0V…XÇZÈ\›^`a‰a^ao`£^Ó[úWòRÇLrE=­3„)ÖÕÙþìó|êþáÚDÔÏË ÈüŹÄ'Ä-Ä£Ä~Å›Æ÷ÇnÉËÀ̆ÎUÐ/ÒÔûÕò׿ÙðÛøÝà1âXäæÔè ë€íêï`òêôz÷úÇü€ÿ7ù°c ÿ …Ýà`uí(Œž) ºGùæðKèHß9ÖQÍâÄ(½\¶¨°'¬ç¨ä¦ ¦I¦w§p©¬,¯°²i¶UºN¾OÂJÆ4ÊÎÌÑjÕþØiÜÄßÿâ+æ4é6ìïæñžôH÷ßùcüÚþ>—ÞM u ’¢±°±£˜ƒlQ 7"$ý%×'Á)¢+-y/l1d3g5l7‚9Ÿ;È=@BB•DïFZIÎKFNÆPAS²UXSZj\>^È_Þ`zaqa©` _q\ËXTNõF¾>“5Œ+û þ 1æõIìžãóÛvÕ ÐÓË–È\ÆîÄ=Ä%ĈÄQÅaƱÇ$ÉÁÊkÌ-ÎüÏÏѵӜՊ׈لۓݤßÂáìãæbè¨ê íjïåñfô÷öšù>üõþ¬n#Ü z k’ˆGåþPç–S Ó—qú†òúé áø×Ï}Æš¾ž·¯±ô¬t©6§#¦1¦,§©‚«®ü±®µ‘¹‰½ˆÁ†ÅrÉMÍѽÔHØÅÛßdâ‹å¢èžë…îZñôÄö`ùæûaþÈ"p®ã (?KMPC8$ ôÚ!·# %z'd)D+/-/ 135794;^=‘?ÏA"DwFâHQKÈMJPÁR:U›WäY\å]€_­`fayaà`h_]“YUMOnHn@o7“-#., Oã÷#îDåfݬÖјÌ.É¿Æ,ÅZÄ$ÄpÄ'Å)ÆmÇÜÈmÊÌÔÍ¡ÏuÑSÓ=Õ*×$ÙÛ-Ý8ßZá|ã®åïç5êìñîgñçóuöù¸ûjþ#ÞN ø ‚ð)$ÇÉw8ð ëÒçûô­ëÈâ»Ù¼ÐÈÀé¸Ã²Ì­ ª”§E¦¦ï¦¨ÿªñ­J±÷´Ê¸Ç¼¿ÀÁįÈÌUÐ Ô™×ÛyÞ¿áðä èëùíÍð‘óBöÝøjûæýR°üBs ¤ ¾ ÙæëíãÖÇ®™y!`#=%#')è*Ï,¼.©0¤2š4¨6±8Ì:ò<?dA¨CFeHØJOMÉOIR½T%WuY™[Ž]1_|`Ca…aaÁ_]PZþU}PÚIBD9/.%TYiêùðòæäÞí×ÒiÍÌÉ-ÇtÅyÄ+Ä\ÄÅôÅ/Ç’È!ÊÃË€ÍEÏÑùÒÚÔÌֽؿÚÁÜÔÞîàãDåxçÃéìyîéðgóóõ‹ø3ûàý—UÆp t»ÁxЫözŠ£Êì GýŸõUí‚ä}ÛvҼəÁ:ºã³°®±ªü§u¦¦º¦?¨ªY­Ÿ°<´¸ý»þ¿÷ÃñÇÌË¢ÏMÓíÖkÚÐÝ"áPäsçsêjí?ð ó¼õ]øíúmýØÿ=ˆÔ 7 X q€ˆ‰‚ydR9!ÿ"ã$Ã&¨(ˆ*r,[.I0@2;4>6N8`:ˆ<±>ò@5CEìG_JÏLOOÉQBT®VY1[.]â^B`#a€a*a` ^[éV§Q;K¬C;ˆ1A'‚€“ñûíñ­èmà:Ù2ÓDÎvÊ£ÇÁÅ¡Ä4ÄMÄÞÄÁÅðÆKÈÓÉpË*ÍëοКÒ{ÔjÖZØYÚ^ÜhÞ„à£âÑä çLé¢ëþímðéòoõ ø¨úYý Ê‚=é } ýD_"„í²½ñ@•é BŸþ*÷õî?æ>Ý2ÔhË Ãš»µ›¯k«h¨´¦¦Ž¦å§ ª¿¬ü¯³Q·6»8¿3Ã+ÇËãΙÒ:Ö¾Ù)Ý}à³ãÛæÜéÛì±ïƒò4õß÷lúôü`ÿÅ`œÊ î !*óÚÀ ¤"„$h&G(0*,ÿ-ç/à1×3Û5å7ù9@ÇBE{GßIXLÏNLQÇS5VŒXÄZÌ\^`þ`uaFaQ`^®[ÇWÃRL[5[+È Øà ÒõCì˜ãþÛ|Õ"Ðä˳ÈpÆ ÅVÄAÄ¡ÄhÅvÆÄÇ:ÉÍÊ€Ì9Î ÐÞѿӧՙ׎ٓۙݰßÊáöã&æiè´êívïëñnô÷ùEüûþ°n'× z ü`‡rþ'ÅÐ!¯TÆ Aú0ò¢é¾à¬×ÆÎFÆn¾‚·œ±ï¬w©D§:¦J¦P§$©¬«°® ²Ôµ²¹¬½§Á¤ÅŽÉhÍ,ÑÑÔdØØÛ3ßwâ¡å´è³ë—înñ)ôØöpùùûqþÚ3‚½õ  :O[`_SK2! ë!Ë#®%'t)U+A-*/1357*9G;n=£?áA0D‰FíHbKØMSPÏR@U£WêY\æ]u_¤`QagaÁ`I_Ü\hYÓTO4H4@67\-â" 0Î÷î>ålÝ²Ö ÑªÌEÉÙÆFÅtÄ@ćÄCÅ<ƆÇíÈ‚Ê'ÌçÍ­Ï„ÑbÓEÕ:×+Ù-Û4ÝFß`áˆã¸åõçBê•ìþîlññózöùºûtþ$äP ð ƒâ±ó¦ÖIÿÔº¨ ‘„„ûÂóMëzâkÙ{ÐßÇè¿È¸¬²Æ­ ª §[¦7¦§Â¨!«®p±µî¸è¼áÀàÄÏȨÌtÐÔµ×.ÛÞÕáåèë îàð¥óQöóøyûûýaÀPˆ ° Ô åúúþôéÔçŒ!p#O%3')ö*æ,Ç.¿0²2®4¸6Á8à:ÿ<6?nA¿CFxHäJ\M×OQRÇT+WxY›[Š]*_q`4anaê`¡_d])ZÊULP IÙA9Z/ö$,+QÎùóïîæäÞö×(Ò{ÍåÉDÇÅ‘ÄGÄsÄÅ ÆDǧÈ2ÊÕËÍUÏ(ÑÓæÔÖÖÊØÆÚÐÜÜÞõàãGå†çÉé"ì€îóðpóùõ–ø4ûéý›XÄo ý k²­h±ŒÎmFI`}š ¹íüFõûì/ä+Û1ÒÉgÁºË³£®´ª¨ˆ¦.¦×¦c¨£ª­Ä°b´1¸!¼ÀÄÈë˺ÏjÓ׃ÚéÝ4ákä‚çêví[ðóÕõløû|ýíÿKžâ G j ”–œ“ˆy`M,!#ñ$Ù&µ(Ÿ*,n.[0Q2N4P6^8u:•<É>ÿ@IC EýGlJàLYO×QKT´VY2[+]Þ^5`akaaî_ã]ÜZ´VwQþJtCÒ:O1 'RVoÚû×ñ§èiàDÙ:Ó[ΆÊÁÇ×Å¿ÄLÄhÄõÄÚÅÇbÈâɆË6ÍþÎËЦ҉ÔtÖhØcÚhÜsÞŽà¬âÛäçXé©ë îuðòòyõø±ú]ý̇=ç { ó=Lrgĉ…·úJš éIþÎöšîìåéÜìÓ(ËéÂw»î´”¯`«v¨À¦/¦¨¦ ¨+ªç¬!°©³r·^»W¿UÃJÇ-ËüεÒRÖÕÙEÝàÐãçæûéåìÍï‘òJõï÷€úýsÿ×,q®Û ÿ )762(îÑ µ"—$z&Y(B*",.û/ñ1é3î5ô7:)<[>Ž@ÙB&EˆGñIbLáNWQÑS¦¦¹§¸©V¬}¯ö²µ¶šº‘¾‘Â…ÆqÊ=ÎÒŸÕ+Ù™Üïß+ãSæ`éXì;ï òÆôj÷ú…üþþ`»@p — ²ÈÎØÎË·§‹v W";$&(Ý)Ì+ª-¡/1ˆ3‰5‘7¢9Å;é=$@dB²DGtIîK\NáPQSÅUXZZj\9^³_É`SaDap`Å^!\oXS£MƒFM>5#+‘ ª¸ øÿ»õ3ì’ãÿÛ†Õ/ÐùËÅÈŽÆ ÅuÄVļÄÅÆÛÇJÉåÊŒÌMÎÐîÑËӶաלٜۥݻßÔáÿã2æpè¿êí€ïóñxô÷¨ùIüÿ±u'Ø v ÷V{`é ¤¤ôpÄ} +ì¾ù×ñLékàb×…ÎÆD¾b·Š±è¬{©R§N¦g¦m§K©Ë«Ü®B²úµÕ¹Î½ÇÁÆÅªÉ†ÍDÑíÔzØòÛIßâ´åËèÄë°î}ñ?ôéöùüþìEÒ - J`mppgWI- ÷!à#¼%£'ƒ)i+R-µ¹½ÁÅçÈÌ̇Ð=ÔÉ×GÛ¤Þíáå2è4ëî÷ð´óeöùŠû þrÓe” Æ à û øçÓ¸Ÿ!}#d%C'') +ó,Û.Ñ0Á2Ä4Ä6×8î:=C?ƒAÌC"FˆHðJmMÞOcRÉT8WyYž[‡]&_d`)aTaÕ`~_@]ûYšUPkIžAÒ8/É$ø,ºùâïèæäÞÿ×5ÒŽÍøÉ^ǦŮÄ\Ä‘Ä-Å&ÆTǾÈAÊêË›ÍfÏ4ÑÓôÔâÖÓØÔÚ×ÜèÞþà&ãPåçÓé*ìˆîüðuóö™ø=ûîýŸ]Çj û d¢ P™m¥B 6J f—üîô¦ìÜãáÚìÑGÉ8Áô¹µ³—®µª ¨œ¦F¦÷¦‚¨Éª¡­ì°…´T¸D¼=À:Ä(È ÌÓÏ‚Ó×™ÚþÝLá|äšçŸêŒíið.óáõ‚øûýýÿ^¬õ* Y y ”¡««¤™‰r]=!%#%ç&Ë(ª*—,{.o0a2^4d6k8Š:¥<Ø>AXC°E H~JèLkOÝQWT»V Y5[)]Ú^*` aUaù`Î_Á]®Z‹VþZG \Q|¸J –ñýtöEî“åœÜ¡ÓìʶÂO»×´€¯b«z¨Ó¦E¦È¦)¨Nª­D°Ï³™·}»z¿uÃgÇLËÏÑÒjÖðÙXÝ©àáãç êþìÜï¦ò]õø“úýˆÿæ>„½ï  -<IFF7*á Ç"¨$‰&n(N*6,!. 02ü3ü5 8:= @éB9E–GJrLëNfQÙSDV™XÉZË\‰^î_å`Naa`7^Y[iWZR#LÃD^<þ2å(?TlÉý²ó]êôá ÚdÔPÏNËVÈEÆÅvÄvÄïÄÁÅ߯/ȬÉCËô̲΀ÐXÒ6Ô!ÖØ ÚÜÞ-àMâu䬿ïè<ë™íðyòõ÷4úÛüÿE´_ ÷ oÂÕ©˜ißKÅ@ ¼Gÿñ÷áïHçYÞ]Õ“ÌCį¼¶y°¬ý¨ §V¦›¦Û§Û©}¬¡¯³Ü¶ºº¸¾¬Â¨Æ‰Ê^ÎÒºÕBÙ±ÜàAãiætélìQïòØô€÷úü ÿtËT © Ä×äääÖ͵¡† i"L$-&(ó)Ø+Á-®/¢1—35Ÿ7º9Ð;>/@yBÁD!G†IùKlNêP]SÍU$X^Zi\5^¬_¼`Aa+aT` ^ù[AXiSmMIF>ä4í*[ €Œ Þÿ£õ'ìãÜÕ?Ð ÌÞÈ¢Æ>Å‹ÄsÄÒėŤÆîÇ_ÉôÊ ÌZÎ'ÐùÑÛÓ¾Õ²×¥Ù§Û°ÝÃßàá ä:æ{èÈêíŠïüñ€ô÷ªùVüÿ½t+Ø s óMmOÑî|¾=Ó€) Üiùwñøèà×>ÎØÅ¾?·z±Ý¬ƒ©\§e¦¦§n©ñ«¯k²¶ü¹î½ëÁãÅÉɤÍ^Ñ Õ“ØÜdß âÎåÞèÛëÀî”ñPôýö”ùü–þüX¢â = ^q‚yjZ?+ "õ#Ë%¸'“){+e-L/D14395>7M9m;=Ä?BMD¯F I‚KîMpPâRSU²WìY \Ù]m_ˆ`3a7aŠ`_\ YqT©NÃGÀ?¿6î,v"¦² ò÷÷í2ålÝÄÖ;ÑÐÌrÉÇzŧÄrļÄnÅlÆ®ÇɧÊIÌÎÈÏ¢Ñ{ÓaÕO×AÙEÛGÝ^ßqážãÉå èSê¨ìï}ñôö&ùÏûzþ1ìžS ì wÖò‡¹iî‹Y. ïÒÖúó£êÍáÕØïÏmLj¿†¸€²´­ª¶§„¦j¦Q§©p«a®¾±eµ9¹+½&ÁÅ Éå̦ÐVÔä×`Û»Þâ/åHèHë1î ñÈóyöùŸûþ„å1t« Ò ö  ûã˯!’#t%W'7)+-ð.à0×2Ð4Ü6æ8;%=V?“AÝC4F•HKuMñOiRÖT=W~Y […]_[`aDaµ`__]ÌYiUÞO0IbA•8å.$ÈÚ œùÓïÛæåÞØCÒŸÍ ÊwǾÅËÄtÄ«ÄFÅ;ÆmÇÐÈVÊü˪ÍwÏ@Ñ ÓÕíÖâØÛÚæÜïÞá*ã`å•çßé3ì”îñ€ó ö øJûðýª^Èk ó a“•6‚HÚÍØä ù ;ü”ôJì…ã‘Ú Ñ ÉÁÑ¹š³Ž®±ª¨­¦a¦§¤¨ðªÆ­±©´|¸e¼cÀXÄKÈ%ÌñÏÓ8×±ÚÞ_á˜ä«ç·ê¢í|ðCóõõ”ø&û ýoÀ= i ¤³¾ºº¨žpP!5#%ù&Ú(Â*£,”.~0w2n4v68š:¸<ê>!AkC¾EHŠJûLtOíQ^TÃVY4[+]Ð^$`ö`DaÛ`¯_˜]„ZSV QJüB`:×0£&é&¤û´ñ’ègàNÙUÓyεÊìÇ ÆôÄ~ÄÄ%Å Æ/ÇŠÈ Ê§ËZÍÏëпңԎÖ~Øzڀ܅ޤà¿âïä&çié¼ëî‡ðóŠõøÀújýÖ‹@ã u ä%1åB&y,=q¸ô B•ýöëí;åNÜXӭʆÂ&»¾´t¯_«†¨ã¦^¦æ¦L¨tª5­i°ö³½·¢»ž¿•ÈÇgË4ÏìÒ„Ö ÚnÝÂàôãçêíîï¼ònõø¢ú*ý–ÿüP“Òý $ >MZYUK<%ò Ú"¹$œ&€(a*I,0."024681:Q¶@öBKE¦GJ|LýNlQéSJVŸXËZÊ\…^â_Ù`9aþ`ô_^-[8W%RåK‹D<Ç2©( $IªýŸóNêôá¢ÚsÔ^ÏdËmÈ_Æ#ÅÄ“ÄÅÜÅóÆGȽÉWËÍÁΑÐbÒGÔ.ÖØÚÜ#Þ7àVâ€ä¶æøèFë¢í ð„ò õ™÷<úáü–ÿI´` ñ j¶É“ün@X¤{ë gëþ“÷‰ïëæÞÕQÌÄ‚¼íµc°¬ý¨"§i¦½¦ú§ª¤¬Ç¯A³·àºÙ¾ÐÂÅÆ©ÊzÎ4ÒÔÕ[ÙÊÜàZã}æŠé‚ìaï2òëô’÷)úªü!ÿ†Ú(`• ¹ ׿ùñûãâij– |"\$C&(*ê+Ò-Á/³1¬3«5¸7Ã9ë; >F@…BÔD2G•IL}NòPlSÑU,X_Zi\/^¥_¬`1aa4`~^Í[X5S6M FÚ=§4·*( Sh ¿ÿõìŒãÜšÕPÐÌõÈ¿ÆUŨĊÄïĬŽÆÈtÉ˰ÌkÎ5ÐÒèÓÌպ״ٰ۽ÝÌßêáäEæ„èÐê*í’ïòŠô÷¶ùWü ÿ½y,Õ q êBa:ºÍ\NŽþ•3Ý †7ùñ èÃßÍÖüÍ¡Åí½"·h±Ø¬†©m§z¦ ¦°§‘©¬$¯”²A¶ º¾ ÂÆçɽÍ~ÑÕ¯ØÜzߺâàåõèíë×î¥ñdô÷§ù2ü¥þgµö$ T j…“”ˆ~gU7 ""ý#ä%Ã'¦)+v-_/T1G3I5P7`9|;¢=Õ?BcD·FI‰KNxPîRZU·WñY\Ø]a_`a"al`á^e\ÞX4AzCÐE,HšJM„OóQkTÉVY9[$]Î^`ë`,aÄ`‹_w]TZ)VÐP\JÁB(:Ÿ0m&¾Ø‹û¢ñèfàUÙcÓ‹ÎÊÊÈ%Æ ÅšÄµÄ?ÅÆFÇžÈʸËjÍ)ÏøÐÏҮԙ֋؄ډܔީàÌâöä/çuéÄë$îð ó‘õ'øÄúsýÚ>ã n ÝÒ(Uúéþ0h© æAý¼õ•íæäýÛÓlÊWÂþº¦´g¯^«Ž¨õ¦v¦§k¨›ªX­‘°´à·Æ»¾¿¶Ã¥Ç…ËPÏÓ¡ÖÚ‰ÝÔà ä+ç3ê(íðÎòƒõ%øºú7ý¬ÿ b¥ã 6 N`jii[K: !ê"Ë$°&Ž(v*X,F.10%2!4 6/8@:b<Œ>Ä@ CYE·GJLOyQïSQV£XÏZÆ\^Û_Ç`(aâ`Ö_í][ WñQ°KTDå;2y(Ü$’ýóFêöá§Ú€ÔoÏ{Ë„È{Æ9Å­Ä©Ä"ÅðÅ Ç[ÈÐÉjËÍÕΙÐvÒMÔ=Ö%Ø"Ú#Ü*ÞDà\â‹ä½æéNë«íðŠòõ¡÷@úéü˜ÿN´_ ë d©ºçÜI'eÇ-  ˜þ9÷0ï—æ¸ÝÉÔÌÜÃZ¼ÓµT°¬©2§€¦Ú¦¨#ªÉ¬í¯i³#·»ø¾òÂãÆÆÊ•ÎNÒìÕuÙÞÜ5àmã“æžé—ìuïFòüô¦÷;ú»ü6ÿ“ñ6s§ É éøûíÛÁ¬ Š"r$O&4(*ý+ä-Ó/Å1¼3¾5È7Ø9ú;>Z@’BéDH£JM‹ORqTÑVY;[!]É^ `Ù`a¥`o_J],ZòUŸP J‡Bì9g08&‹®änû–ñèià\ÙnÓ ÎßÊÈBÆ$ŸÄÎÄWÅ8ÆZdzÈ0ÊÊË{Í8ÏÑÜÒ¼Ô¦Ö•ØÚ’ÜŸÞ¶àÔâå9ç}éÎë-î™ðóšõ,øÌúyý"âAà h ׿ ä+ͱÁêT “âüfõ6í“ä®ÛÉÒ4ÊÂÞºŠ´\¯^«–¨§¦#§¨½ª€­·°C´¸ë»à¿ÖÃÄÇ£ËlÏÓ¹Ö6Ú Ýíà$ä?çLê6íðÝò—õ:øÊúLý½ÿu·õ! F _s{}xn]L/!÷"á$½&¥(„*m,V.B0;2/466>8U:r<ž>Ö@CkEÅG/J›LO„QúSYV©XÐZÆ\z^Ð_¹`aÅ`º_Ã]ØZØV½QvKD¨;T2@(©Óýwýxó=êðá®ÚˆÔ„ό˟ȒÆWÅÆÄÅÄ9Å Æ ÇqÈãÉ|Ë$ÍãάЀÒ^ÔEÖ3Ø.Ú+Ü8ÞKàiâ•䯿 éVë·íð—òõ©÷IúïüžÿU¸\ è ]ž¬kͼ"äò(äM »:þßöÔîBæbÝ‚ÔÏË©Ã0¼·µE°¬ ©A§˜¦÷¦=¨Jªî¬°³H·+»¿ÃÇåʲÎhÒ Ö‰ÙûÜIà†ã¨æ³é«ì‹ïWòõ¸÷LúÓüBÿ¬þJ…µ ß öûïÒ¾ œ"ƒ$a&F()*,÷-ä/×1Ð3Ð5Ù7ì9 <2>f@ªBôDRG³I$L–N Q}SäU5XeZi\%^”_’` aå`õ_9^v[¶WËRÉL˜Ee=24H*Âù ‚ÿfõÿë†ã ܯÕpÐFÌ%ÉïÆŠÅÞĽÄ"ÅÜÅéÆ-È›É*ËÔ̈ÎUÐ#ÒÔäÕÕׯÙÌÛÍÝäßýá%ä[æ•èåê:í¥ïòšô%÷ÃùiüÿË|0Ö g â+H‹‘ù%Œ¥; ݆ÿXølðìç#ß/Ö€Í,Åš½ä¶D±Ë¬’©‡§¨¦×¦ð§Ú©f¬o¯à²¶hºX¾OÂ>Æ(ÊôÍ´ÑUÕÞØQܦßçâ æéìþîÍñô2÷ÑùPüÑþ0ØM q ’¦³·´¯u] C""$&è'Ê)±+™-ƒ/y1l3m5s7…9;É=ö?8BDÛF;IªKN“PSoU¿WûY\Ô]O_f`ü`ñ`5`—^\~XØSNG?6E,Û!> “[÷Íí"åtÝáÖgÑ Í¸ÉQÇÌÅõÄÀÄ Å³ÅµÆìÇRÉÝÊÌ3ÎüÏÇѤӆÕq×fÙeÛfÝ|ßá¹ãêå$èoêÄì'ïœñô¦ö<ùáûþ@ó¦O ä e¹Ý¹E^ÿVä‘[ õÌÆùúñ›éÒàð×#ÏÃÆ¿!¸G²˜­ªÜ§Á¦À¦¬§s©Ü«Ö®/²Óµ©¹’½ŒÁ|ÅdÉ>ÍöЦÔ-تÛßHâqå‡è†ënîCñô±öOù×ûRþ½f©ß  )AMURM>/ ã!É#¦%Ž'l)T+:-$/1 3 5 7 95;Y=?ÂAD`FÈH*K£MP†R÷THWYž[|] _5`æ`ü`f`÷^¢\EYÓT=O†H³@æ7=.ò#;c¨Vù¤ïÈæêÞØlÒÙÍPÊÃÇ ÆÅÂÄùĎŃƨÇÉ‹Ê0ÌÜÍ¢ÏmÑFÓ)Õ×ÙÿÚÝß'áKã{å°çüéNì­îñ˜ó$ö¸ø[ûþ·iÆc ä Ep_÷,á|6 ü 2ûóDë†â§ÙÓÐWÈwÀg¹W³n®¶ª7¨è¦°¦q§©X«?®ƒ±µç¸Ò¼ÅÀ¼Ä¢ÈÌAÐïÓ‚×üÚ\Þ§áÓäòçðêàí¸ð|ó-öÏøXûÛýD§ô;r à ÕëïðîÛÓ¶¦„!m#I%0')õ*Ý,Å.·0©2¦4ª6¸8Ë:ñ<?UA CëEPH³J'M—ORyT×V Y6[%]¿^`Ê`a`M_&]þYÃUhPèINB°9.0&V‰½Wû€ñyèeàdÙyÓ±ÎöÊ4ÈZÆAÅÏÄêÄmÅOÆqÇÇÈCÊÜËŠÍIÏÑèÒÌԮؘ֥ڟܩ޾ààâ åDç†éØë5î¢ðó£õ4øÕúzý.ß“AÜ h Ëÿ§ôÁ y…¦Î  8üõàì<ä]ÛƒÒôÉñÁ´ºs´N¯[«¡¨§¨¦A§±¨åª£­ß°g´*¸¼À÷ÃäǿˉÏ9ÓÒÖQÚ¸Ýá9äWç^êOí-ðòò«õKøÝú_ýÍÿ3Í 4 V t€ŽŒ}rXI%!#ë$Ô&²(˜*€,e.Z0D2I4B6T8c:…<°>è@*C|EÕG{@¶B E_GÄI1L£NQˆSêU=XeZj\ ^Œ_‚`ù`Ê`Ú_^R[€WžRŠLcE%=þ3 *•Æú cÿPõõë~ãܺÕ}Ð^Ì8É Ç£Å÷ÄÙÄ8Å÷ÅýÆCȯÉ;ËæÌ˜ÎcÐ1ÒÔóÕÝ××ÙÑÛÜÝíß â0äbæ èîêEí¬ï ò¡ô.÷ËùlüÿË‚0Ô e Ù#8quëÍóSÊ]ê ‰0ÿü÷ð–çÏÞèÕ;ÍúÄm½Æ¶2±Å¬˜©•§¿¦ò¦¨þ©‰¬™¯³²¶ºx¾tÂ[ÆIÊ ÎÔÑkÕûØgܽßýâ#æ3é.ìïåñœôJ÷ßùfüßþFŸë&_ ƒ ¥·ÄÈÈ¿¯ †p S"6$&ú'Ý)Á+­-•/Š1}35„7—9±;Ö= @HB’DìFJI¸K)NP SvUÅWZ\Ñ]I_Y`ë`Û``y^è[VXŸSÑMÚFÕ>×5 ,¨!ê rC÷½íåtÝêÖuÑÍÊÉnÇàÅÅÚÄ ÅÑÅÆÆÈeÉïÊ‘ÌDÎ ÐÖѱӔÕ}×tÙlÛv݃ߟáÂãôå.èyêÎì1ï¤ñ!ô­öEùèûþGõ©M ã ]¯Ñ¨,CÚ×&©TÒ ¢snù¢ñAéƒàŸ×äΈÆ×¾ÿ·7²Ž­"ªæ§Ö¦Ü¦Í§–©¬ú®V²úµÌ¹¸½«ÁŃÉXÍÑ¿ÔGØ¿Ûß[âŠå›èšë‚îZñôÉö]ùíûdþÐ)|¹ñ  ;Q^gabNA* ö!Ù#º%¡'{)i+I-8/)135 709F;n=™?ØA!DsFÔH=K­M!P”RúTVWŽY¡[z]_,`Ò`ë`D`Ø^x\Y¡TOKHz@ª7.»# :‡>ù“ïÁæêÞ#ØxÒíÍbÊÞÇ"Æ8ÅÚÄťřÆÀÇ#É Ê?ÌïͯÏ}ÑTÓ3Õ×Ù ÛÝß5áTãƒå¾çêZìµî(ñ¡ó*öÂø`û þ»k Æ_ ã 7hIâÁÚRöÖ¹³ ¬´Óú/óåê7âXÙŽÐ ÈFÀE¹C³c®¸ªC¨û¦É¦“§0©„«_®¬±Aµ ¹õ¼çÀÚÄÃÈšÌ^Ð Ô™×ÛsÞ¼áìäèëøíÇð‘óBößønûìýW¸L‚ ± Ñ ëùÿÿîãÊ´˜!}#]%A'")+í,Ù.Å0¾2¶4¿6Å8á:ÿ<0?eA°CûEaHÁJ4M¦ORƒTßV!Y:[ ]º^ö_º`í`q`._ý\ÔYU4P­IBu9÷/Ê%*[=ûnñqèdàjÙ‡ÓÂÎ ËMÈtÆXÅíÄÿĈÅhÆ„ÇÞÈUÊíËÍUÏ%ÑöÒÖԽ֭إڪܱÞÊàèâåHç–éÚëBî¨ð#ó«õ:øÜúƒý0æ“AÝ _ Æ÷î”ØŸÞoEG^ˆ °é1ü³ô‡ìéãÛ>Ò¸ÉÄÁŽº^´A¯[««¨(§Ä¦_§Ô¨«Ë­±Ž´M¸1¼$ÀÄÈÚË¥ÏTÓìÖgÚÑÝáRäjçtêaíAðó½õ_øðúpýàÿA—Ú B j ƒ“ ŽoS=!#%ã&Å(©*Ž,{.e0]2T4W6b8v:–<Á>õ@=CˆEçGHJºL(OžQ ThV²XÑZÄ\m^¼_`ê`—`w_z]„ZyVTQ K¥C8;â1Ø'F¸BýTó)êïá¸Ú¢Ô¤Ï·ËÎÈÄÆ‹ÅúÄ÷ÄkÅ8ÆLÇšÈÊ ËCÍÏÅОÒvÔ^ÖKØ@ÚEÜJÞ`à~â£äßæémëÃí/ð¥ò)õ¶÷Wú÷ü«ÿY ºU â KˆB™Òކ²ýO¯ Šý/ö(î•åÍÜíÓ[Ë@Ã軵*° ¬©d§Ç¦0§„¨Œª?­[°Û³·q»\¿VÃ?ÇËëΜÒ;Ö½Ù%Ýyà®ãÔæÛéÓì²ï~ò6õÜ÷rúñümÿÆ(j§Ü ü -8?80" ûÙ Ä"¢$‡&h(L*0,.0û1ò3õ5ù7:(‡@ÉBEmGÔI=L¯N#QŽSôU>XjZf\^‚_u`ä`°`½_ê],[QWlRVL+Eñ<Æ3Ü)b¢Ö Mÿ?õìëãÜÇÕÐpÌTÉ!Ç¿ÅÅðÄTÅ ÆÇVÈÂÉNËóÌ«ÎlÐDÒÔÖè×àÙÝÛãÝøßâ;äiæ«èõêLíµï%òªô3÷Òùqü!ÿ΃/Ó ` Ñ(ìYSÇ ÀŒ¡ 1Þþ¡÷ÀïAç€Þ¤ÕúÌËÄC½®¶"±Ä¬œ©¤§×¦§5¨ª¯¬¾¯'³Ú¶¬ºš¾’ÂzÆcÊ+ÎéцÕÙ|ÜÖßã9æEéBì"ïöñ¯ôZ÷òùyüïþW±ù<k – ´ÆØÖÛËÆ­™€ d"G$*& (î)Ô+½-§/™1’3Ž5š7¥9Â;è=@YB¢DùFZIÄK5N¨PS€UÉWZ\Ê]B_J`Ø`Å`ö_W^À[%XtS–M©F—>¦5Ó+{!¿ô X0÷µíå{ÝòÖˆÑ2ÍäÉ…ÇþÅ+ÅõÄ;ÅåÅáÆÈzÉËŸÌVÎÐäÑ¿ÓÕŒ×|ÙyÛ~ÝŽß§áÌãýå6è‚êÔì<ï©ñ)ô´öKùíû—þH÷ªH â U¥Á”(±°ïsɇ L ùIñïè1àXפÎSÆ®¾ã·%²ˆ­(ªò§ï¦ô¦ð§µ©+¬¯²¶ï¹Ú½ÉÁ¿ÅÉvÍ-ÑØÔ_Ø×Û0ßpâžå®è°ë•îjñ*ô×örùüûvþà<ŠË - Idmyrq`P< "ç#Ï%«'“)u+^-G/:1-3.507@9Y;}=ª?éA-D…FáHJK»M*PŸRU[W‘Y¡[s]ý^`Æ`Ï`,`¶^P\îXmT×NHD@s7Ñ-#ßj,ù†ïÀæëÞ0؈ÒÎ|ÊôÇ@ÆLÅûÄ&ÅÅŪÆÙÇ4É´ÊOÌμϋÑ`Ó@Õ*×ÙÛÝ&ß<á^ã‹åÇç ê`ì¿î,ñªó0öÇøfûþ¼sÊX Û 1U;Éó³Æ{b `Z€úÕò”êçáÙOÐçÇÀ$¹2³Z®½ªN¨§â¦³§R©§«„®Ò±eµ0¹½ÁøÄáȵÌxÐÔµ×*ÛŠÞÒáÿäèëîÝð£óRöñø€ûûýjÆ[” À ã ú ðÞÁ¬!‹#p%Q'3)+-è.Ù0Í2Ç4Ð6Ö8ò:==?zA¹CFgHÔJ>M°O$R‰TçV"Y=[]µ^é_ª`×`X` _Ü\¤YdUPxIàA;9Å/˜%7*û`ñnèhàtÙ•ÓÙÎËlȉÆxÅÅÅ Å~Æ›ÇðÈhÊþ˪ÍiÏ-ÑÓàÔÉֹدڳܼÞÒàòâåVç—ééëFî³ð)ó°õCøÞúŠý2è•?× [ »êÜ·„®D  > _•ÝûZô4ì˜ãÃÚÿÑ}É—ÁnºF´:¯Z«¸¨9§à¦z§ø¨)«ò­'±³´p¸T¼CÀ4Ä Èù˼ÏpÓ׃ÚáÝ2áaäƒç„êvíSðóÏõpøû‚ýòÿS¥ï$ Y u ˜¡±®­¡’~fK!1#%ô&Ö(¹*¢,Š.y0l2f4j6s8ˆ:§<Ð> AJC›EôGXJÆL6O§QTpV³XÖZÁ\f^³_Š`Ø`y`Z_R]ZZHV QÓJkCÿ:¬1¡'T™)ýBó%êêáÅÚ«ÔºÏÌËèÈÞÆ§ÅÅÅ„ÅNÆeÇ«ÈʯËWÍÏØÐ¨Ò…ÔjÖUØOÚLÜWÞhàˆâ®äçæ"évëÌí8ð¬ò/õÀ÷[úý¬ÿ] ·S Þ Ay.~^«`Ow¶] ¿3ýØõÌíFå{Ü©ÓË ÃÇ»bµ%°¬'©u§Þ¦R§¡¨´ªa­ƒ°´µ·“»€¿sÃ^Ç;ËϺÒQÖ×Ù;ÝàÆãææòéåìÅïòJõî÷„úýzÿÜ7z¼è  ->KMK@3 í Ó"´$˜&x(^*B,-.0 246 8"::š@ÖB*EzGäIIL½N,Q›SöUGXjZd\^v_h`Ñ`—`ž_Ç]þZ'W5R"LñD¶<3£)4u´ /ÿ/õßëãÜÕÕЊÌfÉ@ÇÙÅ*ÅÅhÅ(Æ(ÇmÈÕÉ`Ëͷ΀ÐLÒ'Ô Ö÷×éÙéÛîÝàâAäuæ²èÿêUí¼ï0ò¯ô>÷Õùzü#ÿÕƒ1Ï ] ÉØ@3£rŒÚIÇR Þ„þK÷cïñæ,Þ^ջ̕Ľ¶±Â¬Ÿ©º§è¦/§S¨EªÓ¬å¯M³þ¶ÏºÁ¾®ÂžÆ~ÊHÎÒžÕ+Ù”Üíß&ãNæ\éSì:ïòÄôm÷úüÿþiÁ L~ ¦ Ç×ééêàÒ©’ u"Y$9&(ÿ)æ+Ì-»/ª1£3 5©7¸9Ô;ø=,@hB³D GhIÓK@N²P!S‚UÒWZ\Ç]7_>`Å`«`Ü_0^š[øW=ShMhFg>f5£+G!•Ï <÷©íåÝþÖ—ÑEÍýÉÇÆGÅ ÅXÅúÅùÆ)ÈÉË´ÌbÎ&ÐôÑÇӮՓ׊قۈݘ߰áØãæCè‡êàìCï±ñ1ô¹öTùòûþJü¨K Û O›²ü…»<΃: øÍÿºøöð–èâß×bÎ Æ‚¾Æ·²ƒ­+ª¨§§¨Ù©M¬F¯Ÿ²F¶ºý½éÁÝŽÉÍLÑíÔ}ØêÛG߉â°åÇèÁë©î~ñ;ôéö…ù üˆþôJ Ù 9 `n†ƒ‰rcK3 "ù#à%¼'¤)†+n-]/F1E3;5E7O9l;‹=¿?öA@D“FðH[KÄM;P¤R UaW’Y£[o]ó^`°`¼` `”^*\¿X>TNÜG@;7™-Z#´î Lù}ïµæóÞ3ØœÒÎ–Ê È]ÆfÅÅCÅØÅÆÆìÇIÉÈÊ_ÌÎÊÏ›ÑmÓLÕ8×!Ù$ÛÝ0ßGáeãšåÌçêiìÅî:ñ®ó;öÌømûþÀuÇY Ñ )H(´ÔzŠëŒQ1 %ú|ò=ê“áÄØ аÇ³S®¿ªX¨(§ú¦Õ§s©Í««®÷±‹µU¹6½,ÁÅÉÐÌ–Ð9ÔÏ×@Û¤Þçáå,è.ëîñðµógöù”û þ~×-l¦ Ò ó &"îÖ»!#‚%`'H)(+-û.é0à2Ú4à6è8; =Q?ˆAÌCFxHâJLM¾O+R•TéV*Y;[]«^à_˜`Â`<`é^³\{Y/UËO@I¤A9Š/f%Ï^ûPñfèhàzÙ¦ÓæÎ8ˀȧƑÅÅ9ŵŘƯÇÉ}Ê̽ÍtÏAÑÓïÔÕÖÄØ½Ú¼ÜÉÞÜàüâ(å]ç¢éñëOî»ð1ó¹õHøéúŒý;æš:Ú S ³ÞÊg¡Z ÚÈØí =„ûôÛëCãzÚ¶ÑDÉeÁMº.´1¯W«Ä¨K§ú¦š§©Q«®P±Õ´˜¸u¼eÀWÄ:ÈÌØÏ‰Ó×—ÚýÝFáxä—ç—êŽícð.óâõ€øûýd·6 h ‹ ¤·À½³¢x\!B#"%'ç(Í*±,.‰02x4y6‡8—:¹<ã>A\C«EHjJÐLEO±QTtV»XÓZÀ\a^¦_`¿`c`8_0]-ZVíP˜J7CÁ:x1i'í)z ý4óêíáÇÚ»ÔÊÏáËÉøÆ¿Å0Å,Å›ÅiÆvÇÄÈ0ÊÂËgÍ!ÏäзґÔtÖeØWÚXÜaÞràâ¹äïæ,é~ëÕí@ðµò5õÉ÷^ú ý¯ÿa¶T Õ <pld;†0<q¾ jÜü~õxíðä-ÜfÓÞÊ᜻Oµ°¬0©„§ù¦l§Å¨×ª‡­©°$´Ù·¶»¡¿”Ã}ÇWË"ÏÏÒoÖêÙXÝ¢àÜãûæêúìØï¥ò[õø•úýŽÿîGÌû ! =P\_\RD0!á"Ë$¤&(k*V,<.+0246"8/:N©@éB8EŠGñIXLÈN9Q¡SVGXnZ`\^n_X`¾`}`_¥]ÒZùVRìK¸D8@|B¿DGuIßKONºP+SŠUÖWZ\¿]0_1`°`•`»_^q[ÊW S0M4F->15m+!k« %÷£íå„Ý ×§Ñ]ÍÊ»Ç0ÆcÅ&ÅnÅÆ ÇBÈ É&ËÂÌuÎ3ÐÒÕӺ՟הÙÛ•ÝŸß¼áÛãæHè“êçìIï¼ñ5ôÃöXùøû¡þOý§K Ô H‘ŸrÞëkTù”8ê ¨rÿeøœðAè”߯Ö$ÎéÅZ¾ª·ÿ±‚­,ª¨§,§0¨ü©r¬l¯Æ²f¶7º¾ÂùÅÚɬÍdÑÕ“ØÜ^ßœâÈåÙèÕë¾îñPôûö˜ù ü˜þ^®í$ L nƒ“—™…s]D *" $ñ%Î'·)–+‚-l/Z1T3M5V7a9};=Ï?BRD FIeKÔMBP±RUgW–Y¡[l]ë^`Ÿ`¤`ñ_p^\XTgN¦GÎ?7c-)#‡É /ýønï´æôÞ?Ø«Ò%άÊ%ÈtÆ…Å-Å[ÅóÅÙÆÈZÉÛÊqÌÎÜϦÑ{ÓZÕ>×3Ù(Û0Ý6ßQásãœåÝçêsìÏî=ñ»ó>öÕørûþÅwÆS Í :›·X]»TíË ·´Ëù'òçéDáxØÌÏwÇſ渳L®Áªg¨:§§ò§—©ñ«Ñ®²¯µy¹W½MÁ3ÅÉì̱ÐSÔå×[Û·Þþá+åAèCë-îñÈówöù¢û!þê<~· ã 028-%æÍ!¯#‘%u'W):+$- /ü0ð2ì4ï6þ8;4=`?—AÞC-FˆHïJVMËO3RŸTïV*Y=[]¤^Õ_…`±``Í^ˆ\QYU—O IkAÎ8T/6%£çBùúCñcègà‡Ù³ÓûÎNË™ÈÀÆ®Å5ÅRÅÍÅ®ÆÆÇÉŽÊ"ÌÊ͆ÏKÑ!ÓùÔâÖÌØÉÚÅÜÒÞçàã1ågçªéúëXî¿ð?óºõSøìúý?ê˜>Ñ O §Ð¹Q=^垎¥ Áè/û©óŠëñâ1ÚrÑÉ5Á0º´*¯Z«Î¨`§§¹§;©r«<®s±ú´»¸•¼‰ÀrÄ\È2ÌôÏŸÓ6׬ÚÞZáä¨ç¯êœíyð>óôõ”ø&û¥ýwÈF { — ¹ÆÏÔÌųŸ‹l!T#2%'ö(á*¾,².—0’2‡4‹6—8©:Ê<ò>+AgC¾EHxJÞLLO¿Q!T~VºX×Zº\\^›_m`­`G`_ ]ZêU¹PeJýBŽ:@1<'½Vüü$óêðáÎÚÍÔØÏþËÉÇÖÅKÅFŲůŒÇØÈBÊÒËyÍ-ÏóÐÄҜԄÖjØgÚ_ÜlÞ{àœâÁäöæ8é‚ëáíFð½ò<õÐ÷cúý°ÿg ·P Ï 4a[H]åü,t »†ü%õ"íœäáÛӦʯÂz»6µ °¬9©•§§‰§è¨úª¬­Ï°H´ÿ·×»Ä¿±Ã›ÇtË;ÏíÒ…ÖÚnݶàõãçê íìï¸òmõø¦ú*ýžÿXžÝ 5 KckqjeSE(!ó"Ú$¹&œ(*d,Q.:0/2'4'608B:^<ˆ>¸@üBDEœGýIfLÓNEQ§S VJXoZ_\ ^c_I`«`c`b_]ªZÉVÎQ¸KDFJ@‰BÑD'G„IíKXNÉP1S’UÚWZÿ[½]#_$`ž`{` _ì]G[ŸWØRþLýEô=þ48+ì @Œ øö•íåŠÝ׸ÑrÍ*ÊÓÇLÆzÅDŃÅ1ÆÇ[ȯÉ;ËÑÌ„ÎCÐ ÒçÓÁծכٙۜݭßÃáæãæOèžêëìUïÁñ?ôÇö`ùûû§þPþªD Ó >…”XÌÆJ&\ÃOòž R!ÿ øHðîçEßÖãͺÅ.¾‘·í±~­1ª$¨*§K§N¨ ª–¬¯ë²‹¶Wº@¾*ÂÆöÉÇÍÑ!Õ©ØÜrß´âÛåíèèëÑî¢ñdô ÷©ù2ü«þnÀý6 ] ~–¢©¨¢”…lX 8"!$ý%ä'Ä)«+-€/j1e3`5e7t9;®=Þ?B[DµF IvKßMNP¹RUiW›Y[j]à^ù_`Œ`×_L^Ý[cXÜS4NlGš?Ê62-õ"`¡ æøeï®æøÞJظÒ:ÎÃÊ=ȓƙÅLÅrÅ ÆòÆÈrÉëʃÌ0ÎêϴщÓcÕO×9Ù8Û4ÝEßXá}ã§åáç'êwìÜîBñÄóDöÝøuû þÈw"ÀR Ä -†—42‹Ó£ h\vùÏñ’éóà0؉ÏBÇ›¿Æ¸õ²H®Àªz¨H§6§¨º©¬ö®?²×µ—¹½hÁWÅ9É ÍÉÐnÔû×tÛÌÞâ>åWèWë@îñØóŒö'ù¶û0þŸûMÇ õ /=FG>8 ôà!¿#£%„'i)K+4-/ 13ý479 ;H=n?ªAîC;F™HúJeMÖO?R¤TöV.Y;[]œ^Ç_x`•``¦^h\YÔT`OÓH5A”8/%uÂ$àú7ñYèmàŒÙÂÓÏd˱ÈÛÆÅÅSÅhÅêÅÁÆàÇ)É¢Ê3ÌÚÍ–ÏZÑ,ÓÕîÖØØÓÚÐÜÛÞðàã8årç²éì`îËð@óÈõVøòúšý=ó•@Ì K ħ9g:±iMMV p’ÕúTó/ë¡âáÙ1ÑÓÈÁ º´¯]«Ö¨t§,§Ö§`©”«d®—±"µÛ¸¾¼¥À•ÄyÈMÌиÓR×ÃÚ.Þoá¥ä½çÅê°íðSóöªø5û¸ý&ŠÙ#W © ÊÖäâáÓÆ²—„!`#I%'' )ð*Õ,¿.­0¡2™4¡6£8¿:Ö<?7A|CÉE!HƒJîLWOËQ(T‡V½XÙZ¸\T^’_]`—`.`ø^ä\ÚY¸U†P-JÅBS: 1'Œß2âüóêêáÙÚÔÔîÏÌ-É/ÇòÅeÅ]ÅÏÅ“Æ§ÇæÈ\ÊàËŒÍ;ÏÑÏÒ«ÔÖyØnÚlÜtÞ†à¦âÉäç=éŽëèíNðÆòDõÕ÷múýºÿeµN È ,ULê/ø8в¼î$ p¿/üÎôÊìLä‘ÛÜÒiÊ€ÂV»µý¯¬B©¨§(§ª§©!«Ð­ó°o´"¸ü»å¿ÑúǑËWÏÓžÖÚ„ÝÏàä&ç-ê!íðÉò‚õ%ø¹ú<ý¯ÿg²ì E _t}‚~teU:$!#ë$É&±(Ž*x,a.K0B28486D8O:t<“>Î@CWE©G JrLáNMQ³SVPXqZ\\^Z_:`–`J`B_Z]Z™V›QKFD<ä2 )ŸýI ãþ÷ôÇëvã/ÜôÕÕÐÆÌ±ÉŠÇ(Æ|ÅWŸÅhÆqǨÈÊ—Ë6ÍèΩÐvÒNÔ/ÖØ ÚÜÞà6â`äŽæÐèëoí×ïEòÈôP÷êùŠü2ÿÞŠ0É M ±êè›ñÔ/êð'ƒë e âýFö]î÷åA݉ÔÌÿè¼F¶ä°»¬³©é§0§„§¶¨°ªC­R°À³g·<»"¿ÃúÆÒÊžÎQÒìÕsÙÙÜ/àhãŒæ˜é‘ìrï@òûô¤÷:úÂü4ÿžõ@² Ù ù  ñá «"Œ$m&R(4*,.é/ä1Ó3×5Ü7ê9<*>`@•BæD3G–IùKhNÑP?S—UàWZÿ[·]_`Œ`e`_Ê][nWªRÀLÉE¸=Â4+³ d çâöŠí åÝ×ÈÑ…Í?ÊîÇcƘÅYÅ¡ÅEÆ8ÇmÈÆÉMËãÌ”ÎPÐÒñÓÏպצ٧ۤݸßÌáòãæ\è¥êøìZïÌñDôÓöcùü¨þW¨H Ê ;z…G°«!#Œ ©Q ÿÉþ³÷ðï—çõÞ5Ö¥ÍÅ ¾k·ä±r­9ª.¨D§d§p¨Aª¾¬´¯³­¶º`¾MÂ8ÆÊäÍ›Ñ<ÕÃØ3ÜŠßÈâóåéìâî¸ñsô#÷¹ùFü¼þ&„ÎE p §´»»°©“‚e N"-$&ó'×)½+¢-/1t3s5v7†9;À=î?*BnDÂFIKîMXPÄR#UnWžYž[e]Ú^é_~`s`º_,^²[;X¦SÿM6G^?–6ö,Æ",‚ ð×øRï¬æùÞRØÈÒNÎÖÊZȥƺÅ`ÅÅ!Æ Ç+ȇÉûÊ—Ì<ÎüÏÁÑ–ÓqÕY×DÙDÛ?ÝMßeáƒã³åéç0êƒìàîOñÆóQöàø~û$þË{!ÀM ¿  ïk~  Xâ’]2 ùxñ;é£àä×LÏÇr¿¥¸â²?®Äª…¨_§P§/¨Ý©:¬¯f²ùµÀ¹œ½ŽÁtÅXÉ'ÍâЉÔ؉ÛçÞ)âUåmèhëXî)ñïóœö<ùÆûEþ®^ Ú  &AMXWQH4# ð!Ó#²%˜'w)_+F--/!13579:;P=…?¶AÿCKF§HKtMßOKRªTÿV.Y>[]•^¼_f`€`ê_…^B\óX£T*OœHû@[8é.Î$HšÍú%ñUèlà”ÙÐÓÏ~ËÄÈúÆÚÅqÅ~ÅÆØÆôÇ>ɶÊCÌîÍ¢ÏhÑ<ÓÕúÖäØÞÚÚÜçÞúàãCåyç¼é ìjîÐðLóÍõ]øúú›ýHï›;Ë D ”·”%Gù1 @{úýòØêPâ–ÙëОÈ×Àë¹î³¯b«Þ¨‰§D§õ§‚©»«…®Á±Bµ¹Ý¼ÈÀµÄ•ÈlÌ,ÐÓÓi×ÞÚBÞˆáºäÑçÙêÄí¢ðeóöºøJûÈý;—í2k œ ¼ ÙëðúêëÒǨ’!u#V%;')+ç,Ð.¿0²2«4°6¶8Î:ê<?LAˆCÜE-H’JúLeOÓQ3TŠVÄXØZ¶\L^ˆ_L`ƒ``Ö^Â\©YŽUMPûIˆB:Ð0Õ&_µÇüóêðáÜÚäÔþÏ#ÌHÉEÇÆ|ÅxÅçŪƽÇûÈlÊõËšÍLÏÑÝÒ¸Ô˜Ö†ØxÚxÜ~Þ‘à­âÓä çHé—ëðíVðÌòNõÚ÷túý¾ÿh¶G É M7Ö×¢|¨Ü mØûxôuìùãKÛ”Ò3ÊOÂ4»µò¯¬L©¸§B§Å§)©C«ö­±“´F¸¼ÀòÃ×Ç®ËqÏ!Ó·Ö3ÚœÝäàä8çCê5íðÝò”õ7øÍúLýÁÿ$yÃþ. W n‡“…vfK4!#ú$Ü&¿(£*ˆ,q.`0N2N4F6V8c:<ª>Ø@CaE¼GJLíNWQ¼SVRXtZY\^L_-``1`%_2]YZiVjQIKDÖ;±2×(rÓ( Êþæô¼ëyã0ÜÖãÐÝÌÉÉ¢ÇFÆ‘ÅwÅÌŃƅǽÈ$ʦËJÍôμÐÒ\Ô9Ö$ØÚÜÞ)à@âjä˜æÖè"ëvíßïMòÍôX÷ðùü8ÿß.Æ G ©Þ؆ִ½»ì>¤  “'ýòõî¤åõÜCÔÊËÌļ+¶Ù°·¬¾©÷§G§¡§×¨Òªi­w°ã³Ž·\»F¿/ÃÇñʹÎkÒÖˆÙòÜCàãœæ°é¢ì…ïUò õ·÷MúÐüKÿ¬RÄ ë )0,&îÖ »"œ$€&`(H*(,.ü/ò1ç3ç5ì7þ9<=>l@ªBðDFG¡ILsNÝPFS UãW Zü[³]_`y`K`c_£]øZ@WvRL‹E…=‰4Ó*‚ ð< ÔÊö‚í å’Ý,×ØÑ˜ÍYÊÈƱÅuŸÅ^ÆNÇÈÛÉ\ËõÌ£Î`Ð*ÒüÓÞÕÁ׶٬۴ݾß×áûã)ædè¬êíaïÔñMô×ölùü°þXª@ Ê /nv1™‹üÒòOÎ` °pþa÷–ïGç¦ÞñÕfÍNÅá½T·Ð±q­=ª@¨V§„§‹¨jªÝ¬Ý¯4³Ö¶ºƒ¾mÂVÆ3ÊþÍ´ÑUÕÛØJÜŸßáâæé ìúîÆñŠô0÷ÐùSüÒþ4˜Ü'S ƒ Ÿ¸ÅÊÍÁº£”v _"=$&&(ë)Ë+µ-Ÿ/1†3„5‡7—9¬;Ó=ý?;B~DÑF*IK÷MgPÈR.UrWŸYŸ[_]Ò^Ý_j`^`_^Š[ XwSÈMG%?^6Ä,‘"X Ú»øLï¤æÿÞ[ØÙÒ^ÎóÊlÈÇÆÐÅ}ŦÅ:Æ ÇBȘÉ˧ÌMÎ ÐÎÑ£Ó~Õc×TÙHÛNÝUßoáŒã½åòç8ê‹ìçîXñÍóWöéø‚û)þÒz$¾I ¸ ýÛU]ìÞ&¨Så ³ÿÆø!ñèèQà ×ÏÙÆA¿‹¸Ð²4®ÎªŒ¨y§g§R¨ü©a¬?¯Œ²¶á¹Â½ªÁ—ÅrÉDÍþСÔ/Ø¡ÛûÞAâhåƒè|ëkî=ñô®öPùÕûYþ¾!n³ë  ;N`jefUH1 ý!æ#Ã%¨')l+X-A/.1(35&709E;g=‘?ÊA D[F´HK€MëOTR´TW6Y:[ ]Œ^°_V`h`Ï_b^\ÈXrTöNfHÃ@#8¶.š$rå´úñMèoàšÙáÓ0Ï’ËâÈ ÇûŇŘÅÆìÆ ÈSÉÆÊVÌüͯÏ{ÑEÓ!Õ×ïØéÚåÜñÞá"ãNå~çÉéìsîÚðOó×õbøûžýKò›:É : Ž¥„ ,ÓçNýпà Ìé+ú¡òˆêýáNÙ¬ÐdÈ®Àɹٳ ¯_«î¨™§^§¨¢©á«ª®ä±iµ%¹½çÀÖıȋÌCÐñÓ}×ùÚVÞžáÏäæçíêØí³ðxó,öËø]ûÚýJ¬üD} ª Ð èüþúä×¹¦!#l%H'/)+ù,á.Ñ0Á2Á4¼6Î8Ø:="?\AšCèE@HJ MpOÛQ>TVÊXÕZµ\E^|_=`m`ù_·^™\‚YYUPÀIUBä9™0£&/ñ°üñòüéíáåÚïÔÐ8Ì_É`Ç(Æ—Å“ÅýÅÅÆÏÇÉ{Ê Ì©Í\ÏÑìÒÃÔ§ÖŽØ…Ú܋ޙà¸âßäçRéŸëøíaðÔòUõâ÷yúýÂÿk²I ½ :*½ú³êrDG`” Í‚ûô ì¦ãüÚRÒôÉ#Â»ï´æ¯¬T©Ì§Y§ä§J©g«®@±µ´o¸;¼,ÀÄøÇÉËÏ;ÓÏÖOÚ®Ýá.äRçUêIí(ðíòªõHøáú]ýÔÿ5‹Ô A d „” ¤Ÿ—ˆu^F!(# %î&Ñ(²*œ,‚.p0c2[4[6d8w:<º>ì@*CuEÇG*JŒLúNaQÅSVXXrZZ\ù]E_`k``_]+Z@5)ç Í"­$“&r(V*?, .0ÿ1û3ö58 :+~@»BEUG±IL€NèPNS¨UéW Zü[­] _ú_d`4`E_€]ÏZWFRVLVEJ=S4š*T ¾ ®¿öoí å”Ý4×éѬÍoÊÈ›ÆÉÅ‘ÅÑÅtÆhÇ”ÈïÉoËÍ´ÎoÐ7Ò ÔèÕÐ×ÂÙ¶Û¿ÝÇßãáä3æoè´ê ílïØñXôÝörùü²þ_©B  +bhk٢Ď´ Zþ÷@ïñæWÞ§Õ(ÍŸ½7·Â±i­FªK¨p§œ§°¨Šª­°Y³ü¶Âº¤¾ÂsÆSÊÎÒÑmÕõØaܸßôâæ,é$ìïÚñžôC÷ãùeüãþI¦ñ4f • °ÉÕÞÛÖɶ¤† q"P$6&(ú)Þ+Å-³/ 1™3•5š7§9Á;ß=@FBDßF9IŸKNoPÖR1UyW¡Yž[Y]Ë^Ï_X`G`~_æ]d[ÝWFS•MÃFó>6“,_"Ú4 ºªø:ï¤æþÞhØäÒuÎˉÈÝÆîÅ“ÅÃÅPÆ6ÇWÈ­É Ë»ÌZÎÐØÑ´ÓˆÕq×^ÙUÛUÝcßuášãÂåýçAê“ìòî^ñ×ó]öîø‰û-þÕ!¿C ± ôþÍ7C÷ñpÌ l_ÿmøÉð“èàR×ÉÎÆ¿i¸¿²/®Îªž¨‰§†§m¨&ª€¬h¯±²A¶ ºà½ÍÁ´Å‘ÉbÍѾÔEØ»ÛßVâ€å•è“ë}îSñôÆö_ùëûjþÎ7|Èø ) Jarw|sjWD, "ô#Ø%¸')+k-O/E1334557?9Z;u=¥?ÚADlFÂH(KŠMûOZR¾TW6Y>[]‡^£_D`U`¯_D^ï[X?TÀN/H…@î7z.g$ïHÆ™ú ñBètà ÙíÓCÏ¨ËøÈ)ÇơŴÅ4ÆÇÈiÉÙÊjÌ ÎÁψÑRÓ1Õ×üØõÚðÜüÞá*ãXå‹çÎéì{îáð]óÚõnøû¦ýOõŸ6Ç 2 †•uò±¸$½”xs }ÒùHò0ê«áÿØjÐ)ÈÀ§¹Ä³¯a«ù¨®§x§6¨Å©¬Ó® ²µK¹!½ ÁôÄÒȨÌ^Ð Ô–×ÛmÞ¶áääþçÿêííÈð‹ó?öÞøoûìý\¾V ½ á ùúãѰ!œ#w%^'?)!+ -ò.ã0Õ2Í4Ô6Ø8ò: =6?kA«CøELH°JMOâQFT•VÊXÚZ¯\>^r_*`[`Ú_—^s\UY*UèO‰IB­9a0p&ÿeÕ“üåòñéïáêÚÿÔ ÐQÌvÉzÇBƴŪÅÆÛÆåÇ(É‘Ê̼ÍjÏ.ÑùÒÒÔ±ÖØÚ‹Ü—ÞŸàÈââäçYé¨ëîgðÝò[õê÷ú!ýÅÿpµB » 0¦Ý‘¿C I zÃ+ûÅóÉëSã®Ú Ò¼ÉñÁëºÙ´Ù¯¬]©Þ§r§¨l©‹«B®c±ß´¸d¼HÀ4ÄÈéË«ÏRÓíÖbÚÊÝáJäcçoêZí<ðó¼õ\øóúoýæÿGæ R u –£´³±©™ˆoW!:#%ÿ&â(Ç*ª,˜.0v2l4n6u8‡:¤<È>ÿ@8C†E×G6J›LOkQÑSVbXnZZ\ó]8_`S``ß^î\Z VQÛJžCe;@2k(yç’þÁôªësã=ÜÖÑÍþÉÑÇ{ÆÆÅªÅÿÅ³Æ²ÇæÈLÊËËkÍÏ×ÐÒvÔRÖ<Ø+Ú*Ü+Þ>àUâ{ä­æçè5ëˆííï_òÝôe÷ÿù–üCÿä,à ; ›ÁºX¢t¶fKw´ tëxüAõXíýäYܶÓPËiÃ:¼öµÀ°°¬Ð©¨y§Û§©«°­Å°/´Ô·§»‡¿pÃUÇ)ËòΡÒ7Ö¼ÙÝtà©ãËæÖéÌì­ïzò4õÚ÷súõükÿÔ'y¯é ->OOQF:)ú Ü"Á$¡&†(g*O,5.#02 4 68!:8<`>@ËBEfG¼I%L‹NóPXS­UïW Zû[¦]_ê_Q``%_^] ZäVR LE=4c*& ’ú –¦ökíåœÝ@×ùÑÁ͈Ê5ȵÆãÅ«ÅéÅÆzǬÈÊ‚ËÍÂÎÐEÒÔõÕÚ×ÍÙÁÛÊÝÑßíá ä<æxè½êísïäñ\ôåöyùü½þZ ¤B ¼ #WV aN¯wŒÙFÑ b Ãý¯öæî æÞ`ÕéÌæÄ‘½·¯±h­Jª\¨†§º§Ð¨¯ª)­(°~³!·åºÉ¾­Â•ÆmÊ9ÎèÑŒÕ Ù}ÜÌß ã1æAé:ìïòñ«ô]÷îù}üðþ_´Cy ¤ ÂÛçïëêÕήŸ }"f$C&)( *ñ+×-Å/°1¬3¤5­7·9Ò;ò="@ZBžDîFHI©KNzPßR8U~W¢Yž[T]Â^À_G`-`a_Ã];[¯WS_MF·>ë5Y,0"¬ ”ø0ïæßnØùÒ„Î!Ë ÈøÆÆ®ÅÛÅkÆKÇnÈÀÉ4ËËÌlÎ*ÐéѿӗÕ{×jÙ_ÛaÝm߀á¢ãÌåèMê—ìþîbñâóböõøŽû2þׂ ¾= « æóµ " †Â2Ò†J ÿøsð<è´ß ׉ÎjÆð¾M¸­²'®×ª¦¨¤§ž§¨Hª¥¬¯Ô²i¶+º¾ïÁÑűÉ}Í1ÑÚÔ[ØÕÛ'ßmâ–åªè¨ë‘îeñ&ô×öoùüuþèA“Ö 8 \q„ˆƒ|gW< ""$ç%Í'­)‘+{-a/V1F3D5E7S9h;‡=´?éA.DyFÓH2KšMPhRÁTW6Y=[]|^™_/`@`‘_#^Ç[rX TŽNöGQ@²7H.5$Ä$©…úýðCèqà¯ÙùÓ[Ï»ËÉAÇ.ƾÅÌÅKÆÇ3È}ÉìÊzÌÎÕÏÑhÓ5Õ ×ÙþÚûÜßá5ãaå’çÙé$ì‚îéðcóàõuøû­ýQ÷Ÿ3Ä + y‹^Ýñ‹’ëŒN7$ +=xùõñØé[á¶Ø(ÐóÇWÀ„¹´³õ®g«©Ã§’§S¨ç©(¬ù®,²¹µj¹J½(ÁÅðÈÁÌ~Ð"Ô±×)Û„ÞÌáùäèëî×ð¡óPöòøûþlÐ!c¤ Ë ó )(#ûÜÆ!ª#Š%p'O)7+-/ö0ã2å4ß6ï8ÿ:=F?|A½CF^HºJ!MŠOîQNTšVÎXÚZ¬\9^c_`D`¿_x^K\)YûT²OSIßAs9-06&×8¶yüÖòèéïáòÚ Õ5ÐdÌÉ“Ç]ÆÍÅÄÅ1ÆòÆýÇ;É¥Ê+ÌÊÍ}Ï:ÑÓÞԽ֨؜ڕܢުàÐâíä)çbé°ë îoðåòbõó÷ƒú'ýÊÿp²@ µ $‘Án—ÖÈØú ,mÒúpópëã`ÚÌÑÉÄÁɺÁ´Ñ¯¬h©ï§§!¨Ž©°«g®ˆ±µ°¸Š¼iÀSÄ3ÈÌÄÏrÓ×ÚÝÝ+á^äyç‚êpíNðóÏõnøû‚ý÷ÿY¯÷2 b ‹ ¢¼¾ÉÁ·¯”„f!M#/%'ó(×*¼,¨.‘0ˆ2}46„8œ:°<Þ> AJC•EçGDJ§LOvQØS'VbXrZW\ë]1_ý_D`ã_Ä^Ç\ÕYÝUÍP£JiC(; 26(æRÃzþ®ô¢ëqãDÜ%ÖÑÍÊðÇÆçžÅÆÈÆÇÇþÈ[ÊàËxÍ(ÏãЮÒÔ_ÖHØ7Ú4Ü6ÞHà]â‡ä²æöè7ë•íôïgòäôo÷ú¡üAÿë/¼ 9 º¦G…Q’24và (’(üãôí§ä ÜrÓË8üܵ´°®¬Õ©+¨§ú§:©>«Ù­è°V´÷·Ë»¦¿“ÃrÇJË Ï¼ÒPÖÕÙ6Ý‹à½ãâæêéáìÀïŽòFõï÷ƒú ý}ÿæ:†Å÷  =P^daXL8$ !ð"Ñ$µ&–(y*a,E.80!2 46!83:I

    Ÿ@ÚB!ErGÍI0L—NÿP^S·UïWZø[¡]ö^Û_?`þ_ _6]|Z³VÞQéKæDÖ<ä3/*ójÔ z“ö]íåžÝK×ÒÖÍœÊSÈËÆÆÂÅƦƒÇÁÈÊ”Ë(ÍÓÎŽÐRÒ(ÔÖç×ÖÙÐÛÎÝâßòáäGæ}èÌêí‚ïåñhôëö~ùü¿þa §= º KHôK+ŒHZš „  ³lýWö‘îIæ»Ýկ̲Äh½·Ÿ±e­Oªk¨ž§Ô§ó¨ÎªS­I°ª³@· »è¾Ð´ƊÊUÎÒ¡Õ)ÙŽÜéßãKæRéSì/ïò¿ôn÷úŽüÿnÈV‹ µ ÕëùÿÿøìØÇª “"t$W&9(*,é-Õ/Å1»3¸5¼7Í9á;>2@jB®DGUI¹KN…PêR?U„W¦Yš[S]·^³_7``I_œ][€WâR&MXFx>¶5,ÿ!|é |øï™æßyØÓ›Î3Ë»ÈÇ"ÆÊÅòÅ„ÆcÇ‚È×ÉEËÝÌ~Î7ÐüÑÈÓ¦Õ†×wÙjÛnÝtßáªãØåèSê¥ìïoñçóköûø”û7þÜ‚#»9 ¥ Ùå¢|[ù‘=þ ʯþ¿÷ðéçdß¾ÖJÎ2ÆÆ¾.¸›²"®Øª·¨µ§»§¯¨jªÊ¬¶¯ø²‘¶Lº*¾ÂôÅÎÉ™ÍPÑðÔxØêÛBß‚â¬å¿è»ë§îwñ<ôæö‡ùüþöV£æ I l…‘Ÿ›–yhO 3"$ø%Ý'¿)£+-s/h1W3Y5T7f9y;˜=Å?úA=D‹FáH?K©M PsRËTW@Y6[]t^Š_!`$`y_þ]¡[EX×S\N¹G@y7.$“üˆlúðð7èuà³Ù ÔjÏÓË+É\ÇIÆ×ÅæÅeÆ3ÇLÈ‘ÉþÊŒÌ,ÎáϤÑnÓHÕ(×ÙÛÝß!áBãeå£çÜé2ì‡îõðióêõzøû°ýWø 6» * l~LÂ×gg¼PëÜ Öéÿùœñ„éáoØàÏÀÇ$Àj¹š³ñ®e«©Ô§®§r¨ ªO¬¯V²Ùµ“¹h½NÁ4ÅÉß̘Ð?ÔÉ×CÛšÞäáå'è)ëîíð´ódöù–ûþ‚ß3z® â /7:7)ñØ!º#%€'`)H+,-/1÷2ñ4÷6ù8;,=Y?ŒAËCFjHÊJ-M•OøQWT VÑXÚZ©\1^X_ `.`£_X^#\ÿXÉT}OI¥A<9ó/&¥’eüÂòäéìáûÚÕFÐy̩ɫÇzÆãÅáÅGÆ ÇÈPɹÊ:ÌÝÍŠÏJÑÓëÔÈֶآڦܦ޹àÕâùä0çmé¸ëîvðíòkõõ÷ú)ýÏÿs±> « úð~ Nmâ ‡”° Û{úóë±âÚˆÑHÉ”Á©º©´È¯¬s©¨¤§@¨°©Õ«‹®¯±*µÖ¸¬¼ŠÀsÄRÈ ÌãψÓדÚùÝ?áuäŽç•ê„ídð(óãõ€øû–ýl¿C w — ¸ÈÓÚÐϹª”w!^#A%' )æ*Ð,¹.¢0›24’6—8ª:Å<í>A[C¤EôGUJ²LOQâS*ViXoZW\ã](_ë_1`È_£^¢\©Y°U–PsJ*Cõ:Ñ1(³-ŸaþŸô–ërãIÜ2Ö)Ñ.Í(ÊÈ®ÆüÅÝÅ0ÆáÆÞÇÉnÊôˈÍ8ÏòлҎÔmÖRØCÚ>ÜCÞOàjâ便üèCë›íþïlòîôp÷ ú¡üJÿê“+¾ 0 ‡«•0k/jâû-| Ö?Îûô­ìUäÀÛ+ÓÜÊÃó»Ãµ¥°°¬Ü©;¨§§¨]©b«ý­±z´¸í»Ê¿±Ã“ÇdË+ÏÕÒmÖéÙQÝ àÔãøæÿéõìÖïŸò[õø”úýŽÿøKšÔ 0 Ncnuql[K4!#â$È&¦(*q,X.H062.4-628F:Y<ƒ>¬@îB-E‡G×I@L¢N QiS¼UõWZö[œ]ì^Ë_-`ä_ë^]QZ…V©Q¶K©D <ª3ú)Ã=³ [„öNíåžÝX×ÒçÍ·ÊgÈêÆÆÜÅƻƬÇÒÈ-Ê¥Ë:ÍäΚÐdÒ3Ô Öö×ßÙÛÛÞÝäßâäQæˆèÑê#í„ïóñlôõö‚ù#ü¾þh ¦= ² @4â-b"aÃ= È`ýþõ:î÷åiÝÓÔoÌÄF½â¶•±^­Yªy¨¶§ï§©òªv­s°É³k·,» ¿ðÂÒÆ¨ÊqÎÒ¿Õ<ÙªÜûß9ã[æjédìFïòÑô÷ú¥üÿ„Ù&iœ Å èû  üéÚº ¦"„$i&J(0*,ÿ-â/Ù1Ê3Ë5Ì7ß9ï;>>@B¹DGbIÇK,NPòRHU†W¨Yš[K]®^©_``$_}]ëZQW²RðLFB>}5ê+Ï!RÅ dgøï’æ ß„ØÓ®ÎKËÓÈ*Ç>ÆâÅ ÆŸÆuÇÈåÉ[ËìÌÎEÐ ÒÕÓ´ÕׄÙsÛw݂ߓá·ãàåè\ê®ì ïxñíóröù™û;þàƒ$µ: • ×ÏðãW/ZÂKú « zZþe÷Æï“çßzÖÎÆš¾¸†²!®ÜªÅ¨Ë§Ø§Ï¨‹ªô¬Ô¯&³¯¶rºL¾.ÂÆìÉ´ÍmÑ Õ‘ØÜXߘâÂåÓèÑë¹îŒñNôùö™ù üŸþh´ú1 Z €“§«°¨œwa D"*$ &ï'Ð)µ+œ-ˆ/u1k3f5i7u9Œ;¨=Ø?BQD•FóHMK²MP{RÒTW=Y<[ù\o^z_``Z_Þ]x[XªS"N‡GÝ?C7Ø-Ò#h×hZúÝð9èpàÅÙÔ‚ÏçËDÉwÇbÆñÅÿÅ|ÆNÇ_ȦÉËÌ=ÎðϱÑ|ÓUÕ3×"ÙÛÝß*áLãrå¨çéé8ì‘îþðmóöõ|øû´ýYþœ6¶ " `q6¬·@@†Ï¥ ‚“ÿÈøCñ0é¶à$آυÇý¿H¹‰³è®k«©î§Ä§”¨+ªs¬C¯y²¶µ¹‹½rÁOÅ2ÉøÌ¶ÐWÔå×VÛ·Þöá)å:è@ë)îñÇóuöù£û%þôB‹à ð ,DEMH90 ë!È#²%'u)X+>-(/1 357 9$;@=i?›AÝC%F|HÕJ;MŸOR[T©VÑXÜZ¤\*^M_ù_`ˆ_4^\ÏX˜TKOãHqA9¾/Ó%vîpMü²òÝéìáÛ$ÕWВ̽ÉÈÇ‘ÆÆ÷ÅdÆ Ç)ÈcÉÌÊMÌðÍ–Ï]ÑÓýÔÒÖÁذڭܳÞÅàÚâ å1ç|é½ëîðòòuõù÷•ú-ýÓÿw°: § ï Üg‚/=·cMKd ˆÅ#úÀòÅê^âËÙDÑ ÉhÁ„º—´º¯¬z©¨¼§`¨Ñ©ù«°®Ö±Nµü¸Í¼®À‘ÄrÈ>ÌСÓ9תÚÞTáä¡ç¯ê”í|ð8óùõ’ø)û¨ý~ÑT ‡ « ÅÝâìãÝͼ¤Š!q#P%6')û*à,Ê.¸0§2£4¢6ª8»:×<ý>-AnC®E H]JÆL&OQèS5VgXwZN\â]_ß_`°_‚^|\Y~UdP7JõB¹:›1Ï'„}Fþ‰ôëlãRÜ;Ö<ÑAÍBÊ ÈÈÆÆ÷ÅIÆùÆôÇ%É…ÊÌšÍHÏÑÈÒÔxÖ`ØOÚHÜLÞ]àpâ›äÅæéMë¢íðuòôô|÷ú©üMÿð‘/µ / {Ÿ†S DÓ¯ºí/ …îtû8ôUìätÛäÒ¡ÊÔÂλ«µš°«¬è©J¨Á§0¨©„«$®6±´F¸¼î¿ÒòǃËFÏðÒ†ÖÚgÝ·àëã çê íçï¶òlõø¨ú.ý¢ÿ^«ç C ]tƒƒ„{l`B/!#ó$Ú&·(ž*‚,j.W0I2@4=6F8Q:o<‘>¿@ýB>E’GéILL°NQvS½UÿWZ÷[“]ä^º_`Ê_Ì^í\%ZXVsQ€KrDeT@‹BÍDGsIÓK8NœPúROU‹W«Y˜[H]¤^š_ `æ__Y]¿Z'W|R»LèE>E5´+œ!' GRø ïæ ßŽØ"ÓÁÎaËìÈDÇUÆÿÅ#ƵÆÇ¯ÈûÉnËüÌ ÎVÐÒæÓ¼Õ£×‰Ù„Û€Ý‹ß á¾ãëåègêµìï€ñõózöù¡û>þæƒ%´3 ‘ ÅÆwÙÃ/'„« c %þ÷iïAçÃÞ1ÖÉÍÌÅr¾÷·w²®âªÒ¨ß§ö§ê¨´ª­ÿ¯H³Õ¶—ºk¾SÂ/Æ ÊÏ͇Ñ&Õ§ØÜkß³âÔåëèåëÌî¡ñ^ô÷©ù6ü°þ{Å @ n ލµÀ¾º­žŠo Y"9$&(á)Æ+±-–/Š1{3w5~7ƒ9Ÿ;¸=é?B_D¥FIXKÃMP‡RØTWAY8[÷\c^p_ü_÷_=_»]P[íWuSñMLG¨?7¤-ž#;²ICúÒð/èwàÆÙ$Ô“ÏüË`ÉŽÇ~Æ ÆÆ”ÆbÇvȹÉ&Ë®ÌNÎþÏÁцÓfÕ<×0ÙÛ Ý!ß8áRã|å±çòéAì™îñuóûõ„øû¹ý]þž3³  Uc!˜“"Wác= 6=ÿrøîðÚèiàÚ×bÏPÇп+¹v³à®o«'©þ§ã§®¨Rª–¬f¯¡²$¶Ù¹°½ÁuÅJÉÍÍÐsÔý×qÛÉÞâ9åSèPë@îñÚóŠö(ù¸û5þ£U›Õ (?QZ\WO?) ù!Û#Ä%Ÿ'†)h+Q-9/*1357 95;Q=y?¬AìC4FŠHåJFM¬O RfT«VÙXÖZ¥\^B_é_`n_^Ù[¤XjTO®H6AÇ8‹/š%MÁT2ü¤òÔéîá Û/ÕlÐ£ÌØÉàÇ­ÆÆÆxÆ:Ç>ÈyÉßÊaÌýͪÏfÑ1ÓÕåÖÈØÀÚ³ÜÁÞËàéâ åBç}éÎë îŒðøò|õø˜ú5ýÕÿy¯6 Ÿ æúÎLiƒ.  9pÌùjòpê â‚ÙÿÐÙÈ7Ágº~´´¯¬‰©'¨Ø§}¨ó©¬Õ®ü±tµ¹ñ¼ÏÀ°Ä‘ÈZÌпÓL×ÉÚ"Þráœä¼ç½ê¯í‡ðTóö«ø8û¼ý+ã-e ˜ ½ ÖîõúõïÜв!€#c%D')) +ò,Ú.Ê0¶2¸4¯6¾8Ê:ç<?=A|CÁEHoJÎL4O“QóS8VnXsZN\Ù]_Ï_`–_b^V\WYIU7PûIÁB:e1œ'V×^,þzô‡ëkãXÜFÖNÑVÍZÊ8ÈäÆ.ÆÆaÆÇ È:É—ÊÌ­ÍTÏÑÕÒ©Ô†ÖhØ\ÚRÜWÞdà}â¢äÐæéUë¬íð{òýô÷ú®üQÿò”*¸ # vt1ð©v}ªã 7˜ûàóì¯ã)Û¡Òfʧ©»•µŒ°«¬ñ©[¨Ø§O¨ ©¨«J®Y±Å´g¸2¼ÀòÃÑÇ ËaÏ ÓžÖÚ~ÝÐàÿã#ç'ê íúïÉòõ#ø½ú?ý³ÿo»ú+ S q…‘™“ŽmV@! # %ç&Ê(¯*”,{.k0X2S4L6Z8`:„<>Ô@ COE£GôI\L¸NQ{SÇUÿWZð[“]Ó^±_`´_¬^É\üY'VDQGK« (¼güTõŠíTåËÜJÔñË"Ä𼸶r±[­eª™¨â§,¨S©<«¾­½°´±·v»N¿3ÃÇèÊ¥ÎXÒðÕoÙÚÜ)àdã‡æ•éŠìrï;òüô£÷;úÇü7ÿ§ûLŠ¿ é 0/8'# ýÝ È"§$Œ&n(Q*6,.0ú1ï3ì5ñ7þ9<8>c@›BÞD+GIáKBN¨PSVUW«Y—[B]š^_÷_Ï_é^7]—Z÷VJR†L¯EÓ= 5‚+j!ü{ (>øÿî‹æß™Ø/ÓÙÎtË ÉZÇrÆÆ>ÆËƨÇÃÈÊ€Ë Í°ÎeÐ$ÒòÓÊլיيÛݓ߫áÇãõå'èqêºì ïƒñô}öù¦ûDþæ‡"´- ‰ º¶bÀ¢ ØðOÈh  Ó®ýºöïîæuÞêՌ͗ÅM¾Ø·h²®èªà¨ö§¨©Òª;­#°l³ÿ¶¶º‘¾rÂOÆ*ÊìÍ£Ñ=ÕÄØ0܇߯âëåÿèùëáîµñrô"÷ºùIüÀþ-‹×T | ¢·ÇÓÌλ³—… f"N$,&(ñ)Ú+¾-ª/š1Œ3Œ5‰7š9¬;Ë=ù?(BmD¸F IjKÊM.PŽRàT"WBY9[ñ\]^`_î_Ü_%_•]+[½WHS¹MGl?Ô6m-p# Ž,+úÇð)èyàÐÙ2Ô¥ÏÌuɪǖÆ$Æ4ƪÆ}LJÈÏÉ8Ë¿Ì_Î ÐÍÑ—ÓoÕK×8Ù(Û&Ý.ß?á[ã‡å¸çúéIì¡î ñ~óöø û¾ý`ÿ /°  NPzzúè%¤Uû ßîþøð‡èà’×&ÏǪ¿¹d³Ý®p«7©¨û§Ñ¨pª¼¬‹¯Æ²H¶ü¹Ò½­Á“ÅiÉ2ÍìЈÔ؇ÛßÞ(âLåièdëRî(ñêóžö8ùÌûEþ¶h«æ  5R`ohoXS9$ "ì#Ò%²'—)y+b-I/91-3$5*7.9G;^=‹?»AûCBF—HòJRM·ORnT±VØXÙZœ\^1_Ù_é_S_ñ]³[xX;TâNyHA”8U/q%¥1%ü“òÕéïáÛCÕzпÌîÉûÇÈÆ2Æ.Æ‘ÆNÇXȈÉôÊpÌ Î¸ÏvÑ<ÓÕíÖÖØÈÚÀÜÈÞÕàñâåIç‰éÒë,îŽðó€õøú9ý×ÿ}®2 • Ýé»4JæìS÷ÍÅÍ êyùò êÀá;ÙÃТÈÁDºq´©¯ ¬’©<¨ò§œ¨ªC¬ù® ²–µC¹½òÀÌÄ®ÈvÌ3ÐØÓf×ÜÚ=Þƒá´äÍçÒêÀížðaóö¹øJûÎý;¡õ:y ¦ Ì ëû þïÝŬ!’#r%Y'6)+-ë.Ú0Ê2Ä4Ä6Ê8Ý:ö<?MA‹CÐE#HzJÜL=OŸQöS@VoXuZI\Ñ]_¾_ð_y_D^/\.YUPÉI‹BJ:31i'.²@þnôëqã\ÜZÖ^ÑoÍqÊTÈüÆMÆ(Æ|Æ(Ç ÈPÉ©Ê*̸ÍjÏÑåÒ¶ÔÖxØcÚ_ÜaÞnà†âªäÚæé`ë±íð‚òõˆ÷úµüQÿö‘+±  kƒ_íÉòtBAaž æGÍúˆó°ëaãÞÚcÒ+Ê}ˆ»}µˆ°¦¬ªh¨ö§i¨Ä©Ë«m®~±é´‹¸T¼/ÀÄìÇ¿ËzÏ$Ó¸Ö2Ú˜Ýààä2ç@ê.íðÛòõ9øÍúPýÈÿ&†È ; d –¢§¦›’}hP!2#%÷&Þ(¾*¥,Ž.x0l2c4_6g8u:<³>à@C\E±GJgLÄN)QSÏUXZì[Œ]È^£_ì_œ_Š^§\ÐYûUQKDõ;3a)2ÃJ Jö3íúä°Ý|×GÒ*ÎúʶÈ7ÇgÆ-ÆeÆÇíÇÉeÊÝËmÍÏÊЊÒ]Ô1ÖØÚûÛüÝàâ@ähæ¦èéê=ížï òô ÷“ù4üÊþq §2 ¤ õ ¡Ý¬ë”„«ü_ Ûhüüô6íåÜÔ»ËíÃмž¶e±\­jª­¨ø§I¨u©\«è­ß°=´Ö·”»t¿NÃ1ÇËÃÎrÒÖˆÙñÜ>à|ã™æªéŸìƒïPòõ´÷QúÒüOÿ²ZœÐ ú .@BE;2 ò Ö"¼$š&€(b*F,1.02ý3þ58:'r@¬BìD;GIîKON®PSVU˜WªY•[;]’^z_è_³_Ì^]nZËVRTLsEž=Ò4Q+9!ÔW -øôîˆæß¡ØDÓéÎËÉxÇŒÆ0ÆYÆãÆ¿ÇÙÈ$Ê“ËÍÀÎsÐ2ÒÔÕպסٙۓݢ߲áÒãþå1èxêÇì$ïŽñô„öù§ûLþåŠ ±& ­¤N£ƒå¨À ‹ ÆYý`öÁî™æ(Þ¥ÕLÍgÅ$¾½·[² ®ïªî¨¨)¨0©÷ª]­L°³"·Üº²¾’ÂpÆEÊ Î¾ÑUÕÞØFÜŸßÙâæéìðîËñƒô4÷ÐùWüÕþ<œì+g Œ ´ÈÙááÜÏ©— w"^$?&#(*é+Ó-¸/®13œ5œ7ª9½;Þ=@=BzDËFI~KÑM=P”RéT%WFY7[ì\U^Q_Û_Ç__v][‘WS…MÞF8?˜6:-:#âgú¸ð$è|àØÙBÔ·Ï,ÌÉÃDZÆ@ÆKÆÆÆ“ÇžÈåÉIËÓÌoÎÐÝѦÓxÕ]×?Ù8Û0Ý8ßKáfã‘åÀçêNì¯îñ†óö’ø%ûÆý`œ/ª C>[`Ѽðm Ñ ¦ Ž“þÃ÷?ð2èÉßJ×áÎæÆ|¿î¸R³Ó®u«A©+¨¨ó¨’ªà¬µ¯é²o¶"ºò½ÓÁ°Å‰ÉQÍÑ©Ô,Ø¢ÛùÞ<âhåzè}ëdî>ñþó°öNùÜûZþÉ&z¼ú " Jbs~~zpcJ8 "ÿ#æ%Á'«)‹+s-]/K1=3:587C9V;r=œ?ÌA DTF¦HÿJbMÀO!RtT¶VÝX×Zœ\^)_Ä_Ô_5_Ñ]‰[MXT«N@HÅ@Y8/9%ïxü†òÇéðáÛKÕ‘ÐÐÌÊÈàÆPÆEƬÆeÇmÈŸÉ˃ÌÎÈÏ„ÑNÓÕýÖáØÒÚÏÜÐÞáàüâ åTç‘éÜë2îœðó‹õø¤ú=ýÞÿ|¬+ ” Ïݪ0½ÇÁ‰~ ˜Çÿù½ñÆémáîØ}ÐiÈáÀ$ºX´ž¯ ¬›©R¨ ¨½¨5ªh¬¯J²¹µm¹/½ÁíÄÏÈ“ÌQÐñÓ„×óÚVÞšáËäåçåêØí®ðzó(öÏø\ûáýO³NŠ º à ùî×Â!Ÿ#‰%g'J)1+-ý.í0Û2Ø4Õ6Ý8ï:=2?[AŸCÞE3HŠJçLLO¨QÿSJVmXzZC\Ì]ö^¯_×_a_^ \ýXíTËO‘INB:ø03'ú…øýZôuëjãeÜ_ÖqÑ͈ÊlÈÇcÆFÆ‘ÆAÇ6ÈdÉ¿Ê9ÌÍÍwÏ-ÑóÒÄÔžÖ€ØtÚfÜnÞyàâ¸äáæ#éfë¾íðòõ–÷ú¾üUÿù”+¬  ^xNÕú§ÇGS “ñrú1óWë ãÚÒíÉMÂa»hµw°«¬ª~¨ ¨Š¨ä©ð«”®¥±µ°¸y¼RÀ3Ä ÈÛË™Ï?ÓÓÖJÚ±Ýùà.äMçQêHí"ðòò¢õPøÝúeýÙÿ;–Ý N w ‘«±»¶°¡‘ya!G#)% 'ï(Ð*·,¡.‰02o4w6t8Š:ž<Ä>ñ@*CqE»GJqLÔN1QSÓUXZð[]Ã^_Ù__l^\¤YÌUÜPÜJÌCº;Ï2()–& ñÿ6ö(íôä¶Ý€×[Ò9ÎËÎÈNÇ…ÆBƃÆÇÈ%É}ÊíË€Í#Ï×ЛÒgÔAÖ"ØÚÜ Þà)âHätæ¯èóêGí¥ïò‰ô÷ù5üÓþq¥. ž î ó‰Ã‰ÄeNm¹ ½û¢ôàì«ä6ܸӀ˹ë¼€¶Z±V­uª¸¨¨c¨™©« ®±c´ú·¾»‘¿vÃMÇ"ËÝÎÒ#Ö Ù ÝUà’ã²æ½éµì˜ïcò$õÈ÷aúéü^ÿÇ"m¯â +COWTOA2!è"Î$¬&’(t*X,C.*02468#:5‚@¼BýDHG¡IøK^N¸PSaUšW®Y’[8]‡^n_Ó_›_¬^ð\AZŸVáQL„gº~‰ÔHÑ x+ý öiîEæÙÝ]ÕÍ3Åú½¥·E²®ïª©$¨E¨P©«„­q°·³E·»Ô¾´ÂÆbÊ(ÎÖÑsÕôØbܳßõâæ+é ì ïÚñ›ôF÷äùiüêþM¯ü>y ÆØíðõëãÒ¼¨ ‰"q$O&6(*ý+â-Ì/¿1®3¯5¬7¼9Î;ï=@MB‹DØF&I‡KáMFP RïT,WFY6[é\I^H_Ä_²_ä^U]ÕZeWâRMM©Fú>c6- #¶>óýù­ðèàßÙQÔÊÏA̧ÉÜÇÎÆVÆgÆÝƨǷÈ÷É^ËãÌÎ,ÐìѲӇÕg×KÙEÛ7ÝGßQáqã›åÊçêYì´îñŽóö™ø-ûÉýc š/¤  52éH<°¾4ÊŽ T A:þn÷ëïÝç}ßý֧ήÆW¿Í¸C³Ê®|«L©?¨/¨©³ª ­Õ¯³‘¶Gº¾óÁÑŧÉnÍ"ÑÀÔHظÛßSâ{å“èŽë|îOñôÃöaùïûlþÚ9‹Ð 8 XvƒŒ‚r^I ."$ô%Ö'»)+†-l/]1P3I5J7U9f;†=©?ÞADcF¶H KmMËO*R|T¼VßXÖZ˜\^_°_À__®]e[XØSuN HŽ@8è.%ÄPòðûvòÂéðá!ÛYÕ¢ÐçÌ Ê-ÈýÆgÆ`ÆÂÆ€ÇȸÉË–Ì/ÎØÏ”ÑYÓ,Õ×ïØÞÚÖÜÞÞêàã,åYçžéâë=î¡ðó‘õøªúCýáÿ~§, ‡ ÉÌ•Ÿ—ðƒQ18 BsÿÆøiñné!á Ø=Ð5ȱÀº?´›¯ ¬©©d¨#¨Ü¨XªŽ¬C¯p²àµ¹Y½2ÁÅêȲÌlÐ Ôš×ÛlÞ³áàäúçûêêíÄð‹ó?öÞøtûíýeÃaš Ë ñ ++-ÿéÐ!µ#•%|'Z)A+&-/ý0î2è4ç6ï8þ:=H™JöLSOµQTNVsXxZ?\Æ]è^Ÿ_Â_E_^ã[ÕX¼T—O]IBØ9Ã0ÿ&Î^ûâýIônëlãiÜqÖ}ћ͜ʊÈ/ÇÆ_ƪÆYÇLÈxÉÓÊKÌÞ͇Ï9ÑÓÍÔ¬ÖØyÚwÜsÞ…àšâ½äîæ&ésëÃí'ð•òõ–÷(ú»ü]ÿø—'ª  Wg;¿Û‡›ÓÄÙ EœúÙòë½âGÚÛѸÉÂE»Nµq°©¬ª’¨"¨ª¨ª¬¹®Ê±4µÔ¸›¼tÀSÄ*Èú˱Ï]ÓëÖbÚÊÝ áIä\çjêZí6ðó¶õaøðúvýìÿK¬ê2 [ Š ¢ºÅÊÈÀ³ Žn!\#4%!'ü(å*È,­.¡0Š2‰4€6Š8˜:±<Ô>A:C~EÊG#J|LàN:Q”SÛU XZê[|]·^_Æ_e_L^\\zYUªP¦J”C†;–2ø(Óo Øÿ%ö!íñäÀÝ‹×nÒOÎ*ËèÈjÇ›ÆbÆ•Æ9ÇÈ@ÉŒÊÌÍ4ÏäЩÒtÔNÖ0ØÚÜÞà0âRä{æ»èùêPí¬ïò‘ô÷£ù:üÔþw ©' ™ ä þâq¨f4/wÉ >¾iûKôìZäéÛwÓFˊʼf¶P±S­~ªÊ¨)¨¨¹©¤«0®,±ˆ´¸ß»µ¿’ÃoÇ;ËþÎ¥Ò>Ö·Ù#ÝjàªãÄæÔéÈìªïxò3õÜ÷súúüqÿÙ2¿ó  ;U_id`RD*!÷"à$¾&£(„*k,Q.@0,2%4 6#84:E@ÎB EYG¬ILgNÅPSgUŸW®Y[2]{^a_½_„_^Ì\ZoV±QçKE+=c4æ*× | ÔøÝî€æßµØaÓϼËQɬÇÁÆdÆ‹ÆÇíÇÉLʸËBÍâÎÐOÒÔïÕÐ׻٬ۮݲßÈáäãæHè†êÜì0ï¢ñô–ö ù·ûOþò‰"« q •„$p@›LX˜ %ܪü¶õîõåŠÝÕÏÌÅÒ½‹·9² ®÷ª©7¨d¨o©=«©­”°Ý³j·#»ö¾Ó¯ÆÊBÎôшÕÙsÜÑßã2æ9é7ìïìñ¯ôW÷õù}üùþb¾P… µ Ñïùÿóãη ›"‚$b&D(+* ,ø-Û/Ï1À3À5½7Í9ß;þ=)@[B›DäF8IKòMJP¬RóT1WGY4[â\A^7_¶_”_Ë^/]®Z9W®RMnFÇ>)6Ð,Ö"ÕëùŸðè‚àéÙ_ÔÞÏWÌÁÉöÇçÆrÆ~ÆøÆ¾ÇÍÈ ÊoËùÌ‹ÎAÐ÷ÑÀÓ•Õq×YÙMÛEÝNß]ázã£åÕçêbì¾î"ñ–óöžø4ûÉýk '¢ ú )$Ò/Ša‹÷@  æìý÷‘ïç&ß½ÖbÎ|Æ,¿°¸0³Æ®}«]©Q¨M¨1©Úª(­°2³¼¶hº8¾ÂñÅÄÉŠÍ?ÑÖÔfØÍÛ(ßkâå§è¤ëîfñ$ô×ötùüþèNšã I h‰’¤Ÿž“ƒrW A"!$&è'Ê)±+”-‚/k1d3Y5]7e9w;•=»?îA)DrFÃHK|MÓO7R€TÃVßXØZ\^_¡_¨_û^‹]=[òW¦SANÒGS@ë7­.Ø$’+ÔØûgòºéòá(ÛjÕ¯ÐÍ4ÊIÈÇ‚Æ{ÆÙƘǔÈÎÉ(Ë«Ì>ÎèϤÑeÓ:Õ×úØèÚæÜäÞøàã5ågç¢éïëCî¬ðó—õø¯úGýæÿ¦& ‚ ½¿€íïym¼O ò å ôÿpøñéÐàUØÐ÷Ç‹Àâ¹1´Ž¯¬µ©u¨A¨ö¨~ª­¬n¯² ¶®¹}½UÁ0Å ÉÌÌ‹Ð'Ô´×(ÛƒÞÉáøä èëüíÛð›óTöòøƒûþuÔ,p® Þ 3:A;3$üÞ!Ê#¥%'k)S+8- /1þ2ú4ø6ÿ8;)=Q?A»CÿENH¤JM`O¾QTRVwXwZ>\º]á^‰_±_&_á]¼[¨XTaO&IÚA 9‰0Í&7ØÇý:ôaënãnÜ{֒Ѭ͸ʠÈKÇ™ÆyÆÃÆrÇbÈÉæÊ^ÌðÍ—ÏIÑÓÛÔºÖ–ØŒÚ|܃ތà¥âÈäøæ1éyëÏí.ðòõœ÷-úÃü]ÿþ•'¥ LZ)§¾cs䜃–· ôFÄù…òªêlâùÙ—Ñ~ÉíÁ!»9µd°¬¬ª¦¨9¨É¨'ª9¬à®ï±\µø¸¿¼˜ÀoÄPÈÌÒÏuÓ×|ÚâÝ"á`ärç~êqíIðóÊõtøûŒýøÿd¶A o š ·ÈÚÙÞÏųœ†!h#K%1')ö*Ù,Ã.­0£2”4—6š8ª:À<è>ALCEÙG1JŠLëNEQSÞUXZé[u]©^r_®_M_+^5\RYjUwPoJYCN;^2Â(£Eá ¾ÿöíñäÀÝ™×}ÒcÎDËýȉǵÆ{ưÆMÇ2ÈSÉ£ÊÌ£Í@Ïûа҇ÔXÖ:Ø)ÚÜÞ#à>âXäŠæ¿èëWí·ï ò™ô÷©ù?üÚþw¤( Û ôÍ`‡Fsâô/ ëkûôó5ì äšÛ3ÓË\Ãc¼N¶C±P­†ªÜ¨?¨¡¨×©Ê«T®T±­´D¸¼Ø¿±Ã‘ÇWËÏÁÒUÖÕÙ5݉à¼ãÜæêéÛìÀïòFõï÷†ú ý„ÿêFÓ - Nep{usdU=&! #ð$Ð&´(—*|,d.O0>2740688A:Z<{>£@ÞBEiG¹ILrNÐP'SmU£W¯YŽ[,]r^O_®_f_s^£\ñY?VQ°KÎDñ<,4¯*¨ Oï ´ó÷Íîæ߯ØkÓ)ÏÑËiÉÉÇØÆ€Æ¤Æ,ÇÈÉ`ÊËËSÍñΟÐ`Ò&ÔÿÕÛ×ÄÙ»Û´Ý¿ßÑáïãæOè’êßì@ï¤ñôœö&ù¼ûTþðŽ¨ e ‹oP$n"_¾E ׈Uü^õ¼í¢å>ÝÑÔ—ÌÏÄ®½q·(²®ÿª©Q¨¨©`«Ï­¹°´Ž·G»¿õÂÌÆ¢Ê]ÎÒ¥Õ$Ù“Üàß ãBæSéIì3ïÿñÂôk÷úü ÿqÔc˜ à çûõáÅ ²"$w&U(8* ,.ò/Ý1Õ3Ì5Ó7Û9ï;>4@pB§DôFFIœKüMZP®RU1WLY0[Þ\7^)_£_{_¯^ ]‡Z W€RåL;FŠ>÷5—,«"^ù ·Øù’ðèƒàöÙmÔóÏmÌÜÉ ÈÇŠÆ›Æ ÇÙÇßÈ!Ê‚ËÍžÎNÐÒÐÓŸÕ€×cÙXÛPÝWßgá…ãªåÞçêhìÇî*ñóö¦ø4ûÔýh š'œ î !Àùh1\»Lû ¼ýÅö9ï<çÝÞsÖ'ÎIÆ¿–¸³À®„«k©g¨i¨N©ýªO­!°^³Ù¶ºV¾8ÂÆãɦÍVÑõÔ{ØæÛBßzâ¬å¸èºë îyñ8ôèö†ùü’þû^«õ( \ z–¨°µ¬¤–€k P"2$&ö'Þ)¿+§-’/~1r3m5l7w9ˆ;¥=Í?ûA=D~FÓH&K‡MàO>R‡TÇVâXÕZ\ø]_’_Ž_à^j][ÇWuS NœG@³7z.¥$j¸Àû[ò¶éóá2ÛvÕÄÐÍMÊdÈ0ÇÆ’ÆõÆ­Ç­ÈàÉ<˺ÌQÎ÷ϲÑsÓFÕ ×ÙöÚëÜóÞþàã>åoç­éõëMî°ð"óœõ#øµúIýêÿ¤ z ±¯mÓÑTB‹Íª › ¤Êþø»ðÊè€àØ¿ÏÆÇ`Àƹ´ˆ¯¬Â©ˆ¨\¨©žªÕ¬Ž¯¸²+¶Ô¹œ½wÁNÅ(ÉêÌ£ÐBÔË×AÛ—Þáá å&è#ëîêð²ódöù™ûþ‹ã>‚¿ î 0@MPKE3# ó!×#º%œ'~)d+J-0/!13 579;==_?AÊC F^H±JMkOÆQTVVzXvZ:\³]Ó^{_˜_ _¿]—[X\T1OìH©Af9W0œ&p¹³ý)ô^ënãtÜŽÖŸÑÅÍÎʼÈbÇ¸ÆÆàÆ…Ç{È¡ÉüÊmÌΤÏZÑÓêÔÂÖ©ØÚŽÜ‡Þšà¬âÒäç:é‚ëÕí9ð¢ò õ¡÷3úÅüdÿü—%   @N¡<L²dHKq ¢öÿoù.òZêâ±ÙWÑGÉÅÁýº'µY°­¬"ª¶¨U¨å¨Hª_¬¯²|µ¹á¼·À“ÄfÈ4ÌêÏÓדÚ÷Ý=ápä‹ç‘ê‚í`ð&óáõ‚øûšýrÉO ƒ © ÆÞåðèæÑÈ©™!v#_%>'#)+î,Ð.Â0°2¨4¦6¬8º:Ó<ó>#AZCœEèG>J”LøNOQ¢SèUXZæ[l]¡^__œ_0_ ^\%Y=UEP7J'C;)2‘(t ¥ÿöíðäÇݧ׊Ò|ÎWËÉ ÇÐÆ•ÆÉÆeÇHÈhÉ´Ê(̯ÍWÏÑÆÒŽÔgÖFØ3Ú#Ü(Þ/àCâgäæÉèë]íÀï'ò¢ô ÷±ù@üáþu $ ‹ Ï çºHl$JØ«·î6 ž»ú¡óâë¸ãSÛñÒÐÊ.ÃB¼6¶9±O­‘ªë¨Z¨º¨û©ì«x®z±Ï´i¸#¼û¿ÐíÇvË3ÏßÒlÖíÙLÝžàÑãòæýéïìÕïœò\õþ÷šúý•ÿýV¡ã ? as„‰ˆ„sfM9!#%â&Å(¨*,u.a0N2H4@6G8T:g<‹>µ@êB,EsGÊILN×P1SrU¦W­YŽ[#]i^?_™_N_T^\ÊYVOQ|K˜Dº<ù3|*z )Ì œã÷Ãî}æ$ßËØ€Ó;Ïé˃ÉáÇòƜƺÆDÇÈ-ÉtÊÝËbÍϪÐqÒ0ÔÖã×ÕÙÁÛÃÝÈßÚáùã#æVèêæìGï¬ñ"ô¢ö-ùÀûWþ÷‰$  \ |`ú6Hóí÷ 1üõkíOåóÜŽÔ[̞Ċ½U·²®«.©e¨œ¨¯©„«ó­Ý°)´²·j»<¿ÃðƹÊ~Î'Ò¿Õ@Ù§Üùß4ãXæféaìAïòÐô÷ú¡üÿ…ã/u© Ö õ'& ô× À"¢$†&g(L*/,.0ï1å3á5à7ï9< >I@zB¼DGUIªKNcPºRU9WJY1[Ù\,^_Œ_g_^è\`ZÚVNR­LFQ>¾5c,v"4Ó ™Áù‡ðèˆàþÙzÔЂÌôÉ)ÈǥƴÆ%ÇðÇõÈ6Ê•ËͰÎ\ÐÒÜÓ®ÕŠ×rÙ_Û`Ý^ßvá‹ã·ååç+êsìÌî6ñ¡ó&öªø<ûÔýo ž"™ å ÿ¬ùÜ=#ƒ³ rE?ýiöèîäæ‘Þ)ÖìÍÆÜ¾x¸³¸®Œ«v©}¨†¨l©#«p­K°€³·¯º¾TÂ2ÆýÉÅÍqÑÕ’ØÜUß•â¿åÏèÎëµî‹ñMôúöšù$ü¢þlÁ= k Œ©ºÀƾµ§’z c"E$)& (î)Ò+¸-£/1…3|5~7ˆ9™;¸=Ù?BFD’FÝH6KMîODRTËVäXÕZˆ\ì]õ^}_w_Ä^F]îZšWCSÛMdGä?7@.w$9à˜¬ûKò±éôá:Û…ÕØÐ*ÍgÊ}ÈIǺƩÆÇÀÇÆÈòÉTËÉÌcÎÐÂÑÓUÕ)×ÙüÚúÜúÞ á!ãHåvç¸éüëXîµð*ó¢õ+ø¸úQýéÿ„¢ q ¦ŸY¸².UÜ‹d N RtþÆ÷dðwè1àÊ×ÏÇ7À¨¹ ´¯¬Í©ž¨t¨4©Äªõ¬·¯Ü²Q¶ø¹¿½˜ÁoÅEÉ;Ð[Ôæ×WÛ±Þôá#å7è;ë&îþðÅóvöù¨û&þ˜øN“Ð ÿ #BOb]bPI1 "ê#É%®'‘)r+\-A/11$35796;I=r?žAØCFhHÁJMxOÍQT[V{XwZ3\­]Å^i_‚_ñ^]s[OX/TûNºHoA19 0l&D鞘ýôVëmã€Ü–Ö¶ÑØÍèÊÕÈ~ÇÐÆ©Æ÷ÆŸÇŽÈºÉ Ë‚ÌβÏlÑ'ÓøÔÐ֯ؠڒܗޠà¸âÛäçEé‰ëÞí?ð­ò#õ«÷4úÍücÿ”$š þ 4?w„ ‚*  # T ÿù×ñêÌáiÙÑÉ—ÁÞºµP°­¬-ªÉ¨n¨©iª¬(¯:²¤µ@¹½ÙÀ°Ä‰ÈMÌ Ð©Ó7×®Ú ÞUá‡äç¨ê•ísð=óòõ•ø*û«ý „Ú$` ” » ØìúýýóèÕ¾§!Š#o%R'1)+ù,è.Ï0Ä2·4¸6½8Ë:ã<?3AjC¬EøGIJ¦LþN\Q¨SïUXZß[h]’^Q_„__í]ê[þX UPJëBà:ñ1](Fó£ ˆÿòõíîäÎݲלÒÎpË2ɼÇêÆ°ÆáÆ€Ç[È€ÉÇÊ;ÌÁÍdÏÑÓÒÔrÖTØ<Ú3Ü0Þ9àOân䙿ÔèëiíÅï1ò¦ô+÷²ùIüàþ|¢ … Å Ö¬,Rÿ"§tz¦î KÇeúHóŽëfãÛ«Ò™ÊûÂ"¼¶/±L­ªù¨t¨Ù¨ª¬ž®±÷´‹¸I¼ÀöÃÈÇ–ËOÏøÒˆÖÚhݲàêãçêíçï³òkõøªú2ý¦ÿi³ô% T mŠ‘ž—•‡ucE!1#%÷&Ô(¼*,ˆ.p0c2Y4S6X8e:y<ž>Â@ýB6EˆGÓI0LˆNãP7S{U¨W±YŠ[]a^._…_5_1^]\žYáUQAKdD}<Ã3F*J þ§ Î÷¹îzæ&ߨØÓNÏÌ™ÉþÇ ÇµÆÖÆ\Ç1ÈDɇÊóËuÍÏ¿Ð{ÒCÔÖô×ÝÙÐÛÉÝÔßåáä-æ_è¥êðìOï´ñ(ô¬ö.ùÈûYþ÷¢ S pNâÝ#Á¸â?­ >à¬û²ôíÿä¥ÜKÔÌpÄc½>· ²® «=©~¨·¨Ò©§«®±K´Ù·Ž»\¿6à ÇÚʘÎBÒÚÕXÙÀÜàJãmæ|étìWï+òäô”÷(ú¸ü*ÿ›óBˆ· ê $,972(ë Î"·$”&{([*A,).02õ3ñ5ô7ý9X@ŒBÊDGbI¸KNoPÁR U>WJY1[Ñ\#^_y_O_o^Æ\6Z¬VRxLÏE>‡5.,I"± |®ùzðè‰à ÚˆÔÐšÌ ÊDÈ6ÇÂÆÊÆBÇÈÉGÊ©Ë)ÍÁÎlÐ#ÒéÓ»Õ–×}ÙlÛgÝmß{á—ã¿åïç3êxìÚî5ñ±ó#ö·ø<ûÝýl™" á ò”à¼ÛóCÌe (òìüö”î’æFÞãÕ°ÍßŶ¾^¸ÿ²¸®‹«‰©‘¨ ¨©?«š­l°§³&·Ôºž¾xÂLÆÊÞÍÑ'Õ®ØÜpß©âÔåäèãëÊîžñ_ô ÷­ù6üµþ!ÓO | žºÊÒÖÑŸ£ t"V$;&(*â+Ë-´/¡1—357˜9ª;Å=ï?B[DFìHEK›MúOIRœTÌVéXÒZƒ\æ]ç^k_a_¥^&]ÂZpWS¥M+G­?C7.?$µ}”û>ò¬éôáCÛ’ÕêÐBÍʘÈdÇÓÆÅÆ'ÇÝÇØÈ ÊfËÜÌsÎÐÎÑ‘Ó`Õ7×Ù ÛÝßá.ãOå„ç½é ì]îÁð0ó¬õ.øÁúRýîÿ‡¤ l šFž•ì#¡K þn÷ ð%èÝ߃×;Ï[Ç ÀŒ¹ô³~¯¬Ü©²¨Ž¨V©äª­ß¯³x¶ºá½¼ÁŽÅdÉ'Í×ÐzÔü×rÛÉÞ â:åMèOë<îñÙóŠö+ù¼û8þ« a¤ã  6U`umtb[C0 "ú#Ü%Á' )ˆ+k-T/D133/5+739B;^=€?²AçC.FxHÏJ&M„O×Q(T_V€XtZ1\¥]·^Y_j_Ô^}]H[$XüSÇN~H7Aó8í//&»}~ý ôOëkã†Ü ÖÊÑêÍËîÈ—ÇìÆÂÆǸǤÈÏÉË•Ì#ÎÆÏvÑ:ÓÕÝֿبڢܞޮàÀâæäçNé“ëçíGð´ò+õ²÷;úÒüiÿ˜™ ô -+óZió÷OóÈÂ Ö JÿÄøñ°é{áÙÒÐØÈiÁÀº÷´M°©¬=ªÙ¨ˆ¨#©Œª§¬M¯`²Ëµc¹*½ùÀÔÄ¥ÈnÌ$ÐÄÓSׯÚ&Þlá›ä·çºê«í‰ðNóöªø;ûÃý/˜ë7s ¦ Ì ê   õèз!Ÿ#~%c'F)'+-õ.â0Ö2Ê4É6Î8Ü:ô<?CAzC»EHWJ³L OdQ²SòUXZà[\]Š^?_o_ü^Ì]Ã[ÓXÛTÜOÌI³B£:½1&(Ê} qÿÜõüìêäÓݽ׬ңΈËKÉÖÇÇÈÆýÆ–ÇsÈ“ÉÝÊJÌ×ÍqÏ%ÑÞÒ«Ô€Ö`ØGÚ>Ü;ÞCà\âtä§æÚèësíÌï:ò­ô2÷¹ùNüåþ~  € º Ë–3Ýùv=;`£ ûpúïò9ëãºÚkÒXÊÑÂû»¶"±L­£ª©ˆ¨ø¨=ª5¬Ä®Ä±µ²¸m¼=ÀÄëdzËlÏÓžÖ"Ú{ÝÍàýãç&êíùïÈò€õ'øÀúAý½ÿ{Ç = _ …—¦¬¬¤›‡sZ!?##%'é(É*²,—.„0u2h4e6l8s:Ž<«>Ô@ CIE’GæI:L•NïP=SƒU­W°Y‰[]V^_q__^4\vY°UëP K)DF<‰3* Õ h¶÷°îtæ+ßàØ ÓaÏ̲ÉÈ%ÇÓÆêÆwÇGÈYÉŸÊÿËŒÍÏÑЇÒRÔ#ÖØéÙÚÛÕÝÞßîá ä5æjè­êùìWï»ñ2ô¯ö;ùÈûcþõ’  N ^AÌþÁö—~«ôi ìXûUôÀì¨ä[ÜÔçË8ÄA½·²ü­«M©“¨Ö¨ñ©Ì«=®+±q´ÿ·²»~¿YÃ+ÇøÊ¶Î^ÒóÕrÙ×Ü(àbã‚æ”é†ìoï<òúô¦÷>úÈü?ÿªT˜Í ö 0BHJC9(ÿ ß"É$¥&Ž(k*V,7.'02468:!j@›BÚD GmIÈKN{PÉRU@WMY.[Ë\^ý^h_2_S^¡\ ZVæQGLEå=L5ù+"ÚŒ ^—ùoðèàÚ—Ô.аÌ$Ê^ÈQÇÚÆäÆYÇÈ&ÉZʼË=ÍÏÎ|Ð2ÒõÓÉբ׈ÙyÛqÝv߆á¡ãÇåûç7ê‡ìÚîFñ¯ó4ö³øIûÚýv ‹ Ø öâ~Ç›ñ­½ ‡" Ö£”ü½õ>î?æúÝœÕsͬžB¸ð²²®“«”©«¨¹¨±©c«¾­‘°Î³I·úºÀ¾šÂlÆ=ÊüÍ©ÑCÕÄØ1܃ßÂâéåûèõëßî°ñuô ÷¿ùIüÆþ4æ$b ¯ËÚææãØÈ·› †"h$J&0(*ø+Ø-É/¯1©3ž5¢7ª9»;×=ü?.BgD®FûHNK¬MÿOXRžTÓVéXÐZ\Ú]Û^V_J_‰^]ŸZ@WáRpMôFu? 7Ù-$â’]}û2ò£éøáHÛ¡ÕýÐV͙ʯÈÇíÆßÆ>ÇõÇìÈ ÊuËòÌÎ(ÐÙÑ¢ÓhÕI×%ÙÛÝßá6ãZåŠçÇéìfîÈð8ó¯õ8øÁú\ýíÿˆœ a Ž€/ˆsä¾óf Ó ¶®Ëý÷¸ïÑç’ß:×ÿÎ)Çà¿n¹ä³u¯¬è©Æ¨ª¨u©«B­ÿ¯+³™¶Aº¾ØÁ³Å~ÉEÍóÐ’Ô؇ÛâÞ âOåcèbëPî'ñêóžö<ùÎûKþ¾tµõ  J`y}‡}zfY= *"$ð%Ð'²)˜+}-d/V1C3?5=7C9U;l=’?¿A÷C=F„HÝJ/MOßQ-TeV€XtZ,\œ]­^F_V_µ^]]"[ùWÍS’NLHý@Á8¶/&ê›]kýüóHëoã‹Ü³Ö×ÑÎËÉ´ÇÇÞÆ'ÇÏÇ»ÈãÉ3Ë¥Ì4ÎÓψÑDÓÕåÖÌØ²Ú«ÜªÞ´àÌâìäçSéžëëíPðºò0õ¸÷>úÖükÿ™• ì ÚDIÐ̽† ‹ ²ûþlø-ñ_é+áÛØÐ¦È=Á¢ºç´@°±¬Cªñ¨Ÿ¨A©®ªÉ¬u¯‚²òµ„¹N½ÁõÄÂÈ‹Ì;ÐãÓe×ãÚ8Þƒá±äÊçÐê¿íšðcóö¿øLûÒýE¦ÿG„ ¶ Ý ú øáÊ!¬#”%q'W)9+ -/÷0ã2Ü4Ú6Þ8î:=$?UA†CÌEHcJÀLOoQ·SùUXZÛ[U]~^._Y_â^ª]Ÿ[§X¬T­O”I€Bl:ˆ1ø'è§[ \ÿÌõöìêäÜÝÉ×ÁҹΠËfÉðÇÇáÆÇ©ÇȤÉôÊZÌç̓Ï/ÑñÒ´ÔŽÖkØSÚGÜFÞLàdâ䝿ãè(ëwí×ï?òµô6÷ÀùQüèþ w ® ¼„þ·ÒEýW ®¹ùòãêÆâsÚ'Ò%Ê¡ÂÛ»óµ±P­ªª"©¡¨©\ªZ¬ç®ë±@µÖ¸Ž¼^À5ÄÈÑˈÏ,Ó½Ö3Ú—Ýáàä2ç;ê.íðÙò•õ8øÒúSýÌÿ2‹× I v ‘ª·¼¿³¬•†i!Q#3%'ø(Ý*Á,§.™0€24r6}8„:<¼>ä@CWE¢GñIFL¡N÷PFS‰U­W³Yƒ[]I^_X__ñ]\IY„U¶PØJòCûôkìZäܿӫËĽ ·ö±ù­«\©¬¨ó¨ªî«c®N±—´"¸Ó»¤¿sÃLÇËÏÎzÒ Ö‰ÙðÜ=àwã™æ¥éì€ïOòõµ÷Rú×üSÿ¼f¨Ý *ATV\TH:$!ó"Ö$º&›(*b,L.40%2468:6{@©BêD,GIÐK+N‚PÓRUCWPY)[Ç\^ñ^S__4^}\æYQV¸QL\E®=5Å+ê!¯k C…ùcðèàÚ©ÔAÐÈÌ=ÊwÈnÇñÆÇkÇ7È5ÉrÊÎËLÍåΆÐDÒÔÔկהقÛ~Ý€ßáªãÐåè@êìãîKñ»ó7ö¼øMûÞýx ™ Ñ èÑj¨|È€†ÒAÜ †Q@üfõêíìå¬ÝVÕ6Í{Åg¾(¸à²­®š«¡©Á¨Ö¨Ï©ˆ«á­¹°ò³m·»á¾¼Â‰Æ]ÊÎÇÑYÕáØEÜŸßÖâæ é ìðîÇñ„ô6÷Ïù_üÖþG¡÷7r Ÿ ÂÛîöøôçÜı •"z$]&@( *,ì-Õ/Ç1µ3³5±7º9Ì;é= @>BwD¼F I\KµM P`R¥TÙVéXÐZy\Ò]Ë^G_/_m^Þ\tZW­R>M»F??Ó6§-Ý#ºk@iû$òžéûáRÛ®ÕÑjͳÊÉȘÇÇùÆVÇ ÈÉ6ʉËÍ‘Î9ÐèѰÓuÕV×1Ù"ÛÝß*á>ãfå’çÐéìkîÓð<ó¸õ>øÆú`ýðÿŒŸ _ |vqOÁÀ*ÌŠ i[wýÁö`ï~çBßóÖÀÎñƹ¿N¹Õ³l¯!¬ô©Ü¨Ä¨“©)«d­'°O³¾¶gº'¾úÁÒÅÉbÍѬÔ1Ø ÛøÞ9âdåyèyëaî=ñýó³öMùáû\þÐ.ƒÉ 2 [s†•’”‰xlO 8"$ü%æ'Â)«+Ž-y/c1Z3K5R7R9f;= ?ÒADIF˜HçJ?M—OëQ4TjV„XpZ*\‘] ^5_>_š^:]úZÎWšS]NHÄ@Š8|/Ó%ºu<Pýîó?ëmã”ܽÖëÑÎ/Ë!ÉÎÇÇ÷ÆAÇåÇÔÈõÉI˸ÌCÎæÏ•ÑVÓÕöÖÖØ¿Ú·ÜµÞÁàÖâ÷ä$ç`é¤ëúíTðÆò8õ½÷FúÚünÿ– ç Æ,*¬žîI5 = bžþøÑð éÜà‰ØTÐhÈÁ~ºÒ´7°±¬Nª©¹¨b©Îªñ¬–¯°²¶²¹k½@ÁÅåȦÌ^ÐøÓ‡×øÚRÞœáÆäáçæêÔí­ðzó)öÑøaûäýV»\” Ì ë 102&öÙ!Ã# %ˆ'e)M+2-/1ö2ì4í6î8;=;?_ACÖE$HqJÌL OvQÃSúUXZÖ[O]q^_F_Â^Ž]u[|X{TwO_IEB3:P1Â'º{: ?ÿ¼õèìêäßÝÕ×ÑÒÍζËÉÈ<ÇúÆ1ÇÁǤȽÉËrÌõÍ”ÏAÑüÒÆÔ˜ÖxØ_ÚSÜQÞXàlâŒä´æïè0ëíßïEò½ô<÷ÆùVüëþ€œ o ¥ ­qéø—¥ÍÁÔ  YËÿcùCòêrâ&ÚåÑêÉq¹»Ùµ±K­¶ª0©½¨0©‚ªz¬¯²hµù¸´¼ÀTÄ*Èë˧ÏHÓÔÖRÚ«Ýúà+äIçRêDí!ðïò¦õNøåúdýâÿCë% ` ƒ ¨¸ËÎÎɹ¬”}!b#E%*' )ð*Ð,¿.¢0š2ˆ4‹6Š8š:«<Ï>ó@-CfE±GÿISL­NQNSU¯W¶Y~[ ];^_C_é^Ò]í[YVU€P¤JµCÙ;3ª)º> /÷îmæ6ßôØÁÓ‰ÏIÌäÉKÈ]ÇÇ!Ç¥ÇuÈ„ÉÆÊ'̬ÍBÏîÐ¥ÒnÔ;ÖØÿÙñÛëÝôßâ!äGæ~è¾ê ígïÊñBô»öEùÒûhþÿ‘”ø 5 GÉwª3,pÔ Nç«ú¬óì äÀÛ|ÓnËÜÃö¼ï¶é±ö­%«l©Ä¨ ©7ª¬‹®t±¾´H¸ø»Æ¿•ÃmÇ1ËñΓÒ(Ö£ÙÝYà‹ã²æ¹é³ì”ïeò õÌ÷cúíüdÿÏ)y¸ó  ?RdljiYL6!#é$Ê&¯(*w,\.H052*4&6%84:D‰@½BõD?G‰IàK6NŒPÜRUHWPY([À\^â^?__^[\¸Y%V„QØK&Ep=ã4Œ+¸!„C &oùUðþç•à Ú½ÔLÐåÌPʕȄÇÇÇ‹ÇGÈRÉ‚ÊåË]ÍõΗÐQÒÔáջנٌۊ݇ߞá°ãÞå èLê—ììîTñÀó?öÁøTûáý| ™ Ä ß¿Q’W¤OT“ 8çûõ‘í›å]ÝÕ÷ÌJÅ?¾ ¸Ð²ª® «°©×¨ñ¨ð©®«®à°´”·A»¿ÜªÆ}Ê1ÎåÑuÕùØ^ܶßìâæ%éìïÛñ˜ôJ÷áùqüêþW·K„ ¯ ÓîýøïÕà ¦"Œ$n&O(6*,þ-é/Ô1Ë3Â5Ã7Ì9Ý;ø=@KB‰DÊFImK¼MPcR°TÙVíXÎZq\Í]º^5__O^»\OZåV}RM…F?6n-­#D"Qûò™éùá\Û»Õ"уÍÉÊãȳÇ!ÇÇpÇ ÈÉEÊ ËÍ¥ÎEÐüѹӇÕ_×>Ù/Û#Ý$ß5áGãpåœçÙé!ìxîÕðIó¼õDøÍúaýõÿ‹™ Q v_S2šbŽíA   ýkö ï+çóÞ®ÖοƑ¿0¹Æ³c¯)¬ü©õ¨Ü¨´©M«ˆ­N°r³æ¶‡ºN¾ÂòżÉ}Í,ÑÇÔIغÛßMâ~å‹èŽëyîLñôÂödùðûtþÞB“Ü I eŠ•¥¥¤˜Žwe H"0$&ø'Ó)»+ -‰/v1i3^5b7c9y;‹=¶?ÝADXF¤HöJHM¦OðQ?TlV†XqZ$\Š]”^!_'_€^]ÕZŸWlS)NÞG‹@S8G/¡%ŒL:ýÜó9ëkãœÜÈÖþÑ,ÎJË7ÉëÇ6ÇÇ[ÇýÇçÈ ÊZËËÌWÎòϧÑ_Ó.Õ×âØËÚÁÜ¿ÞÊàáâå/çfé®ëÿí`ðÉòBõÁ÷NúÚüuÿ˜‹ Û ±‰tºJò òSþ½÷„ð´èàEØÐ5ÈêÀ^ºÂ´.°´¬[ª©Õ¨~©ñª­º¯Õ²4¶Ô¹½`Á1ÅÉÁÌxÐÔ›×ÛhÞ²áÛäøçøêéíÁðŒó;öçøoûúýfÍ!l§ Ú 1AAB8. ê!Ó#²%˜'w)_+@-,/1 3ü4ý69;&=G?rA§CêE.HJÕL+O€QÉSVXZÐ[J]a^_,_¬^h]T[OXPT@O.IB:1‘'T 'ÿ«õáìéäæÝß×åÒÞÎÒË•É%ÈTÇÇIÇÙÇ»ÈÑÉË€Ì Î¢ÏQÑ ÓÐÔ¨Ö€ØnÚ\ÜYÞfàsâ˜ä½æ÷è8ëŠíæïMòÄôA÷ÌùYüïþ‚˜ f œ ž]ÓÛuzæ–‚“ à wÿùòñ;ê(âÚ٧ѳÉG—»Æµ±O­½ªE©Ñ¨Q©Ÿª¢¬1¯6²‹µ¹Ö¼¡ÀvÄEÈ ÌÁÏbÓðÖeÚÇÝ áDä\çeêWí6ðó¸õaøòú~ýîÿU²ö> l – ¹ÈßÛãÕϸ©‹!v#T%;')þ*å,Ë.¸0¦2Ÿ4–6 8¥:¾<ß>A=CsEÀG J^LºNQYS’UµW³Y~[]0^õ^._Î^µ]Ç[øX&UQPkJ…Cž;è2u)ŽU ÷“îkæ;ßÙÐÓŸÏ]ÌÿÉdÈvÇÇ;Ç»ÇÈ™ÉØÊ;̼ÍTÏúзÒvÔKÖ%Ø ÚþÛóÝÿß â)äRæ…èÇêíoïÒñIô¿öOùÓûnþþñ , 9‹¨Yáï/Š ˜TúZóÁë¸ãzÛ9Ó5Ë®ÃÔ¼Ö¶ß±ò­/«{©Ú¨,©Sª5¬«®›±á´k¸¼å¿ºÃ‡ÇRËϯÒBÖºÙ!Ýjà§ãÁæÒéÆì§ïyò0õß÷vúýüxÿÞ;‹È ( Pbyx€um\H/!#÷$Ý&¿(¡*ˆ,l.Y0G2;46688B:T˜@ÊB EFGžIåKFN’PæR!ULWPY$[»\÷]×^'_í^õ]6\’YöUTQ¥KïD:=«4^+ƒ!a ^ùFðè“à1ÚÅÔfÐøÌjʯȞÇ)Ç2ÇŸÇbÈcÉšÊôËqÍÏ©Ð]Ò!ÔíÕÈשٜێݚߠáÀããåèUêì÷îXñÊóCöÉøVûçý} ˜y ¹ Ôª@r9|"X¾I ë­•û»ô=íKåÝÏԽ̞ò·Â²§®£«Â©ë¨©ªÐ«(®±:´º·d»&¿þÂÈÆšÊNÎÒÕÙwÜÉßã%æ@é-ì"ïåñ³ôW÷öùƒüúþkÇ]” Á å úìÐ ¹"œ$~&d(C*+,.ú/ç1Ú3Ô5Ó7Þ9î; >.@\B˜DÚF&IuKÎMPrR²TáVëXÍZo\¾]±^__,^ž\!Z»VMRÑLOFÎ>c6<-z#_#?ûò•éúádÛÉÕ6Ñ–ÍäÊûÈÍÇ<Ç+LJÇ;È.É^ʰË'ͳÎWÐÒËÓ’Õl×LÙ6Û2Ý.ß=áSãwå§çàé-ì|îâðLóÆõHøÖúbýüÿˆ•þ K eSî9s6[³Ký κÌüö¹îÕæ­Þ`ÖHΊÆg¿¹±³`¯*¬ ª©ù¨Ó©m«®­q°—³ ·©ºp¾<ÂÆÛÉšÍHÑáÔdØÑÛ&ßhâŽå¥è ëŽî`ñ'ôÕöwùü„þñT¦ì( V }–«³¹³¬œ‹t Z"A$ &(æ)Ì+²-›/ˆ1{3p5r7v9†;£=¾?õA!DmF®HKTM®OûQDTsV‡XqZ\ƒ]„^__d^õ\­ZtW:S÷M¤GW@8/j%a%û#ýÌó0ënã ÜØÖ ÒBÎ`ËSÉÈUÇ&ÇvÇÈÉÊpËÜÌeÎбÑqÓ9Õ ×ïØÖÚËÜÌÞÓàëâ å4çsé³ë îeðÓòGõÊ÷Púäürÿ ”„ Õ ý ñ úìdG‹ ̨ ©¾þýi÷-ð`èBàú×ÔÏȼÀBº¬´'°·¬fª*©ë¨¡©«=­Ý¯û²Z¶ù¹±½„ÁOÅ$ÉßÌ”Ð.Ô¹×&Û†ÞÄáõä èëýíÕðŸóQööø†ûþ}Û8x¿ ç 0@VOXG@, ÿ!ß#È%¦'‹)p+Q-@/%135 79;9=V?„A·CùE=HJßL:O‡QÓSV%XZÑ[>]Y^ý^_^H]/["X T OóHÔAÅ9ã0['_)ù ÿšõÖìèäêÝì×òÒõÎå˳É:ÈpÇ.Ç`ÇôÇÏÈæÉ-Ë•ÌβÏaÑÓáÔ²ÖŽØyÚgÜhÞjà„â›äÌæýèCë’íîïVòÉôK÷Îùcüïþ‡™ b MµÁMU±aAM { »#ÿ»ø–ñíéÓá•ÙeÑyÉÂs»²µö°O­ÈªX©ë¨o©¿ªÇ¬W¯Z²²µ@¹ú¼ÄÀ–ÄdÈ+ÌÛÏÓ ×~ÚßÝ&áXäsç{êkíKðóÎõrøûŽýk¾J ~ « Äàêñòéß̹ž!†#g%M'+)+÷,Ü.Ê0¸2¯4©6¯8¸:Ï<ì>AHC†EÎGJpL¿NQ[S›U¶W´Yy[ú\'^â^_²^•]¢[ÌX÷TP7JICh;¯2C)].ø ûo÷…îlæ=ß ÙãÓ°ÏuÌÊ}È’Ç5ÇTÇÕǢȰÉêÊOÌÎÍaÏѿ҉ÔVÖ1ØÚÜÞ àâ8äVæ’èÎêíuïÜñMôÊöOùÝûoþ“Žé ! +õpŽ5SÛ¢ºã C ¯Cÿùójëjã+ÛöÒüÊ|õ¼½¶Ó±ò­6«Ž©ñ¨J©rª[¬Ï®Á±µŽ¸B¼ÀÜÃ¥ÇrË$ÏÌÒZÖÔÙ9Ý„à¹ãÛæãéÝì½ïŠòHõî÷Œú ýÿîPšÞ A \{ƒŽ‡ƒh^>!*# %ï&Ï(µ*—,€.i0Y2N4F6J8S:d<…>ª@ÛBEYG¦IùKMNŸPîR&URWOY#[´\ï]Ä^_Ï^×]\hYÅU!QmKµD=s4$+W!.ü íHù;ðøç˜à8ÚÖÔyÐ Í…ÊÉÈ·ÇEÇJǹÇzÈyÉ®Ê Ì„ÍϺÐkÒ1ÔøÕÙ׳٧ۜݡ߮áÈãïåè`ê¤ìï_ñÓóJöÏø[ûéý š s ± Ü&XSôê}ü ŸVAûcôèìøäÃ܉Ô~ÌêÄò½Ø·´²¡®®«Ï©©,©0ªñ«R®(±c´Ý·‰»L¿ÃìÆµÊoÎÒ¬Õ*Ù’ÜáßãAæOéJì-ïò¿ôm÷ ú“üÿ~×-l§ Ò ö++)÷ç È"¯$‘&s(U*=,.0õ1ï3ã5æ7î9ÿ;>>@mB¥DêF1I†K×M+PzRºTãVñXÆZk\´]¡^_ç^^x\ùYŽVR LF—>+6-H#2üâ'ûöñéÿáiÛÚÕEѯÍúÊÉèÇUÇEÇ ÇQÈFÉrÊÃË:ÍÃÎgÐÒÓÓ¤Õt×[ÙBÛ;Ý:ßGá_ã€å±çêé4ì†îéðSóÐõLøÜúgýûÿ–÷ A [?ÜõK 'w ± ‚hwüÀõaî„æ]ÞÖ ÎRÆC¿÷¸¢³[¯*¬ª©©ñ©«×­“°Á³.·Ïº•¾[Â3ÆøÉ¹ÍdÑûÔ€ØçÛBß|â¨å·è¸ë îwñ:ôçöùüšþh¶9 g §½ÄÊÆ½¯ƒ p"M$7&(ù)Þ+À-°/•13€5„7†9š;®=Ö?ýA9DvFÀHKaMºORLTuVŠXpZ\z]w^ÿ^ø^E^Ô\ƒZIWSÀMoG@â7Ú.=%/Û ý¿ó'ëoã§ÜäÖÒXÎwËmÉÈlÇEljÇ0ÈÉ8Ê€ËòÌvÎÐÀÑÓFÕ×úØäÚÕÜ×ÞÞàôâå?ç|é¾ëîpðØòOõÐ÷Uúèüwÿ – Ì ò á‹àÍ>WÕˆd Xp¤ý÷ÓïèïߵדÏËÇ‘À&º”´%°µ¬tª>©©¿©3«^­°³‚¶ºÖ½£ÁsÅ?Éÿ̯ÐKÔÑ×AÛ›ÞÞá å"è$ëîëð±óeö ù—ûþŒïI‹Î ý !EQfcfZQ;+ "÷#Ö%¹'Ÿ)|+h-M/:1+3!57$90;I=f?•AÅC FKH›JîLBO’QÚS V%XZÉ[9]J^ë^_r^)][øWîSÙN¾H™A9«0('1þÜîþõÊìçäñÝõ×ÓÏÌÉÉVÈ‹ÇGÇzÇ ÈäÈþÉ?Ë©Ì)ÎÇÏkÑ*ÓîÔ¾ÖØ‚ÚuÜpÞyà‰âªäÒæ éJë›í÷ï]òÓôN÷Ùùaü÷þ‡— W ‡ 9ž£'*€( / hÑþ`øBñ•é„áIÙ!ÑBÉîÁQ»µë°N­Öªd© ©ˆ©åªé¬|¯ƒ²Ôµj¹½éÀµÄ†ÈEÌúϘÓ%טÚöÝ=ánäŠçêí_ð*óàõ†øûžýzÓ] ‘ º Ùïýüïßdz!”#{%]'>)"+-î.Ü0É2À4¼6½8Í:Ü<?%AZC•EÙG*JvLÏNQeSžU½W°Yy[ò\^Ó^_–^x]y[¤XÅTëOÿIC/;w2)*Õ à\÷yîjæ@ßÙðÓÄÏŽÌ/ʘȫÇPÇmÇìǹÈÄÉËaÌÞÍvÏÑÒÒ”ÔbÖ@Ø ÚÜ Þà!â=ädæ™èÖê'í|ïåñSôÐöUùáûrþ’‰â  ãXr.¦qv£ ÷ `ñÿ¨ù®òëãàÚ³ÒÂÊNü¦¶Ä±ó­:«£©©i©“ª}¬ö®æ±.µ´¸c¼)ÀüÃÅÇËAÏçÒtÖðÙMÝŸàÏãñæûéïìÓïò\õø›ú$ýœÿd©ñ& N s‡™ŸŸ‹‚jR!;#%'ã(Ã*¬,.{0k2\4[6Z8e:u<—>¶@ïB"ElG±ILVN¬PôR-UTWPY#[ª\ç]²^_¶^¸]í[?Y—UïP8K~DÌ<84ò*&!Ù Ï3ù1ðóçšàCÚãÔÐ#Í›ÊãÈÐÇ`ÇaÇÓÇÈÉÁÊÌ’Í(ÏÅÐ}Ò;Ô Öá×Äٮ۪ݩ߻áÐãùå&èhê®ìïiñØóQöÕø^ûðý˜ n ¦ ¸Š:÷)dzß8· K æúô“ì§äwÜFÔ@Ì»Ä˽¿·¦²ž®³«ß©©H©Pª¬v®N±‰´¸®»l¿?à ÇÔÊŒÎ1ÒÈÕBÙªÜøß3ãWæfé\ìEïò×ô}÷ ú£ü&ÿ‹î:‚¶ æ !3<>91õ Ù"Ã$Ÿ&ˆ(f*L,4.0 2ú3ù5ô7:<+>N@~B³DúF?I‘KåM4P…R»TìVìXÊZa\­]^ú^Ð^ó]U\ÑY^VèQhLàE\>õ5Ï,# ÒÉ ûïñƒéâsÛãÕ^ѽÍË+ÉÈkÇbÇ·ÇiÈ\É„ÊÙËIÍØÎrÐ*ÒáÓ°Õƒ×dÙPÛCÝHßMálãˆåºçóé<ìîóðZóÔõSøßúký‹ñ 9 N/ÅÔ$ßð@Åm 3#üjõ î3æÞ×ÕÍÍ"ƿݸ³Z¯/¬-ª.©3© ª·«õ­½°å³R·÷º±¾‚ÂNÆÊÓÍÑÕ—ØÜVß”â»åÏèÌë´îŒñIô÷šù+ü¨þyÉG } œ½Ë×Û×ÎÀ¬˜ ~"b$F&%(*ê+×-¼/©1ž3’5•7—9ª;¿=ä?BCDˆFÉHKmMÁORMT}VŠXnZ\s]f^ñ^Ý^,^°\^ZW×RŽM8Gæ?¬7§. %Ú¾õü¯ó"ëqã¯ÜòÖ1ÒnΎˉÉ3ȉÇ[ǧÇAÈ.ÉHÊ•ËÍ…Î'ÐÏÑÓSÕ(×ÙðÚßÜáÞèàþâåJç‚éÇëîxðÞòWõÓ÷\úêü|ÿ •y Å ä ÑuÇ«í(—M Uý¿ö‚ï¼ç¥ßm×VÏ–ÇlÀºˆ´°¼¬ªQ©!©Û©X«­/°@³¨¶?º÷½ÆÁ‘Å]ÉÍÉÐfÔê×YÛ±Þôá!å6è:ë"îñÃóxöù«û-þ W¢Ú  2TfutxjbN8 !"$é%Ë'¬)’+u-_/M19355,759C;V=z?¡A×CFYH©JûLKOœQÞSV&XZÆ[.]A^Ø^ë^X^]ãZÊWÀS¦N‡HeAV9w0ù&ÿÝ·ÜþyõÅìçäõÝØÓÏÌáÉtÈ ÇeÇÇ$ÈûÈÊV˸Ì=ÎÓÏ~Ñ4ÓýÔÈÖ«ØŠÚ‚ÜyÞƒà”â²äÜæéVë íðbòÚôT÷ÚùjüöþŠ”ýR y o'‚†PïÅ ã|þøíðFé6áÙãÐÉÅÁ3»Šµá°U­Ýªz© ©¦© « ­¤¯¤²ûµ‹¹=½Á×Ä¡ÈcÌаÓA×­ÚÞRá†ä›ç¨ê‘íuð:óôõ˜ø/û¯ý'Œâ3k £ Ë êÿ îÜÀ!¨#Š%n'P)3+-/ê0Ü2Ð4Ê6Ó8Ö:ô< ?9AfC¥EèG4J…L×N'QlS¤U»W´Yp[î\ ^Å^í^^T]X[wXšT¶OÌIÛBü:A2à(þß· ÇL÷rîiæFß$ÙÿÓÛÏ£ÌIʳÈÄÇkÇ…ÇÈÑÈÙÉËrÌðÍ…Ï)ÑàÒ¡ÔqÖIØ/ÚÜÞà,âEämæ¢èàê.í„ïìñYôØöZùãûwþ“‚Ü ÌCQïv:9` ¬ žÿUùYòÄêÈâ›ÚpÒŒÊ"Ãm¼“¶¸±ó­E«±©!©©¸ªŸ¬¯ ²OµÛ¸„¼LÀÄæÇ©Ë`ÏþÒ‘ÖÚhݲàæãçêíæï°òoõø®ú6ýªÿmÃü: ] …˜¨³­® Ž`!N#+%'ð(Ø*º,¢.0y2q4i6k8v:‡<¤>Ë@øB6EwGÀILbN³PüR4UUWRY[§\Ø]§^ë^¡^•]Ì[YiUÁPþJODŽ< 4¾*÷ ݵ ¶!ù'ðïç¢àJÚöÔŸÐ;Í·ÊùÈîÇwÇ}ÇéÇ¨È£ÉØÊ-̨Í4ÏÖÐÒEÔÖê×Ðټ۱ݷßÁáÞãýå5èiê½ì ïtñÝóYöÚøcûõý’ b   §yø!Ñ•€¢ö m µ–ú»ó>ì[ä+ÜỔĩ½§·™²®¹«ð©-©b©sª5¬œ®q±®´%¸Ð»¿\Ã.ÇìʬÎKÒáÕYÙÃÜàJãlæxéuìSï-òãô–÷+ú¼ü1ÿ£ûN‘É õ 1EKPJ@1!ë"Ó$²&˜(w*^,D.-02468: <:>^@ŒBÅDGQI™KóM=P‰RÆTíVïXÆZ[\¢]„^æ^·^Ö]0\«Y1V·Q6L¦E*>½5,ê"Ûµ¨þúÞñ„éâ~ÛóÕlÑÚÍ*ËIÉȈÇxÇÒÇ}ÈtÉ™ÊëË]ÍæÎ…Ð4ÒóÓ¹Õ“×lÙ^ÛLÝPß\áoã–åÀçþéDì—îøð`óÝõXøãúpýÿÿê / B±è±®¾‡# èÆÍûõ¸íãåÆÝÕ•ÍïÅö¾¿¸ƒ³R¯8¬7ªF©H©4ªÔ«®ß° ´w·»Ò¾¥ÂjÆ:ÊïÍšÑ3Õ¬ØÜkß«âÒåãèàëÉîžñ`ô÷®ù;ü¼þ'ˆÝ ^ ‰ ±ËßçìçâÎÁ¥ ‘"r$V&:(*þ+æ-Ì/½1­3¤5¤7©9¹;Ò=ò?BUD“FÛH*KyMËORTTƒVˆXpZ \m]X^Û^Ë^ ^“\4ZðV©R[MG¯?s7v.×$ᮦÚü¤óëpã¹ÜýÖEҀΫ˜ÉRÈ ÇuǾÇZÈAÉ_Ê©ËÍ›Î3ÐàÑ›Ó`Õ3×ÙøÚíÜèÞõàã'åTç‰éÑëî€ðæò[õÛ÷^úïü|ÿ “ s » Ú ¾b¬ŽóÃób Ø ÂÒýnö0ïmç[ß(×ÏdÇEÀç¹y´°Á¬Œªd©<©ù©y«¥­O°i³Ç¶fº¾åÁ³ÅyÉ:ÍäÐ~ÔØsÛÈÞ â6åHèOë8îñØóˆö/ù»û@þ¯k¯ñ  J_|~Œ‚‚naG 3"$ù%Û'½)¤+…-q/Y1N3A5B7B9T;f=‰?²AãC$FfHµJMUO¤QäSV#XZ½[*]/^É^Ó^>^ã\¾ZŸW“SsNTH/A"9E0Æ&Û³ŸÃþlõÂìæäÞØ'Ó4Ï-ÌýÉŠÈ¿ÇyÇ®Ç8ÈÉ&ÊfËÎÌKÎåÏŠÑDÓÕ×Ö¶Ø•Ú܃Þàâ»äãæéYë­íðmòÞôZ÷áùjüûþˆŽûF o _mcãÑ!¶ˆ| ›Ì-þ¼÷ðóèìà½Ø§ÐÚÈ™Á»rµá°P­ëª©6©È©&«-­É¯Æ²!¶¬¹b½'ÁõÄÀÈÌ0ÐËÓWׯÚ%Þká–ä·ç´ê¬íƒðOóö©ø@ûÂý8žõB€ ± ß ÷(!ÿìÓ!¶#Ÿ%|'b)D+)-/1è2å4Ú6á8ë:=?FAvC²EøG?J’LâN/QvS§U¿W³Yk[é\þ]´^Ø^d^4]4[KXlT…O–I¨BÁ:2¨(ײ™ ­;÷iîgæMß/ÙÔîϼÌaÊÎÈÝdžǜÇÈçÈìÉ-Ë€ÌÎÏ;ÑëÒ²ÔzÖXØ9Ú&Ü$Þ#à5âRätæ¬èéê4íŽïññcôÛö`ùéûxþ}Õ þ¾'8ËØJþ e ÄMÿùòsêzâTÚ/ÒWÊõÂL¼}¶¯±ñ­Q«Á©9©Ÿ©ÖªÂ¬@¯/²wµú¸©¼kÀ:ÄÈÆË{ÏÓ§ÖÚ~ÝÊàüãç$êíùïÆò~õ-ø¼úJý¾ÿ&…Í E s ‘¬¹Âº³¡Œw!W#D%')å*Ì,µ.š02~4z6~8‚:™<³>Ø@ CAE…GÎILmN½PS9UZWOY[ž\Ï]•^Ú^ƒ^{]¥[ìX>UPÏJD^<Ð3’*Å º   ùðíç¦àVÚÕ¶ÐNÍÐÊÉȑǖÇȿȷÉíÊ?̸ÍFÏãЛÒUÔ"Öù×ÙÙÇÛ¼ÝÀßÊáèãæ=èuêÀìïxñåó]ößøfûùý€Ž^ ’ œcä´ØjIg· $ ¶dFúeóòëäèÛÁÓÓË]Ä…½‘·Œ²š®Ä«ý©F©©ªY¬¿®–±Ò´I¸ò»±¿}ÃIÇ ËÄÎhÒùÕrÙÙÜ%à`ãæé‡ìkï:òüô£÷CúÉüFÿ°`ŸÝ  .AT^^[R@0!þ"ß$Ç&£(Ž*k,W.=0-2468!:/k@ŸBÏDGZI¨KüMGP’RÌTîVòXÀZY\•]v^Ô^^º] \„YVˆQLtEï=‹5g,»"´Ž‘äú×ñyé â‚ÛÖ€ÑíÍEË`É9ÈŸÇ–ÇäǚȆɮÊÿËmÍøÎ”ÐDÒýÓË՘׀ÙbÛ^ÝVßiáwãŸåËçêNìîñjóàõ`øæúuýŒ†ç % 3˜Ï‘Ö„†ÎBß ›r€û¿ôií’åyÝQÕTÍÃÅ˾ª¸q³Q¯8¬JªW©j©Kªü«=®±/´™·=»÷¾¿Â‘ÆQÊβÑMÕÅØ7Ü€ßÃâçå÷èöëÜî³ñpô&÷¾ùQüÊþ;šë7i ž ÁÚóõÿúïãи ¢"‚$i&H(/*,ù-Þ/Ï1»3¸5²7¾9Å;å=@0BcD¢FéH5K…MÖOR^TƒVXjZ \]]O^Æ^³^ï]m\ZÃVwR(MÊF|?97B.§$°Ž‚Çü“óëpãÁÜ ×WҘμ˼ÉfȽǎÇÖÇrÈWÉtʼË%Í«ÎCÐðѨÓnÕ?×ÙÛøÜõÞüàã.å_ç’éÙë)î…ððò`õá÷fúòü€ÿ j ¶ Ê ±L’n̘½+Æ“ u­üöÛîç ßâÖÚÎ2ÇÀɹi´°É¬”ªz©W©ªœ«Ê­s°³î¶…º@¾ÂÑÅœÉTÍÑ™ÔØ‹ÛáÞ!âKåbèaëPî$ñíóœöAùÐûSþÁ'zà 0 Ys‹“œ—ƒrY D"%$ &ë'Ò)²+™-‚/k1_3U5O7Y9`;{=–?ÄAôC3FvHÂJM`O®QéSV(XZ¾[])^³^Â^^È\Z{W[SDNH÷@è80“&ªŽv¯þWõ¸ìãäÞØ9ÓEÏFÌÊ¥ÈÖÇ•ÇÄÇPÈ+É9Ê|ËßÌ^ÎõÏ™ÑTÓÕç־إږ܎ޙà¤âÉäëæ%édë³íðtòæôa÷çùmüÿ‡ŒôB a SûVC¿¦î€E; JÕýh÷Eð èœàsØhРÈqÁôº_µÕ°Q­öªœ©R©ä©H«T­ê¯ñ²B¶Õ¹½MÁÅàÈœÌMÐçÓq×àÚ>Þá±äÉçÎê¿íšðbóöºøWûÑýN¯W É ì #/742!üå!È#°%'v)S+>- /1þ2ò4ï6ñ8ü:=0?SAˆC¿EHMJŸLìN9Q{S¯UÁW³Yi[Ý\ö]¢^Â^K^][X>TRO^IqB‰:Ù1x(¢Œt ’)÷^îcæRß6Ù!ÔÐÍÌÊàÈýǚǺÇ0ÈÉÊAË”ÌΟÏLÑùÒÀÔ‡ÖdØDÚ3Ü-Þ/à?âZäæ²èòê?í“ïüñfôäödùîû|þ’{Í ö ñ©¦²Í¼Ù  tüþ«ø±ñ ê*â ÚìÑ!ÊÇÂ)¼h¶¡±ô­W«Ô©P©½©÷ªç¬c¯V²œµ¹Î¼ÀZÄ%ÈäË™Ï4ÓÂÖ8Ú•Ýãàä4ç6ê/í ðÜò“õ<øÓú[ýÐÿ9—Þ( T † ¤ºÎÏØËÆ¯£‚!p#N%3')õ*â,¿.³0œ2‘46‹8š:¦<Æ>ê@CUEGàI'L}NÄP S>U^WQY[—\Ä]‡^Ä^j^\][ÂXUWPšJÛC!<œ3V*– ‹k €øø ðêç¦à\ÚÕÂÐhÍåÊ,É#ȨDZÇÈÓÈÒÉþÊUÌÉÍVÏ÷ЧÒeÔ/ÖØåÙÔÛÇÝËß×áðãæEè~êÎìï…ñçójöâørûöý‹ •üZ ˆ SÌ莳:-m ß bíùóšë¶ã˜Û|Ó—Ë(Äc½s·²–®Ê« ª_©˜©´ª{¬å®¼±ù´o¸¼Ô¿ ÃiÇ,Ëã΂ÒÖŽÙñÜ@àvã—æ¦é™ìƒïNòõ¸÷UúÞüXÿÆr¶é  8YdprkeQA)!#ó$Ö&¹(›*,e.Q0>204*6(82:A@ªBãD!GjIµKNTP˜RÔTòVñXÁZO\Ž]f^¾^ˆ^˜]ì[VYÙUSQËK;E·=P56,„"‰fqÑúÄñwéâÛÖÑÎYË|ÉPȹǭÇÿǰȜÉÅÊÌ‚ÍÏ¥ÐSÒ Ô×է׊ÙpÛfÝeßná‡ã¥åÖçêUì§î ñmóíõaøðútý ‹‚á  &ýƒ°t«ZO“— L$(ûkôíBå*ÝÕ͒Ŧ¾Š¸g³E¯E¬Tªn©ƒ©pª¬g®)±T´Á·^»¿â¯ÆsÊ)ÎÓÑbÕåØKÜ›ßÙâþå é ìîîÉñ„ô:÷ÐùeüÚþO­þG} ¯ Òï   õàË ²"•${&Z(?*!, .ò/Ü1Ò3Ä5Ê7È9Þ;î=@=BsD±F÷HBK‘MßO)RaTŒV‹XlZ\W]>^·^˜^Ô]J\çY–VHRðL–F>?7.w$€j_²ü€óëpãÆÜ×gÒªÎ×ËÏÉ„ÈÒÇ«ÇëÇŠÈlɉÊÏË9͹ÎUÐþѵÓ~ÕK×*ÙÛÝßáã6åjç™éåë-î’ðóòkõè÷júùü€ÿ g ­ ¾ ¢7xO¨l‹ñˆJ -+\üÁõ…îÊæ»ÞÖœÎüÆò¿ª¹V´°È¬¢ªŒ©p©7ª¾«ë­°°³·§ºc¾&ÂòÅ»ÉqÍÑ´Ô8Ø¢ÛúÞ9âbåxèvëbî;ñþó³öRùãûeþÔ9ŒÕ A j…œ¥­¨¢“ƒj V"8$&ý'ã)Â+­-/1o3d5d7e9u;‡=ª?ÒADBFƒHÑJMmO¶QôSV+XZ·[]^¥^§^^£\lZMW,SNáGÁ@¯8Ù/^&|bY‘þFõ®ìâäÞ(ØDÓ[Ï\Ì*ÊÀÈîÇ®ÇÜÇiÈ?ÉPÊËðÌqÎЬÑ`Ó"ÕóÖÌØ¯Ú£Ü˜Þ¤à°âÏäøæ.élëÀíð‚òéôj÷êùvüÿމó5 [ ?ì8)˜|¾Eõ ÿ1ƒý÷óïJèPà,Ø$ÐoÈAÁÖºNµÅ°[­ùª·©d©ªg«x­°³l¶ô¹¬½hÁ;ÅûȼÌiÐÔ‰×üÚSÞ™áÇäßçâêÕí«ðyó,öÑøfûèý^Áf¢ Ø þ 5AIFA3$ ø!Ø#Â%ž'‡)d+P-//#1357þ8;=??eA•CÓEH`J¦LüN?QˆS¯UÈW±Ye[×\ì]^°^-^ó\ëZóWTO)I6BQ: 1C(s`P w÷Sî^æSßAÙ-ÔÐæÌ‘ÊþÈȵÇÑÇJÈÉÊT˨Ì'εÏWÑ ÓËÔ–ÖpØQÚ@Ü6Þ<àIâeäŠæ¼èýêFíŸïòpôêölùóûþ wÄ î á˜ùýƒˆæ—~– Í(¦þWø]ñÉéÞá¼Ù®Ñãɜ¼S¶•±ô­_«ã©j©Ø©«­Š¯y²ÅµB¹ò¼°À{ÄDÈ̳ÏRÓÜÖQÚ±Ý÷à*äGçPê@í$ðìò©õPøæúmýäÿL¦ö4 k • ¶ÍàáæßÓÆ¯—!€#`%F'%) +î,Ø.¾0°2£4œ6Ÿ8§:¸<Ö>ù@'CbEžGìI4L†NÎPSEU^WRY[’\¹]u^±^O^=][[—XáT&PdJ¤Cë;c3&*c dF fãøðæç¦àkÚÕÛÐzÍþÊGÉ:ÈÃÇÈÇ/ÈìÈåÉËjÌÙÍfÏѲÒvÔ9ÖØòÙÛÛÕÝÓßãáùãæOèˆêÒì(ï‡ñôólöêøsûüý‰úR ~ @µÍkŒ ßì1 Áÿ™ù»òHëeãRÛ9Ó]ËúÃ@½[·r²•®Î«ªr©¶©Òª¡¬¯æ±µ˜¸6¼ú¿½ÃŒÇHËþΠÒ/Ö¦Ù ÝSàã®æ¹é³ì‘ïgòõÎ÷gúñükÿÖ2…Ä ) Ngwƒ€rfQ:! #%è&È(¯*,x.b0N2B4;698B:S‘@¸BóD/GwIÄKN_P¡R×TùVîXÁZI\ƒ]Y^§^r^w]Ë[.Y¨U$Q“KE€=5,U"\EQºú¹ñoé â–ÛÖ¥ÑÎpË—ÉgÈÖÇÅÇÈÇÈ±ÉØÊ$Ì’ÍϵÐ`ÒÔáշדÙ~ÛpÝnß{áŒã³åÜçê^ì°îñ{óìõmøòúxý ŒÛ  êm˜M‹% U¾ Q ýÖÒúôÀìïäãÜÆÔÝÌaÅ€¾r¸W³A¯M¬^ª‰©™©’ª=¬ˆ®P±x´å·†»9¿ ÃÉÆ•ÊEÎíÑ€ÕüØaܹßçâæé#ìïÚñšôH÷èùsüñþa»V‘ Á ãÿ ñÜ Ä"¥$Œ&k(S*0,.ÿ/ñ1à3Ø5Ø7Ú9í;>$@MB‚D¿FIPK›MíO-RkTŒVXgZý[L]2^¢^‚^³],\»YmVRÀL[F ?Ì6Ô-E$TAC˜üuóëqãÌÜ%×wÒÂÎíËëÉœÈíÇÅÇȤÈÉÊåËFÍÒÎ_ÐÒÃÓˆÕ\×5ÙÛÝ ßá*ã?åsç£éìë9î—ðýòpõî÷oúýüƒÿ‘f ž · #]/AU¶F ßÝünõ/îwæsÞSÖaÎÈÆÊ¿¹A´°É¬³ªž©©Tªã« ®Ã°×³:·Îº¾LÂÆÚÉÍ;ÑÏÔOؼÛßOâzåŒèŒëxîMñôÅögùôûyþäLžè" V x𬷾º³¦“~ f"H$0& (õ)Õ+¼-¥/Ž1‚3u5u7w9„;™=»?àADOF’HÜJ*MtOÀQùS"V,X Z²[]^•^Ž^è]‚\CZ!WüRÚM¯G†@y8¢/-&N?5|þ5õ¦ìâäÞ2ØXÓoÏsÌDÊÚÈÈÊÇóÇ‚ÈUÉfÊ¢ËÍÎкÑnÓ2ÕþÖÙØ¼Ú¬Ü¥Þ«à½âÙäç5éxëÃí ðòôôm÷ñùyüÿŠè2 H 5Ò#wL Ê« ¸Ú4ý¹öžïûçüßê×àÏ<ÈÁ¹º6µÄ°V­ «Å©‚©!ª«š­8°9³¶ºË½ŽÁWÅÉÛ̃Ð!Ô¢×ÛkÞ²áÛä÷çöêéíÀðó>öçøvûýýmÖ*y´ ç .HRXZRF6 "ë#Ñ%´'’)|+\-F//1!3579 ;1=P?uA¥CÝE$HfJ¹LOLQ‹S¶UÈW¯Yb[Î\Ý]€^—^^Õ\¿ZÎWÛSìNôHþA:j1(D:/ _÷Jî^æXßOÙ=Ô+ÐüÌ­ÊÉ.ÈÑÇæÇgÈ&É2ÊbËÀÌ3ÎÈÏeÑÓÙÔ¡ÖØYÚMÜ@ÞFàSân䓿ÈèëRí¤ï òwôîörùôû†þ“ o¿ ß Ó‚ßß^^³]AM †ÔUþøñzé‹áyÙjѯÉnÂæ»;¶±ï­l«÷©©ø©;«,­±¯œ²êµf¹½ÒÀœÄbÈ"ÌÏÏoÓôÖlÚÆÝá>äaç`ê[í3ðó¼õ`øýú{ýùÿ]¹H { © ÇÞïööñåÔħ!#s%U'9)+ý,ê.Î0Â2´4­6°8·:Ë<ä> A7CpE¯GøIALNÚPSLU`WRY[Œ\ª]h^˜^9^]9[kX´TðO2JgC·;+3ð)8 4' IÑøöïßç®àoÚ1ÕëÐ’ÍË]ÉXÈÚÇäÇGÈÉúÉ(Ë{ÌìÍyÏÑÈÒ}ÔNÖØÿÙêÛÞÝßßìáä)æUè’êÚì0ïñýópöòøxûþ‹ŠüF w p.ž­J`Û§®ì G ÊlÿFùdòõêãÛóÒ'ËÊýE·c²•®Ö«.ªŠ©Ò©ôªÂ¬.¯²Bµ·¸`¼ÀåÃ¥ÇjËϽÒGÖÂÙ!Ýoà¢ãÆæÎéÆìªïvò6õá÷xúý{ÿéE•Ø < _x‰‘–އteJ!4#%û&Ú(À*¡,‹.q0a2S4K6L8R:d<{>¡@ÇBE:GŠIËKNdP¬RÞTùVôXºZD\x]I^—^S^]]¤[Y~UíPcKÊDH=â4É+&"-3¥ú©ñkéâžÛ)Ö·Ñ-Ί˭ɃÈðÇÜÇ1ÈÞÈÇÉîÊ6Ì¥Í*ÏÅÐpÒ)ÔñÕÂ×¢Ù‡Û}Ýzß…á™ã»åèç êhì¹îñƒóòõuøôúƒý’|Ø  ÕXy/_ýãw ®€ú¾ólìœä•ÜÔ Ì.ÅX¾X¸C³B¯L¬rª™©¹©°ªa¬­®y±›´¸¦»a¿%ÃïÆ°ÊeÎ ÒšÕÙ~ÜËßã(æ<é1ìïêñ³ôZ÷úùˆüÿpÖpž Ô ö&,4+)ë Ö"¹$›&(a*E,+.02õ3é5ç7ð9û;>4@^B’DÏFI\K©MõO8RpT’VXgZ÷[C]#^’^e^]ÿ[šY9VåQ„L(FÌ>•6œ-$&!€ücóýêpãÑÜ0ׇÒÖÎÌʵÈÈÛÇÈ¸È›É±ÊøË]ÍÝÎuÐÒÔÓ—Õg×AÙ)ÛÝßá-ãRåvç³éñëEî›ð ósõù÷qúý†ÿ[ › ¦  CY |¸ ”ˆ´ûõÞí!æ%ÞÖ!Ηƞ¿t¹2´÷¯Ð¬¾ª´©§©tª¬7®ã°´\·öº¥¾mÂ0ÆùɬÍWÑêÔmØÑÛ/ßaâ”å¡è£ë‹îdñ'ôØö|ùü‹þú[²ø6 e Ž©¾ËÍÍø¤‘ v"\$@&!(*å+Ï-³/¤13‰5„7Š9”;¬=È?òA"D_F HêJ5M€OÇQT$V2XZ¯[]ü]‚^x^É]b\ZòVÎR MyGL@B8h/û%]þ)õ–ìåäÞBØcӆχÌ_ÊòÈ#ÈáÇ È™ÈkÉ|Ê·ËÍ–Î"ÐËÑ}Ó=Õ×ãØÌڴܳ޵àÆâæäçAéëÎí$ðŽòøôv÷öù{ü ÿŒ…å( > "ÀèO"ZЉf iŽÛüföIï¥ç´ß›×§ÏÈíÀ—º)µ´°a­ «á©•©Eª««À­\°`³´¶Aºî½±ÁwÅ?ÉõÌ£Ð:Ô½×/ÛƒÞÊáòä èëüí×ðŸóTöøø‹û þƒç>ˆÈ ù $BVhhmaYE1 "ü#å%Â'ª)†+s-T/D123&5"7$90;A=`?„AµCïE.HvJÃL OUQ“SºUÌW®Y^[Å\Ñ]m^‚^ö]²\šZ¡W¬S¶N½HÃAã921Þ' Dïö>î\æ[ßXÙLÔ?ÐÍÃÊ3ÉCÈîÇþÇ}È@ÉGÊuËÔÌEÎÙÏuÑ)ÓåÔ²Ö‡ØkÚSÜOÞPà]âz䛿Ðè ëWí°ïò€ôõövùüû…þ ”o³ Ø ÁqǾ>.†$ 8‰þý¯÷°ð$é?á-Ù*ÑyÉ?ÂÇ»"¶‡±ð­v«ª›©ª^«O­Ô¯È² ¶‘¹4½øÀ¼ÄƒÈ>ÌíÏŠÓ×…ÚÞÝ)áWäsçzêlíJðóÏõvø û“ýtÇX Ž º ×óÿ ÿüâ׸!£#ƒ%i'I)-+-÷.å0Ñ2Å4¿6Á8Ç:Þ<ñ>ADC‚E»GJLLœNãP SSUaWTY [‚\£]S^ˆ^^ý\[CXT¾OùI2C|;õ2º)  -»øëïÜç¯à{Ú<ÕѤÍ2ËwÉpÈøÇøÇbÈÉÊ=Ë‹ÌΆÏ'ÑÒÒŽÔYÖ(ØÚñÛíÝéßöá ä0æ_è›êäì5ï™ñôzöôø}ûþŽŠõ? l `„’&7¬nv¢  wÿðøò êÈâ¼ÚµÒíÊÃù¼-·Z²®â«>ª¡©ò©«ç¬Q¯-²iµÝ¸€¼<ÀÄÈdžË7Ï×ÒcÖÚÙ:Ý„à¼ãØæçéÙì¾ï‹òJõó÷úý‘ÿùW©è" M r‰¡§¡–ˆt\!D#'% 'ï(Í*·,˜.…0q2e4\6]8b:u<‹>¯@ÙBEMG’IÜK&NqP°RãTþVòX¹Z;\o]7^„^8^@]}[ÜXOU»P.K’D=ª4—+ó!ú ’úœñfé â¥Û:ÖÇÑFΟËËÉ›È È÷ÇHÈöÈÜÉËI̸Í;ÏÓÐÒ8ÔýÕÐ׫ٕۅ݈ߋá¦ãÂåñç,êlìÄîñ†óþõrøûýŽyË ÿ þ Å@^ 8ɶÚ; ¼ b2'úqóìPäJÜ>ÔiÌûÄ8¾<¸:³=¯U¬€ª±©Ô©Îª‡¬Î® ±À´3¸Ê»¿Ià ÇÏÊ‚Î$ÒµÕ0Ù‘ÜæßãAæPéGì0ïòÂôp÷ ú™üÿ„á7x¶ â #5?D=8'!ä"Ì$¬&(t*T,?.!02ÿ3ÿ5ö7: <#>D@nB DÜF IiK´MP=RzT‘V•XaZô[6]^|^P^z]â[oYV±QULïE˜>`6h-á#ýôiüXó÷êuãÙÜ=לÒêÎÌÊÎÈ#ÈöÇ6ÈÑȯÉÇÊ ÌlÍòÎÐ.ÒßÓ¥Õs×MÙ5Û$Ý ß'á9ãWåƒçºéùëMî¤ð óõö÷}úýŒÿÿT ˜ oõ*ë3åï?Å r F:`ûÂô‰íÔåÛÝÉÕëÍ`Æ~¿W¹!´ô¯Ó¬ÍªÉ©Á©”ª&¬X® ±!´…·»É¾ÂQÆÊÌÍpÑÕ„ØìÛAß~â¥å¸èµë¢îtñ>ôèöùüœþ pÁ G v  ºÏÛßßÔɵ¡ ˆ"m$Q&2(*ø+Þ-Æ/³1¡3œ5‘79¢;½=Ø?B3DkF®HöJ?M‹OÎQT+V/X Z§[û\ð]l^c^®];\ûYÁV£RmMCG@ 88/É%ôðøJþõ”ìâäÞNØwӜϞÌzÊ É>ÈúÇ'ȰȂÉÊÈË+Í¡Î8ÐÕÑŽÓHÕ×ðØÕÚÀܾ޾àÒâêäçHé‡ë×í+ð“òõz÷úù€ü ÿá 3 ¨ïÇ)÷$šH =‹üööîUçgßX×jÏÏÇÇÀxºµ®°b­«ð©²©bªÌ«å­°†³Ø¶eº¾ÐÁ™ÅZÉ;ÐSÔ××GÛ˜Þâáå#è"ëîéð´ógö ùŸûþ•øQ™Û 7Pkv{|tiUE '"$ó%Ó'½)–+„-f/R1E3454759=;T=n?–AÃCýE:H…JÌLO\Q˜SÀUËW¯YW[¿\À]`^h^Ý]‘\tZwW{S‡N…H‘A«91¬'èêí ,ßö7îZædßeÙ]ÔSÐ+ÍÞÊKÉbÈÈÈ’ÈYÉYÊŒËåÌWÎéÏ„Ñ6ÓöÔ»Ö—ØsÚbÜXÞYàjâ~䩿Õèë^í·ïò„ôýözùü‡þh« Ê ²[¯žQíÁÆ ì:ªý\÷ZðÓèñàãØðÐ<ÉŸ»¶x±õ­~«ª³©4ª}«u­ú¯é²4¶°¹[½ÁÜÄ¡È^ÌЦÓ(×žÚøÝ=ápä†ç’ê~í_ð(óäõ†ø#û¡ýß)i ¢ É ëøåÊ!´#”%|'W)B+!- /÷0ß2Ú4Í6Ó8Ø:í<?*AXC‹EÎGJ\L£NïP%SYUcWSY[z\–]B^r^þ]Þ\êZXTT‹OÅIûBE;Á2…)ÝÞå ®øàïÙç·àƒÚQÕÑÂÍF˕ɈÈÈÈyÈ0É'ÊPË¡ÌΛÏ2ÑæÒ˜ÔgÖ4ØÚýÛøÝòßâä=æfè¦êëì=ï¢ñôöøø‚ûþ‘Œì; ] Toq y;2c ³,ÉþšøÀñIê|âqÚuÒ³ÊqÃÕ¼·N²‘®ç«Rª¶©ª1« ­u¯T²µ¹¥¼^À"ÄèÇ£ËUÏòÒ|ÖôÙSÝàÐãòæ÷éôìÎï ò]õø¡ú)ý ÿf¼ø8 [ †˜®´·³¦›„n!V#7%'ü(ã*Ã,®.“0…2s4o6m8t:„<œ>¾@éB EYG IèK1N{P¸RêTþVöX±Z:\`])^p^^"]X[µXUPóJaD×î œ€›ü p ÜÿÖùóÁëäüÛÿÓ,ÌÐľ'¸(³>¯Y¬‘ªÅ©ò©îª§¬ø®¿±ë´T¸ï»¦¿fÃ/ÇêÊŸÎAÒÌÕLÙ©Üþß1ãWædé]ìDïòÕô‚÷!úªü+ÿ”õHŠÉ ò 3FRRSF;%!ó"à$»&¥(€*m,H.<024 6 8:<3>S@}B¯DëF-IuKÀMPLRxTœVX`Zî[*] ^e^9^[]¾[GYáUQ!L¶Ed>&64-²#ÏÒçTüJóòêuãâÜK×­ÒÏ3Ì6ÊèÈ=È ÈQÈåÈÈÉÚÊ ÌÍÏ’Ð;ÒïÓ²Õ€×ZÙ?Û.Ý-ß/áFã_åçÁéìTî«ðóƒõþ÷€úýÿúP … [á Í ¹¸ / ôê ûkô8í€åŽÝ„Õ¬Í0ÆT¿=¹´ï¯Ø¬×ªá©Ù©¶ªD¬®-±M´¦·<»ì¾®ÂsÆ3ÊçÍÑÕŸØÜXß–â¹åÒèÆëºîˆñOô÷žù0ü®þ€ÔW Š ±ËâíðñåÜÆ´ —"$b&D('* ,ï-Ù/Ä1³3«5§7©9·;Ë=è?B?D{F¿HýJRMOÝQ T1V/XZ¢[ñ\ä]Z^J^]\ÎY›VkR=M Gà?Ñ7/—%ÆÈØ0þõŒìáä ÞX؇Ӱϵ̓Ê$ÉWÈÈ<ÈËȘɤÊàË;Í´ÎGÐæÑ›ÓZÕ%×ýØßÚÏÜÆÞÌàÛâõäçPé‘ëßí5ð›òõ€÷ú„ü ÿ€Ù % •Ò©Ìñ_Ù Ðï3ü¿õžîçß×)ϜǜÀ\ºµ«°`­.«þ©Ó©yªö«®©°©³·ˆº4¾öÁ·Å|É0ÍÛÐpÔñ×`Û³Þ÷á!å6è9ë&îÿðÆó{öù°û5þ¤ `¯é  Fd}†ŒˆwlR <"#$&é'Ê)¬+“-z/d1U3H5E7F9P;b=€?¤AÖC FMHJÜL OgQ SÂUÑW«YV[µ\¶]L^T^¿]p\NZIWNSONQHUAt9Ç0y'¹¿Ì Ñö(îZæfßmÙoÔcÐBÍ÷ÊbÉ~ÈÈ5ȬÈnÉqÊ ËøÌjÎøÏ•ÑFÓÕÊÖ¡Ø‚ÚmÜaÞiàmâ䮿ãèëhí¿ïòŽô÷‚ùüþ‘_¨ º §Bš|öÙµƒ êVý÷ð~è¡àœØ«ÐÉìÁƒ»ûµr±ñ­‰«.ªÈ©Sª«™­°³W¶Ù¹|½=ÁûÄÄÈzÌ%ÐÃÓB×¹ÚÞXáƒä ç¤ê—ísð>óõõø3û·ý/•ð;~ ± Ý ý%(.$øÜ!Æ#¦%'k)S+2-/1ô2é4á6ã8ì:û<?9AhCœEÚG JfL±NõP1S\UiWRY[u\‰]4^[^ä]»\ÅZïW T[O‰IÄB ;„2T)¥¶º õ’øÔïÓç·à‹Ú]Õ!Ñ×Í^Ë­É¢È+È-ÈÈHÉ<Êe˵Ì"ΫÏDÑñÒ«ÔrÖFØ!ÚÜûÝàâ'ä@ævè¬êöìHï¦ñô…öù‡û þ’†ì/ W CöVTàäIõ kÚuþGødñüé#â+Ú-Ò}Ê?ó¼ÿ¶@²®ð«`ªÐ©+ªS«0­™¯~²®µ-¹Ä¼…ÀBÄ ÈÃËrÏÓšÖ Únݳàëãçêíèï¶òoõø±ú?ý´ÿ~È C r –«ÁÅÊü©˜€!f#M%,')ó*×,¾.§0•2‡4€68†:•<­>Ð@øB0EhG¯IôK?NƒPÁRðTW÷X¯Z1\W]^\^^]5[ˆXóTUPÁJ#DŸ<<4*+“!«° ÜbúƒñXéâ²ÛVÖêÑoÎÓËøÉÐÈ=È(È{È!É Ê'ËvÌ×Í`ÏòРÒRÔÖç×ÆÙ«ÛžÝ›ß¥á¸ã×åè=êìÖî*ñ˜óöƒøû‰ý’ r¾ é ä ¡%ÇèlGd° - ÅŠÿ‚ù¿òqë©ã·Û´ÓòËœÄë½ ¸³6¯b¬žªÝ© ª«Ë¬¯é±µ{¸¼Æ¿ÃKÇ˼Î\ÒïÕ]ÙÌÜàNãmæzévìXï*òíô“÷8ú¼ü>ÿ¨[Ú  +FYcfdXL: ! #ì$Ó&±(™*w,a.I022*468 :-b@B½DüF9I†KÇMPMR…TšV•X]Zç[$]ø]T^ ^>]™[ Y¯UQQæK€E$>ñ5ø,~# ¥È8ü8óèêsãäÜX׺ÒÏMÌKÊÉUÈ'ÈjÈýÈÞÉñÊ1Ì–ÍϧÐIÒþÓÁÕ×hÙJÛ=Ý5ß>áMãmå”çÌé ì\î·ðóŽõøˆúý’ÿ‹ùH { ƒ FÏí­ãˆ‡È? å ¨—·úôàì1å>ÝAÕmÍþÅ-¿¹´â¯ã¬âªø©ó©Ôªk¬¢®W±p´Ì·b»¿Ò“ÆSÊΨÑ>ÕµØ"Ün߯âÓåäèãëÇî¢ñbô÷²ùCü¿þ3’ç0i ž ¿áòþýýéÛÅ ©"’$q&X(7*,.ê/Õ1Ç3º5º7»9È;Ü=û?BUD‡FËHKUM¥OÛQT0V4XZ›[ë\Ò]L^.^v]÷[§YmV9RMÐF¦?™7Ç.f%‘£±þóôƒìÜä&Þ`ØšÓÀÏÍÌ©Ê=ÉtÈ,ÈXÈßȯɼÊðËRÍÃÎZÐôÑ­ÓeÕ6×ÙîÚÙÜÓÞÔàçâå)çZé›ëæí?ð¡òõ…÷ú…üÿŽyÖ  ñ~¼…Þž½%Æ †™ãûdõNî¬æÎÞÇÖìÎfÇpÀAºê´¨°^­=«ªë©ª¬/®È°Ô³#·®ºY¾ÂÛÅšÉPÍ÷ЋÔØuÛÒÞ â;åLèPë9îñÙó‘ö0ùÆûEþ¹u¿ý 0 Wy‹›Ÿ —Žxh N"2$&ø'Ý)¾+¦-ˆ/y1d3Z5V7W9b;v=?¸AàCFXHŸJåL/OlQ¬SÅUÔWªYO[¯\¨];^>^ ]Q\%ZWSNHA:90A'ˆ“¦ óÿ¹öîSæißyÙzÔzÐVÍ Ë~É”È5ÈOÈÁÈˆÉƒÊ¶Ë Í|ΠУÑWÓÕÚÖ®ØÚ{ÜmÞrà{â˜ä¹æíè'ëqíÉï&ò–ô÷‡ù üŽþŽ]œ ³ ”1~c̲é€@: W• ý«ö´ï+èSàTØjÐÓȾÁd»æµh±ó­“«?ªâ©pªÀ«½­D°7³|¶ÿ¹ ½^ÁÅâÈ™ÌCÐÚÓc×ÍÚ-ÞkáŸä³ç¾ê¨íŠðPó ö­øIûÈýC§PŒ Æ ì #88A4. ñ!Ô#»%š')a+E-./13÷4ô6ò8ý: =(?GAyC©EéG+JtLºNÿP7S_UmWPY[j\~]$^D^Ê]\œZÈWîS*OSIBÓ:O2)wŒš ׃øÅïÓç¶à™ÚhÕ8ÑéÍxËÄɽÈCÈEȪÈ\ÉUÊvËÉÌ2μÏUÑÓ¸Ô€ÖQØ.ÚÜÞ àâ,äLæ~è³êíMï±ñôŒöù‹û þ– ‡æ' L 4ã=6½¸ÉºØ !Œ#þò÷ñ¥éÚáßÙðÑEÊÓ¼è¶6²®÷«sªæ©Hªv«Q­À¯¡²ÔµQ¹é¼¥ÀdÄ'ÈâËŽÏ*Ó³Ö&Ú…ÝËàäç(êíûïÊò‚õ0øÅúOýÉÿ1à [ € §ÀÎÙÛÔͺ«‘!y#Z%@'")+é,Í.º0¤2š468—:£<À>Û@ C9EzG¹ILGNŽPÈRõTWôX¯Z'\O]^H^é]â\[_XÄT$PŠJïCe< 4õ*e!€ ¼UúrñXéâÀÛaÖÒ„ÎêËÊêÈWÈAÈ“È9É!Ê?˃ÌðÍjÏ Ñ§ÒfÔ#Ö÷×Ðٸۧݧ߬áÂãàå èEêŠìØî6ñ›óö‡ø û‹ý k· Þ Õ ü§»>&r à|7ÿ0ùlò ë\ãoÛsÓ»ËoÄɽó·³4¯j¬¯ªò©*ª.«ï¬?¯ ²5µ¸9¼é¿«ÃmÇ*Ë×ÎzÒÖ~ÙÜÜ-àaã‚æ’é‡ìmï?òûô¬÷EúÓüLÿ½m®ì  >Vivuvj\J3!#ÿ$â&Ä(§*‹,p.Z0D294,6-81:>s@BÍDGII‹KÚMP\R…T¡V’X\Zß[]ê]@^^ ]w[ôXˆUQµKKEï=º5É,N#w…ª'ü*óåêuãïÜe×ÎÒ)ÏdÌfÊÉmÈBÈÈÉñÉËE̤Í%ϳÐZÒ ÔÎÕ™×tÙWÛEÝCßDáZãså çÒéìbî½ð"ó’õ øŠú ý‘ÿˆöA r q 9³Ö‰»]Nü   YL_úÇóìáäùÜûÔ7ÍÍÅ ¿¹ö³á¯å¬ôª ªªðªŽ¬Ç®y±—´ï·„»2¿ð²ÆtÊÎÈÑSÕÒØ7܇ßÅâçåûèöëÜî¶ñsô)÷ÃùWüÏþG¢û?| ­ Ôî  üìÕ »"¢$ƒ&h(J*+,.õ/ë1Ò3Ï5Æ7Î9Õ;ï=@2B^D˜F×HKcM©OéQT9V1XZ—[Þ\È]4^^U]Ö[Y@V RÕLœFq?d7–.3%l{–þæôzìâä)ÞrبÓÖÏæÌÁÊXÉŠÈGÈpÈøÈÄÉÑÊÌaÍÙÎdÐÒ¶ÓuÕ?×ÙøÚâÜÞÞÞàðâ å0çbé¤ëëíIð¤òõ‡÷ úŠüÿvÎ ßjžh¶s‰ïƒ O 9N“ûõüícæÞ‰Ö±Î7ÇNÀ"ºã´™°m­B«*ªª¹ª6¬N®ð°õ³H·Ðºz¾6ÂøÅ·ÉlÍѦÔ#Ø’ÛàÞ'âJådèaëOî'ñíó¡öDùÕûZþÉ0†Ï ? k…Ÿ¨²®«›‹v ^"C$'& (ì)Ï+µ-š/‰1t3l5c7i9p;„=Ÿ?ÄAñC)FdH«JîL8OvQ¬SÍUÒW¨YM[¡\ž]&^(^†].\ZòVðRçMéGå@ 9[0'\s‡ àÿ«öîTær߃ÙÔŒÐnÍ(˕ɱÈNÈeÈÛțɜÊÅËÍ‹ÎдÑbÓÕåÖ·Ø›ÚÜ~Þuà‹âšäÇæñè0ëzíÌï0ò˜ô÷Šù üþûY ¤ …e?¬€¿Bõ J·ü_ö_ïâç àØ2СșÁI»Õµc±ö­ «Pªþ©‹ªâ«ß­e°_³›¶"ºÂ½}Á?ÅýȵÌ^ÐöÓv×êÚ<Þ‡á®äÌçÌêÀí™ðgóöÃøWûÜýQ»`Ÿ Ô þ !4FNJJ:- "å#Ë%«')r+U->/&13579 ;=5?WA…C·EùG3JLÁNQ=SeUkWPYûZa\s]^3^«]~\zZ™WÈSòN'IUB£:2ò(Ng~ ÀvøÀïÑçÁà£Ú~ÕJÑÎËÞÉÙÈ[È`ÈÁÈqÉkʉËÚÌFÎÈÏeÑ ÓÆÔ‹Ö]Ø:Ú"ÜÞà â2äXæ‚èÀêíWïµñôö ùŠûþ€ß" ; 'Ë'›‹í‘|˜ ÔFÐý¥÷ÀðXé‘áœÙ²ÑÊèÂv¼Ô¶/²®¬€ªªcª•«u­á¯Ç²øµr¹ ½ÅÀ…ÄDÈþË©ÏCÓÍÖ=ÚšÝåàä3ç:ê.í ðÝò”õAøØú_ýÛÿ@£é6 e • µÐßëéçÛ϶¦!…#n%O'2)+ú,Ý.Ë0µ2©4 6Ÿ8§:³<Ï>ê@CIE…GÆI LSN“PÑR÷TWóX©Z \C]ö]4^Ï]Å\ìZ7X–TõOYJºC2<Õ3Å*:![m ª<úoñRéâÉÛrÖÒ›ÎÌ,ÊÉrÈYȬÈNÉ9ÊOË›ÌûÍ€ÏѸÒsÔ/ÖØÚÙÃ۲ݯ߹áÇãîåèPêŽìãî;ñ¥óöø ûýf¯ Ó Ä }à퀖 Ýè3 •3çþÞøòÍêã(Û4Ó‡ËAÄ©½Þ·³4¯q¬¿ª ªDªO«­e¯0²WµÄ¸W¼ ÀÈÃÇDËõÎ’ÒÖ”ÙõÜAàvãšæ¢éžì~ïRòõ½÷Xúäü^ÿÎ)}Áû ) Mg|ƒ‰„}k[D!*#%ð&Ö(¸*›,.j0V2G4A6:8C:Lƒ@ªBÞDGYI•KæMPgR‡T§V‘XXZÚ[ ]Ù]0^é]]Q[ÎX[UíPKEº=†5—,#ObŽüóâêvãúÜq×âÒ?Ï{ÌÊ6ɈÈ\È•È2ÉÊËU̺Í3ÏÃÐiÒÔÛÕ¦×Ù_ÛTÝHßSá`ãå¦çÝéìoî¿ð.ó“õøŠúýÿ…ñ9 i c &œºe—,S½ U ùÿúvó9ì–ä¯Ü»ÔýÌ Åã¾ï¸ã³ã¯ç¬«ª,ª«®¬ê®ž±º´¸¤»W¿ÃÒÆÊ<ÎãÑlÕíØMܠߨâþåéìõîÄñŒô6÷ÛùbüêþQ¹TŒ À á$#$üå Ï"¯$˜&u(]*;,&.0ù1æ3Þ5Ø7Ý9æ;ÿ=@@BnD£FçH&KoM²OðQT˱ÉÈÈiÈ~ÈòȲɯÊÝË-Í¢Î&ÐÅÑqÓ)ÕôÖÃØ¥ÚŽÜƒÞ„àâ¨äËæþè5ë…íÑï9òšô÷ùü“þŽùO‹ — uH%‚ZŠ Æ ² Ábüöïç¿ßÌ×õÏpÈnÁ.»Áµ[±ù­¬«cªª¨ª¬®°³Å¶Dºå½žÁ_ÅÉÕÌvÐÔ‘×ÿÚYÞ˜áÉäÞçåêÑí°ðxó/öÕøjûîýdÌ"s¯ è 0HW^_WN;, "ú#Ù%¾'¡)‚+i-N/71(3579;-=E?gA”CÆEHEJˆLÏNQESfUrWKYúZW\g]þ]^‘]]\UZqW—SÄNìH$Bg:ê1¼(!?Z ª]øºïÊçÉàªÚÕ[ÑΨËöÉôÈrÈ|ÈÕÈŽÉ{Ê¢ËíÌVÎÝÏqÑÓÔÔ™ÖiØFÚ-Ü#Þà(â@ä]æ‘èÄêí]ï¾ñ#ô—öùŽûþ’~Ú 0 · úsf¶];V ŠõýN÷oðéAáVÙsÑÚÉÂÂP¼Ä¶ ²•® ¬™ªª…ª´«˜­ °é²¶–¹/½çÀ¥ÄdÈÌÆÏ^ÓçÖUÚµÝùà+äGçRê?í'ðêò®õOøïúpýîÿR³ÿC y ¥ ÉàóøþõîÞÊ´!˜#€%_'E)%+ -î.Ü0Å2»4°6±8µ:Ä<Þ>û@)CVE•GÑILXN¢PÒRU WòX¥Z\3]é]^¶]¤\ÇZXfTÆO"J†Cû;ž3•* !5I ,úbñQéâÑÛƒÖ%Ò²ÎÌBÊ"ɆÈvÈÁÈgÉLÊg˪ÌÎŽÏ%ÑÇÒ€Ô=ÖØçÙÍۿݸßÂáÔãóåèVê˜ìêîAñ¬óö–ø û•ý^ª Ä ¸ gÉÏ\nÜ¥°è VÞþˆøÎñyêÊâÛÚúÒKËĆ½Æ·ú²2¯y¬Ïª"ª_ªr«/­‹¯S²~µæ¸|¼-ÀêìÇbËϪÒ<Ö©ÙÝVàã²æ´é·ìïgò#õÏ÷lúöüoÿâ8“Ï 8 `x–˜˜‰iV!;#!%'ç(É*«,“.{0f2Z4L6P8N:b

    •@·BìD"GcI¤KëM+PjRT§V‘XVZÐ[]Ë]^×]á\2[¦X-U¾PLKãDƒ=S5d,ñ"'=wüûóÙê}ã݃×ôÒUϔ̙ÊRÉ¡ÈtȲÈDÉÊ/ËjÌËÍDÏÓÐxÒ&Ôèճ׊ÙqÛWÝ[ßTápã…å±çæé$ìuîÊð1óœõø’úý™ÿ ‰è4 ] T …Dmýç} É¥ÿÁùóìëEädÜ|ÔÀÌtž¾Ô¸Ú³Ù¯ô¬«6ªIª.«Ô¬ ¯Ç±Û´=¸Ç»w¿2ÃðÆ®ÊZÎüÑŒÕÙlܳßóâæ&éìïÛñôJ÷îùwü÷þiÄ!_¢ Í ö&174, ø Þ"Ã$§&ˆ(m*O,4.02ý3ë5ë7í9ø; >(@OB{D¶FïH6KwM¾OöQ(Tçr߂׹Ï7ÈFÁ »­µU±ø­¹«vª-ªÌª ¬+®­°©³è¶iº ¾¿Á€Å<ÉïÌ—Ð*Ô®×ÛnÞµáÜäøçùêæíÇðŠóDöëøzûþwÜ:à ú CYgrnl^O: $"$ï%Ì'´)”+y-a/H1;3'5(7$9,;>=S?yA CØEHRJ”LÙNQISoUnWOYòZS\V]ó]^{]9\0ZFWgSN¸HêA2:²1Š(ð7 ŽOø©ïÍçÆàºÚ™ÕrÑ-ÎÂËÊ ÉÈ’ÈíȨɌʺËüÌkÎìÏ‚Ñ,ÓâÔ¤ÖyØOÚ;Ü+Þ+à2âHäjæ”èÓêíjïÁñ-ô›öù“ûþ”|Ó $ £óÙQ8†" F 3ýøöðµèóàÙ1ѨɑÂ7¼ª¶²®¬¨ª-ª¢ªÓ«½­-° ³F¶·¹V½ÁÇÄ‚È:ÌâÏ{Ó×nÚÏÝáBä`çbê[í5ðó½õhøüú‡ýþÿfÅU Š ¹ ×ô  ÿîÞÃ!­#%s'U)7+-/ê0Ú2È4Ä6¿8É:Ó<î> A8CfE GàI#LhN¥PàRþTWìX¥Z\*]Ö] ^™]‡\ ZåW9T‘OíIOCÃ;h3b*Ø ' púUñLéâÝÛÖ;ÒÄÎ6Ì\Ê9ɤÈÈÜÈ~ÉbÊ|Ë¿Ì"ΠÏ3ÑØÒ‹ÔOÖØ÷ÙÕÛÌÝÃßÍáÞãþå&èaêŸìôîJñ±ó ö—øû—ý’ÿ]Ÿ ½ ¦ T²®;B¬qm© “Hþ4øxñ'êxâ•Ú²ÒËäÃf½®·ì²2¯€¬ßª:ª{ª’«S­®¯{²£µ ¹¢¼NÀ ÄÌÇ€Ë/ÏËÒOÖËÙ"Ýrà¦ãÂæÓéÄì©ï{ò5õã÷€úý‰ÿíRžå L o›©«¦Ÿ}g!L#4%'ü(Ö*Á,£.‹0{2h4b6\8c:n<†> @ÊBùD0GpI°KöM6PmR˜T¦V•XPZË[ø\¸]^¸]Ç\ [}XýTPKªDM=51,Á"ùVêûóÔê|ã Ý×ÓkϪ̴ÊkɼȎÈÉÈ[É6ÊBËÌÛÍVÏäІÒ6ÔôÕÁ×—ÙxÛiÝ]ßhásã’å¸çïé,ì~îÐð8ó¢õø–úý˜ÿ„ã- O I ýp|%?Ó¯Ü8 ÅyUÿmùÊò›ëöãÜ:Ô‡ÌFŘ¾À¸È³Ú¯ø¬ «LªdªM«÷¬0¯ë±µa¸ê»›¿QÃÇÉÊzÎÒ¨ÕÙ„ÜÉß ã(æ:é4ìïðñ°ô^÷ÿù‹ü ÿyÙ0r´ ß $6CID>.!!õ"Ñ$º&™(~*_,H.+0246ù7þ9<>7@]BŒDÀFÿH?K…MÄOR+T@V6XúY†[À\™]ÿ]Í]]j[ Y»UzQ7LÿEÊ>Ä6ú-¢$ë =Àý¼ôiìáäBÞ˜ØÞÓÐ+ÍË¥ÉÚȔȹÈ@ÉÊË?ÌšÍ Ï˜Ð3ÒáÓ Õb×?ÙÛ ÝúÞá ã%åMç}é¼ëîZð¾ò'õ÷ú˜üÿ–o·å ã ª%L@êí<Ä v Y\™úôÿìwåŸÝ¾ÕΡÆÛ¿Ï¹³´Š°y­j«gªQª«™¬½®]±f´¶·:»å¾—Â[ÆÊÅÍeÑôÔtØÕÛ/ßeâ“å¡è¡ëîbñ)ôÚö~ù ü’þÿf»D u œ¾ÏßåààÍÀª ‘"y$Y&?(*,è-Î/¼1§3ž5˜7™9¢;´=Í?óADRFŽHÏJMSO’Q½SÛUÓW¤Y:[‡\r]ó]Þ]4]Å[YoV_ROMFGB@e8¾/&Úü- —ÿ{öîRæ…ߦÙÃÔÉеÍqËãÉþȜȰÈ#ÉßÉÛÊÌWÍÂÎKÐàÑÓDÕ×ÛØ¿Ú¢Ü›Þ˜à¥â½äÞæéKëíæïBò¬ô÷™ùü˜þ‰õ@{ z TØß:û&”H ! .XÃûaõiîìæ$ß@×yÏÈÁµJ±ÿ­Â«ŠªIªçªD¬M®Ô°Í³·Œº.¾àÁ¡ÅZÉÍ´ÐEÔÆ×3Û‡ÞÊáôä è ëîÕð£óUöüø‘ûþŠðH–Ô 3Sly‚€}oaK 4"$ý%â'Â)¦+‹-o/]1H3<56769=;M=f?…A³CâE H\J¤LßN#QPSqUrWLYëZM\G]á]ê]_]\ ZW9S\N‚H²Aû9z1[(Áî t=ø¢ïÆçÏà¿Ú­ÕƒÑGÎ×Ë.Ê"É¬È©È É¹É¨ÊÉËÍyÎÿÏ‘Ñ;ÓðÔ²Ö…Ø[ÚIÜ3Þ7à;âRäuæèÜêípïÊñ3ô¡öù˜ûþ™ {Ë  ø Ùº, Ué¿ É öXØüªöÄïeè§àÅØöÐmÉk¼˜¶²“®¬ºªGª¼ªø«ß­S°2³l¶Û¹z½*ÁåĦÈUÌДÓ׊ÚãÝ*áYätçzêlíJðóÒõxøû”ýyÕ%d Ÿ È ëíÕ!¾#ž%†'d)J+--/û0ê2Û4Ó6Ó8Ö:ç<ü>ADCwE­GíI0LpN±PäRUWðXžZ\]Ç]ï]ƒ]b\~ZºW TaO·ICŒ;43,*® Ý TúLñHé âèÛœÖOÒÜÎKÌxÊQÉÀȤÈöÈ’É{ÊŽËÓÌ4ΰÏDÑæÒœÔXÖ+ØþÙæÛÓÝÏß×áèãæ0ègê«ìøîRñ¶ó'ö›øû—ýüX– ° ™ >™‘~53c ½Fñýæ÷ñØé)âHÚzÒ×ÊÁÃ<½œ·á²0¯‰¬ðªNªœª°«y­Ñ¯ ²Éµ/¹Å¼qÀ.ÄéÇ¢ËJÏåÒnÖßÙ?݉àºãÝæäéÜì½ïòIõú÷Žúý•ÿd®û. ^ ƒ›±¸½·± Žz!\#F%$' )ê*Ð,µ.œ0‹2{4q6n8s:<”>³@ÖB E>G|I¿KþMBPsRžT©V“XPZÁ[ï\¨]ñ]¡]¤\êZPXÔTXPäJrD=ã4û+“"Íø6Öû÷òÐêãÝž×Ó€ÏÃÌÌÊ„É×È¥ÈåÈpÉNÊVË•ÌîÍhÏóЗÒCÔÖÍסهÛpÝmßnáã›åÃçøé5ì…îÙð?ó¨õ!ø˜úý–ÿà% F 8 íVbž~œú z-ÿùzòBëªãÐÛöÓPÌÅy¾ ¸¿³Õ¯þ¬/«`ª€ªp«­W¯²*µƒ¸¼¼¿rÃ3ÇéÊ•Î5Ò½Õ8Ù˜ÜçßãBæNéIì1ïòÅôs÷ú¡üÿì@‡ ô 5JS\UOB.!#å$Ê&«(*p,X.?0)246 8:<->H@jBžDËF IKKŽMÏOR/TFV3XúY}[¶\‹]é]¸]â\H[åX‹UNQLÉE”>6Ç-q$Àæ ªý¬ôcìßäLÞ ØóÓ)ÐBÍ)˽ÉõÈ«ÈÓÈVÉÊ$ËT̬ÍϨÐCÒïÓ¬Õs×FÙ%ÛÝß áã4åQçŠéÂëîcðÃò0õŸ÷ú™üÿ•i°Û Ö –-å½¹ 4 GúÉó°ì(åTÝ~ÕÁÍuƱ¿¸¹ ´ˆ°z­|«yªmª6«»¬á®±Œ´Ù·`»¿»ÂxÆ1ÊàÍÑÕ‹ØòÛC߀â¤åºè´ë£îwñ<ôïö‘ù ü¢þwÎU … ±Ëåï÷ôîáѺ ¤"†$o&K(3*,û-ß/Ë1º3®5¨7«9±;Å=Þ?B-DaF˜HßJMbO”QÉSÙUÙWŸY6[}\g]Ý]Ê]]¨[fYDV.RM G@+8Œ/O&¬× ÿgöýíLæŒß±ÙÑÔÝÐË͇ËÿÉÉ·ÈÈÈ8É÷ÉîÊÌfÍÕÎXÐóÑœÓSÕ×ëØÅڳܡޤà®âÅäèæéPë›íêïMò°ô'÷™ùü”þ…ð>l s ?ÆûÁÓñ_ à ânûõî æÛÞþÖ=Ï×ÇõÀÕºŒµE±®Ï«œªbª«g¬n®ú°ï³3·¯ºN¾¿ÅyÉ+ÍÍÐbÔà×JÛŸÞâá å"è#ëîîð²ólö ù£û'þ™Y¥é  Fd|‹’“‹‚o_ D"+$&ï'×)´+-€/m1[3L5F7G9K;_=t?—A¿CóE*HkJ¬LìN)QXSsUtWIYéZB\;]Ï]Ò]F]ö[çYïV S+NOH~AÃ9M1"(›Åø [,ø—ïÈçÒàËÚ¼Õ–Ñ\ÎñËDÊ<ÉÇȽÈ'ÉÊÉÀÊÝË%ÍÎРÑLÓûÔÂÖŽØjÚQÜ?ÞAàCâ_äyæ©èãê"ízïÏñ9ô©öù›ûþ”rÊü  ä {¾œá%±ƒ „ ±üVöwïè]àØºÐ<ÉAÂõ»…¶²”®+¬ÈªbªØª¬®t°Z³¶ºš½KÁÅÂÈrÌвÓ2פÚúÝAáoä‰çêí_ð+óåõ‰ø'û¦ý&ˆé4v ± Ö %.1)#ýê!É#µ%‘'x)Z+;-&/ 1û2ì4ä6â8ç:÷< ?*AUCE½GøI;LzN¹PéR UWïXšZ\]µ]Ý]f]F\XZ‘WÝS-O‡IßBZ;û2ÿ)z »á >ðùAñDé%âîÛ­Ö^ÒóÎcÌÊmÉÖÈ¿È É«ÉŽÊ¤ËåÌGÎÁÏSÑ÷Ò¥ÔmÖ.ØÚëÛâÝÙßàáòãæ<ènê´ìþî[ñ¾ó+ö øû˜ý÷Wˆ © … -rôîKõ " wø¦ý“÷Ñð‰éÜá Ú6ÒªÊÃ"½…·Ö²0¯’¬«fªµªÑ«™­ö¯Ã²ìµS¹ç¼“ÀNÄȾËhÏþÒ‰ÖöÙYÝœàÔãîæüéîìÒï¢ò\õ ø¢ú0ý§ÿsà A o “®¿ÌËÊÁ¯£…!r#R%9')ý*à,Ä.°0—2Ž468ƒ:Ž<¤>À@èBEKG‰IÈK NGP~RžT¯VXLZ»[á\›]Ü]†]‰\ÄZ+X¤T*P°J@Dà<¯4Í+c"§ÕÄûëòÎêãÝ«×*Ó–ÏÚÌãÊ¡ÉìÈÃÈøÈ‹É_ÊnË¥ÌÎwÏѤÒQÔÖÙׯÙÛÝsß{á‡ã¦åÊçê;ìŽîÞðGó®õ$øžúýšÿ~Ý ? % Ü>EßðqI`¸ 5ß¹þÄø*òôê\ãŠÛ¶ÓÌèÄR¾¸°³Ñ¯­:«yª˜ª‘«7­|¯2²Mµ¨¸5¼Û¿—ÃNÇ˳ÎNÒÙÕOÙ±Üýß5ãVæeé\ìFïòØô…÷#ú±ü0ÿœþR˜Õ  *FZgii_RA*!#ö$Û&»(¢*,k.L0>2(4#68 :)<;>W@zB¨DÞFIXK˜MÚO R9TEV6XõYx[ª\~]Ô]¡]Å\&[¾XaUQÒKEc>U6–-@$–”ýžô]ìàäTÞ«ØÔ>ÐYÍ@ËØÉ ÉÇÈéÈlÉ7Ê6ËjÌ»Í/϶ÐRÒþÓ¸Õ×SÙ2ÛÝßá ã9å^çéÍëîjðÌò2õ¨÷úüÿ“cªÑ Æ ‡÷Àô‰ÅC ì¿Âÿóùzó^ìØäÝ5ÕÍ@Æ¿œ¹’´„°€­‡«ŽªˆªT«Ý¬¯¥±°´þ·‚»(¿Û˜ÆNÊýÍžÑ(Õ©ØÜ_ß“â¿åÌèÌë´îŒñOô÷¤ù3ü³þ'†â%i • ÃÜõüöÜÐ ²"š$~&\(E*#, .ñ/Ü1Ê3¾5»7¸9Å;Ò=ï?B9DpF¦HèJ)MeO¢QÉSâUÔW¢Y-[u\W]Í]±]û\‚[DYVRëL×FÛ?õ7X/&²ëgÿ[öðíPæß½ÙáÔðÐâÍ ËÊ0ÉÎÈâÈPÉÊË/ÌwÍéÎhÐÒ§ÓeÕ$×øØÓںܰޮà¸âÑäðæ"é[ë¡íõïRò¹ô,÷Ÿù üšþ‡ê8c f /±ß¢ê¨¼'Å œ •Áû¾ôÆíLæ“Þ·ÖÏ¡ÇÏÀ´º~µ8± ®Ò«¸ªuª&«‡¬® ±´Y·Òºt¾#ÂßÅ™ÉGÍìÐ|Ôù×dÛ¸Þöá"å6è9ë&îÿðÈó|ö!ù¶û8þ­jº÷ , Wu¢¥“€r R">$&(æ)Ç+¬-”/|1l3[5Z7T9];o=?«AÊCF5HxJ¶L÷N/Q^SzUsWJYãZ8\2]¹]À]']×[ÀYÃVÞRøMHEA91õ'jŸÕ BøïÅçÔàØÚÈÕ¬ÑpÎ Ì^ÊVÉÞÈÚÈ6ÉéÉÑÊóË8ÍÎбÑYÓÕÐÖ˜ØwÚZÜLÞJàOâgäƒæ´èæê2ízïÝñ=ô®ö$ùŸûþ— qÃö ÿ Ö g¥~ß¹ñ}B A g¸?üÿõ'ïÃçà:Ø|ÐÉÂÕ»r¶ý±–®3¬Üªxªöª:¬"®œ°z³·¶!º¿½kÁ(ÅàÈ’Ì7ÐËÓP׸ÚÞRá‹ä›ç§ê”íuð=óùõŸø6û½ý6›ýCŒ ¿ ë #:?A<3! ÷!Þ#Å%¤'Š)h+R-3/1 3þ4ò6÷8ô:=?9AeCEÊGJEL‡NÁPñRUWðX–Zù[]¥]Ç]M]$\3ZjW«SOKI­B;É2É)N À áù/ñCé#âùÛ¹ÖoÒ Ïy̫ʂÉòÈÕÈ$ÉÂÉ£Ê¹ËøÌWÎÕÏaÑÓ¶ÔtÖCØÚþÛéÝæßëáûãæAèzê»ìïbñÅó1ö¨ø ûŸý‘õO† ™ z fYÍÇ˹ Ü 0¨Wý<÷€ð3é”áºÙùÑoÊdÃÿ¼l·Í²+¯›¬«}ªÓªí«À­°í²¶x¹ ½µÀpÄ(ÈÝ˃ÏÓ¡ÖÚoݸàèãçêíæï¶òrõø¸ú@ý½ÿ'„× T ¤ÁÒÛàÚÓİœ!}#l%C'0) +ô,Õ.À0«2œ4’6‘8:¢<²>Ò@õB&EYG—IÔKNPP…R¥T¯V”XDZ¹[Ò\]Ä]o]i\¡ZXxT÷OzJD¨i@‰B¸DìF"IhK MåOR?THV8XñYr[¡\m]Å]ƒ]©\[“X8UæP KXE*> 6_-$hœã|ýŽôVìàäWÞ»ØÔSÐpÍUËõÉ ÉãÈÉ…ÉKÊKË}ÌÎÍ@ÏÆÐcÒ ÔÇÕ‹×`Ù=Û'Ýßá+ãDågçšéÔëîqðÔò9õ­÷$úŸüÿ’_£Ç º uâù Ë`T ¦sqÿ¥ù!óì‰äÃÜ÷ÔPÍÆi¿¹„´|°…­“«£ª¢ªr«ÿ¬(¯Ê±Ö´#¸¦»K¿ü»ÆjÊ Î´ÑKÕ»Ø%Üsß­âÔåäèßëÎîœñgô÷µùHüÅþ:™ô7z ¨ ÓñôÜ Ç"©$&q(R*8,.0ì1Ü3Ò5È7Í9Ï;é=ù?"BHD}FµHóJ2MrO§QÑSäUÖWŸY)[i\L]·]œ]Û\d[YïUÎQ·L¤F¡?À7"/î%QÈRÿEöííIæ–߯ÙðÔÑö͹Ë/ÊIÉéÈ÷ÈiÉ#ÊËBÌ‹ÍøÎzÐÒ¸ÓqÕ1×ÙÝÚÉܹ޹àÃâÙäüæ'éfë¨íýïZò½ô3÷£ù$üšþë/[ X ›ÄƒÃ|Šìˆ T MrÍúlôwíýåKÞtÖÇÎsÇ¥Àœºkµ6± ®ä«Äª–ª>«¬¬±®G±5´·ñº˜¾BÂƳÉjÍÑœÔ ØÛÍÞâ6åNèLë<îñÜóö3ùÉûKþ¾(|Ê ; k„ž¯²¶°¡•~ g"M$1&(õ)Ú+»-¦/‹1~3l5f7i9j;~=“?´AÝCFDH„JÀLO6QfSzUxWDYßZ.\$]©]ª]]»[•YžVªRÈMãGA[9Ý0Ç';yµ )ø‡ïÁçÛààÚÚռыÎÌwÊqÉóÈøÈKÉÊåÊÌJͰÎ/пÑiÓÕÜÖ§ØÚhÜVÞTàYâqäŽæºèòê6í„ïãñAô¶ö'ù¤ûþ— m½ë ó Å OŽ[¿‹ÀD ý jíû°õÔîuçÉßô×CÐÑÈðÁ·»^¶÷±•®A¬íªª«X¬J®»°¥³Õ¶KºÝ½‘ÁDÅÉ®ÌUÐæÓi×ÔÚ,Þoá›ä¶çºêªíˆðQó ö°øKûÎýH° X Ï ÿ 9HPTLE2! "ð#Ô%¶'˜)~+]-G/013579 ;=/?FAtCžEØGJRL‘NÆPüRUWîXZñ[ù\“]²]2]\Zé*âÜÉÖ„ÒÏ“ÌÂÊÉ ÉîÈ=É×ɺÊÌË ÍiÎäÏqÑÓÂÔ„ÖLØ%ÚÜöÝîßõáä$æKè‚êÃìïjñÈó:ö©ø%û ýñJ| Ž h N7«šë•{ ™ è[ýëö.ðçèDá{Ù·Ñ>Ê8Ãá¼X·Ã²-¯¥¬ «”ªïª¬ã­;°³3¶œ¹.½ÖÀ’ÄDÈýËÏ9Ó»Ö*ÚŠÝËàäç%êíùïÌòõ4øÇúUýËÿ;•é+ c ” ³ÕßðîíãÔª!”#t%[':)+-è.Ð0¼2¬4¤6 8¤:¯<Ã>à@C3EgG£IÞK!NXPRªT±V‘XCZ®[É\|]²]T]K\{ZÚWHTÈOFJÓCq6=8A:E<_>s@šBÆDöF5IkK³MåO!R=TNV5XîYj[—\\]±]k]‰\äZhX U¶PmK%Eô=ì5.-ä#AwËeý‡ôMìåä_ÞÉØ$ÔgЉÍmËÊ:ÉûÈÉšÉaÊaËŽÌäÍMÏÙÐmÒÔÑÕ›×iÙKÛ0Ý)ß&á5ãLåpç¡éÜë'îvðÛò>õ±÷)ú¢üÿ•ü]š¼ ¬ aÊÜ~£3S¿ `($ÿQùÔò½ë?äzܹÔÍéÅA¿m¹r´{°Œ­¡«ºª»ª‘«"­I¯ñ±ø´F¸Ë»h¿!ÃÕÆÊ7ÎÓÑ`Õר<܉ßÅâèåùèöëÜî¶ñtô*÷ÆùYüÚþG¯LŠ º ã$(("í ×"º$ &(b*J,(.0ü1ì3á5Ø7Ü9á;õ= @0BVD‹FÃHýJ>MyO­Q×SäUØW™Y$[_\;]¦]ƒ]¾\B[òXÄU¡Q„LrFk?7ï.¿%+e²6ÿAöÝíSæ™ß×ÙÕÑ ÎÔËGÊeÉÿÈÉ~É:Ê-ËTÌÍ Ï‡Ð"ÒÆÓ|ÕB×ÙëÚÓÜÁÞÇàÈâçäÿæ5ékë°íð\òÇô3÷ªù%üþ‚â+K N †§ažKZ±G  #~úô%í²åþÝ6Ö‹ÎCÇÀ€º\µ1± ®ò«×ª°ª\«Ì¬Ù®e±`´ž·»´¾iÂÆÔÉ…ÍÑ´Ô,Ø”ÛèÞ#âQå_èdëNî&ññó öJùØû^þÐ8Ý R vœ­ÁÂÈ¿´¦ z"]$C&$(*è+Ò-±/¡1‹3~5y7u9;Œ=¤?ÃAëCFSHŽJÏLOAQjSUyWBYÛZ#\]—]‘]î\–[rYnV€R’M²GØ@&9©0–'T– ù÷|ï¿çâàêÚëÕÒÑÎ<ÌÊŠÉÉ ÉhÉÊþÊÌ_ÍÃÎ<ÐÕÑqÓ)ÕèÖµØÚrÜaÞ_àeâ{ä–æÄèûê=íŽïçñLô¹ö.ù£û$þ• i¶ä å ³ =nA’bŒ Ä ¸ ÒûZõ…î!ç€ß°×ПÈÈÁ™»N¶ì±œ®H¬«©ª2«z¬l®â°È³û¶mº¾±ÁfÅÉÌÌqÐÔ‚×ïÚ@Þ‹á­äÐçËêÂí˜ðkóöËøVûçýUÄg° à 0IYca`TE2 "$æ%Æ'«)Œ+q-U/@1+3579;%= u ¤ Éß÷ûüôæÒ½!¢#‡%j'M)0+-ú.ß0Ï2»4¶6®8µ:¿<Ô>í@C=ExG­IìK*N`P“R­TµVX=Z§[¼\n]œ]:]+\XZ°WT“OJ›C><42+Ö!(kÈ…ûÅò½ê…ã3ÝÓ×^ÓÖÏÍ/ËìÉ9É ÉAÉÏɣʩËâÌ5άÏ2ÑÓÒ{Ô:Öþ×Öٰۣݒߜá£ãÄåäçêUì¥îõð[ó¾õ5ø©ú$ýÿxÊ  ÿ øíuv㨫 ò \ýÆýÔ÷.ñêuâ²ÚùÒpËaÄì½G¸‰³Î¯­h«½ªéªð« ­ä¯£²»µ¹¢¼>ÀûëÇcËÏ£Ò%ÖÙùÜDà{ã–æ¨éšìƒïRòõÁ÷Xúîü`ÿÛ.ŠÎ ; \{››Ÿ‰r`!C#,% 'ñ(Ò*µ,œ.ƒ0j2`4P6N8P:V„@§B×DGEIvK¼MñO%RFTOV5XìYc[Š\Q]˜]X]h\ÁZAXàT„P:KîD¾=´5û,®#M¯JýzôBìçäcÞÕØ3Ô}О͋Ë"ÊZÉÉ5ɱÉyÊs˦ÌñÍdÏçÐ~Ò,ÔÞÕ¨×wÙUÛ?Ý0ß5á>ãVå{ç©éåë1î~ðáòFõ·÷.ú¥üÿ“ýW”± › P³À\{ê~ ÝÐþùòmëíã5ÜrÔà̵Å¿R¹e´w°‘­®«ÑªÒªµ«?­r¯²µn¸ë»¿?Ã÷ƪÊWÎîÑ}ÕñØTÜ¢ßÛâæ éìïîÌñˆô>÷Ûùküëþ]½Z  Ç û -39</(!è"Ì$°&”(t*Y,<.%0 24î5í7ê9ô;>@ ÿ,öØíLæžßáÙÕ.Ñ#ÎéËdÊzÉÉ)É—ÉPÊBËi̱ÍÏœÐ/Ò×Ó‹ÕL×ÙöÚßÜÏÞÐàÔâðä ç>ésë»í ðhòÍô;÷®ù)ü þƒÞ#G ; ý l?x!$x ȸÒÿ+úÅóÑìaå³ÝïÕQÎ Ç[ÀbºIµ+±®þ«îªÃª«è¬ÿ®‹±„´Æ·=»Ü¾‡ÂBÆòÉ¡Í?ÑÍÔHجÛß;âhåuè|ëaî?ñô¸ö[ùïûnþçF¦é1 ] §ÂÑÔÛÏÈ´£ Š"o$V&1(*÷+â-Ä/±135Š7†9;=³?ÕAùC,F^HJÕLOEQuS€U}W>YÙZ\ ]…]z]Ô\s[NYBVOR^M|Gž@ð8q0b'Þ+o ùâ÷rïºçäàõÚôÕçѯÎU̥ʥÉ(É$ÉÉ(ÊË-ÌrÍÓÎPÐáÑ„Ó7ÕôÖÂØšÚÜlÞkàoâ„䡿ÎèëHí”ïðñRôÀö1ù«û"þšg²× Ý ¡ (Vp5[Љ o ‹ÍIû õ1îÑæ7ßf×ÊÏjÈÁ{»;¶ã±ž®R¬«ÁªN«¬® ±ê³$·º&¾ÔÁ„ÅBÉèÌÐÔŸ×Û^ÞáËäáçåêÔí°ð|ó1öÚøoûôýmÓ/~½ ö B[kutpfXB -"$ö%Ú'º)ž+ƒ-f/S1<315$7&9';8=J?iAC¼EñG-JeL§N×PSUWìX†Zá[Þ\s]…]ú\Ç[ÀYíV ShN¯HB|:*20)Ä] Ë©ùñ5é/âÜæÖ¥ÒKϾÌõÊÏÉ>ÉÉmÉÊçÊôË4ÍŒÎБÑ4ÓÞÔ ÖeØ>ÚÜ Þà âä5æbè‘êÖìï{ñ×óDö·ø+û©ýî<m t K ÙöfCŠ$ý  RÁaüGö‡ïDè­àéØ;ÑÐÉ៼-·¬².¯µ¬C«Âª*«O¬)®„°[³¶æ¹s½ÁÏÄŠÈ4ÌÝÏlÓôÖ\Ú»Ýþà-äJçPêDí%ðñò®õVøðúzýñÿa·M Š µ ÙöûáÓ!°#%z'_)B+$- /ô0Ý2Ò4Â6Ä8Ã:Ò<â>A"CRE‚G½IøK3NmP˜R·T´V’X:ZŸ[³\\]‡] ] \4Z†WìSbOÜIdC<×3ú*¢!þ=­fûºò±ê…ã8ÝÜ×rÓäÏ:ÍCËÊQÉ%ÉXÉèɸʿËöÌHξÏBÑäÒ‹ÔHÖ ØãÙ½Û¯Ýß§á°ãÍåñç%êaì­îñ_óËõ6ø²ú&ý¡ÿvÇÿ í ŽÞÐSK¶ls ª ©xýz÷ßð¯é&âiÚ´Ò:Ë/Äʽ,¸}³Ë¯!­{«Ïª « ¬Ç­°Ë²Þµ<¹Â¼iÀÄÓÇË(Ï¿ÒCÖ¸ÙÝ_àŽãµæ¸é·ì“ïkò%õÖ÷núþüwÿéE›à I rŠ£ª²«¥™…q!V#<% ')ç*Ã,°.‘02n4c6^8`:j<|>”@»BßDGIIŠKÃMýO-RJTTV4XëY[[\@]…]=]K\šZX­TVPK·Dƒ=|5Á,#ã-‡7ýeô;ìäägÞáØAԒаͤË:ÊtÉ(ÉMÉÊɌʎ˶ÌÎuÏöÐ’Ò6ÔñղׇÙ`ÛIÝ@ß<áKã_å…ç´éïë7îŠðçòMõ¿÷0ú«ü!ÿ“üR‹© Œ ?›¥8SÖ²Ü : Ðþ¬ø-òë¡ãèÛ-ÔªÌÅ¿3¹X´s°”­À«áªòªÑ«e­•¯9²Dµ‘¸¼²¿aÃÇÈÊtÎ Ò•Õ Ùnܺßôâæ)éì ï×ñ¤ôM÷ñù€üüþsÏ(p¬ á '8IJMB:&!ú"Ü$Ã&¤(‡*j,N.40!2 46ú7ý9<>-@NBtD¨FÛHKRMO»QæSëUÚW•Y[K\!]~]T]‚\üZ£XjU7„.Y%Ìj ÿöÐíGæ¥ßêÙÕ@Ñ:ÎÌ~Ê“É4ÉBɯÉfÊZË{ÌÅÍ-ϪÐCÒâÓ›Õ[×(ÙÛéÜÙÞÛàßâùäçCéëÀíðmòÓôA÷´ù+ü£þ€Ü< 0 ç ZpRðõ9Ë }pÿØùuó~ìåkݨÕÎÜÆ4ÀHº8µ$±® ¬«àªž« ­$¯¯±«´é·e»ü¾«ÂaÆÊÀÍ[ÑèÔcØÆÛßUâ}åŽèŽëyîQñôÌökùü‚þö_²? s ›¾ÑãéèåÕʱ œ"$d&H()* ,ñ-Ö/Â1­3¢5˜7™9ž;®=Â?ãA D9FnH§JäLOPQyS†U{WAYÍZ\ù\u]a]·\S[%YVR-MCGj@·8<00'°O ÝÑ÷gïºçåàþÚÖ÷ÑÉÎhÌÁʼÉBÉ=É–ÉBÊ&ËDÌ‚ÍèÎ_ÐóÑ‘ÓFÕ×ÎØ§Ú‡Ü}Þqà}â‹ä­æÕèëLí¡ïòñ\ôÃö8ù¯û$þœe©Ñ Í ‘ 9I)—H - <€÷úºôÚíˆæâÞ*ׇÏ:ÈtÁ^»%¶à±š®c¬"«Ýªk«¾¬±®.±´J·²ºM¾òÁ«Å\É Í¬Ð5Ô»×ÛuÞ·áÞäúçúêèíÆðŽóGöìø„ûþƒâEÐ  3Royˆ†‚ydX 9"'$&í'Ê)±+’-z/a1P3?587598;H=Y?yAœCÍEüGæjè›êÜì)ï}ñßóJö¸ø3û¤ý ‡í5c i 8 ÇÝ<WìÃ Í tüùõ5ïøçaà¥ØљɾÂ}¼·¤².¯Á¬S«ÝªB«u¬G®«°³¡¶ º—½<ÁõÄ¡ÈWÌóÏÓ×{ÚÏÝáDä^çfê[í5ðó½õløû‹ýnÐb š Å í!$ øÝ!È#©%'o)S+3-/1î2â4Ñ6Õ8Ñ:ã<ò> A5CXE•GÅIL£@ÇBïD!GWI•KÍMP0RRTRV8XâYW[t\0]r]$]+\{ZîW†T$PÏJ…DO=I5’,Q#¿ o$ýVô<ìâäuÞêØWÔ£ÐÍÍ·ËYʇÉFÉbÉâɡʢËÈÌ΃ÏÑ¡ÒDÔÿÕ¿×ÙmÛVÝFßKáPãmåŠç¿éôëAîððòQõÁ÷7ú©ü%ÿùK†™ '†„)¨}¢ ø B5þ]øÛñÎêQã¦ÛðÓpÌXÅÛ¾¹L´p°œ­Î«öª«î«ˆ­µ¯_²gµµ¸4¼Ó¿‚Ã5ÇêÊÎ*Ò­Õ)Ù‚Ü×ßã2æ5é9ìïòñ°ôd÷ú“üÿ€æ4‡¹ ó 5JX[^SJ5#! #î$Ô&³(˜*z,_.E02246 8 :<#>:@\B„D±FìH!K^M—OÂQèSïUÙW‘Y[@\]k]=]d\ÝZxXCU QíKÍEÈ>ê6Q.,%¤óQðþöÅíNæ©ß÷Ù1ÕTÑQÎ̓ʰÉJÉ]ÉÄÉ}ÊnËŒÌÛÍ9ÏÀÐKÒöÓ¤Õi×3ÙÛñÜèÞààíâþä"çJé‰ëÈíðròÛôB÷»ù,ü¥þ~Õ1 Ö BT'ǽ‡ ="8ÿ‰ù$ó0ìÉä!ÝoÕÛͲÆÀ0º,µ±®¬«ýª¶«0­B¯Õ±Ì´ ¸‡»¿ÎÂ{Æ4ÊÙÍvÑÕxØáÛ.ßkâ’å¢è¥ëŠîgñ*ôÜöƒùü•þ mÆO „ ®ËçïüöùâÞÀ ®"$v&W(;*,.é/Ï1¿3°5ª7¨9­;½=Ñ?óADEFyHµJìL)OUQ~S‰UzW?YÆZ \ì\`]M]˜\4[þXñUïQûLG3@†8 0'†ß2 ÇÂ÷aï¸çíà ÛÖ ÒâÎ}ÌÞÊÑÉ^ÉSɱÉTÊ?ËSÌ™ÍõÎrÐÒŸÓRÕ×ÛØ°Ú•Ü‚Þ~àƒâ—ä´æÝèëXí¢ïòZôÎö8ù²û&þ™_¡Æ À  û"Ý'Úù_ èø3¬úiôí<æœÞìÖMÏÈNÁC»¶Ö±£®i¬:«òª‰«Þ¬Ó®P±6´h·Úºh¾ÂÄÅ{É'ÍÁÐUÔÎ×8ÛÞÊá÷ä èëþí×ð¥óVöù‘ûþøSŸâ  Ce|Ž•—”†yd N"5$&ü'Ü)À+¢-‰/s1^3P5H7B9L;R=l?„A­C×E HCJLµNìPS&UWçX~ZÎ[Å\P]X]Æ\„[xY—VÇRNJHœA:¿1Ò(iÈ ‚ùûð2é3â+ÜþÖÎÒuÏíÌ)ËÿÉrÉQÉÉ2ÊËÌZͰÎ(вÑNÓþÔ´Ö„ØQÚ8ÜÞàâ-äIæqè£êæì-ï‡ñäóMöÀø1û«ý‰ç0Z \ ( ²éºì*´† ‰ Ç&Çû¥õæî«çàcØÆÐjÉ”Âb¼·œ²1¯È¬g«óª`«“¬i®Ð°¢³Æ¶.º¸½_ÁÅÄÈqÌТÓ&׎ÚêÝ*áZätç{êkíOðóÕõ{øûŸý‚Ü0q ª Ù ú)/6/* ï!Ö#¼%'€)c+E-,/13î4æ6ß8ç:ì<?ABCjEžGÔI LIN{P¥R¾T¸VŽX4ZŒ[š\<][]í\Ì[ìY4W•SÿNyIúBš;o3˜*K!­ÿ vEû ò®êˆãMÝø×”ÓÐfÍwË7ʆÉVÉŠÉÊãÊèËÍlÎàÏbÑÿÒ¨Ô`Ö'Ø÷Ù×ÛÀݵ߷áÅãàåè6êqì¹îñió×õ?ø¸ú+ý ÿl¾ì÷ Î d­• ùUú ' ‡ÙüÜö=ðé“áßÙ:ÒÐÊÛɽ¸h³É¯3­™«ÿª=«P¬®U° ³*¶¹½«ÀZÄ È¼Ë^ÏôÒyÖçÙEÝ‹à¼ãßæâéáìºï”òIõü÷’ú$ý›ÿ gÁÿ@ l ‘°ÁÌÔË˶©!{#\%A'$)+é,Î.´0 2‘46‚8~:Š<™>µ@ÒBE+GhIœKÚM P;RSTYV2XãYL[l\]_]]\SZÊWWTôOžJKD=5`,##’éPýIô3ìääzÞùØfÔ¸ÐâÍÒËnʦÉYÉ}ÉùɶʹËÚÌ-ΖÏѰÒRÔ ÖÌמÙwÛ`ÝSßRá^ãrå™çÄéìEî˜ðôòYõÇ÷8ú°ü!ÿ”õH} p jlówJc » Aúáýø‡ñ|êã[Û±Ó7Ì+ŵ¾ ¹;´n°¢­Ù««"«¬¥­Ý¯‚²µÙ¸Z¼ò¿¦ÃSÇ ËªÎEÒÉÕAÙžÜëß ã@æRéIì2ïòÅôv÷ú£ü$ÿ“ôNÕ ý ,D^holgXI2!#%à&È(§*Œ,o.X0?214"68:#<3>J@kB‘DÂFôH0KfM OËQëSôUÖW‘Y [5\]U]$]I\·ZUXUßP·K›E>¶6.û$|Í4ÙþýõÀíKæ±ßÚAÕfÑiÎ1Ì­ÊÉÉbÉuÉÝɑʃˢÌéÍPÏÉÐbÒþÓ·Õr×CÙÛÝìÞðàôâ å*çWé‹ë×íðòÚôN÷¹ù3ü¥þzÓ '  À -8Ü•‹È G ÷×éþ5ùÖòÝë{äÛÜ'Õ©Í}Æë¿ºµ±®$¬*««Ø«P­e¯ü±ï´4¸ª»>¿ïœÆSÊöÍ•ÑÕ—ØõÛJ߀â¨å¼è´ë¦îuñ@ôñö”ù&ü©þ„Ô'_ — ½àõ  ùéÔ À"Ÿ$Š&e(N*,,.õ/æ1Ë3Å5¹7·9À;Ë=á?B$DUF…HÁJöL3O^QƒSŽUzW/"135ö6ò8õ:ÿ<?.ANCyEªGàILRNƒP¬RÁT»VX*Z‰[Œ\*]I]Ï\¯[ÆY WeSÐNBIÅBe;83h*!„Ý W4ûò«ê‰ãVÝاÓ'Ð{Í’ËOÊŸÉnÉ¢É)ÊûÊüË-ÍÎíÏwÑ Ó¸ÔlÖ5ØÚáÛÎݾßÅáÎãçåè:ê|ìÂîñuó×õJø·ú3ýœÿh¸ãì ½ R“uéÍ%Ë» ä ?ÆŠü‰öíïÀèGá™ÙùÑʬÃi½î·Z³Ì¯6­®««\«m¬(®x°3³P¶£¹,½ÌÀ{Ä-ÈÛËzÏÓ‘ÖÚ]Ý£àÖãñæûéòìÑï¦ò]õø¤ú8ý­ÿ~Í M ¢ÂÑàãáÙɺ£!‰#q%P'5)+ù,à.Ã0´2ž4•6’8‹:ž<¦>Æ@âBE;GrIªKáMP?RZTXV5XÜYI[\\]I]ð\ð[2Z W+TÂOkJDæ<Þ4,,õ"iÄ1üü9ô/ìåä€ÞÙwÔÌÐûÍèˉʾÉqÉ™É ÊÐÊÊËðÌ@Î¥Ï*Ñ»ÒdÔÖÙ׫قÛmÝ\ß^ágã}å çÎéìNî ð÷òcõÇ÷@ú°ü#ÿ“ñCv‚ d WJÓÖJ& { ø¯•ý¼÷9ñ,ê¹âÛqÓÌþÄ’¾ò¸/´k°©­ê«$«A«/¬É­ÿ¯¨²°µÿ¸y¼ÀÂÃwÇ%ËÆÎdÒâÕZÙ¶Üà8ãYæfé_ìEïòÙô‹÷&ú·ü5ÿ¥ \¥â  >Upw~xj[A!1# %ù&Ô(º*ž,}.l0O2B426.8*:6Z@zBŸDÏFI:KsM©OÓQñSöUÙW‹Y[+\ó\F] ]-\“Z-XæT®PƒKeEZ>~6ê-É$N§Ãþëõ¹íIæµßÚMÕ€Ñ{ÎJÌÇÊßÉÉÉòɫʖ˸ÌüÍ_ÏßÐkÒÔÀÕƒ×OÙ$ÛÝúÞúàþâå3ç^é™ëÙí*ðƒòåôO÷Ãù2üªþ{Í  ² ºÙjU  ´Š›þäøƒòŒë/äÜèÔmÍPÆÅ¿ü¹ µ±"®2¬<«0«ô«t­‰¯²µW¸Ï»c¿þÆqÊαÑ7Õ­ØÜ\ßâ¼åÑèÍë·îñRô÷§ù:ü¹þ0ì3s § Ðð øè Î"³$—&z(\*@,". 0ó1à3Ó5È7Ì9Ë;Þ=ð?B5DaF’HÎJÿL>ObQ‹SŽU~W6Y¾Zô[Ñ\<]]a\ïZ³X—U‘Q–L¦FÌ?8¤/ž&1÷ ‘¥÷Iï·çõà Û3Ö2Ò Ï³Ì Ë ÊŒÉ…ÉàÉ‚ÊjË|̾ÍÏ“ÐÒ½ÓoÕ(×ôØÉڪܚޒà™â©äÉæîè*ëcí¶ï òjôÖöCù¸û(þœýY”² ¤ \ ÐêžØ‚’î ‰ aašÿ úÇóíìŸåÞ`ÖßÎ¥ÇÁ »ôµÍ±¤®…¬^«%«Æ«­¯˜±´±·!»°¾XÂƹÉ_ÍÿЈÔØlÛ¸Þþá å:è8ë'îñÊóö%ù»û=þ¸xà = c‰ ®º¹¶©›ˆ o"X$6&!(ü)ä+Â-­/“1€3r5f7g9g;x=…?¦AÆCöE#H^JLËNúPS0UWçXoZ¿[§\.])]\C[-YCVhR¡MßG1A¨9V1o(x× i_ùèð(éAâ8Ü!×ðÒ¢ÏÍ[Ë3ʤɂÉÊÉbÊ9ËHÌ}Í×ÎGÐÒÑmÓÕÕÖ–ØpÚIÜ;Þ,à4â@ä]æ€è¸êñì@ï’ñòóZöÅø=û©ý"€ãI @  …¶zϘÃG  1%ûõDîçƒßß×KÐÉBÂ&¼å¶‹²3¯à¬‡«&«˜«Õ¬¯®±ê³·tºý½¢ÁRÅÿȯÌHÐÝÓU×ÄÚÞZáˆäŸç¥ê—írðBóøõ¤ø8ûÄý9¨S• Í û 8JTWSI<& "÷#Þ%¾'£)‚+j-K/61 3579;=?Ñ@ñBEHG~I´KêMPER]T[V1XØY?[P\]1]Ø\Ð[ZyWýS•O5JæC®<°4ù+Ì"@¤æü4ô)ììä‹ÞÙŒÔáÐÎÌ£ÊØÉɬÉ'ÊãÊáËÍQηÏ8ÑÍÒqÔ$Öç×´ÙÛvÝhßeárãƒå«çÔéìUî¤ðóeõÎ÷Aú²ü$ÿï<kw Q í =+°«Úð 3 ·bHýl÷éðÞépâÔÚ2ÓÐËÑÄw¾Ø¸(´i°²­û«8«_«K¬ï­°Î²Òµ"¹ž¼8ÀæÃ’ÇBËåÎyÒÖoÙÐÜàLãpæxéuìWï.òëôž÷8úÉüHÿµl¸ð & Hm{ŽŠykU!;#&%'ì(Æ*¯,‘.w0c2O4D6<8;:Dk@…B¯DÚFIFK{M¯OÛQóSùUÖWˆYûZ!\á\2]ð\ \tZX»T‚PPK5E$>P6·-£$#‹ø´þáõµíLæÂßÚgՎјÎaÌãÊùÉ˜É¥É ÊÁʪËÌÌÎqÏîÐ{Ò!ÔÌÕ×YÙ2ÛÝßáãå:çgéžëâí-ðŠòéôT÷Äù4ü©þxÅþ ó Ÿ ú–°>W  mAMþ—ø2òAëããMܪÔ8Í#Ʀ¿â¹µ±)®@¬R«J«¬“­¬¯A²;µ{¸î»‡¿+ÃàÆ‹Ê1ÎËÑNÕÊØ&Üxß®âÕåãèâëÉî¡ñfô÷ºùIüÍþ>¥øH‚ ¹ á#0+( ø Ý"Å$¨&‰(o*J,9.02î3á5Ü7×9Ý;ë=ý? B?DpFŸHÖJM?OpQˆS–UvW9Y±Zî[¿\)]]C\ÏZ‰XqU`QhLrFš?â7w/p&nÚ ~™÷Cïºçüà-ÛGÖDÒ'ÏÅÌ+ËʨɠÉóÉžÊzË”ÌÎÍ,Ï¢Ð.ÒÎÓxÕ8×ýØÖڶܤޜà¤â±äÑæùè-ëníºïòpôÚöEù¼û'þœùR‹¨ “ L ´Ðx±U]² K Lÿ¸ùvóŸìSåÆÝ"Ö£Î|ÇÛÀôºæµÆ±­®¬s«>«â«@­=¯¿±¡´×·B»Ó¾wÂ(ÆÔÉÍѤÔ؃ÛÔÞâ<åJèOë:îñÛó”ö4ùÎûPþÅ/†Õ O rœ®ÀÊÉÆº¬— "f$K&,(*ò+Ô-¼/£1‘3€5y7t9z;=š?°AÙCÿE2HeJžLÑNQ S.UWßXlZ²[š\]]s\![ YV=RlM¯Gü@u9&1@(åV· VOùáð,éCâIÜ/×Ó¸Ï6ÍuËLÊÀÉ™ÉãÉyÊNË^ÌŽÍêÎVÐäÑxÓ(ÕßÖ¤ØyÚWÜAÞ:à:âKäcæŒè¼êüìDïšñõóaöÉø<û¯ý…Ú? / ù kœXªj’ Ç ÁåBÖú²ôøí¾æ>ß™×ÐÔÈ ¼Ó¶ƒ²8¯é¬œ«=«¶«ö¬Ï®?± ´7·—º¾ÇÁmÅ$ÉÆÌhÐóÓs×ÚÚ0Þqáä¶ç¸ê¬í†ðUó öµøMûÕýM¸e¥ á 0G]cj`^H= " $ë%Ò'°)—+w-]/F1/3#579;=/?JAiC–EÂGùI.LdN”PµRÉT¼VˆX$Zq[v\]]\k[€Y¶V SpNÚH`Bø:Ô2*à 8ž 'û‚ò£ê–ãgÝ&ØËÓUЬÍÄË„ÊÒÉ¡ÉÐÉ[Ê#Ë'ÌSͤÎГÑ,ÓÑÔ‰ÖLØÚøÛãÝÓßÙáßãüåèMêŠìÏî#ñ}óäõMøÁú0ý¡ÿ aªÏÐ œ &`5ŸwÅ[C ] °/íûêõKï+è°àÙ‚Ñ5Ê_Ã*½É·I³Ì¯K­Ð«?«—«©¬q®»°³”¶î¹o½ÁºÄiÈ̲ÏFÓÆÖ2ÚÝÑàäç&êíúïÌò„õ5øËúYýÓÿ? ñ6 s ž ÉàöýèÞÀ!¯#Œ%w'R)8+-þ.é0Î2Ä4°6²8®:¹<È>á@ýB*ETG‹I¾KõM%PLRaT[V2XÒY9[B\ò\]º\¸[æYSWÑSeOJ°C~y@“B»DêFISK„M¹OàQøSúUÕW†YñZ\Ñ\]Õ\ò[OZÞW‘TMP$KûDó=6ˆ-p$þbßšþ×õªíQæÄß*ÚsզѫÎ~ÌøÊʰɽÉ"Ê×Ê¿ËáÌΆÏûÐŒÒ/ÔÚÕž×cÙ@ÛÝßáã$åFçqé¥ëëí6ðòñôW÷Éù6ü«þtÂò ã Š æÝz…ê „ %öþDøäñòê–ãÜlÔþÌøÅƒ¿É¹õ´±/®O¬g«b«5¬²­Ò¯f²_µž¸¼¨¿MÃǧÊPÎãÑnÕÞØCÜßÅâìå÷èùëÝî·ñwô*÷Íù\üàþPµ X– É ò)7=@50 !í"Ö$º&™(*^,F.)024ò5ê7è9í;ú=@+BPD{F«HäJMMOsQ‘S–UzW1Y±Zß[³\]í\'\¬ZcXEU1Q6L=Fb?°7>/D&ÛIº i…÷@ïµçá5ÛWÖYÒ:ÏâÌ>Ë=Ê¼É¼É Ê³Ê’Ë¥ÌãÍ=ϲÐ?ÒÚÓ‰ÕD× ÙàÚÃܮިà¬â»äÚæé7ëuíÃïòzôÛöNùºû-þ—ûK†› ‡ 5 £¯]…*'}  ÖÎýþjù%óOìåÝàÕkÎJǸÀ׺׵±®®ž¬„«Y«¬`­`¯â±Æ´û·f»õ¾™ÂHÆóÉšÍ4ѾÔ7ØšÛìÞ%âQåbècëPî'ñóó£öLùÞûcþÚ=œã* [ ˆ«¿Õ×ÝÕÍ»© ’"y$Z&@(*,ä-Î/³1£3‘5‡7‡9†;–=¦?ÁAäCF>HrJ¨LÜNQ'S2UWÞXiZ¤[”\]þ\V\[ãXíUR;M|GÅ@B9ð0(º* 8@ùÖð'éKâMÜC×ÓÏÏOÍŠËiÊÕɵÉûÉŽÊfËoÌ¥ÍøÎkÐðÑ‹Ó3Õíֳ؂ÚfÜJÞDàFâTäoæ“èÆêíNïžñô`öÑø>û±ý‚Õ1 ' á [}:ƒ=bÑ Œ zžôÿ†úbô§íqæóÞY×ÔϦÈñÁ𻽶€²3¯û¬¨«[«Ï«­ô®`±3´Y·ººD¾åÁ‘Å?Éç̃ÐÔŠ×÷ÚEÞ‰áµäÊçÒê¼íŸðfó#öÇø`ûçý`Ê&u¸ ð ?]jyvwk\M 0"$û%â'Ã)¦+‰-o/S1E3-5)7!9#;/=>?WA{C EÑGJ7LnN›P¼RÎT»V‹XZo[c\ù\]ƒ\K[\YŒVÞR?N§H)BÄ:Ÿ2×)• | þúuò ê˜ãqÝ5ØÛÓkÐÃÍÜËÊìɸÉêÉqÊ8Ë>Ìd͸ΠФÑ:ÓâÔ•ÖZØ(ÚÜêÝâßßáëãæ"èZêŽìÙî*ñƒóëõSøÃú3ý¢ÿ_£ÆÄ ‹ HyP&  iážû—õýîÙçkàÍØJÑþÉ7à ½´·A³Ì¯T­à«Y«°«Ì¬‘®à°¤³¸¶º½3ÁØÄŒÈ0ÌÒÏ`ÓáÖKÚ¥Ýçàä0ç?ê+íðÜòœõCøãúgýêÿO³H ƒ ³ Öõ ýéØ!¹#¤%‚'g)G+,-/÷0â2Ð4Æ6¾8Â:Å<Ø>î@C4EeG“IËKþM.PRReT\V1XÍY1[5\ã\]¥\’[ÆY(W£S5OÐI|CFÛ E qˆ¢¬²±ªžŠy!\#D%(')ì*Î,±.›02r4e6Y8^:`‡@¢BÊDõF&I]KMÁOæQÿSøUØW~YíZ \Ã\ ]½\Ó[,Z¶WdTPïJÆDÂ=ß5Y-B$Ô@ÆþÇõ¬íKæÒß5Ú…Õ¼ÑÃΓÌË+ÊËÉÖÉ8ÊïÊÓËõÌ2Î•Ï Ñ›Ò:ÔìÕ§×tÙGÛ-Ýßáã.åOçwé®ëòí:ð—òôô]÷Êù;ü§þoºïô Ù s ÍÄR`Þ¶Þ C ß®°ý÷÷”ñ¡êPã½Û/ÔÊÌÉÅc¿°¹ë´ ±:®[¬|«€«P¬×­õ¯ˆ²†µÀ¸7¼È¿pÃÇÈÊkÎÒ†ÕûØWܧßÛâæé ìôîÆñô;÷âùmüñþbÈg© × !:HNPG>-!#å$Ê&«(*p,S.;0#246ù7ú9û; >@9B]DˆF·HíJ!MROzQ–S˜UzW.Y¦Z×[¡\]Ñ\ \‰Z>XUQLF)?7 /&²& Vv÷<ïµç áCÛiÖmÒRÏúÌYËUÊÚÉÐÉ%ÊÇʨ˺ÌôÍOÏÂÐNÒêÓ–ÕP×ÙëÚÏÜ·Þ³à³âÈäáæ é@ë{íÊïò}ôáöPù¾û,þ˜öG|“ t ' ‡–9^üô> Ï Š‰®þùÖòýë½ä5Ý¡Õ3ÎÇ•À¿ºÆµ¿±³®ª¬›«q«¬­„¯²ë´ ¸‡»¿·ÂjÆʹÍPÑ×ÔSذÛß;âgåwèyëbî>ñô¼öZùóûuþèT§ü5 p ˜ºÔáíêêÚз ¤"‡$m&N(3*,ú-Ú/Æ1±3¡5š7’9›;¡=¶?ÐAñCFJH}J´LáNQ*S5UWÜX`ZŸ[\ö\ä\;\ÞZ½XÃUßQ MGG‘@ 9À0ß'‘~ "1ùÎð&éPâYÜS×)ÓçÏfͤ˄ÊíÉÑÉÊ©ÊxË‡Ì´Í ÏyÐÒ•ÓEÕøÖÀØÚnÜVÞRàKâaätæœèÐê íUï¤ñôföÕø?û²ý~Ñ (  Ï Da[.™ N 5V§ÿ9úô[í"æ®ÞןÏsÈÏÁÔ»®¶x²:¯­¿«o«ñ«5­¯‚±Y´|·ßºf¾°Å_ÉÍ¡Ð)Ô¤×Û[Þ¤áÆääçãêÓí°ð{ó2öÝøpûûýoÜ7…Ë þ 2Mn{‰†ŠxqZ C",$&ñ'Õ)¶+˜-/e1R3@577094;<=K?jA‚C´EÙGJCLuN£PÁRÐT½V†XZf[U\ç\ì\g\+[6YdV²R NvHôA‘:m2¨)i ïW úéúoòêžã{ÝDØñÓ€ÐÞÍõË·ÊÊÑÉʆÊQËMÌ}ÍÅÎ5бÑKÓíÔ¤ÖdØ5ÚÜúÝçßìáòãæ.è_ê˜ìàî.ñŽóçõ]øÀú8ýžÿ[˜¿³ y ü (úQ#^î Æ Ù™NûIõ¯î‹ç$àŒØ ÑÑÉ Ãó¼ ·;³Ì¯_­ó«p«Î«ì¬±®±Ã³á¶2º¶½PÁúĨÈNÌíÏzÓùÖeÚºÝÿà0äEçRê@í&ðïò­õZøïúýôÿgÀX •  é!'# ýå!Î#±%“'y)V+?-/1ò2ß4Ø6Ë8Ò:Õ<æ>ÿ@CEEmG IÖKN7PVRiT]V/XÉY%[-\Î\ô\‰\r[¤YýVzSOžIIC<4m+>"Ñ:Ñ«üôì÷ä£ÞAÙ¿Ô&ÑXÎNÌðÊ"ÊÚÉõÉkÊ(ËÌAÍ…ÎìÏfÑûÒ™ÔOÖ Ø×ٴە݈߅áŒã¡åÂçîé*ìgî½ðótõÝ÷Gú¹ü&ÿˆæ$TM # ¯ íÕ>4…?4 u Ý‚]ü{öýïñè”áÚ|Ò1ËUľž¸´j°É­*¬}«±«©¬U®‰°;³?¶Ž¹½ŸÀDÄñÇšË:ÏÌÒMÖ»ÙÝZà•ã«æ½é°ì•ïgò'õÒ÷túýü~ÿìN¢é' V €š²¼ÄÁ¼«ž†!o#U%6')ü*Ü,Å.¦0•2€4s6m8j:q<€>“@±BÖDG2IfK—MÉOëQTúUÖWyYæZü[²\ö\ \º[Z“W6TñO¾J•D‹=±5(-$­"¥yþ¹õ©íOæÚßDÚ˜ÕÑÑÜίÌ-ËIÊáÉïÉRÊËìËÍFÎ¥ÏÑ«ÒIÔ÷Õ·×|ÙVÛ7Ý$ß!á#ã;åTçé¶ëöíDð›òùôb÷Ìù=ü§þi·àí Ä b ²¥05®ƒŸ  –cbý¨÷BñVêã|ÛîÓ–ÌœÅB¿›¹Ü´ ±<®n¬«›«p¬÷­°­²¨µæ¸W¼ì¿Ã=ÇâÊŠÎÒ¤ÕÙqܽßðâæ!é!ìïÛñ¡ôN÷óùüÿsÛ-|¶ í 4KVa^YN>'!#ô$Û&¼(ž*,e.J062468: <>,@HBkD•FÄH÷J*MZO‚Q—SœUwW,YžZÌ[“\ï\º\í[gZXîTÔPÓK×Eû>G7à.ä%‡ ;r÷/ï¾çáUÛxÖƒÒjÏÍtËoÊòÉëÉ;ÊàʺËÒÌÎcÏÒÐ^ÒùÓ Õ`×!ÙûÚ×ÜÂÞ¼à¾âÏäìæéIë€íÑï#òôëöMùÃû+þ—òAr† g  oy;ÈÅ ‹ K:cþÌø„ò´ënäòÜcÕúÍóÆnÀªº¹µ¸±¼®µ¬±«Š«<¬¤­¥¯)²µA¸¬»8¿Û†Æ/ÊÔÍmÑîÔmØÆÛßSâ|åŒèŒëwîQñôÌönùü‡þýb½J ~ «Ëá÷öôðÛÍ ±"›${&a(>*(,.ñ/Ò1Â3²5¨7¤9§;±=Å?ÝAD&FXHˆJ½LëNQ.S:UWÛXXZ•[r\â\Î\\½ZšX˜U±QÝLGb@Ø80´'fä_ #ùÇð&éWâeÜc×?ÓûÏ€Í¿Ë›Ê ÊæÉ+ʽÊË—ÌËÍωÐÒ¥ÓSÕ×ËØÚxÜcÞXàWâiä|æ¨èÓêíWï°ñônöÕøDû²ý|Ê  ¾ +Gù3æùc õ `ÿãùÈóíÜåeÞÖÖfÏDȪÁ·»¢¶o²?¯­Ñ«‰« ¬X­8¯©±x´£·»‡¾'ÂÏÅ{É"ͶÐKÔ·×+ÛpÞ¼áÜäøçøêçíÅðóGöìø†ûþ†êK—Ü  @a}˜›•Ž}k V":$&(ä)È+©-/v1b3Q5F7A9C;K=^?rA˜CºEêGJML€N¨PÉRÒT¿V‚XZY[L\Ò\Ù\H\[Y2v)= È9 áÙúdò›ê¢ã…ÝRØÔ”ÐõÍÌÐÊ!ÊéÉÊÊgËcÌŽÍÙÎDÐÄÑWÓþÔ°ÖqØBÚÜÞõßóáÿãæ7ègê ìçî6ñŽóöõXøËú4ý¡ÿW“³§ i ä Ù*û(º „ ™ÑOýúûô\îAç×ßJØÒМÉèÂϼ‘·0³Í¯m­ÿ«‰«ê« ­×®(±ë³·Wº×½vÁÅÊÈjÌ Ð–Ó×}ÚÓÝáDä]çeêVí7ðóÀõløû‘ýxÕ$m £ Ö ÷%564. ÷!Þ#Â%¥'‡)j+K-3/13ï4æ6Þ8à:å<ö> A,CMEGªIàKN=P^RlT_V+XÇY["\»\à\l\W[|YØVJSÓNkICà;Ú3<+"¤±šüôìùäªÞNÙÒÔ7ÑqÎfÌË?ÊñÉÊ„Ê<Ë1ÌT͘ÎþÏwÑ Ó©Ô[ÖØäÙ¿Û Ý”ßášã¨åÍçöé1ìqîÄðó}õÝ÷Pú¹ü&ÿˆß%CI œ Ö²Xû / –5 ü+ö©ï¦èFá¾ÙBÒ÷Ê+Äô½ƒ¸ü³f°Ñ­=¬«Í«É¬u®¯°_³d¶²¹(½¿ÀiÄ È¿ËRÏëÒgÖÕÙ0Ývà©ãÄæÓéÃì¬ïzò;õç÷†úý’ÿýa³ý8 i ¬ÃÏÔÒν°–!#d%J'')+ì,Õ.¹0¥24…6z8~:~<>£@¾BçD GCInK¥MÏOóQTýUÔWvYÝZð[¥\Þ\‹\—[ãYjWTÅO„JdDR=~5ó,ç#ƒú‹^þ®õíRæÜßRÚ§ÕãÑôÎÄÌHË`ÊûÉÊkÊËÌÍXθÏ-Ñ»ÒWÔֿ׎Ù]ÛEÝ.ß+á/ãCå^çŠé½ëîJð£òýôh÷Ðù?ü©þh¯Ûß · N —‹ }Lg Á TýT÷öðê·â6Û¯Ó_ÌrÅ¿‡¹Í´ ±D®{¬¥«¶«Ž¬®9°Ô²Ëµ¹¼À¶ÃWÇË¢Î9Ò»Õ+Ù‹ÜÔß ã.æ7é7ìïññ³ôc÷ú’üÿ‡ëB‰Ì û (D\kotfcK<@UByD£FÐHK4McO‰QSžUxW'Y™ZÀ[…\Ú\£\Ð[DZòW½TªP›K¤EÅ>7¬.´%`Ýa )Y÷+ï¶çá\Û‡Ö™ÒzÏ/Í‡ËŠÊ ÊÊVÊòÊÓËâÌÎtÏãÐoÒÔ´Õj×1ÙÛäÜÏÞÆàËâ×ä÷æéTëˆíÚï'ò‰ôêöYùÀû1þ“ô9ny Y ÿ YZ÷  Ê L òþ{ø4òbë#ä§Ü"ÕÁÍÁÆKÀŒº«µ²±À®Á¬Å«¤«[¬Ä­Ë¯M²4µi¸Í»_¿ù©ÆLÊõÍ…ÑÕØçÛ1ßoâå¥è¢ëîeñ+ôßöƒùü™þsÐ^ ¾Ûö  ÿïÜ Â"¬$&p(S*3,.ü/è1Ñ3Â5¸7´9¶;Ã=Ñ?ïA D6FbH–JÄLøNQ6S9UWÔXVZ‡[f\Í\·\\›ZrXmUQ©LÜF,@ 8]0{'>·C ïù¼ð#éZâoÜp×QÓЙÍÕ˶Ê!ÊÿÉCÊÓʥˬÌÞÍ.ÏžÐÒ·Ó^Õ×רªÚÜrÞ_àhâkäŽæ©èâêídï²ñôpöÝøEûµýwÉü ü « +׺Æ* Ì ®Ä ÿ™ùsó¹ìŒåÞ“Ö,ÏȃÁ›»¶h²B¯­å« «,¬t­_¯Ë±Ÿ´È·"»®¾FÂóÅ™É@ÍÕÐbÔØ×=Û“ÞÉáûä èëýíÙð¢óZöù–û þ”Z«í # Sq‘©®¦ € c"P$-&(ò)Û+¹-¢/…1s3a5Y7O9U;X=o?A§CÅEûG"J[L‡N°PÎRÔTÁVX ZM[@\À\Á\/\ìZêXVUR©MHˆA):2E)  ÇÅú]ò“ê¨ãŒÝbØÔ«Ð Î)ÌæÊ<ÊÊ4ʳÊ}ËwÌ¡ÍìÎUÐÒÑjÓÕÀÖ}ØPÚ$ÜÞàüá äæCènêªìíî>ñ–óùõ_øÍú8ýŸÿO‘¥Ÿ S Ò ó¹Íú€ G T‹­ú¬ôî÷æ‹ßØ–Ðjɽµ¼y·+³Ì¯w­¬¡«¬-­÷®O± ´+·wº¾‘Á?ÅãÈÌ#дÓ,טÚìÝ.á[äuçzêlíNðóØõzøû¡ýŠå9~ µ ç &:FFI</! "ó#Ï%¹'–)|+\-B/*135ô6ï8ñ:ó<?A9C^EŠG¶IìKNGPbRrT]V.X¼Y[\­\É\S\5[[Y¬V S¡N8IÞB©;ª3+æ!}ù˜‡üùóìùä³Þ^ÙàÔPÑ…ÎÌË[ÊÊ+Ê—ÊTËFÌfͪÎЇÑÓ¶ÔjÖ$ØóÙÉÛ­Ýߘá£ã²åØçüé:ìwîËðóƒõá÷Rú»ü%ÿ‰Ú?6  ÂýÙ)Í ¿ ëRçÀûØõ\ïUèÿàyÙÒÇÊýÃÖ½n¸ð³h°Ø­L¬§«è«é¬˜®Ó°³Œ¶Ñ¹N½âÀ†Ä2ÈÔËwÏÓƒÖïÙHÝà¾ãÞæãéÝì¼ïòMõý÷–ú&ý¢ÿtÄ H }  ¿ÕÞéáßÏ¿«!#x%W'?)+-á.Ì0µ2¡4•6Ž8‰:“<ž>±@ÒBïDGII|K¯MÖOþQTVÑWuYÕZæ[”\Ê\r\x[ÃYI@eB‡D¯FÝHK?MiO’QŸS£UvW%Y‘Z´[x\Æ\Š\²[$ZÉW–TvPmKoEŽ>Ý6x.†%6·D J÷$ï´çáhÛ–Ö©Ò–Ï=ͩ˞Ê&ÊÊjÊ ËçËõÌ.΄ÏôÐ}ÒÔ¾Õz×<ÙÛïÜÚÞÑàÓââäüæ'éRë˜íÛï3òŒôñöZùÆû.þ˜ê;^t H í A?Ñìm]Ž À¦Êý+øåñëØãcÜãÔŠÍ•Æ'Àvºšµ±±Ä®Ï¬Ù«¼«z¬å­î¯o²\µˆ¸ô»}¿ÃÆÆmÊΤÑ(ÕØýÛH߆â¥å¼èµë¡îzñ=ôôö•ù)ü¬þ"…ã(r œ Óé !ë Ö"º$ &~(f*B,,. 0ø1ß3Õ5Æ7Å9Æ;Ò=â?ûADDFnH¢JÎLÿN#QÂ@ÜBE(GWI…K¹MÝOR TVÐWpYÌZÛ[ƒ\¶\X\Z[žYW²S`O&JôCî<5‘,‹#/¶P3þ“õíSæêßiÚÈÕ Ò ÏóÌzË‘Ê/Ê4ÊšÊAË-Ì>Í€Î×ÏRÑÖÒwÔ ÖÜפÙyÛWÝHß>áDãUåoçœéÎëîXð¯ò õp÷ØùBü­þ f ÍÄ š $ kLǺ"â ð @ Æ‚{ü¸öUðké"â¬Ú4ÓöËÅܾV¹·´±P®˜¬Ñ«è«Ï¬Z®ƒ°³¶P¹Á¼RÀñÛÇ@ËÞÎnÒòÕ]Ù¼Üà8ãWægé[ìGïòÚô‹÷*ú·ü=ÿ¨e­ï Fjz‘“Š‚o\!C#'%'î(Ò*²,˜.|0f2Q4D688::9Z@qB—D¹FëHKJMrO•Q¨SžU|WYŽZ©[e\¶\o\˜[Z WoTCP?K7E^>¨6I.V% ’' üÿ;÷ï²ç%ápÛ¨Ö¼ÒªÏZͼ˺Ê<Ê3Ê€Ê#ËùË Í?ΕÏÑŠÒ$ÔÍÕ…×KÙÛúÜäÞÛàÝâíäç-é_ë›íæï5ò“ôõö]ùÆû1þ“ì1\b ; Ù ('«Æ>)U Ì |[ýÙ÷›ñÄêã Ü¡ÔWÍeÆÀ]ºŽµ¬±È®à¬é«Ú«•¬®°–²|µ®¸¼ ¿<ÃçÆ‹Ê*ÎÁÑBÕµØÜ^ßžâ»åÐèÊëµîŽñPô ÷¦ù>ü»þ5˜ó= ² ßþ%2-- !ß"Ñ$ª&–(q*Y,5."02õ3â5Ø7Ô9Õ;á=ñ?B+DNF|H®JÕL O(Q@SAUWÐXGZu[F\¬\…\Ê[[Z#XU"QILvFÂ?98ö/#'ãr Âñø«ð éaâ…Ü×yÓ:ÐÇÍÌèÊRÊ.ÊrÊÿÊÏËÖÌÎSϾÐ=ÒÖÓxÕ0×ïØÃژ܇Þtàyâ‚䛿¿èðê)ípïÁñôzöãøKûµýqÀìýá „ ì ó•Ä]eµ S &4vþýøÔòì÷äÝֻζÇ8Áh»o¶]²H¯1­ ¬Ñ«f¬µ­¤¯²å´¸i»ï¾ŒÂ-ÆÚÉvÍÑ•Ô ØoÛ¿Þûá"å9è6ë'îñÈó‚ö%ù¾û@þ¼ €Ë E s—®ÂÌË˽²Ÿ …"o$P&6(*ù+Ù-Ã/¥1–3€5v7r9q;{=ˆ? AÀCãEH=JmL˜NÀP×RÛTÁV{XZ<[&\š\—\÷[­Z XÀUùQLM¦G#AÀ9¢1å(¼OÜ ’¤úEòŽê­ãŸÝ}Ø;ÔÓÐ:ÎWÌËiÊ4Ê_ÊåÊ£Ë¢ÌÆÍÏvÐõÑ€Ó+ÕÕÖšØcÚ>Ü$Þàâä4æOè‚ê·ìýîKñ¡óöiøÏú>ýÿþH–~ 6 £ Áz»v› Ò Êiÿú ôoí^æÿÞ„×$Ð ÉpÂ}¼W·³Ó¯†­8¬Í«@¬i­>¯’±W´n·Âº>¾ÙÁxÅ&ÉÁÌaÐãÓdׯÚÞZáŠäžç¦ê”ísðAóûõ¤ø>ûÄýBª Y¢ Ø -HZhhi]S= +"$ö%Ö'¹)œ+}-c/H153!57 9;=$?5AXCtE¦GÌIL,NTPoRxTaV(X·Y[û[‹\ž\\úZY_VÄRBNÔHtBC;C3¦*Ž!-¶d^üãóìýäÂÞwÙÕzѯβÌPˈÊ;ÊTÊÈÊ|Ër̈ÍÓÎ-ЩÑ7ÓÓÔ…Ö>Ø ÚÞÛÄݲ߭á´ãÇåæçêHì‡îØð(óŒõì÷Wú¿ü(ÿØ 0 Þ ` …[°‡Ë` J gÇT&û@õ½îÁçmàøØŒÑfʫÛ½F¸ß³e°ì­i¬Ö«¬%­Ý®±Ì³Í¶º½'ÁÄÄnÈÌ®Ï6ÓºÖÚ{ݹàìãçêíæïµòvõøÀúGýÇÿ4•è2 j ž ÂàöûôÞË!²#—%x'_);+$-/í0Ò2Ä4³6¬8ª:°<º>Ð@èBE4GcIK¿MéORTVÎWmYÂZÏ[v\\E\5[ƒYìV‹S1OôIÃC·<á4a,\# 9þ‡õ‹íSæóßrÚÜÕÒ5ÏÍË­ÊEÊMʰÊXË?ÌUÍŽÎìÏ^ÑèÒ„Ô-Öë×­Ù†ÛcÝPßJáMã\å|ç¢é×ëî^ð¶òõu÷ÚùEü¬þ a›Âº ‰  Q/¤“ó­ · þ<+ünöð éÛágÚùÒ¿Ëòĺ¾B¹¬´±X®¦¬æ«¬ë¬z®§°;³;¶r¹æ¼pÀÄ·Ç_ËøÎŒÒÖyÙÓÜàOãnæxévìUï/òêôŸ÷;úÌüNÿ¹$sÂý 1 Yxœ££‘l!T#9%'ý(ã*Á,©.Œ0v2a4S6K8E:Jh@€B£DÈFõH%KMM€O—Q­S£UuWYZ¡[U\¡\X\z[ÞY~W>TPK E$>y6.*%äp æÿ/÷ï¶ç(á~Û¶ÖÐÒ¿ÏrÍ×ËÏÊ[ÊCÊžÊ4ËÌÍRΤÏјÒ3ÔÚÕ×WÙ'ÛÝñÞãàèâõäç5éeë¤íëï=ò–ôúö_ùËû.þ•å.RW - Ä Ž™ñ  70ý’÷Iñ}êEãÜÛfÔ!Í;Æä¿Fºµ¨±Î®ì¬ÿ«ñ«´¬$®3°¶²£µÎ¸:¼¼¿bÃÿÆ­ÊDÎÛÑ]ÕÍØ/Üvß³âÑåæèÞëÊîŸñfô÷»ùMüÐþC¬Q Æ í%9>@;1!ó"Þ$¾&¢(„*g,H..024ò5è7ã9å;î=ÿ?B9DZFˆHµJãLO/QFS?UWËX@Zk[9\—\p\­[:ZXîTüPLHFŽ?8É/ï&¾Må ¬âø£ðéjâŽÜŸ×ŠÓPÐÞÍÌÿÊlÊFʉÊËæËçÌÎaÏÐÐLÒäÓ‡Õ;×ýØÍÚ¥ÜÞ‚à‚â‹ä¦æÆèùê0íwïÇñ ôöåøNû¶ýq¹äóÏ s Ô Õw˜5-ƒ  çé-þ¯øˆòÐë°äGÝÚՀ΋ÇÁO»a¶V²N¯;­¬ì«€¬Ù­Ã¯5² µ/¸Ž»¿©ÂQÆóÉ•Í+Ñ­Ô)ØƒÛØÞâ8åOèKë;îñÜó’ö;ùÍûWþÈ5Þ! V „§ÀÒÜÝÚÐÁ® ™"|$d&C()*,î-Î/º1¢3’5†7€9;Š=–?±AÈCõEHIJvL¢NÆPÜRÞT¿VzXúY4[\Š\\Ü[Z{X—UÌQMsGñ@9p1¸(’*¿ x—ú:òê°ã©ÝØLÔêÐRÎoÌ4Ë‚ÊLÊzÊ÷ʽ˱ÌÜÍψÐÒ‘Ó8ÕàÖ©ØkÚMÜ*Þ!àâ%ä8æ]è†êÂìïSñ§óökøÑú>ýœÿüBx‰r ! ¥Y•LfÛ ‘ ‹¹ÿËù¼ó&íæ¸ÞJ׿ÏàÈGÂd¼G·³Ö¯’­I¬æ«[¬‹­\¯·±z´·æº^¾ûÁ–ÅCÉßÌyÐÔw×âÚ2Þsá›ä¸çµê­í„ðUó öµøOûÙýQ¾k± ë ?Yjzx{ldN :"$&æ'Ì)«+Ž-s/Z1A355"7!9;&=.?HAbCƒE±GØI L6NZPtR{TaV&X°YúZî[z\†\\ÕZïX5V—RNHFB ;3w*a!™FQüÓó ìüäÐÞÙÕˆÑÍÎÆÌlË¢ÊQÊoÊÝʔ˃̡ÍßÎCжÑGÓâÔ‘ÖNØÚîÛÌݾ߸á¼ãÒåìçêMì’îÚð2óŽõò÷YúÁü&ÿ‚Ð# Ï D s5Ž]—.  (} Ùúïôpîtç%à¶ØPÑ3Ê‚Ã~½1¸×³e°ô­z¬í«9¬G­ý®:±ï³ô¶>º³½FÁåÄŒÈ0ÌÆÏVÓÏÖ9ÚÝÔàäç$êíýïÈò‰õ2øÒúYýÙÿF§û@ } ¯ ÓòôÕ!Ê#¡%'k)P+0-/ú0å2Ò4Ã6¼8¹:½<Ë>Þ@÷BE@GmIKÆMðO RTVÊWiY¼ZÂ[c\Œ\%\[WYËVYSOÀI‘C„<®40,0#âp þzõ‡íTæüß~ÚîÕ1ÒMÏ$ͬËÁÊcÊaÊÉÊmËTÌgͤÎúÏpÑöÒ“Ô:Öù×·Ù”ÛjÝ^ßRáWãhå‚ç¬éÝëîhð¹òõw÷ßùDü¯þ\–·° u þ 5}kÂx | ¼>íãûö·ïÔè’á&Ú¼ÒËÅÄž¾,¹Ÿ´±\®¹¬ú« ¬ ­ž®Ç°b³[¶˜¹½“À2Ä×ÇzËÏ¡Ò(ÖŒÙïÜ1àdã†æŒéŠìjï@òõ°÷Núàü\ÿÑ1‡Ó D iˆ¡«µµ«£‘|!f#K%*')ï*Ô,¹.š0‡2r4a6\8S:[u@B­DØFüH2KXM…O¡Q°S¢UxWY}Z’[J\ˆ\E\X[¼YXWTîOÖJÓD÷=?6é-ú$»MîÑÿ ÷ï±ç3á†ÛÉÖäÒÔÏŠÍïËëÊpÊaʰÊMË%Ì2ÍdθÏ%ѬÒ>ÔëÕ×cÙ3ÛÝûÞîàóâûäç:éqë©íôïAòŸôüöfùËû2þ’ä%LK  ° û çnnêº æ L ñÎâüD÷ùð.êûâ”Û+ÔéÌÆÃ¿+ºvµ¥±Ó®ú¬¬ ¬Ó¬G®T°Ü²Äµõ¸\¼á¿Ã!ÇÉÊcÎöÑxÕèØFÜ‘ßÇâéåûèòëâî¯ñ~ô(÷Ðù`üâþX¹\¦ Ñ :HOSID0!#é$Ô&¯(˜*s,^.<0)246ø7ô9ô;þ=@'BBDmFHÅJëLO6QJSBUWÇX;Z][,\„\V\”[ZÚWÆTÉPåKFY?Ó7“/Å&+ —Îøœðénâ—Ü­×ÓdÐøÍ4ÌË~ÊeÊœÊ.ËùËýÌ&ÎwÏÝÐ^ÒñÓ•ÕJ× ÙÙڰܛދàŒâ•䮿Ïèë7íïÊñ(ôƒöêøRû·ým´Ýé¿ c ¹ ¿Rtý G Ô  ¡àý_ø9òëcäÝ’ÕRÎTÇóÀ4»O¶V²O¯E­5¬ÿ«¢¬ö­ç¯Z²0µS¸²»2¿ÍÂoÆʳÍEÑÌÔ?ØŸÛðÞ(âQåcèaëPî&ñóó¥öMùáûeþáC¤î4 f ™²ÚÛóéïßÒÁ ¤"“$p&W(6*,ü-á/É1±3¤5•79’;–=©?»AÛCýE)HQJ‚L©NÎPâRàTÃVuXôY*[\x\h\Á[jZXXjU£QåLFG·@[9;1‰(cž _…ú.òê®ã¸Ý–Ø_ÔÿÐgΈÌLËÊcÊ‘ÊËÒËÇÌðÍ1Ï™ÐÒ ÓFÕðÖ³Ø|ÚUÜ:Þ(à&â/äDæcè‘êÆì ïUñ±ó örøÕú>ýžÿø>pe  y ‰9o 4¢ T GoÕþwùtóÑìÌåmÞ ×¯Ï«È%ÂE¼6· ³Ö¯ž­[¬þ«x¬ª­€¯Ú± ´³· »‚¾»Å]ÉÍ”ÐÔ•×øÚMÞ‰á³äÍçÍê¾íœðgó!öËø`ûíýbÑ,~ ü *Oj}ˆŒ‰u^ K"1$&ú'Ø)½+Ÿ-‚/l1R3D52709);5=??RAtCE¿GâILë@C)EKG|I£KÓM÷ORTVÑW^YµZ¶[T\u\\üZ8YŸV0SÒNIZCQÍÀËßÊvÊ~ÊÞʃËjÌz͵ÎÐ}Ñ ÓœÔNÖØÊÙšÛ{Ýfß_á`ãqåç³éèë%îmðÁòõ|÷áùJü©þ T’­£ f ê õZ@“B ? |ö¤•ûÏõfï‰èDáæÙ}ÒZËžÄy¾¹•´þ°i®Ä¬¬:¬)­¾®ì°ƒ³‚¶¼¹'½¸ÀOÄúǘË4Ï¿ÒAÖ§ÙÝHà|ãœæ¢éŸìïTòõÂ÷dúïürÿßF—å V yž­ÃÂǾ³¢Ž!w#Y%@')+ä,É.¬0˜2€4t6j8d:k†@›B¿DáF I9KdMO¨Q´S¦UtWYsZˆ[9\v\)\=[—Y2WäS¿O£J DÀ= 6¶-É$“$Õ¶ÿ÷ïµç3á–ÛÔÖùÒéÏ£ÍÌË…Ê{ÊÇÊcË<ÌCÍyÎÉÏ6ѼÒOÔöÕ¯×jÙDÛÝßüàùâ åçGéwë³íúïJò¢ô÷dùÑû0þåE>  â ËII·‹ §  «ƒ˜üñö­ðàé¯âRÛéÓ´ÌåÅœ¿ºbµ§±Ö® ­%¬(¬î¬k®v°³çµ¹|¼ÀŸÃEÇåÊ‚ÎÒ’ÕÙ]ܬßÚâæ é ìñîÊñŒô@÷ÞùvüòþmÊ*o¶ â /K[_f\SC/!#ý$á&Ã(¥*‡,k.O092 468:< >@1BUDtF¢HÌJ÷L!O>QOSFUWÅX4ZU[\p\@\u[õY´W—TžP¯KÝE%?›7`/•&a¡ ¼ø“ðépâ£Ü¹×¯Ó{Ð ÎPÌ2ËœÊyʶÊCËÌÍ<Î…ÏòÐkÒÔ£ÕW×Ùåڽܦޕà™âäºæ×èëBí†ïÓñ,ôŠöìøXûµýl¬ÙÚ³ P ¢ Ÿ4JÜÆ  ” [Z’ýøèñ6ëä¿ÜUÕÎ-ÇÊÀ»A¶N²T¯U­C¬¬»¬® °}²Vµu¸×»S¿îÂŽÆ3ÊÏÍcÑåÔZØ·Û ß>âiåuè{ë_î@ñô¹öaùòû{þðX³C y ©ÈãõûúõàÒ ¸" $„&f(H*+, .ò/Ù1Ã3²5§7ž9£;¤=·?ÌAæC F2H^JL±NÕPçRãTÂVsXíY![ù[f\Q\£[MZ.XCUoQ·LGƒ@#91V(6ßy Hnú%òŠê²ãÀÝ¡ØuÔрΠÌf˳ÊʨÊ$ËêËÙÌÎEÏ©Ð#Ò³ÓPÕ׺،Ú`ÜEÞ4à1â9äMænè—êÒìï^ñ·ó öyøÕúBýÿ÷9lqY û d lDøý l  '†þ*ùó‡ìwå.Þ½Ö|ÏvÈÂ'¼$·³Ø¯ª­j¬¬”¬Ì­£¯ÿ±Á´Ý·*»©¾9ÂÝÅ}ÉͳÐ6Ô³×ÛeÞ£áÉäççÞêÚí¬ðó4öÝøvûüýyàB× <cx”•Ÿ›‡q Z"D$%& (ì)Ê+³-’/|1d3Q5F7=9>;?=S?_ACžEÈGòILENkP€RThVX¨YæZÔ[T\_\Ë[›Z¢XãUü@C4E]GƒI±KÚMÿORTVËW[Y®Z¦[G\\\õ[ÝZYxVS¥NXI)C˜@¨BÌDíFIDKlM•O­Q·S«UqWYnZz[+\`\\[vY WºS‘OmJsD„=á5}-¤$c³£ÿ÷þîµç:á¡ÛäÖ ÓÐ¸Í ÌËÊ”ÊÝÊzËOÌZ͉ÎÝÏDÑÌÒ\ÔÖ¸×{ÙMÛ%Ýßáãå(çPéëºíÿïQò§ô÷kùÏû4þŽß:3 ÿ † Ì ¬' ‰U n Ïd=Iü¦ö^ð’éjâ ۭӂ̶ŀ¿ºXµ¡±Þ®­;¬B¬ ­Œ®—°&³ ¶=¹¡¼&ÀÀÃcÇËžÎ-Ò­ÕÙwÜÂßóâæ#é ìïÜñ¡ôP÷öùƒü ÿzà8… ú !EZkpuleSA!&#%ð&×(³*™,|._0I224$68:<>-@?BdDF°HÓJM&OGQQSGUW¾X0ZG[\Z\)\W[ÔYWoTkP‚K§Eñ>i7./e&:݇ f¯ø‰ðéwâ¬ÜË×ÀÓ’Ð$ÎiÌK˵ʑÊÎÊXË'Ì"ÍQΖÏÑÒ Ô·Õ^×'ÙíÚËÜ­Þ¤àâ¬ä¿æãèëJíŒïÚñ3ôŒöóøVû·ýf¨ÏÎ¥ ; ‹ ƒ'¨™ Ð X IýÁ÷ñèêÌã{ÜÕßÍÇ¥À»3¶H²\¯]­[¬3¬Ü¬8®-°¢²wµ¸õ»y¿ ïÆNÊïÍzÑÕmØÕÛßWâ}åŒèŽëvîSñôÍösùüþþnÂU ‹ º×÷ øÜ Î"®$•&v(Y*:,.0è1Ó3Ã5µ7°9®;·=Ã?ÙAöCFBHgJ—L¸NßPçRêT½VtXãY[é[T\:\ˆ[*Z XUBQ‡LÝFO@ò8Õ0(( ¹] /_úò…ê¹ãÆÝ´Ø„Ô(іθÌËÊʙʼÊ=ËýËîÌÎUÏ»Ð2ÒÀÓ_Õ×ËØ–ÚjÜRÞ;à>â@äUæxèêÛìïdñ¼óö{øØúCý™ÿ÷1gdL é J Võ$ÇÐ 2 Ø Áá<þÞøÒò:ì2åâ݈Ö;ÏRÈÓÁ¼·³Ú¯µ­}¬0¬¯¬ì­Ä¯ ²è´û·R»Æ¾\ÂùÅÉ;ÍÎÐRÔÈ×,Û}Þ¸áßäùç÷êêíÄðóKöìøŒûþ‰ôO£å  MqŽž©±§§„ l"Q$9&(ý)Ü+À-¤/‹1t3c5S7O9K;Q=^?pAŒC®EÒGýI)LNNsP„R„TeVX¢YÜZÉ[A\H\´[yZ‚XµUR~M H¢As:t2è)Ù 3÷ü±óüëåëÞ£ÙOÕÅÑÏÍ´ËìʜʴÊ$ËÓËÂÌÛÍÏxÐåÑwÓ Õ¼ÖsØ;ÚÜðÝÞßÔáÞãéå è2êgì¨îïðCóžõþ÷cúÅü'ÿzÅñé ™ Ýà‹ P b§*ÿîùô†íæOßï×£ÐÉÃ"½ü·»³f°®«¬3¬Œ¬¤­b¯¦±X´c·¦º¾¨ÁHÅéȈÌЦÓׄÚÛÝáGä_çdêZí5ð óÀõnøû’ý|Þ/u ² á %8GJK?5" "ó#Û%½'ž)‚+a-G/+135õ6ê8é:ë<ù>A"CDEdG“IºKãMPR TVÉWVY¤Z[1\L\Ø[¿ZïXQVÓRvN$IöBä;4›+¦"hÇÎýPõwíRæà¡ÚÖmÒÏpÍîËˢʲÊË´Ë̤ÍÚÎ0РÑ&Ó¾ÔeÖØàÙ³Û‘Ý{ßuátã„åŸçÄéùë2î~ðËò'õ…÷èùKü¯þS€žˆ F ¿ ë ¶ì2Ù Ã þeøú0õÍîêçºàWÙ ÒïÊKÄ:¾î¸´ý°w®â¬@¬m¬h­¯0±Ð³È¶ºp½øÀ–Ä6ÈÕËnÏ÷ÒuÖÞÙ4Ý{à§ãÊæÎéÉì§ï€ò7õí÷†úý•ÿg¾ D v ž½ÒãæçáÕñ!•#}%`'A)&+-ì.Ì0¸2£4’6Š8„:‰<Ž>¥@¶BÛDúF$IPKtMžO²Q¼S«UqW YeZo[\M\÷[ÿZVYÝV“S\O?J7DW=£5R-m$=à–Œÿööõîµç?áªÛõÖÓÐÕÍ1Ì;˶ʪÊ÷ÊËfÌmÍœÎíÏXÑØÒnÔÖÇ׈ÙVÛ4Ýßáãå4çZé„ëÄíðVò°ô ÷oùÒû3þÚ2' í w ® “ÿùZ 3 ‹"îþûVö ðHéâÊÚmÓN̈Å`¿ç¹Mµ ±ã®%­Q¬Y¬/­©®¾°J³-¶e¹Á¼KÀàÃƒÇ Ë¾ÎHÒÉÕ5Ù’ÜÖßã*æ>é2ìïðñ´ôg÷ú™üÿïM“× 4Uk}„…}ueQ!:#%'á(Ê*¥,Œ.p0Y2A456%8$:"<+>;@NBoDF¸HãJ M2OIQYSIUW¾X"ZB[ù[O\ \>[®YiWAT?PNKtE¾>37ý.6&ºh OŸøðézâ¸ÜØ×ÔÓ§Ð;ÎÌdËÍʨÊçÊnË<Ì7Í`έÏÑÒÔ¿Õs×/ÙýÚÔܺޭà©âµäÈæìèëRí“ïáñ8ô’ööøWûºýc¦ÃÆ“ ) u eîý{c ˜  ÕÃþür÷Mñ›êã6ÜÖÔ©ÍÐÆ…Àëº!¶H²]¯m­n¬K¬û¬X®P°Æ²›µÃ¸¼œ¿.ÃÏÆoÊ Î›ÑÕØéÛ8ßoâ“å¤è¢ëîdñ.ôßöˆùü¡þ~Ö&f Éì$ò Ü"¿$¨&…(k*J,..0÷1æ3Ð5È7¾9¾;È=Ò?èAD#FNHtJžLÅNáPòRçTÃVlXâY [Þ[?\#\j[ ZàWòTQXL¦F@¸8¥0õ'à‘< Pú ò…êºãÐÝÂØ•Ô<Ñ­ÎÑÌ•ËçÊ¬ÊØÊRËÌÍ'ÎhÏÎÐ@ÒÓÓlÕ×ÙØ¡ÚzÜXÞMàCâLäcæzè¯êÝì!ïnñ½óözøàúAýœÿñ1Xa6 Ý / :Ôüœ› ø š z™îýøƒòêëåäÝCÖÏȱÁö»·÷²à¯½­“¬F¬Í¬ ®ä¯I² µ#¸t»è¾€ÂÆ»ÉYÍéÐpÔâ×FÛ”ÞÑáøäèëþíØð¤ó\öùœû"þœc´ö 1 ^ƒž²¹Âº³¦‘ €"a$K&((*í+Ñ-¶/š1†3q5e7]9[;a=k?A˜C¼EÞGJ3LXNxP‹R…TeVX™YÔZ¹[0\2\–[XZ]X‹UåQPMÑGtA8:D2´)® hÞü§óöëåïÞ¶Ù\ÕÝÑ%Ï)ÍÎËË´ÊÎÊ8ËìËÔÌñÍ(ÏˆÐøÑƒÓÕÈÖØIÚÜüÝçßâáäã÷åè<êoì­îùðFó¦õøeúÇü$ÿz½ìøÛ † ð µû¬Õ N  `Ýþ¡ù´ó6íFæß­×jÐjÉëÂ½í·±³k°®½¬K¬¨¬Æ­„¯É±´†·Ëº?¾ËÁhŠɥÌ;ÐÁÓ9ןÚïÝ4áZäwçyêmíMðóÖõøû¦ý#ð?Š Á õ 8HX\ZRE4 "$é%Í'¯)‘+s-X/;1(357ý8ö:ý<?A0COEtGœIÅKíM P$R"TVÈWOYœZ[ \7\»[£ZÇX*V¥RFNôHÁB¯;á3j+|">ꩾýBõsíWæà²Ú,Ö‡Ò¢ÏˆÍ Ì*Ë¿ÊÈÊ ËÉ˥̸ÍêÎCЮÑ7ÓÊÔtÖ*Øîٿ݆ۜß|áãå¦çÎéÿë;îðÓò*õŠ÷ëùKü¯þK|| 4 ¨ Ñ —ì  Š ¶"Äÿ­úÞôîçqàÙÌÑÁÊ Ä¾Ù¸x´ü°‚®ò¬T¬¬‚­)¯P±ö³ê¶)º‘½ÁµÄVÈñËŒÏÓÖ÷ÙNÝ‘àÀãÞææéÛì¿ïòPõý÷œú&ý«ÿ}Í U ‡ ®Ïãôöøòä×¾!©#Œ%q'Q)6+-ú.ß0Æ2µ4¡6š8•:—< >°@ÆBçDG2IWK‚M¢O¼Q½S«UqWY`Zb[ \9\Û[ãZ1YµVgS-O JD=u5-F$ÁywÿéöïîµçGá·Û×4Ó+ÐêÍQÌOËÔÊ¿ÊË¡ËÌ}ͳÎýÏjÑèÒ}Ô ÖÕוÙbÛ?Ý%ßáã#å=çbé‹ëÏí ð]òµô ÷tùÒû4þ‹Õ$ Û a – rÞÍ*é ø IÜ¢²ûöÁïöèÕá‚Ú3ÓÌaÅ<¿Ñ¹Cµš±î®1­g¬u¬K­Î®ß°m³U¶…¹é¼jÀÄ£Ç?ËÜÎbÒæÕLÙ«Üïß$ãEæOéJì1ïòÆô|÷ú­ü,ÿŸ\¦è  Ff~Œ—”‡sf!F#3%'÷(×*¸,ž.€0h2S4C6783:2<;>H@^B|DœFÄHîJMEŠ>þ6É. &ã•L 6“øwðéâÂÜé×éÓ»ÐUΘÌ}ËéÊÀÊýʈËMÌOÍsξÏ!ÑžÒ-ÔÎÕ~×>ÙÛãÜÄÞ¶à¶â»äÕæðè$ëTížïæñ<ô˜öøøZû¹ý]Ÿ»·†  \ HËÒO+ _ Ö‹~¬ü'÷ýðLê9ãîÛ›ÔrͦÆ`ÀÖº¶D²b¯{­‚¬e¬­v®w°æ²Ãµã¸=¼¾¿NÃðÆÊ&θÑ4ÕªØÜSß‚â¬åºè¶ë¤îwñBôóö˜ù-ü°þ'ç9u ² Ùý$410%!ì"Ñ$¸&•(}*Z,?.#0 2ó3ä5Ó7Ò9Ì;Ö=â?õAD2FWHJªLÉNíPðRîT¼VmXÖY[Ì[-\ \N[èY½WÄTæP$LtFæ?‰8n0Ë'³n ;ú ò~êÃãÙÝÓØ§ÔTÑÄÎë̯ËËÅÊïÊlË$ÌÍ8Î|ÏÞÐPÒâÓzÕ*×äØ¯Ú€ÜhÞRàOâXäeæ‰è±êæì(ïqñÅó ö~øáú@ýÿë,OT) Å  ´Ómh Á W 9N¤ýAø4òžëšäYÝÖÒÎìÇ’ÁØ»ö¶ñ²ã¯Ë­¤¬_¬í¬*® °i²0µF¸•»¿œÂ<ÆÛÉuÍÑŒÔú×bÛ¨Þëá å%è#ëîíð¸ómöù©û9þ©rÇ B q“°ÂÊÔÈɲ¦ "u$X&<(*ÿ+â-Ä/­1“3†5r7p9h;r=z?A§CÅEîGJ;LbN}P‘RˆTfVX—YÇZ¬[ \\‚[1Z=X_U¹QM G=A:2…)€ Dï Æðûóñë å÷ÞÄÙoÕñÑ=ÏAÍèËËÐÊäÊPËÌëÌÎ?ϕРҒÓ+ÕÔÖØSÚ(ÜÞòßìáïãþåèCêxì¶îúðTó£õ øcúÊü#ÿw»áðÌ u Ú ê –Ñ‚£  Ø Ø’þPùgóåìüå»Þo×,Ð=ÉÀÂè¼Ú·©³m°$®Ð¬b¬Ä¬å­§¯ì±¤´ª·îºc¾íÁ‰Å)ÉÃÌWÐÞÓR×¸Ú ÞHáuä‹ç‘êícð,óêõ“ø/û¸ý6ŸS™ Ö ,H\gmlcXD 1"$ý%Þ'¾)¦+~-m/J183#57 9; =?&A>C^EG¨IÎKøMP)R'TVÅWMYZ„[\\¤[€Z£XVwRN¿H‹Bz;­36+P"Ä‘¤ý8õlíXæà¿Ú=֙һϞÍ%ÌCËØÊàÊ8Ëß˺ÌÌÍýÎVнÑHÓÙÔ„Ö6ØûÙÊ۩ݒ߇áŠã”å´çÔé ìAî‹ð×ò1õ÷íùQü«þþJqŒh ' ¸ vÇ˜Ï i N sÚzÿ\ú•ô+îVç$àר’ÑÊ÷þĸn´ý°‰®­j¬¨¬£­I¯w±´·Kº·½=ÁÖÄtȨ̀Ï/Ó©ÖÚfÝ«à×ãòæþéïìÕï¢òeõø±ú9ý¼ÿ(à+ g ™ Áàô ÷çÏ!»#%'d)D+(- /ï0×2Ã4´6¨8¥:¥<®>Á@ÔBòDG9IeK‰MªOÀQÃS¬UoWYTZW[ø[#\Ã[ÂZ YŽV:SûNÜIÎCìR@rB‚D®FËHúJMBOTQaSKUW³XZ'[Þ[!\Ý[ýZnYWëSàOéJES>Í6—.Ú%ºs* &€øoðé€âÓÜö×ûÓÔÐhζ̔ËËÛÊËžËeÌ`͈ÎÎÏ3ѬÒ=ÔÛÕŒ×HÙÛëÜÐÞÂà¼âÉäÚæüè)ë^í¤ïìñAôöúø\ûºý\˜±¬t A ,¦¬ú " –H2cü×ö®ðêïâªÛ^Ô<ÍyÆCÀ¹º ¶<²k¯‰­–¬€¬6­œ®•°³âµ ¹a¼Þ¿pÃÇ©ÊGÎÑÑOÕÄØÜjß›âÁåÐèËë¸îŒñTô÷ªùAüÁþ:ŸûHˆ Á ê%9AE>8$!ú"ä$Æ&¨(Œ*l,N.5024ï5ê7Ú9ã;ß=ò?BD?FbH‹J°LÕNîPøRíT¾VgXÑY÷Z¿[\ô[0[ÇY—W™T¸PñKBF±?S8@0˜'D æ.úò~êÇãâÝ䨷ÔnÑØÎÍËËËäÊË„Ë<Ì/ÍNÎŒÏïÐaÒðÓ‰Õ7×ñØ»ÚÜsÞ^àYâ_äsæŽè¼êîì.ïzñÊó$ö‚øãúAýÿç'FI ³  ý “©@6 ƒ  ïTýõ÷àñSëLäÝÃÕ˜ÎÀÇjÁ»â¶î²æ¯×­¸¬x¬­O®*°²Tµh¸½».¿ÃÂXÆüÉ’Í#ѧÔØyÛÅÞýá)å7è9ë)îÿðÍóƒö(ùÃûEþÂ)ˆÖ Q „¢ÃÑÞáÞÔɳ  "„$h&N(-*,ò-Ô/¾1¤3“5…7{9|;|=Œ?šA·CÒEúGJGLhN†P‘RTdVXŽY¾Zž[ \\_[ZX;U‰QíLoGAÒ9Ý1W)U Ï ¯Ýû•óíëåýÞ×Ù~Õ ÒTÏYÍÌ7ËçÊþÊeËÌýÌÎMÏ©ÐÒ¡Ó7ÕæÖ•ØfÚ.ÜÞüßõáùã æ#èLê~ì¼îñUóªõ øfúÌü ÿu²Ûä» d À Ð uªVn Þ ˜ –ÑFþùóšì­åyÞ-×öÏ É›Âμɷ¡³q°/®â¬{¬Þ¬ ®Ç¯²Ç´Í·»…¾ ¬ÅCÉæÌmÐýÓj×ÓÚ Þbáˆä¢ç¦ê“íyð>óÿõ¦øAûËýG²d¬ å =WpvyvfV A"'$ &ñ'Î)µ+’-z/\1H325$79;=#?5AJCkE‹G²IÚKýMP-R&T V¿WHY†Zu[ý[ \†[dZ~XÖUORáM’HTBI;y3 +!"ð£x’ý/õeí^æ$àÎÚOÖ¬ÒÕÏ´ÍAÌZËôÊõÊRËòËÒÌÞÍÏgÐÏÑUÓéÔÖDØÚÔÛ¶Ýšß”áã¤åµçáé ìLîŽðßò5õ÷óùLü¯þúEk}a  € — X£jŸ 3 8Ž1ÿúBôåíçâß‘Ø[ÑYÊÔÃß½·¸`´±®­}¬Ç¬Á­l¯™±;´6·oºÙ½^ÁöÄ“È1ÌÁÏNÓ¿Ö.Ú{ÝÃàìã çê íäï¼òrõ'ø¿úOýÍÿ9 ï> v « Ñò òæ!Æ#°%’'t)U+8-/1å2Ô4Ã6¸8³:·<º>Ð@áBÿD#GCIoK’M³OÄQÈS©UoWûXMZJ[é[ \¬[¡ZíXdVSËNªIC¶< 5¹,è#Á{>SÿÈöéî²çWáÌÛ*×YÓ[Ð΄ÌËËõÊ:ËÔˤ̩ÍÖÎ ÐŒÑÓšÔ=Öì×°ÙzÛVÝ:ß/á+ã:åNçréëÚíðkò¼ô÷wùØû2þˆÍÿÿ¼ 5 c 4”xÌ { ‚ ÄPûlõ"ï_èEáúÙ½Ò®ËÅü¾ª¹(µ›±ù®S­¬¬¬†­¯&±³³ ¶Ë¹0½®ÀDÄâÇ{ËÏ›ÒÖ‚ÙÛÜ àQãræzévìWï1òêô¥÷=úÑüRÿÁ+~Ì > hˆ ¯¶º°©•„!k#R%5')ø*Ü,º.¥0‡2u4c6W8Q:Pc@~B’D·FÚHK'MGO\QcSMUW®X Z[Ì[ \Ä[ßZJYñVÁS¯O¹JØD!>—6g.©%’N qøkðé‹âÜÜØÔãЇÎÊ̱ËËôÊ+˵Ë{ÌtÍœÎÞÏFÑ»ÒLÔêÕ˜×VÙ!ÛöÜÛÞËàÈâÐääæé/ëií¦ïõñDô¢öüø`û¹ýY¬žd ì ) ‡~ó Á ê Séüö\ðµé¤âfÛÔ ÍJÆ"À¡ºþµ;²p¯•­ª¬›¬T­½®¸°1³ ¶,¹†¼À“Ã,ÇÎÊ_ÎñÑiÕÝØ3܂߱âÚåäèãëÊî£ñgô÷ÀùQü×þK± Y Ï =FVSRH5(! #÷$Ô&¼(™*,].F0)246ô7ï9î;ð=@B-DLFmH—J¹LÞNõPþRìTÂV_XÎYéZ±[\Ú[[£YsWlT‹P¾KF|?80f'câ Íúõñ}êÈãîÝîØÏÔ{ÑøÎÍçË.ËúÊ˘ËRÌEÍ_ΡÏÿÐrÒþÓ˜ÕD×ÿØÅÚœÜ{Þiàdâhä|æ˜èÂêøì5ï€ñÏó)ö†øåúAý›ÿå!<@ ¡ ì à p… J Û¯½ ý§÷”ñëäÌÜ…ÕaΓÇHÁ§»Ö¶å²î¯á­Î¬¬(­k®P°±²wµ¸Ý»S¿áÂ{ÆʲÍ@ѾÔ4ØÛßÞâ?åLèQë:îñÞó—ö;ùÕûYþÓ;˜é+ e “¶ÑåíòðåÙÅ ­"˜$y&](=*!,.é/É1·3¡5•7‹9Š;Œ=˜?«AÁCâEH'JQLqNP—RTcVX…Y¶Z[÷[î[@[ùYêWU[Q¾L9GØ@™9±1!)- õ± •Ìû‰óëëåßãÙÕ ÒgÏsÍÌPËËË}Ë.ÌÍ)ÎbϸÐ+Ò°ÓHÕðÖ¦ØmÚ>ÜÞàþáäæ-èSê‡ìÂî ñYó²õ ølúÈü#ÿp¯ÒØ® R ¨ µ Sƒ-9 © Y Tˆýý¶øËòMìeå2ÞíÖ¿ÏÛÈz¯¼º·š³r°:®ó¬’¬ý¬'®é¯7²ç´õ·4»ª¾,ÂÍÅ`ÉÍŽÐÔ‡×éÚ:Þyážäºç¸ê­í‰ðTóö¹øSûÞýWÅ&rÀ õ 'Nh€Š‚ze Q"9$&ÿ'â)Á+¨-…/p1V3A567*9$;-=-?FAVCxE—G½IäKN$P0R,T V¿W@Y~Zh[ë[ó[o[>Z`XªU#R²M_H B;C3Ü*ó!Ê_ý"õ`í`æ-àÛÚ^ÖÃÒçÏÐÍWÌtË ËËfË ÌåÌòÍ$ÏwÐàÑfÓôÔ¡ÖNØÚá۾ݧßáœãªåÀçééìPî—ðãò:õ–÷òùRüªþü:jnU û j } 9|@m ú Ò ñJçþÀùøó’íºæœßOØ!Ñ)ʨÃŽ¡¸Y´þ°œ®$­™¬Þ¬â­¯¼±b´W·”ºû½ÁųÈNÌÞÏhÓÛÖFÚ–ÝÙàä"ç%êíøïÑò„õ<øÒú`ýáÿJ³M ‹ ¹ èþ"-)& ô!Ù#¿%¥'‚)i+F-+/1õ2å4Ò6É8Á:È<È>Þ@ðB E.GRIxK›M»OÉQÌS¬UlWöXDZ>[Ö[ú[Œ[ˆZÃXAVßRŸNuIiC<Ø4Š,¸#šR'8ÿ¿öÝî´çZáÚÛ8×lÓqÐ0Μ̛ËË ËVËç˼̼ÍèÎ4ЛÑÓ«ÔIÖý×¼Ù„ÛdÝDß:á7ã@åYçyé¨ëßí$ðnòÃô÷xùÛû0þ‡Èû óª " H pNœ F D ‡ÇÿÈúõÓîèøà½Ù}Ò|ËåÄݾ“¹!µ—±¯c­£¬Ë¬¢­7¯F±Ý³À¶ñ¹S½ÎÀhÄþÇžË0Ï·Ò6Ö™ÙõÜ7àiã‡æ“é‡ìpï@òõ´÷QúæübÿÖ<ß O {˜²ÀÉÆÇ´¬‘!~#`%G'&) +ê,Í.³0˜2…4r6g8a:`u@†B¦DÀFêHK4MMOdQfSMUW©XZ[½[ù[ª[ÃZ'YÊV•S‚O…J§Dê=d65.{%i)ñ ÷bøcðé‘âãÜØ ÔÑ™ÎåÌÉË2Ë ËDËËË̋ͬÎôÏSÑÏÒWÔûÕ¤×dÙ-ÛÝæÞØàÐâÛäîæ é8ërí«ïýñKô£öù[û¿ý W‹Ÿ–Q Ú  î aYÁ Ž ¯ ¿Ìû9öðfé[â"ÛäÓÐÌ%Æû¿ºíµ;²s¯¦­½¬µ¬s­Ú®à°Q³2¶M¹ª¼!À¶ÃLÇëÊ}Î ÒˆÕòØQÜ•ßÍâîåúèùëÞî¸ñyô1÷Ðùgüçþ\Æm¬ ã 1KYgccWG6!#%ê&Ç(¯*Š,r.T082'468þ9û;> @B:DXF{HŸJÆLâNüPSïTÀV\XÅYàZ [ò[Ä[öZ‡YHWGTXP“KØEL?ë7Û/;'7üà µúîñyêÐãöÝÿØàÔ“Ñ Ï6ÍùËMËË7Ë®ËiÌVÍvήÏÑ€ÒÔ¦ÕS× ÙÓڥ܈Þsànâqä…æ¡èÉêí9ïˆñÓó/öˆøæúDý•ÿæ9.û Œ Ò Å L]ä Î  ›mrÂüU÷Kñ´ê½ã‡ÜGÕ-ÎcÇ&Á»Æ¶ä²ï¯ñ­Ý¬­¬@­®q°Ö²›µ³¸þ»w¿ÛÆ7ÊÏÍYÑÝÔJØ©ÛöÞ,âSåfècëQî)ñôó¨öQùåûmþãO©û> u ¥ÇäõþÿøéÕ Á"¥$Œ&l(P*/,.õ/Ý1Ã3µ5¡79˜;œ=¨?·AÑCëEH1J\LxN“PœRTfV X„Y¨Z[è[Ñ[*[ÕYÇWæT1Q‡L G@l9y1õ(ÿÒ }»û|óëëåßîÙ£Õ3ÒÏÍ0ÌkËË,Ë–ËAÌ(Í=ÎrÏÌÐ8ÒÁÓUÕþÖ´ØxÚJÜ(Þà â äæ4è]êŽìÊîñ_óµõøqúÆü%ÿj¬ÉÏ A ™ 2]þ m  C¯ýlø{òìåêݱքϯÈS”¼«·’³x°C®­ª¬­G® °X²µ¸Z»È¾QÂêŃÉͬÐ.Ô¡×ÛPÞ‘á·äÌçÓê½í ðgó'öÉøkûìýmÖ7†Ò  <\|Žœžž˜…} Z"M$+&(ó)Ò+µ-™/}1f3S5B7:93;:=>?SAdC…E£GÈIïK N.P0R5TVÁW7YuZ[[×[ß[P[#Z7X†UóQ„M*HïAá:3©*É!¡bCoýõ_í_æ7àæÚrÖÔÒÐäÍrÌŒË#Ë'ËËÌúÌÎ8Ï…ÐõÑoÓ ÕªÖ^Ø ÚìÛÌݯߨá¤ãµåÉçðéìWîžðèò@õ—÷ôùTü¨þû6_gD ì Q f Y?  – ¯›þwù¨óGísæPߨäÐûɅ体¸N´±£®5­°¬ø¬®©¯ç±}´€·´º¾¤Á5ÅÒÈlÌûσÓõÖ^Ú¯Ýîàä3ç>ê-íðÞòŸõIøæúsýðÿaÁ\ Ê ø+5<<5( "í#Î%µ'“)x+V-=/13ö4ß6Ü8Ï:Ô<Û>é@ýBE5GaI~K§M¾OÒQËS°UgWóX:Z1[Å[ä[r[jZŸXV°RtN?I;CK<©4Z,Š#v1 'ÿ°öÜîµçbáéÛEׄӅÐIζ̱Ë8Ë!ËkËÌÌÌÕÍöÎHШÑ)Ó¶ÔZÖØÉÙ‘ÛnÝQßAáBãHåcçé±ëæí)ðtòÈô÷ùÕû5þ‚Äóýê•  . õ N"m  FÀÿ{úÑô‡îÉç³à{ÙDÒK˼ľ¾¹µ•±¯m­¿¬ß¬Å­S¯l±ü³æ¶ºs½ôÀƒÄ!È·ËNÏÓÒMÖµÙ ÝMàƒã™æªéœì…ïSòõÆ÷eúöüuÿéK¤í. a ‰¬ÀÔ×ÚÓʹ£!#o%Y'7)+þ,Ù.Å0§2•4ƒ6s8s:k€@—B°DÏFòHK:MVOiQhSQUWªXûY[­[ä[‘[¥ZY¢VkSTOTJsD·=36.P%> Õ áVøZðé–âïÜ(Ø5ÔѱÎÿÌÞËMË!Ë]ËàˤÌÍÁÎÐiÑØÒmÔÖµ×oÙ7ÛÝïÞâàÛâääõæéBëtí¸ïþñPô«öùaû»ý T‚—†B Å õ Ñ >.• V v Ò{VûëõÊïéâÝÚ§Ó Ì÷ÅÜ¿yºàµ9²y¯³­Ó¬Í¬­ü®þ°y³Q¶u¹É¼FÀÒÃpÇËŸÎ$Ò¢ÕÙgÜ­ßãâæé ìóîËñŽôC÷åùvüüþn×/» ÷ EXoo{ph[C!1#%ú&Ú(½*œ,.c0M224#68 : <>@/BGDbFˆH¨JÏLìNQSôTºV^X¸YØZ[à[ª[ÜZaY&WT.P^K¨E?¸7¨/' Ü¢ ¡ýùåñxêÕãÞÙñÔ©Ñ#ÏLÍÌbË)ËMËÆË}Ìk͉ÎÂÏ!Ñ“ÒÔ¶Õ_×Ùßڲܑހàtâ䋿¬èÐêíCï‹ñÚó0öŽøæúDý–ÿß.$ê y » ¦ ,3· ™ Ù ^&-uü ÷ýðjêtãEÜ ÕúÍ6ÇÁt»º¶ß²õ¯ü­ò¬Â¬c­«®—°õ²ÂµÔ¸$¼–¿$úÆVÊêÍxÑõÔeØÃÛ ßDâjåyèzëdî>ñô¾öaùùû~þöa» N ˆ ´Ûñûä Ó"´$&}(`*@,$.0ì1×3¿5·7¨9ª;«=´?ÇAÝCùEHõ@C$EGGgIŠK°MÃOÙQÎS®UgWíX/Z'[²[Ð[Y[JZ~XðUˆR@NIC“@£B½DÛFÿHKEM[OrQkSTUW¥XòYýZ›[Ñ[x[†ZåXzV@S%O"JBD=ÿ5Ó-%ã¶ ÍBøUðéâ÷Ü8ØEÔ+ÑÉÎÍýË`Ë=ËqË÷˺̳ÍÑÎÐtÑïÒwÔÖÃ×{ÙEÛÝûÞìàçâëäçéIë~í½ïòWô­öùcû»ý O}z2 ± Ü µ  b ) 5 ™10û õyïÍèÍá›ÚiÓkÌÌÅ»¿aºÖµ2²ƒ¯½­ç¬ê¬«­ ¯±³v¶˜¹î¼gÀôÃŽÇ&˸ÎDÒ»Õ)ÙÜÈßùâæ%é"ì ïÞñ¥ôT÷ùùŠü ÿ‚é?“Ì /Rozˆ‡ƒylT!C#"% 'é(Î*­,“.q0^2C436$8:<">(@=BSDrF‘H¶J×LóNQ SôT¾VSX·YÉZ‚[Í[Ž[ÁZ>YWîSþO,KvEá>ƒ7w/Û&䯇 „íùÜñqêÚãÞÙÕ¿Ñ8ÏdÍ-ÌzËBËcËÝË’ÌÍšÎ×Ï1Ñ£Ò+ÔÂÕo×#ÙíÚ½ÜÞ‰àâˆä–æ²èÝê íMïñáó6öøìúBý—ÿÛ&Ý d £ Š  ‰ h áå)ü»ö¯ðê)ãÜÊÔÁÍ ÇÝÀ`»¨¶Ü²õ¯ ®­Ý¬}­Í®¸°³çµø¸H¼¹¿FÃÚÆvÊΕÑÕ€ØÛÛ'ßZâåè‘ëwîWñôÔötù ü‘þ rÎa š Æì(ù á"Æ$°&Š(s*O,4.0ÿ1ã3Ö5À7¾9´;½=Â?ÖAéCF(HIJnL‡N£P£R—TdVXvY”Ze[Â[¤[ðZ•YzW”TÑP+L F9@ÿ81•(¦…N H–ûhóÞëå ß ÚÃÕ]ҬϻÍdÌšËKËZËÅËlÌSÍcΘÏïÐYÒàÓrÕ×ÏØ’ÚbÜ>Þ*àâ"ä-æGèpêœìÛîñkó¿õøsúÌü ÿhŸº¶„  j Y ö ¨ £ û £‡²ýÏ÷ßñfë„äaÝ-ÖÏQÈÂe¼·Œ³v°^®'­Ú¬S­†®P°¡²Vµ`¸ »¿”Â+ÆÃÉYÍåÐgÔ××6Û…Þ¾áæäûçûêëíÈðóLöõø‹ûþŽý[ªô * ]‚œ³»Ä¿¸¬— …"h$Q&1(*ö+Ó-¾/œ1‰3r5c7Y9U;T=a?jA„CœE½GàIL!N5PDR1TV²W2Y`Z>[¹[­[[àYîW3U˜Q#MÄG†Au:®2D*q!M!FýúôRíbæDàýÚ”ÖüÒ-ÐΡ̼ËWËR˱ËGÌ(Í)Î^ϪÐÒ”Ó"ÕÈÖxØ:ÚÜàÝÊ߸á¾ãÃåÞçê.ìjî¨ð÷òIõŸ÷ÿùPü®þð0OT& Ê % - Ú À Ø U  +uþÛø óªìÞåÂÞ×sИÉ5Ãn½i¸A´±¸®U­à¬0­B®ñ¯(²Ë´Æ·þºb¾èÁwÅɪÌ4мÓ+×ÚâÝáLäcçgê\í7ð óÁõuø ûšýƒè8„ ¼ ñ 3PRd[YI< #"$ð%Ô'¶)—+y-\/A1'357ø8ð:ó<÷>AC7EPGuI–K¶MÍOÜQÓS¯UfWåX*Z[¥[·[@[)ZYXÈUYRNÞHÌBè;=4ø+1#îÑýþ•öËî·çkáÜeתӱÐvÎèÌãËiËPËË(ÌüÌõÍ#ÏgÐÍÑFÓÖÔtÖ$ØàÙ«Û…ÝdßZáTã^åuçéÁëõí7ð‚òÑô*÷‚ùÝû1þ€»äëÌu á ù º Ñ £ ‘ Â7éþäù2ôîí1ç'àòØÓÑäÊlÄ€¾X¹µ•±¯­ë¬­®—¯²±F´,·]º¹½7ÁÈÄ]ÈøËƒÏÓ€ÖëÙ;Ý€à®ãËæÒéÈì®ï|ò@õë÷úý›ÿ oÉ Q … «Ïâôûû÷èÛÆ!®#”%x'W)<+-þ.ã0Ê2´4¢6—8:<‘>¡@±BÊDéFI.KGMiOqQsSRUWŸXëYíZŽ[¸[a[gZÁXRVSòNôIDP=È5¡-ó$êÁ˜ ¶5øMðé âÝCØ^Ô<ÑâÎ,ÍÌzËUË‰Ë ÌÑÌÆÍåÎ)ІÑþÒ†Ô$ÖÎ׊ÙPÛ'Ýßöàòâóäç#éRë†íÂïò[ô±ö ùeû¼ýNs…m ž Á ” ö Û 6 í þ TíÅÿâúUõ'ï„è‚áWÚ/Ó4̣ř¿LºÈµ3²…¯Ð­ú¬­Ê­B¯C±Á³š¶¼¹½ˆÀÄ­ÇEË×Î]ÒÙÕCÙ˜Üáßã2æ=é7ìïóñ¶ôj÷ úžü ÿ“ýQ£â  Ec~•œ‘Œyj!O#7%')Ù*Ä,.‡0j2W4?698(:-<+>=@FBdD|FŸH¿JãLùNQ SøT¹VSX¯Y»Zv[´[y[¢ZYÚVÀSÑOúJ@E¬>O7C/¬&´d oÚùÑñqêÝãÞ,ÙÕÓÑOÏÍB̘ËWË~Ëò˨̗ͪÎìÏ?Ñ·Ò7ÔÕÕx×4Ù÷ÚÇÜ®ÞàâŽä æ¼èãêíSï–ñçó;ö“øîúBý–ÿÖ È T ˆ m å ä Y 3 c ÞœšÛûoö]ðÑéÝâ¼ÛŒÔˆÍáÆ¹ÀG»›¶Ô²ÿ¯®­ö¬š­ñ®Ú°>³ ¶¹m¼Ü¿gÃüÆ”Ê&βÑ-ÕšØôÛ@ßqâ›å£è¨ëîiñ/ôåöŠùü¥þ…á.u ª Øü)362+ !ñ"Ú$½&ž(ƒ*_,G.%02ö3â5Õ7É9È;É=Ò?ãA÷CF2HVJtL–N£P¬R—T`V XfY‘ZR[¯[[ÑZsYTWiT£PùKkF@Ê8ã0b(Y3 *ˆûZóÞëå*ßÚØÕnÒÅÏÓÍ|Ì´ËbËrËÝËÌiÍrήÏÿÐjÒîÓÕ(×ÞØ›ÚrÜEÞ8à$â/ä4æTètê§ìßî&ñoóÆõøwúËü!ÿd˜¶¦x Q ? Ñ å x p à bDjÍü„÷ñë7ä!ÝéÕäÎÈåÁF¼x·‚³|°g®=­ò¬o­§®s°Ã²µ~¸É»/¿·ÂKÆáÉwÍÑ‚Ôð×QÛœÞ×áûäèëîÛð¦ó_öùžû*þ¡l¾ > l‘±ÁÑÐÓǾ© ”"|$^&C(%*,ì-Ä/µ1’3‡5p7j9c;d=n?zA‘CªEÈGëI L)N>PDR9TV·W&YYZ.[§[”[[¾YÉW UlQòL‘GQAD:y2*@!-ûô1ýðôNídæMà Û¥ÖÓEÐ-Î¹ÌØËmËnËÅË`Ì9ÍAÎmϼÐ$Ò¡Ó4ÕÔÖ‡ØCÚÜëÝÒ߯áÃãÏåççê9ìkî²ðûòKõ§÷úùVüªþì-CJ º  ´ ä “ ¦  Üé-¿ýŒøÂò\ì”å|ÞS×8ÐlÉÃS½X¸8´±¾®k­ò¬O­_®°I²ò´æ·$»„¾™Å0ÉÅÌSÐÕÓGתÚûÝ6áaäzç|êpíNðóÙõ…øû¬ý'˜öK” Ï 'H[jnpg]I 6"$&æ'Å)©+ˆ-m/P183%57 9ý:=?A(C>EaG|I¡K½MÕOàQÖS®UcWßX!Z [“[¡[&[ Z6X¡U+RåM¨HB²; 4È+#ù̸éþ‰öÉîµçxá Üz׺ÓÌÐŒÎÍüË‚ËhË´Ë?ÌÍ Î5ÏxÐßÑUÓãÔ‚Ö1ØëÙºÛ‹Ýuß_á`ãeå~çšéÈëüí=ð‡òÕô-÷„ùÞû0þ}¶Ýà¾c Ë ß — ß £ Ù n T ñŸþ—ùåó íèæÞߵؔѷÊ@Äf¾B¹ù´”±%¯Ÿ­ý¬2­!®¸¯Ö±j´O·‚ºÚ½YÁçÄ}ÈÌ£Ï%Ó ÖÚWÝ—àÄãáæèéÞìÁï‘òTõþ÷¡ú,ý®ÿÛ! b • ½ßõ  üëÖ!À#£%ˆ'j)J+-- /ô0×2Ç4¯6§8:œ<¡>®@½BØDôFI4KVMjOzQtSRUW—XåYßZ}[¦[D[MZ›X,VéRÄNÃIÖC=—5q-Ä$Åš Ÿ(øEðé©â ÝYØjÔUÑúÎBÍ0Ì’ËlË¢Ë"ÌæÌÙÍùÎ;ЕÑÓ“Ô3ÖÛ×–Ù\Û1Ýßÿàúâåç0éZë‹íÎïòcô³öùeû»ýDqya † © w Ñ µ  º à ª|ÿ—ú õÛî9è>áÚöÒÌzÅ}¿5ºÀµ0²¯Ý­­­æ­e¯b±è³º¶â¹3½«À8ÄÊÇeËñÎ|ÒðÕ]Ù±Ü÷ß)ãEæUéKì2ïòÈô~÷ú°ü2ÿ¦ g±ó ( SwŽŸ¨©¤œŒx!`#I%'')ì*Ï,³.“0{2e4Q6F89::<:>J@UBoDŠF§HÌJéLOQSøT¹VLX§Y²Zd[£[`[„ZúX´V—S¥OÈJEx> 7/ƒ&ŒjH ZÌùÌñqêßãÞ7Ù+ÕçÑgÏ•Í^Ì®ËrË’Ë Ì½Ì©ÍÀÎûÏTÑÂÒIÔÞÕ‹×:ÙÛÑܵޞà•â™ä«æÀèðêíZïñëó?ö•øîúEýÿÖþý½ ; t M Ä º +  % ¥VW‘û#öð‡éšâwÛTÔXͲƟÀ+»“¶Ñ²°#®+­­¸­¯ü°c³,¶A¹¼þ¿‡ÃDzÊAÎÏÑDÕµØ ÜWߊâ®å½è·ë¥îzñCôööù/ü¹þ*˜ñA„ ½ ç%:CFC9-!#é$Ì&°(*u,O.<024ò5â7Ú9Õ;Ö=á?ðAD"F;HbJ~L™N­P¬R™TcVýWiY}ZH[›[u[¸ZQY1W?TxPÊK=FÑ?š8´04(X6 vûUóÛë å5ß&ÚëÕƒÒÝÏé͘ÌÊË|ˉËñË™Ìz͊λÏÑxÒÿÓÕ5×èØªÚxÜWÞ;à3â3ä@æYè}ê­ìæî*ñvóÆõ!øsúÏüÿd¬c ó 4 ( «  I @ Š ''ƒü:÷DñÓêðãàܮձÎôÇÄÁ-¼l·{³ƒ°s®L­ ­‰­É®°ê²›µ¦¸è»Q¿×ÂjÆþÉ“ÍÑ™Ô ØeÛ¶Þèáå#è(ëîñð·óuöù¶û6þ¹€Î O |¥½ÕÞãâØÌº ¥"Š$o&S(2*,ô-Ù/¿1¥3“5‚7v9t;p=~?ƒA¡C³EÕGôIL/NFPGR:T V±W!YLZ$[[…[âZ¥Y£WâTAQÄL_G$A:M2æ)!ãØ#ýèôJíhæVàÛ¸Ö#Ó[ÐDÎÔÌïˆ˄ËÛËvÌNÍT΀ÏÌÐ6Ò®ÓDÕàÖ•ØNÚ!ÜõÝÞßÐáÊãÚåîçê=ìuî¶ðóOõ¨÷ÿùUüªþé&== ¡ ù ô ˜ ½ f w ä ¤£îoýHøpòìGå>Þ×Ð<ÉéÂ<½E¸6´±Ì®z­ ­i­~®6°k²µ ¸D»ª¾%»ÅKÉåÌlÐòÓ_×ÃÚÞOáväçê†í_ð3óêõ˜ø1û¾ý9©^£ á 7Zj|~‚tqV J"*$&ó'Ù)·+š-z/b1E365 79;=? A5CKEkG‰IªKÄMÞOâQÙS°U]WÜXZþZ[Œ[ [ëYXxUR±M}HgB;Ü3—+Ü"Ñ®œÖþ}öÁîºç|áÜŠ×ÎÓßШÎÍÌ–Ë„ËÇËXÌ#ÍÎFÏ‹ÐîÑeÓóÔÖ>ØùÙÂÛšÝ|ßmágãqå„ç£éÐëîDðòÚô0÷ˆùÜû4þuµÓÖ°Q µ Æ w ¹ z © 7  ?¬WþMù™óWíœæ›ßuØ]чÊÄH¾0¹ñ´•±-¯¯­­M­?®Ù¯ø±Œ´t·£ºý½{ÁÅÈ3̼ÏFÓ²Ö ÚjݱàÚã÷æüéóìÔï§òdõø¯úCý¼ÿ2“ë2 t ¤ Ñî ýæ!Ï#´%˜'y)\+;-/1ê2Ò4Â6³8­:ª<°>º@ÌBãDGIAKXMvO}QwSUU W“XÜYÓZm[[/[)Z}XV¿R˜NŽI¨Cæã_æeécìDïòÜô÷/úÄüBÿ¹xà 9 d‡ž±¶»´¬œ‡!s#T%=')þ*á,¾.§0ˆ2v4`6T8I:GS@eByD•FµHÒJôLOQSøT·VGXžY¦ZU[[H[fZÛXŠVpSuO™JßDF>í6ä.T&eI- E¿ùÂñrêçã(ÞJÙ:ÕýрϪÍ{ÌÂˋˬËÌÖ̺ÍÖÎ ÐfÑÐÒYÔîÕ”×LÙÛáܽީàžâ£ä°æÍèñê%í^ï¤ñïóCö˜øðúEýŽÿÓõî¯ % Z 0 ¡ È ó a Gû×õÈï:éTâ6ÛÔ$Í‹Æ{À»„¶Ï² °2®=­,­Ñ­4¯±‡³Q¶b¹±¼À©Ã9ÇÐÊ_ÎçÑbÕÍØ&ÜlߤâÀåÔèÎë¶î“ñRô ÷¯ùAüÌþ<«U’ Ð ø8IVUVJ;-!#ý$Ú&Á( *‚,e.E0/246ñ7è9å;ä=ð?ûAD*FKHfJ‹LœN¶P­RT_VþWZYyZ4[Š[][›Z0Y WTHPKF£?e8„0 (*ò cûNó×ë'å<ß6ÚûÕ™ÒõÏΰÌâ˕ˡË̯̎ÍÎÎÏ!Ñ‹Ò ÔŸÕA×öضڂÜcÞEà?â;äJæ_èˆê±ìðî-ñ}óÉõ$øuúÏüÿ^‹¢W Ú !  —  P ê¾Þ;üêöýð‚ê®ã˜ÜtÕzÎÇÇ¢Á¼]·w³ˆ°{®f­­¬­ã®¸°³ÂµÊ¸¼w¿õ‹ÆʰÍ:ѵÔ$Ø‚ÛÉÞâ(å;è<ë&îñËó‡ö,ùÄûLþÆ1à& ] ’°ÔáòñõçÞÉ µ"›$€&a(D*&,.ë/Ì1¶3¢57‰9;=‰?”A¬CÀEàGýIL7NLPKR;T V¬WYAZ[~[k[ÊZY‚W·TQ“L0Gí@à92½)ð àÁÂýàôDínæ]à(ÛÇÖ;ÓpÐ^ÎëÌ ÌŸËœËòËŒÌcÍfΔÏÝÐDÒÁÓNÕñÖžØ^Ú'ÜÞçߨáØãáåôçê@ì€î»ðóWõ¨÷úSü§þê:,ý ß Û t — 9 E ­ ee¢+ý÷÷)òÇëåõÝØÖËÏÉǽ8¸,´±Ö®‹­$­ƒ­Ÿ®V°²9µ,¸k»Å¾NÂÓÅqÉý̌РÔ|×ÚÚ+Þbá‘ä¢ç¨ê˜íuðEóýõ«øEûÏýN¸kº í (FkzŽŽ“†~j W"=$#&(è)Ç+«-Š/q1W3A527%9;="?/ABCXEuG•I±KÐMáOéQÜS®U\WÕX ZïZp[u[ñZÌYïWOUØQƒMKH5BN;©3k+®"®Š…Âþsö¼î»çƒá%ܘ×äÓõоÎ1Í-̳˙ËáËkÌ8Í3ÎWÏŸÐüÑvÓÕ›ÖMØÚÑۣ݈ßuátãyåç«é×ë îJð‘òàô3÷Šùßû0þv­Íʤ< ¡ ª W ” M { ÿ ßþg þùMó íUæVß3Ø'ÑVÊõÃ-¾¹è´˜±3¯Â­'­k­\®û¯²¯´š·Ãº#¾˜Á)Å»ÈOÌÝÏ]ÓÒÖ3ÚˆÝÅàòã çêíêï¸òyõ&øÃúRýÓÿA§ùH ‚ ¸ àÿ&-,* ÷!á#Å%¨'‰)l+K-1/1ú2ã4Ð6Å8¼:º<¾>È@ÛBðD G)IIKdM|OQ}SRU WŒXÒYÈZZ[|[[ ZXXÞU‘RkN\ItCµ<15-h$wUH u ø6ðé²â'ÝsؓԀÑ&ÏwÍ]ÌÄËžËÍËQÌ ÍÎÏ^зÑ.Ó±ÔOÖô×°ÙrÛMÝ"ßá ãå$ç?éjë™íÙïòjô¾öùgû¼ýÿÿ>aeEî [ v 8 ‰ a ¦ Q M –ïþúnôJî¡ç·à’ÙƒÒ¢Ë(ÅA¿ º«µ/²œ¯û­:­Q­%®¢¯­±)´·&ºv½ïÀuÄ ÈË-Ï®Ò)Ö‹ÙåÜ#àVãtæ|évì[ï-òñô£÷CúÒüYÿÇ2ˆÓ K u˜¯ÁÇÍþ«™!#h%J'.) +ñ,Ð.µ0™2ƒ4q6a8Z:Ua@sB†D¢F¾HßJùLOQSöT¸VCX–Y™ZE[y[0[JZ¸XfVDSGOjJªD>¸6³.(&=$ .®ù¼ñnêêã5ÞTÙOÕÒ”ÏÇÍŽÌÞË£ËÁË6ÌèÌÑÍæÎÐvÑáÒhÔúÕ¤×VÙÛéÜÊÞ³à©â¬äºæÔèûê*ífï©ñôóHö˜øôúAýŽÿÌóæš  @  ~ h Ó “ ¹ #ÒÇÿüúŽõzïõè â÷ÚÜÓóÌ_Æ_Àÿº{¶Ê²°=®T­B­ñ­Q¯?±ª³q¶Š¹Í¼EÀÃÃ]ÇéÊ€ÎÒ|ÕèØ;܈߶âÙåèèâëÎî ñkô÷ÄùTüÛþQ¹d¤ ß ,JYcja]L;!"# %î&Í(´*,v.V0<2$468ø9ñ;ô=ü? BD9FRHuJŽL¬N´P·RšTaV÷WWYjZ([v[D[€ZYåVðSPpKÔEp?58Q0Þ'òØ éVûBó×ë(åHßBÚÖªÒÐÎÊÌúË­Ë·ËÌẠ̃ͰÎàÏ1Ñ›ÒÔ«ÕP×ÙÅÚÜnÞPàFâHäOæmè‹ê¼ìóî7ñ~óÒõ!ø}úËüÿY…šƒG Ç  é k q ñ Ù  ©€–óû£ö®ð=êfãUÜ=ÕB΢Ç{Á¼L·u³Š°Š®u­9­Ç­¯Ú°+³åµê¸,¼–¿éÆ:ÊÎÍRÑÓÔ:ØšÛäÞâAåPèPë<îñÞóšö>ùÕû`þÖB ð7 q ÇßõûëÚ Ä"®$&u(P*6,.ø/ß1Ä3±5¡7”9‘;Ž=—?¢A¶CÏEêGJ(L²Ò´»·çºC¾¸ÁLÅÕÈpÌôÏ|ÓèÖOÚœÝÞàä"ç&êíúïÑò‡õ=øÒúgýáÿVµS ™ Ä ô&8;?8+ "ò#Ò%»'—)}+]-;/%13ò4â6Ð8Ì:Æ<Í>Õ@èBúDG2ITKkMƒO†QSQU W…XËY¹ZK[f[úZïY5X·UhRàkãŠæ’é‹ìmïEòõ¶÷VúæühÿÞ?œä' [ †©¾ÓØÛ×Ê¿¨!’#w%['=)+ÿ,á.Ä0ª2”4~6s8g:dn@B“D¬FÍHãJMO$QSøT¶V;X’YŒZ3[i[[0Z”XAVSO;JuDå=…6ƒ.û%ò  ù´ñlêñã<ÞfÙ`Õ&Ò­ÏÝͨÌö˺ËÙËMÌûÌæÍøÎ2ЃÑõÒsÔ Ö°×eÙ'Û÷ÜÔÞ¾à´â¶äÃæßèë2ílï®ñüóHöŸøòúBýŽÿÅîöÙ‹ þ ( ô Z A   d } åŽÿ²úBõ.ï«èÃá¶Ú¡Ó¿Ì7Æ<Àëºn¶Ç²°H®j­Y­®p¯a±Ì³˜¶«¹ô¼cÀçÃyÇ Ë™Î!Ò•ÕÙWÜœßÑâïåþèøëàî¹ñyô4÷ÒùiüíþbÍ$v· î >YktzsoZK!4#%þ&à(Á*¢,„.g0K254!68:<> @B.DAFdHyJL­N¾P¹RT`VòWQY^Z[c[-[bZðX¿VÅSïO:K¦E:?8!0«'Ûȼ ÏDû;óÐë.åOßOÚÖÂÒÐ2ÎßÌÌÃËÑË3ÌØÌ¹Í¿ÎùÏ<ѰÒ&Ô½Õ]×ÙÎÚžÜsÞ`àNâQä[ærè—êÂìýî9ñˆóÓõ)ø|úÍüÿV€y7 ´ ð Ì I J  § ß l;M©ûSöaðñéãÜÿÔ ÎuÇXÁæ»>·p³°–®‡­R­ã­"¯ü°O³¶¹N¼¹¿9ÃÇÆ\ÊéÍrÑëÔZذÛÿÞ/âXåfègëQî-ñóó­öQùîûlþîS³F ‚ ±×ñ ê Ø"º$£&(f*D,'. 0î1Ö3Á5°7¥9ž;¡=£?³AÄCÚEøGJ1LHNVPXR=T V¦W Y0ZöZ[[>[‘ZCY6WfT»P2LËF†@z9²1])˜ ‘ƒŠìüÆô:ísæià@ÛèÖaӚЎÎÍ:ÌÏËÌË̺̉ÍζÏÑbÒãÓhÕ×¶ØzÚ?ÜÞûßïáëãóå è'êVìŒîÆðóYõµ÷úXü£þä'Ûo ­ ¥ 2 K ã ß ? êá”üc÷ñ4ëpämÝZÖ_Ï´È|Â뼸´±ê®°­P­¼­ß®˜°Ø²}µw¸­»¿ŠÂÆ«É;ÍÄÐBÔ¯×Û[Þ’á¿äÍçÔêÁí ðjó'öÎølûõýoá;”Ø  Enˆ¡¬³°ªŸŒ x"^$D&$( *ä+Í-©/’1w3a5O7D9;;===?NAZCrEG¦IÉKÝMðOòQßS±UTWÍXõYØZI[M[¹ZY¤WUQ#MéGÌAè:B3 +U"^FN˜þYö¯î½çá:Ü»×Ô#ÑêÎaÍ^ÌäËÅËÌ”ÌcÍ[Î|ÏÁÐÒ“Ó!Õ·ÖgØÚæÛ¼ÝžßŠáˆãŒåŸç¾éäëîUðŸòçô=÷Žùáû.þp¥¼·„ s s  F ú  ’ f{Üzýlø³òtìÀåÌ޳׸ÐõɧÃõ½ø¸×´—±I¯Ü­Z­œ­š®@°]²ú´Þ· »f¾ÝÁiÅúÈ‹ÌЕÓ×jÚ·Ýõà ä8ç@ê/íðáòŸõOøèúzýöÿfÉi ¨ Ù "8KKSEA, "ÿ#è%Ç'®)‰+o-N/3135ò6á8Ú:×<Ú>ç@óB E!GAI\KuMŠOŒQ‚STUWƒXÁY®Z:[Q[ÞZÓY X’U9R NúH CN<Ë4±,$# Hò÷%ðé»â:ݓطԬÑRÏ©ÍŒÌøËÉËÌxÌ=Í'ÎFÏ€ÐÛÑJÓÔÔhÖØÈÙŒÛaÝ>ß+á"ã%å8çPézëªíåï+òuôÃöùfû¿ýùÿ9OV(Ï , F ÷ B D ç Ó“\þjùÖó©íçàÙ Ò>Ë×Ŀ乕µ)²®¯®d­‡­`®æ¯ñ±r´M·mºÀ½1Á¹ÄJÈÛËhÏçÒ_ÖÀÙÝTà†ã¡æªé¡ì…ïXòõÊ÷júûü}ÿíWªú7 p ˜»ÒãëíèÞϺ!£#‰%l'O).+-ñ.Ö0º2¥46ƒ8x:r<{>z@“BžD½FÔHóJ M"O)QSûT²V@%B:DPFlH‰J¢L¹NÂP¾RT^VñWFYUZ [K[[BZÏX—V™S½O KoE?Ë7ì/z'«£– µ1û+óÎë,åYßYÚ2ÖÔÒ6ÐKÎõÌ/ÌÚËéËJÌïÌËÍ×ÎÐSÑ¿Ò4ÔÐÕf×!ÙÙک܃Þfà]âYäeæ|èžêÊìï?ñŽóØõ*ø€úÌüÿRz†n& ¢ Õ ± &  — p ¦ .ò Xû öð¦éÎâÐÛ»ÔÙÍDÇ5Áλ/·i³”°Ÿ®ž­h­®C¯±u³-¶5¹r¼Þ¿[ÃêÆzÊ ÎÑÕvØÊÛßJânåè{ëiî?ñ ô¿öhùûûˆþùlÂY – Áé$'$ !ä"Ò$­&™(p*Z,6.0ý1è3Ï5Ã7²9±;«=¶?ÀAÏCëEÿG"J7LSNYP`R=T V W Y#ZëZG[&[wZYW9TŽPL—FR@B91))m hamÛüµô9ípæqàNÛõÖvӱУÎ5ÍPÌçËåË4ÌÏÌŸÍ£ÎÉÏÑrÒòÓyÕ×ÅØ„ÚMÜ#Þ à÷áöãþåè4êZì•îÍðóaõ¸÷ú\ü¡þàËY œ ƒ   ¸ «  ªŸÌOü÷Dñâê'ä)ÝÖ*Ï‚ÈXÂμ¸´±õ®Á­i­Ú­ü®»°û²¢µ¸Ð»3¿­Â9ÆÌÉYÍâÐ\ÔË×)ÛqÞ°áÐäéçèêØí¶ðó<öãøûþ„ïT¡î % Y}Ÿ®ÀĽ®ž ‹"n$V&4(*ù+Ú-¿/ž1‹3p5a7S9K;K=O?YAjCE™GµIÏKéMóOûQÞS³URWÅXìYÊZ8[5[ŸZkY„WÓTTQïL¶G–A´: 3Ù*%"5"3þLö¦î½ç”áGÜÇ×Ô4ÑÏvÍzÌøËãË#̯ÌxÍkΕÏÍÐ4Ò¢Ó1ÕÅÖvØ)ÚõÛÈݨߘáã˜å¨çÇéîë#î^ð¡òòô;÷–ùÝû2þk ´«w ^ V ù  Î ã _ %;‘1ýøcò'ìså†Þs×|ÐÅÉ‚ÃÖ½æ¸Ï´•±V¯ê­s­µ­¾®^°…²µ¸1»‰¾‰ÅɪÌ2Ð´Ó ×„ÚÏÝá8äOçVêGí(ð÷ò´õ`øûŠý {Û2} ¶ ï 7IZ`_[NA ("$÷%Ø'À)™+-]/E1'35ÿ6ñ8ì:ã<î>ð@CE-GNIbKƒM‰OšQ|S\UþVX´Y£Z&[>[ÀZ¶YèWiU RÚMÈH×B<š4|,ã#úëó1ä÷ðéÀâGÝŸØÌÔÀÑkÏ¾Í¨Ì ÌçËÌ•ÌKÍ@ÎVÏ“ÐëÑ\ÓáÔxÖØÔÙœÛhÝMß3á-ã0å>çZé‚ë°ííï-ò|ôÆöùkû¹ýüÿ.LF¸  & Ù  ß  ¬ ›ÑPþùˆó_íÅæÜßÔØÐÑ Ë¯Äã¾Ð¹Œµ)²¶¯%®­ž­‚®°²•´s·Žºå½SÁÙÄlÈ÷ˈÏÓzÖÙÙ1Ýlàã¶æÁé´ìïiò0õÚ÷ú ýÿf¿ G ‚ ¨ÌãõûÿùîßÍ!±#œ%z'`)@+-/ä0Ê2¶4ž6’8‡:ƒ<…>@šB¯DÆFáHüJM(O.Q!SüT¯V6X|YwZ[;[åZïYOXðUÂRºNÕIDw=6 .™%¾·± ë|ù¡ñgê÷ãNÞ‚Ù„ÕPÒÙÏ ÎÙÌ(ÌëËÌxÌ)ÍÎ ÏVЦÑÓ“Ô(ÖÍ×}ÙAÛÝëÞÔàÉâÊäÖæðèëBízï¼ñôUö¢øøú@ý‹ÿ½àã¾j Ô ñ ¼ ñ ? ø  _åþ úžô˜î è8á(Ú.ÓQÌåÅ÷¿ÀºQ¶Å² °g®­­I®µ¯¥±´Þ¶õ¹;½©À-ĹÇKËÕÎZÒÍÕ6Ù‰ÜÏßÿâæ+é"ìïÞñ©ôV÷þùüÿ‹íP•ß  C`€‹šš˜€n!U#=%')ä*Â,¦.‡0m2V4?618$:!< >(@4BED_FtH–J©LÃNÇPÂR TZVîWEÍ>œ7¶/Q'|v Ÿ û óÏë+ågßdÚEÖçÒOÐaÎÍHÌòËÌbÌÍäÍçÎÐeÑËÒJÔØÕy×+Ùçڵ܌Þsàfâeänæ…è§êÓì ïHñóÞõ/ø€úÎüÿLu{b ‹ ¾ ’  ù d > l ì±½ÿû¸õÈïRéâ…Û…ÔŸÍÇÁ¸»·h³•°¯®®­ƒ­®d¯B±˜³Q¶Z¹˜¼ý¿ÃÇÊ%έÑ$ÕØéÛ,ßcâ‡å’è•ë{îVñôÑö|ùü–þvÙ(k § Õù'569*"!ö"á$¿&§(†*f,I.(02ó3ä5Í7Å9¾;»=Ä?ËAàCòEH'JDLXNcP^RCTVŸWYZÛZ3[[YZÿXëVTaPÎKgF@9L1þ(= H:]Âü²ô1ítæ|àYÛ ×ŠÓÇнÎKÍlÌÿËýËKÌæÌ³Í¸ÎÜÏ$цÒþÓŠÕ(×ÖØŽÚ[Ü.Þàâäæè:êdì™îÖðóiõ¸÷ úVü¢þÝÿÀC ‚ h ï ú ‡ | Ê pVŠýûÊöòð™êàãáÜÞÕñÎVÈ6³¼ù·´±¯Ñ­…­ó­¯Ü° ³ÆµÀ¸ö»R¿ÑÂXÆìÉvÍÑxÔã×EÛˆÞÇáèäÿçþêííÉð“óOöøøûþ“cµý 9 g’¬ÁÑÓÖÉì ›"€$c&K(&* ,ê-Í/³1”3…5m7e9X;\=Z?jAtCE¡GÂI×KðMûOýQâS±UNW½XåY¹Z&[[ƒZMY_W¨T)QÀL‚GfA:Ý2ª*ú!oþBö¡î¿çžáPÜÜ×-ÔOÑÏÍ‘ÌÌùË=ÌÂÌŽÍΣÏåÐ?ÒµÓ<ÕÔÖƒØ6ÚÜÑݴߢá™ã å²çÍéöë*î`ð¬òðôD÷’ùãû+þl–¯›kõ C > Ó þ ž ¶ ! îöKêüÌ÷ òÕë0å>Þ7×EИÉ[û½×¸Å´œ±Y¯®„­Ö­Ú®€°©²=µ*¸R»°¾¯Å4ÉÌÌMÐÏÓ;×ÚéÝ&áOäfçkê[í=ð óÊõrøûýìEŠ Ì ü &E]hsom_O ;""$&ê'Ì)­+Ž-p/R1:3"579ù:ô<ù>AC$E:GUIqK„M˜O—QƒSXUÿVxX¬Y–Z[)[¨Z‘YËWš@ªB¸DÕFêHKM0O2Q&SüT¬V3XqYlZ[)[ÈZÒY+XÈU—R‹N¢IÜCB=ë5ë-n%’“• Ñqù“ñkêøãZÞÙ•ÕfÒðÏ$ÎñÌBÌÌ"ÌŽÌ?Í#Î3ÏfлÑ"Ó¦Ô5ÖÜ׋ÙMÛÝ÷ÞßàÔâÒäáæøèëIí‚ïÁñ ôWö¦øøúBýˆÿ¸ÚÖµT Ã Õ œ ê Æ  Å É$½£þÏùXôGîÆçíàëÙðÒ Ì¼ÅØ¿«ºG¶Á²'°w®¥­ª­j®Ò¯Ì±8´·º`½ËÀLÄÚÇiËòÎvÒèÕPÙ¤Üçßã6æ@é;ì ï÷ñ¹ôn÷ú£ü%ÿœ^«í # Rs«ª© ‚!a#P%/')ô*Ó,µ.™0|2f4O6A85:.<0>4@CBSDhF…HšJ¸LÅNÐPÂR¢T[VæW7Y=ZèZ([áZ Z†XLVBScO¥J Eš>e7‰/'XW[ …ûóÉë4åjßxÚTÖÿÒdÐzÎ'ÍbÌ ÌÌyÌÍöÍÿÎ*ÐxÑÜÒZÔåÕŠ×4Ù÷ÚÀÜ—Þàmâqäuæ‘è¬êÞìïOñ–óáõ2ø€úÎüÿKksT v ¥ r à Ï 5 1 «qnÿËúgõ{ï éAâFÛGÔjÍóÆïÀ¢»·f³—°Â®½­¢­7®†¯d±º³y¶z¹½¼À¡Ã(Ç»ÊDÎÇÑAÕ¦ØÜEßzâ›å­è¥ë“îjñ0ôêöŠù%ü¨þ%Šé:~ · ç &;CKF>2! #î$Ô&´(–*w,X.=024ð5ß7Ô9Ë;Ë=Ñ?ÙAïCûE H,JSLZNkPbRCTV™WúX ZÍZ[ùZ;ZßXÄVèS0P¢K/Fë?Ý81Ð( "?¶ü¡ô1ívæ‚àhÛלÓâÐÒÎf̓ÌÌÌeÌùÌÊÍÊÎíÏ7Ñ•ÒÔšÕ3×䨛ÚeÜ;Þà âäæ"èDêjì¡îÚð!ónõ¹÷ úVü¡þÖ ö®/ j K Ë Ö W K ‘ 0@·û{ö¨ðMêšãžÜ¢Õ¾Î)È›¼é·´± ¯ç­˜­®<¯±A³éµå¸¼z¿ïÂ|ÆÊ™ÍјÔû×]Û£ÞÜáåèëîÞð¨óbö ù¤û-þ¨uÈ K x£¼ÖÜéàáÍÁ ©"‘$u&Y(8*,ú-Ý/Â1§35€7q9k;g=i?yACE«GÎIßKúMPRãS±UJW¹X×Y¯Z[ [gZ,Y:W‚T÷P”LLG6AF:¯2u*Ó!âçøaþ/öŸî¾ç¤á`Üç×EÔbÑ3ϩͪÌ+ÌÌSÌÚ̢͖ηÏõÐQÒÅÓLÕäÖØCÚ Üßݿ߫á¤ã¨å»ç×éþë0îjð°òõôI÷“ùäû+þf•¡–Xá 1  · Õ r ƒ ë ®µžüƒ÷ÏñŒëåäûÝöÖÐeÉ:ýǸ¿´š±h¯ ®¡­í­ý®¡°Ë²dµJ¸z»Í¾EÂËÅXÉçÌlÐêÓV×¶ÚÞ@áeä~çêsíOð!óÛõ‰ø$û¯ý0Wš à 9Unz‚‚|r_ K"4$&(×)Á+œ-€/d1I315 79 ;=?AC0EEGdIuK’MšOQ‡SXUúVtX¡Y‰Z[[ŒZtY¤WU´Q~M`HuB­;74,Œ#¦«¹ È÷ðéÎâ\ÝÁØòÔéÑœÏíÍÛÌ=ÌÌBÌÀÌyÍeÎ~϶ÐÒ{ÓÕ“Ö:ØðÙ±ÛƒÝaßIáAãBåRçkéëÂíöï>òôÑö ùmû¸ýõÿ$=0” ï ð › Ð Š ´ @ "PÁ€ý†øñòÄì3æOßSØ_Ñ©Êaħ¾«¹yµ)²Æ¯F®¨­Õ­¿®H°Z²ß´¹·×º*¾–ÁÅ©È7Ì¿Ï=Ó®ÖÚbÝžàËãææêéâìÅï“òXõø¥ú4ý²ÿ)ˆä- n ¤ Éò  è!Ú#·%¡'~)a+A-#/1ë2Ó4¿6°8¦:¡<¢>©@¶BÇDßFöHK&M4O9Q'SþT«V+XlY\ZóZ[±Z´YX¥UgR^NpI§C=µ5½-<%ml{ ¹aùŒñgêþãcÞ¡Ù¤Õ}ÒÐ>Î ÍXÌÌ7Ì¥ÌTÍ7ÎEÏ|ÐÆÑ7Ó°ÔHÖä×ÙTÛ+ÝßéàßâÚäìæþè%ëQí‡ïÊñ ô]öªø÷úEý‚ÿ¶ÐУH § à x È ß ãy[þ„ù ôüí|ç¦à«ÙµÒðˑŹ¿–º:¶Â².°ƒ®»­Â­†®ø¯ê±_´%·>º€½ïÀkÄûdžËÏÒÖgÙÀÜüß1ãJæZéKì;ïòÑô~÷$ú¶ü7ÿ°p½ÿ 5 e¢¯¸Áµ³ Ž!v#_%?'%)+ã,È.¦02s4a6O8C:@<<>E@OB`DtFH¥JÀLÌNÖPÅR¦TUVæW+Y4ZÙZ[ÌZëYgX$VS4OtJ×Df>57R/ô&'87 pþúóÅë7åsß„ÚgÖÓ~ÐŽÎDÍuÌ&Ì.ÌÌ/Í ÎÏAЄÑðÒfÔ÷Õ•×DÙÛÌÜ£ÞŠàyâyäæ•è¹êÞìïQñóæõ3ø…úËüÿAkgHõa U ¼ ¨  Õ øn)/ÿxú#õ+ïÄèøáÛ Ô9ÍÆÆÎÀ‹»·c³œ°Í®Ñ­¹­V®§¯ƒ±á³—¶£¹Ü¼EÀ¿ÃIÇÙÊbÎäÑ\ÕÀØÜ]ß”â²åÀèÀë£î„ñAôÿöžù9ü½þ4 úM Ê ö7LT]UQ@/!#ÿ$ã&È(¦*‡,h.J01246ì7æ9Ù;Û=Þ?éAùC F&H>JTLjNjPkRAT V“WôXZ¿Z [àZZ¼X¢V¼SPpKüE¹?¥8ì0œ(èüù *žü™ô*íuæàpÛ-ׯÓõÐëÎ{ÍœÌ0Ì+Ì{ÌÍßÍÝÎÐGѨÒÔªÕC×ðبÚrÜEÞ,àâäæ/èHêwì¥îãð)ónõÂ÷ úZüþÖùç  O 3 ¦ ¯ +  \ ðÔúÿlû.ö]ðêPã]ÜbÕˆÎûÇòÁ€¼Û·´±¯ü­¬­3®[¯"±g³ ¶ ¹8¼›¿ØÆ*ʳÍ4ѵÔØyÛºÞõáå+è(ëîñð¿óuöù¶û@þ¼'ˆØ \ ŠµÍæð÷õîâÏ º"¢$†&h(K*(, .ë/Ô1³3¥5‹7‚9z;u=y?ƒAC¦EºGÔIíKýM PRèS¯UHW¯XÑYšZ[ìZQZYWXTÍPaLGþ@:{2G*¥!ÀÂãIþ'ö˜îÁç«ákÜù×XÔuÑNϼÍÈÌ=Ì,ÌiÌï̸ͧÎÊÏÑcÒÓÓ[ÕñÖ›ØTÚÜíÝÇßµá¯ã³åÃçßéì5îrð´òùôM÷“ùèû&þh‰ŠEÕ   • ¬ J N · ow½Wü;÷ñEëšä¹ÝºÖØÏ:ÉĽ·¸·´Ÿ±o¯#®³­ ®¯Ä°î²‡µo¸›»ð¾eÂìÅwÉ͈ÐÔr×ÎÚÞTá~ä’ç—ê†ífð1óñõšø7ûÃýA¯e² ë !Hg~Œ““Œƒn _"B$)& (î)Ì+®-‘/q1\3?5179;=?A,C:EUGiIƒK˜M O£QŠSTUüViXœYwZóZùZuZSY‚WìTQIM6H=B;4ì+]#‡Ÿôÿ¼÷ ðéÓâiÝÎØÕÒ°ÏÎñÌWÌ,Ì\ÌÓÌÍyÎÏÉÐÒ‹ÓÕ¢ÖHØüÙ¾ÛŽÝkßVáHãOåYçvé–ëÉíþïBò†ôÕö!ùqû´ýõÿ4'ï† Ô Ù w ¬ _ ‚ â|7ý=ø¢ò|ìèå ߨ+ÑwÊ>ÄŠ¾˜¹qµ(²Ï¯U®¿­ï­ß®h°}²µÚ·»F¾½Á;ÅÈÈWÌÙÏ\ÓÆÖ,ÚwݸàáãüæêøìÕï¬òfõøµúFýÈÿ5 ò@ ~ ¶ Û(/0-  ú!é#È%°')o+S-2/1ü2á4Ñ6½8¸:¬<´>´@ÅBÔDèFIK/M>O:Q.SúT­V#XcYQZßZ[”Z–YçWzU?R0NN@`BiD„F—H²JÆLÔNÚPËR¡T[VØW+Y$ZÊZýZ±ZÐYBXVèR OAJ¥D5>ÿ6&/Â& WïúóÃë<å}ßÚyÖ%ӒЩÎWÍ“Ì8ÌJÌ£ÌFÍ Î!ÏRЗÑþÒwÔÖ¤×QÙ ÛÙܯޒà†âäŠæ¢è»êììïZñ¢óèõ8ø…úËüÿA^a:âP p 6 š { Ý   ½1äéþ/úÕôâîxè´áÅÚÍÓ Í˜Æ²Às»ù¶^³¦°Õ®ì­Ì­x®Ä¯¨±´¼¶Å¹½gÀÞÃmÇóÊÎÒuÕÝØ2Üvß«âÇåØèÒë»î•ñXô÷´ùHüÑþE³ ^¢ Ø +KZiij_R@!(#%ò&Ø(µ*š,v.\0?2%46ý7ð9ì;å=ï?õADF/HIJ[LpNrPlRFTVWëXöY­ZúZÅZZ—XVSÙO>KÌE„?s8¼0l(ÁÓÞ ‘ü‹ô+íwæ–àÛ>×ÄÓ Ñϖ͵ÌGÌFÌŽÌ(ÍðÍòÎÐZѶÒ.ÔµÕR×üصÚ~ÜQÞ5à!âä"æ6èRê{ì­îéð-ósõÃ÷úYüœþÑóûÚ 8  ‰ ‚  ß # ³‘´ÿ"ûåõð»éãÜ*ÕOÎÔÇÎÁh¼Î·´ ±#¯ ®É­J®~¯A±Œ³.¶.¹]¼½¿3úÆEÊÓÍRÑÍÔ1Ø’ÛÑÞâ.å?èAë*îñÐó‹ö/ùÎûOþÏ:˜í0 l ŸÁãôðâ Ê"³$“&}(V*=,.ý/à1É3­5¡7Ž9‡;†=„?’AC±EÈGÝIõKN P RéS­UGW¦XÈYŒZóZÔZ6ZèXñV1T P0LïFÈ@ç9G2*|!–¤Æ8þö”îÁç³áuÜ ØiÔÑ`ÏÙÍÛÌ[ÌAÌÌ ÍÈÍÀÎÙÏÑrÒãÓiÕ×§Ø`Ú#ÜôÝÖß¾á¹ã¼åËçéé ì?îwð¸òõI÷œùáû+þ_ˆ’7Á ü è t †   | 43z üíö8ñöêWärÝ}Ö¡Ï ÉîÂk½¤¸±´¡±x¯5®Ë­&®<¯á°³¬µ¸Â»¿‰Â Æ—É"ͦРԌ×éÚ3Þmá”ä¨ç®ê›ízðHóö±øIûÖýTÁ%x ý 4W{Žž£¤Ÿƒ m"Q$>&(*Ù+Â-/„1j3O5A7,9'; =#?,A3CME[GwIŒKžM©O¦QŠSYUõVgXYkZãZáZ\Z3Y^WÇT]QMH BI;Ñ3º+0#Zc‚áÿ©÷ð éÚâqÝáØÕÒÄÏ!Î ÍnÌFÌpÌì̢͎ΤÏÚÐ/ÒÓÕµÖRØ ÚÌÛ˜Ýxß]áWãUåcçéœëÓíðIòŠôÜö ùsû²ýóÿ/är ¾ ¾ W ‡ 3 T Ñ ¬Ë:íüò÷Vò1ìŸåÇÞÓ×ïÐKÊÄs¾‚¹hµ*²×¯f®Õ­®ÿ®‡°¢²$µ¸»n¾ÚÁ^ÅèÈsÌùÏuÓãÖEÚÝÑà÷ãçê íîï¼òõ)øÌúXýÙÿL­P ‘ Å ñ+4D>?/$ "ô#ß%¼'£)+c-A/)13ö4Û6Ñ8Ä:¼<Á>Ä@ÐBãDóFI K:MAOCQ.SýT§V XXYEZÐZèZ~ZsYÈWNURýMIFC¤b@hB{DŒF¤HºJÑLÛNÞPÎR£TXVÕW!YZ»ZéZšZ±Y"XÙUÂRÚNJrD>Ì6ô.’&Ùé ;áúøòÂë<å…ߟڈÖ:Ó§ÐÀÎqͪÌQÌa̶ÌaÍ.Î;Ï_Ð¬Ñ Ó‡ÔÖ¯×`ÙÛäܼÞàâŒä’æªèÆêòì$ïañ¥óîõ:ø†úÍü ÿ=XV-Ò= S  o X « l †î£žþçù‰ô—î-èmáƒÚ”ÓÔÌqÆÀ\»î¶X³¬°ã®þ­æ­”®å¯Ê±&´ß¶é¹"½‰ÀÄŒÇËŸÎÒ‘ÕöØJܑ߿ââåêèëëÎî«ñlô$÷Æù]üáþ[Ãq° ï BYly{zqbR!7#%%'é(Æ*§,‹.h0R234!6 8:ö;ù=ú?BD#F;HSJeLvNzPlRITVWâXëY ZãZ²ZäY|XUVgS¬O K›EO?B8ˆ0@(’®¿ ó~üô!í~æ™àŒÛN××Ó!ÑϪÍÐÌ^Ì\̧Ì9Í ÎÏ&ÐjÑÉÒ;ÔÇÕ^× ÙÃÚŠÜ\ÞAà+â)ä+æ@èZê‚ì·îíð4óyõÅ÷úZü™þÎíñÑô õ e [ Ó « ëuMmÿ×ú—õÅïkéÀâ×ÛéÔΤǫÁP¼¾·ý³ ±2¯®ã­g®¯d±®³R¶S¹¼à¿SÃÝÆdÊñÍoÑéÔMØ©ÛíÞ&âFåWèVë@îñäóžöFùÜûgþÞNªþB ~ °Óõí ß"Â$§&‰(j*K,,. 0ñ1×3À5®7Ÿ9—;“=•? A¨CÁEÎGìIüKNPRêS®U?W¤X¹Y‚ZÜZÁZZËXÌVTsPL¸F™@®92ç)M!p€¬"þ öîÁç¸á‚ÜØÔ Ñ{ÏîÍ÷ÌnÌ^Ì‘Ì"ÍÚÍÖÎìÏ+уÒòÓyÕ×·ØkÚ1ÜÞâßÈáÅãÄåÕçòéìFî~ð½òõP÷›ùäû(þ\ƒ‰r)¬ æ Ì P ` ñ é G öî6Áû£öíðªêä.Ý@ÖiÏàÈÈÂS½‘¸«´¢±ƒ¯G®á­C®X¯±4³Ïµµ¸ä»4¿«Â*ƸÉ>ÍÅÐ:Ô©×ÛLÞˆá¨äÄç¿ê²íð]óöÄø[ûëýd×4ŒÔ Fj‰£ª·¶­¥ "c$L&*(*î+Ï-¯/•1v3e5J7A92;1=0?:ABCWEgGƒI’KªM­O«QŽSWUóV_XˆY\ZÐZÎZ;ZY8WœT5QëLÑGØA;Ÿ3Š+#0CdÏÿ›÷ÿïéÞâ}ÝîØ(Õ,ÒÞÏ7Î!͈Ì[̈Ìͺ͠θÏêÐAÒ«Ó,Õ¿ÖcØÚÕÛ¨Ýßlá]ãbåkç‡é¦ë×í ðLò’ôÙö)ùoû¶ýìÿ$Ö^ « Ÿ 8 _ nŒó¥ü¥÷ òäëWå„ޒ׺ÐÊîÃT¾r¹\µ-²Ý¯z®å­+®¯°°Á²Iµ%¸C»¾ÿÁ}Å ÉÌÐÓ×[Ú«Ýçàä*ç-ê!íðÐò”õ<øßúkýìÿ^Ád   Ú ÿ#9JPTLD2 "$ì%Ð'°)‘+s-Q/8135î6ß8Ñ:Ï<Ë>Ö@ÛBðDGI1K:MNODQ3SýT¥VXPY7Z¿ZÐZfZTY¤W'UíQÌMàH Cv<5+-±$ôþ% t4ùsñbê ä€ÞÉÙÝÕ·ÒMÐÎUÍŸÌdÌzÌëÌÍvÎϰÐûÑfÓàÔqÖØÀÙ~ÛJÝ%ßáýâùäçé=ëgíœïÙñ ôeö³øýú?ý~ÿ¦º±y f s  \  R ï Þ$ª„ý£ø(óíŸæÕßìØÒaËÅb¿Vº¶º²G°­®ú­®à®X°T²Æ´–·¥ºë½SÁÐÄXÈãËhÏèÒTÖ¹ÙÝIàtã’æ—é‘ìtïHò õ»÷\úîürÿäJ§ð6 i •ºÓãïíïàÔ¿!ª#%q'V)1+-ô.Ù0¼2£46}8p:ln@wB…D›F­HÆJÕLäNâPÓR¢TUVÑWYZ§ZÖZ€Z“YX±U—R«NâI?DÍ=™6Ã.f&¬ÇÞ )Ëúôò»ëBåß­Ú˜ÖOÓ¼ÐØÎˆÍÃÌhÌxÌÐÌrÍFÎLÏrоÑÓ–Ô!Ö¾×kÙ&ÛðÜÅÞ«à—â–äžæ¯èÐêùì+ïjñ¦óöõ9øŠúËü ÿ:NOÃ& > ú U ( 5 M°`Wþù=ôMîâç+á>Ú]Ó ÌIÆpÀG»à¶X³°°ó®®®®®°ì±I´· ºG½¨À%ĨÇ3˼Î9Ò¬ÕÙfÜ¥ßÜâóåéýëæî¼ñ‚ô6÷ÚùqüôþmÓ3~É ú -Nm|‹Œ‰ƒsa!L#/%'ö(Ø*¸,š.z0_2F4-68:<>@BD2FFH\JoL}NPqRJTVˆWÜXßY‘ZÒZ–ZËYWX3V=S}OÝJhE?8R0(e‹› Þhüyôí}æ¤à–Û_×êÓ7Ñ2ÏÅÍåÌwÌtÌ»ÌTÍÎÏ:Ð{ÑÙÒLÔÓÕo×ÙÑÚ”ÜjÞIà8â1ä5æHècêŒì»îöð9ózõÍ÷ú^ü—þËæèÅpß Ô G 1 ¦ y °8 &ÿŽúLõxï$évâ˜ÛªÔîÍvÇ‹Á7¼±·÷³(±;¯.®ü­ƒ®½¯ˆ±Î³|¶p¹©¼ý¿zÃùÆ†Ê ÎÑÕiØÃÛß=â^åmèlëWî1ñùó²öWùóûwþô^¾V Âä'() ÿ ñ"Ï$½&–(~*Y,=.02ç3Ð5¼7±9¤;¥= ?¯AµCÊEßGñI LNPRîS­UÒöÏMÎ;ÍŸÌsÌŸÌÍÎÍ´ÎÌÏûÐSÒ»Ó;ÕÏÖpØ$Úâ۲݌ßváhãkåuçé°ëßíðSò•ôàö(ùrû²ýëÿÆL “ …  = Ú ó d 3J¯[ü^÷¼ñžë åCÞQ׃ÐëÉÊÃ5¾c¹Rµ/²ç¯†®®@®;¯Ë°ç²lµK¸e»µ¾ Å'ɱÌ1вÓ×|ÚÂÝþà,ä<çFê6íðèò£õVøíúƒýûÿrÓ*u ´ è 3KZcc`RF ."$ý%à'Á)¢+-e/D1,35þ6í8á:Þ<Ø>ã@éBúDGI:KDMSOIQ6SüT£VXFY+Z­Z¾ZHZ8YWU¿QŸM«HÜBB<é4ù,‡$Æâ fùrñZêä‰Þ×ÙïÕÌÒaОÎhͽÌwÌ•Ìÿ̨͈ΕϿÐÒsÓðÔÖØÎÙŠÛWÝ.ßáãåç!éFëní¤ïÞñ#ôiö¶øüúAýxÿ¡µ¤m R V ü 5 ñ # · £ãf9ýZøÙòÑìSæ’ߪØÎÑ/ËíÄE¿Aº¶»²L°½®®)®¯v°x²ë´¸·Êº¾uÁóÄwÈÌ‚ÏÓnÖÔÙ ÝbàŒã¨æ®é¥ìŠï\òõÎ÷púýÿüY» H | §ËãöýüôãÒ!¹# %‚'e)D+&-/é0Ì2µ4ž6Œ8‚:vy@†B”D£F¼HÌJáLëNèPÔR¥TQVÏW YZ˜Z¿ZhZtYÞWŠUlR|N°I D˜=f6.6&…Ÿ ¼úéò¸ëFå”ß¼Ú§ÖeÓÒÐïÎ£ÍØÌ„ÌÌæÌ‰ÍZÎ_φÐÌÑ0Ó¤Ô1ÖÍ×yÙ3ÛûÜÔÞ²à¦â䩿¸èÚêþì4ïoñ­óøõ>øŠúÎüÿ6HD± $ Ý ,  O m þVùíóîšçààÚÓpÌÆPÀ1»Ó¶V³¶°ÿ®&®®Î®(° ²o´'·0ºk½ÌÀEÄÉÇTËØÎXÒÆÕ,Ù~Ü¿ßòâ æéìûîÑñ–ôJ÷îùƒüÿ€çC”Ó  8eyšŸš“ƒr!\#A%'')ì*Ä,¬.‰0p2T4A6*8!:<>@B0D9FTHdJyL„N„PvRHTVWÕXÓYZÀZ}Z®Y7XVSLO¯J2Eë>×7'0ß'@` À[üjôí€æ«à¦Ûk×ÔIÑLÏÛÍý̑̉ÌÖÌcÍ4Î)ÏNÐŒÑèÒ^ÔáÕ~×!ÙÞÚ ÜwÞTàBâ<ä=æTèiê”ìÂîüð<óƒõÉ÷úXü–þÆßÞ·^Ì î ¹  u G uùÇßþBúõ'ïÞè-âVÛpÔ¸ÍMÇiÁ!¼£·ò³/±B¯H®®¤®Ú¯«±ò³ž¶–¹È¼%À•ÃÇ Ê-ΪÑÕ‡Ø×Û"ßRâuå„è‚ëjîGñ ôÇökùüŒþqÏ!h Ÿ Ôõ(5;91$!ý"ä$È&ª(‹*j,N.,02÷3Þ5Î7½9³;²=°?ºAÆCÓEêGýILN"PRòS¨U;W’X§Y`Z¸Z’ZÞY‰X‚V²SP¡KSF2@F9´1†)ø ">yûýõõ‚îÄçÆá™Ü9Ø¢ÔÏÑ¥Ï!Î%ͣ̈ÌÄÌHÍ Î÷ÎÐIѪÒÔ™Õ(×ÕØÚKÜÞ÷ßàáÖãÙåççê%ìRîŒðÇòõU÷žùçû!þYtx[‡ ³ –  ” ‡ Õ|j¨ÿ/û öSðê|ãªÜÃÕφȂ½r¸ ´¦±š¯g®®z®™¯G±³¶¹$¼€¿éÂoÆóÉ~ÍûÐvÔÛ×5Û‚Þ±áÝäìçîêÝí¸ð…ó?öéø„ûþŠú[­ù 3 g®ÂÑØÖÑõ "‰$i&N(-*,î-Ò/±1˜3‚5l7^9Q;M=N?SA_ClEƒG”I§KºM¸O¶Q‘SUUïVPXuYAZªZ¢ZZ×XðVLTÙPLiGqA°:63,+¨"ãý.¢ÿ÷ñï éëâÝÙLÕVÒ ÐeÎS͸̸̋Ì,ÍâÍËÎÚÏÑaÒËÓKÕÚÖØ,Úñۻݚß~átãrå~ç˜é·ëäíðUòœôàö-ùpû²ýçÿø¹7 | g ù  ´ » 3 ó jü÷pñUëÄäýÝ×IÐÂɣþM¹Qµ,²ô¯—®®]®V¯ñ°³”µi¸‹»×¾?ÂÁÅDÉÐÌNÐËÓ2×’ÚÝÝá@äVçZêLí,ðûò¹õføû’ý…á@„ Æ û #D^hutmgR @")$ &ñ'Ð)³+-v/S1:3#5 7ý8ð:ë<ç>ñ@õBEG,IAKNMWOQQ4SÿTŸV X@YZZ¨Z,ZYWWàTŽQuMvH¬B <»4Æ,]$Ÿ¾è Kùcñcêä˜ÞæÙÖãÒxг΅ÍÐ̪̔Ì;͛ΧÏÓÐ!ÒÓÕŠÖ.ØÛÙ”ÛfÝ5ß$á ãåç-éLëtí«ïäñ&ôqö²øû<ýxÿš­˜_ë> : Ý  Ç ò € j #òüø‘ò„ìæMßlؘÑÿÊÇÄ)¿-º ¶»²R°Ð®"®G®¯›°—²µ×·ñº.¾™ÁÅ˜È Ì¤ÏÓÖèÙ<Ýxà¢ãÁæÃé»ì ïmò7õÞ÷†úý—ÿ qÈ T ¶Þò  òã!É#±%’'v)U+3-/ó0á2¿4°6š8:ˆ<„>‹@B D±FÃHÙJçLòNìPÙR¢TRVÅWYöY„Z¯ZIZ[YºWcUARON}IÛCc=56`. &\|¤ ú¬úáò¸ëHå¡ßÈÚ¾ÖtÓïÐÏÀÍíÌŸÌ¡ÌÍ›ÍpÎrÏ—ÐÞÑ?Ó´Ô?ÖÜׂÙDÛÝÝÞÀà­â©ä°æÂèàê í7ïtñ³óüõAøŠúÌüÿ/D7žú ½ Ö Ë Ù.ÚÅý ù¥ó¶íNçžà¾ÙæÒ>ÌõÅ1À»É¶R³¾° ¯9®5®é®I°0²´N·Qº‘½êÀjÄçÇsËõÎrÒãÕEÙ™ÜØßã%æ0é*ìïæñ«ô\÷ú”üÿ“öY¡ë Mrž®­­¡˜€!o#P%6')ø*Ø,».˜0‚2a4Q6;8-:(<>(@(B=DEF`HmJLŒNˆPyRJTüU‚WÇXÊYoZªZeZ’YXæUéROJþD¸>¦7ó/³'@] ¬Hü`ôí„æ°à´Û~×ÔbÑ`ÏõÍ̠ͪÌíÌ{ÍGÎ>ÏaМÑýÒjÔóÕŠ×1ÙéÚ°Ü~ÞaàLâCäJæYèsê›ìÊîñCóƒõÐ÷úZü”þÁØÔ«Kº Ñ û â H  =¹ƒ•þûùµôßî‘èæáÛ5Ô‚Í$ÇFÁ ¼“·ñ³0±T¯V®+®¼®þ¯Ë±´Â¶»¹ì¼GÀ¹Ã<ÇÃÊJÎÆÑ;ÕžØõÛ8ßlâ‹åœè”ë„îWñ%ô×öùüžþƒà5w ³ ä(8HKJD3%! #ö$Ù&º(*{,].>0 2 4í5Ý7Ì9Å;¾=À?ÆAÑCåEñG JL%N'PRòS¨U7WŠXœYPZ§ZxZÃYgX]V‡SíOpKF@91W)É û\êýæõ}îÄçÍá£ÜKØ´ÔäÑ¿Ï5ÎAÍ·Ì£ÌÙÌaÍÎÏ$ÐbѵÒ#Ô¥Õ:×ÞØ“ÚSÜ'Þþßíáßãäåðçê0ìWî“ðÏòõ]÷žùêûþWkrMúr š y ç î f T œ=(bÿáúÇõðÑé3ãeÜŠÕÇÎ[È^½d¸˜´«±£¯{®(®˜®·¯i±¢³5¶)¹G¼£¿ ÑÆÊžÍÑ“Ôö×QÛ˜ÞÍáóäèëïíÑð–óVöûø˜û!þŸ o¾ C yž¿ÒäçèâÓÆ ®"˜$y&a(<*!,þ-â/Â1©3Ž57h9f;W=`?_AkCzEGžI²K½MÂO¶Q–SSUêVLXgY5Z˜Z‰ZìY¶XÊV&TªP_L7G>Ay:3÷*€"¶Ýÿt÷éï éòâšÝÙ^ÕkÒ"ÐÎjÍÑÌ¢ÌÎÌDÍøÍÞÎïÏ!ÑuÒÙÓ\ÕåÖ’Ø7ÚÜÆÝ¥ßˆáãzåŒç›éÄëéí!ð]òžôçö,ùrû±ýãÿ êª$ d L Ö ë ‡ Œ ÷¹Ç#ËûÅö(ñë}ä¸ÝÙÖÐ’É~þ<¹Hµ/²ú¯©®,®z®t¯±)³·µŽ¸¯»÷¾dÂàÅeÉïÌlÐåÓRרÚùÝ.áXälçqê`íAðóËõ}øû§ý"–÷Nš Õ 3Yi€ˆtg N"=$&(à)Ã+£-ƒ/e1K32579þ:ú<ø>û@CE&G5IKKXM\OUQ9SüTžVX4YZ‰Z’ZZüX5W´TdQBMIHsBÚ;…4—,-$v™Ë 4ù^ñ\êäÞöÙÖùÒ‹ÐÍΚÍį̀ÌÄÌ)ÍÕͰκÏåÐ2Ò“ÓÕ™Ö<ØèÙ£ÛoÝDß*áãå!ç4éUë{í³ïèñ.ôqö¹øû=ýtÿ•¦ŒSØ(  ¾ ê œ à G 1\â¥üÇ÷Cò:ìÅåß-Ø^ÑÎʢĿºþµ¼²[°Ü®;®_®=¯¹°½²3µÿ·»X¾´Á9Å´ÈAÌÀÏ<Ó£Ö ÚOÝ–à¸ã׿ÛéÐì¶ï‚òIõô÷–ú)ý§ÿ‚Ú) i ž Ìí& ñ!Ý#½%§'‚)h+D-'/1ì2Ò4¾6ª8 :“<˜>‘@¦B¦DÁFÍHáJòLõNôPÚR£TPV¾WYåYyZ–Z1Z=Y•W>URNOI¤C4=ý52.Ø%1Zƒ å˜úÙò´ëLå©ßÔÚÏÖŠÓÑÏÒÍͶ̹ÌͰ̈́ΆϫÐïÑQÓÂÔPÖæ×”ÙLÛÝèÞËàµâ¶ä¶æÍèçêíAïxñºóýõFøŠúÍüÿ,9.öŽå ï ž ä ­ ñ – žï“ý¾øZóiíçVàÙ¬Ò ÌÌÅÀ»Â¶L³É°¯S®I® ¯g°S²¶´o·wº±½Á‰ÄÈ‘ËÏÒÿÕ_Ù³Üïß"ã;æGé?ì'ïùñÁôq÷úªü,ÿ¤ h·ú 2 `„Ÿ±¼À¾²©!#_%I'&) +è,Ê.ª0Ž2v4Z6P88:8<.>2@:BCDXFdH|J†L”NPyRMTúU|WÁX¼YaZ’ZPZrYòW¿U¾RóNLJÏD‚>v7¾/ˆ'ç@ ‘9üTôíƒæ½à¿Û×(ÔxÑxÏ Î/;̻ÌÿÌ•ÍXÎTÏnгÑÓ|ÔÖ–×@Ùôں܊ÞjàWâMäSæ`è}êŸìÓîñFóŒõÍ÷úUü“þ»ÔÇŸ:£ » | Ù »  à zEMþ³ùlô•îIè¥áÑÚýÓSÍùÆ*Á󻉷í³7±`¯k®B®Ü®°í±:´ä¶à¹ ½iÀÙÃ\ÇáÊgÎâÑUÕºØ ÜO߆âŸå³è©ë˜îmñ9ôêö“ù)ü±þ*•ôBŒ à ó3NV\\PI2!#%æ&Î(ª*,l.L0124ü5í7Ú9Ò;Î=Ì?ÓAßCìEÿGJL0N&PRïS§U3W‚XYEZŽZeZ¤YIX4VeS¼ODKïEÌ?á8S1()£ ×ÿF×ýßõyîÇç×á¯Ü\ØÉÔùÑ×ÏMÎYÍÏÌ»ÌïÌuÍ2Î!Ï9ÐrÑÃÒ7Ô°ÕJ×騡Ú^Ü1Þ àöáèãíå÷çê3ìbî•ðÔòõ]÷¢ùäû!þMidAê\ „ X Ç Ä : ! eÿçÿœúzõ»ï†éðâ%ÜMÕ–Î0È?Âî¼U¸•´°±®¯‘®<®·®Ó¯Ž±Á³\¶F¹p¼½¿3éÆ6ʶÍ7Ñ©ÔØfÛ³Þâá åèëîáð®óföù©û5þ°|Ô X …´Êèðú÷ôãØ ¾"§$&k(S*+,.ð/Ò1¹35Œ7{9o;l=g?pAvCˆE•G«I¹KÅMÇO¹Q˜SQUèVCX]Y&Z…ZsZÐY—X§VúSƒP+L GAM:Ò2Í*T"’¿÷|ÿi÷äïéóâ­Ý)ÙwÕ~Ò;З΂Íè̼ÌâÌ^Í ÎóÎÐ3Ñ„ÒëÓgÕùÖ™ØHÚ ÜÑݱߒá‰ã„å‘ç¦éÇëóí#ðfòžôîö)ùtû¯ýÞÿþᘠL / µ Å Z Y Á{ˆÞÿ‚û|öÜð¾ê6äwÝœÖàÏeÉ\Ãê½-¹Aµ1²°¹®E®“®•¯1±O³Øµ²¸Ó»¿ˆÂÿÅ…É Í‰ÐÔk×ÂÚÞDápäçˆêuíVð$óàõø(û¹ý4§ _¬ æ Cj{’˜‘„y ^"L$,&(ò)Ñ+´-/x1X3C5*79 ; =? AC#E+GEINKcM`OZQ:SûT›VX)YZxZ}Z÷YßXWT9QMHEB¥;W4f,$Quµ ûøVñ]ê!äªÞÚ'Ö Ó§ÐãδÍÍ¿ÌÝÌ>ÍìÍÂÎÎÏ÷ÐBÒ¦ÓÕªÖGØôÙ°ÛyÝPß4á$ã!å)ç=é[ë„í¶ïðñ1ôrö¿øúúCýjÿ––…@Ç  š Æ q  ó›_ü{÷øñòë{åÆÞî×(Ñ Ê}Äì¾ ºõµ¼²e°ì®O®{®Z¯Û°ß²Uµ#¸5»v¾ÜÁSÅ×È^ÌÝÏWÓÂÖÚnÝ©àÒãìæðéçìÈïšòXõ ø¦ú=ý¹ÿ.•ì9 | ­ Þý(121$ "é#Ó%³'”)w+V-6/1ü2á4Î6·8±:¡<¦>¡@¬BºDÆFÛHéJ÷LÿN÷PÜR¥TIV½WòXÛYfZ€ZZYvWUëQóMIxCú<Ô5û-²%9g ÎúÐò´ëPå´ßåÚÞÖ¢ÓÑ5ÏîÍÍÏÌÐÌ-ÍÈ͖ΜϺÐÒ^ÓÔÔ\Ö÷ןÙXÛ ÝñÞ×à¿â¾äÁæÔèíêíCï€ñ½óÿõJø‡úÎüýþ&1$æÉ × ~ ¿ † » f ]¶L:ýsøó#í½æà?ÙtÒàË£Åø¿ñº³¶Q³É°+¯a®f®)¯„°y²Ö´“·ºÐ½5Á¥Ä*ȯË1ϪÒÖwÙÎÜà:ãQæ^éRì;ïòÔôƒ÷*ú¸üCÿ´ wÉ B s“²ÀÎÏÎͤ!Œ#t%W'8)+ù,Ø.½0œ2†4j6^8H:F<:>A@EBSD^FrHƒJL›N’P~RLTúUtW¼X¬YSZ~Z7ZUYÓW•U™RÄNJœDP>C7’/W'Áô$ z(üMôí‡æÅàÊÛ¤×8Ô‘ÑÏ&ÎIÍÕÌÓÌͨÍpÎdÏ„ÐÂÑÓÔ Ö¨×KÙÛÅܘÞsàbâXäYæmè€ê­ìÕî ñLóõÓ÷úWüþ¹ÉÀ+Œ ¢ _ µ ‘ é « É?ü þeù!ôMîüçcáŽÚÄÓÍÑÆÁß»{·é³<±l¯®[®ø®=°²^´·º3½ˆÀþÃzÇË„ÎýÑrÕÒØ(ÜhßšâºåÈèÁë¬î‚ñJô÷¤ù>üÃþ=¥TŸ Ó )J[hnifUF!0#%û&Ù(¾*š,}.]0@2&4 6ú7ì9Ý;à=Ö?åAéCøE HJ.L0N3PRóS¦U.WzX†Y3Z|ZMZ„Y-X V;SŽOK¿E—?¯81ü(v ±Þ,ÃýÓõtîÉçÜá½ÜiØÝÔÒíÏiÎkÍíÌÎÌ Í‹ÍFÎ5ÏMЀÑÚÒ>ÔÈÕQ×üبÚoÜ9Þàýáõãõåèê;ìjî›ðÛòõa÷¢ùçûþIcZ5ÙF m : ¦ › î ,äÖþSú.õrï:éªââÛÕbÎÈÂÕ¼H¸Œ´µ±¹¯ ®X®Ï®ö¯­±å³¶j¹”¼à¿SÃÌÆSÊÕÍUÑÃÔ0ØÛÌÞûá!å0è.ëîôðÄóyö%ù½ûFþÅ-”â- i ˜Ãàõ ÷æ Ï"º$™&(]*@,.ÿ/ä1Ç3®5œ7‡9‚;w=v?~A‚C•E GµIÄKÊMÐO¼Q™SRUâV>XSYZsZ[Z¶YvXƒVÑSTPÿKÖFØ@:£2›*'"lšÞeÿ[÷Þïéüâ´Ý8ÙŠÕÒUЬΛÍÍÓÌúÌrÍÎÏÐEÑ”ÒûÓyÕתØSÚÜàݸߟá’ãŽå›ç¯éÎëúí-ðgò§ôíö1ùrû­ýÜÿöúÔ‰þ4  ¤ ( , ˆ@F—ÿ:û2ö’ðrêñã0ÝeÖ¤Ï=É1ÃÓ½¹9µ5² °Ì®X®±®²¯S±r³ûµØ¸ô»>¿¦Â ƨÉ%Í«ÐÔ‡×ÜÚ*Þ]á†äšçœê‹ímð6óöõ¡ø<ûËýI¸oÀ ö 1Vx‘œ¨¥¢•‡ r"Z$?& (*à+Ä-¢/…1i3Q597,9;=?AC+E°@»BÃD×FáHõJMOýPÞR¦THV·WëXÍYVZkZZýXUWëTÄQ¿MïH?CÌ<œ5Ì-%ÞL ²{úÈò«ëWå·ßòÚñÖ°Ó.ÑMÏÎ>ÍÞÌìÌBÍÚͰΪÏÏÐÒmÓåÔjÖجÙfÛ*ÝÿÞáàÌâÇäÊæÝè÷êíLï‡ñÀóöHøŒúËüüþ -Üh» ¹ a š X ’ . %vóü+øÄòÕìyæËßÙ:Ò¬ËÅӿ㺥¶R³Î°;¯t®„®B¯ª°—²û´¸·¼ºø½TÁÉÄHÈÎËMÏÉÒ4Ö“ÙäÜ!àPãjæséhìRï!òéô™÷;úÐüRÿÉ/× R …¤ÂÒßààÓɲ!Ÿ#„%g'I)'+ -é.Ê0®2“4{6j8Z:PK@TB^DkF}HŒJ˜L¡N—P‚RKTøUpW±X¥Y?ZlZZ8Y¯WsUiRšNêIkD>7_/('—Î `üBôíŠæËàÛÛ®×QԣѦÏ>Î\ÍòÌåÌ1ͻ̈́ÎxϘÐÒÑ+Ó›ÔÖ¸×TÙÛÎܤÞàkâbädætè‹ê°ìÝîñOó‘õÕ÷úXüŒþ²Å´ƒw ˆ B k º w ‘¸ÉýùÜóþí¸çáRÚ‰Óí̪ÆåÀÌ»l·é³?±|¯Ž®v®¯^°1²´,·%ºT½®ÀÄœÇË¡ÎÒÕêØC܀߳âÑåÜèÙëÀî—ñ_ô÷¹ùQüÓþR¸h­ æ ;[k{|~sgU!@#$% 'ê(Ë*®,‹.m0P2546 8÷9ñ;è=é?ïAõCFH'J1L9N9PRøS¡U+WsXxY$ZlZ.ZqYXïUSbOåJˆEh?{8í0Ì(L ˆÁ³ýÆõoîÈçäáÈÜxØñÔ#ÒЄÎÍÍäÌ Í Í\ÎHÏ`Ð’ÑèÒRÔÑÕf×Ù»ÚuÜIÞ à âýãÿå è#êAìpî£ðÝò õ_÷©ùâûþEYV"Ï. W  ƒ u ß º õƒc‘þúèô"ïöèaâ¤ÛÖÔ0ÎÙÇûÁ¾¼8¸´³±É¯²®m®ï®°Ñ±´¤¶Ž¹´¼ÀqÃïÆpÊôÍqÑáÔHØšÛãÞâ8åFèEë1î ñÔóö6ùÐû[þÔC¡÷< z ¬Òò õ á"É$«&Ž(o*O,/.0î1Ü3¸5¯7•9;ƒ=‡?‡A”C›E°G¹IÏKÑMÕOÁQ—STUÛV8XGYZbZBZ›YUX_VªS)PÏK¦F¥@â9t2j*þ!D{ÂVÿJ÷ÜïéãÃÝEٜէÒgÐÉήÍÍçÌÍ…Í6ÎÏ'ÐVÑ¦Ò Ô†Õ×±ØfÚÜíÝÂß«á™ã›å ç¸é×ëî2ðkò®ôëö6ùnû­ý×ÿïðÊvð ü m { ø QUÿòúèõKð(ê¬ãñÜ$ÖyÏÉô½¹4µ5²°Ý®n®Î®Î¯v±’³¶ú¸¼_¿ÈÂ@ÆÃÉFÍÄÐ9Ô×úÚ>Þyá›ä±ç°ê¡í€ðKó ö´øOûÞýZÌ,„Ì >hŠŸ°µ¸±¨– "l$L&4(*ó+Ò-±/•1x3^5L769,;$=?'A'C;EBGVIdKnMmOcQ;SüT’VóWYæYUZPZÃY XÊV>TåP¶L·GÞAD;ó3 ,¬#5| ÷ÞøGñ^ê(äÂÞÚMÖ2ÓÕÐÏåÍ3ÍîÌ ÍjÍÎêÎôÏÑdÒÃÓ=ÕÄÖdØ ÚÊÛŽÝhßGá:ã1å<çKékë’íÁïüñ7ô|ö¾øýú=ýgÿ‡‰j& ã Ë [ |  3 §}¡Óûêöfñ`ëñä@Þv×½ÐFÊ4ĸ¾é¹èµ½²w° ¯{®®®—¯±%³›µh¸z»º¾“ÅÉ—ÌÐŒÓ÷ÖTÚšÝÝàüãçêíòïÁòõ1øÍúbýÞÿR·[ ž Ï  7KPUQC< "$ì%Ø'²)—+t-U/7135ë6×8Ë:À<¿>¼@ÉBÌDáFíHüJM OQáR£TFV¯WâXÀYEZVZæYáX1WÇTšQ“MÁHCŸY@_BkDtF‰H“J¡L§NšP…RKTõUkW§X˜Y.Z[ZZYWNU@RnN»I B ZÂx€ý×øŽóºípçÙàÚOÓÀÌ€ÆÊÀ·»a·æ³F±ˆ¯¤®®1¯{°R²£´L·Kºs½ÍÀ?Ä·ÇA˹Î;Ò¡Õ ÙTÜœßÈâååóèìëÔî®ñoô(÷Íù_üìþ]Ï$|¼ ù (Jl{Љ‡th!M#6%'ü(Ú*¼,™.~0^2E4+68:ü;÷=õ?úADF!H*J?L:NAPR÷S¢U!WoXjYZWZZRYäWÈUæR9O´J\E6?N8»0¥(! k¡ü¢ý¾õoîÊçñáÑÜØÕ<ÒЙΞÍÍüÌ6͵ÍpÎ]ÏmШÑõÒbÔàÕp×ÙÂÚ…ÜQÞ,àâ äæè%êMìrî©ðâò!õc÷§ùäûþBQI¸ : ` K µ † ¿G"MþÄùœôßî®èâfÛžÔγÇÙÁ¬¼*¸Š´»±Ó¯Æ®…® ¯4°ï±,´Â¶µ¹Ó¼(ÀÃÇÊΈÑÿÔ^ØµÛøÞ*âNåZè[ëCî!ñçó¡öIùâûkþæT³N Š ¼ã&(+#!í"Ú$º&Ÿ(*[,B.02â3Î5¹7¤9ž;’=”?”ACªEµGÉIÐKÝMØOÃQœSKUÞV,X=YûYLZ/Z€Y4X?V€SþO£KvFt@¶9@2D*Ô!!_ªDÿD÷Ôïé ãÎÝXÙ®Õ½Ò€ÐÝÎËÍ0ÍÍ+͘ÍNÎ+Ï:ÐkѲÒÔ“Õ#×ÁØnÚ-ÜõÝÐß±á¥ã¢åªçÀéÞëî:ðnò²ôïö4ùrû¨ýÕÿèæ½g× Ø P R Ó Ç ÇÆÿ­ú õðâégã²ÜìÕDÏáÈõ½¹.µ9²&°é®Œ®â®ó¯“±¶³@¶¹9¼€¿èÂ`ÆáÉdÍßÐPÔ»×ÛYÞá³äÄçÇêµí’ðaóöÈøbûïýlÛA‘â  Sw›­ÂÅȶ¨ "|$\&B("*,ß-Å/¡1ˆ3n5W7I95;4=,?1A7CBEPG_ImKrMxOaQAS÷TVíW YÙYBZ:Z¨YX©VTºPˆL†G¯A;Â3Ü+€#Ýb ãÑøEñ[ê2äÊÞ/Ú_ÖIÓéÐ+ÏûÍKÍ ÍÍ‚Í*ÎûÎ Ð*ÑtÒÖÓIÕÕÖoØÚÕÛœÝqßRáCã=åCçTésë™íÇïò;ôöÁøýú9ýeÿa‘É ± : T ï þ r@`ÎÿŒûžöñë¨äÞ8ׇÐÊÄž¾×¹âµ»²ƒ°¯’®È®¶¯9±I³»µŽ¸œ»Ý¾@²Å7ɳÌ7ЦÓ×kÚ·Ýðàä.ç3ê$íðÔò—õBøâúrýðÿfÈ!o ­ ã 2F_^h`TI 2"$&ã'Æ)£+‡-e/D1-3 5ü6ä8Ø:Ð<Ê>Í@ÒBÛDêF÷HKMOQáR§T?V¬WÕX¶Y1ZDZÈYÅX W¥TjQiMHßBk<95s-(%”Ï ‹_ú¸ò¯ë]åÐß Û×ÚÓ\ÑyÏ5ÎhÍÍÍpÍÎØÎÎÏöÐ3ÒŽÓÕ„Ö"ØÄÙ~ÛCÝßõààâ×äÞæëèë-íVï’ñÉó öJøúÆüøþ¼G‹ ƒ % L + ɰõ‰aü ÷0òHìëåJ߇ØÒÑOË6Å ¿¹ºš¶K³ä°T¯ ®´®~¯é°Ú²?µÿ·»;¾•Á Å†È Ì†ÏÿÒiÖÅÙÝOàã”æŸé”ìvïMò õ¿÷búòüvÿíR®ý= y ¢Çãóÿ÷æÕ!½#£%ˆ'g)I+'- /è0Ì2²4™6‡8w:li@hB{D~F“HžJ¨L¬N¤PRRTìUjWœXŒYZCZêYÿXkW(URANŠI D¸=®6/Ñ&E‹É 9ôû3ôí“æÝàõÛÒ×wÔÐÑÕÏmÎÍÍÍZÍêͩ΢ϸÐ÷ÑIÓ»Ô:ÖÎ×uÙ$Ûíܶޗà}âwätæ‡è™ê¿ìêîñYó™õØ÷úUü‡þ©´ h÷L U  I  ^  †4:ý‘øAótí'ç“àÖÙÓÌ\ƪÀ¢»W·ä³L±–¯º®£®Q¯˜°w²Ã´s·iºš½îÀ^ÄÙÇ\ËÚÎTÒÁÕ ÙrܱßàâÿåéìéîÀñ†ô9÷ßùvüúþtÛ<‰Ó  ;\|ŒœŸ”‰t!`#E%*' )í*É,®.‰0q2P4=6&8: <>@BDF*H7JBLGN@P'RõS UWdXbYZDZZ6YÂW¤U»R OƒJ,E?8‹0s(ü@‡à‘ý³õgîÑçðáåÜ™ØÕPÒ0бζÍ4ÍÍNÍÈ͈ÎnÏ…ÐµÑ ÓoÔñÕ}×"ÙÏÚ“ÜYÞ;àâäæè3êQìzî±ðâò,õa÷¬ùáûþ<KA ª ä ; $ „ T †áþ{ùSô“îeèÛá#ÛdÔÎ̓ÇÀÁŒ¼#¸´Á±Þ¯×®ž®%¯S°²N´è¶Õ¹ú¼HÀµÃ+ǯÊ.ΧÑÕvØÒÛ ßFâcårèpëYî4ñýóµö^ùôû~þùfÆ^ ž Ëö)3>78&!#ç$Ì&°(Œ*q,N.-02ð3à5Ä7¸9¨;¢=¡? A­C±EÇGÊIâKÞMßOÈQ™SPUÕV&X3YèY=ZZcYXV[SÎOvKAFD@~92*ª!ú;’-ÿ9÷Ìïéã×ÝjÙ½ÕÖÒ“Ð÷ÎâÍHÍÍ>ͳÍ_Î@ÏOÐzÑÆÒ+Ô¢Õ3×ÎØ|Ú8ÜÞØß¿á­ã«åµçÆéçë î<ðyò°ôöö4ùsû¥ýÒÿàÞ±UÇè ¿ , + ¨ “ 䉆ÆþhúSõ¹ï—é#ãlÜ³Õ Ï¹ÈΈ½î¸)µ=².°ÿ®ž®¯°¶±Ø³e¶@¹]¼¤¿ÂÆÊ‚ÍýÐoÔÔ×)ÛsÞ¤áÌäÛçÛêÍí¦ðuó0ö×øyûþ€ïQ¥ò , b‹©ÃÍÛÖÔÆ· £"Š$n&R(1*,ó-Ò/²1š3{5i7X9D;D=9??AECLE]GhIuK}MxOjQ?SúT‹VæWYÈY2Z!Z‘Y\X‡VêSPZLTG{Aß:3­+T#µñF ÐÀø>ñYê5äÖÞ<ÚqÖ[ÓÑ@ÏÎcÍÍ7Í™Í<ÎÏÐ?чÒáÓ]ÕàÖ€Ø%ÚäÛ¥Ýß[áOãCåOç\ézë¡íÍïòAô€öÂøû5ýbÿxxU€® ™  0 à Π;‹ÿDûWöÑðÏêaä¿ÝøÖVÐèÉïþɹ׵¿²‰°-¯¦®ä®Ò¯]±h³ãµ±¸½»¿\ÂØÅSÉÔÌRÐÃÓ/׃ÚÑÝá/äFçGê:íðèò«õVøõú…ýyÚ5} Á ó !A\iuvpiV F"*$&ò'×)³+—-t/V19357ö8å:ß<×>Û@ÜBêDñFI KMOQäR¥T-%i¬ù uRú®ò®ë`åÛßÛ'×ñÓnÑ–ÏG΄Í)Í-͇ÍÎëÎãÏÑFÒÓÕ“Ö.ØÑÙŠÛNÝßáèâãäåæôè ë4í]ï–ñÍóöLø‘úÂüôþö°1w g  * ß þ ‘w·EüW÷äñì¢å ßIØšÑ#Ë Å‡¿¦º¶N³è°g¯±®Ò®™¯ ±ü²cµ ¸&»]¾·Á*ŦÈ'̤ÏÓƒÖâÙ+Ýkà“ã¬æ´éªì‹ïbòõÖ÷qúýˆÿþeÁ P ‰ ³Ûðöè!Ë#·%”'{)U+:-/ù0Ü2À4ª6“8‰:wq@{BDFœH¨J¯LµN¢PŒRHTóU]W—X~YZ.ZÒYÞXMWþTïQN\I×Cˆ=z6Ó.¤&h« åû&ôí“æèàÜâ×ÔäÑîσΩÍ6Í-ÍrÍûÍÃαÏÍÐÒ\ÓÆÔLÖÙ׃Ù/ÛùÜÀÞ¥à„â‚ä{æè£êÄìôîñdó–õá÷úWü‚þ¤¬–Wé4 = ä & î 0 ÛçDôôüDøó$íäæOà—ÙâÒ]Ì5ÆŒÀ»M·á³S±£¯Ì®¿®k¯º°•²è´•·º¼½Á~ÄùÇzËøÎoÒÜÕ;ÙŠÜÊßøâæéìþîÔñ™ôN÷òù‡üÿƒòH Þ  IpŠŸ¬­°¢›ƒ!r#U%;')ü*Ù,½.›0~2b4K638':<>@BD&F4HBJHLPNCP+RôSŸUW]XRYúY*ZìYY£W}U”RÝNVJùDÏ>ë7Z0I(Í cÊý¥õgîÍçýáíܪØ+ÕcÒHÐÇÎÎÍIÍ-ÍaÍâÍ™ÎÏ™ÐÃÑ Ó{ÔÖ‹×/ÙÞÚ›ÜjÞAà)âäæ%è8êYìƒî³ðìò+õg÷«ùâûþ8C7ý›ò à  ü W " LÌ¡½ý8ùôMîè•áæÚ(ÔÍ\ÇÁy¼¸}´Æ±ë¯é®¸®@¯s°3²p´ ·ø¹½hÀÖÃLÇÌÊNÎÂÑ4Õ•ØæÛ+ß[âzå‹è‚ërîFñôÉöoù üþuÛ's ­ Ý <DLLC9&!#ø$Ü&¾( *|,`.<0"24ë5Ö7Ä9¹;¯=­?¯A¶CÀEÎGØIæKçMáOÎQ˜SOUÐVX)YÙY)ZþYGYöWòU1S£OFKF@L9â1ä)~!×zÿ,÷ÈïéãæÝvÙÔÕæÒ­Ð ÏùÍcÍ,ÍYÍÅÍuÎUÏ^ÐÑÖÒ;Ô³Õ>×ÝØˆÚDÜÞâßÉá·ã´å½çÎéïëîFðzò·ôøö5ùqû¥ýÌÿÛÓ¥E³Ð ¤   y c ¬NE„þú õoïSéÛâ1ÜtÕÝΌȯÂp½à¸$µ?²9°¯´®¯/°Õ±ý³„¶g¹}¼Æ¿)âÆÊ ÍÑ‹Ôí×EÛˆÞ¿áàäóçñêáí»ð‰óBöîø‡ûþ“þe¸ÿ C mŸ¹ÓáçêãØÇ ³"š$~&b(B*",.à/Ä1¥35t7f9T;O=G?LAOCZEgGrI~K„M~OlQ@SùT…VáWõX½YZ ZrY@XbVÅSbP.L"GLA¬:_3+&#‘Ó) ¿³ø8ñZê=äÝÞOÚ€ÖrÓÑWÏ/ÎxÍ8ÍJͱÍPÎ(Ï+ÐOјÒòÓkÕïÖŒØ3Úî۳݇ßgáWãNåVçeéƒë¤í×ïòHô‚öÄøÿú4ý]ÿsmKòjš x ù  – Ÿ ËßFÿþúö‹ð„êä|ÝÁÖ Ð½ÉËÃf¾»¹ÎµÄ²‘°>¯½®ý®ò¯}±Œ³¶Ô¸à»$¿€ÂöÅqÉóÌlÐàÓHמÚéÝáFä[ç_êNí0ðüò¾õiøû—ý‰íE Ñ 1Rk{„†wh S">$&(á)È+¢-…/e1G3/579÷:é<ç>æ@êBôDÿF IKMO QæR¢T;VWÅX—YZZ™Y†XÆVTTQ M-H|B<Ù4-Ó$CŒÝ `Cú¨ò¬ëfååß'Û<×ԊѨÏdΘÍCÍDÍÍ-ÎÏõÏÑTÒ±ÓÕ§Ö8ØáÙ•Û[Ý*ß áóâìäíæþèë8ígï—ñÕóöQøúÄüïþ  ìž!^ M â  ³ Î ]:zýÿÙû ÷ ñ²ë`åÁÞØ^ÑùÊåÄl¿“º…¶N³ñ°q¯Î®ä®¼¯(±³†µC¸I»¾ÚÁGÅÊÈAÌÄÏ4Ó¡ÖøÙHÝ€àªãÅæÇéÂìžïxò1õé÷…úýœÿvÔ f • Éè$! ó!ß#Ä%§'ˆ)h+H-(/1ì2Î4»6¢8–:†<†>€@‡BD—F§H®JºLµN­PˆRLTîUWWŽXrYüYZ·YÄX'WÜTÂQåM,I§CS=N6Ÿ.z&ôD Õû ôí—æòàÜö×ÔþÑОοÍOÍD͇ÍÎÓÎÊÏÛÐÒlÓÖÔZÖé׌ÙBÛþÜÑÞ©à”â‡äŠæ“èªêÍìöî+ñ`ó õÝ÷úSü€þŸ£ŒHÕ ! Ä  à §«¯¯üú÷¶òÛìæ àYÙ«Ò+ÌÆoÀz»B·á³X±´¯Ý®Ü®„¯Ý°¶² µ¹·±ºÝ½2Á ÄÈšËÏŒÒõÕXÙŸÜæß ã/æ1é/ìïèñ¯ô`÷úšü ÿ—\±ï 0 Yœ®¾¿À³ª”!‚#e%J',) +í,Ê.«0Ž2q4Z6C85:%<#>@"B'D2F?HJJQLUNHP-RõSUWTXGYéYZÔYúXW[UgR³N%JÆDŸ>µ7-0(§ûD´kýžõaîÑçâûܺØ?ÕzÒ_ÐàÎåÍcÍBÍzÍõͮΘϧÐÚÑ)ÓÔ Öž×8ÙëÚ¨ÜsÞOà0â'ä!æ-èAê`ì‰î¸ðóò*õp÷¦ùãûþ2<,î‰Ýï ¦ ö Ó ) í^xýîø¼óîÓçRá¦ÚðÓjÍ6ÇyÁh¼¸~´È±ù¯û®Ò®Y¯•°R²”´.·º<½ŽÀôÃmÇìÊgÎãÑLÕ±ØÜAßvâå¥è•ëˆîZñ'ôÛöƒùü¢þ ˆì9„ ¿ ì0NSaXXF8!!# %ê&Ð(­*,n.N0024ú5ä7Ô9Æ;½=¼?¹AÅCÊEØGâIíKîMèOÍQSKUËVXYÍYZéY*YÕWËU SwOKãEÜ?9®1¹)Q!´ùb ÿ÷ÆïéãîÝŠÙâÕÓ¿Ð(ÏÎ{ÍDÍpÍÚÍŒÎgÏsÐžÑæÒKÔÁÕN×êØ“ÚQÜÞîßÔá¿ãÀåÂçÛéîë"îBð‰ò²ô÷0ùwûýÊÿÒË•9›º ƒ é Û Q + x?þÖùÃô&ï é™âíÛ>Õ¦ÎfÈŒÂW½Ô¸µB²G°¯Ð®6¯O°÷±´¬¶…¹¢¼è¿KÃÁÆ>ʽÍ4ѧÔØ^Û£ÞÓáúäè ëóíÓðšóXöù›û(þ£tË Q ƒ«Îàõöûóé× Ã"«$&q(S*/,.í/Õ1µ3›5‡7q9f;[=W?WA_CbEtGzI‡KŠM„OnQDSöTƒVØWìX¬Y ZóY[YX?VœS7PþKñFAx:13N+þ"i° ¥ªø.ñ[êDäçÞ^Ú”Ö†Ó0ÑoÏEΓÍOÍcÍÇÍeÎ=Ï=ÐdѦÒÔuÕוØCÚù۾ݓßsá_ã[å\çpé‡ë®íÛï òKô„öÅøÿú2ýXÿnb?àX [ Ø Þ n i ÑŒ¡ÿ³úËõ;ðCêÕã=Ý…ÖëϒɧÃO¾¨¹ÊµÄ²›°P¯Ñ®¯°±®³(¶ó¸¼A¿¦ÂÆ“É ÍÐùÓb׸ÚÞ6á^äqçrêgíAðóÐõ{øû¦ý,™ÿX  å E`~‹•˜‘‡y b"N$0&(÷)Ò+¸-‘/v1X3=5&79;ü<ï>÷@ôBE GIK(MOQäR¥T3VšW¶XŒYýYZ~YfX¥V+TïPÜLHGBÖ;§4å,¨$jà L7ú ò­ëkåïß8ÛK×ÔŸÑ¿Ï}ΰÍYÍ`ͬÍLÎ ÏÐ'ÑhÒ¿Ó.Õ´ÖDØðÙ ÛeÝ7ßáÿâóäøæéë?ílïñÙóöRøŽúÁüìþÞ‘ L , Æ Ü ‰   $5¾ÿûÃöVñmëåƒÞÑ×-ÑÉÊÂÄO¿„ºz¶Q³õ°ˆ¯Ü®¯Õ¯J±A³§µh¸j»¢¾ûÁiÅæÈbÌÞÏSÓ·ÖÚ]Ý™àÄã׿áéÑì·ïˆòIõù÷šú+ý­ÿ$†ç- v ¨ Øù&24/' "ð#Ñ%º'–)y+X-4/1ù2ß4Ç6³8¢:—<‘>@’BšD£F¯H¹JÁL¼N±PŠROTèUTW‚XgYìYZœY¦XW²TžQ²MItC#=6r.K&Ït òÆûôÿìæøàÜزÔÒеÎ×ÍfÍ\ÍœÍ*ÎéÎØÏôÐ'Ò|ÓèÔeÖø×œÙIÛÝ×Þ¸à›â“äŽæ è°ê×ìûî0ñeó£õà÷úTüzþ›š;  £ ß ˜ Ó ptÅsdü·÷kò”ìVæËßÙvÒþËæÅUÀd»;·Ý³c±½¯õ®ñ®¤¯ý°Õ²1µØ·Öºÿ½UÁ¾Ä9ȶË1ϨÒÖpÙ¼Üùß'ã@æKéBì'ïþñÀôv÷ú®ü1ÿªoÀ > k’¬ÂÉÔËÉ·§!#w%Y'=)+ý,Ù.¼0œ24j6R8C:4<.>+@-B5D;FKHPJ\LXNOP/RôSœU WLX;YÖYZºYÜXdW.UER‚NøI˜Dj>ˆ7ú/î'~Ö*š^ý”õ\î×ç â ÝÉØSÕÒyÐõÎÎxÍ\ÍÍ ÎÄΧϾÐéÑ<ÓŸÔÖ«×GÙ÷Ú´Ü~ÞYà:â0ä*æ6èHêiìŒîÃððò5õl÷«ùáûþ-6äuÉÖ † Ô ª ú ¼ÛR5ý¤øxóºíŽçácÚ¿Ó6ÍÇ\ÁP¼û·z´Ì± ° ¯ë®w¯°°x²²´V·<ºa½¯ÀÄǡÎûÑkÕÈØÜZ߈âªå´è°ë›îmñ=ôíö—ù/ü´þ2šýK– Í %GXikmeYH!1#%ÿ&Ú(Ã*š,.\0@2!4 6ð7ä9Ñ;Î=Å?ËAÎCÕEåGéI÷KôMìOÒQ›SKUÆVXY¼YZÎYYµW§UãRIOêJ±E¬?ì81Š)*!ŽÜHöþ÷¿ïé&ãùݘÙ÷ÕÓÛÐ<Ï+ÎÍ]Í„ÍñÍ ÎyψЫÑúÒYÔÐÕ]×óØ¥ÚZÜ%ÞúßÚáÏãÃåÑçÚéìîPð†ò¼ôÿö7ùpû ýÀÿн‹&†£ d Ç µ ÿ;×Áüýù{ôÝîÄèSâ±ÛÕtÎ<ÈjÂD½Ã¸µG²O°5¯â®T¯l°²B´Ê¶®¹Á¼ ÀkÃáÆ]ÊÛÍPÑÁÔ"ØvÛºÞíáåèë îåð°ójöù°û7þ¸#‡Û$ a “¾Üõ  øè Ó"»$&ƒ(_*B, .0à1Ç3©5–7€9s;j=b?fAiCnEG‚I‘KM‰OtQASúTzVÔWßX Y÷YáY;YXVwSPÔK¿Fê@I:ÿ2"+Ô"C÷“œø(ñ]êFäôÞmÚ£ÖŸÓ@Ñ‹ÏYάÍeÍyÍÜÍzÎQÏOÐvÑ·ÒÔˆÕ ×¦ØNÚÜÌݚ߀ágãbåhçté‘ë³íáïòMôˆöÈøýú2ýSÿg\/ÕBj @ µ º A ; —U^ÂþlúƒõóïüéãýÜKÖ¸ÏiÉ‚Ã:¾•¹ÇµÅ²¤°a¯ç®5¯-°¾±Î³K¶¹)¼d¿ÅÂ1Æ´É*ͨÐÔ{×ÒÚÞNáuä†ç‰êyíYð%óäõø.û½ý9°j± õ 'Tr›§¦¢˜ˆ t"\$A&$(*ã+Æ-¡/†1e3M557!9;=?ÿ@C EGI'K.M%OQçR£T3V‘W¯X}YëYìYbYJXV T¿P³LËGB¢;u4¸,y$÷G§ 6(ú˜òªëoåúßCÛ^×+Ô´ÑØÏ•ÎÆÍtÍpÍÊÍYÎ(ÏÐ;ÑzÒÍÓBÕ½ÖXØøÙ°ÛoÝCßá ãüäç é%ëFítï¢ñÜóöQø‘ú¿üéþüûÐ…÷3  ¡ º \ q îÉ÷zÿJûyöñ#ëÔä@Þ•×ùКʟÄ4¿pºw¶M³±¯÷®¯ö¯k±`³Ïµ‡¸‘»Ã¾ÂŒÅÉ„ÌøÏoÓÒÖ/ÚyݰàÙãðæôéëìÉïò\õø­ú>ý¿ÿ7˜ù> ‡ ¹ é (5AF>:' "ý#æ%Ä'«)†+g-H/'13ð4Ó6Ä8¯:¦<ž>›@¡B£D°F·HÃJÆLÇN°P‘RHTéUMWyXYYÚYðY…Y‡XäVŒTqQˆMÎHDCï<ë5B. &¦ýV ܶûôÿìŸæá)ÜØÅÔ)Ò.ÐÏÎëÍÍoÍ·Í;ÎÿÎëÏÑ;ÒŠÓøÔsÖئÙZÛÝçÞ¿à§âœä˜æ§èºêÚìï4ñló¥õâ÷úRüyþ•‘x)³òí „ º o ¤ =9Š. üo÷ òNì æ‹ßÛØ?ÒÏËÀÅ6ÀS»-·á³d±Ñ¯¯ ¯Á¯±ü²Nµÿ·÷º!¾xÁÝÄ[ÈÐËTÏ¿Ò/ÖˆÙÓÜà<ãXæaéVì>ïòÕô‰÷+úÁüCÿ¿"„Î M ~¡¾ÒÛãÞÖÊ´!¢#„%l'J),+ -ê.Ê0­24x6_8S:@<>>5@=BS7Î/¿'V´ †Iý‹õZîÖçâÝÞØaÕ©Ò‰ÐÏΑÍrͤÍ#Î×μÏÎÐûÑKÓ°Ô(Ö¹×TÙÛÁ܉ÞbàHâ7ä5æ>èOêpì”îÄðûò2õr÷©ùßûþ$2×c´» i ° Î …¤ÚñüZø1óoíHçÍà&Ú…ÓÍäÆBÁ6¼õ·p´Ù±°%¯þ®˜¯Í°š²Õ´w·bº‚½ÑÀ5Ä®Ç%˧ÎÒ‡ÕáØ5Üpߥâ»åÎèÃë°îƒñPô÷«ùAüÈþD«Z« Þ 8UmvyzfY!A#)% 'ì(Ñ*«,.l0N23468ó9ß;Û=Õ?ÔAÛCáEíGõIþKùMôOÒQŸSFUÂVXY®YîY¶YõX“W…U·R O·JEy?»8N1\)!h¼0áþ ÷¹ïé,ãÞ¨Ù Ö&ÓðÐVÏ?ΫÍsÍšÍ Î±Î‘Ï–ÐÂÑÓjÔßÕg×Ù«ÚjÜ0ÞàéáÓãÑåÕçééì+îSð‹òÃôýö:ùqûšýÁÿ»xq‰ I ¢ ó Ê—‚·ýGù1ô—îyèâoÛÉÔEÎÈNÂ(½¸¸µJ²[°F¯ü®n¯°6²e´í¶Ï¹æ¼+ÀÃþÆ~ÊöÍpÑÛÔ>ØÛÓÞâ&å6è2ëîûðÂóö$ùÂûMþÇ8—í6 t ¥Ïì ù á"Ì$¯&‘(r*O,2.0ñ1Õ3¸5¦79ƒ;v=s?pAuC}E…GI–K˜MOvQDSôTzVÊWÖXYæYÈY"YàWöUNSàO¢K‘F·@:Ð2ò*©"nß}’øñ_êJäßyÚ¸Ö°Ó[ÑÏtÎÃÍ|Í“ÍïÍ’ÎbÏdІÑÇÒ&Ô”Õ×±Ø\ÚÜÕݪ߆áuãlånçé˜ëºíçïòPôŽöÅøû,ýSÿ]U!Ç,T ! •   d"wþ,ú3õ±ï¬éQã·ÜÖƒÏ:ÉcÃ¾Š¹¼µÉ²®°q¯þ®P¯K°à±ò³l¶<¹L¼‡¿çÂSÆÏÉOÍÀÐ6Ô”×ìÚ3Þeáäç êŽímð;ó÷õ¦ø=ûÓýKÁ#xÇ  ;b‡œ¯¶·µ¦š „"o$P&6(*ô+Ö-°/˜1s3_5B719;=? ACE$G%I5K/M2OQìR¢T,VW£XnYÜYÓYHY*X]VÞS˜P€LGæAm;G4ƒ,S$É(‡ !úò©ëråàSÛl×DÔÅÑôϨÎâ͉͊ÍÞÍoÎ<Ï/ÐNщÒßÓPÕÌÖfØÚ¼Û}ÝKß*áãå çé,ëPívï©ñâóöXøú¾üæþõòÆrç û  – 0 @ ¸Ž¸5ÿû0öÅðÛêäÿÝX×ÃÐlÊ{Ä¿`ºm¶N³ ±¤¯¯9¯°‹±…³ïµ¬¸µ»ã¾A¨Å'ÉÌЊÓîÖKÚŽÝËàñãçêúìåï­òsõøÁúQýÒÿIª S ” Ò ô"4IRUQI9 %"$ô%Õ'¼)“+{-U/813ÿ4â6Ó8½:´<¬>©@ªB³D·FÇHÇJÒLÈN¹PŽRNTáUIWpXKYÊYÛYkYhXÃVeTEQ\M›HC½<·5.ô%zÚ7 Å¥ûô÷ì¥æá8Ü$ØÛÔ:ÒIÐäÎΔ͋ÍÇÍVÎÏÐÑIÒ ÓÕ‡ÖØ·ÙdÛ%ÝðÞÌà°â¦ä¢æ°èÀêæìï=ñoó©õä÷úRüuþˆlžÞÐ f • E t LèÿÝû%÷ÖñìÆåFߢØҤ˙ÅÀC» ·á³l±Ý¯¯&¯Ý¯<±³qµ%¸»H¾–ÁÅ{ÈïËqÏÜÒLÖ ÙðÜ+àTãqæuénìRï$òìô™÷BúÑüWÿÏ7’ä& a ޲ÏãîðóáàÁ!³#–%x'^)8+-ø.Ú0»2Ÿ4‡6n8b:NC@IBJDTF\HfJjLdNYP0RùS’UW7X%Y´YßY…Y¦XWçTîQ*NšI2D >!7/“'*ë j<ý}õTîÛçâ#ÝéØxÕ¹Ò¥Ð$Ï.Ψ͊ͻÍ8ÎêÎÑÏàÐ Ò[Ó¾Ô9ÖÅ×dÙÛÏÜ’ÞqàOâBä?æDè\êtìîÉðó8õq÷­ùÜû þ ) ÉRž£ G V ¡ QkÔš©üøâò,íÿæ‹àçÙMÓ×ÌÀÆ Á&¼â·u´Ú±°7¯¯²¯ð°¸²û´—·‡º£½öÀTÄÍÇHË¿Î8ÒœÕÙJ܌ߺâÔåãèÙëÄî™ñcô÷¿ùRüÜþUÀq· ñ %Hi{ˆ‹‡zf!T#7%'þ(Þ*½,œ.0\2C4%68þ9ð;ç=ã?àAèCëEúGûILÿMùOÔQ SBU¿VþWùXYÚYžYÚXqW`UŽRòN‹JLEJ?‡81-)Ö A ×þ÷ö»ïé4ãÞ¶ÙÖ=ÓÑjÏ\οÍͲÍÎÉ΢ϬÐÒÑÓ{ÔìÕz×Ù»ÚvÜ;ÞàïáàãÙåßçïé ì.î]ðŒòÈôÿö<ùmûýµÿér_o * c È –ÐXCoýùêóJî5èËá1ÛÔÎäÇ1 ½°¸µP²i°V¯¯Š¯ª°[²†´·ó¹ ½NÀ¯Ã ÇšÊΈÑùÔWاÛíÞâ=åLèGë4îñÖó”ö7ùØû\þÝHªÿH ‚ ¹Þ&),% !ô"Ú$À&¡(‚*_,A.02ã3È5´7›9“;€=ƒ?|A‚CˆEGšIžK M“OzQESôTtVÅWÈX„YÐY³YYÀWÒU%S³OsK_F„@ä92Â*"ñS½nøñZêRä ߇ÚËÖÅÓoѸϊÎÜÍ’Í«ÍΪÎsÏzЗÑÚÒ5Ô¤Õ+×ÁØgÚÜãݳߓá~ãsåzç‡éžëÅíêï!òVôŽöÉøû,ýMÿ[G´<  q l ç Ø)Ûß4þâùìôdïfé ãvÜÖÕNÏÉ?þv¹ºµÈ²»°€¯¯o¯e°²´‘¶b¹k¼­¿ÃyÆìÉlÍàÐOÔ±×ÛIÞ‚á¡ä¶çµê¤í‚ðNó ö·øUûáýcÎ8‰Ù  Lt˜®¿ÈÇÈ´­ ’"~$d&@(**ÿ+ç-Â/£1‰3h5T7@9-;%=?AC$E)G4I;K9M3OQìR T,V‚W›XbYÆY¿Y,Y X7V»ShPWLjG´A=;4W,#$§m úŒò¢ëzåàbÛ|×WÔÛÑ Ð¿ÎúÍŸÍ¡ÍôÍ…ÎMÏFÐ]Ñ›ÒðÓ]ÕÞÖqØÚÆÛ‹ÝVß6áãåçé5ëTí€ï­ñæóöWøú¾üàþòæ»dÓ Þ ^ p   ‚Twõþ»úêõ{ð•êGä¾Ý×ÐAÊWÄý¾Oºe¶O³±¯¯"¯N¯3°ª±¨³¶Ñ¸Õ»¿bÂÈÅGÉ»Ì8Ð¥Ó ×cÚ¨Ýäàäç"êíõïÆò„õ4øÕúcýçÿX¿e © Ý -IXdecVM 3"!$&è'Æ)«+„-h/F1'35ó6à8Í:Ã<·>º@µBÀDÂFÎHÓJÖLÑNºP“RKTáU@WiX;Y¼YÃYQYMXœVBTQ.MmHßBŠ<ˆ5à-É%Sµ «˜ûûó÷ì¦æá?Ü<ØêÔSÒ_ÐúÎέ͠ÍàÍgÎ'ÏÐ)Ñ\Ò­ÓÕ’Ö!ØÄÙoÛ2ÝýÞÓàÀâªä°æµèÊêëìïAñró¯õä÷úLüuþˆƒ]‹È´ H m  B ÕÄ ¦ÿ–ûÝöñ»ë‚åß_ØÕÑmËxÅù¿-»·Û³v±ê¯1¯=¯ý¯X±A³“µG¸>»g¾»Á Å™ÈÌŠÏüÒcÖ¾ÙÝDàlã‡æŒé„ìfï;òþô¯÷SúåükÿàJ¤÷7 s žÇÞõþöì×!Â#¦%Š'l)J++- /ç0Î2¬4˜6|8p:_R@TBXD_FgHpJpLpNWP9RôS”UýV2XY¤YÊYmYˆXûVÀTÄQýMhIÿCÖ=î6j/d'þkÉ Q(ýoõRîØç"â)ÝúØŠÕÍÒ¼Ð;ÏHνͣÍÒÍLÎÏæÏðÐ#ÒhÓÐÔJÖÑ×sÙÛÙܤÞvà_âIäKæMèaêì¢îÓðó?õr÷°ùÝû þ#ý½@Ї + h . r 1–WaüÑ÷•òåì¶æFàªÙӨ̕ÆÁ¼Ø·p´ß±,°G¯4¯Í¯±Û²µ¼·ªºÈ½ÁyÄëÇhËÞÎQÒ¾ÕÙiÜ¢ßÓâêåüèíëÝî¬ñxô,÷ÏùjüêþjÑ3‚È  2]vŽš ž—‰y!c#H%.')í*Ï,¬.0m2P4868:þ;ö=ï?ðAòCúEH J L NüOÚQžSEU¶VûWéX‘YÅYˆY»XRW:UcRÈNVJ E?W8ì0ý(« {û»þðö®ïé7ãÞÅÙ.ÖQÓÑÏrÎÖͦÍÅÍ3ÎÞεϾÐãÑ+Ó‰ÔþÕ‡×ÙÌÚ}ÜKÞàþáèããåéç÷éì6îbð“òËô÷<ùpû˜ý´ÿºŸfðMS  ^ = š d–,ý¹ø¢óÿíñç…áñÚXÔàÍ»ÇÂ÷¼ ¸ µS²s°k¯)¯©¯È°|²©´5·º,½pÀÑÃ?ǼÊ3ΧÑÕoØÅÛß7âSådè[ëNî!ñïó¥öKùëûnþñX¾X ˜ Çñ&4?98*!#é$Ñ&°(“*q,P./02õ3Ö5Ã7«9 ;’=?ŒAŒC–E™G¦I¥K¨M˜O|QHSñTqV¼W¿XsYÀYšYìX W®UüRˆODK-FR@±9k2”*R"Ì0¢Yrøñ[êRäß‘ÚÝÖ×Ó…ÑÏÏ ÎóÍ«Í¼Í Î·ÎχЫÑéÒDÔ¶Õ9×ÎØvÚ)Üïݾߟá…ã‚å€çé¨ëÉíòï&òWô”öËøþú-ýFÿU> ¤  î K J ¹ ©ï¤šöý™ù¤ôïéÇâ7ÜšÕÏåÈÃí½h¹²µÍ²Â°“¯)¯ˆ¯†°$²5´µ¶‚¹’¼Ì¿*ÔÆʈÍýÐlÔÌ×ÛfÞ–á»äÌçÊê¼í”ðhóöÐødû÷ýsãGŸè ) [‡©ÀÏÙØÕʹ §"$q&U(4*,ô-Ò/³1–3x5d7L9=;2=)?(A(C/E3G@I@KCM7OQïRžT)V{W“XOYºY¤YYêWV‘S?P%LYksxsh[ F"1$&ú'Õ)¼+“-y/S1:357î8Û:Ð<Æ>Å@ÃBÊDÍFÚHÚJáLÒNÂPRNTÚU=W\X2Y¦Y±Y8Y+X~VTòPþL?H«B\]@bBbDkFoHzJvLvN]P9RõSUøV)X Y–Y³YWYiXÚV™T›QÐM:IÏC¤=¿6:/8'ØE° 8ýeõPîÛç(â9ÝÙ¢ÕàÒÔÐQÏ^Î×͸ÍéÍaÎÏùÏÑ0Ò}ÓÜÔYÖß×Ù(ÛäܮނàhâQäUæRènêì­îÓð ó>õv÷°ùÚûþô¬0ro D  @ íö\"ü…÷RòšìqæàkÙÜÒwÌrÆáÀþ»Ë·q´ä±9°]¯H¯í¯-±ü²AµÞ·Ìºë½6Á™Ä È…ËúÎpÒÖÕ2Ùܽßçâæ éìïîÃñŠô>÷äù{üÿ{äC”Û  Fk‰ž¬¯¯§›†!w#U%@')ý*Þ,».ž0{2a4F6/8:<>@ùADFHJLNþOÛQ¡S=U¸VëWãX|YµYmY¢X.WU:RœN)JìDâ>%8¼0Ñ(ƒ òaÞ®þáö­ïé@ã%ÞÓÙBÖdÓ3ћχÎñͺÍÞÍKÎíÎÏÏËÐûÑ6ÓžÔÖ˜×*Ù×ÚŒÜUÞ#à âïãñåëçêì?îdðšòÍô÷<ùmû—ý®ÿ±™Rç0@ ì <  k 3[äºìünø\ó¸í§çDá²Ú ԯ͓ÇïÁâ¼’¸ µW²€°{¯B¯Ä¯è°œ²Ì´W·:ºM½“ÀðÃbÇÙÊPÎÆÑ,ÕØÛÛßMâkåwèvë\î;ñÿóºöbùùû†þýqË$j ¦ Û"6GKMF:(!#ù$á&Á( *‚,a.<0$2ý3ë5Í7¾9ª;¢=™?™AšCžE§G«I±K¬MŸO~QISïTnV²W¶XcY­YƒYÏXWˆUÕR[OKüE @9;2f*'"© ŒBføñXê\äߣÚîÖëÓ›ÑçϸΠÎÂÍÓÍ5ÎÎΠϜлÑüÒUÔÂÕI×ÚØƒÚ6ÜùÝÊߨá’ã‡åŒç•é°ëÑíöï,ò\ô•öÎøüú+ýAÿM6þ”ó Í 0  ‘ r¾c]®ýTù\ôÔî×èƒâ÷ÛaÕëθÈÃν_¹ªµÐ²Î°¢¯B¯¡¯§°B²Y´Ö¶§¹³¼ñ¿FúÆ*Ê©ÍщÔä×<ÛzÞ²áÒäáçãêÌí¯ðvó4ößøzû þ„øW±ú 9 n˜¹ÐâçìãÛÊ ¶"ž$‚&d(D*&,.ä/À1¦3‡5s7[9K;@=6?5A4C;E>GJIIKJM×™ÚÚÝá8äJçOê?íðïò­õ[øùú‹ý }æ:Œ É -Ok{„ˆƒxn T"B$%&(é)Æ+¦-‡/b1K3&57ø8í:Ý<Ó>Ô@ÏBÕDÚFàHèJãLÝNÁP–RJTÙU5WSX"Y˜Y—Y Y X[VñSÅPÒL H|B&<"5-o%pâ {zûäóôìªæ"á]ÜWØÕ|Ò‹Ð,ÏKÎÞÍÌÍΑÎPÏ:ÐLÑ~ÒÏÓ4Õ²Ö=ØÝÙ‹ÛHÝßìàÏâÃ便ÉèÚêùìïKñ|ó´õé÷úMülþ}rIñg›~  $ Æ ægRÿ ûKöñ)ëùäzÞï×`ÑË*Åÿ »·Ý³ƒ±°Z¯p¯6°›±ƒ³ÚµŽ¸»®¾þÁbÅØÈNÌÆÏ4ÓœÖðÙ;Ýuàœãµæºé­ì“ïcò&õØ÷xú ýÿoÈ ] “ Âè "% ö!á#È%¨')j+K-'/ 1æ2Ñ4°6 8‡:~

    p@iBrDrF}HJ‚LxNdP9R÷S‹UôVXÿXƒY Y;YLX¶VvToQ¤MIžCr=Š6 /'¯!Ž $ý`õFîßç.âDÝÙ²ÕöÒéÐkÏuÎðÍÌÍÎtÎ-ÏÐÑBÒŽÓìÔgÖí׎Ù4ÛòÜ·Þànâ`äZæ_èsêŠì±îÛð óFõu÷±ùÚûþéŸ_P ï  Þ  ¹»ÏÿÜû<÷ òPì,æÂß,Ù¨ÒDÌNÆÀÀí»À·m´ì±E°o¯f¯°S±³dµ¸ìº¾UÁ½Ä+ȤËωÒõÕIÙžÜÐßãæ'éìïØñžôT÷öùŽüÿöW¤í ' V˜±¹Â¾º©š!‚#k%L'/)+ì,Í.ª0Œ2q4R6@8':<> @BD FHJLNPÞQŸS@U«VçWÔXnY YUYƒXWñTRoNúIºD²>ò7‹0¦(T Ô=É—þÛö¢ïéDã1ÞäÙSÖ{ÓHѲϡÎÎÓÍóÍ^ÎÏÞÏãÐÒPÓ¤Ô!Öž×<ÙâÚ˜Ü_Þ1àâþãôåúçê ìEîkðŸòÐô ÷;ùoû“ý§ÿ­ˆKÎ!! Ò  î < þ&¥z¨ü$øómídçÿàuÚçÓÍlÇÎÁϼ†¸µ^²‰°‘¯Y¯á¯±½²ï´{·\ºr½²ÀÄÇúÊnÎáÑJÕ§ØöÛ5ßdâå‘èˆëvîLñôÎötù ü˜þƒÝ6{ ¹ ì4GV^\WL8!'# %ò&Ð(±*‘,n.O0/24ù5Ü7Ë9º;­=§?§A¤C«E¯GµI¹K³M¢OƒQGSïTgV¬W©XSY›YjY´XaWcU®R/OçJÎEë?P9 29*ý!‚íq1Wø ñYêbä(ß²Ú×Ô²ÑüÏÑÎ"ÎÚÍìÍHÎäγϱÐÌÑÓbÔÕÕS×ìØÚDÜÞÓß´ášã“å‘ç¡é´ëØíýï-òaô—öÍøÿú%ý?ÿD,ñ‚ßî° ö c A„'jý ùô‹î’è>â¸Û(Õ¹ÎÈݼ½L¹ªµÑ²Û°³¯[¯º¯É°_²~´ù¶È¹Ú¼ÀkÃØÆJÊÇÍ4Ñ¥Ôþ×VÛ’ÞÉáèäùçöêåí¿ðŽóFöòøŽûþ– i J ¦ÍÜöõýóëÙ È"«$–&p(W*2,.ñ/Ñ1´3˜57i9[;I=G??ABCEEJGOIRKNMDO!QõR–T$VjW}X5YY{YÞX«WÓU=SîOÅKÝFAª:€3É+¤#.  ÍÝùtò ë‡å$àŒÛ±×‘ÔÒLÐÏAÎåÍåÍ6ÎÄΉÏДÑÏÒ!Ô‹Õ ×šØ;ÚïÛªÝ{ßQá?ã*å1ç3éPëfí”ïºñõó#ö]øú´üØþÚÍ•3›¹ ÷  ~ €Þ¤¸)þéùõ¢ï¿éxãþÜjÖôϼÉïñ¾ºO¶V³-±ä¯^¯¢¯ˆ°² ´{¶:¹=¼q¿ÂÂ0ÆžÉÍ‹ÐúÓZׯÚöÝ)áPä_çdêTí3ðó¿õnø ûý’óOœ Ù 9ex’šŒ{ f"P$4&(÷)Ø+¶-”/u1U3<57 9÷:ì<â>Ü@ÞBßDåFêHìJîLÞNÈP”RKTÔU.WHXY†Y‚YYíW8VËSP¤LßGIBù;ñ4U-E%ÜPÇ jkûàóòì¯æ-áhÜnØ$Õ—Ò ÐEÏbÎ÷ÍáÍ'Î¥ÎcÏNÐ]Ñ’ÒÜÓFÕ¼ÖLØéÙ–ÛVÝßöàÛâÉäÈæÐèáêþì$ïNñó·õé÷!úFükþrl8äSc å þ Ÿ °8SÜþÇúö¹ðäê´ä>Þ²×.ÑîÊŪ¿øºþ¶ß³Œ±°l¯¯Q°¼±¤³üµ°¸¥»Í¾ ÂÅöÈlÌàÏRÓ²Ö ÚPÝŽà±ãÌæÍéÃì¨ïvò:õê÷Šú!ýŸÿØ, i ¨ Ñø'.51( "ó#Õ%»'œ)w+^-3/1÷2Û4Â6«8–:Œ<{>~@vBzD€F‚HŠJ†L~NhP:RøS…UïVXòXrY‹Y"Y/X–VOTFQxMÙHnCB=Z6à.Þ&‡s õüWõEîäç9âQÝ,ÙÅÕ ÓÑÏŽÎÎåÍΊÎ?ÏÐ+ÑSÒÓýÔtÖýטÙCÛüÜÂÞšàxâjä`æjèvê”ì³îâðóGõy÷¬ùÜûúýጠF7 Ï û ´ ↂãÿ˜ûööÅñ ìêå€ßöØnÒÌ#ƬÀÖ»¹·l´õ±S°†¯z¯$°o±<³‡µ$¸»1¾yÁÙÄKÈÂË4Ï¨Ò ÖgÙ²Üìßã2æ8é3ìïìñ²ôc÷ úžü%ÿŸi´ÿ 6 g«½ÎÐÎ˸ª!”#w%^'>)+ÿ,Ø.¼0š2~4b6M85:*<>@BDF!H"J#LNPãQœS>U¥VÞWÉX\YY8YkXêVÏTèQBNÍI‹D‚>Ã7^0x(0 °"´†þÓöžï éJãBÞðÙkÖŒÓdÑÆÏºÎÎëÍ ÎsÎÏðÏöÐÒ[Ó»Ô%Ö¶×BÙòÚ¢ÜkÞ:àâäþåèê'ìIîpð¢òÔô÷>ùjû‘ý¡ÿ¥|=½  ¯ ÷   Ëîh=aüå÷Ëò-íçÀà9Ú²ÓQÍGǰÁ¿¼v¸µ`²˜°£¯r¯ù¯'±Ý²µŸ·}º‘½ÖÀ1ÄžÇˉÎýÑdÕ¿ØÜJß~â•å§è›ë‹î]ñ*ôßöˆùü©þ%õ@‘ Ç û%?[dmne[I!2#%ü&â(À*ž,.\0>246é7Ú9Å;»=µ?­A´C±E¼G»IÂK¶M©OƒQISêTcV¡WXEY…YUY–XAWAU„RO¹JŸE¾?9Ü1*Õ!bÎ\Oøñ[êhä5ßÂÚ×ÔÈÑÐëÎ8ÎñÍÎ]ÎøÎÈÏÀÐßÑÓsÔáÕe×óØŸÚKÜÞÞß¼á¦ã˜åç¤é¾ëÚíð0òdô™öÌøþú ý<ÿ:#ásÈÖ” æ Ò 6 Qêß*ýÆøÒóCîRèúá€ÛñÔŠÎjȿ§½@¹§µÓ²é°Ä¯q¯×¯å°€²Ÿ´·í¹ö¼4ÀˆÃøÆfÊåÍMÑÀÔØmÛ¬Þßáþä è ë÷íÕðŸóZöù¡û+þª~Ï X ’¶Üî ûê Ô"¿$Ÿ&…(b*B,$.ü/ä1¾3ª5Š7y9f;X=T?IAPCKEWGVI]KRMIO#QôR—TVdWoX)Y}YeYÂXW®USÄO™K°Fí@z:T3+z# € ºÓùlò£ëŒå0àšÛÃצÔ6ÒbÐ"ÏTÎÿÍûÍIÎÜΚϒЦÑÝÒ3Ô”ÕפØJÚ÷۷݃ß`á@ã;å0çBéOërí”ïÃñóó)ö[øŽú´üÐþÕÇ$„¥l Ü Õ Y K­f~çý©ùËôaïwé<ã¾Ü7ÖÃÏ–ÉÍþºL¶V³:±ñ¯y¯·¯©°(²2´—¶_¹]¼¿æÂGÆÁÉ2ͪÐÔt×ÈÚ Þ?áfäuçyêhíGðóÕõ~ø!û®ý-£_­ è 'Js‡ž¢ª œ‡ y"\$F&%(*å+Å-¢/ƒ1e3G5/79;ø<ï>è@èBêDîFóHöJðLçNÇP™RETÓU&W=X YpYqYéXÑWV£SwPvL±GBÆ;Æ4)-%»/® X[ûÛóðì¶æ6áwÜ}Ø:ÕªÒ¼ÐWÏ€ÎÎþÍ7μÎwÏ_ÐqÑ¡ÒîÓSÕËÖ[ØóÙ§Û[Ý,ßþàåâÔäÏæØèèêí'ïTñƒó¹õë÷úFüeþo_0ÑAjH Å Ú r …ß þúÁõsðŸêuäüÝ~×ùÐÅÊáÄ”¿æºù¶Þ³•±&°…¯¡¯s°×±Ç³¶Ð¸Ç»ï¾@ ÅÉ…ÌÐiÓÐÖ"ÚmÝ àËãÝææéÖìºï‹òMõû÷ ú/ý²ÿ+ì; z º Ý 9<G?:* "$å%Ë'§)Œ+f-H/%13é4Ò6¶8©:”<>„@…B†DˆFHJLƒNjP@RðSˆUæVXèX\YzYYXvV&T#QGM®H>C=06®.·&^âU üåüNõCîçç@â_Ý<ÙÖÕ&ÓÑŸÏ Î!ÎûÍ,΢ÎQÏ2Ð:ÑgÒªÓÕ~ÖØ£ÙPÛÝÐÞ¢à…âqälæoè€ê™ì¼îäðóGõ}÷¬ùÝûóý÷×}ú0 ° Ô ³RL£QÿQûµö{ñÇë¥åAߺØ<ÒðËÆÀû±·l´ù±b°˜¯“¯B°Š±b³¤µJ¸0»T¾˜ÁûÄgÈßËSÏÂÒ(Ö}ÙÌÜà-ãIæMéHì+ïòÃôz÷úµü3ÿ²wÊ I x¼ÏÛãÜÛÇ»!¡#Š%k'N)++ -é.Ê0©24p6Z8D:7<)>$@ B D%F(H*J,LN PâQŸS7U¥VÑW¾XKYwY&YIXÏV¦TÁQNI\DR>’710M( wþÆöžïéTãJÞÚvÖªÓsÑâÏÐÎ4ÎÎ΋Î-ÏÐÑ+ÒlÓÈÔ:Ö½×TÙûÚ±ÜvÞEà&âä æèê-ìOîwð¥òØô ÷<ùlûŠý ÿ˜v+®óï“ Ñ › ♵-úÿüž÷„òåìØæ~àþÙyÓ%ÍÇ–Á¥¼p¸µf²§°±¯¯°G±þ²1µÁ· º´½øÀPÄÁÇ2˨ÎÒ}ÕÜØ&Ügß‘â°å¸è·ëšîwñ;ôôö™ù4ü¸þ8¢Xš Þ 5Tgx~{xhZ!D#*%'ë(Ö*¨,”.g0O2-46ú7ç9Ó;Ê=¿?½A½C¾EÃGÇIÅKÀMªO‡QHSéT]V™W“X2YwY7Y~XWU`R×NŽJnEŽ?ï8¯1Þ)±!9´@Bøñ]êmäBßÑÚ%×+ÔÞÑ+ÐÏQÎÎÎsÎ ÏÚÏÕÐñÑ,Ó„ÔïÕr×Ù¦Ú]ÜÞíßÄá¯ã¤å¢ç°éÁëäíð6òiô˜öÏøúúý6ÿ3Õ_¶»w à ª  Þ° ãü„ø†óîè¼á>Û¼ÔXÎBȠ½6¹žµÝ²ï°Ú¯†¯ó¯±¤²¿´>·º½SÀ«ÃLjÊýÍpÑÕÔ7ØƒÛÆÞöáå$è ëîéð²óoöù³û>þ»-Œå, l ¢Èêõ è"Ë$³&‘(u*Q,0.0í1Ò3µ5›7†9t;f=_?YAXCZE]GbIaK]MKO)QòR—TV]WfXYpYHY«XkWŒUòR•OqKzFÁ@F:$3p+R#åbç ¨Åùhò¡ë’å;à¨ÛÖ×¹ÔLÒ|Ð5ÏrÎÎÎ`ÎîβϣйÑïÒ@Ô©Õ'׳ØWÚÜÃÝßgáNã@å>çHéYëxí™ïÉñ÷ó+ö_ø‹ú³üÊþκ{oŒN ½ « / x)?¢ýbù„ôï2éõâ€ÜüÕÏiɭ¾ºE¶X³C±°¯Ó¯Ç°J²T´»¶ƒ¹¼³¿ÃhÆäÉMÍÊÐ+Ô’×àÚ%ÞYá|äçê|í^ð(óéõ’ø4û¿ýB´uº ÿ 5\†˜®³º²­— ‰"o$R&9(*ú+Ð-¶/1v3U5?7$9;=þ>ô@öBôDúFüHýJùLêNÌP˜RFTÍU W4XùX`YXYÏX´WðUSJPHLGéA—;”4ù,ð$ŽŒ FIûÔóîì¸æBáƒÜØLÕÁÒÐÐsÏ’Î$ÎÎRÎÎÎŽÏpЅѯÒÔ_ÕÝÖgØÚ´ÛhÝ6ß áîâÝäÙæàèðê í/ïXñ‰óºõï÷úGü]þlR(À-S+ ¥ ´ G TÌ¢Õ[þ:úzõ*ðWê0ä¼Ý=×ÌБÊÄÄu¿Õºô¶Ú³ ±5°—¯À¯°ù±é³?¶÷¸è»¿`ÂÃÅ3ɨÌЇÓéÖ>Ú„Ý»àáãõæüéêìÓïœòcõø²úBýÈÿ8¦úO Œ É ô3GOXOK: )"$ö%Ù'º)š+w-V/613ù4ß6Ç8´:¥<™>•@B“D’F™H™J–LŠNlPARòS‚UáVþWÙXNYaYðXòWTVTõPMyHCÚ<6}.Š&8»; ß×üDõ@îèçKâfÝPÙçÕ;Ó+ѲϻÎ6ÎÎ@ιÎeÏFÐNÑuÒÀÓÕ’ÖصÙYÛÝÙÞ­à’âyäwævèŠêŸìÃîéðóHõ÷¬ùØûôýõÇsã ³ _ …h ÿûkö3ñ~ë_åßzØ ÒÀËÚÅvÀ­»ª·h´²o°®¯¬¯_°«±ƒ³Èµk¸W»r¾¾ÁÅŒÈúËtÏÛÒDÖšÙâÜàDãaæcé_ì?ïòÚô‹÷1úÃüKÿÀ/†Ý [ ˆ°ËáìóïéÚÊ!²#š%{'^);+-ú.Ø0º2š46h8T:C<9>/@.B,D0F1H5J2L%NPßQ¤S1U VÈW±X;YcYY*X¯V~TšQéMpI*D >`70(ßiä„dþ¿ö•ï#éXãWÞÚŠÖ½Ó‰ÑúÏæÎOÎÎ9ΜÎFÏÐÑ;Ò~ÓØÔGÖÎ×`Ù Û½ÜÞSà-âäæè ê7ìRîð¦òÞô ÷?ùiû‰ý˜ÿ“iœÜ×r ¯ o ·aí¹ÿÚûT÷=òœì‘æ=à½ÙBÓôÌôÆzÁ¼f¸û´p²¯°È¯¢¯1°h±³Vµä·ÁºÚ½ÁtÄàÇQËÈÎ5Ò›ÕöØ@܀ߩâÈåÐèÊë²îŠñQô÷®ùEüÎþIµh° ë Dgv‹Œˆyk!T#:% ')ß*À,.{0^2;4%68ö9á;Ø=Ë?ÎAÆCÌEÎGÏIÐKÃM±OˆQJSçTVV•W‚X*Y\Y&Y^XWöT6R®N[J?EZ?¼8~1°)ƒ!'÷ÿ9øôð_êräJßßÚ7×=Ô÷Ñ@ÐÏiÎÎ0ΈÎ#ÏîÏçÐÒ=Ó•ÔÖ×Ù¶ÚfÜ*ÞôßÓá¶ã¯å­çµéÏëåíð9ònôœöÐøûúý/ÿ/ ËL¥ž\   ƒ Ú¬ßt^Ÿü;ø?óµíÄçráÛ~Ô(ÎÈ~Âx½'¹—µá²ú°ê¯ž¯°!±Å²à´c·0º@½uÀÍÃ7ǧÊΊÑöÔOØ ÛßÞ â.å:è9ë"îñÆóƒö+ùÇûQþÑ<¡ö? € °Þú /() !õ"Þ$Á&¥(ƒ*c,@.!0ü1ã3Â5­7“9…;r=p?cAfCfEiGkIkKcMQO-QòR—TVWWYX YYY5YŒXNWgUÆRmO:KOFˆ@:î2A+"#½>É ‘µù[ò¡ë’åDà´Ûç×ÊÔeÒÐQÏ…Î,Î*ÎvÎÏÆÏ¶ÐËÑÓRÔ·Õ7×ÂØcÚÜÐÝ™ßuáXãJåHçNédë|í¥ïÉñô*öcø‰ú²üÇþȰo_p5 – ‰ ÿê>ñü_ýù:ôÐîéè²â=ÜÃÕ[Ï?É‹Ãh¾ò¹<¶\³M±°£¯ï¯ã°p²o´æ¶ ¹§¼Ô¿(ÃŒÆÿÉpÍãÐKÔ¬×ûÚ@Þpá•ä¥ç¤ê•ípð@óüõ¨øEûÕýSÇ*…Ì  Cr”©ÁÂÌú« —"~$e&F(&*,á-Å/ 1ƒ3g5K769!;= ?ACEGIKÿLñNÏPšRETÊUW*XêXNYBYµX“WÏUXSP!LJG»Ab;b4Ë,¿$kèv *;ûÊóèìÀæBá–ÜšØbÕÓÒéЇϭÎ8Î)ÎfÎæÎŸÏ†Ð”ÑÆÒ ÔuÕéÖtØÚ»ÛxÝ@ßáøâæääææèùêí4ï_ñó¾õï÷úBü^þaN°9 … ‹  !—f˜þùù/õâïêéã~ÝוÐgÊÄ]¿Åºç¶â³£±G°­¯Ö¯®°² ´c¶¹¼5¿‚ÂäÅSÉÇÌ8ФÓ×XÚŸÝÒàûã çêíâï·òtõ%øÅúVýÚÿK·^ ¢ Ô &ITebfXM 7"!$&é'Ë)§+Š-c/G1%35ð6Ó8Ä:²<¨>Ÿ@žBœD FŸH¥J›LNqPARóS}UÚVõWËX>YJYØXÓW1VÝSÉPòLKHÛB®<È5S.Y&— ÌÃü;õ:îìçOâvÝ]ÙûÕOÓAÑÉÏÔÎLÎ+ÎWÎÍÎxÏ\Ð\ÑŒÒËÓ.ÕŸÖ&ØÂÙgÛ ÝæÞ·àšâ‡äyæ…èŒê¨ìÊîíðóMõ€÷°ùÓûôýùÿì¿]×çp ‹ 8 TêØ&ÌþÇú%öíð6ëå½ÞCØÍј˱ÅZÀ»œ·j´ ²|°Â¯Å¯y°Í±£³êµ¸u»œ¾ÙÁ@Å¥ÈÌÏûÒ_Ö²ÙÿÜ5à_ãuæ}épìYï'òðô÷Eú×ü]ÿÕ=›í/ m ™ÁÜòüÿúêÚ!Â#«%‰'o)K+,- /è0Æ2­4Œ6z8`:R;@ì[îƒð®òÜô÷:ùlûƒý•ÿˆ`‹Æ¾Q G †4C³wÿ—û÷öñUìNæù߃٠ÓÃÌÓÆWÁ~¼X¸ü´r²¾°Ù¯½¯K°‡±=³zµ¸çºù½;Á”ÄÿÇqËãÎSÒ³ÕÙYÜ—ßÂâÜåèèàëÇîñfô÷ÃùVüâþZÇ)wÄ ú 1Vs”¢œ˜‹z!d#K%/')í*Ñ,ª.Œ0l2J4468:ð;å=Ú?×AÓCÕEØGØI×KÊM¶OŠQLSáTVVˆWzXYKY YDXßVÔT RƒN,JE&?8J1†)Y!îräÿ-øíð`êväWßíÚG×UÔÒ[Ð-ÏÎ4ÎGΞÎ8ÏÐýÐÒQÓ¤Ô Ö‘×ÙÂÚtÜ2ÞàÛáÂã¶å¶ç¾éÔëïíðAònô¡öÎøüúý,ÿ&½=‰; ~ \ ª|¦9]üô÷úòmí~ç4áÁÚLÔõÍïÇaÂa½¹”µå²±ù¯¹¯$°F±à²µ·Vº_½™ÀìÃXÇÆÊ;ΧÑÕlضÛúÞ#âGåNèOë8îñàóöCù×ûdþãN³Q Ãë #4:=5,!#ì$Ò&²(”*q,Q.-02î3Ó5¸7¤9;‚=y?pAsCnEtGuIpKlMRO1QóR“TVMWNXüXEYYpX/WBU£R?OKF[@ä9Á2+ø"š³ y®ùQò¤ë˜åMàÄÛö×áÔxÒ¦ÐgÏžÎCÎ?ÎŽÎÏÝÏÆÐßÑÓbÔÆÕD×ÏØrÚÜÞÝ¢ßáaãTåNçWéië„í§ïÑñÿó0ö`øŠú°üÀþ¤bóIX s c Ó¹¸½ý×øöóˆî§èqâÜŽÕ(ÏÉhÃT¾ä¹8¶_³W±$°»¯ °±‹²˜´·Æ¹Æ¼ö¿HëÆÊÍþÐhÔÃ×ÛWÞ‰á«ä¹ç»ê¦íˆðOóö¸ø[ûäýg×=“á U‚£¼ÏÕÚÔÊ» ¦"‘$r&W(7*,ö-Ñ/°1“3r5[7C9/;"=?A C E GI KMõNÒPšRETÂUWXßXª@ªB©D¦F®H§J¤L”NtPDRïS{UÓVíW»X-Y6Y½X·WV¶S£PÂLHªB<š5".4&æzü ··ü1õ9îñçUâ‡ÝiÙÖbÓZÑßÏìÎdÎAÎmÎáÎÏlÐrÑ›ÒÝÓ<Õ¯Ö5ØÍÙvÛ*ÝóÞÁà¤âä…æŠè—ê­ìÏîôð"óQõ€÷°ùÒûïýóÿä°SÀìËN i *°¢ç‹þ„úÞõ¦ðïêÚä|ÞØœÑgË“Å;ÀŒ»“·i´²°Ô¯ß¯–°ë±Æ³ ¶´¸˜»»¾ýÁ\ÅÈÈ:̬ÏÓyÖËÙÝJàxã‰æ“éˆìiïAòýô·÷SúìümÿçP®ûD z ¬Ñï ùê!Ó#¸%ž'z)]+9-/÷0Ö2»4š6ˆ8n:a

    L@BBID?FJHBJAL4NPêQ›S0U‘V·W˜XY9YÝXïWnV2THQ‘MIËC¼=7£/Æ'!©TEþ£ö”ï ékãmÞ2Ú²ÖâÓºÑ$ÐÏyÎHÎaÎÌÎkÏ@Ð?Ñ^ÒŸÓöÔfÖé×|Ù#ÛÒÜ™ÞgàCâ.ä æ%è-êEìaî‡ð³òàô÷>ùgûýÿ‚Tw°£3 h  Züq:ÿNûÍö¬ñìæ»ßFÙÚҔ̮Æ;Ák¼N¸ú´y²Ì°î¯Ó¯j°£±c³˜µ)¸ »¾\Á´ÄÈËÏlÒÒÕ'ÙwܬßÝâïåéòëßî°ñzô-÷ÔùmüïþqÕ=…Ø Dd†›©°¬©šŒ!r#]%<'!)ÿ*Þ,¼.š0z2\4=6)8 :<î=ê?ßAãCÝEãGàIÝKÒM·OQJSßTOV~WpXY8YóX%XÂVªTéQPNJÛDù>]81Z)2!ÉXðÚÿøðð\ê‚äaßýÚ[×gÔ"ÒoÐIÏ–ÎNÎ]δÎLÏÐÑ&Ò`Ó´ÔÖ ×*ÙÏÚ€Ü<ÞàãáÎã½åÀçÅéÛëõíðEòqô£öÏøùúý%ÿö®+vp \ / ErûÜÿü°÷±ò)í7çòà…ÚÔÄÍÌÇ<ÂS½ ¹–µæ²± °Ð¯B°`±³&µ¦·xº½¼À ÄwÇåÊUÎÈÑ'Õ‡ØÑÛß=â[åhèaëQî"ñõó¤öWùçû{þîg¿] ¤ Òý2FKKH8.!#%ß&Ä(£*,^.?02þ3á5Ç7°9Ÿ;=„?AzC}E{G~IxKqMWO3QñR“TVHW?XïX.Y YRXWU|ROèJçE/@®9•2ä*Ñ"uý™ kœùRòŸë åXàÓÛØ÷ÔÒ¾ÐϳÎ[ÎWΡÎ.ÏíÏÝÐîÑ#ÓpÔ×ÕS×ÛØ~Ú)ÜæÝ±ß‡álã]åWç_éqë‰í®ïÕñô0ödøˆú¬ü»þº™Wß5@øT 7 ªƒÔxØü’ø®óAîaè*âÅÛQÕûÎëÈMÃ8¾Ø¹2¶c³`±8°Ì¯)°±¯²¶´'·ê¹é¼ÀhÃÍÆ9ʰÍÑ…ÔÞ×/ÛpÞ¢á¿äÔçÌêÂí—ðió"öÏøkûúýwëM§ð 3 f“³ÏÛêæèØÎ µ"Ÿ$…&e(F*%,.á/Á1Ÿ3ƒ5j7O9@;.=!? ACEGIK MúNÔPœRATÀU WXÏX(YY‚XSW‹USÉOÂKñFVA;4n,n$ª; û¼óçìÅæ[á®Ü¿ØŠÕÿÒѹÏÙÎjÎTΔÎÏÆÏ°ÐµÑéÒ.Ô‘Õר+ÚÕÛÝTß,á ãüäòæøèë í>ïiñ’óÅõð÷ú>üSþU8ÿ‘ó ÖB A ÅÂ*ó”ýkù¥ôRï‡éaãÝŽÖ1ÐÊZÄ+¿¥ºÜ¶á³¹±d°Ù¯ °é°X²O´¨¶^¹R¼z¿ÄÂ$Æ‘ÉÍrÐÛÓ9׌ÚÐÝá+ä7ç>ê,í ðàò™õNøèú}ýüÿr×3 à û 'Ldz‰~h Y"B$%& (ê)Æ+¨-ƒ/d1A3'5 7ò8Þ:Í<À>¼@°B·D®F¹H®J®L–N{PARòSvUÌVãW¬XY Y¡X›WèU”SsPœLéG€BH¯Ô¯- F Ýü{h¬FþBú—õ`ð«ê•ä>ÞÍ×jÑ:ËpÅ!À{»Œ·i´²›°è¯ù¯³° ²å³2¶Ð¸À»Ø¾"ÂzÅçÈYÌÇÏ3Ó’ÖéÙ,Ýgà‹ã¢æ«é˜ìƒïOòõÈ÷húýüƒÿ÷bÀ X ‰ ¾áÿ!$ ö!å#Ç%«'Œ)l+H-(/1é2Å4¯6‘8~:o<]>W@RBLDSFLHOJHL5NPæQ¡S(UŒV¯W‰X Y%YÀXÖWGVTQgMâH˜C=Í6t/›'fýŽ95þšöŒï&émã|Þ?ÚÅÖøÓÏÑ>Ð-Ï•ÎYÎ}ÎÝ΀ÏVÐNÑtÒ¬Ó ÕrÖù׆Ù2ÛßÜ¢ÞuàJâ;ä)æ+è6êLìfîð´òçô÷@ùdû€ý‡ÿxJðgš… B ö)ÍÒ9õþû…öfñËëÁå}ßÙ¤ÒgÌ†Æ ÁV¼D¸ö´²×°°è¯Š°¾±†³¹µO¸'»C¾xÁÚÄ9ȳËÏÒëÕDÙŽÜÇßðâ æé ìñîÆñô@÷èù}üÿ~íG á " Oy•®·Á½º©œ!‚#m%M'/)+í,Ë.©0‰2k4L678:<ù=ø?ìAìCéEìGèIçKÕM½OŽQHSßTGVyW`XöX%YÚX XžVŠTºQ,NÐI¯DÇ>*8ï0+) !§4ÝÄÿøêð_ê†älß Ûm×}Ô6Ò‡Ð_Ï®ÎeÎqÎÍÎ\Ï.ÐÑ9ÒqÓÃÔ-Ö«×;ÙÛÚŒÜHÞàïáØãÆåÈçÌéâëüíðHòuô¤öÐøøúý ÿë `Wü8 Q:¾ŸÿÔûk÷kòãìôæ°àKÚÜӜ͠Ç'Â5½¹Žµî²!±°è¯^°~±&³FµË·™º£½ÜÀ/Ä”ÇËqÎäÑCÕ ØëÛ'ßVârå}èxëbî;ñô¾ödùýû‹þtÕ)u ¯ å-FT[\VJ;!&# %ñ&Ò(±*’,l.O0*24î5Ô7Â9¨;¡=?ŒAˆC„E‡G†I~KxM[O4QõRŽTV@W4XÞX YïX±Î²Ö´K· º ½:À‰ÃìÆYÊÊÍ8ÑžÔù×IÛ†Þ»áÕäéçäêÓí®ð|ó4öåø{ûþ‡þ_¸ D w£ÇÛñôûõêÜ Æ"¯$”&t(U*4,.ñ/Í1°3’5v7b9F;A=,?*A%CE%GIKMþNØPœR@T»UWXÄXYYfX5WhUàR¡O”KÁF'AÐ:Ô3A,C$ô‰" îû¯óéìÆædá¹ÜÏØžÕÓ-ÑÎÏð΂ÎiάÎ"ÏÞϾÐÌÑ÷Ò>Ô¢ÕןØ8ÚàÛ›Ýaß5áãåüæéë&íFïlñ˜óÄõô÷ú=üNþN0ó€àó»  š’ö¸ÛSý%ùbô ïCéãÃÜVÖÐçÉ9Ä¿•ºØ¶à³Å±s°ï¯&°±w²q´È¶„¹q¼ž¿áÂGÆ­É$ÍŠÐùÓR×§ÚæÝá>äQçRêCíðôò¯õ]øþúŽýƒéD” Ò 5_uŠ“•”Šy k"N$8&(ø)Ø+´-“/r1R35579ì:Û<Î>Å@ÀB½DÀF»H»J±LN}PDRïSsUÅVØWŸX YYŽXwWËUkSIPpL¸GQB<>5Ä-Û%œ.Ë ƒ›üõ7îòçkâ™ÝÙ2Ö‘Ó‚ÑÐÏ“ÎmΞÎÏ»ÏИѼÒÿÓ[ÕÌÖQØçÙÛFÝßÜàµâ£ä—æ›è¥ê¾ì×îñ'óYõ‚÷­ùÑûãýëÿΚ2œ½”  ·ÉJ.nþþùPõðbêTäýÝ”×6ÑËLÅÀj»„·h´!²¨°ÿ¯°Ð°,²´V¶ò¸ã»ü¾BœÅÉwÌäÏPÓ¬ÖÚDÝ‚à ã½æ»é³ì“ïfò(õÚ÷}úý”ÿ sÒ e ž Íó#/32( "ò#Ø%¼'›)|+X-7/1ô2Ø4·6£8Œ:yc@[B^DTF\HUJML?NPìQœS(U„V¥W|XúXY©X·W)VéS÷P5MºHdC_=6F/p'=Ýl(!þ‘öŠï'éxã…ÞQÚÖÖ ÔçÑRÐGÏ©ÎsΑÎòΗÏeÐeÑÒ¾ÓÕÖØ–Ù:ÛîÜ­Þ}àVâCä1æ7è;êRìoîð½òåô÷=ùeûyýƒÿo>âT„lö Íúš˜²þÍú=ö#ñ‚ë„å8ßÒØmÒ<ÌbÆÁE¼8¸ù´„²è°°° °ä±¢³Ýµo¸K»b¾žÁõÄ\ÈÎË8ϨÒÖ^Ù¦ÜÞß ã!æ(é!ìïÚñ¢ôS÷ûùüÿ’û^¬÷ / `‹¥½ËÍÒÆ¼ª!”#y%`'<)"+ø,Ý.¶0™2y4[6C8+:<>@ùAöC÷EñGôIéKÞMÀOQISÛTBVpWTXåXYÀXðW}VeT“QN¢I~D˜>ù7Á0ÿ(ß „İÿ øáðbêŒävßÛבÔLÒŸÐuÏÆÎ}·ÎâÎtÏ=Ð3ÑIÒÓÔÔ:Ö¼×EÙëÚ”ÜXÞàüáàãÐåÐçÔééëî&ðLò{ô¤öÒøöúýÿ ã H?Û Û(á†\ÿ’û'÷"ò ì­æqàÚ¥ÓkÍ|ÇÂ(½ó¸µð².±/°°x°ž±E³jµë·¾ºÄ½ÁLÄ¶Ç Ë“ÎýÑbÕ¸ØÜ@ßlâ‹å“èëyîNñôÒövùü›þˆå=…  ö@Tfkme]J!6#%'à(Ä*ž,.[0<246á7Ï9¸;«=ž?˜A’C’EGI‡K}M`O9QñRTûU8W*XÍX Y×XXÏVÖT,R½NŠJ‰EÎ?L972Š*}",½d E‚ùEò ë¨ånàíÛ-ØÕºÒëЭÏå·ΆÎËÎYÏÐÑÒCÓ“ÔóÕn×üØ“ÚFÜøÝÊßšá‚ãoågçré|ëší·ïßñ ô6öcøˆú¥ü´þ©ˆ7 À íL%dÿÿTüø#ó³íØç¦áJÛâÔšÎœÈ Ã¾¹¹,¶f³z±U°ÿ¯Y°\±î²ú´l·.º.½\ÀªÃ ÇyÊæÍVѸÔØaÛ¡ÞÑáíäèøêêíÃðóIöõø’ûþž rÉ S гÖðÿÿê Õ"Á$¢&…(f*A,#.ý/à1¼3¢5„7n9V;M=:?7A,C/E+G*I&KMOÚPœR>T·UúVX­XYçXHXW=UÁRoOjKFø@ž:¥3,$Ïh ÙûªóçìËæmáÉÜߨ²Õ)ÓBÑèÏϙ΂οÎ:ÏñÏÒÐÞÑÓPÔ±Õ!ׯØBÚñÛ¤Ýmß>á!ã åçéë,íNïnñžóÅõõ÷ú7üMþC*âsËÙ ýöoa¿›ýåøôÊîúèàâƒÜÖËÏÃÉÄ¿‚ºÑ¶å³Ì±ƒ°°>°#±˜²´í¶£¹•¼¿¿ÃeÆÎÉ>Í«ÐÔo×¾ÚÞ2áVägçgêYí7ðóÅõpøû¡ýš÷X£ ã Fnˆ˜¥¦£š w"b$E&)(*è+Ä-¤/€1c3@5*7 9ù:ê<Ø>Õ@ÊBÊDÇFÇHÁJ¹L NPDRîSoU½VÎW“XøXôXoX\W©UDS!P@LŽGBè; 5–-±%sª u†üõ0îøçpâªÝšÙLÖ ÓÑ&Ð.Ϯ΂γÎ!ÏÉϨЧÑÐÒÔkÕØÖcØñÙ›ÛPÝßåàÀâªä£æ¡è®êÃìàîñ0óVõ†÷®ùÌûäýßÿÊ‹%…¨vñöŽ˜õ.ÈýµùõÐï êä¾ÝZ×ÑæÊ%Åñ¿U»·f´*²·°°)°ï°I²*´u¶¹¼¿eºÅ)É’ÌÐjÓÇÖÚ_Ý—à»ãÏæÕéÅì¬ïxò?õë÷‘ú!ý§ÿ†â2 w ¬ âÿ#2?DB8. "$é%É'­)‰+h-F/%13å4É6°8š:‰r@hBeDdFbH^JULDN PïQ™S'U|VWnXéXúXXœWVÇSÌP M‰H5C.=j6/A'·P þƒö†ï(é}ã’Þ]ÚëÖÔþÑhÐ_ϿΎ΢ÎÏ¥ÏÐrјÒÍÓ'Õ“ÖبÙDÛûܹވàdâIä>æ<èGêXìuî–ð¿òëô÷<ùdûuý}ÿf3ÒClRÕû¢Ídc¾vþ†úøõÜð;ë?åùÞ”Ø:Ò Ì=ÆçÀ3¼-¸ù´Š²õ°(°°À°þ±Ç³ýµ“¸n»„¾ÁÁÅÈéËYÏÃÒ!ÖzÙ¾Üùßã8æ@é5ìïïñ¶ôh÷ú¢ü+ÿ¥ p½ > w—ºÌÚàßØÌº!¤#‰%p'M)0+ -é.Ê0¥2‰4l6O8<:&<>@BDFûGþIñKãMÄO“QHSØT>VdWJXÕXüX«XÑW\VATjQÓMtIMDd>Ì70Õ(³ `õ¬žÿû÷Þð`ê’ä€ß+Û×§ÔbÒ³ÐÏÛΓΟÎô΋ÏNÐHÑXÒ•ÓáÔLÖÇ×VÙôÚ¥Ü`Þ.àâëãÛåÖçàéíë î*ðPò~ô¦öÒøôúýÿØ€ú2%½õ¶÷±ÇIÿPûàöÛñXìhæ0àÒÙmÓ>ÍPÇìÁ ½í¸‡µ÷²8±C°°–°º±i³‰µ¸Þºê½ ÁoÄØÇ=˵ÎÒÕÑØ ÜW߈âå­è£ëîfñ+ôäöù"ü±þ'›öQ“ × 3Mjr}uoX!H#-%'ó(Ð*°,Œ.l0J2(46ð7Û9È;¶=¬?£ACE™G˜IKMeO:QòRTöU/WX½XúX¿XX®V²TR‘N]JYE›?92\*T"¡I 0vù<òŸë®åvàüÛ=Ø1ÕÍÒÑÃÏüΠΚÎäÎiÏ+ÐÑ'ÒUÓŸÔÖz×Ù£ÚOÜ ÞÑß§á‰ãyårçwé†ëží½ïæñ ô:öcøˆú¢ü®þ£{,±ôøžìÅ!ó+˾ÿüÂ÷Øòoí‘çeáÛ¦ÔnÎpÈîÂö½¬¹&¶i³†±g°°w°w±³µ·TºN½ÀÈÃ.ǘÊÎuÑÐÔ3ØzÛ»Þèáåèëýí×ð¦ó[ö ù£û1þ±„Û& g ™Çæø ê"Ë$·&’(x*P,3. 0ð1É3³5‘7~9f;V=J?BA;C7E7G1I0KM OÛPŸR;T³UñVõW¡XòXÒX-XûVU“RIO9KbFÄ@o:r3ä+ï#¦Hë Äõú¡óåìÎæváÓÜóØÂÕ?ÓXÑÿÏϱΖÎÕÎOÏÐçÐîÑÓ_ÔÀÕ3׸ØUÚ÷ÛµÝußJá,ãåç é ë0íVïqñ¤óÆõø÷ú:üCþ@Õe²Æ}àÍC1‡G[ÏüœøÓóî¸è›âFÜå՜ϖÉõÃã¾wºÊ¶å³Ù±°°V°B±¸²³´·Ç¹¸¼á¿&ÃÆðÉZÍÊÐ-ÔŠ×ÙÚÞLánä|çêjíNðóÚõ‚ø&û²ý3« i´ ÷ .Z~˜ª´¶¶§Ÿ †"q$X&6(*ö+Ó-³/1o3S5379;÷<è>Þ@ÙBÒDÔFÍHÌJ½L¨N‚PGRêSlUµVÃW„XåXßXSX@WƒUSùOLbGçA»;Ø4j-ƒ%Mì‘ Y{ü õ0îúçyâ´Ý¯ÙYÖºÓ°Ñ>ÐGÏÃΛÎÇÎ6ÏàϸнÑÞÒ ÔzÕëÖkØÚ£Û_ÝßîàÌâ³ä­æ¨è¶êÇìéîñ5óXõ‰÷«ùÌûÞýÙÿÀ}q‘YÑÏdgáºñ…ýrùÆôŒïÙéÌã€Ý×ÎлÊÅ׿E»v·h´2²Æ°'°E° ±m²G´™¶;¹&¼A¿„ÂÞÅCɶÌЈÓâÖ8ÚxݱàÐãèæééÞì¿ïòRõþ÷¦ú3ýºÿ.šñD ‡ À ï.FOUQK; )"$ø%Ú'¼)™+y-T/413õ4Ö6¾8¨:“<Š>y@vBrDlFmHfJYLMN PòQ—S#UvV’W`XÙXãXyXxWéUšS¤PßLVH Cù<=6ç.'î•3õþzö‚ï)é†ãÞoÚûÖ7ÔÒ‚ÐuÏ×ΤλÎÏ¿ÏЉѦÒàÓ6Õ£ÖصÙRÛÝÆÞ‘ànâSäHæDèMêaìzî›ðÅòéô÷<ùbûpýwÿ]&Å,X5·Ôy0*€4þAú´õ“ðùêùäºÞZØÒâËÆÎÀ¼%¸ö´’²±9°8°Ù°#²ã³#¶³¸“»¦¾àÁ9Å™È ÌtÏÞÒ@ÖÙÙÜà7ãOæXéGì5ïòÌô}÷ú¹ü:ÿ¸ Î R „­ÅàéóïèÝÈ!¶#™%}'_)<+-ü.Ô0¸2–4w6b8E:8<">@BD FHJ÷KèMÇO–QFS×T4V]Wš7_0ª(‰ ?Ø‘‘ÿí÷Ýð^ê›äŠß;۟׼ÔwÒÍФÏõΨηΠϞÏfÐUÑpÒ¡ÓõÔYÖÕ×dÙÛ²ÜkÞ7àâòãäåàçåé÷ëî/ðWò|ô­öÍøõú ýÿþÌræ žÑÊ|’ Üþ û™ö–ñì$æñß”Ù=Ó Í4ÇÅÁ½Ý¸‰µý²C±X°+°´°Ù±ˆ³®µ1¸» ¾BÁÄõÇ_ËÍÎ5Ò›ÕêØ:Üpßâ·åÀè¹ë¡î{ñ=ôûö›ù:ü¿þ=© \« à =bw…‹ˆ{m!T#=%')á*¿,›.z0Z2946ÿ7ê9Õ;Ã=º?¬A­C£E§G›IœK‚MnO8QõRˆTóU&WX±XâX¬XäWVŽTÜQgN,J,Eh?î8Ö1/*,"Þ/ iù8òŸë³å€à ÜKØIÕßÒÑÜÏϸΰÎù΀Ï>Ð%Ñ:ÒcÓ³ÔÖŒ×Ù±ÚZÜÞÜß°á”ãå{çéë£íÅïæñô<ö`øŠú›üªþœm#™ãنƞóÀ÷Œ‚ÿÍû÷”ò)íLç(áÌÚxÔ8ÎNÈÎÂß½¤¹¶u³‰±°)°°™±.³>µ²·rºs½¡ÀêÃODzÊ'ΊÑòÔJØ’Û×Þúá$å$è-ë îñð³ótöù·ûDþ¿4”ì9 r °Òù*)' !ö"ß$Â&¤(…*`,C.0þ1Ú3¿5¡7‰9u;a=X?LAGCBEAG:I7K#MOÝPŸR9T®UêVèW’XàX¹XXÙVþTjR O K4F“@@:B3·+Ç#*Î ²çú›óãìÕæááÜÙÕÕXÓlÑÐ4ÏÈΰÎèÎfÏÐ÷ÐÒ)ÓqÔÎÕ?×ÊØ\Ú Ü¼Ý„ßUá3ã åçé'ë8íXï{ñ¢óÏõô÷ú4üAþ8ÇT «c½¥ûV üVøó8îtèVâ Ü«ÕmÏjÉÕÃ̾iºÄ¶é³ß±¦°0°s°]±Ú²Ó´4·è¹Ü¼ÀHÃ¤Æ ÊzÍåÐIÔ¦×ñÚ5Þbá…ä”ç”êíbð,óíõ˜ø6ûÈýE¼yÆ <pˆ¯¶ÆÊÀ¾ª ™"$f&E()*,ã-Â/œ1‚3\5H7'9;=ó>í@ßBäDØFÚHÐJÄL¬N‡PCRîScU°V¸WuXÕXÇX;XWcU÷RÎOæK/G¼A„;®4:-[%&Ëv Dmüõ/îüç„âÀÝÀÙmÖÏÓÇÑWÐ]ÏÚγÎÛÎNÏòÏÍÐÎÑîÒ2Ô‡ÕúÖyØÚ±ÛiÝ'ßüàÒâÀ䱿²è½êÏììî ñ8ó[õŠ÷¨ùÌûØýÒÿ¸m\y>­ª88ª‚°Fý,ù€ôGï”é‰ãDÝãÖŸÐŽÊãĽ¿7»n·i´;²Õ°>°]°&±Œ²h´¾¶Z¹I¼c¿¥ÂþÅcÉÑÌ:Ð¥ÓüÖQÚ‘ÝÆàëãüæêðìÕï£òdõø´úJýÊÿB§Q › Ï $BSbbdWL ;" $ &è'Ë)©+‡-d/A1"35æ6Ì8²:¥<>Š@€BzDyFsHoJaLMN)PíQœSUqVˆWQXÉXÌX^X_WÀU}StP·L'HØBË< 6¼.ê&ÊqÝõýpöï,éã©ÞÚ×JÔ*Ò˜ÐÏðιÎÒÎ6ÏÐϥИѹÒñÓDÕ³Ö,ØÁÙ`ÛÝÏÞžàvâ^äNæOèSêgì€î ðÉòîô÷?ù\ûpýmÿV¶B˜®OlýðDóýýùoõLðµê´ä}ÞØÕѱËúÅ®À¼¸ô´œ²±Q°L°û°;² ´A¶Ù¸µ»È¾ÂYŸÈ+ÌÏýÒXÖ«ÙôÜ&àPãgæjécìCïòÛô‘÷3úÊüMÿË1’ã( e ”¹ÝéýöîÚ!Ã#«%Œ'n)O+'- /ä0Ç2¢4Š6k8V:C<1>'@BDF HJþKíMÎO”QHSÐT1VSW0X²XÕXwX˜WVõSQzMIêC>g740y(g ¾z|ÿå÷Õðcê ä–ßIÛ´×ÏÔÒæÐ¸ÏÏ»ÎÑÎÏ´ÏyÐiÑÒ±ÓÕdÖé×lÙÛºÜxÞCàâýãîåççïéýëî4ð\ò€ô­öÏøóúý ÿðÃbÔð}¯b›JVÑ™þËúRöRñËëáå°ßWÙ ÓÜÌ Ç­Áé¼Õ¸†µ³T±f°H°Ë°û±¨³ÒµR¸%».¾aÁ´ÄÈ€ËèÎUÒ²ÕÙQÜŠß´âÏåÖèÏë·îñVô ÷³ùHüÕþL¾sµ ú &Rr†˜› “x!f#N%,')ë*Ò,¨.Œ0d2I4)68ö9ã;Ï=Æ?ºAµC²E«GªIKŒMoO;QõRƒTïUW XœXÓXXÍWlVkT³Q;NJúD9?¿8¥1*ÿ!½` ]ù3òžë»åŒàÜaØYÕûÒ/ÑöÏ'ÏÑÎÅÎÏ•ÏQÐ;ÑGÒyÓ¿Ô%Ö˜×!Ù¿ÚeÜ"Þåß½áœã‹å‚çˆé‘ë­íÆïíñô<ödø…ú›ü¡þ•c‰ËÂd¦rÈŒÁQAÿŒû8÷Oòâì çåà”Ú>Ô Î$ȲÂ˽”¹!¶q³ž±ˆ°E°©°¸±O³_µÔ·–º”½ÂÀ ÄlÇÔÊB멄 ÕcجÛîÞâ8å>è?ë$îñÈóˆö-ùËûUþÕC©úK … ½æ 47<6*!#ð$Ï&¶(’*s,L./02í3Ê5±7–9ƒ;p=d?XASCMEHGEI:K,MOäP›R8T¨UáVßW€XÏX¡XùW¹VÚTBR÷NÞJFh@ :3Š+š#c¾ ˜Þú”óãìÚæˆáñÜÙíÕiÓ‡Ñ-ÐOÏÝÎÇÎÿÎ{Ï,Ð ÑÒ=Ó€ÔÞÕP×ÔØmÚÜÊÝß`á>ã'å çé-ë>í]ïñ¥óÑõò÷ú/ü<þ1½=ŽG—€êÐÐÞÿHüøGóòí0èâÊÛyÕ8ÏGɳø¾XºÁ¶í³é±¹°C°‘°x±ý²ò´X· ºþ¼$ÀhÃÄÆ-Ê—ÍÑdÔ¿× ÛJÞ|ášä¬ç¨ê˜ítðCóÿõ¬øHûØý[É5†Ù  N}Ÿ¸ÍÒÛÑη ­"Œ$x&T(:*,õ-Í/±1Š3q5O7;9;=ÿ>÷@ñBçDéFßHÚJÉL³N„PJRåSdU¦V«WjX½X´XXþVCUËRªO³KG‰AV;}4 -0%¬X 5Xüõ&îèˆâÓÝÍÙ„ÖáÓâÑjÐyÏïÎÊÎóÎaÏ ÐÞÐâÑÓCÔ—Õ ×ˆØÚÂÛqÝ6ßááâÅ使¹èÄêÖìòîñ9ó_õ‰÷ªùÈûÑýÍÿ©fóI`Œ† sFwýüëø:ôýîTéBãÝ«ÖlÐdÊÃÄ¡¿*»d·n´A²è°R°w°E±ª²Œ´Ý¶‚¹g¼Š¿Â ƃÉïÌYпÓ×jÚ«ÝÞàäçêíæï»òuõ*øÈúZýßÿR»f ª ã 5Tcrruh^ G"4$&û'Ú)·+˜-q/R1035ö6Ø8Ä:°< >•@BƒD†FzHwJjLPN-PðQ”SUfV€WCXµX¸XDX@W USSPP„LüG¥B™<Þ5‹.À&¡Nþ Æåýfö}ï0é”ã¸ÞÚ#×`Ô>Ò²Ð£Ï ÏÎÎëÎGÏêϲбÑÄÒÔSÕÀÖ>ØÉÙqÛÝÝÞ¨à€âgäZæRè_êjì‰î¤ðÌòòô÷@ùYûkýhÿJ¤'þv‰&=È·²ýºù'õ ðkêvä9ÞçמыËÑŘÀû»¸ó´¤²±c°g°±\²,´b¶þ¸Õ»ë¾#ÂyÅÚÈF̯ÏÓsÖÇÙ ÝBàfã}æéxìWï0òîô¤÷GúÜüaÿÜC£ô9 w ¢Ïè  üê!Ó#»%'})[+;-/õ0Ó2²4—6y8f:K.@-B D FHJLóMÎOšQCSÏT(VKWX¤X¼XaXzWúUÎSòPOMêH¾CÓ=;70P(@ ò£_qÿØ÷Óðeê§ä¤ßYÛÆ×æÔ¢ÒýÐÒÏ(ÏÔÎæÎ3ÏËÏŠÐ}Ñ‘ÒÃÓÕvÖô×|ÙÛÈÜ‚ÞPàâ äóåñçõéìî8ð_òô±öËøôúþüÿì±X¾ñÑa‡;n"‘\þ…úö ñ…ë¡ånßÙÔÒ²ÌæÆ’Áռ͸„µ ³_±~°[°î°²Ñ³íµz¸F»P¾ƒÁÓÄ2ÈœËÏlÒÑÕÙlÜŸßÍââåïèãëËî¢ñhô÷ÆùZüèþ_Í1~Í  ;_…”ªª¯¨™!r#_%=' )+Ú,¾.”0x2U4968:î;ß=Ð?ÉA¾C¼E¶G°I¥K’MpO@QðR„TåUWøWXºX|XªWPVETŠQNÑIÌD ?8t1Ý)×!šC ùSù-ò ëÀå˜à&ÜuØlÕÓFÑ ÐAÏæÎÝÎ'ϨÏgÐLÑ[ÒˆÓÐÔ4Ö¦×3ÙÆÚwÜ(ÞößÂá«ãåç‹éë¯íÍïññô>öføúžü•þUy³¨D‚Kš[†ÿHûôöòœìÇæ£àYÚÔÜÍȑ¸½ˆ¹¶x³§±Ÿ°X°È°Õ±o³„µô·»º·½âÀ/ÄŠÇóÊ_ÎÄÑ(Õ€ØÄÛß-âMåXèPë>îñáó—öCùÝûgþèS¼ \ – Ðö0BHMD<*!#ý$ä&À(¦*~,`.:02÷3Ü5¼7§9;~=n?fA]CXETGJIFK.MOáP R3T¢UÝVËWxX·X‹XßW˜V¶TRÊN²JÔE4@Þ9ã2b+n#=æ ŒÌú‘óßìàæ’áÿÜ&ÙýÕ‚ÓÑDÐhÏòÎàÎÏ‘Ï?Ð Ñ$ÒOÓÔîÕ]×ãØyÚ!ÜÕÝ—ßmáDã6å%ç(é5ëBígï~ñ­óÎõö÷ú-ü7þ'ÿ­0uy%{S×ꑢÿüÒ÷þò¯íêçÖáŽÛ?Õ Ïɖß¾Lº»¶ï³÷±Ä°`°¦°›±³µv·1º½IÀˆÃåÆJʶÍÑ„ÔÖ×)ÛbÞ“á´ä¾çÁê®í†ðZóöÂøYûïýgáAé ) a¯ËÚæçåÛÊ º"$†&f(E*&,ÿ-â/»1œ3~5_7G90;=?AýBòDðFèHàJÐL¶NˆPIRäS^UV¤WVX±XšXXáVU¦RO†K×FUA*;K4à,%ØŽ< Müõô)îè’âàÝÜÙ™ÖôÓùрБÏÏàÎ ÏsÏ!ÐïÐôÑÓRÔ¨Õ×—Ø(ÚÍÛÝ?ß áëâÏ䯿ÀèÌêÝì÷îñ<óbõ‹÷¨ùÄûÎýÄÿ¡Yà9C gaÞÙ?4Áü¦øóó¾îéãÅÜwÖ9Ð>ʞČ¿»a·n´N²ó°j°Ž°f±È²­´·¢¹¼¨¿æÂ?Æ¢É ÍwÐØÓ4ׄÚÃÝ÷àä*ç,êíýïËò‹õ;øÛúlýòÿdÍ(v ¼ ó "Ectƒ‚„ym Y"@$(&(ê)Ç+¦-‚/_1@357ä8Ó:º<°>ž@—B’D‹F‡H}JmLYN+PôQ”SUbVpW;X¡X¦X'X#W~U-S'PYLÍGyBg<°5].˜&{-ã °Öý_ö{ï1é ãÀÞ¢Ú1×yÔRÒÌÐ¸Ï ÏæÎÿÎ`ÏûÏÉоÑÜÒÔgÕÍÖKØÚÙzÛ)ÝèÞ°àânäbæ^èaêuì‰î¬ðÌò÷ô÷?ùVûhý_ÿDÿ˜ïÞYcû‘ÈrýxùäôÂï+ê3äüݰ×iÑcË­Å‚À黸ô´«²,±y°°1±~²G´Š¶¹ø»¿AÂšÅøÈdÌÍÏ1ÓÖÞÙ$ÝXà}ã•æ”éìkïBòõ·÷[úíütÿëX² I ‡ ¶Üü ! ú!â#Ë%©')h+K-%/1á2Â4¥6‡8t:Z?@6B-D)F"HJLöMÓO—QGSÈT%V\8L1©)²!r%çåGù&ò¢ëÂå¤à3܇؀Õ&Ó_Ñ"ÐZÏýÎõÎ:ϾÏyÐbÑjÒžÓÛÔEÖµ×<ÙÛÚ|Ü<ÞúßÕá­ã å’ç—é¢ë¸íÐïùñôEöaøƒú”ü—þ‚Möd¢Œ&_#l)PÙÂþû°öÁñXìƒæcàÚÓÓ®ÍÛÇr¤½}¹¶|³´±®°t°Þ°ø±³§µ¸ÝºØ½ÁLĬÇË|ÎãÑCÕ—ØãÛßHâcåmèiëQî*ñõóªöWùïû}þöjÈ n ¥ ã+BQZ\UKófõŠ÷ªùÁûÉý½ÿ˜IÕ1æH;±© Òúÿ|ü`ø²ópîÌè¾âŒÜ<Ö ÐÊ~Äs¿ »X·p´W²±°©°€±ê²Ï´"·Æ¹±¼Æ¿ ÃYÆÇÉ'Í•ÐõÓOמÚÜÝá0äAçCê1íðáòžõSøêú„ýyÞ:‰ Ì 3Vu„““”‹z k"P$9&(û)Õ+¶-/q1K3057÷8Ü:Í<·>¯@¢BœD–FH„JvLZN0PóQ’SUXVjW'X“XŒXXW`USûO/LšGJB5<5-.m&S Å šÅýVöwï5é¥ãÏÞ¯ÚH׊ÔjÒâÐÑÏ8ÏýÎÏuÏÐÙÐÕÑêÒ$ÔuÕÛÖ]ØâÙŒÛ1ÝôÞ¼à–âxälædèkê{ìî°ðÓòõô÷<ùUûdýVÿ<ðˆÞûÃ8<Ñß]GŠ/ý3ùœô~ïâéòãºÝx×6Ñ6Ë‹ÅeÀÙ»¸ô´³²;±Ž°˜°O±²k´ª¶?¹¼.¿g·ÅÉÌëÏOÓ¨ÖýÙ;Ýrà•ã«æ­é¢ì„ïTòõÈ÷núý…ÿeÉ ^ — Æï !+3/* "ò#Ù%¼'œ){+X-5/1ñ2Ð4²6—8:kL@?B;D3F+H$JLüM×O˜QCSÈTV9WX‚X“X/X?W¸U…SŸPøL‹H_Cq=Ú6§/÷'ï­d4HÿÈ÷Åðiêµä·ß{Ûç×ÕÐÒ)ÑÐVÏÏÏ^ÏóϳУѴÒçÓ2Õ—Ö ØšÙ4ÛáÜšÞbà8âäæèÿéì$îFðeòˆô±öÏøíúøüõþÜ›8šÃž!>诰Úýÿù†õðýêåïÞ­ØfÒ]ÌšÆ]Á°¼¹¸µ³u±¨°Š°%±T² ´4¶¾¸‹»–¾ÅÁÅqÈÙËDϤÒÖWÙ›ÜÔßúâæéìõîÌñôF÷íùü ÿ„òO¨ê + […¢ºÇÏÍÉ»¬!”#|%^'?)+û,Ù.·0“2t4T6:8: <ø=é?áAÓCÓEÇGÁI³K›MzOBQïR~TØUWÞWpX“XHXwW VT7Q¼MrIpD¤>.81~)‰!NÎÓ<ùò¢ëËåªàGܔؗÕ:ÓwÑ9ÐqÏÏ ÏSÏÓÏŒÐuÑ}Ò«ÓòÔNÖÆ×KÙäÚÜAÞ àÙá¼ã¥åœçžé©ë¼íÛïõñ ô@öeø€ú‘ü‘þxDäW…w>ù?ö‚þÅúföñ ìDæàæÙ™ÓƒÍ²ÇW½q¹¶ƒ³¾±Ã°ˆ°þ°²³³Ãµ>¸ýºû½(ÁoÄËÇ2˘ÎÒ_Õ±ØþÛ1ßcâvå‡è|ëhî?ñô¿ökùüþ |Ú4z ½ í9Qefod[M!3# %ÿ&â(Ä*œ,€.U0:24ú5Ø7Ã9¨;™=ˆ?|AwChElGXIVK:MOéPžR.T›UÅV½WPX—XYX§W[VmTÍQuNUJuEÓ?|9†2+ #í©i bµú~óâìèæ¥áÝDÙ)Ö©ÓÌÑsЖÏ#Ï Ï@ϺÏhÐEÑLÒmÓ±ÔÖy×Ù’Ú9Üîݯß}á_ã@å;ç9é=ëXíiïñ®óÖõô÷ú%ü,þè‘ LEì1 e9y!ÿ‚ûF÷vò"ícçRáÛÎÔ­ÎËÈXÃs¾2º²¶ö³ ²é°ˆ°ß°Õ±[³Zµ¾·rºf½‰ÀÌÃ$ljÊñÍXѸÔØYÛ–ÞÄáÞäòççêÛí°ð€ó:öåø…ûþ“h¿ M ƒ®Ôè úí Ø"¿$¦&„(f*C, .ý/Ú1¸3œ5z7c9K;6=(?AC EGþHíJÞL¼NPHRâSRUVŒW:X‹XkXÒW¡VØTZR&O0KvF÷@È:ì3†,±$K ô0üäô'î è¦âöÝÚ½Ö!Ô#ҲпÏ6ÏÏ5Ï ÏGÐÑÒ:ÓnÔËÕ2ײØFÚäÛ™ÝTß$áýâääÖæÓèÙêììï"ñAóhõŠ÷©ù¾ûÄý¶ÿŒ?Á Ê(ˆuÕ–»ÿ;üøkó,îƒèâKÜÖÚÏãÉcÄW¿þºQ·s´]²±”°Ã°Ÿ±³ó´C·é¹Ñ¼î¿'ÂÆÝÉLͯÐÔi×¹ÚôÝ*áDä[çVêIí%ðôòµõbøû“ýŠóJ› Ý Hd‡•£¦¢›‹ z"a$F&*(*è+Ä- /€1Z3=579î:Ö<Æ>¹@¯B¨DžF›HŠJ~L_N5PñQ“S USV]WX{X|XòWæV:UßRÓOLmGBX@NBCD>F4H,JLN×OœQASÃTV)WúWoX|XXW™U^SvPËL[H0C>=«6t/Í'Ä‹F;ÿ·÷Çðfê½äÃ߆Ûý×"ÕåÒBÑÐnÏÏ(ÏuÏÐÆÐ·ÑÅÒùÓCÕ¥ÖؤÙFÛéÜ©ÞlàDâ#äæèêì2îEðkòô¯öÔøåúùüëþÓ&ˆ«‚¿ß{tß•ý¿ù;õ;ð¶êÕä²ÞmØ8Ò*Ì|Æ;Á¢¼«¸‚µ³ˆ±¶°§°?±t²/´W¶Þ¸²»²¾îÁ0Å–ÈôËcÏÂÒ"ÖqÙµÜîßã,æ/é%ì ïßñ¥ôZ÷ÿù–üÿ—c·þ ; m–±ÏÓãÜÙ͹!¨#ˆ%p'N).+ -ç.Æ0£24e6D81:< >ò?îAàCÙEÕGÄI¾KŸM~OAQòRxTÕUöVÔW]XX0XWWìU×SQŒMHI=Ds>8é0T)_!)è³Ä-ùò¡ëÑå¶àRܨةÕSÓ‹ÑQЈÏ,Ï ÏgÏéϠЉÑÒ¾ÓÕaÖÓ×YÙðÚšÜMÞàåáÃã°å¥ç¦é°ëÃíÝïüñ"ôAöfø}úü‹þq7ÖDpZèÖ ÇÜcBþú$ö6ñÍëùåæß¢ÙjÓQÍÇ9Â{½f¹¶†³Í±Ò°¡°±1²Ó³çµ^¸"»¾LÁÄíÇO˸ÎÒ{ÕÍØÜOßvâ”å˜è–ë|îRñôÑöùü þ‹ïC Ë +Jdsz~toX!H#,%'ñ(Ò*®,Œ.j0E2&46ê7Î9¹;¤=•?ŠA~CxEnGgIWKCMOëPžR,T“UÀV­WCXXAXW8VKT¥QIN(JEE¢?L9V2Ø*ó"ˆO P¥úyóàìëæ°á'ÝYÙ8ÖÂÓàыЭÏ9Ï#ÏVÏÐÏzÐ[ÑZÒ‚ÓÂÔÖŒ× Ù¢ÚEÜ÷ݻ߉áeãNåAç?éIë[íqï‘ñ³óÕõú÷ú%ü$þÝ…ú8*Ðá9Fàäþ?û÷/òÞìçáÚÚœÔzΦÈ8Ã]¾'º©¶ÿ³²ý°ž°û°ò±{³|µß·˜º†½¬ÀìÃDÇ«Ê ÎzÑÏÔ.ØqÛ¯ÞÝáöäèëêíËð‘óOöøø–û$þ¢vÓ \ ˜»çøÿ å"Ï$¶&’(v*Q,0. 0è1É3¨5Š7s9S;J=.?,ACE GIøJàLÄNŽPLRÚSTUV†W(XxXUX¶W„V²T6RùNKCFÈ@–:¼3Y,…$i%ï Û$üÚô%îè¯âÞÚÐÖ7Ô8ÒÍÐÐÏSÏ ÏMϵÏ[Ð,Ñ+ÒEÓƒÔÖÕC×ÁØRÚðÛ£Ýbß,á ãìäÝæÝèßêñìï%ñEójõ‹÷§ù¼û¾ý°ÿ‚/±úû°ì]E ]~ÿùûÜ÷"óëí=èBâ ÜÎըϾÉ@ÄC¿ìºM·u´h²&±§°Þ°½±'³µc· ºõ¼ ÀLÃÆÊhÍËÐ/Ô„×ÒÚ ÞAá]äqçmê\í=ðóÉõtøû¢ý+˜[­ ï 'Tz“¨²¶±­™ Œ"m$X&8(*ø+Ñ-°/Œ1m3H5-79ø:æ<Ñ>Å@»B±D©F¡H“J‚LeN6PòQSUMVRW XmXaXÝWÅVU¹R©OÔKAGäAÛ;5Ù-&ÉŠ q£ýDöoï:é¶ãåÞÏÚl׳ԘÒÑÐeÏ*ÏBÏ¡Ï7ÐÑõÑÓCÔ”ÕüÖsØÚžÛNÝ ßÑàªâŒäzæwèxêˆìî¸ðÚòüô÷<ùQûVýOÿ"ßa»Æòô{~÷Юü«øôïî\émã@Ý×ÔÐßÊIÅ1Àº»÷·õ´Ä²Y±µ°Î°„±Þ²¬´ï¶…¹a¼r¿¨ÂûÅVÉÀÌ#ЈÓÞÖ0ÚmÝ£àÃãÖæÛéÌì¬ï‚ò;õö÷ú+ý¨ÿ'‰ê; } ¼ æ*DJTPI= ("$ù%Ú'¼)™+u-T/01 3ï4Í6³8:€b@YBODGF>H2J#LNßO˜QCS½TV#WêW_XiXûWWrU¢Yý|ùûôöïtê”ätÞ7ØÒÌUÆ&Á‹¼¨¸µ%³”±Ë°¾°Y±”²M´{¶¹Ñ»Ù¾ ÂUůÈÌzÏàÒ;ÖŠÙÐÜà*ãAæEé<ìïõñ·ôn÷ú©ü.ÿªvÇ K |¥ÄÛèïíèÛÌ!±#ž%y'b);+-ù.Ñ0±2’4n6W89:%<>@óAïCâEÜGÐI¿K¨MOFQïRuTÍUïVÅWOXjXX;WÌU³SëPcMIDC>Ò7º0*)5! Çž°#ùò ëØå¾àdܸؽÕhÓ¢ÑgРÏAÏ6Ï}ÏüϳМџÒÍÓÕoÖá×gÙþÚ¤Ü\ÞàïáÐã¶å®ç®éµëÊíáïò#ôDöføyúŒüƒþh.Å2Z?Éôªã‘©(þAúßõõð†ë¾å¡ßoÙ4Ó&ÍlÇÂk½Z¹¶³Ö±ì°±°8±L²ô³¶¸B»@¾jÁ¯Ä ÈmËÔÎ9Ò”ÕèØ-Üfßâ§å°èªëîjñ/ôçöù%ü·þ, ÿT¡ Ü <Yv€Šˆzk!V#=%')Þ*¾,™.y0R2446ö7Ý9Å;°=¡?”A‹C€EyGmI`KEM&OéPŸR'TŽU·V W8XgX3XiWV#T‚QNúIEo?"9%2¯*Ê"§h7 <˜úuóÛìöæ¶á5ÝjÙLÖÖÓøÑ ÐÄÏQÏ7ÏlÏæÏŒÐpÑiÒ•ÓÎÔ-Ö•×ÙªÚSÜÞÃß—ákã[åGçJéNë`íxï“ñ¹óÕõû÷ú!ü!þÓvè"°í¹ × «£þûÀöêñ›ìÜæÔà ÚfÔOÎ~ÈÃE¾º¨¶ÿ³"²±º°±²›³šµ¸¸º¨½ÍÀ ÄdÇÇÊ+Î’ÑíÔEØ‹ÛÇÞôáåèëîÜð§óaö ù¨û5þ´%‹ã, o ¤Ïö ')% !ø"Ý$Å&¢(†*^,A.0ú1Ö3µ5š7z9h;O=B?/A+CEGIþJèLÅN”PGRÞSGU€VtWXdX@X˜WgVTRÑNÙJF™@g:Œ31,Z$FÓ ÊüÔô!îè´âÞÚåÖKÔOÒâÐéÏgÏ9ÏbÏÊÏnÐ?Ñ<ÒWÓ”ÔåÕR×ËØaÚûÛ±Ýjß9áã÷äææäèæê÷ì ï(ñKóiõ÷£ù¼ûµý¬ÿt#¢áçãÅ2k%>ÿ½û”÷äò£íèþáÕÛ™ÕxÏšÉ Ä-¿àºH·v´t²4±¾°ø°×±J³2µ‰·,º½.ÀmüÆÊ„ÍçÐKÔ×êÚ)ÞSáxäƒç„êpíQðóßõ…ø*û¶ý8¯n¾ þ 7g†¦·ÁÈÀ¼« ˜"€$d&H(&*,â-¾/š1z3V5=79;ñ<Þ>Ò@ÄB½D³F¨HJ†LiN9PñQ‘SÿTGVEWXYXOX¾W­VóT–R€O©KG·A©;ï4©-ë%à§q Y˜ý9ölï?éºãöÞÛÚ‚×ÅÔ±Ò ÑÐxÏDÏUϸÏJÐÑÒ"ÓTÔ¥Õ×…Ø Ú±ÛTÝßÙàµâ–䄿|è‚êì¥î¼ðßòûô!÷;ùMûVýCÿÎS§¯sÒÍQQ¿ÐÿrühøÐó¬îé+ãÝÉ֦жÊ$ÅÀ§»ð·ø´É²j±Ê°ä°¥±ú²Ï´·§¹ƒ¼•¿ÈÂÆvÉÜÌBСÓúÖIڇݺàÛãîæñéßìÅïòVõø¦ú9ý¾ÿ5ŸúK Ê û?P]c`ZJ 9"#$&ì'Ç)«+ƒ-b/A13þ4Ú6Â8¦:’<~>o@dBWDRFFH:J(L NÞOQ@S¹T VWâWJXVXáWçVUUS&PtLHÐBá@BöCðEáGÛIÄK¯MOGQíRsTÇUåVºW¡7Š0) !å©…œùò¢ëÛåÌàlÜÍØÎÕ}ÓºÑ|кÏTÏPÏÏÐÉЩѷÒÙÓ&ÕyÖô×qÙÛ®ÜhÞ(àúáØãÀå¶çµé¾ëÐíæïò$ôHöcø{ú…ü€þ^$¶ E$¬Ð·]tìÄýýùõ®ðEëxåeß4ÙÓùÌFÇÂU½P¹¶‘³æ±ø°Î°O±n²´,¶¡¸f»a¾‹ÁÒÄ(ÈËïÎVÒ¯ÕÙFÜ~ß§â¾åÈè¾ë§î{ñGôøö¥ù:üÅþA°f² ì $Jn‚•™ž•‹|!c#M%0')ï*Í,©.…0e2?4$68ì9Ð;À=«?¡A•C‹E‚GvIfKLM)OìPŸR#T‹U«V˜W#XYXXRWüUTYQóMÏIçDC?î8ø1€*¢"‚I (ŠúmóÜì÷æÀáBÝyÙaÖéÓÒµÐÝÏeÏQÏ~ÏûϠЂÑ}Ò¤ÓáÔ8Ö©×&Ù¼Ú]ÜÞÐßžáyã`åRçOéWëeí}ïšñ·óÝõö÷úüþÊeÛ û’É”à¤Ømgþ¾úzö©ñSìæ’àeÚ2ÔÎZÈýÂ3¾ º¦¶´+²±Ì°-±/²¹³¾µ&¸×ºÍ½ìÀ/Ä‚ÇæÊIίÑÕaØ£ÛãÞâ*å,è1ëîôð¹óvö ùºûJþÄ<˜ö> µà/778(!#ì$Ô&³(’*s,J.+02æ3Ã5§7‰9v;[=O?=A3C+EGIKïLÊN”PHRÜSBUxViW XRX(XWFVnTæQªN§JêEh@4:b3ü+5$é³ ¸üÎôîè»âÞ-ÚøÖ]ÔgÒõÐÐzÏRÏuÏãÏÐTÑLÒjÓ£Ô÷Õ_×ÛØlÚ Ü¼ÝwßDáãåîæíèïêýìï.ñMóoõŠ÷¨ù³û·ýŸÿmÑÊv¾¡ã9åÿuûT÷œò_íºç¾á—ÛaÕIÏnÉĿѺD·u´²D±Ò°±õ±f³Xµ¥·Tº5½TÀ‰ÃàÆ=Ê£ÍÑgÔ¹×Û@Þoáäç™ê‡íeð2óðõ›ø=ûÉýN¾(}Ò Mr³ÉÓÕÔʺ «"$w&V(6*,ï-Ð/§1Š3f5I7.9;þ<í>Û@ÓBÆD¾F±H¤JŒLpN9P÷Q‹SÿTWðWKX4X¨WŠVÕTlRYOxKäF…Aw;¾4z-¼%º‚R D‚ý1öfï@é¿ãÿÞêÚ’×ÙÔÄÒ8Ñ/ГÏVÏoÏÈÏbÐ*ÑÒ4ÓdÔ¶ÕדØÚ¶ÛiÝßëà½âŸäŽæ…èŠê•ì¨îÅðÝòõ÷@ùHûRý>ÿÃEœR¶§%$‰d–ÿ-ü(ø‰ógîÖèçâÉÜ“ÖqÐÊÅÀ–»ê·ö´Õ²u±ß°ü°Â±³ï´4·Ç¹©¼´¿ëÂ:Æ—ÉúÌ`оÓ×cÚ¡ÝÒàõãçêøì×ï©òhõø¾úIýÔÿE± \ £ Û 1Mcmtqi\ I"2$&ú'Ú)¹+“-t/J1/35ì6Ð8´:Ÿ<>z@qBcD[FPHBJ.LNáOžQ?SµTV WÐW=X>XÊWÉV2UðRúOILÒGŸB°<6ì.I'PñÓÿ—÷·ðkêÎäæß­Û5ØYÕ)Ó€ÑaЭÏ`Ïg϶ÏDÐÑìÑûÒ(ÔsÕÑÖIØÏÙhÛÝÊÞàbâ@ä+æ#è!ê/ì>îXðvò“ô¶öÎøåúèüÝþ´lúNi.¤«BXÝÓ%ÞüòøuôiïîéäúÝÄ×žÑ«Ë ÆòÀh¼“¸µ0³±±ñ°ï°’±Ð²´¾¶F¹¼¿I˜ÅíÈVÌ´ÏÓpÖÀÙÝ4àZãnæséeìKïòãô“÷:úÌüWÿÍ:—ë2 o žÈäþ ýé!Õ#¹%ž'|)[+:-/ö0É2±4Š6s8R:D<&>@ BDöEñGÝIÏK²M…OKQéRsT¿UÝV­W*XFXãWW‰UjSœP MÀH®Cå=o7\0Ò(ã À‹i‹ ùò¢ëÞåÔà}ÜØØæÕŽÓÐÑ”ÐÎÏmÏdÏ¥Ï(ÐÚпÑÇÒëÓ4ÕŒÖýׄÙÛ¾ÜrÞ4àâàãËå¾ç½éÄë×íìï ò)ôGöeøxúƒüyþV© 0 ®V‹*=°„ý¼ùXõkðë5å(ß÷ØÍÒÌÌ ÇåÁA½G¹ ¶˜³ð± ±ä°m±ˆ²6´K¶Å¸‡»‡¾©ÁõÄFÈ­ËÏrÒËÕÙ`Ü—ß¿âÔåàèÒë½îñZô÷¶ùNüØþTÃ!zÀ  1_{•¤«¬§š!s#^%='!)ÿ*Ü,¸.•0q2R4.68÷9ß;Ë=º?«A¡C–E‹G}InKRM*OòP™R%T‚U¤VŠWXCXÿW5WÞUÝS1QÊMŸI¹D?½8Ê1S*x"]' €úaóÞìøæËáN݈ÙuÖûÓ&ÒËÐôÏyÏiÏ‘ÏгВѓҰÓöÔEÖ¸×5ÙÇÚkÜÞÚߪáƒãhå]çUé_ëkí„ïœñ½óÜõø÷úüþøÿ½YÉóäp©l±wŸ4+þyú;öbñìXæUà*ÚüÓòÍ1È㾺 ¶´:²)±ê°@±S²Õ³âµE¸üºî½ÁMÄ£ÇËeÎÍÑ#Õ{Ø¾ÛøÞ#â=åIè@ë.îñÑóˆö3ùÎû[þÙJ®S Èñ/<IHE;,!#ÿ$ã&Á(¥*|,].802ò3Ó5²7›9~;n=V?LA=C3E)GI KóLÎN—PHRØS>UoV_WýW@XXeW&VLTÀQN|J¹E:@:03Ò+$ùÄ ùûÂôîèÄâ*Þ?Ú×tÔ|Ò ÑБÏgÏÏóÏ•ÐgÑ]Ò~Ó°ÔÖm×êØzÚÜÉÝ€ßOá$ãåûæðèùêíï3ñRónõ÷£ù´û¯ý˜ÿcº³Xž{Ø·þ²Åþ8û÷Zòí{ç|á^Û*ÕÏIÉßÿº>·|´ƒ²Y±å°/±²ˆ³vµÊ·sºZ½qÀ¯ÃûÆ^ÊÀÍ!уÔÒ× ÛZÞ†á¥ä±ç¯êžíwðGóö°øOûÝý\Õ5•Ý $ Y‡­ÂÝÞêáÚÌ ¶"£$‚&h(D*%,ÿ-Ü/º1”3x5S7<9 ; =ú>æ@ÞBÐDÆF¼HªJ”LrNéËãßýÚ¡×ïÔÙÒPÑEЩÏnÏÏáÏsÐ?Ñ-ÒCÓwÔÁÕ)מØ-ÚÃÛsÝ*ßòàËâ¦ä˜æŒè’êšì±îÆðæòõ"÷8ùLûIý9ÿ¶38’‚üóX(\ÿîûä÷Gó$î‘è«âŒÜ\ÖDÐaÊæÄ迊»á·ù´Û²…±õ°±ß±9³µT·í¹Å¼Ü¿ ÃZƵÉÍ|ÐÛÓ.×€Ú¶Ýîàäçê íìï¼ò|õ,øÎú^ýãÿZÁm ´ ë A^q€€…un W"C$'&(ê)Æ+¥-/]1935ø6Ý8Á:¬<—>‰@zBnDfFUHLJ2LNåOQ=S²TûUWÈW%X.X¯W¬VUÉRÔOL¨GmBƒ<è5Â.'*ÿпôþ÷²ðlêÕäíßÃÛ@ØsÕ:Ó˜ÑwÐÄÏxÏ|ÏÌÏWÐÑýÑÓ7Ô„ÕàÖVØÝÙvÛÝÔÞšàhâOä/æ.è(ê3ìGî[ð{ò˜ô³öÓøÝúéüÓþ«cåBJ€†&®™êÿ ü¯ø4ô#ï¬éÏã»ÝŽ×kÑ‚ËëÅØÀW¼¸|µ;³¼±±±¯±î²°´à¶f¹:¼<¿n³ÅÉpÌÔÏ5ÓŠÖÜÙÝPànã‡æ‡é|ì_ï2òóô¨÷LúÞüiÿßK«úF { ´Ôú ! û!ã#É%«')j+G-$/1Ü2½4™6€8a:M<8>'@B DFöGèIÕK³MOCQñRhT¼UÒV WX/XÍWèVgUISnPãLHC¸=;740¢(¾ jUwýøòœëêå×àÜæØûÕ£ÓåÑ®ÐáφÏxϼÏ:ÐñÐÍÑÛÒúÓDÕšÖ ØÙ$ÛÉÜ|Þ@àâëãÓåÇçÅéÌëÜíòïò,ôKöbøyú|üuþL —þðo†3YútIýxùõ%ð¼ê÷äèÞÁؘңÌùÆÍÁ*½A¹¶ ³û± ±û°†±ª²Q´p¶å¸©»©¾ÉÁÅgÈÊË.Ï‹ÒèÕ6ÙzܯßÖâíåôèëëÎî¨ñkô"÷Êù_üíþdÕ4‹Ó  Dl¥´¼»¸ª›!…#j%R',)+è,Ê.¡0‚2^4<6$8:ñ;Õ=È?·AªC E•G…IwKUM0OñPœR T|UV{W X-XëWWÀU¸S QMuIˆDâ>8—1**L"9è ÿpú\óÚìþæÏá\ݙمÖÔ9ÒâÐ Ð’Ï{Ï­Ï"ÐÉЦѡÒÉÓÿÔYÖÄ×CÙ×ÚvÜ'Þéß±áãqåeç`éfëqí‰ï¢ñÀóÞõø÷úüþíÿ´J·áÇU…D‡Cjûèý>úóõñÎëæàîÙÈÓÂÍÈÁ ¾ò¹Ÿ¶ ´C²@±÷°e±i²ù³¶f¸ »¾2ÁmÄÅÇ!Ë„ÎéÑ@Õ•ØØÛß;âUå_èXëBîñæó›öIùÞûrþè`¼^ ¦ Õ%>OW\SL;!%#%ð&Ô(±*Ž,m.E0&24à5Ä7£9‘;u=g?UAHC?E2G$IKõLÕN˜PIRÖS9UfVTWîW-XûWHW V%TQRNQJŠE @Ô93¢+ß#Ñ¥ Œåû½ôîèÎâ3ÞPÚ׉ÔÒ#Ñ.ЩÏ|Ï¡Ï Ð¨ÐyÑrÒŠÓÇÔÖ}×øØ‡Ú#ÜÓÝŒßYá/ãåÿæýèûêíï;ñQótõ÷£ù²û¨ý“ÿXûn¨™;}S°ƒÎuˆþøúÍöòØì4çAáÛ÷ÔêÎ!ÉÁÃé¾´º9·´²g±ü°H±,²ª³•µî·•º{½–ÀËÃ!ÇxÊáÍ=ÑŸÔí×;ÛpÞ¡á¼äÈçÈê¯í‘ðYóöÃø`ûñýqãK¢ô 0 n•½×çõöóêÛ Ç"°$”&v(U*2,.ë/Ç1¥3‚5f7F90;=?÷@æBÛDÑFÁH´J™LvNBPòQ‹SôT.V'WÔW$X XpWPVT$RO&K‚F+A;b4-j%kA cýö_ïCéÑãß Û²×ÕíÒgÑ[ÐÁςϚÏóÏŠÐOÑAÒSÓ‡ÔÒÕ7׬Ø8ÚÑÛÝ3ßáÐâ´äŸæ–è˜ê¢ì´îËðêòõ!÷;ùDûJý-ÿÿ¨#khmaÎÃ%ñÿ°û¡÷óâíMèjâPÜ%ÖÐ7ÊÈÄÌ¿€»Ö·þ´ã²•± ±/±ù±Y³0µv· ºë¼ø¿.ÃyÆÒÉ9Í•ÐùÓH×™ÚÐÝá ä3ç1ê#íðÑòõ@øßúsýõÿi×.‚ Á *Umƒ’‘Šy k"Q$5&(÷)Ö+´-Ž/l1F3)57î8Î:¸<¥>•@ƒB~DiFeHNJìHîdð|òšô·öÏøÞúáüÍþ¤RÚ)8úacîûya°ÿ]üqøìóåîeé‘ã~ÝW×;ÑWËÍÅ»ÀK¼¸‚µ?³Ì±±±Í± ³Ï´·Š¹Y¼a¿ŒÂÖÅ.ÉŽÌòÏOÓ¨ÖôÙ2Ýià…ãžæ›é”ìqïIòõ»÷aúñüyÿôZ¾ T ‘ Àé)1/' "õ#×%¼'œ)x+X-0/1ê2Ê4§6Ž8p:Z1@'BDFûGóI×K½MŒOKQëRfT¶UÇV–WXX²WÌVHU!SJPµLdHPC†=70x(— uR:eôøþñŸëïåãà›ÜúØ Ö¹ÓþÑ¿ÐüÏšÏÏÑÏOÐÑäÑèÒÔPÕ«ÖØ›Ù4ÛÓÜ‹ÞIàâõãÜåÐçÊéÖëÞíúïò.ôLöcøuú{üjþHûŽæÔNd-ÆÐ8ý9ùÏôåïuê¹ä§ÞŠØcÒwÌׯ°Á½5¹¶¥³ ²2±±£±Æ²t´¶¹Í»È¾îÁ3ŇÈéËIϪÒÖPÙ”ÜÇßíâæéìáî¾ñ}ô9÷ÚùwüûþyåHšä # TµÅÊÏľ¨!–#z%_'?)+ø,Ø.°0‘2l4K608:ú;ä=Ñ?ÄA·C§E GŒI|K[M4OñPœRTwU’VqWõWXÎWþVšU˜SàPsMGIWD´>\8m1ù)'"êÏ êgúSóÚìçÚájݪ٘Ö(ÔPÒøÐ"ЩϑÏÂÏ4ÐàзѶÒÖÓÕfÖÕ×PÙâÚ„Ü1Þôß¾á•ã~åkçgénëvíï£ñÅóÝõü÷ úü þèÿ¦=£Ë­5dZ2À¬ýøù³õÚðˆëÖåÕß·Ù‘Ó™ÍåǧÂô½ê¹›¶´O²Q±±~±ˆ²´$¶‰¸B»1¾SÁÄâÇCË¡ÎÒ[Õ°ØñÛ,ßRâkåxèjë[î,ñùó±öYùöû~þlÓ(r ¶ å/TZlhe]H!8#%'ã(À*Ÿ,y.W0124î5Ñ7´9›;„=s?aAVCEE>G+IKþLÖNšPJRÑS5U\VJWÛWXàW/WêUTvQ'N$J]E×?¨9Ï2z+´#­„g tÝû¯ôîèÖâAÞ_Ú,×Ô¦Ò9ÑGÐ¿Ï”ÏµÏ Ð¼ÐŒÑ„ÒœÓÔÔ%Ö‰×Ù‘Ú3ÜÝÝ™ßcá8ãåçéëí$ï9ñYórõ÷¢ù­û£ýŠÿLî]‚Z-V”=Lþ´úöÍñ—ìòæáçÚ¿Ô½ÎüÈ ÃØ¾¤º7·´œ²u±±^±O²Ä³ºµ ¸¹ºœ½·ÀìÃ?ÇšÊûÍ[ѺÔØTÛ‰Þ¸áÓäÞçÜêÆí¥ðló+ö×ørûþ€÷\´ E x­Èê÷üè Ú"½$¤&…(c*C,.û/Ö1³3‘5r7U9;;%=?AòBåDÙFËH¹J LwNEPóQ‡SîT&VWÆWXôWXW/VmTûQÜNöJYFö@é:24ñ,@%Fÿ Rýö\ïFéØãßÛÅ×ÕÓ€ÑnÐÙÏ˜Ï®Ï ÐšÐfÑPÒeÓ™ÔßÕH×·ØGÚßÛˆÝDßáÝâ»ä©æ›è£ê¤ì»îÑðêò õ ÷;ùAûDý&ÿôœUQO8¥“ï¸âþmûb÷½ò í è*âÜìÕèÏʩķ¿o»Ó·ý´í²¦±±I±²x³Pµš·-º½ÀMÚÆñÉWͱÐÔcײÚéÝá8äIçIê6íðåò¡õVøðú†ý}æA × @a€“¥žœ‰ x"d$A&.(*ê+¾-Ÿ/x1W3257ô8Þ:Ä<±> @B‚DyFgHZJ?LNéO Q8S«TéUïV¥W XýW~WqVÍT‚R€OÇKJGB"<5d.Ì&Û¼š‘Õþ{÷ªðpêãäàÞÛhØ—ÕhÓÄÑ£ÐóϢϩÏ÷Ï}Ð>Ñ"Ò/Ó[Ô¡ÕÿÖrØøÙÛ5ÝêÞ¯à}â`äAæ=è9ê>ìSîcð‚òšôºöËøÝúÛüÅþ›DËà>?ÄÌD+rÿ"ü,ø­ó¡î"éUã?Ý"× Ñ/˩ũÀ5¼~¸~µJ³Ù±/±5±ç±-³î´%·ª¹}¼¿­ÂöÅMÉ«ÌÐhÓÄÖ ÚMÝ|à ã±æµé¥ìˆï[òõÏ÷púýŠÿmÏ i › Öõ-7A<:) "$é%Ê'©)‰+d-B/1ú2Ö4¸6˜8:d=@/B"DFHöIàKÀMŽOJQêRbT®U¼V‡W÷WX›W®V'UÿRPL3H%CW=á6Ö/Q(n X3#Yæøýñ¢ëóåñà¨Ü Ù ÖÐÓÒÚÐвϦÏåÏcÐÑôÑûÒ ÔaÕ¹Ö)Ø©Ù?ÛáÜ“ÞVà"âÿãäåØçÒéÚëæíüïò0ôMöbøtútüeþ=ð|Õê».@ßÿ•˜ÿÿÉüúøŽô¡ï6êuäpÞOØ6ÒKÌ·Æ–Á ½+¹¶«³²C±-±½±ä²—´¬¶,¹í»ç¾ÂPŧÈÌeÏÆÒÖkÙ«Üàßãæ éìûîÎñ“ôL÷ëùŠü ÿ‹øV®ô 2 e­ÆÓÜÛØÆ½!¡#%k'M)-+-ç.½0Ÿ2y4Z6:8:<ð=Þ?ËAÃC¯EªGI„K^M6OôP—RTmU‹VaWçWX·WâV}UqS¾PGMI*D‡>/8B1Ð)"ïз ÝZúPóÜì çãá|Ý·Ù±Ö;ÔfÒÑ6ÐÁϦÏ×ÏLÐñÐÊÑÅÒçÓ"ÕvÖá×\ÙðÚŒÜ@ÞûßÇá¡ã‚åvçnépëíŽï¬ñÄóáõö÷ ú üþÜÿš/µ’?ó-ßÿ†ný»ùpõ™ðHë•åß|ÙgÓhÍÈÇŒÂà½æ¹”¶´U²g±%±˜±§²7´E¶ª¸a»T¾qÁ¯ÄÈ^ËÀÎÒzÕÃØÜ<ßmâåèënî@ñ ôÂömùü“þ€á9…  ú G\pvzrkW!F#-%'ò(Í*®,†.f0>24ú5Þ7Á9¥;’={?lA`CPECG3I KMÛNšPGRÎS.UTVª@™BD|FtH\JFLNìOŸQ3S§TáUäV—WõWèWeWRV®TZR\O™KGäAö;a5;.¦&µ¢}€Éþs÷ªðuêêäàíÛ{جÕÓÙѼРйÏÀÏ Ð’ÐPÑ5Ò>ÓoÔ«Õ×zØ Ú–ÛBÝõÞ·à‰âeäMæCè=êFìVîjðƒòœô¸öÊøÜúÒüÂþŒ9ºÿ ¿!›ó7ÿâûî÷ió_îäèã ÝéÖßÐˋőÀ)¼w¸€µS³è±D±M±²J³µD·Í¹œ¼¤¿ÊÂÆgÉÌÌ'ЇÓÛÖ%ÚfÝ‘à¹ãÃæÍé¶ìŸïlò.õã÷úýšÿ}ß- w ® ã';JONG9 *"$û%Õ'¼)–+r-Q/)13å4Ã6§8‹:o<^>G@;B*DFHþIäKÄMOJQèRZT«U®V|WäWñW„WVU×RýO`LHôB*=¶6ª/+(H <Gáøùñ§ëùåÿà¹ÜÙ6ÖåÓ*ÒðÐ)ÐÇϽÏúÏxÐ(Ñ Ò Ó0ÔqÕÆÖ8صÙLÛëÜ¡Þ^à,âäëåàçÙéàëëíðò5ôIödølúrü]þ0åkÀÕœµÒbbÅÿ‹ü¸øNô\ïùé3ä6ÞØÒ$Ì•Æ}Áü¼#¹ ¶³³#²Z±A±Û±³´´Ñ¶J¹¼ ¿.ÂrÅÄÈ#Ì‚ÏÞÒ9Ö€ÙÆÜ÷ßã3æ1é+ì ïåñ¢ô`÷üùœüÿœi» @ vž¾ÕäëëåÙÉ!±#š%z'^)9+-ò.Ï0©2‰4f6H8.:<ÿ=ç?ØAÌC¹E±GšI…KgM4O÷P“RTgU€VTWÓWöWœWÉVZUQS”P MñHüC[>81ª)Ø!Õ®¥ ËRúKóßìçòá‰ÝËÙÂÖRÔÒ&ÑQÐÓÏÁÏêÏ`ÐÑÛÑÚÒöÓ1Õ†Öí×mÙùÚÜFÞàÐá©ãŒå|çtéyë‚í–ï®ñÆóáõö÷ú üùý×ÿ€šzùÌ«ÎE7ývù1õWðëXå]ßIÙ0ÓCÍ£ÇqÂѽ׹—¶´g²u±>±³±Â²X´e¶Ë¸…»r¾“ÁÏÄÈ}ËÙÎ:Ò‘ÕÞØ'ÜU߃â–å è–ëîTñô×özùü þ"óI• Ô 3Um€…Š‚zj!R#=%')Ý*º,•.t0L2,4 6é7Î9³;œ=ˆ?wAgC\EJG=I%KMÜNPERËS(UJV/WÀWòWµWùV¨UÃS#QÛMÌIE€?I9{2$+k#fN4 WÂû©ôî+èìâ]ÞÚUׯÔÔÒfÑvÐëÏÁÏáÏGÐåЯѩҼÓöÔ@Öª×Ù®ÚGÜôݰßtáMã+åçéëí,ïBñ\ótõ÷šù¦û—ývÿ8Ì;cOßÛ-ñ-ËÐý9úöLñìpæ‹àrÚ_ÔaηÈgò¾º2·ˆ´³²™±@±“±‡²´ùµR¸÷ºã½óÀ0ÄxÇ×Ê3ΓÑíÔ;Ø…Û¸Þåáåè ëííËð–óNöýø–û(þ¤{Ø! g šËê!'  !ó"Þ$Á&¡(ƒ*],:.0ò1Î3­5Š7r9P;A=%?ACøDëFÙHÆJ¨LNDPôQSåTVW¤WîWÄW%WòU(T±Q‰N¢JýE@Œ:Ø3Ÿ,ñ$ãÏ Ü>ýö_ïMéîã9ß>Ûë×DÕ.Ó¯ÑÐÐÆÏÙÏ4ÐÂÐŒÑuÒ‰Ó·ÔÿÕb×ÕØ_Ú÷ÛŸÝXßáîâÏä¶æ®è­ê²ìÄîØððò õ!÷4ù<û4ýÿÞ|ô&$ÂéQ1ŠDkþïúÝö;òíŒç¯á¢ÛŠÕ†ÏÊÉfÄ“¿Q»Î·µ³Á±K±x±R²³³“µÙ·sºN½[ÀÃÕÆ1Ê‹ÍíÐGÔ˜×ãÚÞLádäuçrê_í?ð óÉõxøû©ý+ c± ÷ /\„³¾Â¿¹§ —"$c&E($*,Ý-º/•1q3Q5-79õ:Þ<Ç>¸@£B˜D‰FxHgJGL'NëO Q2S TÛUØVˆWæWÐWLW4VŠT8R0OqKðF¶AÈ;25.{&‚am¶þo÷¤ðzêñä àþÛŒØÃÕ‘ÓõÑÐÐ!ÐÒÏÓÏ"ЦÐbÑHÒSÓyÔÂÕרÚ¦ÛLÝßÁà”âmäVæIèGêJì]îjðŠòœô¹öÊøÖúÏü¸þ/¥ðî¥òpoÞ»ÿþ û®÷&óî£èÓâÐֳܳÐÛÊpÅuÀ¼p¸‚µZ³÷±X±e±#²e³4µb·ï¹¾¼Ã¿íÂ5ƆÉëÌBФÓóÖAÚzÝ­àÌãÝæÞéÐì­ï„òAõó÷–ú)ý®ÿ(ð= ‰ ¿ ó5MY]_TJ 7"$ &ä'Ê)£+‚-^/713ð4Ó6±8˜:W@BB6D(FHJíKÅM–OHQäRYTŸU§VkWÕWÛWkWsVçT¶RÑO:LÝGÈBü<‰6~/(# þù<Õø÷ñ§ëæáÉÜ/ÙJÖûÓ>Ò Ñ=ÐàÏÑÏÐŽÐ8ÑÒÓCÔ€ÕÖÖDØÄÙWÛöÜ­Þfà8âäõåæçâéãëóíðò8ôFöeøiúlüWþ'×\­¼„íøŒ£3(ÿLüyø ôï·é÷ãûÝä××ÑûËuÆfÁê¼¹¶¼³1²j±]±ð±%³Î´ö¶h¹3¼)¿OÂ’ÅàÈBÌ›ÏýÒOÖÙÜÜ à1ãFæIé@ì ïöñ¹ôp÷ú¬ü0ÿ®zÍ R …­ÏäóùüñìÓ!Ã#©%‡'m)E+'-/Û0¹2”4t6V87: <>õ?áAÕCÅE´G¥IŠKiM:OóP—RTaUvVGWÅWàW†W¬V;U/SmPùLÂHÕC(>Ø7é0)¶!°–Œ ¾EúIóÞìçûá˜ÝÜÙÖÖhÔ’Ò@ÑeÐíÏÔÏÐtÐÑîÑêÒÔAÕ•Öû×yÙÛ¤ÜWÞàÜá³ã“å…ç{éë‰í›ï®ñËóàõú÷ú üñýÏÿi‰]Ùù£Ô~’òü>ùëôðÇêå$ßÙýÒÍ~ÇY¿½Í¹˜¶´u²…±V±Í±à²w´…¶í¸¦»’¾µÁëÄ@È˜ËøÎTÒ­ÕøØ<Üqß–â®å¶è«ë”îiñ1ôêöù+üµþ0¤[¤ ä Eb€‰š•–„}!^#O%)')ë*É,¦.~0]2746÷7Ù9À;§=•?‚AqCdESGCI)KMÜNžPFRÄS%U=V%W­WàWœWÝVU›SQ®M£IÕDQ?9N2û*D#E1 D¸û£ôî1èõâkÞ”Úe×ßÔéÒ~ÑŒÐÐ×ÏöÏ\Ð÷ÐÅѸÒÍÓÕMÖ¸×+Ù¼ÚRÜÞ¹ßáUã5åçéë$í.ïIñ[óyõŠ÷œùŸûýrÿ&Æ"S1Åñ·ÿÂú™ýöùÌõ ñÔë1æQà9Ú1Ô5ΓÈMÞ¾†º.·´¿²©±W±¬±¥²!´¶r¸»¾ÁNÄ™ÇñÊRήÑÕVØ›ÛÑÞüáåèëîßð¨ócö ù¬û5þ¸*Œê1 w ªÛø#631(!#è$Ó&®(’*i,K.02Ú3»5™7{9a;I=3? ACÿDöFßHËJ®L‚NGPòQ|SßT VùV–WÜW®W WØUT‘Q`NvJÔEn@a:­3t,Ë$àĹ É2ýö\ïTéôãIßKÛØTÕJӾѺÐÐßÏïÏFÐÙМшҚÓÄÔÖn×åØjÚܬÝ_ß)áõâ×äÀæ²èµê¶ìÊîÛðóò õ÷4ù7û0ýÿÓoߨìÃ&U/þ±úžöüñ×ìOçrájÛVÕ]Ï¡ÉOÄ{¿F»Ê·µ ³Õ±[±•±l²Ñ³´µù·”ºn½}À«ÃöÆKÊªÍ Ñ`Ô´×øÚ3Þ`ázäŒç„êvíPðóÝõŠø'û½ý7µuÁ  >n°ÀÎÐÎɵ ¨"Š$t&S(4*,î-Æ/£1€3[5>79;é<Ó>À@±BŸD’F~HnJKL,NéO£Q.SšTÓUËV~WÐW½W1WVkTR OGKÃF‹A™;5é-O&t\OS®þd÷¥ð{êûä*àÜØ×Õ©ÓÒéÐ6ÐèÏéÏ5кÐwÑVÒeÓ‰ÔÏÕ,×˜Ø Ú°ÛXÝ ßÎà›âvä`æNèPêOìbîpð‰ò ô¸öÉøÐúÌü¯þy ”ÛØˆàÎFBª…Âþdûn÷æòÜícè™â”܄րйÊNÅaÀ¼i¸„µd³²m±~±:²‡³Nµ†·ºà¼á¿ÃPƨÉÍcкÓ×WÚ“ÝÆàßãõæòéãìÄï•òSõø§ú:ýÂÿ4¥ûS ” Ò )E]eqhjT H"/$&ú'Ñ)¸+Œ-m/F1!35Ü6Ã8 :

    c@KBAD/FH JîKÍM“OMQàRWT•U V\WÅWÄWTWUVÈTR¬OL³G›BÎ<[6T/Ö' ÷áå)Îøññ©ë æáÚÜ>Ù`Ö ÔZÒÑVÐõÏåÏ'РÐNÑ/Ò,ÓQÔÕäÖTØÑÙcÛݲÞyà:âäùåòçåéíëöíðò4ôOö^ømúbüSþÏJœ¥gÑÒeuÿöPÿü9øÊóÜîvé¹ãÀݯצÑÖËQÆOÁÛ¼¹ ¶¿³A²}±t± ²A³ð´·Œ¹R¼K¿o¯ÅÉ^̺ÏÓhÖ¸ÙñÜ)àEã_æ\éTì5ï òÍô€÷&ú½üDÿ¾)‹Ý( ` ˜¼Þô ôé!Í#¸%™'x)Y+1-/ê0Å2¥46c8E:+<>@ëAâCÉEÃG¦I”KmM;O÷P‘RT[UkVÊ@¼B¨D›F‰HpJWL)NòOŸQ.S—TÉUÄVjWÃW¤WWúUGTðQßNK”F^Ah;Ù4º-'&K=/Ašþ[÷Ÿð}êå4àܯØèÕÁÓÒÑKÐÿÏýÏJÐÏЈÑlÒtÓ›ÔàÕ7תØ+Ú¾ÛeÝߨà¦â€äiæWèUêZìbîzðˆò¦ô·öÇøÐúÄü©þo‰ÃÁm¾ªyL‰þ#û/÷¡òší"èWâ]ÜJÖTÐÊ-ÅLÀþ»c¸†µi³²|±›±T²§³pµ¦·1º½À.ÃsÆÃÉ$Í{ÐÚÓ)×qÚ®ÝÚàûãç êøìÚï§òiõø»úMýÓÿH³a ¨ á 8Vlx}~si V"<$&&(ç)À+¡-u/Z1.35ë6Ì8²:—<€>m@XBJD9F'HJõKÏM˜OKQâROT‘U“VOWµW®W;W8V¥TmR‚OâK†GjBž<,6$/­'ØÕÂÍÂøëñ«ë æ!áàÜWÙmÖ%ÔmÒ2ÑnÐ ÐýÏ;гÐdÑ>Ò@ÓcÔžÕõÖbØÞÙqÛÝÂÞ~àKâ"äæ÷çïéóëüí ð#ò7ôPö^øgúbüIþ¿>„‘K¯±7JÌ»ÿÏûø÷ˆó•î7éuã…Ýv×tѪË1Æ3Áʼ ¹¶È³M²’±Š±*²^³µ3·±¹r¼o¿ÂÑÅ É|Ì×Ï3Ó‡ÖÎÙÝ:àdãpæwéiìIï!òÞô—÷7úÒüTÿÓ9žð5 w ¤Ñî õ!á#Æ%¨'Š)f+A- /÷0×2¯4‘6n8T:7< > @ùAèCØEÇG±I™KpM@OöP‘R TSUcV,W¥W³WZWnVÿTãRP¥LfHyCÉ=y70))e!kYZ ›*ú@óÛì!çâ¯ÝÚ÷Ö–Ô¼ÒnÑÐÐüÏ0ЙÐAÑÒ Ó)ÔcÕ®ÖØ‘Ù#Û¾ÜkÞ(àíáÉã£å˜çˆéŽë“í§ïµñÐóãõö÷úúûêý¸ÿkðFZ'Ÿ­Ux)šÿ{ü¶ølôïAê—äªÞ ØÒÁÌ<Ç!›½º¹“¶-´²ª±…±²³¹´Å¶2¹é»×¾õÁ.Å{ÈÖË0ÏÒàÕ/ÙnÜŸßÈâÛåáèØë¼î“ñYô÷·ùPüÛþTÇ%Æ  :e†ž®¶¸²§–!„#e%P'() +å,À.¡0s2Z4.68ò9Ú;Á=ª?™A†CxEfGQI:KMçN¡PARÂSU/V WŽW¸WnW¥VMUVS³P[MHIxDô>½8ô1¢*ó"ÿðí û–ôî;èã‡Þ±Ú×ÕӬѹÐ/ÐÐ"ЄÐ"ÑèÑÞÒïÓ&ÕnÖÕ×JÙÑÚoÜÞÐß•ágãGå3ç'é%ë.í9ïPñdóxõŒ÷˜ù—û†ý^ÿ§þ(û‹«i¥cŠ"ýyùEõƒðNë±åÒßËÙÅÓàÍGÈÃt¾nº'·—´Ó²Î±±ä±Þ²a´]¶³¸a»A¾\ÁŒÄØÇ1ËŠÎèÑ=ÕŠØÏÛß*âDåLèEë-îñÏóŒö2ùÑû\þÝL´Y ” Ñ÷!2MMZMJ4!&#%ï&Ï(¬*‹,f.@02õ3Ø5³7—9z;a=K?8A&CEGòH×J»L†NNPîQySÒTúUâVxWµWWÓV™U¿SDQ NJvE@:P3,{$‰~ ¢ýïõYïXéäaßgÛ'Ø|ÕsÓíÑæÐGÐ ÐÐtÐþÐÆÑ¨Ò½ÓæÔ0Ö×Ù…ÚÜÄÝxß:áãæäÒæÄèÀêÈìÏîçð÷òõ"÷.ù2û"ýÿ¼V¼ëÖkªtÑ¢ëµý2úösñTìÊæöà÷ÚëÔÏTÉÄN¿.»»·µ³ú±…±Ç±§²´õµ=¸Ùº²½ÀÀìÃ7ljÊåÍBÑ—Ôê×,ÛeÞáªä¶ç³êží{ðHóö²øNûßýaÕ<–å ) ^³ÏãëòïçÕ Æ"ª$’&r(Q*., .ä/Á1›3{5U799;=ì>Ö@ÇB²D¥FH{JXL0NóO›Q1SŠTÆUµV]W®WWýVÝU%TÇQ¹NìJnF'A>;¨4Œ-ÿ%"-ˆþS÷œð~ê åAà*ÜÃØûÕÔÓ5ÒÑeÐÐÐ^ÐæÐ˜ÑÒ„Ó®ÔìÕJ×µØ:ÚÌÛnÝ%ßÝà¶âƒävæ^è]ê^ìkîzðò¥ô·öÊøÈúÃüþfx®ªL €óáDJþäúëö`òTíãçâ$ÜÖ'ÐeÊÅ0Àð»_¸…µu³$²“±´±q²Æ³µË·Pº'½"ÀRÃÆæÉ?Í›ÐóÓG׉ÚÉÝñàä çêíïï½ò}õ-øÎúaýåÿ\Æ v µ ô $Ig~„’ˆŠq k"I$6&(ô)Ñ+­-ˆ/c1?35ø6Ý8¼:¤<Œ>w@eBSDAF1HJüKÓMšOJQáRJTŠUˆVAW¡W›WWVƒTHRZO·KWG>Bn<þ5ø.ƒ'²²¨µ ´øëñ§ëæ%áõÜcÙƒÖ:ÔƒÒHцÐÐÐMÐÊÐuÑRÒSÓpÔ±Õ×qØëÙÛÝÐÞ†àVâ+äæÿçöéùëîð(ò7ôQö]ødú^ü?þ®/qw2ŒŒ˜†Ùþ•û´÷FóTîóè9ãIÝ?×HÑËÆÁ»¼¹¶Ñ³Z²¦±¢±G²{³5µQ·Ö¹“¼¿±ÂîÅAÉ™ÌõÏNÓ¡ÖêÙ'ÝVàxã‡æé|ìaï3òóôª÷JúãügÿäL® G ˆ ³ãù.&' "ï#Õ%¸'˜)s+S-+/1ã2½4Ÿ6{8a:C<,>@BõCÝEÓGµI KuMAO÷PRTKU[VW•WžW?WVVÚTÃRõO{L>HFC =G7g0ý(B!G=E ‡#ú8óÞì&çâ¿ÝÚצÔ×ÒѬÐ/ÐÐCЮÐUÑ'ÒÓ=ÔnÕÂÖ(ØŸÙ0ÛÊÜtÞ6àôáÒã­åžç‘é“ë˜íªïºñÐóåõó÷þùùûßý²ÿ[â2E ‚ˆ-Kæòcÿ:ü|ø$ôPïêYäpÞiØmÒšÌÇ Âˆ½³¹’¶3´™²¿±™±²9³Ø´æ¶U¹¼ý¾ÂQŘÈ÷ËJÏ®ÒùÕJنܺßÜâôåóèðëÏîªñkô#÷Ìù_üïþfÖ:‹Û  Lt–¯½ÇÆÂ·§!#x%X'=)+ö,Ð.ª0†2c4?6 8:ã;Ð=´?¦AŽC‚EmGZI>KMéN PBR¼S U'VúV‚WŸWZWˆV.U4SŒP3MILDÆ>‘8È1y*Ì"ÛÓÖ –ûôî?èã•ÞÁÚ ×Õ,ÓÀÑÑÐCÐÐ5МÐ0ÑÿÑìÒÔ3Õ~Öã×TÙãÚuÜ%ÞÙߟápãRå8ç0é-ë0íCïMñióxõ÷“ù•û}ýUÿ•ð èd;~-YæÿÞü9ùõEð ëwå“ß—Ù’Ó·Í#ÈýÂ`¾hº · ´Ý²ß±š±ø±³}´~¶Ø¸~»f¾xÁ¯ÄõÇO˦ÎÒXÕ¥ØæÛßDâXådèXëCîñåóöFùãûmþí_Âf § ß .EYacbSI!1#%ý&Ü(½*—,v.L0-24å5Â7¢9‰;j=Y?CA0CE G÷HàJ¼LŒNMPíQxSÈT÷UÏVmWžWlW¹VwU¡SQèMòIIEä?Ó9#3ñ+R$phh  ýæõ[ïYéäkß}Û6Ø’ÕˆÓÒýÐ_ÐÐ1ЄÐÑ×Ñ»ÒÏÓõÔ@Öš×ÙÚ*ÜÌÝ…ßDáãïäÛæÉèÈêÌì×îçðþò õ%÷*ù0ûýõþ²E«Ø¸Q„Q¢t´fxýôùÙõ4ñì‹æºà¾Ú»ÔÔÎ4ÉòÃ>¿ »»·µ*³²œ±ã±Á²2´¶`¸÷ºÖ½ÝÀÄSÇ©ÊÎ_ѱÔØFÛ{Þ©á¾äÎçÇê³íðYóöÄø_ûôýoèL§ö 8 o¢Àáñýüøâ ×"¸$ &(_*<,.ò/Í1©3†5d7E9(;=ø>à@ÑB¼D®F–HJ]L5NðO¢Q$SŽT·U«VOWšW{WßVÁUT¤QNÄJ=Fý@ ;}4b-×%ÿýû þG÷›ð‚êåPà9ÜÕØÖèÓNÒ*Ñ|Ð)Ð-ÐrÐúЭёҖӿÔýÕV×ÇØCÚÜÛxÝ/ßêà¼âä}æcèfêbìqî}ð”ò¥ô¸öÅøÇúºüšþWøbœ3|\DzÜþ§ú«öòížçÝáäÛåÕñÏGÊíÄÀã»X¸‰µ~³2²¨±Ë±²ã³²µé·uºE½EÀpòÆÊ]ͶÐÔ_×§ÚÛÝá%ä7ç6ê íðÎò’õ?øßúuýõÿoÕ3„ É 4Xy‹˜ž›”ˆ s"]$B&%(*â+»-—/r1K3+57ê8Æ:³<•>ƒ@pB[DMF6H"JþKÛM™OMQÚRHT€UV.W“W‚W WþUcT#R4OK+GBA<Î5Ð.V'¡øÿ¬øçñ¨ëæ2áÝvÙ—ÖOÔ™Ò`Ñ›Ð6Ð*ÐcÐÝЋÑcÒdÓ‚Ô¿Õ×|ØûÙ‰Û&ÝÚÞ’à_â4äæèêýëîð%ò>ôNö]øbúVü9þ¥a\pbéêeOŸþUûv÷óî³èúâÝ ×ÑYËðÅÁª¼þ¸¶Ü³e²½±¸±c²™³Sµu·ô¹µ¼°¿ÒÂÆ_ɵÌÐiÓ¼ÖÚAÝmàãžæ£éìwïDò õ¸÷búñü}ÿô^Á \ ’ Ëì#4;74& "$â%È'¥)…+\-=/1ð2Ï4§68j:R<7>#@ BþCèEØGÀI¢K}MAOøPŽRTEUNVWW‹W&W6V¾TšRÑOMLHCp=750×(!&0 sú/óâì)ç&âÉÝ&Ú×¾ÔëÒ—ÑÂÐDÐ.ÐTÐÅÐiÑ7Ò3ÓIÔ€ÕÓÖ2زÙ9ÛÙÜ€Þ>àâÛã¶å¦ç˜é›ëží®ïÀñÐóèõñ÷ûùôûØý§ÿPÒ ,ò]iµ¼&ÿü6øçó ïÀéä6Þ1Ø>ÒnÌ÷ÆðÁx½ª¹‘¶9´¨²Î±µ±7²X³÷´ ·s¹,¼¿6ÂlŽÈÌoÏÁÒÖ^Ù£ÜÏßõâæ éìèî¸ñƒô5÷ÜùuüýþzêG¢æ ) [„§½ÏÖÖÒÅ·!ž#‡%h'K)%+-Ý.¸0—2l4Q6)8:ñ;Ù=Â?¯AšC‰EvGaICKMéN¢P@R¸SUVîVpWW@WlVU SgP MïH D•>c8œ1L*§"¸·» ùƒûŒôîEèã ÞÔÚ²×0ÕAÓØÑæÐ]Ð.ÐMЮÐGÑÒÓÔHÕŠÖò×cÙîÚ†Ü,Þæß©ázã\å>ç9é1ë9íCïWñeóõ‡÷•ùûuýPÿöŠÚøÍGhLÿ ¬ÿ¡üúøÀôðÊê2åZß\Ù`ÓÍþÇâÂM¾\º·¥´è²ó±­±²³¢´š¶ý¸ž»‹¾—ÁÎÄÈkËÅÎ ÒsÕ¾ØÜ4ßXâtåtèrëWî.ñùó°öYùöûþÿoÕ,w º ì=VjnwnfW!>#+% 'ï(É*¨,‚.\0924ñ5Î7±9“;x=e?JA>C&EGþHçJ¿L“NIPñQoSÇTèUÈVYWWSWVZU|SôP½MÅIE²?¦9÷2Ä+-$IJN |øüåõQïdéäxßÛIا՟ÓÒÑuÐ5ÐGКÐ'ÑéÑÑÒÜÓ ÕMÖ©×ÙÚ6ÜÚÝßQáãûäàæÔèÍêÑìÝîêðóõ#÷*ù*ûýìþ¨4œ¾£0b(yAƒ*;ý·ù”õòðÑëIæàƒÚ‡ÔªÎÉÛÃ%¿»¸·µ7³²³±ù±à²P´5¶¸»õ½Á/ÄqÇÉÊÎ}ÑËÔ Ø]Û–Þ¾áØäãçÞêÇí£ðoó(öÙørûþƒ÷`¶ H €±Óï õ ã"Ë$­&’(l*L,&.0Û1·3”5r7R96;=?ë@ÛBÉD´F H†JcL7NôOœQ(S‚TµUœVCW„WfWÇVŸUäS|QgN›J FÑ@Þ:P45-±%×áÜ nþ@÷˜ð…êåYàIÜçØ&ÖþÓbÒBÑ’Ð@Ð@ЉРÑÃÑ¢Ò©ÓËÔÖb×ÕØRÚåÛˆÝ7ß÷àÃâœäæqègêmìrî…ð”ò¨ô¹öÃøÅú³ü’þLêR…x[6œ„Û¥ÒýkúföàñÑìaçžá¬Û°ÕÈÏÊÔÄÀÙ»Q¸µ‡³C²¼±å±«²´Òµ¸˜ºd½kÀŒÃÓÆÊ~ÍÐÐ.Ôv×ÀÚõÝ$á>äLçKê6íðáò¦õPøöú‚ý |ëB• Ü Ghˆšª«¬£— ƒ"l$Q&1(*ê+Í-£/€1[3757ö8Õ:¾<¡>Ž@yBhDRFAH$JLÚMžOKQÚRATxUtV$W|WrWêVáUBTýQ O_KGÞA<¢5¡.0'grpèÿ£øãñ¬ë#æ@á ݋٩ÖeÔ¯ÒvѱÐNÐ@ÐwÐóЛÑxÒtÓ“ÔÍÕ$×‰Ø Ú”Û5ÝâÞžàhâ=ä"æèêì îð+ò=ôPöZø^úSü1þ÷ÿ– KEûKB»½3cþû4÷ÃòÒípè¾âÔÜ×ÖçÐ4ËÏÅîÀ›¼ö¸ ¶á³v²Ð±Ð±²¹³qµš·ºØ¼Ó¿ïÂ1Æ|ÉÔÌ/ÐƒÓØÖÚ[݃à¨ã´æ¹é¦ìŒïWòõÍ÷pú ý‰ÿpÐ# i ¦ Ø6ALEF2 )" $õ%Õ'´)“+n-H/%1ü2Û4·6™8w:_.@BDöEÛGËI¤KMFO÷PŒRüSÓ^ÔÕßÖDؽÙDÛè܈ÞJà âàãÃåªç¢éžë§í¯ïÅñÒóéõñ÷ùùíûÖý™ÿG¿Õ@CÙô€‡íþÁûü÷¤óÌîéÙãûÝý× ÒEÌׯÓÁk½Ÿ¹’¶?´µ²â±Ë±R²w³µ)·—¹J¼>¿UÂŽÅÙÈ0̆ÏâÒ0Ö}Ù¸Üéß ãæ%éìúîÒñ‘ôL÷ìù‰üÿŒù]­ý 4 o“·ÏÛææà×Ä!®#—%v'Y)6+-ì.É0 24Z6<8:<á=Ñ?·A¦C’E}GhIJK!MïN PAR³SUVßVbWxW)WOVðTìR=PáLÄHíCl>08p1"*~"–˜¢ èvû…ôîGè#ãªÞçÚ¿×KÕNÓöÑöÐxÐAÐdÐÀÐ\Ñ!ÒÓ%ÔRÕŸÖý×sÙøÚ‘Ü:Þíß·á‚ãdåJç>é;ë<íLïVñmó|õ‹÷’ùŠûrýAÿðwËâ°,Dï#Ëîtÿbü¼øô¾ïêïä#ß"Ù2ÓaÍÛÇÊÂ7¾Uº·©´÷²²Å±1²5³Á´¼¶¹Â»©¾ºÁîÄ4ȉËãÎ:ÒÕØØÜJßtâ„åè„ëlîEñ ôÆökù ü‘þ~è;‹ Ç )Oey‚‚qh!N#9%'ý(×*¶,’.h0I24ÿ5Ü7¼9¢;ƒ=r?UAHC0EGIëJÅL”NLPðQkSÂTÞU½VJWyW=WV("*ü+Ù-³/Œ1i3C5#79ä:È<®>š@BsD[FHH-J LàMOMQÔR?TnUiVWlWYWÔVÁU#T×QåN8KÏFµAã;v5u.'ARVtÚÿ™øÝñ±ë(æKáݛټÖ|ÔÂÒÑÆÐeÐUÐŽÐѱч҇ӣÔàÕ.×›ØÚ£Û?ÝïÞ¥àxâBä.æèê ìîð.ò?ôQöZøZúPü%þòÿ…þ5.Þ*”ûã(þØú÷öò‘í/èâšÜ¡ÖºÐ ˲ÅÕÀ¼î¸ ¶æ³ˆ²Þ±ì±™²×³“µ¸·8ºö¼ö¿ ÃSÆ—ÉõÌHТÓïÖ7ÚpÝ à»ãÍæËé¾ìœïpò,õä÷úýœÿä0 } ³ ë 2CTYXSE 2"$&å'Â)£+z-Y//1 3è4Ä6¦8ƒ:j

    7@(B DFåGÏI­KMHOøPŠRøS5U;VöV`WbWóVÿU|TQR…OøK»G½B=À6à/(Í åä Qú)óßì9ç5âëÝBÚH׿ÔÓÆÑìÐtÐWЂÐëÐŽÑ`ÒQÓpÔÕîÖTØÈÙVÛíܘÞRàâíãÈåµç§é¦ë­í³ïÈñÔóêõï÷øùçûÍý’ÿ8³ö¸!°ÄQN¶þû½÷aó‹î<éžã½ÝÊ×ÛÑ̶ƼÁY½–¹‘¶G´À²ø±Þ±q²³:µG·¸¹m¼^¿v¬ÅúÈĮÏúÒMÖ—ÙÏÜà ã7æ9é+ìïâñ©ô]÷úšü"ÿœ iÄ H }¥ÇÝîô÷ïæÔ!¾#£%ˆ'f)F+-ü.Ô0±2‹4g6H8': <ñ=Ø?ÄA¯CœE‡GnIPK'MîN¥P:R³S÷T VÓVPWdWW6VÎTÊRP¶L˜HÃC:>8C1ø)X"rxŽ ÏqûzôîLè+ã¸ÞõÚÖ×YÕlÓÒÑŒÐXÐzÐÕÐpÑ3Ò'Ó2ÔfÕ«Ö ØÙÛžÜFÞøßÁáŒãlåRçFé?ëEíNï\ñló~õ‰÷ù…ûlý7ÿåf¹Ê— "Èôµ;ÿ&ü}ø@ô}ïKê³äæÞíØÓ5ͽǪÂ*¾Iº·±´ÿ²²Ú±L²U³Ý´à¶;¹ã»Ë¾ÚÁ ÅUȦËÏVÒ©ÕóØ2Üd߈âžå£èœëîYñ ôÔö‚ùü¦þ$‘øN™ Ú ;^tŠ“‘€x!\#I%'' )å*Æ,Ÿ.x0U2.4 6è7Ë9«;“=v?eANC;E(G IóJÉL–NNPíQgS½TÓU±V9WgW$WgVU5S«PfMsI¿DZ?J9š2r+Ú#  WÜüÕõPïié&ä’ß«ÛlØÑÕÈÓFÒ@Ñ¡ÐbÐoÐÄÐNÑÒðÒÔ#ÕpÖÄ×9Ù¸ÚMÜòÝ£ßfá2ã åóæáèÜêÝìçîòðóõ#÷%ù$û ýÜþw”n÷Ýä»ÿÂü:ùõqðLëÌåàÚ$ÔPÎÄȟÿþº°·µM³7²Þ±/²³´w¶À¸a»5¾EÁjĵÇÿÊ\αÑÕRØÛÇÞíáåèëóíÌð•óRöýø—û*þ¥Þ$ n  Ñõ $*2+%!#è$Ì&­(‹*h,C.0ø1Ò3®5‹7n9L;5=?AñBØDÈF®H‘JpL9NýO–Q$SvT£U†V"W`W9W‘VdUŸS0QNBJ¶Et@:ö3Ý,a%¡§ ÝNþ5÷ðê#åsàhÜ ÙNÖ(ÔÒoÑ¿ÐlÐkгÐ3ÑéÑÆÒÌÓíÔ-Ö‚×ïØlÚÿÛÝOß á×â¯ä‘æèyêsìƒî†ðžò©ôºöÀø¼ú«ü~þ:Ì0^AàïC%u2_ýéùëõWñRìàæ"á>ÛCÕrÏÎÉ™ÄÜ¿¹»L¸µš³d²å±²ä²=´¶I¸Üº¦½ªÀÑÃÇ_Ê´Í Ñ_Ô²×ìÚ,ÞOáoäyçuêbí@ð óËõxøû©ý.¡ dº ø 7e‰¨ºÉËο¸ Ÿ"Œ$n&Q(.* ,æ-Á/œ1t3U5,79ï:Ô<»>¡@BzDcFRH0JLàM¢OIQÕR6TiU\V WVWGW¶V§UÿS³Q¼N K¥F…A¶;F5M.Û& .<_ËÿøÛñ±ë1æUá,ݬÙÒÖÔÛÒ¥ÑÜÐ}ÐgÐ¥ÐÑÇјҙӶÔìÕBפØ$Ú®ÛMÝ÷Þ¶àyâSä1æèêìî!ð0òEôNöXøYúCü'þÝÿ~é"¿òl[Фòý˜ú¸ö<òRííçFâ\ÜqÖˆÐçÊÅÀÀ|¼ë¸ ¶ô³’²÷±²µ²ö³²µÛ·Wº½À1ÃqÆ·ÉÍeÐ½Ó ×QډݶàÓãåæßéÕì°ïƒòCõó÷˜ú*ý³ÿ'•òC Œ Ç ø"<Wchi`U A"-$&ô'Ñ)¯+‹-f/>13õ4Ò6±8’:u<\>B@1BD FìGÖI²K†MKOõPŠRñS0U.VéVNWKWÝVàU\T/RZOÑK‹G’Bã<”6²/Y(¨ ÃÉìBùù%óáì<çEâôÝWÚY×ýÔ,ÓÞÑÑ‹ÐkИÐÑ¡ÑqÒfÓzÔ³ÕúÖbØ×Ù^ÛýÜ¡Þ^à âõãÑå½ç­é®ë¯íºïÉñÕóëõí÷ôùâûÄýˆÿ* æå üü†—yþFû|÷!óHîÿè]ã†Ý’×®ÑõË—Æ£ÁK½Ž¹“¶N´Ï² ²ö±²¯³Wµj·Ù¹¼€¿–ÂÌÅÉdÌÇÏÓjÖ®ÙéÜà;ãJæQé>ì'ïóñ¿ôl÷úªü3ÿ±}Ò Y Œ¶Öîýÿöá!Ï#²%–'u)S+.- /á0À2—4x6P87:<>ß?ÒA·C¥EGvITK+MðN¤P9R®SñTVÆV>WQW÷VV¯T¤RóO‹LlH—C >Û71Ð)1"Q]w ÀfûsôîNè:ãÃÞ Ûç×rÕÓÒ)Ñ¡ÐqÐŒÐíÐÑHÒ5ÓGÔrÕ¾ÖØŽÙÛ©ÜQÞàÉá—ãtåYçNéFëIíSï^ñqó|õ‹÷Šùûdý-ÿÙU¦±~ëü Çjƒüþìû:øô;ïêzä£Þ¼ØËÒ͗ǒ¾=º·²´³&²ñ±i²o³µþ¶]¹¼ì¾úÁ/ÅqÈÇËÏuÒÂÕÙIÜ~ßžâ¶å·è³ë”îmñ3ôéö’ù-ü¶þ6¥_¬ ç $Gp…™¡£ž”‚!q#S%;')ø*Ð,¯.…0c2<46ö7Õ9º;œ=†?mAZCBE1GIøJÐL–NQPêQdS¶TËU£V*WPWWJVýTSP@MDI’D,?9s2A+¶#ßî AÑüÍõQïké0äß¼Û~ØèÕÛÓ`ÒVÑ·Ð{Ð„ÐØÐeÑ ÒÓÔ8Õ|ÖÕ×FÙÆÚYÜþݯßná=ãåûæéèâêâììîöðóõ!÷$ùûýÔþ‚ a‚QÙú³ô²ãÿ‡ü÷øÕô,ð ëåÈßÝÙïÓ'ΞȅÃê¾ôº«·"µT³K²ò±I²6³¬´—¶ä¸»Y¾eÁÄÑÇ!ËvÎÐÑÕnبÛáÞâå#è ëîáðªódöù­û:þ¸0ï7 | ²á4:B:5"!#÷$Û&¼(š*v,Q.+02à3½5–7}9W;C=!?A÷BåDÎFµH™JqL?NûO˜QSqT™U{VWOWWxVDU}S QïMJ‹EB@U:Æ3³,6%l€Ž ÆAþ+÷‹ð’ê+å~àvÜÙaÖ@Ô¤Ò‡ÑÖЂЃÐÅÐJÑùÑÛÒÛÓþÔ<Ö’×üØ{Ú Ü¨Ý[ßáãâ·äšæ‡è}êìî‘ð›ò­ô¸ö½øºú£üvþ.½ G)¿ôÄðCùÿ!ý­ù§õñì ææàÛÕ@Ï®ÉvÄÊ¿­»E¸”µ£³u²ù±0²³`´0¶r¸÷ºÍ½ÉÀðÃ1ÇzÊÖÍ%Ñ~ÔÈ× ÛCÞgá‡äŒçŽêuíUð óßõ‹ø-û¹ýB²yÅ  Dw™¸ÊÙÜÚÒ µ"”$„&Y(C*,ù-Ì/ª1…3^5>79þ:ß<Æ>¯@™B„DoFSH=JLæM£OIQÑR3T_URV÷VGW/WœVŠUÜSQ“NâJuFZA„;5.·&öL¸ÿŠøÓñµë5æ`á;ݾÙåÖ¥ÔðÒ½ÑòДÐ|мÐ*ÑÛѩҬÓÄÔüÕQ×°Ø5ÚµÛ]Ýß¿à†âYä<æ$èêìî'ð5ò@ôSöTøWú@üþÕÿoØý£ìÎA.™t¯ýaúqöÿñí¯çâ%Ü:Ö]нÊsŪÀn¼ä¸¶ù³¦²²²Ô²´Ùµö·|º;½3ÀTÃÆÖÉ1ÍÐÝÓ!×mÚ ÝÏàêãúæøéçìÆï—òVõ ø©ú>ýÂÿ<¥Y ™ Û 2Nfrywrd Q"=$&(ß)¾+š-q/O1(35â6»8 :Q@6B$DFõGÝI¶K‹MKOöP†RîS%U%VÚV:W:W½VÉU7T R2O¤KaGcBµþ û;÷àòî»è"ãIÝ^×}ÑÌËwÆ‹Á:½‰¹Ž¶[´×²"² ²«²É³{µŠ·û¹±¼ž¿¸ÂíÅ4ÉŠÌÛÏ6Ó€ÖÉÙÝ1àPãdæaéZì5ïòÎô‚÷*ú¼üHÿÀ.ã- h  Ãèý  ó!Û#Â%¦'„)`+>-/ò0Ê2§4‚6b8@:$<>ð?×AÄC¬E—G{I[K-MõN¡P;R¥SíTõU¸V/W:WàVûUT€RÌOaL?HkCÙ=±7â0«)"1A\ ³TûrôîUèAãÔÞÛþ×Õ˜Ó2ÒAѸЅУÐþИÑXÒIÓVÔ…ÕÉÖ+Ø™Ù#Û´Ü[ÞàÐá¤ãzådçSéLëPíWïbñsó|õ‰÷ˆù{û^ý$ÿÊIŽ ^ÏÖz—=GÈþ«ûþ÷¼óýîÅé9änÞØ¡ÒâÌxÇy¾6º·»´³7² ²€²Ž³µ ·¹'¼ ¿ÂOÅ‘ÈäË7Ï‘ÒÝÕ(Ùcܔ߷âÍåÎèÅë¬î|ñKôùö§ù>üÇþI´q¹ þ .]|˜¥³°¯£’!~#f%D'*)+â,».•0n2K4%68à9È;§=‘?xAdCLE8GIûJÔL›NNPêQaS¬TÅU“VW;WøV.VÝTòRYPMIgDý>ë8F2+#¼Òç 4ÁüÊõNïpé:ä«ßÊÛ”ØùÕóÓvÒkÑÐЎЛÐîÐxÑ2ÒÓÔLÕ‡Öæ×RÙÒÚhÜÞ¼ßxáFãåçòèèêêìîîüðóõ"÷ ùûúüÌþwûQg;¸Ù‹É­IÿJü¹ø”ôíïÊêRå‰ßªÙ¾ÓüÍ~ÈiÃ۾纫·%µa³\²²c²S³Ë´¸¶¹ »|¾„Á­ÄñÇ>Ë•ÎêÑ:Õ†ØÃÛøÞâ3å:è5ëî÷ð¼óxö"ù½ûMþË@¡G Áò/@NMNA3!#%ê&Ì(§*‡,].;02î3É5¦7…9h;I=3?ACíD×F¼H JtLENøO›QSnTUpVW9W W[V(UYSæPÆMêI]E@&:3ˆ, %L]y °7þ!÷ð’ê7å‡àŠÜ+ÙxÖTÔºÒžÑìИИÐÜÐ[ÑÒéÒïÓ ÕLÖ × ÙˆÚܸÝbß"áçâÃä æè„ê‚ì‰î’ðŸò®ô·ö½øµúœüpþ± 0 Ôœòà Åÿãüqùfõ×ðÏë`æ®àÊÚâÔφÉ_IJ¿£»@¸˜µ®³„²²H²³|´S¶¸»ë½ëÀÄNÇ›ÊîÍGÑ•Ôä×#ÛXÞƒá™ä¨çœêídð8óîõ¡ø<ûÎýQÄ-Š×  V„«ÈÚéêêãÐ Ã"¦$&p(J*),.Þ/¶1’3m5H7*9;í<Ñ>¹@£BŽDtF`H?JLéM£OIQÏR*TZUAVíV1WW‚VlU¼SjQlN¶JKF*A\;ë4÷-ˆ&Ùí6ªÿƒøÏñ»ë9æqáFÝÒÙøÖºÔÓÓÑ Ñ«Ð‘ÐÒÐ=ÑîѽһÓÕÔÖ\×ÄØ;ÚÈÛeÝßÉàŽâcäCæ,è"êì"î)ð8òCôPöVøOú=üþËÿaÇùå…̨d<wý ú5ö½ñÌìsçÇáïÛÖ2ЕÊXÅ‘Àc¼ß¸¶´°² ²2²ï²/´öµ¸›º]½TÀuëÆùÉGͤÐïÓC×Ú¼ÝåàäçêùìÞï¨òkõø»úOýÖÿK¶e ­ é D\w‰†q d"H$/&(ì)Ï+¥-/\1535í6Ê8¬:ŒX@FB*DFýGâI¼KMMO÷P„RèSUVËV*W"W§VªUTèQ O}K3G6Bˆ<:6X/ (Y „À!æùóãìIçVâÞvÚƒ×$ÕYÓ Ò/ѷЙпÐ,ÑÈєҋÓÔÑÕ×}ØñÙ{ÛݹÞrà6âäçåÆçÂé´ë½íÀïÏñÜóæõï÷ëùÙû¶ýqÿ½¶h½²3;ºªþÈúÿöŸòÈí}èåâÝ,×NÑ©ËUÆuÁ,½¹’¶]´ë²0²)²Á²ë³—µ¬·ºÑ¼Â¿ÔÂÆPɦÌûÏMÓžÖáÙÝIàhãxæ{éiìOïòäô•÷:úÐüXÿÒ@õ= x °Òú !!& ý!ð#Ì%¶'’)q+J-&/ý0Ü2±4’6m8K:3<>ü?ãAÌC·EGƒI_K3MôN£P9R¡SåTéU«VW&WÈVßUpT`R O>LHAC«=„7¸0€)ã!%D ¡Kûlôî[èIããÞ%ÛØ–Õ¯ÓGÒYÑÊРгÐѦÑnÒZÓdÔ˜Õ×Ö9بÙ-ÛÂÜgÞàÚá¬ãƒålçZéSëTí[ïeñtóõ‡÷…ùxûVýÿÀ5„F®´OnŽþnûÂ÷xó¿î…éüã1ÞNØnÒ¼ÌUÇaÂõ½/º·À´)³J²"²›²­³=µA·ž¹J¼,¿>ÂlŰÈÌUÏ«ÒøÕBÙxܱßÉâååãèÛë¾î•ñXô÷¶ùRüÚþYÆ-}Ñ  Di¤º½Ä¼²£!Œ#t%U'6)+î,É.¤0|2X4268í9Ô;²=ž?€AoCTEBGIKÓL NOPçQ_S¤T»UˆV W*WÞVV¾TÏR4PïLîH8DÐ>À82ò*e#›²Ñ ¸üÀõOïséCä·ßÛÛ¦Ø Ö ÔŒÒ‚ÑçУвÐÑŠÑGÒ*Ó4ÔVÕÖï×bÙàÚpÜÞÃß…áNã'å çøèïêïìòîñ óõ ÷ùû÷üÂþjî=R œ²h™SzÿüyøUô¬ï‹êåQßqÙÓÔÍYÈOÃǾ޺¨·*µm³l² ²{²q³é´Ú¶#¹Å»™¾¦ÁÍÄÈ\˲ÎÒVÕ ØÛÛß3âJåQèIë.î ñÐó‹ö6ùÐû_þÛR´\ œ Ô"AP\_\OD!,#%÷&Û(µ*•,l.F0#2ù3Ù5±7”9p;Y=9?'A CùDÜFÇH¡J~LBNýO˜QShT„UdVòV)WñVBV U4SÄPšMÂI/Eé?ù9o3^,ç$'@] Ÿ'þ÷Šð’êBå‘à˜Ü?Ù‰ÖlÔÎÒµÑѯЭÐñÐnÑ$ÒúÒÔÕ[Ö°×Ù•Ú$Ü¿Ýrß(áöâÈäªæ—èŠê‰ìî–ð¢ò°ô·ö¹ø³ú”üjþ¢ûú³tǕٌÿªü1ù(õ—ðŽë#æpà”Ú±ÔêÎdÉ@Ä¡¿•»?¸—µ¼³’²'²b²7³´q¶²¸=» ¾ Á/ÄoÇ¸Ê ÎaѱÔþ×<ÛrÞ—á´ä¹ç¸ê¡ízðKóö¶øMûãý_Ù=œè - f•ºÙéøûùðâ Î"¸$›&|([*6,.í/Ã1 3z5T789;ø<ß>Á@¯B•DFfHEJLìM£OJQÊR&TPU9VÙV%WþVoVJUœSCQFN‰J$F÷@1;¼4Ì-a&³Îê$—ÿ{øÌñ»ëCæxáXÝáÙ ×ÏÔÓèÑ"ѼЮÐàÐXÑûÑÖÒÇÓëÔÖm×ÒØGÚ×ÛnÝßÓà™ânäHæ7è&ê#ì'î/ð9òGôPöRøQú1üþ¿ÿS¹ßÑf¨…èÕ1:ýæùïõƒñ…ì7çˆá¶ÛÓÕÐsÊ4ÅÀP¼Ý¸¶´À²1²O²³S´¶?¸ºº½uÀ”ÃÌÆÊhͽРÔ[מÚÑÝáä'ç$êíòï»ò€õ-øÏúcýåÿaÅ)t Á õ .Oo†‘—›‰‡ n"X$A&(*Ú+¶-‘/g1E35ü6×8¸:˜<€>c@OB5DFHèIÂK‘MOO÷P€RäSUV»VW WVŒUöSÄQäNOK GB[< 6./Ü'9 [{£×ùóãìPçaâ Þ‡Ú•×:ÕnÓ ÒHÑËбÐÓÐ>ÑÞÑ¥ÒŸÓ«ÔãÕ(׌ØÚ…Û"ÝÂÞà?âäîåÏçÈéºëÄíÄïÔñÜóéõí÷èùÕûªýlÿs§ŸIŸ‹  ‡qÎý‹ú¿ö^ò†í>è§âØÜôÖ#Ñ~Ë7Æ]Á½y¹•¶b´ü²A²B²Û² ´µµÍ·=ºó¼á¿ùÂ*ÆtÉÁÌÐhÓ¹ÖúÙ7Ý_à€ãæé€ìbï2òøô¨÷MúäühÿæP± K Ž ºé-34/! "û#ß%Â'¢)|+[-2/1å2Ã4œ6z8[::<>@éAÚC½E¦G‹IbK8MöN¥P2R SÜTßUŸV WW®VÃUOT;R{OLçGC=Q70T)½!ì/ @ûfôî_èUãìÞ8Û$Ø©ÕÆÓ^ÒnÑäвÐÍÐ)ѽÑÒiÓzÔ£ÕéÖFصÙ9ÛÐÜoÞ'àåáµãåtç^é_ëUícïgñvó€õ…÷„ùqûQýÿ²(jo)’&?ØÝUþ3û~÷>ózîGé½ãøÝØ>Ò•Ì3ÇIÂä½$º·Å´7³]²8²·²É³^µa·Á¹i¼P¿\ÂÅÐÈÌuÏÄÒÖZÙ•ÜÄßæâõåÿèìëÕîªñjô(÷ÈùeüëþmÕ@Žà  Tz µÇÐÑ̯!Ÿ#~%i'B)$+û,Ú.­02b4B68ý9Û;Ã=¥?ŽAvC`EDG-IKÜL¡NOPçQXS T®U~VõVWÃVüUT«RPÅLÂH D¡>“8ë1Å*A#x–¹ ­ü¹õNïyéIäÆßêÛ¹Ø"ÖÔ£Ò˜ÑþзÐÊÐÑ£ÑVÒ=ÓCÔhÕ«Öÿ×nÙíÚ|Ü#ÞÊß’áTã2åçéôêõì÷îñ óõ÷ùûíü¹þ^Þ,:{’=p E×þÔû=øômïJêÕäß:Ù`Ó¨Í7È8ñ¾Ûº¡·3µv³€²5²—²³µù¶F¹ä»¼¾ÅÁîÄ,È{ËÍÎ"ÒpÕºØòÛ-ßEâeåcè^ëEîñåóžöHùãûpþï`Èo © ç5O`mlkaO!?#"%'è(Å*¡,{.T0024å5À79€;b=E?2ACEáFÐH¦J‚LENüO—QS`T}UTVæVWÛV(VèTSšPuM•IE¸?Ð9?36,Á$&C þ÷ˆð›êFå¡à¨ÜNÙ¢Ö}ÔèÒÌÑÑÊнРÑÑ5ÒÓÔ.ÕkÖ½×%Ù¢Ú.ÜÎÝzß5áüâÓ䲿è‘êŽìî›ð¢ò±ôµö¹ø©ú“üZþ ëßeP™e¥TÿnüóøèôWðOëåå6à^Ú€ÔÀÎ@É'Ä¿Š»<¸µÇ³¢²=²y²W³¹´•¶Í¸c»)¾0ÁLÄÇÔÊ+Î{ÑÏÔØZÛ…Þ´áÄäÕçÇê¸íð[óöÄøaûôýsèP¨ü < w£Íãþ ï à"Å$«&‹(h*F,.ú/Ñ1®3„5f7>9#;=é>Í@¸BžD†FpHGJ(LêM¨OFQÉR TEU/VÊVWêVSV,U|SQNaJõEÎ@;”4ž->&±Ò ÿnøÎñ»ëLæ†ácÝøÙ×çÔ3ÓüÑ>ÑÎÐÆÐóÐlÑÒåÒÜÓùÔ)Ö~×ÝØXÚáÛzÝ'ßÚà¦âsäTæ;è0ê&ì.î0ð<òHôNöRøGú0üþ³ÿG¡Ò²K‰\¤þÎÿý¤ù¹õ:ñOìóæQáÛ ÕØÏOÊÅlÀF¼Õ¸¶´Ô²F²d²&³m´1¶`¸Úº¢½•À²ÃíÆ2Ê…Í×Ð)Ôt×¶ÚêÝá.ä<ç7ê&íðÒòõ?øãúqýúÿoÙ6ˆ Í :a” ©£¢Ž €"f$M&.( *ë+¿-¢/r1U3&5 7á8Å:¤<‰>o@WB?D(F HòIÂKšMKOùP{RßSUV±VWùVtVoU×SŸQ½N'KÝFÚA0<Ý5/µ' @[•ÑùóçìTçoâ.Þ›Ú§×OÕ…Ó5Ò^ÑäÐÃÐìÐPÑñѸҮӽÔðÕ9×™Ø Ú’Û+ÝÐÞˆàGâäôåÚçÌéÄëÄíÍïÑñâóæõì÷ãùÐû¤ý`ÿô`“ˆ.hàáRBŽýTú}ö òEíèiâ¢ÜÀÖöÐXËÆGÁ½s¹•¶m´³W²X²÷²(´×µê·`º½ÀÃKÆ‘ÉÞÌ5ЃÓÒÖÚKÝzà”ã§æ¤é–ìtïIòõ¾÷^úõü}ÿódÀ Z ž Êø.:EA?/ !"$ò%Í'³)Š+h-@/1ò2Ð4§6‰8e:I<(>@óAäCÂE²GŒIkK8MúN¢P3R˜SÖTÓU’VøVW”V©U-TRVOæK¾GßBX="7g0,)–!Ïè y:û_ôîdè`ãúÞIÛ5ØÀÕÚÓtÒ„ÑúÐÈÐãÐ;ÑÒÑÒ}ÓŠÔ±ÕùÖTØÀÙJÛ×Ü~Þ1àîá¿ã”å|çgéaë^íbïoñtóƒõ÷‚ùlûHýÿ¤XVkqû¤ªþöúD÷úò>îé‚ã¿Ýå×ÒnÌÇ/Â×½º·Ì´B³q²O²Ñ²å³~µ€·â¹‹¼n¿}¬ÅíÈ=ÌÏãÒ-ÖsÙ¯ÜÚßþâ æéìçî½ñ€ô6÷ßùrüÿyëL¡î + b‹¯ÃÚÛãÙÑÁ!©#‘%s'S)0+ -ã.Á0—2r4M6*8 :ç;Ï=­?œA}CjEMG2I KâLŸNSPäQRSžT UsVåVW¯VÜU€T‰RéOšL›HÛCy>b8¿1œ*#Ty¡ ö¤ü­õRïxéWäÌßÿÛÈØ6Ö6Ô´Ò³ÑÑÑÐÛÐ*ѵÑjÒOÓTÔyÕ¸ÖØ{ÙùÚÜ(ÞÞß“áeã6åç éùêýìøî ñ óõ÷ù ûéü±þOÐ#ïYrGíœþ›ûû÷Øó(ï ê–äÜÞÙ/Ó}ÍÈÃ¥¾Ëº¤·5µƒ³²K²±²ª³&µ·e¹¼Ý¾åÁÅKȘËìÎ;ÒÕÑØÜAß^â{åxèwëWî1ñùó®ö^ùñû†þýuÔ3x À ò"D_p{}yr^!N#2%'ø(Ñ*³,‡.d0<24ò5Î7§9;j=U?8AC EïFÒH°JƒLINþO•Q S\TqUKVÕVþVÈVVÐTïRyPIMmI×D? 93 ,–$á( z þ ÷ˆðšêOå«à·ÜbÙ´Ö“ÔýÒàÑ.ÑÛÐÖÐÑ–ÑGÒ#ÓÔBÕvÖÏ×1Ù°Ú;ÜØÝ‡ß=á ãÚäºæ¨è•ê—ì“îžð©ò®ô»ö°ø¬ú‡üWþýÿ„ÖñÅIl)p3sÿ2ü¹ø¦ôðë¦åüß%ÚOÔ“ÎÉ Äx¿‚»4¸£µÐ³±²R²“²s³×´´¶ï¸ƒ»L¾NÁoĬÇôÊHΗÑéÔ0ØoÛ¢ÞÇáßäççáêÊí¥ðoó+öÖøwûþ‡ùa¾ N ˆ´ßò!ì"Õ$»&—(y*P,0.0ß1¼35t7K9/;=ó>Ù@ÂB¦D‘FqHUJ%LóM¦OFQÅRT:U'V·VÿVÔV6VUXSúPõM8JÅE¥@Ï:i4r-&h‘¸÷€ÿdøËñ¼ëTæŒáwÝÚ7×õÔLÓÒLÑíÐÒÐÑ|Ñ%ÒöÒîÓÕ<Öˆ×ïØbÚïÛ…Ý2ßæà¯â|ä]æAè7ê-ì2î4ðAòGôPöPøEú*üøý¬ÿ3˜´Ÿ-h8•vΓÿÌüfùwõÿð ì¸æáFÛoÕ¬Ï(ÊÿÄRÀ>¼Í¸¶´à²\²|²D³ˆ´W¶y¸»¿½¸ÀÓÃÇTÊŸÍ÷ÐAÔ‘×ÌÚÞ+áFäRçMê:íðäò¥õRøõú…ý ~íEš Þ Kq¤°¸³°ž "u$[&<(*ø+Ð-«/„1_3757ï8Ò:°<•>{@`BID1FHöIÊK—MROöPxRÜSUûUŸVöVáV\VSU³SQ’NK®F°Aþ;µ5Ö.'ì @~óÄùóäì]çwâ;Þ«Úº×eÕ™ÓLÒsÑùÐÚÐýÐiÑÒÏÒ»ÓÐÔÖGרØÚ¡Û5ÝÞÞàXâäæÝçÖéÇëÌíÎï×ñáóéõç÷äùÅû¡ýQÿêNm[E·±#ZýúAöÞñíÁç.âgÜÖÅÐ6ËöÅ4Áü¼o¹‘¶z´³m²o²³I´òµ¸~º5½"À9ÃhƱÉûÌRПÓíÖ.ÚeÝà¬ã¼æºé©ì‹ïZòõÏ÷qúýÿrÕ# r ¦ ã'=LRUJA ."$ÿ%Ü'Á)™+v-Q/%13×4¼68v:Q<7>@BèCÒE³G–IpK;MþN¡P1R”SÍTËUƒVèVêV|V‹UTðQ1O¼KG¶B'=õ6;0ÿ(s!¨Î j+ûZôîkèdã ßYÛDØÚÕçÓÒ–ÑÑÜÐøÐPÑäѤҎӚÔÄÕ×bØÑÙSÛç܇Þ=àøáÇã¡å~çtécëeíiïnñ{óõ…÷{ùiû@ýüþšCCñQLÒëqvãýºú÷½òúíËèBãˆÝ®×âÑDÌóÆÂĽº·Ô´O³ƒ²d²ê²´›µ¢·º¨¼”¿›ÂÍÅ ÉZ̬ÏþÒGÖÙÃÜøßã(æ$éìüîÑñ”ôK÷ïù‰üÿøc¯ 9 u™¿ÕåñïìÞÑ!¶#¤%'c)<+-ó.Í0¦2€4Y688:÷;Ö=½?¡AŠCrEVG7IKâL¤NRPàQRS‘T›UbVØVíVšV¾UdTcRÆOqLoH±CF>98‘1u*ò"3YŠ ä”üªõMï}é\äÛß ÜØØLÖFÔÏÒÄÑ)ÑäÐñÐ>ÑÆÑ~Ò_ÓgÔ†ÕÊÖ؈٠ەÜ7ÞæßŸánã@å!çéëíïñóõ÷ùûãü£þI½Ñ?MîÁÚiþ[ûÂ÷•óêîÎéXä£ÞÐØýÒWÍôÇþźž·<µ³Ÿ²b²Ê²Ä³Jµ6·‹¹$¼þ¾Â+ÅmȵËÏXÒ¦ÕìØ)ÜVß{âŒå’è‰ëmîEñ ôÃönùü•þ…è? Ë 2Qq}Œˆ€o!Y#E%"')â*½,™.p0K2!46×7»9”;{=[?FA'CEôFÛH´JˆLNNúO—QSVTiUÙ¾ÚEÜçÝŽßJáããäÄæ«è¡ê˜ìîžð¬ò°ô¸ö±ø¥ú„üJþöÿrÈÙ¬,IEAãþûûxøjôØïÎêmå½ßôÙÔpÎöÈóÃd¿t»5¸¤µÚ³Å²d²®²³÷´Ó¶¹¢»o¾lÁ‘ÄÆÇËaεÑÕH؋۸Þßáõäüç÷êÞí¹ð‚ó?öéøˆûþ— sË ] —Çê)#-!ù"ã$Ç&¨(†*`,;.0ï1Å3£5{7\98;=þ>å@ÈB´D“F~HUJ.LòM©OEQÁRT3UV«VìV½VVòT8SÕPÎM JŸEp@«:44N-é%GqšæmÿaøÀñÃëTæá€ÝÚE× Õ_Ó(ÒfÑýÐëÐ!ÑÑ9ÒÓÿÓÕIÖš×øØsÚùÛ’Ý>ßîàºâ…ädæKè=ê4ì6î:ð@òMôLöQø>ú&üïý ÿ'ƒ¦BjH™^ÿü*ù9õ¾ðÌëzæÚàÛ>Õ‚ÏÊäÄ;À3¼È¸¶'´ð²o²–²\³¨´t¶¸ »à½×ÀóÃ*ÇnÊ¿ÍÑ`Ô¦×ëÚÞFáZäiçaêRí)ðûò¶õføû—ý“ù\¤ ó &\€Ÿ²ÀÇÂÀ¬ ž"ƒ$l&I(+*,á-¹/‘1m3C5"7ú8ß:»<¡>†@hBVD3F!HöIÔK–MVOóPyRÔSûTñUVåVÊVCV5U”SXQnNÓJ…FAÑ;†5­.e'Éý&eæ·ùóäìcçâIÞ¾ÚÊ×zÕ­ÓcÒˆÑÑëÐÑzÑÒãÒÊÓåÔ ÖZ׳Ø)Ú­ÛBÝçÞà]â+äæèçÚéÑëÎíÖï×ñåóæõé÷ßùÃû•ýJÿÚ>mUù; ŽƒòÏÿ!ý×ùöŸñÆì‚çóá.Ü]Ö˜ÐËÙÅÁñ¼g¹•¶~´"³}²Š²+³e´¶.¸£ºR½GÀUÊÆÎÉÍnкÓ×FڀݦàÅãÒæÐé¿ìŸïoò/õä÷ƒúý¡ÿ†ä6 » í6M[ba]O ="'$ &ï'Í)¨+†-[/613æ4È68€:_(@ BõC×E¿G™IxK=MO£P,R“SÄTÂUvVÔV×VaVqUïSÎQ OKgG†Bù<Ë6 0Ø(K!‡°ë W ûTôîpèmãßfÛZØéÕÔ¤Ò«Ñ)ÑïÐ ÑdÑ÷Ñ·ÒŸÓªÔÓÕ×pØÞÙbÛïܘÞAàâÎã¨åŠçvéoëhínïsñzóƒõ÷~ù_û>ýîþô3)Ù0&®¸F<¬ýúÄöò¸íèãLÝ~×°ÑÌÓÆýÁ·½ º·Ú´Z³–²{²³!´ºµÃ·#ºÎ¼®¿ÀÂèÅ/ÉtÌÊÏÓdÖ§ÙàÜ à*ã;æ>é-ìïäñ§ô`÷úœü"ÿŸ pà L ‚­Ëèôþúïß!Æ#°%'r)L+'-/Ù0´2Ž4f6E8 :<ä=Å?°AC}E\G>IKæL§NPPáQJSŽTUWVÆVÛV~V§U?TERšOML?H‡C>8j1F*Î"9s Їü£õHï…é`äëßÜíØ^Ö\ÔáÒàÑ9ÑþÐÑSÑÚÑ‘ÒoÓyÔ—ÕÖÖ.Ø“ÙÛ ÜEÞîß­áuãIå-çé ëíï ñóõ÷ùûÙüžþ7²ñü³%%Êì©.þ"û‚÷XóªîéähÞžØÍÒ/ÍÒÇéÂ~¾ºº·Aµš³³²u²ç²ß³jµV·ª¹G¼¿'ÂKÅŠÈÕË#ÏuÒÂÕÙCÜoßâ§å¤è¡ë€î[ñô×ö€ùü§þ"˜õTœ Þ @dŽš™~!k#O%4')ò*Ë,¦.}0Y204 6æ7Å9¡;‰=d?PA4CEGÞH¼J‹LPNýO•QSPT]U4V³VÛV–V×UŽT±R)PüLID0?F9»2´+K$˜Æø Mòýøö‚ðŸê^åÁàÕÜ‚ÙÜÖºÔ+Ó Ò]ÑÑÑ@Ñ¿ÑlÒDÓDÔ]Õ›Öç×PÙÉÚTÜïÝßRáãîäÉæ·è¢ê£ìŸî¥ð­ò±ô·ö²øžúü?þìÿb¹Á– *ÝÚ²þºû?ø'ô™ïê,å…ß»ÙëÓAÎÕÈÔÃS¿g»1¸¦µç³Ò²}²Ã²¬³µô¶1¹Å»¾Á¯ÄçÇ4Ë~ÎÑÑÕdØ£ÛÑÞ÷á åèëñíÏð•óTöüøšû*þ¦"â) q §×ú+587+"! #ó$Õ&·(•*o,K."0ý1Ô3¯5‹7e9J;"=?ì@×B»DŸFƒH]J1LøMªOCQ¿R T.U VŸVÕV«VVØTS´P¡MåIlEI@t:4-Ç%T|Ò[ÿUø¾ñÁë^æ¢á’Ý$Ú[× ÕsÓAÒxÑÑþÐ7ѤÑJÒÓÔ*ÕYÖª×ÙÚÜ¡ÝFßþà¿â”äiæUèBê;ì:î>ðEòLôPöJø?úüçý—ÿsiö$îAg'ÿUüíøúô}ðë;æœàÛÚ ÕUÏÞÉÅÄ)À"¼Å¸¶/´³²±²u³Ì´Ž¶Â¸?»¾üÀÄJÇŽÊÛÍ.Ñ{ÔÃ×Û4Þ^áqä‚çuêhí?ð óÍõwøû©ý/¤ i¼ ý ?e–¬ÄÑÔÖË¿ ¬"”$z&Y(8*,ï-Æ/¡1w3U5-7 9é:Ç<®>Ž@uB]D?F&HþIÕKŸMTOôPwRÊSúTàU„VÒV´V+VUwS/QIN¦JYFTA£;X5€.;'¤Û NÔ­ùóäìiç‡âWÞËÚß×ÕÃÓyÒÑ'ÑÑ+ÑŒÑ*ÒðÒáÓðÔÖd×ÄØ5Ú¸ÛOÝòÞ§àgâ4äæñçáéÖëÖíÖïßñãóêõæ÷Ýù¼ûý=ÿÐ,Y@ÚúeX½œÿåü›ùÄõ_ñˆìBç¹áôÛ+ÖkÐéÊ»ÅÁã¼b¹•¶ˆ´.³”²ž²H³‚´3¶O¸Âºw½dÀyçÆïÉ6Í‹Ð×Ó"×`ڙݽàÞãèæåéÖì´ïòHõñ÷šú,ý±ÿ-”öG ’ Ê 'Dafvpk_ L"6$&ü'Û)¹+Ž-p/?1"3ñ4Õ6©8:h/@BüCâEÄG¥IvKHMüN¤P+R‰SÂT³UhVÆV¾VKVUUÌS®QáNgKò}íIèÎâÝH×…Ñ÷˲ÆëÁ¡½ º·å´g³©²’² ³>´Úµâ·Dºï¼Ï¿á ÆIɘÌáÏ8Ó|ÖÂÙúÜ"àDãQæSéEì%ïùñ½ôn÷úªü7ÿ¯"|Ú ^ •¹àõ  üï!Õ#¿%ž')[+6-/è0Á2š4t6R8+:<í=Ó?·AœCƒEeGFIKêL«NOPâQFS…TˆUHV·VÇVeVŒU#TRzOLHVCï=Ù7=1*¥"îU ÂvüŸõFï‡éjäõß(ÜÿØnÖtÔõÒóÑQÑÑÑiÑêѧҀӉԨÕåÖ<Ø£Ù"Û®ÜMÞüßµáãRå4çéë í ïñóõ÷ùüúØüþ.¢ßæ™ Â]uõýæúE÷ólîOéàã.ÞgØŸÒÍ´ÇËÂq¾®ºž·Fµ¦³Ã²Ž²ý²´ƒµ|·Æ¹l¼=¿IÂiŪÈñËBÏÒÝÕÙ]܆ߩâºå¾è´ë˜îmñ3ôìö’ù.ü¸þ7¦ eª ó #Su ««¨ž‹!|#]%C'!)+Ù,¶.‹0g2<46ô7Ñ9±;=v?WA>C$EGçHÂJLONPQSITSU*V¡VÊV}V½UoTRPÑLêHRD?9Ž2‹+!$u¦ß 9äýïö~ð¤ê`åÏàßÜ—ÙëÖÒÔ;Ó$ÒlÑÑÑYÑÑÑÒWÓUÔnÕ©Öõ×_ÙÔÚcÜùÝ©ß]á&ãôäÕæ¼è­ê¦ì¥î¨ð±ò³ô¶ö¯ø›úxü;þÛÿZ ±yï¶ï§Ùuþ…ûü÷íóWïQêïäJ߄ٽÓζȶÃ@¿^»+¸¯µë³è²‹²ã²Ã³7µ·U¹ä»¯¾±ÁÍÄ ÈOËÎîÑ8ÕØ¹ÛíÞ â"å,èë îáðªógöù¯û9þ¾-—î= € ¹å %<DIE?,!#%ã&Æ(£*},Z.00 2â3½5—7t9R;2=?ö@âBÂD©F‰HcJ6LüM©ODQºR T$UþU‘VÂV–VäU½TïRPzM¹I@E@I:Þ3ô,™%ù2b¹OÿFø½ñÀëbæ­áÝ7Úh×8Õ…ÓXÒÑ*ÑÑJѸÑ]Ò,Ó Ô;ÕgÖ¸×ÙŒÚܪÝTßáÎâ—äxæYèKê@ìAîAðIòMôOöLø9úüàý‹ÿ b{RÚÉë6ðþü±øºô@ðLëÿå`à¥ÚÔÔ.ϵɭÄÀ¼½¸ ¶;´ ³™²Ç²“³ç´±¶à¸a»%¾Á5ÄgǬÊûÍGÑ™ÔÛ×ÛJÞyá†äšçŒê{íWð!óÞõø'ûÃý;¹zÎ  L{ ÁÑââçÚÐ ¹"¤$ˆ&h(F*",ü-Õ/®1‡3`5<79ö:Õ<·>›@€BeDIF*H JØK£MVOóPtRÈSîTØUtVÀVŸVV÷TXS Q N€J)F'Av;*5U.'}¹î6¢ùóäìlç‘âbÞÚÚò×ÕÚÓÒ³Ñ<ÑÑ@ÑžÑAÒþÒõÓÿÔ.Öv×ÍØHÚ¿ÛaÝøÞµàoâ>äæûççéßë×íßïßñçóéõæ÷Øùºû†ý5ÿÁD(¾þÕ>'eÿ­ü_ù…õñIìç}á¼Û÷Õ>ÐÁÊÅìÀÔ¼Z¹˜¶‹´A³¢²¸²d³œ´W¶l¸äº˜½…ÀšÃÉÆÊYÍ¢ÐùÓ8×}Ú¯ÝÙàóãþæþéçìÌï–òYõ øªúAýÁÿA¤ X ¢ Ý 7Xl{ƒ€|m ]"C$-& (í)Ä+¡-y/T1)35Þ6¹8š:u<[>9@%BDðEÇG­I}KIMO¡P*R†S·T­UXV¶V«V3V6U¯S‡Q¼N>KG+BŸí è’âØÜ×TÑÑË“ÆÐÁ”½ý¹·ì´s³¼²¦²>³Z´ùµ¸eº½ó¿þÂ)ÆkɰÌÐJÓŸÖ×ÙÝ;à\ãgækéXì<ïòÎô†÷'úÁüFÿÅ-–ã4 k ¦Ìî! ü!å#Í%­'Ž)i+F-/ù0Í2©4‚6\8;:<ü=Ú?ÅA¤CEnGKI$KîL¬NQPÞQCS~T}UÀý¨ú ÷Õò.îé¤ãóÝ2ØpÒÜÌǵÂ\¾§º›·Lµ°³×²¡²³´¥µ–·í¹ˆ¼a¿i‰ÅËÈ ÌaÏ«ÒøÕ:Ùrܢ߾âÓåÕèÉë­î‚ñHôÿö¦ù@üÊþJ·rÀ 6b…ž°¹½´±™!Œ#k%R'1) +ê,À.0q2N4$68Û9¾;›=?dAFC/E GòHÃJ—LTNýO’QýRBTLUV‘V¹VcV¥UNTlRßO©LÁH"DÙ>ç8d2^+ú#Oˆ 'Òýèö{ð¢êkå×àïܧÙüÖæÔQÓ9Ò‚Ñ3Ñ)ÑlÑåÑ‘ÒkÓcÔ‚ÕµÖØlÙàÚqÜÞ³ßhá-ãåÚæÅè±ê­ìªî¬ð´ò³ô·ö­ø—úrü1þÏÿLŽœ_ÐçÆw¢AþFûÂ÷«óïê±äßOÙŠÓì͓ȜÃ,¿V»%¸¶µõ³ø²¥²ø²å³Oµ6·s¹¼Ò¾ÎÁñÄ%Èn˻ΠÒUÕ™ØÔÛß'â8åCè3ë"îòðÃóvö%ù½ûNþÎ@¨þP Ëö7JUXUL=!(#%ò&Ö(¯*,f.>02î3Ê5¤79_;>=?AèBÎD°FHkJ8LÿMªOCQ¶RTUõU}V´V|VÎU™TÓRePVMIEî?:·3Ã,v%ÓK Cÿ;øºñÁëjæ·á«ÝFÚ×IÕžÓjÒ¥Ñ@Ñ*Ñ^ÑÊÑqÒ=Ó3ÔIÕxÖÆ×$Ù˜Ú Ü´Ý_ßáÓâ¥äzæeèOêGìFîCðNòKôRöGø7úüØý~ÿþPf9¼â£í½»þàûvø{ôðëÁå&àoÚ¥ÔÏ”ÉÄÀ ¼½¸"¶E´³¯²ß²¯³µÎ¶¹€»E¾:ÁRĈÇÉÊÎfѱÔù×3ÛfÞŒá ä®ç¡ê‘íhð7óñõ¡ø<ûÑýPÊ-ŽÛ ! \‰´Ëçí÷òêà Æ"·$‘&z(S*2, .ã/¼1’3o5E7%9ÿ:â<Á>¥@ŠBlDSF1HJÞK¥MWOôPnRÄSåTÌUfV­VŠVöUÞT1SîPòMYJýEû@I;ý4,.è&]•Ö¶–ùÿòãìuç˜âtÞçÚسÕíÓ¥ÒÇÑSÑ+ÑSÑ·ÑMÒÓÔÕ<Ö…×ÝØPÚÓÛdÝ ß¹à|âGäæèïéãëÞíâïàñëóæõç÷Ñù¶û~ý)ÿ³ ,Ÿß¯ù^/ÿtü$ùDõæðìÍæ>áŠÛÄÕРÊ}ÅÝÀüV¹œ¶”´O³¸²Ï²~³½´p¶“¸ÿº¼½¢ÀºÃæÆ)ÊrÍÃÐ ÔV×•ÚÆÝóàäçêíÙï¯òhõø»úPý×ÿL»j ² ì Hd~‰‘’…€ g"U$7&(ø)Õ+¬-‰/]1935é6È8¡:„H@(BDñEÒG±IKLMO P)R~S²TœUOV V˜VVU‹ShQ“NKäFÿAré?ÉA³CEwGQI'KòL¬NQPÚQ?SvTqU/V”VV7VSUãSÚQ+OÎKÂGüB–=~7è0Ê)Z"ªâ( š`üõBï’éwäàDÜ"Ù˜ÖšÔ%ÓÒÑ9ÑCÑÑÒÊÒ¤ÓªÔÇÕ×VØ¿Ù;ÛÇÜdÞàÊáãfåAç-éëíïñóõ÷ùôúÅü€þ‚»´hÃÁRhÿ „ýsúÇö›òîíÒèiã¼Ýÿ×AÒ¶ÌqÇÂN¾œº·PµÁ³å²»²2³8´Âµº· º«¼¿†Â¬ÅåÈ.ÌxÏÊÒÖSÙܶßÙâçåêèÝëÁî–ñ\ô÷¹ùSüÛþ[É-…Ð  Gp—¬¿ÉÉɹ«!—#{%a'?)+ù,Ì.©02X4268ç9É;¦=Š?lAQC6EGöHÈJ›LSNPŒQûR:TCU VƒV¢VMV‰U0TIRºO€L–H÷C­>»8926+Õ#-n¨ Äýãöyð¨êqååàüܹÙ×ùÔiÓLÒœÑEÑAÑÑøÑ¥Ò{ÓtÔ’ÕÄÖØxÙïÚ{ÜÞ¾ßqá8ãååæÉè»ê°ì®î±ð²ò¶ôµö¨ø–úgü*þÂÿ=z†E²Äh™Km þ û‡÷lóÝîÓéwäÙÞÙ_ÓÂÍsȃÿH»)¸·µ´³»²³´mµU·”¹%¼ó¾îÁÅFȈËÚÎ!ÒqÕ±ØðÛß@âMåWèMë1î ñÓó‰ö8ùÏûaþÝSµ] ¡ Ù,D\`l_`F!;#%'â(¾*œ,q.O0"2þ3Õ5±7‹9j;K=(?AïBÙDµF›HjJCLúM±OôÂïÏêƒåðß6ÚxÔÓÎuÉpÄí¿¼¶¸(¶L´0³¾²û²È³%µî¶"¹£»d¾\ÁrĤÇêÊ2΃ÑËÔØMÛ~Þ£á·äÃç¸ê¥í|ðKóöµøOûãýbÚAî / mšÂÝóùì Ø"À$¥&ƒ(e*<,.ñ/É1¡3z5S719 ;î<Ê>³@ŽB}DTFP@4BDøEÝG±IKIMO P"R}S¥T•U>VVVVüTpS?QpNêJºFÑAE<6^/7(´ = ðú?ôî„èãMߢۤØ5ÖXÔõÒ ÒxÑJÑ\ѶÑBÒÓãÓîÔÖO׬ØÚ•Û ÝÄÞmà/âóãËå©ç”é…ëí}ïñó‡õy÷pùMûýËþV¸áÍk±—  |oÿÂü—ùÉõ†ñ½ì•çâmܰÖÿÐË[ÆŸÁ|½í¹·ô´”³Ý²Ù²p³•´6¶E¸£ºT½1À?ÃhƤÉîÌ9ЇÓÎÖ ÚDÝkà‰ã“æ”é‚ìeï3ò÷ô§÷OúáünÿâU² Q Ãí#5<=7+ "$ë%É'«)„+b-6/1å2Å4™6w8R:0<>ó?ÕA¸CžEyG[I)KøL«NSP×Q;SlTlUVˆV†V!V6UÄS·QO¦K•GÔBb=Y7·0¤)4"†Ê OüŽõ@ï–éäàVÜ4Ù«Ö°Ô8Ó2Ò–ÑOÑYÑ¢Ñ(ÒÚÒ¸Ó¹ÔØÕ×cØÏÙCÛ×ÜmÞàÓášãmåKç0é$ëíïñó!õ÷ ùïú¿üvþq©›QŸ£%@Í×ÿOý6úö[ò±í•è-ã…ÝÍ×ÒÌQLJÂ<¾™º—·[µÉ³ü²Î²L³W´ÞµÛ·*ºÌ¼ ¿©ÂÆÅÉGÌ™ÏâÒ,ÖmÙ¥ÜÎßïâüåéóëÔîªñlô&÷ÉùgüêþpÕD‘á " R†¢½ÐÔßÑ̺!£#%j'O))+-ß.³02h4<68ñ9Ö;±=•?vA\C;E GùHÑJœLXNÿOŒQõR4T8UVrVV:ViUT'R’O]LhHÐC|>”8 2+®# P“ ºýÛöwð­êwåóà ÝÍÙ#×ÕzÓgÒ­Ñ^ÑSÑ”Ñ Ò·ÒŒÓ…Ô¡ÕÕÖ"؆ÙýÚ…ÜÞÇß{áCãåîæÐèÀê¶ì²î³ð¶ò´ôµö¥ø’ú`üþºÿ'nk-“£?q?ÏýÕúH÷0óî•é;ä ÞæØ/ÓÍNÈnà ¿B»%¸¾µ ´³Ì²/³´’µo·¶¹E¼¿Â.Å`È«ËñÎAÒ‰ÕËØÜ3ßTâgåkè`ëHîñèó›öKùàûuþídÉs ® ê;Ukozri\!E#,%'î(Î*©,.[022 4å5º7›9s;Y=1?AöBâD¿F›HxJ=LN©OBQ®R÷SUÜU^VVNV˜U_TRPM7IÁD‘?Ä9\3s,'%‘Óz'ÿ,ø¶ñÆëxæÎáÈÝhÚ¥×qÕËÓ”ÒÓÑiÑUцÑõÑ’ÒfÓQÔlÕ–Öã×>ÙµÚ6ÜÐÝqß)áãâ¹äŒæqè_êPìOîKðRòLôSö?ø1úüÆýhÿà+;‚X—`œLþpûø÷ô~ï—êEå·ßÚDÔ±ÎMÉZÄÙ¿õ»µ¸*¶X´>³Ô²³ä³Cµ·A¹Ã»†¾yÁ”ÄÃÇËPÎÑçÔ+ØfÛ•Þ¼áÍä×çÏê¸í’ð\óöÆødûñýwèS®û D y¬Ñî ö ë"Ì$´&”(p*L,&.ü/Ø1­3ˆ5^7?9;û<Õ>»@žB|DeF;HJåK«MWOòPgR¶S×T°UNV‚VcVÀU¥TðR¡P©MJ¨E @ñ:¤4Ú-™&\žø”‡ùóòîìxçµâˆÞÛ'ØÝÕÔÍÒ÷Ñ{ÑVÑ~ÑÚÑwÒ7Ó'Ô1Õ]Ö¡×øØnÚèÛ€ÝßÐàŽâYä0æèúéñëçíéïèñéóêõÞ÷Îù¦ûoýÿšçßjšh¾¡öÆþÿû­øÌôdðŽëOæËàÛ`ÕÁÏSÊKŬÀ±¼H¹ ¶©´j³á²þ²µ³ø´°¶Ñ¸D»ù½çÀõÃ&ÇdÊ­ÍøÐGÔ†×ÊÚöÝ!á5äCç;ê(íðÒò‘õBøàúvýøÿqÛ9Š Õ Ccˆš©°¬©˜ Š"p$U&7(*ô+Ç-£/{1O3/57á8¹:šY@ABDFÞG½I‹KQMO¢PRzS›TŒU-V‚ViVêUßTPSQHNÄJŒF¨A<ë55/(Ž å { çú7ôîƒèŸãRß¹Û±ØOÖhÔÓÒ”Ñ[ÑuÑÇÑWÒÓöÓÿÔÖe׳Ø%ÚÛ/ÝÍÞ{à5âäÐå²çšéŠë†í€ïƒñ„óƒõ{÷lùFûý¼þM¥Ï´N“râÜJ9ÿ‹üYùŽõEñìWçÞá7Ü|ÖÒÐ_Ë8ÆÁg½í¹·þ´ ³ð²ò²Š³±´Y¶_¸Êºr½PÀcÃÆÈÉÍXРÓêÖ%Ú]Ýà ã©æ«é–ìzïFò õº÷búóüÿóg b Ÿ Òþ4DKKH8 *"$ú%×'º)’+o-G/1ø2Î4©68^:=<>ý?ßAÂC¥E„G\I3KøL±NPPÖQ3ShT^UVwVnV VU¦S“QàN|KjG§B9=(7Ž0y) "i¥þ sLüõCï˜éŠä&àeÜBÙÃÖÀÔQÓFÒªÑeÑnѵÑ=ÒêÒÌÓÉÔéÕ!×sØÛÙRÛãÜxÞ(àÝá£ãxåQç9é*ëíïñ!óõ÷ùðú³üoþùÿd’‹.‹u›§ÿýúKö!òní[èïâOÝ—×èÑiÌ1ÇoÂ,¾º—·aµÕ³³ã²h³q´¶÷·Nºë¼Á¿ÈÂçÅ%ÉfÌ´ÏÿÒEÖˆÙ¼Üéßãæéìëî½ñƒô5÷áùsüÿzïL¨ð 1 h¶ÌßæêâÜÆ!¸#•%€'X);+-î.À0ž2q4M6%8:ß;¾=Ÿ?€AdCFE$GIÓJ¢LXNPŠQðR.T-UôUbVyV VRUòSRlO3L@HŸCU>`8ã1â*‰#è2v óªýÔöuð­êƒåúàÝÛÙ9×"Õ”ÓxÒÆÑsÑfÑ­ÑÒÍÒšÓšÔ®ÕåÖ1ؓ٠ÛÜ,ÞÎߊáGãåòæÚèÆêºìºî´ð¸ò·ô±ö¦øŠú[üþªÿXXy|Bè ™ýšú ÷ôòYî]éúãkÞ¯ØÓrÍ1ÈPÃû¾5»%¸Àµ´'³è²C³:´¬µ‘·×¹e¼6¿.ÂMÅ‚ÈÆËÏ\Ò¤ÕçØÜKßkâ~å‚èuë]î1ñùó³öZù÷ûƒþtÛ.† »  R_}ˆ‚xj!U#;% 'ý(Ü*µ,‘.d0B24ó5Ç7¦9€;a=A?!ACãDÌF¡H{JFLN¬O?QªRñSÿTÎUQVyV7VU>ToRøOßLI“Dd?™9,3N,ü$oµþ hÿ&ø®ñÌë{æÚá×ÝwںׄÕàÓªÒèÑ~ÑjÑ›ÑÒ¦ÒuÓeÔzÕ§Öð×MÙÁÚCÜÚÝ|ß4áîâÁ䔿xèeêVìUîOðQòSôJöEø'úü¼ý^ÿÐ"ïc0m3fþ/ûÅ÷ÀóGïRê å}ßÍÙÔÎ2É8Ä˿绳¸/¶_´Q³ç².³ý³aµ-·b¹å»£¾žÁ®ÄæÇ"ËnθÑÕBØÛ­ÞÑáçäëçäêÎí¥ðqó*öÙøtûþ†üc¼ M ‘¶åû" !ø"Ü$Ã&¢(~*[,1.0á1»3–5j7L9 ;=ã>Â@«BDoFBH JìK¬MXOòPbR´SÊT©U9VvVHV©U†TÐR|PƒM×I}Eu@Ã:y4®-p&ð8…áƒ}ùîòìì€ç»â˜ÞÛ8ØóÕ(ÔèÒÒ’ÑlÑÑóчÒJÓ8Ô@ÕnÖ¯×ÙyÚõÛ‹Ý*ßÜà˜âaä8æèêõëîíêïíñéóêõÝ÷Èù£ûcý ÿ‡ÛðÆMzA˜pÆþÉûoøô%ðPëæ‘àéÚ.Õ—Ï0Ê,ÅœÀŸ¼H¹ ¶³´y³õ²³Ñ³µÎ¶ó¸a»¾ÁÄCÇ‚ÊËÍÑbÔ¡×âÚÞ:áJäZçPê=íðçò¤õVøñúŠý…éL› ã Qv”®¶Á¾´« —"}$h&@(&*ü+Ø-±/‡1_3957ë8È:¤<†>f@FB-DFíG½I”KRMO PRrS–TU!VmVXVÌUÇT,SúP"N˜JdFyAë;¼5 /â'm À_ õÙú3ôîˆè¦ãaßÅÛÅØ_ÖÔ"Ó1Ò¨ÑqшÑÝÑhÒ%ÓÔÕ2Öo×ÇØ,Ú¯Û8ÝÙÞ…à?â äÛå¸ç£éë‹í…ï‡ñƒó…õw÷iùEû ý¸þ;˜º4sNº®ÿXüùVõñDìç£áÜFÖ«Ð5Ë ÆsÁ_½á¹· µª³³³¥³Ð´u¶„¸åº”½qÀ€Ã¥ÆâÉ&ÍuлÓ×=ÚvÝšàµãÂæ½é¯ìŠï_òõÑ÷qú ýÿ r×) r ± â .BUZ[VG 9"$ &å'È)¡+|-U/+13Ü4¶68l:F<)>@éAÊC¯EŠGeI7KúL³NPPÓQ1S^TTUV`VcVìUU„SqQºNSK@GxB=ù6f0O)ç!EŠã b=üyõBïšé“ä/àtÜUÙÒÖÙÔaÓ`Ò¼Ñ}Ñ~ÑÎÑKÒÓÚÓÛÔøÕ0×ƒØæÙcÛì܆Þ1àèá­ãåYçAé0ë$í"ïñ"óõ÷ùçú¯ücþïÿSqgXØèkpÿßü¾ùöÞñ2íè¶âÝg×¹ÑAÌÇSÂ!¾ƒº›·dµæ³³þ²€³Œ´#¶¸nº ½á¿éÂÆAÉ…ÌÑÏÓeÖ›ÙÚÜþßã,æ*éìþîÓñ–ôH÷õù‚üÿ‹_· @ w£ÂßîõúòèÙ!Á#§%Ž'g)H+ -ö.Ö0£2„4V658 :ì;È=ª?ŒAlCOE,G IÚJ¤LZNP…QðR"T(UäUTVeV V4UÖSáQJOLHoC(>48µ1º*a#Å_ ÚŸýÇövðªêåá)ÝíÙH×:Õ¥ÓÒÜхрѸÑ6ÒÙÒ²Ó¦ÔÀÕõÖ?Ø£ÙÛŸÜ5ÞÞß’áSã$åùæãèËêÃì¼î¹ð»ò¸ô³ö¢ø‡úUü þ ÿ FBøX\õ»Öÿdý_úÏöµòîéÀã1Þ}ØÑÒLÍÈ9Ãè¾-» ¸Çµ%´:³ú²^³T´Ëµ²·÷¹…¼V¿NÂlŤÈßË2ÏsÒÃÕýØ:Üdß‚â•å•èŽëpîHñ ôÆömù ü–þ‡êD Ó 8Zv‡’–‘ˆy!b#L%+')é*Ä,.t0O2#4ý5×7¯9;h=Q?(ACîDÏF¬H}JMLN°O;Q¨RëSôTÄU@VfV"VcU$TJRÕOµLçHdD;?i93#,Ô$J–â Sÿø«ñÈë„æàáä݈ÚÈךÕðÓÂÒüÑ•Ñ|ѰÑÒ»Ò‡ÓuÔ‹ÕµÖÿ×\ÙÍÚQÜå݈ß<áûâÇäžæ€èkê^ìWîVðSòSôNö>ø)ú÷û¸ýMÿÉÏKZ C5ãýùú…÷…óïêÐäCß—ÙéÓWÎÉ Ä´¿Þ»¬¸3¶j´^³ÿ²A³´zµN·…¹¼Ì¾µÁÔÄÈBË‹ÎÔÑÕ_Ø™ÛÈÞèáýäèùêåí¸ð†ó>öëøˆûþ—qÔ e ›Ëò #,20%!#î$Î&²(Œ*h,A.0ï1Ë3 5z7V9-;=í>Ð@¯B“DpFNH"JñK­M^OìPeR©SÆTšU0V_V7VŽUjT®RXP]M­IUED@˜:K4ƒ-I&ÉgËsrùèòëì‡çÁâ¨Þ(ÛMØÖ?ÔúÒҧрѤÑÒ›Ò\ÓHÔRÕ{Ö¿×Ù…ÚÜ•Ý7ßäà£âjäCæ è êúëóíñïîñíóêõÜ÷Çùšû_ýýþ~Æß®1[pC–Xþ’û2øRôèïëØåWà±ÚÕgÏÊ Å‹À¼D¹¡¶º´ˆ³³.³ê³4µí¶¹†»:¾(Á5ÄdÇ ÊèÍ2Ñ{Ô¿×ùÚ,ÞLágämçhêRí.ðûò¹õeø û•ý!‘Z­ ô .`ˆ£½ÇÎΟ §"$s&R(2* ,ç-½/–1k3H57ú8Ó:¯<’>o@RB4DFðGÇI–KXM OžPRkSŽTuUV^VAVµU©TSÖPûMpJ6FQAº;“5Þ.º'F  éK ßÏú+ôîŒè¬ãmßÒÛÙØmÖ˜Ô2ÓKҸщљÑñÑ|Ò7ÓÔ Õ>Ö‚×ÎØAÚ¶ÛGÝäÞàKâääåÁç§é™ëŽíŒï‡ñˆó‚õz÷dù?ûý«þ2„¨‡W'”ìÌþ!üÜøõÆðìÝækáÈÛÖ|ÐËÆ_ÁO½Ý¹·µº³³³¾³ï´“¶¢¸ »³½”ÀžÃÅÆýÉJ͉ÐÝÓ×ZڎݱàÎãÖæÕéÂì ïqò1õá÷†úý ÿ„ê5 ‰ º ø?SanfgW F"/$&ö'Õ)¯+Š-b/:13è4Á6›8v:T<1>@òAÕC³E•GhI>KýL´NOPÑQ*SXTIUõURVJV×UãTfSMQ”N+KGMBß<Ñ660*)¿!&nÈ V*üxõ>ïœéžä9à„ÜfÙäÖîÔvÓtÒÔÑÑ–ÑßÑ_ÒÓìÓëÔÖ@ר÷ÙlÛùÜ‘Þ=àðá¸ã‡å`çLé1ë-í$ï"ñ$óõ÷ùâú§üWþåÿ@qXüJ3²º<=ÿ¥üˆùÖõ¢ñöìÞç~âÞÜ5׌ÑÌôÆ>¾º˜·mµî³1³³˜³¬´<¶7¸º-½ÀÃ(Æ^É¥ÌéÏ:ÓxÖ½ÙîÜà6ãAæ?é6ìïèñªôZ÷ú—ü&ÿŸpÈ R ˆ±Ôíüøæ!Ò#¶%š'w)U+--/Ý0·2Œ4f6>8:õ;Õ=³?–AuCXE5G IáJ§L]NPƒQëRTUÔUFVOVôUU¹S¼Q(OÜKîGECú=8Œ1Ž*?#žøE Ç”ý½ötð¯êåá8ÝúÙ`×IÕ¼Ó¥ÒîÑÑ“ÑÏÑGÒíÒÂÓ¸ÔÒÕ×QجÙ(Û¦ÜEÞäߟá\ã-åçêèÒêÈìÂî¼ð¾ò¶ôµöøƒúMüþ”ÿý2.Û=7Î퉤ÿ+ý%ú”öuòâíÜèˆãöÝIØ¥Ò ÍñÇÃÙ¾!»"¸Êµ2´J³³v³q´èµÒ·º§¼v¿pŒſÈÌGϘÒÖÕÙOÜ}ßšâ¬å®è¡ë…î\ñ!ôÙöùü¨þ&—üT£ à Cnƒ˜¢¤¢–‰!o#_%4'#)ò*Ö,©.ƒ0Z234 6å7º9›;v=W?9ACùDÙF¯HˆJLL N¯O:Q¤RâSïT´U3VPV VHUT)R¯O‹L¾H4D?79Ù2õ+®$%uÉ <øþø¨ñËëˆæìáðÝ™ÚÛ×­ÕÔÕÒÒ©Ñ’ÑÃÑ.ÒÌÒšÓ†ÔšÕÇÖ ØjÙÛÚ]ÜñÝ”ßGáãÓ䦿‡ètêbì]îYðWòSôOö<ø#úóû«ýGÿ´÷ûº*;äШýÁúH÷EóÊî×é“ä ßaÙ¹Ó0ÎéÈÄŸ¿Ô»¨¸7¶t´o³³\³9´šµm·¤¹$¼ê¾ØÁôÄÈa˨ÎðÑ:ÕzزÛßÞâåèëöíÐð™óRöÿøšû+þ©!…â/ t ®Ú5:D=7(!#ú$á&¼(Ÿ*t,P.'0ÿ1Õ3¯5‡7a9<;=ù>Ø@¼B™D{FSH+JóK´MZOðP\R¨S¹T“UVPVVvUJTŽR4P3M…I#E@c:&4P-$&¡ùJ´beùäòëìˆçÍâ¯Þ;Û^ØÖWÔ Ó8ҹіѷÑÒªÒrÓWÔdÕ‹ÖÌ×%Ù“ÚÜ£ÝAßðà¬âuäKæ(èêÿëúíóïòñðóçõÞ÷¾ù›ûQýøþj¹Ç˜<õF`%þUûù÷ô¨ïÓê˜å àyÚÏÔ?ÏçÉóÄrÀ†¼=¹¦¶Á´š³³I³´Tµ ·3¹¥»\¾JÁSćǼÊÎOÑ—ÔÙ×ÛCÞfáäƒç€êgíBðóÌõ{øû¬ý/§o¼  ?o™´ÊÚÜßÓÉ ¶"š$…&](C*,õ-Ë/£1|3Q5,79â:¼<œ>z@\B>DFùGÌIKZM OŸPRgS†TiUVIV,VU‹TíR³PÑMGJ FA;b5².' zÍ0 ξú'ô î“è±ãxßáÛéØÖ«ÔFÓ_ÒÏÑÑ®ÑÒÒIÓ+Ô/ÕPÖ×áØJÚÆÛRÝòÞ™àWâäîåÉç±éŸë•íïŠñŽó€õ{÷_ù<ûúü¤þ y‘pû5hX¶þßû«øÔôŒðÃë æ-á•ÛäÕPÐìÊâÅIÁ@½Õ¹·µÆ³*³6³Ù³ µ±¶Æ¸&»×½³À¿ÃçÆÊfÍ©ÐùÓ4×vÚ¦ÝËàçãëæîéÖì¸ï„òEõö÷™ú-ýµÿ,˜úJ – Ð ,P`vyyvf U"B$ & (à)À+—-p/I13÷4Î6¨8„:^@ÿAÝC¿E™GrI?KM´NRPÎQ&SRTV9V¼UÉTES*QlNKéFB±<Ÿ6 0û(š!ýP­ @ükõ=ï›é£äCà‘ÜwÙõÖÕ‹ÓˆÒêѡѬÑïÑvÒ"ÓÿÓüÔÖN× ØÚ|ÛÝÞGàþá¿ã“åjçPé=ë2í(ï(ñ$óõ÷þøÝú¢üOþ×ÿ3\Cã)‰ ÿoüKù›õbñ¸ì çAâ¦Ü×]ÑöËÔÆ$¾qºœ·lµ´<³+³³³Ç´]¶W¸¯ºN½"À)ÃGÆ~ÉÃÌÐWÓ”Ö×ÙÝ2àKãYæXéIì(ïüñ¼ôu÷ú°ü6ÿ³"Û! e —Âçù ÷!Þ#È%§'…)d+:-/ë0Ã2š4u6J8):ÿ;â=¾? AC_E>GIèJ«L^NP€QèRTUÈU5VVôU/UæSROaL“H Dà> 9­2Æ+‹$úYª 'çþø¥ñÈë‘æðáÿÝ¥Úî×ÀÕÔìÒ$ÒÀÑ¥ÑØÑ@ÒßÒªÓ—Ô«ÕÔÖØvÙëÚfÜÞßQáã×䱿è|êiì`î_ðWòYôLö;ø úêû§ý8ÿ©åæ£ ¿ð¦Òÿuý‡ú ÷ óˆîžéSäÖÞ)ÙŒÓÎÇÈìÿȻ¦¸9¶´}³)³q³V´¸µŒ·Ç¹A¼ ¿øÁÅ=ÈËÂÎÒRÕ”ØÍÛøÞâ+å.è(ë îæð¬óeöùªûAþ¸5”ö? † ½ì/@MQNF5!&#%ï&Í(¨*‰,Y.90 2ã3½5‘7p9E;*=?ç@ÁB¦D€F_H,JûK´M^OëP^RœS¶T‚UV‡@fBFD$FÿGÔIŸK_M O¢PRfS{T`UõU8VVUqTËRŽP­MJàEñ@a;65….g'ø[¬ ¹¶úôî”èºãƒßðÛöØ–Ö½Ô]ÓsÒãѲÑÃÑÒ£ÒYÓ?Ô;ÕeÖš×óØUÚÕÛ^ÝüÞ¥à`â$äøåÏç»é¢ëí‘ïñó„õx÷]ù5ûõü™þfXßàD&‹_þ±ûføŸôHðˆëbæõà[ÛµÕ#ÐÈÊÄÅ2Á4½Í¹·µÔ³>³L³ô³(µÑ¶å¸H»ö½ÕÀáÃÇAÊ|ÍÎÐ ÔV׋ÚÁÝäàûãçþéñìÉïœòWõ ø«ú@ýÇÿ<« [ § à =]s…ˆŒ‚t i"J$6&(ó)Í+¥-€/R1.35Ü6µ8:j)@BéCÅE¢GyICK MµNRPËQ"SHT5UÛU/V"V¦UªT'SQFNÙJ½FóA‚üÐþF¾xà  :j‰§µÃ´¦!‘#t%]'5)+î,Æ. 0s2N4"6þ7Ô9²;=n?KA.CEêF¼H’JVL N±O7Q›RÚSÖT UV-VÜUUÇSäQgO:LfHàC°>â8{2 +]$Ý3” Øþþ÷›ñÐëæâÞ¸Úþ×ÔÕ-ÔÓ8ÒÖѺÑëÑUÒðÒ¿Ó¦Ô½ÕãÖ+؆ÙõÚwÜ Þ«ß[áãã䏿—è€êpìfîað\òVôOö8øúåûý,ÿ›ÑÓˆïø™Æv ÿ=ýQúÌöÐòGîaéäšÞùØZÓÞͦÈÐÃ}¿¼»¦¸;¶Œ´Œ³=³Œ³r´Ôµ­·ä¹e¼.¿Â7ÅWȤËÜÎ.ÒmÕ°ØåÛß0âCåGè:ë#îøðÁózö&ùÀûPþÏBªS • Íþ!?P]b^TG!0#%ú&Ý(·*“,m.B02ð3É5ž7|9T;2=?î@ÎB­D‹F`H8JúK¹M^OêPYR™SªTyUþU+VïUEU TMRëOâL3IËDÀ? :È3ü,Ó%V¸‰=RùÖòêì“çÚâÊÞWÛ€Ø;Ö}Ô4ÓbÒáÑÂÑÜÑCÒÎÒ–ÓyÔ…ÕªÖê×@Ù­Ú*ܸÝZßáÁâˆäZæ:èêìîüï÷ñòóéõØ÷ºù‹ûDýÞþT’¢bßõ±îÀúÿ½ýáúƒ÷šó,ïXê!åªßÚmÔêΤɸÄNÀj¼6¹©¶Õ´¶³A³w³<´‹µN·p¹é»œ¾ŠÁ•ÄÃÇûÊ@ΉÑÌÔØFÛuÞ—á©äµç¦ê•íkð:óóõ¢ø>ûÓýSÉ6‹ã % _“¶Öêøûýòè Ó"º$ &}(^*7,.è/¼1˜3i5F79÷:×<®>’@nBOD,FH×I¦KaM O PR^SuTTUæU(VÿUmUNT°RhP†MôI°EÊ@0;5W.B'Ò:“ ©©úôî–èÃãŽßþÛ Ù¦ÖÑÔrÓ‡ÒøÑÇÑÕÑ-ÒµÒkÓPÔMÕsÖ©×ÿØeÚÞÛmÝß³àgâ/äþåØçÀé¨ë¢í•ï’ñŽó…õt÷[ù.ûîüŒþ Ul>Æõ½ûW2þpû4øZôðFë*æºà'ÛƒÕúϡʪÅÁ&½Ê¹·'µâ³P³d³´Eµð¶¹h»¾õÀÿÃ"Ç\ÊœÍçÐ+ÔnשÚ×ÝüàäçêíÞï°òkõø¾úRýØÿP½q ± ö !Rk„’™™“„ u"Z$C& (*Ü+²-Ž/a1;35è6Á8›:w1@BïCÐE¨G}ILKMºNOPÉQSAT+UÌU!V VUTSåPN°J”FÄAXH±C‰>¯8T2v+4$»y üËþï÷žñÈë›æâÞÇÚØçÕCÔÓQÒæÑÐÑþÑhÒÓÏÓ¸ÔËÕóÖ9Ø“ÙÛÜÞ²ßgá"ãêäÀæ¡è„êxìkîbðbòTôOö7øúàû’ý"ÿ¿¾nÔÖtHoÿýú”ö’òî$éßãcÞÄØ0Ӵ͉ȷÃk¿´»¡¸B¶•´ž³P³¥³´òµÏ·ÿ¹‹¼E¿?ÂMÅȸËÏCÒŒÕÆØÿÛ*ßFâ[åYèSë5î ñÖó‹ö8ùÓûaþáTºe ¢ á 3KbiskdT!?#(% 'ì(Ã*£,v.R0&2þ3Ô5­7…9`;<=?ù@ÖB¶DFkH9JL¼M\OìPSR•SŸToUëUVØU+UðS,RÆO½LI¢D’?â9š3Õ,ª%4˜ør2CùØòåìœçäâÖÞhÛ‘ØOÖ’ÔJÓuÒùÑÒÑ÷ÑMÒëÒ ÓÔ“Õ¸Öü×KÙ½Ú4ÜÇÝbßáÈâ“äaæCè#êìîÿïýñïóìõÓ÷¸ù„û<ýÔþB‡ˆP¾ØŠÇ‘Ëÿ‡ý©úM÷VóúîêìärßÝÙ@ÔÂÎÉ¢Ä6Àd¼.¹®¶ß´Ä³W³Œ³Z´¦µn·¹¼¾¾¨Á´ÄâÇË`ΠÑêÔ'Ø_ÛÞ®áÁäÇç¿ê§í€ðJóö´øRûâýdÛDŸò 4 p¢Åéö   õ à"Ê$¬&Ž(j*B, .ò/Í1¢3x5Q7(9;Þ<¾>—@}BRD8FHâI¦KdM OPRVSlTJU×UVêURU6T‹RJP]MÌI‰E›@;á4/.'±{ë›úô î èÈãß ÜÙ¼ÖãÔˆÓœÒÒÙÑìÑ<ÒÊÒ{ÓaÔ]Õ‚Ö¹× ÙqÚìÛtÝ߸àuâ3äæàçÆé°ë¥íšï•ñóƒõu÷Wù'ûèüþÿÿBX(¨Ö™ñÐ'ûý?ûõ÷%ôÒïëîå„àñÚWÕÌσʋŠÁ½Æ¹·1µí³g³v³-´]µ·¹‹»5¾ÁÄ?ÇyʺÍÑHÔ„×ÃÚîÝá(ä3ç,êíóïÂò€õ/øÑúdýéÿaÌ+~ Æ 2_z”¢¦ªŸ• "l$M&2( *è+Â-š/m1K35ú6Ê8¨:‚<_>;@B÷C×E°GƒINKM¸NQPÄQS7T U¾UVõUyUqTèRÄPõMJdFŸA'<6…/…(&!™úc õûYõ2ïªé´ägà»Ü¦Ù0×:ÕÊÓÃÒ,ÒÜÑìÑ*Ò­ÒZÓ1Ô.ÕHÖz×ÊØ,ÚžÛ-ݼÞjàâÝãªå„çeéPë@í8ï/ñ+ó!õ÷øøÌúŽü0þ±ÿ"þ‘ͧ€iþÌûžøäô®ðþëíæ”áÜkÖÜЄËzÆäÁнcº–·ˆµ#´v³m³ÿ³ µ´¶¸¸»®½„ÀˆÃ¢ÆÜÉÍ^Ð¦ÓæÖ"ÚQÝzàŽãŸæ–é‰ìfï8ò÷ô«÷OúæülÿéT· V “ Êñ,:HAB2 #" $ñ%Ò'³)Š+h-=/1ë2Ã4—6s8H:'<>ß?½A›CyESG(IôJ¶LcNP|Q×RTñT¦UÿUV”U¬TG—BD=T7Û0ê)š"tå uXýöeð¶êªå7ánÝ:ڨטÕÔöÒDÒîÑäÑÒ‘Ò9ÓÔþÔÖA׆ØèÙVÛÝÜnÞàÄá…ãOå$çéëêáìÑîÍðÅò¼ô¯ö•øpú2üÝýdÿÁéÓu°3@ÎÕþQü@ù¡õ„ñèìíçœâÝ~×íшÌnǿ“¾»¸ãµ`´Ž³i³Ú³à´d¶M¸›º)½ö¿òÂÆ<Éw̽ÏÓCÖ†Ù±ÜáßõâæéøëÙî«ñrô"÷ÒùaüóþkÞ@™ä % ZЍÈÒãàßÓÂ!®#“%x'Q)3+-ä.¹0Ž2i4;68î9Ç;¥=?`A=CEôFÎH˜J^LN°O4Q’RÊSÅT…UñUV¯UÞTS¡QOðKHŽCU>ˆ8'2K+$’ý[ í¸þë÷™ñÌë¡æâ%Þ×Ú!ØþÕSÔ,ÓcÒüÑæÑÒ{ÒÓÛÓÍÔØÕ×GØ ÙÛÜ$Þ½ßrá*ãö䯿¨èŠêìlîlð]ò[ôIö7øúÛû‰ýÿ«©U³¸Iu=ÿÐüÞùYöTòÒíæè¦ã+Þ”ØÿÒÍeÈ ÃZ¿ª» ¸F¶¡´®³f³¾³¨´¶ï· º©¼l¿WÂrÅšÈ×ËÏ`Ò¦ÕáØÜ@ß`âpåqègëJî"ñçó¡öIùæûqþôdË&q ¸ ì@]pzzsc!N#7%'ø(Õ*­,ˆ.\062 4â5¸7’9l;H=#?AÞB¿D—FrHùÏòêìçðâàÞyÛ¢ØcÖ¥ÔaÓ‰ÒÒéÑÒgÒöÒ·ÓÔ£ÕËÖØ]ÙÈÚAÜÔÝjßáÐâžähæHè-êìîðýñõóçõÔ÷²ùû3ýÉþ3ts5£µf`›ÿOýtú ÷óµîÝé¬ä;ߪÙÔ›Î_É„Ä&ÀW¼+¹³¶è´Ò³m³£³u´Åµ‹·±¹(¼ß¾ÈÁÖÄþÇ6ËzοÑÕCØxÛ¥ÞÇáÖäÞçÖê¹í™ð[óöÅøgûóýyêV²ÿ I }´Öõ !ñ"×$»&œ(x*Q,-.ÿ/Ü1®3…5_729;é<Æ>§@}BdD:FHéI¥KmMO¡PRSSdT;UÍUþUÚU5UTjR%P6M¤IYEs@Ö:¶4.ñ&Šù]Ô‹‘ú ô î¢èÑã«ßÜ.ÙÌÖúÔ›Ó³Ò!ÒïÑþÑTÒÙÒ‘ÓoÔqÕŽÖÉ×Ù}ÚúÛ‚ÝßÊàxâDä æîçÆé¼ë¦í ïšñŒóŠõm÷Wù ûÞüwþíÿ6@‹¶vÇ¢öÿÆýû»÷èó”ïÒê°åKà½Ú$Õ¦Ï]ÊpÅõÀ ½¾¹%·4µ´s³”³B´µ+·D¹«»T¾:Á8ÄfÇ“ÊÛÍÑcÔ¢×ÚÚÞ,áAäHçBê,í ðÓò”õCøâúxýùÿsß;‘ Ó Dm¢±··°£ ‘"x$`&<(*ö+Ï-§/}1S3,57Ù8³:ŒE@(BÿCÞE¹G‡IUKMºNOPÃQS2TU²UúUäU[UYTÅRŸPÒM`Jå?ÉA¥C€E\G,IúJ¸LgNP{QÒRùSìT“UñUíU|UTSQiNKGkB=%7²0½){"ô[Ë cKý–ö`ð»ê­åDáyÝMڷ׬Õ!Ô ÓXÒÒöÑ4Ò£ÒLÓÔ ÕÖM×—ØòÙdÛêÜwÞ"àËá’ãUå0ç é÷êáìÚîÎðÈò»ô¯ö’øjú-üÒýXÿ²Õ½\¢‘ ž¢þüùeõHñªì²çbâãÜN×ÀÑdÌLǪ‚¾ûº¸çµn´ž³³ô³ÿ´¶n¸»ºF½À Ã+ÆVÉ—Ì×ÏÓaÖ™ÙÒÜðßãæé ìíîÁñ„ô8÷áùwüÿïR¨ö 5 l™¸ÖãñðíãÐ!¼#£%‚'e);+-ï.Æ0ž2r4I6!8ú9Õ;­=Ž?gAHC$EúFÖH›JdLN°O2QRÃS¼TvUãUðU—UÆTkSQ÷NÄKéG]C->Z8ý1"+ë#tØH Ö©þæ÷‘ñÐë¦æâ2ÞèÚ4Ø ÖnÔ;Ó|ÒÒ÷Ñ(Ò‹Ò+ÓïÓÜÔéÕ×TØ®ÙÛ™Ü-ÞÊßzá6ãüäÐæ­è’êƒìsîkðcòYôIö4ø ú×û{ýÿkœ’8œ*Eîÿ ü¢ù öò’í®èiãøÝ_ØÒÒjÍEȈÃK¿ž» ¸J¶¬´¿³z³Ø³Á´2¶¸EºÇ¼‰¿~‹żÈóË:ÏzÒÂÕøØ4ÜVßxâ†å…è€ëZî9ñùó³ö^ù÷û†þwÚ9€ É û/Nn~Šˆ„o!_#C%'')ß*¾,”.i0E24ð5Å79v;T=-? AêBÃD¤FsHEJ L¼MaOåPLRˆS‹TWUÏUóU¯UòT¹SèQ€OnLµHKD;?Š9A3…,Y%î\ÀM6ùÈòîì çûâîÞ‡ÛµØuÖºÔvÓœÒ$ÒûÑÒxÒ ÓÆÓ°Ô±ÕÛÖØlÙÓÚQÜÜÝzß%áÜâ¥äqæSè/ê"ìîðÿñôóéõÎ÷±ùvû+ý»þ(`b‡•=x0kÿý;úÔöäòxî¢éqäßtÙåÓnÎAÉhÄÀI¼,¹±¶ô´â³³¾³´ãµ«·Ï¹K¼ü¾êÁôÄÈVË”ÎÞÑÕ]ؓۺÞâáéäùçæêÕí¥ðvó*öÜøuû þ‡ÿeà W ‘Àè&*'"!#ä$Ë&§(ˆ*^,;.0ç1¼3‘5k7?9;ô<Ò>­@ŽBeDFFHëI¯KiM OœPRMSYT3U¸UóU¾UUûSLRÿOMxI1EC@®:ˆ4Û-Ê&eÚ?Áx‡úô î¦èÜã³ß+Ü=ÙáÖ Õ³ÓÄÒ9ÒÒÒhÒêÒ¤ÓÔÕÖÙ×'ÙŽÚÜŒÝ*ßÏà†âJäæòçÑé¾ë®í£ïšñ‘óƒõr÷NùûÕükþâÿ 0÷q•P¡sÉÿŽýÑú÷©ó\ï‘êxåà‰ÚôÔ}Ï8ÊWÅàÀ½¹¹$·Aµ ´‹³©³^´œµK·c¹Ë»u¾WÁ\Ä~ǶÊõÍ7ÑÔ¸×õÚ!ÞBáYä]çXê@íðçò©õSø÷úˆý „ïL¢ ä 'Q€š³¿Éï ¢"…$o&I(+*,Ý-µ/‰1`385 7æ8½:šR@.B DçE½GŽIYKM¼NNPÀQ S(T U¢UëUÍUDU;T¨RyP°M2JFCAÐ;Ä52/1(Þ X½; ßåûCõ6ï«éÇä}àÖÜÊÙQ×gÕîÓôÒNÒÒÒTÒÒÒ|ÓVÔMÕgÖ›×äØIÚ¸ÛCÝÕÞà-âòã»å“çté[ëKíAï5ñ-ó"õ ÷ðøÃú|üþ•ÿãûÏ[Ž_Űþ\û)ømô3ðƒëxæáŸÛÖÐ5ËDÆ´Á¹½Rº·’µB´™³ž³0´\µð¶ø¸Q»í½ÇÀÅÃâÆÊTÍ—ÐÜÓ×Vڃݩà¾ãËæÅé±ì‘ï^ò õÓ÷qú ýÿ wØ. u ¶ ç4I]bd\Q @")$&î'Í)¨+-Y//13Ü4°6‹8`:=<>ñ?ÔAªCŠEbG2IÿJºLhNPwQÌRóSÝT‹UÜUÚUcUuTþRîPDNìJëF>Bì<ù6‡0”)T"Ó=± R<ýö_ð¼ê¶åOá†Ý`ÚÉ×¾Õ9ÔÓoÒÒ ÒGÒ·Ò\Ó+ÔÕ0Ö]×¥ØÚsÛñ܉Þ*àÕáã[å9çéüêèìÞîÐðÉò¿ô¬öøgú"üÌýIÿ¢Ã¦?‡géårmþæûÊø,õñrìrç,â«Ü×–Ñ;Ì3ÇÂw¾ðº¸íµy´²³’³´µŸ¶¸Øºk½7À1ÃFÆzɯÌúÏ7Ó}Ö³ÙèÜà%ã5æ0é"ìïÖñ•ôO÷ñù‰üÿcº G |¨Êãöþüðá!Ë#¯%”'n)N+'-ú.×0¨2€4X6*8 :Ú;¿=‘?xAKC1EÿFÜH¢JdLN¯O0QŠR»S²TjUÑUÝUU©TOS^QÐNžK½G2C>-8Ñ1ø*Ä#Pº/ ¾¢þÔ÷”ñÎë­æ$â@ÞõÚGØ!ÖÔRÓÒ&ÒÒ7Ò¤Ò8ÓÔìÔùÕ#×bØÀÙ#Û®Ü2ÞÚ߃á?ã娿µèšê‡ìyînðeòZôJö1øúÍûvýþþ^Šy$vuý º×þeülùâõÛñXímè3ã½Ý-Ø¥ÒAÍ%ÈnÃ9¿–»¸Q¶µ´Ð³³ð³ß´M¶)¸eºç¼¬¿˜Â±Å×ÈÌTÏšÒÚÕÙIÜqßâåè“ërîKñ ôÉönù ü˜þ‰ìG” Ù B\€Œœ›œ‚!j#U%4')ò*Æ,¦.v0Q2"4ý5Ð7¬9;_=9?AõBÌD©F}HHJ LÀM`OæPGRS†TGUÁUáU•UÜT˜SÇQZOHL‰H D?Y93T,5%È;§4'ùÆòêì§çãûÞ–ÛÆØ‰ÖËÔÓ¯Ò;ÒÒ.ÒÒÓÝÓ¼ÔÅÕèÖ&ØwÙåÚWÜîÝß0áéâ©äæUè:ê&ìî ðòöóéõÌ÷®ùmû'ý­þMLjsL=ÿÞü ú’ö«ò:îeé8äÊÞDÙ²ÓIÎÉQÄÀ@¼(¹¶¶ý´ò³”³Ô³¬´þµÌ·ï¹i¼"¿ÂÅ7ÈuË´ÎóÑ?ÕsØ®ÛÔÞöáå èÿêåí¿ð†óBöíø‰ûþšuÔ# f £Ïø(6:71!#õ$Ø&¸(”*n,F.0ó1É3 5t7Q9#;=Ù>¼@’BtDHF#HïI³KlMO™PRDSTT$U¬UßU©UUßS)RÝOêLLI E@€:^4«-¦&;»!«g{úÿó î§èäã¿ß8ÜOÙóÖÕÇÓØÒOÒÒ*ÒuÒÓ²Ó’Ô‘Õ­Öç×6ÙšÚÜœÝ0ßÞàŽâSä æ÷çÛéÂëµí¥ïžñ’ó…õn÷LùûÌübþÒÿßVt-wF˜ÿZý™úD÷qóï[ê9åÜßSÚÇÔPÏÊ7ÅÏÀó¼´¹(·Gµ´Ÿ³¾³z´¸µk·‚¹ë»–¾xÁyÄ¢ÇÎÊÎPÑÔÓ×Û8Þ\áoätçoêTí6ðùò½õgø û›ý–]³ õ 5c©ÆÍØÓп °"•$y&^(4*,é-Ä/—1n3C57ò8É:¤<€>Y@:BDîEÅG“IZKM¹NQP¸Q STU‘UÛU¸U*U!T„R[P…MJçEA¤;˜5/ (µ 8Ÿ# ÏÔû@õ0ï±éÍä†àçÜ×Ùh×tÕÔÓgÒÒ%ÒfÒæÒÓiÔ[ÕzÖ¥×÷ØRÚÈÛMÝáÞˆà:âøãÆåšç{éaëRíCï:ñ.ó"õ ÷îø¼útüþˆÿÕä»<r:ŸƒîÿÏý$ûñ÷/ôùïFë<ææàeÛÙÕ\ÐË$Æ¡Á«½Jº ·˜µN´­³±³P´sµ·¹o»¾äÀèÃÿÆ6ÊoÍ·ÐôÓ9×kÚŸÝ¿à×ãáæÚéÈì¤ïsò5õà÷Œúý§ÿ‹é> ‡ Å ù#B\hunp] Q"7$&þ'Û)¶+-g/:13ç4½6˜8j:K<>@ÙA¶C‘EiG8IK¾LjNPuQÇRìSÓT}UËUÆUKUZTßRËPNÄJÂFB¾<Ð6Y0m),"²™ =0ý…ö\ð½ê¼åWá–ÝiÚà×ÎÕNÔ2Ó‚Ò.ÒÒ[ÒÊÒoÓ:Ô.Õ>Öm×±ØÚ{ÛÝÞ6àãá¡ãhå>çéëíìàî×ðÉòÁô¨öø\ú#ü»ýCÿ޳Ž'fI¾¿@=þ­û–øîôÐð1ì<çïáxÜéÖkÑÌÇ{Âe¾ìº¸ôµ…´Â³©³(´6µº¶°¸÷ºŒ½VÀPÃeÆ—ÉÏÌÐUÓ˜ÖËÙÝ àCãEæKé4ìïéñ©ôa÷ú›ü)ÿŸsÊ U Œ¸Øõ  ÿð!Ø#À%ž'‚)W+6-/ä0´24a698:ë;Ä=£?yA^C.EGÙH¬JdLN¯O.Q„RµS§T^UÀUÊUiUT0S=Q¬NxK‘G CÒ=8¥1Ò*#. ­‘þÏ÷ŒñÕë®æ2âHÞÛWØ4Ö–ÔdÓ¥Ò9Ò"ÒLÒµÒKÓÔüÔ Ö2×pØÌÙ5Û´ÜDÞßßáGãåàæ¼è êŒì}îrðfò]ôHö-øúÄûnýñþNwc YQÛò¢þ2ü2ùªõŸñí1èúâ‰Ýû×{ÒÍÈWÃ(¿»˜¸W¶À´á³£³ ´ø´m¶H¸ƒº ½È¿¼ÂÌÅ÷È1Ìo϶ÒôÕ0Ùc܇ߦâ´å²è©ë†î^ñ$ôØö„ùü¨þ*•T§ å !KpŒ›­¨­›’!y#`%E' )ÿ*×,®.ˆ0Y2346á7³9;g=C?AûBÖD¯FƒHLJL¿MaOäPBR{SzT=U°UÎUUÁT}S¤Q9OLcHöCá>19ì20, %¦!òÿùÄòéì°çã ß¤ÛØØšÖãÔÓÈÒMÒ%ÒCÒŸÒ/ÓêÓÑÔÒÕùÖ1؇ÙîÚgÜöÝß;áîâ¸ä‚æ`è>ê+ìîðòõóèõË÷§ùkûý£þ ;9æNQö"×ÿ¯üÌù^ölòÿí,éüã˜Þ Ù‰Ó!ÎýÈ9Äì¿<¼¹À¶µ´¦³î³Å´¶é·º‹¼=¿'Â5ÅVÈ“ËÎÎÒUÕŽØÇÛëÞâå!èëûíÑðœóRöùœû+þ­Šá5 v ±á#8DIG<1!#%å&Å(¢*},R.,0þ1Ø3«5‚7Y92; =ç>Â@žByDQF(HóIºKkMO—PR>SJTUœUÌU•UìTÁS R¶OÈL"IàDè?X:,4Œ-u&!— ”Wpúþó î®èìãÊßJÜ]Ù×3ÕÛÓíÒcÒ+Ò:ÒÒ ÓËÓžÔ¤Õ¼Öö×DÙ¦Ú Ü¤Ý?ßåà™â]ä)æÿçãéÇë¸í¬ï ñ“ó†õi÷JùûÁü[þ¿ÿÈ8VPeÿ)ý^ú ÷4óàîêå¢ß Ú˜Ô(ÏöÉÅ»Àç¼²¹*·Pµ.´®³Ù³•´Óµ·Ÿ¹¼´¾˜Á›Ä¼ÇñÊ.ÎrѲÔñ×%ÛRÞsá„ä‹çƒêlíEðóÌõ|øû®ý1§m  CtŸ¹ÓÝçâßÍ ¾"¢$Š&h(E*!,ö-Ò/£1z3Q5%7þ8Ô:°<‰>f@@BDõEÌG™I_KM¿NIP¼QÿRTòT†UÆU¤UUThR3PcMâIÁEé@y;j5ß.ß'– ˆ ÂÅû=õ.ï³é×äà÷ÜæÙ{ׇÕÔÓ~Ò0Ò:ÒyÒùÒ ÓyÔmÕ‡Ö¸×ÙcÚÒÛZÝíÞ“àDâäÎå¡ç‚égëVíIï:ñ3ó õ ÷éøµúpüþÿ¾ÕŸ&Lq]¹ÿ ýêú¹÷õó»ï ëæ¬à4Û¥Õ5ÐòÊÆÁ½Gºž·¢µ[´À³È³g´“µ-·9¹Ž»1¾ÁÄÇTÊ‹ÍÓÐÔP׉ڳÝÜàêãùæîéÝì¹ï‡òFõ÷÷šú.ýµÿ/˜ýN – Ø 6Plw‚‚yr Y"I$)&(å)Ç+œ-s/L13ö4Ë6¡8y:R<.>@æA½C›EkGCIKÂLkNýOsQÃRâSËTlU»U²U1UAT½R¬PöMžJ—FæA”<¢6/0F)"’‚ +!ýöWðÃêÀågážÝ‚Úé×ëÕ\ÔKÓ—Ò@Ò6ÒlÒßÒÓMÔ?ÕMÖ~×¾ØÚŠÛ ÝŸÞ=àñá¦ãwå@ç&éëôìæîØðÎò¾ô©ö‹øZúüµý0ÿƒy J#™’ þvû[ø¶ô‘ðøëþæ¹á@ܼÖ=ÑõËõÆdÂX¾äº¸üµ‘´Õ³¿³B´QµÚ¶Í¸»ª½yÀnÅƵÉêÌ1ÐoÓ±ÖèÙÝ:àXã]æ`éJì-ïúñÀôr÷ú°ü7ÿµ!‡Û' e Åì ù!ì#È%³'ˆ)l+?-/î0Ä2˜4p6E8:ø;Í=­?…AcC;EGâH¯JjLN®O*QƒRªS¢TKU¶U±UUUqTSQ‰NLKnGÙB©=×7y1ª*u# ü ™‚þÇ÷ŠñÓë¸æ7âYÞÛeØMÖ¢ÔÓ¶ÒOÒ5Ò`ÒÇÒ`Ó%Ô ÕÖ=׃ØÕÙEÛ¿ÜOÞêßšáPãåçæÅè¦ê’ì‚îuðiò\ôGö)øúºûgýãþAdNï=-¶ÇcoþüûûømõeñßìøçÀâSÝÉ×NÒôÌéÇ>ÿ„»š¸Z¶Ð´î³»³ ´µˆ¶i¸ º-½æ¿ßÂèÅÉOÌŠÏÒÒ ÖIÙ|ܢ߻âÌåÇè½ëîpñ8ôëö–ù/üºþ8­ n° ú .[‚š¬º¹¹« !‡#q%O'2) +è,¸.—0e2?46ê7Â9˜;s=N?)ACÜD¸F‡HSJLÃM_OãP=RuSpT/U¡U¹UiU¨T]S…QO÷K;HÊC·>9Ã2,ç$…üw ãÿù½òîì°çãßµÛ騝ÖôÔ³ÓÝÒ`Ò9ÒYÒ¯ÒCÓýÓßÔåÕ×@Ø•ÙûÚtÜÞšßBáþâ¹ä‘æaèIê0ìîðòùóäõË÷Ÿùhû ý›þúÿ+!Ï01Ïø«Ôþ{ü”ù#ö3òÂíñèÃãbÞÚØ_ÓøÍÞÈ!ÄÛ¿1¼ ¹¿¶µ´½³´â´8¶ ¸,º«¼]¿HÂRÅwÈ­ËìÎ.ÒnÕªØÝÛß"â3å6è'ëîãð°óföù¬û@þ»4˜ôD ‡ Áñ6DUWUM=!*#%ò&Õ(®*Š,`.602á3¸57c9>;=ï>Í@¨BD\F*HûIºKpMO—PûQ7SBT U‘U¶U‚UÏT§SéQ–OœLI¯DÁ?*:4_-S&ù|îFjúôó î³èôã×ßXÜoÙ×HÕîÓÓvÒ?ÒPÒžÒ%ÓÕÓµÔ°ÕÎÖØRÙµÚ(Ü´ÝGßðà¤âaä5æèìéËëÀí«ï¤ñ“ó…õi÷Cù û¼üJþ¶ÿíò¬ /è#ï5ÿôü)úÔöùò¤îãéÇälßðÙhÔÏÒÉÅ©ÀÛ¼±¹*·]µ8´Å³ï³­´óµ§·Á¹+¼Ö¾µÁºÄÜÇ ËMÎŒÑÌÔ Ø>ÛiÞŒá˜ä¤ç—ê€íZð"óâõŒø/û½ýB¹!€Ñ  R…«Êáíôôéà Æ"·$“&x(R*-,.Ý/°1‰3[527 9á:»<“>p@HB&DüEÑG IbKM¾NJP¶QûRTçTwU¶UŒUýTäSIRP=M¼I•EÀ@L;C5³.»'o õlò ³ºû7õ/ï¶éßäàÝýوנÕ,Ô2Ó‹ÒMÒHÒÒ Ó´Ó‡ÔÕ“ÖÇ×ÙmÚâÛbÝúÞœàLâ äÓå«çˆémë\íHïBñ1ó õ ÷âø´úcüþýlÿ³½Š/÷I3Šÿký¶ú÷¼ó€ïÒêÇåxàþÚzÕ ÐÒÊêÅ|ÁŒ½Gº›·¯µe´Ó³ß³´¯µL·U¹¯»Q¾#Á$Ä>ÇpʪÍêÐ.Ôi×¢ÚÊÝóàÿãçêóìËïœòWõ ø©úCýÄÿ@ª ` ¦ æ E_|…’‰~ j"U$9&(ø)Ð+«-/U1-35Ø6­8„:_<4>@èAÌCœExGBI KÄLkNÿOmQÀRÚS¾TaU©UžUU$T¡RˆPÔMvJmF¾Ae<{60)å!néh ýxöWðÄêÊåoá®ÝÚØøÕvÔZÓ®ÒSÒJÒÒñÒ‘Ó_ÔNÕ]Ö‹×ÎØ*Ú˜ÛݪÞIà÷áµãyåOç(é ëùìêîÚðÎò¿ô¦öŠøRúüªý%ÿr‰bð*okàÿÙýAû"ø|ôVð¾ëÃæ‚á Ü‹ÖÑÓËÕÆQÂG¾Ýº¸¶Ÿ´ä³Õ³Z´nµø¶ë¸8»Ê½–ÀãÆÐÉ ÍIÐŒÓËÖÚ2ÝSàlãwæoédì<ïòÏô‡÷)úÁüKÿÃ7“ï4 x «×ú#-+* "ô#Ý%º'œ)t+N-%/û0Ð2§4z6P8+:<Ú=¶?AjCDEGìH±JoLN¯O)Q{R§S‘TEUU¤U9UZTôRùPcN(K?G´By=®7O1€*Q#ì`ä †tþ¿÷‡ñÕë½æCâeÞ&ÛxØ^Ö¹Ô“ÓÊÒcÒKÒqÒÜÒpÓ6ÔÕ(ÖP׎ØçÙLÛÏÜWÞúß á\ã åðæÉè®ê–ì‡îxðjò]ôFö&øûùµû[ýØþ1R8Õ Ž¡0BþÄûÃø7õ%ñ©ìºç‹âÝœ×ÒÓÌÇÇ*ÿ»—¸a¶Ø´´Ì³=´/µ¥¶Š¸½ºM½Àù Æ1Ék̪ÏéÒ+ÖdÙܽßÐâáåßèÏë´î‚ñNôüöªù>üÎþJ½yÆ  ?lª½ÇÊÆ¼­!•#%]'?)+ñ,Ì.ž0v2J46ø7Ë9§;{=\?.ACäD¾FŽHWJLÆM_OáP8RpSbT(UU¨UTUŠTAScQîNÐKHCŠ>Ú8”2Þ+Á$]äTýÐÿ ùºòìì¸çã"ßÂÛüØÁÖÕÈÓòÒsÒPÒhÒÅÒUÓ ÔôÔòÕ×RØŸÙ Û€Ü Þ¦ßMáãÅä–æjèOê6ì"îðòûóäõÈ÷žù[û ýŠþðÿ ·©Ð|¦þDü^ùèõøñ‡í¶èŠã,Þ©Ø/ÓÔÍ¼È ÄË¿&¼¹Ä¶µ"´Ð³´û´V¶(¸MºÊ¼~¿gÂoÅ™ÈÈË ÏIÒŠÕÂØ÷Ûß:âJåJè?ë%îùðÁó{ö#ùÁûNþÐB«S ™ Ð&AWaib[M!7#!%'á(¿*•,o.D02î3Æ5—7t9E;#=ú>×@®BŒD`F3HÿI¾KqMO•P÷Q2S7TUU¨UfU¼T…SËQqOvL×H…D–?ý9Ú35-+&Ö\Ój7\úñó î³èäàßhÜ€Ù,×[ÕÔÓŒÒQÒfÒ®Ò;ÓåÓÉÔ¼ÕàÖØaÙÀÚ7ܾÝRßýàªâpä6æèíéÕëÃí®ïªñ‘ó‡õf÷?ùû±üAþ§ÿÝÝ•¿þÀÿÀüóù˜öÃòcî­é‰ä9ߺÙ<ÔÚδÉêÄ—ÀѼª¹1·bµJ´Ø³´Ê´¶Å·á¹J¼÷¾ÔÁÛÄöÇ.ËeΫÑåÔ'ØUÛ…Þžá´ä¶ç­ê–ílð;óðõ¦ø:û×ýOÍ2å $ g¿Ùðýûë Ú"¿$©&(f*7,.é/½1—3f5@79í:Ã<¡>u@WB+DF×G¥IfKM½NJP³QôR TÙTlU U}UßTËS'RðOM–IiE”@";5.'O ÒQÜ Ÿ°û/õ.ï¹éçä§àÝ ÚŸ×¯ÕEÔCÓ¢Ò_Ò\Ò£ÒÓÆÓšÔÕ§ÖÒ× ÙxÚïÛoÝߦàUâäÝå±çérëaíMïCñ2ó õ ÷àø­ú[üóý^ÿ£©qïÓ'`ÿ3ýƒúE÷‚óDï—êåBàÉÚLÕáÏ­ÊÒÅeÁ‚½?ºž·¶µs´ç³ô³œ´Éµl·t¹Î»q¾AÁEÄ]Ç‹ÊÉÍÑJÔ„×ºÚæÝáä!çêíâï®òlõø½úSýØÿP½q · ö 'Rq‡šžŸ›ˆ ~"_$J&&(*Ý+¹-Œ/d1;3 5é6³8•:e@õAÒC¥E€GFIKÆLlNþOlQ·RÔS²TSUšU†UUTRhP«MOJBF”A8ôðëæFáÝÛWÖîЪ˽Æ9Â;¾×º¸ ¶¨´ú³è³u´‹µ· ¹W»é½ºÀ©ÃÆÆìÉ(ÍfЦÓåÖÚKÝjà„ãŒæ‡éwìRï&òãô›÷8úØüUÿÜ@«úJ ƒ Àä "0>99) "$é%Ë'§)ƒ+]-1/ 1Ü2³4†6]85: <æ=¾?šArCMEGðH¶JpLN¬O'QvRžSŠT5UUU"UATÒRÛPUoT%SCQÊN¬KæGuC`>­8n2²+$>ÁCáÇÿù·òíì»ç(ã+ßÕÛ ÙÔÖÕÜÓÓ‰ÒcÒ|ÒÙÒdÓ ÔÕÖ!×`Ø®ÙÛÜÞ¯ßZá ãÐäœærèUê;ì(îð òûóáõÉ÷”ù[ûùü…þÛÿõžõPuþü(ù­õÀñIí~èRãõÝ|Øÿұ͛Èñû¿¼¹Ê¶$µ4´ã³6´µv¶C¸oºè¼¿†ÂŲÈéË!ÏhÒ¡ÕÝØÜ4ßRâ`å`èVë6îñÕóŒö9ùÐûcþÞW¸b © à4TbtruiZ!G#,%'ð(Ê*¥,z.R0&2û3Ð5§7{9U;+=?à@¸B“DgF:HJÂKtMO“PôQ*S1TòTtUUVUTmS§QPOOL®H]Dh?Ô9¯3-&´;ºX#Vúéó î¼èäñßrÜ•Ù:×qÕÔ/ÓžÒiÒuÒÅÒKÓùÓÖÔÐÕêÖ"ØkÙÐÚBÜÉÝ_ßá¶âxä?æèòéÜëÄí·ï¨ñ”ó†õa÷>ùýú«ü3þšÿÌÈ|çðŸÓ•ÕþŒü¼ùböƒò.înéUä߉ÙԲΕÉÏćÀļª¹0·oµU´í³´å´)¶æ·þ¹j¼¿ñÁüÄÈJ˃ÎÄÑÕ>ØnÛÞµáÌäÉçÄê©íðLóö³øSûáýeÜC¡ò 8 s¥Éêÿ  ú ç"Ð$±&’(o*F,#.ò/Ð1›3y5G7#9ó:Ó<¥>ƒ@]B3D FÝG©IkKMÀNFP°QîRÿSÏT\UUgUÅT±SRÏOïLmIAEj@ö:í4^.q'$ »0Ë ‹©û&õ.ï¾éìä´à ÝÚ±×ÅÕTÔ\Ó´ÒtÒoÒ¶Ò-Ó×ÓªÔžÕ´Öâ×+ÙˆÚùÛ}Ýß±àbâäèå¸ç–éxëgíPïGñ1ó"õ÷ßø¥úTüèýRÿ‘–YÓò®Õ0ÿýLú ÷Ió ï]êUå à—Ú Õ¹ÏʸÅQÁw½:º£·ºµˆ´ò³´´´æµ‰·”¹ì»¾dÁ`Ä|ǪÊáÍ'Ñ]Ô£×ÍÚÞá4ä5ç2êí÷ï¿òƒõ,øÓúaýêÿaÍ,€ È 8b𤰬§š ˆ"q$T&6(*í+Ã-œ/o1F35î6Æ8š:t&@þAÙC®EƒGNIKÈLoNûOiQ´RÈS­T?UUpUíTíS`RIP„M+JFhA<$6°/Ò(˜!1­> ôþüköPðÍêÔåƒáËÝ­Ú%Ø֜ԆÓÔÒÒkÒ«ÒÓ¸ÓÔmÕÖ¥×ëØDÚ°Û0Ý¿Þ^à âÇãŠå[ç9éëíòîßðÒò¿ô¥öøMúûûšý ÿSc4»ìÀ!…ÿsý×ú³÷ ôàïLëNæá£Û0ֿЋˠÆ$Â0¾Ïº¸¶·´ ´´Œ´¦µ2·(¹x»¾×ÀÉÃâÆ ÊCÍ‚ÐÀÓ×2ÚdÝàãžæ¢é…ìlï4òúô©÷OúâünÿæV¶ U ˜ Ëô-CHKF7 +"$û%Õ'¸)Ž+k-=/1è2¿4“6i8>:<ì=Ì? A|CSE'GôH¼JqLN¬O#QsR•ST%UUxUU!T¸R¸PNÛJíF]B&=V7ü0/*#¨'² cUþ´÷|ñÝëÆæWâ€ÞEÛžØÖåÔ¸ÓõÒŽÒmÒ ÒûÒ—ÓXÔ>ÕJÖj×­ØÚhÛæÜlÞàµáoã/åçÖè½êžìîðmò_ôCö!øïù©ûDýÃþ/ £âÊAMÔÿßý\ûRøÅô±ð2ìHçâ²Ü=×ÊщÌÇúÂì¾l»˜¸m¶ï´$´ø³l´iµÞ¶Æ¸ÿº‰½HÀ7ÃGÆoÉ£ÌáÏ"Ó\Ö—ÙÂÜéßã æéýëØî®ñpô%÷ÌùeüðþlàA™å ) \¬ÉÝâëáÚÉ!²#š%{'Y)4+ -ä.º02c4768â9¼;“=l?FACøDÉFœH`JLÉM`OÙP2R_SST UtU}U)UXTS&Q£NˆK¼GKC5>€8E2Š+t$ ž,̸ÿ÷ø³òëìÆç(ã@ßÚÛ"ÙâÖ1ÕðÓÓŸÒsÒ“ÒèÒxÓ1ÔÕÖ4×iØÁÙÛœÜ Þ½ß`áãÕ䍿wè]ê@ì,îð òüóáõÆ÷‘ùRûõütþÑÿöÞ†ØÐa|$Aþâûëø|õñíAèãÂÝGØÚ҇̀È×뿼¹Ñ¶+µF´õ³P´.µ”¶_¸º½¼¿¦Â­ÅÑÈÌBÏ~ÒÀÕõØ'ÜMßhâvåwègëNîñêóŸöHùçûpþôcÎ#x µ ò!Beq…yj!Q#?%')Õ*¶,….b022 4Ý5±7Š9];9=?ê@ÂBšDoF?HJÆKuMO’PîQ'S%TéTbU€U?U…TOS‡Q-O)L†H3D=?©9…3á,à%£;Húãó î»èäøß„Ü ÙR×Õ.Ô<Ó¸ÒxÒ‹ÒØÒYÓÔáÔåÕ÷Ö1ØzÙÙÚQÜÔÝkßá¿â€äHæèûéÞëÎí¶ï­ñ–ó‚õc÷8ùøú¢ü)þŒÿ»´dÊÒy«l¡þ\üù-öHòõí3éäËÞYÙâÓÎtɶÄtÀ»¼¥¹6·vµg´ý³5´ÿ´D¶¸ºŠ¼4¿ÂÅ5ÈgË ÎÞÑÕVØŠÛ²ÞÎáàäáçØê¾í•ð`óöÇøcûöýsòMºü L ´Ü÷#!ø"Û$À&¡(z*Y,+.0×1®35Y7)9;Ø<µ>Š@hB9DFàG²IlK#M¾NHPªQëRôSÅTLUUOU±TSìQ§OÍLEIEA@Ê:¿4<.A' ’¯ }™û"õ*ïÃéðäÂà(Ý0Ú»×ÜÕgÔlÓÏÒ€ÒˆÒÆÒ@ÓéÓ»Ô­ÕÅÖñ×9Ù–Ú܆Ýߺàjâ&äîåÀçŸé|ëmíSïKñ2ó%õ÷Þø›úQüØýHÿ~„A·ÒŠÚ¨ÿÐüúÕöóÍî%êåØßbÚõÔŒÏpÊšÅ>Áo½0º¨·Ãµ’´ ´#´Ï´¶§·±¹¼®¾ƒÁĘÇÉÊþÍ?Ñ~Ôµ×íÚÞ6áHäMçEê/íð×ò‘õDøáúvýüÿqà< Ù Ip¨³¾»¶¨ —"}$e&B(!*ú+Ð-ª/}1P3*5ö6Ô8¤:€/@BáC·E‰GVIKÎLmNüOfQ¬RÃSŸT5UzU[UÖTÑSAR(P_MJñE;Aé;õ5Œ/¤(y! •# äñü`öSðËêÞåŽáÖÝÀÚ1Ø5Ö¬ÔœÓçÒ“ÒÒºÒ(ÓÅÓ’Ô~Ռַ×÷ØQÚ¾Û9ÝÌÞhàâÏã’åfç<é!ëí÷îâðÕò½ô¥özøGúõûýýþBPŸÑ˜ÿéUÿDýŸú~÷Íó§ïëæÞàsÛþÕšÐfË…ÆÂ¾Íº¸¶Ç´´´£´ÄµM·J¹”»)¾õÀéÃÿÆ)ÊaÍœÐÜÓ×KÚ}Ý•à´ã¶æ±é¢ìwïOò õ¼÷dúóü€ÿøfÉ g ¦ Û'>PYXUG 7"$&å'Ã)Ÿ+u-M/!1÷2Ê4 6s8M:<ý=Ñ?¬A„CYE.GúH½JwLN®O QmRŽSwTUpUfUöT T›R“PùM°JÊF/Bü<,7Ð0 *á"‡ ˜ QJþ¨÷}ñÜëÎæcâŠÞVۯؑÖúÔÊÓ ÓžÒ…Ò¯ÒÓ¨ÓiÔNÕYÖz×¹ØÚtÛïÜÞàÂávã9å çßè¿ê¦ì’îðpò^ôAö øèù¢û<ýµþô‰Ç¥ ©ÿ¬ý*ûøŠôzðôëçâáÜ×ÑhÌnÇéÂÙ¾j»“¸t¶û´4´´„´‚µý¶ã¸»§½iÀTÃhƈÉÂÌüÏ;ÓzÖ«ÙÞÜÿßã#æé ìïîÁñƒô9÷Þùvüÿ|ðQ©ø 5 p™¾Øéöõòç×!Á#¨%‡'i)A+-ñ.Ç0›2p4D68ñ9Å;=w?NA)CüDÔFžHhJLÌM\OÝP(RZSITüTeUiUUY82f+N$ü„»¦ÿñø¬òñìÅç9ãEßñÛ-ÙùÖBÕÔ)Ó¶Ò…Ò¦ÒûÒŒÓ>Ô&Õ ÖC×|ØÈÙ1Û¢Ü/ÞÇßjá#ãÞä­æƒè^êIì-î#ð òüóãõ½÷“ùGûíüiþÀÿãÌj¾«<Uóÿþ§ûºø>õGñÚìèåâŒÝجÒdÍaȿÿ ¼¹Ô¶8µS´ ´f´Kµ®¶€¸®º'½Ü¿ÄÂÌÅðÈ!Ì\ÏÒÕÕÙ:ÜkßzâåŠèëaî6ñùó´ö\ùöû†þuß1Š Ä ,Vm†”‘„x!c#I%+' )ä*Â,“.n0=24ç5¾7”9i;B=?ð@ÍB¡DwFDHJÈKxMO‘PçQ#STßTOUpU%UoT.SlQOLYH D?~9[3º,¸%pü‰( <úâó îÃèäà‘ܳÙbוÕ?ÔTÓÈÒÒžÒëÒmÓÔöÔñÕ ×;ØŠÙæÚ]ÜßÝvßáÊâ‰äOæ(èþéçëÎí¾ïªñ›ó€õa÷5ùïúšüþ}ÿ©ŸI¯°T…9wþ#üPùîõò¹íùèåã–Þ%Ù¸ÓdÎVÉÄcÀ°¼¢¹:·µv´´L´µd¶!¸=º¨¼V¿1Â7ÅQȅ˺ÎþÑ6ÕrØ¢ÛÉÞçáõäùçëêÓí©ðsó,öÙøuûþ‡þfÀ U –Àì)//$!#ë$Ï&¬(‹*b,;.0å1º35c779;ä<¾>•@nBGDFïG¯ItK#M¾NGP¥QçRçS½T:UoU:U–TuSÉQˆO¤LIìD@ :–4.'áwü kûõ+ïÇéùäÏà5ÝAÚÐ×ìÕÔÓáÒ—ÒšÒÙÒUÓøÓÌÔ¿ÕÑÖØGÙ£ÚÜ“Ý$ßÇàtâ/äöåÈç£é„ëpíWïMñ3ó$õýöÙø—úEüÑý7ÿnn*œ°j«‚Îþžüßù›öØòîìéáä ß5ÚÁÔkÏLÊ€Å.Á^½1º§·Íµ ´´<´è´¶Æ·Ð¹-¼Ñ¾Á¤Ä´ÇçÊÎ[Ñ—ÔÏ×Û)ÞPá\ädçYêDíðìò¤õUøôú‡ý ƒðL  é $X~¡µÅÊ̺ ¡"$o&P(.*,ß-µ/‹1\3557à8¯:Œ<]>;@BéC¿EGXIKÍLoNúO`Q©R·S–T$UhUGU½TµS$RP>MÖIÊEA»;Î5^/(Q!îw Óäü\öPðÍêçå—áçÝÏÚDØHÖÂÔ¯ÓüÒ§Ò–ÒÍÒ;Ó×Ó¤ÔÕžÖÃ×Ù_ÚÇÛKÝÒÞvàâÚã™ånçBé'ë íøîåðÖò½ô¢öwøAúíû„ýïþ1<…¯xÖ¼'ÿýmúA÷™ógïØêÝå¥àEÛËÕrÐDËgÆÂ¾Èº¸¶Ó´+´0´»´áµj·j¹³»J¾Á ÄÇHÊzͼÐôÓ5×dڑݳàÅãÎæÉé²ìï`òõÐ÷túý‘ÿ vÙ- w ¶ ê6P]igbW D"/$&õ'Î)®+€-\/,13Ô4­6€8T:/<>Ý?´ACaE5GIÂJzLN®OQiR…SmT U_USUÜTðSyRsPÒM‹JFBÐ<þ6­0Ü)Â"bï„ 9Aþ›÷ñÙëÙægâœÞbÛÁØ¦Ö ÕàÓ Ó±Ò›ÒÁÒ#ÓºÓyÔ`ÕhÖ‰×ÇØÚÛýÜ…Þ#àÉáãBåçæèÇê«ì—î†ðoò`ô>öøæù—û4ý§þòÿßm¨…öö}ÿvý÷úá÷Rô>ð½ëÖæ®áJÜÞÖwÑ@ÌVÇÎÂо^»™¸u¶ µB´&´œ´µ·¹@»Å½‰ÀsÃ…Æ©ÉÜÌÐVÓ’ÖÇÙôÜà0ã6æ6é#ìïÖñ”ôN÷îùŠüÿ`¼ E €§Ðåúÿ÷å!Î#¶%•'u)N+)-ú.×0¦2|4R6!8þ9Î;¨=‚?UA2CEÔFªHfJ&LÉM`OÒP+RMSATïTPU[UöT'TÆRäP\N:KlG÷BÞ=/8î1=++$Ùjö ©šÿèøªòòìÌçCãQßÜ?Ù ×XÕÔAÓÈÒšÒ¹ÒÓšÓSÔ3Õ1ÖR׊ØÕÙ>Û®Ü;ÞÏßvá*ãçä¶æ‡èhêJì5î!ðòùóäõ¸÷ùBûâü\þ²ÿÏ·PŸŠ(Èÿâýuû€ø õ ñ¡ìÏç«â[Ýé×ÒDÍ?ȭË¿¼¹Ù¶Gµa´#´}´gµÌ¶ž¸ÌºE½ÿ¿àÂíÅ É?ÌvϸÒðÕ*ÙVÜ|ß•â¢å¡è’ëuîIñôÅöoùü—þ‡îD– × ?a‚Ÿ¡œ˜‚!s#U%:')õ*Ë,£.w0L2 4ô5É7ž9t;K=#?ú@ÕB§DFFHJÈK|M OŽPãQSTÓT=U_UUUTSJQäNâK2HãCæ>U913“,–%Kämú6úßó îËèäàÜÉÙsתÕTÔhÓßÒ¡Ò²ÒýÒÓ1ÔÕÖ×PØ‘ÙúÚdÜïÝ~ß$áÒâ‘äYæ+èêëëÒíÂïªñœó~õ_÷.ùéú‘üþpÿ•‹0’Ž1X@þôûù¹õÕñ~íÀè®ãbÞõØ‹Ó@Î4ÉŠÄNÀ«¼¹@·Šµ…´'´b´5µ~¶A¸\ºÇ¼u¿PÂUÅqÈŸËÚÎÒUՈػÛáÞüá å èëåí¾ð„ó@öêø‰ûþš wÑ$ g £Óø+:=>1(!#ü$Ù&¿(“*s,E.0ñ1Å3˜5p7@9;ë<Ê>@wBODFòG¶IvK$MÀNBP¤QÜRãS­T.UYU&UzT\S¨QeOLöHÃDé?x:j4ê-ø&½[⊠\ƒûõ'ïÏéåÛàFÝQÚã×Ö“Ô”ÓöÒ­Ò«ÒòÒaÓÔÚÔÐÕàÖØTÙ±ÚÜ¡Ý-ßÓà|â8äæÍç©éëoíaïJñ5ó#õûöÔøú<üÄý+ÿZ[~“B…Užþkü§ùeö˜ò^î«é­ägßÚ”ÔFÏ&ÊmÅÁY½)º­·Ôµ²´.´R´µ:¶æ·ì¹P¼é¾ÆÁºÄØÇË9ÎuѲÔê× ÛAÞgárä{çmêYí/ðÿò¶õhøû—ý“_¯ ú 2h®ÅÔØÛÐÇ ±"›$}&^(;*,ë-Ã/•1i3A57ë8º:”@@BïCÆE–G\I KÎLpN÷O_QŸR²S†TURU5U¡TšSRÝOM®IžEè@Ž;¥55/Y(1!Ì_ö ÃÚüUöPðÒêïå£áöÝÞÚYØ[ÖÕÔÆÓÓ¹Ò­ÒßÒNÓëÓ²ÔŸÕ­ÖÔ×ÙnÚÓÛTÝâÞ|à*ââã¢åtçLé(ëíùîëðÔò¾ô ötø9úèûuýåþ)íjW©–ôþÜü5ú ÷\ó/ïœê¢åsà Û¢ÕIÐËRÆäÁ ¾¿º¸)¶Ý´B´A´Ü´÷µŒ·‡¹Ó»l¾1Á*Ä;ÇdÊšÍÓÐÔK×ÚªÝÊàÝãåæÛéÊì¢ïtò1õã÷…úý¡ÿ†ë< ‰ Å ú&D`mvxog Q"?$&(Ý)¹+‘-e/<13ã4¸6Š8c:5<>ç?½A”CiE:GIÆJ{LN«OQbR|SaTüTNU?UÂTÔS[RQP¬MdJqFÞA£<Õ6€0·)ž"AÖh -0þš÷wñáëÜæuâªÞp󯯵Ö#ÕôÓ3ÓÊÒ¬ÒÕÒ8ÓÉÓŽÔnÕyÖ˜×ÖØ'ÚÛÝ”Þ*àÕá‰ãJåçëèÍê±ì™îˆðrò^ô>öøÞù’û&ý›þàÿõÅSˆbÑÈNÿBýÂú©÷ôðëŸætáܯÖKÑ Ì6ǽ¾¾[»—¸¶µV´9´¸´¹µ;·¹`»æ½¦À–Ã£ÆÆÉüÌ2ÐtÓ¬ÖßÙÝ*àIãLæLé7ìïçñ«ô]÷úšü&ÿžpÍ V ŽºÛø ô!Ý#Ã%¥')^+4- /á0³2ˆ4^6-8:Ø;µ=‡?eA4CEÝF¬HnJ$LÏMYOÖPRIS5TâTAUEUàT T¨RÃP6NKAGËB¶=þ7È1+$·LÞ –Šÿâø¦òôìÒçMã_ßÜOÙ"×iÕ/ÔVÓÝÒ°ÒÍÒ!Ó°ÓdÔDÕBÖaוØèÙEÛÁÜAÞÞß~á4ãò仿‘èkêQì8î'ðòþóÝõ¹÷…ù;ûÖüSþžÿ¿8~kì˜ÿ°ý>ûLøÊôÕðaì”çwâ ݼ×SÒÍ$È“Ã~¿ù»¹Ý¶Rµt´7´—´µê¶¼¸íºe½Àà Æ+É\Ì“ÏÓÒ ÖAÙsÜß±â¶å¸è¨ë‡î`ñôÜö}ùü¦þ'–T§ è Qo’Ÿ¯¯¬¤”!~#g%D'))ü*Ý,­.‡0Y2,46Ó7¬9~;Y=)? AÖB·DFQHJÍK|MO‰PãQ S TÀT5UCUÿT4TøR'Q¾N»KHµC½>'93k,l%*ÃRê+úÚó îÍè+äà±ÜÖو׼ÕiÔ}ÓôÒµÒÈÒÓ•Ó?ÔÕÖ&×^ØŸÙÛrÜ÷Ýß*áßâ˜äbæ1èêíëÚíÂï¯ñšóõX÷,ùàú‰üþaÿ‚tqr1ãÿþÁûÜø‚õ—ñFíƒèvã+ÞÄØ^ÓÎÉnÄAÀ¼ž¹@·˜µ’´>´z´Oµ¶_¸{ºé¼“¿rÂrÅȼËöÎ0ÒnÕ£ØÓÛúÞâ$å!èëùíÔð—óTöýøšû)þ«‡ã3 x ³ã &;IKLA7!# %æ&Ë(¦*|,W.(0ÿ1Ò3¦5z7N9#;û<Ñ>§@€BTD)FöG¼IyK'M¿NAPžQÖRÛS T UFUUbT?S†QCOWLÎH–DÁ?G:C4¾-Î&Ÿ4Ío Nxûõ(ïÑé åæàUÝ_Úú×Ö¬Ô¦Ó ÓÁÒÁÒÓyÓÔîÔàÕñÖØaÙ¾Ú+Ü«Ý<ßÙàˆâBäæÚç®é‘ëvíbïMñ9óõýöÌøú1ü»ýÿLCú`q\'nþ4ürù*öbòîxélä6ßÍÙgÔÏÊQÅÁL½'º­·àµ¼´C´i´µZ¶ÿ·ºl¼¿ãÁÜÄôÇ#ËSΕÑÊÔØ5Û_ÞzáŒäç„êníEðóÍõyøû«ý-ªr¿  Exž¿ÓãêçãÑ Ä"§$Ž&k(J*!,û-Ì/¥1v3K5!7ï8Í:™J@$B÷CÐE˜GiIKÔLpNôO_Q—R¬SzT UDUU‹T{SåQ»OôL…IwE·@g;t5//( !©CÜ ´ÉüQöJð×êóå®áÞïÚkØmÖëÔØÓ(ÓÌÒÃÒïÒdÓúÓÆÔ°Õ¹Öæ× Ù{ÚâÛ_ÝíÞ‡à3âëã«å~çNé5ëíïëð×ò¾ôörø2úàûkýÔþ×No2ƒgÆþ©üþùÓöóôî`êjå:àØÚtÕÐË.Æ×Áú½ºº¸/¶ë´U´W´ö´¶¬·£¹÷»‡¾VÁFÄ\ǂʶÍóÐ+ÔgטÚÃÝáàöãûæòéÞì¸ï‡òFõö÷—ú-ý±ÿ0—ýL š Õ 4Vl}‡„s `"N$-&(ì)Ä+ -t/G13ì4È6–8o:?<>í?ÊAšCtE>GIÆJ€LN«OQ\RvSTTñT;U*U®T¶S=R-P‰M:JJF°Ax<©6U0)v" ¹N "þ÷uñâëãæ~â´Þ…ÛáØÐÖ1Õ ÔGÓÜÒÂÒèÒJÓÞӜԃՅ֫×âØ8Ú›ÛÝ Þ5ààá’ãSå!çóèÔê´ì îŠðtò_ô<öøØù‹ûýþÏÿâ­:h?¨¡ÿýŠúq÷ßóÆïFëdæ;áãÛÖ ÑüËǥ³¾P»˜¸…¶!µi´P´Î´×µV·@¹~»¾ÆÀµÃÁÆæÉÍQÐŽÓÆÖüÙ%ÝHà\ãgæaéNì+ïþñ»ôt÷ú¯ü5ÿ´!†Ü' g  Èí#! ÿ!ð#Î%³'‘)i+D-/î0¿2˜4e6@8:é;¼=”?kAACEæF²HqJ,LÊMaOÎPRAS)TØT.U2UÉTîSŒR PNìJG¡Bˆ=Ô7›1é*Þ#”,à zÿ×ø¡òôìÖçUãkßÜcÙ/ׂÕ>ÔnÓìÒÈÒÞÒ6ÓÁÓuÔUÕTÖnרØñÙWÛÈÜSÞâߎá<ãûäÅæ–èrêYì;î+ðòþóÝõ¸÷€ù3ûÎüDþ’ÿ«‡`JÇÙhÿ€ý ûø–ô”ð,ìVç@âëÜ‹×(ÒöÌÈ|Ãl¿ò»¹ä¶[µ…´K´¯´žµ·Þ¸ »‡½<À"Ã*ÆGÉ|̯ÏïÒ'Ö[ÙܪßÇâÐåÌè¿ëœîrñ6ôìö“ù/ü¶þ<¦f· ø /_ƒ³¹Âº´Ÿ!‘#n%Z'0)+ç,¼.“0e2;4 6ã7²9Ž;]=;? AèB·DŠFWHJÕKzMO‡PßQSÿS¸TU9UàT TØRQ›N“KßGŒC‘>û8Ü2A,D% =éÝú×óîÔè1ä(àÁÜãÙ×ÎÕ|Ô“ÓÓËÒÚÒ#Ó¥ÓQÔ)ÕÖ:×fØ´Ù ÛƒÜÞ˜ß6áçâ¢äjæ:èê÷ëÚíÈï³ñ™ó€õX÷$ùÞú{üûýOÿu\VNã ´ÿâýˆû©øFõ_ñ íHè?ãöÝ‘Ø5ÓóÍ÷ÈUÄ1À’¼¹D·¡µ¤´O´”´hµ»¶|¸›º½´¿’ÂŰÈÙËÏJÒ‹ÕºØñÛß.â8å:è,ëîãð±ócöù­û;þ½2–÷B ‹ Áô5MS`WSA!.#%ø&Ö(³*Š,c.70 2à3²5†7Y90;=Û>±@‰B\D1FúGÂI}K&MÃN;PQÎRÐS•TU7UöTMTSmQO7L HnD“?:4”-¨&y­] 8pû õ&ïÕéåñàaÝtÚØ)Ö¹Ô¾ÓÓÖÒÒÒÓ†Ó3ÔýÔðÕ×,ØpÙÌÚ6ܹÝDßçàâLä æâç³é˜ëzífïPñ9óõùöÊø†ú)ü°ý ÿ>+åBU÷7øÿBþÿû?ùñõ&òæí8é<äüÞžÙ=ÔòÎêÉ4ÅôÀC½!º´·åµÍ´W´´8µt¶¸0ºŒ¼-¿ÂýÄÈAËoίÑçÔØQÛtÞ”á¡ä¤çœê€íYð&óÜõ‘ø)û¿ý>» Ò  V…¯Ëçîûôóß Ò"´$&w(Y*,,.Û/±1ƒ3W5+7ý8Õ:¦<>U@,BDÒE¢GiI$KÕLpNóO[QR¤SmTûT2U UrTaSÅQ˜OÏL]IMEŒ@=;I5æ.(æ !Í œÁüIöJðØêüå¶áÞýÚ~Ø€ÖÕêÓ>ÓàÒÕÒÓrÓÔÕÔÀÕÌÖï×3Ù„ÚñÛkÝøÞ‘à>âðã¸åçYé7ëíïìðÚò»ôökø.úÖû`ýÉþüÿ½5MZ>–þwüÈù›öçò¼î%ê4åà©ÚEÕ÷ÏÞÊÆÀÁñ½µº ¸:¶õ´l´i´µ-¶É·Å¹¼¨¾sÁgÄyÇ ÊÓÍ ÑIÔ€×°ÚÝÝöà äçêóìÌï›òWõ ø¨úAýÂÿA§ ^ © å Ed}Œ“•‚ q"W$>&(ú)Ô+©-„/R1+3û4Ï6¤8v:Oû?ÏA¥CxEGGIÎJ€L N¨OQURnSJTâT+UU—T™S!R PfMJ$F…AO<€6*0k)O"™; þ‹÷qñäëêæ‡âÁÞ–ÛñØåÖCÕ!ÔZÓñÒÕÒúÒ]ÓîÓ®Ô“Õ”Ö¹×ñØCÚ¨Û Ý©ÞAàèáœã\å'çûè×ê¼ì£î‹ðwò]ô;öøÕùûý|þÃÿÍ™J…sòþßüVú<÷£óï ë.æáµÛKÖþÐÕËÿƑ¤¾L»—¸¶,µz´f´æ´ôµs·\¹¡»"¾êÀÒÃàÆÊ2ÍoЦÓãÖÚ=Ýbàpã~æuébì@ïòÐô†÷'ú¿üIÿÁ8ð4 y «Ûû&/1,! "ú#ß%À')x+P-%/ú0Î2¡4u6F8:î;É=?sAJCEíFµHxJ*LÏM]OËPR7S!TÈTUU´TÑSrR{PñMÂJðFxB\=¬7o1Ã*º#t ° isÿÉø¢òòìÞç_ãwß/ÜrÙFבÕXÔ~ÓÓÚÒñÒKÓÎÓÔ`ÕgÖ{×·ØýÙgÛÑÜ`Þîß—áEãåÍæœè|êWìEî*ðòþóÙõ·÷vù2û¿ü<þ€ÿ™rG$¦«=ÿNýÖúÚ÷[ô\ðïë!çâ½ÜV×ÒÎÌëÇeÃ]¿í»¹î¶eµ—´^´Ê´¶µ%·ù¸,»¦½[ÀCÃFÆhÉ–ÌÍÏ Ó@ÖxÙŸÜÈß×âéåáèÒëµîƒñJôÿö¦ù>üÎþDÁ|Å  Bl“®½ÏÊξ³!™#ƒ%`'E)+÷,È. 0s2F46ï7¿9˜;h=D?AîBÂDŽF_HJ×K|MOƒPÚQSóS­TU&UÈT T·RéPvNlK¹GaCe>Ó8®2,%ç‚"ÖÎúÐó î×è9ä7àÎÜôÙ±×áÕ’Ô¥ÓÓàÒíÒ5Ó¹Ó`Ô<Õ/ÖI×uØÁÙÛŽÜÞ ßDáíâ®änæEèêüëáíÉïµñ›ó|õY÷ùÛúoüñý?ÿbFé7.¿Ý‹ÿ®ýVûtø õ)ñÍìèãÂÝaØ ÓÌÍÙÈ<Ä Àм™¹I·¬µ²´d´­´€µÜ¶—¸¼º)½Ò¿²Â°ÅÌÈøË/ÏhÒ¢ÕרÜ*ßDâNåQè?ë'îùðÁóyö#ù¿ûNþÌD§U – ×þ*EZelgaQ!;##%'ã(Á*˜,p.B02è3À5’7d9=; =ç>»@’BdD7FHÈIK+MÀNûÏýRÌ0’à + d–¾Ýóí á"Á$­&ƒ(h*9,.æ/À13e577 9à:³<‰>b@2B DØE«GjI.KÕLqNõOQQR–SfTëT!UôTXTES§QuOªL5I"Ec@; 5¹.â'¿ n³ °üCöEðÛêæÂáÞÛØ’ÖÕþÓQÓóÒéÒÓ†Ó ÔåÔÒÕØÖØ?Ù“ÚþÛtÝßœàGâä¸å‘çZéAëíïôð×òÁô˜öjø)úÎûXý¹þîÿí¦3ç: jþDü“ùdö«òƒîèéüäÌßuÚÕÎϼÊýŬÁâ½°º"¸?¶µu´ˆ´%µN¶ä·å¹3¼Ç¾–Á‚ěǼÊñÍ)ÑcÔš×ÊÚôÝá$ä%ç êíäï­òkõøºúTýÕÿP½r ¶ ú 'Wr𥠠 "g$K&+(*ã+·-/a1535Ý6­8†:T<2>@ÚA¯C~EPGIÔJ„LNªO QURcSATÓTUUT~SRéO>MìIöE[A . !"$ñ%Ê'®)„+]-5/1Ý2¬46V8%:<Ï=©?~AOC'EòF¼H|J,LÒMZOÌPR1ST¶TUUŸT¶SRRZPÌMšJÇFKB/=€7A1ž*‹#Xç˜ S`ÿÃø–ò÷ìÜçiã‚ß<Ü‚ÙUצÕiÔ‘ÓÓêÒÓ[ÓâÓœÔsÕtÖŽ×ÂØÚnÛäÜgÞýßžáPã åÕæ¤è‚ê_ìHî-ðòüóÜõ²÷tù(û¹ü-þrÿ‡Zì%|„ÿý¢ú¢÷"ô"ð´ëææÎáƒÜ,×ÐѲÌÅÇRÃM¿â»¹ì¶uµ£´x´Þ´Ôµ@·¹J»È½yÀdÃdƈɴÌêÏ%Ó\Ö‘ÙºÜÞßòâþåùèçëÉî™ñ]ô÷·ùSüÜþ[Í0ŒÓ  K‚ŸÀÍÝÚÜÎÀ!©#‘%p'P))+-×.­0€2R4'6ø7Î9¡;u=N?AùBÇDšF`H%JÙK~MOPÕQúRêSŸTUU·TèSŸRÃPTNEKŽG5C:>£8†2í+ø$Ác¹ úÊóîÛè?äAàÛÜÚ¾×÷Õ£Ô»Ó-ÓôÒþÒLÓÆÓxÔFÕEÖS׉ØÊÙ,Û˜ÜÞ¬ßJáýâ³ä{æJè!êìåíÏïµñžó{õU÷ùÑújüâý4ÿM5Í ›´\ÿ€ýû>øÒôìð“ì×çÍâÝ0ØÜҦ͹È&Ä À…¼’¹P·¶µÀ´z´Ã´žµö¶¸¸ÚºH½ô¿ÐÂÑÅêÈÌJÏ…Ò¾ÕòØ ÜBß\âeågèXë8îñÒóŽö7ùÑû`þâQ½f § ç=Qkt{vo_!L#0%'ð(Ð*¥,~.P0&2ö3Í5ž7o9G;=ñ>Æ@˜BoD;F HËIƒK,MÀN:P•QÀR¿S|TðTUËTTåR'Q×NåKTHD??Â9Ã3?-Z&0Õz+ Tûõ#ïÚé åá‚Ý‹Ú0ØHÖçÔâÓIÓûÒþÒ8Ó±ÓRÔ ÕÖ ×IØÙãÚRÜÏÝ\ßüà¢âaäæòçÀé¥ë„ínïUñ;óõõöÂøwúü”ýôþ³ ®çŸÿâý—ûÒøõ²ñpíÃèÌãŽÞ=ÙßӦΨÉÅÒÀ*½ºµ·üµé´}´°´kµ®¶]¸lºÏ¼k¿CÂ7ÅTÈvË®ÎãÑÕTØÛ§ÞÂáÐäÔçÅê¬íƒðKóö³øRûàýgØHž÷ 6 x¦Íïý í"Ô$¶&—(r*J,".õ/Ë13p5B79é:À<“>j@=BDãE¬GuI,KÙLrNñOQQ‰RŒS[TÛTUÚTCT%S‡QTO~LIôD:@á:ô4Ž.º' Hî— |¥ü:öCðßêæÎá*Þ۟اÖ$ÕÔbÓ ÓûÒ.Ó–Ó3ÔõÔãÕêÖ ØQÙœÚ ÜÝß©àQâäÊåçiéCë#íïóðÜò»ôšödø$úÅûLý¬þÝÿ×üÅãÿ;þüaù'ösòHî­éÆä“ßDÚéÔ¤ÏÊÞÅžÁÒ½¯º ¸K¶µŒ´œ´@µl¶¸ºO¼ì¾¯ÁªÄ³ÇÞÊ ÎEÑÔ´×åÚ Þ)á:ä>ç4êíöïÃò~õ0øÐúbýëÿ^Î, É 8e„š­®¶¨¢ ‹"w$X&9(*ï+Æ-›/p1@35å6½8Œ:f<4>@ßA¸C†ETGIÕJ…L"N¤OQIR^S3TÇTUìTeTdSàQÉOMÈIÊE4Aô;)6Ö/)"¾^ Þýýv÷mñçëôæœâÚÞ²ÛÙ×oÕEÔ‡ÓÓüÒ#ÓÓÔÐÔ²Õ·ÖÕ× ÙaÚ¿Û=ݼÞZàùá±ãlå8ç éãêÆìªî“ðyò_ô6ö øÆùuûüüfþ¢ÿ¤nåÕ6‘þüçùÎö0óï—ê»å—àMÛïÕ©ÐËÇÆg‰¾@»—¸›¶Gµž´´µ(¶°·š¹ß»d¾(ÁÄÇ=ÊqÍ¥ÐßÓ×EÚrÝŽà¢ãªæ¡éŒìmï5òúô©÷NúåükÿçU¸ [ • Ðõ1GMOJ> -"$ý%Ú'º)“+i-B/1ë2¶46]84:<Ý=±?…A[C+EùFÃH|J4LÏMZOÉP R,S T­TýTöTƒTžS2R8P§MvJœF"B=T71q*p#.Ó| CUÿ¹ø—òõìèçnã“ßIÜ—Ùf×¼Õ{Ô©Ó*ÓÓÓoÓõÓ­Ô„ÕƒÖœ×ÒØÚ|ÛïÜrÞ à§á[ãåÛæ¯è„êhìIî1ðòúóßõ¨÷tùû¯ü"þ_ÿwBÒåU[áþêümúm÷çóéï|ë¬æšáRÜú֭ч̱Ç6ÃE¿×»¹õ¶}µ¸´Š´ö´òµ\·7¹l»â½žÀ~ÆƢÉÑÌÐBÓuÖªÙÓÜößãæ éìØî¯ñpô$÷ÌùcüðþkÞA›æ * _²ËßéêëÛÑ!´# %}'^)5+-å.¸0Ž2]4368Û9ª;=U?)ACÎD¡FdH+JÚKM OPÏQòRãSTôTùT TÐSR¦P.NKgG C>z8[2É+Ñ$¢Eí®¬úÇóîâèHäLàëÜÚÒ× Ö·ÔÑÓ@Ó ÓÓ]ÓÚÓ‡ÔZÕRÖc×–ØÙÙ8Û£Ü(ÞµßXáã¾äæQè(êìéíÑï¸ñœó|õO÷ùÆúcüÒý'ÿ;¶üîsŽ-ÿOýîúøžô¯ð^ì›ç™âWÝر҄͘ÈÄû¿}¼‘¹U·¾µÓ´Œ´Û´¹µ·×¸úºf½ÀîÂîÅ É1ÌkÏ›ÒÝÕÙ;ÜXßrâ~åzèlëOî!ñèó öFùæûpþñeÌ$x ¶ ó#Egv„‰…}n!W#B%')Ú*³,Š.]0224×5¨7}9P;#=ú>Í@£BuDCFHÍIŠK)MÂN8PŽQ½R±SsTßTU´TþSÊRQµNÀK)HðC?™9š3-8& ¸a Kûúô&ïÛé*å á‘ÝÚAØ]Ö÷ÔùÓ\ÓÓÓKÓÃÓcÔ0Õ!Ö+×\Ø—ÙôÚ\ÜÙÝißá¬âgä&æöçËé¥ëŒínïXñ<óõòö¾øoúü‰ýäþò—ñò»xÿ¬ýlû—øJõzñ4íèã`Þ Ù¸Ó‚Î‡ÉìľÀ!½º»·¶ù´’´Ã´‰µÈ¶z¸Œºë¼¿]Â[ÅlÈ–ËÈÎÿÑ8ÕoؘÛÀÞØáçäççÝê½í™ð[óöÄøcûôýtìU² I …µßú&  !û"à$Å&¢(€*V,/.0Ø1©3y5R79ú:Ç<>s@DBDèE´GxI.KÜLpNïOMQR…SNTÍTüTÊT&TSdQ5OZLêHÌD@º:Ê4i.“'{ ,Òƒ m™ü5öDðàêæØá6Þ0ۯغÖ:Õ(ÔwÓÓ ÓCÓ¤ÓIÔÕôÕ÷ÖØ[Ù®ÚÜ‘ÝßµàXâäÎå™çléIë*íïöðÚò¾ô•öaøú¼ûAý¡þÇÿÈtáô ë¶ÿ þßû)ùõõ9òîwéŽä^ßÚ¹ÔƒÏxÊÊŇÁ˽§º%¸Q¶!µž´²´Yµ†¶¸#ºp¼ ¿ÎÁÈÄÐÇûÊ'ÎbÑ™ÔÍ×þÚ$Þ?áQäRçKê.í ðÒò•õ?øãúsýûÿqß<’ × Ew«º½Ä·¯ ™"ƒ$h&D($*û+Ô-§/|1L3#5ò6Æ8š:l@éAÀCEZG IÙJ‡L"N¦OQIRQS+T¶TùTÖTMTJSÀQ¨OôLœI¦EAÏ;ü5°/ñ(â!Có Íìýo÷iñæëüæ£âçÞÀÛ(Ù×€Õ\Ô”Ó1Ó Ó5Ó“Ó&ÔàÔÆÕÂÖä×ÙhÚÒÛCÝÊÞdàâ¹ãvå?çéìêÇì³î“ð{ò]ô7ö øÀùoûñü[þÿ”UÍñ³öÿcþNüµù—öùòàî^ê‚åcàÛÂÕÐnË«ÆTÂ{¾;»˜¸ ¶Vµ¬´©´0µE¶Ì·¸¹ÿ»¾HÁ/Ä:Ç^ʉÍÂÐúÓ1×]ڌݢà¼ã½æ¹éŸìïLò õ¿÷^úöü}ÿøgÆ h ¨ Þ,AU[]ZK >"!$ &ê'Ä)¢+w-K/#1ð2È4—6l8=:<ã=½?ŽAbC4EÿFÇHJ6LÎM^OÂP R#SþS¢TëTåTjT…SRPƒMLJwFõAÜ<*7ð0K*G#³c /Fÿ­ø”òôìíçuãŸßUܨÙw×ÐՌԾÓ=ÓÓ*ÓÓÔºÔ˜ÕÖ¬×ߨ(ÚŠÛùÜ€Þà²ácãåäæµèŠêlìPî2ðòùóÜõª÷iùû¤üþSÿa.¶ëÃ03²þ»ü:ú5÷²ó­ïEëtæeáÜÎÖÑgÌ’Ç#Ã2¿Ò»¹û¶‰µÇ´ž´µ¶·P¹»¾½ÀžÃ¢ÆÄÉêÌ%ÐWÓ”Ö¿ÙïÜ à"ã(æ%éìòîÀñ…ô7÷ßùvüÿþ€ëTª÷ 9 pœÁÝìùüóð×!Ë#¦%’'f)F+-õ.Â0ž2e4B6 8å9µ;‹=_?3ACØD¥FnH*JáKMO|PÍQëRØS„TáTèTŠTµSdRƒP NùJ>GãBä=M842›+¯$|&Ó—œ÷ù¾ó îâèPäYàõÜ'Úã×ÖÍÔâÓTÓÓ%ÓoÓíÓ˜ÔjÕaÖs×£ØçÙDÛ±Ü3ÞÁßbá ãÇ䉿Xè/ê ìííÕï¹ñó|õM÷ùÃúUüÍýÿ,›ãÊQdÿ!ý¹úÑ÷côzð"ìgç_â'ÝÑׇÒ^Í}ÈøÃí¿s¼Ž¹\·Äµè´›´÷´Ïµ1·ò¸»…½1Àà Æ'ÉP̃ϻÒòÕ%ÙOÜt߇â•å‘è€ëeî3ñþó¯ö^ùóû†þyÙ:ƒ Ë 2Vu„•—“y!j#J%3')í*¼,˜.j0>24â5¶7†9];.=?Ø@«B}DLFHÓIŒK-MÂN5P‹Q¶R©SgTÐTíT TãS¯RæP“N˜KHÄCê>l9q3é,&äA öBûðô$ïàé.åá™Ý®ÚQØoÖ Õ ÔoÓ%ÓÓdÓÎÓ{Ô<Õ3Ö=×gØ©ÙþÚiÜæÝsßá¸âoä0æýçÏé¯ëíwïVñ@óõóö·ømúü„ýÐþ÷ÿÛ€ÕÑk“Lÿ€ý6ûeøõAñþìRè]ã(ÞÜØŠÓ[ÎiÉÒįÀ½º½·¶µ§´×´¥µã¶˜¸¬º½°¿yÂ{ŊȳËåÎÒRÕˆØ²ÛØÞðáüäÿçîêØí¨ðuó+öØøvûþ‡þeà Z “Éê .40,! #î$Ò&±(Œ*e,;.0á1·3†5\7*9;Ñ<©>|@OB DòE¸G}I5KÚLuNíOHQRxSGT½TëT´TTðRHQO7LÂH¢Dç?ˆ:¥49.r'P ´m XŽü*öBðáêæááDÞ;ÛÂØÉÖMÕ:ÔŒÓ0Ó"ÓRÓºÓWÔÕÖ×/ØhÙºÚ$ÜšÝ$ß½àeâäÙåŸçvéMë1íïýðÙòÀô’ö_øú¶û5ý“þºÿ±_ÅÓ€‹ÿàý§ûøøºõòÒí@éQä0ßÞÙ’ÔVÏ[ʬÅvÁ½½¤º&¸X¶0µ®´É´tµ ¶>¸Aº¼*¿ïÁäÄòÇËGÎ}ѲÔì×Û>ÞVáhäiç`êGíðìò¥õTøõú…ýòL¡ ë #_¦¸ÉÑÎ˹ «"$v&T(/* ,á-´/‰1Z3.5þ6Ó8¤:y@õAÅC—E`G#IÞJ‹L"N¥OQARLST¨TèTÂT5T/S Q‡OÌLxIxEÝ@ž;Ò5‚/É(¼!{%Ù ·àýd÷fñæëç«âõÞÌÛ:Ù%×—ÕiÔ±Ó;Ó(ÓCÓ¨Ó7ÔñÔÔÕÕÖò×,ÙxÚÝÛPÝÙÞkàâÁã€åGçéñêÏìµî—ðò\ô8öø¾ùeûèüNþ~ÿƒ<´Ò‘ëÊÿ6þü‚ù]öÁò¦î$êKå*àéÚ”ÕYÐKËÆ=Ân¾4»˜¸©¶_µ¿´¼´Lµ`¶ê·Ø¹¼¥¾eÁPÄ[ÇyÊ©ÍßÐÔM×xڢݽàÐãÖæÌé¸ì’ï`ò õÏ÷sú ýÿ wÚ- | ¶ î:Tbmlg\ I"4$&÷'Õ)­+†-Z/,13Ñ4¥6w8I:<ð=Å?šAhC>EGÎH‡J7LÒMZOÀPRS÷S”TÜTÏTVTgSøQõO`M'JKFÌA®<þ6Ç0*$#ç™E 1ÿ§øŒòõìïçã§ßfًܵ×ßÕ¤ÔÏÓPÓ+Ó;Ó–ÓÔÎÔ§Õ¢Öº×îØ7Ú•Û Ý†Þ àºáoã&åìæ»è”êoìVî4ð"òùóÞõ¤÷jù û üþHÿJ›Î  ‡þˆüú÷vóvïë>æ+áíÛšÖZÑAÌtÇ Ã#¿Ê»¹þ¶—µÖ´µ´)µ$¶˜·u¹§»%¾ÙÀÀÃÂÆßÉ Í=ÐxÓªÖßÙÝ'à7ãBæ9é)ìïØñ—ôK÷ñù‰üÿd¼ H ­Ñêÿ üê!Ô#¹%œ'x)R+(-/Ó0¤2z4G68ì9Ã;”=k?:ACÛD±FoH5JßK„M O{PÈQãRÐStTÓTÔTtT™SIR^PëMÑJG¶Bº=!82t+…$Z¸€‹ëù·ó îäèWäbàÝ7Úô×.ÖÞÔõÓiÓ.Ó:Ó€ÓÿÓ¨Ô|ÕqւײØöÙPÛ¿Ü>ÞÌßláãÎ䕿^è6êìôíØï½ñžó{õL÷ù»úOü¾ýÿò†Â®(>Ôþðü…ú™÷,ô<ðëë+ç(âóÜŸ×]Ò9Í[ÈáÃÜ¿i¼Ž¹]·Òµò´´´ µðµG·¹4»¨½QÀ.Ã*ÆHÉk̤ÏÕÒÖ>Ùk܋ߠâ­å¥èšëuîNñ ôÉölù ü–þŒêL“ Ý Cg‚˜¡§¢›Š!v#]%<')õ*Î,¥.v0L24ï5Á7”9f;;=?á@´B„DSFHÙIK/MÁN7P„Q²RŸSZTÃTÚTŠTÍSRËPkNuKÙGšC¼>C9@3Ä,æ%Åu(èç0ûëôïßé7å á§Ý½Ú^Ø„ÖÕ ÔƒÓ6Ó6ÓpÓçÓ…ÔUÕ=ÖN×wØ´ÙÛvÜòÝ€ßáÃâxä9æèÖé·ëí|ïZñ@óõñö´øhúýûxýÅþäÿÉf»°FmÿOýû,øÛôñÁìè!ãôݨØ^Ó3ÎHÉ·ÄœÀ ½ºÀ·¶µ¸´ð´½µ·¸¸Ëº(½Ð¿™ÂœÅ§ÈÔËÏ9ÒqÕŸØÑÛîÞ âåèëêíÁð‡óCöéøŒûþœtÙ! m ¥Õþ/?C@;(!#ü$â&¿(™*t,I.0ò1Á3•5e7:9 ;ß<²>…@ZB)DúE¿GƒI8KÞLuNéOIQsRwS5T±TÙTTöSÔR'QëNL˜HvD»?\:v4.E', é•R C~ü"ö:ðãêæëáMÞLÛÐØÜÖ_ÕNÔŸÓDÓ4ÓeÓÎÓgÔ)ÕÖ×=ØvÙÉÚ.Ü©Ý.ßÊànâ!äáå©ç{éWë3íïûðáò»ô•öYøú­û.ýþ®ÿšIª´]›`ÿ°ýwûÁøõÉñ˜íéäöÞ­ÙcÔ0Ï7Ê“Å`Á²½žº*¸_¶>µÁ´Þ´Žµ½¶\¸aº¯¼J¿ÂÅÈ4ËeΙÑÒÔØ4ÛTÞqáäçtê^í2ðó¸õjøûœý˜`³ ú 6m·ÇÙßß×Í ¶"¢$&d(>*,î-Â/•1j3857Ü8±:‚*@üAÑCšEjG(IãJL#N¥OQ>RBSTœTÓT±TTS‚QbO«LMIQE®@s;¥5X/ (”!X¾ ¤ÏýY÷añåëç²âÿÞÛÛIÙ9×§Õ€Ô¿ÓRÓ:ÓTÓ¿ÓAÔ ÕßÕåÖØ:Ù…ÚêÛ[ÝåÞwàâÊã‹åLç"éôêØìµîŸð|òaô3öø»ùZûäü>þqÿn&›±rÀ¥ÿþíûIù)ö‡òkîîé åùß²ÚiÕ-Ð,ËoÆ.Â]¾0»˜¸°¶mµÐ´Ó´eµ|¶¸÷¹;¼Å¾†ÁmÄ{Ç—ÊÉÍøÐ2Ôf×’Ú¼ÝÖàèãíæâéÍì¨ïuò4õâ÷‰úý¦ÿ‹êA ˆ Ì ú-Efp}{wi X"A$&&(á)»+”-e/=1 3ß4°6†8Q:+<ú=Ï?¢AtCBEGÒHŒJ9LÔMZO¾PRSêS‡TËT»T?TJSÚQÓOó=ïÌêæõàºÛkÖ1ÑÌXÇøÂ¿Å»¹·£µä´Í´>µC¶³·–¹Æ»E¾úÀßÃâÆþÉ(Í]Ð’ÓÇÖ÷ÙÝ>àPãXæQé<ìïéñ¯ô\÷ú™ü'ÿ tÎ \ ¼ä÷ ù!ä#Ç%ª'…)a+5-/Ý0µ24X6&8ý9Ê;¢=r?FACéD²F|H2JçKƒM O|P¿QàRÂSkTÀTÄTYTƒS(R?PÅMªJëFŽBˆ=û7Ö1N+[$5æšlwàù±óîçè^älàÝDÚØ?ÖóÔÔ~Ó@ÓLÓ”ÓÔºÔÕ~Ö–×¼ØÚ[ÛÎÜGÞÚßvá ãÙäšægè=êìøíÝï½ñ¢óyõJ÷ ù³úHü³ýøþÞi«‡ ªþ¾üSúd÷ðó ð«ëöæðá¼Üs×-ÒÍ:ÈÌÃÊ¿`¼‹¹c·ÛµµÆ´#µ ¶g·2¹W»Ç½pÀPÃGÆfɊ̼ÏõÒ'ÖZكܣ߻âÁå¾è®ë‹îdñ"ôÚö„ùü©þ)–T¬ è %Py‘¨±¶´§š!…#h%P'%)+Ú,³.„0X2*4û5Ï7ž9q;F=?ë@½BŒDZF HÞIK5M¾N7PQ«R—SNT±TÉTsT±SuR¢PPNHK¶GjC”>93˜,À%YÕÏ'ûáôïãé:å+á´ÝÊÚrØ•Ö.Õ5Ô’ÓNÓFÓ…Ó÷Ó—ÔeÕNÖ]׃ØÅÙÛ‚Üÿ݉ß$áÏâäEæ èßé»ë˜í~ï\ñDóõóö­ødúôûlý¸þÒÿµNž#Eòþ!ýÎúú÷¡ôÎðˆìàçíâ½ÝyØ2Ó Î+ÉÄŒÀ½ºÄ·¶#µË´ µÖµ·Ö¸èºL½ë¿½Â¸ÅÆÈóËÏZÒ„ÕÁØãÛ ß!â,å+èëîÔðóTöþøœû)þ¬"‰ä7 y ¹ä+?OOSF;!##%ì&Ð(¦*‚,U.)0þ1Î3¤5o7F9;ë<¼>@cB0DFÄG‰I;KáLtNêOBQpRlS,T¡TÉT…TàS¶RQÈNíKkHRDŠ?3:J4æ-' Ä{: 1püö8ðãêæñá]ÞUÛæØéÖuÕ_Ô´ÓWÓEÓ{ÓÜÓ{Ô:Õ!Ö(×I؇ÙÔÚ?ܯÝ?ßÒàxâ.äååµç€é]ë9íïñßòÀôŽöYø ú¦û!ýwþšÿˆ/‘”<o:ÿ|ýIûˆøLõñ`íËèäãÁÞ}Ù6Ô ÏÊ|ÅLÁ¨½šº+¸h¶KµÕ´ô´ªµÕ¶¸{ºÒ¼g¿1 Å3ÈN˅γÑíÔØJÛnÞ‰á•ä˜çŠêpíKðóÌõ~øû°ý-©oÆ  Jx¥ÀÛæîíéÖ É"¬$’&q(I*',ú-Ð/¢1s3G57ê8º:Ž3@BÖC¥EnG.IæJL#N¥OüP8RÙ?ªA~CHEGØHŽJ=LÕMWO¾PøQ SâSvT½T¥T)T.S½Q®OMÕIøEyAR<ª6m0Ñ)Ô"£Z õÿ“ø~òöìôçã¼ßƒÜÒÙ°×ÖÍÔóÓ|ÓKÓfÓ¶Ó>ÔîÔÈÕÀÖÙ× ÙQÚ°Û Ý¡Þ4àÒá€ã9åýæËèŸê|ì\î?ð"òÿóØõ¡÷]ùûŒüêý,ÿ"óe“^¿´ÿ+þ&üù’öóïêÑå¹à‰Û=ÖÑýË7Ç⿺»¹ ·®µø´Þ´Zµ\¶Ñ·´¹ä»f¾ÁüÃÇÊGÍxЭÓäÖÚ:ÝUàiãmæhéRì1ïþñÁôp÷ú©ü<ÿ°$ˆÚ/ d ¥Ëð ''$ "ï#Ø%¶'•)m+C-/ë0Â2Ž4f608:×;«=}?OA"CîD»F~H9JéK…M OyPºQÚR¸S]T³T¬THTdS RP¡MƒJÁFeB\=Ð7¬1#+8$ÉViÔùªóîèèfävàÝVÚØWÖÕ ÔÓVÓ^Ó¥Ó%ÔÉÔ ÕŽÖ¡×ÑØÚqÛÑÜYÞáßá/ãÜä§ælèDêìûíáï¿ñ¢ówõI÷ù°ú:üªýæþøÿÅT‰jáêÿ|þüú/÷¹óÏïsë½æºáŠÜC×ÒñÌ È³Ã¼¿W¼‹¹d·ìµ µà´6µ$¶ƒ·Q¹v»å½’ÀjÃmÆɪÌÙÏÓBÖtٛܽßÏâÚåÓèÂë£îrñ;ôëö•ù.üºþ:ªh» ÷ 7_ŠŸ¸¿ÇÀ¸¦!•#t%^'3)+æ,À.0f244 6Õ7¯9y;S=?ö@ÅB•D`F%HæIK9M½N1P€QŸRS@T¢T¶T]T˜SWR†P(N'KˆGFCf>ê8ì2p,˜%}5ð»ÃûÜôïãéCå4áÀÝÜÚØ©ÖBÕEÔªÓ]Ó\Ó—Ó ÔªÔsÕ`Ök×”ØÐÙ)ÛÜ Þ”ß1áÔâŒäHæèäéÀëŸí}ïdñ=óõìö«ø\úìûaý©þÁÿŸ7rýÄþóüúÃ÷lô“ðRì§ç·âŠÝIØ ÓèÍ É‡ÄzÀ÷¼ºÅ·+¶1µÞ´µòµ6·÷¸»l½ ÀÝÂÖÅæÈ Ì:ÏpÒ¦ÕÕØÜ#ß5âFå?è2ëîæð²óeöù­û=þ½4—øE Œ Æô 6TWd_TK!0#%û&Ü(´*,b.70 2Ú3­5~7P9#;ó<Æ>™@jB:DFÊGŽI=KäLsNèO@QfRfST—T±TxTÀSŸRæP¨NÃKKH Df?:4¾-ò&æ¦\% düö4ðçê"æúáhÞfÛóØÿÖƒÕvÔÄÓlÓZÓŠÓñÓ‹ÔJÕ3Ö5×ZØ’ÙåÚHÜ¿ÝFßßà‚â5äñåºçˆébë>í!ïñãò¼ôöRøúœûýcþÿnrwL ÿRýûVøõXñ&í“è®ã‹ÞMÙ ÔãÎ÷É_Å<Á›½•º-¸q¶Yµå´µ½µø¶”¸Ÿºð¼…¿RÂ>ÅQÈoËžÎÐÑÕ7ØfÛ…Þ¡á­ä¬ç¢ê…í^ð%óâõø-û¿ý@»"Õ  X‹°Õåùýúøå Ö"¼$&(W*5,.Ü/°13U5!7ö8Å:™?@ BáC©EvG4IêJ’L#N¡OüP0R2SÿS}T¶T‚TíSÛRDQ O^LÿHýDZ@;O5/O(L!ÌŒ €°ýL÷WñçëçÃâßùÛhÙ^×ËÕ¦ÔåÓ|ÓZÓ€ÓÛÓkÔ'ÕÖרWÙ¡ÚÜvÝøÞŽà.âßã™å^ç/éëãì¾î£ð‚ò^ô1öû÷­ùNûÊü'þOÿHøeu-sOÿ§ýŒûÝøÀõòþívé¥äŠßQÚÕÝÏéÊ;ÆÂF¾#»›¸¿¶…µ÷´û´˜µ³¶@¸7ºw¼¿ÀÁ°Ä³Ç×ÊýÍ5ÑgÔ˜×ËÚçÝ áäç ê÷ìÓïšò\õ ø©úBýÃÿB©^ ­ æ Ekš˜“ˆ t"^$@&"(ý)Õ+®-€/U1&3ö4É6™8l:<<>ã?²A‡CNEGÛH“JALÓMYOµPöQSÕSlT§T–T TS˜Q•OïL³IÏELA-<{6H0¨)°"ƒ;û Üÿ‡ø|òöìùç—ãÉߌÜçÙ½×ÖÝÔÔÓaÓwÓÉÓMÔÕÕÕÕÖã×Ù]Ú¿Û*ݯÞ;àÝá‰ãAåçÏè§êì`îBð#òÿó×õ÷Zùøú‚üßýÿÙMw9Šÿýýùûgù^öÎòÌî\ê•å‹àTÛÖÝÐÚË ÇÍÂù¾´»¹·¼µµñ´vµq¶ò·Í¹¼‚¾;ÁÄ"Ç4ÊgÍÐËÓúÖ)ÚQÝmà~ã†æzéiìBïòÒô†÷*ú¾üKÿÂ7•ï: x ²Û+544& "$Þ%É'ž){+R-#/ý0È2ž4o6<8:à;³=Š?SA.CôDÁF„H=JìK†M OuP·QÐR°SOT¢TšT/TMSíQPzMaJ˜F9B8=ž7‹1÷*$ï«eDWÌù¥óîïèkä‚à*ÝfÚ$ØhÖÕ/Ô¥ÓcÓvÓ´Ó5ÔÛÔ®ÕֳרØ#ÚuÛâÜcÞëßá4ãç䮿sèKê$ìÿíãïÂñ£óvõE÷ù¦ú5ü™ýÙþåÿ±:nI¾ÀÿSþ\üïù÷ö‡ó“ïAëæŠáVÜ×áÑÊÌ È™Ã°¿P¼Š¹k·ôµ µò´Oµ?¶Ÿ·l¹—»¾²ÀŠÃˆÆžÉÆÌóÏ-ÓYÖÙ±ÜÕßæâïåéèÙëµîŠñIô÷¦ùAüËþK»"yÈ Br–°ÆÌ×ËÈ´!¡#†%g'D)+÷,Ë.0t2=46ß7·9ˆ;V=/?ú@ÎBDgF+HçI–K6MÂN-PyQœR„S5T•TžTLT|S;RePNKaGC9>Ã8Á2I,s%YÔ¨°ûÕôïêéEåEáÈÝïÚØ¹ÖWÕWÔ¿ÓnÓqÓ§ÓÔ»ÔÕsÖyסØàÙ3ÛÜÞ¡ß7áäâäUæèíéÅë¢í‚ïbñDóõêö¦øSúåûTý›þ°ÿˆ!dTØ÷ÿ™þÆüjú‘÷4ô]ðìsç~â]ÝØàÒÃÍðÈnÄmÀ꼺ȷ6¶@µñ´9µ¶W·¹$»‰½(ÀüÂóÅÉ*ÌTÏÒ»ÕóØÜ=ßKâ]åTèIë(îüðÅóxö&ù¾ûOþÎD«X ˜ Ø/G_jnncW!A#'% 'ç(Ã*›,p.A02â3½5„7_9(;=Ì>¤@sBAD FÒGIDKãLtNçO9QcRYST‡TŸTaTªS€RÊPƒN K#HùCJ@BêC°E|G6IïJ“L$NŸOùP)R,SñSpT£TmTØS¾R(QýN:LÚHÕD1@ó:&5Ü.((*!ô°x gªý?÷VñêëçÎâ!ßÜyÙo×ÛÕ¼Ô÷ÓŽÓpÓÓñÓyÔ8ÕÖ×.ØbÙ°Ú ÜƒÝß–à;âæã¡ågç2é ëæìÂî§ðòbô,öú÷¦ùFû¿üþ=ÿ8ÞMV M'ÿzý]û¬ø‰õÝñÅíBénäXß#ÚãÔ¹ÏÈÊ$ÆðÁ>¾»ž¸Ç¶µ µµ±µÍ¶]¸Rº™¼"¿âÁÊÄÕÇîÊ ÎJфԱ×àÚÞá-ä/ç"êíáï´òkõø¼úRýÕÿR»s ¶ ý *Yw ¦© • „"j$O&.( *ä+·-/^1335Ó6§8t:I<>ê?½AŒCXE GáH—JBLÖMUOµPïQûRÎS[T›T~TùSýRQpOÐL‰I©E#A›8•2",M%7úº’ ûÌôïëéLåMá×ÝúÚ¥ØÈÖjÕjÔÒÓÓ‚Ó»Ó+ÔÌԓՀ։ׯØìÙAÛ§Ü#Þ¨ßEáçâäZæ"èóéËë¥í‡ïgñAóõåö£øPúÙûJýþÿwI2·Íÿrþ“ü<úX÷ô#ðäë;çKâ(Ýì×µÒ¢ÍÏÈZÄZÀ輺ҷ<¶OµµLµ#¶s·,¹D»¦½JÀÃÆ ÉGÌpÏ«ÒÓÕÙ+ÜVßcâpålè[ë=îñÔóŽö7ùÑû_þáQÀj ¨ æ8\i}z~pc!Q#3%'õ(Ï*¨,~.M0%2ñ3Å5•7e96; =×>¯@vBOD FÞGIHKäLtNäO5Q^RNSTxTTLT’ScR¬PaN|KûGÑC?¶9Ç3r-¥&¢g)÷ ûMüÿõ6ðåê3æ â‚ÞƒÛ٠׫՚ÔìÓ’ÓÓ¯ÓÔ«ÔlÕRÖS×xØ«ÙÿÚ`ÜÖÝ^ßðà˜âEäæÈç–émëHí'ïñãò¿ô‡öOøõùûýMþjÿHï9<Îÿÿ·þõü³úî÷¨ôëð¶ì'è@ã)ÞíØ·Ó˜ÎºÉ2ÅÁнŒº5¸‚¶uµ µ6µôµ+·Ñ¸Ùº.½Ã¿ŒÂņȬËÓÎÒ;ÕjØ–ÛµÞÏáØäÚçÊê°í„ðNóö³øPûãýbà>§ñ ; y§Òð!ò"Õ$¼&—(u*L,".ô/È1˜3k597 9Ú:°<{>R@BñC¶EG(*ñ+Ä-œ/k1A3 5â6®8ƒ:P<&>ô?ÅA•C\E*GâHŸJ@LØMTO²PêQòRÁSPTˆTlTàSâRaQNO­LbI‚Eö@Ú;&6÷/V)j"@Ç ¹çþuøtòòìè§ãÜ߬ÜÚâ×:ÖÕ/Ô²ÓˆÓ™ÓðÓoÔ!ÕùÕìÖØ3Ù{ÚÕÛDÝÄÞRàòá˜ãTåçàè²ê‹ìjîHð%òôÏõ÷JùïúküÇýùþïÿ¬:ùP9ÿ¥ý˜ûùõõ_ò^îíé)å#àòڻՎЖËëÆ£Âᾨ»¹·Òµ*µµ¢µ­¶$¸º?¼Ã¾sÁ[ÄWÇvÊ™ÍÌÐýÓ0×\Ú€Ýà«ã°æ¨éìnï9òùô¬÷KúçükÿçWµ X œ Îü7GUNT= 6"$&Ý'¾)“+l-?/1â2¸46Z8":ú;È=›?iA9CEÎFHEJðKˆM OnP¯Q¾RžS5T‚TvTTS±Q¿O8MJLFäAâ¶@‚BRDFÝG›IFKèLuNàO4QTRHSûSgT}T5TzSJRˆP@NTKÔG¨Cæ>†9¢3C-‚&zG Þ í;üþõ*ðìê3æâŠÞ–ÛÙ:×·Õ²ÔüÓ¦ÓÓÃÓ&Ô¼ÔÕ^Öfׂؽ٠ÛoÜàÝißüà¢âMä æÍçžérëLí-ïñæò¼ô‡öJøðù…ûõü@þWÿ8Ó!®×ÿ‹þÇü€ú»÷sô°ðììç ãôݽØÓqÎÉÅ Á|½Žº2¸¶~µ!µMµ ¶F·ð¸ùºJ½æ¿ªÂ›Å©ÈÅËóÎ#ÒUՇثÛÓÞááôäëçãêÂíšðbóöÊø`ûöývëX± L ‡¹ß%')!þ"å$Ç&§(€*Z,/.0Ô1§3s5I79é:·<Š>X@*BôCÂE„GCIóJ—L&NœOðPRSÜSTT~TFT¥S‰RçP¼NîKŽHDÝ?œ:Ó4†.Þ'Ý µwG G‡ý3÷Jñíëçßâ7ß$Ü–Ù“×ÖáÔÔ¶Ó“Ó·ÓÔŸÔWÕ3Ö2×IØÙÈÚ'ÜšÝß°àJâýã°åxçAéëîìÍî¨ðˆò]ô.öî÷Ÿù4û­üÿýÿ³ÀËþ&ýôúHøõoñUíÒèäñÞÁÙ‰ÔnÏ„ÊñÅËÁ$¾» ¸Õ¶¬µ*µ=µâµ·™¸ŽºÕ¼b¿ ÅÈ+ËVΆѵÔê×Û6ÞMáYä\çOê4íð×ò–õ@øåúsýýÿrß>’ Ü Mt™­½ÆÄÀ± Ÿ"‡$m&F()*û+Õ-¨/x1M35í6¼8Œ:]<->@ËA¡CaE2GèH JFLÖMUO­PæQéR·S@TyTVTÉSÈR@Q1O„L>IVEÎ@­;ý5Ê//)D"å® ¡Ùþkøkòøìè°ãç߸ÜÚó×KÖÕ@ÔÆÓšÓ®ÓÔ€Ô3ÕÖרCÙˆÚâÛPÝÎÞ^àúá§ãYåççè·ê•ìiîNð'òôÓõ’÷Kùâúcü¼ýæþáÿ’Û)ÿvýiûÏø¾õ'ò(î±éøäèßÅÚŠÕgÐtËÏÆÂÓ¾¢»¹#·Þµ:µ3µ¸µÈ¶A¸-º^¼â¾”ÁzÄuǖʳÍëÐÔK×uڛݳàÆãÅæ¾é¥ì‚ïNò õ¿÷aúõüÿøgË o ¦ â .FZ^eZT =",$ &ð'Æ)¥+v-N/1ñ2Á4‘6b8/:<Ñ=¥?rA@CEÕF‘HLJðK‹MOmP§Q»RS(TsT`TêSS“QžOMêI$F»A¶<"7 1~*§#„Q*ªù“óîöèƒäžàSÝ’ÚXØ›ÖMÕiÔÛÓ¢Ó§ÓïÓhÔÕÞÕÍÖß×ÙIÚ›Û ÝÞà¦áTã寿Šè\ê5ì îñïÄñ§ósõ<÷óø’úüxý«þ°ÿpîçPJÿÊýÓûTù[öÞòñî“êãåæàÅÛŠÖhÑbÌ´ÇXÇ¿7¼ˆ¹{·¶Qµ,µšµŠ¶÷·Å¹ò»_¾ÁåÃåÆôÉÍGÐ|Ó¬ÖØÙÿÜà.ã0æ,éìñîÈñô<÷Þùwüÿ~ïR®ö ? n£ÁâïýþûòÞ!Ì#¬%“'j)J+-õ.Á0™2c4968Ú9¥;y=G?AæBµDxF=HóI¡K7MÁN%PmQ…RhSTfTgTT0SåQP›M’JéF¢B»=D8A2Ò+þ$óº…f~îú¿ôïìé^å[áóÝÛÅØëÖÕÔøÓ¨Ó§ÓßÓNÔïÔ±Õ¡Ö¥×ÍØÚ\Û½Ü<Þ¼ß[áüâ­ämæ/èêÖë­íïhñFóõâöšøAúÊû1ýrþxÿNÓòn€ÿþ7üÖùñö’ó¶ïqëÏæàáÃÜ‘×^Ò^Í‘È/Ä9ÀÖ¼ÿ¹Þ·K¶sµ'µ~µV¶©·i¹€»æ½…ÀYÃLÆ^ÉÌ«ÏÞÒ Ö=Ùc܀ߖâå—èˆëdî:ñýó³ö[ùøûþvÜ9‡ Ê 3[vŒ–›™€!k#Q%3')ì*¿,š.e0>2 4Ü5«79H;!=ê>¾@ŒBXD!FãGœIMKçLtNâO*QSR:SòSWTkT T`S+RkPN2K©G‚C¹>_9x3-_&T,íÊ Ù2üóõ-ðéê=æâšÞŸÛ5ÙD×ÐÕ¾ÔÔµÓ¨ÓÏÓ=ÔÈÔ’ÕnÖr×”ØÈÙÛ}ÜêÝußá§â[äæÚç¡é{ëNí0ï ñåò¼ô…öDøëù}ûéü3þDÿ%ºúаÿcþ–üRú„÷?ôyðIì·çØâÀÝ”Ø^ÓQÎ}ÉÅ÷Àu½†º;¸•¶µ2µeµ#¶e· ¹»h½ÀɹÅÅÈâËÏ:ÒsÕœØÈÛçÞüáåèõê×í¯ðqó0öÖøwûþ†cÇ ] –Éï!3660! #ò$Õ&µ(Ž*f,:.0ß1²35P7"9ð:Ã<‘>c@0BþCÈE‰GIIóJœL#N›OìPRSÐSEToT/TŽSmRËP—NÎKcH[Dµ?p:«4^.¸'º –Z2 4zý-÷EñòëçéâDß0ܫ١×ÖòÔ1ÔÉÓ¤ÓÌÓ!Ô²ÔfÕCÖ@×YØ‹Ù×Ú4Ü£Ý'ß¶àWâä¼å|çHéëòìÏî­ð†ò_ô*öë÷™ù,û¡üñýÿùÿžøý¤Ûÿ¨þóüÅúøäô9ñí›èÌã¿Þ‘ÙbÔFÏhÊÚÅ´Á ¾ »¨¸Ø¶½µ:µUµöµ"·²¸®ºó¼€¿<Â)Å+ÈJËpΠÑÒÔØ+ÛLÞeáoäsçcêJí#ðéò©õSøøú„ýƒïP¡ ë )[†¥»ÏÑÔÍ¿ ®"•$x&W(2* ,â-²/ˆ1V3'5÷6Ç8˜:e<:>@×A¥CiE7GêH¦JDLÚMQO©PáQßR®S1TiTAT³S«R$Q ObLI-E¦@‚;Õ5¡/ )"ÿǘ Íþ_ønòóì è·ãòßÉÜ!ÚØ_Ö'ÕVÔÚÓ«ÓÃÓÔ—ÔAÕÖ×!ØQÙ”ÚñÛYÝÞÞcà âªãfå"çïè¼ê—ìpîNð)òôÎõ“÷BùÝúWü¯ý×þÊÿçÿµäþMý6ûøˆõòñíí~é¾ä·ß•Ú]ÕEÐR˶Æ}ÂÆ¾ »¹.·èµLµFµÔµÝ¶d¸Dº¼ý¾´Á–ĕǯÊÓÍÑ5Ôc׌ڵÝÇàÞãÚæÔéºì”ïdòõÒ÷qú ýÿ z×0 z ¹ ð>Sgono\ N"6$&ü'Õ)®+‡-W/-1ú2Í4›6m8<: <Ý=ª?}AHCEÙF–HPJñKŒMOgP¤Q°RˆSTbTLTÓSæRwQ|OóL¿IFŽA<÷6â0Z*€#e6þ ò¢ùóîûèŠäªàaÝ¢ÚiØ®ÖbÕ{ÔòÓ±Ó½ÓÿÓzÔ ÕîÕÝÖì×ÙTÚ¬ÛÝŽÞà±á\ã åËæ”è`ê9ìîìïÏñ óuõ6÷îø‹ú ükýþšÿ]ÑþÄ*!ÿžý¢û#ù$öªò·î_êªåµà’Û_Ö=ÑCÌ”ÇIÃu¿2¼‡¹‚·¶eµ=µ³µ£¶¸á¹¼}¾/ÁÄÇÊ9ÍeЕÓÈÖðÙÝ2àBãIæAé+ì ïØñ˜ôN÷ïù‹üÿ’ÿd½ O ²Ððÿ   úò!Ö#½%ž'z)Q+--û.Ó0¢2q4C68ã9²;=S?!AîB¼D~FEHóI§K7MÁN#PfQ~R_SÿSYTSTñSSÄQêOuMnJ¾FzBŽ=82©+Ú$ÏœmMrßú¼ôïðéeådáÞ%ÛÔØ× Õ¤Ô Ô¼Ó¸ÓóÓ_ÔÕÃÕ°Öµ×ÚØÚeÛÏÜCÞÌßaáã¸äqæ;èêÝë³í‘ïjñHóõáö”ø:úÀû%ýcþgÿ7½óÓKVÿïýü£ù¿öWóƒï5ë™æ©á”Ü_×9Ò9ÍtÈÄ,ÀɼºÚ·[¶€µ<µ–µo¶Ç·…¹ »¾¥ÀxÃjÆ~ÉšÌÉÏ÷Ò)ÖTÙ}Ü—ß­â²å¯è›ëzîOñôÊölù ü•þˆîH˜ Ù @nž£¬§œ!x#_%A')ú*Î,£.w0D24å5¹7†9W;'=ø>Ä@—B]D*FåG§IIKðLnNàO'QJR1SåSITWT TDSRLPøMKGXCŽ>49L3ó,3&6Ö² È$üíõ'ðîêAæ)â¦Þ®ÛFÙV×ãÕÓÔ&ÔÈÓºÓåÓJÔàÔÕ€Öƒ×ŸØØÙ%Û‡ÜùÝßáµâ_äæÙç¯é{ëXí2ï ñêò·ô‡ö<øèùrûßü$þ4ÿ¤éÜg‡ÿ:þfü#úM÷ôBðì€ç âÝ_Ø9Ó(Î`ÉèÄçÀj½…º=¸¶¡µ@µ€µ<¶€·(¹5»ˆ½#ÀèÂ×ÅåÈÿË-ÏXÒÕ¶ØâÛüÞâåè ëîíÁð‰óAöëøˆûþšzÒ& k ¦Úü".FBH;0!#%á&Â(*q,K.0ð1»35\7-9ü:Ë<ž>j@:BDÎE‘GLIøJœL$N™OçPR SÁS9TZTTtSQRªPvN§K;H2D‡?I:}47.Ž'— t> qý÷Fñïë$çõâKßDܵٷ×$Ö ÕCÔÛÓºÓÛÓ6ÔÂÔxÕRÖP×fØœÙãÚ@ܱÝ0ßÃà_â äÂå†çOé ëùìÒî°ð‰ò]ô(öé÷ù%û—üâýÿþäÿ…ßÜ´ÿ|þÇü’úá÷®ôñæìcè–ãŠÞdÙ2Ô&ÏCÊÃÅ£Á¾ »¥¸æ¶ÇµOµiµ¶;·Ó¸Ìº½ž¿^ÂGÅJÈgˌοÑéÔ Ø@ÛgÞ{áˆä‡ç{ê^í6ðÿòºõiøû›ý—þb¯ ÿ 5l–³Ï׿ÞßË ½"¡$ˆ&c(B*,í-Á/’1c3457Ó8¢:q@ÞA­CsE8GõH¤JKL×MPO§PÙQ×R£S"TXT-TšSRQìN;LòHE{@X;¨5z/ã(ù!ܬ |½þVøjòñìè»ãàÔÜ3ÚØqÖ;ÕhÔíÓ¿ÓÓÓ%Ô¤ÔVÕ&Ö ×.ØcÙÚÜeÝçÞràâ¶ãlå-çóèÆê›ìsîRð)òôÌõ÷;ù×úJü£ýÆþ·ÿhÌß•Þÿ½þýûløPõ¼ñµíEé‰äƒßdÚ4ÕÐ6Ë—Æo¶¾›»¹6·ôµ`µ[µìµü¶~¸fºŸ¼¿ÕÁ³Ä¶ÇËÊòÍÑPÔ}רÚÌÝààôãðæêéÏìªïvò5õá÷ˆúý£ÿŠë> Œ È +Jgs€vq X"G$&& (ã)½+‘-g/713Ù4§6x8F:<è=³?‡ANCEßFœHRJõKŒMOhPšQ©R}S TTT6T½SËRXQ[OÎL™IÙEbAh<Ë6¸03*X#Hì Ö‘ùŽóîÿè’ä¶àlݳÚ{Ø¿ÖwÕÔÔÆÓÍÓÔ‰Ô3ÕüÕîÖú×"ÙcÚµÛ"Ý™Þ$à¾áaãåÓæ—èkê:ìîñïÌñ¤óqõ6÷æø„úü`ýŒþ‰ÿE¸ß¢ôþvýoûóøðõqò…î"êzå{àfÛ0ÖÑ Ì|Ç3Ãj¿+¼†¹Š·(¶uµRµËµ¾¶1¸º-¼¡¾HÁ'ÄÇ3ÊUÍбÓàÖ Ú/ÝJàZã^æVé@ìïèñ°ô[÷ú˜ü&ÿŸqÐ \ ‘¿âý ú!è#È%¬'†)b+5- /Ü0°2{4P68ï9º;‹=\?'AùB¾D‰FDHüI£K=M¹N%P^QwRTSòSHT@TÚSÿR§QÉORMGJšFNBg=î7ð1+·$ª‚N>_×ú´ôïôélåpáÞ5ÛåØײչÔÔÏÓËÓÔsÔÕÕÕ¼ÖÇ׿Ø&ÚrÛÙÜPÞÔßoá ãÀäyæ@è êáë¸í’ïoñEóõÜöø3ú¶ûýRþVÿ"¢Ú°&/ÿÁýÚûoù‹ö!óLïÿêaæxá_Ü6×ÒÍ\ÈÿÃÀÁ¼ºß·i¶‹µTµ¬µ‰¶ã·¢¹¾»#¾ÅÀ”ÊƘɹÌãÏÓ@ÖpْܱßÄâÇåÅè®ëîañ%ôÖö…ùüªþ%˜þY§ ë %Qz”¨µ¶¸¨¡!#r%I'/)+Ý,®.„0Q2&4ò5Â7“9_;3=ÿ>Ï@BeD0FíG§IPKíLpNßO"QAR,SÖS9TITðS3SïQ/P×MçJ]G,Ch>9%3Ì,&ç¾› ¹üçõ&ðñêGæ3â²Þ½ÛUÙh×ôÕæÔ:ÔÚÓÍÓöÓ]ÔðÔ­Õ‘Ö‘×®ØæÙ1Û’ÜÞ†ßá¼âjä$ææç°é„ëZí5ïñåò¼ôö;øÞùkûÒüþ!ÿýÿˆÒºCcÿ þ>üëù÷Ñó ðÞëDçrâYÝ7Ø Ó Î>É×ÄÒÀe½€ºC¸§¶­µXµ‘µY¶™·G¹Q»ª½=À ÃóÅÉÌDÏwÒ¤ÕÑØøÛß+â3å3èëîÓðœóTöüøœû'þ¬ †å5 z ¸å.>UMYF>!(# %ó&Ì(©*‚,R.+0÷1Ê3˜5i779;×<¤>u@ABDÓE–GQIùJ¡L"N—OãP RýR»S#TNTT_S3RPRN…KH D]?!:R4.i'r X  eý÷Dñïë+çúâ[ßMÜÉÙÅ×9ÖÕZÔëÓÏÓìÓIÔÒÔ‡ÕeÖ[×yئÙñÚLܽÝ;ßÎàhâäÊåçUé)ëûìØî°ð‹ò\ô(öã÷‹ùûŠüÖýïþÏÿqÂÀ]ÿQþ™üdú¬÷{ôÊð®ì/è`ãXÞ5Ù ÔÏ'ʩŔÁ¾»ª¸í¶Öµ_µµ*¶X·í¸êº0½¿¿zÂeÅgȄ˧ÎÙÑÕ3Ø_ÛyÞ–áäœç‘êqíLðóÎõzøû­ý-¨rÁ F~ ÇÚéòîêÜ É"±$’&q(O*#,ü-Ì/ž1o3>57Ý8­:y@ëA°C}E>G÷H¬JFLÞMIO¨PÏQÓR•STHTT†StRçPÌNLÊHÞDP@1;~5Q/½(Õ!¾i i°þOøcòöìèÈãàåÜ?Ú)ØÖNÕ|ÔþÓÔÓãÓ7ÔµÔeÕ7Ö.×=ØoÙ¬Ú ÜpÝóÞzàâ¿ãuå3çúèÊê¡ìxîRð.òýóÏõˆ÷8ùÌúCü“ý¹þ¢ÿS°Åp½ÿ‘þõüÔú:øõ†ñ~íéPäTß3Ú ÕõÏËÆX®¾“»¹:·¶lµuµÿµ·—¸†º»¼<¿óÁÐÄÔÇæÊÎ7ÑkÔ•×ÁÚãÝøà äçêâì¿ï‰òEõ÷÷—ú-ý±ÿ.—þM Ö 7[u‹‡| h"S$4&(ï)Ë+-t/C13ä4²6„8O:#<î=À?ŒAZCEæF¢HSJûK‰MO`PšQžRrSÿS?T(T¢S³R:Q=O¨LxI­E=A;<¢6‘0 *7#$ùÍ Ëúÿù„óîé–äÅàwÝÄÚ‹ØÏÖ‹ÕžÔÔÚÓßÓ&ÔœÔ@ÕÖýÖØ1ÙoÚÃÛ.Ý£Þ0àÆámãåÚæ¡èlêEìîõïÍñ£óqõ2÷áø~úöûTý|þwÿ/¡ÀƒáÿÎþIýAû¾ø»õ<òJîñé>åMà2ÛÖîÐÌ^Ç!Ã\¿#¼‹¹‹·7¶…µeµåµ×¶L¸ºK¼½¾jÁ@Ä>ÇMÊsÍšÐÎÓøÖ&ÚFÝaàqãtækéVì0ïÿñ¿ôq÷ú­ü4ÿ´ ˆÙ- f ¤Íò  &+& "÷#Õ%¹'•)j+H-/í0·2Œ4W6*8õ9È;“=e?2AÿBÇDFHHJ¥K=M»NP[QoRISæS7T-TÅSåRŒQ§O/M$JoF(B;=Å7Æ1Z+$‹a6'PÊú±ôïúéoå{áÞBÛùØ!ׯÕËÔ0ÔâÓÞÓÔ…Ô ÕåÕÍÖÔ×÷Ø/Ú‚ÛæÜZÞâßuáãË䀿Jèêèë¼í—ïqñDóõÖöø(ú°ûýBþGÿ º“ÿ—ý§ûCùRöîòïÉê,æBá.Ü×èÑñÌ?Èìà À»¼ºæ·p¶žµdµÄµ¢¶¸¾¹Þ»@¾åÀ±Ã¬Æ²ÉÚÌýÏ/Ó^Ö†Ù¯ÜÈßÚâáå×èÈë¢îwñ6ôîö’ù.ü¸þ9©i· û 5bŠ¢¹ÁËÀ½©!“#~%W';)+è,½.Ž0b2.46Ì7ž9l;;= ?×@¥BnD3FõG¨IUKíLpNÚOQ9R#SÈS+T3TÞSSÕQ P³MÅJ0G C6>å8õ2§,ç%ðÊžŠ ¢üÝõ%ðòêNæ:âÀÞÉÛhÙz×ÖúÔKÔïÓßÓÔpÔÿÔÀÕÖ¢×¼ØóÙ@ÛÜÞ“ß&áÆâsä+æíç¸éˆëaí6ïñæò»ô}ö8ø×ùbûÉüþÿãÿt³š"8ÿâý ü»ùìö˜óØïžëç5â.ÝØèÒàÍ&ɹÄÈÀX½ºE¸±¶¼µiµ«µo¶¹·b¹r»Ç½_À$ÃÆÉ;ÌbÏ‘ÒÁÕéØÜ.ßBâMåCè8ëîìð®óhöù¯û8þ¾0™õG ‰ Èö=O`acWL!5#%ÿ&Ü(¶*Œ,e.002Õ3¢5x7@9;ã<«>€@IBDÝE™GVIÿJžL$N”OßPR÷RªST5TóSBSRlP3N^KðGßC6?ó9,4ä-D'O 6ï øZý ÷@ññë1çãgßZÜÛÙÔ×OÖ'ÕoÔýÓàÓÔYÔäÔšÕqÖp׃ظÙúÚ]ÜÄÝKßÕàuâäÓå•ç]é-ëíÙî¶ð‰ò^ô#öÞ÷ˆùû…üÄýßþ½ÿV© 9lÿ%þmü0ú|÷@ô˜ðrìûç)ã'ÞÙàÓØÎ ÊŽÅ†Áø½»ª¸ö¶äµqµ–µC¶t·¹ »N½Þ¿šÂ‚ŇȡËÅÎóÑ#ÕLØxÛ”Þªá¶ä²ç¤ê‰í\ð)óàõŽø*û¿ý?º!Ó  Vޝ×çúþÿùé ×"¾$¢&~([*0, .×/®1x3M57ë8µ:‡"@ïA»C‚EBGÿH©JNLØMMOŸPÍQÆRŒST2TTgS\RÈP§N÷K¡H¶D'@;U5)/“(´!šrP W þIø[òùìèÒãàñÜQÚ8Ø–Ö`ÕŽÔÔåÓöÓIÔÇÔuÕIÖ:×PØxÙ¿ÚÜ‚ÝúÞ‰à!âËã}å:çéÌêªìxîXð-òþóÍõ…÷1ùÆú4üŒý£þ’ÿ:˜¥P”ÿkþÃü¥úøåôPñFíÙèä ßÚÜÔÒÏñÊjÆE¢¾»¹E· ¶‚µ„µ¶1··¸¡ºÛ¼\¿ÂðÄñÇË-ÎTÑ…Ô±×ØÚþÝá"äçêöìÔïœò[õø­ú:ýÉÿ:­ ` « é Lg…’›œ˜… {"]$E&!(þ)×+ª-€/N1#3í4Á6Ž8Z:/<ö=Ê?•A_C*EêF¥H]JôK’MÿNaP‘Q˜ReSôS.TTS”R QO‚LVI€EA<{6e0æ)#Ú· ²ðÿ‚ùóîéŸäÍà…ÝÓÚšØäÖšÕ´Ô+ÔéÓõÓ4Ô°ÔQÕÖ ×Ø>Ù~ÚÐÛ7ݲÞ9àÑávã'åáæ©èrêJìîùïÍñ¥ónõ.÷ÝøtúðûCýpþaÿ„¥a¼ÿ¨þýûŒø†õòîºé åàÛÜÕÈÐâËAÇÃI¿#¼„¹—·B¶“µ~µ÷µö¶g¸=ºi¼Ü¾‡ÁbÄXÇmÊÍ¸ÐæÓ×=Ú_Ý{à‡ãŠæ„éfìHïòÒô†÷&úÀüEÿÄ2—í9 y ²Ü/3=0, "$å%Å'¡)|+N-&/õ0Æ2•4e618:Í;¡=m?:ACÎD“FQHJ¬K:M½NPVQjR=SÛS%TT¬SÍRlQ‹O MþIJFýA=˜7¡12+l$kB!B¿ú¬ôïûéxå…á&ÞSÛÙ6××ÕßÔCÔôÓòÓ%Ô˜Ô/Õ÷ÕÚÖä×Ù=ÚÛîÜiÞë߀á"ãÑ䉿Qèêíë¿í›ïpñFóõÓö‰ø#ú¤ûý4þ2ÿøÿp¢oàÿßþiý€û ù&öµòÞî“ê÷å áÜÙÖÃÑÎÌ%ÈÖÃÀ²¼ºì·z¶®µzµØµÀ¶¸Þ¹ú»_¾ÁÐÃÆÆÒÉóÌÐIÓuÖ¢ÙÄÜàßïâøåëèÞë´î‹ñIô÷¤ù?üÊþH»}  >u•´ÅÓÒÕÆ¹!¢#‡%h'G)+ù,Å.ž0i2>46Ü7¥9v;F=?å@§ByD8FøG¯IUKîLqNÕOQ0RS¿ST%TÃSS¶QðO‘MžJGÝB>º8Í2,Å%˱€x üÔõ&ðòêUæFâÇÞßÛsÙŒ×Ö Õ^ÔÔìÓ Ô|ÔÕËÕ±Ö®×ËØÚKÛ¬ÜÞŸß0áÐâ{ä4æóç¾éëaí@ïñêò¹ôyö5øÎù[ûºüúýÿÐÿ[—}ÿÿÿ¹ýÞûŒù·ögóŸïoëÜæâøÜÜ׺ÒÃÍɤĻÀN½~ºI¸»¶Ëµ~µ¼µŽ¶Ï·‚¹»æ½{ÀFÃ/Æ?ÉR̂ϨÒÚÕÙ'ÜIßVâbåZèMë&îñ¼óöùÂûHþÐ@ªT Ó *K_lrngX!D#(% 'è(Ã*œ,k.C02ä3­57J9;è<¸>‡@QBDáEŸGZIKžL'NOàPùQðRŸS T$TÞS(SRMPN:KÈG¹C ?Ë94¿-'0 ïÓ ìKý÷>ñòë6ç ãsßiÜéÙé×[Ö?Õ~ÔÔõÓÔnÔòÔªÕ‚Ö|×’ØÄÙ ÛgÜÑÝTßÞà€â&äÛåžç_é6ëíßî¶ðŒò\ô"öÛ÷ù ûxü·ýÑþ¥ÿBŽEÿüýBüúH÷ô^ðBìÂç÷âöÝØØ·ÓµÎìÉxÅuÁ𽻬¸ÿ¶òµƒµ¬µZ¶·'¹%»n½ù¿ºÂŸÅ£È½ËáÎ Ò>Õdؑ۩ÞÄáÈäËç·êœísð9óôõžø>ûÍýSÈ1’â + i˜Ãâö ù ä"Ê$®&(c*A,.å/¸1‡3U5&7ñ8Â:<]>-@öAÃCˆEHGI­JOLÙMIOPÆQ¿R€SùS"TñSRSARªP‡NÒK|HDý?Û:,5þ.p(!|U9 D“þ>øZòõì èÔã#àûÜ`ÚIاÖsÕ¡Ô%ÔöÓ ÔZÔ×Ô†ÕXÖI×]؈ÙÈÚ#ÜŠÝß•à)âÕã„åAç éÒê¯ì{î[ð-òôÉõ÷.ùºú1üxý˜þ~ÿ#€†-sÿ>þšüuúÔ÷´ôñí£èçãñÞÑÙ¶ÔªÏÓÊSÆ.›¾…»¹I·¶“µ˜µ6¶J·Õ¸¼ºú¼y¿0 ŠÈ#ËEÎrÑÔË×òÚÞ(á5ä6ç'êíçï¯òpõø¾úOýÖÿQ· o º û *Zy¤¦­¡™ „"m$S&,(*á+¸-Œ/\1-3ý4É6š8e:8<>Õ?›AjC-EóFªH^JûKMO\P‹Q“RYSéSTTuS~RQûNbL+I^Eè@é;M6>0½)è"幟 žÜÿ{ùxóî é¥ä×à’ÝßÚ¬ØóÖ­ÕÅÔ<ÔýÓÔFÔÀÔdÕ+Ö×"ØNÙ‹ÚÛÛFݹÞGàÙáã-åìæ¬èêJì$îûïÑñ¤óoõ*÷Úømúæû:ý_þRÿo…C—ÿþðüãú[øTõÏñßí‚éÕäçßÒÚ±Õ¡ÐÁË(ÇúÂ@¿¼‡¹™·Q¶ µ”µ ¶·‚¸]ºƒ¼þ¾¥Á€ÄwNjʧÍ×ÐÿÓ/×VÚwÝ’àžã¢æ•é€ìYï(òåô—÷<úÏüZÿÔE¥þJ ‰ Áì*<CJ?: $"$ö%Ð'³)„+]-2/1Ò2¡4p6=8:Ù;«=u?FA CÚD•FXHJ­K>M»NPSQ_R6SÎST T’S¶ROQgOíLÒI&FÒAè@YB&DæE©G\IK¡L"N“OÔPûQàR—SúSTÄSSßQ1PíMK¢GŒCá> 9Õ3–-ò& ôμ Õ;ýþö6ñóë9çãßsÜúÙ÷×nÖRÕÔ(ÔÔ(ÔwÔ ÕµÕ–ÖŠ×¢ØÒÙÛuÜÞÝ_ßìà†â5äáå§çgé:ë íâî¹ðŽòZô#öÕ÷|ùûnü«ý½þ–ÿ'tc÷ÿÿÔýüÓù÷Úó'ðìç¿âÄݤØÓ‹ÎÐÉ\ÅbÁæ½úº²¸·¶–µ¿µy¶¤·I¹A»½ÀØÂ¾ÅÄÈØËÏ(ÒXՂبÛÅÞÜáàääçÌêµí…ðOóö³øPûãýbÛE ö : w¬Ñò!ò"Ü$¹&ž(q*N,".ð/È13c507þ8Ì:›6@BÉC“EKG I±JQLÙMHOšPÀQ¶RvSèSTÛS;S$RŒPeN­KVHdDÒ?°:ÿ4Ö.E(g!Z5 .þ3øRòöìèÞã(à ÝmÚZضֆղÔ9Ô ÔÔiÔëÔ–ÕfÖ\×hؘÙÕÚ/Ü–Ýßà6âÛãŽåLçéÜê°ìƒî]ð/òôÇõ€÷'ùµú$ümý‡þmÿ gg LÿþnüEú ÷ôáðÛìkè´ã¸Þ§Ù…ԆϳÊ5Æ!‰¾…»¹S·&¶¥µ®µN¶f·ò¸Üº½š¿MÂ/Å,È@ËbÎѸÔè× Û-Þ@áPäHçAê#íúïÇòõ1øÎúcýæÿcË0 Î >i‡¤®»·µ¥ “"{$_&=(*î+Ç-—/i1:35Ù6¡8t:?<>Ú?¨AoC8E÷F²H^JLŽMOXP‰Q‡RRSØS TíS\ScRáPÚNÿíÿWg#sÿTþÅü²ú*øõšñ¥íKéžä²ß ÚƒÕzÐžË ÇäÂ4¿¼Š¹œ·[¶³µ¥µ)¶'·¢¸vº§¼¿ÅÁŸÄ˜Ç¤ÊËÍíÐÔL×lږݦà·ã¹æªé™ìkï>òùô«÷NúãüjÿéT· X œ Òû"8JWSRG 1"!$þ%ã'¼)•+i-@/1à2­4|6K8:é;°=ƒ?LACÜD¢FXH J­K?M¹NPMQXR,S¿STõSS˜R4QFOÉL°IúEªA½ÁÄÇÊ,ÍSÐÓ«ÖÕÙùÜà#ã"æéìáî³ñqô(÷ÉùhüëþpÙF˜ë ) f·ÓâôððæÒ!À#¤%„'b)7+-à.¹02W4 6ñ7¾9‹;[=#?õ@»B…DHFH·I\KñLpNÒOQ%RS¥SüSýS›SËR€Q®OMMPJÁF†BÀ=^8|2*,u%†jMC nèûÇõð÷ê[æWâÝÞøÛ‘Ù°×:Ö0Õ…Ô&ÔÔ>Ô¤Ô3ÕîÕÑÖÈ×îØÚiÛÃÜ3Þ·ßDáåâŽäDæèÎé—ëqíAïñêò¸ôwö*øÅùHû¥üÝýÝþ¬ÿ&e8»ÿÄþbý‚û(ùOöûò/ïëlæ á‘Ü€×fÒ|ÍÉÈxÄ—À<½yºP¸Í¶éµ¢µëµÂ¶¸Ä¹Â»*¾¸ÀƒÃqÆuɓ̷ÏäÒÖ:Ù\ÜvߌâŒå‹èvëTî(ñêó£öGùæûoþòfÊ)u ½ ÷$NgŠƒw!^#H%&')à*²,‰.[0(2ü3Ç5•7f9/;=Ê>š@bB+DïE¬GaI K¡L%NŽOÓPñQÜR†SñSýSµSøRÇQPÊMñJyGcCº>r9¯3k-Ê&éÍ·¡ Ä,ýôö3ñóë;çã…ß„ÜÚØ€ÖcÕ¡Ô;ÔÔ8ÔÔÕËՠ֞׬ØãÙ!Û‚ÜêÝjßöà‘â<äêå¯çméAëíèîºð‘òZô öÓ÷sùýú_ü ý¬þ€ÿUGÑÿùþ¨ýãû¡ùàö¥óðïÒëUçŒâÝzØaÓmάÉJÅNÁÞ½öº´¸· ¶ªµÖµ¶Ä·b¹a»­½6ÀùÂÜÅàÈøËÏFÒrÕœØÁÛßÞïáýäòçêêÂí ð_óöÆøbûóýwëV² K ‰¹â'(-!ý"ë$È&©(‚*X,..0Ð1Ÿ3n5;7 9Õ:§>@ BÒC–EVG I¹JPLÜMFO•PºQ¯RiSÞSþSÈS!S RlPEN‡K/H:Dª?†:Ó4®.(D!8 tþ)øNòôì#èäã5àÝÚeØÍÖ’ÕÌÔEÔÔ.Ô{ÔýÔ¤ÕxÖj×zؤÙåÚ:ܦÝߪà?âæã˜åQçéâêµìˆî^ð3òþóÉõx÷%ù«úü`ývþXÿõÿLIêÿ%ÿìý@üúm÷Hô¯ð ì8èzã‰ÞvÙ[Ô`Ï“ÊÆÂ}¾€»¹Z·4¶µµÄµf¶·¹ùº9½¶¿nÂLÅIÈ_Ë~ΪÑÔÔØ$ÛGÞUáhä_çUê:íðÚò”õBøâútýûÿoâ:– Ù Nu›­ÃÅÉÀµ  "‹$j&L(&*ý+Ó-¦/s1I35å6®8|:L<>å?¯AxC×AØjÙ¥Ú÷Û\ÝÓÞZàðá’ã@åýæ¼èˆêXì,îðØñ ónõ#÷Ïø_úÒûýBþ)ÿÜÿ7OþÿPÿ+þ—ü†úò÷îô]ñví éqäwßyÚQÕWÐ|ËõÆÑÂ%¿ ¼†¹©·d¶Æµ¹µA¶B·½¸–ºÅ¼8¿çÁºÄ¶ÇÅÊäÍ Ñ9Ôc׉ڬݿàÎãÐæÁé«ìƒïQò õÂ÷\úøü{ÿùfÉ j « à 0G\ag^U @"-$&î'Ë)¡+x-I/1ê2»4ˆ6S8':ì;À=ˆ?UA CäD§F^HJ¯K@M¹NPIQOR"S³SöSàSlS{RQ%O¥LˆIÖE|A•<71»*÷#äÏΙú˜ôïê‡å áJÞ}Û3Ùl×ÖÕvÔ/Ô%Ô_ÔÇÔeÕ$Ö ×Ø/ÙgÚ³Û݇ÞàŸá>ãî䡿fè+êþëÍí¥ïyñFóõÍöyøú‡ûÝü þúþ»ÿ%Nuÿgþèüòúxø…õò7îñéTåuàlÛUÖHÑkÌÐǘÃÔ¿¼ü¹û·œ¶Úµµµ ¶ ·n¸7ºS¼¿¾[Á0ÄÇ/ÊEÍtЖÓÊÖìÙÝ)à6ã:æ2éì÷îÆñ„ô;÷ÝùvüÿìV©û ; q¥Àæïüôâ!Ë#²%'o)F+-ð.À0“2]4/6ú7É9—;a=1?ú@ÆB‰DQFH¾I\KóLpNÎO QRûR™SíSèS‡S±RdQO(M1J“FcB“=68U2ÿ+S%`P/0 ]ÚûÃõðûê_æaâèÞÜ ÙÂ×JÖFÕ“Ô;Ô&ÔPÔ´ÔCÕÖÜÖÞ×óØ+ÚsÛÍÜEÞ¹ßVáéâšäIæèÍé¥ëníJïñíòµôwö#øÁù<û›üÍýÎþ’ÿC”ÿžþ8ýVûøøöÇòûîÉê;ægágÜO×AÒYÍ­ÈeÄ…À8½rºY¸Ó¶úµ´µ¶Ú¶!¸Ú¹é»A¾ÙÀ¢ÃŒÆ”ɯÌÑÏÓ)ÖPÙx܋ߤâ¢å è‰ëiî<ñüó·öWùúû€þsà5Š Ê 5Zz‹›œƒ!m#S%4')ë*À,–.e0824Ô5 7n9>;=Ø>Ÿ@lB1DöE±GgI K¤L$NŒOÏPêQÒR{SáSìS¢SÜR²QìO¯MÈJVG;C>K9ƒ3C-§&²˜Œ ²ýìö/ñóëBç!ã“ßÜÚØÖxÕ±ÔMÔ'ÔHÔ Ô&ÕÚÕ²Ö¨×ÁØéÙ4Û‰Ü÷ÝußáâAäöå²çwéFëíìî½ðò[ôöÏ÷oùñúVü‘ýœþmÿûÿ<'°ÿÕþ|ý»ûnù±öqó»ïë çYâbÝJØ<ÓIÎÉ5Å<ÁÕ½ôº·¸·¶¹µëµ©¶Ý·€¹|»Ë½VÀÃþÅúÈÌ5ÏbҌյØÚÛôÞ âå èüêÙí±ðtó/ö×øuûþ‡þeÄ [ ˜Èò%5990#! #ö$Ö&¶(Ž*f,<. 0à1§3{5G79ã:¬<|>F@BÙCœE[GI¹JULÙMCO”P°QªRZSÑSîS²S SîQOP$NeKHD?\:­4….÷'"!ÿì dþ"øHò÷ì$èïã<à%ÝŒÚyØÛÖ¨ÕÙÔ]Ô.Ô?ÔŽÔ Õ·Õ†ÖzׇزÙñÚEܱÝ)ß±àKâîã åYç éåê½ìŠîbð2òôÄõx÷ù¤úüTýfþEÿßÿ1*ÌÿÿþÄýüäù>÷ôyðlìèHãWÞGÙ5Ô9ÏxÊÆÂq¾~»¹`·C¶ÃµÜµ|¶·)¹»Q½Û¿†ÂoÅcÈ}˘ÎÇÑìÔØ>ÛZÞsávä|çfêOí#ðìò¨õRø÷úƒýðN¡ ì )]‡¦ÀÎÖÖÎà ¯"–$|&V(3* ,ß-°/„1N3"5ì6º8‡:Tî?¶A‚CCEG»HdJLMOPP|QxR=SºSíSÀS3S+R§P™NôKºHâDp@c;Ô5½/G)|"ydN _¯ÿWùgóûíéºäðà¹ÝÛߨ&×âÕþÔrÔ6Ô:Ô~ÔñÔ–ÕZÖL×PØxÙ²ÚÜiÝÞÞeàùážãGåçÂèê]ì/îðÖñ¦óiõ#÷ÈøYúÇûý3þÿÁÿ$,äÿ'ÿþlüXúÃ÷¹ô,ñ<íßè5äOß@Ú/Õ.Ð^ËÛÆ¾Â¿ ¼…¹±·m¶ÙµÌµZ¶Z·Û¸¯ºç¼S¿ÂÙÄÑÇäÊûÍ-ÑOԀסÚÃÝØàããææÕéÂì–ïdò!õÏ÷uúýÿxÙ/ y » ð@Uiqrob P"8$&ü'×)¯+…-T/+1ó2É46a8-:ú;Ç=“?^A&CìD¬FdHJ±KDM³NP@QJRS£SèSÍSSSfR÷P O|LiI§EYAi<ò6ö0’*Ô#߯²¼ú’ú‹ôïêåªáSÞÛCÙ{×Ö*ÕŠÔAÔ8ÔnÔÜÔqÕ9Ö× Ø:ÙxÚ¼Û'Ý‘ÞàªáHãöäªækè4êÿëÖí¤ï{ñJóõÎörø ú}ûÕüöýïþŸÿ-òÿOÿ?þÀüÁúFøUõßñîºéåBà=Û'Ö#ÑH̳DžÃÅ¿–¼þ¹ý·¨¶èµËµ4¶&·‰¸Rºt¼Ú¾~ÁLÄ>ÇIÊdÍдÓãÖÚ*Ý?àNãQæFé3ìïÝñ—ôM÷òù†üÿŽe¹ H …¯×î   ð!Ú#À%ž'{)T+'-þ.Ì02k4:68Õ9ž;o=7?AÉB–DSF HÁI^K÷LkNÎO QRõR‰SÞS×SpS˜RIQmO MJmF:Bh= 8(2Ù+)%@+ MÍû¶õðöêfægâõÞܲÙÎ×^ÖVÕ§ÔNÔ5ÔfÔÁÔXÕ ÖðÖé×Ù7ÚÛÝÜLÞÉß]áôâ¤äPæèÖé©ëtíMïñïò´ôtö øºù5ûŽüÀý½þÿûÿ(þÿsÿvþý&ûÈøéõòÈîêæ3á7Ü"×Ò5Í’ÈMÄxÀ,½uºY¸á¶¶Åµ¶ð¶@¸õ¹¼a¾øÀ¿Ã«Æ²ÉËÌîÏÓCÖnًܨ߶â½å´èŸëîOñôÉölùü—þ‹ëI— Û An†¨«ªŸ‘!z#a%C')ù*Í,¢.r0E24à5¬7x9G;=Þ>¬@pB=DøEºGgIK¤L#N‹OÉPäQÈRoSÒSÚS‰SÈRŽQÕO†M¨J,GCc>#9V3 -|&¢r ¢ýäö,ññëHç(ãŸßœÜ'Ú)ؤքÕÉÔ[Ô<ÔYÔ±Ô7ÕìÕ¾Ö»×ÍØùÙAÛ”ÜÞß á¤âNäûå½ç|éKëííîÀðò]ôöÍ÷eùìúJüƒý‹þYÿãÿ!Žÿ«þVý‰ûCùzö=ó„ïgëêæ&â.ÝØÓ(ÎpÉÅ0Áƽõº·¸"·&¶Îµ¶Ã¶ø·›¹ž»æ½yÀ0ÃÆÉ/ÌWÏxÒ«ÕÌØóÛß â(åèëîíÅðŠó>öïøƒûþ—wÓ& k ¨Ø4DHFA-!#%æ&Ã(™*v,E.0ê1µ3†5R79î:·<‡>N@BáC¢EbGI¾JUL×MGOˆP³Q™RUS¾SßSœSõRÐQ4PþMBKáGìCU?2:ƒ4X.Õ'÷ úßÕ óYþøIòïì.èðãKà.ÝžÚ†ØïÖ¹ÕêÔqÔ>ÔSÔžÔÕÈ՗ևחؾÙÿÚVܸÝ7ß»àUâøã§ådç#éðê¾ìîfð2òô¾õy÷ù úüEýYþ/ÿËÿ¥ÿÞþ˜ýëû³ù ÷ßóCð6ìÌçã(ÞÙÔÏ[ÊêÅìÁh¾x»¹f·Q¶Ôµôµ“¶¸·E¹5»u½ó¿«Â‡Å…Ș˷ÎáÑ Õ3ØWÛvÞ…á”ä‹çêaí9ðÿò¼õføû—ý”`² û :j˜´ÐÛæâÞÐ ½"¤$‡&d(B*,î-½/Ž1]3+5ù6Ä8’:^<*>÷?¿A‡CJE G»HmJLMþNKPxQnR2S¬SÛS®SSRŠPuNÔK’H¼DD@?;£5›/)Z"YF8 J¢ÿJùfó÷íé¿äþàÄÝÛíØ9×öÕÕ†ÔGÔKÔ“ÔÿÔ¨ÕkÖX×b؄ٿÚÜqÝìÞnàâ¥ãRå çÌè“êdì1î ðÔñ¦óhõ÷ÆøLúÁûý"þÿ¬ÿ¾ÿÿÞý=ü(ú’÷€ôûðí¬èþãßÚÕ Ð>ËÁÆ­Â ¿¼‰¹µ·}¶çµãµp¶x·õ¸Ðº½t¿%ÂöÄóÇüÊÎBÑmԙ׸ÚßÝëàäöæòéÑì®ïvò4õã÷…úýÿ„í? ‰ Ë *Odx‚|p ^"E$,&(ç)º+“-a/613Õ4š6o84:<Î=?fA-CóD±FhHJµK@M¶N P²@|BADF¾GjIK¤L%N†OÅPÝQ¿RcSÃSÇSvS­RtQ³OeM‚JGìB9>ù8-3ô,Y&zu]_ ŒýÙö+ñðëNç2ã¥ß¯Ü1Ú=Ø´Ö˜ÕÛÔnÔNÔjÔÄÔHÕüÕÏÖË×ר ÚGÛ§ÜÞŒßá¯âUäæÃç„éQëíóîÁð•òWôöÃ÷dùàú@ütýzþDÿÌÿçÿnÿþ.ýZûùHöóMï1ë±æôáüÜï×êÒþÍYÉÅÁÀ½ïº¿¸(·8¶Üµ¶×¶¸¶¹½»¾–ÀRÃ9Æ8ÉOÌoÏ™ÒÁÕêØ Ü'ß6â>å7è&ëîÙðœóUöýø›û(þ«‰å5 } ·ç.CSTYJA!)#%ó&Î(¨*ƒ,P.'0õ1À3–5Y7.9õ:Ã<Ž>Y@"BèC«EdGI¾JYL×MDO†P©Q“RES´SËSˆSÛR¶QPÞMKºGÃC.?:[4..­'Ö Öý ßJþ ø?òõì,èýãQà=ݬږØ×ÉÕÕÔRÔeÔ­Ô2ÕÓÕ«Ö”×§ØËÙÛ\ÜËÝ<ßËà^âÿã²åhç-éöêÁì–îdð8òþóÁõr÷ ù™ú÷û9ýHþÿ³ÿýÿîÿˆÿ³þrýºû†ùØöªóðüëšçÝâöÝéØâÓðÎ9ÊÕÅÖÁb¾p»#¹n·]¶èµ¶¯¶Ñ·c¹T»½ÀȨŢȶËÒÎþÑ"ÕPØmÛ’Þ›á­ä ç—êwíKðóËõ|øû©ý0¦t¾  F|§ÅÝîï÷éà Ê"²$•&s(N*",ú-Ç/ž1f3957Ó8š:m<1>@ÉAŒCVE GÇHjJ LMûNKPnQhR&SSÌS˜SS÷QiPXN«KqHŽD @ ;€5k/ú(0"9& 6‘ÿ@ù_óöíéÅäáÏÝ)ÛûØL×Ö$Õ—ÔZÔ_Ô ÔÕ´Õ}Öi×mØ—ÙÈÚ!Ü|ÝùÞvàâ«ã]åçÕè–êkì5î ðÙñ¥ógõ÷¿øFú¶ûøüþôþ“ÿïÿõÿšÿäþ®ýüôùa÷NôÂðÎìrèËãèÞåÙÖÔäÏ˨Ƙ¿ý»‰¹¼·ˆ¶øµ÷µˆ¶’·¹ìº$½‘¿CÂÅ È Ë5ÎbчԳ×ÔÚõÝáäçêêì¿ïòGõ÷÷™ú*ý´ÿ+›úQ š Û <]uˆŒ“ˆ k"V$5&(ï)É+ -m/D1 3à4¨6w8C:<Ú=¤?qA3CýD³FrHJºK@M¶NP8Q8RSŠSÅS¨S$S2R½PÇN9LI\EA<œ6¤0A*Š#š‰€Ýwú‚ôþî ê•åÀáiÞ«ÛaÙ ×?ÖNÕ¯ÔfÔ[Ô•ÔûÔ—ÕTÖ;×;ØXÙ’ÚØÛ<Ý«Þ,àÁáYã广{è@ê ìÚí¯ï|ñKóõÃömøøùnû·üÝýÆþuÿáÿðÿ³ÿÿòýgüdúå÷êôwñ”íPé²äÞßÜÚÐÕ×ÐÌ€Ç[ë¿‹¼ø¹¸º¶ ¶ðµc¶Z·Á¸Žº°¼¿¹Á‹ÄxÇ…ÊžÍÅÐéÓ×7Ú\Ýpà|ãæréZì4ïò¿ôs÷úªü:ÿ®%…Ý* j £Ðó ).' "ø#×%½'“)p+@-/â0¹24S68ë9´;€=O?AáBDdFHÊIbKøLjNÈOýP RÝRrS¼S²SASiR Q/OÃL½IFæA=·7×1‰+Ý$úîàë'¶û¥õðõêvætâß-ÜÐÙòׂÖyÕÎÔqÔ\ÔˆÔçÔuÕ3Ö × Ø!ÙQÚ™ÛöÜaÞåßjáã°äfæ!èåé±ë‚íNï%ñêò·ôköø©ù%ûwü ýþPÿÎÿîÿ¿ÿ,ÿ(þ¹üÊúfø‚õ&ò[î#êŸåÊàØÛÈÖÌÑïÌ]ÈÄ^À½qºc¸ô¶%¶îµG¶$·u¸2º@¼Ÿ¾5ÁûÃéÆìÉÍ)ÐNÓzÖ Ù½ÜÙßåâèåâèÉëªîvñ8ôîö”ù,ü»þ4¬j· ý 4e‹¤¼ÄËǼ­!˜#{%]':)+ê,º.Œ0[2)4ö5Ã79[;'=ò>»@ƒBGD FÀGsIK¦L%NOÆPÑQ¸RWS²S¸S]S—RXQ“OCM]JÞFÄB>Ï83Ì,4&TVBF |óüÖö ñøëKç<ã±ß¸ÜEÚIØÇÖªÕëÔ‚Ô_Ô|ÔÕÔXÕ ÖàÖÖ×ìØÚ[Û®ÜÞ”ß!áºâ\äæÈçŒéVë"í÷îÁð˜òUôöÀ÷]ù×ú5üfýjþ/ÿµÿëÿÊÿIÿ_þý0ûáøöÓòïûêæ¾áËÜÅ׿ÒßÍ9ÉìÄÁ³½ðº¾¸4·D¶óµ,¶ö¶-¸×¹Ø»%¾´ÀqÃVÆVÉǩϳÒÛÕÙ#ÜAßLâWåKè>ëîïð®ókö ù°û9þ¼2—÷E Œ Çø?QbdfZM!8#%'Ý(¶*‹,b./02Î3›5k739;Í<•>g@%BóC­ElGIÁJ\LÓMEOP¤Q‹R8S¦S·SwSÀRŸQðOÂMõJ—G—C?Ý9.4 .'µ ³¨¥ Í:þø8òöì/èä\àKݶڬØ×ßÕÕ”ÔbÔyÔ¿ÔBտն֧ײØÜÙÛmÜÔÝIßÕàdâä¶årç3éùêÊì—îhð9òýóÀõl÷ ù‹úñû+ý5þ ÿ™ÿâÿÒÿcÿ‘þGýûVù¤özóÕïÌë`ç¬âÂݽطÓÍÎʼÅÈÁT¾o»"¹y·g¶ýµ¶Ë¶ç·„¹k»´½/ÀéÂÄÅÁÈÒËðÎÒ@ÕgØŠÛ¥Þ¶áÂä·ç¯ê‡ídð'óâõŽø+û¼ý@¸ ƒÓ  ZЏÒïøûë Ú"¿$£&~(]*.,.Ö/§1v3@57Ú8§:s@ÔA’C]EGÍHkJ LŒMúNHPhQ_RSSºS†SêRÝQLP6N‰KIHiDó?æ:T5D/Ò( " !€ÿ8ùVóøíéÏä áÞÝ5Û ÙZ×Ö1Õ­ÔjÔrÔ±Ô'ÕÃÕÖuר ÙÚÚ)ÜŽÝþÞ‡àâ¸ãeåçÜèênì;îðÚñ¦ócõ÷µøBúªûëüþÞþÿÔÿ×ÿ|ÿ¼þŠýéûÇù0÷ôð–ì@è—ã¸Þ¶Ù­Ô¾ÏþÊÆ…Âö¾ø»‰¹Ä·“¶ ¶ ¶Ÿ¶¬·,¹ »<½´¿^Â6Å*È<ËSÎ~Ñ¡ÔË×ðÚ Þ#á&ä*çêÿìÖïò^õø«ú?ýÂÿA¨^ ® ç "Goƒ–œŸ— y"c$D&%(þ)Ô+­-y/O13é4´6‚8M:<æ=ª?}A7CE»FrHJ¸KCM²NP0Q3RøR{S¸S‘SSRžPªNL÷H1EÞ@ë;s6~0*j#tqbÇqúwôïê¢åÂázÞ´ÛuÙ«×SÖ_ÕÁÔyÔlÔ¦Ô Õ§ÕdÖH×LØdÙŸÚäÛIݵÞ9àÈádãåÁæ‚èFêìáí¯ï€ñJó õÅöbø÷ù_û¯üËýµþaÿÅÿØÿÿãþÊý<ü5ú¶÷´ôFñ^íéƒä§ß°Ú¦Õ°ÐçËdÇHÞ¿…¼ø¹¸Å¶¶¶x¶v·Û¸¬ºÍ¼5¿ÚÁ¤Ä›ÇŸÊ»ÍáÐÔ2×PÚt݇à“ã•æ†érìFïòÔô…÷)úÀüEÿÅ1˜í; y µÛ28;7+ "$ç%Ç'¡)|+M-$/ð0Â2Ž4\6)8ò9À;‰=V?AäB¨DeFHÆIlKòLnNÂOúPRÐRjS©S¢S,SMRñPO LšI÷EÁAé<‘7«1b+¸$ØÏÅׯû›õðúêwæâß>ÜÜÙؑ֌ÕßÔ‚ÔpÔ–ÔúÔ…Õ@Öר-Ù`Ú¦ÛÝpÞéß}áã¾äkæ*èêé¸ë‚íUï$ñìò¶ôiöø¤ùûoü’ý‰þ@ÿ±ÿØÿ ÿÿþ‹ü ú4øQõòñ'îîékå™à©ÛœÖ¦ÑÎÌBÈ ÄMÀ½nºj¸û¶6¶ÿµ^¶=·‘¸Lºa¼»¾TÁÄÇ Ê"ÍBÐlÓ‘ÖºÙÖÜðßýâÿåöèàë¼îŠñNôþö¨ù=üÌþG¼zÈ Ds™µÈÔØÔʺ!¤#Š%k'C)$+î,Í.“0j2346Î7™9e;0=û>Ä@ŠBQD FÉGsIK§L#N‚O»PÐQ¬RKS¤S¥SIS}R=QuO#M9J·F›Bé= 8ß2¡,&61*. ièüËöñóëUç>ãÀßÃÜQÚ]ØÔÖ¿ÕüÔ”ÔpÔÔâÔlÕÖðÖæ×õØ&ÚdÛ½Ü&Þ ß)áÃâfäæÎç”éXë+íöîÊð“òXôö½÷VùÑú'ü^ýTþ ÿ›ÿÑÿ¬ÿ'ÿ8þÚüû°øçõ™òëîÁêOæŠážÜ˜×˜Ò½ÍÉÖÄÁ­½êºÅ¸9·U¶¶G¶ ·J¸ó¹ô»D¾ÒÀÃvÆqɇ̨ÏÌÒùÕÙ?ÜUßgâiåfèLë3îýðÇóxö&ù¼ûOþÊF¦ U › Ù0Jcostg[!F#,% 'ê(Â*›,j.?0 2Ù3¬5o7E9;Ù<ž>n@.BúCµEqG!IÆJZLÙM=O€PšQ‚R/S•S©S_S¬RQ×OMÓJqGpCÞ>°94á-]'‘ •ˆ ·.þ÷÷6òóì6èähàRÝÊÚ¹Ø×ïÕ!Õ¤ÔyÔ†ÔÓÔPÕöÕÉÖ²×ÄØäÙ*ÛvÜáÝVßÜàrâäÁåzç9éÿêÍìîið;òüó¾õi÷ù„úåûý&þøþƒÿÊÿ²ÿEÿiþ!ýcû(ùtöFó¡ï–ë.çxâ”ÝØÓªÎþɥŸÁJ¾k»%¹·u¶ ¶-¶á¶¸ž¹‹»Î½QÀÃåÅÛÈñË Ï4ÒYՂء۾ÞÎáÖäÑç¾ê¢ítð>óóõ¡ø>ûÍýTÆ4‘ä + hšÆâý ÷ ê"È$´&‰(j*<,.ã/²13N57è8¯:@ÙACaEGÐHoJLŒMùNBPcQYR S‡S§SsSÔRÀQ1PNgK"HDDÇ?Ã:'5!/§(ë!÷ìî sÿ,ùRóöíéÒäáæÝGÛÙo×&ÖGÕ½ÔzÔ‡Ô¿Ô9ÕÕ՛և׋حÙéÚ4ÜšÝ ßà âÂãlå"çàè¥êrì>îðÛñ¦ócõ÷´ø8ú¢ûÝü÷ýÊþmÿºÿ¹ÿ]ÿ–þdý¼û›ùþöèóYðcì èeã‡Þ‰Ù…Ô™ÏáÊwÆtÂí¾ï»¹Æ·£¶¶!¶¸¶Å·I¹(»\½Ñ¿}ÂSÅIÈVËqΖѾÔå×Û"Þ9á>ä?ç,êíåï·òjõ ø¸úSýÒÿQºs º û -Y{”¢­¬¦› †"q$O&3( *ã+¸-…/[1$3÷4¿6Œ8W:%<ë=¹?~ADC E¿F{HJ¼KCM²NP0Q%RðRnS¥S„SôRR„P„N÷KÌHE²@Ä;K6R0ô)@#WOMb½aútôûî ê£åÏá€ÞÆÛÙ¾×dÖoÕÖÔˆÔÔ¶ÔÕ¶ÕtÖY×VØxÙ¨ÚõÛQÝÃÞBàÔálãåÉæŠèLêìæí³ïñJó õ¿öbøëùYû¡ü¾ý¢þMÿ«ÿ½ÿoÿÀþ¢ýü ú÷‡ôñ+íæèLäyßÚzÕÐÃËOÇ0Ö¿y¼þ¹¸Ô¶*¶¶“¶‹·ø¸Èºë¼S¿÷ÁÃĸǻÊÙÍúÐ!ÔI×nڈݢà¨ãªæžéƒì]ï*òæô˜÷<úÏü\ÿÒG£ E Àî+>GKD9 )"$ø%Ñ'±)†+]--/þ0Ï2–4m6,8:Ã;˜=\?'AìB¯DkF#HÍIjKøLgNÄOðPüQÆR\S›SSS6RÒPôN{LuIÑE–AÁt@7BD¹EyG#IÉJ[LØM:O}P“QzR#S†S–SLSRiQµO}M¯JHGKC²>‰9Ý3¹-8'k wly ¤ þð÷2òñì;èätà^ÝÚÚÄØ6×þÕ5Õ·ÔŠÔ–ÔçÔ]Õ ÖÕÖÃ×ÒØóÙ7Û€ÜïÝ^ßèà{âäÉå€ç@éëÓìžîpð8òþó½õb÷ù{úÚûýþæþjÿ¯ÿ–ÿ ÿDþùü3ûüø?öólïaë÷æGâaÝdØeÓ‡ÎßÉŦÁA¾g»)¹†·†¶¶G¶÷¶!¸·¹«»í½nÀ#ÃÆùÈ Ì(ÏLÒv՗ؽÛÕÞåáîääçØê´íŠðOóöµøNûáýbÛC¢ó < w¬Óó !!ú"Õ$Â&˜(u*K,.ð/¿1Œ3X5&7ð8½:‡

    @áA¥CdE!GÎHzJL‘MôN@P[QRRSxS–S\S½R¦QPóMBKýGD¡?“:5ó.ƒ(Æ!ÓÑÑ úbÿ!ùLóõíéÚä!áõÝSÛ+Ù}×;ÖWÕÑÔÔ—ÔÔÔHÕæÕ®Ö”×›Ø¾ÙñÚGÜ¢Ýßœà)âÌãtå,çåè­êvìEîðÞñ¤ócõ÷­ø0ú—ûÐüçý·þVÿŸÿÿ:ÿpþ=ýûoùÊö´ó$ð.ìÑç7ãOÞ^ÙYÔuÏÂÊ^Æ`Âã¾ê»¹Ï·­¶*¶7¶Í¶ä·b¹G»y½ò¿›ÂrÅeÈtˎβÑÚÔý×#Û:ÞPáWäTçDê)íûïËòõ1øÎúaýéÿ_Ì. Í =l†§®¼ºµ© ”"$]&A(*ñ+Â-—/b163ü4Î6—8a:.<ö=Á?‡ANC EËFyH(J¸KHM­NP(QRãRcS’SoSàRâQkPaN×K£HêD†@ž;6-0È)#230Q¨Yúkôúî ê¨åÙáÞÐÛ”ÙË×yÖ€ÕçÔ›Ô‘ÔÉÔ.ÕÇÕ„Öi×d؇ٳÚÜ\ÝÎÞOàÜáwã!åÒæ‘èOêìæí¹ï„ñHó õ¹ö^øãùPû•ü¬ý’þ4ÿ•ÿžÿQÿ™þ{ýçûØùV÷OôÛðôì°èäFßRÚQÕfЦË3ÇÈ¿v¼û¹¸Ý¶;¶+¶¬¶£·¹âº ½p¿ÂÞÄØÇ×ÊöÍÑ;ÔdׅڣݸàÀãÁæ±é›ìpï@òùô«÷NúáünÿãX³ W Ðþ!;LWWSH 5"$&à'½)”+f-=/1Û2£4u6;8 :Ó;›=i?+AöBµDoF+HÊIrKôLkN½OîPñQ¾RLSŽSySSR¸PÑNZLQI©EoA˜<<7]1+s$‘•«ó•ûõ ðëæ“â,ßWÜýÙ%سְÕÕ¥Ô•Ô¸ÔÕ¥ÕaÖ9×5ØKÙzÚ¾ÛÝ„Þà‹á'ãÌä|æ9è÷éÂëíZï'ñðò°ôfö ø”ù ûRüvýfþÿƒÿÿaÿ¿þ·ý8üCúÖ÷êô‹ñ½í„éå3àLÛGÖWÑÌ ÈåÃ2À½nºs¸·T¶'¶‹¶p·Æ¸ˆºš¼ø¾‘ÁTÄBÇCÊZÍ{ОÓÉÖèÙ Ýà-ã*æ$éìçî²ñsô&÷ËùcüîþiÝA™ë ' g‘¶ÔæñôðçÖ!À#£%…'^)<+-å.«0ƒ2I46ã7°9x;E= ?Ö@›B\DFÐG~IK©L"N|O±PÄQ“R6S‚SSSKRQ8OÜLòIiFKB“=P8‹2S,Ã%îöñ CÏü»öñöëZçTãÐßâÜmÚ~ØøÖãÕÕ¹Ô”Ô²ÔÕŒÕ;ÖרÙ>ÚÛÕÜ=Þ·ß=á×âwä)æÝç¡édë3íýîÍð–òVôö´÷Jù¼úü;ý8þóþmÿ™ÿnÿâþìý‡ü§úTøõ6ò}îYêåå&á>ÜA×IÒwÍèÈ¨ÄæÀ™½éºÉ¸R·l¶*¶n¶?·¸+º1¼}¾ÁÇóƪÉÄÌÛÏÓ'ÖRÙm܆ߕâ•åè{ëVî*ñéó£öFùåûnþòbÎ"z ¸ ø%Mk}Žƒw!b#C%,'þ(â*¯,†.W0"2ó3¾5Š7U9;ë<²>}@@BDÂE}G&IÎJZLÙM9OvPŽQoRSuS†S5SzRKQ˜O[M‹J"G#Cˆ>b9´3-'F XQ_ ”þé÷*òôì<èä|àlÝèÚÖØE×ÖGÕÉÔ›Ô«ÔôÔqÕÖãÖÖ×ÛØÚ?Û‘ÜöÝlßñà…â'äÐå‰çGé ëØì¡îqð:òýó¸õb÷÷øvúÎûýþÏþVÿ”ÿvÿÿþÑüûÎø öáò7ï-ëÄæâ1Ý9Ø=ÓfÎÃÉwÅšÁ3¾i»(¹’·‘¶.¶[¶·<¸Ô¹É»¾ŽÀ?à ÆÉ'ÌDÏiÒŽÕ´ØÔÛíÞþáåüçêêÊíðcóöÆøaûòýtëS´ M ˆ¹ä&,-$!#ç$Ì&¥(‚*W,).ü/Ê1—3e5/7û8Ç:<[>!@éA­CjE$GÖHxJLŽMôN:PXQFRõRjS„SJS¥RŠQöOÑM!KÖGôCv?o:Ô4Ð.Z(£!¶²½ æTÿùFóõí#éâä*áÞ`Û;Ù×LÖjÕáÔ¡Ô§ÔæÔXÕõս֣׫ØÇÙÛOܯÝ$ߢà6âÓã}å1çîè±ê}ìFîðßñ£óbõ ÷©ø(úŒûÅüÕý¦þ>ÿˆÿ~ÿÿMþýdû?ù›ö‚óòïøë çÿâ$Þ0Ù1ÔRϤÊFÆSÂԾ軓¹Ô·¿¶5¶M¶æ¶û·¹c»•½ÀµÂ’ÅȒ˨ÎÏÑñÔØ9ÛSÞhákäkçWê=íðÚò•õBøáúsýùÿoà9• Ø Lxš¯ÃÇÊò §"†$p&J($*ÿ+Ë-§/j1C35×6¢8l:5<>Ç?ATCEÎFH%J¿KDM¬NþOQRÔRYSS\SÈRËQIPHN«K‡H¾Db@q;ø50¦)ù": Húlôôîê®åâášÞßÛ Ùá×„Ö–ÕøÔ¬Ô¤ÔÚÔ<ÕÛÕÖz×sØÙÅÚ ÜjÝÚÞWàæá‚ã'åÚæ—èVê#ìéí»ïƒñIó õ´öZøÙùHû‡üžý~þÿ|ÿÿ/ÿwþRý¾û¬ù#÷ ô§ðÂì|èèãß)Ú#ÕHЀË"Ç Ã~¿q¼û¹'¸æ¶L¶?¶Á¶Â·+¹»!½”¿/ÂÅïÇùÊÎ2ÑUÔ×›Ú¼ÝÎàÕãÙæÅé¯ì†ïOòõ¼÷`úôü{ÿøeÇ h ª â 2G\ch^X A"-$&í'Ê)Ÿ+w-D/1å2°46F8:Ü;¨=o?5AýB¹DzF(H×IlKúLfN¼OéPéQ³R@S~SeSíRÿQP±N7L/I€EHAn<741ê*M$pvz‘èƒûŽõðë„æšâ;ßbÜÚ2ØÈÖÂÕÕºÔ¢ÔÍÔ,Õ¶ÕrÖF×FØUÙ‰ÚÊÛ(ÝÞà•á2ãÒäŠæ8èêÃë’í_ï'ñòò­ôcöøùûFüiýSþÿiÿ„ÿ?ÿŸþý üú¡÷»ôXñ†íTéÎäàÛ!Ö/ÑqÌñÇÏÃ*Àü¼qºt¸!·_¶=¶Ÿ¶Š·á¸¥º·¼¿¯ÁrÄ_Ç`Êv͖иÓâÖÚ!Ý7à@ãCæ5éìúîÆñ‡ô8÷ÞùsüÿxòM¯õ = r¢Ääñþõâ!Î#°%“'j)H+-ï.º0‹2V4#6ð7·9„;M=?á@žBgDFÖG€IK©L"NvO±PµQ‘R%SsSoSS5RéPO½LÌIDF"Bl='8b2-,ž%Íרí 3Âü²öñ÷ëbçWãàßëÜ€ÚŒØ ×óÕ3ÕËÔ¥ÔÅÔÕ›ÕLÖר#ÙLÚŒÛáÜHÞÂßIáßâä.æçç¦ékë8íÿîÑð”òWô ö°÷Bùµúü1ý"þâþTÿÿNÿÁþÃý`üxú%øLõòIî$ê´åòàÜ×&ÒUÍÌÈ•ÄÖÀ’½æºÑ¸W·¶;¶†¶X·š¸GºO¼œ¾-ÁçÃÎÆÈÉàÌúÏÓFÖhنܟߪâ¯å¥èëkî<ñô°ö_ùñû„þþvÛ6ˆ Ç 2_v™Ÿœ”ƒ!n#T%4')è*¿,‘.c0/2þ3Ç5˜7\9,;ò<¼>…@GBDÈE€G.IÌJ]LØM5OsPˆQcR ShSqS#S_R1QzO8MiJüFúBa>59Œ3k-ì&' 66I €þÜ÷*òòìCèä‰àyÝõÚêØS×&ÖWÕÜÔ«Ô¿ÔÕ…Õ$Ö÷Öà×êØÚIÛ¡ÜÞxßûàâ-äÛåŽçMéëÛì¨îpð=òûó¶õ_÷ðønúÂûöüôý»þ?ÿwÿZÿÝþùý¦üÝú›øßõªòïôê“æàáÝ ØÓ@ΩÉ_ʼnÁ*¾e»,¹š·ž¶A¶q¶&·X¸î¹å»*¾¨À`Ã<Æ5ÉEÌ_τҨÕÏØéÛ ßâåèëÞí²ðvó-öÚøqûþƒÿcà Z ˜Éñ'4<93#!#ó$Ú&²(‘*b,8.0Õ1¥3o5;79Ð:™*@ñAµCpE*GÛHyJLŒMòN7PPQ>RëRYSvS5SRrQÓOµMûJ³GÊCQ?@:°4¤.6(!”˜¢ ÕDÿùAóòí(éåä8á ÞnÛIÙ¡×[Ö€ÕðÔ´Ô¹ÔöÔiÕÖËÖµ×µØÚÙ Û\ܽÝ*ß²à=âÝã†å6çùè³ê†ìGîðàñ£óaõ÷¦øú‚û¸üÃý–þ%ÿoÿ`ÿøþ)þéü;ûùköOó¼ïÅëlçÌâõÝÙÔ1σÊ0Æ@Âɾ軹à·Å¶K¶_¶ÿ¶¸ž¹}»¸½*ÀØÂ­Å È®ËÄÎéÑ Õ1ØTÛiÞ€áäƒçlêSí%ðîò©õSøôú„ý ƒíO¡ ë *\‡©¾ÒÖ×ÑÄ °"˜$z&W(4*,Ý-­/|1I35à6¯8u:B< >Ò?˜A[CEÕF…H*JÀKCM¬NùOQRÎREStSFS²R°Q+P%NŒK^H–D:@D;Ò5Ö/)Ñ"ó÷þ )‰Bú_ôøîê¶åèá¥ÞðÛ®Ùó×•Ö©Õ Õ½Ô¹ÔåÔUÕäզքׄ؞ÙÑÚÜvÝãÞeàíáã-åææ›è`ê&ìðí¼ï†ñJóõ³öRøÕù;û|üýlþ ÿcÿcÿÿSþ,ýûùïöðóoðŽìGè³ãçÞôÙÕÐmËþÆüÂp¿j¼ý¹*¸÷¶W¶X¶Õ¶Ü·J¹»D½¯¿Q ŠÈË*ÎOÑpԘ׶ÚÕÝäàñãéæâé¿ìïbò$õÎ÷túýŽÿ tÚ- { º ð?Xittob S"6$ &ú'×)­+‚-R/#1ð2½4ˆ6R8:ç;°=x?>ACÄD{F2HÕIrKùLdN¹OâPáQ¬R.SrSPSÕRçQ~P“NLIZE AB<î61É*!$PW\ÓxûƒõðëæžâGßnÜÚCØÖÖÖÕ#ÕÍÔ¶ÔÝÔ=ÕÊÕ{Ö]×OØhÙ•ÚØÛ2ÝœÞà á;ãÛ䑿AèêÉë•ícï)ñóò¬ô`öøˆù÷ú;üZý@þíþPÿhÿÿ}þfýåûèùw÷…ô$ñQí é—ä×ßéÚõÕ ÑLÌØÇºÃÀø¼mº|¸(·p¶M¶¹¶¡·¹¾ºÖ¼5¿ËÁ“Ä{Ç}ʓͲÐÕÓýÖÚ;ÝNàYãYæMé4ì ïÝñ˜ôN÷îùˆüÿŽÿa¼ L ‚±Õñ   ï!Ý#¾%Ÿ'{)P+)-ø.É0”2e4-6û7Ã9;Y=?è@¨BlD&FÚG‡IK¬LNvOªP²Q…RSgSZSôRRËPûN—L«IFþA==842,u%©·ºÖ µü¨öñ÷ëbçcãäßú܋ڜØ×ÖGÕÚÔ¹ÔÔÔ)Õ®ÕZÖ-× Ø0ÙYÚšÛëÜVÞËßTáêâˆä:æëç¯émë@íïÕð’òYô ö¬÷<ù­úúû%ýþÎþ<ÿdÿ0ÿŸþý6üLúö÷õÏñîïéåÁààÛéÖüÑ6Í®ÈÄÄÀ½âºÖ¸`·¶M¶›¶o·¶¸cºm¼º¾KÁÄëÆèÉùÌÐ9Ó`ւٟܸßÀâÇå¹è¥ëîPñôÇömù ü’þ„îF™ Ù Cl‡ž©­¬ ’!~#^%D')ø*Ì,.n0=24×5œ7o9/;=Ä>Ž@QBDÏE†G1IÏJ_LÖM5OoP~Q_RûR_S^SSHRQ\OMDJÖFÓB6>9`3C-Ä& - oòýÔ÷"òñìCè$äà‡ÝÿÚüØ_×:ÖeÕïÔ½ÔÍÔÕ‘Õ7Ö×í×þØÚ[ÛªÜÞ‚ßá™â7ääå•çVéëâì©îvð>òúó¸õT÷òø_ú½ûæüæý§þ*ÿ[ÿ>ÿ»þÔý~ü°úlø®õuòÒîÁê\æ¯áÒÜÞ×ïÒ ÎˆÉLÅvÁ#¾_»0¹¡·®¶P¶†¶@·p¸ º¼D¾ËÀ|Ã\ÆRÉbÌzÏ¡ÒÂÕéØÜß+â1å'èëóíÇðŠó?öîø„ûþ•uÔ$ l ¥Üÿ 7CKH?3!#%ä&Ã(š*r,B.0â1®3|5E79Ù:¥3@ûA¹CyE.GßH|JLˆMõN.PNQ2RãRKSdS StRXQ¶O”MÖJŒG¥C%?:„4}.(\!r{‰ À5ÿù;óñí(éîä=áÞzÛ[Ù®×oÖÕÕÄÔÊÔÕxÕÖÙÖÂׯØåÙÛiÜÇÝ8ß¹àIâäã’å<çÿè¼ê…ìQîðåñ¢ó\õ÷›øúvû«ü´ý‚þÿVÿAÿÚþþÆü ûäø7öó‰ïë;ç–âÈÝÑØäÓ ÏiÊÆ-¾߻–¹æ·Ó¶\¶t¶·/¸¸¹»Ó½KÀôÂËÅ¿ÈÉËãÎÒ*ÕJØmÛ„Þ“áä”ç†êeí;ðó½õføû˜ý•þ_± û :k—¶ÐÝçåàÑ ½"§$„&h(=*,ê-¸/‰1V3!5ï6µ8‚:J<>Ù?¡AbC#E×FŠH,JÃKCM«NóOQRÆR5SfS.SŸR’QPNiK9HoD@;¥5±/W)¯"ÓÕë ~4úYôõîê¼åóá®ÞþÛ½ÙةַÕÕÏÔÈÔùÔbÕøÕ³Ö•×‘Ø­ÙÜÚ)ÜÝñÞlàúá•ã8åíæ èiê(ì÷í¾ï‡ñKóõ²öLøÎù1ûoü~ý[þõþGÿKÿëþ3þýgûPùÃöºó>ðYìèã¸ÞÇÙÖÔùÏIËéÆêÂd¿f¼ÿ¹1¸ÿ¶o¶d¶ñ¶ó·f¹;»c½Ë¿rÂ:Å.È/ËJÎgьԱ×ÑÚéÝáäçòé×ì®ïxò5õá÷†úýŸÿ‡éA † Î û/Kiw€„{t ["I$(& (â)º+-^//1û2È4”6\8(:ñ;¸=‚?GA CÊDƒF3HÝIqKùLeN³OàPØQ¡R$S^S@S¾RÎQcPrNôKáH6Eô@<¿6ã0œ*$-9CgÄlû}õüïëæ©âQß|Ü.ÚQØêÖãÕ9ÕÜÔÈÔïÔMÕØÕÖd×cØrÙ¢ÚæÛ=Ý¥Þ%à¨áEãää–æJè êÐë™ígï)ñõòªô_öú÷‚ùêú2üIý/þØþ9ÿIÿÿVþBý»û¼ùE÷Tôñðíìègä¢ßÁÚÉÕèÐ/̻Ǫà Àó¼mº¸4·€¶a¶Î¶»·¹Ýºó¼R¿éÁ²Ä–ǞʬÍÍÐòÓ×9ÚOÝeàpãmæeéEì$ïíñ­ô^÷ú—ü%ÿœrÌ ] Áã ÿ!è#Ì%¬'‡)^+3-/Ô0¢2o4668Ê9š;_='?ð@¯BuD*FàGˆI"K­LNrO§P¨Q|R SUSKSÛRR¯PÝNvL‡IòEÖA=Ö72Ý+T%ˆ—£¼ ¦ü¢ö ñøëhçhãôßÝžÚ¨Ø/×ÖZÕëÔËÔæÔ8Õ¾ÕiÖ=×/Ø=ÙhÚ¤ÛúÜ`Þ×ß]áóâ‘äAæôç³éwë?í ïÓð•òWôö©÷4ù¤úðûýþ¸þ'ÿHÿÿzþ{ý ü!úÇ÷éôñàí½éJå“à°ÛÀÖÖÑÍ”ÈlĸÀƒ½âº×¸m·—¶b¶°¶‰·Î¸º‡¼Ü¾cÁ)ÄÇÊÍ2ÐUÓyÖ›Ù¸ÜÍßÙâÚåÏè¼ëîjñ!ôÛö€ùü§þ"—üX¦ ì #Uy˜ª¸º¼¬¡!ˆ#n%O',)+Ú,©.z0H24Þ5­7p9B;=Ð>”@YBDÕEŠG5IÒJ_LÖM0OmPsQZRíRQSKSûR0RûPè863 -œ&äõ YéýÉ÷ òîìKè(äœà“Ý Û Ùq×JÖyÕÕÎÔàÔ'Õ£ÕEÖ×û× Ù(ÚiÛ³ÜÞŒßá£â@äéå çWé!ëßì´îrð?òüó°õX÷äø\ú¯ûÙüÖý‘þÿ?ÿ#ÿ—þ³ýSüˆú=ø~õEò îŽê,æ~á¤Ü·×ÈÒþÍpÉ4ÅkÁ¾]»4¹ª·¼¶b¶œ¶W·‰¸*º¼c¾èÀ˜ÃyÆmÉ}̖ϺÒÝÕÿØÜ4ßAâGå;è+ëîØðŸóSöýø˜û'þ¨„ä4 z ¶è/DRWVN@!(#%ð&Ï(¦*},O. 0î1¼3„5T79ê:¨:@BÁCE2GäH}JLŠMïN0PAQ/RÓR>STS S^R=Q™OsMµJhG}Cÿ>ò9[4Y.é':!Saq ¯%ÿûø7óîí-éòäHá%Þ‡Ûmټׂ֜ÕÕÕÔÛÔÕˆÕ'ÖéÖÑ×ÔØñÙ)ÛtÜÓÝBßÅàOâñã”åIçéÂêŒìPî ðßñ¦ó[õÿö›ø úqû›ü¦ýlþüþ;ÿ'ÿ¸þÞýžüäú³ø öèò[ï[ë çhâ˜Ý©Ø¾ÓæÎOÊÆ¹¾Ù»š¹ê·ã¶i¶Œ¶*·I¸Ò¹º»î½gÀÃçÅÜÈãËþÎÒBÕc؄ۚެá¯ä¬ç˜ê{íMðóÌõzøû©ý+¥o H}¡ËÖòïõìÞ Ì"±$•&q(L*!,ó-Ç/‘1d3)5ú6¿8Œ:T<>ä?¦AjC&EßFŒH1JÂKDM¨NñOQÿQ¸R,SQS!S„R|QôOäMJKHMDæ?ù:}5‰/5)Œ"±¾Î þn*úUôóîêÂåùá¿ÞÜÓÙ Ø¾ÖÆÕ/ÕàÔÙÔ ÕsÕÖÆÖŸ×¢Ø¸ÙëÚ3ÜŒÝûÞuàâšãDåòæ¨èmê.ìøíÃïˆñLóõ­öGøÅù)ûbüqýHþÞþ3ÿ(ÿÓþ þÞü?û"ù–öˆóð%ìãçPãˆÞžÙ®ÔØÏ*ËÔÆÖÂ\¿_¼º6¸ ·z¶}¶·¸~¹Z»|½ë¿ŒÂXÅHÈLËdÎѦÔÈ×êÚÞáäçêëìÂï‹òGõõ÷—ú'ý³ÿ'™øN š Ø :\v„’ŒŽ{ n"S$7&(ð)Ä+œ-i/<13Ô4œ6j80:û;Á=Š?NACÎD‰F6HáIqKûL`NµOÕPÔQ”RSNS.S¨RµQHPRNÕK½HEÏ@÷;˜6¾0v*á# )W°fûqõðë™æ®â]߈Ü;ÚcØùÖ÷ÕGÕñÔÖÔÕ]ÕéÕœÖx×l؃ٮÚñÛJݲÞ+à·áHãóä—æWèêÖëœíhï,ñôò©ô]öñ÷ùÝú)ü:ýþÆþÿ/ÿåþ2þý’ûù÷"ôÀðëì¸è7äuß’Ú¢ÕÃÐ̤ǗÃþ¿ð¼jº‰¸<·¶t¶å¶Ñ·6¹öº½n¿ÂÏijǹÊÉÍæÐ Ô+×OÚjÝyà‰ã€æzé[ì7ïòÂôo÷ú©ü4ÿ¯ƒÚ* h £Íô,+) "õ#Ù%¸'“)l+>-/ß0®2w4G6 8Ù9¡;h=2?ó@½BtD5FãG‰I)K¨L NoOžP§QlRSDS7SÉRèQ•P¾NULcIÐE­Añ<¯7æ1»+-%h{ˆ¨ ˜üžöñúëmçpãüßݪڹØ@×#ÖjÕýÔÛÔøÔJÕÍÕxÖL×=ØJÙuÚ°ÛÝjÞàßjá÷âŸäDæþç¸é{ëFíïØð•òVôö¦÷,ùúäûýòý£þÿ/ÿòþ\þRýæûõù˜÷ºôlñ®í‹éåaà‡Û•Ö´ÑôÌ|ÈXÄ­Àz½ãºÜ¸v·¨¶r¶È¶ ·é¸œº¥¼ô¾‡Á?Ä&Ç Ê1ÍMÐmÓ“Ö²ÙÏÜåßîâñåäèÎë¨îxñ7ôíö‘ù,ü´þ6§ g¶ ú 3cŠ¢½ÁÌÅ»®!•#{%\'5)+ã,·.…0T24í5³79G;=×>@`B!DÙE’G5I×J_LÖM.OfPqQKRéR9S@SáRRÝP!OÕLÿIŒF„Bé=½83ö,z&ÂÕç IÙýÁ÷òñìKè0ä¤àžÝÛÙ†×VÖŽÕÕáÔðÔ7Õ´ÕUÖ#× ØÙ7ÚtÛÂÜ$Þ–ßá¨âLäðå§ç^é%ëçì²îzð=òýó¯õR÷àøSú¤ûÍüÅýþýþ(ÿÿ{þ‰ý/üZúøNõònîYêûåKáy܉ףÒÝÍUÉÅYÁ¾W»;¹¯·Ë¶q¶²¶n·¦¸Bº=¼~¾ÁµÃ•Ƌɘ̳ÏÒÒ÷ÕÙ7ÜKßZâ[åSè@ëîðð­óiö ù«û7þº-—óC ‹ Æö ;TadfYN!6#%ü&Ü(µ*†,_.&0ÿ1Â3”5Z7&9î:¶<€>B@ BÉCƒE;GãH†JLMêN*PBQRÐR+SDSùRGR!QOPM•JAGVCÙ>Å984,.Ç'!5BZ ™ÿïø1óíí.éùäPá0Þ–ÛxÙÎד֬Õ)ÕæÔêÔ,Õ–Õ7ÖùÖÞ×ãØýÙ7Û~ÜàÝMßÎà\âöã åMç éÄê”ìSî#ðáñ§óWõ÷‘ø úbû”ü’ý^þåþ ÿÿ”þÀýrü¼ú†øÜõ¸ò&ï(ëØæ5âjÝ~Ø“ÓÈÎ-ÊíН¾Ö»š¹ô·î¶|¶ž¶B·d¸î¹Õ»¾À3ÃÆùÈÌÏ9Ò[Õ|ØžÛ°ÞÅáÆä¿ç¯êícð)óÝõø&û½ý<·€Ð  V‹³Õêúûê Ú"¾$¡&€(U*2,þ-Ô/1n3757Í8”:^<&>ê?°ApC.EâF”H1JÅKEM¤NñOQúQ«RSCS SmReQÔOÈM$KðG%DÀ?Î:T5d/ )j"Ž¢³ ê\úNôïîêÇåâÇÞÜÝÙØÍÖÖÕBÕðÔéÔÕÕÖÏִ׫ØÉÙøÚ=ÜœÝß„àâ¤ãMåùæ²èrê4ìýíÅïŒñIóõ§öFø½ù ûUüdý4þÎþÿÿ°þêý¸üûøødöXóÚïóë®çãXÞoÙ‰Ô®ÏË·ÆÇÂK¿_¼ý¹@¸·Š¶¶·&¸›¹t»™½ À§ÂyÅdÈjˀΛÑÃÔà×ÛÞ-á1ä/çêíÔï¢òWõ ø§ú<ýÂÿ<¦ ] « ç Hm‚—š¡— y"`$F&(ÿ)Ñ+¦-y/C13Û4¬6q8=:<Ì=“?WAC×DŒF?HáIuKýL^N²OÑPËQR S?SS“RQ)P5N°K˜HëD£@Ñ;k6—0K*¾#èþ=¢Sûmõöïëšæµâfß•ÜHÚsØ ×Ö[ÕÿÔèÔÕiÕýÕ©Öˆ×zؒٺÚÜSÝ¿Þ8à¼áYãóä§æYèêÝëŸínï,ñøò¥ô[öð÷sùÛúü.ý þ­þ ÿÿÇþþ÷ühûdùèöôóŒð·ì‡èäHßcÚxÕ ÐïˌǃÃñ¿è¼jº¸I·›¶Š¶ù¶í·O¹»-½Œ¿&ÂêÄÒÇÔÊãÍÑ!ÔK×dÚ‚Ý”àã˜æŽépìLïòÔô‚÷)úºüHÿ½4‘í6 { ¯à/9;6* "$ç%Å' )w+K-/ë0»2ƒ4Q68á9­;r=9?þ@ÀBD8FéGI&K¯LNrO—PŸQfRöR8S$S´RÐQ{P›N9L9I°E€AÌ<ƒ7Â1‘+%FWr ð‰ü“öñöërçrã àݺÚÈØN×6ÖwÕÕêÔÕZÕÜÕˆÖ[×KØXÙ‚Ú»ÛÝvÞëßtáã¤äPæèÀéëIíïÖðšòRôö÷)ù’úÛûöüáýþ÷þÿÒþ<þ.ýºûÍùh÷Šô;ñxíYéçä0àXÛlÖŒÑÖÌ_ÈDÄžÀr½ãºÜ¸ƒ·³¶†¶Ý¶µ·¹³ºÆ¼¿¨ÁZÄDÇ<ÊOÍeÐÓ¨ÖÐÙçÜûßãæýèáë¿îŠñMôþö¥ù<üÉþE¹zÄ Cr˜´ÈÔØÔʺ!¤#‰%i'D)+ï,Ä.‘0^2.4ó5Â7‰9O;=Þ>¨@hB&DãE“G=IÙJ`L×M,OaPkQBRÜR.S-SÍRRÃPOµLÛIdF_B¼=—8æ2Î,U&˜¹Èè 7Èý·÷òðìJè:ä©à«Ý*Û%Ù”×hÖÕ ÕòÔÿÔLÕ¿ÕhÖ/ר%ÙEÚ€ÛÏÜ/Þ¢ß&á´âRäüå«çjé(ëîìµî|ðAòúó¯õL÷ÜøIúœû¾ü¶ýlþçþÿåþ[þeý ü-úç÷õçñ5î,êÄåáJÜ]×Ò¸Í<ÉÅLÁ¾V»;¹º·Õ¶‡¶Ã¶ˆ·½¸]º[¼™¾%ÁÓòƩɵÌÏÏíÒÖ2ÙOÜcßqâqåjèRë2îñÅóyö#ù»ûKþÊ?¨W — ×.LcjymmX!F#)%'å(Ã*“,j.602Ò3š5j7-9ù:Á<†>M@BÎC‹E@GçH‰JLMèN(P7QRÁR S2SäR1RQcO/MrJG/C±>ž94.¡'ò (? ‡ ÿâø.óéí2éüäYá:Þ¤Û…ÙÞ× ÖÁÕ7ÕøÔüÔ9Õ©ÕEÖ×ì×ñØ ÚEÛ‰ÜíÝWßÙàeâä§åVçéÍê•ìZî#ðæñ¤óWõúöøúXû…ü…ýJþÏþÿðþvþ›ýLü‘úYø®õ…òöîõê¤æâ9ÝTØmÓ§ÎÊÕÅþÁ¢¾Õ»›¹û·û¶Š¶´¶X·}¸ºô»&¾¥ÀHÃ'ÆÉ Ì2ÏSÒv՗سÛÍÞÖááäÒçÆê¡íwð<óñõŸø;ûËýPÆ0Žä & j˜Äãù ý ä"Î$®&Š(f*:, .ß/¨1z3B5 7×8ž:g<.>õ?µAzC3EéF–H4JÉKBM¦NêOQòQŸRS/SùRYRGQ»O§MKÎGúCœ?¤:-5;/æ(F"o‚ ÒOúIôéîêÊå âÒÞ ÜëÙ0ØÙÖëÕPÕÕüÔ*Õ”Õ%ÖãÖÀ×¼ØÔÙÛLܤÝß‹àâ¬ãVåÿæºèuê;ìîÈïŒñJóõ¨ö;øºùûNüPý$þ·þþþôþ‘þÇýüîúÇø7ö&ó©ï¿ë}çìâ)ÞDÙ_ÔÏòʡƴÂC¿W¼ºD¸"·œ¶¡¶5·<¸¸¹»¸½%ÀÇ“łȆ˙κÑ×Ôÿ×Û4Þ?áLä?ç6êíîï¯òoõøºúNýÒÿM·n º ÷ -Yx—ž¯ª§™ ‡"m$R&.( *Ý+³-ƒ/P13é4³68D:<Õ=š?aACÞD’FDHãIzKùL_N®OÊPÆQRÿR/SS}R‚QPN’KsHÅD~@¥;F6m0)*—#Èàó*JûcõôïëæÁâmߢÜVÚ€Ø×ÖnÕÕúÔ"Õ|Õֽ֒׋ØÙÇÚ Ü]ÝÌÞ>àËá\ã卿eèêäë¥ílï6ñïò­ôSöí÷nùÎúüýüý™þóþøþ§þðýÒü@û9ù¹öÄóYðˆìQèÓãß9ÚOÕ|ÐÒËqÇsÃã¿ã¼iº•¸R·¬¶œ¶·¸l¹+»P½¤¿GÂÅðÇðÊÎÑ=Ôc×~ڛݪà²ã³æœéŒìYï,òåô–÷8úÐüTÿÔ@£ýF ‹ ¿í+=HHD: $"$î%Ö'«)ƒ+[-%/ý0¾2–4T6*8è9·;}=?? AÄB‰D­@rB,DéE—GAIÙJdLÒM+O\PcQ:RÐRSS·RîQ¥PçN”L¹I?F7B—=k8Ã2¤,2&y™¬Ó $»ý®÷òììQè=ä´à·Ý5Û8Ù ×|ÖªÕ5ÕÕÕWÕÓÕuÖ?×+Ø1ÙTÚ‹ÛÛÜ:Þ®ß.á¿â\äæµçmé.ëóì¸îðAòúó¬õI÷ÕøCúû²ü¢ý]þËþúþÃþ;þAýßûú´÷ðô®ñ îôé”åíàÜ7×VÒœÍÉøÄ9Á¾Q»?¹Ã·á¶˜¶Ú¶·Ø¸{ºu¼»¾=ÁõÃËÆÈÉÏÌêÏÓ*ÖJÙgÜz߈â‡åègëFîñØó‹ö4ùÐûXþßMºc ¬ â8]n~‚€xe!V#4%'ò(Î*£,r.E02Þ3©5o7<9;Ë<>U@BÔC“EBGïHˆJL‹MèN"P0QR¶RS"SÏRRîPCOMNJøFC‡>x9ã3ß-{'Í ô ) rùþÛø#óíí/éå`áGÞ¯Û–Ùì׳ÖÑÕIÕ Õ ÕKÕ¸ÕUÖ×ù×þØÚLÛ›ÜóÝfßáàpâä±å\çéÓêšì_î#ðéñ óYõóö‹øöùPûyüsý9þ¶þòþÐþWþuý&üfú+ø~õSòÃîÁêsæÔá Ý&ØHÓ‚ÎùɼÅðÁ˜¾Ò»¹¸·ž¶Æ¶r·–¸#º¼E¾ÁÀiÃAÆ0É9ÌOÏnÒÕ±ØËÛåÞîáõäíçÖê¹íˆðPóö±øNûÜý`×A ñ 9 w¨Òò !ó"Û$¹&›(n*I,.ç/º13S57ä8§:q<8>û?ÀA~CìîÊïñKóþô§ö5ø±ù û:üIý þ¥þâþÛþpþ£ýmü½ú£øöûòqï’ëGç¾âúÝÙ9ÔjÏ×ʈƥÂ8¿Q¼ºI¸1·©¶¹¶H·[¸Î¹¯»Ñ½FÀá³Åȡ˹ÎÐÑõÔØ-ÛQÞRácäWçGê*íýïÆò‚õ)øÑúZýéÿXÎ%„ Ä <e‹ž´¶¼²© “"{$^&<(*é+À-/_1'3ö4»6Œ8J:<Ø=¨?dA)CâD˜FFHèIxKûL^N§OÉPºQuRóRS÷RdRkQóOôMpKMH£DS@ƒ;6H0*s#ªÁ߃<û]õòïë¢æÈâzß­ÜfÚØ,×&Ö~Õ Õ Õ2ÕŽÕÖÊÖ¢×™Ø¨ÙØÚÜnÝÓÞJàÖádã 岿hè$êåëªípï4ñòò¨ôQöç÷fùÆúüýéý‡þ×þßþ†þÍý®üûù†ö—ó&ðTì"è ãéÞ Ú*ÕXдË[Ç`ÃÙ¿Þ¼iº›¸\·¾¶¬¶'·¸„¹K»g½Å¿aÂ"Å È ËÎ8ÑXÔy×šÚ®ÝÆàÅãÉæ³éœìsï:òûô§÷JúàüfÿâQµ X – Òù"6MUVSE 4"$ÿ%ß'º)Ž+g-1/1Î24d6.8÷9¾;…=J?AÏB‹DEFðG˜I)K°LNiOPQURÙRSÿR‰R QBPaNôKôHcE4A|<27s1A+Å$ý"5h Ètü€öüð÷ëwç†ãà8ÝÑÚêØk×YÖšÕ2ÕÕ)Õ{ÕüÕ¨Öw×jØsÙœÚØÛ&Ý‘Þÿ߈áã¸ä^æèÌéŠëSíïÝð˜òSôüõ˜÷ùƒúÁûÞü½ýhþÊþÝþ›þòýèüeûzù ÷+ô×ðíøèäÖßûÚÖDÑ–Ì.ÈÄ€Ài½Úºí¸·Õ¶©¶·ê·7¹ðºú¼M¿ÝÁ›ÄxÇzʀ͠оÓÞÖÚÝ+à2ã3æ$éìãîµñoô'÷ÅùcüçþkÖA•è ( b¶ÏèìøëéÓ!¾#£%ƒ'\)5+ -Ö.®0q2E4 6Ö7œ9f;*=ö>±@|B1DïEGAIßJaLÔM'OWP^Q.RÅRS S¤RÒQŽPÆNtL•IFBk=F8™2,&U{’¼ ®ý¦÷ òììTèEä½àÄÝDÛDٵ׉ÖÁÕBÕÕ ÕmÕßÕ‰ÖL×8Ø@Ù`Ú™ÛçÜEÞ¹ß8áÈâeä æ¾çqé6ëôì¿î~ðDò÷ó«õC÷Ðø9ú…û£ü”ýFþ¹þÚþªþþ ý³ûÝù…÷Áô}ñÔíÄébå¿àìÛ ×2ÒyÍÉßÄ/Áù½Q»E¹É·ó¶§¶ï¶··ó¸•º’¼Ø¾ZÁÄéÆáÉîÌÐ$ÓDÖcÙ~Ü’ßœâ å‘è~ëWî)ñêóžöGùßûnþí_È$s º ô"Oe‰‘Œ†s!a#C%%')×*°,~.P02è3²5{7F9 ;×<•>`@BÞC•EIGñHŒJLŒMäNP*Q R§RS SÁRüQÙP OöL)JÓFäB^>Q9º3½-R'± Ðñ ^ïþÍø$óæí6é åiáTÞ»Û¦Ùü×ÃÖãÕZÕÕ ÕZÕÊÕeÖ&× ØÙ#Ú^Û£ÜÞoßíàyâä¶åfçéÛêžì`î*ðäñ¦óRõôö€øòùCûlüdý$þ¢þÖþ´þ6þPýü8úøJõ&òî“ê<æ§áÝÜý×ÓdÎÙɬÅÚÁ”¾Ì»¡¹ ¸·¯¶Ù¶Š·°¸?º.¼_¾âÀ‚Ã`ÆKÉWÌhωҨÕÊØåÛùÞâ åèêêÎíšðeóöÃøaûìýtåQ±þ K „¸ãý$,,"!#è$Ç&¥(*R,&.ô/Â13X5"7ë8³:{<>>@ÅA‡C@EòFžH;JÉKBM£NàOùPÞQ‹RöRSÐR,RQ€OhM¾J‚G³CG?X:Ú4î.œ(ý!2Hk °)ú4ôïîêÚåâéÞ:ÜÚMØýÖ ÖrÕ%ÕÕPÕ°ÕIÖüÖà×ÕØòÙÛdܼÝ$ߤà(âÂãcåçÇè‚êDìîÏïñMóüô¡ö1ø©ùû0ü5ýþý‹þÎþ¼þQþýCü–úrø×õÆòEïYëçŠâÎÝïØÔNϳÊzÆÂ1¿K¼ºN¸?·¸¶Í¶`·q¸î¹Æ»ô½]ÀÃΟÈÁËÍÎñÑ Õ.ØLÛ`Þqáuälç_ê:íðÖò•õ>øßúoýõÿmÛ9 × Ms™¯¾ÈÇÁµ ¡"‡$k&I( *û+Ç-/h1335Æ6•8W:$<ä=¯?lA/CèDŸFJHéI}KöLaN¡OÃP³QkRäR SâRPRRQÖOÖMMK,HzD0@V;ø50à)O#ˆ¦Åþr1ûWõðïë¨æÎâ…ß»ÜtÚŸØ;×9ÖÕ4ÕÕCÕ Õ%ÖÞ֭׫ضÙäÚ"ÜxÝàÞUàÞápãåºæpè)êëë­ítï4ñôò¦ôOöá÷`ù¼úöûýÙýoþÂþÀþiþ«ý…üìúâøYöfóòï%ììçrã¸ÞßÙÕ1КË?ÇOÃοӼqº™¸n·È¶Â¶=·4¸¡¹f»ƒ½å¿|ÂBÅ*È%Ë;ÎPÑvÔ×´ÚÇÝÚàÞãÜæÊé°ì…ïQò õ¼÷[úñü{ÿðe h § ß -HYdd`U @",$ &ì'Ç)š+r-?/1Ü2¤4s658:Ç;=R?AÕB“DHFôGœI*K³LNhOˆPˆQHRÏR SìRuR…Q)PANÓKÓH9EAP<7I1+$àP ¹güxöùðøë}ç‹ã"àDÝßÚùØ~×fÖ±Õ=Õ$Õ5ÕÕ Ö·Öˆ×s؄٦ÚåÛ3Ý™Þ à’áãÁädæèÔéëYíïàð˜òPôûõ‘÷ùzú¶ûÎü­ýTþ±þÅþyþÕý¾üCûHùßöúó¤ðâìÄèPä¥ßÒÚïÕ$ÑtÌÈ ÄtÀb½Üºî¸·â¶¹¶!·þ·S¹ »½l¿ùÁ·Ä–ǓʟͺÐ×ÓùÖÚ0ÝBàHãKæ6é$ìöîÊñ‚ô8÷Øùsüùþ|çP¥÷ 6 tœÅàòÿüõß!Í#®%’'g)C+-è.´02M46ß7¨9m;7=ø>À@}B;DòE£GEIáJ_LÖM"OSPWQ#R¹RS÷RRºQtP¦NVLpIõEìAD=!8m2_,ã%:X{£  ýž÷òììXèIäÌàÊÝVÛQÙÄ×ÖËÕ[ÕÕ8ÕvÕôÕ•Ö\×HØLÙnÚ¦ÛñÜRÞÄßAáÓâkäæÂç|é7ëýì¾î„ðAòúó¦õA÷Çø2úwû™ü€ý5þ þÁþ‹þöýùüû®ùZ÷ŽôMñ£í‘é0åŽàÁÛáÖÒYÍéÈÎÄÁô½O»H¹Õ·ÿ¶º¶·Î· ¹¯º±¼ñ¾|Á,ÄÇÊÍ"Ð<Ó]Öْܮ߱â¶å¨è’ëkî?ñúó´öUùõû{þqÖ7 Ì 3[vŽ˜žœ„!l#Q%5' )ê*·,Ž.Z0'2õ3»5ˆ7M9;Þ< >f@&BäCœEMGóHJLŒMãNP$QRšRùRûRªRèQ»POÓLJ¯F»B7>)9“3“-.'Š ¶Ñý HàþÄøóèí7éåsá\ÞËÛ´Ù ØÕÖñÕmÕ+Õ0ÕiÕÜÕsÖ6רÙ4ÚiÛ°Ü Þ{ß÷à‚âä½ånç$éßê¤ìdî*ðéñ£óQõðözøêù9û`üRýþ‹þ¼þ˜þþ/ýÖûúÑ÷õóñ[î_ê æuá¯ÜÓ×úÒ@ÎÀÉ’ÅÑÁ…¾Í»¡¹¸ ·Á¶î¶¡·É¸[ºG¼‚¾øÀ¥ÃzÆgÉvÌϧÒÀÕäØüÛßâåèëàí²ðsó.öÔørûÿý„öe½ X ”Èï%3;74!#ñ$×&±(‹*^,2.0Ï1™3f5*7ú8¸:‰@ËACEE÷F¤H;JÏK@M¢NÛOóPÖQRéRýR¿RRþPaOHMœJ\G‹C"?+:´4Ä.v(Ù!+Q ™ôù0ôçîêÛå!âôÞCÜÚYØ×Ö„Õ6Õ-Õ]ÕÅÕRÖ×é×èØüÙ,ÛoÜÉÝ1߬à6âÉãmåçÏè‡êJì îÒïñLóûôžö,ø£ùöú&ü$ýîýtþµþ þ0þ^ýünúDøªõ’òï$ëêæWâ ÝÂØìÓ$ÏžÊYƆ ¿K¼ºX¸H·Ê¶à¶x·Š¸ºã»¾zÀ ÃëÅÖÈÜËêÎ Ò%ÕJØdÛxÞŠáˆä†çqêRí(ðéò«õMøôúý ~ëIŸ è 'Y†¥¾ÏÕ×Π¯"—$w&V(,*,Ö-¨/t1>35Ñ6Ÿ8b:,<ï=µ?uA6CïD¡FQHêI€K÷L]NžOÁP¦QfRÒRSÎR9R8Q¹O¹M(K HQD@/;Í5÷/·)+#h†­æa$ûOõêïë«æÕâßÅÜ€Ú°ØI×LÖœÕEÕ,ÕTÕ­Õ9ÖèÖÃײØÉÙíÚ0Ü‚ÝëÞaàåá|ãåÄævè/êñë±íwï6ñôò¥ôKöÝ÷Xù´úèûõüÄý]þ¨þ¦þIþ‰ý_üÅú´ø.ö2óÅïðë¼ç?ãŠÞ¶ÙØÔÐxË+Ç<ÿѼmº¦¸r·Ü¶Ò¶T·O¸¸¹„»Ÿ½ÀšÂ^ÅFÈCËUÎmÑŽÔ¬×ÊÚàÝñàõãòæßéÆì™ïdòõÎ÷oúý‹ÿuÔ, u ¹ ì;Viptla P"5$&÷'Ò)ª+y-P/1ê2®4}6A8 :Ð;˜=[?AÞB˜DOFùGœI1K¬LN\OŠP|QARÂRúRÛR]RoQ P"N³K®HEí@$<é61ú*x$¿ã= £[üqöððûë|ç”ã+àNÝìÚÙŒ×yÖ½ÕSÕ/ÕKÕšÕÖÅÖ•×…ØÙ´ÚòÛ=ݦÞà›á*ãÆäqæèÝé“ë\íïßðšòRôõõŽ÷ùkú²û»üŸý?þ™þ«þZþ´ý™üûù³öÉósð²ìè"äuߤÚÊÕûÐZÌúÇùÃhÀY½Ýºò¸©·ï¶Í¶5·¸p¹$»3½‰¿ÂÕĴǮʼÍÔÐñÓ×-ÚIÝYà_ã_æOé5ìïØñ™ôH÷ïùüÿŠù`· H ¯Òî  ÿð!Ù#¼%Ÿ's)P+-ô.¾02V4"6ê7²9x;@=?Ç@†BADùE¦GIIáJdLÑM OPPLQ!R¥R÷RâR}R¢QXP‰N5LMIÑEÃA=÷7G26,Á%>[ í‘ý”÷òëì\èNäÔàÖÝaÛaÙÔתÖáÕfÕ4ÕDÕŒÕÿÕ§Öj×UØ]ÙxÚµÛûÜ`ÞÊßPáÙâväæÈç…é:ëíÁî†ðBòûó¡õ>÷Áø(úoû‰üqý"þ‡þªþlþÕý×üeû†ù-÷^ôñoí`éå\à˜Û¶ÖéÑ;ÍÍÈ»ÄÁì½M»L¹Ü··Ê¶·ä·'¹ËºÌ¼¿™ÁGÄ&ÇÊ"Í>ÐRÓ{Ö’Ù±ÜÁßÊâÊå¾è§ë€îPñôÄölùÿû•þ „èD” × Ch‡›¥°¥¢!y#`%?')ó*Æ,–.j0024Ç5’7X9 ;æ<ª>o@-BëC¢ESG÷H‘JLˆMãNP!QóQ•RåRîR”RÒQ¡PèN³LãIŒF”B>ÿ8l3l-'j ’ºà 8Îþ»øóâí:éåzájÞÕÛÃÙØãÖÖzÕ>Õ?ÕzÕêÕƒÖE×%Ø+Ù=ÚxÛºÜÞ†ßÿàŒâ%äÅåxç(éæê¨ìgî/ðéñ£óNõìöwøßù2ûNüGýÿýuþ¦þyþöý ý®ûëù£÷ñôÂñ+î-êÝåEáƒÜª×ÕÒΧÉzÅÃÁ|¾É»¥¹¸+·Ò¶·º·à¸wºb¼ž¾ÁÄÒƉɊ̤ϺÒßÕøØÜ'ß5â7å+èëòíÅð‰ó>öéø€ûþ”uË% e §Ò8?JE>1!#%ß&À(–*k,>. 0Û1¤3o597ÿ8È:Œ@×A“CLEþF£HEJÉKDMžNÖOðPÊQzR×RñR¨RÿQáPGO&M}J5GgCù>:Œ4Ÿ.M(º!ì9 „ êù(ôçîêáå'âþÞPÜ'ÚjØ×/Ö“ÕHÕ<ÕnÕÓÕfÖ×û×óØ Ú7Û~ÜÐÝ?ß³àAâÑãuå çÒèêNìîÓï’ñKóúô›ö&ø›ùíúüýÛý`þ›þ†þþ=ýöûEúøyõgòßîøêµæ,âpÝšØÃÓÏ‚ÊBÆw¿I¼ºb¸O·ß¶í¶“·Ÿ¸&ºþ»-¾˜À=ÃÆòÈ÷ËÏ$Ò@ÕbØyÛ”Þœá¢äšç†êfí;ðþòºõcøû’ýýY¯ õ 8e—³ËßáåÝÏ ½"¢$…&c(:*,ä-°/ƒ1I35ß6§8o:3<ù=½?~Aþýuüóúñø…ö˜óDðì^èñãFßxÚ¢ÕØÐ;ÌâÇåÃZÀU½Ùºû¸¯·þ¶â¶F·4¸„¹F»L½¨¿2ÂòÄÐÇÍÊÔÍóÐÔ-×HÚ`ÝoàyãqæiéGì#ïíñ«ô\÷ÿù”üÿ› qÅ V ½àþ ý!å#Ë%¥'†)X+.-ý.Í0˜2b4.6ñ7¿9€;I= ?Ï@BFDF¦GRIáJcLÔMOMPFQRŸRâRÕRdRQ;PnNL,IªEžAõ<Ð72,%ò@y Ù‡ýˆ÷ÿñéì_èVäÚàãÝnÛnÙæ×¸ÖôÕuÕFÕUÕ˜ÕÖ³Öz×dØgÙ‰Ú¼ÛÝcÞÝßSáæâ~ä"æÒç†éEëíÇî†ðDòùóŸõ<÷·ø$úaû~ü`ýþqþŽþQþ²ý³ü>û[ù÷.ôíð=í/éÏä.àiÛÖÂÑÍ´È£ÄÁß½P»L¹é··á¶+·¸=¹éºå¼/¿±ÁiÄ?Ç8Ê>ÍUÐsÓÖ°ÙÆÜØßââßåÓè»ë–îañ&ôÔö~ùü¡þ “øT£ æ #Oy“«³¼µ¯œ!‡#l%M'$)+Ì,©.o0@2 4Ó5›7c9(;ð<³>v@5BñC¦E[GùH”JLˆMßNPQîQ†RØRÝRR»Q‡PÊN”LÂIdFpBç=Ù8E3D-ç&A |•Ñ Âþ±øóãí=éå„áqÞèÛËÙ3ØëÖÖ†ÕRÕLÕŽÕ÷Õ•ÖQ×6Ø5ÙOÚ€ÛÊÜ Þ’ß á—â-äÏå{ç2éìê«ìnî+ðïñžóPõçönøÜù#ûDü7ýëý`þŠþ^þÕýçüŠû¼ù{÷¾ô•ñ÷íýé«åáUÜ×°ÒΊÉiűÁv¾Å»©¹%¸:·à¶·Ï·û¸“º|¼½¾0Áâïƥɥ̿ÏÔÒùÕÙ0Ü=ßNâJåBè+ëîÙð›óQöùø•û"þ¦…Û4 u µä*ELZQN@ÜAšCTEÿF¬H?JÑK@MœNÖOãPÈQhRÌRÞR—RæQÉP'O MXJGBCÏ>ã9`4{.*(•!Ñò$ oÿÿÝù&ôáî!êåå2â ß_Ü5ÚzØ.×>Ö¤ÕXÕOÕ}ÕçÕoÖ2רÙÚFÛ‡ÜÞÝGßÁàFâÝãzå)çÙè”êTìîÖï’ñKóöôšöø•ùáú üýËýEþ‰þbþ÷ýýÓûúé÷Qõ.ò´îÁê‡æúáEÝoØÓåÎdÊ/Æc¿B¼ ºh¸]·î¶·§·»¸>º¼G¾µÀ\Ã!ÆÉ Ì'Ï;Ò[Õzؓ۩޵á¶ä¯çêxíPðóËõxøû¦ý(  iÁ  Iu£ÄÙìïóéÜ Ë"®$“&l(I*,ó-º/Ž1T3"5ç6²8w:=<>Ä?…ACCüD¬FWHòIKøLYN˜O±PšQMRºRßR¨R RQƒOxMèJÀGD»?Ý:‚5¥/q)ã"'Ox¿Aû?õèïë·æåâ£ßàÜœÚÐØh×nÖ½ÕhÕLÕuÕÏÕUÖ ×Ù×ÓØßÙÛKÜ–ÝßsàúáŽã(åÓæ‚è=êøë¼íyï;ñóò£ôDöÓ÷Hù¢úÐûÔü¤ý.þ|þnþ þFýüvú\øÔõÐòcïŒëYçàâ.Þ^ÙÔËÏ@ËüÆï¿Å¼pº°¸Š·ú¶ú¶€·€¸í¹½»×½<ÀÔ—ŀÈzˋΣÑÀÔà×øÚÞá%äç êêìÃïŠòDõò÷’ú$ý¯ÿ$”öH ™ Ó 5\q„މ| g"U$/&(è)Ã+“-f/-13Á4•6U8:ä;§=o?*AîB£DYFH¡I3K¯LN[O{PnQ.R¦RÝR¶R2R>QÕOæMqKfHËDœ@Ø;˜6Ð0®*2$x­Í ƒ@ü_öïðöë‰ç ã?àgÝÛ&Ù«×›ÖÝÕwÕOÕmÕ¹Õ<ÖäֲנتÙÍÚ ÜWݸÞ.à©á@ãÕ䀿-èåé ëbí!ïáðòLôôõ÷ù\ú–û¢üzýþkþtþ þoýQüÉúÈøUömóðNì0è¼ãßIÚ~Õ³ÐÌÉÇÔÃPÀL½Ýºü¸¾· ·ô¶]·J¸¡¹^»k½Â¿R ÅîÇåÊòÍ Ñ%ÔF×^Úx݆àŒã‹æwé`ì5ïò¼ôp÷ úªü+ÿ¯ƒÓ( b ¢Éò (,$ "õ#Õ%µ')d+<-/Ü0ž2r4468Ä9Œ;Q=?×@’BQDÿE³GLIéJcLÏMOAPDQR”RÒRÃRPRuQ PNNõKIŠEtAÑ<¥7ý1å+~%Í'c Éyý÷úñëì`è_ääàïÝzÛÙñ×ÎÖÖ‡ÕXÕdÕ«Õ"ÖÀÖ×nØxÙ“ÚÌÛÝsÞãß_áîâ†ä*æØçéIëíÉîŠðAòûóšõ7÷³øúXûnüPýúý[þuþ0þ”ýŒüû1ùÓöô»ðíþèžäà9ÛjÖ ÑþÌœÈ‘ÄøÀÚ½M»S¹ï·,·ê¶J·¸`¹ÿº½J¿ÏÁ„Ä^ÇPÊ]ÍlÐÓ¦ÖÊÙÚÜóßôâöåèèÏë©îvñ6ôéöŽù'ü°þ1¤f¯ ÷ 1^‰ ¸ÃÇŹª!”#w%['/)+Ø,´.z0L24Ý5¥7l94;÷<»>~@:BúCªE]GþH•JL‡MÛN PQäQyRÊRÉRkR¤QkP¯NrL I?FLB¾=´83!-Â&# Y€¶ ²þ©ø óâíAé åá}ÞôÛÝÙ?Ø×(ÖÕ^ÕaÕœÕ Ö¢Öb×CØBÙ\ÚŽÛÒÜ0Þ˜ßážâ5ä×åƒç7éñê°ìoî1ðêñ£óIõåögøÑùû8ü"ýÚýHþrþ@þµýÁücû“ùL÷ôdñÄíÎéxåéà)ÜX׊ÒáÍpÉTŤÁn¾Â»®¹+¸I·ñ¶-·æ·¹¬º›¼×¾PÁýÃÍÆÁÉÃÌ×ÏðÒÖ*ÙHÜSßfâ\åYè=ëîëð®ócö ù©û0þ¹&–ìB … Âô9Q]ccXK!4#%ù&Ú(¬*…,U."0ó1¹3„5N79Ü: <`>)@àA¥CUEG¬HGJÍKBM˜NÐOàP»Q`R½RÎRRÑQ¬POêL4JòFC®>µ9?4P.(r!±Ø [òÿÑù!ôàî"êìå8âßkÜEÚˆØ@×LÖ¸ÕiÕ^ÕÕôÕƒÖ>רÙ#ÚRÛ“ÜëÝPßÍàNâçã„å.çâè—êXìîØï”ñKóôô•öøŒùÖúüôü¹ý1þmþJþÔýòü­ûîùÃ÷õò|î–êQæÍáÝDØxÓÄÎGÊÆP¿=¼ ºp¸i·þ¶·½·Õ¸Yº6¼g¾ÑÀwÃAÆ,É-Ì>ÏVÒwÕØ­ÛÀÞÉáÑäÀç³êŒídð#óâõƒø+û±ý>«xÎ  RŠ­Öäýûöí Ó"¿$š&(P**,ø-Ì/”1d3)5õ6º8:E< >Ë?AICE³FXHøI€KúLVN“O¬P‘QAR°RËR˜RõQïPbO^MÂJŸGáC’?·:Y5~/K)¾"1^¬-û6õæïëºæíâ­ßëܪÚÞØz×|ÖÑÕvÕ`ÕƒÕßÕeÖ×é×âØéÙÛOÜ©Ý ßàâ•ã2åÙæè?êì½í}ï?ñðò£ô@öÎ÷Bù˜úÃûÈüýþ_þSþìý"ýîûKú0ø¦õ¡ò0ï]ë%ç³âýÝ5ÙdÔ«Ï#ËâÆ ÃŸ¿Å¼nº¹¸”· ··”·›¸ºÙ»ô½ZÀï¶ŚȘ˦νÑÜÔö×Û(Þ2á=ä.ç"êÿì×ï›òXõø¦ú4ýÁÿ3¦X ¨ ä Ggƒ™™‡ y"\$A&(ø)Í+Ÿ-p/<1 3Ð4›6a8):í;´=r?8AïB­D\FH¤I4K°LNXOuPgQ"RšRÍR£RR&Q¸OÈMNKBH¦Ds@²;m6«0‰* $\еýp6üWöéðøë‹ç¦ãLàoÝÛ3ټ׬ÖîÕˆÕ`Õ}ÕËÕMÖóÖÀװصÙßÚÜdÝÄÞ5àºáAãä䂿6èìé£ëií!ïåðœòKôðõ~÷ùøSú‰û•üiýþUþWþþLý,ü úžø&ö>óÞïìüçãêÞ$ÚQÕ“Ðÿ˳ÇÁÃDÀG½Ûº¹Ä···u·b¸»¹z»‡½á¿lÂ-ÅÈË Î$Ñ@Ô^×wÚ‘Ýœà¥ãžæépìLïòÓô~÷"ú¸üAÿº/‹ê3 u ¯×-5;0. "$ß%Ã'›)s+D-/â0¯2z4@6 8Ï9“;[=?ß@˜BXDF·GQIèJdLÏMO@P9QþQ‡RÅR¯R=RYQ P/NÔKãHbEPA¦<7Ñ1Â+W%®ä M ¸kýy÷õñêìfèbäïàù݉ێÙØßÖÖšÕgÕtÕ¼Õ1ÖÒÖ˜×~؅٠ÚÙÛÝ€Þíßláõâ‘ä/æâç’éPë íÎîˆðIòòó õ,÷²ø úRû[üDýâýGþZþþtýgüïúù¤öÓóŠðÚìÎèläÔßÛ@Ö|ÑàÌÈƒÄæÀؽI»W¹û·5··Y·-¸r¹»½i¿ìÁ¡ÄzÇmÊw͊ЦÓÃÖÞÙ÷Üàã æüèæë»îŒñGôýöŸù7üÆþ>¸w¿  @n–¯ÇÐÖÑȸ!¡#„%f'?)+é,¼.ˆ0V24é5®7z99;=Â>†@CBÿC³E_GI•JL†MÚNP Q×QrRºR¹RVRŽQNP”NOL€IF"B›=‡8ø2ö,Ÿ&ü=aŸ þ¤þøóâí?é'å”áŠÞýÛïÙIØ×3Ö³ÕkÕsÕ«ÕÖ³Öp×QØPÙhÚœÛÞÜ;Þ¥ßá©â>äÞå‹ç=éöê¶ìrî4ðëñ¢óHõâöbøÉùû*üýÈý2þXþ%þ’ý ü=ûhù!÷bô2ñ•í›éGåºàþÛ+×jÒ¼ÍXÉ>Å•Áe¾¿»°¹3¸V··B·ý·-¹Êº³¼÷¾kÁÄìÆÚÉßÌóÏ Ó*ÖEÙ\ÜoßyâwånèQë3îüðÃóuöù·ûGþÅ;¤þQ • Ò,EchtmgX!A#(%'å(»*Ž,d.,0ÿ1Ä35X79å:§.@êAªCZEG°HFJÒK?M—NÎOÕP¶QQR³RºRqR¸Q”PòNÈLJÌFóB‡>94*.â'Q!ŽÀî MÜÿÌùôàî"êðåBâßyÜNÚØJ×bÖÃÕ|ÕmÕ ÕÖ”ÖJ×$ØÙ/Ú^Û ÜòÝbßÎà`âéãå5çæè¡ê[ìîÛï“ñKóõôŽöø‚ùÏúóûéü¡ý#þMþ2þ³ýÑüˆûÃùœ÷èôÜñHîgê!æŸáèÜØQÓ¤Î.ÊÆCÂý¾:¼ºw¸v· ·-·Ó·í¸tºR¼‚¾ðÀ‘Ã_ÆHÉHÌZÏpÒÕ«ØÃÛØÞááääÚçÃê¤ítð7óôõ–ø:ûÆýIÃ)ŒÛ ' b•ÂÞø  ö ä"È$¬&…(b*2,.Ö/ 1p3257Â8:O<>Ö?’ARCE¹F]HøIƒKùLUNO¦PˆQ9R R¾RƒRàQÕPHO>M£JyG¾Cj?’:.5\/#)ž"æE™ûú.õâï ë¼æ÷â³ßùܸÚëØŒ×‹ÖâÕ†ÕrÕÕóÕsÖ'×ú×êØýÙ ÛbܰÝ߈àâœã=åßæ’èHêìÃíï<ñöòôAöÇ÷<ùú¸û¹ü}ý þGþ9þÌýýÉû"úøuõtòÿî+ëöæâÑÝ Ù>ÔˆÏËËÆøÂ—¿¼¼qº¼¸¢··$·©·±¸%ºî»¾qÀÃÐŹȲËÁÎØÑôÔØ+Û?ÞLáOäGç5êíêï¯òlõø¶úHýÏÿG´i · ò *Uv“œ¬¨¤— ƒ"m$K&-(*Û+¬-{/H13Ý4¥6l82:÷;»=}?=AûB°DcF H¦I9K®LNUOoP_QR‹RÁRR R QŸOªM,K"H~DN@‰;F6ƒ0b*ç#=hžâb%üPöãðøëç«ãUàzÝ&ÛAÙÍ׸ÖÖ”ÕuÕŠÕÜÕZÖ×Ð×»ØÅÙéÚÜqÝÎÞBàÁáOãèäæ;èòé¬ëií*ïäðŸòIôîõy÷óøKú}û‡üXýïý<þ>þâý-ýüwútøùõ ó´ïåëÑç[ã¿Þ÷Ù+ÕqÐà˜ǭÃ:À?½Ýº¹Ï·-··Ž·v¸Ù¹‘»§½ù¿ŽÂEÅ&È Ë(Î@ÑYÔx×ڨݴà»ãµæ£éˆì^ï&òæô‘÷7úÈüTÿÊ@ùB † ¼ë *8EGA9 "$ì%Ñ'§)€+O-$/ì0¼2„4J68×9¢;`=(?â@¥BXDF¶GYIèJeLÎMO:P2QôQ|R´R R$REQìON±KÁH=E(A€Öä֥׎ؑٯÚäÛ-ÝŠÞ÷ßxáüâœä7æèçšéTëíÏîðFòöóšõ-÷§øúCûPü2ýÑý/þ@þöýUý@üÍúÙø{ö¢ó[ðªìœè?ä¢ßèÚÖ[ѾÌkÈjÄßÀʽL»Z¹¸D··o·C¸¹7»<½…¿ ¾ĖljʓͥпÓßÖõÙÝà#ã$æéúëÐîžñZô÷¯ùNüÑþTÃ)ƒÒ  O ÅÎäààÖÂ!°#%s'J)%+õ,Ç.–0^2,4ò5º79D; =Ì>@KBD¸EdGI—JL†MÕNPQÑQeR©R¬R:R}Q/PzN-L_IóEÿAs=^8Ó2Ï,|&ÛFŒ èšþøóÜíEé*å áÞÜöÙ^Ø#×EÖÁÕ}ÕƒÕºÕ+Ö¾Öƒ×[Ø`ÙtÚ§ÛíÜBÞ²ß'á³âHääå“çDéûê»ìtî6ðíñ¢óDõÞöYøÄùûüý°ý þ;þþtýzüû>ùõö4ôñgígéå‰àÒÛ×AÒ¢Í;É-ņÁ`¾»»¹¹7¸g··W·¸F¹ãºÑ¼¿‰Á6ÄÇ÷ÉûÌ Ð$ÓDÖ\ÙwÜ…ßâŒåèjëBîñÑó‹ö/ùËûVþ×L±[ ª Ü9Vnz~~td!P#3%'í(Ë*š,m.=02Ñ3œ5^7+9ì:°2@÷A¬CdEGµHJJÐKAM“NËOÎP¯QER¥RªR[R£QzPÔN©LñIªFÌB_>f9í3.»'/!m¢Ø 7Ïÿ¿ùôÝî%êóåKâ'ß…Ü^Ú©Ø]×pÖ×ÕŠÕ€Õ¯ÕÖ¢ÖY×3Ø+Ù?ÚkÛªÜÞfßáàcâøã“å?çíè¥êbìîÝï•ñKóñôöøzùÅúåûÚüŽý þ6þþ”ý®ü`ûùk÷¿ô¥ñî1êóåmá½Üò×-ÓÎÊíÅ7Âò¾8¼º~¸ƒ··>·ì·¹‘ºl¼Ÿ¾ Á¯Ã}ÆbÉfÌsÏÒ¨ÕÃØÝÛîÞúáùäîçÚê¶í‰ðLóö®øHûÚý\Ò;œê 8 p¦Ïë !í"Ù$µ&•(k*B,.à/¯1v3B57Ï8”:Y<>Ý?›AYC E¿F^HþI‚KùLTNŠO¢P€Q,R”R«RqRËQºP-OMƒJUG–CE?g: 52/ÿ(w"Çö. ëú)õÝï ëÁæûâÀßÝÆÚùØ×˜ÖõÕ—ÕÕ¦ÕýÕ…Ö7רûØÚ1ÛkÜ¿Ýß—àâ¨ãCåèæ™èNêìÈí‚ï@ñôòô<öÄ÷2ù…ú¬ûªülýôý1þþ²ýÜü¤ûùùÛ÷HõEòÏîøêÉæNâ©ÝÝØÔgÏèÊ»Æâ‘¿µ¼vºÂ¸®·%·8·½·Ï¸9º¼+¾”À)ÃïÅÕÈÌËßÎðÑÕ'ØGÛSÞeádä^çIê*íüïÅò}õ)øÇú[ýÞÿYÅ${ à 7e…¯·¶²£ “"v$[&7(*è+¶-ˆ/T13ç4²6t8=:<Á=‰?@ACµDjF H­I5K²L NTOgPZQ RƒR«RRîQõP‚O‹M KüGYD'@d;6a08*Ç#N…ËTüJöÝðüëç·ãYàŠÝ0ÛSÙÛ×ÊÖÖ¥Õ…ÕšÕîÕhÖ×Û×ÌØÒÙõÚ.Ü|ÝØÞNàÈáYãò䓿Eèôé²ëoí)ïêð™òNôæõx÷êøAúsûwüHýÙý'þþÊýýæûMúHøÎõÞò~ï»ëšç1ãŽÞÍÙÕMÐÆË€Ç¡Ã)ÀA½Öº¹Õ·?·'·¡·‘¸ï¹°»Á½À§ÂfÅ@È;ËDÎWÑxÔ‹×®Ú»ÝÏàÎãÊæºé™ìtï7òùô¢÷JúØüfÿÛO° V Ïõ3ISRR@ 3"$þ%Ù'¸)ˆ+_-,/û0Ä24X68ã9©;i=0?ê@«B`DF¾GWIíJcLÍMO5P)QëQnR§RŒRR,QÏO÷MK HEAZ<-7‡1s+%j¦Ö! Rýe÷ëñêìhèpäáÞ¤Û«Ù!ØþÖ3Ö¹Õ‹Õ•ÕÚÕRÖîַך؟ٻÚòÛ7Ý—Þà€á ãŸäEæêç¤éUëíÐî’ðCò÷ó–õ'÷¢øüù6ûDüý½ýþ%þØý3ýü¥ú®øKötó)ðxìkè äw߸ÚðÕ5ÑŸÌRÈWÄÓÀýL»]¹¸Q·'··a¸¢¹Y»T½¤¿&ÂÜıǪʩÍÄÐ×ÓøÖÚ#Ý9à9ã7æ*é ìéî¯ñpô ÷Åù]üäþgÐ>ã $ _Œ³ÍâïîðáÒ!½#œ%'W)/+-Ò. 0n2146Â79N;=×>“@TB D¾EhG I˜J LƒMÕNûOüPÇQXRR—R,R`QPVNL6IÖEÐAR=38¬2§,X&¸ÿ+p Û„þø÷òáíCé4å£á£ÞÜ ÚhØ4×XÖÎÕ‘Õ“ÕÊÕ;ÖËÖ’×lØmÙ‚Ú²ÛúÜMÞ½ß1á¼âPäîåšçIéë½ìxî:ðíñŸóFõÔöZø·ùùúüôü ýþ$þèýUýUüòúùÊöôÔð1í:éæä\à¤ÛÝÖÒƒÍÉÅvÁV¾»»·¹F¸o·&·j·.¸`¹þºï¼.¿§ÁSÄ$ÇÊÍ%ÐDÓXÖzÙŒÜß§â¤å—è~ëYî&ñéóœöBùÛûiþè[Ås ³ ñ If{ˆŒv!Y#B%!'ü(Ö*¥,}.C02Ú3¦5l729÷:»<}>=@ûAµCiEG¸HMJÑK?M”NÀOÏPŸQ>R”R›RERŽQ^P·NŠLÍI†F¤B:>;9È3Ü-—' !Q‚à Âÿ±ù ôÚî$êúåPâ3ßÜoÚ´Øq×}ÖêÕšÕÕÀÕ"Ö³Ög×AØ9ÙLÚxÛ·Ü ÞrßéàoâÿãžåDçõèªêfì!îßïšñGóôô…ö øsù¹úÚûÇüýóý!þôývý‰ü9ûtù=÷‘ôvñéíê½åBá‹ÜÍ×ÓcÎõÉÚÅ&Âç¾6¼ºƒ¸•·'·Z·ÿ·¹ªº‰¼¼¾*ÁÍØƀɃÌÏ©ÒÁÕÜØöÛßâåèîêÎíšðbóöÁøZûíýkåK­û G €·Üþ"+&"!ý"æ$Á&¤(w*O,.ï/¶1‡3H57Ø8ž:fê? AaCEÁFgHüIˆKöLSN‡OœPuQ%R‚R¡RXR·QŸPOýL_J1GpC?A:Þ4 /Ö(V"£Úlýßú!õÙï ëÆæãÊßÝÓÚ Ùª×­ÖÖªÕÕ·Õ Ö–ÖDרÙÚ;Û{ÜÇÝ/ß›à%â­ãLåóæœèVê ìËí†ïAñôòœô9ö¾÷+ù}úû›ü[ýÝýþüý’ý¹ü~ûÏù®÷õòŸîÅê“æ"âuݸØîÓEÏÍÊŸÆ×¿³¼uºÈ¸º·7·I·Ø·ã¸Xº*¼L¾­ÀKÃÆôÈèËüÎ Ò+ÕBØ]ÛpÞxáäpç`ê@íðÚòõ>øÚúlýòÿhÖ7Š Õ Ht“®½Ãɼ´ ž"„$g&E(*õ+Â-“/a1)3ô4¹6‚8E: <Ì=?KAC½DmFH­I:K¯LNJOhPLQRtRRkRÚQÝPdOlMëJÖG6Dý?;;õ540*Ÿ#ù.g¸= ü?öÙðúë“ç»ãeà’Ý?ÛaÙé×ÞÖÖ»Õ‘Õ°ÕúÕ{Ö!×ì×ÙØàÙÛ;܇ÝåÞXàÓábãúäæJèýé¶ërí.ïéðòHôèõo÷åø8úfûjü6ýÅýþþ¦ýéü¼û*úø õ«òPï‡ëjçýâcÞÙàÔ(Ð¥ËmljÃ!À9½×º¹ã·I·>·µ·ª¸ ºÈ»á½4ÀŃÅ]ÈZË]ÎxÑÔ«×ÃÚÕÝèàâãææËé³ì†ïNò õ·÷Zúìüvÿî^Á d £ Û,DWab]R =")$&é'Á)˜+h-;/1Õ2—4d6'8î9²;v=4?÷@°BiDFÃG\IíJhLÈMO-P%QßQbR˜RvRÿQQ·OÔMqKwHõD×@2<7]1L+é$G†º @ý^÷âñêìhèxäáÞ®ÛºÙ/Ø×CÖËÕšÕ¦ÕëÕaÖÿÖÅשحÙÈÚýÛFÝ Þà‰áã«äIæøç¤éaëíÔî–ðBò÷ó”õ!÷žøòù.û3üý§ýþþ¾ý ýûûyú„ø öAóúïFì7èÝãEßÚÆÕÑÌ7ÈGÄ¿ÀÁ½H»b¹¸\·:·—·v¸À¹r»r½À¿CÂùÄÑÇÄÊÊÍÛÐ÷Ó×+Ú?ÝLàUãLæ?é"ìùîÆñƒô3÷ÙùküúþtçK£ó 3 r—ÆÙôúûñà!È#­%Œ'd)>+ -à.­0v2B4 6Ì7™9U; =Ü>Ÿ@ZBDÆEkGIœJL‡MÍNûOóP¿QJR‘R‚RRDQÿO;NîKIªE¯A!=8z2‡,)&×U ÆuþøïòßíCé:å©á¬Þ!ÜÚxØE×gÖßÕ¢Õ¢ÕßÕFÖâÖ›×~ØvÙ–ÚºÛ ÝWÞÈß=áÅâYäøå çQéëÁì€î7ðòñžóAõ×öLøµùëúüåü‹ýñý þÍý3ý4üÅúìø˜öØóðíé·ä-àwÛ´ÖöÑeÍÉÅeÁQ¾·»¾¹K¸€·3·ƒ·B¸}¹»½G¿ÇÁpÄAÇ2Ê1ÍCÐ\Óu֑٥ܷ߼âºå®è‘ëpî:ñûó°öTùîû{þøoÓ1~ Ç þ2VtŒ”—€!j#O%.' )à*¶,ƒ.T02è3°5v7<9;Â<ˆ>D@B¹CpEGºHQJÏKBMŽN¿OÇP—Q2R…R‡R6RpQHP–NlLªI`F~B>9ž3¶-o'ë *l¤ ®ÿ¨ùôÕî(êýåZâ;ßžÜyÚÉØ|×ÖúÕªÕ¤ÕÍÕ4Ö¿Öy×OØGÙZÚ‚ÛÆÜÞ€ßñàyâ ä¥åNçùè±êjì%îâï™ñIóïôƒöøjù±úÌû¸ükýßýþÛýSýhüûLù÷dôDñ¸íÏéåá_Ü¢×ÞÒCÎÙÉÆÅÂá¾0¼º‰¸¢·:·l·¸9¹Äº©¼Ö¾JÁç÷Ɯɞ̬ÏÀÒßÕôØÜß%â*åèëßí³ðsó)öÓøkûþ{ö[¼ U ‘Ãî $167- ! #ð$Ò&¬(†*W,,.ø/Ä13V57ã8¨:lí?«AeCEÇFiHJ†KøLONƒO”PqQRyR‹RHRžQ…PõNÝL?J GLCó>:µ4å.°(4"ƒ½ù XìÕúõÖï ëÈæ ãÐßÝÞÚٶ׿ÖÖºÕ ÕÈÕÖ¨ÖN×*ØÙ&ÚGÛ†ÜÕÝ7ß©à+â¸ãVåöæ¨èXêìÍí‹ï@ñöò™ô5ö¹÷#ùrú’ûŒüGýÉýÿýäýoý˜üWû§ù€÷ðôßñpî“êdæñáKÝŠØÌÓ$ϰʌÆÄÂy¿¯¼uºÔ¸Â·K·Y·ñ·ý¸pºJ¼d¾ÏÀeÃ&ÆÉÌÏ'ÒBÕ]ØuÛ‡Þ‘á‘ä‹çrêUí#ðíò õRøéúý{æF™ æ !Xƒ ¿ÇÖÒË ¨"–$q&S((*ÿ+Ï-Ÿ/m1235Ã6‹8R:<Ù=”?UACÂDtFHµI5KµLNKO]PIQõQhR‹RWRÇQ¾PLOIMËJ³G DÙ?;Ë50ì)€#ÕP£-ü4öÛð÷ë›çÁãoà ÝNÛnÙû×ëÖ3ÖÊÕ¤Õ¾Õ ÖŒÖ/×û×èØìÙÛEÜ’ÝòÞ^àáágã夿Pèêºëví1ïëð›òJôàõn÷Ûø-ú]ûVü&ý­ý÷ýéýŠýÃü™ûýùï÷rõ}òïXë5çÐâ2ÞvÙ´Ô Ð‡ËTÇ{ÃÀ3½Üº¹ñ·Y·O·Î·Â¸%ºç»û½SÀãžÅ|ÈrË~ÎѪÔÃ×ÚÚðÝúàþã÷æäéÄì›ï`òõÊ÷lúþü‡ÿÿoÐ( s ³ é9Rhjsi` M"2$&ô'Í)¥+r-H/1à2 4q6-8ü9·;=>?û@¹BlDFÇG^IîJgLÇM O(PQÕQXRƒRhRåQûP˜O¹MLKWHÍD²@ <Ý651*+Ä$(j¡ô m8ýP÷èñãìqè}äá*Þ»ÛÉÙ@Ø×UÖÛÕ«Õ·ÕùÕtÖ ×Ø×´Ø½ÙÔÚ ÜPÝ®Þà•áã²äRæûç®édëíÛîðJòðó’õ÷”øëùû(üûü–ýéýîýýíüÕûQú\øïõóÆïìèªãß_Ú¡ÕïÐbÌ"È3ĶÀ¼½G»h¹'¸i·P·¬·Œ¸Ý¹‹»½Ý¿`ÂÅìÇàÊãÍùÐ Ô*×AÚWÝcàiãbæUé4ìïÕñ˜ôF÷èù€üÿ†ô]± C }©Óç  þì!Ô#º%–'s)G+-ë.µ0…2H46Ø7ž9c;$=ç>¤@aBDÊEqGIžJL‚MÎNñOîP³Q>RRoRR+QæONÐKòH‡EŠAù<ì7V2_, &uÂôE ±mþvøñòÚíLé>å¶á·Þ0Ü'ÚŠØS×zÖñÕ±ÕµÕêÕ[Öí֬׌؅ٞÚÌÛÝiÞÍßIáËâdäýå§çYé ëÇìî9ðóñ›óAõÌöLø¥ùäúôûÑü{ý×ýïý°ýýüžúÃøiö«ómðÒìÔèˆäþßMÛÖÓÑDÍðÈîÄ`ÁC¾»»½¹Z¸‡·M·‘·]¸”¹4»&½i¿àÁÄ_ÇJÊOÍ_ÐsÓ’Ö¥ÙÀÜÌßÓâÑåÁè©ë€îNñô¿öiùþû‹þ {æ=’ Ð <g‚™¡®¡¡Š!y#Z%<')ì*À,‘.]0+2î3¿5{7J9;Î<Ž>L@ BÀCuEGÀHPJÓK;MN¹O½PQ#RyRuRR[Q-P|NGLŒI9F[Bç=ò8r3–-I'É K” ù¤ÿŸùýóÚî&êæbâG߫܉ÚרŽ×¡Ö Ö½Õ²ÕàÕCÖÐÖ†×^ØUÙfÚÛÐÜ#Þ‰ßúà„âä®åSçé¶êpì&îçï•ñKóêô‚öþ÷bù¦ú¼û«üVýÇýíý»ý5ýAüíúùæö3ôñ‰íé_åáà6Üw×½Ò"ÎÁɱÅÂØ¾1¼º˜¸¨·P·€·-¸U¹ÛºÆ¼ò¾fÁÄÓÆ·É½ÌÂÏßÒõÕÙ'Ü2ßBâ8å3èëöíÃð‡ó;öäø€û þ’rÆ! a ¢Ñü3=HA>)!#ú$à&¹(*h,3.0Ï1š3_5+7é8¶:r<7>÷?¯AoCEÎFkHJ„KûLHNƒOŠPiQ RlRxR6R†QmP×N¾LJèF$CÏ>ð94À.‹("b£à HÚËúõÓïëÎæãÝß*ÝìÚ+ÙÉ×ÏÖ$ÖÊÕ²ÕÖÕ.Ö´Öc×2Ø'Ù.ÚXÛÜàÝCß³à5âÁã]åÿæ­è_êìÒíŒïAñöò–ô3ö°÷ùaú‹ûwü9ý¯ýèýÇýPýwü.û€ùT÷Áô°ñ?î`ê7æ¾á!Ý_بÓÏ–ÊwÆ´Âq¿¬¼vºÝ¸Ì·[·o·¸¹‹ºb¼†¾çÀ„ÃFÆ'É&Ì-ÏCÒ]Õu؎ۜޫá¤ä¢ç‡êgí:ðýò·õ_øû‹ý†úR® ï 6b”­ÌØàä×Í ¹"Ÿ$&_(2*,Ù-«/w1?3 5Î6•8Z:<à=›?^ACËDuFH³I;K¯L NDO[P©@kBDÏEuGIŸJL€MÊNíOæPªQ2RqR^RñQQÍOúM±KÎHbEaAÖ<½7425,æ%W›ß' ¤ZþoøèòÜíKéGå»áÅÞ;Ü7ÚšØb×ÖÿÕÆÕÂÕýÕiÖþּטؖ٪ÚÚÛÝtÞÙßTáÕâmäæ°ç^éëËì…î:ðõñ™ó?õÉöEøœùÛúäûÃüdýÂýÔýýòüèûzú”ø?öyó>ð¢ì¡èYäÍß#ÛaÖ³Ñ"ÍÖÈÞÄMÁC¾´»Æ¹b¸–·^·¦·w¸¬¹P»F½¿©Ä{ÇjÊhÍ{ÐÓ­Ö¾ÙÚÜàßíâäåØè½ë–îañ#ôÒözùüþŽõN¢ á Or”¦±·µ¨œ!„#f%J')ú*Í,š.k032ý3Å5Œ7N9;Ô<˜>U@BÆCzE#GÁHUJÑK>MŠN´O¹PƒQRdRiRRDQP]N+LfIF4B¿=È8M3k-&'¤ ï2w é‘ÿ•ùøóÒî.êæmâO߹ܔÚéØœ×±ÖÖÊÕÅÕðÕRÖßÖ—×kØeÙrÚžÛÜÜ/Þ“ßáŠâäµå\ç éºêtì,îçïšñKóæô€öõ÷]ù˜ú³û—üEý²ýÐý¡ýý!üÁúúøµöôäðUíoé+å³àÜN×—ÒÎ¥ÉÅùÁξ.¼º¸¹·^·”·G¸k¹üºÞ¼¿‚Á$ÄîÆ×ÉÕÌàÏøÒÖ)Ù>ÜMßTâTåFè-ë îÕðóLöùøû þ Ú. s ±á 'BKTRG=!## %é&È(›*t,@.0Ù1¥3l527÷8»:|ú?½ApC$EÒFoHJ‰KôLMNxO‰P\QR[RjRRpQSPºNžLûIÁFÿB§>Ç9i4–.h(í!FÍ -ϼú õÐïëÑæãçß5ÝýÚ6ÙÜ×ÜÖ8ÖÙÕÅÕäÕAÖÂÖr×CØ.ÙCÚ]Û¢ÜèÝOß½à>âÌãcåç´ècêìÔíïGñïòšô+ö¬÷ùZúyûnü ý¡ýÊý®ý/ýRü ûRù-÷Žô†ñî4êæ”áðÜ8ØÓàÎ}Ê[Æ«Âa¿«¼yºà¸Ü·h·ƒ·¸1¹¤º€¼¡¾Á¡ÃbÆEÉBÌGÏbÒrÕ“Ø¢Û·Þ¾áÀä³ç êyíPðóÌõpøû ý&œh¸  ?uŸÀØèîðæÜ Ä"®$Œ&j(B*,è-¶/1J35×6£8_:(<ç=¥?eACÐD|FH¸I:K³LNCOQP7QâQLRlR/RœQPOM…JlGÅC‡?Æ:{5Ä/ ):#“Ùyçû)öÐðúë¡çÏãƒà·ÝhÛŒÙØ ×QÖîÕÂÕâÕ(Ö­ÖKרÿØ Ú%ÛcÜ§Ý ßtàòá|ã嵿\èêÄë}í8ïìðœòGôÙõc÷ÌøúCû;üý…ýÆý´ýIýüMû­ùš÷õò¼îöêÔæsâÕÝ%ÙgÔÇÏOË%ÇZÃÿ¿)½Ýº'¹¸y·u·ú·ñ¸\º¼4¾ÀÃÚŴȫ˲ÎÅÑÜÔ÷× Û!Þ%á.äçêîìÀï‹òAõò÷ú!ýªÿ ‘ðF “ Ò 4Vq€ŒŠ‡x h"K$3& (ç)»+-Z/,1î2½46G8 :Î;=N? AÂB}D&FÎGfIðJgLÅMO P QÄQ8RiRAR»QÈPdOxMK H‡Da@¿;Š6ê0Û*~$ç+pÄ NýB÷Ûñäìzè†ä&á=ÞØÛåÙ_Ø@×sÖÖÈÕÛÕÖÖ.×î×ÖØÓÙñÚ"ÜiÝÃÞ+à¨á.ãÄäbæ è¸éoë%íàî•ðIòïóŒõ÷‡øØù û üÛülý»ý¸ýbý©üŒûúø—õ´ògï´ë¤çMã¾Þ ÚTÕ§Ð*ÌïÇÄœÀ±½E»v¹5¸Œ·p·Ú·»¸º¿»Î½ÀŸÂLÅ(ÈËÎ.ÑAÔ^×tÚ„Ý“à–ãæé^ì8ïþñ¾ôj÷ú£ü-ÿ§zÔ" b œÈî''& "í#Ö%°'‹)`+2-/Î0˜2c4%6ñ7°9u;9=ô>·@mB$DÔEyGI¡JLMÉNåOâP›Q*R]RQRØQþP°OÞMK­HX@BÊC‚E%GÅHVJÓK=M‡N¯O°P~Q R]RRR÷Q,QøO@N LDIñE B›=ž8)3B-'€ Ôc Ó…ÿ‰ùóóÓî-êætâYßÉÜ Úúت×ÅÖ*ÖßÕÑÕÖ^ÖôÖ¡×|ØrÙ€Ú©ÛëÜ5Þ¤ß á˜â äÀå`çéÀêxì0îèï›ñHóæôzöñ÷Sùú¡ûŒü,ý ý¶ý„ýôüûûžúÍø‹öØó´ð'í:éåàßÛ$×tÒã͌ɇÅíÁž-¼º¨¸Ä·q·¨·\¸ˆ¹»ÿ¼*¿¢Á=ÄÇòÉðÌýÏÓ+Ö?ÙXÜcßnâeå`è<ë#îæð³ó]ö ù¢û/þ²'ì: … ½ó7NYc]XE!5#%û&Ï(®*z,P.0æ1°3v5=79Ã:‰@¿AzC(EÖFsHJŠKôLGNwOPWQòQMRYR RZQ:P›N‚LÕI£FÕBƒ> 9A4s.@(Í!$h´ Á°ú õÍïëÕæ$ãñßBÝ ÛDÙí×ëÖHÖëÕÑÕúÕKÖÕÖ×PØAÙJÚoÛ©ÜøÝVßÈàHâÑãqå ç¿ègê!ìÚíŽïGññò•ô)ö§÷ ùQúnû\üý‡ýµýýý.üäú-ùýöeôSñÛíêÓåeáÄÜØYÓÄÎ`ÊIÆ™Â[¿¦¼|ºè¸è·y·—·3¸I¹¿º¼¹¾)ÁµÃ†Æ[É_ÌcÏyҎժغÛÐÞÒáØäÇç´êíað#óÜõ„ø"û³ý4­wÈ  M‡«Ñãøùþõæ Ô"¸$š&w(M*#,ñ-Ä/‰1Z35ä6«8i:1<ì=±?hA$CÒDƒF H»If@BÖC„E+GËHUJ×K9M†N­O§PuQRMRBRáQQÜO"NëK!IÍEçAq=w83-Þ&_ ²øI Ásÿ€ùêóÐî0êæ|âdßÑܲÚÙ½×ÔÖ9ÖðÕâÕÖqÖײ׊Ø~ÙÚ·ÛôÜFÞ¨ßá›â/äÄåjçéÆê}ì3îëï›ñHóäôtöî÷Iù†ú–ûxü ý„ý¡ýfýÓüÙûtú§ø]ö¬ó‚ð÷ì éÎäVà²ÛüÖQÒÃÍsÉtÅÝÁ¾¾*¼!º°¸Ñ·€·À·o¸£¹-»½M¿¸Á`Ä'ÇÊ ÍÐ*ÓDÖZÙmÜ}ß‚â~åsèTë5îýðÂóqöù²ûEþÀ8ŸúM ‘ Ï&G[joleT!>#%%'á(´*‹,W.(0ò1·3…5C79Ê:“@ÉA~C1EØFxH J‹KóLHNoO|PIQìQ{94L.(ª!P• ®¦úõËïëÜæ(ãûßNÝÛXÙ÷×ÿÖXÖúÕçÕÖ`ÖàÖ’×\ØQÙUÚ~Û´ÜÞaßÒàRâÜãuåçÁènê'ìÜí’ïGñðò•ô#ö¥÷ùIú_ûNüýütý›ýsýôü üÃúþøØö0ô(ñ¨íÒé¤å4á›Üä×7Ó¢ÎCÊ6Æ…ÂU¿Ÿ¼€ºí¸õ·Š·ª·J¸`¹Ýº´¼Ü¾>ÁÚÜÆ~ÉẁϓҩÕÂØÖÛäÞïáèäâçÅê¨ísð9óïõ—ø6ûÂýI»*„Ü b‘¿Ûõ  ÷ Þ"Ç$§&‚(\*/,ÿ-Ì/š1^3,5ì6´8u:8<ú=³?tA&CÝD†F'HºIAK«LN7OIP$QÌQ1RJR RmQ]PØNÓLAJ(GvC>?s:/5u/U)ô"O¢çPêÐûöÌðùë¨çßã’àÑÝ€ÛªÙ:Ø,×tÖÖåÕÖLÖÇÖn×5ØÙ%ÚBÛvÜÂÝß‹àâã$åÂænèêÑë„í<ïððòBôÔõZ÷»ø ú)ûüÞüZý—ý|ýý;üû^ùC÷¾ô½ñ_îêyæâÝÏØÔ‚ÏËøÆ8Ã뿽áº3¹¸š·˜·*¸ ¹ºV¼j¾ÉÀSÃÆìÈåËèÎúÑÕ&Ø>ÛOÞUáZäIç<êííï­òkõø¶úCýÌÿC±g ± ð 'RtŽœ¨¥¢• "j$G&'(ÿ)Ô+¥-s/?13Ò4”6\8:á; =_?AÓB†D3FÓGnIòJhLÁMüNPýP®Q RIRR‘Q˜P+O>MÊJÊG9D@m;>6š0*6$£ñ9š )þü3÷Ìñèìyè—ä4áUÞðÛÚ|Ø_×–ÖÖìÕùÕ<Ö­ÖN× ØóØîÙ Û8ÜÝ×ÞCàºá@ãÖäoæèÅéxë-íèî”ðNòéó‡õ ÷uøËùíúðû¸üDýŠý…ý$ýhüCû±ù²÷<õYò ïOëJçêâgÞµÙÕdÐðËÁÇëÆÀ¤½F»¹J¸©·”·¸í¸Cºù»¾PÀÕ‡Å`ÈMËUÎbÑvÔףڹݾàÆã¸æ«é†ìaï#òåô÷4úÅüOÿÉ6žò@ ‚ ¸æ #9@E>3 !" $ë%Ë'¢)z+H-/â0²2u4=68Ä9‹;G=?Å@zB3DÜEƒGI§JL}MÀNÞOÑP‹QRCR)R±QÌPzO¤MMKhHóDï@`j@)BØCE-GÎHYJÓK=MN©O¢PhQùQ9R5RÊQQÀO NÊKI«E¾AO=N8Ú2õ,¼&; •Ü3 ¬hÿsùçóÌî1êæâqßÛÜÁÚÙÎ×ßÖOÖüÕõÕ Ö‚Ö ×Âו؎ٚÚÃÛÝOÞµß%á§â5äÎårçéÍêì9îìïœñHóàôröç÷Aù{úŠûgüýlýŠýIý´ü·ûPúzø6özóVðÇìÚè¡ä(à‡ÛÖÖ+Ò§ÍWÉbÅÍÁ¸¾'¼%º¸¸Ý·’·Ñ·‹¸¸¹I»4½f¿ÙÁzÄCÇ,Ê&Í3ÐDÓ]Ösمܕߖâ—å…èmëEîñÔó„ö0ùÄûTþÒH® Y ¥ Û8Qmu|{pb!K#1%'ì(Á*–,d.20ý1Ä35Q79Ù:˜@ÐA…C4EÞF{H JKòLCNnOrPFQÛQ4R7RåQ.QPhN>L—IVFB3>S9ò3%.ø'†!æ/ õœžúöôÊïëàæ/ãàVÝ'ÛbÙ Ø×cÖÖòÕÖlÖóÖ›×oØYÙfÚˆÛÁÜÞmßÝàZâèãzå!çÂèyê(ìáí–ïEñôòô!öž÷üø>úUû<üîü\ý…ýWýÔüêû›úØø­öôûðwí¥ésåáoܽ×Ó‚Î+ÊÆ{ÂI¿ž¼‚ºõ¸¸œ·¹·e¸s¹úºÏ¼÷¾[ÁööƜɑ̛ϬÒÄÕØØñÛøÞâþäöçÛê¸í‰ðJóö«øDûØýUÑ5™å 6 k¥Éëÿ í"Ô$°&’(d*:, .Õ/¦1i365õ6Á8{:D<þ=¿?yA/CàDŠF)H¿I=K±LN4OBPQÄQ#R:RùQVQEP¾N±L$JGSC?N:5O/2)Ñ"2„Ï<ØÈû öÌðõë­çäãàÚÝÛµÙKØ;×…ÖÖõÕÖZÖ×Ö|×BØ/Ù.ÚQÛ‚ÜÌÝ)ß“àâ™ã*åÎænè#êÓë‰í?ïñðò?ôÓõP÷¹øüù ûüËüHý~ý`ýñüüàú4ù÷Žô“ñ,îeêDæéáPݨØ÷ÓbÏþÊãÆ)Ãß¿½ßº=¹'¸¦·°·9¸=¹§ºq¼‡¾ãÀqÃ/Æ ÉÿËÏÒ)ÕAØVÛcÞqáhäeçLê+íÿï¿ò}õ$øÇúUýÛÿU¾$s  ÿ 6_ƒš¬´³¯  Ž"t$V&2( *Þ+±-~/I13Ú4ž6h8":î;¥=j? AÚBŠD8FÖGoIôJeLÀMùN PôP£QRá`ÞþÛÚŽØnרÖ-ÖÿÕÖLÖ¾Ö[רÙúÙÛFÜŠÝäÞLàÂáMãÙä{æèÊé~ë2íçîœðHòìó‚õ÷qø½ùåúàû¦ü0ýtýiýýEü û‡ùŠ÷ õ.òÖî&ëçÄâ5ÞŽÙáÔ?ÐÙ˦ÇÞÃ{Àž½G»‡¹R¸¼·£·¸¹^º¼¾mÀî©ÅwÈmËoÎyѕԥ׾ÚÍÝÖàÛãÎæ¾éìrï:òóô£÷CúØü^ÿÚI« P Èõ3FMSKA ,"$÷%×'®)„+V-%/ï0»24J6 8Ñ9‘;O=?È@…B5DäE…G"I¤J"LyM¾N×OÈPƒQR6RRQ´P_O‰M*KGHÍDÊ@9< 7š1š+[%Í&qÏ X$þHøÔòÖíVé[åÞáïÞnÜnÚר¢×ÍÖBÖÖÖ@Ö£Ö>×ó×ÒØËÙßÚÜOÝ›ÞàxáýâŽä%æÌçvé&ëÞìîGðññ›ó0õ»ö'ø~ù©ú±û~üýfýnýýnüZûÞùì÷’õ½ò‚ïßëáç›ãßwÚÇÕ$Ñ­ÌsÈÄ!Á¾¸»Ò¹ˆ¸Ï·¢·ý·Ð¸º»»µ½ö¿sÂÅïÇ×ÊÙÍäÐøÓ×#Ú6ÝAàDã>æ.é ìèî®ñpô÷ÀùZüàþaÏ5‘Ý \†²ÊÞìëíÞÐ!¸#›%z'S)(+þ,Ê.˜0_2*4ï5´7x97;ú<¸>t@-BáCE4GÏH[JÖK6MN OP_QêQ.R"R·QéP¦OêM«KÝH†E˜A(=&8´2Ñ,”& t ˜ZÿhùàóËî2êæ‰â}ßãÜÔÚÙá×ðÖ]ÖÖÖ1Ö‘Ö×Ñפ؛٥ÚÓÛ Ý]Þ¾ß/á²â:äÙåvç#éÏê†ì:îîïŸñDóáômöÞ÷<ùnú}ûXüøüZýlý/ý“ü’û,úOø öMó'ð–ì­èoäüßZÛ¯Ö Ò†Í@ÉMÅÀÁ³¾!¼-º½¸ë·¥·ã·¢¸Ñ¹d»P½¿öÁ•ÄbÇEÊEÍJÐcÓsÖٞܪ߱â©åœè€ë[î&ñåóšö>ùÙûeþãY¿p ¬ ñEeu‰†‹}p!Y#=%'÷(Ï* ,s.;0 2Ï3—5[79à:£<`>@ÖAŠCNkOiP=QÐQ#R(RÏQQêOJN LtI2FiB >-9Ê3.Ó'd!Æj à‘úñôÅïëãæ7ãàdÝ3ÛqÙØ×zÖÖÖ&Ö~Ö׫×}ØfÙuÚ“ÛÍÜÞußêàaâñã„å&çÌè}ê-ìçí•ïJññòô ö•÷õø4úEû0üØüHýký<ý²üÉûtú²ø}öÛóÆðLíréBåÝà@Ü—×îÒcÎÊ ÆkÂA¿š¼„ºþ¸ ¸ª·Ñ·v¸“¹»î¼¿{ÁÄÖÆ¶É­Ì·ÏÇÒÜÕôØÜßâå èðêÎí›ð_óöºøZûæýißG§÷ D z¶Õþ'$!÷"â$½&ž(p*J,.ç/¬1x3=57Ä8:E<>Â?ƒA4CçDŽF0H¾IBK­LþM1O:PQ·QR)RçQ>Q-P¡N•LÿIßF0Cì>+:Ü4*/)ª"e¶(ȹûöÂðúë¯çëã§àåÝÛÅÙZØK×–Ö*Ö ÖÖmÖæÖˆ×UØ7Ù@ÚZÛÜ×Ý5ß›àâŸã4åÔævè)êÕëí@ïóðœò>ôÎõM÷¯øõùûü¸ü4ýdýHýÏüúû¸úùïöcôcñþí3êæ¶á(Ý}ØÕÓAÏãÊËÆÃÔ¿½áºA¹4¸µ·Á·R¸Q¹ÅºŠ¼¥¾ÿÀŽÃKÆ&ÉÌ!Ï+ÒEÕYØlÛ}Þ„áä|ç^êAíðÕòõ7øØúgýíÿdÒ0‡ Ï En‘¨¹ÂÁ¼¬ œ"$d&>(*ì+¹-/O1$3à4­6m82:ï;µ=k?-AÝB“D9FÞGpIöJgL¼MõNPìP˜QR(RøQdQiPóNMˆJ†GìCÒ?;õ5L0G*ð#b·n èü÷Êñâìè£äEájÞ ÜÚžØ|×·Ö<ÖÖÖ^ÖÊÖk×)Ø Ù Ú#ÛSÜ•ÝñÞSàÐáRãääæ$èÒé‚ë5íëîžðHòìó~õ÷jøµù×úÕû‘ü!ýWýVýãü+üöúfù]÷ãôò§îôêææ‘â ÞeÙ¸Ô#зˑÇÌÃnÀš½E»¹\¸É·µ·1¸¹xº.¼9¾ˆÀ ÃÃŕȉˇΘѩÔÃ×ÓÚçÝìàñãåæÓé°ìˆïKò õ´÷VúçürÿêX¿ a Ÿ ×&AS^^[M ;"#$&â'½)Ž+e--/ÿ0Ã2Œ4T68Ü9˜;[=?Ð@ŽB8DìE‡G&I§J LzM¹NÔO¿P{QòQ(RR†QŸPCOkM K#H«D¤@<û6q1x+3%¯X¶ Fþ;øÐòÒíZé\åëáñÞ€Üx򾯡×ßÖOÖÖÖPÖ´ÖLרàØÖÙìÚÜXݨÞàá ã”ä.æÔçyé0ëÝì—îEðõñ˜ó.õ¶ö#ørù¢ú ûqüýPýUýýüQü6û·ùÄ÷dõòUï­ë³çmãíÞJÚ£ÕþÐ’ÌZÈ~ÄÁ¾´»×¹“¸Ù···¸ë¸,ºÕ»Ñ½ÀÂ9ÅÈõÊóÍþÐÔ&×>ÚNÝXà[ãSæAé$ìûîÃñô2÷ÒùmüðþsÞHží 1 h™»Ûìøý÷íÝ!Ã#¨%‡'^)7+-×.¡0l254÷5Á7~9E;=À>}@3BçC–E6GÔH\JÖK8M{NO”PWQÞQRR£QÓPŠOÑMˆK¿H^EyAû<8Š2¬,q&ùU¦ †FÿaùÕóÍî/ê"æŽâ†ßðÜÝÚ-Ùì××kÖ ÖÖ?Ö¢Ö+×ßײاٵÚÜÛÝhÞÈß:á»âEäßå~ç(é×ê‹ì=îòïñGóÞôiöÚ÷1ùeúpûFüêü?ýXýýtüqûú)øßõ"ó÷ïjìzèDäÎß1ÛˆÖçÑeÍ*É7ŵÁ¨¾"¼-ºÈ¸ø·±·ü·³¸ï¹z»n½œ¿´ÄzÇfÊZÍjÐxÓŽÖ¦Ù´ÜÃ߯â¿å±è•ënî:ñùó«öSùèûxþóiÏ+{ ¿ ü+Tq…”—–Œ{!g#I%+')Þ*¨,.F02Ú3£5c7*9è:«'@ÚA•C>EçFHJ‹KóLãàoÝ?Û€Ù(Ø*׋Ö(ÖÖ5ÖŒÖ׺׊ØvÙÚ¡ÛÙÜ%Þƒßñànâøã‹å.çÒèƒê1ìéí˜ïLñïòôö‘÷îø)ú:ûüÉü1ýVýýšü£ûPú‹øSö¯óšðíEéå°àÜn×ÌÒBÎ÷ÉøÅZÂ:¿–¼‡º¹¸º·å·‹¸«¹*»½0¿“Á/ÄñÆÐÉËÌÏÏáÒ÷Õ Ù Ü*ß0â.åèëßí°ðqó&öÎøiû÷ý{ì\² N Áå -6/,!#ë$Í&¦(‚*O,$.í/»13I5 7Ò8‘:S<>Î?‡A=CëD’F4H¾IEK«LþM-O2PQ©Q RRÒQ,QP†NvLáI»F CÇ>:¹4/é(Š"òI·­ûýõÀðöëµçìã³àîݨÛÓÙgØ[פÖ=ÖÖ0ÖyÖôÖš×^ØIÙJÚhÛœÜáÝ@ߥà$â¨ã<åÚæè*êßëíEïôðò<ôÌõG÷©øëùûóû¦ü!ýLý/ý²üØû–úæøÇö6ô7ñÏíêëå‰áÿÜUدÓ$ÏÇÊ¸Æ ÃË¿½äºH¹>¸Ã·×·b¸o¹Ùº¦¼Â¾Á­ÃeÆAÉ6Ì8ÏHÒ]Õp؇ےޚáœä‰çzêPí%ðéò õLøæú{ýûÿwßC“ á T{ ¸ÄÓÌÊ» ¦"$o&J($*÷+Ç-–/_1+3í4¶6v8;:ü;·=z?.AçB—D?FáGrIúJdL¼MôNþOéP‹QýQRèQMQSP×NçLhJbGÌC¦?ù:Ê5)0!*Î#B—ñT úÔü÷Àñäì„è¦äPáqÞÜ(ڬ،×ÅÖPÖÖ(ÖjÖÜÖv×:ØÙÚ/Û^Ü¢ÝùÞaàÕá]ãî䆿.èÖé†ë;íîîžðIòéó~õüöcø¬ùÍúÅû…ü ýCý8ýÊü üÓú@ù2÷ºôÓñuîÌê²æiâÞÝ>Ù”ÔИËǶÃhÀ“½D»•¹e¸Ö·Ê·A¸6¹ŒºL¼Q¾¥À(ÃàůȤˡβÑÃÔÚ×ëÚÿÝá äöæëéÂì›ï_òõÇ÷fúûüÿþfÎ p ® æ7KfepeZ J"+$&ì'É)›+m-;/1Ï2˜4[6 8ã9¢;d=?Ý@BDDìEG&I©J LwM¸NÌOºPoQèQRðQvQ‚P/OIMïJH…Dƒ@æ;Û6D1Z+%é;¤ 1 þ2øÉòÒíZébåñáþÞŠÜ…ÚóØÃ×éÖdÖ$Ö#Ö^ÖÂÖ[רðØáÙûÚ ÜcݵÞàá ãžä6æØç…é.ëèì“îLðóñ–ó0õ¬öøjù•ú”û`üñü:ý;ýáü0üûùž÷7õgò$ïë…ç<ãÃÞ"Ú{ÕãÐpÌFÈmÄÁ¾°»ß¹š¸ê·Å·%¸ÿ¸Gºï»ë½-À¬ÂSÅ&ÈËÎÑ+Ô?×WÚdÝoàpãhæXé6ìïÔñ–ôA÷çùyüÿ€óT±ù C tªÇêú úè!Ñ#´%’'l)A+-ã.¬0w2>46È7‹9J; =Æ>†@8BïC™E;GÙHYJÜK2M{N—OŽPLQÖQRRQ»PrO±MlKšH>EOAÚ<Û7g2„,Q&Ô=‡ï s9ÿVùÓóÅî7ê!æœâ‰ßÝåÚ@Ùù××Ö+Ö'ÖNÖ®Ö>×é×ÅØ²ÙÃÚçÛ$ÝpÞ×ß@áÇâKäèåƒç2éÙêìBîðï¤ñAóÝôeöÒ÷,ùWúdû7üÕü,ý<ý÷üSüNûàùÿ÷µõôòÊï9ìNèä¤ßÛfÖ¿ÑOÍ É)ŧÁ ¾"¼.ºÓ¸¸Ä· ¸Î¸º›»ƒ½¼¿-ÂÍÄœÇzÊ|̀ДӨּÙÌÜÚßÙâÚåÁè¬ëîOñ ôÀö`ùþû…þvà9‹ Î 6fz™›©Ÿœ†!u#S%8' )é*µ,‰.T02æ3ª5p709ö:°+@åA—CEEìF‚HJŠKòL:NaO^P*QºQ RR«QçP»ONåK/IîEB¿=Þ8|3µ-ˆ'#!„ß5 »k|úáô¿ïëìæCã$àxÝNÛÙ8Ø=וÖ?Ö!ÖIÖšÖ ×Èח؅يڱÛáÜ3ÞŒßûàwâä”å5çØèˆê9ìèí¡ïFñôòŠôö‹÷åø ú-ûü¶üý<ýýxüû,ú`ø+ö€ólðììéçäàîÛFרÒ"ÎÞÉâÅOÂ0¿”¼‰º ¹%¸É·ú· ¸Å¹A»$½K¿®ÁNÄ ÇìÉêÌåÏÿÒ Ö%Ù6ÜBßFâDå4èë÷íÁð…ó9öàøzû þ‰iÅ \ ŸËù+?<D5+!#ú$Ø&µ(Š*^,/.ù/Å1Š3V57ß8—:_<>Ö?ŽABCñD˜F6HÂIDK¬LúM)O,PQŸQýQRÀQQûOgNZL½I™FåB¡>Ü9‘4Ý.Ä(f"Õ,…ü©žûúõ·ðýë³çùã¸àûݶÛãÙuØm×´ÖKÖ*Ö:ÖÖר×nØTÙYÚtÛ¦ÜðÝFß¶à)âµãBåâæ‡è0êäë’íIïóðŸò8ôÉõB÷¡øáùøúåû”ü ý6ýý–ü´ûqú¾ø›ö ôñ¡íÓé½å[áÒÜ-Ø‹ÓϰʠÆûÂÿ½éºK¹M¸Ñ·ë·y¸‡¹óºÅ¼Ù¾9ÁÇÂÆ`ÉNÌWÏbÒvÕŒØÛ¬Þ±á¯ä¥çˆêkí5ðþò²õ_øøúŒý †óN© é 2]Ž®ÁÛ×âÒË ±"$y&W(0*,Ó-¢/g173÷4À6ƒ8C:<Ã={?Œ@@BóCŸE?GÛH]JØK4MsN•O„PEQÅQRêQ~Q P[O“MLKxHE+A²<¶7=2b,*&¶rÔ d)ÿLùÎóÂî8ê)æ¡â—ß ÝöÚKÙ Ø ×Ö?Ö1ÖcÖ¼ÖM×ù×ÏØÂÙÎÚõÛ/Ý|ÞÞßOáËâXäìåç4éáê“ìBî÷ïžñEóØôaöÌ÷"ùNúTû*ü¿üý ýÚü3ü-û·ùÚ÷†õÇòïì èäãußÝÚ<ÖŸÑ/ÍôÈŘÁœ¾¼6ºÙ¸¸Ö·¸è¸ºµ»ž½Ú¿GÂìĶǗʗ͚ЮÓÀÖÖÙåÜïßôâéåÞè¼ë—îañôÒösùü˜þ‰ïJš ß Hr‹¤¬µ®¨”!€#d%@')ð*Å,”.]0+2ì3¸5x7<9ý:¼5@éA CIEðF‰HJKîL8N\OVP#Q­QúQôQ•QÓPŸOóMÅKIÊEøA™=¹8V3Ž-h'û l¼$ ¡clúÜô»ïëïæMã)à†ÝZÛšÙHØKרÖKÖ5ÖUÖ«Ö/××צØÙ™Ú»ÛðÜ<Þ—ßáƒâäŸå:çàèê:ìñí›ïPñëòôöˆ÷Ýøú!ûÿû¥üý#ýéüVüdûú;øÿõSó?ð½ìåèºäQàÅÛ׆ÒÎÄÉÎÅ@Â)¿‘¼Žº¹1¸Ü·¸½¸Ø¹`»<½h¿ÊÁjÄ'Ç ÊÍÐÓ&Ö=ÙLÜ[ß[âZåIè.ë îÕð—óKöòøûþ›yÖ' p ¨à%<HPLF5!!#%æ&¿(˜*j,8.0Í1—3_57æ8£:f< >ß?“AJC÷DF6HÈIBK¬LøM$O(PùP—QîQùQ¬QýPáOMN9LžIsFÁB{>´9m4³.£(A"¶lé––ûìõ»ð÷ë¼çüãÁàÞÀÛñÙ†Øw×ÉÖXÖ:ÖLÖšÖ×·×|ØbÙfÚÛ²ÜûÝRß¾à5â»ãLåêæè8êçë˜íIï÷ðžò6ôÈõ9÷œøÖùîúÓû…üôüýøürü—ûHú˜øröÛóÝðmí¨é‹å-á©ÜØhÓáÎ“ÊÆë¹¿ ½çºV¹T¸å·ú·“¸œ¹»Ý¼÷¾UÁäÃÆ~ÉhÌsÏ{ґգطÛÂÞÉáÄä¸ç¡êzíOð óÊõløû›ý—b´ ÿ :r™¿ÑåêëãÖ ¿"ª$„&h(7*,Ü-®/t1@35Ë6Š8P: <Ï=‚?CAïB¦DGFéGzI÷JfL¹MèNøOÑP{QßQúQ¿Q&QP¦N£L-JG„CY?ª:~5Ù/×)…#YÀ& ׺ü÷¶ñäì†èµä]á‹Þ/ÜHÚÈØ¬×çÖkÖBÖDÖ‹ÖùÖ•×VØ3Ù6ÚDÛ{Ü·Ýßtàëáoãûäšæ6èçéëFíðî£ðGòéótõõöRø›ù¶ú¨ûaüáüýý‘üÁûúíøâö^ôxñîjêVæ â†ÝéØKÔ¿ÏcËRÇ–ÃRÀˆ½J»š¹¸ð·ñ·l¸d¹Ãº¼Œ¾ÛÀdÃÆíÈ×ËÝÎäÑøÔ ØÛ-Þ2á3ä&çêðì¿ïŠò=õï÷‡ú#ýÿ#…ð? Ž Í 0Sj„‰ƒt c"G$-&(ã)±+ˆ-O/ 1â2°4o658ô9·;s=1?è@ŸBMDùE•G+I­J LuM±NÀO­PXQÐQ÷QÏQIQUPõNM¬J¼G;D4@œ;†6ú0 +Å$L«u íýø¼òÏí[éoåÿáߡܠÚÙÞ× ×ƒÖEÖCÖ{ÖãÖw×.Ø ÙÿÙÛ;ÜyÝÍÞ.à£áã²äCæéçé<ëíìŸîKðøñ”ó(õ¨ö ø\ù{ú|û;üÊüýý«üìûÍúDùH÷ãôòÆî!ë%çáâhÞÏÙ.ÕžÐ7ÌÈGÄðÀ¾²»æ¹¯¸¸ê·M¸0¹xº'¼"¾fÀç‹ÅcÈBËHÎMÑbÔr׆ڕÝàŸã”æéaì7ïüñ»ôf÷ úžü(ÿ¡tÒ ` •Äê##  "ì#Í%¬'ƒ)Z++-ø.Å0Œ2V46ß7›9a;=Ù>“@HBúC£EEGÛHcJØK2MsNŽO~P;QºQôQØQkQ‡PAOwM+KUHöDAŽ<‰725, &ûT½ Mÿ>ùÅóÂî4ê/æ¤â¢ßÝÛZÙØ/ןÖKÖHÖkÖÐÖX× ØÛØÒÙÚÚÜ:݉ÞèßYáÕâaäôå—ç9ééê–ìHîøïŸñGóÔô_öÇ÷ùFúGûü­üýý½üüû”ù¯÷\õšòlïÛëìç¹ãEßµÚÖ€Ñ ÍßÈþÄÁ’¾¼7ºâ¸¸ç·5¸ü¸6ºË»Á½ñ¿g ÅÑǶʱͶÐÊÓÚÖîÙþÜà ãæíèÖë¨îvñ3ôäöˆùüªþ)˜W® ì +Xœ²»Ã½´¤!‹#s%L',)û*Ò,ž.l032ü3¿5„7G9;Å<ƒ>:@õA¤CPEõF‹HJŽKñL4NYOOPQ£QìQãQ‚Q»P†OÕM¦KêH§EÐAs=803c-D'× F¤ ‘LaúÓôµïëðæQã3àÝhÛ¨ÙWØY׸Ö[ÖDÖfÖ¹Ö=×çײؠ٦ÚÈÛýÜFÞ¤ßá‹âä¨å@çëèêEìïí¦ïIñóòˆôö÷×ø úûòûüôü ýÎü7ü>ûßùøÖõ%óðŽì³èŠä#à—Û÷Ö]ÒéͥɽÅ. ¿¼Œº¹9¸ì·¸Ð¸ó¹z»X½„¿êÁƒÄHÇ#ÊÍÐ3Ó@ÖXÙgÜpßxâlådèBë!îéð«óböù¥û)þ¯"ˆê5 ¼é/NV^\QG!)#%ì&Ñ( *z,A.0Ø1¥3h5,7î8®:p<(>ê?šAQCþDŸF@HÅIIK§LùMO#PñPQÞQêQ™QçPÇO1NL}INFœBS>‹9C4.z("”îT͇ƒûçõ°ðøëºçäÊàÞÏÛüÙ“ØŒ×ÐÖpÖDÖ_Ö¨Ö"×Ä׌ØoÙsÚÛÀÜÞ]ßÈà>âÅãWåðæ•è=êìëžíKïùðœò7ôÃõ6÷–øËùãúÄûsüàüýÚüWüsû$úqøEö°ó«ðAíué\åÿàzÜÛ×AÓÁÎwÊvÆÜ«¿ ½æº_¹]¸õ· ¸¨¸·¹'»ü¼¿qÁļƖɋ̈ϛҩտØÏÛÚÞâáÛäÑç´ê”í_ð&óØõ‚ø"û«ý6¥qÇ L¨Îàôøùòá Ñ"³$˜&n(J*,í-·/ƒ1H35Ô6–8X:<×=Œ?JAùBªDOFëG~IøJiLµMæNóOÉPrQÐQëQ¬QQP†N‰LJùFYC5?~:V5°/®)c#Û? ½°üøö²ñÞìŠè¶äháÞ=ÜR򯯼×ôÖ€ÖJÖYÖ™Ö ×¤×dØAÙAÚUÛƒÜÆÝß‚àôáxãå æAèëé•ëIíõî¦ðJòåótõïöMø“ù©ú™ûRüËüýæürü¢ûiúÇø¶ö3ôFñìí5ê*æÚáYÝÁØ"ÔÏIË6LJÃEÀ‚½J»£¹†¸¸þ·†¸z¹Ýº¼¦¾üÀ}Ã5ÆÉôËøÎÒÕ'Ø7ÛEÞKáIä=ç(êíÖï›òUõþ÷Ÿú/ý¶ÿ0›þR ž Û <ex’˜‚ r"T$;&(î)À+’-]/*1ð2·4}6=8:¿;}=9?ð@¥BTDýEœG,I³JLzM¨N¿O¤PNQÆQçQ½Q3Q>P×NóL‹J™GD @r;`6Ñ0â*¢$%Žæ] øÛýø³òÍíZésåâ߬ܮÚÙð×וÖSÖTÖŒÖòÖ…×>ØÙÚÛKÜ„ÝØÞ9à­á*ã¹äNæðç•éCëðì£îNð÷ñ–ó$õ£ö øOùwúhû1ü²üúüéüüÍû¨úù÷´ôÜñ”îóêôæ²â<Þ¢ÙÕ|ÐÌþÇ5ÄàÀ¾°»ë¹·¸¸û·c¸F¹“ºA¼>¾…ÀìÅ|ÈcËbÎiÑ|Ôנڰݳà¸ã¨æ™évìLïòÏôz÷ú°ü9ÿ¶#ˆÞ- l ©Òù&120 "÷#Ü%¸')f+9-/Ñ0˜2_4%6ç7¨9g;&=ã>š@QBD©EKGßHdJÙK2MqN‰OwP1Q¬QçQÉQRQsP#OYM K0HÓDÙ@eG@ùA«CVEøFHJKíL5NROJPQ–QßQÑQnQ¢PnO´M‹KÄH„E§AL=c83<-'¶ $„í v>RúÊô³ïëöæVã;àœÝpÛºÙbØl×ÅÖmÖRÖuÖËÖK×ö×ÀذٰÚ×ÛÝWÞ¬ßá•âä°åJçíèšêFì÷í¤ïPñïò‡ô ö|÷Íøúûäû{üáüíü³üüû¸ùè÷¨õùòÝï_ì‚è[äößjÛÏÖ9ÒÈ͎ɤÅ$¿¼Žº%¹H¸ü·2¸ç¸º‘»y½¿ ¢ÄaÇEÊ7Í?ÐJÓ^Önق܇ߑâ„åxèZë1îñ»óvöùµû=þÀ4˜ûD ’ Èþ!GUhmgeM!>#%'Ø(²*€,R.0ä1²3p587÷8¹:w<4>ï?£AVCE¥FBHÊIHKªLôMOPêPQÑQØQ…QÑP¬ONõK]I*FsB/>_94c.S(ü!lÖ2»rwûÛõ®ðóë¿çäÒàÞÚÛ Ú¢Ø˜×äÖzÖWÖlÖºÖ/×ÓךØ}ÙÚšÛËÜÞfßÖàEâÒã\åøæžèAêôë íOïûðò6ô¾õ5÷ˆøÉùÐúºû`üÌüîüÁü6üRûúEøöóð íGé-åÐàPÜ¯× ÓžÎ]ÊbÆÇ«¿þ¼ïºa¹l¸¸ ¸¾¸Ï¹C»½3¿‹Á"Äׯ³É§Ì¥Ï´ÒÅÕרéÛòÞùáòäæçËê¦ívð6óíõ—ø0ûÂýC·'Û  ^·Ýï î ß"¿$¥&{(W*',÷-Ä/Ž1V35à6ž8b: <Ü=™?MAC®DUFðG~IýJbL¸MàNíOÂPeQÅQÚQ›Q÷PîOhNkLäIÒF7C?]:'5/‡)=#ºƒþª¡üîö®ñÙìŽè¹äpášÞHÜaÚäØÌ××Ö\ÖfÖªÖ׳×tØNÙQÚ_Û“ÜÎÝ)߈àâã卿GèñéëJíûî¦ðKòåóqõèöJø…ù¡ú‹û@ü·üêüÇüXü~ûFúŸøŠöôñ½íêûå«á0Ý•ØÿÓ{Ï,Ë"ÇuÃ<À{½M»§¹“¸¸¸™¸–¹ôº¹¼Â¾ÁÃOÆ&ÉÌÏÒ*ÕCØNÛ_ÞaábäQç@êíïï¬òhõø°úBýÇÿ@­ c ¬ ï !Oq‰¡¥ž "b$F&"(ö)Ñ+™-m/41û2Ä4„6K8:É;†=A?ø@¬BZDFG2I°J!LpM­N´OžPEQ¶QÚQªQQ%P½NÕLiJvGòCå?L;76ª0»*$qÊF äÍýø³òÃícépåâ ߻ܹÚ/Ùû×,× ÖfÖdÖ™Ö×’×LØ$ÙÚ,ÛTÜ’ÝãÞAà¹á0ãÆäRæùçšéHëõì§îOðùñ’ó$õžöøFùkú\ûü£üàüÒüoüªûˆúõøõöŒôªñjîÁêÆæ…â Þ|ÙàÔZÐþËæÇ%ÄÔÀÿ½®»ò¹À¸"¸ ¸w¸_¹¬º\¼Z¾ ÀÃÉŘÈË|΅ѕԧ׹ÚÄÝÐàÈãÅæ©éì`ï%òáô÷-úÅüJÿÆ5™í> | ·â"4??>. "$æ%Ç'œ)t+@-/×0§2h406î7¶9m;1=ê>¢@VB DªERGàHhJØK0MnN„OoP)Q¢QÖQ¸QO@ýA¶CYEþF“HJKîL0NNODPQQÎQÃQWQPOOœMhK¤HaEA'=;8ã2-ú& eÓ e*Kú¾ô°ïëöæ^ãCà¥ÝÛÅÙoØ}×ÔÖ{ÖeÖÖÜÖX×ØÎØ»ÙÀÚáÛÝ_Þ¸ß%áâ$ä·åQçöèêLìùí©ïMñóòô öu÷Æø÷ùúúÓûlüÇüÙü•üúûùú”ùÁ÷}õÎò°ï1ìRè0äÆßFÛ£ÖÒ¦ÍwɑŠ¿‹¼‘º/¹R¸¸D¸ý¸%º®»‘½»¿#¿Ä~Ç`ÊSÍYÐdÓw֊ٖܣߢâåŒèpëFîñÑó‡ö)ùÆûNþÑD«Z œ Û 2Sevwxn]!J#+% 'æ(¼*Ž,].(0ô1·3€5?79Â:€<;>÷?¬A\C E«FBHÐIEKªLôMOPàPvQÄQÉQqQ»P•OöMßK5I FLB>:9õ3>./(Ö!Q´¢dhûÕõ¦ðóëÂç äÝà"ÞçÛڭج×ïÖÖbÖÖÃÖD×ßר،ٌکÛÖÜÞrßÝàSâ×ãgåç¡èKêöë¤íTïùð ò4ô¼õ-÷‚ø¾ùÅú­ûKü¹üÕü¦üü0ûÜù øñõXóMðãìéýä¦à ÜŒ×øÒ‚ÎBÊKƼ¿þ¼ïºh¹x¸¸4¸Ò¸ê¹Z»2½L¿©Á<ÄöÆÌÉÅ̾ÏÑÒÞÕñØÜ ß â åúçáê¼íˆðKóö¨øCûÓýRË4’é * nœÉéþ þ é"Ï$°&ˆ(c*2,.Ð/—1a3%5é6ª8j:)<ä=¡?TA C´DXFõGIýJfL²MßNäO½PWQ¼QÇQ‹QÞPÚOJNOLÂI±FCæ>1:5b/f)#œÿj囑üçö§ñÙìèÀätá¨ÞQÜnÚôØ×××ÖjÖzÖ´Ö-׽׃Ø]Ù[ÚnÛÜÝÝ1ß•à â‰ãå­æQèôé¤ëNíÿî¥ðLòåókõèö=øù’ú~û.ü¥üÑü¯ü9ü]û"úyøaößóæð’íÒéÏå{áÝlØÙÓ]ÏË ÇeÃ1Àx½L»«¹ž¸¸&¸°¸ª¹»Ñ¼â¾1Á»ÃlÆAÉ/Ì,Ï7ÒHÕYØgÛxÞwáxähçRê.íðÁò{õ&øÀúWý×ÿR¾t ¼ þ 1_|›¦³²©¡ ‡"t$O&1(*Ü+¦-y/>13Í46T8:Ð;=G?A³BaDF¥G1I´JLsM¤N´O“P©@_B D·EPGåHiJ×K0MlN{OnPQ›QÃQ©Q&QFPîN MÇJñGƒD“@<7¡1Å+•%,˜r éþù¬ó¹î4ê;æµâÀß3Ý+ÛÙGØ_×ÉÖ€ÖoÖ¡ÖùÖˆ×2Ø ÙôÙÛ%Ü_Ý­Þà{áïâ}ä æ«çPé÷ê¦ìRîþï¥ñ@óÕôLöº÷ýø'ú ûèûuü¿ü½ügüµûŸúù7÷ØôòÞîLë_ç-ã¿Þ6ÚœÕѵ̓ÈÉÄcÁ~¾¼Eºü¸F¸¸r¸B¹€º¼¾IÀ¼Â_Å'È ËÎ ÑÔ(×9ÚGÝOàPãCæ4éìéî±ñnô÷ÂùTüßþ^Ê6ˆÝ  X†«ÊÚèìäàÈ!µ#˜%s'P)"+ö,Á.Ž0T24Ý5¦7a9%;à<™>X@B¼C_EG˜HJ“KéL2NFO>PûP‚Q¿Q±QEQvP8O~MGK„H9EaAü<8¶2ó,Î&s ãM» M:ú¼ôªïëúædãLà°ÝŒÛÓÙØ‹×âÖÖsÖ”ÖçÖkרàØÇÙÍÚîÛÝjÞÅß,á¨â-ä¾åZçûè¤êPìþí¨ïQñòòôöl÷ÁøëùðúÀû[ü±üÀüyüÛû×úoù˜÷Qõ£òïì!èä›ßÛÖöÑŠÍ\ÉÅ ¿…¼™º1¹e¸¸]¸¹=ºÊ»«½Ù¿@ÂÚÄÇzÊqÍpЃӌ֤ٮܻ߸âµåŸè…ë\î'ñåóšö:ùÙû_þäQ¾h ° æ@`vˆ„|i!X#6%'ï(Ë*—,l.102À3‹5H79É:‰ú?µAcC E´FBHÔIEK¬LìMO PÜPgQºQµQ`Q¤P{OÝM½KIèE&Bâ=9Ï3. (°!2˜P]ûËõ¢ðõëÁçäáà0ÞñÛ%ÚÀص××™ÖxÖ‹Ö×ÖO×ï׷ؘٚڵÛáÜ,Þ{ßêà[âáãoåçªèNêþë¦íVïýðò3ôºõ%÷€ø¯ù¼úšû<ü¢ü¾ü‰üüû û»ùô÷Êõ)ó!ð³ìèèÍä{àõÛf×ÔÒaÎ*Ê6Ư’¿ü¼ðºp¹„¸"¸F¸ë¸ý¹y»I½k¿ÃÁ[ÄÇîÉÙÌàÏåÒûÕÙÜ"ß'âåèóêÓíšð`óö¼øTûäýgÚE£ö > y°Õù "%!ñ"ß$º&—(k*C, .Ý/¤1i325ò6´8u:0<ñ=£?aA C¼D]FøG‚IKbL³MØNâO°PSQ©Q»QsQÏP¸O7N(L§IˆFðB¹>:Ù4>/<)õ"zâMÒ„ˆüÙö¢ñØìèÇäyá´Þ[Ü~ÚÙé×#×®Ö|Ö‡ÖÆÖ8×ÏרlÙfÚ}Û§ÜëÝ9ߤàâ™ãåºæTèüé©ëQíï§ðLòâómõÜö=ørùˆúpûüüºü”üü>ûüùSø5ö´ó·ðcí¥éåQáÖÜHرÓ?ÏòÊ÷ÆVÃ%Àv½K»µ¹§¸/¸9¸Ã¸Ä¹)»í¼ü¾PÁÖÉÆ^ÉIÌIÏQÒaÕtØÛÞŽáäçfêDíð×òŽõ7øÖúeýëÿaÎ0€ Ð Di‘¥·Á½»« –"€$\&=(*æ+µ-€/L13×4œ6\8:Ü;–=Q?A¸BiD FªG3I¸JLsMŸN°O‰P4Q›Q»Q‡QòPøO‚NL'J/G«C”?;å5]0n*6$¿0– ¿®ýô÷¢òÂíaé}åâ6ßÎÜÖÚGÙØE×ÃÖ„ÖÖ»Ö׳×fØBÙ4ÚGÛkÜ«ÝöÞ]àÅáKãÐägæè©éQëí©îWðøñ’óõ–öö÷8ùPúDûúû|ü²üžü4ükû?ú¨ø¤ö2ôRñ îaêiæ(â·Ý)Ù—ÔÐÉË²Ç Ä¹Àö½­»û¹Ô¸?¸/¸¤¸Œ¹ßº‘¼”¾×ÀZÃÿÅÒȷ˴ιÑËÔÙ×ëÚõÝüàùãïæÕé¸ì†ïPòõ¶÷RúéülÿêS½ _ œ Ó"@Q[ZYJ 7""$þ%ß'·)ˆ+]-'/ò0º24C68Å9ƒ;B=ø>²@eBDºEVGêHgJÛK+MjNwOdPQŒQ·Q•QQ0PÑNM©JÌGbDi@ð;ê6{1ž+o% wæY ûÜþù©ó²î6ê;æÂâÁßEÝ1Û•ÙPØr×ÕÖ“Ö}Ö°Ö ×•×BØÙÚÛ.ÜmÝ´Þàáüâƒäæ¯çXéüêªìWîÿï¥ñBóÍôOö­÷ûøúû×ûcü«ü¡üNü’ûúùø ÷¯ôäñ´îë3çûâ–Þ ÚwÕöЗÌ{È·ÄVÁy¾¼Iº¹U¸,¸…¸Z¹™º9¼,¾eÀØÂ}ÅCÈ&Ë Î#Ñ2ÔB×QÚ_Ýfàfã[æGé(ìúîÈñ}ô3÷ÐùiüðþnÝD›ë , h’½ÕëõùôëØ!À#¦%~'^),+-Ë.›0a2%4î5ª7o9+;é<¥>Y@BºCkEGHJ“KìL)NFO5PôPuQ²QžQ3Q^POaM)K`HE8A×<ï72Ì,©&Q Á1  9 ,ú³ô¥ïëýæiãTàºÝ™ÛÞÙØ–×÷Ö™Ö„Ö¡ÖùÖwרíØÓÙÝÚ÷Û/ÝrÞÒß5á²â6äÅåbçé«êUìî«ïSñíò„ôþõk÷¶øãùâú²ûIüœü¨ü]ü¼ûµúJùo÷*õtòUïÒëöçÓãoßðÚVÖÖÑiÍGÉhÅûÁü¾ˆ¼˜º<¹o¸,¸n¸+¹Sºå»Æ½ô¿]Â÷Ä¸Ç™Ê‡Í‘Ð˜Ó¬ÖºÙÆÜÒßÏâËåµè›ëoî;ñúó©öQùçûtþðhÉ+u À õ+On„•“†|!_#H%#')Ó*¨,r.A02Ð3‘5W79×:

    @¾AgCEµFHHÔIGK«LëMOPÒP]Q©Q§QJQPdO½M¡KóHÃEBº=í8¥3ò-ã'’!zê y>SûÀõžðóëÅçäìà7ÞÜ0ÚÐØÂ×שք֟ÖãÖ`×ý×ÅØ¥Ù©Ú¾ÛòÜ3Þ‰ßóàdâëãvåç±èTêìªíXïþðò3ô²õ#÷uø§ù¯úŒû+üü¦ünüÜûîúùÑ÷žõþòôï„ì¹è äNàÌÛ?×°ÒCÎÊ$ƠŠ¿ø¼òºw¹¸2¸Z¸¹º•»c½ˆ¿áÁuÄ.ÇÊùÌ÷ÏÓÖ$Ù0Ü;ß;â7å$èëáíµðmó*öËøgû÷ýuíU± K ‹¼æ-/3$!#ê$Ç&¤(x*L,.é/¬1x3:5û6Â8x:?<ó=²?bAC¿DbFýGƒIKaL°MÖNÙO©PHQšQ«QbQµP¥ONL€ImFÄB˜>æ9³4/)Ó"XÇ2½rzüÑöžñ×ìèÌäƒá¼Þi܈ÚÙõ×4׼֌֕Ö×ÖE×ÞרyÙuÚˆÛ´ÜôÝFß«àâŸã$åÂæZèê«ëWíï¨ðNòÞókõ×ö5øjù|ú`û ü~ü ü}üûûû×ù-øö†óŽð3íyéoå&á­Ü ØÓ ÏØÊåÆDÃÀq½L»¼¹³¸?¸L¸Ø¸Ý¹A» ½¿mÁòÃ¥ÆzÉdÌdÏiÒ|Պؙۤާá£ä”ç{êWí&ðéò õHøèúuýüÿrÝ@ ß Q{š¶ÆÉÒÀ¾ Ÿ"$j&E( *ð+¿-/Q1#3Ý4¨6d8(:á;¡=V?AÀBlDF«G8I¶JLnMžN§OƒP)QQ«QtQÝPßOiN~LJG‚Ct?Ö:Ã550M*$¡~ÿ ®¡ýë÷òÃíaé…å"âDßÙÜäÚUÙ+ØX×ÑÖ”Ö’ÖÊÖ.×Á×uØNÙDÚPÛ|ܱÝßcàÒáRãØäoæ è®éXëí°îTðúñóõ“öì÷.ùGú2ûìûfü›ü†üüNûú†øwö ô"ñàí3ê<æúáÝÙtÔõϬˠÇõôÀë½´»ý¹à¸L¸B¸¸¸£¹ùºª¼°¾óÀtÃÆëÈÕËÌÎÖÑâÔô×Û ÞáäçëéÌì™ïcòõÅ÷fú÷ü~ÿøgÇ k ¬ â3M^hjcZ B"/$ &ë'Á)—+d-6/ú0Ç2‡4O6 8Ï9Š;K=þ>½@iBD¿EYGìHjJÚK*MgNpO^PQ€Q¨QQQP¼NâL‹J«G;DH@Ä;É6R1z+L%éZÉE çÏþù£ó°î8ê@æÆâÎßNÝ@Û¢Ù_Ø€×ëÖ›Ö”ÖºÖפ×OØ'Ù Ú!Û:ÜyÝ¿Þ àˆáãŠäæºçYéë¬ì[îð§ñ=óÐôEö«÷ðø úûÆûOü•ü‰ü/üuûXú×øâö‡ô·ñ…îîêçÓâhÞäÙSÕÔÐ{ÌgÈ£ÄOÁp¾¼Lº¹a¸<¸ž¸m¹µºO¼L¾|Àú”ÅaÈAË;Î=ÑKÔ\×iÚxÝ{à~ãpæ]é<ìïÛñôE÷âù{üÿþîQ­ö ? s¤Ëáüôç!Í#¯%'f):+ -Ø.¤0n2.4ø5´7y95;ð<¬>b@BÃClEGHJ’KéL*N=O1PèPiQ¤QQQHPOIMKCHñDA±<É7j2§,…&0 £‰ &ÿÿ"ú®ô¡ïëçqã]àÅݦÛì٠ئ×׫ִ֒Ö׈×.ØùØäÙèÚÜ9ÝÞÚßBáºâ>äÐåfç é¯êXìî­ïRñîò€ôùõh÷¬øØùÕú¢û5ü‡üŽüAüžû’ú&ùF÷õHò&ï¥ëÉç¢ãGßÃÚ6Ö±ÑOÍ-ÉXÅîÁö¾‡¼›ºF¹{¸=¸„¸?¹pºû»å½ À{ÂÅÖǯʪͤзӿÖ×ÙÜÜêßåâàåÌè­ë…îNñ ô½ö_ùüû‚þrß4Š Ê 9^}Ÿ¡¡•‡!l#V%,')Ü*µ,|.K02Ù35_79Þ:š @ÅAjCEµFNHÕIFKªLèM OPÅPVQ˜Q˜Q7QwPJO¢M‚KÐH£EÛA–=Å83Ì-À'o!ñ[Õ b3BûºõšðôëÈçäóàBÞ Ü>ÚÝØÕ×!×¼Ö’Ö¯ÖñÖp× ØÓزٶÚÌÛûÜAÞ“ßüàqâðã€åç·è\êì°íYïñšò3ô­õ!÷jø ù¢ú|ûüvüüQü¿ûÊúoù¦÷wõÎòÊïSìèsäà§ÛבÒ%ÎôÉÆŽÂ…¿ô¼õº¹˜¸F¸i¸¹(º±»~½¡¿ÂÄNÇÊÍÐ!Ó'Ö>ÙGÜRßSâLå:è ëøíÄð‡ó5öâøvû þ†ýhÀ Z šÊö-5A=4%!#ó$Ö&®(…*W,'.ï/¼13E57É8…:F<ý=·?lACÇDfFþG‰IþJfL¨M×NÐO¢P:QQšQOQ P‰OüMñKbIEF¥Bo>À94ð.ô(°"6ª¦dküÈö™ñÕì”èÐäŒáÅÞtÜ—ÚÙØB×ËÖÖ¢ÖéÖS×îת؆قڕۿÜÞPßµà%â¥ã3åÂæjèêµëYíï¬ðKòàódõÖö+ø`ùrúOûüûfüü]üâûøú¸ùøåõYó`ðíJéBåöà„Üø×mÓþÎÀÊÌÆ7ÃÀn½M»Â¹½¸N¸\¸ñ¸ñ¹_»!½4¿‡ÁÄÃÆ”É€ÌςҘաش۹ÞÁá¶ä­çŽêmí8ðó°õ^ø÷ú‹ý †êRž ï )_‰«ÃÓÛÙÓÅ ²"–$w&T((*,É-š/`1(3í4®6q8.:î;¦=c?AÆBsDF±G8I¹JLlM›N¡O{PQ€QŸQ^QËPÃORN]LéIìF]CO?¯:›50$*ð#}÷aé ›’ýà÷˜ò¼íhéƒå.âJßäÜòÚaÙ<Ød×âÖ£Ö¡ÖÙÖ>×Í×…ØZÙRÚ\ۇܽÝßlàßáXããävæèµé\ëí±îXðùñ‘óõŽöç÷%ù<ú#ûÝûRü…ülüøû-û÷ù]øRöÜóùð°íêæÎábÝÛØJÔÝÏŠË‘ÇàëÀç½±»ºç¸_¸P¸Ï¸º¹»Æ¼É¾ÁŽÃ;ÆÉðËèÎðÑûÔ ØÛ&Þ(á&äçêÞì°ïrò/õ×÷wú ýÿyÖ1 x ¼ ðAZnr|mh P":$&ö'Í)¤+p-@/1Ð2”4V68Õ9™;M= ?Á@pBDÃE]GïHkJÙK*MaNnOSPQrQ™QrQêPþO NÅLlJˆGD"@Ÿ; 6.1T+*%Ç=®. Õ¿þúø›ó®î8êEæÍâ×ßZÝMÛ¯ÙpØ×úÖ¬Ö¢ÖÌÖ'×´×^Ø2ÙÚ+ÛH܆ÝÈÞ+à’áã•ä%æÁçaé ë´ìZîð¦ñ=óÍôAö¤÷æøúùú¸û<ü}üpüüVû6ú²ø·ö]ôŠñWîÀêÖæ¡â@Þ¸Ù0Õ°ÐaÌLÈ•Ä@Áj¾¼Pº¹p¸M¸¯¸ˆ¹Éºn¼`¾ŸÀòÅ~ÈZËXÎXÑeÔt׃ڎݖàãˆæqéPì&ïêñ§ôS÷øù‰üÿþe¹ L „²×ò ó!Ú#¼%œ'q)I+-ç.­0y2:46¿7‚9<;ü<²>l@BÌCnEGH#J‘KèL%N:O(PßP^Q“QQQ4PæN,MåJ"HÍDî@Š< 7F2|,g& ‰õt íÿú£ô ïëçuãgàÐݰÛü٭ض××¹Ö¡ÖÂÖו×>ØÙñÙóÚÜCÝŒÞãßMáÄâFä×åoçé¶ê^ìî´ïPññòzôùõ]÷¨øÍùÈú“û"üsüsü(ü|ûpúù÷Öôòûîsëœçsãß™ÚÖ‹Ñ5ÍÉGÅÞÁ𾼡ºM¹‡¸M¸—¸V¹ˆº¼þ½,À–Â/ÅñÇÌÊÃÍÂÐÎÓÞÖêÙûÜüßãôåáèÄë™î`ñ#ôÍöwùü˜þ‰êK“ à Im‰£©²¬£“!|#_%?')í*¾,‰.X02ä3§5j7'9ê: <_>@ÊAsC EºFSHÕIKK¥LèMOúO¿PEQQ‚Q&Q_P/OˆM^KµHzE¹Am=Ÿ8Y3¤-ž'G!Ö<½ N9û¯õ™ðïëÎç!äûàOÞÜMÚìØá×4×ÇÖ§ÖºÖ×רâØÀÙÁÚÙÛ ÝFÞ¤ßá|âûã…å ç»èaê ìµíZïñœò-ô­õ÷fø“ù˜úiû übüvü9üžû«úGù„÷Hõ§òšï'ì^èFäôßyÛðÖlÒÎÝÉúÅ…Âx¿õ¼óºŠ¹¥¸S¸¸+¹HºÆ»›½½¿®ÄcÇBÊ+Í1Ð5ÓFÖSÙcÜfßnâ^åSè4ë îÙð˜óKöðøûþœ xÑ& k ©Ú"6IJMA2!#ÿ$ã&º(’*b,2.ü/Å1Œ3N57Ð8:M<>¿?pA%CÈDnFHŠIKcL¨MÐNËOšP0QƒQˆQ>Q‹PrOàMÓK@I$F~BJ>™9e4Ë.Í(Ž"ü”O]üÁö’ñÔì•èÖäáÓÞ~Ü¥Ú)ÙØO×ÞÖ©ÖµÖôÖc×û׸َؕڢÛËÜ ÞZßÀà.â¯ã9åÎækè ê¸ë]í ï«ðMòÜócõÎö&øVùgúAûëûTüqüIü¾ûÝú“ùÛ÷Àõ,ó6ðØìéåÊà[ÜÏ×LÓÞΥʻÆ#ÃÀe½S»Æ¹É¸\¸o¸¹ºx»;½N¿¤Á+ÄÜÆ´É—ÌϜҰջØÉÛÕÞÓáÑä¾ç§ê€íNðóÆõnø ûœý•ÿ^± ý 7p–ºÑáéæâÐ À"¡$…&`(4* ,Ø- /p1/3ú4¸6z88:õ;±=f? AÉB{DF´G;I»JLkM–NœOsPQuQŒQOQ²P¯O5NALÈIÇF=C&?Š:u5ç/*Ç#bÒKÑ ˆ„ýØ÷ŒòÁíbéå0âTßðÜüÚrÙIØs×òÖ±Ö±ÖçÖN×ÛוØfÙ_ÚjÛ’ÜËÝßwàèábãìä}æè»éaë í³î\ð÷ñ‘óõ‹öß÷ù.úûÉû@üoüPüßûûØù4ø+ö°óÎð‚íØéáå á8ݱØ(Ô¸ÏsËvÇÓÜÀæ½®»ºï¸m¸a¸ä¸Ð¹-»Þ¼ç¾+Á¬ÃVÆ"É ÌÏ ÒÕ$Ø5Û:ÞDá9ä3çê÷ìÂï‰ò@õê÷‰úý¡ÿ‡è@ Š É +Qh|ƒ†q a"B$*&(Ü)¬+-I/1Ø2¡4`6$8ß9¡;X=?Æ@yB"DÉEcGîHqJÖK,M\NkOIPúPcQŒQ^Q×PåO†N¨LLJeG÷Cú?z;z61/+%¤‘ À®þïø“ó¬î7êIæÒâàßcÝZÛºÙØ™× ׺ֱÖÚÖ:×¾×oØ>Ù,Ú7ÛVÜŽÝØÞ3àáãä.æÇçhéë·ì`îð§ñ?óÉô>ö÷Þøúùìú§û)ühüVü÷û5ûú‹ø’ö0ôañ(î’ê¨æuâÞÙÕ’ÐBÌ7È€Ä6Ác¾¼Uº!¹}¸_¸Ã¸œ¹äº†¼¾¹À,ÃÑÅ–ÈzËqÎsÑԎלڧݭà§ãŸæ†éeì<ïûñ¾ôe÷úžü#ÿ¢uË ] ‘Ãæ$ "å#Ì%¥')R+$-ò.¸0…2D4 6Ê7‹9G;=»>r@%BÎCxEG¦H!J”KæL"N8O PØPPQŠQgQûPPÒN MÈJþG«DÇ@e&æhØ\ ùÝÿ ú›ô›ïëç{ãlàÞÝ¸Û Ú·ØÆ×#×ÈÖ±ÖÐÖ%פ×JØÙûÙÛÜSÝ“ÞñßVáÎâOäàåuçé¸êeì î³ïVñíòzôöõW÷ŸøÄù»úƒûüYübüüdûJúßøöö«ôðñÌîHëlçIãîÞqÚéÕlÑÍûÈ3ÅÒÁé¾¼¦ºS¹˜¸[¸¬¸j¹¡º1¼¾FÀ±ÂMÅ ÈìÊÜÍÞÐèÓ÷ÖÚÝàã æøèØë¬îwñ3ôâöˆùü©þ$˜üX¨ ê (S~˜¯º½¼°¢!‡#m%J'#)ù*È,—.a0*2í3²5t719ó:©@ÑA{C$EÁFSHÙIJK§LåMÿN÷O³P=Q~QuQQNPOmMAKH\EAJ=u843}-x'&!²#  : )û«õŽðóëÊç*äÿàZÞ Ü[ÚùØð×A×ÙÖ³ÖÍÖ××)ØëØÔÙÈÚêÛÝWÞ«ßáƒâäå&çÃèhê ìºí]ïñ›ò.ô¨õ÷^øŠùŠú_ûôûOü]üü‚û‡ú%ùY÷õ}òhïüë,èäÄßSÛÅÖLÒçÍÃÉèÅuÂn¿ô¼óº“¹®¸d¸“¸A¹aºÝ»¹½×¿7ÂÊÄ‚Ç[ÊKÍGÐSÓ^ÖmÙyÜßâzåfèJë!îîð¬ó\öùšû,þªŠà8 x »ç0IR^US>!*#%ì&Ê(›*o,>.0Ñ1–3Y57Û8˜:V<>Å?{A'CÑDpFHŽIKaL¨MËNÆO‘P$QtQ{Q(QvPXOÄM¶KIFQB.>h9G4ž.¬(f"ùjêuBMü·öŽñÏì›èÖäáÖÞŽÜ®Ú;Ù"Øa×êÖ»ÖÃÖ×q× ØÇØ ÙžÚ«ÛÚÜÞfßÊà9â¹ãBåÔætèê¾ëaí ï°ðIòàó[õÎöøPùXú5ûÖûAüYü.üŸû»únùµ÷“õóðªììèçäà/Ü©×%ÓÁΊʣÆÃÀd½T»Ê¹Ù¸g¸‡¸¹#º»Y½i¿ÂÁFÄúÆÎÉ·ÌµÏ»ÒÆÕרãÛëÞíáæäÕç½ê“ídð#óØõƒøû®ý.¤lÅ  K|§ÉÞðõ÷íá Ê"±$&m(?*,à-²/u1?35Ä6ƒ8D:û;¼=m?'AÑB~DF·G?IºJLiM’N•OlP QiQ{Q>QšP™ON&L¦I¦FCÿ>e:J5Å/×)ª#9¹.» vuýË÷Œò¹íhéŽå:â]ßûÜ Û€ÙVØ„×׿ÖÁÖöÖ[×ë× ØuÙlÚvÛžÜ×Ý$ß‚àòáiã÷䂿!èÁéfëí¶î\ðùñŽóõ†öÖ÷ù"ú û¸û*üZü4üÃûçú²ùøö†ó¡ðQí¯é­åzáÝŒØÔšÏVËaÇÂÓÀ཰»ºÿ¸u¸z¸ô¸ê¹D»û¼¿IÁÈÃqÆAÉ$Ì!Ï#Ò0Õ>ØKÛUÞXáTäCç+ê íÔï òNõø˜ú1ý¯ÿ-—ùO š Ú ;^x‰‘’} n"Q$2&(â)¾+†-W/1è2¦4n6+8ë9¨;a=?Î@€B(DÍEgGñHrJÖK*MWNfOAPîPXQ|QMQÁPÎOjNL*JDGÒCÔ?T;Q6ß0 +ß$…ýyü ¯žþåøó§î9êLæÛâçßoÝeÛÊÙØ©××ËÖÀÖéÖG×Î×{ØMÙ8ÚDÛcܘÝãÞ<à©á ã¦ä7æÍçpéë½ìbî ð§ñ?óÄô;ö–÷ÖøîùÞú–ûüPü?üÚûûñùeøiöô3ñüíbê|æGâêÝhÙäÔrÐ&Ì!ÈoÄ*Á_¾¼[º+¹ˆ¸t¸Õ¸·¹üº¡¼š¾ÔÀKÃëŴȕˋΎјԨ״ھÝÃà¾ã´æœéyìNïòÎôy÷ú¬ü8ÿ° „Ù* i ¢Ñô!./)! "÷#Ô%³'Œ)_+--ÿ.Á0‘2M46Ô7”9O; =Ã>z@*BÕC{EG¦H$J“KçLN2OPÎPFQwQ[QàPP¸NíL¬JÙGˆD¤@;"@ÖAC)EÅFVHÛIKK¤LáMýNìO®P/QqQdQüP5PúNQM!KqH4EpA=U83_-M' !Ž † 'üû õŽðïëÑç-ä ácÞ-ÜhÚÙØQ×çÖÃÖÚÖ ×œ×5ØþØÚÙÝÚñÛ ÝaÞ´ßáŽâ ä›å+çÊèoêì¾í^ïñ™ò-ô£õ÷VøùúKûåû7üHüücûfúÿø5÷ôôRò<ïÎëèìã›ß'Û¤Ö$ÒÐͦÉÚÅfÂj¿í¼þº•¹À¸s¸¦¸Z¹uºú»Ò½ô¿TÂâÄ¡ÇtÊfÍdÐiÓzÖ„Ù“Ü—ß–â’åvècë2îñ¾óqöù±û9þ¾+šñF ˆ Çø ?Uaif\M!6#%ö&×(¥*},F.0Ú1 3e5"7é8 :^<>Ë?‚A,C×DrF HŠIK]L¨MÃNÀOˆPQgQiQQ`P?O©M–KIÝE5Bÿ=M94.„(G"ÙPÐd/Cü¯öˆñÒì›èßä¡áçÞ“ÜÂÚDÙ4Øp×úÖËÖÐÖ×רÔد٪ڹÛåÜ ÞtßÐàHâ¹ãP娿{èê¼ëjí ï±ðLòÙó\õÄöøDùNú"ûÊû&üHüü…û˜úJù÷lõÕòÜï{ìÀè»ärà܃×Ó¤ÎqÊÆ Ãõ¿e½S»Õ¹à¸z¸”¸2¹7º­»o½‰¿ÚÁdÄÇêÉÏÌÒÏÒÒàÕïØùÛßâûäìçÎê©íuð8óêõ”ø-û¾ý>¶Ð  WŒ´Öîûûì Ù"¹$¢&r(R*,î-º/„1E35Ë68L:<Â=x?*AÛB€D&F·GCIºJLgMŽNOcPÿP[QlQ-QƒPƒOùM L…I„FóBÛ>=:'5›/¸)‚#›¤ gfýÅ÷ƒò»íhé•å@âgßÝÛÙbØ–× ×ÓÖÏÖ×i×û×­Ø„ÙxÚƒÛ©ÜâÝ0ߌàûásãþäŒæ'èÆélëí¸î`ð÷ñó õ€öÑ÷ ùúýú§ûüBüü¢ûÊúùè÷Ùõ[óqð*ízé†åJááÜdØáÓyÏ@ËKdzËÀؽ¶»º ¹…¸Œ¸ ¹º[»½¿iÁáÃÆZÉ@Ì<Ï;ÒMÕSØfÛkÞmákäXçBêíìï°òcõø©úAýÁÿ>¦ [ ­ å !Hlˆ”  — t"b$=&(ô)Ã+•-`/'1ò2±4v668ó9±;i=$?Ô@†B/DÑEiGõHpJÚK$MWN\O>PàPLQkQæÕçtéëÂìcî ð¦ñ=óÁô5ö’÷ÊøåùÎú‡ûü<ü#ü½ûöúÍù?øCöÚóñÐí3êNæâ¿Ý@ÙÁÔPÐ Ì È`Ä Á[¾¼bº2¹š¸¸í¸Ë¹»»¼´¾òÀeÃÆÐȰ˦ΩѰÔÃ×ÊÚÖÝÚàÔãÈæ²éŽìaï&òÝôŽ÷*úÃüEÿÁ0“ë9 x °âÿ",>9<' "þ#ä%¼'›)g+=-/Ï0˜2[46Þ79X;=Ë>€@0BÝC|EG¦H'J’KäLN)OPÁP:QjQFQÏPêONÔL‰JºGdD}@<+7Ò1,ø%¥)¨' Ú»ÿöùô“ïëç‰ã€àòÝÑÛ*ÚÒØè×?×éÖÑÖïÖC×Â×hØ1ÙÚÛ4ÜiݬÞàiááâ_äñåç$éÄêkìî¶ïVñìòuôìõM÷Œø®ù¡úcûìû.ü,üÓûûú‹ø­öSô™ñrîìêçîâšÞÚ¡Õ)ÑÞÌÍÈżÁÙ¾€¼¬ºg¹¯¸€¸Ñ¸›¹Ñºd¼R¾|Àë„ÅCÈ#ËÎÑÔ*×3Ú?ÝEàAã8æéìÔîŸñVô ÷§ùBüÊþF¹xÅ @u™´ËÓÙÖ˸!¤#‚%d';)+ã,ª.y0>24È5…7E9;¼+@ÚAŠC,EÊFYHÜIJK£LßMöNçO¢P&QaQUQæPPãN1MKLHEHAü<-8å24-1'ã uìo ëû—õ‹ðñëÒç8äárÞ6ÜyÚÙØ^×ùÖÒÖèÖ2×§×HØÙëÙæÚÿÛ+ÝlÞ¿ß#á”âäœå7çÎèsêì¾íbïñ™ò(ô¢õ÷Qøpùtú;ûÔû#ü,üèûBûGúÛø ÷Îô$òïŸëÓçÁãoßÛÖÒ°Í’ÉÃÅ[Âd¿é¼»›¹Î¸€¸½¸l¹‘º¼î½ ÀpÂŹǕÊ|̀ЃӒ֞٩ܯ߮â¤å‘ètëGîñÏó…ö'ùÁûJþÎ=©T › Ó -LelyomU!H#!% 'Ú(¹*ƒ,U.0æ1«3o5-7ð8©:h<>×?„A8CÖD{F HIK^L¢MÁN·O„P Q^QUQQHP'OŽMxKÝH¾E BÞ="9õ3W.c($"º5¶N"3üªö‚ñÒìèãä®áêÞ¦ÜÉÚVÙBØ}× ××ÖãÖ"××&ØãػٶÚÇÛïÜ,Þ}ßÛàNâÇãSåãæèêÆëhíï®ðLòÙóWõÀöø9ùAúû´ûü)üùûeûyú(ùg÷Cõ«ò°ïNì”èŒäIàÜÛ_×àÒ…ÎZÊ{ÆÿÂí¿`½W»Û¹í¸‰¸©¸F¹PºÂ»Ž½¡¿÷Á}Ä3ÇÊñÌåÏðÒøÕÙÜßâåèåêºíðEóö¡øDûÌýPÆ/Žá ) eœÁæù  ø ã"Ë$¦&…(X*+,ù-Ä/Ž1Q35Ø6•8T:<Æ=‚?.AáB†D'F¼GDI»JLaMŒN†O^PðPQQYQQqPfOäMæKiI`FÑBµ>:ÿ4z/’)d#þü‘ T]ý¹÷ƒò·ímé™åHârßÝ$ÛœÙuØ ×#×ÛÖäÖ×z×ػؓقڑ۵ÜíÝ;ß—àâ~ã唿,èÍéoëí½î\ðûñ‡óõwöË÷ù úëú™ûþû/üÿû‡û¨úlùÃ÷°õ1óHðúìPéXåá¼Ü:ØÂÓ[Ï$Ë9ǢÂÀ×½³»º¹–¸›¸"¹ºw»0½6¿ÁþìÆsÉ_ÌQÏ[Ò_ÕrØxÛ…Þ„á|ärçRê1íþïÀòzõøÂúMýÖÿJºp ¶ ù ,Xz’¥­ª©— …"m$H&*(û)Ô+œ-n/21û2¼4€6?8ü9»;o=,?Ú@ŒB4DÕElGøHpJÙK"MRNYO2PÚPÊBÓ ‹„þÐø„ó¡î@êQæîâøßˆÝ~ÛæÙ«ØÈ×8×êÖßÖ ×c×ì×—ØgÙUÚZÛ|ܯÝùÞQà»á4ã´äHæØç~éëÄìiîð¬ñ8óÀô0öˆ÷ÆøÔùÅúrûóûüü›ûÛú©ùøöµóØð¥íê æòá”ÝÙÔ2ÐòËõÇPÄÁT¾¼aºD¹ ¸š¸ü¸å¹-»×¼Í¾Á~Ã&ÆéÈËËÁÎÁÑËÔØ×äÚíÝðàëãÝæÄé£ìtï9òòô÷>úÑüVÿÔ>¤úF ‰ ¿í-;JHE8 $"$ë%Ï'ž)y+C-/Û0¡2d4(6æ7¨9`;=Ò>ˆ@8BßC†EG®H%J”KáLN%O P·P1QUQ;Q¶PÖON¹LhJG>D]@ñ; 7«1ë+Ö%ƒˆ Á²ÿêù‰ô’ïëç“ã‡àÿÝÞÛ4ÚäØô×O×ûÖÛÖ×L×Ô×sØ>Ù&Ú%ÛEÜpÝ¹Þ àsáêâhäõåç%éÍêmìî¸ïUñìòqôèõD÷†ø ù—úPûÚûüüºûýúíùgø†ö*ônñGî¾êçæÂâqÞùÙ|Õ ÑÄ̵ÈÅ®ÁÖ¾~¼±ºp¹¼¸¸å¸±¹èº€¼f¾žÀàÅaÈ6Ë3Î'Ñ8Ô=×OÚTÝ]àTãNæ2éìçî±ñkô÷½ùPüÛþVÊ*‰Ó  R€¨ÂÙßéà×Ç!­#’%n'F)+ì,¶.…0F24Î57O9 ;Ç<|>2@àAC/EÏF[HÝIKK¡LÛMóNÝOœPQWQ>QÙPPÍNMæJ/HðD%AÚ<8Ã2- 'È SÓ[ ýáû“õ‡ððëØç:äávÞHÜ‚Ú$ÙØo××ãÖöÖA×¶×SØÙ÷ÙóÚ Ü4ÝxÞÊß-áŸâä§å;çÖèwêìÁíeïñ›ò&ôœõ÷Eøjùfú,ûÂû üüÊû'û$ú¸øåö¦ôùñèîpë©ç‘ãJßÔÚ\ÖäÑ•ÍzɳÅMÂ[¿í¼»§¹Ø¸’¸Î¸ƒ¹§º-¼¾,ÀˆÂÅÓǮʘ͘ОӨֹټÜÉß¿â»å§è‚ë_î$ñåó–ö6ùÔûZþßM¸f ¦ ä=Wtzƒsi!N#3%'ë(¿*’,^.)0ñ1³3x587÷8µ:l<(>Ü?ŽA7CâDxFHIK^L M»N´OvPQJQKQíP6P OsM[K¼HœEêAº=ü8Ò30.C("œž=+üžöñÐì¡èéä¶áõÞ±ÜØÚcÙQØŒ××èÖóÖ/× ×2ØñØÉÙÂÚÓÛüÜ7ÞˆßæàUâÓãXåëæ†è#êÉëmíïµðGòÚóPõ¼öø3ù3úû¢ûüüÛûJûWúùD÷õ…òï%ìcèdäà¶Û7×ÀÒgÎCÊgÆòÂã¿`½V»ä¹ö¸š¸º¸\¹hºÜ»¨½»¿™ÄMÇ!ÊÍÐÓÖ!Ù&Ü3ß,â)åèùêÎížðZóö¶øQûÞýbÖ?ð 7 w¥Öî !ð"Ö$³&(e*6,.Ë/›1Y3#5à6 8^:<Ð=†?9AäBŒD+F¿GGIºJL`MˆNOTPçPAQLQQZPPOÇMËKGI@F¬B>õ9×4V/m)A#Ýcâ} ?Qý®÷~òµílé åOâ}ßÝ0۪كس×,×òÖíÖ"׋×ØÌØžÙÚ Û¼ÜýÝAߤà â†ã åæ1èÖéqëí»îdðöñŒóõtöÅ÷öøúÝú‡ûîûüæûiû‰úGùŸ÷…õ óðÏì!é+åòà‘ÜØÓ;Ï Ë#Ç“ÃxÀÓ½³»&º¹¥¸®¸3¹2ºŒ»M½O¿ŸÁÄÉÆÉxÌnÏsÒ|Շؕۗޞá’ä„çkêCíðÔò‹õ2øÔú^ýçÿ[É'~ Æ >dŒŸ²¼¸µ£ ”"v$Z&1( *Ø+±-o/F13Ê4‰6H8:Á;y=2?â@“B9DÛEoGûHrJ×K#MKNVO'PÒP/QOQQ€P‹ON5LÍIÛFiCe?à:ã5j0Ÿ*v$$¦)» xtþÇøzó î@êUæòâàÝŒÛóÙ·ØÛ×B×þÖêÖ×r×úצØuÙaÚhۇܺÝßZàÆá<ã¾äNæâç€é!ëÉìiîð¥ñ=óºô-ö÷¼øÌùµúcûàû üõûû¸ú‰ùó÷ôõ†ó²ðsíÜéóåÅálÝòØ{ÔÐÛËÛÇCÄ ÁN¾¼dºN¹±¸¦¸¹ù¹F»ñ¼è¾)ÁÃAÆÉçËÛÎÜÑåÔñ×üÚÞáäóæÚé·ì‡ïNòõ²÷MúäüfÿãR± T ™ Ìý>GYSTC 4"$ý%Õ'°)€+S-/è0ª2r4/6ò7°9h;&=Ù>@;BéC„E%GªH+JKãLN#OP¯P#QIQ'Q¢PÀOfNœLJJzGD9@Ê;ã6‡1Ã+³%dìu÷ ¶šÿåù~ô‘ïëç•ã”àÞíÛ?ÚóØØ`××íÖ×^×àׂØLÙ2Ú3ÛPÜ|ÝÃÞà}áóâräýå”ç+éÒêqìîºïVñëòpôâõA÷{ø˜ù†úCûÄûüôû¡ûÛúÌùCø[öôAñî”êµæ˜âDÞÐÙWÕéЦ̡ÈíÄ£Áо{¼·ºx¹É¸¢¸÷¸É¹»™¼…¾³À#ùÅ~ÈSËLÎDÑOÔ[×cÚqÝoàpã`æKé+ìøîÇñ{ô.÷ÎùaüîþgØ>•ä ( bµÑåðõîäÔ!¹#Ÿ%y'T)'+ö,Ä.Œ0T24Ú5š7X9;Ð<ƒ>;@çA”C7EÑF_HßIKK LÙMîN×O‘P QFQ2QÁPñO±NúLÇJ HÍDA²<ß7š2ê,è&¡ 7µ@ ëÊû…õ†ðìëÜç>ä&áÞSÜÚ0Ù0Ø{××îÖ ×Mׯ×bØ#ÙÚÛÜFÝ}ÞÙß2á¬â$ä°åBçÜè~êìÆíhïñò ôõøöBø^ùYúû¬ûûûýû®û ûú”ø¼ö}ôËñ¼îDëyçhãß±Ú1ÖÄÑuÍdÉžÅAÂS¿é¼»«¹é¸¸å¸—¹¿ºF¼#¾EÀ§Â7ÅñÇÈʶͱкÓÀÖÑÙØÜÛßÞâËå¿è›ëoî=ñôóªöLùáûqþêcÄ$r · ô$Imzu!Z#@% 'õ(Î*›,l.20ü1À3‚5A79½:v<1>á?—A=CèD}FH‘IK\LM¸NªOoP÷P=Q9QÜPPöNVM>KšHyEÅA=Û8£3.(ä!wÿ€)ú ü’ö|ñÍì£èïäºáß½ÜáÚuÙ[Øž×+×ôÖ×=ׯ×BØþØ×ÙÏÚàÛÝEÞßôà]âÝã`åóæŠè,êËësíï±ðNòÐóUõ±öø'ù&úüúŽûîûþû¾û.û5úÞø÷îôXòUïôë8è4äò߈Û×›ÒKÎ%ÊXÆÝÂâ¿U½_»æ¹¹¦¸Ð¸n¹ƒºô»Ã½Ù¿.·ÄiÇ:Ê&ÍÐ$Ó*Ö9ÙBÜHßFâ?å(èëàí¶ðló&öÇødûñýræQ­ E ˆ´äý#/)#!ü"ä$¿&œ(q*B,.Û/¢1h3*5é6­8b:%<Ö=??AìB’D0FÄGEIÁJLcM~NOEPäP0Q>QòPHP4O¯MªK'IFˆBj>Í9²4-/H)#¼DÇf ,Bý¤÷wò³íné¢åWâ„ß)Ý<Û¸ÙØÂ×<×ÿÖþÖ3ו×'Ø×ث٠ڧÛÐÜÞQß«àâã壿:èÙéyëíÂî`ðüñ„ó õjöÃ÷éøùùÏúsûÝûùûÑûHûjú$ùv÷aõØòóïšìúèùäÊàcÜï×yÓÏòÊ Ç„ÃqÀʽ¼»%º,¹¯¸Â¸J¹Hº¨»f½l¿»Á5ÄåÆ«É•Ì‰Ïҕաج۲޳á«äšçêYí'ðèòŸõEøæúoýúÿkÛ7 Õ Hz“´½ÊÆÃ² Ÿ"…$c&>(*ã+¼-}/O1 3×46U8 :Ë;ƒ=8?í@–B@DßEtGûHvJÔK#MHNNO#PÃP'Q;QQjPrOÿML®I¹FCCA?¸:º5G0t*X$þˆ¡ fdþ¼øtóî?êYæøâ àžÝ•ÛÚÄØë×Q× ×ûÖ(ׂ×س؃ÙnÚtÛ•ÜÄÝßdàÒáCãÉäUæéçˆé(ëËìoîð«ñ7ó»ô(öz÷³øÂù¥úWûÆûøûØûhû”úiùÊ÷ÍõZó„ðFí®éÃå›á=ÝÌØSÔóϸËÍÇ+ÄÁH¾¼pºQ¹Ä¸¶¸*¹º`» ½¿CÁºÃ]Æ"ÉÌøÎõÑÕ ØÛÞáä çíéÏìšïaòõÂ÷dúòü|ÿòd f ¨ Ý +KYdd_S @"'$&ä'»)+[-,/î0¹2z4=6ù7»9q;0=à>˜@BBïCE&G®H-JKâLNOùO©PQÚBÛZ܈ÝÑÞ!à‰áûâzäæœç2éÙêsì!î¹ï[ñèòoôÞõ;÷søŽùzú2ûµûíûâû}ûÄú£ù"ø0öÛóñííbê‹ægâÞ¤Ù7ÕÂÐÌ‚ÈàÄ–Áƾ¼·ºƒ¹×¸±¸¹Ý¹»³¼¡¾ÐÀ@ÃÔÅœÈpËeÎcÑgÔu×ڇ݊à…ãwæcé=ìïÖñ“ô?÷áùsüÿþxëN¨ñ < l£Àãòýñâ!Æ#­%ƒ'b)1+-Î.™0\2&4â5§7_9 ;Ò<‘>>@òA™C:EØF_HãIKKŸL×MæNÔOƒPQ3Q#Q«PÛO–NßL¦JìG§DÜ@ˆ<º7o2Å,Â&~ –' Õºðúõ~ðíëÜçEä+áŒÞ^Ü›ÚAÙ;ØŽ×$×××b×Ï×tØ0ÙÚÛ"ÜOÝŽÞßß@á³â.ä¹åJçãè‚ê&ìÇímïñ›ò ô–õöö6øWùIúû—ûæûäû”ûëúÛùtø‘öVôžñŽîëLç9ãïÞ†Ú Ö ÑZÍGÉÅ1ÂN¿ç¼»¸¹ð¸³¸ô¸±¹×ºa¼<¾bÀÄÂTÅÈáÊÕÍÊÐÕÓÝÖæÙóÜôßòâçåÐè±ë†îOñ ô»ö_ùöû€þoÚ1… Æ 2ZyŠœš”{!m#K%+')Õ*«,u.@02Ê35L7 9È:~<8>ì?™AGCëDƒFH•IK`L•M¸N¢OfPìP/Q)QÇPPÛN:MK~HPE£Ai=±8‚3æ-ô'½!XàhëüöqñÐì èöäÀá ßÄÜõÚ}Ùmج×8×××M×¾×OØÙáÙßÚëÛÝOÞßúàkâããjåúæ’è1êÑëwíïµðKòÓóMõ°öö÷ùúêú€ûÖûèû¢ûûú¼øòöÈô)ò)ïÆëèäÄßaÛéÖzÒ+Î ÊAÆÒÂÔ¿W½]»ï¹¹¶¸ã¸…¹›º ¼ß½õ¿JÂÖăÇZÊ>Í:Ð=ÓEÖRÙ[Ü`ß^âTå@è%ëøíÈð€ó:öÙøwûþ‚ú_À X ”Æò (1>61 ! #ó$Ë&©(}*O,.è/«1u335ö6²8q:)<á=—?EAõB•D8FÅGLI½JL^M|NxO?P×P"Q1QÜP4PO’MKIøEbBC>¦9‰4/!)ú"˜(©O /ýž÷mò±íoé¥å_âŒß4ÝJÛÃÙ¡ØÏ×L×× ×Bפ×5Øäػ٫ڶÛÙÜÞ[ßµà#â—ã嫿BèÞéë"íÆîcðúñ…óõiö¸÷äøêùÀúfûÄûçû²û+ûIúÿøQ÷5õ±ò¿ïrìÆèÎäœà9ÜÈ×UÓüÎÔÊûÆsÃfÀȽ¸»1º2¹Ä¸Ñ¸a¹^ºÂ»½‰¿ÕÁSÄÇÈɲ̡ϬҬսØÄÛÊÞËáÁä±ç“êpí:ðüò²õXø÷úƒý }ìH é $\„¦½ÐÕÖϽ °"Ž$s&K(!*÷+¾-’/O1 3Ø4¢6Y8:Ô;‰=B?ñ@BHDàE|GüHvJ×KMHNFOP¹PQ-QôPVPYOäMúKŠI›FC?“:’5!0N*3$Üjñ‹ RTþ³øjó›î?ê]æþâà¥Ý¦Û ÚÙØñ×g×× ×9×רÀØ“ÙxÚƒÛžÜÒÝßqàØáOãÏä\æóçŠé0ëÍìrîð¦ñ;óµô$öt÷ªø·ù—úEû´ûàûÁûFûzú@ù«÷Ÿõ5óUðí|éšåjáÝŸØ6ÔÎÏ¤Ë²Ç ÄóÀG¾¼uº\¹Ñ¸È¸?¹&ºz»$½"¿_ÁÖÃzÆ<É!ÌÏÒÕ'Ø*Û9Þ0á3äçêàì±ïrò-õÕ÷túý‹ÿp×& z ³ ï<Vhqrl` L"3$&ð'È)—+k-1/þ0Á2…4H68Å9x;9=ç> @GBôC‘E(G³H*J”KÛLNOòOŸPQ/QQ{PO2N_L J2G×Cè?€;’691y+i%!¯9Ì ‰ÿÊùnô‹ïëç¢ã¡àÞÜ`Ú Ù#Ø|×'× ×.×{×þמØgÙNÚJÛiÜ“ÝÛÞ,à“áã„ä æ¢ç9éÝêxì#î½ïXñêòiôÞõ/÷oø€ùlú%ûœûÜûÅûcû£úùü÷ ö®óéð¾í6ê[æ@âì݃٠իÐjÌuÈÈÄŽÁÁ¾~¼»ºŽ¹â¸Ä¸!¹õ¹1»Ð¼¹¾îÀ[ÃòŵÈË€Î|Ñ‚ÔדڣÝàŸãŒæwéSì$ïíñ¢ôU÷ñùˆüÿ‹ú]¸ J }¯Òðÿ   è!Ù#µ%“'l)>+-Û.¢0i2.4í5®7k9%;à<”>I@õA¡C?EÛFbHåIIK¡LÐMåNÇO€PóP,Q QœPÀO~NÁLˆJÊG…D·@d<’7K2ž, &\ ö} À®áúzõzðëëâçGä7á“ÞlܨÚOÙIØœ×5××%×m×âר?ÙÚÛ1ÜXÝ›ÞèßMá¹â:ä¾åQçëè‡ê)ìÎíiï ñ—òô’õîö0øIù?úû…ûÒûËûwûÍú¹ùNøjö+ôrñcîæê ç ãÇÞ[ÚêÕÑ:Í5ÉyÅ'ÂF¿ä¼ »¿¹ü¸Ä¸¹È¹ïºz¼X¾~ÀßÂqÅ*ÈËëÍëÐçÓüÖúÙÝ à ãüåæèÆë™îdñôÏöoù üŽþ~éB’ Ö >k„œ§«§ Š!y#W%7')á*·,~.M0 2Û35]79Ó:†<@>ò?¡ANCìDŒFH—IK\L•M°NO\PâP QQµPñOÁN MüJ]H.EAB=8Y3Ã-Î'ž!5ÇNüÛÿûˆölñÏì£èúäËáßÕÜûÚÙzؽ×F×××^×Ë×_ØÙòÙêÚöÛ"ÝWÞªßárâîãoåç—è7ê×ëxíï´ðKòÒóHõ¬öì÷ù úÝúlûÃûÎûŠûíúõù•øÍöžôýñÿî–ëÞçÙã›ß7ÛÇÖVÒÎõÉ/ÆÅÂοS½b»ö¹¹Æ¸ô¸ž¹®º+¼÷½ÀhÂïÄ¡ÇrÊ[ÍSÐWÓ_ÖkÙqÜwßtâjåWè7ëîØð˜óHöïø…ûþ”rÍ h £Ôÿ5AID>-!#ý$Ø&µ(‰*Z,'.ð/¹1}3?5ÿ6¼8y:2<é=œ?NA÷BŸD7FÊGNI¾JLYMzNoO;PÇPQQËPPOxMnKçHÕE?B>|9g4ß.ÿ(Ø"x ‘9 !ý•÷hò¯ísé¨åhâ”ß@ÝVÛÓÙ®Øß×\×××Rײ×EØðØÊÙ·ÚÄÛäÜÞfßÀà+â¡ã%å´æFèæé‚ë(íÆîdðûñ‚óõdö°÷Úøßù±úSû´ûËû›ûû&úßø(÷õ„ò•ïFì–è¦äkàÜŸ×3ÓßμÊåÆhÃZÀǽ¹»6º>¹Ó¸á¸z¹qºß»˜½¦¿ñÁoÄÇèÉÇÌÄϾÒÊÕÔØÜÛåÞÝáÛäÄç«ê‚íOðóÄõkøû–ýù[« ù 1l‘¶ËÝáåÚÏ ¶" ${&Z(-*ÿ+Ð-•/d1"3é4¦6g8":Ü;“=H?ø@¦BJDçE}GþHyJÓKM?NEOP°P Q QßPEP=OËMÚKmIuFúBõ>l:l5ù/+* $¿KØt ?Hþ¥øió“îDê_æãà±Ý±Û򾯯t×(××E× ×%ØÐ؟ىڎ۪ÜàÝ!ßàááXãÚäcæùç“é1ëÔìvîð«ñ6ó²ô!ök÷¢ø«ùˆú6ûûÍû¢û-ûXúù†÷uõ ó)ðíìRéjå@áíÜ{ØÔ´ÏƒË¡Ç ÄëÀ?¾¼{ºf¹ß¸Ù¸S¹@º»B½<¿{ÁõÑÆ]É8Ì/Ï+Ò4Õ<ØEÛOÞJáGä5çêöìÅï†òAõæ÷‰úýÿç7 ˆ à þ(Jfu‚wp V"B$&ý'Ò)¥+u-=/ 1Ë24Q68Ì9…;<=ó>¤@PBúC•E.G³H.J‘KÛL NOëO”PúPQðPfPvON?LðIG³CÃ?[;j61P+G%ü“¸ qsÿºùkôƒïëç¨ãªà'ÞÜjÚÙ-Ø×2××:×Œ× ØªØzÙWÚ\ÛqÜ¡ÝåÞ9àšáãŒäæªç?éáêì"îÀï[ñæòjôÔõ.÷bøyù\úûŒûÃû­ûHûú`ùÖ÷áõ†ó»ð“íê0æâÄÝYÙèÔˆÐRÌ[ȺÄÁÀ¾x¼Äº“¹ô¸Ó¸7¹ ºL»ç¼Ø¾Ázà ÆÖȥ˟ΓѠԤױڶݹà²ã£æŒégì:ïþñ¹ôc÷ú™üÿ sÄ V ޾ßÿ ú!á#Â%¢'u)M+-è.¬0v254ù5·7s91;ä< >M@ýA¦CDEßFfHäIKKLÏMÝNÄOqPíPQýP…PªOdN¥LgJªG_D“@=ù3úðútûºû²û\û­ú™ù&øFöÿóKñ2î»êòæàâšÞ5ÚÄÕ_Ñ ÍÉhÅÂ>¿ä¼»É¹¹Ö¸¹ß¹»–¼r¾™ÀûÂŒÅHÈË ÎÑ Ô×ÚÝ%àãæûèÛë¯îtñ3ôßöƒùü¢þ •ôX é Pz­²º¶«š!ƒ#f%C')ï*Ã,ˆ.Y02à3¡5`79Ú:Žö?¬ANC÷DŠFH•I KWL—M¨N˜OSPÔPQQ¢PÚOªNMßJ9H EYA=c863˜-®'v!¥7çÈ÷ûxömñÈì©èüäÒáßÝÜ Û›Ù‰ØË×U×&×.×n×××qØ$ÙÚòÚÜ)ÝfÞ²ßá{â÷ãxå çŸè;êÝë|íï·ðIòÒóBõ§öæ÷ ùúËú\û­û¶ûoûÑúÑùrø¨öqôÙñÊîpë­ç®ãoßÛÖ:ÒìÍàÉƵÂÉ¿K½i»ú¹+¹Õ¸¹±¹ÉºD¼¾.ÀÂżǑÊqÍsÐmÓ|Ö‚ÙŠÜß‹â€ålèLë#îíð¨ó^öÿøšû&þ¦„Û4 q ·ß(ENVRL7!'#%è&À(•*e,4.ý/Â1‰3G5 7Ä8„:9<ó=¤?TAþB¢D=FÍGPI½JLUMvNkO.PÀP Q Q»PPëN[MQKÄHµEBû=X9>4».Ù(´"Zìx" ùýˆ÷fò©ívé­ålâ ßJÝaÛâÙºØî×l×*×/×[×Ç×MØÙÖÙÃÚÒÛíÜ)ÞoßËà3â¬ã+彿Kèîé†ë,íÈîhðøñ…óùôaö¦÷ÓøÐù¦úAûžû¸û}ûóúú¼ø÷éôWòlïìlèwäDàéÛ|×ÓÂΤÊÐÆ\ÃMÀʽµ»BºF¹á¸÷¸Š¹Œº÷»±½Ã¿ ‹Ä7ÇÊæÌÚÏÛÒâÕíØôÛúÞöáðäÙç¾ê˜í_ð%ó×õ}øû¨ý(£lº  Cx£ÁÜéñòçÜ Ä"ª$‹&c(:* ,×-¦/g133ï4°6r8':ç;š=O?AªBRDéEƒGýH{JÒKM?N8OP¡PQQÌP/P&O°M½KMIUFÔBÑ>F:F5Õ/*ë#/¼a *;þœøaó”îBêeæ ã'àºÝÀÛ'ÚòØØ‚×7×+×R×°×1Øáبٗڙ۷ÜêÝ.߆àíá^ãäägæè•é9ëÖìxîð©ñ5ó²ôök÷”ø¢ùzú&û‰û¸û‡ûû6úýø]÷PõàòüïÄì#é?åáÂÜWØèÓ–ÏkˉÇÄßÀ=¾¼‚ºn¹ï¸ë¸h¹Wº¨»]½U¿™Á ıÆwÉSÌIÏDÒMÕWØ\ÛfÞaá]äKç0ê íØïšòTõö÷žú#ý³ÿ#”óL “ × 8Yt‚‡| b"P$+&(à)¯+-I/1Õ2œ4X68Ô9;D=û>«@VBD˜E3GµH/J‘KÛLN OãOŠPìPQÜPSP`OþM'LÌIñFŒC ?3;G6é02+%Ýsÿž `^ÿ´ù_ôƒïë#ç¬ã´à/ÞÜrÚ-Ù<Ø›×F×(×Mט×ػ؂ÙhÚeۀܮÝíÞDà¤áã”äæ­çJéáê‰ì"îÅïYñçòfôÒõ'÷YønùPúû{û«û—û(ûfú:ù´÷¹õ\ó‘ðfíÛéæåášÝ3ÙÂÔjÐ6ÌEÈ©ÄtÁ¹¾y¼Éºœ¹¹å¸J¹!ºe»½ð¾'ÁÃ/ÆèÈÉ˲δѷԽ×ËÚËÝÒàÆã¼æ é}ìPïòÍôv÷ú¬ü/ÿ®Ö# g ›Íï &,$ "ð#Ï%­')Y+#-ô.¶02A46À7~98;ñ<¤>V@BªCKEàFlHäIMKšLÍMØN¼OiPßP QëPrP“OJN‡LIJ‡G=Dm@@²AUCûDFHžIK[L’M¢N”OGPËPQõPPÇOŒNêL¾JHêD3Aø<=8 3t-‰'T!ú‰Ð·çûqödñÉì¨èåØá'ßéÜÛªÙ–ØÛ×c×6×=×{×è×zØ7Ù ÚÛÜ4ÝrÞ¼ßá…âþãåç¢èDêÞë‚íïºðGòÏóCõœöä÷ûøüù¶úOû”û¡ûUû°ú´ùLø‚öKô¨ñ§î:ë†çãDßêÚvÖÒÑÍÅÉ Æ¦Â¿L½h»º5¹ä¸¹Å¹ãºZ¼/¾EÀŸÂ)ÅØÇ¬Ê͋Љӕ֛٢ܨߠâ˜å‚è`ë8îñ¾óoöùªû9þµ,ï? † Àõ<N_acVG!1#%ô&Ê(£*o,?. 0Ì1”3Q57Î8:B<û=¬?[AC§D@FÑGQI¿JLWMnNfO&P´PüPþP¤PòOÏNAM3K£H’EóAÕ=/94‘.¶("<Êa æý}÷]ò¬ípé¶åqâ©ßUÝmÛïÙÇØØv×?×8×o×Ñ×^ØÙãÙÒÚÜÛýÜ2Þzߨà:â·ã4åÃæWèîéë+íÐîfðûñóøôYö¢÷ÇøÈù”ú2ûˆû¢ûcûÖúåù˜øÛö¿ô-òAïçëBèFäà½ÛX×ëҦΈʿÆIÃIÀÀ½¼»DºU¹í¸ ¹¹©º ¼Ò½Ù¿+¦ÄTÇÊÍ÷ÏöÒüÕÙ ÜßâåðçÖê¨íyð5óëõø,û¸ý<°|Ê  N‹®Ôçøúûâ Ö"´$™&m(I*,ç-®/v1;3û4¼6x84:í;¥=U? A®BWDðE‚GIvJ×KM:N6OPšPòPþP¾PPO‘M¢K+I3F¯B­>: 5­/à)È#|£E *þ‘øXó’î>ênæ ã3àÃÝÊÛ5ÚÙ"Ø‘×F×8×e×»×CØêع٢ڧÛÃÜôÝ<ߎà÷ájãçäwæè¢é9ëßìxîð¨ñ5ó®ôöb÷ø–ùlúûzû›ûtûñúúÙø8÷*õ´òÓï“ìùèåîà–Ü2ØÆÓtÏUËqÇòÃÖÀ6¾¼…º|¹ú¸ÿ¸{¹mºÃ»u½s¿±Á,ÄËÆ”ÉpÌbÏ`ÒhÕmØxÛ|Þ{áqäbçBê!íëï¬òhõ ø¬ú;ý¾ÿ8¤[ £ å Di’𛓉 r"Y$:&(ë)¾+Š-V/1á2¤4e6"8Ý9—;L=?­@cBþC£E1GºH/J‘KØLNOÞO|PãPQËP>PHOãM L­IÐFgC}? ;"6Ä0 +%¸X㈠LRÿ¤ù]ô|ïë'ç°ã¾à9Þ)Ü‚Ú7ÙNت×S×:×Yת×'ØÊØÙtÚtÛ‰ÜºÝøÞNà®á ãä%æ¶çNéèê‹ì&îÆïXñèòaôÏõ÷SøaùBúôúdû˜û|û ûGúùŽ÷’õ2ógð9í¯é×å¸átÝ Ù¢ÔKÐÌ1ȘÄlÁ²¾{¼Ìº§¹¹÷¸^¹8º}»½ ¿CÁ©ÃKÆÉãËÍÎÎÑÎÔÚ×ßÚæÝåààãÐæ³é“ì_ï'òßô‡÷+úºüDÿ¼+å3 u ªÝû(853% "ú#Ü%¸'Ž)d+.-ÿ.Â0Š2K4 6É7‡9?;ù<«>^@B±CMEèFhHêIJK™LÊMÐN·O^PÓPýPÙP_P|O/NnL)JhGDK@ï;"7×11,0&ý”/à †|Àúaõmðíëæç\äLá³ÞÜÏÚyÙuØÊ×`×>×R×™×اØiÙFÚ?ÛVÜyݾÞàká×âRäØådçýè˜ê7ì×ípï ñ—òô†õÜöø+ùúÏúSûŽûƒû%ûpúXùÞ÷øõ¯óóðÞíaê˜æ‹âGÞæÙ~ÕÑîÌêÈJÅÂ2¿ã¼»Ü¹!¹ö¸B¹ º7»È¼§¾ÐÀ4ÃÃÅÈPË>Î6Ñ;ÔA×JÚOÝSàHã@æ$éìÖî›ñYô÷ªù:üÅþD°pÀ  <p“¯ÆÏÕÏÅ´!›#%Z'4)+×,¡.l002õ3´5t7.9ë: @¶A\CÿD“F HžIKYLŽMNO=P¿PøPåPzP®OwNÊL¥JöGÊDAÓ<8è2Q-e'4!ÛoÀ¥Þûjö_ñÍì¨è åáá0ßöÜ$Û¶Ù¨Øæ×v×A×O׉×ö׊ØBÙÚÛÜAÝ}ÞÆß$áâäŠåç«èGêâë†íï»ðIòÊóAõ”öÜ÷óøéù¯ú5û‡û„û=û’ú“ù)ø\ö!ô€ñzîëZçTãßÁÚUÖõѹͮÉùś¹¿L½i»º@¹õ¸.¹Û¹øºu¼H¾`À»ÂBÅõÇÆÊªÍ¦Ð¡Ó­Ö³ÙºÜ¼ß¹âªå˜ètëLîñÐóö%ù½ûJþÃ>ŸM ” Ð)H]kpmeS!># %'×(¬*|,I.0Ö1ž3\57Ü8:N<>³?aA C«DFFÒGRI¿JLQMmN[O!P§PñPêP–P×O½N!MK‚HqEÐA°=9ñ3q.(q"²FúÒÿüu÷Xò«íré»åxâ¶ß]Ý}ÛúÙÙØ ؉×J×I×~×Þ×oØÙñÙÝÚèÛÝ=Þ†ßÞàHâ»ã=åÊæZè÷é’ë1íÐîfðüñ|óøôPöž÷»ø»ù‡úûxû†ûMûµúÈùsø·ö–ôòï»ëèäòß—Û2×ÌÒ†ÎsʪÆ=ÃBÀ»½À»Iºa¹ü¸¹³¹¼º(¼è½ö¿EÂÀÄqÇ5ÊÍ ÐÓÖ Ù"Ü)ß$âåèçêÀíŠðHóþõŸø?ûÇýO¿+ŠÚ & a–½âò   ó Þ"Å$ &}(P*#,ð-¹/€1C35Ã6ƒ8=:ô;°=Z?A¶BYD÷EƒGIyJÒKM5N.OýOŽPäPðP¨PPøNyM‚KIFB„>û9ù4‰/¼)¦#[ôˆ2 þ‰øRó‘î@êpæã;àÎÝØÛAÚÙ0ØŸ×W×E×v×É×QØùØÇÙ¯Ú²ÛÐÜÿÝHߘàârãòä|æ è§é@ëàì~îð­ñ1ó¬ô ö\÷‚ø‹ù_úûfû†ûXûÖúøù¸ø÷õ‡ò«ïdìÏèãä¿àpÜ Ø¤ÓYÏ6ËaÇàÃÎÀ1¾¼ˆº‰¹¹¹Ž¹‡ºÙ»‘½‹¿ÒÁBÄíÆ©ÉŽÌ|Ï{Ò‚Õ…Ø’ÛÞ•á†äwçXê6íüïÇòsõ"ø»úLýÑÿGµj ³ ô (RzЦ¢¬ž— }"f$D& (÷)Ç+—-_/)1ì2¬4q6(8ê9;Y=?»@cBD¦E5G¿H,J•KÓLNÿNÔOuPÖPïP¼P&P3OÉMëKI«FGCU?è:÷5¤0Þ*à$–7Ël ;@ÿœùRôyïë*ç¶ãÉà?Þ8ÜÚFÙ\ض×f×E×l×¶×7ØÖ؟ـڀۗÜÄÝßXà¸á)ã§ä+æ¿çSéðêŒì,îÄï^ñâòcôÈõ÷KøUù5úåúSûûdûðú'úúøf÷lõó;ðí€é¬å‹áJÝãØ}Ô+ÐÌȉÄ`Áª¾}¼Ðº±¹¹¹t¹Mº—»3½)¿\ÁÇÃgÆÉÌæÎëÑäÔ÷×ôÚÞùàøããæÍé¥ìvï9òñôœ÷<úÍüTÿÏ:¢óE € Àä"=@H=5 "$é%Â')m+<-/Ì0˜2S46Õ7Ž9J;=´>d@BµCVEæFrHæIMK—LÅMÎN¬OWPÅPñPÇPJPfONQL JEG÷C#@Ì;ø6±1 , &Út« nl°úYõfðêëéçaäQá¿Þ–ÜÞÚ„Ù…ØÖ×s×I×dצר·ØuÙVÚKÛb܆ÝÉÞàuáßâ\äàåoçéŸê;ìØíwï ñ–òô€õØöø#ù úÃú<û{ûjû ûPú7ùº÷ÑõƒóÊð¯í4êoæWâ#ÞºÙYÕýÐÌÌ×È6ÅóÁ-¿ß¼»å¹+¹¹T¹!ºP»á¼Ä¾ëÀOÃáÅ™ÈoËYÎPÑVÔZ×dÚhÝhàcãVæ:éìëî°ñmô÷»ùOüÖþVÂ*ƒÎ  L~£¾ÕÛæÚÔÁ!¨#%f'A)+ã,®.u0>2ü3Â5{7:9ó:ª<^>@»AdCE˜F$HIKVLŒM›NO8P±PëPÔPePšO[N±LJÛG¡Dì@¬<ð7Â2+-='!¸Pî ¤–Íû^ö]ñÄì¯è åèá9ßÝ/ÛÅÙ´Ø÷׃×R×ZכרšØNÙ)ÚÛ(ÜPÝ„ÞÕß+ášâä“åç³èMêèë‰í"ïºðJòÈó<õ’öÓ÷ëøÝùŸú&ûoûpûûzúmù ø1öûóTñMîãê,ç'ãôÞ“Ú4ÖÏÑŸÍ’ÉçŌ³¿G½p»ºL¹¹?¹ò¹»¼b¾ÀÕÂ`ÅÈàÊÇͿнÓÇÖÌÙÒÜÖßÍâÃå«èŒë]î,ñßó˜ö6ùÏû\þÖO®\ ¤ â <Qquyra!J#,% 'ä(¸*ˆ,T. 0à1«3c5(7â8œ:U< >º?iAC¯DMFÒGVIÀJLPMgNVOPŸPÞPáP|PÇO N MõJgHIE°A†=è8É3K.i(N"÷–*àÃëün÷Oò¨íté¼åâ¼ßh݈ÛÚèØØ—×[×W׌×ì×}Ø'ÙÚéÚôÛÝIÞßìàNâÆãFåÏæeèúé˜ë6íÒîjðúñóðôPö”÷²ø±ùwúûaûrû0ûœú£ùSø‘ömôÝñæî’ëéçïãÇßnÛ ×¬ÒgÎ[Ê•Æ.Ã8À¹½Â»Qºj¹ ¹-¹Ê¹Ôº?¼¾À_ÂàÄ‹ÇRÊ9Í(Ð,Ó-Ö9Ù;ÜBß:â2åèÿêÑí ð[óöµøNûÞý[Ó;›ê 6 o¥Îîÿ í"Î$°&ˆ(]*-,ý-Ã/1M35Ï6Œ8F:þ;³=g?A¼BaDøE‰G IzJÑKM.N,OïO‡PÕPãP”PîOàN]MhKéHñEgBb>Õ9Ñ4d/–)ƒ#9×l òþzøNóŠîBêqæãAàÚÝáÛOÚÙAج×h×S׃×××aØÙÕÙ¹ÚÄÛ×ÜÞMß§àâ|ãú䂿è¨éHëáì„îð®ñ/ó©ô öR÷}ø}ùTúîúVûmû@ûºú×ù—øëöÝô]òï;ìžè½ä’àHÜå×Ó=ÏËLÇÒÃÃÀ/¾¼º’¹¹#¹¥¹›ºõ»¨½©¿êÁbÄÇËɦ̙ϔҙՠب۩ޫá›äŽçnêGíðÓòõ0øÏú]ýáÿYÅ$x Ä :a…¬·´°¡ ‹"t$O&/(ÿ)×+Ÿ-l/51ô2»4v658ò9¦;_=?Á@iBD¦E=G»H5JŽKÕLüMöNÒOePÎPßP¬PPO¯MÏKpI‹F#C0?Ã:Ñ5|0¾*¸$x®W '1ÿùMôtïë,ç½ãÍàMÞ@ÜšÚUÙfØÊ×p×W×z×Ã×FØåØ©ÙÚ‹Û£ÜÐÝßbàÃá2ã¯ä3æÆçXé÷ê‘ì.îÉïYñæò]ôÅõ÷@øKù*úÐúEûhûLûÔúúØøB÷HõÛòðáìUéåcáݽØ[Ô ÐçËÈ{ÄSÁ¨¾|¼Ôº¼¹'¹¹ˆ¹cº¯»N½D¿uÁæÃÆ>ÉÌÏýÑÕØÛÞáäøæãé¸ìŠïMòõ°÷MúßüeÿÞN¯ R “ Éù8DUOO> 0"$ø%Î'§){+E-/×0¢2_4"6Ý7š9Q; =»>l@BºCYEìFsHéILK–LÁMËN£OOPºPßPºP3PQOûM4LíI#GÓCþ?¨;Ð61ã+è%¸Tö ^W¥úPõaðéëìçbä]áÄÞ¤ÜéÚÙ•Øã××[×o×¶×*ØÄØ„ÙbÚXÛnÜ‘ÝÔÞàáçâdäèåuç é¤ê>ìÞíxï ñ™òô€õÐöøùüùµú)ûfûQûðú2úù–÷«õ[ó¡ðí ê:æ7âðݘÙ3ÕÝвÌÀÈ#ÅéÁ&¿Þ¼!»ç¹A¹¹p¹/ºk»ø¼ß¾ÁkÃüŵȊËsÎnÑmÔu×yÚ‚Ý~à{ãiæQé/ìýîÆñ}ô+÷Íù^üêþdÖ8’á # ^‹±ÎàíííÞÑ!²#™%s'L) +í,¹.‚0F2 4Ç5‰7A9ÿ:¯@ÆAhCEF&H IKULˆM—N}O/P¦PÜPÃPTP€OEN’LfJ·GDÉ@„<Í7š2-'í œ1Ö ‡¿ûVöUñÃì¯èåîáBß Ý=ÛÐÙÂØØ”×^×m×£×ؤØ^Ù5Ú'Û7ÜXÝ”ÞÙß:á¢âäå#ç¼èPêïëŠí'ï»ðIòÇó8õöÊ÷áøÑùúû\ûWûûWúSùß÷öÏó,ñ î¹êþæþâÆÞqÚ Ö³Ñ~Í~ÉÔŧ¿I½m»!ºT¹¹M¹º!»®¼x¾›ÀðÂ{Å-ÈûÊãÍ×ÐÙÓßÖäÙìÜëßæâÙå¿è£ëpî=ñöó¨öHùäûgþîYÅn ³ îIdyІxs!S#>%'ó(Â*•,a.&0ñ1¯3t5/7ì8¤:_<>Å?lAC¶DNFÙGVIÂJLOMaNQOPŽPÙPÉPoP¯OˆNîLÛJCH*E‰Ae=¾8©3.K('"ÛtdzÝüb÷Iò¦íséÂå…âÃßtÝ’ÛÚõØ%ب×g×f×›×ú׊Ø8Ù ÚøÚÿÛ!ÝTÞšßõàVâÓãIåÝæfèêë7íØîhðýñyóðôJöŒ÷¬ø¢ùkúýúNûZûû|ú‡ù-ønöCô´ñ»îfë»çÈã™ßHÛæÖ‡ÒNÎ>Ê„Æ Ã/À¶½Ä»Wºw¹¹C¹Ü¹ëºX¼¾-ÀzÂûĤÇpÊRÍEÐCÓJÖLÙYÜSßVâEå3èëèí²ðpó"öÈø_ûðýmãM¨û E ~¶Ùþ%$)!÷"Ý$º&•(h*;,.Ð/–1Y35Ú6“8P:<»=p?AÆBdDþEŒG IxJÕKM/N!OíOvPÍPÏP†PÖOÌN>MNKÇHÏEDB>>¬9¯4:/u)^#¸R àÿýqøDóŠîBêuæ$ãFàçÝëÛ]Ú+ÙKؾ×s×eב׿×mØÙâÙÆÚÐÛãÜÞ[ß®àâ…ãåŽæè¶éFëìì€îð©ñ1ó¤ôöN÷oøuùAúãú=ûYû'ûšú¼ùpøÊö°ô:òMïìpèäiàܽ×`ÓÏË:ÇÁúÀ+¾¼—º›¹%¹4¹¸¹´º ¼Æ½Â¿Â~ÄÇäÉÃ̱ϰҲպؽÛÅÞ¼á¸äŸç„ê^í%ðìò›õFøàúpýóÿi×2Š Ò Fq’¬»Ãû¯ ˜"€$[&<( *â+«-x/>13Ã46@8÷9²;f=?Ç@pBD°E=GÀH5JŽKÔLöMóNÆO_P¾PÑPšPûOO“M´KNIlFüB?™:®5T0š*”$Xø–= !ÿ„ùDôpïë+çÈãÎà]ÞGÜ©ÚcÙuØ×××f׆×Ö×QØóØ·ÙÚ—Û°ÜÛÝßkàÎá9ã¹ä;æËç`éùê™ì.îÌï[ñãò[ôÁõ ÷<ø<ù ú¼ú3ûPû5û·úêù´ø÷õ´òæï¶ì(éTå7á÷Ü–Ø7ÔíÏËËòÇfÄLÁ¡¾|¼ÚºÅ¹3¹-¹—¹ºÂ»k½\¿”ÁÄœÆYÉ3Ì!ÏÒÕ"Ø+Û+Þ-á!äçöéÎìïbòõÃ÷^úñüvÿð]À c ¡ Ù'FT_^\L ;"$&Ü'´)„+T-/è0¦2m4)6ç7£9Z;=Ä>q@BÀC]EñFsHìILK’LÀMÃNŸOCP®PÒP§P P9OãMLÎIG±CÚ?;¬6f1¿+Ç%’=Ô~ DJ™úFõ`ðæëïçhädáÎÞ¯ÜõÚ¡ÙŸØö××k××Ã×9ØÓØ‘ÙnÚfÛwÜ¡ÝÙÞ*à†áôâkäðå|çé¬êAìáí{ï ñ˜òôzõËöÿ÷ ùóù¡úûOû;ûÑúúñøs÷…õ2óuðXíÝéæâËÝpÙտЕ̬ÈÅàÁ¿Þ¼#»õ¹H¹'¹|¹Mº~»½÷¾!Á‰ÃÆÖȟ˔΀ьԊהژݗàŽãæeéAìïÕñ“ô;÷àùpüúþuäK ò 1 m˜ÁÙðøüøìÚ!Â#£%€'W)*+ø,Å.0O24Ñ5‘7K9;»@ÉAmC E F)H IKSL†MNvO"PŸPÊPµP?PhO/NsLJJ•G^D£@b<¦7v2á,ö&Ð z· €rµûNöPñÄì¯èå÷áJßÝIÛÜÙÔØØ¡×p×w׸ר´ØlÙ@Ú8Û>ÜgÝœÞçßBá«âä¤å,çÀèVêóëŒí+ï¹ðJòÅó2õ‰ö¿÷ÛøÁù‚úûFûAûèú;ú0ù½÷êõ§óñõíŒêÔæÐâ ÞHÚèÕ”ÑbÍgÉÂÅw¡¿H½p»(ºa¹'¹d¹º=»Ã¼•¾¶À ØÅHÈËÎîÐöÓòÖÚüÜàöâóåÓè¶ë…îPñ ô¹ö\ùòû|þúkÕ, Á ÿ+Ynœ”Œz!b#G%#'ü(Ï*Ÿ,k.30ù1»3|577÷8¬:g<>Ç?xAC½DPFÝGWIÂJLJM^NJOPˆPÆP»PZP™OoNÓL¼J$HEfA?=™83ý-&("¾Vÿ±£ÏüZ÷Eò¤íwéÅåâÍßÝ¡Û!ÚÙ8ز×{×r×©× Ø“ØIÙÚÛ Ü*Ý`Þ¤ßþàbâØãTåáæoèê¢ë;íØîmð÷ñ|óéôEö„÷¡ø–ù\úëú8ûDûúúaúfù øIöôŒñŽî=ëçœãpßÛÃÖgÒ0Î*ÊpÆÃ'À´½Æ»_º‚¹*¹S¹õ¹»s¼8¾GÀ—ÂÅÀÇŒÊkÍ_Ð^Ó`ÖiÙkÜqßfâ_åCè(ëûíÅð„ó2öÜøoûþ~ó]· Q Àé /60.!#ç$Ç& (u*F,.Ý/œ1g3!5ä68X:<Á=w?AËBiDFŽGIyJÓK M*NOãOnP¾PÀPrPÂO²N%M0K¨H®E"B>‹9…4/M)@#øœ;ì ÐðýhøAó„îGêtæ/ãOàðÝùÛjÚ8Ù[ØËׄ×qס×ò×}Ø ÙðÙÔÚÙÛòÜ#Þcß½àâ’ã哿è·éPëëì†îð¬ñ.ó¢ôöE÷høhù3úÓú'ûEû ûƒú–ùTøŸöô ò*ïáëJèaäBàõÛœ×=ÓÏëÊ&ǴòÀ%¾ ¼›º§¹4¹D¹Ï¹Éº$¼Þ½Ý¿ ›Ä:ÇÿÉÝÌÌÏËÒÊÕÔØÕÛÛÞÔáÊäµç™êoí;ðûò¯õUøóú€ýyæD— â U€¡¸ËÍÒɹ ¦"Š$i&E(*ì+·-‚/G1 3Ë4‹6I8þ9¼;l= ?Î@uBD³E@GÂH3JKÎLõMëN¿OUP±PÂP†PéOêN}M•K0IIFÛBé>v:‡510u*s$7Ýz* ÿÿxù=ôpïë1çÌãÙàfÞTܵÚoÙ…Øæ×Ž×uד׿×]ØÙÄÙ§Ú¦Û¹ÜèÝ$ßvà×áCã¿äDæÑçféÿêšì4îËï\ñáòZô¹õ÷/ø4ùú¯úû9ûû˜úÎù‘øüööôò»ïŠìÿè'åáÐÜnØÔÍϳËÜÇWÄCÁ¾{¼áºÌ¹D¹<¹¬¹”ºÜ»ƒ½w¿®ÁĹÆtÉMÌ=Ï0Ò9Õ;ØAÛDÞCá7ä&ç êâì±ïtò)õÑ÷uúýü‹ÿþnÏ$ q ° é6RbmlhY F".$ &ë'»)’+^-'/ð0±2x416ó7©9e;=Ë>y@#BÆCcEñFyHéIMKL¾M¼N˜O9P¢PÄP”PP"OÈMüK®IãFC¸?Y;‰6>1œ+¤%qºf 29ú?õZðèëîçpäiáØÞ»ÜÿÚ¯Ù­ØØ×x××Ñ×GØáØÙ}ÚqۄܬÝåÞ5àŽáÿâqäùå‚çé¯êHìãí{ï ñ•òôvõÄöø÷ÿøèùú û:û!û¹úõùÑøQ÷ZõóHð.í²éæåàážÝLÙìÔ Ð{Ì–ÈÅÕÁ¿Þ¼)»ú¹V¹6¹¹cº–»-½¿;Á¤Ã1Æíȿ˩ΡџԨתڱݬà¨ã“æ}éUì%ïíñ ôU÷ëù†ü ÿ‡õY±þ D xªÎéü ûå!Ï#¯%'b)7+-Ï.˜0[24Ü5š7V9 ;Ä&@ÏAuCE¥F.H I KNL†M‹NnOPPÃP P,PVON[L+JsG=D~@<<7M2¼,Ó&« ^ù£ ga¨ûBöLñ¿ì±èåúáXßÝWÛêÙàØ!د×}׈×Ä×/ØÂØwÙPÚAÛPÜoݪÞðßMá´â*ä¬å3çÉèYêûëí-ï½ðHòÄó/õƒöº÷Îø¹ùoúôú/û)ûÐúúù›÷ÃõóØðÉíeê¤æ©âsÞ"ÚÅÕrÑEÍSÉ«Åm™¿C½x»+ºp¹7¹u¹7ºT»Ü¼°¾ÏÀ(òÅdÈ2ËÎÑ Ô×ÚÝàãæìèÊë™îfñôÍöoùüþ }ã> Ò ;e˜¡¦£™‡!q#P%2')Ú*­,t.@02È3„5D7ÿ8µ:p<>Ó?{A#C¾DXFÞG[IÁJLGM[NBOýOzP»P©PJPOYN¶LžJHãDDA=x8W3Ú-ÿ'å!™>ߟŒÂüO÷>ò ívéÇå•âÔ߉ݪÛ/ÚÙFØÂׅ׆׵ר¥ØRÙ&ÚÛÜ7ÝjÞ°ßánâàã^åèævèê¥ëBíÙînðûñwóéô?ö|÷›ø†ùTúÔú+û)ûäúCúGùè÷"öõó`ñfîëaçqãHß÷ÚžÖFÒÎÊ]ÆÃÀ²½Æ»gº¹8¹f¹ º»Œ¼R¾bÀ³Â0ÅÜǨʅÍ{ÐwÓzÖم܅߀ârå^è:ëîÙð”óJöéø‡û þ’nÈ c œÒ÷.>A@7'!#õ$Ò&­(~*S,.å/¬1m3-5ï6¥8d:<Î=z?*AÎBpDF“GI|JÏKM%NOÛOcP±P²P^P¯O˜N MKŠHŒEüAô=a9c4ï.-)#Üz"Ô ½àý\ø7ó‚îCêzæ0ãYà÷ÝÜtÚEÙjØØ×’×ƒ×ª×؇Ø2ÙúÙâÚæÛýÜ/ÞoßÃà'â•ãå˜æ(è»éVëîìŠîð«ñ,ó ôûõ@÷_øZù*ú½úû*ûõúbú|ù-øödôãñüîºëè:äàÒÛs×ÓáÎÒÊǤêÀ¾#¼Ÿº²¹@¹W¹ã¹ßº>¼÷½ù¿;¶ÄUÇÊùÌäÏçÒâÕìØïÛñÞíáâäÉç²ê€íTð óÃõiøû’ý‹õT¨ ñ 0dޝÇ×ÞßÔÉ ±"—$w&O('*ô+Æ-Š/U13Õ4—6P8 :Ã;u=(?Õ@}BD·EFGÂH:JŠKÓLìMëN´OLP¥P³PtPÕOÓNbMwKI&F·BÄ>N:c50Q*O$¾] êÿlù4ôkïë4çÏãäàjÞbÜÀÚ~ÙØõכׇנ×ó×mØ ÙÕÙ²Ú³ÛÅÜóÝ/ß‚àÞáPãÅäLæÛçiéëœì9îÍï^ñàòWô·õþö*ø(ùú¢úû,ûþúƒúªùqø×öÏôeòï`ìÐèüäãà¥ÜLØòӱϗËÈÇFÄ9Á–¾|¼äºØ¹O¹N¹¿¹«ºõ»½“¿ÉÁ7ÄÓÆÉiÌWÏLÒSÕTØXÛ`ÞUáRä;çêùìÅï†ò?õä÷…úýšÿ}â0 † ¼ ú"Ebo|yve T"9$&ô'Ê)›+k-4/û0½24=6ü7±9o;=Ó>ƒ@&BÎCgEöFzHîIIK”L¶M¹NO2P”P¸PPýOO±MÞKŽIÃFhC“?5;_61s+%Pÿ›O *~ú9õQðëëìçtäqáàÞÇÜ Û¹Ù¾Øحׇי×ä×QØñبًÚ|ۓܵÝòÞ>àšáãzäæˆçé³êMìåíï ñ—ò ôrõÁöë÷úø×ùúùú ûûšúÙù±ø*÷7õâòðí„é¼å±áxÝ$ÙÇÔƒÐ\Ì‚ÈîÄÇÁ¿Ø¼1»ÿ¹e¹F¹¢¹yº­»J½*¿\ÁºÃRÆÉÜËÃÎ¼ÑºÔ¿×ÆÚÆÝÆà»ã¬æélì:ïÿñ¹ô`÷ú’üÿ—kÁ P Š·Ý÷  ñ!Ý#½%•'t)<+-Õ.§0c2*4æ5£7`9;Î<}>,@×AyCE©F/H¤IKPL‚M…NjOP„P³PPP=OùM@LJVGD[@')é*´,„.H02Ð35M79À:u<+>Õ?†A&CÇDZFáG]IÁJLEMUNNœLJãGÂDAôÚÙSØÐוג×Å×'رØaÙ3ÚÛ'ÜAÝvÞ¼ßáwâéãgåíæèêªëFíÜîqðùñyóãô=öt÷’ø|ùBúÈúûûÊú$ú(ùÄ÷ýõÍó6ñ;îâê6çDãßÓÚsÖ*ÒðÍýÉEÆüÂÀ°½È»lº˜¹I¹w¹º/»¤¼n¾{ÀÏÂNÅúÇÂʢ͕Гӕ֙ٞܜߙâ‡åsèQë$îðð¨ó\öÿø–û#þ¡|Ú, p ±Ý (;NMPD5!#%â&¸(*],'.ñ/·1x3:5õ6³8f:'<Î=‰?-A×BuD F—GI}JÐK MNOÑO[P£P¢PLPœO}NõLðJlHgEÚAÊ=?974Ì.)õ"¹\¾ §ÐýPø.óîAê|æ3ãbàÞ܃ÚQÙwØêכה׷ר“ØAÙÚïÚòÛ Ý:Þ{ßÍà0â¡ã墿.èÃéYëõìŠî"ð«ñ-ó›ôøõ8÷YøOùú¯úûûØúHú[ù øYö>ô¹ñÔîŠëòç äíߦÛP×ùÒÄκÊýƖÞÀ¾ ¼©º»¹O¹j¹ö¹÷ºW¼¾ÀYÂÏÄtÇ5ÊÍÐûÒÖÙÜ ßâúäàçÅê—ífð!ó×õzøû¢ý(›f¶  =u›ÀÔæìêäÔ À"£$…&Z(5*ÿ+Ñ-˜/]1"3à4 6Z8:Ì;~=0?Û@„B"D¼EGGÉH6JŽKÌLíMáN¯O@PšP£PcPÀO»NGM[KñHF”Bœ>,:85ä/***$óŸAù Öóþaù+ôfïë6çÒãëàsÞmÜÍÚ‰Ù ØØ«×“װר|ØÙáÙÀÚ½ÛÖÜúÝ=ߊàéáZãÍäUæàçré ë¤ì9îÒï\ñàòUô±õüöø#ùñù’úöúûèúfúŠùUø¬ö¯ô6òjï/ì©èÍä»àzÜ&ØÑÓπ˰Ç;Ä*Á“¾|¼éºâ¹\¹`¹Ó¹Âº ¼¹½­¿äÁUÄíÆ­É…ÌpÏhÒlÕkØwÛpÞsácäTç3êí×ïžòOõù÷—ú$ý¬ÿ ’íG Ð 0Vm‰†„s `"F$&&(Õ)ª+s-A/1É2Š4I68À9t;)=Û>†@2BÏCmEùF|HîIKKL´M´N‡O'P‰P¦PrPåOôN–MÂKqIŸFGCl?;96ô0O+\%.Þ‚3 sú/õNðæëòçwäyáèÞÑÜÛÇÙËØغחץ×ô×^ØÿضٖڋÛÜÂÝûÞIà£áã…äæ’ç!éºêQìéí€ïñ’ò ôkõ¼öã÷îøÊùsúäúûóúú¼ùø÷õ¶òùïÓì[é‘å…áQÝüئÔaÐEÌjÈàľÁ ¿Þ¼.»ºq¹T¹º¹ŠºÊ»^½J¿rÁÙÃkÆ#ÉöËßÎÕÑÔÔÚ×ÛÚáÝÛàÓãÁæ§é~ìRïòÌôu÷ú¨ü,ÿ©|Ï! ^ ™Æë ) ÿ!é#É%¤'{)M+-æ.­0r204ó5¬7g9;Õ<ƒ>8@ÚACEªF3H¥IKQLzM†N]O PyP¢PPP)OßM%LëI4GöC3@ô;072m,&d ¼t 7D‡û4ö=ñ½ì´èå âdß5ÝlÛÚùØ>ØÌכפ×á×KØÝØ“ÙiÚZÛh܆ݿÞà^áÊâ7ä¿å@çÕèiêÿëœí,ïÂðFòÁó'õyöª÷ºø ùRúÏúûúú™úäùÍøU÷yõ-óˆðoíêMæRâ"ÞÒÙ}Õ3Ñ Í%ɉÅSŠ¿B½{»>ºˆ¹S¹ ¹]º†»½å¾Á_ÃèÅžÈgËOÎBÑ?ÔD×HÚIÝJà?ã2æéôëÂîñBôóö‘ù)ü°þ0œ\® ñ +Zž±Á¾Â¯¥!†#l%H' )ó*Â,Œ.U02Û3™5X79Ê:~<1>Þ?ŠA.CÊD`FãG_IÁJLBMPN9OæOhPœPP PXO&N€LeJ¿G¤Dõ@Ï<'8 3Œ-º'š!^ý°nk¡ü=÷/òœíxéÍå¡âãß Ý¿ÛJÚ)Ù_Øâסע×Õ×3ØÁØpÙ;Ú.Û/ÜPÝ‚ÞÄßá€âòãoå÷æèê¬ëLíÛîtð÷ñzóÝô:öj÷ˆørù0ú¹úýúþú¯úú ù¡÷×õ¥ó ñî·ê çãõÞ¨ÚTÖÒÙÍàÉ;ÆçÂÀ¨½Ï»rº¤¹V¹‹¹3ºH»¼¼‡¾˜ÀêÂhÅÈÝʽͱШӱְٶܴ߭â å†èhë6îñ»ómöù§û5þ²'Œê: ¾í6IZ][RB!,# %î&Ã(˜*i,3.ü/Â1‚3D5ÿ6»8t:'<Þ=Š?5AßBvDF–GI~JÎK MN OÊOOP—P‘P;PƒOhNØLÓJLHEE¶A§=94§.Þ(×"”Bè¨ ”ÃýFø(ó|î@êæ:ãhà ÞÜŠÚcÙ‚Øù׬נ×È×!Ø¥ØKÙÚüÚþÛÝGÞƒßÚà8â©ã#婿3èÊé]ëùìî ð®ñ(óœôðõ3÷LøGù ú úïúû¾ú-ú:ùê÷4öô‘ñ¨îaëÅçÞãÅß{Û-×ØÒ¥Î¤ÊçÆ‰Ã—À¾$¼®ºÄ¹`¹y¹ º»n¼,¾.ÀtÂëÄÇQÊ/ÍÐÓÖÙ Ü ßâåõçÜê©í{ð4óêõŒø*û³ý:«sÉ  M„ªÍäòüöóß Í"°$Ž&j(=* ,Ü- /l1*3ê4«6b8:Ó;‡=7?â@ŠB%DÃEGGÎH3JKÇLëMÙN©O4PP”PQP«O¤N.M:5¿/*$Ó(â ÂåþTù%ôbïë9çØãòàÞwÜÙÚ—Ù­Øظס×À× ØŠØ)ÙíÙÏÚÊÛÞÜÞEß–àóá`ãØä[ææçzé ë«ì:îÔï\ñàòQô®õñöøùæùúãúýúÐúIúnù.øŽöƒôò>ïì|è£ä‘àUÜØ¯ÓrÏfËÇ*Ä#Á޾}¼îºì¹k¹o¹ê¹Õº'¼Ï½Ç¿ÂnÄ ÇÇɟ̋τÒՉ؉ÛÞ…á~ädçLêíîï®òcõ ø¦ú7ý»ÿ2¡ÿU Ÿ ß Ab|Ž“˜Ž n"P$4& (ä)±+ƒ-I/1Õ2’4T6 8Ç9|;2=â>Ž@7BÕCrEüFHíIMKŒL°M®NOP{P™P^PÔOÛN}M¦KQI€F#CI?ê:6Î0-+6%½h öiú#õNðâëõç|ä~áõÞØÜ'ÛÑÙÛØ+ØÈץ׶רoØ ÙÇÙ Ú™Û¦ÜÎÝßQà¯áãŒäæ—ç)é¿êUìíí‚ïñ”òôkõ±öÞ÷âø½ùdúÑúùúÙúfú›ùqøàöíôŽòÎï©ì0édå_á$ÝÛØÔEÐ+ÌUÈÎÄ´Á¿Þ¼3»ºz¹k¹È¹¦ºÜ»|½a¿ÁôÇÆ>ÉÌúÎìÑòÔî×öÚ÷ÝñàêãØæ¹é–ìaï(òÜô‡÷&ú·ü@ÿ¸'Šá. p ¥×÷%02- "ô#Ô%²'…)[+&-ñ.¸0z2>4ú5¸7n9);Ú<>8@åAƒC!E®F4H§IKQLvM€NUOPiP˜PnPðOOÅM LÎIGÖC@Ð; 7ß1K,g&H ü¨U *.û*ö8ñ¿ì±è(åâpß>ÝyÛÚÙMØÙתײ×ï×ZØéØ¢ÙuÚgÛtÜÝÍÞàláÍâGä¾åOçÕèpêì›í2ï¿ðHò»ó(õnö¤÷°ø’ùFúºúôúàúúÃù®ø2÷OõóTðOíÛé&æ)âöݲÙUÕÑîÌÉwÅHÂ…¿A½}»Jº¹j¹¬¹xºš»)½ý¾$Ávà ƱȉËcÎbÑTÔ_×\ÚdÝ]àWãFæ+é ìÖîžñVô÷¥ù9üÂþ>°o» 9j¯¼ÎÎËÀ®!”#y%R'-)ü*Î,™.\0'2á3¦5_79Ó:„<9>æ?A5CÍDbFçG`IÃJL>MMN/OàO\PŽP{PP?ONeLCJ¥G|D×@©<8ê2e-˜'z!<å’_V™ü/÷.ò˜íyéÒå¦âíߪÝËÛWÚ5ÙqØì׳׭×ã×CØÍØ{ÙLÚ6Û>ÜZÝŠÞÓß"áŒâøãwåÿæ‡è"ê°ëNíáîqðûñqóßô/öh÷{øeù%ú£úìúçú’úðùâø÷²õ}óåðäíêàæïâÊÞ‚Ú1ÖãÑÁÍÇÉ)ÆÜ À§½Ó»wº±¹f¹Ÿ¹Fºa»Ó¼¡¾µÀÇÅ.ÈøÊÙÍÇÐÈÓÃÖÌÙÌÜÌßÃâ¶å›è{ëLîñÏó€ö"ù»ûDþÃ7œúI Ìý$DXgji_M!8#%ø&Ò(¡*u,?.0Í1Œ3M5 7Ä8|:1<ä=??AßBDF›GI|JÑKMNO½OIP…P„P&PoOON¿L³J/H!E”A€=ô8í3.½(°"z!Ò‘ ƒ¶ý:ø$ówîBê…æ>ãtàÞ&ÜœÚlÙ’Øطײ×Ô×1ذØYÙ"ÚÛ Ü#ÝMÞ’ßààFâ­ã0å­æ?èÌédëüìî%ð©ñ+ó•ôíõ+÷Cø;ùüùŽúÞúéú¦úúùÊ÷öïóiñ{î9ë˜çµãšßUÛ ×´ÒŽÎ„ÊÙÆzÃŒÀ¾!¼¶ºÎ¹p¹Š¹"º#»‡¼F¾FÀ‘ÂŬÇkÊJÍ7Ð0Ó4Ö3Ù:Ü5ß2â"åèêêÆí†ðNó÷õ£ø8ûÇýJº+Ú \’¸Ûòþî Ø"½$š&v(G*,â-±/q173õ4²6n8&:Ú;“=9?î@ŠB2DÁERGÊH8JŒKÈLäMÖNžO,P~PˆP;P™OŠNMK´HÂEMBU>Ý9ñ4—/â)ä#²bÈ ²ÓþIùô[ïë:çÞãùà‡ÞƒÜæÚ£Ù½ØØÌ׫×Òר™Ø5ÙþÙ×ÚÛÛçÜÞQߟàýáiãáäcæîçéëªìCîÑï_ñÞòMô«õìö ø ù×ùsúÌúëú³ú/úNù øiö[ôëñïÝëMèxähà(ÜÞ׊ÓVÏLˇÇÄÁŒ¾{¼÷ºò¹|¹~¹þ¹íº>¼ë½à¿ˆÄ)Çáɼ̤ϞҜՠإ۠ޡáä}ç`ê6íðÄòtõø»úFýÐÿA²g ­ ð #Oq‹˜§ žŒ |"]$?&(î)¿+-S/1Þ2ž4]68Ð9‡;8=í>’@?BÙCvEGHóIHKL­M§N{OPsP‡POP½OÄNcM‡K5I[FC!?Ä:í5©0+%ìžNÿ äôÿ]úõEðåëòç†äƒáþÞäÜ2ÛáÙæØ;Ø×׳ׯרzØÙÐÙ±Ú¤Û´ÜÙÝß\à¹á!ã–äæšç4é¿ê^ìðí‚ïñŽòôeõ«ö×÷Öø±ùSú¿úãúÀúKú{ùOø½öÅôfò¢ï}ìé6å5áüܲØ`Ô"ÐÌ=ÈÁĦÁ¿×¼>»º¹v¹á¹¸ºû»‘½~¿©ÁÄ Æ]É+ÌÏ ÒÕ ØÛÞ áþãîæÐéªìwï9òñôš÷;úÉüQÿÉ9™ò= € µå%1@?;- "$ß%À')g+1-ü.Ä0…2H46Â7x93;à<™>>@íA‡C'E²F8H¨IKMLuMzNPO÷ObP„PaPÙOÿNªMìK°IîFµCé?§;è6µ1',A&& Ú: rûö7ñ¶ì¸è'åâtßMÝÛÚÙVØì×µ×Â×þ×eØúØ­ÙÚwÛzÜ£ÝÐÞàqáÛâJäËåRçßèvêì£í2ïÄðEò¼ó õlö›÷§ø„ù7ú¨úàúÉúdú§ùŒø÷-õàò0ð í±éúåþáÐ݇Ù7ÕòÐÛÌõÈjÅ9¿>½ƒ»Nº ¹u¹Æ¹ˆºµ»?½¿:Á—à ÆÒȞ˅ÎsÑvÔr×{ÚwÝyàkã]æ@éììî°ñkô÷¸ùJüÔþMÁ#~Ê  E{›ºÐ×ÝØÌ½!Ÿ#‡%^'7) +Ô,¨.e032ê3²5g7%9Ú:Ž<@>ï?•A;CÑDgFêGaIÂJL;MHN(O×OPP‚PhPýO*OöMHL'J‚GZD²@‚<Ý7Â2B-n'[!ÈzDF‹ü$÷)ò’í|éÕå¬â÷ß±ÝÙÛcÚDÙØú×Â×¼×ò×OØÝ؉ÙWÚEÛIÜeÝ™ÞÙß/á”âäåçè%ê¹ëPíäîsðøñtóØô,ö_÷qøYùú’ú×úÍú|úÌùÈø[÷ŒõVóºð¹íbê³æÄâ¢Þ[Ú ÖÈўͷÉÆÔÂÿ¿¨½Ò»‚º¼¹u¹°¹\ºw»î¼¼¾ÍÀ"ÞÅMÈËóÍåÐÞÓàÖäÙãܿߨâÍå±èë`î)ñâó“ö4ùÍûVþÓH­ [ ž Û 4Oitxwj^!B#)%'Þ(¯*~,I.0Ó1œ3R57Ë8†:9<ê=›?AAèBƒDFŸGI~JÍKMNýN·O:PzPsPPYO5N¤L—J HEmA]=Í8Å3`.”(“"T·z r¥ý0øósîEê†æHãyàÞ4ܦÚ|Ù¡ØØÊ×½×å×=Ø¿ØhÙ-ÚÛÜ-Ý[Þ›ßëàNâ¸ã5å·æAèÖégëí’î&ðªñ*óôìõ÷@ø*ùñùzúËúÓúŠúôùúø¦÷ëõÆó>ñUîëqç†ãrß.ÛâÖ˜ÒjÎuÊ¿ÆqÃÀ¾$¼¾ºÚ¹|¹ ¹3º>»Ÿ¼_¾eÀ¨Â&ÅÃljÊdÍQÐLÓKÖMÙQÜNßJâ7å&èÿêØížð]ó ö³øMûÖý\Ë9”ç 1 i¡Éè ø é"Æ$¨&€(U*%,ò-·/€1>35º6y8-:æ;•=D?ò@“B5DÆETGÌH:JŠKÈLÝMÓN“O$PpPvP,P€OvNöLK•HžE+B->º9È4q/¾)¿#“Dñ´ œÅþ@ùô]ï ëAçáãáŽÞ’ÜïÚµÙÈØ.ØÕ×Áר×/Ø¢ØGÙÚêÚáÛøÜÞ\ß©àârãéälæóç…éë¯ìEîÔï_ñÛòNô¢õçöøÿøÉùbú¹úÔúœúú0ùè÷Eö5ô¿ñêî«ë)èIä?àÜ´×nÓ5Ï6ËsÇ ÄÁ‡¾¼úºÿ¹ˆ¹‘¹º»W¼¾ý¿8¤ÄCÇüÉ×ÌÁ϶ҵջظۿްá«ä‘çuêKíð×ò†õ4øÇú^ýÜÿSÂs À û 4\–©°°©› †"k$K&$(ú)Ê+˜-_/&1é2¦4g6 8Ö9“;<=õ>™@DBáCyEG„HðIKKˆLªM¢NqOPePwP@P¥O±NEMnKI»'ºš¹†¹÷¹Ëº¼ª½›¿ÄÁ-ļÆvÉHÌ/Ï$Ò"Õ#Ø(Û$Þ$áäççé¾ìŠïOòõ°÷IúÜübÿÛG« M Äó1AMMG: )" $ð%Ç' )p+?-/Í02P46Ç7…98;ì<>F@óAC+E·F7H®IKPLlMxNFOðOSPxPNPÈOåN’MÏK‘IÏFCÆ?;Â61,& Àl% þ fûö2ñµì¹è-åâ‚ßRÝ“Û)Ú&ÙdØû×Å×Ñ× ØtØٺّڀۉܬÝÞÞ&àááâUäÕåVçèèxêì¤í6ïÀðGò¸óõeö“÷œøwù(ú”úÍú®úKúˆùkøëöõ¹òðöì„éÐåÏá©Ý`ÙÕÚжÌèÈSÅ1Ây¿=½‡»Xº¬¹†¹Ø¹ ºÍ»[½1¿\Á­ÃBÆéȾ˛Δъԑ׎ڕ݌à…ãqæXé1ìïÇñzô,÷Çù_üãþaÐ5Û  Y‡«ÊØìåêÖÊ!®#‘%k'D)+â,±.r0;2ù3¶5v7(9è:’ñ?ŸA>CÚDhFîGbIÂJ L7MBN#OÌOFPqPZPçOOÝM-LJ`G8DŒ@_<µ72-L'7!üªa13~ü÷ò•íxéÞå°âà½ÝäÛpÚSÙ‰Ø ØË×Ñ×û×bØçؘÙeÚPÛWÜnÝ¥Þâß<ášâ ä†å ç–è+ê¼ëTíæîsðúñnó×ô%öW÷gøOùú…ú¿ú¹ú^ú±ù¤ø;÷eõ0óŽð‘í5êˆæ›âwÞ4Úêբш͛ÉÆÅÂú¿¦½Õ»ŠºÇ¹‡¹Á¹tº»½×¾èÀ;þÅeÈ1Ë ÎÑöÓûÖüÙüÜûßñâàåÉè£ëwî<ñ÷ó¤öHùÞûgþæX½f ² çB_v……wi!P#3%'ê(¹*Œ,T.0ã1 3b57Ø8Š:F<ï=¤?HAìBŠDF¢GI|JÎKýLN÷N¯O.PmPaPPCONˆLyJîGÝDKA8=¤8¥33.u(k"6êšf _–ý(øórîCêŒæJã…à&Þ@Ü´ÚˆÙ°Ø!ØÙ×Í×ò×OØÊØwÙ9Ú$Û!Ü:ÝeÞ§ßõàWâÂã=徿Kè×éqëí—î$ð®ñ#ó’ôáõ÷4øùâùiú·úºúsúÕùÚø†÷Àõ£óñ+îÛêEç]ãGß Û»ÖxÒNÎ]Ê®ÆaÃ}À¾*¼Áºç¹Œ¹¯¹MºP»»¼x¾€ÀÅÂ@ÅßǦÊ~ÍlÐfÓcÖhÙfÜiß[âUå4èëëí±ðsóöÇø]ûêýjßG¦ô B w±Öõ$  !ò"Ô$´&Œ(_*1,ü-Ã/‰1J3 5Å6‚85:í;Ÿ=I?û@•B9§4H/)›#u$Ù ‰¹þ1ùôTïë@çìãáœÞšÜýÚÂÙÔØ>Øå×Í×ë×8Ø´ØRÙÚòÚñÛÝ,Þc߸à â}ãñäpæýçŠéë¶ìBîÙï[ñÞòFô¢õÛöþ÷ïøÀùLú«ú¸ú…úõùùÊ÷öô—ñ¼î†ë÷ç#äàÝÛ×JÓÏË`ÇÄÁ„¾¼» º—¹¢¹(º»q¼¾ÀQÂÄÄ[ÇÊðÌÚÏÓÒÎÕÔØÏÛÖÞÈáÂä¥ç‹ê^í)ðêò˜õDøÜúmýîÿgÌ4 Ð Dh“¡º¼¾·¦ •"v$W&1(*Ù+ž-o/.1ô2²4m6,8ß9™;G=ù>¢@IBçC}EG‡HïIMKƒL¨M›NjOüOYPgP,P“O—N-MQKòHF¹BÛ>x:¤5[0¿*Í$«dÔ ºØÿCúõ<ðåëùçŽä•áßýÜIÛþÙÿØ[Øó×Ñ×ã×*Ø™Ø4ÙîÙÇÚÀÛÊÜñÝ)ßpàÍá1ã©ä%æ­ç;éÏêaì÷í†ïñ‘òô[õ öÃ÷Àø˜ù2ú™ú¹úŽúú>ù øvöuôòJï+ìªèääÞà®ÜfØÔèÏÞËȡēÁù¾Ü¼C»4º£¹¹ºæº)¼Ç½±¿âÁGÄÚÆ‘ÉbÌKÏ=Ò=Õ:Ø?Û=Þ9á+äçøéÓìžïbòõ¿÷[úîüqÿíWº [ ž Ôÿ&=QX\RI 3"$û%Ò'¬){+I-/Ø0›2[46Ñ79?;ö<¢>Q@òA˜C,EºF;HªIKGLoMkNDOâOHPiPü?¢AFCÜDkFõG]IÈJL8M;NOÄO7PgPHPÓOO¿MLçIBGDg@:<7u2ú,%'!ÜŽH%mü÷òí~éÞå¹âàÇÝïÛ~Ú_Ù›ØØÜ×Ý× ØpØöؤÙsÚZÛfÜyݱÞíßEá£âäåçè/êÀëXíçîvð÷ñnóÒô öN÷_ø@ùôùrúªú¡úEú“ù„ø÷>õ óeðeí ê^æpâOÞÚÀÕŠÑg͉ÉðÅ»Âñ¿¤½Ø»”ºÒ¹—¹Ó¹Šº£»#½î¾ÁVÃØÅÈMË&ÎÑÔ×ÚÝàãöåÞè¸ëŒîNñ ô·öZùïûyþöhÍ,t Ä ò.MoƒŽ”…v![#@%'ñ(Ê*’,b.&0ë1¬3j5&7ß8–:J<ù=©?MAöB‰D"F GI}JÊKþLNñN¦O#P`PRPîO-O NiLaJÈGÀD$A=~83.R(I"Ë…N NˆýøórîCêæRãŠà5ÞGÜÄÚ’ÙÁØ.Øç×ÛרZØÜØÙIÚ0Û+ÜGÝpÞ°ßá^âÍãBåÉæLèáéqëíšî%ð¬ñ"óŽôÜõ÷(øùÒùYú¢ú¤úXú¸ù½ø`÷ õyóíðþí´êç5ãßâÚ™ÖWÒ4ÎBÊ¡ÆPÃwÀ¾*¼Ëºð¹œ¹Á¹`ºj»Ò¼“¾šÀÞÂ]ÅúÇÀʚͅÐÓ}Ö~Ù‚ÜzßyâaåPè)ëÿíÅð…ó0öÙøoûúý}ìY³ K Œ¹è(/.$!ü"ä$¼&š(k*;,.Ï/’1T35Ï6‰8@:õ;¦=S?ÿ@žB?DÎEYGÑH9JŠKÁLÕMÆN‚OPTPXPPWOFNÃLÉJVHZEåAæ=l9€4%/v)|#Q ¾† wªþ&ù ôQïëDçîãá£Þ¦Ü ÛÌÙæØJØó×Ü×ù×FØÅØ\Ù%ÚÛúÛÝ4Þsß½àâ…ãùäxæèé$ëµìHîÚï]ñÙòEô›õ×öò÷çø®ù@ú”ú¥úhúÜùìø«÷öõêónñ”îYëÍçùãè߸Ûj×)ÓÏÿÊSÇìÃÁ~¾¼»º¤¹´¹;º0»‰¼5¾3ÀlÂßÄvÇ7Ê ÍöÏëÒéÕêØëÛèÞåáÐäÂç™êví<ðüò®õUøðú|ývàA“ Ý P{š¶ÂÍÊIJ ¡"ƒ$d&;(*à+®-u/<1ü2½4x648é9 ;O=?¦@QBêCE G†HôIIK‚L¤M”NcOòOKP[PP}ONM4KÕHúE•B¸>R:}580—*®$†Jõ ¡Ëÿ5úõ9ðâëýçäáßÝVÛ ÚÙeØØÞ×ñ×9Ø¥ØCÙøÙØÚÈÛ×ÜüÝ2ß}àÔá=ã¯ä/æ´ç?éÖêdìúí‰ïñ“òùóYõ™öº÷¹ø„ù'ú‚ú¦útúùùùì÷NöUôìñ$ïìè»ä´à†ÜAØûÓÊÏÅËȒĉÁô¾Ü¼J»<º²¹¬¹ºûºB¼à½Ì¿ýÁaÄöÆ«ÉÌcÏXÒUÕSØXÛSÞRá?ä1ç êèì´ïrò+õÏ÷qúýü…ÿýgÌ m ¬ ã/PZkebT ?"($&â'³)Š+Q- /à0¨2b4&6×7˜9H;ý<«>V@üAšC2E¾F=H­IKILgMmN5OÝO9P[P+PŸO¹N\M›KPIFJCz?>;o6L1µ+Ù%Àƒ4ù ÒîKûö&ñ¶ì»è9å*â•ßiݨÛHÚ=Ù…ØØã×í×*ØŽØ$ÙÖ٧ڜ۠ÜÁÝöÞ:à’áõâeääådç÷èêì¨í<ïÁðDò´óõ[ö€÷‡ø_ùúsúúƒúúMù*ø ö»ôeò·ï™ì7éqå‚áUÝÙÎԘЈ̹È4ÅÂg¿B½»jºÇ¹¦¹ÿ¹Ëºþ»ˆ½n¿‰ÁíÃqÆ&ÉïËÖÎÄÑÀÔÀ×Âڿݾà¯ãžæ‚éYì)ïìñ£ôN÷îù~ü ÿ€ôP°ø ? t£Çæõñâ!È#¨%†'Y)-+ú,Â.Ž0I24Ì5ƒ7A9ò:¨@¦ALCàDqFòGbIÇJL7M2NO¹O.PTP9P¾OëN¨MøKÉI"GóCD@±?RAýBD'F¢GI}JÉKùLNêNœOPRPAPÜOOðMOL@J¬GšDAí<]8V3î-+(*"÷±j: ={ýø ólîFê”æUã˜à9ÞXÜÌÚ¥ÙËØ?Ø÷׿רeØëØŽÙWÚ:Û;ÜOÝ}Þ¹ß áiâÓãLåÎæUèåéuë í™î*ð©ñ#ó‡ôÙõ ÷ øùÄùIúŒúŽú>úšùžø=÷{õSóÃðÔíŠêìæ ãôÞ¼ÚvÖ8ÒÎ-ÊŒÆGÃnÀ ¾-¼Ñºþ¹¨¹Ö¹uº€»ë¼¬¾´ÀýÂsÅÈØÊ¶ÍžÐšÓ”Ö™Ù•Ü–ßŠâ{åcè=ëîÙð•óFöçø‚û þ‹eÅ [ šËò)6?74! #ë$Ì&£(u*I,.Ü/š1`35Ú6‘8I:þ;«=]?A¨B@DÔE[GÒH9JŠK½LÒM½N|OPJPFPóODO,N¨L®J3H>E¿AÂ=H9Z4/Q)]#/ð¤o h—þ!ùôRïëIçóãá°Þ¯ÜÛÛÙòØ[Øþ×îר[ØËØqÙ-ÚÛÜÝ>Þ~ßÄà&â‹ãåƒæèšé$ë»ìMî×ï`ñ×òBô•õÏöê÷Ùø£ù,úƒúŽúPú½ùÒøƒ÷Ùõ½óJñiî0ë¤çÌãÃßÛJ× ÓâÎëÊ<ÇãÃ÷Ày¾†¼ » º³¹Ä¹SºD»£¼O¾MÀŠÂõÄ•ÇPÊ$ÍÐÓÖÙÜþÞûáçäÕç±ê‡íOðó¼õjøþúý„ñO¢ î (`‡«ÁÓÖÚΠ«"$m&J(*ï+¶-/E13È46?8ñ9¨;Y=?¯@VBíCˆE GŠHóIGKƒL›M“NUOíO;PNPPjOjN÷LK´HÚEvB‘>1:U50t*‰$j'⦠”¹ÿ.úÿô5ðäëýç™ä£á$ßÝcÛÚÙvØØëרBظØMÙ ÚßÚÙÛÞÜ Þ6ßà×áJã¶ä6æ»çFéØêjìúíŽï ñ’òöóTõ‘ö³÷«ø{ùúrúŽú]úÝùùÊ÷+ö/ôÂñÿîÑëXèŽäà`ÜØÚӮϬËïǃÄÁï¾ß¼N»FºÃ¹¹¹2º»[¼ø½è¿Â}ÄÇÇɘÌÏpÒlÕpØjÛpÞbáYäCç%êùìÈï„ò>õâ÷€úý”ÿ {Ø2 x ½ ï>\iuvlb J"3$&í'¿)“+_-&/ï0®2m4-6â7Ÿ9R;=³>[@B C7EÀF?H®IKJLaMfN/OÑO.PNPPO¡NEM}K4IpF$C^?;R6"1’+¹%ŸdÜ ÄÛ?ûö ñ·ì¼è=å3âßvݲÛWÚHÙ—ØØö×÷×;Ø›Ø3ÙßÙ¹Ú£Û°ÜÌÝßEàšáÿâläìåiçýèƒêìªí=ïÃðBò³ó õUöw÷}øPùøù_úŠúiú÷ù1ùøƒö‘ô@òŒïrìéPåPá5ÝíØ­ÔzÐoÌ£È&ÅÂf¿>½•»oº×¹²¹ºÞº¼¥½¿«ÁÄ’Æ=ÉÌìÎáÑ×ÔÚ×ÙÚÙÝÐàÈã´æ“érì9ïò¶ô`÷þù“üÿ’aÀ O ³Öñ   ì!Õ#²%“'b)<+-Ñ.”0W24Ò5‘7F9ý:­<`>@±ANCçDrF÷GbIÄJL/M1N O²O!PHP'P«OÖNMÞKªIGÐC#@î;I7(2³,Þ&Õ  VñUü÷òí}éèåÇâàÞÝÜ–Ú|Ù´Ø7Øù×ù×)ØŠØÙÀÙŠÚxÛwÜ–ÝÂÞàXá·â&äŸå ç¬è7êËë^ííîvð÷ñhóËôö?÷Kø&ùÙùKú„úqúúYùEøÐö÷ô·òðí¸éæâýÝÃÙÕEÑ8ÍXÉÑÅ¡Â翽㻟ºí¹µ¹ù¹³ºÕ»Q½$¿9ÁŒÃÆ·ÈË]ÎMÑDÔE×CÚEÝ?à3ã$æéåë°îwñ/ôÛöùüžþŠíI– Ý Fl‹ª¯¨¡Œ!t#Z%0')Ú*¬,w.:02¾3567ó8§:X< >²?^AýB•D&FªGIJÇKõLNãN“O PEP/PÉOOÓM9L JGyDà@É<8813È- ("Ø”N' 'ný øókîFê”æ`ãšàIÞ_ÜÛÚ°ÙÙØNØØø×ØxØöØœÙdÚFÛGÜ[݇ÞÅßáoâáãO娿Zèêé}ë í î&ð«ñ!óƒôÔõ÷øüø¶ù6ú{úuú'ú|ù€ø÷Wõ+ó›ðªí^êÁæââÌÞ•ÚTÖÒþÍÊwÆ=ÃcÀ¾-¼Úºº¹¹å¹‹º”»½Â¾ÒÀÓÅ0È÷ÊÏͺгӮְٰܪߣâåyèRë)îìðªóWöüø’ûþž{Ñ' j ©Ú 8EIJ;1!#ù$Ù&¬(‡*O,.ä/§1k3%5ã6›8Q:<µ=a?A­BED×E_GÒH;J‡KºLÎM·NsOøO9Pîëxç¤ã˜ßfÛ&×èÒÅÎÒÊ*ÇÒÃðÀu¾†¼»(ºÃ¹Ô¹gºZ»½¼f¾lÀžÂÅ«ÇmÊ?Í)Ð!ÓÖÙÜßâþäêçÅêícð!óÖõuøûý"˜ÿa° ý 7o•ºÍáãéÙÑ ´"ž$z&S((*ö+Ä-Š/R13Ñ4‹6D8ý9¯;_=?³@]BòCE GHñIHK€L—MNNOàO1P:PøOTOQNâL÷JšH¶ESBo>:55í/Q*g$H Ñ }¬ÿ úøô0ðáëèœä«á-ßÝqÛ!Ú-Ù€Ø!ØúרTØÂØ]ÙÚîÚãÛíÜÞFß“àäáQã¾ä>æ¿çNéÛêoìî‰ïñ‰òùóNõŠöª÷ŸøoùúaúwúEúÂùâø¨÷ öôœñÓî¨ë,èfäbà:Üö×¼ÓϘËÔÇzÄrÁî¾Ü¼U»MºÒ¹È¹Fº%»t¼¾À/˜Ä,Çáɳ̘ό҆Շ؄ۅÞ|áoäWç9êíÚïšòOõõ÷“ú ý§ÿŠé@ ‰ Ë ÿ,Ogz€‚|l Y"?$&ù'Ì)ž+h-6/ò0¾2t476ï7¤9^;=À>\@ B C?E¿FFH©I K@LdM\N,OÃO'P9P PuO‹N-M`KIOFC8?î:*6ý0o+“%~FÆ ¬Í1û÷õñ´ì¿è@å<â£ßݾÛbÚYÙ¡Ø1ØØØHØ©Ø@ÙîÙÅÚ±Û¹ÜÙÝ ßOà¥áãyäðåsçé‹ê"ì®í=ïÆð?ò²ó õNöo÷søBùêùNútúQúÜùùè÷]önôò_ïLìÚè%å*á ÝÌØ‡Ô`ÐRÌÈÅÂe¿:½š»zºß¹Ç¹&ºõº.¼»½Ÿ¿ÁÁ!ĨÆ]É#Ì Ï÷ÑõÔð×ñÚïÝëàÛãÊæ©é…ìOïòÉôs÷ú¤ü'ÿ¦wÉ Z •¾æÿ ü!Ý#Ä%™'u)@+-Ú.ž0b2"4Ü5›7N9;¹@²AVCêDwFöGhIÀJL+M,NO©OPÁ?_ACšD)F­GI}JÇKòLûMÜN‰OP2P$P²OîN½MLJnGUDÁ@¡<83¨-á'æ!»t: býþ÷ûòlîAêæcã¡àUÞhÜéÚ¾ÙæØ\ØØØ,Ø…ØÙ©ÙqÚTÛQÜiÝÞÐßá{âæã[åÝæaèñé€ëí¢î'ð­ñó„ôÊõ÷øóø§ù#úgú]ú ú`ùaøõö4õótðí3ê—æ·â¤ÞpÚ0Ö÷ÑâÍþÉhÆ/Ã^À ¾2¼ßººÇ¹ú¹žº­»½Þ¾ëÀ1ìÅOÈËëÍÔÐËÓÉÖÇÙÈÜÁß¹â¦åŽèië:îñ¼óiöùŸû4þª#†ä6 z ·è/FQXUJ:!$#%å&¹(*\,).î/±1t315ë6¥8X:<¼=j?A³BIDÞE\GÚH7JˆK¹LÇM´NgOîO-P+PËOOüMtLrJ÷G÷D|Aw=þ84¶. )#ñ³oF =~þùôóJïëMçä'áÅÞÄÜ1ÛöÙÙvØØØ$ØsØéØŠÙHÚ(ÛÜ2ÝUÞ”ßÙà9âœã呿è¢é1ëÀìSîÚï_ñÕò;ôŒõÁöÖ÷ÄøƒùúWúeúú†ù’øB÷Œõtó÷ðîÙêQçtãvß=Û×ÈҨνÊÇÊÃáÀz¾ƒ¼»2ºÒ¹ç¹zºt»Ñ¼„¾ƒÀ¼Â1ÅÈLjÊZÍGÐ5Ó6Ö2Ù3Ü/ß'âåèÙê±íwð5óæõŒø#û±ý3¥oÀ D¡ÉÚîòôçÝ Á"«$„&`(2*,Ë-™/X13Ù4”6O8:º;f=?¼@_BüC‹EGŠH÷IDKL’M‡NEOÙO P0PàOEO6NÉLÜJyH•E1BG>è9 5Ì/+*F$'îªy k›ÿúïô.ðÞëè¡ä±á8ß$Ý}Û0Ú8Ù“Ø+Ø ØØfØÎØlÙ ÚþÚìÛýÜÞUߘàôáUãÊäBæÊçRéâêsìîŒïñˆòöóIõƒö£÷“øaùòùLúcú+ú§ùÄø†÷åõßówñ¦îëÿç:ä<àÜ××–ÓtÏ{ËÄÇhÄjÁë¾Û¼]»Uºà¹Ú¹[º;»‹¼+¾ÀM³ÄGÇþÉÌ̶ϢҢ՞؟ۚޓá…äoçLê'íëï°ò`õø¥ú1ý¹ÿ+÷Q ˜ Ú ;[yƒ’Œ‹w h"G$,&(Ù)©+t-=/1Ã2ƒ4=6ù7­9g;=Å>h@ B«C>EÅFGH©IK?L_MWN#OºOP,PøOdOrNMBK÷H.FßB?Å:6Ö0J+p%_%èª ·+ûéõñ±ì¿èIå>â°ß‰ÝËÛqÚcÙ³Ø<ØØØSØ»ØLÙýÙÑÚ½ÛÆÜäÝßZà­áã€ä÷å~çé–ê ìµí?ïÄðAò­óõJöe÷iø5ùÚù9úbú6úÃùóøÆ÷:öGôòñ6ï!ì­èþäûàçÜ ØmÔ;Ð?ÌvÈ ÅøÁ_¿=½»…ºì¹Ø¹8º»A¼Ú½µ¿àÁ8ÄÆÆtÉCÌ#ÏÒ Õ Ø ÛÞáïãâæ½é˜ìeï#òßô÷&ú³ü<ÿ²#ƒÝ( j  Ðò++' "í#Ì%¨'|)O+-ä.«0j2.4å5¤7X9 ;À@ºAZCíD}FöGjIÀJL&M(NüN¡OP+PP‚O¨N^M£KrI¿FCÛ?¤;ü6ß1h,š& bå ÊÞ<üîöòŠí€éðåÔâ(àôÝܲڕÙÒØRØØØGØ¥Ø/ÙÙÙ¦Ú‘ÛܱÝÒÞàháÍâ4ä±å+ç»èBêÔëfííî|ðóñeóÄôö2÷4øù·ù*úXúCúÛùùø‰ö­ôeòÆï·ìcé°åÉá¯ÝuÙ=ÕÑÍ,É®Å‹ÂØ¿Ÿ½ç»³ºº×¹ºàº¼†½W¿rÁÁÃHÆìȹ˒΂ÑyÔu×vÚsÝlàcãKæ5é ìÛîžñUô÷ ù7ü¾þ:ªg· ú 4bŠ¥ºÇÆÆ¸§!#m%O')ö*Â,‹.T02Õ35M79¸:j<>Å?fA CœD0F¬G!I~JÇKíL÷MÕN€OúO$PP¡OØN¢MLâIPG2Dš@<ê7è2{-Â'À!šW÷Qýó÷öòeîFêœæjã«à\ÞwÜôÚËÙõØjØ!ØØ;Ø’ØÙ·Ù}ÚaÛ^ÜtÝ›ÞÜß&áˆâìãeåäæhèùé‚ëí¢î,ð¨ñó{ôÊõôöøãøšùúRúHúñùEù>ø×ö õÝòIðVí êjæâyÞKÚ ÖÙÑÃÍêÉTÆ#ÃWÀ¾5¼çºº×¹ º³ºÆ»5½ú¾ÁNÃÇÅiÈ-ËÎñÐåÓáÖãÙÜÜÝßÌâÀå¡èëNîñÎóö ùµûAþ¾2˜óE ‰ Çö!;T_fbXG!/#%í&É(˜*j,1.û/»1395õ6®8a:<Ã=q?A¸BODàEbGÙH9J‡KµLÅM¨NeOÝO%PP¾OOçMULYJÓGØDTAS=Ù8ç3“.ä(ô"ΗR. ,mþûøîóCïëNçä1áÉÞÔÜ;ÛÚÙ‚Ø-ØØ0؃ØõؘÙUÚ3Û/Ü:ÝdÞ›ßæà@â¨ãåšæè©é5ëÆìUîÜï^ñÔò7ôˆõ¹öÐ÷¶øxùüùHúJúúhùtø!÷fõNóÍðëí±ê!çQãCßÛÙÖ©ÒŠÎ¥ÊÇ½ÃØÀu¾„¼%»:ºã¹÷¹ºŠ»ê¼Ÿ¾œÀÛÂJÅèÇŸÊzÍ]ÐSÓPÖJÙNÜDß?â-åèòêÂíðJó÷õ ø6ûÃýD¸"€Ñ  VŒ³Õëüþôê Ï"¶$’&k(@* ,Û- /e1&3å4ž6W8:¾;s=?Ä@fBþC”EG“HñIIKxL’M}NAOÉOPPÑO,O"N¬L½J\HrE B&>½9ç4¥/*"$Í‘^ Yˆÿ úæô(ðßëè¦ä¹á>ß3݆Û>ÚGÙŸØ<ØØ*ØrØÞØyÙ-Ú ÛùÛÝ(Þ\ߨàøádãÍäOæÌç\éæêuìîïñ‰òðóGõ|ö™÷ŠøPùæù5úPúúŠù§øc÷ÁõºóJñîRëÕçäàêÛ¯×uÓVÏb˱ÇYÄ`Áæ¾Þ¼`»cºé¹ð¹jºV»¡¼E¾7ÀiÂÏÄdÇÊëÌÍÏÁҹչض۴ުá›ä…çaê;íÿïÅòqõøµúEýÈÿ?ª _ ¨ ê Kkƒ•›ž”ˆ p"Z$3&(á)¶+-I/ 1Í24G68¶9j;=È>o@B­CBEÍFBH²IK@L[MONO¯O PPãOQO[NùL'KØH FÀBí>¤:à5±0'+M%< È— „­ûåõñ³ìÀèKåGâ·ß”ÝØÛzÚsÙ¿ØLØØ&ØaØÉØYÙÚàÚÊÛÐÜñÝßeà¸áãŠäÿå„ç éšê&ìµíCïÃðAò©óõBö^÷\ø+ùÇù*úHú!ú¦ùÕø¦÷ö"ôÈñïôë‡èÍäÚà¸Ü‚ØFÔ!Ð"ÌfÈõÄóÁU¿?½Ÿ»ºù¹ç¹Nº!»[¼ò½Ñ¿ûÁSÄãÆÉ_Ì=Ï-Ò&Õ%Ø Û!Þá äôæÔé®ìvï;òíô™÷5úÇüJÿÇ0—ë7 { ®àÿ,;66% "ö#Ü%±'‹)Z+&-ð.´0w254ò5«7a9;Ç@ÁA_CóD~FüGiIÃJL&M N÷N”OþOPòOtONHM‡KRI FjC¶?€;Ö6¼1@,y&l DÎ °Ð,üäöò‚í‡éïåÛâ3àúÝ,ܻڤÙàØaØ$Ø%ØQØ·Ø6ÙíÙ­ÚŸÛœÜµÝæÞ"àuáÓâ?ä¶å6ç½èIêØëgíòî{ðóñeó¼ôö&÷,øù«ùúEú+ú¾ùùâ÷iö†ôAò™ï’ì4é‹åžá‰ÝQÙÕéÐèÌÉÅÂÑ¿Ÿ½ê»»ººã¹4ºòº¼œ½r¿ŠÁÞÃcÆÉÒˮΚѓÔ׌ÚÝ‚àyãcæEé ìíî²ñgô÷³ùGüÐþH¼xÇ  Dq—µÅÕÕÑDZ!œ#z%Y',)+Ë,˜.Z0!2Ý3›5U7 9À:r< >É?pA C£D2F±G I€JÂKîLïMÏNwOêOPýO’O¾NMåKÇI.GDw@Z<È7¿2\-›'£!y?åñGýè÷ñòbîFêŸæsã®àmÞ|ÜÛØÙÙ}Ø+Ø$ØIØ¡ØÙÆÙŠÚkÛnÜ{Ý«Þãß2áâõãnåèæpèýé‡ëí¥î*ð­ñó}ô¿õñöô÷Üø‰ùú?ú-úÛù%ù!ø²öçô·ò ð-íÝéCæcâTÞ#ÚçռѧÍÔÉEÆÃTÀ¾<¼ìº-ºã¹ ºÆºß»K½¿ÁiÃãņÈDË!ÎÑÔûÖøÙøÜñßæâÓå·è”ëdî'ñäóŽö3ùÉûQþÐAªX – Õ,LamroeT!<#%ú&Ô(£*v,9. 0Á1‹3B5þ6¸8i:<Ì=v?A»BTDãEfGÙH;J‚K¶L¼M¦NXOÖOPP§OñNÊM?L7J¶G¶D1A0=³8Ã3n.Â(Ò"¯z: \þôøãóCïëRç ä8áÕÞÜÜJÛ Ú.ÙØ?Ø!ØAØØÙ¥ÙbÚBÛ4ÜMÝhÞªßîàIâ±ã!åžæ#è«é=ëÆìXîÝï^ñÒò5ôõ¶öÀ÷±ødùîù2ú5úêùNùPø÷@õ*ó¡ðÄí„êùæ'ãßõÚ¹Ö†ÒsΊÊòƬÃÓÀp¾‰¼'»Iºî¹ º¥ºž»½µ¾¸ÀõÂfÅȽʑÍyÐlÓgÖeÙcÜ_ßQâFå%è ëÕí¢ðZó ö°øHûÕýSÈ4ã ) cž¼ç÷ õ Ü"Â$Ÿ&v(M*,å-¬/o103í4©6^8:È;x=#?Ê@jBD“EG‘HöIDKyL‰M}N1OÆOPP½OO N’L¡J=HNEìAþ=š9Á4/â)þ#ç®yC JtÿúÛô'ðÚë è¨äÃáGß<Ý”ÛIÚUÙ«ØMØ#Ø;ØØë؉Ù8ÚÛÜÝ2Þjß­àâgãÛäQæØç]éïêwì îïñ‰òíóAõvö÷~øDùÒù'ú5úüùmù…øE÷œõ”ó%ñSî+ëªçæãæßÃÛŒ×SÓ:ÏHË ÇHÄZÁß¾á¼f»lºù¹ÿ¹€ºk»¸¼`¾PÀ„ÂêÄÇ3ÊÍéÏØÒÖÕÎØÒÛÈÞÁá²äšçxêMíð×ò…õ0øÆúWýÙÿO½o ¹ ö -Xx“¡«©£“ €"b$B&(ð)Á+Š-S/1×2—4Q6 8¿9u; =Ò>u@B³CHEÍFJH­IK:LYMKNO¨OþOPÒO>O@NæLK¾HèEBÊ>~:¹5Œ0+(%ê¬~ o™ ûÛõ ñ­ìÄèLåQâ¼ß¡ÝàÛ‰ÚÙÉØ^Ø'Ø8ØlØØØeÙÚéÚ×ÛÞÜøÝ-ßlàÃá ã’äæ‹çéê,ì·íEïÅð?ò©óüô=öU÷Søù¹ùú6úúŽùµø‡÷òõûó¤ñâîÎëYè¦ä®à”ÜXØ*ÔþÏ ÌOÈêÄäÁU¿9½«»’º ºõ¹aº9»r¼ ¾ì¿ÂqÄüƬÉxÌYÏEÒAÕ;Ø:Û7Þ0áä çééÀìïIòõ¦÷Jú×ü\ÿÙ?©÷K … Áë,;FF@4 "$æ%¾'–)f+2-ú.À02C4÷5¸7h9 ;Î<}>"@ÊA`CüD€FýGnI»JLMNïN‹OòOPâO^OyN,MlK4I}FJC?[;²6‘1",M&Q é² ¼üÛöøñ„í‚éöåàâ:àÞ4ÜÉÚ±ÙìØpØ1Ø4Ø_ØÃØGÙõÙÀÚ¨Û¨ÜÄÝìÞ1à|áÞâHä½å?çÂèQêÛëlíõîzðôñaó¹ôþõ÷!øöø™ùú0úú¨ùáøÅ÷Cöbôòrïeì é\åxá_Ý+ÙøÔÊÐÎÌÉÅrÂο½í»Äººô¹Gº»3¼·½Š¿©ÁöÀÆ$ÉíËÈζѫԩץڤݛàãxæ^é4ìïÄñ}ô&÷ÇùXüáþZÍ-‰Õ  S¨À×ÝæÝÕ¾!¨#ˆ%c'9) +Ö,¢.h0&2ì3¢5`79È:|<&>Ô?rAC¨D4F´G"IJÁKêLëMÇNnOàO PîO|O­NoMÎK¦IGîCT@4<£7›24-y'!Z!èÏÞ7ýà÷çòaîEê¢æwã¹àqÞ‹ÜÛâÙÙ€ØCØ*Ø[Ø­Ø,ÙÕÙ“Ú}ÛuÜŠÝ´Þíß>á•âäråóæuèêëí¨î-ð©ñóxô»õèöî÷Ìø|ùðù+úúÀùùøöÆôŒòüïí·éæ>â&ÞÚÂÕÑͽÉ4ÆÃLÀ¾>¼ôº5ºö¹/ºÞºò»g½-¿;Á‚ÃþÅ¡È_Ë=Î!ÑÔ×ÚÝ àüâéåÌè©ëwî;ñ÷ó öHùÕûhþÜT¸d ¨ â;Ym|~}r_!I#+%'á(®*,F.0Ð1’3M5 7½8u:$<Õ={?%AÀBZDçEgGÝH7J†K®L¼MNOOËOPõO›OÔN¹M!LJ˜G“DA =Ž8 3H.¡(¬"“Y$þ Mþèøßó;ïëPçä>áÞÞèÜSÛÚ7ÙŸØHØ2ØMØ›ØÙ¯ÙsÚHÛHÜPÝyÞ±ßøàTâ¶ã,夿+è±é>ëÐìUîãï]ñÐò1ô|õ¬ö»÷¢øXùÝùú!úÐù2ù6øÝö!õózðŸíXêÓæúâøÞÏÚ–ÖiÒSÎxÊÜÆ¢ÃËÀm¾¼,»Wºø¹ º´º¸»½Ð¾ÑÀÀÅÈ×ʫ͔ЃӀÖ}ÙzÜtßlâVå?èëëí´ðnóöÂøYûåýeÙAžò 6 w¥Òî !ë"Ë$¬&(X*#,ñ-´/{193ö4´6e8#:Ë;ƒ='?Ó@nB D–E GH÷IDKsL‹MnN3O²OPýO®OOôMuL‹JH3EÈAÛ=w9ž4Y/Â)Û#É“[3 3jÿöùÓô%ðÙë è®äÇáTßBÝ£ÛSÚbÙ»ØVØ6ØFØŠØýØÙIÚ!ÛÜ Ý=Þsß¹à âtãÞä[æÝçbéóêzì î‘ïñ†òëó;õpöˆ÷qø9ùÀùú úäùRùjø"÷{õmóñ+îëƒç½ãÁßÛk×4ÓÏ2Ë‹Ç?ÄOÁÞ¾á¼k»xºººº‚»Ï¼y¾jÀÂÅšÇKÊ"ÍýÏöÒçÕìØáÛæÞÔáÈä®çŠêbí(ðçò™õ?øÙúfýêÿ^Ë)| È 9f‡Ÿ¯·¶¯¡ ˆ"q$L&((ù)Í+’-a/1ä2Ÿ4[68É9{;,=Ô>@B»CIEÑFHH²IKZ:™5f0á*%þÌ”h [ŽÿúÕõñ­ìÆèRåVâÈß©ÝïÛ”ÚÙØØjØ8ØEØzØçØqÙ&ÚöÚãÛèÜÞ4ßyàÊá*ã™äæçéŸê1ì»íFïÄð>ò¤óúô4öO÷Eøù§ùúúóùnùœøc÷ÒõÔó~ñ»î£ë3èzä‰àlÜ8ØÔåÏóË=ÈÚÄÞÁL¿@½ª» ºººwºH»¼¾À,ÂÄÇÉÉÌrÏbÒUÕWØPÛNÞDá4äçýéÕìŸï`òõ¼÷XúéümÿçO¹ \ ‘ Ðù7JPUL> ." $ô%Ê'Ÿ)r+:-/É0‰2K46¿7q9(;Õ<‚>+@ÌAiCýD‚FHgIÃJüKMNæNƒOäOPÒOIOeNMTKIbF$Cq?9;‹6t1ö+4&, Ìž ‹«üÑö÷ñí…éøåéâAàÞ@ÜÔÚÀÙùØ~Ø@Ø@ØoØÐØUÙÚËÚµÛ´ÜÎÝøÞ8àŠáââSäÂåFçÈèUêßëníöî{ðòñ^ó¸ôóõ÷øêøŠùõùúüù‹ùÇø£÷"ö>ôòñLï=ìãè5åNá:ÝÙ×ԯжÌìÈÅgÂÊ¿›½õ»Êº)ººVº!»D¼Ò½¢¿ÁÁÄ–ÆAÉÌãÎÍÑÅԿ׾ڸݳà¢ã‘ænéHìïÖñŽô;÷ÔùmüîþnØA”æ & `±ÑàïïêáË!³#•%m'G)+ã,­.o052ñ3®5h79Ò:ƒ<->Ú?wAC«D:FµG$I~JÀKåLçMÀNcOØOùOãOfO—N[M­KŽIîFÏC1@<7v2-Y']!=ϾÊ/ýÑ÷èò[îGê©æxãÆàwÞ™ÜÛñÙÙ’ØLØ=ØfغØ;ÙàÙ£Ú‡ÛܕݿÞùßDá¢âäåöæ}èê’ëí«î,ðªñóqô¹õÝöå÷¿ømùßùúú§ùìøâ÷nö ôhòÒïÙìŒéîåâÞØÙ¦Õ{ÑuͦÉ$ÆüÂCÀ¾<¼»>ººAºòº ¼€½E¿TÁŸÃƼÈzËTÎ>Ñ0Ô-×(Ú'Ýàãþåáè½ë‹îMñ ô°öZùéûtþñcÅ(m º ñ!Ld~†Ž‡€k!V#6%'ì(¹*Œ,Q.0Ü1™3X57È8{:0<×=ˆ?%AÊB\DìEjGÜH;J‚K­L·M•NGOÀOúOæO‡O¿N¢MLJuGtDî@æï ëYçäHáçÞôÜ_Û*ÚDÙ­ØVØ@Ø\بØ"Ù½Ù}ÚXÛQÜ^݄޺ßáZâÁã3嬿0è¸éAëÓìXîãï]ñÎò-ôwõ¥ö±÷–øJùËù úúºùùø¹öþôÛòVðpí5ê£æÙâÌÞ¬ÚsÖIÒ<Î_ÊÎÆ“ÃÅÀk¾¼6»]º º.ºÌºÍ»1½ì¾éÀ,ÚÅ6ÈòÊÆÍ¬ÐžÓ™Ö“Ù“Ü‰ß‚âkåUè,ëîÆðó1öÒømûôýxèQ® G ƒ¶Ý$&(!ô"Ú$·&‹(e*+,ý-¾/„1C3ÿ4»6r8%:Ù;…=1?Ö@vB DEG”HöIBKsLƒMmN$O­OðOïOOíNÝM]LlJýGE¥A¸=T9w48/)¼#§{> _ÿéùÐôðÜëèµäÏá[ßRÝ«ÛdÚnÙÈØgØAØVØ˜Ø ÙœÙYÚ*Û"Ü'ÝIÞ~ßÁàâ|ãåägæßçléõê€ìî’ïñ…òçó8õgö}÷iø'ù³ùúúËù7ùJø÷WõGóÖðîÖêZç“ã™ßyÛD×ÓÏËyÇ/ÄIÁÚ¾ã¼r»€ººº©º”»ì¼¾†À¶Â!ųÇiÊ9ÍÐÓÖÙûÛùÞíáÜäÃç¢êqíAðöò¯õNøìúxýúÿoÜ7 Õ Kr—«¿Âź¬ —"{$Y&2(*Ó+£-f/-1ì2©4c68Í9†;0=ß>@&B¼COEÔFKH°IK6LPM=NO“OåOòO¯OON°LÑJ~H¬EVBˆ>4:r5E0¹*ê$Ø´vT H}öúÌõñ®ìÇèWå^âÐß´ÝûÛ ÚœÙèØvØJØOØ‹ØóØÙ3ÚÛðÛóÜÞ?߃àÓá5ãŸäæ—çéªê0ìÁíCïÈð;ò£óóô.öE÷>øù›ùðù úÙùTùøB÷°õ¯óVñ’î{ëèRä`àFÜØåÓÊÏØË+ÈËÄÒÁM¿<½³»¨º"ºº‡ºc»¢¼;¾ ÀH¦Ä2Çàɮ̉Ï}ÒpÕjØlÛaÞ^áIä6çêïì­ïxò#õÏ÷kú÷üÿôe d ¦ Ü,EV__[L 8"$û%Ø'¨)+C-/Ô0•2S46Æ7|9.;Þ<‰>1@ÔAlCEƒFHhIÂJûKMNáNxOØOôO¿O7ONNøL9KöHAFCI?;e6P1Ô+& 賃 z™ üÆöôñ~íˆéþåíâLàÞMÜáÚÌÙÙ‹ØPØNØ|ØßØaÙÚØÚÀÛÁÜØÝß@à“áìâZäÌåKçÏèXêèëlíþîuðöñXó´ôîõ÷ øÜø}ùáùúãùrù¨ø†÷þõôÎñïì³èå%áÝèØ¯Ô™Ð“ÌâÈiÅcÂÀ¿½ø»Óº7ººlº4»^¼ê½½¿ÜÁ-IJÆ[É ÌþÎéÑÜÔÚ×ÕÚÐÝÊà¸ã¦æƒé^ì(ïêñ¤ôG÷ìùzüÿ|ëN¦ó 6 nÁÝðùÿõïÖ!À#Ÿ%y'Q) +ï,·.{0=2û3¸5p7&9Ù:‰<5>à?€AC²D9FºG#I~J¼KåLÞM¼NYOÉOñOËOZO|NEM’KqIÏF­C@ï;X7V2ì,6'>! é½£ÁýÍ÷Þò]îFê®æ€ãÍàƒÞ¥Ü$ÛÚ+Ù£ØYØKØtØÈØJÙêÙ²ÚÛÜ¡ÝÈÞàLá¬âä†åüæ…èê™ë í¬î-ð©ñóoô°õØöÚ÷³ø^ùÎùúîù‡ùÕø¾÷OöyôDò©ï±ìbéÅåìáÜÝ·ÙÕ_Ñ]ÍŽÉÆïÂ@Àþ½C¼»MººSº»!¼–½a¿nÁ¹Ã3ÆÕÈ–ËmÎYÑIÔG×?Ú>Ý5à(ãæ÷èÏë îbñôÈögùûû‡þÿsØ1ƒ Ä 0Vx†–š”x!a#B%'ô(È*”,^.#0ä1¤3b57Ï8…:4<ã=Š?/AËBcDîEkGáH5J„K§L±MNLSJÙGôD~A™=*9U4/z)›#…^& MÿÞùÇôðÚëèºäÖáeß[ݸÛrÚzÙÙØqØRØbبØÙªÙeÚ8Û,Ü4ÝUÞ†ßÏàâ…ãïälææçséöê‰ì î˜ïñ‡òâó3õaös÷`øù¤ùìùõù²ùù-øâö2õ#ó°ðÙí°ê.çkãrßQÛ"×÷ÒçÎËhÇ ÄAÁÖ¾ä¼x»‹º"º2º¼º©»½£¾¦ÀÌÂ?ÅÌÇ„ÊTÍ5Ð%ÓÖÙÜßâôäØç¶ê‰íNðó¼õdøýúˆý €éKš æ #W¥¹ËÑÏʶ ¦"„$h&<(*â+ª-s/61õ2´4l6&8Ù9Œ;9=å>‰@*BÃCPEÙFIHµIýJ6LKM6NþN‡OØOåOœOOÿM”L¶J_HŠE6B^>:I5#0—*Á$¿‘^< 3pèúÆõýð­ìÈè]åcâÙß¾ÝܬڬÙò؆ØWØ]ØšØþØŽÙ>ÚÛúÛÝÞKߎàÚá@ã¥ä æœç#é«ê7ìÂíEïÊð8ò¡óîô'ö<÷4øñøùÛùøù¾ù<ù[ø'÷ˆõŽó-ñkîPëßç*ä8àÜô×ÂӱϾËȼÄÌÁE¿A½´»¶º+º-º˜ºy»º¼T¾9Àd¿ÄNÇýÉÄ̪ÏÒ‹Õ†ØÛ}Þpá`äKç&êÿìÅï‡ò9õà÷{ú ýŽÿ qÔ( u ³ ì<PfkndZ C")$ &à'¸)…+S-/Þ0 2Z46Ë7‰91;é<Œ>;@ÕAuCE‹FHkI¿JúKMNÔNpOÍOâO²OO:NàLKÛHFãB)?î:E6'1´+ë%ïǘm bŽùûÃöéñí‡éæôâSà&ÞVÜðÚÙÙÙœØZØ^Ø‹ØêØqÙÚäÚÎÛËÜãÝßLà›á÷âbäÓåTçÒè`êèësíûîzðòñXó®ôèõ÷øÐølùÎùóùÌùVùŒød÷Üõôó¦ñ÷îïë‹èääýàëÜÂØ“ÔvÐÌÈÈ^ÅW½¿›½þ»ÜºCº$º~ºH»w¼¾Ø¿öÁHÄÍÆvÉ9ÌÏÒ÷Ôñ×îÚæÝààÑã¶æŸékìCïøñ¸ôY÷ÿùˆüÿ‡[· B §Óèÿ ùã!Î#¨%ˆ'Y).+÷,Ä.‚0J24Å5u739Ý:“<<>æ?„A#CµDA@6&! #ò$Ì&¥(x*D,.Ö/—1X35Ï68::å;–=??à@ƒBD¥E&G•HøI>KmL{M]NO”O×OÍOyOÂN°M&L4J¾GÒD_Aq= 9-4ð.U)w#l:í ûAÿÏùÅôðÝëè¼äâáißlÝ¿ÛÚ‡ÙæØ‚Ø_ØqضØ#ÙºÙnÚHÛ6ÜAÝ^Þ“ßÕà+â‹ãùäqæïçuéë…ìî’ïñòâó,õZöl÷OøùŒùàùØùœùýøø¿öõûò‰ð°í…êçAãKß)Û×ÕÒËÎìÊUÇÄ<Áоè¼|»—º.ºFºÎºÂ»½Ä¾¸ÀîÂVÅçÇ¢ÊkÍSÐ<Ó8Ö1Ù.Ü%ßâåñçÈêžícð óÒõtøû™ýúZª ÷ 0f’®Ê×ßÝÕÅ ±"$u&E( *ë+¶-}/@13½4x6-8â9“;A=ë>‘@.BÇCVEÚFMHµIýJ5LFM1NöN{OÎOÓOŒOìNçM{L›J?HkEB>>í9&5ý/p*¥$™vB$ !]ÞúºõûðªìËè_ålâàßËÝܻڶÙÙ‘ØhØgØ«Ø Ù›ÙNÚÛ Ü Ý*ÞSß™àäáIã¯ä'æ£ç(é±ê<ìÃíJïÅð;òšóîôö7÷$øéøwùÎùÞù©ùùAø÷iõeóñCî#ëºçûãàùÛÍפӑϧËÈ®ÄÀÁC¿>½¼»½º;º;º­º»Ñ¼n¾SÀ}ÂÝÄfÇÊàÌÁϫҥ՛ØÛÞŠávä`ç<êíÛï—òOõñ÷Žúýœÿä; € Æ ö(Edp{ztf P"7$&ð'À)•+Z-(/å0«2e4"6Ø7Œ9@;í<˜>>@ÞAxCEŽFHmI¿J÷KMNÑNbOÃOÑO¡O O"NÈLýJ¾HüEÃB?Ê:61+É%Ê­xV Mwóû±öëñwí‹éæýâYà2Þ_ÜýÚæÙ"Ù¨ØkØiØšØøØ}Ù*ÚðÚÚÛ×ÜïÝßUà¦áÿâjäÚå[çÛècêïëqíïtðøñPó®ôàõ÷÷÷Âø_ù»ùáù±ù?ùløF÷¹õÑózñÖî¿ëgè·äÖàÅÜžØoÔZÐe̵ÈMÅK·¿›½ÿ»çºLº6ºº_»¼¾ó¿ ÂfÄçÆÉYÌ-Ï!Ò ÕØÛÞöàæãÎæ²éìSïòÃôu÷ú¡ü#ÿ oÄ S ·áö ð!Ù#³%—'a)>+-Ì.‘0O24Ç5…759ì:™ì?ŒA)C·DEF¹G*I{J¼KÚLØMªNJO¯OÕO¬O/OTNM]K6IFlCÆ?¦;72¦,î&ý ß²ŠxŸýü¼÷ÎòYîFê´æŠãÞà“Þ»Ü<ÛÚFÙ¿ØqØmØŠØèØ`ÙÚÉڬۢܺÝÚÞà`á¼â ä”å çèêë,í¬î3ð¥ñóhô¢õÎöÀ÷Ÿø>ù­ùÙù¾ùUù›ø÷ ö0ôøñWïaìéså™áÝkÙAÕ!Ñ)ÍfÉðÅÞÂ.Àþ½G¼»cº3ºxº0»O¼È½’¿¤ÁíÃiÆ ÉÈ˧·рÔt×sÚlÝbàWã=æ#é÷ëÈî‰ñ@ôëöùü¬þ ”øRŸ å Mv¦¯µ¯¥’!x#[%5' )Ý*«,r.:0÷1»3q5/7à8–:D<ó=–?=AÔBmDõEsGÝH?JxK¨L¤MƒN-OŸOÐO·OMOƒNUM¹K¦IGDƒ@}<ú7 3·-(*"뻩 ¾þ¹øÆó0ï ëbç#ä_áßÝ‚ÛQÚlÙÖØØi؆ØÓØIÙæÙ¢Ú~Ût܂ݣÞÜßázâÙãLå¿æFèÆéSëÙìcîãï^ñÉò#ôfõö•÷qø#ù“ù×ù¿ùrù½ø¼÷XöôjòÞïöì¶é)æ[âWÞ<Ú ÖðÑçÍ Ê•ÆpíÀc¾—¼I»º8ºbº »¼{½7¿9Á{ÃëŇÈCËÎûÐêÓãÖÞÙÛÜÍßÈâªå–èië?îþð¼ógö ù¡û)þ©„Û0 s °á '@IRKD2!#ý$Ú&°(…*O,.à/¡1b35×68@:ï;ž=D?ë@„BD¨E'G›HõI@KjLvMYN OŠOÉOÀOfO¯N•MLJ G¯D=AL=æ84Ê.2)T#JöÖ ç/ÿÅù¸ôðÖëèÀäåáußoÝÏÛˆÚ˜ÙðØ’Øi؂ؿØ3ÙÆÙ{ÚUÛ@ÜOÝhÞßáà3â–ãåwæøç{éëŽìî™ïñòÞó'õVöb÷Føù}ùÌùÄù…ùàøò÷ŸöëôØò`ð‰í\êÜæã#ßÛßÖ´Ò²ÎÒÊEÇÄ3Á;缅»º@ºUºáºÛ»-½à¾ÑÀ ÃqÅȻʅÍnÐUÓRÖHÙGÜ<ß3âåèßê±íwð6óáõ‰ø û«ý/Ÿ i»  ?wœÁÔçêìßÕ º" $}&T()*÷+À-Š/G13Â4…638î9™;J=ñ>™@2BÐCUEâFJH¶IþJ/LDM+NëNvO¾OÆOyOØNÑMbL}J#HHEñA>Ê95Ö/Q*{$S* OÏú³õõð©ìÊèfåmâíßÑÝÜÆÚÃÙÙŸØsØyصØÙ¨ÙWÚ)ÛÜÝ/ÞcßžàòáLã¼ä,æ¬ç.éµê@ìÆíLïÆð9òšóåôö*÷øØøkù¸ùÍùùùøæöAõEóÛðîùêŽçÕãéßÒ۬׃ÓuÏËñǞĺÁ<¿A½Â»ÃºKºKºÀº§»å¼Š¾kÀ˜ÂøÄÇ4ÊúÌÜÏÆÒ¼Õ·Ø¯Û¬ÞáäsçSê$íîï¬ò`õø¢ú+ý³ÿ'“ôG “ Ð 0Xmˆ‡r ["D$&ü'Ì)+i-./ô0³2o4+6à7—9D;ù<š>H@âA}C EFHnI¾JôKMÿMÈN[O²OÈOŒOúN N¯LâJ¡HÜE Bà>¨:ù5ß0k+¤%®‹a< :iâû®öàñzíŠé æþâfà6ÞpÜÛôÙ0Ù¶ØyØvتØÙÙ6ÚüÚéÛßÜÿÝ!ßbà¯áãräåå]çäèeêóëwíïyðòñQó¦ôÞõööí÷µøMù¯ùÆùžù!ùQø$÷™õ©óZñ¦î›ë:è‘ä®àžÜyØRÔ9ÐRÌœÈBÅA³¿›½¼ðºYºGº¡ºu»¥¼2¾ À)€ÄÇ®ÉnÌNÏ2Ò+Õ#ØÛÞ áýã俯é—ìiï!òÛô‚÷ú²ü3ÿ®|Ö! b œÆî* û!æ#Â%ž's)C+-Ø.š0\24Ò5Ž7=9ô: ð?•A)CÀDEF¼G+IzJ»K×LÐM¥N=O¨OÃOžOO>NúL@KIlFKC¢?„;ç6è1~,Ì&Þ »žii‰óü±÷ÉòVîCêºæŽãçàžÞÄÜJÛ%ÚTÙÌØ‚ØwØœØóØoÙÚÕÚ·Û²ÜÂÝêÞ!àláÆâ(äžåç•èêŸë1í­î3ð¦ñ ódôŸõÁöº÷’ø.ùùÀù«ù8ùø]÷íõ ôÓñ0ï5ìèèFåtáfÝKÙÕÑ ÍTÉàÅÒÂ+Àý½M¼»uº=º’º@»h¼ß½¯¿»Á Ä€Æ)Éå˼ΦєԑׇڅÝxàlãVæ4éìØîñTôüöŸù/üºþ2£a° ñ /X†›´¼Á¼±ž!…#g%>')ã*º,z.E02Ã3|567ê8Ÿ:I<ú=?AAÜBnDúEqGåH5JKšL§MwN&O‘OÃO§O8OpN;M KˆIýFìCd@W<Ö7é2“-ð' "õУ• ¯þ¶ø»ó0ïëbç.äbáßÝ“ÛZÚ~ÙáØ‘ØuØ•ØáØUÙôÙ®ÚŠÛ܈ݳÞáß-á€âáãSåÇæLèÊéWëÜìfîäï]ñÅòôbõ†ö‹÷føù…ùÀù«ùWù¡øž÷4ömôDò¶ïÎìéþå5â0ÞÚëÕÑÑÏÍ Ê‡ÆcéÀ`¾›¼P»ŒºDºxº»)¼’½Q¿SÁ•ÃÆ£È[Ë0ÎÑÔúÖõÙñÜæßÚâÂå©è~ëSîñÏóxöù¯û>þµ,‘ê@ € Áí7H[Z]LB!"# %ã&½(Ž*[,%.ê/«1m3$5à6”8I:ø;¤=L?í@BD¬E*G™HøI;KiLmMUNOƒO¹O²OPOœN|M÷KøI‚GŽDA(=Â8ä3¥.)4#)ÙÆ Ó#ÿ»ù´ôðØëèÅäïá~ßzÝÝÛ”Ú¥ÙÙœØ|Ø‹ØÓØ;ÙÖÙ‡ÚaÛOÜVÝvÞ§ßèàAâ˜ã å}æýçéëìî–ïñ~òÛó#õLöX÷<øïøqù´ù²ùhùÇøÓ÷}öËô¯ò<ð_í5ê°æôâøÞåڹ֚ҔοÊ2ÇúÃ(Áξ輻©ºMºgºõºð»G½÷¾ìÀ$ÈÅ!ÈÓʣ͂ÐsÓfÖeÙZÜUßFâ4åèòêÆíˆðHóóõœø.ûÀý:³yÈ  L…¬Ëäóøùëá Å"­$ˆ&_(4*,Ï-/W13Ò4‡6B8ð9¦;L=ý>™@=BÏC_EÞFTH±IÿJ,L?M%NåNfO·O±OlOÁN»MJL`JH)EÎA÷=¤9Þ4³/+*_$[;õ û>Æú«õñð¨ìÍèjåvâõßÚÝ,ÜÎÚÕÙÙ±Ø؈ØÂØ(Ù¶ÙcÚ6ÛÜ#Ý>Þhß«àúáXã¿ä7æ®ç8é¶êFìÇíMïÇð6ò˜óáôö#÷øÍøYù§ù¶ùwùëøøÄö!õó·ðôíÒêgç«ãÄ߫ۋ×dÓZÏyËÝǔİÁ9¿D½Â»ÔºTº]ºÒº»»½¾ŠÀ¯ÂÅšÇMÊÍóÏãÒÐÕÑØÇÛÀÞ¸áŸäŒçeê8íð»òtõø²ú@ý¿ÿ:¢X Ÿ â Ba‰–“Ž} j"K$.&(Ø)©+p-;/ú0½2y426ë7ž9M;ý<¥>I@êA€CE–FHoI½JòK MøMÁNQO¨O·O}OæNõM•LÇJƒH¼E€B½>„:×5¹0J+ƒ%mG% 'ZÔû§öÚñxíŽé æ ãjàDÞxÜÛÿÙ?ÙÂØ‰Ø‚ظØÙœÙ?Ú ÛðÛïÜÞ,ßnà´áãxäìåeçèèlêöë{íï~ðíñQó¢ôÖõïöã÷§ø?ù›ù²ù‡ùù6ø÷xõƒó5ñ~îtëèmä‚à|ÜTØ1Ô!Ð4ÌÈ-Å;«¿Ÿ½¼úºeºTº¸º‡»½¼J¾$ÀD˜ÄÇÆÉŠÌgÏLÒDÕ8Ø6Û.Þ$áäùæ×é¯ìwï8òêô”÷0úÁüEÿ¾,Œä0 q ©Õù$3,/ "î#Ï%ª'|)Q+-ã.¥0c2%4Ú5—7F9û:§ù?—A2CÁDIF¿G)IzJ¹KÓLÍM™N9O—OºO‰O O'NßL*K÷HTF%Cƒ?\;Ç6Á1],ª&» ¤|YQzèü¤÷ÈòOîKê·æšãéà­ÞÍÜWÛ2ÚbÙÚØØ†Ø©ØÙ~ÙÚçÚ¿ÛÀÜÍÝôÞ,àuáÍâ3ä¡åç™è"ê¦ë0í±î4ð¡ñó\ô™õºö°÷…øùù¬ù“ù!ù`øC÷Èõèó¬ñ ïì¼è"åGáGÝ!ÙÕæÐõÌBÉÎÅËÂ"Àÿ½N¼'»|ºRºŸºX»~¼÷½Ç¿ØÁ Ä£Æ;ÉÌÖνѰԦסښݒà}ãmæGé#ìíî°ñeô÷­ùCüÆþF±n¿  :l­¾ËÌ˺­!#s%M'!)ô*À,ˆ.M02Ë3†5>7ó8¤:W<ú=©?CAâBsDüEsGçH4J~K™LžMtNOˆO´O—O%OZN"MˆKhIáFÉCA@5<±7Æ2o-Î'è!×´Œ žúý­ø´ó.ïëgç2äkáß%Ý ÛfÚŠÙðØØ…Ø¤ØêØiÙúÙÀڕۉܛݶÞòß/áŽâçã^åÍæOèÕéWëäìdîåï^ñÁòôXõ‚ö÷Zøùsù¬ù•ù<ù„ø÷öKôòŽï§ìdé×å â ÞóÙÊձѷÍóÉyÆVäÀ_¾Ÿ¼W»—ºUºˆº1»>¼«½j¿mÁ¯Ã!ƼÈvËKÎ+ÑÔ× Ú ÝüßðâÚå¼è•ëbî)ñÝóö-ùÁûMþÇ< þJ “ É"FVekd_G!3#%ð&È(—*h,-.ö/´1v3.5ê6œ8Q:<©=T?ó@B'DªE0G™HöIO‡NeMÛKÜIcGmDø@=š8Ã3.í(# éÁ¯ Âÿ²ùªô ðÚëèÏäóá‰ß‡ÝæÛ£Ú³Ù ٯ؆؜ØàØHÙåÙ’ÚnÛ[Üa݃ޮßõàGâ£ãå…æèˆé ë•ìî˜ïñ{òÙóõHöL÷0øãø^ù£ù™ùRù¨ø·÷Zö§ôŒòð;íêŠæÉâÓÞ½Ú˜Ö|ÒxΫÊÇíÃ#Áɾ»¶ºYºzº »¼`½¿ Á:êÅ5Èóʸ͠ЉӂÖzÙsÜlß\âJå,è ë×íŸðXóö¬øAûÏýMÂ*ˆÙ  a¾Øòþúì Ò"º$&r(6*,Ñ- /\13Ü4Ž6L8ø9­;V=ÿ>¢@?BÕCbEßFUH±IýJ,L8M NÛN]O¨O¥OWO¯N¢M/LEJæGE®AÒ=9¹4’/*?$;øÚ ï)ÁúŸõñð§ìÐèoå~âüßéÝ2ÜâÚÝÙ,Ù¼ØØ–ØÏØ8Ù¿ÙwÚ=Û.Ü,ÝHÞvß³àâ_ãÊä:æ¼ç4éÄêBìÏíKïÈð5ò“óÜô ö÷øÂøFù•ù ù^ùÎøç÷¡öÿôøòðÍíªê<ç…ã›ßˆÛg×EÓ?ÏaËÎDŽĪÁ6¿D½Ì»ÚºdºoºåºÓ»½º¾ŸÀÎÂ+Å·ÇjÊ-ÍÐ÷ÒïÕäØãÛÔÞÐá´ä¢çxêMíðÐòƒõ*ø¿úSýÐÿI³h ¯ ñ #Ns†ž¢™Š u"Y$6&(â)µ+{-E/1Ã2‡476ö7¥9U;=©>R@ïA†CE—F HoI¼JïKMôMµNJO—O¬OgOÖNØML§JgHœE^Bš>`:±5˜0$+d%nO0 JÊû öÕñzíŠéæ ãxàKÞ†Ü Û ÚOÙÍØ™Ø‘ØÄØ Ù¦ÙPÚÛþÛøÜÞ9ßtàÂáã‚äòånçêèuê÷ëíï{ðíñPó˜ôÕõáöÚ÷™ø0ù†ùŸùlùîøøäöTõ`ó ñYîIëêç?ä^àUÜ2ØÔÐ ÌxÈ$Å.«¿œ½¼ÿºuºfºÉºž»Ô¼b¾@À^²Ä;ÇÝɨÌ~ÏgÒ\ÕSØLÛFÞ7á*äçîéÀìŒïIòÿô¥÷BúÐüYÿË=œó? ´è$2;@5, "û#Û%²'Š)Z+"-î.¬0q2+4æ5ž7P9;­<[>ý?A7CÃDOF¾G,IyJµKÐLÇM“N-OŒO«OxO÷NNÈL KÜH/FC^?:;¤6š1<,‡&œ …b@=kØü¡÷¾òPîKê¼æŸãõà³ÞÛÜbÛAÚpÙåØ¡Ø‘Ø¹ØÙŠÙ,ÚóÚÌÛËÜÖÝß5à€áÕâ;ä«å ç¤è"ê­ë1íµî2ð¥ñóZô“õ¯ö¨÷wøùwù›ùyùùCø!÷¦õÃó…ñáîåë“èùäá ÝýØßÔÊÐÛÌ-ÉÀž Àù½V¼-»‰ºbº¯ºq»’¼¾à¿ðÁ@Ä·Æ^ÉÌõÎÓÑËԾ׹ڱݩà•ã€æ`é2ìï¿ñ{ô ÷ÂùSüÙþSÄ'Ï  Jy›»ËÚÙÕɶ!#}%Y',)+É,•.U02Ó3‘5E7ý8«:]<>¬?MAäByDüEyGäH7JyK—L™MjNOzO¨O…OOCN MjKPI½F¬C@<Ž7 2N-©'É!º•vh îý¡ø±ó)ïëlç5äwáß5Ý©ÛuÚ—ÙÿتؕحØÿØoÙÚÉÚ£Û–Ü¥ÝÂÞúß>á’âôãbåÕæVèØé^ëäìhîåï\ñÂòôWõxöv÷Oøòøeù–ùù"ùjø\÷ôõ#ôùñfï~ì;é­åãáæÝÊÙ­ÕÑ ÍÚÉjÆIÃÀ^¾ ¼_»¤º_ºžºB»Y¼Â½¿ŠÁÇÃ=Æ×È‘ËbÎIÑ4Ô-×&ÚÝàãñåÏè«ëuî;ñóóžö?ùÕû[þÜJ± \ ž Ý 2TbvswfX!?#%þ&Ñ(¥*q,9.0½1365ô6¤8X: <¯=]?ö@˜B&DµE.GœH÷I8KaLhMBNôNhO O‘O-OpNNMÀKÁIBGNDÔ@ãV@öAˆCE—FHoI»JîKMíM±N:O’O–O[O½NÇMcLJEH~E:Bw>::5o0+>%M5ö 8Àû“öÒñwíéæãàWÞÜ-ÛÚ[ÙÞØ¤Ø¡ØÑØ.Ù´ÙZÚ&ÛÜ ÝÞCßàÇá'ãˆäúåtçóèvêÿëíï}ðëñMó”ôÍõÚöÏ÷‹ø ùtùŠùTùÒøù÷Äö1õ>óáð4îëÁçä7à,ÜØîÓéÏÌeÈÅ&Â¥¿½¼ »‚ºuºÞº³»ë¼|¾YÀwÂÑÄQÇüÉÀÌ™ÏÒwÕfØjÛXÞSá=ä#çêÖìžï`òõ»÷QúäügÿßK¯ÿS ‹ Èð.BILC8 !"$ç%¿'”)e+,-ú.¶0{254ï5¦7Z9;¹<_>@¥A8CÌDMFÅG(I{J²KËLÂMŠN#OOšOiOâNúM®LòJ½HFåB9?;{6z1,e&| fF(+XÍü•÷¸òPîHêÃæ¢ãýà½ÞæÜnÛMÚ}Ùôخ؞ØÈØÙšÙ8ÚþÚÙÛÕÜäÝßCà‡áàâBä²å)ç¦è,ê«ë:í³î4ð¢ñóUôŽõ¦ö÷jøùfù†ùbùíø'ø÷…õŸó^ñ¹î¾ëièÒä÷àøÜÜØ½Ô­ÐÆÌɷůÂÀú½Z¼6»–ºpºÃº…»©¼+¾÷¿ÂWÄÖÆuÉ5Ì ÏïÑãÔÖ×ÓÚÇÝÀà¬ã•ætéJìï×ñ‰ô7÷ÐùfüéþeÓ7Žß  \‚®ÅÜãéßÙÀ!¬#‡%e'9) +Ö,œ.b0!2à3˜5Q79¶:a<>±?RAíByDFzGåH7JyK“L”MdNOqOšOtOO.NôLOK2IF‹Cù?í;k7y2)-‡'¦!šz[S |Þý˜ø¨ó&ïëlç;ä~á(ß@ÝµÛ€Ú¦Ù ÙºØ¡Ø½Ø Ù|ÙÚÕڭۧܪÝÑÞàGáâýãhåàæYèßécëçìlîåï]ñ½òôNõqöm÷AøçøRù‚ùkùùNø@÷ÏõôÒñ@ïUìé…å¼á»Ý­Ù„ÕwуÍÇÉXÆAÔÀ^¾£¼g»°ºpº®ºY»k¼Ý½š¿£ÁãÃXÆòÈ«ËÎ`ÑOÔG×:Ú;Ý&àãææè¿ëŠîNñô°öQùçûjþïVÅm ® ê?ar€„€ud!I#.%'à(®*|,E. 0Ê1ˆ3C5ú6®8c: <¼=]?A˜B0D²E3GœHöI9K]LcM;NìN[O–O}OOXN9M¦K I(G(D´@Áù{ùpùùtøw÷öaô@òÅïéì¶é:æuâˆÞtÚSÖ@ÒAÎÊüÆÕÃÁǾ@»Êºwºžº1»3¼½A¿=ÁoÃßÅmÈ$ËòÍÐпӱ֪٤ܘߋâtåXè0ëîÄð€ó-öÎøgûïýpâI¨÷ ? }­Øô$!ì"Ï$«&„(S*$,ê-³/q133ê4¦6X8:º;f= ?¯@JBßCfEèFVH³IúJ$L2MNÍNEOO…O4OƒNwMøKJ¦GÉDfA=79r4F/Ã)ø#ÿáÅ­ Å¥ú’õæð£ìÕèvåŒâ àÿÝJÜøÚúÙDÙÛØªØ°ØîØNÙßÙ‹Ú[ÛAÜHÝZÞŽßÅàârã×äMæÄçDéËêKìÔíMïÈð3òŒóÔôýõ ÷í÷¥ø)ùnùtù/ù—ø¬÷`öºô®òEð{íXêíæ1ãNß?Û × ÓÏ6˦ÇlÄ–Á1¿E½Ù»îº~º’º »ü»H½é¾ÕÀÃbÅíÇžÊdÍBÐ+Ó!ÖÙÜßùáääÈç¤êtí=ðøò¨õMøåúqýöÿe×.‰ Ë >mŒ¥µ»º³¢ "r$N&((ø)Ê+‘-Y/1Ú2”4Q68º9a;=´>c@ôA’CEœFHoI»JéKÿLäMªN1O€OOFOªN±MHLuJ'H_EBW>:i5P0Ü*"%+õã ë+±ûŽöÌñvíéæã‹à\Þ¡Ü5Û(ÚgÙìØ²Ø¯ØÝØ>Ù¾ÙkÚ/ÛÜÝ&ÞMß‹àÑá.ãäæxçúè{êì…íï€ðçñJó‘ôÄõÓöÂ÷€øùaùuù<ùºøÙ÷¤öõóÁð î÷ê˜çîãà Üì×ÓÓÊÏðËSÈÅ¡¿ž½¼»º…ºòºÇ»½“¾tÀ‘ÂëÄjÇÊØÌ´Ï›ÒŒÕ„Ø|ÛrÞgáSä8çêêì±ïqò#õÉ÷gúòüxÿïZ¾ ^ Ó#=NWWPF *"$í%Î')p+8-/Ã0ƒ2?4ù5¬7c9;Á @§A>CÐDMFÈG)IyJ²KÆL½MNOtO‹OZOÌNçM”LÕJ£HðEÄB?ñ:[6T1ô+C&Z K,L¾ü÷´òKîNêÂæ¬ãáÉÞñÜzÛYÚ‹ÙٺدØÓØ)Ù¤ÙHÚÛêÛÝÜñÝßLà“áæâMä¸å.ç¯è.ê³ë9í¶î4ð¡ñóRô†õ ö“÷YøøøPùtùJùÓø øåö`õ~ó8ñ’î–ë@è©äÑàÓܸ؞ÔЭÌɦŦÂÀû½\¼A» º‚ºÖº˜»Â¼B¾À(ÂqÄîÆ‘ÉOÌ$Ï Ò÷Ôò×èÚÞÝ×à¿ã­æ…é`ì'ïëñœôG÷âùwüøþyßJ›ì . f”ºÓêï÷ìåÌ!¸#’%r'A)+ß,§.l0)2ê3 5[7 9½:j<>»?TAñB}DF{GçH5JvK‘LŽM]NÿNcOOfOìNNÜL4KIFhCÛ?È;G7X2-f'ˆ!zaC@ lÐýø¤ó"ïëpçAä†á2ßKÝÁÛÚ´ÙÙÊØ®ØËØÙÙ&ÚâڻۮܸÝÜÞ àSá¢âänåçæ_èäédëíìkîèï[ñ¼òôHõjöb÷6øÕøDùlùVùëø6ø÷³õÛó­ñï+ìëè]å“ášÝ†ÙfÕZÑiͶÉFÆ7ÃÀ_¾¥¼p»»ººÁºm»‚¼ó½µ¿¼ÁþÃqÆ ÉÆË—ÎyÑiÔ]×UÚMÝAà2ãæüèÏë î^ñôÁödùôû€þømÏ)| º ü%PmŽŽ€o!W#6%'æ(½*ƒ,R.0Ö1‘3K57µ8i:<À=e? A›B5D´E6GœH÷I6KZL[M8NÝNVO„OqO OEN MK…IG D“@œöáøuûþ~óW¹ P ‡¼å"0'# !ú"Ø$¸&Œ(`*,,ö-»/}193ö4¬6b8:Á;n=?µ@NBãCjEêFVH´I÷J"L+MN¿NAO}OzO OpN^MáKóI‰GªDFAj=9L4%/ )Ù#àŬ— ¶þÿœúŠõäð¢ìØè}åâàÞZÜÛÚTÙæØ¹Ø¿ØúØ]ÙêÙ˜ÚgÛNÜPÝhÞ”ßÓàâ{ãßäUæÈçLéÌêRìÑíTïÃð4ò‡óÏôõõ÷á÷—øùYùbùùøŠ÷Bö–ôŠòðTí/êÃæ ã&ßÛ×èÒìÎË–Ç^ÄŽÁ/¿E½â»ôººŸº#»¼_½¿ñÀÃ}ÅȵʂÍVÐKÓ3Ö2Ù&ÜßâùäÜçºê‡íQð ó¹õ`øõú…ý{áD à Qxš²ÁÈȽ± ˜"}$\&.( *Î+¡-`/'1ã2 4V6 8À9m;=À>b@B’C EžFHpI·JëKõLåMN)OuO{O7O•NšM1LXJ H=EøA1>ô9D5,0¸*% ÿØÌ Ö¤û‡öÅñuíŽé æ ãàjÞ¨ÜCÛ7ÚrÙûؿؼØîØGÙÏÙuÚ=Û!ÜÝ1ÞYß“àÝá5ãšä æ€çþèêì‡íï}ðéñFóô»õÎöµ÷tøùNùaù%ùžø½÷„öìôóòšðàíÐênçÇãéßäÛÉ×´Ó®ÏÚË>ÈûÄŸ¿œ½ ¼»žº”º»Ý»½®¾‹À­ÂŇÇ1ÊóÌÍÏ´Ò¥ÕØ’ÛŒÞ{ákäLç,êÿìÄï…ò2õà÷sú ý„ÿlÉ$ j ­ â 2J\db`L ="$ÿ%Õ'­)w+H-/Ï0Œ2I46¹7g9;Ä@®ADCÑDSFÇG+IyJ®KÃL·MzNOhO|OKOµNÔMxL¾JHÒE¢Bô>Ñ:1641Ë+$&7 -ù 7´ü‚÷¯òIîKêÉæ¯ã áÑÞúÜŠÛbÚÙ ÙÌØºØãØ5Ù´ÙTÚÛóÛëÜúÝßUàœáòâQäÂå4ç´è4ê¹ë:í»î2ð¢ñÿòPô~õšö†÷SøâøDù[ù5ù¹øí÷ÂöBõVóñhîpëèƒä§à®Ü”Ø~ÔrЕÌìȘśÂÀù½a¼H»®º‘ºéº®»Ø¼[¾,ÀAÂŽÄ Ç«ÉjÌ>Ï&ÒÕ ØÿÚùÝèàÝã¼æžésì;ïþñ¯ôX÷ùùƒüÿ„öT°ø @ t¢ÊÝûúüìß!¿# %}'N) +ì,¯.x032ò3­5_79Ä:s<>À?[AøB€D F|GèH5JuK‹L‰MVNóNYO}OSOÝNÿMÅLKùH_FGC·?¤;$702ä,D'c!a?/' ZÅý€ø óïëpçJä‰á?ßSÝËÛŸÚ»Ù+ÙÒØ¿ØØØ$Ù›Ù/ÚóÚÄÛ½ÜÂÝçÞà\á¯â äzåêæhèèéjëðìlîëïWñ½ò ôCõcöW÷+øÇø0ùZù<ùÕøø÷Žõ¹óˆññîìÁè3åmáqÝcÙDÕ>ÑNÍ É7Æ*ËÀY¾«¼x»ÅººÑºƒ»›¼ ¾Ï¿ÖÁÄÆ$Éã˲ΒфÔs×oÚcÝYàHã.æéãëµîtñ)ôØösù üþ |à:ˆ Î 6_xš›Œ~!a#E%'ô(Ä*“,W."0Ú1ž3T5 7Ã8m:"<Ä=n? A¥B6D»E5GŸHöI6KVLXM/N×NIOwO_OùN.N MrKgIêFêCn@y< 803ó-`("t^U yÜþƒù‘ôúïÙë!èää â­ß±ÝÜ×ÚæÙBÙçØ½ØÔØÙ„ÙÚÉÚۇܕݦÞáßákâËã+卿è éë¥ìî¢ï ñvòÊóõ+ö(÷ø­øùXù?ùíø=ø9÷Úõô÷ñvïšìeéçå*â7Þ.ÚÖÒ ÎVÊׯÁÃÁľõ¼®»ßº–º½º]»\¼Â½q¿pÁ¤ÃÆ¢ÈYË$ÎÑðÓâÖÛÙÏÜÉß´â å‚èXë,îèð§óNööø†ûþgÊ b “Ïî%4;6.!#å$Ã&˜(l*7,.Å/ˆ1D3ý4º6f8 :É;q=?µ@YBäCqEéFZH²I÷JL'MN»N1OsOgOOZNIMÄK×IkG‡D$AF=í8+4þ.})·#¾ª„ žðÿú‚õÞð£ìØè€å™â àÞcÜÛÚaÙõØÇØÌØ ÙeÙýÙ ÚvÛYÜ[ÝwÞ›ßàà%âƒãêäWæÓçOéÒêUìÖíSïÈð-ò‰óÃôöõñöÙ÷ˆøùKùFùÿø`øn÷"öqôfòõï+í ê–æçâüÞ÷ÚÝÖÉÒÒÎ Ë„ÇQćÁ*¿J½å»»žº°º8»&¼x½¿ Á5ØÅ"ÈÓÊ–ÍxÐ]ÓQÖIÙ;Ü8ß!âåðçÑê™ífðóÌõrøû˜ýïS¥ ê ,[ˆ©¿ÏÖÒϹ §"ˆ$d&@(*ß+§-m//1í2©4_68Ç9w;=Ê>f@B—C"E¡FHmIºJäKòLÞM“N!OeOoO"O„N€ML;JìGEÕA >Ð950•*Ý$ìÞÁ´ à ˜û~öÀñuíé'æ$ãšàsÞµÜOÛCÚÙÙÎØÊØúØXÙÙÙ†ÚGÛ/Ü(Ý<Þeßœàçá=ã¢äæ†çé„êì‹íï}ðèñCóŠô´õÄöª÷høîø=ùJù ù„øŸ÷eöÈôÎòsð¸í¨êDçžãÂ߽۩בӖϿË0ÈèÄ•¿£½ ¼)»ªº¥º»ó»1½Æ¾§ÀÅÂ!Å¢ÇJÊÍãÏÒҼնتۣޑáäcç@êíÚï—òIõì÷Šúý›ÿ~Ú2 { º óCTmmti\ G")$ &à'¸)‚+Q-/Ù0”2T46Á7r9";Ë@µAJCÓDWFÉG+IwJ­K½L³MpNOYOrO4O¥NºMaL JfH¯E‚BÑ>ª:6 1¬+ÿ% ôâ ë)¦üy÷¬òDîPêËæ¸ãáÜÞÝ•ÛsÚ¥ÙÙÖØËØïØDÙÁÙ`Ú#ÛÿÛøÜÞ)ß_à¦áùâ]äÇå=ç¹è:êºëAí¹î5ðŸñþòJôzõö}÷BøÕø0ùGùùøÏ÷¤öõ2óêðCîAëòçSä„à„ÜrØ\ÔXÐzÌÛȆœ Àû½f¼P»¼º ºýºÄ»î¼u¾EÀ\¨Ä'ÇÄɆÌZÏ>Ò-Õ"ØÛÞáîãÕæ´é†ìRïòÂôk÷ ú–ü ÿ”iº J …°Õï  øê!Ì#¬%ˆ'Y),+ö,½.€0?2ü3´5m79Ï:w<$>Ã?dAùB†D F€GäHÚÿÚÏÛÊÜÎÝðÞ#àdá·âäåóæoèëéqëðìqîèïXñºòô?õWöO÷ø¸øùDù%ù¹øú÷áölõ“ódñÇîÞë—è åBáNÝ;Ù(ÕÑ8Í‹É&Æ ÃƒÀ[¾®¼€»Òº ºåº–»³¼"¾ê¿ðÁ4Ä©ÆAÉýËËίњԑׄÚ|Ýrà\ãFæ%éùëÊî†ñ>ôèö†ùüŸþŒïM” ß Dm†§¬¤†!q#N%*')Î*Ÿ,`.,0å1§3]57Æ8|:"<Ó=n?A§B;D¾E7G HõI4KSLRM(NÎN=OiOOOãNNïLXKJIÊFÆCL@U<å7 3Ì-@(l"pYD? hËþ{ùŠôöïÚë$èèäâµß¼Ý!ÜäÚðÙVÙíØÒØÞØ%ÙÙ%ÚÓÚªÛ–ÜœÝ·Þæß"áxâÌã;婿#è é$ë¤ì&îžïñqòÉóÿô"ö÷ó÷œø ù?ù-ùÏø"ø÷·õöóÏñOïoì>é½åâÞ ÚíÕæÑôÍ=ÊËÆ±ÃþÀÁ¾÷¼¶»ëº¤ºÑºp»u¼×½Ž¿ˆÁÂÃ,ÆÀÈrËBÎÑ ÔûÖôÙéÜÞßÍâ¶å—èoë;îñ¶óföù™û&þŸyÕ' j ©×6CEF8*!#ô$Í&¤(y*?,.Í/“1M35À6r8%:Ð;~=?Â@ZBêCtEîFXH·IñJ LMNªN.O`O[OúNFN0M«KºIKGfDA#=Ë84Û.Y)–#žŽtn Šãÿ‚ú}õÙð¡ìÛè„å â+àÞqÜÛ"ÚnÙÙÔØÛØÙwÙÚ°Ú‚ÛdÜjÝ}Þ«ßäà4â‰ãóä^æÚçSéØêVìÚíRïÉð,òƒóÃôéõíöÌ÷yøøø4ù4ùâøHøN÷öOô>òÑïíáélæÀâÓÞÓÚ¹Ö­ÒµÎôÊnÇHÄ|Á)¿K½ë» »ªºÃºK»=¼‘½1¿&ÁNôÅ=ÈìÊ´ÍÐwÓkÖ_ÙWÜJß<â%åèäê­í{ð.óáõ…øû¨ý%š`´ ú :k—µÏÛäàÙÇ ³"“$t&H(*è+³-w/<1ô2´4j68Ñ9|;(=Ï>n@ BœC'E¡FHkI¹JâKïLÕMŽNO]O[OOnNjMýK JËGE°Aì=«9ú4ã/q*»$ËÁ¥ ­ÿ‰ûwö¼ñoí•é&æ,ã¢à{ÞÃÜXÛRÚÙÙÛØØØ ÙcÙéÙÚUÛ:Ü3ÝKÞi߬àëáKã¨äæç é‰ê ì‹í ï}ðæñ>ó…ô¯õºö¡÷Wøáø(ù7ùòøiø÷Fö¥ôªòJð’í~êçuãšß™Û„×vÓuÏ«ËÈßĘ¿œ½-¼.»¹ºµº-»¼J½Ý¾ÂÀàÂ=Å»ÇhÊ(ÍÐçÒÙÕÌØÄÛ¸Þ«á”ä{çSê'íîïªò[õø™ú*ý©ÿ!‹ì? Œ È +Mex{‚sk Q"7$&ë'Ä)+Y- /à0¡2Z46Ç7|9(;Õ<{>@¹ALCÚDYFÊG,IvJ©K»L¨MlNüNNOaO#O’N£MIL…JFH’E]B°>‡:ë5ê0‡+Þ%úïÜÈ Ù›ün÷§ò@îSêÌæÀãáæÞÝŸÛÚ³Ù+ÙçØÖØÙOÙÏÙlÚ/Û ÜÝÞ3ßhà±áãgäÎåCç¾è>ê¾ëBí¼î3ðŸñúòFôrõˆöq÷7øÃøù5ùù‰ø¯÷‡öùôóÅðîëÉç-ä]à`ÜQØ;Ô=ÐcÌÈÈwÅÂÀþ½h¼\»Çº²º»Ø»½‹¾`ÀuÂÂÄAÇÝÉ¢ÌpÏZÒBÕ=Ø-Û(ÞáäéæÈé™ìfï!ò×ô|÷ú§ü0ÿ¥vË V –½ãÿ ô!Ù#·%“'e)6+ÿ,È.‰0J24Á5p7(9Ô:<)>Ê?hAÿBŠD FƒGäH9JkK†L}MFNâNAO]O6O°NØMLäJ»H#FCr?Z;Þ6ä1Ÿ,ü&%!" ø 3®ýnø“óïë}çPäŸáNßlÝåÛµÚÚÙCÙòØÙØôØBÙ±ÙQÚÛãÛÐÜÝÝøÞ-àmáÂâä‰åøætèñéuëòìtîæïZñ´òô7õOöG÷ ø¬ø ù2ù ù øÝ÷ÁöKõsó7ñ§î±ëpèåäá(ÝÙÕÑ ÍvÉÆÃ}À[¾±¼‰»Þº®º÷º­»Æ¼=¾À ÂNÄÃÆ\ÉÌæÎÇѵԥמړ݆àuãYæ:éìÙî›ñPôúö™ù+ü¯þ/™X¨ é %Ry–¨´¸²¨“!{#\%4')Ù*§,p..0÷1ª3j57Ò8€:-<Ô=z?A­B?D¿Eo@BœC+E¤FHpI´JßKëLÌM‡NONONOOZNTMãKJ®GÞD“AÄ=9Ñ4Æ/M*œ$¬¥ˆ îƒûnöºñoí˜é+æ5ãªà‰ÞËÜiÛ\ÚŸÙ!ÙíØãØÙpÙöÙÚbÛDÜBÝOÞ{߯àúáOã²äæ•ç éêìí ï|ðãñ>ó}ôªõ°ö”÷LøÍøùùÞøJøh÷ö‰ôò)ðfíXêóæOãußtÛe×TÓ^Ï”ËÈÒÄûÁ’¿£½/¼:»ÆºÈº=»!¼^½ù¾ÚÀüÂTÅØÇÊEÍÐÓñÕãØÝÛÎÞÀá«äŽçiê:íð¼òmõø«ú8ý¼ÿ/úN › Ö 7Zsƒ‹Œ‚t _"@$"&ø'Í)™+d-*/é0­2b46Ó795;Ø<ƒ>"@¿AOCáDVFÑG'IwJ¥K¸L¢MdNïNCOOOO{NM0LhJ*HrEd:Ç5Ä0g+º%ÝѲ Çüi÷ŸòDîQêÓæÆã$áñÞÝ­ÛÚÄÙ7ÙöØäØ Ù^ÙÜÙ{Ú:ÛÜÝÞ<ßuàµáãjäØåKçÂèDêÃëBíÁî2ðžñ÷òAôjõ€öe÷+øµøù"ùèømø’÷fö×ôëò ðóíõêœçä4à<Ü.ØÔ!ÐL̳ÈmÅÂÀü½p¼c»Öº¾º%»ì» ½¤¾xÀ’ÂÜÄ\Çùɻ̋ÏsÒ]ÕTØFÛ?Þ,áäÿæÛé°ìyï2òëôŒ÷.ú¹ü@ÿ¶$‡Ù+ f ¢Íï('" "ã#Ç%™'v);+-Ð.”0S24Ç5|7.9Þ:†<1>Ï?pACDF†GæH5JmK~LzMüÀþ@©g· ø 3_Š¡·ÁÃÀ³Ÿ!‡#g%@')æ*°,|.90þ1¸3p5&7Ú8†:7<Ù=?AµB@DÅE{@B¥C-E¨FHmI¶JÛKèLÇM}NýN@O@OìNDN?MÆKëIŽG¼DqA¡=e9°4›/-*u$‚vj Ùxûaö¶ñní•é1æ9ã³à‘Þ×ÜsÛmÚ¨Ù4Ù÷ØòØ)Ù{ÙÚ§ÚoÛRÜKÝ_ރߺàâXã¹ä)æ—çé‘êì“í ïðâñ9ózô¡õ¨ö‰÷>ø¾øù ùÅø0øG÷öaô`òüïCí+êÍæ$ãNßMÛA×5ÓBÏzËøÇ¿ÄôÁŒ¿¤½4¼D»ÓºÙºQ»7¼u½¿ñÀÃlÅ÷ÇšÊ_Í5ÐÓ ÖÙñÛéÞÕáÂä¤ç}êQíðÒò~õ%øÀúHýÐÿ=° _ « ä Gh‚›–‘ j"Q$+&(Õ)ª+k-7/õ0³2p4&6Ú7‹98;ä<‰>*@ÁAZCÞD`FÍG,ItJ¥K±LŸMYNèN3OFOýNmNsMLNJ HREBh>>:¢5ž0@+˜%¸´£š ¯öü\÷›ò>îSêÕæÊã+áúÞ)Ý·Û›ÚÎÙFÙÙòØÙmÙçÙŠÚFÛ%ÜÝ)ÞIß}àÄáãwäÝåRçÊèIêÇëGíÀî5ð›ñøò:ôhõtö^÷ø¨ø÷ø ùÕøNøy÷Cö¸ôÃò{ðÊíÉêvçÜã àÜ ØúÓÐ/̤ÈZÅwÂÿ¿û½v¼k»ãºÐº5»¼1½Ä¾À¯Â÷ÄvÇÊÓ̪ωÒ{ÕjØcÛSÞHá0äçòéÄìŒïJòúô¤÷<úÍüQÿÆ7•ì9 v ±Ú-27-# "ó#Î%«'{)N+-Ü.Ÿ0[24Î5‡769å:<6>Ø?sAC“DFˆGæH7JgK€LoM:NËN*OBOO‹N©M`L¬J‚HßEÁB*?;“6œ1U,¶&ã áÕÈÖý\ø„óïë~ç^ä«ác߀ÝüÛÏÚõÙ^ÙÙóØÙ[ÙÏÙgÚ$Û÷ÛëÜñÝß@à„áÏâ2ä”å ç~èþé{ëüìuîíïSñ´òúó-õ?ö1÷õ÷øèø ùßølø¢÷„öõ*óíðUî`ë èäÎàÙÜÒØÅÔÅÐïÌJÉüÅÿÂtÀX¾¸¼š»öºÎº»Ù»ò¼r¾1ÀCÂ„ÄøÆ”ÉLÌÏþÑäÔÛ×ÍÚÄݳà¡ãˆæcé:ìïÂñxô÷¾ùMüÕþM¾zÅ Bp•´ÃÑÐϾ¯!‘#t%N' )ô*º,‡.F02Â3z517ã8:><â=‡?#A¸BHDÆE?G£HóI/KGLBMN°NO>OO¨NÜM¤LKòHkFdCâ?ê;v7Ÿ2_-Ö' "ô -£þZùsôðïÓë0èóä1âÏßÜÝDÜ ÛÚ}ÙÙûØÙNÙ¸ÙHÚþÚÍۺܿÝ×ÞàBáâëãOåÀæ6è°é2ë­ì,î¡ïñlò¼óîô ö÷Ð÷oøØøùêø‚øÏ÷¹öVõ†óañÙîöëÂèEå†á¡Ý™ÙŒÕŠÑ©ÍþÉ–Æ’ÃèÀ¼¾½Ì» »Óº»®»º¼¾Ý¿ÔÁÄzÆÉÃËÎmÑXÔG×=Ú/Ý%àãûåÔè°ëuî>ñíó ö9ùÑûVþÖC¬V ˜ Ô,I_iol^P!5#%ó&Æ(˜*e,+.î/±1j3'5Ù68;:ë;=5?Ò@iBøC~EóF_H°IñJLMìM’N O9O*OÃNNèL[KcIïFDš@³<]8–3l.ï(0#=8#* S²ÿbúcõËð ìÞè“åµâBà<ÞÜCÛHÚ˜Ù+ÙÙÙDÙœÙ1ÚÖÚ¦Û‰ÜÝžÞËßáNâ§ãåvæìçgéãêdìßíVïÉð$ò~ó®ôÖõÐö¨÷PøÅøùøðøšøï÷øö™õçóÍñYïˆìgéðåEâaÞ`ÚWÖLÒhήÊ;Ç#ÄeÁ"¿P½ÿ»/»Õºöºˆ»€¼Ø½¿rÁ¡ÃÆÈ>ËÎàÐÆÓµÖ«ÙžÜ‘ß€âiåHè"ëîí²ðlóöºøRûØýZÌ3’à + dšÀá÷ ì Ù"¸$•&m(<* ,Ñ-š/T13É4Š658ë9•;<=ä>€@B©C1E¬FHqI±JÚKâLÁMvNòN4O.OÝN-N(MªKÐImG›DLA|=@9‰4v/*Q$o`\R uÍeû]ö¬ñlí—é2æBã¸àÞâÜ~ÛzÚ³ÙEÙÿØÙ0ÙŽÙÚµÚ}Û\ÜYÝiÞßÇà âdãÁä/æ¢çé™êì•í ï|ðãñ5óvôšõžö~÷1ø­øóøóø¬øø(÷ãõ=ô<òÕïíê¢æüâ&ß(Û×Ó%ÏdËäÇ´ÄéÁŒ¿£½:¼Q»Üºîºc»N¼Ž½*¿Á2ÃŒÅȶÊzÍQÐ4Ó%ÖÙ ÜþÞðá×äºç–êbí)ðæò‘õ<øÌú`ýÜÿT½p ¸ ö -TxŸ¦¦œ v"]$7&(â)²+z->/1¼2x406â7•9A;é<’>/@ÊAZCåD_FÑG+ItJ¢K­L—MSNÜN*O1OïNUN]MÿK-JîG.EùAB>:y5}0+x%–•ˆ€ œãrüV÷’ò>îQêÚæÍã6áß6ÝÂÛ©ÚÚÙUÙÙÙ'Ù{ÙõÙ–ÚSÛ1Ü$Ý6ÞR߈àÍáã~äååXçÒèLêÍëGíÅî4ðñòò6ôaõnöP÷ø”øçøöøºø6øY÷#ö•ôòTð¢í¡êLç³ãæßîÛç×ÜÓæÏÌÈLÅrÂõ¿¾v¼y»ìºåºF»¼O½Ô¾°ÀÃÂÅ“Ç0ÊñÌÃϤғՅØxÛoÞ[áIä,çêÛìžï_ò õ·÷Núàü`ÿÚE¦üF Š ¼í )9BB<- "û#Ý%µ'‡)Y+-ê.§0g2$4Õ5“7:9ò:’Û?{A C—DF†GêH2JhKyLiM1NÃNO4OÿNyN‘MJLJhH»E¢B?í:p6u12,”&¿ ǵ³¿ýQø|óïë„çcä°áoß‡Ý ÜÙÚÚjÙÙÙÙjÙÝÙuÚ/ÛÜöÜÞßMà‹áÚâ9äžåç†èê€ëþìwîëïUñ¯ò÷ó'õ6ö(÷è÷{øÚøïøÌøNøˆ÷böãôóÇð-î:ëóçiä£à·Ü¬Ø¥Ô¨ÐÓÌ;ÉèÅøÂnÀV¾À¼Ÿ»»ßº-»î» ½‰¾MÀ]žÄǬÉiÌ4ÏÒÕò×çÚÚÝÎà¶ãœæzéKìïÖñŠô2÷Ðù^üçþ]Î0ˆÕ  O€¤ÀÒÜàÚ͹!¡#|%\',)ý*É,Ž.R02Í3ƒ597ì8˜:D<í=ˆ?,AºBKDÌE>G¥HòI+KEL>MNªN O2OO”NÆM‹LíJÕHLFBCÀ?Ã;S7w2?-°'ê!òçßé “þOùnôéïØë.èýä4âÚßçÝOÜÛ&Ú‹Ù&ÙÙÙZÙÅÙVÚ ÛÙÛÇÜÈÝäÞàMá˜âóãVåÉæ9è¹é3ë²ì.î¡ïñiò¸óéôöööÄ÷aøÅøðøÒøiø±÷ö2õeó:ñ°îÐë—èå\á|ÝsÙnÕiÑ’ÍæÉ‰Æ…ÃâÀ¼¾½Ò»»àº»Á»Ò¼6¾ö¿ðÁ.Ä—Æ.ÉÜ˭ΆÑoÔb×TÚHÝ<à%ãæìèÂëîMñô®öNùáûiþåVºe ¦ æ<Wi|yynX!C# %þ&Ô(¡*q,5.ù/¼1q325á6˜8D:ñ;˜=‰@B®C6E«FHmI´JÕKÝL»MlNçN(OOÌNN M–K­IQG}D'A[=9h4O/ä)1$JI;> `¼ZûRö¨ñjí—é7æGãÀà¨ÞëÜÛƒÚÄÙOÙÙÙ9Ù ÙÚÄÚ‰ÛgÜfÝrÞ›ßÍàâiãËä6æ§ç#éêì•íï|ðãñ/ótôõ˜ör÷!ø øÝøàø’øû÷ ÷Áõôò°ïòìÛéwæÙâúÞÛøÖùÒÏQËÍǪÄßÁ‰¿¦½?¼Z»ìºþºw»c¼¥½F¿%ÁPäÅ,ÈÑÊ•ÍjÐPÓ<Ö1Ù#ÜßâïäÏçªêxí=ð÷ò¨õIøäúlýðÿ`Ð)€ È ;d„Ÿ«µ³©› ƒ"h$C&(ë)¿+‚-M/1Ê24:6ë79I;ñ<—>5@ÏAbCåDfFÑG,ItJžK¨L”MINÒNO!OáN>NJMâKJÊGEÔA">õ9X5U0ø*S%vwlj †ÒgüI÷Žò<îOêàæÒã=á ß=ÝÒÛ±ÚëÙ_ÙÙÙ5ÙŠÙÚ¤Ú`Û=Ü3Ý=Þ`ß‘àÕá(ãƒäñå\çØèPêÒëKíÄî5ðšñðò3ôYõdöH÷ø…ø×øÜø¨øø>÷öoô€ò(ðíwê#çã¼ßÊÛÄ×»ÓÎÏÌ|È>ÅfÂõ¿ý½}¼»ûºóºZ»0¼b½ó¾ÅÀáÂ/ŪÇQÊÍàϾҩՠØÛ…Þsá_ä?çêëì³ïsòõÉ÷aúîüvÿèW¶ W – Ï÷4FQMK7 '"$è%Á'“)c++-ò.±0u2'4ç5•7H9÷:œä?~ACšDF‰GëH0JgKtLhM%N¼NO&OïNcN~M-LvJEHŸEBß>Ï:E6U1 ,q&Ÿ §š™«ïtýEøzó ïë„çhäºávß“ÝÜèÚÚ{Ù(ÙÙ,ÙvÙéÙƒÚ;ÛÜÝ Þ!ßZà‘áçâ>ä§åçŽèê…ëíyîîïQñ°òñó!õ0ö÷à÷køÇøÞø±ø9øh÷Fö¿ôåò ð î ëÑç=äàŒÜ؃ÔнÌ#ÉÜÅíÂhÀY¾À¼¬» »ïºA»¼$½Ÿ¾gÀvºÄ.ÇËÉ~ÌSÏ-ÒÕ ØÛïÝæàÊãµæébì+ïéñœôD÷âùpüöþpß?™ä & bŠ´ÌàëêéØÈ!ª#‹%e'7) +Ñ,›.Z02Õ35B7ó8¢:I<ò=“?.AÂBODËEDG¢HõI'KBL7MN¡NO%OýNƒN®MuLÐJ¼H)F$Cœ? ;/7T2-'È!ÓÍÃÕ „þEùgôåïÖë3èýä@âÞßöÝVÜ&Û2Ú˜Ù5ÙÙ$ÙhÙÒÙbÚÛäÛÓÜÕÝìÞàUá£âûã^åÎæAè¼é;ë²ì2î ïñiò±óæôùõîö·÷Qø¶øÚø¾øNø—÷}öõ@óñŠî©ëoèöä8áUÝRÙLÕOÑxÍÓÉwÆ{ÃÜÀº¾ ½Ú»$»ñº(»Ø»å¼Q¾ À ÂFijÆFÉùËÅΟьÔu×pÚ]ÝSà<ã#æé×ë îbñôÃö_ùóûyþõeË"u µ óIexˆ„ˆwg!N#+% 'Ü(°*w,B.0Ã1375ë6 8K:ù;Ÿ=A?Ý@uBýC‡EöF`H²IíJ L MÜMNòNO OžNÜM·L*K%IµF¼CX@k<8K3%.ª(ê"úôý ,–ÿIúTõÄð›ìæè™åÂâUàMÞ©ÜZÛcÚ²ÙIÙÙ#ÙYÙ¼ÙEÚôڻۥܟݸÞÜßá]â¹ãå…æùçpéíêlìàí]ïÃð$òró¨ôÄõ¿ö÷3ø¥øÓøÇødø¾÷¶ö\õŸó„ñï7ìé¢åõáÞÚÖÒ6΂ÊÇÄYÁ¿V½ ¼B»òº»²»ª¼ ¾¯¿©ÁÔÃ:ÆÄÈtË7ÎÑõÓëÖÖÙÒܼ߭â”åsèIëî×ð’ó=öÝøuûûý|ëV¯ H ·Üü%"!ð"Ï$¬&ƒ(T*!,æ-¯/i1*3à4–6L8ö9¦;K=î>@#B²C7E°FHpI¯JÕKÖL¶MbNÜNO O»NNøL|K‘I4GYDA9=ô8E4+/Â)$+- ) L­NûJö¥ñfíé7æPãÇà²ÞöÜ›ÛÚÔÙZÙ"ÙÙLÙ©Ù*ÚÐÚ•ÛtÜqÝ}Þ¥ßØàâtãÒä=æ°ç%é¥êìšíï{ðáñ/ólôŠõöf÷øøËøÈø|øÞ÷îö õùóðñŒïÉì´éPæ®âÖÞãÚ×ÖÛÒîÎ9˽ǞÄÖÁˆ¿¤½H¼b»ûº »»x¼½½_¿=ÁmüÅIÈéʯ̈́ÐiÓTÖJÙ9Ü/ßâåçç¼êŽíPð óºõZø÷ú|ýrß:Ž × Kp•©»Á¾¹¥ ‘"s$P&&(û)Å+‘-R/1Ñ24@6÷7¢9R;ù<><@ÔAdCëDeFÕG+IrJ›K¥LŒM@NÊN OOÊN-N1MÊKùI¯GñD²A>Î96510Ó*4%S\PS qÄWüD÷†ò8îRêàæÛãCáßKÝÛÛÁÚõÙoÙ,ÙÙDÙ“ÙÚ¯ÚmÛIÜ=ÝIÞhßžàÝá2ã‹ä÷ådçÞèUêÔëOíÆî5ð™ñìò/ôRõ]ö;÷õ÷vøÁøËøøþ÷"÷áõRôWòðVíQêúæhã•ߨۡלӳÏêËjÈ0Å\Âó¿û½‡¼…» »»n»E¼y½ ¿àÀúÂKÅÆÇhÊ#ÍúÏÖÒÇյئۡކáyäSç3êíÈï…ò2õÝ÷púýÿüeÇ f ¤ Û(FQ_YWF 2"$ô%Ê'¢)j+9-ø.Â0w284ê5 7Q9ý:¥è?„ACžDF‹GèH3JaKtL^M"N­NOOÛNUNcMLYJ(H‚E\B¾>«:661ä+R&| ‹—Ýfý<øró ïë†çmäÃá{ߣÝÜ÷ÚÚˆÙ4Ù!Ù8Ù„ÙúÙŠÚLÛÜÝÞ2ß\à¢áëâJä¬åç’è êŠëí~îìïSñªòïóõ)ö÷Ñ÷\ø·øÇø øøR÷"ö£ô½ò~ðÝííê¡çäVàiÜkØdÔoЧÌÉËÅæÂ_À\¾Â¼¶»»þºT»¼=½³¾…À‹ÂØÄHÇãÉ›ÌjÏIÒ3Õ#ØÛ ÞúàããÈæ£éwì<ïÿñ¬ôY÷óùü ÿ|óLªñ 8 mœÀÚîöûñçÑ!¸#—%p'C)+Þ,¢.f0#2à3•5L7÷8­:P<û=—?4AÇBRDÒEBG¥HóI%K@L2MúM˜NóNOìNoNšM[L¹JšHFÿB{?}; 702õ,n'¦!´±«¿ ûtþ=ù\ôäïÓë4èåAâìßøÝjÜ*ÛFÚ ÙFÙ Ù4ÙsÙàÙoÚ"ÛòÛÝÜàÝùÞ àcá§âäeåÕæHèÀé?ëµì4î¢ï ñhò®óàôòõåöª÷Dø£øÈø¥ø9øw÷cöîô óîðgîëKèËäá-Ý3Ù(Õ5Ñ]ÍÀÉkÆmÃÙÀ·¾ ½á»2»þº;»î»ù¼m¾!À)Â`ÄÍÆaÉÌßκѢԑ׃ÚxÝiàPã<æéðë°îyñ'ôÕöoùü‰þ tÚ4€ È ÿ0Uuƒ—•ƒs!X#:%'é(º*ƒ,L. 0Î1†3B5ô6§8V:þ;¥=I?á@zBD†EúFbH¯IîJLMÔM{NäNOùNŠNÉMŸLK I‘F£C.@P<ë7-3ÿ-‡(Ì"áßÛä „ÿ@úLõ¾ðžìâè¡åÇâ]àXÞ±ÜiÛmÚÀÙVÙ%Ù.ÙgÙÉÙTÚþÚÊۯܫÝÄÞåß$áfâÂãåæüçyéñêoìæí[ïÄð#ònó£ô½õµö…÷&ø’øÂø¯øNø ÷›ö:õ}óañåîìíèzåÐáïÝùÙñÕ÷ÑÎqÊ ÇüÃTÁ¿[½¼N»»+»Å»Á¼"¾È¿ÂÁïÃTÆßÈŽËRÎ-ÑÔ×ñÙåÜ×ßÂâªåˆè\ë-îëð¦óOöîø‡û þŒýd¿ U ’Âì !-10#!û"Ü$¸&Ž(_*+,ó-´/x113ê4¡6Q8:¬;S=ö>@,B³C?E¯FHqI¬JÓKÑL°MYNÔN OO¥NòMÞLeKuIG:Dä@=Ñ84/Ÿ)î#  ;œDûAöŸñeíé>æRãÒà¸ÞÝ£ÛžÚÞÙjÙ,Ù,ÙZÙµÙ7ÚÜÚ Û‚Üz݉ޯßáà(â|ãÚäEæ´ç-é¦ê#ì›íï~ðÛñ0ódôˆõ‚ö^÷ø€ø¹ø³ødøÅ÷Ðö‚õØóËñhïŸìé'æ‰â±Þ½Ú¹Ö¼ÒÕÎ%˫ǑÄÐÁ‚¿ª½K¼n»»»Ÿ»¼Õ½w¿XÁ„ÃØÅaÈËÇ͟ЀÓnÖbÙPÜGß/âåøçÓêŸíeðóËõnøûý‚ïHŸ ã &R„¼ÄÏÊű "$Z&4(*Ò+š-]/1Ú2•4J6ü7­9W;=£>@@ÛAfCóDeF×G+IqJ™K L…M:N¾NOO½NNM²KÜI•GÎD•AÚ=¯950²*%4@4> [µMü6÷‡ò0îXêáæáãJáßSÝçÛÍÚÚ~Ù7Ù)ÙQÙ¢ÙÚ½ÚvÛWÜGÝUÞsß§àçá9ã•äûåmçáè]êÖëRíÆî6ð˜ñèò+ôLõTö2÷å÷iø­øºøpøë÷þöÈõ-ô5òáï/í*êÕæ=ãsß‚Û×Ó•ÏÖËWÈ"ÅVÂ뿾†¼”»»»~»\¼½#¿÷ÀÃaÅãÇÊ<ÍÐðÒÝÕÏØ¿Û³Þ á‹äjçGêíÝï“òJõé÷†úý“ÿ sÖ* s ¶ ç5R_kgcQ ?"$&Õ'¬)v+C-/É0‚2@4ó5ª7V9;«î?‹AC¢DFŽGèH4J\KpLXMN£NûNOÏNƒ:6 1Å+1&Z pbjÏVý5øió ïëŒçqäÊá…߬Ý*ÜÛ(Ú•ÙCÙ+ÙGÙ‘ÙÚÚQÛ*ÜÝÞ<ßià§áøâNä¶å#ç—èêŒëíîêïUñ¥òíóõö ÷Á÷Qø¢øµø„øø2÷ö‚ô—ò]ð´íÈêyçõã1àEÜKØAÔ[ЊÌɾÅÙÂ`ÀW¾Ì¼¹»*» »h»(¼S½Î¾œÀ¦ÂñÄbÇÿÉ´Ì…Ï`ÒNÕ8Ø0Û Þ áüãÙæ¼é‡ìTïòÁôi÷ú–üÿÿ^¶ B ¦ÏçúÿòÞ!Ã#¢%z'Q)+ì,ª.q0+2é3Ÿ5R79®:\<ý=¡?6AÎBSDÕEEG¤HóI!K=L)MöM‹NéN OÛN]N„MDLJHíEâBW?];å62Ó,L'‡!™••ª ékþ0ùZôßïÖë8è åJâõßÞsÜ8ÛRÚ­ÙVÙ+ÙDÙ€ÙîÙ|Ú0ÛýÛêÜëÝß/àfá¶â äoåÚæNèÅéCë¹ì4î¤ï ñgò§óÛôéõÛö÷7øøµøŽøø_÷?öÒôûòÌð?îVë'è¡äòàÝÙ ÕÑGÍ«É\ÆbÃ×À³¾½è»=» »N»ÿ»½¾?À>Â}ÄæÆ~É*ÌûÎÐѾԧ×ÚÝ€àfãPæ(éÿëÈî…ñ?ôãö…ùüžþ‰åFŽ × ?c~˜š¦›‘!d#E%!'ñ(Ç*Š,Y.0×13J5ý6±8Y: <©=P?æ@~BD‡EG]H²IéJLMÍMpNÛNOêNxN´M†L÷JîHvFC@)<Ì73Û-h(¨"ÇÂÃÑ {ÿ1úJõ¹ðìèè£åÐâeàcÞ½ÜuÛzÚÍÙcÙ3Ù=ÙtÙÖÙaÚ ÛÖۺܷÝÌÞðß-áoâÊã$å–æèéòêtìåí_ïÁð"òióô·õ©ö{÷øø¯ø—ø6ø†÷{öõWó>ñÀîìëÅèUå¨áÌÝÕÙÏÕÞÑýÍ^ÊúÆðÃOÁ¿]½¼W»»<»Ö»Û¼2¾é¿ÕÁ ÄjÆýÈ£ËoÎCÑ+Ô× ÚûÜíß×â¿åœèsë<îñ³ócöù–ûþš sÏ e žÓø.8><."!#é$Â&™(k*2,ÿ-¾/‚183÷4£6^8:¶;X=ý>—@.B¹C>E³FHnI­JÌKÏL¦MSNÇNýNóNNàMÇLIK[I÷FDÄ@ó<®8ü3æ.|)Î#ïóðû )Œ;û8öœñeíœéEæWãÛàÂÞݲ۩ÚìÙvÙ:Ù;ÙfÙÄÙBÚêÚ­Û܆ݓ޸ßìà2âƒããäIæ½ç0é¬ê$ìžíï{ðÞñ%ófôyõ€öL÷ý÷køªø›øOø¥÷¸ö^õ·ó¨ñ@ï}ìcéæ^âޙژ֞ҾΠˠÇÄËÁ€¿¬½R¼y»»1»°»¦¼ê½¿sÁœÃõÅzÈ!Ëá͸ЙӇÖwÙjÜZßIâ.åèåê³íyð.óßõ~øû£ý”ýX® ò 3c­ÅÔÛ×о ¨"‹$f&=(*Ú+§-e/*1â2Ÿ4R68µ9^;=ª>G@ÞAnCðDmFÓG.IoJ’K LzM5N±N÷NöN¨NNMœK¾IvG³DoA»=‹9ë4í/‘*í$& K¥@ü3÷{ò8îTêçæéãOá-ßZÝøÛÖÚÚ‰ÙEÙ:ÙZÙ³Ù&ÚÊÚ…ÛaÜTÝ^Þ~ß°àðáCã›äætçåèbêÙëVíÆî7ð”ñèò$ôFõHö(÷Ù÷WøŸøžø`øÉ÷çö¤õ ôò»ï íê¯æãOß]Ûa×`Ó~Ï¿ËEÈÅJÂì¿ÿ½‘¼˜»&» »–»o¼§½<¿Á-Ã€ÅøÇŸÊWÍ)Ð ÓôÕçØÖÛËÞ´á¡ä€çXê*íîï¨ò[õú÷˜ú#ý¤ÿ„å8 „ Á ø"F]nwsq\ K"+$ &ã'³)ƒ+J-/Ò0Œ2J4ú5±7a9 ;µõ?AC£D$F‹GíH-J^KiLTMNœNêNùN¼N'N=MâK'JìGEEB|>c:Ú5í0¢+ &A MMOqºNý+øeóïëŽçzäÏá’ß³Ý:Ü Û:ÚŸÙSÙ9ÙTÙŸÙÚ©Ú_Û7Ü!Ý,ÞDßtà¯áãVä¿å(çœèêë í€îìïPñ§òâóõöýö¶÷Aøø¢økøë÷÷êõ[ôzò/ð–í˜êXçÊã à"Ü%Ø(Ô8Ð{ÌçȶÅËÂ_ÀT¾Ô¼Á»6»»x»?¼h½å¾·À¿Â Å{ÇÊÎÌžÏzÒfÕQØHÛ5Þ'áäôæÉé¡ìdï!òÖôx÷ú¥ü(ÿ¡oÅ S Š·Ú÷ þé!Ñ#ª%‰'X)*+ï,º.y062ó3¦5[7 9µ:d<>¤?@AÍB[D×EFG§HïI"K7L$MïMNÞNúNÉNLNkM/LJeHËEÃB5?8;Ä6è1±,)'e!|x~” Ø\þ&ùTôÚïÖë8èåPâÿßÞ~ÜGÛ\Ú½Ù`Ù:ÙQÙÙûÙ‰Ú<Û ÜõÜ÷Ý ß;àmáÁâäxåáæSèÌéDë¾ì6î¤ï ñbò¦óÑôçõËö–÷$ø‚ø¡øxøøB÷$ö®ôÛò¤ðî/ëýç~äÆàçÜèØîÔûÐ.Í—ÉNÆVÃÓÀ±¾½ï»J»»`»¼&½œ¾TÀ\”ÄÇ’ÉKÌÏïÑÓÔÂ״ڥݕà~ãcæ?éìÝîšñOô÷ö”ù'ü«þ'“ûRŸ ä KrŒ¡¬°¨ ‰!o#S%&')Ë*›,^.!0á1š3S57¶8e:<³=S?î@B DEûFdH¯IæJLôLÊMcNÒNóNÛNeNžMpLÝJÐHZF\Cò?<ª7á2½-A(Ž"¡«§½ ÷hÿ,ú=õ¹ðšìêè©åÕâpàjÞÊÜ€Û‡ÚÜÙmÙDÙFÙƒÙãÙlÚÛàÛÇÜÁÝÙÞùß7áxâÒã/囿èƒéùêtìííYïÅðògó—ô°õžöo÷ øoøžø€øøk÷^öûô7óñ™îÊëšè3å~á«Ý°Ù²Õ¿ÑèÍHÊêÆçÃGÁ¿`½"¼c»»K»í»î¼L¾þ¿ñÁ%Ä…ÆɻˋÎYÑHÔ+×&ÚÝàîâÓå²è…ëSîñÉóröù¦û0þª…Ú0 q ¯ß$<DMF<-!#ò$Ñ& (w*?,.Ì/‡1E3ý4®6f8 :½;_=?@2B¿CAE¶FHoIªJÊKÈL¢MGN½NòNàNƒNÆM´L.K@IÙFúC¤@Î<8Ô3Ç.V)±#ÌÙÔæ +û4ö”ñgí›éIæ^ãâàÍÞÝ½Û·ÚøÙ…ÙGÙHÙtÙÏÙRÚóڻۖܓݞÞÁßøà7âãæäVæ½ç9é¯ê(ì£íï}ðÛñ%ó]ôxõqöG÷ë÷`ø’øŠø4ø÷–öCõ“ó„ñïTì?éÜå9âiÞwÚwÖ‚Ò¡ÎûʈÇ}ĽÁƒ¿§½^¼}»'»=»Ç»·¼¾¥¿ŽÁµÃÆ’È>ËùÍÑдÓÖ’Ù~Üsß]âDå$èùêÇí‹ðAóñõø(û±ý3¡e¾ @sœ¼ÒãåæÜÉ ´"–$q&K(*é+¬-t/11î2¦4\68»9g;=°>M@ãAqCôDoFÓG0IkJ“K™LvM+N§NêNçN˜NðMíL~K¨IVG”DNA™=g9Ê4È/m*Î$û 9”4ü'÷{ò/îWêêæëã\á1ßiÝÿÛåÚÚšÙOÙGÙjÙºÙ;ÚÏÚ–ÛjÜ`ÝiއߺàùáKã£ä æxçîèeêÞëVíÉî6ð•ñäòô?õBö÷Ì÷GøŒø‹øGø±÷Èöˆõéóïñ˜ïàìÞéƒæôâ$ß>Û<×DÓcϧË5È ÅDÂ翾•¼¤»/»5»¤»ˆ¼¼½T¿*ÁHØÅȵÊtÍ@Ð(Ó ÖÙíÛàÞÏá³ä–çnê<íð¼òjõø¥ú5ýµÿ*—òI ‘ Ó 3Ony†}f ["3$&ê'Á)+T-/×0š2N46¹7g9;¹<`>ú?”A#C©D"FGéH0JZKeLMMN‘NàNêN«NN#MÐKJÓG!EüAV>D:²5Ì0|+ï% 3.;[«Aý!ø^óïë•ç{äÚá–ßÄÝ?ÜÛ?Ú²Ù\ÙHÙaÙ­ÙÚµÚlÛBÜ-Ý8ÞLßà¸á ã_äÄå1ç¡èêëí}îïïNñ¡òãóõöóö§÷4ø|øøTøÐ÷ùöÆõ?ôSòðkíuê/ç¥ãæßþÛØ ÔÐbÌØÈ¥ÅÇÂUÀ\¾Ñ¼Ð»?»,»»S¼}½¿ÈÀâÂÅ›Ç0ÊêÌ·Ï”Ò|ÕmØ\ÛOÞ;á'äçãé±ìyï7òãô÷#ú»ü4ÿµÖ c —Åé  ò!Ý#¸%‘'e)3+ü,Â.ƒ0@2û3®5i7 9Å:e< >«?CAÓB]DÙEGG§HîI!K1L"MäMxNÓNéN¾N4N[MLhJHH®E¡B?;£6Ã1Ž,'G![aa‚ ÇLþ ùGôÜïÓë=èåWâàÞ‰ÜSÛiÚËÙnÙIÙ\ÙÙÚ˜ÚGÛÜþÜÞßCà|áÄâä|åèæ[èÐéGëÄì4î¨ïñaò óÏôÚõÄöˆ÷øsøŠøcøë÷&÷öŒô¸ò€ðòí ëÒçXä¡àÀÜÊØÍÔßÐÍ…É<ÆQÃÇÀ¶¾½ø»W»'»w»#¼D½®¾pÀu®ÄDzÉ_Ì.ÏÒîÔÙ×Ìڻݬà•ãwæUé%ìðî®ñaô ÷¥ù9ü»þ9£ a¯ ò *[|Ÿª¼º·ª–!|#\%6' )Ú*¢,l.*0ê1¥3Y57¼8o:<»=[?ñ@‰B D‘EÿFdH­IèJùK÷L¼M`NÂNéNÇNTNŠMWLÂJ´H:F=CÎ?â;‡7½2™- (h"ŠŠ‘¦ ä[ÿ ú6õµðšìêè¯åÛâwàvÞÔÜŒÛ•ÚæÙÙMÙXÙÙîÙ}Ú!ÛîÛÑÜÎÝàÞà>á‚âÚã6å æè…éþêxìëí`ïÀðò_ó–ô£õšö`÷û÷aø†øoøøP÷@öÛôóõðtî ëvè åXá†ÝŒÙ•ÕžÑÔÍ.ÊàÆØÃCÁ¿`½-¼l»-»_»þ»½d¾À Â=ĤÆ+ÉÝË ÎwÑ]ÔI×8Ú,ÝàãæåÉè˜ëgî&ñÙóˆö$ù¸ûBþ¹/’î= ½ë/ISXUH7!#þ$Û&®(€*J,.Ó/”1M35º6j8:Á;h=?£@8BÂCFEµF HkI«JÇKÃL›MP@ìApCþDkFÙG-IkJ‘K“LpM#N›NßNÕNŠNÚMØLeKŒI;GoD2Ap=G9¥4¥/J*¬$Ùæêö $„)ü÷uò-îYêìæòãcá8ßwÝÜõÚ)Ú¤ÙaÙSÙwÙËÙCÚàÚ ÛvÜlÝuÞ“ßÃàâTã«äæ|çõèjêâëYíËî4ð•ñßòô8õ8ö÷¾÷;øvøyø+øš÷ªöiõÈóÊñrï¹ì·é\æÍâßÛ×#ÓJÏ’Ë"ÈþÄ:Âæ¿¾œ¼«»@»A»¼»—¼Ù½g¿FÁañÅ2ÈÏÊŒÍ\Ð?Ó$ÖÙÜøÞãáÊä«çêRíðÏò}õ#ø¶úIýÂÿ>£W   â C]{‡…y `"D$"&÷'Ê)˜+^-'/á0¤2W46À7q9;Ã@–A(C«D'FGëH-JUKdLDMNˆNÒNÜNšNNMµKìI¶GEÙA7>:—5¡0`+Æ% !Fž0ýøXóïë“çƒäßá¢ßÌÝMÜ'ÛOÚ½ÙlÙTÙoÙ¹Ù+ÚÁÚxÛLÜ:ÝAÞXߊàÁáãhäÊå8ç©èê™ë í…îëïNñ¢ò×óõöêö›÷#økø{ø<ø¹÷Úö¬õô3òèïEíOêç€ã½ßÜÛß×ïÓþÏPÌÃȘŽÂQÀ[¾×¼×»L»<»ž»j¼“½¿ãÀ÷Â>ŰÇNÊÍÑϯҔՅØuÛeÞSá9äçôéÈìŠïIòúôœ÷<úÃüNÿ½1Šè+ t £Öõ#)." þ!ê#À% 'n)@+-Î.‹0L24»5k79É:k<>­?JAÛB\DàEGG©HíIK.LMÛMqNÃNßN©N$NCMüKLJ*H’E|Bö>í:~6¤1f,ë&!!BBLl ´@þùAôÙïÐëCèå`â à%Þ”Ü_ÛwÚ×ÙzÙXÙhÙªÙÚ¡ÚWÛ Ü Ý Þ!ßLà…áÎâ$ä…åïæ_è×éKëÅì8î¤ï ñZò¡óÄôÖõ¹öz÷ ø^øxøLøÑ÷ ÷çõkô—òZðÏíâê¯ç.ä}àšÜªØ¬ÔÅÐþÌsÉ.ÆHÃÁÀ¸¾½¼a»9»„»=¼W½Æ¾‹ÀŠÂÍÄ6ÇÊÉ|ÌEÏÒÕð×äÚÓÝÁà«ãægé=ìïÃñrô÷¸ùHüÍþHµr¼  7hŒ¨»ÆÈ¸Ÿ!Œ#c%D')å*®,s.60ò1¯3b57Æ8u:<¿=`?ø@‹BDEGcH­IãJøKíLºMSN·NÜN¶NCNrMBL§JšHFC«?Á;a72s-(I"iqx‘ ÔLÿú.õ²ð˜ìïè±åäâ~àÞàÜ—Û¡ÚöÙŠÙ]ÙcÙœÙþÙ†Ú0ÛúÛÛÜÛÝéÞàEáŽâàã>卿èŠéëyìïí_ïÀðò^óŽôžõŽöT÷î÷NøuøVøë÷4÷"öºôòòÐðOîwëQèàä4á`ÝjÙuՃѺÍÊÏÆÏÃ<Á¿c½3¼x»;»q»¼½z¾0À%ÂXļÆHÉõË»ÎÑuÔa×QÚAÝ0àãüåÝè¬ë|î8ñîó˜ö6ùÊûRþÊAŸýM Ž Íú"@U`eaVA!-#%é&¸(Š*V,.Þ/1U35¿6v8:Ë;m=?§@>BÃCJE¸FHoI¥JÄK¿L‘M9N¤NÙN¿N^NM…LûJIF»C^@éºê0ì£íïwðÚñóQôkõ\ö0÷Ï÷=øoø\øøZ÷XöõMó<ñÏîìïèåíáÞ2Ú5ÖGÒqÎÍÊlÇ`ijÁ{¿±½f¼˜»@»a»í»ã¼4¾×¿ÂÁèÃDÆÉÈnË2ÎÑèÓÎÖÀٰܞߌânåNè%ëíí²ðhóö¸øHûÕýQÆ+ŠÖ # [¹Ôñ÷ýôã Ê"®$‰&_(0*û+Ä-…/G13·4q68Ñ9s;=¼>Y@ìAzCüDpFÙG+IkJŒKŒLmMN”NÐNÇNvNÈM¾LQKkI GMDAN="9‚4€/)*‹$ºÊÐá tü÷qò+î\êðæúãjáFßÝÜýÚ:Ú±ÙoÙaÙ…ÙÙÙOÚðÚ¨Û†ÜtÝÞ›ßÏà â]ã´äæ…çøènêåë\íÊî7ðñÞòô2õ/ö÷°÷(ødødøø÷ŠöLõ¢óªñJï”ìé5æ¤âÝÞòÚþÖÓ-ÏËÈòÄ3Â俾£¼¶»N»Q»Ñ»­¼ï½‚¿^Á|ÃÍÅJÈëʦÍvÐWÓ?Ö.ÙÜßùáâä¾ç˜êeí)ðâòõ2øËúWýÔÿLµg ¯ í #Nlˆ“ž™”„ i"T$'&(Ô)¢+j-//ì0¬2c46Ë7v9$;È@ A(C²D&F’GìH*JUK\L>MûMxNÊNÈNNêMúLšKÑI™GâD¹A>ø9s5~0=+©%ãöþ 4Ž%ýøTóïë—ç‹äæá®ßÓÝ]Ü1Û_ÚÉÙyÙeÙyÙËÙ3ÚÒÚÛ\ÜBÝOÞ`ß•àÇáãkäÕå=ç¬è'ê˜ëí‚îîïKñòÖóúôþõÛö÷øYødø'øš÷Âö‡õüó òÆïí)êßæWãšß·ÛÁ×ÌÓíÏ/̻ȃŻÂMÀZ¾à¼Þ»Z»O»®»¼©½2¿þÀÃTÅÏÇfÊÍìÏÃҲՙ؎Û{ÞiáNä4çêßìšï_òõ±÷Kú×üYÿÔ9¢ñ>  ´á0772" "ð#Ñ%¦'z)J+ -Û.’0U2 4Â5u7"9Ð:t<>¶?LAÞBbDÞEMG£HïIK)LMÔMdN»NÌNœN N0MáK3J HrE^BÒ>Ì:]6{1L,Â& !")6W §2þ ù@ôÓïÖëCèåfâà+Þ¤ÜiÛ…ÚåÙ‡ÙgÙtÙºÙÚ±Ú`Û-ÜÝÞ/ßRà‘áÕâ-äŒåôægèØéSëÅì<î¤ïñZò™óÁôËõ°öm÷ú÷Køeø3ø¹÷íöÈõKôqò7ð©íºêˆçäVàxÜˆØŒÔ¬ÐæÌ`É Æ@ûÀ»¾½¼j»J»—»P¼n½á¾ À¨ÂâÄQÇçÉ’ÌcÏ3Ò!Õ ØúÚëÝÕàÂã æéMìïÖñ„ô.÷ÉùYüÝþYÃ)€Ê  Ev›µÈÓÕÏì!•#r%L'!)í*¹,|.A0ü1·3l57Ñ8z:#<È=c?ABD‘EG_H°IßJöKçL¯MKN«NÎN¥N0N[M*LJ|HüEýBˆ? ;;7|2O-ß')"LTcz Å>ÿ ú*õ®ð˜ìòè·åëâ‰àŠÞìܦۭÚÚ—ÙjÙrÙ©Ù Ú“Ú=ÛÜéÜäÝöÞàQá–âéãF坿èéë|ìñí]ïÄðò]ó…ô•õ‡öE÷ß÷=ø`ø?øÔ÷÷ö˜ôÏò¬ð&îUë#è¾ä á<ÝHÙTÕhÑ¡Í Ê¿ÆÄÃ9Á¿k½7¼‡»H»†»%¼4½¾KÀ=ÂuÄׯaÉÌÑέÑÔz×iÚXÝHà.ãæìèÆë‹îLñô§öKùÙûcþÜN±Y ¡ Ö ,Q_poo_Q!3#%ñ&Â(˜*[,(.ç/¥1b35Ï6w8*:Í;v=?­@ABÈCLE¹F!HjI¦J¿K·LŽM(NžNÇN±NLNˆMkLáJëH}F›C<@i_@ðA}CýDuF×G.IgJˆK‹LaMN…NÄN·NdN²M©L3KTIýF2Dì@/=ÿ8\4`/*o$™°·É bü ÷kò/îWêûæúãxáMß‹Ý$Ü ÛFÚÁÙ{ÙnÙ”ÙäÙ_ÚúÚ·Û‘Ü€ÝÞ¥ßÙàâcã¾äæçüèsêêë\íÎî3ðñÙòô)õ&öùö¥÷øUøIøø^÷sö(õ‚ó…ñ!ïsìbéæxâ»ÞÍÚÝÖêÒÏiËÈäÄ,Â࿾§¼Ã»Z»c»ä»À¼ ¾š¿yÁ–ÃçÅeÈËÁÍÐrÓUÖIÙ3Ü&ßâ÷äÔç¬êwí?ðòò¤õDøÜúhýæÿ[Å$t À ú 1\y• «§Ÿ v"^$5&(ß)­+v-7/ù0²2n4 6Ó79*;Ñ

    @ A1C²D*F”GçH,JPKXL:MîMrNºN»NyNØMáLK·IwGÈD‘Aö=Ó9L5a0+%½Üàô }ýøQóúîëšçäïá¶ßßÝgÜAÛhÚÛÙ†ÙqÙŠÙÕÙEÚÚÚ’ÛdÜSÝVÞoß™àÚáãyäÚåCç¶è&ê¢ëí„îïïIñšòÓóòôõõÑö‚÷øHøNøø÷¤öhõÙóèñŸïöìêµæ2ãrߒ۠׫ÓÑÏ̤È|ŪÂMÀZ¾å¼ç»i»Z»Æ»’¼Ã½I¿Á+ÃqÅçÇ„Ê7ÍÐàÒÈÕ¶Ø£Û”Þ}áiäDç"êëìµïmòõÄ÷[úéümÿáM¯ O Œ Ãï,=EE>/ "ý#Û%³'†)S+-â.Ÿ0_24Ê5~7,9Ö:€<>¿?QAãBgDáELG¨HëIK%L MÐMWN±N½N‰NûMMÊKJîGSE;B¯>¨:66Z1#,£&å  A •#þù6ôÒïÔëDè%ålâ$à6Þ®ÜxÛÚõÙ•ÙrÙ‡ÙÀÙ1Ú½ÚkÛ>Ü Ý$Þ7ß^à˜ááâ3ä•åûækèßéVëÈì?î£ïñVò•ó»ôÀõ¨ö_÷ê÷;øPøø£÷Ìö­õ)ôLòð}í—ê^çâã/àTÜcØoÔÐÌÌPÉÆ7øÀ·¾%½¼|»V»­»d¼…½ù¾»ÀÁÂÅiÇÊ­Ì|ÏQÒ6Õ$ØÛÞðà×ã·æ“écì)ïéñ—ôA÷ÜùhüóþdÚ4’Û  V„§ÆÕàâÝͼ!Ÿ#~%Y'()û*Â,ˆ.K02Ä3s5*7×8„:)<Ñ=h?A•BD™EGcH®IÝJñKâL©MANžN¿N–NNHMLsJ_HÝEÛBi?v;7N23-¶' "*:Gg ®3ÿþù$õ©ð–ìôè»åóâà•Þ÷Ü°Û½Ú Ú§ÙxÙ~Ù¸ÙÚ¡ÚJÛÜõÜîÝß à_á›âóãNå´æ$è•é ëìòí]ïÂðòWóôŽõ{ö;÷Ñ÷-øKø,ø¶÷÷âõzô¬ò†ðî)ëè‘äèàÝ&Ù3ÕKщÍõɯƻÃ.Á¿j½E¼»\»“»<¼G½¬¾`ÀYÂŽÄïÆ€É)ÌîÎÄѧԒׂÚnÝ`àEã+æéÖë£î_ñô¿öYùìûtþì_Ák ¬ êAWrz}|l[!D#%ÿ&Î( *k,..ó/±1g3$5Ñ6„8/:Ù;x=?¯@HBÍCKEÀFHnI¢J¼K´L…M"NN¼NŸN9NtMSLÉJÌHbFyC@F<ú7L34.Ð(+#Sho ËCÿúö…ñ^í¦éWæzãáõÞCÝîÛéÚ0Ú·Ù‚ÙzÙ¬ÙÚƒÚ*ÛéÛÇܾÝËÞéßá]â±ãåpæÙçLéÂê5ì¨íïvð×ñóJôWõOö÷¶÷øIø/øÓ÷!÷öÅôó÷ðî»ë¡è>åŸáÕÝéÙøÕ Ò>Î¥ÊKÇJĨÁu¿·½v¼©»a»»¼½b¾ ÀóÁÄwÆÉ¢ËfÎ5ÑÔ×ðÙÞÜÏß´âžåvèMëî×ðó9öØøoûôýuãN¥ú = z¬Òõ û ä"Â$¢&q(J* ,Ü-—/[13Ì4|618Û9„;*=Æ>g@òA„CEuFÚG+IeJˆKƒL\MNyN¹N¥NTN›M“LK6IâFDÎ@ =Ú8;49/ä)G$}² ëVü÷cò,îYêûæäzáYß–Ý.ÜÛQÚÎÙ‰Ù|Ù ÙòÙlÚÛÅÛ™ÜÝ’Þ´ßßà âkãÅä&æ“çévêíë_íÏî3ðñ×ò ô%õöñö“÷ ø@ø6øç÷G÷Sö õaó_ñïHì>ééåUâ•Þ¨Ú¿ÖÊÒúÎUËëÇÛÄ"ÂÞ¿¾¯¼Ë»h»t»ö»Ø¼¾²¿‘Á²ÃÆÈËÛͪЉÓqÖ^ÙNÜ9ß(â åêçÀêíPð ó³õYøëú{ýõÿnÔ3„ Î @i‡¤­¸´¬› …"e$E&(í)µ+-A/1½2u4(6Ý7„95;Ó<{>@¨A4C¶D-F“GëH)JNKSL2MèMhN«N°NeNÅMÌLgKœIZG¦DtAÏ=±9)580÷*d%£ºÈÜ m ýøFóüîëŸç“ä÷á½ßíÝnÜPÛsÚèÙ’ÙÙ˜ÙàÙSÚæÚÛqÜ\ÝaÞzߣàáá(ã‚äßåMç·è/ê¡ëí†îíïJñ–òÎóìôëõÈör÷ö÷1ø?øó÷j÷†öJõ»óÂñ{ïÒìØé’æ ãMßpÛ}×Ó´ÏÌ‘ÈnŤÂHÀ[¾ê¼ñ»u»k»Ù»¥¼Ý½]¿5ÁAÃŽÅÈœÊSÍÐûÒÞÕÐØ¹Û­Þ”á}ä\ç3êíÈï€ò0õÔ÷núùü}ÿñ]¾ \ Ïÿ8LNUI; &"$æ%¿')_+&-é.«0e2 4Ó5†729ß:ƒ<'>Á?YAåBkDâEOG¦HìIK#LMÇMON¢N°NxNèMM´KùIÔG2EB‹>‡:651,|&Ë äô. þðø6ôÌïÕëJè&åwâ)àDÞ·Ü„ÛÚÚ¤ÙÙ’ÙÐÙ<ÚÈÚ{ÛDÜ.Ý/Þ@ßkàŸáèâ=äšåçnèçéUëÐì:î¨ïñTò‘ó³ôºõœöU÷Ù÷-ø7ø øƒ÷·ö‰õ ô)òïï[ínê:çºã à2Ü@ØUÔpмÌ9ÉÆ+õÀ·¾*½¼†»h»½»y¼›½¿ÖÀÚÂʼnÇÊÍÌÏkÒQÕ:Ø+ÛÞáëãÎæ¥éwì?ïùñ¬ôQ÷íù{üÿwæFŸé , e·ÏåìîéÙÈ!ª#Š%b'6)+Í,’.S02È3€5/7â8†:4<Ò=s?A™BDEGeH«IÛJíKÝL M9N’N³N„N N2MûKTJIHºE¿BE?W;ø622 -š'ê! .S %ÿôùõ¥ð˜ìõèÀåúâ˜à ÞݼÛÉÚÚ´Ù„ÙŽÙÄÙ$Ú®ÚUÛÜýÜþÝß2àaá«âöãY叿*èšéë„ìôí^ïÀðòQó~ôƒõrö/÷Â÷ø8øø÷åöÃõ[ô‰òbðÝíëÙçläÃàðÜÙÕ2ÑoÍãɞƳÃ)Á¿n½K¼š»h»¦»Q¼\½Ä¾yÀsÂ§Ä Ç•ÉEÌÏÜÑÃԧךچÝtà\ã@æéìë´îsñ$ôÑöiùþû„þüoÐ){ » ö&Lh}‡‹†{f!N#,%'Ü(©*t,;.ù/»1r3)5Ü6Œ84:ã;=!?¹@HBÓCOE¿FHoIœJ½K«LMN…N­N‘N&N_M?L¬J´HAF[Cø?%<Ù7'3.¯( #7KWw º4õú öñ^í¦é]æ~ã áþÞOÝùÛôÚ<ÚÈًٌٶÙÚ“Ú2ÛøÛÑÜÊÝÕÞõß&ágâ·ãåuæàçPéÇê6ì¯íï}ðÎñóCôPõDö ÷§÷ ø6øø¹÷÷ö¢ôçòÑð\î—ëxèåyá°ÝÉÙÕÕòÑ&ÎÊ<Ç?ÄŸÁw¿¸½}¼·»k»–»(¼&½w¾%À Â:Ä’ÆÉ¿Ë}ÎOÑ2Ô×Ú÷ÜâßÍâ¯åŽè]ë-îéð¡óKöéøûþ‚÷X¹ M ˆ¸âÿ+!ñ"Í$¬&}(T*,ç- /d13Ò4ˆ678â9Ž;-=Ò>e@þAƒCEvFÛG,IcJƒK~LVMýMsN¥NN@«A;CµD3F’GëH(JLKML/MÝM_NŸN NSN²M´LPK€I>G…DTA¬=950Õ*@%…­Ä ÷Zýñ÷Dó÷îë£ç—äâÃßùÝxÜ[Û„ÚïÙ§Ù†Ù§ÙîÙ^ÚõÚªÛ|ÜhÝlރ߰àèá3ãˆäèåQçÁè0ê¨ëíŠîìïHñ”òÇóèôãõ¼öi÷ã÷%ø$øã÷L÷jö.õ•ó£ñTï­ì±élæáâ*ßLÛ]×qÓ›ÏîË‚È]Å¡Â?À`¾ì¼ü»€»~»é»¼¼ñ½x¿JÁ_Ã¥ÅȵÊnÍ5ÐÓøÕæØÒÛÂÞ«á’äqçIêíÛï’òEõå÷ú ýŒÿiÐ l ª à /CZ\aTH 0"$ñ%Ê'š)i+0-ö.±0s2%4à5Œ7=9å:‹<+>Ê?ZAîBjDêEKG«HçIKLM½MGN“N¦NdNÖMëL™KäI²GEøAl>b:ñ51ß+_&¦ ÆÛè p þîø(ôÌïÑëNè*å~â1àMÞÃÜÛ©Ú Ú±Ù‹Ù¡ÙÞÙHÚØÚÛWÜ4Ý>ÞHßuà«áðâGä£å çxèéé[ëÔì:î«ïñRòó¬ô´õ‘öG÷Ì÷ø'øï÷m÷˜ömõéóòÊï5íFêç‘ãæß Ü#Ø0ÔWФÌ#ÉøÅ Ã±Àµ¾/½!¼•»t»Ð»Ž¼±½(¿îÀòÂ5ÅŸÇ4Êç̪χÒhÕSØEÛ.Þáäáæ¾é‹ìRïò½ôd÷úŒüÿˆöW¯ø = q¢ÃßñúûöåÕ!³#˜%m'@)+Ö,ž.]02Ó3‡5;7æ8“:9<Ú=y? AŸB DžEGgH©IÚJéKÖL›M-N†N§NpNûMMãKì«íïwðÏñó=ôIõ<öüö˜÷ú÷!øø ÷ìöäõ€ôÈò©ð:îmëSèñäTá‹Ý£Ù¹ÕÐÑÎxÊ.Ç0ÄÁn¿Á½~¼Å»y»¥»>¼;½¾=À%ÂUĬÆ4ÉØË™ÎjÑIÔ4×ÚÝøßåâÃå¥ètë?îÿð´ó^öýø‘ûþ–kÇ \ ˜Æó (+8.(!ü"Û$¶&Œ(Y*),ê-®/m1%3Þ46@8ê9•;4=Ú>j@B‡C EzFÜG*IeJ}K{LOMõMgN›NŠN+NyM`LéJI¡FÕC…@Ç<’8ò3ó.ž)$<Yf† Å4ïûñö[ò'îZêç äŽágß­ÝDÜ2ÛkÚéÙ¢Ù™Ù¸ÙÚƒÚ ÛÛ۴ܣݫÞÇßóà2â~ãÓä7æŸç é€êõëeíÏî7ðˆñÒòôõ öÙöz÷è÷ø ø·÷÷öÉôóñµîûëðèšå âEÞiÚwÖ•ÒÄÎ)ËÌÇÀÄÂØ¿¾¼¼ß»ƒ»–»¼½M¾â¿ÆÁäÃ7Æ´ÈTËÎÞмӠ֑Ù{ÜmßOâ:åèèê¸ísð0óÚõzøû™ýôT¢ í &]ƒ§ºÌÍÒÀ¹ ˜"$W&3(þ)Ð+’-W/1Ð2†4=6è7š9@;ä<…>@¯A?C»D1F—GèH'JHKIL'MÕMSN’N‘NBNMžL6KfIGeD4Aˆ=l9à4ó/¯*!%e}•© åIóüé÷=óôîë£ç äâÔßüÝŠÜeÛÚڭ٘ٴÙúÙlÚÛµÛˆÜuÝvÞß¶àöá8ã’äïåXçÃè:ê¦ë í†îðïEñ’òÃóáôÚõ±ö\÷Ñ÷øøÉ÷5÷Köõuó€ñ0ï…ìŠéCæ½âß'Û<×TÓÏÛËmÈRÅ—Â<Àa¾ò¼¼Œ»»ú»Ó¼ ¾¿gÁtÃÄÅ6ÈÐʇÍPÐ/ÓÖþØëÛØÞÃá¨ä†ç^ê+íîï§òVõù÷’úý¡ÿ‚Ú3 y ¸ ñ=ScoicU <""$þ%Ô'§)u+8-/º0|224å5™7B9î:‘<4>Î?bAîBrDçERG§HçIKLýLµMA:È5ò0¹+>&… ª¼Õ bûýâø#ôÇïÓëMè1åƒâ<àWÞÏܙۺÚÚÀÙšÙ¬ÙìÙUÚãÚ’Û]ÜGÝAÞYß{à¶áøâOä¨åç|èîé`ëÒì@î§ïñOò‡óªô¦õŠö8÷¼÷ øøÜ÷P÷öKõÊóâñ§ïí!êêænã½ßêÛÿ×Ô>ÐŒÌÉëÅðÀ´¾5½*¼¡»†»á»¥¼Æ½A¿Á ÃOźÇOÊþÌÆÏžÒƒÕjØ]ÛCÞ6áäúæÎé¢ìdï!òÒôt÷úžü"ÿši» I ®ÒíýôÝ!Ä# %y'L)+â,¨.e0%2Ú3“5@7ó8—:B<à=}?A¢B$D¢EGhH¦IÛJáKÔLM%NzN•NcNãMMÈK$J H€E|B?;¯6è1Å,T'¨!Ïêø+ w ÿÞù õžð“ìüèÅå ã§à´ÞÝÔÛãÚ6ÚÎ٠٨ÙÝÙCÚÂÚsÛ2ÜÝÞ ßFàráÀâäj寿6è¥éëˆìúí^ïÀð òNójô}õWö÷¤÷ù÷øå÷o÷¨öõôIòð”íµêŒçäwà¨ÜÁØ×Ô÷ÐAÍ¼ÉÆÃÁ¿x½Z¼²»‡»Ë»w¼½ñ¾¬À§ÂÜÄAÇÎÉvÌ=ÏÒóÔÝ×ÇڸݠàŒãgæFéìÜî›ñKôôö‘ùü¦þ"ŠöF™ Ù Cg„—££¢ƒ!c#D%'ð(À*‹,N.0Ë1†3=5é6¢8?:ó;‹=.?Â@TBÙCUEÄFHpI—JµK¡LpMNnN‘NrNþM7M L{JxHFC³?ß;7à2Ê-l(Ã"ü'I ”Üúýõvñ[íªécæ‹ãáßgÝÜÛWÚà٩٤ÙÓÙ-ÚªÚOÛ ÜìÜßÝìÞ à:á{âÆã!åƒæíç\éÎê@ì°íïyðÊñó4ôDõ/öóöˆ÷ê÷ øñ÷…÷ÔöÄõbô¥ò†ðîIë)èÍä,ágٕ݃պÑóÍjÊÇ(Ä”Áq¿¿½‹¼Ì»Š»·»R¼Q½©¾TÀAÂlÄÇÆOÉñ˳΄ÑaÔO×4Ú(ÝàúâÜå·è‰ëUîñÉónöùŸû+þ¤zÖ% k ¤×ü1<A>1!!#æ$Ã&•(g*0,õ-¹/u113å4š6E8õ9š;==Ý>t@BŽC E{FÞG*I`J~KsLHMëM\NNzNNaMLLÍJäH†F±Ch@ &@µA@CÀD4F•GëH#JEKFLMÍMHN„NƒN/N‹M„L KFIGCDAf=I9¼4Ò/Š*%Eby• Ï<ãüä÷5óõîëªç¢äâÙß Þ”ÜpÛÚ Ú¾Ù¤ÙÁÙÚxÚÛÂÛ“ÜÝÞœßÀàþáAã›äôåbçÇè?ê«ë!íˆîïïDñŽò¿óÚôÑõ¦öO÷Â÷ÿ÷ý÷¯÷÷,öðôRó]ñïdì^é!æ‘ââÞÛ×6ÓeÏÅË\ÈFÅŒÂ=À_¾ù¼¼™»Ÿ»¼è¼¾§¿€Á‘ÃÜÅPÈìÊŸÍoÐCÓ-ÖÙÜóÞÖáÁä™çuê<íðºògõ øŸú2ý¬ÿ&Œî> ‹ Ç ý)Gdqxyoa H".$&ã'¯)+F-/É0‚2<4ï5ž7M9ô:™<:>Ó?gAõBqDïEOG©HçI KLõL­M4NyN‡NBN¯M½LiK©I{GÔDºA">:¥5Í0–+&e Š£¹ðOíý×øôÁïÖëMè8åŠâCàaÞÛܧÛÅÚ&ÚË٨ٻÙ÷ÙdÚîÚ ÛiÜQÝOÞb߉à½áãVä±åç‚èôédëÖìAî¨ïñNò‚ó£ô õ~ö+÷°÷ó÷ÿ÷À÷:÷^ö0õ¥óÂñïèìøéÃæFã˜ßÄÛÝ×ôÓ#ÐsÌÉÚÅèÀ·¾7½5¼«»—»ó»»¼Ü½Z¿ Á'ÃiÅÖÇhÊÍßϹқՄØtÛ]ÞJá.äçåéµìxï4òåôˆ÷"ú±ü1ÿ­zÉ T •·åõÿí!Ì#°%ƒ'X)$+í,°.s0+2æ3š5K7ù8 :I<æ=…?A¥B)D¢E GeHªIÒJäKÇLMNrN…NSNÏMòL°KJëGaEZBÞ>í:‹6Æ1Ÿ,3'†!³Êã h÷þÔùõ›ð’ìûèÌå ã²à»Þ&ÝÛÛóÚ@ÚÞ٭ٵÙëÙOÚÑÚ}ÛAÜ"ÝÞ)ßNàáÂâäkåÒæ8è­éëŒìýí]ïÀð òEókômõSö ÷•÷è÷þ÷Ï÷V÷Œömõõó"òôïlíêcçøãOà…ܞصÔÞÐ)ͧÉtÆ‘ÃÁ¿~½_¼Á»“»Þ»‹¼£½ ¿ÃÀÃÂôÄ]ÇæÉ”ÌVÏ*ÒÕñ×åÚÊݼàžãæ[é(ìïî°ñ[ô ÷¡ù1ü¹þ.Ÿ[¤ ì Qw‘¦®´©£‡!t#N%+'ú(Í*’,Z.0Ø1Œ3H5ò6§8L:ö;•=5?Ç@YBÝCVEÉFHmI˜J®KLhMÿMaN„N`NíM#MñKdJYHèE÷B•?¸;o7¸2ª-F(§"Øô 2 „ÔúóõrñZí©éhæ’ã#áßoÝÜÛ`ÚðٲٵÙÝÙ;Ú¶ÚZÛÜóÜîÝóÞàFáâÔã%åŒæòçaéÑêEì°íïzðÇñ ó.ô=õ&öéöz÷Ù÷û÷Ú÷q÷µö©õAôòcðîí ëè¢ä á@ÝbÙwÕœÑÜÍTÊ ÇÄÁp¿Ã½¼Ú»•»É»f¼e½Ã¾hÀ^„ÄãÆgÉÌËΠÑ{Ôe×OÚ>Ý(àãòåËèŸëgî#ñÝó€ö#ù³û8þº"ä5 z ´ã *<MKL=,!#ò$Î& (r*9,.¿/‚173ï4¢6O8ü9¢;C=ã>x@ BCE{FÞG*I_JyKnLBMãMPN€NkNNOM2LµJÇHgF“CD@€)@ºAECÁD8F—GêH"JBKALMÆMÚ?jAùBwDíETG¦HçI KLñL¥M(NqNuN3N›M¨LRKŽI_G³D›A>û9ƒ5¨0w+ù%G m‰¢Ü=áýÎøôÁïÒëRè;åâNàhÞçܰÛÔÚ/ÚÜÙ²ÙÉÙÚnÚýÚ©ÛwÜ\ÝYÞlß‘àÇá ã^ä·åç†èúégë×ìGî£ïñEòóœô—õsö!÷÷æ÷è÷¬÷÷Föõ‰óñ]ïÅìÒéŸæ ãuß¡Û¾×ØÓÐaÌíÈÐÅäÀ¸¾:½A¼¶»¥»¼Ë¼õ½q¿7ÁCÃÅóÇ~Ê6ÍøÏÒÒ´ÕØ‰ÛtÞaáCä"çýéÃì’ïDò÷ô›÷3úÂüBÿ¼#‰Ú( g Ìë!  ö!Ý#³%”'`)0+ö,½.w0:2ë3£5S7ÿ8ª:N<î=‰?A«B,D¥EGbH«IÑJÛKÊL}MN`N{N@N¿MÙL›KìIÒG?E=B¼>Ê:k6Ÿ1,'g!–¯Ìû VêþÊùþô–ð’ìüèÓåãºàÆÞ,ÝïÛ÷ÚQÚéÙ¸ÙÇÙóÙ]ÚÜÚˆÛNÜ,Ý*Þ3ßYà‰áÌâäs娿@è°éëìûíbï»ð òBóbôhõGö÷‡÷Ö÷ë÷¸÷>÷qöOõ×óÿñÑïFíkê=çÒã,à_܀ؖÔÄÐ͘ÉaÆŽÃÁ¿}½j¼Ë»¤»ì»¢¼µ½$¿ÝÀÚÂÅvÇÊ®ÌnÏEÒ#Õ Ø÷ÚåÝÐà´ã–ælé>ìïÁñpô÷µù@üÊþ>®g¶ ø /`‚ ²ºÂ³°’!€#Y%4')Ó*Ÿ,e.0ä1•3N5ÿ6ª8X:û;ž=7?Ð@[BàC_EÁF(HeI™J«K—LbMóMXNuNTN×MMÜKFJBHÇEØBs?–;L7•2ˆ-!(‹"·Ûï! lúÿÅúêõpñUí¬élæ–ã.á!ß}Ý%Ü*ÛlÚþÙ¾ÙÃÙëÙEÚÆÚcÛ)ÜÝöÝßàPáŠâØã2åæþçaéÛêDì·íïzðÆñó,ô4õöÝöl÷È÷é÷Â÷Z÷—öõ ô_òBðÅíýêßç|ääàÝ>ÙZÕ~ÑÆÍ>ÊþÆĈÁn¿Æ½˜¼ä»¤»Û»w¼~½×¾…Às ÄüÆ‚É(ÌäιєÔ{×jÚPÝCà"ãæáè²ë{î8ñìó•ö2ùÅûIþÈ5›öB Š Áô6LV]TM5!!#ü$Ú&«(|*E, .Ì/‰1B3÷4«6W8:§;L=è>~@B“CEFÝG+I[JvKkL9MÛMENrN\NôM:MLœJ«HIFsC"@^<*8†3ˆ.8)¡#ãþB ˆÅûÛöJò!î]ê çä¢á‡ßÉÝgÜXÛÚÚÊÙ¾ÙäÙ2Ú¬ÚEÛÜÔÜÉÝÇÞèßáMâ™ãëäJæ´çé’êúëoíÒî5ð„ñÆòñóõïõ·öR÷µ÷å÷Ë÷p÷ÀöÄõiô»ò«ðHî‡ë~è%å˜áÚÝÿÙÖ?ÒyÎîÊ—Ç¡ÄÂÏ¿¾Ê¼¼ª»Ê»U¼E½’¾,ÀÂ0ćÆÉ£Ë_Î'Ñ ÔéÖÙÙÂܮߖâxåUè&ëñí²ðeóö°øEûÏýJ¾$€Ò  T‡­ÑáôöõéÙ ¾"¤$y&T("*ê+¶-r/41ì2¡4U68«9[;õ<™>.@ÁAFCÈD7FšGêHJAK:LM¼M1NoNaNN_M[LêJIÅFDÐ@=9t4Š/D*À$-@h ¤ÇüÑ÷(óíîëªç±äâïßޮ܆۸Ú$ÚÙÙ¾ÙÛÙ!Ú”Ú#ÛÞÛ©Ü—Ý—Þ­ß×à âWã¦äæjç×èDê·ë!íŽîíïDñ†ò¸óÉôÁõ’ö1÷¦÷Û÷Ñ÷„÷åö÷õ±ôóñÁîìéÏåJâ•Þ¿ÚÛÖûÒ3Ï—Ë=È+Å~Â7À`¾½!¼´»À»3¼½K¾Û¿¯ÁÇÃÆ…È ËÔÍŸÐ{ÓYÖIÙ/Ü ßâéäÆçœêfí*ðáòõ/øÈúNýÓÿC¯ ^ ¨ å Fb€‰–‰y `"E$ &ö'Ç)”+Y-/Û0—2L46¯7]9;¨à?qAùBDìEWG¤HèIK LéLžMNdNiNNŠMŽL:KsIAG•DyAß=Ö9a50W+Ó%) Ol‹Æ.ÐýÇø ô¿ïÒëRèAå–âVàtÞîÜÀÛÛÚBÚäÙÄÙÒÙÚyÚ Û´Û„ÜfÝdÞxߘàÔáãgä¿å%çèþékëÜìDî©ïþðHòyó–ô‘õgö÷Œ÷Õ÷Ó÷•÷÷$öõôbó}ñ7ï›ì¯étæýâL߀ۘ׽ÓëÏIÌÜÈÀÅü£À³¾D½F¼Å»µ»¼à¼¾†¿TÁ\ÚŠȚÊOÍÐìÒÌÕ·ØÛ‘Þsá]ä7çêÞì ï\òõ±÷Bú×üQÿÎ4˜ê5 x ©Ûø#1+) "ã#Å%š'm);+-Æ.ƒ0B2ö3«5\79³:S<÷=?$A¬B2D¥EG`H­IÉJßK»L}MNXNjN3N¨MÇL€KÓI²G%EBž>¥:E6€1Y,ñ&D!x“³å EÛþ¿ùõô”ðìéÓåãÀàÐÞ8Ý÷ÛÛ]ÚôÙÊÙÍÙÚeÚíÚ“Û[Ü7Ý5Þ>ßbà’áÖâ"ä}åÝæGèµé#ë‘ìÿíaï»ðò<ó^ô_õ=öôöy÷Ã÷Ù÷Ÿ÷'÷Sö3õ´óßñ¬ï íCêç©ãà;Ü^ØxÔ«Ðö̆ÉUÆÃÁ¿‚½s¼Ö»³»¼´¼Ð½7¿úÀïÂ.ÅŒÇ!ÊÁÌÏXÒ@Õ%ØÛþÝäàÌã­æ~éVìïØñô,÷ÄùTüÙþQ¾!xÅ  Aj•©ÂÇÌĹ£!‡#h%>')â*¦,p.*0ì1ž3X57µ8\:<¡=A?Ð@cBãC]EÉF!HhI–J¦K“LYMêMLNgNBNÅMúLÁK/J"H«E¶BS?p;*7r2a-(c"Ÿ»Ù \éÿ»úäõiñWí­énæ¡ã1á/ß„Ý4Ü3Û}ÚÚÑÙÌÙùÙUÚÎÚtÛ2Ü ÝÞ ß(àXá•âÞã9å–æèjéÜêIì¶íïwðÄñó"ô1õöÓö[÷º÷Ó÷­÷A÷|örõþó?òð¢íÖê¸çUäÁàõÜ"Ù5ÕiѪÍ.ÊíÆ ÄƒÁl¿Ê½ ¼î»´»ì»Œ¼’½ð¾œÀŽÂ»ÄÇžÉ?ÌÏÐѮԕ×ÚkÝTà?ãæùèÆëîNñýó¨öDùÕû]þ×E­T — Ð&DXdgdVD!*# %ä&¶(†*P,.×/’1K35±6`8 :¯;S=í>„@B”CE|FäG%I^JnKiL1MÓM8NgNKNãM$ML~J”H(FVCÿ?><8g3e.)ƒ#Âå* yö½ûÓöDòî`ê ç*ä¤á’ßÒÝtÜcÛÚÚÖÙÍÙíÙCÚµÚSÛ ÜàÜÑÝÖÞîßáUâ ãòäTæµç%é’êÿëqíÓî2ð…ñ¿òîóùôåõ¬öC÷¥÷Ó÷´÷Y÷§ö¦õJôšò‰ð"îeëTèåqá¶ÝÞÙøÕ#ÒbÎÖÊŒÇÄýÁË¿¾Ð¼ ¼¸»Ü»e¼]½¥¾GÀ+ÂGÄ¥ÆÉÄËpÎIÑÔ×ëÙÞÜÁß°âŠåjè;ëîÄðxó%öÂøWûßý[Ï3á % c”ºÞíÿóæ Ë"®$†&](+*÷+¿-z/A1ñ2­4\6 8¸9];=›>6@ÄALCÉD:F›GéH J;K9L M¶M&NbNRNýMLMELÑJùH¨FéC¬@=Ý8U4d/&*$å &S  ¾üÄ÷'óèîë­ç¶ä âõß'Þ¶Ü”ÛÂÚ6ÚàÙÒÙãÙ1ÚŸÚ1Ûé۴ܤݟ޻ßÜàâ^ã¯äæpçÝèHê¼ë#í‘îìïAñ…ò¯óÈôµõˆö$÷•÷Ê÷¼÷n÷ÉöÜõ‘ôðòôð›îñëðè«å$âqÞžÚºÖàÒÏË-ÈÅxÂ1Àf¾ ½-¼Á»Í»I¼%½d¾ò¿ÈÁàÃ*ÆŸÈ:ËîÍ·Ð’ÓtÖ_ÙIÜ3ßâåÚç°êzí=ðòò¡õ@ø×úcýÞÿX»n µ õ 'RrŠ˜¡œ—ƒ l"Q$)&(Ð) +b-*/à0¥2O46³7f9 ;¯å?vAþB€DñETG©HàIKLäL”MNXNYNNvMxL#KXI%GvDWA¿=´9>5_05+³% 1Ru³Èý¸ø ô¹ïÓëUèGåšâbà{ÞýÜÉÛéÚOÚñÙÑÙáÙÚ‹ÚÛÃÛŒÜsÝnނߥàÙáãmäÆå,ç‘èênëÞìGî§ïÿðDòuóô…õ`ö÷ƒ÷¾÷Â÷}÷ìö öÔôFóYñïxìˆéRæÓâ-ßZÛ~לÓÔÏ4ÌËȵÅôÂÀº¾C½T¼Ì»Ê»&¼ù¼ ¾Ÿ¿lÁrùŠȺÊeÍ.ÐÓåÕÌØ¹Û£ÞŒáoäOç êóì²ïoòõÃ÷RúèüaÿÝF¤ûD … ¹ç#1<:5! "ñ#Í%ª'r)H+ -Ò.‹0K2ÿ3´5d79·:_<ø=–?&A±B5D¨EGfH¤IÍJÕK¸LuMúMNNYN"N–M°LkK¶IšGEúAy>…:$6Y1<,Í&'![x›Ó 2Ïþ³ùòôð“ìÿèÛåãÌà×ÞEÝÜÛkÚÚÕÙÝÙÚsÚûÚœÛjÜ@ÝBÞFßmàœáÝâ-äååæKè¹é)ë’ìî`ïºðò9óXôVõ5öåöj÷µ÷Á÷÷ ÷:öõ’ó¿ñ…ïþìêóæƒãâßÜ<Ø\ÔÐãÌqÉHÆwà Á¿ˆ½y¼ã»Â»¼È¼å½Q¿ÁÃCÅ©Ç7ÊàÌ£ÏwÒUÕ=Ø*ÛÞáÞãÂæ–égì)ïèñ•ô>÷ÖùfüçþcÌ2†Ô  Oy¡ºÊØ×Ò±!“#r%K')í*²,v.80ó1«3`5 7¿8b: <¨=F?Ö@fBèC_EÌF!HhI’J£KLQMâM?N\N/N¶MáL®KJHŒE˜B.?Q;7O2A-à'F"}¤¾ö HÜÿ¯úÛõfñTí®éuæ¢ã<á8ßÝAÜ>ÛˆÚÚØÙÞÙÚaÚÝÚÛ?ÜÝÞß2àaáâéã@åæèpéßêNì·íïuðÄñüò ô%õöÆöN÷©÷¿÷™÷&÷döQõàóòøïí­ê–ç,äàÑÜÙÕKÑ”ÍÊáÆüÀÁh¿Ï½¦¼û»Â»û»¤¼¥½ ¿µÀ¥Â×Ä.ǸÉZÌÏëÑÅ԰דڅÝkàRã2æ éÚë¤î]ñô¹öUùèûlþèU¼f ¢ á3UbuqraP!7#%ñ&À(‘*[,.à/1T3 5¹6i8:¹;V=õ>ˆ@BœCEƒFÞG)IYJmK`L*MÊM,N]N4NÙMMôKeJuHF0Cá?<à7D3A.ô(b#£Èé eè°ûÉöCòîaêç,ä²á–ßáÝ{ÜrÛ¨Ú+ÚæÙØÙþÙMÚÃÚ_ÛÜîÜÛÝáÞüß ádâ£ãýäXæ¿ç(é—êìpíÖî1ð‚ñ¾òæóóôÛõ¡ö5÷•÷À÷Ÿ÷A÷‹ö‰õ+ôxòeðþí=ë2èÙäPáݾÙÛÕÒJÎÃÊ{ljÄôÁË¿¾Ú¼¼Ç»ê»~¼n½Á¾]ÀBÂhĵÆ;ÉÔË‘Î^Ñ6Ô×ÚñÜÛßÂâ£å}èPëîÛðˆó:öÑølûìýpÚGñ 3 r¢Éëü  ï ×"¸$”&e(:*ÿ+È-ˆ/D13´4e68»9h;=¦>7@ÌANCÌD=F—GíHJ:K1LM¬MNRNDNêM8M,LºJÛHFÇC@Ý<½8.4D/*$Æï8 ú²ü½÷óéîë´ç¸ä)âþß1ÞÁÜ¡ÛÏÚBÚðÙÜÙõÙ:Ú¯Ú<ÛõÛÃܪݯÞÂßèà#âcãºäæxçàèOê»ë(í‘îêïAñò¬ó¾ô¯õyö÷‚÷¹÷¨÷T÷°ö½õtôÍòÓðtîÍëÇè…åþáMÞ{Ú›ÖÂÒÏoËÈÅlÂ3Àd¾½3¼Ò»Ý»]¼:½|¾ÀãÁúÃAƾÈPË ÎÓШӎÖwÙ_ÜNß/âåîçÇêŒíSðó´õSøèúsýñÿdÏ)~ à 6`˜¤­«Ÿ“ u"^$4&(Ü)¨+o-1/ð0¨2`46Á7j9;µì?yAC‚DòEXG¥HãIÿJLÜLŽMNKNJNýM`MeLK>IGXD7A›=‘95?0+•%ç7^ ¶ý³øô¸ïÑëZèHå©âeàŠÞÝØÛõÚ\ÚÿÙÜÙïÙ-Ú“Ú&ÛËÛœÜ}Ýyތ߰àáá)ãqäÒå0ç™èêrëâìFîªïúðCòpó‡ôõPöûöp÷­÷¯÷d÷Ôöîõ·ô#ó6ñîîTì_é+æ®âß9ÛZ×€Ó¸Ï̹ȧÅì™Àº¾J½[¼Û»×»>¼ ½<¾µ¿‡ÁŽÃÏÅ@ÈÎÊ…ÍCÐ ÓüÕçØÏÛ½Þ á‰ä`ç;êíËï~ò.õÓ÷eúúürÿîT¶ T “ Éô/@GH?0 "þ#Ù%²'‚)N+-Ø.š0P2 4»5m79Á:`<>š?+A·B7D©EG`H¨IÆJÓK±LkMóM_:671,­&!>]ƒ½ "Áþªùëôˆð“ìéâå#ãÖààÞPÝÜÛyÚ ÚåÙçÙ"Ú€ÚÛ­ÛpÜRÝFÞXßrà¨áåâ3äŠåìæQè¾é,ë—ìîcï¸ðò5óPôPõ(öÛöY÷¥÷¬÷v÷ñööõôtó˜ñeïÖìùéÈæbãºßùÛØAÔqÐÍÌaÉ7ÆrÃÁ¿‰½…¼í»Ó»%¼Ý¼ú½j¿'Á&Ã^ÅÃÇQÊû̼ÏÒnÕVØ>Û+Þáöã׿©é}ì=ïúñ©ôN÷èùxüøþtÜC“å ! ]ˆªËÔçâßк!Ÿ#~%T'))õ*¼,‚.?0ý1²3h57Â8p: <µ=E?â@dBðC^EÎF HiIJžK‡LGMÛM/NPNN£MÌL•KùIëGnEwB?/;á6,2-À'&"a‡¦â 6Îÿ¥úÕõbñTí²évæ¬ãBáCß™ÝMÜIÛšÚÚíÙåÙÚkÚëÚŠÛLÜ"ÝÞ!ß;àjá¦âïãI墿èréåêNì¹íïsðÃñõòôõö¶öB÷”÷¬÷…÷ ÷Mö/õÅóöñØïVíŒêjç äsà´ÜÛØþÔ,Ñ„ÍÊׯðÃ{Ák¿Ð½±¼¼Ô» ¼¸¼¼½ ¿ÍÀÁÂíÄJÇÑÉuÌ1ÏÒÝÔÇ׮ژ݂àhãFæéðë³îuñ"ôËöhùöûþöfË!p ´ íC]t|€{o[!B#%û&Ë(*b,*.é/¥1]35Á6q8:¾;_=÷>@BŸCE„FÞG*IQJoKUL*M¹M&NIN*NÀMùL×KOJVHòEC¿?ø;¾73#.Ï(F#‚°Ï RÛ£ûÅö<òîcêç4ä·á£ßèÝŒÜ{Û¸Ú7ÚòÙçÙÚ]ÚÎÚoÛÜýÜäÝîÞà0ágâ¯ãå^æÅç,éêìwíÒî3ðñ¹òãóçôÖõ‘ö)÷…÷«÷‹÷&÷rölõ ôXò?ðÜíë èµä(ápÝ™ÙÀÕçÑ7άÊoÇ|ÄðÁÊ¿¾à¼"¼Ó»ý»‘¼ƒ½Ú¾rÀ_ÂÄÒÆRÉîË­ÎsÑTÔ2×Ú ÝïßÚâ·å’èdë+îëðóHöçøxûþ{îQ±û F }°Ùö  !ß"Æ$›&t(?* ,Ï-“/O13¾4n68Ç9j; =ª>?@ÌAUCÌD@FšGéHJ5K,LþL¢MNFN4N×M%ML¡JÀHoF©Cn@º<›8 4#/à)]$©Òù! pè©ü²÷óçîë¹ç½ä2âà;ÞÏܪÛàÚKÚÚèÙÚIÚºÚJÛÜÍܷݹÞËßôà)ânãÀäæ~çæèPêÁë*íîïï9ñ€ò¤ó¸ô£õpö ÷v÷¢÷•÷;÷—ö¡õRô¯ò­ðRî¥ë£è^åÙá*ÞXÚ}Ö¥ÒêÎYË È ÅiÂ.Ài¾½@¼Þ»î»o¼P½’¾!ÀûÁÄ]ÆÔÈmË"ÎëÐÃÓ¥ÖŒÙ{Ü^ßJâ(åèÖê¥í_ðóÀõhøöú†ýþÿwÛ9 Ð @p‹¥²··­› †"d$B&(ç)²+y-:/ø0²2h46É7r9;½í?ƒACˆDòEWG¨HÞIKüKÕL„MüM?N8NïMHMQLìJ$IèF:DA}=k9ù40í*t%ÊúH‰ÿªýªøþó³ïÖëYèSå«âpà”ÞÝãÛÛgÚÚëÙûÙ:Ú£Ú.ÛÛۤ܊݄ޗߵàïá+ã€äÕå5ç¢èêzëàìJî§ïüð=òmó€ôxõFöîö`÷÷—÷P÷¸öÔõ–ôóñÌî,ì;éæŠââÞÛ;×bÓ¢Ï̫ȚÅä˜À¹¾R½e¼ç»é»M¼"½O¾Ï¿ Á£ÃïÅTÈíÊ›Í`Ð5ÓÖûØèÛÑÞ¸á›äxçJêíÙï“òBõß÷|úý‡ÿúfà c Ÿ Ø$<NQXH> #" $å%¼'Ž)V+$-à.£0Y24Å5u79Æ:i<>Ÿ?2A¸B;D«EGcH¤IÃJÏK§LhMãM6N=NþMpMƒL9KƒI]GÇD¸A7>?:Þ51ù+†&î Hj¬ ·þ ùãôŠðŽìéâå-ãÝàëÞ]ÝÜ.Û‚ÚÚïÙøÙ,ÚÚÛ·Û~Ü\ÝQÞbß|à²áëâ<äåòæVèÂé0ë™ìîaï¸ðÿñ/óKôEõöÎöJ÷’÷™÷`÷×ööÔôWóuñ@ï³ìÑ鍿8ã™ßÖÛø×%ÔUйÌMÉ,ÆgÃÁ¿’½Š¼û»â»4¼ö¼ ¾†¿=ÁBÃuÅàÇhÊÍÕϨ҇ÕmØVÛ@Þ(á äëæÀéìRï ò¼ô_÷ûù…ü ÿ‚îN§ï 3 i–ºÔæîòéÜÇ!¨#Š%_'3)þ*È,‰.M02¼3q57Í8r:<·=L?å@kBñCbEÍF"HfIŽJ™KLAMÎM)N=NNŽM¸L~KÞIÏGOEWBí> ;Á62ü,ž'"Fh”Æ *¾ÿšúÑõ[ñUí±é}æ²ãKáJߥÝWÜZÛ¡Ú2ÚôÙõÙ"ÚwÚúÚ•ÛWÜ/Ý"Þ+ßEàuá¬âüãK宿èxéêêOì½íïrðÀñóòôõòõ®ö0÷‡÷š÷k÷öö-öõ¡óØñ°ï7í_êKçáãSàŽÜºØàÔÑkÍñÉÄÆëÃsÁj¿Ö½¶¼¼ß» ¼É¼Õ½4¿éÀÖ ÅbÇëÉÌLÏÒøÔÝ×ÆÚ¯Ý›à{ã]æ4éìÊî…ñ7ôÜözùüþx×3€ À ý)Pl‰Šxi!L#,%'×(§*m,5.ò/¯1g35Ë6x8!:Ã;g=þ>“@ B£CE…FáG%ITJgKULM¶MN=NN«MåLÁK3J=HÒEñB¢?Ð;¡7ú2ÿ-°(!#h»æ C˘û¾ö6òîcêç8äÁáªßõݕ܉ÛÃÚEÚÚòÙÚgÚÜÚyÛ.ÜÝòÝõÞà6árâ·ã åeæÊç4éžê ìtíØî/ð~ñ¶òÛóãôÊõ†ö÷r÷›÷s÷÷VöMõïó2ò!ð³íóêåçŽäáIÝ{ÙÕÍÑΙÊ`ÇnÄíÁÆ¿!¾å¼,¼ã»¼£¼œ½ë¾’ÀrÂÄêÆmÉ ÌÁΓÑgÔO×6ÚÝ àéâÒå¥èyë@îýð²óZöøøŠûþŽþb¿ U ŠÁä(''!ï"Ï$¨&~(K*,Û-›/Y13Ç4w6$8Ì9t;=°>D@ÑAXCÑD>FGåHJ0K(LöLšMN6N(NÂMMüKˆJ£HQF‹CH@œõ?…A CˆDöEXG§HÝIüJöKÒLxMõM1N)NÞM5M;LÒJ IÈFDñ@[=H9Õ4ù/È*V%¨Ý.wíý¡ø÷ó³ïÒë_èSå·âuà ÞÝòÛ ÛwÚÚ÷Ù ÚFÚ°Ú:ÛèÛ°Ü–ÝÞ¡ßÁàõá7ã†äÜå?ç£èê|ëåìHî«ï÷ð<ògóyôoõ=öàöP÷‹÷„÷8÷ ö¶õzôâòðð©îìéÛågâ¼ÞöÚ×IÓ…ÏóË™ÈÅÛ—À¹¾X½l¼ö»÷»c¼4½f¾ç¿¶ÁÁÃÆqÈ˳Í{ÐNÓ/ÖÙþÛèÞÐá¯äç`ê,íîï¦òSõô÷‹úý–ÿsÖ& r ° å1JZa_YI ."$î%Ç'š)a+*-ï.©0f24Í5{7*9É:s< >¦?6A¾B=D®EGdH£IÂJÉK£L_MÙM*N.NíM_MkL#KgIAG«D•A>:¼5ñ0Ó+j&É +R— ÿ¦þ˜ùÜô„ð’ìéêå2ãåàöÞeÝ'Ü7Û’Ú)ÚþÙÚ9ÚšÚÛÅÛ‡ÜiÝZÞn߃à½áóâDä˜åùæ\èÉé.ë¢ìÿídï¶ðùñ/óAô@õöÀö>÷}÷ˆ÷G÷Àöèõ¹ô4óUñïì«é‚æãx߯ÛÜ×Ô@ПÌ@ÉÆ`ÃþÀ¿–½“¼¼ò»F¼½&¾˜¿ZÁXÃ’ÅøÇƒÊ/ÍîÏÂÒ¢Õ‚ØpÛVÞ?á#äýæÖé ìhïòÒôn÷ú–üÿ‘þ`² ? x¢Êàõûý÷æÓ!¶#•%j'>)+Ô,“.W0 2Ç3v5*7Ñ8}:<¾=S?é@oBôCeEÏF"HeIŠJ•K|L9MÆMN/NþM{M£LgKÄI³G0E7BÍ>ç:Ÿ6æ1Û,|'é!#Swµ ­ÿ”úÄõZñTí±é…æ³ãWáQß³Ý`ÜiÛªÚ@ÚÚÚ0ÚƒÚÛ£Û`Ü=Ý*Þ8ßMà€á³âäOå·æè‚ééêWìºíïsð»ñðò ô õìõ ö"÷v÷…÷W÷Üöö÷ô‚ó¸ñïí>ê çÂã+àmÜšØÁÔûÐOÍåɲÆåÃkÁm¿×½À¼¼ï»0¼à¼ä½S¿ùÀö ÅÇʧÌhÏ3ÒÕõ×ÞÚÆÝ±àãtæEéìÚî™ñIôíöùü¡þ‡èCŒ Ó <Z~‰š˜•‡r!Z#5%'ã(¯*{,;.þ/¸1p3#5Ó6~8):Ì;k=?—@%B¥C E…FáG$ITJ`KRLM­M N/N N›MÍL¬KJ!H³EÔB{?¶;x7Ú2Ú-Ž(#Hx›× .»û±ö4òîeêç?äÈá´ßÞŸÜ•ÛÑÚPÚÚÿÙ#ÚvÚçÚ…Û=ÜÝÞüÞà?á|â¿ãåmæÐç8é£ê ìtíÙî.ð|ñ±òÖóÛô¿õ~ö ÷f÷„÷_÷ùö;ö2õÎóòðíÎê¾çjäàà%Ý\Ù|Õ¶Ñ·ÊQÇfÄåÁÇ¿"¾ï¼6¼ò»¼·¼°½¿£À“Â¯Ä Ç„É$ÌÞΨфÔc×PÚ4Ý"àãååºèŒëTîñÅókö ùšû$þšoÏ b šÍñ$360*!þ"Ö$·&†(X*,ç-£/c13Ð4}6.8Ó9{;=¶>H@ÕA\CÒDAFžGãHJ)K%LîLMýM(NN³MüLæKqJ…H7FhC-@vâàOÞçÜÂÛ÷ÚhÚÚÚÚdÚÒÚcÛÜåÜÍÝÎÞßßá9âãÍä(æŒçîè]êÅë-í“îéï<ñsòžó¦ô”õVöñöQ÷ƒ÷e÷÷_ökõônògð î[ëVèåáçÝÚBÖjÒ½Î/ËíÇïÄ^Â(Àn¾#½T¼÷»¼¼½»¾TÀ,ÂEÄ’ÆÉ£ËTÎÑöÓÔÖ¿Ù¥ÜßtâTå/èþêËí‡ð@óçõ‰øû§ý —úZ§ ñ -^ЦÀÊÔÍdz ›"}$U&/(ú)É+Œ-O/ 1Ä2y4*6Ù7€9(;Çú?ˆAC‹D÷E\G¡HßIõJõKÇLsMæM'NNÌM#M#L½JîH­FÿCÑ@;='9³4×/ª*4%Áê`âý™øóó¯ïÕëaè[å»â€à¨Þ'ÝüÛÛÚ(ÚÚÚSÚ¼ÚGÛò۽ܞݞަßÏàûáAã‹äæåBçªèêëçìKî¦ïøð7òbórôfõ0öÓöB÷u÷s÷÷ˆö›õZôÁòÏðƒîäëñè·åCâ˜ÞÕÚúÖ.ÓkÏâˆȃÅ×ÂÀÀ¾Y½x¼¼¼u¼J½z¾ÀÊÁßÃÆÈËÎÍ“ÐeÓIÖ+ÙÜýÞäáÇä çtêBíþïºòdõøžú'ý¥ÿƒã7 ~ ¿ ò?VglmcU <"$ü%Ð'£)l+5-õ.µ0n2#4Õ5ƒ7/9Ó:w<>©?;AÁB?D²EGeHžIÀJÄKLTMÒMN NÞMFM\LKOI$G‹DxAô=ü9—5Ò0±+J&¬ å?€ ò˜þùØôð’ìéòå7ãðàßpÝ4ÜDÛžÚ7Ú ÚÚHÚ¥Ú,ÛÏÛ•ÜrÝgÞuß’àÀáãGä¤åúæfèÆé;ëœìî`ï·ðöñ)ó;ô7õ ö±ö.÷l÷s÷2÷¦öËõœôó5ñ÷îkì…é\æïâQßÛ»×çÓ&ÐŒÌ+ÉÆUÃüÀ¿›½œ¼¼þ»\¼½<¾³¿mÁwæÅÈ™ÊIÍÐÛÒ·ÕŸØ‚ÛqÞRá:äçìé²ì{ï.òãô÷ú¨ü+ÿ£ nà O †°Øê òá!¾#¡%u'I)+ß,š.a02Ð3€507Û8‚:%<À=\?ê@wBôCiEÎF#HbIˆJ‘KuL2MºMN!NîMjMŠLRK§I™GEB«>È:{6Ã1º,Z'Ë!6cŸ  ÿŠú½õYñSí´éˆæ¼ã^á^ߺÝpÜrÛ¹ÚMÚ ÚÚ:Ú‘ÚÛ®ÛnÜFÝ8Þ>ßZà„áÂâ ä[åºæè„éïêXì¼í!ïlð¿ñåò ôõáõ’ö÷b÷t÷@÷ÃöúõÚôbó–ñiïðìêüæŸãàPÜwØ¥ÔáÐ:ÍÐÉ©Æ×ÃlÁk¿Ý½Æ¼*¼ü»E¼ï¼¾b¿ÁÃ>Å•Ç ÊÁÌÏOÒ(ÕØóÚàÝÂà«ã„æ[é.ìëî­ñXô÷šù-ü­þ)”ùNž Ü Ekˆ•¨¢¤€!a#D%'ï(¹*‚,H.0Ã1w3-5Ù6‰8-:Õ;n= ?œ@(B«CEŒFÝG&IOJ\KLL M¢MN NûMˆMºL•KÿIH–E´B]?“;V7º2¶-r(á"/Y‰¿ ¬‡û«ö/òîcê%çBäÑá¾ß Þ­Ü¡ÛÜÚ`ÚÚÚ2ÚÚöÚÛFÜÝÞ ß!àJá‚âÈãåtæÖç=é§êìxí×î0ðwñ¯òÐóÓôµõqöüöT÷s÷H÷àö"öõ²óîñÛïlí¦êœçBä¼àÝ9ÙaÕ˜ÑïÍsÊCÇ[ÄßÁÅ¿&¾ö¼B¼ÿ»0¼Ë¼Å½¿¾À©ÂÊÄ"ÇžÉ?ÌõÎÂÑœÔ|×dÚNÝ3àã÷åÐè ëgî!ñØó}öù­û1þ­Ü) p ¨Ûÿ1?A?2!#ä$À&(d*',ñ-­/j1#3Õ4ˆ628Ü9;=»>L@ÜA]CÖDCF›GçHJ)KLæLŠMíMNN¡MéLÐKUJnHFLC @W<38£3½.x)$J…©ä 6½…üœ÷ óáîëÂçÏäHâ à_ÞêÜ×ÛüÚyÚ#ÚÚ(ÚqÚÝÚpÛ#ÜïÜÝÝÒÞîß áFâ†ã×ä.æç÷è^êÉë2íîíï7ñqò˜ó ô‰õMöáöD÷o÷Q÷øöEöOõôóNòBðéí3ë7èëäoá¾ÝôÙ#ÖPÒ¤ÎËÝÇçÄWÂ%Às¾'½a¼¼#¼¥¼“½Ó¾kÀFÂ_Ä«Æ!ɺËnÎ6Ñ ÔîÖÔٽܥߊâiåBèëÝí›ðRó÷õœø+û¶ý2£ d» û >k—´ËÚÝÜÐÀ ¦"ˆ$b&8(*Ô+“-Y/1Ì2„4/6â7†9/;Ð@ˆAC‹DûEYG¦HÙIõJìKÄLhMÞMN N¹MML¢JÖHFßC´@=9‘4´/‰*%m§ÒVÉŠýøìó¯ïÓëeè`åÁâŒà°Þ4ÝÜ(ÛÚ5ÚÚ$Ú`ÚÉÚRÛÜÇܫݦ޳ßÖàâGã•äêåJç°èê„ëæìNî¦ïõð4ò^ójô_õ#öÇö1÷f÷\÷÷nö~õ=ô¡ò«ðdî¹ëÒèŽåâuÞ³ÚÜÖÓUÏÈË{ÈtÅÐÂÀ¾¾b½¼¼¼ˆ¼]½”¾ÀèÁòÃ8ƦÈ8ËçͬÐÓaÖCÙ-ÜßøáÝäµçŠêQíðÈòxõø­ú9ýµÿ-“òF Œ Î þ-Jfq|wr] J")$&Ü'®)u+C-ú.Ã0s2,4á5ˆ7:9Ù:}<>°?=AÉBAD´EGcHžI¿J»KLFMÌM NNÍM5MBLóJ/IGfD_AÌ=Þ9q5±0Ž++&‰ Êö%o ÝŽþ€ùÔô|ð‘ì éòå@ã÷àß{Ý?ÜQÛ©ÚFÚÚÚTÚ±Ú:ÛÛ۠܀ÝpހߜàÉá ãPä¨åçièÐé9ë¤ìîfï²ðöñ"ó8ô,õö¦ö÷\÷_÷÷ö±õ}ôöòñÚî?ìgé1æÏâ+ßnÛš×ËÓ ÐzÌÉ ÆIÃûÀ¿£½£¼!¼¼k¼2½P¾Ê¿†ÁÃÁÅ-ȵÊbÍ"ÐóÒÐմ؜ۅÞjáNä(çýéÉì‹ïEòñô–÷,ú»ü;ÿ²|Ó ^ ’Àâûþë!Ë#«%'Q)+å,©.e0"2Ö3‰5:7Þ8:(<Ê=_?ò@wBûChEÒF#H`I‡JŒKoL*M²MNNÜMWMwL6K‘IyGøDôAŽ>¢:Y6£1”,<'©!ëIŠ ô•ÿ|ú·õSñQí¶éæ¿ãháeßÅÝ|ÜzÛÌÚSÚ!ÚÚKÚÚÛºÛyÜSÝBÞJßaà’áÆâäd彿%è‡éòê]ì½í ïqðµñéòôþôÖõˆö÷S÷_÷+÷ªöÝõ½ôCórñIïÆìôéÖævãâß)ÜW؉ÔÂÐ&ͼɚÆÏÃfÁj¿á½Ï¼4¼ ¼T¼½¾~¿-Á(ÃPŶÇ4ÊÞÌ—ÏgÒBÕ&Ø ÛöÝÚà¿ã™æté<ìï¼ñnô÷¬ù=üÀþ7¦`« í 'Tv˜¢¶®®žŒ!l#P%"'ú(Å*Œ,R.0È1…3/5é6Œ87:Ù;w=?£@+B­C"EŠFáG$IKJ\KAL M—MöMNêMtM¨LyKéIèGyE•B:?o;67’2›-F(É" Am¨ žxû¤ö(òîdê(çGäÙáÅßÞ·Ü­ÛéÚjÚ(ÚÚ?ÚÚÛŸÛNÜ+ÝÞß+àQáŽâÍã#åyæÜçCé©êìvíÜî+ðxñ¬òÉóÎô©õhöíöE÷^÷5÷Çöööô’óÎñ¸ïGí„êtç!ä—àáÜÙAÕÑÖÍbÊ3ÇQÄÛÁÿ*¾ü¼L¼ ¼B¼Ü¼Ý½2¿ÕÀÄÂâÄ=ǹÉVÌÏØÑ·Ô”×}ÚcÝLà.ãæâè¶ëyî7ñëóö/ùºûFþ»0í7 ~ ºå)@MLM;.!#ñ$É&(k*5,÷-»/o123Ù4“698ä9ˆ;#=Ã>P@âAaCØDEFGåHJ(KLäL{MçMNøMŒMÖL¸K=JSHùE,Cê?4<8„3•.\)Ú#0d’É %«xü’÷óÝîëÂçÕäOâ*àfÞùÜÞÛÛÚ3ÚÚ6Ú}ÚìÚ{Û0ÜûÜäÝãÞóßáMâ‘ãÝä7æ•çûèdêËë3í’îìï5ñlò–ó•ô„õ?öÖö4÷[÷=÷ßö/ö/õØó*ò#ðÃíëèÇäIášÝÕÙÿÕ9҆ΠËÉÇßÄMÂ'Àq¾1½h¼¼1¼º¼¦½ì¾‚À^ÂyÄÅÆ=ÉÒËŠÎNÑ(Ô×ëÙÔܼߡâ~åYè'ëòí°ðbó ö«ø>ûÆýD´vÇ Jz£ÅÖèêçßÈ ¶"$r&>(*Ù+¢-_/1Ô2Œ496é7Ž97;Ó@‘ACDFVG§H×IñJéK»LaMÓM NþM§MüLõKŒJ¸HuF¾C’@ö<ä8l4’/e*ó$O‡·ì =½xý†øåó¬ïÓëgèdåÊâà½Þ=ÝÜ4Û›ÚAÚ Ú/ÚnÚÔÚ_Û ÜÒܶݰ޾ßßàâNãžäðåRç³èê…ëëìMî§ïôð1òXófôSõö¸ö"÷T÷F÷óöSöcõôƒò‰ð>î—ë¨èlåùáQÞÚ¾ÖñÒ>Ï´ËhÈiÅɉÀþg½Š¼¼'¼™¼t½§¾1ÀþÁÄPÆÁÈQËÎÅИÓxÖ\ÙCÜ-ßâðäÌçêeí+ðØòŽõ$øÄúEýËÿ:¥U Û :Zqˆ„~i V"3$&ã'»)+I- /Å0‚244æ5”7>9á:‡<>·?CAËBEDµEGbHŸIºJ¸K–L>MÂMNN»M!M-L×JIìFLD8A°=¶9Q5Š0m+&k ¬ÙU Òzþ|ùÆô}ðŒìéóåHãýà߆ÝJÜ\Û¹ÚNÚ%Ú*ÚaÚ¾ÚDÛé۪܊Ý}ވߨàÑáãWä°å çmè×é;ë§ìîcï³ðòñ!ó/ô(õñõö÷M÷J÷÷vö“õaôÒòòð°î ì;鿦â ßKÛy×±ÓîÏeÌÉþÅ?ÃøÀ¿¥½®¼*¼ ¼|¼E½h¾à¿¢Á¥ÃÝÅGÈÏÊ}Í8ÐÓåÕÑØ±ÛÞ‚ácä>çêÝìŸïYòõª÷=úÎüLÿÃ-â, l ¡Ðî & ö!Õ#¹%‡'a)'+ñ,².o0+2à3‘5B7è8‘:2<Î=h?ô@BûCoEÑF"HaIJ‹KgL#M¦MùMNÍMDMaL!KuI_GÕDÛAd>‰:.6„1o,'‡!Ì.w à…ÿqú°õLñQí·éŽæÈãlápßÏÝ…ÜŠÛÔÚcÚ*Ú(ÚUÚ­Ú'ÛÈÛ‚Ü`ÝIÞYßhàœáÏâäj寿(èŽé÷ê\ìÄíïqð¶ñàòôñôÑõxöüö>÷O÷÷•öÂõŸô%óPñ%ï£ìÏ鱿Sã¼ßÜ8ØiÔªÐÍ¨ÉÆÅÃaÁj¿æ½Õ¼A¼¼h¼½.¾¿JÁ<ÃoÅËÇPÊ÷̲πÒ[Õ:Ø'Û ÞôàÓã°æ†éSìïÒñ~ô'÷¾ùNüÎþIµo¸ ý 4b† ¶»À¹ª˜!x#Y%/')Î*˜,[.0Ö1‡3@5é6›8::ã;{=?¥@3B¯C&E‹FãG IMJTK@LMMïMNáM]M•LcKÌIÏGZEuB?M;7s2r-,(¡"ï#T” ÷kûö$òîhê&çQäÜáÒßÞÆÜ¶ÛøÚuÚ4Ú)ÚHÚžÚ ÛªÛ_Ü2ÝÞß8à[á–âÖã)åæãçEé±êì}í×î0ðsñ¨òÆóÄô£õZöàö4÷M÷÷³öêõÜôpó°ñ’ï'íYêRçøãsà¾ÜöØ#ÕeÑ»ÍTÊÇNÄÐÁÅ¿+¾½W¼¼S¼ï¼ó½H¿ïÀÛÂýÄWÇÑÉrÌ)ÏóÑÎԮדÚ}ÝaàFã"æüèÅë’îFñþó ö@ùÍûVþÌ?ŸûH Œ Æö;J\WZH8!#ü$Õ&¨(v*@,.Ã/}163è4˜6B8ì9;.=Æ>X@åAdCÜDGF›GçHJ%KLÜLtMÛMNèM|MÀL¢K$J6HÛE CÈ?<ì7]3t.7)¼#Iu´ œiüŠ÷ýòÞîëÇçÚäTâ4àoÞÝêÛÛŽÚ?Ú(ÚCÚ‰ÚøÚ‡Û=ÜÝôÝèÞà"áWâ™ãää?æšçédêÔë2í–îëï2ñnòŠó–ôvõ6öÈö$÷J÷(÷Èööõ¸ó òðŸíìêèç¢ä#áxݳÙáÕÒoÎøÊ»ÇÓÄEÂ(Ào¾;½o¼"¼B¼Í¼º½¿•À}ÂÄàÆVÉîË¡ÎkÑ=Ô!×ÚîÜÑßµâ—åkè>ëîÀðyóö¼øRûÕýVÆ(‰Ô  X‰²Ñåô÷ôéØ ¼"¡$w&O(*é+§-o/$1á2’4C6ñ7–9>;Û @”ACDFZG£HÙIéJèK°L[MÆMÿMíM–MèLÞKuJšHZFCs@Ñ<Â8J4n/D*Ð$1jžÔ )­ký|øßó§ïÔëhèhåÐâ™àÇÞGÝÜ>ÛªÚKÚ.Ú:Ú|ÚßÚnÛÜàÜÁݹÞÊßçàâVã¥äùåVç»èê‹ëëìQî¦ïòð/òSó]ôMõö¬ö÷C÷1÷Üö:öFõô`òhðîuë€èIåÑá0ÞlÚ¡ÖÔÒ$Ï£ËTÈažŠÀ¾l½”¼(¼:¼©¼Œ½»¾KÀÂ'ÄkÆÙÈnËÎâЮӓÖrÙ^ÜAß)âåãç±êzí=ðíòžõ;øÑúZýØÿN²a ­ ê JdŒ”“‡x `"A$&ó'Á)+R-/Ï0Œ2:4ó5˜7I9æ:޾?EAÐBHD·EGeH™IºJ±K‘L6M¸MòM÷M©M ML½JIÎF-DAŽ=”9.5h0I+é%J ¾øA Àkþuù¼ô}ðˆìéøåNãáßÝYÜgÛÃÚ^Ú/Ú;ÚkÚÌÚQÛô۸ܔ݇ޖ߮àÞáã`ä¹åçxèÖéDë¤ì îcï°ðòñó-ôõìõŽöÿö<÷4÷ïö[öyõBô¶òÊð“îøëéêåâæÞ*Û[בÓÚÏKÌ÷ÈîÅ:ÃôÀ¿«½·¼7¼1¼¼[½}¾÷¿¼Á¼ÃúÅ^ÈëÊ–ÍSÐ'ÓÿÕèØÈÛµÞ•ázäQç(êðì³ïjòõ»÷PúÜü]ÿÓ=ï< z °Ú*-0& "æ#½%š'e)6+ø,½.y042è3›5G7ó8—::<Ô=l?ù@BDoEÒF%H[I‚JƒKdLMžMêMøM»M1MKLK[IAG¸D·AG>a:6[1R,÷&j!®æc Îxÿfú©õJñLí½éæÒãtáwßÝÝÜ—ÛáÚoÚ9Ú3ÚeÚ´Ú9ÛÐÛ”ÜeÝZÞ]ßvà£áÚâ!äråÍæ.è“éúê`ìÅíïpð±ñßòõóîôÂõpöèö2÷6÷ÿözö§õôó.ñï}ì¨éŽæ(ãžßàÛØIÔ“ÐõÌœÉ|ƽÃ^Ái¿é½á¼I¼,¼v¼/½?¾­¿^ÁZÆÅèÇjÊÍÊÏœÒoÕYØ8Û'ÞáìãÅæ›égì*ïäñ”ô5÷Òù]üâþZÃ)|È  >t‘°ÁËÉɳ¥!„#e%:')Ù*£,c.$0Ü1”3E5õ6Ÿ8D:é;‚=?­@4BµC'E‹FãG IIJQK:LöL†MßMöMÌMOM|LMK³I²G=EUBø>-;ì6R2N- (‚"Ð 9 ãƒ_û•öòîiê+çVäæáØß*ÞÌÜÆÛÛ…ÚAÚ3Ú[Ú¢ÚÛ²ÛkÜ=Ý(Þ*ß?àfáœââã-勿ãçPé°êì|íÚî.ðpñ¥ò¾ó½ô™õMöÓö$÷6÷ ÷•öÔõ¼ôSóŒñsïüì=ê%çÚãJàŸÜÔØ ÕFѬÍ8ÊÇ>ÄÍÁÆ¿-¾ ½c¼*¼c¼½¾^¿ ÁïÂÅlÇíÉ‹ÌDÏ ÒçÔÄ×­Ú’ÝyàZã7æéÚë¤îZñô²öRùßûfþÞN¯ T Ÿ Ï %JXej`Y@!)#%ß&´(*J, .Ë/ˆ1=3ò4Ÿ6K8ó9”;4=Ê>]@èAjCÝDJF›GçH J K LÓLlMÐMóMÙMjM«L‹K JH¿EíB¨?ï;Ì7:3R.)œ#ñ.]  üŒbü|÷óÓî ëÆçáä[â=àyÞÝôÛ&ÛœÚKÚ6ÚMÚ˜ÚÛ˜ÛCÜÝúÝ÷Þ à*ábâœãñäAæ¤çéjêÖë4í˜îèï2ñfò‰óˆôqõ)ö¸ö÷3÷÷°öùõøôšóéñÞï|íÇêÂçäüàXÝÙÃÕÒYÎäÊ«ÇÊÄ>Â(Àt¾@½{¼1¼Q¼â¼Î½¿°À”§ÄûÆmÉ Ì»ÎƒÑVÔ9×ÚÝêßÊâ¬å€èQëîÕðˆó3öËødûåýgÓ:–ã - f•ÂÙ÷ýýøà Í"¨$…&W('*ï+µ-u//1é2›4L6÷7Ÿ9B;ã@˜AC”DF[G¢HÕIéJàK­LNM¿MîMâMM×LÇK\JH:FCT@¯<¢8%4M/"*±$P‚¿ _ýrøÙó¤ïÕëkènå×â¡àÒÞOÝ.ÜIÛ¸ÚVÚ<ÚHÚ‡ÚîÚwÛ%ÜèÜÎÝÄÞÑßôà!â`ã®äüå`ç¿è#êŽëïìOî©ïîð-òKóZô@õ ö›ö÷*÷"÷Áö"ö+õàó@òGðóíSëYè&å­áÞLÚ‚Ö¹ÒÏŠËIÈRź†Àƾr½Ÿ¼5¼I¼½¼ž½Ô¾_À3Â>Ä…ÆòȆË6ÎõÐÍÓ¨Ö‹ÙsÜXß>âåöçÅêíNðó«õOøàúlýèÿ]À$n ¾ ó .RuŒ˜¡ž“… i"M$'&ü'Í)–+^-/Ý02H4ö5¤7M9ð:<+>¿?NAÏBODµEG`H›I´J®KˆL0MªMëMâMžMõLL¤JçH°FDõ@p=o95C0-+Ä%0 q¨Þ1 ­bþhùºôvðŒìéüåWã á(ßšÝaÜwÛÏÚkÚ>ÚEÚyÚÙÚ[ÛÜÁܡݑޞߺàäá%ãgä¿åçzèÝéFë©ì îbï¯ðíñó$ôõàõ‚öîö*÷ ÷ÙöAö^õ"ô–òªðoîÓë÷èÀåaâ¾Þ Û<×tÓÁÏ6ÌçÈâÅ3ÃðÀ¿°½Á¼C¼@¼¢¼l½–¾ÀÓÁØÃÆ{È˯ÍmÐ?ÓÖýØáÛÊÞ­áŒälç6ê íÂïò(õË÷dúêüoÿáK®üJ ‰ »ë $59=2# "ï#Ë%£'o)A+-Ê.0?2î3¥5N7ú8:@<Ú=r?ü@ˆBþCtEÑF"H_IzJƒKYLM’MßMéMªMM5LñJAI&G™D›A#>B:î5;1/,Ù&K!’ÍýP ¾jÿ^ú¡õGñNí½é•æÖã|áƒßæÝ™Ü¥ÛêÚ€ÚBÚCÚnÚÅÚAÛßÛœÜrÝeÞfß‚àªáãâ(ä{åÑæ4è—éþêbìÆíïoð­ñÛòîóçôµõdöÚö÷%÷çöbö‹õdôæò ñàîYì…éfæ ãußÄÛ÷×1ÔuÐå̇ÉrÆ´ÃYÁi¿ð½æ¼Y¼7¼‹¼@½V¾Â¿wÁqáÅÈ…Ê)ÍãϳҋÕmØRÛ9Þáä׿±ézì<ïùñ¢ôK÷àùoüñþjÒ:ˆÛ  Ty¤ºÏÖØÑí!’#n%G')ç*¨,q.*0å1Ÿ3K5þ6¥8L:í;‹=?³@8B·C*EŒFãGIFJLK3LðLzMÕMæM¾M:MjL2KœI•GE6B×> ;Í6+24-ä'i"°ñ#i ÖqYû‹öòîhê1ç[äîáäß0ÞÝÜÎÛÛ‘ÚNÚ@ÚgÚ±Ú)ÛÀÛvÜHÝ2Þ5ßIàná§âåã:åŒæîçPé¸êì~íÛî*ðrñòºó³ô’õ>öÇö÷%÷øö{ö»õžô4ómñNïÝìêç³ã)à|ܶØêÔ/Ñ’Í+ÊÇ7ÄÈÁÿ3¾½q¼5¼v¼½¾z¿Á Ã3ŇÇÊ¥Ì[Ï&ÒþÔÛ×ÄÚ¨ÝànãOæ éòë´îoñ ôÆöaùðûuþí^Àf ¨ ã7SgqtneJ!6#%ë&½(Š*R,.Ô/‘1E3ú4§6R8ú9›;9=Ò>`@îAkCâDGFŸGáH JKLÌLaMÃMèMÆMZM•LvKïIH EÎBˆ?Î;¨730.ö(|#ÕH‰ ëTüy÷÷ò×îëÏçãäfâCà…ÞÝÜ3Û¨ÚZÚAÚ_Ú¡ÚÛŸÛTÜÝÞÿÞà3ákâ¥ã÷äHæªç épê×ë6í˜îæï1ñaò„óôhõö­ö÷#÷þöšöÞõÛô{óÇñ¾ïTí¦ê›ç\äÚà2ÝtÙ¢ÕêÑ@ÎÒÊÇ¿Ä;Â"À{¾D½‰¼<¼c¼ó¼å½/¿ÍÀ¥ÂÉÄÇÉÌÖΙÑqÔP×1ÚÝýßââ¿å–èdë-îæðœóBöâøoûûýråI¦ñ = p©Èîÿ  þò Ñ"¹$Š&f(-*þ+º-‚/51ô2£4R68¤9K;è<>@A!C—DF[G¡HÓIåJÚK¥LGM±MäMÎMtM¿L²KBJfHFcC0@’<}84+/*’$ó5iª ŽTýjøÕó£ïÔëqèråßâ¬àØÞ`Ý5ÜZÛÁÚgÚFÚUÚ–ÚøÚ…Û0ÜôÜÚÝËÞßßúà+âjã²äæcçÅè'ê‘ëðìRî¤ïðð#òMóLô=õõõ”öñö÷÷°ööõÀó ò%ðÑí,ë6èþä‹áéÝ-ÚbÖžÒøÎuË<ÈGŲ‡Àþ~½¤¼G¼W¼Ñ¼³½ë¾xÀHÂ[ÄÆÉžËNÎÑæÓ½Ö¥ÙˆÜpßPâ4åèÞê í`ðó¾õ^øóúzýúÿjÔ.‚ È :^„–¨ª¬ž u"W$2&(Ö)¢+e-&/ã0›2O46ª7S9ø:•<2>Ã?QAÔBOD¸EG`H˜I®J­K{L+MžMÛM×M†MæLëKŽJÊH•FòCÖ@N=O9ë4%0+©% WÈ œYþ^ù¶ôsðìéæ_ãá3ߥÝoÜ€ÛàÚtÚNÚOÚ‰ÚäÚiÛ ÜÍÜ«ÝÞ©ßÁàðá)ãsäÀå!ç|èãéIë©ìî`ï®ðéñóô õÑõvöÞö÷ ÷¿ö)ö@õôsò‹ðGî²ëÏèå=âšÞêÚ×YÓªÏ"Ì×ÈÕÅ-ÃìÀ¿¶½É¼S¼M¼·¼€½¬¾'ÀëÁòÃ+Æ‘ÈËÇ͆ÐWÓ0ÖÙöÛâÞÁá£ä}çMêíØïò:õÝ÷súüüÿñ\» V ˜ Éø1@HG>0 "ü#Ô%­'|)H+-Ï.‹0G2ø3­5V79¥:E<à=u?A‰BDsEÔF!H[I{JyKWLMŠMÑMÜM—M ML×J(IG|DyA> :Ë51,µ&-!v±é; ¬`ÿQúõEñLíÁéšæÛã‰áŠßñݨܭÛþÚ‰ÚRÚPÚ|ÚÒÚNÛìÛ¨ÜÝnÞsߊàµáìâ0äƒåÖæ;èšéëeìÆíïoð§ñÚòåóßô­õTöÌö÷÷ÔöEösõEôÅòìð»î6ì`éBæáâUßžÛÛ×Ô^ÐÏÌvÉeÆ­ÃVÁk¿ô½ñ¼c¼K¼š¼W½k¾Û¿ÁŒÃ¸ÅÈÊCÍþÏËÒ¤Õ†ØhÛQÞ4áäðæÂéìOï ò´ô]÷ñùüÿyãF›æ ' ]«Í×ãçÙѸ!›#{%N'&)é*º,s.70î1¥3U57¬8S:ô;‘=%?¶@:B»C*EFÞG IAJJK*LêLoMÉMØM¬M)MTLK‚IxGEB¹>ç:¬6 2-È'D"™ÓU ÅeOûƒöòîoê4çbäøáëß?ÞæÜÜÛÛ›Ú_ÚMÚtÚ¾Ú7ÛÉÛ†ÜPÝBÞ<ßTàyá®âðã?哿õçSé¼êìƒí×î+ðlñ›ò²ó®ôƒõ6ö´ö÷÷áödöžõ‚ôóKñ-ïµìóéÜæŽãàXÜ–ØÐÔÑÍÊüÆ/ÄÃÁÆ¿5¾½x¼I¼…¼-½1¾¿8Á%ÃKÅ£ÇÊÀÌtÏ?ÒÕöרÚÂÝ£à†ãbæ4éìÇî‚ñ4ôÔöuùþû‡þýmÎ(s · ñE_s€yqU!B#%ô&Ê(*`,.ß/š1M35°6X8:¡;>=Ø>e@ðAoCãDIFGâHJKLÃLZMµMÚM·MCM…LZKÛIáG†E­Bi?«;ˆ7ö2.Ô(_#¶ú,w ÙqKüp÷÷òÔî"ëÑçíälâOàÞ$ÝÜ=Û·ÚfÚPÚjÚ±ÚÛ°Û\Ü,ÝÞ ßà?árâ¯ãüäQæ®çéuêÖë<í”îëï)ñ`ò|óxô^õöžöóö÷êö~öÅõ½ô]ó§ñ˜ï4í|ê|ç2ä¹àÝRÙ‡ÕÍÑ-νʒDZÄ:ÂÀ€¾K½“¼K¼w¼½þ½E¿ãÀÃÂÝÄ-Ç¢É<ÌîγъÔd×MÚ.Ýà÷âÓå«èyë>îüð­óSöõøû þ‚ô[± G €¶Øø"ù á"¿$›&j(=*,Ç-‰/@1ú2­4X6 8©9T;ë<ˆ>@¥A"C›DF]GŸHÓIÝJØKœL?M¦MÖMÀM_M¬LšK)JKHFAC@l<^8ß3 /Û)w$ÑO” ñ~Iý`øÒó ïÖësèyååâ¸àâÞlÝ@ÜhÛËÚxÚRÚdÚ¡ÚÛ’Û;ÜÝáÝÜÞãßá1âtã¸äæhçÉè.ê‘ëõìPî¥ïíð!òEóHô0õîõ‚öãö ÷ôö“öïõïô¥óòÿï°íëèÙäfáÇÝ ÚEÖ‚ÒÝÎfË(È=ŬƒÀȾ‚½±¼Q¼i¼ä¼Ç½¿ŽÀcÂuÄ´Æ+É·ËgÎ,ÑùÓÚֺ٢܆ßhâEåèîêµívð&óÒõpøûŽý|á@ Ö Cr¥´¸¶®– ‡"^$@&(á)¬+o-0/í0¢2Z46µ7Z9ÿ:›<9>Æ?WA×BQD½EGbH•I®J£K{LM•MÏMÅMyMÏL×KtJ°HxFÒC¸@(=/9Å40å*ˆ%ð9u° ‹MþQù³ôlðìéæeãá=߯Ý|ÜÛìÚ‚ÚYÚ_Ú”ÚòÚtÛÜ×Ü»Ý¢Þ¸ßÆàýá/ã|äÇå'ç‚èèéJë¯ì îcï¬ðåñ óôõÌõdöÓö÷ùö©öö'õæóVòfð#îë¦è|åâ|ÞÆÚþÖ<Ó‘ÏÌÇÈÈÅ'ÃæÀ¿¸½Ö¼]¼_¼Ç¼—½À¾@À ÄCưÈ5ËãÍŸÐoÓKÖ+ÙÜôÞÝáµä”çaê,ííï¡òOõî÷ƒúýŽÿmÊ h £ Ú%@KVQL: #"$â%µ'ˆ)R+-Ø.•0O2ÿ3¸5Z7 9©:O<â=~?ABDsEÖF!HXIyJsKQLMMÄMÍM†MøL L¾JIêF_DYAá=ý9§5ø0ë+—& !Y–Ô$ ŸOÿJú”õBñJíÄéœæåãŒá˜ßúÝ´Ü»ÛÛ›ÚZÚ`Ú†ÚÞÚ]ÛöÛ´ÜŠÝwހߒà¾áôâ8äŠåÞæ>è¢éëiìÇíïmð¦ñÓòàóÖô¡õIö¾öøö÷µö4öRõ)ô¥òÊð˜îì=éæÀâ-ßÛ¹×øÓCкÌeÉXÆ¥ÃRÁl¿÷½ú¼o¼Y¼®¼h½„¾ð¿ªÁ¢ÃÕÅ2ȺÊZÍÐßÒÀÕ›ØÛiÞHá*äçÕé¥ìbïòÊôk÷úüÿ‹ñX¨õ 7 k›¹Úá÷êîÕÉ!£#Š%X'/)ù*¾,‚.>0ù1¬3`5 7µ8[:ú;–=-?¶@DB»C.E‘FàGI@JDK&LàLfM½MÊMœMMALKiI]GáDøA•>Å:‰6å1î,¥'%"z¸ô? °Y@û~öò îpê7çfäâñßLÞîÜéÛ*Û¨ÚlÚXÚ€ÚÍÚAÛØÛÜ^ÝIÞJß[à…á´âúãCåŸæöç]é¾ê ì‡íÖî-ðgñ˜ò¬ó¦ôzõ)ö§öðö÷ÆöQö~õiôòò+ñ ï‘ìÍé·ækãàß7ÜuدÔûÐfÍÊëÆ$ÄÀÁÄ¿:¾$½„¼V¼š¼>½J¾¤¿RÁ>ÃdžÇ9Ê×Ì‘ÏUÒ3Õ ØõÚÓݾàšãyæKéìÜî•ñDôíöùü‘þxâ4„ Å +Tl‚‹‡ze!J#(%ÿ&Ô(*i,(.ê/ 1Z35º6`8 :¨;E=Ü>l@õApCèDEF¥GÚH JKÿK¸LRM«MËM¨M2MnLEK¿IÆGiEŒBH?Š;c7Ö2ê-µ(<#šØ\ Ç`=üj÷íòÖîëÖçñärâXà˜Þ2ÝÜMÛÀÚuÚ\ÚuÚ½Ú(Û¼ÛfÜ8ÝÞß$àHá{â¶ãåUæ¶çé{êÙë<í—îæï+ñZòwósôQõ öŒöæöûöÕöiöªõ¡ô=ó‡ñvïíYêTçä•àêÜ5ÙfÕ¶ÑάʀǫÄ1ÂÀ¾S½ž¼Z¼ƒ¼½ ¾a¿÷ÀÝÂ÷ÄGǼÉVÌÏÎÑ¡Ô×aÚIÝ)àãæåÂè‹ëUî ñÁógöù–ûþ˜l¿ T Âç#-!!í"Ë$¤&x(D*,Ò-/N1ÿ2¸4b68´9X;ó<>@¨A&CŸDF_GŸHÎIÞJÍK™L4M›MÊM­MSM“L‡KJ2HâE%Cð?L<;8¼3ê.»)V$´ý7} Þm=ýWøËóïÔëwèyåòâ¸àòÞqÝNÜtÛÙÚ‚Ú`ÚoÚ¯ÚÛÛEÜÝìÝçÞëßá8â}ãÁäæqçÌè5ê“ë÷ìQî¥ïìðò=óBô&õäõwöÑöüöÝö~öÔõÕôˆóÝñáï‰íãêîç³äCá¤ÝéÙ(ÖfÒÉÎOËÈ0ŧ€À̾‰½¸¼b¼v¼ù¼Ü½¿¨ÀzÂÄÑÆ?ÉÖË}ÎFÑÔóÖÐٺܛß~â]å1èëÆí‰ð9óãõ„øû ýòM¡ â $S~œ±ÁÄ÷§ Œ"o$G&(ì)³+}-7/÷0¬2a46½7_9; <@>Ë?^AØBVD¼EGaH“IªJ KrLM‰MÂM¸MeM¿L¾K`J‘H_F±C—@ = 9¦4ß/Ä*g%Ò[™÷|=þJùªôkðìé æiã(áD߼݄ܜÛõÚ’ÚdÚmÚ ÚÿÚ€Û$ÜæÜ¿Ý·Þ¸ßØàâ;ã‚äÑå*çŠèêéPë°ì îbï«ðâñóôùôÂõUöÆöðöçö‘öøõõËó4òFðîjë‚èYåíáZÞ¤ÚàÖ"ÓvÏûË´ÈÀÅÃèÀ¿Â½Û¼l¼n¼Ø¼­½Õ¾XÀÂ$Ä^ÆÅÈTËøÍºÐˆÓaÖEÙ&ÜßíáÏä¦çvêBíýï¶ò_õø”ú ý ÿ~Ö. s ¶ ä3I]__[A 3"$í%Á'“)[+#-ã.ž0X2 4»5h79µ:Q<ì=€? AB DuE×FHZIrJrKKLöLxMµMÀMwMãLöK¥JôHÏF@D8AÁ=Ú9„5×0Å+z&é >|¸ ŠCÿ<ú‘õ8ñLíÄé æëã’á¡ßÞÁÜÄÛÛ£ÚlÚiÚ”ÚíÚdÛܻܘ݀ފߜàÇáýâ@äåææCè¦é ëjìÊíïið¦ñÌòÝóÌô™õ;ö°öëöèö§öö?õô‰ò§ðwîîëéõåœâ ß\Ûœ×ÙÓ-УÌUÉKÆœÃMÁl¿þ½½}¼e¼Á¼|½™¾ÀÂÁ¼ÃïÅKÈÓÊuÍ2ÐùÒÙձ؜Û|Þ`áBäçîé´ìzï.òÛô€÷ú¥ü!ÿše¸ C {¦ÊâöúóçÐ!³#%h'6)+Ì,‡.L0þ1¹3d57º8c:<=0?À@BBÁC1EFäGI>J@K!LØL\M±M»MMM*LíJMIBGÃDÚAq>¨:`6È1È,…'"Y Ù, žI6ûtöò îoê;çläâüßSÞûÜõÛ5Û¶ÚwÚfÚÚ×ÚPÛãÛšÜkÝTÞTßià‰áÁâäM壿ÿç^éÆê!ìˆíÙî)ðhñ‘ò©óœôqõö˜öàöìö²ö8öeõKôÒò ñãîqì£é—æBã¿ßÜVØ’ÔàÐRÍñÉáÆĽÁÀ¿@¾)½‘¼e¼§¼W½Y¾Á¿fÁYÃ~ÅÖÇTÊǫ̀ÏqÒGÕ&ØÛðÝÐà³ãæ_é.ìîî©ñXôüö—ù#ü§þ ‹òB– Ñ 8a{š˜–ƒs!U#5%'à(§*t,2.ó/ª1b35À6i8:­;O=á>p@ûArCìDIF¡GÞHJKòKºLAM¥M»M™M!MWL0K¤I®GEErB#?k;?7²2È-”(#|¼ýF µN4ü^÷èòÓîëÚçôäzâaà¢Þ>Ý"Ü[ÛËÚƒÚhÚ‚ÚËÚ3ÛÊÛqÜDÝ$Þ"ß0àQáƒâÁã å`æ¹çézêàë<íšîåï)ñWòpónôHõúõ„öÑöëöÀöNö’õ…ôófñRïíì3ê2çèãoàÍÜ ÙPÕ“ÑΕÊtÇžÄ,ÂÀ„¾Z½¨¼j¼“¼0½!¾y¿ÁöÂÅ^ÇÙÉnÌ!Ïèѹԗ×{Ú]ÝEàãæÎè§ëdî$ñÒóyöù¦û+þ¦{Ñ f žÏõ&442%!ö"Ù$®&„(P*,Ü-œ/S13¼4n68½9^;û<’>$@ªA-CžDF\G HÌIÛJÉK‘L+M‘M»M¢M9M‡LkKøIHÄECÍ?-<8ž3Á.œ)1$–Þe È^,ýNøÃó˜ïÖëuèƒåïâÉàñÞ…ÝS܃ÛãÚ‘ÚjÚ~ÚºÚÛªÛRÜÝùÝîÞüßáFâãÌäæwçÓè6êšë÷ìVî¢ïëðò9ó<ôõ×õjöÃöçöËöfö¹õ»ôgó¿ñ½ïhí½êÉçä!á}ÝÎÙÖOÒ­Î>Ë È)ÅÂÀÍ¾Ž½Ä¼n¼ˆ¼ ½ó½.¿ÁÀ’§ÄëÆ[ÉíËšÎ\Ñ.Ô ×ëÙÐܱߗâpåIèëÜíðLóøõ’ø(û®ý+œ\¯ õ /eŠ©ÂËÔÍÆ° œ"v$X&%(ø)¾+†-B/1²2m46Å7i9 ;«Õ?]AãBUDÁEGbHI©JšKlL M€MµM¨MTMªLªKDJzH>F•Cu@è<æ8„4¸/¥*A%´þ>…Ýo*þBù ôhð‹ìéæpã-áLßÇÝŽÜ©ÛþÚ¢ÚmÚ{Ú¬Ú ÛÛ0ÜðÜÎݼÞÈßÞà âCãŠäÙå1çèïéTë³ìîbï¨ðâñÿò ôîô¸õLö²öãöÏö~öÜõïô¬óò$ðßíDë^è2åËá4ÞƒÚÀÖÓ_ÏåˤȲÅÃãÀ¿Å½å¼x¼¼ê¼À½î¾mÀ7Â>ÄuÆåÈhËÎÑУÓzÖ]Ù@Ü$ßâåä¼ç‹êVíðÌòoõø¥ú1ý²ÿ å> ƒ  ÷ ?\epmaW 7"$õ%Ñ'˜)m+%-ô.¤0c24Ã5q79¹:\<ð=†?A•B DzE×F HWIqJlKELðLjM®M®MfMÒLÞKJ×H¶FDA=·9d5¯0§+T&Î a ü x4ÿ1ú†õ7ñHíÄ餿îãá¥ßÞÇÜÔÛ Û®ÚyÚtÚ¤ÚöÚtÛÜÉܣ݊ޖߣàÔáãMä”åìæMè¦éëiìÎíïmð ñËòÔóÆôõ2öŸöÚö×öŒööõòócò‰ðRîÈëóèÐåvâèÞ;Ûz׿ÓÐŽÌCÉ?Æ’ÃLÁj¿¾½‰¼u¼Ò¼‘½°¾ÀÜÁÕÃÆgÈíÊÍJÐÓìÕÐØ­Û™Þsá[ä*çêÈìŒïCòíô”÷$ú¸ü1ÿ¬uÇ O ްÛï ïß!¼#%q'B)+Ó,–.R0 2Á3n57Â8k:<¢=7?Ä@IBÄC0E“FáGI;J;KLÒLSM¥M¯MxMòLLØJ3I#GªD²AX>|:F61«,_'è!<€Â ‹;(ûoö ò îpê=çrä âà]ÞÝÜ?ÛÅÚ‚ÚuÚ—ÚèÚXÛñÛ¥ÜuÝaÞ\ßsà“áÉâ äT婿èeéÇê(ì…íÛî*ðcñ‘òŸó—ôfõöˆöÓöÔö ööIõ1ô°òìðÁîJì‚énæ ãœßñÛ5ØvÔÆÐ:ÍãÉÎÆĵÁÿC¾2½¼s¼»¼f½t¾Ò¿„ÁnÚÅïÇoÊ ÍÃωÒbÕ<Ø$ÛÞêàÆã¤æséDìï½ñlô÷©ù5ü¹þ.¡ùYŸ ä Jm‰¡«›—x!e#=%'è(²*~,;.þ/²1l35Æ6t8:¼;M=ë>t@üAzCêDKF£GØHJ KîK°L9M˜M¯M‡MMBLK‰I‘G,EMB?C;72¥-r(ù"^Ÿå/ ¡@%üV÷ãòÍî!ëØçúäƒâeà¯ÞCÝ3ÜcÛÜÚŠÚyÚÚ×ÚBÛÑÛƒÜJÝ2Þ+ß9à]á‰âÊãåfæÀçé‚êßëDí”îèï&ñSòlófô=õóõqöÆöÕö¬ö7öyõgôóEñ1ïÈìê çÈãHà¬ÜíØ1ÕzÑéÍ„ÊeÇ–Ä%ÂÀ†¾a½´¼w¼¥¼B½;¾‹¿,Á Ã*Å{ÇîÉŒÌ7ÏÒÑԱבÚwÝXà:ãæêèµë{î4ñçó‹ö'ù¸û;þ·#ˆá/ t «à!6<H:3!#ä$¸&(X*&,ä-¥/^13Å4u68Ä9f;=™>'@°A.C£DF^GžHÉIØJÃK‹L MˆM­M’M+MmLYKÜIúG¨EæB®? <ò7y3¢.x)$yÁM µL#ýDø¼ó—ïÒë{è…åúâÍàߊÝeÜ‹ÛòÚÚwÚŒÚÆÚ,ÛµÛ]Ü'ÝÞþÞà%áMâŒãÓä!æ|çÙè=êšëýìRî¥ïèðò8ó1ôõËõ\ö³öÕöµöQöžõžôJóœñïBí˜ê¦çfäýàZݬÙäÕ5Ò’Î,ËúÇÅšÂyÀÒ¾’½Ð¼x¼›¼½ ¾D¿ØÀ¬ÂÁÄÇvÉ̵ÎvÑFÔ"×ÚæÜÌߨâ‰å\è.ëðí¯ðaóöªø4ûÂý9­oº  :v•»ËÜÜàÍÁ £"‡$\&7(ü)Ï+Š-P/1À2r4 6Ë7s9;±Û?bAæBWDÅEGcHŽI¤J–KeLMtM§M›MAM—L”K+J^H#FsCY@Â<É8[4š/*$%’â"kÍW$þ1ùžôaðŒìéætã6áWßÌÝŸÜ®ÛÛ¦Ú‚ÚÚ¾ÚÛ›Û;ÜüÜ×ÝÊÞÏßìàâOãäâå5ç–èóéXëµìîbï¨ðÝñýòôéôªõ@ö¤öÐö½öföÄõÓôóôñð½í ë8èå¢áÞ`Ú¢ÖéÒFÏÑ˒ȩŠÃâÀ¿Ë½ð¼ƒ¼Ž¼þ¼Ó½¿ƒÀPÂVÄ’ÆúȆË/ÎêнӓÖtÙYÜ8ßâúäÏç¤êfí)ðÛò„õ%ø¹úBýÂÿ3œ÷M ‘ Ó /Ofu|wr^ G")$&Ù'¦)r+4-ú.­0o24Ñ5v7 9Â:^<ý=‡?A™B D€EÔF$HSIpJfK>LéL_M£MžMYM¼LËKvJ¾H™FÿCû@{=–9@50ƒ+3&¬ B‹â i"ÿ'ú~õ1ñGíÅ馿öã á³ßÞÔÜÞÛ)ÛÁÚ€Ú†Ú«ÚÛ€ÛÜØÜªÝ›Þ›ß²àÙáãRäåôæNè°éëqìÌíïjðžñÅòÐó»ô†õ"ö“öÆöÅövöèõõÑóFògð/î¦ëÌè®åPâÇÞÛ_×ÓüÏwÌ2É1ÆÃCÁq¿¾½¼ˆ¼á¼¨½Â¾:ÀñÁðÃ!Æ€È˨ÍeÐ.ÓÖæØÇÛ¬ÞŽáläDçêÞì¢ïQòõ÷?úÀüIÿ·&‚Ø" b •Æâÿýè!Ë#¥%~'L)+ß,ž.\02È3x5$7Ì8o:<¨=\: 6~1„,D'Ã! e¨ v,ûeöòîrê=ç{äâàaÞÝÜPÛÎÚÚ€Ú¤ÚôÚdÛý۱܀ÝlÞfß|àžáÑâä\坿 èkéÉê,ì†íÞî'ðdñˆòžóŒô`õöö¼öÉö…öö1õô–òÆð¢î'ì\éMæ÷âzßÎÛØYÔ«Ð&ÍÎÉÃÆijÁÁ¿G¾:½§¼‚¼Ë¼}½†¾ì¿™ÁˆÃ´ÅȉÊ&ÍÛϦÒvÕZØ6Û Þüààã¶æŠéVìïÒñzô#÷¸ùGüÊþ@® f° ò +V|•©±´ª¡†!p#H%!'ô(¾*‡,G.0½1t3$5Ð6z8:¿;X=í>{@B~CíDOF¡GÚHJKëK¦L3MŠM¢MzMøL4LûJvIrGE/Bâ>&;ø6l2ƒ-M(Ü"=…Ç ‰4üO÷ÚòÍîëàçûä‹âmà¶ÞQÝ;ÜrÛäÚÚ~Ú¡ÚÝÚSÛÚÛÜVÝ=Þ6ßDàfá’âÕãåqæÄç$é†êãëEí˜îçï#ñQòfó`ô4õèõbö·öÂö—ö ö^õJôâò$ñï¥ììé俣ã%à‡ÜÐØÕdÑËÍxÊOÇ‘ÄÂÀ‡¾k½»¼…¼·¼S½R¾ ¿DÁ'ÃBÅ•Ç Ê¤ÌUÏÒîÔÇתڎÝnàSã&æéÆë“îGñøó¡ö7ùÉûNþÅ7—ò= … ¸ï 2?ONL?'!#é$Ë&”(g*-,î-±/f13Ð4|6&8Í9k; =ž>,@µA1C¦D F]G HÆIÔJÁK€LMzM¡M„MM\L>KÈIÚGEÂB?å;Ð7U3~.W)ï#X¥ç8 Ÿ<ý7øºóŽï×ëvèåøâÝàß™ÝlܘÛþÚ©Ú…Ú–ÚÔÚ6ÛÃÛhÜ1Ý Þß à-áWâ•ã×ä-æçâè=ê¡ëýìVî¥ïåðò.ó1ô õÅõLö¤öÆöžö:ö‡õ€ô/ó{ñyï"ísê€çDä×à9݉ÙÈÕÒ}ÎËìÇÅ”ÂyÀѾš½Ù¼†¼­¼+½ ¾W¿ôÀÃÂÚÄÇŽÉ#ÌÌΑÑ]Ô=×ÚÝàßÁâ åoèEëîÅðqóöµøLûÑýK¿‚È  L€¦ÆÚèîåàÇ ³"$k&=( *Ö+–-Z/1Í2x4+6Ñ7{9;¹á?fAêBZDÆEG_H‘IœJ–K[LÿLiMœMŒM/M‡LyKJ@HFUC6@£<¢8;4w/Z*%oÆT¶Hþ)ù•ô\ðŠìéæzã?á[ßÞÝ¡ÜÂÛÛ·Ú‰Ú“ÚÆÚ"Û¦ÛHÜÝäÝÒÞÛßòàâTãšäçå=ç›èùé[ë¸ìîaï©ð×ñüòøóäôžõ5ö“öÀö§öPö«õ·ôróÓñâï—íýêèçäƒáíÝCÚÖÒÒ+ϼ˅ȗŠÃÛÀ¿Ñ½õ¼”¼›¼½ê½¿¢ÀaÂvĦÆÉžËIÎÑÔÓ¬ÖÙoÜRß3âåæçµêí9ððò—õ6øÍúSýÑÿD¬[ ¡ ß :_r‚‰„h U"0$&à'´){+A-ÿ.½0r2&4×5}7*9Æ:i<þ=‘?AžBD€EØF!HSIkJdK6LàLWM“M’MEMªL²KbJ H}FáCØ@\=r95m0^+&‹ ã)pÐ Tÿúwõ+ñFíÄé­æøãªáºß"ÞßÜéÛ9ÛÈÚ“ÚÚ¼ÚÛ‰Û*Üàܸݤަ߽ààáãYä¤åüæSè¶éëtìÍí!ïfðŸñ¿òÊó´ôyõööºö¬öcöÌõëô°ó)òBð îë©è…å-â Þ÷Ú:×…ÓÜÏfÌÉ&Æ‚ÃAÁo¿ ¾½ ¼”¼÷¼¸½Þ¾KÀÂÄ=Æ›È!ËÄÍÐGÓ"ÖýØáÛÃÞ¥áƒäXç-êòìµïhòõ¶÷Lú×üWÿÉ8ì/ q §Ïõ $$ ó!Õ#´%‡'W)%+ç,«.e02Ñ35.7Ó8y:<°=A?Ï@PBËC7E”FãGI6J5K LÃL@MŠM•MXMÊLëK¢JIêFlDtA>;:ú5\1_, '¢!E‘å fûXöòîpêDçzäâàqÞÝÜYÛÜÚ›ÚÚ¯ÚÛpÛ Ü»ÜÝqÞv߃à©áÚâäbåºæèpéÎê/ìˆíßî$ðañ‡ò•ó‰ôQõúõnö®ö²ötöêõõòówò¤ð€îýë<é!æØâPß®Ûó×;Ô‘ÐͼɵÆþëÁÿH¾D½±¼‘¼Þ¼Ž½ ¾À²Á¤ÃËÅ$ȤÊ?ÍöÏÀÒÕtØNÛ7ÞáøãÊæ¤égì-ïãñô6÷ËùYüÛþQÀw¾  7gŠ£¸½Á¹ª–!y#U%.'þ(É*’,O.0Æ1~3-5Ø6ƒ8&:Ä;`=ó>@BCòDOF£GÛHÿIKåKŸL*MM“MiMèLLéJVI[GëDB¿>;Ö6G2^-*(º"g®ÿ y üC÷ÕòÄî#ëØçåŒâxàÀÞZÝGÜ}ÛòÚ§ÚŽÚ©ÚðÚZÛêÛ™ÜcÝGÞAßOàmá âØã$åsæÏç(éŒêçëFíšîæï"ñOò_óYô*õÚõXö£ö²öööEõ+ôÄòñíî€ìÄéÁæzãàcÜ­ØñÔGѶÍ`ÊEÇ€ÄÂÀŒ¾q½Æ¼•¼Å¼l½b¾¾¿WÁDÃ\ůÇ&ʼÌqÏ0Ò ÕÞ×Åڦ݆àkã=æéàë¢î^ñ ô°öNùÙûaþÕJ¦N ‘ Íø":RX_TM4!#÷$Ó&£(r*8,ú-º/q1)3Ö4ˆ6.8Ó9v; =¦>2@¹A7C§D FaG›HÈIÍJ¼K|LMqM“MrMMEL*KªIÁGnE¢Bo?Á;¬733X.4)Ì#9…Ð &ý.ø¯óïÑë|èåãÞàßžÝ{Ü¢Û Û²Ú“Ú¢ÚàÚGÛÊÛyÜ9ÝÞßà7á`âžãàä0æ‹çâèFê¢ëíXî£ïåðò.ó$ôõµõCö’ö³öŠö"önõcôó[ñWïûìRêWç"ä®àÝeÙ«ÕûÑdÎËØÇ Å‡Â|Àо¢½â¼–¼¹¼E½.¾v¿ÁßÂôÄ9ǪÉ>ÌåάÑzÔS×5ÚÝøßÛâ²åŠèVëîÙð‚ó4öÇø`ûßý_Î3ŽÜ " ]´ÔèõúôêØ »" $t&I(*Ý+¦-_/1Ñ2…416Ý79$;½ã?mAéBbDÃE G^HŒIŸJŠKYLôL^MM{MMpLdKûI%HéE6C@<}84Q/;*Þ$U¥î8¤3þùôWð‹ì鿀ãEáißãݱÜÊÛ(ÛÁÚšÚšÚØÚ+Û¶ÛQÜÝìÝßÞâßá#â`ãžäðåCç èÿé]ë¼ìîbï¦ðÕñ÷òðóÞôõ)ö„ö¬ö•ö9öŽõŸôNó¸ñ»ïvíÕêóç¿ä`áËÝÚeÖ±ÒϨËtÈÅÃØÀ ¿Õ½½¼­¼&½ú½5¿±ÀƒÂ‰ÄÅÆ0É»Ë`Î#ÑëÓÇÖ¤ÙˆÜgßMâ#åÿçÈê“íMðó®õEøáúbýãÿVºh ³ í !Jk€“–…z \"?$&í'¾)…+L- /Æ0}2-4á5†7/9Ð:n<>š?A¤BDEÙF"HQIjJ]K0LØLKM‰M‚M2M˜LœKFJ‰H]FÄC¶@;=L9ý4D0?+ï%l Æ Wº Bÿúoõ'ñEíÆé®æÿã²áÂß,ÞìÜñÛJÛÑÚ¢ÚšÚÈÚÛ—Û5ÜîÜÀݱްßÇàëáãaä®åç\è¹éëyìÌí"ïdðœñ»òÃó­ôoõ örö§öšöMö³õÏô”óò"ðêí[ë„èaå âyÞÚÚ×kÓÆÏMÌÉÆzÃ@Án¿¾$½ª¼¦¼½Ñ½ï¾fÀ% ÄXƳÈ=ËÝÍ—ÐbÓ9ÖÙúÛÚÞ»á™änçBêíÇï}ò%õÉ÷]úèügÿÜC¦õA  ³à'3-* "á#¼%–'a).+ó,².p0&2Ü3‡597Ø8‚:<¶=G?Ñ@WBÊCï÷ñ£ôF÷ÞùhüîþaÍ0€Ó Is—²ÂÎÌĸ¡!ƒ#c%5' )Ò*›,[.0Ð1†355à6Š8,:Ë;f=÷>†@BƒCóDPF£GÖHÿIûJáK–L MsM…MXMÖLLÏJ?Iâ:¯6*2:- (—"J—ë dýû;÷ÑòÄî ëßç å“â‚àÈÞfÝRÜŠÛüÚ¶ÚšÚ·ÚüÚeÛ÷Û¤ÜnÝTÞJßXàzá¤âãã+åxæÔç-éêëëHí™îçïñKòZóPô#õÌõLöö£öhöðõ+õô§òáðÉî_ìŸéæXãÞßCÜ‹ØÙÔ*ѤÍLÊ8ÇxÄÂÀ¾w½Ô¼Ÿ¼Û¼z½|¾Ï¿vÁVÃzÅÇÇ@ÊÕÌŠÏJÒ Õø×ÚڻݠàyãZæ%é÷ë¶îoñ ôÃö]ùìûoþçW¸] Ÿ Ú-JYkfdW@!(#%Ý&­(}*@,.Á/|103á4678Ú9{;=«>4@¿A8C©DF\GžHÃIÌJ´KuLMeM‡MaM÷L.LKI§GPE…BL?¡;Š739.)¯#lµ |üü%øªóŠïÕë}è“å ããàߨ݇ܭÛÛÁÚÚ³ÚêÚSÛÙÛ‚ÜGÝ#Þß"à?ákâ¤ãéä8æŽçêèHê¥ëíUî¨ïÞðò#ó!ôøô­õ1ö‡öœöxö öTõHôðò9ñ8ïÔì/ê1çýãŽàóÜIÙ‹ÕâÑNÎðÊËÇýÄ…ÂvÀؾ¥½ñ¼¡¼Ë¼W½C¾Ž¿Áù ÅTÇÂÉVÌÏÅÑ‘Ôm×JÚ.ÝàîâÊåœèkë.îçðó>ößøjûõýmÞC›ì . m›Ãâôóå Å"ª$&W(*ë+«-m/$1Û2486å7†9,;Á<\>ç?sAîBcDÆEG`HˆIœJ„KSLéLTMMlMMXLRKÝIHÈECõ?^<^8ô30/*Â$1Ñ%&÷ýù„ôYð†ì%鿇ãMátßëÝÁÜÒÛ7ÛÎÚ¥Ú«ÚàÚ=Û½ÛaÜÝùÝéÞîßá.âgã¨ä÷åIç¥èê`ë¾ìîbï¤ðÒñïòíóÏô‹õöwö™ö€ö"övõ€ô4ó”ñžïOí¶êÉç ä8á«ÝûÙHÖ•ÒþΖËaȆÅúÂ×À#¿Û½ ½®¼º¼:½¾J¿ÌÀ™Â¢ÄâÆGÉÖËzÎ;ÑÔÝ־ٜ܂ß_â;åèßê¦í`ðó»õ]øìúxýñÿgÊ)z ¾ þ -ZwŽ  ” n"E$+&ô'Ê)Ž+V-/Í0‡264ç5‘749Ù:s< >›?$A¤BDEÚF HOIdJYK,LËLDMyMtM#ML‰K-JnHAF¤C™@=.9Ö4%0+Î%M ©òC¢ 6öþ úgõ$ñBíÉ鳿ä¹áËß9ÞöÜÜQÛäÚªÚªÚÔÚ)Û¦Û>ÜúÜÍݸ޽ßÍà÷á%ãlä²å ç_è½éëxìÏí"ïbð˜ñ·ò¼ó¢ôfõýõdö”ö†ö4öõ°ôxóæñðÄí9ë]è?åäá[Þ³ÚÿÖKÓ­Ï<ÌûÈÆoÃ?Áo¿¾1½¶¼µ¼½ß½ ¿|À<Â?ÄiÆÖÈPËûÍ®Ð}ÓOÖ0ÙÜñÞÒá®ä†çRêíØï’ò7õÝ÷kúýüuÿïR¶ R ‹ Äì$99A/& "î#É%ž'm)8+ý,½.x002â3”5:7æ8‚:%<»=K?Ø@WBÑC:E™FÞGI/J*KL°L+MtMuM8M£L¾KvJÊH³F-D5AÐ=õ9¸51,Ü&g!ÂZÀ BüÿýúLööñîtêGç‹ä(â)à„Þ2Ý.ÜsÛõÚ¶Ú¦ÚÍÚÛ‹Û!ÜÒܦ݆Þß’àÀáæâ-äo寿èxé×ê1ìíÛî&ðZñòˆówô?õáõPööŠöFö½õßôºó7òcð8îºëîèÞå‹â ßlÛ´×Ô`Ðá̜ɚÆîÃ¥Á¿S¾T½É¼°¼½·½Ë¾1ÀäÁÖÃþÅXÈ×ÊtÍ(ÐòÒÀÕ¥Ø~ÛcÞCáäûæÇé”ìPï ò³ô[÷íù|üüþqß;—Ú " Rƒ¦½Ò×ÛÐÅ«!‘#l%C')Þ*¤,e."0Û1Œ3A5å6•81:Ô;j=þ>Š@B„CöDQF¢GÖHúIùJØK’LMjMvMHMÄLîK»J$I G²DÒA}>À:62-í'v"â2{Ø Róû4÷ÊòÄî ëãçå™âŒàÑÞsÝ]Ü—Û ÛÂÚ¨ÚÃÚÛtÛܰÜ{Ý\ÞVßcàá°âéã2åæÚç2é’êíëIíšîäïñFòSóIôõÀõ<ö€öŒöWöÔõõïó‰ò¾ð¨î:ì{éwæ3ã¼ß ÜmعÔÑÍ9Ê+ÇnÄÂÀ–¾~½à¼°¼é¼’½¾é¿ÁoÖÅÝÇ^ÊíÌ¥ÏdÒ8ÕØóÚÔݲà•ãhæAéìÍî€ñ3ôÕönùþûþùeÊm ¯ æ;WiswpbM!1#%ç&¹(…*L, .Í/‚1;3è4•6@8á9;=­>>@¿A>CªDF]GHÀIÇJ¯KlLüLZMuMVMßLLüJuIŽG/EhB+?;g7í2.ð(#ùS˜õ d îüø§ó‡ïÕëè›åãñà%߳ݓܹÛ&ÛÍÚ¬Ú¼ÚúÚ]ÛçÛÜQÝ0Þ$ß,àJápâ¯ãîä?æ”çîèNê¦ëíSî¨ïÜðòóôñô õ$ötö‹öaöôõ6õ.ôÏòñïµìêçØãjàÔÜ&ÙpÕÈÑ8ÎÞʽÇôÄ€ÂvÀÚ¾¯½ø¼´¼×¼m½Y¾¢¿8ÁÃ(ÅkÇßÉmÌÏÚѬԃ×eÚBÝ'àãÞå´è{ëDîûð­óSöíø}ûþ{ñN¬û > z©Ïï í Õ"²$&[(/*î+»-p/01ã2”4D6é79/;Éì?wAðBfDÇEG\H‰I”J‚KHLâLIMsM]MüLEL;KÅIóG¬EùBÔ?<<>8Ð3/÷) $mº{ëý ùƒôSðŠì#é&æãVá|ßùÝÉÜáÛAÛÛÚ³Ú·ÚíÚHÛÊÛmÜ*ÝÞóÞùßá8ânã¯äýåOç¬èêfë¼ìî_ï¡ðÒñæòêóÃôõ öfö‡ölö ö]õeôóvñxï1íŽê§çyäá‡ÝÜÙ)ÖzÒé΀ËUÈzÅñÂÙÀ"¿å½½º¼Í¼H½*¾[¿çÀ±Â»ÄüÆ`ÉðË“ÎTÑÔøÖÒÙ¶Ü—ßwâPå&èôê¸ívð&óÏõnøÿú†ývÚ8‡ Î <gŸ¦°«ŸŽ v"S$2&(Õ)—+`-/Ù02@4ï5–7>9Ý:z<>ž?(A©BD†EØF HMIaJTK!LÇL4MoMdMMnLrKJRH%F†Cw@÷< 9·4ÿ/þ*­%2 ŠÚ* 'èþú_õ"ñCíË鏿ä¾áÙßAÞÝÜ\ÛñÚ·Ú¶ÚâÚ4Û³ÛHÜÝ×ÝÄÞÆßØàýá2ãnä¼å çeèÃéëzìÒíïeð‘ñ´ò²óœôYõðõUö€öuöö„õ•ô\óÅñáï£íë=èåÀá;ÞÚâÖ/Ó—Ï'ÌîÈÆmÃ8Ár¿¾6½Ç¼Ä¼*½ù½¿“ÀXÂQĉÆêÈlËÎÊГÓiÖFÙ&ÜßêáÁä›çgê1íîï¢òLõë÷€ú ýŠÿúeà _ ™ Óù0FHJ>. "ø#Ó%¨'x)B+-Å.…052î3™5C7î8‰:+<¿=Q?Ü@[BÓC™:q6ß1ú,Ç'\"ÃfÀ Eòéû*÷ÇòÂî#ëççåŸâ˜àØÞ€ÝkÜŸÛÛËÚµÚÓÚÛ‚Ûܺ܇ÝfÞaßkàŠá¸âòã9å…æàç6é—êðëJíœîàïñ@òLóBô õ¹õ*ösöuöDö½õöô×ódò£ðîìUéVæ ãœßûÛRØ™ÔüÐtÍ+ÊÇeÄ ÂÀ–¾Œ½å¼Â¼ù¼¨½¡¾À ÁŒÃ¬ÅùÇvÊͽÏ}ÒPÕ,ØÛîÝÈàªãæRéìÞî–ñDôæöù ü“þxÔ0z ¾ ô%Diq„{pW!>#%ò&Ã(*V,.Õ/Ž1?3ô4›6G8è9‡;!=´>A@ÆA=C¯DF]GH¹IÈJ¥KhLðLOMiMBMÐLLäJ_InGEDB?[;H7É2õ-Î(q#Û6‚Ú Xöçüø¡ó‡ïÓë„èŸåãúà.ßÀÝžÜÅÛ3ÛÙÚºÚÈÚÛjÛñÛ™Ü^Ý9Þ2ß4àTá{â´ãùäBæŸçïèTê©ëíZî ïàðòóôéô’õöaözöLöÚõõô²òûðïî“ìâéìæ³ãEà²ÜÙRÕ­Ñ#ÎÆÊµÇåÄ}ÂtÀÞ¾´½½¾¼î¼{½s¾´¿SÁ'ÃBŇÇôÉÌ1ÏøÑÄÔš×}Ú[Ý<àãòåÊèëXî ñÁócöùŒûþŠa¹ K ‰µá÷ ý Û"Â$“&k(5*ü+Â-|/91ê2Ÿ4I6ò7—97;Îî?}AóBfDÌEG]H†IJ~KAL×L?MdMNMêL0L$K¬IÚGEÛB´?<8­3í.Õ)$ùQ¡õ kâýÿø}ôOð‰ì&é+æ•ã]á†ßÞÕÜìÛOÛèÚ¿ÚÄÚúÚTÛØÛvÜ9Ý Þßàá?âxã·äæVç¯è êgëÁìî_ï¢ðÊñäòáó¼ôsõÿõTöyöTööõBõJô÷òTñYï ílêçVäñàfݻ٠Ö_ÒÑÎkËGÈlÅîÂÕÀ"¿î½½Ë¼Û¼^½;¾v¿üÀÌÂÔÄÇzÉ Ì¯ÎkÑ9Ô×ìÙÌܰߊâhå;èëÎí‰ð9óäõ|øû–ý…ëE˜ Ü Hvª¶¹º«› "_$>& (Ý)¥+g-(/á0–2J4ö5ž7E9ä:<>§?(A¯BD„EÜFHKI^JNKLÀL(McMSMMZL[KýI7H FdC[@Ò<ì84á/×*% p¼y ÛþõùYõñCíÊé¿æäÌáÜßOÞ ÝÜjÛúÚÆÚÁÚïÚBÛ½ÛVÜÝåÝÎÞÐßáàâ8ãyäÁåçjèÇé"ë~ìÑí ï_ð’ñ­ò®ó’ôOõäõEöoö_ööiõ{ô;ó¨ñ¿ï€íïêèòäŸáÞsÚÁÖÓ}ÏÌÜÈøÅdÃ5Áu¿¾A½Ô¼Ò¼A½ ¾4¿­ÀnÂoÄ¡ÆɉË*ÎäЭÓÖ_Ù>Üßâ×ä°ç}êCíðµò]õÿ÷úý›ÿ wÐ% k « Þ)AOXSM9 ""$ß%²'„)J+-Ï.Š0D2ò3¤5J7ô8‘:0<Ç=U?â@^B×C>x:M6½1Õ,©'8"¨úM« 0ãàû ÷Äò¿î!ëîçåªâ›àçÞ‡ÝwܬÛ%ÛÙÚÄÚÚÚ#Û‹ÛÜÇÜÝqÞmßtà”áÁâøãC勿åç<éšêôëJíœîáïñ:òJó5ôõ§õ ö`öeö*ö¨õÙô¹óIò}ðdîðë6é,æìâvßÝÛ/Ø€ÔàÐaÍÊÇ_ÄÂÀ›¾’½ô¼Î¼ ½¹½º¾À¼Á£ÃÆÅÈ‹Ê&ÍÑÏ›ÒgÕBØ!ÛÞààÁã’æké,ìôî¨ñWô÷ö”ùü¤þ†å@ˆ Î 0VqƒŽŒŠxg!F#'%þ&Ë(*\,$.Ý/•1L3ø4¦6N8í9‘;%=»>C@ËA@C²DF^G›H¹IÂJ¡K\LìL?M^M1M½LôKÊJIIQGøD(Bé>=;#7§2Ò-®(P#¾dÊ ?ìØü øœó‚ïÖë‡è¤åãá8ßÉݪÜÑÛ?ÛæÚÆÚ×ÚÛyÛýÛ¦ÜgÝGÞ7ßCà[á„â¼ãÿäLæ¡çøèUê­ë íUî¥ïØðòó ôÝôŠõöVöcö9öÂõõôó’òÛðÏîlìÁ鯿ã$àŽÜéØ3Õ”Ñ Î·Ê¤ÇÝÄwÂrÀâ¾»½½Í¼ü¼‘½„¾Ñ¿dÁGÃVÅ¡ÇÊŸÌRÏ ÒÝÔµ×ÚuÝQà2ãæÝè¥ëkî!ñÒówöù¡û&þnÌ ^ ”Æë )))!é"É$¡&u(=* ,É-‡/B1ò2©4O6ü7ž9;;Ùû?zAúBhDÌEG]HIŽJvK;LÏL3MXM=MØLL K•I½GrE¼B‘?û;õ7‘3Ç.·)]$Ü3Šß UöÑýûøsôQð…ì.é*æ¡ãbá“ß ÞáÜøÛ[ÛôÚÍÚÑÚÛbÛãÛ„ÜBÝÞ ß à$áHâã¾ä æ`ç±èêkëÁìî_ïðÊñÝòÙó´ôfõóõCöeöBöÚõ-õ)ôÜò2ñ9ïåìHê\ç2äÎàEÝšÙîÕEÒ¸Î[Ë5ÈeÅåÂÕÀ&¿ð½,½Ó¼ï¼o½O¾Ž¿ÁçÂíÄ.Ç•É"ÌÊ΃ÑUÔ#×ÚäÜÂߦâxåRèëàíðLóôõ‘ø"û§ý&“üV¤ í %Z€¢³ÄÅŸ¦ Œ"m$C&(æ)¯+s-./ì0ž2S4ý5§7K9ì:…<>©?0A¯B D‡EÚFHHIZJKKL·LMUMGMìLHLCKæIHíEGC9@³<È8o4½/¸*l%óR£þe ÎþëùQõñ=íÒ鼿äÎáêßVÞÝ%ÜxÛÛÒÚÐÚ÷ÚTÛÄÛgÜÝñÝ×ÞÜßèàâ@ã€äÊåçrèËé%ëìÔíïaðñ©ò¦óŒôAõÚõ4ö^öMöíõTõ[ô"ó„ñ¡ïZíÏêïçÓäwáöÝPÚ¥ÖøÒfÏÌÌÈîÅZÃ7Ás¿'¾J½Þ¼å¼P½!¾J¿ÄÀˆÂ‡ÄºÆ!ÉœËKÎ÷ÐÇÓšÖtÙXÜ3ßâîäÅç‘êXíðÈòrõ ø¦ú(ý®ÿ‰Ý6 { ¶ í7O[e_ZC 1" $ë%½'Ž)V+-Ú.“0K2û3ª5U7ø8›:4<Î=[?ä@dBÖCBE™FÝGI"JKíK—L MOMIMMlLzK0J{H^FÔCÖ@k=‘9O5¯0·+|&!oÁ ÒÿÜú6öéñþíwêVç—äBâCà¢ÞUÝPÜšÛÛÝÚÍÚòÚ<Û°ÛEÜõÜÈݨީߴàØáãBä‡åÖæ.è„éäê8ì’íÜî"ðQñqòtó_ôõ¼õ#öYöMööoõ’ôaóØñðÑíOëƒèoå â¦ÞÛ[×®ÓСÌlÉsÆÚØÁÇ¿a¾n½ð¼Ú¼9½ð½¿uÀ-Â!ÄJÆ¨È ËÃÍrÐ;Ó ÖçØÇÛ¦Þ‡á`ä7çêÍìŽïAòíôŽ÷#ú­ü0ÿ l¿ F ‚¨Ðä÷ýÿõçÏ!°#Ž%c'1)ÿ*À,ƒ.>0õ1¨3W5ÿ6¨8I:â;€= ?š@BŽCûDRF£GÑHðIìJÅKyL÷LBMNMML¯KsJØHËF\DoA>U:.6›1¶,†'"Šà5• "ÓÔû÷»ò¿î#ëíçå²â¤àðޓ݂ܸÛ4ÛäÚÐÚéÚ,ÛšÛ$ÜÔÜÝzÞxß|à¡áÅâäCå—æèçAéŸêòëPíšîáïñ8òBó/ôüôšõöMöTööõ¿ôó*ò^ðBîÑëéæÅâWߺÛØeÔÇÐNÍÊÇWÄÂÀ¡¾–½½Û¼½Ë½Ï¾0ÀÐÁÂÃÙÅ2ȤÊ>ÍìϰҀÕZØ7ÛÞøàÑã¬æyéEìïºñhô ÷£ù0ü³þ'—ôM™ Ø =d~™š”…p!S#0%'×(¤*h,,.æ/¡1O35©6W8ô9”;-=¾>I@ÌAEC±DF]G–HºI¹JKULßL6MNM"M©LßK·J+I;G×D BÊ>;7ƒ2´-(0#¥þQ³ ,âÉüø”óƒïÕëŠè©å&ã áAßÔݵÜÝÛNÛðÚÔÚâÚÛ…ÛܲÜsÝOÞDßJàfá‹âÅãåSæ¤çÿèVê³ë íXî¢ïÖðòóôÓô}õúõDöSö"ö¬õéôÛóqò¿ðªîLìžé¢æmãànÜÉØÕyÑ÷ͦʔÇÖÄpÂvÀâ¾Æ½½Ý¼ ½£½œ¾ã¿ÁYÃrÅ»Ç'ʾÌeÏ&ÒõÔËשڋÝfàHãæñèºë{î6ñãó‰ö!ù²û4þ¯Ù% k ¡Öö'473$!ó"Õ$¬&(I*,Ó-/J1ü2¯4W68¢9C;Ýþ?€AùBnDÉEG[HIŠJpK2LÆL)MHM3MÀL LõJ|I£GSEŸBr?Û;Õ7l3©.“)D$ºnË CèÆýñøqôIðŒì)é7æ ãpá—ßÞçÜ ÜdÛÛØÚÜÚÛmÛîÛÜKÝ&Þßà*áTâ„ãÈäæ_ç¼èêoëÄìî`ï›ðÅñÚòÏó­ô[õáõ9öMö0öÄõõôºòñïÈì#ê<ç ä¯à!Ý~ÙÑÕ+Ò£ÎHË(È\ÅàÂÓÀ*¿ö½5½à¼½½g¾ ¿+ÁþÂÅFǰÉ9ÌãÎÑfÔA×ÚüÜÙ߸âåeè.ëõí¬ðaóöžø7ûµý7£ c¶ ø 7d«ÄÌ×ËÈ­ š"u$R&!(ò)µ+-6/ö0§2Y46®7R9ò:< >®?5A¯B%D†EÛFHGIWJCKL©LMHM5MßL1L0KÌIHÑE(C@’<¦8O4›/˜*N%Ö5ŽãZ ïÇþßùMõñ?íÒéÃæ ä×áòßaÞ"Ý1܃ÛÛßÚÛÚÛ\ÛÕÛmÜ*ÝõÝéÞÞßùàâNã„äÑåçuèÏé)ëìÔíï]ðŠñ£ò¢ó~ô<õÇõ(öNö4öÞõ3õHôÿòjñ}ï<íªêÍç°äTá×Ý0Ú†ÖâÒMÏï˼ÈãÅTÃ6Ás¿/¾Q½í¼ó¼c½3¾b¿ÙÀ¡ÂžÄÓÆ:ɶËaÎÑÝÓ²ÖŒÙlÜLß'âåÔç©êhí*ð×ò„õø¶ú;ý¹ÿ-‘ó? ‹ Å ú$B\homdO <"$ö%Ç'–)b+#-ã.ž0Q24³5X79:><Ð=_?ê@dBÜC@E™FÞG I JKäKLM@M=MñLYLdKJaHDF´C¸@K=o9/5Œ0—+]&ç U¦h ÁÿÖú-öåñÿívê[çäJâIà°Þ\Ý_ܤÛ'ÛèÚÚÚþÚHÛ¿ÛNÜÝÒݲ޴߽ààá ãJäåÜæ3è‹éäê?ìŽíáîðSñhòróSôõ­õöEö=öïõUõ|ô=óÀñÜï¯í/ë\èNåüáƒÞæÚ>×ÓÐŽÌZÉjÆÏ×ÁÆ¿g¾v½û¼ì¼G½ ¾¿’À@Â<ÄdƾÈ>Ë×ÍŽÐTÓ#ÖÙÜÛ¾ÞátäNçêæìïVòþôž÷6ú½üAÿ°|Ì T ‘´Ýñ  ôÙ!¼#—%n'=)+Ì,Œ.F0ÿ1°3]5 7¬8P:ë;‚=?@B•CùDXFœGÕHéIêJ¿KnLðL4MBMM{L—KaJ¸HµF9DTAû=7:6z1”,d'þ!kÆ‚ ÇÈû÷¹ò»î%ëðç%å¸â®àùÞ Ý‹ÜÅÛ?ÛòÚÜÚöÚ9Û¥Û4ÜÜܩ݈Þ~ß‹à¥áÓâäPå˜æòçEé¢ê÷ëOíœîÞïñ3ò=ó'ôñôõö?ö>ööwõ¦ô€ó ò@ðî±ëéèéå¤â/ßžÛï×KÔ¬Ð8ÍöÉõÆOÄýÁÀ£¾ ½½è¼2½Ý½æ¾FÀéÁÙÃõÅIÈÁÊUÍ ÐÇÒšÕrØOÛ.ÞáæãÄæ‹é\ìïÒñyô÷³ùDü¿þ?Ÿ X© è Mpšª££{!a#:%'ä(¬*u,4.ï/ª1Z3 5µ6[8ý9š;3=Ã>N@ÐAHC´DF_G”H·I¶J–KOLÔL,M?MM—LÉKŸJIG»DëA©>ù:à6c2Ž-m(#„ä7œ Ͼüý÷ó~ïØë‰è±å*ãáKßàÝ¿ÜëÛWÛÛÞÚðÚ*ÛÛܻ܀ÝZÞOßTàoá“âÏã å\æ©çé]ê´ë íYîŸïÖðüñóýóÆôtõìõ0öEöö™õÌô¿óSòðŠî*ìwéæGãßßLÜ«ØúÔbÑà͔ʈÇÊÄlÂsÀç¾Í½!½í¼½·½°¾ú¿™ÁsËÅÔÇBÊ×ÌÏ@Ò Õä×Áڠ݀àYã6æéÒëŒîLñôóö3ùÃûGþ½0ë2 z °á"6B@B.!#à$µ&‹(P*,Ü-›/Q13µ4c6 8¬9K;à@„AClDÎEGYH}I…JlK)LÀLM@MMµLôKàJcI†G9E}BS?¸;³7J3….r)"$œT´ 0Ô¼ýåøkôGð‰ì-é9æ§ãwá£ß#Þ÷ÜÜtÛÛâÚïÚÛ€Û÷ÛžÜVÝ1Þß à8áYâ‘ãÌäægçÀèêpëÉìîaï™ðÁñÓòÉó¢ôQõÖõ$ö@öö­õøôóó òñðùîžìêçíã†àÝ\Ù±ÕÒŠÎ5ËÈMÅÝÂÏÀ-¿þ½=½ñ¼½“½|¾¶¿FÁÃ"Å_ÇËÉSÌüζтÔY×0ÚÝïßÏâ¥åzèCëîÄðoóö°øGûÇýI±rÄ  Ct›»ÎÝßÝÎÀ  "…$Y&.(ü)Â+†-C/û0²2a46µ7[9ù:‘<'>³?7A¹B!DŒEÚFHDIQJAKL¦LM=M%MÌLLK´IèG±ECõ?v<~8/4x/u*0%³qÎD ß·þ×ùFõñAíÑéÉæ%äßáýßkÞ.Ý<ÜÛ!ÛëÚèÚÛhÛáÛ{Ü2ÝÞíÞïßýà"âRãŽä×å'çxè×é'ëˆìÑí"ïWð‹ñ™òžóuô0õ¼õö9ö%ö¿õ#õ&ôäòIñZïí‡ê§çŒä0á³ÝÚjÖÂÒ:ÏÖ˲ÈÒÅTÃ*Á~¿.¾_½ù¼½v½I¾t¿öÀ´Â»ÄîÆNÉØËtÎ1ÑôÓÌÖ¥Ù‚Üeß<âåèç¿êzí@ðèò™õ/øÈúJýÍÿ9¥ÿP š Ò /Rit}zla B"&$ÿ%Ó' )l++-ï.¤0]2 4»5b7 9¦:B<Ù=c?î@hBßCBE™FÝG I JKáK…LøL4M+MãL@LUKúIIH&F”C›@%=P9 5k0u+:&Ê 5êW ì·ÿÆú(öàñüíyê^ç¤äPâUà¸ÞiÝjܯÛ3ÛøÚäÚ ÛTÛÉÛ[ÜÝØÝÃÞ¹ßÊàèáãQä•ååæ5èéèê?ì”íÞîðPñcòlóKô õ¢õö9ö$öÜõ=õ[ô'óšñÀïŠí ë:è&åÜá^ÞÈÚ×yÓçÏ{ÌKÉ\ÆÉÔÁÇ¿m¾½ ½ú¼[½¾7¿§À]ÂRÄÆÕÈZËðͪÐjÓ@ÖÙôÛ×Þ®áä^ç1êõì³ïgòõ±÷FúÑüLÿÇ(Ý& g ›Æè  á!Ë#¢%x'H)+Ø,“.R02»3d57³8W:ñ;ˆ=? @B“CERF¢GÍHéIäJ·KhLâL)M1MôLdL‡KAJ¦H“F D1AÝ=:æ5Y1n,I'Û!Q«p ø¼»û ÷µòºî%ëõç)åÀâ¸àߪݘÜÑÛLÛþÚéÚÛFÛ±Û>Üêܲݑދßà³áÖâäR墿ôçJé¦êúëRíšîßïñ/ò6ó ôæô„õôõ+ö/öæõbõ‰ôdóìñðýíˆëÊèÁåƒâ ß{ÛÓ×,Ô–Ð#ÍåÉéÆFÄúÁÀª¾¦½½÷¼D½ï½ÿ¾WÀ ÂéÃÆ_ÈÛÊoÍ ÐäÒ®ÕŒØdÛHÞ$áÿãÔæ¥élì+ïãñŠô1÷ÆùQüÔþHµj¶ ø ,[|›§µ³ª „!l#G%'ï(µ*€,;.þ/­1g35¾6c8:£;6=Ë>Q@ÕAKC¶DF^G”H±I´JKJLÉL M2MM‡L²KˆJúHG DÉAŠ>Ø:½6C2i-P(ì"lÂ%‚ ¿²üô÷Šó~ïÔë“è®å8ãáXßëÝÉÜùÛ`ÛÛëÚûÚ:Û˜Û%ÜÇ܉ÝgÞXß_àwáŸâÓãå^æ²çé`ê¹ë í[îžïÔðøñóóóÀôeõáõö0ö÷õ{õ¸ôžó8òzðiîìVéZæ'ã¹ß.܉ØáÔGÑÊ̓ÊzÇÂÄhÂqÀì¾Ô½/½ù¼/½Ë½Å¾À±Á‹Ã¨ÅêÇ_ÊîÌ›ÏWÒ(Õú×ÛÚ¶Ý•àtãDæéàë¦îZñ ô«öHùÓûWþÐ; ÷D ˆ ¾ñ2BOOK;*! #è$Å&Ž(c*#,ç-¥/Y13¾4h68±9Q;ç<{>@‰ACpDÎEGYHzI‚JeK#L´LM0MM¢LßKÉJJIlGEbB.?›;7+3c.R)$~ä<ž Æ®ýÞøcôDðŠì.é@æ¬ã€á¬ß.ÞÝÜ}ÛÛòÚöÚ-Û…ÛܧÜeÝ7Þ,ß'àBácâ–ãØäæoçÄèêtëÉìî]ï™ð¼ñÎòÄó–ôHõÆõö+öö•õßôÚó}ò×ðÑî€ìÞéòæÆãhàÛÜAÙ”ÕùÑvÎ"Ë ÈDÅÙÂËÀ5¿¾L½ü¼ ½§½Ž¾Ï¿[Á,Ã<ÅwÇåÉmÌÏÐјÔq×JÚ)Ýàââ½åŽèYëîÖðƒó+öÄøXûÚýUÅ)ƒÒ  Qƒ§ÈÜéëéÙÍ ¬"$g&6(*Í+-N/1º2k46À7_9;–<->¸?íÕéÍæ*äêáàuÞ<ÝEÜŸÛ+ÛúÚõÚÛuÛìÛˆÜ=ÝÞøÞøßá)â[ã–äÞå,çèÙé/ë‡ìÕíïXð…ñ•ò•ónô#õ°õö*ö ö¬õõ ôÈò(ñ;ïöìcê†çdäáÝðÙMÖ©Ò"ÏÄË¢ÈÈÅLÃ,Á{¿9¾e½ ½½Š½]¾¿ ÁÑÂÑÄ ÇiÉðËÎHÑÔâÖ¼ÙœÜxßWâ/åèÍê•íLðó¤õGøÕú_ýÛÿL²_ ¨ ã ?\xŠ„zk N"2$ &Þ'¬)t+6-ø.­0f24Á5m7 9°:F<ß=g?õ@iBäCBE›FÜG IJ K×KLçL,MMÔL-Lôõõúõ"ööÁõ'õ@ôó}ñïjíçêèåµá@Þ¥Ú×^ÓÎÏiÌ8ÉRÆÂÃÁÊ¿p¾‹½½½i½2¾L¿¿ÀtÂmÄ—ÆñÈrË ÎÁЄÓVÖ/Ù ÜêÞÈá¢ävçDê íÆï{ò$õÃ÷Vúâü]ÿÖ:›í4 v ©Ó÷  !& ñ!Ò#¯%ƒ'Q)+Ý,¡.V02½3s57À8[:ú;‹=?¡@'B“CETFŸGÎHäIàJ²K]LÚLM$MâLRLpK,J‰HyFÿCA¹=ô9Ä541Q,#'¿!4ïV ꪰû÷°ò·î)ëõç1åÆâ¾à߲ݦÜÝÛXÛ ÛôÚÛPÛÁÛFÜùܺݠޑߞà¸áââä]å§æûçPé§êìOíîÜï ñ+ò0óôÜôxõåõööÕõEõpôGóËñþïÙígë¤èŸå^âëÞZÛ³×Ô|ÐÍÒÉÞÆ<ÄöÁÀ«¾³½!½ ½Q½¾¿sÀÂÄ*Æ{ÈóÊŠÍ8ÐüÒÊÕ¡ØÛ[Þ=áäíæ¶éƒì>ïöñžôE÷ÓùgüâþZÇ"}  9j‹§¶À¾»¦–!s#U%%'û(¿*Š,F.0¹1n35Å6j8 :ª;<=Ð>T@ÛAMC·DF[G–H­I¯JŠK>LÂLM#MóLsLŸKrJßHçF€D­Ah>µ:œ62I-.(Ë"O§ n ÷¯§üê÷ƒó}ïÓë•è´å>ãádßðÝÚÜÜpÛÛøÚ ÛBÛ«Û+ÜÖÜ•ÝqÞdßgàá§âÝãådæºç éfêºëí]î™ïÕððñÿòêó´ô]õÍõööàõjõ—ô‡óò\ðEîåë/é6æã–ß ÜiØÄÔ-ѶÍpÊkÇ»ÄaÂsÀì¾Ý½7½ ½?½Þ½Ú¾(ÀÊÁ¢ÃÁÅÈvÊ Í¯ÏvÒ:ÕØíÚÑÝ«à‡ã_æ,éúë´îqñô¾öZùãûjþÞO­R – Îþ @L^[UK2!#õ$Ë&Ÿ(i*/,ï-®/c13Ç4p68¸9W;ï<~> @ACtDÏEGXHwI~J_KL©LM"MMŒLÑK«J7ILGÿD@B?v;m73?.1)ß#bÆ"† µ¡ýÓø]ô@ðˆì1éBæ³ã‡á³ß9Þ Ý*܉Û)ÛüÚÛ9Û‘ÛܲÜnÝGÞ1ß6àIámâŸãÝä$æuçÉè êvëÍìî_ï•ð¹ñËò»óŽô:õºõööðõ}õÇô¼ócò³ð³î\ìºéÍæ¤ãBà¾ÜÙ|ÕØÑdÎ ËÈ8ÅÒÂËÀ6¿¾W½½4½¶½§¾ã¿tÁFÃSÅ•ÇûɉÌ-ÏêѳԆ×cÚ?ÝàüâÍå§èkë/îèð™ó;öÛøbûðýc×9‘â & _¸Ôêõ÷÷å× ·"›$n&F( *Ù+™-T/1À2t46Ã7j9;<4>º?CAºB+DŠEÝFHAIJJ5KöK“LóL!MM¨LùKêJ†I°G{EÌB»?+ÛÿÚÛ)Û‚ÛùÛ‘ÜJÝÞßàá5â`ã äãå2ç‡èÙé6ë…ìÚíïZð}ñ–òŠófôõ õùõöùõ–õîôðó«ò ñïÔì@êaçCäëàoÝÑÙ,ÖÒ Ï°Ë’È¿ÅBÃ-Á|¿>¾p½½#½›½p¾¥¿ ÁéÂëÄ!ǃÉÌ«Î`Ñ)ÔúÖÕٱܒßiâGåèäê¦ícðó¾õQøìúlýîÿZ l ¹ î 'Ll‚‘“”†u \"=$&ê'µ)~+B-þ.¹0n24Ì5r79µ:N<å=m?÷@oBäCDEFÛGIJKÔKtLãLMM¾LL'KÌIHëE\CV@é<9È4#04+÷%Ž ùZº, Ë™ÿ³úöÙñöí~êcç±ä\âiàÈÞ‚Ý}ÜÊÛJÛÛþÚ&ÛlÛãÛqÜ&ÝðÝÖÞÎßÝàùá'ãaä£åðæBè˜éïêEì–íÚîðBñaòYó<ôöôˆõèõöö¬õõ%ôëò^ñ|ïHíÃêóçàä”áÞ†ÚâÖAÓ·ÏTÌ)ÉFƹÎÁÈ¿x¾½!½½~½D¾c¿ÔÀŽÂ„Ä³Æ ÉŒË%ÎÚОÓmÖHÙ#ÜßÝá¹ä‰çYêíÛïŒò8õÓ÷júòüoÿåK©ýC † ´ä+0/' "Û#»%Ž'Z)(+æ,ª.b02Ê3w5!7Â8f:û;˜=?­@$B›CETF¢GÈHçIÕJ¯KULÐLMMÎLCLWKJmH^FâCó@™=Ò9Ÿ51-,'Ÿ!tÓC Ô¢ûýö¨ò·î$ëüç1åÐâÅà߽ݰÜéÛcÛÛÛÛ_ÛÉÛVÜÝÆÝªÞœß©àÀáíâ!äd坿èVé«êìSíîÝï ñ&ò,óôÔôkõÖõ öö½õ0õVô)ó°ñÛï»í?ë†èvå=âÈÞ8Û—×óÓdÐùÌÂÉÒÆ2ÄóÁÀ°¾»½-½½d½¾(¿ˆÀ6 ÄDÆ–È Ë§ÍQÐÓâպؗÛtÞPá,äÿæÏé•ìRï ò³ôR÷îùpüúþfØ1Ï  D{–´ÄÌËÆ³ !#_%0')Í*Ž,U.0Æ1s3%5Ë6s8:­;F=Ó>[@ÞANC¾DF`GH®IªJ„K6L¹LMMåL\LŽKXJÆHÍFaDŽAG>“:z6ü1'- (®"-íY 䟙üã÷{óyïÔë”è»åBã'ájßþÝáÜÜ{Û$ÛÛÛRÛ³Û9ÜàÜ¡ÝzÞnßqàŠá¯âæã#åmæ¿ç émêºëíZîžïÏðîñùòáó®ôOõÃõö öÉõTõ|ônóöñ=ð%î¿ëéæàâsßîÛGØ«ÔÑ¡Í^Ê_ǰÄ^ÂqÀò¾ã½D½½R½ï½ð¾?ÀßÁ¿ÃÕÅ"ÈÊ#ÍÍÏ‹ÒXÕ*Ø ÛâÝÆà›ãuæAé ìÊîƒñ.ôÓöfùúûwþð_½b £ Ý 1I_dlaV@!!#%Õ&©(s*9,ú-µ/o13Ò4v6!8Á9\;õ<„>@’ACuDÑEGVHwIxJ[KLŸLüLMñL}L·KJI6GàD"Bð>T;M7á2!. )Â#B«p õ¤”ýÉøVô=ðˆì1éHæ·ãá¼ßCÞÝ8Ü“Û6ÛÛÛCÛ ÛÜ¿ÜzÝOÞ>ß=àTátâ¨ãåä,æzçÎè$êzëÍìî]ï“ð¶ñÃò´ó‡ô-õ¯õöõöÝõfõ®ô óEò•ð‘î:ì—驿ã!àœÜþØ]ÕÂÑKÎüÊðÇ/ÅÌÂÉÀ9¿¾_½½=½Ð½·¾û¿Á\ÃmÅ­ÇÊ¢ÌFÏÒÌÔŸ×{ÚVÝ6àãæå¹è€ëDîüð©óPöèøyûüýwåH£ï 5 nÇßúóá Å"£$}&M(*á+¢-`/1Ë2}4#6Ï7n9;¤<8>Á?FA¾B-DEÞFH?IEJ1KñKˆLéLMøL˜LâK×JiI™G[E¯Bš? <8Ã3/*Í$YÃ$† ª‘þ³ù2õñ9íÙéÑæ7äöáà‡ÞQÝ^Ü´ÛDÛÛ Û<ÛˆÛ ÜšÜXÝ!Þß àá:âmã£äïå4çŽèàé6ëŒì×í ïTð~ñŽòˆó[ôõ’õíõöçõõÒôÚó‰òîðöî³ìê=ç!äÈàLݳÙÖvÒóΜ˄ȵÅ:Ã,Á}¿E¾z½!½0½¯½…¾º¿;ÁÿÂÅ9ÇŸÉ ÌÄÎzÑAÔ×ìÙÈܨ߂âYå.èôê¾íqð(óÊõiøúú€ýüÿlÑ/| Å 1[yŽž¡” f"I$&ô'Á)†+M-/Ä0u2'4Ô5x79»:U<é=s?ü@qBéCEEœFÜGIJKËKnLÖLMM®L LK´IúGÐE½ ½{½*¾>¿ŸÀNÂ7Ä`ƬÈ)˼ÍmÐ,ÓûÕÒØ­ÛŒÞfá@äçãéªìfïòÅôf÷üù…üÿ|äE–æ  \€¨ÁÐÚØÑÁ«!Š#j%<' )Ø*š,].0Ê13(5Ù6v8:´;J=Ú>_@âASC½DF\G“H¦IªJzK1L¯LûL MÑLOLvKCJ­H®FGDmA'>s:U6Û1-é'"tÓB ÒüÔ÷yótïÔë—è¾åIã/ásßÞïÜÜŠÛ/ÛÛ"Û[ÛÂÛDÜêÜ­Ý…Þxß{à“áºâìã-åtæÂçémêÀëí[îœïÎðêñóòÛó£ôDõ´õóõöõ¸õ7õhôMóÜñðîëìèíå½âPßÌÛ*ØŒÔúЉÍMÊRǦÄ[ÂnÀ÷¾é½P½"½b½¾¿WÀôÁÚÃíÅ<ȪÊ=ÍäϧÒnÕEØ!ÛûÝÜà±ã‰æXé ìàî”ñCôâö~ùüŽþþoÍ%q ³ ë=XktvoaK!0# %ä&²(~*D,.À/x1(3Ù46'8É9c;ý<‡>@ACrDÕEGVHrIvJTK L˜LîL MÝLmL¢K„JIGÈDÿAÓ>1;+7¾2.ê(¡##ŽîY à•†ýÀøNô<ðƒì6éIæ¿ã•áÆßLÞ"ÝAÜ ÛBÛÛÛOÛ«Û*ÜÉÜ…Ý[ÞGßHà]á}â²ãìä3æ‚çÒè(ê€ëÌì îYï”ð°ñÀò­ó|ô&õœõéõõõÇõQõ”ô…ó'òvðnîìs釿\ãþßzÜߨ>Õ­Ñ0ÎìÊàÇ&ÅÆÂËÀ8¿¾h½$½R½Þ½Ð¾À¢ÁwÃ†ÅÆÇ1ʹÌcÏÒäÔ¹×ÚqÝLà$ãÿåÉè›ëRîñ¸ódöúø‹û þˆó\® A ~­Òñ è Ô"­$ˆ&Y(!*ï+©-m/1Ù2€426Ò7x9;©Å?JAÂB.DEÝFH@I>J.KèK~LàLMèLˆLËKÄJNI€G;E”Bu?í;û7¡3ð.ñ)¨$=¤ oóš‚þªù,õÿð?íÓéÚæ:äþáà“ÞXÝmÜ»ÛVÛÛÛAÛœÛܬÜ`Ý.Þßà#áHâpã°äñå@çŽèçé9ëìÛíïTð{ñˆòóTôõŠõÙõôõÔõgõ¼ô»óoòËð×îìøéçûã¦à+Ý’ÙóÕYÒÝΊËsÈ«Å3Ã,Á}¿M¾‚½.½B½À½š¾Ð¿QÁÃÅTÇ·É>ÌÚΖÑWÔ.×ÚâܼߛânåDè ëÐíˆð9óßõ{ø û“ý }â= Ó >j†ª®« Š u"Q$+&þ'Ë)“+V-/Ë0€2.4Û5‚7&9Á:\<í=z?þ@wBèCIEžFÙGIJûJÊK_LÑLþLóLœLôKýJšIàG³EC@¦<Â8†4Ü/ñ*¶%M Á"Š ¦ÿ™ú öËñøízêlç¹äkâxàÞÞ’Ý™ÜÝÛgÛ&ÛÛ9Û‰ÛöÛŒÜ<ÝÞìÞáßñà â8ãpä²åýæNè éùêIì˜íÞîð@ñUòNó+ôãônõËõòõÙõ€õßôïó±ò!ñ9ïí~ê©çœäLáØÝGÚ£ÖÓ…Ï.Ì É0ƪÊÁË¿¾£½9½8½¤½j¾¿Á½Â¹ÄâÆAÉ»Ë[Î ÑÒÓÖyÙRÜ/ß ââä¸çêFíð±ò]õ÷÷Žúý“ÿnÆ a   Óý5DJH=. "õ#Ï%¢'q)<+û,¾.r0-2Ø3Š5-7Ô8r: <¢=)?´@+B£CE^F›GÈHàIÊJ¦KAL½L÷LøL¯LL,KéI7H)F£C¶@W=Œ9^5Í0ì+Á&`!Ø?¡ ¯€Šûíöò²î(ëýç@åØâÚà)ßÒÝÈÜýÛÛ,ÛÛ1ÛzÛàÛoÜÝâݹ޶߸àÔáýâ0äuå·æèYé¶êìVíîÚïñòóô¾ôSõ¸õìõÝõ”õõ!ôòòqñ›ïvíþê8è6åñá†Þ÷Ú[×»Ó7ÐÌ̥ɵÆ%ÄëÁÀ»¾Ê½E½6½†½A¾U¿´ÀhÂPÄvÆÉÈ?ËØÍ„ÐGÓÖêØÅÛ£Þ{áYä'çùé¼ìzï.òÙôw÷ ú—üÿŒóS§ñ 1 g¶ÌÞåæÛг!š#q%J')á*¥,e.0Ö1„365Ú6‚8!:¹;R=Ü>f@âAYC¼DF[GH§I¡JxK%L§LìLüL¿L=L_K-J’H•F&DPA>T:16¹1â,Ê'o"òW¾+ ÁƒüÏ÷róuïÒë›èÄåNã:á|ßÞúÜ"Ü—Û<Û Û,ÛjÛÌÛPÜ÷Ü·ÝÞ‚ß…àœáÃâôã4åyæÉçéqêÃëíYîžïÇðêñêòÔó™ô6õ§õàõãõ¢õõMô0ó½ñûïâí{ëÆèËå˜â0ßªÛ ØoÔãÐuÍ=ÊEÇÄVÂqÀù¾ó½Z½4½q½¾¿tÀÂõÃÆTÈÅÊSÍм҈Õ]Ø8ÛÞôàÄã¢æjé4ìóî§ñUôõöŽùüžþÝ4 ¿ ü#Mdv„~iX!:#%ì&À(„*P, .Ê/€123ß4Š6-8Ñ9h;=>@˜ACyDÑEGRHrInJRKL’LÞLýLÎLXLKjJêHûF©DâA±>; 7›2Ý-Ë(€#qÖE ̉wý»øHô8ð…ì9éNæÆãžáÏßXÞ,ÝNܯÛMÛ"Û+ÛZÛ¼Û3ÜÖÜ’ÝdÞTßQàeáˆâ·ãõä9æ„çÜè'ê…ëÍìî[ïð®ñ¸ò¦ósôõ’õÖõäõ±õ:õzôjóòWðLîøëMéeæ6ãßßWÜÃØ!Õ’ÑÎÜÊÒÇÅÁÂÈÀ>¿¾s½3½c½ñ½ã¾*À·Á“ÃÅáÇJÊÕÌyÏ5ÒýÔÏ׫ڄÝcà=ãæåè¦ëmî!ñÏóuö ùœûþ—hÀ Q ‹»Ý ! ö Þ"¸$”&`(0*ó+·-r/*1Þ2‰496Ú7~9;®É?OAÃB3DŒEàFH;I=J&KàKyLÐLüLÖLvLºK©J9IbG"EtBV?Í;×7‚3Î.Ï)$ðZߌuþ¢ù%õýð>í×éÞæ@äâ*à›ÞhÝrÜÑÛZÛ/Û#ÛUÛ£ÛܵÜjÝ<Þ"ß!à-áOâ{ã¶äùåDç”èêé=ëŽìÜíïUðtñ…òxóJôùôzõÊõâõ»õUõžô£óOò«ð¸îiìÚéõæØã…àÝsÙ×Õ@ÒÆÎzËcÈ¢Å.Ã'Áƒ¿R¾Ž½:½T½Ñ½±¾ä¿kÁ/Ã9ÅlÇÑÉTÌøÎ©ÑuÔB×ÚøÜÓ߯â„åXèëãíšðLóñõ‹øûŸý ŠôK á Ot—¨·ºµ®– "\$6& (Õ)›+_-/Õ0ˆ284ã5‰7,9È:d<ï=?AzBìCIEFÚGI J÷JÁKXLÅLñLåLˆLãKäJƒIÆG”ECö?†<£8`4¿/Í*—%1 ¢ pñ •qÿúöÈñ÷í~êlçÄäoâ…àçÞŸÝ¥ÜéÛtÛ0Û'ÛGÛ–ÛÜ™ÜDÝÞôÞîßøàâ=ãzä·åçUè£éýêJìšíÜîð;ñSòDó$ôÖôaõ¼õßõÄõjõÄôÖó”òñïáìZê‰çuä-áµÝ(Ú‡ÖóÒpÏÌûÈ#ƧÄÁÏ¿†¾¯½C½L½±½¾¦¿ÁÙÂÍÄÇWÉ×ËsÎ&ÑçÓ¸ÖÙlÜEß"â÷äËç–ê[íðÇòlõ øœú&ý¡ÿ|Ö) r ¬ ä ,@TQZE; "ÿ#Ý%ª'~)A+ -Â.012ã3’537Ý8u:<¡=5?±@3B¡CE[F›GÇHÙIÉJ›Kg@éAYCÀDF^G‹H¥I›JpK!L—LæLéL±L(LKKJxHyF D.Aç=/:6•1Å,¥'T"Ô=¥ ®qxüÇ÷lóqïÔëèËåSãDá‚ß ÞÝ2ÜžÛMÛ'Û<ÛuÛÖÛ`ÜþÜÄݚތߎà¦áÉâüã:倿ÏçétêÄëí^î˜ïÉðáñåòÍóô*õšõÍõÕõŠõ õ3ôó¢ñÚïÃíXë¥è©åuâ߇Ûó×RÔÌÐ`Í+Ê9Ç•ÄRÂpÀþ¾û½e½B½½-¾-¿†À&ÂÄ!ÆmÈÝÊnÍÐÕÒ ÕtØNÛ)Þ áÛãµæéIìï¼ñeô÷žù+üªþ"‹íD Ð 4YrƒŽŒŠue!B##%ö&Ç(’*W,.Ó/‡1:3è4‘658×9l; =‘>!@˜ACtDÙEGRHpIhJLKüK…LÖLíL¾LHL{KUJÑHßFDÄA>ô:â6‚2·-¬(c#èY¾- ¾uný¯øDô6ð…ì;éRæÎã¥áÚß`Þ9ÝWÜ»ÛWÛ1Û6ÛgÛÇÛ?ÜâÜ›ÝnÞ^ß\àmá‘â¿ãûäAæ‹çÝè1êëÕìî[ïŒð«ñ³òŸóiô õ…õÄõÕõ™õ&õ]ôQóéñ:ð(îØë*éCæã»ß8Ü£ØÕyÑÎÉÊÄÇŸÂÎÀ;¿+¾x½F½n½¾ö¾?ÀÒÁ¦ÃºÅøÇcÊðÌÏQÒÕê×¾ÚžÝvàSã%æöè¾ë}î7ñàó‡öù¬û/þ¦wÏ ` ˜Éí &+&!ä"È$š&o(8*þ+Á-x/71â2•4>6ã7…9;¹Ó?OAÈB3D‘EÛFH2Ik@ìA[CÂDF[GHžI˜JlKL•LÒLáLŸLL7KýIaH\FíCAÄ=:î5v1Ÿ,ˆ'3"¶#‹ ™dlü¼÷lójïØëèÏåZãKáß*Þ Ý?Ü«ÛWÛ7ÛGÛ‚ÛåÛgÜÝËݨޔߛà¬áÔâä@剿Òç%éyêÇëí[îšïÅðßñÞòÆóƒô!õ‰õÁõ½õzõíôôôò„ñ¹ï¡í5ëè…åRâìÞjÛÍ×>Ô­ÐOÍÊ.Ç‹ÄPÂoÀ¿¾n½R½“½>¾E¿›À@ÂÄ=Æ„ÈùʈÍ2ÐíÒºÕŒØgÛAÞáõãÈæ•é^ìïÑñvô÷®ù<ü»þ3œþQž Ý @g€–—‚n!P#-%'Õ(™*c, .Û/’1A3ò4˜6=8Þ9u; =›>!@ AC|DÕEGNHlIiJAKøKyLÍLÝL±L3LeKAJ³HÊFjD¨Am>Ñ:Á6]2”-Ž(<#Ï9£ ¥h`ý¥ø>ô.ð‰ì8éYæÒãªáæßgÞGÝaÜÈÛdÛ=ÛAÛuÛÑÛLÜîܦÝ{Þfßgàvá™âÉãåJæçåè1ê‰ëÒì îWïð¤ñ°ò•ó`ôõsõºõ½õˆõõCô5óËñðî®ë éæôâ—ßÜ‚ØëÔ^ÑôͲʽÇÅ»ÂÆÀD¿/¾…½S½½¾ ¿VÀéÁÁÃÒÅÈ€ÊͯÏeÒ.ÕØ×ڵݎàhã:æéÏë”îGñõó™ö/ù¾û?þ¸&†á* o ¦Øø'851%!ò"Ò$£&}(>*,Å-ˆ/91ñ2š4G6ê7Œ9&;¾Ó?WAËB4D–EØFH2I8JKÔKcL½LÝL»LPL“K}JI+GêD5B?Š;”7<3Œ.‹)M$àQ¿*ºh\þŒùõöð9íÞéàæQäâ;à¯Þ|ÝŒÜãÛwÛBÛ@ÛiÛ¾Û2ÜÏÜÝTÞ5ß6à>ábâ‹ãÄäæOçŸèñéCë“ìÝíïQðlñ|òió:ôáôaõªõÀõ”õ%õoôlóòoðtî(ì’é°æ’ãAàÆÜ7ÙšÕÒ˜ÎUËGÈÅ#Ã#Á‰¿\¾£½U½r½ù½×¾À˜ÁbÃhÅ¢ÇʉÌ(ÏÞѤÔr×MÚ$ÝàÙâ¯åƒèEëîÀðoóö¬ø@ûÅý=­i¼ ý :i‘°ÂÓÐÒÁ¯ –"q$O&(í)­+t-./ä0œ2E4õ5˜799Ø:l<þ=ˆ? A‚BîCOE™FÝGöH JèJ·KBL³LÔLÈLgL»K·JVIGaEÁB»?AÛaÛ«ÛܯÜ\Ý(Þ ßÿßá&âQã‡äÇåç`è¬éëOì›íÞîð7ñEò<óôÃôGõ õ¹õ õ=õ“ô¤óVòÈðØîŸìêDç,äíànÝíÙIÖÂÒ?ÏõËÛÈÆ–ÃÁÑ¿’¾À½]½i½×½¨¾Ò¿GÁÃÅ1ÇŠÉ Ì§ÎTÑÔæÖ¾Ù™ÜrßNâ"åõç½êƒí9ðïòŽõ2ø½úIýÂÿ4›õH Ê þ%F]iplbP 8"$ô%À'’)W+-×.’0D2ó3¡5D7é8†:<®==?¼@9B§C EZFœGÀHÕI¿JK,L›LÔLËLLáKîJ IìGÓELCV@÷<(9ø4h0†+a&!ƒî\Ø }QoûÏö’òªî)ë èJåñâîàJßòÝæÜ&ÜŸÛVÛBÛVÛžÛÜÜ<ÝýÝÞÞÐß×àîáãEäŠåÍæèné¼êìZíîÔïÿð òóäó¡ô/õŽõ¸õ§õPõºôÐóŸòñ>ïí˜êÐçÍä‰á%Þ”Ú×iÓñÏ’ÌtÉ’ÆÄáÁ!Àʾâ½l½_½¿½y¾”¿üÀ«ÂžÄ¾ÆÉŠË$ÎÎÐÓ^Ö/Ù ÜæÞ¾á›äeç7ê÷ìµïfòõ¬÷CúÈüJÿº$€Ö \ ‘¹Þó  ÿñØ!¹#“%i'5)+Ä,~.>0í1¢3J5ö6“89:Ë;b=í>r@íAbC¿DFWGHI“JfK L‰LÉLÓLLLKèIFHBFÏCñ@¥=í9Ï5S1},k' "sí †T]üµ÷bóiïÖëžèÔå_ãRá—ß/ÞÝFܸÛcÛAÛSÛÛíÛwÜÝÛݮޣߠà¹áÛâ äJåæÙç*é{êËëí[î›ïÁðÜñÚò¼ó|ôõ|õ±õ«õdõØôôÚòhñ—ïƒíëbè`å3âÈÞLÛ¯×!Ô—Ð9Í ÊÇ…ÄHÂpÀ¿¾€½Z½§½Q¾X¿²ÀVÂ7ÄWÆžÈË¢ÍIÐ ÓÐÕ£ØÛUÞ6áäàæ¨éqì.ïÞñô)÷ÃùKüÍþB­ a­ ë %OsŸ¦§Ÿz![#7%'Ú(©*h,,.ä/›1K3ù4 6E8ä9;=¡>%@£AC}D×EGOHhIeJ­:¢6;2s-k(#® ˆ ’VSýšø8ô+ð†ì;é[æØã´áêßuÞMÝoÜÑÛsÛEÛPÛ€ÛÚÛ[ÜõÜ´Ý…Þqßnàá¡âÐã åJæšçæè8êŠëÖìî[ï‡ð¥ñ¦ò’óUôùôfõ©õ­õsõøô)ôó°ñöïííŒëéèùåÑâußøÛdØÏÔGÑÜͦʩÇűÂÈÀF¿4¾’½\½“½*¾#¿iÀÂÙÃéÅ.È”Ê#ÍÄÏ€ÒEÕØîÚËݤà}ãRæéèë¤î\ñôªöBùÎûRþÇ5˜ì> z ·ä'7@F:1!ÿ"Ú$²&ƒ(L*,Õ-‹/H1õ2¥4O6ò7”9*;Æ

    Ú?\AÈB?DEâFH5I0JKÊK]L°LÐL­L=L€KfJðHGÏDBø>i;q73e.n)+$Á9¡¢[Kþ…ùõòð8íÜéèæQäâ@à¼ÞƒÝ˜ÜïÛÛOÛIÛxÛÈÛAÜ×ÜŽÝZÞEß;àKájâãÑä æYç¢èùéDë˜ìÚíïLðmñsòfó-ôÚôRõœõ®õ€õõUôQó÷ñRðSîìnéŽæpãà¦ÜÙÕõÑ„Î@Ë=È~Å!à Á‹¿e¾ª½d½½ ¾ì¾&À±ÁwÃ…Å¶Ç ÊÌDÏ÷ѺÔ×_Ú@ÝàòâÅå“è^ëîÔð„ó'ö¿øSûÓýN¿}Å  Ex¡¸ÔÛßÞ̼  "~$V&((ô)º+|-9/í0¥2M4þ5Ÿ7A9Ý:t<>‘? AˆBïCQEšFÛGõHJæJ«K@L¡LÑL²LZL¦K¢J>ItGDE¤B›? ?Å@9B¬C E\F›GÁHÏI¼J…K$L’LÅL¿LkLÏKÙJ‰IÐG¼E(C=@Ò<9×4E0e+>&å dÖ@Å iF^ûËöŠò¨î)ë èOåøâôàSßùÝóÜ/ܪÛbÛLÛdÛªÛÜÜEÝ ÞçÞÙßâàöá ãOä‘åÒæ%èméÅêì]íœî×ïöðòóáó•ô$õõ¨õ’õ=õ¢ô´ó†òóð ïíìuê®ç©äiáÞyÚãÖTÓÕÏÌdɇÆÄÞÁ!ÀѾè½z½l½Ñ½¾ª¿ÁDzÄÞÆ,ɦË=ÎçЬÓrÖIÙ#ÜúÞÙáªäçHê íÊïvò$õ¼÷TúÚüZÿÊ5æ+ k žÈêûä!Ã#¡%p'D)+Ï,‰.E0÷1©3T5ú6 89:Õ;e=ó>v@õA]CÊDF^G‰H—I’J\K L{LÃL½L…LìKKÌI.H'F±CÔ@ƒ=Î9«521],D'÷!wðWÚ rGOü¯÷YójïÑë¥èÔåhãYáŸß<Þ"ÝVÜ¿ÛrÛLÛaÛ™ÛüÛÜ%Ýâݽާ߮à¿áåâäQ哿ßç0é|êÒëí^î™ï½ðÙñÑò¸óoô õkõ£õ•õQõÀôçóÀòHñyïaíïê<èBå â­Þ%Û˜×ÿÓ„Ð ÍûÉÇ~ÄCÂrÀ ¿¾ˆ½l½µ½h¾k¿ÊÀnÂQÄnƹÈ*˼ÍcÐ ÓéռؕÛpÞHá!äñæ¿é…ì@ïõñô>÷Ôù\üàþO¾q¼ û /a}©³´«šˆ!c#G%'ç(±*v,3.ï/¢1U35«6J8ì9„;=§>)@ªACDØEGMHiI\J:€62T-I(#ré DGý‘ø.ô*ðì@é\æÞãºáôß|Þ[ÝwÜáÛzÛUÛYÛÛéÛdÜݾÝÞ{ßzà‰áªâÙãåTæŸçëè=êŽë×ì!îVï‰ðžñ£òŠóMôìô[õ—õœõ^õàôôýò“ñÖïÍíjëÇè×å­âTßÙÛCØ·Ô+ÑÈ͓ʜÇûĪÂÈÀH¿>¾œ½l½¡½@¾5¿‚ÀÂñÃÆFÈ®Ê;ÍÝÏ›Ò\Õ3ØÛçÝ·à˜ãbæ8éùë¹îoñô¿öPùãû_þÛE¤G Áô3DOOJ:'!#ç$¼&Ž(V* ,Ú-›/L13¯4T6û7™96;ÇÝ?^AÒB:D“EßFH/I/JKÅKRL¦LÂLŸL)LoKMJØH÷F°DúA×>G;R7ø2F.K) $¥‰þ J>þyùõïð4íßééæXä"âKàÁÞ’Ý¡ÜûÛŽÛZÛWÛƒÛÒÛPÜßÜœÝcÞNßEàUáqâ›ãÖäæ^ç«è÷éNë”ìàíïKðjñnò^ó&ôÏôEõõœõmõúô>ô5óÜñ1ð5îäëNéiæNãý߃ÜûØ`ÕÞÑlÎ/Ë.ÈuÅÃÁ¿j¾¶½n½”½¾¿?ÀÄÁ•ØÅÕÇ4ʼÌ[ÏÒÖÔ¤×zÚSÝ.àãÚå«èoë2îçð˜ó8öÕø`ûèý]Ï.‹Ö  RЍÎÛëêêÚÇ ¬"‰$c&2(þ)Ä+†-A/ù0ª2Z46ª7E9ç:w< >Ž?A‡BõCQEFÕGúHüIåJ£K7L—LÂL¤LJLKJ#I[G(E…B|?þ;8Õ3:/D*%²3Ÿž P6ÿhúÞõ¼ñéíƒêyçÕäâ¢à ßÊÝÏÜÜ¢ÛcÛXÛyÛÂÛ6ÜÃÜvÝ=Þßàá;â`ã–äÖåçjè¶é ëTìŸíÛîð/ñ<ò0óýó¯ô/õ~õõtõõcôkó"ò„ð›îZìÏéýæèã¤à1Ý©ÙÖŒÒÏÎ˽ÈùÅŠÃ}ÁÔ¿Ÿ¾Ñ½y½…½ý½Ð¾ü¿vÁ8Ã0ÅfǼÉ>Ì×ΊÑJÔ×íÙÆÜ¢ßxâPåèéê¨ícðó·õRøäúgýæÿS¼g ª é Acu†‡‡xi L",$&×'¥)m+--ê.¦0R2 4­5W7ö8•:(<½=C?Ç@@B«CEYFœG¾HËI¸J}KL…L»L­L]L¹KÇJnIºGšEC@´<å8³4$0C+&Å G·+¯ V6SûÂö„ò§î(ëèTåýâÿàYßÞýÜ9Ü»ÛjÛ[ÛoÛµÛܪÜNÝÞïÞçßèàâ(ãXä—åÚæ'èséÉêìbí™îØïòð òüòÙóŠôõoõ˜õ}õ)õ‡ôódòÙðýîËìSê‰ç†äFáÞÝWÚÈÖ6ÓÀÏlÌQÉÆþÃÛÁ#ÀԾ󽄽~½ß½¤¾½¿+ÁÜÂÏÄóÆGÉÁËTÎÑÂÓ‹ÖdÙ6Üßîá¾ä˜çYê%íØïò1õÓ÷dúêümÿÚD¢ò; { ªÙ÷%! ð!Ð#©%'H)+Ô,”.O0þ1³3[57¥8@:Ý;i=ú>{@ôAfCÆDFZGˆH•I‹JYKþKsL²L³LpLÜKúJµIH F•C³@c=«9ˆ51;,$'Õ![Ò?à a4Fü£÷VóeïÓë¥èÛåmãaá¨ßFÞ0Ý^ÜÏÛ|ÛZÛkÛ§ÛÜÜ.ÝïÝÅ޵߶àÉáîâäX囿äç5éêÓëí_î–ï½ðÔñÌò¯ófôüô`õõ…õ:õ¨ôÏó¡ò*ñYï>íÏêèåìá‡Þ Ûu×çÓkÐ ÍêÉÇvÄAÂqÀ¿¾–½x½É½w¾…¿ÞÀ†ÂkĆÆÓÈDËÔÍ}Ð8ÓÖÔØ¬Û‡Þ\á9äçÖé–ìUïò³ôN÷æùnüîþdË,Ê =nŒ§¹¿Á¶§‘!r#K%%'í(À*z,?.÷/ª1a35³6P8ô9‡;!=¦>2@¨A CDÛEGOH_I^J.KáK]L©L´L‚LúK+KùIkHuFDHA>n:\6ö11-'(ä"pèYÓ n6;ý‡ø,ô#ð„ìAéaæåãÂáý߇Þd݃ÜíÛˆÛaÛfÛ™ÛõÛqÜÝÇÝނ߆à‘á´âáãå\æ£çñè?ê‘ë×ì#îTï†ðšñò‚óDôÞôOõ„õ‹õHõÈôùóáòuñ¸ï¨íLë è¸å†â7ß²Û,Ø•Ôѳ̓ÊÇôĤÂÊÀK¿E¾§½{½°½V¾F¿œÀ- ÄÆ_ÈÊÊRÍûÏ­ÒzÕDØ#ÛõÝÔà©ãyæNé ìÐîñ-ôÏödùñûrþéVµ Y — Öý&?O][VH0!#ñ$Ç&—(b*&,å-£/T1 3³4^68œ9?;ÉÞ?dAÑB?D”EÝFH+I-JKÀKELL³LLLXK7J¿HÙF•DÙA¸>&;17Ò2*.$)ï#ƒné y;/þsùþôíð6íÞéðæ[ä-âQàÎޚݯÜÜœÛdÛfÛŒÛäÛTÜóÜ ÝsÞVßQà]ázâ¥ãÙäæ^ç³èûéPë•ìãíïJðeñhòVóô¿ô;õzõŠõYõßô)ôóÃñðîÃë(éIæ*ãÙßfÜÙØGÕÄÑUÎ ËÈpÅÃ!Á¿q¾Á½|½£½0¾¿VÀÜÁ­Ã²ÅíÇNÊÔÌuÏ(ÒíԽבÚlÝDàãïå¿è…ëEîýð¨óLöåøsû÷ýmß>™ç ( f’º×ëöùóæÑ ¹"‘$p&8( *É+“-H/1³2b46²7M9ê:< >˜?AŠBöCQEF×GòHýIÛJžK-LŒL³LšL0L…KqJI>G EjBX?ã;÷7»3/+*õ$—ˆüŒ >,ÿ[úÝõ³ñíí‚êçÙä–â©àßÔÝÙÜ%ܯÛnÛdÛ…ÛÏÛ@ÜÑÜÝFÞ,ßà,á?âjã›äÞå!çnè¼é ëXìžíÜî ð/ñ5ò)óöó¡ô$õpõˆõdõùôNôOóòiðwî;ì¬éÚæÇã€àÝ‹Ù÷ÕqÒÿκ˰ÈðÅ‚Ã}ÁÕ¿¥¾Ü½„½—½ ¾æ¾ÀÁNÃMÅ|ÇÖÉWÌñΡÑeÔ-×ÚÛܺߌâgå0èÿê¹íyð"óÉõeøóúyýùÿ`Î"t » õ %Rk‡˜Ž‰p ["7$&ß'´)p+>-ð.®0^2 4·5^7ü8›:.<Á=J?È@EB­CE]F—G¿HÆI´JvKL|L­LŸLJL§K­JZIœG‚EîBü?’<Ã8“40#+ÿ%¤ -œ˜ H&Hû¼öò§î(ëèXåã á`ßÞÝFÜÇÛvÛhÛzÛÂÛ'ܶÜYÝ#ÞûÞîß÷àâ1ã`äåâæ+èzéÉêì_íœîÑïôðò÷òÏó€ô õdõ‚õoõõsôóHòºðÚî­ì.êgçdä"á¿Ý7Ú«ÖÓ©ÏYÌCÉsÆ÷ÃÙÁ$Àؾÿ½½’½î½¹¾Ô¿?ÁúÂáÄÇ]ÉÛËoÎÑÜÓ£Ö{ÙOÜ,ßâÛä¥çuê3íïï òEõä÷túþüxÿîR° H ‡ ºå*10% ý!×#¸%†'V)+ã,™.Z02¹3e5 7¬8J:ß;s=ú>‚@õAjCÆDFZGƒH•I„JSKôKjL¥L§L[LÍKßJ¢IøGïEwC“@E=†9l5ë0,'´!A·'­ P&;üœ÷NógïÐë­èÜåwãgá³ßQÞ8ÝnÜÙÛ‰ÛeÛxÛ²ÛܘÜ9ÝúÝÐÞ¿ß¿àÕáóâ%ä^å æìç7é†êÔëí_î•ï¹ðÏñÅò§ó\ôðôQõ~õsõ#õ’ô²óˆòñ>ïí°êòçüäÇáfÞéÚY×ÍÓRÐúÌÚÉ÷ÆpÄ:ÂvÀ¿#¾ž½Š½Ù½¾˜¿øÀœÂ…Ä ÆíÈ\ËïÍ•ÐSÓÖëØÄÛÞváLäçèé«ìkïòÇô_÷øù~üÿqÝ<Û  NzšµÅÌÍÁµš!~#X%-'ü(Å*‡,H.0µ1e35·6\8õ9“;!=°>3@®A CƒDÚEGIHaITJ,KØKQL¡L¢LrLêKKäIPHYFøC*Aï=I:=6Ñ1-(Æ"OÏ>½ ]$0ý}ø&ô!ð„ìAéhæéãÌáà•ÞlÝ“ÜõÛ–ÛlÛsÛ§ÛýÛÜÝ×Ý£Þ‘ß‹àžá¹âêãåcæ§ç÷èDê’ëÜìîYï~ðœñ”òyó=ôÏôBõuõwõ5õ¯ôßóÅòVñšï…í+ë{è”åfâß–Û Ø}ÔüОÍoʆÇäĨÂÄÀS¿J¾µ½…½É½`¾e¿¬ÀIÂ#Ä5ÆyÈãÊmÍÐÉÒ‘Õ_Ø9ÛÞéà¾ã“æ[é'ìÜîšñ=ôáöwùü…þ÷gÃg © à1M^hi`V:!##ú$Ó&¡(n*-,ó-¨/a13½4d6 8¤9D;Ñå?eAÖB?D•EÞFH)I)JÿJ¹K;L‘L§L~LLCK#J£HÁFwD¹Aš>;7´2. )Ë#fäUÒ h(%þeùüôåð7íàéóæcä1â\à×ަݹÜܨÛqÛsÛ—ÛñÛ`ÜþÜ«Ý~Þ`ß[àháâ¯ãáä#ægç´èêPëœìÞíïGð_ñgòLóô·ô)õpõtõFõÈôôûò¤ñðïðí¤ëé(æã¼ß@ܾØ)Õ©ÑCÎ ËÈbÅÃÁ”¿x¾Ë½Š½³½C¾)¿lÀóÁÆÃÊÅÈjÊëÌ“Ï=Ò ÕÑ׬ÚÝ\à2ãæÔè˜ë\î ñÀóZöûø€û þíP¨ö : r Êãùòß Á"¡$u&K(*Ú+™-R/ 1»2k46º7R9ô:ƒ<>œ?ABùCREžFÓGôHõIÙJ“K%LL¦LˆL LoK\JöH$GîDIB;?½;Û7’3õ.*Ù$uúnäx -ÿSúÒõ±ñêí‚êƒçÝäâ´à!ßÞÝçÜ.ܾÛxÛqÛ’ÛÚÛNÜÚÜŒÝQÞ6ß(à2áJârã¥äãå(çrèÀé ë\ìœíßî ð*ñ2òóïó–ôõ`õyõKõéô0ô7óçñFðZîì‹éµæ¤ã_àïÜjÙÝÕTÒéÎ¨ËŸÈæÅ}ÃxÁÛ¿¨¾ç½½¨½ ¾ù¾)À¤ÁhÃcŘÇïÉsÌϾÑyÔK×Ú÷ÜÍß§âyåIèëÐí‰ð8óÚõzøûýuÜ1‡ Å 1_{‘¤›•{ h"@$&ê'»)+B-ü.·0g24Á5c79Ÿ:6<Æ=N?Ð@EB±CE[FšG·HÈI«JqK LqL¡L‘L8L“KšJ?I…GcEÑBÝ?n<¦8k4â/þ*à%… „ùˆ 1:û´ö{ò£î)ëè_åãáißÞÝRÜÑÛ„ÛsÛ‰ÛÌÛ5ÜÀÜfÝ.Þßùßþàâ9ãhä¢åéæ/èéÉêì]íŸîÎïñðÿñïòÉósôþôUõqõ[õùôWôió+òœðºî‹ì êHç=äá›ÝÚÖÓ’ÏEÌ3ÉjÆíÃÚÁ#À྾ž½š½¾Ç¾í¿UÁÃûÄ*ÇxÉôˈÎ5ÑóÓ¾Ö‘ÙhÜAßâîä½ç‡êIíð²òXõø÷ƒúý‡ÿ_à Y – Çô)9<<0 "ç#¿%‘'d)#+ï,£.a02Á3m57²8Q:å;x=?‚@üAkCÊDFVG‡HŒI„JJKîK^L›L”LPL¶KÎJ‡IáGÑE[Cq@&=d9J5Ç0û+à&™! ›– <,ü”÷Ió`ïÔë©èååyãrá¹ß^Þ@Ý{ÜäÛ”ÛsÛ‚ÛÀÛÜ¥ÜDÝÞÙÞËßÇàÝáþâ*äg奿ñç<é‰êØëícîïºðÊñ¿ò¡óQôäôDõlõaõ õ{ô˜ójòïðïýìŠêÑçÚä¤áEÞÌÚ8×µÓ8ÐèÌÉÉìÆhÄ8ÂtÀ¿*¾«½—½ê½¡¾«¿Á±ÂŸÄ¸ÆÉvË Î­ÐkÓ2ÖÙÜÛ´ÞŠádä/çÿé¿ì{ï.òÖôr÷ úüÿ‚ìJŸæ ' Z‡ªÀÔ×ÙÎÀ¦!Š#a%9')Î*”,O.0À1k35¾6d8ý9˜;(=µ>8@²A"C…DÜEGKH[IRJ%KÏKKLLšL_LÙKKËI8H>FÝC AÐ=&:6­1ð,è'Ÿ":®)§ H ýyøô"ðìGéiæðãÓá àœÞyÝšÜÜ¡ÛyÛ}Û´ÛÜÜ Ýâݭޜߓà¨áÁâòã'åfæ²çùèIê•ëÝìîXï}ð–ñŽòtó1ôÈô0õiõ`õ&õ•ôËó§ò;ñxïiíë[èpåCâòÞuÛï×^ÔèЄÍeÊtÇÞÄ¢ÂÃÀW¿R¾½½–½Ô½w¾v¿ÄÀ`Â:ÄOÆÈýÊ…Í+ÐâÒ§ÕyØMÛ(ÞýàÖã¥æsé7ìóî©ñRôòö‡ùü•þ vÕ)x ¶ î>Zktun`G!-#%ß&«(v*:,ú-±/l13È4l68¯9F;Ûí?gAÛB?D˜EÜFH'I"JþJ®K5L…LšLlL÷K.K JŽH¥FYDžAv>å:ë6’2á-å(®#HÆ<º SþYù÷ôßð5íáé÷æeä<â`àåÞ®ÝÅÜÜ´Û~Û~Û¥ÛúÛoÜݻ݅Þlßcàráˆâ¹ãæä+ælçºèêSëìßíïDð^ñ`òFó ô«ôõ`õcõ2õ³ôôóãòƒñÔïÑíëåèæåâ˜ß!ÜžØÕÑ-ÎúÊÈ\Å ÃÁ—¿€¾Ó½š½Â½U¾>¿€À ÂÜÃåÅ È€Ê Í¦Ï[ÒÕë×ÄÚ•ÝwàCãæåè°ëlî#ñÎóoö ù“ûþŽýa¶ F €±Ôò ýë Í"¬$‚&Q(*â+¡-_/1Ç2p46º7a9ô:<>ž? A‘BúCUEFÓGòHðIÔJŽKLyL—LyLLYKIJÜH GÑD,B?;¸7q3Ñ.ã)µ$[ØUÌb  ÿGúÉõ®ñäíˆê~çéäâ¿à'ßêÝïÜ=ÜÅÛ‡Û|ÛœÛéÛVÜéÜ•Ý^Þ=ß5à8áWâvã°äèå/çxèÅéë[ì¡íÛî ð"ñ0òóçóŽôõTõcõ=õÎôôóÉñ,ð7îõëi铿€ã>àÍÜLÙ¾Õ>ÒÏΙˎÈÜÅyÃsÁà¿«¾ó½œ½·½4¾ ¿AÀºÁ‚Ã}Å®Ç Ê†Ì'ÏÒÑ–Ôa×4ÚÝäß½âå]è&ëäíœðKóíõ‰øûœý„ëB” × An†¡¨¯©žŠ q"N$%&ø'Ä)Š+L-/¿0p24É5k7 9¦:<<Ì=S?Ò@JB²CE[F˜G¹H¿I©JiKLgL“L„L&L€K„J%InGBE·B¹?R<~8N4¼/Þ*½%e ñhâo "4û¦özòœî+ëèbåãávß$Þ!Ý[ÜÝÛÛ~Û•ÛÚÛ>ÜÍÜsÝ4Þßàáâ=ãsä©åðæ5è„éÑêìdíšîÒïëðüñéòÀókôñôCõdõCõèô=ôNóò|ðœîhìêé!çäâàvÝþÙkÖêÒxÏ2Ì$É\ÆêÃÒÁ(Àâ¾¾¦½®½¾à¾ÿ¿nÁ'ÃÅAÇ”É Ì¢ÎOÑ Ô×ÖªÙ~Ü[ß+âåÏçŸê\íðÈòjõ ø˜ú!ýœÿ sÎ! g £ Øÿ!6FHK90 "õ#É%ž'm)/+÷,¯.j02É3v57¼8V:î;|=?‰@þApCÉDFZGHIxJGKåKRL‘LƒLBL KºJpIÅG·E:CT@=C9'5£0Ø+À&t!}÷€ ( ü‡÷FóZïÖë©èéå~ã{áÁßhÞLÝ…ÜïÛ£Û|Û“ÛÉÛ+ܱÜOÝÞæÞÓßÔàåáã4äm坿õçAéêÙë í`î‘ï·ðÅñºò˜óGôÛô1õ`õKõúô`ôóLòÎðüî×ìiê¯ç±ä…á"Þ©ÚוÓ"ÐÒ̶ÉâÆ]Ä5ÂvÀ¿6¾µ½¨½ù½·¾À¿'ÁÌ´ÄÕÆÉ’Ë!ÎÉÐ…ÓKÖÙòÛÌÞ¡ázäGçêÔìïAòêô…÷úŸü%ÿW²ô 8 h—µÓÜèãßȵ!’#r%?')Ô*¢,U.0Ã1z3!5È6i8:œ;1=¹>;@¸A"CŒDØEGGHXIPJKÆKBL‚LLMLÅKìJ³IH"F½Cê@°=:û5Š1Í,Ä'"” ‘ 1ýoøôðìDéqæðãßáà¨Þ‚Ý¨Ü Ü®Û„Û‹Û¾ÛÜ‘Ü5ÝæÝ¾Þ£ß à±áËâúã/ånæ¶çÿèNê˜ëßì!îTïðŽñŽòió'ô½ô"õZõMõõ~ô°ó‹òñZïFíãê<èEå'âÉÞVÛÍ×DÔËÐsÍNÊiÇ×Ä™ÂÆÀY¿Y¾Ê½£½è½ˆ¾Ž¿ÙÀzÂTÄhƪÈËžÍGÐûÒÂÕ’ØfÛ?Þáîã¼æ‰éLì ï»ñgô÷žù#ü©þ‰ã=… Æ ÿ'Pd}…xnR!:#%ê&·(€*F,.¼/s1"3Í4w68¶9N;ßí?oAÜBCD›EÛFH$IJøJ¦K.LuL‘LYLèKKøIpHF8D€AR>Å:Æ6o2¾-Â(#'ª £ =þQùìôÜð3íàéùæmä?âkàìÞ·ÝÒÜ(ܾێۆ۵ÛÜzÜÝÄÝ’Þvßoàzá”â¾ãðä3ærçÁè êXëŸìàíïBð[ñ[ò>óôŸôõKõWõõŸôÙóÆòfñ¶ï®í^ë¿èàåÀâvßÜ€ØñÔvÑÎäÊøÇOÅÃÁ—¿‰¾Ý½¥½Ö½c¾X¿•À&ÂõÃÿÅ9ÈœÊ$Í¿ÏwÒ6ÕØÚڱ݈à`ã0æÿèÃë‚î5ñâó…öù«û'þ£ pÇ X ޾äý! ÷ Ø"¶$Ž&\((*í+¬-g/1Í2|4#6Å7f9þ:<">¢?$A”BýCVEžFÒGïHìIÐJ„KLjLŽLeLLAK5JÂHîF·D Bû>z;•7O3­.Â)’$;»:²N ÿ7úÆõ¥ñãí…ê…çèä«âÀà5ßñÝüÜGÜÔÛÛÛ¤ÛùÛ_ÜöÜžÝlÞFß@àCá^âƒã´äóå1çèÆéë]ì¤íÚî ð"ñ)òóÝó‚ôûôCõTõ&õºôôó­ñ ðîÓëFéoæ_ãà¯Ü+Ù£Õ Ò¼ÎƒËÈÓÅlÃxÁÜ¿¶¾ü½¨½È½E¾!¿UÀÕÁ—ÙÅÇÇ&ʤÌ=ÏïѯÔz×NÚ$ÝûßÔâ¦årè=ë÷íµðZóö›ø(û²ý#™÷V  è !Q{•®·»·ª– }"X$4&ÿ'Ô)+Y-/Ë0w2)4Ï5t79¯:@<Õ=T?Ú@LBµCE[FšG´H¿I¡JdKùK\LˆLrLLnKlJIOG)E—B™?1<]8)4›/»*œ%G ÓLÊY úÿ%û öqòšî*ëèeåãáß.Þ(ÝkÜæÛžÛ‰Û¢ÛäÛLÜÖÜ~ÝAÞß àá#âIãxä°åøæ8è‹éÒêìaíŸîÍïëð÷ñâò¹ó`ôåô6õQõ3õÐô&ô5óòñ]ð~îDìÊéüæûã¼àYÝÜÙNÖÐÒaÏ ÌÉRÆàÃÓÁ&Àé¾¾³½½½'¾ô¾À‡Á=Ã3ÅYǯÉ%̽ÎhÑ$ÔòÖ½ÙÜkßJâåêç²êpí,ð×òõø«ú1ý­ÿ…Þ/ z ¯ ê -HOYSK5 !"û#Õ%¬'q)@+ü,».s0#2Õ3|5#7Á8^:õ;‚= ?@ÿAwCÇD#FTG„H„I}J:KàKKLL{L+L‘K¢JXI¬G›EC7@Ü<&9ý4‡0±+¡&S!æbÝh ÷ü‚÷8ó^ïËë´èäå‹ã{áÍßoÞWÝÜüÛ«ÛŽÛ™ÛÙÛ5ܼÜ\ÝÞîÞáßÙàñá ã>ärå¶æûçHéêÞë íaîïµð¿ñ¸ò‹óBôËô'õNõ9õåôJôfó2ò²ðÚîºìCêçäaáÞ‡Ú×yÓ Ð¼Ì©ÉÕÆUÄ3ÂrÀ#¿:¾Â½¶½ ¾Ë¾Ö¿=ÁãÂÏÄíÆ9É«Ë;ÎãÐÓfÖ3Ù ÜáÞ¼áä^ç'êêì¥ïTòýô—÷.ú´ü1ÿ§ mº B z£ÄÞìòóçØ¾! #{%M')â*©,`. 0Í13)5Ð6q8 :¥;3=Á>@@ºA)CˆDßEGJHUIIJK¾K7LzLzLAL±KÖJœIHF CÌ@‹=ç9Ô5j1«,¡'b"øwò{ óý`øôð}ìGéræùãááà°ÞŒÝ´ÜܽÛÛ˜ÛËÛ Ü¤Ü9ÝöÝÄÞ°ß©à¸áÕâä6åuæ»çéPê›ëâì!îTï|ðŠñˆòbóô±ôõGõ?õøôhô–óoòÿð:ï%íÂêè(åâ«Þ6Û°×)Ô³Ð`Í;Ê_ÇËÄ˜ÂÆÀ\¿b¾Õ½°½ù½¾ ¿òÀÂjăÆÅÈ.˽ÍZÐÓÙÕ©ØÛSÞ/áÿãÔæœébìïÏñyô÷¯ù5ü¶þ,•õL‘ Ú =Vy„Žˆva!A#%ò&Ã(Š*O,.Æ/z1,3Õ4~68»9V;ãò?rAáBDDœEÚFH!IJñJŸK#LkL‚LJLÔKKÞIWHsFDaA5>Ÿ:©6I2ž-¡(m# )õûýEùåôÙð/íåéúæsäEâtàòÞÆÝØÜ6ÜÊÛ•Û˜Û¼Û܇ÜÝÓݙނßwàƒáâÆã÷ä8æzçÃèêWë£ìáíïAðWñTò8óûó“ôõ<õDõõˆôÁó©òLñ”ïŒíAë˜èÁåœâTßàÛbØÓÔaÑÎÕÊéÇFÅÃÁœ¿¾é½²½æ½w¾j¿®À9ÂÄÆVȵÊ;ÍÚÏŽÒOÕ ØñÚÉÝ¡àrãJæéØë•îJñôó˜ö*ù¼û8þµƒÔ& b  Ëñ-('!ä"Ã$—&i(1*ø+µ-r/&1Ö2…4)6Ï7k9;–<&>¨?&A›BüCZEœFÑGîHèIËJ}K LbL}L\LêK4KJ®HÓF˜DîAÚ>Y;t7+3Œ.Ÿ)t$£Ÿ4 úïþ2ú¸õ¤ñßí‡ê‰çìä°âÊà>ßúÝÝSÜÜÛ¡Û‘Û¸ÛþÛpÜþÜ­ÝsÞTßFàNágâ‡ãÁäóå?ç€èÐéëdìŸíàîð$ñ"ò óØórôóô/õGõõ§ôäóèòñîï÷í°ë%éIæ?ãõߎÜÙ„ÕÒ¨ÎlËxÈÂÅnÃpÁ⿺¾¾·½Ø½U¾6¿kÀêÁ²Ã®ÅãÇ=ʾÌWÏÒÆÔ•×cÚ=Ýàéâ»å‰èNëîÂðtóö±ø7ûÃý5¨ c² ö 0`ˆ¤¹ÆÆÆµ£ †"f$<&(Ø) +]-/Î0…2/4Ù5{79´:J<×=\?Ý@OBºCE^F“G¸H¶I¡JZKñKPL|LcLLXKWJöH6G EzBx?<;84w/›*z%' µ0±C þèÿû’önò–î+ëèmåã*á„ß:Þ4ÝsÜõÛ§Û—Û®ÛðÛXÜáÜŠÝKÞ)ßàá+âTã~äºåúæCè‹éØê ìaí¡îÉïëðññÞò­óYôÖô*õ?õõ»ô ôóÔñAðZî&ì¦éÛæÚã–à<ݹÙ4Ö¶ÒIÏÌÉHÆÚÃÐÁ(Àð¾¾Ã½Ë½7¾ ¿*ÀžÁWÃIÅsÇÉÉ?ÌÕ΂Ñ<Ô ×Õٳ܃ß^â1åüçÇê‡í;ððòŽõ.ø¼úCý¾ÿ.•íA „ Á ô:T]g^Y@ ,"$â%²'‚)D+ -Â.}0+2ß3‚5.7Æ8f:ù;‰=?@BqCÑDFYGH„IuJ6KÕK?LvLkLL~KŒJAI’G~EC@¿<9Ý4c0‘+&6!ÉEÈP åüw÷7óUïÒë°èïå‹ã†á×ßuÞgÝ“Ü۪ܵۗÛÞÛGÜÄÜhÝ'Þ÷ÞëßäàúáãFäy弿èJé–êßë#í`îï²ð»ñ²òƒó9ô¾ôõ=õ&õÐô1ôMóò’ð½î–ì%êjçnä?ááÝiÚäÖ`ÓôϪ̘ÉËÆLÄ2ÂrÀ(¿C¾Ì½Æ½¾Û¾î¿PÁÃâÄ ÇLÉÈËRÎüиÓzÖPÙÜûÞÐá¢ävç9êí¶ïhòõ©÷AúÂüGÿ² vÐ U †²ÐíöþóãÌ!ª#†%Y'%)ï*°,l.'0Ù1ˆ335Õ6y8:ª;:=Å>C@ÀA)CŒDÝEGFHQIGJK¸K.LjLqL,L£K¿J‡IèGïEC°@j=Â9µ5F1‰,€'C"Ù]Ùa áûüXøôð}ìJétæäèá&àºÞ—ݾÜ$ÜÅÛ›Û¥ÛÓÛ3Ü©ÜIÝýÝÓÞ¶ß¶àÀáÝâ ä<å}æÁç éTêžëãì îVïvð‰ñ‚òYóô£ôõ9õ)õåôPô~óSòãðïížê÷çåßáŠÞÛ‘×Ô™ÐMÍ,ÊQÇÅÄ“ÂÅÀb¿h¾ß½À½¾²¾³¿ Á¨Â‚ÄŸÆÙÈLËÓÍwÐ-ÓöսؘÛkÞBáäææ´ésì2ïáñŠô,÷¼ùJüÆþ;§Y£ ã Gi‚’œ›’…j!O#)%þ&Ë(—*W,.Î/†123á4ƒ6(8Ã9[;ìú?sAåBCDžEÛF HIJëJ–KL^LuL:LÀKðJÇICHTFÿCCA>‚:„6*2z-(L#ìríu ãðý9ùßôÕð.íäéÿæuäPâyàßÊÝëÜ;ÜÚÛ¡Û¡ÛÌÛÜ’Ü)ÝÚݨމ߃à‹á§âÌãå:æƒçÇèê]ë¢ìãíï?ðSñOò3óîóŒôóô0õ/õñôsô¥ó“ò(ñxïmíë|è—å~â1ßÂÛ@ؾÔCÑîÍÄÊÚÇ?ÅúÂÁŸ¿•¾ó½Â½ó½¾{¿ÆÀQÂ(Ä0ÆmÈÏÊUÍòϧÒjÕ5Ø ÛÜݸàŠã\æ*ééë«î]ñô®ö8ùÐûHþÄ-å3 r ®Ù,872" !ò"Ë$¢&t(8*,¿-z/01Þ2‹426Ö7q9 ;ž<'>±?'ABDXEŸFÎGìHãIÄJvKLVLoLJLÛKKJ“H¸F|DÏA»>7;T73m.{)W$ùˆ‰# çâþ&ú³õžñàí†êŒçòäµâÕàEß ÞÝ`ÜèÛ¬Û ÛÁÛ ÜyÜ Ý·Ý~Þ^ßOàYálâ”ãÅäûåDç…èÔéëeì íßîðñòóÊóoôÝô)õ+õõ‡ôÓóÉòrñÐïÔí“ëé+æãÕßoÜïØiÕòÑÎ`ËfȽÅfÃtÁâ¿Ä¾ ¾Ä½è½h¾L¿‚ÀÂÉÃÉÅûÇWÊÕÌqÏÒâÔ¨×}ÚTÝ'àãÎåŸèbë!îØðó)ö»øOûÍýK²kÇ þ Bl•±ÅÓÑÓ½³ Ž"s$E&(å)¤+m-/Ý0‰284Ý5…7 9»:O<Ù=c?Þ@SB»CE\F–G±HµI™JTKçKFLnLSLõKDKAJàHGïD[B\?ê; 8â3Y/z*Z% ˜š0 íÜÿûögò—î,ëèqå$ã.á“ßAÞ@ÝÜۣܵ۷ÛÜ_ÜòÜÝ\Þ,ß&àá9âXã‡äÁåçEè“é×ê$ìcíîËïäðëñØò¦óLôÊôõ/õ õ£ô÷óÿò¸ñ#ð9îì€é¼æ²ã|àÝŸÙÖÒ4ÏûË÷È;ÆØÃÉÁ.Àó¾,¾Î½Ú½J¾¿?ÀµÁmÃeÅŠÇâÉYÌíΜÑUÔ"×ïÙÇÜßrâEåèÚê™íQðÿò¤õ?øÍúSýÏÿ<¦ûP ” Î 'K^lqkcM 3"$ç%Á'ˆ)R+-Ð.€092ã3Œ547Ì8o:û;’=?˜@BvCÐDFXG{HƒIlJ2KËK5LhL[L LjKwJ)IxGaEåBó?¢<Ý8¿4?0r+^&!ª-«A îÝùûo÷4óQïÔë±èóå’ãáÝß„ÞnݤÜÜÃÛ¤Û³ÛðÛMÜÓÜsÝ/ÞßòßíàâãMä‚åÁæèPé™êàë'í^îï®ð¸ñªò}ó,ô´ôõ.õõ¼ôô1óúñtðœîuìêFçMäáÃÝFÚÌÖ?Óâϓ̊ɾÆEÄ.ÂuÀ,¿K¾Û½Ð½3¾ë¾ÀhÁÃÅÇoÉÛËqÎÑÒÓ”ÖfÙ9Üßåáºä‡çQêíÌïzò"õ¼÷Oú×üVÿÂ/ˆÜ% ` •ÀÞúñÓ!¹#%b'1)ø*¸,z.-0ã1395ß6€8:°;@=È>K@ÁA/C‹DßEGCHQI>JK­K%L_LaLLŽK«JpIÐGÓEaC@J=£95'1d,a'""»AÀL úÓîüMøôð|ìKéwæäñá.àÄÞ¡ÝÉÜ2ÜÎÛ«Û¬ÛäÛ;ܶÜTÝ ÞÚÞÄß»àÎáæâäE傿ÅçéTê¥ëâì$îSïrðˆñxòVó ô™ôúô'õõÊô@ô^ó;òÄðùîäì€êÏçåä»áiÞ÷Úu×óÓ…Ð6ÍÊEǼĒÂÂÀj¿k¾ð½Ë½¾Ä¾Ê¿ Á¿ÂžÄ´ÆùÈbËíÍ’ÐEÓÖÖØ°ÛÞ\á-äþæÆéŠìBïùñ›ô?÷Íù[ü×þMµgµ ï +Qx ©¦Ÿw!Z#3% 'Ô(¤*],$.×/1=3æ4Ž6,8Í9^;ô<{>þ?xAåBHD›EÞFHIJåJ‘K LVLdL,L­KÜJ¯I)H:FáC$Aô=`:a6 2U-d(+#ÍXÒ` Õàý4ùÕôÓð*íééç~äSâ„àß×ÝòÜKÜâÛ°Û¬ÛØÛ(ÜžÜ5Ýåݳޒßà’á°âÔãåDæ„çÏèê`ë§ìÞíï6ðUñFò*óèó|ôêôõõßôZôŒóxò ñWïPíõê]èså_â ß§ÛØ¥Ô)ÑÜͰÊÑÇ4ÅøÂÁ¢¿¾ü½Ó½¾¡¾‘¿ÛÀkÂ>ÄJÆ…ÈéÊmÍп҂ÕMØ"ÛõÝÍà¢ãpæ>éÿë½îqñô½öMùßûZþÕ= ôB ºé *6ED;1!û"Ø$«&€(C* ,È-‚/:1ç2’4=6Ø7|9;¥<,>¶?+A BDZEžFÎGçHàI½JpK÷KJLcL:LÌKKðIyHFbD­A>;17æ2J.Z)8$Ønår ×ÕþúªõšñÞíˆêŽçúäºâÞàOßÞÝjÜôÛºÛªÛÎÛÜ…Üݿ݌Þdß_à^áyâšãÌäæGçè×éëhì¡íÝîðñòó¿ódôÑôõõìôtô¹ó­òXñ®ïµípëÞèæ÷â´ßLÜÓØLÕØÑzÎLËYȲÅaÃqÁä¿Ì¾¾Ô½õ½|¾`¿–ÀÂâÃàÅÈpÊðÌŠÏ9ÒùÔÃוÚiÝCàãêå®èzë5îìð•ó:öÏø`ûàýZÆ)ƒÍ  J|£½ÖÜáÛϸ ¡"x$T&!(ð)¯+v-)/æ0“2@4è5Š7+9À:W<Þ=j?á@WB½CE_F’G±H±I•JLKßK;LbLBLæK0K+JÇHGÖD:B;?Í;ø7Ã34/U*=%ê{ý€ ÙÍÿû‡ö`ò–î(ë#èqå.ã2áŸßIÞLÝ‹ÜÜÅÛ«ÛÇÛÜqÜøÜ¢Ý`Þ=ß+à-á@âbãäÆå çJè™éÚê(ìcížîÈïáðéñÏòžó@ô¿ô õõ÷ôŽôÞóæòšñðîäë_陿ãYàôÜÙøÕ…ÒÏéËèÈ/ÆÑÃÈÁ0Àø¾4¾Û½é½^¾/¿VÀÍÁ…Ã~Å£ÇþÉpÌ Ï²ÑpÔ:×ÚßܳߊâZå(èïê¯ídðó¶õPøâúbýâÿL¶ ^ £ Ý 8Vmy|znY B"$÷%É'”)[+-Õ.0=2ï3”5:7×8r:<”=?™@BvCÔDFYGwHIfJ+KÂK-LXLQLôK]K^JI]GEEÆBÔ?<¾8š40O+<&ù Š’) ßÇòûb÷-óNïÓë±èûå•ã˜áæßŒÞ{ݬÜ$ÜÌÛ´Û½ÛüÛZÜÜÜÝ8Þßúßûàâ+ãQä‹åÈæ èWéšêçë#íbîŒï«ðµñ¡òwó ô§ôüôõõ¢ôôóÜñXð|îTìàé$ç*äúàŸÝ+Ú©Ö,ÓÅÏ„ÌzɰÆDÄ%Â{À.¿V¾æ½â½B¾¿À~Á/ÃÅ:Ç‚Éû˃Î2ÑçÓ­Ö~ÙPÜ(ßýáÎäžçdê'íÞïò6õÍ÷dúæüeÿÖ=™ë1 r ¡Ïë üá!Ã#›%m'<)+Ä,‚.50î1–3D5ç6…8$:´;I=Ê>R@ÂA3CDÞEGBHLI%'à(ª*k,+.á/—1D3ð4“668Ð9h;ö<‚>@|AéBHDŸEÙF HIJÞJŠKLLLVLLœKÆJ›IHFÈCAØ=<:B6æ17-?( #¯:ºI îÆÐý,ùËôÒð(íééç€ä]â‹àßåÝøÜ[ÜëÛ¼ÛºÛáÛ6ܧÜAÝïݽޞߖàžá¶âÞãåKæŒçÐèêaë¨ìäíï<ðIñGò óßósôÚôõ õËô@ôxóYòñð:ï,íØê7èUå9âîÞƒÛ؆ÔÑÁͤÊÀÇ,ÅõÂÁ¬¿œ¾¾×½¾®¾©¿îÀ†ÂRÄfƛȈÍ&ÐÙÒšÕgØ7ÛÞäàµãŠæOéìÓîñ2ôÉödùíûlþæK±P ’ Æø5HNTF>!! #á$¸&‰(N*,Ñ-/@1ò2›4D6á7‚9;¨<6>³?5AžBDXEžFÎGâHáI´JlKêKALUL,L·KõJØIbH„FCDA}>ô:7Ã2'.;)$¾NÌ[øÅÉþú¦õ’ñÞí…ê•çùäÅâãàYßÞ(ÝtÜÜÄÛ·ÛÚÛ!Ü•ÜÝÐÝ‘Þtßcàká~â¤ãÑäæHç—èÕé%ëfì¤íÝîþïñò÷òºóWôÆôõ õÙô^ô ó“ò:ñ’ï”íOë»èæå×â‘ß/ܳØ2ÕÀÑdÎ;ËLȧÅ\ÃnÁë¿Í¾!¾á½¾’¾o¿°À,ÂÿÃõÅ1ÈˆÊ Í£ÏRÒÕÛ׫ڃÝTà/ãøåËèˆëLîüð«óIöäønûòýjÕ9’Ü $ XŒ¯ÌáéðäÜÄ ©"ˆ$Z&0(õ)¿+y-8/ë02G4ñ5739Ä:_<â=o?å@YBÁCE`F‘G¯H¬IJDKØK.LVL5LÒKKJ¯HèF¶D!B?¬;Ú7Ÿ3/5*%Ìbßn ÈÀÿ÷úö\ò’î*ë#èyå/ã?á ßXÞTÝ”ÜÜÌÛ»ÛÑÛÜyÜݧÝpÞDß4à8áFâkã–äÏå çSè˜éáê(ìdíŸîÅïáðáñÊò–ó5ô¶ôøôõäôyôÇóÌò~ñèïúíÅë>évæqã5àÙÜ^ÙâÕgÒ ÏÕËÚÈ'ÆÈÃÉÁ/À¿=¾ç½ù½o¾C¿lÀãÁ›Ã–żÇÊŠÌ!ÏÍцÔS×ÚøÜÇߢâmå?èëÃíwð&óÇõcøñútýðÿ]Än ® ï Eex†‰„ze L")$&Ô'ž)d+$-â.”0I2ö3›5B7Þ8x: <š=?Ÿ@BzCÓDFVGwH~I_J'K¸K#LNL@LèKGKJJüHDG+E§B¶?a<š8}4ú/.+&Ø rö{ ͸æûY÷'óLïÑëµèýåœãžáîߖރݺÜ-ÜÚÛºÛÍÛÜiÜçÜŠÝEÞßàáâ/ã]äŽåÑæè]éêêë%ícîŠï©ð¯ñœònóôšôîô õîôôëóþòÄñ7ð_î3ì¿éçäØàÝ ÚŽÖÓ°ÏpÌjÉ©Æ7Ä(ÂxÀ5¿^¾ð½ò½R¾¿/À•ÁEÃ0ÅRÇœÉÌ›ÎJÑÔÃÖšÙcÜAßâãä´çxê<íñï¡òGõÞ÷wúóüzÿãN¨ú@ € °Úý$"' ê!Ð#¤%y'D) +Í,Œ.>0ö1Ÿ3K5î68):¼;L=Ò>S@ÇA3C’DÜEG>HJI6JKœKLDLHLûKkKJAIžG›E(CR@ =_9O5ß0%,'ä! " Ò¶Ñü<øõóð}ìK邿äÿá>àØÞµÝàÜCÜíÛ½ÛÈÛùÛRÜÎÜiÝ ÞðÞØßÏàßáöâ"äQ呿Ðçé_ê¥ëëìîUïnð~ñnòFóöó„ôÝôõõô¡ôô.óò‰ð¹î§ì7ê’ç›äxá(Þ·Ú<×¼ÓVÐ ÍþÉ-ǬĉÂÅÀn¿‚¾¾ì½:¾ì¾ó¿NÁíÂÏÄçÆ'É™ËÎÅÐyÓ;Ö ÙÛÛ±ÞˆáXä(çòé­ìrïòÉô]÷öù|üøþqÑ9ƒÒ  Cp”§½¾Â·¦!p#H%"'è(·*t,4.ë/ž1O3õ46>8Ô9t;÷<‹>@‚AêBND›EÞFHIJÛJ€KúK?LGLL‰K²JƒIôGF¨Cæ@³=:6Ã1-(í"‘£- ß®ÊýùÊôÇð*íçé ç‡äaâ•àßëÝ Ý`ÜùÛÈÛÂÛïÛ@Ü´ÜKÝüÝÆÞªßžà©á¿âçãåRæ‘çÙèêfëªìåíï:ðDñDòó×ófôÎôÿôûôµô-ô[óAòÔðïí³êè0åâÎÞbÛè×kÔûЯ͑ʴÇ#ÅïÂÁª¿ª¾¾ë½&¾Ã¾½¿Á›ÂoÄyÆ»ÈˤÍ=ÐóÒ²Õ€ØNÛ'ÞøàÎãæhé(ìçî•ñBôÞötùÿûþõ^¿_   Ø*@V[`RK,!#î$Á&”(Y* ,Ü-—/I1ù2¥4I6ì7‡9;²<7>½?4A¦BD]E›FÏGÞHÝI®JdKáK7LFLL¤KáJÃIGHlF"DvAX>×:ì6¢2.)ø#œ2²A峸þú›õñØíˆê”çåÊâêàcß#Þ3Ý~Ü ÜÑÛÁÛéÛ+Ü Ü*ÝÙÝžÞ|ßnàsá‡â®ãØäæQç˜èßé&ëiì¦íÚîÿïñòðò±óKôºôøôûôÅôHôˆóxòñqïuí.ë™èÅå±ârß Ü”ØÕ£ÑPÎ'Ë?ÈÅWÃkÁí¿Ô¾,¾í½¾ ¾‰¿ÂÀIÂÄÆIÈ£Ê"Í¿ÏkÒ*Õõ×ÁÚÝkàEãæáèžë`îñ½ó_öôø‚ûþ~äK î 1 k—ÀØïøúôçÑ µ"‘$i&9(*É+„-@/÷0¤2Q4÷5›769Ñ:_<í=p?ê@aB½CE[F’G®H§I‹J>KÌK'LGL'LÀK KJ“HÑF•DBö>;µ7}3ð.*ù$«AÅQï ¶¯ÿëútöVòŒî-ë è‚å2ãGá«ß`Þ_Ý¢ÜÜÜÛÄÛßÛ܈ÜݶÝxÞOß?à@áSâpã¡äÓåçXèœéçê'ìiíîÅïÜðÞñÄò‹ó0ô¢ôïôúôÒôaô°ó°òcñÇïÛí ëéPæNãà·ÜAÙÂÕNÒñÎÃËÉÈÆÁÃÆÁ1À¿F¾ó½ ¾€¾X¿ÀúÁ·Ã­ÅÙÇ-ʦÌ;ÏçÑ¡Ôk×8Ú Ýãß¶â†åTèëØíŒð8óÝõtøû…ýmÔ/x Å ú -Ss†”–“…t U"5$&Ý'«)m+0-é.¢0O2ÿ3£5I7æ8:<ž=%? @BzCÖD"FSGyHuI_JK²KLCL-LÛK-K;JÞH,G E‰B˜?;<{8T4Ú/ +ü%· RÛaý ¸¨ØûP÷óIïÏë·èÿå¢ã¥á÷ßžÞŽÝÄÜ8ÜæÛÇÛ×ÛÜrÜôÜ•ÝPÞ'ß àáâ6ãgä”娿è_é¢êëë&ídî‡ï¨ð©ñ˜òeóôôáôøôÜôyôÓóæò¥ñð;îìœéßæèã²àdÝèÙtÖöÒ™Ï^ÌXÉŸÆ0Ä%Â{À7¿j¾ú½¾d¾(¿FÀ­Á]ÃJÅkǸÉ*̺Î`ÑÔÜÖ±Ù|ÜXß(âüäÈçêNíð´òYõô÷„ú ý„ÿù\¸ P Àé -20% ù!Ù#¯%…'O)+Û,.M0û1©3T5õ6“84:½;W=Ò>[@ÉA7C‘DÞEG9+5À0,þ&Â!dív À¥Äü4øëóðyìOéæäâKàÞÞÂÝèÜSÜòÛÎÛÒÛÜ]ÜÛÜrÝ.ÞøÞãßÚàäáã%ä]啿Øçéeê¨ëêì$îPïmðzñeòBóêóyôÍôøôâôô÷óóéñið îìêjç|äXáÞ˜Ú×£Ó=ÐýÌéÉ$ǣąÂÇÀq¿Š¾ ¾ø½N¾û¾ ÀbÁÃçÄþÆFÉ­Ë;ÎÙЕÓSÖ$ÙòÛÊÞœápä=çêÈì|ï2òÔôt÷úŽü ÿ€ãG•à  RŸ·ÉËдš!z#V%('ö(À*|,A.ò/ª1U35£6F8Ý9w;=Œ> @AòBLDžEÜFHIJÒJzKñK3L7LLtKŸJlIÚGêEŒCÄ@•=ø96Ÿ1ô,ü'Ë"s† Ç¡¸ýù¾ôÈð$íìé çŒäjâ™à&ßõÝÝmÜÜÔÛÍÛþÛHÜÃÜVÝÞ×ޯ߬à®áÌâêã#åTæšçÜè$êhë¬ìäíï8ðAñ<òóÌó]ôÀôîôêôôôCó$ò¶ðüîêì—êòçåõá¬ÞCÛÊ×NÔåК̀ʨÇÅìÂÁ²¿­¾#¾ô½:¾Õ¾Ò¿Á¯Â‹Ä‘ÆÕÈ5˺Í[Ð ÓÎÕ•ØiÛ<Þáæã±æ|é@ìöî¯ñOôõö„ùüþoÐ!s © ë8Ncgm`TÀ?;A¦B DZEžFÍGÝHØI©J[KÛK(L:LL‘KÐJ¨I2HMFDVA9>¶:È6‚2â-ù(Ó#š(ÑŸ¬þ÷ù–õ†ñÚí†ê—çåÎâôàkß,Þ@݇ÜÜÙÛÏÛòÛ;ܨÜ9Ýàݬބßyà}áâ¶ãßäæVçŸèáé*ëkì¦íÚîýïñ òéò§óBô­ôèôéô²ô0ôró]òñUïTí ëwè£åâRßíÛwØûÔŽÑ7ÎË-È—ÅOÃmÁí¿ß¾3¾ú½&¾²¾¿×ÀaÂ(Ä-Æ_È¿Ê<ÍÕÏ…ÒBÕ ØÜگ݇àUã*æïè¸ëoî(ñÌósöù–ûþó[°û C t©ÊéûòÝ À"$s&C( *Ñ+-I/þ0®2Y46¡7>9Õ:g<ò=u?ð@`BÄCEaFG­H¡I‡J7KÄKL9LL®KøJéIH²FDáAÝ>i;–7[3Ð.ò)Ø$Ž$­:Ù ¥ŸÿâúköPòî)ë&è‚å;ãLá·ßfÞmÝ©Ü-ÜæÛÎÛìÛ'Ü–ÜÝÃÝÞZßHàIá[âxã¨äÚåç\è¢éèê,ìiížîÁïÝðÖñ¿òƒó#ô™ôÞôéô¿ôKô™ó”òHñªïºíƒëùè2æ+ãôß—Ü#Ù¨Õ5ÒÝα˺ÈƸÃÉÁ0À¿N¾¾¾•¾i¿™ÀÂÏÃÇÅîÇKÊ»ÌWÏýÑ»Ô×OÚ&ÝößÍâ›åhè,ëìíðLóíõ‡øû™ý~ä;‹ Ð :b}–ž£Ÿ€ a"A$&ê'²)z+7-ó.©0Z24®5O7í8†:<©=%?¨@B~CØD FTGtHtIYJK¨K L7L LÈKK"JËHGôDjBy?<[834¹/ê*Ü%› 4ÀKå ©˜ÎûG÷óDïÑë·èæªãªáà¦ÞšÝÐÜAÜõÛÑÛäÛÜ|ÜÝ ÝZÞ1ßàá$â@ãmäœåßæègé¤êîë*í_î‹ï£ð¦ñ’ò\óô‚ôÐôêôÇôdô¾óÇòŽñúï îïëéºæÆã”à>ÝÐÙRÖáÒ€ÏJÌJÉ“Æ,ÄÂ}À<¿r¾¾¾t¾=¿ZÀÂÁwÃaŃÇÔÉ@ÌÕÎyÑ2ÔøÖÄÙ™Ükß@âåÚç§êaíðÉòiõø•úý–ÿlÈ ] ž Ëù,;><2 "â#½%'[)+â,œ.T02µ3W57š85:Ê;U=ß>X@ÒA5C˜DÛEG7HFI,JñJKøK2L'LÛKBKYJIqG]EóB@Ë<9 5œ0à+Û&¦!EÒ\õ ­–¸ü)øèóðzìN鉿ä âQàéÞÌÝôÜ^ÜýÛÜÛÛÛÜfÜèÜÝ6Þßéßåàðáã0äbåœæÞç éiê«ëëì$îLïoðpñeò3óåójôÂôçôÌô|ôÝóüòËñMð}îcìõéLçXä6áäÝ{ÚÿÖŠÓ%ÐèÌÛÉÇœÄÂÉÀt¿•¾¾ ¾\¾¿À|ÁÃÅÇ[ÉÎËMÎùЪÓlÖ<Ù ÜâÞ²áˆäOçêØì•ïBòéô†÷úŸüÿŽ÷Q¨ì . _Ž«ÇÒÝ×Óº©!…#`%3')È*Š,F.þ/±1^35ª6M8ã9|;=’>@‡AòBOD EÛFHIýIÐJnKêK$L/LêKgK†JYIÀGÐElCª@q=Ý9Ù5€1Ò,Û'¯"Rçm ´­ýù¼ô¿ð'íééçäqâ¤à+ßÞÝ}Ü ÜàÛÛÛÜWÜÍÜ^ÝÞÚÞ¿ß±à½áÍâùã#å_æŸçàè&ênë©ìêíï5ð>ñ5ò óÂóQô²ôàôÖôŠôô*ó òšðÛîÍìsêÑçíäÕá‰Þ'Û©×9ÔÉЊÍmÊœÇÅâÂÁ®¿»¾(¾¾G¾é¾è¿0ÁÌžĮÆëÈNËÕÍrÐ$Óäծ؀ÛSÞ'áúãÇæ‘éRì ïÀñcô÷–ù#ü¡þ€Ý4} ½ ó!C]nvvn^G!*#%Ø&§(o*3,ï-¨/\1 3´4Z6ú7–9);¾<@>É?:A«B D[E FÇGÝHÒI¦JRKÑKL/LúK„K¶J˜IH4FìC5A>‘:ª6]2Â-Ö(µ#a÷€½œþðùŒõ„ñ×í†êœçå×âüàqß<ÞCÝšÜ"ÜæÛÜÛüÛGܵÜAÝðݳÞ߃à„áâ¹ãëäæ^ç£èæé-ëmì¦íÛîøïñòãòžó7ôôÛô×ôôôUóEòäð4ï7íêêXèåpâ0ßÌÛ\ØÝÔvÑ&ÎË$È‹ÅMÃkÁñ¿å¾=¾ ¾4¾Ç¾±¿ïÀwÂBÄDÆ|ÈÕÊXÍíÏžÒ[Õ$ØôÚÆÝàlã?æéËë†î6ñäó€öù¤û%þœi¿ N †´Úô å Î"§$}&N(*Þ+•-W/1¸2a46¨7G9Ù:q<ó=|?ñ@cBÈCE`FG¦H¤I{J4K·KL*L L›KåJÑIiH”FcDÅAº>K;q7;3­.Ò)·$p”È ‘“ÿÕúeöJòŠî,ë'è‰å?ãWáºßyÞnݼÜ4ÜôÛÚÛ÷Û4Ü¡Ü$ÝÎÝŠÞfßQàSádâ€ã°äàå#ç`è¨éìê-ìlíšîÆïÑðÙñ´ò{óôŠôÏôÛô§ô9ô~ó{ò,ñ‰ïŸí\ëÝè æ ãÑßxÜÙŽÕÒÉÎ˯ÈÆ·ÃÃÁ5À¿Z¾ ¾)¾¥¾¿­À'ÂçÃßÅ È_ÊØÌoÏÒÓÔ›×fÚ=Ýàââ²å~è?ëî¯ðcóÿõ™ø'û¨ý#õH  Ù Ik’œ¯­®› i"O$ &ô'½)„+@-/°0b24´5W7õ8‹:<«=,?«@BCÙD FTGpHrIRJKŸKL&LL´K K J²HöF×DMBX?þ;584“/Ê*º%{ ¤1Ô ’½ûA÷ó@ïÐëºèæ­ã´áà³Þ¡ÝÛÜOÜýÛßÛîÛ+Ü‡Ü Ý©ÝgÞ9ß%àá/âGãuä¤åãæ ègé­êíë.í^î‰ïŸð£ñŠòVóùówôÁôÚô´ôNô¦ó°ònñàïÿíÑë[éšæ¢ãuàݱÙ8ÖÄÒoÏ3ÌBɃÆ'Ä€ÀB¿|¾¾!¾…¾S¿mÀÜÁ‹Ã|ÅÇêÉ^ÌìΓÑKÔ×Üٰ܃ßVâ'åñç¹êwí,ðÛò~õø¨ú-ý¦ÿ|×) l ¬ Ú#:GLH=* "î#Ç%™'d)*+ë,¦.^0 2»3`57 8@:Ë;^=á>^@ÓA;C”DàEG6HCI&JìJ‡KðK"LLÈK2KAJúHSGEEÑBó?ª<ú8è4|0¼+¾&ƒ!*¶Cß š†«ü øàóÿïwìR鉿"äâXàóÞÖÝþÜjÜÜçÛæÛ"ÜqÜó܉ÝCÞ ßùßéàüá ã<äf妿àç)égê´ëèì(îJïkðnñ^ò,óÛó]ôµôÔô¿ôaôÍóÝòµñ*ðdî<ìÜé#ç:äáÄÝ]ÚáÖqÓ ÐÕÌÍÉǘÄzÂËÀx¿œ¾#¾¾q¾"¿5À‘Á3ÃÅ.ÇyÉßËnÎ ÑÆÓƒÖUÙ ÜùÞÉáœähç.êðì¦ïWòûô™÷'ú±ü-ÿžd² 6 t–¼ÒßêåÛÍ®!”#j%>' )Ó*’,S.0¸1j3 5¶6S8ê9ƒ;=–>@‹AóBRD EÚFH IûIÇJiKÝKLLàKNKxJÓûÕÉØ–ÛkÞ<áäÚæ¨édì"ïÐñzô÷ªù3ü²þ'ð@Ž Ë /Olzƒ„yjS!4#%á&´(v*?,÷-³/e13¼4c6ÿ7Ÿ9.;ÄÉ?BA¬BD]EŸFÇGÚHÍI JLKÇKLLîKoK¥J~IHFÌCAö=v:‚6A2›-¸(’#DÙgù ©~Žþâù†õ}ñÔí‰êšçåÙâá{ßBÞSÝŸÜ0ÜòÛåÛ ÜOÜÂÜMÝùݿޙߎàŽá£âÅãðä'æfç¦èíé,ërì§íÙîùïñòÜò–ó+ô“ôÈôÉô†ôô;ó+òÅðïíËê5è]åOâ ß°Û9ØÆÔ\ÑÎõÊÈ…ÅEÃjÁö¿é¾K¾¾I¾Ô¾Ê¿Á‘ÂYÄ^Æ“ÈðÊnÍ Ð´ÒuÕ<Ø Ûàݰà…ãRæéÛëîGñúó’ö+ùµû7þ¬yÎ ] ”Äæ ó Ø"³$‡&Z(*æ+£-[/1¾2i46®7N9à:t<ý=|?ù@dBÊCE`F‹G¨HœIyJ,K®KLLúKŒKÎJ¿ILH~FFD¥AŸ>$;U73.¯)—$Péy´ |…ÿÇú^öBò‰î(ë*èŠåHãZáÇß|Þ}ÝÅÜ@ÜþÛæÛÜAܬÜ/ÝØÝ—Þoß[à^ájâŒãµäéå(çeè¬éîê2ìhíŸî½ïÕðÏñ°òróô~ô¿ôËô’ô'ôcócòñmï~í>ë¹èëåêâ°ßWÜèØoÕҳ΋ˡÈÿůÃÂÁ7À¿b¾¾8¾¶¾”¿ÂÀ?ÂÿÃ÷Å$ÈxÊò̇Ï0ÒìÔ±×€ÚSÝ%àùâÆå“èUëîÅðróö«ø8û»ý1¢]§ í )S˜®»¹¹©– x"W$+&(Å)+K-/»0l24À5\7ý8’:$<±=/?¯@BƒCÛDFRGqHjIRJK™K÷KLL§KóJûI˜HÜF½D+B=?Ù;8ò3r/§*›%[ þ‡» ƒ|³û8÷ óBïËë¿è æ³ã»áà»Þ¯ÝãÜ\ÜÜíÛùÛ6Ü•ÜÝ·ÝqÞDß,à+á3âUãyä¬åéæ%èlé¯êñë,íbî…ïŸð›ñ…òMóîókô±ôÉô¡ô:ôó–òSñÀïâí¯ë:éxæ‚ãQàýÜ•ÙÖ°ÒRÏ'Ì-É}ÆÄÂÀI¿¾$¾+¾š¾b¿†ÀñÁ¤Ã”Å´ÇÊuÌÏ­ÑbÔ+×ñÙËÜ•ßpâ9å èÌêŒí@ðîòõ*ø»ú;ý»ÿ&Žç7 | ¹ ê3EUWVH7 "ù#Ó%¢'p)3+ö,¯.g02Ä3j5 7«8C:Ó;f=á>g@ÔA=C˜DàEG7H>I"JæJ|KæKL LºKK,JãH;G&E¸BÐ?‹<Ù8Å4Y0+š&f! œ)É †vŸüøÙóýïtìV鋿(äâbàüÞàÝ ÝuÜÜòÛôÛ)ÜÜûܘÝIÞßÿß÷àâã@äp婿èç,énê±ëîì$îMïfðkñWò'óÍóWô¡ôËô¥ôRô±óÈò—ñðCîì¸éçäñà§Ý<ÚÇÖVÓùÏÁÌ¿ÉýÆÄ|ÂÈÀ€¿£¾-¾'¾¾6¿KÀ¤ÁOÃ0ÅKÇÉýË‚Î+ÑÙÓ ÖhÙ:Üßßá²ä|çDêíºïjò õª÷;ú¿ü@ÿ¬qÄ H €£ÌÛòñôçÖ¾!œ#v%K')ß*š,[.0Á1q35¾6X8ô9†;=—>@ŠAùBRD¡EÙFHIùI¿JaKÓKLLÐK;KdJ$I•G“E7Cg@5=˜9•5>1Œ,›'m"ª?Ñ oýõø«ô¸ð#íìéç›ä|âµà?ßÞ4ÝŽÜ'ÜøÛòÛÜoÜâÜxÝ(ÞïÞÒ߯àËáäâä4åkæ©çëè0êqë°ìçíï0ð7ñ)òÿò®ó=ô”ôÂô°ôcôÓó÷òÔñ_ðŸî‹ì3êŒçªä’áGÞèÚr×ÔœÐbÍLÊ„ÇÅØÂÁ¸¿É¾?¾#¾g¾¿ÀaÁ÷ÂÑÄÝÆɃËΤÐVÓÖâØ®Û€ÞVá#äôæºézì6ïáñŽô%÷¿ùBüÃþ7O› Ý ?\yˆŽˆt_!@#%ï&¼(„*F,.¸/p13Æ4i68¡9:;ÃÌ?EA¯BD_EœFÈGÔHÊI›J@KÂKLLÛK_KJhIæGÿE°Cü@Ú=Q:g62€-“(x##¾Oá ˜k„þÖùõzñÑí‹êœçåßâá„ßJÞ`Ý©Ü>ÜúÛöÛÜ_ÜËÜXÝÞÉޥߕà—á­âÊãúä,æjç«èðé0ëtì§í×îøïñûñÔòŒó ô„ôºô´ôtôðó&óò«ðøî÷ì©êè=å*âñÞÛجÔAÑÎâÊ ÈyÅCÃjÁ÷¿ó¾R¾%¾T¾í¾×¿Á¥ÂrÄxÆ«ÈËŠÍ ÐÏÒÕQØ'ÛòÝÊà˜ãiæ0éòë­î_ñô¨ö<ùÇûGþ½'‰Þ) m  Ðö %&1!û å"¼$”&b(+*î+­-b/1Å2t46¹7P9é:w<>?ý@gBËCE_FG H›IqJ#K©KùKLêK{K¹JªI3HdF+D†A>;07ø2j.Ž){$2Ï_ñ  nvÿ¿úTöBò…î+ë+èåMãdáÐ߃ÞÝÊÜQÜÜóÛ ÜPܳÜ=ÝàÝ£Þyßeàeátâ“ã½äïå-çkè°éñê3ìkíœî¿ïÎðËñ©òjóôsô¯ô¸ôô ôNóHòòðPï\íë–èÍåÅâ‘ß:ÜÆØXÕèÑŸÎzË”ÈôÅ«ÃÁÁ8À!¿j¾(¾F¾É¾¨¿ØÀUÂÄÆ=È’Ê Í ÏHÒÕÊ×–ÚjÝ<à ãáå¡èoë"îÜð‚ó%ö¾øFûÏý?³k¹ ù 7b‹§»ÆÈ·ž †"_$:&(Õ)“+W-/Ä0t24Å5e79™:+<²=9?°@!B†CÙD!FRGlHkIHJKŽKîKLøKKçJàI„HÂF DB?¹;÷7Ð3P/Œ*u%B Ûsª on¥û2÷ó=ïÏë½èæ»ã¾áàÃÞ¸ÝñÜeÜÜ÷ÛÜCÜÜ#ÝÁÝyÞQß4à4á>â[ãä´åìæ-èpé±êôë-íaîƒïð—ñòCóæó^ô¤ô¸ôô%ôwó{ò:ñ£ïÁí’ëé]æ[ã6àÛÜwÙþÕ•Ò?ÏÌ$ÉnÆÄƒÀN¿‹¾-¾=¾ª¾x¿˜À ºîÅËÇÊŽÌÏÄÑ}Ô>×ÚÜܯ߃âQåèáêžíSðó¡õ>øÉúPýÊÿ5 óH Š Æ ø ?Sac`UB %"$Û%­'y)?+ü,¼.k0!2É3t57²8G:Þ;c=ð>b@ÝA=C™DàEG4H:IJÝJvKÛK LþKªK KJÈH#G E™B³?l<¶8§460}+|&G!킵 rh“ü øÖóõïxìS鑿-äâlàßíÝÝÜ!ÜýÛÜ4ÜŒÜÝ¡ÝVÞ#ß àá â!ãHävå°æíç.étê±ëóì"îLïcðfñRòóÇóFôšô²ô›ô9ô›ó°òyñõï#îÿë˜éáæ÷ãÐà‡Ý ÚªÖ?Óáϯ̯ÉòÆŠÄvÂËÀ…¿©¾?¾0¾“¾I¿_ÀºÁhÃEÅeǧÉÌŸÎ@ÑóÓ¸ÖÙRÜ$ßõáÇä’çXêíÏïxò$õ·÷OúÐüOÿ¿%€Ô W ²ØêûýõÞÌ!£#…%O'")ä*¨,a.0Ç1z35Ã6`8ù9‹;=>@AùBUD¡EØFþGIñI¼JXKÉKLLºK0KJJIzGzECK@=v9x51k,'K"ÿ“$À ~^†ýëø¥ôµð#íìéçžä…â¼àHß Þ;Ý›Ü3ÜÿÛÜ(Ü{Üí܃Ý/ÞÿÞØßÐàÕáêâ ä<åoæ°çïè3êtë²ìåíï)ð6ñ"òõò¨ó-ô‰ô±ôôQôºóàò¸ñCðîoìêoç‡äqá*ÞÇÚY×åÓˆÐLÍ>ÊyÇúÄÙÂÁ¾¿Ï¾L¾.¾|¾¿(ÀrÁÃêÄôÆ:É—Ë Î¼ÐmÓ-ÖöØÅÛ˜Þhá?äçÑéìFïøñžô7÷ÑùQü×þC°]­ æ Hk„”š“l!G#'%õ&È(Œ*O, .Â/v1%3Ê4r68©9>;ÉÑ?FAµB DdEšFÅGÓHÃI–J9K¶KúKLÎKLKzJUIËGåE•CÝ@º=3:E6ú1_-s(X# ¢5Í ƒ_tþÐùwõxñÒí‡ê§çåïâá‘ßUÞhݸÜEÜ ÜÿÛ ÜhÜÙÜaÝÞÒޮߡàžá¶âÑãå2ærç®èôé4ësì«íÔîöïýðøñÊò†óôyôªô¤ô`ôÚó óöñŒðÝîÕì‹êðçå âÑÞpÛØ’Ô*ÑíÍÐÊÈpÅ?ÃiÁý¿ö¾b¾.¾f¾þ¾í¿0Á¾Â‡Ä’ÆÂÈ"Ë£Í7ÐéÒ¤ÕiØ=Û Þàà®ã~æDéì¾îuñô¼öJùÚûWþÌ8•ï7 { ­à-780  !ë"É$&j(9*ó+º-k/!1Ò2v4!6¼7Z9î:|<>„?ÿ@kBËCE`F‰G H–IkJKœKïKLÝKgK©J‘IHJFDkA]>ë: 7Ø2J.n)\$¶C߉ _iÿµúNö<ò„î+ë0è”åTãlá×ß‘Þ“ÝØÜZÜÜÿÛÜ[ܽÜLÝéݰހßpàná|âãÀäûå-çtè²éõê5ìjíîºïÍðÄñ¢òaóöógô ô¥ôrôóó9ó,òÖð5ï;íësè­å¤âsßÜ­Ø<ÕÑÑÎfËŠÈëŦÃÁÁ<À'¿u¾5¾U¾Ý¾¹¿ïÀkÂ.Ä(ÆTȬÊ$Í·ÏdÒÕâ×®Ú€ÝQà%ãðåºè€ë7îîð”ó:öÈø_ûØýW»&tË  Dq–¶ÅÔÒп­ "k$D&(Ý) +^-/Î0z2'4Í5j7 9ž:.<»=9?µ@$B‡CÜD FOGkHdIEJøJ‡KáKLèK€KÓJÊIkHªF‚DõAú>ž;Ò7²3//g*]% ÃWë• ^bšû+÷ó=ïÏëÁèæ¿ãÊá#àÐÞÃÝùÜtÜÜÜ ÜPÜ©Ü.ÝÌÝ…ÞYß>à>áEâcã‰ä¹åõæ0ètéµêõë/í_î‚ï˜ð“ñvò=óÙóRô—ô¤ô}ôô^ódòñˆï¡írëöè7æ=ãà¿ÜXÙåÕzÒ,ÏÿËÉfÆÄ„ÀU¿”¾:¾L¾¼¾‹¿°ÀÂÔÃÃÅçÇ7ʦÌ:ÏÚÑ—ÔU×%ÚóÜÇß—âiå-èùê°ígðó´õNøÛúaýØÿH¬U ˜ Ö -L^pnn_K 3" $ì%²'ˆ)D+ -Á.w0&2Õ3w57´8R:à;k=ñ>k@ÛACC—DâEG3H5IJ×JlKÐKLìKœKóJJ²HGóDzB•?L<•8†40\+\&)!Ñgûž cW‡üøÌóøïrìXé–æ1ä)âràßôÝ"݇Ü1ÜÜÜ<ÜšÜݪÝdÞ+ßàáâ)ãOäå´æôç2éyê³ëóì#îIïaðañLòó½ó:ô‰ô¥ô…ô&ô‚ó˜ò[ñÜïîãëréÅæÒã³àeÝÚ’Ö"ÓÏϚ̢ÉçÆ„ÄtÂÌÀŠ¿´¾E¾E¾Ÿ¾a¿pÀÖÁzÃdÅxÇÄÉ)Ì»ÎVÑÔÎÖ–ÙkÜ6ßâÙä©çkê*íáïŽò2õÎ÷\úãü_ÿÌ9Žä) d šÂãøêÕ!²#Š%^'')ò*­,n. 0Ô1~3)5Ç6k8û9˜;=ª>@—AùBVD¡EÚFùGIêIµJNKÁKõKöK«KK8JøHaG_EüB-@õÖ?JAµBD_EFÁGÑH¿IŽJ2K«KðKôK¿K:KeJ@I°GÎEvCÁ@œ=:$6Ú1<-X(6#퉶 rKlþÂùsõrñÑí‹ê¦çåñâá–ßaÞrÝÀÜVÜÜ Ü,ÜsÜåÜlÝÞÜ޹ߧà«á»âÛãå8æxç³è÷é5ëvì©íÖîòïûððñÄò{ó ôjôšô’ôKôÅóôòÙñtð¹îºìgêÓçùäìá­ÞVÛä×xÔÑÔÍÈÊíÇmÅ8ÃkÁÀÿ¾k¾<¾w¾¿ÀIÁФĤÆàÈ8˼ÍOÐÓºÕ„ØPÛ#ÞóàÅã‘æXéìÐî‡ñ*ôËö_ùåûkþÚH¥ýD Š »í):CE;,!÷"Õ$¦&v(>*,½-y/&1Ù2‚4"6Ê7Z9ø:€< >‹?ÿ@pBÌC E^F‰G›H“IeJK”KäKøKÌKWK“J|IH1FñCOA>>Ê:î6¸2%.S)9$û—.Çw P[ÿ«úGö8ò„î+ë4è˜å\ãsááßšÞŸÝãÜeÜ!Ü Ü%ÜeÜËÜUÝôݹދßxàyá‚â¥ãÈäæ4çyèµéùê6ìlí›îºïÈð¿ñœòVóïóWô’ô•ô\ôÝó#óò¾ðï"íÜêYè†å‡âRßøÛ”ØÕÀÑsÎ[ËyÈåÅ ÃÁÁ>À/¿€¾A¾g¾ë¾Ð¿ÁƒÂFÄ>ÆoÈÃÊ;ÍÓÏvÒ7Õõ×ÇÚ•Ýhà9ãæÐèëLîÿð¨óHöàøgûðý_Ó.‰Ö  T|¦ÂÒàÞÜË· š"u$N&(æ)§+j-/×0‚204Ñ5v79£:9<º=B?¶@'B‰CÜD"FLGjH^I@JñJKÔKøKÔKtK¼J·ISHFiD×AÞ>|;µ7Ž3/C*B%ý­8Ù} QO–û÷ó8ïÏëÅèæÉãÏá.à×ÞÎÝÝ~Ü+ÜÜÜWܸÜ7ÝÖÝ‘ÞbßIàGáMâmãŽäÂåùæ6èxé·ê÷ë2í\îƒï“ðñsò1óÒóDô‡ô–ôhôúóGóGòñeï‡íNë×èæãóß Ü<ÙÉÕeÒÏïËÉ]ÆÄ‡À[¿ž¾F¾\¾Ì¾¡¿ÃÀ5ÂëÃÛÅÈLÊÃÌNÏ÷ѪÔp×:Ú ÝÝß«â}åCè ëÃí|ð!óËõ\øíúpýêÿU½e ¦ å >Tqu€wkY 9"$ï%Ã'‹)R+-Í.}032Ø3„5 7¿8W:ä;r=ó>o@ÝAGC–DäEG0H2IJÑJcKÅKòKàK†KèJèI¡HêFÛD]Bw?+%@•AþBWD EÙFøGIèI«JIK´KëKäKKK!JåHDGGEàB @Ø<5985Ù0-,;'"Ä^ô– XDlýÙøšô¯ð íôéç¬ä”âËà^ß2ÞSݰÜKÜÜÜ?Ü’ÜÝ™ÝGÞßïßáàçáúâäGåæ¶çüè6êzëµìåíï%ð,ñòèòóôkô‘ôzô&ôŽó­ò…ñðDî/ìÏé,çHä.áîÝÚ×¶Ó[Ð'Í#Ê`ÇðÄÐÂÁÿä¾`¾L¾›¾I¿LÀ¡Á>ÃÅ+ÇdÉÎËNÎïÐÓZÖ&ÙñÛÆÞ”áeä0çöéµìnïòÂô^÷ìù{üîþgÎ'‚À 4i‚ «µ±ª˜!`#9% 'Ù( *b,.Ó/†143Ú4~68³9K;Õ<\>Ø?MA·BD_EœF¿GÌH¼I†J,K KâKêK«K+KPJ(IœG®E`CŸ@€=ñ96·1 -5(#Ðp¤ _=bþ¸ùpõnñÑíŽê©ç%åøâ#á£ßiÞ}ÝÏÜ]Ü ÜÜ5ÜÜíÜzÝ$ÞèÞÀß²à³áÄâäã åBæxçºèúé9ëwì¨íÖîíïùðéñ¾òpóÿó[ô‹ô€ô7ô®óÜòÀñUð î™ìIê±çÚäÊá’Þ4ÛË×^ÔÑÃͶÊåÇeÅ5ÃmÁÀ¿u¾K¾†¾#¿À]ÁéºĽÆ÷ÈSËÐÍmÐÓ×Õ˜ØgÛ9ÞáÙã¦æjé/ìåî–ñ>ôÛöoùùûvþíU¶ S – Êù6GNQD;!#Ü$²&~(I* ,È-~/31Þ2ˆ4.6È7h9÷:‹< >‘?AsBÍC E\FˆG—HŽI_J K‹K×KêK½KEK‚JcIîGF×C/A#>¨:Ð6–2 .0) $Ú´c @QÿŸúEö1òƒî.ë5è¡åaã|áêߦާÝòÜmÜ/ÜÜ2ÜpÜ×Ü^ÝÞÂÞ•ß„à~áâ¨ãÔäæ?çyè¹éüê4ìpí—îºïÂð»ñ”òMóåóGô†ôôHôÊóóùñŸð÷îí¿ê6ègåhâ.ßáÛqØÕ§ÑaÎJËoÈÙŠýÁEÀ2¿¾M¾w¾þ¾ã¿Á›Â\ÄWƆÈÛÊUÍéÏ‘ÒLÕØÝÚ«Ý}àOãæäè¤ë_îñ¹ó[öîø|ûûýsÝ@•ä $ _Œ±Ìáéîä×Á £"„$R&)(ì)³+q-(/Ý0Œ234Ü5y79«:8<Ä=B?»@*BˆCßDFPG`H_I8JéJvKÊKèKËK\K®J I;HyFKD¼AÀ>\;—7l3õ.$*"%ä"Äh EAŠû÷ûò7ïÐëÈèæÐã×á6àâÞØÝ݈Ü8ÜÜ,ÜaÜÄÜAÝãÝ™ÞnßQàOáVâtã–äÈåýæ<èyé¾ê÷ë0í`î{ï”ð„ñmò'óÈó5ô{ô‚ôXôáó1ó/òåðMïdí3ë¶èõåãÐ߆ÜÙ°ÕNÒÏâË÷ÈYÆÄ†Àc¿§¾T¾k¾Þ¾³¿ÙÀKÂÄöÅÈjÊÕÌkÏ ÒÃÔ‡×OÚ"ÝñßÂâåZèëÛí‰ð8óØõmøÿúýøÿgÈ$o · î "Egw†ˆ‚xc C")$÷%Í'–)X+-Ð.‹042ä3‡5)7Å8\:ê;u=ù>o@äABCDßEG,H.I JÌJWK¾KâKÔKtKÔJÙI„H×F»DCBY? ä8â„à"ß Þ5Ý£ÜCÜ!Ü#ÜZܬÜ,Ý¿ÝxÞBß&àá"â<ã\ä‹åÂæüç=é{ê¼ëïì)î@ï^ðWñ=òó¦ó#ômôƒô_ôüóTódò(ñžïÆí¡ë5éæ’ãsà&ÝÊÙXÖôÒ¤Ïx̆ÉÕÆuÄrÂÐÀ•¿Æ¾^¾b¾Â¾†¿›ÀªÃŬÇòÉ]ÌêΆÑ?ÔûÖÇÙ•Üfß6âåÏç’êSíð´òWõí÷€úý}ÿðQ°üI | ¹Ùý#$ æ!É#Ÿ%q'>)+Å,y.80Þ1“335Ú6s8 :ž;&=¯>$@›AþBYDŸEÚFóGþHáI¦J>K«KÞK×KKòJJÉH0G(EÆBì?¼<95¸0 ,'ò!ªEÚ† A7aýÏø—ô«ð"íôé$ç³ä™âÙàbßBÞ[ÝÀÜSÜ'Ü#ÜLÜŸÜ Ý¦ÝPÞßùßêàðáã$äNå…æ½çþè=êzë¶ìçí ï%ð$ñòÛòŒóôcô|ôjôôwó–òdññï!îì¯éç(ä áÐÝmÚךÓEÐÍÊVÇæÄÑÂÁοè¾m¾\¾¬¾Z¿cÀ·ÁVÃ0Å@Ç‚ÉâËlÎѹÓrÖ=Ù ÜÙÞ®áwäGç êÉìï,òÕôm÷ú†üÿtÞ9Ó  Gp”ª¼¾¿µ¢!g#H%'æ(©*j,*.Ù/’183æ4„6%8º9O;Û<_>Þ?QA¹BD`E™F¿GÉH¶I€J!K—KØKÙKžKKð}î|ì&ê“çµä®ánÞÛ®×DÔêаͦÊÛÇXÅ7ÃfÁ À¿¾\¾“¾8¿*ÀrÁÃÏÄÚÆÉjËîÍ€Ð3ÓèÕ³Ø}ÛPÞáðãºæ‚é@ìùîªñPôìö‚ù ü‰þûgÄ` ¦ Ö)BT[\RD+! #é$»&‹(P*,Ð-ˆ/:1è2‘426Ô7k9ÿ:<>•?AtBÏC E\F†G”H‰IYJKKÍKÛK­K2KoJLI×GùEºCA>Š:«6v2å-)ú#Ã`ý›Q .Eÿ“ú<ö/òî0ë8è¦åfã†áñß±ÞµÝøÜ~Ü8Ü Ü@ÜzÜäÜiÝ ÞËޡߌàˆá™â®ãÝäæDç~è¾éþê8ìoí—î¶ïÀð³ñŽòDóØó>ôsôpô5ô³óðòÝñ„ðØîâìžêèIåCâß¾ÛWØíÔ‘ÑJÎ?Ë]ÈÖŗþÁIÀ9¿—¾Z¾†¾¿ö¿/Á±ÂrÄsÆžÈõÊoÍÿϬÒbÕ(ØòÚÃÝ”àdã.æúè¶ëuî#ñÍólöùŠûþ‚îO¦ï 6 jœ¾ÚíöøñäË °"‹$a&0(ú)º+{-0/ç0“2>4á5‚79³:;<Ì=B?Â@(BCßDFMG_HYI2JâJlK¾KÛK¸KNK˜J‰I&HZF2DœA¡>=;t7N3Ñ.*%Çt «Y /8}û÷öò7ïÏëÍè!æÖãÞáBàéÞçÝÝ•ÜDÜ$Ü8ÜmÜÏÜNÝìÝ¥Þvß]àWábâxã¡äÍåçAè}éÁêöë6íWîƒï†ð‡ñaò!ó»ó*ôiôsôBôËóóòÌð-ïFíë”èÕåÜâ³ßbÜÙ•Õ5ÒìÎÏËëÈMÆÄ‹Ài¿®¾d¾v¾ô¾Å¿ïÀaÂÄ Æ1È~ÊõÌ~Ï)ÒÙÔ ×gÚ8Ýà×â¦ånè0ëìíŸðIóêõøû’ýzÖ4€ Á +Woˆ‘–Ž‚o P"2$&×'¡)c+$-Ú.’0>2í3Ž5/7Í8`:ñ;|=÷>{@ßAJC›DßEG*H)IJÂJRK±K×KÂKgK½JÄImHºF£D"Bâà,ßÞBݬÜSÜ*Ü0ÜdܹÜ5ÝÌÝ~ÞPß,à(á)âDãdä“寿è>éê¼ëóì"îFïUðWñ4òÿòšóô[ôtôLôåó@óGòñ€ï¦í‚ëéaæpãQà ݨÙAÖØÒÏdÌxÉÉÆpÄnÂÒÀš¿Î¾l¾m¾Ù¾–¿³ÀÂÄèÅÅÇ ÊyÌÿΤÑUÔ×ÞÙ­ÜzßRâåèç¥êgíðÆòiõÿ÷“úý’ÿüc¿ U Ãé ,2,# õ!Ñ#«%{'H) +Ë,ˆ.90ï1•3>5ß6z8:£;-=²>+@›ACVD¤EÔFõGøHÝIŸJ7KŸKÑKËKwKæJõI¶HGE§BÐ?˜<õ8ô4–0í+ü&Õ!Œ&Çj 4$SýËøŠô­ðíöé)çµä¤âÝàoßIÞhÝÈÜdÜ-Ü3ÜSÜ­ÜݱÝ[Þ&ßà÷àöá ã)äWåŠæÄçé>ê€ë´ìéí ï#ð!ñ òØò|óôPônôVôüó`ó{òLñÏïîïëééæäìà®ÝPÚèÖƒÓ.ÐÍÊKÇáÄÌÂÁÑ¿ñ¾z¾h¾¾¾n¿uÀÑÁiÃJÅZǘÉÿËÎÑÐÓŒÖRÙ$ÜîÞÄáäXç!êÜì”ïBòäôƒ÷úšüÿ†íIœá $ QƒºÄÏÉî•!x#M%#'ë(µ*u,0.æ/—1C3ì46*8Â9S;âå?PA¾BDaE™F¼GÆH²IyJKŽKÈKÏKŒKK*JöHlGxE&Cc@@=¯9Ä5v1Ù,ù'Ú"–:Ï{ 7Gþ¤ùbõeñÐíê±ç.åã4á´ß€Þ’ÝäÜvÜ7Ü0ÜMÜšÜÝ’Ý9ÞûÞØßÂàÇáÓâóãåOæ„çÄèê?ëyìªíÓîéïððÝñ®ò_óåóCôiô^ôô€ó«òˆñðaîYì êmçšä†áQÞùÚ’×,ÔÐО͔ÊÑÇRÅ0ÃiÁÀ¿¾d¾ª¾G¿=À‹ÁÃíÄïÆ'ɆËΜÐHÓÖÈØ˜ÛcÞ7áäÏæ˜éSìï¼ñbô÷ùü™þ wÒ*o ¶ ã4Q_jdbM7!#ï$Ê&(^*,Ù-“/A1ò2–4<6Ù7r9;’<>•? ArBÕCE_FG•HIWJùJ{K¾KÐKœK!KYJ8I¿GÝE¡Cò@â=k:‹6U2Æ-ð(ß#¡Há‡: 3ÿŽú1ö,ò}î/ë>è¨ånãáüß·ÞÃÝÿÜŒÜAÜ/ÜG܈ÜíÜuÝÞÖÞ«ß•à‘á¡â¸ãâäæIçƒèÄéýê>ìlí˜îµï¹ð²ñ„ò=óËó2ôdô_ô!ôžóÕòÇñdð¾îÀì€êðç*å!âôÞžÛ<ØÒÔxÑ8Î+ËRÈÍÅ‘ÃÃÁEÀI¿—¾p¾‘¾'¿ ÀEÁÅÂŽÄ‡Æ¹È Ë‡ÍÐÂÒ{Õ@ØÛÜÝ©àyãFæ éÏë„î9ñßó~öù›û þZ¹ý D y©Ëçûüï× ¼"•$l&9(*Å+->/ì02E4è5‰7"9¶:G<É=P?¾@1BCÞD!FIG]HXI(JàJ]K¸KËK«K ;O7/3¯.å)â$¨Vò’C &uû÷ñò3ïÑëÎè$æÝãçáHà÷ÞêÝ+ÝÜQÜ/ÜBÜzÜÚÜXÝøÝ¯Þßhà^álâã¦äÔå çFè…éÀêì.íaîwïŒð|ñ^òó²óô^ô^ô2ôµóóùñ®ðï$íöênè·å¹â‘ßFÜâØ{ÕÒÖÎÀËÛÈFÆüÃÂÀn¿¼¾l¾Š¾¿Ü¿Á}Â.Ä'ÆGÈšÊ Í™Ï@ÒóÔ·×€ÚMÝ"àëâ½å‚èFëÿí²ð\óýõ“ø!û ý„ë>” Ì 6g|•œ¢›Žy ]"9$&Ý'®)j+/-â.œ0E2ö3’5;7Ð8i:ö;€=?z@çAHCžDßEG'H&IJ¼JHK§KÊK³KWK¨J°IUH¡F…DB?Ì;8ÿ3–/Ù*ß%´ ^›O [üã÷¹óëïtìc飿NäCâ˜à3ß!ÞJݺÜ\Ü6Ü=ÜpÜÄÜAÝÖÝ‹ÞXß8à.á6âHãoä–åÏæèEé„ê¼ë÷ì!îCïUðMñ3òòò–óôRôaô9ôÓó%ó0òòðcïŠíbëñè@æPã1àéÜŒÙ%ÖÀÒ{ÏRÌkÉÀÆjÄmÂÓÀ¢¿×¾y¾|¾é¾ª¿ÊÀ(ÂÝÿÅÝÇ%ÊÌÏ»ÑmÔ-×õÙÃÜ“ßbâ2å÷ç¾êwí,ðÚòyõø ú&ýŸÿsÍ c œ Ñõ,9=8. ÿ!Ý#´%‡'Q)+Õ,.D0ô1Ÿ3D5è68:«;0=¶>0@ACZD¡EÕFòGõHÕIœJ)K›KÁK¾KgKÐJãIžHûFöD†B·?s<Ù8Ð4y0Ê+Ü&¹!l¨[ FýÁø†ô§ðíøé+ç½ä©âæà{ßPÞuÝÒÜmÜ=Ü9ÜdÜ´Ü(Ý·ÝjÞ*ßàûàâã5ä[å’æÈçéDêëºìåí ïð!ñòÏòuóïóFô]ôDôèóGódò.ñ¶ïæíÐënéÇæåãÌàŽÝ4ÚËÖjÓÐðÌõÉAÇØÄÊÂ!ÁÓ¿þ¾¾y¾Î¾‚¿ŒÀåÁÃaÅrDzÉÌ™Î8ÑçÓ¤ÖkÙ8Üß×á§ämç4êòì¤ïXòõô”÷"ú©ü$ÿ—úZ¨ó / bŽªÇÐÜÕͺ !#X%-'ô(Á*{,<.ì/£1H3÷4658Æ9\;ää?WA¿BDaE›F·GÅH©IvJK‡KºKÂKzKôJJãHRG^ECF@!=Ž9¥5R1½,Õ'¾"y¼b $5þ¡ùTõiñÆí—ê¯ç6å ã<á½ß‰ÞÝðÜÜDÜ9ÜZÜ£ÜÝÝAÞ ßÜßÑàÌáÝâûã"åRæçÄèê@ë{ì«íÐîêïéðÜñ£òWóÙó4ô\ôJôúólóòsñþïGî9ìèéNçväjá1ÞÚÚw×ԾЉ͆ÊÄÇKÅ-ÃkÁÀ¿—¾t¾¹¾X¿WÀœÁ0ÃÅ ÇAÉËγÐdÓÖ䨩ÛÞGáäàæ¯édì&ïÈñ|ô ÷©ù(ü¬þ†ã7€ ¿ ö!B^jwqlZA!%#û$Ñ&Ÿ(b*+,ß-/G1û24G6Ü7|9 ;š<>œ? AwBÔC!E\FƒGHIKJöJmKµKÁKŽKKFJ!I¥GÇE€CÙ@Â=I:m602¨-Ï(À#„-Æs% &ÿ‚ú-ö%òî,ëDè©åxã’áàÅÞÇÝÝ‘ÜQÜ8ÜUÜ“ÜùÜÝ$ÞÞ޸ߜàžá¤âÄãçäæMçŠèÅéë;ìpí—î°ï»ð¦ñ‚ò/óÅóôWôMô ô‹óºò­ñHðžî£ì^êÑçåâÓÞ€ÛØ·ÔaÑ%ÎËJȾŕùÁPÀG¿¬¾t¾©¾3¿!ÀYÁÞ¤ģÆÎÈ*ËÍ4ÐÝÒ‘ÕZØ ÛðÝÁàŽã[æ éâëšîIñóóö%ù¯û,þ¤nÄ M Œ±Ýñ øå Ä"£$t&E( *Î+Ž-B/ø0¥2J4õ5‹7,9¼:I<Ó=N?Ç@1BŽCáDFJGZHRI&JÔJYK©KÀKK'KrJ]IõG(FùCaAc>ü:173‰.Ê)¿$Œ;Õ|0 gû÷êò2ïÏëÑè)æáãïáPàßøÝ1Ý®ÜVÜAÜJ܇ܿÜbÝÞºÞ‹ßoàlánâã«äÜåçLè…éÈêýë4íZî}ï‚ð}ñSòó§óôMôQôô¥óçòáñ”ðïî íÏêUè’åšârß&ÜÈØ^ÕÒÂήËÐÈ:ÆúÑÀu¿Ä¾{¾—¾¿ì¿Á‘ÂFÄ?ÆaȱÊ&ͰÏXÒ ÕÎ×—ÚeÝ5àãÍåšèXëîÆðmóö¥ø1û²ý*–øP á IoŒ¡¨°£ž j"D$&é'´)w+6-í.£0N2ü3Ÿ5<7Û8l:ý;ƒ=?|@ëAIC¡DÛEG H%IúIµJAK™KÁK KHK•JšI=H‰FiDìAû>®;ô7â3r/½*½%— Bë„; RüØ÷¸óåïxìbéªæQäLâ à?ß)ÞWÝÂÜkÜ>ÜLÜxÜÒÜIÝâÝ–Þ`ßDà7á=âVãoä¤åÎæèGé‡êÀëõì"îCïMðMñ'òïò†óô>ôSô%ô¼óóòÖðEïjíCëÑè æ-ãàÈÜrÙÖ«ÒbÏEÌZɸÆdÄkÂÖÀ¦¿â¾ƒ¾Ž¾÷¾À¿ÛÀCÂòÃ×ÅøÇ;ʪÌ1ÏÔÑ…ÔD×Ú×Ü­ßvâFåèÎêŽí>ðíò‹õ'ø±ú7ý°ÿƒÜ* r ª ß$7FIE8' "ë#½%‘'[)+ß,˜.L0ý1¦3M5í6‡8:­;9=¸>4@¢AC\DŸE×FëGôHÐI”J#KK´K°KXK¾JÍIˆHáFÛDlB”?Y<´8³4V0«+½&˜!Vñ˜A  :ý¸øô£ð íöé1çÃä¯âñà€ß]Þ}ÝâÜvÜKÜCÜqܾÜ2ÝÅÝpÞ;ßàá âã9äf哿ÒçéKêë»ìæí ïðñÿñÅòkóåó5ôPô/ôÔó1óKòñ—ïËí¬ëR颿Éã¨àsÝÚ´ÖNÓÐÙÌêÉ5ÇÓÄÉÂÁÜ¿¿‘¾†¾ß¾”¿¢ÀúÁ›ÃyňÇÎÉ-Ì·ÎNÑÔ»Ö‚ÙPÜßíáºä…çGêí¹ïhò õ£÷5ú¹ü6ÿ¥ h¸ < q™ºÒÝçáØÆª!#b%6')Ç*ˆ,A.ù/§1S3û4š688Ð9^;ìé?[A¿BDdE“F¼G¼H©IlJ KvK´K°KlKàJÿIËH:GBEíB(@=r9~571—,º'"_¥L 'þ˜ùPõañÌí’ê¸ç9åãEáÄß–Þ¦ÝýÜŒÜNÜGÜeܯÜݦÝPÞßíßÔàØáäâä*åWæ“çÉè êCë{ì¬íÏîåïèðÏñ¢òHóÑó%ôKô8ôæóTówòXñáï)îìÇé.çUäJáÞ¼Ú[×÷Ó§ÐuÍxÊ·ÇEÅ)ÃlÁÀ$¿£¾€¾Ì¾k¿iÀ´ÁFÃÅÇ\ɵË6ÎÍÐxÓ5ÖöØÅÛ’Þaá1ä÷æÀé{ì5ïâñ†ô%÷³ù>ü¸þ-•ñH Ð -Qixƒ{ycN!.#%Û&§(r*+,ò-/V1ÿ2§4K6æ7€9; <> ?AxB×CE\FGŠH|IFJìJdKªK±K€KûJ2J IŠG¯EbC¾@ =,:H62‚-´(Ÿ#j²W ÿÿyú%ö!ò~î-ëEè±å}ã›áàÊÞ×ÝÝŸÜ]ÜAÜdÜœÜÝ‹Ý+ÞëÞÀߦà¦á­âÊãïäæVç‹èËéë;ìrí”î°ï³ð¦ñuò+ó·óôHô9ôûóqó§òñ/ðî†ì=ê²çåäááµÞaÛØœÔMÑÎË>È·ÅùÁUÀM¿¶¾ƒ¾µ¾I¿3ÀoÁöºĻÆéÈ>Ë»ÍIÐöÒ«ÕmØ9Û ÞÒà©ãjæ:éñë¯î]ñô£ö5ùÀû>þ²|Ò [ ˜Àêþð Î"¬$&P(*Ü+’-N/1©2W4÷5–7/9Â:O<Ô=V?Ç@5BCÞD"FCG[HJI!JÍJNKœKµKŠKK]JHIÝGFÞCCAD>ß:7î2l.§)¥$m!¾e ý _ûúöèò.ïÓëÑè0æçã÷áXà ßÞ>ݶÜeÜJÜVÜ•ÜíÜqÝ ÞÆÞ“ß{àpá}âŽã·äÞåçMèŒéÆêì2í]îvïðvñLò ó˜óô<ô?ôôóÎòËñsðØîçì´ê1èuåyâRß Ü¨ØIÕíѰΞËÂÈ5ÆñÃÂÀ¿É¾Œ¾¥¾'¿À-Á§Â_ÄVÆyÈÊÊ=ÍÊÏqÒ!Õè׫ÚÝJàãèåªèmë&î×ð‚ó ö¶ø@ûÅý7§_¬ ï (V~—®µ»±¦ s"O$%&ô'¼)‚+>-ö.«0X24©5B7à8t:<Œ=?‚@êANCžDáE G%HIøIªJ9KŽK´K”K3K…J„I%HrFLDÐAÝ>;Ó7Â3Q/œ* %v ,Ër$ úFüÑ÷²óãïxìb鱿UäWâ¦àIß2ÞdÝÍÜvÜLÜR܋ܨÜYÝìÝŸÞnßIàBáGâXã~ä£åÚæèKéŒê¿ëúìîBïLðDñ&òáòóìó7ô<ôô¢óûòûñ¼ð(ïLí$ë°èþåãïß°ÜOÙïÕ”ÒKÏ5ÌJɯÆ^ÄjÂ×À®¿è¾‘¾¾¿×¿ìÀ]ÂÄóÅ ÈWÊÂÌJÏìÑœÔ]×#Úòܿߎâ[å!èäê íQðóœõ8øÂúJý½ÿ1Žï8  » ê2AUSQE/ "õ#Ç%'b)*+ç,¢.U02°3Q5÷68&:³;<=¾>6@¥ACYD¥EÏFîGîHÊIŽJK‚K¬KKJK©JºIpHÈFÁDLBz?6<–8‘430Ž+›&!2Þ{. ûù1ý®ø|ôŸðíùé4çÈäµâúà‡ßkÞ…Ýí܃ÜQÜVÜwÜÏÜ:ÝÐÝ}ÞAß"àáâ'ã?än噿×ç éNêƒëºìèíïðñ÷ñ¿ò`óÛó'ô@ôô¿óó4òùð}ï§í•ë*鉿¡ãàQÝøÙ–Ö9ÓîÏËÌÙÉ)ÇÎÄÅÂ!Áà¿ ¿š¾—¾ï¾¨¿·À ·ËŧÇáÉIÌÌÎgÑÔÔÖšÙeÜ6ßÿáÖä“ç`êíÍïzòõ·÷CúÌüDÿ¶wÈ L }§ÇÝîðîãÑ·!—#l%B' )Ñ*’,J.0±1Y35¢6?8Ö9e;ðë?]AÃBDcE—FµG¼H¡IgJKmK¨K K_KËJíIµHG+EÎB @ß\w†Œ€rW!:#%å&±(y*8,ö-ª/]13¯4S6ë7‡9;¡<)>Ÿ?AzBØC#EXF€GˆHuIDJáJ]KK¥KnKìJJùHqG”EGCž@= :(6ñ1e-(ƒ#Kó›? êÿkúöò{î0ëGè¶å‚ã£áàÖÞàÝ#Ý­ÜbÜTÜhÜ­ÜÝ–Ý8ÞóÞÌß­à±áµâÒã÷ä"æ\çèÐéëAìoí•î­ï¯ð ñoò!ó«ó ô5ô-ôãó]óŽòvñðaîgìê“çÄäÁá•ÞDÛæ×†Ô2ÑÿÍúÊ/ȲňüÁVÀV¿¿¾“¾Ä¾[¿GÀ„Á ÃÒÄÔÆþÈ[ËÐÍdÐ ÓÄÕ„ØSÛÞïàºã‚æMéìÄîmñô³öHùÏûPþÁ0Šå) o £Òó))!þ Ø"¹$‰&W(!*â+ž-W/1¶2\46›799Æ:X<Ø=Z?Ë@8BCæDFKGQHJIJÆJGKKªKyK KIJ2IÅGôE¿C+A >Á:í6Ë2L.…)ƒ$Q¥M ìûÿSûòöàò-ïÐëÓè3æîãüácàß ÞJÝÀÜpÜXÜ_ܡܸÜ{ÝÞÍÞ¢ßàá€â›ã½äçåçUèŽéÍêì5íZîxï|ðrñEòóŒóüó*ô3ôñó{ó¶ò±ñYð¹îÌìêèQåZâ1ßëÛŒØ,ÕØÑ—Î‘Ë²È+ÆîØÀ¿Ú¾’¾¸¾9¿ÀFÁ»ÂyÄmÆ“ÈâÊXÍâÏŠÒ:Õþ×ÆÚ”Ý^à4ãôåÆè~ë;îëð”ó3öÈøSûÓýL´l½ ü 5g‡©¸Âǽ± {"^$+&(Å)‹+H-ÿ.µ0_2 4¬5N7æ8z:<Ž= ?ƒ@ïAOC DàE G"HIôI£J/K…K¥K†K"KrJoIHVF4D¯AÂ>k;·732/y*‚%V ¯[ êñ;üÇ÷ªóàïvìe鲿]äYâ±àOß>ÞlÝØÜÜUÜbÜŽÜêÜ`ÝöÝ­ÞrßYàHáPâaãƒä¬åáæèRéŒêÃëüìîAïGðDñòÜòtóåó$ô1ôô“óâòáñ¤ðï4íþê”èÝåíâÓߌÜ7ÙÓÕ{Ò;ÏÌBÉ¢ÆXÄiÂØÀµ¿ï¾ ¾¨¾¿å¿Áp ÄÆ(ÈmÊÝÌbÏÒ²Ôx×7Ú ÝÓß§âlå;èõêµíeðó±õIøÓúZýÎÿ@ŸüG Æ ú?P`_`L@ "$Ñ%¦'l)4+ï,¬.]0 2·3[5û6–8+:¹;B=Â>:@§A C\D¢EÑFêGëHÇI‚JKuK¢KK8K™J£IZH¯F¥D1BZ?ó?]AÇBDcE•FµG¸HœIbJõJiK–K˜KKK¹JÙIH GE²Bì?Ä<.9B5ñ0\,w'c""Ïq# ëãþ„ùBõ[ñÇí˜ê»çEåãVá×ߨ޺ÝÝžÜjÜYÜÜÄÜ2ݺÝgÞ"ßàçàêáõâä8åeæ›çÖèêKë}ì«íÎîßïàðÅñ‘ò7ó¹ó ô+ôô½ó(óGò"ñ©ïïíÚëŠéëæä áÓÝ„Ú!×ÇÓ{ÐPÍ[Ê Ç7Å"ÃmÁÀ6¿·¾Ÿ¾ë¾‘¿‘ÀßÁtÃIÅQÇŠÉèËgÎÿЧÓeÖ&ÙñÛÁÞ‰á^ä çêé¢ìZïò«ôH÷×ù]üÚþN±bª í Kk‚’š•‘ye!B#%ï&¼(‚*C,ÿ-²/e13·4X6õ7Œ9;«<'>©?ABØC!E[F{G†HpI;JÞJOK•K•K_KÙJJáH[GxE-C@e=ê9 6Ò1B-s(a#0Ù*òÚÿ`úöò{î/ëIè¼å†ã¬á àßÞéÝ1ݵÜrÜ]ÜtÜ·ÜÝ¡ÝAÞßÑß¼àµá¿âÚãûä.æZç™èÑé ëDìní”î«ï¬ð™ñjòó£óùó(ôôÑóGóuò\ñøïDîHìþéqç¥ä£átÞ)ÛÉ×nÔÑíÍéÊ&ȩŅýÁXÀ_¿Ç¾¡¾Ó¾p¿YÀœÁ!ÃëÄèÆÉnËíÍyÐ&ÓÚÕžØeÛ8ÞýàÔã•æaéìÕîƒñ(ôÆöXùßûcþÏ@šñ9 } ¯àÿ)80/!è"¾$—&`(**ê+¨-]/1¼2b4 6¡7?9Ì:[<Þ=\?Ñ@5B—CßDFFGOHGIJÀJ;KˆK™KjKùJ4JI®G×EªCA >š:Ó6§2/.d)f$3ç5õ ÚðÿIûèöÞò)ïÒëÕè8æòãâlàßÞQÝÌÜ~Ü^ÜoÜ©ÜÝ…Ý#ÞØÞ©ßŒà„á‹â¢ãÂäïå çYè”éÍêì3í]îsï{ðjñAòôòˆóêóôôàódó ò–ñ@ð›î®ìrêóç1å;âßÌÛsØÕ¿ÑŠÎyË­ÈÆíÛÀ†¿ä¾Ÿ¾Ç¾K¿(À[ÁÐ’ăƬÈûÊmÍþÏžÒUÕØÝÚ©ÝwàCãæÕè”ëOîûð©óBöÚøcûåýYÆ%~È Fo™³ÄÔÌÏ·ª †"g$9& (Ï)–+O- /·0m2 4¹5P7í8€: <“=?†@ôAOC¡DàE GHIèI¢J!K~K•KyKK`JWIúG8FDŽA¨>I;•7~3/Z*a%: òš@û Øâ1ü½÷¦óÞïuìh鵿dä_âºàXßIÞvÝå܉ÜeÜiÜŸÜðÜoÝÞµÞ€ß^àVáTâlã‰ä³åææèXéŽêÉë÷ì#î<ïGð;ñòÓòjóØóô"ôíóóÉòËñ‡ðîîíâêrè½åÏâ²ßpÜÙ¹ÕdÒ#ÏÌ0ÉœÆSÄdÂßÀ´¿¿¤¾¼¾+¿ú¿Á†Â5Ä!Æ@ȆÊõÌyÏÒÌÔŒ×SÚÝíߺâ„åLèëÄí}ðóÈõUøèúhýßÿP® W Ö .I`ipg]G *" $ß%®'y);+û,².h02¿3d5781:¾;I=Ä>B@§AC[D¥EÌFìGáHÇIzJ KlK”K‚K'K„J‘IBH–FŠDB“å- d œ¿ã÷ úéÍ!ª#„%T')ä*¢,_.0Ã1i35±6L8â9p;üö?aAÈBDbE”F´G±HœIWJòJZKŽKˆKõQñÌíêÅçDå(ã[ááß°ÞÉÝÝ®ÜrÜf܉ÜÐÜ>ÝÄÝsÞ+ß àïàôáüâä@åiæ¤çØèêMë~ì¯íËîßïÚðÁñ‰ò0ó­óýóôô­óó1òñïÎí¼ëjéÈæøãåà¶ÝbÚ ×ªÓfÐ<ÍKÊ–Ç.ÅÃnÁ!À?¿Â¾­¾ú¾¥¿¤À÷Á‰ÃaÅjÇ£ÉÌ€ÎÑÁÓ}Ö=Ù ÜÔÞ¦ánä:çúéºìoïòÁôW÷ëùoüëþ]Ä!tº ø 0S{ž¨£šˆn!P#)%ù&Æ(Œ*L,.¾/k13¾4_6ÿ7Ž9&;¬®?AƒBÙC#EZFzGƒHlI6JÔJGK‡K‰KPKÇJôIÊHAG^ECa@D=Ê9ç5­1$-N(F# ¾eÛÌðþYú öòuî0ëKè¾åã±á)àéÞóÝ;ÝÂÜ{ÜiÜ€ÜÃÜ#ݯÝHÞßÙßÈà½áËâßãå1ædçœèÖéëCìrí“î¨ï«ð’ñeò ó˜óìóôô½ó2ó\òDñÚï&î*ìÚéTçä‚áUÞÛ±×OÔÑ×ÍÙÊÈ ÅüÁZÀg¿Ñ¾®¾ä¾€¿nÀ±Á8ÃÅÇ5ÉŠËΘÐ;ÓôÕ·Ø}ÛNÞáæã°æqé3ìçî–ñ=ôÖömùñûsþãN«K ‰ Àí +6C?9)!ö"È$¢&k(5*õ+°-i/1Æ2k46¨7E9Ó:b<ã=a?Ñ@=B”CåDFDGNH@IJ·J3K}KŠK^KåJ!JI”GÁEŠCê@é=z:²6†2 .H)@$Çrà Çâÿ:ûâöÕò(ïÏë×è<æöãâpà'ßÞ\ÝÙÜ…ÜnÜzܳÜÝŽÝ.Þä޲ߖàŽá’â«ãÈä÷å%ç`è–éÒêì5í\îrïvðgñ9òîò{óÞóôôÎóNóŠòyñ&ð}îìQêÔçåâòÞ¯ÛUØøÔ§ÑsÎjËŸÈÆæÃ›ÀŽ¿í¾«¾Ú¾Z¿>ÀoÁé©ěÆÅȈÍиÒnÕ,ØõھݑàXã'æéèªë`îñ·óZöéøwûòýmÖ5ŽÕ  R¦¿ÓÝÞÕË® ˜"o$B&(Ø) +[-/Å0p24¾5Z7ô8…:<˜=?Œ@ôARC¢DàE GHIêI“J KmKKhKKKJDIßG$FúCxA>.;t7Z3ò.6*C% Ô€'è ÃÕ!ü¶÷ óÚïrìjé·æiägâÀàcßPÞƒÝìÜ™ÜmÜxܦÜÝtÝÞ»ÞŽßdà`á]âtã“ä¶åïæè\é’êÉëúì"î9ïFð5ñòÊòaóÊó ô ôÞóhó²ò³ñjðÑîóìÂêRèœå¯â‘ßRÜúØŸÕJÒÏýË%ÉÆNÄdÂÞÀ½¿¿¶¾Ç¾@¿ À/ÁžÂLÄ;ÆVÈ¡Ê Í–Ï4ÒçÔ£×kÚ4ÝàÏâ›åaè ëÜíŠð8óÓõløöúyýòÿ]Ág « â :YkxxwgT 6"$ê%¸'ƒ)E+-¹.s02È3j5 7¢88:Å;K=Ì>A@¯A CaDŸEÒFãGäH½IuJK^KŠKqKKuJxI.H{FoDúA?Û;28.4Ò/)+>&!!Ý2ï ÂËý“øgô‘ðíüé<çÙäÆâá¤ß„Þ©Ý Ý¤ÜvÜrÜ ÜéÜaÝíÝœÞcß:à/á+â<ã[ä}å°æäçéWêŠë¿ìçíïðñèñ¥òEóµóþóôçó‚óÔòëñ¨ð)ïNí7ëÊè'æ@ã0àòܤÙBÖñÒ­Ï”Ì®É Ç·Ä¾Â$Áñ¿!¿Â¾¼¾%¿ß¿óÀSÂ÷Ã×ÅíÇ*ʘÌϺÑYÔ ×ÝÙ¬ÜxßEâåÙç—êUíð²òRõí÷wúþüwÿæI¦ó; v ¦Óë õØ!¸#%`'')ñ*ª,j.0Ì1s35¸6T8ç9x;þ<>ø?fAÊBDdE•F¯G²H“ISJëJNK„KxK-K–J¯IqHÕFÜDwB²?‚<ï8ý4±0,:'!"ê•Bò Ç¿÷ýlù6õNñÆí“êÅçIå/ãaáêß»ÞÐÝ'Ý·Ü}ÜsÜ•ÜÚÜIÝÑÝyÞ:ßàýàúáãäGåqæ©çÛèêOë‚ì¬íËîÛïÙðºñ€ò&óŸóôóôóó”óùòòæðxïªí£ëD鮿ÔãÆà˜ÝDÚîÖ’ÓOÐ*Í<ÊŠÇ'ÅÃmÁ&ÀF¿Ë¾½¾ ¿¸¿¹À ¢ÃxńǻÉÌ™Î/ÑÜÓÖ[ÙÜðÞ¸á†äPç êÑì}ï1òÏôl÷üùüþþkÖ.„È  <cˆœ¬³¯§’}!X#2%'Ì(›*R,.Æ/t1$3Ä4i68™9*;²<6>®? A„BÚC%EVF|G~HgI/JÍJ=K}K{K?KµJâI°H/G=EûB:@-=£9Ì5‰1-,('#ð¡Mý ǼàþQúöòrî1ëLèÃå”ã¹á0àôÞúÝHÝË܆Üw܉ÜÏÜ0ݶÝYÞßéßËàÊáÐâéã å7æjç¡èÚéëDìtí‘î¨ï¤ðñYòó‡óåóôùóªóóIò%ñÁï îìÁé,çeä`á5ÞìÚ‘×9ÔíÐÇÍÆÊȘÅ}ûÁaÀk¿ß¾º¾õ¾’¿„ÀÄÁTÃÅÇIɧËβÐTÓ ÖÐØ“ÛdÞ.áüãÃæ‰éCìýî©ñQôçöùü„þò^»X ™ Îù3HNLF1!ý"Ö$¬&t(A*ü+½-o/!1Ï2p46¯7K9Ú:g<è=d?Ú@:BœCáDFDGHH?IJ±J'KsK}KPKÑJJïH~G¥EnCÍ@È=[:Ž6f2ç-')!$úªYÌ µÒÿ1û×öÓò#ïÏëÚè>æÿãâyà/ß)ÞiÝâÜ’ÜvÜ‡Ü½Ü Ý˜Ý9Þí޼ߠà—áœâ±ãÓäúå/çbè›éÖêì7íZîpïtð`ñ5òâòtóÍóôûó»ó6ótò_ñ ð_îqì1ê³çñäøá×ÞÛ8ØáÔŽÑcÎYË’ÈÆßÞÀ—¿õ¾º¾ç¾m¿RÀ…ÁÿÂÁijÆßÈ-Ë¡Í,ÐÓÒƒÕFØ Û×Ý¥ànã<æýè¿ëtî$ñÎógöÿø…ûþyçG™ë & a޲ÍßèëãÔ½ ž"{$O&(ç)¥+e-/Ì0{2!4Ä5`7ü8‰:<=?@ôAVC¡DßE GHIáIŽJKbKKXKðJ7J.IÊGFãCVAf> ;U793Ð.*$%ýºcÐ ´Äü¬÷šó×ïsìjé¿æiärâÆàoßYÞŽÝùÜ¡Üz܂ܴÜÝ„ÝÞÊÞ–ßpàfájâyãœä¾åóæ%è^é–êËëýì î:ï@ð1ñ òÂòWó¾óùóýóÉóSóšò™ñMð·îÑì¦ê1è{åâoß6ÜÜØ‡Õ2ÒûÎïËÉŠÆGÄcÂáÀ¿¿¿¾Ú¾M¿$ÀAÁ·ÂcÄSÆqȶÊ(ͬÏOÒþԻ׃ÚKÝàåâ±åuè6ëîí¡ðGóéõ|ø û‰ýoÏ(v ¸ ó !Idz„…ƒpa ?"$ô%Â')O+-Â.{0#2Ò3p57«8<:Ë;P=Ï>E@²ACbDŸEÐFâGßH·IoJûJTK~K_K K\JgIHdFRDÜAý>»;8 4²/+&!¿tØ ³¹þü‰ø`ô‘ðíÿé@çÜäÑâá®ßÞ¯Ýݬ܅Ü}ܧÜûÜeÝÿÝ¢ÞmßEà5á6âDã_ä‡å´æêçéYêëÀìçíï ðñàñžò:ó©óñóüóÖókóÀòÎñ’ðï5íë¯èæ#ã à×Ü‚Ù-ÖÔÒœÏ~Ì¥ÉþƷĹÂ'Áö¿)¿Ï¾Ê¾9¿ð¿ ÁgÂÄðÅÈGʬÌ.ÏÍÑvÔ5×öÙÃÜŽßZâ)åèç±êdíðÁòjõú÷ú ý‡ÿöZ´ I … ³â÷(ýæ!¾#›%f'6)õ*¹,m.%0Ñ1|3!5¿6[8í9};=„>ý?iAÊB DbE”F­G¯HŒIOJßJGKvKiKK‚JœIWHÀF½D\B“?b<Ð8Û4‘0õ+'"Ìz+Û µ®ìýaù2õHñÆí”êÇçPå3ãkáñßÆÞØÝ6ݿ܌Ü|Ü¡ÜäÜUÝÜ݃ÞFßà áâã&äMåxæ®çáèêOë„ì¬íËîÖïÕð³ñ{òó™óÞóôÛó„óãòÿñÒðUï”í}ë)éŠæ³ã¨àvÝ*ÚÎÖ}Ó6ÐÍ-Ê~Ç#ÅÃqÁ)ÀP¿×¾Ë¾¿É¿ÒÀ¿ËŞÇÔÉ4̳ÎGÑõÓ©ÖrÙ3ÜßÏášäeç#êâì•ïAòãô|÷ ú’ü ÿ~ã=•Ó  Fs•§¼½»³œˆ!c#?% 'Û( *^,.Î/~1)3Í4o6 8¡9-;¹<8>²?#A†BÛC#EXFwG}HaI*JÃJ7KkKsK+K¥JÌI›HG'EÙB#@ =†9©5k1á,(#Ö†3ç µªÖþDúþõ òqî2ëOèÈåšãÁá9àþÞÞSÝÕÜ•Ü~Ü˜ÜØÜ=Ý¿ÝeÞßòßÖàÐáÛâïãå>æmç¨èÚéëFìrí’î¤ï ð‹ñQòýò~óÔóøóäó—óó0ò ñ¢ïîíçë¢é çGä>áÞÏÚt×!ÔØÐ²ÍºÊÈÅzûÁeÀt¿è¾È¾¿£¿šÀÚÁhÃ2Å4ÇcɾË3ÎÉÐlÓ&ÖãØ¯ÛwÞFá䨿œéXìïºñdôùöŽùüþlÊg ¦ Ü)BSZXQ@%! #ß$¶&€(G*,Ã-z/)1Õ2}46º7O9á:i<ò=e?Ü@@B—CçDF@GIH6IJ¤J$KaKtKë:473¯.ö)%â›Jûº ¢¸üª÷ŽóÙïoìoéÀæsäuâÒàtßgÞ”Ýݪ܇ÜܽÜÝŽÝ Þ×Þ›ß}àoáoâ†ãäÊå÷æ)èfé”êÑëúì î8ï<ð.ñò¹òKó´óéóðó³ó@ó‚ò€ñ3ð›î³ìˆêè^åmâSßÜÂØjÕÒæÎßËÉ€ÆBÄaÂåÀÈ¿¿Ì¾è¾`¿5ÀZÁÈ€ÄgÆŠÈÓÊ=ÍÇÏgÒÕ××–ÚeÝ/àüâÅåŠèJëî´ðXóþõ‹øûšý~à7„ È þ 2St…“Œh M")$ý%Î'—)W+-Ì.‚0/2Õ3}57´8@:Ò;U=Ô>H@¶ACdDŸEÎFàGÝH¯IlJîJOKmKVKôJNJNIþGIF9D¼Aá>˜;ô7ë3‘/é*ý%æ ¤XÅ ž¬òüøZôðíêDçàäÙâá¹ß–Þ¾Ý Ý¼ÜŒÜ‹Ü´ÜÝvÝÞ±ÞvßNà?á?âJãkäŠå½æíç%é]êëÂìæíï ðþðÙñ˜ò.óŸóáóîóÂóVó¬ò²ñ{ðçîíõêŒèæåÿâïß¶ÜiÙÖÁÒ‚ÏtÌÉûƫĹÂ)Áú¿7¿Õ¾Þ¾D¿ÀÁ€Â%Ä ÆÈ]ÊÈÌEÏæÑÔL×ÚÛÜ¢ßtâ9åèÃêzí/ð×òxõøœúý˜ÿj T “ Äé *2' í!Î#¢%r'?)ÿ*Â,w..0Ø1‡3%5Ë6^8ö9ƒ;=>ü?pAÌBDfEF®G¨HŠIDJÙJ;KkK[K KoJ†IBH¤F¥D>Bu?B<®8»4o0Ö+÷&æ!®`È Ÿ¡ÜýXù(õFñÁí˜êÈçUå;ãpáýßÍÞçÝ;ÝÑÜÜܦÜ÷Ü[ÝêÝŽÞOß&àáâã0äTå}æ´ççè êSë…ì®íÇîÙïÌð±ñqòóóÒóíóÌómóÏòäñ·ð9ïtí`ëéiæ”ã…à[ÝÚµÖaÓ!ÐÍÊwÇÅÃnÁ/ÀX¿á¾Û¾(¿à¿áÀ7ÂÓåŸÇêÉPÌÉÎbÑÔÀÖŠÙLÜßèá¯äzç9êõì©ïTòöô÷ú¡ü ÿõM£ã ) R…žºÅËɼ­!r#F%'â(«*j, .Û/„123×4s68£96;½<=>¸?%A‡BàC!EYFtGzH^I!J¾J)KcKcKK–J³IˆHøFE¼B@èÑ: 7ý2‡.Ú)à$Ã~/㥠’¤ü›÷ŒóÑïrìkéÇætä€âÕàßnÞ¡ÝݵܓܘÜËÜÝ›Ý*Þãޥ߈àwázâ‹ã¨äÎåýæ0èféêÐëýìî8ï8ð+ñûñ³ò>ó©óÚóßó¡ó+óiòjñð}î–ìfêïç=åLâ4ßöÛ¥ØRÕÒÕÎÊËþÈtÆ<ÄbÂãÀÒ¿ ¿Û¾ö¾u¿FÀpÁá”ăƢÈéÊ[ÍÜÏ‚Ò-Õí×±Ú{ÝEàãÙå¡è\ëîÆðnó ö¡ø,û¬ý"ŽðG’ Ù Aa•› ˜Œt Y"3$ &Õ'£)`+#-Ô.042â357¸8I:Ø;X=Û>J@¹ACdD EÍFÞGØH«IdJæJCKcKCKèJ7J;IçG.FD¡A¾>|;Ð7Ë3o/Æ*Þ%Å Š9î« Œ›åüuøUô†ðíþéHçåäÞâ%áÃßžÞÉÝ*ÝÆÜ˜Ü•Ü¿ÜÝ~ÝÞºÞß[àGáHâTãpä“åÂæôç'écêŽëÅìäíïðúðÓñŽò%ó“óÓóÞó¯óEó‘òžñYðÐî÷ìÕêmèÄåáâÎß™ÜGÙùÕ£ÒpÏ`Ì‚ÉñƥķÂ+Áþ¿?¿ä¾ê¾W¿À0Á™Â:Ä!Æ7ÈvÊàÌ`ÏûѬÔ`×+Úìܿ߅âSåèØêŽíCðéòŒõ!ø­ú3ý¥ÿyÒ# d £ Ðû-999( ú!Ö#°%|'J) +Ê,.60ä1Š325Ì6i8û9ˆ;=Ž>@mAÔBDfE‘F©G¦H„I>JÒJ0K`KMKúJ`JnI-HŒF†D&BR?&<Œ8š4L0µ+Ô&Ë!ŒGõ² Š’ËýSùõBñÁí”êÎçXå>ã|áàÚÞîÝGÝÛÜܖܵÜþÜiÝóݘÞZß.àáâã7ä\傿¼ççè&êTëˆì«íËîÐïÍð¨ñjòóóÅóßó¹óZó·òÎñœðïUíBëçèJærãhà8ÝïÙšÖIÓ ÐõÌ ÊlÇÅÃrÁ3À^¿ð¾ä¾=¿ñ¿÷ÀNÂçÃÀÅÎÇÊfÌåÎxÑ'ÔÙÖ ÙeÜ2ßüáÈäŒçOê í¼ïfò õ ÷2ú²ü0ÿš X´ó 2 g‹²ÁÕÕ×Ǹ™!~#P%''í(´*r,-.ß/‘163á4z68ª9<;Á¼?%AŽBÝC$EYFpGxHWIJ³J KXKRKK‚JŸIqHàFòD¡Bæ?É×îÓªÐ͘ÊìÇÅqþÁjÀ„¿þ¾á¾)¿Å¿ÃÀ–ÃbÅcǘÉëËjÎ÷РÓUÖÙÞÛ¤Þsá;äçÄéƒì5ïäñ†ô ÷²ù6üµþ%‹í:† à ö&B^lrsgX=!#÷$Ç&™(V* ,Ñ-/91ç2Š4-6Æ7^9ê:y<õ=q?â@CB CãDF=GBH/IõI™J KRKQK#KšJ×I¬H7GUECs@m=ú9-62…-Æ(Å#ŸZ  ªÿ ûÁö¿òïÍëàèKæ ä+âàMßFÞˆÝݶܗܪÜßÜ?ݼÝVÞߨ߽à±á¶âÈãêä æCçnè«éÜê ì9íWîlïgðSñòËòQó©ó×óÆó‚óöò-òñ¶ï îìÓéSçŽäšáwÞ5Ûç×ÔMÑ%Î)ËmÈõÅÒæÀ«¿¿á¾¿¢¿ŽÀÂÁFÃÅüÆ)ÉvËíÍwÐÓÍÕŒØQÛÞçà²ãzæ=éùë²î[ñôœö5ù¹û6þ°zÅ R й×ú  ôâ ¾"›$o&:(*Á+ƒ-3/é02<4Ø5z7 9¡:&<®=&?š@þA[C£DâEGHüHÔIwJùJAKZK)K½JüIîHG½EŒCA>¯:ð6Ù2k.·)Ã$¤cÊ” zœïû–÷†óÍïrìnéÉæzä†âÝà‰ßxÞªÝÝÂܛܦÜÒÜ.ÝŸÝ;ÞçÞ±ßà€á„âã²äÑåç0èpéœêÕëüì î5ï7ð#ñøñ§ò8óšóÍóÍóóóTòPñúïdîuìIêÏçå/âßÜÛ‡Ø8ÕìѾξËìÈoÆ4ÄcÂåÀ׿+¿æ¾¿ƒ¿ZÀ†Áõ®ĘƼÈËrÍ÷Ï—ÒHÕØÈÚ‘Ý]à&ãñå²ètë)îÙð€óö³ø;û¿ý1¡ûY  å Iq‹ ©«¥–€ c"=$&à'­)h+,-Þ.“0?2æ3‰5%7À8M:Þ;_=Ú>T@µACcDŸEÎF×GØH¢I_JÝJ6KYK3KØJ#J'IÏGFD…A£>[;²7«3N/ª*½%¨ m Ö— {ŒÙükøOô…ðíêIçêääâ.áÉߪÞÒÝ4ÝÒܤܞÜÍÜÝŠÝÞÄÞ‹ß`àTáMâ]ãväšåÈæùç,édê”ëÄìãíïðøðÊñˆòóˆóÅóÍóžó-ó}òƒñAð²îÜìµêOè¤åÁâ²ßxÜ/ÙÛÕÒZÏPÌuÉ寢ijÂ/ÁÀH¿ï¾ù¾i¿,ÀFÁ«ÂUÄ6ÆOÈŽÊøÌxÏÒÀÔ|×=ÚÝÒßœâhå(èîêŸíXðúòõ4ø¾úAýºÿ$Œß2 s ¯ ß$9CGB6" "ã#¶%Š'P)+Ò,‹.>0ì1’3:5Ò6p8:;=> @nAÖB DeEF§G¤H~I8JÇJ'KRKAKêJLJ\IHsFlD B4? ÿ¯p» ? sœºÑßäàÖÀ©!ƒ#^%.'ø(¾*z,7.ç/™1B3ã4†68´9?;Ⱦ?,AŒBáC&ETFtGoHWIJ¯JKMKEKþJnJIZHÊFÖD‡BÇ?­<$9F5 1},°'¨"|5ç¤ zw®þ!úæõýñhî3ëUèÔå¬ã×áPàß#ÞqÝùܳܠܼÜöÜbÝÝÝ…Þ:ßàóàêáôâä)åPæç²èìéëMìríîœï—ðxñ<òãòZó°óÈóµóVóÈòâñÃðNï”íë@鮿äãÞà¿ÝrÚ'×ÓÓ—ÐxÍÊÜÇ}ÅkþÁpÀŠ¿ ¿ð¾4¿ß¿ÐÀ!©ÃzÅ|Ç­É Ì}ÎѶÓmÖ+ÙóÛ¼Þ‰áQäçØé˜ìFïøñ–ô1÷ÅùDüÉþ0 öM’ Ñ 0Qjz~taJ!(#%Ô&Ÿ(d*&,Þ-•/B1î2”436Í7e9î:€<ø=x?â@IBžCåDF7GCH'IòIŽJKCKIKKJ¾I™HGV@ºACeD EÊFÚGÎH£ISJ×J.KGK*KÂJJI¶GFãCiA‚>=;7‰3./ƒ*¤%‚ U¿ h|ËücøFô€ðíêMçïäèâ7áÐß¶ÞØÝBÝÜܯܩÜÙÜÝšÝ ÞÔÞ’ßoàWá[âbã€ä¢åÍæýç3éeêšëÂìèíøîðíðÊñ{òó|ó¶ó¿ó‰óófòjñ'ð•î¼ìšê+è‡åŸâ“ßYÜÙÁÕvÒGÏ<ÌiÉÞÆ™Ä´Â.Á ÀP¿ü¾¿x¿AÀYÁÃÂlÄNÆiȨÊÍ”Ï*ÒÜÔ‘×UÚ Ýåß¶âxåBèþê¸ígðó°õDøÑúPýËÿ5šð@ À ê1CTPS>. "ë#Å%‘'[)+Û,•.D0÷1˜3D5×6y8:•;=—> @xAÑB&DbEF£G¢HvI5J¼JKDK1KÚJ9JGIÿGWFUDçA?ã;P8V40q+›&ˆ!Yƈ dr´ý;ùõ8ñ½í™êÏçdåIã‹áàêÞÞXÝñܵܪÜÎÜÝ}Ý Þ®ÞkßEà'á(â-ãGäiåæÃçóè+êYëŠì¬íÆîÏïÀðŸñZòöòfó­ó¼ó—ó2óŠò ñfðéîíë¬èæ7ã(àþܵÙeÖÓãÏÒÌòÉVÇÅÃuÁ=Ào¿¿¿_¿À!ÁxÂÄïÅüÇ8Ê–ÌϬÑSÔ ×ËÙ”Ü^ß'âòäµçvê2íàïò,õÅ÷RúÕüPÿ½#}Í O €¨ÊÜíîíàͲ!#g%8')Æ*…,?.ï/¢1H3í4Œ6#8º9F;ʽ?2ABãC%EUFnGoHOIJ¤J K>K7KïJZJ~I?H²F¾DgB­?‹<9%5é0],’'ˆ"cÕŠ iiþúÜõúñhî2ëZèÙå¯ãááXà%ß-Þ|ÝÝÀܫܯÜÝgÝîÝŠÞGßàûà÷áøâä,åWæ…ç¹èëéëOìpí’î—ï“ðsñ4òÙòQóŸó¼óóIó¬òÏñ¤ð6ïuírë éæÃãÃàœÝZÚ ×½Ó‚ÐeÍÊÑÇwÅkýÁvÀ‘¿¿þ¾F¿î¿èÀ3ÂÁÑŕÇÅÉ"Ì•Î+ÑÍÓ‡Ö@Ù ÜÒÞáiä,çîéªì[ï ò©ôF÷Ñù[üÒþH¨ V¥ Þ @]xƒŒˆ€mS!5# %ß&©(m*0,æ-/L1õ2›4:6Õ7h9ù:<>z?ã@OB›CêDF8G>H#IëI†JüJ3K@KûJ~J©I„HG#EâB:@-=½9í5À1H-‚(‹#e"Ü‘l ]ÿøú±ö¶òïÍëæèRæä7â¥à\ß\ÞžÝÝÍÜ­ÜÁÜõÜVÝÑÝkÞ$ßêßÓàÀáÉâ×ã÷äæMçwè³éàêì:íUîgïaðHñò¸ò;óó¹ó¥óZóÎòùñåð{ïÔíÓëšéçRäXá;ÞúÚ°×]Ô"ÑýÍ ËRÈèÅÊà ¯À¸¿)¿û¾7¿Æ¿¶ÀîÁrÃ4Å/ÇVÉ«ËΩÐKÓýպ؂ÛHÞáÝã£ægé"ì×î„ñ(ôÂöWùÙû]þÈ8‘è1 p ¨Ïø !%( ö Ô"±$ƒ&P(*Ø+-I/ö0¥2G4é5…79ª:4<³=1?ž@B^C¥DÝEG HøHÅIiJæJ,K=KK—J×IÀHSG‡EXCÃ@Í=k:³6•2,.v)…$j*äi \zÝûƒ÷{óÈïpìréÐæ†ä‘âòà˜ßŽÞ¿Ý/ÝÝܯܾÜéÜBݸÝMÞüÞÆß¡à•á‘â£ã¼ääå çBèqé§êÖëþìî1ï/ðñèñ˜ò#ó€ó±ó©ólóèò)òñÊï"î?ìêçÜäïáÓÞ¢ÛKØ ÕºÑ›Î™ËØÈYÆ1ÄYÂðÀá¿?¿¿"¿©¿€À°Á#ÃÚÄËÆèÈ9ËžÍ,ÐÇÒwÕ3ØöÚ¿ÝŠàQãæÛèëPîñ¦óCö×ø^ûÞýT¼!q 9h‰©¸Âļ®– y"T$)&ö'½)+:-õ. 0R2ó3›517Í8[:ç;i=ç>S@ÃAChD¡EÆFÚGÇH IIJÏJ!K:KK°JJûHGéEÅCOAa>;p7h3/d*%j 5ì¤m UnÀüYø@ôðíêNçöäîâAá×ßÁÞäÝKÝéܸܸÜãÜ,Ý£Ý-ÞÚÞžßwàbácâjãˆä¦åÕæè8égêœëÃìèíùîðêðÂñsò ókó¬ó©ó{óóMòSñ ð{îŸìwêèbå„âpß>Ü÷ؤÕbÒ1Ï,Ì]ÉÑÆ•IJÂ0ÁÀZ¿¿¿Œ¿QÀqÁÙÂÄkÆ{ÈÆÊ$Í®ÏEÒòÔ«×mÚ4ÝàÈâ‘åVèëÍíyð&ó¾õYøÞúgýØÿG§M “ É ü ?R]`YN8 "ú#Ë%'d))+å,œ.Q0ø1©3B5å6{8 :›;=™>@uAØB$DcEŽF£GšHvI)J¶JK8K%KÆJ)J/IêG=F;DÊAÿ>Ã;0854î/O+~&g!@ñ°q Sb¦ý4ù õ4ñ½í™êÓçjåNã“áàóÞÞgÝúÜÁÜ·Ü×Ü!݇ÝÞµÞzßHà8á*â;ãLäpå˜æÇçùè.ê[ëŽì©íÇîÊï½ð™ñQòìò\óó¯ó‚óótò„ñNðÉîþìåê‰èìåã àÝÜ™ÙKÖÓÎÏÀÌãÉNÇýÄÃrÁEÀv¿¿¿l¿*À4ÁÂ.ÄÆÈSʬÌ/ÏÃÑmÔ"×åÙ«ÜrßBâåÏç‰êEíõï¡ò>õÙ÷búèü_ÿÐ0ŽÚ# [ ¶Õìöþ÷ìÚ»!ž#o%D' )Ò*Œ,J.ö/«1P3ô4“6,8¾9N;ÐÅ?0A“BáC&ETFlGmHII JœJK5K'KáJHJgI+H™F¢DMB‹?n<æ85Ç0<,p'k"Bÿµx QYŽþúÔõõñcî3ëYèÞå¶ãçá`à.ß6Þ‡Ý ÝÊܶÜÒÜÝuÝõݘÞQß!àáúáãä8å[æŒç½èðé"ëNìvíŠîœïŠðpñ-òÏòFó”óªóŽó4ó–ò·ñ‹ðïYíRëÿèræ£ã¢àÝ9ÚñÖ¤ÓjÐWÍnÊÈÇoÅdÃÃÁvÀš¿!¿ ¿Z¿þ¿ÿÀFÂÜçŭÇàÉ6̳Î@ÑêÓ›Ö[Ù!ÜêÞ´á~ä@çê»ìrïò¾ôU÷æùiüåþW»h² ì $Kl…š•Œx_!>#%ç&´(w*7,ò-¤/U1ý2¢4D6Ø7u9ù:‰<>}?ë@KB¢CåDF5G;H IâIƒJíJ.K.KîJkJ•InHíFEÉB@=9È5£1"-g(h#GÀ|V L€ÿîú¥öµòïÑëäèWæä>â«àfßhÞ¤Ý&ÝÓܼÜÉÜÝ[ÝáÝrÞ/ßõßÚàËáÐâßãýä"æPç~è¶éáêì9íVîcï_ð?ñ ò®ò/ó‡ó¥ó˜óBó»òáñËðbï³íºëuéôæ/ä:áÞßÚ×IÔÑðÍùÊJÈÝÅÇà ±À¿.¿¿A¿Ü¿ÈÀ‰ÃLÅGÇpÉÁË7ÎÀÐfÓÖÒØ—ÛaÞ(áõã¸æzé7ìêî—ñ<ôÔöiùìûjþÞC¥ôB } ¶Þ,43)ÿ â"¼$‹&\(*ß+ž-L/1¨2Q4ñ5Œ79´:5<½=2?¢@ B\C¨DÝEÿFH÷H¹IhJ×J$K0KýJˆJÁI®H:GmE]@¿ACfD EÈFÒGÈH–IFJÄJK.K K JðIâH‹GËE¯C/AE>þ:P7F3ï.B*e%K Ó‹Z C^µüNø;ô{ðíêPçúä÷âDáãßÇÞïÝWÝðÜÇÜÁÜíÜ9ݬÝ:ÞäÞ¦ßàkájâuãä­åÜæè>ékêœëÆìæíùîûïéð¸ñpòüòcó›óœófóòò6ò<ñîïaî~ì]êíçGåaâVßÜÜØŒÕHÒ!ÏÌTÉÆÆÄ²Â0ÁÀa¿¿&¿š¿fÀ†Áì›Ä}Æ™ÈØÊAÍÂÏ_Ò ÕÂ׃ÚLÝàßâ¦åhè)ëÛí‘ð2óÖõeøöúpýìÿU¹ ` œ Ý 1IbgneYE $"$Ù%¥'p)2+í,§.V02ª3O5é6ƒ8: ;"=Ÿ>@zAÙB%DcEŽFŸG™HnI&J¬J K*KK·JJIÑG(FD°Aß>¥;84Ë/4+X&Q!Ý”\ AR™ý+ùõ4ñ·íšê×çjåXã™á!àßÞuÝÝÍÜÁÜâÜ+Ý’Ý Þ¿Þ‚ßSà@á3âDãRäwåæËçé.êcëˆì®íÄîÇï¼ð‘ñIòäòOó‘óŸóqó ó_òlñ3ð°îßìÉêièÍåóâíß¿Ü}Ù2ÖæÒ¿Ï©ÌÛÉ@ÇúÄ ÃvÁHÀ¿¿#¿{¿<ÀKÁ ÂHÄÆ1ÈeÊÊÌFÏÚчÔ7×Ú¼ÜßPâåßçŸêZíð¶òMõì÷rúûümÿá@›ì/ l ›ÅáùùãÊ!¤#}%K')Ú*˜,P.0¯1Z3ü4š628Ä9R;ÖÇ?5A“BãC'EQFkGgHEIJJûJ%KKÐJ5JSIH‚F†D2Bo?N<Ç8â4¨0,P'P"!æb =JþúÎõïñaî7ëYèäå¼ãêápà.ßHÞŠÝÝÐÜÆÜØÜÝ}ÝÞŸÞ\ß*àáâ ã ä;ådæçÁèóé$ëQìtí‹î•ïŠðgñ(òÅò:ó…óó{ó óòñtðýî<í4ëáèQæ‚ã…à^Ý ÚÓÖÓUÐCÍcÊ»ÇiÅaÃÁÁ|À¢¿*¿¿i¿ÀÁ]ÂðÃÁÅÄÇùÉPÌÉÎ\ÑþÓ·ÖoÙ9ÜþÞÌá‘äXçêÑì„ï/òÏôi÷öù{ü÷þdÎ$z¾ ü 0Xy’ž¥¡˜ƒk!H#"%ò&¼(ƒ*@,û-®/\13©4J6â7u9;Š< >‚?ì@PB¢CæDF2G:HIâIuJêJK$KÝJZJ€IYHÓFðD«Bü?óÈÔÅÆÃ Â¹Àÿ?¿¿W¿ê¿ßÀ ÃbÅ`LJÉÞËJÎÜÐ|Ó,ÖêØ¯ÛuÞAáäÍæéJìýî«ñLôéöxùþû{þíV²L Áï(9A=9"!ë"Å$™&b(,*è+¦-X/ 1³2X4ø5’7(9´:A<¼=9?¥@ BaC¦DÝEþFHòH¶I]JÒJK$KîJwJ¯I–H#GUECŒ@Œ=/:o6U2é-6)F$-ô®o@ 6`Âûr÷nóÁïnìuéÖæäŸâÿà¬ßŸÞÔÝFÝîÜÉÜÑÜÝWÝÎÝaÞßÙß´à§á¢â³ãËäðåçKèzéªêÝëÿì î+ï+ðñÞñ…òóeó—ó‡óEóÀò÷ñêðïïíìÊéSçœä¯ášÞbÛØÑÔ“ÑnÎ˺ÈKÆ%Ä[ÂôÀð¿N¿¿>¿Ï¿¥ÀÜÁKÃÅ÷ÆÉdËÕÍYÐûÒ¦ÕbØ%ÛìݵàãAæ éÂëvî+ñÄómööøƒûþsß<”Û  V€¨¿ÕÚÜÔÅ® Ž"j$=& (Ò)“+O-/·0]2 4£5E7Õ8k:ð;s=î>]@ÆACjDEÆFÒGÂH‘I?JºJ K$KøJ–JÖIÓHoG´E“CA&>à:-7*3É.%*C%, ýµvC 1N§üFø2ôyð í êSçÿäýâMáêßÒÞúÝ_ÝÿÜÎÜÎÜøÜDÝ·ÝDÞîޱߋàtátâ{ã•äµåÞæè<éqêžëÇìæí÷îøïâð¶ñdòõòUóŽóŠóXóÙò"ò!ñÔïDîaì>êÎç(å?â7ßÜÀØqÕ3Ò Ï ÌCɿƊIJÂ2ÁÀi¿ ¿6¿«¿yÀœÁõēƲÈóÊYÍÜÏuÒ#ÕÙלÚbÝ*àöâ¸åè9ëóí¡ðHóåõ{øûˆýöÿjÅ!i ± ä ;YjyutcN 1"$à%´'v)=+÷,°._0 2²3U5ô6†8:¡;+=¡>@~AØB(DcE‹FŸG’HkIJ¥JüJ"KK­JþI I¸GFD“AÀ>…;ï7ô3«/+;&-!¿}F .@ýùÿô+ñºí—êÜçnå_ãžá.àßÞÝ ÝÚÜËÜïÜ4Ý Ý'ÞÎÞ‰ß`àEáAâFã`äyå§æÏçé1êfë‰ì°íÀîÇï´ðŒñCò×òEó‚óó]óøòDòVñð‘îÅì¥êNè¨åÖâÌߣÜ^ÙÖÎҨϛÌÉÉ8ÇñÄÃwÁMÀˆ¿)¿-¿¿NÀ]Á½ÂXÄ:ÆBÈ…ÊÞÌ`ÏöÑšÔW×ÚÝÜžßkâ2åôç¶êií!ðÁòhõ÷÷‡ú ýÿîS©ü= y «ÑðîÔ!²#…%Y')ä*¢,W.0¸1a35Ÿ6;8Ê9X;Ú<[>Ì?8A—BåC&ESFgGdHCIøIJëJK K¿J%JßKÞ›Ý%ÝÝÜÑÜãÜ(ÝˆÝ Þ¬Þdß6àáâã'äDåiæ—çÅèøé'ëQìuíŠî“ï‡ð`ñ"ò»ò0óxóójó ókò†ñYðáîíëÁè2æaãhà=ÝÚ·ÖtÓAÐ/ÍRʳÇ_ÅaÃÀÁ‚À©¿6¿'¿x¿$À%ÁtÂÄØÅÞÇÊjÌãÎrÑÔÉÖÙLÜßÜá­ägç2êàìœï>òäôz÷ úüÿvÜ8†Ð @g…¡¨µ«¥Žx!R#-%ý&È(Œ*K,.¹/c13°4R6ç79;‘<>…?ñ@QB£CéDF4G1HIÖIsJÚJKKÐJFJnIAH¼FÓDBà?Ñ<[9‰5_1â,$(+#ÓŠO, (fÿÓú™ö£òïÊëëè[æ*äLâºàxßxÞ¼Ý8ÝìÜÒÜÜÜÝqÝõÝŠÞAß àìàÞáàâïã å-æ^çˆè»éíêì;íWî[ï\ð3ñýñžòókó‹óqó#ó‰ò¸ñ“ð0ïvíë5é¶æëãáÙݧÚ[×ÔßÐÄÍßÊ/ÈÑżÃ¶ÀÑ¿D¿(¿a¿ÀîÀ2µÃzÅyÇŸÉøËbÎøÐÓKÖþØÈÛÞUá#äßæ©é[ìï¾ñ_ôþö…ùü‡þcÃ^ › Òû6FMJC1!õ"Ò$ &o(4*ô+®-b/1¼2`4þ5›7+9¿:A<Ç=9?©@B_C«DÚEüFHêH´ISJÊJ KKâJaJŸI}HG8ECn@l=:K652Ç-)'$ Ù’W* $P¶ûh÷hó¾ïmìtéÜæ‘ä¨âá·ß¤ÞãÝKÝýÜÒÜÜÜ ÝaÝÙÝnÞßæß¼à°áªâ¼ãÓäôå#çKèé®êÜëíî)ï(ð ñ×ñ|òó[ó…óyó2ó«òâñÎðxïÏíäëªé4çzä’áxÞFÛÿ×·Ô{Ñ_ÎhË´È>Æ"ÄYÂøÀõ¿[¿'¿P¿Þ¿»ÀñÁdÃ"ÅÇ6É}ËîÍrÐÓ¾Õ{Ø;ÛÞÌà”ã[æéØëŒî7ñáówö ù“ûþ‡îL¤è 2 _•°ÑÞèéßÒ¹ ™"u$G&(Ü)›+Z- /À0f24®5H7à8m:ø;y=ð>e@ÄA!CgD EÅFÎG¾HŽI5J´JKKñJ{JÉI¹HZG˜EyCó@ >¾: 73«.*%% ßœ[. >›ü;ø.ôpðíê[çåãTáõßÙÞÞiÝ ÝÚÜØÜÝOÝÂÝPÞöÞ¾ßà€á{â‚ãžä¹åçæèDérê¢ëÇìæí÷îôïßð­ñ_òèòLó}ó~ó=óÌòò ñ·ï'îDìê¯çå"âßæÛŸØ\ÕÒ÷ÎúË5ɵƆĬÂ7Á"Às¿-¿B¿Á¿‰À²ÁÃËĬÆÌÈ ËrÍøÏ‹Ò>Õð׳Ú{ÝAà ãÐå”èPëî¶ðZóùõŒøû—ý xØ-} º ù #Kfx…‚‚m] ;"$ì%¼'ƒ)D+-´.n02½3]5ø68 :ª;-=¨>@AÛB*D`EF—G’HdIJJòJKõJ›JëIöH¢GóEêCsA£>g;Ë7Ö3‡/ñ*&!å¥a3 2ýùõô&ñ¶í™êÛçtådã¥á8à ß-Þ‡ÝÝãÜØÜùÜ@Ý«Ý/ÞÜÞŽßnàIáMâMãeäƒåªæ×çé6êfëŽì­í¿îÄï±ð„ñ<òÍò:óuó~óMóâò1ò<ñþïwî¤ìŒê+è‹åµâ­ß…ÜCÙýչҒό̻É/ÇëÄÃwÁUÀŽ¿7¿8¿¤¿^ÀvÁÎÂuÄLÆ_ÈšÊùÌxÏ Ò´Ôm×(ÚñܸßâIåèÊê~í2ð×òwõ ø˜úýÿ`¼ O … ºÞý!ûß!»#”%_',)ë*¬,b.0¿1k35¬6=8Ó9[;ã<[>Ô?7AšBæC&ERFeG`H=IòI…JãJKK«JJ'IéGOFQDøA3?<‡8Ÿ4g0Ù+'"ë¬l5 %jþîùÀõäñ^î3ë_èëåÇãúá|àDßWÞ¦Ý-ÝëÜØÜðÜ4Ý‘ÝÞ²Þqß<à#áâã-äJåpæ›çÉèþé%ëWìqí‹î‘ï€ð]ñò²ò%ójó|ó[óõòYòjñBðÄîíøê¡èæAãHà#ÝäÙ¡ÖZÓ,Ð ÍBÊ«ÇWÅaýÁ‰À°¿A¿6¿‡¿7À:Á‰ÂÄñÅòÇ+Ê€ÌüÎŒÑ.ÔçÖÙkÜ*ß÷á¾äçCêöì¬ïUòóôŽ÷úœüÿ„íE•ß  Ms“¬·½º®œ€!_#6%'Ñ(–*R, .À/j13¶4Y6î7…9;–<>ˆ?ó@UB¢CêDF2G/HIÐIiJÑJ KKÂJ1J\I*H£F¼DqBÄ?³<;9m5;1Æ,( #ñ³v8 VÿÌúö¢ò ïÎëëècæ.äTâÂàßƒÞÆÝBÝùÜÙÜìÜ$ÝÝþÝ•ÞIßàòàèáæâøãå5æ`çŽè½éîêì<íSî[ïTð-ñùñòóWó€ó]óóuòžñ|ðï^í^ë锿ÒãÜàÁ݇ÚC×ýÓÉгÍÑÊ$È̟üÀÖ¿R¿1¿t¿ÀÁCÂÍÃ’ÅÇ»É ÌÎ Ñ«Ó^ÖÙÜÛ¤Þká3äùæ¶éuì"ïÓñpô ÷ùüþ tÐ%i « Þ+CRYWL=!#Ö$¯&v(=*þ+³-l/1Ã2i46¡719Ã:G<Ê==?¬@BbC©DÚEùFÿGåH­IKJÀJÿJ KÎJVJ…InHòF EìBL@V=ì9162¨-ø($ö¸ƒ: C®û^÷góºïoìvéßæ›ä­âá½ß²ÞêÝ[ÝÝßÜæÜÝlÝäÝvÞ'ßëßÈà¸á²âÃãÚäúå)çNè„é²êÚëíî(ï$ðñÍñvòöòPóvóeó ó•òÌñ´ð^ï²íÈëŒéç\äsá[Þ+ÛâסÔfÑKÎ]˦È:ÆÄ\ÂøÀÀc¿6¿_¿ð¿ÏÀÂ}Ã7Å)ÇLÉ–ËΊÐ*ÓÖÕ’ØQÛÞßà¬ãkæ2éèë¡îJñðó‰öù¢û!þ•û_­ü 8 sœÁÙëõóìÚÄ £"$P&(ä)¦+_-/Å0o24µ5N7æ8q:ü;|=ô>f@ÇA"CfD¡E¿FÍG¸H‡I-J«JôJ KÝJnJµI¦HCGE^CØ@ë=¢:í6é2Š.ç)%ôÄ…H 2‘ü5ø)ômðíêaçå ã]áüßæÞ ÞxÝÝæÜäÜ ÝZÝÌÝYÞßÆßšà‡áƒâ‹ã£äÁåëæèGéuê£ëÆìéíïîöïÔð«ñRòâò<óróhó2ó°òöñîð¡ï î'ìÿé“çæäâõÞÊÛ‡ØCÕÒæÎéË+É®ÆÄ¯Â8Á)À~¿8¿T¿Ï¿žÀÅÁ.ÃàÄÄÆâÈ!ËŒÍ Ð¦ÒRÕØËÚŽÝWà ããå¨èaëîÅðmó öœø&û¤ý…æ<‡ Ë /Xp†ŽŠ{d H" $ø%Â'Ž)M+ -¿.r02Ä3b5ÿ6–8$:®;1=«>@„AÜB(DcE‰F™G‰HaI J”JæJ KåJ‹JÚIßHGÛEÐCZA†>I;¯7µ3n/Ð*ÿ%õ ÊN $uýùîô*ñ²í¡êÛç}åhã±á=àß4Þ’Ý%ÝíÜâÜÝJݶÝ:ÞäÞ›ßtàUáSâTãmä‰å®æÜç é;êfëì¬í¿î¿ï­ð~ñ4òÄò+ójóló<óÎòò#ñçïZî‰ìqê èrå“â•ßfÜ-ÙàÕ©Ò{Ï}Ì²É ÇïÄþÂÁVÀ›¿A¿G¿³¿qÀˆÁç†ÄgÆsȳÊÍ“ÏÒÑÔ~×AÚÝÏß’â_åèÝê“í?ðìò…õø¨ú(ý¡ÿ rÅ U ™ Áî -', ç!Æ#›%j'3)ö*³,j.0Ê1m35¨6J8Õ9a;åÒ?>A˜BæC(ELFeG[H5IïIzJÙJKòJ›JJIÕG5F;DÙA?î;k84I0»+õ&ó!Ñ•U" \þéù¸õåñ[î5ëfèìåÓãÿá…àQß]Þ´Ý5ÝúÜàÜÝ8Ý¢Ý Þ¿Þ{ßCà-áâ%ã2äSåsæ¡çÏèüé,ëTìtíˆîï~ðTñò¦òóZóoóFóæò>òXñ#ð­îäìÛê…èñå(ã%àÝËÙ„ÖGÓÐÍ8ÊÇVÅXÃÇÁ‰Àº¿M¿A¿›¿HÀMÁŸÂ2ÄÆ ÈAʘÌÏ¡ÑJÔùÖ¸Ù|Ü@ßâÏä—çSê í¾ïgòõŸ÷(ú¯ü$ÿ–ùV¡î ! ]}£´Ä˼£!h#@%'Ù(ž*],.Ê/r1 3¼4b6ó7Š9;›<>?ô@VB¦CçDF*G/H IÊI`JÈJüJùJ¯J"JFIH‹F¢DXB¥?–<9M51§,ä'ò"Ó›^% IÿÃú‰öžò ïÐëíègæ6äXâÍà‰ßŽÞÐÝMÝÝãÜùÜ-ÝŒÝÞžÞVßàÿàíáñâýãå<æcç•èÁéðêì9íTîYïNð+ñìñ‹òóPójóRóøòaòˆñaðùî@íAëüèvæ±ãÁà¡ÝoÚ'×æÓ´Ð£ÍÁÊȟÿÀá¿Y¿B¿‚¿#ÀÁZÂâéŧÇÏÉ&Ì”Î%ÑÃÓtÖ0ÙðÛ»Þ€áHä çÉé‡ì6ïâñ„ô÷©ù4ü©þ„Ý3x · ì9N_ccWG-! #å$µ&‚(F*,À-q/"1É2o4 6§799Å:N<Ì=A?±@BeC¨DÚE÷FúGàH§IDJµJóJüJ¾JEJqIWHÜFEÍB4@4=Ð96ö1‡-Ü(ê#פc- 5¥ûX÷aó¹ïmì|éáæ¡äµâáÇß¾ÞðÝiÝ ÝíÜðÜ"ÝyÝíÝ‚Þ/ß÷ßÏàÂá¹âÎãÛäæ%ç[èƒé¶êÞëíî'ïðñÃñoòêòEódóZó óƒò³ñžðBï—í«ëméùæ<äWá=ÞÛÊ׈ÔRÑ9ÎNËœÈ2ÆÄ[ÂþÀÀn¿B¿o¿ÀäÀ“ÃNÅ@ÇeÉ­ËΡÐAÓïÕ¥ØkÛ-Þùà½ã„æAéì°î]ñô›ö,ù¶û-þ§ l¾ H ~«Ëéõý÷åÏ ¯"‡$[&((í)°+e-/Í0v24¸5Y7è8y:<~=ý>b@ÏA ChD E»FÍG°H…I"J¢JìJùJÒJ[J¤IŽH1G`EIC·@Ñ=:Ñ6È2m.Ç)ç$تm1 ý'‚ü1øôrð í ê_ç åãcáàïÞÞ„ÝÝóÜíÜÝfÝÖÝdÞ ßÍߨà‹áâŽã®äÆåîæèFé|ê¡ëÊìäíñîðïÓðŸñNòÑò5ó`óZóóœòßñÕð‰ïìí ìàétçÇäèáØÞ¯ÛlØ*ÕðÑÏÎÞËɧÆ|Ä®Â:Á1À†¿E¿b¿ß¿³ÀØÁGÃôÄ߯õÈ>ËžÍ)кÒjÕØàÚ¦Ýkà5ãøå»èuë-îØðóö­ø7û³ý,”ôM• Ú @a€›œ•†o Q",$&Î'”)X+-È.y0#2Ë3j57›8+:´;5=¯>@…AÞB)DcE…F—G…H[IJŠJÞJùJÛJvJÉIÌHrGÇE°CBAe>-;7˜3J/µ*ß%Ø °q< þmýùìô!ñµíŸêßçƒånã¹áGà"ßBÞ™Ý4ÝôÜòÜ ÝYݽÝIÞêÞ¨ßzàbáVâbãoä’å´æàçé>êgë‘ìªí½î½ï¤ð|ñ'ò½òóZó^ó*ó¸òò ñÌïAîiìTêéçUåsâwßHÜÙÊÕÒhÏnÌ¡ÉÇãÄÃÁ^À£¿L¿Y¿À¿‰À—ÁþÂÄ|ÆŽÈÇÊ*ͧÏ<ÒãÔ˜×WÚÝâ߬ânå4èíê¦íSðýò—õ/ø¹ú9ý²ÿ‚Õ& h ¡ Òû-2:2% õ!Î#§%r'>)+º,u.#0Ð1w35³6O8Ù9i;èÓ?DA–BëC$ENFaGYH0IåItJÍJùJâJJîII»GFDÀAú>Ó;I8b4(0›+×&Ó!¶x@ ô Pþßù³õÞñ[î5ëièñåØãâà[ßgÞ½ÝBÝÝñÜÝJݨÝ,ÞËÞßQà4á'â,ã;äWå{æ¦çÒèê,ëWìsíˆî‰ïyðQñò¡ò óPó^ó5óÒò(òAñ ðîÈì¼êfèÔåã àêÜ®ÙmÖ.ÓÐÿÌ*Ê•ÇOÅWÃÇÁÀÿX¿P¿ª¿\ÀbÁ´ÂJÄÆ'ÈXʲÌ*ϺÑbÔ×ÑÙÜ\ßâçä©çfê!íÎïyòõ­÷=ú¼ü7ÿ¥e°û 2 gŽ«ÆÍØÍÈ®™!q#K%'ã(¨*d,.Ï/1"3Ê4a6ÿ7Œ9;ž<>?ù@VB©CåDF)G)HIÃI[JºJôJçJ£JJ2IHsF‰D:B‹?v<9)51ƒ,É'Õ"µ…Dôý<ÿ»úöœòïÑëïèjæ>ä^â×à‘ߘÞÙÝ[Ý ÝóÜÿÜ9Ý–ÝÞ¨Þ_ß%àáøáöâä å?ælç–èÅéóêì=íOîYïHð(ñãñƒòùòCó\ó>óèòKòqñHðÝî&í#ëÞèWæ‘ã¦àÝTÚ×ÎӠГͱÊȺŶÃÂÇÀã¿i¿K¿•¿2À-ÁmÂúÿżÇìÉ9̱Î8ÑÜÓŒÖEÙ ÜÎÞ–á^äçßéšìFïøñ”ô.÷¾ù>ü¾þ+“íBƒ Ê ô(@]joobQ8!#î$Á&‰(Q* ,É-y/+1Ð2v46¬7?9Ë:S<Ð=F?²@BfC¨DÚEõF÷GÜH¢I;J¬JéJîJ°J3J_IBHÅFíDµB@=±9ñ5Ô1k-·(Ò#¸ŠLó õ'šûP÷\ó¶ïmì}éãæ¨ä¸â!áÌßÉÞûÝqÝÝöÜüÜ.ÝÝùÝ‹Þ<ßýßÛàÇáÅâÏãéäæ3çXèéµêáëíî$ïðúðÂñbòäò4óZóFóùònò›ñ‡ð'ïzíëNéÚæä6á!ÞòÚ±×oÔ;Ñ(Î>Ë“È)ÆÄ]ÂþÀÀv¿P¿¿À÷À+«ÃcÅYÇ{ÉÆË5ιÐYÓÖ¿ØÛDÞáÐã›æRéìÁîsñô¬ö?ùÄûAþ³zÌ U ‹¹Ùô  ÿõÕ ¼"’$e&1(÷)¶+s-%/Õ02#4Å5[7ó8|:<…=ü>m@ËA$CiDEÀFÄG³HyI J˜JàJíJÂJKJI|HGLE+Cœ@³=`:±6¨2J.¨)È$»Sñ î{ü#øôhðí êfçåãiáàôÞ$ÞŠÝ'ÝþÜ÷Ü%ÝpÝßÝqÞßÛß«àœáâžã­äÒåòæ$èKé~ê¥ëËìãíñîéïÓð—ñFòÊò%óVóIó ó‰òÈñ¾ðnïÔííëÆéRç«äÇá¼ÞÛSØÕÜѼÎÎËÉŸÆvÄ®Â=Á7ÀŽ¿R¿p¿ð¿ÆÀìÁ[à ÅöÆÉSË»Í;ÐÙÒ~Õ8ØöÚ¼ÝàJã æÐè‰ë?îìð’ó+öÁøEûÈý9¤[£ ê Pmœ©¦£| ["6$ &Ö'¡)_+-Ñ.0,2Ñ3s5 7¤8/:»;8=¶>@ŒAÜB.D^E‹FŒG‰HOIJJÕJìJÏJcJºI³H`G­E˜C$AG>;m7z3'/–*½%¼ ’Zô æ\ýüøáô!ñ°í êâç…åvã¼áRà)ßKÞ¦Ý:ÝÝûÜÝ`ÝËÝNÞøÞ¯ß„àkáaâfã{ä“徿âçé<ênëì¯í¹î»ï¢ðsñ"ò²òóMóNóó¦òïñöð²ï$îQì1êÑç2åYâVß-ÜöذÕzÒVÏ\Ì—ÉÇàÄþ‚ÁbÀ«¿W¿f¿Ó¿˜À¯Á÷đƧÈßÊBÍ¿ÏTÒúÔ±×mÚ2Ýùß¼âˆåCèë¶íið ó¬õ@øÈúLý¾ÿ-Žå5 t ³ Þ"9?H:5 "Ö#²%}'F)+Å,{.-0Ø13 5¼6R8â9l;îØ?EAœBçC(EJFaGSH-IßIkJÄJìJÔJJÙIïH£G FD¥AÞ>³;,8@4 0{+¹&·!˜c$ø âøFþÒù®õ×ñZî6ëièøåÙãâ”àcßsÞÅÝNÝ ÝûÜÝTݲÝ8ÞÑÞßUàAá,â5ãBä_倿«çÖèê/ëWìtí†î‡ïvðJñò—òóAóQó"ó¿òò)ñòïuî®ìŸêHè¸åçâîßÎÜ“ÙUÖÓòÏìÌÊŒÇGÅXÃÇÁ”ÀÌ¿a¿a¿¶¿pÀtÁÉÂaÄ3Æ=ÈoÊËÌAÏÓÑxÔ&×éÙ£Üsß1âþä»ç}ê0íãïŠò(õÁ÷IúÒüAÿºw¾ B s›»ÌàÝÞξž!€#S%$'í(±*m,(.Ö/‡1*3Ï4k68•9;¥<>•?ø@[B¦CéDF)G%HI½IPJµJæJÜJ‘JJIìG[FnD$Bi?]<Ü85Þ0f,«'³"žf-ý Ýð,ÿ°úzö’òïÍëôèmæ@ähâÜàœß ÞäÝbÝÝüÜ ÝFÝžÝÞ³Þhß1àáÿáÿâä&åFæpç›èÉéôêì;íQîUïFð!ñÝñzòìò:óKó1óÐò:òWñ3ðÁî íë¿è:æsã†àhÝ4Ú÷Ö´ÓŽÐ~ͦÊȳŴÃÂÉÀï¿n¿\¿¡¿IÀ:Á‡Â ÄÛÅÒÇÊRÌÆÎSÑñÓ¥Ö[ÙÜåÞ«ásä5çòé¬ì]ïò©ô=÷ÏùPüÍþ<¢ýN” Õ 3Niv|wrYE!#ù$Ë&’(\*,Ò-‚/11Û2|46´7C9Ô:T<×=F?·@BfCªD×EöFðGÜH–I8JŸJàJÞJ¥JJPI*H®FÔDšB÷?ü<‘9Ò5·1H-Ÿ(­# l5Ý åûK÷Róµïmì|éëæ¨äÄâ%áÙßÐÞÞ€Ý ÝÝÝ8ÝŽÝÞ—ÞBß àâàÑáÌâÙãíäæ1çeèˆé¿êßëíî!ïðõðºñYòÚò(óJó6óæòWò‰ñjð ïaímë6é·æäáÞÓÚ—×YÔ&ÑÎ2˃È%ÆÄ[ÂÁÀ‡¿U¿”¿À ÁA½Ã}ÅmÇ”ÉÞËJÎÔÐoÓÖר”Û\Þ"áçã­æké$ì×îñ&ô¾öQùÒûTþÀ.…Þ! g –Èä ûä Å"$o&:(*Á+y-0/Û0‡2-4Æ5f7ô8…: <Š=þ>p@ÌA&CiDœE¿F¾G°HrIJJÔJâJ²J;J{IiHûF8EC‚@•=B:“6Š2-.Š)ª$ t:Ý ßnüøôið íêeçåãtáàß+Þ–Ý3ÝÝÝ+Ý}ÝêÝwÞ#ßßß¹à ášâ£ã¸äÒåÿæ èVé{ê©ëÈìåííîæïÌð‘ñ=òÁòóIó8óùòwò¯ñ©ðOï»íÏë¨é5çä¨á¢ÞpÛ;ØöÔÇѪοËÉ—ÆtĬÂAÁ=À™¿^¿€¿ÀÙÀÂpÃ#Å Ç(ÉjËÒÍSÐîÒ—ÕLØÛÎÝ›à\ã#æâèœëSîûð¥ó;öÒøVû×ýI´gµ ñ .W~˜¨³²¬›† e"B$&â'§)i+%-Ø.‰032Ø3x57§85:À;<=¸>&@ŠAáB*DaE„FG€HMIùIzJÆJãJ½JVJ¥I HKG’ECA/>í:S7W3 /u*¥%œ }> à ØõVýïøàôñ±í¡êçç‰å}ãÆáXà5ßUÞ®ÝHÝ ÝÝ#ÝjÝ×ÝYÞߺߌàtágâoã€äœå¿æìçéHêië”ìªí¸î·ïžðlñò§ò ó=ó?óó•òÖñßð–ï î1ìê±çå;â8ßÜÙØšÕ_ÒHÏHÌÉ ÇÚÄþÂ…ÁgÀµ¿c¿r¿è¿¥ÀÈÁ#ÃÌĪƼÈ÷Ê[ÍÓÏoÒÕÊ×ÚLÝ àØâ–å[èëÉí{ðó¾õPøÙúZýÐÿ<žóB ‚ À é+EMNM:' "ã#º%‡'Q)+Ð,.70à1…3(5Á6Y8ç9q;ôß?CAžBêC%EJF[GQH%IÙI`J»JÞJÈJmJÉIÚHŽGïEëCŠAÁ>—; 8#4é/_+š&›!~Iå Ñé<þÉù©õÔñYî6ëmèüåáãâ›ànß}ÞÎÝYÝÝÝÝXÝÃÝ<ÞáÞ“ßdàEá7â<ãHäe凿¬çÞèê2ëYìqí‡î‚ïsðDñøñŽòôò7ó<óó¨òòñÛïYî‘ìƒê(èœåÆâÔß­Ü}Ù8ÖÓÚÏàÌ Ê†Ç@ÅWÃÇÁœÀÑ¿o¿k¿Ê¿ÀŠÁÝÂwÄJÆTȆÊâÌXÏëÑŒÔ@×úٿ܃ßLâ åÓçŽêDíöïšò<õÐ÷\úÞüWÿÁ*}Ñ O ¦É×ìéèÛǪ!Š#\%/'÷(¹*x,..ß/Ž143Ô4t68œ9";©—?þ@ZB©CçDF)GHI³IKJ©JÛJÎJ‚JîI IÔGFFSDBP?<<Â8í4À0I,ˆ'"|Rç Íà ÿ¨úpö”òïÑëõèræHänâäà§ß§ÞòÝlÝ#ÝÝÝPݪÝ%Þ¿Þqß8àáâ ãä+åNævçèÏéõêì<íNîSïBðñ×ñoòäò(ó?óóÁò"ò?ñð¤îñìåê¨èæ^ãbàLÝÚÚÖ¡ÓvÐpÍ—ÊÿǭŰÃÂÏÀõ¿{¿i¿³¿WÀSÁ˜Â"ÄñÅçÇÊhÌßÎjÑ ÔºÖsÙ5ÜûÞ¾á‰äFç ê½ìqïòºôO÷ßùbüÛþL° ]¢ á >\t‚‰ƒ}cP!*#%Ó&ž(a*",Ö-/71â2„4!6¹7K9×:[<Ø=M?·@BgC¨DØEðFòGÑH”I+J™JÓJÓJ’JJ;IHšF¸DBÛ?ÜÀ¨¿d¿•¿ÀïÀ†Ã;Å"Ç@ɃËêÍlÐÓ¯ÕeØ$ÛçÝ®àsã7æ÷è°ëgîñ¹óLöäøgûæý]¾(qÇ þ <d‹¥¶¾Á´«Œ t"I$ &ë'±)s+,-ã.0<2ß357®8=:Â;D=º>)@AâB+D_E„F‹GzHIIïIqJ»JÖJ­JGJIŽH.G~E`Cî@ >Ð:1773í.S*†% ^(ñÎ ÂëDýìøÕôñ¯í¡êêçå‚ãÎáaà=ß`Þ¹ÝQÝÝÝ2ÝtÝàÝfÞßÇß”à}ápâxã†ä¥åÅæïçéDêrëì®íµîµï˜ðfñòœòýò0ó,óöòzòÄñÅð{ïòíìùé’çòäâß÷۾؀ÕKÒ1Ï;Ì~ÉÇÓÄÿ„ÁoÀÀ¿m¿†¿ò¿ÀÀÖÁ?ÃßÄÅÆÐÈËnÍòÏÒ*ÕÞלÚ]Ý%àéâ®åpè(ëâíŠð5óÌõeøèúnýÝÿOªK — É û ;PY]TH0 "î#Ä%“'X)+Õ,Œ.>0ç13-5É6^8ï9t;ú

    á?GA¡BèC&EIFZGJH#IÐIXJ²JÎJ»J[J·IÄHxGÕEÑClA¤>u;î74Í/;+}&}!`/÷Ï ¿Ù-þÂùŸõÒñVî8ëoèææã â¥àv߇ÞÙÝdÝ!ÝÝ'ÝgÝÊÝJÞéÞŸßkàQá>âFãPäkåŽæ³çàè ê5ëWìuí‚î‚ïmð=ñòñòìò%ó3óþò˜òæñúð¿ï?îsìbê èyåªâ±ßÜ`Ù ÖëÒÆÏÏÌþÉ}Ç:ÅSÃÌÁœÀß¿v¿~¿Ö¿–ÀœÁöÂŒÄdÆhȤÊ÷ÌtÏÒ¥ÔZ×Ú×Ü™ßaâ&ååç¤êXí ð¯òLõã÷núîühÿÓ8à _ Ž´Ôèóüïêж!”#h%:'ÿ(Ã*€,8.è/–193ß4x68Ÿ9);¬<(>—?AZB­CäDF#GHùH¯I?J¢JÍJÀJsJÙIúH¼G+F>DåA8?<¤8Ê4¢0&,l'|"a7úÓ ¸ÏÿšúköŒòïÐëöèxæKäwâêà°ß´Þ÷Ý{Ý*ÝÝ!ÝZݵÝ2ÞÇÞ}ßCà!áâãä1åUæyç¤èÐéúêì<íOîMïCðñÔñbòÚòó/ó ó«òò'ñðŠîÑìÍêèÿå5ãKà+ÝÚÀÖŠÓbÐ^ÍŠÊóǧŭÃÂÑÀÀ¿z¿¿¿lÀgÁ«Â>ÄÆÈ2ʃÌ÷΂Ñ!ÔÒÖ‰ÙOÜߨá›ä^çêÒì‚ï,òÉôf÷ëùvüêþ\Àk´ í #Il~“‘’†o\!2#%Ü&ª(i**,à-•/A1è24%6Ã7O9Ý:`<Ü=S?¹@BjC§DÙEîFíGÍHI"JJÈJÃJ…JûI(IÿGF¡D`BÃ?º*@AåB*DaE€F‰GwHBIêIgJ¯JÍJœJ6J}IwHGcEECÓ@ï=°:73Ð.5*e%e ?Ú¹ °Û:ýáøÑôñ°í¡êïç‘åŠãÔákàFßhÞÆÝYÝ%ÝÝ:ÝÝêÝnÞßÍߟà‡áwâãä§åÏæñçéIêrë‘ì®í²î³ï’ðañ ò“òòòó#óÝòlò«ñ«ðgïÐíüëÕéxçÑäâùÞÜÛ ØkÕ1Ò"Ï'ÌvÉõÆÒÄû‰ÁtÀÇ¿|¿’¿ÀÏÀðÁOÃýÄÕÆïÈ'Ë‹ÍМÒBÕô×´ÚqÝ>àþâÃå…è:ë÷íðGóÝõvøùú}ýðÿY¿a ¡ Ø .H]fgcP@ "ý#Ì%ž'a)&+Ý,˜.C0ò1”385Í6i8ð9€;úã?KA BëC%EGFXGGHIÈIQJ£JÇJªJLJ¤I±HaG¾EµCRAƒ>];É7æ3¦/ +Z&b!Bݹ ­È"þµùšõÌñUî7ërèæîã$â¯àßÞåÝmÝ,ÝÝ3ÝrÝÕÝSÞõÞ§ßxàUáJâKãZäp啿·çæè ê7ëZìuí€îïhð8ñëñxòßòó!óíò…òÐñâð¥ï#îWìFêíçYåŽâßxÜ>Ù ÖÎҸϹÌõÉpÇ7ÅQÃÌÁ¤Àã¿…¿Š¿è¿¨À¯Á äÄzƃȸÊÍŠÏÒ¾Ôo×*ÚíÜ®ßyâ7åþç³êqíðÄò_õó÷€úÿüxÿãHî1 k ›ÄàõÿôÛÃ!›#t%B' )Í*‰,?.ó/œ1C3ä4€68¨9+;µ<'> ?A]B®CãDF!GHõH¨I6J˜JÀJ´JaJÉIãH¨GF DÎA?ý;„8«4€0,J'_"Cä» §¾ÿ‘úbö‡òþîÐëøèzæSä{âöà·ß»ÞÞ€Ý<ÝÝ0ÝcÝÁÝ;ÞÓÞ…ßLà,áâãä=åXæ€ç©èÒéþêì>íJîQï5ðñÃñaòÈòóóþò–òùññçïrî²ì±êcèÞåã*àÝäÙ¦ÖsÓLÐNÍ{ÊéÇ Å«ÃÂÙÀÀ’¿‚¿Ô¿}ÀzÁÃÂPÄÆÈIÊœÌÏšÑ<ÔæÖ¥ÙaÜ(ßíá°äsç0êåì—ï=òßôs÷ú‚üÿiÓ'}À þ /Ww™¤™“~a!C#%æ&µ(r*5,é-/J1ò2‘426Â7[9ß:h<à=U?¼@BiCªDÕEîFéGÊH‡IJ†JºJ¸JsJëIIêGeFŠDCB¥?œ<69r5S1í,:(Y#C!æÀ¡ ³îÿoû0÷Dó¬ïkìƒéôæºä×â<áôßêÞ(Þ˜ÝGÝÝ+ÝWÝ¯Ý Þ·Þ_ß&àþàìáãâïãåæHçkè›éÀêçëíîïðãð§ñ=òºòóóó­òòBñð¿î íëÚè[æ¦ã»à¬ÝÚH×ÔçÐßÍËcÈÆÄ_ Á)À£¿€¿À¿VÀFÁ€ÂÄÃÅ´ÇÞÉ&Ì•ÎÑ·ÓeÖÙÛÛÞdá)äèæ«é\ìï·ñaôïö‡ùü…þóY·P Âí'6=9/!!æ"»$&\(*à+‘-J/÷0œ2D4Ý5w7 9“:<—= ?y@ÓA,CfD¡E±F¾G›HgIýIvJ¯J¼J…JJDI%H·FéD¼B+@:=å926(2É--)J$Jò»£ ¥ÚMüþ÷ ôXðí êrç%å/ãá/àßJÞ²ÝVÝ$Ý(ÝMÝœÝ Þ•ÞAßþßÔà¼á³â»ãËäëå ç4è_é…ê®ëÍìáíçîßï¹ð‚ñ ò¢òôòóóÃò5ònñ[ðïaí}ëIéÚæ.äNáFÞÛç×®Ô‚ÑtÎŒËåÈ{ÆiĨÂMÁMÀ¸¿‚¿®¿5ÀÁ>µÃhÅSÇpÉ´ËΠÐ3ÓãÕØUÛÞÞàšãgæéÜëŽî6ñÚóvöùûþ~áB”à  U¦¾ÒÕÚÏ¿§ ‡"`$5&ÿ'Å)†+=-õ.¡0L2ñ35'7»8F:Î;N=Â>1@AæB-D^E‚FƒGvH:IåI\J¨J»J‘J$JiIdHGIE.C±@Ñ=“:í6ú2¦.*@%G #ó¡ žË+ý×øÇôñ¬í¢êðç•åãÚáràQßoÞÑÝcÝ0Ý$ÝEÝÝñÝÞßÙߪàŠá†âƒã˜ä®åÔæ÷ç&éJêtë”ì«íµî­ïð[ñòŠòäòó óÑòTò•ñ•ðGï·íÛëºéUç´äÞáÜÞ¾ÛƒØQÕÒ ÏÌdÉðÆÉÄýˆÁ}ÀÌ¿‹¿ž¿ÀâÀÂiÃÅôÆÉ@Ë¥ÍжÒYÕØÊÚÝOàãØå™èTëî¶ðUóöõ‚øûŠýhÐq ­ ê <Wirun^I *"$Ú%¥'m)/+è, .M0ú13>5Ö6l8û9;=w>é?LA¤BìC%EEFYG?HI¿IKJ˜J¼J˜J@JIšHNG EŸC1Ah>8;­7¿3‰/ý*:&@!'÷Ç¡ –¼þ®ùõÈñQî6ëtèæòã.â³à‰ß˜ÞðÝuÝ:Ý#Ý>Ý~ÝÞÝbÞûÞ´ßà`áTâPãdäwåšæ¾çéèê9ë[ìtíî~ïcð2ñãñmòÖò óóÞòmò¾ñÇðŒïî:ì%êÑç5åqâpßZÜ#ÙïչҢϧÌèÉfÇ-ÅTÃÈÁ­Àé¿‘¿—¿ú¿ºÀÃÁ"ùēƜÈÐÊ-Í¡Ï7ÒÔÔŠ×@ÚÝÊߊâSåèÍêí/ðÔòtõø“úý‰ÿõW®þ= ~ ¦Ôì  ÿêÊ!«#{%P')Û*,K.ú/¦1L3ì4‡68«97;´<2> ?AaB«CéD F"GHïH¢I1J‰J¸J¢JQJºIÉH–G÷ED³Aô>á;_8Œ4^0æ+)'>"'üË  •©úþ‚ú]ö}òýîÌëüè|æWäƒâúàÂßÄÞÞ‹ÝDÝ&Ý9ÝoÝÌÝDÞáÞŒßZà2á#âã,ä@åaæ…ç®èÖéë!ì?íJîMï5ð ñÀñTòÁòóóéò…òáñúðÌïUî–ìêFè¼åùâ àñÜÇÙŠÖXÓ:Ð7ÍoÊÝǘũÃÂÜÀ Àœ¿‘¿â¿‘ÀÁÙÂhÄ4Æ5ÈbʵÌ'Ï·ÑPÔ×¹Ù}Ü>ßâÉä‡çHêøì¬ïSòðôˆ÷ú–üÿ~à;‹Ï =f†©«¬›l!N#"%ô&»(€*<,õ-¤/U1ö2ž446Ð7]9é:j<ç=X?Á@BkC«DÔEîFäGÈH~IJ}J°J¨JgJÔIIÑGNFmD)B†?|<9P521Ê,(6#)ÿΤ Ÿßÿ`û)÷:óªïfì…éöæ½äÛâDáûßôÞ/Þ¥ÝOÝ*Ý5ÝaÝ»Ý+ÞÀÞkß.à áñáïâ÷ãå.æFçvè›éÆêéëíîï ðáðœñ:ò«òøò óóò›òò,ñð¢îðì÷ê¼è<æ…ãàÝcÚ,×øÓÏÐÏÍñÊ[ÈÆÄ[ÂÁ,À¯¿¿Î¿iÀZÁ“ÂÄÕÅÑÇôÉ@Ì®Î3ÑÒÓ{Ö4ÙðÛ·ÞxáAäÿæ½éuì&ïÏñoô÷“ùü‘þfÊc œ Ðü6AJF>*!ñ"Æ$š&b()*å+ž-R/þ0§2J4å5€79š:!<›=?{@ØA+ClDšE¶FµGšH_I÷IjJ§J«JyJôI/IH¡FÍD¢B@=Å962ª- )-$(Ó¥ ’Ì>üö÷þóUð í êuç'å8ã‘á8à%ßSÞ¿Ý]Ý3Ý.Ý[Ý£ÝÞ ÞJßàÜàÅá¼âÁãÕäîåç8èdéˆê²ëÊìäíäîÝïµðyñò˜òèò óøò®ò#òTñHðäîNíVë/黿 ä2á$ÞÛËוÔmÑ_ÎËÖÈuÆaĪÂMÁWÀ¾¿“¿¸¿LÀ"ÁVÂÊÃ~ÅmdžÉÎË3ηÐNÓ÷Õ¬ØiÛ-Þñàµãvæ8éëë£îJñìó‰öùžûþ‹óQ¦í 1 `“²ÌÞãåÜÉ´ ‘"n$=& (Ñ)+K-ü.«0T2ù3•5.7Â8L:Ö;O=É>2@”AéB,D`EF‚GpH7IÝISJŸJ¬J„JJZIKHíF/EC–@²=r:Ð6Ô2Š.õ)#%' Ù¨Œ ŠºýÈøÄôñ¬íŸêòçšå“ãâáxàZßyÞÚÝnÝ8Ý/ÝQÝ•ÝÿÝ„Þ'ßãß±à–á‹âãä¹åÕæÿç'éQêuë–ìªí³î«ïŠðVñøñ‚òÖò óüò¿ò?ò€ñ}ð0ïšíÀë›é9ç“äÃá¼Þ¢ÛjØ4Õ ÒóÎÌUÉçÆÆÄøÂÁÀÙ¿’¿°¿(ÀõÀÂ{Ã*ÅÇÉ[˺Í9ÐÍÒpÕ(ØÞÚ¥Ýgà*ãòåªèkëîÈðkóö™øûŸý}Û2| ¿ ö "L`z~ziS 6"$å%¯'x)6+ö,¤.[0þ1¨3D5Þ6r8:‡;=~>ë?QA£BñC"EHFQGCHIÁI;J”JªJ’J'J„IH8G‡E„CAJ>;Š7£3d/ß*&!! ܮР‚ªþ¡ùˆõ¾ñRî2ëvè æôã7â¸à’ß¡ÞùÝ€ÝBÝ/ÝI݆ÝëÝhÞ ßºßàeá]âZãgäåæÅçíèê<ë]ìtíî{ï^ð.ñÚñfòÊòþòóÍòXòªñ¯ðuïëí ìê³çåQâTß=Ü ÙÖդҌϚÌ×É`Ç'ÅPÃÌÁ°Àô¿œ¿¥¿ ÀÌÀ×Á8ÃÎĬƱÈìÊBͽÏKÒïÔž×[ÚÝßߢâdå'èÞê–íBðèò…õø ú$ý–ÿe¿ R „ ¼Ûý ñØ!´#†%Z')á*œ,R.0®1S3ô4Ž6#8²9:;»<4>¤? AcB­CçDFGHçHžI&J‚JªJ•JDJ£I»HzGäEìC•AÚ>À;B8m4<0Æ+ '" ᲌ šéþzúQözòøîÍëüèæ\ä‡âáÆßÐÞÞ™ÝKÝ3ÝAÝ{ÝÖÝNÞéÞ•ßcà;á+â(ã2äIåeæŠç³èÚéë#ì>íIîLï1ðñ»ñHò¹òóòó×òtòÊñæð±ï<î{ìtê'èŸåÜâëß×ܪÙrÖFÓ!Ð*Í_ÊÓǔŦÃÂåÀÀª¿¿ò¿£À¡ÁîÂ~ÄLÆJÈ}ÊÊÌBÏËÑkÔ×ÒÙÜTßâÛäŸçXêí½ïhòþôž÷ú«üÿŽîL–ã  Qo•§µ¹µª“|!V#-%þ&Å(‰*G,ü-¯/Y13¡4?6Ó7d9í:s<è=^?Â@!BkC­DÑEìFâGÂHyIJpJ¦J›JXJÃIðHºG;FPDBe?`<÷8/51«,ø'# 三~ ŠÔÿSû÷8ó£ïhì…éøæÅäÝâOáÿßß8Þ­Ý[Ý5Ý?ÝnÝÃÝ5ÞÌÞqß>à áâóâäå.æRçwè¢éÇêìëíîïðÙð™ñ-ò£òêòóãòˆòïññóï…îÖìÛêœè æeã€àoÝIÚ×ÞӿзÍéÊLÈÿÅÄ\ÂÁ7Àµ¿¿Ü¿}ÀjÁ¬Â-ÄîÅéÇ Ê[ÌÄÎNÑçÓ–ÖHÙ ÜÊÞ‘áSäçÒéˆì:ïâñ€ô÷¡ù0ü¡þ|Ò*k ® Ý )@QSTG8!û"Ò$¢&o(.*ò+¥-\/1®2T4ê5‰79¢:&<Ÿ=?y@ÞA*CnDšE³F³G–HWIóI^JžJŸJeJèIIþG‰F´D†Bò?ü<¨9ð5è1ˆ-ë($ 躎x ‚¼1üð÷ôóVðíêsç/å;ã™áAà-ß^ÞÇÝiÝ;Ý<ÝcݲÝÞ¬ÞTßàçàÌáÅâÉãÛäöåç=ègéŒê²ëÍìáíäîÙï¯ðuñòòÛòýòêòšòò?ñ,ðÐî-í?ëéæñãáÞßÚ¶×}ÔVÑQÎlËÎÈkÆ_Ä©ÂOÁ^ÀÈ¿¿Ì¿XÀ8ÁjÂàÔŅÇÉçËKÎÐÐcÓ־؄Û@ÞáÊãŽæHéì³î_ñÿó˜ö(ù®û*þ›b³ý < qžÀØêðñæ×»  "s$J&(×)›+O-/³0[24œ557È8Q:Ü;S=Í>5@™AèB0D_E|F…GfH6IÑINJ‘J¢JtJJFI7HÕFEøBx@–=S:°6¸2g.Ö)% ì¾’v z§ý¿ø»ôñ¦í¤êñç¡å–ãìá}àeß‚ÞäÝzÝBÝ<ÝYÝ¢Ý ÞÞ1ßíߺà¡á’â–ã¦ä¼åÞæè)éVêtëšì©í²î©ï„ðOñóñtòÏòøòîò®ò*òlñbðïí¡ëéçsä©á›ÞŠÛJØ"ÕíÑæÎøËMÉÝÆÁÄøÂÁ„À俜¿Á¿5À Á'–Ã<Å!Ç4ÉsËÒÍQÐäÒ‰Õ=ØöÚ»Ý|àAãæÂèzë0î×ð€óö«ø1û¬ý%‰í?Œ Ë .Zoƒ‹‡v\ C"$î%º'€)B+ú,².]0 2¬3M5ä6y8:; =„>ì?UA¤BñC#EEFOG=H I¸I4JˆJŸJJJoIrHGuEcCÿ@(>ÿ:i7…3B/Á*ù%!ëÆ“x qšõý˜ù€õ¼ñMî6ëvèæúã<âÃà™ß­ÞÞÝLÝ9ÝTÝ’ÝôÝtÞßÅß“àrábâeãmä‡å¤æËçîèê<ë^ìwíyî{ïYð&ñÕñZò½òóòïò¾òCò•ñ—ðZïÓíìîé‘çýä1â8ßÜïØ½ÕŒÒyωÌÌÉUÇ"ÅNÃÍÁ¶Àù¿«¿¯¿ ÀÙÀñÁHÃéÄÀÆÊÈËZÍÕÏdÒÕ¹×kÚ7Ýîß½âxå;èóêªíSðüò•õ+ø²ú5ý¨ÿvÌ ] – Æì%*# â!½#”%a'()é*§,Y. 0µ1Z3ü4•6*8¸9?;Á<9>§?AaB³CãDFGHæH“I!JvJŸJ‡J3J’I§HeGÈEÖCtAÃ>œ;%8L40©+é&"íÆ›t n‡ÞþlúLötòôîÐëùè‡æ_äŽâ áÎßÚÞ Þ¡ÝVÝ=ÝMÝ…ÝßÝZÞðÞ¤ßiàEá3â/ã=äKåpæ‹çºèÛéë%ì=íKîDï1ðýð´ñ@ò­òæòõòÆò^ò¹ñÊðœï î_ìVê è€å¾âÎß»ÜÙ]Ö'ÓÐÍTÊÊNJŦÃÂëÀÀµ¿ª¿À´À´ÁÃ’ÄeÆaÈ”ÊäÌXÏåÑ‚Ô1×æÙªÜiß1âñä³çkê$íÏïyòõª÷6ú¸ü-ÿžÿY¨í ( Y‚¸¿Ç¿¶Ÿ…!a#6%'Ï(“*O,.¸/b1 3ª4E6Ù7k9ò:v<ï=_?Ç@ BoCªDÓEèFßG¼HtIJiJ˜JŽJFJ´IØHªGF;@—AíB-D_E|F}GiH)IÐI?J‹J“JfJñI1I%H½FþDÜB\@z=2:”6“2K.¸)ä$ïͦ{b g™ ý´ø·ôñ¥í¤êôç¤åžãðá‰àiߎÞìÝ…ÝLÝEÝeÝ«ÝÞ›Þ:ßößÅà§áœâœã­äÃåäæè.éXêwë›ì¥íµî¡ïƒðFñêñlòÂòêòÞò›òòUñKðþîcí‰ë^éýæYä„á†ÞfÛ7ØÕÜÑÑÎëË?ÉׯºÄùÂÁÀ꿬¿Í¿HÀÁ>ªÃSÅ9ÇLɉËìÍhÐüÒ ÕVØ ÛÒÝ’àUãæÕèëCîéð“ó#öÁø:ûÅý.úN› Ù <f{™—’h J"%$ö%Æ'‡)L+-º.g02¹3N5ñ6{8 :’; =ˆ>ò?SA«BíC"EGFIG;HIªI4JuJ›JlJJZI\H GVEPCÞ@>Þ:K7d3'/ž*Þ%æ Ó©_ b‡ëýŽùxõºñIî8ëxèæäAâÍàžß¸ÞÞ˜ÝWÝBÝaݘÝÞ~ÞßÏßàxálâkãtäŽå©æÎçöèê@ëaìqíîrïWð"ñÈñWò®òèòßòªò3ò}ñ‚ðBïµíçëÎéxçÝäâßÜÖØ£ÕxÒfÏ|Ì¿ÉLÇÅLÃÒÁ¹ÀÀ¯¿Å¿)ÀðÀÂ`ÃüÄÚÆÞÈËsÍéÏ~ÒÕÏ×…ÚHÝàÒâ‹åPè ë¸íkð ó¨õ=øÁúFýµÿ&…Ù+ g § Ðú*17,! í!È#›%l'0)ô*®,b.0¾1a35™638»9H;Ã<>>ª?AeB¯CèD FG HàHŽIJmJ’J}JJ…IHSG±E¹C_A >ƒ;8+4ÿ/‡+Ï&ã!Ó®€b YzÏþeúAösòòîÍëÿè‰æeä–âáÜßÞÞ/Þ§ÝfÝEÝXÝÝèÝfÞúÞ­ßqàPá8â=ã;ä[åmæ˜çºèáé ë"ìAíDîGï*ðùðªñ8ò¢òÙòæò´òNò ñ¶ð‚ïîEì8êîçaå¡â°ßŸÜsÙCÖÓüÏ ÍCÊÃLJŠÃÂêÀ"À½¿º¿ÀÈÀÆÁëÄvƀȤÊÍpÏùÑÔD×Ú¿ÜßEâåÇç€ê4íäï‰ò&õ¾÷AúÍü;ÿ¯ i³ÿ 1 j‹®ÀÎÐÍÀª!k#B%'Û(˜*Z, .¿/k13±4L6â7n9ú:x<õ=b?É@#BoCªDÓEåFÜG¹HkIJ[JJ€J7J£IÇHG FDØA1?"<»8ð4Ö0i,À'Ú"Ô®‡_V j¸ÿ;û÷(ó¢ïcì‹éûæÑäéâ^áàßLÞÂÝmÝLÝSÝ‚ÝÙÝHÞâÞ„ßOà áâãäå<æYç„è¤éÎêîëíîïÿïÑðˆñòŠòÕòàòÂòaòÈñäðÂïQî ìŸêfèßå.ãBà7ÝÚàֲӓЙÍÊÊ<ÈîÅýÃZÂ#Á@ÀÏ¿²¿ÀœÀ“ÁÓÂYÄÆÈ<ʇÌ÷ÎzÑÔÁÖyÙ4ÜùÞ¸á€ä;çüé­ì`ïò£ô@÷ÃùPüÁþ6˜òEŠ Æ ü FXjjn[O/!#æ$¶&(E*,º-j/1¿2]4þ57&9©:/<ª=?…@ÞA.CnD—E±F¬GŽHJIâIMJ†J‡JFJÆIóHÑG[F‚DRB¹?ÂßrÞÛÝ}ÝQÝNÝ{ÝÅÝ4ÞÀÞgß"àúàÜáÖâ×ãèäæ"çGèmé“ê¶ëÍìáíàîÏï«ðañòvòÄòâòÇòxòåññüï›îôì ëÐèfæ¯ãÙàÎݱÚ~×OÔ.Ñ(ÎU˳È`ÆVÄ©ÂWÁiÀß¿´¿ë¿yÀ`Á‘ ÄÁŲÇÎÉÌxÎÑ“Ó>ÖñجÛoÞ2áôã·æoé+ìÙî„ñ#ô¹öMùÌûMþ¸$}Ò Y Œ¹Ùó ýíÓ ²"‹$\&'(í)©+c-/Á0n2 4®5?7Õ8\:å;^=Ô>;@AêB0D]EyF|GaH'IÅI;J|JˆJWJßI IH¦FåDÄB=@_=:v6s2..”)Ë$ϵŒeK WŒûü¯ø«ôñ£í¦êöç©å£ãùáàtß–ÞøÝŽÝXÝNÝqݵÝÞ¤ÞDßàÍà±á¢â¦ã²äÊåëæ è3éZêzëšì¨í®î£ï{ðDñßñdò´òÝòÏò‡òò<ñ5ðãîIíkëDéÞæ;äháeÞOÛØïÔÅÑ¿ÎÛË6ÉÌÆ¸Ä÷”Á‘Àö¿´¿Þ¿XÀ0ÁR¿ÃiÅPÇdÉ¡ËÎÐÓºÕjØ%Ûçݨàlã.æèè¦ëQîñžó=öÊøSûÎýCª _§ ê Js† ¢¤œŒt U"0$&Ð'“)T+ -Ã.o02¾3W5ô6ƒ8:”;=‡>ø?VA­BîC#EDFFG9HýHªI$JqJˆJcJùIJIGHõF=E6CÁ@ñ=Á:+7D3/€*¼%Ë ¶ŽiI M{Ûýƒùrõ²ñKî5ë{èæäIâÓà©ßÀÞÞ£Ý`ÝOÝiÝ¥Ý ÞˆÞ%ßÚߣà…áqâtã|ä’岿ÑçûèêDë]ìxíxîrïRðñÅñGò§òÕòÕò•ò"òdñmð%ïžíÈë³éXçÁäõáþÞæÛ½Ø‰ÕeÒQÏk̳ÉBÇÅGÃ×Á»ÀÀ»¿Ò¿:ÀÁÂxÃÅïÆúÈ0ËŒÍЕÒ2ÕçךÚ_Ýàãâ¢åeèëÓíyðó»õJøØúRýÊÿ2”ë6 z ¯ â"5?A;* ÷!Ó#§%u'9)ÿ*³,p.0È1i3 5¢678Á9L;ȯ?AjB­CêDFG H×HŒI JeJ†JlJJoI~H9GšEžCAA…>c;ç7 4ß/h+¯&Å!¹lK EkÁþ[ú:ömòíîÏëýèŽæiäžâáäßèÞ7Þ´ÝmÝPÝcݘÝöÝnÞß¶ßzàYáBâBãEä^åvæœç¾èæéë'ì>íFîAï)ððð¦ñ-ò˜òËòØò£ò:òŒñŸðhïîí%ìêÎçFå€â•ßÜZÙ(ÖÓçÏùÌ6ʸǀŠÃÂðÀ+Àǿɿ!ÀØÀÝÁ,ÃÃÄŽÆ“ÈÁÊ͈ÏÒ²Ô]×ÚÒÜ–ß\âåßç‘êLíôïò8õÎ÷XúÕüSÿ·$qË F rž¶Ñ×ß×̵š!w#J%'à(¨*],.Â/x13º4R6è7u9;}<÷=h?Ê@(BmC¬DÑEâFÙG²HfI÷ISJƒJrJ'J‘I³HzGñED¾A?<˜8Ó4´0L,Ÿ'½"¸‘rED Y©ÿ2û÷$óœïfì‡éçÎäöâaáàßWÞÌÝzÝTÝ_ÝŒÝåÝSÞêÞßWà+áâãä%åAæ^ç‡èªéÏêïëíîïùïÌð‚ñòƒòÃòÕò±òMòµñÊð«ï6îƒì…êCèÆå ã&àÝøÙÅÖÓ|Ћ͹Ê3ÈçÅøÃ_Â#ÁKÀÖ¿Á¿À¯À¦ÁèÂoÄ2Æ-ÈSÊŸÌÏ”Ñ-ÔÜÖŒÙNÜ ßÐá”äQçêÂìrïò·ôN÷Úù[ü×þA«T™ Ô -SeuyukV=!#ï$Á&‰(N* ,Â-r/ 1Å2g46—7(9±:3<¯=?†@âA/CnD—E®F§GŠHDIÛICJ|JwJ;J¯IãH½G@FnD2BŸ?£A@›AðB-DaEtF{GYH%I¹I4JnJ}JFJÐI IùGFËD©B"@A=ó9V6U2 .{)§$´—tM8 Fzñü¤ø§ôûð¢í¤êüç«åªãâ–à~ß¡ÞÿÝœÝ_Ý]ÝwÝÃÝ&Þ¯ÞNß àÖàºá«â®ã¸äÔåéæè0éaê{ë˜ìªí«îŸïxð:ñÙñXòªòÍòÀòsòóñ&ñðËî-íNë'龿äHáIÞ1ÛØØÔ­Ñ°ÎÉË-ÉÂÆµÄö–ÁšÀý¿Ã¿ë¿jÀCÁgÂÔÀÅgÇ{É»ËΖÐ.ÓÐÕØ=ÛûÝ¿à‚ãAæé³ëlîñ·óKöÞøcûßýSºl¸ õ 0V‚’«¯°©– `"9$ &×'ž)[+-Ì.u0#2Á3c5ø6Œ8:Ÿ;=‘>ø?YA¬BðC"EAFEG3HúH IJdJ~JSJêI6I4HÚF)EC¥@Ö=Ÿ:7"3æ.b*%° —xN7 ;kÏý|ùhõ³ñDî8ë|èæ äLâÞà°ßÌÞÞ­ÝjÝZÝtݱÝÞ”Þ.ßäß®àŠá~âwã†ä˜å·æÖçéêIë^ìtí{îjïRðñ¿ñ;òŸòÅòÅò…ò òQñTð ïí®ë’é;ç¢ä×ááÞÊÛ¡ØrÕMÒ@ÏY̨É9ÇÅIÃÔÁÇÀÀ̿޿KÀÁ'ÂŽÃ(ÅÇÉHˤÍЩÒNÕû×´ÚtÝ4à÷â»åuè2ëàíð/óÍõ^øåúfýØÿB¤øF ˆ ¾ î3=OJG7 "Ý#±%~'E)+¾,w."0Ï1r35¬688Í9L;г?AmB­CìDFGHÖH€IJWJ|J^JJ^IjH"G„E‚C'Ag>F;Æ7ì3¿/F+”&¤!vS5 4V¸þLú6öeòîîÌëéæpä¢â"áêßöÞ=Þ¿ÝxÝZÝoÝ£ÝÿÝyÞ߿߅à`áMâEãRäa倿žçÃèéé ë,ì9íKî9ï&ðëðñ%ò‹òÀòÆò“ò&òyñ†ðPïÑí ìê³ç$åfâußeÜ>ÙÖèÒÕÏèÌ)ʰÇyÅÃÂöÀ2Àӿ׿1ÀëÀðÁBÃ×ĨƨÈÛÊ+Í£Ï)ÒÉÔx×(Úòܦßsâ.åïç©ê^íð°òJõÞ÷kúæübÿÇ3Ö Q „¥ÉØçéäÖÂ¥!€#Y% 'ï(¬*k, .Î/|13Ã4U6ñ7y9;ƒ<ú=l?Í@(BqC©DÑEàFÔG­HaIìIKJuJfJJƒIšHiGÖEîC¢Aö>è;z8³4•0*,‚' "›{S5/ Hžÿ'ûþö#ó•ïgìŠéçØäùâjá&àßbÞÖ݃ÝbÝeÝšÝëÝaÞðÞœß_à4áâãä/åDægçŠè®éÓêðëíîïöïÅð{ñ òxò·òÆòžò>ò›ñ¹ðïîeìiê'è¦åðâ àýÜÝÙ«Ö†ÓkÐxͬÊ(ÈàÅøÃ]Â(ÁUÀݿԿÀÃÀ¸ÁÃÄLÆCÈjʺÌ$Ï­ÑDÔôÖ¢ÙgÜ!ßèá§ähç êÙìƒï.òÇôa÷êùmüåþS·_© á <_q„‚ƒubH!##û$Ë&‘(Y*,Ë-|/%1Ï2m46 7,9·:8<±=#?‰@ãA2CjDšE©F¨GH@IÑI;JpJjJ,JIÑH£G.FODB€?†<*9w5c1-i(›#”~U5* 9ˆþûÐ÷ÜóFðíêƒç?åUã¶á^àV߀ÞóÝ‘ÝeÝfÝÝÙÝKÞÓÞzß7à áíáçâåã÷äæ+çRèté™ê¸ëÐìÝíßîÇï ðTñôñ^ò±òÀò«òPò¾ñæðÌïgîÀìËêœè"æzãšà—ÝwÚL×ÔÑÎ8ËžÈPÆOÄ©Â^ÁwÀó¿Í¿ ÀžÀƒÁ½Â5ÄðÅàÇþÉE̬Î.ÑÅÓlÖÙÛÛ›Þ]áäßæ›éOìï§ñGôáökùóûiþÜ@Ÿí6 u §Ôó   ê Ç" $o&<(þ)¾+t-(/Ó0|24»5L7â8j:ì;j=×>E@ AîB1D[EwFvGXHI¶I&JhJnJ;J½IûHäGzF³DB @=Ù93662í-V)$”}[3' 0nâü›ø ôöð¡í¤êþç¯å¯ãâŸà†ß«ÞÞ¨ÝgÝhÝ„ÝÊÝ5ÞµÞYßàßàÃá³â³ãÃäÕåôæè9é`êë˜ìªí«îšïvð1ñÔñMòòÃò®òdòÜññð±îí1ë é æä(á1ÞÛë×¼ÔћμËɽƯÄ÷™Á ÀÀÑ¿÷¿ÀQÁ~ÂçÙÅ|Ç“ÉÒË4ήÐFÓäÕØPÛÞÓà–ãVæéÉë|î"ñÈó]öñøqûóý^Î%}Æ  @bŽ¡´¿¸·¡‰ m"?$&Þ'©)e+-Ó.0(2Ì3g57‘8:¥;=—>ø?^A¬BòC!E@FCG.HöH˜IJ]JnJHJØI$I!HÂFEûBŒ@¸=€:ò63É.A*%‘ ~\8# &`¾ýuù_õ­ñDî6ëèæäUâåà·ßÖÞ$Þ¸ÝuÝcÝݺÝÞÞ8ßí߸à“á†âãŒä¡åºæßçÿè'êDëeìoí|îgïMð ñ´ñ7òŒò¾ò²òvò÷ñ>ñ:ð÷îfí’ëxéç†ä¸áÆÞ®Û†Ø]Õ3Ò0ÏIÌœÉ0ÇÅGÃ×ÁÊÀÀÖ¿ë¿_À%Á?ÂÃDÅÇ+Éa˹Í5ÐÁÒdÕØÊÚŠÝLà ãÐåŠèCëöížðFóÜõqøöúuýéÿS³T ” Ï ù!;MZVT@- "è#º%‰'N)+É,|..0Ó1{35¯6E8Î9T;Ö·?AjBµCäD F GHÊH~IùIRJmJRJñIKIVHGhEmC AI>*;¥7Î3 /'+t&ˆ!]; !I¦þFú+ö`òìîÊëé’ætä©â*áñßÿÞFÞÊÝ‚ÝeÝwÝ¯Ý ÞƒÞßÇß‘àháSâRãTäkåƒæ¤çÈèíé ë+ì=íFî;ïðçð–ñò‚ò±òºò€òòbñqð6ï¹íîëäé”çåHâZßFÜ'ÙôÕÕÒÀÏ×ÌÊ£ÇvÅšÃÂüÀ9Àà¿á¿DÀúÀÂTÃïĽÆÂÈñÊD͹ÏBÒàÔ×BÚÝÂ߃âGåè¾êníðÂò[õò÷yúùüpÿÚ>’ä$ ` ´Õåõóïâ̯!Œ#_%.'ö(·*s,).Ö/„1%3È4_6ó7ƒ9;Š<þ=p?Ï@+BpC¬DÍEàFÐG©HZIåI@JlJWJJoI‰HSG¿EÖC…AÛ>È;^8’4u0 ,_'‡"zb; :ÿûõöó•ïeì‰é çÚäãrá*à-ßgÞãÝ‹ÝlÝqÝ¥ÝôÝkÞúÞ¨ßeà?á#âã#ä2åNæhçè²éÔêóëíî ïóïÀðtñòlò«ò¶òò)òˆñ ðwïîNìIê è‰åÐâìßäܽٗÖkÓYÐeÍ¡ÊÈÜÅòÃ_Â-ÁYÀí¿Ú¿/ÀÒÀÍÁÙÄcÆYÈ…ÊÏÌ=ÏÄÑ]Ô×½ÙyÜ;ßûá½ä{ç6êêì™ï<òÞôn÷þù}üöþbÇ!n¸ î &Hl~ŽkV!*# %Ñ&ž(`*,Ô-„//1Ô2w46§729¾:;<·='?‰@ëA,CsD’E­FŸG‚H5IÏI-JgJ]JJIºH‘GF7DBd?h< 9U5G1î,O(y#z`> ,sùûÁ÷ØóCðýìêçFåYã»ájàZߎÞùÝœÝoÝqÝ—ÝæÝSÞÞÞ‚ßCàáûáêâðãýäæ1çWèuéŸê¶ëÔìÛíÜîÄïšðPñæñZòò¸ò˜ò?ò©ñÏð¶ïLî§ì±ê|è æZãàyÝ_Ú.×ÔëÐùÍ&Ë–ÈFÆOĤÂfÁ|Àû¿Þ¿À¯À™ÁÍÂNÄÆ÷ÇÊ[ÌÄÎCÑÞÓ‚Ö7ÙðÛ²Þqá6äòæ¯écìïºñZôóö{ùü{þêR¬ûH € ·à&.*! õ Ñ"ª${&B( *Ã+€-,/Þ0‚2%4À5T7é8l:õ;j=ß>D@¤AðB0D^EqFsGVHI´IJ^JaJ+J®IæHÑGbFšDvBé?=·962Ë-;)n$ybB bÕü“ø™ôòð í¤êè±å¹ãâªàß³ÞÞ­ÝwÝnÝÝÕÝ<ÞÂÞcßàëàÈá¾â»ãÆäàåõæ!è;écê‚ë˜ì©íªî”ïtð(ñÍñAò’ò¶ò›òUòÆñþðíï—îøìëëè†æàãáÞùÚÍקԆшαËɶƪÄõÂÁ¦ÀÀÞ¿ÀÀhÁŒÂīŖǩÉéËKÎÈÐ\ÓýÕ²ØiÛ%Þðà¤ãpæ$éáë‹î;ñÒóuöýø†ûþqÚ8ŠÓ  Hv—°ÂÈÈÀ­• v"M$ &ë'¯)p+)-Ù.‰002Ò3q57™8":¦;"=–>ÿ?`A­BôC E?FAG)HïH”IJUJaJ8JÈII H¯FøDãBp@˜=d:Î6ä2¥.#*`%r c?# I·ýbù^õ¤ñCî6ëè$æä\âêàÃßÛÞ3Þ¿Ý~ÝrÝ…ÝÊÝ%Þ§ÞBß÷ß¿àžáŒâ‰ã“ä§å¿æåçé(êKëaìtíwîiïDð ñ§ñ2ò~ò³ò¡òdòæñ%ñ%ðÜîLívë\éüækä™á¨Þ“ÛlØBÕ"ÒÏ>ÌŒÉ+ÇÅIÃÖÁÔÀ$Àä¿ù¿mÀ<ÁM»ÃSÅ7Ç?ÉzËÔÍKÐÚÒzÕ+ØáÚ¡Ý`à$ãâå¡èUë î¯ð[óëõ…øû†ýúÿbÂ_ § Ù .HZee\Q3 "ð#Æ%’'X)+Ò,†.30ß13!5µ6L8Ò9\;Ö»?ApB®CéDF GÿGÆHxIñIGJ`JDJàI;IAHöFREQCï@-> ;ˆ7­3€/ +R&n!_H :šþ:ú#ö[òêîÈë 鑿}ä­â1áüßßTÞÑÝŽÝn݄ݹÝÞÞ ßÔß—àsá\âXã]äqåˆæ¬çÉèòéë+ì?íCî:ïðâð‹ñòsò©ò¦òpòòMñ[ðïžíÓëÇévçéä*â;ß+Ü ÙÛÕ¾Ò­ÏÅÌÊ™ÇpÅ™ÃÂÁAÀì¿î¿TÀ ÁÂoÃÿÄÙÆÖÈ Ë^ÍÎÏ]ÒöÔ¦×YÚÝÙßšâ[åèÐê…í0ðÔònõøˆú ý~ÿìM¢ô2 n ÁãñüêÛ¹!˜#i%:'þ(Ã*{,1.â/Š1/3Î4g6û7‰9 ;Ž<>q?Ö@(BvC¨DÒEÚFÐG¢HUIÜI9J\JLJøI]IvH;G©EºCkA¼>«;<8t4S0î+@'g"\J  *|ÿûêöó’ï`ìé çáäãxá4à4ßrÞëݘÝuÝ}Ý­ÝÞtÞ߯ßràCá2â!ã.ä6åVælç–è´éØêôëíî ïíï½ðjñûñbòò«ò{òòpñŒð_ïèí1ì-êîçjå´âÏßÄÜ¥Ù{ÖVÓEÐSÍ”ÊÈ×ÅðÃ_Â0ÁcÀô¿í¿9ÀåÀáÁ&òÄxÆrÈšÊêÌRÏÞÑsÔ"×ÒÙ‘ÜOßâÒäçKêýì«ïSòëô…÷ ú‘üÿvÕ1~Ä ÿ 2XxŒšŸ—‘u_!9#%Þ&©(f*(,Ü-‹/;1Ú246«7;9Á:B<¼=*?Ž@éA2CoD•E©FŸG{H1IÄI'JYJQJ J€I§H}GüEDåAF?K<ì865'1Í,0(Y#`D$þ eëû¸÷Ôó:ðíêˆçFåbãÀátàaß™ÞÞ©ÝwÝ}Ý ÝóÝ[ÞèÞŽßIàáýá÷âôãåæ9çYè{é êºëÓìÞí×îÄï’ðLñÞñOò”ò¦ò‰ò+ò—ñ¸ðï4î‡ì˜ê[èíå;ãbà[ÝDÚ×öÓ×ÐæÍˉÈCÆFĬÂcÁ‡ÀÀè¿(À¾À¯ÁàÂfÄÆÈ,ÊvÌÙÎ_ÑòÓÖKÙ ÜÇÞˆáLäçÄéwì(ïÍñnô÷ùü‹þü_» S Åí%3;6-ÿ Þ"³$†&L(*Ì+Š-5/å02)4Ê5Z7î8t:ø;o=å>F@¦AñB1DZEtFoGPHI¦IJPJVJJŸIÒH¾GHFƒDXBÎ?è<—9ù5ó1¯-)R$YG&û QÈüŠø‘ôìðŸí¢êè´å¾ãâ°à–ß¼ÞÞºÝ}Ý}Ý—ÝàÝGÞËÞnß"àóàÒáÆâÀãÒäàåçèDédê„ëšì©í§î“ïlð%ñÃñ9ò†ò¦òò?òµñçðÔï~îÞìøêÑèeæÅãðàôÝÛڷ׋ÔtÑuΠËɬƩÄò¡Á«ÀÀé¿ÀÀ|Á¢ÂÄÅÅ«ÇÄÉÌcÎáÐqÓÖÈØ~ÛBÞüàÄã~æ>éðë¤îGñïó€öù—ûþ…éG›à # V‚¦½ÍØÑ͸  €"Y$+&ó'½)t+4-ã.‘092Ø3y5 7 8':«;'=š>@aA¯BôCE>F=G%HìH‰IJFJWJ'J¼IûHúG”FáDÈBT@z=H:¬6É2ƒ.*C%S I& ö 8®ýVùXõŸñ@î6ëƒè%æä_âôàËßãÞ>ÞÆÝÝvÝ”ÝÏÝ5Þ­ÞPßüßÌà¤á•â‘ã™ä®åÆæèç é.êHëgìqíuîhï?ðñ¤ñ"òzò ò•òPòÒññðÀî1í[ë;éãæHä~á‹ÞvÛRØ*Õ ÒÏ)Ì…ÉÇÅCÃÞÁÕÀ1Àë¿ À|ÀMÁfÂÊÃnÅLÇWÉ“ËëÍcÐóÒ’ÕAØúÚµÝ{à4ãüå±èmëîÈðgóö‘øû—ývÏ(o ´ è <SjnriYA $"ü#Ò%š'c) +Û,‘.;0ç1ˆ3&5¿6N8Ý9\;ß

    ½?AnB´CåDF GúGÅHmIìI;JUJ4JÒI'I-HàF:E6CÓ@>ê:j7‹3a/ç*2&R!B+ö ÷,ˆþ0úöVòäîÌë陿~äµâ7áàßZÞÞÝ•ÝzÝŽÝÁÝ Þ–Þ-ßÜß à}áaâcãaäzåæ°çÎèõéë/ì<íEî5ïðÛð†ñ òiòšò™ò_òïñ6ñDðï‚íºë¦é\çÊäâßÜíØÇեқ϶ÌÊ”ÇhÅ—ÃÂÁMÀó¿ÀaÀ Á,ÂÃÅëÆïÈ#ËrÍìÏoÒÕ¼×qÚ0Ýíß±âpå,èçê”íFðãò„õø›úýÿú_¯ ? } ªÑî  øåÂ!¥#p%G')Ì*…,9.ë/193Ô4o689;‘< >t?Ø@,BuCªDÎEÛFÊGžHNIÒI/JQJ=JèIKIbH$G”ECQA >Š;!8P470Ê+%'D"E( ï ópÿûãöóïbìéçää ãá<à=ß|ÞôÝ£Ý~ÝˆÝ¹Ý ÞÞß¹ß{àMá8â.ã0äCåVæwç—è»éØê÷ëíîïëï·ðcñóñVò‘ò›òkòò]ñuðCïÓíìêÊçQå“â´ß¦ÜÙ_ÖAÓ/ÐDÍ„Ê ÈÊÅñÃ^Â6ÁkÀÿ¿÷¿KÀöÀöÁ;ÃÈÄÆˆÈ³ÊÍmÏôÑŽÔ7×êÙ©Üdß)âæä§ç[êí»ïgòþô–÷ú¢üÿ†äAŒÔ Bc†™¥­£˜†e!G#%ê&±(s*/,å-•/@1å2…46³7>9É:F<À=,?”@èA6CmD”E§FšGwH*I¼IJMJCJýIkI•HeGåEDÈA-?)<Ó85 1­,(A#<- ïí Wßû°÷Ìó6ðíêçIåhãÈázàlßŸÞ Þ²Ý‚Ý†Ý­ÝúÝgÞñÞ™ßQà'áâýâþã å#æ:çbè|é¤ê»ëÓìÜíÖî½ïðCñÕñFò„òœòwòòñ£ð„ïînìxêBèÎåãFà=Ý*ÚûÖÞÓÆÐÑÍË|È=ÆDĪÂjÁŒÀÀô¿6ÀÑÀ¿ÁùÂxÄ4Æ&ÈCÊŽÌñÎvÑ Ô°ÖfÙÜÞÞŸá]äçÖéŒì:ïàñ~ô÷žù%üšþ oËc Õ÷/BDF4& !è"¿$&W(*Ø+-A/ì0’234Í5d7ò8y:þ;r=é>J@¨AóB0D\EoFmGKH I I JGJGJ JŽI¿H¨G1FkD;B¶?Å<}9Ô5Ù1Š-ý(1$>)îè úB»ü€øŒôæð í êè¸åÂãâ¶à¡ßÁÞ,Þ½Ý݀ݦÝéÝQÞ×Þtß0àúàÛáÌâËãÖäêåç$èHéhê„ëžì¦í¦î‘ïfð ñºñ/ò{ò˜ò}ò0òŸñÑð¾ïeîÁìàê°èKæ¦ãÓàÙÝÀÚ×uÔ_ÑbΓËüȦƤÄò£Á³À!Àø¿"À±ÀŒÁ¸Â*ÄÜÅÁÇÜÉÌ{ÎúЇÓ1ÖÛØ™ÛTÞáØã’æQéì²îañúó”ö%ù¢û'þûV§ò 0 c’¯ÍØâàÕÆ« Š"d$3&(Â)‚+9-í.˜0A2à357§8+:²;*=ž>@cA³BñC$E7F>G HæHƒIùIî6ë„è*æ äiâúàÒßïÞDÞÕݒ݆ݛÝÝÝ:Þ¾ÞRß àÐà¯áâ—ã¡ä´åÌæìçé.êMëfìqíwî_ïAðöð¢ñòqò‘ò…òAò¼ñññï®îí?ë"éÁæ/ä_ánÞ\Û8ØÕ÷ÑõÎÌzÉÇÅAÃáÁÙÀ;À÷¿ÀÀ]ÁzÂàÃÅbÇnɪËÎ|Ð ÓªÕYØÛÍÝŽàLãæÆèë2îÖð~óö¨ø&û«ý„á4‚ ¾ ø #Iau|{xaO ,"$Ù%§'i)-+á,š.B0î1’3*5Æ6U8Þ9g;Þ¾?AnB·CâDFGöG¾HfIäI/JLJ#JÄIIHÉF#EC¸@ô=Ë:M7k3B/É*&1!*ñà å{þ'úöNòçîÆë éœæƒä½â=á àßcÞêÝ݇ݖÝÎÝ(Þ¡Þ5ßçߨà„ánâcãpäyå˜æ±çÖèõéë.ì>íAî4ïðÕðñÿñ^òŒòˆòPòÙñ"ñ,ðíîhíëŒé=ç®äðáßöÛÔØ¯Õ҇ϨÌ÷ÉŠÇeŔà ÂÁUÀÿ¿ÀpÀ4Á=˜Ã/ÅÇ É8ËÍÿωÒ(ÕÓ׈ÚDÝàÅâ„åAèøê«íTðùò‘õ'ø¬ú,ýŸÿ jà R † ¼Ùý òË!¯#|%O')Ó*,@.ó/™1>3Ü4t68“9;–< >{?Ö@2BrC«DÍEÕFÊG–HIIËI$JGJ/JÙI9IPHG|E…C6A„>m;8040­+')"'ðà Ü aÿþúÛö óŒï`ìŽéçåäã…áCàIßÞÞ©ÝŒÝÝÄÝÞ‡Þ߽߈àSáBâ3ã9äGå\æç–èÂéÖêúëíîïçï°ð\ñêñIò‡ò‰ò^òïñLñ\ð-ï¸í÷ëøé²ç0åzâ•ßÜrÙJÖ+ÓÐ3Í{ÊýÇÌÅéÃcÂ;ÁqÀ ÀÀ[À ÁÂQÃÝĤƢÈÉÊÍ†Ï Ò¥ÔM×Ú½Üzß=âûäºçpê$íÒïtòõ¤÷0ú¯ü&ÿ•òQ˜ã  Nq’¦±¶¯¤Žr!O#$%ñ&»(z*:,ì-œ/H1ê2Ž4"6¹7E9Ê:O<¾=5?’@íA5CnD’E£FšGoH&I²IJAJ6JíIZIƒHPGÎEíC­A?<±8÷4é0,ò' #%÷×ß óOÓû©÷Çó4ðíêŽçPålãÑáàtߪÞÞ½ÝݑݵÝÞqÞüÞ ß]à+áâãäå%æAçeèé§ê»ëÔìÙíÓî½ï…ðAñÉñ<òxòŽòcò ògñ‘ðkïîUìZê'è¯åã%à&Ý ÚåÖÈÓ°ÐÄÍþÊwÈ3ÆDÄ©ÂoÁ“ÀÀÀDÀãÀÑÁÃŒÄKÆ;È\Ê¤Ì ÏÑ"ÔÊÖzÙ5ÜóÞ±áwä-çìéŸìJïõñô(÷®ù6ü«þÚ'r ª á*=KSLD.!ô"Å$›&`(#*â+—-J/ô0š2:4Ó5k7ö8:þ;{=ç>P@§AôB0DZEnFiGGHIšIÿI=J8JJyI¯HGFPD$B—?ª-÷. 0F2ì3€57§85:µ;-=¤>@jA¯BõCE8F9GHßH}IîI2JÁ?!AsB²CèDÿE GïGºHaI×I)J:JJ±IIH´FEC–@Ü=«:-7N3!/«*ù%!òÞÆ Ùsþú öQòÝîÍë颿‡äÄâDáàßqÞðݫݑݟÝÙÝ1Þ­ÞBßíßµàŠávânãtäƒå›æ¸çØèûéë1ì<íBî/ïðÒðtñûñNòƒòvòBòÃññðÔîMíëpéç”äÎáéÞÕ۾ؔÕ{ÒuÏ™ÌéɃÇ^Å”Ã! Á]À ÀÀ„ÀDÁS¬ÃFÅÇÉP˦ÍСÒBտפÚWÝàÙâšåTè ë½íhð ó¤õ6ø¿ú:ý²ÿ{Î ] ™ Äê'!" üÚ!µ#‰%V')Ý*•,K.ù/¢1F3á4}6 8š9;<>}?Û@0BvCªDËEÓFÅG‘HAIÃIJQ;á74ö/Ž+æ& "ôÝà ÐôVÿóúÐö ó„ïdìéçïäãáLàOßÞ޶ݕݜÝÍÝÞ”Þ"ßÍߌà`áIâ;ãBäLåfæ~ç¢è¿éÞêøëí îïâï«ðVñßñ@òxò|òKòßñ3ñGðï™íáëÖé–çåZâxßrÜUÙ3ÖÓ Ð"ÍnÊôÇÅÅêÃ`ÂCÁuÀÀÀkÀÁÂgÃòļƺÈàÊ1ÍÏ!Ò¿Ôb×ÚÑÜ“ßQâåÎç…ê:íáïŒò õ»÷=úÄü5ÿ¥\¬î + W‚𷹯¸²—!X#/%û&Ä(†*?,÷-¤/O1õ2‘4+6À7I9Ô:N<È=5?”@òA2CqD‘E F˜GgH#I¨I J5J)JÝIHIoH8G»EÏC”Aó>ï;”8Õ4É0p,Ò'#ôÝÃÅ ç9ÌûŸ÷¿ó4ðúìê‘çTåsãÙá‡à€ß±Þ$ÞÂݜݗÝÄÝÞ|Þß©ßgà5áâ ãäå,æJçfè‡é¦êÀëÓìÚíÒî·ï„ð5ñÅñ.òoò|òUò÷ñTñyðQïéí5ìBêè”åââ à ÝðÙÏ֫ӠбÍìÊqÈ(ÆBĪÂrÁ›À%À ÀVÀôÀåÁ"âÄcÆRÈwʺÌ%Ï£Ñ=ÔßÖ•ÙIÜ ßËá†äJçýé²ìbïò¤ô9÷ÂùDü¿þ*ê7€ ¹ í3MX\]J>!#Ò$¢&k(.*é+£-M/ÿ0 2B4Û5o7ÿ8„:<~=ì>S@©A÷B1DYEkFgGAHÿHŽIýI*J2JìIkI›H{GF5D Bx?<=9™5–1P-»(ù#÷ÚÆ» Ý!§ümø~ôãð™í¦ê èÁåÎã&âÈà°ß×Þ>ÞÓݢݕݽÝûÝiÞçÞ‰ßBà áîáÚâÜãàäúå ç/èNélêŠëœì¦í¡î‰ï^ðñ©ñòaò}ò^ò òxñ¤ðï0îŽì¦êvèæfãžàÝ‹Úm×DÔ9Ñ>ÎyËãțƙÄõªÁ¿À9À ÀDÀÑÀ±ÁãÂSÄ ÆñÇÊĶÎ*Ñ·Ó]Ö ÙÅÛ€ÞCáýãÀæwé.ìÚî„ñôºöCùÈûDþ°tÅ I €ªÊåñûôðÙ ¡"t$K&(Ø)+O-ù.­0L2ñ3‹5 7°88:º;4=¦> @iA³BõCE5F7GHØHyIàI,J+JJ…IÊHµGVF”D}Bþ?(=ç9U6d2+.¤)ë$ýôß¾¾ ˆý;ùEõñ<î5ëŒè0æ.ätâ áãßßWÞéݩݙݲÝñÝOÞÏÞjßàçà½á¯â¤ã²ä¼åÚæôçé3êRëeìsípî[ï4ðîðñòUòvògòò—ñÐðÅïxîâìëéè‰æðã(á5Þ$ÛØãÔÌÑÒÎýËbÉÇøÄEÃáÁíÀHÀÀ3À±ÀƒÁ¤Â IJŎǢÉÕË6ΧÐ=Ó×Õ†Ø>Û÷ݺàxã4æòè¥ëWîýðŸó8öÅøLûÆý9¢þTœ Û >dyŽ’•Š}` D"$î%¹'})>+ó,©.U0ü1 395Ó6`8í9m;ê<]>Ã?&ApB¸CâDFGíG³HYIÐIJ2JJ¤IíHóGFðDêB€@º=: 7.3/‹*Ú%ö ôÜÁ· ÀücþúöHòÝîËë 飿äÇâPáà+ßwÞþݱݞݪÝäÝ<Þ¶ÞKß÷ß¾à‘á€âuã|ä‹åžæÀçØèêë3ì:íAî+ï ðÊðnñðñDòuògò.ò±ñúðüïºî4ídëUéÿæuä²áÊÞ¼Û¢Ø~ÕdÒdχÌÞÉyÇ[Å‘Ã$ÂÁeÀÀ'À–ÀTÁi¿Ã]Å/Ç:ÉdËÁÍ+мÒTÕØ´ÚsÝ.àòâ¬åkèëÐí~ðó»õEøÏúLýÁÿ(Ü, n ¤ Ô÷$3.- ç!½#–%]'))ä* ,R.0©1O3è4ƒ68¡9!;¢<>?â@.BzC¥DÍEÐFÁGH9I»IJ0JJ¸II$HåFJEPCAC>9;¼7ù3Ô/q+Ä&ñ!ìÞ° ºåJÿäúÎöþò…ï`ì‘éçöäãšáQà\ß•Þ޿ݟݨÝÔÝ-ÞšÞ1ßÓß—àjáOâGãFäTåjæ…ç£èÆéßêûëíîýîßï§ðLñØñ6òhòpò8òÌññ1ðúî†í¼ëÂétç÷ä=âZßWÜ:ÙÖþÒôÏÍ[ÊïǼÅèÃeÂBÁƒÀ À À|À+Á0Âyà ÅÔÆÏÈúÊIͲÏ>ÒÒÔ}×0Úéܪßfâ(åßçžêHíûï—ò9õÈ÷RúÑüGÿ³j»û : dª¿ÌÌɹ¦‡!e#7%'Î(Ž*L,ü-²/R13•466Â7R9×:U<Ì=7?š@ðA7CnD‘E FGhHI¥IþI,JJÏI8IXH)GœE¼CwAÕ>Ô;q8º4¨0O,µ'á"íÙì² Õ,Áû”÷¼ó-ðüìê“çYåwãÞá’à‡ß»Þ,ÞÏݡݧÝÊÝÞ‡Þ ß·ßmà?á$âãäå6æJçnèˆé¬êÀëÓìÛíÍî¶ï|ð1ñ¹ñ'ò^òpòFòâñDñ`ð;ïÍíì#êìçsåÈâëßíÜ×ٴ֗ӌПÍãÊbÈ&Æ=ĬÂuÁ£À/ÀÀeÀÁúÁ4üÄvÆlÈÊÒÌ<ϽÑPÔûÖ¥ÙfÜßááä[çêÆìsïòµôH÷ÖùTüÏþ9ŸøFŽ É ÷&@XghgYG)! #Ú$¯&r(:*ñ+©-[/1ª2H4ã5u79‰: <‚=ð>T@­A÷B1DYEjFcGìñî‘ñ8ôÅöYùØûRþÄ&…Ó Z º×òÿûãÏ ©"‚$T&(â)›+U-/±0V2û35-7±8A:½;9=©>@hA·BóC E5F1GHÓHlIáIJ%JíIvI¶H G@FyDeBß? =È966E2 .…)Ë$ÞÛÀ®¡ ½üwý6ù6õñ6î6ë‹è7æ.ä~âáíß ßaÞòݴݢݽÝùÝ[ÞØÞtß$àîàÈáµâ®ã·äÅåàæøçé7êUëeìsímîZï.ðéðƒñýñIòlòTò ò‚ñ½ð­ï`îÅììêÊènæÑã áÞ Ûí×ËԹѾÎîËYÉüÆ÷Ä@ÃéÁìÀXÀÀFÀ¿À˜Á´Â ÄÉţǻÉêËOÎÀÐQÓñÕ›ØWÛ ÞÒàŠãNæé»ëhîñ¯óLöÕø_û×ýK¯`­ é !Is„ž¡—†m M"&$ø%Ã'‡)G+ü,´.Y0 2¢3D5Ø6f8õ9o;ó<\>Ë?#AvB´CæDýEGèG­HRIÆIJ#JüIIàHÙGŠFÖDÑBe@š=s:í63å.j*¼%Ú Öê¡ ¯êXþúÿõ?òßîÆë馿‘äÒâRá)à1ßÞ޼ݨݴÝîÝFÞ¿ÞUßàÆàá…â~ã€ä‘奿ÄçÝèêë1ì>í<î)ïðÀðjñãñ<òcò[òòñçðâï£îíHë9éãæWä–á¬Þ¢ÛˆØdÕQÒOÏzÌÑÉqÇTÅ“Ã$ÂÁnÀ#À6À¤ÀgÁ|ÂÖÃqÅIÇKÉËÔÍGÐÓÒjÕØÇÚÝBàãÃå|è6ëãíð0óÇõ\øÝú`ýÍÿ<™î9 | ° ã!2;>4' ñ!É#ž%h'/)ð*¦,_.0µ1R3ô4…68¡9+;¢<>ƒ?à@3ByC¥DÌEÌF½GˆH3I°IJJ J¦IIHÏF1E;¢7Ø3´/S+¤&Ô!Òé ¥Ø9ÿÝúÃöûòï_ì•éçúä$ã›á`à^ߤÞÞËݩݰÝáÝ5Þ¥Þ9ßÜß àqáYâKãNä\ånæ‹ç§èÇéäêøë íîÿîÙïŸðGñÎñ)ò_ò\ò+ò·ñ ñðæîfí¨ëŸé\çÖä#â=ß9Ü#ÙÿÕéÒäÏÍVÊßǾÅàÃjÂFÁŠÀ.À+ÀŒÀ=ÁA‘ÃÅìÆæÈË_ÍÌÏSÒéÔ–×BÚÝ»ßâ;åõç±ê\í ð­òFõÝ÷`úäüVÿÂ${È E t›¸ËÙÖØÂ²“!m#C%'×(™*R,.µ/`13¥456Î7U9Ý:Z<Ï=:?@ñA7CpDŽEFŽG`HI›IöIJJ½I&IGHG‰EŸC^A¹>µ;T8™4Š00,•'Æ"ÐÀ©™› ȶû÷µó+ðùìê”ç^å}ãäá›à߯Þ2ÞÜݪݳÝÒÝ'ÞŽÞß¾ßwàIá*âãä$å:æRçoèé¨êÆëÑìØíÏî­ïzð'ñ²ñòUò_ò5òÒñ,ñKð#ï³íìêÑçSå¯âÊßÕܹٞրÓwÐÍÕÊXÈ"Æ9ĬÂ|Á¨À9À)ÀsÀÁÂHÃÑĎƀȧÊéÌTÏÓÑkÔ×ÁÙwÜ5ßõá²äoç(êØìˆï)òÇô[÷æùdüßþH°V› Õ .PenyljM8!#æ$·&~(>*,®-d/ 1°2R4æ579”: <‰=ò>X@®AøB0DZEeFbG7HñHIåIJJÏIIIuHOGÛEDÕAA?S<9Y5[1 -ƒ(·#ËÁ§™“ ¹Žü[øpôÜð“í¨êèÊåÙã3â×àÂßêÞPÞèݶݬÝÏÝÞyÞþÞ›ßUàáÿáëâèãòäæç7èVésê‹ë ì£íŸîïSðñ–ñòHòaò=òèñNñ{ð]ïîVìnêAèÒå3ã^àgÝVÚ9×ÔÑÎ^ËÍÈÆ“Äõ¯ÁÐÀGÀ*À_ÀóÀÙÁ ÃÄ4Æ È7ÊyÌØÎZÑæÓŒÖ:ÙïÛ°Þjá,äçæ éSìï¤ñIôÖölùæûfþÐ8‘ä* f ÂêùóÔ ¸"Š$^&$(ê)¥+_- /»0\24—507º8E:Ä;<=®>@mA¶BöCE5F.GHÍHgIÒIJJáIfI H‘G#FfDEBÈ?ë<¬96'2è-j)¨$Ⱥ®“ ¦ðjý*ù3õˆñ8î3ëŽè:æ4ä…âáößßjÞÿݻݯÝÄÝÞcÞæÞzß1àõàÐáÀâ´ã¿äËåãæÿçé;êUëhìqíkîXï(ðäð{ñôñ;ò`òBòüñmñ¦ð—ïGîªìÐê®èMæ¸ãêàýÝîÚÑ׶ԡѯÎÞËLÉôÆõÄ<ÃîÁñÀ_À)ÀPÀÕÀ¤ÁÏÂ1ÄàŽÇÎÉÌcÎÚÐiÓÖ¶ØhÛ)Þáà¥ã_æéÐëzî'ñÁó^öçønûëýWÅu· ù 0W~•£°©¦x Y".$&Ë'‘)O+-¹.g0 2¬3L5Ú6r8ô9{;ñÊ?*AtB¸CâDþEþFäG¨HKI¾IJJîI€IÌHÆGsF¿D·BI@|=W:Ë6ñ2Ä.I*¡%· ¾¦•‰ ÙKþüùöõ?ò×îËëéªæ™äÓâ`á)à?ߊÞÞËݬÝÂÝöÝRÞÈÞ^ß àÏà¤áâ„ãˆä—嬿Æçæèêë3ì:í>î'ïðÀð\ñÞñ.òYòJò òŒñÏðÏïŠîÿì/ëéÇæ:äyá‘Þ…ÛnØOÕ:Ò?ÏgÌÉÉgÇQÅÃ(ÂÁxÀ,ÀEÀ´À|ÁŒÂïÄÅaÇcɘËìÍ_ÐêÒ‚Õ3ØßÚ¢ÝXàãÙåèKëôí¤ðAóÚõkøïúnýàÿJ§ýH ‰ À ï/>GL=5 þ!Ó#§%s'9)÷*³,b.0¸1^3ö4‘68ª9.;§<>?è@1B|C¦DÉEÌF·G…H)I­I÷IJöIšIóHüG»FE$CÄ@>÷:ƒ7¸3–/2+ˆ&¶!´«ŽŠ È*ÿÒú¼öôòï^ì”éçþä(ã¦ácàkß©Þ'ÞÖݱݾÝêÝ?Þ²Þ>ßêß§àzábâSãUäbåtæŽç°èÅééêøë í îùîÖïšð@ñÅñòSòMòò£ñ÷ððÍîLíë„é<ç½äâ#ßÜ ÙèÕÒÒÑÏñÌJÊÕǸÅÞÃmÂGÁ—À4À<À›ÀMÁX£Ã4ÅÇýÈ)ËxÍâÏlÒÕ­×\ÚÝÕßâTåèÃêsíðÀòZõì÷túòühÿÐ5‰× R ªÄØäãàÒ¹ž!y#J%'Þ(£*Y,.¼/i1 3§4C6Í7a9Ý:b<Ï=C?›@öA8CnDEšF‰G^H I•IêIJýI²II6HøFrE†CCAž>•;88y4k0,u'©"³¦ƒˆ µ©û„÷®ó)ð÷ìê–çbå„ãëá¤à•ßÐÞ>ÞáݻݶÝãÝ-Þ™Þ#ßÈ߀àRá0â&ã ä/å<æYçrè•é«êÈëÒìØíËî«ïsð"ñ©ñòFòSò#òÀññ6ðïíäëîé¯ç<åŠâ´ß³Ü£Ù‚ÖlÓbÐ€ÍÆÊPÈÆ9ĪÂÁ¯ÀEÀ3À…À&Á Â_ÃæÄ¢ÆÈ¶ÊÍiÏíÑ€Ô'××ÙŽÜNßâÉä„ç;êìì›ï;òÚôl÷õùxüîþY¿h§ æ ?Zs|„{sXD!#ô$¿&‰(I*,»-k/1¸2X4î5†7 9—:<‰=ø>Y@±AúB0DXEfF[G5HèH}IÙIJJÃI6IbH=G¿EíC·A&?4<ä895;1í,b(˜#±¡’~€ ¦öüSøiôÖð“í¦êèÌåßã7âáàÈßöÞXÞóÝ¿Ý·ÝØÝÞ„Þߦß\à(áâöâîãùäæç>èWéwêëŸì£íî|ïQðúð•ñøñBòMò3òÐñ@ñ`ðHïãí?ìOê$èµåãDàGÝ>Ú×Ô÷Ð ÎMËÃÈ„ÆÄô´ÁÕÀRÀ5ÀnÀÁêÁÖÄKÆ6ÈQÊŽÌôÎmÑÔ¡ÖSÙÜÆÞ€áAäüæµégìï·ñ[ôëözùúûuþáH¢ò9 v ¨Õñ üä ¾"˜$d&0(ñ)°+d-/À0h24¡537Â8J:È;B=¯>@nA¹BôCE0F,G HÈH`IÊIJ JÒITI‘HvGFJD,B­?É<‘9ó52Ë-E)$¤£Ž|y —Ý_ýù+õ„ñ4î5ëè=æ:ä‰âáýßßtÞÞÇÝ·ÝÐÝÞnÞíÞ‡ß6àáØáÄâÁãÀä×åçæè!é>êWëiìríhîWï!ðßðsñèñ2òNò6òéñZñ’ð~ï-î’ì²ê“è0æ›ãÌàâÝÐÚ»×ԌџÎÍËCÉíÆìÄCÃèÁþÀeÀ4ÀbÀàÀ¼ÁÞÂJÄôÅÕÇæÉ ÌyÎôÐÓÖÍØÛ>Þùà¸ãvæ,éäëŽî9ñÔóoöùø€ûùýiÒ+Ç  <g‰¡³¹¸®„ c";$ &Õ')W+-Ã.m02¶3O5å6u8û9€;÷Ï?*AwBºCàDF÷FåG HGI³IÿIJâInIºH²GZF©D™B.@`=6:¯6Î2¥.**€%›  Œ{t ˆÈ>þðùïõ6òÕîÉë鬿žäØâdá6àBß—ÞÞÕÝ·ÝËÝÞ[ÞÒÞißàÙà®á•âŽãäœå³æÌçèèêë2ì?í7î*ïøï½ðTñÓñ%òJò=òùñzñ·ðºïpîäìëûè¬æä[átÞlÛQØ;Õ Ò0ÏU̽É^ÇJÅ‘Ã&Â(Á|À<ÀNÀÉÀˆÁ§ÂýßÅuÇ}ɯËÎwÐÓÕGØúÚ´Ýsà.ãïå¦è\ë î³ðUóîõzøû{ýóÿY¸V ™ Í ý;LUUM<& "ß#²%}'C)+º,l.0À1f3þ4—6&8°93;­< >‰?æ@7ByC©DÅEÊF´G}H&I IòIJëIˆIàHêG¢FEC«@ñ=Û:a7›3u/+i&•!›Œym €² ÿÃúµöìò}ï[ì•é!çÿä0ãªámàrß´Þ/ÞÝÝ¿ÝÄÝøÝGÞ»ÞJßòß±à„áiâ[ã\äiåxæ™ç¬èÑéåêÿëíîøîÒï•ð8ñ»ñòDòBòò—ñÝðñï®î7íoëié!çžäçáßÜìØÓÕºÒÀÏâÌ:ÊÑÇ­ÅãÃfÂVÁ—ÀDÀHÀ«À`Ál¶ÃMÅÇÉAËŽÍüÏ‚ÒÕÁ×tÚ.ÝçߪâeåèÙêƒí2ðÐòoõù÷Šúýü}ÿÞE˜å' a µÒâòðëÝŨ!„#U%&'ê(¨*g,.Ê/m13¯4G6Ö7f9ä:e<Ö=B?£@ôA:CnDE–FˆGUHIŠIãIJñI II HäFZEmC&A‚>x;8X4L0ñ+X'Š"–vns ¥žûz÷ªó"ðøìêšçfåˆãôá¨à¡ßÕÞIÞìÝÃÝÃÝêÝ8Þ£Þ.ßÏß‹àZá=â(ã-ä1åEæ_çuè˜é®êÇëÓì×íÈî©ïnðñ£ñò=òBòòªññ ðïî…íÇëÓé“çåoâ˜ß˜ÜˆÙlÖTÓRÐnͺÊEÈÆ7ī‡Á³ÀRÀAÀ’À<Á/ÂwÃùĺƳÈÏÊÍÏÒ™Ô;×ðÙ¡Üeßâàä—çOêíªïQòêô~÷ ú„üÿjË&s¶ ö Mi|‹‰}fK!&#ý$È&•(Q*,Ä-q/1¿2_4ö5‹79ž:<‘=ø>`@¯AüB0DVEdFYG-HçHnI×IÿIûI±I&IOH'GªEÒC A?<Æ851Ð,A(#Žtjn ’êtüJøbôÓð‘í¨êèÒåâãAâåàÔßüÞbÞþÝÈÝÀÝåÝ#Þ’Þ ß³ßbà2áâúâúãûäæ"çCèZé{êŒë¢ì íœîyïKðõð‹ñïñ4òBò òÁñ)ñLð/ïÍí"ì6êè›åöâ&à-Ý$Ú×ðÓâÐüÍ?˹ȀƉÄùµÁÜÀ^À@À~ÀÁþÁ2êÄbÆMÈgÊ¨Ì Ï…ÑÔ·ÖiÙÜÙÞ—áUäçÊéyì(ïÎñgô÷ˆù ü†þïX°H ƒ ¶á&&)ì Ê"Ÿ$r&6(þ)¶+n- /Ç0n24¤5>7Ä8Q:Ì;G=±>@nA»BöCE3F&GHÂHWIÁIýIûIÄICI{HfGùE3DB?®æAäâ'áà"ß€Þ ÞÔÝ¿ÝßÝÞ|ÞöÞŽßFàáçáÊâÇãËä×åðæè%éAêXëjìpíiîPï ð×ðjñàñ%òCò&ò×ñGñzðjïî{ì•êwèæã¯àÈݶڡ׆ÔzÑ‰ÎÆË2ÉêÆçÄ@ÃïÁÁqÀAÀmÀõÀÌÁôÂ^Ä ÆëÇüÉ7̑ΠїÓ5ÖãØ–ÛSÞáÎãˆæBéöë¡îMñåó€ö ù‘ûþyá:×  Kr˜­ÀÃ娎 l"G$&ã'¢)b+-Ë.u02¹3Z5è6}8:‚;ýÓ?,AxB¸CâDûEøFÛGŸH9I±IíIJÌIdI£H£G@F“DB@B=:Ž6³2‚.*`%‚ …td` x»/þêùâõ7òÐîÉë靿£äßâmá:àPßšÞ'ÞÙÝÅÝÓÝ ÞeÞÝÞqßàßà¹áœâ•ã˜ä åºæÐçìè êë5ì=í7î#ï÷ï³ðNñÊñò@ò,òèñfñ£ð¢ïXîÊìùêâèŽæÿã?áVÞSÛ8Ø"ÕÒÏLÌ®ÉXÇFÅÃ+Â+Á†ÀGÀ^ÀØÀœÁ¸ÂĶŊǔÉÇËÎÐÓ±Õ_ØÛÉ݈àCãæºèpëîÆðgóýõŽøûŽýfÊf ¤ Þ 0B\^aXG1 "ê#»%†'M) +Á,y.0Ì1i35›6/8±9:;°<&>Š?ê@6BzCªDÂEÉF®G{HIœIâIJ×I}IÌH×GFêDìB“@Ó=¿:C7{3W/ô*J&{!|w]] i¨ÿºú­öæò|ïYì—é$çå6ã°áwàyßÁÞ6ÞëÝÅÝÒÝþÝUÞÃÞVßößÀà†áuâaãeän傿–ç¹èÍéîêúë íîøîÍïŽð2ñ±ñ ò9ò0ò÷ñ‚ñÌðÕïœîíWëKéçäÌáçÞéÛÔØ¸Õ©ÒªÏÒÌ0ÊÅǪÅÞÃlÂWÁ£ÀJÀYÀ¹ÀsÁ}ÂËÃeÅ*Ç2ÉSË©ÍКÒ3Õ×׌ÚAÝà½âzå4èéê˜íDðäò~õ ø—úý†ÿöL®ñ6 p šÄÞðþû÷èе!‹#b%.'ó(µ*k,#.Ì/{13¹4K6ß7h9ë:i<Û=D?¥@öA;CmDE•F‚GTHüH†IÖIýIåIIóH HÐFAEUC Ad>];ø7;4+0Ô+7'p"wt_Ue ŽùÿŽût÷¢ó ðöìêšçmåŒãûá²à¦ßãÞNÞùÝËÝÎÝõÝ@Þ®Þ5ßÚß’àcáBâ4ã0ä;åGædç|è™é´êÅëÔìÖíÅî¤ïjðñœñ÷ñ1ò3òòñîð ð×îlí¬ë¹éuçåTâwß„ÜiÙXÖ<Ó?Ð^ͰÊ9ÈÆ1݉Á¾ÀYÀOÀ£ÀKÁE‰à ÅÕÆÅÈêÊ5Í•Ï Ò«ÔX×Ú¼Üwß3âõä©çfêí¿ïcòüô‘÷ú›ü ÿ}Ú6€È þ 2Ys“›“†uR!3#%Ô&›(]*,Í-{/"1Ê2c4þ579¡:<“=ý>`@³AüB2DTEcFTG+HÝHkIÈI÷IíI¡II9HGE¼C‚Aï>ø;©8ø41®,%(`#sq\TX ‚ÚgüBø\ôÎðí¨êè×åçãHâíàÜßßmÞÞÔÝÊÝîÝ.ÞšÞß½ßià>áâãýãåæ*çEèbézê’ëŸì¡íšîwïDðñð~ñéñ&ò5òò²ññ:ðï´íìêêç}åÚâ àÝÚîÖ×ÓÒÐêÍ1˱ÈwƇÄù¹ÁäÀgÀLÀÀ'ÁÂGÃÂÄvÆgÈ{ÊÁÌÏŸÑ-ÔÒÖ}Ù4ÜïÞ¬ájä%çÝéŒì<ïÝñ~ô÷ùü–þg¿V Åí $.62&÷ Ô"©${&A(*Á+v-'/Ñ0w24¯5@7Î8U:Ó;H=¸>@sA»BõCE.F%GH¹HSI¶IðIóI¯I7IgHQGáEDóAz?‹Õ?-A|B¸CáDùEöFÖGšH2I¦IçIòIÂIOI”HŠG0FvDiBö?&=ÿ9k6—2a.ñ)A%e g]JL e¨(þÙùâõ,òÑîÇëé¶æ¤äéâráCàYߥÞ,ÞéÝÊÝãÝÞpÞçÞ{ß'àêà½á©â˜ã¢ä¦åÀæÒçôèê%ë5ì;í8î ïòï¯ðFñÀñò/òòÖñRñðŠï?î³ìÛêÈèpæáã%á9Þ8Û Ø ÕüÑ Ï:̨ÉKÇEÅ‹Ã/Â1ÁŽÀTÀjÀêÀ¬ÁÍÂ)ÄÉťǧÉâË0ΧÐ0ÓÉÕvØ&ÛàÝà[ãæÒèë5îØðyóö ø"û¡ýx×)t µ é 8TcnkdU8 "ñ#È%'V)+Í,}.,0Ï1s35¡668·9?;´<(>‘?è@=BwCªDÁEÅF­GqHIIàIîIÒIfI½HÃGtFÕDÐBw@º=œ:*7V3?;Ø74 0´+'P"]WF@M çÿ…ûk÷óðöìê çnå•ãâ·à²ßëÞYÞÞÔÝ×ÝÞHÞ½Þ<ßåßàjáMâ8ã;ä=åTæcç„è™é¸êÇëÕìÔíÃî¡ïcð ññîñ%ò#ò÷ñƒñàððïÁîPí“ëšéYçåä4â^ßdÜPÙ?Ö%Ó-ÐLͤÊ/È Æ0Ä®ÂÁÄÀfÀ\À±À_ÁWŸÃ'ÅçÆáÈËJͳÏ1ÒÊÔj×ÚÏÜßHâ å¿çyê'íÓïtòõ¡÷+ú§ü!ÿ‡íCÕ  =fƒ–¤¥ž•zc!9#%Ý&¥(g*,×-€/.1Î2m46•7!9¦:!<—=?`@¹AùB4DREaFOG'HÕHcIÀIëIÝI”II)HüF{EŸCjAÏ>Ü;ˆ8Ý4Û0‘,(C#XRE<C rÉ^ü6øUôËðí¨êèÙåíãNâôàåßßvÞÞÝÝÖÝ÷Ý=Þ Þ'ßÁßzà@á!â ãä åæ0çJèbé€ê’ë ì£í”îuï?ðèðyñÜñò%òÿñ›ññðï™íìëýéÏç]å¿âêßúÜèÙ×Ö½ÓÀÐÙÍ"˨ÈnƈÄõÂÁÁéÀqÀYÀžÀ6Á'ÂYÃ×ÄÆzÈ–ÊÙÌ7ϹÑDÔëÖ“ÙMÜßÄá~ä<çíé¨ìIïöñŒô"÷­ù+ü¨þxÎf Ôú1;E;4!Þ"µ$„&L(*Ë+}-1/×024µ5G7Ó8[:Ö;N=»>@vAºB÷CE+F#GýG´HKI¬IæIâI¤I"IWH:GËEDÚAZ?s<39›5¨1k-î(/$SOC7> _³8ýùõyñ*î8ë”èGæLäšâ9áà8ß’Þ!ÞéÝÒÝóÝ*ÞÞ ß¢ßUàáöáÙâÚãÒäéåøæè/éCê_ëiìqíbîLïðÊð\ñÊñò'òòµññOð;ïàíCìaê:èÝåAãyàŒÝ„Úo×WÔTÑeΩËÉÚÆâÄ?ÃöÁÁÀ]À‡ÀÁîÁÈÄ9ÆÈ-ÊdÌÄÎ8ÑÇÓfÖÙÆÛ}Þ:áûã¯ænéìÍîmñô ö/ù±û)þœý]ªõ / gޱÇ×ÝÜп¢ …"Y$*&ô'·)t+(-Ü.†0*2Î3b5ú6†8 :;=u>Ö?2A|B¸CâD÷EóFÒG”H*IžIÚIçI³I?IHuGF`DLBÚ? =Ú9S6q2E.Î)%%D N@46 Q›þÔù×õ(òÏîÇëéºæ©äíâ}áGàeß­Þ7ÞòÝÖÝëÝÞxÞòÞ„ß1àðàÊá«â¦ã£ä±åÂæÜçôèê$ë6ì<í6îïïï¨ð>ñ¸ñþñ&ò òÇñ>ñzðsï&î–ìÂê§èVæÂãáÞÛØïÔêÑòÎ0Ì—ÉFÇ@Å‹Ã1Â5Á›ÀZÀÀòÀÆÁÜÂAÄáźÇÃÉöËLνÐIÓâÕŒØ?Ûõݵàoã,æãè˜ëFîëðó!ö°ø6û¯ý!Šå: Ä ÷ %Farxyn`E '"ý#Ñ%š'a)+Ø,„.50Ù1z35«678Â9B;»<*>“?ì@";»7û3î/”+û&2"A=/)< oÚÿ{ûb÷–óðòìê¢çsåšã â¿à¼ßóÞdÞ ÞÞÝåÝÞZÞ¿ÞKßíߦàsáWâ?ãBäEåWælç„è é¶êËëÔìÒíÂî›ï`ðñ‰ñâñòòâñuñÆðÝï¨î5í{ëzéAçÁäâ>ßHÜ:Ù ÖÓÐAÍ“Ê)ÈÆ/İ’ÁÏÀoÀjÀÂÀoÁl´Ã;ÅÇôÈË`ÍÍÏHÒáÔ‚×2ÚêÜ¢ß`âåÔçê:íåïˆòõ´÷<ú¸ü1ÿ™úTžá  Is¢°³§¤ƒn!E#%ê&¬(q*(,Ý-‹/41×2u4 6ž7$9®:#<Ÿ=?f@·AÿB/DTE[FPGHÔHVI¹IÞIÑI…IíHHäFgE…CMA¶>¼;n8¹4¾0p,å'<)'1 ]¿Pü0øNôÇðŒí©êèÚåøãOâáêß߀ÞÞèÝâÝþÝHÞ«Þ/ßÎßàKá(âãäå$æ3çOègé‚ê‘ë£ìŸí”îqï7ðäðmñÔñ òòíñŒñëð ðçîíÐëåé­çFåâÑßÛÜÒÙ»Ö«Ó©ÐÊÍËœÈkÆ‚ÄùÂÂÁñÀ{ÀgÀ«ÀJÁ6ÂqÃêÄ©ÆÈ´ÊëÌRÏÏÑZÔתÙcÜß×á”äPçê¹ì]ï ò›ô7÷»ù>ü·þˆÛ0p ° Ü "@GOI=(!é"Á$&U(*Ð+Œ-4/ã0ƒ2$4¼5M7Ù8_:Ü;R=¿>@vA¾BóCE)FGüGªHEI IÝIÓI˜IIFH"G¸EæCÃA;?W<9z5ˆ1L-Î($61.- J¥+ýûø õuñ)î8ë–èJæRäŸâCáàDß—Þ0ÞîÝáÝøÝ8Þ—Þß®ß\à$áûáäâÝãÞäìåÿæè2éFêaëiìnífîAïð¿ðSñÁñòòùñññ6ð&ïÆí*ìDê!è¾å%ã\àqÝgÚY×>Ô@ÑSΜËÉÓÆÝÄ@ÃùÁÁÀgÀ™À'ÁÂ0áÄJÆ4ÈAÊ~ÌÛÎQÑÝÓÖ%ÙÛÛ–ÞNáäÅæé/ìßîñô´ö@ùÂû;þªj» > u›¾ÕãìåÞÆ² ‹"f$3&ý'À)|+4-â.012Õ3i57‰8:’;=x>Ú?3AB¶CâDõEïFÐGŠH'IIÔIØI£I0ImHbGFGD1BÂ?é<Á906U2#.±)%* 1% C‰þËùËõ'òÊîÆë鏿²äòâ‚áTàj߸ÞAÞüÝàÝöÝ&Þ†ÞúÞß<àùàÒá¶â«ã«ä¸åÆæáç÷èê'ë6ì;í5îïíïžð9ñªñøñòò²ñ-ñað^ï îì£êè4æªãèàÞÛî×ÚÔÒÑåÎÌÉ=Ç>ňÃ7Â9Á¥ÀiÀŠÀÁÖÁñÂVÄ÷ÅÏÇÛÉÌbÎØÐ\ÓýÕ¡ØVÛ ÞÈà†ã@æ÷è­ëWîñœó5öÂøFûÀý1—öG“ Í .Vl~„…zkO 4"$Ü%£'i)%+Þ,Ž.;0â1€35±6=8Æ9I;¼<2>’?ñ@=BzC¨D¿E¾F¤GgH IIÇI×IµIDIšH™GHF¦D›BA@~=a:ë63û.”*ñ%!+$ 3sêþ—ú—öÓòtïVì›é,çåFãÉáŠà˜ß×ÞYÞÞåÝñÝÞtÞàÞsßàÖà¥áŠâ{ãxäƒå‘æ©çÁèÙéòêì íîðîÀï}ðñ’ñíñòòÆñDñ‘ðŽïSîÌìëøè­æ)ärá—Þ‘ÛŒØnÕiÒtÏ¢Ì Ê«ÇšÅÜÃpÂhÁ»ÀmÀƒÀçÀ­ÁµÂ Ä¥ÅoÇvÉËïÍ[ÐàÒxÕØÎÚ‡ÝAàüâ»ånè'ëÔízðó±õFøÆúIýµÿ$}Ø c ˜ Äí!  òÓ!®#~%M' )Ñ*‡,;.ç/123È4d6î7z9û:u<å=R?©@ÿA;CmDŠEŒFxGAHìHfI½IÖI¼I`IºHÒGFûDC¼@ >;›7Ü3Ï/r+Þ&"##& aÉÿpûZ÷óððì!ê¢çzåãâÇàÄßúÞqÞÞîÝéÝÞ`ÞÊÞXßñß³à{á]âJãIäJå_æoç‹è¢é¼êÊëÖìÒí¾î™ïXðûðñØñ òòÓñañµðÃï’îí^ëaé!ç¨äüá$ß,Ü Ù ÖýÒÐ.͉ÊÈþÅ*Ķ’ÁÝÀtÀ|ÀÏÀ€Á‚ÂÅÃTÅÇÉ2ËyÍãÏ`ÒùÔ˜×LÚüܽßsâ3åéç¡êNíùïšò3õÆ÷KúÌü?ÿ© _°î . V„š±»¾¸¨•t!S#$%ñ&º(v*4,ä-–/:1à2y46Ÿ719¬:/<= ?g@ºAþB0DSEXFMGHÉHTI©I×IÁIuIàHÿGÔFIEqC0A˜> ;L8œ40P,Æ'#  K¯Dü$øJôÀðí§êèáåùãZâáòß#߇Þ&ÞòÝêÝ ÞOÞµÞ;ßÔߊàVá.âãäå'æ;çSèlé‚ê˜ëžì¤íîqï0ðàðbñËñÿñ òßñxñ×ðöïÎîií³ëÉéç)åâ´ß¾Ü¹Ù¡Ö–ӔкÍË“ÈcÆ‚Ä÷ÂÈÁùÀ…ÀtÀ¼À[ÁL„ÃÅ¼ÆªÈÆÊ ÍhÏçÑwÔ×ÇÙvÜ3ßïá©äeçêÊìvïò´ôE÷ÐùNüÇþ0˜ì=€ ¼ î5GXYVG6!÷"È$š&_("*Ú+’-@/ê0Œ2+4À5V7Þ8e:ß;X=Á>$@wA¿BôCE#F GïG¬H6IIÍIÊI†IÿH1HG›EÑC£A"?8<õ8[5g1--®(ó# 9•ýïø õlñ)î6ë—èOæUä¨âGá&àIߥÞ6ÞúÝìÝÞCÞ¡Þß¹ßcà.áâëâçãâäöåçè2éNê_ëlìníbîBïð»ðKñ¶ñ÷ñ òèññ÷ð%ð ï±í ì)êèžå ã?àSÝOÚ:×-Ô'ÑEÎŒËÉÎÆØÄ?ÃÿÁÁ˜ÀrÀ¨À9ÁÂHñÄgÆFÈ[ʘÌðÎjÑöÓ–Ö<ÙõÛ©Þhá#äÝæ“éGìïî˜ñ0ôÈöOùØûHþ½xË O €­Èäï÷òèÖ¹ ™"n$>&(É)‡+;-ì.˜072Þ3p57‘8:—; =|>Ü?7A}B»CÞDõEëFÌG„HIŠIÅIÎI“I IZHMGéE-DB¢?Î< 9672ÿ-–)à$   /yýý¾ùÆõ!òÅîÉëéÀæ²äûâ†á_àqßÃÞKÞÞíÝýÝ5ÞŽÞß–ßEàáÙáÁâ°ã´ä¾åÌæççúèê'ë9ì9í5îïéï–ð3ñ¡ñëñòðñ ññMðFïóíbìŠêoèæˆãÍàåÝæÚÔ×ÄÔ¼ÑÓÎ̃É5Ç9ŇÃ:Â?Á®ÀtÀšÀÁèÁÃlÄ ÆëÇïÉ)ÌyÎñÐtÓÖºØkÛ%ÞÞàœãUæé½ëoîñ³óEöÖøUûÓý@ªZ á A_|‰’‘„xZ ="$å%®'q)1+ä,›.A0ê1‰3"5¹6B8Ï9I;Ç<1>™?ñ@?B{C¨D¾E»F¡GaHIvI¼IÍI£I8I…H…G3F‰D„B!@d=A:Ë6÷2Ü.r*Ô%ÿ   bÛþúŠöÒònïVìŸé,çåKãÐá’à¢ßÞÞfÞ ÞòÝùÝ(Þ}ÞëÞ{ß!àÝà±áâƒãäŠå–æ¯çÃèàéóêì íîêî¿ïtðñ‡ñâñÿñ÷ñ²ñ2ñ{ðwï:î±ìéêÚè‘æ äVáxÞyÛoØYÕRÒaÏ–ÌýÉ¤Ç•ÅØÃtÂmÁÂÀ|ÀÀúÀ¿ÁÉÂ%ĸŌljɹËÎvÐöÒ”Õ1ØëÚ™Ý[àãÐå†è9ëêí‹ð3óÄõXøÙúXýÈÿ1‘ã0 o ¥ Ôú()/& Û!¸#‹%T')Ù*,D.ð/–1:3Ð4l6ó7‚9þ:|<ë=Q?°@ùABCjDŠE‰FtG=HãHaI±IËI®IMI­H¹G{FàDïBœ@ó=à:7¼3­/T+½&õ! ýü  OºÿcûQ÷ˆóðïì!ê¥ç~å£ãâÐàÍßßyÞÞ÷ÝôÝ ÞhÞØÞ\ßà¶à†áeâPãRäPåeævçŽè¦é¼êÌë×ìÏí¾î’ïUðóðvñÎñþñ÷ñÃñLñ¢ð«ï|îÿìDëEéçŒäÝáßÜÙôÕæÒòÏÍ|ÊÈ÷Å+ij›ÁßÀ…ÀƒÀãÀ’Á“ÂÝÃiÅ+Ç'ÉHË’ÍûÏyÒÕ±×aÚÝÐߌâHåþç·ê_íðªòHõÖ÷^úÝüNÿ¼t¹ 4 kŒª½ÈÊij¡!]#.%ý&À(„*9,ñ-›/D1æ2‚46¨739¶:.<¦= ?j@½AþB1DQEVFJGHÉHCI§IÆIµIhIËHîG½F3EVCAz>…;)84{04,¥'é"ú÷ =:üø@ôÀð…í®êèêåúãcâ áýß(ß•Þ,ÞþÝõÝÞ]Þ½ÞEßÜß—à[á9â#ãä å-æ@çVèréƒê™ëŸì íŽîjï.ðÕð^ñ½ñöñøñÐñdñÆðÜï»îJí ë¨éxçåfâ–ߣܟنւÓЩÍûʈÈ]Æ~ÄùÂËÁÁÀƒÀÈÀoÁZ›ÃÅÔÆÀÈÞÊÍ‚ÏüÑŽÔ0×ÚÙÜHßâÀäxç/êÝì‰ï*òÅôX÷ßùcüÔþC¤þJ‘ Ê ú%?VdebT>%!þ"Õ$¡&j(**æ+™-I/ï0–214É5\7ä8k:ä;\=Ä>'@zA¾BùCE&FGîG¥H/I“IÃI¼IwIïHHýF„E·C‹A?<Ú885J1 -(Ú#öôñ („ýäøõgñ'î4ëœèQæZä¯âMá/àR߬ÞBÞÞ÷Ý ÞNÞ©Þ)ßÀßpà5á âôâìãíäøå çè9éNêcëkìní_î>ï ðµðBñ®ñéñüñØñ|ñäððñîšíîëêãç†åèâ$à7Ý5Ú#×ÔÑ3Î|ËÉÄÆ×Ä?ÃÂ$ÁžÀƒÀ´ÀLÁ*ÂXÃÍÄxÆaÈqʰÌÏƒÑ Ô¯ÖQÙܺރá4äóæªéVìï¥ñGôÕöfùáû_þÈ/‰Ø! [ ŽºÖñüÿóßÈ Ÿ"}$D&(Ò)+E-ô.ž0B2á3y5 7–8 :˜;={>ã?7A~B¼CÜDõEçFÆG‚HIƒIºI¿IˆI IIH9GÒEDüAˆ?°<ƒ9ñ52ä-t)Æ$ð÷õì÷ nìýµù¿õòÃîÈëéÃæ¸äÿâádà|ßËÞTÞÞôÝ Þ<ÞšÞß¡ßMàáàáÉâ¸ã¼äÁåÖæççéê,ë8ì:í1îïàï•ð'ñ˜ñàñøñáñŽññ5ð1ïÙíIìlêVèüånã°àÈÝÌÚ»×­Ô¨ÑÁÎÿËzÉ,Ç4ňÃ;ÂFÁ¸À}À¬À%ÁýÁÀÄ$ÆÈ Ê=Ì”ÎÑ’Ó&ÖÓØ‚Û;Þôà°ãkæ éÔëî%ñÃóYöäøhûãýPºe± é %Jp†—žœ“g F"$ï%·'|)5+ô,œ.M0ð13*5¾6I8Ó9O;Ê<5>?ò@BBzC¨D»E¹F›G]HúHnI¯IÂI’I)IrHqGFqDkB@D=%:«6Ú2¼.T*µ%â õîëî SÍþ…ú„öÍògïZì›é4çåTãÓáŸà¦ßëÞkÞÞûÝÞ2Þ‡ÞõÞ†ß(àèà¸á™â‰ãˆäåæ³çÉèáéöêì íÿíèî·ïtðñ‡ñÍñùñãñ£ñ ñdðbï!î–ìÎê¾èsæðã8á[Þ`ÛTØAÕ?ÒMψÌòÉÇŽÅÛÃrÂuÁÌÀ†ÀÀ ÁÐÁÞÂ8ÄÑşǤÉÎËÎŒÐÓ¨ÕNØûÚµÝlà+ãâå›èOëúí¢ðBóÚõføíúeýÛÿ@ ñ@ { · Þ37;/# ë!À#–%]'&)à*›,M.ö/ 1=3Ü4m6þ7„9;<ë=Z?¬@B­ÿXûG÷„óðïìê©çå©ãâÖàÕßßÞ+ÞýÝÞ'ÞvÞßÞhß àÁàálâ[ãTä[ågæ}ç‘è«é¾êÎëÖìÎí¼îŽïOðìðnñÂñðñëñ®ñ?ñ‡ð˜ïbîåì,ë%éêæläÃáéÞøÛèØÝÕÐÒàÏ ÍpÊ ÈòÅ)ĵ ÁçÀÀ”ÀðÀ¥Á¦ÂóÃ|ÅGÇ:Éd˧ÍÐÒ)ÕÉ×wÚ.Ýåß¡â\åèÇêxíðÂòWõé÷múïü^ÿÌ(‚Ê E vœµÌÒ×ÏÀ©Ž!d#;%'Ë(*B,ù-£/M1î2‰46®799º:5<§=?n@½AC1DNEWFBGH¼HBI—I½I§IVI¼HÛG¥FE8Cÿ@]>e; 8]4^0,Š'Ç"åçáßö '“*üø9ô¼ðƒí­ê èêåägâáà3ßœÞ8ÞÞýÝ"ÞcÞËÞMßæß àdáCâ(ã&ä$å6æCç\èqéŠê˜ë¢ìíŒîfï)ðÐðSñ³ñèñíñ¾ñSñ®ðËïžî5íëŽéZçëäHâxߌÜÙuÖfÓpЗÍîÊÈUÆ~Ä÷ÂÒÁÁœÀŽÀÛÀÁo°Ã,ÅêÆÙÈõÊ7Í™ÏÒ¥ÔH×ðÙ§Ü_ßâ×äŠçEêïìŸï8òÝôd÷÷ùmüêþPµ [ Ú 4IhjwidG1!#á$ª&u(1*ñ+ -S/÷0284Ò5`7ê8p:ë;]=Ë>&@{AÃBóCE!FGêGœH)I†I¹I¬IiIÞHHêFiE£ClAì>ú;»85+1ì,s(µ#áßáÙë týÜøùôfñ$î6ëèWæ]ä·âRá:àXߺÞFÞÞûÝÞUÞµÞ2ßÊßwà?áâüâóãóäýåç#è;éSêaënìkí^î9ïðªð>ñŸñßñíñÊñgñÓð÷ïÜî~íØëòéÊçhåÍâàÝÚ×úÓÑ ÎsËòÈÀÆÓÄ@ÃÂ*Á©ÀÀÂÀ_Á8ÂsÃÜÄ“ÆsÈŒÊÃÌ%Ï—Ñ%ÔÄÖlÙ ÜÖÞ“áLäç»élìï¸ñYôçöwùóûmþÚ=šæ, l šÇäú   éÒ «"…$P&(Ú)™+N-û.¨0H2ê3~57œ8$: ;=‚>â?;A~B½CÛDòEäFÃGxHIuI±I³IvIýH6H#G¼EýCâAl?•ÖêØ—ÛSÞáÉã|æ7éæë“î9ñÔóköõøyûóýaÇ$t½ ü -\z”¤¨ª‹s N"*$÷%Â'†)?+ú,¦.U0÷1˜3/5Ä6Q8Ö9W;Ì<9>Ÿ?õ@BB|C¦D¹E·F—GWHôHbI©I²IˆII_H^GF[DPBê?*=:Ž6¹2.4*˜%Å ÚÔÓ× üAÃþwú}öÇòfïXìœé6ç!åZãÛá¦à­ßøÞrÞ'ÞÞÞ;Þ’ÞüÞ“ß/àõà»á¦âŒã’ä“夿¶çÎèåéöêìíþíæî±ïnðñ|ñÅñéñÖñ‘ñ ñPðKï î~ì´ê¡èYæÐãá=ÞGÛ9Ø.Õ&Ò?ÏuÌëÉÇÅÓÃzÂxÁÕÀ’À¨ÀÁÞÁõÂJÄèŵǼÉãË9΢Ð(Ó¿ÕcØÛÉ݃à>ãøå¯èbëî´ðVóèõzøüúwýëÿO°N Š Ä î.:IA?) ñ!Î#›%l'*)î* ,U.ÿ/§1E3á4t68‹9 ;„<ò=Y?±@B;CpDE‡FjG1H×HMIžI°I’I.IˆH”GLF±D»Bg@º=¥:C7|3p/+&º!ÑÒÍÑ ì.žÿOû?÷}ó ðìì$êªç†å¯ã#âáàÛßߊÞ2Þ ÞÞ6Þ|ÞëÞqßàÊà˜átâcã\ä`åpæç—è­éÀêÑëÓìÏí¶îïHðåðdñ¸ñâñÝñžñ)ñvðïJîÏì ë éËæRä¦áÎÞÜÛÏØÇÕºÒÏÏýÌdÊÈïÅ&ŤÁðÀ›ÀŸÀÁ²Á¾ÂÄ•ÅYÇTÉyËÁÍ+ЩÒ?Õß×ÚAÝýß¶ârå(èÜêŠí1ðÓòiõû÷€úüüqÿÙ:ŽÚ S „§Ã×ÞäÙÍ´—!n#E% 'Ø(‘*P,ü-±/Q1÷24&6µ7>9À:7<®=?s@¼AC0DNESF?G HµH:IŒI´I—IHI©HÆG“FE%Cß@D>E;ð7>4?0ó+h'­"ÈÎÉÉã …ü ø3ô¸ð„í¬ê"èîå älâá à?ߤÞBÞÞÞ/ÞjÞØÞSßõߣàqáFâ6ã)ä.å8æKç_èwé‹ê˜ë¥ìšíŒîbï!ðÊðJñ©ñÜñÝñ®ñAñšð´ï†îídëué:çÓä)â_ßlÜkÙYÖTÓZЉÍÞÊzÈLÆ}ÄøÂ×Á ÁªÀ˜ÀìÀŽÁƒÂÆÃAÅÇìÈËLͳÏ,Ò¼Ô_×Ú½Üuß/âêä£çUêí¯ïOòëôz÷ú‚üöþcÄk© é ?Yq{}{iW9!#ê$³&€(;*ø+ª-Z/1£2?4Ø5e7õ8p:ñ;b=Ê>/@yAÅBóCEFGãG˜H II¬I¡IXIÌH÷GÏFYEƒCWAË>á;›8ü4 1Ï,P(œ#¿ÈÄÆÔ eûüÒøñôbñ!î8ëœè[æaä¾â\á?àeß¿ÞTÞÞÞ$Þ]ÞÃÞ7ßÖ߀àGáâãùãúäæç&èBéSêcërìhí]î8ïýï©ð2ñ–ñÔñßñ¶ñ\ñºðåïÂîgí»ëÛéªçNå®âíßÝÚóÖèÓîÐÎ`ËíȵÆÓÄ?à Â0ÁµÀ˜ÀÖÀlÁPÂÃöħÆÈ¢ÊÞÌ7Ï´Ñ9ÔÝÖƒÙ6ÜîÞ§áaäçÏé€ì+ïÊñmôøö†ùü|þìK¨ö< w «Òò ø× ¼"‰$_&"(å)¢+U-/®0P2ò3„57£8(:¦;=…>ç?:AƒB¹CÝDíEåFºGuHIoI£I¨IfIíH#HG£EèCÆAR?vÂWÁÅÀœÀÃÀKÁ ÂBëÄPÆ+È9ÊkÌÄÎ4Ñ¿ÓWÖÙ°ÛeÞ!áÚã•æIéúë¨îGñéó{öù‹ûþr×2…Ê <h‡¢­·³¨™z \"2$&Ì'Ž)I+-¯.[02385Ê6U8Ý9X;Ó<;>¤?õ@DB{C¥D¹E±F”GOHìH\IšI©IuI ILHJGîEBD7BÏ? =è9o6™2€.*}%¦ ¿º½ é4²þrúpöÇò^ï]ì™é=ç#å_ãåá«à¸ßßzÞ1ÞÞÞHÞ˜Þ ß˜ß<àúàÆá¬â—ã–ä™å¬æ¹çÕèãéûêìíÿíßî±ïdðþðmñÀñ×ñËñ}ñûð;ð4ïòícì˜êˆè:æ¸ãþà'Þ)Û#ØÕÒ(ÏlÌÙɎLjÅÕÃzÂÁÛÀ À¶À,ÁôÁÃdÄùÅÎÇÒÉüËOηÐBÓÓÕ~Ø(ÛáÝ™àQãæ¿èxë îÉðeóÿõ…øû‡ýøÿc¹W œ Î ü8JOTD; "Ô#«%n':)ñ*­,\. 0¬1O3å4}689;‰<ô=^?³@B@CiD…EFiG-HÍHFI”I£I‰II{H{G9FšD¡BN@›=Š:"7_3P/÷*a& !²»³¼ Û“ÿBû6÷yóðêì&ê«çŒå´ã*âèàäß!ß•Þ<ÞÞÞ<Þ‰ÞòÞ|ßàÖàá~âhãcäiåpæˆç˜è±éÅêÌëÙìÊí·î„ïFðÛð^ñ¬ñÖñÎñññ`ðkï3î³ìôêòè®æ8äˆáµÞ¿ÛºØ«Õ¬Ò¶ÏõÌRÊÈåÅ'ķ¬ÁöÀ¨À«ÀÁÆÁÏÂĪÅoÇnÉËÛÍ@ÐÁÒVÕöפÚZÝàÏâå@èìêžíEðâò}õ øŽúýÿèIè, ` ‘´ÒàîêéÕÀ¡!w#P%'ß(*U,.¶/Y1ý2—4+6½7A9Å:=<°=?t@¿AC2DIETF8G H­H4I‚I¦II4IH°G€FëD CÅ@(>+;Ï7#40Ø+I'‘"¬³²´Î tüø0ô±ð„í«ê%èôå äwâ#áàG߬ÞMÞÞÞ5ÞyÞÝÞ^ßý߬à{áMâ=ã0ä5å>æOçcèzéŒêœë¢ì›íˆî\ï!ð¿ðDññÐñÏñžñ0ñ†ðžïpîíLëYéçµäâ@ßVÜNÙDÖ>ÓIÐyÍÔÊnÈJÆxÄüÂØÁÁ¯À§ÀúÀŸÁ—ÂØÃXÅÇÉ$ËeÍÉÏCÒÕÔs× ÚÒ܈ßGâüä¶çlêíÃïbòûô‹÷úü ÿqÒ,u» ô $Jh{‰‡ˆqf/@~AÂBöCE F GàGHIxIŸI–III»HäG¼FAElCÂ;8Ü4î0¯,2(#£­­¬Ä ôXîüÉøíô[ñ!î5ë è^ægäÄâbáGànßÈÞ`Þ!ÞÞ,ÞjÞÉÞEßÝ߉àQá%â ãäÿä æç+èFéTêiëkìníVî7ïøï¢ð*ñŒñÇñÑñªñEñ«ðËï°îKí¤ë¼é‘ç.å–âÏßåÜçÙÚÖÔÓÛÐÎVËáȱÆÍÄAà Â5ÁÁÀ¡ÀèÀzÁd”à żƥȸÊõÌPÏÉÑSÔòÖ™ÙNÜßÀátä1çäé’ì>ïÞñ}ô ÷™ùüþø_´H ˆ ¶ß$$#å Â"–$h&*(ò)¨+_- /¶0Y2ö35!7¨8/:©;=‹>è?=AƒB¹CÝDìEÞF»GjHI_I I”I_I×HHùFEÌC®A5?Y<)9“5»1„-)l$˜¨¦¨º á?Çý–ù«õ òÀîÂëéËæÇäã£á~à•ßèÞpÞ-ÞÞ%Þ^Þ´Þ-ß½ßià'áûáàâÍãÐäÔååæöç éê3ë9ì:í)î ïÑï„ð ññ¸ñÔñ¯ñ]ñÊðúïèî“íøëêýç«åã]àvÝ}Úr×gÔnÑÎÖËZÉÇ+Å…ÃFÂZÁÑÀ¦ÀÒÀ\Á0ÂXþÄfÆDÈMʇÌ×ÎPÑÓÓpÖÙÇÛ{Þ7áðã§æ_é ìºî]ñøóöùœûþé>•Ø  Jt—ªÀ¾Â´¡Š a"@$ &×'–)S+ -º.b02¤3A5Ì6a8Ý9a;Õ<@>¦?ú@BBC D»E«F”GDHëHKI˜I•ImIôH=H3GÛE(DB±?ò<Å9V6w2a.÷)Z%Ž  ££­ Ö"¥þfújö¿ò]ïYìé?ç'åhãèá¶àÀßߊÞ6ÞÞ!ÞQÞ¤ÞߢßDàáÐá²âžãžä å®æÂçÓèìéúêìíúíßîªï_ðõðeñ±ñÎñ·ñpñçð$ð ïÖíKì|êmèæœãàà ÞÛ ØÕþÑÏ\ÌÏɆǂÅÖÃ}„ÁæÀªÀÅÀ=ÁÂÃuÄÆãÇéÉÌcÎÕÐTÓðÕØAÛ÷Ý®àiã æØèˆë6îÙðxóö˜ø!û–ý nÏi ª Û +DX[^QC) "ã#°%|'A)ü*µ,e.0¸1R3ñ468’9;Š<ú=_?¶@B?CkD€EFbG(HÆH>IˆI›ItIIbHkG#FD‹B0@=m:7B30/×*F&~!šž¦ Ç ƒÿ9û-÷tóðêì&ê®çå»ã/âñàíß)ß ÞEÞÞ ÞEÞ”ÞüÞ…ß#àßà¥áˆâoãjäoåxæ‹çŸè²éÆêÐëØìÉíµî€ï=ðÙðPñ¤ñÈñ¾ñññNðTïî›ìØêÕè”æäná—ޥۡؕՒҫÏÞÌNÊñÇãÅ&ĸ²ÁýÀ²À¼À ÁÛÁßÂ2ľʼnÇ~ɬËìÍ]Ð×ÒmÕØ»ÚoÝ&àãâ˜åSèë±íWðöòŽõø¢úýÿùX¬÷8 p ÂÝïøùñáÌ©!†#W%!'è(¦*],.»/d13456¿7K9Ç:D<°=?r@ÃAC-DOEJF:GHªH(IyI›I}I'IˆHŸGeFÚDëB¯@ > ;´740¶+.'p"”–›žº ùd üö÷*ô®ðí®ê&è÷åäyâ/áàQß¶ÞWÞ#ÞÞ<Þ„ÞæÞkßà¼àzá^â?ã:ä:åCæUçhè|é‘ê›ë£ìší‡îXïð¸ð<ñ‘ñÄñÀñŽññrð‡ïYîèì3ë<éç–äôá&ß9Ü6Ù,Ö(Ó7ÐlÍÅÊhÈBÆyÄüÂÞÁÁ¹À¶À Á°Á¬ÂéÃpÅ)Ç"É5˃ÍÜÏ_ÒêÔ‹×6ÚèÜ¢ßYâåÍçzê0íÑïuò õž÷#ú¤üÿƒá9…È  2Tx…”–Œ„jM!*#ú$Ê&(N* ,º-j/1³2M4ã5t7û8:÷;j=Ó>/@€AÄBóCEF GÛG‰HIlI•I†I:IªHÑG¤F-EPC&A>©;]8Â4Í0‘,(a#‰“•—° äJãüÂøåôYñî8ë¢èbæmäÌâháSàußÒÞkÞ)ÞÞ7ÞsÞÓÞPßäß–àVá.âã äåæç6èBé]êdëpìiíVî4ïðïœð ñƒñºñÃñ˜ñ5ñ–ð·ï–î2íŠë éwçåyâ³ßÌÜÎÙÁÖ¿ÓÆÐôÍFËÛȧÆÑÄ<ÃÂ=ÁÉÀ²ÀóÀŽÁt­ÃÅÖÆ¸ÈÒÊ ÍiÏßÑjÔײÙbÜßÔá‰äFçõé¨ìPïññô÷¨ù&üŸþoÁX ’ Çé  .1,! ñ Ì" $p&6(ø)²+f-/»0b2ý3“5&7®83:­;"=Š>í?>AƒBºCÛDèEÞF¯GkHõH\IŽIŒIKIËHûGçFwEµC”A?<< 9x5™1i-ú(Q$}•¡ ×,¿ýŒù¥õò¾îÄë!éÐæÌäã­á…àžßòÞyÞ8ÞÞ0ÞhÞ¾Þ6ßÈßpà1áâçâÖãÕäÛåèæüçé!ê6ë6ì?í"î ïËï{ðñnñ±ñÃñ¢ñJñ·ðäïÓîyíßëêáçåùâ@à]ÝaÚ[×TÔWÑÎÆËQÉÇ&ŇÃIÂ`ÁÝÀ¯ÀäÀjÁEÂjÃÕÄzÆ]ÈcÊÌïÎgÑéÓ‰Ö)ÙÞÛ‘ÞKá伿ré ìÌîoñ ô¡ö(ù«û$þùL¦â ( U‚£¸ÈÎȨ— j"K$&â'ž)\+-½.o0 2¬3E5Ô6e8ã9f;Ø¥?ü@EB{C¦D±E®FŠGCHÞHHI†IŽI[IæH*HGÄEDBš?Ó<­916`2=.Ý)=%o ‰‡Ž™ Äšþ[údöºò\ïYìŸéBç/åjãòá¼àÊßß“Þ?Þ%Þ*Þ\Þ¬ÞߪßNà áÖá¼â¦ã£ä§å´æÅçÙèëéÿêì íõíÞî¥ïZðëð^ñ¤ñÂñ§ñ`ñÒððïÂí/ìeêNèæ|ãÊàíÝøÚð×ëÔêÑ ÏOÌÃÉ€ÇÅÕÀŠÁîÀ¶ÀÓÀLÁÂ.ËÄ'ÆûÇþÉ,Ì|ÎéÐmÓÖ¨ØWÛ ÞÆà{ã6æìèšëJîëðŒóö­ø-û«ýÛ.w ¶ é 6Taih^M3 "è#¾%'M)+¾,l.0½1\3ö4†68˜9;Ž<>_?»@B?ClD|EF\G#H¾H7IzIIgIÿHQHWG FkDoB@a=Q:ä6"3/¼*%&f!}„ˆ ¶ûyÿ+û*÷kóðèì&ê´ç“åÁã6âøàöß3ß©ÞOÞ'Þ)ÞRÞ›Þߌß1àáàµáˆâ{ãpätåæç¤è³éËêÍëÛìÅí²î~ï6ðÐðHñ˜ñ¼ñ°ñmñòð8ð=ïî‚ì½ê¼èsæäMáÞ†Û‹Ø|Õ‚Ò”ÏÓÌ?ÊëÇàÅÄÁ±Á Á¹ÀÊÀ0ÁêÁõÂDÄÓÅŸÇ™É½Ë ÎmÐóÒÕ&ØÑÚ„Ý>àõâ°ådèëÄíjð óõ.ø²ú.ý ÿe¼ C §ÑéúüîÔ¶!#a%+'ò(¯*f,.Á/m1 3¦496Å7R9Ê:I<´=?w@ÃAC2DFENF0GÿGŸH#ImIInIIuHGOFÀDÖB‘@ï=î:”7ã3á/—+'T"v}ƒˆ¨ çWüí÷'ô§ð„í¬ê,èúåäƒâ1á(àWß¿ÞbÞ-Þ'ÞIÞŠÞóÞqßà¾àŠá`âKã?äAåLæUçrèzé–ê›ë¥ì˜íƒîVïð³ð1ñˆñ·ñ²ñ|ñ ñZðvï=îÓìë!éêæ{ä×á ßÜÙÖÓ$ÐY;ÊYÈCÆqÄÃâÁ%ÁÆÀÁÀÁÂÁ¾ÂÿÄÅDÇ3ÉSË”Í÷ÏsÒÕ ×NÚýܸßnâ(åÞç‘ê?íçï†òõ°÷4úµü&ÿ‘óC˜Ò  <f—£™ŽvX!3#%Ô&™(W*,Â-r/1¹2U4ê5y79ƒ:ý;n=Ö>2@AÆBóCEFGØG‚HIeI„II&IœH»G“FE=CAx>‰;B8 4°0o,ù'B#lyz„˜ Ö8Úü¶øßôUñî7ë¦èdætäÏâráYàßÛÞsÞ5Þ'ÞAÞ~ÞÝÞYßïßà`á6âãä åæ!ç9èFé^êhëpìiíSî0ïëï–ðñxñ®ñ¶ñ†ñ&ñð¤ï~îípë†éYçøä\â˜ß³Ü°Ù­Ö©Ó³ÐäÍ;ËËȪÆÄÄFÃÂGÁÓÀ½ÀÁÁ‰ÂÀÃ3ÅìÆÎÈêÊ ÍƒÏõÑ„Ô×ÊÙvÜ3ßãá¦äTç êºìbïòô0÷¹ù8ü¬þzÓ$c ¥ Íþ08>8-ù Ø"¨$}&<(*¹+p-/Ç0e24™5+7¶87:´;&=Ž>ï?@A„B»CÙDçEÙF­GcHïHQI†I{I?I¸HëGÒF_EŸCwA?<ì8Z5z1K-Ø(7$\wr} òý‚ùœõò¹îÆë!éÒæÒä ã²áà¤ßüÞ†Þ>Þ,Þ7ÞsÞÇÞBßÏßzà:á âïâÞãÝäÞåñæýçé$ê6ë8ì;í$îïÆïxðúðmñŸñºñŽñ<ñ ðÒï¸îcíÅëèéÈçqåÞâ$àBÝGÚD×;ÔGÑlλËDÉ Ç"ŇÃNÂcÁèÀºÀóÀ{ÁXÂ|ÃíÄÆsÈ{ʵÌÏ~ÑÔŸÖBÙóÛ¨Þ`áäÐæˆé1ìãî~ñ ô¯ö=ù»û2þ£`°ô 4 c¯ÇÒÛÓϵž x"Q$&è'ª)c+-É.r02°3N5Û6j8ê9i;Ý«?ü@FB|C£D²E©F†G>HÖH@I{IƒILIÔHHG°E÷CëA{?¸<Ž96A2.¾)%X hsu‚ ¶þNú`ö±ò^ïRì¥éBç4åqã÷áÇàÎß!ß“ÞTÞ$Þ<ÞbÞ¹Þ(ß´ßXàáâáÁâ®ã¬ä«å¼æÉçÜèòéüê ìíúíÕî¦ïNðéðPñšñ³ñ™ñLñÂðúïòî§íìEê6èäåcã«àÑÝÞÚÖ×ÔÔÖÑ÷Î?̺ÉvÇ}ÅÒÃÂÁøÀÂÀâÀ]Á*Â?äÄ:ÆÈÊDÌ•ÎцÓÖÀØoÛ!ÞÚà“ãKæé°ë[îñœó3ö»øAûºý'‘é>… Ä ú !J[rqxf\; !"ò#Ç%Ž'R)+Ä,v. 0Ä1b3ý468Ÿ9;“<>c?¾@BACiD{E~FVG!HµH/IrIIZIïH>HDGõERDTBü?E=2:Å63ó.›*&H!_mmz £élÿ!û÷góÿïèì(ê´ç˜åÆã?âýàà9ß¶ÞVÞ4Þ1Þ\Þ¦Þßšß6àðà·á•â‚ãuä}åƒæ•ç¦èºéËêÓëÖìÈí­îyï3ðÅð@ññ­ñ¢ñ\ñÜð(ð#ïííeì¥êè[æáã3áaÞqÛmØhÕjÒƒÏÄÌ3ÊäÇÙÅ"ĿºÁÁÆÀÙÀ?ÁÂÃZÄêŵǰÉ×Ë΋ÐÓžÕ;ØèÚœÝTà ãÆåxè,ë×í}ðó°õAøÁúCý¬ÿuÉ Q ·Ýõ ùßÂ!—#m%3'ü(·*r,.Î/p13©4C6Ê7W9Ð:N<·="?u@ÈAC2DEEJF.GøG›HIhI~IfIIfHxG9FªDºBy@Ð=Ó:t7Æ3¿/{+ð&6"Zegu ÚG÷ûä÷ô¥ð‚íªê0èüåäˆâ<á.àbßÉÞkÞ7Þ2ÞRÞ—ÞûÞ{ßàÊàáiâPãHäFåQæ^çoè„é“ê ë¡ìšíîTï ð­ð%ñ€ñ¨ñ¦ñkñøðKðZï+îµìýêéÍæ^äºáñÞÜÙúÕÓÐJͰÊQÈ=ÆoÄÃæÁ.ÁÐÀÍÀ+ÁÒÁÓÂÄ›ÅXÇMÉhË±Í ÐŽÒÕ¼×`ÚÝÇߊâ:åôç¦êRíüï˜ò1õÁ÷GúÄü8ÿŸU¥ä  LrŽ¡¬®¦˜c!=#%Ü&¢(b*,Í-z/1Â2\4ð5€79‡:3@†AÃB÷CEFGÒGzHIWI~ImII‰H©G|FüDCï@Z>l;"8‚4Ž0S,×'&#P\diˆ Á+Êü°øÔôSñî7ë§èiæväÚâtáeà„ßèÞ{Þ?Þ2ÞJÞ‰ÞåÞcß÷ß§àhá?â"ãäåæ*ç:èKé`êiëqìgíSî(ïêïŒðñoñ¡ñ¨ñwññmðïgîíVëhéBçÕäDâyߘܘٖÖÓ¦ÐÎÍ3ËÀÈ¢ÆÅÄCÃÂJÁÞÀÌÀÁ±Á›ÂÑÃMÅþÆëÈýÊ=Í–ÏÒšÔ5×ßÙÜEßüá·äkç"êÌìxïò²ô?÷ÌùFüÁþ&á3t ¯ á'9EKB9 !à"·$&K( *Ä+x-%/Í0o2 4¡507¼8<:¶;,=>ó?AA…B»CÖDèEÑF­GWHëHFIzIoI0I¥HÙG»FKE‚CbAÞ><Ì8;5\1(-¾($FU_b} ¯¥ýxù–õüñºîÃë%éÔæ×ä&ãºá–à­ßßÞKÞ1ÞGÞwÞØÞDßÞ߀àDáâùâããåääåõæèé'ê7ë;ì7í%îþîÅïlðøð\ñšñ¦ñ„ñ&ñ’ð·ï¦îFí¯ëÊé®çSåÂâ à%Ý/Ú+×&Ô3Ñ^άË<ÉÇ Å‰ÃMÂpÁíÀËÀÿÀÁiÂ’ÃťƊȑÊÎÌÏ–ÑÔ·ÖX٠ܽÞvá.äææšéGìõî’ñ2ô¿öOùÉûFþ¯o½ @ rœ½ÑáäãÕæ „"[$(&ò'±)n+$-Ð.|02½3Q5ä6l8ó9j;ä­?ÿ@HB}C D²E¢F…G5HÐH5IqIwIc?Â@BCChD{EzFRGH­H'IfIuINIÜH0H,GâE9D=Bá?(=:§6ã2Ô.{*ì%'!INYd ÝYÿû÷cóüïçì(ê¹ç›åÌãEâáàIß·ÞgÞ:Þ<ÞgÞ®ÞߟßCàõàÃáœâ‰ã~ä勿˜ç«è¿éÉêØëÒìÇíªîvï,ðÁð5ññ£ñ‘ñMñÌððïÒíNìŠê€èBæÁãáCÞXÛTØRÕUÒtϳÌ+ÊÚÇÖÅÄÿÁÁÔÀâÀTÁ ÂÃkÄÆÊÇÆÉïË7ΟРӰÕTØÛ°ÝkàãÛåè>ëííð.óÃõPøÔúPý¾ÿ*ƒÚ" b š ÃêëË!¤#s%A')Â*x,).Õ/z13²4H6Ñ7[9Ö:P<½=!?}@ÃAC-DGEFF*GóG’HIZIwIUI÷HTHbG'FD¤B[@¶=´:W7¦3¡/\+Ñ&"<LO^ Æ<êûÛ÷ô ð€í­ê0èæ%äâDá6àißÕÞqÞEÞ8Þ^Þ Þ߈ßàÔà™áqâYãOäJåYæ_çxè…é–êŸë¤ì•íîNïð¥ðñsñŸñ“ñ^ñäð9ðBïîšìçêèè³æAäŸáÖÞæÛîØãÕíÒþÏ=Í£ÊJÈ6ÆpÄÃìÁ6ÁÙÀàÀ4ÁéÁàÂ+Ä®ÅoÇcÉËÇÍ#ЦÒ-ÕÔ×wÚ-ÝàßšâRåè¼êbíð©òFõÏ÷YúÔüGÿ±e²ñ . V›«º¶³¤Šo!F#%è&ª(j*$,Ó-ƒ/&1É2b4÷5†7 9Ž::@ƒAÄB÷C EFûFÍGuHöHQIpI^IIsH™GdFçDCÕ@<>Q;8d4o04,º'#5CJVr ±¿ü¥øÓôKñî6ëªèkæ~äÞâ~álàŽßñÞ…ÞIÞ=ÞRÞ•ÞîÞmßà¯àoáIâ)ãäåæ1ç=èQéaêlëoìgíPî%ïçï‚ð ñcñ•ñ›ñfññZðvïPîêì:ëPé"çÀä#âcßyÜÙÖ{Ó‘ÐÃÍ"˼șÆÃÄEÃÂSÁêÀÕÀ#ÁÀÁ­ÂéÃ\ÅÇüÈËPͰÏ'Ò®ÔQ×ñÙ¨ÜZßâÌäç5êßì‹ï(òÂôT÷Øù\üÊþ<—ô<† º ð3ERVOC,!ê"¿$&R(*Ë+€-./Ô0w24ª567À8C:º;/=•>ó?EA…B»C×DãEÑF¥GTHáH>ImIfII™HÂG©F1EmCCAÇ>ç;­85;1 - (õ#)<DOf  ýšýoùõùñ·îÂë)éÖæÞä*ãÂážà¹ß ß›ÞPÞAÞKÞ‡ÞÜÞSßäߌàLáâÿâëãëäëåûæèé+ê7ë<ì7í$îúîÁïeðñðRññšñsññ}ð¤ïŽî.í–ë®é”ç7å§âíß ÝÚ×Ô#ÑJΣË.ÉÇʼnÃTÂtÁúÀÔÀÁ›Á¤ÃżƠȫÊáÌ;ϦÑ6ÔÇÖuÙÜ×ÞˆáEäùæ®é[ìï§ñ@ôÖö[ùÞûTþÀ&{Ï R |¬Çàìñìâͱ "a$4&ù'¼)v+*-Ú.ƒ0$2Ã3X5ç6v8ó9u;ã

    ­?AIBzC£D«E¥F{G2HÆH/IeIiI.I´HóGáF‚EÇC·AF?~ÞLÞyÞÉÞ>ßÃßmà$áóáÐâ¿ãµä½åÁæÖçáèøéÿê ìíùíÍîœïDðÖð?ñ„ñ•ñ€ñ&ñðÑïÅîwíæëêè¬å+ãtàݨڨצԲÑÔÎ&Ì¡ÉlÇqÅÕǞÁ ÁØÀÁ{ÁOÂhÃÊÄiÆ?ÈDÊsÌÁÎ2ѲÓKÖëØœÛLÞá¼ãsæ'éØë€î%ñÀóUöÝødû×ýI°^Ÿ à =_w†‹€nT 1" $Ö%¦'`)#+Ô,‡./0Ó1q3 5›6&8ª9';œ< >g?Ã@BDCfDyEvFPGH©HI^IiI;IÓHH GÆE&DBË?=ú9‡6Ç2¶.]*Í% !,9>T {ÏNÿ û÷[óûïåì*ê½çžåÔãKâáàOßÅÞnÞEÞHÞmÞ¼Þ"ß«ßKàþàÌá£âã…äˆåæç°è»éÒêÐëÙìÀíªîpï$ðºð)ñyñ’ñ†ñ8ñ»ðùïüî¹í7ìmêjè!æ«ãúà-Þ<Û?Ø:ÕBÒbϧÌÊÓÇÑÅ ÄÄÂÇÁ!ÁàÀïÀdÁ Â.Ã…ÄÆäÇÝÉÌQδÐ8ÓÇÕhØÛÅÝ€à4ãíå¢èPëîžðDóÎõgøàúcýÍÿ9’è0 p ¦ Òô ') øÒ!¯#}%I' )Ë*,1.Ý/1#3·4L6Ú7]9Þ:R<Â=#?}@ÆAC.DCEEF%GíGŽHIVIdILIãHEHNGFwDB@@š=˜:87‰3„/;+·&ü!$19Hp ´/áûÓ÷ôžð€í®ê3èæ)ä–âLá=àußÛÞ~ÞNÞBÞiÞ§Þߎß*àÜà ázâ_ãTäWåWæmçsèé•ê£ë ì˜ízîHïð˜ðñfññ‰ñIñÔð#ð-ïþíìÌêÎè—æ&ä„á¸ÞÑÛÑØÒÕÒÒòÏ*ÍšÊCÈ/ÆqÄÃóÁ=ÁæÀëÀDÁûÁôÂ@ÄÃņÇ{É•ËÞÍ;мÒFÕè׎ÚBÝ÷ß®âfåèÌêyí ð»òVõá÷júâüYÿ¿v½ 9 d¥»Âľ¬™u!S##%ï&´(s*+,Ý-‰/.1Ñ2f46‰79’: 9@†AÇBóCEFûFÅGoHïHEIeIRIùHjHGTFÍDîBº@$>1;ê7B4T0,œ'í")6<d ž²üžøËôIñî7ë¬èqæ‚äåâˆásà˜ßùÞŽÞUÞDÞ_ÞÞøÞwß à¸àzáNâ3ã$ä!å'æ4çAèVébêmëqìcíQîïáï}ðñYñˆñ‹ñWñîðEðbï8îÐì!ë5éç£äâFßaÜgÙgÖhÓ}еÍË·ÈÆÆÄAÃ$Â]ÁïÀéÀ-ÁÓÁÁÂùÃxÅ*ÇÉ,ËjÍÅÏ?ÒÅÔg×ÚÀÜlß)âÞä”çJêñìžï7òÙô^÷ñùdüàþG©NŽ Ì ø#=R^a[M7!÷"Ç$—&\(*Õ+ˆ-4/Þ0z24ª5@7Ã8G:À;0=š>ò?IAƒB¼CÔDâEÌF GNHÖH8I^IZI IˆH¯G—FEXC(A«>Ì;851ð,~(Ý# %-7U ŒôýeùŒõññ¸îÃë(éÞæàä2ãËá¥àÁßߢÞ^ÞHÞXÞÞçÞ[ßðß’àUá#âãöãíäõåýæ èé-ê9ë=ì6í î÷î½ï[ðìðBñ…ñŠñbññiðïwîí{ë”ézçåŽâÑßïÜÚ÷ÖÿÓ Ñ<ΕË%ÉûÆÅŽÃQ‚ÁþÀæÀÁ°ÁŒÂ¾Ã$ÅÙÆ±ÈÅÊ÷ÌQÏ¿ÑKÔáÖ†Ù8ÜæÞ£áUäç¾érìïºñTôâöqùëûdþÐ2Û ] Œ·Ôì÷þøí×¾ –"o$<&(Æ)}+4-â.†012Ã3c5í6x8ü9t;ë±?AGB}C D©E¢FtG0H»H&IYI[I!I¢HßGÏFhE³C™A.?_<89¸5ã1Ä-c)Å$ )0I {Úeþ6úFö¥òVïSìªéKçCåƒã âÞàìß5߸ÞiÞJÞUÞ‚ÞÖÞCßÑßsà.áùáÚâÃã¾ä¾åÊæÖçëèóé ëì íðíÎî–ï=ðÏð4ñwññkññ‰ð»ï°î_íËëøéãç’åãWà…ÝÚדԛÑÉÎÌÉbÇpÅÔâÁÁäÀÁŽÁaÂ|ÃßÄ€ÆTÈ\ʈÌÛÎFÑËÓ_ÖÙ¯ÛdÞáÑã‰æ7éïëî8ñÒódöñøpûëýU¿j¯ ì !Jk„‘˜—Šx^ <"$ã%©'o)&+à,Œ.70Ú1x35£6'8³9(;£< >k?Ä@BDCcDyEnFOGH¥HIRI^I+IÃHHGµED B§?ô<Ù9m6©2—.D*¯%ô $'@ l¾Eÿû÷[óôïëì(êÃç£åÙãTâáàUßÑÞvÞNÞSÞvÞÇÞ,ß¶ßQàáÔá©â™ã‰äŽå“æ£ç±èÃéÎê×ëÑìÇíŸîpïð²ð"ñkñˆñsñ-ñ¤ðçïæî í!ìRêOèæãààÞ"Û(Ø%Õ0ÒSÏ—ÌÊÉÇÒÅÄÌÂÇÁ.ÁçÀÁpÁ3ÂBÖÄ-ÆõÇõÉÌdÎÎÐLÓßÕØ)ÛÞÝàNãüå¸ècëî²ðQóåõpøøúlýáÿE ø; € ° âþ '70* Ý!¹#…%T')Ô*†,<.à/Š1&3¿4S6Ý7c9ã:T<Ç=$?€@ÈAC.D@ECFGéG‚HIFI^I8IÙH-HBGöEgDoB(@=|:7l3f/ +™&ã!"6\ ©"×ûÍ÷ôœð€í®ê9è æ2äšâTáGà}ßæÞˆÞSÞRÞmÞ·Þß›ß0àçà¦á„âdã]äYå^æoçxèé—ê¤ë ì”ívîIïùï–ðñ[ñ‡ñvñ;ñÂððïäíkì²êµè|æ äiáŸÞ¶Û¾ØºÕÂÒßÏÍŽÊ<È+ÆpÄÃùÁCÁõÀóÀZÁ ÃOÄÚśǎɯËñÍUÐÎÒ_ÕüפÚWÝ àÂâzå-èàê‰í3ðÊòiõð÷zúòügÿÍ.Ë E r™±ÆÎÏǺžƒ!Y#.%ø&½(|*0,è-Œ/91Ô2n46Œ79”:<}=ß>=@…AÇBôC EFôFÂGeHêH7I[IDIëHWHmGAF´DÚBž@ >;É7)450ù+'Ò"ÿ*Q ‘«ü–øÅôIñî<ë­èwæˆäìâá{à¢ßߘÞ^ÞNÞkÞ¤Þß|ßà¿à„áTâ;ã*ä(å,æ7çEèWédênëqìbíNîïÚïvð÷ðNñ|ñ|ñJñØð7ðGï$î·ì ëéïæƒäñá)ßHÜQÙOÖUÓkÐ¦Í Ë­È‹ÆÅÄDÃ)ÂbÁüÀòÀ@ÁãÁÓÂĉÅAÇ-ÉCËÍÞÏRÒßÔz× ÚÑÜ„ß=âòä©çYêí¬ïNòäôv÷ùùyüìþV¹ \ž Ö +J`gmfVD#!þ"Ô$œ&g($*Ü+’-:/æ02"4±5E7Ç8N:Â;4=œ>õ?IA…B¸CÖDÚEÍF˜GIHÏH*IWIJIIxHœGFE±;s8ä4ÿ0Ñ,b(À#ñ #C }å„ý\ù†õññ´îÅë,éàæèä8ãÐá±àÇß"ß«ÞfÞTÞaÞ™ÞñÞeßöß àYá.â ãûãöäøåçè"é-ê=ë:ì6íîôî´ïZðÝð?ñsñ€ñRñòðWðyïaîÿì_ë~éYçåpâ¶ßÙÜãÙæÖæÓýÐ+ΊËÉôÆÅŽÃYÂ…Á ÁïÀ,Á¿Á¢ÂÍÃ>ÅêÆËÈÚÊ ÍhÏ×Ñ_ÔùÖ›ÙMÜüÞ¸áhä&çÑé„ì)ïËñdôõöùûûuþÞAœç0 g œÀãö øãà ¥"u$E&(Ê)Š+9-ê.052Ì3h5ò68:y;î´?AJB|CŸD¦EŸFpG(H¶HINIPII—HÊG»FTE™C„A?F<9ž5Ã1¨-D)ª$ä6 iÊ\þ+úBö òTïSì¬éPçGåŠãâãàøß<ßÄÞqÞVÞ^ÞŒÞßÞMßÚß}à6áâââÉãÇäÃåÏæÝçèèýéë ìíñíÊîï9ðÃð-ñkñ}ñ^ññzð¢ïîCí·ëÙéËçuåòâAàeÝzÚw×}ԈѹÎÌ“É[ÇnÅÑÔ¤Á#ÁìÀÁœÁrÂÃõÄ’ÆlÈqÊŸÌòÎ^ÑàÓwÖÙÃÛ{Þ,áæã›æMéþë¦îGñåótöùûúýfÍ$xº ý +Xy‹¤ž¥•‚j D"$ê%µ'v)1+ç,“.?0á135§6/8¶9/;¤<>l?Å@BBCdDuEmFHGHšH IEISII°HöGóFŸEòCòA?Õ<¾9N6Š2y.#*”%× ö , Y¯7ÿúú÷Tóòïéì*êÅç©åÞã\âá#à`ßØÞ‚ÞWÞ]Þ‚ÞÍÞ8ß¼ß\àáØá·â›ã”ä‘åšæ¨ç³èÈéÎêÚëÐìÄíŸîiïð©ðñbñyñgññ”ðÒïÏî‹íì<ê1èîåqãÈàöÝ ÛØ Õ Ò=ÏÌÊÇÇÈÅ ÄËÂÏÁ7ÁðÀÁ}ÁIÂQîÄ?Æ È Ê/Ì€ÎàÐgÓðÕ›Ø=Ûòݪà[ãæÆèxë#îÅðbóøõ€øû|ýòÿR³L ½ ï )7??3& ë!¿#‘%[' )×*”,>.í/1,3Ç4V6æ7f9å:\<Æ=)?‚@ÅAC*D@E=FGÞG€HóHÙ N „¡ÁÑØÞÐŪŒ!f#5%'Ã(†*:,ì-™/;1ß2s4 6•79œ:<=å>;@ŒAÂBõCEFðF¼GaHÞH2IMI7IÜHCH]G'F¢D¾Bƒ@ï=÷:°740Ø+d'³"äú9 †ñ¤ü‰øÄôAñî;ë¯è{æäñâ˜á‚à«ß ߢÞgÞ[ÞqÞ²Þ ßŠßàÌà‰á_âAã2ä-å3æ<çLèYégêpëmìfíDîïÎïtðéðIñlñsñ3ñÌðð6ï îŸììêéÍænäÑáß/Ü5Ù9Ö@ÓZЕÍýʣȇÆÀÄFÃ,ÂkÁÁþÀQÁðÁëÂÄ¥ÅTÇFÉX˘ÍôÏjÒ÷Ô‘×6ÚèÜ—ßTâå¾çkêí¾ïaòöô†÷ ú‡üÿþfÇh¬ æ =TmtwqdJ1!#à$¥&p(-*å+™-E/ê0Ž2$4»5H7Ð8P:Ç;9=ž>ù?GA‰B¸CÔDÚEÆF”GAHÇH"IJI=IïHfH‹GjFïD!Cù@q>•;T8Æ4ß0³,F(¡#×îÿ 1 jØuýTù€õèñ·îÁë0éäæìä?ã×á¹àÏß-ß³ÞqÞ^ÞiÞ¤ÞüÞkßà¦àdá4âãäýäÿåçè#é2ê;ë=ì5íîðî¯ïSðÓð8ñdñtñAñãðBðcïKîåìHë_éCçáäXâ—ßÁÜÇÙÑÖÐÓëÐÎ|ËÉìÆÅŠÃaˆÁÁùÀ?ÁÍÁ¶ÂáÃRÅÇàÈòÊ%Í€ÏíÑzÔ ×³ÙaÜßËáä9çãé›ì8ïáñsô ÷ùü‚þðP©÷< w ©ÎñÿíÑ ­"‚$L&(Õ)+D-î.œ082Ø3j5ù6…8:€;ñ¸?AJB}C›D¨E˜FnGH®HIDIBII„H¸G§F=ECgAù>#<9z5¨1‰-%)$Êåø" W¼Mþ$ú5ö¡òLïXì¨éVçJå’ãâïàüßHßÍÞyÞbÞdÞ›ÞåÞZßá߆à@á âëâÏãÏäÈåÕæßçïèýéë ìíííÇî‹ï1ð¿ðñbñoñOñöðað–ï~î4í•ëÅé©ç`åÓâ&àLÝ^Úb×gÔvѧÎúËŠÉSÇkÅÔÔ¯Á(ÁüÀ+Á­Á„¤ÃŬÆÈ‹Ê´Ì ÏuÑöÓÖ-ÙÞÛÞDáûã¯æbéì·î^ñóó‡öùû þvÚ7„Ë 8i‚ž©°­¢s Q"$$÷%¼');+ì,Ÿ.E0é1†35¬688µ99;¥<>p?Å@ B@CdDtEhFGGúG˜HýH=ICIIŸHãGâF…EÞCÖAv?¹<¢9.6o2X.*u%º Ýîü F¢(ÿòúùöMóõïâì1êÃç°åâãbâ&á*àkßßÞŽÞ_ÞjÞˆÞÛÞ>ßÈßeàáãá»â¥ã™ä˜å¡æ©çºèÈéÒêØëÒì¿ížîcïð£ðñUñoñTñ ñ~ðÂï´îxíæë%êèÕåSã¯àÙÝôÚó×üÔÒ1Ï}ÌʼÇÉÅÄÏÂÖÁ=ÁÁÁ”ÁTÂhÃÁÄTÆ&È!ÊHÌ•ÎúÐ{Ó Ö®ØUÛ Þ»àuã'æÞè‰ë7îÖðvóö–øû‘ýýÿdÀZ š Í ù4EJJ@. ô!É#š%g'#)æ*˜,H.ö/“173Ê4^6ë7j9í:]<Ì=+?ƒ@ÉAC)D?E9FGÚGwHëH3IDII·H HGÏE5D>Bõ?D=C:á6.3,/â*`&©!Ôåø: ‡Âû¼÷ô–ð|í²ê<èæ<äªâ`á\àŠßûÞ›ÞgÞeÞ‚ÞÉÞ)ß­ßCàöàºáâvãhähåiæwç…èé¡ê£ë ì“íoî=ïòïƒðþðDñmñYññ›ðêïêî·í9ì~ê~èGæÑã5áfއۆؓՖҾÏÍvÊ.È!ÆoÄÃÂQÁ ÁÁwÁ.Â+Ã~ÄÆÊÇ»ÉÜË Î‚ÐýÒŒÕ)ØÒÚ‚Ý5àìâ£åTèë±íSðöò…õø˜úý„ÿîKžê) ^ ’ªÓ×ëâàε•!p#<%'Ì(Œ*F,ò- /D1â2~46›7!9Ÿ:<„=å>A@‰AÆBòC E FîF¶GYHØH#IFI&IÏH1HHGF‰D¦Bk@Ñ=ß:7í3÷/À+D'š"Æãê& sæ–üƒø¼ô>ñî<ë³è~æ“äøâžáà°ßß©ÞrÞdÞyÞ½Þß•ß$àÓà“áfâHã;ä2å9æBçLèaéeêtëlìdíEîïÏïhðäð;ñdñañ&ñºð ð!ïöí„ìØêäè·æQä¶áõÞÜÙ%Ö*ÓIЈÍñʜȂƽÄLÃ,ÂwÁ ÁÁ[ÁÂöÂ9Ä´ÅlÇZÉpË¯Í Ð€Ò Õ¦×NÚûܯßfâåÐçê,íÓïpòõ—÷ú›üÿzÑ/u¸ ô Ibuƒ~lV:!#ç$³&u(7*î+ -L/ò0’2-4À5O7Ó8W:Ê;>= >ü?HA‰B¸CÑDØEÂFŽGu;<8¥4Å0“,)(†#»Öèõ XËhýPùrõíñ­îÆë0éææôäBãâá½àÛß3ß½Þ{ÞeÞtÞ¯Þßyß à®àpá9âã äåæ çè&é6ê;ë>ì2íîìî«ïJðÎð*ñ\ñdñ1ñÒð-ðRï2îÎì0ëEé)çÈä;âߦܲٹּÓÙÐ ÎtËÉìÆÅŽÃbÂ’ÁÁ ÁGÁäÁÂÂøÃfÅÇùÈË>Í”ÏÒŒÔ'×ÇÙwÜ*ßÜá˜äHçüé¨ìNïññ„ô÷ùü•þûc³G † ³Þø  øÜ ´"Œ$X&(Þ)˜+K-ù.¡0?2Þ3o57‰8:†;ð<^>·?AMBxCŸD¡E–FiGH¨HI9I5IõHqH©GF)EhCRAÚ> <á8^5‹1j- )p$¯Ìâì F®Bþú3ö˜òOïRì¯éVçPå–ã#âôààOßÔÞ‡ÞgÞrÞ¡ÞòÞaßëߎàGáâðâØãÔäÎåÛæáçõèüé ëìíëíÅî„ï,ð´ðñUñañ@ñãðSð{ïoîí‚ë¨é”ç@å½â à2ÝIÚI×UÔdÑ–ÎòË|ÉQÇeÅ×Õ¸Á.Á Á6ÁÀÁ–µÃſƗÈÊÏÌÏŒÑÔ ÖHÙïÛ¤ÞXá äÅæré&ìÉîmñô–ö%ùŸûþƒëB“Ú  Kn“§¶º¸«™{ ]"+$&Ã'ˆ)B+ö,¥.M0ï1Œ3"5³6:8¿99;ª<>s?Å@ B?CdDpEgF>GøGŒHöH2I6IIŒHÔGÌFsEÄC¿A[?Ÿ<…96O2?.è)\%ž ÄØå 3–ÿéúñöLóîïèì-êËç±åìãhâ-á6àoßîÞ’ÞoÞmÞ–ÞâÞIßÏßoà!áëáÂâ«ã äŸå¤æ­ç¿èÈéÖê×ëÓì¼í›î]ïð™ðñKñ_ñHñøðnðªï£î\íÑë êúçºå9ã’àÂÝ×Úß׿ÔôÑ#ÏmÌùÉ´ÇÄÅÄÐÂÞÁEÁ Á)Á ÁiÂzÃÕÄjÆ9È8Ê_̪ÎÑ‘Ó"ÖÂØkÛÞÏà‰ã;æðèžëGîëð‚óö ø)ûý uË#f § Ù &BLXTI: þ!Ô#£%o'-)í*Ÿ,R.ú/ž1;3Ñ4f6ì7s9ï:_<Ò=*?‡@ÉAC(D=E6FG×GnHäH(I9II¨HûGGºED(BØ?-=":É6 3/Â*F&Š!¿Éäô & {øÿ»û´÷ÿó“ð{í¶ê<èæ?ä²âjáaà•ßߢÞvÞjÞÞÐÞ5ß¶ßLàáÀášâ|ãoälåpæzç‹è‘é¤ê¡ë¤ìíoî9ïéïððð=ñ]ñMñ ñŒðÓïÖî¢íìdêfè'æ¼ãáOÞjÛrØ{Õ…Ò­ÏòÌoÊ!È!ÆiÄÃÂ^ÁÁ Á…Á=ÂBÃŽÄÆÝÇÒÉóË7ΙÐÓ£Õ=ØéÚ–ÝKàãµåjèëÄífðó™õ&ø¨ú%ý”ÿýY¬ø7 l ›½×ìíõåÛ¾¢!v#K%'Ù(”*N,ù-ª/J1ê2…46¤7#9¦:<„=ì>>@AÆBòCE FäF¶GNHÒHI8IIÂHHëµè‚æ™äþâ¥á•à»ß ßµÞzÞmÞ†ÞÄÞ ßß+àßà—árâNã@ä;å;æGçTè^énênëpìbíAîïÇïcðÛð0ñWñSññ¥ðùï ïßínì»êËèšæ6ä›áÜÞúÛÙ ÖÓ:ÐuÍêÊȀƼÄKÃ6ÂxÁÁÁmÁ ÃLÄÉŃÇoɇËÅÍ"ИÒ$Õ»×fÚ ÝÉßxâ0ååç’êBíáï†òõ«÷*ú«üÿ‡ã:„Æ  -Tm„Š…z`B!#ï$»&‚(:*ù+§-U/÷0œ2/4Ê5R7Ú8Z:Ï;?=¥>ü?KAˆB¶CÒDÓE¿F‰G4H¸H I5I!IÓHCHfGAFÂDôBÂ@>>[;84¢0y, (h#¡½Ïã LºbýBùqõçñ­îÈë1éëæúäFãìáÂàèß9ßËÞ‚ÞqÞ~Þ¸Þ ßßà·àváEâ ãäå æçè,é7ê=ë>ì/íîäî«ï>ðÈðñRñSñ%ñ¾ðð=ïîºìë/éç¯äâfß‰Ü›Ù Ö©ÓÆÐýÍeËÉáÆÅÃgšÁ)ÁÁWÁñÁÛÂÄÅ(ÇÉËUÍ©Ï Ò¢Ô;×àÙ‹Ü?ßóáªä]çê»ì`ïò–ô,÷­ù1üŸþlÇX Ãé"."ÿé »"™$\&.(á)¥+P-/ª0C2è3t578 :‰;ôµ?AGB~C—D¥EFdGHžHÿH-I)IäHbH“G€FEUC4AÁ>ñ;Ã8A5l1N-ê(W$’´ÇÛù ;š<þ ú.ö“òOïQì³éWçYå›ã+âþà à^ßÙÞ–ÞnÞ~Þ«ÞùÞmßòß™àNáâõâäãÓäÛåÚæëçõèêëìýìîí¼î„ï#ð­ðñGñWñ.ñÒð>ðiïUîÿìgëéwç&å âîßÝ.Ú2×>ÔRцÎãËvÉFÇhÅÒܾÁ9ÁÁFÁÎÁªÂÉÃ3ÅÓÆ¯ÈµÊåÌ7Ï Ñ&ÔºÖ\ÙܹÞká%äÕæ‹é4ìàî}ñôªö1ù´û&þ—õU æ % Sž±ÅÃÄ·£‡ d":$&Ò')L+þ,­.U0ø1’3(5¹6>8È98;³<>x?Ç@ BACaDpEbF;GóG„HïH$I/IðH‚H¿G¸F]E¬C¥A@?‚ñVñ5ñêðZð–ïŒîEí¸ëïéßçžåãyà¦ÝÀÚÇ×ÐÔáÑÏbÌëɯǿÅÄÔÂãÁNÁÁ7Á±ÁyÂ‘ÃæÄƒÆOÈOÊvÌÂÎ'Ñ«Ó6ÖÛØÛ3Þéà˜ãVæþè¶ëWîþðšó(ö·ø5û¯ý€à,x ³ è 3L\b`WB( "Ú#²%t';)ó*ª,Y.0¦1A3Ù4j6ô7w9ô:e<Ó=0?†@ÎAC+DD@AÆBñCEFåF¬GKHÆHI-I I±HH!GëEYDxB4@›=£:T7±3»/‚+'a"¯»Ù RÉ‚üløµô0ñî9ë¸è„æŸäã°á™àÅß(ß½Þ…ÞwÞÞÍÞ,ß ß<àáà¦áuâYãEäBåBæKçXèbénêtënìaí@îïÂï]ðÓð$ñNñBñ ñ”ðãïøîÄíYì¡ê±èæäáÃÞÞÛðØõÕÓ%ÐjÍÚÊŠÈxÆ»ÄLÃ;€Á(Á#ÁÁ#Â$ÃYÄâřǃɣË×Í<ЮÒ:ÕÕ×xÚ)ÝØß‘âCåúç¦êSí÷ï”ò-õ·÷?ú¹ü.ÿ‘÷C˜Ó  <_|›—–pJ!*#õ$É&†(H*,¯-]/1Ÿ2<4Ë5[7á8]:Ö;A=©>ÿ?MA‰B¶CÑDÐE¾F‚G0H®HI)IIÄH2HSG-FªDÛB©@$>;;8j4…0[,ë'N#‚¤¶Ìõ 7¯Qý<ùgõáñ¬îÅë4éîæúäQãíáÐàêßFßÏÞÞvÞ‹ÞÀÞßßàÂà~áKâ-ãäå æç!è.é9ê@ë<ì4íîçî¢ï:ðÁðñIñEññ­ðð(ïîŸìûêéðæ”äâLßq܀ٌ֒ӴÐïÍVËüÈÙÆÅŽÃj¡Á4ÁÁjÁþÁíÂÄ‘ÅAÇ%É3ËkÍÂÏ4Ò»ÔS×ôÙ¤ÜRß â½ärç"êÎìtïò¬ô7÷Æù8ü¸þÔ#d Ÿ Ïö'443" ð Ì"œ$m&0(ï)«+Z- /°0M2ì3|57‘8:‰;ý<`>»?AHB€C–D¡EŽF^GH—HôH%IIÙHNH†GfFýD:CA«>Ì;­85Q1,-Ï(6$w™«Åä %(þú$öŽòJïSì±é]ç\åžã4âáàaßèÞ—Þ~Þ‚Þ¸ÞßxßúߣàVá$âÿâçãàäÛåäæíçøèê ëìþììí¹îïð¥ðñ=ñFñ$ñ½ð/ðQïAîçìMëué[ç å†âÒßÝÚ×'ÔAÑuÎÖËiÉCÇaÅÕÜÂÅÁBÁ"ÁSÁâÁ¸ÂßÃEÅëÆÄÈËÊþÌIÏ¿Ñ9ÔÓÖsÙÜÓÞá;äêæžéIìòî‘ñ)ô½öAùÆû7þ¦`±õ 0 a§ÃÍÑÐÀ° p"A$&×'š)S+-¸.X02˜305¾6G8É9@;µ<>z?È@B>CcDkEaF3GðGyHçHI!IäHoH®G¢FHE•CŠA(?bÓÔÕiØÛÂÝvà+ãáåèCëæí’ð%ó¿õGøËúFýµÿyÉ S ‡ ·Ôõþ îÔ¶!#\%('é(¨*], .¹/X1ý2Œ4&6ª729®:!<=î>D@AÇBñCEÿEãF¤GFH¼H IIIŸHþGGÕECD_B@‚=„:973ž/c+ê&E"s•£Åê D¸xüfø«ô0ñî9ë¼è†æ¥äã¹ážàÐß/ßÈÞŽÞ€Þ™ÞØÞ2ß­ßAàíà¬á~â_ãMäGåHæPçZèhénêvëmìaí;îïºïVðÈðñ=ñ:ñôð…ðÐïàî²í;ì‰ê™èaæäeá¥ÞÈÛÖØÞÕñÒÐ\ÍÐÊ€ÈtƺÄMÃAˆÁ3Á0Á‘Á2Â8ÃnÄ÷ŮǜɶËñÍRÐÄÒRÕé×Ú?ÝîߥâYå è¼êfí ð¨ò<õË÷MúËü;ÿ¥X¡ã  Hnˆ›¤¦žŒzS!5#%Î&“(O*,º-c/ 1©2?4Ó5a7á8h:Õ;H=ª>@PA‡B¹CÌDÐE¸F|G,H£HýHII¹HHGGF™D¿B’@> ;ã7L4j09,Ð'0#hŠž¶à (ŸEý4ù_õÞñ«îÃë7éñæÿäYãñáÜàîßTßÔÞžÞ}Þ˜ÞÈÞ ß–ß#àÊàˆáQâ5ãäåæç#è5é7êCë<ì0íîâîšï6ð¶ðñ<ñ7ññšð÷ïïòí„ìãêúèÒæ|äåá3ßVÜiÙrÖƒÓŸÐâÍJËòÈÕÆ ÅÃq¦Á@Á,ÁwÁÂýÂ1ĦÅVÇ:ÉJË„Í×ÏMÒÐÔg×ÚµÜlßâÔä„ç7êàìˆï#ò¾ôI÷ÒùNüÂþ,ã0s ¬ Ü#0C><0ü Ó"§$u&:(ù)²+d-/¸0T2ñ3„57š8:‘;þ¿? AKB{C˜DœE‹FXGHHêHI IÊH?HqGTFæD!CA‰>¹;ˆ85/1-¯($[~—¬Ò !þùù!ö‰òGïSì±ébç]å¨ã7â áàmßîÞ¤Þ†ÞŽÞ¿Þß}ßàªà`á+âãïãåäáåêæïçéêë ìíåí»îvïðœðûð2ñ8ññ¯ðð@ï(îÒì3ë\é?çòähâ»ßåÜúÙ×Ô2ÑbÎÌË_É<Ç_ÅÔãÂÊÁLÁ-ÁcÁñÁËÂóÃZÅÇÙÈäÊÍbÏÔÑNÔíÖ‚Ù8ÜßÞœáHäç°é[ìïŸñ@ôÉöWùÐûKþ³o½ : t•ºËÚÝÚ͸œ w"N$&â'¢)\+-½.d02 355Ä6L8Ì9H;µ< >y?Ì@BAC_DkE[F1GèGsHÞHII×H]HGF4E{CtA ?I<.9¹5õ1á-‘)%L sŒ£Å bøþÈúÜö;óåïæì/êÖç½åüã{âFáHà’ßß·Þ…ÞÞ³ÞþÞfßí߇à>áâÝâ¾ã¸ä¬å·æ¼çÇèÔé×êÛëÐì¸í’îPïüïðëð&ñ<ññÆð8ðkïaîí‡ëºé¬çfåéâCàrݎڙפԿÑíÎKÌÔɣǷÅÄØÂðÁaÁ,ÁWÁÎÁŸÂµÃÅ®ÆyÈ~Ê£ÌðÎUÑÙÓbÖ Ù«Û_ÞáÄã}æ(éÙë€î"ñºóNöÕøYûÎý=žýJ’ Ð /Khp{vlY? "ó#À%‰'K)+½,f.0²1P3æ4v6ÿ7€9ÿ:j<Û=5?ˆ@ÐAC)D7E*F G¿G^HÅH IIãH|HÁGËFwEØCÞA…?Ü<Ë9m6·2±.n*é%:!j‚œ¶ ñIÒÿ™û›÷ïó‰ðyíµêGè$æQäÄâá{à¯ß"ß½Þ“Þ‡Þ­ÞíÞRßÐßgàáØá³â‘ã„ä~傿‡ç—è™é©ê¦ë ìícî.ïÙïgðÙðñ:ñ ñÙðTð–ï™îWíÙëêè×åjãÄàÞÛ,Ø8ÕKÒzÏÈÌPÊ ÈÆgÄÃÂxÁ2ÁIÁ³ÁsÂzÃÌÄXÆÈÊ6Ì|ÎßÐWÓèÕ‚Ø*ÛÙÝŠà?ãôå£èVëùí¡ð8óÏõXøÛúUýÃÿ+…Ù b ” ÁæùûÞ¿!•#g%1'ò(±*b,.½/c1ÿ2•4)6²759³:%<’=ó>E@‘AÅBóCþDFØF¥G8HºHùHIðH‘HêGþF¾E.DDB@c=l:7s3‚/C+Ò&&"^w”¨ã ,´güdø¡ô2ñ î?ë¼èæ§äã½á«à×ß8ßÓޖތޡÞâÞ<ß·ßJàõà´á†âeãTäLåPæRçaèhéqêvënì^í;îï¹ïKðÄð ñ6ñ$ñêðoð½ïÌî˜í%ìqêzèMæâãKáÞ®ÛÀØÉÕÜÒÐLÍÇÊvÈsƶÄRÃC“Á;Á@ÁÁEÂIÃÄ ÆÂǵÉÈËÎdÐßÒfÕØ¥ÚTÝàºâlå èÍêxíðµòSõÖ÷`úÚüJÿ³c²ï ( Uy•¨®²§›c!8# %×&š(Y*,¿-m/ 1±2E4Û5d7é8i:Ú;O=¨>@LA‹B¶CËDÎE²F|GH HðHIùH¨H H1GFDªBu@ï=;Æ7/4I0,²'#Op†£Ë Ž>ý)ùZõÛñ§îÇë5é÷æå[ãÿáÛààTßæÞ¡ÞŒÞžÞÐÞ.ßšß1àÏà‘áZâ;ã%äåæ!ç)è6é=êCë=ì0íîßî”ï2ð¨ðñ+ñ,ñöð‰ðáïþî×íoìÉêÞèºæ^äÍáß?ÜOÙ_ÖhÓ”ÐÌÍDËåÈÒÆÅ”ÃoµÁCÁ>ÁƒÁ"ÂÃDļÅkÇPÉc˘ÍðÏcÒæÔ‚×ÚÐÜ~ß3âçäšçJêòì›ï5òÐô[÷âù`üÐþ?™ô= ¼ æ*BKKJ5&!ß"´$z&G(ÿ)»+m-/À0[2ù3‰578:–;=i>À?AMB{C–D›E†FTGH‰HßHIýH¼H-H_G@FÎD Cè@q>œ;i8ë41ó,“(ý#?e}–¾ sþõùö„òHïOìµédçbå®ã>âá&àvßøÞ­ÞÞ˜ÞÈÞß…ßà¯àká2âãøãéäëåìæöçéêë ìíâí¸îqïð”ðñð&ñ.ññ£ðð/ïî¹ìë>é)çÒäPâžßÌÜãÙîÖþÓÑYκËZÉ2Ç_ÅÒêÂÍÁZÁ6ÁsÁÂÝÂÄoÅÇñÈùÊ)Í|ÏçÑkÔýÖ ÙHÜúÞ­á`äçÆémìï³ñPôÞöeùâû\þÁ)}Ë L }¤Å׿êâÛÁ§ "Y$"&í'©)e+-Æ.i02¥3=5É6R8Ò9I;¼|?Î@ BAC_DhEWF/GßGoHÑHIIÍHJHŒGzFEgCWAñ>+<9š5Ø1Ä-q)ç$- [rޝ ïTëþ¾úÔö5óãïåì0êØçÀåäâRáLàß ß½Þ’Þ•Þ¾ÞßoßößàEá âáâÉã¹ä·åºæÀçÍèÔéÜêÚëÑì¶íîNïòï|ðßðñ.ñ ñ¶ð#ð[ïHîíkë¡é’çIåÏâ&àXÝvÚדԥÑãÎ:ÌËɞDzÅÄÜÂõÁkÁ8ÁeÁßÁ°ÂÊÃ%ÅÁƒȒʼÌÏnÑíÓ}ÖÙÃÛsÞ&áÛãŽæ@ééë•î0ñÐó]öéøhûÞýM¯ \ à <Zq†ybJ $"þ#È%”'Q)+Á,r.0»1W3ì4}68…9;o<ß=5?@ËAC(D1E.FGÀGRHÁHþHIÙHgHµG±FeEÀCÂAo?º<²9M6—2’.P*È%#!Gn€¢ à4ÊÿŠû•÷éó„ðyí´êKè'æXäÊâˆáà»ß&ßÌÞ˜Þ•ÞµÞ÷Þ]ߨßsà áåá¸â›ãŠä†å„æç”è¤é¦ê©ëŸì‹íaî,ïÎïfðÈðñ&ññÇðAðƒï‚î@íÁëúéûç¾åKã­àäÝÛØ Õ9ÒfϽÌAÊÈÆfÄÃÂÁ?ÁTÁÆÁÂ’ÃÛÄsÆ2È1ÊJÌ—ÎóÐqÓþÕ—ØAÛîÝ àSã æ·ègëî°ðMóßõiøíúdýÕÿ9•ç. o £ Îñ !ëÈ!¡#n%='ú(¹*k, .Â/o13 4-6¸7<9¶:*<•=ò>K@AÉBíCEûEÙF›G6H­HóHIäH€HÜGçFªED,Bç?H=N:û6W3a/&+³&"A`w™È ¢\ü[ø›ô.ñ î<ëÁèæ²äãÇá±àßßEßÙÞ£Þ”Þ¬ÞëÞGß¿ßVàüà¾áŽânã[äSåSæYçeèkéuêvëoì\í9îï³ïFð¸ðñ'ññÙð\ðªï¶îíìRêcè.æÇã.árޒۨرÕÊÒïÏ@͸ÊrÈjÆ·ÄQÃK™ÁGÁMÁ¬ÁZÂXÙÄ!ÆÚÇÊÉäËÎÐõÒ{ÕظÚmÝàÒâ~å7èáê‹í/ðÊòbõê÷rúèü\ÿÃv» 2 f…¢³¼¼´¤Œl!E#%ß&¦(_*,Ç-u/1¸2L4á5h7ó8i:â;N=¬> @MAŒBµCËDÊE®FuGH•HêHIðH“HþGGéEkDB_@Í=é:£74*0þ+•'ö"1Xi¸ 0ý ùTõÖñ¤îÇë7éûæ åeãâéààbßîÞ«Þ–Þ¦ÞÝÞ4ß©ß5àÝà•áfâ?ã.ä!å!æ&ç/è6éBêAë@ì+íîØî‘ï)ð¢ðùðñ ñäðxðÎïæîÁíWì®êÄèžæAä±áüÞ!Ü:ÙDÖWÓÐÀÍ5ËßÈÊÆÅ“Ãw¹ÁPÁHÁ“Á5Â#ÃXÄÓÅ~ÇlÉuË´ÍÐzÒþÔ—×9ÚäÜ•ßHâüä¯ç[ê í«ïJòáôl÷õùmüäþI­L‘ Æ ù9LWYRE+!ç"¾$…&N( *Ã+u-/É0a2457¤8 :š;=j>Ã?ALB{C”D˜E‚FOGûG}HÚHÿHöH¨H HIG-F·DðBÐ@Q>‚;K8Ê4ó0Ó,u(à#"Kc© òaþçùö~òEïPì·égçgå´ãEâá0à~ßßµÞ›Þ ÞÕÞ ß’ßà¼àqá=âãÿãðäïåòæúçé êëìýìãí´îjïð‹ðçðñ ñïð“ðíïïüížìë$é çºä1â…߯ÜÌÙÖÖêÓÑHΰËNÉ2ÇUÅÜäÂÞÁ\ÁHÁ€ÁÂñÂÄ…Å,ÇÉËBÍ’ÏÒÔ×·Ù]ÜßÁáuä,çÔéˆì&ïÉñaôíöxùóûiþÔ7‹Ý Z Œ°Òåò÷ìçË´ ‰"e$+&ö'³)m+!-Ì.t02¯3B5Ð6W8×9O;¿<%>€?Ï@BBC[DjEQF+G×GhHÉHûHøHºH=HvGgFELC@AÑ><ð85µ1§-P)É$ @Xw— ßAÞþ´úÊö1óßïáì7êÔçËåäŒâRá\à ßßÆÞœÞŸÞÊÞß}ßýßšàOáâïâÌãÄä»åÀæÇçÍèÛéÛêÜëÏì¶í‰îKïêïvðÔðññûð¥ððBï6îåìVë…éuç/å²â à?ÝZÚi×{Ô”ÑÎÎ0̿ɖǯÅÄÞÂýÁsÁDÁtÁîÁÅÂÛÃ;ÅØÆ¨È«ÊÓÌχÑÔ”Ö5ÙÙÛŒÞ:áòã¡æUéýë¨îEñâóoöúøzûîý^¿k­ í Fi|ŽƒpQ 3"$Ú%—'b)+Ì,z.0Å1[3õ46 8Œ9;z<Û=A?‡@ÖAC(D2E'FÿF¹GKH¸HòHûHÊHVH£GŸFKEªC¦AU?ž<“9-6z2s.0*­%!2Nk‹ Ê'·ÿû÷àó…ðqíºêHè-æZäÓâá‹àÂß/ßÖÞ¡Þ¡Þ½Þßfßáß~à'áîá¿â¢ã“äŠåŒæ“ç™è§é¨ê©ë¡ì…ícî"ïÎïZðÄðñññ¸ð-ðpïiî*í¥ëâéàç å3ãŒàÎÝèÚþ× Õ%ÒWÏ«Ì:ÊùÇ ÆfÄÃ#‰ÁJÁdÁÔÁ–¢ÃôÄ…ÆLÈEÊf̬ΠыÓÖ´ØVÛÞ¸àiãæÎè|ë"îÅð^óóõ{øÿútýåÿI¤÷> | ³ Ù)+-!öÔ!ª#}%A')¿*w,%.Í/s1 3¥446½7C9¹:1<–=ú>I@“AÈBíCEöEØF’G2H HíHøH×HpHÈGÕF”EüCBÊ?.=-:ß643C/ +‘&ì!#E_´ ”OüQø”ô'ñ î9ëÄèæµäãËá¼àæßLßåÞªÞ Þ·ÞòÞS߯ßaàáÉá“âxãaäZåZæ^çhèoéwêuërìXí8îþî«ïAð­ðûðññÉðJð–ï îiíõë:êFèæ¬ãáUÞyÛØ™Õ·ÒÛÏ2Í­ÊhÈhƱÄXÃJ¦ÁPÁ[ÁºÁmÂióÄ0ÆöÇÞÉýË8ΕÐÓ“Õ1ØÒÚ€Ý2àââšåFèúêœíDðÝòsõý÷úüükÿÓ1‚Ð G n–®ÀÊÇÁ¯—w!O# %ë&¯(i*#,Ï-}/1¿2T4æ5r7ó8s:å;Q=³> @PAŽB²CÊDÇE«FoGHŽHÛHýHÚH‹HêG GÕERDuBC@³=Ç:‹7î30Ü+w'Ô"6Vs£ øn&ýùNõÏñ£îÄë:éýæ åmãâðààjßö޷ޜ޳ÞçÞ;ß´ß=àæàŸálâJã3ä)å%æ-ç2è=éCêDë>ì.í îØî‹ï"ð›ðëðññØðdð»ïÑî©í@ì”ê©èƒæ$ä—áßÞ ÜÙ.ÖCÓiеÍ#ËÙÈÃÆÅ•ÃzÂÁÁ[ÁUÁ¢ÁGÂ4ÃpÄãÅœÇ}É’ËÈÍ!БÒÕ¯×PÚúÜ­ß\âåÂçsêíÂï[òôô÷ú€üõþY¿ _œ × )FYde_M:!ó"Æ$‘&V(*Í+{-*/Ë0m24˜5#7«8$:Ÿ; =m>È?APBzC•D–E~FKGôGvHÐHõHçHšHH7GF DØB³@;>];18©4Ò0µ,T(Á#+Md— ÛTöýÝù öxòAïOìµéjçjå¹ãLâ"á9à†ß ßÁÞ¡Þ®ÞØÞ.ß™ß$àÃà|á@â#ãÿãüäóåøæèéêëìûìâí®îhïðƒðÛðñ ñæð{ðßïïæí…ììêéóæšäâeߗܱٿÖÕÓóÐ:ΠËHÉ'ÇWÅØÃ­ÂàÁjÁRÁÁ#ÂÃ1Ä—ÅEÇÉ+ËVͬÏÒšÔ,×ÎÙtÜ(ßÖáä=çíé˜ì=ïÛñsô÷‰ùü}þàHœé0 g ˜ÁÞñýïØ½ —"k$7&(º)y+(-Ô.}02´3L5Ó6^8Ý9R;Å<&>„?Î@B?C\DgENF'GÐG`H¾HðHëH­H)HgGOFñD2C&A¸>ô;Ô8^5–1‡-3)¨$øCZ‡ É3Ïþ©úÄö)óßïßì5êÜçÊå ä‘âZáeà¨ß!ßÏÞ¦Þ«ÞÏÞß‚ßà¤àWáâöâÒãÎä¾åÇæÉçÕèÙéáêÛëÏìµí…îFïæïlðÌðññïððð,ïîÎì<ëié]çå—âïß$ÝAÚR×bÔ…Ñ»Î!̸ɌǯÅÄäÂÂ~ÁQÁ€ÁÂÕÂòÃPÅíÆÁȾÊïÌ3Ï ÑÔ­ÖIÙôÛžÞUá使déì¹îXñôó€öù†ûþiÐ(x¾ ø -Tt‹šœšwb 8"$Þ%¥'g) +Ó,‚.(0Ë1e3ù4‰68‘9 ;{<á=A?@ÔAC$D2E"FüF³GBH¯HæHïH»HGHGŠF9EŽC‘A6?„K@”AÈBíCýDòEÓFŽG*H˜HàHîHÈH`H¶GÁFEæCùA±?=:½63"/í*q&Ó!.Gk£ þ†FüGøô%ñî>ëÁè™æ·ä"ãÒáÃàðßUßíÞµÞ¨Þ¿ÞÿÞXßÕßeàáÑá™â‚ãdädå]æbçoèné|êvëoìZí3îúî¦ï8ð¥ðòð ñýðµð<ðïŒîQíÝë ê-è÷å’ãøà:ÞcÛt؈ÕÒÐÏ!Í£Ê_ÈdƯÄYÃQ«Á\ÁgÁÌÁz€ÃÂÄJÆÈöÉÌMΰРӯÕDØëÚ‘ÝJàöâ­å^è ë²íVðïò„õø‘ú ý{ÿã>’Þ V y¥¸ÎÔÒη¤!W#-%ñ&º(q*-,×-…/&1Ä2]4é5y7ù8v:ë;S=¹>@VA‰B¶CÈDÃE¨FjG H…HÒHðHÎHzHÚGôFÃE7D`B&@›=ª:l7Ò3ì/Ã+V'»"ú?\” áfýùEõÌñ îÅë<éþæålãâóààqßÿÞÀÞ©Þ»ÞðÞHߺßKàíà§ávâNã=ä.å+æ2ç4èBéCêHë<ì0íîÖî„ïð’ðâð ññÇðRð©ïºî”í%ìzêègæ ä|áÂÞòÛÙÖ,ÓZТÍËÉÈÃÆÅ–ÃÂÅÁiÁ_Á´ÁUÂJÀÄüŭǘɤËåÍ2ЬÒ+ÕÆ×eÚÝÀßsâ'åÕç‰ê,íÔïoòõ“÷ú‘üÿgÎl« ä 5VcrpjZD#!ÿ"Î$&]( *Ò+…-1/Ô0t2 4 5'7±8*:¢;=q>Ç?AMB|CD”E{FEGìGqHÂHíH×HHüG$GF‹D¾B@>G;8Œ4´0—,6(¥#é1Q‚ ÌCëýÓùövò=ïPì·émçqå½ãTâ*áBàßßÉÞ®Þ³ÞèÞ3ߤß,àÌà„áKâ'ã äå÷åçè éêëìøìãí¨îfïüï}ðÒðññÔðjðÎïéîÐínìÐêóèÑæ‡ä÷áRßxܜ٧ֿÓãÐ)ΕË=É#ÇRÅÛïÂéÁrÁaÁœÁ6ÂÃBİÅWÇ7É<ËsÍ¿Ï0Ò°ÔA×çÙ‡Ü?ßêá£äOçê¨ìRïîñƒô÷˜ùüˆþ÷S¬ù: x ¦Ìëý  ûâÉ ¢"t$C&(É)}+2-Ü.ƒ0#2»3P5Û6c8à9Y;Å<,>„?Ó@BACZDcEKF!GÊGZH³HæHÞHœHHPG>FØDC A>Ù;´8B5w1j-)$Ô $Hp ·%Âþžú¼ö$óÛïßì7êÛçÑåä—âcálà°ß,ßÖÞ²Þ²ÞÜÞ%ߌßà¬à_á&â÷âáãÍäÊåÉæÐçÖèàéÞêáëÈì¸íîAïáïaðÅðøðñÛð…ðêïï î³ì&ëNé@çùäwâÙßÝ,Ú9×NÔqѬÎ̬ɈǩÅÄå …Á_ÁÁÂåÂÄfÅÇ×È×ÊÍMÏ·Ñ0ÔÆÖ^٠ܳÞláäÑæxé*ìËîmñô–öùžûþ~à5ŠÉ 7d~𣫦˜…i E"$ç%°'n)*+Û,‹.10Ð1n3þ4’68™9 ;€<ä=B?@ÔAC#D0E FõF®G:H§HÚHæH¨H:HyGzFE|CrA?dN@–AÆBîCúDòEÌFŠG!H’HÕHâH»HNH¦G­FgEÑCÝA–?ó<õ9¡6ø2/Ê*W&³!ì3O” èy:ü=øŠôñî<ëÅè™æ¾ä'ãÚáÊàøß_ßõÞÁÞ¯ÞÍÞßeßÝßmàáÒá©â‚ãqäeåfæeçrèté|êyëmì[í/îöî¡ï/ðŸðåðñðð¥ð(ðmïsî>íÁëêèÛåvãÛà"ÞEÛ`ØnÕÒ»ÏÍ–ÊXÈ^ƲÄWÃ[°ÁiÁuÁÛÁŽÂ’ÃØÄ_Æ È Ê-ÌdÎÇÐ;ÓÃÕ_ØýÚ¯ÝZàãÁåpè ëÄíiðó•õ#ø¡úý‹ÿôL¥æ, _ ‹°ÆÚáÞÛÁ²ˆ!g#1%'½(€*/,å-‡/31Ç2d4ò5}79z:ï;W=º> @TAŒBµCÄDÃE¤FcGH{HÉHâHÅHfHÊGáF«E$DCB @|=‘:J7¶3Í/¡+;'"Ý$F ÓRýùAõÆñžîÅë>éçåwãâáàzß ßÆÞ¶ÞÂÞüÞPßÄßSàöà±á}âVãCä4å2æ6ç9èDéFêHë=ì-íîÓî~ïð‰ðØðüðóð·ð@ð”ï§î{íìaêtèLæðã^á«ÞÖÛîØÖÓHДÍËÆÈºÆÅ—Ã…ÂÍÁrÁnÁÂÁhÂZØÄÆÉǨÉÂËõÍQоÒGÕÛ×|Ú*ÝÔß‹â9åíçšêAíæï€òõ¤÷&ú¢üÿ{Ù/xº ó F_r|}ueN/!#Ù$§&g((*Ü+-:/Ú0|24¦5,7¸8-:¨;=s>Ì?ARBxC‘D‘EvFAGåGiH¹HßHÎHyHïGGîEtD§B@>(;ó7o4”0x,(ˆ#Íû:o ¸7ÝýÍùöõtò8ïRì·épçuåÅãYâ3áHàšßßÔÞ·Þ¿ÞðÞ>ß­ß6àÕà‹áVâ*ãäåæçèéêë ìíØíªî]ïùïqðÌðòðûð¾ð_ð²ïÛî¶íYì¶êØèºæiäßá4ßa܂ّ֬ÓÑÐΊË3ÉÇRÅÙõÂïÁ}ÁlÁ«ÁFÂ&ÃWÄÃÅnÇKÉWË…ÍÛÏDÒÆÔ]×öÙ¥ÜPßâµäfçê¾ìbïò”ô'÷¦ù+ü–þ`½I „ ²ÛøòÎ ¯"}$L&(Ð)…+;-ã.Œ0)2Â3X5ß6l8â9_;Ȇ?Õ@BACYD`EJFGÆGPH¬HÚHÑHHHDG%FÄDCñ@ƒ>º;˜8$5Z1I-ø(m$¿ë.] ¥µþ—ú±ö#óÔïàì8êÞçÖåä¡âgáwà¸ß4ßãÞ·ÞÀÞãÞ/ß–ßà·àfá-âãçãÒäÒåÍæÕçÚèàéâêÜëÏì®íî:ïÙï[ð»ðìðúðÍðqðÚïïñí ìë:é%çÜä`â¸ßñÜÚ"×;Ô[Ñ¡ÎÌ¥ÉǦÅÄé‘ÁhÁÁ"ÂøÂÄ{ÅÇíÈðÊÍhÏÈÑMÔØÖyÙÜÍÞ|á0äáæŽé>ìÙî…ñô¬ö*ù«û!þŠñD•Û  HoŒ§®¸®¦s P""$ô%¶'z)0+ç,.:0Ö1u35—689;‚<ë=@?•@ÓAC#D-EFóF¥G5HœHÑHÕHŸH&HkGbF E_C]A?I<<9Ó52.Ñ)X%¦ ä%M ÷‘ÿ^ûw÷Ìózðní»êPè9æjääâ¥á¡àÝßMßïÞÁÞºÞÜÞ ß€ßà•àDáâØâ·ã§äœåœæ¡ç¦è®é¯êªë ì‚íXîïºïCð©ðäðùðÕðˆðõï4ï%îéìUë˜éçRåÞâ?à{ÝŸÚ·×ÈÔíÑ"φÌÊçÇÿÅeÄ!Ã5¢ÁmÁÁÂËÂÛÃ3ÅÄÆÈˆÊ­ÌñÎTÑÎÓZÖôØ›ÛHÞôà­ãVæéµë[îþð“ó*ö®ø2û¥ýuÖl ¤ Û &;MOP@3 ó!Ê#–%b' )Ü*,>.æ/†1#3¸4E6Ó7K9Í:9< =?L@™AÇBìCøDïEÇFƒGH‡HËHÖH¬H?H”G˜FUE·CÇA|?×<Ú9‚6Ý2å.¯*9&—!Òø@} Ýj/ü6øƒôñî@ëÅèŸæÂä.ãááÓàÿßkßûÞÌÞ¹ÞÔÞßkßæßyà áßá¬âŒãvämåiæmçtèxé}êyëpìVí/îðîœï)ð“ðÛðôðÞð˜ðð\ï]î'í§ëóéòçÆåYãÂàÞ0ÛDØ_ÕuÒ®ÏÍÊPÈ]ƬÄaÃY¾ÁqÁ‚ÁëÁ Â¤ÃîÄrÆ6È$Ê@Ì€ÎÚÐTÓØÕvØÛÄÝnà&ãÓå…è3ëÖí}ðó¨õ1ø´ú-ýšÿ\°ø8 j ›¸Öäíéå͹–!k#?%'É(†*8,ì-‘/71Ð2i4ù5‚79:ò;\=¼> @WAŒB³CÃD¾EŸF]GHsH¾H×HµHXH¸GÏF–ED*Bö?]=x:*7›3®/ˆ+'ƒ"Ãì3j ÅEýøø;õÂñŸîÄëAéçåyã!âá+àßßÏÞ½ÞÏÞß\ßÌßZàÿàºá‚âbãDä?å5æ:ç@èCéKêGë>ì)íîËîzïð€ðÌðòðãð¨ð.ð‚ïîfíôëJêZè3æÕãDá’Þ¼ÛרíÕÓ7ІÍ˽ȷÆÅ–ÃÂÓÁÁyÁÓÁvÂqèÄ&ÆÛÇÁÉ×Ë ÎfÐÕÒ]ÕðוÚ9Ýðß™âQåÿç®êUíöï”ò&õ¶÷6ú±ü$ÿˆê;‡È *Ti€†‰qX7!#à$°&q(-*å+–->/ã0‚24­537¹85:ª;=y>È?ANBzCŽDŽEsF:GáG^H°HÔH½HnHÙGGÖE_DŽBg@ç= ;Û7M4{0X,ÿ'k#´ß$] §*ÑýÅùïõqò6ïSì¹évçwåÍã_â;áQà¢ß'ßÜÞÁÞÈÞúÞGß¶ß?àÝà”á]â2ãäåæç èéêëìûìÚí¡î\ïíïmð¾ðéðêð±ðLð¢ïÃî íAìê¿èæOäÃáßJÜgÙ}Ö•ÓÀÐ ÎzË/ÉÇUÅÖüÂóÁŠÁwÁ»ÁUÂ:ÃjÄÙŃÇ`ÉoË›ÍóÏYÒâÔm×ÚµÜißâÊäzç'êÒìvïòªô3÷¼ù7üªþtÇX ‘ Àç &ùÚ ¸"„$W&(Ú)+@-î.Ž042Å3_5æ6o8é9b;Í<1>Š?Ó@B>CZDZEJFGÂGFH£HÎHÆHHúG-GF­DìBÛ@e>¡;}85@1*-Û(R$£ÒúI •ªþ‹ú­öóÖïÝì9êãçØåä¦âpá~àÁß>ßêÞÅÞÅÞïÞ6ß¡ß!àÁàlá6âãìãÜäÒåÖæ×çÞèäéáêáëÉì±í|î4ïÖïQð°ðãðêðÀð_ðÉïîîàíƒìõêé çÁäGâ ß×ÜøÙ ×'ÔLÑÎûËšÉ}Ç¢Å"Äé—ÁxÁ¨Á5ÂÃ-ÄŒÅ0ÇÿÈ Ë+Í~ÏáÑaÔðÖŒÙ5ÜàÞ“áAäöæ¡éOìïî”ñ#ô»ö8ù¾û.þüV¡é ! Uz›¯¼Áº²— W"/$ù%Ã')<+ë,˜.A0Ý1{3 568¤9;‰<ê=F?”@ÔAC"D*EFìFŸG.H’HÇHÈH‘HHWGQFóDLCCAè>/<9»5ú1.³)<%Ž Äï ? {ëƒÿVûo÷Èóyðní¼êRè>æpäëâ®á©àæßVßùÞÉÞÆÞåÞ'ߌßà¢àIáâÝâÀã¬ä£å æ¥çªè®é´ê¨ë¡ì~íWîï¶ï;ððÛðéðÊðsðèïïîÊìDë{éuç6åÄâ%àcÝ‡ÚŸ×µÔØÑÏwÌÊßÇþÅdÄ%Ã;¬ÁwÁŸÁÂàÂíÃGÅÚÆ¥ÈžÊÃÌÏiÑåÓoÖ Ù¯Û]Þ á¾ãnæéÊëmîñ¦ó8öÁø?û·ý"ˆß2t · ã /JT]YM= ÿ!Ò#¡%i'()å*˜,E.î/Œ1+3¼4N6Ó7U9Î:><¥=?P@—AÇBíCóDíEÃF}GHH¿HÊHžH/H„GƒFAEC²A_?¾<»9i6½2Ê.*&}!·á-j ÏZ(ü,øôñî<ëÎèæÍä1ãëáÚà àqßßÔÞÃÞàÞßvßïßà*áæá¶â‘ãäqåoæqçwèzé€êzënìUí,îêîšïððÎðèðÑð‡ððIïFîíë×éÜç¨å@ãªàêÝÛ,ØJÕcÒžÏùÌ‚ÊJÈWÆ®Ä`ÃdÂÂÁ~ÁÁùÁ³Â·ÃÅŠÆJÈ9ÊZÌ‘ÎõÐfÓòÕ‰Ø+ÛÙ݃à:ãçå™èDëëíŒð%óºõ@øÇú9ý­ÿn¼ B z ¥ÆâíûôîÛÀ¢!u#I%'Ó(Ž*A,ó-˜/?1Ö2q4ü5‰79„:ö;_=½>@UAŽB±CÁD¼E™F[GöGmH³HËH¨HHH¨G¸F…EôCBÚ?D=Y:7{3“/i+ÿ&d"¬ÑùW ¶6úüîø6õ¾ñœîÆëAé ç"åã'â á0àŽßßÜÞÅÞÙÞ ßdßÕßcà áÀáŒâhãMäDå:æ@çCèGéLêIë=ì*íþíÊîsïðwðÂðåðÖð—ððlïîKíáë/ê@èæ·ã/átÞ¨Û»ØÚÕñÒ(ÐvÍýʲȵÆýĜÎÂßÁ…Á‰ÁßÁ‹ÂþÄ:ÆîÇÜÉçË)ÎxÐðÒpÕ Ø¥ÚUÝþß³âcåèÂêeí ð¥ò8õÆ÷EúÃü0ÿ›õK–Ó  8\z‰““‹{bC!#ì$·&y(8*î+›-I/ç0Š24¯5<7¼8::®;=|>Ì?AOBxCDŒEmF8GÖGXH¦HÇH³H]HÊGêFÅEEDzBL@Ë=ð:º734Z0=,ß'P#˜ÆëF ›Çý»ùéõmò3ïRì»éwçåÐãgâBá[àªß1ßæÞÉÞÔÞßSß¾ßHàåàŸá`â>ãäåæ çèéêëìüìÓí¤îPïíï`ðµðàðÙð©ð3ð–ï¬îŒí+ì‚ê¨èƒæ5äªáß0ÜSÙeÖ„Ó®ÐþÍrË"ÉÇPÅÙÃÂÂøÁ•Á‚ÁËÁfÂLÃ|ÄïÅ”Ç|É˶ÍÐsÒóÔˆ×"ÚÐÜxß/âÛäŽç=êáìŠï"ò¹ôH÷ÉùGü¹þ!‚×"f ž Ìô$,1'ä Á"‘$]&#(Ý)œ+F-õ.š052Ò3`5î6r8ð9b;Ó<2>?Ö@B?CVDZEEF G¾G;HœHÁH¹HqHèGGÿE–DÖB½@P>;a8è4 1-½(7$†ºß6 ƒ÷ þú©öóÓïÞì:êåçÞå!ä¬âyá…àÊßIßòÞÏÞÎÞùÞAߨß/àÂà}á8âãôãßäÞåÕæßçßèçéãêàëÊì®íwî3ïËïMð£ðÙðÝð°ðOð³ïÞîÄírì×êéñæ¦ä-âƒß¿ÜÞÙùÖÔ<Ñ~ÎîË“ÉtÇ£ÅÄð¡ÁƒÁ¸ÁBÂÃ:ħÅ@ÇÉËIÍŽÏþÑsÔ ×£ÙIÜøÞ¤á\äç»é\ìï ñ;ôÅöQùÉûDþ§a²õ / b‡©ºÉÌÆ»¥ˆ b"9$&Î'…)E+ó,£.F0æ1€35¢6%8¥9;Š<î=H?”@×AC"D%EFæF›G$HŠH¾HºHƒHHJG7FäD/C,AÍ><9™5â1Ý-š)%s ­Ò÷' lÙvÿLûe÷Æóqðqí¹êXèBæsä÷â¬áºàéßbßßÒÞÐÞîÞ1ß–ßà©àUáâéâÄã´ä©å¥æªç­è³é³ê¬ëžìíQîï¬ï6ð’ðÒðÛð»ðfðÑï ïûí¸ì)ëcé[çåªâ àHÝpڇסÔÈÑÏnÌÊÞÇöÅiÄ$ÃD²Á†Á¨Á'ÂëÂÄZÅðÆ»È¶ÊØÌ Ï€ÑüÓ…Ö%ÙÁÛsÞ!áÑã…æ/éÝë€î"ñ¶óKöÎøSûÄý5“ò=† Á ó <UaicZD+ "Þ#§%v'.)ï*Ÿ,L.ö/“123Â4T6×7[9Ò:A<ª=?U@•AÊBèCõDèE½F{GH{H³H¼H’HHrGqF)EˆC—AG?¡<ž9L6œ2®.r*ý%d!˜ËéY ½Pü$øwôñÿíCëÈèªæÉä@ãëáçààzßßÛÞÏÞçÞ$ß€ßøßŠà3áíáÀâ—ã†ävåwæsç}è|é‚ê{ëoìRí(îéîïðƒðÃðÜðÂðvðóï1ï5îöì{ë¼éÂçŽå$ãàÓÝûÚØ.ÕRÒŽÏçÌ{Ê@ÈSÆ®ÄbÃfÂÐÁ…Á¡ÁÂÄÂÉÃÅšÆfÈKÊrÌ©ÎÑ|Ó Ö¡Ø?ÛòÝ—àPãüå¯èWëþíŸð7óÌõRøÖúKýºÿ"yÎ R ‡ ²Ôîüõêɬ!#O%'Ù(˜*J,ú-¡/D1à2v4679†:ý;_=Á>@UAB®CÁD¹E”FVGïGcH«H¼HœH8H”GªFhEâCøAÀ?*=8:ö6Y3w/G+ã&G"¹ÞG  .çüêø+õ¿ñ–îÈëCé ç*å‚ã2âá9à–ß%ßæÞÏÞãÞßnßßßnàáËá‘âpãVäGåEæ@çIèKéMêLë;ì)íüíÆîmïðoð·ðÚðÇð‡ð ðXïjî5íÇëê'èýåžãá\ދ۩ؾÕâÒÐlÍìÊ­È®ÆüÄÔÂåÁ“Á”ÁïÁžÂŽÃ×ÄMÆÈïÉÌ:ΗÐÓŽÕØÁÚhÝàÈâvå)èÓê}íð¸òKõÕ÷ZúÓü@ÿ«[¡æ  Ii…—žŸ—„pJ!'#õ$À&„(?*÷+¤-P/ð0’2#4¸5@7Á8A:®;={>Ð?AQBvCŽD…ElF1GÐGPHœH¼H¥HMHºGÖF±E-D_B3@±=Ò:74>0,Â'1#}­Òú2 Š¿ý¬ùéõ`ò7ïNì¾é|çå×ãnâJácà´ß:ßðÞÑÞÞÞ ß[ßÈßQàîà¦ájâCã)äåæçèéêë ìûìÑí¡îJïçïWð­ðÑðÐðð,ðyïœîuíìnêˆèjæäáçÞÜ8ÙPÖpÓ›ÐñÍdËÉÇLÅÝÃÞÁŽÁÜÁtÂbÃÄƯÇÉœËÉÍ"Ð†Ò Õ×:ÚèÜßDâïä¥çMêøìšï5òÍôV÷ÝùWüÈþ4è/t ¬ Ú17?/* õ Å"Ÿ$e&,(è)¢+O-þ.ž0?2Õ3i5ó6v8õ9h;Ô<7>Œ?×@B=CUDXE>F G²G8HH»H§HeHÖGGìED¿B¥@0>j;@8Í4ÿ0ô,ž($kžÊë% oë‘þwú¡öóÑïÞì;êéçãå'ä²âƒá‹à×ßNßýÞØÞÙÞßIßµß2àÓà~áDâãùãêäÞåßæßçæèçéçêÝëÌì¨ívî+ïÈïBðœðÍðÍð£ð=ð¡ïÉî®í[ì¼êîèÔæäâiߦÜÇÙáÖþÓ'ÑqÎáˉÉqÇžÅ!ÄôÂ$­ÁÁÈÁRÂ1ÃQĸÅZÇ.É2Ë^ͨÏÒÔ×¹Ù`Ü ß½áläçÉétìï¶ñJôÚö^ùÞûLþ¿v¼ < o”³ÉÓØÑÆ®“ l"B$ &Ô'‘)J+þ,¥.Q0ë1†35¥6,8¨9";Š<ô=F?›@ÓAC D#EFãF‘G H}HµH­HtHõG4G(FÉDCA´>ó;ê8y5Ç1½-|)%X ’»à [ÌgÿDûZ÷Ãómðrí¸ê^èAæ~ä÷â¼á¸àúßcßß×ÞÜÞ÷Þ;ߟßà´à[áâîâÌãºä°åªæ®ç°èµé´ê­ë›ìíMî ï¦ï.ð‰ðÄðÐð«ðTðÁïôîèížìëJé@çåâîß1ÝVÚp׎ԲÑõÎ^ÌúÉÓÇ÷ÅeÄ)ÃI½Á‘Á·Á4ÂÃÄpÅÇÒÈÊÊòÌ5Ï™ÑÔÖ7ÙÝÛ†Þ6áçã—æFéîë”î3ñÊóZöãø_ûÙý>©ûO’ Î )K`nuoeO5 "ç#´%z'<)ô*©,T.ý/›173Ì4V6á7]9Ø:D<®=?W@—AÈBêCðDåE»FpGHnH©H±HƒHHaG[FEoC€A)?ˆ<9-6‚2.T*ã%B!„­ÓD ¯Aüøpôñî=ëÒè¦æÖä>ãùáêàà…ßßèÞÖÞóÞ-߈ßàà>áöáÄâ£ãˆäåxæ|çèé†êxëqìQí%îãîŒïð}ðµðÐð´ðdðàïïîâì^ë¦é¤çxåãwà·ÝäÚØÕCÒxÏßÌlÊ<ÈMưÄbÃpÂÓÁ•Á¬ÁÂÕÂÞÃ'Å·ÆsÈjÊ‚ÌÆÎјÓÖ¶ØYÛÞ±àbãæÁèhëî­ðNóÙõeøçúZýÍÿ.‰Ý b “ ÂÝý îÚ°!Ž#Y%!'å(ž*T,.©/J1ç2{4 6“79Ž:þ;d=Ä>@YAŒB°C¿D´E’FLGêGYH H±HH'H†G‘FZEÅCâA¦? =:×6<3X/++Ã&."q¡Çó1 ’Ýüáø%õ¹ñ–îÉë?éç%å‘ã3âáAàŸß/ßîÞÚÞêÞ"ßwßèßwàáÐáŸâsã^äNåFæKçHèPéOêKë?ì$íüíÀîhïûïbð±ðÈð¼ðuðúïGïQî í¯ëúéèàå…ãõàCÞqÛØªÕÌÒÐ[ÍãʥȪÆûĠÙÂíÁžÁ¢ÁÿÁ¯Â¢ÃêÄcÆÈ ÊÌWΩÐÓ Õ5ØÖÚÝ*àßâ‰å?èåêí-ðËò\õå÷múÞüTÿ¸i±ð ( Sx£ªª£yV!/#%Ë&‹(J*ü+¯-U/û0•2-4º5I7Å8E:µ;=€>Ï?ANB{C†D†EgF)GÍGCH–H¬H™H=H§GÆF˜EDFB@•=´:‚7ó3!0ý+§'#c½â xù²ý¤ùßõ`ò3ïMìÁé}ç†åáãoâYáeàÁßBßùÞÞÞåÞßdßÔßVàýà©ávâJã-ä!åæçèéêë ìúìÑí™îJïÜïQð¡ðÅðÀð„ððkï…î^í÷ëTêmèRæúãwáÈÞþÛ!Ù8Ö]Ó‰ÐàÍYËÉÇMÅÛÃÊ ¨Á›ÁìÁ„ÂtäÄÆÅǥɱËäÍ3УÒ!Õ¶×TÚøÜ©ßVâå¹çaêí©ïMòÙôl÷ìùgüÜþ>¤òB º é *:HFA0ú Ô"§$o&8(î)­+U-/¥0G2Þ3k5ý6y8ü9k;Ú<8>?Û@BBCPDWE8FGªG0HƒH¬HŸHQHÉGòFÚEeD©B†@>H;&8«4â0Ô,~($JˆªØ ^Úƒþoú—ö óÎïÛì?êêççå.ä¸âˆá˜àÚß\ßßâÞäÞ ßUß¼ß?à×à‹áJâ"ãäïäæåãæåçèèêéçêáëÆìªípî'ïÀï:ð“ðÀðÀð’ð+ðŽï´î˜í@ì¨êÎè»æsäôáOߎܩÙÏÖåÓÑ^Î×Ë}ÉjÇÅÄúÂ+µÁœÁÕÁfÂAÃeÄÏÅmÇGÉJËtÍÃÏ&Ò¨Ô3×ÒÙwÜßÖá|ä7çÛéˆì,ïÆñ_ôéösùëûbþÉ+‚Í J ŸÄÑäâàͽš {"H$&Ú')S+-±.X0ñ1“35®608¯9#;’<ô=K?œ@ÓACD$EFÝFGHwH§HŸHiHßG'G F¸DþBù@—>Ø;È8[5¦1Ÿ-^)à$; wžËû I¹\ÿ5ûX÷¸ómðkí½ê]èIæäãÁáÃàànßßçÞáÞßBß©ß#à»àfá#âøâÕã¿ä¶å¯æ´ç´è¸éµê¯ëšìíHîï£ï"ð„ð¶ðÂððAð¯ïßîÑí…ìúê,é&çåäqâÖßÝ>ÚY×vÔŸÑæÎPÌòÉÊÇõÅbÄ1ÃLÂÈÁœÁÅÁFÂÃ)ĆÅÇçÈæÊÍPÏ®Ñ+Ô´ÖQÙñÛŸÞIáäªæ[éì§îGñÞójö÷øoûêýQ¶ ^¢ Ü 7Ym|}o[? "ï#¿%ƒ'G)ý*±,^.0¦1=3Ò4\6ç7c9Û:L<«= ?U@›AÆBéCïDâE¶FjGýGdH H¥HqHHHGLFûD[CaA?eÅÊÆŽÈ~ÊœÌÜÎ9Ñ®Ó6ÖÍØoÛÞÇàvã)æÔèë&îÁð`óìõxøôúnýÚÿA–í. s ž Ñê  þÞÃ!‘#h%)'ï(¦*^, .±/T1ì2…46š79•:@ZAŒB¯C¼D²EŽFGGãGPH•H§H}HHrGFBE¯CÊAˆ?ó<ÿ9º639/ +¨&"Vˆ«Þ €ÒüÖø õ´ñ”îÆëGéç0å“ã<â%áJà¨ß8ßøÞãÞõÞ+߀ßóß~à$áØá¥â|ãdäUåMæMçQèNéWêGëBì!íûí¹îfïðï\ð¤ð¿ð¬ðfðéï1ï>î í”ëäéðçÈåhãÛà&ÞZÛvØ–Õ¶ÒôÏLÍÚÊ›È§ÆøÄ¤Ã›ÂúÁ¤Á²Á¾ºÃúÄzÆ3ÈÊ0ÌmÎÀÐ4Ó¸ÕKØîÚ”ÝAàôâŸåSèúê¡íDðÙòrõö÷~úîühÿÂ*sÃý 8 ]ˆš³³ºª…^!?#%×&”(S*,µ-_/1œ254À5P7É8L:µ;(=~>Õ?ANBzC…D„EcF%GÅG(ü)°+e- /±0L2ä3v5þ6ƒ8ý9q;Þ<:>•?Ù@B?CPDUE4FG£G)HyH¤HHFHµGãFÂEODŽBo@ü=+;8Š4Æ0¯,e(Û#3i’Ãò TÂ~þ^ú‘öóÈïÛì>êëçíå1äÁâŽá¡àâßfß ßìÞìÞß_ßÃßIàáà’áTâ)ãäøäëåçæìçèèðéèêáëÇì§ímî#ïºï3ð‡ð¶ð±ð…ððzï îí)ìê³è£æTäÜá4ßpÜ–Ù³ÖÒÓÑLÎÎËpÉgǙŠÄÿÂ/ÂÁÁ§ÁåÁuÂTÃzÄâÅ…Ç\ÉaËŒÍÙÏ@Ò½ÔL×çÙÜ4ßêá•äGçóé›ì=ïÜñnôÿö€ùÿûrþØ=â ] Š®ÏáíðêÜÆ© €"W$&é'¢)^+ -¹._0û1•3(5±678¶9%;š<ó=T?–@ÚACD!E FØFˆGHnH›H”HVHÕGGþEDèBà@x>À;¦8A5ƒ1ƒ-<)Ã$ V‹¬é 3«Jÿ0ûH÷·ófðlí½ê^èJæˆäãÌáÉà àzßßòÞéÞßNß°ß-àÃàná0âüâÞãÅä¼å·æ·ç¹èºé¸ê®ëžìyíJîýîŸïð|ð©ð¸ðŒð3ðšïÍîºíoìàêé çÌäUâ»ßüÜ"ÚC×aÔŒÑ×ÎBÌåÉÈÇìÅfÄ3ÃPÂÕÁ¤ÁÖÁTÂ%Ã?Ä—Å4ÇüÈýÊÍeÏÈÑBÔËÖiÙܸÞ_áäÁænéìºî[ñîóöù„û÷ýeÃl° î Fe|…‘‚€eI )"÷#Ë%'N)+¹,f. 0«1D3Ù4e6ë7i9ß:O<±=?Y@˜AËBãCòDÚEµFbGøGZH•H˜HbHóG6G7FæDACIAõ>M ~ ± Úý#'&ëÊ!¡#m%7'÷(¯*g,.¹/Z1ö2‡4679—:@[AB¯C¹D²E‡FDGÙGJHŠHšHoH H_GlF+E—C±Ao?Õ<â9›6þ2/ë*ˆ&ñ!:j˜Á jÅüËøõ®ñ’îÅëGéç2å›ã@â-áRà°ßAßßéÞß2ß‹ßû߈à+áâá¬â…ãjä\åQæTçQèWéRêOë>ì#í÷í¶îaïçïXð•ðµðžðUðØïï'îóì|ëÊé×ç¯åJãÄà ÞCÛ]ØÕ£ÒãÏ>ÍÌʘțÆþĞçÂýÁ²Á¾ÁÂÐÂÌÃÅ‘ÆHÈ4ÊIÌ‚ÎÚÐKÓÏÕcØÛ«ÝXàã¶ågè ë·íTððòõ øŒúýsÿØ4†Ð F k–§ÀÀĸ¦k!G#%Þ&Ÿ(Z*,¼-h/ 1¤2;4Ç5U7Ð8P:»;(=ƒ>×?AQBwC„D‚E]F G¾G1HƒH”HHH‡GFoEëCBå?[=}:@7»3Ý/Ä+g'Ù")]†ºô TÝ”ý”ùÍõWò+ïMìÃéç‘åèã€âdáwàÑßSßßíÞûÞ(ßzßãßnàáÁáâ^ã9ä-å!æ!çè$éê ë ì÷ìÌí’î=ïÑï>ðð­ð£ðfððïFïVî2íÇë ê=èæÈã=á—ÞÈÛòØ Ö3ÓfÐÀÍFËýÈÇDÅâÃлÁ·Á ¦šÃÌÄCÆòÇÑÉáËÎeÐÒÒQÕä×€Ú(ÝÑß…â/åâç‰ê5íÐïpòõ÷ú‰üúþc¾_œ Ø 'ET^`VH.!é"¹$†&E(*º+k-/·0U2ê3|57ˆ8:u;à“?Ü@B;CTDME4FûFG HqH–HH7H¡GÓF©E>DqBW@à= ;í7k4§0’,E(À#M~£è 9¸mþVú‰öóÆïÚì=êòçìå:äÅâ•áªàéßqßß÷ÞõÞ ßhßÎßRàêà›á\â.ãäûäòåìæðçíèðéëêßëÈì¥íiîï´ï'ðð§ð§ðtððhï‰îlíìxê—èŠæ7äÂáßVÜ~ٜ־ÓñÐBκËoÉ[ǙŠÄÃ8ÂÈÁµÁòÁ†ÂeÃÄõÅÇqÉyˤÍðÏWÒÕÔc×ÿÙ£ÜOßþá«ä]çê±ìPïìñ„ô ÷”ùüþíG£é2 f ˜¾Ùïùüõçд Œ"_$+&ð'®)f+-Â.c02š3-5¹6;8¹9.;–<ÿ=O?ž@×ACDE FÒFGHcHHˆHEHÆGúFëE„DÔBÂ@`> ;85i1a-)¨$ýCjšÒ ›>ÿ#ûC÷®ócðkí»êbèOæ‰äãÎáÕàà„ß'ßúÞõÞßWß»ß5àÍàvá7âãäãÌäÂ弿»ç½è¼é¼ê­ëìvíEîúî–ïðnð ðªð{ð$ð…ï¹î¥íUìÉê÷èñæ¯ä<âŸßáÜ Ú*×NÔxÑÈÎ5ÌÝÉ¿ÇìÅeÄ5ÃZÂÛÁ³ÁâÁgÂ6ÃSĬÅIÇÉË5ÍÏÝÑZÔãÖ}Ù ÜÊÞxá'ä׿€é/ìËîpñÿó“öù–ûþuÓ/và ö /Ovƒ˜•”ˆpW ."$Ð%š'U)+Á,m.0±1N3Þ4k6ñ7l9æ:Q<¶=?Z@šAÊBãCïDØE­F`GëGUH‡HHTHáG$G&FÌD-C-AÜ>.<,9Ï5$22.ö)‰%ì .`‹¿  xìûø^ôñùíBëÑè¶æßäTã âá6àœß9ßßõÞßKß§ßà®àUáâÜâ¸ãä’åŠæ‰çŠè‹é‡ê€ëmìLíîÔî{ïùï`ð•ð«ð†ð5ð¨ïàîÞí›ìëZéTç&å´â&àhÝšÚ»××Ô ÒG϶ÌLÊ&ÈAÆ­ÄlÃÂïÁ·ÁÓÁKÂÃÄgÅõƻȪÊÍÌÏmÑÙÓhÖùØÛFÞòà£ãQæýè¨ëJîíð€óö™øûŽýýÿ[»P ˆ Á å /32$öÕ!©#w%A'ý(¼*m,.Â/`1ý246£7$9›: @_A‹B­CºD«EƒF@GÐGBH€H‹HeH÷GOGVFE~CšAQ?»<Å9}6â2ø.Ò*g&Ö!P€®ø ^ñ¼üÁøõ§ñ”îÃëKéç8å¡ãHâ3á]à¸ßJßßóÞ ß?ß‘ßàà4áëá´âŒãpäcåVæZçRè]éRêRë<ì!íõí³îYïãïJðð¥ð‘ðDðÇï ïîÛìdë²é¹ç—å-ã¨àòÝ%ÛKØgÕ‘ÒÏÏ0ÍÄʋȞÆöĥé½ÁËÁ/ÂßÂâÃ"Å¥Æ_ÈJÊ`ÌšÎñÐbÓåÕ}ØÛÆÝjàãÌåxè$ëÉíhðó’õøœúý‚ÿéC–Ü P |¢´ËÍд–z!L# %æ&§(f*,É-l/1¬2@4Ñ5V7Ù8Q:Á;+=‡>Ø?APBvC…D}E[FGµG-HuHŒHmHHsGŒFXEÔCùAÌ?>=`:$7™3Ã/¡+J'¾" Gl£à CÌŠý‰ùÅõRò(ïMìÄé†ç•åëãŒâfá„à×ß^ßßøÞß2ß‚ßíßxàáËá‡âeãAä4å'æ&ç$è&é#êëìôìËíî7ïÊï6ðð£ð“ðWðàï1ïCîí¯ëê!èÿåªã%ázÞ²ÛÙØôÕ!ÓSеÍ5ËùÈ÷ÆFÅãÃÔÂ$ÂÄÁÅÁ·¯ÃÞÄYÆÈèÉ÷Ë*Î|ÐèÒiÕú×–Ú?Ýçß™âDåøç›êJíâï„òõ ÷ úšü ÿqÏ"m« å 5Q_lieP<!õ"Á$‘&N(*Á+s-/¾0[2ô35 78:|;á–?Ü@B9CSDKE2FóF™GHgHŠHuH#H–G»F˜E$D\B:@Æ=ñ:Í7N4ˆ0s,((¢#ù3dÑ (©`þLúöýòÁïÝì;êöçòå=äÎâœá°àõßwß!ßÿÞß%ßußÓß`àíà¨á_â<ãäå÷åñæöçïèõéëêáëÇì£ídîï¦ï'ðpð ð—ðeðöïUïtîVíùë\ê€èmæ ä£áß;ÜgÙ†Ö©ÓáÐ0αËcÉZÇ“Å#ÄÃ>ÂÖÁ½Á•ÂzàÄƯNjÉ˺ÍÐoÒëÔ|×Ú½Üaßâ¿äpçêÁìfïýñ–ô÷¤ù!üþüX¯û= v ¦ÊçûòÛ½ ˜"h$5&ù'·)n+-Ç.o0 2¤325½6C8»93;ž<ü=V?œ@ØACDEFÑFyGÿG[H„H{H8H²GêFÔErD·B®@A>‡;m85G1E-)ˆ$ç!W€¾ Š2ÿû9÷¨óbðhí½êdèQæ’äãÚáØàà‡ß6ßÿÞßßcßÂßAàÒà„á9âãæã×äÅåÂæÀçÀèÀé»ê¯ëœìuíBîöîïðcð—ðšðrð ðxï¢îíAì­êáèÖæ•ä"â„ßÉÜôÙ×8ÔhѶÎ*ÌÒɼÇåÅjÄ3ÃfÂàÁÁÁòÁsÂMÃaÄÅÅ]Ç+É)ËMÍ”ÏõÑqÔøÖ•Ù4ÜâÞ‹á>äèæ˜é=ìäî}ñô¢ö'ù§ûþƒä:‹Ë 6b|–ž¦ž’}^ ;"$Û%¢'_)+Ê,t.0¸1U3ã4s6ó7u9ç:W<¸=?]@œAÇBçCçDØE©FXGæGIH~HHHHÎGG F¼DCA¿><9°5 2.Ü)k%Í Cw¨ ûh âûø÷ZôñúíAëÓèºæãä[ãâá>à¦ß@ß ßüÞßTß®ß(à´à`áâçâ½ã§ä•哿Šçè‹éŠêëlìKíîÓîqïöïQðð™ðzð$ð•ïÏîÈí‚ìë<é@çåžâàSÝÚ¥×ÃÔôÑ:ϤÌEÊÈ?ƬÄnÃ…ÂøÁÁÁäÁWÂÃ&Ä€ÅÇÐÈÅÊßÌ$Ï~ÑôÓ|ÖÙ³Û\Þá¹ãcæéºë`îúð˜óö¯ø&û¢ýpÅ\ š Ê ö,:@<1 Þ!³#‚%I' )Â*u,!.Ë/g13”4$6ª7&9¡: @[A‘B«C¶D¬E|Fáóáºâ”ãwägå_æZç\èYé[êMëAìíóí®îRïÝï@ð„ð™ð€ð9ð¯ïúîùíÈìIë™é¡çxåãˆàÚÝ Û4ØQÕ€Ò½Ï$ͷʆȖÆ÷ħïÂÂÈÁØÁ=ÂóÂñÃ8Å»ÆuÈbÊv̰ΠÑwÓÿÕØ0Û×Ý„à0ããå‰è;ëÙí|ðó£õ.ø®ú$ý”ÿøR¥ë+ ^ ‹¬ÃÖØÝϼ¦~![#'%ð&³(k* ,Ò-s/1²2F4Ø5\7Þ8V:Å;.=Š>Ú? AOBxCDzEXFG²G!HlH€HaHþGeGtFFE¼CáA±?#=C:7~3 /‰+('¢"î+TŽÊ 5»€ý~ù¿õOò$ïOìÃéˆç›åðã’âná‹àßßkßßß ß@߉ß÷ß~àáÏá–âeãOä5å0æ)ç&è.é ê&ëìùìÆíŒî3ïÁï/ðwð—ð†ðGðÌïï.îí™ëíéèååã á`Þ˜Û¿ØãÕÓFТÍ+ËðÈóÆCÅäÃÚÂ)ÂÑÁÑÁ'ÂÊÂÀÃòÄoÆÈÊ ÌCÎÐÓ|ÕجÚUÝþß®â]åè´êYíùï–ò"õ³÷0ú­üÿƒÜ2{» ò B]nwxl`D$!#Ê$›&W(*Ì+{-$/Ç0a2ú3‡578:{;é—?â@BT?¡@×ACDEFÆFuG÷GOH{HnH'H£GÖFÁEZD B‘@*>g;R8á4,1$-ã(l$Å 6p£ u'ÿ û3÷£ó\ðgí½êfèWæ•äãßááà$à’ß;ß ßß)ßlßÊßJàÞà†áHâãñãÝäÉåÊæÁçÆèÀé¿ê¯ëœìsí?îñîŠïð[ð‹ðŽð`ðþïdïŽî{í&ì—êÇè¼æzäâh߲ܨÙ×!ÔYÑ¥ÎÌÈÉ´ÇæÅgÄ:ÃiÂìÁËÁÂ…Â\ÃwÄØÅsÇAÉBËbÍ®Ï ÒŠÔ×­ÙJÜ÷Þ¢áRäýæ¯éNì÷î‘ñ$ô·ö7ù¶û)þ’õHšÚ  HkŽ®­«Ÿƒn B"$å%©'j)+Õ,|.#0Á1W3î4u6û7z9é:^<¸=?^@AÇBäCæDÔE¢FUGÛGCHqHtH9HÀGGüE¡DÿBù@©>ö;î8™5ä1ø-¹)O%³ ø.]• èWÿÿÔûò÷Rôüðûí>ëØè»æèäcãâáEà®ßMßß ß!ß]߸ß/àÀàfá âìâÆã¬äžå“æ”çè“éˆê†ëgìMíîÎîmïìïKðƒððkðð‚ï½î¯ínìæê#é%çìäƒâïß5ÝkڊײÔßÑ*ÏšÌ8ÊÈ9Æ®ÄpÃŒÂÿÁÏÁîÁlÂ+Ã>ÄÅÇèÈÚÊ÷Ì;Ï”Ñ ÔÖ*ÙÇÛsÞáÍã{æ$éÑënîñ¦ó3ö¿ø6û´ýÓ'j § Ù !9FKI;) è!¿#ˆ%U')Ë*€,'.Ó/n1 34(6±7+9¦:"@ZA’B©C·D¤E|F2GÅG-HjHwHCHÞG&G5FçDVCcA"?€<Ž9?6§2½.“*0&š!ëP„Ñ :Ø¡ü³øõ¤ñ‹îÆëKé$çAåªãXâAámàÉß]ßßßßRߣßàžàHáùáÅâ–ãƒähåiæ\çaè^éXêSë;ì íïí©îOïÒï;ðwðŽðrð&ð¢ïäîçí¯ì3ëé‡ç`åúâsà¿ÝöÚØ?ÕjÒ°ÏÍ®Ê}È•ÆõīóÂÂÒÁæÁLÂÃÄLÅÏÆŒÈwÊŒÌÈÎÑ‘ÓÖ¦ØGÛìÝ™àFãôå¢èIëðíŽð%ó·õ=ø¿ú4ý£ÿ`¶ö; k —¹ÏâææÚÈ®!a#1%ù&¹(w*(,Ö-}/!1¶2R4Ù5d7â8Z:Ê;0=Œ>Ü?ARBtCDwERFG©GHaHuHSHðGSGaF3E¤CÌA•? =&:ê6`3„/k+ '‡"Ô?vº #®týsùºõJò!ïNìÆéŠç åöã—âyáàëßnß,ß ßßAß™ßü߈à#á×áœâpãOäAå0æ0ç,è)é+êëìòìÅí‡î-ï»ï&ðmð‰ð|ð5ð¾ï ïîòì}ëÙéìçÎåsãõàCÞƒÛ©ØÌÕùÒ4ЖÍ!ËéÈïÆAÅèÃÜÂ4ÂØÁàÁ1ÂßÂÍà ÅÆ3ÈÊ#ÌXΪÐÓ˜Õ$ØÅÚiÝàÅâiå"èÁêpí ð¥ò7õÂ÷Aú¼ü)ÿî>ŠÇ ÿ +Miz…ukN/!#×$Ÿ&e(*Õ+-,/Ì0j2ý357š8:„;ê›?ß@B=CJDHE(FéFGHUHsH[HHrG•FpE÷C,B @‹=¾:74L08,î'j#Ã4d« ŽFþ:úröóò»ïÜì>êúçúåHäÚâ®á½àà†ß5ßßß;߃ßìßiàá¯áxâAã)ä åæþæöçþèòéòêßëÇìšícî ï£ïðað‡ð|ðGðÔï1ïKî*íÊë+êNè;æèãuáÇÞÜ3Ù^Ö€Ó¿ÐΙËSÉMÇ‘Å&Ä ÃPÂåÁÛÁºšÃÍÄ0ÆáDzÉÀËäÍ7ЛÒÕ§×@ÚæÜŽß>âçäœç=êîìƒï(ò¶ôB÷Èù>ü²þwÎZ ‘ ¿äÿ òÐ ­"z$I&(Ë)}+--Ù.{02°3@5È6N8Å9:;¥<>X?Ÿ@ÚACDEúEÆFmGïGFHnHcHH“GÆF©EID…B{@ >N;48È4 1 -Å(Q$«ó Y’ îjÿû,÷ó]ðdíÂêgè\æšäãæáëà*àžßCßßß3ßußÔßSàæàáOâãúãáäÒåÌæÇçÇèÅé¿ê®ëìoí>îéî„ïüïQð€ððSðìïTïwîgíì€ê¬è¢æaäìáQß–ÜÃÙéÖÔFÑ–Î̿ɯÇâÅhÄ>ÃoÂöÁØÁ —ÂlÃÄêÅŠÇWÉVË{ÍÁÏ&Ò›Ô*×¾ÙdÜß»ábäç¼édìï£ñ9ôÄöJùÆû9þ£Y§è $ Rz™«¸¼´¨“r Q"!$î%´'o)++Ø,ˆ.'0Ê1_3ñ4}6ÿ7}9ñ:^<¾=?^@žAÆBãCäDÐE FKGØG7HhHfH*H¯GðFæEŽDæBâ@>Ø;Õ8w5Ì1Ô-¡)/%™ àG‚ ÔLðÿÉûí÷IôþðõíCëØèÂæìägã!âáQà¶ßTßßß+ßhßÁß9àÇàná)âòâÎã±ä¥åšæ•ç–è’éêƒëiìIíîÌîcïéï>ðzð€ð^ððsï¦îíTìÑêé çÑäkâÓßÝQÚuמÔÌÑÏ‹Ì0ÊÈ5ƱÄpÖÂÂÚÁÂuÂDÃJÄ«Å0ÇÿÈîÊÍNÏ¯Ñ Ô©Ö@ÙÝÛˆÞ3áàãæ9éâë…î"ñ¹óEöÎøIûÀý)Œæ3z ³ æ .ESVTF2 ò!Æ#”%[')Ò*ˆ,..Ü/t13¡406³739§:@`AŠB®C­D§EsF.G»G&H_HiH8HÉGGFØD8COA?i%þ&È(w*7,Ø-‹/ 1Æ2O4ä5f7è8_:Î;2=>Ý?"APBtCDtENF GŸGHUHjHCHâG?GPFE‹CµAy?ð<:Ï6@3h/L+í&l"·û'`© ¢iýjùµõCò"ïKìÉéŽç£åýãžâáàðßzß2ßß!ßNßœß àà/áÞá¢âyãVäEå8æ2ç1è/é)ê"ëìñìÅíî,ï±ïðdð|ðkð*ð§ïýîîÚìhë½éÔç²å[ãØà+ÞjÛØ¸ÕäÒ"ЊÍËáÈêÆCÅæÃäÂ:ÂäÁîÁAÂðÂßà œÆJÈ*Ê>ÌkÎÃÐ,Ó­Õ=ØÚÚÝ*àÔâ‡å,èÞê|í!ðµòHõÓ÷QúÎü7ÿ¢ûN˜Ô  7[v…ŽŽƒtY9!#á$©&m(%*Þ+ˆ-6/Ñ0r24”57œ8:Š;è

    ™?â@B9CMDBE%FãF†GûGLHeHOH÷GaGƒFZEáCBí?t=Ÿ:s7ù3+0,Í'O#¦èO• ô:þ0úmöêò¾ïÖìEêùçæLäââ´áÅàà‹ßEßßßF߉߸ßpàá¼áyâPã)äåæçèúèûéïêáëÅìší]îïšïðYðvðsð3ðÇïï7îí³ëê6èæÔãTáµÞòÛ!ÙCÖqÓ«ÐÎËIÉKÇŽÅ&ÄÃVÂòÁæÁ,ÂʯÃÞÄIÆòÇÌÉÓËÎKдÒ/Õ½×XÚüÜ¢ßTâüä®çUêûìœï7òÈôU÷ÖùPüÂþ(ˆÚ%g Ÿ Êô #&,!ýÛ ´"†$P&(Ñ)‡+6-à.„02¸3C5Ñ6P8Ë9?;¤< >W?£@ØACDEøEÀFfGèG¿;¹8Y5®1¸-‚)%~ Äû3i È9äÿÂûâ÷FôúðôíCëÝèÃæöälã*âáYà¾ß`ß%ßß3ßqßÊßDàÎàzá.âûâÖã¶ä«åœæç”è™éŒê„ëjìFíîÅîaïÛï:ðkðtðNððïaïî‰í=ì¶êóèîæ¹äPâ¹ßÝ9Ú`ׇÔÀÑφÌ!ÊÈ1ƱÄtÜÂÂçÁ ˆÂPÃfÄ·ÅMÇÉË'ÍdÏÆÑ7Ô¿ÖVÙôÛÞGáöã æPéòë™î3ñÉóWöÝø[ûÎý=—÷?‰ Á ô <P_a_R<! û!Ò#%f'!)Ý*Ž,8.à/~13¨476¶7:9©:@bA‹B«C®D¡EpF&GµGHWHYH.H¶G GFÁD$C3Aë>Ká?ARBtCyDuEDFG˜G HNHZH9HÏG.G?FE{C–Ae?Ð<ð9¯6#3L/*+×&J" àN” •\ýdù¬õAòïOìÈé”ç¦åä¦â…á¥àúß‚ß<ßß)ßZߥßà—à7áäá®â|ã`äIå@æ4ç7è.é.ê!ëìîìÀí}î#ï­ïðXðsð[ðð—ïæîðíÁìSë£éºç™å?ã¿àÞNÛ}Ø¡ÕÑÒÐxÍËÖÈêÆ>ÅêÃìÂ>ÂôÁõÁVÂüÂöÃ0Å«Æ_ÈAÊRÌ…ÎÖÐDÓÃÕSØñÚ”Ý>àìâ–åEèíê‘í0ðÉòYõå÷aúÝüGÿ° Z¨à  Am{˜”›~dB!#ç$¶&r(1*ã+”-7/ß0r2 4™5!7 8:‰;ñ?ã@B:CID@E!FÜF€GóGBHYHBHæGQGqFCEÍCøA×?W=ƒ:X7Ù30,¯'5#‰Ð:‚ ãr-þ(úeöèò¹ïØìDêèæTäæâ¼áÐààšßGß$ß$ßQß“ßÿß|àáÄá…âRã4äåæçèþèûéñêâëÀìœíVîï‘ïðJðoðdð$ð¶ïï!îí˜ëüéèæ¸ã;á›ÞØÛ Ù,Ö^Ó›ÐøÍ„ËCÉBÇ‘Å%ÄÃ[ÂýÁñÁ=ÂÚÂÁÃòÄ\Æ ÈàÉéËÎbÐËÒFÕÓ×nÚݸßiâå¿çjê í°ïGòÚôe÷çùaüÑþ8•é4t « Úü+46*!ì ¸"”$V& (×)‘+<-é.‡0)2º3L5Ô6V8Î9D;§< >\? @ÞAûBDEöEºF^GÞG3HYHFHýGnG¡FEDWBG@Ø=;û7Ž4Ï0Ð,‹($w¾ò,l ÊNÿïú÷“óVðgí¿êpèbæ¨ä*ãöáøà>à®ßWß)ß$ßF߇ßçßeàôà£á^â*ãäëäßåÔæÑçÌèËé¿ê²ë–ìoí3îâîuïîï;ðkðeð2ðÍï,ïOî=íÞëRêyènæ-ä¸áßeܔپÖçÓ"Ñ{Îù˰ɣÇÝÅlÄEÃ| ÂëÁ.µ‘òÄưLJÉˬÍîÏRÒËÔR×ïÙ‰Ü9ßÞáä;çäé‹ì-ïÆñ]ôäönùãû\þ¾!v ? k”°ÄÎÔÉÀ¥‰ a"6$&Æ'ƒ)9+ë,“.90Õ1n3ü4ˆ6 8‡9÷:g<Á=?c@œAÈBÝCáDÈE”F?GÈG$HRHLHHGÊFÀE_D»B¬@\> ;8;5‘1š-d)ø$` «äZ ±-Ôÿ¹ûÚ÷Bôôðõí@ëâèÅæûätã-â+á_àÉßhß/ß%ß=ß|ßÑßOàÕàƒá6âãÚãÁä­å¥æžçœèšéê…ëgìGí îÁîZïÔï1ð_ðið?ðâïLïîqí)ìŸêÖèÚæšä:âœßðÜÚL×rÔªÑýÎrÌ!ÊÈ6ƪÄ|ßÂÂîÁ”ÂfÃvÄÍÅ`Ç&É Ë:ÍÏØÑRÔÓÖn٠ܳÞ]á ä·æaéìªîFñÛóhöñøgûãýG¬N— Ï )H]joi\J) "Ø#§%m',)å*•,A.æ/…13¬4?6º7B9«:!<~=Ö>#@`AŒBªC¬DœElF!G«GHGHRHH«GóFøE¨DCAÐ>0<89è5M2c.<*Ö%J!•×H™ ­ƒü—øóô–ñ†îÈëPé0çNåÀãiâ]áàèßuß<ß&ß6ßpßÀß3à¿à[áâÙâ±ãä‚åqæpçgèhé^êUë<ìíçí›î?ï»ï ðWðhðIðôïmï§î©íhìðê0é@ç å±â"àuÝ¬ÚØ×ÿÔ4Ò€ÏîÌÊiȉÆõÄ±ÃÆÂ0ÂôÁÂyÂ;Ã;ċŠÇÎȺÊÑÌ ÏdÑÓÓYÖêØ‡Û0ÞÖà†ã2æÝè„ë(îÃð]óèõsøïúeýÓÿ3‘Û& a “ ÀÜ÷ üèͪ!#N%'Õ(Ž*A,î-”/41Í2a4í5s7ñ8g:Ö;7=˜>Ý?&ANBuCwDpECFþF“GHAHQH)HÂGG(FñD`C‚AG?¹<Ï9“63*/+·&-"ˆÁü5€ ò‚SýYù¤õ>òïOìËé”ç¬åä¬âá­ààŽßCß)ß2ßbß²ßà¤à;áòá°âˆãbäRåCæ:ç<è0é4êëìîì½í{îï¤ïðKðiðMð ð‡ïÒîÝí©ì=ëŠé¢ç~å&ã¥àùÝ:ÛbØÕ½ÒÐmÍËÓÈáÆ?ÅíÃîÂIÂüÁÂc à ÄCÅÁÆsÈYÊiÌ›ÎðÐYÓÛÕiØÛ©ÝUàÿâ®åXèë§í@ðÝòlõó÷vúéü]ÿ»h·í + Qv›¨¡ž†pM!##õ$¼&}(9*í+˜-E/à024Ÿ5'7¥8:;ö¢?ã@B:CFD>EFÙFwGëG7HNH2HÚG>G^F0E³CäAº?<=g:87¿3î/â+’'#p³ê$l Õ_#þú^öäòµïÙìCêè æXäìâÅáÔà#à¢ßPß/ß.ßYß ßàˆàáÍáŒâ[ã;ä!åæçèéüéòêãëÁì–íUîýîïöïCðbðTðð¡ï÷î îêì‚ëãéèëåœã#á€ÞÀÛóØÖHÓŒÐçÍyË:É=ÇÅ)ÄÃgÂÂÂJÂëÂÔÃÅtÆÈùÉÌ-ÎzÐáÒ_Õé׆Ú%ÝÒßzâ(åÕç{ê$í¿ï]òìôw÷øùqüáþH¥øC‚ º è (7AB7+ò Ç"›$c&&(â)˜+G-ï.‘0-2Ä3Q5Û6Z8Õ9G;­< >]?¥@ÚACD EòE´FYG×G(HMH9HíGaGŒFoED=B1@·=þ:Ø7t4®0²,l(ù#Z£ØV º;öþàú÷‹óSðdí¿êsèdæ­ä1ãúááAà»ß^ß3ß,ßRßßößgàá¤áiâ2ã äõäãåÙæ×çÐèÌéÃê²ë•ìní.îßîoïãï6ðZð]ð ð¿ïï@î"íÍë5êbèTæäœáßGÜ€Ù¥ÖÔÓÑlÎí˧ÉÇÛÅkÄJÄÂÂüÁ9ÂÇÂ£ÃÆÄ*ÆÉǙɚËÀÍÐjÒßÔm×Ú¨ÜHßøá¤äOçúéŸì?ïÚñlôûöyùûûdþÔ/…Ð H ÀÏÞÜØÈ±• j"C$&Ñ'Š)C+ó,›.A0Ý1s35Œ689ú:j<Å=?e@AÈBÜCÞDÄEF:GÀGHIH>HHG¶F®EID B–@=>ˆ;}85t1y-K)×$G ËC  Éÿ¬ûÑ÷=ôïðöí@ëãèËæüä|ã3â4ádàÔßoß9ß/ßFß‚ßàßQàâàˆá>â ãàãÆäµå¨æ¤çžèœéê†ëgìDí î¹îXïÌï%ðXðWð4ðÎï>ïgî`íì‰ê¾è¾æƒäâ‡ßÕÜ Ú2×bÔ–ÑðÎdÌÊþÇ0ƫĀâÂ)ÂùÁ+¦ÂwÈÄäÅsÇ>É4ËSÍ“ÏóÑcÔïÖÙ#ÜÄÞuáäÍætéì¼îZñëó{öùyûòýWº_¢ Þ 4Xe{wvhQ6 "â#³%t'6)í*ž,I.î/‹1&3³4A6Ä7?9·:<„=×>%@`AB§C«D˜EgFG¤G H>HDHH™GåFáE–DöBA¸><9Ë5/2E.!*¶%1!|»ô2„ š|üŽøìô”ñ‚îÈëUé/çWåÂãqâcáŒàíß‚ßCß/ßAßvßËß:àÈàdáâàâ¸ã™ä„å{æpçnèjéaêSë>ìíåíšî3ï¹ïðPðYð<ðâï]ï“î”íTìÕêé#çôä–â àZÝ–ÚÁ×ëÔ$ÒnÏãÌ…ÊcȆÆôÄ´ÃÍÂ6ÂÂÂŽÂGÃRÄ›Å&ÇßÈÔÊæÌ#Ï}ÑéÓoÖÙÛDÞîà˜ãHæîè™ë;îÕðoóúõƒøûuýáÿDë3 o   ÌêñÚ±!‹#V%'Þ(˜*I,ö-/91Ö2f4ô5v7ø8j:Û;<=–>ã?"ASBnC{DiE@FùF‹GøG8HCHH²G GFÚDJCjA,?ž<²9x6æ2/ð*š&"h­à!o ÜzCýQùŸõ7òïNìÊéšç¯åä´â“á·àà—ßLß2ß=ßjß¹ß%àªàGáõá¼â‹ãnäUåIæBç:è;é-ê(ë ìðì¸íxîïžïðBðYðEðõïyï½îÈí”ì$ëqéŠçcå ãŠàáÝÛMØxÕ«ÒõÏ]Í÷ÊÉÈÞÆ>ÅîÃõÂOÂÂÂsÂÃÄTÅØÆˆÈoÊÌ´ÎÑtÓîÕƒØÛÃÝfàã¿åmèë·íWðìò~õø…úûüiÿÏ({Á 5 _‚™«°±£”yV!/#ý$Ä&‡(@*õ+¢-J/è0†24¥5,7¬8 :–;ô¡?ä@B8CED;EFÓFsGßG2H?H)HÇG0GJFE›CÎAŸ?&=E:!7›3Ö/Á+w'÷"V—Ö ^ ¼VþúTöÞò´ïÕìFêè æ^äòâËáÜà,à©ßZß7ß8ßaßªß à’à$áÖá’âcãAä'åæç èéêòêãëÀì“íRî÷î†ïïï8ðVðHð ðïæîøíÔìlëÊéççÓå€ã ágÞ§ÛÝØÖ6ÓxÐÝÍlË3É9Ç‹Å*Ä Ãl Â[ÂùÂçÃʼnÆ1ÈÊÌAΔÐõÒwÕþ×Ú9Ýçßâ;åëçŒê9íÒïlòõ„÷ úüòþW´P É ñ/GJMD2ù Ó"£$l&/(ì)ž+R-ô.š042É3X5á6_8Ù9J;²<>a?¤@ÜACD EìE±FRGÌG#H>H0HÛGQGyF\EêC,B@¥=Ü:À7T4“0“,R(Ù#C†ÂÿA ¨-çþÛú ÷‹óMðdíÂêrèlæ°ä6ãâáPà¿ßkß;ß6ß[ß–ßþßrà á°áqâ6ãä÷äëåÞæÙçÔèÎéÄê²ë–ìhí.îÖîjïÝï(ðRðKððªïï(îí´ëêIè:æøã„áíÞ0ÜfÙ“Ö¼ÓÑXÎäËÉ—ÇÛÅjÄPÉÂÂÂHÂØÂ´ÃÙÄ?ÆÜDZɯË×ÍЀÒöÔ…×Ú¿Ü]ßâ·ädçê²ìPïîñ~ô ÷ùüyþà>•ß [ …±ÈÞçèäѾ› x"H$&Ô'—)I+û,¥.F0ä1{3 5“689ÿ:p<Ä=$?a@ŸAÇBÚCÝDÀEŒF2G¸GH>H2HñGmG¨F”E:DƒB@!>k;`85S1_-))½$) t³ì/ Ž ¾ÿŸûÌ÷3ôïððíCëäèÌæå}ã?â8áoàÛßzßBß8ßPߌßèß]àëàáIâãêãÍä¹å°æ¦ç¦èšé—êëlì=í îµîNïÇïðOðKð"ðÂï'ïYîEíúëoê¥è¤ækäýáp߸ÜòÙ×JÔ‡ÑÝÎZÌ ÊöÇ/ƬĄêÂ0ÂÂ:·‡ÃÄõÅŒÇTÉLËgÍ®ÏÒ~Ô×—Ù8ÜÜÞˆá3äßæŠé.ìÑîjñô‹öùŒûþgÉ!l³ é D_yˆs^> "ì#½%|'A)ò*¨,P.ö/“1*3½4F6Ê7E9¹:#<‡=Ú>(@`AŒB¨C§D—EcFGŸGH4H8HþG‹GÐFÑE}DÞBë@™>ü;ú8¯52'.*œ%!`£Ùq ínü…øåôŽñƒîÆëWé1ç\åÇãzâgá—àõß‹ßKß8ßL߀ßÒßHàÌàrá!âéâÀãžäå|æxçqèlédêRë>ìíâí“î3ï­ïðAðQð)ðÙïDï…î|í>ì¾êé çÛäyâñß@ÝÚ©××ÔÒ`ÏÔÌ~ÊXȆÆðĺÃÐÂB Â(ÂÂXÃiĪÅ>ÇöÈçÊÍ6Ï•ÑÔ†ÖÙ´ÛYÞá°ã[æé­ëKîíð}óö”øû‰ýïÿU­øD { ° Øø"üåº!—#^%)'æ( *R,þ-¤/B1Ü2l4û5}7ý8n:Þ;?=š>å?#AQBpCwDgEßCßvßÃß,àµàNáâÃâ“ãsä^åMæGç@è9é6ê"ëìêìºíqîï–ïüï9ðLð5ðçïgïªî²íì ëYéoçIåóâoàÈÝÛ7ØcÕ—ÒæÏLÍóʽÈÝÆ;ÅòÃ÷Â[ ÂÂ3Ã+ÄoÅèÆ¢ÈƒÊ˜ÌÉÎшÓÖ—Ø4ÛÕÝà*ãÖåè)ëÉíjðóŽõø–ú ý}ÿÛ:ˆÐ C l¨µÀ¹±Ÿƒb!:#%Ô&‹(O*ø+¯-N/ô0‰2 4«537°8&:˜;ø ?é@B9CCD7EFÌFiGÜG"H8HH¸GG6FE†C±AŠ?=-:ÿ6€3µ/£+Y'Ú":¹ùC ±Cþ úMöØò±ïÔìHêèæaäýâÏáéà/à·ßaß?ßDßiß²ßà—à1áÜášâjãHä.åæç è éÿéùêÞëÃìŽíPîóî|ïëï*ðLð:ðöïƒïÎîçíºìWë®éÒç´åjãíàOÞŽÛÃØïÕ ÓjÐÌÍcË(É6ÇŠÅ)Ä)ÃmÂÂÂk ÃùÃ,ÅÆJÈ"Ê2ÌWΫРÓÕسÚQÝýߥâQåè¡êMíäïòõœ÷ú—üýþiÃb Ö %@OYYNA%!Þ"«$x&7(ô)©+U-/Ÿ0<2Î3a5á6j8Ù9Q;´<>c?¥@ÚAC D EèEªFNGÄGH4H!HÏG>GgFFEÔCBö?‰=À:£724x0p,6(½#$lªå2 ‘ ÚþÎú÷€óNð^íÅêtènæ·ä<ã âáSàËßsßCßDß^ߦßÿß‚àá½árâCãäåðåâæßç×èÒéÄê¶ë’ìkí'îÔîcïÔï!ðFð>ðð™ï÷îîùìëê0è!æÜãláÐÞÜNÙzÖ­ÓíÐNÎÖË”É“ÇØÅkÄUÃŽÂ*ÂÂWÂçÂÉÃéÄYÆìÇÍÉÂËóÍ1ÐšÒ Õ›×.ÚÒÜtß$âÊä{çêÉìcïÿñ“ô÷¡ùüŠþðN¢ï. j ‘ÀÒïð÷íÞȧ "S$&ß' )O+-«.P0ê1€35—68“9;q<Ì= ?h@AÈBÙCØD¾E…F-G°GH3H&HàG]G•FE#DlBf@>P;C8ä451B- )¢$ [™Ô yû¯ÿ•ûÂ÷.ôêðïíCëåèÒæå„ãEâ>áyàâ߃ßJßAßZß•ßòßcàôà™áPâãòãÏäÄ峿«ç¨èœé™ê‚ëiì?íîµîEï¾ïð?ðCðð±ïïEî0íäëWêè‹æNäèáRߣÜÚÙ×7ÔvÑËÎRÌÊõÇ)ƭĈíÂ=ÂÂHÂÇÂ—Ã³Ä Æ ÇkÉ`˃ÍÁÏ!Ò“ÔׯÙMÜóÞžáFäöæ›éDìáîñô¢öùŸûþyÚ-~½ û (Pm…Œ“‰‚dM #"ù#Ä%Š'E)+®,X.0—143Á4L6Ð7I9¾:'<ˆ=à>$@eAŠB¥C§DE`F G—GøG+H)HôGwGÁFºEjDÇBÑ@€>Þ;à8‘5ò1 .á)%õ EŠÂ _ Þdü|øáôˆñƒîÃë[é6ç^åÐã~ârážàýß•ßSßDßRß‹ßÛßPàÕàyá)âõâÁã©ä傿}çsèpéeêTë?ìíâíŒî.ï¦ïð6ðFððÈï5ïnîjí'ì¥êêèíæÃä_â×ß)ÝdÚ•×ÁÔþÑPÏÇÌrÊVÈ~ÆöÄ·ÃÙÂKÂÂ9§ÂoÃtÄÇÅMÇÉüÊÍOÏ«ÑÔžÖ-ÙËÛoÞáÄãoæé¿ëaîýðó!ö¤ø"û–ýa¾R ˆ ½ æ&.) ìÇ!Ÿ#h%1'ð(¦*^,.®/G1ã2t4þ5„79t:ã;@=>æ?#ASBmCvDcE8FëF~GåG$H)HH’GæFóE­D C5Aû>f6ª2Ó.¶*\&à!.|°÷H ½Z0ý<ù”õ-òïMìÎé ç¹åä¿â¥áÂàà¦ß`ßEßNß}ßÍß5à¾àTá âÈâ›ãyäcåRæKçCè=é6ê%ëìéì¶íoî ï“ïïï/ðBð$ðÚïSï–î ífìõê@éWç.åÚâVà®ÝñÚØPÕƒÒÖÏBÍäÊ»ÈÕÆ=ÅóÃýÂbÂÂ-ÂÂCÃ?Ä‚ÅþƶÈÊ©ÌäÎ1Ñ ÓÖ«ØKÛèÝ—à=ãëå”è:ëßízðó õ'ø¨úýŒÿëH–Þ M {›±ÅÇǾ¦‘j!B#%Õ&›(P*,²-X/ù0‘2'4¯597´8-:˜;=T>«?á@B4CCD4EFÊFaGÔGH,H H¬G G'FñDpCšAn?ë<:ã6c3—/†+>'º"$a¤ã0 ¡3ûýúEöÕò¬ïÖìFê èæjäþâÜáëà=à»ßlßIßKßsß½ßà£à6áçá¢ârãNä2å'æçè éêöêâë¾ìíIîïîuïáï"ð@ð+ðéïpï¾îÑí¦ì>ë˜é·çåOãÔà5ÞwÛ¬ØÛÕ ÓZнÍXË!É/ljÅ-Ä)Ã{Â$Â#Â{ÂÃÄ;ŵÆ]È;ÊDÌrοÐ&Ó¢Õ.ØÇÚhÝà·âjå è»êZíøï“ò!õª÷+ú¢üÿwÐ&n« å 8Eb_gYK.!å"µ$‚&<(*¬+c-/©0@2Ø3c5ì6j8ã9P;»<>f?§@ÚAC D EâEªFAGÀG H(HH»G1GSF3E¾CúAà?k=¨:„74X0U,( # P•Ð † ÎþÇúúö‚óFð`íÃêwèqæ¼äBãâá[àÔßyßOßHßnß©ßà„àáÁá}âIã!äåóåéæâçÙèÖéÄêµë“ìfí%îÎî]ïËïð8ð4ðôïïÝîîàìŠëêéèæÇãNá»ÞþÛ;ÙaÖŸÓ×ÐCÎÊË‹ÉÇÔÅmÄX×Â1 ÂdÂùÂÙÃÅgÆÈÜÉÝËÎJаÒ#Õ²×CÚåÜß5ââä‹ç4êÚìwïò ô0÷¬ù+ü—þ]°ý< v ¢ÈâöþûèÒ² ‹"\$'&è'¨)Z+-°.Y0ï1‰35ž6 8˜9 ;s<Î=$?f@¡AÅBÙC×D¶E…F"G¬GùG*HHÖGKG‚FoE DWBL@ì=5;&8È41%-í(…$ïD}à jì¡ÿ‹û¹÷)ôçðííEëæèÖæåŠãLâGáàìߌßUßKßbߟßúßmàþà áXâ ãøãØäÆå¸æ°ç«è¡é—ê…ëfìAíûí±î>ï¸ï ð3ð5ðð ïï.îíÍë=êvèoæ6äÍá;߉ÜÂÙóÖ ÔfѽÎDÌùÉìÇ(ƯĈûÂ>Â#ÂOÂÛ¨ÃÅÄƶǀÉxË—ÍÚÏ5Ò«Ô1×ÄÙeÜß³á\ä ç±éUì÷îñ"ô±ö1ù¯û!þ†ê<É 0cv‘™˜ˆuR 2"ÿ#Ï%’'N)+¶,a.0 183É4P6×7L9Ä:*<‹=á>'@bAB¡C§DŒEYF GŒGðG HHãGkGªFªERD²Bµ@h>À;Å8t5Ô1ï-Á)g%Ö .n®ò P ÈxUüuøÛôƒñîÅëZé;çdåÓã‡âyá¤à à›ß_ßLß\ß“ßåßWàáàá5âõâÏãªäšå‡æçvètédêYë9ìíÚí‹î&ï ïùï/ð3ððµï$ï\îQíì‹êÒèÖæ¨äEâ¿ß ÝPÚ{×°ÔëÑ@ϾÌeÊRÈyÆõĽÃßÂRÂ#ÂC»Â~Ã‹ÄØÅdÇ$ÉË-ÍiϾÑ2Ô°ÖFÙßÛ„Þ/áÕã†æ*éÓërîñ¡ó4ö³ø5û£ýoÍ` • Í î"867'öÒ!§#t%:'÷(°*c, .´/O1è2z46†79v:å;F=ž>æ?'AQBlCsD^E5FäFyGÚGHHñG…GÓFáE–D CAâ>I<^962³.š*A&Â!b—æ0 ±I&ý3ùõ'òïJìÒé¡ç¿åäÊâ§áÎà%à¯ßlßJß]ßƒßØß>àÆà^áâÍâ¥ã}älåUæRçEèAé5ê)ë ìîì¯ílîï‰ïèï%ð5ððÈïBïƒîŠíQìÜê)é:çå¿â<à–ÝÖÚ Ø:ÕsÒÅÏ5ÍÚÊ´ÈÒÆ=ÅóÃÃjÂ'Â9ŸÂSÃSÄ–ÅÇÌȱÊÄÌ÷ÎJÑ´Ó7ÖÄØ\ÛÞ¥àXãüåªèMëóí‹ð&ó­õ?ø²ú0ý–ÿýV§ê+ [ ˆ©¾ÐÒÓÇ´™v!L#%ä&(_* ,¾-\/1•2.4µ5=7º8/:ž;=[>¦?é@B8Ch?¤@ßAúBDEàE F?G³GHHH°GGBFEªCàAÈ?O=Š:i7ö3?05,ú'…#î8|¸ sýÅþ·úûövóGð]íÈêxèxæ¿äKãâ$ácàÝß„ßWßUßtßµßàŽà#áÊá„âRã&äåöåñæãçßèÔéÊê°ë–ìaí#îÉîUïÄï ð/ð$ðèïxïÎîîíËìpëÔéüçðå§ã8ážÞêÛÙQÖ„ÓÍÐ0ÎÁ˄ɉÇÓÅoÄ[áÂ:Â-ÂtÂÃîÃÅ}ÆÈñÉöËÎbÐÆÒ;ÕÆ×\ÚüÜ ßLâõä¡çGêíì‰ï#ò¶ô;÷Ãù7ü¨þkÁ L ±Óð  óÝ» –"e$1&ò'°)c+-».\0ú135£6%8œ9;v<Ñ=&?h@¡AÄBÖCÕD³E}F GGöGH HÆG8GtFVEöC?B1@Ó=; 8¨4ü0-Ñ(f$Õ&i¥õ Sß’ÿƒû®÷'ôßððíAëëèÙæå”ãOâQáŠàñߘß[ßWßjß«ßÿßyàá«á_â)ãýãàäË彿¸ç©è¨é˜ê…ëgì;íüí«î:ï®ïð'ð)ðôïŽïôîîí¶ë#ê^èTæä±á!ßpܪÙßÖ ÔWѪÎ<ÌëÉëÇ"ƯĎüÂOÂ'ÂdÂæÂ¼ÃØÄ4ÆÊǘɋ˴ÍìÏQÒ¿ÔH×ÛÙyÜßÈáräçÄéhì ï¢ñ4ôÃöBùÀû.þ™÷M™Û  Cl…œ§§¤“|b 6"$Ó%Ÿ'U)+¿,e.0¥1@3Ð4U6Ú7T9Å:1<Œ=ã>)@dAŒB¡C¤D†EZFýFŠGãGHHÓGZGšF”E=D™Bœ@P>¢;ª8T5¶1Ï-¦)F%½ V—Ú > ¸iKüjøÕôñîÆë[é>çgåÚãŽâá®àà¦ßfßWßdßžßïß`àêà‡á<âãÒã´äœåŽæ…ç{èvéfêZë8ìí×í†î ï–ïóïð+ðð£ïïBîDíõëyêµè¾æä+â£ßöÜ6ÚfךÔÚÑ0ϯÌ_ÊFÈ}ÆîÄÄÃàÂ^Â+ÂTÂÈ‘ÜÄìÅ{Ç9É-ËBÍÏÔÑJÔÉÖZÙùÛ˜ÞFáìã™æAéåëˆî"ñµóDöÄøFûµý"‚Ø(k ¥ Ù ü!2BDB0"ýß!±#|%D')»*i,.¸/[1í24 67 9~:ç;I=¢>ç?(AQBlCoD^E,FãFkGÖG HHâGuGÁFÍE‚DñBAÇ>.<@96o2–.z*#&¢!þB†Ç$ š>ý)ù†õ#òïHìÕé çÅå!äÑâ®áØà*à»ßrßXßaß‘ßÝßJàÍàháâØâªã‰ämå^æTçIèFé7ê(ëìæì²íbîï€ïàïð'ð ð¶ï3ïnîví9ìÄêé"çøä¨âà}ݾÚñ×%ÕaÒ±Ï+ÍËʯÈÌÆ;Å÷ÃÃsÂ0ÂH¯ÂcÃiÄ£Å1ÇÜÈÌÊØÌÏcÑÎÓKÖÜØtÛÞ¿àiãæ¼èeëî¥ð3óÆõIøÉú=ý©ÿc¶û7 l ”¶ÌÜáÝÔ½¦!U#%%ê&¬(c*,Ä-d/ 1œ244¾5A7¿86:Ÿ;=Y>¬?å@B4C@D,E F»FVG¾GHHïG‹GéFþEÈDBCgA9?µ<Ø9¦6'3X/M+ý&ˆ"ä3q´ yÞýñù3öÌò¨ïÑìKê èærä ãèáýàMàÎß}ß^ß\߉ßËß6à°àLáóá´âã\ä@å0æ#çèéêøêâë¼ìŠíBîâîjïÍïð%ððËïKï—î¨íxìëbéˆçeåã¡àÞFۀثÕìÒ4ФÍBËÉ'džÅ0Ä5ÊÂ:Â?—Â>Ã1ÄgÅÜÆŒÈeÊvÌœÎðÐUÓÏÕ^ØòÚ—Ý9àæâå9èàêƒíð¹òDõÏ÷KúÅü1ÿ•ó?Ç ÿ (Nbyw€mbC'!ù"Ë$‘&T(*À+r-/¸0P2á3s5ó6w8ê9Z;À<>h?«@ÛAþB DEÝEšF9GªGúGHøG¡G G0FE”CÆA¯?3=p:H7Ý30,Ö'm#Í#]¥ñ aï¶þ¯úñöqóDð[íÈêyè~æÂäSãâ,ákàæßßaß\ß€ß½ß àšà(á×á‰â[ã,äåþåôæêçáèÙéÈê´ë‘ìbíîÅîNï½ïð&ððÛïdï½îØí¶ìVë¼éãçÔåŽãá‚ÞÓÛÙ=ÖoÓ¼Ð"γË~ÉÇÒÅqÄ_èÂEÂ7Â…ÂÃÄ%Å“Æ3È Ê Ì2Î{ÐÛÒVÕÛ×tÚÝ·ßbâ å´ç^êýì¡ï4òÉôN÷ÓùGü½þ~Î[ Ž Ààÿ ÿæÈ ž"q$9&ú'º)i+-Â.f0ÿ1•3!5«6)8£9;}<Ñ=(?i@¡AÄBÔCÑD¯EzFG™GëG HH³G+G_FBEàC&B@¸=ú:í7‹4Û0è,°(L$¶M’ß @Ñ‚ÿzû¦÷!ôÝðìíDëíèÛæå–ãZâXáàüß¡ßcßcßo߸ßàƒà á²ágâ1ãäçäÑåÃæ¹ç±è§éšê…ëfì8íúí¢î7ï¢ïùïððåï~ïàîîñìŸë êCè<æä›áßXÜ“ÙÄÖþÓ=Ñ¥Î'ÌéÉâÇ!Æ±Ä‘ÃÆÂVÂ5ÂqÂøÂÐÃéÄIÆßÇ­É¦ËÆÍÐfÒÙÔ^×òÙÜ4ßÞá†ä2ç×éìï¶ñGôÐöWùÍûCþ¥ [¨ë Tt–§²µ­Ÿˆj D"$ã% 'e)+Ê,l.0¬1G3Õ4\6Þ7Z9É:3<=ä>+@dAŠB¡CžD†EQFùFGÝG HHÆGFGŒF|E*DB„@2>‰;Š885˜1±-…)-%œ ù=~É ) ª[@üdøÍô~ñ|îÇë^é@çoåÞã—â‡áµàà¬ßrß_ßnß§ß÷ßkàðà“áBâ ãÛã¹ä¥å‘æ‰ç€èwéiêZë5ìíÏí†îï’ïèïððïï•ïï/î-íÞëaê›è¤æräâ‡ßßÜÚQׄÔÇÑ Ï£ÌTÊ@ÈxÆñÄÆÃèÂfÂ:Â_ÂÜÂŸÃ³ÄÆ‘ÇOÉDËY͘ÏïÑ^ÔáÖs٠ܵÞUáä­æRéÿë”î:ñÃóWöØøUûÆý1‘è6{ ³ æ +@NPM=+ ç!»#‡%L' )À*u,.Ã/^1ö2ˆ46•7 9„:ë;M=¡>ë?'APBkCmDZE(FÛFfGÉGHHØGbG±F·EmDÙBì@¨>< 9ç5P2x.[*&…!ã)n² ˆ2 ý%ù{õ#ò ïMìÒéªçÅå+äÓâºáÝà6àÃß{ß`ßmߘßëßOàØàpá!âàâ²ãŠäyå_æ\çMèEé=ê%ëìãì¯í`îûîyïÚï ð ðøïªïï`îZí)ì©êùèçâä‰â à`Ý«ÚÙ×ÕMÒ¤ÏÍÄʦÈËÆ;ÅúÃÃ{Â<ÂW¼ÂzÃvÄ¿Å>ÇøÈÞÊòÌ%ÏyÑåÓbÖóØ‹Û+Þ×à{ã+æÏèwëî´ðFóÙõZøÚúNý·ÿrÄ D y ¡ÄÖêêéßǰŠ!^#/%ñ&µ(l*,Í-k/1¤2:4Á5J7À8=:¢; =^>©?ê@B5C9D-EÿE¹FLG¸GùG HÝG€GÔFëE²D+CPA?š<¼9‹6 3îÜîbïÄïððð¶ï=ï„î‘ídì÷êLémçLåã„àéÝ.ÛgØ›ÕÕÒ'ЗÍ6Ë É#Ç…Å3Ä9ÓÂEÂL¦ÂPÃCÄ{ÅòÆŸÈʆ̺ÎÑkÓçÕqØ ÛªÝQàúâ£åNèóê“í6ðÃò\õÚ÷_úÔü@ÿ¦O›Ó  4Yp‚‡ˆzkO/!#Ó$š&](*É+v-/¼0Y2å3z5÷6}8ì9a;¾<>e?®@ØACDEÓE™F,G¨GêGHêG’GúFFóD{C±A‘?=Q:-7¿3ý/ý+½'M#¶K‹ä Jå¨þ§úêömóAð\íÉêèæÌäVã(â1áxàëßšßgßjß…ßÊß'à¤à2áÜá”â_ã8äå æòæòçáèÝéÈêµëŽì`íî¿îHï±ïüïð ðÇïUï¬îÁí¢ì@ë¢éÌçºåtãákÞ¹ÛòØ$ÖaÓ¦ÐΧËtÉÇÎÅtÄcñÂMÂIÂÂ,ÃÄ;ŧÆJÈ Ê"ÌHΓÐðÒpÕî׌Ú'ÝÌßxâåÊçpêí°ïGòØôc÷àù[üÉþ-ŒÞ%j š Îì $" ðÓ ¦"|$?&(¾)v+#-É.m02›3(5¯6.8¨9;|<Ø=(?l@ AÃBÒCÏD«EqFGŽGâGHðG§GGLF.EÊC B@š=ß:Ó7j4Â0Ç,•(/$ò9xÍ 0¿yÿnû ÷ôÛðëíEëïèàæåã`âaá—à à¢ßvßc߂ߺßàŠàá½álâ<ãäðäÔåÊæ¼çµè©é›ê†ëdì7íóí¢î*ï¤ïåïððÛïkïÍîóíÚìˆëôé+è"æéã}áðÞ=Ü~Ù®ÖéÓ/Ñ“ÎÌáÉÙÇ$Æ­Ä™ÃÊÂaÂB ÃáÃûÄ`ÆôÇÃɽËÚÍ"ÐxÒòÔt×Ú¨ÜDß÷á•äJçèé“ì,ïÉñVôæödùàûPþ¸m´ù 1 ]… ³À¾ºª’v J"!$è%¯'g)#+Ì,z.0µ1L3Ý4`6æ7Z9Ð:6<”=å>-@cAŒBœCŸD€ELFóFvGÔGüGùGµG9GvFjEDiBk@>n;l85{1’-l) %ƒ ß"k²  œM4ü]øÆô|ñ{îÆëaéDçsååãâá¿à!à¹ßzßißwß°ßàsàúà™áKâãßãÄä¤åœæŠç„èyélêYë7ìíÎíîïˆïÝï ððãï…ïìî îíÉëJêèæXä÷ápßÅÜÚ>×lÔºÑÏœÌHÊ@ÈoÆöÄÇÃñÂnÂDÂpÂèµÃÂÄÆ¢ÇiÉUËuͪÏÒsÔøÖ‡Ù$ÜÅÞoáäÁæhéìªîIñÙódöëøcûØý@ŸùB‰  ñ 6NY\WI4 ñ!Ä#‘%T')Ê*{,&.Ç/g1ú246œ79‡:ð;M=¦>ê?(AQBiCkDVE#FÕF]GÄGõGûGÆGSGŸF¡EZDÁBÑ@’>ô; 9Ä562X.@*è%k!ÉWÿ y$þüùvõòïIì×é©çÍå0äÚâÂáåà?àÌ߃ßlßsߥßðß[àßàyá(âèâ¹ã“äzåiæ[çUèHé;ê+ë ìèì¨í]îõîrïÍïððíï–ïïHîJíì’êàèíæÈäpâïßKÝÚÆ×üÔ<Ò”ÏͺʣÈÄÆ>ÅúÃÃÂJÂ`ÂЈÌÄÑÅTÇ É÷ÊÍ=Ï‘ÑùÓ}ÖÙ¤Û@Þíàã?æãèŒë*îÃð]óãõqøçú^ýÊÿ*„Ñ R … ¯ÍæòøõçÕ·•!j#6%þ&º(w*#,Ô-u/1­2?4Ç5O7È8=:¨; =a>­?ç@B0C:D)EúE³FCG°GíGþGÏGnGÄFØEœDC5A?}< 9m6ì2/+Å&N"´üEŠæ ZüÌýÛù,öÂò£ïÒìOêè)æ|äãöáá]àáß‘ßoßrߘßãßBàÇàXáâÂâŽãiäLå;æ+ç#èé êûêÞë¼ì‚í9îÙîXï¾ïùïðõï¨ï-ïnîíJìãê2éWç.åîâgàÔÝÛR؆ÕÃÒЋÍ+ËÉdžÅ7Ä=ÞÂMÂ[´ÂcÃSÄ‘ÅǶȔʠÌÌÎÑÓÿÕˆØÛÁÝeàã¸åaèë§íEðÚògõñ÷kúçüOÿµ `¦ã  @iy‘“…wX:! #Þ$¤&e(*Ó+{-'/Â0]2ò3y57|8õ9`;Ç<>n?©@ÜAúBDøDÕEF)GœGãGûGÜG‚GêFFâDaCœAv?=5:7¡3Þ/ã+ž'2#™í2yÌ >Õœþžúáöjó=ð]íÉêè‡æÍä`ã,â;áàöߢßrßqß’ßÐß2à«à;áåá›âeã>äå æúæòççèÝéËêµëŒì_íîºî@ï¬ïêïð÷ï½ïCï–î°íŠì+ëŠé³çžå]ãçàWÞÛÝØÖMÓšÐΟËlÉ|ÇÍÅtÄiøÂXÂTžÂ<Ã%ÄLžÆ\È8Ê7ÌaΧРÓÕ ØœÚ@Ýßߎâ1åàç€ê)íÁïZòëôp÷õùhüÚþ=›ê:q ® Öû&.0$ûÛ ´"$N& (É)~+)-Ô.r02 3/5³678¨9;}<Û=(?o@AÆBÏCÊDªEiFGƒGÚGõGæG•G G6FE¯CúAä?‚=Á:·7L4¥0§,{($„Ö!c¸ ³iÿhû“÷ô×ðìíFëðèçæå¨ãcâká àà¬ß~ßmߌßÂßà’àáÃáwâ@ãäõäÚåÎæÂçµè­éžê„ëfì3íòíšî(ï”ïäïðýïËïYï¾îÛíÈìoëÝéèæÒãbáÕÞ&ÜeÙšÖÖÓцÎÌÖÉ×ÇƲęÃÖÂfÂPÂÂÃòÃÅpÆ ÈÙÉÔËòÍ8ÐÒ ÕŠ×ÚºÜ`ßâ¯ä[çýé¦ì?ïÜñjôôöyùîûaþÇ$zÅ ? l¯¾ËÊÆ²¡{ X")$ñ%¸'r)&+Ù,~.!0¾1P3â4i6æ7e9Î:<<”=é>,@fA‡B C˜DEFFìFpGÈGóGêG¨G(GdFTEÿCMBV@ú=S;P8þ4\1w-K)ñ$h ÁO¡  ‹A*üVø¿ôyñwîÈëcéFçyåêã¥â–áÈà)àÂß„ßq߂ߺßà~àá¤áRâãéãÇä®åžæç‰è{énêVë<ìíÐíwî ï‚ïÓïððÕïrïÝî îþì¶ë-êlèqæ>äÞáVß«ÜñÙ#×^Ô¤ÑÏ‹ÌBÊ8ÈnÆøÄÈÃúÂuÂSÂ{ÂüÂÅÃÖÄ-ƶÇÉkË‹ÍÅÏÒÔ ×ŸÙ9ÜÜÞƒá-äÔæ}é ìÀîYñíóuöûøuûæýS« N› Ì )A\cibS? ü!Í#š%]')Ó*,..Ð/k13‘46ž79Š:ó;Q=§>î?'APBgChDSEFÎFVG¹GëGíG¸GAGFŠEGD¥B¼@u>Û;ë8¨52=.*Í%N!­ú=Šê jôüùoõò ïKì×é¯çÐå8äÞâÍáêàLàÐß’ßqß~ߝ߸ßeàèàá1âðâ¾ã›ä€åmæcçSèOé<ê+ë ìáì¨íXîïîmïÁïûïÿïáï†ïüî6î4íùëzêÊèÑæ±äUâÕß4ÝtÚ´×âÔ.ÒƒÏͱʘÈÅÆ9ÅÄÃÂSÂqÂÝφÄéÅgÇ$É ËÍXϤÑÔ’ÖÙ¼ÛVÞá©ãOæûèœë=îÙðkóùõøùúoý×ÿ;ã" d ¾Úñóßà!q#B%'È(z*0,Ø-~/1²2E4Î5S7Ì8B:«;=b>®?é@B.C9D!EúE©F@G£GæGîGÄG]G±FÅE†DÿBAî>`<„9P6Í2/ð*ª&1"˜æ,vÒ JïÀýÓù$ö¾ò¢ïÒìNêè+æƒä$ãúáábàìß™ßxß|ß ßìßLàÎàcá âÉâ˜ãmäUå<æ4ç#èé êûêáë·ìí6îÐîVï°ïñïÿïèï™ïï]îií7ìÊêé8çåËâWà´ÝÛ:ØrÕ³ÒÐÍ!ËÿÈÇ‚Å;ÄCÃ¥ÂZÂfÂÄÂtÃfĦÅÇÌÈ«ÊµÌæÎ2јÓÖžØ7ÛÕÝ|à"ãÎåtèëºíWðëò|õþ÷€úòüaÿÄnµð ' Nr‰˜¡›“cC!#æ$­&m(&*Ü+„--/É0e2õ357„8ø9e;É<>p?©@ÞA÷BDôDÐEˆF#GGÝGëGÑGqGÙFóEÍDIC†AZ?é<:õ6ƒ3Ã/Á+†'#…Ï`¼ -Å“þ’úÜödó;ð]íÉê…è‡æ×ädã5âDáƒàà¤ßßwßšßÜß9à´àFáéá§âjãFä%åæçöçêèßéËêµëŒì[íî´î;ïŸïæïýïïï©ï3ï„îœírìëoéœç†åAãÒà7ÞŒÛÁØÿÕ7ÓŒÐøÍ—ËaÉzÇËÅwÄnÿÂcÂa­ÂLÃ6ÄbÅÑÆtÈMÊNÌxξÐ"Ó—Õ!Ø´ÚTÝöß âGåòç•ê9íÔïmòúô„÷ú{üèþLªúDƒ ¸ ä !1<74å »"$U&(Ñ)…+1-Û.y02¨315¾658°9;<á=(?o@žAÄBÍCÉD¤EfFGGÉGðGÕG‡GùF$FEŸCÜAÏ?e=¨:•7640“,V(ø#g¿N£  aÿ[û÷ôÕðéíHëóèèæ)å¨ãoâpá©àà¸ßƒß{ßßÐß&àœà'áÌá|âGãäùääåÎæÈç·è±éœê†ëdì1íðí‘î#ï‹ïÚïúïòïºïKï¨îÊí°ìZëÅé÷çñå´ãMá»ÞÜMÙ‡ÖÁÓÑyÎÌÑÉÑÇƵĜÃÛÂtÂX Â%à Ä!ÅŠÆÈñÉæË ÎKЩÒÕ ×7ÚÎÜvßâÆälçê¶ìTïëñ|ô÷‡ùünþØ1ŒÎ G |›ºÌÕÖÏ¿§‰ ^"5$ø%Ã'w)2+Ý,ˆ.&0Å1W3ç4l6í7e9Ö:;<™=ê>.@eA‡BC–DzEAFäFiG½GèGÞG—GGPFBEèC8B<@à=9;28ã4@1W-3)Ò$O ªô<Œ ô~2#üKø¾ôtñxîÊëcéPçzåôãªâžáÓà0àÌßßyߎßÁßàˆàá¯áWâãñãÊä¶å¢æ“çè|éoêYë6ì íÊísîïzïÈïøïñïÇïbïËîöíêìëêRèYæ#äÇá=ß”ÜÚÙ×LÔ’ÑøÎ~Ì9Ê4ÈkÆúÄÌÃþÂÂ^‰ ÃÕÃëÄ?ÆÏǓɄˡÍÙÏ5Ò Ô&ײÙRÜîÞšá?äéæ‘é2ìÒîlñûó‹öù†ûùý[Äb¤ Ü 4OeqqnaF- "Ø#¢%h'")Þ*†,7.Õ/t1 3˜4 6¤79:ô;T=©>î?(APBcChDMEFÆFMG²GÞGãG©G1G~FxE0DB¢@[>À;Ð8‹5û1.*³%2!•ß,tÛ Z ëü ùlõò ïJìÜé±çÖå>äæâÕáòàSàÜߗ߀߄߹ßàkàòàˆá9â÷âÇãŸä‡åsædç\èLé@ê)ëìÞì¦íQîêîcïºïïïôïÑïwïçî&îíäëbê°èºæ—ä;â½ßÝbÚ—×ØÔÒ{Ïó̪ʓÈÁÆ<ÅÄ!ÖÂ_Â}ÂðÂ¨Ã´ÄøÅ~Ç:É!Ë5ÍlϼÑ+Ô¦Ö4ÙÍÛnÞá»ãeæ é¯ëQîéðó öø ûýçÿJŸð2 o Ÿ Éæþ  þêÌ©!z#K%'Í(†*5,â-ƒ/&1¶2P4Î5[7Ï8G:®;=d>¯?ë@B1C3D"EòE¦F3G GÖGåGµGLG¢F®EuDäBAÒ>Gq?«@ÚAûBýCõDÊE‚FG‹GËGåG¾GeGÅFãE³D8CfAF?È<ý9×6c3¨/¢+g'ø"dºM¦ ·†þ‹úÒöcó5ð_íÊêˆèæÙälã>âHá‘àà³ß‡ßƒß£ßæßBà¾àNáóá­âtãLä+åæçüçëèãéÌê´ë‹ìXí î°î0ïœïÕïøïÛïï#ïnîŠí[ìþêXé€çmå(ã¶à ÞrÛ«ØëÕ"Ó|Ðë͉Ë_ÉqÇÌÅyÄrÃÇÂnÂn½Â`ÃEÄ{ÅàÆÈ^ÊhÌŽÎÕÐ:Ó¬Õ:ØÈÚlÝ à¸â[åè©êLíèïò õ–÷úüôþaµ Q’ Ä ô.>GC?&í Æ"—$\&!(Ù)Œ+;-à.02¬3;5¿6<8´9 ;†<ß=-?m@¢A¾BÑCÀD£E]FÿFsGÄGÞGÊGyGåFFñD…CÈA²?L=Œ:z74e0o,?(Ú#J¦ì=‹ UÿSû†÷ ôÐðêíIëöèìæ.å°ãwâxá±à%à¿ß‘ßßßÖß0à¥à0áÔá‡âKã#äüäêåÔæÊç½è±éŸê†ëaì0íêíŽîï‚ïÐïïïãï«ï8ï˜î´íšìEë©éäçÑåã3á Þ÷Û8ÙnÖ±ÓûÐjÎüËÇÉÍÇƶĠÃçÂyÂk§Â=ÃÄ:Å›Æ5ÈÊÌ ÎdÐÁÒ3Õº×KÚæÜŒß/âÚäç'êÈìjïùñ“ô÷›ùüþè@›Ý% T Š§ÇØâáÛÈ´‘ k":$&É'‚)9+å,./0Ê1`3ë4t6ò7i9Ú:><œ=ë>0@dA†BCŽD}E5FâF^GµGÝGÏG‹GG@F,EÒC!B@Ç=;8Å4 1;-)º$- ”Ù&x ák,üIø´ôqñzîÅëjéNçƒåùã±â§á×à=àÓߘ߃ߗßÊßàŽàá°áfâ#ãùãÐä½å¤æœç‹èérêVë9ìíÇíoîÿîqïÀïèïèïµïSï·îâíÕì†ëê:è=æ ä­á!ß~Ü¿ÙúÖ7Ô‚ÑèÎrÌ4Ê)ÈmÆöÄÔÃÊÂi—ÂÃèÃþÄUÆâǫɚ˸ÍðÏLÒ¸Ô:×ÍÙcÜ ß«áVäþæ¤éGìåî|ñô˜öù˜ûþpÎ#n´ æ ?]q}|{gU4 "â#«%q'+)å*‘,<.Ý/z13 4%6©79•:ô;\=§>ð?*ALBhC`DLEF¿FIG£GØGÓGšG$GfFhED|B‡@B>£;²8o5Û1.æ)’%!vËcÅ LúàüùbõòïMìÛé¸çÖåFäíâÚáýàZàäߤ߃ߓ߽ßàuàúà‘áBâþâÎã§ä‹åxælçZèTé?ê,ë ìÝì¢íNîãî[ï²ïâïéïÁïgïØî î íÉëPê”è¤æyä'âŸßÝFڇ׿ÔÒeÏíÌÊÈ¿Æ:Å Ä'ÞÂlÂŒÂþÂ¼ÃÆÄ Æ•ÇNÉ:ËKÍ„ÏÒÑAÔ½ÖLÙâÛ†Þ%á×ãræ'é¾ëgîúð‘óö¡øû‘ýöÿX±úD { ¬ Öó øÒ·!‚#T%'Ö(Ž*<,ê-Š/*1Á2M4Þ5X7Ù8H:²;=e>²?é@B,C3DEîEŸF-G”GÎGÖG¨G-m?°@ÙA÷BDïDÅE|FG€GÅGÖG²GUG´FÏEžD"CNA,?®<ß9º6I3‡/†+J'Ú"LŸê8’ ¨yþúÌö^ó3ð^íÊêŒè‘æßäsãBâUá•àà¹ßß߬ßïßMàÆàUáþá±â€ãMä6åæ çûçñèäéÌê¶ëˆìVí îªî*ï“ïÍïêïÏï‹ïï]îríHìäêCédçVå ãŸàÞZÛ–ØÓÕÓiÐßÍ€ËUÉmÇÌÅyÄyÃÎÂxÂ{ÂÌÂpÃYÄ‹ÅûÆŸÈzÊz̨ÎêÐRÓÄÕMØãÚ~Ý$àÉâsåèÀê^íüïòõ§÷$ú›ü ÿkÉbœ Ö ý!;IUNJ2ö Ó"$h&((á)–+A-é.‡0#2±3B5Ã6C8¸9$;‰<à=1?m@¢A¾BÌCÁDœE[FôFoG¶GÕG¼GhGØFýEßDoC®A›?0=o:]7ø3G0T,(¿#/Œ×#z îJÿEûƒ÷ôÒðåíLëöèóæ0å¹ã{â€á»à,àÉߙߊߦßáß7à¯à8áÚá‘âRã(äåìåÜæÍçÀèµéê‰ë^ì0íæíŠîï~ïÄïãï×ïšï)ï…î í†ì,ë–éÄç¿å~ãá‰ÞÝÛ$ÙZÖÓíÐZÎóËÁÉÇÇƶħÃì†ÂuºÂJÃ*ÄLűÆKÈÊÌ7Î|ÐÔÒMÕÍ×bÚýÜžßGâîä”ç=êÙì{ïò¡ô(÷¨ù üþôS¤ð. g ’¸ÒâðêèÓ¼ r"H$ &Ó'Š)@+ï,•.70Ð1f3ñ4y6ö7n9Þ:A<Ÿ=ì>1@bAŠB“C–DmE8FÕFXGªGÒGÃGzG÷F,FE¼C B@¯=ü:ÿ7¢41-÷(œ$ wÄf Î` ü?ø®ôpñvîÉëléQçŠåüã»â­áààGàÙߣߊߢßÑß*à’àá¹álâ,ãþã×äÁ嫿žçŽè†émê]ë3ìíÁíjîøîjïµïáï×ï©ïAï¥îÐí¿ìqëçé"è%æòã“á ßcܬÙäÖ%ÔqÑÙÎhÌ)Ê'ÈiÆøÄ×à ÓÂv¦Â+ÃûÃÅjÆ÷ÇÁɰËÍÍ Ð`ÒÑÔP×âÙ{ÜßÃáiäç¹éWìùîñ#ô¨ö.ù¥ûþ~Ý2~½ ú %Nh}ˆ‹v\> "è#·%w'5)ë*š,D.ä/‚13¥4+6­7%9“:ñ?&ARB^CcDDEF¹F?GœGËGÆGŽGGYFREDeBn@)>‹;”8V5»1è-Ç)}%÷ f«þNµ ;ðÒüýø\õòïNìÞé¹çßåIäõââááaàðߪߎß߯ßààá›áHâãÖãªä”å|ækçcèPéEê)ë ìÜìžíIîÞîQï«ïÔïßï¯ï[ïÃîýíõìµë6ê~èˆædä âŠßëÜ1Úp×®ÔõÑYÏÞ̗ʇȼÆ<Å Ä/æÂv™ÂÃÍÃ×Ä#ƧÇdÉPËaÍ™ÏëÑTÔÖÖ`ÙûÛ–ÞAáâãæ3éÕëvî ñ¢ó,ö¯ø,ûœýi» O ‡ ½ à#%#ÿà½!Ž#\% 'Ü(˜*B,ô-‘/01Ç2U4ß5b7Ú8M:·;=k>¯?í@B-C.DEçE›F#GŽGÂGÉGœG+GF‰EID¸B×@Ÿ><19÷5y2ª.š*V&Ü!N˜í4 Ä¢ý¸ùö´ò›ïÒìVê!è9æ—ä4ãâ.áààºßߛ߽ßàlàäàá"âãâ©ãƒädåMæAç/è$éêûêâë°ì|í$îÄî;ïšïÏïÝï¼ïlïâî&î+íõëƒêÕèìæÑäâànݹÚú×4Õ|ÒÚÏVÍËçÈǃÅ@ÄXúÂ}ÂŒÂö¢ãÄÜÅ[ÇÉëÊûÌ)ÏsÑáÓTÖâØyÛÞ»àaãæ²èRëõí‹ð#ó­õ3ø±ú#ýÿðK˜ß L y”°¼Á¿²Ÿ„_!4#%É&…(B*ñ+-B/Þ0w24“57•8:q;Ï<'>r?®@ÚA÷BûCïD¾EyF GxG¼GÇG§GDG¤F»EŒDC;A?˜<Á9¡6(3o/f+2'¼"4…׆ õ¢iþ{úÄöXó4ðZíÏêŒè—æääyãJâ\ážààÁߜߔ߷ßößVàÍà`áâ¾â€ãZä8åæçýçøèáéÑê±ëŠìQíî¤î$ïˆïÃïÝïÃï}ïÿîMî\í6ìÌê+éOç:åõâ…àïÝBۂؽÕÓYÐÓÍuËNÉkÇÈÅ~Ä}Ã׃ˆÂÚ€ÃlÄÅÇ´Èʑ̽ÎÑhÓÙÕeØöÚ•Ý6àßâ„å0èÎêsí ð ò3õ³÷7ú©üÿzÖ%oª ã -HS_\Q?'!Ü"¦$p&1(é)ž+H-ð.0'2»3D5Ë6F8½9';Œ<ã=1?p@ŸAÀBÅCÂD”EVFïFcG¯GÉG¬G]GÃFíEÊDXC—Aƒ?=X:?7Ü3,04, (œ#mÄ i Ûv<ÿ>û|÷ÿóÏðåíLëûèõæ7å¼ã†â„áÇà/àÙߜߙߪßîß=à»à>áäá—âZã/ä åñåâæÏçÅèµéŸêŠë\ì+íãí„îïsï¼ïÖïÌï‰ïïoîínìë~é«ç¨ådãáoÞÈÛ ÙIÖ†ÓàÐIÎê˶ÉÄÇƷĬÃñ‚ÂÈÂZÃ=Ä^ÅÆÆ_È3Ê*ÌOΑÐíÒbÕå×wÚݳß[âå©çNêïì‹ï"ò±ô9÷¹ù1ü þb´ý= s  Ãàîùüìâŧ ~"O$&Ý')L+ò,¡.:0Ü1h3ú4}6ü7s9á:F< =ï>0@eA†B–CŽDlE2FÏFRGGÈG´GnGåFFE§CðAð?‘=ä:ß7ˆ4è0þ,Û(}$ý\ªýK ÃKÿû7ø«ôlñsîËëkéXçŽåäÄâ²áíàJàèߦߘߩßÝß0àžà%áÅáqâ6ãäáäÅ屿¡ç•è„étêYë4ìí¾ífîòî`ï®ïÒïÎï˜ï2ï’î¾í¦ì^ëÎé è æÙãxáõÞGܘÙÍÖÔ`ÑÊÎ^Ì"ÊÈkÆôÄáà äÂz¼Â5ÃÄ!Å~Æ ÈÕÉÈËäÍÐxÒçÔi×öÙ’Ü1ßÖáä"çÍékì ïŸñ5ô¸öAù²û*þëC‡Ñ  7Wx‡•“}iI #"ò#Á%|'C)ð*£,K.é/‹13­4/6³7'9š:<[=±>ï?)ANB`C_DAE F³F8GGÂG¹G}GGDF>EðCGB[@ >q;x855¡1Å-®)Z%á E–æ7¤ *ãÈüòøZõ òïOìÝé¿çãåNäýâçáájàù߳ߚߤßÑß àˆà á¥áMâãØã¶ä–åƒæqçdèVéDê,ë ìÚìšíFîÖîLï¡ïÈïÔï ïJï°îëíÞì¡ëêfènæKäïásßÏÜÚX×›ÔãÑIÏÒÌŽÊȸÆ>Å Ä6ñªÂÃáÃìÄ4ÆÀÇwÉiËwͱÏÒlÔìÖvÙÜ®ÞUá÷ã¥æEéìëˆî ñ´ó=öÂø<û­ývÌ[ ˜ É ì00, êÇ!˜#f%('è(*O,÷-™/81Ì2]4å5e7à8P:¹;=h>´?ê@B+C-DEæE’FG‚G¶GÀGˆGGkFuE4D B½@„>ö;9Ü5X2‹.~*6&Ä!+…Ð Œ º“ý¯ù ö®ò™ïÓìUê&è=æšä>ãâ:á‡ààÀßß¡ßÈßàuàîà‡á,âèâ³ã‡älåSæCç5è$éêüêáë®ìyí!î½î4ïïÄïÐï¯ïXïÕî îíÞëkê¼èÕæµägâðßRÝ¥Úà×!ÕlÒÆÏMÍúÊåÈÇÅEÄZÃLJšÂõôÄõÅlÇ%ÉËÍ@ÏÑöÓlÖùØŽÛ,ÞÐàwãæÅèhëî¡ð4óÀõDøÁú3ý¡ÿÿ[¥î( Z …¤ºÇÏǦ’f!A# %Ò&‘(E*ý+¢-J/æ0|24˜57—8:v;Ñ<*>r?­@ÜAòBûCèD»EsFGqG¬GÁG–G4G”F§EvDóB A÷>z<¨963J/P+'¥"n½ n ë‹fþkúÂöPó3ðZíÏêèšæëäãSâbá¨à&àÌߤߠ߼ßàZàÚàeáâÁâŒã[äAå$æçè÷èåéÒê¯ë‹ìMíîîï}ï¼ïÏïµïmïíî9îKíì¹êé7ç!åÛâmàÔÝ,ÛhØ­ÕîÒLÐÂÍnËEÉhÇÈÅÄÃàŽ”ÂìÂÀİÅ%ÇÊȦʨÌÓÎÑÓïÕ|Ø Û¨ÝPàðâœåAèâê‡íð¸ò?õÉ÷Dú»ü(ÿ‰å4}º í 9U`jg\K/ !å"®${&9(ñ)§+O-ø.”002½3O5Ì6K8Â9*;<æ=2?o@¢A»BÈC»D‘EOFèF[G¤G½G GLG²FÚE´DDC~Ai?û<7:(7¹30,ç'†#ûY©öW Êe3ÿ.û{÷õóÐðâíLëé÷æ=åÃãŠâáÌà;àÞߩߠ߷ßôßJà¿àIáìáâcã4äåùåãæÖçÇè·é¡ê‡ë]ì)íßí~îïjï´ïÈï¾ï{ïï`îxí[ìþêeé–ç‰åPãçàWÞ±ÛòØ5ÖuÓÎÐ>ÎàË®ÉÂÇƼįÃúšŽÂÖÂlÃMÄsÅØÆvÈGÊCÌeΧÐÓyÕù×Ú&ÝËßoâå½çaêí¡ï0òÈôE÷Íù@ü¯þqÁ K ~ °Îêýúëб †"W$"&ß'Ÿ)M+-¢.E0Þ1o35~68q9é:E<¥=ï>3@cA‡B‘CŒDhE+FÊFHG”G½G¦G_GÒFFñDCÛAÕ?v=Ë:¿7n4È0ä,»(e$àA—ßA ªBöû1ø¤ôjñrîÎëké^çå äÇâ¾áðàXàí߳ߡ߰ßéß6à©à-áËá|â;ã äääÌ嵿¥ç˜è…éuêZë2ìí»í_îîîXï¢ïÈïÀïŠï!ïî§í–ìBëºéîçõå¾ãaáØÞ6ÜzÙ¾ÖûÓQѼÎRÌÊÈdÆúÄáÃÃ«Â‰ÂÆÂJÃÄ6ÅÆ$ÈìÉÞËûÍ5ÐŽÒþÔ~× Ú§ÜFßíá“ä8çßé€ìï³ñCôÎöMùÈû4þžúP™Ú  @h€–Ÿ ™ŠqU +"ü#É%ˆ'G)ü*¦,X.í/”13²466¶7.9œ:ô?'AMB_C\D>EF¯F+GŒG²G­GnGòF2F+EØC3B?@ó=R;_85…1©-‘)?%Æ +Î& ÔÀüêøRõ òïPìáéÁçèåTäãîááqàà¼ß¢ß­ßÛß)ààá¨á[âãäã¸äžå‡æuçhèYéBê/ëìÙì–íAîÐîEï–ïÀïÄï•ï8ï¢îÓíÎì…ë êJèYæ0äØáWß»ÜÚI×‚ÔØÑ7ÏË̃Ê{ȹÆ9ÅÄ7ýŒ¶Â-ÃñÃÿÄHÆÕÇÉË‹ÍÉÏÒˆÔüÖ’Ù ÜÈÞeá䲿]éüë›î5ñÁóQöÒøKû¾ý%…Ý&m ¡ × ú07>8'õÏ!¤#l%3'ï(¥*W,þ-¢/=1Ò2b4ë5j7å8U:º;=j>µ?ì@B,C&DEÜEŽFGxG®G¯G€G G`F]E"D‡B§@i>Û;÷8À5<2p._*&¦!i¼v û©Šý§ùöªò—ïÔìVê+è@æ¢äBã&â=á“ààÌߣ߭ßÏßà|à÷àá4âïâºãŽäoå\æCç<è'éêëÝë°ìsíî¸î+ïŠï¶ïÈïœïOï¾îîíÉëVê¤è¼æžäNâ×ß<ÝÚÍ×ÕYÒºÏ@ÍñÊßÈ ÇÅIÄ_ÃÏ’¨ÂÃÈÃÅÄ ÆÇ<ÉË)ÍUÏ£Ñ ÔƒÖÙ¡ÛBÞäàŒã2æÖè{ëî±ðFóÐõUøÓúAý±ÿ i´ú7 g ‘¯ÆÕ×Õǵ•v!D#%Ù&˜(P*,ª-Q/ë0†2457š8 :w;Õ<+>t?¬@ÜAñBùCãD¹EiFýFeG§G¯GG!GƒF•E`DßBAà>_<‹9g6ñ22/0+ô&Œ"ùZ£ü[ ÚYþeú»öMó0ðYíÒê“èŸæðä„ã[âiá´à+àÙߩ߫ßÅß àeààànáâÊâ’ãdäDå)æçèúèçéÑê³ë†ìNíûíšîïuï²ïÀï«ïZïáî!î:íì¢êúèç åÃâRàÁÝÛXØ”ÕàÒ:йÍbËAÉcÇÉÅĈÃ瘢Âú ÓÄÂÅ:ÇÞȼʽÌéÎ0Ñ‘Ó Ö‹Ø&Û»Ýdàã®åUèõê™í/ðÇòQõØ÷UúÊü5ÿ›ñD‰Æ û %E`kwphT9!í"¹$‚&A(ù)¯+U-ÿ.œ022É3L5Ö6P8Â92;Ž<ê=3?o@¢A¹BÈC´DEHFâFRGšG²G’G•áC »W&ÿ)ûp÷õóÊðäíNëéýæCåÉã•â”á×àBàé߱ߩßÀßýßTàÅàUáðá©âiã:äåýåéæÙçÊè¹é£ê‡ëZì)íØí{îÿîbï¨ï¾ï±ïkïúîJîfíEìèêOé|çså4ãÐà?ÞšÛÜØÖdÓ½Ð3ÎÓ˦ÉÀÇÆÀıÃâÂÂãÂÃ]ĉÅëÆŽÈZÊ[ÌzοÐÓÕØ Ú>ÝÞß…â)åÓçrêí°ïDòÕôZ÷ÜùNüÁþ Ò\ Š ¼Üö öÚº ’"^$,&æ'§)W+-¬.J0ã1y35‰68}9æ:M<¤=ò>2@dA…BCŠDdE%FÅF;GŽG¯GšGNGÆFóEÞDzCÁA¿?]=­:§7O4¯0Â,¦(B$Ì&€Ì, ™6ñÿóû"ø¥ôcñuîËëré^ç˜åäÍâÈáöàcàóßÁߥ߾ßíßBà±à5áÔáâDãäìäÑ广ªç™è‹ésê\ë0ìí¶í\îäîQï›ï»ï´ï{ïïqî”íì/ëŸéÛçÙå¨ãEáÄÞÜkÙ¤ÖíÓAѯÎGÌÊÈhÆùÄäÃ!ñ™ÂÓÂ[Ã0ÄKÅ¢Æ;ÈÿÉôËÎMТÒÕ’×$ÚºÜ]ßÿá¦äMçñé’ì0ïÁñYôÙöaùÖûDþ¯a¤ë  Po‘ž¬ª¥“}[ 6"$Ñ%‘'O)+°,Z.ú/“1*3²4>6¸739ž:<`=²>ô?(AKB^CWD´?í@B&C)D EÜEƒFGmG¥G£GnGþFIFNE DtBŒ@Q>À;Û8¤52S.B*&Œ!úT¢ýc ëœýùö¢ò›ïÐì\ê+èGæ¨äIã,âHá›ààÕ߬ߵßÙß!à…àá–á<âøâ¿ã—ätåaæIç;è,éêëÜë®ìoíî¯î'ï}ï¯ï·ï’ï;ï®îîíéì·ë9êè¢æ„ä5â¾ß%ÝuÚ¹×øÔJÒ¨Ï6ÍèÊØÈ ÇÅJÄjÃÓ¡´Â"ÃÚÃ×ÄÆ—ÇOÉ.Ë?ÍkÏ»Ñ!Ô›Ö$Ù¹ÛVÞüàžãEæîè‰ë/îÂðWóâõgøßúWý»ÿ!sÆ C v œ½ÐâàäÐÀ }!Q#%ã&¢(V* ,²-W/õ0ˆ24Ÿ5)7™8:v;Û<*>x?«@ÝAïBöCáD°EhFóF]GœG¤G|GGoF„ELDÇBï@Å>FŽåH ÊsJþ_ú²öJó/ðWíÖê“è§æòäã^âtá»à3àäß°ß¶ßÐßàpàçàxáâÑâ™ãjäJå.æç èþèêéÑê²ë„ìIíûíîïhïªïµï›ïMïËîî"íñëŠêàèçïä«â:à¦ÝüÚ?Ø„ÕËÒ-ЫÍZË9É`ÇÇņÄÃñ¢¯ÂôâÄÛÅIÇùÈÎÊ×ÌýÎHÑ©ÓÖ¥Ø8Û×ÝtàãÀåiè ë©íBðØòdõè÷húØüGÿ¨R—Ö  3Sj{}~r_C !õ"Æ$ˆ&K(*µ+_-/ 0>2Ê3W5Ù6T8Ç93;“<ì=2?t@A¼BÂC³D‹EBFÚFHG’G¤G†G,G’F³EŽDCPA5?Å<:ë6ƒ3Ô/ß+®'P#Ä*wÒ* ¯Fÿ ûf÷òóÈðáíPëéçHåÎãâ›ááàKàð߽߰ßËßà]àÐà]áøá°âpãBä åÿåñæÛçÍè¼é¢ê‰ëYì%íÕíwîöî]ïœï´ï ï`ïäî=îNí2ìÏê8écçXåã²à)ÞÛÈØ ÖOÓ¯Ð"ÎËˡɵÇƻĻÃï§Âô‹ÃsÄ™ÅÇ¡ÈpÊrÌÎØÐ/Ó¦Õ&Ø»ÚQÝöß–âCåáç‹ê&íÄïXòåôn÷èùeüÊþ4Ý*d œ ÅëÿåÆ ˜"l$2&ó'¬)b+ -µ.Q0ê1356 8}9î:N<§=õ>3@eA‚B’C‚DeEF¿F4GƒG¥G‹GCG°FäEÈDcC­A¡?E=:‹714”0£,ˆ('$® e¶ ‹ éÿäûøžô_ñsîÊëuéaçœåäÔâÎááhàÿßÇß°ßÇß÷ßMà·àAáÙáŒâHãäðäØå»æ±ç›èŽéuê[ë0ìþì²íYîÞîJïï±ï¦ïnïÿî^î€íjìë‹é½çÆå‰ã1á§ÞÜQÙ‘ÖØÓ0ÑŸÎ>ÌÊÈ`ÆüÄèÃ)ù©ÂÜÂpÃ@Ä_ŹÆMÈÊ Ì&ÎdкÒ+Õª×8ÚÓÜpßâºäaçê¤ìEïÕñiôíöqùæûVþ½n¶ô 0 X𮵏®Ÿ‡g ?"$Ù%›'X) +¸,b.0œ1/3»4B6¿779£: <`=¸>ð?.AGB^CSD6EýEœF#GrG¢GGTGÏFFE¬CB @Á=;%8ß4H1o-V)% öP ü l þ¸«ü×øIõÿñïMìæéÆçñåbä ãâ"áˆààÏß¶ß¿ßïß9à¤à#á½ágâ%ãïãÈä§å“æ~çoè\éIê,ë ìÓì“í4îÆî6ïï®ï¦ï{ïïî«í¤ìYëÛéè(æûã¦á'߇ÜÙÙ×bÔ®ÑÏ­ÌsÊqȯÆ@ÅÄKÃʧÂÐÂMÃÄ ÅwÆùÇÀɥ˿ÍòÏFÒ±Ô.׺ÙRÜîÞ”á7äÝæ†é!ìÄîUñëóqöôønûÜýG£ùF† À ï 0IMXK@* å!·#%F'ÿ(¸*f,.°/J1á2m4ö5u7ì8^:Â;!=p>·?í@B'C$D E×E}F GcGšG—G`GìF8F8EöCXBv@4>¦;¼8ˆ5þ14.'*ß%r!Ü9ŒâQ ×pý˜ùóõ£ò‘ïÒì[ê.èJæ¬äOã4âMá¤à'àÚߺ߽ßãß,àŠà áœáFâþâÈãœä{åeæNç@è.éêÿêàë©ìoíî«îïuï¤ïªï‡ï'ï¢îÕíÚìœë&êsè‹æhäâ¢ß Ý]Ú ×èÔ3ÒÏ'ÍÝÊÒÈǃÅKÄoÃݪÂÂÂ3ÃêÃíÄ.ƯÇaÉJËQ͇ÏÏÑ:Ô±Ö;ÙÑÛkÞá´ã\æÿè£ë=îÛðfó÷õvøôúeýÌÿ1ƒÕ S ‚ ®ÆâêñíÝ̪‰![#'%í&¨(b*,»-_/û02!4©5)7¦8:;Ú<0>w?°@ÙAòBñCàD­E^FñFQG•G•GqGG^FpE4D±BÕ@«>)àê߽߼ßÙßàyàðàá#âÚâ ãqäQå3æ$ç èéééÕê°ë†ìGíõíî ïdïïªïŽï<ï¿îýííÛërêÊèíæÓä”âà‘ÝâÚ)ØpÕ¸ÒÐÍNË3É\ÇÇÅˆÄ‘ÃøÂ¯Â»ÂÃÂ÷ÄëÅdÇ ÉêÊéÌÏ\ÑÂÓ5Ö½ØMÛíÝŠà3ãÖå|è ë»íYðèòxõú÷wúëüVÿ¸`¦ã  @_z„އjM-!þ"Ï$”&R(*º+l-/¯0>2Ô3[5ß6X8Í96;—<î=5?v@œA½B¾C²D…E>FÒFCG„GšGwGG‚F ExDÿB7A?«<ç9Í6g3´/À+’'0#¬ `¸ ˜9 ÿû_÷ëóÃðáíNëéçOåÔã â¨áâàYàößÇß·ßÖßàfàÙàbáâ¸âuãKä"å æòæâçÎèÀé¤ê‡ëZì"íÓírîïîTï‘ï«ï’ïQïÔî'î>íì¹ê!éIçAåãšàÞhÛ²ØôÕ@Ó›Ðν˙ɳÇÆÁĽÃö·Âÿ ÃĮÅǸȇʉ̦ÎîÐHÓ»Õ@ØÍÚkÝ à¬âWåõç ê8íÙïgòûô{÷þùqüßþAžì7s © Öò((ëÑ ¤"t$=&ù'¸)g+-·.[0ñ1„35’68…9í:U<§=ù>3@dA…B‹C…DZEF¶F-GyG˜G€G2G¢FÏEµDNC’A?$=y:j74r0‰,g($öK¢ wÚÿÚûø—ô[ñrîÉëwéfçå äØâØáátààÎß¾ßÉßàPàÄàEáäá‘âQã ä÷äÜåÃæ±ç£èŒézêYë1ìùì³íPîÚî@ï‡ï¦ïšï]ïïîLîkíWìëoéªç¦åvãáÞðÛ5ÙÖÁÓ!Ñ’Î1ÌþÉÈ]ÆÅèÃ2ÃÁ´ÂîÂ{ÃVÄoÅÎÆdÈ*Ê%Ì:Î~ÐÏÒBÕÂ×MÚëÜ„ß,âÐävçêºìRïìñxô÷€ùøûgþË(| 8 k‰ª¶Äú«‘r H"$á%¦'`)+Á,i.0¤133Â4H6Ã7>9¤:õ?)ALBVCWD-EøE—FGlG”G…GEG¾FþEîD—CîAó?¥=; 8¿4.1P-:)ë$r ß5Œç [ î«¡üÎøDõüñþîOìæéËç÷åeäãâ0á‹ààÕßÀßÈß÷ßDàªà-áÄápâ*ã÷ãÌä®å—æ‚çsè`éHê0ëìÖìŠí5î»î/ïzïžï¡ïfïïlîšíŒìGë¾éè æåã‹áßpÜÁÙ×MÔ ÑÏ£ÌkÊiȲÆ;Å ÄMÃÕ²ÂÞÂ_Ã%Ä7ņÆÈÏÉÁËÑÍ Ð]ÒÇÔC×ÒÙdÜߨáLäóæ•é8ìÒîkñùó„öù~ûíýTµV“ Î ü !@R[cTO/ ì!À#‰%N')Á*m,.¹/P1ç2u4ù5|7ï8b:È;!=t>·?ì@B!C%DEÑEyFÿF\GGˆGVGÙF(F%EÞCGBY@>‰;¢8h5å1. *Ã%W!Â"sÒ; Ì}iýùïõžò’ïÏì^ê/èPæ³äVã;âTá¯à.àæßÁ߯ßíß3à–àá¦áMâãÐã¡ä„åeæWçAè2éêëÝëªìkíî§îïmïšïïxïïîÄíÅì‡ëê^ènæSäâŠßõÜEÚ×ÑÔ&ÒŠÏÍÓÊÎÈÿÆ‚ÅQÄqÃé³ÂÑÂCÃúÃþÄEÆÀÇ|ÉYËmÍ›ÏèÑQÔÅÖTÙäÛ„Þ%áÊãoæé·ëPîìðyóöˆøûuýÞÿ=”á% _ ¸ÖëøûöëÒ¸’!b#4%ñ&·(f*,Á-h/1˜2'4«537¤8:€;Ý<3>v?±@ÙAïBñCÚD¨E[FäFMGƒGG]GøFIF_ED™B¾@><896™2Ø.Ö*&7"¨ ]¹ ¨S3þIú¤ö?ó'ðYíÓê›è¬æþä›ãkâ‡áÅàMàíßÊßÃßäß%à‚àúàˆá,âáâ¦ãyäVå;æ&çèéîéÕê¯ë„ìCíñíˆîï\ï’ïœïï-ï©îîíöìÈë[ê±èÕæºäxâàtÝÎÚØ[Õ§Ò Ð’ÍDË-ÉWÇÉņĜÃû¾ÂÅÂ)ÃÓÃÈÄÆuÇ!ÉþÊÍ1ÏrÑÙÓKÖÕØbÛÞœàKãèå’è3ëÎíjðûò‰õ øˆúûüeÿÊs°ó ! Nm„‘™’Šr[3! #Ö$&\(*Ã+s-/³0H2×3b5â6_8Ï9<;—<ò=6?s@¡A¶BÁC«DE8FÊF:G{GŒGjGGoFŽEbDèB A?<Ì9­6O3‘/¨+r'#‘òJ¢ …-ûþûS÷êó½ðãíNëé çPåÝã¦â®áîà]ààË߯ßÜßàpàààlá â¼âãPä)åæ÷æãçÔè¾é¦ê‰ëUì!íÌílîêîKï‡ïžï†ï>ïÆîî+íì£êé0ç+åæâ†àôÝRÛœØßÕ/ӋРδ˓ɫÇÆ¾ÄÆÃÃÄÂÁÂðÕÄÁÅ-ÇÉȢʚÌÃÎÑcÓÏÕXØâÚ‚ÝàÆâeåè¯êLíëïxò õŒ÷úüíþU¨Aƒ ¸ Ý.30'ùÙ ®"|$D&(»)t+-Â.a0÷1‹35™68‰9ñ:W<¬=ö>6@cA‚BŒC~DXEF®F%GmGŽGoG%GŽF¾E¡D4C}Ap?=Y:P7÷3V0k,J(ð#uÛ4‰ð bÌÿÐûøôZñnîÍëxéiç¥å"äââÜááxààÕ߯ßÖß à]àÉàQáêá›âYã$äåÝåÌæ´ç¥èézêYë1ì÷ì®íKîÒî;ïzïï‰ïQïßî7î[í<ìíêXéçå[ãúàyÞÓÛ&ÙgÖ²ÓуÎ&ÌùÉ È^ÆÿÄðÃ5ÃϽÂþÂÃgÄ‚ÅäÆwÈEÊ5ÌVÎÐëÒVÕÚ×dÚÿÜšßBâãäŒç+êÎìeïþñ‰ô÷ù üvþÚ9†Õ I u˜µÅÎÎÆ´žy U"!$í%¬'i)+Ê,n.0ª193Ê4I6Ë7?9«:÷?(ALBVCQD,EñE’F GdG…G}G2G²FçEÜD€CÙAØ?Œ=â:ð7 410-)Ì$X ÃuÓ G àœ—üÇø;õúñúîQìçéÐçøåoäãâ5á–à$àâßÇßÑßàKàµà4áÍávâ4ãüãÕä³åœæ‡çtècéJê/ëìÐìŒí*î½î!ïsï“ï‘ï\ïõî\î„íyì0ë¨éíçòåÌãsáõÞXܪÙðÖ9ÔÑϘÌcÊfȬÆAÅÄVÃÞ¾ÂíÂlÃ:ÄGÅžÆ%ÈçÉÖËéÍ#ÐqÒáÔX×éÙzÜߺáfäç¯éFìéîyñôöù‰ûþaÅd  Ý 0J_ilcU= ÷!É#“%V')Ç*t,.¾/Y1ì2|4ý5ƒ7ò8i:Å;+=o>½?ê@B%CDEÆExFóFUG‚G}GEGËFFEÉC-BA@>k;ˆ8H5É1õ-ì)¨%9!ª\½) ¹rZý…ùéõ™òŽïÑì^ê6èQæºäZãCâ^á´à;àëßÍßÎßöß>àžàá±áRâãÒã«äˆålæ\çCè7éêëÝë¨ìhí îŸîïdïŒï•ïdï ï{î¯í±ìpë÷éDèXæ7äìánßàÜ+Ú{×»ÔÒzÏÍÌÊÅÈÿÆÅVÄvÃö¼ÂáÂPÃÄÅYÆÖÇÉs˂ͲÏÒfÔÞÖjÙúÛ™Þ:áÞã†æ$éËëbîÿðŠóö–øû„ýíÿN¢ð3 m Æáúò⾜!o#9%ÿ&º(r*#,Ê-m/ 1Ÿ2+4µ537¬8:ƒ;â<2>{?®@ÛAêBòCÕD¥ESFÜFDGyG‚GPGçF8FKED†B @y>ò;9ó5y2¹.¼*}&"îI  –G$þCú™ö=ó#ðWíÖêè°æå¡ãwâ‰áÔàOàûßÒßÍßíß/àŠàáá5âèâ¯ã~ä]å>æ-çèéîéÕê²ë€ìAíïí~îþîPï‰ï‘ïqï ï–îÝíàì³ëBê›è¸æ¤ä]âïß\ݵÚý×EÕ—ÒüφÍ9Ë'ÉQÇËňĠÃÃÆÂÔÂ8ÃåÃÚÄÆ‹Ç6ÉËÍFÏŒÑìÓgÖçØÛÞ»àXãæ¢èHëäí{ðó™õø˜ú ývÿÖ0}Äþ 2 Y{Ÿ¢¡”~d>!#ß$¨&b(*Ê+{-/»0L2á3d5ì6`8Ø9;; <í=>?o@£A¶B¼CªD|E1FÄF0GpG€G^GûF_FzELDÓBAç>v<¬9•6+3{/„+W'ù"sÛ0Šõ töþþúS÷ßó¾ðßíSëéçUåâã®â¶áõàhà àÖßÏßäß!àyàèàváâÆâˆãTä2åæþææçØèÀé¨ê†ëXìíÌífîàîFïzï”ïxï0ï³îîíñëŠêðèçåÑâhààÝ8Û‡ØÊÕÓ~ÐüͫˉɬÇÆÅÄÆÃ#ÃÌÂÎÂ"üíÄÒÅBÇáȶʲÌÚÎÑ{ÓåÕpØùÚ—Ý3àÙâ~å èÃêaíûïŽòõŸ÷ú’üÿþ_¾UŒ Æ î)7?>2à º"†$O& (È)z+"-Ì.c0235Ÿ68Ž9õ:Z<¬=û>4@fA~BŒCyDUEF§FGdGGeGGF«EŠD CfAU?ö<::67Ú380P,)(Ù#WÃtÛ Rù½ÿÇûø‡ô\ñiîÐëyélç¬å&äëââááààßßÎßáßàgàÒàXáõá¡âaã,äåæåÏæ¹ç§è“ézêZë/ìõì©íGîËî/ïuïŒïï>ïÐî#îIí&ìÖêAéwçuåCãßàbÞ»ÛÙQÖ¢ÓûÐzÎÌòÉÈ\ÆÅòÃAÃÕÂΠßÃvÄšÅõÆÈVÊQÌiΩÐÓmÕï×|ÚݱßVâøä¢ç<êãìxïòô#÷¢ùü‡þéI•â! U ƒ§¿ÑÜÖÕ¾§ˆ Z"/$õ%´'t)!+Ó,w.0°1A3Î4Q6Í7D9°:ù?)AHBXCJD+EêEŠFGWG{GoG"G¢FÕEÉDiCÀAÀ?p=È:Ò7ƒ4ô0-ÿ(±$= ©]À 5 Ï’ˆüÂø3õöñúîQìèéÔçþårä&ãâ?áŸà,àíßÍßÝß àSà¿à=áÕáâ:ãäÚä¹å æ‹çxèdéMê.ëìÎì†í)î³îïhïˆï…ïKïèîGîsícìë’éÓçÙå³ãXáßÞAÜ“ÙÛÖ&Ô€ÑñÎÌXÊcȨÆBÅ#Ä^ÃèÂÊÂúÂ~ÃIÄ]ŰÆ>ÈüÉìËÿÍ:Ð‰ÒøÔm×Ú’Ü-ß×áqäç¼é_ì÷îñô¨ö$ù û þxÍ)l² è ;Zivvn`H' "Ð#œ%a')Ò*{,$.Ç/]1ô2€46…7û8f:Î;(=u>½?é@BCDEÄEmFîFKGtGuG0GÀFFýD¶CB.@ä=T;i8-5­1Ö-Ó)Š%!íK¤ ¥hOý}ùåõ“ò‘ïÎìbê7èXæ¾äcãKâcáÁà<àýßÎßÝßûßGà¨à"á¹á[âãÞã¬ä‘åoæ_çHè6éêëÛë¨ì_í î“î ïXïƒï‡ïXïúîkîíšì\ëßé,è?æ äÎá]ßÁÜÚa׬ÔÿÑrÏÍÃÊÀÈûÆ‚ÅYÄ}ÃúÂËÂëÂcÃÄ$ÅlÆëǧɇ˚ÍÈÏÒ}ÔôÖ~ÙÜ®ÞPáñã›æ7éßëuîñ ó&ö¬ø#û•ýþÿZ´ýA z ª Ñð ÿèͤ!x#C%'Æ(x*+,Ð-v/ 1¦204¼567³8:‰;ã<5>{?¯@ÚAëBëCÔDžELF×F8GpGrGFGÒF-F0EúCjBŽ@^>Ö;9Ô5]2.ž*b&"u×4‹ý ‡5þ5ú—ö6ó!ðZíÓê¦è®æå¢ãâáÝàWààÙߨßôß8à“à á™á;âòâ±ãˆä_åFæ/çè éíéØê®ëì<íëízîôîJï}ï†ïcïï†îÊíÍìžë+ê„è¢æ‹äEâÖßFÝžÚé×3Õ„ÒñÏtÍ7ËÉUÇÄőģÃÃÐÂâÂGÃöÃìÄ-Æ›ÇQÉ%Ë2ÍZÏ¢ÑÔzÖþØ’Û,ÞËàqãæ¹èYëõíðó«õ-øªúý‡ÿä?ŠÐ > e†¨¯ªœŒkJ!#è$°&m(#*Ö+-!/Á0R2ç3j5î6g8×9C;<õ=8?u@žA¶B¹C¦DxE*F¾F$GiGsGPGîFLFjE6D¿Bí@Ð>\<9y63]/j+;'Þ"[Âzß féþøúJ÷Ýó»ðàíQëéç_åçã¶âÀáúàwà àçßÒßòß&à„àðà~áâÊâã[ä6åæþæîçØèÃé¨ê…ëWìíÅíaîÛî:ïtï‚ïoïï¥îîííØëxêÖèçõä·âSàÅÝ$ÛpØ¹Õ ÓnÐñ͠˅ɤÇÆÀÄÔÃ#ÃÝÂ×Â3ÃÌÿÄåÅWÇõÈÍÊÇÌïÎ.ÑŽÓÖØÛªÝIàìâ‘å3èØêsí ð¢ò*õ²÷.ú¡üÿpÈ_ž Ï ü3DII<, ï ¾"’$S&(É)„+*-Ñ.n02—35¤68’9÷:]<­=ý>6@cA€B†CxDQEF¤FG]GsGYGGrF“E|DCNA>?Ø<%:7¿303,(º#@¨bà Gæ´ÿ¿ûü÷ˆôSñmîÍë~épç±å-äòâêá$á‰à&àçßÙßçßàpàÚàcáùá«âeã5ä åëåÓæ¼ç¬è”é{ê[ë-ìóì¦í@îÆî(ïhï„ïoï3ï¼îî/íì¼ê+éaçYå.ãÆàHÞ¦Û÷ØAÖÓîÐlÎÌëÉÿÇ[ÆÅùÃEÃâÂ×ÂíËĪŠǢÈoÊd̂οÐÓ‰ÕØ”Ú'ÝÈßiâå±çUêòìŒï ò­ô5÷²ù(ü–þ÷X¥î1 _ ’±ÌÝæãÝɱ d"8$ü%Á'w).+Ö,€.0¸1F3Ô4W6Ñ7I9²:ü?&AKBPCKD$EçEFGMGqG^GG‹FÆE³DSC¬A¤?X=«:·7g4×0ø,ã(–$ “ëK© ' ¿†ü¶ø4õíñïJìñéÓçæwä-ãâHá§à6àöߨßçßà_àÆàEáßá„âDãäâä¾å¦æŽç{ègéOê,ëìÊì„í&î¦îïXï‚ïuï?ïÕî7î]íPìë~é·çÄå™ã@áÆÞ)Ü|ÙÈÖÔrÑä΄ÌQÊZȪÆAÅ(ÄeÃïÂØÂÃÃZÄpÅÅÆPÈÊÿËÎMÐ¢Ò Õˆ×Ú©ÜDßèá‰ä1çÐépì ï¡ñ-ô¹ö6ù®ûþã0» ø #Icw‚}~fV/ "Ù#¦%g'#)Ö*‡,).Ð/b1ü2ƒ4 6ˆ7þ8l:Ð;*=x>¹?ï@B!CDþD¾EfFçF?GlGdG'G«FîEíD›CB@Í=9;K85‹1½-´)m%!vÖ3 —[CýuùÝõ‘òŽïÏìcê:è^æÂälãPâmáÇàHààÜßâß àMà²à*áÀáfâãåãµä“åwæaçLè;éêëÖë©ì\íîîïQïwï{ïIïìîXî‰íˆìCëËéè'æä¹á>ß±ÜüÙS×”ÔôÑ`ÏøÌ¼Ê·ÈüÆÅ\ĆÃÃØÂùÂrÃ/Ä6Å‚ÆþǾÉ˰ÍÞÏ.Ò‘ÔדÙ'ÜÅÞ`á 䍿Réëë‹î!ñ­ó=ö·ø7û£ýiÁ O ˆ · ÞûõÓ²!~#N%'Ì(ƒ*/,Û-y/1¦2;4¼5?7¶8!:;ã<:>y?²@ÖAëBèCÏD›EEFÐF/GeGgG6GÅFF"EâCSBv@A>À;á8º5?2.*I&â!]¾yê u+þ.úö2ó ðWíÙê¢èºæ å¯ãâœáãàaààáßáßà@ààáŸáFâöâ¼ãäeåMæ/ç"èéöéÔê±ë~ì:íæíuîìîBïpï|ïUïþîyî²í½ì…ëêjè‰æsä*âÀß-݇ÚÔ×ÕsÒáÏlÍ(ËÉKÇÊÅÄ«ÃÃÙÂóÂRà ÄýÄ>ƳÇcÉ?ËFÍpϺÑÔ’ÖÙ¨Û@Þâà„ã(æÊènëî¤ð-ó¿õ=øºú+ý”ÿöK›Þ M p•¦¶»³­zR!$#÷$´&z()*à+„-*/Æ0[2ê3r5ò6n8Ú9F; <ö==?s@ A³B¹C DvE!F¹FG\GjG?GàF;FTE$D¦BØ@³>CÃáÃÍÄüÅjÇ ÉáÊàÌÏHÑ£ÓÖ™Ø%ÛÂÝ]àã¢åKèæê‹íðµò;õÅ÷:ú·üÿƒÖ'q¦ â +@NWRH5ø Ê"™$`&(Ù)‡+3-Ø.t0 2œ3%5¨6!8•9û:_<±=þ>6@dA|B‡CsDMEFšF GOGjGJGôF^F…EcDôB5A#?À<:û6¡3ü/,ó'Ÿ#%ðI± 6Ó­ÿ®ûù÷~ôTñhîÒë{éxç³å5äøâðá.áà.àôßÝßõß%àwàçàháâ±ânã:äåñå׿Áç¯è•é~êXë-ìðì¢í=î¾îïaïuïeï"ï­îî íýëªêéEçHå ã´à-ÞÛáØ+Ö{ÓßÐ]ÎÌâÉúÇ\ÆÅÄHÃñÂàÂ+ýÛÄÁÅǻȂÊ|Ì™ÎÓÐ/Ó™ÕبÚ?ÝÛ߀â åÇçgêí¡ï0òÀôD÷Åù7ü¦þe´ÿ9 s ¾ÚèòïèÕºš o"@$&Ç')3+â,ƒ.&0º1O3Ø4\6Ø7K9·:û?(AFBTCDD#EÝEFóFFGcGTGG}F´ED?C‘A?==’:˜7N4µ0ß,Â(|$ wÕ3–  ®yvü®ø,õíñøîPìïéÙçæä2ã&âOá°à?àýßåßêß àbàÒàOáãá‘âEãäãäÆå©æ“çèjéNê/ëìÉì€íî¥îïRïtïgï3ïÂî'îKí9ìíêdé ç­å}ã,áªÞÜgÙ±ÖÔ^Ñ×ÎyÌHÊWȦÆDÅ+ÄkÃûÂâÂßÃlĄŨÆfÈ+ÊÌ/ÎeиÒ"Õž×)Ú½Ü\ßúá¡äAççé‚ì ï±ñBôÈöHù¿û-þ’ðBŒÌ  1UqŽ‹‡t]< "å#®%q'))á*Š,5.Ò/n1ý2Œ4679p:Ó;,=z>¼?ë@BCDôD¾E\FáF6G_GYGGœFÝE×DˆCæAú?³=;/8ø4k1¥-’)U%å ]¾ñ ŽG>ýhùÙõòŠïÒìaê?èaæÇätãSâzáËàVààçßëßàXà»à3áÉákâ%ãêã»ä›å{æfçOè<é!êë×ë§ìWíî†îþîDïoïlï;ïßîAî{ípì.ë´éùçæëã¡á(ß“ÜîÙ6ׇÔÞÑTÏê̴ʳÈùÆ€Å`ÄŒÃ ÃæÂÄÃ?ÄMÅÆÈÎÉ¶ËÆÍõÏEÒªÔ!׫Ù<ÜÛÞuá"乿héþëŸî2ñÃóKöÍøCû·ý|Î^ “ Ç é )'$üá¸!‹#U%'Õ(‹*7,ã-/1±2>4Ä5D7¸8*:Œ;ë<8>|?²@ÖAêBäCÍD”E?FÈF#G^GWG*G²FFEËC?BZ@+>¢;Å8ž5!2c.c**&È!@§eÖ fþ'ú‡ö1óðXí×ê«è¸æå²ãŒâ¡áíàiààìßèß àHà§àá©áMâþâÄã“ämåNæ9ç èéõéÖê²ëzì9íßíqîäî7ïhïnïFïòîbî£í¦ìoëêPèræWäâ¦ßÝrÚ½× ÕcÒÎÏbÍËÉKÇÇœıÃ#ÃãÂÿÂdÃÄÅPÆÊÇyÉUË]͈ÏÐÑ2Ô§Ö,Ù½ÛWÞöà›ã;æâè~ëî³ðDóÍõPøÉú>ý¢ÿZ¨ï% Y €ŸµÀǾ¸›†Y!4#ø$Å&{(7*ä+Ž-2/Ë0b2ñ3v5û6m8â9G;¦<õ=??t@A´B´CŸDoEF­FGPG]G4GÌF,F@EDB¼@>"<\9=6Õ2#/,+'¢"(ìM¹ DïÓþãú<÷ÒóµðßíSëéçdåöãÄâÍááà&àóßéßà;à•àáá)âÞâ›ãjä@å%æç÷çÛèÊé§ê‡ëSìíÀíSîÎî(ï^ïoïOïï‚îÈíÚì®ëGê©èÏæÄä†âà–ÝóÚEØÕçÒLÐØÍ‹ËwÉžÇÆÊÄØÃ:ÃëÂ÷ÂLÃòÃáÄÆ€Ç ÉùÊõÌÏ[ѽÓ+Ö¯Ø?ÛÕÝuàã¼åZèÿêší1ðÆòMõÖ÷LúÇü(ÿ”ã9{¸ í 7M\a^S>&þ Ö"¢$g&)(Ý)’+;-Þ.}02¡3-5ª6'8˜9;b<´=ý>8@cA}B„CpDFEþEFGCG_G:GçFJFtELDÝBA?§<è9ß6ƒ3Þ/ú+Ó'ƒ# t×1  Èžÿ¥ûò÷yôOñfîÔë|é|ç¶å=äûâþá0áà6àýßçßþß.ààíàsá âºâuãBäå÷åÛæÆç°è˜éêYë,ìíìŸí7î¹îïWïlïUïï™îñí íëëŽêÿè+ç-åöâ™àÞzÛÆØÖdÓÓÐLÎýËÚÉ÷ÇYÆÅÄVÃöÂðÂ9ÃÍðÄÐÅ6ÇÍȚʓ̭ÎîÐCÓ²Õ2ؽÚUÝóß’â8åÙç{êí°ïFòÐôW÷ÒùLü±þoÆ I  ©ÍãøúýñàÆ¢ z"I$&Ñ'‰)<+é,Œ.,0Ã1R3à4_6ß7M9½:ø?,ACBRCADEÙEvFîF9GZGDGùFkF¡E‰D)C{Ar?$=t:}7/4›0¾,©(]$ë^¼ƒ  Ÿmhüªø#õëñ÷îNìòéÜçæƒä9ã,âWá¸àIààïßôß&àoàØàVáíá˜âLãäéäË坿–çèléPê/ëìÈì{íîžîïKïhï[ï"ï´îî8í&ìÖêLéŒçåhãá“ÞýÛNÙžÖîÓMÑÌÎkÌCÊRȤÆFÅ0ÄpÃÃëÂ'ïÃ|Ä™ÅëÆ}È?Ê-ÌEÎ{ÐÑÒ6Õ¸×=ÚÕÜpßâ·äUçùé—ì.ïÈñQôÙöZùËûBþžN×  <b~Ž˜™hD !"ë#¹%y'2)è*“,:.Ü/p1346“79s:Ö;0={>½?ì@BCDñD¶EWFØF+GUGMGGFÊEÅDqCÒAÞ?›=;8×4T1-{)4%Î A¦iä z=0ýbùÒõ‡òŒïÌìjê>èiæËäzã_â~áÖà\ààñßóßà_àÃà;áÓáoâ0ãëãÆäœåæjçRè@é êëØë¢ìWíÿíîùî6ïiï\ï1ïÈî7îbí^ìëšéåçõåÕã‡áß{Ü×Ù"×tÔÏÑDÏà̫ʯÈõƃÅcÄ’ÃÃíÂÃ’ÃQÄ_Å¥Æ.ÈãÉÎËÙÍÐYÒÀÔ9×ÀÙSÜîÞŽá1äÔævéì²îCñÕó\öÜøWûÃý,‰Ý(k ¢ Ô ö)26. åÅ!’#^%#'Û(“*@,æ-/1¹2D4Ç5J7»8.:;ì<:>}?³@ÔAêBàCÊDEˆ;©852H.E*&«!(ŒïOÄ W ûýúö-óðWíÛê©èÂæå»ã’âªáôàuààøßïßàRà®à$á²áTâãÊã™äqåWæ:ç&èéöéØê®ë|ì1íáíeîáî-ï\ïeï3ïæîNî“íìYëêé:èZæ?äýáŠßÝXÚ«×õÔUÒ¾ÏXÍË ÉHÇÈŕĸÃ'Ãô ÃuÃ*Ä%ÅeÆÞÇŒÉnËqÍŸÏçÑGÔ¿Ö@ÙÔÛkÞá«ãTæñè”ë.îÅðUóßõ`øÜúJý¶ÿi¸û1 k ‡¯ÀÌÒ̾ª‹g!9#%Ë&ƒ(B*é+˜-6/Ó0j2ó3€5ú6w8ã9L;¦<ú=:@aA}BCnDAE÷E‹FùF<Ì9Ä6f3Ä/Ú+º'h#í`»!Š ·”ÿ›ûê÷wôIñmîÌë†é|ç½åEäþâ â5á¨à?ààôßà9àŠàõà{áâÁâ|ãIäåæÛæÌç²è›éêYë)ìîì–í6î­îïKï`ïIïï‹îÜí÷ìÕëzêäèçåáâ~àÞaÛ´ØÖVÓÁÐBÎòËÔÉóÇXÆÅÄ[ÃÃþÂDÃãýÄåÅJÇàÈ´Ê¥ÌÆÎÑZÓÊÕEØÕÚjÝà¬âFåòçŠê-íÃïWòáôi÷âùYüÇþ&ƒÐV ´Úî ûéÑ« „"Q$&Ú')G+ë,˜.00É1[3â4f6ã7Q9À:ú?(AFBKCBDEÔEoFäF1GMG9GæFaFŠEyDCaA^?=Z:b74€0Ÿ,Ž(A$ÑD¥o ñb^ü£øõçñ÷îOìôéàçæŒä=ã7â]áÂàPààößþß/àxààà`áóá âVãäóäÍ嵿šç…èméRê/ëìÄìxíî™îûîCïYïSïï¦îÿí'íìÂê4éuçxåPãùàzÞæÛ<Ù†ÖàÓ<Ñ¿ÎbÌ:ÊNÈ¢ÆHÅ3Ä{ÃÃ÷Â7úÕĦÅÇŽÈWÊ@Ì_ÎÐçÒOÕÈ×WÚæÜ‡ß#âËägçê§ìBïÙñ`ôîöfùáûJþ³ c¤ë  Mo†žŸ¥š‹pR %"ù#À%'@)ê*¡,>.ä/w13”46—7 9w:Ù;0=>¼?î@ BCDêDµELFÒF GKG?GùF}F´E´DYC¼AÆ?=å:ú7¼461g-[)%® ,ŒïUÒ j0'ýXùÌõ†ò…ïÒìfêFèiæÕä}ãgâ‡áÝàhààýßøß)àeàÎàDá×á~â/ãúãÆä¦å…æoçSèEé êëÖëžìXíôíîëî2ïZïSïï»î"îSíGìëƒéËçàå¸ãqáõÞiܽÙ×`Ô¾Ñ8ÏỘʨÈôÆ„ÅgĘÃÃûÂ"âÃbÄrÅ»Æ@ÈüÉâËðÍ&ÐnÒÙÔM××ÙiÜߥáCäêæˆé(ìÃîUñèóköðøbûÖý9šë7y ® â "3>@9+õÉ! #f%)'ç(˜*I,ï-/,1»2J4Î5K7Ä8-:•;î<;>?±@×AâBãCÀDE0F¸FGBGCG G•FãEäD¥C B,@÷=k;‘8c5è1*.(*ô%!t×;³ Fñýúöó ðPíâê¨èÊæåÃã—âµáøà‚à#ààúßà[à¸à+á¼áZâãÑãäzåXæAç(èéøéÙê­ëyì1íØíbî×î%ïSïTï,ïÎîDîzíìCëÒé"èBæ'äâáußæÜDÚ“×æÔ>Ò¶ÏGÍ Ë ÉBÇÊřĽÃ2ÃýÂÃ…Ã:Ä;ÅuÆöǡɃˉͶÏüÑ_ÔÖÖTÙîÛ}Þ%á¿ãhæé¨ë@î×ðhóïõqøëú]ýÃÿ$xÅ A s ™¸ÎØÝÖÉ´”s!@#%Ï&‘(D*õ+œ->/Ü0j24~57{8å9P;ª<ù=A?u@A¯B°C—DdEFŸFG>GCGG°FFEæCaB@h>ð;"96›2è.õ*Ê&m"óZ˜ ×¹þÑú.÷Éó°ðÝíUëé çqåäÑâÝá á“à7ààúßàNà¤àáá=âçâ­ãtäMå/æçýçäèÈé¯ê‚ëQìíµíKîÀîïLïSï7ïâîaî¢íµìëêxè¢æäWâíßiÝÇÚØhÕÄÒ1пÍzËgÉ›Ç ÆÒÄãÃIÃÃÃkÃÄÅ6ƦÇPÉË'ÍEÏÑæÓYÖÛØhÛÞà@ãáå„è%ëÀíVðéòqõõ÷rúßüOÿ«S—Ô  .OdtwvdY4!è"³$~&3(õ)œ+M-ë.‰0 2­385³6289 ;c<¼=ý><@`A{B}CkD:EôE€FòF1GEG GÉF(FNE%D°Bð@Õ>r<±9§6J3¥/¿+'J#ÕC§ w ¬ƒÿ•ûá÷qôIñfîÔëƒé‚çÄåEäãâDá«àJà àüßàAà“àÿà‚áâÊâãQä"åæèæÈç»èšé€êZë)ìéì–í-î¨îïAïTï<ïõîzîÍíàìÂëbêÏèüæûäÇâeàèÝIÛ ØïÕFÓ¯Ð6ÎèËÌÉñÇUÆ Å ÄbÃÃÃVÃðÃÒÄøÅ_ÇöÈÊÊ»ÌÝÎÑpÓáÕ]ØêÚÝà½â`åè¡ê>íÖïiòóôy÷òùmüÑþ9Ý+b š Åá õÙ· "\$!&â'™)M+ö,.60Ò1`3ç4o6á7Y9Ã:<{=º>ÿ?&ACBKC=DEÑEcFßF%GAG-GÕFQFtEgDùBMAB?í<@:B7ø3^0†,o(%$·*ó[ à‚UUüšøõâñøîKìûéÝçæŒäHã;âgáÊàZàààà9à€àêàháûá¨â[ã)äöäÕ广žçˆèqéPê1ëÿëÂìwí î”îòî7ïQïBïï’îòí íÿë¥ê"éWçbå4ãßàeÞÌÛ%ÙsÖÊÓ-ѱÎUÌ3ÊGÈ£ÆEÅ<Ä}ÃÃÃCÃÏáÄÁÅÇ©ÈgÊ\ÌsΦÐÿÒdÕá×mÚüÜœß:âÜäçê¾ìVïèñxôúö|ùíû`þÀp³ù ) Yz—¥±¬¨•{[ 0"$Ê%‰'D)ø*¢,L.æ/€13™4#6˜79x:Ý;3=}>Á?ê@BCDéD«EHFÉFGBG.GîFiF§EšDHC¢A­?f=È:Þ7 41I-?)ü$š x×A¿ Y%ýRùÆõò‡ïÏìiêHènæÚä„ãpâŒáêàjà%ààà.àràÒàQáÝá…â9ãÿãÎäªå‹æqç\è?é)êëÚë›ìRíóíwîâî+ïKïIïï«îî=í5ìêêpé±çÈå¡ãTááÞMܪÙùÖNÔ­Ñ*ÏÉ̘ʧÈíÆ‰ÅhÄ Ã*ÃÃ3ðÃtĆÅÍÆXÈÊûËÎ<ЇÒìÔh×ëÙÜߺáXäþæœé;ìÖîgñúó~öÿøuûäýJ¨úF… ¾ í .@IKE3!ùØ!¦#p%3'ð(ž*U,ñ-œ/-1Å2N4Ô5Q7Æ84:•;ó<;>‚?¯@ÖAäBÜCÂD‚E.F¯FG:G4GûF‡FÎEÓDŒCøA@Ü=N;u8C5Í1 . *Ø%s!õ[À&ž 6òãý úsö"óðSíàê®èËæ%åÆã â»áá…à1ààà%àcàÂà4áÃábâãÕã¨ä|å`æDç-èéùéØê®ëvì0íÒí_îÏîïIïIïïÄî,îmíeì3ë·éè%æäÇá^ßÍÜ/Ú~×ÑÔ/Ò¤Ï?ÍËÉAÇÈÅÄÃÃ<à Ã%ÓÃLÄLÅŒÆ È·ÉšËŸÍÎÏÒuÔëÖlÙÜ•Þ8áÕã|æé½ëPîíðwóöøýújýÕÿ0‰Ô Q  §ÅØæçâÕ½¡x!O#%à&”(O*ü+¢-I/Þ0v24‰57~8ë9R;¬<þ=A?u@A®B®C“D`E F—FøF2G6G G›FûEEÒCJBw@N>Õ;9ê5}2Ê.Ø*«&S"ÖB§ ‚ È«þÊú#÷Çó«ðÜíWëé'çtå äØâäá(á›àAà àààXà¬àá¥áEâïâ´ã{äSå3æçèæèÍé¬ê…ëNì í´íCî»î ï@ïKï%ï×îLî“íœìoëêcèˆæxä=âÕßOݲÚØVÕ²ÒдÍmËeÉ“ÇÆÒÄéÃRà ÃÃxÃ(ÄÅMƺÇdÉ7Ë<Í]Ï£ÑÿÓnÖóØ~ÛÞµàTã÷å™è6ëÔíiðøò†õø‚úóü[ÿ½c¦à  ;[sƒrb?"!ì"Å$}&F(ô)«+P-ö.0)2²3=5º658£9 ;i<º=?6@eAwB}ChD6EìE|FçF(G9GGºFF=E DžBÔ@À>T<—9ˆ6/3…/¤+~'0#¸+ôc ïšzÿ†ûÛ÷jôEñdîÔë…é†çÆåMäãâKá¶àPààààNà˜à á‰á&âÍâãSä*åæìæÏçºèŸé€êZë'ìæì’í'î¤îûî;ïFï0ïæîjî·íÑì©ëNêµèææâä­âNàÏÝ4Û‡ØÝÕ1Ó£Ð&ÎßËÃÉìÇUÆ ÅÄlÃÃÃbÃÄäÄ ÆrÇÉÝÊÓÌöÎ,ÑŒÓóÕvØÿÚ–Ý3àÐâvåèµêSíèï{òõ‰÷úyüåþG¡í9o ª Îô !ÿåÀ ˜"d$+&ë'¡)W+ü,¥.>0Ø1d3ò4m6ì7Z9Ç:#ú?*ABBIC9DEÇEdFÏFG5GGËFâsáÏàeàà ààDà†à÷àjá â§âjã*äåÚ弿£çŒèqéUê.ëÿëÂìpí î‹îëî0ïCï8ïóî„îÜíÿìåë•êéCçHåãÈàJÞ´ÛÙ^Ö¹ÓÑ£ÎKÌ+ÊCÈ ÆGÅ@Ä„Ã&ÃÃSÃÞôÄÒÅ'Ç¿ÈÊr̈ÎÀÐÓ{Õú×ÚݯßQâñä“ç4êÎìmïøñŠô ÷ŒùülþÒ*}Ç < bŠ¢³º»±Ÿˆc =" $Ð%–'L)+­,N.ò/…13 4&6Ÿ79~:ß;7=€>À?î@ BCDéD¤ECFÀF G5G#GÝFYF”E‡D1C‰A—?H=°:¿7‚4û0'-&)Ý$} ôYÄ)¬ KýBùÃõyò…ïÎìlêHèvæÜäŒãsâ˜áíàxà+à àà8àxàßàWáçáâAãäØä­åæxçZèIé%êëÔëìNííítîÙî#ïAï;ïïîýí-íì×êWé›ç¬å‹ã:áËÞ5Ü”ÙãÖ<ÔÑϽ̑ʟÈïÆ†ÅoÄ¥Ã2ÃÃ@ÃÁÃ…Ä™ÅáÆnÈ%ÊÌÎRОÒÕ{×Ú”Ü/ßÎánäç±éMìëîzñ ô‘ö ùŠûñý]µ U” Ë ú ;KWUR?) à!°#|%;'ø(©*Y,þ-ž/81È2V4Ù5U7Í84:ž;ï?²@ÖAáBÚC¾D}E)F¦FG-G+GêFyF¼E¾DyCÞAþ?À=7;U8*5®1í-ð)·%[!ÖE¥Š &ä×ýúmöóðVíÝê´èËæ+åÌã§âÂá áà9ààà+àoàÈà=áÎáhâãÝã¬ä…åcæJç/èéüéØê®ëtì-íÍíZîÆîï<ï?ï ïµîî\íPìëŸéøç æøã°áCß·ÜÚi×ÀÔÒ–Ï1ÍûÊüÈ?ÇÆÅ¢ÄÈÃDÃÃ0çÃZÄ_Å ÆÈÐɬ˸ÍáÏ,ÒŒÔׇÙÜ®ÞKáëãæ/éÌëhîûð‹óö’øû|ýáÿD–á) X “ ¯ÔäðöíÞ˨…!W#%æ&Ÿ(X*,®-K/ê0y2 4Ž5 7ƒ8ð9T;±<ÿ=A?y@™A¯B«CD[EFFñF'G*GýFŽFæEôD¹C7B[@6>»;è8Î5`2«.½*Œ&8"º*‘òq ýºžþ¿ú÷Àó§ðÞíSë é%ç|å äßâìá0á¢àJàà à(à^àµà*á«áOâ÷âºãä\å5æçèêèÐé­ê„ëNì í®í>î²îï6ï?ïïÇî;î‚í‡ì[ëìéMènæaä#â½ß7ÝšÚï×BÕ ÒÐ¥ÍhËZÉ“Ç Æ×ÄìÃ[ÃÃ+ÇÃ8Ä&ÅcÆÌÇ{ÉMËQÍuϹÑÔ‡ÖÙ”Û.ÞÆàmã æ®èJëæí}ð ó—õø’úýmÿÊ%p´ò  Ji|ŽŒ€iM)!ú"Ë$‰&L(*°+Z-û.—0,2»3@5Â678©9;l<¼=?9@eAuB|CaD4EçEqFãFG+G G¢F F#EýC‚BÀ@¤>:<}9j63i/ƒ+d'#žuÝQ ÚŽiÿûÑ÷eô@ñdîÒëˆé‰çÊåTäãâRá¾àZààààUà£àá•á*âØâ’ãZä0å æïæÔç½è éƒêYë'ìãìí"îîôî0ï:ï$ï×îWî«íµìœë3êŸèÏæÇä—â5à¶ÝÛrØÊÕÓ”ÐÎÕ˽ÉçÇTÆÅÄtà Ã!Ãvà ÄûÄƈÇ!ÉôÊéÌ ÏEÑ¡Ó ÖØÛ¬ÝGàçâŠå(èÊêeíüïŽòõ÷úŠüöþT²ûG~ ¶ Ý$,( ðË  "p$0&÷'§)_+-ª.G0Ü1n3ó4w6ï7_9Ë:%<|=Ã>ü?*A@BHC5D EÃEZFÊFG*GGºF+FUE8DÓBA?´< :7¼3'0G,7(ë#€õ\Ä3 ºb9>ü‰ø õÛñòîNìùéèç æœäPãLâtáÛàjà)àààKààýàxá âµâmã2äåßåÂæ¦çèséXê.ëýëÀìníî‡îãî%ï:ï(ïçîtîÌíéìÓë}êðè+ç.åã¯à2Þ¡ÛöØNÖ£ÓÑÎFÌÊ@ÈŸÆJÅAÄÃ*ÃÃ`ÃíÃÈÄâÅ>ÇÒȕʉ̜ÎÚÐ'Ó–Õ Ø˜Ú+ÝÄßgâåªçDêæìxïò•ô#÷™ùü|þá9ŽÒ H p—®ÀÆÇº®p E"$Ü%ž'Q) +®,\.ó/13ª4(6§79„:â;9=ƒ>Á?ì@ BCDãDŸE=F·FG)GGÑFGF…EqDCpA?0=”:£7f4Ú0-)Æ$` ÙE©— =ý=ù¹õxòïÒìgêOèuæçäŽã~â›áøà~à5àààBààçà^áïá”âHã äÜä³å˜æxçbèFé*êë×ë˜ìKíêíkîÔîï7ï.ïôîîííí ìÁêAé„ç”åsã#á±ÞÜ~ÙÐÖ)ÔŒÑϲ̊ʘÈíÆ‡ÅoıÃ6Ã!ÃJÃÑÙĩÅ÷Æ‚È9Ê'Ì5ÎfзÒÕ“×ÚªÜEßâáƒä$çÆé`ìÿî‰ñ ôžö"ù—ûþkÆc¡ Ú *GWbdXL1 ë!¹#ƒ%E')±*c,.§/=1Ñ2Z4à5[7Î8<:;ö?´@ÒAàBØC¹DyE"F›FûF GGÝFhFªE®D`CÌAà?ª=;:851Ò-Ò)%??{@™A¬B©C‹DWEÿEˆFæFG!GêF„FÏEãD¥CBF@>;Ð8¯5C2.*r&"Ÿvâ[ î«“þ·ú÷¼ó¤ðÝíUë é+çåäåâôá5á°àNà#àà/àjà»à2á´áTâã¿ã‰äaå;æ"çèîèÎé°êëMìí«í9îªîþî+ï4ï ï¶î/îjíxìCëÖé7èTæLä â¨ß݇ÚÕ×5Õ‹ÒЗÍ^ËUÉÇ ÆÚÄòÃdÃ!Ã8ÖÃHÄ:ÅrÆæÇ‹ÉgËdÍŽÏÍÑ-Ô›ÖÙ­Û>Þáà}ãæÀè]ëûíŒð!ó£õ,øžúýyÿÝ/À * ZpŽ”•‰tW2!#Ð$•&R( *¸+b-/ž042¾3J5Ã6?8«9;o<¾=?9@eAsB|C[D2EßElFÙFG"GøF™FöEEèClB©@‰>!<_9P6ô2L/g+E'ø"‚ø^È< Ë\ÿxûÆ÷bô<ñcîÒëŒé‰çÓåUä!ã â[áÅàbà)àà+àZà­àá™á7âÛâœã^ä7åæõæØçÀè¢é„êXë(ìÞìŽíî—îíî$ï0ïïÄîNîí¬ì|ë$ê†è¶æ³äxâ!àœÝÛ^Ø´ÕÓ€ÐÎÈË·ÉãÇTÆÅÄxÃ-Ã-ÃÃ"ÄÅ3Æ›Ç8É ËÍ!Ï]ѶÓ%ÖžØ.ÛÀÝ\àýâå;èáêríð›ò*õ¬÷'úšüÿdÀ V‹ à ê $076%ö× ª"v$>&û'´)c+-°.O0ã1q3û4{6ò7h9Ç:/þ?&ADBAC5DE¾ERFÄFG"GG­FFBE&DºBAù>ž<í9ï6ž3 0,,(Ò#cÝE®" §U+6üøõØñîîRìøéíç#æŸä[ãQâ}áäàpà6àà%àPàœàá‚áâ½ârã<äåéåÃæ­çèvéWê/ëýë¼ìjíî~îÜîï/ïïØîcî¹íÙì»ëjê×èçåíâ–àÞˆÛãØ7Ö•ÓýЉÎ6ÌÊ9È ÆJÅGÄ–Ã4Ã,ÃlÃþÃØÄöÅSÇãȰʘ̺ÎêÐBÓ§Õ&تÚDÝ×ß{âå½çXê÷ìŽïò­ô.÷­ù üþîJ™â T €¡¼ÊÒÑÈ´œw R"$ê% 'b) +¿,\.ÿ/“1$3®4.6ª79„:è;8=‡>¾?ñ@BCDßD™E6F¯FüFG G¼F=FmEcDC^Ab?=z:‡7J4¿0ó,ç(«$C Â+•ˆ ,øúü7ù±õvò}ïÐìlêQèyæëä–ã„â¥áá‡à>àà"àFàŽàîàfáøášâOãäÞä½å—æ€çcèIé,êëÖë–ìHíåíeîÌîï+ï$ïäîîÙííõë¬ê*émç}å\ã á›Þ ÜeÙÁÖÔƒÑüά̀ʕÈëÆˆÅxIJÃDÃ)ÃZÃâéĻŠǔÈQÊ=ÌHÎÐÊÒ1Õ¨×/Ú¿ÜZßöá™ä5çÜéqìïžñ.ô²ö1ù§ûþ{Ò)n± æ 7QfkneT> ô!Â#%M')¼*f,.«/E1Õ2a4ã5`7Ô8=:£;ô?´@ÑAÞBÕC´DwEF™FíFGGÏFXF™E˜DMC³AÍ?‹=;8ñ4v1²-¹)%"!§{ìd ÈÂýòù^öó ðVíßê¹èÑæ9åÔã·âÑáá¡àIà#ààAà{àÝàLáÝáxâ-ãéã¸ä‘åiæVç2èéþéØê®ëpì%íÅíMî¹îï)ï#ïôî“îüí2í-ìíêzéÃçâåÆãáߊÜìÙ@×ÔûÑ}ÏÍëÊñÈ9ÇËťĨÃSÃ+ÃLÃÃÃ~ăÅÇÆFÈùÉÛËáÍÐTÒºÔ,×°Ù@Ü×Þtá䵿TéõëŠî!ñ­ó7ö³ø.û™ý_³þ@ x § Íéý òß¼™!h#3%õ&±(f*,»-X/ø0ƒ24•57Š8ö9^;¯<>>?|@—A«B¥C‰DQEúE€FÞFGGßFpFÁEÐDC B-@>ˆ;°8›5!2z.€*W&"…üaÏH àžˆþ®ú÷µó¦ðÙíYë"é.ç‡åäñâøá@á¶àXà+àà8àqàÇà8á¼á\âãÅã‘äbåBæ%çèñèÐé±ê€ëOìÿì¨í1î¥îöîï(ïüî¨îîYídì-ëÃéè>æ3äñáß ÝnÚÆ×ÕÒõÏÍSËQɉÇÆØÄûÃiÃ.ÃCèÃUÄOÅ„ÆùÇ¢ÉzË|Í¡ÏæÑ?Ô´Ö2ÙÀÛWÞðà•ã/æØèkëî›ð3ó´õ=ø¯ú$ý‹ÿéB‹Ï ; a‚”¢¨ž—}`=! #Ü$ž&[(*À+g- /¤092Å3O5Ç6E8¬9;m<Æ=??@_AtBxCZD-EÖEhFÌF GGëFˆFçEEÔCVB‘@q>ÛÙÝoàã°åPèðêŠí ð±ò8õ¾÷7ú©üÿrÎa› Ð ö->B?3à ²"$E&(·)q+-¼.R0ê1y3þ4€6ù7f9Ò:)<ƒ=Ã>@'A=BEC.DE·ENF¶FGGùF›F F.ED¢Bð@ß>„<Ô9Ð6†3ë/,þ'¶#KÄ/š ™D!,üwøõÓñîîPìýéîç,æ¢äcãVâ‰áèàà8à#à.àWà©àááâÆâyãBäåêåÌæ®ç•èwéYê.ëþë·ìiíùí{îÓîï%ïïËîTî§íÇì¥ëTêÃèüæåÓâ~àÞqÛÐØ"Ö…ÓíÐ~Î,ÌÊ7ÈœÆOÅJÄžÃ@Ã6Ã|à ÄìÄÆhÇøÈÁʵÌÉÎÑTÓÀÕ:ØÂÚUÝðߌâ/åÍçnêí¢ï.ò¿ô>÷¼ù2üšþÿW¨ð, ` ­ÈÕÞÛÓ¾¦ Y"%$í%®'e)+Ã,d.0™1*3³456¬7"9ˆ:è;?=‚>Æ?è@B CDÚD•E/F¦FòFGýF±F'FaEIDóBCAN?ûƒ?³@ÒAÛBÖC­DsEFFãFGGÀFJF‚E‹D4CŸA±?u=æ:8Ó4X1™-—)h%!‹üdÔW ô¾´ýëùWöó ðVíàê½èÕæ>åÛãÂâÓá)á¤àUà,à&àJà…àåàUáåá€â5ãðãÀä–åpæWç8è!éÿéÚê«ëpì íÄíDî³îøîïïåîƒîíííìØêaé®çÉå­ãjáúÞuÜÒÙ0×…ÔðÑlÏÍáÊìÈ7ÇËŨÄÝÃ^Ã5Ã\ÃÐÓĔÅÝÆXÈÊðËøÍ&ÐnÒÏÔB×ÈÙSÜîÞŠá&äÎæeé ìî1ñÁóFöÄø?û¨ýlà O … ¶ Öø  èÇ¡!s#:%'·(n*,¿-e/ù0Ž24œ57Œ8þ9\;¸<>D?y@–A«B¡C†DKEòEyFÔFGGÒF`F±E¹D€CîA@é=k;˜8y5 2X.f*<&ä!qÝO¶8 Í‘|þ¦ú÷³ó¡ðÙíYë'é/çŽåäõââEáÀàaà2à(à?à|àÏà?áÉáaâãÏã‘äoåBæ,ç èõèÐé°êƒëFìíŸí/îœîìîïïòî–îîFíPìëªé è&æäÙáwßñÜYÚ²× ÕpÒåÏ…ÍKËIÉ‰Ç ÆÞÄÄsÃ8ÃQõÃiÄ`Å™Æ È¹ÉŽË”Í¶ÏüÑXÔÇÖJÙÖÛkÞá¥ãIææè…ëî²ðBóÇõLø¾ú6ý—ÿûM›Ý G oŽ ¯²ª¡…lF!#å$£&e(*È+m-/¨0B2É3Q5Ñ6C8·9;t<Â=?8@cAqBsCYD%EÒEaFÁFGGáFwF×EîD½CDBt@_>ç;/96¾2//+'Â"OÈ1Ÿ ¬aHÿbû¼÷Uô9ñ`îÕëŽé“çÙåeä+ã0âkáÖàtà9à)à:ànà¿à'á­áCâëâ©ãläAåæúæâçÂè¨é…êWë$ìÚì…íîŠîÜîïïùî­î&îsíìYëöéYè‰æ‚äLâðßpÝÜÚ3Ø‘ÕìÒgÐö͸˪ÉÞÇPÆÅ#ÄŒÃ@ÃFàÃAÄ,ÅZÆÁÇdÉ/Ë0ÍJÏ‹ÑßÓOÖËØXÛêÝ„à&ãÁåhèþêŸí1ðÂòKõÍ÷Fú»ü"ÿƒÚ'n© Û #9JKJ=)æ ½"‰$N& (Á)u+-Á.Z0ð135‡6ø7q9Í:3<~=È>@&A>B@C,DþD²EEF®FùFGëFŽFøEEþCŽB×@Ç>l<¸9·6i3Í/ø+à'œ#2ªƒú ‰5"üpøõÍññîNìêóç,æ®ädãaâáñà…àEà)à7àbà­àá’á$âËâƒãEäåîåÐæ²ç™èwé\ê-ëüë¸ìaíøípîÎîïïï¼îBî—í°ì–ë;ê­èåæèä¼âfàîÝ\ÛºØÖrÓßÐqÎ ÌÊ/È ÆLÅSÄ¢ÃLÃ@ÃŒÃÄûÄÆyÇÉÖÊÉÌáÎÑmÓÒÕSØÔÚnÝà£âBåâçêí´ïAòÏôP÷ÌùAü©þe¶þ9 n ™¹Óàìä߯²ˆ f"*$û%°'q)+Ë,l. 0ž133´4>6®7(9‰:í;>=ˆ>À?ï@BCýCÕDE)FFêFGòF¢FFME8DÛB0A2?ä„?³@ÎAÞBÎC¬DjE F†FÜFGöF³F7FwEqD%C…A›?\=Ê:ë7µ4@1x-)K%î qæLÃB 屨ýãùQöóðUíãê½èÞæ?åäãÆâÝá0á¬à^à3à1àRàŽàìà_áêáŠâ8ãûãÃäåtæ[ç<è"éêÜêªënìí¾í@îªîðîïïÖîtîÛí íìÄêIéšç­åšãLáèÞZÜÀÙ×uÔÜÑaÏÍÝÊâÈ8ÇÈűÄàÃjÃ>ÃjÃßãĨÅïÆoÈ"ÊÌ Î?ЀÒçÔY×ÜÙkÜßá>äÜæ~éì³îBñÒóWöÖøNûºý Î[ ‘ à å" ïÕ©!|#D%'Ã(u*$,È-i/1’2 4¡57”8þ9b;¸<>F?w@™A¥B£C~DHEëEsFÈFGöFÅFPFŸE§DhCÚAþ?Ð=P;{8^5ë1<.G* &É!UÇ4¥" Àsþšú÷¬óŸð×í\ë%é8çå$äýâ âOáÆàkà:à1àHà…à×àIáÎákâãÖãšäqåKæ-çèóèÖé®ê„ëFìþìí(î–îâîï ïäî‡îûí5í:ìë•éïçæäÂá`ßÚÜBÚ×ùÔ\ÒÚÏvÍBËDÉ†Ç ÆâÄÄ}ÃCÃ^ÃÅÃyÄsŬÆ"ÈÎɥ˪ÍÍÏÒlÔâÖ\ÙîÛÞá¾ãWæÿè‘ë6î¿ðWó×õ[øÓúCýªÿ\«é( S }™­»¼¸¨”tP!#ï$¬&m(!*Í+z-/µ0B2Ó3U5Ô6K8¶9;v<Æ=?<@aAqBoCVDEÐEUF»FôFüFÑFhFÅEÚDªC+B`@?>Õ; 9ÿ5›2÷.+ñ&§"2°Š ™T;ÿWû¶÷Nô7ñ_îÔë’é–çßåjä3ã8âpáâàxàGà.àFàvàÇà2á³áKâõâ­ãuäFåæçàçÊè¦éˆêVë$ì×ìíî}îÙîïïíîšîî]ímìBëàéCèqæfä8âÒß_Ý¿Ú$ØyÕßÒUÐëͯˢÉÚÇRÆÅ.ÄÃKÃTîÃSÄ?ÅmÆÖÇzÉFËEÍ`Ï¢ÑöÓgÖàØoÛþÝà8ãÙåxèë­íGðÓò]õß÷WúÊü3ÿ“è8z¶ é 1GSYVG6ó Å"”$T&(Ç)~+"-Ç.a0õ1…3 5‹6ÿ7q9Õ:3<‚=Ê>ý?(AM<Ÿ9˜6K3²/Ø+Ä'#mç u*ügøøôÏñèîSìÿé÷ç3æ±älãhâ–áûààNà2àBàià¹àáœá,âÓâŠãLäåöåÓæ¸ç˜èéWê1ëúë³ìbíîínîÂîÿî ïõî­î3î„ížìë&ê”èÏæÎä¥âNàÕÝGÛ¡ØÖ]ÓÒÐaÎÌ Ê,ÈœÆPÅWÄ«ÃUÃO×Ã2Ä Å1ÆÇ%ÉëÊàÌ÷Î0Ñ„ÓìÕeØïÚÝà¹âSåøç“ê.íÅïSòáô`÷ßùNü½þwÂF } ¤ÈßîôñèÔ¹– j":$þ%¿'v)&+Ò,t.0§153¿4=6¸7(9:ð;>=Œ>À?î@B CúCÓDˆE#F•FßFúFâF–FF;E#DÆBA?Ê<(:47ö3h0ž,‘(X$ôtçPÉ S ýÔÛüù£õgòzïÎìrêZèˆæûäªã˜â¾áá¢àVà:à8àfà¤àá€áâ²âeã&äôäÉåªæˆçpèOé-êëÏë•ì:íÙíOî·îñîïùî¾îJîªíËì¼ëhêèè%ç6åãÁàTÞÃÛ(ÙÖâÓMÑØÎ‰ÌjʆÈåÆÅ€ÄÊÃ_ÃMÃ…ÃÄàÄòÅJÇÐÈ”Ê|ÌÎÀÐÓvÕè×tÚýÜœß3âÖätçê®ìEïÕñcôäödù×ûBþ¨T—Ü <]v‰…vZ: "ß#¨%e'#)Ð*€,".Á/Y1æ2s4ñ5p7ß8I:©;ÿƒ?µ@ÎAÙBÎC¥DhEF€FÐFöFéF¥F&FcE_D CqA?B=°:Ê7œ41[-d)*%Õ VÊ8¨5 Ñ¥ýÕùNöó ðPíçê¾èáæFåèãÎâäá8áµàgà:à<àXà›àòàiáóá‘â@ãäÉä¡å|æ]ç@è%éêÞê¨ëmìí¹í;î¡îèîïþîÌîaîËíùìïë°ê0é„ç“åƒã4áÐÞCܪÙ×dÔËÑSÏ÷ÌÒÊáÈ1ÇÎůÄìÃlÃQÃrÃôðľÅdžÈ8ÊÌ'ÎQМÒûÔq×ñÙ„Üß¶áOäôæé,ìÄîXñáólöãøaûÇý4‰á'k ¡ Ï ó!*."úÝ´!…#N%'Ê(~*,,Ï-r/1œ2#4¨5%7•8:c;¼<>H?w@˜A¦B›CDAEäEjFÁFñFïF´FAFŽE’DTCÃAç?µ=5;_8B5Î1 .)*&®!7³‘ °piþúûö©ó™ðÚíYë*é;ç”å+äãâVáÏàsàCà9àTàŠàáàQáÕátâãÚã¤ätåTæ-çèôèÙé¯ê‚ëFìúì›íî’îÖîïÿîÖîzîçí%í$ìñê}éÙç÷åêã©áHßÂÜ,Úˆ×ãÔOÒÆÏrÍ3ËBÉ‚Ç ÆèÄćÃMÃkÃÖÉĆſÆ7ÈãÉ»ËÀÍäÏ)Ò‡ÔòÖxÙÜ—Þ4áÍãsæ é®ëAî×ðfóêõoøáúSýºÿm·û1 d ˆ§¹ÆÉÁ¶šƒV!.#ó$¹&s(+*Õ+€-/º0I2Ú3Y5Û6N8»9;z<Æ= ?=@]AsBlCSDEÉEOF±FìFíFÃF[F±EÊD”CBG@(>¶;ó8á5~2Ü.ò*Ø&‰"•sò †G+ÿQû«÷Lô2ñ]îØëéçàåuä4ãDâuáëààOà6àRàzàÕà6á¿áPâþâµãzäMå$æçèçÉè¬é…êZëìÚìyíî{îÌîùîïÙî“îîQíTì3ëÅé.èXæPäâ¼ßEÝ«Ú ØhÕÉÒIÐÝͥ˞ÉÕÇQÆÅ1Ä™ÃWÃ^ÃÀÃaÄSÅ~ÆíÇÉ]Ë[ÍwϸÑÔzÖúØ‚ÛÞ¯àOãìåŒè*ëÂíWðæòpõï÷júÙüBÿ£÷F‹à ÷ =T_e_T=#ù Ó"š$a&(Ö)€+0-É.j0ü1‰35Ž68w9×:7<„=É>@&A;B;C'DñDªE2F£FÝFôFÉFtFÔEúDÔCdB¥@•>6<9}6/3“/¼+§'b#üvëSÕ bøÿü_øñôÌñåîUìþéýç5æ¸äsãmâ áÿàšàRà>àFàvàÀà"á¥á2âÛâ‘ãSä#åû娿ºçžè}é]ê.ëùë³ì\íëífî»îõîïêîœî$îríŠìlëê€è²æ»äŠâ7àÀÝ,ÛØêÕLÓÄÐTÎÌÊ)ÈšÆRÅ\įÃcÃVëÃ=Ä ÅBÆ¡Ç;ÉËõÌÏFÑ›ÓÖzØÛ“Ý2àÊâmåè©ê?íØïgòñôs÷îùaüËþ,…ÑR °×éù÷ùÙÇž v"A$ &Æ'~)1+Ö,.0¯1<3Â4F6¹709:õ;@=Œ>Á?ï@B CõCÎDƒEFFÒFòFÔF…F÷E)ED±Bý@?°< :7Ø3L0€,v(;$ÚZÎ<³ B íÆÐüùœõdòwïÐìrê_è‰æå®ã¢âÃá á©àaàAàDàmà¬àá…áâ·ânã+äúäÐ嬿çoèSé0êëÒëì:íÑíMî¬îéîïìî°î;î–í»ì£ëXêÎèçåøâ®à9Þ±ÛÙpÖÌÓ@ÑËÎÌaʃÈäÆÅ‡ÄÏÃjÃYÑÃ!ÄîÄÆ[ÇçȨʒ̥Î×Ð$Ó‹ÕØ‡ÚÝ­ßHâìä†ç&ê¿ìXïçñtôöösùèûRþ·b§è  Jh„”›™“}gA "è#®%s'$)Ý*ƒ,*.É/[1ò2s4û5p7å8M:¬;=H>ˆ?±@ÎAØBÈC£DbEýEwFÉFêFÞF–FFPEMDõB[Ai?'=•:±741A-C)%· ?²#– Ç‘—ýËùHöóðSíåêÃèåæIåñãÑâïá>á¾àoàDàDàaà¢àûàqáøáœâEã äÎä§åæ`çEè%éêÛêªëiìí²í5î›îÜîÿîòî»îWî¶íéìÜëšêékç~ågãá·Þ.Ü–ÙîÖRÔ¼ÑEÏîÌÊÊÚÈ4ÇÊŹÄíÃzÃXÃ…ÃþÃÇÄÌÅÇœÈIÊ6Ì8ÎkЮÒÕ× Ú”Ü.߯ágäç¤é?ìÕîiñòó}öõøoûÚý?œì9u ± Ø /57/æ¾!Ž#V%'Ñ(ˆ*/,Ú-u/1¢2&4²5#7Ÿ8:g;À<>K?v@˜A£BšCxD=EàE_FºFæFßFªF/FzE…D8CµAÈ?¡=;G8"5¶1.*ç%“! ™~û  b]þ‡úôö£ó™ðÕí`ë'éBç–å3äãâaáÔà€àHàEàYà–àèà[áÝá{â$ãáã©ä|åSæ8çèûè×é²ê€ëEìöì•íî‡îÐîûîòîÍîfîÛííìÙêjé¿çâåÏã“á0ß«ÜÚs×ÒÔ=Ò»ÏbÍ/Ë;É€Ç ÆêÄ ÄÃXÃxÃæÃ˜ÄšÅÒÆLÈ÷ÉÑËÖÍûÏ?Ò›Ô ×ŒÙÜ®ÞCáçã€æ$é½ëVîêðtóÿõ{øóúcýÆÿ*xÈ B m —°ÇÑÔÍ¿¨ˆd!2#%¿&~(/*á+ƒ-'/À0O2à3\5ä6M8Å9;|<Ê=?>@^ApBhCPDEÀEKF¤FäFáF¶FHF£EµD€CB.@>š;Ú8Â5f2½.Ø*º&o"}ê`Ü {2'ÿAû¨÷Eô.ñ]îÖë–éçéåsäCãBâ…áíààSàDàSàŠàÖàDáÃá[âã½ãäUå'æ çêçÍè­é‡êWëìÓìwíîpîÈîìîýîÎî€îöí9íHìë¶éèBæ9äâ§ß-Ý•Ú÷×UÕºÒ8ÐÒ͛˗ÉÓÇQÆÅ4Ä¥Ã\ÃpÃËÃrÄfÅ‘ÆÈ£ÉsËpÍŽÏÎÑ$Ô’Ö Ù™Û*ÞÇà`ãæŸè=ëÔíkðöò€õøvúíüOÿ³U—Ñ  )K^mok^I+!Ù"¥$i&&(Ü)‹+4-Ò.q0235“6 8y9Û::<„=Ï>ü?)A8B;C DòDžE0F˜FÕFåFÁF`FÇEåDÀCOB@}>Ã?í@BCøCÅDEF†FÊFãFÊFuFçEEûCBæ@í>“<ô9ü6»300c,[($Á@·'ž 1 ݹÅü ù–õ`òsïÒìrê`è‘æå»ã¢âÐá#áµàgàJàNàqàºàá“áâÂâqã6äûäÙ宿”çsèUé.ê ëËëì5íÌíHî¢îãîóîåîžî-î†í¦ì’ë@ê»èöæåââ’à(Þ”ÛÙVÖÀÓ.ÑÀÎuÌ\Ê~ÈâÆÅ‹ÄÖÃtÃcâÃ.ÄÅÆoÇüȾʦ̺ÎïÐ8Ó£ÕØÚ+ÝÁß_âûäŸç6êÖìfïüñƒô ÷ƒùöûdþÅs²÷ ( Ry¡¥¦œ‰qK %"ï#º%v'4)ß*,0.Ï/d1ö2y46u7é8P:®;=L>†?µ@ÊAØBÄC¡D[EöEpF¾FÞFÓF‡FFCE4DæB@AQ?=z:—7c4ä0'-&)÷$ž $›  ´‡‡ýÇù=öóðQíçêÅèèæOåöãÙâõáGáÄàzàKàMàià¬àáyáâ¢âMãäÔä¬å‡æcçJè$é êÙê¬ëeìí®í/î•îÑîøîâî²îCî©íÔìÉëƒêéRçiåNã áÞÜ~ÙÞÖ>Ô¬Ñ8ÏâÌÂÊ×È.ÇÍźÄóÃ…ÃaÃ’ÃÄÕÄáÅ)Ç­ÈcÊGÌSÎ~ÐÈÒ'Õ×Ú®Ü@ßÜá}äç¸éSìçî|ñôŒöù~ûëýO©þC‡ º è &9CA;)ñÆ!—#a%'Þ(Š*>,Ü-/1¨2.4µ5)7¤8:n;¾< >H?w@˜A¡B˜CvD5EÛEWF³F×FÚF“F&FgEoD*C”Aº?=;'8 5–1å-ò)Í%w!~ñfë VOþúìöŸó—ðÓí`ë(éIç˜å:äãâiáÞà…àUàLàbà àîàfáâá†â'ãëã­äå[æ7çèùèÜé°ê‚ëAìôì‘íî‚îÈîîîêîºî[îÉíþììÅêTé©çÊå¹ãzáß“ÜÚZ×ÅÔ)Ò°ÏVÍ&Ë6É|Ç ÆîÄÄ™ÃaÉÃïïĦÅéÆ^È ÊçËëÍÐSÒ³Ô×£Ù*ÜÃÞYáûã•æ7éÏëiîûð‡óö‹øûpýÚÿ3‹Ó N z ¥½ÒÞÝÛÆµn!;# %È&…(:*ã+-*/Æ0W2ã3f5ã6W8Â9&;~<È= ?:@_AmBhCIDE¸ECFžFÖF×F¦F;FE£DjCìA@÷=ƒ;»8ª5G2¢.»*ž&T"çb×GÍ f'ÿ:û ÷>ô-ñ[îÖë™éžçïåzäGãMâ‰áøà•à]àLà]à“àÞàLáËábâ ãÂã‡äXå.æçìçÑè­é‡êYëìÑìtíûíoî¸îêîéîÇînîæí)í2ìëŸéüç+æ!äîáß݃Úâ×DÕ¨Ò,ÐÆÍ“Ë’ÉÏÇQÆ"Å7įÃgÃ|ÃÚÄÄtÅ©ÆȺɇˆͤÏåÑ8Ô«Ö Ù±Û>ÞÛàvãæµèLëëívðóõøˆúøücÿ¾a¥ß  5Yg|vzgS6!â"¯$q&.(å)‘+=-Ø.y02—35™6 8|9á:9<Š=Ë>@'A8B5C!DèDE$FFÊFÙF²FSF²EÖDªC9Bw@d>ÿÜÿþûLøêôÁñçîRìêè=æÄä~ãâ¬áá¤àjàLàZàˆàÍà9á­áHâæâ¡ã^ä/åæâæÁç¤èé^ê/ëõë¯ìQíåíTî¯îÝîïîËî„îÿíRíaìDëäéSè…æŠä[âà’ÝÛfØÃÕ+Ó¥Ð;ÎþËñÉ$È–ÆYÅcÄÃÃrÃtÃÄÃaÄAÅkÆÆÇgÉ+Ë!Í;ÏqÑÈÓ-Ö©Ø-ÛÂÝVà÷â‘å3èÌêiíúïŠòõ”÷ú‚üçþNŸñ5q ¢ Ïç  ÷Ó· …"U$&×'Ž)?+å,‹.%0¹1J3Í4L6Ç729›:ö;G=Œ>Æ?ê@BCñCÃDxE F|FÁFØF½FdFÙEEëCƒBÔ@Í><Õ9ã6Ÿ30F,@($ª%¢  Ï®¸ü ùŠõaòpïÐìxê`è—æ å¾ã¬âÕá.á¼àqàTàTà}àÀà!á™á'âÇâ{ã8äåØå·æ•çvèVé4êëÓë†ì6íÅíBîšîÙîéî×îîîtí”ì}ë)ê¤èßæñäÊâ{àÞÛéØHÖªÓ#ѰÎnÌQÊ}ÈàÆÅ’ÄÚÃÃmñÃ>ÄÅ.Æ€ÇÉÒʽÌÑÎÑQÓ¸Õ*زÚAÝÖßtâå®çNêãìïòšô÷–ùüoþØ)€Â 4 dŸ¨´¯¦”zU /"ö#Å%}':)ë*’,;.Ò/l1ú2‚46|7ê8U:±;=K>Š?®@ÏAÑBÄCœDTEòEeFµFÕFÃFzFõE/E"DÏB+A9?õ<`:y7H4Ç0 - )Ü$ ƒôrø ¨x€ýºù<öøòðQíéêÈèìæVåûãáâýáLáÔàzà[àQàvà±àáá â¨âWãäßä®å‹æjçGè-éêÝê§ëhìí®í%îŽîÊîêîØî¢î3î˜íÁìµëoêñè<çOå9ãðà‡ÞÜhÙÌÖ+ÔŸÑ(ÏÚÌ»ÊÑÈ.ÇΞÄûÃŒÃpÃÃ"ÄåÄóÅ@ÇÀÈzÊ]ÌgΗÐÜÒ?Õ±×4ÚÁÜVßñáŽä0çÆéhìùîŽñôöùûûý]¹ R’ É ó 1GLME5ýÍ!¥#f%,'ß(›*<,ê-/1«264¶517¥8 :m;Ä< >K?w@–AžB˜CmD5EÑEQF¥FÒFÆFŒFFXE\DCƒA›?m=â:8æ4€1Æ-Ö)²%[!ðeÛQÙ €GFþtúéö˜ó•ðÕí]ë2éEç¤å;äã%âsáãà‘àYàWàjà©àöàoáéáâ0ãòã±äŠå\æ>çèüèÝé°êë@ìñìíîxîÀîâîàî«îKî¸íêìïë­ê?éç´åŸãeáþÞÜëÙL×®ÔÒ£ÏHÍ!Ë/ÉxÇÆëÄÄ¡ÃkØÃüÃÁĹÅüÆuÈÊÌþÍ)ÐjÒÇÔ8×¶ÙCÜÔÞsá ä­æHéáë}î ñ˜ó"öšøûýèÿB›ß& Y ‰ °ÈâäíáÖºŸt!F#%Ð&(A*í+•-1/Î0]2ê3i5é6Y8È9';<Ë= ?=@]AmBdCGD E¶E8F—FÊFÊF›F)FEDXCÓAÿ?à=c;§8†512‚. *‚&8"ÏI¿4· [ÿ0û–÷=ô(ñZîÙë—é¦çñå‚äLãUâáážàdàVàfà™àêàRáÔájâãÈãä\å5æçöçÍèµé„êZëìÍìpíôíiî¯îàîÞîºî^îØíí ìñê…éëçæ äÕáyßüÜoÚÍ×1Õ›Òо͊ˋÉÍÇQÆ$Å?ĶÃrËÃçÖĆźÆ)ÈËɠ˚ͻÏùÑRÔ»Ö=ÙÀÛWÞîàŠã)æÇèaëûíðó¥õøœúýsÿÍ$q²í  Cbx‚‡r^>!ì"·$y&8(è) +;-æ.z02œ3568~9ã:<<‹=Î>ÿ?'A6B3CDáDšEFŠF½FÑF¡FGF¡EÃD–C#B_@L>è;09,6×2B/d+V'#°+¤˜ 5êÕÿñûIøâôÀñåîRì êèEæÇäˆãƒâ¶áá¯àoàWàbààÙà>á¸áOâìâ©ãdä6åæèæÄç§è‚éaê+ëúë¦ìRíÝíOî¥îÕîàîÄîpîóí<íQì.ëÏé<èoæqäEâñßyÝíÚRرÕÓ˜Ð,ÎùËèÉ!È—ÆXÅjÄÉÃ}ÃÃÒÃoÄUÅyÆáÇuÉEË4ÍSφÑßÓAÖÁØCÛÖÝmàã¨åEèáêxíðœò#õ¨÷ú“ü÷þZ°ýD} ± Øú !ÜÁ Ž"_$!&à'–)F+ï,’.*0Á1N3Ô4R6É779Ÿ:÷;L=‹>É?è@BCîCÁDqEFpFºFÉF²FXFÄEòDÒCrB¹@¹>b<¾9Ã6†3õ/,,!(ê#ŒŠø|  ®üù…õ\òoïÑìwêfè˜æåÁã¸â×á;áÁà|àYà`àƒàÌà'á¡á0âÎâ‚ã?ä åÞ廿˜ç{èXé4êëÐë†ì2íÁí:î”îÍîàîÈî„î îdí€ìhëê‹èËæ×ä²âfàõÝmÛÒØ5ÖšÓѦÎ`ÌOÊtÈâÆÅ–ÄåÇÃ|ýÃOÄ%Å?Æ–Ç'ÉçÊÔÌæÎÑfÓÏÕ>ØÊÚUÝì߇â&åÁçbêõìïò§ô*÷¢ùüþå;ŒÓ F j“¥¸¿º³ƒa 7"$Í%†'B)ó*›,?.Ý/n13‚4 6}7ò8U:¸;=P>‡?²@ÌAÏBÂC•DREéE_F«FÊFµFnFãEED·BA?ÝM?v@•AžB‘CnD,EÌEHFŸFÃF½F|FFEEIDüBmA…?P=Ì:ó7Ñ4]1¬-º)’%G!ÏQÃ;Ê k>5þpúÞö–ó‘ðÓíaë0éMç¥åEäã0âváïà—àdà]àvà­àánáøáâ=ãóã½äŠåeæBç"èþèáé¯ê‚ë=ìðì†í înî¹îÙîÒîŸî;î¦íÛì×ëšê(é{çœå‰ãKáêÞiÜÕÙ:×™ÔÒ’Ï@ÍË+ÉvÇÆðÄ$Ä©ÃxãÃÄÐÄËÅÇ…È:ÊÌÎ=ЂÒßÔM×ÊÙ[ÜçÞ‰áäÁæ[é÷ëî ñ¨ó5ö¨ø*ûýúÿR¦ð1 g ˜ ¹ØêôõîÝÉ¥!N#%Ü&“(K*ô+š-=/Î0h2ë3r5ì6_8Ê9*;„<Ë=?;@^AjBaCDDE²E-F‘F»FÁFˆFFkED?C¾Aç?Ä=L;†8q5 2j.*h&"´1§"¥ G ýþ+ûŽ÷7ô%ñZîØëé¨ç÷å‡äTã\â˜á á¤àoà]àoà£àòàZáÞánâãÍã—ä`å:æçóçÙè¬éŽêSëìËìiíòí\î¬îÑîÕîªîPîÆííìÞêpéÑçüåïãÀá^ßéÜVÚ¹×ÕˆÒЯ͂˅ÉÉÇSÆ$ÅIĺÃÃ”ÃøÃ¨Ä–ÅÐÆ;Èáɷ˯ÍÓÏÒfÔ×ÖNÙÚÛjÞáŸã>æØèwë îŸð.ó±õ4ø©úýÿÞ3Àû ( Rmƒ}hH$!õ"¿$„&?(ó)£+H-ê.02 3&5¡68‚9æ:A<Š=Ñ>þ?&A4B3CDáDEFF³FÃF–F4F“E­DƒC BF@5>Ë;96½2!/L+6'ù"“ކ "ÞÉÿèû@øÝô¾ñâîUì êèJæËäã‰â½á$á¶àzà_àkà—àáàFáÃáQâøâ«ãnä9åæèæÊç©è„éaê+ëõë¦ìMíÕíLî™îÎîÔî³îdîßí-í<ìë¹é$èWæ[ä+âÚßbÝÖÚ>ØžÕ Ó…Ð&ÎéËèÉÈ—Æ\ÅoÄÓÆÎÃßÃÄgÅŽÆôÇŒÉYËMÍeÏ ÑñÓ[ÖÓØ[Ûê݃àã»åYèóêŒí"ðªò:õ³÷0ú¡üÿhÀ RŠ ¾ å*,)ìÆ š"h$(&ê'Ÿ)M+÷,˜.00Ê1P3Ú4V6Î7:9¢:ù;M=>Æ?ë@BCêCºDlEþEjF¬FÀF¡FIF´EÞDÁCXB¥@>K<ž9®6a3ß/ ,(Î#pöqæe þ¯—£üøø‚õWòoïÐìzêhè æåÍã¹âæá=áÐààeàgàŽàÓà0á«á5âÙâ‡ãGäååå¿æç}è[é3êëÍë…ì-í»í3îîÁîÖîºîtîýíOímìVëüéyè°æ¿äšâMàÝÝWÛ¾ØÖŠÓÑšÎWÌEÊuÈÚÆšÅ–ÄîÒÈÃÌÃ`Ä6ÅRƬÇ9ÉÿÊéÌýÎ0Ñ~ÓâÕZØÛÚmÝÿß â5åÛçoêíŸï.òºô9÷¶ù'üþôK™â S xŸ±ÇÄ̸«Ži @" $Ò%’'H)ú*¥,C.ä/v13Ž4 6„7õ8Y:¸;=P>‡?´@ÇAÑB»C“DIEäESF¢F¾F§F`FÐE EúC£Bý@?Ã<(:E7 4‘0Ð,Ò(¤$M ÙTËEÚ †bgý­ù/öðòðPíìêÎèõæ_å äïâ â\áåàŒàlàdàˆàÂàá‘áâºâcã"äèä¼å“ærçOè0éêßê£ëcì í¡íî}î¶îÔîÀî„îîtíšìŽëCêÄèç å ã¿àZÞÓÛAÙ Ö Ô}ÑÏÅÌ©ÊËÈ'ÇÓÅÄÄ ÄžÃ…Ã¿Ã:ÄÅÆhÇéȦʇ̖ÎÂÐ ÓlÕÜ×`ÚìÜ€ßâ¶äWçïéìï´ñ7ôÁö9ù­ûþyÚ&q¬ å 3L]dgVN+ â!´#y%<'ô(¤*P,ö-/,1²2F4¼5?7©8:o;Ë< >N?t@–A™B‘CfD(EÄEAF“F¹F®FmFïE8E/DìBRAl?8=¯:×7´4@1-œ)y%'!º7«,± b+0þbúÝöŽó‘ðÔí`ë6éNç­åJä#ã7â€áöà£àjàjà|à¹à ázáâ—âBãýã¿ä“åiæDç(èéàé²êë;ìëì‚íîhî¯îÍîÆîî-î•íÅìÆëƒêécçƒåqã5áÎÞVܽÙ%׊ÔùщÏ3ÍË&ÉsÇÆõÄ)IJÄñÃ!ÄßÄáÅ!ÇžÈLÊ)Ì.ÎTКÒòÔf×âÙlÜß•á<äÎæséì£î.ñÀó@öÀø5û¡ýd²= v ¥ ÄçôøéÓ®‹!Y#!%ä&(Q*þ+¡-B/×0m2ð3y5î6f8Í9/;…<Î=?<@]AgB`C=DE¦E*FƒF´F²FzFFWEmD*C¦AÒ?§=5;i8R5ó1J.f*J&"™‘ “ 7üôþûˆ÷3ô!ñZîØëé¯ç÷å’äVãgâžáá¬àyàdà{à©àýàaáçávâ"ãÖã›ägå@æçüçÔèµé‰êUëìÇìfíîíSî£îÉîÇîîAî³íóìõëÊêWé½çâåÙã¨áFßÑÜ>Ú§× ÕyÒÿÏ¥ÍxË€ÉÆÇQÆ*ÅKÄÈÇäÃĴİÅÝÆSÈøÉÈËÌÍãÏ+Ò|ÔëÖfÙíÛ„Þá¸ãNæñè‡ë!î²ð>óÇõBø¼ú*ýÿìD‹Ð 4 bx›—ŠpV,!ÿ"Ê$‹&H(û)ª+Q-ï.‹02©3)5§68„9ë:A<=Î>@#A5B.CDØDE FvF¬F²F‹F#F‚EšDoCõA0@>²;ø8ó5Ÿ2/-+'Û"vütët Ó·ÿßû7øØô¶ñãîPì êèOæÏä˜ãŽâÆá+áÀàƒàfàvààîàJáÎáWâã±ãsäBåæðæÍç¬è‡ébê,ëõë¤ìIíÒíAî•îÁîËî¦îTîÒíí+ìë¤é è@æ@äâ¼ßQݺÚ-Ø…ÕþÒsÐÎàËÞÉÈ•Æ]ÅwÄÕØÔÃõÃŽÄzÅ£ÆȦÉlËdÍ~Ï´Ñ ÔpÖëØqÛÞ—à3ãÒåkè ëœí5ðÀòHõÈ÷Aú±üÿ{É!Z Ê ò'686'÷Ï §"m$6&ð'§)W+ý, .80Ð1U3ä4X6Ô7?9¤:ÿ;M=‘>Æ?ë@ÿAþBçCµDiEõEcF F´F–F6F¦EÉD¬CEB‰@ˆ>+<ˆ9Š6L3º/ó+æ'³#SÞVÐO 롆šüìø}õQòmïÑìxênè æåÎãÅâçáLáÑàŽàkàrà•àÝà9á²áAâÛâ“ãJäåç寿Ÿç‚è\é5êëÉë‡ì$íºí,îƒî¼îÆî±îcîïí=í\ì?ëèéaèšæ¨äâ5àÆÝBÛ¤ØÖtÓôÐÎKÌAÊkÈ߯•Å ÄðàÃÃßÃkÄJÅgƾÇSÉËÍÏEÑ—Ó÷ÕpØóÚ‚Ýà²âNåêç‰êíµï@òÌôM÷Äù:ü þ\§ñ( a ‡©ÁÎÖÒÆ¶•x G"$Ý%›'Q)+«,M.ë/|1 3’46‹7õ8b:¶;=Q>ˆ?´@ÆAÎBºCŒDGEØEOF–F³F›FNFÁEûDäCBä@ï>©< :)7ì3v0¯,¶(†$2 ½:³1Æ wO`ýŸù(öìòüïOíìêÑè÷ægå ä÷ââeáêà˜àrànààÌà(á˜á#â¼ânã&äïäÁå—æwçRè3é êÞê¤ë_ì í›íîqî³îÄî¸îsîîaíŠìxë.ê¯èòæ åìâ«à@Þ¾Û(ÙÖõÓqÑϸ̥ÊÂÈ)ÇÔÅÆÄĥÕÃÉÃOÄÅ/ÆvÇɹʟ̫Î×Ð#ÓÕø×sÚÝ—ß/âÍäiçêžì2ïÄñLôÑöKù¾û+þŒç7}¾ î =YhrpdW7 ì!½#†%@')©*\,ú-š//1½2G4Æ5A7°8:v;É<>J?y@“A—BCaD"E¿E7FŒF¬F¥F[FäE E!DÒB>AS?=’:½7•4$1r-)\% !Ÿ—¢ O%þVúÕöŠóðÐícë5éSç±åNä,ã<â‡áá¥à{àkàŠà¾àáƒáâ¡âIãäÉä•åqæHç)èéßéµê~ë:ìéì}íî_î©î¿î¼î‚îî…íµì®ësêøèOçlåXãá¹Þ<ܬÙ×xÔéÑ{Ï(Í ËÉtÇÆùÄ1ĹÑþÃ-ÄôÄðÅ7dzÈ`ÊBÌ@ÎoЫÒÕx×úÙ„Üß²áIäçæ†éì¶îAñÒóPöÓøBû´ýrÃL „ ° Öï  õÚ»“!a#,%ë&¦(Z*,¬-E/ã0k2ÿ3u5û6d8Ô9/;‰<Ï=?<@]AcB`C6DEŸE"F{F¨F§FmFýEJESDCŒAº?=;O875Ô1/.I*.&æ!€þ}ó€ &ïæþû÷+ô"ñUîÛë¢é­çæ‘äaãkâ©áá¶à€àpà€àµàákáïá~â)ãÜã äoåAæ!çøçßè°éêVëìÉì_íèíNî™î¿î»îî2î£íßìäë±êDé¥çÉåÃãŒá3ß¹Ü*Ú’×÷ÔjÒñÏšÍnË{ÉÄÇQÆ.ÅRÄÍ×ìÃÄÆÄ¿ÅõÆeÈ ÊàËÝÍÐ9ÒšÔüÖÙÜ—Þ-áÈãgæéžë0îÆðMóÙõRøÍú7ý¡ÿùS™Þ A m…œ§¦¤€Y@$A2B+CDÖD‚EFkF F¨F|FFsE…D[CßA@>—;ß8Ô5†2æ.+ü&Â"\ã_Ôd úÅ­ÿÕû2øÐô¶ñâîQìê èUæÕäžã–âÏá3áÊà‰àrà|à©àôàVáÒácâã·ã}äBåæôæÏç®è‹é_ê/ëïë£ìCíÎí:îŒî¶îÀî˜îGî¿í íìòêŒéöç)æ+äüáªß4ݪÚØxÕçÒjÐ ÎØËÙÉÈ”ÆcÅxÄãÃæÃÿâċŵÆȶɅËwÍ•ÏËÑÔ‡ÖÙ…ÛÞ«àHãäåèë²íCðÕòVõÜ÷OúÂü'ÿˆÝ)l© Õ 8;I<6ÿÜ «"{$<&ù'¯)]+-¥.A0Ñ1a3â4c6Õ7B9©:þ;R=>Ç?ê@üAýBãC±DbEíEYF˜F¨F‡F)F•EµD›C+Bw@k>Š?¯@ÊAÆBºC†DAEÓEFFŒF¨FF?FµEãDÕCwBÎ@Ø>Œ<õ9 7Õ3U0˜,˜(n$ §" ¹ cIPýœù"öéòúïNíðêÒèþæiåäýââoáñà¡à{àwà—àÖà.á¢á)âÆâtã-äöäÄåŸæxçXè2é êÝê¥ë[ìí”íîiîªîºî©îfî÷íQíuìeëê˜èàæòäØâ“à*Þ¨ÛÙzÖçÓ_Ñöί̞ÊÁÈ%Ç×ÅÊÄıÞÃÙÃ]Ä,Å>ÆÇÉÏʳÌÁÎîÐ7Ó˜Õ Ø‹ÚÝ©ßGâÜä‚çê´ìBïÖñ]ôáöYùÑû6þžòEŒÉ ý +Hftz{p\G û!Â#Ž%I')³*a,.ž/71Â2N4É5D7´8:y;Î<>N?u@’A™B‡C`DE¶E2F€F¢F–FPFÑEE DÁB#A??=z:£7w4 1S-f)@%ô …€‘ =þUúÉö‹óˆðÓícë9éXçµåVä0ãGâŒá á¯à‚àuà“àÄà á‡áâ¦âQãäÎä›åsæPç(è éßéµê|ë:ìãì}í÷í\î›îºî¬îvîîrí¥ì™ë^êäè8çUåBãá¥Þ%Ü—ÙþÖcÔàÑhÏ!ÍËÉvÇÆþÄ8ÄÀßÃÈÃBÄÿÄÆGÇÈÈsÊXÌU΄ÐÄÒÕ‘× Ú™Ü+ßÃá_äøæ™é-ìÆîVñÝógöÝøWûÀý&ÒX “ ¹ åùýæÃ!j#5%ô&­(b* ,²-O/å0x2ü3ƒ5ø6m8Ô96;†<Ö= ??@YAeBYC7D÷DšEFqFŸFšF_FîE7ECDC{Až?y=ü:685½1.1*&Í!eêbâk Þáþ û{÷*ôñ[î×ë¥é²çæ˜ähãqâ±á"á¾àŠàwà‰à¿àáváòáŠâ.ãäã¦äsåHæ#çþçÛè¸éŠêVëìÂì]íâíGî‘î³î²îî%îíÐìÎë ê.éŽç´å¬ãuáß ÜÚz×éÔYÒãÏ‘ÍeËwÉÀÇRÆ2ÅUÄÛÜÿÃ$ÄØÄÐÅ ÇxÈ"ÊõËòÍÐPÒ¬Ô×’ÙÜ«ÞCáÛã|æé²ëBîØðaóæõhøØúLý«ÿ ^ªé" R v“¨¯¶ªŸ†gA!#Ý$›&Z( *¹+_-þ.—0%2´305´6 89í:H<‘=Ñ>@A5B&C DÒD{EFdF“FŸFkFF_EvDFCÇA@æ=;Å8¹5h2Í.ó*å&¤"CÍEÆL î³¥ÿÈû,øËô³ñßîUìêèWæÜä¤ãžâ×á:áÒà’àyà‡à°àüà_áÚájâã½ã„äGå"æóæ×ç¯èŒéaê.ëîë¢ì?íÅí8î~î³î®îŽî6î²íõììÚêzéÞçæäçá‘ß Ý”ÚØdÕÛÒWÐÎËË×ÉÈ—ÆcÅ€ÄèêðÃįğÅÇÆ0ÈËÉšËͬÏàÑ6ÔœÖÙœÛ*ÞÃàXãûåè.ëÄíVðåòhõê÷aúÏü9ÿ–ê8yµ å )AKQK<( å ·"$F&(¸)d+ -¬.G0Ø1d3ê4e6Û7G9¨:Ä?ë@ûAûBÝC°DWEëEOFFŸFvFF‚E¥D†CBa@R>þ;N9X63†/·+³'|# ­)§, È„o…üáønõNòhïÒì|êtè¨æ(åÛãÑâûáXáåàœàà‚à¨àìàKáÀáPâëâžãZä#åóåÎæ¦ç†è`é7êëÉë~ì í¯íîvî¤î´î”îJîÌíí5ìëÀé3èmæyäRâàšÝÛ€ØçÕVÓ×ÐrÎ<Ì0ÊiÈØÆŸÅ£ÄįìÃúÃÄmÅ‹ÆçÇyÉ@Ë'ÍFÏmÑÆÓ"ÖØÛ­ÝAàÚâvåè¬êCíÙïcòïôk÷èùVüÂþvÈJ u £¿ÚäíçÜÉªŠ ["($î%ª'a)+¹,[.÷/‰13Ÿ46–7ú8h:½;=T>‰?²@ÅAÉB²C…D9EÌE=FƒFšF‚F/F¢EÕD¿CcB¶@¿>t<Ú9ð6º370},|(R$ý ˆ £ X:Gý”ùöæò÷ïPíðêÖèçmåäã$âwáøà¬à‚àà¢àÜà8á©á3âÌâ|ã1äþäÈ奿{ç[è5é êÝê£ë[ìí’í îdîî²îšî[îåí@íeìNëêèÈæÝä¾â}àÞ“ÛÙfÖ×ÓPÑéΨ̓ÊÀÈ!ÇÛÅÍÄ%ĸìÃåÃoÄ=ÅRÆ Ç)ÉäÊÌÌÔÎÑLÓ­Õ!Ø¡Ú*ÝÃßUâùäŒç-êÂìWïçñnôòöjùáûFþ¬S™Ø 8Uq…‡yjM+ "Ï#”%U' )½*g, .¢/@1Ä2U4Î5H7¹8:|;Î<>N?w@A–B…C[DE¯E)FuFšF†FDF¿EEúC¨BA#?ì%û&·(g*,¶-W/ê0}24…5þ6p8Ø97;Š<Ö=?>@WAdBSC6DîD–EFgF•F‹FSFÜE'E/DïBaA‰?^=ä:85›1÷-*ö%´!JÓKÎ] ÖÐþût÷"ôñVîÛë§éµç æänã|â¶á,áÇààƒà‘àÇàá|áüáâ6ãìã¬äyåNæ%çèÜèºéŠêUëì½ì[íÚíAîˆî¨î§îsîî€í¾ì¹ëŒêévçžå“ã^áߌÜÚi×ÕÔIÒ×σÍ`ËpÉ¿ÇRÆ3Å_ÄàêÃÌÃ3ÄêÄáÅÇŒÈ8Ê Ì Î)ÐjÒÂÔ*׫Ù+ÜÄÞTáóãŒæ(éÃëUîëðoóüõrøìúYý¿ÿo¶÷3 Z ‡›¶»À¸§‘rG!#á$§&_(*Á+d-/˜012´3<5³6'8‘9ò:H<”=Ò>@ A/B%C DÊDwE÷EXFFF^FõENE`D3C±Aë?Î=d;§8Ÿ5K2¯.Ù*Ä&"'¶/­> Ùª”ÿÃû!øÈô¯ñßîUìêèYæåä§ã§âÞáCáÚà›àƒàŽà»àáhááárâãÆã‡äQå"æýæÖç³èé_ê0ëêë¡ì8íÅí+î{î£î¨î~î*îžíäìïëÇêcéÊçûåúãÏázß Ý~Úì×TÕÆÒOÐõÍÆËÏÉÈ—ÆfņÄóñÃÂÃÄÆÄ­ÅÜÆFÈÞɲˡÍÂÏøÑMÔ²Ö.Ù®ÛCÞÓàsã æ©è?ëØíiðõò{õû÷oúãüDÿ¦ûEˆà ð 4NW[WF5ó »"$K& (¾)n+-µ.L0á1g3ò4f6ã7G9±:Ç?é@úAöBÞC¥DUEàEFF„F‘FjF FpE•DmCBE@<>à;5996÷2f/+“'a#“ ¹sc|üÖølõFòjïÏìêvè¯æ,åããØââ`áîà¦à‡à‹à±àôàTáÊáVâõâ¤ã_ä,åöåÖæ¦çŽè]é;êëÉëzìí¦íîkîžî¦î‰î8î¾íí$ìë©éèUæaä<âîß…ÝûÚnØÑÕIÓÄÐiÎ1Ì+ÊdÈÚÆ ÅªÄ ĸúÃÄŸÄ~Å ÆúÇ‘ÉRËBÍWωÑÙÓ:Ö±Ø5ÛÁÝUàðâˆå)è¾êWíìïsòõy÷ûùfüÑþ0†ÓR ‡ «ÑáõôõæÓ· e"2$ô%´'k)+Æ,\.0Œ1 3 4!6–79j:À;=T>‹?¯@ÆAÅB­CƒD/EÊE1FzFFvFF”E¿D­CJB¡@¦>W<Ã9Î6¢30a,_(7$äpøoø ’ I,=ýŠùöáòõïQíðêÚèçtå!ä ã)âááµà‰à‹à¨àæà@á²á;âÓâ„ã7äåÍ婿}çaè3éêÝêŸë\ìøì’íî^î’î¨îîMîÕí.íRì:ëòéhè³æÃä©âbàÞxÛñØPÖÇÓ?ÑÞΛÌʶÈ'ÇÕÅØÄ'ÄÃúÃñÃÄPÅcƵÇ>ÉøÊâÌìÎÑcÓÄÕ6ظÚ@ÝØßlâ å¥ç>êÖìlïôñ…ô÷}ùíû[þ¸^©ã  E`€Š“…tX5 "Ø#ž%\')Æ*l,.«/C1Í2W4Õ5K7¾8 :~;Ò<>Q?r@‘AB…CUDEªEFlFŽFwF8F¬EïDåC’Bû@ ?Ô4Ò0-+) %¼ SØSÙk !÷þ@ú¿ö€ó…ðÒídë@é^çÀåbä?ãUâáá¿à“àŠàŸàÛà,ášá!â³â_ãäÙä¨å|æTç3è éäé¶êwë:ì×ìvíèíNî‰î¢î—îVîñíQí}ìvë0ê¹è ç"åãÒàyÞùÛjÙÙÖ?ÔÃÑNÏ ÍîÊÉnÇÆÅFÄÔöÃãÃaÄ"Å,ÆpÇñÈ Ê̅ήÐðÒNÕ»×;ÚÃÜSßïá„ä%ç¼éVìéîzñôˆöùtûâýBžï5u ¬ × ù$.-#øÚ­!#E%'¿(p*,Á-Z/ó0€2 4Š57s8Ý97;‘<Ñ=?=@UAdBOC0DîDŠE FZF‹F~FDFÌEEDÙBMAo?F=È:þ7â4„1×-ø)Ù%™!1º6¹K õÇÅþûún÷ôñUîÜë©é¸çæ¥ätã‚â¾á4áÐàšà‰àœàÎàáƒáâ•â?ãïãµä|åTæ*çèâè·éêSëì½ìSíÖí8î~î î—îgîîqí«ì§ëvêéaç…å~ãDáñÞqÜïÙU×ÁÔ;ÒÈÏxÍYËhɽÇUÆ6ÅeÄçöÃ×ÃEÄùÄõÅ/Ç£ÈKÊ"ÌÎBЀÒÖÔE×¹ÙHÜÓÞmá䡿;éÖëjîúð…ó ö…øþúgýÏÿ'~ 9 n Ž­¿ÉÉij›{S!##î$­&h(*Ç+o- /¤012¿3=5»6*8–9ô:K<–=Ñ>@A/B$CDÊDmEóENF‚FFSFåEÇ?æ@úAòBØC¢DNEÙE?FwF„F]FýEaE€D[CíA.@#>Ç;96Û2I/€+{'D#ðyü| §hTuüÍøiõDògïÐìƒêyè³æ2åèãàâ âhá÷à¯àà”à¹àÿàXáÖáZâýâªãgä.åþåÕæ®çèbé;êëÇëyìí£íîdî“îœîyî-î«íúì ìðê”éè@æIä$âÙßjÝêÚVØÄÕ1Ó¼ÐYÎ*Ì%Ê`ÈÙÆ¢Å±ÄÄÆÃÅÃİÄŲÆÈ¥ÉgËYÍkÏ¡ÑíÓRÖÆØJÛÔÝnàÿâ¢å6èÕêgíýï‰òõ÷úwüàþ?•â&a ‘ ¾ÖóýñÝÀ› m"<$ý%¾'p)!+È,h.0“1&3¥4&6š79l:Ä;=X>ˆ?±@ÃAÂB¯CwD1EºE.FmFƒFiFF…E«D›C5B‰@>?<¦9¶630A,G($ÊZÞ\ä € <4ý‚ùößòóïPíóêÜè ç{å'äã0âŠááÀàà”à±àîàJá·áDâÙâ‹ã?äåÕ嬿„çbè6éêÛê¢ëVìùì‰íýíSî‹îšîƒî<îÇíí@ì'ëÚéVè˜æ®äâNàåÝfÛØØ@ÖµÓ0ÑÓÎ̉ʳÈ#ÇÛÅØÄ3ÄÊÃÈÃýÃ’Ä^ÅxÆÈÇRÉËóÌÏ0ÑzÓÛÕKØÍÚWÝìßâ å¶çSêéì{ï ò’ô÷ùüûkþÆ#o·ñ & Qp‹•¡™•yd? "ã#¤%h')Ï*s,.°/J1Õ2Z4Û5P7À8&:€;Ò<>N?v@ŽABCQD E¡EFbF‚FlF(FœEßDÎC‚BÞ@÷>´<-:L7&4³0ÿ,)ê$¥ 6Á;ÅY ìòý:ú¶ö~óðÔícëEé_çÈåeäIãZâ§á!áËàšà’à©àâà7á¡á)âºâhãäàä®å€æZç6è éèé²ê}ë2ìÙìoíæíDîƒî•îŒîHîáí?íkìaëê¢èòæ åýâ½à^ÞãÛVÙÂÖ0Ô­ÑGÏúÌïÊÉpÇÆÅLÄßÿÃõÃkÄ8Å=Æ…Çɸʓ̠ÎÀÐ ÓcÕÑ×QÚØÜlßâœä6çÒéhìýîŽñô›öùŠûîýU­üH ¹ ã "1<63â¹!‡#N% 'É(v*%,Ä-d/ù0‡24Œ5 7u8à9=;<Ù=??@TAbBMC-DæD‡EFVF{FwF2F¿EEDÅB3A[?(=±:Þ7É4b1¼-Ø)¾%|!¡¥5 ä·¹þðúe÷ôñRîßë§éÀçæ¬äzãŠâÇá:áÚà à–à¡àÚà!áá âžâGãõã¼ä‚åYæ.ç èâè¼éŒêTëì¸ìQíÏí2îvî”îîVîùí^í–ì˜ë[êñèEçpådã-áØÞ]ÜÔÙE׫Ô.ÒµÏrÍJËiɸÇUÆ8ÅmÄîÃÃÃäÃSÄ ÅÆHdzÈeÊ6Ì6ÎYЖÒïÔX×ÕÙZÜìÞ€á䵿Qéèëî ñšóöšø ûxýÞÿ8‹Õ N v Ÿ¸ËÖÔн¦‡[!/#ô$º&n(&*Ï+u-/©0;2Â3E5½618˜9ù:M<˜=Ô>@#A'B%CþCÃDiEçEIFuFwFCFÕE,E;DC…A»?™=1;m8j5 2z.š*&P"ö~‚ ½„ÿ«ûø½ô¨ñÚîVìêècæðä²ã·âëáTáíà©à–àŸàÌàáváõáâ$ãÕã“ä]å,æçÝç»èécê.ëéë™ì2í¸íîkîî’îbî î~íÀìÉëê8éšçÏåÈã áJßÛÜSÚÃ×-Õ§Ò0ÐÞÍ¶Ë¿É È”ÆmÅÄÄÇÃÙÃ;ÄäÄÒÅÇjÈÊØËÒÍïÏ#Ò|ÔÞÖXÙàÛiÞá™ã5æÏèhëýíŽðóõ øúýdÿÅa§Û  2Pdprm]G(!Ñ"Ÿ$_&(Ð)z+$-À.]0è1z3ö4u6è7O9·:È?ç@ùAïB×CšDKEÎE9FjF{FLFñENEmDGCÔA@ >¬;þ86½2+/d+['+#Ïcàgð “ZEküÄø_õAòcïÐìƒêzèºæ3åòããââpáþà¶à›à™àÅàácáÜádâã³ãkä5åæÙæµç‹èié7êëÄëuìíœí î[îŠîîqîîžíäìüëØê€éïç'æ2ä â¿ßYÝÎÚFØ«Õ&Ó¨ÐQÎÌÊZÈÜÆŸÅºÄÄÐÃÒÃ%ĿģÅÄÆ%ȸɀËl͆ϴÑÔjÖÙØdÛéÝ‚àã´åLèêêzíð›òõ¤÷ú‹üîþO¢ô2r Ëåþ   ûéË¥ w"E$&Æ'x)++Î,s. 01)3®4(6¢79p:Æ;=W>‹?°@ÀAÃB§CyD&E·E#FdFxFZFFpEœD„C Br@t>%<‹9˜6d3ä/#,((ÿ#ªCÃDÒ i -'ýzùöÙòòïNíòêáè çƒå)äã7âááÇàšàà¸àúàPáÁáKâââ‘ãGä åÜå°æˆçeè:éêÝêŸëUìöìƒíöíLîîîwî-î¶í í*ìëÃé>è„æ”äzâ3àÐÝOÛÂØ0ÖÓ'ÑÁÎ‰Ì€Ê°È ÇÝÅÝÄ8ÄÖÃÒà ġÄpÅÆÚÇlÉ ËÍÏLÑÓñÕdØâÚnÝà–â4åËçiêúì‘ïò§ô"÷¡ù ü}þ×0€Â 2 ]~•¤«¥ž†nJ "ì#¯%m'')Ò*,.»/O1Ø2e4Û5Y7Â8*:„;Ó<>L?y@ŠAB{CNDEœEFYFvFaFFEÈD½CiBÊ@Ø>¡< :774—0â,ò(Ò$‡ ¥(­J üÞçý0ú±öuó‚ðÍíiëCéfçËåläLãdâ­á+áÐà¥à˜à¶àèà@á©á0âÄânã!äéä®å‹æYç<èééé³ê}ë-ìÜìbíåí9îxîîzî?îÍí0íZìIë êˆèÞæõäæâ¥àIÞËÛBÙ¯ÖÔ¡Ñ3ÏøÌáÊÉkÇÆ ÅVÄäÃÍÃÄ|ÄJÅLÆœÇÉÎʪ̵ÎÙÐ ÓzÕê×eÚðÜ~ßâ¯äNçãé|ìïœñ)ô©ö"ù–ûþc½ S‘ Å ó /<GB<)íÁ!‘#X%'Ð(*+,Í-k/ÿ024“5 7~8á9@;”<Ö=?:@WA[BNC&DáDE÷ELFqFgF&F®EðDõC¯BAA?=’:Æ7ª4H1Ÿ-»)¢%b!û‹‘" Õ©¬þèú]÷ôñTîÜë­éÁçæ°ä‚ãâÐáAáãà«à™à°àÛà2ááâ¤âLãÿã¿äŠå\æ3ç èçè¼éêSë ìµìNíÇí-îlî‹î‚îIîèíNí‡ìëKê×è0çYåKãá½ÞHÜÂÙ,ןÔÒªÏfÍEË_ɹÇUÆ=ÅrÄøÃÍÃóÃcÄÅÆVÇËÈxÊJÌPÎjаÒÕn×ìÙoÜß•á.äÌæbéþëîñ«ó)ö«øûŠýíÿGšá" Y … «ÅÕâßÜÆ³‹l!2#%¾&y(.*Ô+~-/±0@2Ç3I5Ã668™9þ:L<=Ó>@A*BCýC½DaEâEÅ?ê@òAñBÐC˜DCEÈE.FbFpF>FâE:E^D1C¿Aÿ?ñ=‘;å8å5¡2/F+@'#µJÉRÛ ‡E<_ü»ø_õ8òeïÐìƒê‚è¹æ=åóãðââ{ááÂà¡à¤àÌàákáäákâ ã·ãvä8å æÜæ¸çèié;êëÄësìí—íîSîî„îbîîíÕìèëÄêkéØçæäóá«ß?ݽÚ-ØŸÕ Ó¢Ð?ÎÌÊWÈÜÆ¤Å¼Ä!ÄÚÃßÃ4ÄÎĵÅÖÆ:ÈÍɓˇ͖ÏÏÑÔ|ÖõØtÛÞ–à,ãÇåaèûêŽí#ð«ò5õ°÷+ú–üÿ]³@~ ¬ ÕôóÓ± €"O$&Í'‚)0+Ø,v.0¡1/3³4-6¥7 9r:Ë;=[>ˆ?±@ÀA¾B§CoD$E­EFWFoFIF÷E]E‹DoC B]@Y>Q?t@‹ABvCLDþD–EFQFhFUFF}E»D¦CWB±@Ä>„<õ97ì3z0Æ,×(µ$n Žš6 ðÎßý'úªöró{ðÒídëKégçÑåräSãjâ¶á3áÙà¬à£à¼àóàGá´á4âÎârã+äíäµåŒæ`ç=èéèéµêxë0ìÒìcíÚí4îpî‚îpî0îÀííGì7ëôévèÅæàäÍâà1Þ¸Û,Ù›ÖÔÑ.ÏèÌÞÊÿÈmÇÆÅZÄðÃÙà ÄÄVÅdÆ«Ç/ÉàÊÅÌÅÎôÐ2Ó“Õû×~ÚÝ”ß,âÅä^çùéì!ï±ñ8ô¹ö6ù¤ûþqÍe› Õ þ :IOPE2öË!œ#]%"'Ô(‹*0,Ö-p/1–24›578è9?;–<Ù=?;@TA[BHC%DÙD{EîEDFfFXFF™EãDÞCœBA&?ü@A&BCøC¸DZEÛE2FaF^F'F¶E EDàBXAŠ?l=ø:<8-5Ù1>.e*W&"ÄOÔ[ë Ÿgkÿ•ûø°ô¤ñ×îWìê$èmæøäÄãÁâÿáaáÿà¼à¥à³àÚà)á†áâŽâ5ãàã ägå6æçåç½è–éaê/ëäë•ì)í«íîWî|îxîHîîí]ížì¡ëuê épçŸåžãná ߬Ü,Ú™×ÕƒÒÐÈͤ˹ÉÈ™ÆqÅžÄÄÝÃõÃVÄÅöÅ)Ç•È6ÊÌÿÍÐTÒ£Ô ×„ÙÜ—Þ*áÁã]æöèë#î²ð:óÄõ9ø·úý†ÿà7}Âö & Ne„ˆƒo^9!ã"°$o&+(à)‹+/-Ð.e0ù135}6î7Y9»: <\=•>È?å@õAéBÐCD>EÀE$FXF`F6FÍE/EFDC©Aç?Ú=w;È8Í52ú.'+''ô"ž0·9Í r;/Uü¶øUõ;ò_ïÔì…ê‚èÃæ=åäïâ&â|ááÅàªà®àÒàápáîápâã»ã}ä=åæàæ¼ç‘èlé:êëÂërì í”íýíLîtî|îQîîyíÇìÓëµêQéÄçúåäÝá•ß&Ý«ÚØ‹ÕÓ‘Ð6ÎÌÊZÈׯ¨ÅÄÄ(ÄèÃéÃBÄàÄÅÅêÆOÈßɬ˚ͫÏçÑ*Ô™ÖÙŒÛÞ©àAãÜårèëŸí5ð½òCõÃ÷8ú©ü ÿl S† ¼ àÿ"#úáµ "T$&Ô'Š)6+ß,}.0§173´466¤79r:Î;=Y>‹?¯@½A¾BžCnDE§EFLFeF;FéEKE|DWCúA@@F>ò;S9f6*3­/ì+ð'Ì#v•¨ L ÷ýjùûõÕòëïOíøêäèçŠå9ä'ãGâŸá"á×à­à­àÊà á_áÔáXâóâšãXäåçå·æçiè?éêÜêëPìíì{íéí:îqîwî^îî—íêììíêšéèUæhäJâà¡Ý%Û›Ø Ö€ÓÑ«ÎwÌrÊ©È ÇàÅèÄGÄêÃèÃ,ľĖŮÆÈ‘ÉPË7ÍGÏsѽÓÖØÛ—Ý)àÁâWåöçŠê í·ï:òÍô@÷Áù/ü–þøL›à N t™ª½¿½³š‚[ 0"þ#¾%€'3)ã*Œ,+.É/Y1æ2l4è5_7É82:…;Ý<>S?s@ˆAŽBoCJDõD’EúEGF^FGFùEmE§D”CAB›@«>k<Û9ü6Ñ3_0«,¼(›$R ðu…' àÄÔý!ú£öpózðÏílëGérçÒå{äZãqâÀá8áæà°à°àÀàáLá¼á>âÓâ|ã.äòä½åŽæfç>èéíé±êzë)ìÓì\íÖí+îfîxîcî"î°í í6ì"ëâé]è±æÇä¶â{àÞ¥ÛÙ‰ÖþÓ€Ñ ÏáÌÕÊýÈjÇÆÅ_ÄûÃãÃÄÄiÅtÆÁÇ@ÉùÊÕÌßÎÑHÓ©ÕØ•ÚÝ­ß=âØäsç ê¢ì3ïÁñIôÊöDù¶û þÙ'q© ä /DT\ZO=#ü×! #i%''ß(Ž*:,Ú-x/ 1™24 57†8ç9F;–<Ú=?9@TAXBFCDÖDqEèE8F[FMF FEÍDÐCƒBô@?á<]:’7r41g-…)k%/!È]Ûi ¶šþÔúS÷ ô ñRîßë²éÉç"æ¼äŽã âßáRáöà¹à°àºàôà;á§á!â¸âWãäÈä–ådæ;çèêè¿éŽêPë ì±ìAí¾íî\îuîiî0îÇí0í]ì_ëê±èç-åãíàÞ!Ü–Ù ×~ÔúÑ•ÏPÍ5Ë[ɲÇXÆEÅ€Ä Ääà ÄÄ>Å>Æ}ÇöÈžÊxÌxÎ›ÐØÒ1Õ™×ÚœÜ)ßÀáUäóæ†é"ì³îBñËóOöÇø>û¦ý c·ü? p   ÁÝí÷õïÝ£x!I#%Ï&‹(8*è+†-)/¹0M2Ò3S5Ì6:8¢9;R<ž=Ó>@A&BCòC´DSEÒE+FUFTFF©EõDDÆBHAn?T=à: 85¼1#.J*=&"¨:¾IÛ Œ]^ÿûþ÷¯ôŸñÙîWìê'èsæþäÊãËââqááÊàªà½àäà0áá â—â<ãåã§älå;æçççÀè–édê+ëæëì)í¤í îOîpîmî<îÝíPíˆì‘ë`ê÷è[çˆå…ã\áß›ÜÚˆ×ûÔvÒ Ð¾Í˲ÉÈ™ÆtŤÄÄèÃÄgÄÅ Æ<Ç©ÈJÊÌÎ0ÐgÒºÔ%וÙ!ܨÞ=áÙãlæ é ë1îÈðHóÖõIøÈú+ý˜ÿíE‹Î 3 Ysˆ“|fD!ï"¶$z&2(æ)“+7-Ô.o0ú1‰35ƒ6ð7`9¸:Æ?æ@ñAèBËC‹D8E·EFMFSF)F»E!E2D C“AÑ?À=_;®8±5f2Þ. +'×"‡Ÿ(¸ d."Lü°øPõ8ò^ïÔìˆê‡èÅæGåäþâ&âŒááÔà¯àºàÙà"ázáóá|âãÉã|äIåæéæ¾ç•èmé:êëÁënìíŽíöíDîjîmîHîñíní±ìÁë¡ê<é¯çäåëãÉá{ßÝ‘Ú ØvÕôÒ‚Ð,ÎÌÊPÈ߯¤ÅÌÄ0ÄðÃ÷ÃPÄòÄÔÅÇZÈüɻ˰ÍÄÏ÷ÑGÔ©ÖÙ¢Û(ÞÁàTãíåŠèë¶íBðÐòTõÒ÷Iú·üÿ}Í]• È ê-/( ëÀ “"`$ &Ý'’)=+ç,ƒ.0®183¿446¯79x:Ï;=\>Š?¬@¿A·BŸCgDE E FCFWF0FÖE=EgDECâA,@*>Ü;79L63’/Í+Ø'¬#bõ‚— ; ÿì ýbù÷õÎòîïMíúêèèçŽåCä*ãSâ¥á.áÛàºà³àÔàágáÛá`âùâ¤ãZäåê弿”çièDéêàê™ëOìèìwíàí8î`îqîOîî…íÚìðëÚê†éüçAæMä7âíßÝÛ‡ØöÕpÓùПÎlÌmʤÈ!ÇáÅðÄKÄøÃòÃ;ÄÎĨÅÀÆÈ¥ÉcËPÍXÏÑÒÓ1Ö§ØÛ°Ý=àÕâmåèžê6íÃïRò×ôV÷Ðù?ü¤þY«ì) X … »ÄÍÆº©ˆg 8"$Ë%„'>)é*•,1.Î/`1ë2q4í5a7Ð8/:Ž;×<>N?u@‰A…BtC=D÷D…EõET<À9à6¶3B0,¡($: Ö_êp ͸ÉýúŸölóvðÔífëQépçÚåäaãxâÈá@áïà»à¶àËàáWáÂáGâÙâ‚ã6ä÷äÁ啿gçBèéèé·êtë+ìÌìYíÎí%î[îpîUîî¡íüì"ìëËéHèœæ®ä¢â`àÞ‹ÛÙvÖëÓtÑÏÚÌËÊüÈhÇÆÅdÄÄðÃ)Ä®Ä{ņÆÔÇXÉ ËñÌñÎÑbÓ¹Õ-Ø¥Ú-ÝÀßRâíä…çê´ìGïÑñ\ôÙöVùÅû.þ’æ9|¸ î 9R^heZG, ß!«#q%.'è(•*D,Ý-/12(457„8î9F;™<Ú=?:@SAUBDCDÒDiEáE.FOFBFùE~E»D¼CoBÜ@÷>ÆçèëèÂé‹êQëì¬ì>í¶íîSîiî^îî½ííPìFë ê—èîæåãØàvÞ Ü€Ù÷ÖiÔíÑ…ÏHÍ-ËTɲÇYÆJÅ…ÄÄðÃÄ’ÄMÅTÆŽÇ É´ÊŽÌίÐïÒGÕ¯×+Ú®ÜAßÒáläçé2ìÈîRñßó]öÚøLû¶ýsÃG ‚ © Òæýÿ÷çϪ…!N#%Õ&“(A*ï+Ž-./Á0Q2Ù3X5Î6@8¤9;U<œ=×>@A$BCòCªDPEÇE#FGFGF F–EæDïC´B/AY?9=Å:8÷4¡1.-*"&è!‘ ª2È €LTÿ†ûö÷­ôšñÛîVìê,èuæåËãØââwá áÌà»àÀàðà5ášáâ¢â>ãñãªäså?æçêçÆè”éhê&ëçë‰ì$í íîHîfî`î0îÎí=íxì~ëIêäèAçsåmãDáðÞƒÜÚu׿ÔjÒúϴ͔˭ÉÿÇ™ÆyÅ©Ä%ÄôÃÄvÄ(ÅÆPÇ¿È_Ê0Ì*ÎCÐÒÏÔ8ׯÙ3ÜÁÞRáëãæé²ëFîÕð_óãõ]øÓú?ý£ÿO× = f”›¡•ˆnP&!ù"¾$&=(ë)+9-à.q02Š3 5†6ø7_9¿:<\=˜>Ç?â@òAâBÈC…D0E±EFEFFFF¬E E!DöBA¸?§=E;“8•5M2¼.ô*î&¿"l‰§ R BüªøJõ4ò`ïÒìŽê‡èËæLå äã/â’á!á×à¿à»àéà#á‰áöá‡âãÌã‡äHåæéæÃç—èmé<êë¿ëlìíˆíðí:îbî`î:îãí[í¡ì®ëŠê(é™çÊåÚã«áißýÜ|Úö×cÕåÒrÐ$ÎûË ÊNÈÝÆ­ÅÍÄ;ÄúÃÄaÄÿÄëÅÇuÈ ÊÔËÆÍÙÏÒ[ÔÁÖ3Ù¶Û@ÞÑàlãÿåè2ëÄíYðÞògõâ÷ZúÆü,ÿŠÝ*j¥ Ñ ý/5:6%ïÌ œ"i$'&ç'—)G+ì,‹.#0´1>3À4>6­79x:Ò;=[>‹?¬@¼AµBšCaDE—EÿE¾;!9,6÷2q/¶+º'”#Eßjóƒ * ðàýYùòõÌòëïPíüêêèç”åGä4ãYâ®á5áçà¾à¿àÝàásáâáfâã¦ãeä åòå¿æ˜çnèBéêÚê›ëJìæìpíÚí.îXîeîAî÷íuíÈìÞëÆêoééç'æ;äâÛßtÝýÚqØåÕ`ÓêДÎfÌeÊ£ÈÇåÅôÄVÄÿÃÄJÄÝĺÅÔÆ-ȽÉvËeÍpÏ¡ÑèÓIÖ¸Ø9ÛÁÝTàèâ‚åè°êGí×ïbòêôd÷âùMüµþi¸ü3 i Œ±ÃÑØÏɯ–m C"$Ï%’'@)õ*™,:.Ó/f1ð2x4î5k7Í87:Œ;Û<>O?t@†A…BnC;DíD€EëE1FFF-FÚEOE~DoCBm@}>6<¨9Ä6š3(0q,ˆ(b$$ »JÔ] À­½ýúšöfózðÌíoëPéwçßå…äiãâÎáKáóàÇà½àÕàá]áÎáKâãâˆã<äþäÆå™æmçDèéìéµêuë(ìÅìXíÄíîRîaîMîî”íèììüê·é2è„æ˜äŠâIàïÝvÛñØcÖÞÓbÑÏÎÌÈÊ÷ÈgÇÆÅrÄ ÄýÃ8Ä»ÄÅ—ÆêÇjÉ!ËÍ Ï2ÑwÓÒÕ?ؼÚDÝÑßjâÿä™ç2êÅìXïæñiôîöcùÖû?þøD‹Æ û "IYnqofN8 ç!µ#w%9'ï(*G,ê-/1£2)4¨57‹8ï9K;˜<Þ=?=@MAVB=CDËDbEÙE#FEF3FëEnE¨DªCXBÈ@Ý>°<(:\794Ú0--P)4%ú ™*³?Ü šq†þÂúE÷ôñSîâë¶éÓç+æÈäžã¬âîádááÎà¿àÍàáMá¸á1âÆâeãäÕä ånæCçèïèÀéŽêOëìªì8í²í îHî`îQîîªí í:ì8ëóé‡èÓæåîâ¾àcÞõÛmÙäÖWÔÞÑ{Ï;Í(ËPɯÇ\ÆLÅŒÄ ÄøÃ*ÄŸÄ`ÅeÆ¡Ç ÉÇʦ̡ÎÇÐÓ[ÕÈ×>ÚÆÜTßçá€äç°éEìÚîcñòólöëø]ûÄý-~ÖX Œ · Ýò îØ¶‰!^#%ã&—(L*ò+™-1/É0W2Û3^5Ò6D8©9;X<=Ù>þ?ABCëC¨DEEÃEF?F;FúEŠEÒDÞC BAE?=­:ë7Ü4…1ê-*&Ï!v !µ o?Iÿ{ûó÷¤ôšñØîWì#ê,è}æ åÕãÝââ‚ááÚà¾àÎàôàBááâ¦âHãõã±äwåFæçóçÀèœécê*ëãë‡ìíœíùíAîZîWî!î¿í.ídìkë8êÌè.ç[åYã,áÛÞoÜêÙd×ÓÔ\Òíϫ͌˧ÉþÇšÆzŲÄ+ÄÿÃÄ„Ä8Å.Æ`ÇÕÈoÊJÌ:Î\ЕÒãÔP×ÁÙJÜÒÞháýã˜æ/éÄëZîæðqóóõmøäúNý²ÿ^¨é N pŒŸ¦« ’xX0!#Ç$Š&B(õ)¢+D-ä.x0 235‰6û7c9Á:<]=›>Ã?ç@éAæB¿C‚D*E©EF9FÄÄÄmÄÅúÅ$LjÈ!ÊêËØÍóÏ ÒvÔÒÖJÙËÛSÞêàzãæ¯èDëÚíhððòyõð÷lúÔü<ÿ˜í5{® â #8BF>1úÔ §"n$3&ì'¡)N+ò,”.&0¼1D3Å4A6²79{:Õ;=^>‰?¬@¸A´B•C]D E‘E÷E/F>FF¸EEBDC¸Aý?ú=¨;96Ö2[/”+¥'t#1ÅTßq  ãÓøüSùìõÉòçïSíûêïè$çšåNä:ã`âµá?áîàÉàÄàèàá~áèáoâ ã¯ãjä&å÷åÂæœçpèDéêÜêšëFìäìgí×í#îRîVî9îãíkí³ìÍë³êYéÓçæ!äâÃß_ÝçÚ^ØÓÕNÓÞЈÎ]Ì`ÊžÈÇèÅúÄZÄ Ä Ä[ÄìÄÌÅäÆBÈÎÉËv͉ϴÑÔ^ÖÏØMÛ×Ýgàüâ—å+èÅêYíèïvò÷ôy÷ïù]üÇþ!yÅD q œºÏßßÞϼœy J"$Û%”'N)ö*£,A.Ø/o1õ2z4ø5h7Õ89:Œ;ß<>Q?r@…ABjC6DèDvEæE#F?FFÍE<9«6~3 0X,i(M$ ¦4¼Q𠶸ýú’ödówðÎíqëRé{çæåŠäqãˆâ×áSáûàÒàÃàáàáiáÒáVâéâŽãDäåÌ囿rçCèééé¶êtë%ìÅìOíÁíîKîVî@îöí‚íÝìùëîêœé#èkæ…ärâ3àÚÝ`ÛߨQÖÍÓTÑýÎÅÌÀÊôÈdÇ#Æ!ÅyÄÄ ÄAÄÓėŲÆ÷Ç€É7ËÍÏIÑŠÓéÕTØÑÚXÝçß|âåªçEê×ìiï÷ñzôþösùåûNþ«O™Ö  5Llu}|l^< í!Á#}%E'ò(¨*N,î-‹/1¨204ª5"78ó9L;š<à=?=@LASB;CDÅD]EÍEF8F(FÝE]E—D—CCB±@Æ>—<:A7 4½0-3)%á €+Î …juþÀú;÷ôñTîáë»éÕç2æÍä¥ã´â÷áká á×àÆàØà áWá¾á<âÊâpãäÝä¥åqæIçèðèÆéŠêSëì§ì5í«íî?îVîDîîíùì,ìëäékèÄæääÙâ©àLÞßÛYÙÑÖFÔÓÑiÏ5Í ËJɯÇ\ÆPÅ”Ä'ÄÄ7İÄpÅvƶÇ3Éßʸ̹ÎÛÐÓqÕÝ×TÚÚÜißûá”ä+çÃéZìêîyñþóöùølû×ý7‘ß'e š Æ æ ýà¿—!`#-%æ&£(R*ú+ -6/Ó0W2æ3`5Ö6J8ª9;Z<ž=×>@A B CæC£D>E»E F7F(FóErEÆDÇCBA+?=“:Ï7Á4j1Ì-ù)ê%µ!]ó{ ¦ Z88ÿwûé÷ ô™ñÔî\ì"ê2èæåÛãâââƒá áßàÉàÓàÿàHá§á$â®âNãüã·ä}åJæçòçÇè™éfê)ëÞëˆìí•íõí3îSîIîî³ííVìTë%êµèçBåCãáÅÞXÜØÙM×ÇÔFÒæÏœÍ†Ë¤ÉùÇÆŶÄ7ÄÄ*Ä”ÄGÅAÆvÇåÈŠÊZÌTÎqЩÒüÔd×ÙÙ^ÜçÞ~á䬿AéØëkîùðƒóöøñú`ýÀÿl¸ô. W —©µ²®š…`Ä?ã@ìAÝB¿C}D!E¥EüE0F-FþEEêDüCÌBRA‹?v=;^8^52ˆ.¸*º&ˆ"9Ð\é‚ 1ÿÿ2ü–øEõ,ò[ï×ì‹ê“èÑæXåäã?â£á/áìàÌàÑàõà:á“á â“â.ãÙã”äTå#æóæÇçŸèné@êë¿ëdìÿì{íãí)îMîMîîÅí=ízìë^êéhç¢å§ã‚á9ßÑÜTÚÌ×DÕÁÒZÐ ÎîËùÉOÈÖÆ·ÅÕÄMÄÄÄ|Ä"Å Æ7ÇœÈ6ÊÿËðÍÐ9ÒŠÔëÖ]ÙãÛiÞýà‘ã+æÁèXëìíyðó‡õøzúåüKÿ©÷I„¾ î .FKSJ:%á ¬"{$7&÷'¨)V+ú,˜.10¿1K3É4G6µ7!9€:Õ;=[>Œ?ª@ºA®B“CYDEŠEíE&F1F F¦EE,D CAé?ß=Ž;ê8õ5Á29/}+„']#±8ÌZ ÐÉêüLùäõÆòæïPíþêñè'ç¡åQäCãgâ¾áEá÷àÑàÎàðà)á„áñávâã¶ãpä.åùåÊæžçsèGéêÝê–ëGìÝìeíÐíîJîJî+î×íXí¥ì»ë›êHéºçüå äíá­ßIÝÒÚJØÁÕ?ÓÏÐ}ÎSÌZÊœÈ ÇèÅÿÄcÄÄÄgÄüÄÞÅøÆUÈäɤˎÍÏÌÑÔtÖæØaÛîÝ{àãªå@èØêmíùïˆò õ‹÷þùnüÔþ2‡ÓN „ ¥ÉÜèíéÚÆ¦ƒ R""$à% 'U)ÿ*«,E.á/s1ù2…4ö5r7Ö8=:‘;Þ<>N?u@€AƒBbC6DßDsEØEF.FF¼E,E\DFCìA>@L>\v‚ŠaO" ý!Ã#Ž%E')¬*V,õ-‘/!1²204µ5#7”8ô9N;Ÿ<Þ=?:@KAQB9CDÃDQEËE F1FFÔEHE‰D~C2B—@°>{<÷9 7 4›0ú,)%à hû‡º w[mþ±ú;÷øóñOîäë¼éÙç6æÓä«ã»âÿátááßàÏàáàá_áÆáCâÔâsã(äáä¬åwæKçèôèÅéŒêQëþë¤ì/í¤íî2îOî4îýíˆííììëÎéUè¯æÊäÇâ‹à<ÞÅÛGÙ½Ö6ÔÂÑ_Ï)ÍËHÉ«Ç`ÆRÅÄ.ÄÄBĿĂňÆËÇHÉðÊÓÌÊÎöÐ/Ó‰Õò×iÚôÜzßâ§ä>çÙéjìÿîˆñôö ù~ûäýH ì9p ¨ Ò ó"#íÉ!n#0%ò&¨(Z*,¤-B/Ò0e2æ3g5Ü6K8¯9 ;\<Ÿ=Ú>þ?AB CãCD8E²EF*FFßEhE°DµCxBè@?ëÇ?á@èAÞB¸CxDE˜E÷E F'FêE…EÒDíCµB=Ar?\=÷:B8B5ø1j.Ÿ*›&q"ºDÖm "öñÿ)üø?õ(ò^ïÒì’ê”èÖæ^åäãFâ«á6á÷àÑàÜàýàAáŸáââ2ãâã—ä\å%æ÷æËç¡èqé?êë¼ëbìùìvíÜíîFî=îîµí,íjìxëKêìèQçåŽãlá!ß¼Ü>Ú»×.Õ¶ÒIÐÎäËõÉLÈׯ»ÅÚÄXÄÄ.ÄŠÄ3ÅÆKDzÈJÊÌÎÐQÒŸÔ×wÙôÛ‚Þá§ã@æÓèoëúíðóšõøŒúóü_ÿ² T‘Ð ö #:RX^SG/ç º"~$F&û'±)\+- .50È1M3Ñ4I6¼7#9:Ù;=b>‡?¬@¶A¬BŽCSDúD…EâEF$FùE™EùDDõBŠAÎ?É=p;Ð8Ù5¢2/_+i'A#ø•&±K öÄ»àüFùßõÁòçïKíëñè.ç£åZäJãmâÉáLááÙàØàöà5áŠáúáâãÀãsä4åæÌæ¤çtèJéêÞê”ëCìÚìaíÅíî;îAîîÇíJíì«ë†ê2é¤çååõãÖá—ß0ݾÚ3ذÕ.ÓÀÐrÎJÌRÊ›ÈÇïÅÅlÄ Ä&ÄuÄÅíÅÇgÈúɻˢͷÏáÑ-ÔŠÖýØwÛÞ’à%ã¿åUèìê}íð–òõ›÷úüåþ@™Þ'] Ž ¶Òèõùñè̶‰ a"$$ï%¤'^)+°,M.ê/t13ƒ46t7Ù8B:‘;ã<>S?n@ƒA|BcC,DÝDgEÒEF"FF¬EEKD1CÓA)@1>ë;W9q6H3Ð/,2($Ôn'Ñ ’„£ýòùöVóvðÌísëWéƒçñå•ä~ã—âçácááÜàÜàëà,áuáæácâøâŸãMäåÕ奿zçHè$éêé·êrëì¾ìDíµíî6î@î%îÚídíµìØëÁêwéóç?æUäCâà¬Ý6ÛµØ,Ö¨Ó;Ñßε̲ÊìÈfÇ"Æ0ŃÄ-ÄÄbÄîÄÀÅÔÆ!ȬÉ]ËHÍHÏyѶÓÖØÿÚ‚Ýà¤â>åÕçiêíïò¢ô÷—ùülþÎ q´î " Kh‚‘”„pU- "Ï#”%O')³*_,ü-–/,1³2;4´5*7•8ú9P;Ÿ<á=?;@KAMB4CD¹DOE½EF"F FÁE9EwDiCB{@>]<Þ97é3‚0Ú,ú(â$« Lån¦ jLaþ«ú2÷õóñLîéë¼éÝç<æÙä²ãÃââ{á!áäàÛàèàágáÏáIâÞâyã/äéä®å~æLç#èöèÅéŽêNëüë ì,ííøí,î>î/îèí|íÚììýê´éDè“æ·ä­âuà"Þ°Û2Ù©Ö&Ô¯ÑVÏÍË?É®Ç^ÆYŤÄ7Ä!ÄPÄÑēśÆßÇ[É ËåÌäÎ ÑHÓžÕ؃ÚÝ—ß#â½äTçééìïœñ$ô ö!ùˆûúýT²ûG µ Þ *0,&ùЪ!t#;%ü&®(c*,®-F/Ü0f2ï3i5ã6M8²9;Y<¤=×>ÿ?AB CÛC™D1E©EúEFFÒEUE D CbBÓ@û>ÔÄ?ã@äAÛBµCqDEEìEFFàEqEÅDÕC¥B!A_?@=Þ:'8$5Û1N.€*&R"ž.ÁY ãêÿüŠø6õ'òYïÕì“ê–èÝæaå%äãPâ°áCáûàÞàâàáJá¦áâ¢â=ãæã¡ä`å,æüæÎç¤èué=êë·ëaìõìoíÖíî9î5îî¨ííWìfë4ê×è<çsåzãSá ߥÜ+Ú¤×Õ¤Ò;ÐùÍÛËïÉIÈÙÆ»ÅåÄ[Ä%Ä9ÄšÄDÅ1Æ]ÇÆÈ`Ê*ÌÎ3ÐgÒ¸Ô×Ù Ü–Þ'áºãSæéè€ëî ð(ó©õ'ø™úýlÿÃ`¢Ú  -G\dk[V4ï Â"Š$J&(µ)g+-¨.<0Í1S3Õ4N6À7%9ˆ:Ö;$=]>‹?©@µA©B‰CNDõDzEÛEFFêE‹EèDDãBrA¸?°=V;µ8½5†2/B+O'$#à{8 å¶­Ùü:ùÜõ½òâïSíÿêúè1ç¨åcäMãxâÎáVá áÞàåàúàAááâ†âãÅãzä:åæÓæ¥çyèJéêÚê—ë=ìØìZí¾íî2î5îî»í6íƒì‘ëvêéçÌåßã¾á€ßÝ¥Ú$ØšÕÓ³ÐfÎAÌNÊ”ÈÇîÅ ÅrÄ-Ä/ĈÄÅÆÇ~ÈÊÐ˺ÍËÏùÑAÔ£Ö Ù”ÛÞªà8ãÔåhèë‘í!ð©ò.õ¬÷ úüóþQ¦ï3j › Âáóîݹ— e"4$ð%³'`)+·,S.ï/|1 3ˆ46w7à8A:–;ã<>R?o@AzB]C*DÓDbEÉEFFõEE E6DCÁA@>Ð;:9Y6(3µ/,(ø#¸Xì|¼ ‰ršýêùƒöVópðÏípë^é„çöåä„ãžâïájááèàààùà-áƒáëálâã¤ãWäåß妿€çMè!éïéµêpëì¸ìBí«íÿí*î8îîÏíQí¦ìÅë®êbéÜç*æ<ä,âòßÝ%ÛØÖ˜Ó*Ñ×Î§Ì¯ÊæÈdÇ'Æ2ÅŽÄ5Ä,ÄpÄÅÎÅêÆ1ÈÄÉrË]Í`ÏŒÑÑÓ)Ö˜ØÛšÝ&à»âRåççêíŸï/ò®ô2÷£ùü}þÙ4zÆú 1 TxŒ› ›z_8 "×#%X')¼*e,. /,1À294½5-7š8ú9W;<æ=?:@JAIB2CD²DIE³EþEFF®E-EbDXCBi@>G<Á9é6Î3d0À,Û(É$Ž 3ÍYï– VAUþ¡ú-÷îóñLîçëÂéÞçBæÞä¹ãÊââ…á$áóàÞàôà#ápáÕáTâßâ…ã3äîäµå€æSç$èúèÃé‘êIëÿë™ì'í—íïí#î8îîßíkíÊìòëæê¡é.èzæ¥äâcàÞ ÛÙ›ÖÔ ÑJÏÍ Ë=ɪÇbÆ\ŪÄBÄ)ÄbÄÛĩŨÆùÇkÉ#Ë÷ÌýÎ Ñ]ÓµÕØ•Úݦß=âÏäjçüé”ì ï¯ñ3ôµö,ùûþg½O’ ½ ò (3<9.ÿ߯!‚#A%'·(j*,±-R/Ü0t2í3u5á6U8´9;]<¥=Ö>@ABCÚCD,E¡EîEFFÄEFEDCNB»@ã>ºèŒæ&åìãûâ.â¢á4áüàâàîàáaáÀá<âÃâeãäËäåYæ*çúçÏèéiê&ëÙëì í…íÞíî6î!îííƒíéì ìëçétèÕæÿäûâÐàÞÜœÙבÔÒ¶Ï„ÍjË•ÉöÇ›ÆŽÅÆÄSÄ+ÄPÄÅÄxÅzƯÇ%ÉÉʛ̘δÐíÒAÕ¦×Ú Ü(ß»áRääæéì¤î0ñ¶ó9ö²ø$ûŽýïÿK™á T  ¦¹ÒÒÙ˼£}Y!##í$«&c(*½+c-ü.“0 2¦3$56 8r9É:!<`=Ÿ>Å?Þ@çAÓB´CjDE‰EáE F FÑEcE±DÅC‹BAC?)=Ä: 8 5»14.b*d&;"扩K ýØÞÿü†ø0õ$òXïÖì’êèßæhå)ä(ãUâ¹áKááèàéàáSá¬á%â¦âFãîã¤ähå0æÿæÔç£èvé?êë¹ëZìóìjíÎíî.î*îôíííHìQë!êÀè(çZådã=áòÞ‘ÜÚ‘×Õ“Ò0ÐîÍÏËðÉ@ÈÞÆ½ÅéÄfÄ/ÄEÄ«ÄRÅDÆqÇÚÈuÊ@Ì3ÎHÐÒËÔ0מÙ$Ü©Þ<áÏãhæüè“ë$î¯ð=ó¹õ9øªúýyÿÖ%r¯è  9Uipsk[C$ú Ë"“$T&(Â)g+-ª.D0Ó1X3Ü4R6Ä7(9Š:Û;$=_>Š?¨@³A§B†CHDðDrEÒEF FßExEÙDôCÎB\A¡?•=?;–8¥5g2å.(+-'#Âeöˆ# Ô¨žÒü.ùØõ·òãïOíëúè4ç°åeäXã}âÖá_ááìàéàáEá›á ââ"ãÐã}äCåæÖæ¬çwèOéêÚê–ë8ì×ìPí½íî*î+îî­í'ípìëcêézç¸åÄã«áeß ÝÚØ‰Õ Ó§ÐYÎ:ÌFÊ”ÈÇóÅ Å}Ä4Ä?Ä“Ä0ÅÆ5ÇÈ$ÊæËÐÍàÏÒVÔ¹Ö&Ù¥Û-Þ½àNãèåzèë¢í6ð¸òCõ¸÷4úœüÿ_´ýAy ¨ Ïìÿ  üáÉœ r"9$ü%»'h)+º,`.ñ/‡1 3‘46{7å8C:™;ãP?q@|AzBXC%DÍD\E¿EýE FçE‘EøD&D C¨Aû?ÿ=¹;9>6 3›/ã+û'Û#AÓiû ¯ uiŒýãù}öPópðÊíxëYéç÷å¤ä‹ã¦âõáuááòàçàá6áŠáôásâã«ã\äåß坿çRè#éðéµênëì¶ì:í©íòí%î+î îÂí@í–ì±ë›êJéËçæ*äâ×ß€Ý ÛØÖˆÓÑÊÎ¢Ì¤ÊæÈcÇ(Æ9Å’ÄBÄ7ÄÄ ÅäÅ÷ÆNÈÏÉËmÍ|ÏžÑêÓ=Ö±Ø&Û°Ý<àÏâeåýçê'í³ï>òÃôA÷µù)üˆþï=Ï < e‚™§¨«—†hB "á#¤%c')Å*j, .¢/81¾2E4½5378ÿ9U;¤<à=?4@KAFB/CüC­D@E¬EóE FñE¥EESDBCðAT@d>0<£9Ñ6¯3J0¡,Â(«$u ±H׆ H1Lþ™ú#÷ïóûðPîæëÅéãçFæääÀãÐââŒá0áøàêàûà+áyáßáXâíâ‡ã;äõäºå†æVç(èûèÈéŽêKëúë—ì#ííéíî+îîÏí\í¹ìßëÒêéèkæ†äâHàôÝ†Û Ù‚ÖÔ‘Ñ>ÏÍË7ɪÇaÆdÅ­ÄOÄ3ÄpÄîÄ¸Å¾Æ ÈƒÉ7ËÍÏ6ÑtÓÎÕ2دÚ/ÝÀßPâää|çê¥ì7ï½ñHôÃö>ù­ûþuÍb™ Ó õ 1?IB:& è¹!ˆ#N% 'Ä(o*,»-R/é0r2ø3v5é6W8·9;`<¥=Ø>@ABþB×C‰D'E•EêEFúE´E5E|DyC7B¦@É>¡<':c7N4ù0Z-…)~%F!úŒ&³` þ ÿOûÎ÷ôŒñÑî\ì-ê>è–æ$åúãûâ>â¡áFáüàñàòà%áháÉáCâÌâjãäÎä•å\æ-çÿçÒèéiê%ë×ë|ìí€íÖíî*îîÞítíÙì ì ëÎébè½æçäæâ¸àhÞÜ„ÙÿÖƒÔÒ°ÏtÍeË’ÉñǡƎÅÐÄ[Ä5ÄbÄÐÄŽÅŠÆÄÇ9ÉÞʴ̪ÎÍÐÓVÕ¾×/Ú·Ü=ßÑádäûæ’é%ìµîCñÇóKöÂø5ûŸýþÿ[§ñ+ e Š ³ÉÙåÝÛŬŠ`!-#÷$²&n(*Ç+h-/™0&2«3+5 68t9Î:!Ä?ß@âAÔB¬CgDEEÚEFÿEÀETE D²CwBù@+?=©:í7ð4 1.F*I&"Òk: ëÊÏÿü|ø,õòWïÓì™ê›èçækå1ä-ã^âÂáPááïàóàáXá·á(â±âMãòã®äjå5æçÓç«èuéBêÿê¶ëZìëìfíÅí î#îîçííöì8ì;ëêªèçFåKã%ááÞuÜÚz×þÔƒÒ"ÐáÍÊËèÉBÈÛÆÃÅïÄnÄ;ÄRÄ»ÄdÅVƆÇìÈŒÊVÌIÎ`ЖÒàÔF×·Ù7ÜÁÞNáçãyæé£ë9îÂðNóËõJø¹ú)ýˆÿæ5~¾ô " Fas~~uhJ/!Ô"›$_&(Ë)q+-´.I0×1`3Þ4X6Ç7.9Š:ß;$=`>‹?¦@±A¤B‚CCDéDkEÇEýEüEÔEeEÌDÝC»BEA‡?= ;8‡5J2Ê.+'î"ªIàr Ø“Äü)ùÏõ·òßïPíëýè:ç²ånä\ã†âàáeááõàïàáKá¤áâ•â-ãÒãˆäEåæÜæ«çèLéêÚê’ë:ìÏìNí´íûí îîõížíí^ìmëMêïèdç å®ã”áOßóÜ{Úû×wÕÓ–ÐOÎ1ÌAÊ’ÈÇöÅņÄ?ÄJÄ£Ä>Å&ÆEǧÈ6ÊýËåÍùÏ%ÒnÔÐÖ9Ù¿Û?ÞÓàbãüåè%ë¸íCðÐòOõÐ÷>ú²üÿoÃK‹ ³ Ýù  ìÒ© x"F$&Ä'p)"+Ä,c.û/‰13•4 6€7è8F:œ;ä<$>N?q@zAwBVCDÈDSE¶EóEFÚEEèDDõB‘Aä?æ=ž;9!6í2/Æ+Ü'Ã#~)ºTæ Ÿ c]€ýÜùtöPóhðÑíqëdé‹çæ¨ä“ã¬âÿá}á'áùàôàáFáŒáâyâã²ãcä åæå³æ‚çWè#éóé³êpëì³ì6í íííîîÿí°í4í€ì£ë‚ê:é±çúåäýáÂßhÝ÷ÚwØôÕxÓ Ñ¿Î–Ì ÊáÈcÇ*Æ=Å›ÄKÄEÄÄÅøÅÇdÈäɤˆÍϸÑüÓYÖÁØBÛÂÝSàåâzåè¨ê6íÈïPòÓôS÷Èù6üþúO›Þ I q¥²¶²¥rN "é#°%h' )Ë*r,.«/;1È2G4Å557¢8:Y;¤<ã=?6@IACB+CöC©D7E¦EåEFáE—EE@D-CÞA9@O><‹9³6–3*0‰, (•$V š/Æs 7%@þ‘ú÷ëó÷ðPîåëÈéæçLæéäÈãÖââ•á6ááðàá3áƒáäádâïâ’ã@äûä¿åŠæYç-èúèËéŒêKëøë“ìíŠíàíîîî¿íNí§ìÍë¾êzéþçSæqäeâ4àÛÝuÛðØtÖñÓ…Ñ0ÏÍþÊ7ɧÇeÆeŸÄWÄ@ÄÄûÄÌÅÐÆÈ™ÉJË'Í&ÏNÑŠÓâÕJØÃÚGÝÔßcâùäç%ê¹ìEïÔñTôÙöMù¼û'þƒÛ,j­ Ù '<NPQB2ñÅ!Ž#Y%'È(z*,Â-\/ë0z2ý3x5ð6X8½9;b<¦=Ù>ý?ABCÍCŠDE’EÛEúEíE£E'EgDjCB‘@²>†<:F734Ü0?-j)b%-!Ýz ¤K óþþIûÆ÷‡ô‹ñÐî]ì.êCèšæ+åÿããCâ­áHá áôàÿà+áoáÕáEâØânãäÔä˜åbæ1çèÓèŸéiê"ëÚëqìíuíÐíîî îÑídíÊìùëõê¼éIèªæÏäÐâ¢àRÞìÛoÙðÖmÔþÑ ÏlÍ`ËŠÉòǡƒÅÖÄdÄCÄlÄäěşÆÕÇOÉóÊÉÌÂÎáÐÓoÕÏ×JÚÈÜTßçáväç¢é8ìÊîRñÜóXöÕøBû°ýfºù> n š ¼Öæíìâз‘k!6#ý$½&r(&*Ì+o- /0+2±305£68v9Ò:#Ç?Ú@ãAÎB©CaDEzEÍEùEîE·E@E’DšChBß@?÷<:Ø7Ñ4ˆ1÷-,*1&"»Të‚# à»Åÿþûuø&õòWïÔìšêŸèêæså6ä5ãeâÊáYááùàøà&á^áÀá1â·âRãüã°ärå9æ çØç«èwéAêÿêµëTìëì[íÄíúíîîÝízíêì#ì+ëûé”èüæ/å4ãáÇÞfÜëÙm×éÔwÒÐØÍÂËåÉ=ÈàÆÂÅøÄwÄDÄcÄÆÄvÅiÆ–ÇÉžÊlÌ^ÎvЩÒùÔZ×ÌÙMÜÔÞfáøãæ%é¸ëHîÖð\óßõXøÊú6ý™ÿñE‹Ë , Uj‚…‹€qV8 !à"¢$h&(Ó)w+!-·.R0Ý1f3ã4\6Ë719:ß;&=`>‹?¦@¯A BC>DâDdE½EòEòEÃE[E³DÒC¡B3Ap?g= ;c8l5/2¯.ì*ü&Ó"“0Ë]ÿ ³‹ˆ»ü#ùÉõ´òÜïTíëé;çºåräeãŒâèáná$áúàûàáUá®áâŸâ3ãÛãŒäLåæáæ­ç…èKéêÖê“ë4ìÏìEí°íðíîîèíííMìZë9êÚèPç‰å˜ã|á:ßÚÜiÚå×jÕëÒ‹ÐDÎ'Ì?Ê‹È ÇõÅÅÄHÄ[įÄPÅ8ÆWǼÈKÊÌüÍ Ð=Ò„ÔäÖSÙÏÛXÞåàyãæ¡è<ëÆíYðßòaõß÷Pú¿ü"ÿ~Ð[•  è"'ùØ´ "N$ &Ê'y)(+Í,h.0Ž13™46‚7í8F:¡;ã<&>N?r@wAtBRCDÃDJE®EéEóEÎErEÖDDàB|AÍ?Î=…;é86×2]/±+¼'¬#d¤=Ö ‹ VPvýÔùoöIókðÊízë_é–çæ±ä˜ã´ââ…á/ááúàáKá—áââã¸ãjä&åê广„ç[è%éóéµêmëì±ì/í›íåíîîôí í$ísì‹ësê#éšçæåúãåá¯ßOÝäÚcØâÕiÓþгÎÌ—ÊàÈbÇ+ÆEÅ¡ÄUÄSÄšÄ/ÅÆÇsÈþɶ˜ͤÏÏÑÔnÖØØUÛÙÝfàúâå%è¸êJíÙïaòçôc÷×ùHüªþ ^©ì% W ~¯À¿Á«žxY '"ó#¶%q'()Ó*z,.­/H1Ç2R4Å5<7£8:Y;©<â=?7@FABB)CïC¦D.EEÞEñEÚEEýD'D CÃA%@7>ø;r9˜6x30g,Š(u$@ 脳_ +7þ‡ú÷çóóðQîäëËééçOæòäÉãââ#âŸá<á á÷àá:áŒáëálâ÷â˜ãGäÿäÅåŽæ^ç0èýèËéŽêHëõë“ìí‰íÕíîîøí³í?í“ì¿ë§êhéèç=æZäQâàÆÝ^ÛÞØ`ÖãÓtÑ&ÏôÌúÊ/É«ÇaÆoÅ»Ä`ÄOćÄÅØÅåÆ.È®É_Ë=Í=ÏbÑ¡Ó÷ÕaØØÚ\Ýèßzâ å¦ç4êÎìYïäñiôæö`ùËû9þî5}· è 2IZZ]M;ùÏ!š#]%'Î(‚*',Ç-b/ó024}5ó6\8Â9;g<¥=Ú>ý?A BCÅC…DEŒEÎEòEßE”EESDWC Bx@œ>l<õ9)74½0$-N)B%!¾fò“5 ýÞùþ9ûÃ÷ô…ñÑî[ì1êFèæ3åä ãIâ¶áPááýàá3ázáÚáRâÜâwã$äÝä›åjæ2çèÑè§écê(ëÒësìÿìpíÈíîîî¿íXí·ìèëãê¦é6è‘æ¼äµâà<ÞÕÛ]ÙÚÖ]ÔíÑ–Ï_ÍYË…ÉñǡƗÅÝÄmÄOÄzÄðİŮÆîÇ_É ËÜÌÚÎöÐ0Ó…Õå×aÚÜÜlßøáä"ç¹éJìÜîeñìómöàøZû¹ý#qÉJ | ¦ Êáòùøìݽ p!B#%Å&}(,*Ó+x-/§002¶355§68x9Ö:#Å?Û@ßAÍB£C]DùDrEÃEîEáE©E1E~DŒCMBÎ@û>ßÔl ή¶ÿ÷ûjø#õòUïÕìœê¡èïæwå<ä>ãiâÕá^á!áþàá)ákáÆá9âÀâYãä¶äwå@æ çÝç«èzéBêþê´ëRìãì\í·í÷íîîÔíhíÞì ìëâé„èáæåãûà¯ÞQÜÔÙ\×ÕÔjÒÐÎͺËÞÉ=ÈÜÆÊÅüÄÄRÄjÄÛÄÅƧÇÉ´ÊÌwΉÐÄÒ Õq×ãÙ`ÜíÞxá䢿6éÍë[îèðpóíõkøÚúIý¤ÿP›Ú : bvŽ““xd>!å"¯$m&'(×)ƒ+#-Ã.U0å1j3ç4b6Î769:ã;'=b>‹?¤@®AœB|C7DÜD[E¶EæEçE´ELE¤D½C‘BA[?K=ò:F8R52‘.Ò*Þ&º"v®Kç £|y²üùÆõ®òÛïPíëé@ç¿åvämã‘âòátá,ááá#á\á´á#â£â=ãßã“äRåæææ²çƒèRéêÜêŽë4ìÈìAíªíæíîîÞííùì9ìKë$êÇè9çrå„ãcá&ßÄÜTÚÒ×WÕÛÒ~Ð8ÎÌ:ʈÈÇøÅ#Å‘ÄXÄbľÄbÅFÆnÇÌÈcÊ$ÌÎ"ÐSÒšÔúÖiÙæÛkÞýà‹ã$æ·èKëÝíjðòòqõð÷aúÎü2ÿà)j¡ Ð õ#2,0ß¿ Š"V$&Ð'ƒ)/+Ò,r.0˜13Ÿ46†7ï8L:Ÿ;êR?m@{AmBQCD½DBE§EÛEêE¾EbEÈDíCÎBgA´?¸=i;Ò8ç5º2D/+§'Œ#Nõ$Æ x HCjýÍùgöGófðÍíuëhé•ç æ³ä ãºââ‹á;ááááUáŸáâŠâãÀãnä-åî彿‰çZè)éòé´êkëì©ì/ííáíî îâí–ííaì|ë^ê éˆçÍåæãÏá–ß>ÝÍÚPØÒÕVÓõЦΆ̒ÊÛÈcÇ-ÆJŨÄ`Ä]ĪÄ>ÅÆ0ÇŠÈÊÎ˰ͼÏãÑ(Ô„ÖíØlÛíÝzàã å9èÉê_íéïvòõôt÷èùVü¼þn¶ü2 c ‹¦¿ÇÏŽ ‰^ 3"ü#¿%y'/)Ú*‚,.¸/G1Ò2S4Ë5B7¥8 :[;©<å=?6@DAAB CòC˜D,E‘EÕEçEÊEuEéDD C¯A@>á;W9|6_3ô/L,o([$$ ÒiP  (þ‚ú ÷âóôðJîìëÈéòçRæ÷äÒãçâ/â£áHááááBá“áöápâã›ãRäåÎåæcç0èéÍé‹êKëðëìííÒíüí îíí¦í-í‡ì§ëšêPéÖç$æGä7âà²ÝEÛÎØLÖÒÓiÑÏíÌòÊ+É©ÇfÆpÅÅÄhÄ\Ä•ÄÅêÅ÷ÆCÈÂÉsËRÍTÏwÑ¹Ó ÖwØïÚoÝÿß‹â$å¶çLêÜìkïøñyôøöoùÛûEþ¤öIˆÇ ô !<Ybkc[C) ×!£#g%#'Û(…*/,Î-i/ù0„24‚5÷6a8Ã9;e<©=Ø>ÿ?ABõBÉCyDE}EÊEãEÔE‡EECDCCöAc@ƒ>U<Ù97ü3¤0-4))%ú ¬Gâz' éÖéþ4ûº÷|ô„ñÏî\ì5êFè¥æ5å äãSâ»á[áááá:áƒáâáWâåâ~ã*äáä¢åmæ8ç èÕè¤éhê#ëÒëoìûìiíÃíõí î÷í²íKí¤ìÙëÌê•é!èzæ¦ä¡âtà)Þ¾ÛJÙÇÖNÔßÑŠÏUÍSËÉóÇžÆÅãÄwÄZÄ…ÄſſÆÈqÉ ËóÌîÎ ÑFÓ—Õÿ×rÚõÜ}ßâžä9çÉé_ììîzñûó}öôødûÎý.‚Ø[ … · Óïüûâͤ~!H#%Ë&†(3*Ý+|-/«082º3;5¬68|9Ø:&Ã?Û@ÝAÉB CXDñDlE¹EâE×E˜E#EnDtC?B±@ç>Å‹?¥@©AœBuC4DÖDSE¬EÛEÙE©E9E”DªCzBAC?2=Ø:)885õ1v.¶*Á& "[š2Ú on¥üù¼õ¬òÙïPíëéBçÈå{ärãâóá‚á1á á á)ágáºá,â¬âCãæã™äWåæéæµçˆèPéêÖê‘ë.ìÆì<í íãíîÿíÌíuíåì+ì5ëê±è#ç\ålãOá ß³Ü<ÚÂ×BÕÑÒlÐ1ÎÌ2ÊŠÈÇÆ$ÅÄ`ÄqÄÍÄqÅYÆÇãÈvÊ;Ì)Î7ÐkÒ­Ô×{ÙÿÛ~Þá¡ã5æÍè\ëóíyðóƒõøtúÝüBÿœí:w¯ Ý 0;<5& ïà –"^$&Ù'‹)5+Ü,t.0˜1%3£46Œ7ò8N:£;è<(>M?p@tAoBKCD¶D:EžEÐEßE±ESE¶DÙC¹BRA?Ÿ=O;µ8Î5œ2)/s+Š'p#5Ùy² f 96`ýÄùböBódðÎívëjé™çæ¼ä¦ãÂââ“áBáá á#áZá©áâ’â$ãÆãwä/å÷徿ç^è)éõé²êjëì£ì*íŒíÔíÿíýíÚí…ííPìgëLêöèsç·åÌã¹áß&ݹÚ<ؾÕHÓåЛÎ|ÌŽÊÕÈdÇ/ÆOůÄlÄgĺÄMÅ*ÆEÇœÈ$ÊäËÅÍÓÏúÑ?Ô™ÖÙ€ÛÞ‘à#ã´åMèÝêríûïˆòõ†÷øùeüÍþ&}Ä ? r •·Ç×ÕØ¿´Šm :"$Æ%„'3)ç*…,'.¿/N1×2W4Ô5@7¯8 :`;ª<æ=?4@CA>BCìC“D%E‡EËEÙE¿EdEÙDDôBAó?>Æ;;9c6@3Ö/4,L(E$ ¹Sî‹= þwú÷ÝóððLîéëÎéòçZæùäÜãëâ7â­áOáá ááOá™áÿáxâã¦ãTä åÏå—æeç5èéÎéêFëòëˆìíyíÈíöíÿíàí˜íísì™ëê?é½çæ.ä!âñßšÝ3Û¹Ø7ÖÄÓXÑ ÏèÌçÊ+ɧÇgÆxÅËÄtÄeĦÄ-ÅýÅ ÇXÈÕÉ‹ËfÍkÏÑÌÓ%ÖŒØÛˆÝà¤â4åÎç[êõì|ï òô÷ƒùëûVþ° T˜Ò  *N`punfN2 ß!«#s%('å(Œ*8,Õ-n/1Š24†5þ6b8È9;i<¨=Û>û?A BöBÀCvDEvE¾EÙEÃE{EõD1D/CÞAO@g>><¼9ö6Ý3Š0å,) %á 2Èf ÖËÙþ/û°÷xô‚ñÌî`ì3êNè¥æ?åäãYâÆá_á&á ááBá‹áèácâêâ‡ã0äêä¤åuæ8çèÖè¦éhê!ëÔëhì÷ìbí¼íëíîæí§í9í•ìÄëºêé ègæŒäŠâ]àÞ©Û4ÙµÖ;ÔÑÑ{ÏMÍKË{ÉðǢƠÅëÄÄfÄ–ÄÅÑÅÓÆȈÉ4Ë ÍÏ(ÑXÓ²ÕØ‹ÚÝ–ß!â·äLçÝérìïŠñôŒöùuûÜý?’ã(c ˜ Á âù  ðÖ®‰!O#%Ö&‹(<*â+…-/³0:2Ä3;5²6 8~9Ý:%Ç?Ö@ÝAÃBCODîD`E±EÖEÉE‹EEYDfC"B¡@Ê>­<>:„7}441¡-Ù)Û%¯!oª@í «”œÿæûYøõòQïØìœê«è÷æ‚åHäJãyâäáqá0ááá9á|áÕáHâÐâeãäÀä„åHæçæç¯è}éBêýê°ëLìÛìPí¦íéíöíóí±íSíµìñëðê¾éVè¸æëäñâÊà…Þ%Ü«Ù7×±ÔKÒìϹͫËÕÉ7ÈàÆÏÅ ÅÄhćÄ÷ħŞÆÓÇ=Éáʪ̣ζÐîÒ;Õœ×ÚŠÜߢá7äËæ^éôëî ñ’óöøùújýÃÿ#m¹õ) X u•¡¬« ’tV(!ú"¿$€&5(ç)‘+4-Í.d0ë1y3ñ4j6×7:9—:å;-=_>Ž?ž@­A”BsC/DÍDLE¢EÑEÍE›E(E„D“CkBé@0?=¿:85Ý1U.œ*¢&‡"Cç†Å €^bžüù¼õ¤òÜïMí ëéKçÇå†äxã£ââƒá>ááá3áláÆá/â¶âHãìã¢äXå%æéæ»ç‰èSéêÙê‹ë.ìÀì7íší×íúíðíÀígíÓìì!ëüéžè çGåTã8áøÞ™Ü*Ú¬×4Õ½ÒcÐ$Î Ì1ÊÈ"ÇþÅ-ŤÄmÄ{ÄßÄÅnÆ‘ÇùȉÊRÌ=ÎOÐÒÆÔ&×’ÙÜ“Þ)á²ãLæßèpëîŽðó—õø„úíüSÿ©þF…¼ ê *<FG@0÷Ï ž"g$'&á'”):+æ,x.0Ÿ1*3¨46‘7ó8S:¤;é<(>N?m@uAjBFC D®D6E’EÇEÑE¤EEE¤DÆC¦B:A‰?ƒ=7;™8³5€2 /W+o'U#Å`ü W **Wý»ù^ö>óbðÍízëjé çæÁä®ãÈâ â›áKááá+áaá²áâœâ*ãÌã~ä4åýåÃæçaè,éòé·êgëì£ìíˆíÌíôíóíÍíví÷ì<ìWë6êåè\ç å·ã£ájßÝ¥Ú(دÕ7Ó×БÎu̇ÊÖÈbÇ3ÆSźÄtÄwÄÆÄ_Å<ÆWǰÈ;ÊõËàÍäÏÒRÔ²ÖÙ•ÛÞ¢à9ãÈå_èòê‚íð˜òõ”÷ úsüÞþ2ÓP { ¦¿×ßäÝκ˜t D"$Ð%‰'@)è*‘,+.Å/T1Ý2[4Ø5F7®8:_;­<æ=?4@AA;BCæCŽDE€E¿EÑE­EZEÅDõCáB…Aß?í=®;!9G6%3¾/,7(%$ð <Ùz* úòþrú÷ÚóíðOîèëÓéöç^æåáãóâ?â´áXá$áá$áXá¡áâƒâ ã°ãWäåÔåšælç5èéÏé‹êHëìë‡ì íríÂíéíøíÓí‹íícì†ënê,é§çûåä âÙß†Ý Û¡Ø+Ö±ÓKÑÏ×ÌèÊ$ɨÇiÆ{ÅÔÄ~ÄrijÄ?Å ÆÇlÈéÉ¢Ë{̀ϥÑâÓ:Ö¡ØÛÝ%à¹âIåÝçuêÿì”ïòŸô÷’ùüûfþ¿_ªÜ  5[mz‚wqX< é!´#w%7'å(š*9,ß-r/1245ú6j8É9;l<§=Ü>ú?ABòB¼CoDÿDnE´EÏE¶ElEãD#DCÍA4@R>#<£9Ú6Ç3h0Ò,÷(ö$Ä zµU ̹Õþ!û®÷sôñÍî`ì7êRè©æFåä$ã`âÌáká,áá áMá‘áóáhâñâŽã6äïä«åvæ=çèÜè¤éjêëÏëiìïì_í±íãíöíÚí›í'í‡ì²ë©êhéùçKæ}äoâJàúÝ–Û!Ù£Ö,ÔÁÑrÏCÍDËzÉïǢƨÅîÄŒÄqÄ¢Ä!ÅâÅåÆ)È›ÉKËÍÏ9ÑrÓÆÕ*ØÚ!ݦß8âËä[çöéìï›ñ ôžöù„ûîýJ¦í8n ¦ Í î ýÛ¼!^#%ß&“(C*ë+‹-$/¸0B2Å3D5³6&8€9ß:(À?Ú@×AÂB˜CLDãD[E¤EÍE»E}EEKDOCB‡@µ>’<&:i7b41…-¾)¿%˜!Qõ’.Ù œ„”ÿÚûWøõòOïØìŸê®èúæŠåNäQãƒâëáyá8áááCá„áÞáQâÖânãäÊä…åPæçêç°è€éAêýê¬ëKìÖìIí£íÙíôíàíªí?í¨ìÝëÞêªé@è¤æÕäÛâ³àqÞ Ü Ù׫Ô4ÒçϫͧËÐÉ6ÈâÆÑÅÅ™ÄsÄ•ÄÅ¹Å°ÆæÇTÉòÊÃ̵ÎÐÐÓQÕ²×$Ú£Ü(ߺáIäÞæséì•îñ¥ó!öø ûwýÔÿ0}Ä 6 c ƒ¡¬¹³¬š€_2!#Æ$‰&=(ï)™+9-Õ.h0õ1z3ù4k6Ü7<9š:æ;.=a>‰?£@¤A–BnC&DÊDAEšEÅEÁEŠEEmD‡COBÜ@?=Ÿ:ù7ü4À1=.~*Š&j"+Ïqµ nQV”üù·õ¡òÜïKíë éNçÐåˆä‚ã©ââáGáá á8áxáËá:âºâPãôã¦ä`å)æìæÁç‡èYéêØêë(ì¾ì2ííÓíìíèí³íUíÉììëçéˆè÷æ2å<ã"ááÞ„ÜÚ™× Õ²ÒRÐÎÌ(Ê„ÈÇÆ1Å®ÄuÄŠÄíÄ‘Å€Æ¤Ç ÉŸÊhÌSÎfГÒÞÔ9×­Ù#ܯÞ6áÌã]æóè…ëî£ð#óªõø•úþü_ÿ» T”Ç ø 6IOUF>Ö §"o$1&å'ž)A+ë,‚.0¤113«4%6“7ø8T:§;ì<$>R?i@tAgBBCD¨D,EŠE»EÆE–E4E•D´C‘B'An?p=;‚8–5f2ï.>+R';#«KåŒ D Ný³ùXö:ó`ðÍíyëqé çæÅä´ãÑâ&â¤áQá%áá5áiá»á$â â3ãÒãƒä;åÿåÉæ”çcè-éõéµêfë ìžìí€íÅíèíëí¼ílíáì1ì@ë'êÌèHçŠå¢ãŠáUßúÜ‘ÚØœÕ*ÓÇЉÎkÌ‚ÊÓÈ`Ç:ÆTÅÆÄzÄ…ÄÔÄpÅLÆlÇ¿ÈRÊ ÌôÍýÏ&ÒmÔÁÖ6Ù¦Û1Þ¸àLãÝåtèë–í!ð§ò-õ¤÷ú‡üèþH•å ] ‰ ±ÌâëïçÚÀ¦z M"$Ö%”'E)ñ*—,2.Ì/W1ã2a4Ú5L7±8:b;¯<å=?0@AA6BCÞC‰DEwEµEÃE¢EHE·DâCÍBqAÈ?Õ=”;9*6 3ž/û+( $ׄ*¿g ìã þdúÿöÓóíðLîìëÔéúçeæåêãûâFâ½á`á+áá+ábá¦áâ†âã³ã_äå×墿lç9èéÌéêDëëë„ìíoí¶íãíìíÄí€íüìUìrë[êé”çâåäôáÂßrÝÛØÖŸÓ?ÑõÎÐÌàÊÉ©ÇjÆÅÚĉÄ}ÄÂÄNÅÆ0Ç~ÈÿÉ´Ë’Í–Ï»ÑùÓPÖ¸Ø/Û²Ý;àÌâ\åôç„êí¥ï)ò°ô*÷¡ù ütþÎ(n·ê Dfy‡Œƒ}aH ó!¾#%='ð(Ÿ*B,å-y/1‘2457j8Í9";j<«=Ú>ü? ABîBµCmDõDhE¨EÃEªE[EÖDDC¶A @9> <ˆ9Â6¦3Q0±,Þ(Ù$© _?ñ º¯Åþû¤÷pô{ñÎî]ì>êPè³æGåä+ãdâÚámá7áá)áVá˜áûáoâûâ‘ãAäîä·åuæGçèÝè§éhêëÎëbìììXí«íØíîíÊí‘ííxìŸë”êXéÝç=æ^ä_â0àæÝ€Û Ù“ÖÔ´ÑeÏ9Í>ËuÉíǧƨÅùÄ“Ä}ıÄ-ÅöÅõÆ=ȱÉ]Ë5Í0ÏQцÓÞÕ=ضÚ4Ý»ßOâÛätçê•ì'ï®ñ1ô±ö#ù˜ûúý\±þE| ´ × þ$$$êš!b#+%ä&(J*ò+’-+/¼0J2É3I5¸6'8…9à:)Á?Ø@ÓAÀB‘CHDÛDSE›EÁE®EoEïD:D{< :Q7C4ÿ0g-£)£%!8Ý}Ì ‰x‰ÿÎûSø õòOïØì¢ê²èÿæåXäTãŽâðá„áAá!á(áIáŽáåáZâÝâuãäÏäŒåTæçëç´è€éBêüê«ëEìÓìAíœíÐíëíÓíí-í›ìÈëÎê’é.èŠæÂäÀâ¢àVÞûÛ„Ù×’Ô,ÒÕϤ͞ËÊÉ5ÈâÆ×ÅÅ¢Ä}Ä£ÄÅËÅÁÆûÇgÉ Ë×ÌÎÎáÐÓ_ÕÐ×3Ú¾Ü;ßÏá^äòæ‡éì¦î0ñµó4ö¬øû…ýåÿ?‹Ô D o ‘ªºÃ¿¸¥‹f=! #Ñ$&E(ö)Ÿ+A-Ü.n0û13û4t6Ú7E9—:í;,=b>Œ?ž@¥A’BgC&D¾Dë<†:Ý7â4£1!.`*p&O"ºVõ  ^CK‰üûø®õ òÖïQí ëéQçÕåäˆã°ââ—áMá'á$áDá~áÕá@âÄâVãüãªäiå'æùæ¼çèVéêØêˆë(ì¸ì+íŒíÅíçíØí©íEí¸ìõëýêÖérèâæå*ãáÏÞmÜÚˆ×Õ£ÒFÐÎýË$ÊÈÇ Æ6ŷĀĚÄ÷Ħů½ÇÉ·Ê{ÌhÎÐ§ÒøÔM×ÃÙ:ÜÃÞMáÞãtæéšë&î±ð9ó¸õ2ø¤ú ýqÿÉdŸÙ *@U]\VD* Þ ´"v$9&ñ'¡)M+î,.0­143±4)6–7û8W:©;í<'>P?h@tA`BACþC¢D%EE³E·EŠE#E„D¡C}BAY?T=;g8x5L2Ñ.!+7'#ç’4Ñw 5 Eý©ùTö5ó_ðÍí}ëoéªçæÑä·ãÚâ-â­áZá,á$á=áqáÄá*âªâ9ãÛã‡äCåæÌæ—çfè/é÷é±êgëììíyí¼íàíÜí´íXí×ìì0ëê¹è1çtåŠãvá;ßæÜ{ÚØŒÕÓ½Ð{ÎdÌ}ÊÏÈbÇ:Æ]ÅËćÄÄäÄ~ÅaÆ|ÇÙÈbÊ"ÌÎÐ@Ò}ÔÞÖEÙÂÛCÞÐà]ãóå‡èë©í3ð»ò=õ¶÷*ú–üûþP¬ì4i • ¿ØíùøõâϬ† W"$ã%™'O)ø*,;.Í/b1æ2f4á5M7¶8:c;±<ç=?2@?A1BC×C…D EnE«E·E–E7E©DÌC»BZA±?½=|;é86ê2‡/Ü+þ'ð#½m«T àÔþ^ú÷öÐóëðJîíë×éüçiæåêããKâÆájá2á(á5áhá²áâ’âã¼ãdäåÜ奿qç:è éÍéŽêDëèëìídí³íÖíâíºímíñì@ìbëIêþè€çËåîãÛá°ßXÝöÚ}ØÖ‘Ó1ÑèÎÍÌÕÊ$É¡ÇrÆ„ÅâēĊÄÐÄ_Å/ÆCÇ‘ÈÊÆË­Í§ÏÔÑ ÔhÖÌØGÛÃÝSàÝâsåè–ê,í²ï?ò¿ô;÷°ùü„þÞ4€¿ý * Rp†’–‘ƒnP) þ!Å#‰%D'÷(§*J,é-/1š24•57p8Ì9&;k<­=Ù>û? ABëB±CdDðD\E¡E³EžELEÄDÿCïB¥A@#>ð;o9¦6‹360•,Å(¼$’ Gë‰,ß ®ž¿þû¡÷kôxñÏî_ì>êWè¶æMå'ä-ãrâÛá|á=á'á3á\á¤áâyâÿâãCäùä¸å}æHçèàè§éiêëËë`ìèìQí¢íÒíàíÂíííiìŒë‚êBéËç$æJäGâàÑÝlÛøØÖ Ô¦ÑXÏ3Í3ËuÉèǫƬÅśĉĿÄ>ÅÆ ÇPÈÅÉsËIÍFÏeÑžÓóÕSØÍÚIÝÑßcâïä‰çê«ì5ïÁñCô¿ö8ù£ûþhÁ SŠ À å +3,#ñΡ!l#3%ë&¦(P*ú+˜-1/Â0O2Î3M5½6(8Œ9Þ:1Â?Ó@ÔA¼B‹CCDÔDIE”E²E¤E_EàD'D(CéAY@ˆ>`<ò937.4Ü0R-„)‹%d!Èd´ €fÿÇûIø õ òOï×ì¦ê´èç“å\ä_ã“âùáŒáHá*á/áSá”áîácâáâ€ãäØäåXæçíç·è‚é@êÿê¦ëEìÌì<í”íÉíßíÈíŽí"í†ì»ë·ê€éèwæ©ä®â‡àEÞãÛsÙúÖ„ÔÒËÏ˜Í˜ËÆÉ3ÈçÆ×Å"ŧĎĬÄ'ÅØÅØÆ È€ÉËóÌÜÎþÐ.Ó{Õá×MÚÎÜTßàásäç—é+ì·îBñÈóBö¿ø)û—ýõÿJŸÝ P | Ÿ´ÇÌÌÀ°“sD!#Ù$–&P(ü)§+G-á.s02‚35s6â7D9:ì;/=`>?›@¤AŒBfCD¼D/E‰E­E¨EpEøDQDZC,B©@æ>ÎL?j@oA^BÆaÅÕđĞÄñÄÅoÆ‘ÇéÈzÊ5ÌÎ)ÐRÒ™ÔîÖ^ÙÕÛXÞåàpã æ–è.ë¸íHðÉòPõÄ÷>ú¡ü ÿ`¸ûAs § Çæ÷ýîÕ¹ a"&$ê%¢'U)ÿ*¦,>.Ù/c1í2k4â5S7¹8:g;±<æ=?-@>A.BCÓC}DEdE£E§E‹E'E–D¿C¡BJA—?§=b;Ð8ù5Ð2j/Á+å'Ö#£Xø™Cõ ÓÇùýUúòöÌóêðLîïëÚéènæåöããYâÉátá;á.á?áná¼áâ›âãÄãhä&åß嫿sç=è éÎéŽê@ëèëxìýì\íªíÏíÔí¯í_íáì2ìLë9êêèjç¹åÓãÍá”ßIÝßÚlØõÕ‚Ó$ÑÝÎÆÌÎÊ"É¡ÇuƉÅêĞĔÄàÄnÅ@ÆUÇ¥È'Êá˺ÍÃÏåÑ%Ô{ÖäØWÛÝÝcàóâ†åè­ê9íÈïLòÒôJ÷Àù.üþïB‰Ò : \}‘œ¡›ŒyV4 "Ì#”%I')ª*Q,ñ-†/1Ÿ24š5 7q8Ó9$;q<©=Ü>ù?ABâB±CZDìDSE•E«EE?E´DëCßBAó?>Û;Q9Ž6p30,¤(©$t 2ÒxÑ œ”´þûš÷hôwñÍîaìAêZè¼æSå,ä8ãvâçá€áHá-á=ádá«á â€âã¥ãFäå¹å…æIçèãè¥ékêëÇë`ìÞìOí˜íÊíÓí¹íoíüìUì|ënê.é·ç æ8ä,â à·Ý\ÛâØqÖùÓšÑLÏ*Í.ËqÉêǬƲÅŦĔÄÏÄKÅÆÇeÈÙɇË`ÍXÏÑ¯Ó ÖiØßÚ`Ýãßvâå˜ç-ê¸ìLïÌñYôÌöIù²ûþyÍ]š Ë ó ,4?7-ûا!y#5%ø&«(Y*ÿ+Ÿ-7/Ç0U2Ñ3S5¿6-8Œ9ã:.Â?Ò@ÐA¸B‡C:DÑD>EŒE¥EšEOEÒDDCÖAA@s>E<Ú974Ä03-l)o%K!²Mö¢ p[rÿÀû@ø õòRïØì¥ê¼èçåaäfãšââ“áRá2á9á[ááöáfâîâã(äÝä”å^æ#çîç»è€éDêúê§ë@ìÈì9íˆíÅíÐíÀí€íízì¥ë§êméèaæ–ä“âwà+ÞÑÛ^ÙëÖsÔ Ò¿ÏÍ‘ËÂÉ4ÈåÆßÅ#ŶĔĽÄ4ÅèÅéÆÈÉ2ËÍõÎÑEÓ’Õó×dÚâÜhßöá„äç©é?ìÆîWñÓóXöËø<û¤ýZ©î* ^ ˆ ©ÃÎÜÓ̹›{P!#å$›&Y(*¬+O-ç.y02„3 5v6æ7G9Ÿ:ï;-=d>‡?ž@ŸA‹B^CD´D*E}E¢EœEaEëD¸3º41679\:¬;ï<(>N?i@jA^B5CõC”DElEžEžEnEEaD~CRBç@'?&=Ð:28D52š.ì*'ì"¶dªS  ðû/ýùGö0ó\ðÌíëué²ç%æÜäÆãèâ<â¾ájá?á3áOááÔá;â¸âGãçã“äOå æÙæ›çmè1éøé°êcëì’ìíií­íÌíÆíší>í¶ìúë ëêéè çEådãEáß¹ÜUÚÝ×hÕüÒ ÐjÎQÌtÊËÈbÇAÆgÅÛĞĨÄŞłƣÇþÈŽÊJÌ3Î?ÐeÒ±Ô×wÙæÛnÞøà…ãæ«è=ëÍíVðÞò\õ×÷Kú³üÿpà K„ ¯ Õñ úßÀš e"3$î%­'Z)+©,I.Ú/l1ï2r4å5Y7¸8:f;³<è=?.@:A.B CÐCuDýD]E•E ExEE‚D­CB1A‚?=F;º8Ü5µ2Q/¤+Ë'¼#ˆBÝ‹&ï ºÃæýRúêöÈóêðHîòëÙé èqæåùãã]âÔázáDá7áFáyá¿á)âœâ/ãÃãvä$åê嫿xçCè éÒéŠêCëáë{ìðì\ííÉíÉí¢íSíÎì"ì<ë"ê×èUç¡åÂã°á„ß/ÝÍÚWØáÕuÓÑÖθÌÍÊÉ¥ÇuÆŽÅóĥģÄìÄ}ÅSÆhǸÈ=ÊóËÒÍ×ÏüÑ;ÔÖ÷ØqÛíÝ|àãšå,è½êMíÛï^òâô[÷Ñù;ü£þúR™Ü B n„¡¥¬§–„_@ "Ù#—%V')·*V,÷-/1¦2$4ž57t8×9%;r<«=Û>ø?AþAáB«CUDãDIEEžEƒE/E¤D×CÎBuAÞ?ð=À;;9o6X3û/b,‹(Œ$[ ¼_¼ ‡¦þû÷fôsñÌîdì?êdè»æ^å.äAã|âïáŠáMá9áCámá²áâƒâã¦ãQäåÃå…æPçèåè¨éiêëÅëZìÝìEí”í¿íÊíªíeíéìFìië\êéŸçûåäâíߥÝEÛÏØ_ÖèÓŒÑAÏ!Í(ËkÉêǭƶÅŬĤÄÙÄ^Å'Æ/ÇuÈïÉËsÍsÏÑÊÓÖ~Ø÷ÚqÝü߈âå«ç@êËì]ïâñfôàöYùÀû/þƒá'm¦ Ø 6BHE6"Þµ!}#B%þ&´(^*,¥->/Ï0W2Ú3U5Å608Ž9æ:/½?Ö@ÉA¸B€C6DÆD7E€E›E‹E@EÁDDC¿A,@Y>-<À9û6ù3£0-K)W%.!î™9á `Ngÿ¶û<øÿôòKïÚì©ê»è ç åfäpãžâ âšáZá;á?áfá¢áâlâ÷âˆã0äàä›å`æ&çóç¼è‚éDêùê¤ë?ì¿ì6íí¼íÅí´íqíígì”ë•êVéîçLæ~äâ_àÞ½ÛIÙÙÖaÔүω͈˿É3ÈåÆåÅ*ſġÄÊÄCÅúÅûÆ1ȦÉEËÍ Ï(ÑYÓªÕØzÚ÷Ü}ß â›ä+çÀéOìÛîhñäóköÙøNû³ýh¹ù; i — ´ÏÞáâ×À«Z!$#é$ª&X(*­+Z-ë.‚0 2‘356å7L9¡:ï;0=d>‡?œ@›A‡B[CD¬D!EsE—EEQEÛD+D6CB@¸>œ<>:ˆ7“4O1Î-*&"Är¸k -'püåø õ—òÓïSíëé]çæå£äãÈâ&â°ádáAá=á]á—áëáYâÙâkãä¼äxå9æçÇç—èXé!êÒê…ëìªìítí¯íÆí¸ííí†ìÃëÅê™é6èŸæÛäãâÊàŠÞ1ÜÆÙP×ÞÔuÒ#ÐñÍèËÊxÈ(Ç ÆPÅÌĥľÄ(ÅÔÅÆÆòÇZÉõʺ̪νÐêÒ7Õ‘×Ú{Üߊá䫿AéÏë^îçðjóíõ^øØú7ý¢ÿðH‰Éþ ( Met{waI)ú Î"$Q&(·)b+-.30º1D3¾456 79^:¬;ô<#>Q?d@kAZB1CîCD EcE”EEbEòDTDfCCBÌ@? =¹:8+5÷1€.Ò*ã&Ö"—Pð”B  æì&ý—ù?ö/óZðÎíëzéµç*æääËãòâCâÇáráGá=áUáŒáÚáCâ¾âOãìãäO忨æ¢çmè3é÷é³ê`ëììíeí¤íÁí½í‰í3í£ìêëùêÔé~èîæ5åFã4áüÞ¥Ü@ÚÊ×VÕîÒ“Ð]ÎLÌmÊÈÈbÇEÆnÅäħĶÄŲœƶÇÉ¢ÊaÌJÎRÐÒÃÔ׉ÙýÛƒÞ á›ã-æ¿èPëÞíjðïònõé÷XúÅü&ÿ€ÓY ½ ãüíÈ¢ q"9$ù%±'f) +´,K.ã/p1ô2x4è5\7¿8:o;®<ì=?.@8A+BCÎCkD÷DRE‰E•EiE EqD›CzBAi?v=/;œ8Á5›21/+«'£#n'Êq× ±³ßýIúãöÇóåðKîðëâéèyæ åäãbâÝáƒáMá?áOá€áÌá,âªâ-ãÒãvä.åî屿zçGè éÔéŠêAëâësìíìVí“íÂíºí˜íCíÁìì'ëê¿è@çŒå©ã›ámßÝ»Ú@ØÕÕ_Ó ÑÊέÌËÊÉ¥ÇzÆ’ÅýĭıÄûÄŽÅdÆ{ÇÍÈPÊ ÌçÍíÏÒPÔ§ÖÙ…ÛÞŽàã®å@èÑê`íëïròóôm÷áùLü°þ `§ë" Q x’«±¼«¨†oD "â# %^' )½*],.‘/#1ª2(4¥57|8Ô9,;q<®=Ù>ù?AûAßB¡CSDØDEE~E—EpE%E‘DÆC¸BaAÅ?Ù=¥;9V693ã/B,t(k$F þ¤Mí¯ |zþùú‹÷_ôsñÊîfìBêdèÃæaå8äEã†âöá‘áYá=áOátá¼áââã®ãWä åÆåŒæRçèæè©éjêëÃëWì×ì?í‹í·í¿í íSíßì2ìYëIêéçÞå äâÚß‘Ý,ÛÃØFÖÞÓzÑ7ÏÍ!ËkÉæÇ²ÆºÅŹĬÄêÄmÅ9ÆALjÈʯˌ͆ϨÑàÓ2Ö–Ø Û‰Ýàâ-åÂçOêâìmïôñvôòögùÓû<þ•î4|± è ,?PPR@+åÀ!„#K%'»(f*,«-C/×0Y2ã3U5Í608•9ä:3½?Ò@ÈA³B~C.DÁD-EvE‘E|E2E³DîCóB¥A@?><§9à6Û3‹0ü,4)8%!Õ%Ƀ NA[ÿ­û4øýôòLïÚìªêÁèç¥åpäsãªââ¥áaáDáJáká¯áâyâúâ’ã3äçä¢åbæ-çôç½è‡é@êûê ë<ì¼ì.íyí³í»í¨ícíõìVì„ëêEéÙç5æhäiâIàÞ§Û6ÙÆÖQÔóѤπ̀˽É-ÈìÆåÅ2ÅÊħÄÞÄMÅÆ ÇGȶÉ_Ë)Í&Ï:ÑqÓ¾Õ ØÚÝ’ßâ²ä>çÔébìîîyñ÷ózöëø]ûÃý!z D y ¢ ÁÛèðëâ̲Œb!-#ó$¯&f(*½+Y-õ.†02“35€6î7L9¤:ñ;1=e>…?œ@˜A†BUC D¤DEiEŽE€EEEÊDD#CìAh@ >„<$:m7x421´-ó)&ç!«Zÿ¦T $büàøšõ”òÒïPíëédçéåªä£ãÐâ.â¸ápáFáKáaá£áòáaâáâsãäÄä}å=æçËç—è_éêØêëì¤ìíkí¦í¾í©íuí íwì®ë¶êé#è‡æÆäÊâµàrÞܱÙ>×ËÔgÒÐèÍâËÊ}È!ÇÆOŨĝÄÌÄ5ÅéÅÔÆ ÈlÉ ËÒÌ¿ÎÕÐÓKÕ©×ÚŽÜß›á3äÀæSéãëpîúðóûõsøäúMý«ÿT—Ú 7 Yrƒˆ‹}nU- !Ñ"›$Z&(Â)h+ -¦.60Å1G3Ä486§79c:¯;ò<(>O?b@jAUB-CêC…DEXE‰EƒESEåD=DYC)Bº@ú>ñ<ž:ù75Ù1g.°*Í&µ"ƒ2Ü}/ óÓâýŽù<ö'óZðÌí‚ëé¶ç2ææäÖãõâNâÌá|áOáGá\á•áááKâÈâTãöãŸäZåæàæ¢çsè3éúé¯êaëýëŠìí[íœí¹í®íí!í”ìÙëåêÁéièÙæå0ãáäÞ‘Ü*Ú¹×DÕÝÒ†ÐSÎEÌfÊÉÈ_ÇKÆqÅïıÄÃÄÅÀŦÆÊÇ%É·ÊwÌ]ÎnÐ’ÒÛÔ1×ÙÜ—Þ"á²ã=æØè`ëôí|ðóõù÷júÕü5ÿ‘à+e¡ È ò'#! øÑ® x"B$&·'o)+º,S.ê/v1û2{4ï5_7Â8:n;²<ì=?/@3A)BCÆCjDêDLE|EŠE[EþDbD„CjBAT?]=;„8¢5‚2/r+'ˆ#U ´ZÈ ž¨Óý?úßö¾óåðHîôëßéè{æ&åä ãmâåáŠáVáFáZá†áÕá4â°â7ãØã|ä6åð叿}çGèéÏéê<ëÞëqìçìNíŽíµí±í‹í5í±ììëýé­è*çvå“ã…áWßݧÚ,ØÄÕPÓþмΪÌÀÊÉ¥ÇzÆšÅÅºÄ»Ä Å›ÅzÆŠÇãÈeÊ ÌüÍÐ(ÒgÔ¾Ö#Ù›ÛÞ¥à.ãÄåTèâêvíüï…òõ}÷ñù^üÀþm¸÷1 ] „¢³Ã¿¾¬–vP "ê#¨%f')Â*g,.˜/+1«224¦57}8×9.;q<°=Ø>ø?AøAÙBŸCHDÕD7ExE†EfEE€DµC¤BJA°?À=Œ;966!3Ä/',W(P$* æŒ8Ú mm‘þñúƒ÷\ônñËîeìFêgèÇæhå=äLãâûážá^áHáVá|áÄá"â–âã·ã]äåÎåæXç èæè­éfêë½ëUìÑì8í†í©í·í’íGíÎììJë1êôètçÍåòãíáÃßyÝÛ¨Ø;ÖÉÓnÑ-Ï Í!ËaÉìÇ®ÆÄÅÅÅÄ·ÄøÄ}ÅKÆRÇžÈÊÇË¡ÍϽÑ÷ÓHÖ®ØÛžÝ%à±âEåÑçfêôìï ò†ô÷xùåûJþ¦úFˆ ó 8NZ^ZJ:õÃ!‘#T% 'Å(k*,±-K/Ú0c2ä3]5Î658–9ë:1À?Í@ÉA«B{C&D»D%ElEƒEqE"E£DÛCÞBA@$>ý;Š9Ä6Ã3j0ä,)%ú ¿f´p >3Qÿ¡û1øóôòIïÛì¯êÁèçªåtä}ã¯ââ­áháOáNáwáµá ââã˜ã>äéäªågæ0ç÷çÁè„éDê÷ê ë5ì»ì$íví¥í´í™íXíåìFìqëlê2éÁç"æOäSâ1àìÝÛ%Ù±ÖDÔáÑšÏuÍ}Ë´É1ÈéÆìÅ:ÅÑÄ·ÄèÄ^Å!ÆÇ\ÈÌÉqËDÍ8ÏSщÓÒÕ9Ø¢Ú$ݨß3âÅäRççéuìïŠñ ôˆöþølûÓý1‡ÔV ² Îæôú÷ìÖ»˜i!:#ø$º&l(*Â+c-ù.02›35ˆ6ï7P9§:ñ;4=b>‰?—@™A~BRCDœDE[E„ErE7EºD DC×AS@†>m<:U7[41˜-Ô)ì%È!–?ìŽD ûXüÚø”õ’òÐïPíëénçëå´ä¨ãÙâ4âÂáuáRáQájá¬á÷ámâåâ{ãäÉäåCæçÐç›è\éêÔê~ëì ìífíí°í¢íbíícì¡ëœêséèwæ«ä·âžà[Þ ÜœÙ+׺ÔXÒ ÐÞÍÛË Ê{È#ÇÆWÅáļĨÄHÅöÅêÆÈ„ÉËçÌØÎçÐÓ_ÕÁ×+Ú§Ü,ß´áDäÖæfé÷ë‚î ñóö‚øõú[ý½ÿb§å B g{‘’™†z\;!Û"¥$`&(È)o+-ª.>0É1M3É4>6§7 9b:³;ñ<*>L?d@fARB+CâCDúDREzEzECEÔD.DACB¢@ã>Ù<‚:ß7ô4À1F.˜*¬&Ÿ"eÀm äÄÕý…ù7ö%óVðÎíƒëé¼ç6æïäÙããTâÖáƒáXáMáiá›áëáSâÌâ_ãùãªäYå æÝæ¬çpè7éøé±ê]ëûë†ìûìVí“í­í¦ípííƒìÈëÑê®éSèÄæ åãáÎÞ}ÜÚ§×1ÕÏÒ{ÐFÎ>ÌbÊÄÈcÇKÆxÅøÄ»ÄÒÄ-ÅÑźÆÚÇ>ÉÉÊÌs΂ЫÒíÔMׯÙ/Ü©Þ;áÁã[æâèzëîðóõ ø}úâüGÿŸï7t­ Õ ÿ+01(ÿÞ³ ƒ"K$ &Â't)+Â,X.ñ/z13}4ö5_7Ç8 :p;µ<è=?*@7A"BC¼CeDâDBEtEzEPEìDQDsCUBí@>?D=ú:g8Š5a2û.Q+u'k#<óŸBô ² ”˜Ëý7úÖö¿óßðJîôëäéè€æ,åä(ãuâíá”á^áPáaááÜá;â·â>ãßã‚ä;åô弿çKèéÓéŠê>ëÛëlìãìFí…í¬í¦í~í&í¢ìíëëæéšèç`å|ãoá=ßòÜŠÚ!Ø«ÕEÓìдΠ̼ÊɧÇzƢŠÅÅÄÉÄÅ­ÅŠÆŸÇöÈzÊ5ÌÎÐ>Ò}ÔÖÖ7Ù´Û-Þ»àDãØåeèûêƒíð’òõ‹÷úküÐþ+{Æ< m ‘¬ÁÍÊʵ¢€W +"ð#µ%l')Ê*n, . /.1µ244«57}8à9*;x<­=Ù>ø?þ@øAÓB›CCDËD0EkE{EYEEoD£CB9A–?§=s;ê863§/ ,9(7$ ËwÈŠ ^`†þçú}÷YôjñÌîbìLêhèÐæiåGäSã–ââ ájáRá[á‰áÊá*âŸâ"ã¿ãcäåÔå’æZç#èèè¬éjêë¿ëNìÍì3í{í¢í¬í‚í=íºìì1ë#êÙèbç¶åÛãÙá«ßeÝÛ˜Ø&Ö»Ó`Ñ!ÏÍË]ÉìǰÆÇÅ%ÅÌÄÇÄÅÅ[ÆhǰÈ.ÊÜ˶ͳÏÕÑ ÔaÖÂØ5ÛµÝ;àÆâZåäç|êí”ïòšô÷‰ùöûXþ·V•Ï %D[dlcX@#þÍ!›#Z%'Ë(v*,º-Q/à0h2ê3`5Ô688š9ê:6¿?Ë@ÇA¨BuC!D³DEdEvEdEEDËCÉBzAí? >ä;n9¬6¡3U0Â,ü(%á ¢Pú¡_ ,&Fÿšû(øïôþñIïÚì³êÁè"çªåä~ã»â â¶ápáXáWáá»áâ‰âã¡ãBäïä±åhæ7çøçÄè„éEêõêŸë1ì·ìíníœí¨ííFíÚì3ì`ëZêé±çæ<ä<âà×Ý|ÛÙ Ö3ÔÓÑÏiÍw˱É0ÈêÆóÅ>ÅÞÄÂÄöÄnÅ2Æ0ÇnÈãÉ…ËZÍOÏiÑŸÓéÕNعÚ:ݽßFâÜäcçþé„ìïšñôœö ùûßýC•á)] – ¹ Üóý þøâÃ¥o!E#ÿ$Å&p((*Æ+k-/02œ35Š6ó7R9«:ñ;7=`>‰?•@–A}BLCD“D EPE{EdE(E«DôCþB¿A>@j>X<è9<7?4ù0|-¹)Ë%´!u.Î~0 ìNüÒøõòÑïQíë"énçôå·ä°ãàâ=âÊá~áYáYáuá±áâqâïâ‚ã"äÍä‹åBæçÐçžè^é êÑê€ëìžì í`í“í¨í”íWíîìTìŒëê[éöç^æ•ä£âƒàJÞïÛ‹ÙתÔHÒüÏÕÍÒËÊtÈ(ÇÆaÅéÄÆÄåÄXÅÆþÆ.ȘÉ2ËþÌëÎÑ0ÓwÕÖ×BÚ¼Ü?ßËáWäìæxé ì“î!ñžó#ö‘øûjýÌÿ#n·ò& P qŒš¡Ÿ”‚iA!á"°$h&!(Î)x+-².D0Í1U3Ë4D6ª79g:²;õ<(>K?d@bAQB#CßCvDøDBEtEiE5EÇDD5CûA‘@Ç>Â:7  ç¾ Ž"S$&É'})$+Ç,c.ó/„13…4ø5f7È8$:q;¶<í=?,@2A BþB·C^DØD;EfEpE@EÝD=DbC=BØ@&?(=â:J8m5E2Ý.5+W'P#Ü„.Þ ¢ „‰Ãý)ú×öµóáðFî÷ëåéè†æ1åä1ã{â÷á›ágáXájášáâáFâ»âJãâãŒä>åüå¿æ†çLèéÔéŠê<ëÙëgìßì?í}í¢íšíqíí’ìÚëóêÑé‡èúæLådãXá'ßÞÜtÚؘÕ5ÓßШΗ̶ÊɥǀƤÅÅÏÄÕÄ)ŽśƵÇÉ–ÊDÌ0Î-ÐYÒ’ÔíÖOÙÇÛFÞÍà\ãêå~è ëœí ð«ò&õ¢÷ú}üâþ7ÒK x ŸºÍ×ÙÑÄ©Œc 3"ú#¾%r'*)Ñ*t,.¤/51º2:4®5 7‚8ß91;u<®=Ý>ñ?AïAÒB–C:DÅD$EcElEMEñD^DCxB"A~?=V;Ï86å2Œ/í+($ö°a·u PP|þÞúw÷RôkñÇîjìGêrèÏævåGä^ã›ââ«áráZádá‘áÑá4â¥â+ãÅãjäå×å˜æ]ç&èëè­éhêë»ëLìÈì,ísíšííyí*í­ììëêÄèLçŸåÆã¾á˜ßLÝðÚ…ØÖ®ÓOÑÏúÌË]ÉèǶÆËÅ,ÅÚÄÏÄÅœÅnÆ|ÇÃÈFÊïËÎÍÊÏêÑ&ÔuÖÛØKÛÊÝPàÝâkåüçêí¨ï(ò®ô$÷œùümþÁ_§Ý 8MipuqaM, ×!¢#e%'Ò(*",Á-X/ä0p2í3f5Ö6=8›9ï:4¼?Ì@ÁA§BmCD§DEREqEPE E|D¼C±BiAÑ?õ=É;S96†360§,ß(æ$Æ ‰:ßH !:ÿ‘ûøíôùñIïÜì²êÈè!çµåƒäˆãÁâ(âÀáyá`á`á‡áÇáââã¦ãJäöä³åqæ8çýçÃèŠé@êùê˜ë1ì¯ìíeí”íœí„í8íÉì$ìKëIêé™çôå#ä&âàÂÝdÛÙŠÖ$ÔÅÑ‚ÏdÍk˱É-ÈìÆúÅCÅéÄÍÄÅ€Å@ÆHÇ}ÈüÉšËoÍfÏѶÓÖ_ØÖÚIÝØßZâïä|çêšì*ï«ñ3ô¨ö#ùŠûöýO¥ñ4o   Ë å þïÌ­z!L# %É&|(,*Ð+r-/™0!2¢35‹6ú7S9®:ô;5=d>„?•@“AxBICúCŽDEIEjEZEE›DãCçB­A$@U>:<Ò97 4â0Z-¡)°%•!b¾f îáøÿIüÇøõ‰òÍïTíë(éqçûå¼ä¹ãæâDâÕá…ácáaá}á¹áâuâúâ†ã(äÖäŒåMæç×çžè`éêÒêzëì–ìíVí‹íí†íMíÜìGìxëzêHéßçJæ~ä‹âqà.ÞàÛrÙ×™Ô;ÒðÏÊÍÌËÊvÈ'Ç"ÆgÅôÄÐÄöÄeÅÆÇ@È­ÉIËÍÏÑFÓÕé×[ÚÏÜWßÞámäÿæŒéì§î3ñ°ó3ö¢øûwýàÿ-Ä 2 _ {𤮫oN$!ì"·$p&)(×)}+ -¸.I0Ö1U3Ó4E6¯79h:´;÷<%>O?`@aAKB!C×CsDêD©KDA+òÆ –"^$&Õ'‚),+Í,i.ù/Š1 3‰4ÿ5e7Ñ8 :x;µ<ì=?)@/ABõB´CVDÓD-E_E_E4EÌD.DKC-B½@?=Ç:28O5-2½.+;'6#ÅkÊ w|¸ý%úÍö´óÜðJî÷ëçéè†æ<åä;ã€ââ£áoádáná¥áêáMâÅâOãéã‘äDåæÃæ‰çOèéÔéŒê9ë×ëcìÚì8íuí˜íŽíeí í‚ìÊëÞêÁéoèçæ4åLãDáßÃÜfÚö׋Õ%ÓÐПÎÌ²Ê É¢ÇˆÆ§ÅÅÛÄàÄ9ÅÏÅ­ÆÈÇɧÊ_ÌBÎEÐnÒ©Ô×eÙÞÛZÞåàoãÿåèë«í8ð·ò:õ³÷ ú‘üìþIœà&U ‰ ©ÇÙãäÜϲ˜i <"$Á%€'.)×*,.­/91Á2=4¶57ˆ8á93;w<¯=Û>ó?ý@ïAÌBC7D»DEVEbE;µ8ä5Ì2m/Ó+(ÿ#ÚšFô f ?Epþ×úp÷NôhñÆîkìKêsèÖæyåQäcã¤ââ³áyácáoá•áßá7â¯â1ãÍãnä$å×å æ_ç*èìè®éhêë·ëIìÂì%ílíí“ílííŸìîëëûé°è8ç‰å®ã¬á~ß:ÝÙÚsØÿÕŸÓ@Ñ ÏïÌËZÉçÇ»ÆÍÅ8ÅàÄàÄ!ŰÅ~ÆÇÖÈZÊÌáÍãÏþÑ;ÔÖïØaÛáÝcàôâ~åè ê,í¹ï<ò¾ô6÷«ùüzþÔ(p³ì  @_p€€{lW5 à!«#n%%'Ý(‚*/,Â-a/é0u2ò3l5Ù6B89ñ:7¾?È@¿A¤BgCD D ELE`EGEöDpD¤C¢BOA¾?Ü=¯;99t6j30†,É(Ã$´ i%Éz8 2ÿ„ûøåôùñEïÞì³êÌè(ç·å‹äŽãÇâ4âÃá…áeákááÍá(â•âã¬ãNäÿä¶åwæ:çèÆè†éEêôê™ë-ì©ìí_íˆí”íví*í¼ìì@ë.ê÷è~çâå äâë߬ÝRÛçØÖÔºÑtÏZÍhˬÉ,ÈïÆüÅMÅñÄÙÄÅÅUÆTÇ™È Ê³Ë„Í{Ï—ÑÊÓÖwØéÚcÝéßrâåç!ê°ì:ï¿ñCô¹ö4ù›ûþ^µB~ ­ Ö ö  øØ´ˆ!P#%Ñ&ƒ(5*Õ+y- / 0%2¨3"56þ7U9±:ô;8=a>‡?’@AuBACøC„DúD=E`ELEEŒDÎCØB’A@8>$<µ974Ã0?-„)“%}!Eú¤S ÝÓìÿ>üÃø„õˆòÌïSíë)éwçþåÅä¼ãðâLâÚááiájá‡áÁáâ|âãã1äÚä’åOæçØç¡èaéêÒêxëì‘ìÿìQíí“í{í<íÑì5ìeëiê2éÌç4æfävâYàÞÊÛ^Ù÷Ö†Ô-ÒäÏÀÍÇËüÉxÈ&Ç*ÆiÅÿÄÛÄÅtÅ*Æ"ÇTÈÄÉZË+ÍÏ-Ñ]Ó£ÕØnÚèÜkßôáäç é1ì»îCñÄóCö´ø)ûˆýíÿ>Ò A j Ф³µº¦œxX-!÷"¾$y&0(ß)…+&-¼.R0Ù1]3Ö4J6³79i:º;ó<*>L?]@aAEBCÐCmDáD4EYEREE¤DøCCØA]@œ><1:‘7œ4m1ñ-E*Y&O"Ó~,â ±™±ôünù'öóSðÍí‰ëŠéÉçFæþäòããnâíážáqáháá¶áâjâåârãä»älå+æíæ³çxè<éøé±êVëôëwììì?íxí’ííLíæìTì’ë™êtéèˆæÁäÚâÂàÞ<ÜÙÙm×Õ ÒUÐ)Î&ÌUʾÈhÇSÆÅÅàÄ÷Ä[ÅÆíÆÈwÉ ËÐÌ´ÎÆÐíÒ2Õ‹×õÙmÜëÞyá䓿#é¯ë@îÂðJóÅõ<ø­úýtÿÍcžÓ ÿ !:MQSJ4!÷Ô "f$"&Û'ˆ)6+Ñ,q.ÿ/134þ5o7Í8):u;·<ë=?)@,ABñB±CLDÍD"ETEUE$E¾DD:CB«@÷>ø<­:875 2¦.ý*"'#íªY¸ ‚ es­ýúÉö®óÞðGîúëëéèæ=å%ä<ãââ­áyáhá|áªáóáWâÉâYãîã˜äJåæÈæ‹çTèéÕé‹ê6ëÖë^ìÓì2ímíŒí†íUíûìrì»ëÉê±éWèÖæå9ã-áúÞ²ÜOÚæ×yÕÓÆÐ“Î‰ÌªÊ É¥Ç‡Æ°Å%ÅãÄðÄEÅÝÅÂÆØÇ3ɺÊsÌXÎ\ЂÒÁÔ×}ÙòÛoÞúà‚ãæ£è2ë¾íGðÊòLõÀ÷4úüÿþX©ï2d • µÔãïïç×½Ÿt F" $Ë%†'5)á*‚,.±/@1Ã2D4·5%7Š8â96;w<±=Ø>ó?ø@ìAÉB‰C0D´DENESE2EÔD=DiCSBô@P?a=";Ÿ8Æ5²2R/¸+ç'ä#À1ÝŽU 09eþÑúg÷OôañÊîiìOêxèÚæåUämã©â#â¹áƒáiáxážáæá?â¶â9ãÐãxä%åâåŸæfç+èïè¯éfêëµëDì¼ìíbí‰í„ídí í”ìÛëþêçéè#çråšã”ákß#ÝÉÚ\ØôÕ‹Ó7ÑÏéÌËVÉêÇ¹ÆØÅ:ÅïÄèÄ3ŽŒƠÇìÈmÊÌöÍøÏÒNÔ¤ÖÙzÛòÝ{àã”å$è²ê@íÊïMòÏôF÷ºù&ü‡þä4€¿ù & NhˆŒ„w_A é!´#u%.'ã(‹*2,Î-b/ó0v2ø3n5Þ6B8¢9ï:<º?Ç@¼AžBcCD™DE@EVE8EèD\D–C‹B;A§?Á=š;9[6O3þ/o,¨(±$‘ Y¸g' ÿþ$ÿûøãôöñGïßì·êÑè*ç¿å’ä”ãÔâ6âÏáŒánátá—áÖá.âŸâã·ãQäå¼åzæ@çèÉè‡éGêîê›ë$ì§ìíSí„í…íkíí¨ìì(ë!êÝènçÈå÷ãúáØß”Ý@ÛÒØnÖÿÓ«ÑlÏNÍd˨É,ÈòÆÿÅVÅùÄèÄÅ¡ÅfÆgÇ­ÈÊÈË›ÍϯÑÝÓ3ÖˆØÛsÝà„âå¥ç2êÃìJïÓñSôÊöDù«ûþn QŠ ¹ ä ÿ%%%⿎![#%Û&‹(:*ß+{-/¡0-2¬3$5–6þ7[9±:ø;5=e>‚?“@‹AqB?CíCDíD6ESE?EúDyD¿CÁB‚A÷?&><œ9ê6è3«0#-i)z%c!,æŒBù ÑÃãÿ4ü»ø„õ‚òÌïTíë0ézçæÊäÆãöâVââá™áráuá‹áÍáâŠâã˜ã4äâä–åVæçÞç¡èdéêÒêvë ìì÷ìIíyíˆíoí0íÀì%ìUëSê é¶çæUäZâHàÞ¶ÛMÙáÖ{ÔÒÚ϶ÍÀËúÉuÈ)Ç.ÆrÅ ÅçÄŃÅ>Æ0ÇmÈÒÉuË<Í1Ï@ÑvÓ¸ÕØÚÝ}ß â”ä'ç²éGìËîVñÔóSöÇø5ûœýöÿS˜ã O w —®¿ÁÁµ¡…a4!#Å$‚&7(ç)‹+,-Å.T0à1`3Ü4K6¹79n:·;ø<&>M?\@\ADBCÊCfD×D,EKEGEE—DãCøBÁAH@…>s<:s7„4N1Ø-&*A&2"»jÔ œ£ëüiùöóQðÍíëŒéÎçLæå÷ããrâúá¤ázáráˆá½á âpâïâwãä¿äså/æñæ·çyè?éøé¯êVëïëtìäì9íoí‡írí@íÖìEìë‡ê^éþçoæ­äÂâ¬àwÞ(ÜÄÙ[×ñÔÒLÐÎ!ÌNʽÈgÇ[Æ’ÅÅçÄ ÅhÅÆÇ*ÈÉ!ËãÌÍÎÚÐÓJÕ¢× Ú„Üߎá䍿5éÄëPîÕð\óÖõMø¼ú$ýƒÿÞ'qªá /FW_\V@'Ú ¦"p$'&æ'Ž)=+Ù,v.0‘13Ž46n7Ô8(:x;¸<ì=?%@+ABíB©CGDÃDEGEIEE¯D D(CB•@ß>á<:ÿ75ô1‡.ä*'#Ó“Añ¦ p Ye£ýú¾ö²óÖðKîûëíé&è“æGå'äIãââ±áƒáqáƒá³áûá^âÓâ]ã÷ãœäPå æÉæ’çQèéÒéŽê1ëÖëVìÓì%íhí‚íyíJííìbì¦ë¼ê–éHè¼æå#ãáæÞœÜ<ÚÔ×gÕÓ·ÐŒÎ|Ì­ÊɫLJƸÅ,ÅðÄýÄRÅôÅÍÆñÇBÉÓʇÌoÎpКÒÖÔ-×’ÙÜ„Þá—ã(æµèFëÏí\ðÚò^õÐ÷Fú¬üÿf¸þ>r   ÅÝò÷ýïãȦ€ J"$Ñ%';)é*‰,".»/B1Ì2F4½5'78ã99;v<²=Ø>ñ?ø@èAÄB†C&D®DEBEIE"EÅD+DVC>Bà@6?I=;‚8®5”26/œ+É'Í#¤mËzC $*]þÇúd÷GôcñÉîkìSê|èßæ†å_äqãµâ'âÅá‹áráá¦áîáJâ¼âBãÙãyä/åã妿hç-èðè±édêë±ë@ì¹ìí\í}ízíVíÿì€ìÍëéêÓéŠè ç_åƒã}áUßݲÚMØÞÕ}Ó)ÑöÎáÌËSÉêǼÆÝÅEÅõÄüÄ9ÅÔşƵÇÉ‚Ê2ÌÎ Ð/ÒeÔºÖÙÛ Þàã¨å7èÇêQíÝïaòÞô[÷Éù7ü–þóDŽÎ 5 YvŠ’š„hK" ó!½#|%8'è(”*9,Ó-i/÷0}2ý3q5ã6D8§9ñ:<º?Ä@»A—BaCD”D÷D7EJE)EÚDKD‚CxB&AŽ?«=~;9A633à/V,ˆ(š$u Aò¡T óïÿvû øÞôóñFïàì¸êÖè.çÆå—äžãØâBâ×á•ává~áááá6â¤â*ã¶ã`äåÂå~æBçèÉè‹éBêòê•ë$ìŸìíKíyí}í[íí˜ìñëë êÎèTç·åßãæá¿ßƒÝ&ÛÆØWÖòÓœÑ`ÏGÍ\˦É*È÷ÆÆ^ÅÅóÄ.űÅtÆ}ǾÈ4ÊßˮͨÏÄÑôÓFÖ£ØÛÝàžâ(å¹çFêÕì\ïçñaôáöNù¿û!þ~Ò`• É í  110 îÅ›!a#'%á&”(@*è+‚-/©002²3)5›68]9³:ù;8=b>…?@AmB9CéCvDæD,EFE4EéDiD«C°BhAå? >ï;ƒ9Ì6Ð3‰0 -I)b%D!Èz*é ¿¶Øÿ*ü·øzõƒòÊïTí#ë2é|çæÌäÐãûâ`âêá¡á}áxášáÑá%ââã›ã>äåäåXæçàç¤ècé êÎêwëì‰ìôì=ísí{ídí#í¯ììAëDêé¥çæAäEâ/àñÝžÛ;ÙÐÖiÔÒÎϯͷËúÉpÈ0Ç/Æ{ÅÅóÄÅ•ÅKÆIÇ{ÈìɇËVÍAÏ]цÓÓÕ,ØšÚÝ“ß â©ä9çÉéUìàîgñæóföÕøHû¨ý [­ë, Y … ¤ºÊÍ̾¬Žj?! #Ï$‰&@(ì)”+3-É.]0â1h3Þ4S6·79l:º;ù<%>N?W@\A@BCÈCZDÓDEDE6EûD…DÔCâB­A0@m>[<:U7k4/1¾- *%&"å¥R¾ Ž˜áübùöóMðÑí‹ë’éÑçRæ åýã&ã{ââ­áƒáyá’áÅáâzâóâ€ãäÂä{å1æöæºç{èAéöé±êQëìëqìÜì4ífízílí.íÈì6ìlëvêIééçZæ™ä©â˜àbÞܳÙG×áÔ…Ò<ÐÎÌIÊÀÈdÇbÆ•Å&ÅòÄÅzÅ%ÆÇ=È¢É5ËùÌáÎóÐÓ_Õ¸×Ú›Üߟá,ä·æLé×ë`îìðgóëõ]øÌú4ý“ÿé8~¸ï  ;T`mdaJ2 å ®"w$2&ê'™)@+ã,x.0–13–46s7×8(:{;¶<ð=?'@%ABéB£C?D»DE?E9E E›DüCCîA~@È>Éí?ö@åAÀB}C"D£DE6E;EE²DD@C+BÉ@!?0=ï:g8”5w2/}+±'°#ŽR·g5 Uþ¼úb÷@ôcñÈîlìUê€èäæåcäzã»â1âÌá”á{áŠá°áöáPâÄâIãàãä3åéåªækç0èóè¯éhêë®ë>ì²ìíRíuíoíIíñìpì»ëØêÀéuèöæIåkãjá?ßøÜ Ú6ØÒÕjÓ ÑæÎÝÌúÊSÉèÇÂÆßÅNÅÅÅLÅáŲÆÉÇÉ—ÊIÌ!Î&Ð?Ò€ÔÍÖ1Ù¢ÛÞ¥à,ã¾åIèÚêfíìïtòðôi÷ÜùCüªþýX˜Ý @ h˜ž¢›ŠvR- û!Ç#ƒ%A'ï(œ*>,Ú-n/þ0‚24v5æ6I8¥9ø:8·?Æ@³A˜BXCD‹DïD,E=EEÉD;DpCcBAw?“=e;æ8)63Ì/2,u(x$a %Û= äßÿlûøÝôìñKïÞì½êØè2çÎåä¦ãÞâLâÝážáá‚á¬áãáBâ«â/ãÁãbäåÆåƒæDç èÊèéAêòêë"ìœìþìGímíríQííŠìâëëúé¶èCçŸåÉãÏá©ßmÝÛ²ØDÖåÓÑWÏ=ÍWË¢É+È÷Æ ÆeÅ ÅÅ<ſŊÆÇÓÈGÊóËÄÍÀÏ×ÑÔYÖ»Ø'Û§Ý#à´â;åÎçZêèìoïùñrôñöbùÌû2þß+l¤ × ø ,<<;(ôÑ£!j#0%è&œ(H*í+Š-!/­082µ3.5ž68c9²:ý;4=g>}?’@‚AoB1CäCpDÛD#E9E(EØD[D™CšBVAË?ö=Ô;j9°6µ3o0ì,3)@%1!ø¶b× ®«Ëÿ#ü®øvõòÇïXí"ë5é„çæ×äÔããfâòá«á‚á‡áœáÜá,â˜âã£ãCäìä£å]æ çãç¥èféêÐêrëì…ìëì:ífítíUíí ìì/ë1êôèçñå(ä0âàÛÝŠÛ(Ù¼Ö[ÔÒÃϤͲËôÉrÈ/Ç5Æ€ÅÅüÄ/Å¢Å^ÆZÇÈüÉ¡ËfÍ]ÏoÑÓëÕ>Ø´Ú#ݯß-âÄäIçÞéfìóîwñûóqöìøPû¿ýo¶ý5 i ¯ÉÒÝÔ˶™sH!#Ö$’&G(ó)œ+7-Ó._0ì1i3å4U6¼79o:»;û<&>L?V@YA:BC½CXDÆDE6E,EëDtDÁCÐB™A@W>@<ê9;7N41Ÿ-ò)&ÿ!Ί@ë° {u‹ÙüYùöóOðÍí‘ë’é×çWæåä-ãƒââ¶á‹á‚á™áÎáââûâ‡ã"äÊä€å6æýæ¹ç€èAé÷é¯êRëåëpìÓì-í^ípí`í!íºì%ìZëcê6éÓçEæä”â„àIÞÜšÙ9×ÏÔtÒ2Ð ÎÌHʸÈlÇaÆ¡Å*ÅÅ ÅŠÅ7Æ%ÇRÈ´ÉKËÍøÎÑ0ÓuÕÎ×6Ú®Ü,ßµá?äÏæ[éëësîüð}óøõoøÜúDý¢ÿøGŠÉú & E`mvshW;î ¶"$:&ó' )F+ë,~.0š1!3™4 6x7Ö80:x;¼<ë=?"@'ABæBœC9D³DE4E.EûDŒDéCÿBÚAh@°>°<]:É7â4¼1Q.ª*Ñ&É"£aÅ‚ N <M‘ýú¸ö¦óÖðJîþëóé.è›æUå4äWã¤ââÈáá„á“áÅá âqâßânãä¬äXåæÑæ—çXèéÔé‹ê/ëÍëPìÅìíVíoíaí0íÑìAì‡ë“êtéè–æÚäøâëàºÞtÜÚ°×EÕìÒŸÐvÎpÌžÊɨǒÆÃÅ>ÅÅÅsÅÆöÆÈnÉùʵ̙ÎÐÇÒÕ[×»Ù4Ü®Þ8áÁãNæÝèkëöí}ðó}õô÷dúÌü,ÿ„ÔZŒ ¹ Üööܹ“ ]"'$å%œ'L)õ*—,1.Å/N1Ô2Q4Â5378í98;{<±=Ø>ì?ô@áAºB{CDœD÷D*E/EE£D D1CB¸@?=Ð:R8t5_2ÿ.c+—'•#u:ì¡V" Kþ³ú`÷9ôeñÄîqìWê„èêæ“åjä‚ãÃâ8â×ášá„á’á·áÿáWâÌâPãåã‡ä8åïå­ænç4èñèµécêë¯ë5ì°ìíKíjíeí;íãì_ì¬ëÅê«ébèßæ6åUãSá*ßåÜ‹Ú&ؾÕ_ÓÑßÎÓÌ÷ÊPÉëÇÃÆèÅUÅ ÅÅ^ÅîÅÇÆÚÇ'É­Ê[Ì:Î8ÐZÒ’ÔåÖEÙ¸Û5Þ¶àFãÌåbèèê|íýï„òõw÷ïùQü¸þa©é! L rŽ¡«­£–}]4 "Ë#Ž%G'ô(§*A,å-q/1†24y5ê6I8ª9õ:=¹?½@´ABSCüC‚DæD E2E E¾D%DbCJBA^?~=H;Ñ86ÿ2¨/,R(f$? ¿})ø ÐÛÿiûÿ÷ÚôìñIïáì¿êÞè8çÒå¦ä¬ãéâQâèá¦áŠáŒá±áíáIâ²â7ãÇãhäåË凿Kç èÏèŒéAêñêëì™ìõìBí`íkí>íûìwìÓëòêåé¤è-ç‰å´ã¹á”ßZÝþÚŸØ6ÖÓÓƒÑIÏ7ÍSËÉ.È÷ÆÆkÅÅ ÅIÅÓŖƤÇäÈ^ÊÌÜÍÒÏðÑ!ÔrÖÎØ?Û¶Ý=àÂâSåÞçmêøì„ïò‡ôÿöqùÞû@þšð5{± â &9EIB6ج!s#7%î&¦(L*ö+-(/²0>2·355ž68d9³:ÿ;4=e>?‹@„AcB1CØCjDÑDE,EEÉDJD‡C‡B@A¶?Û=½;O9–6š3R0Ó,)+%!äOÉ ž¡¿ÿü§øtõòÆï[í$ë:éŠçæàäÛã ãnâüá±áá‹á¨áâá6âœâã¨ãIäóä£åfæçæç§èeéêÎêmëì}ìçì2í\íjíKíí—ìïë#ëêâè|çÚåäâàÈÝvÛÙ­ÖLÔòѻϛͮËñÉpÈ4Ç7Æ‹Å%Å Å;ųÅnÆnÇ¢ÈʱË~ÍpυѳÓÖVØÆÚ=ݽßGâÐäcçìé|ìï‰ñ ô…ö÷ødûÊý$|Å D s œ ¼ÐâááÕ¾£|Q!#ß$š&L(ÿ)+A-Õ.f0ï1o3ç4X6Á79t:»;ù<*>E?Z@PA;BC»CLD¿D E,EEßDbD²C»B…A@?>*<Í9#734ú0ˆ-Ð)õ%á!¸v&Þš qe„ÎüVùöóLðÒíë™éÛç]æå ä7ãˆââºá–á‰á¤áÕá$â‰âãã'äÒä‚å<æþæ½çƒè@éúé¬êOëåëhìÑì$íUígíSíí«ììLëNê&é¼ç3æjä‚âkà8ÞëÛ‹Ù%×ÁÔiÒ$ÐÎ ÌEʹÈlÇfÆ©Å3Å Å/Å–ÅJÆ5ÇfÈÈÉ`Ë"ÍÏÑGÓ‹Õâ×LÚÀÜAßÉáRäáæoéüë‡î ñŽó ö~øìúSý®ÿ QšÖ 3 Plx|s`C!õ À"‡$C&ø'©)L+ï,‡.0£1#3 4 6}7×83:x;¾<ê=? @"A BÞB˜C1D©DþD%E#EêDDÕCîBÆAP@œ>•ð?ì@ãA²BxCD•DìD E"EûD’DûCCÿA¡@ñ>þ<¾:18^5B2ã.J+x'}#Z#ÔŒC ø>þ°úU÷9ô`ñÅîpì]ê„èõæ’åwä…ãÍâ@âÞá¤áášá¾á â^âÕâUãíãä;å÷宿tç4èõè²édêë©ë4ì©ìíCí`í[í/íÔìSì—ë·ê–éMèÎæåCã;áßÑÜwÚØ­ÕPÓÑ×ÎÉÌóÊLÉëÇÆÆíÅ]ÅÅÅjÅÆÖÆíÇ<ÉÀÊsÌLÎRÐjÒ­ÔöÖ]ÙÍÛHÞÏàVãäårèþêŒíð”òõ†÷ÿùaüÈþr³û* \ }𬶏¯ ‡g? "Ø#“%O')§*N,ç-x/ 1Š2 4~5í6N8­9ö:@´?À@®ABNCöCzDßDE%EE©DDIC) ã³!|#>%ù&ª(W*ú+–--/º0?2Á335¨68i9¶:ý;9=a>?‰@€AaB)CÖC`DËD E#E E»D;DsCuB,A›?Ë=ž;99z6370¹,ø(%û Ɉ8ð· Ž’µÿü¢ønõ{òÈïXí)ë<éŽçæáäçããwââºá–á”á±áéá?â¥â#ã±ãOäøä¬åhæ%çéç©ègéêÍêlëÿëyìàì*íVí\íAí÷ì‡ìáëëêÑèbçÉåûãâìß³Ý_ÛÙ˜Ö=ÔäѫϔͥËïÉmÈ6Ç;Æ’Å.ÅÅLžŃÆ}Ç·È'ÊÈ˔͆ÏÑÉÓÖpØ×ÚVÝÐß^âåäuçêìï›ñô•ö ùtûÚý5‰×T  ¬ ÅâæõçâÈ­‡X!%#ç$¢&V(*ª+C-â.f0ù1q3î4]6Ä7"9t:À;÷<,>C?X@NA6BC´CFD¶DEEEÍDSD C¦BpAð?#><°9 74â0h-¸)Õ%É!\Lj _WvÆüKù ö óLðÏí”ëšéÞçdæåä9ã”ââÆáŸáá®áÛá-â’âã—ã-äÙä‡åBæçÁç…èAéúé¬êKëæë^ìÏìíPíYíJíí¢ìÿë>ë:êéªçæWäjâWà ÞØÛtÙ×­ÔZÒÐ÷ÍÌ?Ê·ÈnÇjƯÅ?ÅÅ>ŦÅZÆIÇxÈÝÉtË:Í$Ï2Ñ]Ó¡Õø×dÚÔÜ[ßÙákäóæƒéì–î"ñóöøüúcý¿ÿb©ß < `v†Š‹|kM*ÿ É"$K&(®)W+ô,Ž.0¨1)3£46|7Ý85:{;½<í=?#@A BÙB’C*D DõDEEÚDpDÄCÚB±A:@…>yë?î@ÙA´BlCD‰DçDEEåDˆDæC CîA†@Ü>å<£:8C5#2É.*+b']#EÂu1ÿ èú5þ¥úO÷5ô_ñÄîsì\êŒèöæœå{äãÔâHâæá¬á–á¡áËá âlâ×âaãñã–ä@åûå´ævç8èöè²éfê ëªë-ì¤ìûì:íVíOí!íÈì?ìˆë£ê‚é;è´æå+ã&áýÞ½Ü`ÚؘÕDÓóÐÍÎÃÌìÊLÉêÇËÆóÅeÅ"Å*ÅzÅÆéÆÈPÉÕʈÌdÎfЃÒÁÔ×qÙåÛ^ÞãàmãöåˆèëŸí#ð§ò%õ™÷úrü×þ-~Ç; h ‰¨¶ÄÀ½¨’qH "Þ#%W')²*O,ð-~/1’2 4„5ï6R8­9û:=·?¹@®AˆBHCðCpDÔD EEôDšD D5C*BÎ@3?J=;›8Ò5Å2r/ä+ (*$ Ü—LÑ ´¾îþYûò÷ÏôêñDïãìÄêâèEçÝå±ä»ã÷âbâøá·ášážáÁáâTâÅâBã×ãtä åÕåæPçèÑèéBêëê‹ëìŽìèì2íNíUí*íØì`ìªëÓê¼é{èç\å‹ãŠálß,Ý×ÚzØÖ¶ÓhÑ5Ï&ÍEË™É-ÈþÆÆ€Å'Å+ÅaÅõŹÆÈÇ É‡Ê1ÌÎÿÏÒSÔ—ÖÙfÛåÝdàíâ{åè–êí¨ï+ò©ô!÷’ùÿû]þ¼ V–Ë þ AP]`WK3ì½!†#F%'±(^*,œ-4/¾0G2Ã3;5§68g9º:þ;9=b>~?ˆ@{A`B!CÑCVDÄDÿDEúD¯D'DbCaBAˆ?­=‰;9a6`30—,ä(î$æ ­q"Þ¡ ƒ‚«ÿ ü˜ømõvòÇïZí(ëCéç$æéäêãã~â âÂážáá¶áöáBâ¯â)ã¸ãUäÿä°åkæ+çéç¯èdé#êÇêoë÷ëwì×ì#íKíRí3íëìvìÒëüêöéºèPç®åéãîáÖߟÝJÛñ؈Ö+ÔÙџό͞ËëÉpÈ3ÇEÆ—Å7Å%ÅUÅÒÅ”ÆÇÌÈ;ÊÝ˫͛ϵÑÛÓ0Ö~ØöÚdÝìßmâþä…çê¡ì(ï¯ñ,ô§öù†ûèýF—ä$_ Ž ¶ Öéøú÷ç׳’b!*#ó$¦&a(*°+L-ã.q0û1w3ó4^6È7$9w:¿;û<&>H?Q@OA0BýB®Cø;˜9í6û3Ã0N-œ)º%¯!„Dý°y OHn¸üHùöóNðÌí™ëœéæçfæ'åäDãœââÔá áŸá²áåá6â–âãœã5äÞäŒåEæçÅç…èDéùéªêKëÞë\ìÉìíGíQí9íüìŒìôë)ë(êüè•çæ=äXâ=àÞÀÛdÙמÔMÒÐîÍÌ;Ê·ÈpÇoƵÅIÅ!ÅJŸÅhÆ^ÇŒÈòÉŠËNÍ9ÏIÑsÓ·ÕØxÚëÜpßíáäçšé ì«î2ñ°ó-öŸø ûsýÎÿ%pµñ! L j‚’”–…vV6!Ø"’$W&(¶)^+ø,•.#0ª123£467à83:€;º<í= ?@ABÓBŒC"D™DèDEEÑD\D³CÈBšA&@l>a<:t7“4i1þ-X*ƒ&x"ZÕŠK  +uýðù©öœóÔðJîìê6è³æaåMämãºâ9âÞáªá á«áÝá$â‚âüâ~ãä¹äkå!æáæç`èéÕé‹ê(ëÄëCì³ìí=íNíBíí¥ììQë]ê7éÞçTæšä·â§à~Þ2ÜÜÙw×Õ¼ÒÐVÎ]Ì‘ÊþÈ­ÇÆÖÅYÅ&ÅAÅœÅHÆ%ÇSȦÉ<ËòÌÛÎáÐÓGÕ™×ÿÙtÜìÞváþã‰æé£ë,îµð3ó±õ&ø”úüüXÿ²üG¶ Ý +20&ûÔ¯ w"@$ý%²'b) +©,C.Ö/^1â2^4Î5<7™8ñ9=;<¯=Ø>æ?í@ÖA­BiCDƒDØD E EÛDwDÔCûBÔAv@Â>Ï<Š:û7)5 2­.+C'H#*ï­a ñ Úñ(þ¤úE÷7ôYñÉîrìaêèüæ¡å‚ä—ãÚâRâîá¶ážáªáÐáâqâàâfãøãœäGåþ叿zç9èùè±éfêë§ë)ìžìöì.íQí@íí¶ì2ìyëêqé%è¡æóäãáîÞ¤ÜRÚî׌Õ2ÓìÐÀξÌçÊJÉìÇÌÆüÅkÅ/Å6ÅŠÅ ÆüÆÈgÉæÊ ÌwÎ~ИÒ×Ô$×ˆÙøÛrÞ÷à€ã æšè"ë²í3ð»ò3õ­÷ú…üãþ=ŒÒF u —±ÆÊÑÁ·™|M ""ä#¨%\')¶*[,ñ-‡/1˜24‹5î6Y8¬9ý:>¶?¶@ªAƒBDCæCkDÊDEEäDŒD÷C%CB¸@ ?0=;8´5°2S/Í+($öË|=ðÄ ¦±æþNûî÷ËôèñEïæìÆêèèIçâå»äÀããiââ¿á£á¥áÌáâbâÈâMãÜãzä'åØå–æRçèÓèéBêìê…ëìƒìèì$íIíHííÐìIì¡ë½êªéhèíæIåtãuáXßÝÈÚbØÖ¦ÓYÑ-ÏÍCË—É)ÈÇƆÅ6Å1ÅuÅÆÎÆÙÇ!ÉœÊFÌÎÐ4ÒbÔµÖÙÛ÷ÝzàãŒåè¦ê0í»ï9ò¾ô.÷¦ù üqþÆa£Ù ,J\hkaW9óÇ!#O%'º(d*,£-7/Ç0H2Ì3:5®68l9º:<6=c>{?†@yA[BCËCND»DôDEíD DDRCJBAo?–=o;9E6H30€,Ã(Ù$È šWÈ• o{ÿü“øfõwòÆïZí/ëBé˜ç%æóäïã%ã‡ââÏá£á¨áÀáûáLâµâ1ã¿ãZäå³åræ,çïç­èhéêÉêiëõërìÑìíBíGí(íÜìiì¿ëìêâé¨è9çžåÎãÞá¿ßŠÝ9ÛÜØyÖÔÌіς͚ËçÉoÈ8ÇHÆ ÅAÅ0ÅdÅãţơÇáÈOÊòËÀͱÏÇÑøÓ>Ö›ØÛ|Ýþß„âå›ç'êµì9ïÁñ<ô¹ö'ù—ûöýU¤ó0o ˜ à áõðỜi!7#ô$¶&`(*²+S-ì.r02y3ø4c6Ë7%9{:¾;ý<'>E?Q@IA/BöB¨C8D¡DðDEöD³D/D~C}BIA¿?ø=Þ;}9Ö6Ý3ª01-‚)¡%”!n,èŸe A<`µü<ùöóMðÑí—ë¤éæçoæ+å"äIã¤â)âÙá¬á¤á¼áíá>â âã¥ã:äää’åLæçÈç‰èCéüé§êJëÚëZì¿ì í:íGí/íìì€ìâëëêçè‚çîå,ä=â+àúÝ©ÛUÙìÖ‘Ô>ÒÐéÍöË8Ê·ÈpÇuƼÅQÅ/ÅWÅÇÅ|ÆnÇŸÈÊŸËdÍPÏ_чÓÏÕ#ØÚÝßâ‘äç¨é7ì¼îDñÁó<ö°øû‚ýÞÿ3€À + \ tš¤’`?!Þ"$^&(¾)c+-š.(0³123¬46†7ß8::~;¾<í= ?@ABÏB‡CDDÞDEüD¿DMDŸCµB„A@O>N<õ9^7t4M1á->*c&c"=¼u8  jýêù öóÍðNîìê<è¶æjåRäuãÂâAâæá¶á£á¹ááá/â‰âã†ãäÂänå(æâæ¢çbè éÕéˆê(ëÀë?ì­ìüì5íEí5íúì–ìì?ëLê"éÊç@æ„ä â’àgÞÜÈÙe×Õ¯ÒqÐJÎZ̈ÊɫǡÆÝÅcÅ0ÅNÅ­ÅUÆ=ÇbÈ¿ÉLËÍíÎøÐÓYÕ²×Ú†Ü߇áä æ*é¸ë?îÇðEóÅõ4ø§ú ýiÿÀO“¿ í &6=;1ݹ ~"J$&¾'g)+®,M.Ù/e1è2_4×5:7Ÿ8ó9?;€<¯=Õ>è?æ@×A¤BfCûC{DÎDÿDüDÏDbDÆCãBÄA\@®>²è÷è¶éaê ëŸë(ì—ìíì*íBí:íí­ììjëyêbé èæÙäãùàÕÞÜ?ÚÙ×ÕÓâгθÌáÊIÉéÇÕÆüÅ{Å4ÅGÅ•Å4Æ Ç(ÈuÉ˰̑ΑаÒìÔ;×ŸÙ Ü‹Þ á•ãæ¬è9ëÂíGðËòDõ¿÷,ú’üöþIà S € ¦¼Ñ×ØÐ¾¥ƒZ ("ï#®%e')¾*`,ú-‹/1š24Œ5ó6\8­9;?²?¶@¦A~B@CßCaDÃDòDEÙDzDèCCýA¦@?=é:b8ž5Ž2;/¯+é'÷#߬l"⯠—¥ÛþGûç÷ÈôåñFïæìËêéèPçèåÀäÊããtââÉá«á®áÓáâeâÔâQãâã„ä&åä哿]çè×èéBêèê…ë ì…ìÜì í;í=íí¾ì<ìŽë©êšéPèÜæ0å_ã]áDßÿÜ´ÚPØñÕ˜ÓNÑÏÍ8Ë—É+ÈÇ&ÆŽÅ@Å>Å…ÅÆâÆëÇ6ɱÊ[Ì4Î*ÐIÒzÔÉÖ(Ù“ÛÞàã¢å+è¾ê@íÎïMòÊôE÷±ùü|þÙ'q±å  9VistqZI$þÑ!’#Z%'Á(n* ,­-z?†@rAYBCÃCID¬DíDþDâDDD?C5Bî@W?~=W;å8,6)3ç/`,©(½$® Aù´„ ^l•ÿøûøbõròÇïZí3ëDéŸç*æûäöã.ã‹â âÒá±á®áÉáâTâ¾â9ãÅãcäå¾åræ2çðç°èiéêÇêgëòëjìÍìí<í:ííÌìZì­ëÜêÌé•è%ç„å½ãÃá«ßtÝ$ÛÈØhÖ Ô¼ÑÏwÍ—ËäÉnÈ;ÇNƧÅMÅ9ÅvÅïŸƳÇõÈdÊÌÖÍÇÏßÑ ÔVÖ°ØÛ‘Ýàšâ å³ç:êÇìNïÑñOôÊö8ù¦ûþb·ýBx « Ì ðÿ ÿçÊ¡v!<#%¹&o(*¾+W-ð.}02‚3ù4h6Í7)9{:Á;û<&>F?M@HA*BñB¢C,DŸDÝDEåD¢D"DgCmB/A«?Û=Ç;a9¹6Ã3‹0-e)„%|!RЋS .0R­ü6ùþõóHðÓí™ë¨éëçvæ/å-äPã­â2âßá¹áªáÇáõáEâ¨âã«ãCäçäšåMæ çËçŠèDéýé¥êIëÕëUìºìí3í;í$íÝìrìÑëëêÑèmçØåä(âàåÝ”ÛBÙÚÖÔ/ÒöÏÞÍñË2ʸÈoÇ{ÆÃÅZÅ;ÅeÅÖÅŽÆÇ³ÈʶËzÍgÏuÑŸÓåÕ<Ø£ÚÝ—ßâ¨ä-çÂéCìÕîRñ×óKöÄø*û”ýîÿ@Ð = c †™¨­©‰kG!æ"§$e&(È)h+ -ž./0¹133µ46Š7â8<:;¿<ì= ?@AúAÏB{CD…DÕDøDíD¯D>DŽCŸBrA÷?;>1<Ý9A7\4.1Ç-*L&E"&è©_& þô`ýàùžö–óÎðLîìêAèºæpå[äzãÍâFâðá¼á®áÁáêá5â“âãã$äÅäxå'æìæ çhèéØé‡ê%ë¾ë9ì¨ìöì+í;í'íîì†ìóë.ë7êé´ç+æmäŠâ}àOÞ Ü¯ÙW×òÔ¢ÒdÐBÎQÌ…ÊþȬǧÆáÅmÅ=ÅZŽÅeÆQÇsÈÕÉaË"ÍÏ Ñ6ÓqÕÈ×,ÚÜߟá&䵿<éÎëOîÛðVóÔõHø´úýwÿÑbœÏ ú 5AIG='çÁ Š"Q$ &Æ'n)+¸,N.ã/i1ì2g4Ö5C7ž8ø9?;<®=Ø>â?è@ÏA¢B^CõCrDÆDòDòD»DYD®CÕB«AF@•>›°?±@¥AwB:CÙCWD»DåDöDÆDmDÒCCçA‘@ì>=Ì:H8„5o2"/‘+Ë'ß#ÔU Ï Š•Ôþ;ûå÷ÀôçñAïììÊêðèSçîåÈäÑã ã~ââÓá°á»á×áâiâßâTãíã…ä1åäåœæ[çèÙèŒéDêæêë ì|ìÖìí1í3íí°ì-ìzëšê„é;èÈæåIãIá+ßìÜ Ú>ØàÕ‰Ó@ÑÏÍ5Ë“É-ÈÇ,Æ•ÅKÅLÅ’Å"ÆñÆÈIÉÆÊsÌFÎEÐ[Ò”ÔàÖ:Ù®ÛÞ§à)ã¶åDèËêXíÞï_òßôR÷Åù,üŒþè4‚»ö ! G`w~xhQ1 Ö!¡#\%'Æ(u*,±-D/Î0Y2Í3I5±68o9¾:<8=a>z?€@sAQBC½C=D©DÞDôDÒD€DõC*C%BÓ@C?c=>;É86 3Í/C,(¡$– f+ã¡r Q]‹ÿðû†ø`õmòÊïYí5ëJé¡ç3æÿää4ã˜â"âàá´á¹áÒá â]âÆâ>ãÏãgäåÂåuæ7çóç¯ènéêÉêcëîëgìÄì í+í6í íÁìIìëÈê½é}èçqå¢ã±á”ß]ÝÛ±ØZÖùÓ²ÑÏpÍËâÉmÈ@ÇOƱÅWÅHÅ‚ÅÆÇÆÉÇÉ|ÊÌîÍÝÏõÑ$ÔkÖÈØ1Û©Ý'à¯â6åÆçLêÛì_ïäñaôÚöLù³ûþpÅO‡ ¶ Ü ùõЮ{!G#%Â&t(*Å+^-ö.0 2‡3ý4j6Ñ7+9~:Â;û<&>D?L@EA&BëBšC*DŽDÚDíDÛD“DDUCZBA•?Ä=«;L9™6©3p0ù,J)j%_!<ýºx? $I¤ü,ùþõýòKðÑíë¨éôçuæ>å*ä_ã²â:âëá½á¶áÎáâKâ±â'ã¯ãMäéä¢åQæçÎçŒèFéûé¦êFëÑëRì¯ìí#í5ííÑìbì¿ëôêïéÁèUçÆåüãâþßÎÝ‚Û+ÙÊÖqÔ ÒìÏÔÍìË/ʶÈrÇÆÉÅeÅFÅuÅäÅ Æ“ÇÈÈ0ÊÊËÍ}όѶÓüÕPغÚ/Ý©ß5â¶äHçÐé[ìâîiñäóaöÐø>û¡ýýÿQ›á J p ¨±»±ª’vN&!ê"²$k& (Ì)q+-¦.40¾193¸4 67æ8<:‚;½<í= ?@A÷AÉBtCD{DÌDëDàD¡D,D}CŒB[Aá?"><Ã9&7>41¨-*/&+" Ñ’K îçYý×ùšö’óÍðMîì êEèÁævåbäƒãÒâRâ÷áÇáµáÈáôá>âœâã–ã+äÌä{å/æìæ§çgè éÚéê(ë¶ë9ìŸìïì!í1ííâìuìåëë&êúè¡çæZäsâfà=ÞóÛ¤Ù<×ëÔÒ\Ð8ÎHÌ…ÊûȰǩÆêÅtÅKÅeÅÏÅtÆeLJÈêÉwË7ÍÏ&ÑHÓŠÕÝ×AÚ¶Ü.ßµá9äËæOéàëeîéðlóâõZøÃú,ýˆÿÝ+oªÜ  #DJWQG2òÊ “"X$&Ê'y) +½,W.ç/o1ò2j4Ú5E7£8÷9D;}<³=Ò>å?â@ÌAŸBTCóCeD¿DãDæD«DJD›CÃB”A3@y>…<8:®7Ò4¶1W.¾*ð&ø"Ùªc&â À ®É þ†ú:÷'ôXñÄîyìiêè ç´å—ä¬ãõâhâ âÍá¼áÀáíá-âŠâ÷â|ã ä®äWå æÆæ‚çBèüè´éeêë›ë ìˆìåìí1ííïìŠìì@ëYê4éèçaæ°äÓâÎà¨ÞhÜÚ·×ZÕÓÈОΫÌÔÊGÉìÇØÆÆ„ÅRÅ[ŸÅRÆ2ÇOÈ¡É*ËÝ̽οÐÝÒÕd×ÍÙ8ܵÞ8á½ãIæÓèaëæíqðêònõÜ÷Oú³üÿj¸þ;p › ¼ÚãòìæÓ¹–n :"$¾%w'#)Î*m,.–/&1¡2#4’5ý6^8¶9ÿ:D®?²@œAvB2CÒCQD­DÝDçDºD\DÄCëBØAv@×>ç<±:18d5U2/v+±'Á#ª{?õ½Š |‰Èþ4ûÜ÷ÀôßñGïåìÒêòèWçöåÍäÙãã‚ââÙá¼áÀáäáâxâáâ`ãñã‹ä9åå壿]çèÖè“é<êêê{ëìxìÎìí,í"íüìì ìië‰êné,è­æå2ã3áߨ܋Ú*ØÓÕuÓ7Ñ ÏÍ0ËÉ-È Ç/ÆŸÅUÅYÅ¡Å3ÆÇÈ]ÉÛʉÌ]ÎYÐtÒ©ÔöÖRÙÁÛ8ÞºàAãÉåWèàêkíîïvòéôj÷Ðù?üþôJ‰Ï / Uk……tZ; á!§#i%'Ñ(y*,µ-K/Ô0[2Õ3K5´68o9Ã:<9=a>w?~@rAHBC®CB?J@BA!BçB”C D‡DÐDßDÒDDDBCFBA~?¬=”;-9„6Š3W0Ú,0)M%H!ê g, >—ü+ùòõóFðÑí¡ë©éøçæ=å9ä_ã¾â@âôáÅáÀáÓá âRâ¸â/ã¶ãPäôä¡åYæçÑçèGéùé¨ê@ëÒëIì®ìõì!í&í íÃìRì³ëßêàé«èBç°åèãþáçߺÝnÛÙ»Ö^ÔÒßÏÌÍäË/ʱÈ{Ç~ÆÔÅoÅRÅ‚ÅõŰƦÇÛÈCÊß˧͒ϢÑËÓÖdØÒÚ?ÝÅßBâÐäYçâépìôîxñúómöãøNû¯ý_ªï% V  œ²À¿³›‚V-!ô"»$s&((Ñ)z+-¯.70Ä1>3º4&6Ž7é8=:ƒ;À<ì= ?@AöAÀBsCDvD¿DàDÕDDDgC{BFAË? >ý;­97'4÷0-é)&"ñ¼|8 ÝÚýLýÕùö“óËðKî ìêMèÄæ}åhäŠãÚâZââÍáÁáÌáâBâ¤âãœã1äÒä‚å1æòæ§çkè!éÚé‚ê%ë³ë5ì˜ìéìí'ííÑìjìÒë ëêåèçýåEä]âRà(ÞáÛŽÙ0×ÓÔ‰ÒJÐ3ÎAÌÊùȴǬÆòÅÅRÅxÅÛŇÆvÇšÈüÉËJÍ2Ï:Ñ_Ó¡Õð×XÚÉÜDßÊáMäÝæcéóëvîýðzóõõjøÕú9ý™ÿè>x¹ê  5JYaYS;#üÒ ›"c$&Ò'€)&+Å,\.í/s1ù2k4â5G7¥8û9A;‚<²=Ñ>ã?Þ@ÉAšBMCíCZD·DÙDÖD£D3D‘CªB…A@g>h<":’7·4ž1:.£*×&Û"ÆS Ø « ¢¾þú2÷$ôUñÆîzìkê¢èç½å›ä¶ãúâsââÙá¿áÎáñá8âŽâã~ãä¯äaå æÍæ…çBèé²écêë˜ëì†ìÙìí'ííâì|ìõë/ëHê"éÒçOæšä¾âºà‘ÞWÜþÙ©×GÕûҵОΚÌÙÊ@ÉðÇÜÆÆÅZÅjÅÆÅcÆEÇ`ȵÉ=ËôÌÑÎÖÐòÒ1Õ{×äÙKÜÌÞIáÓã[æéèpëûí~ðóyõñ÷[úÃü$ÿvÇ H} § Éáõ÷üíÞßx @" $Ä%'*)Ô*s,.œ/*1¨2&4—57a8¸9;F«?°@™AtB)CÌCID¤DÒDÛD¬DKDµCÖBÅA_@Â>Í<š:8M582ë.W+˜'¦#“b(âª{ l|¿þ,ûÙ÷¸ôáñBïììÐêøè\çüåÓäàããâ!ââáÄáÊáëá'ââèâhãùãäAåé妿cçèÞè‹éDêâê}ëìoìÌìí ííåì™ì ì\ësê^éè™æôäã!áÿÞÃÜvÚؽÕnÓ#ÑÏùÌ1ËŠÉ/ÈÇ3Æ«Å]ÅhÅ®ÅCÆÇ'ÈqÉïÊŸÌqÎsІÒÂÔ ×iÙÕÛPÞÌàWãÝåhèöê{íðòõu÷äùLü¬þW—Ü > ^yŽ’šŠ€bD æ!´#k%*'×(€*$,¹-R/Ù0_2Ú3M5º68v9À:<9=_>z?x@pAEB C«C1D‘DÍD×D¹D_DÓCCúA©@?3= ;”8Ü5Ô2•/ ,Z(j$d 3ÿµ€J 7CuÿàûzøWõkòÄï^í7ëUé§çDæåäCã¥â9âêáËáÆáåáânâÒâPãÙãuäåËåæ?çöç¶èkéêÆêZëëëXì½ì÷ìíí÷ì£ì+ì|ë¥ê”éXèäæHåwã…áhß5ÝéÚØ6ÖÛÓ˜ÑiÏcÍËàÉkÈEÇ]ƾÅlÅ_ÅŸÅ$ÆèÆïÇ/É£ÊHÌÎ Ð"ÒOÔ˜ÖôØ\ÛÓÝSàÖâ`åìçtêí„ïòƒôûölùÕû7þß-g£ Ï ô  4/-è½!X#%Ñ&ƒ(/*Ï+n-þ.0235p6Ø7.9‚:Â;þ<%>??K@á?Ü@ÄA•BICâCVD¨DÐDÉD’D'DyC›BnA@Q>M< :u7ž4}1#.„*½&À"¬v;ø ž ’±ùýxú/÷ ôTñÅî~ìmê¦èçÂå¢ä¾ãã{ââàáÊáÕáúá@â–â ã…ãäµägåæÐæ‡çHèþè¶é^êë“ëììÓìíí íÑìtìÝë%ë0êé¾ç6æ‡ä¥â¥à}Þ@ÜîÙ’×:ÕçұЉΟÌËÊEÉîÇ߯ƘÅfÅxÅÖÅrÆYÇrÈÊÉUËÍìÎåÐÓAÕ™×òÙhÜÜÞdáäãræüèëîŒðó‰õøjúÖü1ÿ‡×VŒ ± Ùì÷ê̪ L"$Ð%„'3)Ú*{,.¨/'1µ2$4Ÿ57c8º9;E¯?¥@AhB)CÁCCD–DËDÊDŸDºt?{@gADBC§C'DŠD¿DÍDªDODÃCóBæA”@ü>=ð:|8¾5¼2v/ó+9(T$F ä¤h; (2nÿÔûuøPõjòÄï_í;ëVé°çEæåäIã±â<âøáÏáÓáéá'âtâÚâWãàã{ä"åÌ凿?çúç·èléêÂê\ëáëYì°ìóìííèì˜ììmë’êéCèÑæ.åfãjáWßÝÕÚ}Ø#ÖÐÓ†ÑcÏUÍËÙÉmÈHÇ`ÆÈÅvÅkůÅ1ÆüÆÈCɸÊ\Ì/ÎÐ;ÒcÔ²ÖÙuÛèÝfàîâsåèˆêí˜ïò–ô ÷zùçûEþŸñ8x± Ú 49A4+ óÅ›!^#"%Ù&(3*Ú+q-/”02—35w6Ú719„:Å;ü<(>>?F@;ABßB…CDwDµDÌD¯DfDÞCCBÙ@O?}=_;û8I6W30¤,ø(%!ñµ|: ñù(‡üùëõùòFðÓí¤ë±éè‰æMåDärãËâTââÛáÍáçáâeâÆâ?ãÂã_äýä®åaæç×ç“èFéÿéŸêAëÇëBìŸìèì ííîì«ì2ì‘ë½ê¸éƒèç…å¼ãÐá¿ßÝHÛòØ–ÖDÔöÑÌϸÍÛË&ʲÈ~LjÆåÅ€ÅlÅÅÆÔÆËÇÉnÊ ÌÕÍ»ÏÑÑ÷Ó@Ö’ØüÚmÝìßnâøä€ç ê•ìïžñô’öùoûÏý,|Ç @ r — ´Ê×Ù×ij’m>!#Ê$„&7(â)†+!-º.D0Î1H3Ã4,6—7í8A:†;¿<ë= ?@AêA¹BeCóCfD¨DÊD·DuDûCGCQBAž?Û=Í;v9Ó6î3½0Z-¯)Þ%Ý!ÁŠPÜ ¿½å:ýÅù†ö‹óÉðMîìêSèÒæˆåyä–ãîâfââÝáÑááá âUâ´â%ãªã>äßäŠå>æöæ°çqè!éÛé€êë°ë&ì’ìÔì ííúì·ìLì°ëëêëéÀècçÒåä/â)àùݼÛdÙ ×´ÔkÒ4ÐÎ3ÌxÊùȵǷÆÿÅ‘ÅkÅ’ÅøÅ®Æ•ÇÈÈ!ʺËxÍ^ÏgÑŽÓÊÕ ØƒÚõÜpßóáwäç‹éìžî ñ¢óöŽøôú[ý¶ÿ V˜Ô / JdpwreT3ã ­"t$,&ã')1+Ö,f.ù/€1ý2y4æ5O7©8:D;…<­=Ó>Ú?Þ@¾A’B@CÜCKDŸDÃD½D‚DDjC„B[Aê?8>5<ð9Y7ƒ4`1.i*¡&¦"‘_#å¬ „¤ñýmú*÷ôRñÅî|ìtê§èçÉå§äÈããƒâ$âäá×áØáâCâ¢âã‘ãäÂädåæÏæçIèÿè·é^êë“ëì|ìÊìþìíþìÇìaìÒëë!êûè¨ç$æoä’âŽàgÞ-Ü×Ù„×&ÕÝҠЅΑÌÍÊ>ÉóÇ䯯¥ÅnňÅãÅ…ÆjdžÈáÉgËÍÿÎÑÓ^Õª× Ú{ÜôÞuáüã…æéšë!î¡ð&óšõø|úäü@ÿ˜ã*c˜ À äú ñ×´‰ T"$Ø%‹'=)á*,.¨/51³2.4Ÿ57e8¿9;H¨?©@•AfB"C¼C8DD¼DÀDD,DC¯BœA1@“>œÆ¼ÅtÅÅÌÅfÆ7ÇOÈ™ÉËÊ̟ΜиÒêÔ9×–ÙÜzÞ÷à€ãæ“èë¢í*ð¤ò'õ”÷ úlüËþ%p¹÷' Y w”¤­«¥‘{U/ ù!Â#‚%6'ç(*0,È-]/ä0j2ä3W5À6$8v9È:<:=_>s?x@eA?BýBžC"D~D¶DÀDšDBD®CâBÑA}@æ>=Ö:c8 5¢2V/Ù+(7$- ÎU( 'aÿÍûmøLõfòÂïaí:ë\é²çKæåäRã¹âCââ×áÛáñá/âyâåâ]ãèã€ä'åÓ勿Cçýç¹èméêÁêZëßëPì­ìéì ííÝì‰ì ìZë‚êmé/è»æåIã]á:ßݾÚmØÖ¿Ó}ÑUÏPÍyËÖÉoÈIÇhÆÎÅ‚ÅxžÅBÆ ÇÈSÉÑÊoÌFÎ6ÐOÒ|ÔÆÖÙ‹ÛüÝàÿâŠåèê$í¬ï*òªô÷ŽùöûVþ¯ÿG…¿ è )@ELA2úÑ£!h#)%â&“(<*ß+y- /œ02Ÿ356Ù769†:Ã;=">??D@6AB×B€CDmD¬D¾D¥DUDÎC CBÄ@8?d=E;á8-6=3û/Ž,Ö(%ô Ùžf$û âé|üùçõôòDðÕí¤ë¶éèŽæSåKäxãÕâZâ âÞáÙáîáâmâÎâEãÌãbäå³åeæ ç×ç•èJéûé¡ê;ëÄë=ì™ìÞìí íäìì"ì‚ëªê¦éoèçoå¦ã»áªßxÝ2ÛâØÖ8ÔçÑÁϱÍÒË$ʲÈ|Ç’ÆèÅŠÅzŧÅ*ÆàÆáÇÉƒÊ ÌåÍØÏäÑÔTÖ¨ØÛÝà|âåç"ê§ì-ï¯ñ+ô¦öù€ûÞý<ÖO } ¦ À×ãâäξ›wG!#Ò$‹&?(é)+)-¾.J0Ó1M3Ç406™7ð8D:…;Á<ë=?@AèA´B]CîC[DDÁD¤DkDçC5CÞ?Ô@ÀA‰B<Õ9@7g4F1é-N*„&Ž"vI М { w™äýjú"÷ôSñÃî‚ìsê­è!çËå´äÈããŠâ)âóáÙáæá âMâ©âã™ã%äÆämå æÖæçIèé²édêûê’ë ìvìÂìöìíôì·ìSìÂëýêêæè•ç æZä}âvàVÞÜÇÙp×ÕÍÒ•Ð|ΊÌÉÊ=ÉòÇéÆ&ƬÅ|Å“ÅôÅ”Æ~ǘÈõÉ}Ë3ÍÏÑ:ÓqÕÁ×#ÚŽÜ ß‰áä˜æ#é¬ë4îµð6ó­õ"øúñüRÿ¥ó4t£ Ï îýá»” [""$à%’'E)æ*ˆ,.¯/91¹214¤57l8¼9;G¥?¨@ŽAdBC¶C/D…D²D±D‚DDCB†A@|>êßêsëôë`ì¶ìêìíôìÈìeìâë$ë?êéÜçVæµäÖâßà¿Þ…Ü<Úá×Õ<ÓÑáÎëÌˉÉ.ÈÇIƿŃʼnÅàÅrÆMÇaÈ­É1ËÛ̹ΰÐÎÒÕPשÙÜÞá“ãæ§è+ë¹í5ð¼ò2õ©÷ú|üÚþ4}É8 c „ ¯¹¶°™…]9 "Ì#…%A'î(–*5,Ñ-]/ð0i2ê3Z5Ã6%8z9Æ:<8=_>q?t@bA:BöB˜CDuD«D²DD0DŸCÌB¾Ag@Î>é<¾:F8†5…2:/¾+($ î´{? [ÿÀûløDõgòÃï`íCëZé½çOæå'äVãÃâLâ ââáááýá4â…âëâdãîã‡ä+åØå‘æAçè´ètéê¿êXëÙëNì¢ìäìþìûìÑìyìýëKëlê\éè§æå7ãAá,ßóܰÚVØÖ°ÓoÑLÏHÍuËÔÉpÈKÇoÆ×ŌňÅÈÅXÆÇ,ÈiÉäʇÌZÎNÐcÒ—ÔØÖ6Ù¡ÛÞ–àãžå&è²ê6í¿ï;òºô.÷œùücþÀ V”Ê ø 8HSUK<$Ø­!n#3%è&š(D*ä+-/ž0"2Ÿ35~6ß769†:È;ú<'>:?A@5A BÑByCþCdD D±D–DDD¿CõBøA¬@!?N=*;È86!3á/s,¼(å$Þ ¾ŠOè ÓÞvüùâõóòDðÖí¨ëºé è—æYåTäãÙâhââìáÝáùá'âvâÕâMãÑãkä å¹åhæ$çÛç•èLéøé¢ê9ë¿ë9ììÚìøìüìÚì‹ììmë™ê’é[èðæYå’ã¥á”ßcÝ ÛÌØvÖ"ÔàѳϭÍÊË%ʯȃǕÆòŕńŻÅ4Æ÷ÆñÇ*É—Ê5ÌýÍìÏüÑ$ÔkÖ¾Ø)Û˜Ýàšâå«ç1êºì@ï¿ñ@ô±ö'ùûðýH›æ!` † ¶ ÊåëñêÜĨ}P!#×$—&A(ô)+0-Ã.P0Ö1T3Ç466™7ó8F:†;Á<é=?@AåA«BYCåCOD–D¯DžDUDÙC"C)Bñ@p?«=›;B9ž6·3ˆ0-|)¦%«!_"é¸  ¢Ð'ý¸ùöƒóÉðLîìê^èÙæ˜å‚äªãûâxâ$âðáàáõáâfâÂâ3ã¹ãLäéä–åFæþæ¸çnè*éÖéêë¨ëì‚ìÉìõìüìãì›ì/ìëÇêÅé›è7çªåíãâüßÑÝ“Û?ÙëÖ–ÔNÒ Ð Î(ÌrÊöȺǽÆƠňũÅÆËÆÀÇéÈOÊäˡ͋ϓѹÓúÕJØ®Ú!ݘßâ¢ä+ç´é<ìÁîFñÂó:ö«øûzýÕÿ't±ñ I b}…އ{gF&ò Á"$=&ò'œ)B+ß,r.0†1 3|4ñ5Q7³8ÿ9J;ƒ<¯=Î>Ù?Ô@¹A„B8CÉC<·9)7I4+1Î-2*k&s"\2÷¼Š j jÝý`ú ÷ôRñÅîìzê¯è&çÔå¹äÓãã–â/âýáàáðáâXâ­âãã/äÊätå"æÚæ’çMèé´é`êûêŒëìpì»ìíìûìèìªìFì°ëïêùéÖèçøåGädâfà=ÞܲÙ`×ÕÂÒˆÐuÎ‚ÌÆÊ=ÉóÇïÆ+ƶŇŠÅƧƌǯÈÊ’ËLÍ'Ï/ÑMÓ‰ÕÖ×9Ú¥Üß¡á!ä°æ4éÀëEîÈðGóÀõ2øŸúýaÿ³C® Þ ù"'&êÅ› e",$å%'I)î*,$.¶/=1¼284£57i8À9;E¤?¥@‰AaBC³C!D€D¡DªDnDDiCŽBmA @a>l<1:©7Ý4Ì1x.é*,'8#1ÿÎŽ\; /N”þ ûÀ÷¬ôØñCïñìÜê éqçæðäýã@ã©âGââêáéá âIâ›â ã‚ãä®äPåæµænç)èßè’é<êßêpëïë]ìªìçìøìîì¶ì[ìÏëë-êéÂçHæ˜äÈâÆà¬ÞoÜ*ÚÏ×€Õ.ÓøÐÖÎæÌˉÉ0ÈÇQÆÇÅÅ—ÅíÅ…Æ]ÇuÈÂÉCËõÌÉÎÊÐãÒÕe×ÁÙ+ܨÞá«ã-æ¹è@ëÊíHðÐòAõ»÷&úŠüíþ>‘ÔG l “ª¼ÃÁ¸§‹l< "Ñ#%G'ó( *9,Ù-c/ó0q2ì3^5Ç6'8}9È:<9=]>p?q@^A4BðB’C DlDŸD¥DD"DŒC½B§AT@µ>Ô<¡:/8i5k2 /¡+é'$ùÕ e0 ü Mÿ½ûbøDõcòÃïaíCëaé¿çWæ%å,äaãÈâVââìáêáâ>âŠâõâhãøãŠä3åÝ哿Içèºèoéê¼êVëÔëHììÙìöìïìÃìnìéë=ëXêKéè“æîä$ã+áßåÜ”ÚIØïÕ¡ÓcÑAÏ>ÍrËÑÉpÈOÇrÆáŕœÅÙÅdÆ0Ç>È{ÉûÊ›ÌpÎeÐxÒ¬ÔðÖLÙ²Û+Þ¥à,ã±å;èÃêKíÏïOòÊô?÷®ùüuþÍa¤Õ  &ET^`UI- ä´!y#9%ñ&¡(J*ì+†-/£0'2¢35€6á7<9…:É;ý<#>;??@0A BÍBpCùCXD–D¥DˆD5DªCèBÝA›@?5=;¬8ø53Ç/T,¡(Ë$à §q:ÿØ ÄÑmüùÝõóò@ðÚí¨ëÀé èœæ`åZäŠããâlââòáéáÿá2âzâàâQãÛãoäå¼åmæ&çÞç™èJéûéê8ë»ë3ìŠìÑìïìôìËìììbë†êéFèÛæDå|ã‘á{ßRÝÛ½ØbÖÔÐѪϡÍÉËÊ´È‚ÇÆöŤŌÅÌÅCÆÇÈ@É«ÊJÌÎÐÒ<ÔÖÕØ=Û°Ý)à°â2å¾çEêÍìRïÕñLôÈö2ù ûÿýXªô.o ” ¿ ÚíúûõæÏ°ˆY!!#â$›&M(ö)œ+2-Í.R0Þ1U3Ð4767õ8F:ˆ;Á<é=? @AßA§BQCÜCHDŠD¦DDIDÅCCBÞ@X?“=;&9ƒ6™3n0-`)%!xDÕ¤ ’“Åý¯ù{ö€óÉðLîìêaèãæ›åä®ãã€â-â÷áìáùá'âmâÊâ<ãÀãOäòä™åKæç»çqè*é×é~êë¢ëì{ìÃìêìóìÕìŽì ì€ë´ê³é†è#ç”åØãïáéߺÝÛ-Ù×Ö‰Ô=ÒÐÎ ÌqÊõȺÇÇÆƯőŸÅ-ÆÜÆÓÇýÈeÊõ˽͜ϰÑÊÓÖ^ØÈÚ3ݱß/â¹ä=çÊéNì×îUñÖóIö½ø'û‰ýäÿ7Ãû, S r†’™‘‡oQ-þ È"Š$F&÷'¥)H+ä,|.01 3ƒ4ó5V7³8:I;„<®=Î>Õ?Ô@²AB0CÀC6D|D¡D”DUDæC2CLBA¨?ï=ë; 9 7,41°-*N&Y"Cá§w [ ZƒÑý\ú÷ôKñÉî€ì}êµè+çÚåÁä×ã&ãšâ;ââíáõáâ^â¸â$ã¦ã3äÒäxå'æÞæ•çOèé´é`êøê‰ëìjìµìãìñìÚìŸì6ì ëÞêåéÂèjçâå1äNâNà&ÞðÛŸÙL×ùÔ±Ò~ÐjÎ|ÌÁÊ=ÉôÇñÆ5ƽŕŮÅƹơÇÀÈʤËeÍ>ÏGÑbÓ¡Õì×QÚ¹Ü6ß²á;äÀæKéÐëZîÙð\óÍõGø¬úýnÿÃR޽ ê !-30%ôТ q"1$ñ%£'P)ø*’,-.¹/C1Ã284¬57o8Á9 ;F¥?ž@ŠAVBC¦CDpDšD˜DdDûCYCyBXAó?G>V<:’7À4­1_.Ì*' #ë³|H( #?‹þû¹÷¨ô×ñAïóìÞê éwçæ÷ääHã³âMâ âìá÷áâUâ¡âãŠãä³äUåæ¹æqç+èßè•é<êÜêlëëëUì¦ìÛìïìàì«ìKì¾ëëêýè®ç3æƒä°â²à”Þ_ÜÚÂ×jÕ#ÓéÐÎÎÜÌˇÉ1È!ÇVÆÒŘŦÅüÅ—ÆnÇŠÈÕÉ[ËÍâÎßÐùÒ2Õw×ÜÙ@Ü»Þ9áºãFæËèUëÛí^ðÞòVõË÷5úžüùþPŸÞ#O € ›¹ÆÏβ•sI "Ý#•%P'ü(¥*B,Ý-k/÷0u2ó3a5Ê6+8z9Ï:<<=\>k?r@VA3BçB‹CDbD“D™DoDDzC¨B“A;@ >µ<‹:8O5N2/…+Ë'è#ß½‡O÷ é?ÿ¶û[ø@õaòÃïaíGëdéÆç[æ-å3äkãÏâ`ââóáòáâAâ™âöâuãüã‘ä:åÞ囿Iç è¼ènéê»êQëÓë@ì˜ìÐìíìãì·ì^ìÜë)ëIê4éñç~æÙä ãáÿÞÍÜ…Ú4ØàÕ’ÓWÑ8Ï5ÍpËÌÉrÈUÇvÆìŞŠÅêÅqÆGÇMÈ•É Ë³Ì†ÎzÐ’Ò¾Ô ×]ÙÐÛ:ÞÁà;ãÉåLèÙê]íäï^òÞôP÷½ù'ü‚þÞ+q±ä  4NbikbP9î»!ƒ#@%ù&ª(O*õ+‰- /¨0,2©35‡6â7>9ˆ:È;þ<">9?;@,ABÇBiCðCNDŒD˜DzD%DšCÓBÌAƒ@ñ>=ü:8á5å2ª/:,„(²$§ Y$îà µÄüÿdüù×õðòAðÚí«ëÃéè æiå_ä”ãéâuâ$âüáðá â6â‡âäâYãâãräåÀåræ*çáç˜èOéøéžê3ë¹ë,ì…ìÇìçìçìÀìqìöëNëvêlé2èÈæ+åiãwájß9ÝúÚ¥ØUÖÔÅўϚÍÃËÊ´È…Ç¢ÆÿÅ­ÅšÅÚÅUÆÇÈPÉÂÊ`Ì(ÎÐ&ÒTÔ–ÖìØSÛÅÝ?àÄâFåÒçYêßìgïãñbôÖöEù¯ûþi¸Av ¦ É èö íÛ¹‘b!*#é$¥&S(þ)¢+:-Ò.X0â1[3Ñ4=6Ÿ7ø8F:Œ;¾<ì=ÿ> @û@ÜA BKCÔC?DD™D€D8D¶CýBBÆ@B?{=f; 9i6}3R0å,C)p%v!Z0öÀ– ~‡ºý«ùtö~óÆðNîìêeèçæ¢å“ä·ã ãŠâ5ââòáâ.âwâÐâEãÄãYäöäžåQæç¼çvè(éÙé|êëžëìvì¸ìåìãìÍì}ììmë£ê ésèçåÂãÙáÒß§ÝiÛÙÅÖyÔ0Ò ÐúÍÌkÊöȼÇÍÆƺśÅÊÅ:ÆñÆãÇÉvÊÌÌͻϼÑéÓ$ÖxØÝÚHÝÈßCâÍäRçÛédìçîiñçóZöÐø4û›ýóÿC’Í 8 _ ~¢ž¡|\3 !Î"•$L&(ª)P+ê,€.0•13ˆ4ö5X7·8:J;‡<¬=Í>Õ?Î@±AyB*C¹C+DrD—D„DKDÏC%C4BA”?Ó=Õ;…9ð64ñ0˜-ú)6&<"-Ê–c M MtËýSú÷ôIñËî‚ì‚ê·è4çÜåÊäßã,ã£âDâ âôáâ#âkâ»â0ã©ã=äÖä~å.æßæœçNèé¶é[êûêƒëÿëdì¬ìÛìæìÐìì)ìëÎêÓé¯èVçÍåä;â6àÞÖÛ‘Ù9×ëÔ¡ÒtÐ`ÎyÌ»Ê=ÉôÇùÆ9ÆÉşżÅ#ÆÊƱÇ×È0ʼËwÍWÏYÑ}Ó²ÕØdÚÑÜIßÈáOäÕæ]éåëjîëðlóßõWø½ú#ý~ÿÒb˜Î ó )<:?-Õ¯ v":$ù%©'Y)ý*š,3.¾/H1Ç2>4¬57m8Ç9;I¡?œ@…ARBC¡CDiDD‹DUDêCHCfBCAÞ?/><<û9v7¤4–1>.µ*ó&#üСg6 5þÿú³÷¥ôÕñDïòìãêéyç$æøääMã¼âVââùáûáâYâ­âã’ãä·ä_åæ¾ætç+èãè“é;êÜêgëçëQìžìÓìåìÓì ì<ì°ëòêêéè›çænäœâœà€ÞKÜÿÙ²×YÕÓÚÐÉÎÒÌË€É7È!Ç_ÆÚţŴŠƨÆÇ›ÈëÉnË Í÷ÎöÐÓHÕ×ðÙVÜÎÞNáÎãZæÜèiëëírðíòhõÙ÷Fú«ü ÿ]¬ï-^ Š ©ÄÑÙÙË¿š‚L !"ã#ž%W')ª*J,ß-t/ù0{2õ3c5Ï6+89È: <7=Z>m?j@VA+BâBƒCþCUD‰DŠDcDDiC”B~A(@…>¢:?5@+ABÀBcCæCFDDŽDiDD‡CÂB¶Ao@Ø>=à:v8Ä5É2“/,n(“$’ tHÚ¸ ¡¾íÿ_üûøÕõðò?ðÜí­ëÊéè©ælåkä—ã÷â{â0ââýá âEâŠâîâaãæã|äåÈåuæ-çäç˜èRéóé ê-ë¸ë%ì€ì¿ìÜìÜìµìaìéë;ëeêZéè²æåRãcáVß%ÝæÚ—Ø@Öúӵјϑ;ËÊ²È‹Ç¥Æ Æ¶Å©ÅçÅfÆ*Ç,ÈdÉÙÊrÌAÎ.Ð<ÒlÔ©ÖÙeÛÝÝRàÙâYåççiêõìsïøñpôèöUù¾ûþyÄNƒ ² Ö ñýàÚj!1#ô$¨&\(*§+@-Ö.^0æ1^3Ö4=6¤7ø8K:†;Ä<ä=?@ü@ÓAžBACÎC3DvDŠDuD%DªCæBòA¬@0?a=P;ñ8N6c360Ì,()W%]!Eá±€ uy°ý¢ùrö{óÆðRîì&êkèìæ¬å˜äÁãã”â:ââùá â8â{âÜâJãËã`äûä¤åUæçÀçwè*éÕé€êë¡ë ìpì±ìÙìÜì½ìtìÿëaëŽêé^èúæjå­ãÄá¿ß‘ÝWÛÙ¸ÖgÔ(ÒüÏõÍÌhÊöÈÀÇÏÆ&ÆÁŪÅÕÅMÆÇ÷Ç'ÉŒÊ"ÌçÍËÏØÑûÓ<ÖØòÚ^ÝÚß[âÜäjçêéxìøî|ñôóoöÛøHû¦ýSß F k Š«­§›‚f>!Û"–$Y&(¸)P+ô,ƒ.0–13‹4÷5^7µ8:L;‚<°=Æ>Ö?Ç@­AtB"C³CDiD‰DxD:D½CCBó@|?»=¿;g9Ú6ô3Ú0x-ã)&'"ê·U ; BiÄýLú÷ôKñÉîˆì„ê½è9çäåÐäèã4ã¬âKââýáâ/âmâÊâ0ã·ã>äÞä„å0æåæžçNè é°é_êõê‚ëùë^ì£ìÕìÙìÇì€ìì€ë¹êÂéšèAç¹åä%â"àÞÆÛyÙ*×ÚÔ•ÒiÐUÎtÌ·Ê>ÉöÇýÆAÆÒÅ«ÅÊÅ2ÆÚÆÅÇêÈFÊÑËÍkÏrÑÓËÕØxÚéÜ^ßÞácäèæréöëîýð|óòõdøÏú3ýŒÿá-l«Ö  7EHE:#â¶ "C$ÿ%°'a)+£,6.Æ/K1Ì2@4³57r8Æ9 ;E¢?—@ALBC˜C D[D„D|DFDÜC2CUB,AÉ?> <ã9Y7‹4v1'.”*Ý&è"å¶ŽN) 'xþöú¯÷¤ôÐñGïòìéêéƒç&æåäSãÇâ]ââââ$âeâ²â ãšã$ä¿äbåæÃæxç.èåè‘é<êØêeëãëIì˜ìÈìÝìÆì”ì*ì¢ëàêóé×èƒç æYäƒâ‰àiÞ6ÜíÙœ×LÕÓÒмÎÍÌ ËÉ7È'ÇeÆäÅ®ÅÃÅƹƔǯÈÊ„Ë5ÍÏ Ñ$Ó`Õ£×ÚmÜãÞdáâãoæòè|ëîðóyõê÷Xú¼üÿp¸þ=g › ´ÐÞåâÚìƒ^ ""ð#¤%`' )²*P,æ-y/ý0„2õ3l5Î6/8‚9Ê: <8=X>l?f@SA%BÝB{CöCID€D{DUDïCYC~BnA @r>†5?7@&AúA¼BZCßC:DuD~D_DD{CªB¥AU@Ã>é<Ç:Z8§5¯2v/ü+U(t$} W3ôÌŸ ˜©èÿTüôøÒõéòBðÜí®ëÍéè­æuåoä¢ãüâ‡â5â âââIâ•âôâjãîã€ä%åÇ倿,çèç›èNéúé™ê/ë°ë"ìxì·ìÓìÑì§ìTìÙë)ëTêDé è›æå<ãNá>ßÝÏÚ…Ø1ÖæÓ­ÑˆÏŒÍ¸ËÊ´ÈŽÇ©ÆƼźÅòÅyÆ:ÇAÈyÉìÊ‹ÌUÎDÐVÒÔÅÖÙÛïÝlàìâqå÷çêí‰ï òôûöeùÐû,þ‡ÕZ“ ¿ â ïÊ¥s!<#ø$´&a( *¯+G-Ú.h0ç1f3Ù4@6©7ú8K:Œ;Á<ç=?@ù@ÏA˜B8CÉC(DkD~DcDD•CÖBÚA™@?H=5;Ö836E30­, ):%C!*Ëšq al£ýœùlözóÄðPîì'êoèôæ®å¤äÆãã›âEââââ=âˆâÞâUãÒãfäå¨åYæ çÂçzè(éÛéxêë˜ë ìiìªìÏìÓì¯ìhìíëSëzê~éHèææUå•ã¯á¦ß~ÝBÛôئÖVÔÒñÏìÍÌdÊ÷ÈÂÇÔÆ,ÆÌŵÅåÅ[ÆÇ È=É Ê;ÌúÍäÏíÑÔSÖ¤ØÛwÝïßpâõäyçêˆì ïŽñôöîøWû¹ýdªï X t š¨¶º³¤nH!à"£$^& (¼)Z+ø,.0Ÿ134ý5^7º8:L;ƒ<¯=Ç>Ó?Ä@©AnBC¬CD`DyDnD&D³CûBBÛ@c?¦= ;N9¼6Ù3½0[-Å)ý%"ûПkB * 3]·ýFú ÷ ôIñÉîˆìˆêÃè;çîåÓäôã9ã·âRââââ9âsâÓâ9ã¼ãGäää†å9æææ¢çRè é´é\êóêëôëXì›ìÊìÑì¸ìtì ìoë¨ê®é†è,ç£åïãâ àëÝ®ÛiÙ×ÇÔ‹ÒVÐSÎh̶Ê;ÉûÇÿÆKÆÛŸÅÙÅAÆìÆÚÇûÈ_Êä˦͂ωѨÓãÕ0Ø’ÚýÜvßòá{äûæˆé ìîñ‹óöuøàúDýÿñ9€³ê 0@SRTA2î¿ ‡"O$&¿'a)+£,@.Ê/R1Ñ2F4µ57u8È9 ;Iœ?—@{AIBùBCDTDsDqD6DÉC#C=BA®?><È9=7p4W1 .v*¿&Ï"Æ¢oA ý ð"iþïú©÷ŸôÏñGïôìëêé†ç-æ åäaãÉâkâ"ââ â2âfâÁâ"ã¤ã+äÄähåæÉæwç6èßè™é8êÖêdëÜëFììÁìÑì½ì„ìì‘ëÎêâéÂèoçòåEäjâuàQÞ#ÜØÙ‰×=ÕõÒÈбÎÉÌË„É4È/ÇjÆìżÅÏÅ*ÆÊƧÇÂÈÊ™ËKÍ&Ï!Ñ@ÓrÕ¿×ÚˆÜ÷Þ}áöã…æé‘ëî—ðóŽõû÷húÎü%ÿ‚ÅHx ¥ ÃÜìïñàÓ°”a 3"ò#°%f')¸*X,í-~/1†2ü3n5Ô6/8‰9È:<4=Z>h?d@QABÛBpCìCDDlDvDADáCDCnBRAü?T>p<8:Ã7û4ú1±..+z'˜#vBãÁ ÁÙ&ÿ™ûMø3õ[òÂïgíNëréÓçpæAåIäãêâxâ4â â â'â^â¬âã‡ãä¤äIåñ塿Xç èÀèséê·êHëÅë1ìì¹ìÌìÄìŽì5ì«ëöêêûèµç;æ›äÉâÕàÀÞŒÜNÚù׳ÕbÓ6ÑÏ&ÍZËÌÉqÈ`Ç‹ÆÆÁÅÈÅƨÆyÇŠÈÐÉMËõÌÉξÐÖÒÕKצ٠ÜÞüà}ãæˆèë’íð“òõ÷óùTüµþ WžÙ 9 Xw‚ŒsS5 Ô!Ÿ#V%'¼(h*,¡-,/¹0;2±3*5‰6î7D9‡:Ñ;ø<$>1?4@"AöAµBSCÕC3DgDrDODôCfC˜BŽA@@ª>Ò<©:B8ˆ5•2U/å+3(^$\ Báµ ˆ›ÞÿHüïøÌõæòCðÙíµëÎé!è´æ{åwä©ããâ<âââ$âPâžâýâpãôãŠä%åÑ倿3çëçœèQé÷éšê+ë¬ëìrì­ìËìÄì›ìGìÇëë>ê3éõç‡æîä%ã9á'ßýܺÚsØÖÚÓ›ÑσͰËʮȕǭÆÆÇÅÇÅÆŠÆNÇQÈÉÿÊ£ÌkÎ]ÐkÒ—ÔÚÖ0Ù–ÛÞƒàãˆå è•êíœïò“ô ÷vùàû>þ•æ,jŸ Î í ()ôׯx!G#%»&l(*µ+O-â.j0ñ1i3Ý4G6©7ü8P:Š;Â<è=û>@ò@ÍAB6C»C"D]DrDVD D‚CÃBÄA‚@?,=;¸86+3ú/”,î( %'!ç´†^ Oa“þü“ùföxóÁðRîì)êvèöæºå¥äÒã"ã¥âLââ ââFâŽâéâWãÞãiä å¯å\æçÅç|è)éÚéwêë”ëìcì£ìÆìÇì£ìZìàë?ëlêeé8èÏæ@å€ã™á‘ßhÝ/ÛàØ–ÖFÔÒåÏäÍ ÌbÊöÈÆÇÙÆ5ÆÖÅÃÅôÅkÆ'ÇÈQÉ·ÊNÌÎøÏÒ(ÔlÖ¹ØÛÝà†âå’çê¡ìï¥ñô“öýøjûÆý#o¾ù4 _ … ¤µÄÂÀ­™zP$!ê"«$h&(Ä)_+-Ž.!0¢13”4ÿ5c7¼8 :K;…<¬=Ç>Ð?À@¦AfBC C DTDnD_DD¢CèBûAÅ@K?=ƒ;896À3¡0=-¬)Ý%õ!Ú¾„Y+  !S®ý<ú÷ôGñËî‡ìêÆèBçôåÜäøãDã¼â^â&â ââ=ââÖâCãÁãNäéäå8æðæŸçYè é´é\êîê|ëïëPì—ì½ìÊì§ìkìúë]ë˜êšésèçŽå×ãûáóßÙÝ—ÛYÙ×½ÔxÒQÐFÎcÌ´Ê6ÉÈÇRÆæÅÁÅèÅQÆþÆëÇÉqÊû˼͘ϟѾÓúÕGبÚÝŒßâäç™é!ì£î$ñ¢óö‰øïúTý¬ÿIŒÃõ  =L_\`L;öÈ “"R$&À'o)+®,D.Ï/Y1Ô2K4¹57x8Ë9 ;Iœ?“@vAEBòBˆCùCFDjDbD'D»CC,BAš?ç=î;«9#7R4=1í-\*£&µ"­ŠZ(þ æ éaþçú£÷›ôÎñEïöìîêéŽç0æå!ähãÔâqâ.âââ3âvâÁâ1ã¥ã5äÇäoåæÊæç2èçè“é:êÒêaëØë?ì‡ì»ìÂìµìtììë¿êÌé¯èZçÞå.äXâ[àBÞ ÜÆÙx×+ÕèҽХÎÃÌË‚É6È3ÇnÆúÅÃÅáÅ6ÆÜƹÇÖÈ,Ê­ËbÍ;Ï:ÑTÓŒÕÓ×2Ú›Üßáä–æé¡ë)î¦ð'óšõøwúÝü9ÿ‹ÙX… ³ Îêõüúìݺžj ;"û#¹%m')¿*],õ-/ 1ˆ24q5×648†9Ï: <7=Y>c?f@IABÑBjCäC8DdDdD6DÎC6CWB@Aã?=>V< :¦7à4Ý1”.+]'|#x[,û̵ ­Ïÿ’ûEø1õVòÄïgíQëvéØçsæJåNä‹ãïââ=âââ.âhâ²âããä­äNåóåªæXçèÅèpéê¶êDëÁë+ìzì°ìÅì´ì„ì$ìëäêêâè¥ç%æ‡ä³âÂà§Þ}Ü7Úê× ÕTÓ(Ñ ÏÍXËÉÉrÈbÇ’Æ ÆÌÅÖÅ"Æ»ÆŠÇžÈæÉaË ÍÝÎÖÐêÒÕb׺Ù$Ü”Þá‘ãæè&ë©í.ð¨ò#õ•÷úeüÅþl¤í H e€™•Žy`> ß!¦#a%'Ç(k*,¥-3/Á0<2¹3*56ð7C9Ž:Ì;ý< >/?3@AôA­BMCÌC(D\DhD>DèCRC‡BxA*@“>¸<‘:%8n5v2þ?ò@ÅAŽB+CµCDQDgDGDùCsC®B´Aj@ê>=;¡8ú5 3â/t,Õ(% !÷ÒœsL ?T‡ôüùaötóÁðRî ì,êyèýæ¾å¯äÖã+ã¬âVâ%ââ(âMâ˜âîâbãàãrä å²åeæçÍçxè/éÖézêë•ëüë_ì™ì¼ì¾ì“ìOìÏë0ëZêTé!è½æ(åkãƒázßTÝÛÏØ‚Ö9ÔÿÑÝÏÙÍÌ_ÊôÈÉÇÝÆ?ÆÞÅÑÅÿÅ~Æ4Ç2ÈcÉÌÊeÌ'ÎÐÒ?Ô‚ÖÑØ4Û¤Ýàœâå¤ç+ê±ì1ï´ñ+ô¤öùzû×ý2ÉB l ” ¯ÂÏÐÈ»£‚](!÷"²$n&(Ç)l+-›.!0¬1 3š46f7À8 :R;<²=À>Ð?¾@žAfB CCDJDcDMD D‹CÚBæA­@7?t=l;96¤3ƒ0#-Ž)Ä%Ö!ĤoD  C§ý2ú÷ôHñÉîŠìŽêËèFçúåâääKãÄâgâ+ââ âHâ†âÞâKãÇãVäïä‘åBæíæ§çYèé¸éWêïêxëêëJììµì¾ìžìZììëNë†ê‡ébèçzåÄãâáã߿݉ÛCÙóÖ­ÔiÒJÐ8Îb̬Ê:ÉþÇ ÇWÆïÅÏÅóÅcÆÇÿÇ%É„ÊÌÎͰϸÑÓÓÖ]ؼÚ,Ýß â ä&ç®é1ì¸î5ñ²ó)ö–øû^ýÀÿ YšÐ ' F[hme[B'þÒ ™"^$&Ç'x)+µ,J.Ô/^1Ø2N4¾57|8É9;Hš?Ž@uA;BðB|CòC;D_DUDD¦CCBó@~?Ó=Ò;—97<41Ó-B*„&ž"‘tCë Ö ØUþáúœ÷–ôÎñCïúìîê"é‘ç8æå*äoãÝâxâ6âââ@âyâÎâ5ã­ã=äÊäyåæÑæ~ç7èåè–é8êÑê_ëÐë=ìì°ì¼ì¥ìkììpë­êºéžèDçÉåä@âIà)ÞøÛ²Ùh×ÕÚÒ±ÐμÌþÊ€É6È:ÇsÆÆÐÅëÅIÆëÆÍÇéÈ?ÊÃËxÍQÏPÑjÓ Õì×FÚ±Ü&ß¡á%䩿/é·ë9î»ð6ó­õ!ø†úîüGÿœæ*b• ¾ Ýò÷æÄ¨s A"$¾%w'!)Å*e,ù-Š/124u5Ú668‡9Ñ:<<=R>g?^@IABÏB_CÝC/DWDYD&D¿C$CDB-AÉ?,>8< :ˆ7É4¾1|.õ*E'a#^E躡 ¡ÁÿŒû=ø-õVòÀïkíQë}éÚç}æKå\äŽãûâŠâ@â#ââ:âmâ¼âã˜ãä´äQåúå­æ\çèÄèqéê³êBë½ë&ìrì©ìºì«ìxìì‘ëÑêïéÔè‹çæoä¡âªà–ÞeÜ%ÚÛ׌ÕLÓÑÏÍUËÆÉuÈfÇ—ÆÆÔÅåÅ0ÆÎƙǵÈöÉxË!ÍòÎîÐÿÒ3Õx×ÏÙ;Ü©Þ(á¥ã.æ¯è<ë¹íBð¸ò5õ£÷úvüÓþ(u¸ö( Q v‡¡Ÿ¤•†gG ç!®#j%'Í(v*,¬-;/Ã0C2¾3*5–6ñ7E9:Ì;ý<>/?.@AîA§BGCÄCDRDXD2DÖCCCrBfA@|>¢ðßí¸ëÕé+è¾æˆå‡ä¶ãã âNâ(ââ4âcâªâã~ãä–ä/åÛåŠæ5çõçšèVéôé—ê%ë¦ëìgì›ìºì­ì‚ì*ì«ë÷êê éÏç_æÂäüâ áýÞÕÜ”ÚMØÖ¹Ó‡ÑjÏuͨËʵȗǼÆ,ÆßÅÞÅ!Æ©ÆpÇ{È´É-ËÊ̙·КÒÃÔ×[ÙÂÛ0Þ¬à*ã¯å7è·êEí½ïDò·ô,÷™ùÿû]þ´H†º å #7<?4$ æÂ!U#%Ê&z(*Å+X-í.x0ô1v3á4N6®79P:Œ;Ã<ä=ú>ý?ë@ÆAƒB'C¬C DJDWDþ<é:†8à5ó2Å/Z,»(æ$ö ܽˆ^; 1Eçü‰ù[öróÀðRî"ì1ê}èçÂå·äÞã2ã·â\â/ââ.âXâœâûâfãéãxäå½åaæçÌç|è/é×évê ëëüëTì•ì±ì²ì‹ì=ìÄëëHêBéè¦æåVãlájß<Ý Û½ØqÖ-ÔðÑÓÏÕÍüËaÊñÈÏÇàÆIÆåÅàÅ ÆÆFÇCÈxÉßÊzÌ<Î(Ð0ÒYÔ“ÖéØHÛ¹Ý/à°â1å¸ç=êÄìDïÆñ<ô³ö"ù…ûëý>‘×N y   ºÏØÛÒǪŒe1!#º$u&&(Ì)u+-¡.&0¯1'3œ46g7À8:O;†<«=Ä>Ë?½@šA^B C‘CýCš?‰@sA4BëBuCèC1DRDIDDœCçBBÔ@p?¶=¼;z9ê641¶-%*k&€"zY/ýÙ Ä ËùKþÙú—÷’ôÊñDïùìôê"é—ç=æ!å1äuãæâ~âCâ â*âDâ„âÔâ=ãµã@äÕäyå æÔæ€ç=èãè™é6êÐêZëÎë4ìzì¨ì±ì›ì[ìõë^ëê¨é‰è4ç±åä+â2àÞâÛ¢ÙV× ÕÍңЗβÌüÊ}É;È;Ç|Æ ÆÙÅüÅVÆüÆáÇùÈVÊ×ËÍjÏbцӲÕØXÚÊÜ9߸á9伿DéÈëMîÌðGóÀõ.øœúùü[ÿ¥ù4s¢ Ê è ïÑ« G"$É%z'-)È*n,þ-/1‘2 4x5Ü6:8Š9Ñ: <8=U>c?]@CABÅB\CÓC"DODIDD¯CC5BA¹?>#<î9n7«4¥1[.ß*$'J#B+ÿά‹ –° ÿû:ø'õRòÃïiíUë~éàçƒæRåaä˜ãã“âJâ(â'â=âyâÁâ)ãžã#ä¸äYåÿå°æ`çèÇèséê³ê>ë¸ë!ìkì ì¯ì¢ìfì ìyëÇêÖéÅèsçæUäâ“à‚ÞOÜÚÄ×€Õ:ÓÑùÎÍOËÅÉvÈhÇŸÆÆãÅìÅGÆÕÆ´Ç¿ÈÊ‹Ë6Í ÏÑÓIÕ×éÙMÜÃÞ:á¿ã?æÈèJëÑíPðÏòCõ¹÷ú‰üáþ8„Æ3 ` 𦱫£tP$ ó!´#s%('Ô(}*,´->/Ì0H2À325”6ù7E9“:Ë;ÿ<>.?-@AëA¡B>C¾CDHDKD#DÇC0CaBNA@c>‡<]:ð775A2/+ã' $ øÏ¤v] Xs¾ÿ.üÛø¾õÝòAðÛí¼ë×é/èÅæ‹åä¼ãã¦âYâ.â$â<âgâ¹âãˆã ä˜ä;åÜåæ<çòç¢èRéöé–ê ë¤ë ì\ì™ì©ì©ìpì!ì—ëìêêùèºçIæ®äåâùàçÞÃÜ}Ú=ØìÕ­ÓxÑ`ÏlÍ¤Ë Ê·È•ÇÉÆ/ÆëÅëÅ-ƼÆÇŽÈÊÉCËßÌ±Î›Ð³ÒØÔ×qÙ×ÛHÞÀà@ãÄåIèÑêPíØïOòÎô:÷®ù üpþÂW”Ç ö 2?KJ@0óÊ–!_#%Õ&~(,*Ç+b-ò.{0þ1w3ç4R6¯79O:‘;¾<è=õ>ý?æ@ÁA~B C¥CD:DOD*DÛCPC‹B‡AC@¸>æ<Ï:l8Â5Û2¤/B,›(Î$Ú Ä¢tG* 6tßüùWöoó½ðVî ì7êè çÉå¾ääã<ã½âfâ5â&â5â`â§âþâqãîã}äå¾åkæçÏçè1éÖéuêëŠë÷ëNìì§ìªì}ì0ì´ëë6ê/éúç“æþäBãVáRß+ÝóÚ«Ø_ÖÔãÑÊÏÈÍüËYÊôÈÍÇéÆLÆóÅéÅÆœÆ[ÇUÈ‹ÉõÊÌSÎ>ÐFÒpÔ«ÖÿØ_ÛÏÝDàÇâEåÍçRêÕìYïÕñQôÄö1ùšûöýSœè$[ ‰ ª ÊÚæåßϹ“r8! #Ã$~&-(Õ)x+- .40­113ž4 6k7Ã8:P;†<ª=Å>Ä?¿@‘A^BýBCòC2DKD3DîCjC·BºA‡@?D=;;æ8L6n3G0ñ,Q)‘%Ÿ!”pHú æü*–ý!úùöøóEñÉîì–êÑèRçæðääYãÖâtâ@â'â3âUâ™âíâZãÔãbäøä åEæúæªç]è éµéVêëêqëàë@ìì¤ì©ì†ìBìÌë2ë_êgé5èÝæNå˜ãºáµß™Ý`ÛÙÐÖŽÔPÒ2Ð*ÎR̪Ê5ÉÈÇhÆÆçÅÆ‚Æ1Ç#ÈMÉ­Ê?ÌøÍßÏßÑÔ=Ö‡ØíÚQÝÎßFâÊäQçÑé]ì×î_ñÓóKö¹ø ûƒýÛÿ,u´ï D ]t~ƒ}nW;é ¦"r$$&Ú'ƒ)&+À,W.ß/h1á2X4Ã5&78Î9;J”?‰@lA0BãBmCâC"DLD6DýC‡CÙBñAÁ@W?Ÿ=¤;^9Ð64è0›- *N&j"]EìÅ µ ½ìDþÎú–÷‹ôÍñAïýìôê)éšçEæ%å9ä}ãîâˆâHâ,â.âPâ‰âÝâCã¼ãFäÝä{å)æÓæˆç9èëè”é8êÍêWëËë,ìtìœì«ì‹ìSìâëQëŠê–évèç¢åêãâàÞÐÛŒÙD×üÔ¿Ò™ÐΫÌùÊzÉ>È<LJÆÆçÅÆgÆÇðÇÉeÊðˡ̀Ï{јÓÍÕØrÚàÜNßÍáNäÑæYéÚëaîÝð[óÑõ@ø­úýjÿ·E° × õ  üØ»ƒ X"$Ó%ƒ'0)Ô*q,.”/1™2 4~5Þ6>8‹9Ò: <8=S>a?[@>A B¿BRCÌCDBD=DD£CûB"Bÿ@Ÿ?ù=<Ö9R74‰1>.Â*'0#(ê·™| ƒ©ùþ{û0ø$õRò½ïpíTë„éåç‡æ[ågä¡ã ã›âSâ2â.âIâ~âËâ1ã£ã-ä¼ä^åæ²æfçèÈèréê¯ê<ëµëìjì‘ì¬ìì_ìøënë²êÈé®èbçìåAäxâ|ànÞ;ÜÿÙµ×lÕ/ÓÑñÎ ÍIËÃÉxÈkǧÆ&ÆìÅÆOÆíÆÀÇÚÈ Ê¤ËKÍ"ÏÑ0Ó^Õ§×ýÙfÜÕÞTáÎãYæÙè`ëäíbðáòVõÉ÷2ú—üñþHÙC n Ч´¹¹­—W1 ø!¿#z%.'Þ(€*",µ-H/Í0M2Å345œ6õ7M9Ž:Ò;ù<>)?+@AäAžB4C¶CD=Dlçöç£èQéøé‘ê ëëìWìŽì£ìšìeìì†ëÝêòéêè¡ç9æ•äÒâáàÖÞªÜpÚ'ØßÕžÓlÑXÏdÍ Ë Ê³ÈŸÇÈÆ=ÆôÅ÷Å>ÆËƕǟÈàÉUËùÌÃÎµÐÆÒñÔ4׉ÙíÛ]Þ×àSãÚå[èãêgíåïfòÙôS÷¸ù"ü|þÑ%`¦Ó  $;MUTK9ýÓ !f##%Ü&†(3*Í+h-ø.€02z3î4R6µ79S:‘;À<ä=ø>ö?ç@¸AzBCCùC3D>DDÊC@CwBtA+@¢>Í<µ:P8«5º2Ž/!,‚(³$¿ ¬Š_4 %mÔü{ùRöjó¿ðTî$ì9êƒèçÑåÁäñã?ãÉâlâ@â-â>âiâ­âãvã÷ãä"åÁåoæçÏçƒè/éÖévêëˆëðëIì‚ì¢ì˜ìyìì«ëøê'êéåç€æéä-ãBá=ßÝÞÚ™ØPÖ ÔØÑ¿ÏÃÍõËXÊôÈÑÇðÆRÆÆñÅ.ƬÆlÇiÈ ÉË©ÌeÎWÐ[Ò†ÔÄÖÙvÛãÝ[àÚâZåàçeêéìlïçñbôÕöBù©û þ^¯ò5f — ¸ Ôæðñèܽ£vE!#Ê$…&4(Ü)+-­.20¸113¤4 6p7Ã8:O;ˆ<¨=Ã>Ã?¸@ATBùBCêC&D@D$DÞCYC¤B¨An@ó>)=#;Ê836N320Í,=)q%‰!yZ1æ Úë$‡ý úïöùóDñÇî”ì”êÙèVç æ÷ääaãÞââGâ1â;â^â¡âôâbãÛãhäå åNæûæ­ç`è é¹éRêêêkëÝë8ìwìœìœì|ì1ìÀëëOêTé"èÇæ:å‚ã¦á ß„ÝKÛ ÙÁÖ{ÔGÒ"Ð%ÎKÌ¥Ê8ÉÈÇoÆ ÆòÅ ÆŽÆFÇ3ÈcÉÁÊSÌÎðÏúÑÔRÖ¤ØüÚnÝÝß_âßäbçéélìïîoñäó_öÇø4û‘ýëÿ<ƒÄú) P lŒŒˆyaDí ´"w$/&ß'‹),+É,[.æ/m1å2\4Ç5(7ƒ8Ñ9;K?‰@dA.BÚBgCÖCD;D-DéCzCÆBÞA®@>?ˆ=Š;E9µ6ç3Ì0}-ï)3&M"G)×° ¨ ªã7þÊúŒ÷‰ôËñ?ïíôê0éŸçKæ,åAä…ã÷ââQâ5â6â[ââçâGãÉãGäçä}å.æÙæ‰ç=èêè–é5êÍêRëÈë&ìkì–ìì…ì?ì×ë>ë|êƒébè ç‹åØãâàíݽÛyÙ4×íԲҌІ΢ÌùÊwÉAÈAÇÆÆõÅÆxÆÇÈ$É}Ê̹͓ϔѯÓâÕ0؈ÚòÜgßááaäèæjéðësîððkóåõOø»úýrÿÍU½ ä #+$äÀ’ [" $Ö%'3)ß*t, .™/124}5ä6>8Ž9Ó: <5=U>\?X@;AB¸BNC½CD4D1DûCCîB Bî@‡?â=ï;¸9<7r4n1#.¥*ð&#ûÏ«~q rœñþpû-øõOòÀïmíZë„éîç‰æfåkä©ãã¢â]â9â5âRâ…âÕâ5ã®ã-äÉä^åæ²ækçèÊèséê­ê;ë¯ëì`ììžì‰ìNìíë^ë¡ê¶é›èOçÖå/ä_âkàWÞ(ÜëÙ¥×[Õ#ÓóÐëÎýÌJË¿É|ÈmǯÆ,ÆûÅ Æ_ÆþÆÓÇëÈ6Ê·Ë`Í:Ï-ÑFÓtÕ¼×ÚyÜîÞdáçãhæðèqëøíuðñòhõÙ÷Cú¦üÿVŸæP z —³¾ÆÀ¹¡‰a8 "Æ#‚%7'ã(‹*%,¿-J/Õ0P2Ë365Ÿ6ú7K9”:Í;ý<>+?$@AÜA™B-C¬CÿC0D1DD¤CC:B&AÒ?4>W<+:¹752Î.V+¬'Ö#ÝħtV7 <Y¨ÿüÐøµõÚò=ðàí¾ëáé9èÏæœå›äÍã-ã¸âhâ@â5âKâ|âÂâ&ããä¢äGåæå•æEçõç§èRéõé“êëëüëWììŸìŠì^ìÿë}ëÆêæéÒè“ç æ…ä¸âÐà¼Þ™Ü[ÚØÏÕŽÓaÑLÏ_Í˜Ë ÊµÈ¢ÇÏÆDÆÿÅÆJÆÞƤǴÈôÉiËÍÚÎËÐÝÒÕKמÙÜoÞîàgãðåoèöê{í÷ïyòëôb÷Êù0üŽþá/t±á  ,MVc^WB,á¤!s#'%æ&(9*Õ+o-ü.ˆ02‚3î4Y6´7 9Q:‘;Á<ã=õ>õ?á@¶AsBC•CïC'D4DDºC.CdBaA@ˆ>¸<˜:88Ž5 2p/,d(™$¥ ”uG" ^ÎüqùQödóÂðPî)ì;ê‰èçÔåÎäñãNãËâxâFâ6âFâsâ²âãzãþãŠä#åÉåpæ$çÓçè3éÓétêë€ëîëAìyìšììgìì’ëñêêéÐçkæÔäã,á*ßÝÌÚ‡Ø?ÖÿÓËѵϺÍñËVÊóÈØÇñÆ^Æ ÆÿÅ=ƼÆ{ÇȰÉ"Ë·Ì‚ÎgÐvÒ›Ô×Ö-ÙˆÛüÝmàñâmå÷çwêýì}ïùñuôäöUù·ûþo»=z Ÿ È Þõøþòå̧‚M!#Ó$Ž&;(å)ƒ+ -®.:0»143«46t7Å8:T;‚<­=½>Ä?²@‹AOBòB{CÞCD4DDÎCKCŽB—AW@Ü>=;²86730²,")V%p!_F÷Ð ÌÞ‚ýúêöøó@ñÊî”ì˜êÞè[çæþääjãæâ†âPâ9âAâjâ¥âþâgãâãpäå©åNæç¬çdè é¹éQêéêfëØë2ìoì’ì”ìnì&ì¯ëë<êAéè°æ(åkãáŒßnÝ;Û÷زÖlÔ8ÒÐÎHÌ¢Ê8ÉÈÇuÆÆÆ,Æ¡ÆTÇHÈuÉØÊhÌ&Î Ð Ò3ÔfÖ¹ØÛÝõßrâôävçýéìï€ñøónöÙøDû¡ýúÿKÓ 8 Y z‰——“‚mK%ö »"€$5&é')4+Ì,d.ê/q1ë2_4Ë5,7ƒ8Ò9;J‘?ƒ@bA(BÓB`CËCD.DDÞCeCµBÉA˜@(?p=p;,9›6È3´0^-×)&5"-ê¢ ’ ¢Ò1þÂú„÷‹ôÃñFïýìûê2é¤çRæ2åIäãþâ™âXâ>â@â`âšâìâQãÍãQäéäˆå.æÞæç=èíè”é6êÈêPëÀë#ì`ìììxì4ìÈë.ëjêpéMèøæqåÈãëáóßÙÝ¥ÛkÙ ×ÞÔ¥ÒÐ|ΠÌòÊzÉAÈHÇ’Æ(ÆýÅ$Æ…Æ1ÇÈ7É’ÊÌÏͫϩÑÄÓüÕBØ¡ÚÝ}ßöáyäùæéì„îñóòõbøËú+ý‡ÿ× d˜Ê ñ %140# ðÉ™ g""$å%Ž'B)à*},.ž/$1¢24ƒ5ç6>8“9Ñ:<5=R>]?S@7AB³BCC»CÿC/DDíC~CÙBùA×@q?É=Ö; 97Y4O1 .‡*×&ö"ù༒p] gäþmû$øõLòÀïní^ë‰éðç”æfåyä«ãã¨âhâ@â>âZââÜâ=ã´ã7äËähå æ¾ægçèÉèréê©ê8ëªëìVì†ì“ì|ìDìÛëRëŒê§é…è<çÁåäJâUàBÞÜÙÙ”×MÕÓéÐâÎ÷ÌF˾É}ÈuDzÆ9ÆÆÆsÆ ÇéÇþÈJÊÎËuÍOÏEÑZÓŒÕÓ×(Ú“ÜÿÞ~áøãæþèŠëîŠðóyõê÷Sú¶üÿe­õ(b «¸ÐËÒ½²mA "Ï#‹%='ì(*.,Á-T/Õ0Y2Ì3;5¡6ý7M9”:Ï;ü<>'?$@AÛAŽB)C C÷C"D&D÷C•CüB&BA»?>=<:Ÿ7ç4ë1°.:+’'¹#Å«aB% 0KžÿüÊø°õÛò;ðâíÃëãé@èÓæ¤å¡ä×ã3ãÃânâLâ;âWâ€âÎâ)ãšãä¬äIåîå–æLçõç©èPéøéêë‘ëÿëEì€ìŒì†ìKìõëjë¶êÕé¾è~ç ænä¥âºà¨ÞƒÜHÚØ¿ÕÓSÑDÏVÍ”Ë ÊµÈ¥ÇׯLÆ ÆÆZÆîÆ·ÇÈÈÊË"ÍòÎáÐóÒÕ`×¶Ù܈Þá~ãæ„èëí ðŠòýôr÷ÜùAüšþò>‚¾ï  <UdmibL5 è°!y#2%ë&”(@*Ú+v-/Œ0 2„3ó4Z6·79S:;Ã<ß=ö>ñ?Ý@±AkB CŠCæCD%DD©CCOBMAý?t><:8q5„2T/ë+J(}$ y_0õ ñPÈüjùKödó¿ðQî.ì=êèçÙå×äùãWãÓâƒâLâBâOâxâÀâã‡ãää+åÌåwæ&çÕç†è/éØéoêëzëêë9ìuì‹ì‰ìWìì†ëÚêêöè¿çTæ¿äãáßíÜ·ÚvØ.ÖïӿѩϵÍèËVÊôÈÙÇúÆdÆÆ ÆKÆÎÆÇ‘ÈÇÉ6ËÏÌ—ÎЌҲÔïÖBÙ£Û Þ‡àãƒå è‡êíï ò†ô÷öeùÉû'þ|ÍOƒ ® Ó îü íÕ´‰X!#Ü$•&B(ì)Š+%-´.@0¿1;3ª46t7Ç8:P;‡<¨=½>Á?®@‡AHBìBqCÖCD%D D½C:CzB„A=@Ê>õ<ò:•8û53ö/˜,)?%Q!I+ÝÁ ºÐ uýúäööó=ñÏî’ìžêáè_çæå&äsãìâ‘âWâCâJâqâ®âãnãìãräå«åWæç¶çaèé´éRêåêeëÒë-ìgìŠìˆìcìì¡ëþê-ê,éýç›æåWãyáxß[Ý#ÛêØ›ÖbÔ)ÒÐÎ@Ì Ê8É È#Ç}Æ!Æ Æ<ƲÆeÇ^ȆÉîÊ~Ì<Î"Ð"ÒIÔ}ÖÑØ*Û—Ý àˆâå‹çê’ìï’ñ ôöêøRû³ý\Ÿá F d ‰“¦¡ŸŒxT0ý Æ"†$=&ñ'–)=+Ð,k.î/x1ï2c4Î5,7ˆ8Ñ9;H‹?‚@[A$BËBXCÂCD$DDÍCUC¢B¶A‚@?V=Y;9ƒ6«3™0B-»)û%"þÔ­’  —Ä+þµú…÷ƒôÇñAïíøê;é¦çZæ7åSä‘ã ãŸâbâGâFâiâ¡âõâXãÒãYäíäŽå4æßæ”ç<èïè•é3êÉêIëÁëìaì~ìŽìfì+ì¶ë"ëTêcé5èææ^å±ã×áÝßÃÝ–ÛUÙ×ÎÔ—ÒxÐtΙÌñÊwÉFÈIÇžÆ.Æ Æ.ƘÆ@Ç+ÈIɧÊ.ÌåÍÀÏÀÑÙÓÖXصÚÝßâŠäç‘éì–îñŽóösøÛú;ý—ÿä0p§Ø þ 3:A:.ûÐ¥ l"1$æ%œ'E)ç*…,.¦/'1§24†5ë6A8’9Õ: <:=L>]?N@2AýA«B431î-l*º&Þ"ÝÌ£~\M XƒÜþcûøõIòÁïoíaëŒé÷ç—æpå~äµã%ã¯âqâHâHâ`â—âââFãºã=äÑälåæ¿æmçèËèséê©ê3ë¨ëìPì}ìˆìsì5ìÎëAë}ê“étè'ç¬åä5âAà-ÞÜÄÙ…×:Õ ÓÜÐÙÎôÌ=ËÃÉzÈyǼÆ=ÆÆ!ƃÆÇýÇÉcÊÞËÍcÏ[ÑqÓ¤Õæ×BÚ¤Üßá䔿éœëî›ðó‹õù÷eúÅü ÿt¼8m ’ ²ÈØÜØÌ¸šwI "Ù#%G'ò(•*4,É-V/ß0Y2Ò3?5£68N9—:Ì;þ<>)?@AÓAŠB C™CìCDDçC‡CèBBý@¤? >!<ø9…7É4Ó1.$+r'¤#¨–vN* Cÿü¿ø±õÓò?ðÞíÉëáéHèØæ¨å¬äÚã@ãÆâ{âPâFâ^â‰âÖâ0ã¢ã$ä³äNåóåœæLçúç©èTéóéêë”ëòëGìqìˆìxì?ìèëYë§êÁé¬èkç÷åYäâ£à”ÞpÜ3Úô׬ÕsÓIÑ8ÏPÍ’ËʼȤÇ߯SÆÆÆlÆûÆÍÇØÈÊ‘Ë;ÍÏ÷Ð Ó2Õz×ÈÙ2ÜœÞá”ãæšèë¡íðòõƒ÷ìùPüªþJ’Êý ) IaqxsmV?îº!€#:%ó&œ(E*ã+z- /‘02‰3ö4`6¹79U:;Á<á=ð>ñ?×@­AfBCƒCÛCDDïCžCCAB5Aì?Z>…À?¨@‡A>BçBiCÊC DDýC¬C)CjBiA2@¨>æ<Õ:{8á5þ2Ü/|,ê(!%†?@UABÅBPC·CþCDD¼CECB¢Al@ý>==A;ô8g6’3z0*-›)ã%ÿ!ü㿘 q ‡¹!þ¯ú÷ôÄñCïíë9é°ç\æAåXä›ããªâiâNâRânâ¬âûâ`ãØãaäïä˜å1æëæçGèëè–é3êÅêHëºëìWìyìì`ìì©ëëBêQé$èÑæIåšãÃáÈ߱݀ÛDÙ׿ԌÒjÐnÎ’ÌíÊyÉFÈOǤÆ9ÆÆ<ƨÆQÇ=È_ɺÊBÌýÍÔÏÙÑðÓ(ÖnØÎÚ0ݪßâ¢ä"ç¥é*ìªî'ñ¢óö„øêúNý¢ÿö?{¹à &=IHI3$ذ q":$ï%¢'L)ï*Š,.©/01©24Œ5é6I89Ù: <8=M>W?O@+AùA¢B7C¤CðCD DÌC_CµBÑA®@D?œ=£;m9è6"41Ñ-R*ž&Ä"ŲŽjI= IwÓþXûøõLò¾ïqíbë’éúçŸævå…ä¾ã+ãºâwâQâQâhâ âéâNã½ãGäÔätåæÁærçèÍètéê«ê,ë¥ëìFìvì~ìgì*ì¾ë2ëmê€écèç›åîã!â+àÞíÛ´Ùq×-ÕúÒÑÐÑÎëÌ;ËÁÉ{ÈÇÀÆKÆÆ2ÆÆ.Ç È#ÉvÊóË¥ÍxÏqÑˆÓ·ÕØTÚ½Ü,ߤá&䣿+é­ë-î­ð'óšõøoúÚü.ÿƒËHw ¡ ¾ÕãçâØÁ¦Q "Þ#›%M'ø(*<,Ì-_/à0`2Ö3B5¦68P9–:Ð;ú<>#?@AÒABCŒCãC D DÛCsCÛBüAì@Œ?ñ= <Ü9k7²4±1}.+\'ˆ#„Z> 6ˆÿü¿ø¨õÕò;ðãíÇëìéFèáæ®å²ääãEãÐââYâOâdâ“âÛâ9ã©ã+ä·äVåó奿Kçþç«èRéôé‹êëëðë<ìlì}ìlì6ì×ëMë•ê¯éèUçâåFäyâ“à~Þ^Ü!ÚãןÕdÓ>Ñ1ÏIÍËʺȫÇäÆ]Æ"Æ+ÆyÆ ÇÞÇìÈ1ʨËOÍÏ Ñ!ÓIÕŽ×âÙAÜ·Þ&á«ã'æ­è.ë³í-ð®òõ”÷üù_üºþY Ö / Zj|ƒ€tcF!û¿!Š#@%û&£(L*é+~-/’02‡35]6¾79V:‘;Â<Ý=ð>í?Ò@«A\BÿBwCÔCDDãCŒCúB+B%AÒ?F>l¸?©@{A@BÛBcC¿CýC DìC¡CC[BTA@>Ð<¸:e8È5ß2Ä/_,Ï(%!!Ù·  š¸ödýúÚöðó=ñÌîšì¢êêèlç&æå6ä‚ãýâ¡âfâTâZâ€âÀâã~ãöãäå¸åZæç²çlè é¶éQêÜê`ëÆë!ìVìyìpìNìúëƒëàêê éÓçxææä0ãOáPß1ÝÛÀØ€ÖCÔÒûÏÎ4ÌÊ6ÉÈ.ÇÆ6Æ"ÆZÆÎÆÇ|È´ÉˬÌeÎMÐOÒtÔªÖûØTÛÄÝ1à´â-å³ç6ê¸ì8ï¶ñ*ô¢ö ùtûÎý(wºþ, ` € œ°¶»°£ŠfC !×"–$L&þ'¥)H+ß,t.ù/1ô2n4Ò557‰8Õ9;J‰?w@WABÀBGC¯CòC DöC­C5C~BAY@å>&=);Ú8M6w3a0 -…)Æ%è!âΧŠh g v³þ¬úx÷ôÃñBïíëAé´çdæHå^ä¤ãã³âqâXâWâzâ³âãhãßãfäùä˜å;æéæ—çAèóè’é2êÅêBë·ë ìMìrìsìUì ì›ëë4ê>éè½æ5å†ã°á±ßžÝlÛ5ÙíÖ³Ô|ÒdÐdÎÌéÊzÉGÈXǧÆEÆ#ÆKÆ·ÆbÇNÈsÉÏÊXÌÎëÏëÑ Ô;Ö‡ØàÚIݺß6â³ä7ç¸é=ì¼î8ñ´ó#ö—øøú_ý¯ÿHŽÀò  1JQVR>- â¹ y"C$ò%®'O)ø*,&.¬/51¬2"45ì6J8’9Ø: <4=L>W?H@+AðAB/C™CçCDûC¾CMC¤B½Aš@-?†=‰;U9Í6 4þ0¶-9*‚&­"¬›zU:, =mÇþUûøõJò¾ïtíeë•éè£æå‰äÇã3ãÁââXâZâqâ§âñâUãÅãMäÚä{åæÈærç"èÎèréê£ê.ëœëÿëAìlìtì[ìì±ë!ë]ênéPèþæ†åÚãâà ÞÙÛ£Ù`× ÕêÒÌÐÄÎéÌ8˾ÉÈ…ÇÄÆXÆ$ÆAÆŸÆ=Ç È6ÉŠÊ̻͌ψўÓÍÕØlÚÏÜCß¶á:䏿<éÁë=îÁð4ó®õø„úäü@ÿŽÝV‚ ® Éáëóíá̬‰Z %"ç#¡%T')£*@,Ô-a/æ0d2Ú3C5«68U9—:Í;ü<>#?@þ@ÉA|BC†C×CDúCÏCbCÈBîAÒ@z?Ú=ð;Ç9N7˜4—1`.è*A'm#xfK$ú ý,|ÿÿû¶ø§õÑò<ðåíÉëñéKèèæµå¹äîãJãÛâŠâaâZâhâŸâßâDã®ã0äÁäWåþ塿Rçÿç¬èUéñéŒêë‹ëéë5ìeìqìdì&ìÉë>ëƒê é†èDçÏå1äeâ|àkÞJÜÚÒ×ÕZÓ1Ñ'ÏD͈ËʺȰÇêÆeÆ.Æ7ÆŠÆÇñÇýÈGʽËbÍ3Ï#Ñ6Ó`Õ¥×ôÙ\ÜÆÞ@á¼ã<æÁèBëÅíAð¿ò/õ¨÷úsüÈþh­å A _|…‰€mO.þË!‘#H%'©(S*î+‡-/02’3ý4d6¾79W:“;¿<ß=ì>ê?Ñ@¢AXB÷BmCËCøCþCØCyCêBBA¼?1>Q<6:Î7"522/™+ú'/$? 4õÖÀ Èç7¨ü^ù9öbó¹ðWî2ìKêœè,çïåéäälãíâšâgâYâgâ“âÒâ0ã–ãä¢ä:åÜ傿/çÞçŠè0é×éiêúêoë×ë'ìYìtìaì9ìÙë[ë©êÌé¿èƒçæƒä¿âÝàÒÞµÜ}ÚBØþÕÅӜьϠÍÜËNÊùÈßÇÇzÆ6Æ4ÆuÆÿÆÃÇÉÈÊsËÍ×ÎÁÐÐÒòÔ3׃ÙãÛOÞÄà?ãÂåCèÆêHíÇïAòºô*÷”ùûûRþ¬÷9z¨ × ÷ $&* óÎ¥q!9#ò$«&X(þ)Ÿ+5-Å.N0Î1E3¸46|7Î8:V;‚<§=¶>¹? @}A1BÙBVC¹CîCDÞCCCDBDA@€>³<¡:K8¨5Ë2¤/E,³(î$!æÆ¤ Ž©í\ýþùÖöîó;ñÎî›ì§êïèrç+æå;ä‹ãã©âqâ\âbâŠâÈâã†ãýã†äå¹ådæ ç½çfèé³éMêÞêVëÉëìWìhìkì>ìîëvëÌêûéóèÄç`æÕäã=á8ß!ÝìÚ³ØnÖ5ÔÒòÏýÍ1Ì›Ê6ÉÈ3Ç•ÆBÆ/ÆfÆàƛǓÈÅÉ(˾Ì~ÎaÐhÒˆÔÀÖÙiÛÙÝHàÆâBåÉçFêÎìHïÇñ=ô±öù„ûÜý9Ë ; l Š ª¹ÃÅ»¬•nN!á"œ$V&(­)K+è,v.01þ2m4×567‹8×9;Gˆ?r@QAB¶BAC¢CéCûCèCŸC!CnBuAH@É>= ;Ã806^3C0ó,h)­%Í!̶”tY V k¤þ¤ús÷|ôÂñDï íëEé»çiæQådä®ãã¾âwâcâ]â…â¶â ãnãåãnäþäœåAæëæ—çHèïè”é1ê¾êBë¯ëìGìfìkìIìüë‘ëëê'ê'éè¦æ$ånãá›ß‹ÝYÛ!ÙàÖ ÔtÒUÐ^·ÌèÊxÉMÈXdzÆKÆ2ÆXÆÈÆqÇdÈ„ÉåÊlÌ&ÎÐÒÔTÖœØõÚ`ÝÎßKâÅäMçÊéOìÐîHñÇó4ö§ø ûkýÂÿY›Í  COa_YM2ì¾ †"G$ý%²'X)þ*•,).´/71²2$4’5ï6K8•9Ö:<1=M>Q?F@$AìA–B%C’CÚCùCìC¯C ?@ú@ÃAvB C|CÍCôCïC¾CRC¶BÙA¾@d?¿=Ú;«947}4|1C.Í*&'T#\R1óè ð qÿùû°ø£õÐò<ðæíÍëòéSèìæ¼åÀäôãVãáâ“âiâaârâ¦âéâKã´ã9äÃä`åþ嫿Pçè©èWéñé‰ê ë„ëæë+ì`ìcì\ìì¿ë+ëvê‹éuè/çºåäNâiàVÞ5ÜÿٽׂÕIÓ&Ñ"Ï8ÍŠËʾȵÇðÆrÆ6ÆHÆ–Æ0ÇÈÉYÊÓËzÍFÏ<ÑJÓyÕ·×ÚlÜàÞQáÓãPæÔèVëÕíVðÎòDõµ÷ú‚ü×þ,xºò& L m†š“ŒuZ5 Ô!—#R% '±(Z*ó+Œ-/Ÿ02–3þ4i6¿79Z:;Â<Û=ë>å?Í@œATBìBhC½CîCðCÊChCÙBBû@¨?>=<:·752ä.+ß'$' ÝÅ® ¹Û)¥üRù:ö[ó»ðXî5ìLê£è0çöåðäätãõâ¤âoâcânââØâ9ãžãäªä>åâ冿3çßç‹è2éÖéhêöêkëÓë ìRìhìZì'ìÐëHë›êºé®èpçæmä«âÇà¿Þ¡ÜlÚ0ØïոӎфϗÍÚËLÊ÷ÈèÇLjÆ@Æ?Æ†Æ ÇÖÇÛÈʇË&ÍìÎÚÐãÒ ÕIטÙùÛcÞÙàVãÔåWèÙêZíÚïRòÍô7÷©ùüfþºI‡´ æ  +52)ùܪ|!>#ü$³&_(*¥+9-Î.P0Õ1I3»46~7Ï8:V;ƒ<¦=´>´?Ÿ@tA0BÍBPC®CâC÷CÌCCôB1B0Aí?h>™<‹:-8’5«2Œ/',›(Ò$ï çÑ®“z }àSýùùÑöéó=ñÍîžì«êòèyç2æ!åDä‘ãã±âyâdâkâ’âÎâ%ãˆãä‹ä"åÂåcæç»çièé±éOêÙêTëÀëìJìcì^ì2ìáëfë¼êèéãè­çPæ»äã$á&ß ÝÛÚžØ`Ö$ÔûÑæÏöÍ,̘Ê7ÉÈ7ÇŸÆJÆ<ÆvÆðƮǥÈÙÉ=ËÕÌ“ÎwÐÒŸÔ×Ö'Ù€ÛíÝ_àÙâ[åØç^êÞì[ïÜñMôÅö+ù’ûðýD“ÛN t ±ÉÌÒÅ·œ}R!é"£$`&(¶)Q+í,}.0‡13t4×5=7Š8Û9;I„?o@LA B±B7C›CÞCíCÝCŒCCXBcA1@µ>ø<ô:¥86A3'0Ø,K)“%²!²ž~^H E \™þšúr÷uôÁñEïí ëHé¿çræTånä´ã'ãÂâ†âeâkâŠâ¿âãvãìãuäå¤åEæïæœçGèñè•é0ê¼ê@ë§ëì<ìaì^ì<ìóë}ëàêêéëç”æ å]ã„á‰ßuÝDÛÙÌÖ“ÔgÒIÐW΀ÌåÊyÉKÈbǸÆWÆ=ÆgÆÕƇÇsÈ›ÉùÊ‚Ì<ÎÐÒ5ÔhÖ´Ø ÛuÝæß_âÛäaçÝéeìàî_ñÖóGö¶øûzýÒÿ!g©Ü 0 L_kkeW="õÇ ‘"K$ &´'d)+œ,/.¸/=1¶2*4‘5ö6J8—9Ù: <3=K>O?C@ AäA‘BC‰CÎCíCàCœC.C|B˜Am@?T=Y;9™6Ð3Ç0-*N&w"|kL/ X³þEû ø õGò¿ïvínëœé è¯æå˜äØãBãÔââkâjâ‚â¹âÿâeãÔãYäçäƒå$æÏæxç'èÏètéê¡ê%ë”ëðë3ìYìaìAìì”ëë<êGé*èÖæ[å±ãááíßÜݳÛÙ<×ÕÐұиÎ×Ì8˷ɈȉÇׯhÆ?Æ[ÆÀÆ^ÇFÈ]ɶÊ1ÌèÍ·Ï·ÑÉÓüÕAØ—ÚþÜkßåá`äâædéçëeîäðYóÑõ<ø¥úý`ÿ­ù7o¡ à åöõàšm 5"÷#²%c' )²*K,á-l/ï0n2à3N5¬6 8S9œ:Î;ù<>?@ó@½AsBýBwCÁCçCäC«CEC¢BÅA«@H?­=¼;“97_4c1&.±* '7#E7úâÕ ähÿñûªø õÎò=ðçíÏëøéWèóæÃåÆäÿã[ãìâ›ârâjâ{â¯âïâSã»ã@äÊädåæªæ[çè°èSéòé†ê ë€ëÝë(ìQì_ìKì ì®ëëeêxébèç¥åä;âQàDÞ ÜëÙ®×qÕ>ÓÑÏ5̓ËʽȺÇöÆ|ÆBÆVÆ¥ÆBÇÈ'ÉnÊçËÍ^ÏRÑaÓÕÎ×$Ú„ÜôÞháçãeæèègëíídðäòRõÆ÷+ú’üåþ@Ë0 \ yŸ£ ”€d= Ú!¡#Z%'¼([*,Œ-"/¡0%2”3 5d6È79Y:”;»<Þ=å>å?Æ@˜ALBåB\C¶CÞCèC·C[CÃBóAå@?> <:š7ê4û1Ë.`+Å'ø# îȱŸ ¨ÑœüNù3ö\ó¸ð\î7ìOêªè4çÿåöä$äzãã§â|âiâyâ¡âäâ>ã§ã%ä¯äCåèåˆæ9çàçè4éÒéjêðêjëÊëìGì_ìMììÃë7ëŠê§é™è[çñåVäšâ­à°Þ…Ü_ÚØãÕ¦Ó‡ÑvÏ“ÍÔËJÊûÈéÇÇ“ÆGÆPÆ“Æ ÇéÇïÈ-ÊË<ÍÏñÐùÒ$Õ]×±Ù Ü{ÞðàhãìåièïêlíîïcòßôJ÷·ùüsþÉW”Å î '9?<5฀!L#%º&g( *¬+B-Í.[0Ô1Q3»4$67Ñ8:U;‚<¥=±>²?›@nA+BÅBHC CÝCáCÆCjCçBBAÓ?R>ñÍî¡ì­êúè|ç;æ%åPä–ãã¸âƒâkâvâ—âÙâ*ã”ã ä”ä)åÃåmæçÃçièéµéKêÕêSë¶ë ì?ì[ìQì'ìÒëWë«êÖéÏèœç6æ¬äíâáßöÜÈÚŒØOÖÔìÑàÏêÍ-Ì’Ê;ÉÈ>Ç©ÆSÆLƃÆÇÁǸÈïÉSËê̪ÎДҶÔðÖ:ÙšÛÞuàïânåíçsêîìrïêñaôÔö<ù¤ûýýV£ä(T ‡ ¤ ÁÒÚÚÒÀ¨ƒ]'!ò"ª$g&(¼)Y+ó,. 0‹13u4Ü5<7Ž8Ú9;G‚?k@EAB¦B/C‘CÍCæCÇCƒCýBIBLA@œ>á<Ù:Ž8ù5&3 0º,2)w%—!œ…kJ7 5 O‘øý™úg÷xô½ñGï íëMéÆçvæ_åsä¿ã.ãÍâŠârâqâ‘âËâã~ãôãwä å¥åKæòæŸçIèñè•é-ê¼ê9ë¤ëüë5ìYìQì3ìàësëÌêêéÙçæùäEãqáußaÝ4ÛüؿքÔYÒBÐM΀ÌàÊzÉQÈdÇÃÆaÆIÆvÆæÆ˜ÇˆÈ­ÉË—ÌSÎ/Ð-ÒMÔ~ÖÊØ$Û‰ÝûßtâðäuçðéxìòîqñçóYöÅø,û‰ýâÿ0u·ç : XmrzmaG)þÑ ”"Y$ &À'g)+£,3.¿/@1»2-4•5ø6J8™9Ù: <3=F>N?>@AßAˆBC~CÅCáCÑCCClB„AV@í>7=F;ÿ8ƒ6²3®0b-ç)3&^"bV6û H®þ=û øõGò¿ïyíqë¡éè¶æ“å¢äÞãJãßâ–âxânââ¿â ãlãÙãaäëä‰å'æÒæ|ç'èÒèréêê!ë’ëçë/ìLìWì7ìöë„ëòê'ê9éèÃæGåœãÍáØßÉÝ¡ÛjÙ/×òÔÄÒ«Ð©ÎØÌ.˽ɈÈÇÞÆrÆJÆkÆÍÆtÇVÈrÉÇÊJÌùÍÒÏÉÑâÓÖWØ«ÚÝ~ßüásä÷æwé÷ëzîñðpóÞõNø³úýkÿ¾E~ª Ò ðþêÉ¥t ?"þ#¹%i')µ*T,ä-q/ö0o2æ3N5±6 8U9œ:Ì;û<>? @õ@´AmBôBnC³CàCÒC C2CB³A–@3?”=£;{9ý6F4E1 .—*ï& #+"éÏÅ ×bÿæû§øõËò>ðæíØë÷é`è÷æÊåÑääiãïâ¨âxâtâ‚â·âøâZãÂãGäÎälåæ±æ[çè°èSéòéƒêë|ë×ë!ìJìTì?ìì ë ëVêcéRèç“åðã)â9à2Þ ÜÛÙœ×aÕ0ÓÑÏ/Í~ËʾȾÇþÆ‚ÆQÆ_ƸÆPÇ&È;É‚Êü˧ÍqÏjÑwÓ¥Õå×8ÚœÜß}áûãzæúè}ëûízðñògõÓ÷@úšüýþE™Ñ< j „©°«žŒkI ç!¥#e%'Ã(d*,–-$/§0(2š35m6Å79[:‘;Á<Ø=ç>Þ?Ä@“AEBÞBTCªCÕCØC¨CLC±BáAÎ@|?æ= <ç9~7Ð4ß1¯.F+¨'â#ñîÓ¸œ ›Â”üGù3öUó¼ðYî<ìSê®è;çæýä-ä‚ã ã³â‚ârâ‚â¨âîâBã±ã*äµäLåç唿3çéçŠè7éÐéiêëêgëÅëìBìRìDì ì³ë)ë{ê“é‰èEçÝåAä„â›à—ÞvÜIÚ ØÓÕ˜ÓzÑnÏÍÎËJÊúÈïÇÇœÆQÆ^Æ¡Æ3ÇøÇÉAʰËTÍÏÑÓ7ÕuׯÙ"Ü“Þáƒãúåƒèýê‚íýïxòîôZ÷Éù%ü†þÖ#gžÔ ú 4DJI=, î¼!M#%Á&m(*°+H-Õ._0Ù1U3¿4'67Õ8:W;<¢=²>¬?›@dA'B¾B>CšCÌCÛC±CaCÎBBAÁ?:>gýìùÊöâó?ñÊî§ì®êéç@æ/åUä ã#ã¿âŽârâ€âŸâàâ2ã™ãä™ä.åÊåoæçÂçmèé²éJêÕêKë·ëþë?ìLìKììÆëGëœêÄé½è†ç%æ”äÙâÿàùÞåܲÚ{Ø@ÖÔæÑÏÏéÍ#Ì”Ê:ÉÈEÇ®ÆaÆVÆ•ÆÇÔÇÊÈÊgË;ΥЬÒÊÔ×OÙ°ÛÞ‹àãåè…êíƒïýñrôåöNù±ûþb²õ3c ’ ° ÏÜæåÛ̱e0!ù"µ$l&(¿)a+ø,ˆ.0‘13z4à5>7‘8Ú9;Jz?k@>ABŸB(C†CÅCØC¹CtCëB6B:A@Š>Ä<Ä:p8á5 3ï/£,)`%}!€rR8% % A†îý“ú`÷vô¼ñGï íëRéËç}æcåäÂã:ãÒâ–âyâyâœâÐâ#ã†ã÷ãƒä å®åLæ÷æ¡çJèõè’é.ê·ê7ëŸëöë-ìNìIì%ìÖëaë¼êòéïèÈçhæåä2ãYábßKÝ ÛëØ®ÖuÔMÒ8ÐBÎ|ÌÛÊ|ÉQÈlÇÈÆlÆVÆ‚ÆùƥǞȿÉ%˪ÌjÎDÐFÒaÔ˜ÖÝØ:Û Ý àâåˆçêˆìïƒñøólöÕø;ûýíÿA„Âû! M `z€}gV/ Ø  "]$&Ä'o)+¨,9.Å/C1À214˜5ü6L8œ9×:<0=G>I?;@AØA…B CwC¸CÓCÆC~C CYBmAE@Ó>"=*;ç8f6˜3‘0G-É)&?"O6(ÿö ç ;£þ8ûÿ÷õDò¾ï}ínë«éè¿æ˜å¨äèãQãçâŸâ~âzâ’âÉâãuãÞãiäîä‘å*æ×æç)èÒèvé ê¡êëëãë%ìFìKì-ìåëzëÝêê$éè°æ1å‡ã¹áÂß·ÝŠÛ\Ù×çԴҟУÎÑÌ+Ë½É‰È”ÇæÆzÆWÆzÆÙƉÇeȉÉÛÊ_ÌÎæÏâÑ÷Ó)ÖmØÂÚ+Ý”ßâŠäçŽé ìŽîñóòõ]øÇú"ý}ÿËTŠº Þ ýøÏ±{ I"$Á%p')º*\,ç-z/÷0v2è3R5¶6 8Z9š:Ï;ù< >? @î@²AaBóB`C¬CÒCÃC“C CB›A@?y=;\9å6)4(1ñ-w*×&#ñÒ½´ Ç÷WÿßûŸø˜õÈò>ðéíÕëê_èçÐåÖä äoãúâ­âƒâzââ¾âã`ãÊãLä×änåæ´æ^çè±èSéòéêësë×ëìDìIì4ìõëëþêAêVé;èóæ}åÜãâ&àÞùÛÆÙŒ×RÕ"ÓÑÏ&Í~ËþÉÃÈ¿ÇÇŠÆ\ÆmÆÈÆ`Ç;ÈMÉ–Ê̻͉ÏÑÓ¼Õû×PÚ°Üß”á 䑿 é“ë îŒðóvõé÷Kú±üÿY¤â I x «µºµ«’yO$ í!²#i%'É(l*,-'/±0'2¤3 5p6É79_:;À<×=ä>Ý?¾@ŽA=B×BKCžCËCÉCœC7C¢BËAº@h?Ê=õ;Ê9e7³4Ã1”.)+Ž'Ã#Üп ‰~ ж ü=ù0öSó»ðYî@ìUêµè?ç æå2äãã¼â‰â{âŠâ°â÷âJã¶ã3ä¹äSåëå–æ9çêçŒè6éÐéhêéê`ëÂë ì<ìGì:ìì¥ëëgê…éuè3çÈå,äoâ…à„ÞdÜ2Úý×¾ÕÓnÑdÏ…ÍÊËIÊþÈíÇ*ÇžÆcÆfÆ´Æ@Ç ÈÉRÊÊËeÍ0ÏÑ'ÓPÕŠ×ÝÙ8ܦÞá’ãæ‘èë“íðŒòüôo÷Öù7ü”þæ0v­ß 'BQTVD9öÊ’!Z#%Ç&w(*¹+K-Ü.b0à1U3Æ4&6‡7Ó8:W;‚<¢=¯>ª?“@eAB¹B5CŽCÄCÉC§CMCÁBùAð@­?>R<;:à7;5_20/Ü+B(†$Ÿ ž‹pUI PtÂ6ýåùÅöàó;ñÏî¥ì´êé‡çGæ7åXä®ã$ãÎâ‘â~â„â«âæâ;ã ãä ä2åÐåræçÄçoèé³éJêÍêNë©ëì.ìIì<ì ì·ë8ëŠêµé§èvçæäÇâæàèÞÎÜ£ÚhØ3ÖôÓÜÑÅÏâÍÌ‘Ê;É ÈLǶÆnÆ`Æ¢Æ#ÇáÇãÈÊËÍ×κÐÁÒãÔ×hÙÅÛ+Þ àã–åè—êí–ïò‚ôùö[ùÅûþsÀBr ž À Ùéññå׺˜n:!#¼$v&(Ë)d+-Œ.0”1 3}4â5B78Ý9;Hy?f@¯<§:W8Å5í2Ö/ƒ,ú(B%d!hX=&  /~äýŒú[÷tô¹ñKï íëUéÑç„æjå…äËãAãÛâžâ€â…â âÛâ)ãŠãääå®åTæùæ¦çKèôè”é*ê¸ê0ëëìë)ìAìAììËëOë°êÝéßè²çVæÐäãGáJß9ÝÛÕØ¢ÖcÔDÒ*Ð@ÎsÌÚÊ~ÉPÈvÇÍÆzÆ`Æ”ÆǼǬÈÙÉ4ËÅÌ}Î[Ð]ÒxÔ¬ÖøØMÛ¶Ý&àâå˜çê›ìï“ñ ô{öèøKûªýþÿN’Ò 3 V o„‹‚yW?á ©"f$&Î's)+ª,C.Å/L1Â254š5ý6O8›9Û: <2=C>H?6@AÔAzBChC±CÅCµCqC÷BHBZA,@¿>=;Ë8K6}3r0.-«)&&"3#ïà Û ø0›þ/ûû÷õ?òÄïxíyë©éèÀæ£å®äñãZãîâ«â„â„âšâÎâãwãëãläöä•å0æÚæ‚ç,èÒèué ê›êë…ëàëì?ì@ììÛëhëÑêêéìçœæårã£á¯ßŸÝ{ÛEÙ ×ÔÔ«Ò“ÐÎÊÌ*˻ɌȚÇîÆ„ÆdÆ…ÆîÆ•Ç{È›ÉñÊtÌ(ÎûÏúÑÔ@Ö„ØÚÚ=ݯß!â¡äç éìžîñóöoøÕú4ý‹ÿÛ"a˜Æ ë ')$ÿܸ‡ M"$Ä%}' )Ä*`,î-}/þ0w2ï3T5¶68W9ž:Ì;ù< >?@è@­AYBéBWC¡CÄC¹C}CCkBŠAl@?c=t;C9Ì6 41Ð-a*¹&ë"úðÛ¾«¤ »ëOÿ×ûœø”õÊò;ðííÚëêjèçÙåÞääwãã¶âŒââ˜âÂâ ãdãÓãPäßäqåæµæcçè´èSéðé}êëmëÑë ì9ìAì'ìèëëîê0êCé(èàægåÉãýáà ÞåÛµÙ{×DÕÓýÐùÎ&ÍxËÿÉÇÈÄÇÇ”ÆhÆ}ÆÕÆtÇIÈdÉ«Ê'ÌÓ͞ϗѤÓÓÕØgÚÇÜ2ß©á"䢿#é¢ë#îðóŠõõ÷_ú¼üÿe´ï,W ƒ œ¶ÀÅÁ²ž€[+ ÷!·#r%%'Î(s* ,£--/³0.2¤35r6É79\:’;¼<Ø=ß>Û?¸@‰A7BÍBBC”C¾C½CŠC+CŒBºA¥@O?¸=Ø;´9H7›4¦1{. +u'©#»ª‹ym }«„ü<ù)öSóºð^î?ì^ê´èLç æå7ä–ããÄâ“â„ââ½âúâTã½ã9ä¾äZåï囿<çêç‘è4éÑécêèê\ë»ëì0ìBì+ìöë–ë ëVêrébèçµåäYâràmÞRÜ Úë×±Õ€ÓbÑ^Ï}ÍÈËGÊÿÈöÇ+ǬÆkÆvÆÃÆOÇ!È)ÉhÊÞË|ÍDÏ6Ñ:ÓiÕŸ×òÙPÜ»Þ.á¨ã&æ¦è&ë§í#ðšòõ{÷éùHü¡þ÷>ƒ»ï  5K]^cLCÏ!`#%Ï&|( *¼+V-Ü.j0à1]3Æ4*6‰7Ò8!:Q;†<›=¯>¥?@_AB¯B.C‚C·C½C–C?C¬BæAÛ@–? >9<#:Ã7&5:2/¸+.(h$‰ †t]A: @h¸/ýàùÀößó:ñÓî¤ì½êé’çKæ>ådä²ã1ãÕâšâ‡ââ¯âòâAã§ã"ä£ä<åÐå{æçËçlèé¯éGêÎêEë©ë÷ë&ì>ì1ìì©ë(ë{ê¡é˜è`çþåiä³âÐàÖ޹ܑÚXØÖîÓÈÑÃÏØÍÌÊ:É'ÈRǾÆxÆoƲÆ1Ç÷ÇðÈ,ÊË,ÍéÎÒÐ×ÒøÔ4×|ÙÜÛAÞ´à-ãªå+è©ê*í§ï ò˜ô÷pùÒû-þƒÎL‚ ¨ Î ãôÿ÷õÛÈžxB!#Å${&&(Ñ)i+-.0˜13~4é5>7š8×9;Bx?`@7AñA”BCuC¬C¾C COCÍB BA×?X>—<Œ:?8©5Ó2º/h,à(&%N!MD(  )máýú\÷nôºñKïíë\éÔçŒæqåŒä×ãFãèâ£â‹âŒâ¨âåâ.ã—ãääå´åXæüæ¦çPèôè’é*ê²ê.ë—ëæëì:ì5ì ì»ëCëœêÏéÊè çBæ¸ä ã,á<ß"ÝüÚÈØÖZÔ2Ò%Ð4ÎsÌ×Ê~ÉVÈyÇØÆ‚ÆnÆ¡ÆÇËÇÃÈèÉMËÙÌ“ÎsÐqÒÔÂÖ ÙdÛÌÝ;à±â0å­ç/ê®ì+ï§ñôŽö÷ø[ûºý[£Û = d z—˜Ž‚aIì ®"o$$&Õ'|)+µ,C.Î/N1Æ2:4œ57P89Û: <0=@>E?4@ AÐApBýB_C¤CºC§C`CçB6BEA@§>ð<÷:´8/6c3X0-’)å% " úÛÏ Î è(þ'ûù÷þô@òÂï}íyë°é"èÈæ¨å·äøãbãùâ¯âŽââ¡âÛâã€ãóãnäå“å:æÚæ†ç-èÒèué ê˜êëëØëì4ì7ììÌë]ë¼êùéýèÞç…æ å]ãŽá›ß‹ÝiÛ1ÙÿÖÅԜҋБÎÉÌ$˽ÉÈ¢ÇóÆÆoÆ“ÆÿÆ¥ÇȯÉËŠÌ>ÎÐÒ#ÔVÖšØðÚSÝÁß:â±ä4ç°é3ì¯î-ñ óöøäúGý—ÿî.q¥Ñ û )14.齑 U"$Î%‚'()É*g,ó-‚/1z2ô3W5¸68Y9ž:Í;÷< >?@ä@¦AUBßBPC•C¹C©CsCCXByAR@ô>G=^;%9³6î3ö0µ-E*œ&Ó"ÜÜ­—– ¨ä@ÿÓû”ø’õÆò>ðëíÞëêmè çàåãää}ã ã½â”âŒâ›âÐâãqã×ãYäãäyåæ½æaçè­èZéêé€êýêlëÈëì0ì7ììÜërëÞê!ê/éèËæSå´ãçáþßóÝÑÛ¦Ùe×:ÕÓóÐòÎÍtËÊÅÈÌÇÇ ÆrƉÆçƃÇ_ÈuÉ¿Ê>ÌæÍ·Ï«Ñ»ÓéÕ(Ø}ÚÛÜJß¾á6äºæ2éºë2î°ð*ó™õ øoúÌü'ÿw¿8g ªÂÉÓɾ«…h0 "¾#{%,'Õ(z*,¨-2/¹002ª35t6Î79^:‘;½<Ó=á>Ñ?º@}A6BÀB£?‹@YAB«B!C{CªC°CˆC-CœBÑAÈ@?ò=!<:­75&2þ. +(O$n n_E1& 3[­'ýØù¼öÞó8ñÔî©ì¾ê é•çRæGåiä½ã7ãÜâ¥ââ—â¹âöâJã®ã'ä«ä?åØå{æ!çËçpèé°éGêÉêCë£ëíë"ì2ì(ìòëžëëlêé‚èQçãåXäâ»àÃÞ¤Ü~ÚGØÖßÓ¿Ñ·ÏÒÍÌŽÊ=É)ÈWÇÈÆ‚Æ~Æ¿ÆCÇÈÉ=ʧË@ÍÏèÐîÒÕHוÙïÛXÞÊàAãÀå=è¿ê<íºï2ò¦ô÷ùàû@þÝ ZŽ ¶ Ú îÿåѨI!#Í$&0(Õ)r+ -•."0œ134é5D7–8Ý9;Fs?\@3AéABCmCœCµCŽCAC»BùAÿ@Â?B>B?.@AÇAkBôBTCšC«CœCMCÙB B3A@>Ø<ß:™86F3?0ò,{)Ç%ø!ÿùÞ϶ à Ø†þ#ûò÷ûô@òÂï‚í|ëµé%èÑæ®åÀääjãã¸â˜â“â«âáâ&ã‹ãôã{äåŸå9æáæˆç,è×èqéê“êëzëÓë ì*ì/ììÂëIë²êãéïèÇçuæóäKãxáˆßwÝXÛ ÙïÖµÔ“ÒÐŽÎÁÌ#˾ÉȧÇüÆšÆ{Æ£ÆǶǣÈÁÉË ÌRÎ)Ð&Ò8ÔnÖ­ØÛfÝÚßIâÊäEçÇéCìÄî<ñ³ó%öøõúTý¨ÿø?|³Þ  !1@:<%ïÇš \"!$Ö%†'2)Ì*m,ú-„/ 12ô3[5»68]9œ:Î;ö<>?@Ú@¤AJBÙBCCC§C¢C]CóBEBdA@@Û>3=@;9’6Ú3×0œ-**ƒ&¹"ɱ•‰… Ÿ×8ÿÍûø’õÂòBðìíäë êtèçååðä ä‹ããÊâœâ’â©âÑâãrãâã^äèä}åæ¿æeçè²èVéëé}ê÷êkë¿ëì$ì.ììÏëcëÑê ê!éè¶æDå™ãÚáæßáݿۓÙX×(ÕúÒæÐìÎÍrËÿÉËÈËÇ!ǤƃƔÆùÆ’ÇsȇÉÔÊTÌùÍÑϾÑÓÓþÕ>Ø‘ÚòÜ]ßÓáLäÊæIéÉëFîÄð6ó¯õø€úÛü6ÿ…Î Fs ˜ ºÆÜÖÚij“j@ "Ë#~%6'Ú(‚*,°-6/½072©35v6Î79_:;¾<Ð=Ü>Ñ?²@{A,B»B1C|C§C CoCCjB’Ay@%?‡=§;97b4s1?.Ú*='t#“‰€cRN `“îÿtü0ù$öOóºðaîFìeêÁèUç æåKä£ã,ãÕâ£â•â âÎâ ãeãÈãGäÌäaåú墿Bçòçè7éÏé^êáêUë­ëøëì-ììÝëxëîê5êNé<èùæ‰åòã.âKàEÞ*ÜþÙÈדÕfÓLÑLÏqÍÂËEÊÉýÇ;Ç½Æ…ÆÆâÆrÇDÈQÉ‘Ę̂ÍqÏ`ÑjÓ“ÕË× ÚyÜæÞWáÒãMæÏèLëÌíFðÀò1õ¡÷úiüÀþ]Ø 1 MdsuufS4ã®!o#,%Ü&‹(,*Ê+]-ì.o0î1`3Î436ˆ7Ú8:U;‚<™=ª>ž?ˆ@QA BŸBCnCŸC£CxCCˆBÀA³@g?Û=<ï97î42ã.‡+ò'8$S WH3 #Q¡!ýÒùºöÜó8ñÔî®ìÀêé™çZæNåsäÂãDãââ¯â–âŸâÄâûâTã´ã.ä±äDåÜåæ#çÌçsèéµé>êÌê:ëŸëéëì,ììçëëë\ê{étè7çÕå@äŠâ§à­Þ’ÜlÚ4ØÖÑӵѬÏÎÍÌÊ<É.È^ÇÒÆ‹ÆŒÆÍÆUÇÈÉRʽËSÍÏùÐÓ#Õ`שÙÜlÞßàUãÔåQèÒêOíËïEò·ô(÷ùóûKþŸë.f À æ û ñ×´‡U!#Õ$ˆ&7(Ú)z+-Ÿ. 0¥13†4í5D7˜8ß9;Fp?Z@*AæAƒBC`C•C¥CC3C§BèAì@©?/>a<`:8x5š2„/2,¨(õ$!!åå åYÎýwúR÷gô¾ñHïí"ëaéæç“æ„åšäçãWãøâµââœâ»âñâBã ãä–ä'å¾åaæç®çOèøèé&ê®ê&ëŒëÙëì'ììóë¡ë#ë€ê©é¨èyçæ‘äßâ áßþÜÕÚ£ØpÖ<ÔÒÐ*ÎdÌÙÊ{É`ȆÇåÆœÆ„ÆÁÆ8ÇïÇçÈÊuËÍÀÎРҺÔñÖ5Ù’ÛöÝdàÞâTåÙçSêÕìPïÉñ@ô¬öù{û×ý,x¿÷0 S  ©ª¯¢•wY+ú Á"|$6&à'‹)&+Â,J.Ý/Q1Õ294¨57W8œ9Ü: <,=?>Ã<Á:„8÷5.3"0Ù,^)°%Ü!èã˹© ® Ñþûï÷ùô>òÅïíë¸é-è׿µåÉääxããÈâ›âŸâ²âèâ/ããýãä å å?æãæŠç2èÔèséê•ê ëyëÊëì#ì!ìüë±ë?ëêÖéÙèµçaæÝä7ãcáqßhÝ>ÛÙÙÖ¬Ô„ÒuІκÌ#˼ɔȬÇǦƇƱÆÇÉÇ´È×É,˸ÌfÎ@Ð;ÒQÔ‚ÖÅØÛ}Ýîß^âßäWçÜéUìÙîKñÈó3ö øû_ý¼ÿOоï /;KFE0ùÒ  f")$Û%‘'3)Û*k,.ˆ/ 1‡2ó3`5¿68]9:Ì;ö<> ?ü?Ú@˜AGBÎB;C€CC‘CPCáB3BPA)@Å>=+;õ8y6½3¼0ƒ- *l&›"±¬˜„vs ”È2ÿÂû‹ø‹õÅò=ðñíäëêzèçïåóä,äããÏâ¦ââ­âÞâ ã|ãéãbäðäå"æÁæjçè²èWéêéyê÷êbë½ëøëì"ììÂëTë¿êþé éðç¢æ+å‰ãÁáÓßÌÝ«Û~ÙL×ÕñÒ×ÐæÎÍpËÿÉÊÈ×Ç ÇµÆˆÆ§ÆǦDžȚÉëÊeÌÎßÏÛÑåÓÖSبÚÝrßéá_äßæ]éÛë]îÐðOó¸õ,øúìüHÿàV} ª ¿ÛàèÞÓ»œvD "Î#Š%;'á(‡*,´-;/Á0;2®35w6Ò79_:‘;¹<Ò=×>Ï?«@wA#BµB&CrCœCCdCñB]BzAj@ ?r=Œ;f9û6F4X1$.»*&'Y#zrhNB< R‡ãÿlü,ùöPó¸ðbîIìgêÈèZç'æ#åRä­ã4ãÜâ®â›â¬âÓâãiãÒãLäÔäd忢æHçðç’è7éÌé`êÚêSë¤ëóëì#ì ìÍëmëÜê%ê>é&èèætåÝãâ7à/ÞÜçÙ¼×Õ\Ó?ÑEÏjÍ¿ËCÊÉÈCÇÆÆÆ¢ÆìƆÇWÈaɪÊ͇̿ÏvÑ€Ó©Õä×2Ú“ÜøÞqááãhæÝècëÜíZðÐòBõ²÷úxüÐþ!k¬â 9 \n€€p\?ìµ!y#1%è&(6*Î+e-ï.u0ï1g3Ð446‹7Û8:T;‚<—=§>œ?‚@MAB—BCdC“C”CkC CxB«Až@S?Ã=î;Ö9u7Ó4ë1É.i+Ù'$9 B/  B™ýÌù´öÚó8ñÖî®ìÆêé¡ç`æWåwäÏãFãðâ´â â¦âËâãXã½ã4ä¹äGåå倿*çÏçsèé¯éBêÅê7ëšëßëì ììÜë€ëøêMêfédè!çÃå*äuâ“à˜ÞÜXÚ#ØóÕÃӧѧÏÂÍÌŠÊ?É2ÈdÇÙÆšÆ•ÆàÆbÇ.È*ÉiÊÏËnÍ,ÏÑÓ<Õw׿ÙÜÞõàkãçåfèåêbíàïTòÌô5÷£ùü\þ°ö@r« Ð ñ "üà¿[!"#Û$&@(Þ)ƒ+-¢.(0§134ë5K7˜8ß9;En?R@(AÞA|BùBTC‹C•CuC C–BÖAÓ@–?>O;?(@û@½AZBãBBCC”CzC5C°BÿAA×?a>ª<©:g8Ü530½,A)–%¿!ÓÆ·¤– ¡ ¿tþûé÷ôôAòÀï‡í‚ë¾é0èÞæ¼åÏääzããÉâ¨â¥âºâòâ6ã—ãä‡ä å©åBæçæŽç2èØèpé êŽêëpëÅëýëììîë¥ë/ëêÂéËèžçOæÉä"ãMá`ßQÝ.ÛÙÉÖžÔyÒkÐζÌË¾É–È±Ç Ç®Æ”ÆÀÆ,ÇÜÇÇÈëÉBËÌÌ}ÎWÐRÒhÔ—ÖÝØ1Û“ÝàtâðäpçêéoìâîeñÔóGö°øûqýÈÿ[™Ìú  ;GVSM>$Ý¥ u"*$ê%“'=)Ý*v,.’/1ˆ2ý3]5Å68b9›:Î;ó<> ?ù?Ñ@—A;BÈB1CsC“C€CDCÌB$B:A@°>þ<;Ø8a6¡3¡0e-ó)O&‚"™’„pbh €Á%ÿ½û…øˆõÃò>ðòíæëê}èçôåüä4ä˜ã$ãÚâ¬â§â´âåâ)ãƒãïãkäôäˆå%æÆæmçè¶èTéëévêóê^ëµëóëììúë²ëHë°êëéûèÛç’æåvãªá¿ßºÝ—ÛnÙ9×ÕâÒÏÐÜÎ ÍmËÿÉÍÈØÇ,ǺƚƱÆǷǖȲÉüÊÌ&ÎûÏïÑýÓ,ÖkØ¼Ú Ý†ßýáväñæséíënîåð]óÎõ8ø¡úüüUÿ¢ê)` ² ÏäìôèÞÅ¥L "Ö#’%@'é(Ž*$,º-A/Å0@2²35y6Õ79`:‘;¹<Ñ=Õ>Ê?¨@qAB°BCkCC„CQCäBGBhAR@ô>Y=v;I9á6+4<1.£*'F#[^O<-, CyÜÿaü(ùöMóºð`îNìjêÍè`ç,æ+å[ä´ã:ãçâ´â§â²âÛâãqãÚãRäÚäj忍æJçõç”è6éÍé\êÚêLë¡ëéëììì¾ëaëËêê*éèÕæ^åËãâ"àÞÜÙÙ¦×uÕKÓ5Ñ;Ïe͹ËDÊÉÈJÇÎÆœÆ«ÆþÆ—ÇhÈwɼÊ/ÌÕÍŸÏŠÑšÓ½Õü×JÚ¦ÜßáýãuæöèvëïínðáòVõÂ÷(úˆüàþ0|¸ó" H f~†‘†}fI#õ¾!€#;%ë&™(8*Ø+h-õ.z0ó1k3Ò496‹7á8:Z;|<š=£>š?}@IAúA“BC[C†C‡C]CúBhB•AŠ@êÃê4ë’ëÜëìììÐëqëíê7ê[éLèçªåä[â‚à‚ÞkÜHÚØãÕ¶Ó›ÑœÏ¿Í Ì‹ÊAÉ3ÈnÇáÆ¥Æ¢ÆðÆsÇAÈ?É|ÊæË‚ÍDÏ+Ñ2ÓRÕ×ÖÙ4Ü–Þ á|ãæwèúêuíòïhòÜôI÷²ùülþ¿L„³ á ù  +% èÇ›b!.#ß$œ&A(ê)…+-©.+0®13Ž4ð5L7š8á9;Dg?S@AÚAtBïBKC}C‰CfCC†BÁA¾@?û=5<&:Ö7<5g2I/û+q(¾$å ðäÖ¼ ÌóC¾ýgúI÷côºñIïí$ëméîç¢æ‘åªäöãiããÈâ¬â«âÍâãQã¯ã#ä£ä3åÊåfæ ç¯çWèôè”é!êªêëëÏëüëììÚë†ëë^ê‡éƒèQçóåfä¸âÜàéÞÓܳڀØNÖ"ÔÒüÏÎYÌÖÊ|ÉgÈÇþƩƥÆÚÆYÇÈ É:ÊŸË0ÍëÎÊÐÎÒæÔ×eÙºÛ#Þàãåÿç{êúìwïëñgôÌö>ù˜ûûýH˜ÙK o – ¬¾Ãú¥h>!Í"’$A&ð'—)3+Í,Y.â/_1×2F4©5 7V8¢9Ú: <(=;>6?&@õ@¸ASBÛB6CxC…CpC C¤BèA÷@¿?M>Ž<“:J8Ä5ô2ì/ ,&)z%¦!¹° ‘ƒ “ ¯þgþûâ÷òô<òÃï‡í…ëÂé4èææÀåÙää‡ãã×â®â­âÄâøâ>ã¡ãäŒäå«åHæíæŒç:èÒèvéêê ëkëÀëôëì ìãë™ëë‚ê°é¹èç9æ´ä ã<áHß?ÝÛóص֓ÔhÒbÐwÎ­Ì ËºÉ›È´ÇǸơÆÏÆ<ÇíÇÚÈüÉ[ËÝÌ–ÎmÐgÒ€Ô®ÖôØGÛ¬Ýàâå…çÿéìùîvñæóYöÃø#û†ýÓÿ)fªØ & HT`_YF/ å± y"6$ï%›'G)â*|,.‘/1Š24e5Á68\9 :Ì;ñ<>?õ?Í@‘A5BÀB&ClC‚CxC.C¿BB&A@”>ê<÷:Á8D6…3…0H-×)3&h"}{k\MV q´ÿ³û~ø†õ¼òAðñíéëê‚è"çýåÿä?äœã1ãÜâºâ¨âÃâèâ4ãˆãøãoäüä‹å-æÈæpçè·èTéíépêóêXë°ëëë ìììë©ë5ë£êÙéêèÉç{æåaã•á­ß¡Ý‰ÛXÙ,×÷ÔÖÒÅÐÓÎÍhËÊÏÈßÇ2ÇÅÆ¢ÆÄÆ#ÇÌǦÈÅÉË‘ÌAÎ ÐÒÔ?Ö†ØÏÚ8Ýžßâäç‡éìîøðpóÞõLø¯ú ýeÿ±û6p˜ à Úðúû÷æÑ¯‰V #"Ý#›%F'ó(’*-,½-I/É0E2¶35€6Ñ7"9]:”;¶<Ï=Ó>È?¢@lAB¨BC^CCxC@CÕB4BTA=@Ý>B=Z;59¿641î-†*ê&*#BF6( 3mÎÿ\üùöEó¼ð`îOìpêÐèeç3æ2åaä½ãCãíâ¾â®âºâåâ"ãyãßã[äÞäpå æ§æTçðç™è5éÍéYêÚêAë£ëÜë ì ìôë´ëQë½êêéè¿æLå±ãòá à ÞìÛËÙ‘×hÕ<Ó*Ñ4Ï\͸ËBÊÉ ÈOÇÙÆ¥Æ»Æ Ç©ÇxÈŽÉÎÊGÌé͵ϢѮÓ×ÕØdÚ¹Ü+ß–áäŒæ éˆëî~ðôògõÒ÷:ú˜üïþA†Ìû4 P w†–™“‡qR+ Ä!Ž#<%ù&›(B*Ü+o-û.~0ú1l3Ù4967ß8:W;}<˜=Ÿ>—?y@BAõAˆBÿBOC{C{CKCîBRB‡Ap@,?Ž=Á; 9?74±1“.1+£'ç# òåâ ù'ƒý½ù®öÑó;ñÒî¸ìÈê!é«çkæfå…äàãVããÄâ²â¶âÞâãhãËãBäÃäUåéåŽæ,çÔçwèé®é@ê½ê2ëŒëÓëÿë ìúëÂëdëÝê&êJé8èç—åäGâmàlÞZÜ4ÚØÒըӓёϺÍ̈ÊBÉ9ÈpÇïÆ¬Æ´ÆúƈÇNÈWÉŒÊþË–Í[Ï@ÑHÓkÕ¡×îÙGÜ®Þ á”ãæè ë‹íð~òëô[÷Àù$üxþÐY‘à é 205"ôУo!0#ì$Ÿ&K(ð)‹+!-«.40®1$3‘4ò5O7›8ã9;D<`=l>f?M@AÔAkBèBACpCCRCCqB°A«@j?æ=<:¹7"5K2-/à+U(§$É ×ο°« ºæ8³ýcúC÷_ô¹ñKïí'ëuéíç¯æ’å´äýãpããÎâ¶â¶âÒâ ãVã¸ã*äªä6åÏåkæçµçTèúèé"ê§êë|ëÅëøë ìþëÏëuëúêLêuéqè<çßåTä¡âËàÑÞÄÜœÚqØ@ÖÔúÑôÏÎ\ÌÌʃÉgÈ—ÇǶƯÆìÆhÇ'ÈÉRʲËFÍÏâÐâÒÿÔ3×{ÙÒÛ7Þ¤àã“åèŽêí†ïòrôäöIù¬ûþZ¥è#U € ž »ÆÓËÆ¯˜rI!Ú"–$J&ø');+Ñ,_.ç/c1Ý2G4°5 7Y8£9Ù: <'=6>7?@ô@¯AKBÔB+ClC|C]CCBØAâ@©?6>vèèæÊåÝä äŠã#ãÚâ»â´âÍâÿâFã§ãä•äå³åKæíæ•ç2èÜèoéê‹êëjë¶ëïë ìÿëÚë‡ëëoê¡é¥è{ç#æ£ä÷â'á6ß*Ý ÛÝØ¬ÖÔ`ÒXÐnέÌ˽ɟȹÇÇÃÆ¬ÆÝÆNÇþÇíÈÊkË÷̨΄Ð}Ò–ÔÄÖ Ù_Û¿Ý,à¡âå›çê•ì ï‡ñùójöÑø6û“ýåÿ3y²ë 8 NdikcO9ìº "<$ù% 'N)æ*„,.™/1‘24j5Ã68a9:Î;ð<>?ñ?É@ŠA-B¸BCaCvChC!C­BüAAè?€>Ñ<à:§8+6g3m0+-À)&R"cfVH=F f§ÿ­ûzø‚õ¿ò?ðôíîëê‰è)çæ åAäªã4ãèâÁâ²âÌâîâ=ããäväå’å-æÎærçè¸èUéçétêêêWë¦ëåëììæë“ë/ëêËé×è¶çgæñäJãƒá—ßÝuÛIÙ×ëÔÉÒ»ÐÎÎÍgËÿÉÑÈåÇ9ÇÐÆ¯ÆÐÆ4ÇÜÇºÈØÉ&Ë©ÌSÎ&ÐÒ-ÔVÖ™ØèÚKݱß'âŸäç›éì”î ñƒóíõ^ø¼úýqÿÂFz¨ Ì éúÿôÕ½` )"å#¢%L'ú(—*2,Ä-J/Ñ0D2¾35†6Ñ7"9^:’;¶<Í=Ð>Á?¡@bABBCTCtCiC4CÁB#BAA'@Ê>&=E;9©6÷31Ó-l*Ð&#)0"  'cÃÿWüùöKóµðjîMìxêÑèqç7æ=ågäÅãKãøâÅâ·âÂâëâ+ããåãaäääuåæ®æRçöç™è4éÍéUêÖê@ë˜ëÚëûëìçë¨ëAë¯êòééðçªæ<åãÞáøßöÝÝÛ¸Ùƒ×ZÕ0Ó!Ñ,ÏX͵ËBÊ ÉÈUÇæÆ­ÆËÆǹnjȞÉäÊ\ÌýÍÍϳÑÉÓèÕ(ØvÚÐÜ<߬á#䡿éëî“ðóxõâ÷Iú¦üÿþN•× > _ €“ž¤žz[5 Í!“#E%ÿ&£(G*â+r-/0ý1q3Ø4>67á8:U;~<”=ž>’?u@=AëA„BòBHClCnC=CÜBBBqA_@?}=¤;Š9&74œ1s.+†'Ñ#ìýëâÓÒ ízý¹ùªöÒó7ñÙî·ìÏê'é¯çwæeå–äàãeããÏâ¶âÅâÛâ&ãgã×ãDäËäXåðåæ1çÔçyèé­é=êºê,ëˆëÌë÷ëìîë¸ëTëÏêê6é*èêæ…åðã6âWà_ÞBÜ'Úï×ÆÕžÓ„ÑÏ­Í Ì„ÊGÉ=ÈvÇúÆ³ÆÆÆÇÇ[ÈkÉžĘ̂ÍqÏVÑ\Ó‚Õ³×ÚYÜÄÞ3á§ã$æ¡èëžíðòùôn÷Íù4üˆþÚ&cŸÎ ö .7@90ýØ«t!:#ñ$¨&O(÷)Ž+)-­.<0­1,34ù5L7 8ß9;A<_=h>c?F@AÊAeBÝB6ChCmCHCòB^B¡A“@X?Ì=<ö9Ÿ7 5,2/Á+@(Š$µ ¿»­žœ ®Ú1¬ý\úB÷^ô·ñOïí0ëvéøç³æ›å¼ääyããÕâÀâ¼âÚâãZãÂã.ä°ä=åÑåpæç¶çWèùèé#ê êëvë½ëòëþëõëÁëkëçê@ê`ébè(çÍå?äâ·à½Þ²Ü‰ÚeØ+Ö ÔéÑîÏ ÎVÌÎÊ‚ÉkÈžÇ ÇÄÆ¸ÆüÆwÇ8È0ÉdÊÆË[ÍÏ÷ÐùÒÕH×‘ÙæÛLÞ¸à.ã©å$è£êíšïò…ôñöZùºûþh³õ/c Š ­ ÄÒÚØÍ¼ž}N!ß"ž$P&ÿ'¢)@+×,c.ê/i1Ý2M4¯5 7]8¡9Ü:<%=8>0?@ð@¥AJBÄB'C]CoCPCCBÂAÏ@•?>`<_:8Ž5¿2µ/k,ó(E%u!ˆ‚yhd r —çYþûÛ÷ëô<òÂïí‹ëÍé@èðæÒååä'ä”ã)ãçâ¾âÁâÑâ ãNãªãä•ä#å³åSæðæ•ç9èÖèuéê‰êëaë´ëãëì÷ëÊëëÿêdê‹é—èfçæ‘äàâá$ßÝùÚËØœÖtÔQÒSÐbάÌËÁÉžÈÃÇ#ÇÏÆ¸ÆìÆ[ÇÈÿÈ%Ê‚Ë ÍÀΙГҬÔÚÖÙuÛÓÝCà³â/åªç'ê¤ìï–ñ ôvöçøAû¤ýóÿB„Ãó! B [nutnXDöà ˆ"E$þ%¨'S)î*‰,.¢/1™24m5Æ68a9Ÿ:Ê;ó<û=?ê?Æ@‚A(B®BCTCmCUCCšBëAAÓ?k>¹<Ç:Œ86O3P0-£)ü%:"JQ@4.4 \š ÿ¦ûtøõ¾ò>ðøíïëêè.ç æåLä¯ã@ãïâÉâºâÓâùâCã—ãä~äå˜å2æÑæwçèºèTéçéoêèêRëŸëàëöëûëÕë‹ëë~ê¼éÃè¥çVæØä;ãmá„ß~Ý`Û9Ù ×ÞԺҷоÎÍaËÊÕÈêÇ@ÇÛÆ¼ÆÜÆFÇêÇÎÈìÉ:˽ÌjÎ;Ð1ÒAÔnÖ«ØÛ\ÝÉß:â´ä,ç®é%ì¦îñóöløÎú+ý‚ÿÎQˆ´ Ù ò ûãÀši 0"ï#§%V'ý(¢*3,Ë-P/Ò0N2º3&56Ø7 9a:‘;µ<É=Ï>½?›@^AB“BCECkC[C#C´BB0A@´>=,;þ86Û3é0·-Q*·&ô"ûùú W»ÿMüùöGó¹ðfîTìyêØèuç=æCåqäËãUãþâÏâ¾âËâóâ2ã‡ãîãeäìäxåæ®æXçöçšè7éÉéWêÐê<ë•ëÍëùëøëÞë›ë4ëŸêãéöèÝç™æ%åŒãÈáäßâÝÌÛ¢Ùz×EÕ)ÓÑ$ÏTͰËCÊ ÉÈ_ÇéÆÁÆÑÆ2ÇÅǢȯÉùÊpÌÎàÏÎÑÚÓÖ;ØÚæÜQßÁá7䵿.é®ë)î¢ðóŠõð÷\ú³üÿ]£åI m Œž¬­¨›ƒf= Ø!—#R%'¬(L*ç+z-/ˆ02t3Ü4@6“7à8!:U;|<•=™>‘?m@9AçAyBêBd=;m9 7f4~1[.ý*n'³#ØßÙÊÁ Ûqõü·ù¡öÓó3ñÜî·ìÕê)é¶ç}æoåšäêãkãã×âÀâËâçâ)ãsãÚãNäÑä\åøåæ9çÕçzèé¬é=êµê+ë~ëÉëîëúëäëªëFëÀêê'éè׿qåÙã#âCàGÞ3ÜÚá×µÕŽÓ|ÑÏ­Í̆ÊEÉCÈ}ÇÿÆÅÆËÆǤÇtÈ{ɵÊ(͇̾ÏlÑuÓ•ÕÏ×ÚtÜØÞIá¾ã7æµè1ë¯í'ðœòõx÷åù<üžþç4t«Ý  "7FIG9#âµ}!A#ù$°&V(ÿ)“+0-².?0´1/3”4û5P7Ÿ8â9;C<[=j>\?E@AÅA^BÔB-CZCbC9CáBPB‰Aƒ@=?¸=ë;Ý9‡7í42ù.©+"(o$› ¦¥“ˆ žÎ"¥ýSú=÷Zô¸ñKï#í.ë~éüç¸æ¤åÀää€ã ããâÂâÇâäâãiãÃã8äµäDåÔåwæç»çXèùèéê êërë¹ëæëúëæë¸ë\ëÙê/êPéOèç¸å,äyâ¡à­Þ™ÜÚKØ%ÖôÓæÑáÏÎQÌÍÊ‚ÉpÈ¢ÇÇËÆÉÆÇŠÇIÈDÉxÊÛËrÍ*ÏÑ Ó-Õ]×§ÙýÛ`ÞÐàCã¼å:è¶ê0í¯ï!ò—ô÷hùÎû"þz¿?m › · ÑßãæÕȧ†Y#!ì"¢$[&(©)H+Ü,i.ð/l1ã2O4³5 7\8¤9Ü:<%=2>1?@ê@ A>BÀBCUC`CCCóBnB²A¶@ƒ?>Lç?Ã@xA&B¢B CGCaCGCCˆBÙAë@¾?S>¢<¬:t8ó56300ú,ƒ)ä%"27-# Lÿûoø{õ¼ò<ðúíñë$ê“è4çæåSä·ãHãùâÏâÇâÖâãGã ã ä„ä åå6æÖæxçè¹èVéäéoêãêLë›ë×ëïëðëÊë~ëëqê¨éµèçBæÇä"ã[ánßjÝOÛ%ÙúÖÌԳҤпÎõÌcËÿÉÖÈðÇGÇåÆÇÆìÆRÇÿÇÞÈÊPËÑÌ€ÎRÐEÒ]ÔÖÉØÛwÝÜßQâÈäAçÂé:ì¸î/ñ¢óö~øÜú?ýÿÞ&^˜¿ è þìΡs 7"ù#«%b')¨*<,Ï-X/Õ0R2¾3(5†6Ø7#9a:Ž;º<Ã=Ï>¸?–@YAÿABóB?CZCRCC¨B÷A Aú?›>û<;æ8u6¾3Î0š-6*š&Þ"ööëáî L±ÿCüù öFó·ðhîVì|êßèyçEæKåuä×ãZããÙâÃâØâöâ?ãŠã÷ãkäðäåæ¶æXçúçšè6éÉéUêÌê:ë‹ëËëìëðëÒëë$ë“êÏéæèËçƒæåtãµáÏßÐݸۑÙg×7ÕÓ ÑÏNÍ®Ë@ÊÉÈiÇñÆÌÆâÆ;ÇÜÇ®ÈÈÉ Ë†Ì(ÎùÏáÑõÓÖTØ¢ÚÿÜeߨáKäÉæEéÀë=î²ð*ó›õølúÄüÿk³ó'W z ˜¬¶º²¦oI ä!œ#\%'¶(S*í+- /02w3á4B6•7ã8!:V;}<=›>Š?l@2AàApBäB.CYCQC!CºB BIA7@â>N=v;R9õ6G4e1?.Þ*W'–#½Ê½ºª± Ífíü­ùŸöÍó6ñÙî¼ìÖê.é¼çæxå äòãtããàâÊâÏâóâ.ã|ãáãSä×äaåü啿:çÙç{èé®é7ê¸ê!ë~ë¿ëäëôëÔë¢ë6ë±êøééèÅæ\åÉã â0à2Þ$ÜûÙÔפՂÓpÑzÏ£ÍþË…ÊGÉFȆÇÇÒÆ×Æ,ǵLjȌÉËÊ;ÌÖÍ›ÏƒÑ‹ÓªÕæ×-ÚŠÜíÞ]áÓãKæÊèCëÃí9ð®ò"õ‹÷ñùTü¦þûA‚ºé  +HMXOD1︋!G#%¶&^(*œ+1-¼.A0»1/3›4ú5S7¢8á9;><_=b>^?=@ A¾AUBÌB!COCVC)CÑB?BuAo@)?ž=Ö;Á9m7Ò4ú1Ü.+(Y$~ ‹‚ww ¾˜ýOú7÷Yô´ñOï"í5ëéè¾æ©åÉää‰ã)ãéâÎâÍâìâ ãmãÍã;ä¿äCåàåuæç¸ç]èøè‘éêêëlë±ëßëðëÜë¬ëLëÌêêBé:èç¡åä`â‘à•ÞŠÜhÚ?ØÖïÓÒÑÞÏûÍOÌÊʃÉuȧÇÇׯկÇœÇWÈ]ɆÊõ˃ÍBÏ%Ñ"ÓDÕs×½ÙÜyÞáà[ãÏåNèÉêEí¾ï7ò¥ô÷yùÜû4þ‡ÎI ¢ Æ Ýèõëäб‘a,!ô"¨$e&(³)L+á,q.ó/r1æ2R4¸5 7d8Ÿ9Þ:<"=5>)?@â@›A:B³BCECXC1CæBYB¤A @m?î=0<.:ã7Y5ˆ2/5,º(%@!XULA@ Q ÌIþïúÑ÷äô8òÄïí“ëÓéKèýæÜå÷ä2ä§ã8ã÷âÏâÐâãâã_ã¶ã*ä¡ä.å½å[æöæœç;èÚèréê…ê÷êZë¢ëÜëçëæë³ëaëæêAêlérè@çêågä¹âëàùÞñÜÑÚªØ|ÖWÔ<Ò=ÐUΤÌËÁɦÈËÇ5ÇâÆÐÆ ÇzÇ5È"ÉOÊ©Ë5ÍëÎÃÐÂÒ×Ô×IÙ¢ÛüÝpàÙâZåÒçLêÍì@ï¾ñ.ô›öùdûÀý^£Ü 9 ] s…Žˆ…mU4× –"Z$&¾'[)+‘,#.§/)1œ2 4m5Ï68f9œ:Ð;é<þ=û>ä?»@yAB BþB>CTC:C÷BvBÉAÔ@«?=>‡<™:T8Þ530Ü,k)È%"!  :‡õþ•ûmøqõ¿ò9ðüíóë(ê—è:çæ"åVäÄãLããÛâÊâââ ãOã§ãäŠäå£å9æÛæxçèºèTéåékêâêHë•ëÎëéëåë¾ëtëþêbê™é è€ç-æ³äãEá\ßVÝ=ÛÙìֽԨқзÎñÌ`ËÿÉÚÈôÇNÇñÆÏÆýÆaÇÈðÈÊbËéÌ”ÎfÐ`ÒlÔœÖÚØ*Û‰ÝôßcâÞäWçÑéRìÅîDñ²ó&ö‰øòúHý¡ÿí3m¥Ê ö (&# ùѰw C"þ#·%c')«*C,Õ-X/à0Q2Ç3'5‹6Ø7'9_:’;´<Æ=Ê>·?@UAøA…BíB1CRC>CCBïAAê?„>ä<÷:Î8X6§3¯0-*&Ä"ÛìÜÛÍÜ ü;ªÿ:ü ùöCó¶ðjîUìƒêàèçKæOå‚äÚãgã ãââÎâÛâã=ã™ãùãtäôä‡åæºæ\çúçžè4éÌéNêÍê2ë‡ëÄëãëæëÇëëë€êÀéÓè¹çqæüädãžá¾ß»Ý£Û‚ÙS×-Õ ÓÑÏHÍ«ËAÊÉÈqÇøÆÛÆêÆQÇæÇÇÈ×É!ËšÌ@Î ÐýÑÔ1ÖiØ·ÚÝxßðá^äßæVéÕëPîÄð>ó©õøwú×ü+ÿ}¿5b ‰ ¤¶Ãÿ®™wQ ç!¨#a%'º(Y*ô+‡- /”02~3ä4B6›7à8&:S;|<‘=”>‹?d@.AÙAhBÚB$CMCCCC¨B B8A @Ï>4=\;;9×604G1%.Ä*:'~#£±¨¤™Ÿ ¿õ\äü§ùœöÊó3ñÜî¼ìÝê0éÄç„æ‚å¥äüãzããèâÐâÚâ÷â8ã€ãëãVäßägåþåžæ7çßçzèé«é8ê±ê ëxë¶ëàëåëÌë“ë,ë êèééóç°æJå³ãùáàÞÜëÙÁטÕsÓiÑmÏ£ÍöˆÊJÉHÈŽÇÇÛÆèÆ8ÇÉǘȠÉßÊNÌîͯϜџÓÃÕú×CÚ ÜßuáåãaæÜèWëÔíLðÀò4õš÷ú]ü»þSŽÉó 8SYcXQ5óÆ!P# %»&f( *£+7-Ã.D0Á1234þ5V7¡8å9;A<[=a>Z?:@AºAJBÆBCDCICCÃB-B`A^@ ?=µ;­9P7¸4Ý1Â.r+ì':$j txjdh ~µ ’ýGú3÷UôµñLï(í4ë†éèÁæ´åÎää”ã-ãôâÔâÖâôâ(ãtãÔãDäÂäMåáå|æç½çZèýè‹éê—ê ëfë«ë×ëäëÕë›ëCë»ê ê4é$èóæ‘åäTâuà‡ÞrÜZÚ)ØÖÝÓÊÑÒÏöÍJÌËÊ€É{ȬÇ(ÇàÆäÆ"Ç®ÇjÈlÉ ÊÌŸÍUÏ;Ñ;ÓXÕ‹×ÒÙ)Ü‹ÞûàkãçåbèÚê[íÎïKòµô(÷‰ùìûDþ•Þ"WŒ ° Ô çõÿõòÔÁ•m6!ø"µ$g&(¶)T+ç,u.ø/v1ë2U4º57b8¤9Ý:<$=.>)? @Þ@–A/B­BC:CJC#CÕBKBŒA‘@T?Ø=<:Ì7<5n2b/, (÷$&!?=7.. B pÂ=þìúÈ÷åô5òÃï‘í”ëØéQèççåùä?ä¬ãAãþâÚâÕâìâãdãÂã-ä¨ä3åÂå]æýæ›ç@èØèréê‚êôêTëžëÏëäëÕë«ëQëÛê-ê^é]è.ç×åRä¦âÔàêÞØÜÅÚ“ØsÖCÔ6Ò-ÐTΚÌËÂɨÈÓÇ=ÇìÆßÆÇŽÇEÈ7ÉaÊ¿ËLÍÿÎÚÐÙÒìÔ ×_Ù¶ÛÞ‚àòâkåæçcêÛìYïËñAô­öùvûÏý#l²é F j ~’•—Œy_;ß ž"b$&Ã'c)+™,'.­/*1£2 4u5Ì6 8e9Ÿ:Ì;ë<ú=÷>á?µ@qAB•BöB1CHC+CæBhB²AÅ@’?&>rµ?Š@OAñA|BäB%CEC2CôBƒB×Aõ@Ñ?p>É<á:²8>6‹3•0f-þ)f&¨"ÈÏÌÂ½Ì î0 ÿ3üùö?ó¸ðjîYì†êæè†çQæXå…äçãjããéâÖâäâ ãHããäwäüä‹åæÀæYçè—è:éÅéPêÇê-ë‚ë»ëÜëÜë»ëtë ërê¯éÃè¤ç_æéäOã‹á©ß¨Ý‘ÛrÙB× ÕýÒùÐ ÏCÍ©Ë?ÊÉ"ÈuÇÇâÆýÆ\ÇüÇÖÈëÉ6˰ÌSÎ%Ð Ò!ÔBÖƒØÊÚ+ÝŽßâtäóæhééë`îÙðMó»õ%øŠúäü>ÿ‡ÏAs ‘ ³¿ÑÌɺž„W* ñ!®#i%'À(a*ú+‰-/“02}3ê4A6ž7à8':R;{<Ž=“>†?_@)AÑAaBÐBC@C6CC›BúA#A@µ>"=@;%9»64/1.­*'d#Œ˜“…’ ®ìOàüžùšöÈó4ñÜîÀìÞê8éÇçæ…å®ää„ã$ãóâ×âãâã=ã‹ãîãbäàäqåæ æ<çàç|èé¬é2ê²êëpë´ëÒëàë¾ëˆëë”êÓéõèÛç£æ1å¡ãäáàÞúÛÚٲׇÕhÓ[ÑhÏšÍôˆÊIÉPÈ’ÇÇåÆôÆIÇØÇ«È³ÉóÊfÌÿÍÉϯѷÓÙÕØZÚµÜ߇áýãtæñèjëçí]ðÕò@õ±÷úrüÈþ`Ö + F]gkgWFÊœ!W#%Å&m(*«+;-Ç.L0Â173¡46W7¦8à9;=U?7@ÿ@±AFB¸BC5C=C C²BBPAD@ý>q=£;Ž997›4Ä1¥.Y+Ï'#$L b\ZNW q¦Šý?ú0÷QôµñNï'í;ëˆéèÉæ¹åÕä'ä—ã9ãüâÙâäâ÷â3ã{ãÛãKäÇäSåä倿ç¾ç_èùèéê™êëbë¤ëÐëÛëÈë’ë2ë®êûé éèàæ{åñã;âfàoÞdÜDÚØöÕÎÓÃÑÆÏóÍCÌÌÊ‚ÉȰÇ1ÇíÆîÆ6ǹÇÈ|ɵÊ̳ÍkÏRÑPÓnÕ£×èÙ>Ü£Þá€ãþåqèòêlíàï^òÅô;÷˜ùýûQþ¦ì/f— ¿ Þ õ÷ãÇžx:!#º$p&(¾)X+ï,v.0w1ð2Y4º57a8¦9Û:<=->%? @Ù@A&B¦BûB3C6CC¿B>BuA€@;?Å=ý;û9°7"5U2D/,ƒ(Þ$!&)" 3 d¸6þäúÆ÷àô5òÅï‘í™ëÛéWèçîååFäµãIããââÜâöâ$ãmãÆã6ä¬ä;åÃåfæûæ¢ç=èÜèqéþé~êñêNë™ëÇëØëÐëšëJëÆê"êKéKèçÂå@äâÅàÏÞÏܫڊØ^Ö;Ô'Ò(ÐMΖÌËÀɯÈ×ÇGÇöÆíÆ!Ç£ÇQÈNÉrÊÕË_ÍÏïÐïÒÕ6×sÙÍÛ(Þ˜àã‚å÷çuêîìjïÞñOô¿ö!ùˆûÝý1}»ü& U t ‹ ¡•…eGæ ©"e$&Å'm)+ ,+.²//1¤24t5Ò68e9¡:É;ê<÷=ô>Ý?¯@lA BBëB(C9C CÖBUB¤A­@‚?>[ëˆëÀë×ëÏë¨ëXëâêCêwé}èZçæäæâá4ß1ÝÛóØÍÖ¢Ô‘Ò‡Ð«ÎæÌ_ËýÉáÈÈ]ÇÇèÆÇ‚Ç1ÈÉ:ÊŒË;ΓЊҙÔÈÖÙXÛ²Ýà‹âåçöéxìéîhñÔóEö­øûiý¿ÿN‰¼é #6<?1%翈 Q"$Â%u')¹*M,ß-d/ä0\2Ê3/56Ý7%9c:Ž;±<Ä=À>°?‡@DAîArBÙBC5C(CåBpBÇAß@¿?Y>´<È:˜8'6q3{0M-å)M&’"¯»¸¯¯» â(“ÿ3üúøö>ó¸ðnî\ìŠêìèŒçYæ^åŽäíãuããóâÝâìâãOã¤ã ä}äåŽå%æÂæ_çè™è;éÂéOêÂê*ë|ë´ëÒëÔë­ëlëùêdêŸé²è’çMæÕä<ãxá•ß–Ý€ÛaÙ3×ÕñÒðÐÏ>ͧË@ÊÉ&È~ÇÇïÆ ÇlÇ ÈëÈüÉJËÃÌkÎ7Ð%Ò5ÔVÖ˜ØàÚ>ݧßâŒäç~éùëqîëð]óÌõ5ø—úöüIÿ–ßQz ¢ ¹ÐÖÚÒªŠa1 ù!¶#o%'Ç(e*,Ž-/š02‚3ê4E67ä8$:S;x<Œ=‘>?[@"AÉA\BÂBC0C+CóBˆBìAAû? > =); 9¢6ý31î-‘*'K#v€|u‚ £ßHÖüžù“öÉó3ñàîÂìãê=éÎç“æå³ää‰ã0ãúâáâêâ ãEã’ã÷ãeäçäu忦æ=çàçèéªé2ê«êëmë¨ëÎëÒë¸ëvëë~êÊéÝèÐçŠæ#åŒãÐáõßùÝéÛÊÙ¡×xÕ`ÓNÑdÏ‘Íõ˃ÊNÉRÈ›Ç"ÇòÆÇUÇëǺÈÇÉËxÌÎÙÏÈÑÉÓðÕ%ØnÚÉÜ+ßœá䉿é}ë÷ípðâòVõ¹÷%ú}ü×þ%l«á 5 RgrupbJ/Ø!`#%Æ&w(*²+@-Ë.O0Å1>3 46W7¦8â9;?R?/@ü@¨A>B±BC+C-CþB¡B B[=‹;w97ƒ4§1Ž.>+·' $5 JKC@G bŸ÷‚ý=ú(÷Wô¯ñSï)í?ëŽéèÎæÂåÞä,ä¥ã=ããáâêâã7ã†ãÞãRäÌäYåéåƒæ"ç¿çbèøèŽéê”êë[ëëÈëÑë¾ë„ë'ëžêíééèÍæhåÜã*âQà^ÞQÜ3ÚØâÕÈÓ´ÑÁÏìÍAÌÊʇɀȼÇ7ÇùÆûÆDÇÉǔȋÉÍÊ*ÌÈ̓ÏcÑiÓÕ¹×üÙSÜ·Þ á˜ã æ‹èÿêíôïkòØôG÷ªù üdþ¯ý;q¦ Ç ì ý  ëШ}D! #Ã$s&#(À)a+ñ,~.0}1ñ2\4¿57f8¡9à:< =)>!?@Ñ@ŠABžBðB&C.CC·B&BhAg@+?©=ê;á9—7 572./ä+l(Ã$ø  # Y­/þÝúÃ÷Üô8òÃï—í›ëàé]è çôå åKäÀãPããêâçâûâ0ãpãÒã8äµä=åËågæç¢ç?èÜèpéþé|êêêMëë¿ëÓë¿ë“ë9ë¸êê9é:è ç±å*ä€â¯à¿Þ¹ÜÚwØRÖ,ÔÒ ÐEÎ’ÌËÁɲÈßÇNÇÇùÆ2ǯÇhÈ\ɉÊéËtÍ+ÏÑÓÕF׎ÙÞÛ@Þ©àãåè…êíyïññ`ôÏö4ù“ûîý?ˆÌ9 \ ƒ •¦¯§£ŠtJ$ë ±"k$!&Ì'r)+ ,4.±/81¤24v5Ó6!8e9¡:È;ê<ó=ó>×?­@cABƒBãBC.CCÅBFBA™@m?ô=G¬?@AAäAhBÓBC-CCÙB]B·AÉ@­??><¯:}86T3a00-É)5&v"—¥Ÿœ« Öÿ&üùøþõ=ó¸ðnî`ìŒêõèçeæaåšäóã}ã)ãøâçâöâã[ã©ãä…äå—å&æÇæ`çèè7éÄéJêÀê&ëtë­ëËëÆë§ëYëîêRêéžè‚ç7æÅä%ãeá€ßƒÝnÛNÙ$×ÕçÒåÐüÎ7Í¥Ë?ÊÉ*È…ÇÇøÆÇzÇÈüÈÊaËØÌ€ÎNÐ;ÒJÔpÖ«ØøÚSݺß(â äç“é ì‡îùðsóÙõJø¥úýYÿ¥í&_† ¯ ÅÙåáà˵’k9 ÿ!Á#t%&'Í(l*,’- /œ02‡3é4L67ä8':Q;z<‰=Ž>|?Y@AÅAPB»BC#CCäBxBÙAù@ç?ˆ>õ< ;õ8…6ã3õ0Ó-v*ê&2#]imdfo •Ó>Îü—ùöÄó7ñÛîÈìæê@éÖç—æ˜å¼ää“ã8ããêâðâãIãœãûãmäîäxå æ§æ@çæç{èé§é2ê§êëdë£ëÈëÅë¯ëiëërê·éÏèºçyæåvã¿áÞßéÝÕÛºÙ×nÕNÓHÑZÏÍò˃ÊMÉ\ÈžÇ/ÇüÆÇdÇþÇËÈÜÉËŽÌ-ÎðÏÝÑáÓÖ8؉ÚÚÜF߯á$äæé“ëîƒðôòdõÎ÷2úüåþ4z¹ð D ]r~|kU7 à¨!f##%Î&|(*¶+E-Ñ.Q0Ì1>3¥46[7£8è9;?Q?+@ô@¦A3B§BøBCCñBBüA&A@Ð>C=s;`97m4‰1u. +Ÿ'í# /6./4 Vñyý7ú$÷Qô²ñSï-í@ë”éèÖæÈåæä5ä«ãIã ãïâïâ ãBã‡ãëãUäÕä[åð冿%çÃç_èûèŒéêêþêUë–ëÀëÅë·ësëëŒêÞéýèñçºæUåÉãâ@àGÞAÜ Úý×ÕչӫѶÏèÍ;ÌËʅɉȽÇGÇüÆÇNÇÞǠȥÉÚÊEÌÚ͘Ï}ÑzÓœÕË×ÚiÜËÞ9á§ã$æ™èëíð|òêôX÷¸ùünþÄL~³ Ô ÷  õÚ°‰I!#Æ$&%(Ì)b+ü,. 0~1ø2^4¿57`8©9Ú:<='>?@Ê@„AB’BèBC!CùB¤BBRAT@?“=Ñ;É9}7î42/Ì+O(ª$Þ ùûûôþ  J¥#þÜúº÷ßô3òÆï™íœëéé_èçøååVäÅã[ããôâîâã7ãxãØã?ä½ä?åÓåhæç¤çAèÜèpéûéyêèêDë‹ë¶ëÈëµë‡ë*ë®êþé,é%èúæšåäjâ›à­Þ¤ÜŒÚhØBÖ ÔÒÐAÎÌËÃɵÈåÇVÇÇÇBǽÇyÈpÉžÊûË‹Í@ÏÑÓ1Õ^×£ÙõÛUÞ¾à2ã£å$è–êíˆïòpôßöEù¡ûþJ›ØF j Ž ¡³¹²®’~S+ö ¶"w$&&Ó'z)+¬,3.º/81¬24|5Ó6#8h9ž:Ê;ç<ñ=í>Ô?¥@^AüAyBØBC CCµB5B|A‡@V?à=+<2:ñ7t5¬2­/r,)d%!½ÃÆ¼Æ Ø XÔþ{ûXøiõ¸ò?ðîì:ê«èVç.æ@åxäàãoã#ãùâîâã+ãmãÃã,ä¡ä)å³åLæçæ†ç è¿èSéßécêÑê5ë{ë°ëÅëºë‘ë<ëÇê#êTé]è2çâådä¿â÷à ß ÝõÚÒØ¬Ö‹ÔuÒyЙÎàÌXËÊåÈÈmÇÇÇ3ǤÇQÈ@É_ʵË=ÍéοеÒÇÔòÖ1Ù‚ÛÛÝKà´â.å£ç!ê—ìï…ñûóeöÍø.ûˆýÛÿ'g§Ó :NOVE8ûÌœ `"$Ñ%‚'")Æ*W,é-m/ï0a2Ñ3556â7(9^:“;ª<Â=¹>¨?}@8AÞA`BÆBCC CÄBRBA½@?.>‚<—:g8ï5=3D0-®)&]"‹ˆ‹ž Åÿ!üôøùõ>ó·ðrîcì‘êøè–çhælåŸäýã„ã1ããðâüâ"ãaã±ãä‹äå˜å0æÄæjçÿç¡è6éÂéJê¹ê#ëmë§ëÀë¾ë™ëOëÝêEê}éŽènç%æ¯äãOámßpÝ\Û=Ù×ôÔÞÒÙÐõÎ4ÍŸËDÊÉ3ÈŒÇ%ÇÇ*LJÇ2È É(ÊqËïÌ”ÎdÐRÒ`ÔˆÖ¾ØÛfÝÒß;âµä(ç¥éì˜î ñ‚óìõWø·úýgÿ¶ö8g˜ ¶ ÖâñíèÖ¿œuA "È#}%,'Ô(q* ,š-#/ 02‡3ñ4K6Ÿ7è8":V;t<‰=Š>y?R@A¾AHB±BüBCCÐBkBÃAé@Î?u>Ø<ú:Õ8q6Ã3Þ0µ-]*Ì&#@UTRS` …É4ÉüùŽöÅó2ñãîÅìíêFéÛç¡æåÅääœã@ã ãðâüâãUã¢ãäuäòä~åæ«æFçåç€èé¨é.ê¨ê ëcë˜ë¾ë¾ë¡ë\ëøê`ê¨é½è¦çiæ÷äfã©áËßÔÝÃÛ§Ù€×_ÕCÓ>ÑPÏŠÍëˆÊPÉ^ȨÇ7Ç ÇÇvÇ ÈàÈïÉ/ˤÌAÎ ÐñÑúÓÖPØŸÚïÜ]ßÂá8䲿&é©ëî˜ðóyõÜ÷EúœüöþA‰Æü* N jˆ‹†sc<å²!o#(%Ù&€(!*»+K-Õ.W0Ð1B3¨46\7¦8æ9;<K?'@ð@œA,BŸBëBCCáB}BèAA @¹>,=Z;D9ê6N4p1W.+„'Ó# & F‚åsý/ú"÷Nô¯ñVï.íEë™éèÛæÒåêäBä¯ãSãã÷â÷âãHã‘ãñã[äÛäbåó勿(çÄçdèøèéê‘ê÷êQë‘ë³ëÃë£ëoëëêÌéëèÞç¨æ@å¶ãÿá)à8Þ(ÜÚé×ÈիӟѱÏÞÍ<ÌÆÊ‹ÉŠÈÉÇJÇÇÇaÇìǵȷÉïÊ\ÌîͰϒѓӲÕá×-Ú|ÜäÞKá¿ã7æ®è)ë¤íðòüôg÷Ìù*üþÑX¾ å ")"ãºT!#Ð$„&/(Ï)l+ý,‡. 0…1ù2a4Å57j8£9ß:<=">?ú?É@zABˆBÝB CCëB“BBBA<@?y=º;¬9e7Ð42ö.­+6(Ž$Å Þçãâë  ?–þÏú»÷Øô4òÆïší£ëééièçæå`äÌãdã ãøâûâ ã@ã‚ãÝãHäÁäGå×åmæ ç¥çFèØèsé÷éwêäê?ë„ë®ë¿ë«ëzëë êëééèåæˆåäWâ†à˜ÞÜ{ÚSØ6ÖÔÒÐ5ÎÌ ËÈÉ·ÈìÇ`ÇÇÇPÇÎÇȃɰÊÌÍZÏ0Ñ1ÓGÕu×»ÙÜnÞÒàIã·å7è­ê&í¤ïò‡ôîöVù´ûþ\¨è S w š ±»Ç½¶¡„`4ü Ã"z$1&Ù'€)+¯,;.¿/<1°24}5Ö6$8h9Ÿ:É;å<ð=ê>Ñ?ž@YAòAqBÎBCCóB¥B$BfAt@¤?v@4AÔAZB¼BùBCúB·B=BA£@~?>l<|:K8×53*0ø,”)ü%F"ayrwwŠ ¹zÿüîø÷õ9ó¹ðqîeì–êýèœçoæså¥ää‹ã<ããúâã+ãiã·ã ääåå3æÊæjçè è7éÂéEêºêëkëë¸ë³ëëBëÏê4êlé|è\çæœäýâ=áXß]ÝIÛ,Ù×çÔÍÒÔÐéÎ2ÍËDÊÉ<ÈÇ4ÇÇ7ÇšÇBÈ É:ʈËͱÎuÐnÒtÔžÖÙØ#ÛÝäßRâÉä=ç»é0ì­îñ“óödøÍú!ýyÿ Bz¢ Æ ÞôöþðàÊ¥|K "Ï#…%3'Ù({*,¡-'/¦02Œ3ñ4O6¡7è8$:S;s<ˆ=…>v?M@A·A=B©BñBCC¿B\B¯AÕ@¹?^>À<á:¹8X6¦3Ä0˜-A*´&ÿ");>=?P v½&Ãü†ùö¾ó6ñàîËìïêIéâç¤æ§åÊä&ä¢ãIããûâã!ã\ã§ã äyäùä„åæ­æIçæç‚èé¥é.ê ê ëZë’ëµë´ë•ëSëäêVê’é®è“çTæåäOã–áµßÃݯۗÙn×RÕ4Ó5ÑHσÍìË€ÊWÉ`ȲÇ=ÇÇ'ÇŠÇÈõÈÊD˺ÌXÎÐ ÒÔ2ÖiØ±Ú ÝmßÚáPäÃæ?é¹ë.î¨ðó‡õð÷Tú­üÿO™Ô 7 \ u‘›ƒgK ñ·!w#0%à&…(+*½+T-Ø.]0Ò1F3ª4 6^7¨8æ9;9J? @ê@–A"B–BßB CCÓBlBÖAAò?¤>=B;(9Ñ604V1<.ç*l'·#îÿ 7uÛiý'ú ÷Jô²ñRï3íHëé$èäæÕåöäEä¹ã]ãããüâãNã™ã÷ãcäàägåøåæ,çÆçfèøèéêŒêóêLë†ë±ë³ëë_ëûêrê»éÚèÍç“æ.åŸãïáà'ÞÜÚÚ×»ÕӘѤÏÝÍ7ÌÅÊŽÉ‹ÈÓÇRÇÇ%ÇqÇüÇÉÈÉÉËoÌÎÅϨѪÓÇÕú×@Ú–ÜõÞeáÐãMæÁè?ë´í-ðòõw÷ßù7ü’þÞ%g›Ë ñ #/3-  ìÅ•a!#Ü$‰&6(×)n+-‰.0ˆ1þ2c4Ç57k8¢9á:ü;=>?õ?Æ@oA B}BÔBCCÜBBöA)A,@ç>c=£;‘9K7¶4é1×.•+(v$¬ ÄÑÍÐÚ ö2ŽþÌú±÷Ùô1òÉï˜í©ëìépèç æåhäÔãmã%ããýâãEãˆãçãJäËäHåàåmæ ç©çDèàèléùéqêãê8ëë¥ë¶ëŸëmëëŒêâééèÏæwåìãFânàˆÞ}ÜiÚDØ%ÖÔûÑÐ0Î‰Ì ËÈÉ»ÈôÇgÇ$ÇÇ_ÇáǛȚÉÁÊ*Ì´ÍmÏJÑGÓZÕ×ÌÙ#Ü€Þèà\ãÏåHèÃê:í³ï%ò–ô÷fùÅûþk¶ô1[ Š ¡ ¾ÆÑÈ©Žj:!È"„$5&â'„)!+³,A.Ã/B1±245Ù6&8g9 :Ç;ä<î=ä>Í?™@RAëAgBÄBøBCæB”BBTA`@%?·=ø;þ9À785y2t/:,É(/%g!”š˜ž » ëE½þoûLøcõ·ò<ðîì@êºè\çBæIåäíãã5ãããã;ã|ãÒã:ä­ä4å½åUæîæˆç(è¼èUéÛé\êÊê(ëqëžë³ë¤ëyë"ë©êê4é6èç¹å=ä–âÏàåÞåÜÏڱ،ÖpÔ^ÒgЉÎÙÌSËÊîÈÈ~Ç/ÇÇSÇÀÇ{È_ÉÊÝËiÍÏíÐàÒ÷Ô×aÙªÛ ÞsààâWåÎçEêÂì7ï­ñô‡öòøLû«ýøÿD‡¾õ ? Rckg^L0 ä¨ u"+$á%'2)Ñ*d,ó-v/ø0g2Ù395”6ä7*9_:‘;§<¼=´>?t@+AÏAOB±BîBCíB¦B,B|A@f?>PǰÇNÈ5ÉMÊËÍÃÎŽÐҌԴÖíØ<Û“ÝûßhâÙäWçÈéHì»î3ñ£óövøÚú3ý†ÿÒQ…± Ï ð÷ þìϱ„R "Ô#%:'á(~*,¢-//©0"23ö4O6¤7æ8':P;v<‚=…>p?I@A­A9BœBçBüBõB´BEB¢A½@§?F>¨<È:¡8:63¤0-%*˜&æ"#+&0> j±ºü„ù…öÀó4ñâîÎìñêQéäç±æ§åØä)ä®ãPãããã,ãbã±ãä‚äýä‹åæ´æJçéçƒèé§é)êžêëRëŽëªë¬ë‰ëFë×êEê„é›èƒç@æÒä;ãƒá¢ß®ÝžÛ…Ùa×@Õ-Ó%ÑEÏ}ÍéË‚ÊYÉeȸÇJÇÇ<Ç‘Ç3ÈÉÊUËÑÌmÎ4Ð!Ò$ÔJÖ}ØÊÚ݆ßîábäÙæQéÊëEî·ð*ó˜õøcú¿üÿ`¥äD i ™¢›‰uQ*ú¾!#5%é&‹(0*Ä+X-à.^0Ú1F3°4 6d7¥8ê9;;@? @à@‘ABBÑBÿBóBÄB]BÀAñ@Ù?“>÷<+;9µ6481".Í*O' #Ñííöò (kÎdý ú÷Gô²ñTï5íLë¡é*èëæÛåþäMäÃãcã#ããã$ãWã¡ãüãmäääoåü哿.çÊçeèùèé êŠêïêDëƒë£ë®ëŽëUëîêaê®éÆè¼çæåã×áàÞÜìÙÌשՒӌўÏÕÍ3ÌÈÊÉ“ÈØÇ[Ç(Ç1Ç€ÇÈÚÈßÉË„ÌÎÝϾÑÂÓÛÕØUÚ¬Ü ßyáçã]æÚèLëËí>ð¯ò"õˆ÷íùKüžþî6r«× ý ,=<9)óÐh!(#á$’&:(Þ)v+-“.013g4É57i8§9Ü:<= >?ô?»@lABtBÉBôBøBÎBqBãAA@Ô>J=‰;y9/7œ4Ì1À.s+(W$” ­º¸¿Æ ê#ƒ þÂú°÷Ôô0òÊï›í«ëôépè*ç æ(åoäÛãvã0ã ã ããPããîãRäÐäPåáåuæç¬çEèÞènéõérêÛê5ëvëžë­ë”ëdëÿê‚êÏéõèòç¼æcåÚã-âaàmÞpÜRÚ6ØÖøÓïÑýÏ,ÎƒÌ ËÇÉÁÈùÇpÇ-Ç/ÇkÇóǭȬÉ×Ê@ÌÇÍ…Ï`Ñ[Óvՠ׿Ù6ܘÞüàsãàå^èÕêMíÅï8ò¥ô÷sù×û*þ|Æ?j ” ± ÇÕÙÖÈ·•tB!Ñ"‹$>&è'Š)(+¸,H.Å/H1³2$45Ú6(8g9 :È;ß<î=ß>Ë?’@MAáAaB·BîB÷B×B†BþACAI@?›=ä;á9§75]2X/,®(%R!p‚ƒ‘ ¦ ã3ºþdûJø_õ´ò?ðî ìGê»èhçCæVåäúã‡ã=ãããã?ã‰ãÔãEä±ä:åÄåWæóæŠç(èÀèRéÚé[êÄê'ëfë™ë©ëšëlëë˜êôé"é$èýæ¥å)äƒâºàÒÞÑܽڡØ|ÖdÔRÒ^Ð‚ÎØÌOËÊðÈȉÇ9Ç)Ç`ÇÓljÈvÉžÊôË}Í-ÏÑùÒ Õ5×vÙÀÛ#Þ„àùâgååçWêÖìGïÁñ+ôöüøaû¶ý S’Ðþ) G `ovsfX5ä¹ v"7$é%“';)Õ*l,ø-|/ú0o2Ù3?5”6æ7)9c:;©<¸=±>›?l@%AÇAGB¦BåBóBâB’BBfA~@P?è=<i?G@þ@ªA,B—BÖBõBãB¥B8B‰A°@‹?2>’<­:‰86s30a- *~&Ì"û 1 Z¦±ü€ù€öÁó1ñäîÑìõêVéêçµæ´åÚä7ä±ã]ã ããã4ãjã¶ãä„äåŠå!æ³æPçêçƒèé£é)ê™êëLë‡ëŸë¤ë{ë;ëÉê6êsé‰èpç,æ¿ä'ãnáߜ݉ÛxÙM×7ÕÓÑ;ÏyÍåË„ÊWÉoȼÇWÇ*ÇHÇ¥Ç?ÈÉ'ÊoËãÌ‚ÎMÐ2Ò@Ô[Ö–ØßÚ2Ýßÿázäèæjé×ë[îÆð=óªõøtúÎü#ÿm¶î%T p “ž«¯¢—{[6ÿÊ!†#>%í&–(2*Î+[-ã.g0Ù1M3°46b7©8è9;9??@ß@…ABBÍBìBìB¯BOB¯AÙ@Ê?v>ä<;ò86û31.±*5'…#ºÒÚÞâó ]ÆYýú÷Dô³ñTï8íOë§é.èòæãååSäÎãiã.ããã-ã]ã©ãäpäîäpåæ—æ0çÎçdèüè‹é êˆêêê?ë~ë˜ë§ë‚ëIëÞêVê˜é»è¦çnæåwãÄáðßùÝøÛÖÙÀךՇӀјÏÎÍ3ÌÆÊÉ›ÈÜÇfÇ2Ç?ÇÇ!ÈèÈöÉ*ËœÌ/ÎòÏÖÑÖÓôÕ&ØkÚÂÜ"ߌáüãtæçègëØíRðÃò0õ÷úùZü°þûF}ºä %:FHD2ýרn!2#ç$™&C(â)}+ -™.0’13j4Ê57i8¨9Û:<=> ?ò?³@gA÷AmB¼BéBéB¿B`BÓAA@»>4=q;`97‚4°1¥.[+æ'?${ •¥¤«¸ Úwþ½ú¬÷Ñô0òÊïŸí®ëøéwè/çæ2åräêãxã<ããã%ãSã™ãôãXäÖäUååå{æç±çDèßènéôémêÜê)ëtë”ë¢ëëQë÷ênêÂéäèÝç®æKåÉãâKà_ÞYÜCÚ&ØÖïÓáÑ÷Ï$ÎÌ ËÊÉÅÈÿÇ{Ç9Ç:Ç~ÇÿÇÄȼÉîÊRÌßÍ›ÏtÑtÓŠÕ¸×ûÙMܪÞá‚ãøåpèèê`í×ïJò¸ô#÷„ùæû9þŒÑIz Á ÏäàäÐÀ {M!Ù"’$F&í'’),+¾,L.Ë/I1º2#4†5Ü6'8k9œ:È;Ü<ì=Û>Æ?Œ@DAÝASB°BßBëBÉBsBðA-A7@ü>„=Ê;Ë9‰75?2A/,–(÷$:!Ymks| š Õ,¯þ`ûDø^õ³ò?ð î ìNê¿ènçMæXåäýã”ãBããããOã‡ãäãBä¾ä;åÊå\æóæ‘ç'èÁèPéÚéWêÀê"ë^ë”ëœë“ë]ë ë‰êäééèëæ‘åänâ§à¾ÞÀÜ«ÚØoÖUÔIÒUÐ|ÎÒÌNËÊöÈ È–Ç?Ç:ÇmÇãÇÈˆÉ²Ê ÌÍBÏÑ Ó"ÕL׈ÙÜÛ3Þà ã€åñçsêâì^ïÐñ?ôªöùoûÆý^¤Û 4 T j{€}qaAñ¾ ";$ñ%™'B)Ù*r,û-ƒ/ý0s2Û3A5—6ç7,9_:Ž;§<´=°>–?e@#AºABBšBÙBèBÐB†B BVAh@;?Ò= <6:ù7‰5Ì2Ù/¨,C)°%ö!258D\ â[ÿüÝøîõ6ó¸ðyîmì£ê é®çƒæˆå¿ää¨ãPã%ã ã"ã=ããÎã2ä¥ä!å®å?æÖæqç è£è5é¿é?ê¬ê ëVë‡ëë”ëiëë¡ê ê6éKè çÙå`äÁâá!ß ÝÛõØÛÖ¼Ô¯Ò³ÐØÎ#Í—ËFÊ&ÉIȬÇNÇ7Ç_ÇÌÇsÈZÉuÊÄËFÍëνЫһÔÝÖÙdÛÀÝ'àâå{çòémìßîZñÃó6ö•øüúPý§ÿî2mŸÈ î ÿÿä˜b +"å#›%H'í(Š*#,®-4/¶0%2š3ö4W6¤7ê8%:O;q<=}>i?<@þ@A'BŠBÌBçBÕB–B$ByA›@w?>z<”:o86Y3n0L-í)f&²"àöþ  L›®üvù‚öºó6ñåîÓìûê[éñç¼æ¹ååä<ä¼ãaã,ããã;ãrã¿ãäŽäå”å!æ¸æSçêçˆèé¨é"êšêùêIë|ëœë’ëwë&ëÁê êhétè`çæ¬äãZá{߉ÝwÛfÙ=×)ÕÓÑ2ÏuÍäËÊ_ÉoÈÉÇ]Ç:ÇTÇ·ÇMÈ/É:Ê‚ËùÌ—ÎcÐJÒSÔuÖªØôÚKݯßâŽäþæzéðëiîÜðOó¸õ%ø€úáü.ÿ€À.b  ›®´¹® …f9 Í!‘#D%ô&(7*Ô+^-ë.g0à1M3µ46c7ª8ç9;96?@Ô@€A BuBÁBâBÙB¥B9BŸAÄ@´?a>Í<÷:Ý86ã31ì-—*'n#¡»ÇÈÒã V¶Xýú÷Eô¯ñZï9íUë®é4èúæêå å\äÕãqã8ããã2ãgã®ã äsäõäuåæœæ0çÐçeèûè‰é ê‚êåê;ësë”ë˜ëxë<ëÒêDê‹é¦è–çZæóäeã°áÚßëÝàÛÍ٩בÕxÓyÑÏËÍ.ÌÈÊ‘ÉžÈæÇoÇ?ÇLÇ Ç0ÈýÈÊAË­ÌIÎÐîÑêÓ Ö:Ø‚ÚØÜ4ߤá䆿ÿèuëîíaðÖò>õ®÷ úkü¼þ QÂó  5BVMR;(ݰw!7#ï$ &G(ë)+-›.0˜13n4Í57k8¨9Ù:ÿ;=> ?ë?­@aAîAdB°BÞBÚB±BOBÀAð@î?¡>#=S;K9ø6h4–1‰.A+Ì''$a Œ“—© Í oüý·úª÷Ïô/òÍï¡í´ëýé}è7çæ;åyäóã‚ãBããã/ãZã£ã÷ãcäÚäZåëå|æç±çGèÞèméòéiêÕê'ëiëŽë–ë‚ëGëèê`ê±éÓèÍç™æ:å´ãâ8àKÞEÜ7ÚØüÕÞÓÛÑíÏÎÌËÎÉÈÈÈ…ÇBÇIÇŠÇÈÕÈÎÉËcÌøÍ®ÏŒÑˆÓ ÕÏ×ÚdܾÞ+á—ã æƒèúêuíçï[òÊô0÷˜ùòûKþ—âXƒ ­ É ÝíìíÛɪƒT!!Þ"œ$J&ô'™)0+Ç,L.Ó/J1À2&4ˆ5Ü6)8j9œ:È;Ú<è=Ø>À?†@?AÐAOB¡BÕBÜBºBcBßAA @è>k=³;±9q7ê4&2$/ê+y(â$!FTYaj Ä%¤þ]û=ø^õ±òAð îìPêÈèrçUæbå¢ää™ãNã!ãã%ãVããèãMäÀäDåËåaæ÷æ‘ç*èÀèQéÙéQêÂêë_ëƒë›ëëWëùê|êÔéÿèèÕæåä\â’à­Þ«ÜœÚ~ØbÖFÔAÒHÐzÎËÌOËÊúÈ'ÈœÇLÇEÇ}ÇóÇ­ÈžÉÂÊ!Ì¥ÍZÏ-Ñ&Ó6Õa× ÙðÛIÞ´àã”åèêùìmïâñOô¼öùûÖý%p¯é @ b sЇ‹ziK(úÄ Š"A$ø%¢'E)à*w,þ-ˆ/ÿ0v2à3A5›6ç7+9a:Š;¨<¯=¬>‘?a@A¸A3B“BËBÛBÂBuBúA?AY@"?¿=<:å7k5µ2»/Ž,))•%à!"&5M ‚ÚRÿüØøêõ7ó¸ð{îrì§êé·ç‡æ•åÃä'ä®ã[ã*ãã#ãLã…ãÖã7ä¬ä'å´åAæÛæqçè¡è6é»é>ê¦ê ëJëƒë’ë‹ë]ëë•êøé(é7èçÅåMä®âïà ßÝÿÚëØÈÖ±Ô£Ò«ÐÐÎ Í•ËGÊ)ÉPȳÇZÇCÇoÇÚLJÈlɈÊÜËVÍÏÏÐÅÒÌÔøÖ-Ù~ÛÒÝ<à£âåŒçê~ìóîjñÕóGö¦ø ûbý°ÿ<~©× ô &$íÊŸl 0"í#¢%M'ô(*(,³-:/¶0-2—3þ4U6¦7ë8%:N;p<|=y>g?4@ù@”ABBÁBÚBÈB„BBgA„@e?>d<|:U8ë5<3V0.-Õ)L&˜"ÊÞìëú A¥üsù~ö¹ó5ñèîÖìë^éùçÁæÂåëäDäÆãjã4ãã!ãCãyãÆã$ä–äåšå#æ½æVçìçˆèé¥é ê–êôêBëwëŽëŽëgëë±êêUédèKçæ–äãFáhßvÝgÛRÙ4×ÕÓ Ñ.ÏnÍäË€ÊcÉtÈÑÇgÇEÇdÇÅÇaÈ=ÉPÊ—Ë Í¯ÎwÐaÒiÔŒÖ½Ø Û]ÝÃß/âäçˆéìvîñð_óÈõ6øúðü?ÿŒÐ >l Œ §¹¾Å¶ªŽnE Ú!”#O%ø&¡(@*Ö+i-ê.n0á1S3´46b7¬8ç9;88? @Ñ@wABlB·BÑBÐB’B+B‹A²@ž?L>¶<Ý:Æ8d6È3è0Ð-~*'U#‡¨¯¶ÁÑ G²Mýú÷Bô±ñZï;í[ë¯é=èþæòååaäàãxã@ãã ã;ãoã´ãäzäúä{å æ æ3çÓçfèûè‡éê€êàê5ëkëŒëëmë0ëÂê8êwé˜èçKæÛäUã›áÈßÕÝÐÛ¹Ùž×~ÕoÓlщÏÃÍ.ÌÃÊ—É¡ÈîÇvÇMÇWDZÇ@ÈÉÊUËÃÌ\ÎÐÒÔÖRØ–ÚíÜLß´á'ä˜æéˆëîsðçòSõ¹÷ útüÏþ^žÐý $ <S[^WH1ë´ƒ!<#ù$¦&O(ï)‡+-¡.0œ13t4Ë5$7h8ª9Ø:<=>?è?§@YAçAWB©BÎBÒBBCB©Aà@×?Ž>=>;/9ß6N4y1o.&+±' $K hv€„˜ ¾bùý­ú§÷Ìô1òÌï¥í´ëêè>ç"æAå†äõããHã&ã ã4ãeã§ãähäÞäbåðå~æç¯çLèÞèkéñéfêÐê"ëcë…ëëuë;ëÛêQê¡éÂèºç†æ(åžãöá!à:Þ4Ü"ÚØçÕ×ÓÌÑéÏÎ{Ì ËÌÉÐÈ ÈÇOÇUÇÇ ÈèÈâÉËyÌ ÎÃϥќӸÕä×&ÚyÜÔÞ?áªã!æ—èë…íùïnò×ôG÷¢ùüXþ¦ð+f º Ó ìôûõçѳŒ\)!å"¥$O&þ'›)8+É,T.Ô/Q1¿2+4Š5Ý6,8h9ž:Ä;Ú<ã=Ö>¹?‚@6AÉAEB—BÈBÑB©BTBËAA @Ó>R=ž;”9Z7Î4 2 /Í+`(Ç$!/;GK[ · þRû>øWõ²òCð îìRêÏèyç[æjå©ääŸãYã*ã ã2ãXããìãSäÉäDå×å`æþæ‘ç-èÀèQéÖéPê»êëWëëë{ëGëíêoêÂéñèíçÄæmåìãIâ}à™ÞšÜˆÚqØOÖ>Ô1ÒCÐuÎÅÌPË ÊûÈ4ÈŸÇ]ÇMÇŽÇÈÀÈ®ÉÛÊ2̾ÍlÏGÑ8ÓRÕt×¹ÙÜaÞÆà3ã¨åè–ê í‚ïóñbôÌö0ùûæý5}½÷$ Q h …”•„sT1Ï "I$&¦'O)ä*},.‰/1w2ã3F5™6ì7)9b:‰;¤<°=§>‹?\@A¯A*BŠB»BÔB­BjBåA1A?@?¢=ô;ÿ9Ë7P5™2 /u, )€%Á!ñ  @ uÍLÿöûÕøçõ4ó»ðyîyì¨êé¹ç“æ–åÐä,ä¹ãcã2ã#ã-ãRããÝã>ä²ä,å¹åEæßæsçè¢è6é»é8ê¦êëKëvëŽë{ëUëþê‰êåéé"èÿæ±å9ä›âÙàøÞþÜñÚØØ»Ö¤Ô•Ò¤ÐÊÎÍ—ËDÊ1ÉSÈ¿ÇaÇTÇ{ÇîÇ—ÈÉžÊîËpÍÏèÐÙÒçÔ ×FÙ‘ÛêÝRà·â1åžçê’ìï~ñåóWö·øûqýÂÿ Nˆ¹ã  &5,'øÒ¨u 6"÷#¦%W'ù(–*+,¹-?/¹022š35Y6¦7ë8%:M;na?2@î@ABxB³BÐBµBzBþAWAo@N?ì=J2?@Ì@mAüA`B¬BÆBÁBBBwA @ˆ?5>ž<Æ:©8N6ª3Ï0´-d*ä&;#q ¯Á õ7­Bý ú÷@ô²ñ[ï>íaë±éEèç÷å!åhäçã„ãEã*ã(ãDãvã¾ãä…äýä€åæ æ:çÒçgèüè†éê|êÝê/ëbë†ë‚ëeë ë¶ê&êjé„èqç4æÍä<ã‹á²ßÆÝ»ÛªÙ×sÕbÓcтϾÍ+ÌÆÊ˜É¨ÈòÇ„ÇVÇfÇÃÇMÈ&É+ÊjËØÌsÎ1ÐÒÔ8ÖfذÚþÜcßÈá<ä­æ%é›ëî†ð÷òeõÉ÷/ú„üÝþ'm«Þ , L\hh`R:îÃ!K#ü$®&T(ö)Œ+-¥.$0Ÿ1 3t4Ð5#7k8¨9Ù:û;=>?Þ?£@QAÜASB™BÄBÁBB2B—AÎ@¾?|>í<';9Æ614`1R.+•'ö#- Sahwƒ µï_éý®úŸ÷Ìô.òÏï¥í½ëêŒè@ç,æHåäþã—ãPã0ã'ã=ãlã­ã äkäæäiåïåˆæç´çLèÝèléíéeêÊêë\ë}ë…ëjë/ëÎêBê’é¯è«çræåãßáà%Þ"ÜÚö×ÛÕÈÓÅÑÞÏÎyÌËÓÉÒÈȘÇXÇeÇ©Ç4ÈùÈóÉ.Ë‹Ì$ÎÚϸѶÓÊÕý×8Ú‘ÜèÞTáÁã2æ¬èë›í ðòèôV÷µùüfþ¹ù=q Æ à öþóÙ¾“g/!ï"©$W&(¡)?+Í,X.Û/R1Ä2-4‰5ã6(8l9œ:Ã;Ù<á=Ò>·?y@2AÀA;BŽBºBÄB™BFB¸A÷@õ?½>==ƒ;~9?7³4ó1ê.·+B(¯$ë %39K o ­ ˜þKû9øUõ±òBðîì[êÑèçaæqå²ää«ã^ã3ã*ã8ãcã¡ãõã\äÊäQåÒålæûæ™ç*èÄèMéÖéNêµêëLëzë‚ërë:ëáê`ê²éàèÛç³æXåÜã2âlà†Þ„Ü|ÚZØHÖ*Ô+Ò8ÐmÎÄÌNËÊÉ3È®ÇcÇ^ÇšÇÈÍÈÆÉéÊLÌÎ͇ÏXÑRÓdÕŽ×ÍÙÜwÞÙàJãºå/èªêí•ïòqôÞö?ùžûõýCÊ/ ^ u ŸžŽ}_: × –"T$&±'Q)í*€, .Ž/ 1|2æ3G5ž6é7.9^:‹; <­=¥>‡?V@ A¤A$B|B¶BÀB¦BUBÕAA+@ú>=Ø;é9®785~2…/Y,ð(e%©!×ëùý, k¾FÿëûÓøãõ4óºð{îzì®êéÁç–æ£åÓä6äÀãjã?ã'ã7ãWã—ãããFä·ä4å¼åLæÞæzçè¥è3é»é4ê¥êúêEëpë€ëwëEëóêzêÔé éèíæå&ä‡âÅàæÞêÜàÚÆØ¬Ö–Ô‹ÒšÐÄÎÍ•ËEÊ3ÉZÈÄÇpÇ[ÇŒÇýǧȔɰÊÌ„Í/ÏüÐñÒûÔ!×^Ù¥ÛÞbàÑâAå¶ç-ê¤ìïñûóeöÊø'û‚ýÏÿ]’Êì  (4>81Ùµz B"ú#³%X')˜*4,½-B/Â002 35Y6«7ê8%:O;jZ?/@å@ŒABpB¦BÃB©BiBïABA^@7?Ø=1-?@Ä@iAðAZBžB¼B±BsB BfA‹@u?>ˆ<«:‘8263´0—-J*È&##Uyƒ™´ á/Ÿ:ý ú÷@ô¯ñ]ï?ícë¶éKè çæ$åräðã‰ãPã0ã1ãKã~ãÃã"äˆäåƒåæ¤æ>çÓçkèùè‡éêxêÚê%ëaëxë|ëWëë¦êêYéqèbçæºä+ãsá¤ß®Ý­Û—Ù~×dÕXÓVÑ~Ï´Í,ÌÂʛɭÈúÇÇ_ÇxÇÌÇdÈ4É@Ê}Ëî̇ÎIÐ.Ò/ÔMÖ~ØÄÚÝzßÜáQäÁæ9é­ë(î–ð órõß÷:ú™üëþ5~¶ì : Vkovj\E!ýÇ‘!M#%´&](ú)“+ -­.'0£13u4Ó5%7k8«9×:ù;= >?Ö?¡@FAØAEB‘B¶BµB€B B‰Aµ@±?_>Ü< ;ý8«64E17.ó*y'Þ# >GY]{ ëMäý§úš÷Ëô-òÎï©í¾ëê‘èFç5æLå—ää¢ãVã9ã.ãFãsã¶ãäsäíäjåøåŠæç¹çIèßèkéêécêÅêëUëuë{ë`ë#ë¾ê5ê€é è˜ç^æåwãÍáýßÞÜþÙæ×ÎÕ»Ó½ÑÕÏÎuÌËÓÉÖÈÈžÇiÇmǾÇ@ÈÉÊ?Ë¥Ì4ÎòÏÍÑÊÓäÕØTÚ¡ÜßeáÖãGæÀè3ëªíðŽòþôc÷Æù#üuþÇJ}¬ Ñ í    ùæÄŸl9!ö"¯$a&(©)C+Ò,_.Ý/W1È2-45ß6/8g9ž:À;Ù<Ú=Ò>®?w@(AºA0B„B¯BµBŽB2B©Aá@ã?§>&=k;e9$7š4Ù1Ï.+'(–$Ö û%> ^ £ŽþIû0øXõ¬òFðîì`êÕèˆçhæxå»ääµãcã?ã,ãEãeã¬ãùãcäÐäUåÙåmæç—ç.èÄèLé×éFêµê ëFësëxëgë.ëÖêNê¨éËèÏçæHåÇã â[àqÞwÜgÚNØ7Ö!Ô Ò2ÐdÎÅÌJËÊÉ=ȵÇpÇjÇ©Ç'ÈßÈØÉþÊ\ÌçÍ—ÏsÑdÓ{Õ¢×àÙ2܆Þòà[ãÍåFè¶ê4í ïò€ôðöMù¯ûþQœÕ9 l  ¦«¦€m<Ù ¢"W$ &³'Z)ï*‰, .—/ 12æ3J5Ÿ6ë7-9^:‰; <©= >ƒ?O@AABqB©B´B–BHBÄA A@ã>y=À;Ò9–75e2k/>,Û(F%—!»Úâîÿ ]·:ÿéûÊøäõ0ó¼ðî|ì¶ê éÉçœæ«åÙäAäÆãsãFã0ã?ã_ãžãéãMä¼ä8åÂåMæææxçè¤è5é·é5êœêùê<ëhëxëmë9ëçêkêÆéúèÿçÚæŒåäuâ±àÓÞØÜÏÚ·ØžÖ‰ÔƒÒоÎÍ‘ËJÊ5ÉaÈÍÇyÇjǘÇȷȧÉÁÊÌ•ÍEÏÑÓÕ6×rÙºÛÞtàéâQåËç>ê·ì*ïœñ ôtöÚø7ûŽýàÿ(h¤Ðÿ  5>GD9$ 亄 G"$µ%c')£*4,Å-D/Å052¡35Y6­7é8%:L;iT?*@ß@ABbBBµBšBZBÝA1AK@"?Á=<4:8ž5í20ß,†)ý%Q"ž©µÅã kêÿŠüjùoö¹ó3ñïîßì ëoé èÙæÔååZäÞã„ãLã6ã:ãXã’ãØã<ä£ä#å£å6æÄæ]çòç‰èé£éêŒêåê/ëbësërëAëûê‚êèé#é0èçÍå_äÅâ á2ß;Ý6ÛÙ×ðÔåÒòÐÏfÍÙˇÊhɉÈçLJÇhÇÇñÇ—ÈtɉÊÖËJÍðηФҪÔÍÖÙKÛŸÝàjâÜäOçÃé?ì«î(ñóö^øÄúýlÿ¹ö6e ² ÈÜàãÖÄ­†`) ñ!ª#c%'´(Q*ç+t-þ.u0ð1Y3¼46e7¯8å9;3<>=?>*?ý?À@]AëANB“B±B¡BeBûAPA}@Z? >m<—:w86x3˜0-1*°& #?`rx¡ Ù™2ýú÷>ô¯ñ^ïDídëÀéLèç æ*å~äóã”ãYã7ã:ãSã„ãÍã&ää å‹åæ«æ<çÙçhèþè‚éêsêÖê ëWëtëmëQëëœê êIécèMçæ¤äãbáŽß ÝšÛ†Ùr×TÕPÓLÑvϳÍ'ÌÅʞɲÈÈ™ÇjdžÇÛÇvÈEÉTÊ‘ËÍœÎ^ÐCÒEÔbÖ’ØÚÚ*ÝßñádäÓæMé¿ë8î¨ðóƒõì÷Kú©üõþH†È÷' C dq~~ueM*Ι!T# %¼&`(*•+*-«.00¡13u4Ö5&7k8«9Õ:û; = >û>Õ?˜@AAÎA:B‡BªB¦BrBBuA¥@˜?N>À<÷:á8•6ú301.ß*\'Æ#þ%6CMj ßDÞýŸúš÷Åô0òÏï«íÃëê—èLç<æTåŸää¦ãeã:ã<ãIãã»ãäyäñäqåü勿!ç¸çMèßèjééé_êÀêëLëmërëSëë±ê&êpé‘èƒçRæêäjã·áêßÞÜíÙÚ×¼Õ±Ó³ÑËÏ ÎpÌËÕÉÜÈ"È©ÇrÇ}ÇÉÇTÈÉÊS˶ÌMÎÐäÑàÓùÕ%ØhÚ·Üß|áèã\æÑèFë¼í1ðŸòõs÷×ù/ü‰þÐS· Ý ú óʨu?!ý"·$e&(°)F+Û,^.ä/Y1Í204’5à6.8h9:Á;Ô<Ú=Ê>¬?p@!A²A&ByB£B¨B}B$B–AÍ@Ò?>=M;R97„4»1¸.~+(y$¿ æú - Q –ø‡þAû/øSõ¯òDðî ìcêÝèŒçqæåÂä(ä»ãoãDã9ãHãqã°ãäfäÙäXåàåpæçšç0èÁèPéÏéIê¬êëBëgëqë[ë#ëÆêBê”éÀè¶çæ0å·ã âEà`ÞdÜUÚBØ%ÖÔÒ+ÐaξÌNË Ê ÉCÈÀÇwÇ{ǶÇ7ÈõÈåÉËnÌþͫψÑ}ÓŽÕº×õÙGÜœÞámããåWèÊêEí²ï+ò‘ôÿö^ù¾ûþa¦æM q ¥³³´¡oJæ ¦"a$&¾'])ø*‹,.š/1„2ê3L5ž6î7+9`:‡;œ<¨=š>€?I@ý@™A BkB›B¨BˆB5B¶Aô@@Í>a=«;·9}75J2Q/#,Á(/%|!§ÂÏÜî  Q«5ÿàûÉøàõ/ó¾ðîìºê$éÑç¤æ°ååäDäÑã}ãKã;ãDãiã¤ãòãRäÃä>åÆåRæéæyçè£è3é·é/ê›êòê8ë^ësë]ë2ë×ê]êºéåèòçÄæ|åþãcâžà¿ÞÉܻڪØÖ{Ôy҇иÎÍËKÊ9ÉiÈÔÇ…ÇuǪÇÈÍȶÉÙÊ+Ì®ÍWÏ+ÑÓ%ÕO׆ÙÐÛ-ÞŠàùâiåÛçSêÆì>ï¬ñô„öéøGûžýîÿ5y­á % ?ISMC/ìË O" $¼%g')¤*=,Æ-K/Ç082¦35]6¬7ê8%:K;hO?%@Ù@yAøAVB”B¦BBIBÌAA5@?«=<:ñ75×2ç/Æ,l)ä%5"lœœ¸Ò bÞÿŠü`ùqöµó4ññîâìëvéèßæÞå ådäçã‰ãYã:ãDãaã”ãçã:ä°ä$åªå8æÉæ]çøç…èéœéê‡êàê,ëUëqëaë:ëìêuêÚééèç¹åKäµâõà!ß(Ý#ÛÙ÷ÖäÔÚÒéÐÏ_ÍÛˆÊmÉÈðÇÇzǘÇȥȈÉÊëË]ÍÏÌкÒÁÔãÖÙdÛ±Ýà~âîäcç×éOìÂî4ñ¥ó öuøÎú+ý{ÿÅAq ½ Õåíèå˸i0 ù!±#i%'¼(U*í+x-/{0ó1Z3Â46i7­8ç9;1<;=;>$?ø?·@YAÞAGB…B¤B”BVBçABAc@L?ð=Z<{:`8þ5`3|0f-*—&ó")I^g{” Ë.ýýù÷=ô°ñ`ïGíkëÃéVèçæ4åƒäÿãã]ãDã>ã]ãŒãÒã-ä–äå‘åæªæCçÖçkèüèéêoêÐêëOëiëfëBëûêêûé7éUè8çæ’äãPázß݇ÛzÙ^×MÕ=ÓLÑgϵÍ#ÌÆÊ£ÉµÈ È Ç{ÇÇïǃÈYÉhʤËÍ´ÎrÐYÒ[ÔvÖªØîÚ=Ý¢ßâyäææ_éÓëGî½ð'ó˜õù÷\úµüÿU“Õ1 S l‡†lV4 Úœ!^#%Å&c( *˜+.-±.00ª13~4Ò5(7n8§9Ö:÷;= >÷>Î?@;AÂA5BxBŸB˜BbBBbA’@ƒ?7>ª<ß:É8{6â31.À*G'«#é $-@W ‰Ï?ÕýŸú’÷Êô,òÓï°íÃëê˜èXçAæ^å¦ää¯ãkãGãBãSã„ãÄãääöävåææ$çºçNèßèiéçé[ê½ê ëFëeëhëGëë¡êê^é€èsç<æÜäQã§áÕßïÝìÛáÙÆ×³Õ¦Ó¨ÑÆÏÎoÌËÙÉÞÈ,ȲÇ~ÇŒÇØÇcÈ1É,ÊiËËÌaÎÐúÑöÓ Ö=Ø|ÚÎÜ*ߎáÿãnæåèYëÌíDð±òõ„÷ãùBü“þâ%c˜Å é $"öÙ­E!#¼$n&(µ)N+Ü,f.ç/\1Ð214“5ä6+8m9˜:À;Ñ<Ö=É>¤?j@A§ABlB˜BšBpBB…A»@º?z>ú<9;59ï6h4¢1›.h+ô'd$¥ Ïèõ B ë„þ8û.øOõ¯òGðî%ìhêâè—çtæ‹åÈä3äÃãvãNã@ãRãzãµã äkäßä`åàåxæç ç.èÅèKéÏéDêªêýê<ë^ëgëPëë¹ê3ê†é«è©çzæ!å ãûá1àNÞRÜFÚ0ØÖ ÔÒ'ÐXνÌMËÊÉJÈÈÇ„Ç‡ÇÆÇHÈÉþÉ%ËŠÌ ÎÇϚѕӣÕÑ× ÚYÜ·ÞáŠãñånèÛêWíÆï;ò¤ô ÷qùÈû%þl·ò+X ~ › °¼Àº¯•{Q%í ¯"e$&À'd)ý*Ž,.˜/1„2í3M5¡6ë7-9_:ƒ; <ž=>u?G@ô@ŽAB^BB™ByB%B¢Aå@ì?¾>D=™;˜9h7æ4127/,§(%c!­ºÌÜ  C£*ÿÞûÃøÞõ1ó¾ð‚î…ì¾ê,éÖç«æ·åîäMäÚã‚ãYã@ãNãqã«ãùãYäÇäFåÈåYæèæ€çè¦è1é·é+ê˜êëê0ëXëeëVë#ëËêOê§éÙèÛç·æeåíãPâ‰à°Þ³Ü­Ú˜Ø€ÖqÔmÒеÎÍ“ËKÊ=ÉpÈÜǑǃǸÇ+ÈàÈÇÉñÊ:ÌÈÍkÏ@Ñ1Ó;ÕeךÙèÛ?Þ¡à ã{åòçbêÝìLï¿ñ.ô”öúøUû®ýûÿD†¹ð 4 HU]VL:ùÇ• V"$Â%r' )°*>,Ì-N/Ë0<2§35]6¬7ì8#:K;dN?@Ò@rAíANB‡B™BB7B»A A@û>‘=í;:Õ7j5¸2Ð/ª,P)Î%"Sp€’£Ä SÛÿ€ü]ùoöµó5ñöîâìëyéèèæäååmäìã˜ã[ãIãIãiã ãéãFä´ä(å²å9æÎæaçöç‰èéœéê‚êÜê"ëQëdëXë/ëÜêjêÈééèðæ«å5ä¢âäà ßÝÛÙëÖÔÔÔÒÜÐÏZÍÚˈÊpÉ”ÈøÇœÇ‚Ç­ÇȻȘɲÊûËwÍÏäÐÍÒÚÔôÖ0ÙsÛÊÝ+à•âåwçêé`ìÕîEñµóöƒøàú9ýˆÿÓO~© Ç áïøôì×½›m< ü!º#p%'Á(Y*ô+{-/~0ô1_3Ã46k7­8å9;-<:=9>?õ?­@SAÔA=BzB˜B„BFBÖA0AN@8?Ø=Bó¥õ økúÄüÿa¥Þ= ] zˆ’“ˆy]=ߨ!b#%Æ&n( *¤+.-¸.30¬13{4Ú5$7q8¦9Ö:ö;= >î>Í?‰@3A¼A'BpBB‹BTBìATA|@p?!>”<Ã:µ8Z6Ð3ò0ê-¤*/'#Ôò1F zÆ5Îý—ú’÷Ãô1òÒï´íÇëêè_çHædå±ää¼ãpãQãHã]ãŠãÌã#ä†äþäyåæ‘æ)çºçQèÝèhéæéVê»êëBëZë_ë?ëüê—êêPénèaç*æÇäAã’áÅßÛÝÜÛÍٻפՙӠѼÏÎhÌ Ë×ÉéÈ/ȿDžÇÇãÇzÈ<ÉGÊvËæÌsÎ3Ð ÒÔ!ÖRØ“ÚßÜBß á䀿øèkëâíPðÇò*õ—÷óùPü£þî6n¦Ñ ô  /,)൉K!#Â$t&(»)R+â,j.é/c1Í2:4Ž5ê6)8m9˜:½;Ï<Ô=Ã>ž?g@A¤ABcBŒB‹BaBBsA¨@¨?b>æs?>@ï@…AþAQB†BŒBiBBAÔ@Ù?§>0=};ƒ9L7Í42/ò+‰(%H!{–§¹Í ø 8˜#ÿ×û¾øÝõ/ó¿ð…î‰ìÁê5éÚç²æÁåóäYäÞãã\ãMãSãyã²ãä`äÍäJåÍå]æêæ„çè«è-éµé,êêêê)ëOë_ëIëë¾êAê˜éÇèÌç¢æVå×ã>âvàœÞ£ÜœÚˆØsÖfÔ_Ò}ШΠÍËKÊEÉrÈèǚǎÇÈÇ:ÈðÈÝÉýÊVÌÖ̓ÏWÑDÓUÕv׳ÙûÛVÞ³à#ãåèvêîì_ïÒñ>ô¥ö ùbû¿ý S’Çû A QcddUA$þÓš `"$Ë%t')°*F,Ð-R/Ð0=2­35e6¨7ï8!:K;aJ?@Ì@kAãAEBzB‹BsB&B­A÷@@ä>|=Õ;ê9¼7O5 2´/‘,8)±%"9Zoz•´ ôMÍÿ|üWùjöµó7ññîíìë‚éèêæðååwäõãžãdãRãLãwã¡ãôãJäºä0å´å@æÎæfç÷çŠèéšéê~êØêëHë]ëMë#ëÑêZêºéòèûçãæ’å)ä‰âÖàõÞ ÝýÚóØÙÖËÔÆÒÖÐÏWÍØË‰ÊsÉœÈþǦǑǶÇ&ÈÈÈ­ÉÄÊÌ‹Í/ÏùÐãÒíÔ ×BÙŒÛÜÝCà£âå„çênìéîUñÆó.ö’øðúGý—ÿâ ]‹´ Ô ëýÿõáÈ¡uD "Æ#r%"'Å(a*ø+€-/ƒ0÷1b3Ä46k7®8æ9 ;/<4=6>?î?ª@HAÐA/BtB…B|B4BÆAA;@!?Å=*ï>Æ?ƒ@-A²ABfBƒB~BDBÝABAg@^? ><¬:˜8H6¬3á0É-Ž*'y#ºàø< g¿%Íýú÷Áô0òÔïµíÍë ê¥ècçOæmå¶ä%äÂãzãWãPãdã“ãÑã*äŒäå€å æ—æ*ç¾çPèàèeéäéUê³êë9ëRëWë1ëóêˆêùéDé[èRçæ³ä1ã|áµßÈÝËÛ½Ù«×–ÕӕѹÏûÍjÌ ËÛÉíÈ7ÈÆÇ–Ç¤ÇúÇ‚ÈVÉTÊŽËøÌˆÎHÐ$Ò#Ô9ÖfبÚöÜT߸á$ä—æ éëòídðÕò>õ£÷ú[ü´þúD{²Ü  14;0"èÁŒX!#Î$w&#(¿)X+æ,n.ï/c1Ö264—5æ6.8j9™:¼;Í<Ð=À>˜?a@AœAB[B{BƒBNBóA`A–@‘?P>Ë< ;9¼644m1h.3+Â'1$t £½Îàú * qÝoþ.û(øHõ´òCð!î)ìsêïè¡çƒæœåÔäEäÑã‰ã\ãSã^ã‰ãÆãä|äçäjåìå|æ ç ç4èÃèLéÊé?ê¡êôê+ëPëUë:ëëêêféŠè‡çTæÿäxãÖá à*Þ.Ü&ÚØþÕóÓ÷ÑÐRεÌLËÊÉZÈØÇžÇžÇäÇjÈ&É#ÊM˰Ì:ÎñÏÅÑ¿ÓÐÕù×9ÚÜáÞ?á¬ãæèëwíëï\òÅô.÷Žùìû;þŽÏFn ™ ± ÈÑÖÍħc4ý ¼"u$&&Î'p)+š, .¥/1‹2ó3N5§6ë7.9]:ƒ;—<ž=>p?7@é@|AôAJBtB„BVB B{AÂ@Ã?“>=e;l907¶4ù1/Ò+s(å$0!f~–£¿ è *‘ÿÓûºøÙõ/óÀð‡î‹ìÇê7éäç¸æÇåüä_äèã–ãeãSã]ã€ã¹ãäfäÓäQåÐåaæðæƒçè¦è2é²é'êêáê#ëIëSëBë ë³ê1ê‹é´è¼ç‘æAåÇã%âià„ޗ܆Ú{ØdÖYÔWÒqЦÎÍËMÊGÉzÈïǦǚÇ×ÇJÈÉîÉËhÌîÍ™ÏjÑ\ÓhÕ×ÇÙÜjÞÊà5ã£åèˆêípïãñOô¶öùwûÈýaœÚ / H `mnq[P) Ø¥ e"$Ð%}')¼*G,×-U/Ó0A2¯3 5c6¬7ì8$:E;cE?@Å@bAÛA:BnB~BfBB Aà@þ?Ë>h=º;Ò9¤735…2š/v,)˜%í!#DXlª äAÇÿqüXùeöµó5ñöîíìëƒé%èñæõå$å{ää¤ãmãXãYãxã±ãôãTä¿ä4å»åBæÓæfçúçŠèéšéê|êÐêëAëSëDëëÃêMê«éàèïçÊæ†åäyâÀàæÞóÜóÚÞØÐÖ¼Ô¼ÒÍÐÿÎTÍÕËŒÊvÉ È È®ÇŸÇÄÇ5ÈÚÈ¿É×Ê&ÌŸÍEÏÑøÒÕ×]ÙšÛøÝQà½â+åšçê„ìøîiñÖó?ö£øþúUý¨ÿí1fš¿ á ÷ ýíÍ­}L "Ê#{%('Ë(g*ý+„- /…0ü1d3Æ46l7®8å9;*<5=0>?è?¢@AAÆA%BgBzBjB(B³A A&@?«=<2:8±53.0-Æ)L&§"â /Fh ¡øsýðùøö8ô³ñdïRíuëÕéfè.ç$æLåœää¹ãuã\ãYãpã¥ãèãAä©äåŸå(æ¸æFçáçkèüè~éùéfêÂê ë:ëPëHëë×êaêÐéé èçÅå[äÊâáFßSÝWÛDÙ8×Õ"Ó*ÑXϦÍÌËʨÉÉÈ"È¿ÇÇ»ÇȸÈÉ ÊãËTÍóεЙҟԷÖëØ-Û‚ÝÛßHâ°ä$ç—é ìîîð`óÅõ.ø‡úæü0ÿ½û,T x  §¦œŒpO$ï¶!p#*%Ñ&{(*®+9-¿.=0±1 3€4Ú5,7m8©9Ô:ñ;=ü=ë>¼?@!A¬ABVB|BjB8BËA-AW@E?õ=f<“:€8+6•3Â0²-o*ý&]#£Éãö) _¬$¾ýŒúŒ÷Àô/òÖï·íÓë#ê®èhçWævå½ä0äÊããbãWãnã™ãÛã.ä–äå‡åæ˜æ1ç½çRèàècéãéOê²êúê1ëJëLë'ëçêyêìé/éNè<çæ£äãnáœß¹Ý·Û®Ù›×ŠÕ€ÓѬÏüÍdÌ ËßÉñÈ?ÈÑǠǵÇÈ–ÈfÉfʦËÍ¡Î\Ð;Ò8ÔOÖ}Ø½Ú ÝißËá;䩿éëîuðèòMõ¸÷únüÃþ R‰¿ì (9AD<(ðÇ™[!#Ð$&'(Æ)]+ì,r.ô/f1×2;4–5ê6-8k9š:·;Î<Ë=º>˜?T@AŒABHBvBpB@BäALA„@y?<>³<ò:ë8¢64S1M.+«'$^ ‹§ºÍê  dÓgþ)û"øIõ¯òHð"î-ìxêôè§çæŸåàäKäÝãŽãiãWãkãŽãÐãä‚äïämåòåæç£ç5èÃèKéÉé;êœêïê#ëJëIë1ëòê’êêWéyèuçAæíäcãÄáößÞÜÚØïÕçÓíÑ ÐKζÌIËÊÉ_ÈåǧǭÇõÇxÈ9É7ÊbËÆÌOÎÐÜÑ×ÓåÕØKÚ›ÜôÞTáÃã/æ¥èëˆíðiòÛô<÷ ùùûLþ›ÞQ| ¦ ½ ÓÜàØÍ²•k>!Ä"{$-&Ó'y) +¡,$.¨/1Ž2ô3S5¦6í7.9Z:„;’<=‰>m?0@á@vAéA>BkBrBLBôAnA©@³?y>=M;R97›4ß1è.º+W(Ë$!Mh‚ޱ Ö …ÿÍû´øØõ.óÂðˆîìËê>ééçÀæÎååfäóã›ãrãXãhã†ãÁãäjäÝäRåÙåbæôæ…çè§è/é²é"êêÚêë?ëLë5ëë¤ê#ê{é¥è¨çæ,åµãâUàsÞ‚ÜwÚjØWÖKÔNÒgУÎÿÌ‘ËNÊMÉ€ÈûǮǬÇãÇ\ÈÉÊ)Ë|ÌΰÏ~ÑvÓ{Õ§×ÝÙ&Ü€ÞßàIã¸å)è¡êí‡ïðñcôÆö)ù…ûÚý'p«å 7 X h|xzhU7á­ m"'$Ø%'$)¾*M,Û-Z/Ô0I2«35`6°7ì8#:E;a=? @¿@XAÓA-BcBqBTBBˆAÔ@ã?¸>Q=¢;º9‡75i2/Z,)€%Ó! +ETr— Ø8ºÿoüMùdö²ó5ñúîìì&ë†é,èùæüå+å„ä ä¬ãwã^ãbãƒã³ãäYäÆä;å¿åHæÖæjçúç‹èé”éêtêÐêë;ëHë<ë ë¸ê=êéÐèÜç»æpåÿãfâªàÕÞàÜßÚÐØ½Ö²Ô®ÒÇÐõÎTÍÐËÊwÉ©ÈÈ¾Ç¦ÇØÇAÈîÈÑÉìÊ:̵ÍZÏ&ÑÓÕ:×nÙ¶Û ÞkàÐâ@å°ç%ê—ì ïzñéóOö´øûdý¹ÿûAs¨Í î  ôÙµ‡S "Ò#‚%2'Ï(n*,Œ-/‹0þ1g3Ë46q7ª8ê9 ;+<1=->?â?@9A¼ABWBrBXBB Aø@@ô>™=ú;:ù7•5õ20ý,©)2&‹"Íì 6W “ëiýèùöö5ô²ñfïSí{ë×énè2ç-æRå¤ä"äºã„ãaãaã|ã©ãñãHä®ä$å¦å)æÀæGçãçlèüè}éøé`êÀêë4ëGë<ëëÅêYê¹éûè èõæ²åFä·âá0ßCÝCÛ5Ù&×ÕÓ!ÑPÏ ÍÌÉʬÉÎÈ+ÈÈÇ«ÇÇÇ.ÈÈȤɴÊ÷ËlÍÏÎЯҵÔÐÖÙDÛ–Ýóß\âÅä9ç«éì“îñqóÙõ=øšúóüBÿŽÎ<` † ›­²³§–|V/ø¾!z#/%Û&€(*±+A-Â.B0¶13ˆ4Ù5/7o8¨9Ò:ñ;þ<ú=ç>¸?w@A A BNBkB_B%B»AAD@.?Þ=N“?O@ý@‡AõABBeBcB1BÒA:An@h?!>Ÿ<Ø:Ð8ˆ6ý3614.ø*'ú#E q“ ¿Õ  VÆaþ ûøGõ­òHð%î/ì}êúè¬ç“æ¨åçäTäããšãmãcãpã™ãÔã&ä†ä÷äråö儿ç¨ç4èÄèJéÅé:ê˜êèêë@ë@ë%ëçê‚êúéEékè_ç4æÒäUã®áäßÞ ÜÚò×ãÕØÓåÑÐHΰÌKËÊ#ÉfÈìǴǹÇȇÈPÉEÊzËØÌgÎÐõÑêÓþÕ(ØbÚ²ÜßnáÕãFæ¸è+ëŸíð€òçôR÷¬ùüZþ«í*_Œ ¯ Ì ÝéìäÔ¾xB!É"‡$1&Ü'y)+ ,..©/#1“2÷3T5©6ì7.9\:;”<–=ˆ>e?,@Û@jAâA0BaBcB=BãA[A˜@?b>ïë;ë0ëðê—êêgé—è•çlæåœãâ=àbÞnÜfÚ[ØGÖ>ÔCÒ_МÎûÌËPÊQɇÈȻǷÇóÇnÈ&ÉÊ=Ë’ÌÎÈÏ“ÑÓ“Õ½×óÙ=Ü”Þõà_ãËå@è±ê$í™ïòsôØö9ù–ûêý7|¼ñ" D b w‚‰t_>é¶ s"0$Þ%ˆ'*)Ã*U,Þ-a/×0L2°35c6±7ì8":F;]:?@¸@PAÊA#BWBdBEB÷AvAÀ@Ï?£>8=Œ;ž9n75M2e/=,é(c%»!ô0A`ˆ Ë+´ÿeüJù`ö±ó7ñúîòì&ë‘é-èçæ5åŒää·ã~ãhãjã‰ã¼ãä`äÍä?åÄåKæÛælçüçèé—é êrêÈê ë2ë@ë0ëýê­ê-êéÀèÈç©æ]åêãTâ•àÃÞÍÜÏھد֣ԤҾÐïÎOÍÏËÊ|É®ÈÈÆÇ´ÇèÇOÈÉâÉËNÌÌÍnÏ@Ñ$Ó1ÕO×…ÙÌÛ ÞàæâTåÆç6ê­ìïñøóaöÄø ûwýÄÿ L„´Ú ú "ýä»’Z "Û#‡%9'Õ(t*,-/Ž02l3Ê4"6n7°8ã9 ;%<0=*> ?Þ?“@5A¯ABLBbBMBB‘Aå@@Ý>…=Ü;:Ú75Õ2û/Ü,“)&s"²Øó!I „á^ ýãùòö4ô²ñeïXí}ëÝésè9ç4æZå«ä'äÉã‡ãmãgãƒã±ãùãLä·ä)åªå0æÀæKçäçmèüè|éõé_ê¹êûê.ë;ë6ëë¼êHê¬éêèùçäæå5ä¢âðàß0Ý1Û%Ù×ÕÓÑHÏžÍÌËʯÉÓÈ2ÈÕǵÇÙÇ<ÈÙȹÉÅÊÌÍÏãÐÆÒËÔåÖÙYÛ­Ý ànâÝäIçÃé.ì§îñ€óìõKø¬úýPÿœÜGp §¹¼½²ž…a4 Ã!†#2%å&…("*¹+C-È.H0µ1(3ƒ4ß5.7n8ª9Ñ:ï;ü<ù=ß>·?o@AšAýADB\BTBB¬AA0@?Æ=8<`:L8ø5\30|-8*Ç&*#o›µÍã ?– °ý~ú„÷¹ô1òÓïÁíÕë0ê¶èwçeæ‚åÎä?äÛã‘ãsãeã‚ã¤ãìã:ä£äå‘åæ¡æ2çÅçRèàèbéÝéKê¦êñê!ë<ë5ëëÊêaêÊéé)èçÜåäðâFáwß’Ý“ÛÙz×nÕlÓvѤÏíÍbÌ ËåÉùÈRÈáǹÇÑÇ#ȽȇɒÊËË5ÍÍΉÐhÒdÔ~Ö¨ØìÚ9Ý“ßùábäÓæFé¶ë.î™ð órõÕ÷9úŠüäþ%q£Û # COYZP@&Û§m!,#à$&3(Ò)h+ö,|.û/n1à2<4Ÿ5è628i9˜:¶;Ç<Ç=±>?K@ô@€AëA6BZBUB#B¿A*AY@T? >‡<½:¹8k6æ31.Ü*w'ß#- Y}ªÇ þM»XþûøGõªòMð#î5ìêýè·ç—æ°åðä[äíã ãwãjãyããßã)ääüäuåþ儿ç¤ç9èÂèIéÆé4ê•êâêë6ë8ëë×êzêäé;éUèQçæÀäBã™áÓßñÝùÛòÙã×ÕÕËÓÝÑøÏDέÌJËÊ(ÉmÈõÇÂÇÄÇÈ–ÈbÉYÊËìÌ~Î.ÐÒþÓÖ9Ø|ÚÅÜßáëãZæÌè=ë³í ð‘òûô`÷Àùükþºù<hœ ¹ Ù èöôîàÅ©}O!Ö"‰$<&á')+ª,..°/&1”2ü3T5«6ï7-9\:};‘<”=…>_?'@Ò@dAØA&BSBWB,BÔAIA‚@?I>Ù<;"9â6f4¨1±.…+ (™$ä <WjŒ º mÿþ¾û¬øÑõ-ó½ð’î’ìÕêIéòçÑæÝååyäÿã°ã~ãlãuã˜ãÍãäxäçä`åÞåoæõæçè«è-é¯éê‡êÎêë/ë:ëëèêˆêê[é‚è‡çYæåãíá+àQÞYÜXÚJØ;Ö2Ô9ÒWЗÎùÌËTÊRÉ‘È ÈÈÇÅÇÿÇÈ5É(ÊQ˦Ì-ÎÜϬѠӭÕÍ×ÚPÜ¬Þ árãâåQèÆê8í©ïò„ôèöKù¤û÷ýIˆÌü. R l ‡Š“Œ|lE$ò¼ "2$è%Ž'0)Ê*Y,ä-c/Þ0L2µ35e6±7î8:G;Y4?@¯@JA¾ABIBXB6BæAfA­@º?>=x;‚9X7ã472F/&,Ë(N%!ßý0Mx À«ÿ_üDù^ö°ó6ñüîõì*ë•é5èçæ=å’ää½ã‡ãpãrããÅã ägäÑäGåÇåQæÛærçúçèé—éêoêÄêë-ë6ë'ëòêê#êyéµè³çšæIåØã?â‡àªÞÁܹڲء֗ԚҵÐêÎJÍÐËÊɲÈ"ÈÑÇÁÇôÇaÈÉöÉËbÌáÍ„ÏTÑ:ÓGÕf×™ÙäÛ2Þ–àúâiå×çKê¾ì0ï ñ ôröÕø.ûˆýÐÿW“Àæ  &0' êÉ–e %"Ý#”%9'à(x* ,•-/’02p3Ê4&6l7²8ã9 ;$<+='>?Ø?@'A«AB@BXB;BûA~AÓ@î?È>n=Ç;ì9Ã7e5»2á/Á,y)û%["›ÂÞõ; wÕWýÞùîö2ô²ñhï[íëæésèEç8ædå²ä/äÐããuãoãŠãºãýãWä¸ä1å®å3æÅæNçäçoèûèzéòé]ê¯êüêë8ë(ëþê°ê:êžéÙèççÓæ‹å"äâÛà ßÝ#ÛÙ ×úÔþÒÑCÏ—ÍÌÊʵÉ×È<ÈÝÇÂÇéÇHÈîÈÇÉÜÊÌ•Í2ÏøÐÜÒáÔûÖ-ÙrÛ¾Ý!àâïä`çÑéEì¶î%ñ“óùõ]ø»úýbÿ§ì!Vy ž ²ÃÈÈ»ªŽi? Ì!Š#=%æ&(%*¾+H-Í.J0º1*3„4ä5+7r8¦9Ò:ì;ú<ò=Þ>®?k@ AAõA8BPBFBB™Aø@@ ?¯= ‡?E@ì@wAãA(BPBDBB®AAG@=?ö=p<¥:Ÿ8T6É31þ-Â*]'Ç# Fc•¹ ï@³NþûøCõ«òKð'î9ì„êé¹ç¢æ³åüä_äøã¦ããqã€ã¨ãâã3ä”äå|åæˆæç¨ç7èÇèEéÄé3êŽêÞêë.ë.ëëÌêkêØé*éDèCçæ³ä,ã‰á¾ßàÝèÛáÙÖ×ÅÕÄÓÏÑõÏ<ΪÌLËÊ,ÉuÈþÇÌÇÔÇ$È©ÈrÉnÊŸËÍÎIÐÒÔ*ÖRØ‘ÚÙÜ4ß•áþãnæßèPëÅí1ð¦òõs÷Îù(ü{þÆ Fz£ Ê â ôÿùèаˆU!Ú"’$B&ç'ˆ)+­,5.±/.1“24U5«6ò7*9]:z;‘<Ž=>Z?!@Ì@[AÏABHBIBBÆA4At@q?:>½<;9É6K41–.i+ (~$Ï (A[z ­ ødøþ¶û©øÌõ.ó¿ð’î—ìØêOéùçÖæäåå‚ää»ãƒãvã|ãŸãØã!äƒäéägåãåræúæçè©è.éªéê~êÌê ë&ë2ëëÞê{êøéLésèvçGæöäyãÜáà>ÞJÜGÚ:Ø.Ö&Ô1ÒPÐÎùÌŠËYÊUÉ™ÈÈÓÇÑÇÈŽÈGÉ<ÊcË»ÌDÎîÏÃѵÓÁÕç×!ÚeÜÀÞá‡ãõådèØêIí»ï*ò‘ôüöVù¶ûþU˜Ö : ] { Œ››—†sP-úÅ ‚">$ì%•'6)Í*`,è-g/á0O2¹35j6¯7ï8 :A;\/?ù?«@=A¹A BABGB)BØARAœ@¥?y> =\;m9<7Ë42./ ,²(3%ˆ!Äë?i ²¡ÿXüBùZö°ó9ñûîûì-ëšé<è çæAåä äÅããxãzã˜ãÎãäqäÔäLåÍåSæáæqçè‹èéé êhêÁêùê%ë-ëëéêêêoéžè¨ç‚æ;åÄã.âqà›Þ¬Ü¬Ú¢Ø‘ÖÔŽÒ­ÐæÎEÍÑËʆɹÈ*ÈÝÇÌÇÈpÈ$É Ê(ËxÌôÍÏfÑTÓ[Õ{×±ÙöÛIÞªà ã|åìç]êÑì@ï±ñôöäø>û•ýâÿ'i›Ñï  $483(ö΢i /"ã#›%>'è({*,š-/•0 2l3Ó4#6p7²8ß9;<.=>?Ï?Š@A¤AûA6BIB.BèApA¾@Ú?´>U=²;Ï9¯7D5ª2½/®,[)ã%E"~¯Çá( lÉNúüÛùéö3ô±ñkï\í†ëèé}èIçBæiå¼ä7ä×ã™ã|ãwã”ãÀãä]äÁä6å²å:æÄæUçäçpèûèxéñéWê­êóêë0ëëõêŸê/êŒéÍèÓçÃævåä}âÈàúÞ ÝÛÙöÖôÔîÒ Ñ<Ï“ÍÌÉÊ»ÉÜÈDÈèÇÐÇõÇ[ÈýÈÛÉïÊ5Ì©ÍGÏÑòÒ÷Ô×AÙ†ÛÕÝ4à—âåqççéTìËî4ñ¦óöoøÉú!ýnÿ¸ö2_‰ § ÀÌÔÐDz•tC Ò!“#A%ð&’(-*Â+L-Ò.K0Á1&3Œ4á5/7s8¤9Ó:è;ù<î=Ø>¨?e@A‰AèA.BBB8BôAŠAà@ @î>œ=<2:8Ä5(3X0H-*—&õ"DlޤÅç )}û¢ýtú}÷¸ô/òÚïÃíàë8êÄèçxæŽåãäJäîã¡ãƒãxãŒã¶ãùãGä±äå忬æ6çÈçUèÞèbéØéBêŸêâêë*ë"ëþê°êGê¬éóèè÷æºåXäÌâáTßmÝrÛmÙ]×XÕQÓkÑÏéÍ^ÌËïÉÉdÈóÇÔÇéÇFÈÛȯɶÊõË_Í÷γДÒÔªÖÔØÛbݽß"âŠäûæjéÝëQî¼ð.ó‘õù÷Uú«üþþEˆÄð ; YfpmeQ8ë¹|!9#ï$™&B(Ü)r+-ƒ.0u1â2F4œ5ï608i9˜:¯;Å<¼=«>?=@ç@lAÚABDB5BBšAA4@'?â=V<‘:„8;6­3é0à-¬*A'°#ý-Pkƒª ã3¬EþûøAõ«òNð)î=ì‰ê éÁç©æ»åågää±ã†ã|ã…ã²ãéã;äšäå‚åææçªç:èÄèGéÁé-êêÖê ë(ë#ëëÂê[êÌéé7è,çüå™äãsá®ßËÝ×ÛÐÙÅ×»ÕµÓÉÑëÏ:ΦÌMËÊ3É{È È×ÇãÇ2ȼÈɄʳËÍ£Î`Ð2Ò1Ô=ÖjئÚîÜJߨáäæôèbëØíDðµòõƒ÷Ýù9üŠþÕT†³ Ô î   ïݶ’\%!ã"˜$I&ì')!+´,7.¹/,1›24X5­6ð7,9[:y;Ž<Œ=}>U?@Æ@RAÄAB:B;BB²A%A\@`? >ª<è:ð8­614t1|.N+î'd$µ ð/Ek ž ë]êþ¶û øÏõ)óÃð’îžìÛêUéèÝæêå$å†ää¿ãã|ã…ã§ãÞã*ä†äôägåìåpæçŠç"è¤è/é¨éêyêÉêë"ë$ë ëÏênêëé9éeè`ç8æàäiãÆáà,Þ7Ü6Ú,ØÖÔ%ÒFÐŽÎòÌŒËYÊ[ÉÈÈÚÇàÇÈŸÈ[ÉMÊxËÐÌYÎÐÙÑÌÓ×Õþ×4ÚÜÓÞ4ážãæ~èæêbíÉï>ò¢ô ÷jùÃûþ`ªáD j ‡ ™¥§ “z\3Ë "B$ô%™'=)Ó*e,ì-j/æ0S2¸35i6°7ð8:E;T<]=K>,?ò?¤@6A®AB2BóˈÌέÏÑfÓtÕ‘×ÇÙ Ü^Þ¾à%ãåèpêäìSïÃñ,ô“öõøNû£ýòÿ5x¨Þü ! /AB=3רu 3"î#Ÿ%H'ê(…*,¡-/œ0 2s3Ò4&6r7¯8ã9 ;<*=>ÿ>Í?~@A“AõA'B=BBÙA[A¯@Ã? >==š;¹9’7,5Š2¨/,D)Ç%*"j—²Ñé YÂ@øüÑùéö/ô´ñjïaí‰ëïé‚èPçGæsåÂäAäÝã¤ã‚ã‚ã—ãÉã äbäÈä9å¹å<æÉæVçåçsèøèyéìéTêªêéêë%ëëçê—êê„é¶èÇç­ægåüãkâµàåÞüÜýÚöØëÖãÔçÒÑ4Ï’ÍÌÑÊ¸ÉæÈKÈóÇÜÇÈkÈÉïÉËJ̽ÍaÏ Ñ Ó Õ)×XÙœÛëÝIà¬âå†çøélìØîKñµóöø×ú3ý{ÿÉAj˜ ± Î×ßÛϾž|P Þ!•#K%õ&˜(3*É+P-Õ.R0¿113‰4å5/7r8¥9Ï:é;ô<ì=Õ>¡?_@û@AàA"B5B)BäAxAÐ@ô?Ú>„=ð;:8¦53<0,-ì)w&á"'Ww’°Ù põ•ýsúu÷¸ô-òÜïÄíæë9êÎè„çæ•åèäXäñã®ã‡ãƒã“ã¿ãäOäµä#åŸå$æ«æ=çÈçUèàè^éØé?ê—êàê ë$ëëóê¤ê9êžéáèöçäæ©åCäºâ á@ß\ÝaÛ]ÙO×HÕGÓbÑ‰ÏæÍYÌ ËíÉ ÉhÈÈÞÇ÷ÇWÈìÈÁÉÊÊÌuÍ ÏÉЪҨԼÖíØ(ÛzÝÐß9âœäç{éõë_îÒð?ó¡õ øcú»üÿR˜Ïÿ- G eqzyn\Cõ¾†!@#õ$¢&F(ã)y+-‹.0|1ä2G4Ÿ5ð608k9’:±;Â<¸=©>w?<@Û@gAÌAB5B(BøA‰Aõ@!@?Ì=?ìêéÇç¯æÆååuääºããƒãŽã¹ãïãBä¡ä å‡å æ’æç­ç;èÁèJé¼é,êˆêÍêëëëúê²êQê»éé&èççå‹äãbá›ßºÝÅۿٸתխӽÑåÏ4ΦÌIË%Ê3É…ÈÈâÇðÇCÈËÈ–É•ÊÈË/ͺÎsÐLÒCÔXÖ|ؽÚÝ_ß¿á'ä—æéyëçíZðÄò.õ÷óùDüžþß(`•½ ã ù üâ×g+!ë" $N&ó'“)(+¸,=.»/01Ÿ24[5®6ò7,9Z:y;ˆ<Ž=s>T?@¾@JA¹AB0B+BB£AAL@J? >“<Í:Ø8“64Z1`.3+Ö'G$  Öú1[ ÞQäþ®ûøÍõ%óÇð“îŸìãêWéèäæñå-åääÉã—ãƒãã¬ãçã2äŠäüäkåòåuæçç è©è,é©éêvêÃê÷êëëëÂêbêÛé+éSèPç%æÍäVã²áößÞ&Ü%ÚØÖÔÒ?ЇÎñÌŒË[Ê`ɤÈ'ÈçÇîÇ.ȰÈnÉ`ÊŽËäÌoÎÐïÑáÓðÕØMÚ“ÜéÞIá±ãæèýêoíßïMò´ô÷{ùÑû(þqµó(Q y §®´§Ÿƒe= Õ “"K$û% 'C)×*k,ð-q/æ0W2»35i6´7ë8!:>;U%?ï?˜@2A£AöA*B)BB²A3Aq@€?J>Ý<,;:97–4ã1ú.Ò+(û$X!•½ÞöM –ÿKü6ùWö«ó;ñïÿì8ë¤éHèç!æQå®ä/äØãŸãˆãŠã¨ãÚã#äzäääWåÔå_æäæxçèèééêbê´êîêëë ëËê|êðéTézè‡ç_æå¡ãâMàwÞ…ÜŽÚ~ØxÖsÔzÒžÐÙÎ>ÍÑˑʑÉÄÈ>ÈñÇéÇÈ•ÈFÉ0ÊPË¢ÌÎËÏуӇթ×ÛÙ%ÜqÞ×à6ã¦åè…ê÷ìdï×ñ:ô¨öù`û´ýþÿG‚¹æ % BHLK7)á±{ ="ó#ª%I'÷(‚*,¢-%/Ÿ0 2u3Ô4'6q7°8â9;<#=>ù>È?w@A‹AçAB,BBÈAIA@­?Š>&=‚;ž9z75p2‹/v,')¯%"Qž»Ü Qµ9ðüÎùçö/ô³ñoïaí‘ëñé‹èSçTævåÏäHäæã¬ãŒãˆã¤ãÎãäiäÏä?å¿å?æÌæ[çäçuè÷èxéééQê£êåê ëë ëÞê„êêméªè´çœæSåêãVâ£àÓÞçÜïÚåØÜÖ×ÔÜÒøÐ1Ï‹ÍÌÎʽÉïÈOÈÈåÇÈ{È"ÉÊË^ÌÔÍtÏ9Ñ Ó ÕA×kÙµÛþÝ^àÂâ+åœç ê}ìîîZñÈó+öøçúCý‰ÿØNx£ ¾ ×äéæÚƪ‚Y! ä! #O%þ&œ(<*È+[-Ö.U0Ç1-3‘4ä507q8¦9Í:è;î<ë=Ì> ?U@ô@uAÖAB+BB×AdA¾@ß?Å>n=×;:å75ò2#0-Ñ)_&Å">b€›Í iè’ýjúu÷µô/òÜïÉíçëDêÏè’ç€æ¥åêäeä÷ã·ã“ã†ã ãÃã äWä»ä'å¦å%æ²æ<çËçWèßè\éÖé:ê•êÖêëë ëèê•ê,êŒéÓèåçÒæ—å.äªâõà0ßHÝPÛNÙ@×<Õ>ÓUчÏÝÍ\Ì ËòÉÉoÈ ÈëÇÈeÈÿÈÒÉàỂÍ$ÏÞÐÂÒ¼Ô×ÖþØCÛŒÝéßJâ³ä"ç“éìuîáðPóµõøuúÌüÿd¢ß 7 U n‚…whJ'ûʉ!L#ù$¨&N(æ)€+-. 0z1ë2G4¢5ï628h9•:­;¾<¶=£>r?6@Ñ@_AÁA B(BBåA|Aà@ @ü>µ=(<^:S86z3¯0®-t*'z#Í$D\  ”8þûø=õ¬òPð.îGìêéÌç·æÌååyääÀã˜ãŒã•ãÁã÷ãIä£äåˆåæ”æ!ç¯ç;èÄèEé½é)ê‚êËêüêëëðê¦êAê­éúèèçÏå~äîâTá‚ß­Ý¯Û´Ù§×žÕ¤Ó¯ÑæÏ)ΩÌGË*Ê8ÉÈÈìÇÈNÈàȨɩÊÝËAÍÔΆÐcÒYÔmÖ•ØÐÚÝtßÓá=䩿é‹ëûíiðØò<õ¢÷ÿùWü¨þñ4n¡Ë ì #ìÊŸp2!ó"¦$T&ù'š),+¾,>.Á/21¢24]5®6ð7.9T:{;„<ˆ=s>I?@³@CA¯AùA#BBñA’AA6@7?ô=y<º:º8}6ú3@1E.+¹'2$† ¿é#J ‚ ÓIÜþ§û›øÈõ+óÄð˜î¤ìæêaé èîæùå4å™ä äÒãžãã•ã¶ãîã6ä•äüäsåöåvæ çç!è©è,é¥éênêÁêïêëëõê·êVêÉé é?èAçæ½äAã¡áâßÞÜÚØÖÔÒ;ЀÎñÌ‹Ë]ÊhÉ©È3ÈòÇýÇ<ÈÂÈÉuÊ ËüÌÎ4ÐÒùÓÖ+Ø_ÚªÜþÞ\áÅã0æŸèë~íõïYòÉô)÷‹ùàû7þ|Çû7\ „ œ ¯¼º·£ŽlFÛ š"P$&¤'L)Ù*q,ò-v/é0Z2½35l6±7î8:=;Q"?å?”@'A˜AíABBýA¡A!A^@j?6>Å<;$9ì64È1ß.»+d(ç$>!¨Ëä ? ‹ù‡ÿGü3ùTö­ó9ñïí>ë©éQèç+æXå¸ä7äáã¨ãã•ã­ããã)ääçä]åÚå`æéæxçèèéŒéþé_ê­êëê ëëýêÂêkêçé?éoèqçQæþäŽãòá:àeÞvÜyÚrØjÖeÔtÒ“ÐÕÎ<ÍÏ˕ʔÉÍÈDÈÿÇôÇ/È¥ÈWÉEÊbË·Ì5ÎÝϨјӜÕÀ×ðÙ9܈ÞêàIã¼å$è™êívïèñKô¸öùpûÀýSÆó 5 HXTVA1è½~ G"÷#¯%T'õ(Ž*,§-+/Ÿ02v3×4&6u7®8ã9;<=>ö>½?t@A‚AßAB#BÿA¹A7A‰@™?v>=k;‡9^7ù4U2r/Z,)”%û!8o…¯Ç Cª2éüÉùäö.ô³ñqïeí”ëùéè]çWæ‚åÔäRäîãµã’ã“ã©ãØãäpäÔäEåÁåDæÐæ[çèçrèùètéêéJê êÜêëëëÍê{êê_éšè¢çŠæBå×ãCâ‘à¾ÞÚÜÚÚÚØËÖÌÔÒÒðÐ+χÍÌÏÊÄÉðÈ^ÈÈ÷Ç ÈÈ2ÉÊ*ËsÌé͉ÏQÑ3Ó:ÕRׄÙÈÛÞtàÕâ@å®çêìïkñÙó<öžøøúPý™ÿç]ƒ± Ê ãïóòàÔ®\+ ë!¥#Y%'§(;*Ô+X-ß.V0Ê103‘4å517r8¤9Ì:æ;ì<æ=È>˜?P@ë@mAÉABBBÍAMA°@Æ?µ>S=Â;å9Í7u5Ø20ô,¸)C&°"ö+Mk» þ]ß‹ýeúr÷´ô.òàïËííëHêÔè™çˆæ­åòämäÿãÁã™ã‘ã¥ãÍãä_ä¿ä0å¨å,æ´æ?çÏçUèáè[éÒé8êŽêÓêúêëëÜêêê…é¼èØç¿æ„åä‘âèàß;Ý<Û>Ù1×0Õ1ÓOÑÏÚÍZÌ ËôÉÉuÈÈ÷ÇÈzÈ ÉèÉòÊ0ÌŸÍ9ÏõÐÖÒÕÔêÖÙWÛ£ÝýßaâÅä9ç¤éì‰îððdóÃõ)ø…ú×ü,ÿp²êE a }…“Š…oT0Η!L#%®&R(ï)‚+ -“. 01ë2K4£5ñ618j9‘:­;º<²=ž>o?)@Ï@RA¹AýABBÕAlAÌ@ø?ê>›=H?@±@6A§AîABBßA‚Aî@#@"?Þ=b<¢:¡8d6ß3&1*.ÿ*¡'$p §Ñò: u Æ<×þŸû™øÃõ+óÃð›î¨ìèêiéèôææ;å¢ä)äØãªã’ã¡ãºã÷ã=ä›äåxåùå~æ ç•ç è©è-é éêhê»êêêë ëçê°êCêÁé é0è0çþå«ä.ãŒáÒßòÝÜÚÿ×öÕùÓÒ3Ð{Îï̉ËbÊhɶÈ7ÈÈÈJÈÔÈɉʴËÍ™ÎGÐÒ ÔÖ<ØzÚ½ÜßráÙãDæ³è$ë”íðoòÖô<÷šùñûEþÑ Aj ‘ § ¾Ãɺµ‘|H à £"Y$&°'M)á*t,ø-x/ï0[2À35k6³7ï8:>;N?ß?Ž@A’AÞABBíA•A AO@R?#>¬<ý: 9Ô6c4®1Ä. +K(Ë$'!g’´Ô÷ 4 {ð}ÿ@ü.ùQöªó;ñïíCë«éZè%ç3æ^å¿äAäèã±ã˜ã›ã·ãéã0äˆäíäeåÜåfæëæ{çèŒèé‰éüé[ê©êâêëëòê¸ê\êÙé0é]èaç<æíä{ãÞá)àOÞfÜhÚdØ\ÖZÔiÒ‹ÐÐÎ8ÍÏË–Ê™ÉÓÈOÈÈÈ<ȶÈhÉWÊwËÌÌIÎôϾѭӳÕÖ×ÚRÜšÞá_ãÌå<è§êí‡ïùñ`ôÃö&ù}ûÑý_ Óÿ' = Y^d\P7òÁ‹ J"$µ%Y'ü(”*#,®-,/¦02{3Ö4+6r7°8â9;<=>î>»?j@A{AÐABB÷A£A+As@‡?^>øË‡ÌÎÏhÑHÓTÕeמÙÙÛ.Þ†àëâSåÂç3ê ìï|ñëóMö¯øûaý¦ÿõ-f–¸ Ù íùùð×¼–f4 ñ!®#^%'«(C*Ø+]-æ.V0Ñ103–4ç517r8¤9Í:á;é<ã=Á>–?E@å@bAÁAüABúA·ABA—@º?–>D=£;Ð9¶7U5Ä2æ/à,˜).&“"â8W}© òO׃ý`ún÷²ô.òáïÍíðëNêÙè çæ³åüärä äÅã¤ã—ã¯ãÓãädäÈä1å²å+æºæ@çÏçXèÝè^éÌé8êˆêÌêõê ëøêÒê~êêsé°èÄç¯æqå äâÕàß&Ý/Û+Ù&×!Õ(ÓFÑyÏÖÍXÌËöÉÉ~È"ÈÈ$È„È!ÉùÉËH̳ÍNÏ ÑìÒëÔ×/ÙhÛ¾Ý àyâØäKç¹é(ìšîñróÖõ8ø•úèü:ÿÀø(O o ‡“š™‹{\9Öœ!V# %´&Z(ñ)‹+-›. 0†1ì2N4¤5ò6/8l9Ž:­;¶<®=š>e?)@À@OA«AóA BþAÈAXA»@ç?Ð>‹=ö;0:8Ò5F3z0y-@*Ù&L#šÒû<j «„(þúúø8õ«òRð3îLìœê#éÜçÁæàååŽääÑãªã™ã©ãÍãäVä°ä#å’åæ™æ*ç²ç=èÃèEéµé%êvêÀêîêëýêÛêŒê(êŽéÙèòççæ®åUäÊâ,á`߅ݒێٌ׃ՌӟÑÕÏ!Î¥ÌIË.ÊDÉœÈ1ÈÈÈmÈÉÌÉÐÊÌjÍϰВ҃ԚÖÀØüÚFÝßþádäÑæ@é°ë!îŒðüò\õÆ÷úxüÄþO‰»ã  027+Û²€B!#·$^& ()>+À,N.Å/;1¦24a5²6ï7/9R:x;€<~=l>>?@¤@2A™AæABBÏArAÙ@@ ?É=I<ˆ:Š8F6É31.å*ƒ'$P –·àü* d ½/Ñþ—û•øÂõ*óÅð›î«ìïêléèûææGå¥ä6äÝãµã™ã§ãÅãûãGä äååüåƒæ ç™çè«è)é¡éêgê³êãêëýêâêê<ê­éþèèçîå–äãyá½ßáÝôÛñÙò×çÕíÓÿÑ+ÐvÎëÌË_ÊtɶÈGÈÈÈ[ÈäȡɞÊÃË*Í«Î_Ð2Ò"Ô3ÖSØŽÚÔÜ)߈áëãZæÇè6ë©íð‚òèôM÷ªùüTþœáMz › µ ÈÏÒɸ €U'é ª"^$&¶'P)ê*w,ü-~/ò0]2Æ35n6´7ì8:8;N?Û?ƒ@A„A×ABBÝA„Aù@;@>? >™<à:ò8¸6I4”1©.ƒ+3(¯$!N{¡¾ê " päuÿ9ü)ùNö©ó<ñï íCë¶éZè1ç7æiåÅäJäðã¹ãŸã¤ã½ãòã7ääõäfåååhæðæ|çèèéŠéøéUê¤êÛêúêëæê«êPêÈé"éMèPç*æÛäfãÌáà=ÞUÜWÚRØOÖMÔ`ÒƒÐËÎ5ÍÏ˙ʜÉÛÈWÈÈÈNÈÅÈ|ÉiÊŒËàÌ`Î ÐÖÑÂÓÊÕé×ÚcÜ´ÞátãáåOè¼ê/íï òqôÖö2ùûÞý-m­á 2 J cinhUD!ùÌ T"$¼%^')•*-,®-1/ª02€3Õ4/6o7´8Ý9;<=>ñ>®?g@÷@qAÆAúABæA•AA_@s?H>â<:;U9+7Å42`„©Ý *” ÚüÀùÛö/ô°ñxïhíŸëêœèlçdæ“åää_ääÀã¦ã¢ã·ãèã(ä}äáäNåÎåJæÚæ]çíçsèøèpéäéCê–êÐêöêÿêìêºê_êééAéxè€çhæå¶ãânà™Þ¶Ü¹Ú»Ø¯Ö³Ô½ÒßÐ ÏÍÌÒÊÌÉýÈoÈÈÈ=È®ÈTÉ:ÊQËÌεÏ{ÑaÓgÕ~×±ÙòÛ@ÞžàýâiåÕçFêµì$ïñüó\öÃøûrýµÿ;s¢Ç ã ú øâÄžo; ù!¶#c%'­(L*Ø+g-ã.b0Ì183”4é547o8¦9Ç:ã;ä<ß=½>Ž?@@Ý@WA¹AìABéA©A0A…@£?…>+=Ž;¸9—7A5¤2Ð/Â,)&~"Çü#Ejœ ãDÎzý\úi÷³ô,òåïÏíõëRêßè¦ç—æ¹ååyääÐã¨ã¥ã±ãàãäoäÊä;å²å5æ¹æIçÌç[èÝèXéÏé.êˆêÂêòêüêñêÅêpêêbé è¶ç—æfåòãtâ½àøÞÝÛÙ×ÕÓ>ÑtÏÑÍYÌËüÉ#ɉÈ)ÈÈ1È–È2É ÊËYÌÌÍbÏ!ÑÓûÔ×@Ù‚ÛÍÝ)à…âóä[çÌé>ì¨îñ€óèõJø£úúüGÿŒÐ7Y }  ¤£–ƒh?Ü¥!^#%»&](ú)‹+-˜.0‡1ð2P4¦5ò638h9:ª;³<­=“>d?@¾@>A¦AäAÿAóA³AKA§@Ñ?¿>q=á;:8¹5)3b0Z-)*¾&3#‚½ä+X Ÿ÷|þøúû÷9õ©òTð7îOì£ê&éãçÊæåå'å”ä'äÚã±ã£ã®ãÙã ä_ä·ä$å忤æ%ç¹ç<èÄèDé³é êsê¹êèêúêõêÍê‚êê€éÊèàçÕæåAä¹âáNßtÝ~Û‚Ùy×zÕ~Ó—ÑÍÏΡÌKË.ÊMÉ¡È<ÈÈ(ÈÈÉàÉãÊÌ‚ÍÏÉЦҚԲÖÕØÛ]ݱßâxäææRéÃë3îžð ónõÕ÷.ú…üÖþ`–Éï  (;??6  á¿‚O!#¾$g& (ª)<+Ë,M.Ë/<1«2 4d5±6ò7.9Q:w;{<~=e>9?ü?›@*AŽAÛAúAõAÃA]AË@ú?ù>¯=6?Ñ?‚@A€AÈAöA÷AÍAsAê@$@,?ô=~<Ì:Õ8¢6+4{1Œ.j+(–$ö 6gˆ°Õ  c×mÿ2ü#ùMö¦ó=ñï íJëºé_è8ç>æpåÏäQäøãÃã¥ã¯ãÁãýã:ä—äúäkåéåkæõæ}ç èèé‰éôéSêêÖêòêøêÜê êBê¼éé;èAçæÌäRã»áà/Þ?ÜKÚBØAÖBÔUÒ|ÐÆÎ2ÍÏ˚ʢÉâÈ_È#ÈÈ`ÈÓÈÉyÊ£ËòÌvÎÐìÑØÓâÕÿ×4ÚyÜÊÞ%áãôåbèÒê?í°ïò„ôåöFù›ûñý9¹ï ? X muyqcL*ÏŸ U"$½%h' )œ*1,´-6/¬02€3Ú4.6t7¯8à9;<=>é>¬?[@ñ@hA¹AñAóAÙA…AAN@]?5>È<$;:97ª42!/ ,¿(G%¯!ò'Ln™Î †Ñü¼ùÙö*ô³ñvïní ëê¢èqçnæ—åîähä äÊã®ã§ãÃãìã0ä…äâä\åÉåXæÔægçêçwèöèqéàéAêŒêÏêéêûêÞê°êSêÚé2éfèrçRæ åŸã âYà‰Þ¢Ü©ÚªØ¤Ö¤Ô¶ÒÕÐÏÍÌÙÊËÉÉsÈ,ÈÈOÈ»ÈhÉMÊe˰Ì+ÎÊÏ’ÑwÓ{Õ–×ÆÙ ÜTÞµàãåæç[êÅì8ï¢ñ ôqöÎø)û}ýÆÿG…©Ö ï îͧxA "»#m%'¸(N*à+i-ë.a0Ó183—4ë537s8¢9È:ß;â<Û=¸>ˆ?8@Õ@NA¬AäAõAßA•A Ar@?q>=z;™9ƒ7#5‹2¶/¥,g)÷%e"®è 1XŒ Õ:ÅqýYúd÷±ô,òäïÓíúëUêèè©ç¡æÀåå‚ää×ã³ã©ã½ãáã$äqäÓä@å¶å9æ½æIçÑç[èÜèZéÉé-ê€êÀêåê÷êæê·êjêíéWéè¢çŒæJåèãXâ°àãÞÝ Û Ù ×ÕÓ/ÑrÏÊÍXÌËÊ)ÉÈ8ÈÈBÈ¥ÈCÉ Ê+ËpÌßÍyÏ7ÑÓÕ1×VÙ˜ÛãÝ=àâåqçàéNìÀî(ñ–ó÷õ[ø²ú ýRÿ¡Ø<o ‚  ª°­¡pKé©!g#%Ä&d(ý)”+-ž.0‡1õ2R4¦5ö608j9‹:ª;®<«=Ž>\?@´@7A›A×AõAáA¨A5A˜@»?©>Z=É;ü9í7›53C0D- *§&#k¥ÎôK Žìrþóúõ÷7õ¨òVð8îTì§ê,ééçÑæìå/åä.äåã¸ã¬ã·ãÞãädä¿ä)å¢åæ¥æ,ç¹ç<èÇè>éµéêpê³êáêñêìêÁêwê êré¹èÑçÃæŒå-ä©âá>ß_ÝqÛpÙl×mÕqÓ’ÑÄÏΠÌIË6ÊMɰÈAÈ"È3È“ÈÉõÉõÊ0Ì–Í'ÏáкҴÔÅÖìØ)ÛqÝÉß&âäøæhéÖëDî³ðó„õà÷Bú’üçþ)l¥Öý  3GIM</ðÂS!#Ã$o&(±)B+Ï,T.Ì/C1«2 4e5°6ö7(9V:o;|5?ó?”@ A…AÏAìAèA²ANA·@é?à>Ÿ= ?Í?v@AqAÂAæAëA¼AcAÖ@@?à=g<³:½8†64_1t.M+(z$à PyšÈ  XÏeÿ-üùJö¨ó;ñï íRë½éiè=çEæyå×äWääÅã³ã²ãÎãäCääþäuåêåqæ÷æ}çèŠèéƒéôéLêœêËêíêìêÑê–ê3ê°éé-è,çæ¶ä@ã©áîßÞ0Ü8Ú5Ø4Ö6ÔLÒuÐÁÎ0ÍÍËŸÊ¥ÉêÈjÈ*È,ÈhÈéÈžÉ‘Ê³Ë ÍŒÎ2ÐÒëÓùÕØIÚÜÞÞ<áŸãævèãêTíÁï+ò”ôööUù¬ûþýH‹Éù( H f w€„|kV2 Ý  c"$È%n' )¦*0,¾-4/´02‡3Ù416s7°8ß9ÿ:<=>â>¦?V@ç@^A°AâAéAÆAvAô@9@J?>´< ;#9÷6‘4é1/ï+¥(-%—!Û7^†Á }Ìü¶ù×ö(ôµñwïrí£ë ê¨èyçsæ¢åòätääÓã·ã¯ãÌãòã8äŠäëä]åÒåWæÛæfçîçtè÷ènéÞé;ê‹êÃêçêíêÙê êJêÇé'éUèaçBæ÷äŒãúáCà{ÞÜڙؗ֙ԩÒÒÐÏ~ÍÌÙÊÑÉ É~È5È)ÈYÈÑÈuÉcÊvËÆÌ=ÎâÏ¥ÑÓÕ­×ÜÙÜkÞÈà'ãåègêÞìEï¶ñôöÞø9ûŠý×ÿU‘¹ß ÿ  õÙ­„G "Â#s%'¼(T*å+m-î.f0Õ1<3™4ë567o8§9Ã:ß;ß<Ö=µ>?5@É@GA¡A×AêAÌAˆAA]@}?Y>ûX?@°@,A’AÌAæA×A”A)A€@¬?’>E=±;å9Ñ7†5ó2,0(-ñ)Œ&ÿ"Q’¶â9 ‚àgþíúð÷7õ¦òXð:îWì¬ê2éîçÚæðå:å¡ä8äëãÁã³ã¿ãäãäkäÄä.å¨åæªæ.ç¹ç@èÄè>é´éêmê®êØêëêàê¶êmêúéeé¨èÁç±æ}åäšâìà/ßMÝ]ÛcÙ]×aÕhӈѽÏΙÌOË5ÊUɵÈLÈ.ÈBÈ È2ÉÊ ËCÌ«Í=ÏõÐÑÒÈÔÛÖÙ<ÛˆÝÛß=â¡ä çyéêëVîÅð,ó“õô÷Pú¡üöþ6}±á ) AQSYD;ûÈšY!#Ì$q&(®)M+Ð,Z.Ð/G1­24f5²6ö7(9T:n;y2?ë?Ž@A{AÃAãA×A¤A>A¤@×?Ê>ˆ=<=:A8ö5{3¸0Á-”*8'³# Mx¤Äû 9 •´þ‡û‡øºõ*óÃð§î²ìýê|é,è ç"æYåÁäJäûãÈã´ã¿ãØãäYä²äåŒå ææçç&è©è)é˜éêWê¤êÏêêêáêÁêzêê‡éÊèóçåæºå_äââFá€ß°Ý½ÛÃÙÅ×¾ÕÎÓàÑÐhÎáÌËfÊÉÑÈ]È2È;È‹ÈÉÔÉÚÊÌgÍìΠÐrÒgÔsÖ–ØÏÚÝi߯á+ä’æémëàíKð³òõ|÷Üù/ü€þÉ Dw Ã Ö ëóïëÓ¿˜s:!½"w$"&Æ'e)ù*…, .…/ÿ0f2Ë3"5r6´7î8:7;F?Æ?p@û@hA¶AÜAÚA°AOAÇ@ý??È=Q<›:£8o6ö3G1V.7+à'g$ 8d†· ö IÃ[ÿ&üùFö§ó;ñïíQëÅémèBçQæ{åáä^ä äÒã·ãºãÖãäMä äåxåðåsæúæ„ç è’è é‡éîéJê“êÈêäêåêÅêŒê#ê¥éíè èçöå¢ä1ã’áÝß ÞÜ+Ú$Ø%Ö/Ô=ÒqкÎ,ÍÏ˞ʫÉðÈsÈ6È8ÈyÈøÈ²É¡ÊÈËÍŸÎKÐÒÔÖ)ØcÚ¡ÜõÞRá¯ã"æ…èùêeíÔï=ò¦ô÷hù¹ûþVšÖ3 W p ƒŽ‰‹qb;á­ e""$Ë%w')­*6,¿-?/±0!2„3Þ416s7±8Þ9ý:<=>Ú>¡?P@Ý@UA§AÑAáA³AjAß@(@4? >œ<ô:9à6u4Í1î.Ô+Œ(%{!Æù%Gz¬ n Âü³ùÑö(ô³ñyïtí¨ëê­è}ç|æ§åüäyääÜã¼ã¹ãÏãüã=ääòäaå×å[æÞæjçîçyèòèqéØé9ê†ê¼êáêäêÍê˜ê8êÀééJèMç/æéävãæá6à`Þ„Ü†ÚØ‡ÖÔ ÒÇÐÏvÍÌÖÊÙÉɈÈ@È5ÈiÈßȉÉrÊŒËÛÌSÎõϾѤӦÕÄ×ïÙ6Ü~Þßà8ãªå èêíìYïÇñ,ô’öîøIû™ýçÿ)gšÉì  ()%þງT "Ì#v%%'¾(^*ç+u-ï.l0×1>34é597p8¢9Ç:×;à<Ð=²>x?/@¿@AA“AÎAÚAÀAwAü@N@d?H>âR? @§@"A‡AÁAÚAÆA…AAp@—?|>0=š;Ì9º7i5Ü20-Ö)s&å";x¤Íô+ r×[ þãúò÷/õ«òSðAîXì±ê7éôçàæûå>å­ä=äöãÈã¼ãÅãîã ätäÈä6å«å%æ­æ0ç¼ç@èÃè>é¯éêgê¨êÒêãêÕê®ê]êðéVé˜è²çŸækåäˆâÛàß;ÝOÛPÙQ×RÕ_Ó~ѸÏΚÌOË9Ê\É»ÈYÈ6ÈRȰÈDÉÊËVÌÂÍQÏ ÑæÒßÔòÖÙVÛ˜ÝõßNâ¶ä!çŒéûëiîÖð=ó£õø]úµüÿþJ†Âë 2 QWeZW=%Ó¢^! #Î$|& (¸)N+×,].Ô/J1¯24h5³6÷7'9V:h;z(?æ?‡@ AvAµAÖAËA“A.A“@Á?¸>q=ë;):#8á5]30¨-w*!'˜#õ5eŒ¸æ . ‡ ¬þ‚ûøºõ$óËð£î¹ìëé3èç"æhåÂäWääÏã¾ãÄãããä`ä¸ä"å‘åæŽæçžç&è«è%é™éêSêžêÇêâêÚê´êqêêwé¾èÞçÙæ£åQäÎâ2árߙݯ۴ٳ׷սÓÚÑÐdÎàÌËiʇÉÕÈkÈ:ÈIÈÈ"ÉíÉçÊÌwÍϴЊÒ{ÔŠÖ¬ØåÚ)Ýß×áB䥿éƒëñí\ðÉò*õ‘÷èùAüþÖP„ª Í ä öüûñáÆ£xD !Ç"{$(&Í'i)þ*‹,.Œ/ÿ0j2Í3"5t6´7î8:3;D<@=)>?¿?g@ó@^A«AÐAËA¡AAA³@ë?î>±==<€:Ž8Q6à3'1?.+Ç'L$« ò%Nv¥ ç >¹Sÿ üùEö¥ó=ñïíYëÈésèKçTæˆååäiääÚãÀãÃãÛãäOäªä å|å÷åwæûæˆçè”è éƒéíéDêêÀêÜêÜê»êêê”éáèèçæåŽäã‚áÉßùÝ ÜÚØÖ"Ô6ÒiдÎ+ÍÍË¢Ê¯ÉøÈ{ÈAÈEȈÈÉÄɳÊÞË1͵Î`Ð-ÒÔ#ÖCØtÚ»ÜßfáÉã/æŸèëzíãïRò²ô÷tùÌûþe§æE ^ € —˜‘~iEî¯ q"($Ð%~')°*>,Â-A/¶0#2‡3â4/6x7®8ß9û:< =þ=Õ>?E@Ù@HAžAÈAÏAªASAÒ@@!?ò=‡<Ú:ð8Æ6Y4¶1Ñ.º+r(ú$e!¬å5hŸ ùdþÿ½ü­ùÏö&ôµñxïzí©ëêµèƒç„æ®åå„ääæãÄãÀãØãäDä—ä÷äfåÞå^æãæiçðçyèñèqéÓé9ê}êºêÔêßêÁê‹ê/ê­éé7è>çæ×äcã×áàUÞlÜyÚ~ØwÖ†Ô’ÒÃÐÏxÍ ÌÜÊÚÉÉ‘ÈJÈBÈyÈíȞɂʣËìÌjÎ ÐÐѾӹÕÛ×ÚJÜ”ÞóàOãºå$è‘êílïØñ?ô¡öùWûªýóÿ:q«Óù  $52/ ë¾”V "Ñ#%('Ê(\*ò+t-ø.m0Ú1A3ž4í597o8¤9Ã:×;Ý<Ì=¬>u?#@½@2AŽA¾AÐA±AfAí@9@T?.>Ï<3;Q977Õ4>2b/[,)°%"l¢Íûc ª§^ýFú\÷ªô,òéïÚíìfê÷è¾çµæÕå&å˜ä3äðãÈãÄãÏãüã7ä…äæäMåÉåBæÉæOçÕç`è×èZé¿é$êrê­êÏêÞêÆê™ê?êÉé&écèmçYæå¯ã#âwà«ÞÏÜÙÚàØàÖáÔöÒÑZÏÄÍRÌË Ê:ɪÈTÈBÈkÈÕÈxÉTÊiË«ÌθÏzÑYÓYÕn×›ÙÙÛ#Þ|àÙâDå¨çêƒìöî^ñÇó,ö‰øäú4ý†ÿÅ8k ¬ ÀÌÐͽ¬‰g6 Â!{#,%Õ&v(*¡+*-ª.&0’1ý2V4®5ó688c9:Ÿ;ª<œ=ƒ>J?@œ@AzA¶AÍA¶AxAA^@?k>=†;±9¡7O5À2õ/ò,¼)X&Ì"%]¹â dÊSþâúé÷3õ¥òZð?î_ìµê=éûçæææFå¶äDäÿãÏãÄãÏãñã-ätäÓä;å®å-æ¬æ6ç»çDèÀè@é«éêaê¤êÇêÞêÉê£êSêßéJé…è£çŒæYåóãsâÊàß*Ý<ÛBÙB×GÕRÓxÑ®ÏΕÌQË=Ê_ÉÆÈ`ÈEÈ`ȾÈWÉ(Ê1ËmÌÓÍjÏ ÑýÒóÔ ×.ÙiÛ³ÝàhâÇä7çžéì{îèðOó·õøpúÂüÿV˜Êÿ! B [cqdbH- Ý¥m! #Ú$€&((»)V+Ú,`.Û/H1¸24j5¶6ò7-9N:k;t"?á?}@AfA­AÆA¾A‚AA~@¯?¢>[=Õ;:8Ê5@3…0Œ-^*'#ÝOz¢Ú  ~ÿ¥þ|û}ø¹õ#óÌð¥î½ìëˆé7èç.æhåÒäYä äÙãÃãÎãèã$ädäÁä$åšåæ”æç¡ç'è¬è!é›éúéSê–êÂê×êÑê¨êeê÷égé°èÍçÅæ”å<ä¾âá^ߋݜۥ٧צնÓÑÑÐ`ÎáÌŒËqʈÉàÈtÈEÈ\È¥È:ÉýÉüÊ.Ì‹ÍÏÈСÒÔ¡ÖÂØûÚ?Ý“ßïáS伿)é”ëîmðÚò<õ ÷÷ùRüœþè$`¹ Ù ð  øî˯O!Î"$0&Ñ'q)+Ž,./1l2Î3&5s6¶7ì8:3;@<<=&>û>º?^@ë@SA AÁAÀAA1A @Ø?Ú>›=%6¿31 .+°'2$– Ø7g“ Ü 1®LÿüùAö¤ó=ñïí\ëÎézèPç]æåïäpääâãÈãÊãäãäZä¬äååûå{æç‡ç èèééèéDê†ê»êÔêÑê´êoêêé×èùçûæÑåä ãoá¸ßæÝýÛÚØ ÖÔ0Ò^дÎ%ÍÒˡʶÉþÈ„ÈPÈQȘÈÉÖÉÇÊòËDÍÍÎqÐHÒ,Ô<ÖVØŒÚÍÜ ßyáÝãDæ®è ëˆíúï^òÆô(÷†ùÚû,þs¶ð#L p ‡ ™£¡œ†tJ*î¾ s"/$Û%~'!)±*D,Æ-E/º0%2Š3á426u7°8Ü9û: < =ø=Ð>–?>@Î@AAA¿A¿AœADA½@@?Ú=q<Á:Ù8«6B4™1·.¢+V(ä$K!”Óø'T” è`ðÿ½ü¥ùÐö#ô¸ñyï}í°ëê¼èŠç‹æ·å å‰ä+äëãÍãÉãßã äJääþäkåâåbæãænçðçzèðènéÑé1ê|ê¯êÒêÏê½ê|ê%êéúè#è0ç æÅäSãÀáà>Þ_ÜhÚnØmÖwԌҺÐÏtÍ ÌÞÊáÉÉžÈRÈSÈ…ÈɬəʴËÍÎÐëÑÏÓÔÕí×Ú\Ü®ÞágãÌå8è¥êíïçñQô±öùeûºýF‚³â  5<>;%òÉ›^ #"Ô#ˆ%.'Ì(e*ó+{-û.o0Þ1C3Ÿ4í587p8Ÿ9Å:Ñ;Ü<Æ=¨>l?@±@)AƒA²AÂA AXAÖ@*@¸<;797º4!2M/:,)‘%"T‹»æN ¢ ¡VýAúY÷ªô.òêïÞíìkêþèÄç¾æÜå0å ä<äùãÒãÇãÝãÿãAäŠäíäRåÎåFæÌæQçÙç]èÛèUé¾é êlê¨êÆêÖêºêŽê3ê»ééOèaçCæåœãâfà™Þ½ÜÌÚÎØÓÖÖÔìÒÑUÏÀÍSÌËÊ@É´È^ÈPÈxÈåÈŠÉhÊ{ËÃÌ0ÎÒÏÑqÓnՄײÙîÛ8Þ’àìâXå½ç/ê˜ìïpñØó>ö—øöúBý”ÿÒB|” ¼ È×ÜÖÇ´‘q= Æ!†#.%Þ&{(*¨+--¯.'0–1ý2Z4®5ô668c9‹:;§<˜=|>G?ú?—@AqAªA¾AªAfAò@M@l?U>ÿ?Ú?v@ù@`AœA¿AªAxAAp@˜?>B=Á;õ9ô7«5)3j0q-D*ì&g#Ä :hÊ  uô þsû~ø²õ&óÌð©îÀì ë‹é@è#ç4æså×ädääàãÎãÒãôã%äpäÄä,åœåæ—æç¡ç*è©è%é•é÷éPêê½êÎêÇêžêWêééYéžè¿ç³æƒå(ä­â áNßwÝŽÛ”Ù™×›ÕªÓÊÑÐ]ÎÞÌËtÊŽÉçÈ€ÈOÈjÈ·ÈHÉÊË@̤Í,ÏáеҧԶÖÙØÛWÝ¥ßâgäÏæ=é¦ëî€ðèòPõ¬÷ ú]ü­þô4lœÄ ä ý ô×µŠT!Ö"ˆ$5&Ø't) +“,.“/1p2Ð3'5t6¶7ì8:3;;<:=>÷>±?Z@ß@JA“A·A°AAAŽ@Å?Å>†= ?5@Ç@6A…A°A²AA2A®@ì?ú>Å=Z<ª:¿8“6%41.†+=(Ê$3!·éF„ ÝSìÿ²ü£ùËö"ô¹ñ{ïí²ë#êÀè’ç“æ½åå’ä1äôã×ãÍãêãäSä¥äÿätåãåhæçæoçòçyèòèjéÑé,êuêªêÇêÊê¯êqêêéêèèçúå±äAã¯áüß/ÞLÜYÚ^ØaÖkÔƒÒ²ÐþÎpÍÌáÊâÉ*ÉŸÈfÈXÈšÈ ÉÀɬÊÅËÍ‘Î7ÐÒãÓëÕØ3ÚuܾÞáwãâåJè¸ê#í‘ïùñaôÀö!ùuûÇýR‘Àï - =HIB4ýÏ£g '"ß#%2'Õ(i*ø+€-ý.t0â1C3¢4ð587o8¢9¿:Ó;Ö<Á=¥>e?@ª@AwA¦A¶A‘AHAÅ@@(?>¢<;!97¢420/!,è(t%ì!8w©Ð? “•Rý<úX÷¥ô1òéïãí ìpêéÏç¿æìå0å­äCääÛãÏãäãäHääòäXåÑåKæÏæSçÚç]èÜèQé½éêeê£ê¿êÌê³êê*ê©é é=èQç2æóäŠãýáSà‰Þ¬ÜºÚÂØÃÖÍÔàÒ ÑPÏ¿ÍPÌËÊFɾÈiÈ[ÈŠÈõÈ›ÉzÊËÓÌLÎßϪÑÓ‰Õ—×ÈÙÜPÞ¡àãdåØç<ê­ìïñëóJö¬øûVýÿä U‚¦  ØáæßÒ½œwE Ï!‰#9%à&(*©+3-±.*0™13Z4®5ö638d9‡:;Ÿ<—=t>@?ô?Ž@AhA›A´A—AXAá@7@]?:>í?Ò?o@ï@VAA°AŸAbAü@X@ˆ?w>/=¤;â9Ô7™5 3S0T--*Ñ&P#­ò&S€»  kê™þoûyø³õ&óÌð®îÂìë‘éFè+ç<æzåáäjääéãÓãÞãøã1äräÏä-å¥åæ›æç¦ç'è«è!é•éõéIêŠêµêÄê¾ê’êLêÜéJéŽè¯ç¡æsåäœâøà;ßhÝzÛ‡Ù‹×Õ£Ó¼ÑÐRÎáÌ‹ËyÊ“ÉòȆÈaÈsÈÊÈYÉ!Ê$ËT̶ÍEÏóÐÎÒ½ÔËÖïØ%ÛiÝ¿ßâäàæPé¼ë&î”ðúò`õ¾÷úpü¸þ>{§Ô í þà¾_!Þ"$:&ß'z) +™,.—/1t2Ï3+5r6¹7é8:+;=<2=>î>­?O@Ù@>AˆA©A¡AuA A~@¯?¯>p=ô;<:=8 6‹3Þ0ì-Í*{'$c ¯ã>w ½ ›:ÿü ù<ö¥ó>ñïíeëÛé…è`çlæžåþä‚ä*äòãÚãÙãôã$äfä»äå‰åææ ç‡çèè é}éàé;ê|ê¬êÃê¿êœêYêóéfé·èØçÙæ­åZäæâIá•ßÀÝÞÛåÙî×ðÕÿÓÒRШÎ$ÍÎ˪ʽÉÉ—ÈeÈnȶÈ;ÉùÉïÊÌrÍôΡÐpÒ[ÔhÖ‚Ø·ÚúÜGߥáämæÖèCë±íð†òåôL÷ ùþûFþ’Ó@e † ¢ ®¸ºª¡€b6É ‡"9$é%‰'-)º*O,Í-M/Á0)23å446x7®8Ú9ø:<=ì=É>ƒ?5@¸@0AxA£A¦AzA#Aš@Ø?æ>­=C<‘:§8w6 4e1.o+ (±$!g¤Ð2w ÏIáÿ­üùÇö%ô´ñï‚í¶ë*êÃè›ç—æÈååšä:äüãÞãØãîãäXäªä åuåïåeæïæpçõçxèòègéÐé'êqê¤ê¾êÂê£êhêê„éØèè çèåŸä.ã›áëßÞ>ÜFÚRØRÖ`ÔxÒ«ÐøÎoÍÌáÊéÉ.ɬÈmÈjÈ¥È ÉÑɾÊÜË.ͨÎNÐÒýÓþÕØHÚ‹ÜÔÞ2áãöå_èËê8í¢ï òrôÓö0ù…ûØý bœÑû : GVRN=%Ú¬m 2"ä#’%>'Ô(s*ü+„-/t0ç1F3¢4ô547t89À:Ï;Ò<¿=>`?@ @AjAœA§AA8Aµ@@?î=Š<é: 9ã64ç1/,Ê(]%Ï!"aÀï3 „ø‹Jý6úT÷¤ô/òìïäíìtêéÔçÉæïå;å²äLääâãÚãçãäKäšäöä`åÔåQæÐæXçÚç^èÜèNé¾éêdê™ê»êÀê«êsêêéüè.èAçæâävãëá?àyÞ–Ü®Ú®ØºÖ½ÔØÒÑKÏ»ÍOÌËÊNÉÆÈtÈiȘÈÉ­ÉŽÊ¢ËìÌ[ÎûϼњӞկ×ÞÙÜfÞ¸àãååçUê½ì.ïñÿóZö¼øûdý¯ÿð1_“° Ñ âíòéÝÄ¥N Ù!Ž#B%æ&Š(*²+5-·./0›13]4°5÷638d9…:š;Ÿ<‘=q>;?í?…@AZA”A¢AAFAÏ@(@C?+>Ò<=;j9S75p2¦/¤,m) &"ßVz´é ?§7êýÑúà÷-õ¥ò]ðHîiìÆêKéèúææ\åÍä_ääëãÙãçã ä@ä‰äæäIå¾å8æ¸æ;çÃçBèÂè;é£é êPê’ê³êÀê±ê}ê/ê·ééZènç[æ å¾ã<â’àÓÞõÜ ÛÙ×Õ8ÓYÑ¥ÏΙÌQËGÊvÉÙÈ…ÈhÈ‹ÈîȉÉaÊjË«ÌΪÏcÑ=Ó9ÕG×qÙªÛòÝEà¥âårçÙéHì³îñ…óæõFøžúðü=ÿƒ¾ö#H g z‰Œˆ{eK!ö¿!<#é$–&5(Ò)^+î,j.å/T1»24m5·6ô7)9M:d;k?Ê?g@ç@KA…A¥AAXAç@H@u?_>=‹;Ë9¼7z5ò260:-*µ&8#“Ú>n© ô[âþlûpø²õ"óÎð­îÇìë™éHè3çCæåîämä(äíãÞãäãä5ä|äÐä9å¦å æŸæ"ç¨ç)è«è é“éòéFêƒê®ê¿ê²ê‰ê?êÍé=éèç’æ^åäˆâåà+ßTÝjÛxÙx׆ՒӹÑõÏRÎßÌ‹Ë}ʘÉ÷È”ÈgȇÈÔÈnÉ2Ê8ËgÌÍÍYÏ ÑáÒÔÔàÖÙ9ÛÝÒß-âä÷æcéÍë<î£ð óoõÑ÷'ú~üÊþQ‡¶à ú  )% êÅœb-!à"š$@&æ'€)+Ÿ,.ž/1x2Ó3*5x6´7ì8:+;:ê>¥?I@Ï@5A}AA”AbAþ@j@?›>Z=Ý;$:$8ð5s3Â0Ñ-´*^'ë#G œÊ,g ¬ Œ6ÿü ù5ö¦ó=ñï!íjëßé‹èhçoæªååŒä0äüãßãâãúã*änäÀä#å忇æçŒçèè ézéáé4êzê£ê¿ê´ê’êOêåéZé§èÈçÊæ™åMäÐâ:á‚߯ÝÌÛØÙÝ׿ÕôÓÒLУÎ!ÍÐˬÊÃÉÉ¡ÈqÈ|ÈÃÈMÉ ÊË.ÌƒÍ Ï¶Ð…ÒqÔ}Ö—ØÐÚ Ýaßµáä|æîèRëÅí+ð—ò÷ô\÷±ù üWþ áKr ” « ¼Âø¦i@ Ð Œ"B$í%”'-)Å*P,Ó-S/¾042ˆ3î406z7®8Ø9÷:<=ë=Á>?)@´@ ArA•A˜AnAAŽ@Á?Õ>–=-[?@›@ A_A‘A–AwA&A¤@î??Û=r<Ö:ì8Ò6m4Ó1û.í+²(C%»!N{®à% uðEý1úR÷¡ô2òìïèíìxêéÚçÐæöåCå»äRääåãæãíãäSäŸäýädåÚåSæÖæXçÝç`è×èRéµéê]ê“ê´ê·ê êiêê’éêè#è+çæÊäiãÖá.àgކܜڢةֶÔÌÒþÐEϸÍOÌËÊYÉÊÈ‚ÈtÈ¥ÈɿɟʸËýÌsÎÐÐѳӰÕÅ×öÙ)Ü~ÞÊà/ãåüçdêÒì=ï¥ñôköËø"ûsý¼ÿ:q›¾ Ý ìúùöåϰ†X Þ!˜#D%ï&($*¶+9-¼.10ž13]4³5ö658`9†:–;<Œ=l>4?æ?{@ù@MAˆA–A}A7A¾@@0?>»<';O9?7å4Y2‹/‰,U)ò%k"Å <má -¡*çýÉúà÷'õ«òZðOîkìÊêTéèç æeåÕäfääòãáãîãäHääëäNåÄå;æ¼æ?çÂçGèÁè7é¥éÿéQêˆê¬ê¹ê¤êtê"ê¨ééHè^çKæ å­ã)â€àÂÞåÜûÚÙ ×Õ+ÓUÑ™ÏΓÌTËMÊwÉèÈŒÈsÈœÈúÈŸÉnʃ˹Ì+νÏxÑTÓNÕ\׈ٽÛÞ[àµâåƒçìéZìÄî-ñ•ó÷õTø®úþüLÿÌ,X o ‰‘˜‘…qO.úɆ!B#ò$š&>(Ó)g+ï,p.è/W1½24o5·6õ7'9J:d;f<`=>>?Â?`@ß@>A~A‘A†ACAØ@6@_?M>=t;²9¢7a5Ú20!-ú)˜&%#vÉø-[œ ãSÕŠþcûoø°õ"óÎð²îÈìëœéPè;çGæåíä~ä*äùãåãìãä>ä€äÙä<å¬å"æ£æ%ç¨ç-è§è#éŒéñé>ê€ê¦ê¶ê©ê~ê2êÃé+ésè‹ç‚æMåóãtâÕàßBÝ]ÛeÙp×tÕŽÓ«ÑõÏKÎÜÌË}ÊŸÉÉšÈxÈÈçÈ}ÉEÊJË}ÌáÍnÏ!Ñ÷ÒéÔùÖÙQÛ•ÝæßDâ¡äçqéåëHîºðó…õÜ÷:úü×þ!\”Äé ,3.$õΣk2!ê"$J&ç'ˆ)+¤,#.Ÿ/1u2Ù3(5|6²7ï8:+;5<+=>ã>Ÿ?@@Ç@+ArAŽA‰AQAï@U@Œ?„>E=Æ; : 8Ö5X3©0·-˜*H'Í#4 µïY ƒ-ÿÿûù9öžóDñï)íkëçéŽèqçvæ®ååä;ääæãêãä0äväÅä)å•å æ‰æ ççèè éyéÜé1êrêŸê³ê­ê…êDê×éNé“è¼ç´æŒå6äÁâ&áoߠݹÛÉÙÐ××ÕêÓ ÒFОÎ"ÍË˳ÊÅÉɬÈzÈŠÈÓÈ]ÉÊË?Ì›ÍÏÍК҉Ԓ֯ØâÚ&ÝoßÒá)ä˜æûèlëÓí?ð§òõm÷Âùühþ­ï%X} £ ´ ÊÌÌį—sGÚ ‘"L$ñ%š'3)Ë*T,Ù-S/Æ0423î426z7®8Õ9ø:û;=â=½>y?"@ª@AbAŠAŠA[AAu@³?¼>„="ó#Ÿ%I'â(z*,Š- /}0ê1K3¦4ó587s8š9¾:É;Ë<¹=Ž>X?þ?‘@ARA†AˆAhAA’@Ü?ì>Ã=]<»:Ö8¶6U4·1â.Ò+™()%¡!ó6hšÑ pÝ~9ý.úM÷¡ô1òíïëíì}êéáçÕæÿåKåÂä]ääðãìãöã"äXä¦äåiåàåUæÚæZçÞç`èØèOé³éêWêê«ê¯ê•ê_êê…éÜèèçþå¾äQãÉáàTÞwÜ‹Ú’ØŸÖ¦ÔÆÒôÐ?϶ÍLÌË ÊZÉÙȇȆȱÈ(ÉÏɲÊÌË͉Î$ÐæÑÇÓÇÕÞ×ÚEÜŽÞáàFã åèxêãìRï³ñ!ôzöÞø.û„ýËÿJ|¨Í æ ûþòÖºŽa' æ!#O%ñ&–()*¸+B-¼.80¡13b4¯5ü6/8e9ƒ:“;œ<…=i>-?Þ?t@í@FAxAŒAkA(A¬@@?ÿ=¥<;79#7Í4>2q/n,;)Ù%P"°ï)XŽÌ %&ÜýÄúÝ÷%õ©ò^ðMîsìËê[éèç*ækåÞänä&äøãêãöãäOä–äñäUåÈå?æÀæ@çÅçDèÃè6é¢éþéJêƒê¥ê±êšêiêêœéÿè<èIç<æùäãâpà¬Þ×ÜêÚöØÿÖ Õ!ÓNÑ“ÏÎ’ÌWËNÊÉìÈ™È€È©È É¬É†Ê‘ËÒÌ>ÎÒÏÑhÓeÕsמÙÒÛÞmàÎâ-å˜çÿémì×î?ñ§óödø¾úýZÿŸÛ=_ ¡žŸŒ|W9Ò!H#ù$ &C(Ù)l+ó,s.í/W1Ä24t5´6ø7$9K:`;d<\=8> ?¹?[@Ñ@7AoAˆAuA5AÅ@&@I?;>éÜ>œ?6@¾@#AbA‡AvADAÞ@C@x?q>+=²;ñ9ô7½5;30›-*,'µ# i£ØH Ž øy$ÿùûþø3ö óCñï-ípëèéšèqç€æ·ååä?ä äîãòã ä8ä}äËä/åšåæŒæç‘çè‘èéxéÙé,êmê—ê­ê¡ê~ê6êËé?é†èªç¥æxå$ä±âá`ߌݩۼټ×ÐÕÚÓÒ=КΠÍÌ˶ÊÌÉ%ɶȆȘÈäÈlÉ0Ê(ËS̰Í5ÏáÐ³ÒœÔ©ÖÆØ÷Ú;݇ßåá?äªæé|ëçíRð¶òõz÷Ôù(üvþ½û7_’ ¦ È ÎÝÒÒµ¤yQß "O$û%Ÿ';)Ì*Z,Ý-X/Ê032“3ë476x7­8Ù9ð:þ;ù<à=·>u?@¦@ AYA}A}ALAô@b@¡?¥>o=ü;J:\8*6¿313.+Õ'e$Ñ "a”ÉI «&Éÿ—ü‘ù¾öô¸ñƒïŒíÄë5êÙè«ç®æÝå3å±äSääóãòãä0äoä¸ä!ååÿåpæøævçøç{èíèeéÃéê^ê’ê¦ê§ê„êDêáéZé¬èÖçÚæ²åjä÷âeá´ßéÝÜÚ"Ø-Ö?Ô\Ò—ÐéÎiÍ ÌëÊõÉDÉÈÈÈ’ÈÓÈOÉ ÊõÊÌjÍçÎŽÐUÒ?Ô@Ö\ØŒÚÈÜßjáÎã0æšèëníÚï@ò¦ô÷aù´ûþKŽÅø! @ ^ hypmY@õˆ E"ù#¨%L'ë(~* ,-/€0í1P3¥4÷587q8œ9º:Ê;Å<¶=Š>Q?ø?ˆ@ù@JAwA|AYAA‚@È?×>¯=E<£:¾8š6;41Ä.º+z(%†!ÛR‰º YÚn8ý$úM÷žô0òðïííì‚êéãçâææVåÉäeääûãïãä"äfä¨ä åpåáå\æÝæ\çâç^èÚèMé²é êTê…ê¦ê¤êŽêQêôéwéÌèè çðå©ä@ã´á àAÞgÜyÚ†ØÖŸÔ·ÒðÐ8ϳÍMÌ Ë%ÊaÉßÈ—ÈŽÈÄÈ6ÉâÉÆÊÞË'ÍœÎ=ÐûÑáÓÛÕô×ÚYܦÞ÷àXã¹å!èŽêôìeïÇñ/ôöèøDûýÜÿV´Ù ô  úãÀœe2 ë!¨#Q%ý&—(1*¾+D-Å.50¨13e4²5û608d9€:”;•<…=a>)?×?k@å@8AoA|A_AAž@ë? ?é=<÷:97´4!2V/T,)¿%9"’ÝGyÀ ‰ÕýÀúÔ÷(õ¡òeðIîzìÎê`é#èç1ætåãäyä*ääïãääVäžäõä\åËåEæÁæEçÆçEèÃè2é éúéDêêœê§ê‘ê^êê‘éîè,è:ç(æêäˆãâ]à›ÞÅÜÚÚæØòÖûÔÓEÑŽÏüÍ‘ÌYËRʇÉöȡȒȲÈ"ɻəʦËåÌTÎêϢтÓyÕ‰×¶ÙæÛ7Þ€àæâ>å¯çê‚ìèîRñ¸óöyøÊú ýhÿ­êJo ‰ Ÿ¨­¦šƒb@ Ù•!P#þ$ª&E(ã)n+ù,x.ï/\1Ä24s5·6÷7#9L:\;bþ>¹?L@Í@*AbA{AfA$A·@@8?#>Ôó¥õøYú¬üöþ<z°Þ 7DHE:!ßµ|@!÷"­$T&ö'‘)!+¬,,.¥/1|2Ü3/5x6¸7é8:&;0<%= >Ú>‘?1@´@A[AuAjA4AÊ@4@b?[>=–;Û9Ú7¡5$3r0-c*'š# QŒÆñ; { ðj!ÿîûüø/ö óAñï/írëôé˜èç†æ¼åå¢äIääõãüãäCä€äÒä6ååææç‘çèè éuéÖé'êhêê¤ê˜êtê'êÁé,éxè›ç‘æiåä›âáHß~Ý—ÛªÙ³×½ÕÔÓùÑ6ИÎÍÐ˶ÊÒÉ,ÉÀȒȦÈóÈ~ÉBÊ;ËjÌÄÍKÏøÐÆÒ¶Ô½ÖÛØÛMÝ¡ßôáZ乿)éŒëüícðÈò0õ‰÷æù8ü„þÍ Doš ¸ Î àâã×ë‚] ë ¡"W$&¦'>)Ô*],ã-[/Í062•3î466z7®8Ô9ò:ú;ô<à=®>n?@—@ALArAkAAAÞ@S@Œ?>Z=ã;5:=86¡3ü0.+¹'K$· Jµï : ÀÿüŠù½öô·ñ‡ïŽíÇë=êÛè´ç´æåå9å¼äWääüãøã ä7äsäÃä å‹åüå{æôæ}çøçzèîècé¿éêYêŠê¡êšê{ê8êÖéHéŸèÄçÉæ¢åUäæâRá£ßÖÝùÛÚØÖ4ÔTÒŒÐéÎaÍÌèÊþÉHÉÔȚȞÈäÈ_ÉÊË-Ì~ÍÏ¢ÐlÒTÔZÖpؤÚÛÜ.ßáàãGæ«èë‚íêïTò¶ô÷qùÅûþ]™Õ- Q e y}tdK&ÿÉ M"ÿ#°%Q'ò(‚*,“-/ƒ0ñ1O3ª4÷587r8›9·:Ç;Ã<°=‡>H?ð?@í@AAhAqAHAô@o@µ?Ã>˜=0<Š:¥864„1©.Ÿ+a(ø$m!Ä>uª÷ PÊh-ý"úF÷Ÿô-òñïïí ì‡ê!éìçææ æ[åÒälä)ääúãä0äfäµä åuåçå`æßæaçßçbè×èKé±éêPê~êŸêšê†êCêêégé¿èóçùæàå”ä2ãžáúß0ÞUÜjÚvØ€Ö”Ô¯ÒåÐ7Ï­ÍPÌ Ë*ÊhÉéȡȜÈÒÈEÉõÉØÊóË;ͳÎPÐÒõÓòÕ Ø3ÚpÜ¹Þ álãÍå6è¡ê ítïÝñ<ô¥ööøUûŸýêÿ*f—Âç ü éΟu3 ø!«#[%'ž(6*Â+K-Ä.?0¦1 3e4µ5ù658^9:;“<€=^>?Ó?`@Ü@0AaApAQAAŒ@Ø?÷>Ò=y<Þ:9ñ6—4 28/<,)¨%"€Áÿ0j¯ |Îý¸úÔ÷"õ¦òaðRîyìÖêdé'èç4æ}åîä{ä:ääþãä'ä\ä¥äùäeåËåMæÃæGçÈçGèÀè6é™éúé=ê{ê“ê ê†êSêüé€éãèè-çæÙäwãðáJà‹Þ±ÜËÚØØáÖóÔ Ó?чÏùÍÌZËVÊÉûȯȚÈÃÈ1ÉÊɰʶËüÌgÎÿϻѕӑÕ×ÍÙûÛLÞ–à÷âWå¿ç&ê•ìøîiñÄó/öøáú,ýxÿ¼÷)Zx ˜ ©¶¶±¤ŠpDß!W#%®&P(â)x+ú,~.ò/b1Ä2"4r5º6õ7&9F:[;_ù>°?E@Å@AZAkAYAA£@ÿ?!?>½<1;e9Z75‹2Ê/Ò,§)R&Ï"8{¾î'k º/¶sþOûdø¨õóÓð¶îÔì'ë«édèMç`æ åå“äDääýãä!äOä—äêäLå¼å/æ¯æ+ç°ç,è«èéˆéæé1ênêêžê‹ê_êê™ééBèZçOæå¾ã;â ààÞÝ)Û9ÙE×PÕmÓ•ÑÝÏDÎÕ̔ˇʱÉɻȜȺÈÉ«ÉÊ˼ÌΰÏbÑ:Ó-Õ9×\Ù“ÛÕÝ'àâáäHç¯éì‚îîðRó³õøhú¼üÿIŠ»í . BOSOB-꼄I!þ"´$Z&û'–)'+°,1.©/1~2ß3.5z6¸7ç8:%;+<$=>Ô>‹?(@¬@ APAgA^A!A½@@O?F>=€;Á9Ã7†5 3X0g-I*ú&‚#í8z¯ä& t Ühÿïûôø/öžóCñï2íwë÷é¡è„çæÅå%åªäRäääääJä„äÝä5å¨åæ—æç—çèèéoéØéêcê‹ê—ê•êcê ê°é!éhè‹çƒæSåä†âóà8ßl݈ۛ٥ײÕÉÓñÑ1Ð’ÎÍÎ˼ÊÕÉ7ÉÇȡȰÈÉÉVÊNË|ÌÙÍ`Ï ÑàÒÇÔ×ÖïØ$ÛfÝ±ß âjäÐæ9é ëîsðÞò9õŸ÷ðùJü’þÜP~£ È × ëïëâ̲Œb+ð ©"_$&¯'@)Ü*`,å-`/Ï0:2—3î476z7«8Õ9í:÷;ô<Ô=¯>d? @‘@ú@AAeA]A1AÎ@A@y?|>C=Î;:(8ú5‡3ä0ü-ë*Ÿ'4$Ÿ ÷4pŸå * “¹ÿŠü‡ù¼öô¾ñƒï•íÌëAêäè¸ç½æêåCåÃä`ä(ääää<ä|äÈä(åŒåæxæÿæwçýçwèïè]éÁéêWê‚ê˜ê”ênê/êÇé?éè¶ç¸æ’åDäÕâ@áßÇÝçÛüÙØÖ'ÔNÒ…ÐåÎaÍÌïÊÊRÉÜȤȮÈîÈuÉ'ÊË=Ì•ÍϷЃÒiÔnֆطÚóÜAß–áóãYæÀè*ë“íýïbòÈô#÷€ùÒû#þe«ß< W t ‚ˆ‰~nR2Ô– T"$¶%U'ö(ˆ*,˜-/‡0ñ1U3¨4÷5;7n8œ9´:Ä;À<ª=‚>B?è?x@â@6A^A`A:Aä@\@¤?­>ƒ=?Ê?Y@Ó@!AZA^ACA÷@w@É?à>¾=d<Ä:ñ8Ô64î1!/!,ë(Ž% "f±ç"Y  ûn Çý³úÓ÷õ©òbðUî~ìÛêmé-è ç;æˆåðää7ääýãä(äfä©äågåÔåLæÊæGçËçGèÀè3é—éõé;êrêê•ê~êGêðéuéÐèèçæÅäfãÝá<àwޤܺÚËØÕÖæÔÓ5Ñ…ÏóÍ’Ì\Ë[Ê“ÉɸȧÈÔÈ=ÉàÉ¿ÊËËÍ~ÎÐÑѬӤո×ÜÙÜ]Þ«à ãgåÔç9ê£ìïsñÚó9ö—øìú<ý…ÿÊ9a† £ ´Á¾¾ª—sQê¢!^# %µ&P(ï)s+-}.ö/d1Å2#4r5»6õ7#9F:W;^ð>«?:@»@ALAaAFAAŽ@ñ? ?ü=¥<;J9D7ö4r2¯/º,Ž)9&º"m¤á\ ± ³iþNû_ø¨õ óÔð»îÕì.ë±ékèSçhæ§ååšäLäää ä#ä\ä—äõäNåÁå4æ®æ2ç­ç1è¦èé„éáé.êfê‹ê“êƒêTêÿééðè5èJç<æåªã-â‹àÓÞþÜÛ,Ù6×GÕbÓÑÙÏAÎÕ̕ˋʸÉ!ÉÄÈ©ÈÇÈ(ÉÀÉŽÊšËÊÌ8ÎÀÏzÑNÓBÕP×pÙ¦ÛëÝ9à”âöäVçÇé(ì—îýðaóÅõøyúÈüÿU˜Çú : LZ\YJ6ðÆŠQ!#¼$^&(™),+²,7.¨/12Ü345v6º7æ8: ;+<=>Ì>ƒ?#@@A>A_ALAA¬@ @>?/>í2–3ñ466{7ª8Ô9ê:ö;ì<Õ=£>b?ÿ?‹@î@8AWAQA AÀ@.@d?i>,=·;:8à5q3È0â-Ð*†'$Š Ü"Z‘Ô  ˆ±ÿ†ü‚ù·öô¸ñï’íÓëEêêèÀçÅæðåOåÆälä.ä ä ääCä„äËä0å‘åææûæçûç{èíè^é»éêOê|ê‘êˆêhê ê¼é/éè¦ç§æ€å3äÂâ/á~ß·ÝÕÛíÙù×ÖÔAÒ‚ÐÝÎaÍÌïÊ ÊUÉéȮȾÈüȆÉ9Ê2ËŞÍ+ÏÊЛÒ}Ô„ÖžØÉÚ ÝRß­áälæÔè=ë¤íðtò×ô8÷‹ùçû-þyµïI c € Œ”“Šv]7ÙŸ Y"$»%]'û(*,ž-/Œ0ó1V3ª4ú567q8—9µ:¿;½<¥=|>j=?À?S@Å@AIASA5Aá@k@²?Î>¨=J<²:Ô8¿6e4Õ1/,Ò(t%ï!Q—× H” èkùÆý¬úÐ÷õ¨òcðYîìßêsé2è'çCæŽåûä’äBääää4ähä³äålåÙåQæËæLçÉçIèÀè0é˜éìé:êiê‰ê‹êtê=êâégéÃèüç ç÷å³äVãËá(àiÞÜ­Ú¸ØÌÖØÔýÒ/ÑÏóÍÌ_Ë_Ê›ÉÉÀȸÈÞÈOÉóÉÎÊãË!Í“Î)ÐåÑÂÓ»ÕË×õÙ'ÜsÞÂàã‚åâçOê¶ìï‰ñæóNö£øüúLý’ÿØFm” « ÁÉι›U'ì­!c#%»&W(ð)}+-ƒ.ú/d1Ì2"4v5¸6÷7!9E:V;Xï>Ÿ?6@¯@ A@ATA8Aö@@Ù?ú>æ=<;39(7Ý4Y2”/ ,s)&¢"T’ÌM ¡¦dþFû`ø¡õ%óÑð¿îÛì0ë¸érèYçqæ¯åå£äTä!ä ää+äcäŸäøäXåÃå;æ²æ2ç²ç/è©èé‚éàé'êcê‚êŒêzêGêõé€éäè$è:ç+æöä˜ãâ{à¾ÞðÜ ÛÙ+×:ÕXÓ‡ÑÓÏ<ÎÕÌ–ËÊ¿É'ÉÐÈµÈØÈ5ÉÔÉ Ê«ËäÌFÎÞωÑhÓWÕc׌ٷÛÞLàªâ ålçÙé<ì«î ñvóÓõ2ø‡úÙü"ÿf£Ö) D YefeT@ úË”V! #Á$c& (œ)3+¶,:.®/1†2Ý365w6¹7å8 :!;#<=ø=É>{?@—@ù@5AOA@AAœ@÷?-?>ÚX?ú?€@ã@-AHAEAA¯@@R?R>=¡;ê9ù7Å5X3­0Ê-³*q'ÿ#t Æ F‚¾  t¦ÿü~ù´öô»ñŒï™íÓëOêíèÌçÇæýåSåÏävä2äää#äLä‡äÖä3å—å ææç€çüçzèîèYé¼é êJêwê…ê„êWêê­é!érè’ç™ænå ä³âápߢÝÉÛÚÙì×úÕÔ=ÒxÐÜÎZÍÌîÊÊ^ÉñȼÈÈÈÉ”ÉOÊ@Ëk̺Í@ÏáЯҖԘִØàÚ ÝißÀáäæçèMë»íð‰òåôH÷žùóû>þ†Âý*T q ‰ ™ ‚dBâ§ _"$½%f'þ(“*,¡-/0õ1Y3«4ú5:7m8™9°:¿;¶<£=s>7?Ù?d@Ñ@AGACAAÁ@;@z?†>W=ë;C:\846Õ321_.O+(¬$&!€È={Ë *®Mýú?÷ô-òûï÷í,ì™ê2éÿçýæ!ætåêä…ä?ääääEäzäÇäå„åöåhæìæbçèç_èØèDé¨éûé>êmê„êƒêcê$êÃé=é–è¾çÍæ¥åfäøâmáÂßýÝ#Ü>ÚJØ\ÖqÔ•ÒÑÐ(ϨÍMÌ)Ë6ÊÉÉÁÈÆÈüÈzÉ&ÊË+Ì|ÍîΓÐRÒ7Ô5ÖHØvÚ­ÜúÞIá©ãærè×êAí©ïòpôÓö(ùûÌýTŒÀæ 48</"湈N "Ã#k%'°(C*Ñ+V-Ï.H0­13h4¶5ý6.8b9u:;ƒ?µ?M@¹@A=AEA&AÔ@U@¢?·>–=4<˜:¼8¦6K4¼1ë.ì+º(Y%Ú!6„Áû8 ãWù¸ýªúÌ÷õ¨òeð\îƒìèêté>è+çLæ•åå™äNääää<äpä·ä åoåáåRæÐæMçËçHèÂè,é–éëé0êhê}ê†êhê2ê×éZé´èîçùæåå¢äCã¹áàTރܘڲضÖÕÔîÒ)Ñ{ÏîÍ‘Ì`ËbÊ£ÉÉÏÈÁÈñÈ]ÉÊâÊôË7ͧÎ?ÐüÑ×ÓÒÕà× Ú?܆ÞÚà.ã—åõçbêÈì1ï˜ñûó\ö³øûVý¦ÿäQ|Ÿ ¹ ËÖÔÑ¿¨ˆ]1ñ¹!e#%¿&](ø)€+ -….þ/h1Í2%4w5»6ó7$9?:V;Së>•?0@£@A3AFA*Aæ@o@Å?è>Î=|<ë:97Ä4<2}/ƒ,])&Š"î?~·õ; ˜ [þAû[ø¡õ#óÓðÁîÞì7ë»éyè_çyæ·å å­äYä+äää6ädä¬äøäaåÆå?æ¶æ4ç¶ç-èªèé‚éÙé%êYê}êƒêpê;êëéoéÚèè-çæåä…ã âfà°ÞÜÜúÚ Ù×0ÕLÓ‚ÑÊÏ<ÎÒÌšË‘ÊÆÉ0ÉÚÈÁÈæÈDÉäɴʽËöÌ`ÎëϨÑvÓqÕyמÙÓÛÞfà»â å~çëéQìºî"ñƒóçõ?ø™úæü3ÿu¯æ9 L ilwibG+ÒžZ!#Å$m&(£)6+¼,<.´/1‡2â335{6·7æ8:;<=ô=Â>u?@@î@)ADA/Aö@†@ê??>¿<;;y9x795¾20-ý)¬&;#£ú7y®ø K »IþþÚûìø&öŸóFñ'ï;í‰ëê¹è“ç§æÚå=åÂäiä3äää0ä[ääëäKå²å'æžæçšçè‘èénéÆéêMêvêƒêqêJêøéŒéôè=èWçRæ"åÊãVâ¹àß9ÝXÛmÙ}×ŽÕ­ÓØÑ ÐˆÎÍÔËÄÊèÉMÉèÈÄÈÝÈ/ÉÅɇʊ˷ÌΜÏQÑÓÕ×4ÙcÛ¤ÝòßGâ¨ä çréØëEî¦ðóoõÊ÷&úrüÂþ?z¡Í ä ÿ  ýę́wE!¿"r$&½'T)ç*n,ñ-h/Ú0?2ž3ð4;6w7«8Ï9é:ì;è<Ç=š>R?ð?v@Û@A?A5AAŸ@@???>þ<Œ;Ð9á7«5=3”0­-*R'é#[ °ø2n²  pñ¦ÿrü€ù®öô¹ñï›íÛëQêõèÑçÎææXåÛäyä@äää'äTääÜä7åžåæ‡æççÿçyèíèXé¸éêIêkê„êsêTêê¤éé_èˆçƒæ^åäâ áXߖݱÛÒÙÚ×ïÕ Ô/ÒwÐÓÎ^ÍÌ÷ÊÊfÉüÈÆÈÖÈÉ¡ÉdÊSË~ÌÏÍUÏöÐÆÒ©Ô³ÖÄØûÚ/݃ßÑá4ä’æúècëÉí5ð•òùôW÷­ùüKþ•Ñ 9] ‘ ¨§©œ‹lMì¬ i"$È%i')™*!,¥- /0ù1X3®4ù5;7l8˜9®:¼;´<œ=p>-?Ò?]@Å@A7A7A A°@)@g?r>@=Õ;*:C86¶31@.7+ú'–$ !j²ï+n¸ " Gý ú?÷—ô4ò÷ïþí.ìŸê5é èÿæ,æzåóäŒäKäää&äJä‚äÍä#ååöåsæåænçâçcèÖèAé¦é÷é9êfê~êxê[êê¸é-éˆè­ç¾æ’åWäãâ]á®ßíÝÜ.Ú<ØOÖfÔŒÒËÐ%Ï¡ÍRÌ*Ë<栃 ÉÏÈÐÈɈÉ;Ê$ËAÌŽÍϦÐjÒLÔKÖ^ØŒÚÄÜß_á½ãæ†èéêSí½ïò‡ôÝö=ùûÙý'_žËó + ?DD;+ðÂY "Ì#p%'µ(G*×+W-×.F0³13i4¹5û608^9v:‡;ƒ?´??@´@A3A7AAÂ@E@Œ?¥>}=<:¦8ˆ634 1Ï.Õ+š(D%½!"k­ç'r ÕMï±ý¦úÇ÷õ§ògð\î‹ìèê~éAè3çUæšååžäVä*ää%äAäxä¾äåuåååUæÖæKçÒçEèÂè,é’éçé,ê^êxê|ê]ê(êÆéOé¤èÝçëæÏå”ä-ã§áàBÞs܆ڤبÖÉÔæÒÑxÏéÍ“Ì_ËjʦÉ"ÉÙÈÎÈÿÈpÉÊöÊÌJÍÀÎQÐÒìÓèÕø×ÚVÜ›ÞðàBã¬åèwêÚìEï©ñôköÇøûiý´ÿð0]‹© Ç ÔãßÛȲi4þº!r# %Å&f(÷)Œ+ -Ž.þ/k1Ï2%4y5º6ô7"9?:Q;R<>=>á>’?$@@ò@(A8AAÖ@^@²?Ó>¸=f<Ñ:9õ6©4%2]/m,=)ì%q"Ô+e¥ã+ Šû™NþAûRø¢õ óÕðÄîáì:ëÄé{èkç|æÀå)å³ädä1ää!ä<ämä°äåcåÎåAæºæ7çµç1è¨èééÔé!êSêvêzêfê/êÞécéÇèèçæÔärã÷áUàÞÊÜëÚýØ×"ÕFÓuÑÉÏ5ÎÔ̚˖ÊÌÉ8ÉæÈÎÈóÈXÉóÉÊÊÐËÍqÎйÑÓˆÕ×·ÙæÛ,ÞzàÒâ1å–çüéfìÍî2ñ˜óóõTø¥úøü@ÿ…»õB \ qz~vjQ4 ߢe!#Í$r&(§)=+¿,A.¶/#1‰2ã355{6¶7æ8:;<=ò=¹>o?@„@ã@A5A"Aã@v@Õ??ñ=¨<#;`9^75£2í/-Þ)–&#Œá#dœè = ¯@ôþÖûæø%öžóFñ)ïAíŠë êºèŸç©ææåCåËäsä;ä ää8äbä¤äïäRåµå-æ æçžçè‘èéiéÇéêLêlê{êjê<êíééäè.èGç@æå¹ãBâ§àôÞ(ÝDÛcÙjׇ՟ÓÏÑÐ…ÎÍØËÅÊñÉSÉôÈÏÈìÈBÉÒɞʛËÏÌ,ζÏcÑ5Ó#Õ+×IÙ{Û¸Ýà^â¼äç‡éëëVî½ðóƒõÛ÷3ú…üÍþM†±× õ óÖ°€L !Æ"w$ &À'\)é*v,ó-n/Ü0B2Ÿ3ò4;6w7¬8Ì9æ:ë;á<Ä=“>J?ê?k@Ò@A1A&Aî@@ô?-?&>ë'?Ê?R@¿@A-A(Aû@£@@V?[>*=½;:)86ž3þ0'.+à'{$ó SšÙX¬ “A ý ú8÷™ô0òýïüí6ì¢ê=éè ç1æ…åøä—äOä,ää/äSäˆäÕä)å‘åüåuæíækçççbèÒèFé›éùé/êdêrêrêMê êªé!évè çªæ‚åDäÎâMá›ßÛÝÜÚ0ØAÖ[ÔƒÒÂÐ"Ï ÍQÌ-Ë@ÊÉÉÚÈàÈÉšÉMÊ7ËXÌ ÍϹЃÒaÔbÖuØ£ÚØÜ&ßtáÑã3æ–èëfíÏï3ò”ôóöJùžûìý1r©Ø $ 7 LOOH2öÌš\ "Í#z%'¹(O*Ù+^-Ù.M0´13l4¹5û628Z9y:€;ƒ?«?8@§@ù@$A)AA³@2@{?>i=é–èÐçÕæÄå|äã–áòß3Þ_Ü{Ú‘ØŸÖ»ÔÛÒÑnÏëÍÌcËmʰÉ(ÉèÈÖÈÉ|É+ÊËÌ`ÍÒÎlÐ&ÒÔûÕØ4ÚlܲÞá]ã»å!è†êðìUï½ñô~öÖø,ûxýÂÿ:n“¼ Ï äíêæÓºlC Å!x#%%Î&h(*Š+-.0l1Ó2'4z5º6ö79@:L;P<:=>Û>‰?@@é@A(A AÅ@K@£?¼>£=M<»:ë8Û642E/O,%)Ñ%W"ÀS’Ï yó‰Nþ3ûVø™õ$óÔðÆîæì>ëÈé…èmçˆæÆå0å¼äjä9ä%ä'äEätä´ä ågåÒåFæ½æ9ç¹ç-è­èé~éÒéêOênêpê]ê%êÐéWé¹èõç ç÷åÀäcããáEàŒÞ¸ÜÜÚíØ×Õ:ÓqѾÏ9ÎÌ̡˗ÊÓÉBÉîÈÞÈÉjÉÊÜÊãË$͆ÎÐÏѧӜէ×ÊÙÿÛ?ÞàæâFåªçêzìÝîEñ©óöeø´ú ýMÿ”Ê(P h |‡‡‚tZ>æ«j!%#Ð${&(±)?+Ä,F.¸/(1‹2ä375}6³7é8:;<=ì=´>i?ü?~@Ö@A&AAÐ@g@À?ï>Ú=’< ;D9I75‹2Ð/ç,Å)z&#tÊMÖ . £5íþÑûßø%ö›óHñ+ïCíëêÂè£ç´æêåOåÏä}äAä)ä(ä=äjäªäõäYå¹å1æ¤æ"çžçè‘èéhéÃé êEêgêqêaê0êãéméÛèè9ç-æþä§ã/â–àâÞÝ9ÛMÙc×tÕšÓÅÑÐÎÍ×ËÊÊ÷É[ÉÿÈÜÈúÈPÉåɯʰËâÌCÎÊÏ{ÑIÓ<Õ>×bÙÛÒÝàrâÐä2çšéìhîÎð1óõï÷Aú–üÜþ"]’¿ã ÿ %üà·ŠT!Î"}$'&Æ'a)ð*y,ø-q/ß0D2£3ð4>6v7ª8Í9á:é;Ü<À=>C?â?b@Ç@A$AAâ@{@â??>Ù?Â?J@°@ü@AAì@‘@@C?F>=§;ø98ç5†3ã0 .+Æ'a$Þ 8‰ÃG¡ Ž2 ýú4÷šô-òðî9ì¥êEéèç9æŠååŸäVä6ä"ä:äVä‘äÙä0å–åæzæíæpçççdèÓèAéœéðé.êYêoêeêEêê›éécè•ç•ævå.äÂâ7áŒßÈÝóÛ Ú"Ø5ÖOÔ|Ò»ÐÏŸÍQÌ/ËGÊ•ÉÉèÈêÈ/ɧÉ`ÊKËj̸Í1ÏÒЕÒ|ÔsÖØ²ÚôÜ5ߌáããHæªèëwíáïCò¥ô÷Xù±ûùý@µç 0 B WX\P;%üמd !"Ó#%$'¾(T*Ü+e-Ú.N0º13p4º5ú608[9q:ƒ;zú>£?.@ž@í@AAô@¦@@j?y>R=ñ;O:r8W6þ3j1Ÿ.›+i(%Œ!õ>…ÁV ·;Û¤ý›úÁ÷õ¨òiðcî’ìñê‹éJèFç`æ«åå¬äiä6ä*ä2äQä†äÉä!ååîå_æÙæTçÐçJè¾è+éŠéâéêUêgêkêJêê±é0é‡è¾çÇæ±åmä ã‚áâß ÞOÜlڀؖ֬ÔÖÒÑmÏåÍ’ÌdËrʵÉ3ÉðÈçÈ ÉÉ;ÊË/ÌvÍç΀Ð=ÒÔÖ&ØJÚÜÆÞáqãÐå4è™êígïÏñ-ôöãø>û…ýÑÿ Jx£Ä Ý î÷ôðÛÆ {E È!#+%Ó&n(*+-’.0s1Ï2/4u5À6ð7 9<:K;K<6=>Ó>ƒ?@Š@Û@AAA±@>@Š?«>Ž=7<£:Ó8À6x4ì1-/2,)·%@"§ú@}À kê€Dþ1ûNøõ!óÖðÉîéìDëÏéˆèxç‹æÑå5åÇäqäBä-ä.äLä{ä½ä åoåÔåMæ½æ>ç·ç3è¦èéwéÑéêIêeêjêRêêÂéLé¨èççøæèå¯äOãÔá1àzÞ«ÜÉÚáØôÖ Õ1ÓgѽÏ1ÎÐÌŸËÊÛÉHÉýÈäÈÉvÉÊîÊùË4ÍŸÎ.Ðçѽӱռ×àÙÜVÞ£àüâZå¼ç%ê‡ìóîVñ¸óötøÃúýYÿ¤Ø 8X x …‘“|fDê·p!,#Ù$}& (´)C+Ë,G.¼/-1Š2é365|6·7ã8:;<=é=¬>b?ö?s@Ë@ AA AÂ@S@±?×>È=|<ó:19*7ì4n2¸/Ë,¬)`&î"]³ú:|Ä $ –+åþÊûÝø"öœóFñ1ïBí—ëêÊè«ç¹æõåQåÝääKä1ä,äHäoä°äýä[åÁå3æ©æ#ç¡çè‘èÿèfé½é ê>êaêhêWê'êÔéeéÇèè)çæìä–ãâ„àÑÞÝ'ÛBÙS×kÕÓ¾ÑÐ{ÎÍÖËÎÊüÉdÉÉëÈÉcÉòÉÅÊÀËùÌTÎàÏ’Ñ^ÓRÕT×wÙ¤ÛçÝ-àŒâßäKç©éìyîâð?ó¦õú÷Uú£üëþ3g£Éò "*1(èÁ’Z!Ô"„$-&Í'd)÷*{,ÿ-r/ã0G2£3ô4>6u7¬8Ç9ã:ã;Ú<»=‡>=?Ù?Z@»@û@AAÓ@i@Ñ??ý=À<@;Œ9Ž7a5ì2A0b-F* '™# jµö7 Ø FÔŠÿaüqù¨öô¼ñ•ï£íéë^ê éßçêææuåïä–äQä8ä*äCägä¢äñäDå²åæ–æ ç‰çè{èéèRé®é÷é8êWêiê\ê/êèéxéëè2èVçTæ'åÜãhâÔà'ß^Ý…Û¡Ù±×ÉÕêÓÒbÐÉÎVÍÌýÊ%Ê~ÉÉëÈÉKÉÙɘÊ˺ÌΓÏ=ÑÓòÔðÖ Ù:ÛqÝÄßâqäÐæ4éëîjðËò/õ†÷ßù3üxþÃú2bƒ ¥ ¹ ÅÍż¦Œc:Å ~"0$Ù%~')¨*0,±-,/™02`3±4þ587o89ª:´;§<=_>?¼?A@§@ð@A AÞ@~@ñ?-?3>ý<‘;à9ù7Í5k3Ê0ò-è*ª'K$Á $q°õ6‘ õ„)ýþù3÷•ô1òþïî<ìªêKéèçAæ‘å å¥ä`ä:ä/ä<ä_ä™äÝä8å˜åæ}æòæqçéçcèÒè?éšéëé*êQêhê]ê9êõéééWèƒç„æfåä²â%áz߸ÝâÛþÙØ+ÖAÔvÒ²ÐÏ¡ÍKÌ9ËEÊ¡É&ÉóÈùÈ;ɼÉoÊ_Ë~ÌËÍKÏäЯҌÔÖ¢ØÍÚÝNßáýãWæÀè%ëŠíõïSò¹ô÷lù¼û þP‹Çð 9 R _gc[F, ܪk )"Ù#‰%)'Å(Y*á+h-Þ.T0¸13o4º5ý6.8Y9s:{;|<_=7>õ>š?'@“@â@ A Aë@Ž@@R?g><=Ú;7:Y8>6â3R1€.ƒ+P(ò$x!×,m®óE ¬+Õšý—ú¼÷õ¨òjðfî’ìûê‹éVèHçiæ³å%å·änä@ä0ä9äYä‹äÑä&å„åôåaæÞæVçÒçKè¼è)éŠéÚéêJêbê`êAêê¤é#éxè¯ç·æ å[äûâqáÑßÞ@Ü\Ús؈֣ÔÌÒ ÑeÏæÍÌiËuʽÉ<ÉûÈöÈ+É ÉJÊ.ËËÍÿÎ’ÐUÒ.Ô,Ö7ØcÚ“ÜßÞ+á…ãååFè¬êíxïáñ?ôöùøHû˜ýßÿ[„°Ñ ç ùøçͪ„K Ï!ˆ#1%Ú&s( *”+-“. 0r1Õ2-4x5½6ó79;:J;F<3= >Ï>{? @€@Ñ@AAì@§@&@|?–>w=!<‹:¹8«6Z4Ó1/,ó(Ÿ%%"‘ã,h³ù fÖ~9þ/ûIø›õóÙðÉîïìEëÖéèç’æÖå@åËä|äIä1ä:äPääÅäåwåØåOæÄæ<ç¼ç0è¨èétéÎéêBê`ê^êKê ê»é9éŸèÕççæÙå™äEã¼á$àgޛܺÚÓØæÖÕ)Ó_Ñ·Ï1ÎÌ̥˟ÊßÉTÉÉöÈɆÉ*ÊýÊÌFͶÎAÐþÑÐÓÈÕÓ×õÙ'ÜlÞ¸àãmåÒç5êŸìïkñÇó+öøÕú'ýjÿ±æDe ‚ “›Ÿ”‡nN&ô»y!3#Þ$…&%(·)K+Í,J.Â/)1’2è3756³7æ8:;<=ä=§>[?í?i@Â@ù@Aô@µ@C@›?Ç>°=h<Û:97Ô4S2 /¯,“)G&Ö"F›è$o±  ˆ"ÞþÂûÛøö›óIñ/ïKí—ëêÌè²çÀæúå\åãäˆäUä3ä:äIäzä´äå^åÊå4æ®æ&ç çèŽèécé¹éê4ê]ê_êNêêÉéVéºèèçæÛäƒãâsà¾ÞõÜÛ3ÙG×_Õ‚ÓºÑÐxÎÍÖËÕÊÿÉpÉ ÉúÈÉtÉÊÔÊØËÍkÎ÷Ï£ÑyÓcÕn׊ټÛùÝGàšâùäZç¾é(ì‰îôðRó´õ øcú±üüþ>x®×ý  -4;4%ñÈž_%!Û"Š$5&Ñ'k)ú*,.w/å0I2¥3ö4=6x7§8É9à:á;Õ<¶=€>8?Ð?O@´@ê@Aö@Å@X@¾?ò>è=¨<,;q9|7D5Ô2'0H-/*ñ&€#üS£á'n Ì 9Îÿ]ülù¥öô»ñ–ï©íêëfê éèçîæ"æxåüä—ä`ä:ä7äIämäªäôäMå³å æ”æç‰çè{èçèPéªéõé/êSê`êQê(êØénéÚè%èEçDæåÊãVâÃàßMÝuے٥׿ÕÞÓÒ\ÐÄÎYÍÌË%ʉÉÉùÈ É]ÉçɪʢËÏÌ#ΪÏOÑÓÕ× ÙNÛŠÝÔß(â‚ääæHé®ëî{ðÛò?õ—÷ïù?üŠþÍ ?k“ ¯ à ÒÔÒı’n? Ê †"5$á%€')«*7,²-0/›02b3°4677l8’9¤:³;¡<=V>?³?6@ @â@AAÌ@p@Þ?? >çð>’?@Š@Ö@þ@AÕ@ƒ@ü?B?Q>'=Â;:C8"6Ë361i.g+6(Ý$]!ÃWŸá9 ž#É—ý‘úº÷õ¥òoðgî™ìýê”é[èPçræ¹å.å¾äwäHä8äBä]ä—äÓä.åŠåôåjæÜæ[çÒçLè¼è(é…éØéêEê\êUê:êôéœéénèœç¨æŽåKäçâcá¹ßÞ*ÜPÚdØ|ÖšÔÃÒÑaÏäÍÌjË{ÊÄÉDÉ ÉÿÈ>ɬÉ_Ê@ËYÌžÍϬÐhÒGÔ?ÖOØwÚ¬ÜðÞAá™ã÷å]è¾ê'í‹ïòñNô±öùZû¥ýíÿ*d”»Ý ó  ñÖ³ŠV Ú!Š#<%Ü&{( *œ+-œ. 0v1Ù2*45·6ø79=:D;C<0=>Ë>p?@u@Ç@ø@ÿ@à@”@@g?‚>b= R?å?_@·@í@Aæ@¥@/@Œ?¯>ž=N<Å:ÿ8ù6¹492„/˜,x)-&¾"-ˆÐUª  ƒÙþ¼û×øö™óLñ1ïMížë ê×èµçÊæædåìää^ä=ä?äTä~ä¿äåfåÌå:æ²æ'ç¤çè‘èýèaé·éê0êVêUêGêêÀéEé²èêç çùåËätãøádà«ÞçÜÛ&Ù7×WÕwÓ±ÑÐsÎÍÖËÙÊÊyÉÉÉÉ‚ÉÊçÊêËÍΠныÓ|ՃנÙÒÛÞZà±â åpçÎé=ì™îñcóÄõøqúÂü ÿKˆ¹ç % 6CC@-÷Ô¡k*!á"’$7&Û'm)+†,.}/ä0O2£3ú4:6{7¤8È9Ü:Þ;Ñ<±=y>1?Å?J@¥@ã@ý@ê@²@I@ª?Þ>Ò=”<;Z9a7*5»2 0,-*Ó&l#á>Ì^ ½ /ÂwÿZüdù¦öô½ñ™ï«íòëhêéëçúæ%æ„åå¤äcäFä<äQäuä±äùäUå´å)æ–æç‡çèuèìèKé§éòé'êNêWêHêêÍébéËèè7ç/æåµãEâ²àß=ÝfÛٚײÕÕÓÒWÐÂÎUÍÌË-Ê‘É*ÉÉÉlÉ÷ɾʵËâÌ9οÏdÑ1ÓÕ×;ÙaÛ¡Ýèß>â•äúæZéÁë)îŠðñòLõª÷ÿùOü˜þßSq¥ µ Ö ÖæÖÒ¸œvIÕ ‹"=$ç%„'%)«*?,´-5/02b3µ4þ597k89¥:«;¢<ƒ=T> ?ª?/@’@Ù@÷@ñ@½@^@Ì?? >ÒÉÉÉVÉÞɔʃ˨ÌõÍpÏÑÖÒ¼ÔºÖÌØøÚ2ÝtßÌá!䂿åèJë¯íðvòÚô2÷ùÚû)þj«Ý3 S f x{zlZ?ðµ} 5"é#’%6'Ï(c*ì+m-é.U0Ã13u4»5û6/8U9n:x;sä>?@@É@ò@ó@Æ@t@ç?/?:>=§; :$8 6¯31M.M+(À$H!©EŠÓ' ’¾“ý‰ú¹÷õ©òmðmî›ìë—édèUç{æÁå5åÇä~äQä@äGähä™äàä.å“å÷åmæâæZçÔçLè»è&é‚éÔéêAêQêOê-êëéŽéé`èŒç™æ|å:äÔâPá¬ßïÝÜ>ÚVØq֌ԽÒûÐ_ÏßÍ‘ÌmË€ÊËÉPÉÉÉHÉÂÉmÊUËl̳Í&ÏÁÐÒ[ÔWÖdØŽÚÀÜßTá°ã æpèÔê9íŸïòaôÁöùkû³ýýÿ8r¡Èë ý  ûß¾‘_$ Ý!—#>%ä&(*¡+!-ž.0z1×214z5¾6ò797:D;@<)=>¿>n?ø?j@½@ê@ñ@Ó@@@T?l>N=ó;[:‰8v6'4 1Ú.æ+½(n%ó!d´CŽÝ GÂj,þ"ûBø™õóàðÊîùìOëàéè‰ç¤ææåMåàäŠäZäCäEäbääÐä å|åæåTæÌæCç¼ç5è¤èéoéÆéê7êOêPê4êûéé#é}è¹çÇæ¶åxäãœáþßEÞzܛڷØÎÖêÔÓPѰÏ(ÎÐ̥˪ÊîÉcÉÉ É=ɧÉKÊ&Ë4ÌrÍÝÎpÐ&ÒÔðÕØÚUÜ–Þàà<ã”åùç^êÀì)ïŒñìóKö¢øöúBýŒÿÇ2_~ 𠦶®¬š€c2ÈŒ!=#ë$“&,(Ç)P+Ô,X.¿/81Ž2î3:5}6µ7à8ÿ9;<ý<Ô=Ÿ>F?ß?S@­@á@ñ@Ù@’@ @v?>†=9<¬:å8â6œ4"2h/{,`)&¦"rºE˜ úrÎþ¸ûÓøöšóLñ3ïSí ë'êÚèÁçÍæ æhåôä›äbäHäCä\ä…äÅä åoåÌåBæ²æ)ç©çè“èûè^é´éûé*êOêMê<êê°é=éèáç÷æëå¸äbãæáRà›ÞÔÜøÚÙ*×JÕnÓ©ÑÿÏqÎÍÛËÚÊÊ~É&ÉÉ2ÉŽÉ-ÊõÊÌ1Í—ÎÐÓѡӒՙ׷ÙåÛ'ÞmàÈâå‚çèéIì²îñuóÖõ,ø„úÏüÿY–Çñ - FJRE<Û©u/!ì"–$@&Ý'v)+‰, .{/î0J2«3ö4>6x7¦8Æ9Ù:Û;Ì<­=r>+?¼?@@˜@Ú@ì@â@@8@™?Ç>À=z<ú:E9C75œ2ô/-ù)¾&N#Í%w»Q « %µrÿPübù¢öôÀñ™ï¯íôëoêéõçþæ/æŠå å¬äläMäDäWä~ä¶äåXå½å(ææççèxèèèKé¢éíé"êEêPê>êêÀéVé¼èè(çæøä£ã2â¡àñÞ.ÝTÛtىשÕÇÓÒKÐÂÎRÍÌ Ë3Ê—É7ÉÉ*É|ÉÊÑÊÉË÷ÌOÎÒÏ}ÑGÓ2Õ3×OÙwÛ¹ÝûßSâ¬ä çpéÕë9îŸðó^õ»÷ ú_ü§þì#^ƒ­ Ç Û éèéÖÆ¢‚M× •"D$ë%Ž'$)·*=,¾-4/¡0 2b3·4ý597k89¢:ª;š<ƒ=I>? ?'@†@Ñ@ä@è@©@P@µ?ö>ñ=¾ß>ƒ? @s@À@ä@å@¸@b@Õ??&>ü<’;ñ98ð5—3ÿ04.1+(ª$+!–æ4tÄ † ¶Šý…úµ÷õ¦òrðkî£ìë¡égè_ç€æÊå<åÐä‡äXäJäLärääçä3å˜åüåqæåæ[çÙçIè½è#é‚éÏéê8êJêFê#êàé€é÷èPè|ç‰æiå)äÄâ;áœßÛÝÜ.ÚIØbÖ‚Ô´ÒöÐYÏßÍÌpˆÊÐÉ[ÉÉÉZÉÑÉÊhËÌÇÍ>ÏÕЗÒrÔkÖØ ÚÙÜßkáÁã"æ€èèêLí°ïòrôÒö%ù{ûÃý H®Öõ $èȘi) ê!•#L%å&ˆ(*¤+%-¤. 01Ö244{5¼6ô797:?;?<"=ÿ=·>f?ï?a@±@Þ@å@Â@r@ò?B?V>9=Ú;E:o8]64„1Â.Ê+§(N%à!F¢ì2{Ï 7º](þûAø–õóßðÐîùìVëåé¢è“ç©æíåWååä•ä`äKäNähä—äÖä'å‚åêåZæÌæIç»ç6è¥èénéÀéê0êIêEê,êíé•éésè£ç¼æŸåläãŽáèß8ÞeÜŽÚ¦ØÀÖàÔ ÓMѧÏ)ÎÌ̩ˮÊôÉoÉ%ÉÉMɶÉ_Ê8ËḢÍó΄ÐAÒÔ ÖØ5ÚmܨÞúàMã«å èpê×ì9ïŸñýó\ö³øûTý˜ÿÚBj ¤ ¶½¼¶¤Šj? Ô!F#ò$š&2(Ë)V+Ù,[.Æ/71“2ï3;5}6¶7ß8ý9 ; <÷<Ò=“>D?Ó?M@Ÿ@×@â@Ë@@@b?‰>p=!<–:Ê8È6‚42Q/^,D)ú%‹"ýZ¤î4‡ ëhÄþµûÈøö“óQñ3ïVí¥ë,êàèÆçØææuåùä¤äjäOäNäbäŽäÉäåoåÖåBæ·æ/ç¦çèèúè]é°éôé(êCêFê2êøé¨é+é’èÏççæÛå¦äOãÕá@àˆÞÅÜçÚÙ×>ÕcÓ¢ÑøÏnÎÍÚËâÊʉÉ0ÉÉ>É¢É<Ê ËÌGÍ«Î7ÐéѸӨձ×ËÙÿÛ;Þ„àÜâ5å–çûé^ìÄî'ñ‰óåõ?ø”úßü*ÿh£Õÿ! ? K\UX@0ç±{9!ð"Ÿ$E&ä'y) +Œ, ./í0O2¬3ö4A6u7¦8Å9Õ:Ú;Ç<§=p>?¼?/@“@É@â@Ï@@'@ƒ?¶>§=e<ä:(9-7ù42Û/ô,á)¢&5#´ b¦ð>   ¯fÿKü^ùöô½ñï²íøëtê"éúçç6æ‘åå±äwäRäNä^ä„ä½äå\åÄå*æ¡æççèxèæèIé éèéê<êIê3êê¸éCé±èöççæää’ã"â‹àãÞÝFÛeÙ{×Õ¿ÓúÑJлÎRÍÌ Ë;ÊŸÉBÉÉ:ɉÉÊâÊÝË ÍfÎèÏ“Ñ`ÓDÕM×bÙÛÍÝàiâ¾ä$çéìëIî´ðópõÊ÷únü¸þ÷5g–¶ Ö ä öôòãÍ®ˆY!â š"J$ô%‘'-)¸*D,À-8/¥0 2b3»4û5;7i8Œ9 :¥;™ý>š?@€@¾@Þ@Ó@ž@:@©?Ý>ß=¦<2;9”7g53`0‰-}*F'ä#c Èc©ö U ÆX çüíù(÷‘ô2òðîMì¿êcé2è7ç\æ³å*åÄää[äLä]äyä´äöäOå­åæŠæýæyçíçcèÏè6ééÛéê;êCê;êêÅé_éÌèèBçFæåÙãhâßà5ßtÝ£ÛÁÙÝ×÷ÕÔPÒÐÏ—ÍSÌBË^ʾÉNÉ#É1ÉxÉýɺʩËÐÌΜÏ?ÑÓæÔèÖúØ#Û]Ý ßõáJ䬿 éqëÖí:ðœòûôV÷©ùýûDþ‰Æø*L l  ’ŽƒkR*ýʈ E"÷#ž%B'Û(l*õ+w-ì.`0Â1#3s4À5ú6-8Q9l:p;kÜ>x?@l@°@Ý@Ñ@­@L@Ç??>ä<};×9ø7Õ5}3æ0.+ç'‘$!{Õf¯ w°€ý…ú®÷õ¦òqðsî¢ìë¢éqèbçŠæÏåHåÓä“ä]äSäUäwä¥äìä9åŸåævæäæbçÕçNèºè"é}éÌéê0êFê9êêÔéréìè?èmçxæXåä³â+áŠßËÝÿÛÚ=ØUÖwÔ«ÒíÐYÏÙÍ“ÌqË‹ÊÙÉcÉ)É*ÉkÉàÉ•ÊyË“ÌßÍOÏíЬ҇Ԅ֑غÚëÜ3ß~áØã5æ”èüê^íÂï'òƒôãö4ù‹ûÐýSºâ  %/)" óΣo3 í!¢#K%ï&Ž(*ª+(-¦.01Ù264y5Á6î792:>;8<"=ô=µ>Z?è?T@¨@Î@Ù@°@d@ß?0?@>#=Ã;.:U8C6õ3h1ª.¬+Ž(5%È!.ŽÕ j¾ -¬Vþû<ø”õóßðÔîýìZëëé¨è›ç¯æ÷å^åîäœähäTäTärä›äÞä+åˆåïå\æÑæIç½ç7è¤èéméºéÿé(êCê:ê$êàé‡éé`èšç§æ‘åYä÷âzáÙß&ÞVÜژشÖÕÔÓEÑ¢Ï'ÎÍ̪˳ÊûÉxÉ2É(ÉZÉÊÉmÊNËZÌÍÏ›ÐVÒ)Ô Ö,ØLڂܾÞácã¿å!èêéìMï¯ñôlöÁøûbý§ÿéQu™ ¯ ÁÇʽ¯“sGØ™!I#ý$™&=(Í)Z+á,X.Î/71˜2ï3;5€6²7à8ù9 ;<õ<Ë=>;?Ë?B@”@Ì@Ó@½@p@ü?P?s>]= <:³8¬6l4è16/F,))â%q"çB’Ø$v Þ[ü¾þ­ûÌøö›óKñ:ïWí¬ë0êèèÊçàææ|ååªäsäXäSälä“äÐäåvåÚåGæºæ1ç¨çèèùèYé­éðé"ê:êAê%êïéœéé…è¿çØæÉå–ä=ãÅá+àzÞ²ÜÚÚøØ×4ÕXÓžÑðÏoÎÍâËâÊÊÉ;É*ÉNɱÉLÊ Ë$Ì\ÍÁÎJÐÿÑÎÓ¾ÕÆ×ãÙÜOÞàíâLå¨çêoì×î:ñ—óøõNø¡úòü5ÿy®ä 0 G Zbf\N4î¹…>!÷"¦$I&ì'|)+‘,.ƒ/ð0T2¨3þ496|7¡8Ä9Ô:Õ;Ä<¢=f>?®?*@…@À@Ò@Ã@}@@q?¡>“=N<Î: 97Ù4n2¼/Ü,Ç)†& #›øM“Ý/ ’ ¥_ÿFüZùœöôÁñï¶íýëyê)éèç>æ™åå·ääYäWäcäŽäÀäåaåÈå/æ¥æç“çè}èàèJéœéãéê6ê?ê,êüéªé9é¡èçççþåÒä‚ãâ}àÏÞ Ý3ÛYÙm×’Õ¶ÓðÑFзÎQÍÌËBʧÉKÉ*ÉEÉœÉ-ÊòÊôËÍ}ÎüϪÑrÓ`Õ[×~Ù¢ÛâÝ*àxâÙä1ç˜éúë_îÂð#óõÛ÷-úüÄþ @wŸÆ Þ ö úøïÕ·a)ê ž"U$ô%',)Â*E,Å-;/¨0 2j3´4677i8Š9ž: ;˜õ>?@n@¹@Í@Å@@'@˜?Æ>Í=<;i9z7N5ç2G0l-e**'Í#I ´Q—å I ¹Mßüêù&÷Žô5òðîQìÅêgé=è8çiæ¶å5åÊä‹äaäWäaä…ä¸äåSå²åæ‹æçxçîçdèÍè5éŠé×éê1ê>ê/êê»éOéÀè è3ç3æåÄãYâÊà'ß`Ý–Û°ÙÑ×ëÕÔFÒ˜ÐÏ–ÍUÌAËiÊÂÉ[É.É?ɇÉÊÉÊÀËáÌ6ΰÏXÑÓÕùÖÙ8Ûsݶßâa使!é‚ëéíMð¬ò õd÷½ù üUþ•Ö8X w – “‘r]4Ñ‘ K"ý#¤%J'Ý(s*ø+z-ò.^0É13{4¹5ÿ6)8T9d:p;dÑ>s?ù?`@§@Ì@Å@›@<@´?ò>ý=ÏV?Ý?L@š@Ä@Ç@¥@O@Ð??/> =®;:=8(6Ü3M1.•+o(!%¬!uà Z² ¤Kþû<øŽõ"óßðÖîí`ëíé´èœçºæýåfåøä äuäWä`äuä£äæä-å“åîådæÒæKçÁç5è¤è éié¸é÷é#ê9ê5êê×é|éöèTèˆç—æ‚åEäçâgáÉßÞHÜmڋبÖÉÔûÒ=Ñ¡Ï ÎÐ̫˹ÊÊ€É<É8ÉhÉÛÉÊaËm̳ÍϯÐnÒ=Ô;Ö>ØfÚ“Ü×Þ"ávãÕå1è˜êúì`ïÀñ!ô{öÓø&ûpý¶ÿö*_§ ¸ ÐÐÕÅ»™~Oãž!R#%¢&@(Ò)`+â,_.Ï/:1™2ñ3<5}6´7Þ8ø9;<ð<Å=‰>2?Ä?6@‹@½@Ç@«@c@ç?A?Z>J=ñ;h:š8“6O4Ð1/+,)È%Y"Î.|Çf ÒPò¹þ§ûÆøö–óQñ:ï\í±ë4êñèÐçéææˆååµäzä_ä\äqä›äØä!å{åßåKæ½æ5ç¦ç"è‹èüèTé«éêéê5ê6êêåéŽéévè¯çÉæ·å„ä-ã±áàjÞŸÜÍÚæØ×%ÕSÓ”ÑíÏkÎÍàËêÊÊšÉGÉ5É^É¿É`Ê1Ë9ÌrÍÓÎdÐÒæÓÓÕÜ×úÙ'ÜgÞ°àãaå»ç"êƒìèîLñ©ó öZø¸úùüLÿ‚¿ð; T enogW> òŇI!þ"«$P&ð'ƒ)+”,.‚/ö0R2­3ý4<6x7¡8Â9Ð:Ó;¾<œ=b>?©?@|@±@Ç@²@o@@]?Ž>|=:<³:ù8ù6Ä4P2£/Á,­)m&#‚á8Ì ƒ þœUÿ@üUù™öô¾ñ£ï¶íìê-é èçEæ£ååÅäƒäeä\ämä’äËäåhåÎå3æ©æç‘ç èvèåèDé—éâéê3ê4ê&êìé¢é*é“èÚçôæðå¿äsãøápàºÞÿÜ#ÛGÙe×€Õ±ÓåÑBгÎRÍÌËHʱÉUÉ6ÉSɪÉBÊËÌ1ÍÎÐÀчÓvÕt×Ù»ÛõÝ@àâìäFç«é ìrîÕð4ó“õê÷?úŽüÔþO„¬Ò ë ÿ  ô㼞d5í ª"V$&'5)Å*H,Ì-ð>†? @f@©@Ã@µ@€@@?·>²=|<ÿ:U9[795Ç2/0Q-I*'²#3 šî:†Ö 7 ¯AûÿØüåù#÷ô5òðîUìÊêméCèAçoæÀå;åÔä‘äkä\äjäŠä¿äåXå¸å!æ‘æçxçóç`èÐè0é‰éÑéê+ê7ê&êûé°é@éµèúç%ç"æýä´ãDâ½àßWÝÛ¦ÙÀ×àÕÔAÒŽÐÏÍZÌAËqÊÈÉgÉ9ÉLÉšÉÊàÊÐËùÌIÎÇÏkÑ0ÓÕ×%ÙQÛ†ÝÏßâwäÐæ5é—ëûí]ðÁòõx÷Êùüdþ¦âDd „ ˜ ¡¨£•‚b<Öš R"$­%M'ä(w*ý+~-÷.`0Ì1"3y4¿5ú6-8N9e:m;^Ì>k?î?W@›@À@·@‹@-@ ?ß>è=¸D?6 Þ·}A þ!¬#\%ù&•()*¯+3-«.0„1à2345½6ï79-:9;.<=ç=ª>J?Õ?B@@¹@¸@•@>@¿??>ó<˜;ú9$86À321u.x+X(%”!`­ùJŸ •Dþ û5ø‘õóâðØîíeëõé¶è§çÁææqåúä¯äwäeäcääªäëä8å“å÷åfæÖæOçÀç8è¡è écé¸éîé ê/ê-ê êÌénéêèFèwçˆæoå5äÕâTáºßýÝ=ÜWڃؗÖÂÔïÒ7Ñ›ÏÎÒÌ«ËÁÊÊ‹ÉJÉAÉ|ÉåÉ—ÊoˇÌÂÍ5ÏÆÐÒWÔMÖWØyÚ¬ÜëÞ7áãæåJè©êíqïÓñ2ôöäø6û~ýÇÿ:j’¯ Ë ÕÞÞÒÁ©\"í¤![#%©&F(Ø)f+ä,c.Ò/<1ž2ï3@5|6´7Û8ø9;<è<Â=}>0?µ?1@|@°@º@š@S@Ö?+?I>0=Ý;M:8{634¸1ü.,õ(­%@"¸i²ÿZ ÀGç¯þ¤ûÀøö˜óNñ>ï_í³ë>êóèÙçïæ'æŒååºä…äeäeäyä¡äßä&å‚åäåNæÃæ3ç¬çèèøèRé¦éçéê/ê,êêÛééécè£ç¶æ¨åräã£áàXޑܹÚÝØ÷ÖÕIÓŽÑçÏjÎ ÍæËìÊ(Ê£ÉPÉEÉiÉÕÉmÊGËMÌ„ÍîÎuÐ-ÒùÓíÕð×Ú;Ü~ÞÃàãråÒç5ê•ìþîZñ¾óöpøÃúýVÿ’Îû)C d n{|nfD)ýÊ’O!#±$X&ó'Š)+š,.‰/ö0U2¯3û4@6u7¡8À9Í:Í;»<—=Y> ?œ?@p@¤@º@Ÿ@d@ì?P?u>i= <:Þ8á6©452ˆ/§,‘)V&ë"kÌ mº v ð“Lÿ=üOù™öôÁñ£ï½íì‡ê1éèçNæ¨å-åÉääjädäuä™äÒäåoåÑå9æ«æç•çèyèàèDé”éÚé ê'ê0êêçéé é„èËçâæáå¬äbãèá[à«ÞêÜÛ7ÙV×zÕ ÓåÑ7бÎRÍÌËJʼÉ]ÉFÉ`ɼÉPÊËÌHÍ£Î+ÐÔѢӉՎפÙÔÛ ÞVà¤âþä\ç¾é"ìƒîèðFó£õý÷Oú›üåþ#_ºÝ ø þìÆ£o<õ ²"[$&£':)Ê*N,Í-@/¯02k3¹4687g8„9›:—;‘ä>ƒ?û?a@˜@·@§@m@@m?¢> =a<ì:79F75±209-/*÷&œ# …Ö*qÈ * Ÿ;ðÿÔüáù÷Žô5ò ðî[ìÏêséJèGçwæÉåAåÞä™äpähäoä“äÅä å^å½å%æ“æç~çðçbèÍè/é†éÌéê%ê,êêñé¡é7é£èîççæéä¤ã4â¨àß?ÝuÛ”Ùµ×ÔÕÿÓ8ÒŒÐúΗÍTÌLËqÊÖÉmÉIÉXɪÉ/ÊòÊåË Í_ÎÝÏ€ÑHÓ)Õ(×=ÙeÛÝâß3âˆäçæFéªëîmðÔò)õ‹÷Úù)ütþ±ñ#Nt ¡ ±°®Ÿ‰mEߟ ["$³%R'é(|*ÿ+„-ö.g0Ë1&3w4Á5ù6-8L9a:i;\Ä>a?è?H@”@¬@­@x@@?Ë>Ò=£<5;9©7‹5,3˜0Ç-Ì*˜'F$Ë 7’ã)„Ú Uâ–mýtú¨÷ õ«òtð}î¯ìë¶éƒèyç¡æçå^åðä¦äyägänäŠä¿äùäQå©åæ€æðæfçÚçLè¹èéuéÀéöé ê)ê#ê÷é¶éIéÃèè>çHæ#åäã{âõàWß–ÝÒÛìÙØ,Ö\ÔÒÝÐIÏÖÍ”Ì{Ë›ÊïÉ€ÉLÉUÉ–ÉÊÇÊ·ËÎÌΑÏ/ÑíÒÎÔÂÖרúÚ.Ýsß¼áänæÔè2ë—íüïXò»ô÷iù·ûþD€¸á ' 9 MJM>)罆I "µ#^%'š(.*´+5-°.0†1â254€5»6ò79/:1;.<=æ=Ÿ>D?Ë?6@…@¦@°@@1@¨?ô>>á<~;â9 8ô5§31V.c+:(ï$y!ìIšæ7” ’5þû2øõóãðÝîíiëûé½è®çÇæ æxåå¶ä€äjämäƒä´äïä>å˜åýågæÝæLçÆç5è¤èédé¯éîéê)ê$êêÂé_éÝè6èjçuæbåäÅâBá¦ßñÝ(ÜNÚoØÖ²ÔêÒ0Ñ–ÏÎÎ̲ËÃÊÊ•ÉRÉRɇÉúɦʃ˛Ì×ÍKÏÚИÒmÔdÖlؓڼÜßKá¢ãüåZè½ê#í‚ïæñBôŸöôøEûýÓÿHwž½ Ó äéæßȳ‰d+ò¬!a# %±&H(Þ)h+ê,g.Ô/?12ò3?5}6²7Û8ó9;ú;ä<º={>"?²?!@t@¤@«@@?@Æ??8>=É;3:k8_64œ1â.ù+Ù(–%'"ŸS ðH µ:ß©þžû½øö•óSñ?ïcí¹ëBêúèâçóæ0æ“ååÄäŠänälä€ä©äää.å†åèåRæÅæ8ç­çèèòèUé éáéê%ê&ê êÍéué÷èXè‘ç¨æ–åcäã‘á÷ßGހܪÚÎØêÖÕ@Ó…ÑåÏdÎÍãËòÊ/ʪÉ_ÉNÉ}ÉßÉ…ÊVËbÌšÍÿÎÐ>ÒÔÖØ'ÚQÜ”ÞØà/ã…åççFê¬ì ïqñËó,ö~øÓúýbÿ£Ú 5Q n z…„|kR.Ñ›U! #·$]&ú')+ ,./÷0X2°3ý4?6v7 8½9Ë:Ê;¶<=X>þ>™? @e@›@§@—@L@â?8?d>P=<‚:Ê8Ã6“42s/ˆ,|)8&Õ"R¶ X©þ h ç„Kÿ1üPù”öôÄñ£ïÂí ìŠê:éè$çSæ´å.åÙä‘äuäläzä¤äÓä#åråÖå=æ¯æ ç—ç èxèàèAé’éÔéê ê'êêÚéˆééwè»çÖæÌå¡äJãÝáFàÞÙÜÛ+ÙI×kÕ›ÓØÑ6ЮÎQÍÌËVʾÉpÉLÉrÉËÉbÊ+Ë-Ì[ͺÎ?ÐêѶӡբ׾ÙåÛ$Þfà½âåqçÑé3ì˜î÷ðYó³õ ø^ú­üòþ4j¡Æë  !  óѪyAþ ·"c$ &ª'>)Í*T,Ï-F/®02h3À4ú5<7b8†9”:™;†ä>u?ö?T@@ª@—@^@õ?\?>Œ=K<Ô: 9,75™2ô/ -*Þ&# jÇe³  “0èÿÎüÝù÷ô3òðîbìÒê{éOèOçæÐåLåãä£äxäoäxä—äÐä åhåÀå)æ™æ ççóç`èÎè,é‚éÉéüéê%êêäé™é(é–èàççæÜäã$â–àñÞ0ÝeÛ…Ù§×ËÕðÓ5Ò‚ÐûÎ’ÍXÌNËzÊÚÉ|ÉRÉhɹÉ@ÊË÷Ë!ÍrÎóÏ–Ñ\Ó?Õ?×RÙ|Û²ÝößGâœäüæXéÀëîƒðâò?õ–÷ìù8ü‚þÃü1Z‚ ™ ¯ º¼¸©“uNé¥ c"$¹%X'î(€*,ˆ-ø.k0Ì1(3y4¿5û6*8L9`:c;[<5= >»>\?Û?@@„@£@œ@k@ @}?·>¾=<;w9’7o53{0¯-°*€',$² ÊmÐ G×gýpú¥÷ õ­òsðƒî¯ì$ë»é‰èƒç¦æðåhåôä²ääpävä‘äÄäåWå«åææòæmçÖçQè´èéré¹éôéê#êêíé©é>éµèè1ç4æåÐãkâåàD߈ݾÛãÙØ$ÖRÔ†Ò×ÐGÏÓ͘ÌzˤÊöÉŠÉYÉ`ɧÉ&ÊÚÊÉËãÌ2ΦÏFÑÓæÔ×ÖîØÛE݇ßÔá)ä…æåèGëªí ðlòÉô$÷wùÇûþSÄï 2 G TYUH4ñÆŒR "½#e%'Ÿ(3*¸+;-².0Š1á2945º6ñ79.:,;-< =à=˜>:?Ä?,@w@ž@œ@t@@—?á>î=Ë?©?@j@•@ž@~@-@´?? >=­;:P8E641Ë.Ü+Á(y%"†í;Ý: ¨-Øžþ™û»øöšóPñDïgí½ëHêééçüæ8æœå"åÍä‘äxäqäˆä°äêä4å‹åìåYæÄæ>çªç#è‹èôèOééÝéêêêüéÆéféìèFè†ç•æˆåNäøâ|áçß7ÞmÜ ÚºØäÖÕ:Ó~ÑÞÏgÎ ÍïËñÊ9ʲÉjÉ\É‹ÉñÉ•ÊjËu̯ÍÏ¡ÐYÒ$ÔÖØ<ÚjܧÞðàBã›åøç]ê»ì ïñÜó=öŽøâú,ýsÿ¯é>c u ŠŽ‡tX; Û¢Z!#¼$d&þ'”)+¥,.‘/ú0X2´3û4?6w7›8¾9Å:È;±<Œ=L>û>‹?@X@@›@…@>@Í?'?M>?=ð;p:­8®6w4ý1U/p,`)&½"8¢öG–ñ X ßyCÿ-üIù•öôÃñªïÁíì‘ê>é è(ç^æ¹å:åÛäŸäyätä‚ä¨äÞä%åyåÛåAæ³æ"ç˜ç èwèàè=ééÒéþéêêêÑézééiè©çÇæ»åŽä;ãÇá8àŠÞÊÜöÚÙ<×aÕ’ÓÒÑ0ЫÎPÍ Ì"Ë[ÊÉÉxÉ\ÉÉÝÉoÊCË=ÌtÍËÎWÐÿÑÎÓµÕº×ÑÙýÛ9Þ{àÒâ"å‡çâéHì©î ñgóÇõøoú¼üÿþCx­Òø  !*+$ûÛ²‚F!»"m$&®'D)Ò*V,×-D/·02n3½4ý5:7b8†9:–;Ù>m?í?F@…@™@Š@K@å?I?z>v=1<À:97å4~2Ú/-ú)Â&k#èW¯þP¦  ‰%áÿÆüÛù÷Žô7òð!îdìÙêéXèUç‰æÖåSåîä¨ä„äsää äÒäåhåÈå.æšæ çƒçðçfèÆè/é}éÅé÷éêê êÚéŽééŠèÎçôæñåÈä€ãâ‡àßÞ ÝSÛxÙš×¼ÕíÓ'Ò‚ÐõΑÍ[ÌQËÊäÉ„É_ÉwÉÆÉTÊË Ì5͇ΠЫÑuÓVÕU×iÙ‘ÛÈÝàZâ³äçnéÑë1î–ðòòRõ§÷ûùJüŽþÓ @h ¥ ¼ ÃÊÁ´›T)î° f"$»%a'ó(†* ,‹-ý.n0Î1*3{4¾5ý6&8L9\:a;U<3=>¶>P?Ö?2@|@“@@V@ý?e?¥>¨=u<;^9x7U5ø2b0’-–*d'$™ g¶ [Á 9Í‚býiú£÷ õ¨ò{ð~îºì%ëÂéŽèŠç­æùånåþä¹ä‡äxä|ä›äÆä åWå´åæƒæûæeçâçHè»èéoéµéïé ê ê êéé›é1é¨èóçç&æåÁãYâÒà3ßxÝ­ÛÔÙø×ÖFÔ€ÒÍÐFÏÑÍ—Ì˦ÊÊ”ÉfÉnÉ·É5ÊîÊÜËøÌHκÏ\ÑÓùÔðÖÙ!Û_ݘßëá>䙿ùèYë¿íðòÛô3÷‰ùÖû þ` Îÿ" = U _d`R> ü˘V "À#n%'©(2*Â+;-·.#0‰1æ294~5¾6ë79&:/;"< =×=’>2?º?!@l@@@c@@…?Ë>Ü=±åÿã¡âá…ßÎÝÜ0ÚVØtÖ Ô×Ò#ÑÏÎÓÌ´ËÏÊʧÉkÉkɦÉÊÊÊ©ËÂÌÎsÏ ÑÀÒÔÖØºÚíÜ,ßwáÉã'æèèêCí©ïògô½öùbû°ýðÿ.c‘¸Ö ë ýüÿïßÃr>þ¾!k#%·&Z(â)v+ï,n.Û/D1 2ö3>5~6²7×8ð9ü:ï;ß<­=m>?ž?@_@…@”@j@!@¡?ï> >ì<š;:98,6ç3f1®.Â+¨(`%ø!oÔ({Í( žÑ–þ”û¶øö–óTñFïhíÄëKê éíçç?æ¢å-åÑää~äxä“ä±äôä7å“åñå\æÉæ>ç¯ç!èŒèòèNé—éÛéÿéêêôé¹é[éÞè:èsç‡æuå>äçâjá×ß$Þ^ܑڭØ×Ö÷Ô0ÓxÑÚÏbÎÍìËùÊ?Ê»ÉvÉiɘÉʦÊ|ËŒÌÁÍ.϶ÐnÒ=Ô/Ö3ØTÚ|ܾÞáXã°åèmêÐì2ï’ññóJö¢øïú?ý~ÿÁö#Pi † “™œbBâªc!#Å$i&(›)!+ª, .”/þ0Z2µ3û4A6t78º9Å:Â;­<…=I>ï>…?ö?N@‚@@x@+@¾??:>(=Û;V:•8“6\4ä18/V,D)&£"!‰à4‚â K Ït7ÿ(üFùöôÂñ«ïÅíì”êGé$è2çbæÄå?åæä¥ä‚ä|äŠä­äèä)å‚åßåFæ¶æ%çšç èzèÜè<é‹éËéüéêêûéÄépéôè\è›ç¶æªåä%ã¼á à|Þ¸ÜèÚ Ù/×VÕ‡ÓÌÑ*ШÎQÍ Ì(Ë^ÊÖÉÉkÉŒÉîÉ‚ÊSËUÌ„ÍæÎiÐÒäÓËÕÒ×åÙÜLÞ”àäâ:å™ç÷é[ì¼îñ~óÒõ1ø|úÌüÿO‰¸ã  *86, 滈R !Æ"p$&³'J)×*[,Ø-J/·02q3¼4667c8‚9Ž:’;}<\= >Ï>i?Þ?@@u@@y@?@Ï?9?c>_=<¤:ì8ý6Ê4d2¾/ê,ß)«&N#Ñ?˜ë>• þ ~Úÿ¿üÔù÷ô4òð!îiìÝê†é\è`çŠæäåVåúä®äŠä}ä„ä«äÖäåoåËå3æŸæç…çòçbèËè(é|é¾éòéêêêÌé…é é}è¾çææÝå¼äiãâtàÌÞÝ@Ûnه׷ÕÝÓ#Ò{ÐîΖÍWÌWË„ÊíÉÉkÉ…ÉØÉeÊ(Ë!ÌGÍ¡ÎÐÅшÓmÕk×Ù¥ÛáÝàsâÆä#çƒéãëFî§ðóbõ·÷úTü¤þÝJx— µ Ä ÒÐͽ¥Š[2õ¸ n"$Å%c'ù(Š*,Ž-/m0Ó1*3|4¿5û6'8J9X:a;M<2=ø=¯>H?Ê?+@l@ˆ@}@K@è?U?>”=\<ô:A9b795ß2F0y-z*M'÷#„ ðQ¤ôO° -Â{Yýhúš÷õ¤òðî½ì*ëÈé”è’ç²æærå å¿äää†äžäÓä å`åºåæŠæøænçÝçNèµèéjé²éééêêêØé’é%é–èéç çæñä®ãIâÀà"ßgÝÛÇÙç×Ö9ÔyÒÉÐ?ÏÒ͗̄˭ÊÊ¡ÉnÉ€ÉÅÉFÊËìËÍZÎÒÏoÑ2Ó Õ ×Ù;ÛqݲßþáT䬿 éoëÍí3ðòìôE÷—ùæû.þq©á1 J _ koh_F)Ó ] "È#r%'§(>*¿+D-·.)0‹1ç2:4~5¾6ë79#:+;<=Ñ=Š>+?®?@]@…@@W@ú?u?µ>Ç=<9;›9À7©5V3Ê0.+í'¢$0!¦]­e Ünõýúú%øŒõóçðäîíwëêÏèÄçÝæ%æååÎä—ä„äääÃäåKå«åæuæâæVçÇç7è èé\é£éÞéêêêäéžé<é³è è9çHæ)åòãŒâásß½ÝøÛ!ÚFØlÖ’ÔÐÒÑŠÏÎÐ̹ËÕÊ%ʲÉuÉ{É´É/Ê×ÊÁËÑÌ·ÏÑÚÒ®Ô§Ö±ØÏÚÝ=ߎáßã7æ˜è÷êXí¼ïòyôÎö&ùrû¿ýÿÿ<rÄã õ  øêɨzE Á!w#%Æ&U(ï)t+ö,p.ß/E1£2ö3@5}6²7Ô8ð9õ:ñ;Ô<«=d> ?•?@Q@{@ƒ@\@@?ß>õ=Ú<~;ò986È3M1–.¤+‘(D%à!W¾g¼ ŽÄ‘þû³ø ö–óTñHïmíÈëRê éõç çEæ®å1åÜä£ä†ää—ä½äöäBå”å÷å_æÌæ@ç±ç!èŒèïèKé•éÔéüéê êêé­éPéÎè-ècçvæeå+ä×âWáÆßÞPÜ}򣯮ÖñÔ$ÓsÑÕÏaÎÍîËþÊFÊÆÉÉuɪÉÊ»ÊË¡ÌÕÍDÏËÐ…ÒSÔFÖIØjÚ‘ÜÕÞálãÅå èêäìCï¥ñô\ö°øûLýÿÎ3Yx ’ œ¨£›‡mJî¬o!#Ì$o& ()(+«,%.˜/þ0^2´35=6w7˜8º9À:½;ª<}=B>é>z?î?A@w@}@h@@©??%>=Æ;=:|8{6?4Ì1/=,))î%Š" tËtÎ A Ák0ÿ#üCùŒöôÀñ±ïÇíì›êKé,è9çlæÊåIåíä¬äŒä‚ä’ä·äèä4å‚åæåHæ¸æ+ç˜çèvèÜè:é…éÈéôé êêñé¹écéèèNèŒç¦æšåläã¥áàfÞ¬ÜÖÚÙ ×NÕ|ÓÈÑ#ШÎNÍ%Ì*ËiÊÛÉŒÉwÉ›ÉýÉ–ÊeËgÌšÍù΀Ð/Ò÷ÓçÕâ×Ú%ÜeÞ§àùâPåªç êmìÍî1ñˆóêõ;øúÛüÿ_•Æî ( 8AA8'ëÅY!Ê"w$&¹'N)Û*^,Ý-L/º02t3¹4637d8}9:‹;yÉ>^?Ø?.@m@~@k@-@À?#?P>K=<:Ó8ã6±4J2¥/Ð,Æ)&7#º)„×-… ô oÐÿ»üÐù÷Šô7òð%înìãê‹éeèdç•æéå_ååµä”ä‚ää®äàä#åsåÓå3æ¦æç‡çóçcèÉè&éwé½éèé ê êúéÄésééjè³çÕæÎå¨ä]ãíáeà¼ÞÝ4Û]ÙרÕ×ÓÒtÐñÎÍ^ÌYËÊôÉšÉvÉ–ÉäÉ{Ê7Ë6Ì\Í´Î4Ð×Ñ Ó‚Õ‚×”ÙÀÛðÝ:àƒâÛä7ç”é÷ëXî·ðósõÈ÷údü°þí'[€§ ¾ Ñ ÜÛÙòi5¹ x" $Ì%g')*,‘-/o0Ö1*34¾5ú6%8F9Z:V;P<$=÷=£>B?¾? @`@z@p@:@×?B?~>{=J<Û:*9I7 5Ä2/0[-e*/'å#g Þ;‘å<¥ #µwQýcú÷ õªòð…îÃì0ëÍéè–ç¾ææ€å åÊä—ä†ää§äÖäåbåÀå ææûæoçÜçQè±èéeé¯éâéê êüéÏé‡ééèÔççæâäŸã4â´à ß[݋ۻÙÙ×Ö.ÔsÒÄÐ:ÏÕÍ“Ì˯ÊʨÉ~ÉŠÉØÉUÊËÿË%ÍlÎíÏÑKÓ Õ#×*ÙSÛ…ÝÄßâeäÁæ!é}ëäí?ð¤òúôW÷¦ùõû>þ|ºë; W j u{rgP1 Þ£i "Ð#x%'°(@*Ã+J-¶./0‰1ì284‚5º6í7 9#:';<ÿ<É=„>!?§? @S@u@s@D@í?`?¢>´=„<&;9ª7Œ5?3®0ï-÷*Õ'‡$!óI›öU Ô^îýòú(ø†õ"óçðéîí~ëêÙèÆçéæ)æšå$åÓä¢ä‰äŠä¤äËä åSå®å æzæåæVçÊç6è¢èÿèYéŸéÙéüé êÿéÚé“é.é¨èúç+ç7æåßã|âýàbß­ÝçÛÚ8Ø^ÖÔÂÒÑ€ÏÎÐ̽Ë×Ê0ʷɈɂÉÊÉ8ÊòÊÍËìÌ+ΠÏ5ÑíÒÇÔ»ÖÈØåÚÝUߣáñãOæ§èëiíÍï+òˆôàö5ùûÍýH€©Óí  ïÖ­„J Ç!}#"%Ç&_(ð)}+ö,u.à/J1£2÷3@5}6°7Ó8ë9ô:é;Ô< =a>?Œ?ú?D@p@r@O@ü?~?Ê>á=Åá>q?å?6@e@w@Q@@”?î>>û<°;%:b8c6&4²1/",)Ô%q"ô[» cÀ 2 ¸`)ÿü<ùöôÇñ®ïÎíì êSé2è@çtæÒåPå÷ä²ä•äŠä˜ä½äñä7å‹åèåNæ¹æ.ç™çèuèÜè5é…éÂéíéêêèé°éVéÛè?è|ç—æ‰å[äã•áàWÞšÜÉÚòØ×?ÕxÓ¼Ñ!ФÎOÍ&Ì0ËnÊäÉ™ÉÉ­É Ê©ÊuËÌ«ÍÏ•ÐBÒÔ÷Õþ×Ú@ÜvÞÀà ãcåÂçêƒìÜîCñœó÷õMøžúéü.ÿm¡Õú 5 BMLA1óЗ_!Ï"€$!&¿'T)Ý*f,Ú-V/µ0!2n3À4ÿ567a8|9Œ:ˆ;uÄ>R?Ð?#@`@p@]@@°??=>5=ð;v:¼8É6—4/2Œ/³,­)u&#¡mÆx á hÌÿ²üÍù÷Šô8òð*îoìëêékèoç˜æôågååÂä—ää“ä·äæä*å{åÕå:æ§æçˆçõçbèÈè$évé´éèéÿéêìé¾édéùè[è¥çÃæ¿å—äIãÞáPà¬ÞðÜ%ÛKÙv×—ÕÑÓÒpÐíÎÍ_Ì^Ë‘ÊÿɣɅɢÉ÷ɇÊOËCÌwÍÄÎLÐïѳӜ՗׬ÙÔÛÞMà›âïäJçªé ìkîÊð&ó…õØ÷,úvü½þý5g² Ë Þ åêÜÕ¶œn?Å }")$Ñ%m')’*,“- /r0Ö1.3~4¾5ü6"8F9S:X;F<%=ë= >8?µ?@Q@p@_@,@Ã?3?d>l=.<Æ:9175®20G-D*'Å#T Â*xÓ+• ­jNýZúœ÷õ¬ò~ð‰îÅì6ëÐé§è›çÆææ„ååÎä¢äŒä•ä­äßäåjåÄå#æ”æüærçßçMè´èéeé©éÝéüéêóéÅéxé é}èÆçôæïåÔä‹ã%âŸàÿÞGÝÛ§ÙÑ×öÕ'ÔhÒÀÐ6ÏÒ͘ÌË·ÊʳɈɜÉãÉkÊ%ËÌ8̓ÎþÏ›Ñ^Ó8Õ7×BÙgÛÝÙß*â{äÖæ2é”ëôíTð´ò õe÷¹ùüNþÄþK b v ‚‚€n\;èªq $"Ö#%'·(B*Ì+H-¿.-01ì284„5¸6ì7 9:';<ü<Ã=|>??@I@e@h@2@Ü?M?>=p< ;i9Ž7w53™0Ñ-ß*º'n$!vÞ2ŠäG ÅUèýîú"ø‡õóëðêîí‚ëêÞèÑçëæ5æžå,åßä¥ä•ää«äÓäåXåµåææææ\çÊç6è¢èýèWé›éÔéöéêùéÌé‹é"é˜èîçç$æåÉãnâëàRßœÝÙÛÚ.ØRÖ‚Ô½ÒуÏÎÖÌ»ËãÊ2ÊÇÉÉ—ÉÑÉPÊþÊäËÿÌ?εÏIÑÓÝÔÑÖÞØûÚ/Ýj߸áäcæ½èëíÜï?ò˜ôòöBù–ûØý U¸Þù  ! üܸ‹R Ï!#,%Ê&g(õ)~+þ,w.â/M1£2ü3>5€6«7Ö8ç9ñ:ç;Ë<ž=W>ü>‚?ð?9@e@b@A@ë?l?¶>Ì=®6t7–8¶9¹:·;ŸØ>k?Ø?-@Y@f@F@ÿ?ƒ?Ü>û=è<—;:J8G64’1í.,ù(¸%["ÚG¢úO± $ ¬V ÿü6ùŽö ôÈñ°ïÑí!ì§êUé<èCçæÖå]åùäÀä™ä’ä äÄä÷ä>ååíåTæ½æ/çç èwèÙè4éé¾éèéýéýéÛé§éHéÐè0èmç…æ{åHäøâ€áòßFމܹÚåØ×5ÕnÓµÑСÎLÍ+Ì2ËvÊîɡɑɹÉʻʈËÌÃÍ#ϬÐXÒ'ÔÖØ*ÚRÜ‘ÞÐà%ãvåÔç2ê•ìðîUñ¬ó ö]ø°úõü@ÿx³ß) ? PVVM< Ó¢g$!×"…$(&Æ'W)ç*d,å-R/½02r3À4ÿ567`8z9‰:„;p½>J?Å?@R@e@I@@˜??(>=Û;^:¡8²6|42o/›,Ž)a&#ùX²f Õ Wý¾ÿ±üÄù÷ˆô9òð-îrìðê—éqèrç¥æöåuå åËä ä“äžäºäñä-ååÚå?æªæç‡çúç^èËèéré³éÞéüéûéåé±é[ééèOè•ç³æ°å„ä:ãÊáAàšÞáÜÛ@ÙeבÕÃÓ ÒiÐéÎÍ^ÌbË—ÊÊ®É’É®É Ê—ÊbËỶÍÚÎcÐÒÐÓ¬Õ²×¾ÙíÛÞcà°âå_ç½éìîÛð<ó‘õì÷:ú‰üËþ Ctž¿ × ê ñôëÛ£xJÍ ƒ"1$×%t' )˜*,š- /y0Ö123{4Ä5ø6$8E9Q:T;C<=ç=˜>0?¬? @G@`@R@@´??Q>U=<©:ý87î42ö/)-+*þ&­#8 ­f¾„ ŸcEýVú—÷õ«òðŠîÌì6ëÚéªè£çÎææå åÖäªä’äŸä³äæä"ånåÊå)æ–æçpçäçIè·è édé£éÚéòéþééé»énéþènè»çàæäåÀäxãâŠàòÞ2ÝpÛ™ÙÁ×íÕÔcÒ·Ð5ÏÎÍ™ÌË¿ÊÊÀɓɩÉõÉzÊ9Ë(ÌLÍšÎгÑrÓSÕK×ZÙ€Û®Ýöß9â”äèæIé§ëîiðÃò!õw÷Èùü[þœÖ4S s  ‘‹ŒzcGï¶u /"Ú#‡% '½(F*Ò+K-Æ.,0–1è2@4~5½6é7 9:!;<ò<À=t>?•?÷?<@[@U@&@Ç?‡=[<ò:S9s7[53{0¶-Â*Ÿ'T$ç aÃ!sÒ: ³Nÿäýäú#øõ%óäðòîíˆëêãè×çóæ:æ§å4åää²ä–ää®äÚäå`å·åææëæ^çÉç9èŸèþèQé™éÍéñéûéíéÆé|ééèÛççæüä»ãZâÚà=ßÝÅÛ÷ÙØEÖwÔµÒ Ñ|ÏÎÑÌÃËäÊ=ÊÎɛɡɿÉ]ÊËöËÍXÎÉÏaÑÓõÔéÖôØÛEÝßÎáäyæÏè5ëíòïQòªô÷Tù¤ûêý,h™Éê  '+'éÀ“^ Û!†#3%Ñ&k(ý)€+-w.ê/M1§2û3?5€6¬7Ó8æ9í:ä;Å<™=O>õ>z?ã?.@U@W@1@Ø?Z?¡>¸=—<:;¦9Ò7Ç5}3ý0C.Y+=(ý$‘!wÙ+ˆí c÷£þzû©øö‘ó]ñJï|íÒëeêé èç^æÄåIåöä¸ä ä–ä­äÑä åRå¥åæhæÚæEç´ç$è‰èíè@ééÁéëéøéñéÍé‹é+é¦èè5çFæ3åúã â%á’ßàÝ"ÜNÚzØ¢ÖÐÔ Ó]ÑÉÏYÎÍøË Ë\ÊãɠɣÉÒÉFÊíÊÊËÙÌÎÏÑÈҔԋ֋جÚÕÜßWá®ãþå_è»êí|ïÚñ7ôöâø2ûxý¾ÿ÷-Z€ž ³ ÃÅÆ·§†i5Å!4#Þ$€&(­)4+¹,..¢/1f2¶35B6n7›8¯9¸:µ;˜Õ>]?Ð? @N@V@9@é?u?Ä>ê=Í<ƒ;ó938,6õ3y1Î.î+Ø(£%="Å,ä=£  ¢Kÿü6ùˆö ôÊñ¯ïÖí$ì¬ê]é@èMç„æáåbååÅä¢ä™ä¦äÌäüäGå‘åöåTæÃæ0ç ç èzèÓè5éyéºéâéôéöéÑé›é>é¿è%è[çxæhå8äåânáâß4ÞzÜ©ÚÖØýÖ*ÕcÓ¯ÑÐÎPÍ(Ì9Ë|Ê÷ɬɟÉÇÉ0ÊÉÊŸË£ÌØÍ9ÏÂÐoÒ=Ô'Ö'ØCÚiܦÞèà6ãåäçJê£ìïeñÂóönø¾úýOÿ†Àï9 I ]aaWF* ܪo*!à"Š$0&É'_)é*j,ê-S/Ã02u3Â4ý597Z8{9…:€;n±>F?·?@E@T@?@û?Œ?é>>=Å;D:Œ8”6e4ù1U/,u)D&ê"râD›öU Å Nñ·ÿ¨üÁù÷ˆô6òð.îyìóêœé{èxç­æÿåxååÌä®ä—ä§äÀä÷ä4å†åßåBæ­æç‡çûç`èÆèéné­éÛéóéóéÛé¦éOéÛèBèƒç§æœåuä'ãºá,àÞÊÜ Û,Ù\ׂջÓÒdÐçÎŽÍ`ÌfËžÊʻɜÉÀÉʬÊqËpÌ›ÍôÎuÐÒâÓÈÕÅ×ÙÙÿÛ4ÞzàÃâåsçÐé2ìîîðMó¦õû÷Kú™üÚþS€­Ê å õ ÿüøâЪ‚PÕ Š"7$ß%x')›*!,›-/v0Ý103€4Â5ø6&8?9R:N;@<=â=>*?¡?ÿ?;@S@B@ @¡? ?@><=<:å8ø6Ò4v2Ö/- *å&’# –ùR« v û•Y>ýQú“÷õ«òðîÌì?ëÞé°è«çÒæ!æ“å(åßä¯äžä¡ä¿äèä-åqåÐå/æ—æçtçàçPè¯èé^é¢éÑéïéõéÞé³é_éôè_è¬çÐæÓå®äjãâ}àÜÞ$Ý_ÛŠÙµ×ßÕÔYÒ³Ð0ÏÏ̘͘˽Ê0ÊÂɥɵÉÊÊFËBÌ\ͳÎ)ÐÇÑŽÓdÕg×oÙ•ÛÉÝàTâ¦äþæ]éºëîwðÛò.õ‹÷×ù&ülþªåAa } œ˜—sJ,óÀ| 8"á#Ž%''À(O*Ó+S-Å.30•1ì2A4}5À6å7 9:; <ð<¸=m> ?Š?í?/@O@D@@µ?*?f>r=A<Þ:59]7>5ì2_0-¥*‡'7$Ï H« ^Â( §@øÚýáúø„õóîðíî#í‹ë!êìèÛçþæAæ®å=åìä¹ä¢ä ä·äáäådåÀ忆æîæ^çÎç5è èúèQé”éÆéìéïééé·éséé}èÐçúæææä«ãGâÈà1ßvݽÛáÙØ9ÖkÔ¯ÒÑ{ÏÎÖÌÃËìÊDÊÙɨɮÉöÉoÊ$Ë Ì&ÍmÎßÏwÑ1Ó Õ× Ù*Û[Ý—ßãá2䋿çèFë¥íðcòºô÷bù·ûúý;x¨Óú , 081$îΙg% à!#6%Û&m(*ˆ+-€.ç/T1¤24=5‚6ª7Ò8ã9ì:Þ;Ã<=I>í>p?Ù?#@G@G@"@Ç?F?>Ÿ=„< ;Ž9¹7«5d3à0(.=+$(ß${!÷e¿vÚ Xèœuþtû¤øö•óXñQï{íÙëiê%éè&çhæÇåUåùäÂä¦ä ä´äØäåWå¬åæræÖæLç´ç&è‡èíè<é‰é¾éâéóéçéÄééé˜èòç(ç3æ$ååãâá}ßÑÝÜBÚjØ–ÖÅÔÓXÑÂÏYÎÍúËËdÊêɯɬÉäÉWÊþÊßËîÌ+ΙÏ$ÑÞÒ¬Ô Ö¤ØÁÚïÜ(ßqá¿ãæsèÏê2íŒïïñGô öôø@ûŠýÌÿ<hŽ« À ÎÒÏÄ­”nB ω!;#æ$…&"(°)=+º,6.¡/ 1e2»3ÿ4C6m7™8¬9¸:¯;•Ê>X?Ä?@A@I@(@Ü?_?³>Ò=»©>=?¬?@7@G@0@ê?x?Ù>û=÷<¨;0:q8{6J4Ý1?–?ö?.@D@5@ø?‘?ö>->&=ï;y:Ê8ß6º4W2Â/ó,ö)È&z# }å=šú i ìL=ýJú‘÷õªòƒð”îÍìGëâé·è³çÚæ)æ™å3åääºä¤äªäÄäñä0åyåÕå1ææçuçæçHè·èé^é›éËéééêéÙé¤éWéåèRèœçÁæÁåžäXãîálàÌÞÝQÛ|Ù§×ÔÕ ÔPÒ¯Ð,ÏÎ̘͛ËÉÊ1ÊÑɰÉÂÉÊŸÊZËSÌrÍÅÎAÐÝÑ¡ÓÕw׉٫ÛÝÝ àfâ¼äçqéÎë.î‹ðéòDõ—÷êù4ü{þºó"Mo ˆ › £¦œ‘vW0þÆ… ="è#”%+'É(P*Ú+T-Ê.40—1ñ2=4ƒ5º6ç79:; <é<³=f>??ä? @D@6@@¥??X>X=0<Â:!9A7&5Ò2D0-*j'!$¶ 1˜öP¯ š5ðÒýÞúøõóîðñî(íë(êðèæççLæ´åGåóäÀäªä§äÁäæä$ålåÀå"æ„æõæ^çÎç8èœèüèIé“éÀéåéêéÚé±édéÿènèÂçéæöå×äšã4â»àßpÝ¥ÛØÙØ*ÖfÔ¡ÒÑtÏÎÔÌÈËòÊJÊçɰɿÉÊ€Ê8ËÌ;̓ÎõÏŒÑJÓ Õ×"Ù=ÛtݪßùáFä æúè[ëµíðròÏô#÷xùÀûþG…¶à 3 >@</ûÒ¤m. å!—#=%Þ&v(*Œ+ -.ì/S1ª2ý3A5}6­7Î8â9æ:Û;¾<‹=A>ã>f?Ð?@:@;@@º?2?|>=j< ;t9¢7‘5H3Ç0 .$+(Ç$c!àP©dÌ KÛ–jþsûŸøö“ó[ñQïƒíÛëqê)éè.çoæÐå^ååÌä­ä¦ä¼äàäå`å­åæsæÜæKç·ç$èŠèèè;é„é¹éÝéêéÞéºéuéé‹èäçç%æåÔãâánß¿ÝÜ1Ú`؇ּÔüÒNÑÃÏSÎÍüËËlÊôɹɽÉðÉlÊ ËöËÿÌDΫÏ=ÑñÒÇÔ³Ö»ØØÚÝ@ß„áÔã,æ„èäêAí¢ïýñZô¯öùQû˜ýÛÿLs›¶ Ì ÚÜÚ̺›wJØ!@#î$ˆ&)(´)@+¿,6.¨/1k2¸35@6o7•8­9°:­;Æ>J?½?@6@9@@É?O?ž>À=¡6? ?ÿ?&@>@@Û?h?À>î=Ú<—;:X8c6,4Ç1/I,A)&¹"@¸xÌ8 © 2Þ¥ÿ›ü¹ù÷„ô:òð7î‚ìûê­é€èŽç¶ææ‰å%åãä·ä¬ä±äÒäåCååçåOæ®æ%ç‰çüç^èÆèéhé¤éÎéäéäéÈéŽé:é½è'èfç…æ{åTäã–áàdÞ³ÜãÚÙ>×oÕ©ÓôÑ]ÐßÎŽÍfÌk˱ÊÊÒÉ·ÉÜÉ:ÊÌʛ˖ÌÅÍÏ¡ÐHÒÔòÕô×Ú.Ü`Þ£àðâBåçøéWì¸îñtóÄõ øjú¸üøþ:mœÈá   ÷⽓b$å —"F$å%‰')©*&,¤-/€0Ý153‚4Á5ø6 8>9H:L;0<=Ï=„>??è?#@6@'@å??á>>=Ö;c:°8Ç6ž4@2¤/Ù,Û)¯&a#ñdÑ(‰ç \ ÞƒH0ýIúŽ÷õ­ò‚ð•îÖìFëíéºè¼çßæ1æ£å9åíäÂä«ä²äËä÷ä7ååÚå5æ£æçzçâçNè°è éWé™éÆéàéæéËéžéHéÙèDèŒç²æ±åäFãÞá\à·ÞÝ=ÛoÙœ×ÆÕÔHÒ«Ð(ÏÐÍ›ÌËÐÊ9ÊßɹÉÔÉ$ʱÊnËḟÍÛÎVÐòѻӒՒלÙÂÛòÝ4à|âÐä'ç„éáëAîðüòTõ©÷øùFü‰þÊþ2Y} ’ ª ª´§š_9΋ D"î#™%1'Ì(W*Û+Z-Ì.80™1ð2@4‚5º6å79:;<æ<©=a>ö>w?Ö?@2@*@ô?•??B>D=<©: 9&75¶2+0g-r*P' $ž ƒá= Œ,çÉýÝúø„õóððôî+í”ë.ê÷èëç çTæ¼åOåúäÊä°ä¯äÈäíä*åråÆå$æŽæðæhçÉç=è™èúèHéŠé¿éÚéæéÑé¤é\éîèbè²çÛææåÆäˆã%â§à ß\ݘÛÉÙø× Ö\ÔšÒüÐqÏÎÙÌÊË÷ÊSÊïɽÉÍÉÊ“ÊIË3ÌN͙ΠУÑ^Ó:Õ)×;ÙTÛ‰ÝÀßâYä¶æ énëËí'ð‰òÚô9÷…ùÓûþW”Ãî , ? JLF8"Ü­s8 é! #A%å&z(*‘+ -„.ð/R1®2ý3B56©7Í8Þ9ã:×;¶<…=9>Ü>[?Ç?@/@-@û?¬??k>v=T<ó:[9‡7y5-3­0ò-+ñ'­$K!É7˜õR¾ <Ôˆiþhû øÿõ”ó\ñUï„íâësê4éè9çræÜåaå åÓä´ä±ä¿äèäågå±åæræäæKçºç#èŠèåè:éé³éØéàé×é¯éiéé}èÔç çæåÅãjâõàXß´ÝìÛ(ÚM؂֫ÔùÒDÑÃÏNÎÍúË ËqÊþÉÉÉÄÉÊvÊ%ËÌÍWÎÀÏUÑÓÝÔËÖÒØìÚÝPßáçã@æ™è÷êUí²ïòhôÄöùeû¤ýìÿ!Z€«¾ Ü âéãØÁ¦Sß•!H#ó$&,(»)B+Å,8.ª/ 1k2¹35=6q7‘8«9¯:¦;‹<\=>º>C?°?ü?'@,@@¹?¬=Š'?œ?ë? @*@@È?V?®>×=Å<€;û9B8H64¬1/0,')ó%¢"'¡aÁ" (Уÿ“üµù÷„ô<òð:î„ìë¯éŒèçÂææ’å-åéäÂä°ä¼äÖäåJå“åïåPæ´æ&ç‹çýç`èÁèédééËéÛéÜé¿é„é,é³èèXçuæjåCäòâ†áüßUÞ¢ÜÔÚÙ3×bÕ£ÓëÑYÐÜÎŽÍgÌt˳Ê*ÊÙÉÆÉêÉHÊâʩˮÌÖÍ7Ï´ÐaÒ#Ô ÖØÚAÜwÞºàãVå°ç êhìËî"ñ…óÖõ/ø{úÅü ÿD~©Ôï  çÇœi-ê ž"J$ò%†'!)§*-,¦-/0à1634Á5ù68;9H:B;1<=Ë={> ?†?Ú?@&@@Ö?m?Ð>>ü<Â;G:›8«6†4$2Š/¿,¿)˜&F#ÙPºvØ M Ò{>,ýDúŠ÷õªò‰ð”îÝìIëóéÃèÁçéæ8æªåBåöäÈä³äºäÐäÿä;å„åßå:æ£æ çxçæçLè¯èéVé’éÀéÛéÚéÇéŒéBéÈè9è{ç¥æžåä2ãÐáIà¨ÞöÜ.Ûdً׿Õ÷Ó@Ò§Ð#ÏÏ̡͞ËÕÊBÊéÉÅÉãÉ4ÊÀʃËwÌÍðÎiÐ ÒÌӭդ׵ÙÖÛ ÞIàâçä9ç™éôëSî±ð ócõ¼÷úWü—þÙ >f‰ ¡ ² º»²¥‡m<Ó• F"û#˜%='Î(\*ß+^-Î.;0›1ó2?4„5¹6æ79:;<Û<¨=V>ð>l?Î?@+@@è?€?ñ>+>1=<•:ï87ó4ž2 0N-V*8'í#… kÏ)ý ‚áÂýÖúøõóóðõî2í–ë5êýèòççZæÃåYååÕäµä¸äÍäöä/åxåÉå+æŒæùæeçÎç;èšè÷èFé‡é¸éÕéÜéÉé›éPéâèTè¤çÌæÕå¶äuãâ•àúÞK݈ۻÙè×ÖPÔ•ÒõÐlÏÎÕÌÓËùÊ^ÊöÉÌÉÙÉ$ʤÊZËHÌbÍ®ÎкÑtÓPÕB×OÙmÛœÝØß"âqäÇæ$é}ëáí:ð˜òðôG÷–ùåû%þkÕú 6 N SXR@- ç´~; õ!¢#K%é&(*”+-ˆ.ò/V1±2ü3C56¦7Ï8Ø9å:Í;¸Ì>Y?µ?@@@ò?”??U>`=@<Û:D9m7_530Ú-ë*Ö'•$.!·†ÞD­ /Æ^þeû™øÿõ“ó]ñXï†íèëwê9é&è<ç~æâåhåå×ä¿äµäÉäíä$åhå¼åæzæãæOçºç&è†èçè4é}é­éÒéÚéÎé£é`é÷èrèÇçöææïä´ã[âààMßžÝâÛÚGØmÖ¬ÔæÒHѶÏUÎÍÌ"ËzÊ ÊÑÉÕÉʉÊ6ËÌ(ÍoÎÓÏlÑÓôÔàÖéØÛ1Ýhß³áûãVæ¬è ëgíÆï#òzôÕö!ùsû·ýøÿ3c“°Ô à ôðñàήŠX%æ!Q#ô$œ&-(Â)G+È,=.«/1j2¿3ÿ4C6l7“8§9­:¢;†´>8?§?ï?@@ù?¨?)?x>”=w<#;•9Ì7È5‡31c.+s(7%Ü!dÓ8˜öb Ür"üþöû&ùö ôÌñºïàí8ì¾êwéZèjç ææ|å(åãäÂä¹äÄäçäå^å§å ædæÑæ9ç¥çèvèÑè'élé¤éÍéÖéÒé­ékéé‹èèç"ç6æ$åöãœâ-á›ßñÝ;ÜlÚ ØËÖÕ>Ó˜ÑИÎOÍ3ÌOË”Ê"ÊÖÉØÉÊrÊËéËõÌ,ÎŽÏÑÇÒ˜Ô€Ö…Ø—ÚÇÜöÞDáˆããå6è™êïìTï«ñô`ö¯øûFý‰ÿÃú"Me ~ Š‹„iU)ÉE!ü"¤$H&ß's)ú*|,ö-b/Ì0%2{3Ã4647W8p9y:r;Z<,=ì=“>?‘?á?@@@¹?B?>À=²øŽúÕüÿTŒ¸ßÿ  %*)  ôΧp7ñ ¦"R$õ%‘'#)®*1,¬-/…0á1:34Ã5ö6899F:@;-<=È=q>?y?Ò? @@@Æ?[?À>ê=ê<¦;4:€8‘6j4 2q/¢,¦){&,#Â5¤ÿcÅ ? Ão3'ý;ú‰÷üô¬òˆð˜îÝìQëôéÍèÃçóæ=æ³åIåþäÏä½äÀä×ä å<å‘åÝåBæ¦æç}çäçNè®èéTéé¼éÓéÓé½é„é4é¿è(èqçæ‘åkä$ã¼á6à™ÞäÜ ÛRÙ×´ÕêÓ>Ò›Ð&ÏË̦͟ËÚÊKÊòÉÓÉðÉEÊÒÊ”ËŽÌ®Í Ï~Ð$ÒâÓÃÕ½×ËÙíÛ!Þ^à©âøäQç¬é ìdîÆðóyõÊ÷úcü©þæKx’ ± » Èž¯xEÞ™ T"û#¥%>'Ø(^*è+]-Ö.<0ž1ö2?4„5º6ä79: ;ÿ;×<¢=M>ê>b?Á?ÿ?@ @Ò?s?Û>>=é;}:Ö8õ6×4„2ò/3-;*'Ö#j ìT¹{í sÔ¼ýÎú ø}õóóðöî4í›ë;êéùçç_æÏå\å åÙä½äÂäÑäþä4å}åÑå-æ“æùæhçÐç9èœèòèEé‚é³éÏéÓéÁééCé×èFè•ç¼æÅå£äfãâƒàìÞ9ÝxÛ°Ù××ÖBÔÒîÐjÏ ÎÚÌÒËËdÊÊ×ÉéÉ1ʵÊpËVÌ}ͽÎ;ÐÌÑŽÓbÕ\×eÙ‚Û´Ýìß9â„äÝæ7é‘ëõíJð­òõV÷©ùóû7þy¬ã. B Z ]gYO4ﻈA ý!©#Q%ð&ƒ(*•+-‡.ù/V1³2þ3E5|6«7Ç8Ý9Ú:Ñ;«Ê>K?®?õ?@@Þ?†?ú>A>K=*<Á:09P7H5÷2w0½-Ò*¹'{$!› kÏ.¡ »vVþ_û•øûõ’ó_ñXï‹íëë}ê@é*èEç„æêårååääÁäÃäËä÷ä(åpåÀåæ~æææPç¾ç"èŠèáè5éwé©éËéÑéÆé›éRéîèaè¹çéæõåÞä¤ãHâÑà8ß‘ÝÏÛÚ6ØfÖÔãÒ<ѶÏPÎÍÌ(ËÊÊßÉâÉ#Ê™ÊIË)ÌBÍÎíÏ€Ñ4Ó ÕúÖüØÛDÝßÄáägæÃèë{íÙï7òŠôéö0ù„ûÇýBržÂÜ ñ ûøïÓ»e+î¤!W#þ$&8(Â)O+Ë,A.¯/1l2À35A6l7’8¢9¬:;¬>1?š?æ? @@ë?”??a>=_< ;}9²7¬5o3ó0I.d+X(%À!L»%çO Ñdôþñû"ùzö ôÈñÀïáí<ìÄê|éaèpçªææŠå+åîäÈä¿äÍäëäåcå¬å æiæÒæ=ç¦çèrèÔè éoéœéÆéÏéÊé£éaéé|èÝçç(æåããŽâáŠßãÝ'ÜbÚŽØÂÖóÔ9ÓÑЖÎMÍ8ÌQË Ê%ÊèÉÝÉÊ}Ê(ËûË ÍAÎ¥Ï/ÑàҬԘ֚ذÚÛÜßUá ãöåLèªêídï¾ñômöÆø ûYý•ÿÓ1Yq ’”Žu[5Õ’R!þ"¯$I&ç'v)+,û-b/Ñ0$23Á4617X8m9w:m;U<&=æ=‡>??Ü?@@ð?¨?0?‹>ª= ü>n?Ê?ú?@ö?¹?H?¬>Ø=Ò<“;:f8y6Q4ï1W/ˆ,Š)f&#­ïN» * ¿a.ý<ú‚÷õ§òŒðœîßìZëúéÑèÏçöæHæºåRååÖäÅäÆäáä åHååçåDæªæççççKè¯èéOéŒé²éÎéËé²é|é&é³èècçæƒåXäã¨á)à†ÞÖÜÛFÙsשÕáÓ6Ò—Ð"ÏÌ̫͡ËàÊUÊýÉàÉÊRÊæÊ§Ë ÌÇÍÏ—Ð5ÒýÓ×ÕÒ×ãÙÿÛ:ÞoàÁâ ådçÀéìzîÕð/óˆõÛ÷)úvü´þ÷)[  º È ÒÐʵž{R!㤠T"$§%F'Ù(e*è+f-Ô.@0Ÿ1õ2D4€5¼6á79 : ;ü;Ï<=C>â>X?µ?ô?@ÿ?Â?`?Ê>>=Ï;i:»8Ý6¼4i2Ù/-#*'½#S ÒC¢kÞ jѲýÌú ø{õóòðþî4í¥ë=ê éè!çiæÕåeååàäÇäÆäÚäå9å„åÓå3æ”æçfçÓç9è˜èõè=é€é­éÇéÍé¶é‡é8éÈè;èƒç²æ±å–äSãóáràÚÞ*ÝhÛ¡ÙÎ×Ö=Ô†ÒéÐjÏ ÎÛÌØËËqÊÊéÉòÉDÊÅÊ‚ËkÌÍÓÎOÐåÑ Ó}Õn×}Ù˜ÛÇÝàIâäíæMé¤ëî]ð½òõi÷·ùüGþ…¾ì7 R b lneX=öÆ‹L "°#W%ó&Š(*›+-ˆ.ü/W1µ2ý3G5y6«7Ä8Ú9×:Ì;¨¾>C?£?ç?@@Î?t?é>*>9=<­:9;7+5Þ2\0£-·*¢'^$!‚öY¼‘ ²lTþVû—øõõ˜ó[ñ`ïŒíñëƒêDé4èJçŽæðå{å#åéäÎäÃäÙäøä3åråÆå æ€æìæQç¾ç%è†èâè0été£éÃéÌéºé’éGéßèVè©çÚæãåÐäã:â½à*ß~ÝÂÛöÙ+ØXÖ•ÔÚÒ8ѲÏOÎÍ Ì,Ë‹ÊÊêÉòÉ0ʬÊ\Ë=ÌTÍ”ÎДÑKÓ Õ ×Ù-Û]Ý”ßÚá)ä{æÕè2ëíìïEòŸôõöDù’ûÔýP¬Îç þ  ô῜i7ñ®![#%¥&8(Í)M+Ò,B.²/1n2½35<6n7Ž8¢9¥:œ;y¢>)?Ž?Ú?@@Û?„??Q>j=L<õ:d9›7‘5V3Ù0/.J+?(%«!3§l×@ ÃZêþïûù~öôÍñ¿ïéí=ìÎê~ékèwç±ææ’å2åøäÍäËäÐäõä$ågåµåænæÕæ?ç§çèrèÏè"éeéœé»éÌé½é›éUéöèrèÌççæåÑã}â áxßÒÝÜPڅسÖëÔ0Ó‰ÑúÏ–ÎLÍ=ÌU˦Ê2ÊïÉñÉÊ•Ê3ËÌÍWλÏDÑ÷ÒÂÔ®Ö±ØÅÚñÜ$ßlá³ã æ`è»êísïÓñ)ôöÕøûiý¢ÿã>d€ “ ¢¥ —}f;ÖŸT! #°$T&é'~)+†,ù-k/Í0,2z3Æ4ý557Q8n9q:k;O< =ß=€>?|?Ê?ú?ÿ?ã?–? ?t>™=…<8;¸9ñ7ÿ5Ä3Z1´.ß+Ö(«%Q"æVÆ$Šô s ¸ƒÿ…ü¦ùýö…ô8ò(ð@î“ìëÂéè§çÖæ.æªåCååÔäÌäÍäïäå\å£åþåYæÃæ'ç”çüç_è¿èéZéŽéºéÇéÁé¤é`é é‹èìç.çAæ?å äÂâQáÈß&ÞpܪÚÝØ×DÕ†ÓÙÑGÐÚΉÍtÌ|ËÊÊDÊüÉíÉÊzÊËæËåÌÎqÏúРÒjÔLÖMØ^Ú„Ü¹ÞøàBã˜åèçKê¡ìï[ñ¶ó ö_ø­úóü7ÿo©Ðû , ;C:8 ܺ|Hþ ´"^$&›',)¹*6,´-/Š0ä1<3‚4Â5ö6849>:9;"<ø<¶=c>ò>f?»?ï?@è?¦?6?™>Ã=½<|;:P8a654Ö1;/m,s)H&ü" xÛ>¨ ! °W'ý7ú÷ÿô¬ò‹ð¢îãì^ëê×èÖçþæPæÀåYå åÞäÌäÎäçäåOå“åîåHæ¬æç}çéçJè¬èéJé‰é«éÈéÁéªéoéé£èèRçræråHäã™áàwÞÇÜÛ8ÙiךÕàÓ)Ò—ÐÏÊ̫ͧËëÊYÊ ÊéÉÊcÊöʻ˲ÌÝÍ,ϰÐHÒÔëÕë×õÙÜJÞˆàÒâ"åxçÑé0ì‡îíð;óœõê÷7ú‡üÁþ4jŒ® Å Ó ÞÙÓÀ¦„[%íª \" $­%I'à(g*î+f-Û.?0¤1ô2D4ƒ5·6â7û8 :;ó;Î<=B>Ô>P?ª?æ?ý?î?²?Q?µ>ñ=ñ<º;Q:£8Æ6¢4Q2½/-*ì&¡#> ¼.öYÕ WÁ³ýÄúøyõ!óóðï;í§ëFêéè(çqæÛåoååéäÐäËäääåBåˆåÚå5æœæüænçÏç;èšèîè>éxéªé¿éÆé¬é}é-é»è-èuç æ¥å‚äEãßácàÉÞÝ[Û‘ÙÂ×õÕ4Ô|ÒçÐbÏÎØÌÞË ËxÊÊòÉÊVÊÓʕˀ̠ÍìÎ`ÐýѵӔՂד٭ÛßÝàbâ­äç[é»ëîrðÍò"õ{÷ÄùüTþ’Îõ'A ^ o u{ldD*ýÌ–P "¶#\%ú&(* +-.û/[1¶2þ3H5x6¨7Å8Ô9Ö:Å;¢¸>6?›?×?ü?î?Á?b?Õ>>$=ù;˜:ù8$75Ä2B0ˆ-Ÿ*†'J$å pÜH§ ¦fHþXûŒøýõócñ^ï“íõë‰êJé;èSç’æúåå,åòäÒäÎäÞäå8åwåÍå"æ‡æëæWç»ç(èƒèáè.émé é»éÅé²é‡é<éÔèHè›çËæÓåÀä~ã+âªàßnݲÛëÙØOÖŠÔÒÒ3ѬÏOÎÍ Ì2Ë‘Ê'ÊöÉÿÉ@Ê»ÊlËRÌfͪÎШÑfÓ0Õ'×*ÙEÛqݪßîá@äŒæîè>ë§íøï[ò¯ô÷Uù ûåý$]ºØ÷  éÊ£r=ú³!c# %ª&?(Ð)T+Ô,G.¶/1s2¾35>6k78Ÿ9¢:—;v?†?Ï?ñ?õ?É?u?ò>?>R=:<Û:N9‚7w5>3½0.0+$(ì$‘!û]Â5 ²PæþæûùyöôÐñ¾ïííBìÑê†épè}ç¹ææ™å;åüäÙäÎäÛäøä.ålåºåæqæØæBç¨çèpèÑèéeé“éºéÀéºééOéæèfè½çôææôäÁãlâùàhßÄÝÜEÚvاÖãÔ%ÓƒÑøÏ‘ÎOÍ?ÌY˱Ê7ÊÿÉùÉ4Ê¡ÊGË&Ì-ÍlÎÏÏ[ÑÓÖÔÈÖÃØÞÚÝ9ß‚áÆã ætèÐê,íˆïãñ<ô‘öâø.ûuýµÿï Om ž ­¯­ž‹kHä£^! #¸$W&ñ') +ˆ,ý-n/Ï0.2|3Ä46.7V8f9r:d;J<=Ö={>?p?À?ë?ô?Ò?…??`>…=m<$;9Ü7á5¬3>1ž.À+Â(‹%<"ÊD®uæ c ø«}ÿ~ü¢ùþöô=ò%ðHî•ìëÈé¢è¯çÝæ6æ²åLååàäÎäÚäñä$å_å«åæ]æÇæ(ç™çùçbèºèéQéé°éÁé¹é™éVéé|èáçç4æ.åûã±â@á·ßÞ^ÜœÚÑØ×:Õ{ÓÖÑAÐØÎ‹ÍrÌ„ËÐÊLÊÊùÉ&ÊŠÊ(ËõËüÌ*Î‹Ï Ñ¹Ò~ÔdÖaØwÚ˜ÜÐÞ áWã¬åèZê¹ìïqñÅóöløÀúÿüIÿ~µá" : EMH?)꽊L!º"d$& '3)¹*?,±-(/ˆ0é1=3€4Æ5ò6839;:5;<ñ<²=Y>é>]?¯?ä?ò?×?™?"?‡>®=¨Í>C?¢?Ù?í?â?ž?C?Ÿ>ß=Ú<¦;9:Š8¬6‰452¤/ã,î)Ð&‰#% ¨€ÝOÀ Pô¼©ýÀúøyõó÷ðï>í¬ëJêéè.çzæâåxååòäÔäÖäéäåGåŒåàå9ææçkçÖç6è›èëè<été£éºé»é¦éréé³èèlçŽæ”åuä1ãÑáTàµÞÝIÛ…Ùµ×ëÕ)ÔxÒßÐbÏ ÎÞÌßËË}Ê"ÊüÉÊ_Êëʢ˘̱ÍÏtÐÒÌө՛שÙÃÛôÝ.àtâÄäçpéÎë%î‡ðÜò7õ…÷Ûùügþ¡Ø0P i { €„yjR. ÔœZ "½#b%ÿ&”("*£+"-’.ý/^1µ24G5x6¦7Ä8Ð9Ô:¿;Ÿ®>-?Ž?Î?ê?å?­?T?À>>=ä;:á8 7ù4¨2*0k-…*p',$Ó TÊ3•r ü›]BþOûøôõ–ó^ñdï”íúëêOéCèYçœæÿåŒå1åûäÛäÓäæäå>å~åÒå%æŠæðæTçÃç"è†èÝè*élé˜é·é¼é©é~é0éÈè;èŒç½æÄå®ärãâŸàß`Ý£ÛÜÙØDÖÔÎÒ+Ñ­ÏKÎÍÌ9Ë™Ê1ÊÊÊMÊÐÊ{ËhÌz;Î/оÑzÓIÕ<×?Ù\ۆݿßâO䦿ýèVëµí ðjòÁô÷gù¬û÷ý1l›Åå   óÒ¬{A ·!l#%®&F(Ò)Y+×,J.´/1m2Ã35<6j7Š8œ9Ÿ:’;o?}?À?ç?ã?»?b?ã>'>C=<Ê:29j7`5 3¨0ø-+ (Ó${!ãN±% ©CÿÛþäûùxö ôÎñÇïêíNìÐê“ésè†çÂææ¤å@ååÞä×äÞäå/åuå½åæuæÜæBç¬çèsèËèé]é‘é²éºé¯é„éCéÛèWè±çãæùåáä´ãXâéàWß³ÝúÛ6ÚhØÖØÔ!Ó{ÑøÏ‹ÎVÍ>Ìc˵ÊCÊ ÊÊAʳÊ[Ë5ÌGÍ|ÎçÏoÑ#ÓïÔÚÖÝØïÚÝNß”áàã.æŒèßê?í›ïòñOôŸöôø;û†ý¿ÿ+[{˜ ¬ ¸¹·§”tP ëªd!#º$`&ó'„)+ˆ,.n/Ñ002{3Å46-7T8c9m:a;E<=Ï=q>ü>e?¶?Ü?è?À?z?÷>R>m=Z<;‚9È7Ã5˜3!1„.¨+¦(v%$"³0˜cÚ T î¡yÿwü¡ùøö‚ô?ò(ðKî™ìëÏéªè´çææ=æ»åSååãäÚäÞäùä+åaå´åædæÇæ/ç”çè[è¾è éSé…é­é¹é°ééMéòèrèÐçç$æåêã¡â/á¨ßÞPÜÚÄØöÖ1ÕtÓÐÑ=Ð×ÎŒÍuÌ‹ËÖÊXÊÊÊ4ÊšÊ:ËÌÍ?ΠÏ!ÑÎÒ“Ô|Öw؋ڮÜãÞ$ákã¾åènêÈì&ï~ñÙó,ö€øÊúýRÿÁì/ C STTG3òÆR!¾"k$ &¢':)»*C,¶-(/0ê1:3…4À5ô68-9::.;<ë<©=T>Ü>T?£?Ö?æ?Ç?ˆ??s>›=‘Æ>7?™?È?å?Ë?–?)?’>È=Å<‘;:x8Œ6v42/Ç,Õ)¶&r# ŽfÔ9· B첦ý¹úøxõóýðïGí¯ëSêéè6ç€æîå{å-åôäáäÙäóäåNå”åãåAææ çjç×ç9è•èíè6épéŸé²éµé›éiéé§è è]ç~æ†åbä#ãÀáBà§ÞýÜ;ÛyÙ©×àÕ"ÔoÒÜÐ_Ï ÎàÌãˈÊ,Ê Ê ÊrÊùʸ˨ÌÈÍÏ‹Ð)ÒâÓÀÕ°×½ÙÚÛÞDà‰âØä,ç„éßë;î—ðíòHõ˜÷çù1üqþ²ä9a q ‰ ‰‘uX< á¡` "¿#l%'›($*¨+#-–.ÿ/_1¶24D5z6¤7À8Ï9Í:¿;’¨>$?€?Æ?Ú?Ô?Ÿ?>?²>î=ù<Ñ;d:Ð8ë6ã4Ž20U-h*X'$» >·†íf ï’T<þLû‰øøõ’ódñeïšíþë˜êSéMè^ç¤æ æ’å;ååâäÛäîä åBå‡åÑå1æŠæòæ[ç½ç(èƒèÚè*édé•é¯é´é été$é½è,è€ç¬æ¶åä`ãâŒàùÞOÝ”ÛÐÙØ9ÖvÔÆÒ(ѨÏNÎÍÌBËžÊ>Ê ÊÊ_ÊàÊŽË{ÌŒÍÖÎBÐÕÑÓ`ÕP×XÙpÛÝÔßâd乿ékëÆí ð|òÐô(÷qùÀûþ?{¦Óó ! %+!øà­‰E ¿!p#%³&J(Õ)_+×,N.·/1p2Å3ÿ4A6e7‹8—9›:Ž;i<7=ë=‡> ?m?¸?Ö?×?¨?T?Ì>>)= <®:9O7H530Þ-+ï'½$a!ñfÓ9¢ ›:ö×þÝûùwöôÓñÆïóíOìÚê–é{èçÅæ*æ§åKå åæäàäæäå9åvåÇåæ}æÛæHç©çèqèÉèéYéŒé©é´é¦ézé9éÍèLè¡çÖæèåÒä¤ãDâÝàCß§ÝèÛ)Ú[Ø”ÖÌÔÓwÑòÏŽÎSÍCÌh˾ÊMÊÊÊNÊÆÊjËJÌXÍ“ÎûχÑ6ÓÕíÖôØÛ0ÝeߪáïãJæ—èøêNí­ïò^ô°öùLû’ýÑÿ =d‹£ ¶ ÅÁŬ¡zZ'ñ±l!#Æ$^&ý'‡)+Œ,.o/Õ0/23Ä4ÿ5,7Q8b9g:_;=<=Ç=i>ñ>\?¨?Ñ?×?±?g?æ>=>Y=E<ô:n9ª7°5x3 1f.‘+Š(]% "›…ðUÉ G ä–sÿqüùøö€ô@ò*ðOîžì"ëÔé²è¼çîæCæÃå\ååðäÝäéäþä0åkå³åæcæÍæ.ç™çýç^è»èéNé‚é¤é³é¨é„éDéåèeèÃçÿææ åßãŒâ"á”ß÷Ý@ÜÚ¶ØëÖ&ÕnÓÅÑ>ÐÐÎÍwÌËßÊ_Ê ÊÊFÊ©ÊKËÌ"ÍUγÏ8ÑäÒ©Ô’Ö‹Ø¢ÚÂÜüÞ4á…ãÎå*èêÞì5ï“ñçó@öøÝú ýbÿœÎü; P [b^O> úЖ[!È"m$&¨'<)Ã*B,¼-(/‘0è1=3„4Á5ò68/93:.;<å<¥=G>×>F?™?Ê?Ô?»?r??\>‰=z<8;¼986ê3†1í. ,#)ÿ%³"JÊ:¢ y ø Œ<ý,úy÷ýô®ò“ð©îôìjëêêèêççeæÚåoå'åöäáäçä÷ä*å\å§åûåSæ¸æçƒçêçLè§èùèAéwéŸé°éªééPéùè~èåç&çDæAåäÒâeáçßDÞšÜÕÚÙC×~ÕÁÓÒŠÐÏÏͩ̽ËþÊvÊ+ÊÊ<Ê‘Ê,ËñËðÌÎpÏëÐÒRÔ2Ö*Ø9ÚYÜÞÆàã[å·ç êiìÁîñuóÊõøhú°üòþ-`’°Õ ç ÷ ýúðÝÃv<½ r"$À%Y'í(x*÷+q-ã.D0«1õ2H4€5¹6Ù7ù8þ9þ:ä;½<}=*>¹>1?Š?¿?Ó?Á???{>¶=®<{;:\8w6Y4ý1r/¬,¼)&W#öyëX¼*¨ 3娠ýµúøwõóüðïHí·ëUê%éèAç…æöå…å3ååääåäôä åQåœåçåDæ£æ çpçÖç7è–èéè4émé–é­é®éé_é é—èèKçqæuåRäã¯á/àšÞèÜ2ÛfÙž×ÖÕÔkÒÔÐ_ÏÎåÌåË$ËŽÊ6ÊÊ0Ê‚Ê ËÌ˺ÌÞÍ+Ï¢Ð<ÒüÓÒÕÉ×ÔÙíÛ"ÞUà¢âëä?ç›éîëPî¦ðóVõ©÷÷ù>ü„þ¾ô"Lg ƒ —™ŒcBå«h "É#m% 'œ(**¬+(-™.0b1¶24D5x6£7½8Í9É:¹;Ž>?u?¶?Ð?Ã??.?>Ú=å<¶;R:±8×6Å4v2ó/9-Q*9'þ#Ÿ )Ÿ sÜX à‰I8þCûŠøñõ•ócñkï™í ì•êaéNèiç«ææšåDååêäåäòäåHå‹åÚå0æ‘æôæ\çÁç'è€èÜè#éaé‘é§é®é™éféé®è èqçšæªåˆäTãñá|àèÞ?Ý…ÛÀÙö×-ÖoÔ»Ò$ѤÏKÎÍÌEË«ÊCÊÊ(ÊpÊðʢˎ̣ÍêÎWÐîÑ¢ÓyÕf×mÙ‰Û¯Ýíß-âzäÎæ#é}ëÛí2ðòßô:÷€ùÔû þT„¸Þ  + 24-溌R Ê!q#%µ&R(Ú)b+Ý,O.½/1u2Á35=6h7…8—9˜:‡;g?f?¨?Ì?Æ?˜?D?¸>>=ô;—:957.5ë2s0Â-å*Õ'¡$K!ÕS») ‹0ëÎþØûùsö ôÑñËïõíTìßê›é„è•çÎæ/æ°åTååðäãäðäå=ååÆå#æ}æàæJçªçèoèËèéYé„é¤é­é›ésé*éÂèAèŽçÌæÓåÆäŽã;âÃà:ßÝÞÛÚN؇ÖÂÔÓpÑïÏ‹ÎWÍCÌpËÃÊYÊ Ê$ÊaÊÓÊ€Ë\ÌlͪÎОÑKÓÕ× ÙÛFÝ}ß¾áä]æ®è ëfí»ïòjôÇöù_û¡ýàÿKs—¯ Å ÍÑɽ¤‰_1ú¹r!"#Ç$j&þ'Ž)+, .r/Ù0.2‚3Ã46*7P8_9g:W;:<=Á=_>ê>N?ž?Ã?É?¡?V?Ó>)>D=-<ß:T9’7–5]3ñ0K.u+q(B%ó!ƒpÚD¶ < Ögÿlü˜ùöö‚ô;ò2ðLî§ì%ëÛé¹èÃçöæIæÏå_å&åòäèäíäå5åqåºåælæËæ5ç–çè[è¸èéGéé›é­éžé|é8éÛèVè·çíæ æøäÍã}âáˆßâÝ5ÜoÚ«ØÝÖÕcÓÃÑ7ÐÏΑÍxÌ—ËãÊmÊ(Ê#ÊSÊ»Ê^Ë0Ì5ÍlÎÈÏNÑûÒÀԩ֣طÚÚÜßKá˜ãäå>è“êñìHï¥ñúóOöŸøëú2ýpÿªÝ-G ] foe^C+Õ¡a!Ï"s$&®'A)Ç*G,¿-*/”0é1@3„4Â5ï68'94:%;<Þ<=A>Ë>??Š?¾?Ç?ª?d?î>K>q=f< ;¤9ë7ü5Ë3q1Í. ,)ä%›"1³&‹úi è ƒ/ ýü'úw÷úô¯ò“ð­î÷ìpëêòèðççlæâåxå-åþäéäëäå-åfåªåæVæ¾æç‡çèçMè¤èúè9éwé•é«é é„éDéîèpè×çç5æ0åä¿âXáÑß:ÞƒÜÎÚþØ:×sÕ¸ÓÒ‚ÐÏËÍ¯Ì¾Ë Ë|Ê8ÊÊFÊ©Ê8ËÌÍ-΄ÏÑ¢ÒjÔGÖAØQÚnÜ¡Þßà$ãuåÅç#êwìØî-ñ‡óÜõ+ø{ú¿üÿ=lŸÀÞ ö  ùèÊ©yG Ä y"#$Ä%_'ò(z*ü+u-ã.J0©1ù2F45µ6Û7ó8þ9õ:â;´³>$??±?Ç?®?t??m>œ=<`;ñ9D8]6?4å1U/”,¡)‚&A#ÞbÙ@­˜ ,Ô§•ý´úý÷uõ!óüð ïJí½ë\ê(é&èCç‘æýå‹å?ååíäìäýä%åYåŸåíåHæ§æ çtçÓç;è‘èêè,éléé§é¢ééMéé†èøç;çcæbåCäãá à‡ÞÜÜ ÛYÙ’×ÊÕÔeÒÎÐ]ÏÎçÌêË)Ë–ÊCÊ ÊBÊŽÊ ËÛËÑÌòÍ?ϸÐRÒÔêÕá×åÙ Ü-Þuà°âåTç«éì`î»ðóhõº÷úOü’þË1T{ ˆ Ÿ ¢¡›„nLð¯q ""Ð#r%'¢(/*¯++-›.0c1·24C5y6¡7»8Ê9Ä:µ;Š?k?«?¿?¸?}??Œ>Æ=Ð< ;8:œ8»6¬4\2Ø/ -5* 'å#‡ ˆ÷]ÑE ØzC/þAû„øòõ•óeñlï í ìŸêféUèqç±ææ¤åHååðäëäüäåQååÜå9æŽæüæZçÄç$èèØè"é]é‰é¡é§éé`é é£èèaçæ”å}ä@ããámà×Þ/ÝyÛ°Ùî×ÖiÔ²Ò Ñ¡ÏIÎÍÌM˲ÊPÊ&Ê8ÊÊË·ËŸÌ·ÍÿÎmÐÒ¸ÓÕz׆ٜÛÇÝàBâäâæ6é’ëëíEð òòôI÷”ùÝû#þ\–Âî ) 2 @?5* ïÄ”X Ì!}# %¿&S(á)d+à,T.¼/1t2Â35:6g7ƒ8”9•:;d<$=à=u>÷>\?›?¾?¸?‰?2?¥>ñ=ÿ<Þ;:ë875Ò2X0¨-Ë*º'Š$/!Â9«€ù %áÉþÒû ùrö ôÒñÎïøíZìäê¡é‹èšçÙæ5æ¹å\ååúäêäùäåDå…åÌå(æ}æçæGç±çèrèÅèéQééžé¥é“éhé éµè3èç»æÅå¶ä|ã)âµà&ß…ÝËÛ ÚCØ{Ö»ÔÓnÑéÏŽÎSÍMÌoËÒÊ\Ê2Ê.ÊsÊâÊ”Ëm̂ͽÎ%дÑbÓ3Õ×"Ù2Û_ÝŽßÔáäoæÂèëuíÓï)òôÒö#ùkû²ýïÿ%X€¤º Ò ÖÝÕŰj8Áw!*#Ì$p&(“)+–, .w/Ø022€3Ä4ÿ5*7L8]9b:S;7<=º=W>à>C?”?²?½?‘?B?Å>>2=<Å:A9t75A3Ø01.Z+X(*%Ø!qê^Ç2© - Í‚eÿdü•ùôö€ô?ò3ðQîªì-ëàé¿èËçüæVæÐånå'åÿäíäõäå<åvåÁåæpæÏæ5çœçýç_èµèéFéyé—é¥é•ésé-éÍèLè¥çâæøåèä¿ãhâásß×Ý!ÜfÚ—ØÙÖÕ`Ó»Ñ4ÐÑÎÍÌ—ËïÊtÊ5Ê/ÊbÊÌÊpËBÌIÍÎÜÏfÑÓÕÔÁÖ¶ØÐÚïÜ$ßbá«ãùåPè§êíYï¸ñ ôcö®øúúAý~ÿ¹ê;R i rwtbT-Ü©i!!Ô"{$&²'F)É*N,¿-0/‘0î1=3†4À5ð68'9-:&;<Û<“=9>Ä>0?ƒ?­?»?™?U?Û>8>^=O< ;‰9Õ7á5´3R1·.ì+ï(Í%}"™{å] Ù w&ÿÿúü"úu÷üô­ò—ð²îøìyëê÷èúç#çvæéå€å5ååïäöäå3ålå¯åæ]æ»æ#ç†çìçJè¥èöè7éréé¦é˜éxé@éÚèlèÂç ç#æ"åöã¯âFáÁß+ÞsܾÚòØ0×fÕ´ÓÒ„ÐÏÎͰÌÅË Ë‰ÊAÊ-ÊWʵÊNËÌÍBΘÏѺÒÔ\ÖXØdڇܵÞõà6ãŠåÛç4êŒìéî=ñ›óéõ@ø‡úÑüÿK~¦Òæ   íÖ¯„MË ")$Ê%e'õ(€*ÿ+v-è.L0ª1û2E4‚5´6Ø7ó8÷9÷:×;³¨>?s?¦?¸?Ÿ?b?õ>W>‹=…?`?ž?²?¦?p??{>±=º<‹;!:ƒ8¢6“4@2¾/-* 'È#s øwáL¿6 Ìp;'þ=ûøñõ”óiñmï¦í ì§êié_èxç¹æ"æ©åSååöäõäþä$åUå”åæå7æšæùæ_çÄç%è‚èÓè éWé†éšéŸé„éVéé•èèSçæˆåkä0ãÒá[àÆÞ#ÝeÛ§ÙÞ×Ö^Ô®ÒÑ ÏIÎÍÌS˺Ê[Ê2ÊEÊÊËÊ˰ÌÎÍÏ‚ÐÒÌÓ¨ÕךٳÛÝÝàYâ¡ä÷æIé¦ëüíZð¬òõW÷¤ùîû/þl¢Ñù 2 @ JHB/õÍœ` Ó!‚#'%Ä&X(ä)i+á,X.½/"1t2Å35=6d78’9Ž:;Z<#=Ö=l>ï>N?’?¯?©?z??–>Ú=ì<È;g:Ù8þ65±2D0‰-¶*Ÿ'q$!©(•qæ yÞ½þÏûùoö ôÑñÐïüí^ìéêªéè¦çÝæ>æÁåaå%ååðäååMå‡åÕå(æ‡æåæLç°çèpèÄèéNé{é—éžéŠé_éé¬è"èxç¨æ¸å¥älãâ¤àßtݽÛþÙ5ØrÖ±ÔÓgÑçÏ‹ÎWÍMÌyËÖÊiÊ=Ê:Ê„ÊòʦËÌ–ÍÐÎ<ÐÇÑ{ÓGÕ3×4ÙJÛrݤßéá/äƒæÕè2ë„íéï5ò–ôáö3ù|û¾ýÿÿ2f‹°È Ú äåßи™qA Ń!+#Ö$r& (—)+š, .z/Ù032‚3Ã4þ5*7I8[9]:N;0<û<²=P>Ó>=?„?ª?«?ƒ?3?¯>>=<®:'9_7d5*3¼0.?+@(%Ã!UØHµ%– % ¼€Xÿdüùóö~ôDò0ðZîªì4ëåéÆèÑçç]æÙåså2åå÷äùäå=ååÂåætæÑæ9çšçè]è´èéBéré”é™é“ébé(é½è@è›çÏæëåÙä¬ã\âîàdßÈÝÜWÚØÊÖÕWÓ´Ñ2ÐÌΒ̟̀ËõÊ}ÊBÊ<ÊpÊÞÊ€ËUÌ`ÍÎöÏxÑ%ÓîÔÓÖÏØäÚÝ=ßtáÀãæcèºêíiïÍñôsö¾ø ûQýŒÿÈ÷"E_ u |ƒ{n\6ã±o(!Û"€$$&¸'I)Ð*N,Ä-2/“0ò1;3‰4¾5í68"9,:;<Ó<Ž=2>¸>)?t?¥?ª?Œ?B?Ë>$>K=8<õ:t9»7È5œ371Ÿ.Ð+Ø(°%j"†ügØI Ñ g õÿöüús÷ùô¯òšð³îÿì{ë&êþèè*çæðåŠå<å åùäùäå7åqå·åæcæ¾æ&ç‡çëçKè£èñè8éhéé›é‘éqé0éÖèXè¹çúææåéãžâ4á¶ßÞkܬÚéØ!×]Õ­Ó҃РÏÑͲÌÈËËÊMÊ;ÊdÊÆÊ_Ë)Ì+ÍUήÏ-ÑÑÒ”ÔtÖmØ{Ú›ÜËÞáNãœåïçFêŸìùîSñ¦óöIøœúÛüÿYˆ·Úö   ûÞ¶ŽRÏ ˆ"-$Ò%h'ú(ƒ*,{-é.P0©1ÿ2C4„5±6Ù7ë8ú9í:×;© >?f?™?«?‘?S?á>H>s=s<2;Å98064³1#/^,q)M&#­9­Šû ~ ”‹ý©úù÷sõ!óñïTíÅëiê6é2èSçŸæ æåJååýä÷ä å/åfå©å÷åOæ¯æçvç×ç8è“èáè+é^éˆé–é•éxé;éêèoèÛç çCæFåäââ{áÿßiÞ½ÜÛDÙt×¼ÕúÓZÒÅÐYÏ ÎéÌõË5˪ÊXÊ:Ê\ʲÊ?ËÌöÌÎlÏßЂÒ:ÔÖ ØÚ3Ü^Þ™àÜâ*å{çÓé*ì…îÝð3óŒõ×÷)úkü®þëMnŽ ¦ ° ¹¹©}\1ýÀ~ -"Þ#}%'®(3*¼+--¤.0g1º24D5v67·8Á9À:¦;ƒý>V?Ž?©?”?`?ø>f>=¨«. ½g4þ9ûøðõ•ójñpï©íìªêsédè}çÄæ&æµåYå"ååúä å&å^åšåèå@æ˜æç_çÅç%è€èÒèéRé‚é”é”é~éIéøèŠèùçAçuæpå_äãÁáMà³ÞÝWÛ˜ÙÑ× ÖSÔ¨ÒÑžÏIÎÍ%ÌVËÅÊcÊAÊQÊ¢ÊËßËÃÌãÍ'Ï™Ð.ÒæÓ¸Õ¬×«ÙÍÛðÝ+ànâµä ç\é¸ëîiðÁòõg÷´ùüû?þ{°Þ# ? J UUI=Ò¥h& Ü!‡#-%Ê&\(ê)k+è,X.Ã/ 1w2Å35=6`7‚8Ž9‹:{;U<=Í=f>ã>D?„?¢?™?m? ?†>Å=×<³;Q:½8ë6à4Ÿ2$0u-–*ˆ'X$!•ò[Ý g Ô·þÊûùnö ôÓñÔïÿíbìïê±é”è­çäæGæÈåkå+ååùäå!åSåŽåÙå-æ‰æêæNç®çèhèÉèéMévé‘é•é‚éTé é èègçœæ§å“ä`ãâ˜àßdݯÛðÙ(ØiÖ¤ÔþÒ^ÑèψÎYÍQÌ~ËßÊuÊDÊNÊÊ˶˖̪ÍçÎQÐÞÑÓ^ÕJ×IÙbۅݽßûáGä–æêèDë™íøïJò¥ôñöEù‰ûÏý CršºÕ å ñïèÚ¡{F͈!2#Û$w&(™)"+›,.y/Ý0423Ç4û5*7G8X9Y:L;*<õ<ª=G>Ê>2?x??œ?s?!?ž>î==í;˜:9G7J53£0ý-&+%(ö$­!>Â4¡Š  ¸pVÿXü‘ùìö‚ôAò5ð\î°ì8ëëéÎè×ç çeæßå~å7å åþäååGåƒåÉåæwæÖæ;çœçè\è²èé<épé‰é˜é„é_éé´è1èçÀæÛåÈä›ãMâÛàVß¶ÝÜHڂؽÖþÔNÓ°Ñ,ÐÎỊ̂͆ËüʈÊLÊJÊÊðÊËjÌrͨΠÐÑ:ÓÕéÖæØ÷ÚÝNß‹áÕã"æxèÎê&íïØñ0ô~öÓøû_ýœÿÓ/Rk € Š‹‰vfA!ê¹x.!ä"„$)&½'N)Ó*T,Ä-7/•0ð1B3ƒ4Á5ë68#9':;þ;Í<…=*>®>!?f?˜?›?z?6?²>>/=)<Ø:`9ž7²5€31„.µ+¾(–%R"ínèTÄ; Á \íÿñüúr÷øô°òð´îíë)êéè6çƒæùå’åCåååþäå=åxå¼å æfæÄæ%çŒçéçMèŸèóè/éhéƒé–é‡éié#éÌèIè­çêææÿäØãâ$á£ßÞXÜ ÚØØ×VÕŸÓÒuÐÏÍͶÌÏËËœÊUÊJÊtÊ×ÊpË>Ì<ÍlÎÄÏCÑéҨԎրؔگÜäÞáfã­åèWê¶ì ïfñ»ó ö^ø¦úðü,ÿfšÂê  . çÀ–["Ú Š"7$Ô%o')„* ,y-ð.N0¯1û2H4~5´6Ô7í8ó9ë:Ñ;£˜>?[??›?‚?C?Í>5>`=Y<";¥9ý76ñ3–1/E,Q);&ñ"›šwê p ¸‹…ý¤ú÷÷rõ"óñïUíÍëlê>é7è]ç¤ææ¢åVåååÿäå8åjå±å÷åYæ¬æçsçÛç6è“èàè%é\é~é“é‰éqé0éÞèdèËçç1æ6åäÎânáêß]Þ¨ÜùÚ.Ùo׬ÕôÓQÒÂÐSÏ ÎêÌûË;Ë´Ê`ÊKÊhÊÂÊQËÌ Í.΂ÏõЙÒOÔ/Ö!Ø)ÚLÜqÞ±àïâAåçéé;ìšîïðHóšõì÷5úü¾þ÷-W~› ± ½ ÅÀ¹¢‰e8ȃ 9"à#…%'³(9*½+4-¤. 0h1¼24E5t6ž7³8À9¹:¥;x<==æ=z>ó>H?„?™?‡?P?å>T>Š=Ž<`;ï9T8o6a4 2/Í,é)Ô&›#> ÑF¾' ­`(þ7ûxøðõ”ójñtï­íì³êuénè‚çÌæ.æ»åaå*åååå1åaå¡åìåCæžæçaçÆç$è€èÐèéOézééŽété>éîè{èìç6çaæfåLä ã³á9à¨ÞÝMÛ‡ÙÊ×þÕMÔŸÒÑšÏJÎÍ(Ì^ËÎÊnÊMÊ`ʰÊ4ËìËÚÌóÍ@Ï«ÐGÒùÓÔÕ¼×ÊÙÜÛ Þ>àƒâÊäçpéÍë î~ðÒò'õx÷Åù üNþŠ»ð6 E [ \bQH& ܬq+ ä!Œ#4%Í&c(ë)s+æ,a.¿/(1t2È35<6_78†9:q;S<=Æ=]>Ú>:?u?™?ˆ?^?ú>p>´=À<;9:§8Ï6Ê42 0X-}*p'<$ê zûlÝMË \ɰþÆûùmö ôÑñØïîeì÷ê²é¡è°çíæNæÎåuå2ååå å(åZå‘åàå0æ‹æïæLç´çèpèÀè éGéoéé‹é{éIéþè“è èZçŒæ˜å…äLãøáƒàøÞTÝ ÛâÙØ[ÖŸÔòÒ\ÑáÏŠÎXÍWÌ‚ËèÊ~ÊRÊZÊŸÊËÉ˩̽ÍýÎdÐóѧÓsÕa×_ÙwÛÝÑßâZ䩿éSë²íðbò±ô÷RùšûàýS~©Èà ñ üø÷ÞϨ…NÓŽ!9#á$}&(Ÿ)$+¡,.~/Ý072‚3Æ4û5(7F8U9W:F;%<ï<¡=A>À>'?l?Ž?Ž?e? ?>×=ó<Õ;ƒ:ó837*5ü2‚0è- + (Ý$‘!)© Žz  ¨iLÿTü‹ùìö~ôCò6ð_î´ì=ëñéÔèÞççkæèå†å>ååå å!åQå…åÑå!æxæÝæ9ç¢çþç]è°èýè9éké„éé}éUéé©è$è}ç·æÇå½ä‰ã=âËàGߥÝöÛ:ÚtØ´ÖôÔGÓ©Ñ*ÐËΓ͇̩ËËÊ\ÊSÊ’ÊýʤË}̃ÍÁÎШÑNÓÕýÖÿØ Û6Ý`ߥáåã;æˆèâê:í“ïêñ@ô’öàø)ûmý«ÿã;_x ‹ ”˜ƒmL'ö¿€6!ç"$.&Ã'S)Ø*U,Ì-4/š0ó1>3‰4¾5ì689(:;ý;Ä<€= >§>?`?†?‘?k?"?¥>þ= =<É:@9Ž7‘5k31k.›+¤(|%;"Ò\ÏD°, ³ P åÿèüúp÷õô³ò›ð¸î í„ë1ê é è;çæÿå˜åLåå åååEå{åÁåæhæÈæ(çŒçìçKèžèñè+ébéé‹é„éZéé¼è?è çÛæûåìäËãzâá‘ßøÝJÜÚÎØ×MÕ—ÓûÑrÐ ÏÐÍ·ÌÕË˧Ê_ÊWÊ€ÊèÊ‚ËQÌQÍ~ÎÛÏVÑÓ½Ô¤Ö–Ø©ÚÆÜøÞ/ázãÄåèoêÂì ïvñÊó"ölø¹úýü;ÿt§Ñó # 04." ñÈžd*ß ”"9$Ý%t')Ž* ,-î.U0¬13C4ƒ5°6Ô7ê8ï9è:Ë;ž<\=þ=>ü>P?€?Ž?t?0?Á>>O=D<;“9ß7û5Ö3~1ì.,,8)&ß"| €ödÚ a ÷±€ýžúó÷põ#óñïZíÏëtêBé?èbç­ææªå]å#åååå<åså´åæYæ±æçuçÝç5è’èÞè"éXézéŒéƒéeé'éÒèXè½çç!æ(åýãÂâXáâßDÞ¡ÜäÚ'Ù`× ÕîÓFÒÂÐNÏÎéÌÌ>˾ÊjÊWÊyÊÐÊdË%ÌÍCΕÏѬÒfÔGÖ3ØEÚZÜÞÁà ãQå¦ç÷éUì§îñXó«õý÷DúŽüÊþ9fЍ º Ì Î̬“mA Òˆ A"ä#Ž%!'¸(>*À+9-¥.0k1»24B5t67²8¼9¹:›;x<5=à=r>å>A?u??x?=?Ù>;>{=w U c li_P1ã¶u7 ç!•#9%Ó&h(ò)s+ï,_.Æ/'1w2È35;6_7|8‡9†:p;L< =À=S>Ð>/?k?ˆ?{?M?è>`>=­<…;$:‰8½6©4o2ë/B-a*T'($Ì iàZÈ=½ L÷À¨þÁûúølöô×ñÕïîhìûêºé£è¹çôæSæÚåyå;åååå.å^å˜ååå4æ’æîæQç³çèmè¿èéBélé„é†éqé@éóè‡èûçMç|æ‰åtä>ãäáuàåÞFÝ’ÛÒÙØLÖšÔéÒWÑßφÎ]ÍVÌŒËëÊ‹Ê\ÊjʬÊ*ËÙ˾ÌÐÍÏyÐ Ò¸ÓŽÕs×wÙÛ²Ýèß%âp伿éfëÃíðpòÅô÷cù«ûíý)_µÕí þ  ûïÔ´ŒX ß‘!C#ä$…&(¤)(+¤,.€/á052†3Ã4þ5%7E8Q9U:A; <ç<œ=5>º>?`?ƒ?~?T?þ>{>Ã=à<½;m:Ü875Þ2l0É-ò*ñ'Å$x!“ {ðj ú^EÿNü†ùìö|ôDò9ð_î¼ì?ëøéÙèçççtæðå‹åHåå åå)åSååÓå%ææÜæ?çŸçèZè°èùè6éeéé‡éuéIééœèèpç¥æºå©ä}ã'â¿à1ß˜ÝæÛ+ÚjØ¥ÖîÔ;Ó§Ñ$ÐÉÎ“Í‹Ì¯Ë Ë˜ÊgÊbÊ Ê˵ËÌšÍÐÎ8иÑjÓ.Õ×Ù#ÛIÝyßµáäJæ èôêOí¢ïÿñOô¥öîø<ûyý¾ÿï!Kkƒ š ž¢ŒvX.ÿLJž>?Q?}?~?^??”>ë= =ù;®:.9o7~5L3ë0M.ƒ+ˆ(f%"½C¿,£ ¦ EÞÿáüúk÷÷ô°òŸð»î í‰ë8êéè@ç”æ æžåUå#ååå$åLååÇåælæÍæ'ç‘çêçKèžèëè,éZé}é„éyéTéé²è3èçÎæéåßä·ãjâáßèÝ<Ü€ÚÃØýÖAÕ‘ÓóÑpÐ ÏÍͼÌÚË&Ë´ÊhÊhÊÊúÊ“ËeÌdÍ–ÎëÏrÑÓ×Ô¹Ö­ØÁÚØÜßCáã×å,èê×ì3ï…ñàó.ö~øÊú ýMÿƒ²âü / 9B40ùÔ£o.è ™"@$â%w' )Œ*,-õ.R0²1ÿ2F4‚5¯6Ò7è8ë9å:Ç;—õ>B?t??c? ?®> ><=,<ô:x9Ë7Þ5¿3a1Õ.,!)&Ç"fónáSË R í¤{výŸúì÷tõóñï_íÖëvêMéDèjç·æ æ·å`å-åå å%å?å|å´å æWæ»æç{çÚç6èèÚè éPéwé‚é~éYé!éÃèMè±çôææåòã®âIáÑß6ÞÜØÚÙW×—ÕæÓ@Ò¾ÐLÏÎîÌÌJËÂÊ{Ê`ÊŠÊàÊuË9Ì3ÍWÎ¬Ï ÑÄÒ|Ô\ÖLØVÚvÜÞÛàãfåºç êeì½îñjó½õ øYú˜üÝþHr—´ Ç Õ ÜÑѲžuI×’ D"î#%*'¸(F*À+=-©.0k1¾24B5t6š7­8½9¯:œ;n<,=Ú=e>ß>3?j?~?i?-?Å>*>e=`<4;Á9!8?6+4Û1R/ ,°)¤&h# £“z “Lþ+ûrøíõ”ólñzï²í"ì»ê…éwè•ç׿?æÊåpå9åååå:åoå«åøåJæ¦æçfçÉç!è‚èÉèéGéoééé_é-éÖèeèÎççBæHå,äíâ‘áà‡ÞãÜ/ÛpÙ­×ïÕ8Ô•ÒÑ”ÏJÎ$Í0ÌkËÝʆÊdÊÊÍÊVËÌÿÌÎgÏØÐpÒ(ÔûÕï×îÙ Ü/Þnà¨â÷äDç™éðëIîžðöòGõ›÷ãù+üjþ¦Û-I a n vrjW;í¼~= ì!#<%Ù&m(ô)z+ï,b.È/)1y2Ç35:6]7{8‚9ƒ:j;F<=¶=L>Å>#?`?x?p?8?Ù>L>Š=˜¬>?S?u?q?C?î>g>²=É<©;T:Æ8þ6ý4Å2Q0³-Ö*Û'ª$f!øùgäY ð’W?ÿJüƒùêö|ôGò9ðgî½ìGëÿéàèíç"ç{æøå“åOå$ååå.å\å‘åÜå'æ„æÝæCççèVè²èôè3é_é{é~éméAéøè‘è è`ç™æ¨åähãâ«à&ß…ÝÛÛÚaØ™ÖåÔ7ÓžÑ#ÐÊΔÍÌ·Ë˦ÊpÊpÊ¯Ê ËÅ˥̫ÍèÎIÐÏÑ~ÓDÕ.×%Ù<Û\ÝßÎáäaæ±èëaí¶ï òbô³öùHûŒýÅÿ+Xu’   ¬¬¤˜}`6ÍŽC!õ"–$:&Ê'^)Ý*_,Í->/›0ô1D3‚4Ä5ä6 89:;ì;»”>ü>H?l?t?J??€>Ø=õ<ä;˜:9Y7b583Ë09.f+p(N%"¦/§ — :ùÖÿÞü új÷÷ô²ò¡ð¾îí‹ëAêéèJç™ææ§å[å.ååå+åRå‡åÎåæuæÊæ.çŽçîçIèèçè)éTéyézéuéFé é£è(èçÂæÖåÔä¤ã\âöàoßÛÝ,ÜrÚ¸ØïÖ<Õ…ÓñÑjÐ ÏÍÍÀÌÞË0˹ÊwÊrÊžÊ Ë£ËxÌyÍ©ÎЃÑ+ÓëÔÏÖÃØÕÚñÜ#ßZá£ãìå?è•êéìDï™ñîóAöŒøÙúýZÿ’¿î ) ; FIB6 Ý«u6î ž"I$å%~' )”*,‡-õ.U0³13E4ƒ5©6Ö7ß8ì9Ü:Á;“è>9?d?t?R??š>ù=%=<Ý:_9´7Ä5¦3H1º.ö+)ì%¬"QÜ[ÍC» F á›rrý˜úí÷põ"óñïbíÛë~êQéMèpç¿æ(æ¿åeå:ååå#åMå{å¿å æ^æ¼æçyçÞç5èèÛèéPéoé{éwéOéé¸è?è¥çæææåãã›â=á½ß)ÞÜÉÚÙI×ÕÛÓ>Ò¶ÐNÏ ÎôÌÌTËÍÊ‚ÊrÊ“ÊòʇËKÌFÍlξÏ:ÑÖÒ”ÔpÖbØoچܸÞëà0ã~åÇç"êwìÌî)ñwóÎõøeú©üìþZ{¦½ Õ à äßÖ½§|RÝš I"ô#•%.'¿(G*Ç+?-«.0m1¾24B5s6—7­8µ9®:”;h<'=Ï=^>Ò>(?]?o?Y??°>>L=Q<;°98,6 4Ã1;/,ž)…&T#øŒ óoï =þ'ûnøðõósñyï¹í'ìÁê‹é€èœçÞæGæÓåwåBååå#åBåtå°åýåLæ«æçfçÌç!è~èÊèéFégé|ésé[é!éÊè\è¿çç2æ8åäÛâ„áà{ÞÑÜ#Û`Ù¤×ãÕ0ÔŽÒÑ“ÏKÎ#Í9ÌnËèÊÊpÊÊÙÊlË ÌÍ0Î}ÏîЄÒ?ÔÖØÚÜJÞà¿â åWç®éì^î¬ð óUõ¬÷òù;üyþµæ8W j } ~~s^H ÷Â…D ò!£#A%ß&p(ù)|+õ,a.Ï/$12Ã3546_7u8€9~:d;B<ý<³==>½>?R?o?\?+?Æ>:>u=„ÖƒÔßÒLÑÚφÎ_ÍbÌ•ËËœÊyʃÊÏÊHËÌàÌüÍ:Ï¥Ð7ÒèÓ´Õ¥× Ù¹ÛÝÝàPâ˜ääæ;éëçí>ð‘òèô5÷ùËû þE{¦Ðì  åÇšj-ìž!P#ï$Ž& (®)/+«,.ƒ/ä082…3Å4ú5"7@8K9M:6;<Ø<=!>§>?K?c?g?/?Þ>T>ž=´<“;=:­8å6ä4©290–-½*À'”$H!æiåWÎP Þ‹K7ÿGü~ùéö}ôFò?ðiîÃìMëêçèõç)ç‚ææšåYå(ååå9å_å™åÞå.æ…æãæ@ç¤çÿçYè¯èñè1éYéséwéeé5éïè„èýçTçŠæ™åŽäWã âàßyÝÉÛÚQØ“ÖÙÔ0Ó›Ñ"ÐÇΗ̼͑ËË®Ê|ʀʾÊ0ËÚË·ÌÁÍüÎ^ÐåÑ•ÓZÕB×=ÙRÛoݧßÛá+äoæÈèëríÉïòqôÄöùXûšýÖÿ <b…š ¯ ³»«¤„k;Ô“M!õ"£$9&Ó'`)á*c,Ð-?/œ0ø1?3Š4¸5ì689:;í;¯ˆ>õ>8?c?a?>?ì>r>Á=ä<Ê;„:ú8D7E53´0.S+S(7%ï!• €þ Œ /ïÑÿØü úi÷ôô·ò ðÄîí”ëEêé%èNç¦ææ±åaå7åå"å-å\å‹åÓåæuæÏæ/ççíçHèèäè%éPérétéjé>éþè™èètç³æÊå¿ä™ãJâæàaßÊÝÜiÚ¦ØëÖ.ÕƒÓèÑiÐ ÏÐÍÃÌãË9ËÀʆÊ|ʰÊ˵ˋ̋;ÎЗÑ@ÓÕäÖÙØêÚÝ8ßoá´ãæPè¨êûìUïªñÿóPöøåú*ýgÿÏö3 H MVJC$ áµ|=ô ¥"L$ê%ƒ')˜*,Š-õ.Z0±13D45«6Ð7ß8ç9×:¿;ˆÚ>/?W?d?E?ý>Š>å==<Æ:H9›7­5‹321.à+ë(Ö%”"<ÇE¿-³ 5 Ø’jný“úí÷mõ&óñ"ïfíáëƒêYéRè{çÂæ5æÂårå>ååå+åRå‚åÃåæcæ¾æç}çÙç8èŠèØèéHéjéuénéGé é®è2è™çÖæûåóäÔãŽâ*á²ßÞuܽÚþØCׂըÓ6Ò´ÐLÏ ÎøÌ ÌYË×ÊÊ~ʤÊ˘Ë_ÌWÍ‚ÎÑÏNÑíÒ¨Ô‡Öv؄ڜÜËÞÿàEãŽåÝç3êˆìáî6ñŠóÝõ*øuú¹üöþ2^­Ì Þ é ïêÞÉ«ˆW%äž P"ú#˜%5'¿(N*Ç+B-­.0n1¿24?5s6”7ª8´9¦:‘;a< =É=S>É>?Q?b?J? ?¡>>;=9<;–9ð76÷3ª1/n,)q&;#ázórà`ä €5 þ&ûmøíõ•órñ€ï¼í+ìÉêé‡è£çåæRæÖå„åGå%åå)åJåxå¸åæRæ®æçmçÇç&è{èÇè é>édétéméQééÀèMè³çç$æ(åäÌâráúßfÞÉÜÛYÙ•×ÝÕ'Ô‰ÒûГÏGÎ,Í7ÌzËðʙʀʙÊïÊxË7Ì'ÍFÎÏÑ›ÒSÔ(ÖØÚ6ÜZÞ—àÐâ åiçÁéìnîÁðójõ·÷úIü‡þÂó Fa x ƒ Šˆ{jL*þÉI ù!¨#F%ä&r(ÿ)|+ø,e.Ì/*1{2Å3566[7r8~9w:b;9<÷<©=7>±>?A?c?M??·>$>c=oà¼ÞÝjÛ­Ùí×2Ö{ÔÛÒGÑØÏ‡ÎbÍeÌŸËˬʀʔÊÜÊ[ËÌ÷Ì ÎPϹÐLÒûÓÍÕ´×»ÙÉÛõÝ"àfâªäúæJé¢ëõíPð¢ò÷ôD÷‘ù×ûþS‡²Ýõ  &# íÏ¢n7ð¦!R#ö$’&%(°)3+¬,.ˆ/â0;2ƒ3Ã4ú57>8H9F:4; <Ô<„=>œ>÷>D>ˆ= <|;(:”8Î6Ë4‘2 0|-§*¥'$1!ÑTÒFÀA Ó€F1ÿCü|ùêö|ôJòAðmîÉìRë êðèúç4çˆæ æ¡å`å3å"å%å>åfå åâå3æˆæçæBç¤çèYè«èðè)éWéléqéZé-éâèzèîçHçxæŽåzäIãüáŠàßgݽÛÚDØŠÖÏÔ*Ó–ÑÐÉΗ͖ÌÂË"˻ʆʑÊÊÊBËëËÉÌ×ÍÏtÐüѦÓuÕT×VÙdۇݹßóá:䇿Öè0ë€íÜï.ò„ôÒö ùdûªýâÿDs‹ª ¶ ÁÀ¹§‘pFןM!#¢$C&Õ'c)è*`,×-=/¢0ò1H3€4¿5ã689:;â;«â>1?Q?U?-?Ü>\>°=Î<¶;l:ã8+7/530.7+=(%Ø!{ƒ÷qï $éÆÿÙüúj÷óô¹ò¤ðÉîí›ëIê'é+èVç°ææ¾åfåAå!å(å4åaå’å×å#æxæÓæ0ç“çìçJè˜èäèéMéhépé_é7éðèè ègç¤æºå²ä†ã=âÔàRß»ÝÜ[Ú›ØßÖ%Õ|ÓäÑeÐ ÏÓÍÅÌìË=ËÏÊʌʾÊ*ËÇËŸÌÍÔÎ*бÑTÓÕúÖðØþÚÝH߆áÊãæhè¶êícï½ñ ôcöªø÷ú7ýuÿ¬Ù#A P []VG4ï·‡?þ ©"Q$ð%‡')*,Œ-ø.Z0²13C4€5©6Í7Ü8ã9Ó:µ;†<:=á=e>Ð>#?J?T?6?ì>w>Ó=ú<ð;¬:49€7—5o31….Å+Ô(»%}"$±3ª   + Ê‹bjýúé÷põ$ó ñ#ïníäëê[é^è~çÏæ9æËå{åEå(å%å3åXåˆåÊåæhæÁæççÛç6è‹èÔèéBéfékégé<éé è(è‡çÍææåèäÀã€âáŸß ÞbܱÚñØ7×zÕÐÓ0Ò°ÐLÏ ÎûÌÌbËßʛʊʲÊ˨ËqÌmÍ”ÎéÏbÑÓ¾ÔžÖ‹ØšÚ²ÜßÞáWã¢åòçFê™ìõîDñ óêõ=ø‚úÊüÿ=o™»× è ÷ øôçÓ²‘_)ï¡ Z"û# %8'Å(Q*Ë+C-°.0m1Ã2ÿ3F5k6“7¨8¬9¦:ˆ;[<=¾=K>½>?A?U?:?ý>>õ=$='<í:9×7÷5Þ3Ž1 /N,k)W&"#Î^äZÓMÛ q/þýý ûkøìõ–ósñ„ï¿í2ìÍê—éè§çóæSæåå†åQå-å%å1åRåzåÃåþå]æ«æ çlçÈç$è{èÅèé:é^ékéiéEééµè>è©çóææåøãÀâbáêßYÞ¹ÜÛMÙ‹×ÑÕ"ÔÒûÐÏJÎ+Í@Ì€ËùʥʌʩÊþÊ‹ËGÌ<ÍXΧÏѯÒkÔ:Ö0Ø0ÚLÜqÞ©àæâ1å€çÑé(ì|îÓð)óxõÊ÷úWü—þÌ)Uj „ –ˆpW2ЕM "«#L%è&w(*€+û,f.Ï/*1|2Ç3546Y7o8|9q:];1<ó<œ=1>¤>?7?Q?@??¨> >S=V<,;Ê9*8V6L42Œ/Ø,ü)ô&Ã#v ‘ƒ† Ï¡“þ­ûóøgö ôÞñãïî~ìëÔéÁè×ççtæøåšåZå4å&å.åJåuå²åôåIæœæûæYç·çèiè·èûè2éTénéeéOééÅèZèÄçç?æOå2äã¤á4à¨ÞÝ[Û Ùâ×)ÖsÔÓÒEÑÔÏŠÎaÍl̤Ë˵ÊÊ£ÊíÊkË%ÌÍ%ÎaÏÒÐ_ÒÔâÕÍ×ËÙäÛÞ7à}â¹äç\é³ë î^ð·òõY÷ùéû$þc‘Ää  * 0.$úÓ¬u=ø¬!W#ý$•&*(µ)3+²,.ˆ/æ0:2ƒ3Å4ô5#758H9@:/;<Ë<}=>>î>-?L?E??¸>2>r=/¤0ô1E3„4¹5å6ÿ79 :;Ú;¥Û>!?G?D??Ë>I>ž=·<¢;V:Ê875ê2‚0æ- +"(%À!cðnæ^á t ÞÂÿÏüúd÷øô´ò¬ðÈî!ížëPê.é.èdç±æ*æ¾åtåBå-å,å=åhå–åÞå$ææÓæ7ççñçGè—èâèéKé`éiéWé,éèèƒèþç\ç“æ¬å£ävã-âÄàBß«ÝÜIÚ”ØÐÖÕvÓÜÑdÐÏÓÍÉÌñËFËÖʞʗÊÐÊ8ËÜˮ̶ÍåÎBÐÄÑjÓ.Õ×ÙÛ3Ý_ßšáÞã'æxèÍê ízïÌñ ôoöÀøûKýÿ¼æ/N Z gfbN>ö‹I!®"Y$ó%')¢*,’-ù.[0³13E4}5ª6Ç7Ü8Û9Ò:®;<4=Ö=]>Ç>?=?H?$?Ý>f>½=ç<Ù;–:9i7z5Z3û0m.ª+½(ž%k"¢› “  Å~_býŽúæ÷põ&óñ*ïoíêë“êbédèˆçÓæDæÒå‚åMå.å.å8å_ååÏåæiæÇæç‚çÛç5èŒèÏèé?é\éjéYé7éôè˜èèzç¼æÛåÕäµãjâ áŽßûÝVÜ ÚèØ)×sÕÅÓ-ÒªÐMÏ ÎýÌÌhËêʦʗÊÃÊ"˻˄̀ͩÎþÏxÑÓÕԱ֥جÚÊÜóÞ+ánã´åèUê¯ìïWñ°óúõKø”úÕüÿI¢Ëà õ îÞº™g3ò­ Y"$¡%?'Ê(R*Ð+F-±.0n1Â24B5k6”7 8®9œ:‡;T<=¶=A>³>?3?H?'?ð>z>á==<×:g9¿7Ý5È3p1ó.0,S)=& #·GÒCÆ;Ì i!ûöýûløèõ™ósñ‰ïÃí9ìÒê é“è³ç÷æ^æêååWå5å-å7åWåƒåÄåæ]æ²æçnçÉç$èyèÃèé5éYéeé_é=ééªè2èœçàæ æåîã«âSáÙßLÞ¨ÜöÚ>Ù×ÉÕÔ{ÒøÐŒÏKÎ0ÍC̈ËË¯Ê™Ê¹Ê Ë ËVÌSÍkλÏ/ÑÄÒÔUÖAØKÚ]ÜŠÞ¼àýâGåçéé8ì‘îåð8ó‹õØ÷"úfü¤þÝ:]z Ž š ž}]; Ø›U "³#P%î&{(*…+ü,k.Ð/+1~2Æ3ÿ446U7p8t9r:Q;1<æ<˜=$>>ô>-?A?2?÷>”>þ=<=C<;±98B6+4î1j/Â,â)Ú&ª#_ ó€÷rðv Æ•Žþ¨ûñøgö ôáñæïî„ìëÛéÈèÝçç|æþå¤å_å?å+å8åNå|åµåúåLæ æþæZç·çègè¶è÷è-éQédé_éEé é¾èIè¼çç5æ;å%äîâ”á&à˜ÞûÜKÛ’ÙÙ×ÖoÔÇÒDÑÑÏŠÎcÍp̪ËËÀʙʲÊúÊ€Ë3Ì Í3Î{ÏäÐvÒ(ÔøÕâ×ãÙùÛÞOàâÓä çséÄëîoðÈòõh÷®ù÷û3þp¢Îó ( 2 ;8,üã®Cýµ![#%œ&,(»)6+´, .Š/ç0;2„3Â4÷5758D9;:,;þ;È€>è>?C?1??§>>e=rùƒûÇýÿÿ4bˆ§À Í ×ÔÌ»£€W&ç¬Y!#¬$M&Ý'l)ï*f,Ý-@/¤0÷1C3…4¸5ã6þ79 :ý:Ó;¡Ó>?:?5??¹>:>†=£<;9:»8ó65Î2i0Î-+ (ï$§!P×\ÓPÓ e ÑÂÿÆüúb÷öô¹ò«ðÎî%í¢ë\ê.é>èeç»æ2æÅå}åJå5å1åHåiå¡åßå-æ}æÚæ6ç”çïçDè™èÜèé@é^é`éOé&éÖè}èíçQçƒæŸåäiãâ·à1ßžÝòÛ@Ú„ØÉÖÕkÓÜÑ^Ð ÏÔÍÎÌöËPËáʨʧÊÝÊKËíËÂÌÈÍûÎWÐÚÑ€ÓDÕ$×Ù(ÛJÝsß°áðã>æŠèáê3í‰ïÞñ1ô€öÍøûUý‘ÿÈó :[ b ulnYC%øÍU!»"X$ý%Ž')¡*,‘-ü.\0¶1ÿ2H4w5­6Ã7Ø8Ù9Ê:«;w<,=Ï=Q>¾>?4?5??È>S>«=Ñ<Ã;‚:9Q7c5=3å0P.•+(%K"ù… ‚  ´yV]ý‹úç÷mõ+óñ-ïuíðë™êkékèçÝæJæÜåŠåRå;å0åEåaå–åÒåænæÈæ"ççÞç3è‰èÏè é<éWé_éUé*éêèè èrç©æÐåÃä¥ã[âüàßëÝHÜ“ÚÛØ×hÕÀÓ%Ò«ÐHÏÎþÌÌoËõʰʦÊÐÊ4ËÍ˕̗ͻÎÐÑ-ÓíÔÆÖºØÄÚÜÜ ß=á„ãÇåèjêÁìïkñ»óöWø¤úäü#ÿXбÕí  øç¢m<ö´ b"$ª%?'Ð(T*Ô+G-µ.0r1¿24=5m6Œ7¤8¤9œ:~;L< =«=9>§>÷>,?4??Û>i>Î=ü<ú;¾:R9¦7Å5¬3Y1Õ.,7)$&ô"ž5»4²/Á [òñýûhøêõ˜óyñŠïÉí>ì×ê¨é˜è¼çþæhæðåšå]å>å3å>å^åŠåÉå æaæ´æçmçÍç"èxèÂèÿè4éPé`éVé4éøèŸè%èçÔæ÷åýäÚãžâBáÉß;ÞœÜãÚ7Ùr×ÀÕÔuÒòÐÏHÎ7ÍDÌ‘Ë Ë»Ê§ÊÆÊ˯ËlÌdÍÎÑÏDÑÛÒ•ÔhÖ[Ø]ÚvÜœÞÒàãYå¤çúéJì¤îöðJó›õè÷1úvü²þìIgˆ — ¦ ¨§–ˆbGâ \ "¸#T%ô&}( *†+ÿ,o.Ï/.1|2Æ3ÿ436R7m8p9l:O;&<å<Š=!>>ì>?5? ?è>>ë=(=+<;™9ú7'64Ò1R/ª,Å)Å&#H áiçaàj ¼…þ§ûìøgö ôãñéï îŠìëåéËèéç!ç…ææ©ålåAå9å8åZååºåæMæ§æþæ\ç¹çègè´èòè*éJé_éVé=éé±è?è©çýæ!æ/åäßâ…áà‹ÞêÜ>ÛˆÙË×ÖgÔÁÒAÑÍÏŒÎdÍxÌ­Ë&ËÈÊªÊ¾Ê Ë‘ËFÌ3ÍIÎŽÏûЋÒ?Ô Öû×öÙÜ/Þfà âéä1ç‡é×ë1îð×ò)õt÷ÂùüFþz²Ø 5 < H@9%纅L »!a#%¡&1(¼)>+³,'.Š/è0<2ƒ3Â4ö5778;9<: ;þ;»y>Ø>?/?&?ó>”> >L=`<;;à9N8‚64D2Ó/.-[*X'7$ê Ž— ±_/ÿ5ütùåö}ôPòHð|îÔìgëêéèHç¤ææ¼åxåGå<å8åSåxå°åóå@æ’æñæFç«çþçXè£èèèéEéZéYéAééÃèRèÌççOæ]åNäãÌáZàÙÞ<Ý‘ÛÝÙ ØkÖ¸ÔÓ‰ÑÐÇΟ͡Ì×Ë<ËÚʫʼÊùÊwË"ÌÍÎK϶Ð;Òêӵ՗ט٤ÛÇÝøß1âwäÄæéhë¸íðdòµô÷Nù“ûÕýCn•³Ê Ú ßß×®†`-ð®d!#´$Q&á'p)ñ*i,Þ-B/¦0õ1E3‚4¸5á6û7 9:ó:Ò;–Ç>?,?%?ÿ>¦>'>s=Æ Y Ì·ÿÄüþùb÷öô»ò¬ðÖî%í¯ëZê=é=èsçÀæ<æÌå…åQå<å;åKåså£åæå1æ€æßæ6ç•çðçBèšèÖèé<éWéYéHééÒèkèäçAçvæå…äUãâ£à#ßÝåÛ2ÚyؽÖÕdÓ×Ñ]ÐÏ×ÍÑÌüËZËéʶʴÊíÊ\ËÿËÖÌÝÍÏmÐðÑ—ÓYÕ;×0ÙAÛ\Ý‹ßÁá äLæ£èïêHí™ïóñ>ô•öÙø$ûeýÿÖ+Jb s {|sfJ.Ô—Y !¼"a$&‘'&)Ÿ*&,’-þ.^0´13D4|5¤6Å7Ô8Õ9Æ:¤;o<(=À=M>­>ÿ>!?)??¹>@>˜=¹<²;d:ð837M5#3É08.w+ˆ(r%6"ßrösðq  ªnPWýˆúä÷oõ)óñ0ïyí÷ëêsérè–çææQæååå^å>å;åIåiåœåÙå!æræÍæ"ç‡çÚç7è„èÏèé7éRéVéOééâè~èè_ç¡æ¸å½äãRâçàqßÝÝ7܈ÚÍØ×aÕ¶Ó#Ò£ÐJÏÎÍ$ÌuËþʾʱÊâÊCËÞ˫̨ÍÓÎ(УÑEÓÕßÖÎØÚÚôÜßUá–ãÝå/è}êÔì(ï{ñÐóöiø´úñü4ÿe—ÀÞü íϦy?º e"$«%H'Ñ(Y*Ø+J-¸.0s1¾24;5n6ˆ7¡8Ÿ9™:w;I<=¤=/>œ>ï>?)? ?È>Z>·=é<ä;©:897®5Ž3C1¸.,)&Ö"Ц"ž#­ T éíýûjøåõ›óyñŒïÐí>ìãê¨é§è¿ççræõå¥ådåEå;åGåaå“åËåæfæµæçoçËç'èrèÂèûè/éKéXéMé,éíè“èèçÆæëåéäÎã‹â2áºß+Þ‹ÜÙÚ&Ùi×µÕÔpÒîÐŒÏIÎ8ÍIÌšËËÊʲÊÖÊ/˿˃ÌuÍ™ÎäÏZÑóÒ©ÔƒÖmØtÚܱÞêà#ãoå¸çê_ì´î ñ\ó«õû÷@ú„üÂþù)Wt• ¡ µ ±²£ŒtHæ©b "¼#]%õ&„(*Œ+-q.Ð/11}2Ç3þ416P7j8m9h:J;!<Û<†=>ˆ>Ý>?$??Ô>p>Ù==<ê:9ä7 6û3·1:/‹,±)¤&}#- ËRÔOÎ\ ù±‰|þ¤ûèøfö ôãñëï(îŠì&ëåéØèìç+çŠææ³åpåLå:åEå\å‰å¿åæSæ©æç^çºçèfè²èïè%éFéVéPé2éùè§è/è£ççææåäÌâváàyÞÝÜ.ÛzÙÀ×Ö]Ô¾Ò8ÑÐχÎjÍzÌ´Ë/ËÓÊ´ÊÐÊË¢Ë[ÌCÍ`΢ÏÑ¢ÒVÔ$ÖØÚ$ÜJÞwà»âøäKç—éíëAî•ðèò9õ…÷ÑùüSþ‹¼é * = M MP?2òÀQ Á!f#%¢&:(½)D+·,'.Ž/è0>2„3Â4ô5728998:;ù;µÍ>?#??ã>‚>ú=7=M<";Ë948j6d4*2·/-?*A'$Ó vþ…ý ¡V#ÿ-üsùÝö„ôJòOð|îÚìlë"ê éèOçªæ)æÁå‚åNåBå@åYå~å¶å÷åCæšæíæOç¥çèTè£èåèé?éUéOé<ééµèKè¹çç?æOå;ä ã¶áPàÃÞ1Ý€ÛÐÙØ_Ö¯ÔÓÑÐÅ΢ͣÌßËCËäÊ»ÊÄÊ Ë…Ë5ÌÍ%ÎdÏÈÐSÒÔÈճשٿÛÛÝàGâŒä׿%ézëÌí#ðsòÉô÷aù ûåýO~¡ÀÙ ã íêßѱ•e6øµk!#º$U&è'r)ö*o,Þ-H/¥0ø1G3€4º5Ý6ú79:ð:Ì;޹>ý>??î>–>>_=z<`; :…8Å6Ì4›250˜-Ñ*×'¸$}!³.²+· J ú¯ÿ¿üùù_÷öô¹ò±ðÖî+í²ëbêAéJètçÍæ>æ×ååWåFå=åWåså­åéå5æˆæÝæ<ç”çòçCè•èÖèé9éOéTé<ééÆè^èÚç/çjæåräHãüá“àß|ÝØÛ#ÚmسÖÕ`ÓÍÑ]ÐÏÚÍÔÌÌbËóÊÂÊÁÊþÊkËÌåÌóÍ#σÐÒªÓsÕO×JÙVÛsÝ¢ß×áädæ´èë[í­ïòRô£öíø2ûtý®ÿâ5Wr { ‹ƒ€nV5 Û `!Ä"d$ &’',)¤*&,—-ÿ.a0¸13G4w5¨6À7Ò8Ð9Â:Ÿ;h< =¹=@>¦>î>??ø>¥>1>=ª<–;O:Ø87453¯0.\+o(V%"Å]à`Üb ö  bHPýƒúã÷iõ/óñ8ïzíýë¡êzéxèžçíæYæìåšåbåIå?åRånå¢åÜå(ævæÍæ*ç‚çàç2è…èËèé1éKéSéBééÕètèóçUçæ®å¨äã?âÙà`ßÌÝ)ÜzÚÁØ ×UÕ°ÓÒ¢ÐHÏÎÍ'Ì€ËËÇÊÂÊíÊWËïË½Ì¾ÍæÎ>лÑWÓÕñÖéØîÚ Ý5ßhá­ãòåAè“êäì<ïŒñãó+ö€ø½úý<ÿw£Íë  #"÷Õ³}K k"$´%H'Û(Z*Ü+M-º.0s1Â24>5h6‹7™8¢9:t;A<û<š=(>Ž>å> ??ü>¹>E>¦=Ó<Ï;‘:"9r7•5v3&1¢.å+)ð%Ã"m Ž¡ Iæáýûdøæõ™ó|ñïÑíFìäê²éªèÇççuææ¨åoåLå@åPåeåšåÏåæiæ»æçpçÍç#èsèÀèöè-éCéTéDé$éáè‰è èrçºæØåÝä¼ã}â!á«ßÞ}ÜÎÚÙ]×®ÕþÓmÒéЉÏLÎ9ÍPÌŸËËÕÊ¿ÊäÊ@ËÐ˔̊ͪÎüÏmÑ Ó¿Ô—Ö…ØŠÚ ÜÉÞûà<ãåÍç êqìÈîñló¾õøQú“üÏþ7a„ ³ ¹ Á¸°”{R(ì²h "Ã#a%û&‰(*Ž+-t.Ò/21|2Ç3ÿ4-6Q7d8l9`:H;<Ø~>Ï>???Ç>]>Å=ÿ<<Ô:h9Ì7ð5å31/t,“)Ž&d# ¶<Ã8ÅK ï§xþûåøföôëñèï/îŽì+ëíéÝèòç5ç‘ææºåxåSåCåKådåŽåÅå æTæ¯æç_ç¼çèhè®èíè!é?éPéHé)éðè›è#è–çÙæ æ å÷ã»âgáôßkÞÎÜ"ÛmÙµ×ÖSÔ»Ò2ÑÏχÎnÍ}Ì¿Ë4ËàÊÁÊÞÊ*Ë´ËmÌWÍsθÏ%ѹÒiÔ<Ö%Ø%Ú8Ü_ÞŒàÍâå^çªéìQî¨ðùòIõ–÷Þù$üaþ˜Ìõ7 F Y XYI8öÍ‘\ È!m#%ª&;(Ã)F+¹,*./ê0?2„3À4ó57/889/:;í;±<[=î=f>¿>ý>??Ò>q>å=%=6<;³98P6M42Ÿ/ü,%**'$ [ñlïnû –Lÿ)üoùßö~ôQòMðƒîÞìqë)êé!èVç´æ.æÍåƒå\åCåLå]å„å¾åøåKæšæòæPç§çèUèŸèäèé>éJéMé.éýè¬è<è²çÿæ2æ@å,äþâ¦á@à¶ÞÝyÛ¾ÙØOÖ«ÔÓÑÐÈΟͮÌÞËPËìÊÈÊÔÊË–ËHÌ)Í:ÎxÏÞÐhÒÔÝÕÈ׿ÙÓÛòÝ à^âœäîæ5éŽëÝí5ð…ò×ô#÷pù¯ûõý(_ЬÏß ó ôôëÖÀ˜p;»q!#À$Y&í'x)÷*u,ß-K/¤0ü1C3ƒ4·5Û6ù79:ê:Ä;Š<9=Ñ=O>­>ò> ? ?Ü>…>>M=d>â> ? ?è>•>>o=”<‚;<:º875ñ2–0.E+S(@%"°GÌNÌS é ”\>Lý~úß÷nõ'óñ2ï†íýëªê~é€è¥çôæbæòå¢åjåPåEåYåtå¦åæå&æ€æÍæ-çƒçàç3è…èÆèé)éIéHé=ééÉèmèâçKçæ¢å—äuã*âÐàLßÂÝÜmÚ¶ØÿÖMÕ©ÓÒŸÐEÏÎÍ2Ì‚ËËÑÊÐÊüÊgËþËÓÌÌÍÏNÐÒÑlÓ1Õ×þØÛ"ÝG߀á¿ãæUè¤êúìIï¤ñíóBö‹øÐúýNÿ‚²Ûö ! ,/#þá·‰NÅ r"$·%P'Û(c*Ú+U-·. 0r1Ã2495l6ƒ78—9‘:k;=<ò<”=>ˆ>Ô>? ?ï>¥>7>=À<»;x:9Y7|5]3 1….Ï+é(Ú%©"Xò}ù~• 9üØáýûbøæõ™óñ’ïÖíJìëê·é²èÎçç}ææ³åsåUåHåSåpååÕåæiæÂæçsçÎç!èuè¹èõè'é>éMé=ééÙè~èÿçhç©æÌåÍä®ãmâášß ÞoÜÀÚ ÙU×¢ÕùÓgÒäЋÏKÎ=ÍU̦Ë&ËÞÊÌÊöÊLËå˦̛ÍÄΠІÑÓØÔ¬ÖšØ¡Ú´ÜàÞáPã”åãç0êˆì×î-ñ}óÎõøcúŸüáþCp© ¿ Ä ÊÅ´¢€^*ú³s "Ë#e%'(*”+-v.Õ/212Ä35)6R7^8l9Y:F; <Ñs>Å>ù> ?ô>¶>J>³=ê<í;»:S9³7Ú5Ê3ƒ1/Y,|)v&J# ž*¬,°@ âœxqþ™ûãøbö ôèñïï-î–ì0ëóéåèøç<ç˜æ"æ¿å€å[åJåRåiå”åÉåæZæ¯æçaç»çècè¯èèèé;éGéEéééèŽèè‡çÎæøåååã­âWáãß^Þ½ÜÛ_Ùª×øÕJÔ´Ò0ÑÊÏ‹Îl͆ÌÂËAËæÊÒÊçÊ@ËÀË‚Ìi͇ÎÍÏ:ÑÏÒ}ÔUÖ6Ø>ÚKÜuÞ¡àáâ$ånçÀéìfî·ð óXõ¦÷ðù0ürþ¥Ø&? X ^ h]Z<)úÖšb Ë!u#%®&A(Ç)H+¼,0.Œ/ð0<2†3À4ò57,869):;æ;«¶>í>?ø>À>c>Ï==<ù:™986654ô1‡/ß,* 'ë#¦ GÙ[Ü^ë ŠA ÿ üpùÙöƒôOòRð…îäìtë2êé(è`ç¹æ7æÔåŒåbåLåQåbåŽå¾åæLæ æôæQçªçèTèŸèÜèé1éJéBé&éôèŸè1è¥çñæ&æ/åäêâ›á+à¬ÞÝiÛ¶Ùý×NÖœÔÓwÑÐÂΧͬÌëËUËùÊÓÊáÊ,˧ËYÌ=ÍLÎŽÏñÐÒ(ÔøÕÙ×ÙÙåÛ Þ3àsâ´äüæOé›ëóíDð™òãô9÷wùÆûýý;j–½Õñ ú ýöÞÉ¡y@ ¿x!!#Ã$`&ñ'{)û*w,á-O/£02?3‡4²5Ü6ô79ú9è:¼;…¢>å>?ý>Ê>x>ê=;=O<2;â9T8–6™4g20a-£*Ÿ'Ž$H!ó… ‰– 4 ä± ÿ¶üñù_÷óô¿ò´ðÞî3í¿ëkêRéSè‡çØæPææåšåiåRåNåbå‚å¸åóå>ææææ<ç›çíçGèèÕèé2é@éGé*éé®èJè½ççIædåQä)ãÛávàôÞbݸÛÚOؤÖíÔTÓÅÑUÐÏÜÍÝÌÌrËËÛÊÜÊËË2ÌÍÎOÏ«Ð2ÒÖÓŸÕ{×uÙ€ÛŸÝÉßâBäŽæØè+ëíÒï$òtôÄöùVûýÍÿÿ'Vj‹ ¡—•~jCè¯m!!Ì"u$ &§'))´*(,ž-/c0¹13F4t5¥6º7Í8È9·:”;[<=«=*>‘>Ö>ý>ú>Ù>„> >]=}(%%î!›0¹:¼E Ü ‰P;Dý{úß÷hõ1óñ=ï…íì°ê…éˆè«çüæiæûå«åpåXåNå]å|å­åæå1æ}æÓæ/ç„çáç1èƒèÂèé#éDé@é5ééÁè^èÙç:çsæ‘å‰äcãâ¾à?ß±Ý Ü]Ú®ØðÖHÕ ÓÒ›ÐFÏÎ Í5ÌŽËËäÊÖÊËrËÌãÌâÍÏgÐäцÓCÕ ×ÙÛ3Ý_ß”áÓãægè¸ê í^ï±ñôOöœøÝú%ýXÿ•»é / 5:."꿎YÐ w"!$¿%Q'ã(a*â+S-».!0s1Â2485i6ƒ7–8–9‰:g;6<è<Ž=>|>Ì>ï>?Ú>˜>">~=¬<£;d:ò8D7b5E3ó0m.´+Ñ(Â%‘"CÚkçnñ ‰ ,õÐÛýû_øçõšó€ñ–ïÛíPìðêÀé¶è×çç…ææ¸å|å\åOå[åuå¤åÙå$æmæÄæçtçÏç#èrè·èôèé=éAé7ééÐèqèõçYç›æ¿å¼äŸã\âá‹ßþÝ^ܵÚýØK×—ÕôÓ_ÒäЇÏNÎ>Í_̪Ë1ËêÊÙÊË`Ëñ˽̮ÍÕÎ&ЖÑ7ÓéÔÄְضÚËÜòÞ'áaã«åóçGê–ìêî=ñóÜõ*ømú³üëþ$Rzž³ É Ð ÕÍÁ©Še4þ¾t )"É#r%ÿ&”(*’+-p.ß/*1†2¿35)6L7`8c9Y:;; <ȸ>í>ú>å>¤>8> =Õ<Ö;§:99š7Ã5­3m1è.D,_)`&1#狚¡1 ×’pnþûæø^öôéñôï2îœì4ëûééèèAç¢æ(æÈå‰åaåRåWåqå˜åÓåæbæ¯æ çbç¼çècè¨èéèé8éAé9ééÜè„èèxçÁæéåðäÕãŸâDá×ßJÞ³ÜÛVÙ×îÕEÔ«Ò/ÑÈÏ‹Îr͇ÌÎËEË÷ÊÜÊùÊMËÔË‘Ì‚Í—ÎæÏMÑäÒ—ÔeÖSØPÚc܋޴àøâ6å‚çÕé ì{îÇðóiõ¸÷üùCü}þ´è2N ^ n pibF2Ý¡h Ò!z#%µ&B(Í)I+Á,/.‘/í0?2‚3Â4ï57(809(:;â;¡¨>ã>ø>é>±>N>½=ÿ<<ã:ƒ9ì7!64à1i/Ç,ô)õ&Ó#Ž 3ÁKÇRÛ 3ÿ$üfùÞö€ôRòVðˆîéì}ë2ê$é+èiçÁæ>æÜå”åjåUåVåmåŽåÉåæSæ æúæQç¬çèTè›èÝè é3é=é=ééçè™è"è˜çäææ!åäÙâŒáà™ÞÝXÛ«Ùó×AÖ˜ÔúÒyÑ ÐÈΧͲÌðË`ËËàÊñÊ8˼ËjÌQÍbÎ¡Ï Ñ“ÒBÔ Öñ×íÙýÛÞLà…âÈäç`é°ëîUð«òöôF÷ùÏûþE{¢Éäø  üì˰|LÈ}!'#Ê$a&ù'{)+v,æ-L/©0ü1D3‚4´5Ù6ó7ú8ù9ß:º;y<+=¼=;>–>Ø>ô>ì>¼>a>Ý=!=?<;Ì9<8|64O2æ/O-€*'o$4!Üpö|ù & Ù¬•ÿ¶üëù_÷òô¿ò¸ðâî9íÁëuêUé^è‹çãæWæîå£åoåYåWåfå‰å½å÷åCæ“æææAçšçíçGè‹èÑèé)é?é;é%éôè¤è=è³ç ç?æPåGäãÏáeàæÞRÝ­ÛÿÙGؘÖçÔMÓÀÑUÐÏßÍàÌÌzËËåÊêÊ.Ë›ËLÌ Í,ÎcÏÀÐIÒêÓµÕŽ×Ù‘Û¸ÝÛßâYäœæòè9ë”íáï6ò„ôÒöù_û¡ýÕÿ 7^{   §¤‰qM%ï¹p*!Ñ"x$&¨'.)¸**,Ÿ-/d0¹13D4u5¡6¸7É8Ä9²:Ž;S<= =!>†>È>ð>ì>Æ>v>õ=I=ké(éé³èTèÍç,çfæ‚åxäVã â®à1ß¡ÝÜQÚžØëÖ:ÕžÓ ÒœÐAÏÎÍ<Ì•Ë&ËìÊéÊË…Ë'ÌôÌøÍ&ÏzÐüјÓ[Õ4×(Ù0ÛJÝsߨáçã-æ|èÊêísï½ñô]ö«øïú/ýiÿ Éô+ 7 CA:*ðÉ–]Ñ ""$Å%U'å(h*â+W-½.!0r1Å24;5d6€7•89†:_;/<ã<€= >n>¾>ç>í>Ï>„>>m=–<‹;R:×8/7H5*3Ü0S.›+¹(ª%x"0ÄXÓ_á ~ $çÎÓýû^øäõœó…ñ•ïåíPìüêÄéÀèßç$çææ¿å‡å_åYåaå{åªåÞå(æpæÇæçuçÐç èrè²èóèé;é7é3ééÇèeèèçNçŒæ±å­äŽãOâóàzßóÝNÜ©ÚðØB×ÕïÓWÒäЄÏPÎAÍb̵Ë:ËôÊéÊËpËÌÉÌÆÍéÎ7бÑEÓÕ×ÖÇØÊÚáÜß:áxã½åèWêªìûîOñžóíõ9ø}úÀüúþ1^‰¦Á Ó Û àÕɳ’n9Á€ '"Õ#o% '”(*–+-x.Ú/212Å3ü4*6I7[8a9S:5;<¿­>á>ë>Ö>“>&>Ž=¿<Ä;:#9„7¦5™3N1Ô.&,I)G&#×o… ‘$ Άjfþûâø^öôéñúï4î¡ì;ëêñè èHçªæ1æÏå’åhåXåaåuå¢åÒåæaæ¸æ çeç½çèbè¦èåèé-é?é-ééÐè{èÿçnç±æÜåáäÆãŽâ6áÇß=Þ¡ÜúÚGÙ•×âÕ?Ô¥Ò*ÑÇÏ‹ÎtÍŽÌÒËQËËêÊË]ËçË£Ì”Í®ÎøÏeÑûÒ¨Ô€ÖcØhÚyÜ›ÞÎàãLå—çäé6ìˆîÝð*ó~õÃ÷úMüþÄñ=X o s ~rjR5á«m' Õ!ƒ#%¼&E(Ñ)L+Æ,..–/í0>2…3¼4ò57(8*9%:;ß;–œ>Ö>è>Ü>ž>?>ª=é<õ;Í:j9×764Ä1O/¯,Ù)Þ&¹#x °4º=Ó o.ýþüeùÜöôRò[ð‰îñì€ë<ê)é4èpçÈæHæâåånå_åZåuå”åÍå æUæ¤æüæQç®çèRè›èÖè é)é<é1ééßè‰èè‡çÙææåäÉâ|á àŒÞñÜOÛœÙè×9ÖÔøÒrÑ ÐÇΪͶÌùËdËËéÊËGËÍËzÌhÍrκÏѬÒVÔ#ÖØÚÜ3Þ_àšâÞä#çtéÃëîið¹òõV÷šùáûþWƒ´Ðó  ôÕµ†R΄!,#Î$i&÷'ƒ)+z,é-N/ª0û1F34´5Ö6ï7ø8ò9Û:²;tŒ>É>è>Ú>°>N>É==&<;²9'8a6j422Ï/5-f*w'V$!Å\ãiì|  Τÿ­üìù[÷ôôÁòºðæî>íÈë{ê^ébè˜çææcæóå­åvåcåZåqåŒåÆåùåJæ’æëæCç˜çòçAèŒèÌèé#é9é4ééëèšè1è¦çûæ0æCå6äã½áVà×ÞCÝŸÛòÙ<ØÖâÔBÓÂÑKÐ ÏÜÍêÌ̃ËËðÊýÊ6Ë´ËWÌ6ÍAÎuÏÙÐ[ÒÔÉÕ§× Ù¬ÛÊÝóß,âj䵿þèRë¡íõïFò–ôáö.ùlû°ýâÿBk† « ²®¥’{T-÷½y-!Ù"~$&¬'3)¹*0,ž- /a0½13D4t5Ÿ6µ7Å8¿9¬:‰;K<=•=>x>À>Þ>à>¶>b>æ=3=W<=;ù9r8À6Ê4¦2G0¸-ø*(ù$½!p“š+ à tA+<ýuúÚ÷lõ/óñ@ï‘íìºê—é‘èÁçç|ææ¼å~åhåZåkåŠåµåôå6æˆæØæ3ç‡çáç2è~èÀèöèé4é5é#éòè­èDèÃççXæråkäDãýá àß–ÝïÛFÚ”ØÞÖ6Õ”Ó Ò˜ÐCÏÎÍCÌœË0ËúÊóÊ1Ë“Ë:ÌÍ Î8Ï’ÐÒ¯ÓrÕE×CÙBÛa߽݇áüãBæèÛê1í€ïÓñ#ôpö¹øþú?ývÿ­×ÿ3 F KLD1ùОd"Ø …"*$Æ%^'ç(l*ä+Z-¿."0u1Á2475d67Š8”9x:`;%<Ú<{=û=g>¯>Û>à>»>w>ú=[=¡>Ð>à>Ä>ƒ>>y=¬<¬;y: 9l75€331». ,.).&ÿ"¾Zðqú ¾€`_þŽûÛøaö ôîñúï:î¥ìCëêúèèRç³æ6æÚå—åpåbåeå~å¤åÜåæjæ¶æçbçÄç èeè¢èäè é,é5é(ééÅèqèñçaç£æÎåÐä¹ã|â(á¶ß-Þ–ÜêÚ>Ù‡×ÜÕ2Ô¦Ò"ÑÉωÎyÍ‘ÌÝËWËËôÊËlËøË·Ì¨ÍÂÎÐxÑÓÀÔ•ÖzØڌܴÞààã`å«çøéIìœîëðAó‰õÙ÷úbü˜þÓÿ)Ld w ƒ ‚ƒn`:è´t, ß!‚#)%¹&O(Ò)P+È,2.•/ò0;2‡3½4ì57!8)9:;×;‘<:=Ê=8>•>Æ>Û>Ë>>+>™=Ó<â;³:U9¾7ë5ê3§17/•,¾)Æ&¡#a ›ª-à f!ýôþüaùÜöôVò[ðîôì…ëFê+é@ètçÒæNæëå¤åxåbåeåyååÑåæXæªæþæUç¬çèLèèÒèé%é3é,é éÕè}èèwçÍæ÷ååòã¹âmáþß|ÞâÜBÛŽÙÞ×/Ö…ÔóÒmÑ ÐÈΪÍÀÌúËsËËùÊË[ËÚË”ÌsÍÎÈÏ4ÑÁÒkÔ:ÖØÚ)ÜGÞvà°âïä:ç…é×ë'î{ðÊòõe÷ªùñû)þe”¼ãû  þÞ¿‹]׊!1#Ô$n&ý'†)+~,ê-Q/©0ÿ1C34°5Ô6ð7î8ö9Í:²;j<=­=#>€>¾>×>Î>š>?>µ=ý<<ñ:š98J6O42¶/-T*X'A$!¯FÐVÜp Ç–Žÿ¦üéù[÷ñôÄò»ðëîBíÏë€êdélèœçðæjæüå³ååhådåtå•åÇåæJæ™æíæDç›çòç>èŽèÆèþèé3é*ééÜè”è"èšçîæ æ6å#äýâ©áJàÄÞ5Ý’ÛãÙ4Ø€ÖÚÔ>Ó¹ÑPÐÏäÍéÌ!ÌŒË'ËÿÊËLË¿ËnÌGÍVΊÏîÐqÒÔáջ׸ٿÛßÝ à@â€äÆæébë¶íðWò©ôðö>ù|û½ýöÿ$Vr–¦ ¶ ½º®ž`2Â2!à"$&®';)·*6, - /f0»13C4s5œ6´7Á8»9©:;E<÷<= >m>²>Ñ>Ð>¤>R>Ï=$==<*;á9Y8©6®42*0 -Û*ò'Ü$©!Wñ€ µ m3&6ýrúÙ÷kõ0óñFï“íìÁê›éšèÆçç…ææÂå‰åkågånåå¾åôåAæ…æàæ1çŒçßç2èzè¿èñèé,é.ééèè¤è7è·ççJæcå\ä3ãîáŽà߆ÝàÛ:Ú†Ø×Ö)Õ‘ÓÒ—ÐAÏÎÍLÌŸË@ËËË<˧ËJÌÍ ÎMϨÐ%ÒÅÓ‡Õ`×UÙ[ÛwÝ›ßÔáäWæ¢èñêBí”ïæñ2ôƒöÈø ûPý‚ÿ½ã )A Q UXL<$Û¢q$â ‰"1$Ë%a'ë(n*è+[-Ã."0w1Â24;5\6ƒ7†89x:U;"<У>Í>Ï>®>c>ê=D=m<`;":¨8þ65ú2¦0.k+„(z%I"›/°;Å ` ÔÀÈýýúXøäõŸó†ñ ïëí[ìëÑéÌèñç1ç æ'æÏå–åpåeåoå‡å¶åêå1æyæÌæ#çwçÑçèoè®èêèé)é1ééúè«èRèÏç0çtæåärã*âÙàYßÖÝ2ÜÚØØ/×yÕâÓNÒÛÐ…ÏQÎJÍlÌÆËMË ËË-Ë”Ë(ÌñÌîÍÏcÐÛÑqÓ2Õ×÷ØðÚÝ/ßdá¢ãâå1è~êÍì ïrñ¿óöTøŸúÜüÿKzžÃÕ ì ï õéÜÅ£}KÓ‡ 7"Þ#z%'œ($*œ+-x.ß/21ƒ2Â3ú4(6C7W8V9K:(;ù;­“>Æ>Í>¶>r>>f=˜<–;b:õ8Q7y5b31ž.ó+)&ì"¤HØbér ³xW]þ†ûÝø]öôíñð=î¬ìGëêéèXç»æ=æäå›å|ådåpåå­åßå#æjæ¼æçhç¿çè`è£èÝè é"é1é éûèÀè_èìçPç˜æ¾åÃä¨ãmâá£ß$ÞƒÜàÚ1Ù}×ÒÕ0ÔšÒ&ÑÂÏÎzÍ–ÌåËaËËË$Ë~Ë ÌÈ̼ÍÕÎ#ÐÑ'ÓÖԩ֑ؓڢÜËÞòà6ãpå¿ç ê]ìªîñIó¡õâ÷/úkü¨þà 9Qu } ‰|cHð½w5 â!‹#+%À&Q(Õ)U+È,5.•/ó0<2…3½4é578$9:ü:Î;ŒŠ>¹>Í>»>}>>„=Á<Ë;:@9£7×5Í31/y,ª)ª&Œ#H ó„– ¶ Yõïþü^ùÛö‚ôVòbð’îüìˆëOê1éGè{çÜæRæ÷å¨åƒåhålå€å¡åÙåæ_æ«æçXç¬çèOè—èÑèé é,é%ééÉèwèèpç½æèå÷äÞã­â[áðßmÞÖÜ2ÛƒÙÕ×#Ö‚ÔèÒlÑÐÉίÍÁÌÌyË&ËËËjËì˥̇͢ÎÞÏIÑÔÒ„ÔNÖ1Ø0Ú:Ü`ÞˆàÄâåKçšééë9îŒðÚò*õt÷»ùýû:þp¡Êî  ( )(ê™](ד!5#Ü$n&(‰) +€,ë-S/ª02@3€4°5Ñ6ë7ð8é9Ð:¦;c<=ž=>q>µ>Æ>À>Š>->¤=ç<ü;Ú:…9ö706542–/-2*G''$î ›0ÁBÐ_  ¼Ž‰ÿ üéùV÷øôÂòÀðíîIíÓëŠêhévè¢çûæoææºåˆånålåyåžåÊå æLæŸæïæEçŸçîçBè‡èÅèúèé,é%é éØèƒèè‰çâææ'åäêâá7àºÞ%Ý…Û×Ù(ØwÖÒÔ8Ó¶ÑKÐÏãÍïÌ'Ì“Ë6ËËËWËÔË}Ì]Íg΢ÏчÒ0ÔòÕ××ÈÙÙÛòÝàWâ‘äÝæ&éuëÊíðkò·ô÷MùŠûÍýÿÿ8Zˆ™¹ ¾ Çø¤Œd>΃e>£>Ä>Â>”>C>º==)<;È9F8‹6œ4p20…-Â*Ú'Ã$“!?àhõz ¬ ]14ýnú×÷lõ1ó"ñJï™íìÉê é£èÍççŒææÈå’åqålåyå“åÄåûåAæŽæßæ5çŒçàç0è{è¹èïèé&é(ééáè–è.èªçç<æUåMä%ãÞáàßyÝÓÛ.Ú{ØÍÖ!ÕŠÓüÑ”Ð@ÏÎÍNÌ­ËEËËËJ˺Ë[Ì.Í4ÎbϾÐ8ÒßÓ˜Õy×gÙqیݮßìáäqæ¯èëRí¥ïøñAô“öÖøûXý—ÿÅô5N Y b`WF, à­s1ã ‘"5$Ñ%d'ð(p*ï+Z-Ç."0y1Á2445b6w7‹8ƒ9v:O;<Ë–>¿>Ã>œ>S>Õ=4=V‰>·>Â>£>c>ð=S=‚<‚;H:à867`5H31….Ø+ý(û%Ñ"2ÂQÔdû ©mOVþûÚø]öôññðCî¯ìOëêéèaçÂæFæèå©å}åqåqåŒå¯åèå%æoæÀæçiçÂç èaèŸèÙèéé&ééíè¸èTèßçCçŠæ¯å´ä™ã_âá™ßÞyÜÑÚ%Ùt×ÈÕ&Ô˜ÒÑÆÏ‹Î€ÍšÌêËnË!ËË4ËŒËÌÝÌÍÍìÎ7ФÑ<ÓìÔÀ֦ثڶÜàÞ áHãˆåÑç êmìÀîñaó­õõ÷=ú|ü¶þíDb} Œ š ˜“†lQ&ûÁ; ç!‘#0%Ä&V(Ù)W+Ì,5.›/ð0@2„3º4ì5789:ø:È;‚<)=´=(>x>¯>¾>¬>n>>s=«<¶;‡:'9Œ7½5´3t1/^,Ž)“&q#3 Ûoþ‚¥ Pëêþü]ùÚöô[ò_ð™îþìëSê9éMè†çßæaæùåµå†årårå‡å¦åÞåæcæ°æçZç­çèOè“èÑèúèé&ééþè¾èkèõçcç­æßåâäÔãšâNáàß]ÞÉÜ#ÛxÙÉ×ÖxÔäÒhÑÐËήÍÉÌ ÌƒË1ËË,ËyËþ˶Ì͵ÎôÏ_ÑêÒšÔcÖJØCÚTÜpÞ¢àÔâå]ç®éúëOîšðïò8õ†÷Ìù üJþ|¯×ù ( 0 60#ðÌžg+ä’!?#Ü$w&() +…,ë-V/«0þ1D3|4¯5Ð6å7ï8â9Ì:Ÿ;]< =˜=>h>¤>¼>®>{>>‘=Ô<æ;Ä:l9à764ç1/è,*-'$Ø ƒ«2¿Q ÷¯Š€ÿœüäùW÷õôÇòÁðòîLíÙëêpé{èªççvææÀååvåqå‚å¡åÒå æRæ¡æóæGçžçðç@è†èÂèôèé#é!ééÍèzèèçÔææåäÛâŒá+à¨ÞÝvÛÌÙØoÖÈÔ3Ó±ÑIÐÏåÍôÌ-ÌžË;ËË#ËjËâË’Ìl̀αÏÑ›ÒEÔ Öé×âÙëÛ Þ2àiâ©äîæ;éˆëÙí*ð{òÇô÷YùœûÚýAmެ¿ Ê ÔËŬ–lEÒŽ?!ë"‹$&&·'A)À*9,¦- /j0º13A4p5™6®7¹8´9›:w;6<è<{=ø=W>™>¶>³>„>/>­=ø<<þ:¯908q6ƒ4W2û/j-ª*¿'­$x!-ÆYßlý U$,ýkúÕ÷lõ2ó$ñMïí"ìÌêªé¨èÕçç”æ æÒå–å}åqå}åžåÅåæCæ’æâæ6ççÞç4èuè»èéèé!é ééØè‹è$èœçôæ/æEå>äãÐáoàôÞgÝÈÛÚrØÀÖÕÓûÑŽÐDÏÎ ÍU̵ËPËËË\ËÈËnÌDÍDÎ|ÏÎÐQÒòÓ°ÕŽ×}Ù‰ÛÝÊßùá:ä}æÉèëhí´ï òTô¢öèø+ûjý£ÿÓ$CW g kkcL9 ì²}4ì –":$×%h'ô(s*ò+\-É.!0z1À2445]6y7‚8„9m:L;<Ã<_=Ý=F>Š>±>³>>>>È==C<7;ó9{8Ì6ã4Ç2r0ì-7+R(I%"Ñsާ G ÷Å®¿ýóúUøåõóñ£ïóíjìëäéÙèýçFçªæ:æßå¤ååvåyå™å½å÷å8ææÔæ&ç}çÏç"èiè¬èàè éé"é éâèšè9è·ççWæsåsäOãâ³à@ßµÝÜuÚÁØ×jÕÒÓFÒÔЄÏQÎTÍwÌÔËaË#ËËM˳ËKÌÍÎ=Ï‹ÐÒ ÓZÕ0×Ù"Û7Ý\ßáÇãæUè¤êöì@ï˜ñãó-özø·úþü3ÿg•¸Ûî  íØ´Z"Ý— B"é#„%'¦(**¥+-~.â/11…2¿3ý4 6B7N8O9B:;ë; >¦>¶>’>Q>Þ=?=nl>¥>­>ž>\>ö=^=™<ž;s:9u7¢5›3^1é.G,u)x&[# ÈXìq› @áäþ üZùØöô\òbðŸîí™ëVêAéUè‹çéægææ½ååzåwåŽå­åäåægæ±æç\ç­çèKè“èÍèöèéééðè¸è^èéçWçžæÏåÖäÀãŽâ:áÔßLÞ»ÜÛlÙ¼×ÖmÔáÒaÑÐÉδÍËÌÌŒË:Ë!Ë8ËŒËÌÇÌ´ÍÃÎÐpÑÓ®ÔzÖ^Ø[Úi܈޵àìâ-åsçÂé ì`î¯ðþòLõ“÷ÜùüWþŽºç" 1 ? >=,÷Ù¢s/ê!@#ç$v&()+‡,ð-V/¯0ý1E3~4¬5Ï6ã7é8á9Æ:—;Y<ý<=>]>™>«>£>h> >|=Á<Ð;¯:T9Ç7ý54Ë1i/Ê,*'ø#½ m™±= í£~yÿ–üáùS÷õôÆòÄðõîPíßë”êwé„è¯ç çzææÆåšåzå{å‡å¨åØåæWæ¤æ÷æHç¢çîçAè„èÁèñèéééûèÂèrèètçÄæøåå÷ãËâ}áàšÞÝjÛ»ÙØ`ÖÄÔ(Ó¯ÑGÐÏéÍõÌ6Ì¥ËGË%Ë1Ë{ËòË¥ÌÍ’ÎËÏ,ѳÒ[Ô ÖØøÙÜÞHàâ½äçNéœëëí?ðŠòÛô"÷lùªûêý N|›·Ï Ô àÕѶŸvNÜ“E!ò"$-&º'G)Ã*>,¨-/i0¿13D4m5˜6¬7µ8²9”:r;/<ß‹>©>£>u>>™=å<<è:š98Y6h4>2ß/Q-*§'‘$a!°DËZî L#ýgúÓ÷gõ6ó#ñQï¡í$ìÖê¬é²èÚç(çšæ*æÕå£åå{å„å¢åÏåæKæ“æèæ8çŽçâç.èwèµèçè ééééÍè„èè‘çææ"æ5å0äãÀá^àåÞXÝ»ÛÚdØ·ÖÕ{ÓôÑŽÐAÏÎ$ÍYÌÀËWË*Ë-ËjËÜË~ÌWÍ\΋ÏéÐdÒ ÔÈÕ£×–ÙÛ¶ÝÝßâN䓿Ýè*ëzíÉïòeô³öùø;û{ý±ÿâ/Qc s xumWBò½?ñ ž"@$Ù%q'õ(|*ï+d-Ç.(0y1Ä2485W6{7|89i:C; <º}>¥>£>~>.>³= =,ÒÒÐÏVÎSÍÌÚËmË.Ë-Ë[ËÆË[Ì/Í%ÎRϤÐÒ¹ÓpÕF×7Ù6ÛPÝpߥáßã!æmèµê íSïªñôó?ö‹øÉú ýAÿyŸÊæû   úßÁ’f&é› I"ï#Š%'¬(,*ª+-‚.â/61‚2Ã3ø4!6?7K8L9;:;ã;˜<7=¼=%>q>›>¥>…>=>Î='=^c>•>Ÿ>>J>ç=G=†<‡;\:÷8[7Œ53D1Ì./,X)b&?# ­EÖ_ñ‡ 8øÚÝþüWùÖö€ô]òdð£îí ë[êHé]è‘çòæmæ æÄå”å‚åå’åµåæå"ækæµæ çZç²çþçPèŒèÌèòèéééæè°èSèÜçIç“æ¾åÆä´ãzâ0á¼ßDÞ§Ü Û^Ù°× ÖgÔÙÒ^ÑÐÉεÍÑÌÌ–ËFË,ËHË™Ë$ÌÙÌÆÍÝÎЊÑÓÆÔ‘ÖtØsÚ|Ü¡ÞÈàãBåˆçÓé$ìoîÆð ó`õ¤÷ìù+üfþ›Ìï) B F NC;Ú±w9ò !I#ê$&(•)+‰,ó-X/¯0ÿ1E3|4­5Ë6ã7å8Ü9¿:”;O<ø<…=û=S>‰> >>Z>÷=j=ª<»;™:99²7á5í3°1M/°,é)õ&ß#¥ Vï„ Ÿ1 Úrrÿ’üÚùS÷óôÆòÈðöîVíâëšê}é‰è¸çç‡ææÐåå†å~å‘å¬åÞåæ]æ¥æúæJç¢çïç?è‚è¿èìè éééñè»èbèûç`ç¼æäåûäçã¼âlá à‹ÞùÜ\Û²ÙØ[Ö¸Ô#Ó«ÑCÐÏèÍüÌ9̯ËRË/ËBˇË̵̖ͤÎãÏ>ÑÍÒnÔ8ÖØ ÚÜ3Þaà’âÔäçbé°ëþíRð›òîô0÷€ù·ûýý)b„«ÃØ å æã×ç€Uã™P!ó"š$0&Á'I)É*<,²- /o0¼13B4o5”6ª7²8¬9‘:l;'<Ù>š>•>a>>„=Ò<ë;Ð:ƒ9ü7C6K4%2Å/6-u*‹'z$H!ü›-¼GÝ ‚ <ýbúÏ÷jõ0ó-ñNï¨í)ìØê¶éµèåç-ç¢æ1æßå¨åŠå~åŒå©åÑåæJæœæäæAçŠçåç,èwè±èäèéééøèÄèvè è…çØææ)åäúâ¬áRàÔÞKݪÛÚXØ¬Ö ÕqÓòщÐBÏÎ*Í\ÌÊËbË4Ë=ËyËëË”ÌgÍpÎ¥ÏøÐÒÔâո׮ٲÛÌÝóß&âcä§æðè>ëŽíÚï-òwôÅöùOû†ýÂÿð@[r } „~y_M ý‹Dø ¥"C$ä%q'ü(*ò+i-Ç.*0{1Â2415]6p78x9e:@;<·o>™>“>o>>¡=ô<<;Æ9H8œ6¬4•2:0¹-ÿ*(%é!¢FÙgô‰ ( ⬠°ýéúOøâõóñ­ïõíxìëïéèè èQç½æFæñå°å‘å€åŠå¢åËåæBæˆæÚæ+ç€çÏç#èdèªèØèþèééýèÐè…è!èŸçúæ<æRåWä-ãóá‘à"ß•ÝþÛVÚ­ØÿÖ\ÕÁÓ<ÒÍЃÏTÎYÍ…ÌâËwË:Ë9ËnËÑËtÌ<Í=ÎdϹÐ0ÒÎÓ†Õ^×IÙSÛ_݌߶áöã6æ€èÉêíiï¹ñôNöøÙúýRÿ´Òö   èÉl0î¤ O"ô#‘%"'²(-*¯+-„.ä/61…2¿3ù46=7I8F98:;ß;‘<,=´=>f>Ž>•>v>->º==EU>‡>”>{>=>Ï=8=qù¨!N#ð$ƒ&(™)+Š,ù-U/µ0ü1G3|4©5Ì6Ü7â8Ù9¸:;G<í<€=í=I>{>’>€>J>å=W=–<§;€:'9”7Î5Î3™12/—,Î)ß&Â#‘ <Ýmü‹$ ÐŽllÿŠüÛùM÷öôÇòÈðüîYíçë¡êƒé‘è¾ççæ&æØå¥åŒå…å—å²åãåæbæ©æýæLç¢çñç=èèºèèèéééèè¯è[èéçYçªæÛåèäÙã«â`á÷ßÞéÜOÛ¤Ùù×SÖ¯Ô!Ó¢ÑFÐÏìÍÍ@̸Ë]Ë=ËNË›ËÌÈ̫͹ÎöÏWÑßÒˆÔLÖ.Ø#Ú/ÜKÞsàªâæä-çuéÄëîbð®òüôE÷‰ùÌûþ=l“·Ñâ ñ ïðßͯˆ^$é¢R!þ"›$7&Ã'N)Ì*A,±-/n0¾13A4l5“6¤7³8£9’:_;$<Î<`=Ú=4>s>‹>†>S>ü=o=Ã<Ï;À:i9å7*624 2­/-]*r'`$2!䇧9Í v 4ý\úÑ÷gõ4ó,ñSï¬í.ìáêºéÀèèç9ç¨æ:æåå²ååŠåå®åÛåæUæšæìæ?ççãç/èrè±èÞèéé éìèÀègèèsçÎææåäçâžáAàÅÞ<ÝÛøÙNØ¡ÖÕkÓïцÐAÏ$Î*ÍiÌÌËqË?ËLˇËþˤÌ}ͅεÏÑÒ8ÔòÕÒ×ÁÙÉÛâÝ à9âz䏿éOë íîï>ò‰ôÔöùZû™ýÌÿ&Of| Š ŒmO0þÏLÿ ¨"K$æ%v')€*ù+f-Î.(0|1Á24-5\6m7|8t9`:9;û;¯i>…>ˆ>[>>‹=ä<<ö:¬9286–4y2#0œ-ç*(û$Ò!‹/ÄVá{  Õ¥˜ªýæúOøÝõ¤óñ®ïÿívì"ëðéóèè]çÂæOæöå¼å”å‰å’å¤åÕåæGææÝæ-ç€çÓçèhè£è×èøèééúèÁè~èè’çðæ(æIåCä!ãááƒà߆ÝñÛIÚ ØöÖQÕ½Ó5ÒÏÐ|Ï]ÎWÍŽÌêËËHËGË|Ëå˃ÌRÍPÎyÏÑÐBÒéÓ˜Õv×aÙeÛzÝŸßÌá äJæ”èÞê-í|ïËñôaö©øìú'ýcÿÀáÿ " +' òЧq:ô© W"ø#•%)'±(8*¬+-†.ä/91„2À3ø46;7E8D92: ;Ù;†<(=¥=>W>>‡>c>>£==-<+;í9~8Ö6ø4ã2›0.r+“(™%m"4Ôtÿ‘$Å xC0;þrûËø[ö ôúñ ðTîÁìfë+ê!é>è|çãæbæ æÂåŸåŠåŽå¤åÇåüå7ææËæçqçÁçèZè•èÎèóèééôèÓè‰è*è­ç çTæuåuä]ãâËàYßÖÝ=ÜŸÚñØK×£Õ ÔƒÒÑÂÏ΋ͳÌÌ“ËRËEËpËÐËaÌ+ÍÎAÏŠÐýÑ“ÓFÕ×ÙÛÝ6ß]ážã×å#èlê¹ì ïWñ¥óñõ6ø}ú¸üòþ%Rx”¯ » Æ Ã¼¬•qLàŸR "¥#F%×&g(ç)f+Õ,@.Ÿ/ö0?2†3¶4å5789:Ý:²;b<==ú=L>w>‡>k>+>½=&=X<`;+:È8+7W5L31™.ú+%)/& #Ö®<Ïn äÊÍþþûOùÓöô]ònð¤îí¥ëjêSélèŸçç{ææÓå£å‘å‹åŸåÃåìå4ækæÃæ çdç¯çèIèŠèÅèèèé éýèØèšè=èÆç,çzæŸå­äã`â á¤ßÞ‘ÜêÚJÙ˜×øÕWÔÏÒUÑÐÇÎ¿ÍØÌ)̧Ë]ËEËg˺ËFÌþÌíÍÏKдÑCÓòÔ½Ö¢ØÚ«ÜÉÞõà,ãjå²çúéGì™îäð4ó~õÇ÷ úJü„þ·ç ,G S c ^]J6íÁ„Jü¯!V#ð$Ž&( )+Ž,ú-Y/²02D3{4©5Ç6Û7ß8Ñ9µ:†;@<æ>m>…>o>9>Ó=E=€<‘;j: 9~7´5µ3€1/},µ)Ã&®#u *ÅYëz ÃebÿˆüÖùM÷õôÇòÌðþî`íìë§ê‰é–èÊçç–æ,æáå¬å“ååœåºåéåæfæ­æþæPç£çïç>è}èºèâèé ééàè¤èSèÚçPçšæÌåÛäÊã›âNáëßkÞÞÜ@Û˜Ùð×GÖ¨ÔÓŸÑCÐÏñÍÍJ̾ËjËHË_Ë©Ë'ÌÝ̺ÍÑÎÐqÑòÒžÔdÖCØ;ÚEÜ`Þ‰à½âüä?ç‹éÓë(înðÆò õW÷šùÙûþJ|ŸÆÚñ ú üøìÔ¹‘d/îªW!#Ÿ$=&Ç'S)Î*F,°-/m0¾13;4p5‹6¨7¨8¥9…:];<Ãh>{>y>?>ë=^=ª<À;£:T9Ë764ñ1‘/-C*X'G$!Ët˜$Á h &þúÿý\úË÷hõ4ó.ñVï±í1ìéê½éÉèîç?ç±æ@æïå¶å˜åå˜å´åàåæZææñæ=ç•çàç-èsè¬èÜèûèééçè¯èdèòçlç¾æõå åþãÚâŽá2à·Þ,Ý‘ÛíÙAØ›ÖøÔhÓçшÐ@Ï%Î0ÍlÌÙËwËNËYË—ËÌ´Ì’Í–ÎÎÏ&ѨÒLÔ ÖèרÙÞÛùÝàRâ‹äÎæébë³íðLòŸôàö,ùiû¨ýÝÿ 7Xuˆ “ š”‹vY7Õ–S!²"N$í%y')…*ú+k-Ð.&01¿24/5W6l7y8n9^:0;÷;£<:=¸=>[>w>z>J>ü={=Í<ï;Ý:–98g6~4^2 0‚-Ï*è'ç$µ!w°CÒi  Ç¥ýâúMøÝõ¢ó’ñ²ïî}ì%ëûéõèèaçÌæUæÿåÁåžåŽå˜å­åØå æLææáæ.çƒçÒçèdè¡èÒèõèééìè½èpè è…çâææ:å4äãÑásàßwÝâÛ>Ú”ØíÖJÕ³Ó4ÒÇÐÏ\Î\Í•ÌñËŠËTËVˉËùË‘ÌiÍaΑÏâÐ]ÒúÓ²ÕŒ×vÙ|Ûݰßçáäaæ¦èðêBíŽïÛñ*ôqö¹øüú7ýpÿŸËð $ + 61(úÚ­|>ý° Z"$—%/'¸(5*´+-ˆ.é/41‰2»3û4697A8?9-:;Ñ;<=œ=>I>w>s>X> >•=ñ<<;Ô9j8»6à4Ê2€0.T+(z%["Ä[ð}· m;&7þlûÌøWöôúñðUîÈìkë1ê+éBè†çéæmææÎå£å“å–å¨åÐåýå@æ‚æÐæ!çoçÄçèYè”èÉèîèééñèÆè€èè ççDæfåhäJãâ¸àMßÅÝ2ÜÚêØ=×ÕÔÒ ÑÂÏΑͷÌÌœË]ËSËËàËuÌ9Í2ÎTÏŸÐÒ¦Ó_Õ,×ÙÛ&ÝJßtá¯ãïå5è€êÍìïjñ·óÿõIø‹úÆüÿ1`„¢¸ É Ï ÏÆ´ŸxVë¡^ "¯#H%Ý&l(ë)g+Ú,@.¤/ô0B2ƒ3¶4ä5û68 9û9Þ:¥;`<ü<…=î=@>j>y>[>>¬==Fc>u>c>%>Ä=.=pZ>o>g>1>Ø=K=–<«;Ž:<9³7ø5ÿ3×1x/æ,**='1$!ºXõ€¯ ] öòÿýWúË÷gõ5ó2ñZï´í9ìëêÈéÍèùçFç¸æHæöå¾åŸå•åŸåºåãåæYæ¥æïæDç‘çåç)ètè§èÙèöèéÿèÛèªèVèêç\ç³ææåüäòãÇâ‚á àªÞÝ„ÛÝÙ:ØŽÖòÔ`ÓäÑ„ÐAÏ(Î4ÍsÌáË„ËXËjË¦Ë ÌÊ̡ͮÎàÏ;ÑÁÒ]Ô#Öû×ïÙõÛ Þ6àbâ£äáæ+éxëÂíð[ò±ôïö<ùzû´ýëÿAk|˜ œ §”c>Û Y !µ"V$ï%' )†*ÿ+l-Ï.,0}1Å2ý335P6o7p8p9R:.;í;›<2=«= >N>i>l>9>í=d=½<Ø;È:9ÿ7S6a4G2ï/h-µ*Ð'Ì$Ÿ!_Ÿ.Â[  ¼•†žýâúDøâõŸó•ñ·ïî…ì+ëÿéÿè èiçÔæ\ææÈå¦å–åžå´åÝåæNæ–æâæ1ç„çÑçèbè èÍèñèéüèåè²ègèèvç׿ æ-å$äãÀáiàðÞoÝÏÛ5Ú†ØäÖBÕ­Ó/ÒÇÐ~Ï]Îb͘ÌüË”Ë_ËcË™Ë̦ÌzÍtΩÏôÐtÒÔÅդ׌ÙÛ§ÝÅßúá1äsæºèëPí£ïêñ>ô€öÌøûFý~ÿ¬Ü÷( = >=3ⵃF¶ a"$ %0'¼(<*³+$-‹.æ/<1€2Ã3ó4647>8<9&:;Æ;|<=˜=ö=C>c>j>E>ù=‚=Ý<<;½9R8¢6É4­2i0æ->+d(a%D"ÿ¯GÜk¦ c0 /þiûÈøVöôùñðXîÎìmë;ê.éLèŒçïæuææÓå­å–åžå®åÕåæCæ†æÔæ!çsçÄçèVè’èÅèëèüèÿèèè¾èuèè“çõæ9æTå_ä7ãâ«à9ß¼Ý Ü†ÚÛØ4וÕúÓyÒ Ñ¾Ï”Î’Í½Į̀ËhË`ËËïˈÌLÍGÎeϸÐ&ÒÀÓqÕF×,Ù,Û>Ý\ßáÁãæFè•êßì.ï|ñÆóöWø›úÖüÿ@l’­È Ð Û ÚÎÁ¥„['î«a "±#O%à&o(î)l+Ù,E. /ù0@2ƒ3·4à5ù6 89ü9Ó:¡;W<ò<|=ä=0>`>f>N> >˜=þ<0<4;:˜8ù6&53Ý0f.Æ+ò(þ%Þ"¨Sõ‡±P йÃþóûLùÑö€ôcòqð¯îí²ëuêeéuè³ç çæ)æáå³åœåœå«åÏåúå6æzæÂæç`çµçþçJè†è¼èâèúèÿèìèÊèè+è¬çç\æ„å‹äwã>âðà‚ßÞsÜÕÚ/Ù†×æÕIÔÄÒSÑüÏÏÎÁÍæÌ8̹ËuË_Ë…ËÜËhÌ&ÍÎ1ÏqÐâÑlÓÕçÖÏØÇÚ×ÜôÞáTã’åÚçêpìºî ñVóœõé÷'újü þÔ&D` i y so_D*üÏ•S ¸!`#ý$’&!(£)!+“,û-^/³02@3z4¤5Ä6Ô7Ö8È9«:w;1<×<[=Ô=>Y>c>T>>²==Zû¶e! #®$A&Ó'V)×*G,·-/r0½13<4i5Š6ž7¡8œ9y:R; <´K>b>W>!>Å=9=‚<•;y:&9›7à5ç3½1a/Ê,*$'$ë ¡Ißs¢ R ñéÿýSúÊ÷iõ6ó6ñ]ïºí?ìñêÐéÔèþçQç½æSæüåÇå¦å›å§åÀåéå!æ\æªæòæDç”çáç,ènè§èÓèïèýèóèØèœèMèÜçRç¤æÚåíäàã¼âoáàšÞÝwÛÔÙ*ØŠÖæÔ_ÓÞÑ„ÐBÏ*Î:ÍzÌëËŒËjËr˺Ë/ÌÛÌ·ÍÀÎõÏRÑÓÒvÔ6ÖØÚ Ü"ÞGàyâ´ä÷æ<é‹ëÔí&ðoò½ô÷HùˆûÃýöÿ*Mv‡¤ ¥ ±§‡lEã¤`!»"Z$ô%')‡*,l-Ñ.-0|1Ã2þ3.5R6f7o8h9O:%;è;‘<)=¡=>A>]>Y>.>Ö=W=¥<Æ;°:j9ë766N4)2Ú/N-œ*º'³$Š!J펳N ö µŠ‚šýÞúDøâõ¡óšñ¸ï î‡ì2ë êé+ènçÞæcææÎå¯åœå¥åºåâåæUæ—æææ4çƒçÕçècèšèÌèëèùèøèÙè­èXèùçhçÌæþå åäùâ¯á[àâÞ^ÝÇÛ$Ú€ØØÖ<Õ¦Ó,ÒÂЄÏ[ÎlÍšÌÌËmËq˪Ë̹̋͌ζÏÑ…Ò&ÔÞյפ٤ۻÝÜß âF䄿Ðèëgí®ïòIô”ö×øûSý‹ÿ»æ%6 E IE=%羈OÀ b" $£%4'À(<*¹+%-Œ.ç/:1ƒ2¿3ó4607=839$:ù:À;r< =Š=ì=4>V>\>4>è=q=Ç<ô;æ:¬9686­4˜2K0Ò-#+K(M%)"ì™4Ë]÷ ž W()þiûÃøYöôýñð\îÓìwë>ê9éQè”çúæyæ"æÚå´åŸå¤å³åÞåæIæ‹æÕæ&çrçÄçèUèèÃèåè÷èùèÞè·èiè è†çéæ)æIåMä+ãóáœà,߬ÝÜxÚÑØ+׉ոÓqÒ Ñ¼Ï˜Î“ÍÇÌ̵ËrËnËŸËþË›Ì_ÍYÎ~ÏÉÐ>ÒÒÓŠÕY×DÙ@ÛSÝqߣáÔãæ[è¦êóì>ïŒñÙó öhø©úåüÿMzœ»Ï à â æ×ˬb/÷¯j "¸#S%æ&q(ò)n+ß,C.¥/ö0C2‚3³4ß5÷689ó9Ñ:—;P<êP>Y>>>õ==åàt  F úƲ¼þðûIùÎö„ôcòuð³îí¹ë{êkéè¸çç‘æ5æåå¾å¢å¤å°åÕåæ:ææÅæçfç²çèFè„èºèÜèõè÷èçè½èzèèŸç çMævå€äbã3âÝàvß÷ÝcÜÊÚ ÙרÕFÔ¼ÒQÑûÏÏÎÇÍëÌ?ÌÅË~ËoË“ËëË{Ì6Í*ÎAÏŠÐõуÓ4ÕþÖæØÜÚíÜ ß3ájã§åêç6ê~ìÎîñeó²õó÷<útü°þà0Tf z € €wiM2Ù—` Ã!b#%•&$(§)"+•,.[/¸0þ1B3z4 5Å6Í7Õ8Â9¥:q;)<ÍH>W>D>>¢==IÐÏ÷ÍÍ[ÌߡËqËŠËØË]ÌÍöÍÏFЮÑ6ÓÞÔ¦Ö…Ø{ڇܟÞÉàûâ6å~çÀéì[î¦ð÷ò;õ‡÷Èùü?þwŸÊç    íÕ©{FÀf!#­$K&Ô'\)×*M,¶-/p0À13<4f5‹6˜7¢8‘9y:G;<®<6=²=>?>W>C>>°=)=l<‚;`:9‚7È5Ì3¥1C/´,ø) '$Ð 3Êbô— A åäÿýQúÆ÷jõ6ó8ñ_ïÁí?ìýêÑéÞèèUçÈæWææÌå­å£å¬åÆåïå$ædæªæ÷æFç”çåç'èoè£èÎèíèôèïèÌè”èCèÒçEç—æÊåáäÒãªâaáà‰ÞÝfÛÉÙ ØÖâÔSÓàÑ}ÐEÏ,Î>Í€ÌõË–ËvË€ËÊËAÌîÌÊÍÒÎ ÐfÑéÒÔLÖ(ØÚ Ü7Þ]àŽâÈä çPéëéí5ðƒòÍô÷Zù–ûÓý5\–­ ´ º´¦’rO!ë­e!À"`$ø%‰')*,q-Ñ.00y1Æ2ý3+5R6a7p8_9N:;â;Š<=™=ó=5>O>I>>Æ=B=”<®;œ:Q9Ô76342¼/6-‚*Ÿ'›$r!1Úw ¢< ì ¥„x–ý×úFøÝõ¦ó–ñÀï îì7ëê é1èwçäælææ×å´å¥å©åÂåæåæYæ™æëæ2çŠçÎç"èZèœèÆèçèòèòèÐè¤èOèêç_çºæóååäæâ¡áJàÓÞQݶÛÚrØÎÖ3Õ¡Ó%ÒÄÐ|ÏcÎkͤÌ̦Ë{Ë|˼Ë&ÌÍÌÍ ÎÎÏ"ÑŸÒ9ÔöÕÊ×¹Ù½ÛÏÝóß âZäœæàè,ëvíÅïò\ô¡öêø&ûfý˜ÿÉñ0D Q RRE1ðÇ‘R½ p" $©%9'Á(C*¹+*-‹.ê/;1‚2Á3ï46-7:8/9:ó:¹;k<ý<„=Ý=+>G>M>$>Ø=\=¶<Ý;Ñ:•98w6“4|260²- +.(3%"Õƒ¹Jé Ž J#þcûÁøWöôýñðcîÓì~ëEê=éZèœçþæ†æ$ææå¹å¨å§å¾åÞåæIæ‘æ×æ*çsçÅçèSèŽè¾èàèñèòè×è¬èbèýç~çØææ7å@äãæáŠà ßšÝÜjÚÅØ!׃ÕíÓqÒÑÁϔΜÍÇÌ*Ì·Ë„ËxË®ËÌ©ÌuÍlÎ’ÏÞÐTÒéÓ Õo×ZÙWÛh݈߶áëã,æoè¹êíQïŸñéó3öwø¹úöü*ÿ`ƒ¯Äß è ò ìæÑ¸–i:û¹n "À#U%í&t(ö)s+Ü,K.¡/ü0@2ƒ3³4Ý5ö689ê9Î:;H<âB>K>->ç=u=×<< ;Ò9i8Ê6ñ4ê2¤07.Ž+Ä(Ç%²"t-Æeó”5 í¼©´þìûAùÑöôgòtð¸î!í¿ë€êréƒèÂççžæ7æðåÂå«å©å·åÙåæAææÊæçeçµçèCè„èµèØèòèîèàè´èoèè“çýæ@æhåpäVã!âÐàfßéÝWÜ»ÚÙq×ÕÕ:Ô»ÒKÑýÏÏÎÉÍñÌFÌÍËŒËyË¢ËýˉÌLÍ;ÎWÏ ÐÒÓGÕ×÷ØöÚÝßJá|ã½åþçHê“ìàî,ñxóÁõøIú†ü¾þð@^u „ ‹ ‹ƒp[6Û§_ Ä!l#%ž&$(¯)#+š,._/¸02A3z4ž5Â6Ê7Ñ8½9Ÿ:j;!<Å>>H>2>÷=‡=û<-<=;:³87T5M31°.,Q)^&M# Ðv ¥8à ‘]AJÿtüÉùI÷óôÎò×ð ïqíì½ê§é³èäç?ç´æKæÿåÊå¯åªå³åÔåüå5æræ¾æçXç¤çñç9èvè«èÔèéèôèßè¿è}è%è°ççgæ’å äãZâá¨ß7Þ¤Ü ÛlÙÃ×$Ö‹ÔÓ‘Ñ>ÐÏûÍÍeÌåË•Ë|˘ËêËmÌ&Í Î"ÏZÐÆÑJÓõԽ֘ؖڗܸÞÛàãNåŒçÙéìoî¸ð óKõš÷ÕùüPþ²Ô÷  ' &"ûÚ´ƒJ ¿u!#¹$K&Ü'])Ý*M,»-/s0À13:4f5†6˜7›8Ž9t:A;þ;£<1=¤=ú=1>G>7>> ==XF>6>>´=/=€<™;†:;9»764ú1 / -d*‰'$Z!Ädø‘1 Û žvuý×ú@øßõ¤óœñÀïî•ì:ëêé9èçêævææàå¹å­å°åÈåëå æZæ¡æéæ9ç„ç×çècè’èÅèâèëèìèÇè›èEèßçRç¯æååÿäúãÓâ–á7àÊÞ>Ý®Û ÚhØÉÖ'ÕžÓ ÒÀЂÏ_ÎtͦÌ̱ˇˋËÉË9ÌÜ̴ͰÎåÏ5Ñ´ÒQÔÖä×ÎÙÑÛæÝà:âkä°æóè=ëŠíÕï"òjôµö÷ø8ûqý§ÿ×ÿ";O [ `YQ:üÉWÄ u"$¯%='Æ(H*¸+.-Œ.ë/=12¾3ò46/728.9:î:³;^<ú9>@>>È=F=¦<Ã;À:z98]6z4e20-ï*(%û!½n ¦;Ú ‚ @ þ]ûÁøUöôÿñðeîÞì€ëLêEé`è¤ççæ-æíå¾å±å¬åÅåâåæKæ–æÙæ+çvçÅçèOèŽè¶èàèçèïèÌè¦èUèôçoçÏæ æ.å,äãÓáàßÝúÛ_Ú»Ø×|ÕæÓnÒѿϗΟÍÎÌ3ÌÃˎˉ˽Ë"̼̆ÍÎ¥ÏõÐhÒÔ´Õ†×nÙnÛ|ÝžßÈáä?æƒèËêí_ï´ñöóDö‡øÅúý6ÿm‘¹Òé ô û ÷îÛ¾ p?»w "Ä#Z%ñ&w(ü)q+ã,J.£/ý0>2ƒ3²4Ú5ò68ü8é9Ä:‹;=<Û7>=>>×=a=Ä<ó;ñ:¼9R8±6Ú4Ð2Œ0.v+ª(³%–"c¹Nê~/ Þ·ž³þåûEùÌöƒôhòxð½î(íÃëŠêuéèÅç'ç¢æAæøåÈå³å®åÀåÞå æEæ„æÎæçiç´çèCèè°èÖèçèíèÓè°èbè èŠçìæ7æVåeäDãâ¾àZßÙÝKÜ®Ú Ùg×ÌÕ5Ô´ÒJÑúÏÓÎÌÍ÷ÌLÌÚË•ËˆË²Ë Ì¡Ì[ÍQÎkϳРҰÓ`Õ(×ÙÛÝ1ß^á’ãÏåèYê¦ìñî=ñ‡óÓõø\úüÏþû)Mi‚ ˜ “Žxe=ä«h É!s#%¤&'(²)&+œ,ÿ-d/´02A3u4Ÿ5¼6È7Í8¶9œ:_;<¹8>&>à==ß< <#;ú9›8795731–.ý+8)H&5# »_ü’*Ô „R;AÿtüÄùJ÷ôôÐòÜðïxíìÇê«é¼èëçHçºæVææÕå³å±åºåØåæ6æ{æ¼æ çWç§çðç7ètè§èÎèæèéèÝè±èxèè¦ç çZæ…å‘äãLâá›ß'Þ™ÜÿÚ]Ù½×Ö‡ÔÿÒÑ?ÐÏÎÍnÌëˤˇ˪Ë÷ËÌ8ÍÎ6ÏpÐØÑbÓ ÕÑÖ²Ø¥Ú´ÜÆÞöà ãdåŸçêé3ìîÌðóaõ£÷éù#ü^þ¼á ) 1 1)ÿç·ŽNÄ{!#¿$N&à'a)Þ*R,º-/t0¾1384d5„6”7•89i:=;ö;˜<*=•=ò=">8>)>í=“=þÕ| ( ôÔ×ÿþüJúÄ÷iõ9ó=ñhïÈíNìëãééèègçÖægææÞå¹åµå¶åÓåûå,æmæ²æúæKç–çâç)èièœèÉèàèêèßè¼è€è/è¸ç.çzæ²å¿ä¹ã‰âEáæßnÞçÜOÛ°Ù ØnÖÐÔNÓÒÑ€ÐBÏ2ÎIÍŽḬ̀ˊˤËäËgÌÍòÍýÎ3БÑÓ¸ÔwÖUØBÚNÜ`Þˆà·âðä4çvéÃë îZð¥òìô7÷tù·ûðý!Rv—°Á Ë ÍÈ·¥ƒb,ý·s#!Ç"n$þ%’')”*,u-Õ.00|1Ä2ú3*5J6]7e8X9B:;Ô;w<==ß=>5>+>ú=£==k<†;n:%9¢7ï5ý3á1Š/-O*n'j$E!²Né% Í —ln‹ýÐúCøÛõ¨óžñÄïîšìBëêé>è‡çòæ}æ%æèåÁå³å·åÎåñå%æ_æ¤æíæ;ç†ç×çèbèŽèÅè×èìèÞèÄèŽè<èÔçGçŸæÚåïäíãÄâ‡á)à»Þ1Ý¡ÛÿÙaغÖ&Õ“Ó!ҽЀÏhÎrÍ´ÌÌ¿Ë‘ËœËØËLÌïÌÃÍÈÎøÏJÑÌÒdÔ"Öö×çÙäÛþÝàOâ~äÅæéQëšíéï0òôÀö ùCûƒý³ÿä ,IZ e kcZB)Õ¡`Ë z"$¶%='Î(D*Á+,-.í/:1„2»3î46(708*9:é:¬;U<ó/>->>±=<=‹<µ;¥:e9ó7@6f4G20‚-×*(%â!«Tý-É v 5þUûÅøPöôÿñ$ðgîãì†ëSêMégè­ç ç“æ8æîåÏå°å¹åÈåêåæRæ˜æÝæ-çvçÇç èPèŠèµèÙèåèãèÊè˜èNèèçcçÃæÿåå äÿâÆáoàß„ÝéÛXÚªØ×nÕçÓcÒѾϘΦÍÒÌ=ÌËËË“ËÎË2ÌÎÌ™Í•Î¸Ï Ñ|ÒÔÉ՜׃لÛݲßßáäSæ•èÞê*ítïÁñ ôPöšøÑúýCÿzŸÄÞô öåɤ{E Æx %"Ç#`%õ&y(*s+å,J.¦/ú0A2€3°4Ø5ï6ü7ø8ä9¼:„;6<Ï+>>Ä=Q=°<ß;Û:§998š6Á4¶2r0.]+(š%€"K¡@Óu Ô¯•®þáûAùÌö…ôgòð¾î.íÉëê}é•èÍç/ç©æJæüåÓå·å¹åÂåæåæHæ‹æÎæçfç¹çüçFè|è¯èÐèåèãèÐè¢è^èûççáæ'æLåSä7ãâ®àLßËÝ=ܤÚÙ_×ÃÕ/Ô±ÒGÑúÏÓÎÐÍþÌTÌãË Ë–ËÁË̯ÌpÍcÎÏÉÐ2ÒÇÓtÕA×&ÙÛ,ÝIßpá©ãàå(èlê¹ìïPñ˜óáõ'øfú£üÛþ 8Vx‹ š ¡ ž–‚mF!ê²q! Ó!s#%¤&/(±),+›,.`/¸02B3u4œ5»6Ä7Ê8±9•:[;<¯<:= =õ=>->>Ò=h=Ñ<<;ã9€8ï65 3å0~.ã+).&#ì¦Jé À }G3;ÿoüÀùJ÷òôÔòÚðïzíìÍê±éÃèôçLçÄæ[æ æÛåºå¹åÀåßå æ:ææÀæç[ç¤çõç0èwè¡èÎèÜèçèÑè­èkèè–ççJæxåƒäqãAâõà‘ßÞŒÜñÚVÙ®×Ö}ÔúÒŒÑ<Ð ÏÎ"ÍvÌøË©Ë›Ë³Ë Ì’ÌGÍ5ÎGχÐîÑuÓ"ÕåÖÉØ¼ÚÇÜÞÞá8ãtå·çûéGìîÞð%ósõ²÷ùù4üjþ¡Æó $ 4 9 =2# ëÄ‘YÎ}!"#¿$V&á'f)ã*Q,À-/u0¿1364e5€6‘7•8‚9h:4;í;”<==â=>,>>ã={=ï%>>ë== =TÖp Ä ˆie…ýÏú@øÜõªóŸñÈïî›ìLëê!éGèŽçúæ…æ+æðåÈå¹å¿åÐåüå%æhæ¤æñæ<çˆçÖçè\èŽè¿èÓèåèØè½è‚è5èÄç=ç“æËåãäÜã¸âváà¨Þ(ÝÛöÙTØ´ÖÕ“ÓÒÁÐ}ÏiÎyÍ·Ì)ÌÆË Ë§ËéË[ÌÍ×ÍÛÎ ÐaÑàÒyÔ:Ö ØþÙ÷ÛÞ.à`â–äÕæébë¬íúïCòŽôÒöùUûŽýÅÿï9Rg p vmcM/ Û¨h#Ô }"$µ%F'Í(K*À+0-.í/<1€2Á3ç46708"9 :ä: ;S<ã#>>ö=£=%=z<ž;‘:O9Ù7*6L402é/i-¾*é'è$Î!‘Dä„¿ g *úþWû¼øUöôò$ðlîéìŠë^êNésè±ççžæ:æúåÒåºå¾åÐåíå"æVæ›æáæ/çwçÈç èPè†è²èÓèßèÝèÀè’èBèÞçVç·æòååäðâ¸á^àöÞoÝãÛDÚ§Ø×kÕÜÓbÒѽϜΧÍÛÌBÌÙ˥ˤËÛËCÌÞ̭ͨÎÎÏ Ñ‘Ò+ÔßÕ²×šÙ˜Û¨ÝÆßôá&ähæ§èóê9í‰ïÐñô`ö¨øãú#ýTÿ†¯Îíý  éתƒOÏ} *"Í#f%ö&(ÿ)x+è,J.¨/ü0=2ƒ3­4Ö5î6ø7ò8á9³:;*<È>ÿ=°=@=›<Ë;Æ:Ž9$8€6ª4œ2Z0é-D+x(%i"4ìŒ.Äg Ο”£þàû=ùÎö„ôkò€ðÃî3íÏë–ê‚éžèÕç7ç±æPææÚå¾å¾åÈåîåæPæŒæÔæçiç¸çþçAè|èªèÍèÝèÝèÈè™èTèñçqçÖææ?åCä)ãöá£à<ß¼Ý3Ü”Ú÷ØU׺Õ*Ô­ÒAÑþÏÑÎØÍÿÌ`Ìë˭ˤËÍË.ÌÁÌÍxΓÏÝÐIÒÜÓ‰ÕW×:Ù6Û@Ý^ß…áºã÷å7è‚êÉìïcñ¦óõõ2øwú²üçþBg€š ¢ ­ ¨ŸŽrR%ó¹v) Ö!{#%ª&1(·),+ ,.d/·02@3r4œ5µ6Ä7Á8®9:T; <¦>>Â=W=¼<ò;ý:É9o8Ò653Í0e.Ê+)&#׎;Ôq · n@+6ÿhüÄùB÷úôÏòãðïíìÒê¹éËèúçWçÊædææâåÄå¼åÊåáåæAæ€æÆæç\ç¨çïç4èqè èÇèÛèÛèÏè¡ècèèŽçòæCæeåyä^ã6âãà„ßÞ~ÜèÚFÙ©× ÖvÔ÷ÒˆÑ;ÐÏÎ,ÍzÌÌ¶Ë¥ËÆËÌ¥ÌYÍGÎ]Ï›ÐÒ‹Ó6ÕþÖÜØÑÚÛÜõÞáNã†åÉçêWì£îïð6óƒõÂ÷ú@ü{þªÖû/ ? E D?+ñË—bÖ‚!%#Æ$V&è'h)ã*X,»-"/q0À1354b5}67Ž8‚9^:/;ä;Š<=ƒ=Ö= >>>Ñ=i=Ý<<-;:´8$7b5m3;1á.P,)°&#z 3â~¸^  ßÄÌÿóüGúÁ÷hõ?ó@ñqïÒíXìëíéùè#èvçäæzæ æïåÇåÀåÄåàåæ9æræºæÿæNç™çâç'ècè™è¿è×èÝèÎè­èmèè¤ççeæ’å¦ä›ãkâ+áÆßUÞËÜ9Û–Ùû×XÖÈÔ@ÓÏÑ|ÐEÏ:ÎPÍ ÌÌÇË¦Ë¼Ë Ì…Ì8ÍÎ$Ï_йÑCÓßÔ¨Ö|ØrÚtÜŽÞ®àáâåWç éåë0î~ðÄòõU÷“ùÕû þ@h’®ÇØ à âÙϲ˜n= Ä€-!Ö"r$ &—')š* ,w-Ù..01¾2ü3"5G6W7[8Q91:;¾;k<õ> >Ù=€=öçˆç×çèZèŽèµèÕèÚèÓè²è{è*è»ç0ç…æ¾åÔäÐã§âiá àŸÞÝŠÛæÙMتÖÕŽÓҾЀÏkÎͽÌ2ÌÒˬ˶ËùËkÌÍêÍíÎ"ÐtÑöÒŽÔLÖ"ØÚÜ%ÞDàtâ©äéæ,évë¾í ðSòžôâö%ùcûžýÏÿÿ#H^q } zzkS;ä®n(Ú ""$º%J'Î(Q*À+1-”.ê/>1€2¼3é4 6"7&8#9:ß:™;J<Ù>ä===c<Œ;z::9À76042Í/R-¤*Ò'Ð$¹!y3Ït ¯ _ ÿñþOû¿øRöôò'ðsîîìëdêUé{è·ç ç¢æEææÕåÆå¿åÙåóå&æ\æžæäæ0çzçÆç èLè…è®èÍèÜèÔè¹è‡è8èÓçLç¦æçååääâ§áRàæÞdÝÕÛ;ÚšØýÖbÕØÓ^ÒѼϠάÍâÌKÌâ˲˱ËëËSÌñÌÀ͹ÎåÏ2ѨÒ@ÔôÕÇ×®Ù­Û½ÝÛßâ;äyæ¼èëJí›ïßñ-ôqö¶øòú0ýcÿ½Øú   õÚµ‰TІ -"Ò#h%ý&(*y+è,M.¨/ù0D2y3²4Ï5í6ò7ñ8Õ9³:u;%<¿<== =é= >>é=¥=*=‹<µ;±:y9 8k64‡2>0Ò-++`(k%P""Ó}³Y Ã˜Š¡þÛû<ùÌö†ômò†ðÄî;íÓëžêŠé£èàç9ç¿æSææßåÅåÆåÏåðåæRææÚæçoç´çè=è{è¦èÉè×è×è¾è‘èJèåçhçÈæ æ1å3äããá˜à+ß°Ý$ÜŠÚëØMײÕ#Ô©Ò@ÑüÏÕÎÛÍÍgÌö˸˳ËÛË?ÌÐ̗͉ΧÏòÐ^ÒñÓŸÕm×OÙKÛUÝrßáËã æJè’êÞì"ïwñ´óöAø‡úÀüõþ%Oq  ² ³ ´¨–z[+þ¾{/ Û!~#%ª&8(¶)1+ ,.f/´02;3u4—5´6À7»8¬9ƒ:Q;<¡<"=Ž=Ø=>>ó=³=@=¬<Þ;æ:¸9R8½6î4í2µ0K.±+î(þ%ð"Àz%Ãaþ« c7"3ÿcüÀùE÷õôØòàðï„íìÛê½éÕèÿç`çÑækææäåÏåÁåÏåêåæFæ„æÉæç]ç©çîç5èmèèÄèÑèÛèÁè›èYèøç‚ççæ1æ^åfäTã#âØàtßüÝpÜÛÚ=Ùž×ÖrÔðÒ‡Ñ;Ð Ï Î.Í„Ì ÌÂ˲ËÒË+̲ÌpÍVÎsÏ®ÐÒ¡ÓJÕ×ïØêÚîÜ ß/áaãšåÝç!êiì·îûðKóŽõÕ÷úPü‡þ¸â #= G Q OE7üÒŸg$Ù‰!)#Ì$[&ë'j)è*U,Ä-/u0À1þ284[5|6Š7Š8|9Y:';Ü;‚<=x=Ì=ù=>ø=¾=Z=Ç< <;ó9›87J5R3'1Ä.9,v)–&‰#a "És¯L Ô¼ÇÿîüEú¾÷kõ=óDñvïÒícìëùéýè,è}çíææ)æõåÎåÈåÉåæå æ=æwæ¼æçNçšçàç(è`è—è¹èÔèÕèÊè¡èfè è™ççUæ†å˜äŠãaâáºßFÞ¼Ü-Û‹Ùð×QÖ¿Ô;ÓÎÑyÐGÏ<ÎWÍ¥Ì ÌÏË´ËËËÌ–ÌKÍ'Î<ÏlÐÖÑOÓýԵ֖؆ڊܡÞÄàóâ.åiç±éøëAîðÓò!õa÷¥ùàûþHz›¼Óã é ïà×½œyDÌ…2!Û"x$&š'!)›*,y-Ù.101¾2û3 5D6S7W8L9,:;¶;d<ëù=Î=j=ç<,>Ò=‚=ýçæÖå÷äòãØâ–áEàØÞUÝËÛ,Ú’ØòÖ\ÕÓÓYÒÿнϢίÍéÌQÌðË»ËÂËøËgÌÍÔÍÌÎúÏFÑ¿ÒSÔ ÖÜ×ÄÙÃÛÑÝðßâQ䋿Ðèë\í­ïîñAô~öÇøû;ýsÿÈé  %ÿá¾Z׋ 4"Õ#m%'…(*{+ì,L.«/÷0C2}3ª4Ñ5æ6ñ7ê8Ó9©:n;<²<4=–=Ù=>ÿ=Þ===t<¡;:b9ö7P6{4j2+0µ-+G(S%;" Ái ¤Iö ·„™þÛû6ùÏö„ôpòˆðÊî>íØë¤ê’éªèççCçÂæ_ææéåÍåÊåØåóå"æUæ”æÝæçqçµçþç?ètè§èÁèÓèÑèµèŒè:èàçXç¿æüå$å&äãÖáˆàߥÝÜ€ÚàØDשÕ!Ô ÒCÑøÏÚÎÜÍÍmÌÌÄ˾ËíËMÌä̧ÍλÏÑrÒÔ¶Õ×hÙ]Ûk݈߮áããæ_è¦êíì9ïñÍóöWøúÐüÿ4[˜¯ ¹ ¿ ½± „_7Æ„1 ä!€# %¯&:(»)3+¢,.e/¸02>3p4–5°6»7¸8¥9€:F;ù;˜<=…=Ê=ú=ÿ=ç==3=”<Î;Ï:¢9;8§6Õ4Õ2›03.›+Ó(è%Ù"¨h²Pð Y--ÿ`ü½ùE÷õôÚòãð"ï‹íìâêÄéÙè ècçÛæsæ#æðåÑåÉå×åìåæIæŠæÊæç[ç­çìç6èhèŸè¹èÔèÍèÀè‘èNèñçsçÞæ#æQåUäJãâÎàdßîÝdÜÑÚ/Ù˜×öÕmÔëÒ‡Ñ6ÐÏ Î6Í‹ÌÌÎËÀËßË<ÌÄ̃ÍjÎ„ÏÆÐ*Ò¹Ó^Õ*×ÙÿÚÝ"ß?ávã­åïç3ê}ìÄîñXó õâ÷#ú_ü–þÄó3C V Y ZO?$ܤp(â!0#Î$`&ì'p)è*Z,Ã-/w0½1324^5w6†7†8v9T: ;Õ;w<=k=Á=ì=>ê=®=I=³<ö;;ß9ƒ8ö645831ª. ,^)~&r#L ¹\÷@ È·¼ÿïü=úÁ÷hõAóGñxïÙífìëýéé2è„çöæ…æ4æøåØåÌåÓåéåæ@æ|æ¿æçNççßç'è_è’è·èÍèÐèÁè›è]èèŽçúæHæ|å‡äãOâ á¯ß5Þ³ÜÛƒÙæ×IÖ¸Ô7ÓÉÑzÐFÏ@Î]ͬÌ)ÌÛËÁË×Ë)̧Ì\Í<ÎMÏ„ÐæÑiÓ ÕÐÖ§ØÚžÜ¶ÞÙàã>åçÀé ìRîŸðçò,õv÷°ùóû%þZƒªÇÞí ÷ ôðÜÇ¥€JÎ5!á"|$& '#)*,z-Ü.00€1½2û35D6N7T8G9&:ú:¯;Y<â<`;R: 9“7ç5ý3ì1˜/#-s*¢'¢$‹!Q±Hò G èëþMûºøQöôò3ðxîùìžënêgé†èÉç.ç²æUææçåÐåÐåâåÿå0ædæ¦æêæ1ççÅç èHè~è¨èÄèÐèÅè¬èrè(è¹ç6çŽæËåèäæãÆâ‹á6àÈÞLݹÛ&ÚƒØíÖRÕÎÓVÒûÐÀϡθÍíÌ]Ì÷ËÉËÎË ÌsÌÍàÍæÎÐ^ÑÑÒjÔ Öò×ÙÙ×ÛæÝà/âdäæäè'ëoí¼ïòLô‘öÓøûLý{ÿ®Óò + .'ìÛ_&Ý :"Ø#u%þ&Ž(*€+í,N.¬/ø0B2y3­4Ì5ç6é7ç8Ë9¦:f;<©<*=‰=Î=ó=ï=Ñ=~==b<;…:O9Ú7>6]4U20ž-ü*/(;%%"ô­Tù”:í ©Š|•þÖû8ùÌöˆôrò‰ðÒî@íâë¨êœé®èðçJçÊæhææîå×åÍåßåúå$æ\æ–æÞæ%çoç¸çýç>èrè¢è½èÏèÈè°èè6èÑçPç®æôååäýâËáwàß•Ý ÜtÚר9×¥ÕÔŸÒ?ÑûÏÚÎáÍÍvÌ ÌÑËÌËüË_Ìó̻ͰÎÒÏщÒÔÈÕ˜×xÙuۀݛßÂáøã.æsèµêíGï”ñØó"öbø¢úÜüÿ?hŠ¥º Ã Ê Æº©Šh?Ï…= å!‰#"%³&=(¾)4+¥,.f/·02<3n4•5«6º7²8Ÿ9z:>;ô;‹<=u=Á=è=ô=Ò=‘==ƒ<·;»:Œ9&8Ž6½4¾20.+º(Ó%¿"—OCÞ– I)*ÿ[ü½ùB÷ùôÚòéð%ï‘í#ìæêÏéÛèègçææwæ,æ÷åÙåÐåÜåôåæOææÍæç]ç¬çíç2èiè—è»èÇèÌèµèˆèFèåçgçÓææCåJä7ãâºàXßáÝUÜÅÚ&ÙŠ×õÕbÔéÒƒÑ6ÐÏÎ<Í•ÌÌÜËÉËóËHÌØÌ‘Í€Î˜ÏØÐBÒÌÓvÕ=×ÙÛÝ3ßVáŠãÀåèEêŽì×î ñjó®õô÷1úmü£þÔü!:S ] h `ZH*ܳq2æ’!6#Ò$e&ð'r)ë*\,Ã-!/u0À1ý224Z5u6„7€8p9N:;Ì;q<ñ9&:ì:­;L<ÛÑùÏÞÎäÍÍÌÌáËÖËÌkÌ ÍÌÍÅÎåÏ/ÑžÒ2ÔÝհ׌ٌەݮßÜáäFæ„èËêí]ï¡ñíó1örø³úèü"ÿJy“´Â Ñ Ô Ðij“rDÕŒB ë!Œ#)%µ&E(½)<+¢,.e/·02;3m4’5ª6³7±8™9s::;ç;ˆ<=l=µ=Ú=ç=À=‚= =s<Ÿ;¨:r98s6§4ž2l0þ-h+£(¶%ª"~<éŒ0І @ÿ[ü¶ùC÷÷ôÜòêð+ï‘í-ìèê×éåèèsçêææ4æýåáå×åáåúå"æTææÒæçaç¬çìç3ècè—è²èÆèÃè­è€è=èØç`çÁæ æ3å=ä&ãúáªàKßÐÝLÜ´ÚÙ×ëÕ_ÔáÒÑ6ÐÏÎ@ÍÌ%ÌçËØËÌYÌệ͖ΫÏìÐ[ÒÝÓ‘ÕP×2Ù)Û/ÝIßmáœãÖåèXê£ìæî4ñyóÁõø@ú~ü°þâ ,H^ i r jfN9ë´|8ë›!7#Û$e&÷'s)ï*^,Ä-#/v0¾1þ214V5u6~7|8m9F:;É;b<î2y3©4Æ5á6á7Þ8Á9˜:W;<—<=r=¶=Ô=×=ª=a=Ý<@<_;^:9±76342á/j-È*þ' %õ!É1ÐvÏ —tnþÊû6ùÉöˆôxòð×îNíéëºê£éÃèúç\çÙæuæ+æþåáåÞåêåæ/æcæ¡æàæ,çpç»çûç:èoè˜è·èÀè½èŸènè"è»ç8ç—æØåøäüãââ¬á]àôÞzÝñÛYÚÄØ%×–Õ Ô—Ò;ÑùÏàÎéÍ ÍŠÌÌíËãËÌ~ÌÍßÍØÎøÏFѱÒJÔñÕÆ×¤Ù Û©ÝÇßéá"äSæèÙê(íhï¸ñúóBö‚øÀúøü.ÿZ‚¥ºÒ Û Ý ÛÍ»œ{JÚ“I î!–#'%¾&D(Ã);+¨, .j/µ0283n4Œ5«6­7¬8“9m:1;ä;z<ûïÀ€@ðŸ!>#Ü$n&ô'|)ì*f,À-(/r0Â1ü2/4V5p6|7y8f9B: ;¿;\<á8°6è4ð2¿0c.Ð+)1&.# Ë{#Çj Õ±›­ÿÞü8úº÷kõFóKñ‡ïäíxì/ëêéHè›ç ç¡æEææëåàåçåùå!æMæ‰æÉæçTçŸçàç#èZè‡è«è½è½è¬è€è?èåçiç׿"æNåbäNã&âàà~ßÞ…ÜþÚ]ÙÊ×/Ö¥Ô'ÓÂÑuÐLÏJÎkÍÄÌDÌÿËåËÌSÌàÌÍy·ÏÇÐ#ÒªÓOÕ×îØÛÚÞÜ÷ÞáJãwå¼çúéCì‰îÓðóaõŸ÷ãùüQþƒ«Ïí   úß“g(èœJ!ï"‹$&¨'0)¤*,~-ß.201¾2ò3556J7E889:á:;;<È<6=Š=¾=Ò=½=‰=%=™<ß;ñ:×9ƒ8þ6D5Q311×.V,)Ç&Á#§ l#ÊoÁ z N4?jýºú9øÜõ±ó¯ñÞï6î¾ìlëKêIésè»ç)ç°æ[ææôåäåáåùåæFæ}æ¼æçGçŽçÕçèPè€è£èºè½è±è‡èQèòç†çñæHæwå“ä‚ãcâáÇßWÞÕÜIÛ®ÙØ}ÖòÔpÓҴІÏxΗÍãÌ[Ì ÌéËþËGÌÀÌoÍIÎSχÐßÑ_ÓûÔ¸ÖØzÚ}܌ޮàÙâ åKç‹éÑëî^ð¬òìô4÷qù®ûåýBdƒš¨ ³ ¯«˜ƒb: ÑHó Ÿ"8$Ñ%['à(]*Ï+:-—.ñ/<12¶3à4þ578 9ç9»:v;<«< =x=µ=Ì=Ã=’=9=µ<<"; :Ê8G7Ÿ5²3ž1P/Ò,**T']$C!Êo¶l  íÐÑùý?ûµøRöôò4ðîí²ë€ê}é›èàçCçÉælæ$æýåäåãåôåæ=æqæ°æòæ:ç€çÈçèBèzè˜èºè¹è´è‘èYèèœç çlæ å¿äºãâ\á àÞ"ݘÛýÙjØÍÖ@Õ»ÓMÒöÐÁÏ­ÎÁÍÍtÌÌîËúË6Ì©ÌJÍÎÏJЛÑÓªÔcÖ2ØÚÜ$ÞFàkâ¡äÚæé`ë©ííï:ò{ôÄöÿøAûsý«ÿÑý3A K NF8"ܰw8ò¡ I"ç#% '•(*…+ò,S.¬/ü0>2y3£4È5Ù6à7Ø8¹9”:L;ÿ;‹< =d=ª=Ç=Å==J=Ï<)ÌúËùËÌÌÍÎÍ·Î×ÏÑƒÒ Ô·Õ×\ÙSÛXÝsß•áÆãûå?è|êÇì ïVñšóáõ!ø`ú›üËþý#G_v } ˆ ~yaI#úÄ‹Aû !G#à$p&ü'z)ô*b,È-#/x0»13*4W5k6x7u8`9=:;¶;T<ÖîÀìwëMêSévèÈç+ç½æ_æ#æüåçåëåüåæJææ¾æçHç‘çÓçèJè€èœè¸èµè«èèFèêçzçææ;ækå€äzãPâá¸ßIÞÈÜ=Û¤ÙØwÖêÔkÓҲЉÏ{ÎÍéÌeÌÌõË ÌVÌÑÌÍ[ÎiÏ—Ð÷ÑqÓÕÍ֥؎ڒܢÞÃàëâ$åYç¢éãë+îrðºòýôD÷ùºûõý Oq©¯ ¿ ¹³¤‰kAטLü  "@$Ó%a'ã(`*Ð+<-™.ð/<1~2µ3Þ4ý5 789æ9²:m;<<=j=§=À=±=„='=¢<ð; ;ú9¯857‚5ž3‚17/»,*>'A$.!ø´_ª\  âÆÌðý>û°øTöôò8ðî í¸ë…ê„é£èæçMçÐæsæ,ææéåìåùåæCæuæ³æ÷æ9ç„çÆçèCèrè›è¯èºè§èŽèJèèŠçç[æ”å³ä¨ãâNáýß‘Þ݉ÛõÙ\ØÈÖ5Õ¸ÓGÒöÐÀÏ®ÎÉÍÍÌ!ÌüËÌE̺Ì\Í2Î1Ï_аÑ)Ó¿ÔyÖFØ3Ú,Ü;ÞXàâ´äðæ.étë¹íðGò‘ôÏöùMû‚ý¸ÿà %>M V WR@. èµ@õª L"í#†%'›(*Š+ò,W.«/ü0=2x3£4Å5Ö6Ý7Ð8º9‡:K;ò;…<ÿàÙÞ`ÝÖÛDÚ­Ø׆ÕÔÒ6ÑüÏáÎõÍ,ÍšÌ2ÌÌÌ9Ì¡Ì=ÍÎÏ"ÐnÑßÒrÔ Öð×ÑÙÊÛÕÝðßâHäæ¼èëDí“ïÕñô_ö¤øÜúýIÿv›¾Óè ò ð òÝЫV,á§M þ!›#4%Ä&L(É)@+ª,.g/»0ý183k4‡5¥6¥7£8ˆ9a:!;Ô;e<éþ¤Mõ¤ d :!7\ýºú1øßõ±ó·ñãïAîÆì}ëUêYéèÊç8çÂæfæ,æÿåôåìåææRæƒæÄæçMçŽç×çèKè|èšè°è±èŸèzè:èáçmçÛæ+æaåqälãBâá¨ß=ÞºÜ1Û™ÙØmÖåÔhÓҴІςΠÍóÌnÌÌÌÌjÌáÌ”ÍoÎ{ϯР҉Ó(ÕåַبڥܷÞÖàã3åtç¯éøë<î„ðÊòõP÷’ùÉûþ/Z}¯Á Ä Ç»®‘sIßR!£"G$Ô%g'æ(a*Ô+<-›.ñ/;1~2²3ß4ø5 7 8þ8Ý9­:e; <–< =`=™=°=¥=p==<Ý;ö:â9š87m53l1/ ,÷)%'+$!ãŸNóJ ÔÀÂðý8û²øQöôò?ð‘îí»ëŽê‹é©èïçSçÙæzæ5æ æòåòåÿåæHæxæºæöæ>çƒçÆçè?èsè’è¯è¯è¥è€èHèòç…çøæMæŒåä£ãzâDáîß‚ÞÝ}ÛéÙUؼÖ2Õ°ÓGÒôÐÀÏ´ÎÊÍ͉Ì*Ì ÌÌXÌÉÌpÍBÎJÏlÐÍÑ7ÓÝÔ‰Ö`ØEÚDÜOÞnà•âÈäçAé‡ëËíðXò ôáö ù]û“ýÂÿó6GY b a[K5ð»ˆEý® R"ô#†%'™(*+ò,Z.«/ý0<2w3£4¾5Ø6Ô7Ñ8®9…:?;ì;z<ó÷ùôãò÷ð9ï§íAìëñéé7è“çç¡æOææûåóåûåæ7æfæžæáæ çiç­çîç)è`è…è¥è­è«èŒèbèè²ç-ç’æÖåûääîâ¿ásàßÝÜŠÚîØ^×ÈÕIÔÏÒ{Ñ4ÐÏ$ÎW;ÌNÌÌÌ<ÌÌ-ÍôÍßÎÐ?Ñ®Ò7Ôãի׈Ù~Û…Ýß¾áðã$æcè¦êèì3ïwñ½óöCø|úºüçþ<axŒ • š –ŠtZ4Ô”T ±!K#í$w&()ö*h,Ê-&/x0¼1ü2(4Q5f6p7k8V9/:õ:§;><Å<&=x=›=©=Š=G=Ûü®[!ý"™$)&¸'3)²*,‡-à.40~1¹2ð35/6<798'9:Ì:ƒ;"<ª<=f=•=¥=‘=T=ñ<_<¡;³:9A8³6û43å0Œ.,U)z&#_ .ã”8æ” ] '#&]ý³ú0øßõ²ó¸ñèïEîÍì€ë[êaé†èÕç>çÈæræ/æ æöå÷åæ'æUæ‰æÆæçNç‘çÖçèJèvèšè¨è®è•ètè/èØçbçÍæ!æNåhäYã7âòàœß.Þ®Ü%ÛÙû×eÖßÔaÓÿѱЊσΧÍùÌwÌ,ÌÌ)ÌxÌó̦̈́ΎÏÅÐÒŸÓ=ÕúÖÐØ»Ú¼ÜÎÞèàãEåˆçÄéìQî•ðÜò!õ_÷¤ùÖûþ9kЦ¿É Ò ÑÄ·™~O"ä¥Y!«"H$Ü%g'ë(b*Ú+;-Ÿ.ï/>1y2µ3×4ú57 8ö8Ú9£:`;<<ý ø ͳÁãý:û­øQö ôòAð—îíÁë—êŽé²èöçZçáææ=ææüåôåæ æKææ¸æûæAç€çÌçèAènèè©èªèžèxè>èéçyçíæ@æ|å“äãpâ1ááßtÞûÜnÛàÙGظÖ%Õ±Ó<ÒøÐ½Ï¹ÎÏÍÍŽÌ<ÌÌ'ÌcÌÞÌÍ[ÎWωÐÚÑTÓëÔ¤ÖsØ\ÚYÜeÞƒà©âÝäçVé—ëßí$ðlò®ôóö/ùoû›ýÙÿõ':Wc l mcV<÷ÄŽL³ X"ø#Œ%'Ÿ(*+ø,U.°/ú0=2t3 4¿5Ñ6Ò7É8«9|::;ß;s<èÝÁÛ+Ú™Ø×uÕøÓ†Ò4ÑüÏçÎýÍ;ͨÌIÌÌÌYÌÃÌ_Í.Î'ÏLКÑÓžÔNÖØþÙôÛÞà=âq䥿çè(ëmí´ïúñ?ôöÀøýú3ýeÿ’´Öíý  ôÞÀ˜m2÷­^ "¦#>%Ê&U(Ë)H+­,.l/·0ÿ153f4…5›6ž7™8}9S:;À;U<Ñ<2=s=—=˜=r=)=¯< <<;6:9š7ú5+4"2ê/ƒ-è*'(>%3"І1ÙŠ> èçÿDü«ù?÷ùôåòúð<ï®íEì ë÷ééBè–çç§æWæ%ææúåÿåæ8æoæŸæåæ$çhç®çïç'è^è~è£è¦è£è‡èUè è§ç!ç†æÈåíä÷ãàâ®áfàßÝÜ|ÚçØR×ÃÕ@ÔÏÒtÑ:ÐÏ-Î[ÍÈÌVÌ%ÌÌLÌ­ÌBÍÎøÎÐVÑÅÒJÔüվנٔۚݰßÖáä9ævè¸êüìEï‡ñÐóöTøŒúÆüøþ$Mi‡” ¥   ¥Ž‚`?Ý›X ²!V#ê$&(…)û*g,Î-$/y0»1ú2*4J5e6j7h8N9*:ë:Ÿ;5<º<=i=Ž=™=x=8=Å9ã7L6…42X0ý-k+²(Ò%Ì"­s,ׂ/å ª‡{•ÿÍü,ú¸÷jõLóZñ“ïûíŒìGë-ê6éhè¹ç*ç¼æfæ.ææûåÿåæ7æ]æœæÑæçYç¡çâçèSè{è™è§è¥è‹èbèèºç>ç£æðåå'äãëá¦àJß×ÝWÜÉÚ7Ù ×Ö†ÔÓ±Ñ{ÐNÏ[΃ÍäÌmÌ(Ì!Ì>Ì›Ì"ÍÝÍÆÎÚÏÑzÒÔ¤Õi×?Ù6Û1ÝMßfá™ãÉå èFêŽìÏîñ^ó õâ÷úYü‰þ¸âþ. ; A =/!â´€Fµ^!#š$2&µ'<)¯*!,†-á.50}1¹2ï35/65768 9ý9Æ:z;<Ÿ<=[=†=˜=~=D=Ü1z2°3Ù4ò57þ7ö8Î9¡:S;ü;<ø2p3Ÿ4¹5Î6Î7Á8§9r:5;Ô;k<Ù<:=q==‡=Y==‚<Ù;ø:î9«8:7Ž5µ3Ÿ1c/è,P*~'•$ƒ!YÍz#× cGMpþ»û+ùÈöôò¢ðíîhíìØêÉéäè#èçþæžæNæ$ææææ"æHæyæ³æðæ4çyç¸çüç/èeè„è¡è¢è›èwèBèïç„çýæYæ”å´äµãšâeáà±Þ5ݳÛ!ÚŽØüÖnÕóÓƒÒ4ÑüÏëÎÎAÍ´ÌQÌ)Ì,ÌkÌÐÌuÍ>Î<Ï`ЬÑ!Ó¯ÔfÖ,ØÚ ÜÞ,àTâƒäºæûè7ëíÃï òMô”öÍø û@ýrÿžÀãö   ÿåÈ s9ü³b "¨#B%Ð&S(Ô)D+³,.l/¸0ü163`4‡5‘6¡78|9H:;´;M<Ä<'=e=‹=†=e==Ÿ<÷;(;!:ë8„7ã54 2Ð/j-Ð*()%"ù»t Ìy5 âáþþBüªù>÷üôçòñ>ï¶íIìëýééIè çç¯æ`æ)æ æþåææAæmæªæâæ)çkç¬çîç&èZè€è˜è¥è›è~èMèÿç›ççwæ¾åÝäìãÎâ¤áTàöÞÝþÛoÚߨG×ÁÕ7ÔÎÒqÑ9Ð!Ï-ÎfÍÎÌcÌ1Ì)Ì[ÌÀÌPÍÎÏ*ÐiÑÙÒaÔÖÔ×´Ù©Û®ÝÇßçáäJæ‹èÉê íVï—ñáóöbøšúÕüÿ2Ww‘Ÿ ¯ « «›ˆhGã¢] ¶!Z#ï$ƒ&(‡)ü*j,Ë-)/v0¼1ø2$4L5_6h7a8K9:ê:;3<¨<=V=†=…=l=$=²<ãâÕà„ßÞ–Ü ÛyÙé×UÖÒÔYÓûѰЎψζÍÍÌCÌ(ÌLÌ“ÌÍÈͬηÏíÐIÒËÓfÕ(×úØçÚåÜ÷Þá>ãrå©çìé+ìsî¸ðýòAõ÷¿ùöû-þWƒ¢ÀÔÞ æ ãÙÇ®ˆd*ö¯c!±"T$ß%q'ï(i*Ù+@-.õ/71}2¬3×4ò5ü6þ7í8Ë9•:P;ì;}<åçÈæzæ9æææ æ"æ;æmæ æÜæç^ç¢çßçèKèvèè›è˜è}èMèè¡ç*çˆæ×åüä äúâÑá†à0ß»Ý=Ü³Ú Ù×Ö€ÔÓ±ÑwÐUÏaÎÍôÌÌFÌ6Ì`̺ÌEÍÎíÎÐCÑ£Ò-ÔÑÕ’×oÙ\Û`Ýsß“á¿ãôå,èpê­ì÷î9ñóÂõÿ÷=úsü§þÒû3G Q T RA3ñÄV Ãh! #§$4&Á'=)¶*",Š-á.60|1·2ê35$617+89ò9µ:j;<ˆ<ô<==m=x=_="=¹<$è¥ç-çÊææXæJæBæNænææÆæþæ<ç|çÂçýç@èoèè¿èÎèÕè¾èœè\èè”ç ç^æ—å±ä°ã‘â]á à©Þ1ݯÛ'Ú™Ø×ÕÔ½ÒuÑOÐLÏsÎÀÍGÍíÌØÌçÌ1ͨÍSÎ&Ï.ÐUѪÒÔ³Õg×0ÙÛ Ýß&áEãsåçÞéìSîŽðÇò õ<÷wù¥ûÔýûÿ7KZ_ _ VE- äµz;óŸG æ!x# %‹& ()ç*L,£-ñ.90q1¢2Å3Ü4è5à6Ò7©8x9*:Í:X;Æ;.â+c)¯&å#ë çÀ”]ó Á ±¦ÅúþWüØù~÷TõPóxñÐïGî÷ì¿ë¼êÒéélèóçƒç?ççèæáæáæüæçIç{ç»çóç9èuè±èìèé@éPé^éOé6éé´èVèÏç=ç}æ®å¹ä±ã†âLáôßÞÝŸÛÚ™Ø׬ÕOÔÓÜÑÍÐîÏ.Ï¡ÎAÎÎÎAΩÎ8ÏûÏæÐûÑ8Ó–ÔÖ³×lÙ9ÛÝßá#ã>å`ç†é²ëáíðDòkô¡öÂøðú ý+ÿAQ\`] R B $ Û°t5ìžCä| "”#%ˆ&ø'Y)½* ,Z-˜.Ï/ý0233>465%67Î7ˆ8,9¾93:“:Õ:ô:þ:×:•:%:9Ç8×7®6a5Ô3#250.Ô+a)Â&$!  꾎e@ .2J‰ÿãücúøÛõÛóþñRðÊîní=ì)ëHêyéÚèOèæç”ç_ç8ç0ç,çCç_çŒç¼ç÷ç4èrè²èîè$éVéyé–éœéœé~éTé é°è4è¤çóæ#æAå5ä!ãàáà8ßÏÝVÜØÚ\Ùâ×tÖÕÌӡҒѨÐéÏPÏìέάÎÌÎ+ϱÏcÐMÑMÒ‡ÓÕÔNÖß×ÙRÛ,Ýßáã,å?çdé…ë®íÕïò(ôOörø’ú¯üÃþØßêæÜÓ ¶ ŸtKÛ•Gø•7ÊT!Û"V$È%8'•(ô)E+Œ,Í-/+0M1_2i3c4P5/6ú6·7\8ð8j9Ì9:>:C:-:ì9Š9ù8B8X7C6ÿ4‚3Þ10ö-Ã+Y)Î&$E!ZR<öÒº ¬³Ônýðú˜øhöaô„òÔðIïêí³ìžë¶êäéAé°èFèïç´ç‹ççxçŒç¥çÎçþç5èrè®èîè)éaé‘é¹éÒéäéÞéËé¡é`é é–è èdç›æ¿åÀä¯ã|â>áàß€Þ Ý”ÛÚ¥Ø;×ÝÕ”ÔeÓUÒgÑŸÐБÏTÏAÏ_Ï®Ï)ÐØÐ«Ñ¬ÒÑÓÕ‡Ö Ø²ÙlÛ;Ý ß áãå&çBéYëí›ïÃñäóö#ø8úSü`þpsxleL 6 è·~?ö¦N "Ÿ# %x&Ô'-)~*Á+-1.]/z0Ž1–23{4]5%6ç6Š7$8Ÿ89P99Œ9~9C9ì8b8¸7Ø6Ó5–403’1Ì/Í-¨+P)Ö&/$o!ˆ–†wWB, ( 6U›ôý|û!ùñöêô óVñÈïgî)íì#ëRê§éé¥èIè èáçÊçÉçÑçîçè?èvè­èîè'éhé›éÎé÷éê(ê!êêëé¸éaéõèrèÏçç=æEå>äãÛáŠà,ßÂÝOÜÛÚjÙþ×¥Ö[Õ)ÔÓ&ÒWѹÐ<ÐùÏÙÏóÏ3ШÐIÑÒ ÓÔfÕ½ÖDØÖÙ‹ÛQÝ&ßáãåçé:ëJímïƒñ¢ó¹õÓ÷äù÷ûþ ùéÐ ¯ Œ X*è§X¬Dâdók!ã"Q$µ%'i(´)ü*1,j-‰.®/¹0Å1»2©3ˆ4U56¾6S7Õ7@8Š8Ã8Ô8É8ž8D8Ò7%7Z6\5.4Ö2G1/¤-ˆ+E)Ö&C$!¼ÐÓ˸ªŸ   ³Ú~þü©ùz÷nõ‘óÕñJðßî¤í†ì•ë¾êêxéé¥èeè2è èè!è0èWè‚è´èîè(éfé¡é×é ê3êUêgêiê]ê=êê½éRé×è;èˆç¸æÌåÈä¨ãyâ.áÙßsÞÝšÛ(ÚÆØf×"ÖîÔÙÓäÒÒhÑïИÐ{ÐпÐ'Ñ»Ñ}ÒfÓwÔªÕ×sØÚ©ÛgÝ5ßáãüäùæéë%í6ïMñ_óvõ÷˜ù˜û¨ý ÿ¤•‡pR /  Ò–Z ¿g£0¾=º *"˜#÷$U&¥'ñ(1*k+™,À-Û.ê/ô0å1Û2¯3ˆ4<5ó5‚6 7v7È7888ï7¦747˜6×5á4Æ3u2ù0M/r-g+1)Ö&N$­!ã   +]¡ÿŠü1úøóõôVòÉð\ïîüìì+ëvêÞécéé»èŠèkècèhèyèžèÁèøè*égé¤éÛéêGêqê”ê¨ê¯ê¥êˆêYêê²é9é¦èúç0çOæQå=äãÒá€à&ß»ÝWÜèÚ‡Ù-Øäֳ՜ԡÓÏÒÒœÑAÑÑÑKѤÑ7ÒãÒÌÓÉÔûÕ>×­Ø/ÚÍÛÝDßáÿâñäèæìèíêýìïñ"ó/õ<÷BùHûGýCÿ;*ú×° € G Â}!ÍcþˆŽ s!à":$˜%ã&-(l) *Ð+ò,./"012à2³3p45¸5>6¯67C7a7c7E7ÿ6™66P5e4X32§0/=-@+)Ë&Z$Á! =Xklry † ¨×!Šÿý¸ú†øyö—ôÙòEñ×ïîqírì™ëßê?êÇé^ééáè»è³è±èÄèßè é4éoé éãéêSê„ê®êÔêèêôêíêÒêªêdê ê›é éjè¨çÎæØåÎä¨ãqâ+áÏßvÞ Ý©ÛGÚðØ©×wÖ[ÕbÔ‰ÓÑÒMÒåÑ¸Ñ­ÑØÑ(Ò®ÒTÓ.Ô$ÕGÖ…×åØ`ÚóÛœÝZß&áãéäÚæÒèÓêÑìÝîÞðéòîôóöõøòúñüâþØ¿¨†_3 ý  7ã“'ÎTågßX¿ ("‚#Ø$%&j'§(Ù)+',?-O.P/G0412á2 3M4ì4q5è5>6„6¤6°6•6Z6û5q5Å4ê3ã2°1O0½.-+)Å&Y$×!+m•²ÁÏá ô R  “ý;û ùüöõXóÄñQð ïãíåììIë¤ê)ê¸éqé3éééþè é(éIéxé¬éâéêTêê¾êñêë-ë4ë5ëë÷êºêeêüéuéØèèKç_æ[å=äãËá€à%ßÄÝeÜÛ°ÙoØ6× Ö ÕBÔ‹ÓøÒ’ÒUÒGÒfÒ¯Ò(ÓÇÓ’Ô„Õ–ÖÍ×"Ù“ÚܽÝnß4áãçäÌæÀè³ê²ì®î¯ð±ò­ô±ö§ø£ú˜üˆþtX;è· } > ø¨V÷•)¸?»9£ r!Æ"$c%ª&ã')>*\+t,€-.w/c0>12Î234§45{5Á5é5ù5ä5´5X5ß464j3o2F1÷/p.Ç,ç*ã(±&]$â!K–Ï÷,Ac ŽÉ‰þ¿ûù÷›õÖóAòÍðïZîSíqì³ëë‰êêÆéŽé`éRéHéXéléé»éëé!êZê’êÌêüê,ëNëlëzëyëhëDëë½êZêÚéDé’èÈçàæèåÑä¬ãnâ+áÑß~ÞÝÅÛsÚ.Ùú×àÖÞÕþÔCÔ¦Ó?ÓöÒâÒöÒ6Ó¦Ó:ÔüÔáÕêÖØ_ÙÊÚFÜß݇ßFá ãæäÁæ¯è›êì‰î~ðzòsôlö_øWú=ü2þõϦrA ü ½ pÆdýŽšˆú\½ "c#¨$è% 'P(t)–*§+²,¶-¥.–/l0B1ý1±2O3Ý3Q4¸4ý4.5@545 5¶4I4¤3é2ô1Þ0•/$.,¶*¾(&W$í!a¿5`~¥È ü@•’þAü úøöUô¿òDñùïÉîÇíÜììqëèêxê"êáé¹éžé˜éŸé¶éÔéûé/ê^ê™êÑêë=ëgëë®ë¹ëÂë­ë”ë^ëëºê:ê°éé@èeçnæeåBäãÎá…à,ßØÝ€Ü2ÛðÙ»Ø¡×œÖºÕøÔZÔçÓšÓÓ‡ÓÄÓ"Ô²ÔfÕCÖB×cØ¥ÙÿÚyÜÞ¥ßUáããä¿æœè†êrìbîTðFò:ô*öøúðûÕý·ÿj5Ć : ì •7Ófõ{úráN« Z!ª"ì#+%^&‹'±(Ê)à*æ+ç,Ù-Å.Ÿ/o011ß1„233ì3>4n4‰44^44¬33`2z1o03/Ñ-9,€*•(„&N$ï!wß/u¢Õý/ g ³ „ÿÀüú‚ø–ö×ô7óÀñoð<ï8îIíƒìÙëHëÙê}ê9ê êòéäéíéûéê?êoêŸê×êëAëzë£ëÐëèëìÿëýëÛë²ëjëë êêwé´èæçòæöåÙä¯ãvâ-ááߌÞ<ÝñÛ­ÚÙ^Ø]×sÖ±Õ Õ“Ô?ÔÔÔMÔ¥Ô*ÕÕÕ¦ÖײØëÙ<Û¨Ü-ÞÁßná"ãë䏿”èoêYì=î+ðòôñõÔ÷¿ù ûý[ÿ2Î’R ½ h ªDÒ^Þ[Î;¢ÿY© ð!5#l$ž%Ë&é')*+,-ó-Ò.Ÿ/b01µ1E2À2*3x3³3Ì3Ò3¬3t3 3‡2Ô11ø/Ò.u-ó+B*j(e&A$î!ˆù_¨é"T‘ Ï €ù‰ÿ=ý ûù÷Qõµó6òçð°ï©îµíðì;ì°ë4ëÙê‘ê`êBê2ê8êCêaê‚ê±êÝêëGë…ë±ëæë ì+ìAìEìCì'ìì½ëpëûêƒêÜé0é^è{çæpåIäãÖá‘àBß÷ݪÜoÛ:Ú!ÙØ0×fÖÀÕ?ÕèÔ¸Ô´ÔÙÔ+Õ¤ÕFÖ ×ø×Ù2ÚzÛßÜTÞè߃á5ãòä¶æ‹è_ê@ìîðëñËó¶õ”÷wùRû.ýÿÔžd$â E å Š#³EÃI¸1”úS©÷:!}"­#ä$&*'>(O)S*O+B,&-.Ò.’/F0ç0y1ù1_2¹2î2333Ê2l2ï1J1|0ˆ/f.-¥+*9(E&+$í!„Ù+iªî 3 Œól·ý‡û~ù‘÷Íõ.ô±òZñ(ðï'îVí£ìì’ë7ëéêµê”êêƒêê§êÇêòê ëSëŠë¾ëòë"ìGìnì~ìŽì†ìtìMììÃëaëáêNê éÛèþç çæåä¹ãâ<á÷ß«ÞiÝ)ÜþÚÛÙÙØê××tÖìÕŽÕYÕLÕhÕ²ÕÖ»Öt×XØ[Ù|Ú¿Û݈Þà¢áFãûäºæ„èQê+ìîáï½ñœó{õV÷3ùûàü©þz;¸o Å k ›*°4¬!òT§üD‡ Â!ù""$J%f&z'‡(‹)…*v+Z,7-.È.t/0«001š1ó102[2a2U22Ï1W1»0ú/ /þ-¹,W+¾)(&$â!š%©h­ÿC š ðcÞ}.þüöùøGö©ô'óÑñ™ð…ï”î¿í ísìôë“ëAë ëãêÔêÍêÚêêêë4ëaë•ëÆëýë/ì^ì‡ì«ìÃìÎìÏì»ììeìì¼ëFë·êêRéè‘ç‘æ|åYä"ãìá¤àdß!ÞäÜ½Û—Ú™Ù£ØØ×%×Ö6ÖúÕäÕúÕ8ÖŸÖ/×à׹شÙÈÚÜOÝ´Þ5à»á`ãåÁæèGêìéí½ï–ñmóCõ÷íøÃúüYþá—Tü®M î „ ¡# „ñP¬J™Ñ!>"g#Œ$£%·&Å'¾(Ã)£*”+g,5-ú-§.Q/à/e0Ô0,1t1˜1°1ž1y1(1¿0)0t/•.Š-[,ý*z)Ë'õ%ø#×!™6Å2žðKš ö ZÊSî¦þ}üpú‹øÀö#õœóIòñùïýî,îpí×ìVìëë ë^ë<ë ëë!ë6ëQëxë¢ëÓëì;ìlìœìÇìèìííííåì»ìnìì¦ë"ë‚êÊéüèèçæ÷äÆã“âWáàÜÞžÝxÜWÛRÚ`ÙØÛ×K×áÖ›ÖÖ‹ÖÅÖר×MØÙ ÚÛEÜÝèÞ\àÞáxãåÊæ{èAêìÒíïqñ?óõáö°øxúGüþËÿ~;æ–8Ù s  “—€ñP³Y¤æ"Z …!¯"Ì#æ$÷%ý&ý'ô(á)Å*+j,*-Þ-‚./›/ 0i0°0á0ô0í0Ì0†0!0›/æ..-ö+¥*/)Ž'Ç%Ø#Ç!“FÙ\Í1ð M ¾/Ä\ ÿïüêúù8÷šõô»ò|ñiðhï˜îÖí:í·ìIì÷ë·ëëqëjëlë~ë—ë¼ëæëìHìuì®ì×ìí&íDíUíWíOí3ííÉìqì ì…ëðê@êxéè¨ç§æŒåmä7ãâÈàßZÞ1ÝÜ ÛÚEÙ’Øù׌×>××!×OפרÁØÙkÚlÛ‘ÜÌÝߊàâã+åÐæè:ê÷ë½í‚ïMñóáôªörø8úöû»ýnÿ+Ö„+Çh ø ‡ ñV¹g´ù<r¦Ð õ!#'$5%:&9'-()ü)Ð*Ÿ+_,-¶-M.Ñ.E/¥/î/!0<0:00à/…//^.˜-¢,+J*Þ(N'“%´#±!ŽIñ|ûnÒ>¦  œ(Ïÿfýbûwù³÷ öô,óðñÖðØïï=î íí©ìQììàëÅëµëºëÅëÞëì&ìUì„ì¸ìèìíAíjííšíší—ííVííËìgìîëZë²êôéé4è6ç$æ åßã°âwáFàßîÝÎÜËÛÖÚþÙEÙªØ5Øç×·×»×Ú×+ؘØ4ÙëÙÊÚÃÛÜÜÞYß·à+â®ãAåÝæ…è7êëë¬ífï/ñëò·ôrö:øôù³ûjýÿÑy#Á_ò„ ‘ …ó^ÅxÅR‘Ãö @!U"k#v$w%x&c'T(0) *Ò*”+D,í,- .}.ß.-/b/„/„/p/9/ä.l.Ñ--+,+ê)‹( '\%‹#˜!€N™& ‰ú v ú”:ÚýÔûñù%ø†öõ óbòCñGðfï©îþí{íí®ìeì5ììììì ìIìgì˜ìÃìøì$íYí~í©íÁíÜíÝíàíÇí¤íqí íÉìMìÇë"ëmêé»èÃç¼æ¦å‚äXã'âöàËß¡ÞÝÜ’Û´ÚûÙZÙâØ‰ØZØPØiØ´ØÙ­ÙTÚ,ÛÜ*ÝTÞ”ßëàTâÑãVåïæè6êæëšíRïñÊòˆôCöøµùpûýÑþz À_ïˆ •  ŒüjÑ,ŒÙ(n¬çDj†  !¬"º#¶$µ%Ÿ&'h(?) *È*|+,¸,>-·-.l.£.É.Ð.¿.’.@.Õ-@-Ž,°+°*‡)7(¿&#%]#{!oM ´KÒSÏJ Î [ö¨lLþIübúøøösõôÐò³ñ³ðÏïïdîÙícíí¾ìŠìfìVìOì[ìlì‰ì¯ìÕìí4íeí–í¼íèíîî%î!îîòí¾í~ííµì+ì•ëàêê>éRèNçAæ$åþãÕâ§á~à]ßBÞ?ÝHÜnÛ°Ú ÚÙ1ÙøØéØýØ7Ù™ÙÚÄÚ‘ÛtÜ~Ý›ÞÓß!á€âôãqåç”è<êÞëŽí?ïðð¬ò\ôöÉ÷yù/ûÕü…þ#Éaûˆš  – yáB ïFˆÍ :q“¹Ñç ô!ü"÷#ñ$Þ%Ä&¥'r(A)ÿ)¯*V+î+t,ð,U-¥-ç- ...ä- -8-¯,,1+?*)ß'q&æ$,#X![FÉk‹˜ # ¶[ Ù½þ¶üÚú ùn÷åõ…ôBó"òñ<ðsïÊî:îÁícííâì·ì¦ìì¢ì¸ìËìøìíLíoí¨íÐíÿí$îCî\îfîjî[î>îîÎí}íí•ììVë—êÃéÛèâç׿Æå¢äãVâ1áàüÞ÷ÝÝ&ÜcÛ¿Ú:ÚØÙ›Ù‚ÙÙÂÙÚ—Ú5ÛõÛÔÜÑÝåÞàWá°âäåç¥è=êÞëƒí,ïÚð‰ò8ôèõ•÷Bùëú“ü7þÕÿq™$«, §  Ž ô\´]­î.f˜Äé1 ;!?":#1$%&Ý&¬'z(2)è)‹*#+¯+&,,æ,$-P-d-Y-=-÷,ž,,{+²*È)·('"&¢$ø"1!D:Ù‰*ÁPâ r ¹rE%ÿ+ýEû‚ùÞ÷Yööô°óòˆñ¦ðÛï.ï›î î½ípí2ííðìîìììÿìí8íZíˆíµíâíî;îdî‚îžî©î¯î¢îŒî_î&îÖíoíÿìhìÌëëCêdépèpç^æJå$äããáÅàµß¬Þ¼ÝÛÜÜmÛëÚ~Ú?ÚÚ#ÚQÚÚÛ§Û^Ü6Ý$Þ5ßVà•áââCä±å/ç³èHêÝë{í!ïÁðpòôÂõa÷ ù°úKüòý‚ÿ«<½D½4 §  uÖ.€ÐU’Äõ<[j ˆ!|"p#\$<%&ç&°'j()Á)\*ä*`+É+!,f,’,­,¨,,T,ü+…+ë*2*L)N('Ò%X$Ã"!),è Oó‰) À fÕ©’ÿ•ý·ûñùPøÉöeõ ôýòôññAð‘ïÿî|îîÇíŠíaíCí9í;íDí^íyíŸíÉíôí#îNî~îžîÈîØîñîðîíîÕî­î{î+îÒí]íÕì<ì†ëÄêèéþèèùæêåÌä³ã’â|áfàißmÞ™ÝÈÜ%Ü•Û(ÛäÚ·Ú½ÚÛÚ%ÛŽÛÜÉÜ—ÝÞß¡àÏáãoäÒåLçÅèRêàëwíï±ðPòõó“õ8÷Ôøuú ü§ý:ÿÊUÜ_ÚTÀ 3 ’ ú P§õ?¿ô'Ox¯ºËÍË Ä!°"#x$V%&ë& 'Y(ö(”)*š*+^+¤+Ö+ò+ö+Ü+°+Y+í*\*©)Ö(Ú'»&{% $ˆ"Ó í·qÇe ¸n5 úÿþ!üdú»ø<÷Ñõ“ôdódòtñªðõï_ïÜîwî îàíµí”í‰í†íí¤í¿íãí î4îdîŒî½îÝîïï4ï4ï4ïïþîÊî…î,îÁí<í«ìýëAëlê‰é•è•ç†æwåWäEã(â!áà+ßIÞÝÕÜCÜÕÛ…ÛYÛPÛnÛªÛÜÜ9ÝùÝÝÞÒßêàâLã ä÷åjçÛè`êäëwíï¡ð8òÖónõ ÷£ø:úÓû^ýôþwÿuéT ¼  y Ñ m¯ñ&]ˆ¯Ñë !ù!Ù"»#$]%#&Û&'1(Ë(U)Ñ)?*™*å*+8+A+-++¸*S*É)$)T(i'T&%Ä#A"¥ ßñÆF÷¥ R  Ä‘n_jþŽüÍú-ù§÷CöûôÕóÊòßññZðÀï<ïÒîzî:îîëíÓíÔíÙíìíî'îMîvî¤îÍîúîïCï]ïrï{ïyïhïKïïÛî‡î!î£ííoì¼ëîêê%é*è&çæåîãÝâÐáÒàÜßß4Þ‡ÝóÜ|Ü,ÜöÛìÛüÛ8ÜŽÜ Ý¦ÝcÞ8ß+à5áTâ‡ãÑä æŒçòèqêëëyíï”ð#ò¹óNõàövøú–û ý¨þ,®*Ÿ~êJ ¨ þ S›æ"`”Âï 0BXage_N ;!"ú"Í#›$[%&Å&k'þ'‘(){)Ø)*^*z**|*Z**¹)3)™(Ö'ñ&ì%¾$q#ÿ!k ¸ãøîÕ¤j(Ü ˜ P éÎÁÒþ÷ü:û—ùø¬ölõ=ô5óGòuñ½ð$ð˜ï1ïÑî‘î[î<î"î"î"î5îMîiî‘î·îäî ï:ï^ï‚ï ï±ïÁï½ï³ï”ïoï+ïåî|î î€íåì2ìpë˜êµé¾èÁç¶æ©åšäŒãâ‡á‘à¶ßêÞ6Þ¤Ý&ÝÓÜ–Ü…ÜÜÀÜÝ…ÝÞÊޙ߂àáœâÄãåNæªçéêùë|íüîˆðòžó0õ·öLøÍù_ûÞüeþàÿ^ÔDµ‚Ø 6 … Ô ]›Ï,SqŒŸ¯µ¹²«–‚ ^!?" #Û#•$S%& &?'Â'H(²()b)›)Ã)Ô)Ë)­)o)) ( (R'z&|%_$#¶!2 ˆÆåéܹ‹RÓ dA)"7ÿ]ý¤ûúø÷Ñõ¬ôó¯òÜñ!ñƒðûï‰ï0ïåî³î‰îwîkîoî~î‘î°îÔîùî$ïNïvï ïÂïßïõïððûïáï»ï„ï7ïáîiîïíSí©ìîëëAêRéVèZçIæIå3ä6ã8âDámà™ßíÞMÞ×ÝuÝ:ÝÝ%ÝMݘÝÞÞ8ßúßÞàÐáæâä;å}æÐç.é—ê ì~íï{ðò‡óõ–öø ù&û¡ü#þ˜ÿ€ëVµk Ä  Y œÙDq˜»Ôíü öàÉ¥ ~!L"#Ò#$7%Ý%u&ÿ&~'ï'O(ž(ß()))ü(Ë(u( (w'Ð&û%%÷#Å"i!óW¢ÌáÞʦzF à ±•„•ÿÇýüqúåø‹÷:öõôóAò…ñâð]ðäïŠï>ïïàîÃî¼î¸îÈî×îøîï>ïcïï¸ïÜïðð:ðAðMð>ð1ððØïï;ïÎîUîÁí íhì¡ëÉêãéîèôçðæêååäáãêâùááMàžßþÞ€ÞÞÚݻݺÝÜÝÞ‚Þß§ß`à8á'â-ãFätå­æúçNé¯êì…íïwðõñvóôôuöô÷tùíúküßýQÿÆ+™õX® S š à U¸ä"<M[bb_TD,ìÀ ‘!R"#Ç#v$%®%:&·&+'Š'ß'(M(c(e(P((×'m'ë&D&€%™$‘#f"!¬%w³ÔÞÕ¿œuH ûäÖàóÿ,þlüØúPùò÷¦ö}õpôzó¨òèñEñºðBðåï”ï]ï1ïï ïïï$ï8ï]ï|ï©ïÍïøïðAðaðwð‡ðð†ðzðTð'ðéï‘ï5ï¶î2îíçììVëlê†éŽèçæåŽäšã«âÐááKà°ß*߯ÞÞVÞQÞlÞ§ÞßßàÊà–á}â{ã‹ä°åâæ$èséÉê.ì’íïuðêñdóÛôWöÍ÷Kù¸ú6üžýÿzß@ ôM—æ ' h £ Õ -Xs¢°¼¾¼³¨‘|W5 Õ “!S"#¯#S$è$t%ó%d&È&'_'Œ'­'­'¤'u'1'Õ&T&»%ÿ$$*#"Ì díI–ÀÙÞÏ¿›~ ] @2)7TˆþÕü<û¸ùYø÷æõÖôãó óLò§ññ¢ð<ððï¯ï†ïfïVïUïWïjïïŸïÃïæïð4ðbð~ð¢ð¸ðÉðÓðÎðÃð¡ðyð;ðîï’ïïšîîXí¤ìÓëþêê&é1è1ç9æ9åKä\ã€â¶áýà^àØßlß%ßóÞìÞûÞ2ß…ßö߆à4áõáØâÊãÒäðåçTè—ééêBì¡í ïtðâñWóÃô=ö©÷ ù‹úþûbýÒþ-—êJ—ë1y · ò ) X„©Éæû  ûäŧwP Ù !F"ë"#!$°$,%¢%&Z&ž&Ñ&ð&û&ï&Ì&Œ&8&½%0%y$ª#¸"¤!s ®t¨ÓÞäÖÄ­ — „z{‹°çþ7ýû#úºø|÷Hö>õHôpó®òòvñþðšðDð ðÕïºï¥ï ï£ï´ïÅïçïð,ðOðyðœðÂðßðüð ññññóðÄð“ðDððï~ïïrîÐííXì‡ëªêºéÏèÕçÜæèåôää1ãfâ®á áƒààÅߔ߄ßß¿ßàsàüàœá]â0ãäå/æQç„è¿é ëXìµíïwðÞñHó²ô#öˆ÷ûø[úÌû)ý’þéÿJœò@ˆÏ K } ² Û %>Zhv~|nhL9õÀ˜U Ñ „!)"Í"[#ð#d$ß$@%˜%ß%&4&I&9&$&ã%™%&% $ô#.#F">! ÎnåKÁãêñãÜ É Æ¼ÍÛ Aÿ–ýü‚ú%ùÝ÷°ö¦õ©ôÖó ókòÕñ[ñòðŸð_ð*ð ðòïîïïïûïð)ðIðkð“ð¸ðÝðññ<ñNñZñZñSñ8ññßð¢ðHðåïlïàîEî™íÚìì5ëSêeéyèç‘æ å½äâãã_âºá1áÀàià8àà'àHààñàsá âÄâŒãräjåqæçµèìé.ërìÌíïðÚñ>ó¥ôöo÷Ñø6ú—ûõüRþ¨ÿNŸæ+l¥Ü  8 c £¸ÌÙãääÝÎÀ¥‹f?ؤ[  j!""&#¥#$$Ö$%W%{%%Š%s%>%÷$$ $r#©"Ø!Ð ¾z+¬ s®Þó ü3Y¡ÿðýcüæúˆùAø÷öõ1ôyóÃò:ò´ñOñ÷ð´ððZðHð7ð>ðBðXðnðð®ðÕðùðñCñ_ñññ¡ñ›ñŸñ€ñhñ2ñöð¥ðEðÏïQï´îîXí—ìÂëæêÿéé%è7çLækåäÊã ãnâÙákáá×à¸à¸àÚàáráéá}â)ãïãÇä»å·æÍçíèêUë’ìßí-ï‚ðÝñ7ó–ôòõT÷°ø újû¾üþjÿ¸J‘Ð @t œ È è  5@NNPK>1Û¼‹^$è¢W © G!×!e"ß"X#¹#$]$˜$Ã$Ó$Û$¿$š$O$ö#u#æ"*"]!h X+ÝsïOÐù' , 5 CY~®÷ÿNþ¿üIûéù¥ø{÷jövõ˜ôÕó'ó–òò¬ñOñ ñÓð°ð“ðŠð†ðð¡ð´ðÓðñðñ9ñ_ñ‚ñ£ñ»ñÔñÞñæñáñÎñ±ñ†ñIñÿð£ð5ð¹ï(ï‡îÙííOìuë—ê®éÈèÛçõææ>åtä¿ãã‰ââµáyáTáOákááöáaâòâ’ãQä"å æçè#éLêzëµìöí@ïŒðàñ2óŒôàõ;÷øèù=ûŽüàý,ÿu½ý=v«ß 3 S s Œ Ÿ°º¿Áº³¢v[3Ý©r-éCíƒ !¡!"“"ø"S##Ü#$ $!$$ê#¯#T#æ"R"¬!Ý üôГ0¾'„Âø5H W j ~žÆJ§þý¦ûLúùß÷ËöÚõúô5ô‰óñòpòò§ñbñ*ññæð×ðÑðÚðçðüðñ7ñVññœñÆñÞñòò%ò+ò#òò÷ñÚñ›ñZñÿðšð!ð–ïÿîSîíÔìì*ëJêhé}èŸç¿æëå$åkäÄã6ã»â^ââóáçáúá*âxâßâeãÿã´äå[æRçMèbé~ê¥ëÙìîSï›ðâñ4ó€ôÔõ"÷tøÇùûaü¨ýñþ5u±ìRz¤Æ ä ý  !/36/, ð×´a1÷¿v2àŠ*ÇS á Z!Ï!7""à"#L#b#q#a#A# #µ"N"Ä!$!b Љx>ò_·ï!Ha ƒ • »ÚJžÿþsýü¥úkù=ø0÷:öZõ˜ôçóPóÍò^òò¹ñ~ñSñ8ñ"ñ#ñ!ñ0ñEñZñ|ñ›ñ¾ñâñò#ò@òTòhòmòlòcòFò(òíñ³ñZñüðˆððsïËîîXí•ì»ëãêêéFèfç™æÎååtäßãgãã¼âââŒâ·âþâ[ãÞãjä åÙ叿šç—è é°êÚëøì6îgï¬ðëñ4ó{ôÅõ÷Xø§ùëú3üwý·þ÷ÿ/j™Ìõ@\ w Š œ § ¬²«¥›„tU5æ·†F Â{$Ñj “ ˜ !t!Ð!"]""¬"¹"°"•"a""²!6!– é 'î¨GÒ?œê Xx £ Å ìP˜ëSÿÎý^üûÆùŸø‘÷˜ö½õõôGô­ó*ó·ò]òòÔñ¦ñˆñtñmñnñzñŠñ¥ñ¼ñàñò"òEòdò~òšò¦ò´ò²ò©ò”òròCòò·ñ[ñíðoðåïAïîÝííLì{ë›êÅéåèè@ç|æÆååää©ãbã+ãããGã‚ãßãSäÞä†å=æçîçÞèáéëêì'íSî„ï½ð÷ñ6ózô¼õ÷Cø…ùÊúüGýþ¹ÿï Mz›ÃÚø  ) + 1+( óÛ¼—s>ÕžWÂo²FÙYÜI ¶ !^! !Ð!ó!""ç!¸!u!!¡  `œ´²—[ ž„Ú _  ë !Q•ß6§ÿ!þ¸üdûúùë÷ýööWõ¤ô ô…óó³òiò%òýñÖñÆñ¹ñ»ñÂñÔñéñò#òBòdò‡ò¢òÄòÖòíòõòøòòòÜòÂò“òZòò¸ñRñÚðQð»ïïaî¨íÙìì5ëcêˆé¸èèç)çnæÍå7å¸äSääÏãµã¶ãÔã äaäÌäSåï墿hçBè)é$ê'ë9ìSívî¢ïÏðò=ówô¶õïö1øgù«úÜûýLþÿ¯Ü(Ic‘  ¬ µ ³ ¸ ¨¤€aH!ýПj-ð§` ·Y÷‰œðO ž á !8!K!J!:!!Ð { ƒÜDL< ÅhðdÊf  Ü  L‹Ï%ùÿqþý¶ûƒúYùNøY÷yö´õõfôâóoó óÃòxòRò'òòòòòò1òIòeò‡ò¤òÊòäòóó.ó9ó=ó9ó'ó óæò¬òlòòµñAñ¿ð0ðŽïèî'îkíŸìÏëþê+êYé’èÐççwæáåcå÷ä¨äoäOäNäbä™äâäJåÈå[æ çÆç–èzéfêhëkì†í˜îÄïæðòFózô¯õçöøRù‡ú»ûëüþCÿw’¿Öø #+< > C ? 9 / ïÕ´‰f-‡Cû­Zÿ¤8ÒVâUÍ.‘Ý# W } ” — ˆ f * ÝqôU¤Íåܼ-ÁC²f¬ õ 2 v¾ dË>ÉþbýüÛú³ù®ø³÷Úöö`õÃô>ôÇófóóÒò£òzòeòUòSòWòcòxòŽò¬òÇòêòó'óDóZóró{óƒó~ópóZó4óóÁòtòòªñ+ñ¡ð ð`ï±îôí/ígì–ëÌêüé8éyèÄç$ç‰ææœåNå åïäãäõä%åeåËå;æÎæoç%èñèÇé²ê¥ë©ì±íÈîáïñ(òSó~ô®õÜö ø<ùiú™ûÂüíýÿ6Xtޤ¶ÃÐÓÕ Ô Ë Â ¯ ¡€nC#öÊ”]"ß™Oû©Lé‚ ™ rÏešÄÛáÚ¶‡9Û`Î[u}d5ï—cµ  P œí@£ ˆÿ²ýlü-ûúùø1÷pö¼õõ˜ô"ô¿ókó)óôòÎòµò¢ò¡ò¡ò®ò¾òÕòïòó)óNóeó‰óšó³óÀóÆóÆó¹ó¤óƒóRóóÌòvò ò—ññðßï2ï~î½íùì2ìgëžêÞéénèÎç1ç¸æDæòå®åŒåyå‹å¯åðåFæ¹æ<çÚçŠèGéêúêêëäìäíõîð"ñ=òbó†ô­õØöþ÷*ùNúzûšüÂýßþþÿ1DUbjppn e \ H 8 㸕a3øÀ9ò¢Nø–5ÊXã_ßF· c¤Þ#-' Ý™>Í@ Ý  èªZñ{ñZ¾  j ÁyÛOÐcÿþ¾ü…ûlú]ùpøŽ÷Ìöö}õïô}ôôÄó}óIó óóóòêòðòôò óó6óOóqóŠó¬óÆóÞóõóô ô ôôíóÑó¤ómó(óÑòsòýñ‚ñòðZð´ïïMî‰íÌììAëêÆéésèÞç_çëæ–æQæ'æææ?ævæÊæ2ç°çGèëè§érêGë1ìíî"ï,ðAñUòtóô°õÓöô÷ù7ú\ûvü–ý²þÅÿßíþ  ù ë Ö ½ ¡ €[. Ì¡]#ß–Jø¢Gå¡%§ŒôO éQeym\.ï›.ªXŒ£¡‹W·MÍH­  t Ø9ŸŒ®ÿRþýàûÇú¿ùÑøö÷1÷€öåõZõçôô,ôéó¯ó‰óhóZóOóRóVóhóyó”ó­óÊóëóô%ô8ôQô_ôkôjôgôSô:ôôßóŸóQóôòŒòòñúð_ð¶ïïOî“íØììeë§êê_éÕèOèãçŠçEçççç#çYç¢çè{èé¨éUêëäëÃì¦íœîï—ð›ñ¨ò¹óÊôâõ÷öø%ù=úRûgüxý‰þ–ÿ §®«­ Šzf H . ã ½ ŒZ%é«jÙƒ3Ùy­HÍ[×UÅ2’í<~»à ú× Nòræ<z§°­ŒZºRÜ] Ö K »3ª,µNðÿªþlýLü6û;úQù|ø½÷÷wöòõ~õõÉôôMô ôôîóçóåóêóùó ô!ô8ôUôqôô¨ôÁôÕôåôòôðôòôàôÊô¥ôzô;ôöó¡ó;óÐòNòÊñ2ñ˜ðíïBï‘îÙí)íuìÈë'ëˆêêéé»ètèJè+è1èBèrè³èézéýé‘ê6ëêë¬ì|íVî<ï'ðñòóôõ&ö.÷:øBùOúUû^üdýgþiÿia]SB5èÊ¥ } R $ ï ¹ <þ³lÈp·Pç|’Œlß4ÜU…Ÿµ²§„U ´D¿"q¦ÅÏÁ¡m&Ôo ’  ¡#²?Û0úþÂý±ü û±úÉùùAø÷÷„öö²õYõõàô·ôšôƒôzôxôyô‡ô–ôªôÃôÛô÷ôõ*õEõVõjõrõyõsõlõRõ:õõÚôôGôéó€óóŠòòkñÐð.ð€ïÛî*î‚íÞì=ì«ë"ë¥ê>êâéŸéméTéLé`é‚éÂéêvêïêxëì½ìrí6îïÞï¹ð¥ñŽòƒówôrõjök÷døeùaú^ûYüTýJþAÿ3$úæÄ¬‚_5 Ö   j + î § cÈsÃfþŸ,ÄJÖTÖG¾#Œå;…Æ'N[aX9Ñ{˜e«ÚðøåÈŽUþ ¬ I ã }²Nü®m?ÿþ ý üûAúzùÅø!ø‘÷÷¡ö>öòõ§õxõGõ-õõõõõõõ3õIõ_õzõ’õ®õÀõÜõäõôõûõõõðõÝõÀõ›õkõ+õæôô.ôÅóIóÊò=ò§ññlðÍï)ï„îëíLíÅì8ìÊëWë ë½êênêgêrê“êÌê ësëÚë^ìíìŠí7îîî¯ï}ðNñ,òóòóØôÇõ´ö¥÷–ø†ùzúgûYüGý0þÿì˪‹]<ܦp5 ö ¸ k . Ö 6â†*Ädóލ#¯"£ €âGœð8w°ÛûùЙOð‚øc²ï,,ýÊ• I þ ¬ Rª\×£€ÿgþcýiüˆû±úòù@ù£øø˜÷+÷Ëö}ö9ööÚõ·õ¤õ–õõ’õšõ£õºõÈõäõøõö*ö@öRögömöyövönöcöEö&öûõ½õ„õ+õÜônôô†óóxòëñMñ»ðð„ïéîZîÍíQíÚìvììÚë¥ëˆëzëë ëÉëìcìÆì@íÃíXîùî¤ï\ðñâñ²ò…ó`ô<õöÿöâ÷Èø­ù“úvû[ü<ýþúþÝÿ®‘Z6ÿΗ]â˜U ¼ i  ½ b ¢:Õcö‚Ž ˆpäG¬ \¯ò4g”µÉÕͽšh$Ïgî^½>attcJ ï ª p 'å c)úÕ»ÿ±þ³ýÈüéûûbú¸ù ù”øø±÷S÷÷ÃööaöGö)ö!öööö+ö7öMö^öyöŒö§ö·öÐöÛöìöïöôöëöâöÉö«ö…öNööÉõyõõ²ôBôÇóAó¾ò(òññrðçïVïÖîYîéí†í0íìì¸ì–ìˆìˆì¡ìÊìíUí¬íîšî ï»ïXðñ¸ñyò5óôÍô õvöH÷$øûøÕù±ú†ûcü4ýþàþ³ÿQã¥j(åŸR ´f  ³ Y ö – - Å Vèrþ€€üqäS¶"xÙ%v·÷)VvŽ˜–‡j=³TãaÇ#e˜¼Çо « „ ^ * üÄ”b9òÿöþýý ýFü‡ûÍú.ú”ùù›ø1øÚ÷‰÷M÷÷îöÈö´ö¤öœö›ö öªö·öÉöÜöðö÷÷2÷C÷U÷^÷j÷i÷h÷Z÷I÷.÷÷Üö¢öaöö¾õ[õõô}ô ôóóqòîñ[ñ×ðPðÐï]ïîîî<îõíÄíííŠí¢íÀí÷í=î‘îúîgïìïvð ñ°ñUò óÁó{ôAõöËöš÷aø4ùÿùÏú›ûiü6ýþýËþŽÿUÕ—RÄn&Ïz%Âk  £ 8 Ï _ ð z ˆ ŒðdÏ8üWªþ@Œ¼ûFVefYAâDábÞ:“Ð$1: 1 èÆ¤~bD1'#4ÿEþqýŸüéû3ûúúˆùù¬ø[ø øË÷›÷k÷P÷5÷%÷÷÷ ÷&÷4÷B÷U÷j÷{÷”÷£÷¸÷Ê÷Ð÷ß÷Ü÷Þ÷Ô÷Â÷¬÷Š÷`÷.÷ðöªöZööõ4õ¾ôGôÌóCóÉò<òÀñ?ñÆðTðíïŒï@ï÷îÇî îîˆî™î³îæî!ïsïÍï8ð±ð/ñÁñTòóòœóDôûô¬õkö&÷å÷¨øjù+úòú±ûuü7ýõýµþqÿ-ä›Qÿ³[®Rõ’/È] ô   ˜ % ¤ + ¦ $œ„ñ`Â,…æ7ŽÕ ]—Éó-9=4üÊŒ=Üqì_½ Lx› ¯ ¹ ¸ ± ¡’ymUNDHRiÿŒþ¸ýùü>üûþúyúöùŒù&ùÕø†øNøøï÷Î÷²÷¨÷˜÷›÷˜÷£÷©÷½÷É÷Þ÷ð÷øø)ø7øDøLøQøNøIø9ø%øøã÷±÷}÷8÷òöœöCöÜõuõõŒôô“óóžò%ò´ñDñáðˆð5ð÷ïÀïœï†ï~ïŠï¢ïÍïðMðžðñnñìñmòùò’ó'ôÏôqõ!öÎö€÷6øëø¤ù[úûËû„ü:ýïý¦þTÿ µc´^þ¡?Út ž/½K Ï ] Ö b × W Ï @ º !–øcÁ#|Õ&t½?v¥Ðî ç¸:à~íE•Ñ  & @ M Y WWSNLOTd{œÿÈþþCýšü÷ûdûàúeúüùœùHùùÃø”øhøIø/ø#øøøøøø1ø<øPø_øuø„ø–ø¦ø¯ø»ø¾ø¾ø¹ø¬øšø€ø]ø4øøÄ÷„÷1÷âö€ö!ö¶õGõÕô_ôìóvóó–ò-òÐñvñ)ñëð³ð’ðvðpðuð‹ð®ðâð$ñlñÎñ,ò¢òóœó)ô¸ôSõìõö5÷Ú÷‡ø1ùÝùŽú7ûéû“üCýëý˜þ=ÿêÿˆ3Îp¦@Õhú‰ž$§+ ¨ $ ¢  ú m Ù A ¨ lË%yÏg¬ë)[³Õíûÿïׯ{<ê"§ ‚á ( k š È ß &.@Ja}œÍÿÿCþ’ýçüSüÁûEûÎúgú ú»ùxù7ù ùÜøÅø¥ø™ø‹øˆøˆø‹ø–øžø®ø¿øÌøãøìøù ùù#ù(ù,ù$ùù ùóøÖø®øøIø øÃ÷x÷ ÷Äöcöûõõ$õ³ôFôÛóqóó²ò_òòÖñ¢ñ{ñeñVñ]ñlñŒñºñôñ:òŽòëòRóÆó=ôÀôIõÑõmöùöž÷4øØøwùú¼údûü«üHýïý‹þ-ÿÉÿf—/ÂTåoÿƒŽ† s ì W Ë 0   j Å + } Þ -ƒÑc¢âL| ÁÛçõíçɰxGø¨@ÔQÇ , „ Ò  K v ŸÀÚö)GgŽ¿ôÿ5ÿþÔý9ý£üü¥û0ûÓúsú+úæù«ù~ùTù3ùù ùùûøøøýøù ùù(ù8ùLùVùjùvù€ùùù”ùŽù‡ùyùcùIù%ùýøÉø’øOøø¹÷b÷÷§öCößõsõõ§ôFôçóó=óúò·ò‹ò^òIò:ò;òIòfò‰òÄòþòNó£óômôÜôUõÓõXöáön÷þ÷’ø(ù¾ùYúïúû"üÀüVýîý‰þÿ¶ÿ=Ú_ô{Ž˜˜Œyð\Ò5 ª  v Ó 7 ” ð J ž ö A ” Ù $d¦ÞFp›³ÓÜëçáʰƒS Äeˆ x ã 9 ‰ Ï @p˜Çæ;k Öcÿºþþ€ýóüsüýû’û4ûÝú’úSúúìùÄù¤ùùxùrùgùiùjùpùyù„ù”ùù´ùºùÑùØùçùïùõù÷ùõùîùâùÏù¹ù–ùtùCùùÕø’øJøú÷¦÷M÷îö‘ö.öÎõmõõ·ôdôôÒó–ófó@ó"óóó$ó4óYó‹óÁóôXô­ôõwõéõ]öÚöW÷Ü÷døìø{ùú–ú%ûµûHüÓühýñý…þ ÿŸÿ³.¼:½<»3°$œ íYÇ,“øW º  o Ì  t Ç  c § ó / v ­ æ Ir—µÍÝêææÏ»h&æ 3 Ç P Ì ? ¤ T ›ã[ŠÆö1i«í=ÿðþOþÆý=ýÃüUüìû’û@û÷úºúƒúXú-úú÷ùêùÛùÖùÒùÔùÙùáùìùøùúú$ú+ú@úCúSúTúYúWúSúFú:úú úáù¼ù‹ùUùùÓøø;øí÷“÷:÷âö„ö+öÕõ}õ2õäô¨ôhô?ôôüóëóéóìóôôMô€ô½ô õWõ²õöyöæöX÷Ï÷IøÈøHùÊùOúÓú^ûßûküíüxýúýƒþÿ‰ÿˆ„þzîgØMº(˜ûlÉ4‘ôQ­ a ° S ­ ñ @ ˆ Ç  I Š Â ó * Q } ž º × á ó ï î à È ª } K  Á g ˜ #  z Ö2ÌW™Ûf²V¸ÿÿþþ‡ý ý©ü@üîûžûXûûçú¾ú–ú|úaúRúCú@ú7ú>ú=úGúPúYúhúrúƒúŒú›ú¤ú®ú³ú¸úµú³úªú›ú‰úpúOú.úþùÑù–ùZùùÎø‚ø1øß÷Š÷6÷àöö<öøõ¬õrõ8õ õæôÊôºô´ô¸ôËôâô õ6õsõ²õþõNö©ö÷n÷Ô÷Eøµø+ù¡ùú–úû‘ûüüýŒýþ†þúþyÿðÿiÞUÄ;§„íW¼$ƒëD¦ÿ[± Z°ÿM š ã - o · ó 5 m ª Ú  < g ­ Í â õ þ  ó ä  ¡ o 6 ô £ L æ y  } ó\Ä{Ék½ _µs×ÿHÿ¿þ<þÈýVýòü—ü@üúû´û}ûIû ûûúàúÇú¶úªú¢úŸúžú¢ú¨ú°úºúÆúÏúáúçúøúýú ûûûûûûûúëúÔúºú˜úoúEúúÚùšùYùùÊøyø/øÜ÷÷C÷öö±öpö0ööÏõ¯õ‘õ‚õyõ|õŒõžõÃõëõö[öŸöèö<÷’÷ï÷Rø¶ø!ùùüùlúàúSûÉû=ü³ü&ý ýþ‡þ÷þmÿÚÿM¹'“ýeÌ1•øWµlÈrËl¹Pá) i ­ ë ( d — Ñ 1 ^ ƒ ¨ Ë ß       è Æ › j * æ ‘ : Ñ g ëoäTÀ#„ä;óV´‡öÿoÿíþuþþœý:ýäü•üKüüÔûªû|û^û=û+ûû ûûþúûû û ûûû0û7ûBûNûSû_ûcûfûgûcû^ûRûFû1ûûþúÝú¶úŒú]ú(úôù·ù{ù=ùýø»øø<øøÈ÷–÷b÷=÷÷ûöàöØöËöÕöÙöðö ÷-÷X÷Š÷¿÷øBøŒøÝø*ùˆùØù;ú–úöú\û½û$ü‹üïüWý¼ý"þ‰þîþSÿ¶ÿyÛ:•õL©U¬ýN¡ë=ƒÐ\à]–Ò>iŸÅõ ? ` } ™ ­ Ä Ð à á ê ä Þ Ò ¿ ¨ Œ g A  ܤ]Ë}'Èo¦;ÎfóЬFØo ¤CëÿŒÿ<ÿçþ›þRþ þÌý‘ýZý'ýùüÍü¤üü]ü@ü!ü üðûÛûÃû²û™û‹ûvûfûSûDû1ûû û÷úçúÏú¾ú¥ú‘úyú^úFú*ú úöùÔù¾ùùƒùgùLù3ùùù÷øæøÜøÒøÌøÌøÎø×øãøòøù"ù<ù`ù‚ù«ùÙùú<úpúªúåú#ûbû¦ûéû/ü{üÀüýWý¨ýñýCþŒþßþ+ÿwÿÉÿ`§ò<ÌW—ÛZÖPˆÂó-Z¹ë=_‚¥Àá÷":@XWfekddVM<(øØºj= Û¢j2ñµq1ì¨aÕ‘I¼t0ì¦i"êÿ¦ÿoÿ3ÿþþÉþ—þhþ9þþäýÀý™ýuýUý2ýýõüÜü¹ü¥ü‚üoüQü;ü$ü üöûÝûÉûµûŸûŽûzûgûWûDû2û%ûûûðúçúÖúËú¼ú´ú§ú¢úœú”ú—ú’ú˜úšú£ú©úºúÄúÚúëúûû5ûTûqû“ûµûÙûü(üTü~üªüÙü ý8ýoýŸýØý þCþzþ²þèþ$ÿYÿ–ÿÈÿ6s£ÜBy¤ß>g˜ÆñGq˜Àâ %Nd‡œ¸Îàø 32F?NHMGF;6( öæÌ´–zX9ìËzL!úÆ¢mE廆[(ûÊnAèÿºÿ“ÿhÿCÿÿúþÓþµþŽþuþPþ9þþþßýÊý«ý”ýxýbýJý4ýýýóüáüÌü½üªüœüŽü~üsüfüZüNüGü9ü6ü)ü%üüüüü ü ü üüüüü!ü-ü8üEüUüaüyü†ü ü²üËüáüýüý2ýLýiý‰ý¤ýÇýçýþ,þOþtþ›þ¿þèþ ÿ8ÿ[ÿ…ÿ¬ÿÔÿûÿ"Go“¸Ýÿ$If«Ìî +Lf„ ·Öè,=N_ky…Ž–¡£«®®²±®®§£š‰wpZO8&øäÊ­šxaD' íϲ“wU;úÔ¸•vU6ûÿÑÿÀÿ–ÿ…ÿbÿLÿ1ÿÿÿèþÏþ½þ£þþ{þeþRþ>þ'þþþõýàýÒý¿ý¶ý¡ý™ýŠýývýoýbý^ýVýLýLý@ý@ý;ý6ý6ý/ý2ý.ý.ý3ý/ý9ý:ý=ýKýHý]ý]ýoývý‰ý“ý¦ý²ýÄýÖýçýøý þþ5þGþ^þrþ‡þ¡þµþÒþèþÿ ÿ4ÿVÿlÿ‰ÿ¦ÿÁÿÛÿúÿ.Gay•©É×ú&5Qc|¤¸ÎÚôý08HO\alqw~……‰‡‹†‰ƒ|uoh]VH>0 þ÷ÝÔ¼¯—‹qdL=%ûïÐÃ¥—yiM:$ øÿßÿÎÿ¸ÿ¥ÿ“ÿ~ÿpÿZÿKÿ;ÿ'ÿÿÿþþéþÜþÍþ½þ°þ¡þ”þ‰þxþqþbþZþOþFþ@þ6þ2þ*þ'þ þþþþþ þþ þþ þþ þþþ þþþþþ'þ.þ7þ@þJþRþaþhþxþþþ˜þ«þ±þÅþÏþÞþîþùþ ÿÿ.ÿ:ÿQÿ^ÿsÿ‡ÿ•ÿ­ÿ¼ÿÓÿäÿöÿ 0<R^u”¡²ÁÐáí *5DPZio{†ˆ–– ¥§­²°·µ¸¹º¸¹¸³µ«®£ œŽŽymeWO@7)øìàÑÇ·­›ocPB4!öÿäÿÛÿÈÿ¿ÿ¯ÿ¤ÿ—ÿŒÿÿuÿgÿaÿPÿJÿ<ÿ3ÿ'ÿÿÿÿÿþ÷þìþæþÝþÖþÑþÈþÇþ¾þ¿þ¶þ¸þ°þ²þ¬þ¬þªþ©þ§þ§þ¥þ¦þ¦þ¦þ§þ©þ«þ¯þ°þ¹þµþÄþÂþÎþÐþÝþÝþïþîþýþÿ ÿÿÿ#ÿ4ÿ6ÿFÿKÿUÿdÿhÿ|ÿ€ÿ’ÿšÿ­ÿ±ÿÆÿÍÿÞÿëÿõÿ*0CGY\ns‚ˆ•œª±¾ÆÏØáèòøþ  #%&((*',',&'$"ûóìåÜÖÌÆ¼¶¬¤œ“‚|oh]TG@1-þÿôÿéÿáÿ×ÿÐÿÄÿ¿ÿ´ÿ­ÿ¦ÿÿ–ÿÿ†ÿ€ÿxÿoÿjÿbÿXÿUÿKÿIÿ>ÿ=ÿ4ÿ1ÿ.ÿ(ÿ&ÿ%ÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ÿ$ÿ(ÿ.ÿ1ÿ8ÿ=ÿBÿIÿNÿTÿYÿaÿdÿoÿpÿzÿ}ÿ†ÿ‹ÿ‘ÿ›ÿŸÿ¬ÿ®ÿ½ÿ¿ÿÏÿÐÿáÿáÿõÿóÿ$&34BDMSYbfps‚‰”Ÿ¨¨²°¸·¼¾¾ÂÂÅÄÆÅÇÇÈÈÇÇÇÄÅÁÀ¾º¶¶«¯¢¢œ”“Ї|usiia[XOJD;7-( ÿÿûÿôÿíÿèÿáÿÛÿÖÿÑÿÉÿÈÿ¾ÿ¾ÿµÿ³ÿ«ÿ¨ÿ¡ÿœÿ˜ÿÿÿ‡ÿ…ÿÿ{ÿxÿtÿqÿpÿmÿjÿlÿeÿjÿcÿgÿcÿeÿaÿeÿ_ÿdÿ_ÿaÿaÿ`ÿbÿbÿdÿeÿeÿkÿhÿpÿpÿvÿvÿ}ÿ~ÿ…ÿˆÿŒÿÿ–ÿ•ÿŸÿžÿ¥ÿ¨ÿ¬ÿ°ÿµÿ¹ÿ¿ÿÂÿÉÿÏÿÔÿÜÿßÿçÿíÿòÿüÿüÿ &'.07:?BIKRUZ_cemkuqzw}|~€††‚…ƒ†…„‡‚†ƒ‚‚}~u{pskih^cU\PTIMCD?<86.-&"÷ÿ÷ÿïÿíÿêÿäÿãÿÜÿÜÿ×ÿÓÿÑÿÎÿÉÿÉÿÀÿÂÿ¸ÿ»ÿ²ÿ²ÿ­ÿ¬ÿ¦ÿ¨ÿŸÿ¤ÿ›ÿ ÿšÿÿšÿšÿ™ÿ—ÿ™ÿ—ÿ˜ÿ—ÿ–ÿ–ÿ—ÿ•ÿ–ÿ”ÿ–ÿ–ÿ—ÿ—ÿ˜ÿ›ÿšÿŸÿÿ£ÿ£ÿ§ÿªÿ­ÿ¯ÿ³ÿ³ÿ¹ÿ¹ÿ¿ÿ¾ÿÃÿÄÿÈÿÊÿËÿÒÿÏÿØÿØÿÞÿâÿåÿèÿðÿïÿùÿøÿ  "!&)(0057<;D@HHKNNRQSSTWSYSYUYUYWYW[UZVWUVQTNPHLFBD<?:7724-/*+'%! úÿûÿöÿôÿòÿîÿíÿëÿçÿçÿãÿâÿáÿÝÿÛÿÚÿÕÿÔÿÒÿÌÿÐÿÇÿËÿÃÿÄÿÃÿ¿ÿÀÿ¾ÿ½ÿ¾ÿ½ÿºÿ¾ÿ¹ÿ½ÿºÿ¼ÿ¹ÿ½ÿ¸ÿ¼ÿ·ÿºÿ¹ÿ¹ÿºÿ¸ÿ¼ÿ¸ÿ¾ÿºÿ¾ÿÀÿ¿ÿÄÿÃÿÇÿÈÿÊÿÍÿÍÿÒÿÏÿÖÿÔÿÖÿÛÿÖÿßÿÚÿàÿàÿãÿäÿéÿêÿîÿïÿóÿõÿúÿûÿ #!)$/(/1.72666796988:7:98;9;;8=8;97:48232-/*+'(#& $" ÿÿÿÿüÿùÿúÿõÿõÿöÿïÿôÿíÿïÿîÿëÿêÿêÿæÿçÿâÿäÿÞÿàÿÜÿÜÿØÿÛÿÔÿÙÿÒÿ×ÿÒÿÖÿÑÿÕÿÑÿÖÿÐÿÕÿÒÿÒÿÔÿÐÿÕÿÏÿÔÿÐÿÑÿÒÿÐÿÒÿÓÿÏÿ×ÿÐÿÖÿÖÿÕÿÚÿØÿÝÿÚÿáÿÜÿäÿßÿåÿâÿæÿæÿæÿèÿèÿêÿëÿêÿîÿîÿòÿòÿôÿöÿúÿùÿþÿýÿ      ""#%"&#%%%$%%$'#&%%(%'%'&%%$$$ ! üÿÿÿüÿúÿüÿøÿøÿøÿôÿùÿòÿöÿóÿòÿóÿïÿñÿîÿíÿíÿçÿíÿæÿéÿåÿæÿäÿãÿäÿáÿæÿßÿçÿßÿåÿáÿäÿâÿãÿãÿâÿãÿâÿáÿãÿßÿäÿÞÿåÿÞÿåÿßÿäÿãÿãÿæÿäÿçÿèÿéÿêÿêÿìÿìÿíÿïÿìÿòÿíÿñÿñÿîÿôÿðÿôÿõÿóÿùÿõÿûÿúÿüÿþÿþÿ        þÿýÿúÿúÿüÿûÿúÿûÿùÿøÿúÿ÷ÿúÿöÿ÷ÿöÿöÿóÿôÿòÿòÿòÿîÿñÿíÿïÿíÿîÿìÿîÿìÿîÿìÿïÿëÿïÿìÿîÿîÿìÿïÿëÿíÿîÿéÿðÿçÿðÿéÿïÿéÿïÿêÿðÿíÿîÿñÿîÿóÿðÿôÿñÿõÿóÿõÿõÿõÿôÿøÿòÿûÿñÿûÿóÿúÿ÷ÿûÿøÿýÿùÿüÿþÿ               ÿÿþÿúÿûÿüÿþÿûÿüÿüÿûÿüÿúÿýÿøÿýÿ÷ÿûÿöÿúÿõÿùÿóÿ÷ÿôÿõÿóÿõÿòÿõÿòÿöÿñÿ÷ÿñÿöÿôÿôÿôÿôÿõÿóÿõÿóÿóÿôÿòÿôÿòÿôÿòÿõÿñÿöÿòÿöÿôÿ÷ÿõÿ÷ÿùÿõÿûÿöÿûÿ÷ÿüÿöÿüÿøÿûÿøÿúÿúÿúÿûÿûÿûÿþÿüÿþÿþÿÿÿ          ÿÿýÿÿÿþÿþÿýÿÿÿüÿÿÿüÿýÿþÿýÿþÿûÿÿÿúÿÿÿøÿþÿ÷ÿýÿøÿûÿ÷ÿúÿ÷ÿ÷ÿûÿóÿþÿóÿüÿõÿûÿöÿûÿøÿøÿúÿøÿùÿùÿ÷ÿùÿøÿ÷ÿøÿ÷ÿùÿ÷ÿøÿöÿùÿùÿ÷ÿüÿöÿûÿûÿúÿüÿúÿüÿûÿýÿûÿýÿùÿ÷ÿùÿüÿýÿúÿÿÿüÿýÿÿÿüÿþÿÿÿþÿþÿýÿýÿÿÿýÿýÿÿÿþÿþÿýÿÿÿþÿþÿÿÿþÿýÿþÿüÿþÿûÿýÿüÿúÿýÿùÿýÿùÿüÿúÿûÿýÿ÷ÿøÿþÿúÿûÿþÿùÿõÿõÿøÿüÿúÿûÿúÿûÿûÿúÿüÿúÿýÿûÿüÿýÿüÿþÿýÿýÿþÿýÿýÿúÿúÿúÿùÿûÿÿÿþÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿ þÿþÿ þÿÿÿÿÿÿÿÿÿþÿÿÿþÿüÿûÿüÿüÿüÿýÿÿÿþÿþÿýÿþÿýÿýÿýÿýÿûÿÿÿúÿþÿþÿûÿÿÿûÿÿÿýÿýÿÿÿûÿüÿýÿÿÿúÿûÿýÿüÿýÿýÿüÿýÿüÿþÿüÿÿÿûÿýÿÿÿþÿþÿýÿþÿþÿüÿüÿüÿÿÿÿÿüÿüÿýÿÿÿÿÿýÿþÿüÿýÿþÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿýÿýÿýÿÿÿþÿþÿÿÿÿÿþÿýÿÿÿþÿýÿýÿÿÿüÿüÿüÿûÿûÿýÿþÿûÿûÿüÿúÿøÿüÿýÿüÿüÿûÿûÿþÿþÿýÿÿÿÿÿþÿþÿýÿþÿþÿÿÿÿÿþÿýÿüÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿýÿüÿýÿþÿþÿþÿÿÿýÿþÿÿÿÿÿüÿûÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿýÿýÿýÿÿÿþÿüÿûÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿüÿüÿÿÿÿÿÿÿûÿúÿüÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿýÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿÿÿýÿýÿþÿüÿûÿþÿýÿüÿüÿþÿÿÿÿÿþÿÿÿÿÿþÿýÿþÿþÿýÿüÿûÿüÿÿÿþÿýÿüÿúÿúÿûÿûÿûÿýÿÿÿÿÿÿÿÿÿþÿúÿûÿÿÿÿÿÿÿþÿýÿüÿýÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿýÿÿÿÿÿÿÿÿÿÿÿýÿýÿþÿýÿþÿüÿþÿÿÿýÿÿÿÿÿýÿýÿüÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿüÿûÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿüÿûÿûÿüÿþÿþÿþÿÿÿÿÿÿÿÿÿüÿüÿýÿþÿÿÿÿÿþÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿüÿþÿÿÿüÿýÿÿÿÿÿüÿýÿýÿýÿÿÿÿÿþÿþÿþÿþÿýÿþÿüÿýÿÿÿýÿýÿÿÿÿÿþÿýÿüÿÿÿþÿÿÿþÿûÿüÿüÿûÿþÿýÿûÿüÿýÿÿÿÿÿüÿûÿûÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿüÿÿÿÿÿþÿþÿÿÿýÿüÿÿÿþÿýÿþÿýÿÿÿÿÿþÿüÿüÿþÿÿÿÿÿÿÿÿÿþÿüÿúÿúÿýÿÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿüÿüÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿÿÿýÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿþÿþÿþÿýÿýÿÿÿýÿüÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿÿþÿüÿþÿþÿþÿýÿÿÿþÿþÿÿÿýÿûÿüÿþÿþÿþÿþÿÿÿþÿýÿüÿþÿÿÿÿÿüÿýÿÿÿÿÿüÿýÿþÿýÿÿÿýÿþÿþÿÿÿýÿüÿþÿþÿýÿþÿÿÿÿÿýÿþÿÿÿÿÿýÿþÿÿÿþÿþÿýÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿüÿýÿþÿýÿüÿÿÿþÿþÿýÿÿÿÿÿþÿþÿýÿÿÿÿÿþÿýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿýÿüÿüÿÿÿþÿÿÿýÿÿÿýÿüÿþÿþÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿûÿýÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿýÿþÿÿÿþÿÿÿýÿýÿþÿþÿþÿÿÿÿÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿüÿûÿüÿüÿþÿýÿþÿÿÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿüÿþÿÿÿþÿþÿüÿþÿþÿÿÿÿÿÿÿÿÿþÿýÿÿÿþÿüÿþÿsonic-visualiser-3.0.3/samples/hihat.wav0000644000000000000000000006625413111512442016431 0ustar 00000000000000RIFF¤lWAVEfmt D¬ˆXdata€löÿW–ÿ›þšŒû5ñ–,Ûk‚ù¸ìì3©ÉÕÄ©éÕô &ûì ã/èÐy«a –aþ5áRÓj:ô›øWRÓ,Û &C*5ñ'˜N°²O‡T,Û5á½Õ?Çš©étè‚1èËÞ5áMø[Y–èÐL¨I:ôúö²OW6ÀèÐ C*5!ûì÷Ùÿ'Ø:ôì3ð & S“ÙÁËÞ+;̽ղORÓ½ÕК®,0‘ ì3>G®,5 /C*eû‚ù`@`Õô &Ù'û³j"Ÿ# öC*tÌÁ8jBûóaÜú/W6–ÕÄ?çÔD³ûN°¸ú+;¸ú–ÙgÌ–Ý®,RÓ @ æŸóãìËîÕä÷Ù¸ú5!– æ5átè~''Øjúì3 ö©É5ùf÷jòjâÐñŒ'ØËÞ/ì©ÉË'ØaÜ›ðk³ûìÞêÙ'‚ýà¸k‡T~ŽšÙ'RÓRÓìŒtþ÷Ùû / ö½Õj"`f÷––íÌËî‚1@èЖ½[YÙ'y«–ÝÙ'Ë'ØRÓŸ#‘ÀŒ+ tüjBRÓÌjB &©É æš½Õ"@íýÁ,Û?Ç+;RÓÕIJOÙ'íýÀN°+{[Yy«RÓ‚1@+  ãÞêC*²OŸóX¶M jHËÙ'ö 0î" 0Õô+f÷Á æÕô¨IHÿûÀí–¤`ðŒûLÁ8N°jâ²OÞêRÓ‚ –íËÞ`‚1tèaÜö?çìÔD–ÝÕä0^0,Û‘ :ô5û ýÁìø›kÂLÐRÓ©éŸ#Ë~Î0Ù'–½eíÌj÷oõÀì ËöMø æ öW6?çÌ/+;kÂ¥¦ŸóW‚1Á'Ø æÞê–ÝÆ +e?ûÕäk›ðì3Á æðeûM?çRÓ0–Æ :ôò‚1®þ'Ø,Ûý•=fï½Õ–Õä?ÇÔD0^ æ,Û"fïÀ`ÿ‚1½Õ©ÉñC*÷Ù@²O?Çû 0~ÎHeC*Á8›ð–½e‘ ½ÕËH öÔ$5á½Õ‡Tj"èÐtþ©éÙ'`¥¦Ù'jB½Õ›ðRÓÕäC*?Ç–í‡Tãû 'üÕÄÁì'ØÔD›ø5á²OÙ'¥¦RÓC*®,'èÐjâ 55á̽ՠã~/ÁÞê©É½Õ// ã'5!5Á~›ø+©ÿy«5ÿL5ñË/û½Õ?ç¼ÿûì~+;‚ k æ5ñËöW ã½Õö ö –ÝÕäeð³÷Á÷Ùcaþ©É– í0jâRÓí~Ðñj"¸úfïC*,Û?ÇW6•=Þê‡þLÕäk³ì3öèÐaþì3?ç½Õ~öÁÔ$û ©Éðì35ùÕÄ0‡T,»?ûÔD"èи'ØÙ'/~+ j,Û©ÉC*Wf÷ŒRÓ©éÙ'èøö Æ ?ǽÕì3ík®,íy« æ5!Ô$ÐñkÂC*ÔDkÂ¥¦‘ Õä?ËËî~Î5!+; öÐñ+ &5!0– ËC*‚ÿ›ðÞêtèÆ j"5ËÞój"'ؽծ,DÀ'þÁ8Õĸì3¨Iöy«RÓ[YHRÓ–+0ú~Λðì3/àMÕÄý`‡þ"Œû©ÉÞê/Ù'àèÐûì ã5ñ/ ÷ÙD˸Œ &à®,ð,Û+;¸úö Õä0û šW6j" ãjâ–oõû•=?ç ã`Ëöe©é®,"í³RÓ²Oj5áË'ØM‡T'Ø ãW6MøÂ¸C*ËÞ©ÿÐËÞì‚1Ë÷ÙèÐ+ Áü÷Ù:þË~šøöÿì30kÂÁ Õ„5á²Oèøš‚1ÕÄ?ç•=Ð'þaÜ æèüŒW6~Ζ½W6j"0îñÁ––½ìì3íŒö 5áoÿíM5 :ô?ç‚1 &'Ø–ÝŒ‚ù,»"‚1èøjòþe~³½Õ~ΖÔDH æ– 0~ö æ›ð0MÙû~ö,Û³+÷ÙC*½Õ‚ÿ",ÛÞêì3júÀ+ ÕôÕäÙ'j5ùËö÷Ù5጖‡þ5!tèjâËÆ ~–í?çö æ5á5!WàŸóŒûû쳂 öËèÐÌÙ' &~öèÔ$‚ýÞꤤí/0tèÆ tè'Øì35 ÕÄÐùŸó5ÿ/Ë~νÕûìWšËËöÌÙÁf÷›ü\ÿ`öRÓËì3'ØÙý`+ Ù'–Ýjâ¨IÙ'ËÞ½Õ?û–MM ø,Û? æÁC*,»©éì3‚ýúèŸÙýÞêeW?Ç– •=Þê ãöj"ö ÕôèÐ /kÂjò²O½Õ,»û ¨I‚1í³ÌW6›ðoõŸ#àì+ 5ÿË›ð,Û""f÷+ Ðùš"èÐÐñË÷e¸úRÓÞêŒíËöeû©éfïC* RÓ–Ý@‚1?ÇÞêóÞêW6Ðñ‘kÂû ‚1ì®,à,Û‚q÷٩ɲOjú½Õ0ËÐð~ö/®,5á,»0îŸ#etè–íŒ"óy›©é0î"ЖíÞê+ –0jò5ù– "ö"fïRÓ`Æ Õþ ööèЮ,Ù'©É³ójâÙ'³jòf÷©éóoÿ50 ã©éjMþ÷ójú`ÁŒö Ÿóöì3©Éì¨Iì3÷Ù¸‘ –fïÕô÷ûìŒèÞêÁ8ËkÂ5ñfïjC*üújâÞêŸ#jò–íWì3‚ ¸ÐñÔ$Œè æ?û/Æ èÐej©é?ç'Øe/Ì–íC*©é?çfïÙû‚1:ô½Õ–öjâ›ðÁËîøC*+ ?çMþ – Þêý–Ëÿ+ úe‚ùà:ôí‘©éW ©é~ÎÞêŒ"Þêfïö ŒÙ'~–Ýû'þ+/aÜËÞ®, &þ'Ø5ñ/ú æ– ýèó,ÛŒ–ÝDÐñ›ü–Ýó+eŸó©é:þ`eRÓ®,?ç–ÿe öe:ô öÙ'Ù'ð½ÕðÙ'~Ðù5!Ÿóe– ©É0îÁetè0î–C*–Ý'Øû +Œ\ýfïûþÞ5ñüÙ'"RÓ'Ø®,/Ðñ–ÝMüö–©éÐ"ðŸóaþ0+D–³–‘ ©éŸóŒûMû Ðñþ5!`ý–Ý©éŒ0©é5ýö :ôHÆ ~ÎjòW6ÐËÞoõ5Á0î›øË:ôËööÞìËöjújúèøËË~ö‚ù‚ ¸ú'Ø~"jöaþŸó`+jâRÓíö~öÁþ–úoõË‚ ÞêÐñ›ø~ö©é'Ø ãÐÿ5:oÿe¸úÕäfï~0jeûì+ èøþMø³÷ËÆ \ÿúeû5 Ÿ ö5 ³©éÙûC*jâ?ÇöÙ'ËÐù ã‘a ýj~ Á½Õ ãËö"Ù'oõ'ØMÁjÙ'– ~öÐñ÷Ùjì3 æËîÆ Ðùö ûûö³5ý'ÞêÆ Æ  ã‚ù®,Hÿ5á+5ý'Ø0jûìþíö fï?"›ø›ðã+ ŒûtèÕ䚟#RËÞ?ç‘ 5Ÿóó'Moÿ›ø~Á‚ù'Øö/›ðí‘ ½Õ æ‘ Ÿ#ö à5á~öû Wš?çèÐf÷`0tè›Æ ì:ô0îtèj/+ ËÞ5ñ Ë–í'Ø5 fïÁ³?ç–Ýû W6aÜf÷š?ç'ð ãjË0½Õ~öDÕôÆ ¸ú‘ 5!¸úðèü®þŸ‘a + 5ù0ûþûj"+ –í"³÷tèWÁíaþ:ôMøð0–aÐù?ûtèŒÙ'jÐñtþãúèøeãÿÕäjò0ö"©ÿúHû æeË'ü ö³ÕôMø`~ûìú"jú'üaþì©é³Ô$Áü0îÁÕôËîÙìÁj"~Þê'5 Þê‚ý+ öoõWM æ~ö5ñÕäúŒÐù+ a òfï–íËeìú?~~öìÁËRÓa"–íŸó0We'ØËMü'ü³Mütð,Ûø –Ý ãí"oÿ è‘ tüÕôÐñH þRÓ›ðC*WRÓHÙ'a :ô–íe– Õþ ö?ç³–¤Æ‚ý©é+ ËÕä©ÿj"jâ ‘ö5ñaÜ"0Mø‚ùü‘ 0îtèÙ'ã5ñ+ ,ÛËö þee›ü5ñH`0èø‚ù:ôa HÿÙ/‘–Ýf÷è+ ûeûtý–íû WÕþ05ý˸Mø"ûìËÞ`Ëãû©éŸ#–ÿ?ÇtüoÿMWÐñÕô¤'íÐñ÷Ù?ûöj öÞêËû :ô~öû ®þ–íÕôö ~tèèø"5:ô'ØWÙ'àÞê5ù³:ôÆ Œóí"ÿËÞö `›ð ö+Œ'ü"þ ãÆý`ìÕä+ ûíeËÞ‚ 'óe,Û:ô/‚ù5ñ‘ \ýeûMø~öíû eìH+ø³ ãóM"W öjâ5ñ+ Æ û–ÿ æ‚ýÐÕäì–+jú0î0îšíÐñoõ &WfïÐñe ¤jâ³è\ý:þfï– ®,Ðñ5áû øjò+tËööÿoõ0"+ è005ÿìòÆ Þê5ñj"û³÷ËÐÿoõŒûH–Ùûø05`ûì,Û5WaÜoÿí'Ø‚ÿ ûŸýŸóŸóša úËÐùÙýò~ö5f÷÷Ÿóš"ðHÿšf÷ŸóìãÙ'Þê©éWÙ?Ÿý›ðRoÿjú¸úûìŒû5 Æýö šø0îe0tèÕôû efïeeûìûüËÞ:ôš‡þ5ý:ó\ÿ~Ðù'oõjò0W›ð5á`³÷‘ oõ'Œtüûþfï"Œ0î³+5ý` ö æ"û oõèü–  ö¤Móø0›øe5!‚ùfï– ‘ ýjú?Mjòýoõ+ ÁŒûa öj5 ‘ a ã5ùû5`oõ?ç˳ý³Ÿó öÆ Ðûì?û–tè–ÿ³Ðù~Mú'a Œ ã öj:ô:ôWa æ5ñ~'èþf÷ûìDíËöÕô fï0î?Á‚ù:ôMóoõÿ:ô'þ‘ ö:ôŒã‡þ©ÿ5ùe+ ©éMüÁìŸó‚ 'þŸóoõö ¤Ÿó5ùú'íø³Ùýoõš0³èüðýÐjÙñŸó– Æ –íjúËŸý?çWW³5ùH›³ûÐÿeûÐùËa ›øjò³íñèþš0tüÐùèW‚ÿŸó~û û Ÿ–ÿa ãeûñ¤³³‡þ›øíÙËö5 + Ùûè'Ëî\ÿW0\ý~öèøËŸeÆ û³û:ô?ûšŒ‚ùèø³H‘ Ÿjúj ö~öoÿü¤j5ù¸ñËÆýó5ù³ý¸ú'5ÿ5ñjj©éjò›¼ÿÙ?èüy›ü³÷–ÿ~f÷¸úeûóeÐùMü¤ó0ÙÕôËÁü0îÐÿfï›øeû'ü¸úüÙû›øûŒM‡þûè?5ýú›øã‚ 5ý5ñ?05ýMøÐù³~5ÿèüËö³5 tüðËoõËÐùèøÁüeû ›þa ³û¤MMø'üûyËÁ›üÙýÙýø'oÿ®þÆ Ëíf÷Ÿó5ùËeûËîË+ ?Ætèþ\ÿ+ Á‚ÿ¼ÿÕôûËèøjúŒ‚ oÿÕô¸ú³›þ³Æ 5ÿŸó˳ñ–›ø:þ\ýÞêö íf÷ø'Œ³ûãÿÙ³³ýÕôèüûû0Mþfï‚ e›üf÷ý\ÿ›üW‚ ?Ëö öŸójeÙý öÿ›üÐùŸý›ø‡þtûñÐù³û0Õþ?û³÷‘ ¸ú5ý5 ÐñèøjË ö–~ö~ö eûËö?ÙýòH'f÷›ð¤ãÿèøÁ‘ ‚ íýó:þ:þèøÙ\ý÷Dúöÿö júf÷eûûeËtüãÆýþ³¸ú ‚ òM‚ÿ³û‘ û~öMþa ÐÿŸMøMüjú'þË–Hÿûû'þÙ¼ÿ:þ‚ ›ú'ü5 û èøŸó– 0Áþ5ÿÆýÞ\ÿMø³Müö èü›øŒÐÿŒMüoõšË öH³tüèü›øË+ üÐÿ'MËM?ûð‚ù‘ ³Møèüeû ö5ÿ?jú–í÷W+ 0÷®þ¸©ÿ³‚ÿ5ù¸ú›5 ©ÿ‚ù0' öjúÐÿöÿü‚ýþøÕþËeeûÁþûþø:ôM"0?çøí³ öò5 eû³÷5ÿ‘ Mðøûñ\ýHÿM³ýjò–+ júÐÿjò5ù`³0îèøË0aþø~5ù:ôa èüHû–ÿeòeûòe‚ý›øe~tü'þMò ö¸úö 0 ö‚ý³ö "ÿ5ñ?û0˸ öoõÁþûèüÁüãHtüaþaþ‡þ5ùËö?³'®þú‚ùí5ñ¸úËÐùûÞ– :ÕôËûþËejúÁþ³ ö+šíýoõøË–›øoõ"ÿM0ŒûûH¤ öûÁ›øÐù5 û?ûãÿñÁ³›ø:ôtË:þúŸ‡þ?³MøŒû?¤ü¸úM›ü5ùû HèüjúŒû³'ý›üH:Mþy‚ý›\ýHÿûþ›üW ‘ èøf÷+tüŒû®þ›üÙû¼ÿÐù'þŒ›ü÷¤ö j¸úHÁ?ûþËŒ¤R¸ûþ‚ù¤ö ³ûúËÆf÷ã‘ úèüMüÙý0û5ùãÿ?‚ýøèü5 ©ÿÙýýÙt5ùÕôÐÿ'üû5 ú0î›þèŒ'þèüŸýR³÷ãö ¼ÿtüHÿ³ý?š\ý~èøË– \ÿMü³0ûü‚ a ö›ð5 eûoõ0ñ¼ÿèþ¼ÿR?e~~\ÿ"ÿ÷0oõã‘ MþMøÆýËþø+³ýHÿ:þŸýÐùf÷0ûoÿ??û¸ú¸úýaŒñ÷:ôMüMËíý\ÿjúoõ5ùŸóa0ø'ü¸ÞèË›øtþHÿMþ~tãReû¸úÁüe÷³³jòRËjúã~èø³÷?û W?ûíýËñ5ý?ûoÿþ³û›H¸úÙýÐÿÁþö ûtüöÿ~‘ tþjòöÿö èþ\ÿòŸýšãMüûÙû®þÕþ‘¼ÿ‘›'ã›ø³ûãòjû–ãÿèü"ÿe~oõ:þ‘ ÿËöÁü0©ÿ›ø5ù\ýMñíÐù³÷'þÙÞ¸e5ÿ÷Müû5ÿ~tþjúúöÿ+Œûee ö5ùöÿMþjú›øèü++ËÁüüŒ³ýeûËjúøHÿËûÙMøËöýí Mü?ûýíýŸ'›üjú–?ûtþoÿjúoÿ'üýËËÁaþf÷Áþ›Œ:‚ýŸýŸD‚ý'‚ý?Ù‚ýtþÙ'‚ý5ýÙ³ýaþ~~Œû‚ùeèþjúoÿM³Ÿ˳MyÐù\ýtþjM³Ë–ÿeãûþ®þaþŒ0ÆýŒË›üòtþ–W5ÿûþ›øû–¸úããeûtüýûÆý?©ÿtüÐùtü5ýeû~Áü›øeÿûû?ŒûÐùoõ\ý5ÿèø5ùaþíûMüöÿMþÞèþ5ùoÿãÁþŸýÕþÙýû~ûí›üf÷òËÿÕþŒû+?Þ›þ~öèøã¤júMü‘Ÿ³û?û? 5ýy‚ÿþÙý‚ý³5ýûþ¸\ÿñãŸý³÷"ÿey\ýH?DeMü‚ý³aM+Áü?:Ùýe®þ›þ'¼ÿeM5ÿ³ö íý'þãûþø?~?Ùûûa¤Ðÿ'\ý0'ËËÁMø‚ýû~Ÿ ‡þtþèüò~eüãöÿeû›ü0tüoõMþã‚ýÙûÐÿíýèü›üñeû5ÿe‚ÿ~Hÿ~ö‡þ–tþÙûyèþÐùeûŒe¸ú›üû ÷›ü›³ÐÿÐùúËÕþ?û³ý~5 ŒøèüÙÐÿû³û~ ûÕþMüûûþ\ýÆý®þeûMüoÿ'Áüoõ5ùHMþeŒ¼ÿ\ÿ\ýãÿ~?0yÆý''Áü'þËÿ5ÿ"ÿÆ'©ÿ\ýŒÙ®þjúaþŒe¸þ5ýj‡þ~›üŸ–ÿ?ûòíèüÞûMþèþMþ¤›ü??íý¸úü:0R‚ý~HÿòãÿHÿÆMüÁþËHöÿŸýËûþÁþ¤ –ÿíWÿÆÕþÆûÿtü+Ë'üe¤þ+0–ÿý5ýŒ‚ýyH\ÿ‚ýRöÿjúÁüR¤eÐÿ³ûÆý‘"ÿMþ‡þ‚ý‚ÿ+›üûþ³û³÷tþ‚ÿÁüÐÿ³\ý›üü¸úÞËÿ©ÿ¤ûŸýŒûŒeòŒñ‚ýãÿaþèü®þ W‘í¤Ë‘úMþ³þ©ÿÙí®þÆýË'W–ÿy¸‚ÿ+›þ®þe'Æûþ‚ý–ÿ¼ÿ:þýÕþ'oÿMü'ãÿMø'Œ›ü¸úÙý³ñ\ÿ'y‚ý¤Müoÿ~Æýjú+Œ‘RÞHÿËaþ5ý+Ë~©ÿ'üÕþ?ÙŸý\ýöÿÞ¤®þ›:‚ÿòýWe'þDÙûoÿjÙ'5ù¸úŒ³Ë'þÕþHjþÙÐÿ'ü'þeûMþíý?5ýeû~³oÿŸýtþ0¤eûþeÙýèüûþ‘ý–ÿ'®þ?û‚ÿñÞþãÿ®þ‡þa‚ýýtãtþ'üÞ~a:¤Œyaþ¼ÿ0oÿtþ³ýeû5ýÐÿ‘ÙûûŸ~ÁüúýËûþÕþ"ÿ®þ¼ÿãÿ³ýjúÐù+tüË5ý?û~ÿÁüËèþ©ÿËèüMþ¤í‚ýþöÿaþŒŒöÿÐÿûþŸýÙÙûúÁþ¤ÿ'ü?›þ\ý ›\ýÕþ:~Œ0yí¼ÿ¤eíü®þŸŒŒíòŸ Ðÿ¤Ë tþÆÆ+Ðÿ\ý‚ÿËŸ–˳ý‚ùWtÁþèþÙ~¤5ýñŒ®þ'þoÿñ›~Ÿý©ÿÞÁþ"ÿËÞWŒŸÕþÐÿ‡þ+\ý‚ÿûíýíýŸ³ûû³û‚ýË5ÿ'þMüüa©ÿtüýtü5ÿÞ‚ÿûþ5ý5ÿ:þ‚ùeŒeûèü:þûÁþËÆ0\ý¼ÿËèüÕþñ\ý³ûoÿ?›Õþ?û5ýtþ0¤¼ÿaþ³ 'þ?Áü?üoÿÆ5ÿ–ÿtüjúýöÿ¸®þ'þy'Ùýûãÿ~5ÿ®þÙŒÕþ¸'¤~tþÁþŒû?5ý®þ¤¼ÿþíý³Á'üèüÞ0Œ ÿËèþèþöÿ~‘þoÿþ¼ÿ'e‚ÿ©ÿoÿŸý‚ÿ~Áþoÿ?‘þ¼ÿ –ÿHÿ³ýãÿÙ?D³ýW˳ýËò:þƳŒ+Mþtþöÿ›þ0¸MR›ü›þWý›þËe‚ÿMþ³ý~Hÿ"ÿÙýWÞ\ÿ"ÿý"ÿòŸ~Rjoÿ¸MWÁþ¼ÿÿãÿa~–ÿ¼ÿMüÆýÙ\ýMüãÿR³ý5ýöÿ–ÿ¼ÿ©ÿ~'þ\ýí³ýWÁaþ›þèþ©ÿ¸oÿMþý‚ýoÿŒ‚ýy~aþþ–ÿ–ÿ¸yÞoÿR¸"ÿŸ¤y'›þ¤íûþŸy0~‚ýèþ‘íýj?'þ5ÿ‚ÿËÆ\ýèüŸ?W~èþèþoÿ¸Õþ5ýýtþ¤©ÿoÿ©ÿèü5ýaþ©ÿ¤¼ÿ:þ\ý'þÐÿ ‚ÿ¤ÁþÆýyy¼ÿ\ÿ"ÿ"ÿHÿj³?‘aþ\ÿ+¼ÿya©ÿËy‚ÿHÿ‘'ÐÿŒû~³Ùýü"ÿƤaþèüW aþ‡þoÿíÐÿ\ýjíýãÿ–ÿ0˼ÿaþeèþèþÆaþ ¤\ÿÁþ+Œ~›ü‘¤òíý'þ~íÕþ0R~~oÿÙ:þ\ÿM¤‘‚ÿŸ¤ŸÐÿÆýÆHèþü˳+ÿj³ÆûþHÿÐÿe¤Áþ³?\ýMþyeöÿ"ÿ"ÿ~'¤Dþò©ÿÿ®þoÿ¼ÿ©ÿËjÐÿÁþüÕþ'HÿÞí\ÿÁþýÁü0¸oÿ¼ÿþ‡þÙýtþèþtþ‘ÿ³ûMüMþÿaþãÿ:›þÆýŸòò‡þ³ûöÿ¸ ~öÿ–ÿ+\ÿeËèüDèþËãÿHÿòaþ\ý¤y¤\ÿŸýûþoÿ\ÿ?yWöÿ©ÿaþ¸oÿHÿòÁþÕþÙ¸Ù?‡þ–ÿË?Æy¤íÞÞËþ0Ÿ0³RöÿÐÿDË~èþÞ³'þöÿ'ŸD¸Œ? –ÿ:jÙý"ÿ‚ÿ++ŸýûþˑނÿHÿŒ0Õþe?ÁþöÿÞWöÿÿ05ÿþ–ÿ‡þÙý0öÿoÿaþMüûþŒÁþèü:þ‚ÿ‚ÿ:þ WÁü\ý~ò ›þíýMþ:þ¼ÿ®þMþŸ~Æýþaþ¸Áüèü"ÿD¼ÿý\ÿËWûþÐÿD³0‡þ~ÐÿÕþÐÿˤ?ãÿ®þRöÿÙý~òËRj~Þ³05ÿÞ‚ÿW:Wj¤öÿ³ÆyÞþÐÿ©ÿeÞ¸¤Ù'Ë›?5ÿ¸'ñ~›þaMÆ"ÿ¼ÿ?‚ÿ+~oÿWò¤ñaþ–ÿË+ÕþWíy‡þíý¤ûþÕþ'þMþW–ÿÐÿ¤–ÿoÿ\ýþ+öÿ+ÿÕþþtü"ÿ–ÿtüþ¤¼ÿ'þ³ýMþ®þýÁþW'ü5ýãÿþÿÐÿÁþŸý³ûÆý~®þèüþÁþ›þ‘~"ÿMþ›þÐÿò¸0oÿj~Þ:þŒ?ÐÿÞ›þ:þ öÿ¤Ë©ÿ–ÿ\ÿ©ÿò¸¤RÐÿ‚ÿãÿöÿþ¼ÿË©ÿ~Ÿ~?©ÿÙŒ~Ÿ¤eÐÿ–ÿûþeí~¸¤ûþíHÿöÿöÿ‘aoÿÆD‡þ0jèþ5ÿíòŒjãÿjD?³Õþ yöÿÙeoÿÐÿÿãÿöÿtþËÕþ©ÿD+Ríý®þ¤ãÿ¤0¼ÿWHÿHÿèþÙý~e®þ®þ®þMþ ÞWèþŸý®þãÿW+ ®þÕþ'þÁþWöÿ©ÿÿ®þÞRDjûþ‡þÐÿãÿD\ÿaMãÿ‚ÿèþãÿe¼ÿ¼ÿeR+¤D¤tþèüaþ©ÿŒ?Ùýèþ¤W‘ãÿãÿoÿöÿöÿ¼ÿòöÿÿ~–ÿèþjWËMþÕþ©ÿ‚ÿò¤‘5ÿÞe ³¸èþ~Ÿy~Ðÿ+òoÿW¸0ÐÿÁþoÿÐÿŸýMþ¼ÿHÿ ãÿeãÿ~ÆûþoÿÞöÿ~oÿeòoÿò¸ŒŒjoÿ¼ÿ³©ÿãÿeaþ‚ý©ÿ¼ÿãÿ‡þÙýjöÿoÿŒ‘ãÿW‚ÿãÿ ¼ÿWãÿãÿjþíý~¤ãÿoÿ©ÿË~òãÿŒí\ÿãÿ0:Ë í+~¸+‘HÿyÐÿR¤©ÿûþ³ýíý:þMþãÿoÿãÿHÿ\ÿ5ÿ–ÿ‘³–ÿeyR¤5ÿÙ¤¼ÿoÿ~¤5ÿöÿ'RW–ÿHÿe\ÿ5ýjòöÿÁþ‘Roÿ‚ÿèþÐÿÙW?ñj\ÿöÿ ¸j–ÿ5ÿ y¤®þ–ÿoÿÙýoÿ0DWÆýþöÿ‚ÿ ¸~¤‚ÿÐÿR Hÿ¼ÿ?¼ÿöÿj~Dèþò+y DÐÿÿW~Ëeãÿ~Œöÿ ãÿÙòãÿR‘j\ÿËöÿ¤+~‘WDjj ÿHÿ¼ÿ®þ®þ©ÿãÿ"ÿíýèþ~ öÿÞ¼ÿ5ÿDèþ¼ÿŒ ÐÿÐÿ©ÿ¤Áþ\ýoÿ¼ÿ¤+–ÿ ûþ–ÿoÿ¼ÿj5ÿèþ5ÿ›þ\ÿ¼ÿ–ÿãÿtþtþ öÿËÞ©ÿ¤¸¼ÿ¤~~DË+ 0öÿÕþ¼ÿ¼ÿûþíýÿHÿöÿÞöÿ©ÿ\ÿMþ¼ÿ‚ÿ\ÿ¸oÿDeãÿ‘¤oÿj–ÿ~ ‘¸+~–ÿ Mþtþ¸¸eRMþ\ÿ?Ÿ‘ÿ ³¸ÞíRDöÿ?³~‘¸+~?j¼ÿ+öÿÿ~–ÿ‚ÿHÿ¸WÕþoÿ ‘¤‘D–ÿöÿãÿ¼ÿDÐÿÕþûþèþ5ÿ‘j~ ÁþÁþMþÕþöÿoÿ0ÆyŒÞ 0–ÿ+Ù³WMþj~ÿÆý\ÿy ‚ÿ5ÿ®þöÿHÿMþ‘j¼ÿ‘‚ÿ5ÿ‚ÿeyÞ³j¼ÿ¤öÿ‘‘yöÿ‘öÿûþ©ÿ‚ÿÐÿ©ÿ‡þDjûþ¼ÿöÿ¼ÿ‚ÿ¤òÐÿÞ‘‘D~ Ðÿ‘‘ÐÿÁþÿ¤Dãÿ¤‚ÿÿÐÿ\ÿ0¸ÐÿD5ÿÁþR+©ÿãÿ ËÆRŒRãÿ¼ÿ5ÿHÿ¸ 5ÿ©ÿò ‡þ\ÿaþíý5ÿÁþ©ÿDÕþoÿöÿãÿò ‚ÿ¸©ÿ"ÿÿÕþDjD³ÞDò ¤R¤yò‘ŒHÿD0¸0ûþ Dÿ‚ÿÿûþöÿ\ÿD'©ÿoÿãÿËöÿHÿÐÿãÿ¸y¸+Ÿ¤D¼ÿÙ?¸¸5ÿ¼ÿ¤¤M+R¤05ÿÙñ~0©ÿöÿe ‚ÿ\ÿtþW"ÿÕþ\ÿãÿ¸ öÿj~?ò+ oÿ+j\ÿ¸ReÐÿþ©ÿòòHÿMþ5ÿÁþ–ÿ‘"ÿ‚ÿ‘W¸ûþÙý0~0Hÿe 5ÿ©ÿ?–ÿ©ÿÞHÿoÿ5ÿ‡þ \ÿÕþjãÿ\ÿ¼ÿ‚ÿ~‘5ÿDöÿoÿ‘‚ÿ\ÿ5ÿ ~5ÿ¸¸D¤Dee òËHÿÐÿ¼ÿ¼ÿD‚ÿ0‘‚ÿD0+‚ÿHÿ~èþûþ~ 0¼ÿ©ÿD+öÿãÿöÿöÿ?WHÿ¼ÿ‚ÿãÿ0–ÿD5ÿ‚ý–ÿD\ÿDÐÿ‚ÿ¤öÿjy¸DDD+Œ+~"ÿ©ÿ?¸¤Wöÿye¸¸HÿèþÐÿ0W jaþíýöÿ~–ÿÕþÐÿãÿÆÆRò5ÿöÿÆòWˤj¼ÿ‚ÿ~¼ÿÐÿ\ÿûþHÿ ‘ãÿ\ÿöÿãÿ~¤©ÿ ãÿÞDûþ©ÿ0~ÞË‘›þÕþoÿ©ÿ0öÿ®þ‡þ©ÿ¸+D©ÿ¼ÿoÿ ¸öÿ0D–ÿË~ò˼ÿ Dûþoÿ00¸ãÿ\ÿ0oÿoÿ¤ ¼ÿöÿoÿÿÿWŒD‚ÿ–ÿ"ÿ‚ÿoÿ¼ÿÞ©ÿ‡þ\ÿ‚ÿ0¤¼ÿÞ\ÿ®þDW öÿ"ÿ¼ÿ©ÿ"ÿËe‘05ÿãÿ¤–ÿD¤DR0ãÿR¸?W+j‚ÿ+~0?ÐÿWeÐÿÐÿoÿ5ÿ¸–ÿ‘ ãÿöÿ‚ÿW¤Ðÿj‘0~D?¤y‘~ ‘D–ÿj©ÿoÿ›þ\ÿöÿ5ÿöÿ0~Röÿ¼ÿ+j~ËDòDÿ–ÿHÿHÿöÿûþ"ÿöÿ‘ËW‚ÿWŒ¤0‘Hÿ:þÐÿWj¤öÿ¼ÿ¼ÿöÿWoÿMþ\ÿDöÿ‚ÿÕþ‚ÿÐÿaþûþãÿ"ÿ–ÿ©ÿ5ÿÐÿ©ÿ¼ÿ0ãÿ \ÿÁþ¤?\ÿ:þèþ ÁþÁþ\ÿoÿöÿ\ÿoÿW¼ÿ0òöÿ–ÿÿãÿÐÿ©ÿ¸jDË‘ËR?‘‘jÐÿD?Þ¤ãÿ©ÿ?Þãÿ?ÆeW+³Þ‘0–ÿj‚ÿ¼ÿòj~‘D+¤öÿÐÿHÿ 0\ÿD¸~W‚ÿ–ÿ0‚ÿoÿ ©ÿ öÿÕþ¼ÿjò³‘¸¼ÿ©ÿ–ÿoÿjÐÿãÿ³Þãÿ¤W0öÿ5ÿãÿ©ÿ–ÿDûþ–ÿÞ‚ÿÿ5ÿ–ÿÞDoÿÐÿ¼ÿ¤¤¸WÐÿÞ¸ ûþÿ‚ÿ¼ÿ 5ÿjãÿèþ5ÿÿãÿW–ÿ ¼ÿ"ÿ5ÿûþ©ÿDÐÿWW–ÿãÿ–ÿ‚ÿ~–ÿ©ÿHÿD~"ÿ5ÿ©ÿÐÿWãÿãÿ‘¼ÿãÿãÿÐÿ¸öÿ©ÿË0Þ¤¤ò00‘‘òj¼ÿ©ÿ5ÿoÿ0j~‘W¤+¼ÿWy¼ÿ"ÿ¼ÿ©ÿ¤¸ãÿ0 –ÿöÿjW˸ãÿÐÿ‚ÿ0 öÿ‚ÿ¤‘öÿ~öÿD?~‘Wöÿ?òW+Þ~¤¼ÿ ÞDj5ÿ5ÿÐÿDWoÿHÿãÿ©ÿ ¤j¼ÿÁþ›þ"ÿHÿj¸©ÿ ÐÿHÿ0DW¸Ðÿ¼ÿ \ÿÐÿöÿ\ÿ–ÿHÿHÿ©ÿ5ÿ¼ÿÐÿûþoÿ©ÿoÿ ãÿ¼ÿ©ÿ0jÿèþHÿÐÿW¼ÿ–ÿHÿoÿãÿoÿ ûþãÿÐÿD5ÿ‚ÿ‘oÿHÿöÿj¼ÿHÿjòW¼ÿ\ÿ0¸W‘öÿÐÿ¼ÿDËWWãÿ\ÿ Hÿ5ÿ~~DöÿÿãÿW–ÿ¼ÿoÿ–ÿ‘0©ÿDDãÿËj‚ÿ¤ÞD‘ jË©ÿ©ÿD~öÿûþ5ÿoÿ‘˼ÿöÿ0¼ÿãÿ–ÿHÿW¼ÿãÿ©ÿöÿ‚ÿoÿ5ÿ\ÿ‘¤WjöÿDW 0j~j D‘j~0ãÿ¤W©ÿ©ÿ¼ÿÐÿ0W~¸öÿ–ÿ~D0ÞD\ÿãÿ ¼ÿãÿöÿÞÞ\ÿ ¸ÐÿDÿoÿ~¼ÿöÿ "ÿ‚ÿ–ÿ©ÿjöÿöÿW©ÿ¼ÿöÿ¸ãÿ\ÿöÿ–ÿHÿ öÿ‚ÿ0©ÿ"ÿ–ÿÿûþÐÿ¼ÿ ~ãÿ–ÿ¼ÿ¼ÿ0ãÿ¼ÿöÿ¼ÿãÿ0j¸~j‘©ÿ"ÿ0D¼ÿ¼ÿÐÿj0ãÿWÐÿ\ÿ‚ÿèþ‚ÿj0Dãÿ\ÿãÿ©ÿHÿ–ÿoÿ\ÿ‚ÿoÿ ©ÿÐÿ\ÿoÿ~ W¼ÿÐÿöÿãÿW ‘Ðÿ¼ÿWj~WD~öÿ©ÿWjöÿãÿãÿ~ËD‘W©ÿ öÿöÿË‘‘‘j+Þ W0~öÿ0j©ÿöÿ~0¼ÿ¼ÿ‘¤ò‘©ÿÐÿ‚ÿoÿ0¼ÿ"ÿ¼ÿW ¼ÿoÿoÿ¼ÿ5ÿ‚ÿ ©ÿãÿ‚ÿÁþ‚ÿÐÿoÿ¼ÿ–ÿ‚ÿ‚ÿ"ÿ‚ÿ¼ÿHÿ‚ÿÐÿöÿöÿoÿHÿoÿ5ÿöÿW ~–ÿ000Wãÿ0Hÿ‚ÿ W¤ÐÿHÿÐÿÐÿöÿãÿ‚ÿ D 0Ðÿ–ÿöÿ©ÿ©ÿÐÿ©ÿ0jöÿÐÿÐÿD‘öÿãÿ ¤‘©ÿ0jWËD¼ÿöÿ¼ÿöÿW W~¤Þ 0‚ÿöÿ¤W‘~0‘ãÿÿ–ÿ~Wãÿ~~0‘WDjÐÿ‘00¼ÿoÿW¤j‘j~ãÿ"ÿöÿWãÿD¤¤j öÿ¼ÿoÿ©ÿ‚ÿÿ–ÿ‚ÿ"ÿÐÿöÿÐÿ–ÿÿÿ5ÿHÿ‚ÿHÿHÿ©ÿ5ÿ–ÿj Ðÿ¼ÿDöÿ~öÿÐÿöÿ¼ÿöÿD0©ÿ0˼ÿ©ÿöÿ\ÿÐÿDÐÿ¤¸Ðÿöÿ\ÿãÿ~ãÿ–ÿ\ÿ¼ÿ¸j–ÿ–ÿ©ÿãÿÐÿ–ÿãÿãÿÐÿ ¼ÿjËãÿ ¤öÿÐÿ ¼ÿãÿ¤DÐÿöÿöÿjjÐÿãÿ¼ÿöÿ¤W0~ D~ò ‚ÿãÿ‚ÿ~–ÿ–ÿ¼ÿöÿ¸ Ðÿ‘ãÿ©ÿjDj‘DWöÿoÿÐÿöÿ~Ëöÿ–ÿãÿöÿWÐÿ–ÿ‚ÿ‚ÿ \ÿ‚ÿãÿHÿ\ÿ‚ÿãÿj¼ÿ–ÿãÿ–ÿÐÿ D0jãÿ©ÿöÿÐÿ0Wãÿ Ðÿöÿ©ÿ©ÿöÿoÿ©ÿ©ÿ\ÿãÿ–ÿ\ÿ00©ÿÐÿ¼ÿ‚ÿãÿöÿöÿ oÿHÿÐÿj‘ãÿÐÿãÿWWãÿãÿ¼ÿ¼ÿ –ÿ©ÿãÿ–ÿ¼ÿ©ÿ–ÿD~ ãÿãÿD öÿj –ÿ 0DãÿW j~öÿöÿ‚ÿ‚ÿãÿ‚ÿöÿjöÿãÿ‚ÿ5ÿãÿãÿ©ÿ¼ÿ¼ÿ0j 0D0jöÿW0 ãÿ©ÿ 0¼ÿ¼ÿöÿ0–ÿ¼ÿöÿ–ÿ‚ÿãÿ oÿ©ÿ 0 ‘¤Dãÿ –ÿöÿDÐÿ‚ÿÐÿ0 ©ÿÐÿ öÿ0 ‚ÿÐÿWöÿDöÿãÿjWj~ D0öÿ–ÿ©ÿ ãÿ¼ÿ‚ÿoÿ©ÿ‚ÿ©ÿ¼ÿ©ÿöÿöÿ j ¼ÿD‘~WW~D0öÿÐÿãÿãÿ¼ÿ–ÿ‚ÿ–ÿ\ÿ\ÿDÐÿ¼ÿ–ÿ\ÿ DÐÿÐÿ©ÿ–ÿW~‘¸ Ðÿ ~WÐÿD~jDÐÿ ÿHÿöÿ¼ÿ©ÿHÿ\ÿ0 Ðÿ¼ÿ‚ÿãÿ¼ÿ©ÿ ãÿ–ÿ–ÿ–ÿj ¼ÿÐÿ\ÿ–ÿ~öÿ ©ÿãÿãÿ‚ÿãÿÐÿ¼ÿ0 Ðÿ\ÿÐÿ ãÿW~öÿÐÿ©ÿÐÿDDöÿoÿãÿ0ÐÿöÿöÿãÿÐÿ¼ÿWD©ÿDöÿ D~W W0ãÿ©ÿöÿDD~‘~ ¼ÿ ‘‘‘jjjÐÿ‚ÿÐÿöÿ0ãÿ ©ÿÐÿ0ãÿ¼ÿãÿ©ÿ¼ÿÐÿÐÿ0ãÿoÿ¼ÿãÿ¼ÿãÿ©ÿ©ÿÐÿ©ÿ\ÿ5ÿHÿ¼ÿÐÿ¼ÿW0¼ÿ©ÿöÿDjDãÿ¼ÿöÿÐÿãÿöÿ0Ðÿ–ÿöÿ0WãÿöÿWöÿöÿ ©ÿ¼ÿÐÿDW\ÿ"ÿoÿ\ÿöÿ ‚ÿ–ÿãÿD0D0öÿÐÿÐÿjãÿ‚ÿ –ÿHÿÐÿÐÿ¼ÿ–ÿ"ÿ5ÿHÿ\ÿ¼ÿ¼ÿãÿDöÿ ãÿDWöÿD0D¸¤DöÿÐÿj‘DjW Ðÿ¼ÿD0¼ÿÐÿ–ÿoÿöÿãÿöÿ ãÿjDj0 ~WDj0DDÐÿãÿ ãÿ¼ÿöÿöÿãÿ–ÿ–ÿD öÿ ‚ÿÐÿD ‚ÿoÿöÿãÿj©ÿ–ÿ0 ãÿ–ÿÐÿãÿjöÿ¼ÿÐÿW0¼ÿ¼ÿ¼ÿDD¼ÿöÿ¼ÿD 0~¼ÿ©ÿãÿ©ÿöÿöÿ~ãÿoÿ©ÿ¼ÿãÿ¼ÿ5ÿ‚ÿÐÿ©ÿãÿÐÿ–ÿ–ÿ‚ÿ‚ÿ‚ÿÐÿD©ÿHÿÐÿãÿjÐÿ¼ÿÐÿ–ÿ DÐÿãÿÐÿöÿ¼ÿöÿWÐÿ–ÿÐÿ–ÿ¼ÿ©ÿ©ÿ öÿÐÿöÿ¼ÿ¼ÿ00D~¤¤0¼ÿD0ãÿ–ÿöÿÐÿ©ÿ öÿÐÿãÿ©ÿÐÿöÿãÿãÿöÿÐÿöÿD0W~00ãÿãÿãÿ0~jDöÿöÿ‚ÿoÿöÿ0¼ÿ‚ÿöÿãÿ¼ÿãÿ00DD ãÿ öÿöÿãÿ0 öÿãÿ©ÿ©ÿ ãÿ©ÿÐÿ¼ÿÐÿÐÿ–ÿ‚ÿ‚ÿ©ÿ©ÿ©ÿöÿ©ÿ\ÿ–ÿãÿDj0DD0~W ‚ÿ¼ÿ ©ÿÐÿöÿ¼ÿ–ÿ–ÿ–ÿãÿ©ÿoÿ¼ÿ‚ÿ–ÿ‚ÿ\ÿÐÿ ‚ÿ¼ÿ‘Dãÿ0 öÿöÿöÿ 0 ©ÿöÿ¼ÿãÿãÿ¼ÿöÿöÿÐÿãÿ¼ÿ¼ÿ©ÿ©ÿ 0 0DDj~DD0 öÿãÿWW0öÿ©ÿ–ÿ¼ÿ 0öÿãÿD0DöÿÐÿ¼ÿ©ÿWD00DWDW0öÿöÿ Ðÿ W0ãÿöÿD jÐÿ¼ÿÐÿD öÿ¼ÿ–ÿãÿ Ðÿöÿãÿãÿöÿöÿ00ãÿ–ÿ©ÿ WWöÿãÿ Ðÿ–ÿ¼ÿÐÿ ©ÿ©ÿÐÿ©ÿ¼ÿ¼ÿ–ÿöÿ¼ÿoÿ–ÿoÿ©ÿ Ðÿ öÿoÿoÿ–ÿ–ÿÐÿÐÿ¼ÿ¼ÿ–ÿ–ÿ–ÿoÿ–ÿ©ÿ\ÿ\ÿoÿ–ÿ©ÿ¼ÿöÿÐÿ©ÿ¼ÿ©ÿ©ÿãÿ¼ÿÐÿãÿÐÿãÿ©ÿ¼ÿÐÿ0jöÿöÿöÿWDWDãÿ¼ÿöÿ0ãÿöÿD~~~0Döÿöÿ00 ãÿÐÿ  Wãÿ 000D0 D~DW~WDWjj‘W00ãÿ©ÿ©ÿöÿãÿãÿ00öÿ¼ÿoÿ¼ÿãÿãÿ öÿöÿ ãÿ 0öÿ öÿöÿãÿ öÿoÿ©ÿãÿ¼ÿ¼ÿÐÿãÿÐÿ\ÿoÿöÿ öÿ©ÿ–ÿ¼ÿ–ÿ©ÿãÿÐÿÐÿãÿÐÿÐÿãÿ‚ÿ¼ÿöÿöÿöÿÐÿÐÿ¼ÿ©ÿ–ÿ¼ÿ¼ÿ‚ÿoÿãÿöÿ©ÿ¼ÿ  ãÿ ãÿÐÿöÿ 0W00¼ÿ¼ÿ ãÿÐÿãÿ©ÿ©ÿ¼ÿÐÿÐÿ¼ÿ©ÿöÿãÿ©ÿãÿ0D0 0~jDDDD0W‘Döÿöÿ0 0j0öÿöÿ0000D0 ãÿÐÿöÿ00 00Ðÿ¼ÿöÿÐÿ¼ÿ©ÿ–ÿÐÿ0 Ðÿ–ÿ–ÿÐÿ¼ÿÐÿ ¼ÿ¼ÿ¼ÿ¼ÿöÿöÿãÿÐÿ©ÿãÿöÿãÿöÿ öÿ©ÿÐÿöÿãÿãÿ¼ÿãÿ ãÿÐÿöÿÐÿÐÿÐÿoÿ–ÿÐÿ¼ÿöÿ ãÿÐÿãÿãÿãÿãÿãÿ Ðÿöÿ Ðÿ©ÿ¼ÿ¼ÿãÿãÿ¼ÿ¼ÿ¼ÿÐÿÐÿãÿöÿ©ÿ©ÿãÿÐÿãÿöÿãÿD0 WDDãÿÐÿöÿDWöÿ0Ðÿ©ÿãÿ öÿãÿÐÿöÿãÿ©ÿ©ÿÐÿ öÿ Wj0DW00D0 0¸‘0DWöÿÐÿãÿ öÿ ãÿãÿ  ãÿ¼ÿöÿöÿãÿ öÿãÿ öÿÐÿÐÿ¼ÿÐÿöÿ  ÐÿÐÿãÿ–ÿ\ÿ¼ÿÐÿ¼ÿ¼ÿoÿ©ÿÐÿ¼ÿãÿ öÿãÿãÿ D0ãÿöÿöÿöÿöÿãÿ–ÿ©ÿöÿãÿ¼ÿÐÿ©ÿ–ÿÐÿ ãÿãÿãÿÐÿöÿ ãÿ0D ãÿöÿãÿ¼ÿÐÿ ãÿÐÿãÿÐÿöÿãÿ¼ÿÐÿ¼ÿ©ÿöÿ ¼ÿ¼ÿãÿÐÿãÿöÿ¼ÿ–ÿ¼ÿãÿÐÿãÿöÿöÿD ¼ÿÐÿãÿ0 ãÿÐÿ D öÿ ãÿöÿöÿ¼ÿ©ÿÐÿãÿ ãÿÐÿãÿãÿ Ðÿãÿöÿöÿöÿ 0000  Ðÿ©ÿÐÿãÿãÿÐÿãÿöÿöÿöÿ öÿöÿ00öÿöÿ0 ãÿöÿÐÿÐÿöÿ öÿãÿ öÿ 0ãÿöÿöÿãÿãÿ Ðÿ¼ÿ0 0WW öÿÐÿãÿ ãÿDD 00 öÿöÿ¼ÿãÿ ãÿãÿãÿ¼ÿÐÿöÿöÿöÿ¼ÿ‚ÿ©ÿÐÿãÿ öÿ¼ÿ–ÿoÿoÿ¼ÿãÿ¼ÿÐÿöÿÐÿöÿ öÿãÿÐÿ¼ÿ¼ÿ©ÿÐÿ öÿÐÿãÿÐÿ©ÿ¼ÿãÿ öÿöÿöÿ¼ÿ©ÿ ãÿ¼ÿÐÿãÿöÿöÿãÿãÿÐÿÐÿãÿÐÿãÿ ãÿãÿöÿöÿ  öÿöÿ öÿ Ðÿãÿ ãÿãÿ 0 0WD öÿ öÿ öÿãÿÐÿÐÿãÿ0ãÿ0Wöÿ Ðÿ©ÿãÿöÿöÿ  ãÿöÿöÿ ãÿãÿDD ¼ÿ©ÿãÿ öÿ öÿöÿöÿ  öÿãÿöÿãÿöÿ öÿöÿ©ÿ¼ÿãÿ ãÿ¼ÿÐÿöÿ0 ¼ÿÐÿöÿöÿ D0ãÿ¼ÿãÿÐÿãÿ öÿöÿ ÐÿöÿDãÿãÿãÿöÿ Ðÿ©ÿãÿãÿ¼ÿ ãÿãÿöÿãÿöÿ öÿ0 Ðÿ–ÿ©ÿöÿöÿãÿöÿ ãÿöÿöÿ¼ÿÐÿ D0öÿöÿ00   ãÿöÿ0 Döÿ  öÿãÿ 00 ¼ÿ©ÿãÿãÿÐÿöÿ öÿöÿãÿãÿöÿöÿãÿãÿãÿ00 ¼ÿ¼ÿãÿöÿD ãÿÐÿ0Dãÿ©ÿ¼ÿÐÿ¼ÿ¼ÿ¼ÿãÿãÿãÿãÿ ãÿÐÿÐÿöÿöÿãÿöÿ öÿãÿãÿãÿãÿãÿöÿãÿãÿÐÿÐÿöÿöÿÐÿ©ÿ©ÿ¼ÿãÿ öÿãÿöÿ¼ÿ©ÿöÿ öÿãÿöÿ 0 ãÿÐÿãÿãÿÐÿãÿ öÿ©ÿ©ÿöÿ0D   öÿãÿöÿãÿãÿöÿãÿöÿ 000W0WW0DÐÿÐÿöÿöÿ 00 öÿ ãÿ¼ÿÐÿ 0 ÐÿÐÿöÿöÿãÿ 0öÿãÿãÿ öÿöÿöÿ0 ãÿÐÿÐÿ¼ÿãÿöÿöÿãÿ öÿ¼ÿöÿ0 öÿ öÿ  ÐÿÐÿ0öÿÐÿöÿöÿãÿ öÿãÿÐÿÐÿãÿöÿãÿöÿ öÿãÿ öÿöÿ öÿÐÿãÿãÿÐÿ¼ÿÐÿãÿ¼ÿ©ÿ©ÿ–ÿÐÿãÿãÿ¼ÿöÿöÿãÿöÿãÿÐÿÐÿöÿöÿöÿãÿãÿÐÿãÿöÿ©ÿ¼ÿÐÿÐÿãÿöÿ ãÿ¼ÿÐÿ 0öÿöÿ öÿöÿ 000DW0 öÿöÿ 0Döÿãÿ öÿöÿ0 öÿöÿ 000öÿ0öÿÐÿãÿ W0 0DöÿöÿÐÿÐÿöÿöÿöÿ öÿ¼ÿ¼ÿöÿ 0 öÿ öÿãÿãÿöÿ D0 ÐÿÐÿ0öÿöÿ ãÿÐÿãÿöÿ¼ÿÐÿöÿöÿÐÿöÿöÿÐÿ¼ÿÐÿÐÿÐÿöÿ ãÿÐÿ©ÿ©ÿÐÿãÿ  öÿöÿöÿöÿãÿöÿãÿ¼ÿ¼ÿÐÿöÿöÿÐÿ¼ÿÐÿ¼ÿ©ÿ–ÿ©ÿ¼ÿ¼ÿöÿöÿÐÿÐÿãÿöÿ öÿ öÿãÿãÿöÿ0öÿöÿöÿöÿ ãÿãÿöÿãÿöÿ  öÿÐÿ WD0 0D0 ãÿãÿãÿ0 ÐÿÐÿãÿ 0 öÿ 0Döÿ 00D00D0öÿÐÿÐÿ  öÿöÿöÿöÿ öÿãÿÐÿãÿöÿöÿãÿ 0öÿöÿ öÿ  öÿãÿ öÿöÿÐÿÐÿãÿãÿ Ðÿ©ÿÐÿãÿÐÿãÿãÿãÿãÿãÿÐÿÐÿãÿÐÿ¼ÿ©ÿÐÿãÿöÿãÿãÿ ãÿãÿöÿãÿÐÿöÿ ãÿãÿãÿÐÿãÿöÿãÿöÿãÿÐÿ¼ÿ¼ÿÐÿãÿöÿöÿöÿöÿãÿãÿöÿöÿ öÿãÿöÿãÿãÿöÿ 0Döÿ öÿ  ãÿãÿöÿöÿöÿãÿÐÿ öÿ0D00 00 öÿöÿöÿ0 ãÿ  0öÿöÿöÿÐÿÐÿ 00 Ðÿöÿ öÿ öÿÐÿÐÿöÿöÿ00 öÿãÿöÿöÿöÿöÿöÿöÿöÿ öÿãÿãÿ öÿãÿöÿ  öÿ 0öÿöÿ ãÿ¼ÿöÿãÿÐÿãÿÐÿ©ÿ¼ÿöÿ öÿÐÿ¼ÿÐÿÐÿ¼ÿ¼ÿãÿãÿÐÿÐÿÐÿ¼ÿãÿöÿÐÿÐÿöÿãÿöÿ ãÿãÿöÿöÿÐÿ¼ÿãÿöÿãÿÐÿãÿãÿãÿ öÿöÿãÿãÿãÿãÿ öÿöÿ öÿ öÿ  00öÿöÿöÿ ãÿöÿ Ðÿöÿ0WDöÿ DDD öÿ0 öÿãÿöÿãÿãÿ ãÿöÿ öÿ öÿãÿöÿöÿöÿD0   000  öÿöÿöÿãÿöÿöÿãÿÐÿÐÿÐÿãÿÐÿÐÿÐÿÐÿöÿ öÿãÿÐÿ¼ÿÐÿöÿöÿ öÿãÿÐÿ©ÿ©ÿ¼ÿ¼ÿ©ÿ¼ÿãÿöÿöÿÐÿ¼ÿ©ÿ¼ÿãÿ ãÿÐÿãÿ¼ÿÐÿöÿãÿÐÿ ãÿãÿãÿãÿÐÿöÿöÿ  Ðÿ©ÿÐÿ  öÿöÿöÿ öÿ0WD öÿ 0000öÿãÿöÿ 0 ãÿöÿ öÿ öÿãÿöÿ öÿöÿ  0000DD000000 DD öÿ0 öÿöÿãÿ ãÿöÿ öÿãÿ¼ÿÐÿãÿãÿ öÿöÿöÿöÿöÿãÿÐÿöÿöÿãÿãÿãÿãÿÐÿ©ÿ¼ÿöÿöÿãÿÐÿ¼ÿãÿ öÿöÿãÿ¼ÿãÿ öÿöÿ ãÿãÿöÿöÿãÿöÿ0öÿãÿöÿöÿöÿöÿÐÿãÿöÿãÿãÿöÿ  D000 ãÿãÿ  ÐÿöÿöÿãÿöÿöÿãÿÐÿöÿÐÿãÿ ãÿãÿ öÿãÿãÿöÿ 0öÿ öÿöÿ ãÿãÿöÿ öÿ öÿãÿ öÿ   öÿ 00öÿÐÿãÿãÿ  ãÿãÿD öÿöÿöÿ öÿöÿãÿ¼ÿÐÿöÿöÿÐÿöÿ 000öÿ öÿ öÿ öÿöÿãÿöÿãÿöÿ öÿãÿöÿãÿÐÿãÿöÿ öÿ  00D00D0 0Döÿ öÿöÿöÿãÿöÿ öÿöÿ ãÿöÿÐÿ¼ÿÐÿÐÿÐÿöÿöÿöÿãÿ¼ÿÐÿöÿöÿöÿ  ãÿãÿöÿãÿ¼ÿÐÿ öÿãÿãÿD0öÿÐÿöÿ ãÿãÿ 0 öÿãÿ öÿöÿöÿ öÿãÿ öÿ ãÿÐÿöÿ  öÿ öÿ öÿöÿãÿãÿöÿãÿãÿãÿöÿ öÿöÿöÿãÿ öÿ  öÿ  öÿöÿöÿ öÿöÿ0 ãÿÐÿÐÿãÿ öÿÐÿãÿ  öÿ öÿöÿ00 öÿ öÿÐÿ öÿ öÿ öÿãÿöÿ  ãÿãÿÐÿÐÿãÿöÿöÿãÿöÿöÿ0 ãÿãÿöÿ  ãÿ©ÿÐÿ öÿãÿöÿ öÿ 00 00   öÿ  öÿ öÿÐÿÐÿÐÿÐÿÐÿÐÿãÿãÿãÿöÿöÿãÿãÿãÿöÿ öÿãÿãÿ öÿöÿ 00 0 öÿ   ãÿöÿ öÿÐÿãÿ öÿöÿãÿöÿöÿãÿöÿ ãÿöÿöÿöÿöÿöÿöÿöÿãÿãÿöÿ 0 öÿ  öÿöÿ öÿãÿÐÿ¼ÿÐÿ¼ÿ¼ÿöÿ öÿãÿöÿ 0D Ðÿ öÿ öÿãÿöÿ öÿãÿãÿöÿöÿöÿãÿöÿöÿ  öÿ 000öÿöÿöÿ ãÿÐÿöÿ öÿÐÿÐÿÐÿÐÿ 000 öÿ 00 öÿãÿãÿãÿöÿ öÿöÿ 0 öÿãÿãÿöÿöÿ   ãÿÐÿ öÿ¼ÿÐÿöÿöÿÐÿÐÿ öÿöÿãÿÐÿÐÿÐÿãÿöÿãÿÐÿãÿöÿöÿãÿãÿ öÿöÿöÿ öÿ  ãÿöÿöÿ öÿ  öÿ öÿöÿ öÿ 0  öÿ öÿÐÿ¼ÿÐÿãÿöÿãÿãÿãÿöÿ ãÿãÿöÿ öÿãÿãÿãÿ öÿãÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿ öÿ  0  öÿãÿãÿãÿÐÿãÿöÿ öÿãÿãÿ öÿöÿ öÿöÿ  ãÿÐÿãÿöÿöÿ öÿöÿ  öÿÐÿÐÿöÿöÿöÿãÿöÿöÿöÿãÿãÿöÿ  öÿ öÿ  öÿ öÿöÿ öÿ ãÿöÿ öÿ öÿöÿöÿöÿöÿ  ãÿãÿ  öÿ  öÿãÿ öÿÐÿãÿ öÿöÿöÿ ãÿÐÿÐÿãÿöÿ  öÿöÿöÿãÿöÿöÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿöÿ öÿ öÿãÿ ãÿ¼ÿãÿöÿöÿ ãÿÐÿãÿöÿãÿÐÿöÿ öÿöÿ öÿöÿöÿãÿ öÿãÿãÿöÿ00öÿãÿöÿ  ãÿöÿ  öÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿ    000  ãÿãÿ 0öÿãÿãÿ ãÿöÿ ãÿÐÿãÿöÿÐÿÐÿãÿÐÿÐÿöÿ öÿãÿöÿöÿãÿãÿ 0 öÿöÿöÿöÿ öÿãÿãÿãÿöÿöÿ öÿãÿãÿãÿãÿöÿöÿöÿöÿöÿöÿãÿãÿöÿ öÿãÿ 0 ãÿöÿ öÿöÿöÿöÿãÿãÿöÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿ  öÿöÿ 0 ãÿöÿ öÿ  ãÿãÿ öÿöÿöÿ öÿöÿ öÿöÿ öÿöÿ0Döÿöÿ öÿ0öÿãÿöÿ öÿöÿ öÿöÿ öÿ  öÿãÿöÿ öÿöÿöÿöÿ öÿãÿãÿöÿ öÿöÿöÿãÿÐÿãÿ öÿöÿãÿãÿãÿãÿ öÿãÿãÿöÿ öÿ öÿöÿöÿöÿöÿãÿöÿöÿöÿ ãÿöÿ ãÿöÿöÿ  öÿöÿ öÿöÿ öÿ  öÿãÿöÿ  öÿöÿöÿöÿöÿ öÿãÿöÿ öÿöÿöÿãÿãÿ öÿ öÿ öÿöÿöÿöÿöÿöÿãÿöÿãÿöÿöÿöÿ  öÿ  0ãÿöÿ öÿöÿöÿöÿöÿ öÿöÿ öÿÐÿãÿÐÿ¼ÿÐÿãÿãÿ öÿãÿöÿöÿ öÿ  öÿöÿöÿöÿ öÿãÿãÿãÿãÿöÿöÿöÿöÿöÿöÿöÿöÿãÿãÿ öÿãÿÐÿöÿ öÿ  öÿ  öÿöÿöÿöÿöÿ öÿ öÿ öÿãÿãÿöÿöÿöÿöÿ öÿÐÿãÿöÿöÿöÿãÿãÿöÿ öÿ  öÿ   öÿ  öÿöÿ  ãÿãÿöÿãÿãÿöÿöÿ öÿöÿ  ãÿãÿ öÿöÿãÿöÿöÿöÿãÿ öÿöÿöÿãÿãÿãÿöÿãÿÐÿãÿ öÿöÿãÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿöÿ öÿÐÿãÿöÿöÿöÿãÿãÿöÿ öÿöÿöÿöÿ   öÿãÿöÿ öÿ öÿ öÿöÿöÿöÿãÿöÿ  öÿöÿöÿ   öÿöÿöÿ öÿöÿöÿãÿãÿ öÿãÿÐÿãÿöÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿ öÿ  öÿãÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿãÿöÿöÿ  öÿ  öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿãÿöÿ öÿöÿöÿöÿ öÿöÿ öÿöÿãÿöÿãÿãÿãÿöÿöÿãÿÐÿãÿöÿãÿãÿöÿãÿãÿöÿöÿöÿ öÿ öÿ öÿ ãÿãÿöÿ öÿöÿöÿãÿöÿöÿöÿöÿãÿãÿãÿ öÿöÿöÿ öÿãÿöÿ öÿ  öÿöÿöÿöÿ öÿöÿ öÿöÿ öÿ     ãÿãÿöÿöÿöÿãÿãÿöÿöÿãÿãÿãÿöÿöÿãÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿãÿãÿöÿöÿöÿöÿãÿãÿãÿöÿöÿöÿöÿöÿöÿöÿãÿöÿ öÿöÿöÿ öÿ öÿöÿöÿöÿ öÿöÿãÿãÿãÿöÿöÿöÿöÿöÿãÿ öÿöÿ öÿöÿöÿ öÿ öÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿãÿöÿöÿ öÿöÿ öÿöÿ öÿöÿ  öÿöÿ     öÿöÿöÿ  öÿöÿ öÿöÿ öÿöÿ öÿãÿöÿöÿöÿãÿöÿöÿöÿöÿãÿ öÿöÿöÿöÿ öÿ öÿöÿ öÿöÿ öÿöÿöÿãÿãÿöÿöÿãÿãÿöÿöÿöÿöÿãÿöÿãÿöÿöÿãÿöÿöÿöÿãÿãÿöÿ öÿöÿöÿöÿöÿãÿãÿöÿ öÿöÿöÿöÿãÿöÿ öÿöÿöÿöÿöÿöÿöÿãÿöÿãÿöÿ öÿ öÿöÿöÿöÿ öÿãÿöÿöÿöÿöÿöÿöÿ öÿ öÿãÿöÿ öÿöÿöÿ   öÿöÿöÿ öÿöÿ öÿöÿöÿ  öÿöÿ öÿãÿöÿöÿ öÿöÿöÿãÿãÿãÿãÿöÿöÿöÿ öÿ öÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿãÿãÿãÿöÿöÿöÿöÿöÿãÿãÿãÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿ öÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿãÿãÿ öÿöÿãÿöÿ öÿöÿöÿ öÿöÿ öÿ öÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿöÿöÿãÿöÿöÿ  öÿöÿ öÿöÿ öÿ öÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿãÿöÿöÿöÿãÿãÿãÿöÿöÿöÿ öÿ öÿöÿ öÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿöÿöÿãÿöÿãÿöÿãÿãÿãÿöÿ öÿöÿöÿöÿ öÿãÿöÿöÿ öÿöÿãÿöÿ öÿöÿöÿãÿãÿöÿöÿ öÿ öÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿ öÿ öÿöÿ öÿ öÿ öÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿ öÿöÿãÿöÿöÿöÿ öÿöÿöÿöÿ  öÿöÿöÿ öÿöÿöÿ öÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿãÿãÿ öÿöÿöÿöÿöÿöÿöÿöÿãÿãÿöÿöÿöÿöÿ öÿöÿãÿöÿ öÿöÿöÿöÿ öÿöÿãÿãÿãÿãÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿöÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿ öÿöÿ öÿöÿ  öÿ  öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿ öÿöÿöÿöÿãÿãÿöÿöÿöÿöÿöÿãÿöÿ ãÿöÿöÿ öÿöÿöÿ öÿ  öÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿãÿãÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿöÿ öÿöÿ öÿ öÿöÿöÿ öÿ öÿöÿöÿ öÿ öÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿ öÿöÿöÿ öÿöÿöÿöÿöÿãÿãÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿãÿãÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿ öÿöÿ öÿöÿ öÿöÿ öÿ öÿ öÿ öÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿöÿ öÿ öÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿ öÿ öÿöÿöÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿ öÿ öÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿ öÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿ öÿöÿ öÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿ öÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿ öÿöÿöÿöÿ öÿ öÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿ öÿöÿ öÿöÿ öÿ öÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿ öÿ öÿ öÿöÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿöÿöÿ öÿöÿ öÿöÿ öÿ öÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿöÿöÿ öÿ öÿöÿöÿöÿöÿ öÿöÿ öÿöÿ öÿöÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿ öÿ öÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿöÿöÿ öÿöÿ öÿ öÿöÿöÿ öÿ öÿöÿöÿöÿ öÿöÿöÿ öÿ öÿöÿöÿöÿöÿöÿ öÿ öÿöÿ öÿöÿöÿöÿ öÿ öÿöÿ öÿöÿöÿ öÿ öÿ öÿ öÿöÿöÿ öÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿöÿöÿ öÿöÿöÿöÿ öÿ öÿ öÿ öÿ sonic-visualiser-3.0.3/samples/kick.wav0000644000000000000000000017337413111512442016257 0ustar 00000000000000RIFFôöWAVEfmt D¬±dataÐöÿÿ––##CC¼ ¼ V V îîÍÍœœq q E$E$((¿+¿+v/v/33§6§66:6:¥=¥= A A[D[D¡G¡GÇJÇJåMåMäPäP×S×S®V®VuYuY\\·^·^0a0a‰c‰cÓeÓeÿgÿg j jllãmãmžožoDqDqÊrÊr3t3tuu¯v¯v¿w¿w°x°x…y…y*>ÿ@ÿ@ÊCÊCˆFˆF=I=IãKãKxNxNñPñPbSbSÄUÄUXXYZYZ€\€\š^š^¥`¥`žbžb|d|dHfHfhh¨i¨i9k9k·l·lnnoooo®p®pÔqÔqçrçràsàsÆtÆt—u—uPvPvõvõv€w€w÷w÷wTxTxžxžxÑxÑxîxîxôxôxâxâx»x»xxx)x)x¿w¿w?w?wªvªvvv>u>ujtjt{s{szrzrgqgq:p:pünün«m«mIlIlÍjÍj@i@i§g§gùeùe0d0dYbYbv`v`€^€^~\~\]Z]Z4X4XüUüU¹S¹SgQgQOOšLšL#J#JŒGŒGñDñDKBKBŸ?Ÿ?æ<æ<$:$:[7[7„4„4¦1¦1À.À.Ó+Ó+Ý(Ý(ß%ß%Ü"Ü"ÒÒÕÕÌÌ»»¡¡„„d d @ @ èèÇýÇý¢ú¢ú€÷€÷ZôZôIñIñ3î3îëëèèååÿáÿáúÞúÞ Ü ÜÙÙ#Ö#ÖFÓFÓhÐhÐÍÍÈÊÈÊÈÈCÅCŨ¨ À Àp½p½êºêºf¸f¸÷µ÷µŠ³Š³4±4±â®â®§¬§¬oªoªM¨M¨5¦5¦1¤1¤5¢5¢M M ržrž«œ«œîšîšH™H™·—·—/–/–½”½”U“U“’’ÈȘ˜~Ž~ŽyyŒŒœ‹œ‹ÎŠÎŠŠŠf‰f‰ËˆËˆGˆGˆÖ‡Ö‡v‡v‡+‡+‡ô†ô†Ì†Ì†»†»†¼†¼†Ï†Ï†ô†ô†-‡-‡x‡x‡Õ‡Õ‡IˆIˆÏˆÏˆf‰f‰ Š ŠÈŠÈŠ”‹”‹qŒqŒ```Ž`Žrr””ɑɑ “ “c”c”ȕȕ?—?—ØØXšXšþ›þ›³³uŸuŸE¡E¡&£&£¥¥§§©© « «;­;­f¯f¯±±â³â³3¶3¶¸¸ÞºÞºJ½J½Ã¿Ã¿CÂCÂÁÄÁÄMÇMÇæÉæÉˆÌˆÌ%Ï%ÏÎÑÎфԄÔ2×2×íÙíٳܳÜoßoß:â:â å åÔçÔç«ê«ê†í†íXðXð3ó3óööíøíøÌûÌû þ þ{{NN((÷ ÷ Ï Ï ™™ll11þþ¼¼5 5 ð"ð"›%›%:(:(ß*ß*v-v-00š2š255˜7˜7::lÓ>(A(ApCpC¹E¹EñGñGJJDLDL]N]NfPfPaRaRZTZTCVCVXXÔYÔYŽ[Ž[D]D]í^í^ƒ`ƒ` b b†c†còdòdVfVf«g«gîhîh#j#jFkFkZlZlbmbmVnVn>o>oppãpãpœqœqGrGrãrãrlslsäsäsNtNt§t§tñtñt)u)uRuRululuvuvuququXuXu2u2uýtýt¶t¶tatatûsûs„s„sÿrÿrnrnrÌqÌqqqWpWpˆoˆo§n§n½m½mÁlÁl¸k¸kjjtitiChChgg²e²eSdSdîbîbyayaó_ó_j^j^Î\Î\&[&[yYyY»W»WîUîU T T@R@RQPQPcNcNeLeLXJXJLHLH1F1FDDêAêA¿?¿?ƒ=ƒ=I;I;ÿ8ÿ8¶6¶6^4^422 / />->-Ì*Ì*_(_(ã%ã%k#k#å å eeÙÙQQÏÏ<<¯¯€ € ò ò WWÃÃ33˜ÿ˜ÿýýuúuúÙ÷Ù÷GõGõºòºò#ð#ð–í–íëë‘è‘èææ„ã„ã á ášÞšÞÜÜ­Ù­ÙE×E×äÔäԌҌÒ)Ð)ÐÕÍÕ͈ˈËFÉFÉ Ç ÇÙÄÙĭ­Â}À}ÀX¾X¾?¼?¼1º1º,¸,¸0¶0¶=´=´S²S²u°u°ž®ž®Ñ¬Ñ¬««U©U©¨§¨§¦¦j¤j¤Ú¢Ú¢_¡_¡îŸîŸ‚ž‚ž##̛̛‚š‚šF™F™˜˜ì–ì–ӕӕĔĔÓÓԒԒð‘ð‘‘‘JJˆˆÖŽÖŽ0Ž0Ž˜˜‘Œ‘Œ Œ Œ¼‹¼‹h‹h‹‹‹äŠäŠ¶Š¶Š”Š”ŠŠŠ|Š|ЂЂЖЖййŠêŠêŠ#‹#‹l‹l‹Â‹Â‹'Œ'Œ–Œ–Œšš1Ž1ŽÔŽÔŽ>>‘‘ّّ»’»’£“£“›”›”š•š•ª–ª–Ç—Ç—ë˜ë˜ššU›U›žœžœëëHŸHŸ« « ¢¢‘£‘£¥¥¢¦¢¦;¨;¨×©×©z«z«+­+­ß®ß®¦°¦°o²o²E´E´¶¶ø·ø·å¹å¹Ð»Ð»Î½Î½É¿É¿ÇÁÇÁÖÃÖÃäÅäÅóÇóÇÊÊ3Ì3ÌSÎS΂ЂвҲÒßÔßÔ × ×NÙNÙ‹Û‹ÛÈÝÈÝààTâTâ ä äçæçæ1é1éˆëˆëÜíÜí,ð,ð|ò|òÊôÊô)÷)÷‚ù‚ùØûØû*þ*þyyÉÉssÈ È   ff°°öö;;{{¹¹óó++_ _ ""¼$¼$ä&ä& ) ))+)+E-E-\/\/n1n1{3{355‚7‚799t;t;b=b=J?J?,A,ACCÛDÛD¨F¨FmHmH J JÍKÍKwMwMOO©P©P9R9RÂSÂS=U=U±V±VXX†Y†YåZåZ4\4\|]|]½^½^ö_ö_&a&aCbCb[c[cmdmdueuekfkfYgYgAhAhiiêiêi±j±jokokllÃlÃlbmbmðmðmvnvnònònaoaoÅoÅoppnpnp²p²pêpêpqq>˜?˜? A AwBwBáCáCIEIE¯F¯FHH]I]I³J³JùKùK?M?MzNzN´O´OëPëPRR?S?SfTfT€U€U˜V˜V¦W¦W²X²X±Y±Y¯Z¯Zª[ª[™\™\ƒ]ƒ]f^f^B_B_``é`é`¶a¶awbwb5c5cècèc—d—dL>í<í<ˆ;ˆ;!:!:¸8¸8I7I7Ù5Ù5d4d4î2î2t1t1÷/÷/x.x.ô,ô,n+n+æ)æ)](](Ð&Ð&?%?%°#°#""… … ïïUU¼¼€€àà@@žžûûVV¿¿! ! € € ß ß 99““ëëCCššaþaþ¿ü¿üûûuùuùÏ÷Ï÷)ö)ö‘ô‘ôóòóòVñVñµïµïîî‚ì‚ììêìêRéRé¸ç¸ç!æ!æ†ä†äüâüânánáÞßÞßNÞNÞËÜËÜGÛGÛÁÙÁÙ:Ø:ØÁÖÁÖEÕEÕÈÓÈÓKÒKÒÜÐÜÐiÏiÏøÍøÍ“Ì“Ì+Ë+ËÂÉÂÉ\È\ÈÇǣţÅHÄHÄúÂú§Á§ÁXÀXÀ¿¿Î½Î½ˆ¼ˆ¼O»O»ººÚ¸Ú¸­·­·¶¶[µ[µ8´8´³³ü±ü±ã°ã°Ì¯Ì¯Á®Á®¶­¶­µ¬µ¬µ«µ«¾ª¾ªÆ©Æ©Ñ¨Ñ¨é§é§þ¦þ¦¦¦A¥A¥k¤k¤—£—£Ë¢Ë¢¢¢A¡A¡  ËŸËŸŸŸjžjžÁÁ€œ€œé›é›U›U›ÇšÇš@š@š¿™¿™@™@™Ê˜Ê˜V˜V˜ë—ë—ƒ—ƒ—$—$—Ê–Ê–v–v–*–*–ߕߕ›•›•[•[•%•%•ð”ð”””›”›”y”y”Z”Z”E”E”5”5”)”)”$”$”#”#”)”)”3”3”D”D”[”[”w”w”˜”˜”Á”Á”í”픕•V•V•’•’•Ö•Ö•––l–l–À–À–——w—w—ؗؗA˜A˜²˜²˜$™$™›™›™ššœšœš%›%›±›±›AœAœØœØœvvžž¹ž¹žeŸeŸ  È È €¡€¡;¢;¢ÿ¢ÿ¢Å£Å£¤¤]¥]¥0¦0¦§§ä§ä§Æ¨Æ¨¬©¬©“ª“ª~«~«t¬t¬m­m­e®e®`¯`¯`°`°c±c±i²i²q³q³…´…´›µ›µ´¶´¶Í·Í·ë¸ë¸ º º+»+»N¼N¼x½x½¢¾¢¾Î¿Î¿ÁÁCÂC€ÀýĽÄúÅúÅ;Ç;Ç}È}ÈÂÉÂÉËËSÌSÌŸÍŸÍêÎêÎ=Ð=ÐŽÑŽÑáÒáÒ:Ô:ÔÕÕëÖëÖGØGإ٥ÙÛÛeÜeÜÉÝÉÝ.ß.ß“à“àüáüácãcãÎäÎä8æ8æ¥ç¥çééêêðëðë`í`íÐîÐî6ð6ðŸñŸñ ó óyôyôéõéõ\÷\÷ÐøÐøBúBú¶û¶û)ý)ýŸþŸþqqßßNN¾¾//    v v Þ Þ GG°°||ÝÝAA¦¦  qqËË&&ßß5 5 !!Í"Í"$$r%r%¹&¹&((N)N)›*›*Ü+Ü+--`.`.£/£/Ý0Ý022N3N3ˆ4ˆ4·5·5å6å688;9;9`:`:†;†;¢<¢<À=À=ß>ß>ó?ó?AABB-C-C7D7D?E?EFFFFEGEGBHBH8I8I/J/J$K$KLLýLýLçMçMÉNÉN¬O¬O„P„P\Q\Q6R6RSSÒSÒS¡T¡TeUeU(V(VâVâVœWœWOXOXYY«Y«YTZTZüZüZ›[›[;\;\Ð\Ð\e]e]ô]ô]^^__ˆ_ˆ_````õ`õ`hahaÒaÒa=b=b¡b¡bcc\c\c´c´cddTdTdddådåd%e%eaeaešešeÍeÍeüeüe'f'fLfLfmfmfŠfŠf¤f¤f·f·fÅfÅfÑfÑfØfØfÚfÚf×f×fÒfÒfÆfÆf·f·f¤f¤fŠfŠfnfnfMfMf(f(fÿeÿeÏeÏežežefefe,e,eídíd¨d¨d`d`dddÄcÄcqcqccc¼b¼bYbYböaöaaa a a°`°`:`:`¿_¿_C_C_¿^¿^<^<^¶]¶]+]+]˜\˜\\\n[n[ÎZÎZ1Z1ZYYêXêX?X?XŽWŽWÞVÞV.V.VrUrU·T·T÷S÷S9S9SoRoR¥Q¥QÙPÙP P P7O7O`N`N†M†M®L®L×K×KýJýJJJ1I1IIHIH^G^GrFrF|E|E„D„DŒCŒC“B“BšAšA•@•@‘?‘?Œ>Œ>†=†=€<€>FFMMQQXX\\iiss{{€€‚‚ƒƒ‚ ‚ €!€!|"|"w#w#r$r$h%h%`&`&V'V'I(I(>)>).*.* + +,,þ,þ,é-é-Ô.Ô.¾/¾/¤0¤0‹1‹1r2r2T3T3646455õ5õ5Ò6Ò6¢7¢7w8w8H9H9::î:î:¿;¿;Œ<Œ<[=[=&>&>ó>ó>»?»?@@DADABBÈBÈB‡C‡C>D>DóDóD§E§EZFZF G G¾G¾GmHmHIIÅIÅIhJhJ K K¬K¬KLLLLêLêL‡M‡M#N#N¼N¼NLOLOÜOÜOlPlPùPùP„Q„QRR—R—RSS›S›STT“T“TUU†U†UþUþUlVlVÛVÛVHWHW´W´WXXXXáXáXAYAY Y YüYüYTZTZ«Z«ZýZýZL[L[œ[œ[é[é[1\1\u\u\º\º\ú\ú\:]:]t]t]¬]¬]â]â]^^C^C^q^q^œ^œ^Å^Å^ë^ë^ _ _0_0_M_M_i_i_‚_‚_˜_˜_­_­_¼_¼_Ê_Ê_Õ_Õ_à_à_ç_ç_ê_ê_ë_ë_ë_ë_å_å_Þ_Þ_Ó_Ó_Ç_Ç_º_º_¨_¨_•_•_~_~_e_e_I_I_,_,_ _ _è^è^Á^Á^˜^˜^l^l^?^?^^^Ú]Ú]§]§]o]o]4]4]÷\÷\º\º\u\u\2\2\ì[ì[¢[¢[U[U[[[»Z»ZhZhZZZ¼Y¼YaYaYYY¦X¦XDXDXãWãW~W~WWW¬V¬V?V?VÏUÏU`U`UëTëTyTyTTT…S…S S SŒRŒRRRŒQŒQQQ€P€P÷O÷OqOqOãNãNWNWNÇMÇM2M2M L LLLrKrK×J×J?J?J¡I¡IIIcHcH½G½GGGpFpFÈEÈEEEtDtDÅCÅCCCbBbB¬A¬Aú@ú@B@B@??Ó>Ó>>>_=_=¢<¢<ã;ã;$;$;b:b:¡9¡9Ü8Ü888N7N7ˆ6ˆ6½5½5ô4ô4%4%4Z3Z3‰2‰2»1»1ç0ç000A/A/n.n.Ÿ-Ÿ-Ç,Ç,õ+õ+++B*B*f)f)((¶'¶'Ù&Ù&þ%þ%%%?$?$\#\#|"|"—!—!µ µ ÔÔðð&&AAVVoo££½½ÐÐææ..??SSll„„žž¹ ¹ Î Î å å ô ô     //CCZZkk~~‹‹²²ÂÂ×ÿ×ÿîþîþýýýýýý'ü'ü9û9ûMúMúeùeùvøvø‹÷‹÷£ö£ö¶õ¶õÊôÊôäóäóùòùòòò)ñ)ñFðFð]ï]ïvîvî“í“í¨ì¨ìÃëÃëáêáêúéúééé3è3èNçNçkækæåå¨ä¨äÅãÅãêâêâââ1á1áRàRà{ß{ߤޤÞÈÝÈÝîÜîÜÜÜGÛGÛnÚnÚšÙšÙÈØÈØù×ù×$×$×TÖTÖ„Õ„ÕºÔºÔéÓéÓÓÓSÒSÒ‹Ñ‹ÑÁÐÁÐ÷Ï÷Ï2Ï2ÏnÎnΨͨÍäÌäÌ#Ì#ÌeËe˫ʫÊëÉëÉ.É.ÉtÈtÈ¿Ç¿Ç Ç ÇYÆYơšÅíÄíÄ;Ä;ČÌÃáÂáÂ0Â0‚Á‚ÁÙÀÙÀ2À2ÀŒ¿Œ¿å¾å¾?¾?¾œ½œ½ü¼ü¼_¼_¼Ã»Ã»&»&»‰º‰ºñ¹ñ¹Y¹Y¹Æ¸Æ¸5¸5¸ · ···€¶€¶óµóµjµjµâ´â´]´]´Ù³Ù³S³S³Î²Î²N²N²Ï±Ï±T±T±Û°Û°d°d°ð¯ð¯w¯w¯¯¯Ž®Ž® ® ®³­³­G­G­ß¬ß¬y¬y¬¬¬««««F«F«çªçª‡ª‡ª.ª.ªÓ©Ó©|©|©'©'©Ò¨Ò¨¨¨2¨2¨å§å§”§”§H§H§§§¹¦¹¦t¦t¦2¦2¦ò¥ò¥´¥´¥w¥w¥=¥=¥¥¥Î¤Î¤›¤›¤i¤i¤:¤:¤ ¤ ¤ß£ß£´£´£‹£‹£e£e£A£A£££££à¢à¢Ä¢Ä¢¬¢¬¢”¢”¢}¢}¢j¢j¢W¢W¢G¢G¢:¢:¢/¢/¢%¢%¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢(¢(¢2¢2¢>¢>¢K¢K¢\¢\¢n¢n¢ƒ¢ƒ¢™¢™¢³¢³¢Ë¢Ë¢é¢é¢££(£(£I£I£o£o£’£’£»£»£ã£ã£ ¤ ¤;¤;¤k¤k¤œ¤œ¤Î¤Î¤¥¥=¥=¥w¥w¥²¥²¥ð¥ð¥.¦.¦p¦p¦´¦´¦õ¦õ¦9§9§€§€§É§É§¨¨b¨b¨±¨±¨©©U©U©­©­©ªªZªZª¶ª¶ª««n«n«É«É«*¬*¬‹¬‹¬ñ¬ñ¬V­V­¾­¾­(®(®®®û®û®g¯g¯Õ¯Õ¯F°F°»°»°/±/±§±§±²²’²’² ³ ³†³†³´´ƒ´ƒ´µµŠµŠµ ¶ ¶¶¶··˜·˜·#¸#¸¯¸¯¸<¹<¹Ì¹Ì¹XºXºçºçºv»v» ¼ ¼¼¼0½0½Â½Â½Y¾Y¾ó¾ó¾Œ¿Œ¿#À#À¿À¿À[Á[ÁûÁûÁ›Â›Â?Ã?ÃÞÃÞÃÄÄ!Å!ÅÉÅÉÅsÆsÆÇǽǽÇfÈfÈÉɿɿÉhÊhÊËËÂËÂËsÌsÌ&Í&ÍÝÍÝ͋΋Î>Ï>ÏòÏòϨШÐ[Ñ[ÑÒÒÅÒÅÒ€Ó€Ó5Ô5ÔëÔëÔ¥Õ¥ÕbÖbÖ××Õ×ÕדؓØRÙRÙ Ú ÚÊÚÊÚ‰Û‰ÛLÜLÜ Ý ÝÉÝÉ݌ތÞRßRßààÒàÒà—á—á[â[âããÚãÚãŸäŸäfåfå*æ*æîæîæµçµçèèEéEé ê êÖêÖêëëcìcì-í-íóíóíºîºî…ï…ïJðJðññàñàñ¬ò¬òwówó@ô@ôõõÔõÔõŸöŸöl÷l÷4ø4øýøýøÊùÊù‘ú‘ú\û\û)ü)üñüñü¹ý¹ý‡þ‡þWÿWÿéé··IIÞÞ¦¦rr77ÿÿÄĉ ‰ T T   Þ Þ § § i i //ððµµ{{==ÿÿÆÆ……IIÈÈŠŠHHÊʆ†EEÿÿ»»yy22íí««bb  Ñ Ñ ‡!‡!:":"í"í"¥#¥#W$W$ % %º%º%j&j&''Æ'Æ'q(q())Ì)Ì)y*y*%+%+Ë+Ë+v,v,--Á-Á-k.k.//·/·/X0X0û0û0š1š1:2:2×2×2t3t344°4°4L5L5å5å56677«7«7C8C8Ú8Ú8m9m9ÿ9ÿ9::;;¬;¬;9<9<Å<Å_>å>å>j?j?ð?ð?p@p@ó@ó@rArAòAòAoBoBìBìBfCfCáCáCXDXDÐDÐDDEDE»E»E.F.F¡F¡FGGGGíGíGZHZHÄHÄH0I0I–I–IÿIÿIeJeJÉJÉJ,K,KKKìKìKHLHL¥L¥LÿLÿLYMYM±M±MNNYNYN«N«NüNüNJOJO™O™OèOèO6P6PPPËPËPQQWQWQQQàQàQ#R#RcRcR£R£RàRàRSSUSUSŽSŽSÆSÆSýSýS3T3TdTdT—T—TÇTÇTõTõT"U"ULULUwUwUUUÆUÆUëUëU V V/V/VOVOVmVmVŠVŠV¦V¦VÀVÀVØVØVïVïVWWWW+W+W;W;WJWJWVWVWdWdWoWoWxWxW~W~W„W„WˆWˆWŠWŠWWW‹W‹WŠWŠW†W†WWW|W|WsWsWjWjW^W^WPWPWDWDW5W5W#W#WWWüVüVæVæVÎVÎV¶V¶V›V›VVVcVcVCVCV#V#VVVÞUÞUºUºU“U“UmUmUDUDUUUïTïTÁTÁT‘T‘TbTbT1T1TýSýSÈSÈS’S’SZSZS"S"SèRèR¬R¬RmRmR2R2RóQóQ±Q±QnQnQ,Q,QåPåPžPžPWPWP P PÁOÁOwOwO(O(OØNØNˆNˆN7N7NãMãMMM=M=MåLåLŒLŒL6L6LÝKÝK€K€K#K#KÇJÇJjJjJJJ¨I¨IEIEIäHäHHHHH±G±GJGJGàFàFtFtFFFEE/E/E¾D¾DODODàCàClClC÷B÷BBBBB–A–AAA¦@¦@.@.@²?²?5?5?¸>¸><><>¼=¼=:=:=¹<¹<:<:<´;´;.;.;ª:ª:&:&:ž9ž999Œ8Œ88877ù6ù6m6m6â5â5Y5Y5Í4Í4>4>4¬3¬333Ž2Ž2ÿ1ÿ1j1j1Ö0Ö0A0A0­/­///ˆ.ˆ.ð-ð-W-W-¿,¿,&,&,‘+‘+ó*ó*W*W*»)»)))…(…(ä'ä'D'D'¦&¦&&&i%i%Ì$Ì$)$)$†#†#ä"ä"B"B"£!£!ü ü U U ±±  jjÆÆ$$||ÒÒ,,„„ßß::””ïïDD™™ïïEEôôNN¦¦ùùKKžžññHHžžõ õ L L œ œ í í ? ? æ æ : : çç44ƒƒÖÖ''{{ÑÑ%%yyÈÈii¼ÿ¼ÿÿÿeþeþ¹ý¹ýýýeüeüºûºûûûiúiúÀùÀùùùaøaø³÷³÷÷÷\ö\ö²õ²õ õ õaôaô¹ó¹óóóiòiòÂñÂñññwðwðÑïÑï+ï+ïîîÓíÓí(í(íììÛëÛë4ë4ë‘ê‘êíéíéHéHé§è§èèèbçbçÁæÁæ!æ!æååáäáä;ä;ä•ã•ãòâòâQâQâ±á±ááátàtàØßØß=ß=ߡޡÞÞÞkÝkÝÒÜÒÜ:Ü:Ü¡Û¡Û Û ÛsÚsÚÜÙÜÙFÙFٲزØØ؈׈×öÖöÖcÖcÖÒÕÒÕAÕAÕ¯Ô¯Ô Ô ÔÓÓÓÓtÒt񾄾Ñ\Ñ\ÑÏÐÏÐDÐDлϻÏ0Ï0ϧΧÎ#Î#Π͠ÍÍÍ—Ì—ÌÌÌËË Ë Ë‹Ê‹Ê Ê Ê‰É‰É É ÉŠÈŠÈ È ÈÇÇÇǘƘÆÆƣţÅ+Å+ųijÄ<Ä<ÄÅÃÅÃPÃPÃÝÂÝÂhÂhÂ÷Á÷ÁˆÁˆÁÁÁ°À°ÀDÀDÀٿٿo¿o¿¿¿˜¾˜¾0¾0¾Ç½Ç½`½`½ú¼ú¼“¼“¼/¼/¼Ë»Ë»j»j» » »¯º¯ºQºQºö¹ö¹™¹™¹?¹?¹ä¸ä¸Š¸Š¸1¸1¸Ù·Ù·ƒ·ƒ·-·-·×¶×¶„¶„¶2¶2¶ßµßµ’µ’µFµFµû´û´¯´¯´f´f´´´Ñ³Ñ³‰³‰³B³B³ý²ý²¸²¸²t²t²0²0²ð±ð±¯±¯±p±p±4±4±ú°ú°À°À°†°†°M°M°°°ß¯ß¯ª¯ª¯x¯x¯E¯E¯¯¯æ®æ®¶®¶®ˆ®ˆ®Z®Z®/®/®®®Ý­Ý­¶­¶­­­j­j­D­D­"­"­ÿ¬ÿ¬Þ¬Þ¬À¬À¬¢¬¢¬„¬„¬i¬i¬N¬N¬4¬4¬¬¬¬¬ï«ï«Ù«Ù«Æ«Æ«³«³«£«£«’«’«ƒ«ƒ«v«v«i«i«^«^«S«S«J«J«D«D«=«=«8«8«5«5«2«2«/«/«/«/«1«1«2«2«5«5«:«:«?«?«D«D«N«N«W«W«`«`«m«m«z«z«†«†«•«•«§«§«¸«¸«É«É«Ý«Ý«ó«ó«¬¬ ¬ ¬7¬7¬O¬O¬l¬l¬†¬†¬¤¬¤¬Á¬Á¬ß¬ß¬­­"­"­D­D­i­i­Œ­Œ­³­³­Ù­Ù­®®+®+®U®U®®®¬®¬®Ú®Ú® ¯ ¯8¯8¯j¯j¯›¯›¯Ì¯Ì¯°°7°7°m°m° ° °Ú°Ú°±±N±N±‰±‰±Å±Å±²²A²A²ƒ²ƒ²Ã²Ã²³³G³G³Œ³Œ³Ð³Ð³´´]´]´¥´¥´î´î´7µ7µµµËµËµ¶¶f¶f¶³¶³¶··T·T·¤·¤·ö·ö·G¸G¸¸¸ò¸ò¸E¹E¹¹¹÷¹÷¹MºMº¦º¦º»»]»]»¹»¹»¼¼s¼s¼Ó¼Ó¼2½2½½½ó½ó½V¾V¾º¾º¾¿¿¿¿é¿é¿KÀKÀ²À²ÀÁÁ„Á„ÁíÁíÁWÂWÂÂÂÂÂ0Ã0ÜÜÃÄÄxÄxÄèÄèÄXÅXÅÆÅÆÅ9Æ9ƬƬÆÇÇÇÇÈÈ|È|ÈïÈïÈfÉfÉÞÉÞÉXÊXÊÎÊÎÊFËFËÁËÁË>Ì≯̸Ì2Í2Í­Í­Í(Î(ΤΤÎ"Ï"ϞϞÏÐММÐÑÑÑÑÒÒ Ò Ò Ó Ó¡Ó¡Ó$Ô$Ô¥Ô¥Ô(Õ(Õ®Õ®Õ0Ö0ÖµÖµÖ=×=×À×À×EØEØÍØÍØWÙWÙÞÙÞÙfÚfÚòÚòÚzÛzÛÜÜŽÜŽÜÝݡݡÝ.Þ.Þ¸Þ¸ÞAßAßÏßÏß[à[àæàæàuáuáââ“â“â#ã#ã´ã´ãAäAäÐäÐäbåbåðåð倿€æçç¡ç¡ç1è1èÃèÃèRéRéãéãéwêwêëë¡ë¡ë2ì2ìÈìÈìZíZííííí‚î‚îïï¦ï¦ï<ð<ðÏðÏðbñbñòñòñ†ò†òóó«ó«ó@ô@ôÖôÖôhõhõûõûõŒöŒö÷÷´÷´÷FøFøÚøÚøqùqùúú™ú™ú)û)û½û½ûSüSüåüåüyýyý þ þœþœþ-ÿ-ÿ¼ÿ¼ÿLLáárr››--ÁÁPPããww››//ÂÂUUååu u   — — ) ) ½ ½ N N ß ß l l ü ü ŽŽ¬¬>>ÌÌ[[ååss­­99ÅÅOOÙÙ__êêuuþþˆˆ••¡¡$$««22¶¶==¿¿BBÂÂE E Ê Ê L!L!Î!Î!N"N"Ð"Ð"L#L#Ì#Ì#H$H$Æ$Æ$G%G%Ã%Ã%A&A&½&½&:':'²'²'-(-(ª(ª($)$)ž)ž)****++z+z+ì+ì+a,a,Ù,Ù,L-L-Á-Á-4.4.¥.¥.//†/†/ú/ú/i0i0Û0Û0F1F1¶1¶1 2 222ø2ø2b3b3Î3Î39494¢4¢4 5 5r5r5Ø5Ø5=6=6¤6¤6 7 7n7n7Ñ7Ñ73838•8•8ö8ö8T9T9³9³9::m:m:È:È:$;$;;;Ú;Ú;2<2<‰<‰<à<à<9=9=Œ=Œ=ã=ã=6>6>Š>Š>Ý>Ý>.?.???Ð?Ð?@@n@n@º@º@AARARA A AéAéA2B2B{B{BÃBÃB C CPCPC•C•CÚCÚCDDaDaD¢D¢DäDäD$E$EcEcE E EàEàEFFWFWFFFÌFÌFGG>G>GtGtG«G«GàGàGHHGHGH{H{H¬H¬HÞHÞH I I:I:IiIiI”I”I¿I¿IëIëIJJ?J?JhJhJJJ¶J¶JÛJÛJKK&K&KHKHKjKjKŠKŠK¬K¬KÊKÊKéKéKLL#L#L?L?LYLYLrLrLŠLŠL£L£L¹L¹LÍLÍLãLãL÷L÷LMMMM-M-Mì>>>K>K>ý=ý=¬=¬=Z=Z===·<·>ªª  Ž Ž ÿ ÿ o o ß ß N N º º ( ( – –   o o Ú Ú GG±±‡‡÷÷eeÔÔAA­­ƒƒîîXXÂÂ++““üüccÌÌ33žž  rrÜÜDD­­yyßßDD©©ppÔÔ99››ffÌÌ00““ööXXºº  z z Ù Ù 8!8!—!—!ô!ô!R"R"°"°"##p#p#Î#Î#,$,$‰$‰$æ$æ$A%A%ž%ž%ù%ù%R&R&«&«&''\'\'³'³' ( (a(a(»(»())l)l)Ã)Ã)**q*q*Ä*Ä*++k+k+¿+¿+,,b,b,´,´,--T-T-£-£-ö-ö-F.F.™.™.ç.ç.6/6/ƒ/ƒ/Ð/Ð/00c0c0«0«0÷0÷0?1?1‡1‡1Î1Î122^2^2¦2¦2ñ2ñ28383€3€3Å3Å3 4 4P4P4•4•4×4×455\5\555Ý5Ý566]6]6›6›6Ü6Ü677\7\7™7™7×7×788N8N8‰8‰8Ã8Ã8ý8ý85959l9l9£9£9Ü9Ü9::F:F:~:~:´:´:é:é:;;Q;Q;„;„;¶;¶;æ;æ;<>.>.>X>X>>>¥>¥>Ì>Ì>ó>ó>??;?;?_?_???£?£?Å?Å?è?è?@@)@)@H@H@h@h@„@„@£@£@¿@¿@Û@Û@ø@ø@AA*A*ABABA\A\AtAtA‰A‰A¢A¢A¹A¹AÍAÍAäAäAøAøA B BBB0B0B@B@BQBQBbBbBqBqBBB‹B‹B™B™B§B§B²B²B¿B¿BÈBÈBÒBÒBÝBÝBæBæBîBîBôBôBúBúBÿBÿBCC C C C CCCCCCCCCCCCCCCCCCC C C C CCCCCûBûBöBöBïBïBèBèBÞBÞBÖBÖBËBËBÀBÀB·B·B«B«BBBBB‚B‚BuBuBfBfBVBVBEBEB4B4B$B$BBBþAþAëAëAÖAÖAÀAÀAªAªA“A“A}A}AeAeALALA4A4AAAÿ@ÿ@æ@æ@É@É@®@®@‘@‘@v@v@V@V@9@9@@@ü?ü?Û?Û?»?»?™?™?w?w?U?U?1?1? ? ?è>è>Ã>Ã>ž>ž>x>x>Q>Q>(>(>>>Ú=Ú=°=°=†=†=^=^=4=4===Ý<Ý<±<±<ƒ<ƒ>ÛÛyy³³QQîî‹‹((ÃÃ__üü˜˜44ÐÐll¢¢>>ÙÙtt¨ ¨ D D ß ß x x   ­ ­ G G á á z z   ¯ ¯ H H ââ||¯¯HHãã{{®®GGààxx««EEßßww¨¨BBÛÛtt®ÿ®ÿJÿJÿåþåþ€þ€þþþ³ý³ýMýMýéüéüƒüƒüüüµûµûPûPûéúéú…ú…úúú¸ù¸ùQùQùíøíø†ø†ø!ø!ø»÷»÷V÷V÷ñöñö‹ö‹ö&ö&öÁõÁõ[õ[õøôøô“ô“ô.ô.ôÉóÉófófóóóœòœò9ò9òÖñÖñrñrñññ«ð«ðIðIðæïæïƒïƒï!ï!ï¿î¿î]î]îûíûíšíší7í7íÖìÖìuìuììì³ë³ëRëRëòêòê“ê“ê2ê2êÓéÓététééé¶è¶èWèWèúçúçœçœç=ç=çàæàæ‚æ‚æ%æ%æÈåÈålålååå´ä´äWäWäþãþã¡ã¡ãFãFãíâíâ’â’â8â8âßáßá…á…á-á-áÓàÓà{à{à#à#àÊßÊßußußßßÅÞÅÞoÞoÞÞÞÄÝÄÝnÝnÝÝÝÆÜÆÜrÜrÜÜÜÉÛÉÛwÛwÛ$Û$ÛÒÚÒÚ€Ú€Ú-Ú-ÚÜÙÜييÙ<Ù<ÙêØê؜؜ØKØKØý×ý×®×®×`×`×××ÅÖÅÖxÖxÖ+Ö+ÖßÕßÕ”Õ”ÕHÕHÕþÔþÔ´Ô´ÔhÔhÔ Ô ÔØÓØÓÓÓFÓFÓþÒþÒ¸Ò¸ÒoÒoÒ)Ò)ÒâÑâўўÑZÑZÑÑÑÐÐÐЌЌÐIÐIÐÐÐÄÏÄςςÏBÏBÏÏÏÁÎÁÎÎÎAÎAÎÎÎÄÍÄ͆͆ÍHÍHÍ Í ÍÐÌÐ̔̔ÌYÌYÌÌÌãËã˩˩ËpËpË8Ë8ËÿÊÿÊÇÊÇÊÊÊZÊZÊ"Ê"ÊíÉíɹɹɃɃÉPÉPÉÉÉéÈéȸȸȄȄÈTÈTÈ"È"ÈòÇòÇÃÇÃǔǔÇeÇeÇ8Ç8ÇÇÇÝÆÝÆ°Æ°ÆƒÆƒÆZÆZÆ-Æ-ÆÆÆÚÅÚŰŰňňÅaÅaÅ:Å:ÅÅÅìÄìįįġġÄ~Ä~Ä[Ä[Ä9Ä9ÄÄÄöÃöÃÔÃÔóóÓÓÃsÃsÃTÃTÃ5Ã5ÃÃÃúÂúÂÞÂÞÂÀÂÀ¤¤ˆˆÂnÂnÂUÂUÂ;Â;Â!Â!ÂÂÂóÁóÁÜÁÜÁÄÁÄÁ®Á®ÁšÁšÁƒÁƒÁrÁrÁ^Á^ÁJÁJÁ8Á8Á%Á%ÁÁÁÁÁõÀõÀåÀåÀ×À×ÀÈÀÈÀ¼À¼À®À®À¡À¡À–À–ÀŠÀŠÀ€À€ÀxÀxÀnÀnÀeÀeÀ^À^ÀWÀWÀNÀNÀHÀHÀBÀBÀ?À?À:À:À6À6À3À3À/À/À.À.À-À-À+À+À+À+À+À+À-À-À.À.À0À0À5À5À8À8À<À<ÀAÀAÀEÀEÀLÀLÀSÀSÀZÀZÀaÀaÀjÀjÀtÀtÀ}À}À…À…À’À’ÀžÀžÀ¨À¨ÀµÀµÀÂÀÂÀÎÀÎÀÞÀÞÀíÀíÀýÀýÀ Á ÁÁÁ.Á.ÁAÁAÁSÁSÁeÁeÁzÁzÁÁÁ¢Á¢Á¸Á¸ÁÎÁÎÁåÁåÁüÁüÁÂÂ+Â+ÂDÂDÂ^Â^ÂyÂy““­­ÂÉÂÉÂæÂæÂÃÃÃÃ>Ã>Ã^Ã^Ã{Ã{ÜÜýýÃÝÃÝÃþÃþÃ!Ä!ÄBÄBÄeÄeĈĈĭĭÄÓÄÓÄøÄøÄÅÅDÅDÅkÅkŒŒŻŻÅâÅâÅ Æ Æ6Æ6Æ`Æ`ÆŠÆŠÆ·Æ·ÆáÆáÆ Ç Ç;Ç;ÇhÇhǕǕÇÄÇÄÇóÇóÇ!È!ÈSÈSȂȂȴȴÈåÈåÈÉÉJÉJÉ}É}ɯɯÉäÉäÉÊÊMÊMʂʂʺʺÊîÊîÊ&Ë&Ë_Ë_Ë–Ë–ËÎËÎËÌÌAÌAÌyÌy̵̵ÌîÌîÌ)Í)ÍeÍe͢͢ÍßÍßÍÎÎYÎYΖΖÎÕÎÕÎÏÏTÏTÏ’Ï’ÏÓÏÓÏÐÐTÐTÐ–Ð–ÐØÐØÐÑÑ]Ñ]Ñ Ñ ÑâÑâÑ'Ò'ÒjÒjÒ¯Ò¯ÒõÒõÒ;Ó;ÓÓÓÆÓÆÓ Ô ÔUÔUÔšÔšÔßÔßÔ&Õ&ÕmÕmÕ¶Õ¶ÕþÕþÕGÖGÖÖÖÚÖÚÖ$×$×o×o׼׼רØSØSؠؠØìØìØ:Ù:ننÙÕÙÕÙ#Ú#ÚrÚrÚÁÚÁÚÛÛ_Û_Û®Û®ÛÜÜOÜOܡܡÜòÜòÜDÝDÝ–Ý–ÝæÝæÝ:Þ:ތތÞßÞßÞ3ß3ß…ß…ßÙßÙß/à/àààÖàÖà,á,á€á€áÕáÕá,â,âââÖâÖâ.ã.ãƒãƒãÛãÛã2ä2äˆäˆäáäáä7å7å‘å‘åèåèåAæAæšæšæòæòæLçLç¤ç¤çþçþçVèVè±è±è é éeéeéÀéÀéêêtêtêÏêÏê*ë*ë…ë…ëáëáë=ì=ì˜ì˜ìóìóìPíPí¬í¬íîîdîdîÁîÁîïï{ï{ïÖïÖï3ð3ð‘ð‘ðïðïðKñKñ©ñ©ñòòcòcòÁòÁòóó~ó~óÚóÚó9ô9ô—ô—ôöôöôRõRõ±õ±õööoöoöÌöÌö*÷*÷‰÷‰÷é÷é÷FøFø¥ø¥øùùbùbùÁùÁù ú ú€ú€úÝúÝú=û=ûšûšûúûúûYüYü·ü·üýýuýuýÓýÓý3þ3þ‘þ‘þðþðþOÿOÿ­ÿ­ÿ iiÇÇ%%ƒƒââAAŸŸýý[[¹¹vvÓÓ//ŽŽëëJJ¦¦``¾¾vvÔÔ/ / Œ Œ è è E E Ÿ Ÿ ü ü W W ´ ´   i i Æ Æ   y y Ö Ö //‰‰ââ>>——ïïJJ¢¢üüTT­­\\´´  cc¼¼ii¿¿kkÀÀkkÀÀii¿¿dd¹¹  ^^¯¯ÿÿNNžžïï??ÞÞ..}}ÌÌjj¹¹SS¢¢ïï==‰‰ÔÔ k k ¹ ¹ !!L!L!˜!˜!à!à!*"*"t"t"½"½"##L#L#•#•#Ý#Ý#$$$$i$i$±$±$ö$ö$;%;%€%€%Ä%Ä% & &L&L&&&Ó&Ó&''X'X'›'›'Û'Û'((](](ž(ž(Ý(Ý())[)[)š)š)×)×)**R*R*Ž*Ž*Ê*Ê*++A+A+}+}+·+·+ñ+ñ+),),d,d,,,Ô,Ô, - -B-B-{-{-°-°-æ-æ-..P.P.….….¹.¹.ì.ì.//R/R/ƒ/ƒ/¶/¶/æ/æ/00F0F0x0x0¤0¤0Õ0Õ0110101]1]1Š1Š1·1·1á1á1 2 28282a2a2‹2‹2µ2µ2Þ2Þ233*3*3T3T3{3{3Ÿ3Ÿ3Å3Å3é3é3442424V4V4y4y4š4š4½4½4ß4ß4ÿ4ÿ455?5?5^5^5}5}5›5›5¸5¸5Ô5Ô5ò5ò5 6 6'6'6C6C6^6^6w6w6‘6‘6©6©6À6À6Ù6Ù6ð6ð677772727E7E7Z7Z7n7n777”7”7¥7¥7·7·7Ç7Ç7Ù7Ù7é7é7ù7ù78888"8"80808<8<8G8G8S8S8^8^8h8h8s8s8{8{8ƒ8ƒ8Œ8Œ8“8“8š8š8 8 8¥8¥8«8«8±8±8µ8µ8¸8¸8»8»8¾8¾8¿8¿8¿8¿8Á8Á8Á8Á8Á8Á8À8À8¿8¿8½8½8»8»8¸8¸8´8´8®8®8ª8ª8¤8¤8Ÿ8Ÿ8š8š8’8’8Š8Š8ƒ8ƒ8{8{8q8q8f8f8]8]8S8S8F8F8;8;8-8-8888888÷7÷7æ7æ7Ù7Ù7È7È7¸7¸7¦7¦7•7•7ƒ7ƒ7p7p7]7]7H7H7474777 7 7ô6ô6Þ6Þ6Å6Å6­6­6–6–6~6~6c6c6I6I6161666ú5ú5Þ5Þ5À5À5¤5¤5†5†5h5h5I5I5*5*5 5 5ë4ë4Ê4Ê4©4©4‰4‰4f4f4C4C444þ3þ3Ù3Ù3µ3µ333i3i3C3C333÷2÷2Í2Í2¦2¦222U2U2+2+222Ø1Ø1¬1¬111U1U1(1(1ý0ý0Î0Î0 0 0t0t0D0D000æ/æ/µ/µ/…/…/U/U/"/"/ñ.ñ.¾.¾.Œ.Œ.Y.Y.$.$.ò-ò-¼-¼-ˆ-ˆ-R-R---æ,æ,°,°,z,z,A,A, , ,Ò+Ò+š+š+_+_+%+%+ì*ì*²*²*w*w*<*<***Ä)Ä)ˆ)ˆ)K)K)))Ñ(Ñ(”(”(U(U(((Ø'Ø'™'™'X'X'''Ø&Ø&˜&˜&V&V&&&Ò%Ò%‘%‘%M%M% % %Æ$Æ$ƒ$ƒ$?$?$û#û#·#·#r#r#,#,#æ"æ"¡"¡"Z"Z"""Ì!Ì!…!…!>!>!÷ ÷ ® ® e e   ÓÓ‹‹@@öö®®bbÍÍ66ê꟟PP¹¹kkÏÏ‚‚44åå––IIùù««[[  ¼¼kkËËzz))ÖÖ††55ââ‘‘??íí››IIõõ¢¢OOüüªªUU®®[[±±^^µµ__  ¶ ¶ a a · · a a ¶ ¶ _ _ µ µ _ _   ² ² ] ]   ¯¯YY««XX¯¯[[°°[[¯¯XX««UUýý§§QQúú¢¢LLõõžžGGòÿòÿ›ÿ›ÿDÿDÿîþîþ–þ–þ@þ@þéýéý‘ý‘ý;ý;ýåüåüüü7ü7üáûáûŠûŠû5û5ûÞúÞú‰ú‰ú1ú1úÜùÜù†ù†ù0ù0ùÚøÚø…ø…ø.ø.øÙ÷Ù÷„÷„÷/÷/÷ÙöÙö„ö„ö/ö/öÚõÚõ†õ†õ1õ1õÜôÜô‰ô‰ô3ô3ôàóàó‹ó‹ó8ó8óäòäò‘ò‘ò<ò<òéñéñ˜ñ˜ñCñCññðñðŸðŸðKðKðúïúï¦ï¦ïUïUïïï±î±îaîaîîî¿í¿íníníííÍìÍì}ì}ì,ì,ìÝëÝëëë>ë>ëïêïê ê êQêQêêê²é²éeéeéééËèËè~è~è0è0èãçãç–ç–çKçKçÿæÿæ²æ²æfæfæææÑåÑå…å…å;å;åñäñä§ä§ä^ä^äääËãËã‚ã‚ã:ã:ãñâñâ«â«âaâaâââÓáÓáááFáFááá¼à¼àtàtà1à1àêßêߦߦßbßbßßßÜÞÜÞ™Þ™ÞUÞUÞÞÞÐÝÐÝŽÝŽÝLÝLÝ Ý ÝÊÜÊÜŠÜŠÜJÜJÜ Ü ÜÊÛÊییÛMÛMÛÛÛÒÚÒÚ•Ú•ÚWÚWÚÚÚÞÙÞ٢٢ÙfÙfÙ+Ù+ÙðØðضضØ|Ø|ØBØBØ Ø ØÐ×Ðטט×`×`×'×'×ïÖïÖºÖºÖƒÖƒÖLÖLÖÖÖáÕáÕ­Õ­ÕxÕxÕDÕDÕÕÕÝÔÝÔ«Ô«ÔyÔyÔGÔGÔÔÔäÓäÓ´Ó´Ó‚Ó‚ÓUÓUÓ$Ó$ÓöÒöÒÇÒÇÒšÒšÒkÒkÒ?Ò?ÒÒÒåÑåѺѺююÑcÑcÑ:Ñ:ÑÑÑæÐæÐ¾Ð¾Ð•Ð•ÐlÐlÐDÐDÐÐÐ÷Ï÷ÏÒÏÒϫϫυυÏaÏaÏ=Ï=ÏÏÏöÎöÎÓÎÓΰΰΎΎÎmÎmÎMÎMÎ-Î-ÎÎÎïÍïÍÒÍÒʹʹ͕͕ÍyÍyÍ\Í\Í@Í@Í"Í"ÍÍÍëÌëÌÒÌÒ̷̷̞̞̃̃ÌkÌkÌTÌTÌ=Ì=Ì$Ì$Ì Ì ÌøËøËáËáËÌËÌ˸˸ˢˢËËË|Ë|ËiËiËXËXËEËEË5Ë5Ë#Ë#ËËËËËôÊôÊæÊæÊØÊØÊÊÊÊʽʽʯʯʣʣʘʘʌʌÊÊÊxÊxÊmÊmÊeÊeÊ^Ê^ÊUÊUÊLÊLÊFÊFÊ@Ê@Ê9Ê9Ê4Ê4Ê.Ê.Ê)Ê)Ê%Ê%Ê"Ê"Ê Ê ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ Ê Ê#Ê#Ê&Ê&Ê*Ê*Ê0Ê0Ê6Ê6Ê;Ê;ÊAÊAÊGÊGÊNÊNÊWÊWÊ_Ê_ÊfÊfÊoÊoÊ{Ê{ʃʃʎʎʛʛʥʥʲʲÊÀÊÀÊÌÊÌÊÚÊÚÊèÊèÊöÊöÊËËËË%Ë%Ë7Ë7ËGËGË[Ë[ËkËkË~Ë~˒˒ˤˤ˹˹ËÎËÎËãËãËùËùËÌÌ$Ì$Ì=Ì=ÌTÌTÌjÌj̄̄ÌÌ̸̸ÌÒÌÒÌêÌêÌÍÍ!Í!Í>Í>ÍZÍZÍvÍv͔͔ͲͲÍÏÍÏÍíÍíÍ Î Î,Î,ÎLÎLÎlÎlÎÎίίÎÓÎÓÎóÎóÎÏÏ:Ï:Ï^Ï^ÏÏϥϥÏÊÏÊÏïÏïÏÐÐ=Ð=ÐaÐaЉЉввÐÛÐÛÐÑÑ*Ñ*ÑUÑUÑ~Ñ~ѧѧÑÔÑÔÑþÑþÑ(Ò(ÒVÒVÒÒÒ®Ò®ÒÛÒÛÒ Ó Ó8Ó8ÓdÓdÓ”Ó”ÓÃÓÃÓòÓòÓ"Ô"ÔSÔSÔ‚Ô‚ÔµÔµÔåÔåÔÕÕJÕJÕ}Õ}Õ°Õ°ÕâÕâÕÖÖKÖKÖ€Ö€ÖµÖµÖéÖéÖ × ×U×U׌׌×Ã×Ã×ú×ú×2Ø2ØiØiءءØÚØÚØÙÙLÙLممÙÁÙÁÙúÙúÙ5Ú5ÚoÚoÚªÚªÚåÚåÚ"Û"Û^Û^Û›Û›ÛØÛØÛÜÜSÜSÜÜÜÍÜÍÜ Ý ÝJÝJÝŠÝŠÝÉÝÉÝ Þ ÞHÞHÞ‡Þ‡ÞÅÞÅÞßßDßD߄߄ßÄßÄßààGàGàŠàŠàÌàÌàááQáQá”á”á×á×áââ`â`â£â£âèâèâ.ã.ãrãrã¸ã¸ãÿãÿãBäBäŠäŠäÑäÑäåå^å^å¥å¥åìåìå3æ3æ|æ|æÂæÂæ ç çSçSçççåçåç/è/èwèwèÁèÁè é éSéSéŸéŸéçéçé1ê1ê}ê}êÆêÆêëë^ë^ë¨ë¨ëóëóë?ì?ì‹ì‹ìÕìÕì"í"íoíoíºíºíîîRîRî¡î¡îíîíî8ï8ï†ï†ïÒïÒï ð ðnðnðºðºð ñ ñVñVñ£ñ£ñòñòñ@ò@òòòÛòÛò)ó)óyóyóÇóÇóôôdôdô²ô²ôõõQõQõŸõŸõïõïõ<ö<öŒöŒöÚöÚö)÷)÷y÷y÷É÷É÷øøhøhø¶ø¶øùùUùUù¥ù¥ùõùõùDúDú’ú’úâúâú1û1ûûûÑûÑû!ü!üqüqü¿ü¿üýý_ý_ý­ý­ýýýýýMþMþœþœþìþìþ;ÿ;ÿŠÿŠÿÚÿÚÿ''wwÆÆdd³³QQ¡¡ïï??ÛÛ**wwÇÇcc²²ÿÿNN››êê77ƒƒÒÒmm¹¹  T T Ÿ Ÿ ì ì 8 8 … … Ð Ð   g g µ µ ÿ ÿ L L — — á á - - w w Á Á  WW  éé55~~ÇÇ[[¢¢ëë33{{Ãà  RRššàà))ooµµüüAAˆˆÎÎXXàà%%ii®®ðð44xx»»ýý??€€ÃÃEE††ÈÈIIˆˆÈÈEEƒƒÂÂ??||ººõõ22ll¥¥ßßSSÅÅÿÿ99qq««áá  R R ‰ ‰ À À ÷ ÷ .!.!c!c!›!›!Ð!Ð!"":":"m"m"¢"¢"Ö"Ö"##<#<#n#n# # #Ô#Ô#$$6$6$f$f$˜$˜$Æ$Æ$÷$÷$&%&%U%U%ƒ%ƒ%³%³%ß%ß% & &:&:&e&e&“&“&¾&¾&é&é&''?'?'i'i'”'”'½'½'å'å'((6(6(^(^(…(…(¬(¬(Ò(Ò(ú(ú())C)C)h)h)Œ)Œ)±)±)Ô)Ô)÷)÷)**<*<*_*_*** * *À*À*à*à*++++>+>+]+]+{+{+™+™+µ+µ+Ò+Ò+î+î+ , ,%,%,?,?,Z,Z,t,t,Œ,Œ,¦,¦,¿,¿,×,×,ð,ð,----2-2-G-G-^-^-t-t-ˆ-ˆ-œ-œ-®-®-Â-Â-Õ-Õ-æ-æ-ø-ø- . ...*.*.<.<.I.I.Z.Z.h.h.v.v.ƒ.ƒ.‘.‘.Ÿ.Ÿ.¨.¨.µ.µ.À.À.Ê.Ê.Ö.Ö.ß.ß.é.é.ò.ò.û.û.// / ///////"/"/'/'/,/,/1/1/5/5/9/9//>/?/?/A/A/A/A/B/B/B/B/A/A/@/@/?/?/?/?/>öö®®gg×׎ŽGGþþ··oo&&ÞÞ””NN½½uu++ãã››SS  ÁÁyy00è蟟WWÉÿÉÿÿÿ8ÿ8ÿðþðþ§þ§þ_þ_þþþÏýÏý‡ý‡ý?ý?ý÷ü÷ü­ü­ügügüüüÖûÖûŽûŽûHûHûûû¹ú¹úqúqú)ú)úáùáùšùšùTùTù ù ùÅøÅø~ø~ø8ø8øñ÷ñ÷©÷©÷c÷c÷÷÷×ö×ö‘ö‘öIöIööö¾õ¾õyõyõ2õ2õîôîô§ô§ôbôbôôôÙóÙó“ó“óOóOó ó óÄòÄòòò;ò;òûñûñ¹ñ¹ñxñxñ6ñ6ñóðóð±ð±ðpðpð.ð.ðìïìïªïªïhïhï%ï%ïäîäî¢î¢îaîaî!î!îßíßíŸíŸí]í]íííÜìÜìœìœì\ì\ìììÜëÜëëë]ë]ëëëßêßê ê êaêaê#ê#êäéäé§é§éjéjé-é-éïèïè±è±èuèuè8è8èýçýçÁçÁç„ç„çHçHçççÓæÓæ˜æ˜æ^æ^æ$æ$æëåëå±å±åvåvå>å>åååÍäÍä”ä”ä\ä\ä%ä%äíãíãµãµãããGãGãããÜâÜâ¦â¦âqâqâ<â<âââÑáÑážážájájá6á6áááÐàÐàžàžàkàkà8à8àààÕßÕߤߤßsßsßBßBßßßâÞâÞ´Þ´ÞƒÞƒÞUÞUÞ&Þ&ÞùÝùÝÊÝÊÝÝÝoÝoÝBÝBÝÝÝéÜéܿܿܓܓÜgÜgÜ>Ü>ÜÜÜçÛçÛ¿Û¿Û–Û–ÛlÛlÛDÛDÛÛÛôÚôÚËÚËÚ¥Ú¥ÚÚÚWÚWÚ2Ú2Ú Ú ÚæÙæÙÂÙÂÙÙÙyÙyÙUÙUÙ2Ù2ÙÙÙëØëØÉØÉاا؅؅ØdØdØDØDØ#Ø#ØØØã×ã×Å×Åץץ׆׆×h×h×K×K×.×.×××õÖõÖØÖØÖ¾Ö¾Ö¡Ö¡Ö†Ö†ÖkÖkÖSÖSÖ9Ö9Ö Ö ÖÖÖíÕíÕÖÕÖÕ¿Õ¿Õ¦Õ¦ÕÕÕzÕzÕcÕcÕMÕMÕ:Õ:Õ$Õ$ÕÕÕüÔüÔçÔçÔÕÔÕÔÂÔÂÔ°Ô°ÔžÔžÔ‹Ô‹Ô{Ô{ÔjÔjÔ[Ô[ÔKÔKÔ<Ô<Ô,Ô,ÔÔÔÔÔÔÔõÓõÓæÓæÓÜÓÜÓÎÓÎÓÃÓÃÓ¹Ó¹Ó­Ó­Ó¢Ó¢ÓšÓšÓÓÓ†Ó†Ó~Ó~ÓvÓvÓmÓmÓfÓfÓ`Ó`ÓZÓZÓTÓTÓMÓMÓHÓHÓBÓBÓ@Ó@Ó;Ó;Ó8Ó8Ó4Ó4Ó2Ó2Ó.Ó.Ó-Ó-Ó+Ó+Ó*Ó*Ó)Ó)Ó*Ó*Ó*Ó*Ó*Ó*Ó+Ó+Ó,Ó,Ó.Ó.Ó2Ó2Ó5Ó5Ó8Ó8Ó<Ó<Ó?Ó?ÓDÓDÓGÓGÓNÓNÓTÓTÓZÓZÓ`Ó`ÓfÓfÓnÓnÓvÓvÓÓÓ†Ó†ÓÓÓ›Ó›Ó£Ó£Ó­Ó­Ó¹Ó¹ÓÃÓÃÓÏÓÏÓÚÓÚÓæÓæÓóÓóÓÔÔ Ô ÔÔÔ(Ô(Ô9Ô9ÔGÔGÔWÔWÔeÔeÔvÔvÔ‡Ô‡Ô™Ô™Ô©Ô©Ô¼Ô¼ÔÍÔÍÔàÔàÔôÔôÔÕÕÕÕ/Õ/ÕCÕCÕYÕYÕnÕnÕ„Õ„Õ›Õ›Õ²Õ²ÕÈÕÈÕáÕáÕ÷Õ÷ÕÖÖ)Ö)ÖAÖAÖ[Ö[ÖvÖvÖŽÖŽÖ©Ö©ÖÅÖÅÖàÖàÖüÖüÖ××5×5×P×P×m×m׋׋שש×Ç×Ç׿׿רØ%Ø%ØDØDØdØd؄؄إإØÇØÇØçØçØ Ù Ù,Ù,ÙNÙNÙrÙrٖٖٺٺÙÝÙÝÙÚÚ&Ú&ÚKÚKÚoÚoÚ—Ú—Ú½Ú½ÚâÚâÚ Û Û0Û0ÛWÛWÛ€Û€Û§Û§ÛÏÛÏÛùÛùÛ!Ü!ÜJÜJÜtÜtÜŸÜŸÜÈÜÈÜóÜóÜÝÝHÝHÝuÝuݡݡÝÌÝÌÝùÝùÝ%Þ%ÞSÞSÞ€Þ€Þ­Þ­ÞÜÞÜÞ ß ß9ß9ßfßfß–ß–ßÅßÅßõßõß%à%àTàTà…à…à¶à¶àæàæàááJáJá}á}á¯á¯áááááââEâEâxâxâ­â­âáâáâããGãGã}ã}ã±ã±ãåãåãääQäQä†ä†ä¼ä¼äñäñä*å*å_å_å•å•åÍåÍåææ;æ;æræræ«æ«æâæâæççSçSçççÄçÄçÿçÿç6è6èqèqè¬è¬èãèãèééXéXé“é“éÎéÎéêêCêCêêêºêºêõêõê1ë1ëmëmë¨ë¨ëåëåë"ì"ì^ì^ìœìœì×ì×ìííQíQíííÍíÍí î îGîGî…î…îÂîÂîïï@ï@ïïï½ï½ïüïüï9ð9ðyðyð¸ð¸ð÷ð÷ð6ñ6ñvñvñ´ñ´ñôñôñ3ò3òsòsò²ò²òòòòò2ó2ósósó²ó²óóóóó2ô2ôtôtô³ô³ôôôôô4õ4õwõwõ·õ·õøõøõ9ö9öyöyöºöºöûöûö<÷<÷~÷~÷¿÷¿÷øøAøAø„ø„øÄøÄøùùFùFù‰ù‰ùÉùÉù ú úMúMúúúÐúÐúûûRûRû•û•ûÖûÖûüüYüYü›ü›üÝüÝüýýaýaý¡ý¡ýãýãý%þ%þgþgþ¨þ¨þêþêþ+ÿ+ÿmÿmÿ®ÿ®ÿïÿïÿ..pp¯¯îî--ll««ìì++kk««ëë++mm««íí++ll¬¬ìì,,ll««ëë++kk««ëë((hh§§çç&&ee¢¢áá  _ _ Ú Ú   W W • • Ò Ò   N N ‰ ‰ Ç Ç   @ @ } } ¹ ¹ ö ö 2 2 n n © © å å !!]]——ÒÒ  GG½½öö00jj££ÝÝOOˆˆÀÀøø00hhŸŸØØEE}}²²ééUU‹‹ÀÀõõ++__““ÉÉýý00cc––ËËýý//aa““ÅÅöö))ZZŠŠ¼¼ëëKKzzªªØØ55bb¿¿ëëDDppžžÉÉóóJJttŸŸÈÈññDDnn••¾¾åå  44[[¨¨ÍÍòò>>aa……ªªÎÎïï  7 7 X X z z œ œ ½ ½ Þ Þ þ þ !!>!>!^!^!}!}!œ!œ!»!»!Ù!Ù!÷!÷!""2"2"M"M"j"j"…"…"¡"¡"½"½"Ø"Ø"ó"ó" # #&#&#?#?#Z#Z#s#s#‹#‹#¢#¢#»#»#Ò#Ò#è#è#ÿ#ÿ#$$+$+$@$@$W$W$k$k$$$•$•$¨$¨$º$º$Í$Í$ß$ß$ò$ò$%%%%&%&%7%7%G%G%X%X%g%g%w%w%…%…%”%”%¢%¢%°%°%½%½%É%É%Ö%Ö%â%â%î%î%ú%ú%&&&&&&$&$&,&,&5&5&?&?&F&F&N&N&W&W&^&^&d&d&k&k&r&r&w&w&|&|&&&…&…&‰&‰&Ž&Ž&‘&‘&”&”&˜&˜&™&™&›&›&œ&œ&ž&ž&ž&ž&Ÿ&Ÿ&Ÿ&Ÿ&ž&ž&œ&œ&œ&œ&›&›&˜&˜&–&–&“&“&&&‹&‹&ˆ&ˆ&ƒ&ƒ&&&{&{&v&v&p&p&h&h&c&c&]&]&U&U&M&M&D&D&=&=&5&5&+&+&"&"&&&&&&&ù%ù%í%í%á%á%Ö%Ö%É%É%½%½%®%®%¡%¡%•%•%…%…%w%w%g%g%Y%Y%H%H%9%9%(%(%%%%%ö$ö$ã$ã$Ñ$Ñ$¿$¿$¬$¬$˜$˜$„$„$p$p$\$\$F$F$3$3$$$$$ñ#ñ#Û#Û#Ã#Ã#¬#¬#–#–#~#~#d#d#L#L#5#5#####æ"æ"Ì"Ì"³"³"˜"˜"|"|"`"`"C"C"("(" " "ð!ð!Ò!Ò!µ!µ!—!—!y!y!Z!Z!ø>øøøÌ÷Ì÷’÷’÷Y÷Y÷!÷!÷éöéö°ö°öxöxö?ö?öööÎõÎõ–õ–õ^õ^õ&õ&õïôïô·ô·ôôôHôHôôôÙóÙó¡ó¡ókókó3ó3óþòþòÈòÈò‘ò‘òZòZò$ò$òïñïñ¹ñ¹ñƒñƒñNñNñññâðâð®ð®ðyðyðDðDðððÜïÜï¦ï¦ïsïsï@ï@ï ï ïØîØî¤î¤îqîqî?î?î î îÚíÚí¦í¦íuíuíBíBíííàìàì®ì®ì~ì~ìLìLìììëëëëºëºëŠëŠëZëZë*ë*ëûêûêËêËêêêmêmê>ê>êêêáéáé²é²é…é…éWéWé+é+éýèýèÑèÑè£è£èvèvèKèKèèèòçòçÆçÆçççqçqçEçEçççñæñæÆæÆæžæžæsæsæKæKæ"æ"æúåúåÑåÑå¨å¨åååXåXå1å1å å åâäâä¼ä¼ä–ä–äpäpäJäJä$ä$äääÚãÚã¶ã¶ã‘ã‘ãmãmãHãHã%ã%ãããßâßâ¼â¼â›â›âwâwâUâUâ4â4âââñáñáÑáÑá±á±á‘á‘áqáqáQáQá2á2áááôàôàÕàÕà¸à¸à›à›à}à}à`à`àBàBà'à'à à àíßíßÓßÓ߸߸ßßßßßgßgßLßLß5ß5ßßßßßèÞèÞÐÞÐÞ¹Þ¹Þ¡Þ¡Þ‰Þ‰ÞsÞsÞ\Þ\ÞDÞDÞ/Þ/ÞÞÞÞÞîÝîÝÚÝÚÝÄÝÄݲݲݞݞ݉݉ÝwÝwÝcÝcÝPÝPÝ@Ý@Ý-Ý-ÝÝÝ Ý ÝúÜúÜèÜèÜØÜØÜÈÜÈܻܻܪܪܜܜÜÜÜÜÜpÜpÜcÜcÜVÜVÜIÜIÜ>Ü>Ü2Ü2Ü%Ü%ÜÜÜÜÜÜÜúÛúÛïÛïÛåÛåÛÝÛÝÛÔÛÔÛÊÛÊÛÃÛÃÛ¼Û¼Û´Û´Û«Û«Û¥Û¥ÛŸÛŸÛ™Û™Û’Û’ÛÛÛ‡Û‡ÛÛÛ~Û~Û{Û{ÛvÛvÛrÛrÛnÛnÛlÛlÛiÛiÛgÛgÛeÛeÛdÛdÛcÛcÛbÛbÛbÛbÛbÛbÛbÛbÛcÛcÛdÛdÛeÛeÛgÛgÛiÛiÛkÛkÛnÛnÛpÛpÛtÛtÛyÛyÛ}Û}Û€Û€Û„Û„ÛŠÛŠÛŽÛŽÛ•Û•Û›Û›Û¡Û¡Û§Û§Û®Û®Û·Û·Û¿Û¿ÛÆÛÆÛÍÛÍÛ×Û×ÛàÛàÛéÛéÛóÛóÛýÛýÛÜÜÜÜÜÜ(Ü(Ü5Ü5Ü@Ü@ÜKÜKÜXÜXÜeÜeÜsÜsÜÜ܎܎ܞܞܫܫܻܻÜÉÜÉÜÚÜÚÜéÜéÜúÜúÜ Ý ÝÝÝ,Ý,Ý>Ý>ÝOÝOÝaÝaÝtÝt݆݆ݛݛݭݭÝÁÝÁÝÕÝÕÝéÝéÝÿÝÿÝÞÞ(Þ(Þ?Þ?ÞTÞTÞjÞjÞÞÞ˜Þ˜Þ¯Þ¯ÞÆÞÆÞÞÞÞÞ÷Þ÷Þßß&ß&ß@ß@ßYßYßsßsߌߌߦߦßÁßÁßÜßÜß÷ß÷ßàà.à.àHàHàeàeàààŸàŸà¼à¼àØàØàõàõàáá2á2áPáPáoáoáŽáŽá­á­áÌáÌáìáìá â â-â-âMâMânânâââ±â±âÑâÑâòâòâãã7ã7ã[ã[ã}ã}ã ã ãÂãÂãæãæã ä ä0ä0äRäRäwäwäääÁäÁäåäåä å å2å2åVåVå~å~å¤å¤åËåËåñåñåææ@æ@ægægæææ¶æ¶æàæàæçç1ç1çZçZç‚ç‚ç­ç­çÕçÕçÿçÿç*è*èRèRè~è~è¨è¨èÒèÒèþèþè(é(éSéSé€é€é«é«éÖéÖéêê/ê/ê[ê[ê‡ê‡ê³ê³êáêáêëë<ë<ëjëjë—ë—ëÄëÄëòëòë!ì!ìOìOì~ì~ì«ì«ìÛìÛì í í7í7ígígí—í—íÆíÆíöíöí%î%îUîUî†î†îµîµîæîæîïïFïFïxïxï¨ï¨ïÚïÚï ð ð<ð<ðnðnðŸðŸðÑðÑðññ4ñ4ñgñgñ™ñ™ñÊñÊñüñüñ/ò/òaòaò”ò”òÇòÇòùòùò+ó+ó`ó`ó’ó’óÆóÆóùóùó+ô+ô`ô`ô“ô“ôÇôÇôúôúô.õ.õaõaõ”õ”õÉõÉõþõþõ1ö1öföfö™ö™öÎöÎö÷÷6÷6÷j÷j÷Ÿ÷Ÿ÷Ó÷Ó÷ ø ø=ø=øqøqø¥ø¥øÚøÚøùùDùDùyùyù­ù­ùâùâùúúMúMúúúµúµúìúìú û ûUûUû‰û‰û¾û¾ûõûõû)ü)ü_ü_ü“ü“üÇüÇüýüýü1ý1ýgýgý›ý›ýÑýÑýþþ;þ;þqþqþ£þ£þÖþÖþ ÿ ÿ<ÿ<ÿpÿpÿ£ÿ£ÿ×ÿ×ÿ<<pp¤¤ØØ  @@tt¨¨ÜÜEEyy­­ááII{{¯¯ããKK~~²²ææKK²²ææKK||¯¯ããGGxx««ÞÞAArr¥¥××  8 8 j j š š Ì Ì ý ý . . ^ ^ Ž Ž ¿ ¿ î î   O O ~ ~ ­ ­ Þ Þ < < i i ˜ ˜ Ç Ç ö ö % % T T € € ¯ ¯ Ý Ý  77dd¿¿êêEEooœœÈÈôôKKuu  ÌÌõõKKssžžÈÈððBBkk““½½ãã  44\\‚‚ªªÐÐööDDiiµµÚÚÿÿ$$IImmµµÙÙýýBBddˆˆªªÌÌíí00PPqq‘‘²²ÒÒòò11OOoo¬¬ÊÊææ!!??[[vv’’¯¯ËËåå66OOjjƒƒžž¶¶ÏÏææÿÿ//FF]]tt‹‹¡¡¸¸ÌÌááöö    44HH\\oo‚‚••©©»»ÌÌÝÝïï!!11AAOO__nn}}‹‹šš¨¨´´ÁÁÎÎÚÚååòòþþ  **44>>EEOOXX``iiqqyy††ŽŽ““šš  ¥¥««¯¯³³¸¸½½¿¿ÂÂÄÄÈÈÊÊÌÌÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÐÐÏÏÏÏÍÍËËÉÉÆÆÃÃÀÀ¾¾ºº´´±±­­¨¨¡¡œœ••‹‹ƒƒ}}ttmmdd^^TTLLBB;;00%%üüïïããØØÌÌ¿¿²²¥¥˜˜ŠŠ}}nn__OO@@11!!ïïßßÎν½««šš††ss``NN;;&&ÿÿêêÔÔÀÀ««••iiRR==$$öößßÈȯ¯••}}ccKK22ÿÿããË˯¯““yy]]BB%%  ííÏϳ³––yy[[>>ááÄÄ¥¥……eeFF&&ææÆÆ¥¥„„ccBB  ÿÿÜÜ»»™™uuSS//  é鯯¢¢~~ZZ55ììÈÈ¢¢}}XX22  ååÀÀššrrMM%%ÿÿØØ¯¯ˆˆ__::ééÁÁ™™ooHHõõÌÌ¢¢xxOO&&üüÑѧ§}}TT((þ þ Ô Ô § § } } Q Q ' ' ú ú Ï Ï ¤ ¤ w w M M õ õ È È œ œ o o D D   é é ¾ ¾ d d 6 6   Ý Ý ¯ ¯ € € U U ' ' øøÌÌooAAææ··ˆˆ[[,,ÿÿÐТ¢ssDDçç¸¸ŠŠ[[,,þþÏÏŸŸrrBBããµµ……WW''ùùÉÉ™™kk;;  ÜÜ­­}}OOññÁÁ‘‘cc33×ÿ×ÿ¨ÿ¨ÿyÿyÿIÿIÿÿÿìþìþ¼þ¼þþþ^þ^þ/þ/þÿýÿýÑýÑý¡ý¡ýsýsýCýCýýýçüçü·ü·ü‰ü‰ü[ü[ü+ü+üýûýûÎûÎû¡û¡ûrûrûDûDûûûèúèú¹ú¹úŠúŠú]ú]ú.ú.úúúÔùÔù¥ù¥ùyùyùJùJùùùðøðøÁøÁø•ø•øhøhø:ø:øøøâ÷â÷¸÷¸÷Œ÷Œ÷a÷a÷6÷6÷ ÷ ÷àöàö´ö´ö‰ö‰ö^ö^ö2ö2öööÜõÜõ±õ±õ‡õ‡õZõZõ0õ0õõõÚôÚô°ô°ô†ô†ôZôZô0ô0ôôôÛóÛó±ó±óˆóˆó^ó^ó3ó3ó ó óáòáò·ò·òòòfòfò;ò;òòòêñêñÁñÁñ™ñ™ñqñqñIñIñ!ñ!ñùðùðÑðÑð©ð©ð‚ð‚ð[ð[ð3ð3ðððæïæïÀïÀïšïšïsïsïNïNï&ï&ïïïÝîÝî¶î¶î‘î‘îmîmîFîFî#î#îÿíÿíÛíÛíµíµí‘í‘íoíoíKíKí&í&íííáìáì¾ì¾ìœìœìzìzìVìVì4ì4ìììñëñëÐëÐë®ë®ëŽëŽëmëmëLëLë,ë,ë ë ëìêìêÌêÌê¬ê¬êêênênêOêOê/ê/êêêòéòéÔéÔé¶é¶éšéšé|é|é_é_éAéAé%é%éééìèìèÐèÐè²è²è˜è˜è}è}èaèaèFèFè-è-èèè÷ç÷çÞçÞçÃçÃçªçªç‘ç‘çwçwç^ç^çEçEç.ç.çççÿæÿæåæåæÏæÏæ·æ·æ¡æ¡æ‹æ‹æsæsæ^æ^æGæGæ2æ2æææææòåòåÞåÞåÈåÈå´å´å¡å¡ååå{å{åfåfåTåTåAåAå1å1ååå å åûäûäèäèä×ä×äÆäÆä¶ä¶ä¥ä¥ä•ä•ä†ä†ävävägägäWäWäJäJä<ä<ä.ä.ä!ä!äääää÷ã÷ãêãêãÞãÞãÑãÑãÄãÄã¸ã¸ã¯ã¯ã£ã£ã˜ã˜ãŽãŽã‚ã‚ãzãzãpãpãeãeã\ã\ãRãRãKãKãAãAã:ã:ã2ã2ã+ã+ã"ã"ãããããããããããüâüâöâöâñâñâìâìâçâçâââââàâàâÛâÛâ×â×âÓâÓâÑâÑâÎâÎâÌâÌâÊâÊâÆâÆâÅâÅâÃâÃâÂâÂâÁâÁâÁâÁâÁâÁâÁâÁâÁâÁâÁâÁâÂâÂâÃâÃâÅâÅâÇâÇâÈâÈâËâËâÎâÎâÐâÐâÒâÒâÖâÖâÚâÚâÝâÝâáâáâåâåâêâêâïâïâôâôâúâúâÿâÿâãã ã ããããã ã ã'ã'ã0ã0ã7ã7ã>ã>ãFãFãPãPãWãWãaãaãkãkãtãtã~ã~ã‡ã‡ã’ã’ããã¨ã¨ã³ã³ã¿ã¿ãÊãÊãÕãÕãâãâãðãðãüãüãääää$ä$ä1ä1ä?ä?äNäNä\ä\äläläzäzäŠäŠäšäšä¨ä¨ä·ä·äÈäÈäØäØäêäêäûäûä å ååå0å0åAåAåRåRådådåwåwåŒåŒåžåžå±å±åÄåÄåØåØåíåíåææææ(æ(æ<æ<æQæQæeæeæ|æ|æ‘æ‘æ¦æ¦æ¼æ¼æÒæÒæèæèæçççç.ç.çDçDç]ç]çtçtççç¤ç¤ç½ç½çÕçÕçïçïçèè!è!è;è;èTèTèoèoèˆèˆè£è£è¿è¿èÚèÚèôèôèéé,é,éFéFébébéééœéœé·é·éÔéÔéñéñéêê,ê,êHêHêfêfê„ê„ê¢ê¢êÁêÁêàêàêþêþêëë;ë;ë[ë[ëzëzëšëšë¸ë¸ëØëØëøëøëìì8ì8ìXìXìzìzì›ì›ì»ì»ìÜìÜìþìþì í í@í@íbíbí„í„í¥í¥íÇíÇíëíëíîî/î/îRîRîuîuî˜î˜î¼î¼îßîßîïï%ï%ïJïJïnïnï‘ï‘ïµïµïÚïÚïÿïÿï"ð"ðHðHðlðlð‘ð‘ð¶ð¶ðÛðÛðññ&ñ&ñKñKñqñqñ˜ñ˜ñ¼ñ¼ñâñâñ ò ò/ò/òTòTò{ò{ò¡ò¡òÉòÉòðòðòóó<ó<ócócó‹ó‹ó±ó±óÙóÙóôô(ô(ôPôPôxôxôŸôŸôÆôÆôïôïôõõ>õ>õgõgõõõ·õ·õßõßõöö/ö/öXöXööö©ö©öÑöÑöúöúö"÷"÷K÷K÷t÷t÷ž÷ž÷Ç÷Ç÷ð÷ð÷øøAøAølølø”ø”ø½ø½øæøæøùù9ù9ùbùbùùùµùµùàùàù ú ú2ú2ú\ú\ú…ú…ú®ú®úÙúÙúûû,û,ûUûUû€û€û©û©ûÔûÔûýûýû'ü'üQüQü{ü{ü£ü£üÍüÍü÷ü÷ü!ý!ýKýKýuýuýŸýŸýÉýÉýóýóýþþFþFþpþpþ™þ™þÃþÃþíþíþÿÿ@ÿ@ÿjÿjÿ“ÿ“ÿ½ÿ½ÿæÿæÿ 77aaŠŠ³³ÝÝ//YYªªÔÔüü''OOyy¡¡ÉÉóóCCmm••½½åå66__††®®××þþ&&NNssœœÃÃëë::``‡‡¯¯ÖÖûû##JJoo––»»ãã..TTyyŸŸÅÅêê  4 4 Y Y ~ ~ ¢ ¢ Ç Ç ì ì   5 5 Y Y } }     Å Å è è / / R R u u ˜ ˜ º º ß ß ÿ ÿ " " E E g g ˆ ˆ ª ª Í Í î î   0 0 Q Q q q ’ ’ ´ ´ Õ Õ ô ô 55UUtt’’²²ÑÑïï..MMjjˆˆ§§ÅÅááÿÿ66RRnnŠŠ¤¤ÀÀÜÜõõ--HH``||––°°ËËããþþ00KKbb{{””­­ÅÅÝÝôô  ##;;QQii••­­ÁÁÖÖíí--AAUUjj~~’’¥¥ººÎÎßßññ))<<NN^^oo€€  ²²ÂÂÒÒààðð--;;JJUUccpp‹‹˜˜¤¤°°½½ÉÉÒÒßßêêóóÿÿ  &&00::AAKKRRZZaajjqqxx……ŽŽ’’™™ŸŸ¤¤ªª¯¯³³¹¹½½ÀÀÃÃÈÈËËÎÎÏÏÒÒÕÕÖÖÙÙÛÛÜÜÞÞßßßßßßßßßßßßßßÞÞÝÝÜÜÚÚÙÙÕÕÔÔÑÑÏÏÍÍÊÊÅÅ¿¿ººµµ°°¬¬¨¨¡¡––‹‹ƒƒ~~uuoohh__XXOOHH??66..$$ýýññèèÜÜÐÐÆÆ»»¯¯££––‹‹~~qqccUUJJ<<..óóããÕÕÆÆ¶¶¦¦––††uuddSSBB11üüêêÖÖÅŲ²ŸŸyyddRR>>))ììÖÖ­­––llUU??))üüããÏ϶¶ŸŸ††ooXX??&&ôôÜÜÃêªvv]]CC**ôôÛÛÀÀ¤¤‹‹ooSS99ååÈÈ­­ttWW::ÿÿââÆÆ¨¨‰‰mmOO11õ õ × × · · ˜ ˜ y y \ \ = =   ý ý ß ß ¿ ¿ Ÿ Ÿ   _ _ ? ?   ÿ ÿ ß ß ¿ ¿ ž ž } } ] ] < <   ù ù Ø Ø · · – – t t U U 5 5   ò ò Ô Ô ± ± o o O O - - ééÇÇ¥¥‚‚``>>øø×׳³nnKK''à྾ššvvSS//  èèÄÄ  {{XX44ììÈÈ££[[77ïïËË¥¥]]99ññË˧§]]99ððËË¥¥]]88ïïÊÊ¥¥€€\\77ðÿðÿËÿËÿ§ÿ§ÿ‚ÿ‚ÿ^ÿ^ÿ9ÿ9ÿÿÿðþðþÌþÌþ§þ§þƒþƒþ^þ^þ:þ:þþþñýñýÍýÍý§ý§ý…ý…ý_ý_ý;ý;ýýýóüóüÏüÏü«ü«ü‡ü‡ücücü?ü?üüüøûøûÔûÔû°û°ûŒûŒûiûiûEûEû!û!ûþúþúÚúÚú¶ú¶ú”ú”úqúqúMúMú*ú*úúúåùåùÁùÁùžùžù}ù}ùYùYù6ù6ùùùñøñøÐøÐø­ø­øŒøŒøiøiøFøFø%ø%øøøá÷á÷À÷À÷œ÷œ÷|÷|÷Z÷Z÷9÷9÷÷÷øöøöÖöÖö´ö´ö“ö“ösösöRöRö1ö1öööñõñõÑõÑõ±õ±õ‘õ‘õqõqõQõQõ1õ1õõõòôòôÒôÒô²ô²ô”ô”ôvôvôVôVô7ô7ôôôúóúóÛóÛó¼ó¼óŸóŸóóócócóFóFó(ó(ó ó óìòìòÐòÐò±ò±ò–ò–òyòyò[ò[ò?ò?ò!ò!òòòéñéñÎñÎñ±ñ±ñ—ñ—ñzñzñ_ñ_ñCñCñ(ñ(ñññòðòðØðØð¾ð¾ð¢ð¢ð‰ð‰ðoðoðTðTð:ð:ð!ð!ð ð ðïïïïÕïÕï¼ï¼ï¢ï¢ï‹ï‹ïrïrïZïZïAïAï(ï(ïïïúîúîáîáîËîËî²î²îžîžî…î…îpîpîWîWîAîAî,î,îîîîîëíëíÔíÔí¿í¿í«í«í–í–ííímímíWíWíCíCí/í/íííííôìôìáìáìÎìÎì»ì»ì§ì§ì–ì–ìƒìƒìqìqì`ì`ìNìNì<ì<ì+ì+ììììì÷ë÷ëæëæëÖëÖëÅëÅëµëµë§ë§ë–ë–ë‡ë‡ëwëwëhëhëZëZëLëLë=ë=ë/ë/ë!ë!ëëëëë÷ê÷êëêëêÝêÝêÑêÑêÂêÂê¶ê¶ê«ê«ê ê ê“ê“ê‡ê‡ê|ê|êqêqêdêdê[ê[êPêPêDêDê;ê;ê1ê1ê'ê'êêêêê ê êêêøéøéñéñéçéçéàéàéØéØéÐéÐéÈéÈéÁéÁé»é»é²é²é­é­é§é§é¡é¡éšéšé”é”éééˆéˆé„é„ééé{é{éuéuéqéqéméméhéhédédéaéaé^é^é[é[éXéXéUéUéSéSéQéQéOéOéMéMéLéLéKéKéHéHéFéFéFéFéEéEéEéEéFéFéEéEéFéFéFéFéGéGéGéGéJéJéJéJéLéLéNéNéPéPéQéQéSéSéVéVéXéXé\é\é_é_ébébéeéeéjéjénénéqéqéuéué{é{é€é€é„é„éŠéŠééé”é”é›é›é¡é¡é¦é¦é­é­é²é²éºéºéÁéÁéÇéÇéÏéÏéÕéÕéÞéÞéæéæéïéïé÷é÷éêêêêêêêê#ê#ê-ê-ê5ê5êAêAêKêKêTêTê`ê`êkêkêtêtêêêêê—ê—ê£ê£ê®ê®ê»ê»êÆêÆêÓêÓêàêàêíêíêúêúêëëëë"ë"ë/ë/ë=ë=ëKëKëZëZëhëhëvëvë…ë…ë”ë”ë£ë£ë²ë²ëÂëÂëÑëÑëáëáëòëòëìììì$ì$ì3ì3ìDìDìUìUìgìgìxìxì‹ì‹ììì¯ì¯ìÀìÀìÒìÒìäìäìøìøì í ííí1í1íCíCíVíVíkíkííí’í’í¦í¦í»í»íÏíÏíãíãíøíøíîî"î"î7î7îMîMîaîaîxîxîŽîŽî¢î¢î¸î¸îÐîÐîåîåîýîýîïï(ï(ïAïAïWïWïoïoï†ï†ïžïžï´ï´ïÍïÍïäïäïýïýïðð,ð,ðFðFð^ð^ðwðwððð¨ð¨ðÁðÁðÚðÚðóðóðññ&ñ&ñ@ñ@ñYñYñsñsñŽñŽñ¨ñ¨ñÁñÁñÜñÜñ÷ñ÷ñòò+ò+òGòGòaòaò|ò|ò˜ò˜ò²ò²òÎòÎòéòéòóó ó ó;ó;óXóXósósóóó«ó«óÈóÈóãóãóôôôô9ô9ôVôVôrôrôôô¬ô¬ôÉôÉôçôçôõõ!õ!õ>õ>õ[õ[õyõyõ–õ–õ³õ³õÑõÑõðõðõöö*ö*öIöIögögö„ö„ö¢ö¢öÁöÁöàöàöþöþö÷÷:÷:÷Y÷Y÷y÷y÷–÷–÷´÷´÷Ó÷Ó÷ó÷ó÷øø0ø0øPøPønønøøø¬ø¬øÌøÌøêøêø ù ù)ù)ùIùIùhùhùˆùˆù¥ù¥ùÅùÅùåùåùúú$ú$úDúDúdúdú„ú„ú¢ú¢úÂúÂúáúáúûû!û!ûAûAûaûaûûû û ûÀûÀûàûàûüüüü?ü?ü_ü_üüüŸüŸü¿ü¿üßüßüÿüÿüýý?ý?ý_ý_ýýýýý½ý½ýÝýÝýýýýýþþ=þ=þ^þ^þ~þ~þþþ½þ½þÝþÝþýþýþÿÿ<ÿ<ÿ\ÿ\ÿ|ÿ|ÿ›ÿ›ÿºÿºÿÚÿÚÿúÿúÿ77WWvv••µµÔÔôô22QQqq®®ÎÎíí  ++IIii‡‡¥¥ÅÅãã!!??]]{{™™··××õõ00OOllŠŠ§§ÄÄããÿÿ;;WWtt’’¯¯ËËêê""??[[ww““¯¯ÌÌèè;;WWss¨¨ÃÃÜÜöö**DD__ww‘‘ªªÅÅßß÷÷  * * E E ^ ^ w w ¨ ¨ Á Á Ú Ú ò ò % % = = V V m m … … µ µ Í Í å å ü ü   * * A A X X o o † † œ œ ² ² È È ß ß õ õ 7 7 M M a a w w Š Š     ¶ ¶ Ê Ê ß ß ò ò     / / B B W W h h } } ¤ ¤ ¶ ¶ È È Ü Ü î î ÿ ÿ %%77GGXXii||ŒŒžž®®¿¿ÏÏßßïïÿÿ..==LLZZhhww††••¡¡°°¾¾ÌÌÙÙææòòÿÿ  %%11>>JJUU``llvv––¡¡­­µµÀÀÊÊÓÓÝÝääîîööÿÿ  ((//88??EEMMSSZZ__eekkppvv||€€††‹‹””™™  ¤¤¨¨¬¬¯¯±±´´¶¶ºº¼¼¾¾ÀÀÁÁÃÃÄÄÅÅÆÆÈÈÉÉÉÉÊÊÉÉÉÉÉÉÉÉÈÈÆÆÅÅÄÄÃÃÀÀ¿¿¿¿¼¼ºº¶¶´´±±¯¯¬¬¨¨¤¤  šš””ŒŒ††}}xxqqmmff``[[TTOOFF@@::11**""  ûûòòééààØØÏÏÅż¼±±¨¨žž’’‰‰rrii^^RRHH<<00##  ÿÿòòææÚÚÎο¿²²¥¥——‰‰||nn__QQDD55&&÷÷èèÚÚÊʺºªªššŠŠyyhhXXHH77&&ñ ñ à à Ï Ï ¾ ¾ ª ª ˜ ˜ ‡ ‡ t t b b O O = = ( (     ï ï Þ Þ É É ¶ ¶ ¡ ¡ Ž Ž y y f f Q Q > > ( (   ÿ ÿ ê ê × × À À ¬ ¬ – – € € l l W W @ @ , ,   ÿ ÿ è è Ò Ò ½ ½ ¦ ¦ x x b b L L 5 5     ï ï Ø Ø À À © © ‘ ‘ y y d d J J 2 2     ììÒÒºº¡¡‰‰ppXX??''ôôÜÜÃë«ww``GG//þþææÌ̳³››€€hhOO66èèÏÏ´´››ggLL22üüããÈÈ®®““ww__CC((óó××½½¡¡‡‡mmQQ55ÿÿååÉÉ­­““ww]]AA%%  ïïÓÓ¸¸œœ€€ffJJ//øøÝÝÁÁ¦¦ŠŠooTT88èÿèÿÍÿÍÿ±ÿ±ÿ•ÿ•ÿ{ÿ{ÿ_ÿ_ÿDÿDÿ(ÿ(ÿ ÿ ÿòþòþ×þ×þ»þ»þ þ þ„þ„þjþjþOþOþ3þ3þþþýýýýáýáýÇýÇý«ý«ý‘ý‘ýuýuý[ý[ý?ý?ý%ý%ý ý ýïüïüÕüÕü¹ü¹üŸüŸü…ü…üküküOüOü5ü5üüüüüåûåûÌûÌû±û±û–û–û}û}ûbûbûIûIû-û-ûûûúúúúáúáúÆúÆú­ú­ú’ú’úyúyú`ú`úFúFú-ú-úúúúùúùáùáùÈùÈù®ù®ù•ù•ù}ù}ùdùdùJùJù1ù1ùùùùùéøéøÐøÐø¶ø¶øžøžø†ø†ønønøUøUø=ø=ø%ø%øøø÷÷÷÷ß÷ß÷Ç÷Ç÷¯÷¯÷˜÷˜÷÷÷i÷i÷Q÷Q÷:÷:÷#÷#÷÷÷÷ö÷öàöàöÉöÉö±ö±ö›ö›ö†ö†öoöoöYöYöBöBö,ö,öööööëõëõÖõÖõÀõÀõªõªõ–õ–õõõkõkõWõWõAõAõ,õ,õõõõõðôðôÚôÚôÇôÇô²ô²ôžôžôŠôŠôxôxôcôcôPôPô<ô<ô)ô)ôôôôôðóðóÞóÞóÊóÊó¸ó¸ó¦ó¦ó“ó“óóóoóoó\ó\óJóJó9ó9ó'ó'óóóóóóòóòáòáòÑòÑòÁòÁò¯ò¯òŸòŸòòòòòoòoò^ò^òOòOò?ò?ò/ò/òòòòòòòññññâñâñÓñÓñÄñÄñ¶ñ¶ñ¨ñ¨ñšñšñ‹ñ‹ñ~ñ~ñpñpñañañSñSñFñFñ9ñ9ñ+ñ+ñññññññùðùðìðìðàðàðÓðÓðÈðÈð»ð»ð±ð±ð¤ð¤ð™ð™ððð‚ð‚ðxðxðnðnðbðbðXðXðNðNðBðBð9ð9ð/ð/ð$ð$ððððð ð ðÿïÿïöïöïîïîïãïãïÛïÛïÓïÓïËïËïÂïÂï»ï»ï²ï²ï¬ï¬ï£ï£ïïï•ï•ïïï‡ï‡ïïïzïzïrïrïnïnïfïfïaïaï\ï\ïUïUïPïPïJïJïDïDï@ï@ï;ï;ï5ï5ï1ï1ï-ï-ï(ï(ï$ï$ï!ï!ïïïïïïïïïïï ï ï ï ïïïïïïïïïýîýîüîüîúîúî÷î÷îöîöîôîôîóîóîóîóîñîñîñîñîñîñîñîñîðîðîñîñîðîðîðîðîñîñîñîñîñîñîòîòîóîóîôîôîõîõî÷î÷îúîúîûîûîþîþîïïïïïïïïïï ï ïïïïïïïïïïï ï ï#ï#ï'ï'ï,ï,ï1ï1ï4ï4ï8ï8ï>ï>ïCïCïGïGïMïMïSïSïXïXï_ï_ïdïdïkïkïqïqïwïwï~ï~ïƒïƒï‹ï‹ï‘ï‘ï˜ï˜ï¡ï¡ï¦ï¦ï®ï®ïµïµï¾ï¾ïÄïÄïÌïÌïÔïÔïÝïÝïäïäïîïîïõïõïþïþïðððððð!ð!ð*ð*ð4ð4ð>ð>ðIðIðQðQð[ð[ðgðgðqðqð{ð{ð‡ð‡ð‘ð‘ð›ð›ð¦ð¦ð±ð±ð¼ð¼ðÈðÈðÔðÔðàðàðëðëðùðùðññññññ)ñ)ñ4ñ4ñAñAñPñPñ[ñ[ñiñiñwñwñƒñƒñ‘ñ‘ñžñžñ¬ñ¬ñ¹ñ¹ñÈñÈñ×ñ×ñäñäñòñòñòòòòòò,ò,ò<ò<òJòJòZòZòiòiòyòyò‰ò‰ò™ò™ò¨ò¨ò¸ò¸òÇòÇòØòØòèòèòøòøò ó óóó)ó)ó9ó9óJóJó[ó[ólóló~ó~óóóŸóŸó±ó±óÂóÂóÓóÓóæóæóøóøó ô ôôô.ô.ô@ô@ôQôQôdôdôwôwô‰ô‰ôšôšô®ô®ôÁôÁôÓôÓôçôçôùôùô õ õ õ õ2õ2õGõGõYõYõnõnõõõ”õ”õ¨õ¨õ»õ»õÐõÐõãõãõøõøõ ö ö ö ö4ö4öIöIö^ö^öqöqö‡ö‡öšöšö°ö°öÄöÄöÙöÙöïöïö÷÷÷÷,÷,÷B÷B÷X÷X÷n÷n÷‚÷‚÷—÷—÷¬÷¬÷Â÷Â÷Ø÷Ø÷î÷î÷øøøø.ø.øEøEøZøZøqøqø†ø†øœøœø²ø²øÉøÉøÞøÞøõøõø ù ù!ù!ù8ù8ùNùNùeùeù|ù|ù‘ù‘ù¨ù¨ù¾ù¾ùÕùÕùìùìùúúúú0ú0úFúFú]ú]úuúuúŠúŠú¡ú¡ú¹ú¹úÐúÐúæúæúýúýúûû,û,ûBûBûYûYûqûqû‰û‰ûžûžû¶û¶ûÍûÍûåûåûýûýûüü+ü+üAüAüYüYüqüqü‡ü‡üŸüŸüµüµüÍüÍüåüåüýüýüýý+ý+ýAýAýYýYýqýqý‡ý‡ýŸýŸý·ý·ýÍýÍýåýåýýýýýþþ+þ+þCþCþZþZþqþqþˆþˆþŸþŸþ·þ·þÎþÎþæþæþýþýþÿÿ+ÿ+ÿBÿBÿYÿYÿpÿpÿ‡ÿ‡ÿžÿžÿµÿµÿÌÿÌÿäÿäÿûÿûÿ&&==TTkk˜˜¯¯ÆÆÝÝôô    77NNdd{{‘‘§§¾¾ÔÔëë--CCYYoo……››±±ÇÇÝÝóó33II]]ss‡‡³³ÇÇÝÝññ00FFZZooƒƒ——««ÀÀÔÔêêüü$$88LL``ss‡‡››¯¯ÂÂÖÖèèûû""44GG[[nn’’¤¤··ÈÈÛÛîîÿÿ##44GGWWhhzz‹‹››®®¿¿ÏÏßßïï!!11BBRRbbqq‘‘¡¡°°¿¿ÏÏßßííüü   ( ( 7 7 F F T T b b o o ~ ~ Œ Œ ™ ™ § § µ µ Á Á Ï Ï Ü Ü é é ö ö       ( ( 5 5 A A N N Y Y f f p p | | ‡ ‡ ” ” Ÿ Ÿ ª ª µ µ ¿ ¿ Ê Ê Ö Ö ß ß é é õ õ ÿ ÿ       ' ' / / 8 8 B B L L V V ^ ^ g g o o w w   ‡ ‡ ˜ ˜ Ÿ Ÿ ¨ ¨ ¯ ¯ · · ¿ ¿ Ç Ç Í Í Ô Ô Ú Ú à à ç ç ì ì ò ò ø ø ÿ ÿ           & & * * / / 4 4 8 8 > > A A F F J J O O R R W W Y Y ^ ^ ` ` e e f f i i m m o o r r t t w w x x | | } }   € € ‚ ‚ … … † † ‡ ‡ ‡ ‡ ˆ ˆ ‰ ‰ ‰ ‰ Š Š Š Š Œ Œ Š Š Œ Œ Œ Œ Œ Œ Š Š ‰ ‰ ‰ ‰ ˆ ˆ ˆ ˆ ‡ ‡ † † … … „ „   ~ ~ | | z z x x u u r r p p n n l l g g f f b b _ _ ] ] W W U U P P M M H H D D ? ? < < 7 7 2 2 - - ( ( $ $             ý ý ö ö ï ï é é ä ä Ý Ý Ö Ö Ï Ï È È Á Á º º ² ² ¬ ¬ ¤ ¤ ” ” … … } } u u m m d d \ \ R R J J @ @ 7 7 / / & &       ÿ ÿ ö ö ì ì â â × × Î Î Ä Ä ¹ ¹ ¯ ¯ ¤ ¤ ˜ ˜ Ž Ž „ „ x x m m b b W W L L ? ? 5 5 ' '       ÷ ÷ ê ê ß ß Ô Ô Ç Ç º º ­ ­     ” ” ‡ ‡ x x l l _ _ Q Q E E 7 7 ( (   ÿÿððääÕÕÇǸ¸©©œœ~~ooaaRRDD44%%ööçç××ÇǸ¸¨¨——ˆˆxxjjXXHH77''÷÷ççÖÖÄij³££’’€€pp__NN<<++÷÷ææÔÔÃð°ŸŸŽŽ{{kkWWFF33""þþëëÚÚÇÇ´´££||kkXXFF33  ûûééÕÕÃ﯉‰wweeQQ??++óóßßË˹¹¥¥‘‘kkYYEE11  ÷÷ääÐм¼©©••‚‚oo[[HH44    úúææÓÓ¿¿««˜˜„„qq^^JJ66##þÿþÿêÿêÿ×ÿ×ÿÃÿÃÿ¯ÿ¯ÿœÿœÿˆÿˆÿvÿvÿbÿbÿNÿNÿ;ÿ;ÿ'ÿ'ÿÿÿÿÿíþíþÚþÚþÆþÆþ³þ³þŸþŸþŒþŒþyþyþfþfþSþSþ?þ?þ,þ,þþþþþóýóýßýßýËýËý¹ý¹ý¥ý¥ý“ý“ýýýmýmýYýYýGýGý3ý3ý!ý!ý ý ýûüûüéüéü×ü×üÃüÃü±ü±üüü‹ü‹üyüyügügüSüSüAüAü/ü/üüü ü üùûùûæûæûÔûÔûÁûÁû°û°ûûûŒûŒûzûzûiûiûUûUûDûDû2û2û!û!ûûûýúýúíúíúÚúÚúÉúÉú¸ú¸ú¥ú¥ú•ú•ú…ú…úrúrúaúaúQúQú@ú@ú.ú.úúú ú úýùýùìùìùÚùÚùÉùÉù¹ù¹ù©ù©ù™ù™ù‰ù‰ùyùyùhùhùXùXùHùHù8ù8ù(ù(ùùù ù ùùøùøéøéøÙøÙøÉøÉøºøºøªøªøœøœøøø}ø}ønønø`ø`øQøQøAøAø2ø2ø$ø$øøøøøù÷ù÷ê÷ê÷Û÷Û÷Î÷Î÷À÷À÷±÷±÷¢÷¢÷–÷–÷‰÷‰÷z÷z÷n÷n÷a÷a÷S÷S÷G÷G÷9÷9÷.÷.÷!÷!÷÷÷÷÷ûöûöïöïöâöâö×ö×öÉöÉö¾ö¾ö±ö±ö¦ö¦ö™ö™öŽöŽö‚ö‚övövöjöjö`ö`öSöSöHöHö<ö<ö1ö1ö&ö&öööööööúõúõðõðõäõäõÚõÚõÑõÑõÄõÄõ»õ»õ±õ±õ§õ§õœõœõ“õ“õ‰õ‰õ€õ€õwõwõlõlõbõbõYõYõPõPõGõGõ>õ>õ4õ4õ,õ,õ#õ#õõõõõ õ õõõùôùôñôñôéôéôáôáôÙôÙôÑôÑôÉôÉôÂôÂôºôºô³ô³ô¬ô¬ô¦ô¦ôŸôŸô˜ô˜ô‘ô‘ôŠôŠôƒôƒô~ô~ôxôxôqôqôjôjôdôdô_ô_ôYôYôRôRôLôLôHôHôBôBô>ô>ô8ô8ô2ô2ô.ô.ô)ô)ô#ô#ôôôôôôôôôôô ô ôôôôôÿóÿóúóúóùóùóóóóóñóñóîóîóêóêóèóèóäóäóáóáóßóßóÛóÛóÚóÚóØóØóÖóÖóÓóÓóÑóÑóÐóÐóÎóÎóËóËóÉóÉóÉóÉóÈóÈóÇóÇóÆóÆóÃóÃóÂóÂóÂóÂóÁóÁóÁóÁóÀóÀóÁóÁóÁóÁóÀóÀóÀóÀóÀóÀóÀóÀóÀóÀóÁóÁóÁóÁóÁóÁóÂóÂóÃóÃóÄóÄóÆóÆóÇóÇóÈóÈóÉóÉóÊóÊóÌóÌóÎóÎóÑóÑóÑóÑóÓóÓóÖóÖóÙóÙóÚóÚóÜóÜóàóàóâóâóäóäóéóéóëóëóïóïóñóñóôóôóøóøóûóûóÿóÿóôôôô ô ôôôôôôôôôôô#ô#ô(ô(ô.ô.ô1ô1ô8ô8ô<ô<ôAôAôGôGôKôKôQôQôWôWô\ô\ôaôaôhôhôoôoôtôtôzôzôôôˆôˆôŽôŽô“ô“ô™ô™ô¡ô¡ô§ô§ô®ô®ô¶ô¶ô¼ô¼ôÃôÃôËôËôÒôÒôÙôÙôáôáôéôéôñôñôùôùôõõ õ õõõõõ!õ!õ)õ)õ1õ1õ:õ:õBõBõKõKõTõTõ_õ_õgõgõqõqõyõyõ‚õ‚õ‹õ‹õ”õ”õžõžõ¨õ¨õ±õ±õºõºõÄõÄõÏõÏõÙõÙõãõãõîõîõøõøõöö ö ööö!ö!ö+ö+ö7ö7öAöAöKöKöXöXöböbönönöyöyöƒöƒööö™ö™ö¦ö¦ö±ö±ö¼ö¼öÉöÉöÓöÓöàöàöìöìöùöùö÷÷÷÷÷÷(÷(÷4÷4÷A÷A÷N÷N÷Y÷Y÷g÷g÷r÷r÷÷÷Œ÷Œ÷™÷™÷¦÷¦÷²÷²÷À÷À÷Ì÷Ì÷Ú÷Ú÷è÷è÷ô÷ô÷øøøøøø)ø)ø6ø6øEøEøRøRøaøaønønø}ø}ø‰ø‰ø–ø–ø¥ø¥ø²ø²øÁøÁøÐøÐøÝøÝøìøìøùøùø ù ùùù%ù%ù4ù4ùAùAùQùQù^ù^ùmùmù}ù}ùŠùŠù™ù™ù¨ù¨ù¶ù¶ùÅùÅùÕùÕùäùäùòùòùúúúú ú ú.ú.ú=ú=úMúMú]ú]úlúlúzúzúŠúŠú™ú™ú©ú©ú¸ú¸úÈúÈúØúØúæúæúöúöúûûûû%û%û4û4ûDûDûTûTûdûdûrûrû‚û‚û‘û‘û¡û¡û±û±ûÁûÁûÑûÑûáûáûñûñûüüüü!ü!ü1ü1üAüAüQüQüaüaüqüqüüüüü¡ü¡ü±ü±üÁüÁüÑüÑüáüáüñüñüýýýý!ý!ý1ý1ýAýAýQýQýaýaýqýqýýý‘ý‘ý¡ý¡ý±ý±ýÁýÁýÑýÑýãýãýóýóýþþþþ#þ#þ3þ3þCþCþSþSþcþcþtþtþƒþƒþ“þ“þ£þ£þ³þ³þÄþÄþÔþÔþäþäþôþôþÿÿÿÿ#ÿ#ÿ3ÿ3ÿCÿCÿSÿSÿcÿcÿsÿsÿ‚ÿ‚ÿ’ÿ’ÿ¢ÿ¢ÿ²ÿ²ÿÂÿÂÿÒÿÒÿâÿâÿòÿòÿ..==MM]]ll||‹‹ššªª¹¹ÉÉØØèè÷÷$$33CCRRaapp~~œœ««ººÉÉØØççõõ!!//??MM[[iiyy……““££±±¿¿ÍÍÛÛéé÷÷--;;GGSSaammyy‡‡““ŸŸ­­¹¹ÅÅÓÓßßëë÷÷**77CCOO[[ggss‹‹——££¯¯ººÆÆÒÒÜÜèèóóÿÿ    ++77BBLLWWccnnww‚‚ŒŒ——¢¢««··ÀÀËËÔÔßßèèóóûû""++44>>GGOOXXbbkkss{{ƒƒ‹‹””žž¤¤®®··¾¾ÆÆÎÎÔÔÜÜääëëóóúú$$++2288??FFKKSSXX__ddkkoovv{{€€††‹‹––››  ¦¦««¯¯³³¸¸¼¼ÂÂÆÆÊÊÎÎÒÒÖÖÚÚÞÞââææèèëëïïòòôô÷÷ûûþþ    !!""$$%%&&''''(())))********,,,,********))))((''''''&&%%$$!!      ÿÿüüúú÷÷óóððïïëëççããààÜÜÚÚÖÖÒÒÎÎÊÊÆÆÀÀ¼¼¸¸³³¯¯««¦¦  ››——’’ŒŒ‡‡ƒƒ||wwrrnnggbb\\WWPPKKCC>>8833++$$  üüööïïèèààÚÚÓÓËËÃû»³³¬¬¤¤œœ””ŒŒ„„||ttlldd\\SSKKCC::22((ûûóóêêââ××ÏÏÆÆ»»³³¨¨ŸŸ––‹‹‚‚wwoodd[[PPGG;;22''þþóóêêßßÓÓÊÊ¿¿³³¨¨žž““‡‡||ssgg\\RRFF;;//##  ÷÷ëëßßÓÓÇÇ»»¯¯¥¥™™uuii]]QQEE99--!!  ýýññåå××ËË¿¿³³§§™™uuii[[OOCC55))÷÷êêÝÝÐÐÃ÷·ªªƒƒwwjj]]PPCC66))ööééÜÜÏϵµ¨¨šš€€ttggZZMM@@33&& ôÿôÿçÿçÿÚÿÚÿÍÿÍÿÀÿÀÿ³ÿ³ÿ¦ÿ¦ÿ™ÿ™ÿŒÿŒÿ€ÿ€ÿrÿrÿeÿeÿXÿXÿKÿKÿ>ÿ>ÿ1ÿ1ÿ$ÿ$ÿÿÿ ÿ ÿþþþþñþñþäþäþØþØþËþËþ¾þ¾þ±þ±þ¤þ¤þ—þ—þŠþŠþ~þ~þrþrþeþeþXþXþKþKþ>þ>þ2þ2þ%þ%þþþ þ þÿýÿýóýóýçýçýÙýÙýÍýÍýÁýÁýµýµý§ý§ý›ý›ýýýƒýƒýwýwýkýký_ý_ýQýQýEýEý9ý9ý-ý-ý!ý!ýýý ý ýýüýüñüñüåüåüÙüÙüÍüÍüÁüÁüµüµü©ü©üüü‘ü‘ü‡ü‡ü{ü{üoüoüeüeüYüYüMüMüAüAü5ü5ü)ü)üüüüüüüýûýûòûòûèûèûÜûÜûÑûÑûÅûÅûºûºû°û°û¥û¥û™û™ûŽûŽû…û…ûyûyûnûnûeûeûYûYûNûNûEûEû9û9û0û0û%û%ûûûûû û ûûûõúõúìúìúâúâúÙúÙúÎúÎúÅúÅú¼ú¼ú±ú±ú©ú©úžúžú•ú•úŒúŒú„ú„úyúyúqúqúhúhú]ú]úUúUúLúLúBúBú9ú9ú1ú1ú(ú(úúúúú ú úúúüùüùôùôùêùêùâùâùÙùÙùÑùÑùÉùÉùÁùÁù¹ù¹ù±ù±ù¨ù¨ù ù ù˜ù˜ùùù‰ù‰ùùùyùyùqùqùiùiùaùaùYùYùQùQùJùJùBùBù<ù<ù5ù5ù-ù-ù%ù%ùùùùùùù ù ùùùýøýøöøöøðøðøéøéøâøâøÜøÜøÕøÕøÐøÐøÉøÉøÂøÂø½ø½ø¶ø¶ø±ø±øªøªø¥ø¥øžøžø™ø™ø”ø”øŽøŽø‰ø‰ø„ø„ø}ø}øyøyøtøtønønøiøiøeøeø`ø`øZøZøUøUøQøQøMøMøFøFøBøBø=ø=ø9ø9ø5ø5ø1ø1ø-ø-ø)ø)ø%ø%ø!ø!øøøøøøøøøøø ø øøøøøøøþ÷þ÷ú÷ú÷ø÷ø÷ó÷ó÷ñ÷ñ÷î÷î÷ê÷ê÷é÷é÷æ÷æ÷â÷â÷á÷á÷ß÷ß÷Ú÷Ú÷Ù÷Ù÷×÷×÷Ô÷Ô÷Ò÷Ò÷Ñ÷Ñ÷Ï÷Ï÷Ì÷Ì÷Ê÷Ê÷È÷È÷Ç÷Ç÷Ä÷Ä÷Ã÷Ã÷Á÷Á÷Á÷Á÷À÷À÷¿÷¿÷¾÷¾÷»÷»÷º÷º÷¹÷¹÷¹÷¹÷¸÷¸÷·÷·÷·÷·÷¶÷¶÷¶÷¶÷¶÷¶÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷³÷´÷´÷³÷³÷´÷´÷´÷´÷¶÷¶÷¶÷¶÷·÷·÷¸÷¸÷¹÷¹÷¹÷¹÷¹÷¹÷º÷º÷»÷»÷¾÷¾÷¿÷¿÷À÷À÷Á÷Á÷Â÷Â÷Ã÷Ã÷Æ÷Æ÷Ç÷Ç÷É÷É÷Ê÷Ê÷Ì÷Ì÷Ï÷Ï÷Ñ÷Ñ÷Ò÷Ò÷Ô÷Ô÷×÷×÷Ù÷Ù÷Û÷Û÷Þ÷Þ÷á÷á÷â÷â÷æ÷æ÷é÷é÷ê÷ê÷ì÷ì÷ð÷ð÷ó÷ó÷÷÷÷÷ù÷ù÷ü÷ü÷øøøøøø ø ø ø øøøøøøøøøøø!ø!ø%ø%ø)ø)ø-ø-ø1ø1ø6ø6ø:ø:ø>ø>øBøBøFøFøLøLøQøQøUøUøYøYø^ø^ødødøhøhømømøqøqøvøvø|ø|øøø†ø†øŒøŒø‘ø‘ø•ø•øšøšø ø ø¥ø¥ø¬ø¬ø±ø±ø¶ø¶ø¼ø¼øÁøÁøÈøÈøÍøÍøÔøÔøÙøÙøáøáøæøæøìøìøòøòøùøùøþøþøùù ù ùùùùù ù ù%ù%ù,ù,ù2ù2ù9ù9ùAùAùHùHùMùMùUùUù]ù]ùdùdùjùjùrùrùyùyùùùˆùˆùŽùŽù•ù•ùùù¥ù¥ù­ù­ùµùµù¼ù¼ùÄùÄùÊùÊùÒùÒùÚùÚùâùâùêùêùòùòùúùúùúú ú úúúúú"ú"ú*ú*ú2ú2ú:ú:úDúDúLúLúUúUú]ú]úeúeúmúmúvúvú€ú€úˆúˆúúú™ú™ú¡ú¡ú©ú©ú²ú²ú¼ú¼úÅúÅúÍúÍúÖúÖúàúàúéúéúñúñúúúúúûû û ûûûûû(û(û1û1û:û:ûDûDûMûMûVûVûaûaûiûiûrûrû}û}û…û…ûŽûŽû™û™û¡û¡ûªûªûµûµû¾û¾ûÉûÉûÑûÑûÜûÜûåûåûîûîûùûùûüü ü üüüüü)ü)ü3ü3ü=ü=üGüGüQüQü[ü[üeüeüoüoüyüyüƒüƒüüü—ü—ü¡ü¡ü«ü«üµüµü¿ü¿üÉüÉüÓüÓüÝüÝüçüçüñüñüûüûüýýýýýý#ý#ý-ý-ý7ý7ýAýAýMýMýWýWýaýaýkýkýuýuýýý‰ý‰ý“ý“ýýý§ý§ý±ý±ý½ý½ýÇýÇýÑýÑýÛýÛýåýåýñýñýûýûýþþþþþþ#þ#þ-þ-þ8þ8þBþBþLþLþWþWþaþaþkþkþuþuþ€þ€þ‰þ‰þ“þ“þþþ¨þ¨þ²þ²þ¼þ¼þÆþÆþÑþÑþÛþÛþåþåþïþïþúþúþÿÿ ÿ ÿÿÿ!ÿ!ÿ+ÿ+ÿ5ÿ5ÿ@ÿ@ÿJÿJÿTÿTÿ^ÿ^ÿhÿhÿrÿrÿ|ÿ|ÿ…ÿ…ÿÿÿ™ÿ™ÿ£ÿ£ÿ­ÿ­ÿ·ÿ·ÿÁÿÁÿËÿËÿÔÿÔÿÞÿÞÿèÿèÿòÿòÿüÿüÿ  **33==GGPPZZccmmvv‰‰’’››¥¥®®··ÁÁÊÊÓÓÝÝææïïøø  %%..77@@HHQQZZcclltt||……ŽŽ––ŸŸ§§¯¯¸¸ÁÁÉÉÑÑÙÙââêêòòúú  ##++11;;AAIIQQYYaaiiqqww}}……••››££©©±±¹¹¿¿ÇÇÍÍÕÕÛÛããééïï÷÷ýý  ##++1177==CCIIOOUU[[aaggmmssww}}ƒƒ‰‰““™™ŸŸ££©©¯¯³³¹¹½½ÃÃÇÇÍÍÑÑ××ÛÛßßååééííóó÷÷ùùýý    $$''++//3377::<<??CCGGJJLLOOSSWWXX[[__``ddgghhkkooppssvvwwzz{{~~‚‚ƒƒ††‡‡ˆˆ‹‹ŒŒŽŽ““““””––——˜˜šš››››œœžžŸŸŸŸŸŸ¢¢¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¢  ŸŸŸŸžžžžœœ››šš˜˜˜˜——––““““’’ŒŒ‹‹ŠŠ‡‡††ƒƒƒƒ€€~~{{xxwwttssppnnkkhhggcc``__\\ZZWWSSOONNKKGGCCBB>>;;773300,,((&&##  ÿÿûû÷÷õõññëëççããßßÛÛÕÕÑÑÍÍÉÉÃÿ¿»»µµ±±««§§££——““‰‰ƒƒ}}yyuuooiiee__YYUUOOIICC==7733--''!!  ýýùùóóííççßßÙÙÓÓÍÍÇÇÁÁ»»µµ­­§§¡¡››““‡‡yyssmmgg__YYQQKKEE==77//))!!  þþøøññééââÛÛÔÔÌÌÆÆ¾¾··¯¯¨¨¡¡™™’’‹‹ƒƒ||uunngg__WWPPIIAA9922**##  üüööîîææßß××ÏÏÇÇÀÀ¸¸°°¨¨¡¡™™‘‘‰‰‚‚{{sskkcc\\TTLLDD<<44,,%% ùÿùÿñÿñÿéÿéÿáÿáÿÙÿÙÿÑÿÑÿÉÿÉÿÂÿÂÿºÿºÿ²ÿ²ÿªÿªÿ¢ÿ¢ÿšÿšÿ’ÿ’ÿ‹ÿ‹ÿƒÿƒÿ|ÿ|ÿtÿtÿlÿlÿdÿdÿ]ÿ]ÿUÿUÿMÿMÿEÿEÿ>ÿ>ÿ6ÿ6ÿ.ÿ.ÿ&ÿ&ÿÿÿÿÿÿÿÿÿÿÿùþùþñþñþéþéþâþâþÚþÚþÒþÒþËþËþÃþÃþ»þ»þ´þ´þ¬þ¬þ¥þ¥þþþ•þ•þŽþŽþ†þ†þ€þ€þxþxþqþqþiþiþbþbþZþZþSþSþKþKþDþDþ<þ<þ5þ5þ.þ.þ&þ&þþþþþþþ þ þþþûýûýóýóýíýíýåýåýßýßý×ý×ýÑýÑýÉýÉýÁýÁý»ý»ý³ý³ý­ý­ý¥ý¥ýŸýŸý—ý—ý‘ý‘ý‰ý‰ý…ý…ý}ý}ýwýwýoýoýiýiýaýaý[ý[ýUýUýMýMýGýGýAýAý9ý9ý3ý3ý-ý-ý%ý%ýýýýýýý ý ýýýÿüÿüùüùüóüóüíüíüçüçüáüáüÙüÙüÓüÓüÍüÍüÇüÇüÁüÁü»ü»üµüµü¯ü¯ü©ü©ü£ü£üüü—ü—ü‘ü‘ü‹ü‹ü‡ü‡üüü{ü{üuüuüoüoüküküeüeü_ü_üYüYüUüUüOüOüIüIüCüCü=ü=ü9ü9ü3ü3ü/ü/ü)ü)ü#ü#üüüüüüüüü ü üüüüüýûýûöûöûòûòûíûíûéûéûäûäûàûàûÚûÚûÕûÕûÑûÑûÍûÍûÈûÈûÄûÄûÀûÀûºûºû¶û¶û±û±û­û­û©û©û¥û¥û¡û¡ûûû™û™û•û•ûûûûû‰û‰û…û…ûûû}û}ûzûzûuûuûrûrûnûnûjûjûhûhûdûdû`û`û]û]ûYûYûUûUûRûRûPûPûLûLûIûIûEûEûBûBû>û>û<û<û9û9û5û5û2û2û0û0û-û-û)û)û(û(û%û%û!û!ûûûûûûûûûûûûûûû û û û û û ûûûûûûûûûþúþúýúýúúúúúùúùúöúöúõúõúôúôúñúñúðúðúíúíúìúìúêúêúéúéúæúæúåúåúåúåúâúâúáúáúàúàúÞúÞúÝúÝúÝúÝúÜúÜúÙúÙúÙúÙúØúØúÖúÖúÕúÕúÕúÕúÔúÔúÒúÒúÒúÒúÑúÑúÑúÑúÑúÑúÐúÐúÎúÎúÎúÎúÎúÎúÍúÍúÍúÍúÍúÍúÌúÌúÌúÌúÍúÍúÌúÌúÌúÌúÌúÌúÊúÊúÊúÊúÌúÌúÊúÊúÌúÌúÌúÌúÌúÌúÌúÌúÍúÍúÌúÌúÍúÍúÍúÍúÍúÍúÍúÍúÎúÎúÎúÎúÐúÐúÑúÑúÑúÑúÑúÑúÒúÒúÒúÒúÔúÔúÕúÕúÕúÕúÖúÖúØúØúÙúÙúÙúÙúÚúÚúÝúÝúÝúÝúÞúÞúàúàúáúáúáúáúäúäúåúåúæúæúèúèúéúéúêúêúíúíúíúíúðúðúñúñúòúòúõúõúøúøúùúùúúúúúýúýúþúþúûûûûûûûû û û û û û ûûûûûûûûûûûûûûû û û"û"û%û%û&û&û)û)û-û-û0û0û2û2û5û5û8û8û:û:û=û=ûAûAûDûDûFûFûIûIûMûMûPûPûRûRûUûUûYûYû]û]û`û`ûdûdûeûeûiûiûmûmûqûqûtûtûvûvûzûzû~û~ûûû…û…û‰û‰ûŒûŒûûû”û”û–û–ûšûšûžûžû¡û¡û¦û¦ûªûªû­û­û±û±û¶û¶û¹û¹û½û½ûÁûÁûÅûÅûÉûÉûÍûÍûÑûÑûÕûÕûÙûÙûÝûÝûáûáûåûåûéûéûîûîûñûñûöûöûúûúûþûþûüüüü ü üüüüüüüüü!ü!ü%ü%ü+ü+ü/ü/ü3ü3ü9ü9ü=ü=üAüAüGüGüKüKüQüQüUüUüYüYü_ü_ücücüiüiümümüsüsüwüwü}ü}üüü‡ü‡ü‹ü‹üüü•ü•ü™ü™üŸüŸü£ü£ü©ü©ü­ü­ü³ü³ü¹ü¹ü½ü½üÃüÃüÇüÇüÍüÍüÓüÓü×ü×üÝüÝüãüãüçüçüíüíüóüóü÷ü÷üýüýüýýýý ý ýýýýýýý!ý!ý'ý'ý-ý-ý1ý1ý7ý7ý=ý=ýCýCýIýIýMýMýSýSýYýYý_ý_ýcýcýiýiýoýoýuýuý{ý{ýýý…ý…ý‰ý‰ýýý•ý•ý›ý›ý¡ý¡ý§ý§ý­ý­ý±ý±ý·ý·ý½ý½ýÃýÃýÉýÉýÏýÏýÕýÕýÙýÙýßýßýåýåýëýëýñýñý÷ý÷ýûýûýþþþþ þ þþþþþþþ$þ$þ)þ)þ/þ/þ5þ5þ;þ;þ@þ@þFþFþLþLþRþRþWþWþ]þ]þcþcþiþiþnþnþtþtþzþzþþþ„þ„þŠþŠþþþ•þ•þ›þ›þ¡þ¡þ¦þ¦þ¬þ¬þ²þ²þ¸þ¸þ½þ½þÃþÃþÉþÉþÎþÎþÔþÔþÚþÚþßþßþåþåþëþëþðþðþöþöþûþûþÿÿÿÿ ÿ ÿÿÿÿÿÿÿ"ÿ"ÿ'ÿ'ÿ-ÿ-ÿ2ÿ2ÿ8ÿ8ÿ=ÿ=ÿCÿCÿHÿHÿNÿNÿSÿSÿYÿYÿ^ÿ^ÿdÿdÿiÿiÿnÿnÿtÿtÿyÿyÿÿÿƒÿƒÿˆÿˆÿŽÿŽÿ“ÿ“ÿ˜ÿ˜ÿžÿžÿ£ÿ£ÿ¨ÿ¨ÿ®ÿ®ÿ³ÿ³ÿ¸ÿ¸ÿ½ÿ½ÿÃÿÃÿÈÿÈÿÍÿÍÿÒÿÒÿ×ÿ×ÿÜÿÜÿáÿáÿçÿçÿìÿìÿñÿñÿöÿöÿûÿûÿ  %%))..3388==AAFFKKPPUUYY^^ccggllppuuyy}}††ŠŠ““˜˜œœ  ¥¥©©­­±±µµºº¾¾ÂÂÆÆÊÊÏÏÓÓÖÖÛÛßßããççêêïïòòööúúýý  !!%%((,,//336699==@@CCGGJJMMPPTTWWYY]]``ccffhhllnnrrttwwzz{{„„††‰‰ŒŒŽŽ‘‘““••˜˜ššŸŸ¢¢¤¤¦¦©©ªª­­¯¯±±³³µµ··¹¹»»½½¿¿ÁÁÃÃÅÅÆÆÈÈÊÊËËÍÍÏÏÐÐÒÒÓÓÕÕÖÖ××ÙÙÚÚÜÜÝÝßßààááããããååææççèèééêêëëììííîîïïïïððññòòòòóóôôôôõõõõöööööö÷÷÷÷øøøøùùùùùùùùùùúúúúúúúúúúúúúúúúúúúúúúùùùùùùùùøøùùøøøø÷÷ööööõõööõõõõóóòòòòññññððððîîííííììëëêêééèèççææååääââââààààÞÞÜÜÛÛÚÚÙÙ××ÖÖÔÔÓÓÒÒÐÐÏÏÍÍÌÌÊÊÉÉÆÆÄÄÃÃÁÁÀÀ¾¾¼¼ºº¹¹¶¶´´³³°°¯¯­­««©©§§¥¥¢¢  žžœœšš˜˜••’’‘‘ŽŽŒŒ‰‰‡‡……ƒƒ€€~~{{zzwwttrroommjjhheebb__\\ZZWWTTQQOOLLIIFFDD@@==;;775511//++))%%""    ÿÿüüùùööóóððììééååââßßÜÜØØÔÔÑÑÍÍÊÊÆÆÃÿ¿¼¼¸¸µµ±±®®ªª¦¦££ŸŸœœ˜˜””‘‘‰‰††‚‚~~||xxttqqmmiieeaa^^ZZVVRRNNJJGGCC??;;7733//,,(($$  üÿüÿøÿøÿôÿôÿðÿðÿìÿìÿèÿèÿäÿäÿàÿàÿÜÿÜÿØÿØÿÔÿÔÿÐÿÐÿÌÿÌÿÈÿÈÿÅÿÅÿÀÿÀÿ½ÿ½ÿ¹ÿ¹ÿµÿµÿ±ÿ±ÿ­ÿ­ÿ©ÿ©ÿ¥ÿ¥ÿ¡ÿ¡ÿÿÿ™ÿ™ÿ•ÿ•ÿ‘ÿ‘ÿÿÿ‰ÿ‰ÿ…ÿ…ÿÿÿ~ÿ~ÿzÿzÿvÿvÿrÿrÿnÿnÿjÿjÿfÿfÿbÿbÿ^ÿ^ÿZÿZÿVÿVÿSÿSÿOÿOÿKÿKÿGÿGÿCÿCÿ?ÿ?ÿ;ÿ;ÿ7ÿ7ÿ3ÿ3ÿ/ÿ/ÿ+ÿ+ÿ'ÿ'ÿ$ÿ$ÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿþþþþúþúþöþöþòþòþïþïþëþëþçþçþãþãþßþßþÜþÜþØþØþÔþÔþÐþÐþÍþÍþÉþÉþÅþÅþÁþÁþ¾þ¾þºþºþ¶þ¶þ³þ³þ¯þ¯þ«þ«þ¨þ¨þ¤þ¤þ þ þþþ™þ™þ–þ–þ’þ’þŽþŽþ‹þ‹þ‡þ‡þ„þ„þþþ~þ~þzþzþwþwþsþsþpþpþlþlþiþiþeþeþbþbþ^þ^þ[þ[þWþWþTþTþQþQþMþMþJþJþGþGþCþCþ@þ@þ=þ=þ:þ:þ6þ6þ3þ3þ0þ0þ-þ-þ)þ)þ&þ&þ#þ#þ þ þþþþþþþþþþþ þ þ þ þþþþþþþýýýýûýûý÷ý÷ýõýõýóýóýïýïýíýíýéýéýçýçýãýãýáýáýßýßýÛýÛýÙýÙýÕýÕýÓýÓýÏýÏýÍýÍýËýËýÇýÇýÅýÅýÃýÃý¿ý¿ý½ý½ý»ý»ý·ý·ýµýµý³ý³ý¯ý¯ý­ý­ý«ý«ý©ý©ý¥ý¥ý£ý£ý¡ý¡ýŸýŸýýý™ý™ý—ý—ý•ý•ý“ý“ýýýýý‹ý‹ý‰ý‰ý‡ý‡ý…ý…ýƒýƒýýýýý}ý}ý{ý{ýyýyýwýwýuýuýsýsýqýqýoýoýmýmýkýkýiýiýgýgýeýeýcýcýaýaý_ý_ý]ý]ý[ý[ýYýYýWýWýWýWýUýUýSýSýQýQýOýOýMýMýKýKýIýIýGýGýGýGýEýEýCýCýAýAýAýAý?ý?ý=ý=ý;ý;ý;ý;ý9ý9ý9ý9ý7ý7ý5ý5ý3ý3ý3ý3ý1ý1ý1ý1ý/ý/ý-ý-ý-ý-ý+ý+ý)ý)ý)ý)ý'ý'ý'ý'ý%ý%ý#ý#ý#ý#ý!ý!ý!ý!ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ý ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý!ý!ý!ý!ý!ý!ý#ý#ý#ý#ý%ý%ý'ý'ý'ý'ý'ý'ý)ý)ý)ý)ý+ý+ý+ý+ý-ý-ý-ý-ý/ý/ý1ý1ý3ý3ý3ý3ý3ý3ý5ý5ý7ý7ý7ý7ý9ý9ý;ý;ý;ý;ý=ý=ý?ý?ý?ý?ýAýAýAýAýCýCýEýEýGýGýGýGýIýIýKýKýMýMýMýMýOýOýQýQýSýSýUýUýUýUýWýWýYýYý[ý[ý[ý[ý]ý]ý_ý_ýaýaýcýcýeýeýgýgýgýgýiýiýkýkýmýmýoýoýqýqýsýsýsýsýwýwýwýwýyýyý{ý{ý}ý}ýýýýýƒýƒý…ý…ý…ý…ý‡ý‡ý‰ý‰ý‹ý‹ýýýýý‘ý‘ý“ý“ý•ý•ý—ý—ý™ý™ý›ý›ýýýŸýŸý¡ý¡ý£ý£ý¥ý¥ý§ý§ý©ý©ý«ý«ý­ý­ý±ý±ý³ý³ýµýµý·ý·ý¹ý¹ý»ý»ý½ý½ý¿ý¿ýÁýÁýÃýÃýÅýÅýÉýÉýËýËýÍýÍýÏýÏýÑýÑýÓýÓýÕýÕýÙýÙýÛýÛýÝýÝýßýßýáýáýãýãýåýåýéýéýëýëýíýíýïýïýñýñýóýóý÷ý÷ýùýùýûýûýýýýýÿýÿýþþþþþþ þ þ þ þ þ þþþþþþþþþþþþþþþ!þ!þ#þ#þ&þ&þ(þ(þ+þ+þ-þ-þ0þ0þ2þ2þ5þ5þ7þ7þ:þ:þ<þ<þ?þ?þAþAþDþDþFþFþIþIþKþKþNþNþPþPþSþSþUþUþXþXþ[þ[þ]þ]þ_þ_þbþbþdþdþgþgþiþiþlþlþoþoþqþqþtþtþvþvþyþyþ{þ{þ~þ~þ€þ€þƒþƒþ„þ„þ‡þ‡þŠþŠþŒþŒþŽþŽþ‘þ‘þ“þ“þ–þ–þ™þ™þ›þ›þžþžþ þ þ£þ£þ¥þ¥þ¨þ¨þªþªþ­þ­þ¯þ¯þ²þ²þ´þ´þ·þ·þ¹þ¹þ¼þ¼þ¾þ¾þÁþÁþÃþÃþÆþÆþÈþÈþËþËþÍþÍþÐþÐþÒþÒþÕþÕþ×þ×þÚþÚþÜþÜþßþßþáþáþãþãþæþæþèþèþëþëþíþíþðþðþòþòþôþôþ÷þ÷þùþùþüþüþþþþþÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿ!ÿ#ÿ#ÿ%ÿ%ÿ(ÿ(ÿ*ÿ*ÿ,ÿ,ÿ.ÿ.ÿ1ÿ1ÿ3ÿ3ÿ5ÿ5ÿ8ÿ8ÿ:ÿ:ÿ<ÿ<ÿ>ÿ>ÿ@ÿ@ÿCÿCÿEÿEÿGÿGÿIÿIÿKÿKÿNÿNÿPÿPÿRÿRÿTÿTÿVÿVÿYÿYÿ[ÿ[ÿ]ÿ]ÿ_ÿ_ÿaÿaÿcÿcÿeÿeÿgÿgÿjÿjÿkÿkÿnÿnÿpÿpÿrÿrÿtÿtÿvÿvÿxÿxÿzÿzÿ|ÿ|ÿ~ÿ~ÿ€ÿ€ÿÿÿƒÿƒÿ…ÿ…ÿ‡ÿ‡ÿ‰ÿ‰ÿŠÿŠÿÿÿŽÿŽÿÿÿ’ÿ’ÿ”ÿ”ÿ–ÿ–ÿ˜ÿ˜ÿšÿšÿœÿœÿÿÿŸÿŸÿ¡ÿ¡ÿ£ÿ£ÿ¥ÿ¥ÿ¦ÿ¦ÿ¨ÿ¨ÿªÿªÿ¬ÿ¬ÿ­ÿ­ÿ¯ÿ¯ÿ±ÿ±ÿ³ÿ³ÿ´ÿ´ÿ¶ÿ¶ÿ·ÿ·ÿ¹ÿ¹ÿ»ÿ»ÿ¼ÿ¼ÿ¾ÿ¾ÿÀÿÀÿÁÿÁÿÃÿÃÿÄÿÄÿÆÿÆÿÈÿÈÿÉÿÉÿËÿËÿsonic-visualiser-3.0.3/samples/organ.wav0000644000000000000000000077545413111512442016453 0ustar 00000000000000RIFF$ûWAVEfmt "VD¬dataû4„ú—K°^ÖtÍèð ³ïç¨'‘ÿÎýeü¼úùœ÷½öXöíõõ ôó°ò§ò·ò¢òtò|òÞò‹óÅô½ö)ùPûºü–ýNþ?ÿYØHÿýýýšýƒýËü[ûšù®÷qõhó!ò‹ñúðð&ï;ïÃð~ó<öøRùîúƒýÍ&ˆ R ›A½s²#!)æ,[/F1Y3a5 6Š4“1Œ.X,„*($Ž )‡ Óû©öqñë¬å:áùÞ”ÞÞõÛÙ“Ö¼Õ Ö°Ö³ÖRւ֫מ٠ݼâéïóÚõÖ÷jú^ýÆþký€úø:÷÷Ç÷öžóðAìÊçàãÙáyá0áüßøÞñßîãSê…ð¥ôe÷¿úöÿvå @¶›`!Á'´/:cE&O¡UŠYf\„_Œbûbd_0YïRXNƒJ£E7> 4w(q öÞí"åÛ[ÑÊ¸ÆÆ-Æ<ÃɾD»`º|»Ò¼$½¶¼½Ý¾ËÁ.ÇùÏ®Ú äàéíÜï±ó7ølú\øèóNðwïuð4ñÏïìhçHâBÜ× Ô®ÔÓÔ•Ó•ÒhÔ˜ÚäEí~óÈ÷Êü;: ìÃ"Ö(Ö/d7Ä@úLzZ¼e©lLp¬rlu*x¾wzr/jüaØ[¿VPcG:;Š-õ3"ÎóúéUàCÕ—ÊÙ‰¿Ì¿é¿0½Þ¸”µµ¦¶n¸¹ô¸–¹ »»¾`ÄÍ®ØZâ_è²ëwîYòåöù÷òï0î*ïëï³îë¥æ´áÚÛÃÖ‰ÔçÔ`ÕjÔ¨ÓžÕøÛ¶å ïsõíùÿ”ŸRp2%4+2n9‘BNå[ g¿m!qEsÌu^xÀwHrÒi|a+[çU‡O^F9:Ž,þ/ÿÈò é…ßÔìÉ<Âþ¾O¿~¿Þ¼–¸XµÚ´]¶¸¼¸Ž¸¹ »¾gÀ̛×Eá?ç…ê7íñ™õ¿÷¼õOñ»íîìëí³î›íCêýå;á‹Û¢ÖšÔCÕÖ]ÕÔÔ×xÝqçõð÷#ü`õ »Ø!™'†->4\;;DÿO']$GtR>_ói pÂr,tv xõvq hX_¬XüRXL0C 7•) > üØïƒæjÝÂÒ>È—À’½&¾x¾ÿ»Ø·Ÿ´'´…µ··/·„·¹›»}À,É;ÔôÝÆãÓæbé(íÂñèóÝñŒí êqé”ê‘ëãê5è¤ä‰à[ÛúÖ©Õ-×ôØÙÙÆÛÑâ9í=÷!þ šSZï!à(k.þ3#:t@bHxS` j—ps-tèu°wovXpDgt^³WëQ0KB6–(T %ûøî¿åÐÜ@ÒÊÇ3À!½Ð½4¾Â»£·r´é³;µ ¶ ·®¶ê¶c¸¹ºq¿ÈÓÓÜ—âŽåèÓëið¬ò¢ð\ìékè›é´ê0ê½çjä‡àŽÛY×EÖØ'ÚuڞڅݺäHïhùpp ÊÃ<$+ˆ0ñ5à;ïAŽIWTË`.kïpst—u:wÓu™omf€]®VÑPJØ@ü4›'1p Hú+î åGÜÍÑ`Çӿϼ‚½ø½Š»q·H´´³ñ´>¶–¶(¶Q¶§·Ï¹[¾ÔÆÉÑ’ÛháF乿yêïcñpï5ëùçuç·èïé™ébçOä¨àéÛÔ×þÖÙ|Û Ü\ÜVß²æfñ£ûÂ×| ;#|&>-‹2Ç7=GC™JU]ak(qsÏs%u¨v!uÆnƒe‰\œU°OÔH«?æ3£&P•oùcíaäÍÛgÑÇy¿¼9½Å½W»?·´}³¡´Õµ¶˜µ®µç¶Ü¸7½—ŇÐPÚ&àüâaå#é¿íðCîêúæ”æíç:é é'çYäîàfÜ‚ØÖ×CÚôܽÝ:ÞFáÀèœóñý E é§w ¨(E/s4‚9þ>zD}K´UÍaík>qérpsžtv^tßm‡d‡[ŠT‹N¡G~>Ö2¯%u¾œø¤ìÃãOÛÑ Æ$¿<¼ù¼‡½"»·ä³@³H´_µŒµµµ¶ë·¼TÄCÏ ÙÚÞ¨áäÓç{ìÜîí é æÉå9ç è·èç†äWáÝUÙÚØŽÛŠÞ‡ß+à`ãäêäõJ„µ a »"À*71C6";\@‡E:L/Vbl5qŸrôrüsÞúáæ¹ç°èGì:ônÿû 19½ÿ"ý*,2Þ7)<,@OD8H“MŠVÊa4k¦o7pÍo`pAq5ofhØ^ËUÍN¤HªAâ8ê-d!ˆõéTáŸÙ´ÏTÅɽñºÒ»X¼Ú¹¬µm²ƒ± ²²?²m± ±Œ±š²ÿµÑ½ÄÈÑÒŸØ-Û–Ý­áÎæÂé|èåùâ{ãšåÂçìè¬è„çyåâ5ßÚß×ãèûéë˜îœöÙa ‹ç%Ì,»339K=AëDŠHŸMNVia¶júnYoËn@opn,g ]žTM|Gˆ@Õ7-  à{Žô éûànÙŠÏ#Å–½Àº˜»$¼—¹Zµ²±ƒ±Ø±±°(°Š°m±°´v¼oǃÑ[×îÙ]ÜàÏåàèÍç”ä£âZã¦åùçféié€è«æwãÄàŠáÊåFêJìhíöðùJÉÛ¸öì&.+5d:F>ËAbEµH‚M÷Uê`"j8ncn³mnñnÕlïeb\oSxL`Fu?Ø6&,æEìôšè«à4ÙhÏóÄ`½Žºa»æ»O¹ü´«±¢°ô°+±º°Ã¯9¯€¯G°S³»Æ<ÐÖ´Ø+Û~ßåäè,ç ädâWãÖåVèúéHêžéýç÷ärâ]ãÔç‰ìªîÕïoógû».!Üø!»(0|6s;?bB´E¹H=MzUA`vi_mVm†lÛl¬m£k±d#[?RXKKEo>ç5X+8¬h‹ó3èdàÙFÏÁÄ%½Tº%»œ»ÿ¸˜´8±!°Z°r°ë¯ß®A®o®¯ ²­¹ÆÄýÎâÔƒ×ÚyÞäpçªæÔãBârã(æÖè±êCëÝêp铿6äPåñéÞîñDòâõßý) ZêÝ#k*‹1«7^<É?ÓBãEšHÓLÛT|_Œhsl6lFk‘k]l^jwcåYQ9J9Dq=5”*•!ðóÎç!àÛØ)Ï™Ä⼺æºQ»£¸*´»°—¯¹¯²¯¯ó­B­[­ï­Ë°T¸yÃÉͺÓaÖù؆ÝTããæIæ§ãQâ¯ãæ{é‹ë]ì6ìÿêHèæTç ìCñŽó¹ôTøN‡ áÝ £%ú+Ù2´8#=P@CéEWHHLTŸ^g[kkùi>j ki2b©XçO%I1Cr<'4Û)ý ‚³òrççߺØÏzħ¼Ñ¹¦º»@¸¼³5°¯¯è®.®­?¬D¬¿¬‰¯ ·6¤̜ÒJÕþ׵ܶâuææ™ã…âä6çAê‡ì™í¬í©ìêùçgé`îŸó ö*÷Àú¶Ø ‹³"I'g-ý3“9¿=±@ECÍEøG—KDS«]€f.j½iœhãh³i°gä`nWÃNH1B|;I30)t+`ò&ç³ßŸØöÎYļйbº±ºÙ·G³·¯l®]®®D­ ¬;«(«ˆ«?®ÂµõÀŽË‘ÑFÔ×÷Û"â%æßå«ãÚâ§äñç(ë¤íöîAïeîôëòéˆë«ðö‰øù#ý$| n$Ï(±.ü4E:8>ð@HCExGØJGR\`eõhlh8g}gWhZf™_>V¡MG9A:w2‰(÷ÃÁòëæ‚ßŠØâÎ8ÄV¼U¹ºYºl·Ì²3¯Ð­¤­<­W¬«7ª ªOªó¬v´·¿`Ê™ÐVÓAÖNÛ¦ááåÜåÝãMãTåÌè3ìæîuðöð@ðóíþë³íÿòzø ûü}ÿVA"I" &2*Ö/Ù5Ö:ˆ>A+C1EÛFJ6Qt[/d±ggÓefùf eV^UL FG@®9°1é'€hpÈñ­æQßuØÍÎÄ ¼¹»¹ú¹ø¶E²Ÿ®)­á¬_¬h«ª0©ò¨©©«,³~¾@ÉŸÏ}Ò„Õ¾ÚFáµåùå3äàã æÈé]íLðòÉò8ò ð2îìï\õôú‘ýšþÕ‹ W ÿ#Ž'q+×0”6I;¼> AîB¶D#FIP5Zîb`f­eedŸd™e¼c]ëSƒKE\?Ö8÷0U' %ñoæßDزÎãÃß»¿¸R¹…¹}¶¶±®v¬¬|«vª©%¨Ö§ô§`ªæ±P½/ȰεÑÙÔCÚá«å1æªä’ä çåê§îÊñÓó´ôGô9ò|ð>òÀ÷qý3¬ Yâž%ô(›,·1/7;Ñ>é@“B!DRE HäNßX§a eAdòb/c0d~bé[ÏR€JD~>8M0Í&Ÿ¶ßÿ;ñ/æçÞ؉ΦÌ»^¸à¸ÿ¸óµ±S­¸«?«‘ª~©¨§¹¦Ï¦2©¦°.¼3ÇØÍÑGÔâÙâàÉåæKå`åè$ìðfó¥õ¶ököwôÐò¥ô.úõÿ“v{Í G¢!'2*›-r2©7Ð;Ä>¤@BkCaDèFšM{W/`­cÎbxa¿aÍb9aÅZºQƒI9C¬=W7²/R&<dœÿððìå±Þæ×\ÎhÃ)»ñ·i¸v¸Xµj°•¬îªdª¢©~¨§ÿ¥š¥«¥¨}¯»OÆÍdÐØÓžÙçàæç æ`æDé‰í¥ñ%õ“÷Ñø¨øÆö-õ÷£üΫÓJ#~(I+q.3û7ß;“>:@vA“BQC¢E4LV¯^0bRa÷_L`naì_ŸY§P‹H^Bè<¦6$/â%åbÿ»ð§å}Þ½×2Î2ÃȺz·ì·ë·¸´¼¯Ì«ª†©¯¨z§¦é¤¤‹¤ó¦i®ºƒÅsÌáσÓÙá~æµçíæç–êïTóÿö™ùýúúú)ù”÷€ùÿîˆà ¼ÈÆ$Á)>,"/v3%8Ë;@>¯?¸@£A5BED¹JT']¨`Ï_r^Ù^`©^vX›O™GŠA-<þ5“.{%—á /ÿ‘ðoåEÞ×ÎòÂzºý¶j·Z·´¯ «E©¢¨·§s¦ø¤Û£m£w£á¥c­*¹ÏÄæËxÏMÓ‰ÙPáç|èíç½è ì¯ðõïø¶û>ýPý“ûþùëû‚Pà I Å Ž\&Ô* -­/Á3+8‹;Ë=?á?›@AéB+IðR˜[_L^õ\p]Ç^r]WW N³FÄ@;a5 .%Tª ýþað?å Þ_×ÊÍ«Â$º–¶ã¶Ã¶c³F®Bªm¨¸§»¦l¥ð£Õ¢c¢h¢Ô¤g¬I¸ÄwË-Ï6Ó±Ù³á·çhé éêžíkòÿöúúêý’ÿ´ÿþcüNþä¨ % k §=Ñ?'½+²-0ç38-;3=D>ñ>?½?„A›GVQ Z”]Ê\‚[\€]G\EV­MàE@Ù:Ì4Œ-³$w Ëþ*ðåÆÝ)×ÍY¿¹!¶S¶,¶³²­q©§Ì¦¿¥f¤ì¢Ö¡f¡f¡Ô£x«~·nÃËÏ<ÓøÙ9âwètêNê”ëMïBôøøý0ô&~Üþ©>÷ ]~sÍ+ U(Š,=.S0ë3Ò7®:y<`=æ=N>f> @ F´OzX \F[ ZªZF\-[AUÄLEQ?<:?4-R$ÅD ˜þîïÀä|ÝÖÖIÍúÁK¹µ»µ…µ²¶¬™¨®¦Ú¥Á¤a£é¡Û t  à¢›ªÉ¶ëÂÆÊñÎ\Ó[Úãâ`é›ë¯ë'íñ2öûIÿ…c£ÿZ Œ:‚u59c!M)9-¦.y0Ì3w7:§;c<Æ< ==ˆ>mDNðV‹ZÅYšXOY["ZKTäKQD¤>¥9º3ž,ô#y `þ¨ïsä+Ý€ÖôÌÁȸµµÒ´E±ã«º§È¥ì¤É£c¢ï íŸ’Ÿ¯Ÿ¢Ô©3¶ŒÂžÊÏŸÓàÚ´ãrêçì6íÒîòò=ø0ý‰äÝ&~ÎnÍ mŽHÌ•|"(*Å-æ.w0‰3ü6[9¹:K;;¶;‡;î<ÃBXLAU YEX'WøWÍYYaS K‘Cþ=9>34,ž#3à $þXïäÓÜ'Ö—Ì Á4¸p´z´´° «Ô¦ß¤¤Ø¢o¡  ŸÀžïžr¡2©»µV¢Ê;ÏÔ‰Û¯ä±ë[îÞî¨ðêô_úoÿÞN\ ¯ û5»ù Œ‚ú<Åg#ã*1./N0"3_6‹8¶9 :B:M:ÿ9F; A J“S|WÌV¹U¦VXXR;JÕB[=…8Á2Ï+J#ìƒ æýï´ãnÜÅÕ4Ì´Àœ·Â³Ê³f³¸¯7ªæ¥ñ££ë¡„ Ÿ6žžDžÞ ¹¨^µAÂËʙϫÔ^ÜÌåíöï¥ð™òüö—üÀCÄ Ü < y ”÷ y^†Ë*$n+€.þ.0™2ž57š8ß8ä8×8w8‘9G?äHêQêUUUMTXUwWW¡QwI"B¿<8L2f+ú"¨H «ýÒîTãÜ`ÕÌË>À·³³¯²ó®a©¥ÿ¢*¢¡ŸŸEžnR¬[ Q¨µOÂËÐ]ÕOÝç¥î±ñ…òžô%ùàþ"µB _ºð à  I ú¦ªË$Ì+©.Õ.’/ñ1Ä4”6k77y7Z7ë6ñ7‚=,GJPdTçSìRTaVVÑPÄHwA-<„7Ý1+¥"e iý†îûâŒÛñÔYË»¿¶f²Z²ò±%®ƒ¨¤¢B¡! Åž}½œ·œ(ðŸ¨÷´\ƒ˲Ð3ÖdÞPè8ð„ó}ô¼ödû7’5 Ìç3T $éúŽJ¦jI%,›.Š./.1Ð3t5'6166Õ5W5W6Ï;|E´NçR„R¨QâRZU-UPHá@¢; 7q1*L"Ä ý*î‘âÛwÔÙÊ*¿âµº±—±-±M­§2£)¡\ DŸöÄœœ2œ·œ™ŸÕ§ô´ŽÂþËqÑ*לßÄéÞñmõ‹öëø³ýŸ ¾ [p§¬L®’õ}†¨%,s.#.V.M0Ä2@4Ñ4Å4Š4I4¿3º4,:ÓC-M{Q/QnPÇQgT_TQOvGP@;˜61;*ò!Åz ÅüÆíâ‡ÚàÓRÊŒ¾3µ±Ï°^°{¬¸¦E¢> zŸqž4œ“›Ä›oœZŸ¼§µã”ÌOÒ;ØíàUë§ói÷­ø&û ‰ Déò÷sùV >ŠUuç%#,4.£-–-P/¡1ú2l3L33¶2#23†8)B°KPÞO7O¯PnS¡S¨NÛFÀ?”:6›0Ù)–!j lüYíœáöÙCÓ¹Éå½w´9°°…¯©«Ö¥[¡YŸ¢ž®†œ„››n›DœTŸÁ§Lµ`ÃVÍTÓoÙYâí“õ…ùñúqýk‰Îmkq2€ÍßjfsùÕ& ,Û--º,<.m0§1þ1Ç1o11‡0s1Þ6ƒ@JÄNšNN›OyRÜR NFF/? :£520v)3!¶ üÝì áUÙ›ÒÉ;½«³b¯(¯¬®Îªó¤o wžÖüœê›ÿšµš4›8œwŸó§©µÄ@Î~ÔÒÚâãÖî¡÷¾ûJýÛÿÛ ¤ZèÖÆ]t~H¬s:x ø%Ý+k-N,Å+-(/J0†0<0Ù/…/ë.Í/45á>ˆHbM`MÝLNQRrM²Ež>ƒ9&5¿/)Ì L šûdìfà§ØìÑiȼ۲€®M®Ö­ö©¤ƒŸšWœ`›‘šhš›Hœ³ŸW¨*¶ÒÄRÏÈÕQÜ•åÆðÎùþ³ÿQYŸ 8å^/ qH ±^ÛÏ Ì%ƒ+â,}+¶*Ú+Ì-ß./ª.?.ë-W-$.Š3E=GL+L¸K†M®PTQÑL"E >ù8¨4K/ž(c 0Ý (ûëëÉßò×;ѺÇÞ» ²•­n­­&©H£¯žÅœbœÄ›êš=š7š›tœ  Ö¨Ð¶ÆÅˆÐ0×èÝ^çÂòüz,Óâ /ÌlÌz+mýyµ— Tú ~%þ*:,’*Ž)ˆ*_,^-y--Ÿ,O,Ä+“,ã1²;“E³JüJ›JƒLÙO§P>LžD|=p8,4Õ.&(ë¿m ²úië5ß<׊РÇ#»Y±È¬˜¬?¬_¨|¢æœÀ›A›†šý™&š0›¿œ u©š·¿ÆÝѮؔß?éÕôdþó®Zo ¾Yæ( ±!4!EŽÂº] ¢ ¨Ø%d*g+‹)R(*)é*Ó+Ü+l+þ*¶*4*+S0,:-DlIÔI”I‘KOP¬KDü<í7³3[.¦'iEö0úÝêšÞ‹ÖØÏRÆ_º°ÿ«È«{«—§´¡*_›3›Óš8šÙ™2šl›$¡3ª…¸×Ç4ÓCÚVá7ëýö­p6è J×Rs"Ò#!#û è !!Ý炘$­)|*u('¾'h)A*<*É)]))¤(‘)á.·8ÚB5H·H–H³J]NkO#K›C‚Ö¿Ýå^ïŒû† j P´î#È&Ë'ª&#¡éþï!ƒ!Ùs…B# (v(&P$¾$L&'ø&ƒ&#&ù%—%&,í5E@úEœF©FIåLMN-J¡B€;c6+2Û,&Ç‘;oøíèÜDÔgÍôÃê·õ­q©T©$©t¥žŸ9›½™û™šó™š›Ûœ;Ÿ«£*­ ¼ÿËùשß4çŒñôý" ¢˜Ç"#&Ê(Ÿ)J(e$µ³z9"”!§âo"$'_'Ç$Û"/#²$r%V%â$Œ$p$$%%™*4û>ØDE¸E,H.L¬M±IBñ:Ñ5š1I,‰%/ò—Ç÷=è®ÛkÓÌ!÷­Œ¨‹¨t¨Ô¤Ÿ¨šQ™Á™ ššfš…›™0 Ó¤~®y½ªÍØÙ­á[éØój· Ì´65c$E(³*L+Ë)¢%¥ VÒL"Œ!Xs‚!&<&n#[!™!#Õ#µ#A#÷"î"®"³#1)=3Â=¼C¦DÊDWGyKM#I•AX:551¯+ç$Ií÷‹çÞÚŠÒ¶ËPÂR¶J¬§§É§Ó§F¤“ž?šý˜¤™"šZšÚš,œ{žH¡¦ì¯¿vÏÖÛËã•ë0öàd X‡Ž!ž&O*‚,Ý,+¿&r!Ó ="P!èÂ=y ò$% "Òûp!5""¨!i!s!K!]"Í'ï1’<®B¸CæC‚FÄJvL™HA¸9Ž4]0 +;$Û™;döÒæÚ¥ÑÛÊÁˆµ…«é¦ §:§Æ£+žó™Ì˜£™XšÂšu›ýœ~Ÿ~¢{§r±­À<ÑíÝæãí˜ø\3úHíÏ#À(@,6.P.L,²'". "ó bùD[±#ª#š C_ј  ç ï!&«0l;©AÒBCµEJØKH~@ 9ä3²/[*ƒ#Û¦õæKÙÆÐʱÀ½´Âª2¦]¦±¦T£Ò»™½˜Â™«šG›0œð¦ Ó£÷¨³pÂÓàGèAðûäÞ“ÂE ÿ%Á*.Í/¦/_-‚(©"b É!y Á40j"G"%ª½/ùèŒj™™×M%s/T:¬@êAEBòDdI>KnGæ?€843ÿ.¢)Ã"TÀÞô?åtØäÏÉã¿ð³ªƒ¥À¥3¦ü¢’œ™Æ˜ú™›í›Ÿð¡Q¥ªÐ´QÄ Õ'â™ê¦òŒýw (v#+†"(§,Å/J1á0R.1)#‚Ýe!ä9ú!â ¬‹]W ø:Jœ"$L.J9µ?AnA.DªH©J×FE?Ô7z2>.á(þ!ŠAéôfä—×Ï)È¿!³>©Û¤4¥À¥¸¢g™æ˜Nšª›¶œž= [£ï¦U¬¤¶LÆ<×däúìõ Ê©~ ®$*r.U1 2ü1)/¿)g#Œ”é 7):ð·Ñz+ˆqëÆÌ‘’èeø")-,8Í>@”@cCëGJBF >7µ1n-(2!ºl8ó„ã®ÖÎAÇ)¾\²{¨4¤µ¤f¥„¢Tœ™!™Âš[œ¢0Ÿ–¡ê¤®¨C®¸]ÈtÙ»ækïŸ÷“°q©%!Ë"¼&ô+"0È2Ð3ñ2à/-*Ž#n-P r5¶`}§ðÎK5H3œÍ5Ò! ,7Ñ=??¹?”B*GHI§Eõ=Z6ã0–,A'b ä‘ 2[òªâ¼Õ$ÍYÆU½§±È§–£F¤%¥o¢jÁ™w™V›/²žv  £•¦ŠªK°Äº„Ê¿Û%éëñ-ú)M="’#%´(º-µ14á4º3s0|*–#/¥‡˜,ïiú¦"V*ª¬Î´ÚW¢ ° ñ*6Ñ<`>Ü>ÀAcF‹HñD@=Š50´+`&¯ O|ñÔáÕÔ4ÌzÅŽ¼±B§£é£þ¤u¢›šê™ œ%žãŸÝ¡¡¤[¨~¬f²ù¼ÅÌ!Þ£ëwô¿ü¼Ù¸Ä$ê%'“*c/,3W5Ó5d4Ø0­*}#Ï«›® ‰“3›»Š%]RŠöŒÙ)ú4Û;‚=>å@–EÈG3D€<­4/Ê*x%—Ê lÿšðùàþÓJˤÄÔ»e°É¦¬¢££ï¤“¢æšŠšãœ<Ÿ2¡d£[¦?ªˆ®´;¿Ïxà0î ÷UÿO [3"3'%( )W,ç0€4l6¦6ò41´*@#OF¹„ë`©¨$öˆªôüIïeñ}É(ù3é:¡<0= @ÌDGjC³;Ô3..Ý)Š$¤&Ü ‡þµïà$ÓpÊÚÃ%»Ó¯[¦g¢~£¥Î¢Iž"›R›àt Ÿ¢¥/¨@¬¨°Ê¶ŒÁsÑÜâ¨ð™ùÞÖ ÕŽ$†)C*þ*ù-M2¨5^7U7_5I1ž*î"°r¹`´8¦—%ŠŒe9“¯ÐUñ‡Å'3þ9»;T<9?DEF£Bß:ö2@-í(—#¬-æ ¥ýÑî6ßIÒŸÉǺI¯ô¥/¢r£(¥)£ÉžÐ›6œùžÇ¡%¤Á¦ª[®æ² ¹ãÃÝÓNåóüWLBÝ&«+>,·,w/Ž3ª6 8â7®5W1i*"þˆ«/k°»6'¬  Ý‘Ò;oê½Mò‘Í&29Ñ:l;[>,CˆE×A: 2L,ô'Ÿ"±3ñ²üïíSÞrÑÖÈWÂê¹Í®š¥ ¢ƒ£f¥¥£iŸœœ84 :£Í¥š¨(¬°:µu»EÆQÖËçšõœþȱž)¿-.K.Î0®4Ž7Â8G8Ý5I1*ø!AˆŠñM T ¾:‘Ž]"wñ9ʳLô–Î%148ã9|:q=DB±D A91H+í&¦!·:üÄû ítÝ›ÐÈ«Á^¹l®R¥ö¡®£É¥<¤+ …Xž’¡Ó¤›§“ªM®Ú²¦·ú½¿ÈÉØOê ø? ç N+¿/à/Æ/ü1©5Q8E9‡8ç51±)R!dvZ«¶Þ Þ G]Ô é ½)µ´®Tú™Í$097÷8…9{Ùú0ì¤ÜÆÏTÇÁç¸(®$¥ô¡ô£Q¦ú¤¡Šž“Ÿ £Š¦„©¨¬‰°>µ%ºŠÀVËJÛÚì¨ú•£ M#m-§1€11 3€6ñ8¤9¥8È5×0-) kLWG` ` Îöx¯ž y ] å‚kÍ# /36ÿ7ƒ8;f@ØBD?67ø. )Ì$‘´Döù\ëäÛϣƂÀ„¸÷­.¥¢a¤§Ü¥(¢¿Ÿê ¥¤[¨…«Ö®Û²´·²¼$ÃôÍÙÝgï(ýýò …3%s/l3ú2O2ú347o9ã9¥85a0(´^¦ãÍ Þç_ ‚D .   £ VդÅ ¢Ï".'5ú6}7€:v?çAI>46á-(º#ƒ§A(ùê.ÛjÎÆ À7¸Û­P¥r¢ñ¤Õ§Û¦R£¡n¢^¦Fªš­±Dµ<ºK¿ÃÅ’ÐhàÙñ¦ÿX.¤+'H15Q4]3Ç4À7É9ý9ƒ865Ö/Ò'Â<Ê<dN Ocì ­Þ Å¸¾ j - ¿ ¤×£E¯Î!-!4õ5€6v9€>÷@Q=25Ô,ê&¤"r™;<IøÐé„ÚÙ͌Ű¿¸Ù­†¥è¢œ¥Ë¨¨¡¤”¢¤3¨M¬É¯l³À·Ó¼ðÁgÈ/ÓòâFô¦ S¤)æ2—6Š5G4j5$8ò9ø9D8Ã42/'Ê sÌæÓ Ã×t ­OŒ d`{ <  µ ª îÄkÐÌ ÿ+3î4{5q8€=@Yg:2)x#23~G {ÞõÍçËØqÌwÄú¾ý·z®º¦Ð¤@¨-¬3¬S©«§¡©@®î²ì¶ïº’¿ãÄ-Ê“ÐýÚhêbûÂCë!Ì-&71:o836m6y8­99×6Ò2É,&$ˆO2Vf [dg#½ Š Ø²žæíýÏ å I / ö·(ô/Â1525":Þ©Ò§ü«½°u±/¯ä­$°:µ^º¼¾ÃÒÇ:ÍyÒ°ØÁâ‡ñöö²2(&N14:›<:í6M6 7S857n4ö/•)² ¸.È ¬ ÐäõüýÓnML®ç#<« ˜  ûtF%i,O.¸.ƒ1£6o96¹-ï$¶Ô°jþ`óòå¡×ÎËUÄŸ¿—¹ ±Sª)©ˆ­“²y³W±-°‹²··ù¼lÁÇÅžÊÐ4ÕIÛ1åÂóï½OŒH'42Ø:!=?:Þ6þ57œ7a6v3á.h(ocµ B Gpû´û¼¥ãa5ÿ;ÿ¨í2([η & V $=+-‡-U0}5X8è4™,Ì#ŒrÏ’ãÄýôò¯å‡×â˘ÄÀPº²«œª8¯‚´ µ–³…²ý´?ºž¿"ÄŒÈkÍÍÒì×ÐÝŠçåõÑ^þC(ü2f;o=X:©6Œ5v6Ï6q5o2Á-4'' A »šÅÿþ+úTúŠÿ‘Ú]2þ,þ§öB>xñÓ5 <ú" *Û+D,/K4K7Ó3v+¢"h[Ô² %0ýòƒå‚× ÌöÄœÀ»³Ä¬'¬ ±‡¶ã·ìµì´|·Ö¼IÂ߯QË6Г՞ÚYàÍéô÷¢éÇ )¦3Ý;¦=L:N6ú4º5í5j4N1–,ú%Ú¯Ú 8NýÒøùdþ”åd9ý+ý¯ÿSS•ë8 ô ¼!Ü(“*ñ*Ñ- 3(6Á2O*s!AEãÞ u°ü@òiå×LÌqÅPÁ¼@´®Æ­õ²¯¸3ºW¸a· º{¿Å¢ÉÎþÒTØBÝÔâìèù] _A»!»).49<À=:ß5H4è4ú4U30]+½$‹Lo É­å,ü÷å÷Iý¦úrÿBü8ü»þdg®-ú-× ìx Ž'I)›)„,Ì1ê4¢1$)C 8ñ ÙGü òhåÂ×¥Ì Æ'½–µœ¯‡¯µïº—¼Ûºé¹¨¼0ÂÁÇiÌáÐÄÕ ÛÒß6å+î¿ûø ³P‘"[*˜4r<µ=Ó9]5Ž34õ312å.*}#8ê\7…Ñú:ö¿ö5ü§}þLûDûÄý$mr¿;ÿ¬ °'*&ñ'@(5+Œ0¬3e0÷'8[ Oõûóñ†åØ)ÍÀÆÃH¾·c±f±-·R½¿u½“¼S¿ñÄŒÊ3ϦÓØ´ÝVâ„ç:ðýx îBC#×*Û4—<”=i9¹4¾23æ21 -Ê(&"燙ìÃÿ|ùõô—õ(û¢&ŠýNúFúÇü'ÿpqÁ@þt hÏÆ$&Ü&Ù)G/t20/Ê&äêDB´ Ö»ûøñÅå–ØßÍ™Ç:Ä£¿«¸D³‰³y¹Ù¿¹Á%ÀQ¿ºÇ[ÍüÑeÖ1ÛPàÇä·é+ò%ÿÅ Î#*+õ4Š<[=å8ú3Ó12È1Ì/V,x'Ï " -‚\»ý2ø²ótô&ú±ÿ9 üSùHùÊû(þoÿj»<ôï; xb#'%|%o(þ-A1.¢%ÆÕ[„ p–ûò æ(٭ΣÈ{Å"Á`º5µ»µÝ»|ÂsÄåÂÂàĈÊ-ÐÂÔÙÓÝÕâçÌëûó¬ûÿÄ3$W+ð4M<=L8#3Õ0ä0”0.+%&|9È ÂÿhüôötòLó)ùÍþZÿ¿ûXøIøÌú&ýhþ^ÿ­0ßÎË%"º#$'µ,0à,ƒ$·Õ€Ø  "ƒûVò–æÕÙ™ÏÍÉׯÁÂ+¼5·ù·R¾&ÅCÇ´ÅèIJÇUÍúÒ×ÀÛ_à=åYé¼í©õÃM o$\+Ì4ø;}<›762Ã/¹/V/C-·)Ï$'åz hÆþ¶ý"û½õXñ#ò.øñý…þåúr÷J÷Îù%ü_ýNþ—ÿÀ¡×Ô¥ N"¡"«%a+ø.Ì+r#´ë¸E= òûŸò/ç¤Ú¥ÐËUÈwľK¹FºÕÀÑÇ#Ê•ÈÀdžÊ#оÕ6ÚYÞÕâ‹çvë™ï,÷V n´ ‹$:+„4‹;â;Ó611š...ò+_(y#ט0 &sýrüëù”ôGð'ñ:÷ý¸ýú•öUöÐø$ûXü>ýþþÿ™j“*bGâ 5!I$*Á-¹*e"¶ ùÁ ïÝ´ûóÙçŠÛÈÑxÌêÉ@ÆÀ»±¼pÊÊóÌzËŸÊ^ÍñÒ}ØäÜèà<åÁétí]ñšøqÝòû ¢$+(4;(;ñ5+0d-8-¾,™*'%"‰Jèéÿ8ü4û¸øró@ï;ðSöSüéü:ù·õiõÐ÷úLû+üdýÖþjÿ*FÌ êÉsÈë"·(w,£)]!Â5LE ¸ãùûŠó¤èšÜÓõÍžË(ÈKÂϽ/¿!Æ\ÍÙÏoÎÍ8нÕ6ÛƒßcãˆçÜëVïóúùk\$!—$Å*´3j:b:ÿ4/),ë+l+A)¦%Ç B ¬²þûõù”÷Zò<îLïoõ€û'üføÒôvôÍöù:ú û9ü¤ý6þâþí_ g:ùP‚!d'8+|(^ Ôj²å •Xü1ô–éØÝtÔŽÏoÍ2Ê“ÄWÀ¹ÁãÈDÐÓÒpÑxÐ Ó„ØæÝâÄåµéÚíñ…ô3ûJ ©-!f$_*3Ã994ö-ë*˜**ç'G$kîÔx‚ýÑùÂøpöMñ9í[îŠôúdû–÷íó€óÈõø!ùâùûjüûüŸý‡é á¬xÓ &*f'mö´0ž ‰3Ôüúô¬ê6ßÖHÑbÏ\ÌôÆîÂwİË:Ó×ÕtÔsÓäÕBÛ‡à‡ä èÈë¼ïÂòäõDü~Ü!$Ø)a2ö8²8ö2Ê,§)A)Ä(&ë"¦¡LXü«ø÷SõHð7ìgí§óÀù‰ú¿öóƒò¼ôîöû÷®øÈù,ûºûZü#nZ óc›Ä$ß(d&=És š„qýêõäë±àÍ×5ÓvÑ£ÎhÉÅ@ÇÎ@ÖäØw×gÖ½ØðÝãäæ4ê½íwñDô÷/ýž»Öâ ž#3)‘1ý7À7à1”+[(ä'`'5%–!Éhv 28û’÷ˆöCôNï9ëqìÅòéø³ùêõòñ§óËõÌös÷ƒøåùoú ûËþðÔ•mñ>ƒ#Ð'x%ÆŸ”{d Ë÷*þûö>íJâ£Ù>Õ¢ÓÑïË;ÈÊtÑDÙüÛ|ÚQÙ…ÛŠà‡å(éAì’ïó¡õ)øñýÜ©ˆ #p(¯0þ6¨6¾0N*'ƒ&ý%Ø#F †6X '(úö€õCó\î]êzëëñøæøõ%ñpð‹ò¡ô–õ3ö:÷™øù®ùfýxRêèI"Õ&ž$ 1Dn  ‹ÿø·îüãÛ_×çÕvÓˆÎöÊïÌhÔ8Ü ßuÝ-Ü=Þã×çKë.îHñˆôØöùˆþcÞ` ["ž'Ã/ñ5~5ˆ/)«%#%š${"üSE %9ù„õ‰ôPòsíŒéºêñV÷ø0ô<ðkïmñnóSôêôïõJ÷Ã÷Gø÷ûü½ gŸ!Õ%Í#YŒç+• } :eùEðÇå”Ý›ÙIØ÷Õ3Ñ¹ÍØÏj×7ßüá_àõÞâà‚å êGíòï×òÝõí÷îùÿ‘Åÿs¢!°&É.á4N4E.¶'M$Ê#@#"!®"A .Pø¢ô¡ókñŽì³èòéUðœöA÷IóFïfîLð:ò ó”ó—ôðõhöÞö†ú€. ë¥Yþ×$#Á ¶5Ú !Ïúùñ¼ç³ßîÛÂÚØïӀлÒmÚ@âóä?ã¢áfãÖç%ìï‹ñ7ô ÷Üøœúrÿ ’‡¿È ½%Â-Ð3 3ÿ,h&ó"q"î!ÒhðøK Bÿo÷Æó»òŒð¦ëÐç é‰ï×õxö_òDîSí ïñ·ñ3ò5óôõnõù¨ oq<õø#]"AÉ^B ´ ýb`üÑóÖéõáYÞWÝ;Û¹ÖoÓœÕuÝPåëçæKäÏåêîÔðþòqõø§ù#ûµÿ™HûôÓ±$¤,¾2ð1±+%!!¡ ‰(Çéb]þ’öðòÞñªïÃêêæGè»îÿô®õsñ9í7ìñí¹ï`ðÌðÌñ,ó§óô’÷Šÿ) ëþÛâý6#Æ!Û‰ž§Î  ÂþÈõ ìaäÚàþßúÝŒÙ]Ö¡Øyà_èÝêØèáæ%è(ìøïfòMô…öõøNú„ûÒÿoÎXÅŽ#p+1Á0c*µ#E Å\Jô¨åy‚ý¼õ!òñÆîáéüåfçèí)ôÈôƒð(ìë¸ìlîïaï^ðÄñEò¬ò#öþ´w™¸’"S!š}½}q ? @âÿÜ÷Xîáæã·âÇàfÜIÙŸÛvãjëÈíŽë^édêî°ñ×ózõt÷ªùÐúÃûÏÿ(9ˆ£W",*90…/)X"én É唳üèôQñ2ðäíéå}æ íJóÝóŒï ëâétëí¤íöííîYðàðPñÍô¥üJ Gu¿Q "ü xš ›O† — ÛÎú»ðté2æsåœãFß<Ü¡ÞmæQî›ð*îÀë†ìóïDó&õˆöEø>ú-ûàû­ÿÅŒ• u!å(à.".¿'ü “Åݪ‡ò ¸ñû%ô‡ð`ïí)èJä•å2ìkòìòŒîüé«è-ê¿ë?ì‰ìzíêîvïîïróEûèµ ÿ Xؘ!¿ mÍ€GA¹ “ÄNü1óìôè>èpæ(â'ß–áXéñUó¨ðÿí…î¨ñ­ôPöl÷ìø«úeûáûdÿBÉ•ê6Ï™'‹-Ã,f&š>Ø‹°’Š î;û~óÉïœî3ìQç|ãÎä[ë”ñÿñŠíëè~çêèiêÙêëì}íîŠîòèù„o È Gþñúðú¸úBúÁüxõ ø²°· Ü&R&ü]ð•È bë÷7ðfìÓêèãíÞ(àæìâì è ã?á9ârã¹ãËã¢ä,æçÅç{ë{óWýŸÌ9 í« {!¸‡¦ðwA%º† ýPú¬ùÌ÷ló,ðòù18ýøø¹÷ùuú‰úú&úžú:ú–ùîû|È £ZKŸMp%ó$Ä0Þ©÷V Z¼X÷›ïºëêDç'âÞßmåpë¸ëóæ×áçßÑàýáAâSâ&ã¸ä å|æNê`òQü»½ °ü "Ž¥}C†~JQfNý–ü¢ú/öÎòŒô`ûÛþTúÌøÖùîúÊúúìù/ú¤ùÞøûn“ Mýã3ë$¥#”ëÜÍ/ž °!ËöïëUépæEá+Ý"ÞTäSêŒê¾å›àÞfߊàÇàÖàªáEãCä8å$éKñKûîqU ‡%^!Ç"ƒÛz)/§Î ëS DyÿiýáøQõãöƒý÷ÀV…û·ùwúHûèúÿù’ù¨ùúøø úPXú ¢Æ‘Í"m"rûàê4ÿní ÿ?ö„îoêšè¡å^à6ÜÝ4ã9écéƒäUß<ÝúÝßLßYß/àÔáíâùãèFð_ú-ê uTÊ!Ÿ#™- ñ(ß3•šñD ü4T#û´÷ùƒÿ¿L­ü|úõúûäúÃùù ù<øC÷ù/ÿ ª E8r>”!C!^ë]7´< yÿ°õòíÏéØçÌäkß0Û Ü â è8èEã ÞãÛŠÜœÝÐÝßݽÞoà¢áÇâòæ[ïù}zɤ]"z$Ï ·Ò8 $!ª 1XÌ:ð%Êÿýúûaj¼ã‡ýûRûšûÂúlù–ø]øn÷\öøþì` ë ß ïn - U  %“{“ ÕtþõXí&éççãmÞÚçÚÔà½æçâ³ÜÚÛÜQÜcÜKÝßcàªáëåîÜøï%© #%!""xÊa"{#-#Û!#¯-ë ÷èafQü#ý#ý ø]þ¤ûŽû•û‚úúøù÷÷öcõ÷ñü© ” ˆ Õ«E&W#6WÔÇ[ ô 9Þý†ô¶ìvèCæóâdÝöغÙßqåªå¯àTÛٟٖÚÎÚèÚäÛÃÝ3ߦàå¼íGø€îÀç°û#¢&#ÕXÞ!œ$Ý%¹%’$ù!“ÕÐ ™ ß«kþÿÊs ? äÿü±ûrû"úoøK÷Ëö¥õ]ôûõÊûfÆ> 3 ’s#bCn—· [ £Fýîó ì¾çqåúáWÜÇר`Þ#äMäTßêÙ«×(ØÙKÙsÙ‚ÚÜÞ²ß?äíÑ÷5Øóep %î'%ª!\! $ò&T(R(H'Õ$yü±“* D Ð[ÐIº S ­™ÿbü±û1û§ùÅ÷öâõ©ôJóØôšú!jéÞ OEëzk­ãcp óü^ódëç™äþàCÛ°Ö:×ÝÚâ÷âøÝŠØ6Ö¯Ö”×Ñר'ÙGÛÝÒÞ‘ã’ì|÷ áB NC&d)É&•##T&_)á*ú**'^"Ø}A¢ Ò!d¢È A Tûÿ„üûÎúù÷›õåôžó5ò«ófùß•Š Û›–ï 7½Ï .| üÊòÌêBæÁãà(Ú‹Õ ÖÙÛ—á¥áœÜ,×ÈÔ9ÕÖbÖ¨Öà×!ÚÜÞüâ.ì<÷ ¬ ·I'ý*(“%³%­(ß+{-ª-Ã,c**%¢3×™°»ÎØ» ñ Ö6…üRûTúkø2ö§ôÜó‰ò ñƒò4ø§ÿÈDOÌ Ü%ÅØ6 ‘ 3 å –è‡û+ò(êˆåãâûÞÿØVÔÕÔÚUàTà=ÛÊÕdÓÈÓ°ÔýÔUÕ§Ö Ù ÛPÝâèë÷W4 ‹câ(²,v*©'ú'+c.#0b0…/(-í'` ÒUH—p / æ Ž† 7QhüúúÂù«÷Lõ¢óÈòmñðlñ÷vþ‰þ­ øïIý*Ž ò ƒ ™ J øUîú‡ñxéÄä÷áñÝÍ×ÓŒÓ:ÙßßÞÙgÔÒ_ÒIÓ Ó Ô~ÕØRÚ³ÜâÁë'÷IÃÙ {Y*c.s,Ð)P*’-ó0É23F2é/§*#]³ou ›Ñ Fy[*ü‡úù×öWôòªñKðãîNðâõLýTÂê– ñ?õ X ï  ³ \°UúÝð¿èõãáØÜ•ÖÅÑ<ÒáדݱÝ~ØÓžÐúÐæÑOÒÕÒiÔלÙ8ÜÏá²ëL÷™OŸ ‰ö í+-0.,´,0‰3o5Ô55¤2S-©%Ýõw2† æ5Ÿ ÞW˜NÞûú^øñõVó|ñ‰ð$ï¾í-ï¾ôü&Ç÷6¼‡Þ f É ` n  ¼§ù)ðúçãà¯ÛUÕnÐæÐ…Ö#Ü5ÜטÑ@ϣϒРѪÑfÓKÖÙãÛ§áÂë•÷þœ ´r"¤-2œ0Y.&/­2.68€8¸7V5ò/-(>!!bÓÝ )T f˜™„ûmù—÷ýôEò]ð`ïýí–ì îóêúôÿ`¥‹ LÐ7 Õ > Ê Ø z]ôøpï(ç6âÿÞÚÔ Ï‚Ï+Õ¿ÚÂÚ§Õ)ÐäÍUÎMÏØÏ’ÐuґՄب۳áõëø¨É® $/4Ê2¼0©1L5Ù8Å:);[:ü7~2—*€#-#R þ õé ÆÃÓÿ ûÄøÁöþó+ñ6ï3îÒìkëèì‚òÆùÁþ6„‹*u/ B ´ 8 = Üs°ÿ:ø³îVæLá÷ÝMÙÀÒ»ÍÎÎÓbÙXÙ>ÔÍΊÌÍεΓϜÑïÔØ„ÛØáUì”øb¬Ô…Â%196 5)3?4ó7‰;q=Ï=ô<}:ö4ä,¤%!Ç¦Ê š _ ÷ÓLnÿ€ú øØõôò ð îí¨ëJêÇënñ°øœýÿhŽU±psé ° * ¥ ž 7Êÿþ}÷ìí‰å[àëÜØiÑa̼ÌrÒØù×ßÒÍEËØËï̧ͪÎåÐkÔÕ×}ÛâÔì=ùC±  ‡'ˆ3r8]7ž5×6˜:8>@g@z?çìÍãuÞ´Ú•Õ¢Î“É Ê¹ÏeÕJÕ/ÐúÊóÈ£ÉáÊÓË,ÍÏϼӞ×ÇÛõâ1îêú7 áoa+š7ã<<›:<ã?lC=¬>‹BF¶GÏG—F˜Cr=Ô4Ú,h'õ"‚âÄ à Ê« ƒý¡÷¬ôæñ’îhëTéYèç æÐç…í¿ôùÿú¹üKu !Ýí© ” ZcËØû/ôpêçágÜ[ØëÒÂËžÆ;ÇÍšÒ“Ò“ÍŠÈÓÆÅÇ5É`ÊÌÏÓë׫ÜHäþïý£Ô!‰/ æCgC.BÛCÍGK…LKLÎJšGA8¸/Ê)Å$Á… Þ ¹ ;¹ '|ûêõÇòÒïEìýèìæ æñäÿãêå½ëôòº÷1ùöúÅ# Ф¶ pxô¤Õ ÿúYò‘èÞß:ÚøÕ<ÐéȰÃFÄRÊÐþÏ'ËQÆçÄ6ÆìÇ[ÉTËËÎÀÓ¶Ø Þ9æNòËÿ– ±"%ý3ß@]FåEÀDzFaJšMÕNmNÁLYIºBƒ9ô0Ë*u%"¡í ³ i ¬ ]œúõÊñ¼îëÎçÁåæäàã ãåêêòÕöUø!úˆ /ø ÐçbxåEþ-ù_ñ–çäÞ ÙÁÔÜÎtÇIÂ÷ÂÉÃÎÄÎÊ_ÅÄ‘ÅlÇÉ/ËáÎ ÔDÙáÞ\ç©óB8 À›H'G6JCÛHcHJG IâLPQvPšNøJ'DÇ: 2©+&^œ´ g  N ƒ®ù ôÈð¦íú颿œäÌãÖâ!â)ä!ê[ñö†÷mù^ÿöœWv :MÈË -dý@ø`ðæÝÝ ØÓÍýÅÜÀ¦ÁÃÇšÍ ÍøÈ€Änà ŠÇÌÈ-ËÏÔôÙÔß—èõÕè ‘v)š8EXKÚJÅIŒKLOAR(S^RQPyLpEç;ö2b,y&~‚Y ù „ j{ Ÿ³øóÈï“ìÚè|å|ã½âÙáBákãdé¨ðDõÀö¼øÇþkºÒ ¢²*OGoüN÷]ïåËÜèÖJÒ!Ì€Äf¿RÀ…ÆuÌ’ÌûDZÃÚÂ¥ÄÎÆ´ÈFËsÏÕÌÚèàíé­ö‡«t•°+ü:H¹MNM1LúM¨QpT#U(TéQàM£Fî<Å3ø,Í&„K l ô ¾ ¥ °»÷òÇî…ë¼ç[ä]â´áçàkà°â³èüïôÿõø+þÛ˜&* û†c|YÿoûAöZîpä°Û¼ÕÿмÊÃí½ú¾NÅJ˘ËÇñÂVÂ[Ä´ÆÀÈ}ËãÏËÕÆÛ%âYëPøP‰p£!ê-c=yJ$P·O‰NQPòSVWÏU]S'OºG×=4k-'tý• âN ˼ÿ¿ö ñÆí~ê§æ=ãHá°àþß›ß÷áèIïäóGõS÷ˆý> ” Njج¦fþjú/õEíZã’ÚÔºÏZÉ”Áx¼§½Ä-Ê’Ê?ÆKÂïÁ0ĸÆòÈ×ËvОÖÛÜ„ãçì ú0|}Ú#,0Í?êLŠRRèP™R$V‘XËXWWµTNP­H>5È-#'H– J“ ? ß¾þÂõðÅìvé•å,â?à²ßßÏÞFá_ç›î3ó”ô£öéüžOôÒ œ¼ÝÈoý`ùô%ì@âmÙbÓwÎÿÇ9À »Z¼öÂɠɆžÁ¥Á#ÄÞÆHÉ[Ì*Ñ× Þüä¢îäû- ‰ž&‹2:B]OïTvT?SÓT>XxZtZÃXâUSQ{I>?5.'j ’½ W ìºýÀôïÃëqè‹ä"á;߸Þ4ÞÞœàÆæýí„òåóðõCüú™ 0 å`àÿvüSø÷òýê"áLØ9Ò<ͪÆá¾Ñ¹»ßÁ'ÈÍÈëÄbÁ{Á6Ä#Ç¿ÉÍÿÑ™ØS߉æqðÝýF «Êb(é4žDÔQPWÃVUþV?ZD\\ZñV"R*J¼?å5).ö&¢u§ Á×M ñ±ü»óîÆêmçƒãà=ÞÈÝ[ÝLÝôß4æjíâñ@ó;õ—ûVè q f"Kž.íþpû?÷ÙñØéà6×Ñ ÌcÅ“½™¸ø¹ÚÀMÇÈmÄ+ÁzÁnÄ‹ÇTÊÌÍùÒÂÙµà'èLòâÿ^àþ!£*=7ñF0T¦YüX¥WY\ï]g]6[ÝWÒR¬J@6,.½&'ÅÇÖâA ×¥û²òíÒétæˆâßJÝåÜŽÜ¡ÜWߨååìNñ¡ò¡ôåúµA ¸ ªg„ÕOõýdú*ö¾ð³èÝÞÖôÏäÊ)ÄN¼g·ì¸í¿™ÆˆÇÄÁ£ÁËÄÈ ËµÎÔ Û/âÕé3ôó‚2$Û,…99I]Vä[[¤YéZÌ]e_©^:\§XcSKN@#6.m&™ ÒÖä9Äžú©ñ'ìåè†åšá1ÞdÜÜÍÛýÛÔÞ'åmìÃðòôFúœ  ë­¾ÿnÿúüTù õ ïŒç·ÝÕÚξÉý»=¶è·¿òÅÇÑÃÁçÁIÅÊÈçË»ÏIÕlÜÁã˜ë+ö³Dl& /¾;sKXð]]„[ª\`_¾`Ç_]KYÏSCKl@6Û-&ù@öÄÙ-µšù°ð0ëÿç¥ä»àV݇Û@ÛÛeÛZÞ´äúë?ðmñeó¥ùc÷ I 'éöþ3ÿ‹þüCøäófîaæ“ÜéÓÅÍœÈÕÁê¹&µú¶E¾EÅÂÆ­Ã.ÁHÂãÅ—ÉâÌßЕÖÞÝeåtí2øAî| «(@1ô=¥M—Zæ__E]K^Õ`øaÃ`Þ]ÒYT\Kg@ü5Ž-Š%Dc ÎÐ#¥•øÃïGêçÊãå߈ܿÚxÚ\ÚÍÚãÝGä}ë¼ïÏð¾òþøª< ‰ W%þRþ£ýû2÷Áò/í(åkÛÕҽ̌ǺÀи´"¶ž½ÃÄoƧÃjÁË ƃÊüÍÒü×ißçhïOú‚<½"å*ƒ3@ÎO¢\ÈaÌ`ô^Ï_-bca|^:ZJTVKA@Ã52-%€qÓÉ#›’÷ØîpéLæøâß½ÛýÙ¸Ù§Ù2ÚjÝÝãë)ï$ðòLøíZ ¸ u8ÿJýký¥üûùöžñûëîãDÚÂѿˌƮ¿Ò· ³aµ½iÄBÆÃÃÂÁnÃÇŽË2Ï}Ó}Ùáäèhñ‰üÓ ˜%-¸5QBôQ¦^˜cxbˆ`8ahcdYbþ^ƒZgT:K@p5Â,^$¬l ýÍÀšÿöëí˜èzå*âEÞ÷ÚBÙÙúØ—ÙðÜsã†êîsïCñ÷,|‰Hþ_üyü ûèøõyðËêºâ&Ù¸ÐÈʛŵ¾æ¶c²®´³¼6Ä?ÆÄHÂ,Ä|ȸ̅ÐúÔÛÌâÄêwóÊþ, ýR'K/Þ7pDûS¢`\e dùa‚bƒdïdøba_­ZTT Kª?5:,§#É\ Ü·ÿ¯žþ“õýìÁç¯äcá€Ý8ÚŒØTØYØ ÙrÜãêøíÈîuðÀöd¤Ô˜IýiûƒûšúÐ÷àóSï¢éáØÁÏÞÉ¿ÄÖ½¶¶±5´j¼-ÄfÆcÄñÂÅšÉÎòÑÖÐÜäµìõ †R¢)r1ì9rFâUxb g|e@c¥cse³exc£_·Z'T²J9?€4£+é"ÛF ¬—þ¡òý—ôìïæðã©àÈÜ}ÙÚת׻׈ØûÛœâœébíî½ïêõšÿËáŸRünúŽú–ùºö¼ò+îyèià××Î Éúà ½Qµ"±ß³D¼HÄ«ÆáĸÃÆ×ÊhÏzÓ5Ø—Þzæ¬î­÷Vå ×+Š3ì;dH°WdhËfidªdCfEfÚcÈ_¢Z×S7J²>ì3ý*"à8 }wý’ÿÞ|ü¤ó+ë(æ:ãøßÜÕØ/××× ØÛ8â)éÉìaíï*õÊþéè¤eûyù”ùø¦õñÿìOçDßùÕüÍJÈ9ÃU¼¦´¤°ž³/¼mÄÇÅŸÄ@Ç+ÌéÐÕ÷Ùqàbè¯ðÓù§Gë"ÿ-™5Ú=H3H*D!Þ$ tÿNü€þÔÿzûÀòcêkåŽâTßÛ?ØÖ]Ö€Ö‰×;ÛÙá¿è6ì¬ìAî_ôéýí¤ÿlú‚ø”ø†÷‘ôðØëæ%Þ÷Ô&͔Nj±» ´4°l³3¼˜Ä“Ç>ÆŸÅÈšÍ~ÒÓÖÉÛYâZê½òüó¨<%'0¡7¯?÷KûZÚfúj iRfKf‚gg6d¿_-ZôRIh=˜2†)j Û ]þ@ûtýÙþˆúæñ«é¿äñá¼ÞëÚ¬×ýÕÂÕéÕ×ÑÚsáAè§ëóërí†óùüõþhù÷Š÷}ö{óbï¸êøäÝÔ[ÌîÆöÁ'»“³Ö¯N³U¼ìÄ"ÈǹÆÙÉ$Ï+ԞةÝMä_ì×ôAþ@ †'H2˜9‡AMw\&hlúigãfïgCg2d‡_ÊYiRSH©<Ö1µ(ŠÖê=ý,údüëý§ùñúè"ä\á-Þ\Ú×pÕ0ÕXÕƒÖcÚá½ç ë4ë–ìòüþ–ý\øwö{öfõfòGîœéáã Ü$Ó£Ë^Æ~ÁÀºM³’¯E³“¼iÅÜÈÈëÇGËÄÐïÕ€ÚšßIælîøö}” NÆ)[4y;[FÚQ `ak®nl¸högqh:g…c@^õW$PÔE:K/&™¬„ÍùîöHùòú÷ÕîçsâÎß²ÜáØÕÎÓ{Ó°ÓÕþئßæùèÝèëé±ïøø¹ÿŽÿKúõ:óDó!òï ëræÛàRÙýÐÊAŹÀ1º'³°:´¾¬ÇÃËÏËhÌOÐFÖÊÛšàæå§ìÊôlý*q" 0:‘@ÃGSalHonlýhh[hïfc¥]1W9OÕD9[.#%–“o¢øÞõOøú3ö!îhæõá[ß?ÜmØÕEÓèÒÓÔØ(ßå8èèé½îð÷þ^þ!ùÿó$ò1ò ñ îêvåù߉ØgÐÀÉŤÀ7ºI³k°Ô´æ¾ªÈüÌ@ÍÎ4ÒHØæÝÄâèàîýöÿ[ ª+$þ1Í;BI+Tøaœl¡o·lih*h‹fŠbö\^VGNÐC!8f-1$—[§÷Ìô_÷!ùfõxíàåyáîÞÒÛüמԾÒWÒ†ÒöÓØœÞçäwççè¼íØö…ý2ýô÷áòñ"ñðíé‡äߨ׿ÏzÉÅ«À^ºˆ³Û°‚µÈ¿°ÉRÎÇÎÙÏ&Ô[ÚàøäPêñ0ù͉ Í;&ß3n=xC$JU¹bmåoÙliðgãgfæa,\xUIMÄB7n,:#s K©öàóö\ø­ôÙìdå áÞoÛŽ×&Ô>ÒÇÑñÑfÓ‡× Þ:ä·æ0æ ç¯ì·õeü üÃö½ñüïðïì è¦ãUÞ9×xÏIÉÅÔÀ¦ºê³\±D¶ÈÀÛÊ«ÏaЦÑ'ÖÜCâ4ç‡ìNóbû÷± à7(¬5÷>ÁDµ³2¸%ÃͤÒßÓŒÕ^ÚìàÆæÅëñº÷¥ÿÄßä+ô8¦AíFMEW:dòmþo„l~hìfuf%d}_`Y^R÷I\?Ó3k)N ¡c 1ýÊóSñ ô ö­òëäóßyÝPÚPÖÆÒ·ÐÐÐŒÑÇÕ;Üâ"äXãéãzéRò øIø2ó]îáìíìXéåá{ÜÙÕÛÎtÉØÅÂC¼¶´u¹ˆÄ ÏOԼդגÜ7ãéî\óîù³ ¦±-\:ÚBÒG°MºWidñmÎo%lh[f½eZc^WX?QÁH%>¬2a(W¨h 5üÕò~ðMóQõò™êŸã˜ß"ÝñÙèÕKÒ,ÐjÏiÏêÐ Õ”ÛLáCãbâíâXè1ñn÷ ÷òIíÝë-ìDë“èóä÷àÜžÕßÎÁÉ^ÆÓ½·>µÒºƶÐÖ¯×ÇÙ×ÞŒåpëcðõü½ì pe!/¤;åC•H2NXwd²m€o¦klgªeîdmb“]@WPŠGî<†1R'a¹yUûßñ§ï–ò§ôdñê.ã>ßÑÜšÙƒÕÏÑ™ÏÆÎ¹Î<ÐxÔäÚàfâháäá?çðDö×õÛð<ìãêRëêåç\äàÍÛÕûÎ"Êüƞà ¾¸u¶8¼ÇpÒý×°ÙïÛ!áçç×í¹òÙ÷8þ¹Å ø"†0Ö<ÑDBIN.Xgdamún k³fâdd{aŠ\!VæNRF·;d0B&kÓ—ú ñÍîáñôÒð£éËâäÞ…ÜJÙ#ÕYÑÏÎ΄ÏÄÓ&ÚÑߊánàØà%æÞîõ¦ô´ï3ëøé„êÒéOçÞãàÛxÕ3ϢʷÇÄ¿B¹Ç·µ½)ÉÔèÙ¼Û"ÞrãEê8ðõúH†¿s$Ö1å=šEÓIÔN:X7dílVnXjæe d(c|`x[þT±ME{:G/G%ƒôº´ùsð*î8ñióBð/évâ’Þ7ÜøØÅÔæÐqÎdÍ=ÍÄÎ ÓbÙïÞ àmßÍß å¥íãówó•î5êéºé5éÑæ|ãÖßdÛ‰Õ‰ÏE˕ȄÅCÀº4¹K¿×ÊØÕÈÛÔÝ[àÅå¡ì“òc÷CüJj (HÐ%3Ñ>@FCJO&XëcblœmŽiec+bo__ZØS}LÒCC9-.Q$ž!çðøÊï‘í•ðØò¼ïÂè"âFÞæÛ¡Ø`ÔmÐÚͬÌmÌ÷ÍHÒ“ØÞ¥ßcÞ·ÞìãlìòKò{í=éAèþè™èdæ3ã®ßaÛ¼ÕÐ̔ɪƌÁ¼µºóÀœÌ¯×½Ýüß›âèþîéô¨ùfþ9# ±°'4¤?ÊF‘J4OX†cÄkÒl±h+db"aY^>Y¬RCK›B8-`#ÀJ!3ø"ïöìòïEòAïYèÍáöÝÛGØ÷ÓìÏ:ÍìËœËÍwѼ×Ý¢ÞZÝœÝÆâ5ëEññmìNèvçSèèæã£ß|ÛÖ¤ÐæÌ®ÊïÇö§½¼§ÂoΚÙÈß3âïätêZñ>÷éûà ö4(ù4Z@;GÅJ1O¿WúbkúkÃg2ca `?]XQ JXAã6,o"äua}÷yîUìOïœñÉîðçqážÝ/Ûå׊ÓbÏÌ#ËÆÊ@Ì•ÐÙÖ Ü¢Ý[ÜzÜšáêðêïpëhçºæÁç¯çÔåôâ¸ß¼Û†ÖaÑçÍäËSÉ~ÄW¿U¾‰ÄVÐÛåáqäIçÏì·óŽùþ…áKl))¶5Ú@’GÙJOVWKbIjk¾f"bú_å^"\÷VOPÑH@¹5ò*!®ªÐöÊíµë¶îñ?î„çáEÝÔÚ×ÓËÎÜËVÊçÉ^Ë©ÏðÕ0Û£ÜTÛtÛmàÜèëîÒî}êžææJçbç²åüâíß!Ü×9ÒÏ7ÍÛÊ!ÆÁ4ÀƒÆUÒ»Ý䳿¢é/ïöÒû9r” ¼šþ)Y68A¼GÅJ´NÍV†aFij£eü`Ð^²]ìZËUO›Gè>“4ë)™ J÷ý9öíë*î}ðÀíç«àèÜuÚ×—Ò3ÎËÉþÈvÊÈÎ ÕCÚ¢ÛGÚgÚWßÂçÙíÌí™éêå~åææ.ç¬å!ã:à ÜÏ×.ÓAЫÎrÌÚÇæÂ"ŠÈcÔÞßLæûèúë‡ñUø þIK, ­îµ*ß6xA·GŽJAN)V©`.hÚhrdÆ_™]v\®Y–TëMfF²=k3ë(¾‘KV©õ¬ì‰ê§í÷ï@íµæTàŒÜÚ¤ÖÒ¡ÍfÊ È È‡ÉåÍ"ÔWÙÚ;ÙbÙTÞ¬æÍìËìÁèLå åšæçÀågãªà3Ý–Ø:ÔšÑ=ÐÎ¤ÉÆÄ$ħÊ~Öèá}è<ëMîÚóŽú= ­ BŸ¬ J+G7›A“GÞqÚ¾× Ô,ÏBÊÆÄÃvÄÿÈ^Ï`Ô†Õ&ÔXÔfÙáá%èÁè¤å9ã䡿)èøç¦æÔä(âuÞIÛêÙ™Ù&ØÔžÏHÏáÕ´áÿìqóUö\ù‘þ°l ‘ 0eqcq"7,A7{@MEëF™IpPØYq` `(\½W½U¿T5RkMG§?7!-b#7ÅÕ ÿ”òÈéßçÆêÞì0êàã·ÝëÙ-×mӃ΃ɡÅÃýÁjÃÈlÎjÓˆÔ5Ó‡Ó¥Ø%átç+èIå)ã5äýæÀèÌè°çæãñßÿÜáÛ¹ÛXÚIÖíÑ«ÑJØä7ï›õoøjûl ì H/æ_",ã6Þ?xD÷E€H;OzXä^_§ZMVcTsSüPML÷E¤>61,š"’@Y þ,òwédçIêQì›éWã4Ý_Ù›ÖÏÒØÍÅȽÄÂæÀYÂÇnÍÒ™ÓSÒ¾Òî×pàÝæ²çå-ãxäyç{éÁéÕèQçëä‡áËÞçÝæÝ–Ü™Ø@ÔÔ£Ú@æLñ¶÷súZýO o &8Ï4›2"«+b6(?‘CóDKGìM WT]j]!YØT S2RÐO7KôD­=!5Q+Û!÷Åë #þÇñ!éçÐéËë éÊâ²ÜÕØ Ö3Ò*ÍÈÝÃÁοEÁÆt̊ѺÒ{ÑûÑ@×ÉßYæWçÞäJãØäè[ê×êê¼èxæ>ã«àüß%àéÞùÚŸÖ[ÖõÜ{èaó­ùbü.ÿ“ ¼ 7Ld†é!/+Ä5^>˜BÙCF‹LšUÇ[Ï[™WiS±QöPªN%JôCÀÑžÖ9ßÕåçÌä{ãOåÈèMë ì{ëFê$èå¤â!ârâHábÝÙ­ØBß¹êxõŸû=þã™û í*­ªvT„!ž*5=ŠAªBßD0K(TAZ;ZVþQZPÀOM"IC×;h3®)k É KýîðVè7æØèÅêèçšáˆÛ§×ËÔæÐºËeÆÂ¿£½¿ôÃˆÊ©ÏøÐáÏ‹ÐÖÄÞtåÜæÔäÄãàå›é_ì\íþìîëêéøæºä]äÓä·ãÑßÛ-ÛŠáñìŠ÷‡ý‰D þÿ>èdûú ï)243k;/?@+B[HQ&WWS-O¿MWMvKBGFA(:½1"(»Ü(jüðqçQåÉçsé–æLà:ÚRÖbÓoÏ;ʽÄ2Àû¼v»ñ¼óÁ¹ÈîÍZÏŒÎzÏ)Õ!Þå¿æIå¼ä[çšëÞîVð]ð‘ï·íüêéé½éºèÂä}à$àNæCñ~ûO’² ~ÉT âàˆE(923:à=³>Ç@ìFƒOnU|UzQÉM|L,LiJbFy@d9ø0k'u<s¼üû¨ïöæØä<çÃèÔå•߃ٟըҫÎpÉäÃ>¿í»]ºç»ÁßÇ&Í¢ÎùÍÏíÔúÝó䨿¨ånåIèÉìHð÷ñ,ò~ñÀïíYë{ë7ì6ë=çëâŠâ˜èOóTý¹Æå× eÍ@ÿ}7¥J'"1ó8ƒæ\éîÏñ±óô€óÖñGï¥íèí·î²í¸éSåÞäÊêDõþþH$Ý /$QÇü{²5&õ/§7 ;æ;Ô=íCbL R4R~NKJýIqH¥Dñ>ô7’/&RA£ð(ûÞî?æØãædçSäÞØ,Ô/ÑÍÐÇ+ÂY½×¹6¸Ú¹)¿1ƸËwÍÍάÔáÝ6åyçÆæ&çŠê{ïxóŠõöšõô‘ñð`ð>ñ8ð7ìºç çæì'÷šªa' » ×yU>m]£°%¶.O6²9q:e<_BÔJŠP¡PM½IÝHðH‚GÐC0>G7ê.v%¾Â.‘»úkîÌå\ãs弿“ãUÝZ×kÓjÐSÌûÆKÁn¼Ý¸%·Ø¸I¾sÅË÷Ì´Ì`ήÔÞuåþç€ç)èÓëýð.õ|÷&øÍ÷JöäódòÝòÐóÃò®î!êGéîîÿø+õ} x ]Ãcú¥«‘Ñ#r-õ4:8í8é:á@UIOO•KuHµGìGœFC{=œ6J.Ò$&B¼ GúéíJåÖâÓä æÒâ‡ÜŽÖ¢Ò™Ï…Ë%ÆmÀ†»é·)¶Û·w½ÊĄʇÌoÌGÎÌÔOÞÚå‘èWèDé4í—òúö~ùSúú›øBöÙôaõdöJõñyìŒëßð½úŸ%| á ÁíTÈmК^Š",3º6g7n9j?ÍGM’M+J5G—FíF½EEBÑ<ø5¢-,$‘ÅI¡ÇùaíÇäMâ(ä3åÿá¯Û¾ÕÓÑÂάÊTŘ¿¦ºù¶<µú¶º¼7Ä Ê.ÌSÌRÎÕ¹Þ\æ@éRé}ê±îIôßø”û–ülüöú£øP÷ë÷øøÉ÷wó½î¾íÚòeüõ0 W •  ù+hÍàm1!£* 215Ù5ñ7õ=CFöKLÃHøEEïEêDŽA.<[5þ,Š#÷EÕ $AùÔì5ä»á{ã\äáÎÚæÔÑðÍÖɂĞ˹¶X´0¶ ¼·Ã«ÉðËMÌ—ÎrÕGßçêhêÚëIðöÞú½ýãþÓþ`ý ûÈùqúzûFúÊõîðÒï½ôòý6"  % ð7îæéâ)±Å()u0š3E4j6z<»DXJ”J[G¼DoDýDDâ@;Á4_,ð"eÃ_ ¦¼øWì™ãáËâˆã)àéÙÔ.Ð"Í É·Ãö½ó¸6µ³vµt»JÃdÉÏËdÌóÎýÕößÓçë—ëRíùñøûü>9ÓÿýBüòüïý¤ü øóÆñ|ö\ÿVø ¤ ˆ %7ȇM7Ðæ?I¡'Û.ù1®2Ý4û::CËH I÷E}C`CDLC5@÷:,4É+["Û?ç (4øÓë ãxàâ¿âGßÙ"ÓVÏWÌCÈòÂ3½)¸k´¾²Î´óºíÂ@ÉÎË•ÌdϦÖÂàÍèìáìßîÄó ú-ÿR¦­Ióÿ·þjÿ[ñþ7úõ‘óø¦D®   5t‘D«—ÆÀ&D-X01E3y9ÄAQG˜G¡DFBXB6C‹BŠ?`:Ÿ38+Æ!N»t ¯©÷Cë•âàßmáøágÞØFÒÎËÇ2Âw¼q·«³²3´…ºªÂ'ÉéËÝÌéÏeפááéWíJî…ð¦õüq·-Çm'ÝÃ4Püáö6õ‚ùÏ 2 b Ý $Õf½;n2L.†$¬+¹.„/É1ô7Q@âE3F\C$AYA^BÑAç>Ë93©*1!¾4ì 5÷«êüá=߬à*á…Ý8×jÑ«ÍÄÊÀÆ}ÁǻͳX±§³+º~Â!ÉÌGÍÐAØ¢âøê²îÔïHòž÷;þ¼0§¶HéšIeRþ¿ø¿öÎúͼ “ ’ Ø ñss­× ¶ À™ï"*-ö-Z06é>wDÔD"B@f@‹AAM>>9‚2*‘ '¨] ö êaá—ÞÝßFà˜ÜNÖŽÐØÌõÉÆÕÀ*»*¶l²Ì°/³ì¹sÂ=ÉkÌ×Í\ÑFÙÅã/ìðuñ#ô­ùp­ < H É \ ¨jƒ9|úTøüû¯C Ï Ÿ ¹ £øÉÚÜî · + &ûI!w(z+g,é.-5ƒ=C}Cê@ ?~?Â@m@²=¯8ð1x)í‡Ë üØõYé²àäÝßPߪÛ_Õ¯Ï Ì1ÉPÅ1À“ºžµé±a°Ù²Ç¹ˆÂ€ÉÝÌÎ?ÒfÚ åŽí—ñ2óöÐû¼~. Ò à O Ð oû© ü¿ùýx¶ ò Š | 8f ïÇ ® C ’ €W¡Ï&á)Ø*u-Ì3<ÄA1Bµ?þ=—>ö?È?= 8^1Ý(Nâ|5 Z.õ¢èõß'Ý@ÞcÞ®ÚlÔÊÎ=ËuȣĖ¿ºµt±°ª²¼¹»ÂåÉrÍ`Ï[ÓŸÛwæï:óõøþý ¿hxÖ< Ç ; Á Š ¹‰ýþúþ  ù R  ­ ¹4ï› Z ÊêÌ ªø#%D(H)þ+l2Á:c@ô@†>ò<²=/??Ž<“7Í0D(²@á  ¼„ôüç+ßaÜtÝݼـÓãÍpÊÁÇÄ¿‚¹¦´±¾¯²Ó¹ ÃmÊ'ÎOÐÔÝè¼ðûôñö2úD‰… UÿUš d Á W NÙþüòþ¡J ä ú ’  æJÝ ` øHI ùT€#§&¾'‡*1u9?¯?]=é;Ðr>û; 7?0¬'¡C ÙóNç†Þ—Û­Ü©ÜÒØ˜ÒͪÉÇrʾ¹F´Å°‰¯„²ºrÃËýÎWÑÓÕ}Þ£é…òÖöìøZü• ñ–‡Âå5t¨ ¿ÿÿûüœÿþN ° ë 8 ú ?¸  †·¦U F²ä!%C&)¼/28Ô=x>E<ê:÷;´=Í=d;€6²/'kü¢x‚ÿ'ó™æÚÝàÚáÛÊÛæ×¶Ñ@ÌòÈ|Æì¾¸´Š°g¯”²SºøÃÒËðÏÒ<×àPëTôÂøûú˜þøv ¬‘0  "Kox’ Éý*7( D ì 2 _ ý  € ¾ú«—N „#Ó$Î'v.ø6•"µ!'nÚB›Ù4 5òÿ0Í º —W(y*òæÿ™ýýÏð±;´IÁ"Æ)f28â87O6ó70:¥:i8~3‘,¾#ÙBþ àæûjï·âåÙ×É×l×rÓs̓ÈõÅ'Ä4Á÷¼!¸ò³±Œ°†´a½OÈ8ÑVÖ÷Ùºßlé@õ€þPT Q=Œ\#¨$ò#=!F{±ÐÓò ©('¾3 à‰.ë%Ò¬qRþõûmûÿJ#¼IúŠ!§(M1ý6É76e5%7t9õ9Æ7á2ç+#|5 "#û¢î÷á5Ù2ÖûÖ”ÖÒ¹ÌéÇÅÝÃÁü¼M¸9´u±±EµZ¾|É«Òó×ÅÛÁá–ëw÷ÉžwÐ ÜÑ"Ü%'!&2#ý壊 ú?ÿFgêdî›Áb6ëÿ¹üMúÄù]ý¦šDç¼X Ž':0ä5µ65v4Q6³8@97;2:+B"F¬d _^úÖí1á}ØuÕ3ÖÈÕÕÑ ÌbÇÅ©ÃÁ½•¸¦´÷±º±¶o¿ÇÊ.Ô´Ù³ÝàãØí½ù%ä OhY¬$T(Z)@(%© a.Ü[/.³´ŠÔ'™;Vç²[þû¦øøºûÿ׃@v&2/Ù4©5 4Š3z5ò7ˆ8a6„1ˆ*ƒ!wÔ‡‚›ù ídàº×¶ÔnÕ ÕÑdËäÆÍÄŒÃÁO½ó¸.µ¨²|²·™À-ÌÈÕŒÛ³ß æ$ðü~s R ÉîÝ !'¼*—+K*ç&="«;¶ûhZùÿG¤³ß0Ïçm*Éü‚ù÷vöúg™ zGP'h%3.Û3¥4 32ž417Ò7ª5Å0À)¾  ñ ¡Ãø?ì’ßíÖñÓ§ÔXÔoÐÆÊlÆŠÄ{Ã@Á ½i¹Îµv³o³¸ÙÁªÍ}×wÝÊá?èwò|þçß À:k[#Ž)-Â-=,Ÿ(·#ã+t€±hÎÿ¼ÿR¯‡ÂÿXt÷ªþ<ûé÷iõØô€ø× (%Z$)-ã2¤3 2¨1º3j67ò40ñ(ëÄ ¸¶á÷në½ÞÖ)ÓäÓœÓÔÏ8ÊÆUÄÃ~Á¾ý¹ˆ¶_´Š´I¹7ÃCÏLÙzßä‚êÖôí_ W:¥ÝÌ%í+I/Ô/.;*%þ êÛVƒÿ)ÿ«O.Oþ×þüÿ€ÿ,ý´ùWöËó9óéöPÿ ÉÏüúM#,æ1¦21­0Î2Œ5^694@/(æ ÏÓÿ÷êìÝKÕcÒ)ÓíÒ;ϼɫÅ5ÄœÃÔÁž¾°º`·aµ¼µ¬º´ÄüÐ9Û•áKæñì@÷jâ ×¹C .(;.r1Ç1Ö/¸+L&õ!µ‰8ç%ÿ€þ‘‘ÄþÑüOýyþþ®û.øÈô9ò•ñQõÊý*i–ÚêC"+Ë0§10²/à1©4‹53}.M'02 âïþ%öÏé9݃ԩÑzÒJÒ±ÎZÉkÅ.ÄÑÃDÂG¿‰»\¸€¶·%¼YÆÑÒ?ÝÆã©èwïÎù÷fT5‘§"‚*t0„3¤3p1-^'Ä"D ×OÑÖ˜þÃýŠ[¦EýFûÀûåü~ü+ú©ö>ó­ðð¶óGü¿\¿àB!ú)´/’0ú.³.ñ0Ç3°4²2¸-|&SJ ñ þLõé†ÜéÓùÐÜѹÑ8Î ÉJÅCÄ%ÄÑ À€¼y¹Â·i¸±½È®Ô`ß æëòcü„õѦûþ$Å,—2z5d5ï2R.R(p#° Efôýéürÿ=ÿ»û±ù+úPûîú¨ø'õ¾ñ.ïî.òÈú]Ë .°Ò@ ø(©.„/ö-®-þ/à2Î3Ó1ç,¬%x8[ ÿ/ý~ô@èÓÛMÓdÐQÑAÑ×ÍÒÈGÅrÄ“ÄvÃåÀ‘½¼º ¹ä¹O¿×É Öƒáaè„í‹ôùþ „OS B'å. 4S77S4s/-)ù#ý )PÝ0ýøûOþ²ÿÀý$úø‘ø»ù\ù÷¥óDðºííÃðTù ” £Ø>(ª-|.ò,¬,/ø1ë2ð0,×$žOh>ü¶óç!Û°ÒÜÏÕÐåÐŽÍ©ÈQŸÄÅ7ÄÙÁ¸¾¼¨ºx»Á±Ë§Ø²ãÂêüï÷Ÿ Ïj–"n)ñ0„69‰8™5y0ð)i$)!òê MLüìúýYþCüŽøcöîö&øÏ÷—õ&òÌîLì³ë^ïõ÷Ág ï˜ÝD'¶,}-ì+«+. 12 0 +ï#¿dsOûßòÄæqÚÒ[ÏeЛÐaÍšÈrÅŲÅÅíÂý¿ˆ½G¼6½É£ÍÄÚôå'í}ò¦ù'2…<¼ Ç$‚+á2G8®:ó9À6]1*Å$X=h9A3œ+%¸ Ò S ~øDöÆ÷™øö%òÙï`ðÓñÑñÙï–ìTéçæNæêÑòÒýÕÁ ¦kÿ"¤(n)½'l'Ð)õ,6.~,š'M ³ «VýÒ÷·ïä>Ø2ÐÁÍ@ÏöÏuÍbÉîÆ{ÇɃÉSÈ%ÆFÄ—ÃÅË;Ößã¬ïH÷ýHUN#ƒ'x)È,È2Ž9A>Ø?4>:œ3·+Û$R 6Dt ÿV÷ûôXö ÷Šô~ð2îÈîLð\ð}îBë è«å åÈè–ñ©ü½¹ ´ pÿ!—'X(¥&F&¶(ê+5-€+ª&`$É Äsü ÷ ïŒãÓ×ñÏ—Í3ÏиÍÕÉ›Ç]ÈGÊëÊðÉîÇ8Æ¡Å6ÇIÍ‹ØAæ)òæù§ÿí"Á¨%°)m+Š.W4é:~?Û@ó>z:Ô3³+$Ð…j~ ñýö¢óâôxõëòÖî‰ì.íÈîðî(íùéÈætäöã©çfð‹û­¶  -rþ Œ&D'%&%–'Ü*4,‡*±%r6Ü ß˜û:ömî ãu׽υÍ:ÏKÐÎfÊbÈ^É‹Ëq̬ËÕÉ@ÈÈÇdÉÏêÚ²è¥ôüE‰ §Õ'È+G-)0Á5<†@ÁA•?Ô:ì3’+-$6ÂzÞüÊô<ògóêóTñ<íáê–ëJííÜë½èåDãÐâŒæLïwú¨»Ò Dyþ†%5&y$ $q&É)3+’)¾${Kó ýÄúvõÍí˜â%×”Ï~ÍPÏšÐÎËDÉwÊßÌ΃ÍÒËZÊʲËÜÑMÝ'ë)÷ÿã c!î)¹-/¦170=gAwB@;å3T+¸#‚é‹l½û’óÂðàñ]òÃï¬ëKéêÕë6ìêçcäâ±árå3î]ù°Ëç X}ó‚$'%a#ì"M%´(3*Ÿ(Î#ˆ^ õù¿ô8í9âæÖzχÍ~ÏõÐ>ÏàË?ʪËNÎÂÏsÏçÍŠÌJÌÎ<Դߥí·ù¯†•uš#÷+‘/§0þ2'8">)BCu@-;Ä3ö*"#¶ˆPŒúMò[ï`ðÖð4îêÁç~èkêçêfégæGãýààSäíFø¨Üö d}Þx#$:"¿!#$'2)¬'â"ž{3Dÿ/ùôºììá»ÖrÏ­ÍÓÏwÑðÏÀÌQËúÌÝÏ‹ÑsÑÐÍΦ·кÖ#â*ðLüG ÆÈ%ó-O1*2>4,9ú>ÏBqC§@0;‹3*q"Óòy%JùüðøíåîXï¦ì‡è7æç é£é5èDå/âîßqß4ãýë0÷–áþk }ÊN"ó" ! û"r&#(»&ö!·ezþwø†óOì²á¼ÖÏðÍEÐÒ¹ÐÀÍ}Ìj΋ÑnÓƒÓFÒÑ ÑþÒ=Ù©ä´òßþØ¥ ’ã'Ï/è2‰3h5:¸?VC¿C¹@;33ê)¨!ÜÔGìþ÷¦ï’ìcíÏíëõæ³ä˜å³çnèç,äáäÞfÞâåêö‰ÿß t }¶#!¿!ÔXÑ!U%'À%!ÕÅžÉýÎ÷ó÷ëáÒÖÎÏHÎÐÐÉÒÑÝÎÌÍñÏSÓkÕ«Õ’Ô~Ó}ÓzÕÂÛ.ç0õoa !øLß)˜1j4Ê4o6ä:U@ÂCóC²@Á:¹2?)Ê Ô¨§¨öEî%ëáë:ìéhå2ã-äaæ7çøåãàßÝjÝáÍé õ|þÞv w¡üŽ ¥  6$&¿$' ùöã$ý>÷—ò·ë~áüÖ2ÐÏÎzÑ£Ó¥ÒÐ@Ï‘Ñ1Õ€×ë×òÖõÕùÕý×IÞ´é«÷æà ŒFh!µ+B3Ó5ë5Q7‹;À@D D‘@e:'2€(×¼rµ VJõÚì±éaê¯êèÝã±áÄâåæÝäâßÞÜoÜ à¸èýósýÚ~ fŠÙ`tãk#õ$Â#9)62ˆü»ö1ò“ëˆá9×¥ÐsÏDÒ¥ÔÐÓoÑÊÐOÓ(שÙ<ÚbÙ}ØØ†ÚÐà7ì&úTQãvf#r-º4"7ê6 8 < A*DDU@ó9„1²'ÒŽ1h ûó`ë4èåè2é…ægâ6àbáÌãÔäÄã áÞãÛtÛ ß­çñòrüÝ#} Ut¼7C²5õ!ê#Ê"TX…øûDöÝñwë­á×+Ñ*Ð$ÓÄÕÕäÒnÒ$Õ+ÙçÛŸÜâÛÛ1Û$ÝQã³îšü½¬&‰B%/6A8È7£8i<3ADÕCý?h9Í0Ñ&ÈSæ ¯þ¥òê°æiç½çåáÒÞ à“â±ã´â àÝíÚxÚ Þ æÙñtûß"v?Q¢€Ø ä"Ø!wÙ üxûàõ ñnëéá÷ׯÑõÐÔíÖŒÖuÔ)Ô×EÛ0ÞßnÞ«Ý×ÝÐßÝå&ñÿ öX}ü&0Y7D9Œ89¤<=AøC~C„?Å80á%²–ÁXýNñªèBåôåTæ²ã¥ß‚ÝÁÞhá â²áß#Ü÷Ù~ÙÝŽåºð\úÞÿeéÛBίæ!ï žÍ7 ~ û‘õzñ}ë=âØzÒÙÑ4Õ8Ø ØÖ÷ÕÙyÝà›ááKà‚à€âƒè˜óad +qg ˜(ò1~8(:/9k9»<+A»CCã>8"/à$Î.eúûóïQçâã†äôäUâMÞ6܆ÝJàšá¹àÞ0ÛÙØÜ}ä™ï1ùÉþ Qú ä8¹ž™ŒÝ  С ½ú^õpñ§ë«â;ÙNÓáÒlÖžÙ£Ùè×Ý×)ÛÃßã(ä¤ãðâ,ã,å"ëöµFl5" *73‚9é:°9®9·<þ@bCˆB+>%7/.Ð#dÀ ó˜ú•îøå…âã—ãáÝõÚSÜ'ß›àÄß)Ý=ÚØ”×ûÚiãvîø¨ý÷5Ð ¨òxbÂcjÕ,k ¾‘úCõñîë5ãÚ_ÔýÓ¼×#Û]ÛÓÙèÙSÝâƒåÁæMæ˜åÕåÐç´íøïÈOMâ#†+R4k:“;:Ò9š<³@ñBîAe=76%-²")*Q z5ù5íšä"á³á3âÂßÅÛ¾Ù'Û Þ•ßØÞ=ÜMÙ-׫Ö÷ÙOâRíßöˆüåÿœ i°>2‚-KÓHVÓ© vrúHõ­ñTìÛãöÚ‚ÕAÕ&ÙÅÜ3ÝØÛܒ߆äèféýèKèzèfê2ðÚúË= h%Æ,B51;<]:Ô9\<>@hBAA<<5,‰!áÍã Ï÷Ôë9ãÃßWààà‚ÞÚØÚøÜ•ÞíÝXÛcØAÖÁÕÙ5á1ì¼õiûÍþ÷g 1x Nû6Þt¡ML Aeú^õèñÙì›äôÛ¹Ö§Ö­ÚˆÞ"ßìÝIÞåáýæ¦êì²ëÿê%ëîì™òý$ ©£!Ç&à-6¿;Œ<:±9ÿ;¯?µA@©;54ð*[ ”gu œröŒêÙákÞ ß¢ßRÝmÙb×éØñÛÝÿÜvÚ×\ÕÕÔ Ø$àëšôEú«ýÔ8KÝØ(Ò+óªüÑ gúˆõ=òlítåÝØ#ØSÜgà*áà‰àBäséDí¿îeî±íÎízïëô>ÿ s¡#ÿ'Ü.Ð69<È<~:j9„;?æ@˜?±:#3Ì)%Kþ 8õCéŸàÝÓÝzÞ4ÜWØIÖÓ×ðÚ©ÜܑٜÖvÔåÓ ×ßáézóù€ü« Ñ*µ¬ÿµ)ífgÍ úÊõ¯òîeæ'ÞaÙ¹ÙÞPâKãBâÓâ©æóëÜïqññ^ðnðò5÷N$! k$)¸/s7<ë@”>¢92œ(åú𠢨þÀóúçkßíÛ¬ÜdÝ!ÛE×<ÕÃÖöÙ¼Û,ۮؼՎÓðÒÖóݯèDòô÷Pû~ÿÝž •Ò˜%ECá§ "®ú%ö<óÝîqçhßÕÚeÛøß[äwå„ä#åéî}ò!ôÇóóóô…ùJɼ‡! %*s0û7ê<õ<):81:u=?ƒ=w8Ó0d'¡¥4 -|ýmòµæ8ÞÊÚÛXÜÚ7Ö2Ô¿ÕÙÖÚIÚË×ÚÔ«ÒøÑûÔÕÜ|çñÂöúNþ®i ÐrSª„-r©nÈ– KÿúœöçóÁï™èÚàbÜ*Ýíátæ®çÙæç‘ëñ õÈöqö›õˆõäö½ûB{9Î"¶&ø*1c8=Ý<×9ø7l9‘<>h)…t<¦˜œ Šuû0÷±ôÆðÝébâ$ÞþÞõã¤èþéFéùéî®óÇ÷qùù-øþ÷2ùÙý ¡ü#ª'µ+–1¥8&=°2l*õ ( _]þØö1ìÅà}ØNÕ_Ö`×DÕ[Ñ3ÏÓÐ5Ô1ÖÂÕOÓPÐÎ0ÍÆÏ×ráãê•ðô8ø¡þ‡! æ ü Á '>cCÃÀ Š@þ»úøøüõûï?éÑåbçèì/òïóVó2ôdøþFÖ1à|F (º!H'*0-92k8!<é:¸6»3f4ð68/6ç0)¤Þ¼ ý¨õë¶ß×ZÔwÕ‹ÖmÔzÐLÎÜÏLÓMÕÚÔ`Ò[Ï Í&̱ÎöÕ4àéZïÅòþöqý_ î  › û ‰å=NB P8ÿæûSú‡÷¿ñ/ëêç©éTï±ô}öèõ½öôúªÎPŠN«„!p"Á'\*G-28Ÿ;0:Ò5£2+3«5Â6Ï4€/»'Q”} ßÜûôóé­Þ“ÖÓžÔ¹Õ‘Ó•ÏeÍôÎfÒgÔíÓkÑbÎ ÌË“ÍÊÔóÞGèîñÅõGü<ý ô  ÁI ,qdâ 5P.ýÎû1ùóKíêì×ñB÷ù…øMùŠý=N°Í&#´#(€*=-Ú1¶7;_9Ô4‰1ë1b4k5k3.Z&M>¨§úYóâè¨Ý§Õ­ÒÏÓñÔ½Ò±Î~ÌÎ{уÓýÒrÐdÍ ËÊhÌ–Ó²Ý÷æºì2ð‚ôû çë "ë¤ L%®àž 0‹þfýúú”õuïuìuînôæù´û%ûäûÉÀ þ ö %ÌŽr ¿½•#\(*-†187`:}8Â3[0ª034 2¶,%³wÿù7òÖç¥Ü¼ÔßÑ Ó!ÔðÑÍÍ’Ë%ÍÐÒ ÒwÏcÌÊôÈ?Ë^Òtܬågëéî=óòùåõG# 5&3|xFÞÿÞü÷©ñÞîñ÷œü^þÆý‚þ¢K& ; xùœ ¦Xé#x([*½,1˜6¥9Œ7ž2/X/³1»2ª0T+§#gÈÆLþaø"ñÏæ¥ÛÎÓÑPÒ]ÓÑæÌ Ê6ÌŸÏšÑÑvÎ]Ë÷ÈäÇ(Ê"Ñ4ÛeäêžíòÌøû€v‘ ö^n5v} J¶äáþ¾ùëóMñ óÎùdÿc' |bØ  C   fÑ$p(*H,0å5À86h1Ã-ù-L0N1H/ô)T"%–˜'ýO÷ðÕå¿ÚÞÒ@МѧÒPÐÌ£É?˭ΟРÐlÍPÊêÇÎÆÉóÏòÙ"ãËèSìÎð²÷%(NÌê& Î0¦õ“Ñ ÒoÅìóû;öÆóEöˆü.Ëþ˜š ¾sà† ‡ y ‚ ,'$>(±)½+Ú/5Ì7q5'0d,’,á.Û/Þ-š(!çj üIö ïàäàÙÒyÏèÐëÑ~Ï*˳ÈEÊ´ÍÏýÎ^Ì>ÉÐÆªÅßÇÃήØÝá{ç ë§ï°ö?ÿ],yé Æ` ñÀ: sEÁ2þ˜øQöùøHÿÜ{Žÿ XØk¢× K ‰k$î'8)+!/I4È6D4à.ú*&+t-k.l,='¼¬B pûOõ-îñãÙ]ÑÊÎ<Ð5ѰÎJÊÎÇKɼ̛ÎîÍHË)ȮŀIJƑÍj×à2æÉé„î¶õ_þ§íŸ Ô·žgü Ä . 3×3€ÿúÜø®û” vN †Õ8;v‚ ç‰ò#ƒ'(c*M.f3¾5 3-)µ),-þ*Ø%y& fúYôKí ã%ØšÐ%ΛÏÐèÍgÉãÆ]ÈËËœÍÚÌ+ÊÇ’ÄQÃ}ÅXÌ(Ö<ßéä†èbíÂô‘ýê^#Ê´ JL%vm 2 ÿxßýcû_þÛR µ Æ ‰¡»ß±¸P “3Œ·#'é'’)j-y2±4Ò14,/(F(­*¡+™)~$8d b ùiófì/âF×ÎÏvÍ÷ÎìÏ&Í‚ÈïÅeÇÇʘÌÁËÉíÅuÃ+Â>ÄËçÔõÝ¢ãIç?ìÓóÓüHÔ¸‹¹ KžOm2ú D < Ö P þ § Pÿ ¬¥ˆkÜ^ol#t& '©(v,|1§3™0Ö*Æ&ß&O)I*@(/#I fÿ.øò€ëVáeÖúÎÀÌPÎ5ÏdÌ–ÇñÄdƾɄ˧ÊâÇÉÄU Á ÃÚɬӸÜdâæ&ëòò'ü»`k_Õ ­:ØlУt ‹ > Æ•²Ìr ÍÙ^J¹Ž9ÞBèÍ‹Nm7ñ"È%B&¶'{+h0†2Q/p)\%|%è'õ(ñ&ï!Ú3 pþK÷¦ñ¡êyà‹Õ5ÎÌ­Ís΃˞ÆìÃ_Å®ÈeÊ„ÉÀÆ©Ã2Áè¿êÁ ÈuÒ|Û*áþä3ê*ò“ûAÿ8] -óÉžS_òµá´D $c™9 {P£k°YË2`Ò{îsYàP"û$K%¯&r*K/@1.(ì#$‡&œ'±%À Á,‰ýpöÖðÏé¨ßÍÔkÍoËͻͪʮÅßÂSÄžÇHÉ\țń À¾¾ÄÀ{ÇFÑOÚþßèãKévñûä¹b ÉÌÛïä1íAD(È ± Z ñ ¼Òn‰ùCi^œ :u&s¡!$A$”%Z)*.ü/¡,&t"®"-%H&p$™´30´ü›õðéÛÞ Ô¾ÌÀÊrÌ ÍÏɼÄÕÁAÃŒÆ(È.ÇlÄYÁ߾޽—¿TÆÐ1ÙßÞÜâoèØð®ú§Ž¸ß ‰È Y Žþw[µ¢R: ¨ ¤¤éSF‚’„9CyrbÖðã "#1#f$4(-¾.B+ %õ I!Þ#%0#w®ERæûØôPïKèÞHÓÌÊÛË`ÌúÈÅÃÓÀ-Â~Å ÇÆ7Ã+À±½]¼h¾*ÅðÎØÎÝÚá˜çBðMú„€"ÿq \çW Ø!K! #¸»-%Þ 7 ¶K VâáïÁuïÄÉIlV """:#'Þ+‚-æ)·#„çš"Ë#ý!S³b~ûôî”çTÝ…Ò_ˆÉ@ËµË ÈÈÂË¿ ÁnÄðÅÐÄÂý¾ˆ¼*»<½ÄÑÍìÖÄÜéàÜæÈïúVŠLg$ MÀ!v#"#!Y+°¬h_Å YáqƸ`;Ë <…)ö‚ü¨3 !á "×%·*A,…(M"-”`!›"Ô ?¹‰ ®]úaóÒíÔæ’ܾѬÊëÈÊËAÇÄÁ¾¾ÀPÃÓÄ ÃÎÀÒ½a»º¼ë¾ÌÜÕÃÛà/æeïÜùK¡æð ZO:#.%%1# }¦@>öódékÒz“G¾i ·!åølT°mÞBçžÆ Ÿ$ƒ)+*'å ÓN, s!¶4É­ â›ù«òíæËÛíÐìÉDÈôÉ5Ê_Æ»À¨½ú¾.Â¥Ãrž¿©¼?ºë¸ñºØÁ¿ËäÔÙÚFß•åïÓùeÛü€Ù …¬Ä$û&'e%õ!ô7ÝÛƒ{öwé!o CÇ{!…"m Iï.Á5¶Iq\#?(É)Î%yw øY ¢3äÚ ØøóñiìRåÛÐÉ’ÇIÉiÉlŦ¿ˆ¼ã½ÁvÂ;Áh¾‚»"¹Ö·í¹ÍÀÐÊ Ô Ú›Þ#ååîêù£5‡AÞÔ*!k&Õ(<)²'Z$p!É y!„ ùröPN#L"Ô#,v"9#Ö x“À‡ õuå  "ö&j(q$ÍÍ;š< \ø;ñ½ë¡äEÚVÏDÈÚÆŸÈ¡ÈyÄ—¾^»Å¼ô¿HÁÿ¿3½[º¸¿¶ç¸à¿öÉEÓTÙÞÇäÓî#úª-2BÇ"0(Ì*g+*Æ&ñ#b#$!#Ÿiáfš!f% $D _7 <#Ë#!!{rà åt¢¾ ¯%'ÿ"™¾™¬ –W;L ›f÷ŒðëñãْΕÇ(ÆôÇÏÇzȽ@º¤»Ò¾Àž¼:¹é¶§µæ·þ¾'ɑҧØvÝ‚äÞînúw6é9 UË}$*Û,¥-j,8)w&ÿ%½&¯%!Æ=ÃÏ#F'­%‘!u!ä#2$R!†G p ô '°½.np$¶%š!9dlœšxv âÿ¸öèïyêDã¹ØÅÍÛÆ~ÅNÇÇ~Âp¼(¹º´½í¾½Óº¸Ðµ•´ì¶%¾fÈäÑØýÜKäûîÇúå½O ¶dV&,û.î/Ð.¶+)›(]):(‹#z í%)$'¹"` Þ!n$y$_!]ñ‡ ( &ðv[—È8#s$D èE›*®šºÞ0ÿ öEïÐéâô×ñÌÆÑÄ ÆBÆ„ÁS»¸`¹˜¼Æ½[¼¢¹ü¶Á´ˆ³÷µU½³ÇAюוÜ'ä.ï;û¤¯§{ 05(.,1H2E1?.‘+6+û+Á*ï%^ ˜"ï'È*z(Ä#%!€"Ý$¤$E!ƒðÿ D ' Ó:÷ aÐ"=#õø5¯IÎÇü9…þbõ î(éëá.×ÌHÅÄåÅwÅ‚À,ºÞ¶@¸q»£¼)»v¸çµÀ³’² µ¼Ç·Ð×DÜä{ïÎûU£» Áá !*+0m3°4Ã3É0*.Ë-“.>-@(”"À &$Õ)Y,«)²$×!#-%®$!³?! J  ¤÷Š¥ÿß "¨Zß@ÑqúJŠ×ý¶ôî‚è)á]Ö3Ë~ÄlÃ&ÅÄr¿¹¹µ%·Jºr»þ¹Y·à´Ç²±±5´â»ÆDÐÀÖ!Ü/äòï‚üiÇ mÂ"!,I2½5%7E6N3½0e0%1­/|*¯$Ò" &¢+É-¸*|%w"h#_%œ$¿ :cs' 7ø jž%šQ£Ù fÇOí§4N¢à+ýô]íàçpàŽÕKʣïÂdÄ’Ã[¾Î·‰´¶&¹Eº×¸C¶â³Ø±Ø°„³B»!ÆóφÖÜqä~ðWýv ’(¸$8.{48¨9Ð8Ö5I3ó2¢32ª,®&»$õ'H-#/«+!&í"®#w%r$W §®• Æ (;¥ -r—/ä±cÛ{Ÿ=†ü_óºì@ç¼ßÀÔzÉ·ÂèÁ¥Ã«ÂH½¦¶P³â´ ¸%¹¶·4µí²÷° °ß²ËºÎÅÂÏiÖ%ÜÈä)ñSþ,¡ b 3þÊ&h0¾6q:!è=Þ:H8ì7l8…6±0A* (9+0Q1%-ó&b#Ó#$%»#31ûš ÙŽ>’ k£ŸT£5:À˜­‘_\Ö Aû'ò‚ë æSÞÓÅÇ,ÁmÀ/ÂÜÀ»[´±¬²éµö¶µ9³'±T¯’®Á±ºaÅ—ÏoÖ‡ÜÑåãòzª ; T¶ÿ+ÿ4z;\?,Ag@X=¹:Z:½:˜8Š2â+¬)µ,V1$2Ÿ-)'m#·#Î$(#zZ€ ¥XïA  *|&˜†ªàÜ®c½L o›ú†ñæê^å›Ý7Ò߯^À´¿iÁò¿þ¹5³û¯ž±á´ìµŠ´O²Y°š®ç­H±Ù¹OŘϗÖÝÜ{æåó¬ë ­ì!P-P7ì=àA¸CèBÏ?#=·<ý<›:N4ƒ-+.r2â2.M'R#{#b$†"ªmýS a«ò ž ¨ ¹ ½Y&„†Õ 2 Ã"° ØòùßðCê­äÔÜUÑìÅ{¿ç¾ŽÀ ¿ë¸²Þ®°Ò³ô´˜³q±–¯ð­[­Þ°°¹XÅ¿ÏàÖMÝ5çøôûR 3’n3#—/¬9`@fDCFgE?B‰??)?<ü5/g,2/t33P.Z'##'#è#×!Êkä Â[™G 9 K o 6'{†û f™w'… 8Jù/ð•éõãÜpÐìĈ¾¾·¿¾Ú·á°¾­Š¯Ø²´°²°æ®c­ö¬“°™¹|ÅÐH×ïÝè%öhÖ ÊRVa%î1<ÌBæFÍHâG¢DÚA6A?Ad>‰7Z0¥-J0\44y.D'ì"¿"Y#!×\¿Ü¹iÿ<Û Ç á 0 $!rŒ+ ·îáï| œø}ïçè;ã$Û~ÏéÞ½D½Û¾½·¶´¯§¬‹®ß±³×±ã¯M®ã¬¢¬°¦¹¾ÅcÐÆ×°Þé÷óks5h¡'O4>BEfIZKSJõFD]C.C@ò8’1È.L15€4.'˜"?"²"9 ×D Rþ¶âf Q wú  o” [ D<öZâ äé÷Æî4è}âAÚƒÎý¦¼s¼¾¼˜µ–®‰«­ï°(²±8¯Å­x¬a¬~°ä¹$ÆäÐ`؆ßFê÷ø¦%6#—ï)¾6÷@¾GåKÍM»L6IFFmEE°A;:£2Ä//2´5Ó4p.¾&#"¦!ä!RÆW Añþ üeÿ“þÞ À "/ j™ ‡ Y ¡•XÅI 6.÷î}çÃádÙƒÍÂÉ»¢»:½ »~´€­|ª—¬ °R±H° ®U­$¬2¬°9º¤Æ‰ÑÙkà€ë„úk û Ê M,89vC:J`N;P ObKTHbGÇFCd;ˆ3”0ð276ï4D.I&Ž!ö !K¥é ïšý9û þG¢t¸‚)T q® ­ ® ô¯'±ŽtöWí徇ܯ†ÌÁãºÔºz¼(ºo³p¬‹©µ«F¯•°›¯®þ¬ò«#¬º°¤º<ÇCÒéÙjáÎì"ü. æó#².¨;úE°LÎPšRGQ}MHJ7IhHqDoüïùºüþF lj>}1xÔ î jQƒ Üÿ¯õ˜ìæ5à¥×{Ëþ¿ ºº¯»8¹\²h«ª¨éªŠ®å¯¯µ­Å¬Ú«)¬±5»ôÇÓÌÚ~â<îâý ±Ý'G%1>eH%O=SóTrSO)LøJóI£EU=5×14ã6Ì4|-% Y-b„:ÛúŸø|ûÀñ£Y] µJ€÷ Ci Ó°`Þ l+ÿåôÏëCå^ß±ÖjÊí¾&¹X¹ÝºS¸Q±cªÍ§)ªÑ­L¯ˆ®e­§¬å«]¬g±â»ÐÈîÓÌÛ¤ã·ï´ÿöœÒ5 'Ž3Œ@ÐJQ¡U?WUqQùM›LbK¼F>´5c2‡47ž4õ,f$EkÌß1ÛÿvùL÷=ú|ÿ§AÍ@x ês Í B¹5 »jþôþêyäƒÞ®ÕRÉ̽0¸¸º]·N°`©ï¦q©,­¾®®+­£¬¬¿¬ð±¬¼ÎÉüÔîÜÿäBñ›¥Þ_"Ó)6 C)6È2Ò4?7`4X,˜#gmí‹‚® Õyþ øòõûø<þ\è}'— ¥¥ 6×2 ¢{‰ ¦ýDó$ê¨ã©Ý°Ô>È¥¼3·Ç·J¹s¶S¯b¨¦Ì¨›¬>®Å­­¸¬S¬:­±²’½êÊ(Ö+Þqæó›+¾ö $1,}8‡E£O4V/Z¯[”Y UDQOâM¢HM?ƒ635774¡+¸"{cÇ@"N sýžö ôÄ÷ýÿ8ÿ à 6«¶ X#– û ËcÙ NÓümòLéØâÌܪÓ$Ǭ»A¶ ·‰¸‹µ^®†§Y¥5¨¬Ô­†­ý¬å¬ª¬Ì­³°¾)Ìl×xßøçÝô¶hã#ã&©.û:HRzX[\­]l[¨V¿RãPéNRI¬?¶6H3#57ˆ3Ò*Á!xG~ë»è ¨û=õOó˜öØû½þ?þóýú mÂÉ vjöU ¯ ' ûûŽñ{èâòÛ§ÒƨºoµU¶Ú··´z­Á¦°¤¯§¯«‚­\­ ­)­­q®´ä¿{ÍÒØßàŒéÁöØ« !C%()1x=zJ`T´Zs^•_]'XTRÔOÝIí?¿6L35º6á2ñ)² ^0‡N|§Eúïóòoõ¹ú†ýúüÐü4 ²éå £¨U³ dñ n Ð$û«ð¢ç3áÛªÑëÄ ¹´¨µ?·ú³©¬¦)¤?§a«N­N­5­‰­¥­1¯‰µ/ÁâÎEÚ[â.ë®ø ág#v'i+~3é?ÔL¯VØ\r`ca¯^‰YLU"SžPIJ@¥6-3ù4Z6'2ø(‹2çÜÚ Cæø¦òåðOô£ùXüÀû·û1zþ âú¸ ° 0 §KúÉïÊæ^à1Ú­ÐÑøӳþ´–¶<³Ý«]¥µ£í¦+«2­Z­x­®N® °­¶‘Â]мÛéãäì²ú? …%¥)«-á5SBOØXç^Vbc!`ÒZjVTLQ™J@ž6ø2½4Þ5S1î'lý«†ªi ¤áþˆ÷cñÌïMóŸø7ûú¨ú[ÿÂRD( !`s p Ù+eùÜîîåŠßAٞϱ”·³W´Ýµ‡²«À¤O£¬¦ÿª4­„­×­®¯ ±ë·ÄùÑQÝŽå¥î¾ü…[°'Ô+ã/78­D[QêZÛ`#d¤draø[sWîTáQËJ@o6Ã2j4V5u0Ö&IÇi/Aü ?…ý.ö$ðºîVòœ÷&úiùœù†þ £  N\½~Ó M ¬ Doøæí å±ÞS؉ΑÁ¶1²´³7µË±nª-¤õ¢¦íªI­É­Q®>¯ô¯5²F¹­Å¯ÓßHç”ðÐþس ì).&2|:úF‰Sì\­bÒef¨bû\TXŸU\RæJÏ?6n2ÿ3Æ4/±%’ ÙÚ‘ Ý,üÞôæî¥í`ñ öùMø‘ø¯ýYâ à vŽ Ù š ã 2_x÷ïìäÐÝg×~Í‚Àpµ_±³¦´&±Ó©¢£¦¢g¦õªv­)®é® °ó°s³ÍºUÇzÕÈàé“ò;#-,90j4Á<7I¦U×^gdZg‚gÃcÞ]Y,VŸRæJ‚?³52|34•.z$ÎTÓ‚u,†Üú—óªí”ìoð¨õø7÷‘÷éü± Ü –¿_0^ Î  `yÿ|öûë,ãòÜ}ÖtÌz¿Ÿ´Ÿ°•²´‰°G©E£q¢g¦«¾­ª®£¯÷°²Â´h¼!É[ןâñêžôS¢‚%i.a2¢6 ?cK«W©`fÇh¨h·d˜^¬Y›V½RµJ?)5…1ç203†-4#}  Ï9–ù[ò…ìŽëïÂôýö/ö•ö)ün  »뫆 ý JŽ’þ|õëMâÜ›ÕlËn¾É³ °#²­³°Ë¨£]¢¦Q«!®E¯y°û±-³$¶¾ËAÙ‚äÍì¨öŸ ä'¤0{4Æ8:AxMœYdbgj°i{e-_%ZïVÃR[Jz>z4é0G2L2Q,Ý!»,®« xõþ[ø+ñ}ëžêÂîñóö.õÀõoûŽÐ 3 à#ðÿØã- pµ©ýxôþéháAÛÁÔkÊa½î²{¯¿±Z³’¯a¨Ð¢k¢¯¦©«¢®û¯g±³i´–·Ô¿øÌ9Ûmæ²î±øçr-*Þ2Š6Ð:MCrO_[døhGkj"f¦_{Z&WµRñIØ=ª3-0“1e1+„ ®`×MF %·ý/÷ ð}êÏéÿí2ó"õ9ôîôÌú = n dÿ:ÿ(#YÍÄüxóýèàgÚØÓvÉ_¼²ò®`±³6¯ ¨¯¢¢ý¦¬<¯È°o²I´Æµ¹œÁôÎ;ÝZè£ð¾ú0 Ôh,æ4†8Ç&G S‚^½fekRmlgG`ÞZ:WFRØH^<<2ª.ÿ/e/˜(ɸ7 §iûüôåíšèHèŸì¹ñqóhò`ó˜ùæ ÜO×ýÝý°“©ÐúÂúhñôæ¯Þ¹ØÒÇuºŒ°þ­È°b²ž®œ§²¢£ã§A­Ê°Ã²Õ´·Ï¸’¼mÅ%Ótáeì»ôÿÇœ!à0ê8[<@çH²Tî_îgbl%n°l^gc`âZWïQ(Hw;W1Ø-/e.Q'a¬r é P WtIúåóÕì§ç‡çùëüð—ò|ñŽòôøOAfúüýè¶ÓðÂùXððåÆÝî×4Ñ–Æ ¹Ë¯“­ °C²y®˜§Ñ¢‡£„¨®¼±î³2¶…¸tºm¾‰Ç[Õ´ã‡îÒöH!$"3ä:)>FB“J=VCaiCmËn*m‰gZ`¿ZÍViQhGz:W0í,(.Q-&ñH( ¡  Jÿ4ùÚòÕë°æÀæRëHðÀñ™ðºñOø·€"qüKüÖë*ÿÈøNï÷äáÜ(×nÐÀÅà¸V¯>­°9²l®²§'£¤F©í®Î²9µ­·º'¼RÀ«É›×úå«ðìø„~U&O5Å<à?÷C5LªWwbj nWofm‘g2`ƒZmVÀP‚Fi9M/ü+&- ,®$~æà Y Àç/þ.ø×ñßêÓåæ²ê–ïéðÄïëð²÷#¾2„ÿ'ûzûLÿñý0LþÒ÷GîäÜrÖ¶ÏõÄ,¸ò®$­š°J²w®ã§¥£½¤ªé¯ø³œ¶=¹Ç»â½=ÂÔËáÙ-èÊòúú²Ð‘(a7”>}AˆE·MôX‘cåj¼nÊo‡mqgì_.ZûUP}EB8*.þ*%,Ð*<#~– y¶ý0÷ÝðîéåSå êñîðëî@ð÷œ I’þGú¡úyþJkýÞö?íãNÛÀÕÏ4Ä{·®­½°‚²¤®+¨3¤“¥«±@µ¸àº½ª¿1ÄÎ4ÜgêæôýÒÆ*I9R@ýBôFOZ{d®kNopŒm2g‰_¹YpU=OjD7í,ì) +)Õ!– LÚAŽü=öîïéJä¾ä”éXîPïîŒïƒö_eýkùËù¥ý33g€üõõAì â‡ÚÕaΈÃÚ¶4®­í°Ï²ô®’¨Û¤¦)¬@²¢¶¥¹—¼L¿ŽÁ(Æ6Іޫì÷ ÿß >æ,$;ÞA^D9HGP'[@e?l»oSpzmÝf_(YÌTgNPCâ5Ò+É(*l(u 2à ®oûUõ ï&è‡ã$äéÈí’îDí×îïõÿ²§üŽøùÐüQK†ÿ›ûüôJë8áÉÙsÔ»ÍçÂL¶ð­.­/±³V¯©¡¥Š§U­„³¸L»d¾*Á‚Ã:ÈiÒØàéîùè `ñ.ß­DåF†JVRÔ\mfm.pnpmåeã]ßWGSŒLñ@Y3†)±&è'&·uO Ãjàcþ?ùŸóXíræ âùâîçkìþìŽëYí¯ôþŸ§ú¹öX÷ûƒþ‘ÿÔýßùójé‹ßvØeÓ«ÌÕÁµ˜­“­²ñ³T°oªj§Û©õ¯^¶K»ß¾5ÂÅÇ£Ì×—åyóGý'} ã25@ûEHK1S|]Ûf;m9p;p¤l?e]W`RpK¬?ö1;(Š%º&Ì$b¤OÔjý_øÌò„ì£åDá]âeçÆë1ì¯ê„ìýójý˜ÿšù½õtö+ú’ý¨þÿü ù:ò‰èÎÞÞ×ýÒNÌvÁVµ¸­à­œ²Ÿ´±Y«¨-«s±÷·½ÇÀ<Ä#ǦÉÙÎnÙýçÕõeÿ m"¯4ÎA3GüHqLùS ^+gUm#pîold=\,VkQJJZ>€0Ù&S$%{#¼Õ@Äÿuü÷ÿñ¶ëÚä‰à¼ááæ-ëjëÝé¥ëEó¹ü@þ•ø¼ô’õJù¤ü»ý+üCøfñ±çÞ_×ªÒ Ì,Á0µì­f®W³iµß±X¬Ü©¤¬³¡¹Ô¾ÁÂOÆ=ɽËÑÎÛbêøqüïO$U63CEHÕI8M¤Tr^^gVmúoŒofk¡cE[;UmPIò< /€%-#f$'"£_£8»þ…û´ö?ñìêäëß/áeæŽê—êé÷êšò üZ~ý÷Òó±ôjø¸ûÔüUû~÷“ðÛæmÝòÖ]ÒÕËíÀµ:®¯'´L¶À²f­8«;®®´]»³ÀÆÄiÈSËÑÍBÓ-ÞÃì7ú`à ¹&ä7VD2I‰JÚM,U½^fgAm¹oo¤j®bEZ>ThOÝG‡;©-!$ "Q#é J u}>ÿÀýúëõ„ð'êQãMß¹àðåöéÆé'è:êôñeû|ÿmü~öëòÕó÷Ôú÷û†ú±öÏïæÎÜ’Ö#Ò¡ËÆÀµ•®Ï¯ µI·Ä³®¦¬ä¯j¶-½ŸÂÔÆŠÊrÍöÏoÕ„à ï`üCx `Ä'\9hEíIKRN‘Uë^Pgþl\oƒnÓiªa:Y0S[N§F:=,ì"ä J"Âæ c…ÿQþÑü¹ù!õÍïjéâ§Þ9àråjéùè>çié?ñ¨ú¦þ\ûgõùñó¶ööùû¼ùðõ ïYå7Ü<ÖþÑ…Ë·À#µù®›°¶O¸æ´Ê¯'®£±?¸¿—ÄêÈ·Ì Ï(Ò¨×Îâwñˆþ )áJ)½:jF‘J‹K¢NÒUü^g”lÚnämøhš`XRHMuEµ8Ì*§!ËK!­Íº fœþpýêûÜø]ôï¶èÍáùݯßîäÅè*èMæŒè~ðÒù¼ýJúNôñ-òÚõùKúù?õRî®ä­ÛøÕïÑ‚ËÀÀQµx¯„±0·n¹¶±¼¯q³ºìÀ˜ÆËðÎÐÑYÔ÷ÙåÇóœäÅ}Á*n,mhq_íVøPL7DA7\)t ËD ‘‘‘ rÅýüû ø¦óiîùçáPÝ-ßkä èCçQå±çÂïûø¢ü,ù1óð[ñõ9ø†ùQø˜ô¤íäBÛÎÕúÑ•ËßÀ¸µ°Ž²n¸§ºV·•²`±Mµ ¼à¤ÈAÍ.ÑÔ‡ÖAÜ~çö¥“ Fû&,7=H|K*L'O VÈ^kf‰k‹mGlùf6^±UÍOãJÙBÉ5ä'5Ã7zep~ñü·û2úD÷õò¼í@çRà¢Ü¨ÞêãXç^æTäÈæüî&ø•ûø òïð+ô^÷¾ø¬÷þóí‡ãôÚ¸ÕÒÈËÁ2¶ü°¬³Ë¹¼¼¸+´*³9· ¾åĽÊtÏnÓ3Ö¯Ø}ÞÎéDøª6 ®Tg-:>ÆHÎKHL6OÿU†^ñeåjÄlQkÊeì\cT”N¨IuAM4a&è±/PAQŠÿüäú[ù„öEòíˆæ ßþÛÞjã­æ~åmãÓå0îW÷–úãöÿðî¨ï\óöþ÷÷xóìã¹ÚÃÕcÒÌwÁÁ¶í±í´D»‡½?ºÕµµ<¹ÀýÆä̯ѪÕfØÑÚ«à ìdú„Ä ö†. ?XI LIL"OÐU^`e+jçkIjd™[ SQMhH@Ò2ß$‹’&36–þNûúøÁõ•ñeìÕåòÞnÛŽÝæâæŸä‚âå_íŒö¢ùÐõûï/íÖî˜òÎõK÷söýò ì´â•ÚãÕ©Ò‘ÌìÁi·ñ²A¶½¼¿Ó»··Y»=Â#ÉÏïÓçדÚíÜÏâ6îmü91#ž~/¼? I#L.LõNˆU ]©d^iùj/iFc>ZµQ L%G°>W1†#;}ø8®ý‡úWùÆ÷õíðÀë åAÞÞÚÝaâQå¹ã–á5ä˜ì¿õ¦øºôüî`ìîÛñõ©öëõ€ò«ëhâˆÚÖ ÓÍ{Â*¸´¬·:¾°Ày½[¹¹„½gÄPËPÑ5Ö%Ú¹Ü ßßäPðfþÞ …:• [0N@ÍI LïK¨N#U]Úcqhÿi hõaØXaPÄJèEV=å/." l"ãDÝüÆù˜ø÷JôAðëhä†Ý?ÚÜÈá¥äÒâ àWãÅëÚô²÷¨óûí‹ë]í*ñpôöwõòQë1âÚo֌ӑÍ)Ãÿ¸<µ(¹Ô¿JÂ7¿8»!»¸¿ÆƒÍ‘Ó|Ø`ÜÜÞ&áïæTòKs ÄKc!1Å@ãIÛK¢K5NTS\öbjgìhàf›`jWO~I±DÁ–ÁŠÆvÍAÔNÚCßãåçÖìú÷d¥Î©y#—2•A£I JJmLR¿Yà_ûc:eèbV\óRÄJ”EÆ@ø7D*Ì«¨n$ë ›Üù÷Ôõ(ôŠñ£íaèyá†Úq×Ú:ß^áüޙ܎ßfè0ñ†ódïêDè¼êÂîDòmôkôtñçêiâËÛÈØÉÖÑüƾ½#»ÀZǺÉÉÆ^ÃèÃãÈÅς֌Ü|áåçÜè–î©ùÓ·(â#Ù2yAFIúI7IžKžQ°X¸^ÂbócƒaÑZoQSILD‡?¡6é(•Ë”.÷ ¹ÿ ùrö*õxóâðí¹ç¹àÈÙÒÖ|Ù•Þ‹àÿÝ¢Û¼Þ”ç\ðŒò`î*éç*êIîáñ-ôQôˆñëµâaܦÙÊ×=Ò/È&¿à¼ÂdÉÍËÓÈ„Å7ÆDËÒÊØÌÞ°ã.çëè’ê:ð8û$¥,€!$ö2GA²H[5 'azíÆL ìþ_øÐõ‰ôÌò2ð_ìçûßÙ#ÖÖØêݼßݤÚÙݼæ‘ï£ñhíPèìæ©éæí•ñôHôžñUëã ݘÚäØrӀɠÀ¤¾ÄoËëÍíʯLJȩÍuÔÛáÓå1éÄêFì½ñ¤üY ´¿7$ï2þ@H`HMG©I™OmV0\#`Ia¶^ØW}N“F¿A$=%4c&F™y4)þ´÷3õéóòï«ë\æ6ß8ØfÕ&Ø#ÝìÞÜœÙìÜÝå°îÀðtì{çRæ=é“íZñèóZôÒñ©ëžãÏݤÛÚºÔçÊ&ÂtÀ"Æ‰ÍøÏ ÍÞÉÜÊÐÉÖLÝ.ãìç&ë‡ìçí4óõýu A!2$Ò2ž@WGmGLF“HN6UØZº^ê_U]aVMä©ÞËÜqÛÖgÌÈÃWÂBÈ°Ï Ò0ÏÌ3ÍrÒÙ{ßMåýé í3îkï¤ô.ÿx æo!;$Ÿ2+@‹FhF>E|GWMðSwYP]|^ó[éTŽKèCR?Ô:Ý1$%졖苲ü‚ö ô¥ò½ðîNêáä•ÝxÖËÓ®Ö‡ÛÝôÙ‚×Û1äÒìÏî¢êðåAå†è íñô×ô‘òŸìþä¥ß ÞÝÜ—×ÿͤÅBÄmÊêÑ;ÔdÑb΄ÏÏÔ^Û§ábçþëãîÈïÐðîõL^ qŸ$J2¨?²ESEDSFLRXä[]vZwSJ“B >§9¯0Ü"æÎ+Æøûâõsóòðqí¡é$äÄܤÕðÒéÕ¼ÚÜøØ{Ö&Ú`ãÿëëíÎé4å¿ä<èäì ñ.ô?õóFíÖåÅà]ßfÞ/Ù«Ï„ÇfÆ¡Ì:Ô}Ö¡ÓµÐàÑ'×£ÝËãféÞíð@ñò÷E ä®ïÍ#Ñ1õ>ÇD"DÍB EÏJEQªVwZ [ÿXøQ¤H?Aô<‰8ˆ/¾!24^7û?õáòfñgïÃìðègãôÛÖÔ!Ò&ÕüÙ7ÛØ”Õ4ÙâBëíé—äKä èÜì&ñqô¿õÎóîÇæøáËààãÚeÑkÉÈñ΢ÖÍØßÕþÒ@ÔÙßßßåTë¨ï3òžò0ó øš ˜˜Y#:1>¹CÕBfA¯CwIÞO>U Y7Z“W…P=Gì?Ì;v7o.­ ÷SŠw¢ >pú”ôJòÇð·î ì;è¨â!ÛÔdÑcÔ?Ù\Ú ×¬ÔrØçášê[ìHè äõãíçéìXñÑôNö›ôôîÏçAãNâªá¨Ü+Ó[ËÄÊOÑÙ'ÛØDÕ˜ÖÐÛâæç7ídñ·óáó0ôëøÖ /`!Ð"“0 =qBoAì?CBHmNÃS WÖX,VOßE®>³:m6Y- !† óÛã wÀùéó°ñ!ðîQë‡çéáGÚ(ӥЮӄØzÙÖÆÓ»×Aáê¦ë–çŽã¾ãäç í£ñOõýöhõíïìè¢äëãZãcÞûÔXÍ Í¾Ó]ÛyÝYÚ‚×åØÞ.äÜéï ó"õõ#õ¨ùq`Œ&"Ô/<Añ?Z>Ä@ FõLDR*VzWÍTªMˆD„=¦9u5S,šLò jV8 ºùJóñ|ïNí˜êÊæ(álÙHÒÞÏóҮןØÕÚÒÿÖ àdé ëöæããðçEí òèõÇ÷Sö÷ðêæ›å#å-àÝÖWÏOÏ4ÖÉÝÀߗܵÙ"ÛJà@æÀëÄð›ôröööRúé–ô÷W!þ.;Â?i>ÌÑ<2;ž=£CÿIIO6S§T*RüJòA=;™7…3n*¤Ÿ¾ r i K­÷ òáï5îâëéBåŠß·×wÐ9ÎnÑÖ¿ÖÓúЉÕ}ß6èÛéÝåRâ\ãHèþíóg÷®ù‡øhóëì=é/éïèýãØÚ¥ÓáÓ8ÛÆâgäáÞsߎä1êDïâóf÷ÍøÛ÷Z÷bû€°QInº-à8ë<-;’9<"BHÊMÄQESËP´I±@%: 6‰2n)¯Ï, ü Ïh ÷ölñBï‚í"ëVèƒä¿ÞÞÖ¢ÏbÍ­Ð7ÕÏÕ3ÒÐàÔß´çJémå âcã“èxîÃóEøÐúÍùÅôvîëëõêÿåëÜóÕpÖÈÝJåºæDãJàšá•æìáðNõŸøÑùøÑ÷´û›nÒw|Â,’7m;9æ7:˜@þFNLYPíQxOgHw?9²5›1r(Äú” … @² Ôÿ:öÀðšîÌì_ê”çÂãòÝÖÕΙÌíÏrÔïÔRÑjÏ5ÔÞOçÝèåðáxãóè ï‡ô;ùü/û=öðàìííè ß=ØòØXàÜçé}åtâµã‰èÉíjòžöµù¢úù"øâû–'‹f¢É*6á9Ì7-6Ü8?sEÖJóN˜P*N#GR> 8Í4»0ˆ'ë+í  ¸ &ÿzõ ðìíìžéÌæüâ!Ý'ÕÎéË5ϺÓÔ~кζÓ)Þçèâäóá°ãgé¹ïgõKú?ý¥üË÷ÊñÌî*ï'ïEê0á…ÚhÛÞâUê}ë±çä½åhêwïÜóÕ÷°úWû•ùSøîûr£ ]Š3g~) 4086h407p=ìC]I•MOOíLðE?=7ó3ë/¬&‡ C Š : kuþÍôTï?í^ë×èúå-âSÜLÔ3Í.ËÎ Ó]Ó²Ï Î<ÓÏÝÑæVè¹äâäùéƒð_öqû“þþsùŒó¾ðBñCñfìYãÆÜØÝdåºìÏíÓ锿®ç6ì ñ3õñø’ûøûòùyøÖû2 {ó0(#3|6K4š25ß;kBèG7LNÂKÊD3ÁCFHiJ^H‘A99§3Æ0µ,^#×à cÒ J –ûìñˆìfêhè¸åÃâíÞÙôÐ÷ÉPÈÝËÐGÐÉÌŸËÉÑÝ=æèÔäßâæí€ô'ûàä§cû5ù(ú,úõDì+æµç‚ïUöqöÉñòíwîaòPöuù5üîý\ý=ú øÇú.ö / J   ¶–"-­/-£+ã.³5¡I?G‚@=8Ñ20ä+x"$ åq Ä JÌúñÈëªé¡çèäõá(Þ>Ø.ÐNÉ´ÇK˂ϗÏ0ÌRËžÑ1Ýcæ èåjãÓæ î¾õ‘ü–­Õ£€ý€û~ü‡üO÷~î–èRêò¾ø}ø’ó›ïþïªóU÷3ú¶ü5þ\ýþù–÷6úiÕ µ ?!`+ß-2+Ø)C-/4/;AËE H*Fw?R72M/+—!7r l B ‘úHðëêèÖæä(ákÝ×lϨÈ5ÇËÊúÎúΦËË«Ñhݪæ`èxåä½çDï÷þC~د§ÿÒýÝþÉþ”ù·ðòêÙìŽôû~úGõ&ñbñÏô9øÒúý\þ>ý¥ùÿö†ù¨D  b ²ª)ÿ+Q) (¡+¯2Ç9Ã?žDG$Ez>w6?1Ÿ.a*Ä rèå¶È ãAù‡ï8ê&è æGãYàªÜÅÖ¯ÎÈ·ÆVʈÎtÎ,ËÕʽѥÝçÂèóåÏä¿è|ð€ø«ÿb Ï ÊÕ'@Êûèò:íEïõö%ýlüçöò òÕõýøVû\ýeþý3ùcö¸ø›ÿoÃz¬ÿ'-*~'4&ø)41j8}>qCF-D‹=¡5‰0ó-±)ý¯QY^ DøÆîréfçJå|âŠßßÛÖýÍbÇ9ÆçÉ ÎÎÄÊ¡ÊÔÑð݃çG邿–åÏéËñúVÔT Ú íz¢_üýõnïñPù?ÿ0þhø×ó¾óÀö¤ù¶û}ýPþ¶ü©ø¸õÜ÷’þ(4ÎhvY&](¬%$[(Å/7>=HBEFC¤<Ï4Ù/G- )8ê½ üô¹÷î½è§æ‚ä¯áÄÞ#ÛWÕHÍÃÆÇʼnɘ͎ÍbÊÊ ÒVÞãçËé"çwæûê,ó‘ûº `õ Oز*Q÷¥ñîóšû=ÕÿÕùõ¿ô‡÷$úóûý%þJüþ÷íôýö}ýÕ™rá ìµ$‘&à#Ý"Ó&Z.Å5<-AÿCdBÁ;4-/£,K(y$!µ‘nøôöCíèäå½ãèàÞnÚ£Ô£Ì'Æ\Å9É<Í(ÍÊkÊKÒÎÞdèYêÚçhç2ìô/ýÚ´ {K ¨Eˆ_ƒùùó&öÒý1o.û&öõ.ø‰úügý×ýÂû6÷ôöSü{÷P¾I O#Ð$"4!R%ó,4Ý:@þBgAã:23‚.,Ž'¬Xw<$×T.öyì@ç"åúâ)àNÝÀÙúÓ Ì®ÅúÄúÈúÌÞÌùÉkÊ™Òaß é ë·èbèuí öäþ¹¹ ©X‹ »  s ”¦û0öløûÿûkü.÷dö¹øÓúü/ýaýûTöÿòìôûùQö  ©u!#O †Î#“+E3½9? Bz@:b2Ô-d+Û&ß»´³H›bõ¥ëzæeä=âoß™ÜÙ\Ó{ËJÅ®ÄÉÈÏ̯ÌëɪÊúÒàÔéÚëªééÍî½÷¯¨ÃÚ Ö` 1 o Ú ÈÀýWøŸúùmŠýø÷-ùû üÛüÏüOúUõàñÃóËùfÿ‰¡þ)ùªV!‡ßW">* 2¥8>A?%9¥10-Î*(&Ö8G°Øÿ›ôÒê¹åªã‚á¹ÞíÛ|ØÁÒïÊðĊıȴ̊ÌíÉË£Óãà±ê¹ì²êÞêPðnù‹© âé½­áëÇÿoúÂüö™º…þàø±÷{ùûÙûpü(üeùAô¥ðˆòtøÌý³þÃüYþUjç~À>è ò(Û0’7#=;@­>K8ð0“,>*}%B¶ÛÿÓóêöäñâÊàÞEÛä×2ÒkÊ™ÄjĤȲÌ~ÌÊhËXÔºá®ë³íÌë;ììñ2ûz¼ A#m'RPú ¼lüÅþÊ èbÿ‡ù$ø­ùûûíûjûkøópï:ñ÷-üÞüñú‡ü¨Ï3¸›x«'´/‡60=ª6†/c+ )8$´” hÙð ¤ý>òžèãŽárß¼Ü Ú·Ö"Ñ|ÉýÃ?ĭȨ̖Ì\Ê\ÌîÕšã¦íëï7îïJõêþ‚ ’Ú¸æ*¾ü "{/ « ÏËoú²øÈùžúµú£úºùEö¦ðèì’î)ôãø0ùC÷4ùt¼öPϱÃ@%€-ƒ4N:ž=8<Ø5Î.Ì*r(r#èÆ Ébd]áünñãçãâÞàÉÞÜ€Ù5Ö£ÐÉ·Ã<ÄÏÈÃ̴̬ÊðÌÜÖ°ä¶î ñ‡ï©ð÷Ù =è; !kV‡—ñéy /¹ Ð “ WÒúÎø§ù=ú!úÞùÄøõDïë1íªò@÷U÷fõ‡÷î.k¬>Q‰$m,3p9ÂàXÞiÜÚÍ×ÎÔ_Ï9ȺÃÅ3Ê`ÎeÎ,Í Ð}Ûøé<ô»öäõÊ÷Õþ Hjf$×)*¿&¼"ÿ!”"üæ½ (ð ]— Iû0øü÷¯÷Ùöéõôï;éKåçjìLðóïî¦ðºú iMß·W(ñ/<6¸98æ1T+Ð'”%íÅÕxÿ•þ™Óùø©ínä®ßÊÝçÛ«Ù}׉Ô1ÏÈÛÃxÅÄÊòÎÏüͽÑÞÜiëÀõWø›÷´ùèA ‹ÇÑ&8,Ö,û(î$3$¨$À!\L  1ˆ³ .Æú½÷Q÷ÐöÔõÀô²òî¥çÆã’åäê§î,îbì)ï>ù²˜ð𨎓f'/r59f7#1¦*9'ò$JõÒþþ?EøöìÓã&ßGÝuÛQÙ:×UÔ ÏÈÄóÅjËžÏÐÏÝÎçÒNÞôìE÷úZùžûýp Ò+!>)›./5+!'Q&£&o#½CS ð ëæ½ Wú)÷ößõ»ôóRñ‡ì æ4â äUéímì°ê¦íÜ÷`=‡˜ vs“&G.«458µ6h0÷)š&I$(1#þýq£ÿŸ÷Gì9ã¥ÞÓÜÛÙ×5ÔÏ;ÈPÄ|Æ"ÌdЧÐÝÏÔËß•îåø®ûûˆý£„#©+ý0d1b-H)\(‰(%^e Á -® Âéù}öµõÖôó2òæïøêaä›à†âÂçgë­êûè(ì…öê $G O m•—%y-î3r7à5¤/C)&©#¶IVyýýåÿèþñö ë¯â3ÞeÜ´ÚÆØêÖ0Ô ÏqÈÆÄ'ÇÿÌCÑŽÑÑqÕgáMðŽúaýýƒÿ:Ú\Û% ._3›3y/Z+\*_*‡&!SX – V} _iùÆõÂô³óMòÖðbî[é¬âøÞÿà4æ¯ééèAç¨ê2õ¥… à ÷ * jœµ$°,83¹65ß.Œ(g%#ój„ÉüƒüfÿAþ=öüê)âÈÝÜeÚ˜ØàÖ@Ô.ϼÈ_ÅñÇõÍ@ÒÒ=Ò×ãòWü,ÿõþ›` ¤1(b0±5Í51Q-<,ÿ+ï'#! >ym8 áÈøúô¹óòþðoïÙì®çîàLÝrß§äþç(ç‡å"éÝóQ m ®  e¤Í#ì+ˆ26Q4.â'Í$x"8’Éüÿûíþ­ýžõyê©áeݰÛ$ÚzØæÖiÔjÏÉ ÆÜÈÏYÓ§Ó‚Ó–ØÜäô9þ òÕ Së ƒ*²2â7õ7y32/.…-) ʳ ¼«WÞ J øôžò;ñŸïûíJëæFß›ÛàÝãXæqåÝã—ç‡òº gß b³ë"+×1Y5˜3f-@'0$á!…à ‘ûyû€þ,ýõýéHá ÝnÛöÙkØùÖ£ÔÂÏšÉÂÆÒÉÐŒÔØÔ×Ô/Ú¬æãõ2üòæÓ “3#Ï,÷4 :ó9`5ö0§/ï.%*ËN%Äf –ÿ3÷óqñæï2î}ì·é\äŸÝÚPܘá»äÂãRâæ=ñÎþlÆ>¾fÇ "T*!1´4à2ª,™&™#N!ÔðNûû#þ´üˆôŒéþàÐÜ8ÛÓÙlØ!×åÔ)Ð!ÊÇáÊCÑ±Õ Ö0ÖØÛèÃ÷éôÐq%/87,<ß;,7Ÿ281E0+g »yb˱¿ ÇþIöò4ðî¹ìýê&è°âóÛzØÑÚ#à)ãâÅàÕäð¦ý*Àqß-!‰)d0 4-2é+í%#¨ ,‡„ú»ú½ýMü ô"é»à§ÜÛ½Ù{Ø\×@՜жÊdÈÌŠÒóÖVגׂÝyêµùïßú< W ¦'R1q9E>Á=ã894­2†1ø+ì §€¶B õýEõððèî í6ëp鑿áBÚéÖ_Ù¹Þ¬á{à=ß…ãÔîˆüûGûÉ… ùQ À(©/E3x1%+:%d" gL »íùPúMýÞû£óÆèà‡Üùں٠جױÕ)ÑwËNÉ9ÍìÓUؼØÙ3ßiì·ûäÝ e ”EÙ)ƒ3 ;P@’?†:Ä5 4¯2Á,V!ZÜ}‹ÈLýBô»ïí‘ëªé×çòäVß“ØZÕî×DÝ7àäÞ³Ý/â¤íZûààÍž võ'ç.~2¦0c*‡$Æ!a¢{ êÿLùãùéüjûHótèLàpÜôÚÍÙÖØ Ø6ÖÔÑ[ÌkÊ„ÎcÕÎÙ8Ú¾Úðà`îÍýôî 5 ‡Ë}!,¢5­=IBUA<37J5¹3s-¥!tåfLB‚ü2óî)ìêè5æ>ã¨ÝçÖÍÓÖÓÛ­ÞTÝ,ÜÖàpì ú³ûÉд ,ž,'$.³1Ó/£)Ö#-!Ä㯠-ÿ°øzù‹üÿúêò1è+àlÜÛõÙ&Ù‡ØÔÖ“ÒTÍ´ËôÏõÖ[ÛÃÛxÜïâiðéÿ  g Í«#%.³7¡?!DùB‡=†8p6‰4.Í!oÙ:Õ˜˜ûòBí¸êèæ—ä‘áòÛ8ÕDÒÕnÚ%ÝÃÛ¦Ú‰ßKëðøhÒ²ÙÏ D¹`&f-ð0/ã(2#™ /*ä Œþ#ø ù<ü¡ú–ò èàxÜÛ+Ú‡ÙÙ×kÓ`Î Í…ÑŸØÿÜ]Ý:Þöä”ò!' ›DÕ%:0¶9…AÍEˆDÛ>¸9w7?5O.Ó!@¤ñCÌ÷ùåðòë<éçæÞäöâçßAڟӸкÓÙ¬Û<Ú/Ù6Þ*êÐ÷2¤˜Ûæ \Ô‹%ª,107.!(”" ¦~ éýÄ÷Ïøü[úWòôç"à’ÜNÛwÚÿÙ¸Ù]ØYÔ{ÏqÎ%ÓLÚºÞßàýæÄôL]EËZó'A2¨;UCcGÜE @Ã:\8Ù5‚.¸!êGˆŸ× ‹Àø›ï‘ê¸çLå<ãUáBÞ—ØÒGÏ\ÒÄ×BÚÁØÖ×éÜ éÁöÿƒ˜ÿØüyõ³$ß+x/r-b'ò!x àg Iý^÷’øáû1ú,òæç?àÇÜšÛßÚŒÚmÚ5ÙdÕ®ÐãÏÍÔÜnà¿àÌáÿèðötsóŒ± *A4…=EàH G(A®;9V6¡.Š!„À û éÝ aq÷:î%é6æµã—á®ßžÜúÖŒÐíÍ Ñ|ÖæØTׂÖÇÛñç¼õþýnÿ™þî™×#+¯.°,¦&Q!æ|H±ªüûöYø®ûúòççnàÝúÛZÛ.Û:Û&Ú~ÖôÑkÑÖ×Ý.â„â¢ãë*ù£™¾Û!,!6L?¨FHJIH*BŒ<Ç9»6¡.;!!1 a Æ .öØì´ç§äâñßÞÛaÕ Ï›ÌÑÏBÕ×äÕ1Õ±ÚôæÃôëüWþŸý5±+õ"'*Ì-é+ä%® XÞŠóüšö)øwûåùøñôç¬àwÝiÜáÛãÛ!Ü3Û°×dÓÓcØ¿ßäYäŒå%íqûå ¿¸@èù# .ë7ò@5HŸK[I CQ=X: 7‹.Í –¬ ² I­ Úßô~ë8æãgàHÞlÜrÙÏÓŠÍHËÎÔJÖ|ÔÙÓ‘Ùöå½óíûMý¦ü6ÿ\È@"O)ð,+% ÌLØ<Xû1öý÷Uû¹ùóñ èóàâÝé܀ܬÜÝ\ÜýØíÔÅÔMÚÃá÷åAæšçAï½ý7 ôáw&ð/£9BœIßLRJÊCï=Ä:C7c.F çý ñ i Œ ‰ÿ}óê·äsá»ÞŸÜÌÚÕ×CÒ ÌóÉkÍÌÒøÔÓ€ÒiØõä²òçúJüªûPþ€ãY4!z(,2*_$[AÆ;˜ÁúÆõÔ÷Eû¦ùôñ0èEáaÞ„Ý9ÝŽÝ2ÞÝdÚ‰Ö¢ÖHÜÛãè<è¬éƒñ‘2 ž# (È1F;ïCÕJöM2KlDg> ;97+.ª)  _ e.þ ò¦è<ãàßÝøÚ.Ù@ֿЕʣÈ=̣ѸÓÏÑ+Ñ>×ñã¯ñÏùEû¨úbý¡pS ¡'H+c)¨#À»J¬Súfõ³÷Cû¦ù òzèªáöÞ8Þ Þ†ÞWßòÞÝÛ3ØØ[Þæê=êÃëÈó[êi(¼="õ)…3Î8;7¬-ë2C  1 Æü›ð7çÃáNÞuÛ\Ùž×µÔ@Ï=É]Ç Ë†Ð{Ò‰ÐïÏ!Öúâ­ð²ø3ú©ùzüÁ €lÒ&z*“(ò"8FÜ#oìùEõ¥÷Oû±ù0òÝè@â£ßÿÞîÞ”ßàVàaÝæÙ‚Ú{àè9ì?ìØí ö¯%œ? Ë B$Ô+'59>FøLŽOjLHE?M;á6-)@  û ¥Uû!ïÂåGàÀÜÞÙÆ×Ö6ÓÊÍðÇ4Æ ÊxÏNÑKÏÏÎÕâ¸ï¥÷(ù½ø‡ûÜ, ’‚÷%´)Ë'?"¯Ó}­ç‡ù#õ°÷{ûÞùròQéíâmààßíß»àÝáÃáûާۀܥâEêKîGîèïEøþU½M"Ä"*&—-¯6Š?›GÝM3PÏL‰E?A;’6o,/üÂ:ÖùœíBäÉÞ6ÛLØ8Ö—ÔÂÑa̧ÆÅûÈpÎ,ÐήÍÔáÐî§ö&øÑ÷¨úõD ¦™%ì('’!&aHl'ùõ¿÷Ÿû)úÐòÜé¯ãVáßàá÷áBãHã¦àtÝ‚ÞÒäyìkðaðöñsúB ƒÂ!O$§$ö'>/8º@˜H¥N¿P M´E?;-6¹+9 âÆ{ÎXø'ì»âKݲÙÀÖ¬ÔÓTÐËcÅþÃòÇpÍÏéÌŽÌÓ àïíµõ*÷áöËù` ¾².$ ([&í ¢ôÐýÌøáôÒ÷ÇûyúFózêäSâúá9âJã·äßäeâkß‘à ç¼î›ò‰òôšü ¯Æ#9&v&¨)Î0u9ÔAuISO1QVMÂE ?Ó:¶5ð*+æ À….\Õö®êHáÌÛ.Ø:Õ)Ó•Ñç΢É!ÄéÂõÆaÌ Î¼ËlËÒ1ßñì¿ô*öðõìø8y ×ÒT#-'‰%E $•-[•vøÐôú÷ÿû¼úÃó*ëhåeã'ã…ãµäHææ2äsáÉâ]éñÒô±ôXöÑþÄ Ö¹%(I(I+F2®:ÍB2JÜO‰QjM¬Eà>x:,5*° ”GÚÞÿGõ1éßßYÚ¯Ö·Ó¯Ñ%ÐyÍHÈÞÂÔÁûÅYËèÌÊGÊÑDÞæë³ó&õùô ø[ÿ‘îò~"Z&À$¥¥<ÛûE=øÉô3øOüûLôéëbæŽäläæä8æòçUèæƒãå´ëró÷àö”ø%þª'Ý)*ã,¡3Ë;§CÐJ;PÁQhMxE>þ9h4+)Òb Númgþ½ó³çtÞïØ7Õ;Ò=ÐÁÎÌøÆšÁ¸ÀþÄXÊÌËiÉÉÐTÝäê˜ò!ôüó ÷wþ§±!–%$5웲2øÐô}ø½ü—ûôôÕìqçÌåÅå[æÎçªé0êè—åTçîÙõcù ùÃúe5!’)—+£+c.á4Èm9•3(Œýñœïåü:ò8æ ÝŠ×ÌÓÈÐÒÎcÍÄʱÅwÀŸ¿ÄbÉÀÊWÈþÇýÎ^Üçé‰ñóýò1ö”ýÁ4ê Ù$V#רn×0ø õÕøDý6ü»õÚí¨èç6çäçréeë ìúé¯çœéoð%ø³û5ûäüL#n+@-(-À/6§=E±K¡PŸQ÷LºDœ=Å8²2ì&=‚~/pRû»ðÀä¡Û)ÖkÒkÏsÍÌwÉuÄe¿ª¾ Ã}ÈÀÉJÇÇïÍhÛñè…ðòò?õ¯üß=Y $$¬"úmS]´4øMõBùèýôüžöóîöé‰èºèé'ë.íåíöëËéæëÔò{úëýUýòþŸRá$'-Ò.Œ.ú07i>†E÷K§PdQ‰L7Dû< 8Å1½%èûþ¾þõþÆù6ïFã;ÚÑÔÑÎ!ÌÂÊ4È>ÃR¾Ä½CÂ¥ÇÌÈBÆ Æ ÍwÚè‚ïñ2ñfôÎû^Fn# "w/< Q¢GøŸõÂù„þÅý“÷!ð]ëêSê.ëîì ïÓïýíèë0î:õÖü"zÿö¨ J &¨.B0Ô/2ì7?ßEL—PQL™CG<=7Ë0…$‰©výIýwý9ø³íæáÛØ}Ó¿ÏÂÌÖʃÉÇÂB½Ü¼lÁÕÆâÇ?ÅÅ#̉Ùç…îðLð”óñú~ «{¨"r!øàþ4døûõRú(ÿŸþ¡øeñÕì©ëþëéìÅîþðÔñð&îyð£÷8ÿc§ /Q(0“1þ03®8€?FLnP´PlKãB;X6Æ/E#7 üÈûùû³ö9ìŽà”×0ÒrÎwË“ÉEÈÕÅïÀ5¼ô»–ÀïÅÇDÄÄ2Ë•Øæ“í)ïiïÀòú?¢ Ùµë!Ï „›õî+²‡øZöéúáÿ}ÿÇù¾ò_îTí½í½î¥ðóòÛó1òpðÛò ú›¥Ð"€ ýò)‡1Ô2"2ò3R9â?7FøKP6P¿JB«:^5µ.ü!¨¶ú@ú~ú6õÊê;ßXÖðÐ1Í7ÊSÈǘÄÌ¿,»»Å¿ ÅÆCà Ã8Ê™×å”ì9î†îéñEùfÎ ó4!6 %gìö9âÍøÆö’û³xû+ôùïï‘ï¥ðšòöôëõVô½òOõ€üêï/uº†+á2ÿ3)3Á4Ù9)@>F½K•O–OøI;A¾9S4p-­ #!ù±øíøÃóaééÝÕ»ÏùËÿÈÇÏÅc쾺,ºù¾8Ä!ÅLÂùÁ4ÉžÖúã„ëHíœíñsø˜ O? ¬ÐDób#DùD÷Uüª•Nü·õ ñßðvñšò˜ôþöø‚öõ¹÷ðþw. ÿ I^ -&4 54r5E:V@(FfKþNÄNI=@³843%,9’ |þf÷#÷[÷Jòùç”ÜßÓŒÎÎÊÍÇëÅ¡Ä=š½.¹C¹/¾oÃBÄcÁöÀ*ȦÕþâ€êPì¯ì2ð¥÷Ï@ ™û1ƒ/Q£xÊùø2ý¼Ê²ýX÷ló¿òjóœô¦öù.ú´øM÷!ú^Ãn  û ë Y.O5ö5É46—:`@òEõJRNÞMH%?”7 2Ò*¸ ÍüÉõ•õÆõ·ð‘æHÛ®ÒeͦɩÆÄĂà Á‹¼G¸u¸o½­ÂdÃyÀÀ+DZÔâzé\ëßë]ïÛö€ ÙôuÁB(%žùÞ`úÔø'þå.ÿùRõ³ôkõ¨ö¼ø,ûJüåú’ù„üÆ „ í » ªY"z/L6Ë6n5y6Ê:M@¤EjJMâLòF>j6Õ0|)6q (û"ôô=ô6ï2åÚƒÑG̊ȑŨÃf Àƒ»f·½·¸¼óÁ‹Â‹¿1¿IÆºÓ áèpêëŸîöKÿÉ'Eí\3XÖbOüú«ù(ÿ xºÑúB÷¸öy÷¿øØúIýgþýÕûèþ0L Î ],­#‡077ô5Í6à:!@8EÇI±LÓKÄEÚ<=5ž/&(´Ü¢ùzòyò¼òÀíÛãÙØ^Ð2ËzǂėÂOÁú¾€º†¶· ¼FÁ»Á¾C¾aÅÅÒ àŒçˆéHêêí]õ”þ¢SÿáE˜%ÃΠûŠú85àY¢ü?ùÎøšùäúýsÿ‘Qÿ/þB–“­úæ$1Ì7 8R6ü6×:Ø?±DIÁKµJ‡D˜;ÿ3S.Î&5FøüðñðJñWì‹â²×PÏ&ÊsÆzÃŒÁ>Àõ½†¹¤µE¶U»zÀõÀ²½L½oÄËÑß æ èué.í©ôáýnÜ ÌŸ»\âŠ<nQüvû\€O þGûðúÊûý4ÿ¦É•¦ñ Ò¢} Ø&d2o8{8 67®:s?D#H±JŒI?CF:®2ó,r%¹°€övïoïèïëJá’ÖLÎ%ÉsÅz‡À4¿ë¼’¸Á´€µº±¿ÀļM¼qÃÌÐÞ¬å¾ç¤èqì÷ó7ýÎF€XU°‚@ Ô2(ýoü“æß ÍiVýýþ\ÿnÞ×ä @ š5%&'23ü8Õ8Ò67i:ö>XC/GIHHæAä8P1‹+è#>çôîíñíuîµéàxÕLÍ.È{ÄÁ‰¿.¾ä» ·Ü³½´é¹í¾;¿Û»F»pÂÍÏ Ý¢äÜæÕç¸ëLó–ü8½ð¶Ç»§ƒ>þ‰ýèb { ›rtÿQÿC¢²;/f‡0ỷXì'ä3h9 9å6ë6 :_>ŒB*F@HÓFw@r7î/'*e"¤xNónì}ìþì`èÞÞdÔSÌ>ÇÓÀ—¾2½àº«¶³û³;¹,¾Y¾ôºJºlÁÒÎÜãôåçë§òüû¯?œšåÌ(ObLòcÿåþU÷ / } Œ¯–’ôüOn ?l° ºCDÉd¯(]4·9$9Ö6´69³=«AEóFXEî>÷5„.Á(ç æ®ñêêë•ëç°ÝTÓbË\Ʈ°¿¤½7¼ã¹»µE²B³ˆ¸o½~½ ºl¹fÀÚÍ Û¡âåIæLê ònû,Ä3ZÍò”é82ð‘HÙ¯ s ²ÿððNHˆ ˜ o › ä ÖüÜœàEQ)­4Þ99¤6Z69î<²@åC•E×Cb=|4-U'mdÿ!ðdé«é@ê¼åŒÜMÒwÊÅØÁؾ¾¼F»ñ¸Õ´|±“²Ó·¶¼§¼#¹‡¸‚¿áÌÚ±á1äå«éqñæú³TÌ$È( ‘õ2 Ͷiaê} æUVW¯™ Ä Ã › º ÛÅ^ãÑþÎ)â4Ò9ú8R6ß5g8<¥?¨B*DMBÐ;ü2š+ç%úéýÂîäçLèúè‡äuÛ^ÑÉ¯Ä Á ¾à»Vº¸ð³¯°Þ±·ÿ»Ô»9¸™·”¾åË3ÙËàZãÙäéçðpúNö uäÕp™OÍ/( - Ø” «ÀÊ  ì ùå½ã Ê{̱)*þ4±9®8Ú5A5¥7(;Œ>VA°B·@6:t1&*x$’‹xügíœæùæÂç_ãfÚsлÈäÃKÀG½ »h¹·³Ü¯#±]¶#»»J·©¶¦½ìÊ6Øëߊâ(ä„èmðúú® 4·ÜÅ;*Ã?k q»º Ý·®Z . = ‹ D3Ëûª'•p*ý4n9E8^54Í6%:_=ù?)A?Ž8ã/³(#2 ûì]å¹å•æ:â]ÙÏ÷Ç"Ê¿†¼>ºƒ¸¶²¯g°¥µKººP¶¯µ·¼ùÉ0×ßÀáãýçûï©ù³v ¡û8ó ØkÊ íW‚ ¼¯Ñ£p ¤ ´üjÍü p¤ I MŽ—*å49Ã7Å4Ó3Þ59!<>‹?r=ä6N.='™!­¯ “ù´êää`å(á_صÎ8ÇlÂӾɻq¹ ·&µ.±!®¤¯é´v¹!¹aµ­´Â»É4Ö ÞùàÙâ{ç•ïWùuL ñ¦5ÄÇ0 ´@ \±¹Ü .hê‘!¾ãà"c!Üßä›*¶4¥8&743Þ4å7Ò:=å=¯;:5¶,Å%/ 56 'øZéÝâMã+äàl×ßÍ}ƼÁ#¾»¦¸¾¶5´G°W­Ü®.´©¸<¸´¼³ÉºÈCÕ"Ý3à5âüæ5ïùH0 ðňd³R!Y!É_ ë F¹Ö<dSš¦Ð2©œ°˜—C#d"ŠO €*V4%8u6?32Í3²6}9“;<<í9ƒ3+N$ÇÉËÕöèžá âãßÖ Í¿ÅÁ{½aºÚ·ØµC³a¯‘¬®m³ß·_·¥³ð²Ð¹,ÇaÔMÜzߦá}æàîßø.! ôøó­w"¿"”c" Ñ :ØÃÊ!8n±÷ea1þ\$6#– F*Ô3„7­5P21¬2t5!8 :Ž:.8Ò1’)×"hnq“õ½æ^àáøáÞšÕ4ÌÅeÀؼ¶¹·÷´W²{®Å«f­±² ·‰¶Æ²²¹NƑӃÛÈÞ áæ—î¸ø!% ?qÛ¹ ´#$%î Å BïCÊ&E–—•¢²Èó«I!X%ß#†¶ ÷)83ª6Ã4J1ô/x1 4®6~8ã8r60(l! Wô¬å6ßóßõàݶÔwËPÄÿ7¼ ¹W¶´s±–­÷ª°¬õ±f¶±µâ±H±>¸~ÅÌÒÁÚ Þ¦àÐåaîžø%= 0‚±Û! %w%©±ÂÃTþr!оë̦ˆº ~">&p$ßÇÛŽ)‰2Á5¿300Ç.40Á235ã637´4k.{& ÉßÖó›ä?ÞìÞùßÜÖӼʫÃ!¿•»b¸–µA³‰°­¬$ªö«;±µã´±w°|·µÄÿÑÚ‡Ý:à’åDîšø>j q✙ #s&ù&A!wšÅn!“#^!è1†k3â…4AöX–#'ì$Ý‘)Ì1Ç4¤2 /ˆ-ç.\1±3@5{5þ2¿,ó$§t¬œíñˆãFÝòÝß#ÛùÒþÉ Ã†¾øº¸·Ò´`²–¯¿«H©4«~°»´´*°¦¯º¶÷Ã4ÑeÙúÜÔß\å7î­øn® É\R ¡!V$ò'•(ó"XŒÈŽA#Ã%¤#B œöÊp è M!Å ©F‡Š$Æ'O%?ÎJ{(þ0Á3{1Ö-A,‰-í/,2›3·3E1+o#J)ZsÅðvâIÜ÷ÜÞGÚ(ÒDÉiÂñ½bº·´±¥®Ûªi¨qªÅ¯ö³8³b¯Ò®øµ@Ã~йØzÜuß.å8îÕø±7ñ#!Á"·%Š)M*Á$I­Õ¼}%(î%¡"ý ^!""ž"×"ö"<"õr O%^(•%:”ÚÆ'"0ª2;0†,ì*%,{.£0ò1ó1{/y)ï!ñå?¡ïeáQÛ Ü"ÝgÙUцÈÉÁb½Ò¹q¶N³ °º­ü©¢§©© ¯7³o²©®®<µ˜ÂØÏØýÛ!ßåQîùr¤"ô#,'2+,¢&IÛ"üÁ'=*1(ü$g#Á#k$º$µ$Ž$œ#"!zp!õ%¬(¹%>Uù&/v1ã.%+Œ)º*ÿ,/L060·-Í'm ›©ß îZàcÚ%Û1ÜsØ‚ÐÈÇ&Áμ>¹Ñµ‘²Æ¯Ï¬©ß¦ñ¨Z®²¬±ô­­´ûÁ>χ×ÛîÞåvîaùyùam #9%¶(à,.•(UtE"*ƒ,{*V'Ê%&¨&Í&†&&Ö$."a 7"&ã(ª%ÌÅ®&Ý-'0~-´)(@)z+‰-«..ø+'&üQ~¹ îþ‘íbßsÙEÚJÛ‹×±Ï ÇƒÀ9¼©¸1µØ±ì®ä«3¨¦F¨¯­Õ±ó°D­î¬´iÁ³Î×3ÛËÞå©î¿ùú’ F $Ž&P*¡.Ð/—*e!C¿Š$M,Ë.Ä,¬)((d(×(Ë(@(|'ø%"#%!Ý"ô& )†%u+è%œ,³.,5(ž&Ã'ó)ó+ -Í,E*Ž$—cª áýœì”Þ†ØkÙqÚ®ÖåÎcÆæ¿¬»¸´±®øªK§I¥“§ÿ¬9±H°–¬U¬ˆ³ÝÀ9ΑÖÝÚ¯Þ2åôî2úŽ<È!!=%ñ'÷+u0·1˜,~#r×&‡.1 /û+}*«*ø*·*à)Ë('û#Ü!_#K')S%}$R+7-x*¡&%A&l(_*d+#+Ÿ(ÿ"2ÝM­ åü¬ëÁÝÊרªÙßÕθÅR¿!»Š·ï³\°1­ ª_¦q¤×¦P¬~°¨¯ë«¸«ÿ²YÀ»Í.Ö‘Ú˜Þ]åVï½ú; "l&`)ª-[2µ3©.®%¤S!-)Î0F3M1;.Á,á,-Œ,j+*ï'³$r"Ç#…') %Úá"ú)¬+Ú( %}#¸$â&Í(Â)x)þ&r!Ч,» óûÅêöÜ×××çØÕWÍ Åþ™ºþ¶T³¥¯Y¬©r¥™£ ¦¥«Ì¯ü®J«*«‡²â¿9ÍÌÕYÚ™Þ åÎï^ûà“'#­'ë*p/R4Ã5Ê0ö'ó!¥#+3s5~3p0ö.//I.Ü,+¿(J%è"$ž'þ(¤$ö«!’(*6'v#ð!,#Y%@'*(Î'a%íuy¤ ûâé*ÜUÖרFÔ‘Ì^Ä-¾ ºp¶¸²î®€«0¨¤¼¢f¥þª"¯U®¹ª›ª²v¿ËÌnÕ2Ú¨ÞïåWðüàÜŸM$)‹,L1_6æ7ù2C*i$ú%Ý-Y5¨7­5¤211å0ñ/4.,p)¾%9#G$‘'Ê("$9=c %'{(ˆ%Ó!`  !Õ#½%œ&0&½#q"XžúúèXÛ™ÕQÖ;×xÓËˬÔ½€¹âµ²4®¥ªB§ª£ö¡¯¤`ª†®¸­6ªªŸ±¿wÌ'ÕÚÂÞQæûðéüÖéÆ%t*<.:3|8":85”,Ú&}(E0¯7Ü9Î7Å4133²2z1h/ö,ý)&`#M$c'P(ˆ#[9î–%Ò&È#" Ë W"?$%$+"ùÔ;­(ù%è‚ÚÜÔšÕqÖÒËôÂú¼÷¸Uµ±x­Ì©Y¦Æ¢1¡ü£Æ©ù­*­¹©Â©5±Ò¾8ÌñÔ ÚüÞÄæ¶ñÔýâ ï&ú+ø/.5“:v<7î.I)ú*®2:<æ9Ö6;5þ4l4ì2„0¸-n*?&a#.$'Å'Æ"c­œð#%þ!e-˜Û É"–##© •## ÌNøeç¿Ù ÔíÔ¶ÕÎÑ5Ê8Â\¼m¸È´á°Á¬÷¨t¥ä¡i T£/©t­¢¬?©n©±™¾ ÌÍÔ ÚJßXçƒòÓþ GL ](Œ-¾1/7¶<ž>å9G1¹+y-5M<7>ì;Ò8*7É66?4…1_.¾*T&>#ñ#²&'â![ß`%;"9#- ¨“dV!*"¤!3.eE ù~÷°æ5ÙyÓJÔúÔüÐjÉ‹Á¿»â·:´E°¬(¨¤¡¢Ÿ¯¢—¨û¬$¬Ð¨$©Ø°o¾ð˺Ô#Úªß èkóëÿ@ —©!É)+/399ã>Ô@,<¡3#.î/r7u>F@Þ=²:ý8|8€7x5d2á.ï*L&#“#1&f&ñ Lû¡‡ a!Tá÷žýñÀ : ÌÜ>!k :Àöæ£Ø÷Ò¬ÓNÔ6РÈÙÀ'»\·´³¯¯]«Y§¯£ Úž ¢¨h¬¶«g¨Ú¨°°Q¾ÚËÂÔMÚàÈènô— #J+Ô0m5N;AC}>6€0T2È9š@:Bº?u<±::à8Ž6%3C/þ*!&Å"#š%%î$fÓ‰{(X*Ÿ™aØr’*Œ Œ öRå ØpÒÓªÓsÏÔÇ#ÀºÕ¶0³¯±ª¦Ò¢=Ÿžf¡|§ã«@«¨’¨°A¾ÈËÒÔ…Ú”à™é„õe~¤$ä,2\7l=hCtEÚ@w8æ2°4<¹B D|A>J<;":„7Å3Œ/ø*Û%X""ç$Ç$Þë!‚² r˽GI€)Wÿ8 ¶ ºeõ¦äq×âÑuÒöҵΠÇl¿ø¹N¶«²‰®ªÌ¥¢ržBÀ ù¦p«Üª´§O¨s°C¾ÒËíÔÑÚ"ázê­ö¾yD&•.[4S9Ž?¹EÙG>Cä:e57]>ÏDúE+C¶?Æ=éD<9®4Ã/Š*ç$!!##º"‰?P 9E óÉü¶Ò›ý–ðÙm )8öóXã5ÖÈÐBÑsÑÍjÅ𽺸4µ˜±g­»¨M¤[ Úœì›™Ÿ¦·ª:ª]§?¨|°Š¾(ÌfÕ³Ûâxì<ù°¬i¹)2 8]=ñCXJ½L H±?O:à;ÏBÙHvI@F–Bq@F?/=³9ö4°/#*?$H 8 #"‹!7ÌÌ ¯ ¡Î-XI©}ªoÉaÉ× Ž pOóÇâœÕ5гÐÇÐEÌ™Ä)½¸°´±Ú¬¨”£•ŸœF›Ÿ»¥xªª=§N¨º°Ó¾ƒÌÉÕ=ÜeãŸí¥úH]&!~+ø3÷9g?#F¥L OxJB¥<1>õD¾JK¢GÕC›AI@ü=1:5/§)‹#Y8!R ÕP1  H@ ÐaL}I¡:®Ü µ Áðÿ®ò2â%Õ¡Ï,Ð&Ð~ËÇÃo¼y·0´™°K¬w§á¢Øž\›£ššž[¥MªÞ©)§g¨±5¿þÌGÖÛÜMäàî&üö "ö"U-Õ5ï;wAYHöNZQÌLSDè>m@ GƒL¥LçHóD£B,A¢>‘:#55/)¾"fê iÖ˜x ]CgkêZ %[)…šå áXÿòœá«Ô9ϦÏϲÊò¶»á¶¯³°Ã«ß¦9¢!ž¥š š-ž ¥ ªÈ©&§˜¨j±ª¿vÍØÖ’ÝQå8ð»ý´ ùÚ$:/¸7ã=‹C˜JNQ¬SOŸF#AŸBI%NôM J÷ECíA$?É:5Ñ.](Ò!d½¼ñS $ߺ {†ŸV ñ æBn†ò YÉþtñá0ÔÏÎÏÚÎâÉÂÿºO¶0³¢¯B«S¦›¡sò™x™ÎӤݩ¶©1§×¨á±6ÀùÍv×ZÞcæŸñaÿ äÎ&-1¦9Þ?ªEÛL«SVZQèHSC¹DöJºO0OKÐFTDŒBˆ?ã:à4L.‹'Ê EÕ}grÁ a Ã²Õ À • ¹ñ:Yðz N¥þÞðgà¨Ó[ΕÎ.ÎÉFÁ@º¸µ³²2¯ÊªÉ¥¡Îœ]™ë˜xª¤Ë©»©Y§©a²ÚÀ Î%Ø2ß~çódØÐ(-3¢;åAÐGO VcX¡S"KŒE¶FÐL@QUPïKGôDCÏ?Ü:ˆ4§- &¨ Œò% Õ„ é . H œî<Säy  ‡ûlý?ðÅßÓÛÍÎzÍPÈhÀ|¹$µ<²À®Pª?¥n 9œÔ˜~˜&’¤Ö©Ü©¡§w©ð²šÁgÏïØ#à¨èœôìWÔÓ*<5²=öCóIXQhXÇZäUHM¥G¼H—N³R\QªL)H|ExC÷?´:4ë,¢%o².µ‰l€gJîi ' R © øJZâ /ÆXÊü›ï-ßzÒ^͇ÍÀÌlǃ¿·¸´Ç±Q®Û©Ã¤çŸª›R˜'˜òœŽ¤î©ªû§ª¢³qÂ:ÐÄÙ'áÿé6öÇSß ã,N7¼?ÿEL–S¥Z]X[OµIµJ:PýS;REM©HåE¹C@y:3,‰$PÍFôÇÖÒÍ_ª b ž0Õ„ j2nåˆ X¼)üõî¡ÞòÑãÌÍ̋ƨ¾ñ·ý³R±å­n©S¤iŸ!›Õ—חל›¤ªDªb¨ÅªŠ´`Ã%Ñ­Ú9âaëâ÷¬Zö"ÿ.`9ÉA H4NÏUß\5_/ZTQ KˆL¾QUSÄMI-F×Cò?':ö28+\#ÈÖ\Óh&74ÿKÙþ £ 󸢂 ‹\Œò˜ ‡]*—ûXîÞ…Ñ^Ì~Ì[˸ÅÔ½=·i³ã°‚­ ©ë£õžŸš]—‹—œ¬¤hªªÜ¨{«yµ]Ä0Ò´Û`ãÏìžùžq%'1|;ÑCJLPX_Ka,\1SdM0N"SV¬S#NBIRFØC½?½9D2=*"``Û]ä ªœýÅþ[f÷\ExŽ B´†´ ­ ³¦•ûÃí}ÝÑóËý˸ÊêÄý¼‰¶á²€°*­­¨…£Šž+šï–D—³œÎ¤§ª«g©9¬p¶nÅEÓÐÜ’äGîjû¤ ™J'P3=âELZR"ZÃ7•/Ð&óÅÁJÕeÒÿ\ù²ú/ê,Ír]õ r6?a ò8ˆšÿùÛëœÛ€Ï¶ÊsʤÈqÂuº|´l±h¯C¬Ò§¦¢,™–á–À¥æ«´¬«¯ô¹4ÉÑÖbàèóñ, ù-: D LRxXW`vg*iKcáY¢SÍS®WäXÔTLNòHÂEÖBè=ï6ˆ.‹%r­<¹;gýç÷eùÞþzªSÿ3ÿc3C Ä „€ ‹ `Òúþyø/ëüÚæÎCÊþÉþÇ£Áž¹Ì³ø°¯¬™§q¢gö˜÷•î–<8¦‡¬n­‡¬2°=»¥Ê6عáê¹ô"s">0>{H(PüUO\,dklZf\%VV;YŸYºT¥M!HÖD­Ap< 5:,Ð"G¦ ]  j ð@úõÚöHüŠÿœþgüÊüŒ²ä y @  êaÖzÿÐý<÷áééÙÎÉ,ɺÆÀ%¸Ÿ²5°£®¬«R§@¢7¶˜Ú•A— ža§ ®¯®Ô²S¾¸Í Û}äíUø/— 'Û4É@¥J$RÙW!^ýeÈln¢g¯]2WW×Y¹YxTMˆG5Dí@†;ü3þ*b!¥ìØ ± s Ò TÉøœóœõû'þýû“û¢ÿ÷= Õ œ o … Éþ=ý¬öAé[Ù´ÍAÉ×È0ÆU¿n·²á¯z®–«G§A¢?µ˜ä•—ž¨Ñ®°©¯1´ï¿XϨÜ÷åî"úC Ó`)-7 CËLT«YÛ_³ggnhoÎh·^XËWXZÀYTyLÎFyC@:×2µ)î/ $è LÊW÷_òfôëùÛü³û®ùvú¿þEš2 ö Æ ]¬>ÿþü'ö¨èÊØLÍùÈxȰţ¾¼¶™±™¯Y®‹«G§P¢ZÓ˜û•Æ—ŸÓ¨®¯±Ñ°›µ—ÁÑ2Þ{ç%ðùû_ ¦+z9NEíNVm[ˆaRiïo·pâi±_ÞXvX·Z¥Y”SÈKýE©B5?€9¢1b(tVi mh^ËGÿñõ1ñ[óÏø‘ûOúdølùëý—û— Y  ’Ëmþ[ýßûjõ è;ØìÌ·ÈÈÅò½¶!±X¯8®‹«Z§v¢ˆ™B–#˜ÀŸ²©¤°(²²·UÃÈÒÊßéÄñÙý Tñ-À;GQàW]"cÛjdqëqÔjˆ`°YYþZnYõRøJ EÀA9>b8c0' ³ÎÊUÅý‹ôðVò³÷Vúðø÷cøýíe  f ½ä›ý«ü9û±ô\ç¡×„ÌwÈÀdžÄE½iµ®° ¯%®”«§®¢Ç?™ž–³˜ ­ª¶±V³Ž³±¸"Å Ô{á£êó·ÿ£™ @0>ÃIS¯Y±^¥dElºr sªk7aRZ…Y-[%Y?R J$D¼@+=87/™%^Ý¿ï.;ÁRü)óÕîMñœöù ÷ÕõU÷Mü@Ö| 1 ¾ò Äü÷û™ú ô¸æ×Ì,ÈnÇĦ¼Ç´<°í® ®°«¶§ø¢ž“™ —[™Z¡Ã«î²§´µzºùÆ‹ÖEãSìGõ¬Åá"2I@éKUp[4`fŽmÒsthlÃaÆZÓY%[ÄXpQI Cž?<6Â-%$È$à%Œ³<âúÌñ¦íIðŽõá÷Uö”ôNö„û™>õ¤ -9ÿûûEûÿùmóæ¦Ö­ËçÇ!DŽà ¼E´Ö¯Ë®+®Ø«ø§U£ƒžÿ™—šQ¢ï¬?´¶«¶X¼ÿȈØå î÷³÷+%Ø4BNW]aNgºnÊtÆtm,b[ZîZ!XzPÚGßAn>À:²4_,¬"0g Zÿîÿ1¾xù‰ð„ìQïˆô­öõ]óPõÁúõ¨e }hfþ:û™únù×òŠå8ÖxË«ÇÜÆÃ{»Ð³”¯·®C®¬Q¨É£Ÿ|š!˜åš^£®§µ†·P¸?¾ ËÚôæÊïéøº&l'7³DPÓX¡^çbyhÌo©uZugmnbL[Z¡Z\WkO›Fœ@+=n9N3ö*.!”© ^±ý]þÀQÿø\ïrëeî–ó‰õØóDòUôúVÕß ‹ýtúìùÞøGòóäÃÕ>ËǮƪÂõº_³\¯³®n®^¬¼¨O¤˜Ÿ ›Â˜Ã›€¤e¯ú¶¹ù¹*À&͇ÜÖèñºú¼S¥)\9ÞFR—Z` d„iÁpqv×uªm”bT[ZHZŽVEN@E>?×;8æ1)¯úð  üÚüaÿõýÁö3î‡ê„í¹ò|ô¬ò-ñlóEù¼ÿˆHô9Ø­ü¥ù6ù,ø¿ñ_äGÕ÷ÊjÇvÆWÂyºï²!¯²®¡®¹¬5©ä¤B Ã›t™ªœª¥¿°h¸šºª»ÂFϤÞÅêfóŽü¼ Þ+‰;ýH TO\~aCevj’qwDvÚm«b?[ÕYÚY³UMäCÉ=s:­6s0((f@èþtúZûþ¬ü~õížéºìêñ}ó‹ñðŽò‘ø'ÿû¹_ŽÍûÒø~ø~÷ ñÐãÎÔ²ÊGÇ:ÆõÁº‡²ô®À®×® ­Á©”¥¡œ^š£ë¦0²í¹?¼€½ÄyÑÉà¹ìEõlþÅ ¬ .¥=ÿJöUó]ÆbCfNkFr±wvæm¢b4[YHY¯T¸KtBZ<965ó.~&¤Ó‰*ýØøçùžünû?ôùëÂèýëñ‚òmðï»ñä÷þp2ÓæFèúøÒ÷Üö]ð5ãRÔpÊ-ÇÆÁ‹¹&²Ó®Û®¯­aªX¦Ü¡kY›ÐžH¨¾³‡»ñ½s¿.ƸÓýâµî%÷cÊ Ô40·?ñL¾W_ðc"glÜr(xÀvÏmrb[ÖoûF÷†øLûúóßêççHë>ð†ñTï îæð9÷ôýé°JC}ÿú3÷-÷GöºïœâãÓ+ÊÇèÅ<Á)¹Ì±¹®¯r¯®«1§Æ¢Zždœ ¾©dµ7½¯¿gÁhÈþÕ>å½ðùPÓì J2·AÍNfYê`eágžlOsZxÜv›mb©ZÇXåW…RØHW?J9ú562ñ+}#¡´;¹ù¸õ+÷ úÍøÕñÈéç•êzïðDîþì ð‰öVýS-Â¥¼þFùröˆö»õ(ïâ‰ÓíÉ ÇÚÅÁݸ ±¬®@¯á¯§®Ó«¨Í£dŸƒl¡F«·¿„ÁbÃÊQØçÔòíú4Òø"S4¢CPôZ1búeƒh m™snx©vMm a"Z,XWPQTG¬=¨7g4¢0k*ú!$5 ¯1ø%ôÌõÎøš÷´ðÈè'æáé¿î¨ïDíóë+ï×õ¶ü¸˜?þ~ø·õáõ5õ¢î’á7ÓØÉýÆÒÅØÀŸ¸ƒ±Å®¯_°R¯¯¬%©ï¤‡ ·žÏ¢Û¬Å¸âÀjÃpÅáÌ«ÚÇéìô×üÐõ$@6tE=Ro\^cÌfi]mÆsbxSvÓl a‡YuWüUêOºE÷;6È2/Ô(‚ ·¾ (´öÀò€ô¡÷pöžïîçeå>é îÄîMìëVî(õü  µ|Gý²÷õAõ²ôîáæÒÉÉ Ç×ųÀk¸q±ñ®é¯ï°°¤­Eª!¦¶¡ôŸD¤ˆ®†º ÂMÅwÇ"ÏÝÿëôö¶þõ¹ß&83GÖSÐ]jdxgkimÝsCxäu1l\`ËX±VõTƒND-:I4%1f-D'PO §þ<õrñPóöZõŽîçÊä¬èpíðíWë0ê“í}ô{û)åŒüäöIô§ôô§í’à‘Ò¹É!ÇßŨÀE¸h±&¯V°’±ê°¯®x«h§£:¡Á¥A°Z¼pÄ4ÇzÉ]Ñeß?î÷øŒ· Œµ(Í9ÍHYU_aeh¶i¦mÔs xcuykŸ_øWÖUäSMjBv8‡2€/Í+¹%ëí0ýÈó$ð(ò‰õXôŒí6æ(ä"èãì*íhêGéÎìÑóãúù IØûöŽó ôƒó íà8Ò¡É:ÇðŤÀ/¸i±g¯×°A²Õ±Ê¯¾¬Æ¨o¤¹¢C§²?¾YÆ*ÉŽËÓÀá‰ðûji Kz*x;NJ«VG`AfhãiŸm¤sÀwÑtªjÀ^"WæTÎR¬Kº@µ6Ò0ß-<*3$ˆ•Èû^òÙîñqôjó–ì[åã˜çFìqì~é]èì&óJútÿs³*ûLõÔòqó÷ò|ì£ßáÑŒÉXÇ Æ¢À'¸v±¸¯h±³É²ü°®;ªë¥O¤õ¨Ñ³0ÀJÈ)ËÄÍØÕ$äÑòýA9 ÿ+,=³KâWLagèhîi{mRsNwtÁiÒ]AVêS¢Q%J÷>í4/6,¦(¯"³6@bú÷ðšíëï]óKòœë‹äíâçëŸëŒèvçFëzò£ùåþóž zúœô$òæòvòñë1߫юÉÇ6Æ­À6¸•± °²Û³Ô³A²–¯Æ«x§ó¥Éª¾µ6ÂFÊ.ÍûÏJØæõÿò´È->üLüX(bœg iÔi5mãr˜vSs¶hÁ\DUßRSP™H)=3c-Œ*'.!Nèõù‘ï_ìàî^ò>ñ£ê²ãSâ¢æëÌê™çƒæ~êÒñùNþz*›ÿÔùðó‰ñiò ò|ëÌÞŽÑ¢ÉÜÇ‡ÆØÀZ¸ç±˜°Ò²Ì´õ´—³±d­©œ§Ÿ¬º·JÄQÌ0Ï%Ò¬Úüèn÷û´‰IH/Ü?)NøYébh7i”iËlXrÑuArg[,TÇQýNþFQ;31Ÿ+â(q%µó§¹Ð÷[î'ëÝíqñDð²éçâ³á0æ~êê³æ†å®é'ñeø¸ýó¿ ÿ8ùHó÷ðóñµñësÞsÑÝÉ<ÈôÆÁ“¸H²6±ª³Õµ,¶µµ²¯¼ªN©y®»¹MÆlÎ8ÑFÔÿÜ^ë¢ùîR ¿©0A6OÔZc^h2i2iË~Ê+Ééº^´g´Ã·¦ºÂ»v»å¹˜¶C²à°]¶!¶ÎfÖ@ÙÄÜæ³ô â  ƒ$5®DRð\ïd˜hógÙf!inÅpãk`ÅTNÒKFH¸>2î'ñ"à Ø”úOþ2òÚè?æqé,íÎëDå`ßPßBä èaæ(â'áàåÝíWõéúuþ‚ÿÎü{öOð^îúïóïléD݀ѭË2ËäÉ‹ÃÆº µ^µû¸ ¼R½9½Ü»Ÿ¸K´÷²¸NÄãÐrØDÛìÞbèëör R#w%Ø5CE_R]ÞdNhXgüe hçlUoljæ^FS¯LJÁF =D0#&J!QgGjõTýAñÖç_å¬èZìäêpä®ÞÜÞâã}çžåDáDà#å8í¹ôVúþ#ÿhüöêï îÀïÄï8é6ÝÑÑ?ÌÌ´ÊBÄ…»ÿµp¶Jº€½ô¾ ¿Ü½µº[¶µÄº‰ÆÓ€Ú@Ýáê ùëå kJ&}6´E—R]¬dÑgœfýdg¨kÚm¸h5]®QLK*I9EZ;l.U$§ÎøJùfüZðç„äòçœë ê¢ãÞbÞ‡ãüæáänàSß_ä•ì ôÇùŒýÍþ üŸõŠïÇí‘ï­ïé5Ý(ÒüÌð̬ËÅ[¼·§·²»¿«ÀïÀç¿Ö¼t¸2·û¼ÆÈ.Õ”Ü2ßã¿ìû¥FcÖñ&ù6F±R ]`d?gÄeßcÇeVjVlüfv[PßIÚGÅC®9Ÿ,ˆ"V˜À; ‡û|ï<æÇã>ççê9éÔâqÝéÝ1ã†æ(ä‘߂ގãìë‡ó<ùýmþ¾û<õ+ï…ícï£ïéA݇ÒÃÍïÍÉÌÆE½¸ï¸,½·ÀwÂæÂ¿˜ºO¹,¿ËKׄÞáóäÇîýI †5lm'R7#FªRÑ\ùc˜fØdÁbrdñhÊj>e³Y`NlHF]B8ç*¼ pïK/ 2»ú®îzåãŽæ:êpè âÙÜŒÝàâæpã±Þ®ÝÕâMëôò´øüþmûäôÕîJí?ïyïéaÝüÒ¡ÎÏÖÍÇ;¾-¹Kº¶¾lÂSÄíÄ/Ä<ÁÙ¼r»bÁ:Í_ÙhàôâÒæÂðòþÈ •çáÍ'Œ7#FqR|\ucÑeÍcacg1itcêWÖL GLEö@n63)%ç“g/ Zöùâí¾äwâëåé§ç>áAÜ1Ý„â¤å²âÌÝÚÜ$â¯êfò2ø0ü¬ýûŒô„îí-ïdïéŠÝ~Ó’Ï,ÐðÎ&È@¿[º»»WÀ+Ä@ÆÇlÆ‚Ã#¿Ê½žÃ~Ï}ÛNâËä±èªòÅ8 ‹‰,(¦7FR÷[Ùbód¨bA`´aûe‘g aV:K·ED?Ö4€'ŒrBÏH5 ‚6ùíäÔáMåÌèææoà ÛÏÜ+âå÷áÞÜùÛjáêÛñ·÷Êû\ýÃúEô8îøì*ïfï éÅÝÔ”ÐwÑ4ÐOÉ\À»4½ÂûÅ/È%ɳÈÖÅsÁ(ÀöÅÄÑ¢Ý2äæŒê~ôŒŸ n |( 7ÈE£QQ[bdoaÛ^9`_déeÉ_.TI]DÓB`>Q3Õ%óö¢3D ·|ø^ìFã2á´äèæ•ßìÚ`ÜÕá“ä;áíÛÛ«àqéHñ;÷hûý†ú ôîÞì;ï‚ï&éÞ¯Ô¤ÑÛҗєʥÁÕ¼¿¾ÈÃÙÇ*ÊHË Ë6ÈÊÃÂVÈÔ¾ß æBèMìQö=ì4k­#(}7hE Q‹Z"aõb$`a]©^±bdí]IRåGCAú<Î11$f¥³{(a úÏ÷¿ëŽâàäUç&åÄÞ=ÚöÛzáätàÛ,Úõß×è¶ð¶ö ûÚüSúáó îçì\ï°ï[é†Þ’ÕÚÒVÔ ÓìËÃd¾bÀŸÅÊÉ6Ì{ÍbÍ Ê&ÆàIJÊ>ÖÌáÒçäéùíø·Ú­¼ (47ëDSPªY`´a¼^Ò[ ]û`bä[]P7F¨AO@;F0"ÞKxR%†F(÷!ëâðßã æJäöÝšÙ‡Û$á|ã³ß6ÚFÙAßBè+ð9ö¬ú¬ü.ú½óîí“ïýï¨éß‚Ö<ÔóÕ¡Ô_ÍwÄÀ,ÂŒÇÌËRÎ¹Ï¾Ï Í~È4ÇÍtزãŽéië€ï™ù [ÀšË'Á6HD~O¯Xø^``?])Z\[?_8`ÞYpN~DK@?<:É.ý WùM<' ¶›‰ö†êálßðâøåwã'ÝÙÛÕàãùÞcو؆޲ç«ïÈõRúuüú¥óî3íÓïbðê˜ß{רՓ×_ÖòÎþŪÁĈÉçÍÐÒ ÒqÏÔÊ}ÉOÏŸÚ–å%ëÕìàðûPÖ»¬I]'-6€CN™WÁ]ü^²[ŒXŸY][^âW‹LÑBè>ð=ú8`-Ž×°058 èýÿôõïéùàñÞaâUåªâYÜpظڇàâFÞ•ØÌ×âÝ(ç1ï]õú>üúóîní%ð¯ð•êBà‰Ø#×<ÙؓДÇbÃëÅ‹ËзÒXÔŒÔÝÑAͽˉѷÜbç¤ì4î)òOük ~ò‚ßÖ&|5–BvMoV|\‹]ZëVëW½[|\éU¯JJA™=Ì<½7,/šz 8Q $]ÿgõZéoàrÞËá¬äÜá‰ÛÔ×SÚàâ’ÝÇ××BÝšæ¸îöôºùüæùó5î´í‡ðñëúà£Ù«ØøÚ²ÙAÒ:É'ÅÞÇ›Í'ÒõÔ³ÖþÖMÔªÏ$ιÓÇÞ(éî‚ïbóyýk UO-&®4”AELU'[ \tX9U4VôY§ZöSÑH¼?\<¼;˜6²*Ûc]Gu g¹þØôÄèäßõÝ=áçãá±Ú-×çٰ߈áâÜ÷ÖP֤ܿGîœô~ùöûÚù¯óYî îñ–ñžëÎáÇÚEÚÐÜ‚ÛÔôÊóÆÛɹÏVÔ7×ÙqÙ¹Ö Ò„Ð÷ÕÎàáêtï¯ðô‡þR ŠÌb%Æ3}@K¸SªY|ZºVwSrTXÐXRòF+>;•:‡5s)Ž-H"f ¨ ³þ@ô+èQßsݱà+ã1àÙÙ‚ÖwÙLß÷à3Ü$Ö‹ÕÜåÝíRôSùêûáùÒó­îuî˜ñ8òOìÀâÜíÛÀÞnÝÚÕÖÌÂÈáËåÑ“ÖÙnÛçÛ#ÙZÔËÒ(Ø¿âŒì¿ðÂñ›õ†ÿ# íô‰ Š$É2S?«I?RXÕXóT¤Q£R=VËVPE<æ9v9V46(?ù:+‹ á…ý°ó©ç¶ÞëÜ àoâSßÙØÕÙñÞjà~ÛXÕÊÔrÛå}í ô8ùòûúùôïïDòðòíÌã”ÝÀÝËàfß¹×ÁÎ×ÊöÍÔÖØÑÛÐÝVÞŠÛ ÖÕGÚ—äîèñ²ò‰öh³ .°íW›#ª1 >=H·PlV WSÅOÐPbTÌTN=C;½8h8%3ù&÷Î7 > ­ "güü%ó%çGÞbܔ߶áuÞFØ?Õ­ØÞçßÑÚ¯Ô ÔãÚ¯ä%íËóù ü"úBô‡ï©ïóÆóñíçä"ß´ßóâ{á®Ù»ÐòÌ'Ð^Ö"Û(Þ6à»àåÝØØ'×SÜ\æfïõòóN÷%$ .O/j‰"i0­<¾F!O¼T6U>QÞMþNŽRØRLqA‘9š7i7 2Ç%¾¥7 V × dËvüžòŸæÜÝôÛ ßá—Ýz×¹ÔIØQÞoß+ÚÔ~ÓSÚFäÕì˜ó ù ü[úô ðaðÏó¯ôåîæ»à²áå°ã¼ÛÅÒÏbÒ¥Ø{ÝŠà¡â ã3àÛ:ÙMÞè§ðÖó)ôì÷ºy ÐQYW!/0;1E~MSbS`OL,MÃPôP&J¶?8y6y61«$®~ < y ª)óûòæf݈ۀÞSàºÜ¨Ö%Ôé×ÞúÞˆÙ^ÓïÒ×Ùãã‹ìkóù1üšúêô˜ð)ñ­ô…õîïOçaâ»ã5çÌåÕÝÙÔCѨÔïÚÓßêâ å…åâ@Ý9Û.à«éÓñ ôÉômø6² Ò2`2 ¨-Ÿ9„CÑKLQŽQƒMJJjKOOCH>Ø6p5–50“#¦œ P ¢ > ñ‰iû”ñ‰åêÜÛéÝšßØÛÒÕ“Óט݈Þ娏ÒgÒhÙƒãGìFóùYü×úSõ3ñò¡õtöõð˜èäÙåqéîçóßðÖtÓðÖ;ÝâGåsçêçÂäfßIÝôá0ëèòOõOõÞø–Ø {sí¼,,þ7ÌAJ•O¹OKyH­I@MTMlF_<“5~4Ð4 /Š"¤¹ y Ö z>ðØú ñóäcÜœÚUÝÃÞ÷ÚöÔùÒ1×3ÝýÝDØÒÜÑþØ)ãì3óù–ü*ûÔõÚñëò¯ö÷òêØå èÉë)êâÙ¡Õ;ÙŒßnäšçÔéEêöæuáEß»ã£ìèóßõ°õCùÞí ¨dÁM¢*R6 @@HÀMßM±I¢FòGyKK˜Dµ:O4”3ô3Q.‹!¢Ó § ¼WLúzð]äØÛ&ÚÊÜùÝÚÔZÒÙÖàÜwݧ×aÑMÑ—ØÛâÛë.óGùèü”ûgö¯òåóÔ÷¥øBó~ë´çJê<îìTäUÛË׆Ûàá¿æëé&ì›ì élãájå÷íÒôSöëõ~ù ï ©»3pÓ)–49>iFÚKüKÁGÅD2FµI¨IÍB93²2#3j-• ¤ï Ú>åÇÿÊùóïáãHÛ­ÙAÜ6Ý!ÙEӽщ֖ÜüÜ×ÀÐÆÐ=Ø›â³ë-ó…ùTýü÷œóõùâùˆôíÂé§ìÃðáî“æ¡Ý8ÚÜÝ7äé1ìlîÕî4ëIåÝâýæ'ï–õ¢ööœù¥ ­ç MQ'È2^<ŽDóIJÏEìB}DýGÌGò@k7Ö1Û1\2|, « u;<:ÿJùjïbãåÚ7Ù½ÛwÜ<Ø„Ò5Ñ>ÖU܋܆ÖQÐHÐí×gâœëAóÎùÛý°üÍ÷ŸôBödú9ûàõ¬îÖëïYóRñáèõߢÜ<à‰æMëqî§ðïð*íçzänè4ðöÌöóõù: >ˆ‚ Š«…%ï0:³BH HìCAÑBSFF'?ä5¢0 1¥1£+¸À6K²”±þËøáîáâ…ÚÖØ?Û¾ÛZ×ÃÑÅÐ÷Õ Ü*Ü ÖèÏЧ×Eâœënó'úaþaýžøµõ’÷»û üI÷RðîíƒñÑõØó:ëGâß—âÒèí¨ðÎòòòûî¥èóå¼é$ñ|öÍöºõVùÉ· MJ ý é ö³# /¢8×@3F#FBg?,A¸DLDo=q4„/H01é*åýX‰÷ÈëþSø_î_âÚ{ØÀÚÛ~ÖÿÐNзÕüÛØÛ’Õ€ÏÈÏ|×2âªë¨ó’úîþ þùÔöëø ýïý¿øòðÿóVøCö“í–ä]áñäëÀïÍòæôéô¼ðCêHçæêóñÆö¯övõÿøu Cñ i9 7Ö!-²6?`DCD>@¾=™?*C¢BÂ; 3“./x0/*?»ÓADŠýÏ÷ÝíØá³ÙØ9Ú^ÚŸÕ;ÐÝÏÕ¬Û‡ÛÕÏ•Ïf×*âÇëöóû•ÿáþtúø^ú þXÿ9ú»ó;òŠöèúªøïïææ»ãIçIíßñäôïöËöaò¿ë§èöë©òõöqöõ™øo $„ ås hð#+¿4=BcBi><>¤AA:¥1ž-ô.ø/„)J…+] øü;÷OíJáEÙÃ×·ÙŽÙ¿ÔrÏiÏJÕhÛ$Û¶ÔÈÎlÏ\×1âøë\ô²ûSºÿûRùëû9ÖÃû”õnôù‡ýûOò:éæ—ézïôóæöâø•øëóíîéúìDó÷ö›ô+øµ ü PÖ’ 0)Ï2-;¬@@Ÿ<€: <@v?|8B0«,P.R/ì(ˆÅ rÚ¯üÿ`ü£ö·ì¼àÔØg×8ÙÄØÙÓ¢ÎíÎÕ7ÛÎÚ^ÔvÎGÏ_×Oâ=ìØôaü+±¿üÏú‰ýèk^ý÷°ö·û7¥ý·ô¨ëOèÕëñøõÐø®úFú[õZî ëÝí¸óööõöó“÷Ùè Æ ¨&À;'â0I9Å>½>à:î81;˜>Ê=ì6ê.¾+±-°.5(Ë ËØøUÿÍûö)ìMà^Ø׺ØØÓöÍ{ÎíÔ Û€ÚÔ=Î6Ïv×âìaõ.ý$ÆþaüBÿ¬ÿ}ùù[þæ#÷îÄêî°óà÷œú]üÌû¬ömïüë“îùóÆöðô1óÛöÉt ßðmï )?%ñ.m7ì<æ<'9a7Í9,=7ûõ ëÜߨ®ÖKØW×7Ò]ÍÎÎÔòÚEÚÝÓ<Î5Ï£×Åâöìþõþ=ödÿþ…ßÎû‰û¦­}ùzð-íHð²õ²ùNüîý#ýÑ÷VðÂì&ïôUö&ô?òüõ,ÿ’ì&!  &<#ÿ,“5;;ƒ7Ý5y8Ó;µ:ä3_,ô)‘,’-Ê&[¡ †“¯|þ±úõëlßÍ×nÖé×°ÖnÑÄÌâÍÃÔóÚ"Ú·ÓGÎ{Ïå×$ãyíµöðþU:кÿý_³”ýóý«<?ÜûÏòïqò÷rûçýaÿ[þÊøñdí™ï$ôËõ<ó#ñõô+þSTb>þÀ% &7!+¼3P9T9è5{417:I9s28+), -3&³ ÛïþÆÿVýúô—êúÞ…×5Ö×Ö®Ð,Ì¢Í¸Ô ÛÚ¤Ó_ÎÌÏJØ›ãî÷ïÿrŒMyïI r bƒÿYSÐ ¯3þõÀñˆôoùýdÿ¸{ÿ­ùÝñáíêïô)õ;òðÔóýÿª’VüÚþ9$/)ñ1–7¡7Y4(3ø5U9é71*q(š+³,™% „ iTN ÿ©ü€ùôêŒÞ=×ûÕ$×…ÕõÏËlͶÔõÚÚ™Ó…Î0ÐÈØ!ä»î`ø®èÞJðB C =‰Åýe  ‚S÷óóŒö(û‘þÀô€qú{ò_îðÛónô ñáîªòêûô¸þ‹úèüE$*'0ì5û5Ó2Û1Ê4"8š6·/)À'+Y,%lú ôÃÿŸÿQþÿûíøtó™éÞñÖÂÕÂÖÝÔ>ÏË;Í¿ÔñÚÚžÓ·ÎÐQÙµäyïYù:\–. Q & $²6³ x Ò‰ùöwøËüùÿgûõòÁî4ðŒóóâï˜í~ñ²ú69Óü°øûL&D%O.24]4U1š0ª3â6M5^.ñ''¬*Ó+“$Íf p-ÿìþžýZûXøáòé¤Ý©Ö‘ÕhÖ:ÔŽÎ{Ê ÍÖÔÛÚ¶ÓîÎÑêÙeåRðlúƒo æ _=1 s è²o¹ëÉû øHúWþH 1–ûKóýî3ðóŸòˆî,ì/ð]ùÒçúÈöFùc.f#‹,u2Å2Ý/\/’2³5ë3-Ö&c&=*S+ú#-Íê™þ4þãü±úÈ÷YòèSÝ_ÖeÕÖ¬ÓïÍÊåÌÕ4ÛÚæÓAÏÑŸÚ+æ:ñûéú ‰ 7 [ n ª #L 1hQTüý.ú üÈÿr×Ì÷ûzóïð‚òñí¦êÍîó÷ÿ¬þéøØôo÷~ 1‰!Ñ*Å0$1k.%.ƒ1‘4˜2½+¾%¹%Ó)Ô*R#Š4gþ{ý üú>÷ÚñèÝ@ÖDÕáÕ,Ó\ÍÀÉÝÌ<ÕrÛDÚ,ÔÕÏ?ÒkÛç4òÀüU¡ B  † ¸ç.] à ß³ƒ 7üÀý~ûŠ:4ü…óïÎïÍñKðyëéOíwö]ý·üâöáò’õ˜þ 7²!)%/•/-ø,„0€3U1*Å$%o)`*³"í àÿqýÅübû^ùºöbñ£ç·Ü)Ö3Õ¯Õ´ÒÍÌrÉñ̆ÕÈÛ„ÚƒÔtÐ"ÓIÜ÷çGó þÍB  À J ” m‹“¢ !þ[ÿWt½‹KüoóÖîqïñòîÑé7ç±ëêôû¸úÖôÖð¥ó®üEäy'‘-.Ì+í+”/2#0J)Ý#u$) *."Y&QÿÝüüªú¶ø)öòð8çmÜÖ(ÕÕFÒ@ÌÉÿÌÍÕ=ÜÝÚèÔÑ ÔGÝþènôbÿW åáv`Q Äõ6 P° êÿÚpF^‘ÃIüZó†îøîð‰íè|åêVóÙù¸øÑòÕî¾ñËú)Và%,¡,Œ*í*«.‘1ý.(û"ó#Ì(¯)£!ððþMüeûîù ø–õqðÌæ"ÜøÕÕGÕáÑÂËÜÈ!ÍÖÜAÛaÕÖÑ Õ^Þê¤õÍö œ¸$Lã¯gôvÓon¬äœ=lóßèÛ'ü"ó7îeî*ïì^æÇã\è·ñø¸öÐðí×ïêø:pTA$š*9+R)ò)É-¢0å-ù&"j#^([)!19ŠþÅûµú4ùh÷ õçï^æÔÛâÕ!ÕÕzÑIËžÈIÍ€ÖØÜ£ÛêÕ¢ÒÖ„ß?ëíöO¬ hœL `†5:ñoÒ!–£.~G‚>&ÙãûÆòÒíÆí)î‰ê‚äøáºæðJö·ôÈî&ë î÷W˜ Ÿ©")Õ)(ÿ(õ,¥/Í,Í%/!ä"(Ø(œ —¶þ?û ú„øËöƒôfïñå‹ÛÖÕ3ÕÕÑæÊ\ÈzÍúÖQÝ܃ÖrÓ4׿à„ìQøåqCëz«G†o!<$Œf[ ˜¡ ÷y.º…ûMòOíííðèâ àþäcî”ô¾ò¾ì@écìOõ„Î ó!“'x(é&((,¶.¥+¢$@ Y"¤'Z( ú+©ý¼úaùÒ÷-öÿóíîåiÛËÕNÕÕÕЛÊMȺ͉×àÝÜ;×]ÔcØâÝíÁùƒK5”ºŽxò!ØYÌö #&| ú ®®F“kû±ñªì>ìÎëDç‘àÞCã¥ì—ò¸ð®ê`ç²ê›ó·þ L•&'»%$'a+Ñ-ˆ*‹#QÒ!I'Ø'YZ¡=ý@ú½ø!÷‘õ„óî5åLÛéÕxÕÕ¥ÐcÊeÈÎ2؉Þ<Ý Ø†Õ¨ÙzãIï@û-6£ø !c$"deÿ%Õ(V"²w f 0tŒÜðfúõðêëWëêåÞÜzáæê ð§î¦è†åéíñóüF´"±$Ä%­$D&ª*ú,v){"~G!ï&\'´ÂÈü¹ùøpö÷ôóîÝä2ÛÖ²Õ-Õ{Ð1ʃȥÎòØOß÷ÝïØÄÖ(ÛóäÇðÕüíý.¹?‘›#¼&.$a%Ä O(Ì*$.Ð ‘l‘†i†Y¨ù#ðëgê(é«ãzÜÚ©ß-é»îžì­æ­ã\çJðCûŸ+¹T#}$©#%*.,h(j!·à ¡&ò&'¥Hü1ùo÷Åõ]ô‹òµíŽäÛDÖñÕNÕ_ÐʧÈ1Ï­Ù7àÍÞé٠ص܋æ]ò~þ» è Ö‹!1&)=&P 6#Œ*«,­%…— Ír$®ÕøXï/ê`éÁçÐárÚ ØÕÝuçØì™êÇäæá¿å²î™ùû¦c "D#«"Ä$U)o+e'` öQ P&&{;õû²øÊöõÈó òMíFä ÛvÖ8ÖfÕPÐëÉÚÈÎÏuÚñà¯ßòÚlÙYÞ:èþó,” å$ó Ù ¡#Ì({+P(M"1 @%¯,n.'Áƒ ¦ê=ÀŒëè÷pîHéNèYæößfØ#Ö ÜÃåë èëâPà.ä'íú÷_(Í "¯!$¨(®*j&Q&Ñ×%&âøÏ£û@ø-öpô8ó–ñßìäüÚ­ÖÖ˜ÕPÐÛÉÉxÐUÛÇá™à ÜØÚ àøé°õézî4!#>#)&i+á-_*?$4"X'¾.0g(éK  ìï?êãöoíSè/çëäÞOÖ/ÔMÚä8鵿á¿ÞÆâ¤ëgöд ¡€æ ¶ Q#(Ñ)j%:LG^%y%Na\IûÐ÷›õÖó²ò'ñ{ìÇãùÚõÖõÖØÕ^ÐøÉUÉ-ÑLÜ¿âáFÝNÜÂáÃëx÷½jýN#G%©%Å( .D0f,!&3$_)¼0Ä1©)ôì a Õ‰¡$ÿÏõ_ìJçúåeã$Ü.Ô2ÒˆØRâ€çÚäQß2Ýcá5êâôNK I,ÁÇŸ"]'ø([$!p½æ$Õ$¢Ç èîúa÷ õ>ó0òÁð%ì›ã"ÛB×d×&Ö}Ð.ÊÒÉùÑWÝÈã³â¢ÞáÝãŸíJù—bu%€'(`+œ0¤2c.õ'&Y+›2G3È*ßÖ ’ ›ÿæ-þ¤ô6ë+æµäÀá0ÚÒ-о֊à“åãŒÝ¬Û àÔèdóÏþè ë¡Ûî!À&.(X##ˆ,o$;$÷8 x›úûöô¬ò³ñeðÝë{ãQÛ²×é×’Ö¸ÐvÊpÊÝÒ|Þòäèãà¬ßnå‹ï*û~c6 ®'Â)ƒ*ô-3õ4X0­)ß')-14º4Ò+­† © BU 'Õü]óñéöäfãà5ØÏÏÎíÔÈÞ±ã$áÍÛ'Ú²ÞxçññYý Å·‰ D!.&q'^"+¾›$¯#X¹ Iú˜öÿó%ò@ñð ëbãˆÛ4ØØ×ÑÍÊËáÓºß8æ1å”á~átçƒñýq lJ"Ñ)ý+é,„0Ÿ5772I+‚)Ü.±5Õ5¼,U _ Ÿ Ï“ ‡ûòèºãâzÞ;Ö½ÍýËÓÝæáSß Ú¦ØbÝ+æ“ðùû@Šx;¬ ¨%½&h!2¡#0#¿6 ¾õù9ö„ó¥ñÑð¾ïrëYãÌÛÂØÙ¡×eÑ0ËÍËðÔçà—çæ!ãZã…é‘óÿk xa$ä+6.I/ 38;9û3Ð, +x07Î6n-Ùr– z C¸ßÿ1ú¦ðaçuâÂàÖÜDÔºËÊ`ÑpÛ àˆÝØ;×"Üèä8ï›úõgejj % &q 8L”?#­"² rÀùáõ ó'ñkðmï?ëUãÜUÙÅÙ%ØÑÑŸËÌÖ&âÍèòç·äBå¤ë®õj ‡&.i0Ÿ1†5€:S;²5].v,õ1e8°7þ-C ¹² : ›È÷¦þÎø5ïæ6ámß<ÛTÒ¶ÉEÈ¬ÏØÙnÞÎÛ×üÕéÚ¬ãåíGù´7Pb™vt$T%7† °";"Ž7 '‹ù‘õ–ò®ð ð(ïëUã\ÜñÙÚÄØUÒÌZÍA×|ãêaéZæ1çÇíÐ÷#t±¸((0š24ú7çÛ|ØÔˆÓ¾ØZá_ë»öJÙûUýLH#«#‚ï ¶!ô c? ”ÿ.ùõÙñãïyïÌîÕê˜ãLÝqÛGÜHÚ–ÓšÍEÏãÙzæímìèé1ë.ò8ü^¥õ -p4ë6¦8ÈÕlÏÄÑéÜÛéPðÁï¶í ïÑöÁ± ä>%S1œ8 ;ö<;A‹E—DÍRCqG FÝ=53j8x=u:×.. (ú pÿ+ûŒø…õüîpå2Ý3Ù×ZÑØÆÑ½e½@ƢлÔ1Ò~ÎøÎÞÔXÝíæ òæþ­ ªZñ 5!Ú Ë’:BH í.ºäþâø„ôâðòîðî¿î=ëÏäà}ßÁàoÞ)×oÑmÔ.à*í¯ó?óžñ&ô¨ûx#~)r5v<å>î@QEDIoGÔ>Î5µ3 9Ø=b:y.· R yAþ¤ùêö×ó6í¶ã³Ûß×ÈÕÐÏ Å¼Ú»×ÄMÏCÓºÐCÍ ÎÿÓpÜæå ñ×ýŸ ¨^+w› + ä©–ØÍŒµgÐþëø|ô»ðÎîìîØîoëAåÍàªàâ¢ßHØ{ÒÌÕäáïî]õõ™ólöþÙ[D+€7Y>º@ÛB7:.3‘ lãüø>õ!òcëðá.Ú’ÖyÔUÎGÃ?ºNºxÃÎÚÑNÏÌ$Í5ÓÛêäðÓü•ajñ büºëmYúB¾þøøô«ð½îùîÿî°ëÍå¯áóáãîà|ÙÐÓ7תãÉð$÷äö¬õ¹øŠA ¤t ¸-€9*@{B³DI³LòIi@þ6Ê4í9F>ð9q-Y´ JyûxöƒóHðŠé)àªØCÕÓÎÌ„Á{¸Æ¸ÂÌ{ÐêÍãÊAÌsÒ¾ÚøãïÐûzugªj…žÒJ éeÅϸþù“ô´ðÁîï<ï ìtæÊâRãåRâÊÚIÕâØƒå¯òðøÄø×÷ûª æ—"½/u;êA%DjFÁJ)N KAa7'5&:K>‰9½,Ê™ÏüùÊô¾ñgî¥ç_Þ#×÷ÓÇÑ@Ëο½¶D·ÌÀ+ËýÎ̼Ée˼ÑùÙãîÑúr^ oåâéF¡ªŠâO‘·þ:ùµôÉðÝîKïïyì*çîãÊ䣿Õã,ÜÈÖªÚnç¬ôÐú®úúˆýƒ"¯$µ1A=˜C±EþGMLkOûKA™7V57:ù= 9î+ë½ÔÜÿqøóôï‡ì¸å“ܘկ҄ÐÉÉ9¾µÉµ‰¿ÞÉÍ:ËœÈÊ Ñ9Ù7âíÜùsL w3`ŒAvdS7lâjÃþlùâôíð ï’ïøï÷ìëç åWæMèpåÝRØ{Ühé»öÀü¡ü0üùÿuZÀ&ž3í>EGsI¾M“P¤LÌA¡7Y5%:Ž==8þ*èÁ¿ŒþâöTñ#î£êÊãÖÚÔuÑNÏ]Ȭ¼Ž³S´V¾§È:ÌøÉ’ÇÂÉcІØlá0ììøw? ‡Šå!ž«· ³òÿ|Gëþ©ùõ ñKïæï`ðíÆèiæôçñé çßèÙWÞjëžø¸þšþeþoŒ ׇÁ(t5†@wFpHÌJO˜Q/MB‹7@5ó9ü9¯;15}'yb &Mú òì¤èåÞ¦ÕèÏíÍçËqÄH¸v¯Ç°ýºNÅ~ÈkÆÚÄÃÇ΄Öß—éök® |r˜ºaŸ Y ÜÖŠ˜ÿ¹ú'öòhðXñ òžï¾ëŽê6írï$ìäßùã¥ñ¦þl£¹ ßô#‰.ª:ýDJÐK=N_R9TcNB7o4Å8ô:4-&73 ÙÌøYðGêËæã2ÜïÓˆÎÉ̵Ê&ÃÔ¶®¡¯ë¹ÄMÇAÅóÃ!Ç ÎÛÕBÞµè)õ^» Ìü ­ì ñ Ô„b@éÿ/ûžö“òèðûñÉòzðïì2ì!ïsñþíàåÿàæÛóÇh¯V+ z)ÿ%\0;<[F,KºL*O6SÍT˜NÌA»64&8!:Ü2È$âö …D÷îtèïä-áNÚ7Ò(ͮ˕ÉÕÁiµ´¬y®ß¸áÂÆÄ Ã~Æ€Í:Õ|ÝÔç=ô\ÿóÓ «nh } œA  $Cµû(÷ ó‹ñ²òœójñ-îáíñ”ó÷ï½çûâMèöøpÁ¡ ¨êhû'2³=„GL„MöOîS.U§NpA,6o3f7û8š1T#{§(ÿ·õÞì æãGßm؈ÐÏˡʊțÀ"´P«R­Þ·ÃÁÊÄû ÂÚÅó̘ÔÁÜ÷æTó]þâé€)JÚZï 2 xÀÜL­LüÄ÷ÂóBò}ó…ôiòyï ï,ó´õýñ›éøä„êSø6 Ì ß Nš!é)Ã3?ƒHáL(N¢PŒTuUqNé@v5»2–6Î70Å!úE¿ý,ô-ëÒäAágÝ•Öö΃ʤɋÇg¿â²4ª3¬ê¶´À—ÃâÁ>Á2ÅgÌûÓ Ü(ægòZýÑæ ¼ñN¼ƒ _øƒº~4÷üxø}ôó_ôuõ„óàðtñGõÆ÷ô‰ëçÇì˜ú=‹ × }¥¸#¼+P5P@fI|M°N,QU˜U#N_@­4ö1¬5‚6}." oÝPü›ò€éãvß”ÛÊÔnÍXɬȕÆA¾¯±2©E«þµ¦¿eÂÌÀwÀ”ÄÝË[ÓKÛWåzñbüÅF HÌ" à <âR¤¿É°ý9ùEõñóYõxö®ôQòRór÷òù ö€íé ïáüO {ÛMÖïÈ%-È6A8JN O“QdU­UÇM½?ø31³445ß,vÞjÞú ñÔçRá°ÝÉÙÓåË,ȸǶÅ/½„°+¨nªµ©¾?Á¹¿ª¿ÄU˾ґچäŒðSû¸,£ ÖþG‹¦± œ3œ izþú"öæôfö÷çõÒó<õ¯ù3ü"øžïëJñ1ÿl lÜl% Ä':/,8“BïJfNpOêQ¯U®USMþ>1300¯3á3:+ÂPñhù{ï2æ¦ßóÛ ØFÑfÊÇÑÆÐÄ'¼Z¯#§–©7´·½ À¥¾Õ¾lÃÆÊÒØÙµã™ï6úŸ> o†¦ñ 7Œ nýž]Tÿû$÷õõ‰÷¾ø6÷€õ;÷ÿûþDúÀñhíŽó… \ÙŠOG"¨)Ô0w9…CƒK¬NŸORÆU•UÄL&>S2O/“2|2ƒ)ÿ¹ ‚ö÷ïí’äÞ@ÚFÖ–ÏôÈöÅìÅÓû8®%¦Å¨T³Ž¼þ¾“½¾ÚÂ;ÊÑÙââ«î#ùŒÿ[o € Õt JΰÇÜI üCø÷Åøúø;÷\ù[þßxüðóÊïøõÜ«FÌ«tR$m+L2Ÿ:KDýKÒNªO,R´UBU L3=Q1K.M11Ä'5 €öfì÷â_ܕ؇ÔìÍ‚ÇâÄÅ"¥ï§v²u»Í½¼5½B°ÉåÐhØâÇíøþ‰Ú ¹Ã£ «[ ?¼ÙG ²Q*ýyùiøú_ûúüøƒû»YÂþ(ö&òrø0Ì*­±‰B&-«3®;ôDUT[Jô:ò.î+.Š-$¾ ýóiéåß<Ù[Õ)Ñ´ÊÛÄÝÂ’Ã[Á+¸O«h£P¦Ù°k¹»vº‹»Á”È·Ï%×àìölüç× <Ög ƒ’ jkÒ[Ž —š¤ÿ'üBûîü8þý¦üõÿ“bžúØöUý¸ ÑÞH€f"È)!06s=èEJLaNùN“QØTiSOIÑ9¥-ª*-Á+"¥‘ûòòçsÞº×ÓÓ’Ï.É ÃùÁâÂ¥ÀN·vªÂ¢§¥°j¸]ºt¹ÑºiÀÈÏzÖãß&ëõjûS »ê… w¿ ‰šù¹N «Ö÷“ýÇüwþ·ÿ¹þ‡þ6‰ ­Ýü*ù½ÿö ´øD/$b+t1"7'>;F1LÿMŒN!Q^T©R8H›8u,Q)¨+*& Íiú²ðæÝTÖYÒέÇeÂÁ,ÂÀ¶ž©¢¥P¯v·<¹l¸ ºÔ¿uÇyÎÑÕ-ßJêôfúDÑg†/Î iñ »¡3& Ï#`ÿ_þEbs„™  >ÿqû3™6œíÚ%ß,®28Æ>uFûK~MN¤PÛSßQGO7=+(5*E(:öΟøJïåªÛùÔâЀÌ-Æ/Á?À}ÁR¿³µÃ¨^¡t¤„®‰¶%¸g·B¹5¿ÝÆãÍ4Õ|Þléócùzÿ\!3͈ ]% úÅi¢ó ù ã±´Þ„Ú) ‡Z ŸïýriyÖ5†!h'C.Ï3÷8M?‘F«KèLeM P#SQÜEø5ø)¾&´(‰&N41÷ìí½ãVÚ¦ÓwÏýʽÄÀi¿ËÀƒ¾â´ê§¬ Ø£´­hµ·_¶y¸™¾FÆFÍÔÊÝ”èòjøºþêßè{s ep Iô¨6ä A òsfÂqŽâœC À» |ã–G` ¹ #â(ˆ/Ê4­9²?„FBK3L¤LQOFRõOœD“4£(f%'Å$cN ¥ÿÎõ’ìfâ Ù`ÒÎ…ÉXÃÛ¾—¾"Àƽ´§ôŸ3£â¬M´ÚµTµ­·û½­ÅªÌñÓÝÆç ñx÷ þ}«´@k ©à ®Aåð z ,Ÿ@M²µ® K¨$e÷R ± Ö! "$=*¬0£5@:÷?YF§J^KÄK}NVQ¸N@C38'ý#l%Ì"{€ þoô?ëáÇ×%ÑÍÌȾ½Ð½Š¿½F³k¦7Ÿ¢¬@³¸´W´Ý¶Z½ÅÌfÓ{Üÿæð‹ögý%Œ‘h ý9 -­|¦ ËŠ†Ö"Ö&†³[¬ °Á ;#j#Ö%o+£1b6½:@ FãIfJÇJ’MUPmM¹Aƒ1µ%Š"Ð#è †­}ü óñéáߘÖóω˽ƼÀȼ½¿¼Š²Á¥³žî¡g«M²¥³d³¶¼¼ÄËãÒëÛGæ:ï«õÆüÎZƒñn WÌ Ã< uA|· æ~ùã d ö ]ˆÜò ©ð 6"„$’$ÿ&„,}2û6;%@¨E IVI­I‰L>OL+@0$$!/"ãíú²ñ¬è¨ÞvÕÌÎSÊmÅ{¿Ð»h¼¾ì»Õ±¥Cžn¡²ªR±Ž²w²kµ.¼Ä ËaÒdÛ“åeîÑô)ü~*eä† ÃpLÓ«[Š j\ Ò € í º K  íõ%* ì 'x•#£%ž%(€-;3t7J;@.E H+HˆHkKN¼Jš>|.Â"—– $œ%oùiðuçxÝYÔ»Í(É%Ä:¾Öº»»ð½h»&±s¤Èý þ©Y°r±±¼´§»‰Ã„ÊáÑàÚåä†íôóû6 6Ø¡ 6 #ñLZM߬,=Í ë ™ ? ?{‡fi{ MHæ$§&’&û(\.Þ3Õ7r;é?œDGçFOGEJüL]Iý<ê,g!9Z·nø$ïFæUÜLÓµÌÈßÂü¼ä¹»`½Éºo°½£A„ ?©i¯[°ˆ°´»à ÊmÑbÚ8ä¤ìó÷úú÷¿¾ ­ å²ëL;Tý1Ý § ó„<‰ý)Þ ©¹b\ .&˜'n'Ê)/f48|;¤?òCÿEŒEüEI¬KûGZ;F+ôܤ߹öæí#å<ÛCÒ³ËæÆ¥ÁÈ»ô¸zºÚ¼º»¯£­œ †¨[®C¯Œ¯J³‘º‡Â”ÉúÐêÙ›ãÖëZòjúÄõÀ - ·‹¢Õ^§à.ûÌ |>΀Î!W#åê¨p» W'h()(‹*»/Ï4A8b;D?#CÌDDD­G8BpC‚BCFFÄH³Dî7ç'  Sö( ^þÎóˆëäâÙJÐÕÉÔÄG¿Œ¹'·R¹ê»ç¸O®¾¡›Ÿ§F¬ ­¦­æ±‘¹žÁ¾ÈAÐ"Ù‡â]êòðžù6Mí ß µŠW!¤ÎÏÁÓTaMPwASÊ& (7! ÞV¤#Q)¢)2)•+Š0.5*8Ù:)>*AõAß@qAÑDCGúB6)&‚¹Â$V ºüoò`êØá+ØjÏòÈÖÃ*¾…¸l¶É¸€»\¸¨­6¡/›—žw¦W«¬Í¬<±¹8ÁhÈøÏÎØ âµéSðIù…R’Lr Ç Ô§c"´ u£æ¥”uxBŒï!5)L*D#ó¾ ã$**‚)à+»0)5ñ7g:m=@m@2?È?JCºEEAR4Ž$ïK4_‘+û ñJéÛàCךÎÈæÂ½„·®µD¸ »ß· ­° Ùš*žÒ¥iª«ú«¬°¦¸ÙÀȯÏØ’áé¿ïþø‡pͨ À ±v#Ò!…4œû°îå¤LÁX$–+o,7%Æ¥ü%‘*^*°),Ï05’7Ö9™<Ñ>Ñ>r=">¹A.D‘?Š2ö"’篠ԱùæïEèêßdÖÔÍZǼ…¶ó´Â·§ºk·r¬) €šÌ(¥z©ª)«°<¸ÀÂÇpÏ<Ø!á€è1ïÀøœ¦þ³Ê?Óp$#ù¡ðD?×…b÷À&ô-‡.'¤*ú&+„*Ä),¿0¾4709®;‚==ž;oÏؽàòç¸îŽøÃñH~eß’!%8$u!Ï ¬!I!?©žu>!)I0”0ã(dÛz å'b+‘*¼)ù+‹0[4‹6s8«:'<`;½9­:|>û@7<ÿ.ÁìVØ` …Òö“íGæ'ÞÌÔkÌñÅJÀºŠ´€³Ë¶­¹8¶4«þž®™Ë£ž§¨}©õ®g·Ñ¿AÇÏÔ×jàyçWîiø÷WµKöðo"Ç&„%#«"É#„#“!  Q ž~p#i+š22 *!qÂ!¹(¨+~*‘)Ì+C0â3Ý5—7’9°:—9Ì7Ú8Ͳ§Ì›¬—êšãŸÂ¡á¡¶¤ó«µ‘¾¨Æ'Ï ØÄßïåní¨ù` Ï“šÚñ$¨-ö00h/1q3Ç3[2@1ç0¾/J-˜, 1;9??=^3 )æ$S'’*°)e&õ$$'+…-Š.k/0/Õ+)®+Æ0e3+.P!åK r ÈöÚìÀåÐß`جÏäÇcÁ‘ºö²–­&®õ²úµ«±{¦H›^—¯šqŸ¡'¡¤¡«tµ”¾ÉÆcÏUØÿßæ©í-ú0 Õ¥5'¹î&/«2Ò1Z1B3Ë5,6Ä4©363Ö1 //.¢2¾:Ž@1>)4¸){%š'[*ñ(W%Ú#&Û)K,6-.’.F-Í)n'Â) /±1m,ÂŽA } c2yõÂëéäßÀ×#ÏiÇäÀè¹"²Ò¬t­w²‚µ±û¥ ›—xšùžV x ™£Z«]µš¾ôƳϲØCà6æñíÅú ïǀϹ÷({1c4”3X3x5$881765Ô3¶0­/!4'<©A?Õ4G*õ%À'é)(,$¨"à$˜(ò*Ô+—,-r+Ä'\%Ü'^-0»*<?@ “Dãþ:ô°êäqÞ(שÎûÆmÀB¹Q±¬ã¬²µ”°~¥Ñš —Lšž¬ŸÒŸ/£!«Rµ¯¾1ÇÐÙ™àoæIîpûò ÷þ×}¿! +q3+6\5X5¯7o:ó:š9{8¿7À5P2 1ƒ5z=±B¸?V5¨*E&È'c)'Þ"T!—#E'‹)h*"+m+)·%Z#÷%¸+q.)»A ¸=¦ýó¬éMãÍݘÖ1Î”Æø¿¡¸~°D«K¬Œ±½´°¥Žš—/š=žŸ1ŸÆ¢ùªXµ×¾Ç‡Ð’Ùüà¸æªî#üï 6!9 *Ã#+-\58)7S7á9»¨CT@½5Ý*j&³'Ð(ó%‰!ã8"ç%(õ(§)Û)Ô'¶#Z!&$*ï,'J÷_éN€üÜñ´è…â1Ý Ö·Í$Æz¿¸­¯qª¥«±B´µ¯”¤Dšè–šô‡ž—ž]¢Óªcµ¿ÝÇÑÚyá'çïâüø 3l"ª!Ú Å%P/Z7Ò9ú8K9<?š?M>= LAäAŸ@Z?!>);µ6Þ49Â@6¬=r?>f?±BâElFE®CBj>9Ñ6Ï::BNFªA!6$+:&V&%§ E™Ñò!Ë"}#[#— ±Lóœ#¼&!ر S¯øRíìäœßÁÚðÓîË“ÄÀ½›µ ¬R§©3¯[²ž­é¢`™Á–šãœ”œ“œ¡®ª¶dÀóÉÆÓ5ÝGä®éòÒþØ!*()(¹(À. 8ñ?pA‡@oAÞD(H¥H?G·EÞCß?':“7v;¼BF¤Aç5Ô*Þ%¶%l$wÏe#E (!ä!¹!ÍÉZ-"@% —« ¢lÜÿ ÷HìäíÞ/ÚnÓ„Ë9Äc½µñ«­¦Ÿ¨Ñ®û±*­¢X™ë– šÀœ2œ9œÿ Ëªd¶ÛÀœÊ¡Ô Þ0å{êóaN#É)î)Ú*11 ;+BfCmBzC GJJÆJNI¯G›E6A;58 <)CFXA5g*p%%1#rŽö¨hˆ|L  Þˆxœ Ó#¥ZÚâÿöHë*ãEÞ¡ÙêÒËäà ½“´B«¦%¨h®­±¾¬7¢K™ —Gš­œÜ›æ›í üªÅ¶bÁUËŒÕ!ß#æZëúóDÚË$e+¹+ú,¤3=YDiEUD~E*IcLÌLGKŒI?GwBý;Ç8v!-éòÙýAôcé‰áôÜ”ØóÑCÊ-ÃF¼—³ç©¬¤§˜­Ö°¬“¡™n—œš¥œd›W›Ê m«£·©ÂÍš×báTè|íöÛð(°.r/.1{8€BçHvI(H]I=MoPªP÷NøL8J¯Dm=¿9=ÇCUF@½3–(i#e"F>Ç T}Zó[)¦CÜÊèmru7ýaósè»àLÜú×vÑÜÉÛÂ컳K©ý£Ÿ¦8­d°‰«G¡™¥—Ïššœ3››Ì »«(¸bÃöÍÅØ¥âˆéªîr÷MžÁ)l0i1‹3;E.KuKJLK6OYRvR«P‡NK›Eï=:%=¨C Fh?ï2Õ'§"\!Õ^½'>P—ÙõÊFm áuƒÓ®ƒü‡ò„çîߨÛh×öÐuɉ—»¡²Â¨g£%¦ã¬° «¡™Ý—›¤œ›ýšÎ ¬¾¸-ÄûÎýÙüãÒêéïÏøØZŽ+82c3à5’=©G…MzMóK/MQ4T.TARòO®LkFO>%: =iC†E²>2ñ&Ä!9 Zw£  Ryâ<nD§á² ›‰#:Æ ëŽ¡ëû»ñ—æßÛÛÖ}ÐÉ6ÂE»2²@¨ö¢°¥—¬»¯Êªß "™˜c›Ìœ›ÿšð v¬h¹ÅÐDÛgå2ì8ñ4úi o-4a5-8@9JéO…OÌMüNáR÷UÏU½S?Q±MGŒ>:ô<CÏDÌ=ü0é% Æ„  _ £*¥ñËM  !@åÉ $HcûýðÅåFÞYÚPÖзÈéÁûºÎ±Ã§†¢X¥T¬y¯|ªµ J™t˜É› ››6¡ñ¬$ºÆ>ÑšÜÎæ¦í–ò¤û ²)/ñ5_7z:©B²L9R€Q‘OµP‘TˆWOWUkR–N–G¼>ñ9¦<‡BøC°<×/Ï$¶Ë%¢[ ñu Òsbšà « ½®ÑÚ ŸÄýÿÙú:ðûä‰ÝºÙÈÕÏ^È¥Á¼ºn±J§¢ ¥¬=¯0ª’ ‚™í˜8œN1›1›¡‰­öºÇ|ÒÞJèïûóý« p!Ø0¿7`9Í<9E,OZTgS@QXR(VüX¢XNVwS\OùGÏ>´97<êAC|;¤.™#—z­JÖˆ Ĉ'A Bs ÝŠ°ó }Âÿbúƒï4äØÜ ÙIÕ$Ï ÈeÁtº±Ô¦°¡·¤¯«æ®ò©u ·™e™¬œ¤V›Y›ï¡,®Ð»"ÈÏÓ‰ßÞé¥ð†õ þY9#š2‡9a;?ÀG§Q…VCUÛRÝS¢WXZÛYgWcTPCHÆ>x9ª;4AB::[-t"b3Õ¹ :•< ­¸ÃÉÛ* œyœ 6„ÿÿùÙînã Ü€ØÌԻμÇ*Á3ºÃ°^¦@¡e¤f«ˆ®®©X é™à™1ÿŽ››W¢Û®¼¼LÉ5ÕáˆëFò)÷;  %k4Z;l=QAAJ'T´XWuTGUYœ[øZ_X1U˜PvHž>9;m@ü@æ8ù+7!2è4 $¿¬~ € Q`q Zwå cI‘+ ÷ÿ<ÿ˜ù*î âcÛâ×?ÔOÎiÇðÀü¹w°¦Î ¤#«5®`©C &šošÊlžâ›È›Ñ¢¢¯¿½†Ê¨ÖÃâGíúóÛøÎì&D63=}?»CËL¢VÑZØXýU§VLZÃ\ò[5YÙU QŠHU>”8[:e?Ó?z7ˆ*òÿ‡†ÃÂÿÏÆè  õ ­ 5TŒÁÿúþù{íÓá©ÚE×µÓàÍǸÀǹ/°½¥y Ê£èªí­©J hš›sžêžIœ;œW£y°Ô¾ÒË,ØyäïÀõšúÛ²Ý(-8?ŽA FZO%Yï\ŠZlWóWw[Ì]Ë\äYZVCQ{Hå=ë7…9F>n>÷5ø(»Õ½ìþºýðY ³ »ÙÓ «Ëéey ’ÿÎþ£øÖìáêÙ©Ö0ÓrÍÊÆƒÀ›¹ð¯y¥N £Áª¹­é¨T Ûš¬›6Ÿ…ŸÃœÅœÿ£^±ü¿2ÍÄÙ;æñ™÷cü³›¼*':ü@˜CvHÜQ‘[ _/\ÁXYy\·^‡]vZ½V]QAHR=7’8=èÿ‡þÝ÷žë¨ß†ØƒÕ;Ò«ÌCÆ1Àc¹¯þ¤úŸX£„ª‹­²¨ å›Dæ ð èž«¥o³‚ÂÐÝèéÂô`ûj s}.»=·D‘GõL¤Vñ_¾b _[[#^ü_‹^1["W=QyG OcU__ýgiçc”^]ß_ü`Þ^øZ@VrO‹D(8Û0#1M4¼2T)áãö² ÃOùñLð‡õ»ûHëôtH$ý®û®B Ù ³ hVþ~þ¡ýöôè{Ü€ÕÀÒàÏæÊ&Å”¿Ï¸ã®q¤µŸJ£rª1­ã¨-¢]Ÿ<¢%¦¾¥}¢¼¢úªË¹Ûɑؙæ(ôSÿ­U Ì $?8áFzMQVWTa¿i|jÔd+_ã]ï_ê`¢^˜Z´U¤N~Cã6}/¦/‘2·0L'øA‡1 x÷"ï€îàó:úþþÖ‹YJüÔú×d Ý ½¿íýcþ‡ýÈõ€èõÛâÔ:ÒoÏ–Êüć¿Ð¸Û®w¤âŸ„£«ª[­©°¢U ~£‡§§®£û£Z¬B»†ËnÚ§èSöwÛo ë²&:‰HO¨R*Y1cPkÃk¤e_^â_£`H^ZUÆMbBŸ5..Ñ0´.7% œ º g½õ=í¹ìCòÄø¹ýÈ!µzyû"ú “ñ Ô«ýQþtý}õèÛaÔÁÑÏKÊØÄ€¿ß¸Ý®ƒ¤ Á£Ïª–­\©F£^¡Ï¤á¨J¨ä¤F¥È­Í¼7ÍLÜ¸ê…ø¦ÿ „»(ë;J PCTïZôd¾l½lQfô_+^¼_A`Ã]„Y[TÙL7A[4’,~,/°,(#:ù¶ FÆÿô“ëÿê±ðX÷|üÀFð©±úqùSÿÌ ô}eý8þeý9õ¦çÛñÓJѤÎÊ·Ä~¿ß¸ê®–¤E ¤ýª¿­³©é£p¢+¦<ª¦©.¦¦>¯_¾éÎ6ÞÒì¿úß+ ±¿*º= KRÅU‘\šfn¨måf%`^r_À_!]ÏXŒSØKú?33+Þ*?-¯*!hy W ä9þmòÿédé)ï÷õLûÄÿg2ÞÿéùÁøŸþê3 ×ÿýþHýÿô@çœÚ|ÓÒÐBÎÀÉÄ€¿å¸÷®«¤ X¤C«í­ª”¤£š§µ« «Š§¨¿°À«Ð-àüîý$^í9Ã,ˆ?!MlS•1Á)H)z+¯(Šó ý”ºüÕðnèãç­í¢ô)úÕþ–_ÿ&ùøñý; .*ÿÆüþýýÌôàæ(ÚÓ]Ð×ÍɅĈ¿ö¸¯Þ¤½ µ¤›«2®tªH¥°¤©B­†¬ ©e©D²ªÁyÒ*â,ñZÿx ›(xÄ.TAŸN¼TX•_¡i˜p@o¹ga`¥]„^j^ˆ[ W‘QžIF=09( 'Ž)´&õ­m ¤5=û<ïÝæhæAìWó ùêýÏ›Zþbøc÷?ý89I€þzüçýìüpôyæ´Ù˜ÒòÏtÍ@ÉsÄ¿¹5¯-¥¡¥¬‹®òª2¦ê¥©ªÜ® ®šª«Ø³cÃQÔ-ä^ó°Õ Ü_¬ É0CPÿUíYaøj¸qåoùgX`V]è]œ]–ZVsPMHÚ;….¢&í%™'•$ãÑêQÉÅù«íRåñäÚêòñ÷ýážýµ÷­öŒüb<]Óý'üÑýÇü!ôæ;Ù$Ò„ÏÍÉgļ¿G¹j¯‡¥¤¡—¥¬ü®‚«(§W§T¬˜°¬¯<¬Ã¬µ)Å6Ö<æ™õ< Ô"Â2±DxQ&W[Lb,l¬rwph'`ß\%]±\‹YëTAOíFU:â,ÿ$9$«%h"Æê aqJøìÃãxãyéÁðÞö*üX-ãü÷ öàû˜En8ýÐûÆý·üäóÎåãØ°ÑϽÌÓÈgÄâ¿„¹ª¯ë¥=¢?¦­ˆ¯#¬(¨Î¨®q²g±î­†®g·þÆ*ØYèß÷V|]±ì$ª47F§R.X\kc;m_säphÔ_E\F\š[jXºSûMEÆ8J+O#€"Ä#K ® Õ½(ãö´ê8ââ#èŠïÖõUû­ÿ‰7üyöˆõ9ûÚ^Œžü‘û½ý¯ü±ó…åØXÑÅÎr̨ÈgÄÀι÷¯V¦Ù¢ê¦³­.°Û¬7©NªÒ¯B´+³¦¯O°E¹åÈ%Úsêú§½‹Âê&y6¨G³SY]kd)nòs qûgc_–[W[pZ%WpR¦L D17»)«!Å â!9£N Z…èþ‚õYéìà§àâæaîÓô‚úÿôÿ’ûáõõ§ú(‚° üYû¯ý®üó@å]ØÑwÎ/Ì‚ÈpÄ4ÀºM°É¦€£¦§T®É°¢­SªÜ«¡± ¶õ´f±!²*»ÐÊÜì]üø û®ØÖ(68I©TáYÉ]Heønhtq½gÐ^ÅZFZ*YÉUQFKB’5!($  -›–Zºý2ô è¸ßiߨåAíÜó¼ùXþdÿïúFõ…ôúX§ÓÿrûûžýŸüZóýäØÛÐ,ÎóËhȈÄsÀUº³°J§:¤{¨¯k±q®x«x­†³ì·Æ¶/³õ³½ÃÌÞ¯î¤þK 5Çí!Â*ä9QJƒU…Z~^f®oËtqag3^ÑYYÏW\T¡OÐIAç3&šp=*–ܪ3£üöòÆæ‰ÞIÞ|ä/ìôòù±ý±þPú¬ôô‹ùŽ´òþÓúÞúýyü9óÅäÞמÐçÍ´ËXȩĺÀ®º'±ð§¥c©ë¯,²Y¯¬¬¯wµå¹°¸)µÑµ¿¼ÎàÒðæžqÜò#´,|;‰KJV [ _œf?puäpìf‚]ÐX×W_V×RN:Hq?62Ò$ÆV6ž(Q ÿ‚ûÇñŽåaÝ0Ýdã)ëòIøýþµùô„óýøËÿ¿þ4ú›ú|ýVüþòä¤×gЭÍËJÈÍÄ Á»¬±¸¨ã¥WªÖ°³[°®Î°w·ê»¥º.·æ·úÀÀÐ+âôò é©ç!ç%.=¯LýV~[|_gœp=u¢p[fº\ÈWVÛT@QL™F°=x0#cp/« zÿçýOúœð]äAÜÜRâ!ê7ñœ÷€üuýù–óóxøÿÖCýœù^úsý?üÎòhän×6ÐxÍTËFÈÅnÁŽ»=²‰©ù¦e«Û±ô³i±‹¯«²Š¹¾¦¼9¹ º ÃÀÒ2äõXÕÞ#Â'T0|>M•WÎ[Ì_{gÓp5uHp¯eÓ[¢VUFSžOâJóDî;´.]!Ê}˜!¸ ̸ýÑü.ùoï/ã#ÛÛDá é`ðôöîûÜüƒø&ó™òý÷dþóÿpü ù"útý8ü®òNä]× ÐMÍ8ËUÈCÅÜÁ¼â²oª$¨›¬ý²ø´‡²±´ž»+Àº¾Q»7¼5ÅÇÔ<æ2÷†9Æ À%„)û1Ô?lNôWø[î_«gápétÏoêdÑZbUŠS‘QîM6IBC*:ñ,¶,ãÏ)×%jüÁû øXî0â ÚÚ?à)èïJödûQü÷÷·òGò‡÷Åý#ÿ¦ûžøîùzýAü ò?ä^×ùÏ2Í)ËkȈÅG¹¼™³[«O©Ù­´¶º³ˆ²o¶³½VÂßÀn½a¾bÇáÖMèKù¨ Pµ"')+|3 A&O4X\è_²gÑpˆtod±YTùQÒO#LuG‡Ah81+˜KF¦þ%û¾ú÷Kí6á$ÙÙLß>ç¼î›õÙúÐûn÷Eòðñ÷1ýZþàúøÁùqýOü’ò4äi×Ð'Í#ˈÈÛÅÆÂL½Z´R¬‹ª+¯Mµ?·û´´c¸Ô¿hÄýÂŽ¿’À”ÉùØPêYûÄ a–$D)Ä,â4)BÈOYXó[Ç_Ÿg¦p tMncX¨RVPNMJ°EÒ?§6m)ƒ*Älp>3ýúÍù*öGìFàWØ&ØWÞQæðíõô@úPûàöÍñ˜ñ°ö€ü’ýú¡÷—ùbýJü‹ò/äv×Ð%Í)˹ÈFÆ\Ãö½0µX­Ù«“°’¶d¸J¶¸µgº ÂÆÅ­Á¼Â½Ë ÛRìdýÛ fe&ã*V.=60CMP\X½[ž_ogfpysgmúaCW$QN%LqHáC>å4ª'êÀNΠ {ÃûòøßøMõSë]߉×^×mÝoå.íUôªùªúRöUñAñHöÑû·üQù÷mù\ý1ü‹ò0ä†×.Ð.Í:ËúÈ¿ÆĹ¾!¶Œ®:­²õ·¨¹³·a·q¼MÄÏÈQÇõÃäÄãÍÝQîdÿÝ\%(j,Â/‡7D»PGXe[E_g pÙrrlÏ`÷U˜O×L=J‡FB:<(3ê%LNÛ(é ÄQú×÷ï÷qôpêxÞ¶Ö•Ö—Ü—änì³óùúÊõ×ðÞðßõ1ûåûŽø“ö:ù`ý2ü„ò6ä–×JÐKÍ`ËFÉBǼĚ¿/·å¯´®£³w¹»2¹6¹€¾ŸÆ"Ë’É>Æ0ÇÐ.ßLðRÂ7 ×)Û- 1¤8ÕD QXìZÇ^¥fwo$rek_•T N KMH“D$@f:Q1.$°Þmˆ+ îøÌö ÷}óéšÝïÕÕÕÇÛ¿ã±ëó”øˆùDõoð€ð{õ•úûÜ÷öùmý2üòSä¶×uÐqÍË£ÉÞÇ‘ÅÀH¸J±_°Iµ»{¼¼º»ºÀþÈsÍÏˇÈÉ:Ò1á3ò2šç!l+(/12¥9xEQÂWSZ3^f¾n6q?j7^#SnL-ISF BH>–8}/t"{ñ iuþ“÷Ðõ4ö˜ò¦è½Ü(ÕÕøÚìâøê‰òøúø¾ôð7ð%õúRú.÷Éõ ùŽýFü†òuäõקФÍÐËʇÈoÆ‘Ár¹¿²² ·©¼ô½K¼½÷ÂYËÔÏÎÊÊàË}Ô3ãô^~#»,V073‡:ÿEQ>W—Yy]señmpiÉ\˜Q¿JIGOD©@j<Ç6²-Æ ›¾ s ¾çü<öÕôkõÇñÎçÜ[ÔSÔ,Úâ@êïñ‘÷uø<ôÁïðÖô…ùœù…önõûø»ýpü¢ò£äFØóÐèÍ#Ì’Ê>ÉQǫ­º=´Ý³Ú¸Q¾¿é½è¾,Å«Í/ÒZÐÍ#αÖ7åíõÉ þ$ù-f14>;hFôP¥VÂX”\žd mìngJ[ùOIdELBª>ƒ:ø4ò+"2Ë v  2iûõÔó©ô ñçIÛ±Ó‘ÓkÙZáŠéLñ ÷ÿ÷ÆógïÄïˆôùÿøæõ õâøÏý¯üÒòÞäžØ]ÑEÎŒÌËþÉAÈÂÃü»Äµ¢µ³º À/Á•¿ÎÀ^ÇýÏrÔ£ÒCÏ\ÐÚØ1ç´÷s›f&$/_2ç4Ò;®F¾P÷UÞW“[ªcl«m(fÅYPN=GwCC@§<›8039*ƒÍ˜ 9 µ²ûùãóôòóóOðGæ¢Ú*ÓïҪؓàÖè³ðzö÷Póïï@ô”ø`øOõ¼ôÙøÔýÉüÿò&å ÙÖѲÎýÌ¿ËÜÊKÉéÄ\½X·z·š¼ÅÁÌÂNÁÆÂ¢ÉVÒ³ÖÞÔ{Ñ–ÒùÚégù !½'2063«5Z<ÝFhP$UÛVŸZ«bñjSlœd0X³LoEA7>©:¹6k1…(æop f4‘øÈò"ò7ó¢ïŠåùÙ ÒeÒñ×Òß*èðêõñöÖòºî]ïôøµ÷µôlô×øìýÓü2óqåyÙWÒ/χÍtÌÉËdÊ#ÆÐ¾¹a¹•¾šÃ{ÄÃÀÄé˼ÔÙ×ÉÓ¼Ô Ýòê ûŽ …ú((1ï3I6Ñ<õFP?T»U„Y“aÖiýj cŽVK£CŠ?-<¬8Ö4–/Ø&MI åËÿ+÷¦ñKñwòòîÙäPÙÒÖÑF×ß~çŒï_õ`ö]òZî%ïÄó›÷÷ôôÎøþõübóÆåîÙáÒ»Ï"Î:ÍÆÌ‘ËsÇTÀèº]»¦ÀÅFÆõÄÝÆ.Î,×fÛjÙÖúÖß¾ì¢üú È* 2Ž4Á6=çFOES{T>XS`†h¥i{aãT]IÞA–=$:­6ò2È-%¼® !ÊÎlþÎõðpðÀñ7î1䍨xÑDÑ Ö_ÞÓæúîÝôáõòñîèî‹ó6÷~öœó¯óÃø=þ1ý«ó6æmÚ|Ó_ÐÒÎÎÎÍÓÌßÈîÁǼv½Ã•Ç#ÈÖÆöÈ}ТÙÎÝ´ÛTØ6ÙávîþIì+×257H=·FÙN.RSÝVü^g!hÝ_0S¦G@¤;8¶41 ,m#=Y ¼” ý}ôiï¦ïñ€íãØåгÐ÷Õ¨Ý*æqîaôaõ…ñÚíÄî_óÓöêõ!óŠóØø€þrýøó¶æÛ)ÔÑ‘ÏüÎóÎ(ÎUÊ÷¾¥¿ëÄšÉóÉ´ÈËÜÒÜ'àèÝ‚ÚcÛ ãð}ÿ}õÈ+K3a5F7V=iFúMàP›QlU¡]•eef#^jQäED>±96Ç2P/W*Ë!Í+ Ág¶ûFó`îïîðÜìÛâ{×SÐ(ÐXÕû܉åèíïóëôñ§í¸î?ó}ö`õ¬ògóþøâþÔý]ôBçÜÛòÔÓÑcÐøÏ#Ð}ÏßË?Å­ÀØÁÇ–ËÑËÊ3Í0ÕYÞuâàÜqÝñä­ñ¾ŽÙn,£3Ž5H76=ùEMxOÿOÑS%\d¯dQ\ODo<À74Ù0‰-±(: j ÙWxúòzí9îøïNìGâüÖâϛϻÔRÜêäYíóƒô¿ðqí¥îó<öåô8ò<óù1ÿSþÝôãç«ÜÛÕ¯ÒKÑÑdÑçÐhÍþƪÂÄaɦ͸ÍnÌAÏx×­à©äDâ¦Þbß¶æ#óæ|› ö,æ3 597óùxÿÍþuõ˜è‰ÝÒÖ¦ÓAÒ!Ò±ÒaÒ ÏÛȰÄRÆ©ËÀϦÏUÎFÑ·Ùýâßæbäà:á\èzôìGìwò«óðí“îìò—õôcñ÷òyùÑÿ(ÿ öUéwÞØ×ªÔOÓOÓÔïÓ¸ÐÉÊàÆ¤ÈûÍØÑÑQÐZÓÜMåégæœâýâíé¶õÕò¹!µ-4v5æ6@<D¶IÎJÕJ¼NJWS_ˆ_ßVEJÓ>ý62;.1+J(ç#äŒÿ—Taþ÷¶îÔêHìXîËêªà‡Õ²ÎPÎüÒRÚ ã¸ëþñ6óËïíì“îäòUõ–ó ñáòÀùB¡ÿ¢öêqßïØÂÕmÔŽÔ…ÕŽÕyÒÁÌ&ÉËbÐ Ô„ÓLÒ‰ÕJÞ ç*ëcèƒäÂä^ëÔöz "â-4.5„6»;9CyHIìHèL‘Uš]Ö] UwH=D5&0N,W)–&U"nLÿÓ–oýçõ—íñé«ëÒí4ê$àÕDÎæÍvÒµÙnâ7ë’ñÒò†ïÔì•îëò*õ?óÊðÎòúÐ<U÷ ëyàÚîÖœÕÚÕÿÖ?×JÔ¿ÎiË|ÍÕÒLÖ†ÕAԨ׋àõéPíRêQætæÃì×÷Hâ;"×-ê3È46;IBGPGíFúJÅSÉ[\=S¦F^;3Z.k*„'è$Í ÿäÿüÜô…ìé ëUí­éžß{ÔÏÍzÍöÑÙÕá¹ê-ñyòIïÍì£îþòõöò‘ðàòjúsòøì¥áUÛ1ØàÖ4×€ØõØ*ÖÈбÍòÏ@ՙ؊×1Ö¹Ù½â#ìjï+ìèèîÄøØ,L"ª-3E4`5\:BA•EsEÝDIôQõYZdQÕD¦9Þ1™,(¾%H#P« &`;ÿ¶û×ó•ë0è{êÛì$éßÔ\ÍÍwÑŠØAá7êÉð òïÐìËîóýôµòmðóâú+²óøíïâ®ÜƒÙ5Ø£ØÚ¥ÚØ×ÒÐsÒ­×ÁÚ‚ÙØËÛìä/îVñçí™é€éYïžùHW?"_-ô2¢3¤4Š9'@D‡CÌBG%P$X-XvOCò740Þ*Ø&$µ!â]ð eÀÿ þéúÜò¨ê€çïéjì¢è‘ÞªÓÍ¤ÌøÐöׯà°éeðÍñÙîÏìðî0óøôòLðBó_ûÖ‘áù,îFä"ÞçÚ™ÙÚµÛeÜíÙëÔWÒôÔ"ÚóÜÛýÙËÝç2ðóïëÔêqðXú¤f"ü,T2ç2×3š8ú>lB‘AÀ@õDINWVLV”MBA=6Ž.,)%X"% ~á ¢0ÿþ2úîñ½éÊæfé ì0èÞCÓ¿ÌLÌ€Ðl×%à2éíï†ñ¤îÎìïQóëôVò/ðtóçûƒråúYïªå¦ßlÜÛ«ÛcÝ0ÞÖÛ×§ÔyסÜ2ß‚ÝàÛ¹ßé-òÜôñjììhñöúåXÓ!,›12û2˜7¿=Ê@?£>öBfLŽTsT¶K€?™4î,†'n#³ —ßÛ ã¢þý‹ù ñÕèæÚè”ëÍç¡ÝÛÒrÌÌÐêÖ¡ß·è{ï%ñwîÒìHï|óêô>òð®óvü>@ôû’ðç:áÞ¨ÜCÝßàÌÝDÙ×úÙßráˆßÛÝžáëô…ö•òÁííAòxû'a!á+Æ012ƒ6q<?ˆ=ƒ<ó@yJÄR—RØIÃ= 3d+ð%Ð!´²ß1!þóüÍø/ðøçeåWèëJç$ÝuÒ.ÌËËÀÏoÖ$ßBè ïÁðMîÚì‚ï´óöô7ò*ðô ý ûüÚñœèßâ¬ßQÞöÞâàæáÇßzےَܤá³ã†áÍߢãíçõøèóùî î÷òÕû×È +Í/0ì0\5ÿ:c=r;Y:ì>HÚPÄPH<ƒ1ð)h$@ ›«Yuå§ýqüøVïç±äÑçê³æ¨Ü ÒãˉËkÏÖ«ÞÔç¥îkð.îøìÄïûóõBò^ð^ôØýô!þCó/ê—äiá à¸à´âÖãÍá³ÝÜ)ß/äûå€ã«áˆåáî®÷Œù$õðï™óüéi *À.Ô.»/49‰;R98Ò<™FâNèN8Fb:ÿ/ƒ(ö"¼F GüÑÿ0ýüûn÷‰î9æôãLçê+æ+Ü—ÑŽËFËÏŸÕ9ÞlçJîðî íðSôJõZò˜ðèô¨þ5_ÿ½ôáë_æ8ãØáŠâ“äÑåâãï߇ÞÂá©æJèvåwãUç¤ðKùûúCöýðÜï(ô;ü¯ÝB )z-†-h.Â2ô7¤9+7Ì5¦: DöLòLmD°8z.'“!Q­ìÏ-"3ÿ»ü‘ûÙöÊí€å8ãÉæ–é­å±Û>Ñ5ËËÐÎ>ÕÉÝçúíàïûíKídð¸ô•õŠòâð}õÿ$i«Cö«íFèåµãgä|æÆçæ2âýàSäéyêeç6åéNò³ú3ü=÷Çñ„ð—ôPüS.QÝ',%,ÿ,U1X6¹7 53ƒ8®B KýJ“B 7-Ç%; óP¤¡R±þUü-ûEö íÌä®âOæ&é)å4ÛêÐËÈʇÎÞÔ^Ý”æ©í¤ïêí}íÆðõîõÆò@ñ+öp; ² Þ÷ˆïEêçåQæuèÊéètätãèæë™ìAéÙæ¯êâóü.ý øhòñÞô<üÝ^F˜&§*¬*+Ü/¹4Ê5Þ2i1a6Ë@5IIÆ@u5›+|$îÿf… ‡1þÿûÝúÂõSìäâØåÈè²ä»Ú•Ð×ÊšÊ@ÎÔ÷Ü/æDíqïÚí²í1ñõ@ö óŸñÞöoR ü }†ùqñQìéçFèwêÖë5êÂæäåzéîºîëqè0ì]õCýþÀøäò_ñõ üMw$@%))*[.3Ý3°08/\4ë>oGMG?è3C*:#­T¸+l ¿²ý­ûzúJõ›ëRã†á`åUèGäEÚ;ЧÊ|ÊÎ,Ô—ÜÑåêì+ïÐíìí¦ñö¤öfóò™÷‚‹ @ ÿ7û_óiî;ë¤éDê€ììí\ìéaèìvðÙðßìê™íÃötþðþUùVó‘ñõ¿û¢tÞÕ#Š''…(É,q1î1.-T2=»EŒEK=\2ô("zzúJ0 ü1ýVûú·ôäê“âðàëäÑçÌãÍÙßÏxÊcÊÞÍÜÓ;Ü{åìõîÚí/î&òŽö÷Þó”òqø±Ö ’ zñü\õŽðbíÀëWì–î ð„îkëéêîÛòãò”î¡ëïøŠÿ¥ÿÉù¬óÁñïôTûÙX{M"Ý%Ê%ç&-+¤/ú/M,Ó*X0-;èCÐC–;×0­'â OâGÖ21 7³üûµù!ô.êÑá^àäYç;ãTÙƒÏKÊMʽͥÓëÛ3å^ìÉîñíŽî»ò4÷ª÷jôYóaùþC Åþd÷¿ò”ïåíqî­ð,ò§ð±íbíñ;õáô-ð íxðLù‹=ú×ó×ñÂôÍúö# – $$;%Œ)Û-ñ-*›(X.]9BBê9X/m&É9¸·!9 €5ü½úfùšó…éáÈßäðæ¹âáØ$ÏÊ?ʨÍ{Ó­Û÷ä-ì¬îîïeó÷÷Røõ&ôú`Ί® ¥ƒùýôÒñðŽð¾òDôÂòéïÈï}ón÷Ñö­ñOî©ñVúP½CúÝóÄñô/úüÙ wÏ7"+"€#ä',ê+æ'Y&O,Ž7H@<@F8Ý-1%¸/§ùŸFÏÅûxú ù"óæèˆà4ß¾ã•æFâxØèÎôÉ6ÊœÍ[Ó|ÛÃäìŸîAî‡ïôÎøùºõõ®ûÄm%^ ±ûH÷ôCò¯òÔôJöÙôòòØõŒù‘øó|ïÁòEûà PúÅó—ñ#ôƒùé{ ÜÿH S ¼!4&J*å)È%5$V*Ë5ƒ>k>™6l,$±-è– `'fû4úØø¨òIèÿß×Þlã>æÕáظÎíÉ5Ê”Í>ÓPÛ’äöë¡î|îðÜôùáùzöðõêü4 óÏ „æýùbövôÒôîöVøæö;ôdôø”û4úhô…ð¸óüW$;ú‰óEñ¥ó¼øÎÿ 5(Uwý‚$ƒ(é'°#;"g(4Û<·<ÿ4+Û"´4œã“+ €ÿûðùšø4ò©çkßqÞãøåoá²×„ÎïÉ?Ê‘Í*Ó0ÛnäÐë¯î¿î¦ð­õfú¨úA÷áö2þ¼ ~z〠ùûºø­ö÷öù`úëø_ö›ö[ú’ýÅû¡õuñ‰ôÏü»$ú#óÐð óÜ÷ þŒƒJYD×"Ë&ô%˜!> ¥&ƒ2P;;u3Â)Ç!ÁD£ä 9 žÑþ¡ú´ùCøÈñçÐÞÞÁâœåáS×NÎïÉZÊšÍ!ÓÛYä»ë³î ïHñ’öWû„û!øÙ÷ƒÿU "¹†c\þûúø ù!ûeüãúxøÎøˆüÿBýÀömò?õký±ù¾ò<ðTòâö\ý¿aPœ‚(!%$ƒEê$ã0Ð9…9ô1(Ç Þ_³ñ š 9 ¼!þ=úyùî÷Cñcæ9Þ¡Ýqâ(å¢àñÖÎùÉ|ʶÍÓÛSä³ëÂîjïùñ‹÷\üsü ù÷øíÓË– ²È}ýHûSû;ýeþÑüúùú¢þ[¦þÁ÷Cóÿõñý/Ì>ù?ò§ïˆñÔõügå f= ºwD#"rO2#H/8880F'Ï†Í « A ×rýÙù?ù ÷ÀðËå›Ý8Ý%âÃä)à—ÖðÍÊ¢ÊÜÍ8ÓÛYä¼ëäîÞïÄò•øxý{ý3úJúaÄœ†p» 9çÿœý‹ýPÿ^²þsü ý›òÿ£øòó’öCþDx®øžñúî§ð±ô›ú¿ÿ F#žðÇx!% dX{!¶-”6z6/&Û6¾ô# à Sú×ü|ùù^÷IðDåÝÑÜäáoä¾ßHÖ¿ÍÊÐÊÎbÓ2ÛnäÖëïeð­ó¸ù°þšþSû¥û Ÿ„_`æe ²Vñÿ¾ÿYJ…Sþÿ¤!`ùyôýöoþø÷Öð*î³ïwóù ï•#²0ecÊ-,ü4Ø4¯-å$ðnü/J ä j"Fü/ùèø#÷ØïÃä·ÜyÜ«áäUßÿÕ¸Í#ÊËDΓÓ[Ûäì_ïþðªôéúüÿÌÿŠüýÅpq<Z!Ù 3ÅBð`GçF þùãôM÷zþ®]ÿ$÷øïEí¨î0ò‰÷9ÿ ðº”UoóH€‰!®*p3F3N,Ç#¶Ep | ŠQ·ûìøÁøòöuïKä]ÜGÜ{áÙãûÞÃÕ¾ÍWÊEË„ÎÊӌ۷ä:ì¸ï¦ñ³õ)ü8ÏýþBH/ ecO¶ 6YÞòΩîVò†úõl÷`þ1Žþ8öüîBì…íØðöõaý Ä ‰š“ÎFu©ß}=)þ1Ð1+Á"B—¹ ¸ 5¯‚'û£ø’øÊöïÕãþÛ Ü<á£ã°ÞÕÄÍ•ÊËÌÎ ÔÇÛêägìð[òÇöwý‡_ÿ; !"t£À8 ¬ Ù6E“ŒvQ~´úúGõi÷.þ¢®ý;õáí%ëPìsï\ô‰û˜ Z ¢ß8«²Þ= ä'¥0p0Ä)Æ!€bö ü_Ô¶ÿ˜ú_øiø~öÄî_ãžÛÐÛýàSãiÞ\ÕÍÍ×ÊéËÏZÔÜ*å¤ì‡ðóí÷Ùþê´‡ é"ï#‚å2· ( I# 4 åó§ ZRû€õR÷áýò¬ü%ôÔìýé ëÿí¶ò±ùôm, ¯ 2¢û"¯«~&Q//Ž(Ú ÑÉYd CëæþúøAø7ö\îëâCÛÛÄàíâÞ)ÕÜÍ%ËŎϬÔbÜ|å÷ìñøó ùMf!-Ø úË$Ê%Œ *¬;‚j V ô Å vxaL ¯ é‰ûõ;÷ý0•ûôò±ëÓè»é}ìñÏ÷âÿD º †zShK"%í-Å-d'õ)6Àº ŒÆ þlùÑ÷"øöüíƒâÝÚeÛ”àšâµÝúÔìÍtË»ÌöÏÕÇÜçåcí“ñæôlúÚû¢¡ý·Ä&·' "#¹ã¡ Z ³ C À Ź{ ¢ ]œûvõþöñü^ÿhú©ñrêšç\èíêFïëõÑýÕÄß –稴‹ò×#„,z,D&…©4 Þ/KýäøŽ÷ ø×õ§í0âŠÚ2ÛsàZâhÝÜÔúÍÆË/ÍuТÕDÝbæàí1òàõÍûx§4<ÒÁ"Ò(±)µ$͘1=ÐP\¤ í òò ‹ E ­ˆû7õŸöBüRþ!ùAðéIæôæTéƒíô½ûÈ¢Î= !_  ­¢".++&%<ê%¬‹ 4G\†üiøY÷øµõXíâápÚÛbà âÝÃÔ6Î,̵ÍÑ2ÖØÝðæsîáòìö>ýd Ô ç¹Þ4!æ*¨+É&!¥ˆç.ðâþ y É ÆPûØô$övûý¬÷¹î¤çéä€å¹ç³ëò¬ù–ÿzì  ³åpž t~!ê)Ð)$kY©(û’Åûï÷*÷ö÷Ÿõí˜áPÚÛ[àóáÞܰÔvΦÌEΗÑÎÖzÞŒçï¦óøºþÆ … ˜  ûJ#ç,²-æ(q#ˆËñýsü í  L8 ÄûNô„õ“úÁûöíæqãûãæïé%ð£÷nýYS}ë( g Go À(—(#ªË1¨ rüßËÿûr÷ûöâ÷–õØìOá.ÚÛKàØá¨Ü¡Ô¶Î*ÍßÎ9Ò}×2ß=è¿ïuô*ùB„¼ / H † o%Ü.±/ý*µ%î!jî¼ã#Û Ê Ú Œ ££ú²óÊô¡ùgúrôsëqääáhâjä1èFî¢õKû>þ@‘ %p ¼< M{«'m'þ!ì@»/ óp1ÿGúûöÓöÒ÷\õ”ìÿà Ú#Û<à¥áwÜ–Ôüη͌ÏîÒ?ØýßévðWõaúàV ‚ä }T '×0”1 -ó'J$¹ *åg;Ÿ‘ › ¡½ _%ú+óô™øñø´ò·éÜâQàÏà¸âjæhì ó.ù(ütÿ¥ Û ]`w¡&I&þ 5¿K· oá‡;þŠù€ö¨öÄ÷,õIì²àëÙ1Û8àjáEÜ’ÔLÏUÎMÐÀÓÙÛàßéMñRö¶û‹: _± ‹”å)æ2…3/+*¡&ý"<¿úyû@, 4Ö ùvò1ó‚÷q÷æðçç5á¿Þ0ßáŸäŒê¡ñ÷ú«ý¡R r Ÿ ýüx€Š%3% }>Ö= èRäzýÙøööÀ÷ õìtàÇÙHÛKàGáܑԡÏýÎÑ£ÔÚÓáÜêAòa÷ýL7UŒÌæD, 5|5"1c,í(4%< x½¸œ ¨VØ ²øœñGòFöåõïýåwß$Ý‹ÝEßÕâ¶è¬ïÿô øâû5  4 šÞœi$$ ÉÀeÉ hÎH»ü(ø–õ`öÉ÷òôÀëJàºÙlÛmà1áïÛ­ÔбÏûÑ–ÕÛêâíë@ózø“þ%DVlû\ ª.)7k7"3‘.(+S'#"/áŸW ð w} ÖÈ÷¯ðJñéô"ô í ä¶Ý…ÛæÛŠÝáèæ¼íéòö+úÛÜÍ ØaÕÔÂP#ë"Hù\ úN±ÿü€÷:õGöÖ÷ßôˆë+àäٜۙà'á×ÛÔÔŠÐuÐêÒšÖ)Üä íTô¨ù ?f[ýZÆ"ê0M9[95¯0Q-`)ö#¾&‚ÏB0t Âöžï*ðzóGò ë âçÛÝÙAÚÜÛKßåÛëëð%ôŠø†ÿ³— •HØðK"Õ!.pÓ’ï ŠÑÿQûÚö×ô)öß÷ÜôbëàÚáÛÓà2áØÛÕ#ÑQÑèÓ­×RÝHå8îõìú©è FYZ—'%!3T;R;7Â2j/Q+¯%0 LG,g#8QŽ 1µõlîïîüñgðüèà Ú-Ø™Ø0ÚœÝ\ãêýîHò÷ö;þ˜p]4 > +S!É LÒc,… ]Œþ¡ú1ösô öÓ÷àô>ëà0Ú-ÜüàHáàÛUÕÊÑAÒöÔÑØ’Þšæ{ï¯ö7üIá ]WQÞ’'\5;=/=ý8Ê4n1)-Q'Ž!`ñeh-é /¢ô@í¯írðtîßæ Þ4Ø}ÖïÖ‡ØüÛ°á;è ínðrõýˆP*/X¦ u\ ½m8ñÈ! ¾ò÷ýêù†õôúõÊ÷¬ôëëßbÚ…Ü)áMáïÛ¤ÕzÒ>ÓÖ ÚèßüçÉðé÷šýõç€^N.$ÿ)›7$?ï>Ð:µ6[3ì.Ü(Û"R{€Kþ Å1 uó"ì`ìæî„ì¾äÜiÖÎÔOÕéÖ`Ú àxæ.ë¡îòóÓûkI -ÿ› ­}¼Žši Z…hý:ùÜô´óåõÌ÷ôíêÖß‹ÚÞÜiáZá ÜûÕ6ÓNÔX×hÛIámé1ò>ùÿ¶õ·_eo f,à9A®@–<875›0J*$%è~³ ¯Un øþ+òàê ëUí’ê˜âûÙžÔ+Ó³ÓKÕÂØhÞ¸ä[éÙìtò¦ú[%ï%þÑh ჽ­üa ñÝü‘øHôNóÒõÛ÷‰ôÖêÚß¶ÚBÝÀá€á8ÜaÖÔtÕªØÓÜËâñê®ó§ú’Š´!y  ç"Ô.'<þB_BN>`:752œ+ %Ü3WŸI B¬’ ¸ýÌð‘é©é™ë‘èhàî×ÚÒ’ÑÒ±Ó.×ÏÜýâçëñ‹ùYÓ$ýÑ j®Ïh«§ ­ÿSüä÷ºó óÒõò÷}ô¾êàÛºÝâ¨áoÜõÖêÔ°Ö ÚQÞaä‰ì3õü q ETë#–"à e%P1l>ÛDDõ?<µ8¶3Õ,ü%r T Å ¾ ë g]üUï-è7èÍéuæ1ÞÛÕÑýÏ–Ð#ÒŸÕ:ÛKá¶åméžï|øeúÆÿ=ü\ÿ= WešíÎCL¬8BÿÌû@÷.óÊòÔõø†ô¶ê&à|Û9Þ“âðá½Ü”×ðÕùׂÛÝßæ-îÇö–ý¹Y uŽ!2&·$#Ê'¹3‰@¿FŸE‰A¾=C:5ë-Å&æ \¬o   ;ðúÃíªæ²æèTäþÛÇÓFÏhÎÏ¥ÐÔ´Ù°ßäÔçMîv÷…ÿÈþoû¥þ¨ ¦r•6àò PÝÞþRû¥ö¤ò‡òÒõDø¤ô»êOàìÛÊÞãLâÝ>Ø×UÙÝoá¦çÞïfø'ÿYC¨Ô#Y(Ý&?%*6•B{H,GCI?¼;Q6ã.m'@!R:Ê \ c = |ù;ìå'å5æ3âÊÙ²Ñ~ÍÚÌ‘Í&ÏŸÒ8Ø%Þ[âDæíwö³þÓý©ú#þ ù}ŽD­† õ‡„þÞúöòIò×õRøÇôÆê‚àjÜfߎã©â~ÝõØ*ØÅÚŒÞãVéšñ ú·û7æ&~*ü(k'|,o8DJ”HpDÁ@=q7½/ý'‚!*¨ ™ L ºð÷¼ê–ãœãeä à’׹ϼËSËÌ´Í8ÑË֢ܻàÀäÓë†õèý=åüëù«ý¬_‘‹s&+Q ¦:1þhú~õšñòåõiø¿ôÑê¶àíÜà äãìݱÙSÙ;Ü'à³äë`ó¾ûT¼.(n(©,+¢)Å.½:‹FKãI¹EB^>v8~0x(¤!åú, » ¹ M d[ö*é#â ââñÝbÕ¼Í ÊÌÉ©ÊOÌÜÏlÕ+Û,ßEã¤êšôýsÿü(ù$ý1©¼—¤˜È \ñßýùù÷ôñÝñùõ’øÒôíêíànݾà¤äyãrÞyÚƒÚ¾ÝÔá{æàì6õ‚ý„ 5p Ì*ã.>-â+1ûâÊÛ¦Û9Û‚Õ¤ÌÊÅsÃ!ÄWÅÇÂÊYбÕWÙÇÝ2æQñúü»ørö,ûš,!Ï‹¢› tïü¥ø4ó½ïñ®öÝùÏõåëÐâ`àGäèçþå*ágÞþßjä éÿí¤ôóüÛÞ œSi)ö3•7t5Z4:xEvO9RO„JîFÆB¹;Y2ò( Ðñ ¶áɦû±íà&ÚÚeÙfÓŠÊÛÃãÁÒÂÄòÅ©É>ÏzÔØ‹Ü=åšð~ùgûøöõøúY«KçÚ:fÕ GõÊüaøÎònïzñçöú(ö:ìiãUáVåÆèÄæøá‹ßŒá;æùê÷ï«ö÷þ»¤ aX¢+%6”9h7M68IARõS:PŠKùGšC<62L(QØI 4× Î/øê&Ý×úÖßÕWÏvÆQÀé¾RÀÓÁÇÙÇ!Í0Ò}Õ2Údã#ï*øúžöøôvúÊ­Ì4dæˆ ÂŽüì÷3òâî†ñw÷ÉúÆöí¸äTã¡çÅêèÌãíáºäöéúîôÛú!  H+d" 0~:…=+;2:æ?úJ‹S±T¢PÝKHHÒC<õ1Ò'¹Í ˜LÿDÿnö%èmÛ‘ÕqÕ/Ô[Ísľ€½¿¹À¿Â£Æ'ÌÑBÔÙâvî{÷Oùéõuô6ú‰ü[Öª[ ︃üÂ÷úñÒî ñÜ÷>û.÷¦íåräèèáëtéÝä5ãjæéëñAö ýFš u$82§JA¢>Î=žC)NØUÑUQ!L~HÛC«;1…&µ-™'þüIý¼û´òPäê׋ÒnÒ¦Ð{É„À&»Ëºß¼´¾ÕÀØÄ]ÊÏÒöÖÐà8íDöé÷ªô‰ó¾ù*%p¿Š JO Ò´ƒü•÷ªñËîòÂøcü<øéî„çÿæºëpîŸë#çæêéíïBõ™úv• ¤È½j(J6–@C2@c?@EŒO²V7VQ LbHCE;y0·%¬ÐúOüJú¦ûüùÅðgâ Ö ÑÿÐöΑǘ¾x¹}¹Î»¾½ú¿ÄÉÎ ÑÖà«ì¹õ>÷ ô=ó™ù¿ ¶ú ü ü , ÎÉ™ü•÷’ñÖîbòAù ýØøï–èsè7íÕïÈìVè›çÆëúñd÷Êüµà œ“†[*F8^B˜D¤Aä@ÑFÔPZWaVóPÕK*HAC´:À/Ô$‘cQ úøú8øÒî„àuԘϜÏR͵Åмط>¸ËºÕ¼(¿DÃÊÈ3Í Ð"Õ^ßì3õ–ösóñò’ùÿa 9 o ¬ ø ÍÝ­ü—÷‚ñëî¾òËùýƒù[ð­ééé½î,ñî—é&é¨í ôùÿþòð ˜oI A,4:DF C=B7HüQñWnV¹P€KÒGÊB :î.×#cê žêøßö^ø}öîìªÞäÒ+ÎCÎÅËôûj¶·Ó¹ø»a¾ÂÈbÌÏBÔ¬Þë±ôûõÝòžò~ùÙ h‰ è \ è ë ÏöËü¡÷}ñïó`ú(þú$ñÈê`ëNðòMïäê´ê‡ïö¼û52#›J%".<ÌEzGVD†CuISuXiVhP KWG3BD9.É"%d Ûÿ ÷*õ°öÊôëÑÜSÑÞÌúÌIÊ@Âr¹µæµß¸»¢½éÁbÇ•Ë(ÎeÓÞìêô`õFòMòqù¸ª Î Þ k  ¸ Ú Ú üüº÷šñ$ï•óûÖþÊú òùëôì÷ñô ðEìRìuñ5øçýyz \šü#õ/ð=jGÆH‰E×D«JøSÒX:VõO†JÅF~A^8ý,®!×Ï þPõsóòôó%éõÚÉÏË¥ËÓÈÀη¨³Ñ´ò·Kºç¼FÁµÆÂÊ=ÍÒ_Ý`ê\ó¥ô­ñòiù : + 4 ï Ñ • Í íO3ýá÷ÉñˆïôËû•ÿ‡ûóKí’î²óõòÇíóígóVú¼Á ˜êÇ%Å1«?ùHJŸFÿEÎKÓT!YûUgOßI F·@j7å+z q, 0ütó°ñ-óñFçÙ9ÎTÊXÊTÇõ¾7¶M²½³ ·„¹6¼©ÀÆÊt̺ÑÁÜÛéÄòýó+ñªñWù‹à ™ š x ’ y Ê „týøòôï´ô–ül`üô½î:ðzõ4÷‰óYïÀï\õzüQ ¼™¶ ‡'ƒ3BAtJ,K›GýF¿LfU[Y©UÂNI5EÈ?`6¸*0úxIú†ñâïfñ4ïSåHצÌÉÉÜÅg½©´ú°¯²+¶Å¸‹»ÀyÅJɳËÑ&Ü`é=òdóµðgñ?ùx    ] i Ò 1ÆÀýSøCòeð`õjý_Qý3õ>ðòW÷êøõûð™ñc÷¤þ‰G Rât"5)15ÉB¥K=LwHØGŠMÎU?Y1UÿM@HBD¯>65w)Ùu·pø‹ïî ïSíeã‰ÕËÂÇÎÇiÄã»1³³¯¬±Pµ ¸óºƒ¿åÄ–È÷ÊzЧÛôè¾ñÑòLðSñ@ùpB ’ œ ½ 9 e å eþžø“òêð"ö@þWMþ_öÍñàó"ù¬ú´ö¥òyórùËÄŠ ‘üj %$Ô*Ï6;D¿LM/I’H6NVY’TMFG8C…=ð3!(mâð—öÄí?ìâí{ëáÕĮݮ ÃnºÜ±q®°°‚´Y·^ºü¾XÄìÇ@ÊßÏ*Û‚èLñJòãï5ñQùw " * p  k  žnnþõøîòtñêö&ÿ6bÿ™÷\ó¶õ÷ú`ü]øRôUõ}ûðýÈËF"Ý%Y,P8˜EÎMÖMÛI I·NRV´XÛS%L/FBI<š2¼&ôK(¸ôøë~ê0ì¼é²ß.ÒQÈNÅwÅÂÁ ¹’°_­½¯½³°¶Ð¹~¾ÎÃJljÉ>ϪÚèàðÊñwï ñYù^Þ ¹ ¼' í i $ ÞÏ×þWùPóòÃ÷&6oÛøóô˜÷Ýüþ úö5÷Žý3 )$€'ë-¾9èFÌNNjJŸIOoVLXSKEã@ý:11I%w³ YÌò"êÇè…êèì݇ÐýÆ7ÄhĆÀ­·J¯R¬ß®³ ¶E¹¾HæÆËȘÎ/Ú‘çMðLñïâðdùO Q QéÙ k N .CUÿËùáó¡ò´øEQ:ú”ö‹ùÕþàÿ»ûº÷ù§ÿCh E84!Ø% )h/!;'H²O OÕJJlOpVÅWRõIÒC£?¢9½/Ì#ñ þÚðMèçÊè]æ'ÜæÎ´Å)Ã>ÃL¿Q¶ ®P« ®F²jµÁ¸”½¾Â÷ÅÈ÷ͼÙ"ç½ï·ð™î¿ðuù@9 å ë²Ì u { ‹ÅàÿOú„ô†ó¶ùs|Ä·û[ø‰ûÖ³~ýùû¾m œ‚f5#‹'„*Î0i<;I‚P‚O(KmJ OXV,W Q¼HˆBB>:8=.E"bU ¦üåîpæZåç†äsÚPÍiľµÐ¬Mª7­Ž±Ò´C¸&½AÂYÅtÇTÍGÙ½æAï7ðFî–ð‚ù:ö „ ’È ¶ õRzãú1õsôÑú¹Æ@ýAú“ýè—Hÿ€ûýØ™ ̶‰!%0)ä+2“=J4QÜOUKšJ°OúU}VêOiG&AÍ<³6°,³ ËŸÆúêìŽä§ãjåÄâ²Ø·Ë!ÃÁ ÁƼ¿³–«O©l¬Þ°?´Ê·À¼ÊÁ»ÄÓÆØÌÛØfæÑî¸ïùíƒðšùGÀ * NUÑ µ ý mò*†ûçõlõü+ oÏþ-üºÿcý#ÿýÉ ú㢠ù&¹*%-:3¥>ïJ˜QPVKJ O‡U‘U­NöE«?F;5+,åçøë¨âûáÑãáûÖ5ÊÖÁÀÀœ»‰²kªR¨©«:°¶³_·Z¼WÁ#Ä6ÆbÌ}ØæoîFï±íŠð¹ù^˜ ÛDç ì T ð›Ý9ü¬öqöGý^— ÜiþߊòKÿ1î!¬"¿(*,R.G4›?¥KèQPBKˆJrOõT€TWMuD">²9g3c)tŒ,÷:éùàOà:âjßUÕÒȳÀ¿¿vºb±q©c§ëª–¯-³÷¶þ»ëÀÚÅéË ØÆåîßîuí—ðâùwr “Û9ø '±  R›÷üw÷y÷þ¶à W - p Î3>> <¬${*-‚/65w@DL'RP'KTJ*ORTaSìKæBŠ<8´1¬'Ííy0õcçNß¹Þ·àÖݾÓuÇ®¿0¾*¾c¹C°z¨ ¦5ªø®¤²¶¢»zÀûÂúÄnËÆ×dåÀíyî2ížðúu\ U­7 b  oÈýQøøêÿ, E É µ>N ] ¯EW I$ š&$,Õ.Ž0*6;AÑLMRåOèJ JÇNžS4RmJOAÝ:f6÷/ì% HÇVó‰å¦Ý9Ý@ßWÜ.Òƨ¾\½[½e¸2¯ˆ§à¥©d®%²*¶J»ÀeÂVÄóÊv×åBíîçìð:ú4 ‚9:  ‘ Æ ñP©þ_ù³ù[º ÃN w v} \  Dk&Q!"r(µ-0€17âADM]RO„J«IBNØRýPäH¨?09³4:.,$k˜ ñ³ãýÛ¸ÛºÝäڱпн„¼q¼{·/®¦"¥í¨Ö­®±Éµóº™¿ÞÁ¿ÃyÊ&×Áä×ìªíì–ð`ú ödFm î z Ñ@œÿ|úûÔU Ué P­ ¬`˜ C y*I $5*5/#1W2¸7jBŠMTR?O J2I MöQ¯OMGù=z7è2p,c"¶í Iþ©ïÙáTÚ;Ú9ÜEÙ:Ïuä¼´»…»v¶3­À¥p¤R¨D­:±tµ¬º7¿YÁKÃÊâÖ}ätìLíyìŸð”ú¤òÔXbª D‘B Ê C—žûülò†0 Pù çe " h ƒ!0 è%æ+‘023L8ØBšM"R·NkIžHìLÔPMNE6<¶51*” G ŽüÖíÿß±ØÐØÏڸ׷Í'¯»öº³º}µA¬ã¤Ä£¿§½¬Î°$µhºØ¾ÕÀÔ½ɫÖLäìïì]ì¾ðØúÒé¾g†ø ¯, Ê V£Íüùý¾¤. ‚ J3w…& { … "¬'u-À1î23º8#CŒM¡QN¥HâGL£OÀLâCb:à3./¡(ÅLŸÖúì]Þ×p×uÙ@ÖJÌüÀ»º=ºñ¹™´g«¤£+§:¬i°Ü´$º}¾WÀaÂzÉ{Ö"äÒëžìCìïðûõ¼ƒÇV .Úÿ Ö p þ{ÿÊh`æõ ® –Z’|! ~vêÒ#T)é.Ý2®3þ39JCdMQDM½GG)KhN&KB82Q-½&ð“ù,ùYêÃÜ«ÕÖ(ØàÔðÊã¿Ü¹Ž¹C¹É³•ªg£b¢ ¦¿«°´Û¹.¾ç¿òÁ0ÉEÖîã“ëRì&ìñfûZ Á¢ ¹ ¾“îñ — ñLÿü~ ôŸÙÞè„‘iuZ©|%ã*H0â3R4o419ZC%MiP`LÛFF6J M|IH@¡6(0r+×$çg‘÷©è/ÛVÔÓÔìÖ‚Ó—ÉÙ¾2¹û¸ž¸ö²Ä©Å¢è¡¦@«˜¯C´™¹Ñ½j¿zÁëÈÖ¥ãFëþëìZñÂû~" ÃÊi (JZó$Ñ /›’N ÞŽH¼HµƒNñb0T! 'W,Š1Æ4Î4¹4e9XCÔL¦O_KéE0EÇ4G.–)ö"Q@Õöç£Ù Ó¦Ó¶Õ7ÒGÈͽ‚¸n¸ ¸1²÷¨¢e¡˜¥Ãª/¯õ³Q¹k½í¾ÿÀ£ÈöÕeãÙê­ëôë’ñ ü³2 ×ýÊ ¥á2 g ƒ&1) ¶A¹J£í€;Í7îè"‚(¯-¯2‘525ä4x94CnLÖNLJÚD8D)H„JFˆ<è2o,º'!ˆš EoôeåؾÑ~ÒwÔüÐÇȼѷâ·_·|±3¨w¡à ¥HªÈ®§³¹½¾‰ÀXÈÒÕ3ãêdëÕëÅñüûO û:; 8'¶ ê¹¢ ÍÁ†ÿ- »ýŸk$Ü)ä.¬3H6€5î4c9ìBâKõMI¥CCøF1IiDŸ:þ0’*Ù%B¾ð ·ÿâòÕã’ÖoÐZÑGÓªÏÍž»·\·Á¶À°o§Í ] £¤Ï©`®Z³Ñ¸Æ¼ ¾AÀÈ·Õã;ê&ëÕëþññüW 2Ž¿ áPWöa WàœÞ™ÉÙbm!xø™Ô<Ô%+þ/‰4Í6¥5Ò409‹BKíLÓG]BòAºE“GœB£8 /°(î#[÷U 9þ]ñPâÕ/ÏGÐ ÒWΑļºx¶ä¶$¶ø¯°¦& ßŸ.¤Z©®³ ¸|¼º½ú¿þdzÕÿâûéïêôëdò~ýù rT š#¡’~à þÍ “³aÏ-¿®#e!¿b’ #'=,ÿ0L5)7¤54Ü8B;JŸKhFú@µ@pDñE¯@6 -Ç&"n3ÀÃüæïØàÍÓóÍ=Ï ÑÍbÃÙ¹Õµs¶–µ?¯¦ˆŸ_Ÿ¼£ê¨«­â²w¸?¼b½¶¿ìÇ®ÕøâËéÄêìÜòþG ÈŠ j ô n ª¶ r!2Ñq"½%P#w2/"V(E-Ý1î5n7‘504b8pAGIGJíD{?Z?CODÀ>™4 +Þ$# ’t.Sû|îoßÒìÌ@ÎÐóËH ¹Fµ¶µš®_¥ ŸàžS£†¨Y­©²E¸ ¼½t¿ØÇ©Õìâ©éŸê1ìKó¢þáu *  à A FO˜T _ M# Ç©Y$Ï'!%¢¶†#n)0.š2p6˜7b5Ö3Ç7¼@GHæH_Cû=é=³AµBÙ<—2 )ø"OÄÀ¤ñù!íÞXÑñËVÍÏâÊ6Á?¸Î´·µ¶´þ­¼¤ž†žò¢(¨ ­q²¸Ë»¼¼-¿ÄǪÕÌâŠé~êRìÆó?ÿXè “ ª Œ %¾%3­ +V"%Í!¼æ £&Ö)Û&² #Á$i*û.=3Ö6œ75X367÷?0GlGÁA…<ŒÍácö ˆKW$Ü& #Ì ##î(Ú+Š(@"z å%I+§/½3$7Œ7—4º2‡6? FâE@û:1;ï>o?ñ8ˆ.5%J¼@y ¹?÷…êkÛüÎÊ¡Ë,ÍÎÈ%¿Á¶ü³ µÎ³É¬v£™ÖB¢t§u¬²Á·I»!¼›¾œÇºÕŸâéIê¤ìÚô£t ¿ ƒ ñ D7 À{›%å§na&±(r%Ü"_%7+á-4*º#ü²!ò&,804A7d7 4þ1·5 >ÂDMDO>W9¾9s=Ý= 7€,F#{ù“æ OôõAé.ÚÔÍ,ÉÖÊB̹Ç%¾þµ’³Ä´^³2¬Ñ¢{ó¡$§2¬ã±¡·»æ»ƒ¾ˆÇÎÕ¡âðè>êçìhõn* M  ¨ 55hcM:dìÑÉ–|(‘*B'à$'x-ã/Ï+%K!æ"â'½,¦0X4;7 7^31Å4ð¥84,5á8z81g&,Øž fcüpòÍåãÖÿÊËÆÁÈÚÉÑÄ~»+´š².´E²‰ª8¡Í›œ¡N¦Œ«±a·®º@»9¾ÌÇ+ÖØâÆèXêî¬÷° H5 gwÒVÈ I"–"àg¡5&j.0”,À*.·3/50™(‚$Ä%ù).C1f4‹6M5¾0ï-R1&9ˆ>ï<°6J2”3e7Ë6+/s$žu> ,ûgñÌääÕ(Ê,Æ+È7Éü캣³b²´² ª³ q›Fœá ¦]«h±K·‹º »¾ÛÇKÖÕâÈèiê‰îø} ý d¨¼Z"${$Å!WUF(h0Â1V.š,-0³5Ä6A1Ž)P%w&m**.7124 6‰4¬/Ã,0Ä7á<û:·4–02ï559-„"àÒ±– ¥ú`ðÖãéÔVɒŕLjÈ)Ãݹ#³2²à³Á±‰©1 ›œ¦ Ò¥-«R±;·cº×ºñ½îÇtÖÝâ¸è‚êï`ùZÛÕpçq&!ô#Ü%j&´#P¸x {*k2„30€..2¡7M8a2{* & 'Ä*9.1Ú35¯3ƒ.+É.J63;ÿ8²2Ò.Ž0{4s3X+ž #7.# Uâø\ïàâøÓ‹ÈþÄ ÇÉÇ]¹ž²ÿ±¸³b±©¯Ÿ¿šÚ›r œ¥«>±.·Cº¸ºÐ½È¥Öòâ´è¯êwïKú/V¸¾€0Ö "”%²'b(­%L ÞÀ"»,v4D5Ä1^0%4‰9Ì9k3E+»&'+0.Ì0f3ë4À2A-*e-º4m9û6Ÿ0-/õ2å1)»g¥° ÃÎ÷fîñáÓÂÇpÄŽÆÇ‚Á@¸²Ì±›³±˜¨#ŸXš›B m¥Üª-±'·,ºžºâ½ÈâÖãÂèèêðAû_k¨¿Ÿ…L*$A'‰)g*°'J"þ%ñ.„67f3'2 6Y;5;W4í+J'è'!+.i0×24«1ã+¥(ë+3~7î4‡..+-m1 0ª'Þº$> hãþÍö…íáOÒÇèÃÆyƲÀŽ·”±¤±~³º°¨«žý™m› <¥¼ª$±*·º‡ºø½\È/×Pãàè9ëÕðZüž „ ÑïôÓ À%ù(n+d,¹)I$"A'1s8¯8û4à3Ü7å{=Ö5à,ý'F(í*I-E/`112(/)z%É(Ç/œ3ª0l*ƒ'n*o.¿,$X~@ † ܪü÷ôíë…ßêÐ Æ ÃGÅUÅ9¿E¶Ú°V±\³=°M§øx™›ÀŸê¤Šª±-· ºkº+¾íÈÆ×âãTéþëgò£þ& â*¢ì÷#)Ž,K/\0°-D(:&›+<5ú;É;Ý7ì6 ;­?e>c6-(<(¥*Á,‹.~01Î-'ø##'.µ1‘.j(Â%ì( -5+f"¹õå F³§ûô;ëÔÞBÐ’Å»ÂèÄÛÄŠ¾¡µ€°;±W³°í¦œD™åš›ŸÆ¤uª±*·º]ºB¾:ÉØäžénì?óÝÿs ;e ~”%È*c.F1f2®/O*;(·-E7²=4=?9N8†<î@/?Ì6L-((A*,µ-‰/ú/e,è%e"Ž%i,Ì/y,p&!$‚'²+ª)º %—¡ •¬úMóƒê+Þ›ÏÅe€ÄRÄݽµ-°'±2³Þ¯Š¦A™ÏšŸ¥¤bª±2·û¹[º[¾É„Øhäêéêì%ô%ÒxL«‚ ?'‚,@0H3v4±1W,e*Ä/C9c?™>“:®9ã=Bè? 7m-ü'Ö'Á)Z+É,v.Ç.î*@$¼ é#¦*ë-i*t$t"&^*5(˜6 ` ò†ÀùˆòÍé}ÝóÎ‘Ä ÂĸÃ8½d´Ó¯±³“¯2¦çœÜ˜²šeŸŽ¤Yª)±A·ü¹qº{¾êÉýØÏäQê“íõ|HÔš þ¿!ö(K.&2S5‹6³3X.ƒ,æ1C;Að?Î;û:&?/CŒ@Y7l-Ý't'()†*Ê+M-i-b)‚";"×(ü+V(r"Á ¦$ë(Î&Ù &φÿáøÌñ éÏÜSÎĹÁËÃ0üÁ³u¯ö°³R¯Þ¥Šœ¥˜œšWŸ†¤]ªA±^· º‘º×¾VÊÙRåÌêKî'öàÔE÷}†n#¸*04Q7£8´5M0.ù3)=¹B5Aí<%7DbBò=5=LAÎDxAb7-<'}&«'‘(‚)É**&å^Â9%í'+$pfà!&&¹#zF ä«ý8÷xðóç›ÛQÍCÃÁ3Ã;ÂR»Ê²á®Ý°ï²à®A¥œK˜ƒšIŸ|¤zªŒ±Ê·Yºðº¡¿}ËÕÚæöëêïšøæNÒ†èó&R.Â3ä7Y;§<§94m2à7¢@…EvCÕ>>.BaE™A<7œ,¹&Ó%Ä&u'D(t))X$}üo#ô%"’»‹ Þ$M"´Í¨¤ütöàïmçÛÔÌøÂßÀøÂÑÁ½ºO²°®Ù°ù²¼®þ¤à›C˜yšJŸ†¤™ª½±ü·Žº(»À"ÌÛ>ç¢ìÅðÛùx±øV™!º(0¢5×9[= >†;ë5@4¹9JBÄF]D?à>ïBÛE¢Aô6,& %É%L&ú&(u'—"OË:±! $ »0C®#ü ¢m ÔÆ¸Ìû¼õCïòæŠÚY̪±ÀºÂuÁ/ºÒ±x®Ò° ³¢®¾¤¬›7˜…šUŸ–¤»ªó±1¸Çºi»€ÀÏÌ=Üâç[í©ñ$û T~ã©T#Ž*ó17È;\?›@f=Í76{;ÝCòG4EM@ƒ?’C8FAŽ6r+M%-$¸$ %™%œ&ã%Õ }…õ'"ð½‡"±I4 ËÒ×ÿúú õ¯îhæ ÚáË\Â}Àk Á¦¹]±H®Í°ç²‚®~¤›1˜’š`Ÿ¦¤ãª4²s¸»º»ûÀƒÍÝ•èî›ò{üº ÿ !z!L!%f,Ê3a9À=gAšBD?¥9é7,=_EIúEù@%@D{FbA6×*x$3#Œ#µ#-$%K$ ŸJÎ*M *)LÊf!x Èãüþ5úiô+îäåŒÙhË ÂJÀ$ÂŽÀ#¹è°®Ç°Ï²H®G¤T›'˜œšmŸ¿¤«€²Á¸O»-¼}ÁDÎÜÝbéøî¾óÚýn À³"$##ã&C.§5F;º?tC—DAk;¶9Ú>ÑFJ¤FA­@D§F"A5*Ÿ#"H"M"±"€#"5¶zUj;bÙ’$ SÊå Éú"þ~ùÓó­ígå ÙùʸÁÀèÁÀœ¸k°Ú­Ã°Ã²®¤$›˜¦šŸè¤S«Õ²¹¨»®¼FÂÏÐÞGêåïòô_ÿ6w$â$Ú$¹()076=µAjEFåB =l;s@HK6GçA A¼DµFÊ@Ð49)¢"ö ó Õ "!Ù!¿ PßP‡uR™d`÷žÈÔ"XýÎø@ó3íô䙨¨ÊbÁê¿¶ÁÁ¿)¸°š­¿°Â²÷­ð£›˜¹š¡Ÿ¥—«0³‡¹¼:½ ÃÐ×ßHëèð2ö÷M&©&´&­* 2ƒ9%?¨CVGdH§D½>ÿ<èAAIéK¯G,BEAÔDoFS@û38(‹!½ŠHƒ* ïcÒ½ÁtÝ@ØÞz¸îZÿ˜ü#øºòÊìä-ØYÊIÁÀ¿Ák¿½·Õ¯ˆ­Í°Æ²Ö­Ì£› ˜ÑšÂŸG¥ç«–³ºŒ¼Ë½ÞÃÑßàYìùñ÷¡á‚!&(u(–(§,4o; A—E@I'JGF;@t>ACGJ{LHNBbAÑDF‘? 3 '^ k¨ÙyröÞ × º¢O§0̼hÆþâûƒ÷>òpì6äÆ× Ê0Á¶¿qÁ¿Q·Ž¯‚­Þ°Ø²À­°£›2˜îšèŸ€¥B¬´sº ½e¾»ÄÒèáhíóÒøLÀO# *I*w*š.6O=óBGKÙKËG©AÐ?D1KïL'HFBVA¬DšEÀ>2ì%~ /ÂLˆ#= *aôàÒp0Ú¹nïKêý=ûööÌñìáãg×ÁÉÁ©¿FÁؾë¶D¯p­â°î²º­£ ›R˜› Ë¥ª¬´ìº—½¿ Å'Óÿâpî6ô)úõ¡-%Ý+(,Y,ˆ0î7/?ÓD_IêL}MDICA˜EýKRM;H®!­±Ü²…­Š£6›ð˜œM¡d§Ä®·œ½vÀªÂÊØ,èióxù^3 ¥=-…3Ø3(4I8€?hFÖK>PgSRS@NGDEäHëM¾MKGÑ@~? BØA“9Æ+-Ó2"m‡ò1A kv Êë Ù ¹—mS C&ýòúkøˆôâïdê(âÂՕȆÀ^¿ŠÀY½:µ®­5±³’­ž£o›)™iœ¶¡æ§h¯Ä·¾cÁ»ÃQˆٚéÝôéú¬ f/”5Ñ5!6>:WA#HsMÄQÈTyTBA³@18J*š6ZžÀ2jz …oý I  µ ýÞª© °œüpúê÷ôŽï*êêá~ÕrÈ”Àk¿~À½ñ´û­9­X±#³ ­½£¸›™Ãœ"¢u¨"°˜¸Y¿WÂ×Ä®ÌÛþêDö]ü²¸"K1“7Â78(<C»IûN;SV„UP I„FÁINòL FD?ì=R@w?³6¿(ùÅÕ{ªºóž¨ Ô "¨F \>ú 3üõùp÷±ó@ïäé¹áFÕUÈ¡Ày¿fÀí¼¬´Ý­P­y±S³¾­á£ÿ›ø™8¢¢©í°|¹DÀ^ÃÆ΄Üsì¥÷Úýb Í$H3{9²9ý9ÿ=ÌDGKpP™TLW{VÌP·IïFüIáMiLCEm>ó35+'PÎþ½ DÊö c»þKY t Ï™€¼³_u ¶ªû~ùüöNóõî¡éuáÕ4ȦÀ†¿HÀ¼¼k´¹­_­š±^³ê­ ¤Iœcš·5£Ê©È±tºGÁwÄ;ÇuÏÞúíùlÿ ýè&U5l;£;Ú;Ë?wFÇLÐQãUoXaWtQAJbGJ±MÑKdD~=ò;4>ë<­3Š%¯ 6ï C ˆ  P [Õþ\ýþ% „н:Öè;>û ùöîò¬îdé4áÞÔȨÀ”¿5À}¼)´Ž­j­Ä±{³®<¤”œÒšBž×£Šª®²z»]¢şÈâУߑï¢úàï )n7e=•=¼=AH:NS W|Y0XR¬J´G%JjM KgCn<Þ:=›;2Þ#]i  z Ì V — ¸Nýü¼­Õ@€þ”YeÈÿÕú ø$ö—òjî,éùà²ÔüǰÀ¦¿#ÀA¼õ³c­z­õ±¥³)®¤êœM›Ùž‰¤b«¥³Ž¼’à ÇdÊÓ×áÞñõü€² ý<,:W@h@p@îCJÐO@T¸W›YØWQCIÛEµGGJdG ?Ü76ë7F6q,ý[ MñYÂ]¨öýÇ÷ÓöÅûËØÿþ›† ÔáWþŒùª÷‚õWòšîÊéýá0ÖÊEÃÄ¡ÃÀN¸l²³>¸gºdµ]¬\¥N¤q¨®®¶á¾BÈ‘Ï=Ó×Ö®ßvîOþ JC=%è6tD0I+HGFIúMRðTÖV+WâS¾K¤B>°>ä?á;ª2Æ*›(*ë'|´Aû|ø|÷W÷LøuùFø8óÇí£í[óþùèû‰ù ù@ÿ 'î :ÆýúÕøS÷Çô©ñiíæÚåÎZÈÀÇcȌĹ¼· ¸€½ð¿@»¹²V¬Ã«°T·V¿¶È‘ÒTÚQÞTâë~ú? âôÝ"®0ÎA¹NˆR˜PN¨OSÊUBWÓW·VÙQAHÏ=é7ñ6V6×0Ó&|Ý­¨šmõfî×ë*ëŸëVí#ïzî9êæåæmíŽô3÷ö ÷µý_  €*þøúúÎøôö¨ôîð–éDÞ÷ÒxÌ˧Ê?Æß¾ºP»ÀÌÁq½3¶±×°µÉ»?ÄbμØÄàtå”ê¬ô”¶S$$Ï,*:TITÐÿOý•öóë›áFÛhØ}ÕÐÏÉöŹÇ:ËÔËÈÏÂR¿¿øÁÇÐÒÚ`åíøñ˜÷Ð;×#C*Ì2Ç>§JÚQ'S7QøNœMÞLLLPLVLÜI©Bc7,0$6–öQÕ´þ´ýRùªðˆæÖÝÜ×µÔÔˆÖOÛåߟá„à}à¼äMìMóÖöÇøJý>T ?â4 Ìzð׺ݷû†ðAæÓßsÜÌØ¿Ò>Ì“É|˔ξÎ-˔ƼÙÃ#ÆSËÄÓÃÞqéñúõ¶û{VF&¡,5p@(K"QÊQÑO¢MúKœJyI;I,I£F?J3“'5~ uIú)øËöò±éPàhØÐÒ’ÏøÎ¸Ñ ×+ÜZÞÁÝKÞãÏêÔñšõû÷îüâr Õ—{ ÅÜnzÀuÄ\ý óðè•âßFÛSÕaÏC͘ϲÒÙÒ·ÏñËÙÉʦÌÍÑdÚ¦å‘ðRøBýÁ )O$ç+î1 :ŸD/NíRÆRmPòM·K~IƒG¦FFCÿ:­.ƒ"¯jŽ Vúrô¸òmñ÷ì åŠÜ‹ÕÐ’ÍÍFÐ Ö¯Û0ÞîÝÀÞªãPëïñbõ¤÷{ü¿ T Ä ÄP… Š˜,áû¬ñ¾çTá±Ý†ÙsÓÙÍCÌíÎ+ÒxÒÞÏ÷̳ËxÌ;ÏÔuÝélô`üxy 'Ž.64 <FÜNàR^RPÍM‘K#IGAFùE)CT;J/f#»O ´®ú‘õ7ôóÄîbçŠß$ÙeÔUѸÐÑÓÊÙjßéá¬ádâòæÑíKó¥õ"÷?ûÏŒ ––5Tþ‘ý7þµÿÏþ÷øGïóåößgÜ%ØÒìÌüË(ÏÇÒpÓoÑRϲΤÏ;Ò^×Bàìi÷‡ÿ³à *dÓ(».´3;µDãL‘PûOñM×K€I¼FVDœC”CA¡9*.Û"¥Xý žæúföõÒôåð(ê+ãÝÙìÕÕØÞÓãeæ>æôæë&ñ|õ°öP÷·ú²‘mí¸,þáûlù“÷¥÷Úøøpò%éJà§Ú:×ÓÍWÈÈÏ˼ϒÐûθÍθÏgÒ\×2à+ìò÷sýb ù!*Í/à4¢<*FMPüNMML>J`GƒDC©C†A_:=/K$d'¬_5ý^ù ùô÷fó€ìæMáYÝñÙxØÞÚ¡àFæè7èÈè ì"ò¬õ8öšööùŠÿiþÇÿµü±ú¸øöàóßóiõõðKçßÚñÖæÒLÍEÉçÉ9Î4ÒÓ¨ÑÑFÒSÔêÖfÛæã¬ï;ûvÂ× †"â*0Ÿ4<&ELHN MFKäIÕGD;AÒ?Ü?Î=ä6,!ÞÔ{ ^vûÜ÷¼÷äö›òìæœáÏÝWÚ¬ØÖÚ]àÛåýçiçÈçLëVðó´óèó3÷¹üªgoý¶úù>÷°ô€ò›ò`ôhôâï²çàœÛëØDÕÐsÌ{ÍÒEÖQ×RÖ+Ö´×úÙ›Üñàéô„ÿÖ MÖ“#0+´/Ø3±:RC´IxKJ,HÓFÊD{A>¯<¶<¯:Ù3])FwŽ çyû>øHøŒ÷\óí„ç„ã#àöÜrÛŸÝëâéçŒéqènè™ë7ð ó óó8öoûùþ|þcûÁøE÷¶õQó0ñUñóíòDî)æ¾ÞÚذÔÑÏfÌ®ÍiÒ”Ö­×éÖ×Ù Û‡ÞãKë ö\‹ç  A#V*{.k29pAŠGI•GÑEŒD Bs?K<;c;¸9$3ü(8:Á$ åúü6úúú;öLðë-çÚã´àBßˆáØæªë íœëëí7ñ=óºòmòHõ1úrý×üÃù÷:õGóœðcîîhð`ðÔëèã‰Ü>Ø¥Õ6ÒÍ­ÊDÌ]ÑÛÕa×!ץ׫ÙHÜ>ß ä–ì2øR ¥•ª#**ù-Ê1T8‡@F"HÊFE˜CQAÔ=™:Ž9:v832U(è¡ {ýû±ûxûø ò¾íûéƒæ8ãÀá9ä¯éuî°ï%î_íOïBò‚óòãñ„ôùôû6ûGø¥õ»óbñKîÜëùëàíÍí9ésáNÚÖHÓ¾ÏNËÀÈ¢ÊÆÏBÔüÕIÖs×æÙ°ÜÁßÐäÊíÀùí4 ¦°!%;+Ú.¼2H90AÛFIH"GÆEiDðA%>·:¨9:_8ý12(ñ9¥þ 'óýÇû'ümû¸÷vòîŸêNçäÌâå1ëøïñ˜ïÛî¯ðJó0ôó§ò=õ„ùáûÐú÷÷—õÈó?ñÔí&ëëÍìpìç¼ß·ØqÔ—ÑüͽɕǹɺÎëÒƒÔÕÛÖÚÙÝxàüå|ïÖû&::'-ƒ0r4í:eBdGhHGÔEtDÂA£=â9Ÿ8Ñ8Ç60N&p¾ S_üqú¿ú¾ùôõñ&ígê¤çôä?ä†çÃíÞò0ôîòwòQôÈö{÷Zöÿõ‚øaüþqüUùâöíô òîÜêXêë¿êXå4ÝֹѴÎÿÊÌÆåÄ:Ç!ÌЉÑWÒ’ÔØÃÛ}ßRå-ïËû,‘=læ&o,æ/é3y:ÎAyF8GëEÐD¦CAÎ<Ò8O7c7F5 .÷$õoÔ0 ¿/ü…ú ûú;ö‚ñîáë©ébçç§êAñ´ö8ø÷½ö„øÅú,ûÕùgùØûÿÌ–þþú.øßõŒòëíøéÐè€éDè â;ÚýÒ„ÎTË~ÇFÃŒÁ(Ä7É&ÍšÎÏÒÖ Ú-Þ<äƒîœûWí•Çê%'T,/{3":mAÕEFF×D¿C Bæ?{;t76e6U4Ž-ß# Ã_Í€IüûÈûÌúûözòxï¿íàëÞéíé'îBõûqüHûûáüíþêþ$ý˜üÿt¥žü˜ù÷aóSî!êýè«é&èâpÙ1ÒÃÍOÊèÅ3Áa¿6Â\ÇË:Ì ÍÒÏÔ3ØDÜ€âí’úSà zøkŠ&5+.2ô8}@µDÃDCíAÊ@Ü=79>5.4Ø4ì2%,©"C1v:ÿúQù“úÔù öºñïíÇë¸éúé¢îöøûŒý˜üÂüàþ¨ÂýAý)øÕÛ¢ý‹úç÷íó¤îuê­é³êRé\ãüÚ'ÔÐ[ÌaÇFÂsÀÐÃwÉeͩΧϢÒ×Û ßbå-ðÌýz ºl„"D)8-n/838:ÉA·EPEìpèKäâáŸßéÝ´Þ>ä}ìÔòáô¯ôìõ*ù¥ûSû†ùÞù"þ*ç°Gÿ ý7ûß÷9óêïð0ò’ñAì¿äçÞšÛPØ2ÓþÍ{Ì9ÐMÖZÚ¢ÛÄÜåßRä6èÛëýñ™üÄ Óñá#k*ç/82Ù25;þAªDÀBC?…<Ë9@5 /õ)(×'å$;;Í ‘þhõpìçÍæcè¼ç äàÞ~݉Ü`Û–ÜYâ×êƒñô‡ôGöäù•ütüûÛûzǃGžþŒü+ùšôWñkñcóëò÷íäæKáïÝ~ÚAÕ+ÐýÎÓ~ÙÛÝ<ßRàZãËçêë¾ïÐõ³ ˆøÚ!‘&’,j1G3¥386;<”BE½Bd>§:7 2—+-&$˜#ä ÈBÜKKúeñtè8ãRãtåhå5âdÞcÜÝÛ(ÛXÚËÛáêñôõýömúìüÃüŽûÎüÐ’¢ >*ùÿuýóùrõJòkò‚ô ôZðÛéwäëà)ݹטÒÑÙÕ|Ü*á¢â‚ã#æ0êî³ñs÷+T ÝI"t&Ù+0^1l1Ï3¶9ñ?BB©?Î:k6W2-•&.!óŸIÉä ÏUþQ÷~îÑåáuá)ä²äâŠÞ¶ÜcÜþÛÛ$ÝÒâBëiòÕõ÷)ù}üãþ¢þyýÙþðÅ ö 9·íþ_ûíöàóô?ö«öóôìÏç;äMàÁÚ’ÕœÔټ߅äæÔæ0éììŒððóIù‘An©Q"Z&G+ë.Ê/„/1<7@=]?‹þžÿ®n « 0 Ð)9ÿŸûB÷_ôÄô%÷Ù÷Ÿôï2êÇæáâ^Ý?Øl×ÜââÍçéBê‚ìðbóŠöžû„Õ¨ #ã&}+´./p.#0g5;á<Ä9V44/x*Ä$*ཕ¥À0ÿþøò&é˜à<ÜDݰàâ)àYÝðÛÑÛ¥ÛgÛ^Ý=ã¤ëæò¬öeøäú^þŸ/Òþ2N f   úÿYü+øõHößøÁùØö¹ñWí3êXæÁàÛ±Úfßlæ‰ëtíQîaðó”ö}ùeþïŬ ù#—'Ø+‚.L.-Z.3e8à9’6î0k+2&$ n9 ßO ˆmû^õî¾åkÝKÙsÚýÝÂßOÞãÛ¤Ú…ÚlÚlÚ¹ÜØâZëÀòÝöù×ûyÿÈu?´È ãÙ ´ï­òýåù÷]øû$üŸùõñ:îê%å3àWßÅã¢ê·ï½ñ§ò}ô@÷Ýùü(L c£!¹$(ô+@.¦-,ò,1Ö57†3µ-Ú'$"³Àk& ¢ Ÿ ‰ý®öÈðê{á\ÙsÕ¾ÖrÚœÜØÛ Ú?ÙeÙˆÙØÙ[Üšâëaò˜öÿø üÐÿ-óåTc Ò  l9’ÿ¼ûªù¹ú•ý×þ©üø õiòÓî~é²äýãmèJï|ô²ö·÷`ù²ûÛý+–U ÷=#ó%)z,*.-%+±+{/À3¹41*+%Øã ž á£-ìùEóDí5æ~ÝpÕÁÑJÓ4×¹Ù‡ÙBØ´×Ö×û׋ØWÛ•áÅéÎðõÛ÷:ûüþ¢¨ÿ>=Ý kþ ’ )ÿ‰ÿ@üßúUü8ÿ¶þVûxøöMòÑì!è çìÚò+ø·úüâý]½úšæn$|'à*#.`/æ-¿+,]/ù2u3Ê/Æ)h#ìûï aú,°ýÖö‚ðnêùâîÙÎÑøÍjÏ:ÓäÕ0Ö†Õ`Õ½Õ#Ö×%Ú/àÞçîÚò5ö*ú:þUöÿ:ÿ+× ‘‹   »˜ÉþÙýyÿ=’TÿýÀúìöBñtìÝëð“ö»ûFþ¸ÿmWöî šƒ 9$'^*a-2.J,Ë)×)ä,.0a0›,§&K ¶›¤ oÈ6-ÿžùóòæìç‰ßlÖYΪÊÌÐËÒaÓ.Ó}Ó2ÔØÔÖyÙÀß|çîˆò;ö­ú"ÿŽZâqNI—%•  ‹ç½„»H¨‹UOüUö+ñFð!ô ú¥þÕpï• ;€i"§$Ý'Ä*U+')|&O&0)8,-,Z(…"K¦¿­…þmûðõ’ïìé^äÝüÓÌ¢È>Ê@Î+Ñ ÒFÒôÒÙÓ†Ô»Õ ÙTßÞæVíÁñ´õŽú[ÿÎ_ p,C8 e ³À ” ¾ X ä ýÕ£hûéõ²ô-ø”ý­‡y ±F$ö t]€é!%Ù'I(ù%:#ø"¤%~(Q(†$àß…… ¶Àÿ<ý¶û©ø8óóìkçüáÚÚóÑ2ÊàÆ‰È–Ì±ÏÖÐbÑZÒlÓ!Ô5ÕaØVÞ°åì’ð™ô˜ù¡þ˜ôñ™N { DÚXªt k , \ \´oú ù à ŒJÿ¨ùö÷ û“|,;sˆ H`WD„|"U%Ñ%ƒ#©  p""%%€!9’ª íüý€ûúK÷òì°æyá ÚÒtÊ:ÇñÈ!ÍÐDÒMÓžÔÓÕwÖD×Ú§ß·æïì]ñWõPú]ÿ`ÎÀ;¾ Îuûñº9 ï € {c´r÷Û Œ >åÿ&ú<øòúØÿ³Š‹9ùž ì ·t´¥ z#$É!â/C Ì"º"XNëwËÔüOúîøOö^ñyë=æáaÚîÑoÊ?Ç÷È0ÍÔÐËÒÔ¯Õ ×¯×XØÏÚàöæ í ñ¯õµúÎÿÝZP—ï à‘Y±Ø¢§¦;!a<åÝ› Jìüúbüó¡x~xÿš%g H ªJ\X*"½"q fo:  ¾ðÊ"  0û¸øZ÷Ìôðˆê¤åËàPÚ&ÒÓʯÇXÉuÍÑLÓæÔšÖé×lØõØAÛFàßæÏì@ñkõ‘úÅÿÝcc“œ JáÒwáÔý>#;*‰j™e ¬èýÓû þdí  q Ô 3 T ù ýDò<@ú!a"þßÀ¼5é,^ Ûqþ¾ùj÷ ö{óêî›éêä à¡ÙŠÑlÊEÇäÈßÌ€ÐàÒÀÔ—ÖÚ×@Ø¿ØÛàß>æì~ðØô!úfÿ#T›€ ’º¹o—ë[j’%DU «ñÿ¿ý¤ÿ“øâ  9 _ { Y ¯ d2œG!œ!;ËÒ,‚TÒÝ4 ¯Býøö²ô8òâíßècä½ßXÙjÑuÊUÇ´È…ÌМҬԛÖÐ× ØWØbÚóÞåÅêOïÑó9ù‹þÍ‘ìH ‘A³mác€¬œ6žûvSÝ5Ä€ÉÊ "  (  ý ‰ “ýàÛÛg!•!ìh',N#Âã5 ¤6üw÷õô€óÿðÂìêç‹ãôޑضÐáÉËÆȪË7ÏÝÑ"Ô.Öiל×ä×ìÙnÞrä$êËîóùyþη-‹; }0Óz¹1»He{J×b÷œ‰O+ ƒ3¾;g €  % Õ : 9ü¤"2º!Õ!QaÂviEB‘û¿öôvòêïÆë!ççâZÞ Ø9ÐqÉNÆWǾÊ6ÎòÐbÓŠÕÆÖïÖ!× ÙbÝ8ãÚèœíyò#ø…ý×ÛiËb ‚6ÿyÒÁíЀ>ø˜j*+ ¾mîR| ³ ]‚‚S ^ úÊ~ýëI">"°r¤·Ö¨u¸ ’2ûqöÊó*ò»ï¶ë&çââ5ÞÜ×#Ð}ÉiÆYÇ“Ê÷Í»Ð7ÓXÕzÖ†Ö”ÖYØ‚Ü.â»çˆìpñ÷dü«ÿ¾cÊKF îìÅ–yiÆó°•mi?_ "ùkÁá +ø59û¯ë_1±D»– ¼"~"³NW,GØ „ß QÚ‘úëõMó¡ñ,ïNëÿæûâtÞ1ؘÐÊÇùÇË>ÎÿЌӱռ֪֡Ö?Ø9Üžáææ’ëvðöEûcþfÿiÌ 8bÖËÃÈçvÊ»~Ðñ#t {zÖÿ  urÿkS¬@…ìGó Ì"K"`çÍTˆm…÷ ^Üÿšùõòßðjî­êæ²â6ÞØŸÐMÊkÇ5ÈË<Î'ÑêÓÖîÖ§ÖÖ5Ø)Ü{á«æUëDðÕõ×úÈýÅþÿé Í qà¦Â²¤ÓŒþúÈõežÉÐ@ y”×Î Ô bà­(»øH¸×1†!°"ò!ô{U¯;¤Ã³ ‰ÿ[ùïô‚òÕðdîÅêÒæ ã…ÞHØûÐØÊïÇ¡ÈJË\ÎXÑ6Ô`ÖרփÖ'ØÜ(á4æÒêÀï6õ úÏüÊý·þ/Uá VL>„a䨴ÿžó+È E “Ö­ ªX¯Ç/¹û8xf©îY!­"ª!“ó#tÀóx hÕþ»øhôÿñHðÐíHê|æÈâ>Þû×ÊÐÝÊÈŸÈ Ë!Î1Ñ*ÔVÖóÖkÖFÖõ×ÃÛÆà·åTêQïÁôuù+ü%ý(þ¨µ% Ó  Ü1)%…ƒ ïÁ+ôgš»ˆ4  Õ fäHëIâ'Yp6k®"'#ø!Ó_4yÑ~* gÌþÀø{ôüñðƒíøé:æ†âõݨׇдÊèÇ?È…Ês͓ЛӶÕ:Ö£ÕŠÕL×ÛðßÉäké{îîóŽø>ûNükýóÿæ=ý rßÚç`{Î’šÝî k ’ 3 1%Ã"¬ýŸã÷ß«ò?"H#"Ût!öö=¼“U ™ÿùæôZòYð§í"ê}æÓâ;Þö×ãÐ#ËOÈwÈ~ÊJÍiÐoÓoÕÉÕÕøÔ³ÖXÚß¼ãbèíó§÷Tú|û³üGÿ+rE ‡6È×§ÙdÊfQ¬þ-= à ã mhr"}ã²ëËmÐã' ]"C#Â!{š<Mìèµ únþ–øyôÞñ¯ïáìcéàåPâ¶Ýp×jÐÅÊÿÇÈôɳÌçÏÓ÷Ô3ÕrÔOÔÖ°Ù7ÞÓâ‚çÌì^òåöuù”úÑûgþ=v^ Ü Ò‰¥å¶ Ÿ?î­…ä2p  & §©Õ£W|e7¯ñe!¤#o$Ù"{š%ÝÞÔ nÿ™ùƒõÑòkðmíâéiæÒâÞ’×gШÊÉǤÇ>ÉÄËÚÎÞѡӗӠÒfÒÔ–×íÛeàå‚ê)ð¢ô÷:ø—ùGü0v†Q —Ñ5>Ѓ0ôí©çŽtëÀ ÙLSŸŒë((³âª«¥"0$Ë$#ƒŽþ“×Ë13 uãÿú öRóÌð¹íBêöæã¼Þ1ØÑ>ËHÈåÇ)ÉqËyΊÑ@Ó ÓâчÑÓRÖ]ÚžÞPãÔèîöòUõ~öøÎú°þæ # σ @û¸]+]h؆Ž;2:xhÏèYˆséöI ­"G$®$¯",ÂY¦5Põ# ~ húnöóãð·í`êJçåãøÞ<ØÑVËNÈÁÇÀÈÝÊåÍ ÑÍÒ„ÒNÑëÐVÒCÕêØíܨá\ç-í—ñãóõÓö¿ùýŸ¿ •Ai"¥qÖ3ڒ¦¾׷@![OúÅ#o ù"*%u%U#Ô~9WbŠ]§ ¬û÷ ôýðí+ê#ç¾ã¥Þµ×lÐÁÊ­Çׯ‰ÇqÉrÌ¥ÏsÑ(ÑïÏ’ÏñЦÓûÖÏÚ˜ßåyëêïHò§ó˜õ°øü{£& p D*-ëÿµÜmå¤(ìò$ õ½VÉi œŒûËŒ†¬ #\%‹%K#Ç„üEKÁ 4ãiûb÷(ôÓð:íãéç¯ã”Þ‰×>Ð£ÊŠÇ†ÆøÆÈÈßË3ÏÑÏИÏFÏ›ÐÓ/ÖÔÙ¯ÞÉäáêQï°ñ#ó6õ_øü-æs x®¹\—LþÜÖ–ëÿ1÷·n«S! iÓú˜{= å"&%:%Ù"I •o1~¤6 ½~û÷³ó)ðpì"éaæãëÝÒÖ}ÏæÉÄÆ›ÅÜÅ—ÇÁÊ3Î#ÐïÏËÎŒÎæÏKÒ*Õ¶ØÝèã#êŸî ñ™òÐôøÒû´ÿüñÊ DªÅ¼ë¨‡¢ Ë!— (Iï‰2çŠ!=#S") |ü Xæ{ #-%$%"Ú|×kë»!Yð Iÿóùìõkò®îÔêŽçíäºáÜwÕ·ÈQÅþÃÄÁÅə̡ÎÎ|ÍTÍÁÎÑâÓk×sÜþâwéî«ðeò»ôøËû­ÿM wög lè§Ú«à )#œ$#& RgáRä– 3$×%Î$x"ž Ø‘Fc° #û$¬$Ú!áDV”ËpÓ  §6ýÁ÷½ó&ðKìmèGåãâßßÐÚÎÓÌ Çą̂ÂjÄ×Ç©ËßÍèÍÍÍ¡ÎüгÓA×uÜ:ãíé±îRñó~õÁø`ü$‹Ø "ÈS¢1é Þ "È$u&¥%Y"k²Â]Õ€"&±'¡&8$F"P!· Éã -#û$‚$†!Z‚CéA … ½ RãÁú}õtñ¶í£é å‚âQà’Ý¿ØøÑöÊ•ÅÂ"Á,ÁõŒƢÊÍ`ÍÓÌ(ÍàÎMÑþÓ’×ôÜ äë0ðóõ ÷éúfþþT¶ '÷¦‘?ài "=$û&Æ( (Ö$è !ýùÎìe#Ñ&-(Þ&=$"è íÁ × !Ë"="&ãérói ÊÃdý^÷Fò`îªê‚æyâ…ߦÝDÛ¶Ö,ÐvÉlÄ‘Á]ÀƒÀÂpÆëÊÅÍNÎάΨÐ3ÓÝÕoÙúÞVæªíøòíõø¶úþ^½ò_êÉl,Ù_!#u$›&g)4+a*'ô" ¼^Ãz º#'#(‡!Ãfº’)×!á‹W •äm@ÿþù"ôGï™ëèÛãÛßÝ‚ÛzÙ0ÕæÎ†ÈÝÃIÁ)ÀUÀo¢ÆqË›Î_ÏMÏ3ÐgÒÕ˜×Û­à5è°ïõ&øiú?ýŸÙû {&̹‡>!ª#%M&W(++ô,,(r$!" wrÓ ä#'(J&/#  ýO4§îꇫP#¤ É ½™ðÿšüg÷§ñûìwéïå½á½Ý"ÛÑÙþ×íÓÎͺÇoÃ!ÁÀ>ÀuÂñÆ̊ώЯÐÐÑ.ÔÎÖJÙ©ÜYâê¯ñ!÷Iú³ü¶ÿ!6 ü x9.àÑ  O#Š%²& '‹)[,.-r)W%m"æ ó•µ §#Ö&¸'º%|"ÐúùpŒ©—5Kè­ã] Zçÿ]þ7ýeú]õËïUëòçcäàþÛzÙ[Ø»ÖÚÒþÌ8ÇAÃ*Á1ÀZÀªÂpÇéÌ¡ÐèÑNÒ·ÓHÖñØ\Û±ÞhäQìô©ùöüŒÿ­õ™ K±u` ä £"+%'Ú'g(*­,C.-R)*%."p (jC "%è%Ã#i ©±x¥€i J‚  ͯýYüsûÞøôÎîžêpç÷ã«ß’Û$Ù+زÖÓnÍòÇBÄSÂeÁ’ÁìÃãȘ΃ÒüÓšÔ*ÖÛØ…ÛáÝ+ááæØî·öaüÕÿ—Î) × AËݹ G" #Í$+'Ò(.)[)³* -m.ö,)Ë$›!…Ê›"µ™"O#!²êØkY÷ì¥ a ÃÅþtûWú±ù]÷ìòóíê)çÂãsß_ÛÙ3ØßÖVÓùÍ·È3ÅYÃeÂŒÂøÄ ÊòÏ Ô»ÕžÖjØ7ÛÛÝà[ã é,ñ)ùéþ~nÉ+ ¼ûf¤M #¢$~%+'d)Á*¶*~*†+-“.Ô,¥($± I'‹º¦ Ì\•r×–  %òv» L C1V1üEùYøä÷Ãõœñ í‹éÞæ”ãOßRÛÙqØA×ÛÓ·ÎÂÉ{ÆÒÄýÃCÄØÆÌ!Ò^ÖCØnÙ|Û_Þòà ã6æ÷ëûóíû™&f ™è×üøU ê#A%&“'Œ)„**w)8*ü+­,¡*C&!ü[ôaÿ€Y(¢§ä Œ ·  Óe T £Ìü6ùjø#ø+ö=ò÷íÀê=èùä¯àÀÜ¥ÚÚ÷Ø‘Õ|ЬˇÈàÆûÅ.ÆÅÈ Î,ÔŠØÚëÛ%Þáã€å‘èSîQö$þ½1 h svÎ}Š Ð#ö$”%'Ã(\)ƒ(š',(Á)2*è'n#¹0ƒ÷õß-挨קétQ ' # T.ó 0 ÊcIüùÃø’ø­öÛòÁî«ë'éÅåRáZÝPÛÌÚ§Ù.ÖÑuÌwÉÕÇÏÆãÆuÉÕÎÕ›ÙÚÛ}ÝùßãåcçyêUðcø%¨! " yo6výƒg!€$%þ%J'È()Ö'°&'(Ð(P&¸!þq«ç­v¸†Fÿy é Ò] V C 6 ¿¥2€`ü›ùêøÈøÿöEóQï^ìáésæçáåÝåÛeÛ2Ú¿ÖºÑ7ÍaÊËȲǡÇ,Ê›ÏðÕšÚÝìÞ™á·äçàèÍë ñ ùC¬+ H »¬HT¥ Ë!¸$–%ÿ%.'€(x('¯%ö%M'V'š$è6¯Ûñ™c¶ rÕs®1Ç ¡¤b= ° » â ¹î¯"ý‘ú"ú2úø÷ô(ñXîæëhèÈã¾ßÊÝKÝøÛYØ6Ó¦ÎËËÊáÈ­È)˧ÐýÖ–ÛüÝÊßmâqå ç+éòë¦ñ¢ù0zæ ÿ uZØÇ g)!$Ú$E%x&È'¢'&•$Õ$-&1&]#šém µ_>²½¼>j ¬ xvF: » ß ô@ wZýµú:ú?ú”øÿô3ñqîìoè©ãlßcÝÖÜkÛ­×rÒÑÍþÊ]É"ÈñÇhÊÐÖGÛáÝëßÄâùåAèÔé¨ìoòúA¢( cþþzVƒÅ{"J% &d&‚'´(c(|&É$Ð$ð%Ì%¿"ÇõhŽ Ù ?G\öÒS ¼ ŽŒhn ÿ 7 ƒ íhCý‡úú úqøóô3ñ|îì€è³ãißEݲÜ?Û|×HÒ¯ÍîÊgÉBÈ%ȰÊ\Ð×*Üß`ágäÂç$êÊë¯î†ô·üŽ Ç &ÓÚ8ßÎÒY$'À'ø'â(Ñ)<)ÿ&í$•$W%Ý$ž!jaš}5 m ï ' *Ù¶ ) à NÿÕ°Êð†Ò}‡ ÿëú,øÇ÷ øÃöªóQðêíÉëgèÃã£ß¢Ý8ÝõÛjØ€Ó:ϸÌfË`ÊZÊÍÈÒ³ÙôÞ âäšçïê<í¿î‡ñK÷hÿ>à xÞ|Tq½W!`%(“(²({)4*[)Ù&}$è#v$Ñ#ƒ `tÇ­Q f ¼Ø ® ®V &  í?·[ÿúÿö”ü ¶³ÿüÎ÷øô‚ôÞô»óÚðÀíŒë–éPæÇáÎÝÿÛÌÛÔÚ¦×;ÓŠÏÍÌÙË ÌñÎþÔ+ܾáåÊçëvîÈðBò õÙúô¾ T‘,Õ¨© µ#ç'h*ä*à*{+í+¹*Û'#%F$$¯#N PœæK  2 » w ê › Ö-^ÿÀüýÀÿ[£ÿnþRü„ø2ôñBñÑñÝð9îsë”éÜç½äIàmܿڪÚôÙ:×Ó—Ð6Ï’ÎðÍIÎkÑ«×ïÞ ä6è=ëÚîxòÜôNöúø”þ`ß _Kõ‘ÿ „!H!„"÷%à),_,5,š,¯,þ*Ÿ'j$#Î"!OÙ^ú œ‚1™ / ¤~Þ4:Zü¨ùÕùDü~þáþúýýü0úyö[òúïðÃððµíKëºé-è/åÏàÝcÛMÛ®ÚZØ7ÕîÒùÑ€ÑéÐHÑ‚ÔÌÚ âÂçŽëÚî·òröÕø4ú¡üíT zØÝ§=!r#®#:#9$k'+à,î,›,Ë,”,|*¯&#!m ØL­s Š eÈŽTÙj„*³Óýëù"÷&÷bùûü„ûôú[úøìôÝð˜î¸î‰ï÷îØìºêtéè6åßà Ý_Û@Û¯Ú ØóÕ2Ô©ÓiÓìÒWÓ Ö Ý`ä<êHîìñ&ö(ú©üþXfž ˜éö ˜$¥&–&Ô%&t)Ç,f.C.Ð-ß-{-+×&¿"e PsÁ"÷„ × eyüÿ?H²9h.ÿÉýïúïöôçóö!øÎø~ø<øÜ÷(ö“ò†îOììcíðì ë6é=è#çjä5ànÜÙÚáÚ’ÚðØÒÖՌ՜ÕTÕïÕMÙÕßJçKíñ{õòùþ¨ôãÑ•ÊåÏ#W'))Ê(·'"(±*¹-/Ì.;.".‡-Ù*D&Ê! •‚¾2$º ÷Z9ÿ†ý•þmÉ_ÿ©ýˆü,ûMø=ô1ñíðßòãô¡õˆõ‡õ]õÅó>ð8ìêAê<ëûêkéîçMçvæôãößgÜùÚ<Û8ÛÚ{ØÜ×NؼشØÙÝ’ã$ëLñÊõíù€þ«91³ C´ª§"&á)+Á*H)M)r+.=/È..Ü--*H%š ¥ï¡Ò] 8 yÏ•ýÐûÅü~þÌþtý×ûÀúUù[ö=òïÊî¡ð†ò?óGóyóuóåñUîJêÿç4è)éöè–çYæéå3åÆâëÞ’ÛRÚ½ÚæÚùÙàØÊظوÚÅÚÎÛ…ß4æÚíô·øý¬Ù:G 3 Ÿÿ;!í$Ä(,•-ª,ï*²*,ç.Ô/ñ¦ñáñyðùìðèšæ­æ–çsçKæcå?åÇäâÉÞšÛyÚíÚ%Û^Ú“ÙåÙ4ÛTÜ¿ÜßÝ–á*è²ï÷õ·ú3ÿøf P  PdQó!Ó%¸)-….„-š++¥,­.o/á.:.ì-Ñ,)x$z2 NJìR L¦üÿ­ûªùiúñû;ü'ûèùù¾÷¸ô–ðuíêìsîðð¼ð4ñrñóïUì9èÖåÐåŸæpæWå‹äuäüã¼áÞÛôÙ_Ú–ÚëÙbÙýÙzÛ­Ü+ÝiÞEâðè€ðâöÙû~¯  ý ËòÐ #ú&ì*:.€/c.r,ë+d-I/ó/k/Ñ.„.U-ÿ)ç$ì„.A4òk [–Ùÿ‘û™ùBú¼û ü ûúbùø õóðÔí)íhîºï/ð\ðÍðäðKï—ëzç åÑädå%å)ä‹ãããûà€ÝœÚ ÙÚ@ÚÂÙyÙHÚÜÛ!ÝÉÝ2ß,ãÐéKñµ÷ÞüÃ½Ö ô —„|Þ"¶&†*£-».„-„+Ç*ð+ƒ-ý-t-î,¨,x+(('#FÛuƒˆi ý ^ÛþÝú ùàùsûûûlûÂúQú0ùTöcòcï¸îÜïñ˜ñÏñ9ò4ò~ðÄì”èøårå°åCå=ä¥ã©ã0ãá«ÝÐÚÊÙÚGÚÙ٤ـÚÜZÝޙߕã-ê–ñøYýi¬ ü Ë¥t×#³'r+g.K/è-¿+Å*Ž+Ì, -d,Ã+V+*˜&‰!“ü_QZM êçQñü,ù¦÷ŽøNú)ûýú³úú²ù5÷óÛðGðoñÃòhó»óôåóùñ"îÓé çJæNæÄå¸ääûãlãPáøÝÛÙÙÿÙ.ÚéÙ×Ù§ÚÜ>Ýޢߙã!ê~ñø|ý­Ù# ¬ýÔãA Í$¿(Y, /·/E., +ˆ+x,‚,¹+ê*>*Ä(X%I /LfRƒ ’ Þ6ÿû~÷!ö÷¿ø¼ùÇù«ù®ùù÷Þó[ñÏððñaóCô¶ôøôŠô‰òØî¾êøççÊææõä(äéãMãQá+ÞIÛîÙðÙ%ÚÚ Ú³ÚêÛÝøÝÓßÞã8ênñâ÷]ýƒ™ð ®B;å| %%)‹,/¬/[.X,9+z+",,!+/*Z)Ñ'’$µ®¶´¦ÿ # ™LµþÇú‹÷Tö9÷çøôù%ú!ú4ú»ùì÷õªòòóxôeõÖõñõSõCó²ïÀëðèÑçbç“æfåŠä6äšã·á±ÞÐÛJÚÚFÚ7Ú?ÚÓÚèÛÝÞàäGêJñ¦÷ý>P¶ ŸTLÍÇ À$¯(ö+7.È.-£+~*’*+Ì*á)ê((’&t#ÄŸ¡¡- ±-þ}úƒ÷möS÷ùøúkú‰úµúWú³øö¢óØò­óõ÷õeö^öŒõ_óÜïì4éàçCç`æ<ånää—ãÛáß<Ü®ÚoÚ¬ÚÐÚ۟۟ܶÝëÞá*å1ëòHø¾ýáä; 0òÞ/í Î$À(ð+.….g-+x*`*˜*E*`)s(›' &#›²˜fb ~©)þžúÓ÷½ö}÷ðøîù@úZúsúúføÌõmówòóCô>õ½õ´õØô®òNï¨ëìèçÁæÙåËääÚãmãîáaßÕÜXÛÛQÛ¢ÛÜÉÜÏÝïÞFàžâÆæ²ìOówùáþôÙ Ô³Í7$ Ä$¾(ß+Ñ-/.-^+5*ö)ö)~)Œ(”'ª&"%/"Ö âŽ}C å‰*«ý?úª÷¸ök÷Éø¼ùú,ú2ú°ùøƒõ%ó òWòYóJôÓôÇôÑó ñRîÛêEèßææ5åFäµãŽã3ããá”ß>ÝÙÛÛáÛbÜÝâÝéÞàxáõã:èî ô»ú/H" K>)K!§%¦)¹,~.².Š-â+³*O**y)w(r'n&É$Î!¾xòÀ ˆ 9×T¯ü<ù¶öÉõ_ö÷dø³øËøÃø5øö+ôßñ´ðÜðÄñÂòjómórò?ðíÔépçæPå}ä´ãUãYã&ã â àïݨÜdÜÁÜjÝBÞ>ßDà[áÚâsåÈé¡ïþõýûlŒ` ybP2øz!é%Ó)Ò,p.{.J-²+Ž* *¥)Ù(Æ'Â&Ã%+$J!.™bÂr 2 íŽûÿAüÒøhöŒõ ö÷«÷á÷î÷Ø÷6÷õ:óøðºï«ï[ðAñíñöñöðÈîÅëÂè‘æLåsä¡ãöâÊâã ãBâ¤àåÞÖÝ¤Ý ÞÕÞÛßúàâ;ãåä¸ç+ìòBø*þ˜¾’ ž€sSý¬ð"='+ó-g/@/ñ-O,+P*–)‰(S';&!%o#ƒ aÁe“( øÐvËþöú÷õ=ô’ôQõÔõööíõ8õ’ó*ñÏîaíí®í îkïï~îWì~鏿·äŽãÍâ,âÓáþáŽâåâsâ4áÇßêÞæÞ’ßµàâfã’äÎåžçŸê(ïëôûøw¬ †aL}ß ð$$)ß,Š/¶0Z0á.-œ+*h)(Ç&š%k$ª"Ʋ¨ÀK ô…»ýÓùYöðóõòó­óôEôIôô;ó}ñïŽìþê˜ê ëìòìíìüéNç¹äÓâ¹áá§à¡à*áâÍâÈâýáûàtà¹àµá-ã×äeæÀç,é8ëqîóÜøþþâi \E¿Hh m#!'+o.½0†1Ñ0/ -E+Ï)_(Ï&L%$»"è ûcö Œ c@Êÿêûð÷tôò ññ|ñÂñÙñÓñŒñ§ðßîfìóéSèÞç\è^éGêxê‚é~ç÷ä™âæàãßLßßDß$àká‚âáâ†âøá×ánâ½ã“å›çuéë˜ìÜî\ò>÷ý6 ¨ä˜bÿŸ "å#˜&ó)ˆ-¤0”2ì2É1¶/c-L+o)“'°%û#"&!-/*ž.- ¦}aèýñùãõiòðïïMï‚ï™ï’ï8ï0îTìçé‘çæ‰å æ(ç4è}è•ç—å'ãîàSßSÞÁݧÝ3ÞißóàEâðâùâÓâãÚã\å}çØéúëÁíŒï òÆõÈú ³  HŒ"¶'"·# %Ç&7)L,ª/¢2]4o43³0!.±+d)'ÿ$6#¾!1 âÐ:£ c ¢[9ÿ»û¸÷£ó4ðéíÑìŒììÃìïìÿì©ì¡ëÔé’çnåûã…ãä\å§æ*çuæµä‰â“àß$ޟݸݤÞ?àâ°ã©ä å2å”åzæèUêåì/ï ñæòwõ5ùþ£e µæS°!ö#n%£&&(F*-80 3œ4q4Ê2K0…-Á*(S%ò"!„ÜŒQ<¢ò ˆ¬jÿ\üòøúôðð˜ídëHêåéÚéê\êœêiêéæçéå äÍâ}â8ãÉäoæGçÙæbå†ãÙá’à­ß9ß|ß«à‹â•äJæhçúçIèµèéëlíðmòCôöœøFüúA¸ >¸Ö I#k%Ò&ò'F)$+­-¬0c3â4•4Æ2&0A-H*<';$¡!¡8ÆoN¬ äNJøüëùƒö…òpîëåè»ç3çç$ççóçáçç§ååãKâDááâÎãÆåòæÒæªå%äÉâ¿áøà˜àþàbâ„䯿£èèéªê'ë®ëŒìîdðólõ4÷ïøcûôþupŽ Ë/!$$&E'>(c)+V-(0½24°3¼1/,ì(£%Z"~à™8y µþÎúÚ÷†ô–ðìJé4çæå6åRåØåjæ~æÑåƒäïâŠáµàºàÑáÙãæ‡çç«æhåOätãÃânâîâ„äàæRéMë§ìíî˜înïñðCóòõDøíù‚û×ýE‘9 ùåó´•!A$Û%Í&„'c(·)Æ+l.â0!2š1—/Õ,×)¬&E#݃Òj),µ ~…üWù‰öWóï‘ëgèlæcåÍä}ää:åêåævå8äÀâwáºàÐàúá(äœæBè~è¬çŒæ™åÙä,äÒãYä æ“è/ëLíÉîÉï~ðñêñ[ó¢õLø•ú(ü“ý½ÿy ßu=Åj!×#/%å%k&'/(ÿ)€,è.$0•/†-»*¿'œ$1!¿á÷¦*ñÙ ÈKÞÿøûàø:ö7ó…ï®ë’è¤æªåå´äÀäYåæ\æÂåyä÷â±áúàá5âaäææµèéXèFçiæÅå-å×ädå1çééÀì ï˜ð£ñkòóèó@õk÷ úWüêý=ÿ>ZGl …ÈS¹C!ƒ#›$ %Z%Ý%É&c(²* -J.Å-³+ß(à%Ã"_ë@1M ,Ô€ÿû‡øôõ ó—ï×ëÂè׿ßåFåÐäÈä]å3ææóåäïâšáÞàéàüáäªæ—è$éwèiç‘æøålåå·å¬ç¥ê¿í9ðÝñôòÒóšôlõ­öÁøWû©ý?ÿ…b_- ) ˆÞN!Y#+$[$‚$ì$º%/'b)¼+-¦,›*Ä'Ä$«!BÇôIv†­Ê. 7Èÿèû×ø[ö¬óCð‘ìƒé¡ç¯æ æ~åaåõå׿6ç‚æêäã¡áÉà«à’á–ã"æè³è èøæ$æåøääå&çMê“í%ð×ñûòðóÏô«õëöüø¦ûþ»ÿ êîÈ À ’’ké!é#›$¨$²$%²%' )w+â,|,s*¡'®$¨!JÍýhºö4YÆ àĈ£üù÷wôñ`íEêWèXçŸæêå¤åæîæ8çbæ•ä‡âÛàÑßzßàëá]äQæêæBæ.åaäßã_ã ã¤ãÐå1é¶ì}ïXñ£òÅóÒôÒõ*÷Rù$üÆþž õøØ Ò˜†é]å"ã$%n%Y%‡% &&')H+¶,\,Q*v'}$z!# Ä+ˆÚ3_Ð ôèµÎüºùU÷Òô“ñâíºê½è³çñæ+æÉå-æõæ>çbæ„äWâàaßßÞIßßà4ã#åÅå'åäQãäâ{â:âââåè>ì2ï5ñ¨òöó2õ^öÚ÷#úýçÿçl`c? 9øØ+“ $&œ&i&*&'&q&Q'þ(+Q,ó+à)ü&ý#ô — {Õ+Ã2 UK8ü&ùÃöEô ñbí/ê$èç,æOåÖä,åõåCæmåˆãFá^ßÞ{ÝÎÝKßá€ã5ä¸ãÏâ+âÝáŽádá'âxäèì/ïañüòqôÛõ8÷æø\ûwþs¨`ž ‡†BpÚ"l&e(Ö(|( (Ø'í'’(*É+â,f,L*U';$!‰ÖÇ \°O· ÒÅ™ÿ±ûø$ö¦ó~ðéì¾é¥çsæ€åä äTäåiåäœâDà<ÞÚÜ'ÜaÜÂÝìßÜá¥âIâ}áèàžàVà?àá•ã_çuëÐî-ñíò„ôö—÷iùýû7ÿ\ÑÆ F 20ðÐ$ Š$(*d*ã)E)Ü(½(!)L*×+Ã,0,* 'Û#’ ö9$hÂ'¡æX umIÿfûCøÕõcóTðÛìÅé¬çuæ~å‹ääNäånåšä©âGà.Þ³ÜæÛÿÛ9Ý=ßáæá—áÛàPà àÄ߮ߕàãúæ3ë¼î>ñóÉônöøåù‚üÆÿžÂ5 ‚ vmè)!‡%) +g+Ó**†)5)`)E*‘+O,¥+‚)‚&F#è,MDž¬ƒ ˆUþbú,÷¯ôDòRïìé çîåîäëãUã˜ãoäñäPäŽâNàJÞ×Ü Ü'Ü_ÝfßTáNâ1â£á;ááÈà­à‘áäèjìðÃò§ôJöÕ÷Oùû’ýÂö™ËC Œl>ÀYs!½%E)B+¥+ +4*)) )È)ú*¬++í(þ%Ñ"x´Å…­£S F `@ùýòù­ö'ô¿ñÖî–ë·è½æ€åcä6ã~â²â‹ãä“ãàá¬ß°Ý=ÜdÛpۣܰޮàÄáÓáná.ááØà´àŽá)äBèÆì ðfóbõ÷©ø úÛû]þŸì¨ò z ǘ<€ãß!*&¸)´+,m+ˆ*º))ð()°*b+»*§(Ã%¢"JnWù‰1êY Ý öÏxýaùö£óTñ‰î_ë•è¬ækå0äÑâïáâã°ãMã½á«ßÒÝtÜŸÛ›ÛÊÜàÞñàâFâââáàá©áwá=âÒäøè…í\ñôöÀ÷Jù°úZüÓþP« > ‰LËØÜ!&›)Œ+Û+0+E*c)(D(´(²)R*Ÿ)'”$s!6—³&Ó’þ ƒ¦Š<ü3ø õÅò±ð#î/ë‘èÏæªåzäã8âsâãXää§â¯àéÞ“Ý·Ü¥ÜÄÝßßúá0ãaã$ãããÈâ}â+ã©åËéQîò·ô™ö5ø¤ùêúxüæþ0tÏ a ¦R£tn(!U%á(Ð*$+…*¢)¸(Ô'Z'²'£(;)‘(}&¬#« cx1«Â9ä¦  ·õîÿ®û²÷ªôò§ðEî„ëé‘çˆæOåÕãÞâã?ä)å÷ä¡ãÌá&àØÞìÝÃÝÍÞ×àæâäKä.ä>äQäøã„ãäxæ€êêî†òõØökøËù÷úpüÐþ j.}  `û ²~% L$Ð'¹)*c)‡(˜'Ÿ& &O&0'¹''%\"‹c{)œÆSà ? æ:Gÿû,÷6ô9òjð#îˆëSéúççÜå[ähã¸ãþäæâåžäåâZáà5ßßàâä7åå„å¸åßå|åðälåÐçÓë/ð®óöÏ÷Uù¡ú¯ûýFÿgª_§ B Ž^ù„š# 'ã()}(£'®&¢%î$%è%f&µ%Í#I! ©N¸é Š J  ƒ 5”¥þoú€ö‡óñÏïŸí'ëéßççÇå5ä;ã˜ãõäææêäQãåá¿àáß»ßÈàÖâøäAæ­æÚæ5çvç çŽæçiéoíÊñEõ˜÷Aù±úäûÔüþ+3]÷ • ºÆØ,ƒr"Ä%…'²'ÿ&&%þ#B#f#A$Ó$;$q" ”­å V  é » H x–þiú†öœó°ñðÞílëdé+èMçþåLä1ãrã¼äÞåÔå®äã¾á¡àÆß¢ß²àÇâóäVæÜæ)ç¦çè¹ç&ç˜çê îpòúõ\øúûÊü¾ýñþ)^ B Ãï9Ò¹ÜÕ" &²'Î''%&%ê##$#ì#s$Ó#"¦'9XòMj  Ñ Î@eý9ùWõuò™ðïíµêÖèÆç çÓå'äãXãªäÕåÚå½ä@ãúáõà)à à+áTãšåçÂç2èÑèDééièÄèëïjóÕöù»ú(üSý4þPÿY[†- q :‹ïü Å"â%o'w'µ&Ç%½$“#Á"Ð"™#-$œ#â!—!/7°ð ó t # Ä (Ò6Müøô)ñHïÁíßë¾éè%ç{æJåã†âÓâ,ä]åsålä ãåáÿàJà9àiá®ãæÒç·èYéê êdêËé êtìsð½ô#øaúõûQýdþ ÿïÓþµ  ¯æ'–C+·"Â%D'G'†&š%Ž$U#j"^"#¯#3#Ž!RÜÚÏ(I / ’ % µ›ñþôúö‡ò~ï—íìeêvèøæ3æåräÉâ´áâwãºäêä äÕâÞá"áàœààáJäèæÔèöéÒê¿ë\ì+ì›ëüëKîFò€öÏùûûýÉþ¾ÿRÏŽŸH Ÿ <d†ÇDÊ;"%n&O&|%…$h#"!!·!U"ò!i NóûñJt j Ó ^ æ3Ó3þ9úÞõÁñ¿îèì†ëèé èÉæ(æ¢åwäÒâÆá5âµãåBå{ähã—âóáná†áÙâVåèêlë}ì”íEî îríÐíð ô1øcûxýðþ*q©OM ë @áþ M߆Ö!’$Ä%„%$“#["ç ÀŒ+ · P ÚÕŒ“xÀÜ ØHÒV«XÈüØø„ôqðuí·ërêýèjçKæÖåhåAä â©á0â×ãJå¤ååänãèâuâšâ÷ãzæ@éeë×ì î:ïîï¦ïúîTï¤ñˆõŸù·ü¶þLpûƒ ¼ %ØôÓ¶Î@Ìü!$¢%I%K$'#É!) Ì`Ç%¦25âËÆ ÖÆ(Ÿw:þ¿úæö®ò¿îåëBê,éúç¾æóåµågåZäáââÓâšä/æ²æCæ‘å åžä9äeä»å(èÜêíŒîÓïøðˆññRð•ðÆòyö^ú\ýKÿªÉÉIÄI1 â f/E»¼—«!%$/%æ$ñ#Æ"U!*™Ù‹$4Õ–,G I_¼0 ÿ}üùOõ0ñfí´ê1éCèNçcææåÜå©å®äUã¿âŸã‚å;çìç»çEçíæ˜æCæ{æÓç2êÔìï™ðòñó…óôòò2òBôÁ÷iû7þB9Áá:–ùà h ÷ÍâƒYÊÏ 7#<$ÿ##þ!ˆ ÆH¤Éí[-â£+? GQŸ ‚þpûø[ôDð‹ìîé€è«çãæ<æ æ=æ%æ8åçãhãcä]æ,èéþè¹è„è@èîç"èséÁëRî|ð,ò£óÑô3õƒô{óŒóõóøxü)ÿçú`^›ÕÑ r ˜ü¹ï@* w"o#7#b"C!¾åOŽ‹òªñ²nà èóÉò4›ÿýúÖöóïiëâè…çÄæ(æÅåßåDæBæaå"äÀãÓäÓæ¤è‘éºé­é©é‰éUé™éðê1í¬ïÐñ”ó(õdö½öÿõøôõûöBúœý*Ú×'7Soü ‡ (!€¸Tq¡_€![" "X!J ÒþciL£fÄ”UÕ îøL«þ+ü7ùûõSòWî¼ê;èàæ(æ§åqå¿åJæ\æ‡åZää*å4çéê[êuê•êêgê¬êêëîpðŠòVôúõ@÷•÷ÐöÇõØõº÷îú-þ¡@a*lEbnwü ‘ KUe¾Ý_i…)=!"Û!! ‘©ôü¬h«kΛJ³ ´Å”›ÿ®þúütú~÷@ô—ð ì éœæVå½äpääåáå!æsåpäCäåÆçÎéëŽëãë4ìUìMì¥ìâí÷ïJò_ô1öÝ÷%ùmùøo÷h÷*ù3üLÿ™ºß™’uP° 4 íü Tmâåüœµ š!r!Ä ÇW~ÈÁXÿ> wHðR KIùþöý1üžù˜öOó¢ï¬ëèå@ä¯ãã¿ãƒäxåÙåGåaäNäªåúç!êë4ì¶ì7íˆíªíî`ïoñÃóâõÁ÷vù½ú û-úùóøœúƒý¯ábe÷¿h H » pyzµ¾ötvX 5 Žœ5_™wﻌ㛠"(æþÖýÕüûø±õòæîësçòä¨ã6ã=ã¿ãÈä÷凿æTå\寿éPëËì­íbî ï{ï§ïð=ñ-óiõ†÷sù8û‰üÕüõûÈú¨ú5üëþ²½ù½"þdùoãùa 7<gW¡h:Œa)j| #DûNÀðÑje, ­Ðëÿ¨ý‘ü…ûÌùd÷œôŽñî>êÈæ\ä"ãÉâãÊã'墿rç/çŽæ¸æ8è’êÏìZî_ï?ðñ”ñÉñ2òTó-õM÷YùFûýfþ¡þ§ýWüüuýîÿpC[Fô'¿ùÜ Ð êíÐø›DgÀ¡9Íá¹ „ÏåÆ Ì%tÿUýJüGû¤ùh÷Öô÷ñ™îàêç-åä¹ã äåœæKè>éé†è¼è8ê{ìžî%ð:ñ6òó‘ó³óôõ¬ö–øvúNüþnÿ ÿ˜þ<ýÞüþOŒ/7ݳÏ7P) Ê äè了EÁ¬±š,bú5î5¤ó-JÔ " ©2ÿ4ý-ü'û‘ù}÷ õmò.ïëQèæå´ä å!æåçºé¿ê¤êê\êÍëêíâïVñwò‡ólôÜôìô'õö˜÷OùûÇüšþñÿÿ¸ýTýrþz Äš¯ö¤¨B cmmâÈ?.Ö·Îü»øR›ë4ï j ŒLöþýéûÖúOùg÷DõÁò©ï.ìéòæÞååìåçéëPìZìòë7ì™í’ïfñÎòúóõ örösöšö[÷¦øú—û<ýþþLhDÿÌý<ýþËÿŠàÙÓ\b˜”cŧ4 \ t@QÍ®ßbwOÃŽÏ$ÿK°Œ Ì +åÿýýäüÒûdú¬øÁötô‡ñ0î%ëéîçˆçÒçýèùêíBîGîÒíõí!ïÖðhòŸó°ôÂõ›öêöÎöÖön÷€ø¹ùûŒüDþ˜ÿ»ÿ–þýü6ýÆþf¶Ã™ûŸ¸û÷µùÉY– ÈøÇßU…ù´¦/ X±ƒ¶þLÉ c x H ¾¾…ÿ’ýmü`ûú™øõöíôAò+ï\ìfê]éénéÂêîì5ï“ðºð[ð|ð†ñó~ôŸõ¤ö¦÷gø’øLø"øyø<ù(ú6û“ü)þ]ÿiÿ&þ‹üÄûCü›ýÿ_xbÔ…¥é݈º|Y ™ ÙÁïl’ôÿŠÉ×w`»ëNŽ ÿ ’ § ~ ØþÔüšû…úIùõ÷Šö¸ô<òQï©ìÓêàéžéê|ë¿í)ð¶ñ òÔñò óxôÉõÙöÜ÷ãø¤ùÊùzùFùù=úûëûýþ©ÿ§ÿhþÅüåû6üOý’þ´ÿ¾§Íñ6)Ç⌠L ” êòDÔûQSæ?n+-¤.] ÿ š  ¬ Fl9ÿ#ýÒû©úkù)øÙö)õÉòÿïví²ë·ê[êºêì[îÊðiòÎò¦òàòÒó õOöH÷CøHùú0úçù»ùú•ú6ûðûýkþuÿcÿþeünû—û~ü–ý¡þ­ÿ¢'í.ÿ‰ÿ°*|ß T„¹ñFDáR¡zš3ÐÄéÿy ) ™¹zÿDýÂûrú#ùæ÷§öõ¿ò ð™íÞëÔêZê¡êùëEîÁðtòóóeólô¼õëöñ÷ù!úîúûáú¿úû„ûüŸüžýîþáÿµÿWþ—üƒû~û$üúüÕýÅþ©ÿÎÿÿaþMþÄþ¡ÿ…Ó>  Åªÿbn'À87t0õ9QpÞ ‚ ¯ ¤ E|K þmüû¦ùmø5÷˜õVó±ðQî™ì|ëäê ëYì£îñÇòaó}ó÷óõOöy÷„ø ùÀú†û°ûvûXû•û÷ûPüÍü¸ý÷þÏÿ€ÿþ*üôú¿ú1ûÚûšüzýRþµþeþ©ýýý|ýPþÎÿRÀL ó l So󂻥lrRCz¾Þ€*P1 Ãâ—9ÿvýìû~ú3ùà÷!ö¿óñ“îÃìë·êµêÛëîtðòŸòºò0ó:ô|õ¢ö®÷Êøàù•úµú„ú|úÎú<û™ûüý_þBÿôþxý¤ûqú6ú¨ú[û0ü$ý þvþ.þ„ý ý ýsý2þ ÿ Ñ W P{–×É”&0‹Ü+O~ÁíÏ d ‚.¾ÿêýXüëú¤ùLøƒöôhñ÷îí·ëÅêœê¡ë¹í ð™ñ'òGò¹ò·óîôö'÷Gø[ù ú0úú8úªú+û•û&ü.ý†þvÿ5ÿÃýõûºúgú¿újûBü:ýþ}þ:þŸý8ý>ý–ý;þ‘ÿý]à• 0 5aàe§¢qûúWbøR{®:ù, Ë ý¥"8þšü)ûÙùmøŠöôaññîízëWêûéÎê´ìâîaðóðñ’ñ‡ò½óîôöV÷|øAùŠù©ùú§úLûÐûzü™ýÿùÿ´þýïû£ûùûªü’ý•þsÿÑÿÿÿ¦þ©þìþqÿ›â{  ² ¹ÜH¹óöÌTN­ÇuËé“Fo[  HæH=þƒüû›ùøö~óµð3î&ìtê%é èKéëíuîûî&ïœïðÀñüòDôžõàöÁ÷,øsøýøÎùŸúRû-ü~ýÿKgcÿúý ýÝüIý þ ÿ)‡UÖ…ŒÇ>Tuˆ½ 5 ¯¡«öD`Mq½ÈùY©Â1Íà¶ [ gÿ@ýqûãù}ø÷ööôeò¨ï5í5ëŠé>è¾çnè)ê)ì“í"îcîõîÿïHñ¢òôœõ ÷øœøù´ù£ú‰ûNü;ý¤þS‘±µZÿuþMþ·þzÿª¥ÔNñäÿN=4 I …D8UI×GQOxÏŠ(; ©Ür¸ýŒûÂùIø÷ õ½óIñªî]ì‚êöèÄç`ç1è êì”í9î“î@ïbðÁñ8óÑô‹ö%øGùêùiú,û-üýïýêþ`]ww(îÿ>ñö& z&ˆìåÙ­d0 0 :Î|eQ!áŽê£·™¯ó 3 K & Æý–þ×û¥ùâ÷†öfõ#ôYòÿïí]ëªé>è(çÝæÕçÖé ì¢íiîäî®ïæð[òòó¹õ¥÷cùšúKûßûºüÏýÈþ™ÿ›#øKpv ÓÆÜ#*{wЧž6Ýe þ à ŽåRò˜2Ðc—û·µÞ Ü ‡ í Ž ¢{'iÿüJù÷wõOôpóaò½ð‹îEìgêóè´ç½æ‘æ§çÒé.ìæíÑîrïUðœñóÎô¾öÕø«úåû—ü;ý3þ`ÿ`+(²Œè$×㈺hŠÝà¢ïx9õÀ)¤ÿ d þ œÈdÅ$› Wý w t  íIåôÒ”ùüºù÷õ‚ó—òò/ñ¸ï³íªëêíèïç1ç>çŠèâêdí<ïMðñòXóÍôwöqø•úpü™ý6þÑþÈÿîß’Õ-Vo2Eß÷œÈ+0 a ÏDåØ=} ¼ *§®µËØóBœ‡©+ ¢ u p ,¨^¬I]G(þ¯ú…÷äôÏòbñ©ðVðÄïî¨ìØêéŒè·çç[çàèmëîðTñBòPóŽôïõ”÷£ùéûÝýÿ²ÿRMlFß¾@n £ Ê »EFÛ £ Ð 4 j çŸÍ% T v Ã%é»|\‹Ù¶½ " = ªø‰ÀOX?ÿ+üÌøµõóûð”ïùîÔîtîPí–ëìéÁèøçDçÊæ-çâè›ërî”ðòñó1ôrõÇöjø‘úþüÿa¯³Î”ÖO! s ¦ Ú ½ÙM$”¼: K g µ Ø H ßK¶Ê  G‰[· = ë  Q 2 / Ñ„UБÒr‘ÿŠý–úf÷|ôõñçï“î!î8îî*íë'ê;é®è*è×çfèIê(íðBò«óÓô öF÷„øú-ü þ·óƒ ÁÊ4÷ 1 J s X xàœð Ÿ ­ ç þ i ý]¸¿îõ Ø Ø ú º c à 0 ª ž Ù « ˆ ·ï•\Éïrÿ¶þ]þƒý…û¨ø¡õæò‚ðƒîEíûìHí\íì8ëíé5éÛèƒèTè éë(î2ñ{óõTöª÷ðø"úûºý:[’Ž&hýT  ; H o _ † ã„¾Í Q b a „ ‹ ì v Âò  Ï ° º i ü T m ´ † ¬ h - 8Vê¡øÿpý«üOütû‡ùÃöèóYñï*íüëÙëXìšìÿë»ê—ééáè§èèKénë†î”ñàóyõÛöBø…ù¦úü(þ±Ù Œ ¦ãvÒ ™ Ô ô > Z ¥  ´ ì  “ ¸ » à ì S Ú  ; Ü … F6Ô N | _ s # 2 Ö qvóйÿ˜ýßûû™ú¶ùÐ÷'õmòúïÀí×ë¯ê¤êPë¿ëMë2ê5éÒèÀè•èƒèMéuëœî³ñ ô»õ9÷°øðùûdü„þ \š­£Ÿ5¶ Ï  ;   ß B ³ F y › D €ŸØ ü u ü * 9 ÿ ù ¿ Vûš Ç ­ D F Ý uUH­ÿÁüßúëùkùrø~öÜó1ñÉî‰ì‘êeé`é"ê¥êDê?é^èèèÑç»çèÁêîí ñfó'õ½öEø‡ù–úü<þû]·Z •±9 š e « Þ T ­ " — % \ K“»2¶ ; _ d $  Ð IåÄV¯— # é k \ Ú TùETþÕûÐù¹øø÷ÿôcòÊïní/ë7éè,èé¢éUéoè·çŒç˜çvçtçbè°êëíñ{óXõ÷®øøù û„üÚþ²%”I)$ … Š  W ?uû k ì ] è # n A”ÂMÒFP C ñ Û yÒR™Ès à ^ Á › ý[ ÕÿªüýùÙ÷¦öìõ¿ôµò)ð¨í[ë#é9ç:æ€æç]è<è‡ççç+ç&çIçgèäê?î€ñ ôöì÷žùìúÿû‹ýýŠâ¿ä Ö $  ‚ È f~¨8µ8š  G ”m½ç<€k^? á ° .\µgÈÍ7 C ¨ ã™Ö¦]mÿ\ý·úÛ÷•õEônó.ò$ð±íVë$éöæå%ääÁå¶æËæUææ^æºæÚæ!çkèëŒîåñ•ôÄöÉøúÝûëütþù¡=+ # R 3 b 8 ˆ ¼ FMtž pÏ ï -OçCÔ3ã | >§¿°ó7  Y zElû«©þvü©ù¦öCôÚòêñžð•î3ìîéÍç©åÇãëâmã¿ä×åæàåäå\æßæç‚çèè¨ë2ï˜ò[õ¥÷Ãù—ûäüëýlÿèóŽ- $ # O  0 é  ,–€˜9ÏW¡õ Ae¡“3–k.µ _©§Û|Î¬Õ Š ¡œ,IÑ~ÿpý$û;øõòñð¹î¹ìrêTèUæIäxâ¥áBâ·ãùäqåqå±åaæçuçÿçƒégì ðˆóhöÙøû ý[þ[ÿÓIW÷Ÿ ¥ ® Ù —Œ(A0yDIå}9sq–Z®éoíë·oð ‘ȲØq½‹– & ÿil®þ•ü2ú.÷ôóeñÖï¿îVíVëéç.å(ãXá…à#á¥âôã€ä¡äåÖåŸæç¾ç`éTì ðŽóyöýøWûQý¡þšÿŠŸK ÿ  7 q9+ÄßÏÜá‰1¿÷'>þM‘"´iÎSÖyªˆ¦4t. ‰ Xr`ië–þ{ü úïöœóððQï/îÁìÆê›è£æÁä½âèà àœàâdãöã(ä£äˆå\æ×æwçé ìÂïMó>öÇøûýKþ(ÿ„ëô§j ž à 5 —­œæÃã¨k Itc}6…Ø€,õc4çg B+Wô6ä»  Æt·©6èþËüIú÷£óÝð#ï÷í‹ìžêˆèŸæÄä¿âçàà‘àâKãâã"ä«ä–ågæØæoçéòë¡ï*óö¤øóúÎüóý¶þXTØ $ æ À¹LdX©”Óº›NšÏºÏz» ¿xH³~1©K{^0qÏ  ¯Al@Hâ¤þüúÀöHó}ðºîˆí"ìMê^èžæåäùâ6ágàôà\â¤ãAä”ä4å+æþænçèšéwì ðódöâøûÜüÜýyþÿÌŸ,ôC £  Í ¸ A P 9i»ÄÇ–ùFB\ P±ƒ[C¾œhø Õ¼ö¨ó’I  ¡»„Š,ôþØüJúÿö‡ó½ðôîºíWì”êÃè!çåªãøá9áËá,ãiäåVåøåèæ°çè¦è3êüìuðÌóö ù.ûÊü¤ý þÿ,ÙEø@ ž ø ¹ ' -  N=¦ÑøåeÒíÑ!”…~…­`Ý ð‹5] å PHúô•]ÿ:ý¢úQ÷ÐóùðïÓísìÃê é€çíå$äyâ»áBâ‹ã°ä?å‹å"æç¹çè”è ê´ì ðLóövø…úü¸üýòýÕÿ]°]ª d *  À Û Ç  2ÕB¦Ëƒ)vÄ™¡·Ì⢦_E;Vž$¹ & e +³•ÌÿŠýÙú}÷óóñïÀíYì¶êéžçæjäÕââ¡âàãüä‡åÍåPæç®çôçcè¶é=ìoï’òGõ÷šùøúûÊû{ü'þ|ªB„Ú/øû²à× : m > å †ëáÃE½µS]—Ì–Ìî»w±µûQÙg`£ ¶ L «nÜmþIûã÷Tôfñlïî¦ìë“é9èÓæ4å³ãã„ãÂäßånæ·æ2çéçtè°èéNê¬ì¾ïÈòmõ´÷ŸùæúZûjûéûXýoÿhÕô*d!ÕðR – † T  ® Ò ß ˆ"9øéO§÷Ý3mLXqùîRáqhš –  SZÔfþ”û+ø™ôšñ’ï"îÀì;ëÀéqèç‹åäyãúã4åLæÖæç„ç-è®èáè9éfê¯ì°ï³òSõ“÷qù¬úûû‚ûÖüËþ¦÷üEûû°ØÄ&u w [ ? ð B ~ Q 7x×,y»›d¯Ñhoá (`R ¼ îàVèþü¶ø'õ&òð–î1í®ë9êóè©ç/æÔä=ä½äëå÷ætç­çèµè.éTéœé¸êíìÚïÏòfõŸ÷vùªúû ûbû˜üeþG5Fa ©Ã ó87  Ò 7 ‡ c !HŠø_[Êá<o;ÏŒNvÉÉ < q uþ¤ÿçü‘ùöó ñ—ï7î¸ìLëêØèjçæ€å÷åç èrèšèùèéûéêDêLëníDð#ó¤õÍ÷˜ùÄú#ûûXûyü+þ¿ÿÖ°µÉhSïýÒUN9 4  u Í © _€=7´, ¦reB§äÖŒrT–ý … À jÕq+†ý<úÂöÕóËñYðøî{íìòêËémèç‚æëæðçÌèé/é€é êmêqêŒê~ë‰íGð óõŸ÷kù™úôúÖúû ü¡ýÿÚÚñ“~é*[SHX B Ë 4  Ó ó¬¡#ª4QÙBD,›å°ÚæèA»Ó N ‰ .œC wþ:ûÄ÷ÔôÀò>ñÑïPîóìÕëºêié$è’çúçïè±éèééé3ê½êëë3ëìîÁðxóàõý÷Ãùçú:ûû?û3üªý÷þÍÿxaeóÄ@ ¿ÖâÀ¤¦‡ ~ p ) ?çÒYò“Ílíý}âÓTWÅQü<Î  ÐY ˆÿ[üíøýõßóNòÒðGïæíÇìªë[êé‰èëèÌésê•êŠêÍêRë¨ë¢ë±ë†ìuîñ¹óö<ø ú0û‡ûkû–û}üÞýÿ×ÿ~hn÷À4ˆ{H!ùøñ © ² R6ÂeOù‚¡‰ˆ3|Çk)pÿ C  ¢‚~ ðüŒùöwô×òOñ¿ïZî6íì¹êwéÛè*éðé{ê‹ê{ê½êAë‘ëˆë”ëaì9îÃðaóÅõê÷½ùêúEû1ûcûEü—ý¼þ|ÿ-'9РæaK9 óùßpòô ©   , ›IýDòyŽuÛ43Íë:Gfó 5  º¿àŒý<úN÷%õóùñyð*ïîÿì´ëêéé*êØêFëBë.ëtëþëQìCìCìùì«î ñ‹óÛõð÷®ùÈúûíúûØûýþ¦þMÿFZóÅ7ügG:"$B<熣 i b íÔv<Zž«‡á68×í09 SÕ Øœ°á˜™ýIúU÷õtóôñ…ðFï>î,íêëÂê7êvêëtëhëVë¢ë-ììnìhìí½îñ˜óðõ øÌùäú4ûûFûü3ý0þÝþ–ÿ¢Â]-–M®ˆ€u‡³¶i & Ú · $÷OSögQ Foÿ G”S(o í $ þÙI ý¹ùÁöôÑòUññïÃîÉíÅìënêçéê±ê ëëþê]ë÷ëVìMìOìí©îñ‡óëõøêùû~û€ûÆû£üÔýáþ¨ÿzÇe6ŸP§vg]p›šF ä ê ƒ Dšdû´gœ4ž%O}eó?ŽT/t ï + 2l ý³ù«öSô‡òõðïDî6íìÏê™éõèété³é¥é¥éê•êïêîêýê¿ëqíÐïaòÚô÷ùOúÛúûqûlü»ýîþèÿî8z& ‰F¡o_WhŠ~ " ¹ ´ 6 á-üœSú!³!¥ÅíÑXZ‘á«‰Ë B ‹ ŠŒÃîŒpýúìö}ô—òïðiïîïì·ëTêéKè?èè¾èµè½èé¢éðéðé êÕêììî€ñÿóMö=ø‹ù(úoúòúüiýÃþóÿ3©ÈÇhD®ˆ…‹§Ê ¸ V æ Ó 9ÄøºTüŠ› ‰fõùÕE+GˆGN ± í îö,JÜÿ¾üWùEöÖóìñBð¾îlí=ìúê’éFèƒçlç«çÔçÓçìçXèçè>éQé‡égê2ìŸî@ñÎó'öøuù#ú‚úû4ü¢ý ÿR´Dµ†›ZR϶ÁÕ÷   œ ( SºÔˆ¶+%œþÔSA9ñG 7塲 ð  ANÎþ©ûCø3õÀòÌðï—íDìëÏéiè#ç^æ:ækææ›æËæJçåçIèuèÑèØé»ë=îóð—óöøzù;úµúhû•üþ”ÿ•KÓ¼ëËäwj€   Ì í Î ]ܨӤ$¨üÕ3„I®xJృˆ¼ ± Ð ÚÉÌõóÿ_ý0úÏöÃóWñlïÉíYìëþéÈèoç:æ„åeåšåÊåïåCæåæ ç#èqèóèêì­îuñ.ô²öÎøIúûªûqü©ý.ÿ¹>å®C5oWr é ô - ;sÎndh)œù^’K‹¼]œ?ìd€ ËÆVõ å (dvþöûÝø•õ¡òIðyîôì¤ë‡ê†énè3çæzåkå®åñå,æ™æRç!è¸èé¥éØê×ìjï0òäô`÷uùìúÅûYü(ýiþùÿ“)à³L@  h †    34íQ›"üä‹è/|˜8b}(­7†{ævö ˆ l†–—²òþ ý‘ú‡÷Sô|ñCï“í0ìëê+é=è*ç3æ¯å¹åæsæÊæQçèÿè¦éê®êéëëíyð3óØõGøRúÅûü-ýõý1ÿÀaþ¹(  ^ H a é à ¸ ° ¯œC’Á&Þ¬=†¹ñú‰¦¶,7¢D#ƒ( ‹  #F^“ÿèýü¿ùÓö¿óñëîTí ìýê(êwé¶èÎç÷æ‹æ¦æç‡çôçèoé]êëˆë&ì]íPïÇñeôïöEù?û¦ütýöý¤þÆÿ=Îcé~ o ¬ ˜ Ê ¤ „ oRõ@d²Jùq©Ïüý‡¡«c»Þ³Ã· @ Õ¼åL þýgû6ùuö‡óíðéîeí.ì2ëxêêéSé–èàç‰ç°ç%è¡èé´é”êë6ì°ìHísîUð¶ò<õ¯÷õùãûDý þ€þÿ'’®a. ² î Ï Ï 0 ß § y ]@å.H† §6JcTÕæçF/p¶Ìœýµ ³ > Ó¾î.oÿÓý^üÉú¹øöQó×ðïî„ígìŠëùê™ê/ê›ééÉè é“éê›ê:ëìí´í(î·îÊï’ñÐó1öø«ú„üÏý€þáþfÿZ¯"œ5îu ^ — t l À \  Ò ª †+sŠÃDÛ@]fvaåúþ^D½Íšþ ¿ Ê bû;ßþRýðûqú}øöZóÿð4ïâíÜììë\ëë¨ê8êêjêëŸë$ìÁì—ízî#ï’ïð"ñÓòüôA÷sù}û:ýlþÿHÿ²ÿŠÅ%Ž·+ 7 ó 2 · T þ  -vÅAÔ5NLO0²Òà I 4 p °  ÷ À Û ˆ=L§ŠþýÇû^ú…ø,ö£ó`ñ«ïlîzíÆì[ì)ì÷ë ëIë<ëžëFìçìlíîÃî–ï8ð¦ð/ñ3òÙóñõ)øJú@üéýÿ¤ÿéÿS-kÍ4±B¤ { ¦ o I s Þ b ñ ˜ I Ï ?®4ˆ‘w_* » Å &  7 l v ? ¥ t Ÿc.SÉWÿâý…üLûÿùIøöµó‘ñðïÈîéíFíéìÅì¥ìbìì ììCíïízî ïËï˜ð:ñ¨ñ+ò$ó»ôÃöìøþúæüƒþ£ÿ3rÓ¢Õ-‡óq ‰ © b ' 8 Š ó g ô ÿ ' # = ž inN.ó g ƒ ‘ ñ Ô C S (   ‡ Ì«’ÒhÿÉýŽürûAú¦øŽöBô/ò˜ðrï’îíííkíMííËìÎì<íïíŸî.ïÄïðMñññeòðòñóŒõ’÷µùÂû§ýDÿeú;›g˜ïJ²( k ! 0 × ƒ v £ å 4 ¡ | z ‚ Ò A „ € Y 0 í Y q ~ Ü ¶ â   ò r d¶©« Æÿ þ|ýjüsûbúäøäö¬ô©òñöïïyî"îîíí³íví€í÷í³îkïð ðañ,òÎòBóÎóÒômöpøúüþ1ÂlB|ÞC´- i   ª A  ' H v ¿  G 2 ú â  ^ ‚ d & ä „ Ð Í Åßý$*üzqÒ߆ÿ`þ^ýeü„ûºúÍùqø”öô¢ò2ñ&ð^ïÔî“îˆî€î[î9î`îîî¹ïð/ñäñºò‘ó;ôºôUõdöøúüþðÿv€E¨u¡óM´  A Ë ® - « a G ; > [ „ ‰ N ø É Ü  â ™ L Þ ! sEcŠcãáT{ÀÿcþYýtüûáú8údùøYöcô¢òLñSð™ïïåîáîàîÇî·îñî‘ïjð?ñÿñËò·ó ôYõëõŸöÄ÷xùûœýžÿqóóq°Øö7‚ Ü 4 A ¬ o Ó 7 Í ^ > 7 8  µ A ù ñ  ð ª T ý‚¹­­ Ýú!*…‰ O¸þ|ýüÈûû}úùùDùøröôúò¼ñ×ð/ðÀï”ï—ïšï‹ï‹ïÖïð\ñ5òóÝóÖôÈõˆö%÷ç÷ùÓúàüùþöÂ8,¡Þ=õû$ [ £ â Ì ³ õ 7 ¨ > ä — c 3 à [ Êe=*ù¢BâZƒolÊž¾íð†ŸB¯þ?ý(ü^û¼ú9úÝùù ùøŠößôbóJòˆññÄðÁðåðññ0ñ•ñOò7óôùôìõøöõ÷¸øVùúMûþüþþ þºë>Y•$üø 6 V 7ª ¿ Ó  ‚  Ÿ U  ¢_èª~8Öu´¢¥ íT‚+Xÿ™ýFüKûœúú½ùŽùnù ù$ø½ö(õÀóµòò“ñeñyñ³ñäñò3ò©ònó[ôDõ,ö.÷IøOùú´ú{û°ü`þ\hXb)oz¦ Ý ¾ ¼ × ç “‘ä Ø Î ô A ¦ & ÃbÝ+sêšZœ=ãYzbcÌÿ²ÿæÿ.iz6tÿAþãüªûÄú'úºùzùkùiù ùEøèö^õôóVòññÏñïñ4òqòžòàòeó3ô$õö÷ø=ùEúû¡ûcü•ýAÿ69!ÌÊ , — B    ¹ŸÙ · • ¡ Ó  … •ü<}ëCå}#ÎEfQ[ÿÌþµþíþ;ÿ|ÿ“ÿTÿšþuý*ü û6ú«ùTù1ùAùZù$ù\ø ÷‘õ?ôDóœò9òò@ò‰òÏò ó_ó÷óÒôÌõÅöÆ÷èøú.ûûû¡üpý¬þZNL/Ñ ± â Þ õ R ê ª ’ š âÐ • „ ˜ É‹WÈ2Íu¦Oüwž˜ÿ²þ3þ'þgþÀþ ÿ-ÿõþEþ.ý÷ûêú)ú®ùiù^ù†ù®ùùÂø÷öÇôÌó!ó¼ò òÆò óOó‹óâóyôKõ9ö)÷)øJùyú‚ûJüñüÂýýþ¤Œ€Zô ¶ ß Ú î B Ñ v € rê­Ì ‘ M * . SŸ tÀî%‡«=Ö‡8¸ëÿòþþ¨ýýÝý<þ”þÀþ‘þíýêüÉûÒú#ú¶ùƒùùÒùúóùEùø¸öxõôÚó€ósó§ó÷ó?ôôÝôsõ>ö ÷øù$úOûQüý²ýyþÿ*ùÚ¥/G Ò ñ é ü G Ë € f m X̆ž ]  Ý Ö÷A£þ5Nr¿1°.¼e…ÿ³þ¼ýêüuüiü­üý…ýÆýªýý7ü=ûlúÞù‘ùù±ùúnúgúÐù½øv÷Fö]õÆô‚ôŽôÕô.õ{õÀõö®öl÷=øù ú$ûBü3ýâýuþ-ÿ:ªb5ù|Ž  0 ' 6 w í ˜ y z X»o‚ ; à ž ‡¡éG˜ÂÐæ záOÖÿyÿÿ†þ¯ý¹üæûkûVû“ûü{üÉüºü:üjû‡úÈùHù ù ùXùÕùDúOúÎùÖø©÷‹ö®õ&õøôõtõÙõ,öxöÞöp÷)øöøÓùÌúæûýüäý‹þÿÎÿÒ4Þ®róû z „ Œ  - Ð ¯ « ~Ó B Ú ‡ atºWpnuŸä8›ÿÿ¹þOþ°ýÔüáûû˜ú€ú¿ú8ûÂû!üü£ûÜúúVùáø°øÉø/ùÆùJúfú÷ùùý÷ìöö‘õqõªõö‡öâö5÷¡÷6øíø¶ù”ú”û³üÊý®þTÿçÿò[!¡       ' ‚  õ î ·ü˜Ÿ G Í ` "&e·ìòߨñ$eÿ¼þ:þÙýoýÎüòûûDúËù²ùðùqú ûuûvûûú5úeù»øJøøCø¾ølùú-úËùüø÷÷ñööõõÞõböâöF÷¢÷ø¸øsù@ú&û8üiý‹þsÿ½‡ÛwF Ÿ ž  ï ä ý I Ø ¯ ¥a‘ ¢ | 0s•‚V:;Rÿvþºý.ýÈüVü¨ûÄúÚùù¥ø…øÂøJùóùpú~ú úKù†øæ÷|÷U÷Œ÷#øðøŸùàù—ùãøû÷ ÷FöÓõ×õGöíö‰÷øsøþø­ùpú@û+üGýƒþ¨ÿŠ0ÌÔ] ï v k Ä ¶ Š m r ¨ ' ö èš¶% è : »±íß qaÿaþqý¨üü¹ûDûú¢ù¹øø•÷x÷´÷EøþøŽù¬ùFù‘øØ÷E÷æöÌö÷Ë÷½ø‡ùÙù ùù5øc÷²öTöoö÷Î÷Šøùšù/úáúŸûgüRývþ¿ÿçÁ[í©¡ÔG÷» ? , w X  ã É à J ù¢¨ýÍ H ” ÕD 0u“n)ðÿÌþ´ýªüÏû=ûÚúbú¤ù¯øÁ÷ ÷žöxö¤ö+÷è÷…ø±øYø±÷÷xöö ö]ö(÷7øù…ùcùãø7ø÷åö˜öÈöy÷løNùÿù—ú=ûøû¶üxý[þ{ÿ¿â±@Ë€j†Ûo " Ÿ Ó ® g *  i % ¯¶Ù X £ Û:÷eq-ïÿÂþ™ýyü„ûÜúgúÞùù ø÷NöÏõ‘õ õ öºöU÷„÷2÷’öíõoõ#õõ‡õmöž÷«ø:ù@ùéøhøØ÷[÷(÷v÷KøhùtúJûü¼ü†ýKþÿóÿ[~DÄ>à°§Ó> Î . 4õ ” : ö à $ Ï ¨>4y: ® í iA•ȵz@ÿþÞü³û·ú ú•ù ù1ø"÷öOõÂôoôeôºôWõêõöÊõ5õô)ôçóîóiôkõ¾öï÷ øÊøøHøâ÷Š÷z÷í÷ìø8úuûyü\ý?þ#ÿøÿîÙ'N•­pO X   M"Ñ_ð Z | ÓS4j# Ž Â Ü»Õ$VGÛþ¦ýdü!û úIùÁø#ø9÷ö õ8ôœó3óóJóÓóXô{ô(ô—ó ó¢òeòrò÷ò ôwõÇö™÷è÷ç÷À÷…÷P÷c÷ý÷'ùžúü4ý@þJÿL3ö(°}ÿz Ð œ ½ Eêñ’•Î Õ Q}S3 ™ Ä ÑŸ· @1þÿÉþ’ýDüëú¾ùéøTø­÷ºö“õ|ôžóõòzòCòoòðòqó”óBó¸ò9òáñ°ñÁñKòkóëôSöC÷¬÷Ç÷½÷œ÷}÷¢÷Tø›ù0ûµüþý%ÿJdV& 1ƒ¬sí^ ï – G  ' fyòójã y f Ë tà¯Õ „ ç 4Ëä=wpIÿ$þûü²ûUú ùGø¶÷÷.öõô2ó“òòåñòò%óRó óò$òßñ¼ñÓñfò•ó*õ©ö®÷,øXø]øHø1øYøùdúü˜ýïþ&\‚w@7…©h Ö 9 » O è ž “ ¹µ(}äL± .  [ ü g1Q ü Z wn‡$y´°ÿþsýPüûŸù^ø~÷ìöQönõXôXó“òò“ñdñœñ*ò»òðò·òNòûñÌñºñÛñpò«óPõãöü÷‘øÒøíøìøåøùØù4ûÞüwþ×ÿ[ˆx2õý8M ý ] ³ & ¬ 2 Ð © ®Œßc¿  { 9 z o 1 L ó S wu–+G¨ôÿÿüýüüòû»ú`ù(øT÷ÐöGöwõsô„óÑòOòíñÄñþñò óZó*óÏò‹òlòbò†òóQôùõ÷¬øCù‰ù¨ù¨ù ùÏù…úÓûtýÿ_žÛåC=n~ ) † Ù J Ê H Ú £ ™i¶oÖ-ƒ Ì # Î ü | Ò ’ ª T ·ßßüަUÿoþtý‚ü…ûZúùÔ÷÷…öö=õGôgóÃòLòóñÎñò•ò(ófó@óóò¼ò©ò¨òÑòfó™ô>öÕ÷øøœùòù"ú0ú0úbúûXüîýtÿÅþ6W5Õ{e„… % | Í = » 5 ¿ ~ h.u-–ó O œ ñ — ¼ 3 B e  ‘ÈÔ÷ˆøÿAÿ[þeý|ü‰ûdúùà÷÷‚öúõ5õDôióËòXòÿñØñ òòóZó9óöòÍòÆòÎòúòó½ô]ö÷÷"ùÕù=ú€úŸú«úäú˜ûØüfþèÿ8t°Ò­C۴ĸ T ¦ ô \ Ð : ± \ 1ãÍ1‡ Ù  Z æ ô V – O s . ¦áò¬Çÿ)ÿþ«ýÉüôûûýù»ø‘÷ÂöIöÓõ#õKô‰óóŸòUò8òqòýò“óÛóÈó•óxóyó…ó°ó@ôgõÿö“ø¼ùpúÜú"ûEûPû„û0ühýðþpÄDg@Ò`-0  ® ý G ª  r Ô e ¸Û}Ô  ` ¾ 3 % m – ? Z ŠÄÔúˆÿœþþbý ü×ûûRúTù%ø ÷HöÙõsõ×ôôsóó´òwòaòšò#ó¶óôúóÓóÄóÒóéóô²ô×õi÷÷ø!úÔúAû†û¦û­ûÛûü±ý6ÿ¹b¬Ø¼X뻾 ª G £ ø c Ï & | ö —!¯õ + [ w — û ×  ´ Ãrá4»þÇý(ýŒüÔûû`úŸùªø†÷wö¾õVõûôqôÌó@óçò®òòwòºòLóêóGôRô?ôCôaô‰ôÍônõœö.ø»ùèú¤ûü_ü|ü}ü¡ü9ý_þÙÿS­ô8[3ÆN ý Ù l Æ  ~ Ü ! b È R¼º=z ¥ È Ø í G  6 ? Òã—78Rÿ×ýäüIü¹ûû`úºùùø÷öSõóô¢ô-ô¢ó3óôòÎò¯ò°òóžóKô¼ôâôêôõ>õ~õÛõ‘öÑ÷pùûAüýýÜýõýíýþþ¥ÿ|Çþ,4ðeÏm < ù u ¿  Z ¢ Í ô @ ³ ö n ¢ Å á ë úO+.ÀÖ-*BþÇü×û?û³úúlùÍøø6÷!öõjôôºóSóàòŒòbòLò=òPò´òjó2ôÄôõCõŠõèõOöÐö¥÷ûø¯ú[ü¬ý’þ'ÿ|ÿ“ÿ„ÿ•ÿzÛEaSñF Œ  ¦ @ ¢ Ù G p { „ µ  Q 4 © ß  " + :ŽReh,ómš˜ÿ®ý5üGû°ú*ú“ùùødø·÷Ðö»õ³ôýó˜óNó÷ò›ò]òFò<ò7òVòÆò‰óaôõoõÁõ%ö™ö÷Ÿ÷~øÙù‘ûDý£þœÿ?š¬“˜ Tªå # — Ö  ^ ç n Æ û , [ r g Z w º ç º % S n z of¡IA0Æí³$D5þAüÀúÌù3ù±ø'øž÷÷}ö¥õžô¤ó÷ò òlò6òòòñòò1òqòóâó×ôžõ-ö§ö/÷Â÷Sø÷øæùFûüü¯þ ¬þ×Ì/K¹ÔÞµ 5 c ~ À . œ æ  : \ b G * 5 c y 8 ™ Á Õ ØÃ°Üu[9Åê¯7ÿ%ý2û°ùºøø÷÷¡ö-öõÐôÕóéòHòúñÔñ³ñžñªñÔñò;ò—òBó8ô@õöÅö^÷ø¬øNùúþúfüþÌÿ*%ÅѽëBe{} D ° Ì Ó  Y ² ë  - D >  ð ð     E Y W<&Réˤ,Q…žþ‹üžú#ù/ø–÷÷§ö=öÖõMõƒôŒó©òòËñ°ñ ñ¢ñÇñòNò™ò óÏóÔôçõÏöˆ÷4øéøùFúûüqý$ÿÉ žÕºuU¦s‰¬ÃÍ¿ o À à · Ò  \ ‡   · Ä ± } N E X N ñ D j }wXBr ìÂIo:¬ÿÈý¿ûäùø¤÷÷·öWöö«õ/õnôóªòòæñ×ñØñòñ1òŠòåòDóÎó¦ô¿õàöÔ÷šøTùúÑú~û8ü;ý¢þHÝ"‡®&õ9ú ø “ Ì ¸ ” ˜ Å ô   + . Ê  Ž }  j ‘¦¡g•*ÔX€QÉþêüæúùÆ÷ýöŠö3öæõ¥õbõõôDôdóœò"òöñõñ ò=ò–òóoóÜótô_õˆö¶÷µø‡ùOúûáû’üMýKþ¬ÿDÉÿÕLbµy²kfjcS * ¸ ä à • Ž ® Ò ä í ø õ É ~ = ) 1  « ó*"üÞ”c& Ñÿþ$ü%úbø ÷döúõªõgõ6õõ¨ôô8ó~òòíñôñòLò¯ò$ó”óô«ô õÐöÿ÷þøÔù¤ú{ûGüþü½ý¼þª%Q‹•GØÙ†„zj A Ð ù Ö ¦ › ¸ Ú í ø  ö Ä t 3  ü ‡ ÊìþóɤÃBµ&?ÿhý€ûùÃ÷ŒöØõtõ-õøô×ô·ôjô×óókò òôñ ò=ò‹òüòzóòórô#õ!öW÷†ø‡ùcú<ûüîü©ýjþfÿ¶;¨Ç†ãÜ~ɲž’k : Á á ´ z d u ‘ ¢ ¬ ± Ÿ g  Ø Æ Æ Ÿ + sž»»ƒ¬1ñ¨9øþYýnûsù¾÷‘öèõ‹õLõõõéôœô ôJóœò5òò2ògò¹ò(ó¡óô‘ôAõ<öj÷‘øùgú>ûüìü¦ýiþeÿ°-”­g½®N٨靖”† W Þ  Ö † • ¯  ΠР¸ w ! Ý Â ³ { ö5YolL3XÕŠ4ŸµÿmþÆüÚúèøB÷!öƒõ0õúôØôÉô¸ôvôïó?ó¡òGò9ò^ò¢òóóô‚ô õÊõÏöþ÷"ùúîúÄû üoý(þèþÞÿˆÞæÕºU㺠ȼ¸¯  p ô  ë ² — ¡ ¶ Ä Ë Å £ [ ÿ ¶ ’ u + —ËèúñÌ®É8ÝxÙÿèþŸýûûú1øžöõþô·ô‘ôƒôô•ônôÿóeóÛòòŽòÀòóŽó ô¹ôJõçõµöÃ÷ôøúûÝû¶ü•ýfþÿØÿÁî?{p E ´= UêØÇ´ € ÿ  æ n ` a a a Y 6 ë >  äŠé2GE)0š7Ìÿ*ÿ<þüüfûù¹÷6ö6õ±ôwôaôgô†ô¢ôô3ô¨ó(óãòáòónóîóŒô0õÌõpö@÷LøvùŒúwûFüýøýÊþ†ÿC.UšÆ¯BwNße0s ñáÎ ˜  + õ ¥ j N A 8 3 +  d  ݪGžÅÝïîÕÄæNãÿlÿÀþÍý‰üóúùL÷ÌõÎôJôôôô<ôaôWôôˆóóÐòÏòó`óëó–ôHõòõ¢öy÷‡ø°ùÆú³û‰üeýIþ#ÿçÿ­œÃ( ŸÖ®?ÆÅg@(  Ê > M ´ m C +    ô ­ N øºzb«ÄƱ¥Ë5ÈÿRÿ©þºýzüäúù7÷¯õ¦ôôÕóÃó×óô/ô$ôÓóTóÝò›òšòÑò9óÐóŠôJõö¼ö˜÷¥øÊùÝúÎû®ü”ýþ_ÿ'ôç IjLÝçtõµßn8 ê ª   Ñ r # ð Ó Ä Á ¿ ¥ e ¼}9Ë&^Œ²ÃÀÇv¢ÿÿþÝüKû{ùª÷$öõô9ô&ô;ôiô‹ôuôô“óóÇò¹òæòFóØó‹ôFõùõ°ö…÷ƒø•ù˜ú~û[ü>ý&þþþÅÿ“ˆ­æçy¯‡Ÿdãɽ­ p Ü á › = í · ™ • ‚ L ý²r(·W“Äßçú>¼XêÿLÿkþ6ý«ûãùø›öõòô¤ôô¤ôÕô÷ôßôôùóxó%óó6ó“ó%ôÚô–õHöþöÏ÷ÂøÂù¯ú…ûVü2ýþâþ¢ÿj\y§»”#Y3ÈSDÈ…bS? ý a `  ³ _ $  õÿ  Ö’NËZ¿\¡Íèdî‘%Œÿ³þ‰ýüFú…ø ÷ûõXõõãôöô$õAõõ¸ô*ô¦óPó7ó\ó½óXôõÜõ”öM÷ø ùúåúµûˆülýRþ'ÿéÿ³¢¹Ûäµ@vOãl0QÄm6÷¥ ø æ Ž ! ÀZRf„c*óÁ}‚åK¦æF¤1ÒcÉÿóþÏýTü›úäør÷gö¾õ`õ:õHõqõ‡õ^õíôYôÒóxóZózóÜóxô8õüõµöo÷Cø3ù'ú ûÝû¹ü¥ýþeÿ#ëØèÿûÄHyOâl/M·Té¿a ¦ ‰ + ½`÷ó 0;!òÚ_ÿ€÷qÝ'Y“ó}š÷ÿÿòývüºúþø…÷oö¸õIõõõCõRõ#õ¯ôô”ó<óó9óšó;ôõÒõ”öW÷1ø#ùúûàûÈüÃý»þšÿ`-'5%åf˜s —VlÍ`íÅi ¯ ’ 6 Éhñæþ%7$ùÊ^û|ú|ñCy¶œ+¤óÿ ÿáýgü°ú÷ø}÷eö©õ5õõõ-õ@õõ§ôô˜óDó&óBó¡óEôõëõ¶ö~÷YøKù?ú%ûüïüïýëþËÿV;<<ÍEtNçu3A™#Ò¢w b F í‚#Ú©œ´ÝöêÖh'ÂDÆPÎ(d¥Š„ÎÿçþÂýTü­úù•÷‡öÑõaõ1õAõtõ—õ|õ õ£ô2ôéóÏóëóHôëô¾õ›öl÷9øùúñúÍû¡ü†ý‚þzÿSϦ“y=Ò4U%µ9ìé)™0ì²Mm¤=榌Åáܽ™s7Ødö•+ ÷QÈYêa¶ÿßþÐý{üïú]ùø÷YöïõÅõÝõöSöMööŸõ@õõéôõ\õþõÒö²÷…øTù0úûúûÆüŒýfþVÿDÇx=×xï9E‚ós”áXù¨1g@àmÿR1Bo“™ˆs[,ÚuÍz |ñ‚)ÌU¿ÿÿþÖüdûìù¨ø¹÷÷´öö¯öøö6÷;÷÷¨öSööööxö÷ò÷Ôøªù{úWû=üýÞý™þgÿK-ï’2âIÏ,]Q÷[¯.ïìcápÝúÁPÎQáŒg}³åüÿÿæª\ë·gþ˜JÍpõÿXÿ„þiýü¸úŽù±ø øÊ÷²÷Û÷+øpøzøFøñ÷÷_÷@÷Q÷¦÷FøùøùËú™ûpüNýþ×þ…ÿEî¢7Èf˜D]9ÈWÀjLWŒðh½Æ~vísò D|œ­½ËÀ–_6" Õ‰Aì¾wÿÔþÒý—üWûFúùúø²ø§øÝø9ù‰ùžùvù-ùäø¬øø¢øùø™ùjúEûüÞü°ý…þHÿñÿ‘E Ëkîkózê4XRƒºå9Ë’‚ŸíO‘Š9»/¦+ΩÁÿ=hˆ©ÆÉ¬…oniIîÚж*¶ÿ ÿþóüÇûÈú úùIùAù{ùÚù,úHú-úöùÁùšù‰ù¢ùú¦ú{ûZü/ýþ×þ«ÿh £M¹I¿2®#z¨°2‹ª¾öfÒÌù<bEçcÕJËÿmÿIÿfÿ«ÿôÿ,\ŽºÍÁ¯±ÆÖÍ´¦«µ¬ƒ>Øÿ<ÿ\þDý&ü2û|úÿù¶ù®ùéùJúžú¿ú­úƒú[ú>ú4úRú²ú\û4üýëý¾þ•ÿc°@ã–>Æ5£„Îìå·N›¯¸â?ÇvVkš®rÿîþŒþgþ„þËþÿXÿ“ÿÐÿ6U]X_z—ŸˆWÿ´þ°ý¤ü¿ûû”úJú@ú~úäú<ûaûVû7ûûûþúûû-üýãý·þ†ÿWÅMÐf ¢qÎ4‘ËÜÊ“"cjf‚Ë<Ô¢©Êј'œÿÿƒþþ£ý‚ý¤ýïý?þ…þÈþÿPÿrÿxÿ|ÿšÿÌÿ÷ÿ(XŒªªUäÿ(ÿ4þ7ý\ü³û7ûëúàúûƒûÚûþûöûÜûÅûµû²ûÓû5üÝü±ý‹þ]ÿ,ÿÅfçbò…Ù2•î$1än­®£³ëCÀuep`‘ÿöþYþ½ý+ý»üü¥üèü2ýwý¿ý þJþiþlþpþ‘þÈþ÷þÿ!ÿFÿ†ÿÉÿöÿãÿ‰ÿçþþ,ýhüÏû]ûûûkûàûEüvü{ünü`üVüUü{üâüýhþGÿöÌ%›™/³d¹lž¨”[å#&&P–¦Š‡ftÿÈþþfý¾ü;üüûü=üü¿üýMý†ýýšýžýÁýúý*þEþ]þŠþÑþÿQÿoÿzÿhÿÿŒþÇýùüFüºûUû!û6û—ûü’üÑüäüåüãüáüéüýˆý=þÿþÿÛ¸NàQÁG×P¦ë6‰Ïôõ×”D>+-JÝuK8•ÿòþ9þ{ý¼ü üƒûCûMû„ûÉûüaüµüõüýý'ýVý™ýÒýöýþPþ þðþ.ÿVÿmÿfÿ'ÿ¡þéý,ý‰ü ü¬û„û§ûü§ü#ýjýƒý‰ý‰ý…ý‹ýºý-þãþ¾ÿž|X-ãlÓ<»B±ý7u¹ìôÎô÷ñ1„çÿÐÿ•ÿÿqþ¯ýåüü\ûÐúú˜úÎúû\û®ûüDü`ügü{ü³üýü=ýfýŒýÇýþeþ¤þÔþúþÿÚþiþÇý ý“ü(üßûÌû ü•üAýÕý2þ_þuþ€þ„þþÄþ@ÿÿÿÞŸzJ÷tÐ.£|¶Ü/F=Ýäüย¥ÀŽÿWÿ9ÿ÷þwþÆýþü,üVûŽúûù·ùÂùùù?ú‹úâú:û}ûšû¢û¹ûóû@üü¬ü×üýiýºýüý2þcþ~þbþþrýßüfüüØûÙû+üÎüý8þ§þçþ ÿ#ÿ.ÿ?ÿ{ÿʵŸ‚a2ÜR¤úeÕ)Wr©«ŒSžôþÔ¢…”Öÿ]ÿ'ÿ ÿÉþJþ™ýÑüûûûNú·ùuù„ùÀù ú[ú¶úûUûpûrû„ûºûü@ühüüÌüý^ý“ýÀýìýþìýýý}üüÄûšû§ûü·ü‰ýBþÁþÿFÿfÿuÿ‡ÿÆÿO ïÓ©UÇaÄ,x µÊÚÏŸW’å뾋nj}¿ÿGÿÿùþ¼þ?þýÇüîû û3ú˜ùWùjù«ù÷ùIú¥úû@ûSûNûVû„ûÃûöûü5ühü©üâü ý0ý\ýzýfýý“üü¹û~ûgû‰ûüÊüµý‚þÿuÿ·ÿáÿõÿ RèÇÆÀ¯—l{ºûR®î    î£CÚWš”]#õ@ÿÉþ™þ‚þIþÓý,ýhü’û®úØù=ùù"ùmùÄù ú„úäú#û3û)û-ûWû”ûÆûæûü:üwü¨üÇüæüý0ý!ýÔü`üñû¢ûuûmûŸû'üýýýÛþÿðÿ@uªö“y~~pX(Æ"T‡Ð Q ` \ T =  $¥F5ö¶}ˆÿÃþLþ þ þ×ýgýÆüü1ûLúsùÙø¡øÄøùsùÖù>úžúÚúãúÓúÒúöú/û_û€û¥ûÚûü=üTülü‘ü²üªühüü©ûkûMûSû•û.üý%þÿÎÿU¹ý#GžF6FRPA´ ; i « ð  %   è —  ùPrT Å•{{ÿ«þ)þñýÓý•ý!ý€üÁûçú÷ùùnø+øAøˆøÝø9ùùøù+ú,úú ú)ú\ú‰ú­úÙúûTû~û—û³ûáû üüãû–ûRû*ûû4û‡û2ü.ýLþQÿ#ÆCšÍü\ !5=7 « ý ! C w ¬ Ê Ë ½ § t  „ äAŠžs!Ï’gVÿvþçý¢ýzý7ýÃü&üiûŒú”ù¦øù÷°÷À÷øSø¯øùnù ùœùùsùŒù»ùèùúHúúÕúû"ûGûû»ûÐû±ûuûBû)û+ûKû§û^üeýŽþ¡ÿƒ9È+e—÷®¬ÇÞè㺠O ˜ ² È ï  '  ð ¶ G « üNŽ›iºt?"ÿ9þ ýSý$ýÜügüËûû0ú1ù9ø÷.÷8÷w÷Ê÷(øøêøùùôøåøûø'ùTù‚ùÁùúhú£úÉúöú;ûƒû©ûžûwûXûRûbû‘ûùûºüÏýÿ#Ý|ê(W³b^x›— m ý = K S j €  h J % ã h ¼ þBx|Cå‡:þÿÖþâý@ýêü²üfüíûPû•ú³ù­ø©÷åö‰ööÉö÷{÷ç÷Iøø~øaøTøløšøËøùKù­ù úTú†úÀúûrû®ûºû¬û¦û¹ûàû!ü˜üfý†þÆÿïë¼bÐ,z  Û ] Œ … v u t _ 7 Ú ‹  J ‚ÀõýËx&å±ÿŽþœýúü¥üpü)üºû'ûsú•ùŽøƒ÷·öUöUööÞö@÷±÷øOøMø.øø5øeøšøØø/ùžù ú\ú˜úÝú@û¬ûûûü&ü7ü]ü“üÞüZý)þEÿ‚©£qvœ«âk?5) ï ¦  -  ê Ó À œ i 6  ° ' o©í,B!á¤wVÿCþ\ýÄüwüIü ü¤ûûrúœùšø’÷ÄöböaöšöìöP÷Â÷+øeøføHø9øQø‚ø»øÿø\ùÔùKú¦úëú:û§û!ü€ü´üÑüõü,ýnýÀý?þ ÿQlY«4¤_<ò¾ e Å Ñ ¦ u T 8 Ò › d  ‹ÕXž¿¯‚Y>+ÿ#þCý®üeü8üúû”û ûdúùøˆ÷¸öMöGö{öËö/÷¡÷ øBøAø#øø.øaøøâøBù½ù:úšúåú:û®û2ü üæüýPý˜ýçý@þÃþŽÿ ÎåË…aparÓ}Lì­ H › › e *  Ý ª k / ö¥k©õBopV@50ÿ2þZýÊü„ü[üü¼û9û™úÍùÕøÔ÷÷ö—öÎö"÷‰÷ý÷eøœø—øsø_øoø™øËøù_ùÓùIú¤úèú5û¢û!üüÚüýRý¡ýõýRþÕþŸÿ­ÔåÇ}VcNX¯På®l  U R  Ù ¨ { B þÁ‰:·F•è-#&1ÿAþvýïü­ü‰üSüøûûéú(ú8ù<øs÷ ÷÷=÷“÷ý÷søÛøù ùáøÃøÈøæø ù<ù‹ùöùdú·úóú8ûžûüƒüÑüýVý­ý þmþõþÂÿÐ÷ë£/~ŒvzÉaâ¤[ ì 5 * ê   f 1 ñ¨f+ÚW§ê:Ìâåíÿ9þyýúü¿üŸümüü¡û ûPúeùnø¦÷=÷0÷`÷¯÷øøÞø ùþøÊø¢øœø®øÊøôø<ù¢ù úaúžúäúIûÂû/ü€üÄüýtýÛýJþÚþ®ÿÂðó³E›¯¡«ù‘L΂  W I  ³ p 5 ð¥b'Ú^´ýQ©è 7YÿþÆýLýýôüÅüpüúûeû¦úºù¿øó÷ƒ÷m÷’÷Ö÷.ø’øéøù÷ø»øˆøwøø—ø¼øùgùÒù(úiú°úûûûûLü‘üáüDý­ýþ°þ‚ÿ”ÀÖ¿}bwkxÈ]×”G Õ   Ê { 9 þ½x;ÁO±cÁ'5Jl”ÿÀþ þ•ý\ý>ýý»üDü­ûíúú ùCøÔ÷¾÷á÷ ørøÎøù8ùù×ø›ø€øøŒø©øåøAù¤ùôù3úzúÝúQûºû üPü¡üýnýáývþHÿW’{7Ç74I¡;ù¿7 Ê   Ü – \ ( í®wE—Zº]~Œ ÀåÿÿYþßýžývý>ýâücüÄûýúúùQøà÷Æ÷æ÷#øsøËøù/ùùÌøøoøhøoø†ø»øùjù¶ùñù3úúýúaû®ûóûCü¤üý†ý þöþ/D0ñ…â ,-òÀ‹H à 5 < Í ˜ g 0 ô¿NäP­m´Øê#JzÿÈþNþþäý©ýKýÊü'ü\ûkúsù¨ø2øø-øcø©ø÷ø6ùEùùÓøøaøMøGøPøxø½ø ùJùzù´ù úoúÎúûZûªû üyüôü’ýmþ‚ÿ®É¼„!†´Æñ\Ó©z> Ý 8 G  ç µ ‡ R  æº}‡éN±ú#9T|©ßÿ1ÿ¸þvþHþ þ§ý$ý€ü³û¿úÂùòøtøJøZø…øÃø ù@ùIùùÆøvø?øø ø ø+øiø±øéøùGù—ùùùUúŸúäú:û¤ûüŸüGý*þDÿs’ŠYýjŸ·çVѨ}E è G Z 5 ÿ Í h 2  ä°RÌ6¢ X†¤Ç÷+g¿ÿIÿÿÔþ‘þ,þ§ýý0ü6û2úZùÓøø ø¿øðø)ùSùQùù¶øXøøÞ÷»÷®÷Ä÷ü÷=øpø“øÁø ùbùµù÷ù6úˆúóúlûöû£üŠý¦þ×ÿöôÍ|ô4X“ ÚyW) Ö @ ^ E  î Ä • i K 6  »>°"Žß4^•Òrÿÿ¸ÿÿ7ÿÌþBþ—ýÁü¾û±úÎù:ùõøçøøøùJùiùZùù¨ø?øí÷°÷ƒ÷q÷…÷»÷ù÷%øAøeø¤øõøAùùÄùúú ûšûKü4ýRþƒÿ£¤‚5±òPÇ|S4ê›  # ß ¸ “ m L ; 4  ÏXÐJ¾XŠÃM–ø‡B ÂÿYÿÒþ(þPýGü0û@ú ùOù4ù8ùPùqùù_ùù‹øø¯÷c÷)÷ ÷÷B÷u÷•÷¦÷À÷ø÷Eø“øÙø$ù†ùúˆúûÕûÅüêý#ÿKWBŽÙD½rJ-êœ  $ ä ¿ œ x \ Q P < ùˆ„ÿe±ò<Žà25öÄ€œÿùþ%þýü ûZúöùÆù¶ù»ùÈùÁùŠùùˆøø÷÷÷Ñö¢öö¾öåöùöýö ÷6÷y÷Á÷øWøÁøCùÒùoú0û)üUý–þÉÿàÚ­EšÌ†7 îÓ«] É æ Ð ª ‰ k N ; ; F <  ˜¡$–ñE bÀ4Ôœp2ÙdÌÿÿþûýÞüÞû&ûµúxúYúPúNú7úìùiùÅø$ø›÷)÷Îö“ö…ö›ö·ö¾ö¶ö·öØö÷S÷–÷æ÷QøÔødùúÃú¼ûèü*þaÿ‚^ÿ[ÓJöÄ¡‚Y w — ] <   õü  Ònö€~à;  rØPó¿–_¦[ÿbþOýVüû+ûêúÇúºú¶ú úVúÔù0ùŒøþ÷‡÷&÷çöÕöçöÿö÷ôöïö÷:÷t÷±÷ý÷eøäøpù úÂú±ûÒü þ:ÿTV3Ô1c ¯qBç’ú  Û¸š€u—˜h š,¼<¨öhÖUûÉ¥u0ÔW¤ÿ¸þ°ý¿ü üœû]û;û/û,ûûÍúIú¡ùøøbøã÷}÷9÷!÷,÷;÷7÷"÷÷+÷W÷Œ÷Å÷øsøïøwù ú¿ú¨ûÂüôý!ÿ<A Ã#Y˜¢^)ûÇnÓîÓ¦{U6(1EC·IÜkêXÃ7³)›È—vLÁP¬ÿËþÐýíüDüÛû û…û‚û†ûwû4û³ú úcùÊøFøÜ÷˜÷ƒ÷÷ž÷™÷„÷y÷Š÷±÷ß÷øXø»ø4ù·ùGúöúÙûìüþ?ÿY_=Ý9m¨¦Yê¯O«¼™c.ÿÙÇÏáܨLÞpþzèTËHÀ6¿nB&Õ“/—ÿÅþÙýýjü üØûÄûÉûÖûÌûŽûûqúÊù1ù¬øBøøí÷ú÷ øøõ÷î÷ø'øRøƒøÆø'ùžù ú¬úVû0ü7ýRþlÿwp@ÑHxÒVö§d² â¤f.íôÙ‡&Å\àVÏVåoø“R5'÷Èwñÿ3ÿ\þ›ýýºü‹ü|üˆüüœüdüîûOû¨ú ú…ùùÓø¿øÌøÛø×øÈøÃøÕøôøù:ùuùÎù<ú²ú0ûÉûü€ý†þ‹ÿ„k*©æý`ÊMã‰.³õî´hÚ§•ª­‰Có¢HÛbï3ÓpñèîòìÕ›*ƒÿÂþþœýRý,ý$ý9ýYýcý4ýÅü-ü‹ûôúoúúÃù°ù½ùËùÈù»ù¸ùÉùãùúùúFú”úøú_ûÍûTüýäýÖþÇÿ¬~)•½ÄÓZÆFÙpê#Ï{)á«“œ´¼Ÿe"Þ,½X¿qÚº¼ÍÝäÛ®K±ÿÿþaþôý³ý“ý‘ý®ýÙýíýÈýaýÎü0ü›ûû²úwúkúú‘ú’úˆú‡ú–ú©ú¸úÊúóú:û“ûîûKü½üWýþëþÁÿŽKâ;UMOt¸†ŸG4î—CûÉ»Óùß±Dò˜IÞ¥f3*C[moLð]´ÿÿ°þlþGþAþ[þƒþ•þlþþiýÃü$ü˜û-ûðúãúôúûûóúîúöúÿúûû&ûcû²ûüOü±ü7ýàýþ`ÿÐ[ª½±°Ð bÐ[ïg¡“Sÿ­i@=a“³²–qF ¾j&ùÖ«xN@Lg„¨Ž:¯ƒÿÿ×þ±þ«þÅþïþÿ×þiþÍý!ý|üëûûDû;ûLûZûUûFû>û>û=û3û1ûKû…ûÐûü`ü¸ü1ýËýxþ,ÿàÿ†O\OOoªýj÷ J>±d&=x ¤sOË{?Ý®‡z†ž¹ÑÛÀkßA·ÿPÿ ÿÞþÔþîþÿ)ÿüþ‡þäý3ýŠüöûˆûPûJû^ûlûgûXûPûOûHû8û1ûJû†ûÓûü`ü´ü'ý¹ý\þÿ´ÿVÕ'"FƒÕCÒpñ.#å•G ï:³Á¶ ‚N·‚iY;ëÚÝëú çŒüYÌÿ`ÿÿÙþÂþÒþóþûþÆþIþýãü1ü—û%ûíúêúûûûûûÿúöúäúÝúùú?û–ûéû6üüýý0þØþ†ÿ-²ÿ+X›ð`ò”\RÃt83r½ñÿôÞ½„4岟—U+ Úxä@²ÿCÿîþ¯þ‘þþ¾þÈþ”þþlý°üÿûiûþúÏúÖúöúûû ûûûûúåúÜúûúGû¦ûýûIüšüý‡ýþ¾þgÿ “âþ P‘àLÝ‚ RJ »m3<‚Ó ! ê¯\ ÛÎ˶‰V/ þ÷é¸R¼…ÿÿ³þhþ@þFþgþsþAþÆýýcüµû$ûÂúžú±úÞúûûûû%ûû û û2û‰ûóûRü¡üóüYýÕýcþÿþ¦ÿJÒ%ETq£á,”$ÈR˜ŒJò\AZœè)Ø’5Ý« ž‰\'úÙ¿ª›‡QæL§ÿÿžþ:þêý¾ýÃýæýôýÅýQý®üýûVûÍúvú]ú}úµúãúüú ûû*û(ûû"ûWû»û2üžüùüTý¿ý<þÈþbÿ °:¶Ìï#a©ž@Åø±T÷­‰™Ò9:!ûÂl¢k^\G㲈dF/ØiÐÿ-ÿžþ(þÄýsýJýTý|ý“ýlýýlüÈû-û±úhú_úŒúÏúû*ûDû`ûuûyûrû‚ûÅû7üºü0ý“ýôýaþÜþbÿôÿ’/®ú(Cm›Ò'¨>·ìÕˆ%ÁqFOºÙÕ»–^ ¢L#&50翜z[D'ì|åÿDÿµþ<þÏýtýBýGýmýƒý^ýøühüÌû8ûÀúzútú¢úæúûBû^û|û”ûšû–û¬ûøûvüý‡ýóý[þËþFÿÉÿTîˆKfq„¡¾á"‘…¯;ÏcÓÓý0JD*Ð}Ë®Àß騹š|\?)ØnÛÿ=ÿ°þ5þÃýcý/ý4ý_ý}ýcýýüîûaûíú¨ú£úÔúûUû|ûœû½û×ûÝûÚûóûHüÒümýúýqþáþWÿÓÿRÚnx»ÐÓÛéó2’ oh ›'„{ÊßÕ·U›O9U•zaF&óÛ¥?¯ÿÿˆþ þ˜ý6ýýýAýjý^ýýŸüü›û2ûõú÷ú.ûxûµûÞûýûü1ü2ü+üBü”üý¹ýGþ¿þ.ÿ¡ÿ š'—ÓáÝÜßÛÝTÇ'G"ÊZä{9+HpƒvX1ø£?õâ3RUI6þàʱ|ŒÿöþoþùýŠý-ýþüýLý€ý„ýLýëüyüü§ûqûuû¬ûóû,üPümüŠüü›ü’ü§üöü{ýþžþÿÿïÿ]ÍEÉN´åêÞÖÒÈÅä6¥$®AÎf#+JS>í°X󪙹è üéή}f1Ìÿ@ÿ«þ'þ²ýGýðüÌüéü3ývý‰ýdýý³üNüúûÎûÚûü_ü—ü»ü×üóüýýüñüýPýÒýfþíþ_ÿÉÿ0˜ÿnëgÄíçѾ­—‰¡ï]»áÅy¤?þñ -7$Ö™AÝ•†©ÛüýíÔ´˜‡tBáÿXÿÇþDþÑýeýýîüý^ý§ýÃý¨ýeý ý¬üZü0ü=üwü¼üïü ý"ý6ý=ý/ýý)ýrýîý|þýþkÿÎÿ-ŠæKÀ4ˆ©›}bG'$oÛ9bN ­C䨠ÀåòãÅže¶ws¡Üü߯¹«~ÿÿ“þ þµýbýCýhýºýþ(þþÕý~ýýÈü™ü üÑü ý4ýGýRýZýVý<ýý#ýeýÛýbþßþIÿ©ÿY® }ë9TE& í̶Ëõ)!ë—6Þª¨ÌòòÖ±v „~©â ÷Ô¶£]üÿwÿëþlþøýŒý9ýýGýžýôýþþæý›ýEýøüÑüßüýSýý•ý£ý¬ý¦ýŠýjýný®ý þ£þÿ€ÿÙÿ+v¿wÛ!6"Þ¼–|ÞR»õöË€&Ô¥¥ÉðþðÔ®rºzs›Òú õÔ©„kQµÿ-ÿ¡þ þªý<ýçüÍüúüWý¶ýðýøýÙý ýZýýýý\ý¡ýÓýñýþþþúýÜýÞýþŠþÿxÿØÿ)q°ë1‡ÜûЦ|N/>‹þj«·˜Z Ä «Øã¬Xü¾·Ý7FA(ýȘuN šÿ ÿsþèýgýîü‘üqü™üñüOýŒýýˆýXýýêüÞüýUý¦ýäý þ-þEþJþ7þ þ)þiþÙþVÿÈÿ&u¶éV£ðóÀ[&YÊ7{Žv>õµ›±ç3/ù¾g ÍÇí FTL+õ³yN!Öÿ_ÿÉþ.þžýý—ü5üü7üüíü0ýKýCý ýðüÌüÐü ýiýÊýþMþyþšþ¥þ–þ„þ”þÚþNÿÐÿE¨ø5^±ó5YO"é°q-ûú8AT> Âh€¹ï  ûÛ H꯫Ó2FA"çŸ^,úÿ«ÿ2ÿþþxýïüoü üåûü^ü¼üý'ý+ýýðüÖüçü,ý—ýþZþ›þÑþüþ ÿÿóþÿNÿÁÿ@µi¢ÄÞ9oˆuAÅ3÷î!zÒ ÿÇ}; :r©Åȼžc ¬pl’Æïâ¦[äÿ±ÿaÿìþ^þÎýHýÆüLüïûÐûøûSü¶üý/ý<ý.ýýýýgýØýKþ¨þðþ,ÿYÿlÿaÿTÿhÿ²ÿ#¢wÃõ7c‘¤ŽZÞ–Gú'xÈùå¨Yõ Bw“—Œm1×z?:a•¿ÕÓ±oÕÿœÿdÿÿŸþþŒý ý‹üü¶û˜ûÂûüüÒüýýýýüüýwýóýqþÜþ2ÿ|ÿµÿÐÿÍÿÆÿàÿ+žï9eux‡¨ËÔ¸€@ý¯Yý"k±Üá‚/åÅÙGgpjPÀg1/V‰´ÌÌ©dÃÿ‡ÿKÿùþƒþøýnýëüjüðû•ûxû¢ûúû]ü¯üçüýýðüëüýqýôýyþëþHÿ˜ÿÔÿòÿòÿïÿ XÉC´Vz€z~—²´’VÉx ÜÇì5|¨±•V¼Ÿ·ó/WhiW%ׇZ^‰ÀíÞ”7åÿ¢ÿaÿ ÿ‘þþwýñümüòû—û|û§ûüfü¼üöüý ýùüñüýuý÷ý}þñþRÿ£ÿáÿkÚR¿Wrn_\nƒ€ZØ?꩘Á ZŽž‡Lü¸ ¿Cq‹”ˆ]Ê¡¨Ô 9RM ÏlËÿ„ÿ'ÿ«þþŽýýüü¨û‹û³û üküÀüúüý ýóüåüýZýÕýTþÂþÿoÿªÿÆÿÅÿÃÿÞÿ&‘rÌ % 45ãªn)à«§Ù.„ÂÞÓ¡Wÿ\žÍèóé½t(ûûJpƒwCé}Êÿ{ÿÿ–þþxýðülüðû”ûtûšûëûJü›üÔüìüâüÂü­üÃüýýõý]þ¶þÿ@ÿ[ÿ[ÿYÿuÿ¾ÿ'œ m³×ÙÐÕî Þ´‡Pëñ*„à%HCÍ‹qŠÃÿ)AI; ºf/$:\xƒq7Øi®ÿ]ÿùþ|þðýgýåüeüîû–ûyûžûðûNü¡üÜüöüìüËü²üÂüýlýÙý:þŽþÖþ ÿ%ÿ"ÿÿ7ÿ{ÿßÿO»a†Œ†­Òæßƨ‡^0$gÈ+y¤§;ùÚìRw‹}Iöž_JShz~g)ÆSêÿÿ;ÿÕþWþÍýFýÅüHüÔûûcû‡ûÖû4üˆüÅüáüØü¶ü˜üŸü×ü3ý˜ýôýEþŽþÅþßþÝþÙþðþ0ÿÿýÿiÌFVYk‘¾ÝãÙ˹ž~oŠÕ>§ý1:Õ’nx¡Îíüûá¥JèxquxpNœ ­ÿKÿîþ„þþzýòüqüóû~û+ûû2ûûÛû/ümü‹ü„übüBüFüzüÑü3ýýâý*þaþ|þ}þ|þ•þÔþ1ÿœÿmÀô -[‘¼ÒØÙÖɹ¹á9«ÃÛÅŒM*0T}𧤆Dây#ï×ʽ¦x%­# ÿ,ÿÀþJþÂý2ý¥üü›û#ûËú¬úÉúûjû¿ûü(ü(ü üíûïû ütüÔü2ý‰ý×ýþ2þ9þ<þXþ™þöþaÿÑÿ<•ÑïP‹¼Üîüü6’æ0RDÒ¬¬ÈèþùÔŠ¬KܼŸzAådÑÿCÿÇþRþÕýJý¹ü-ü¦û"û©úRú3úNú“úëúCûŒûºûÃû­û•ûšûÌû üƒüåüDýœýãý þþ,þQþ—þøþgÿÝÿQ·ÿ'Ch¡ãGf•œœ¬ß;¯&Üõ¾zI:EU]XC»B¾Jó³Q ÞzóÿXÿÅþCþËýMýÅü;ü¸û8ûºúEúðùÓùñù8ú“úðúCûyû‰ûxû`ûcû‘ûâûCü¨ü ýoý¿ýñý þ þLþ™þÿwÿõÿså9kŽºø@€²Ûþ""1c¼-ŸMn]Ì‹jb_VC!â|ôbã€3ô¾ŠHèÿeÿÑþCþÈýXýåüjüðû{û û—ú-úâùÎùôùBú¢úû]ûœû²û¤ûŽûû¹ûüdüÈü.ý“ýæýþ5þNþ}þËþ1ÿ¥ÿ!£u­ÖGÓ 6^z„ƒ¿{ä>—{0Ï{G*úØ©_íY¼3Æp)îÿ¹ÿ{ÿ!ÿ¦þþ™ý*ýÈüeüýû–û7ûÚú{ú#úëùéù ú}úëú[ûÁû ü.ü'üüü=ü†üàüBý§ý þ]þþ¨þ½þéþ2ÿ“ÿyùpË.^Ÿê.g˜Ãâíì÷$tÖ5†½Ê¢GÓjë¿‘^ ÈJ¬v¨ÿ[ÿÿéþ°þ]þëýiýðüŒü6üáûˆû3ûçúœúPú úäùôù:ú¤úû•ûüXü€ü~ülülüüÕü+ý‰ýìýNþŸþÐþåþ÷þÿeÿÁÿ) ˜ö4`‘ÓcÑ%58FvÇ(„ÏÿÓmítÒ•WÍjà7‡ìÿpÿ ÿ»þ{þHþþÈý^ýãüpüü¿ûoûûÓú’úVúúàùÉùæù9ú¯ú2ûµû.ü‹ü½üÄü¹ü½üãü(ý~ýÛý>þ þðþ!ÿ6ÿGÿnÿ´ÿ}õwóV˜Åô3y¹ïKkwu}¥ïH›ÜÊ^ÖUîžVÃop¾fÿåþþ,þéý¶ýƒý<ýØücüöûžûTûûÇú‡úQú úìù½ù®ùÓù-úªú3ûºû7üšüÔüâüÜüäü ýUý¬ý þpþÔþ&ÿYÿoÿ‚ÿ¬ÿ÷ÿWÇDËN¸ÿ0b¢é*`’¿àëæê P¡ì$C;ý‰ùmü¡Oý©MÙ?ƒÂÿÿŽþ þÇýýLýýÒüoüúûŽû6ûïú¬újú0úúÙù¬ù‚ùwù ùÿù€ú û™ûü‚üÁüÕüÓüßü ýZý¸ýþ‹þ÷þQÿ‹ÿ¨ÿÀÿïÿ?§Ÿ+³!kžÏT”É÷">B50IƒË 9N=ø{áLÑn¼a‡è'cÿµþ*þ»ý_ýýáü¯ükü ü™û/ûÚú–úWúúçùÀùŸùzùXùSù‚ùèùnúÿúûü…üËüçüìüüü.ý~ýàýJþ»þ-ÿŽÿÍÿîÿ :‹ôiêvp¼îYœØ 5\vxg\o¡á?M6ìlÌ0®Dä†(ÄI©èÿ ÿoþàýlý ýÁüŠüXüü¸ûHûÞúŠúGú úÏùžù{ù^ù=ù!ùùQùºùDúÚúpûþûvüÆüêüùüýKý¥ýþ†þÿÿìÿ5a†¾öyL{¦ÚGp”´Ç뙢Éý(AC!ÌB—ða샸PÒ0nÿ¤þðý]ýåü‚ü3üùûÈû‡û)û¹úMúõù¯ùqù7ùùéøÓøºø§ø¯øèøVùæù‚úû·û<ü›üÐüïüýaýÊýGþÎþ]ÿíÿmÍ DŒîbâlÿŽO{žÈö:Qem^<(G_dS ¼$m·˜#²CÒNªÿæþþcýÎüTüïûžûcû1ûïú‘úú°ùSù ùÊøødøHø7ø'øø-ømøÞøsùú¸úVûãûNüüºüïüDý¹ýBþÖþpÿ ˜Vžôdær¤;¶6Y©ÌäõîÅ‹’£¬¤…EÖ4tµ…‘£oÿ§þØýýüþû”û?ûþúÆúúú¥ù/ùÍø}ø:øÿ÷Ó÷¹÷¬÷¡÷ž÷¶÷ü÷rø ù±ù\úû™ûü^ü˜üÜü@ýÅý_þÿ°ÿ[øwØ. “(Æj…×!>]t€……yV!éĵ¯£‡W ŒàQ¤“£)Ÿÿôþ-þ\ýœüùûsûû°úqú:úöù•ù ù¬øKøý÷½÷Š÷g÷W÷U÷X÷b÷…÷Ó÷Oøíø™ùKúûúœûü|üÆüýý%þÐþ‡ÿD­9¦iãm>ÕL”´ÁÌÖÚÔǶ™f Öœw[: Ênæ1b—çV×aïÿzÿôþOþŒý¿üü`ûÜúqú!úçù¶ùwùù«ø;øÜ÷“÷Y÷-÷÷÷÷-÷G÷x÷Ô÷[øù¹ùvú4ûäûwüèüGý±ý;þçþ©ÿtEÐjáF®%©6É_êP„Œ~kV:è¹5Õs á¬r.ÛoÝK}Î?ÆÿVÿëþ~þþgý¯üíû9û¡ú'úÆùùSù/ùüø¬øDøÜ÷‡÷G÷÷õöæöíö÷$÷J÷‡÷í÷}ø-ùìù´ú~û<üßü_ýÎýHþäþ¢ÿuT6ß…qÝTÕ\èw÷P q d >  ã¬k$Ûˆ"©/ÂiÉo î$Bj³ÿÿ þ1þÉýbýíü]ü±ûúúRúÄùRùýøÆø«øšøzø=øé÷“÷P÷"÷÷õöúö÷@÷r÷«÷ú÷mø ùÃùŒú]û1üøü ý%þ˜þÿ±ÿpF& é´YÖ<yòrõk ¹ Î ³ } A  ¹g¶Tá]Ö\ó”4Î^Ø.\u™ÿàþKþÑýfýý¢ü4ü«ûûYú·ù0ùÇø}øTøIøLøAøøØ÷–÷e÷J÷@÷E÷\÷‰÷Ç÷ øYø¹ø:ùÞùúiû<üý×ý~þÿþnÿçÿ;ëÉ¡cÿqËwØA²( ‘ Ò Ü ³ n ! Ðw¯F×XË;¶AÔh÷~ñAl„ÿ§þïý]ýèüƒü'üÎûiûëúTú²ùùø?øøè÷ð÷øøý÷Ò÷¤÷…÷|÷‚÷˜÷À÷þ÷Mø¤øùpùøùŸú\û%üõüÅý‡þ*ÿ©ÿ‹"Ûªƒ^2ñ‹ýS ñH¨ „ æ  í œ A áy“¥‡ëWÏOÐOÊ2yžÿ²þÔýýŒüü¶û_û û¯ú;ú°ùùŒøøÅ÷•÷Œ÷¦÷Î÷é÷æ÷Ë÷­÷÷ ÷³÷Õ÷ øTø®øùuùçùpúûÈûŠüTýþÚþxÿóÿ[Ñg ðʧ}>ÛP§ò>ìT Á U P   a ú‹š!¤€àD²'œƒâ =ÿKþjý®üü§ûDûïúŸúGúÙùTùÄø>øÐ÷ƒ÷[÷\÷€÷³÷Ø÷ß÷Î÷¹÷²÷½÷×÷ø<øøóø^ùËùCúÎúqû&üæü­ýuþ0ÿÍÿH²*Ã|L$ÿÔ“. ò7{Å v Û 0 Z K ª > ÍRÐMÎM¿"}ÛA­‰õR‘ÿ°þÂýçü2ü¦û8ûÜúŽúHúýùžù'ù¦ø-øË÷ˆ÷k÷w÷¥÷à÷øøøøøø.øWø•øëøTùÄù5ú­ú7ûÕû‚ü;ýûý¾þtÿ …ñi¿Že>ÐlÞ/q±÷F ¡  S y e  ¸ F ÌH½2¬'˜úQ©gË0“éÿ#ÿ>þOýuüÃû8ûÊúnú úÚù‘ù6ùÆøKøØ÷|÷@÷*÷>÷u÷¹÷ð÷øøøøø;øhøªøùxùòùnúïú~ûüÌüƒýDþÿÀÿ[ÚKÊi'õÊžm)Á1Àú9 Ô - v “ w ' » A À4  ÷dÂh½pÏ,ÿ¶þÒýåü ü\ûÓúdúú¹ùsù+ùÔøkø÷÷Œ÷6÷÷ïö÷E÷÷Ì÷ë÷ó÷÷÷ø"øJø~øÅø'ùùú¡ú)û½û`üýËýþUÿ®0¥(ɇV(úÅ}Î @ y »  [ µ ” @ Ð S Í<¤ zíY· [­W² \ÿ‘þ¬ýÀüèû8û®ú?úáù‘ùJùù­øGø×÷m÷÷âöÒöíö,÷y÷¸÷Û÷ç÷ì÷ü÷ø>øqø·øùùú—ú!û¶ûWüý¼ý~þCÿþÿ ˜¿}Kí¶mp½÷+ b £ ò F ‹ ¦ Š ; Ï U ÒE°zß8Œà5éE–ÿËþæýûü#ürûçúvúúÄù|ù2ùÛøsøø•÷=÷÷óö ÷K÷—÷Ô÷ô÷ý÷ø ø#øEøtø¸øù‹ù úúû©ûEüíü ý^þ!ÿÙÿwúrøšW$ôÄŒA×F“Ìÿ4 t Ä  ` | a  « 2 ¯"ŽýtñhÓ1‡Ù,‚Ý9ŠÿÁþàýøü%üvûëúzúúÇùù7ùãø€øø«÷U÷÷÷,÷l÷º÷ù÷ø&ø+ø6øLøløšøÝø<ù²ù4ú»úDûÔûlüý¼ývþ5ÿéÿƒzþœSá©k«dœÌÿ? Ž ä ) E , ä }  ƒöe×SÕRÃ'ƒÚ0‹ëM£ÿßþþ$ýVü©ûûªúHúõù«ùaù ù¨ø;øÑ÷x÷=÷+÷F÷„÷Î÷ ø.ø:ø?øHøZøvø øáø>ù±ù1ú¶ú=ûÉû\üùü¢ýWþÿÀÿWØOÓo!à¥i(ÔdÐU†»ýO ¨ ï  ü ½ _ ïrëaÜ`ërî\Á}ßE«Dÿoþ•ýÌü ü’ûû¶ú\ú ú¹ù\ùñø{øø¥÷`÷E÷V÷ˆ÷Å÷ö÷øøøø(ø?øfø¦øùvùøùú û—û+üÉüsý*þåþ•ÿ-±-´Q¿€Aû¥2ê!P…È u ¾ ß Ð – ? Õ^Þ\ßm””gË3  h­ÿÚþþ<ýüÿû„ûû¹ú_úúžù)ù©ø+ø¼÷m÷G÷P÷{÷±÷Û÷î÷ð÷í÷ï÷ù÷ø7øxø×øLùÑù\úêúzûü­üZýþÑþƒÿ¡¨Eõ¯n,â… r¹ëDƒÕ. v ˜ Š T  Ÿ0¹BÒl «?Å<«‡ünÐJÿuþ®ýýküêûxûû±úNúàùdùÜøTøÚ÷÷N÷L÷m÷™÷º÷Å÷Á÷¸÷´÷¹÷Ë÷ð÷/øŒøù„ùúœú*û¾û\ü ýÈýŠþAÿáÿjî|ÏQÎxq¾ô!T˜ðM š  ¹ ˆ ; Ýr%Ägž$›ráUÅ#f“ÿ¸þêý2ý”ü üŽûûµúHúÐùJùºø*ø§÷E÷÷÷!÷H÷d÷l÷g÷]÷Y÷`÷u÷ž÷á÷@ø¶ø;ùÈùWúçú}ûüÏüýVþÿ´ÿCÌ_º~GÐ~‚ÕAv½ u à ì ç ¹ o  ©:Ê`ýž;ÏTÉ3›uÞ6r™ÿ¹þäý&ýüñûsûû’ú!ú§ù!ù‘øø~÷÷äöÜööö÷;÷G÷F÷B÷B÷M÷h÷—÷Þ÷@ø·ø>ùÎùaúöúû4üêü¯ýwþ4ÿÚÿk÷Œ1è¬v?ü¦5¤õ.]Ó) „ Í ò ê ¼ p  ¨8È]ø•0ÁE¹#‰ò_ÇU{ÿšþÃýý[üÉûIûÔúcúîùrùêø[øÌ÷J÷çö±ö©öÃöëö ÷÷!÷#÷*÷<÷^÷–÷å÷LøÇøQùåù|úû±ûWüýÔýþZÿ•"¸]ÖŸdÂM» Dq£ä7 Ô ÷ ï Á x  ³FÙp ¦>ÏRÆ.’ûfÌVzÿ˜þÀýüüQü¼û9ûÀúIúÐùOùÅø4ø¥÷"÷¿ö‰öö›öÁöáöóöüö÷÷%÷M÷Š÷Þ÷HøÅøPùæùúû¸ûaüýãý­þjÿ¥3ÇjÛ aµ;¤ò'R k ± Õ Ñ © e  «DÝz·RäißH¯†ì?w›ÿ·þÝýýfüÍûEûÈúNúÑùNùÄø4ø¤÷"÷Àö‹ö…ö öÈöêö÷÷÷-÷I÷u÷·÷øzøøøƒùú°úHûäûŠüAýþÌþ„ÿ&·@Ïk̇@í†o»ñMâ: ¦ ¥ B ð’/Ìl¯LâjâN·$”üOˆ­ÿËþïý%ýpüÑûDûÁúAúÀù;ù°ø ø“÷÷µö‚öööÆöëö÷÷(÷<÷[÷Š÷Î÷'ø•øùžù2úÉúaûûû üVýþÞþ–ÿ8ÉSày Ò‰>æ{ù_¬äGŒâ; „ « ª ‡ I ø›:Ú|Á^ó{ó_Æ1žTŠ­ÿÈþêýýaü½û)û¡úú’ùùwøæ÷Y÷Ûö}öKöHöfö‘ö·öÓöèöúö÷4÷g÷¯÷ ø}øýøŠù!ú¼úWûöûžüXýþèþ¥ÿLäu ©T Åz"¶4šè"Q„È q µ Ø Ô ­ k  ´Nê‡$ÀXélàF§ rÑPqÿ‹þ¬ýÜü!üzûäúYúÐùFùºø-ø¡÷÷£öKö!ö$öHözö¨öÌöéö÷ ÷H÷‚÷Ñ÷5øªø/ùÀù[úúú˜û8üáüšýaþ*ÿçÿ‘+¿UôP·Xå[»9d“Ò! s ³ Ò Ì ¡ Z ÿ˜.Èd™/½=­iÇ(‚Êüÿÿ7þXý‡üÊû#ûŽúú}ùôøkøã÷]÷Ýömööûõö2ökö¡öÎöòö÷3÷^÷œ÷ñ÷[ø×øaùùùšú>ûàûü)ýáý¦þnÿ)Óm“-Ñ}.ØsújÆ >g“Ð n ® Í Æ œ S õŠ´O邤%“òJ¤XÍÿìþþ(ýWüšûòú]úÒùKùÄø=ø¹÷9÷¿öVööóõö<ö}ö¼öðö÷D÷k÷›÷Ý÷6ø¤ø#ù±ùLúñú™û>üáü‰ý?þÿÆÿ}#ºKÞu¼f ›€ÕAcˆ¿ O ‡   ” f  ¶FÓeû’(¼KÍ=›óL¨þCuÿ˜þ¹ýáüü`û¿ú0ú­ù,ù¬ø-ø²÷<÷Ìölö-öö9övö¿ö÷?÷q÷œ÷Ç÷ø÷:ø“øùùú¬úSûûûŸü>ýâý“þPÿ ¾^ï{š2Ñr – j¶ï.N€Â ; N = ·MÕ[çy ¡5ÅI¼yØ:—åÿÿMþzý°üõûLû¹ú:úÆùUùãøsøøž÷:÷æö±ö©öÏö÷`÷¨÷ä÷ø@øfø‘øÌøùƒùûù‚úû³ûSüíü„ýþÇþ{ÿ/Øqý†ž1Ëfû€ïK”Éì!OÍú î´\ëkêoüŒ±AÇ;ŸþaÈ+€ÿÃþýý9ýüÑû6û°ú=úÕùqù ùªøJøî÷–÷M÷"÷!÷M÷”÷ã÷+øhø™øÁøãøù;ù„ùãùUúÕúbûùû’ü&ýµýHþéþ•ÿBåx‰œ,ÁXéj×1x­Ïæ.i¥Î×»}!«%œ¢.½MÜaÖ<œlÔÿ/ÿ|þÃý ýaüÂû3û¸úNúñù–ù<ùãøø:øì÷ª÷„÷ˆ÷µ÷ý÷Kø“øÎøþø#ùAù_ùŠùÊù!úŠúû‹ûü±üAýËýYþôþ›ÿCárû‚ “ ±DÑO¹Vˆ¨¾×;u¦‹Nñzóhäjõ„©3¬}èXÇÿ(ÿ}þÍý ý|üåû[ûäú}ú!úÈùoùùÃørø$øá÷»÷¼÷æ÷)øsøµøìøù8ùOùgù‹ùÅùúyúîútûü™ü)ý³ýAþÜþ‚ÿ)ÇXájô~ ˜&®'Žä)]—²ÞU~‰r9àlæ]Ù_ë|§5´$ŽýqãÿIÿ£þúýTý·ü$üžû'ûÀúbúú«ùQùüøªø[øøð÷ð÷øUø›øÚøù:ùZùpù…ù§ùÝù*úŠúüú€ûü¦ü7ýÂýOþéþÿ1Ì[älõ}Œ•d³ó"AUm”Ë&-܃‰ÿ{‹´NäjáRÈC½ÿ*ÿþíýRý¿ü6ü¸ûIûèúú7úßù‰ù8ùêøŸø_ø9ø9ø_øžøãø#ùXù„ù¤ù»ùÑùóù*úwú×úIûÎûbüúüýþ©þBÿåÿ‡ ­4¹>ÀAÂB¹t¸ï+6Da½ÚÚ¼~!¨‰£<ÙqüwífçÿdÿØþCþ¬ýý”üü û:ûáúú=úêùšùOùùÄø‰øføjø“øÓøùZù’ùÀùãùüùú:útúÃú%ûšû"ü¹üVýíý}þ ÿ£ÿBàtû}ý|ørëbÏ+t¯Ýü 0W–‘o.ÏTÈ:²3¼Læ…"±1ª'©ÿ)ÿŸþ þyýìühüìûzûûÁúrú!úÏù€ù8ùóø²ø{ø\øcøøÓøùdù¡ùÔùýùú<úiúªúûmûëû|üýÃýcþúþÿ*ËiúüvîbÒB­\—Âáòóêçó,9+·RÓDµ.²?Ôs½TÝ^äÿmÿóþpþäýXýÓüVüáûwûûÊú~ú1úâù•ùNù ùÎø›øøŒø½øùQùšùÚùú=úaú†ú¹úûaûÕû[üôüœýIþïþŒÿ$Âbþ‹ ò`Ê0“ñCªÂÎÌ»¢Œš©ªZ™‚ñló„Är½PÝÿlÿÿ‘þþ—ýýœü*üÁûcûûÌúŠúEúüùµùrù5ùûøÍø·øÆøúøEù”ùßù úYúˆú°úÚúûcûÉûCüÐünýþÌþvÿ°Oõ^Ã#~Ö'j˜°¶°œzP. ï¯TßWÄ5³?Õw$Û:Øÿqÿ ÿ­þIþÜýgýñü‚üüÀûoû+ûñú¹ú~ú?úúÆùù\ù4ù&ù<ùvùÅùúhú­úéúûHûyû¸ûüzüøü‰ý,þÛþÿ6ÓkŸ/®zÕ*zÅ IvŽa6ý¾‡cRC'ô§AÅ9¦›,Êu-ðÿ±ÿhÿÿ»þgþþÈýný ýªüOüþû¸û}ûOû)ûûÝú°úƒúYú1ú úïùëù úLú¢úúúIûûËûýû*ü[üšüîüXýÓý_þýþ¦ÿOî š&¨rÀ LŠÄø%AG7é­dП‚iDµKÌ?­$«Cëÿ ÿdÿ1ÿþþÁþxþ,þåý¤ýaýýÂüoü$üâû«û€ûbûMû:û#ûûëúÑú·úžúú“ú¼úû_û¼ûüWü”üÅüðüý[ý®ýþþÿµÿZÿ™$¨*©|È>n™¿àù÷Ö¥hÇlÞµ’d"É[ÙI¸1¾ÿ\ÿ ÿËþšþuþPþ!þçýªýsýAýýÒüüOüüçûÂû©ûžûœû›û•ûŠû~ûsûhû\ûVûeû•ûâû@üžüñü8ýqýŸýÅýîý%þrþÓþFÿÉÿ[ù—(ª#š rÂÿ.Uv¦¸Ã¾¢r2æŽ*Âd軃7ÖaÚG¶ÿ1ÿÁþgþ þëýÇý±ýýý[ý3ýýöüÙü³ü‡ü\ü8üü üü üü/ü9ü=ü=ü>ü=ü:ü;üOü‚üÒü0ý‹ýÛýþOþsþþ­þØþÿpÿØÿO×jü‚øeÐ7Ó#<NY`c_M%éžHæy¢Rã¦VñzóÿaÿÑþOþæý“ýVý,ýýýýý÷üäüÙüÓüÌü¼ü¤üŒü{ürüqüzüŽüªüÆüÚüæüïü÷üüüÿüýýNýýøýPþšþÕþÿÿ4ÿKÿoÿ¨ÿ÷ÿWÇIÕbáPµsÁø,7;81&ó¾t»OØ^ð™VØ‚¢ÿÿŠþþýƒý!ýØü¦üŠü„üü¡ü®ü²üµü¿üÏüÜüáüÞüÚüÜüåüôü ý/ýWý}ý™ý¬ý»ýÈýÒýÕýÚýïýþdþ·þÿFÿvÿ—ÿªÿ³ÿ¾ÿ×ÿE™ÿwû÷^ºd¨ÖïùûöëÛÆªAï‘*º?ÁNò«l&Òÿkÿõþqþçýaýíü“üSü*üüü9üYütü‡ü˜ü°üÍüèüûüýý ý6ýQýtý ýÏýúýþ2þFþWþcþhþlþ~þ¨þêþ6ÿ|ÿµÿßÿùÿ DÌ,   tÊf£ËÞäáØÇ²™wF«Jánðpú›QÈÿqÿ ÿ“þþˆýý•ü?üüáû×ûæûü1üTünü‡ü¥üÊüëüýý,ýCý`ýƒý¬ýÜýþ?þcþþ–þ«þ¹þ¿þÂþÒþùþ5ÿ{ÿ»ÿïÿ(102Bh£ðQÇJÌ@£ùJ“Íó øäʬ„NªDØaßYÞx&Üÿ‹ÿ,ÿÀþEþ¾ý2ý«ü9üáû¥û‚ûyû‹û±ûÞûü'üEüiü’ü¸ü×üñü ý+ýOýxý¨ýÞýþMþvþ–þ±þÈþØþßþäþóþÿPÿÿËÿúÿ),&#0SŒÙ9®1´*ê>‰Æî öàÆ¤s.Ös‘Š ¥O¬ÿJÿÚþ[þÏý=ý±ü:üÞûŸû{ûpû€û¤ûÏûöûü3üVü}ü¢üÁüÜüùüýAýjý™ýÐý þAþlþŽþ©þÀþÐþ×þÛþéþ ÿCÿƒÿÀÿñÿ',(&4Y–æJÁGÌE¬Y£Ý$% õÚ¸ˆC퉥"›³Z µÿTÿåþgþÚýFý¹ü?üâû¡ûzûnûzû›ûÄûéûü"üBüfüˆü¥ü¿üÛüüü!ýJýxý¯ýêý!þMþoþŠþ þ¯þµþºþÉþíþ%ÿfÿ¥ÿÚÿ$&*>i­méqúuß;ŽØ:P[]UC+î¾z"½MÓNÅEØ|(Ñÿnÿýþ}þîýXýÇüKüìûªûûpûzû–ûºûÙûòûü"ü?ü[üsü‰ü¡ü¿üáüý2ýfýŸýÕýþ#þ>þTþcþjþpþ€þ¥þÝþ ÿ`ÿ˜ÿÅÿâÿðÿöÿþÿH‘ï_âpý~ìM£ï,Vp…s^G)þ¿k ž&£0Ò|"¾ÿKÿÈþ6þ›ýý„ü üØûªû”û–û«ûÆûÝûíûúû üü-ü;üIüZüqüŒü¬üÒüý:ýpýýÀýÜýóýþ þþ,þTþþ×þÿ]ÿ“ÿºÿÓÿâÿõÿT§‡¤5º,æ2n—°½Áº©‘wY-ï;ÎTÏFÅTò—9Óÿ]ÿ×þAþ¢ý ýƒüüÎû›û€û|ûŠûžû®û¹ûÀûÊûÖûáûêûôûüü.üKüqü¢üÜüýJýtý—ý´ýËýÛýëýþ5þwþÃþÿWÿ”ÿÂÿàÿõÿ 6xÑ>¼JàtúmÐ'qªÐçññæÑ¶šzOÂbõ|÷pï~¿_õÿ}ÿóþXþ´ýý‰üüÌû–ûxûpûxû‡û’û—û™ûû¢û¦û©û­û·ûÆûÚûóûüGü‚üÀüøü(ýRývý”ý«ýÃýæýþcþµþÿRÿ“ÿÅÿçÿÿÿGŽí_âs ž#–øM”ÉìöÞÁ¤…\#×|›”¦D燣ÿÿwþÎý+ýœü+üØûŸû}ûpûqûxûzûwûrûnûlûjûhûgûmûwû‡ûû¿ûðû.üpü¯üèüýIýpý‘ý´ýãý$þvþÑþ-ÿ‚ÿËÿ+IkžêLÂGØný}êF”Ó)*æÂŸyK ¾a÷ýxú‹(Êhýÿ‚ÿôþTþªýýwüü¯ûuûRûCûCûFûFû?û6û/û)û#ûûû û+û:ûRûvûªûìû3üwü·üóü*ý[ý†ý³ýëý5þþóþWÿµÿEt˜ÀøI¯(±EÝkèQ¨ð)OekfT6å¼’_ÎqŽ „”0Ñn†ÿõþQþ£ýûügüðû–ûWû1û ûûûûûðúàúÓúÇú½ú¸ú»úÄúÓúêúûGûŒûØû#ümü³üõü/ýcý™ýÙý,þŽþúþfÿÌÿ$l¡Ìû9øu˜0½6™ê+]|‹‹€iE꽎YÈmŒ£Aã—ÿÿ]þ¬ýýhüìûŒûGûûûûúòúâúÌúµú¡úú€úsúmúoúxúˆú¡úÉúûKûœûîû@üüÝü!ýaý¢ýïýMþºþ/ÿ¤ÿq¾ø'X—ìUÐZítÎNv“‹wX,ùÄ]#ß7Ò_ãeï†)Ðr ŽÿüþUþ£ýõüZüÙûuû,ûüúáúÒúÄú¯ú–ú|úeúSúDú:ú7ú<úHúZúxú¤úäú2û‰ûäûAüžü÷üIý–ýåý>þ¨þ ÿ ÿ•ûLˆ¶äkË;ºAÆ> ë$Ojuq_Aâ¥h.ôµnÆdõ}”3Ý9ÛÿhÿÝþ<þýåüLüÍûhûûîúÒúÂú´úŸú†úlúVúDú8ú0ú/ú4úAúTúsú¢úäú5ûŽûëûKü¬ü ýcý·ý þnþßþ_ÿæÿlèR¥á<t¼|òpì[µø)K^aV=å¨f%ç©fÉn (³HìžT¯ÿBÿ¼þþwýÓü?üÃûaûûêúÑúÃú¶ú£ú‹úsú^úNúCú>ú?úGúTúhú‰ú»úÿúQû«û üküÎü0ýýæýAþ©þ!ÿ¨ÿ5ÂD³Fu¡ÖlÌ;±%‹Ü=T]VAð´n#Ú”M¯Vø“%±@Ú„=ÿÿ¼ÿnÿ ÿþûý\ý¿ü1ü¸ûYûûéúÓúÈú¾ú®ú˜ú‚úoúbú[úYú^úhúwúŽú°úãú'ûwûÎû*üŠüìüNý«ýþcþÎþKÿ×ÿkÿ‡ûS“Ãï"a® rãP¯ö'DSTG.Õ”Iú«_Áj®IÜjü›L Øÿ ÿ[ÿÿ‹þþýdýËü?üÈûhû"û÷úáúÖúÊú·úžúƒúmú]úTúSúXúcútú‹ú­úàú#ûqûÇû!üüäüHý¨ýþiþÚþ\ÿïÿ‰$²*…Çø%V’Ú0“þf¾ÿ)?F@- â«hË}0âŽ5Øz¯C܃<×ÿ¦ÿhÿÿ¥þþ‰ýôüküõû”ûLûûûöúæúÐú³ú•ú{úgúZúUúWú`úoú†ú©úÜúûlû¿ûüvüÚü?ý£ýþnþåþoÿ©IÜY¹ÿ2`‘Ê^»€Ð *88*é·z2áŽ<ë™Bå†&ÂZð9ùÿÉÿ ÿvÿ>ÿñþ‰þ þ}ýðümüüûŸûZû/ûû ûþúéúÎú±ú˜ú„úxúrútú}úú¥úÉúýú?û‹ûÞû5ü’üõü[ýÀý%þ’þÿÿ:à„šþEz§Õ H’çC›ã,2(í¼‚=î˜@ê”<ß}³LãzÉÿŒÿ`ÿ=ÿÿèþ£þCþÎýKýÈüNüåû‘ûTû/û ûûûûðúÙúÅú¶ú­ú¬ú²ú¿úÓúñúûSûšûèû;ü’üîüOý³ýþ|þêþgÿöÿ”:ÞtóT›Îù$TŒÍj¶ò$äµ{7è‘5×}%Ël¢;Ôk¦ÿYÿ ÿùþÜþ¾þ•þUþüýýý˜ü&üÆûyûCû%ûûûûûÿúìúÜúÑúÌúÏúÚúêúû!ûNûŠûÓû%ü{üÔü1ý“ý÷ý[þÂþ0ÿ®ÿ=Ý„*ÁA¢èBi”ÅþB‰Ìþ 쿇Eù¤Gå„&Ìo©BÛs §ÿKÿÿÌþ©þ‘þzþWþ þÏýiý÷ü†üüÇûƒûVû@û=ûCûGûDû:û-û ûûûû%û7ûNûnû›û×û üpüÃüýrýÏý-þþïþZÿÕÿaý¢EÚWµù)Os›Çü:{·ãø÷⽋O ¾h ©Ií“8Øt¨AÛÿwÿÿÕþ¢þþmþZþ=þ þÂýcýøüŽü-üÜûžûwûhûjûvûûûzûpûfû`û`ûgûtû‡û ûÀûíû(ünü»ü ý\ý²ý þfþÀþÿ„ÿúÿ€¸XêdÀ,Oo‘¹é!]“¸ÇÀ¦}GÀpºX÷š@å„ »Vðÿ‰ÿ%ÿÎþ‰þYþ<þ,þþþßýŸýIýêü‹ü6üñû¾û¢ûû¨ûºûÉûÏûÎûÉûÃûÀûÃûÌûÜûðû ü*üUüŽüÒüýfý´ýþWþªþüþRÿ±ÿ¡2Ëeòf¾ù"A^~£Ð=mŒ•‰k>Ã{+Ôu±Túž>Úu©ÿAÿÝþ†þBþþúýìýãýÓý±ýyý-ý×üƒü9üþûÖûÄûÈûÚûòûüüüüü üüü/üEü_ü€ü¬üäü'ýný¶ýþLþ›þèþ5ÿ…ÿßÿHÃMàrùj½õ:Vt–Àñ#LdgU4È„9é’3Ñq¼až:×ÿpÿ ÿ§þRþþæýÌýÀý¹ý«ýýZýýÅüzü8üüäû×ûÞûôû ü ü+ü/ü0ü/ü0ü6üDüXüpüŒü®üÛüýVýžýæý1þ~þÌþÿdÿ³ÿ tìs‚Ó,Hb}œÃï?PM6ÜU ·_ÿœ:Þ…*Ëi¥ÿ@ÿÛþ{þ)þìýÂý«ý ý›ý‘ývýFýý»üuü9ü üñûêûöûü,üBüPüVüXüYü[übüqüˆü£üÁüåüýOý”ýÜý%þoþ¼þ ÿYÿ¥ÿöÿP¹2¸DÐQ¼ ;Zr†›²Ðõ4=1ä§_½g ªEä‰0Õv´ÿTÿòþ‘þ6þéý¯ýŠýtýlýiýbýKý ýãüžü]ü&üýûåûâûòûü1üLü]üfükülünüvü†üžü½üßüý;ýzýÁý þVþ¡þðþAÿ‘ÿáÿ4’ÿyþŠ”üGw“¦¶ÅÖî -CG6Ü—Gñ˜>ß{²Tù›9Öÿsÿÿ²þSþúý¯ýwýRý>ý6ý5ý0ýýòü¸üvü6üüØûÀû¾ûÐûñûü2üEüPüVüXü[üdüxü•üºüãüýLý’ýàý.þ|þÌþ ÿwÿÎÿ$äVÓZçrñX¡Íçö!7O\X@ÖŠ3Öw¶Nå€ Â`ûÿ“ÿ-ÿËþkþþ¹ýrý>ýý ý ý ý ýùüÔüžübü)üùûÔû¿û¾ûÑûóûü7üLüYü`üdüiütü‹ü¬üÔüý6ývýÂýþfþ·þÿ^ÿ¹ÿoÎ6«*²=ÅA£ç%/444:GUZM,ø²^ÿš5Ðhü(Æe˜ÿ.ÿÉþiþ þ³ýbý"ýóü×üËüËüÑüÔüÉü«ü|üHüüìûÌû»û¾ûÕûûû$üFü`üpü{üƒüŠü˜ü²ü×üý6ýoý³ýþVþ©þùþLÿ£ÿÿÿ[¹„ùwûƒß!GY`_YQOSYU?ØŠ.ÆZî„©:ÏjŸÿ4ÿÊþfþ þ±ý^ýýØü¯ü—üü“üžü§ü£üŒügü:üüêûÏûÂûÈûäûü<ücü€ü”ü¡ü«ü´üÄüàü ý9ýpý­ýôýEþ™þíþ>ÿ’ÿíÿL®uáWÔWÜ^Ô2q•¤¥œ|oieW8¾f§6ÄQÞp¡ÿ6ÿÉþ`þþý¤ýPýý½ü‡üdüQüMüUüeüsüuüeüFü!üüûÜûÄûºûÃûáûü=ügüˆü ü±ü½üÉüÛüùü"ýTýýÌýþgþ½þÿdÿ¹ÿvÙ=¤ŠŒ” hªÏÞßÕ­›…qMÈk‰”¥-¶DÙÿnÿÿþ$þÁýgýýÅüüMü,üüü&ü8üJüQüGü/üüðûÕûÁû»ûÈûéûüJüwüšü³üÆüÔüáüóüý9ýký£ýãý,þ|þÐþ!ÿrÿÅÿ~àCªŽ Ž”f¨ÎßßÔÀ¨•‡{e>¶Wês÷|Œ,ÀÿSÿåþuþ þ§ýOýýü±üpü?ü üüü'ü@üWüeübüRü:ü!ü üüûúû ü.ü`ü”üÁüäüýüýý%ý6ýPýtý¡ýÔýþQþ›þæþ0ÿxÿÄÿpÍ)‰ñbÛYÛXË'i¡¢—ƒlYL@+Ê}µ@ÇOØcî{ ¤ÿ;ÿÐþcþüýýGýùü°ürüCü'üü%ü9üUüqüƒü…ü{üiüUüDü:ü<üQüxü¬üáüý/ýGýVýaýjýxýŽý®ýÕýþ7þsþ¶þûþ>ÿ€ÿÇÿiÀsÕA¶2±.Ÿý@j„}n[LC:'È{´@ÈOÙcíxœÿ0ÿÁþRþéý‰ý2ýâü˜üWü%üüúûÿûü+üFüXü]üUüGü8ü-ü(ü0üKüxü²üíü ýEý`ýsý‚ýŽýŸý·ýØýþ.þaþœþÝþÿ`ÿ ÿäÿ/ƒØ-…ãL¾6±*˜ò4]sysdSF?8&É~#»JÔ_êv!¶ÿJÿÜþnþþ¥ýOýþü²üoü:üüü üü.üEüTüWüNü>ü/ü"üü&üAüoüªüåüý;ýUýgýuý‚ý“ýªýÊýñýþPþ‰þÈþ ÿHÿˆÿÌÿlÁlÊ1¢’ uÎ8NUPC4)$íµj­?ÍYçv•)ÁÿWÿìþþþºýeýýÉü…üPü-üüü*ü>üSü`übüYüJü<ü1ü-ü7üSüƒü¾üúü+ýPýjý}ýŒýšý«ýÁýáýþ2þdþœþÚþÿXÿ—ÿÛÿ&yÎ"wÓ8¦Žÿfº÷.2, ýøéÇFïŒ!±@Ðaò„²ÿJÿàþuþþµýcýýÍüŠüWü6ü(ü*ü7üLü`ünüoügüYüKüAü>üIüfü–üÒü ý>ýbý{ýýœý«ý¼ýÓýóýþFþxþ±þïþ0ÿpÿ±ÿ÷ÿE›òGø]Ê<­{Ê!-+ öåÛÒ¿™]¸Uë| Ÿ2ÅYòÿŒÿ'ÿ¿þXþ÷ýŸýQýýÃü„üTü7ü,ü1üAüXüoü~üüzünübüZüYüeüƒü³üïü)ýYý{ý“ý¥ý´ýÃýÖýïýþ7þdþ–þÐþÿPÿ‘ÿÒÿg½j¾zãQ½$~Åô  üä̹­¡Œd(Ûƒ"ºOâw  6Ðÿlÿÿ¢þ<þÜý…ý9ýòü¯ütüFü,ü&ü/üBü[üsü„ü‰ü„üzüqülünü}üüÏü ýHýyýœý¶ýËýÞýðýþ!þDþlþšþÍþÿGÿ‰ÿÊÿ OðD–ç<™þeÊ(y·Ýîîá̱–sfP(í¢Lï‹#»S냹ÿXÿ÷þ”þ0þÑý|ý1ýëüªüqüEü-ü'ü0üCü[ürüü…üüuümüiümü}üŸüÓüýQý„ýªýÆýÝýòýþ þ?þeþ‘þÂþøþ5ÿxÿ¼ÿþÿ>„Ð#vÆf¿~Ý3|²ÐÚÔé‹mVF8"úÀw#Æeš5Ðj¥ÿFÿæþƒþþÁýlý!ýÝüžüfü=ü%ü ü)ü<üTüküzü~üyüqüjühünü€ü¥üÛüý^ý•ý¾ýÞýøýþ)þEþgþ‘þÀþóþ,ÿkÿ¯ÿôÿ4t·P í8†Ú2‹â2s¡¸»®—yV5øá¹6â†%Á^ü™6ÖÿxÿÿÁþbþþ¨ýWýýÒü˜ügüCü0ü/ü;üRümü†ü˜üžü›ü•üüü˜ü¬üÒü ýLýýÇýóýþ.þGþ`þ|þ þÊþúþ/ÿhÿ¨ÿìÿ/o­í3ËZ£ð@’à&_…”~b?ôØÄ´w>ö¤JëŠ*Ìn´ÿ\ÿÿ­þQþóý›ýMý ýÍü—üiüHü8ü8üEü]üxü’ü£üªü¨ü¢üžüŸü§ü»üàüý[ýžýÖýþ"þ<þTþmþŠþ¯þÛþÿFÿ„ÿÇÿ S”ÑV ë3yÀ X¤í.a‹‚kK%ûÓ´žŒtLÊw¼[üŸCéÿÿ8ÿäþþ2þÕý~ý1ýðü¸ü†ü\ü@ü4ü9üIücü‚üŸü³ü¾ü¿ü½ü½üÁüÌüäü ýGýŒýÑý þ:þ\þwþþ©þÈþîþÿQÿŠÿÉÿ Q”Ò F‡ÎX™Û f«ì%QkoaF"ùÌ¢iV=Ú‘=á‚"Åjºÿcÿÿ¼þfþ þ¯ýXý ýÎü™üjüEü,ü$ü+ü?ü[ü}üü¶üÅüÌüÏüÓüÜüêüý/ýký²ýùý4þbþ„þŸþ·þÐþîþÿEÿ|ÿ·ÿ÷ÿ9~Àú0g¥ç*j§ä"aŸØ 0DD2íÁ“gE-Ú¡Y«Nð—Aîÿ›ÿIÿùþ©þVþýý¢ýLýýÇü”ühüEü.ü'ü.üAü^üü üºüÊüÒüØüßüèüùüýAý€ýÉýþOþ~þ¢þ¾þÖþðþÿ9ÿkÿ¥ÿäÿ&m´ö0ešÖW”Î@x¯á *82úÑ¢qCóÚ²z2ß…(Ìt"Òÿƒÿ5ÿéþþMþ÷ýŸýMýýÍüüuüTü@ü:üAüTüoüü¯üÈüØüáüèüñüýüý-ý\ýýéý3þsþ¤þÊþèþÿÿ>ÿiÿÿØÿZ¡ç(`‘Ãú5q¨Û >n›ÄåúþïÑ©{IåÀ§•}X"ÝŽ7Þ‡5èÿÿSÿ ÿÆþ€þ7þçý”ýIý ýÖü¬üŠüpüaü`üküüŸüÂüäüþüýý ý+ý8ýKýjýšýÜý)þsþ´þåþ ÿ(ÿAÿ[ÿ{ÿ¥ÿØÿMÒR„°ÜDx©Ö,U{·ÅÁ«‡Z(ò»ŠfO?+ ×—Lù¥R¼ÿuÿ/ÿëþªþiþ#þ×ýˆý@ýýÖü±ü“ü~üuüyü‰ü£üÆüìüý-ý?ýKýVýcýsý‰ý«ýàý&þwþÆþ ÿ>ÿeÿ„ÿžÿ·ÿ×ÿÿÿ.c›×T‰µÙý&T€¨Íñ6Upƒ‰}`5Ë’X&ìÞË«|?÷©X Ãÿ~ÿ;ÿøþ¸þ|þ@þþý¶ýlý)ýòüÉü¨üü€ü}üˆüŸüÁüëüýBýcýyýˆý—ý§ýºýÒýöý,þuþÆþÿWÿŠÿ°ÿÌÿãÿûÿ<i™Í?x¨Íë -Uzœ»Øö,BOP>ê³y=Ϭ—‹z\.ó®cÎÿŠÿJÿ ÿÎþ“þ\þ$þçý£ý^ý ýïüÌü²üŸü•ü™üªüÈüðü ýRý€ý£ý¼ýÍýÞýðýþþDþ{þÅþÿdÿ¥ÿÖÿùÿ'<Wy¢Îý/c–¿Ýô (Hg˜¯ÆÜð辈MÒ–dB0&ýÓ^Õÿ”ÿXÿ ÿéþ³þ€þQþ"þîý³ýwýBýýýîüâüàüëüý%ýRý…ý¹ýèý þ"þ2þAþRþeþ~þ¡þÖþÿkÿµÿòÿ>Ufx®Òø!Lz¦Êáñ/FZk|Ÿ­·¹­_%æ¥e(ôÑ¿µ§Žg5ûÿ»ÿ|ÿ@ÿ ÿÙþ©þzþNþ(þþÙý©ýxýNý2ý"ýýý#ý7ýWýƒý·ýñý*þ]þ‚þšþªþ¹þÊþÜþôþÿIÿŒÿÖÿPx’¢®ºËã?b‡¬ÇØáêù '1;GR\a^L(ó³o,ê¬yXHA7!ÿÿÑÿœÿcÿ+ÿøþÊþ¡þyþRþ/þþ÷ýØý´ýýrýbý_ýcýmýýœýÅýùý4þsþ²þèþÿ*ÿ<ÿLÿ\ÿnÿ…ÿ¦ÿÖÿ\Ïð ,>Rg~˜±ÁÇÅÄÉÑØÛÜÞàâãßÔ»UÊ…BÔÿ´ÿ§ÿ¤ÿŸÿÿuÿPÿ$ÿõþÇþžþ|þ_þCþ(þþþòýàýÈý°ý ýœý¤ý³ýÈýäý þ:þrþ±þóþ3ÿkÿ”ÿ¯ÿÁÿÑÿàÿñÿ!M‰Ê4Ragecemy†“£¶ÆÎËÁ·³²°«£œ–…yfF×G¾ÿ€ÿNÿ0ÿ$ÿ#ÿ"ÿÿÿçþÄþœþvþUþ;þ'þþþ÷ýðýëýãýÕýÇýÀýÅýÕýìýþ*þVþŠþÅþÿHÿ‰ÿÀÿêÿ$2@Qk”Ì Co‹˜›—’“›¥¯»Ê×ÛÔÆ¸¯ª£™vi[I1ÝœT Ãÿ~ÿ@ÿÿïþãþãþäþÝþÌþ²þ’þnþKþ,þþþöýêýäýãýåýåýßýÙýÙýåýüýþ;þcþ”þÌþ ÿLÿÿÑÿ3Obp~‹›²Ø Fz¢»Åż°§£¤§ª°¹À¿´ ~rfWG8* õÛ¸‡H¼ÿxÿ6ÿûþËþ¯þ¥þ¦þ©þ¥þ˜þƒþgþGþ&þ þóýäýØýÏýÍýÒýÚýáýãýäýìýÿýþ@þhþ—þÎþ ÿNÿ“ÿÙÿVƒ¡µÄÒÞì#S‰ºßõþûïÞÎľº¸¸¼¿ºª“|iYJ8'øæÑ·”e(äÿŸÿ\ÿÿàþ°þ’þ‡þ‡þˆþ„þwþbþGþ&þþäýÌýºý­ý¤ý¢ý§ý²ý»ýÀýÅýÑýçýþ0þ]þþÍþÿWÿ ÿéÿ/m¾Õèø+M|±á&#ïá×ÏÉÇÇÈÁ¯•|fSA.ðÞɯ^"àÿ›ÿXÿÿÛþ©þˆþyþvþtþmþ`þKþ/þ þéýÇý­ýšýý„ýƒý‹ý™ý¥ý­ýµýÂýÚýýý'þWþþÑþÿcÿ®ÿùÿ@°Òëÿ /Ef”Èø6BA5! ýñèàÝÜÛÒ¾¡ƒhP:%ôäϸ›vDÄÿÿ;ÿúþ¼þ‡þcþQþJþFþ?þ2þþþãý¾ýý‚ýoýcý]ý`ýmý€ý‘ýžýªý¼ý×ýýý+þaþ þçþ5ÿ…ÿÔÿ!jªÝ1DTdy˜Äõ$JcppdP9& úøõêÓ´’sW>'õäж˜p=»ÿtÿ/ÿìþ­þvþOþ9þ.þ'þþþúýßý½ý—ýtýXýDý7ý2ý7ýEýZýný~ýý ý½ýäýþKþŒþ×þ(ÿ{ÿÌÿc£×ü.CUg~ Ìþ.Uq„{hS@0$ðѯŽqW?,íÓ³ŠTÍÿ„ÿ<ÿöþ³þyþMþ1þ!þþþóýÜý¿ýœýtýOý0ýý ýý ýý1ýHýZýlý‚ý ýÈýùý4þyþÉþÿwÿÌÿi«á 'AXmš¼éIqŽŸ¤›‰t_OA5.*&à»—vX>) üæÊ¨{C¶ÿlÿ"ÿÚþ—þ\þ/þþüýìýÛýÇý¯ý’ýpýIý%ýýóüçüäüìüÿüý3ýJýaý{ýýÇýûý8þ€þÓþ,ÿ†ÿÞÿ0}Àõ<Wo†ž¹Ý ;i«¼À·¥zgXKB=7*ñ˦ƒdH4%òÕ°F¶ÿiÿÿÖþ‘þUþ&þþëýÖýÁý«ý‘ýsýOý'ýýäüÎüÁü¾üÆüÙüôüý(ý@ýZý|ý¦ýÙýþaþ·þÿpÿËÿn²ê8Vs«ÊñP~¥ÃÖÝÖÄ®˜„rdYRK=$Û³ŽkN9*ùÜ·‡L»ÿoÿ$ÿÜþ—þZþ(þþåýÌý´ý›ý€ýaý=ýýðüÑü¹ü«ü¦ü­üÀüÛüøüý*ýEýgýýÂýþKþ£þÿaÿ¿ÿh°ê?b„¤Äç?pžÅäøùèÒ»¥‘ri`P5ç¼’kK2!ëΨx<öÿªÿ]ÿÿÊþ…þHþþïýÐý¶ýý…ýjýLý(ýýÝü¿ü©üœü™ü¢ü¶üÓüñü ý'ýCýcýŒý½ýûýFþžþüþ]ÿ»ÿg°ìGm³Õú$R‚¯ÖôöÞÅ­—„uk`O4丌cB) øáÄŸo3ïÿ¥ÿZÿÿÊþ‡þJþþðýÐýµýœý„ýkýNý+ýýäüÆü±ü¤ü¢ü­üÃüáüýý:ýWývýœýÌýþPþ¥þÿaÿ¾ÿh±î Jq—»ß/]‹·Üø ôÚ¾£ŠtdXL; üѤvL)ýîÝȬ‡WÚÿ‘ÿHÿÿ»þ{þAþþéýÉý®ý•ý~ýfýJý*ýýçüÌü¹ü®ü¯ü½üÖüöüý:ýXýwý˜ý¿ýîý)þrþÇþ#ÿÿÞÿ6ˆÐ ?j’·Ûþ$Nz¥Íï øÜ½ŸƒjWI:& 之\1 ñÞϾ©i;Âÿ|ÿ4ÿîþªþkþ3þþÞý¿ý¤ýŒýuý^ýDý%ýýçüÎü½üµü¸üÇüâüý'ýJýký‹ý­ýÓýþ<þƒþÖþ1ÿŽÿêÿ@‘×Do•¸Úü Hq™¾Ýõöß¡‚eL9+ îÌ£vJ!èØË¾«’pC Ïÿ‹ÿFÿÿ¿þ‚þJþþõýÔý¸ý ýŠýsýZý=ýýýçüÖüÍüÑüáüûüý>ý`ý€ýŸý¿ýäýþKþ“þæþ@ÿÿøÿMœáLv›½Þþ!Fl‘²ÎãîíÞÆ¦„bD*ôßÄ¡yM"úÛŸ®¤•_6ÈÿˆÿEÿÿÄþŠþVþ*þþæýËý³ýýˆýoýTý7ýýýôüíüòüýý<ý]ý~ýý»ýÛýþý)þ`þ¥þöþOÿ©ÿU¡äLt—·Öô8\~¶ÉÒÐÀ§‡dB$ øè×è†^4 äÇ´ª¤’~b; Ôÿ—ÿXÿÿÛþ¡þoþDþ þþåýÍý·ý¡ýˆýlýNý1ýýýýýý0ýOýoýŽý«ýÇýåýþ0þeþ©þùþQÿ«ÿV¡ãKs–¶Ôò5Xz–®¾ÅÀ®’pK(îÛʹ¤‰g@íÈ­œ•“‰ya>Ýÿ¤ÿiÿ-ÿóþ¾þþhþFþ(þ þôýÜýÄý©ý‹ýjýKý1ýýýý&ý=ýYýwý“ý­ýÇýáýþ'þZþœþêþAÿ›ÿóÿF‘Ó :c‡©Éë4Z}›³ÄÊÅ´™wS0÷ãÑÀ©jBîȬœ”’ˆya=Üÿ¢ÿgÿ-ÿôþÀþ“þmþMþ0þþûýãýÉý­ýýlýLý1ýýýý#ý9ýTýqýŒý¦ý¿ýÚýùý þTþ–þåþ<ÿ–ÿïÿAŒÎ4^ƒ¥Æè 5\¡ºÌÓ_;íÜɲ•rK!øÔ¹©¢¡Ÿ™‹rMêÿ±ÿuÿ:ÿÿÍþŸþxþVþ8þþþýâýÄý¤ý‚ý^ý<ýýýùüøüýý.ýHýbý{ý”ý¯ýÎýöý+þmþ½þÿpÿËÿk­å?gŒ°Öÿ*U|ž¹ËÔÒÄ­pO1öæÑ¶–qJ$éÚÕÕÕÐê„Sßÿ¡ÿdÿ(ÿòþÁþ—þqþMþ*þþäý¿ý™ýqýIý#ýýåüÔüÎüÕüæüüüý-ýFý`ý|ýœýÆýüýAþ“þïþOÿ¯ÿWœ× 7aвÛ7dޱÌßèåÙĨ‰iL3 þèÌ«†_7úêäããÞж\!ãÿ£ÿcÿ%ÿìþ¹þŒþcþ;þþìýÅýœýrýHýýøüÖü¼üªü¥ü­ü¿ü×üñü ý(ýFýfý‹ý¹ýóý=þ“þóþXÿ¼ÿmµò'Wƒ­Ö.]вÔîÿóÝÁ¢cI4"öضf>ñëêéå×½•b&çÿ¥ÿdÿ#ÿçþ±þþSþ'þúýÍýŸýqýAýýäüºü–üyüfü`ügüxüüªüÆüãüý&ýNý€ý¾ý þfþÊþ3ÿÿ[ªî)`“Äô%XŒ¾ë-?GD7"êÊ«‘{hR8òÉžtN1 óÖ«s4ðÿªÿdÿÿÞþ£þmþ:þþÔý¡ýmý8ýýÏüžürüLü.üüüü-üEü`ü~üü¿üåüýGýŠýÜý;þ¤þÿÿêÿJžæ'dÓ?w¯å=\pywlX?"æÌ·£ŽsR,ÖªƒdOB:2&ï¾<ôÿ©ÿ^ÿÿÎþþRþþáý©ýpý7ýýüÄüŒüXü*üüæûÒûÍûÕûéûü"üCüfüü¸üéü%ýnýÅý(þ–þÿzÿçÿJ¡í2q®çX‘Ê0Wt†‰|gN0ôÛÆ²œa<辘{fZQI<&Ò”O»ÿpÿ%ÿÞþþ_þ%þêý¯ýsý6ýùü½üƒüMüüöû×ûÃû½ûÄû×ûñûü0üUü|ü©üÜüýcý¼ý þŽþÿtÿâÿEê/p­ç Y“Í2Xt…ŒˆzgO3ùà˸¢ˆhDòɤ†qcXM=$ÿÊŠB÷ÿªÿ\ÿÿÉþ‡þHþ þÑý•ýYýýßü¤ükü8ü üèûËûºû¶ûÀûÕûñûü4ü[ü…ü´üêü*ýwýÒý8þ§þÿŒÿúÿ\´E…Âý6n§Þ=`y‡‹„u`G* ðÖÀ¬•zY4 á·’t_OC6% å°p(ßÿ“ÿHÿþþ¸þwþ:þþÅýŠýOýýØüŸüiü9üüïûÖûÈûÈûÕûìû ü-üRüzü¥üÕü ýKý˜ýñýVþÂþ3ÿ£ÿ nÄR’Î B{³éEe|ˆ‰€oY?"åʳ†jI#ûЧ‚dO@3'üÖ¢bÔÿŠÿAÿúþ·þyþ>þþÌý’ýXýýäü¬üwüIü#üüîûâûãûñû ü)üLüqüšüÅüôü*ýhý³ý þlþÕþBÿ¯ÿvÉRË<sªß5Remj]H0÷عž‡r\B#Ú²‹hM:-" ôÑ¡e"Þÿ˜ÿTÿÿÓþ˜þaþ*þòýºý€ýFý ýÔü üsüNü0üüüüü6üUüxüüÄüîüýMýˆýÏý"þ€þåþOÿ¸ÿxÇ Iƒ¼ò(]‘Âì'592# òÖ¸˜y_I6# òÓ±ŒgG. ùæÇša!àÿÿ\ÿÿâþ«þuþ@þ þÑý˜ý_ý&ýðü¾ü“üpüUüAü7ü9üHübü‚ü§üÍüöü ýLý}ý¶ýûýKþ¦þ ÿoÿÖÿ8‘ÝYÅù+]¹ßüûâÇ©ŠjJ0 ÷âÊ­jG(÷ñìãÓ·WÞÿ ÿcÿ(ÿñþ¾þŒþZþ&þðýºýƒýMýýèüÀüŸü…ürüiülü{ü•ü¶üÚüý(ýPýzý©ýßý þlþÃþ ÿ‚ÿåÿB–ÝO‚³â?k”¶ÐàçåÙÆ®“wY:îÞ뤉jG%îÞÔÏÊõšr>Ëÿ‘ÿXÿ#ÿñþÂþ–þhþ:þ þÚý©ýyýKý"ýÿüäüÏüÁü»üÁüÒüîüý4ýZý€ý¦ýÍý÷ý(þdþªþùþOÿªÿ\©ë!Q~ªÔü$Lo¢¯´¯¡‹qU7øÙ¿¬›ŒycH*çɲ£™”‘ŒkHêÿ·ÿ„ÿTÿ&ÿûþÕþ°þ‹þeþ>þþíýÄýœýxýZýCý1ý%ý!ý(ý:ýUýuý˜ý»ýÞýþ$þIþuþ«þêþ2ÿÿÔÿ(x¿ú+V~¥Êî4TmˆŠ‚qX:ú׳‘s\H5 ë˨…fN>51/-%øÿÒÿ§ÿ|ÿSÿ,ÿ ÿêþÐþ¸þŸþ†þkþOþ1þþôýØýÂý²ý¥ýý›ý¤ý·ýÒýòýþ4þTþsþ‘þ±þ×þÿ<ÿ|ÿÂÿ WŸÞ;`¢Áßþ7M[a_S?"Þ¹’jD# óÞÇ®’sQ0þÿïÿèÿæÿçÿèÿåÿØÿÁÿ¢ÿÿ]ÿ=ÿÿÿðþàþÒþÄþµþ£þþ{þdþLþ6þ$þþ þþþ þþ4þPþmþ‹þ§þÂþÛþöþÿ=ÿnÿ¦ÿäÿ&j«ã4TrªÅáý)584&ïÊ£zO"øÔ¸ ‰rZ?#æÿÌÿ¹ÿ¯ÿ«ÿ¬ÿ±ÿ·ÿ¹ÿ²ÿ¡ÿ‰ÿnÿTÿ<ÿ'ÿÿ ÿÿÿþúþòþéþÜþÍþºþ¦þ’þþtþiþ`þ\þ`þoþ„þþ·þÑþëþÿÿ1ÿLÿpÿ›ÿÎÿB¼ï8Sm†ž¶ÏèÿîˤyMï›|bK4éÿÌÿ°ÿ˜ÿˆÿ€ÿ~ÿÿˆÿ‘ÿ–ÿ“ÿ‡ÿtÿ^ÿIÿ7ÿ)ÿÿÿÿÿÿÿÿÿ ÿúþéþ×þÈþºþ¯þ¥þŸþ¢þ­þÀþ×þïþÿÿ6ÿKÿ_ÿxÿ˜ÿ¾ÿìÿUŽÄò1G\pƒ—«ÀÔâéèßͱŒb6اyQ2îÿÙÿÃÿ¬ÿ”ÿ|ÿhÿ\ÿWÿYÿ`ÿkÿxÿƒÿ†ÿ€ÿtÿdÿVÿKÿBÿ>ÿ?ÿEÿMÿUÿZÿ[ÿYÿSÿGÿ8ÿ(ÿÿ ÿÿõþïþïþùþ ÿÿ4ÿKÿaÿuÿ‡ÿ˜ÿ­ÿÈÿêÿ>o¢Óü1CSbq¡±»¿»®˜yR%öÆ”b3 ìÿÓÿ¾ÿªÿ—ÿ„ÿpÿZÿEÿ4ÿ*ÿ(ÿ,ÿ7ÿFÿXÿgÿpÿoÿgÿ^ÿUÿOÿMÿOÿVÿbÿqÿ}ÿ‡ÿŒÿŽÿŠÿÿsÿeÿXÿKÿ@ÿ4ÿ-ÿ-ÿ5ÿEÿXÿmÿƒÿ—ÿ¨ÿ·ÿÅÿÖÿíÿ +S€®Úþ)5@KUan}Š’“Œ}eC켋Y'øÿÏÿ°ÿ˜ÿ„ÿrÿbÿRÿAÿ.ÿÿÿÿÿÿÿ0ÿEÿYÿeÿiÿfÿaÿ]ÿ\ÿ_ÿfÿsÿ„ÿ˜ÿªÿ¸ÿÂÿÈÿÇÿÁÿ·ÿ«ÿ ÿ–ÿ‹ÿÿyÿwÿ}ÿŠÿšÿ«ÿ½ÿÍÿÛÿæÿïÿúÿ <]‚ªÏí !(0;GRXXQA)ß³†W(øÿËÿ¥ÿ‡ÿpÿ^ÿOÿAÿ4ÿ%ÿÿÿýþøþûþÿÿ)ÿ@ÿVÿeÿlÿlÿjÿiÿlÿrÿ}ÿÿ¢ÿ¸ÿÎÿßÿíÿõÿ÷ÿôÿëÿâÿÙÿÐÿÇÿ½ÿµÿ²ÿ·ÿÂÿÐÿßÿîÿûÿ #4Idƒ¤ÃÜêñôöùý !'(!þߺ’i@êÿÂÿŸÿ…ÿrÿcÿWÿMÿBÿ5ÿ'ÿÿÿ ÿ ÿÿ!ÿ4ÿIÿ]ÿjÿoÿlÿhÿeÿeÿjÿtÿ„ÿ˜ÿ¯ÿÄÿ×ÿåÿîÿòÿðÿëÿåÿßÿÚÿÓÿÌÿÆÿÅÿËÿ×ÿçÿ÷ÿ&+1;I\s­ÈÝèëêèèéíôý  úæÊ©†b>òÿÎÿ¯ÿ™ÿ‰ÿ}ÿtÿkÿaÿUÿGÿ9ÿ-ÿ'ÿ&ÿ*ÿ4ÿBÿSÿbÿkÿkÿdÿ\ÿUÿRÿTÿ\ÿiÿ|ÿÿ¤ÿµÿÃÿÍÿÒÿÒÿÏÿÍÿËÿÊÿÈÿÄÿÂÿÅÿÏÿÞÿñÿ*7AHOYfxާÂÛìóóîéåãäéïöùøòæÓº›{[:öÿÔÿ·ÿ¢ÿ’ÿˆÿÿwÿmÿaÿRÿCÿ6ÿ-ÿ*ÿ,ÿ3ÿ@ÿNÿ[ÿaÿ^ÿUÿJÿ@ÿ;ÿ:ÿ@ÿKÿ\ÿnÿ€ÿ‘ÿžÿ©ÿ¯ÿ±ÿ²ÿ²ÿ´ÿ·ÿ¹ÿ»ÿ½ÿÄÿÒÿæÿýÿ-AQ]eny‡˜®Æà÷  úôïîñõùûøñåÒº~`B"âÿÇÿ³ÿ¥ÿ›ÿ“ÿŠÿÿqÿ_ÿMÿ=ÿ1ÿ+ÿ)ÿ,ÿ4ÿ?ÿGÿIÿCÿ6ÿ'ÿÿÿÿÿÿ)ÿ:ÿJÿZÿgÿrÿyÿ}ÿ€ÿ„ÿ‹ÿ“ÿ›ÿ¢ÿªÿ·ÿËÿäÿ:Sgu€‹—¦¸Îæÿ#(#   ûíÚÀ£…hJ* ëÿÑÿ½ÿ¯ÿ¥ÿÿ”ÿˆÿxÿeÿPÿ>ÿ/ÿ&ÿ!ÿ"ÿ'ÿ.ÿ4ÿ2ÿ(ÿÿÿ÷þíþéþìþõþÿÿ$ÿ3ÿBÿNÿXÿ`ÿhÿrÿÿÿ›ÿ¨ÿ¶ÿÊÿäÿ&Ik‰ ±¾ÉÖåö ":NYYQE7,#ùæÎ±’rS4òÿÑÿµÿ ÿ’ÿˆÿ€ÿwÿkÿ[ÿGÿ2ÿÿÿÿþþÿþÿ ÿÿÿÿõþäþÕþÌþÉþÍþ×þæþ÷þÿÿ'ÿ4ÿ@ÿKÿVÿdÿtÿ†ÿ˜ÿ¨ÿ¹ÿÐÿíÿ5]ƒ¤¾Òáîü 3Kcv€€vhYK?71,%üæË¬‹kK+ æÿÃÿ¦ÿÿ€ÿvÿoÿgÿ\ÿLÿ9ÿ$ÿÿÿ÷þòþôþûþÿ ÿ ÿÿôþäþ×þÏþÎþÓþßþîþÿÿ ÿ.ÿ;ÿGÿQÿ]ÿkÿ}ÿÿ ÿ°ÿÂÿØÿöÿAk“¶Òç÷"5Jc{Ž˜–‹{jYK@6.#ëϯŒgC ýÿØÿ±ÿŒÿnÿWÿHÿ?ÿ8ÿ2ÿ)ÿÿ ÿ÷þæþÙþÑþÏþÔþàþîþúþÿþûþñþæþÝþÙþÜþåþôþÿÿ/ÿ@ÿPÿ^ÿjÿuÿÿÿ¢ÿµÿÆÿ×ÿèÿÿÿBk–¿âÿ#0=K\q‰ ²ºµ§”kYJ</ öÚº•mDöÿÐÿ§ÿ~ÿWÿ6ÿÿÿÿþþøþðþäþÔþÃþ´þ¨þ£þ¤þ¬þ¼þÎþÞþæþæþßþ×þÒþÑþ×þãþõþ ÿ"ÿ8ÿLÿ^ÿmÿzÿ†ÿ“ÿ£ÿ·ÿËÿÝÿîÿ5[…°Ùý/?KWevŠ¢¹ËÒ̼¦xcQ@0íΩU*Úÿ³ÿŠÿaÿ:ÿÿÿõþíþéþæþáþÙþÌþ¾þ±þ¨þ¥þ©þ´þÇþÜþïþùþúþóþëþæþåþëþ÷þ ÿÿ5ÿJÿ\ÿkÿxÿ‚ÿŒÿ˜ÿ¨ÿ»ÿÏÿáÿñÿ6\†²Ü 6GT`o—°ÊÝäÞ͵œƒmXF4 ç˜k< ãÿºÿ’ÿhÿ=ÿÿóþÛþÍþÆþÃþÂþÀþºþ±þ¥þšþ”þ“þ›þªþÁþÛþòþÿÿÿþøþôþöþþþ ÿ ÿ8ÿPÿeÿvÿƒÿŽÿ–ÿŸÿªÿ¹ÿÌÿàÿñÿ#?c‹¶à$;JWbp‚˜²Íáéâи„mXE3Ṍ[)ùÿÌÿ¢ÿyÿMÿ!ÿöþÒþ¹þ©þ¡þžþžþþ™þ‘þˆþþ{þ}þˆþœþ¸þ×þôþÿÿÿÿÿÿÿ0ÿHÿbÿ|ÿ’ÿ£ÿ°ÿ¸ÿ¾ÿÄÿÌÿØÿèÿùÿ*A`„¬Òõ&4?JWh€œ¸ÏÙÕÆ¯—jXG6"弎['õÿÆÿšÿoÿAÿÿäþ¼þŸþþ‚þ~þ}þ|þxþrþiþcþaþfþuþŽþ°þÕþøþÿ ÿ&ÿ)ÿ.ÿ8ÿHÿ_ÿ{ÿ™ÿ¶ÿÏÿáÿíÿõÿúÿýÿ %/5:CTl‹¬Íë$,7G^z—¯º·©“|eRA2$øÖ­~Jâÿ²ÿ…ÿXÿ*ÿùþÉþ þ€þkþ_þYþWþVþSþNþHþCþDþLþ_þ|þ¢þÍþôþÿ&ÿ0ÿ7ÿ?ÿLÿ_ÿxÿ˜ÿ¹ÿÚÿõÿ "'0<HPTW]j~˜µÓï#)3CZx–¯¼»®šƒmZJ<.á¶…Oäÿ²ÿ…ÿXÿ)ÿ÷þÇþþ|þdþVþPþMþLþJþEþ?þ;þ<þEþXþvþþÉþòþÿ'ÿ2ÿ:ÿBÿOÿbÿ|ÿœÿ¿ÿàÿûÿ"%'+4?JQTUZdv©Æá÷(:Sr’­½½²žˆq^N@2!庈Ræÿ´ÿ‡ÿZÿ*ÿøþÇþœþyþaþQþJþGþFþDþ@þ;þ7þ9þBþVþuþžþÌþöþÿ-ÿ9ÿAÿIÿUÿgÿ€ÿ ÿÂÿãÿÿÿ$&'+3?IPRRT]mƒ¹Ôêú 2Mn‘¯Àù§‘|iYL>.óÈ”]$îÿ¼ÿÿ_ÿ.ÿúþÇþšþuþZþHþ?þ:þ9þ6þ2þ-þ)þ*þ4þHþiþ“þÂþïþÿ*ÿ9ÿBÿKÿXÿkÿ†ÿ¦ÿÊÿíÿ ,256:BMW]^\]cpƒš´Ìáðù%@c‡¦ºÀ¹©–ƒreZO@* à®v>Öÿ¨ÿyÿGÿÿÞþ­þ†þgþRþEþ=þ8þ3þ-þ&þ þþ&þ8þWþ€þ®þÚþýþÿ$ÿ-ÿ7ÿEÿYÿsÿ”ÿ¹ÿÜÿúÿ$')-6ALRSRRWcuŒ¥¾Ôåðù#@dЬÃÌÈ»«›Œ€vl^I)þË’X íÿ¼ÿŠÿVÿÿåþ±þ„þaþGþ4þ(þþþþþûý÷ýüý þ)þQþþ«þÐþëþýþ ÿÿ(ÿ?ÿ]ÿÿ©ÿÐÿòÿ &+/6AN[ceefkv‡µÏåö "5Qu›½ÔÞÜÒ󤘎„v`Aãªo6Ðÿÿhÿ/ÿõþ¾þŽþgþHþ1þ!þþþüýïýäýÝýÞýêýþ)þTþþ¤þ¿þÒþáþðþÿÿ;ÿaÿ‹ÿµÿÚÿöÿ #,9IWbghjp|£¼Öî#1Ea„ªÍåððæÙʼ±§ž‘|\2ÿÅŠPéÿ¶ÿ€ÿGÿ ÿÔþ¢þxþWþ=þ)þþ þþýïýáý×ýÕýßýõýþ?þhþŠþ¤þ¶þÄþÒþäþüþÿAÿjÿ”ÿ¸ÿÕÿéÿõÿüÿ &6BILPXewªÇáø &6Lj¸ÜöõéÝÓÌĸ¤†\(í°u= Öÿžÿcÿ&ÿìþ·þ‰þcþFþ.þþ þúýêýÚýÏýËýÒýæýþ-þUþwþ‘þ¤þ³þÂþÕþîþÿ5ÿ`ÿŠÿ°ÿÎÿâÿîÿõÿûÿ 0=EHLR^o… ¼×ï 0Geв×óúïåÞØÒȵ˜n;ÿÁ…Nåÿ®ÿrÿ4ÿøþÀþþfþFþ,þþþóýâýÒýÅýÀýÅý×ýöýþCþfþþ•þ¥þµþÉþãþÿ,ÿWÿƒÿªÿÉÿÞÿëÿòÿøÿ /=FLPVbs‰£¿Ùñ#3He‰±ÕòüòêãÞØÏ¾¢{HÒ–_+÷ÿÀÿ…ÿGÿ ÿÒþ þwþTþ9þ"þþûýéý×ýÉýÂýÆýÖýòýþ;þ\þvþ‰þ˜þ§þ¹þÑþðþÿ@ÿjÿÿ®ÿÄÿÑÿØÿÞÿçÿõÿ(3:AJWj‚ž¼Ùô .@WvœÅë #" ÿùïÝ™f+ì®u>Ðÿ“ÿTÿÿÜþ¨þ{þUþ6þþþðýÜýÉý¹ý°ý±ý¾ýØýúýþ?þYþlþ{þ‹þþµþÔþùþ"ÿLÿsÿ’ÿ¨ÿ¶ÿ¾ÿÄÿÎÿÝÿðÿ$/9ETiƒ¡Àßü);Og†­×þ4=>:3,&"弈K ËVäÿ¥ÿdÿ#ÿæþ®þ~þVþ3þþüýäýÍý·ý¤ý™ý—ý¢ýºýÚýüýþ5þHþXþgþyþþ¯þÔþýþ&ÿMÿmÿ„ÿ’ÿ›ÿ£ÿ¯ÿ¿ÿÕÿìÿ,:Md Âã3G\u–½è3JVXTNHB=7,ýÓž`Üžd*ïÿ¯ÿnÿ,ÿïþ¸þˆþ_þ=þ þþïýØýÃý°ý¤ý¢ý­ýÄýãýþ%þ>þRþaþoþ€þ–þ´þ×þþþ'ÿLÿjÿ€ÿÿ”ÿ™ÿ¡ÿ¯ÿÂÿ×ÿëÿüÿ &9Ro³Ö÷-CYt•½é6O\`]XRLGA6$Ü¥dÙ—XÝÿ›ÿXÿÿÖþþkþBþþþèýÑý¼ý¨ý—ýŒýŠý•ý­ýÍýñýþ.þCþSþcþvþŽþ­þÓþüþ'ÿOÿqÿ‰ÿ—ÿŸÿ¥ÿ®ÿ¼ÿÐÿæÿûÿ +=RlŒ¯Ôø:Um„ž¿ç<^uƒ~vme]TG2å«fÒŒIÇÿƒÿ=ÿøþ·þ|þIþþúýÜýÂý¬ý—ý„ýtýiýhýsý‹ý«ýÏýñýþ#þ5þFþZþsþ”þºþæþÿ=ÿaÿ|ÿÿ—ÿŸÿ©ÿ¹ÿÎÿåÿüÿ#5Jb¢Çï=_~˜²ÎðBkŒ¢¬¬¥šŽ‚viX@í°i΄=úÿµÿnÿ&ÿàþžþcþ/þþàýÂý©ý”ý‚ýrýdý\ý]ýjýƒý¦ýËýîý þ$þ7þIþ^þxþ˜þÀþëþÿEÿkÿˆÿ›ÿ¥ÿ­ÿ·ÿÆÿÚÿñÿ/AVn‹¬Ñø Fh‡¡¹ÔõDkŠž§¥›~oaQ>%Ð’Iû¬`ÔÿÿHÿÿ½þ|þBþþæýÄý©ý“ýýrýdýZýTýWýfý‚ý¦ýÎýóýþ-þBþUþkþ†þ§þÏþüþ,ÿZÿ‚ÿ¡ÿµÿÁÿÊÿÕÿäÿùÿ&<Pdz“±Óø Ho’±ËãýAhŒ©¹½·¨•€lXC+ å°mÌy*àÿ˜ÿPÿ ÿÁþ|þ<þþÒý©ý‰ýoý\ýNýBý9ý2ý0ý8ýKýjý’ý½ýæý þ'þ?þVþoþþ±þÝþ ÿ@ÿrÿÿ¿ÿÖÿäÿïÿûÿ 8Pf{¦¿Ýþ#Kr™»Ùò =^¡¹ÅĹ¥sY@' é½…?ïšEöÿ«ÿcÿÿÖþ’þPþþÝý°ýŒýpý[ýMýCý=ý9ý8ý;ýFý]ý€ýªýÖýþ$þBþ[þrþŠþ§þËþõþ$ÿVÿ†ÿ°ÿÐÿåÿòÿûÿ&<Sh}‘§ÀÞ&NwžÃâý,Hh‰¥¹Â¾¯˜{^A$èÕ[ÃmÉÿ}ÿ6ÿñþ­þkþ-þôýÂýšýzýdýUýLýJýJýMýRý[ýmýˆý®ýÛý þ4þYþwþþ¥þ¼þØþùþ!ÿMÿ{ÿ¨ÿÎÿëÿþÿ .ATgyŒ¡¹ÖùHqšÁâþ0Mm¨¹¿¹§nN.ïͦv;ó¡K÷ÿ§ÿ\ÿÿÏþŒþLþþÙýªý„ýhýTýHýCýDýIýPýYýgý|ýœýÅýôý#þOþuþ“þ¬þÂþÙþôþÿ<ÿgÿ”ÿ¿ÿåÿ$.=M_p“¦¾ÚûGo˜¾àý0LlŠ£²¶®š_=ýݺ’c(á;èÿ™ÿOÿ ÿÆþ…þGþ þ×ý©ý„ýiýVýKýGýIýPýYýeýtý‹ý«ýÕýþ2þ]þ‚þŸþ·þÌþâþüþÿAÿkÿ•ÿ¿ÿâÿýÿ "0?Par„—®Êê7`‰°Ôó)Gg…ž®±©–{[:úÚ¸a&ß;éÿœÿSÿ ÿËþ‹þNþþàý³ýýtýbýWýSýVý]ýgýsýƒýšý»ýäýþ@þjþŽþ«þÂþ×þìþÿ%ÿKÿtÿŸÿÈÿìÿ$-:J[k| ¶Ññ<d³Öô(Ec€˜¦¨žŠmL* êʨ€QÏ*ØÿŠÿAÿûþ¹þyþ<þþÎý¡ý}ýbýQýGýDýHýPý[ýiýzý’ý´ýÞý þ<þgþþ¬þÅþÛþóþÿ0ÿXÿ„ÿ±ÿÝÿ/7<AJWfw‡˜©»Ïé*Nu›¿ßú)C_y˜˜ŒwY8õÖ¶•n@ÀqÌÿ~ÿ5ÿðþ¯þpþ5þþýËý ý}ýcýRýIýGýJýSý^ýký}ý•ý¶ýàýþ<þfþŠþ©þÂþØþðþ ÿ.ÿVÿƒÿ±ÿÝÿ1:?FP]m~¢µÈÞø:_†¬Ññ #9Qkƒ•žœxX5ïÏ®‹c4ù±a ¹ÿjÿ ÿÛþ™þZþþèý¶ý‹ýhýNý>ý5ý4ý9ýBýOý]ýoýˆýªýÔýþ1þ[þþ þ»þÓþìþ ÿ.ÿXÿ†ÿ¶ÿäÿ *>JPXds„–ª½Ñåû4V{ Æê #8Mc{ ¦¢“zY4ëɦ‚Y(ì¤Rýÿ¨ÿXÿ ÿÇþ„þFþ þÔý¡ýuýRý7ý&ýýýý&ý2ý@ýQýjý‹ý´ýáýþ9þ_þþ›þ´þÎþíþÿ@ÿpÿ£ÿÔÿÿÿ!9IT`pƒ™±Éáù*Gg‹±Øÿ#B\q„™®ÁÍÏȶ™tK!ùÒ«‚U à”>æÿŽÿ<ÿîþ¦þbþ#þçý°ý}ýPý-ýýýøüöüûüýý!ý3ýLýný—ýÅýóýþEþgþ„þŸþ»þÜþÿ3ÿfÿ›ÿÏÿþÿ#>Q_n˜±Ìç7Rp’·Þ,Qp‰¯ÂÔäíìâ̬ƒV(ûѦyGÊ{"ÆÿkÿÿÅþzþ4þôý¸ý€ýMý ýüüâüÒüÊüÊüÑüÞüïüýý3ýXý…ý·ýèýþCþiþ‹þªþÊþïþÿMÿ„ÿ½ÿôÿ&Om‚“¤¸Ñë$A\u«Êë2Uu¥´ÀÍÚãæàж‘d2ÿΟq@ Њ9ßÿÿ%ÿÎþ~þ4þðý²ýyýEýýìüËü´ü¨ü¤ü¨ü´üÆüÜüôüý2ý\ýŽýÄýúý.þ^þ‰þ°þÓþ÷þ ÿOÿ„ÿ½ÿ÷ÿ0d®ÄÕæú*Ea|–®ÅÞù5Ts¦¶ÁÉÐ×Ú×Ê´”i6ÿÇ‘]*ö¾7æÿŠÿ,ÿÐþzþ+þâý¡ýgý3ýýØü´ü™ü‡ü€üüŒüžü·üÔüôüý?ýpý§ýãýþWþŒþ¼þæþ ÿ4ÿ^ÿÿÅÿ:t¨Òñ%7Kb{•®ÅÚí0Id~•¨µ¼ÁÄÇÆ¿¯–rDÓ—^'ñº€@øÿ¤ÿHÿéþþ7þéý¢ýcý,ýüüÑü«ü‹ütügüdükü{ü“ü²üÖüüü&ýVýŒýÉý þJþˆþÁþõþ#ÿMÿvÿ¢ÿÓÿ C~·ê0CO[iyŒ¡·Ìßïþ /CXmšžŸ  œ“gCߤi0ùÃUÐÿ~ÿ$ÿÇþlþþÌýˆýMýýìüÅü¢ü†üqügüfüpüƒüŸüÁüèüý>ýpý¨ýæý(þiþ§þáþÿEÿoÿ˜ÿÃÿóÿ'_˜Ï(CT`jv…—ªÀÔæô ):M`q~†‰‰ˆ‡ƒygN*ýÈŽSâ­w?»ÿiÿÿ´þ[þþ¼ýzýAýýæüÁü¡ü‡ütülümüyüü­üÓüüü(ýWýŠýÄýþEþ†þÅþÿ4ÿcÿŒÿ´ÿÝÿ =sªà5O^hq{ˆ™«¿Óãðú):K[gnppomi_O6è´{@Ñœh1õÿ°ÿ`ÿ ÿ¯þXþþ¿ýýHýýóüÑü´üœüŒü…ü‰ü—ü®üÏüöü ýMý|ý¯ýèý&þfþ¦þâþÿMÿxÿŸÿÃÿéÿ@r¦×%<IQW`l{ ´ÄÑÛåñÿ 3ES\_abb_VF/ã°w>Ï›f/óÿ®ÿ`ÿ ÿ²þ^þþÊýýZý/ý ýíüÓü¿ü³ü°ü·üÈüâüý-ýYý†ý¶ýèý þ\þšþÖþÿCÿpÿ—ÿ¸ÿ×ÿøÿDqŸËò!*/39CPas†—¤¯ºÇÖèü&7BIMQSRL?) à®v=Лf/óÿ®ÿ`ÿ ÿ³þ_þþÍý’ý`ý8ýýúüâüÐüÅüÄüÍüàüûüýIývý£ýÒýþ:þtþ°þêþ ÿQÿ|ÿ ÿ¾ÿÙÿ÷ÿ=f‘»ßû  *8J_s…“ ¬ºËÞô "4AINRUUOC.çµ~E ×¢m5úÿ´ÿfÿÿºþgþþ×ýýlýDý$ýýñüßüÕüÔüÜüïü ý-ýVýý­ýÚý þ=þtþ¬þãþÿFÿnÿÿ­ÿÇÿãÿ%Nx Äàñùý $7Mcv‡•¢±Ã×î/<EJORRMB.鹃KÞ©u>¿ÿrÿÿÊþxþ.þìý´ý…ý_ý@ý&ýýÿüõüôüýüý)ýKýrý›ýÄýîýþKþþ´þçþÿDÿjÿ‰ÿ£ÿ»ÿÕÿòÿ9b‰«ÆÖßãèðü "9QgyŠš¬À×ð #7FPV\__ZO;õÅŽUå®x?½ÿoÿÿÅþsþ(þæý­ý~ýXý:ý!ý ýüüôüôüþüý,ýNývýŸýÈýñýþNþþ¶þéþÿEÿkÿŠÿ£ÿºÿÓÿïÿ3Y~Ÿ·ÆÍÐÔÛæö #<Sh{Ž£ºÔð '>NZcjproeR5 Ý¥l2ùÀˆM Çÿvÿ ÿÉþvþ*þèý¯ý€ýZý;ý"ýýÿü÷üùüýý1ýSýzý¢ýÊýóýþNþþµþçþÿAÿeÿƒÿ›ÿ±ÿÉÿäÿ%ImŒ£±¶¹¼ÃÏàö*CZp†·Óñ-EWdnw}€}s_Bç®s7ûÁ†H¾ÿlÿÿ¾þkþþÝý¥ýxýUý9ý"ýýýÿüýý%ýBýeýý·ýàý þ5þdþ–þÉþûþ*ÿSÿvÿ’ÿ©ÿ½ÿÒÿëÿ'Ij‡›¦«¬®µÁÓê!<Ul„ž¹×÷4M`nx€†‰†|hJ!ïµx;þÁ„E¶ÿbÿ ÿ°þ[þþÌý•ýhýEý*ýýý÷üóü÷üýý8ý\ý…ý®ýØýþ-þ\þŽþÁþôþ#ÿMÿrÿÿ§ÿ¼ÿÓÿíÿ ,OqŽ£¯³µ¸¿Íàú4Qk„·Óñ0MewƒŒ’––‘„oO#ï³t5÷¸y8òÿ¥ÿPÿöþœþFþúý¸ýýUý3ýýýóüèüäüéü÷ü ý*ýOýwý¡ýÊýôýþNþ€þ³þåþÿ@ÿdÿ‚ÿ›ÿ²ÿËÿæÿ(Lo£°¶¹½ÆÕë&Fd€›µÐí +Jg𠤥¢šŠqMç©g&å¤cØÿ‰ÿ2ÿ×þ|þ'þÚý™ýcý9ýýÿüëüÜüÓüÑü×üçüÿüýEýoýšýÅýðýþMþþ³þçþÿDÿjÿ‰ÿ£ÿ¼ÿÖÿóÿ7\³ÀÅÈÍÖæü9Yx•¯Êæ"Aa~•¦°¶¸·³©˜~X(î®k'ãŸ[ÊÿxÿÿÁþeþþÀýýIýýÿüæüÓüÄü»ü¹üÀüÐüèü ý0ý\ý‰ý¶ýâýþBþwþ­þâþÿEÿnÿÿ®ÿÉÿæÿ'Lq•´Ê×Ýßãìû.MmŠ¥½Öï 'Db}“¡©¬¬©¢–ƒgAÕ”P ǃ?ùÿ®ÿ]ÿÿªþOþúý¯ýpý>ýýúüäüÓüÆüÀüÀüÈüÙüóüý>ýký™ýÇýõý#þUþ‰þ¿þõþ)ÿYÿƒÿ¦ÿÄÿáÿþÿAfŒ°Îåòùû.Ih‡£¼Òé0Ke|Ž™ž™’‡waBå©f!Û–P Åÿzÿ)ÿÓþyþ!þÏý‡ýKýýùüàüÍüÀü·ü³ü·üÂüÖüòüýBýqý¢ýÒýþ3þfþœþÔþ ÿBÿtÿŸÿÅÿåÿ"Dh³Öô !)7Lf„¡»Òæù !6Lcw†Ž‹ƒxjX?ô¿‚?ú´n(äÿÿSÿÿ°þXþþ³ýmý4ýýéüÓüÅüºü´ü³ü¸üÆüÛüøüýKý|ý¯ýâýþGþ{þ³þìþ%ÿ^ÿ’ÿÁÿéÿ ,Mp”ºß 5AEFGLWjœµÌßîý *:L[eie]QB1ඃGÄ>ýÿ»ÿyÿ4ÿëþœþKþûý²ýsý?ýýÿüîüäüÝüÚüÜüäüóü ý'ýMýyýªýÝýþ?þpþ£þÙþÿHÿÿ³ÿàÿ)JjŒ¯Óö4HSVUTW`o„›²ÅÕâíø &1770%ñÚ¿s@džFÇÿ‰ÿJÿ ÿÅþ|þ0þæý¢ýhý:ýýý÷üñüïüñü÷üýý-ýMýtý¢ýÔýþ:þlþžþÒþÿ@ÿxÿ¯ÿãÿ7Yy™¹Ûý?Ykturnns£µÅÐÙßåêð÷þùêÙÆ±š]5ÌRÙÿÿcÿ)ÿíþ®þjþ$þàý¡ýlýCý&ýý ý ý ýýý)ý<ýVýwýžýÌýþý1þdþ–þÈþûþ1ÿiÿ¡ÿØÿ 8_‚¡Àßÿ>[s‚ˆ†xtu|‰˜¦²¹½ÀÁÂÃÅÉËɶ¦”lU<÷É•]$ìÿ´ÿ}ÿHÿÿÝþ£þfþ&þèý¯ý€ý]ýEý9ý6ý8ý>ýFýRýbýwý‘ý²ýÚýþ8þkþþÎþÿ3ÿhÿŸÿÖÿ =j°Íé!=Yr…‘“Žƒyqnqz…—››™–’ŒŠ…{m\I5! óÖ³ˆX$ïÿºÿ†ÿTÿ$ÿôþÄþþXþþçýµý‹ýmý[ýSýTýZýdýoý}ýý¥ýÁýâý þ8þiþ›þÎþÿþ1ÿdÿ™ÿÐÿ;m™¾Ýù,E^v‹œ¤¤›Ž€uoot{ƒ‡‡„~woga\WOC3  ÷âͶ›zS'øÿÇÿ–ÿfÿ8ÿ ÿâþ¶þ‰þXþ%þôýÈý¤ý‹ý}ý{ý€ýŠý˜ý¦ý·ýÊýàýûýþBþnþžþÏþÿ1ÿbÿ”ÿÇÿüÿ1e•Àå5Kaw‹©®ªŸŽ}nd`aeijg`WK?3( ûéÔ¿ª•€jQ4êÿ¿ÿ”ÿhÿ>ÿÿñþÍþ¨þþWþ+þþÛý½ýªý¡ý£ý­ý»ýÌýÝýðýþþ6þUþzþ¤þÒþÿ1ÿ_ÿŽÿ¾ÿðÿ"U‡¶ß7Ncw‹­·º´§•‚qe_^`a`[QE6' ýñãÒ¾¨‘{eO9!åÿÀÿ˜ÿpÿHÿ!ÿýþÛþºþ™þuþOþ'þþÞýÄý´ý®ý²ý¾ýÎýàýóýþþ3þNþmþ’þ¼þêþÿHÿwÿ¦ÿÖÿ8kÌõ5NdxŒž¯½ÆÈÁ²ŸŠxjb__^[SG8'óäÕŲœ„lU?*ÿÿåÿÆÿ¤ÿÿZÿ5ÿÿðþÑþ³þ•þtþQþ,þþèýÐýÂý¾ýÃýÐýáýôýþþ1þIþdþ„þ©þÓþÿ0ÿ_ÿÿ¼ÿëÿM€±ß+G_t‡™ª¹ÆÍÍŵ Švf\WURLC5$ýéׯ¶¤zbJ2ôÿÞÿÅÿ¨ÿ‡ÿdÿAÿÿþþßþÂþ§þ‹þmþMþ*þ þìýÖýÉýÆýÍýÛýîýþþ,þBþ[þwþ˜þ½þèþÿFÿvÿ¦ÿÖÿ6h›Ìú"EayŽ ²ÂÑÝããÚÉ´ˆvjc_ZRF6! óÜÆ±‰rZ?% ôÿÝÿÇÿ°ÿ—ÿzÿYÿ8ÿÿõþÕþ¹þžþ…þlþQþ4þþ÷ýÝýÊýÀýÀýÊýÛýðýþþ5þNþhþ†þ¨þÏþúþ*ÿ[ÿÿ¾ÿïÿQƒ¶ç>a}•ª½ÎÞìøþýôäϸ¢ƒ{undVC,øÝë”|cG* òÿ×ÿ½ÿ¥ÿŒÿpÿRÿ0ÿÿëþÊþ«þþuþ]þFþ-þþ÷ýÜýÆý·ý±ýµýÃý×ýðý þ%þ@þ[þxþ˜þ¼þåþÿCÿvÿªÿÜÿ@s¦Ù 8aƒ ·ËÜìúôÝĬ—ˆ}uk^M6ÿáæ‹pV:ÿÿáÿÄÿ©ÿÿwÿ_ÿEÿ(ÿ ÿèþÉþªþŽþuþ^þIþ5þþþïýÙýÆýºý·ý¿ýÏýçýþþ;þWþtþ“þ´þÙþÿ2ÿdÿ˜ÿËÿÿÿ1c–Êý.\„¥ÁØëü $-0,  ôÙÀª™‹€sbM3óÑ®oQ3öÿÕÿµÿ—ÿzÿ`ÿGÿ/ÿÿøþÙþºþ›þ~þcþKþ6þ$þþÿýëýÖýÂý³ýªý«ý¶ýËýæýþ&þGþgþˆþªþÏþøþ%ÿWÿŒÿÃÿúÿ.c—Ëþ1b¶Öð%2<EKKD4ãÅ«–„tcO6õЪ„a? âÿÁÿ ÿÿaÿDÿ*ÿÿúþàþÅþ¨þ‹þoþUþ=þ)þþ þûýìýÜýËý»ý°ý«ý°ý¿ý×ýöýþ=þaþ…þ©þÎþöþ!ÿQÿ†ÿ¾ÿ÷ÿ.e›Ï6g–Áå,;GQY_a_TB(æÅ§ŽxcM4ôÍ¥{R,èÿÇÿ§ÿ…ÿdÿDÿ%ÿ ÿðþÙþÂþ©þþuþZþAþ*þþþùýïýåýÜýÑýÅý»ýµý·ýÁýÖýóýþ=þeþŒþ³þÚþÿ-ÿZÿŒÿÂÿûÿ4m¤Ù ?pŸÊñ+>LW_fjmlgZE(⿞‚iR9ü×®ƒV,ßÿ¼ÿšÿxÿUÿ3ÿÿôþØþ¾þ¦þþwþ]þCþ*þþþýîýáýØýÒýÎýÉýÃý½ý¹ý¹ýÀýÐýéý þ3þ^þŠþµþßþ ÿ4ÿaÿ‘ÿÅÿüÿ5o§ÞDu¤Ðù9N]gnruvuqhX@!ýÖ°ŽoT:ܵŠ]0Üÿ¶ÿ’ÿoÿMÿ+ÿ ÿéþËþ°þ˜þþjþSþ;þ"þ þöýäý×ýÍýÈýÆýÅýÅýÃýÁýÂýÆýÒýçýþ+þWþ…þ´þâþÿ<ÿiÿ—ÿÉÿýÿ4n§ßFw¥Ñû ?Whsx{{yvqi[G+ á·jI+ñЫ‚V)üÿÑÿ¨ÿ‚ÿ_ÿ=ÿÿúþÙþºþžþ…þoþZþFþ1þþþóýâýÕýÌýÈýÇýÉýÍýÑýÓýÖýÛýäýôý þ/þYþ‡þ¸þèþÿGÿuÿ¤ÿÔÿ:qªáIx¥Ðø>Ymy€~zunfZJ3ðÇœrL* îÏ­ˆ_4Üÿ±ÿ‰ÿdÿAÿÿþþÜþ¼þþþhþRþ>þ*þþþëýØýÉý½ýµý²ý´ý¸ý¾ýÅýËýÑýÙýçýûýþ=þjþ›þÏþÿ6ÿhÿ™ÿËÿþÿ1h¡ÚFx¦ÑùA_u…ˆ€wmaR>$ܱ…Z3ðѲjCïÿÅÿœÿwÿTÿ3ÿÿòþÒþ³þ•þzþbþLþ8þ#þþùýåýÓýÄý¹ý²ý¯ý²ý·ý¾ýÆýÍýÕýàýðýþ%þMþ{þ®þâþÿKÿÿ²ÿåÿN…¾ö,_Žºã ,Lfy…‰‰„|rgZL<' é—k@÷׸™wS-ÝÿµÿŽÿkÿJÿ+ÿ ÿîþÐþ³þ—þ}þfþQþ=þ*þþþìýÚýËýÀý¹ý·ýºýÀýÇýÐýØýâýîýþþ9þbþ‘þÅþúþ0ÿeÿšÿÎÿ5j¡ÙEw¤Ïõ8Tk{ƒ„€xm`RD3! ïÌ¥zO%ÿݽŸa>öÿÐÿªÿ‡ÿfÿGÿ+ÿÿóþ×þ»þ¡þˆþrþ]þIþ5þþ þõýâýÒýÇý¿ý¼ý¾ýÄýÌýÔýÝýçýôýþþ@þiþ˜þÌþÿ6ÿkÿ ÿÔÿ;p§ÞHy¥Îô5Peszysi]O@0 ÷ܺ“j@òѳ–yZ9õÿÑÿ®ÿÿoÿSÿ8ÿÿÿéþÏþµþžþˆþsþ_þKþ5þþþôýãýÖýÎýÊýËýÑýØýàýéýóýÿýþ*þJþrþ þÒþÿ:ÿnÿ¢ÿÕÿ:o¤ÛCrÄè &?R_daYM@0 ÿíÖ»›uM%þÚ»Ÿ„iL.ðÿÏÿ¯ÿ‘ÿvÿ]ÿEÿ-ÿÿüþãþËþ´þŸþŠþvþaþJþ2þþþóýåýÛý×ý×ýÜýâýêýòýüýþþ1þQþyþ¦þØþ ÿ@ÿtÿ§ÿÛÿBw­äL{¦Îñ-DU`b]SE4#þìÙ§†a:ìɪu[@#éÿËÿ®ÿ’ÿyÿbÿMÿ7ÿ ÿ ÿòþÛþÄþ¯þšþ†þpþXþ>þ%þþúýéýÞý×ýÖýÙýßýæýîý÷ýþþ,þKþqþžþÐþÿ7ÿkÿ ÿÔÿ<rªâN«Óø4K\fgaVF3 öâζšyT-ß¼ž‚iP6äÿÈÿ¬ÿ“ÿ|ÿhÿTÿAÿ,ÿÿÿíþØþÄþ°þœþ‡þoþUþ<þ#þþûýîýåýâýäýèýíýôýüýþþ,þJþoþ›þËþýþ0ÿdÿ—ÿËÿÿÿ3i¢ÛI{¨Ñö2IZde_RB.íØÃ¬pL%þÙ·™gO6çÿËÿ°ÿ˜ÿƒÿpÿ^ÿLÿ9ÿ%ÿÿûþæþÒþ¾þªþ”þ|þbþGþ.þþþòýèýäýäýçýìýñýùýþþ(þEþkþ–þÇþúþ.ÿbÿ—ÿÌÿ5l¦àP‚°Ùý8O_hh`S@*úãÍ·Ÿƒc?òͬv_I1æÿÌÿ³ÿœÿˆÿwÿfÿUÿCÿ/ÿÿÿðþÜþÈþ³þþ…þkþPþ5þþþöýêýåýåýèýìýñýøýþþ'þDþiþ–þÇþûþ/ÿeÿšÿÏÿ:r­è#YŒ¹á#=Rahg]M9 ìÓ¼¥ŒpO+Þ¹™|dN9# õÿÜÿÃÿªÿ•ÿƒÿtÿeÿVÿEÿ2ÿÿ ÿôþßþËþ·þ þ‡þlþPþ5þþþòýæýàýàýãýèýîýöýþþ(þFþmþ›þÎþÿ:ÿqÿ¨ÿßÿL†Âþ:q¤Ñù:Sgtzwl[D) ïÔº¢‡iG!ùѬŠmT>(ûÿãÿÊÿ°ÿ˜ÿƒÿqÿbÿSÿDÿ3ÿ!ÿ ÿøþãþÏþºþ¦þþwþ\þ@þ%þ þôýâýÖýÑýÑýÖýÜýãýíýùý þ$þEþnþžþÔþ ÿEÿÿ¹ÿòÿ)cžÜWÃñ;Yqƒ“‚nU7øÚ¾£†fBñÇ |^D,ÿÿæÿÍÿ²ÿ˜ÿ~ÿhÿVÿFÿ8ÿ)ÿÿÿóþßþËþ·þ¤þ‘þ}þfþMþ3þþþëýÚýÐýÍýÏýÖýÞýçýòýþþ0þSþ~þ±þèþ#ÿ^ÿ™ÿÔÿ F€»ù8t¬ß 1Rmƒ“Ÿ™‹uZ:÷׺~]7ã¸lM3ïÿ×ÿ¾ÿ£ÿˆÿoÿYÿGÿ8ÿ+ÿÿ ÿùþåþÑþ¼þ¨þ•þƒþoþYþBþ*þþúýæý×ýÏýÍýÑýÙýãýîýûý þ"þ?þdþ’þÇþÿ>ÿ|ÿºÿöÿ0j¤à\˜Ï*Mkƒ•¢©¨ŸŽvY7î̬lI"øÌ¡xT5ïÿÙÿÂÿ©ÿÿuÿ]ÿHÿ7ÿ)ÿÿ ÿýþëþ×þÃþ®þšþˆþuþbþMþ7þ þþòýÞýÐýÈýÇýÌýÔýßýìýûýþ&þEþlþþÔþÿQÿ‘ÿÑÿK‡Âÿ>|¸îGi„šª´¸µ«˜~_:íÈ¥„a;湌b=ëÿÕÿ¿ÿ¨ÿÿwÿ]ÿEÿ0ÿ ÿÿÿùþêþØþÅþ±þœþ‰þvþdþRþ?þ+þþþíýÜýÏýÈýÉýÐýÛýèýöýþþ6þWþ€þ²þëþ)ÿjÿ¬ÿíÿ,i¥á\™Ô 9`š­ºÂľ±`:翚vQ)þÑ¢tI#éÿÑÿ»ÿ¦ÿ‘ÿzÿbÿJÿ3ÿ ÿÿÿûþðþâþÒþÀþ­þšþ‡þvþeþTþBþ/þþþõýäýØýÒýÓýÚýåýóýþþ*þEþgþ‘þÃþüþ;ÿ}ÿ¿ÿ@}¹õ2o­çIp¦·ÃÉɳ€]5 ßµg@뼌^2 êÿÎÿ¶ÿ ÿŠÿuÿ^ÿGÿ/ÿÿÿùþïþåþÛþÐþÁþ±þ þŽþ|þlþ]þMþ=þ,þþ þøýéýÞýÚýÝýåýóýþþ(þ@þ\þþªþÝþÿUÿ—ÿÙÿY—Ò Gƒ¿ø+X}š°¿ÉÌÊÁ°˜yU+þÑ¥|T-Ö§xI÷ÿÖÿºÿ¡ÿŒÿwÿcÿNÿ8ÿ"ÿ ÿüþðþçþàþØþÎþÂþ´þ¤þ”þ„þuþgþXþIþ:þ)þþþúýðýìýïýøýþþ(þ=þTþqþ”þ¾þðþ)ÿfÿ¦ÿçÿ'e¡ÚK…¾õ&Qt¤±¹º¶«šb=æ¸d=í”e7 çÿÆÿ«ÿ“ÿÿlÿZÿFÿ2ÿÿ ÿýþòþëþæþàþØþÎþÂþ´þ¦þ—þŠþ|þnþ`þPþAþ0þ!þþþþþþþ,þ>þRþiþ„þ¦þÎþÿþ5ÿqÿ¯ÿïÿ-j¤ÛH€¸ìEg‚•¡¨¨£–ƒjJ$ùÌžrI"ûÒ§zKôÿÏÿ¯ÿ”ÿ~ÿkÿZÿJÿ9ÿ'ÿÿÿøþñþìþêþçþâþÜþÓþÈþ¼þ°þ¤þ™þþ€þrþdþUþGþ9þ0þ-þ0þ:þGþVþhþ{þ‘þªþÊþðþÿRÿ‹ÿÇÿ?z±æMƒ·é>^v‡‘•”Œ~iN-Ú¬}Q(Ù±†Y+þÿÔÿ®ÿÿuÿ`ÿOÿ@ÿ1ÿ#ÿÿÿ÷þíþèþæþçþçþåþâþÛþÓþÉþ¿þµþªþ þ•þˆþ{þnþaþUþMþJþOþYþfþwþˆþ›þ±þÉþçþ ÿ8ÿjÿ¡ÿÛÿP‰¾ñ"T‡¹é:Xn|„†wgP3è¼^1๑g;äÿ»ÿ˜ÿzÿcÿPÿBÿ6ÿ+ÿ ÿÿÿýþöþóþôþöþøþùþ÷þòþêþáþ×þÌþÂþ·þ«þžþ‘þƒþvþiþ`þ^þaþjþwþ†þ–þ©þ½þÔþñþÿ>ÿnÿ¤ÿÝÿO‡»íN°ß -J_lrqk_M5óÊžn?éÜvM$úÿÑÿªÿˆÿmÿYÿJÿ?ÿ6ÿ/ÿ'ÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿ ÿÿúþðþåþÙþÍþ¿þ±þ¢þ•þ‹þ†þˆþþ™þ¦þ´þÄþÕþêþÿ"ÿHÿuÿ§ÿÜÿG{¬Ú4b¼ã2=A?7*ÿཕi;ã»—sO*Ýÿ·ÿ”ÿvÿ^ÿMÿBÿ;ÿ6ÿ3ÿ0ÿ,ÿ(ÿ$ÿ%ÿ)ÿ0ÿ9ÿAÿGÿKÿKÿGÿAÿ9ÿ1ÿ'ÿÿÿÿöþçþ×þÉþ½þ¶þµþ¹þÀþÉþÔþàþîþþþÿ-ÿOÿwÿ¤ÿÕÿ8h•Àê?j”ºÚô î׺™sIòÊ¥‚a@ûÿØÿµÿ•ÿyÿeÿVÿNÿIÿGÿEÿDÿAÿ>ÿ<ÿ<ÿAÿHÿQÿYÿ`ÿdÿdÿaÿ[ÿSÿIÿ?ÿ4ÿ(ÿÿ ÿüþëþÛþÍþÅþÁþÃþÈþÐþØþâþîþýþÿ(ÿHÿnÿ™ÿÈÿøÿ(V‚«Óü&PyŸÀÚîúþýöëÚŪŠe=éÁ|\<úÿÙÿ¸ÿšÿÿnÿbÿ[ÿXÿXÿXÿXÿWÿTÿSÿTÿXÿ_ÿhÿqÿwÿ{ÿ|ÿyÿrÿjÿ`ÿVÿKÿ?ÿ1ÿ"ÿÿÿïþàþÕþÐþÏþÒþ×þÞþæþðþüþ ÿ#ÿ@ÿdÿÿ¹ÿèÿAk’¸Þ/V{›µÉÕÚÚÕ˼¨rP+ܶ•uX:ÿÿáÿÃÿ¨ÿ’ÿÿwÿrÿqÿsÿtÿuÿtÿrÿpÿpÿsÿyÿÿˆÿÿÿÿŒÿ„ÿ{ÿpÿeÿXÿKÿ<ÿ-ÿÿ ÿøþéþÝþ×þÕþ×þÛþáþèþñþýþ ÿ#ÿ?ÿaÿ‰ÿ´ÿàÿ 6]‚¦Êï;]|•¨´ººµ«‹tY:óΫŒoT9éÿÏÿ·ÿ¤ÿ—ÿÿŒÿŒÿÿ‘ÿ“ÿ“ÿÿŽÿÿÿ“ÿ˜ÿÿ¡ÿ£ÿ¢ÿÿ”ÿŠÿÿsÿfÿXÿIÿ9ÿ(ÿÿÿõþéþâþßþßþâþçþíþöþÿÿ$ÿ?ÿ`ÿ†ÿ®ÿÙÿ*Or’´Öù;WoŒ‘‘ŒƒudN5øÕ³“u[A)øÿàÿÉÿ´ÿ¤ÿ™ÿ“ÿ’ÿ”ÿ˜ÿœÿŸÿ ÿžÿœÿœÿÿ¡ÿ¦ÿ«ÿ¯ÿ±ÿ°ÿ¬ÿ¥ÿœÿ‘ÿ†ÿzÿnÿ`ÿRÿBÿ2ÿ"ÿÿÿÿþþþþÿÿ ÿÿÿ+ÿ>ÿWÿuÿ™ÿ¿ÿæÿ 2Tt’°Ïï+E[kuyysj]L7æÆ¦ˆmS<%øÿáÿËÿ·ÿ¨ÿžÿ™ÿ˜ÿšÿžÿ¢ÿ¤ÿ¥ÿ£ÿ ÿžÿžÿ¡ÿ¤ÿ¨ÿ«ÿ­ÿ¬ÿ¨ÿ¡ÿ˜ÿŽÿ„ÿyÿmÿ`ÿSÿEÿ6ÿ'ÿÿÿ ÿÿÿÿ ÿÿÿ"ÿ/ÿAÿYÿwÿ˜ÿ½ÿãÿ,Mkˆ¥Âàý2GWaffaYM>+üáæŠpYD/ñÿÝÿËÿ½ÿ³ÿ¯ÿ®ÿ±ÿ´ÿ¸ÿºÿ¹ÿ¶ÿ²ÿ®ÿ¬ÿ¬ÿ®ÿ°ÿ±ÿ±ÿ®ÿ©ÿ¢ÿ˜ÿŽÿƒÿxÿlÿ_ÿRÿEÿ7ÿ(ÿÿÿ ÿÿÿ ÿ ÿÿÿ"ÿ.ÿ@ÿWÿsÿ”ÿ·ÿÜÿ#Da|—³Ðì2AKPPLE:,ïÖ» †oYF2 ùÿæÿÕÿÇÿ¿ÿ»ÿºÿ½ÿÀÿÄÿÅÿÄÿÁÿ¼ÿ¸ÿµÿ´ÿ´ÿµÿ¶ÿµÿ³ÿ­ÿ¦ÿÿ“ÿ‰ÿ~ÿsÿhÿ\ÿOÿBÿ5ÿ)ÿ ÿÿÿÿÿÿ"ÿ)ÿ2ÿ>ÿOÿeÿÿ¡ÿÃÿçÿ ,Kf€™³Ìæþ%3;?>91&óÝŬ’ybM:&íÿÚÿÉÿ»ÿ²ÿ®ÿ­ÿ¯ÿ³ÿ¶ÿ¸ÿ¸ÿµÿ°ÿ¬ÿ©ÿ¨ÿ¨ÿ©ÿ©ÿ©ÿ§ÿ¢ÿœÿ”ÿŒÿ„ÿ{ÿrÿiÿ_ÿVÿKÿAÿ7ÿ0ÿ,ÿ+ÿ-ÿ0ÿ4ÿ:ÿAÿKÿWÿhÿ~ÿšÿ¹ÿÚÿýÿ@]x¨¿×î'28:71)þëÕ¾¤‹r[F2 ùÿåÿÑÿÀÿ²ÿ©ÿ¤ÿ£ÿ¥ÿ¨ÿ«ÿ­ÿ­ÿªÿ¦ÿ¢ÿ ÿŸÿŸÿ ÿ¡ÿ¡ÿ ÿœÿ–ÿÿˆÿÿzÿrÿkÿcÿ\ÿSÿJÿBÿ<ÿ9ÿ9ÿ:ÿ>ÿCÿIÿPÿYÿeÿvÿŒÿ¦ÿÄÿåÿ(If™°ÇÝô)3895.% øåиŸ…kT>)ìÿØÿÄÿ²ÿ¤ÿšÿ•ÿ“ÿ•ÿ˜ÿ›ÿÿžÿœÿ™ÿ–ÿ”ÿ•ÿ–ÿ˜ÿšÿ›ÿ›ÿ˜ÿ“ÿŽÿˆÿ‚ÿ|ÿwÿqÿlÿgÿ`ÿZÿSÿOÿMÿNÿPÿUÿZÿaÿiÿrÿÿÿ¥ÿ¿ÿÝÿþÿ@`|–®ÄÚð)5=?=7."îÙ¨ŒpU;# ÷ÿâÿÌÿ¶ÿ¡ÿÿ€ÿvÿqÿpÿqÿuÿyÿ|ÿ~ÿ}ÿ|ÿ{ÿ|ÿ~ÿ‚ÿ‡ÿŒÿÿ‘ÿÿŽÿ‹ÿˆÿ…ÿ‚ÿÿ}ÿzÿxÿtÿpÿlÿjÿjÿlÿpÿuÿ{ÿƒÿ‹ÿ•ÿ¢ÿ²ÿÇÿàÿýÿ;[x“«ÁÖêý"0:?@;2'õàɱ—z^A'øÿáÿËÿµÿ ÿŒÿzÿkÿaÿ\ÿ[ÿ]ÿaÿeÿiÿlÿmÿmÿmÿoÿsÿyÿÿ…ÿŠÿŽÿÿÿÿŒÿ‹ÿ‹ÿŠÿ‹ÿ‹ÿ‹ÿ‹ÿŠÿˆÿˆÿŠÿÿ“ÿšÿ¡ÿªÿ³ÿ½ÿÉÿÙÿíÿ;Xu¨¾Ðâó!+252*íÙë’wZ=!îÿ×ÿÁÿ¬ÿ—ÿƒÿoÿ^ÿQÿHÿCÿCÿEÿJÿOÿSÿVÿXÿYÿ[ÿ^ÿdÿjÿrÿzÿÿ†ÿ‰ÿ‹ÿŒÿŽÿÿ‘ÿ”ÿ—ÿ›ÿžÿ ÿ¡ÿ¢ÿ¤ÿ§ÿ¬ÿ³ÿ»ÿÃÿÌÿÕÿßÿëÿúÿ !:Up‹£¹ÌÝìû "*/0+"ôá˵ƒhK.øÿßÿÈÿ²ÿœÿˆÿsÿ`ÿNÿAÿ7ÿ3ÿ2ÿ5ÿ9ÿ?ÿDÿHÿKÿMÿPÿUÿ\ÿdÿmÿvÿÿ†ÿŒÿÿ“ÿ–ÿ™ÿžÿ£ÿ¨ÿ®ÿ³ÿ¸ÿ»ÿ¿ÿÃÿÈÿÎÿÕÿÝÿæÿîÿ÷ÿ ';Rjƒ›±ÄÕãïü"%$óà̶Ÿ‡nS7çÿÎÿ¸ÿ¢ÿÿyÿeÿRÿAÿ4ÿ+ÿ'ÿ&ÿ)ÿ-ÿ3ÿ8ÿ<ÿ@ÿCÿFÿLÿSÿ\ÿfÿqÿ{ÿƒÿ‰ÿŽÿ’ÿ–ÿ›ÿ ÿ¦ÿ­ÿµÿ¼ÿÃÿÈÿÍÿÓÿÙÿáÿéÿñÿúÿ +;Ncy¦ºÌÚçòüöäк¤u\B( óÿÚÿÃÿ­ÿ™ÿ…ÿrÿ`ÿNÿ>ÿ2ÿ)ÿ%ÿ%ÿ(ÿ,ÿ2ÿ7ÿ<ÿ?ÿCÿGÿMÿUÿ^ÿhÿsÿ}ÿ†ÿŒÿ‘ÿ•ÿ™ÿžÿ£ÿªÿ±ÿ¹ÿÁÿÉÿÏÿÖÿÜÿãÿëÿôÿýÿ!+7FXl—«¾ÎÛæïø ùéÕÀª”}eM3çÿÐÿ¹ÿ¥ÿ‘ÿÿmÿ]ÿMÿ?ÿ4ÿ-ÿ*ÿ+ÿ.ÿ4ÿ:ÿ@ÿEÿIÿMÿQÿWÿ_ÿhÿsÿ~ÿˆÿÿ–ÿ›ÿžÿ¢ÿ¦ÿ«ÿ±ÿ¹ÿÁÿÊÿÒÿÚÿáÿéÿñÿúÿ  *3=IXh{Ž¢´ÄÑÛäêñ÷üÿÿùïàι£Œt]F.ÿÿçÿÏÿºÿ¦ÿ”ÿƒÿtÿeÿWÿJÿ?ÿ7ÿ3ÿ2ÿ5ÿ:ÿAÿHÿOÿUÿYÿ^ÿbÿhÿoÿxÿ‚ÿ‹ÿ”ÿ›ÿ¡ÿ¤ÿ¦ÿ¨ÿªÿ®ÿ³ÿºÿÂÿÊÿÓÿÛÿãÿëÿóÿýÿ&0:ERar„—ª»ÊÖßåêïóö÷÷óëßλ¥u]F/êÿÔÿ¾ÿ«ÿ™ÿˆÿzÿlÿ`ÿTÿJÿBÿ<ÿ:ÿ;ÿ@ÿFÿNÿVÿ^ÿdÿhÿlÿpÿvÿ|ÿ„ÿŒÿ”ÿœÿ¡ÿ¥ÿ§ÿ§ÿ§ÿ¨ÿ«ÿ¯ÿµÿ¼ÿÅÿÍÿÖÿßÿçÿñÿûÿ)4@M[k}¤·È×ãìòöúüþþüöíßÌ·Ÿ†lS:" õÿÞÿÈÿ²ÿŸÿÿ}ÿnÿbÿVÿKÿBÿ;ÿ6ÿ4ÿ6ÿ;ÿAÿIÿRÿYÿ`ÿeÿiÿnÿsÿyÿÿŠÿ’ÿ™ÿžÿ¢ÿ£ÿ£ÿ£ÿ£ÿ¥ÿ©ÿ¯ÿ¶ÿ¿ÿÉÿÒÿÜÿæÿñÿýÿ#1?M[k|Ž¢¶ÉÚéõý    ÷çÓ¼¢‡lP6ìÿÔÿ½ÿ§ÿ’ÿ€ÿpÿbÿUÿJÿ@ÿ7ÿ/ÿ+ÿ*ÿ,ÿ0ÿ7ÿ?ÿGÿOÿVÿ[ÿ`ÿeÿlÿsÿ{ÿ„ÿÿ•ÿšÿžÿŸÿŸÿŸÿŸÿ¡ÿ¥ÿ«ÿ³ÿ¼ÿÆÿÐÿÛÿæÿòÿþÿ )8GVeu‡š®ÁÔæôÿ  ýíØÀ¥‰mP5éÿÑÿ¹ÿ¢ÿŽÿ{ÿkÿ\ÿPÿEÿ;ÿ3ÿ,ÿ(ÿ&ÿ(ÿ-ÿ3ÿ;ÿCÿKÿRÿXÿ]ÿbÿiÿpÿxÿÿŠÿ’ÿ˜ÿ›ÿÿÿÿžÿ¡ÿ¥ÿ¬ÿµÿ¿ÿËÿÖÿâÿïÿýÿ ):K[k{Œž°ÂÕæö  óàɯ’tV8æÿÍÿ´ÿœÿ…ÿqÿ_ÿOÿBÿ7ÿ.ÿ&ÿ ÿÿÿÿÿ$ÿ,ÿ5ÿ?ÿHÿQÿXÿ_ÿfÿnÿwÿÿ‹ÿ”ÿœÿ£ÿ§ÿ¨ÿ©ÿ©ÿªÿ­ÿ±ÿ¸ÿÁÿÌÿ×ÿãÿðÿýÿ *;M_p’£´Æ×èø ÷æÑ¸œ}^>åÿÉÿ¯ÿ–ÿ~ÿhÿUÿDÿ6ÿ,ÿ#ÿÿÿÿÿÿÿÿ'ÿ1ÿ<ÿHÿSÿ]ÿfÿoÿxÿÿ‹ÿ•ÿ ÿªÿ²ÿ¹ÿ¼ÿ¾ÿ¿ÿ¾ÿ¾ÿÀÿÃÿÉÿÑÿÚÿäÿïÿûÿ#3CUfwˆ™©¹ÊÚé÷  þôçÖÁ§‹kK+ îÿÑÿ¶ÿœÿƒÿlÿWÿDÿ5ÿ(ÿÿÿÿÿÿÿÿÿÿ(ÿ3ÿ?ÿKÿVÿaÿkÿtÿ}ÿ‡ÿ‘ÿœÿ§ÿ²ÿ»ÿÁÿÆÿÈÿÉÿÉÿÉÿÊÿÎÿÓÿÛÿåÿïÿúÿ-<M_q‚“¤´ÄÔãñý úîàη_>ýÿßÿÂÿ¦ÿŒÿsÿ\ÿFÿ4ÿ$ÿÿÿ ÿÿÿÿÿ ÿÿÿ#ÿ.ÿ:ÿGÿSÿ^ÿiÿsÿ}ÿˆÿ“ÿžÿ©ÿ´ÿ½ÿÅÿÊÿÍÿÎÿÏÿÏÿÑÿÕÿÛÿãÿíÿ÷ÿ &5DUfxŠ›«»ËÙçôÿ  þõéÚȱ—yY8øÿÙÿ¼ÿ ÿ†ÿmÿVÿAÿ/ÿ ÿÿ ÿÿÿÿÿ ÿÿÿ!ÿ+ÿ7ÿDÿQÿ]ÿjÿuÿ€ÿ‹ÿ–ÿ¡ÿ­ÿ¹ÿÄÿÍÿÔÿÙÿÜÿÝÿÝÿÝÿßÿâÿçÿíÿöÿÿÿ'3AP`p€Ÿ­»ÇÔßéòøûüú÷òíæÞÓÅ´Ÿ‡kN.ñÿÔÿ¸ÿÿ„ÿlÿUÿAÿ0ÿ"ÿÿÿÿ ÿÿÿÿÿ#ÿ-ÿ7ÿCÿQÿ^ÿlÿxÿ„ÿÿ›ÿ¦ÿ²ÿ¾ÿÉÿÔÿÝÿäÿéÿëÿìÿìÿìÿìÿîÿòÿ÷ÿþÿ %0=JYhw…“¡­¹ÄÏÙáæêëêèäßÙÒÈ»«—€fJ, ñÿÔÿ¸ÿžÿ…ÿmÿWÿDÿ3ÿ&ÿÿÿÿÿÿÿÿ%ÿ-ÿ6ÿAÿNÿ[ÿiÿvÿƒÿÿ›ÿ§ÿ³ÿ¿ÿËÿ×ÿáÿêÿñÿöÿùÿùÿùÿøÿøÿøÿûÿþÿ  )4@N[iw„‘¨³½ÆÎÔ×ÙÙ×ÔÑÌÆ¾²¤’~fK/öÿÚÿÀÿ¦ÿÿvÿaÿNÿ>ÿ1ÿ(ÿ#ÿ!ÿ!ÿ$ÿ(ÿ.ÿ5ÿ=ÿFÿPÿ\ÿiÿvÿƒÿÿœÿ§ÿ²ÿ¾ÿÊÿÕÿàÿëÿóÿùÿþÿÿÿýÿüÿûÿüÿýÿ $/;GT`mxƒŽ˜¢«³¹¾ÀÁÀ¿½º¶°§›ŒzdL3ÿÿåÿÌÿ´ÿÿ‡ÿrÿ`ÿQÿFÿ>ÿ9ÿ7ÿ8ÿ:ÿ>ÿCÿIÿQÿYÿbÿlÿwÿƒÿŽÿ™ÿ£ÿ­ÿ·ÿÁÿÌÿ×ÿáÿëÿóÿøÿüÿÿÿÿÿýÿûÿùÿøÿùÿúÿüÿþÿ (4@MZfs~‰”ž§¯µ¹»»º¹·´¯© ”…t_H/ýÿäÿËÿ´ÿÿ‡ÿsÿbÿSÿHÿ@ÿ<ÿ;ÿ;ÿ>ÿBÿHÿOÿVÿ_ÿhÿsÿ~ÿŠÿ•ÿŸÿ©ÿ²ÿ»ÿÅÿÏÿÙÿãÿìÿóÿøÿûÿýÿýÿûÿøÿöÿõÿõÿöÿøÿùÿüÿþÿ".:GTanz…›¥®µº¼¾¾½¼º¶°¨œŽ}iR9 îÿÖÿ¿ÿ¨ÿ‘ÿ}ÿkÿ\ÿPÿHÿCÿ@ÿ@ÿBÿEÿJÿPÿWÿ^ÿgÿpÿ{ÿ†ÿÿ™ÿ¢ÿ«ÿ´ÿ¾ÿÈÿÒÿÜÿäÿëÿðÿóÿõÿõÿóÿñÿïÿîÿîÿïÿñÿóÿõÿøÿüÿ(4AN[ht€Œ—¡ª²·º¼½½¼»¸²ªŸ‘€mV>% õÿÝÿÆÿ°ÿšÿ‡ÿuÿfÿZÿRÿMÿJÿIÿJÿMÿQÿVÿ\ÿbÿiÿqÿ{ÿ„ÿÿ–ÿžÿ§ÿ¯ÿ¸ÿÂÿÌÿÕÿÞÿäÿéÿìÿíÿíÿìÿêÿéÿèÿéÿëÿîÿñÿõÿùÿÿÿ #/;HVcp|‡’œ¦®µº½¿ÀÀ¿½º´«Ÿ‘kU<# óÿÛÿÅÿ¯ÿšÿ‡ÿvÿhÿ]ÿUÿPÿNÿMÿNÿQÿUÿZÿ`ÿfÿmÿuÿ}ÿ‡ÿÿ˜ÿ¡ÿ©ÿ²ÿ»ÿÄÿÎÿ×ÿÞÿäÿéÿëÿíÿíÿëÿéÿçÿçÿçÿéÿëÿîÿòÿöÿûÿ +7CP]ju€Š”ž¦­³·¹º»º¹¶°¨œ~kV>& ÷ÿàÿÊÿ´ÿ ÿŽÿ~ÿpÿfÿ^ÿZÿWÿVÿWÿYÿ]ÿaÿfÿkÿqÿyÿÿŠÿ’ÿ›ÿ£ÿ¬ÿµÿ¾ÿÇÿÐÿÙÿáÿæÿêÿíÿîÿîÿìÿêÿèÿæÿæÿçÿéÿìÿðÿôÿùÿ(4@LXdoyƒ–Ÿ¦¬±´¶¶¶µ²­¥›~kV?'øÿáÿÊÿµÿ¢ÿÿÿrÿgÿ`ÿ[ÿXÿWÿXÿZÿ]ÿaÿfÿkÿqÿxÿ€ÿ‰ÿ’ÿœÿ¥ÿ®ÿ·ÿÁÿËÿÕÿÞÿæÿíÿòÿõÿ÷ÿ÷ÿöÿóÿñÿïÿîÿïÿðÿòÿöÿúÿÿÿ *4@KVakt~‡˜ ¦«®°±²±®ª¢˜Œ|jU>% öÿÞÿÈÿ³ÿŸÿŽÿ~ÿpÿfÿ_ÿZÿWÿVÿWÿYÿ]ÿaÿeÿjÿpÿxÿ€ÿ‰ÿ“ÿœÿ¦ÿ°ÿ¹ÿÃÿÍÿ×ÿáÿéÿðÿõÿùÿûÿûÿùÿöÿòÿïÿíÿìÿìÿíÿïÿòÿõÿúÿ$/9DNXajt}‡—ž£¨«®¯¯­¨¡—ŠzgQ:# öÿàÿÌÿ¸ÿ¦ÿ–ÿˆÿ}ÿuÿoÿlÿiÿhÿiÿkÿmÿpÿsÿwÿ}ÿ„ÿ‹ÿ“ÿœÿ¤ÿ­ÿµÿ¾ÿÇÿÐÿÙÿáÿçÿìÿïÿðÿðÿíÿêÿæÿâÿàÿßÿßÿßÿáÿãÿæÿëÿñÿùÿ )4>HR\fq|†™¡¨®³·¹¹·±©}iS<%úÿåÿÑÿ¿ÿ®ÿŸÿ’ÿ‰ÿÿ|ÿxÿuÿtÿtÿtÿuÿwÿyÿ}ÿ‚ÿ‰ÿÿ—ÿŸÿ§ÿ¯ÿ·ÿÀÿÈÿÑÿØÿÞÿâÿåÿæÿåÿãÿßÿÚÿ×ÿÔÿÒÿÑÿÒÿÓÿÕÿÙÿÝÿãÿëÿôÿþÿ(4?JU`my…‘œ§°¸¿ÅÉÊÉŽ²¤’}fN6ðÿÛÿÆÿ³ÿ¢ÿ“ÿ‡ÿ~ÿvÿpÿkÿhÿfÿeÿeÿeÿgÿjÿoÿuÿ|ÿ„ÿÿ–ÿ ÿªÿ´ÿ¿ÿÉÿÒÿÙÿßÿãÿæÿçÿåÿâÿßÿÛÿØÿ×ÿÖÿÖÿØÿÚÿÝÿâÿçÿïÿ÷ÿ +6ALXdp}‹˜¤°»ÅÍÕÚÜÜØÑÆ¸¦x_E+úÿâÿËÿ¶ÿ¢ÿ‘ÿ‚ÿvÿkÿcÿ\ÿVÿSÿPÿNÿMÿMÿOÿSÿYÿ`ÿiÿsÿ}ÿ‰ÿ”ÿ¡ÿ­ÿ¹ÿÄÿÎÿÕÿÜÿàÿâÿâÿáÿÞÿÜÿÚÿÙÿÙÿÚÿÜÿßÿãÿèÿîÿöÿÿÿ)5AMXdp}‹™§´ÁÍ×àèîðïëäØÉµž„hL0ùÿßÿÆÿ®ÿ˜ÿ„ÿrÿdÿWÿLÿCÿ<ÿ6ÿ2ÿ/ÿ-ÿ-ÿ.ÿ2ÿ8ÿ@ÿJÿVÿcÿpÿ~ÿÿœÿ«ÿ¸ÿÅÿÏÿØÿßÿäÿçÿçÿæÿåÿäÿäÿåÿèÿëÿïÿôÿúÿ (3?KWcnz†“ ®»ÉÖáìôûúñäÒ¼¢†gG(êÿÍÿ±ÿ–ÿ}ÿgÿSÿBÿ4ÿ(ÿÿÿÿ ÿ ÿÿÿ ÿÿÿ"ÿ/ÿ=ÿLÿ]ÿnÿ€ÿ’ÿ¤ÿ´ÿÄÿÑÿÝÿæÿíÿòÿôÿôÿôÿôÿõÿ÷ÿùÿýÿ &1<GS_kw‚Žš¦³ÀÍÛçóü  üîÛè‰hF$âÿÂÿ¤ÿ‡ÿlÿTÿ?ÿ,ÿÿÿÿüþöþòþðþïþðþôþúþÿÿÿ-ÿ?ÿQÿdÿxÿŒÿŸÿ±ÿÂÿÐÿÝÿçÿïÿôÿöÿ÷ÿ÷ÿ÷ÿ÷ÿùÿûÿÿÿ)4@LYfs€™¦³ÀÏÝëøøäË®kG"ÿÿÜÿºÿšÿ{ÿ_ÿEÿ.ÿÿ ÿýþòþêþåþâþáþáþäþéþñþüþ ÿÿ,ÿ?ÿSÿhÿ}ÿ’ÿ¦ÿ¸ÿÉÿØÿåÿðÿùÿþÿ &0;GTan|‰–¢¯½ÊÙçõ "$"ôÞä\6ëÿÇÿ¤ÿƒÿcÿFÿ,ÿÿÿóþæþÜþÖþÒþÑþÒþÔþÙþàþêþ÷þÿÿ-ÿBÿXÿnÿ…ÿ›ÿ°ÿÄÿÕÿåÿóÿþÿ  &-6@KWdq€Ž›¨´ÁÍÚèõ "%$ úæÎ°jCôÿÍÿ¨ÿ„ÿcÿCÿ&ÿ ÿöþãþÔþÉþÁþ¼þ»þ¼þ¿þÄþËþÕþâþñþÿÿ/ÿFÿ^ÿwÿŽÿ¦ÿ¼ÿÑÿãÿôÿ   "&*/5<EOYer€Žœª·ÄÐÝêö!'**' óÜÁ¢~W.Üÿ³ÿÿhÿFÿ'ÿ ÿðþÚþÈþºþ°þ©þ¦þ§þªþ°þ¸þÂþÏþÞþðþÿÿ5ÿOÿjÿ„ÿÿ¶ÿÎÿãÿ÷ÿ!*0221/../148<BIQ[eq~Œš¨¶ÃÏÜéö %''"þêÒ¶•qIöÿÌÿ£ÿ|ÿWÿ5ÿÿøþßþÉþ¶þ¨þŸþ™þ—þšþŸþ§þ±þ¾þÍþÞþóþ ÿ#ÿ=ÿYÿuÿÿ«ÿÅÿÜÿòÿ$09>@@>;9778:=@EJRZdp}‹š¨¶ÄÒàîû',.,'ÿêÑ´’lCîÿÃÿ™ÿqÿLÿ)ÿÿëþÑþ»þ¨þšþ‘þ‹þŠþŽþ”þžþ©þ¸þÉþÜþóþ ÿ'ÿCÿaÿ~ÿ›ÿ·ÿÑÿêÿ$3?HMONKHEBAAACEHLRYblx†”£±ÀÎÝëù',.,'ýèαi?éÿ¾ÿ”ÿkÿFÿ"ÿÿäþÊþ³þ¡þ“þ‰þ„þ„þ‡þþ™þ¦þ¶þÉþÞþöþÿ,ÿJÿiÿ‡ÿ¤ÿÀÿÛÿóÿ-<GOTUTQMHEBAAABDGLRZdo}Œ›ª¹ÉØè÷)/1/*!ìÓ¶”nDíÿÁÿ–ÿmÿGÿ$ÿÿäþÉþ²þŸþþ†þ€þþƒþ‹þ–þ£þ´þÇþÜþõþÿ-ÿLÿkÿŠÿ¨ÿÄÿßÿøÿ !3AMVZ\ZVQMHECBBBDFJOW`lyˆ—§·Ç×ç÷ *021+"íÔ¶”nEíÿÁÿ•ÿlÿEÿ!ÿÿáþÅþ®þšþ‹þ€þzþyþ}þ„þþþ®þÁþ×þðþ ÿ*ÿIÿiÿ‰ÿ§ÿÄÿàÿùÿ#5DQZ_`_[VQLIGFEFGILQXaly‡–¥µÅÔäó$*,+%ýèϲ‘kBëÿ¾ÿ“ÿjÿCÿ ÿÿþáþÆþ®þ›þŒþþ{þzþ}þ…þþþ®þÂþØþñþ ÿ)ÿHÿgÿ‡ÿ¥ÿÂÿÝÿ÷ÿ !3BOX]_]ZUPLHGFFGILPU\fq~Œ›«ºÊÙè÷&,-+%üçΰi@éÿ¼ÿ‘ÿhÿAÿÿýþßþÄþ¬þ™þ‰þþyþwþ{þ‚þŒþšþ«þ¾þÔþíþÿ%ÿCÿcÿ‚ÿ ÿ½ÿØÿòÿ.>JTY\[XSOKHGGHJMPU[clx…“£²ÂÒáðÿ $,120)ÿéвkBëÿ¾ÿ“ÿjÿCÿÿþþàþÅþ®þšþŠþþyþwþzþ€þŠþ˜þ¨þ»þÑþéþÿ ÿ>ÿ]ÿ|ÿšÿ·ÿÒÿëÿ(7DNTWWURNKJIJLORV[bjs~‹™¨·ÇÖåó%,01.'üæÌ¯g>èÿ»ÿÿgÿAÿÿüþßþÄþ­þ™þŠþþxþvþxþ~þˆþ•þ¥þ¸þÎþæþÿÿ<ÿ[ÿzÿ™ÿ¶ÿÑÿëÿ)9GQX\]\YVTSSUX\`ekqyƒš§µÃÑßíú&-//*!ñÚÀ¡~X.Öÿªÿ~ÿUÿ/ÿ ÿìþÏþµþŸþŒþ}þsþlþkþnþtþþŒþþ±þÇþàþüþÿ9ÿZÿzÿšÿ¸ÿÔÿîÿ/@OZbfhgeb``acgkotzˆ‘œ§³ÀÍÚçô  ',.,&þéѶ—tN$ùÿÌÿŸÿtÿLÿ&ÿÿåþÉþ°þšþ‰þ{þqþkþjþmþtþþþžþ±þÈþáþýþÿ;ÿ[ÿ{ÿ›ÿ¹ÿÕÿðÿ1BQ\dikjhfddehlpu{ˆ˜¢­¸ÄÑÝèôÿ "&'$óÞÆª‹iBïÿÂÿ–ÿlÿEÿ!ÿÿâþÇþ°þœþ‹þ~þvþqþqþuþ|þ‡þ–þ§þ»þÒþëþÿ%ÿEÿeÿ…ÿ¤ÿÂÿÞÿøÿ$7HVahlmljgfefimrw|‚‰™¢¬·ÂÎÙäïù óá˲—wU/Üÿ°ÿ†ÿ]ÿ7ÿÿõþÙþÁþ«þ™þ‹þ€þzþwþyþþˆþ•þ¥þ¹þÎþçþÿÿ=ÿ]ÿ~ÿžÿ½ÿÚÿõÿ$9K[hqx{{xuqnllnquy}‚ˆŽ•¥¯¹ÃÍ×áêóú÷ëÛȲš~_<ðÿÆÿœÿrÿKÿ&ÿÿéþÏþ¹þ¦þ—þŠþ‚þ}þ}þþˆþ”þ£þµþÉþáþúþÿ3ÿRÿsÿ”ÿ´ÿÒÿïÿ !7K\jv„†…‚~yusrtvy}…‰Ž”›£¬µ¿ÈÑÚáéïõøùöðæÙɵŸ†jK)ßÿ¶ÿŒÿdÿ>ÿÿýþâþËþ·þ¦þ™þŽþ‡þ„þ…þŠþ“þ þ°þÃþÙþñþ ÿ&ÿDÿcÿƒÿ£ÿÃÿáÿýÿ-BUdr|„ˆ‰‡ƒ}wrpopruy|€…Š–ž§±ºÄÍÕÝäëðóôñëáÓï˜cD"þÿ×ÿ®ÿ…ÿ]ÿ8ÿÿøþßþÉþ¶þ§þšþ‘þ‹þ‰þ‹þ‘þ›þ©þºþÎþåþýþÿ4ÿQÿqÿÿ°ÿÏÿíÿ 7J\kw€‡ŠŠ‡zsnjiiknrvz~ƒ‰˜¡«µ¿ÉÒÚáèíðñîèßÒÁ®˜~bD"ÿÿØÿ°ÿˆÿ`ÿ<ÿÿþþåþÐþ¾þ¯þ¤þ›þ–þ”þ–þœþ¦þ´þÅþÙþïþÿ!ÿ<ÿYÿwÿ•ÿ´ÿÑÿíÿ2ETalty{yuoha[XWY\`ejou|ƒŒ– «·ÂÍÖßçíó÷øõïæÙɵž…iJ(Ýÿµÿÿeÿ@ÿ ÿÿêþÕþÄþµþªþ¡þœþšþþ£þ­þ»þÌþàþöþÿ'ÿBÿ]ÿzÿ˜ÿµÿÒÿíÿ.?MXagklie^VOIFEGKPV\cjqz„›¨µÁÍØáêñ÷üýüöîáѾ§ŽqS1 çÿ¿ÿ—ÿpÿLÿ+ÿÿ÷þãþÑþÃþ¸þ°þªþ¨þªþ¯þ¹þÇþ×þêþÿÿ.ÿGÿaÿ|ÿ—ÿ³ÿÎÿçÿþÿ#2>HOTWWUPIB<756:@GOW`ir|ˆ•¢°¾ÌØãíöý øëÚÅ®“vV4éÿÀÿ—ÿpÿLÿ+ÿÿ÷þãþÒþÄþ¹þ±þ«þ©þ«þ°þºþÇþ×þêþÿþÿ+ÿCÿ\ÿvÿ‘ÿ¬ÿÆÿÞÿôÿ&1:AEHHE@:4.*),29BLV`kv‚ž­½ÌÛèôþúèÒ¹]:ìÿÃÿ™ÿqÿKÿ*ÿÿöþâþÑþÂþ·þ¯þ©þ§þ¨þ®þ·þÄþÕþèþüþÿ(ÿ?ÿXÿqÿ‹ÿ¥ÿ¿ÿÖÿìÿÿÿ&.48:972,&!")2=HT`ly†•¥¶ÇØè÷ &+,*$ ùâÈ«‹hCòÿÆÿ›ÿqÿKÿ)ÿ ÿòþÝþËþ¼þ°þ§þ¡þžþŸþ¤þ­þºþËþÝþòþÿÿ5ÿMÿgÿÿœÿµÿÍÿãÿ÷ÿ'-1331,'! (2>JWcp}‹š«¼Îßðÿ  )/464.$êϰlEòÿÆÿšÿoÿHÿ%ÿÿíþ×þÅþ¶þªþ¡þšþ—þ—þœþ¦þ³þÃþÖþëþÿÿ/ÿHÿaÿ|ÿ—ÿ±ÿÊÿáÿõÿ&-1342.)$  %-8DP]ivƒŸ¯ÀÑãò  (.231+ üäȪˆd=ëÿ¿ÿ“ÿhÿAÿÿÿéþÔþÃþµþªþ¢þœþ™þ›þ¡þ«þ¹þÊþÞþóþ ÿ ÿ8ÿPÿjÿ…ÿŸÿºÿÒÿéÿýÿ %-368862,&! %-7BN[gr~‹š©ºËÜëú!',-+% ùáŧ†b;éÿ¾ÿ’ÿiÿBÿ ÿÿëþ×þÆþ¹þ®þ¦þ þþŸþ¤þ®þ¼þÍþáþöþ ÿ"ÿ:ÿRÿkÿ†ÿ ÿºÿÓÿéÿýÿ %-378851+% #*4?KWcnz†”£³ÄÕåóÿ  %&%óÜÁ¢‚^9èÿ¾ÿ“ÿjÿEÿ$ÿÿñþÞþÏþÂþ¸þ±þ¬þªþ¬þ±þ¼þÊþÛþïþÿÿ2ÿIÿaÿzÿ”ÿ¯ÿÈÿáÿ÷ÿ '18=@A?<6/("!'0:EP[ep{ˆ–¦¶Ç×åòü ýëÔºœ|Y4 äÿºÿÿgÿBÿ"ÿÿðþÞþÏþÃþºþ³þ®þ­þ¯þµþÀþÏþáþöþ ÿ$ÿ<ÿTÿmÿ†ÿ¡ÿ»ÿÕÿîÿ)6@HMOPNIC<4,(&(-5>GQZcluެ¼ÌÚçñú  òàɯ‘qN)Úÿ°ÿ‡ÿ_ÿ:ÿÿÿþéþ×þÈþ½þ´þ­þ©þ¨þªþ±þ½þÌþßþõþ ÿ%ÿ>ÿWÿqÿ‹ÿ¦ÿÂÿÜÿöÿ !2@KRXZ[YUOG>61./39AJRZbir|ˆ–¥´ÃÑÜæïöüûóåÓ½£†fDúÿÒÿ©ÿ€ÿYÿ5ÿÿüþçþÖþÉþ¿þ·þ±þ®þ®þ²þºþÆþÖþêþÿÿ3ÿLÿeÿÿšÿµÿÐÿêÿ/@NY`eggd`YPG?8558=DLSZahpy„‘Ÿ­»ÇÒÚáçìîïíçÞн§ŒoP. åÿ¾ÿ–ÿnÿHÿ&ÿÿïþÜþÌþÁþ¸þ²þ¯þ­þ¯þ´þ¾þÌþÞþôþ ÿ%ÿ?ÿYÿsÿŽÿ¨ÿÄÿßÿúÿ*?Q^iptvurmf]SIB>=?DJQW^djqy„œª¶ÁÊÑ×ÛÞààÜÖ̾«”y\<øÿÓÿ­ÿ†ÿ_ÿ:ÿÿýþæþÓþÆþ¼þ¶þ²þ°þ±þ´þ¼þÇþ×þëþÿÿ6ÿQÿlÿ‡ÿ¡ÿ½ÿØÿôÿ'?Tfs}„ˆ‰‡ƒ}tj^SJEBCFJPUZ_djr|‡“Ÿ«´¼ÂÆÉËÌËÈÁ·¨•~dG(æÿÂÿœÿwÿQÿ-ÿ ÿòþÝþÌþÀþ¸þ³þ±þ±þ³þ¹þÂþÐþâþøþÿ,ÿHÿdÿ€ÿ›ÿ·ÿÒÿîÿ $>Vk|‰’˜››˜”Œƒwj^SLHFHKOSVZ]biq{†‘œ¥¬°´¶··¶²«¡“€jP4÷ÿÖÿ³ÿÿkÿGÿ%ÿÿìþØþÉþ¾þ¸þµþ´þ¶þºþÂþÌþÛþïþÿ!ÿ=ÿ[ÿxÿ•ÿ±ÿÍÿéÿ!<Vm‚’Ÿ§¬®®«¥“†xj^UOLLMORSUWZ^emv€‰‘–šœš–„vcM4ýÿÞÿ¿ÿžÿ}ÿ[ÿ9ÿÿüþåþÓþÆþ¾þºþ¹þ»þ¿þÅþÎþÛþìþÿÿ6ÿSÿrÿ‘ÿ®ÿËÿçÿ;Vo†šªµ½ÁÂÁ½¶­¢”…vi^WSQQRSSRRSUZ`hpw}€‚‚‚{vncTA+ùÿÝÿÀÿ¢ÿ„ÿdÿEÿ%ÿÿïþÚþËþÁþ½þ¼þ¾þÃþÊþÓþÞþìþÿþÿ0ÿMÿmÿÿ¬ÿÊÿçÿ;Vq‰ ²ÁËÐÓÒÏʸ«›‹zk^UPMKKJHFDCDGLSZ`ehihgeb_YRG8&úÿáÿÇÿ¬ÿ‘ÿuÿYÿ<ÿ ÿÿîþÜþÐþÉþÈþÊþÏþÖþßþéþõþÿÿ0ÿKÿiÿ‰ÿªÿÊÿèÿ <Wr‹£¸Ê×ßääâÝÖÍÁ³¢~m_TMHEC@=941/038>DHIIHFDA=81'õÿßÿÈÿ°ÿ˜ÿÿgÿMÿ4ÿÿÿðþâþÙþÕþÖþÛþãþíþ÷þÿÿ"ÿ6ÿNÿjÿ‰ÿ©ÿÊÿêÿ$?Zt¦¼ÐàëòôóîèßÔÇ·¥‘}k[OF@;73.(! $'('%# üÿìÿÚÿÆÿ²ÿœÿ‡ÿsÿ^ÿHÿ3ÿÿ ÿúþïþéþéþíþõþÿþ ÿÿ%ÿ4ÿFÿZÿrÿŽÿ­ÿÍÿîÿ )D^w§¾ÒäñúÿÿûôìáÔÆµ¡ŒwcRD:3-(" ÿÿÿÿ ÿÿýÿùÿôÿíÿãÿÕÿÅÿ´ÿ¢ÿÿ}ÿlÿZÿIÿ7ÿ&ÿÿ ÿÿÿþÿ ÿÿ ÿ.ÿ=ÿLÿ\ÿnÿƒÿ›ÿ·ÿÕÿõÿ3Oi™¯ÄØêù   ùîàÑÀ­—€iS@1%ùÿðÿèÿâÿßÿÞÿàÿãÿçÿêÿëÿêÿéÿçÿåÿäÿâÿàÿÝÿ×ÿÏÿÃÿ¶ÿ¦ÿ–ÿ†ÿvÿgÿYÿJÿ;ÿ,ÿÿÿÿÿÿÿ*ÿ8ÿHÿXÿhÿyÿ‹ÿ ÿ¹ÿÔÿòÿ0Njƒ›±ÅÙìü  ÿòãÒ¿ª”{cL7&øÿðÿæÿÜÿÔÿÍÿÈÿÇÿÈÿËÿÎÿÑÿÒÿÒÿÐÿÏÿÎÿÍÿÌÿËÿÉÿÅÿ¾ÿ´ÿ¨ÿšÿŒÿ~ÿpÿcÿWÿJÿ>ÿ1ÿ&ÿÿÿÿ#ÿ.ÿ<ÿLÿ^ÿoÿÿ’ÿ¦ÿ»ÿÔÿïÿ +Jh‚š±ÅØëû !ñà꣋qX?)ýÿôÿìÿäÿÛÿÑÿÇÿ½ÿ¶ÿ±ÿ¯ÿ°ÿ³ÿ·ÿ¹ÿ»ÿ»ÿºÿ¹ÿ¹ÿ¹ÿ¹ÿ¹ÿ¸ÿ¶ÿ°ÿ¨ÿžÿ‘ÿ…ÿyÿmÿbÿXÿNÿDÿ:ÿ2ÿ,ÿ+ÿ.ÿ7ÿCÿTÿfÿyÿŒÿžÿ±ÿÅÿÛÿôÿ,Ji…Ÿ¶ÊÝîþ #)*&ïÜDZš€eJ0öÿêÿßÿÖÿÍÿÄÿ¹ÿ®ÿ¤ÿÿ—ÿ•ÿ–ÿ™ÿœÿŸÿ¡ÿ¢ÿ¡ÿ¡ÿ¡ÿ¢ÿ£ÿ¤ÿ¥ÿ£ÿ ÿ™ÿ‘ÿ‡ÿ|ÿrÿiÿ`ÿXÿQÿIÿBÿ<ÿ9ÿ:ÿ@ÿJÿXÿjÿ~ÿ“ÿ§ÿ»ÿÎÿãÿùÿ+Ig„ ¸Îáò%-10*ÿìØÂ«’w[?$ ùÿèÿÚÿÏÿÅÿ¼ÿ²ÿ§ÿœÿ‘ÿ‰ÿƒÿÿ‚ÿ…ÿˆÿŒÿŽÿÿÿÿÿ‘ÿ“ÿ–ÿ˜ÿ˜ÿ–ÿ‘ÿŠÿ‚ÿyÿqÿiÿbÿ]ÿWÿQÿLÿHÿGÿJÿQÿ\ÿlÿÿ”ÿªÿ¿ÿÔÿèÿüÿ*Da›¶Îâô(1797/#ìÖ¿§qT6ìÿÚÿËÿ¿ÿµÿ«ÿ ÿ”ÿˆÿ}ÿtÿnÿkÿlÿoÿsÿvÿyÿzÿ{ÿ|ÿ}ÿÿ‚ÿ†ÿ‰ÿ‹ÿ‹ÿˆÿ‚ÿ|ÿuÿoÿiÿeÿaÿ]ÿYÿVÿSÿSÿWÿ_ÿlÿ|ÿÿ¦ÿ½ÿÓÿçÿüÿ&>Xu’®Èßò(2:?@<4'ìÖ¾¤‰mN0ùÿáÿÎÿ¾ÿ±ÿ¦ÿšÿÿƒÿvÿkÿbÿ\ÿZÿ[ÿ_ÿcÿhÿkÿnÿpÿrÿtÿwÿ|ÿÿ†ÿ‰ÿŠÿ‰ÿ…ÿ€ÿzÿuÿqÿnÿkÿhÿeÿbÿ`ÿ`ÿcÿkÿwÿˆÿœÿ±ÿÇÿÜÿñÿ-E^z–²Ëáô)2:?@=4'î×À§ŒpR3ûÿãÿÏÿ¾ÿ°ÿ¤ÿ˜ÿŒÿÿrÿfÿ\ÿUÿRÿSÿVÿZÿ^ÿbÿdÿfÿhÿkÿnÿsÿxÿ~ÿ‚ÿƒÿ‚ÿÿ{ÿvÿqÿnÿkÿiÿgÿeÿcÿaÿbÿfÿnÿzÿ‹ÿŸÿµÿËÿàÿõÿ2Ic~š¶Ðæù #-7?DEB:- ôÞÆ®“wX9çÿÑÿ¿ÿ°ÿ£ÿ–ÿˆÿzÿlÿ_ÿUÿMÿJÿIÿLÿPÿTÿXÿZÿ\ÿ^ÿ`ÿdÿhÿnÿtÿxÿzÿyÿvÿrÿnÿiÿfÿdÿbÿaÿ_ÿ]ÿ\ÿ]ÿaÿiÿuÿ…ÿ™ÿ¯ÿÅÿÛÿðÿ.E_{˜µÏçû (4?HNQOH=-ðÙÀ¦‰kK-öÿßÿËÿºÿ«ÿœÿÿ~ÿnÿ`ÿTÿKÿFÿDÿFÿIÿLÿOÿQÿRÿTÿVÿYÿ^ÿdÿiÿnÿpÿpÿmÿiÿdÿ`ÿ]ÿ[ÿYÿWÿVÿTÿSÿTÿXÿ_ÿlÿ|ÿÿ¦ÿ¼ÿÓÿèÿýÿ'@[w•³Îçü-:FPX\[UK<*êÒ·š|\<ëÿÖÿÄÿ´ÿ¤ÿ”ÿ„ÿsÿdÿWÿMÿGÿEÿEÿHÿJÿMÿNÿOÿPÿQÿTÿWÿ\ÿaÿeÿgÿgÿdÿ`ÿ[ÿWÿTÿQÿPÿNÿMÿKÿJÿLÿPÿXÿdÿuÿ‰ÿŸÿ·ÿÎÿäÿúÿ&?[x–´Ðê#2?KV^ba\QB1ïÖ»ž~]=éÿÓÿÀÿ¯ÿŸÿŽÿ~ÿmÿ]ÿPÿFÿ?ÿ=ÿ=ÿ?ÿBÿDÿEÿFÿGÿHÿKÿOÿTÿZÿ^ÿaÿaÿ_ÿ\ÿXÿUÿRÿQÿPÿPÿOÿOÿOÿQÿVÿ_ÿlÿ}ÿ’ÿ©ÿÁÿÙÿðÿ3Mh…£ÁÝö .<HS]dgf`UF3ïÕ¹›{Z8üÿáÿËÿ·ÿ¥ÿ”ÿ„ÿsÿbÿRÿDÿ:ÿ4ÿ1ÿ1ÿ4ÿ6ÿ9ÿ:ÿ;ÿ<ÿ=ÿ?ÿCÿIÿNÿSÿVÿWÿVÿTÿQÿOÿMÿMÿMÿNÿNÿOÿPÿSÿZÿcÿqÿƒÿ™ÿ±ÿÊÿãÿúÿ(?Yu’±Îê+;HT^gnqoh\M9$ ôÙ½ž}\:üÿáÿÉÿµÿ£ÿ’ÿÿoÿ^ÿOÿAÿ6ÿ/ÿ,ÿ-ÿ/ÿ1ÿ3ÿ5ÿ5ÿ6ÿ6ÿ8ÿ;ÿ@ÿEÿJÿMÿNÿMÿJÿGÿEÿCÿCÿCÿDÿFÿGÿIÿMÿSÿ]ÿlÿ~ÿ”ÿ¬ÿÆÿßÿ÷ÿ%>Ws‘°Îë.?MYdmtxwqfVC.ýãÆ¨‡eC"éÿÐÿ¼ÿ©ÿ˜ÿ†ÿuÿdÿTÿFÿ;ÿ4ÿ1ÿ1ÿ4ÿ6ÿ9ÿ:ÿ;ÿ<ÿ<ÿ>ÿAÿEÿIÿMÿPÿPÿNÿKÿGÿDÿAÿ@ÿ?ÿ?ÿ@ÿ@ÿBÿEÿKÿTÿbÿsÿˆÿ ÿ¹ÿÒÿêÿ1Kg…¤Ãáü(:IVbluyytj[I4éÍ®ŽlJ) îÿÖÿÀÿ­ÿœÿŠÿyÿgÿWÿIÿ>ÿ7ÿ4ÿ4ÿ6ÿ9ÿ<ÿ=ÿ?ÿ?ÿ@ÿAÿDÿHÿMÿQÿTÿTÿRÿOÿKÿGÿDÿBÿAÿ@ÿ@ÿ@ÿAÿDÿIÿQÿ^ÿnÿƒÿšÿ³ÿËÿãÿûÿ)C_}¼Úö#5ER_jrwxsiZH2èË­ŒkI( íÿÕÿ¿ÿ¬ÿ›ÿŠÿyÿhÿXÿJÿ?ÿ8ÿ5ÿ6ÿ8ÿ;ÿ>ÿAÿBÿCÿDÿEÿHÿLÿQÿVÿXÿXÿVÿSÿNÿJÿFÿDÿBÿAÿAÿAÿAÿCÿHÿPÿ\ÿlÿ€ÿ—ÿ¯ÿÈÿàÿ÷ÿ %?[y™¹×ó "4ES`luz{wm_M7 íѲ’pN-òÿÙÿÃÿ°ÿžÿÿ{ÿjÿYÿKÿ@ÿ8ÿ5ÿ4ÿ6ÿ9ÿ<ÿ>ÿ?ÿ@ÿ@ÿAÿDÿHÿLÿQÿSÿSÿQÿNÿIÿEÿAÿ?ÿ>ÿ=ÿ=ÿ=ÿ>ÿAÿFÿNÿZÿjÿÿ–ÿ¯ÿÇÿàÿ÷ÿ&@\{šºØô #6FTaltz{vl^K6ìб‘pN-òÿÙÿÃÿ°ÿŸÿÿ|ÿkÿ[ÿLÿAÿ:ÿ6ÿ6ÿ8ÿ;ÿ=ÿ?ÿ@ÿAÿAÿCÿEÿIÿMÿQÿSÿSÿQÿNÿIÿEÿAÿ?ÿ>ÿ>ÿ>ÿ>ÿ?ÿBÿGÿOÿ[ÿkÿ€ÿ—ÿ¯ÿÈÿàÿ÷ÿ&?[y˜¸Öò  2BP]hpvvrhYG2è̯nM, òÿÚÿÅÿ²ÿ¡ÿÿÿoÿ_ÿQÿFÿ?ÿ<ÿ<ÿ>ÿBÿEÿGÿHÿIÿIÿJÿLÿOÿSÿWÿYÿYÿVÿRÿMÿIÿEÿBÿAÿ@ÿ@ÿ@ÿAÿDÿHÿPÿ\ÿlÿ€ÿ–ÿ¯ÿÇÿßÿöÿ #<Wt“²Ðë,<JVajpqmcUD/æË®ŽnM-óÿÛÿÆÿ´ÿ£ÿ“ÿ‚ÿrÿbÿTÿIÿBÿ>ÿ>ÿAÿDÿGÿIÿKÿKÿLÿLÿNÿRÿVÿYÿ[ÿ[ÿYÿUÿPÿKÿHÿEÿDÿCÿCÿCÿDÿGÿKÿSÿ^ÿnÿ‚ÿ™ÿ±ÿÉÿáÿøÿ $=Xt“±Ïê*:HT_hmnj`RA,ýãÈ«‹kJ* ðÿØÿÄÿ²ÿ¡ÿ‘ÿÿqÿaÿTÿIÿBÿ>ÿ?ÿAÿEÿIÿKÿMÿNÿNÿOÿQÿTÿXÿ\ÿ^ÿ^ÿ\ÿXÿTÿOÿKÿIÿGÿGÿGÿGÿHÿJÿNÿUÿaÿpÿ„ÿšÿ²ÿÊÿáÿøÿ $<Vr¯Ìçÿ&5BNYafgbYK9$ õÜÀ£„dD$ìÿÔÿÁÿ¯ÿ ÿ‘ÿÿrÿdÿWÿMÿFÿDÿEÿHÿLÿPÿTÿVÿVÿWÿXÿZÿ]ÿ`ÿcÿeÿeÿbÿ^ÿYÿTÿPÿMÿKÿJÿIÿIÿJÿKÿOÿWÿbÿqÿ„ÿ›ÿ²ÿÊÿáÿ÷ÿ #;UqŽ­Êåý$3?KU]bb^TF3ïÕº~^>çÿÐÿ½ÿ¬ÿžÿÿ€ÿrÿdÿWÿNÿGÿEÿFÿJÿNÿRÿUÿWÿXÿXÿYÿZÿ]ÿ`ÿcÿdÿdÿaÿ]ÿXÿSÿOÿLÿKÿJÿJÿJÿKÿNÿRÿZÿfÿvÿŠÿ¡ÿ¹ÿÑÿéÿ-E_{™·Õð,:FPY`cb\QA.ÿåÊ®qQ1õÿÛÿÅÿ²ÿ¢ÿ”ÿ†ÿxÿkÿ^ÿRÿJÿEÿCÿEÿIÿNÿSÿWÿYÿZÿ[ÿ[ÿ]ÿ_ÿbÿeÿfÿfÿcÿ_ÿZÿUÿQÿNÿLÿKÿKÿLÿMÿPÿUÿ]ÿiÿyÿŽÿ¥ÿ½ÿÖÿîÿ3Ke‚Ÿ½Úõ !1?JS[adb[P@,üâǪŒmM-òÿØÿÂÿ°ÿ ÿ’ÿ…ÿwÿjÿ]ÿRÿIÿDÿBÿDÿHÿMÿQÿUÿWÿXÿXÿXÿYÿ[ÿ^ÿaÿbÿbÿ_ÿ\ÿWÿRÿNÿKÿJÿIÿJÿKÿLÿPÿUÿ^ÿkÿ{ÿÿ¨ÿÁÿÚÿóÿ !8Qlˆ¦Äáü'7CNW]bdaZN=)øÝÁ¥†gG' íÿÓÿ½ÿ«ÿ›ÿÿ€ÿsÿfÿYÿNÿEÿ@ÿ>ÿ?ÿCÿHÿMÿPÿRÿSÿSÿTÿUÿWÿZÿ\ÿ^ÿ_ÿ]ÿZÿVÿRÿOÿMÿMÿMÿNÿPÿSÿXÿ^ÿhÿuÿ‡ÿœÿ´ÿÍÿçÿ.F^x”±Ïë-<HQX^aa^VI8# ñÖº_@ æÿÌÿ·ÿ¤ÿ•ÿ‡ÿzÿmÿ`ÿSÿHÿ?ÿ:ÿ9ÿ:ÿ>ÿCÿHÿLÿNÿOÿOÿPÿQÿSÿWÿZÿ\ÿ^ÿ]ÿ[ÿXÿVÿSÿSÿSÿTÿVÿYÿ]ÿbÿiÿsÿ€ÿ’ÿ§ÿ¿ÿØÿñÿ 6Me~š¶Òí,:DLRVYXTL?-çͱ•wX9þÿâÿÊÿ´ÿ£ÿ”ÿ†ÿyÿmÿ`ÿTÿIÿ@ÿ;ÿ:ÿ;ÿ?ÿDÿIÿMÿOÿPÿPÿQÿRÿTÿXÿ[ÿ^ÿ_ÿ_ÿ^ÿ\ÿYÿXÿWÿXÿYÿ\ÿ_ÿcÿhÿoÿyÿ‡ÿ˜ÿ­ÿÅÿÞÿ÷ÿ%<Rjƒ¹Õï-9CJORTSNE8&ùßĨ‹nO0õÿÙÿÀÿ«ÿ™ÿŠÿ}ÿpÿdÿXÿLÿAÿ9ÿ4ÿ3ÿ5ÿ:ÿ?ÿEÿIÿLÿMÿNÿOÿQÿTÿXÿ]ÿaÿcÿdÿdÿcÿbÿaÿaÿcÿeÿhÿlÿqÿwÿ~ÿˆÿ–ÿ§ÿ¼ÿÓÿìÿ2I_vާÂÜö  /:BHKNNLF<.íÓ¸œbD%ëÿÏÿ·ÿ¢ÿ‘ÿ‚ÿuÿiÿ]ÿRÿGÿ=ÿ6ÿ1ÿ1ÿ3ÿ8ÿ?ÿDÿIÿMÿOÿPÿRÿTÿWÿ\ÿaÿeÿiÿjÿkÿjÿiÿiÿjÿkÿnÿrÿvÿ{ÿÿˆÿ’ÿ ÿ°ÿÅÿÛÿóÿ "9Ndz‘ªÃÝõ +5<ACDDA;1#ûãÉ®“wZ=æÿÌÿ´ÿ ÿŽÿ€ÿtÿhÿ]ÿRÿGÿ>ÿ7ÿ3ÿ2ÿ5ÿ:ÿ@ÿFÿKÿOÿQÿRÿTÿVÿYÿ^ÿcÿgÿkÿmÿnÿnÿnÿoÿpÿrÿvÿzÿÿ„ÿŠÿ’ÿœÿ©ÿºÿÍÿãÿûÿ)?Ti~”«ÃÛò$-256651* êÓ¹Ÿ…jN2úÿßÿÅÿ®ÿ›ÿŠÿ}ÿqÿgÿ]ÿRÿIÿ@ÿ9ÿ6ÿ6ÿ9ÿ>ÿEÿKÿPÿTÿVÿWÿXÿZÿ]ÿaÿfÿkÿoÿrÿsÿtÿtÿuÿwÿzÿ~ÿƒÿˆÿŽÿ•ÿÿ¨ÿµÿÅÿÙÿïÿ3H\p„™°ÇÞó!(,--+($ðÛéu[@% ïÿÕÿ½ÿ¨ÿ•ÿ†ÿzÿpÿgÿ^ÿUÿLÿEÿ?ÿ=ÿ>ÿBÿHÿOÿVÿ[ÿ_ÿbÿcÿdÿeÿhÿlÿqÿvÿzÿ|ÿ~ÿ~ÿ~ÿÿ€ÿƒÿ‡ÿ‹ÿÿ–ÿœÿ¤ÿ®ÿºÿÊÿÝÿòÿ3H\n‚–¬ÂØí #$" öãζƒiO4æÿÌÿµÿ ÿÿÿuÿlÿdÿ\ÿTÿMÿGÿBÿAÿCÿHÿOÿWÿ_ÿfÿkÿnÿoÿpÿrÿuÿyÿ~ÿ‚ÿ†ÿ‰ÿŠÿŠÿŠÿ‹ÿŒÿŽÿ‘ÿ–ÿšÿ ÿ¦ÿ­ÿ¶ÿÂÿÑÿâÿöÿ 5I\n”©¾Ôéû  úëØÃ«‘w]C(õÿÛÿÂÿ«ÿ—ÿ†ÿxÿmÿdÿ]ÿVÿNÿHÿBÿ?ÿ>ÿAÿGÿOÿYÿbÿjÿqÿuÿwÿyÿ|ÿÿ„ÿŠÿÿ”ÿ—ÿ™ÿšÿšÿšÿœÿžÿ¡ÿ¥ÿ©ÿ®ÿ´ÿ»ÿÃÿÎÿÜÿìÿÿÿ%9K\l}Ž¡µÊÝîû    üôéÛɵ…lR9 ïÿ×ÿÀÿªÿ—ÿ‡ÿzÿoÿgÿ_ÿXÿRÿKÿFÿCÿBÿEÿKÿTÿ^ÿhÿpÿwÿ|ÿÿÿ„ÿˆÿÿ’ÿ˜ÿÿ¡ÿ£ÿ¤ÿ¥ÿ¥ÿ¦ÿ©ÿ¬ÿ°ÿµÿºÿÀÿÇÿÏÿÚÿçÿöÿ,=N^l{‹¯ÂÓãïøüýüùõðëãÙ˺¥w_F/êÿÓÿ¾ÿªÿ˜ÿ‰ÿ}ÿsÿkÿeÿ^ÿXÿRÿMÿJÿIÿLÿSÿ[ÿeÿoÿxÿÿ„ÿ‡ÿ‰ÿŒÿÿ–ÿ›ÿ¢ÿ§ÿ«ÿ®ÿ¯ÿ¯ÿ¯ÿ±ÿ³ÿ¶ÿ»ÿ¿ÿÅÿËÿÒÿÚÿäÿðÿþÿ0AP^kx†–§·ÈÖáèëëéåáÜÖÎö¥’|eN7! ÷ÿâÿÍÿ¹ÿ§ÿ—ÿŠÿÿwÿpÿkÿfÿaÿ\ÿWÿUÿUÿYÿ_ÿhÿsÿ}ÿ†ÿÿ’ÿ•ÿ˜ÿ›ÿžÿ£ÿ©ÿ¯ÿ´ÿ¸ÿºÿ»ÿ»ÿ¼ÿ½ÿ¿ÿÂÿÇÿÌÿÑÿ×ÿÝÿåÿîÿùÿ$4CP]hs€Ž¬»ÇÑ×ÙÙÖÑÌÆÀ¸­ |gQ:%üÿéÿÕÿÃÿ±ÿ ÿ’ÿ†ÿ}ÿvÿqÿmÿiÿeÿaÿ^ÿ\ÿ]ÿaÿiÿrÿ}ÿˆÿ‘ÿ™ÿžÿ¢ÿ¥ÿ¨ÿ¬ÿ²ÿ·ÿ½ÿÂÿÆÿÈÿÉÿÉÿÉÿÉÿËÿÏÿÓÿ×ÿÜÿâÿèÿïÿ÷ÿ (6DPZdny…“¡®ºÂÈÉÈÅÀ»µ¯§nYD/õÿãÿÑÿÀÿ°ÿ¡ÿ”ÿ‰ÿÿ{ÿvÿsÿoÿlÿiÿfÿdÿfÿjÿrÿ|ÿ‡ÿ’ÿ›ÿ£ÿ¨ÿ¬ÿ¯ÿ³ÿ·ÿ¼ÿÂÿÈÿÍÿÑÿÓÿÔÿÓÿÓÿÔÿÕÿØÿÜÿáÿæÿëÿðÿ÷ÿþÿ+8CNW_hq|ˆ”¡«³·¸¶³®©£•Œ€p_K7#þÿíÿÝÿÍÿ½ÿ¯ÿ¡ÿ–ÿÿ†ÿÿ}ÿ{ÿxÿuÿsÿpÿoÿqÿvÿ~ÿˆÿ“ÿžÿ¨ÿ°ÿµÿ¹ÿ½ÿÀÿÄÿÉÿÏÿÔÿÙÿÝÿÞÿßÿÞÿÝÿÝÿßÿáÿåÿéÿíÿñÿöÿüÿ  +7AJRY`hq|‡’œ£¦§¥ ›–Šƒyn_N;(ôÿäÿÕÿÇÿ¹ÿ¬ÿ¡ÿ—ÿÿ‰ÿ†ÿƒÿÿÿ}ÿ{ÿyÿyÿzÿÿ‡ÿ‘ÿœÿ§ÿ±ÿ¹ÿ¾ÿÂÿÅÿÉÿÍÿÑÿÖÿÜÿàÿãÿåÿåÿäÿãÿâÿãÿæÿéÿíÿñÿöÿûÿ$0;ENV\cjs}ˆ’›¡¤¤¡œ–‰ƒzqdUD1 úÿêÿÛÿÍÿ¿ÿ²ÿ¦ÿœÿ“ÿŒÿˆÿ…ÿƒÿ‚ÿÿ€ÿ~ÿ}ÿ}ÿ€ÿ…ÿÿ—ÿ¢ÿ­ÿ·ÿ¿ÿÄÿÈÿËÿÎÿÒÿÖÿÛÿàÿäÿçÿèÿçÿæÿäÿäÿäÿæÿéÿíÿñÿöÿúÿ#/:ENU\cjs}‡‘šŸ¢¡ž˜’Œ…~vl`Q@-øÿèÿÙÿÌÿ¿ÿ²ÿ§ÿÿ”ÿÿ‰ÿ†ÿ…ÿ„ÿƒÿ‚ÿÿ€ÿ€ÿ‚ÿ‡ÿÿ™ÿ£ÿ®ÿ·ÿ¾ÿÃÿÇÿÊÿÌÿÐÿÔÿÙÿÝÿâÿäÿåÿåÿäÿãÿãÿäÿæÿêÿîÿóÿøÿýÿ '3?JS[bipx‚Œ•¢¤¢ž˜‘‰‚zqfYJ8%ðÿàÿÒÿÅÿ¸ÿ¬ÿ¡ÿ—ÿÿ‰ÿ…ÿƒÿ‚ÿÿÿ€ÿÿÿÿÿ‡ÿŽÿ˜ÿ£ÿ®ÿ·ÿ¾ÿÃÿÇÿÊÿÌÿÐÿÔÿÙÿÝÿâÿäÿæÿæÿåÿåÿåÿçÿêÿîÿóÿùÿÿÿ '2?KV_hou|„–ž¥©ª§¡š’‰€vl_Q@.ôÿâÿÒÿÄÿ·ÿªÿŸÿ”ÿ‹ÿƒÿ}ÿzÿxÿxÿxÿxÿxÿxÿxÿzÿ}ÿƒÿ‹ÿ•ÿ¡ÿ¬ÿµÿ½ÿÃÿÇÿÊÿÎÿÑÿÖÿÛÿßÿäÿæÿèÿèÿçÿçÿçÿéÿíÿòÿ÷ÿýÿ #.:GS_iqy†Ž—Ÿ§­±°­¦ž•Š€ui[L:&þÿêÿØÿÇÿ¹ÿ¬ÿŸÿ”ÿ‰ÿ€ÿxÿsÿpÿnÿnÿoÿpÿqÿqÿrÿtÿxÿ~ÿ‡ÿ’ÿžÿ©ÿ´ÿ¼ÿÃÿÈÿËÿÏÿÓÿØÿÝÿâÿçÿêÿìÿìÿìÿëÿìÿïÿóÿøÿþÿ "-8DQ^ju}…Œ“𢫲·º¹´­¤™Ž‚viZI6" ÷ÿãÿÐÿ¿ÿ°ÿ¢ÿ–ÿŠÿÿvÿnÿhÿdÿcÿcÿcÿeÿfÿfÿhÿjÿnÿuÿÿŠÿ–ÿ£ÿ®ÿ¸ÿ¿ÿÅÿÊÿÏÿÔÿÚÿàÿæÿëÿîÿñÿñÿòÿòÿóÿöÿúÿ #+5@LYeq{ƒŠ‘—ž¥¬³·¹¸³«¡–Š}qcTC/ðÿÜÿÉÿ¸ÿªÿœÿÿ…ÿzÿqÿiÿcÿ_ÿ^ÿ^ÿ_ÿ`ÿaÿcÿdÿgÿlÿsÿ}ÿ‰ÿ–ÿ£ÿ¯ÿ¹ÿÁÿÈÿÎÿÓÿÙÿßÿåÿìÿñÿõÿ÷ÿøÿøÿùÿúÿýÿ !)1:DP\hs|„‹–œ¢©¯³´²­¥›„xk]N=*ìÿØÿÆÿ¶ÿ§ÿ›ÿÿ…ÿ{ÿrÿjÿeÿbÿ`ÿaÿbÿdÿfÿhÿjÿmÿrÿyÿƒÿŽÿ›ÿ©ÿµÿ¿ÿÇÿÎÿÔÿÙÿÞÿäÿêÿðÿõÿùÿûÿüÿûÿûÿüÿÿÿ")19CNYeox€†‹•›¡§«¬ª¥’‡{naTE4! øÿãÿÏÿ½ÿ®ÿ ÿ•ÿŠÿ€ÿxÿpÿiÿdÿbÿaÿbÿdÿgÿjÿlÿoÿsÿxÿ€ÿŠÿ–ÿ¤ÿ±ÿ¾ÿÉÿÑÿØÿÞÿãÿèÿíÿóÿøÿýÿÿÿ #*1:CMXcmv|‚‡‹‘–œ¡¥¦¤Ÿ—ui\N?/ôÿßÿÌÿ»ÿ¬ÿŸÿ”ÿŠÿÿyÿrÿlÿhÿfÿfÿgÿjÿlÿoÿrÿuÿyÿÿ‡ÿ‘ÿÿ«ÿ¸ÿÅÿÐÿØÿßÿäÿéÿîÿóÿøÿýÿ #)08AKU_iqw|€„ˆ’—š›™“‹vj^RE6'ïÿÛÿÉÿ¹ÿ«ÿ ÿ–ÿÿ†ÿÿyÿtÿpÿoÿoÿqÿsÿwÿzÿ}ÿ€ÿ„ÿ‰ÿ‘ÿ›ÿ¨ÿµÿÂÿÏÿÙÿâÿèÿîÿòÿ÷ÿûÿ  $*08?HQZcinrux{ƒ†‰‰†xncWL@3&õÿãÿÑÿÀÿ²ÿ¦ÿœÿ”ÿÿ‡ÿ‚ÿ}ÿzÿwÿwÿxÿzÿ~ÿÿ…ÿˆÿŒÿÿ–ÿžÿ¨ÿ´ÿÁÿÎÿÚÿåÿíÿóÿøÿüÿ  !'-3:AIRZagknprtwz}~~{vmdYMB6+ðÿßÿÎÿ¾ÿ±ÿ¦ÿÿ–ÿ‘ÿŒÿ‡ÿ„ÿÿÿÿÿƒÿ‡ÿ‹ÿŽÿ’ÿ•ÿ™ÿŸÿ¦ÿ°ÿ¼ÿÈÿÕÿáÿëÿóÿùÿþÿ  #).4;AIPX^cgijklnpstspjbXMA6+÷ÿçÿÖÿÆÿ¸ÿ«ÿ¡ÿ™ÿ“ÿŽÿ‹ÿ‡ÿ…ÿƒÿ‚ÿƒÿ…ÿˆÿŒÿ‘ÿ•ÿ™ÿœÿ¡ÿ§ÿ¯ÿ¹ÿÄÿÑÿÞÿéÿóÿûÿ %*05;AHOU[_bccdefhjjif`XNC8-" ÿÿðÿáÿÐÿÁÿ³ÿ§ÿÿ–ÿÿŒÿ‰ÿ†ÿ„ÿƒÿƒÿ„ÿ†ÿŠÿŽÿ’ÿ—ÿ›ÿŸÿ¤ÿªÿ²ÿ¼ÿÇÿÔÿáÿíÿ÷ÿÿÿ !',27=BHNTZ_bdddcccdeec_XPF;/$÷ÿéÿÙÿÊÿ»ÿ­ÿ¡ÿ˜ÿ‘ÿŒÿˆÿ…ÿƒÿÿ€ÿÿ‚ÿ„ÿˆÿŒÿ‘ÿ•ÿšÿžÿ£ÿ©ÿ±ÿ¼ÿÇÿÔÿáÿíÿ÷ÿ  ""!"'-39?DIOTZ_cfgfedcbba`]XQG<1%øÿìÿÞÿÏÿÀÿ±ÿ¤ÿ˜ÿÿ‰ÿ…ÿ‚ÿ€ÿÿÿÿ€ÿ‚ÿ…ÿ‰ÿŽÿ“ÿ˜ÿÿ¢ÿ§ÿ®ÿ¶ÿÁÿÌÿÙÿæÿòÿüÿ "%'('%#"#%)/5;AGLRW\aeikkjhfdba`]YSK@5(ùÿíÿàÿÒÿÄÿµÿ¦ÿ™ÿŽÿ†ÿ€ÿ|ÿzÿyÿyÿyÿzÿ|ÿÿƒÿˆÿŽÿ“ÿ™ÿŸÿ¥ÿ«ÿ³ÿ¼ÿÇÿÓÿàÿíÿúÿ "&*-//.-+++-17=CINSX]afilmmkifc`^\XSLC7+øÿìÿßÿÓÿÅÿ¶ÿ¨ÿšÿÿƒÿ{ÿvÿsÿrÿrÿsÿtÿvÿzÿ~ÿƒÿ‰ÿÿ–ÿÿ¤ÿ«ÿ²ÿ»ÿÄÿÐÿÜÿêÿ÷ÿ #&)-0355420/025:@FLQV[_cgkmnnlieb_\YUOG=1$ûÿîÿáÿÕÿÈÿºÿ¬ÿÿÿƒÿyÿqÿlÿjÿiÿjÿlÿnÿqÿuÿzÿ€ÿ‡ÿÿ—ÿŸÿ§ÿ¯ÿ·ÿÀÿËÿ×ÿäÿòÿÿÿ $),0369<>>=;:99;>CHNSX]aehloqqpmjfb^ZVQJB7* ÿÿðÿãÿÖÿÉÿ¼ÿ®ÿ ÿ‘ÿ„ÿxÿnÿgÿbÿ`ÿ_ÿaÿcÿfÿiÿnÿtÿ{ÿƒÿ‹ÿ”ÿÿ¦ÿ¯ÿ¸ÿÂÿÍÿÚÿçÿõÿ#).148;>ACCCA@??@DHMSX]adhknqrrpmid`[WRLE<1#÷ÿèÿÛÿÎÿÂÿµÿ¨ÿšÿÿ€ÿuÿlÿeÿaÿ`ÿ`ÿbÿeÿiÿmÿsÿyÿ€ÿ‰ÿ’ÿ›ÿ¤ÿ­ÿµÿ¾ÿÈÿÓÿßÿìÿúÿ%+.1469<?@A@?=<<>AEJOTY]adgjlmmkhd_[VRMHA8,ôÿåÿØÿÌÿÀÿ´ÿ§ÿšÿÿÿvÿnÿgÿdÿcÿcÿfÿiÿmÿrÿwÿ~ÿ…ÿŽÿ—ÿ ÿ©ÿ²ÿºÿÃÿÍÿ×ÿãÿðÿþÿ  '-1368;>@BCBA@??ADHMRW[_behklmljfa\WRMHB;1& üÿíÿßÿÒÿÅÿºÿ®ÿ¢ÿ•ÿ‰ÿ}ÿsÿkÿeÿbÿbÿcÿeÿiÿnÿsÿyÿ€ÿ‰ÿ‘ÿ›ÿ¥ÿ®ÿ·ÿÀÿÉÿÓÿÞÿêÿöÿ&-379;=@CEFGFECBBCEIMRVZ^adfhiihe`[VPKE@:3)ôÿæÿØÿËÿ¿ÿ´ÿ¨ÿÿ‘ÿ…ÿzÿpÿiÿcÿaÿaÿbÿfÿjÿpÿvÿ}ÿ…ÿŽÿ—ÿ¢ÿ¬ÿ¶ÿ¿ÿÈÿÒÿÜÿçÿóÿ %.6;?ACEGIKLLKIGEEEGJMQUY\^`bdeec_[UOJD>92+! ûÿìÿÝÿÏÿÃÿ·ÿ«ÿ ÿ”ÿˆÿ}ÿrÿiÿaÿ]ÿZÿ[ÿ]ÿaÿgÿmÿtÿ|ÿ…ÿÿšÿ¥ÿ°ÿ»ÿÅÿÏÿÙÿäÿðÿüÿ #/9AGJMOPRTVWVURPMLLLNQTWZ\^`abba_[VPIC<6/(  þÿïÿàÿÑÿÃÿ¶ÿªÿŸÿ”ÿˆÿ}ÿrÿhÿ_ÿXÿTÿSÿTÿWÿ\ÿbÿjÿrÿ{ÿ†ÿ‘ÿÿ©ÿ¶ÿÂÿÍÿØÿãÿîÿúÿ!.:DLRVXZ\]_``_]ZWTQPOPRSUWXYZZZZYVQLE>81*# ÿÿòÿãÿÕÿÆÿ¹ÿ¬ÿ¡ÿ–ÿŒÿ‚ÿwÿmÿdÿ\ÿWÿTÿSÿUÿYÿ_ÿgÿoÿyÿƒÿÿ›ÿ¨ÿµÿÂÿÏÿÛÿæÿñÿýÿ"/<HRY^acdefgggeb^YUQNMLLLMMNNMMMLJGB<5.'  üÿðÿäÿÖÿÈÿ»ÿ®ÿ£ÿ™ÿÿ†ÿ}ÿtÿkÿdÿ]ÿYÿVÿWÿYÿ^ÿeÿmÿwÿÿŒÿ˜ÿ¥ÿ³ÿÁÿÎÿÛÿèÿóÿÿÿ "/=IU^ejmoppqqqpnkfa\WSOMLKKJIGFEDB?;6/(  þÿöÿíÿãÿÖÿÉÿ¼ÿ¯ÿ£ÿ™ÿÿˆÿ€ÿxÿpÿiÿbÿ]ÿYÿXÿYÿ\ÿbÿiÿrÿ|ÿ‡ÿ“ÿŸÿ­ÿ»ÿÉÿ×ÿåÿñÿýÿ,9ER]fmruvvwwwwusnic]WRNJHFDB@><:751-'! þÿøÿòÿëÿãÿÙÿÎÿÂÿ¶ÿªÿ ÿ—ÿÿˆÿ‚ÿ{ÿuÿnÿiÿdÿaÿaÿbÿfÿmÿtÿ~ÿˆÿ“ÿŸÿ¬ÿ¹ÿÈÿÖÿäÿñÿýÿ*6BOZemtxzzzzzzywtoic\UOJFB@=:742/-*&"úÿôÿîÿèÿáÿÚÿÐÿÆÿ»ÿ¯ÿ¤ÿ›ÿ’ÿ‹ÿ…ÿÿzÿtÿnÿiÿeÿcÿcÿeÿiÿpÿxÿÿŒÿ—ÿ£ÿ°ÿ¾ÿÌÿÛÿéÿöÿ$/;GS_irx|~~~}{xsmf_XQLGC@<9630-+($  ùÿóÿíÿçÿàÿØÿÏÿÅÿºÿ¯ÿ¤ÿšÿ’ÿŒÿ†ÿ€ÿ{ÿuÿpÿkÿgÿdÿdÿeÿiÿoÿwÿ€ÿŠÿ•ÿ¡ÿ®ÿ»ÿÉÿØÿæÿóÿ !,7CO[emtxz{|||||zxsnhaZSMIDA>:741.,)&" üÿöÿðÿêÿãÿÜÿÒÿÈÿ½ÿ²ÿ§ÿžÿ–ÿÿ‰ÿ„ÿ~ÿyÿsÿnÿjÿgÿfÿhÿkÿqÿxÿ€ÿŠÿ”ÿ ÿ¬ÿ¹ÿÇÿÕÿãÿñÿýÿ)5ALXbkqvxzz{{||{yvqkd]WQLHD@=9630-*'# üÿöÿïÿéÿâÿÛÿÑÿÇÿ¼ÿ°ÿ¦ÿœÿ”ÿÿ†ÿÿ{ÿvÿpÿkÿgÿdÿbÿcÿfÿkÿrÿzÿƒÿÿ˜ÿ¤ÿ±ÿ¿ÿÍÿÜÿéÿöÿ $0<IU`jqwz|~€ƒ„„ƒ€|vpic]WSNJEA=952.*%  üÿõÿîÿèÿàÿØÿÏÿÄÿ¹ÿ­ÿ¢ÿ˜ÿÿˆÿ‚ÿ|ÿvÿqÿkÿfÿaÿ^ÿ\ÿ]ÿ_ÿdÿjÿrÿzÿ„ÿÿ›ÿ¨ÿ¶ÿÄÿÒÿàÿíÿúÿ+8ER^iqx}€ƒ…ˆŠŒ‹‡‚|unhb]XSNID?;72-(! úÿóÿìÿäÿÝÿÔÿËÿÀÿ´ÿ¨ÿÿ“ÿŠÿƒÿ}ÿwÿrÿlÿfÿaÿ\ÿYÿXÿXÿZÿ_ÿeÿlÿuÿÿŠÿ–ÿ£ÿ±ÿ¿ÿÎÿÜÿêÿ÷ÿ*8FT`lu}‚‡ŠŽ‘”–˜˜–“އzsmga\VPJD?:4/(!þÿõÿìÿäÿÜÿÔÿËÿÁÿµÿ©ÿÿ’ÿˆÿÿxÿrÿlÿgÿbÿ\ÿWÿSÿPÿOÿOÿRÿWÿ]ÿeÿnÿyÿ„ÿÿžÿ­ÿ¼ÿËÿÚÿéÿ÷ÿ .<KZgs~†Œ‘•™œ £¥¥£ ›”ކyrlf_XRKD>81*!ûÿñÿèÿßÿÖÿÍÿÄÿ¹ÿ®ÿ¢ÿ•ÿŠÿ€ÿwÿpÿjÿeÿ`ÿZÿUÿPÿLÿIÿHÿIÿLÿQÿXÿ`ÿiÿsÿÿ‹ÿ™ÿ¨ÿ¸ÿÈÿ×ÿæÿõÿ.=L[iv€‰•šž£§ª¬­¬©¤ž—ˆ‚{tmf_XPIB;4+"ùÿîÿäÿÛÿÑÿÇÿ½ÿ²ÿ¦ÿšÿÿ‚ÿxÿoÿhÿbÿ\ÿWÿRÿMÿIÿEÿBÿAÿBÿFÿKÿRÿ[ÿdÿoÿ{ÿˆÿ—ÿ¦ÿ¶ÿÆÿ×ÿæÿöÿ!0@O_mz„”šŸ£¨¬¯±²°­¨¡š“‹„}unf_WOG@81( öÿëÿáÿØÿÏÿÅÿ»ÿ°ÿ¤ÿ˜ÿŒÿÿwÿnÿgÿaÿ\ÿWÿRÿMÿIÿEÿCÿBÿCÿGÿLÿSÿ\ÿeÿpÿ|ÿ‰ÿ—ÿ§ÿ·ÿÈÿØÿèÿøÿ$3CSbp}ˆ‘˜¢¦ª®±³³±­¨¡š’Š‚{skc[RJB;3+#ûÿñÿæÿÜÿÓÿÊÿÀÿ¶ÿ«ÿ ÿ“ÿ‡ÿ|ÿrÿjÿcÿ]ÿXÿSÿNÿJÿEÿBÿ@ÿ?ÿAÿDÿJÿQÿZÿdÿoÿ{ÿ‰ÿ˜ÿ¨ÿ¸ÿÉÿÛÿëÿüÿ *:JZjx…™ ¥ª®²¶¸º¹·³­¦Ÿ–ކ~wnf]TLD<4-$üÿòÿçÿÝÿÓÿÊÿÀÿ¶ÿ«ÿŸÿ“ÿ†ÿ{ÿqÿhÿaÿZÿUÿOÿJÿEÿAÿ=ÿ;ÿ:ÿ<ÿ?ÿEÿMÿUÿ`ÿkÿwÿ…ÿ”ÿ¥ÿ¶ÿÈÿÙÿêÿûÿ *:K[jy†™ ¥ª®±´·¸·µ°«¤œ”Œ„}ume]TLE=6/' ÷ÿíÿãÿÚÿÑÿÇÿ½ÿ²ÿ¦ÿšÿŽÿ‚ÿxÿnÿgÿ`ÿZÿTÿNÿIÿCÿ?ÿ=ÿ<ÿ=ÿAÿFÿNÿVÿ`ÿkÿxÿ†ÿ•ÿ¥ÿ·ÿÈÿÚÿëÿûÿ *:JYhvƒ•œ¡¥¨«®¯°¯¬¨¢›“‹ƒ|umf^WOHA:4-& úÿðÿçÿÞÿÕÿËÿÂÿ·ÿ«ÿŸÿ“ÿ‡ÿ}ÿsÿkÿdÿ^ÿWÿQÿLÿGÿBÿ@ÿ?ÿ@ÿCÿIÿPÿYÿcÿnÿ{ÿˆÿ˜ÿ¨ÿ¹ÿÊÿÛÿìÿýÿ +:IXgu‹“™ž¡¥§ª««ª§£–އxqjc\UNG@:4.'üÿóÿêÿáÿØÿÏÿÅÿºÿ®ÿ¢ÿ•ÿŠÿÿuÿmÿfÿ_ÿXÿRÿMÿHÿCÿAÿ@ÿAÿEÿJÿQÿZÿdÿpÿ|ÿŠÿ™ÿ©ÿºÿËÿÜÿíÿýÿ *9HWes~ˆ–šž¡£¦§§¦£Ÿ™’‹ƒ|ungaZSMFA;5/)" øÿïÿæÿÝÿÔÿÊÿ¿ÿ´ÿ§ÿ›ÿÿ„ÿzÿrÿjÿcÿ]ÿVÿPÿKÿGÿDÿCÿDÿGÿLÿSÿ[ÿeÿpÿ|ÿŠÿ˜ÿ¨ÿ¸ÿÉÿÙÿêÿùÿ&5CR`mx‚Š”—šŸ ¡ ™”†xqke_YSMGB=72,&þÿöÿíÿåÿÜÿÒÿÈÿ¼ÿ°ÿ¤ÿ˜ÿÿƒÿ{ÿsÿlÿeÿ^ÿXÿRÿNÿJÿHÿIÿKÿPÿVÿ^ÿgÿqÿ}ÿ‰ÿ—ÿ¦ÿµÿÅÿÔÿäÿóÿ-;IWdoy€†‹’”—˜™˜–’Žˆ{tnhc]XRLGB=83-'  úÿòÿêÿâÿØÿÎÿÃÿ¸ÿ¬ÿ¡ÿ–ÿŒÿ„ÿ|ÿuÿnÿhÿbÿ]ÿXÿTÿRÿRÿTÿXÿ^ÿeÿnÿwÿ‚ÿÿšÿ¨ÿ¶ÿÄÿÓÿáÿðÿþÿ &4ANZenv|€„‡‰ŒŽŽŒ‰…€ztnid_ZUPKFA<72,&  ûÿóÿëÿãÿÚÿÑÿÆÿ»ÿ°ÿ¥ÿ›ÿ’ÿŠÿ‚ÿ|ÿvÿpÿjÿeÿ`ÿ]ÿ[ÿ[ÿ]ÿaÿgÿnÿvÿÿ‰ÿ”ÿ ÿ¬ÿºÿÇÿÕÿãÿðÿýÿ $1>JV`ipvz~„†ˆ‰‰ˆ…|wqlgb]YTOJE@;61+%ùÿñÿêÿâÿÙÿÏÿÅÿ»ÿ°ÿ¥ÿœÿ“ÿ‹ÿ„ÿ~ÿxÿsÿnÿiÿeÿbÿ`ÿaÿcÿgÿlÿsÿ{ÿ„ÿŽÿ˜ÿ£ÿ¯ÿ¼ÿÈÿÕÿâÿïÿûÿ ,9EPZbioswz}ƒƒ‚€|xtojea]YUQLGB=83-'! ýÿöÿîÿæÿÞÿÔÿÊÿÀÿµÿ«ÿ¡ÿ™ÿ‘ÿŠÿ„ÿ~ÿyÿsÿoÿjÿgÿfÿfÿhÿlÿqÿwÿÿ‡ÿÿšÿ¤ÿ¯ÿ»ÿÇÿÓÿßÿëÿ÷ÿ&2>HRZagknrtwy{|{ywsokfc_\YUQMHC?:4/)#ûÿôÿíÿåÿÜÿÒÿÈÿ¾ÿ´ÿ«ÿ£ÿ›ÿ”ÿŽÿ‰ÿƒÿ~ÿyÿuÿqÿoÿoÿqÿtÿyÿÿ†ÿÿ•ÿžÿ§ÿ±ÿ»ÿÆÿÑÿÜÿçÿòÿýÿ)4>HPV[_cfilnpqqpnkhda^\YVSPLHC>94/)#ûÿôÿíÿåÿÝÿÔÿÊÿÁÿ·ÿ®ÿ§ÿ ÿšÿ”ÿÿŠÿ…ÿÿ}ÿzÿyÿyÿ{ÿ~ÿƒÿ‰ÿÿ—ÿžÿ§ÿ¯ÿ¸ÿÂÿÌÿÖÿàÿêÿôÿþÿ&09BINSWZ\_adefgfdb_]ZXVTRPMIEA<83-'!ûÿôÿíÿæÿÞÿÕÿÌÿÃÿºÿ²ÿ«ÿ¤ÿžÿ™ÿ”ÿÿŒÿˆÿ…ÿƒÿ‚ÿƒÿ…ÿ‰ÿŽÿ”ÿšÿ¢ÿ©ÿ±ÿ¹ÿÁÿÊÿÓÿÜÿåÿîÿöÿÿÿ"*29@DHKMOQSVWXYYXVTSQPPONMKHEB>:51+&  úÿóÿìÿåÿÜÿÔÿËÿÂÿºÿ²ÿ¬ÿ¦ÿ¡ÿÿ™ÿ•ÿ‘ÿŽÿÿŒÿÿÿ“ÿ˜ÿžÿ¥ÿ«ÿ²ÿºÿÁÿÉÿÑÿÙÿáÿéÿðÿøÿ$+169<>@ACEGHJKKJJIHGGHHHHFEB@<940+%  ûÿõÿîÿçÿßÿ×ÿÎÿÆÿ¾ÿ·ÿ±ÿ¬ÿ§ÿ¤ÿ ÿÿšÿ˜ÿ—ÿ—ÿ˜ÿ›ÿ ÿ¥ÿ¬ÿ³ÿºÿÁÿÈÿÐÿ×ÿßÿæÿíÿõÿûÿ &,046899::;<=>>>>=<;;;;;<<;9741.*&! üÿ÷ÿñÿëÿåÿÞÿÖÿÏÿÇÿÁÿºÿµÿ±ÿ­ÿªÿ¨ÿ¥ÿ£ÿ¢ÿ¡ÿ¢ÿ¤ÿ¨ÿ­ÿ²ÿ¹ÿÀÿÇÿÎÿÖÿÝÿäÿëÿòÿøÿÿÿ #(,/24444333445554332222333310-*'# üÿ÷ÿòÿíÿèÿãÿÝÿÖÿÏÿÉÿÃÿ¾ÿ¹ÿ¶ÿ³ÿ°ÿ®ÿ­ÿ«ÿ«ÿ«ÿ¬ÿ¯ÿ³ÿ¸ÿ¾ÿÅÿÌÿÔÿÛÿâÿèÿïÿõÿûÿ  #'*-/00/..---.....-,,,,-....-+)&" üÿ÷ÿòÿîÿéÿåÿàÿÚÿÔÿÎÿÈÿÃÿ¾ÿºÿ·ÿµÿ´ÿ²ÿ²ÿ±ÿ²ÿ³ÿµÿ¸ÿ½ÿÃÿÊÿÑÿÙÿáÿèÿðÿöÿýÿ  #%(+-///.-+)('&&%%$#"! !!!! üÿ÷ÿòÿîÿëÿçÿäÿàÿÜÿØÿÓÿÎÿÊÿÆÿÂÿÀÿ¾ÿ½ÿ¼ÿ¼ÿ¼ÿ½ÿ¾ÿÀÿÃÿÇÿÍÿÓÿÚÿâÿêÿòÿúÿ "%')*,-.///.,)&#! þÿúÿöÿòÿïÿëÿèÿåÿãÿàÿÞÿÛÿØÿÕÿÑÿÎÿËÿÈÿÇÿÆÿÆÿÆÿÇÿÈÿÊÿÌÿÏÿÓÿ×ÿÝÿäÿëÿóÿüÿ "&*-/1234444432/,($  þÿûÿøÿõÿñÿîÿêÿæÿãÿàÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÎÿÌÿÉÿÇÿÅÿÄÿÄÿÅÿÆÿÈÿÊÿÍÿÐÿÔÿÙÿßÿæÿîÿöÿÿÿ '-26:=?@ABBBAA@><840+&! þÿýÿüÿûÿûÿúÿùÿøÿöÿôÿñÿîÿëÿçÿãÿàÿÜÿÙÿÖÿÓÿÑÿÏÿÎÿÍÿÌÿËÿÉÿÇÿÆÿÄÿÃÿÂÿÂÿÃÿÅÿÇÿÊÿÎÿÒÿÖÿÛÿáÿèÿïÿøÿ %-4:?CFHJKKKKJIGEC@<71,&  ÿÿüÿùÿöÿôÿòÿñÿñÿðÿîÿíÿêÿèÿåÿâÿÞÿÚÿ×ÿÓÿÐÿÍÿÊÿÈÿÆÿÅÿÄÿÃÿÃÿÂÿÂÿÁÿÀÿÀÿÀÿÀÿÁÿÄÿÆÿÊÿÎÿÓÿØÿÝÿãÿêÿòÿûÿ !+3;BHMPSUWWWWVTSQNKGB=70*# ÿÿûÿöÿòÿïÿìÿéÿèÿæÿäÿâÿàÿÝÿÚÿ×ÿÓÿÏÿËÿÈÿÄÿÁÿ¾ÿ»ÿ¹ÿ¸ÿ·ÿ·ÿ·ÿ¸ÿ¸ÿ¸ÿ¹ÿ¹ÿ¹ÿºÿ¼ÿ¾ÿÂÿÆÿÊÿÐÿÖÿÜÿãÿêÿòÿûÿ#.8AIPV[_bdeffecb_]ZVRLF?80)!üÿöÿñÿìÿçÿãÿàÿÝÿÛÿØÿÖÿÓÿÐÿÌÿÈÿÄÿÀÿ½ÿ¹ÿµÿ²ÿ°ÿ®ÿ¬ÿ«ÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ±ÿ²ÿ´ÿµÿ·ÿºÿ¾ÿÂÿÇÿÍÿÔÿÛÿâÿêÿòÿûÿ $/:DNV]chloqqrqpnkieb]XQJB:1(  üÿõÿîÿèÿáÿÜÿ×ÿÔÿÐÿÎÿËÿÈÿÆÿÂÿ¿ÿ»ÿ¸ÿ´ÿ±ÿ­ÿ«ÿ¨ÿ¦ÿ¥ÿ¤ÿ¤ÿ¥ÿ¦ÿ¨ÿªÿ¬ÿ®ÿ°ÿ³ÿµÿ¸ÿ¼ÿÁÿÆÿÌÿÓÿÚÿâÿêÿòÿûÿ #/:FPZbiotwz{||{yvsplgb[TLC90& üÿôÿíÿåÿÞÿØÿÒÿÍÿÈÿÅÿÂÿ¿ÿ½ÿºÿ·ÿ³ÿ°ÿ­ÿ©ÿ¦ÿ£ÿ¡ÿŸÿžÿÿÿžÿŸÿ¡ÿ£ÿ¦ÿ©ÿ¬ÿ¯ÿ²ÿ¶ÿ¹ÿ¾ÿÃÿÉÿÐÿØÿàÿèÿñÿúÿ ".:FQ\fnu{ƒ…††…ƒ~zupkd]ULB7-"üÿôÿëÿãÿÛÿÓÿÌÿÆÿÁÿ½ÿºÿ·ÿ´ÿ²ÿ°ÿ­ÿ«ÿ¨ÿ¦ÿ£ÿ¡ÿŸÿÿÿœÿœÿÿžÿ ÿ£ÿ¦ÿ©ÿ­ÿ°ÿ´ÿ¸ÿ¼ÿÀÿÅÿËÿÑÿØÿàÿèÿðÿùÿ *6AMXclt{€„†ˆˆˆ†„}xsmg`XOE;0%üÿòÿéÿáÿØÿÐÿÉÿÂÿ¼ÿ·ÿ³ÿ±ÿ®ÿ­ÿ«ÿ©ÿ¨ÿ¦ÿ¤ÿ£ÿ¡ÿŸÿžÿžÿžÿžÿŸÿ ÿ¢ÿ¤ÿ§ÿªÿ®ÿ²ÿ¶ÿºÿ½ÿÂÿÆÿËÿÑÿØÿßÿçÿïÿøÿ '2=IT_irz€…‰‹ŒŒ‹Š‡ƒytmf^ULA6+ ÿÿôÿêÿáÿØÿÏÿÇÿÀÿ¹ÿ³ÿ¯ÿ«ÿ©ÿ§ÿ¦ÿ¥ÿ¤ÿ£ÿ¢ÿ¡ÿ ÿŸÿŸÿžÿŸÿŸÿ ÿ¢ÿ£ÿ¦ÿ¨ÿ«ÿ¯ÿ²ÿ¶ÿºÿ¾ÿÂÿÆÿËÿÐÿÕÿÜÿãÿêÿòÿûÿ )4?JU_iry„‡‰Š‰ˆ†ƒzunh`XPF<1%úÿïÿæÿÜÿÔÿÌÿÄÿ½ÿ·ÿ²ÿ¯ÿ¬ÿªÿ©ÿ©ÿ¨ÿ¨ÿ¨ÿ¨ÿ§ÿ§ÿ§ÿ§ÿ§ÿ¨ÿ¨ÿªÿ«ÿ­ÿ¯ÿ²ÿ´ÿ¸ÿ»ÿ¿ÿÂÿÆÿÉÿÍÿÑÿÖÿÛÿáÿçÿîÿõÿýÿ )3=HR\emtz~€‚‚‚€~zvqle_WOG=3(ýÿóÿéÿàÿ×ÿÏÿÈÿÁÿºÿµÿ±ÿ­ÿ«ÿªÿªÿªÿªÿ«ÿ«ÿ«ÿ¬ÿ¬ÿ¬ÿ­ÿ­ÿ®ÿ¯ÿ±ÿ²ÿ´ÿ¶ÿ¹ÿ»ÿ¾ÿÂÿÅÿÉÿÌÿÐÿÓÿ×ÿÜÿáÿæÿíÿôÿûÿ $-7AKU^gnuz~€|xtoib[TKB9.$ øÿîÿäÿÚÿÒÿÊÿÂÿ¼ÿ¶ÿ°ÿ¬ÿ©ÿ§ÿ¦ÿ¦ÿ¦ÿ§ÿ¨ÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ¯ÿ°ÿ²ÿ´ÿ¶ÿ¸ÿ»ÿ¾ÿÁÿÄÿÈÿËÿÎÿÒÿÖÿÚÿÞÿãÿéÿïÿöÿýÿ %.7AKT]fmsx|~€€}{wsnhaZRJA7-" ÷ÿìÿâÿÙÿÐÿÈÿÁÿ»ÿµÿ°ÿ¬ÿ©ÿ§ÿ¦ÿ¦ÿ§ÿ¨ÿ©ÿªÿ«ÿ­ÿ®ÿ¯ÿ±ÿ²ÿ´ÿ¶ÿ¸ÿºÿ¼ÿ¿ÿÁÿÄÿÇÿÊÿÎÿÑÿÔÿ×ÿÛÿßÿãÿçÿíÿòÿùÿ &.7@IR[ciotx{|||zwtpjd^VOF=3)ýÿòÿçÿÝÿÔÿËÿÃÿ¼ÿ¶ÿ°ÿ«ÿ§ÿ¥ÿ£ÿ¢ÿ¢ÿ£ÿ¤ÿ¦ÿ§ÿ©ÿ«ÿ­ÿ®ÿ°ÿ²ÿ´ÿ¶ÿ¹ÿ»ÿ¾ÿÁÿÃÿÆÿÉÿÍÿÐÿÔÿ×ÿÚÿÞÿâÿæÿëÿðÿöÿýÿ "+3<ENW_gnty|€€}{wrlf^VNE;0%÷ÿìÿáÿ×ÿÍÿÅÿ½ÿ¶ÿ°ÿªÿ¦ÿ¢ÿ ÿžÿžÿžÿ ÿ¡ÿ£ÿ¥ÿ§ÿªÿ¬ÿ®ÿ±ÿ³ÿ¶ÿ¸ÿ»ÿ¾ÿÁÿÄÿÇÿÊÿÍÿÐÿÔÿ×ÿÚÿÞÿáÿåÿéÿîÿóÿùÿ %-6?GPYahoty|€€~|yupjc[SJA6,  þÿòÿçÿÜÿÒÿÈÿÀÿ¸ÿ²ÿ¬ÿ§ÿ£ÿ ÿžÿÿÿžÿ ÿ¢ÿ¤ÿ§ÿ©ÿ¬ÿ¯ÿ²ÿ´ÿ·ÿºÿ½ÿ¿ÿÂÿÅÿÈÿËÿÍÿÐÿÓÿ×ÿÚÿÝÿàÿãÿçÿëÿðÿõÿûÿ'09AJS\dkrw|‚ƒ‚~{vqkc[SI?5)úÿîÿâÿ×ÿÍÿÄÿ»ÿ´ÿ­ÿ§ÿ£ÿŸÿœÿšÿšÿšÿ›ÿÿŸÿ¡ÿ¤ÿ§ÿªÿ­ÿ°ÿ³ÿ¶ÿ¹ÿ»ÿ¾ÿÁÿÄÿÇÿÊÿÍÿÐÿÓÿÖÿÙÿÝÿàÿãÿçÿìÿñÿöÿüÿ "+4<ENW_gou{‚„…„ƒ€|wrkd[SI?4)ùÿíÿâÿ×ÿÍÿÃÿ»ÿ´ÿ­ÿ¨ÿ£ÿ ÿÿ›ÿšÿ›ÿœÿžÿ ÿ¢ÿ¥ÿ¨ÿ«ÿ®ÿ°ÿ³ÿµÿ¸ÿºÿ½ÿ¿ÿÂÿÅÿÇÿÊÿÍÿÐÿÓÿ×ÿÚÿÝÿáÿåÿéÿïÿôÿûÿ"+4=FOX`hpv|€ƒ…†…ƒ€|wqkc[RH>3'÷ÿëÿàÿÕÿËÿÁÿ¹ÿ²ÿ¬ÿ¦ÿ¢ÿžÿœÿsonic-visualiser-3.0.3/samples/piano.wav0000644000000000000000000024002413111512442016427 0ustar 00000000000000RIFF @WAVEfmt D¬ˆXdataè?(ØÿÿþýTüûû²û(û?úùå÷ÄöÂõòôpôAôBô9ôô¿ó®óô¼ô€õòõÕõ6õYô—ó*óóDólónóJóóýòó/óló®óãóåóuóYòˆðQîbìë,ì@îýð_ó¯ôÔô>ô„óóó©óöôïö0ùýú˜û¶úÄø»ö©õ;ö~øûûõÿ¬‡"U8#­ƒ<ÿ3ÿhŠ-x£Ìbñî¡ Z Ë l Ð sª­”†ûþ¯þQ , D€[@ å,ýqõœðUïçðÊóö¡øVúuüpÿl ê Ô »>L$Z(›+–.Ó1¡5ò9T>ûAðCjC@V:ï2ý*#}6¶‡åü(+3 Ä}Ôþëûùc÷&õÞòÇðï™íµëŠèãÝ=ÖÅÐñÍûÍñÏDÒÓÓçЛÍÊ}ÇÜÆÉîÍ•Ô+ÛÎßPá›ßÛÃÖrÒªÏæÎ!ÐãÒXÖqÙ5ÛÛLÙ°Ö’Ô!ÔðÕ·ÙvÞÛâÆå¨æ¨å{ãádßß•àøãìè¤îùóÄ÷Fùkø³õçñßíuêè éjì~òAú'«Ú —”ü tc6ôÁ05ÝÎl; Yç Ðäé'Í0_3³.b$·B  ØtÎ =8¨ÉÓ ø`Àý"ýþÁÿº›FÔ‘ô rNc/ ú&-25¢7Ò8ò9<<Ü@WH R7\«dŸiVjg­`ÿWïMˆC:ê2¨. -ï,À,(+r'«!‰8 \ «Å jŸPÕâý†ó!ë@æ%åÌæzéhëMë’èCãëÛÓHË¿ÄÁ­ÀÔÂüÅmÈ É¾Ç1Åq‚À4ÀÂñÅDË›ÐLÔÕ„ÒjÍFÇáÁȾí¾~ÂßÈÎгØÿÞ…â¹â¾ßYÚàÓÎÅÊmËdЌ؆á‘è¼ë¦êjæÖà{ÛB×’ÔÉÓqÕüÙCáêmò øžù•÷EôóêöÓNë²+«2½2³,¬"R8 m+³I rO )-/¦10œ*"Ù°ÎÃÞ¥„>ú - ¬ôCB FhRˆþ;ùóïbììÙí.ñiõçùþpº ÷`I …‚>"F/¼=SLTYçb¢g7gÐb¾\zWzT”SPSÚQòMUG‰>~4V*X!Å£FÌo Ó W!ëÌ îHûgöKórñðaîÜë`è%ä¡ßfÛó×}ÕÅÓÒ ÏÛËìÆ€Áh¼+¸ô´Ó²²ò²ÓµCº¿ÈÂÜÃÎÁW½V¸ µ}µÔ¹ÁÉ?ИÕ4ÙhÛÜŽÚPÖÇÏÀÈÛÃVÃÔÇóÏÓØZßháŠÞø×ЄɊÆÈsÍ–ÔæÚVÞ&ÞóÚ9Ö½Ñ.ÏýÏ7Õ5ßJíÁýBr“&Ò+J,Ï(±"íD‰"L)z-‹-Ô)è#ÓDñSNÒéúU y V%pSŸ‹ÿ‹üù"öIõJ÷Ûû¥×â  …’Ùÿþuÿ• ã#c/…9ÝA”HKNÌS»Y9`»f1loo¨o¥l»f”^ U"K B×:6»3Ð2=21ë.ï+´(í%$Û"Ã!Ú§psÀ w èû}©÷% :ç¾ùãîçä–ÝiÙË×Ã×vØOÙÓÙ†Ùã×oÔé΀Ç¿:·ù±þ°Ý´ª¼8ÆæÎ‰ÔÖ ÔÄÏVË‘È~ÈË‘Ï|ÔyØkÚ¶ÙeÖCѽ˂ÇêÅnÇxË»ÐÒÕÆÙ'ܸÜÛÆÖìÏËÇÚÀé½ÝÀÔÉ,×cæ õS/ 1¡’³ Å × áäîÞä½Û+62–n4Òž·‡ =àÈië×…}š B|´ü'úRúÀüP¾œk×­ÿæüVûfûýëÿµ™ îéû<ù%ß0J>DLZXÄ`*e}f fd±a]œV O²GAÅ<–84–.º(±#ß !¸#G'Š)Ð(¨$ÿ‹ýc  ›¢ ‰ Ì ÷š-j úþô ëåJãAå6éÉìáí<ë’ärÚ4ÎíÁ¸ã²³V·+½›ÁÞÂìÀ½¹ìµ]´u´7¶˜¹G¾~ÃÈÊ/ÊÃÆÁ¨º=µf²³—·3¿‰È’ÑØ1Ú.×ÃÏƤ¼òµ ³³³ã¶»wÁ‚ÈÅÐÅÙ˜âUê”ð€õ‹ùýOWF" ¼ À ýŸ7l¤Ívöœ Ö!^!uÿI‚H"°&Â)¨*|)î&¯# eó‹óPË×»¼£(ñÅ¢¯ÿÀ† $ 6 Ö à†€y'4¡@¥K€TX[Ç`yeÈi‚mâoÀol dÌSÅú½¸ µ|µ&¹5¿‡ÆõÍkÔöØßÚßÙ@ÖÓШʷį¿¼ºº=¼ÀÄþÈõÌÜЛÕâÛã“ë€ò6÷iù±ù.ùýøÍù¸ûgþv²& U ¢ ™ ÷§çw 5«G1L³ÛÆToõœÿÇǦ 7 ô ›ì÷ÿã Ò7 ¯ ÿó˜³#+Ó4?UK¯W†c§muny¦zýxtOm€c&X9MEŽA¦BF†J¢KuHAÚ6u+» YžŸ– wIµä£ p¢w÷ʵNëPýAôbê¶áÜÛeÙšÙÕÚ?Û‹ÙSÕÏÇä¿Y¹µ´³±µaºxÀvÆ*ËùÍÐÎæÍ†ËȳÃ/¿P»5¹õ¹¾ ÅLÍÞÔRÚeÝÜÞ¬ß*àÒßÚÝÚÕAУÌmÊÉ*ȪÇqÈnËßÐê×öÞ{ä¶çïè6éÞéýëðõNûÿÿˆÈ~Ìÿ‰þöýãý#þÛþvRf Z5(ˆb÷ zNVÆBŸPÑ‘îþ=‰ž Ë!c!r 㸽‡8CÛ S - ¯ s ² &Ë&ñ4LFXðgzs5yáx–s~k,cÓ\šYUYÅZ8\@\%ZâUÒOVHÌ?È6M.²'$È#û% ) +Ë*m'N!€T ã²7 8)‚!. £–øÚòð¤ïÌïïÏì7éÀäßÙ>ÑmÈÀ8º ¸¡¹É½ËÂJÇʰ̌ÍÍË‘Ç×»½M¹”¶&¶æ·»±¾ ÂrÅ<ÉÎÓâØvÜõÜÔÙ“ÓËØÃø½íººÝ»Š½³¾6¿x¿î¿±ÀŽÁn½ÃZÆˤÑ#ÙÓßXäDææ»äýâxáÇà–áQä¡èMí»ðÛñ×ðï:î¶ï§óù‡þ}F ›àpÿ]þmýwüŸûRûüáýÐl?Ñ ¶‘@¹#°ÎþŒBˆý·ôïUîóý% ž­,Î<íJQV~^Mc-e?e eÙehLkZn:pBp"n²iêb3Z°P0H€B|@qA\CðCºA¹<6D/P)‰$Æ Ð­’ ŽsGØñþ Oq_®ÿšþéü>úö¤ïýæÜÑLÇn¿ñººF¼À˜Ã¿Å.ÆÅ%Å\ÅÖÅ`ÅæÂM¾¦¸³Z°¯±´þ¹óÀÒÈxФÖvÚÄÛÛïØCÖŠÓ-ÑxϜΖÎÏpÏàÎÙÌÉàÅœÃ7ÄKÈ"Ï×Þ=ã]æNè ê*ì¡îñ_óZõ÷vøeùëùXúûRü×ýBÿq¸´Öû bñ˜°D4 «%|n É  D «  Å– 8$+600÷+#”ƒ ©Tøpó´ò•ö ÿC ½'¶3M<ÊAÓE£JÝQ§[žf¯p'xb|®}¶|zôuqlh½e&e’eÙeÞdöa ]œVŒOîH¤C@¸=ã;Æ957¢4“2ÿ0/Ý+Ó&¨ å Æ“-6¼pu ª/ÿ¯öQí~ãáÙ9Ñ$ÊÅGÂéÁÕÃoÇ‹ËµÎ³Ï Î$ÊòÄV¿Â¹P´@¯Z«Æ©a«°o¶·¼[ÁÚ÷ÄýĪÅSÇÊQÍOÐïÑ^ÑuÎÖɰÄ5À-½Ò»æ»é¼H¾Š¿†À‡Á2Ã,Æ£Ê ÐHÕ\ÙëÛ}Ýßoá‹äŸç§éê'é«ç æÃægè{ë¦ïUôØøüÉþqÿ¦þýû)û7ü5þãÿøÿíýFú,ö£òüï îÃìÒìyïÆõ¦ÿ† ¼Š"!`£ èÿõ…ìçÝäcåè2ìpñG÷2ýÜ}Ž"¼/‚=JÏS„Zž^amb3cFc™bpay`y`Èaßcmeêdja"[TS±K›E°AÑ?g?­?È?Ø>€EPLþRY$^®a¸cdËd{d¥c1b6`ý]Á[ˆY.WµTRQÌPéPþOeLHEO;‡0„'M"£!ñ$Ò*£1å7e%= 9Ø22+ #ýJò ëQþ‡øô2ñ°ï®î"ítêÝæ@ã†àýÞާܫ٬ÔÎàÆtÀð»æ¹+ºñ»/¾"À¢ÁÃ,ÅÿÇ4ËÎ&ÐŒÑÞÒ‡Ô>Ö×ÍÕAÒÍ”Ç ÃÀ¡¾W¾ù¾ŒÀ*ûƾÊ_λÐUÑ`ÐËÎãÍÂÎÑÑ¢Ö"Üá9äå†ãàÀÛØ€ÖØ Ý©ä±íÒöÿÁY 2 ± ¸þ)õíYçÍäSåèþë÷ïvóŒöÍùÝýõµOø3È…3ò ºöOî»çgã]á‹áàã"è¸í·óCùþ¶6¼,#„-–6ß=±CðH…NÍTT[ aËdøeÂdúa°^Ø[)ZZÑ[Î^èaƒc,bO]vUL‚B:33.‡*ý(¥)ƒ,'1ž6 ;Ù>@?o<Ý6Ê/¿(Ö"*ת>œþXøôkñÂï]îðì}ëêMèÄåÚáVÜÕ¤ÎÈÄfÁÒ¿™¾B½Þ»Úºœº4»h¼þ½ÀÇÂŒÆ'ËÜÏÓwÕïÔÒMÍwÇžÁ½àº±» ¿‡ÃkÇTÉÎÈ`Æ=ÃÃÀ À ÁZÅ‚ÊÐYÕ¯ÙèÜÊÞùÞÝKÙZÔÒÏkÍTÎÅÒÚãâ$ìØôIüÜ¿,Wý’ùþõŠò#ïïëPéÄç¨çéÌëï4ôÒùžu‚C(¡Ì. Öÿšù<ô ïoêÝæ¯ää#åæç+ìkñÙö½ûäÿÓ–=R•#0.<‹FòMþQ>SS×R·SÆUpX[O]—_Zb©eÕhjiàdü\ SI“@]:w6\4‡3Í3E5ã7,;>>>@Ð@=@?Ù=6<Ž9@56/( vHÕ •<„þDÿýUúóöÚò î½è\ãkÞIÚ ×pÔ ÒOÏà˾Ç~Ã=ÀC¿kÁœÆ¯ÍÙÔbÚSÝ©ÝÜ^Ù=ÖÓiМÎ0ÎFÏzÑåÓuÕMÕ"ÓUÏßÊ ÇŬÅɸÎâÕjÝä^èˆé[çµâ2Ý}ØžÕ»ÔjÕI×bÚßWåßì”ôSûjÜ0ô[ & Ô õV!ÿäø…ò&íÜéRéžë@ðiö9ýï A¤^„Ã_v‰å¾Éü¦õ=ñwïNïWïmî9ìXéóææKçHêœîôû])'©0Ç6©9s: :\;I=¡@mEŠK‰R™Y±_Üc‹e§d‹aÒ\.WáÊçOï÷ºýYÍ=ÿ¢ú>öÂòðDíÔéÜå„âpáÔã»éüñÝúãJ ð ô_ ;ò Ïšoýíú§ø öªòdîéƒäà†Ü¤ÚêÚ×Ý¡ãøëÿõ|4 EW_|!¯#É&h+¶1Q9mA3IPËUpZü]G` a`2]àX©SLNeI'EQA}=“96454Ì6þ:`?™BãC3Cô@¯=Ô9Ç5ô1À.P,T*(Ë$ Gp÷ é-}v _ú¶ÿ úðñèÓÝìÔÉÎÌ"ÌüÍ9ÐÙÑmÒøÑÁÐ,ϩ̗̮ͫÍúÏGÓ(×øÚìÝ:ßOÞÛòÕâÏÊcÅ»Âv§ÄüȧÎpÔÙãÛùÜ@ݾÝÛÞàhàÞÞbÛ×Ö¹ÒoпЉÓØ&ÝCâ7çRìûñGøÑþäÅ ÷ Bš  ËUúPôÙï¶í*îþðµõ¾ûw+ AL!VpÌŽ˜~ŸU- Qÿ öî°æÅáêßámäõèÑíÀòö÷¯ý¿ 3€Ô7Æ$>&s.þ6A?áF±M™SŠX{\e_2a®a`Ž]XÑQ J_B< 8˜6+7Í8:ç;º<=ý IúÓ ¾È.ûˆòÉé â(Ü]ØYÖwÕՔԖӬюÎMʉÅmÁ`¿vÀèÄÆË5ÓÙÃÛèÚWצÒSÎ#ËúÈ7ÇNÅ8ÃrÁ¯ÀnÁÅÃmÇòËÐÐyÕRÙÌ۔ܶۙÙÐÖäÓ7ÑÏnÍ}Ì:Ì·ÌβШÔÚ´à>è5ð øÿŽ Ò.S>ú÷óVîê’ç{çþéÊîáôÕúUÿÍ£õût^ ´f§8 8  Ÿöù¢ñšê{åuâjáâ+ä:ç²êøí«ðáò õø üç à $0›'%I.i8BñK˜SYJ\J]?\OY¹TO IÒC@>=c<1;M97â43=3-4(6Ñ8;ã=ó>;>p;µ6Ÿ0*í#Òï&GG;2 Aÿ…öðQìÌêDêcé3ç[ãÞØïÑ•ÌxÈ×Å¿Ä!ÅÛÆ±ÉIÍ(ÑÏÔÈ×­Ù&ÚøØ$Ö ÒeÍÉõÅ@ÄèÞÄÆ@ÈËOÎÅÑ ÕÞ×IÚoÜTÞ®ßúßÄÞöÛù׎ӋϑÌòʾÊúËÌΉÓtÚlãœí™÷Èÿÿë YÌÿü¼øúõô$óó‘óPô'õ*ö‹÷aùšû þ«¿³Ô “a+#õ#Z!¹á -žý6ø¥ó©ïMìÒérè)è±è¶éë¤ì¸îQñEô6÷ºù¥û?ýDÿ±\˜²&j2=÷EœLÝPÌRÉRŠQôO½NNNM¸K¦H(D÷>:3632u1Œ1–2Ø4Y8›<’@æBpBº>I8{0 )g#S ¯¶ S"s#?#A!}oè † ;}ËÔýú÷}óˆï÷ê¥å¨ß\Ù?ÓÔ͋ɶƊÅÆcÈ̘ÐÕ‡ØÚ•ÙS×6ÔуÎ\Ì]ÊXÈ€ÆJÅÅýÅ¢Ç ÉÆË6ÎBÑÕ„ÙûݲáÜãØãSáhÜ´ÕPΞÇïÂ5ÁÌÂqÇ]Î}ÖÂÞbæí¬òu÷Sûüýÿ¯þ!ýJûþù®ù.úÕúäúéùøÉõ$ôÔó=õTø¿ü z,¯K!5%ç&a&$¨ oƒÜŸ <NÿRúöÒó8ò®ñ-ò€ó(õrö±ö™õtóñÆïyðÃó|ùòH ä—}#£,¾5+>7E€J,NÃPØR°TV®VÎUSXNèGƒ@X9Å3é0@1p4c9¤>ÎBïD²DbB°>j:<6Š2‰/Q-ò+Z+<++?*u(¼%r"ýŠHræ  :Þ*4pýëö9ï,çŒßèØŒÓŒÏåÌËŠËÇÌÏçÑ´ÔÚÖ÷×ø××hÕuÓ~ÑÅÏiÎGÍùËÊgÇVÄÊÁëÀ¡Â)ÇñÍÀÕ#ÝÔâ æŽæ¡äÅàƒÛWÕÄÎxÈeÃ’ÀµÀÜÃNÉåχ֔Üêá¨æâêˆî…ñëóùõò÷éùŸûŸüsüèú.øÍôvñÎîHíí?îµðbôù‡þ:» Ço÷†Ì ë#Ê$"býÚ n¸ýDû¶ú¯úúáù‚øöÿó+ñ,î=ë¸èçÏæIè²ëöð¸÷WÿOÐïg!ó(Ò1‰;EMšRNU'UnR›MZGœ@€: 6È3±3.5k7¦9f;€<ý<ët<ü;£<>?¶@A£@t?×=&<º:Ñ9v9r9f99-87À5O4f2œ/Ã+.'²"QÅ%Ìš!_"C!ÝqZ ÖüÞõ_ï–é ä\àwÜ­Ø ÕÒ<ÐЕÑ*Ô)×øÙ4Ü—ÝÖݘܛÙëÔÏºÈ Ã&¿r½?¾\ÁNÆsÌ!Ó°Ùw߯ãæâåã¾ßrە׫ԭÒ@ÑüϬÎeÍwÌOÌYÍåÏÿÓXÙQß1åmêÛî­ò5ö£ùÕü\ÿ²užþŠûâ÷SôZñ!ï£íâì"íáîòxø t¢¤ÕØŠ йÚ*!ˆ™NÉ‘¹ ƃ´üØøöÿóWò¯ðÌî–ìê[çÎäõâ‡â+äQèï;øZȦÛ(D3÷:”?bA:A,@!?–>Š>­>>->z=Ñ…@AHAÛ?ž=;ú8²7y72894;Ã<è=_>>éòÒùï° yÈÓˆ"&ž),-¸0 4Ô6¿8¶9ï9Ñ9¿9õ9|:B;5¯?À@aA&Až?<ß7Q2Î,l(&è%ã'T+q/†37Û9Æ;Ï<Ü<³;9‡4;.e&_y i¥ü„÷)ôjò×ñÚñïñ»ññ‡ïíxééäáßÛ ×Ô¾ÑÍϵÍ,Ë*ÈèÄàÁ²¿¿BÀ‰Ã{ÈhÎxÔåÙÞ°à‚á‰àæÝÞÙäÔŠÏÊtÆñÃ1ÃÄöÅxÈ/ËÎHÑÿÔ=ÙâÝÃâ·ç‘ìñ–ô´öàöéôñéë’æ)â«ß¤ß âJæëñ/ö¼úŠþ‰¶@ÎY;Ž x i*-¸)#!%‹%Ž$m"zö™„“»0úhò ëÏä]à"Þ0Þ8à¤ãÒçKìàð–õ„ú«ÿì! +Àcî!C&"*2-/Ã/^/›.b.u/26t:>šA"CèBé@e=æ8!4½/",j)…'d&&Ú&º(±+€/Â38À;…>Ø?O?ž<¬7¦0(–Cþ yùJÿÝýôüÞûúp÷ôHðÉìêè¢æ*åã*à[ÜÝ×ãÒ™Í9È#ÃÞ¾ü»òºõ»î¾zÃùȧÎÉÓÔ׃ÚÉÛºÛpÚ Ø×ÔCÑèÍ=ËjÉ6È;Ç2Æ0ÅÄÅÐÆ4Ê ÏTÕ\Ü™ãGê¤ïóqô½ómñ!îˆê?ç¹ä5ãÔâ©ãÁåé{íyòt÷Îûÿ Ö¿@ìOÌx " %Í ðÛ È#’&á(2*ò)µ'r#µt¾sù‰ò‡ìÿçIåbäóä}æ‰èÃêí•ï”òlöcûy²q ‰"Æ#`$ÿ$(&(Ò* .Î1¯5’95==@KB$C¹B#AŒ>;7Ã2›.+?(s&¿%X&€([,¶1í7>ùBÜE.FàCP?19V2+(%{ôÒ] ²Î¯þ ú"÷¤ôDó¶òdò®ñðbíséSä,ÞL×0ÐvÉÑÃè¿,¾µ¾2ÁøÄ;ÉIÍ«Ð3ÓçÔíÕ}ÖÙÖ2׊פ××fÕrÒfÎÍÉcÅÝÁÍ¿‘¿LÁâÄñÉéÏ5ÖaÜ)âYç¬ëÁî9ððïîë¬çbäâáºàLá¦ã_ç´ëÆïòò õJö/÷+øuùû±üLþÍÿMý Œ| Ë opÔŠT#Ä'Z+›-!.¥,)d#9Rš ÄOû÷óï_ëè¤åOäpä;æ¯é„îDôjú‹Z¢ 8ùLA0a"'%È(Ä,ß0×4€8Ð;Ü>¤AìC2EâD™Ba>¼8{2…,§'z$N#2$ó&++O0¶5­:>í@¦Aì@?’ðY’ ê΢þ¢ûáùEùù<úžúèùz÷óëì“åÉÝIּϧÊNÇ¢Å=Å’Å&ÆÇƎǺÈyÊÒÌÏšÒ{Õë×ÙÚ1ÙíÖ{ÓCÏÉÊ‚ÆËÂà¿ø½W½Q¾8Á#ƾÌ:Ô}Û{á‘å­ç+è˜çmæå¢ã‹âöáûá‰âãÇäfæcè¨êùìïÃð)ò~óþôºö’øHú¡û†üý—ý•þš& „„R)#‚'#* +m*“(Ô%~"¹¼\u >úýß÷òéìèkåÖãäñåVé²íjòõö û¶þ4Æ} + ‹sóLͱ !9%*Î/6b<ìAçEÉGdGÝD›@.;K5»/2+-(Ø&'±(O+›.32­5°8 ;º<Ø={>£>C>D=•;%9Ü5˜1E,ó%î¿• ºœô.•†Žnÿzúçôºî}è°âŽÝúبÔfÐWÌñȯÆÍÅ ÆBÇÑÈŸÊ´Ì*ÏÒ Õò×>ÚfÛéÚ{Ø$Ô`Îȃ½êºŒºH¼µ¿AÄTÉmÎ.Óc×éÚ£Ýyßqà·à à…àžàòà`áÆáâNâ¡â?ã`ä6æÎèùëSïZò™ôÌõôõPõNôxóTóAô[ö~ùgýÛÅ Çi‚ ‰#m%—&@'`'³&ë$Õ!tî{ Ibü2öñçìãéåçææãæØç»éìð9ô¦øéü•eT¢¸  P¾;r%ê, 4?:ñ>¼AzBNA”>Ä:T6µ1_-Ø) 'ý&Ë'…)†+Z-ò.0{2ß4¨7¨:«=x@µBÛCRC°@ø;§5–.¯'«!âS·³ø\Õbô X F wÆ7þùøNó„íäç§âßÝyÙFÕ/ÑUÍÊȨÇúÈÝËÝÏbÔÈØpÜÙÞ«ßÄÞ8Ü?Ø8Ó¤Í*È€ÃCÀо*¿ÁúÉÇLËæÎÒÀÔ×.Ù…ÛÞàMâãŠâ@áÃß­Þ]ÞòÞ\àyâåè"ëÿí`ðò¾òŠò™ñRð3ï°îïdðò”õù ý6‰û šqqeó!±%?([)ð('$ ‡…  ˜ôý˜÷öñ\íëé»çñæ´çýémíUñòô¾÷—ù®úUûØûnüYýñþ¤Ê‚ ™•Ð"¥*†1 7ë:=h==<í97'4Ã10¼.…- ,A*|(F'&'q(4+9/4/9Ý=A¸ChD¸CåA#?“;S7’2›-Æ(o$Ù 'K鎬8`]M £¸Pün÷ò&ìºåßsØ¥ÒÎ&ËÙÉ(ÊûË"ÏCÓÅ×áÛÉÞáßëÞÜû×WÓáÎ ËíÇrÅqÃéÁþÀåÀÁÁŠÃÆ2ɨÌMÐíÓK×&ÚHÜÝøÝ”Ý“ÜHÛ#Ú•ÙñÙV۪ݰàäzçjêwìeíRí®ììÙëì•ìíGí—íDî™ïºñ§ôXøÅüß}Q ñú1Š "$g%ø%%¼#‚ ã#šŸ‚žúkôtï.ìÂêùêRìBîVðCòÍó¼ôáô;ôóÞñNñýñ^ô¤ø±þ6D î#!)g-14Ä6Û8$:X:?9Õ6f3‰/î+)K'i&P&õ&x(+—.ø2°76< @ÇB'D D‚BÈ?C;?ð?¼?3>O;x7O3c/ ,`)n'D&ë%P&)'ú'8(h';%!v#íAÿ:øˆñ¢ë˜æcâøÞR܉ÚÈÙ4Ú¹ÛôÝAàñá‹âæáàSÝÄÙÕ-ÑÞÌ#ÉTÆ–ÄÛÃýÃÒÄ8ÆÈFÊ©ÌÏDÑÓQÔêÔðÔŽÔÔ€Ó=ÓiÓ2ÔµÕéבÚPÝÔßþáãã¤åCçèCéCé°èáç8çðæçmçÏçèþçÙçñçËèñêÆî`ô†û¿g ÆÅ!U%Ã&b&·$C"TXk|Ü Î i‘…ÑÕþüEúÞ÷cõÄòðQíë£éGéøéëëíñKõúÒÔFäiu%}+×/2Ú1¼/i,Ê(«%Š#†"t"ÿ"Õ#Å$Ì%'Œ(w*Ë,…/Ÿ2ú5P97<>>?¶>:=Ø:¿74J0¼,*(j(F)•*Æ+m,V,w+Û)Š'‚$° ÿbêÄ:ùDòŽëäå¯á.ß\ÞãÞ>àâálãœä@å%åäâ2ßÏÛ7ØžÔѯ͚Ê&È«Æ`ÆBÇÉoËçÍÐÇÑäÒŒÓæÓ ÔûÓÓòÒ'Ò’ÑÑQÒàÓ ÖšØGÛÖÝ à¿áÛâ€ãõãäŒåïæzè¼é4ê€éŽç¹äµáVßIÞßÞáÆäÄéôï$÷íþ¯È Å€ ƒí= n¦.\}À> k  ¸X¥m¢ÿnü&ù'öómñLïýìŽêmè>çœçåé,îCôÏûI E\ç!Ó%T(º)L*>*²)È(§'&z%·$?$$ì#ý#e${%œ'ï*A/ 4œ8c<?[@d@2?ù<:7|4{210Y/Ã.m.p.Í.d/ý/T0'01/4-*{%ª³ã­£Tù(óEî™êôç7æ\ådå0ænçžè@é÷èžçHå(â‡Þ°ÚæÖ\Ó6Д͛ËqÊ(ʯÊÖË`ÍÏùÐÇÒ@ÔÕ¼ÔxÓªÑÐ1ÏkωÐÒÓ¼Ô“Õ<ÖìÖÔ×ÙÕÚ Ý³ß˜âsåäç‰éêpé½çVå¦â àÍÝ'ÜeÛâÛäÝxá\æìTò¿øLÿçS %ä9˜0A$êbwAô Ë ö ‹vnû ÿ^úõ¸ïëçhå™äYåØç'ì òúøRx ×Ö| J#‰%E'u()Ì(Ï'&ú#É! >·…!t$#(.,G064Â7ª:®<­=·==æ;:à87ý4å2ø0z/¨.¦.j/¸0(2E3º3a3;2A0O-/)¿#$Ä&ºÈÿzùÿóœïìäêgê¡êë4ëùê\êpé9è“æDäáÝsØÕÓÛÏÍ~Ë)˳ËÂÌÎ8ÏÐQÐ÷Ï;φÎ9ÎxÎÏÄÏ)Ð%ÐÍÏMÏÓ΂ÎxÎÝÎÚÏ–Ñ!Ôg×&ÛóÞSâÛäRæÄæjæƒå/ämâ9à­ÝÛÔØY×üÖ Ø¹Ú%ß!å&ìjó&úßÿŽˆ: æ»:³ Wá2±›üÆÃ˜Ï à¾ïúÔôéîÁéòåæã°ãå—çßê°îþòÕ÷9ýR ž©‰Ô"è$Ñ%¦%‰$´"Ž _¸Á ã"‰%Ö(À,û05Ž8$;º<[=$=4<®:¼8—6‹4ä2Ù1r1Š1é1j234€57'828®63á.:)ç"*;WÇÍ—ü8ø¿ô9òµð*ðaðöðcñ$ñÖïUíÉéšåPáaÝ ÚQ×Õ1ӷѶÐ,ÐõÏÓÏÏZÏ9ÏoÏ ÐõÐêѳÒ"ÓÓ“Ò†ÑÐÎtÍþÌnͽαÐÓpÕòמڞÝþàƒä¦ç¹é+êÐèñå0âIÞÔÚ5ئÖIÖ#×ÙñÛaß<ãçCìšñm÷}ýz 'nÇ 4P˜a$ð¦Ô`EÕR1 ô„ÿ(ú7õýð¢í$ëlémè7èéë§î®óÕùŽ>v Ýö+J!B"B"©!Ô ô €È>ì ‘$¼(ü,û0€4l7±9D;"ª?Ì>b<¢8¾3ã-G'M }da‡ ™,ÔL‹ýÇúNøböõöóÂòöðNîÈê¡æ7â÷ÝGÚo×…Õ`Ô¡ÓâÒæÑ¹ÐªÏÏUÏVÐÛÑtÓ¢ÔýÔRÔ¬ÒPÐÍñÊšÈãÆ!ƳÆÒÈfÌêДեٷÜÑÞAàYá:âÐâôââ—áàޜ۴ةÕöÒ:ÑÑÁÒiÖ§ÛÜáVè…îôùø(ý©„ÕØÜ  „ø3°0µ:“ËAÀ1•Ü QÀqû”öCò†îfëþèçiçâè ìðöìûŸö× (¿r3Y ÊŽ»À¡13x"å%p) -0¶316³78}7*6ƒ4×2K1ì/Ï.1.p.á/˜2Q6z:^>VAæBÒB"A>6:ê51>-Ö("$ŽÎX øÉ“ÑÙ(–ýdú ÷æóñYî|ëXèþä£áqÞvÛ«ØÖÏÓ!ÒQчѫÒcÔ$Ög×Í×<×ÏÕ¿Ó@уÎÈËoÉæÇ‚ÇKÈøÉÌ?Î\ЉÒûÔÌ׿ÚÞáwã.åêåxåÆãðàJÝPÙ”Õ£ÒíбÐëÑfÔË×ÊÛ#à©ä3é—í¸ñõ.ù©üøÿöz‚H - † f›Êš×phlj§´}dw ÝÝÒû'ö@ñjíÇêPéèè|éëòíò-÷äüˆ‹¢ Í/뢰^árFeÚàaL£ j$(Ô,Ç0é3Ñ5D6E530-š*y)÷)ò+Ü.ÿ1Ê47â8¨:•<—>O@4AÉ@Ó>q;7 2Ý,¹'º"ÎDiÿ£  *¸Ÿþ¤ü‚úø8õ÷ñDîêåÛàhÜ«Ø Ö¼Ô±Ô˜ÕïÖ-ØéØ÷ØbØT×ùÕpÔÓÒ>ÑÊÏ}ÎCÍûËšÊIÉ`ÈFÈ>ÉQËVÎ Ò#ÖXÚOÞ¡áëãìäšä!ã×àÞAÛƒØÖÛÓ*Ò&ÑÑ*ÒvÔË×ÌÛàNäJèìë&ïøñ€ôûö±ùÌü8°å´ > Í¢Ï)YÙ® u ;8}ô Øÿ‹ù)ôŸïì^éÑççˆèâêcîÃò§÷©übq–Æ *  É |!‚^ši Z :  ?`N"¾&!*H,u-ã-³-ý,ï+Ð*æ)[)4)g)õ)ü*¨,/I2ù5½9=™?ô@A@>X;è7ö3¾/‰+•'ò#€ U…Ís¥ i §4ØI2Fþcú¨õoð9ë€æ âÀßÕݬÜÜœÛMÛÛ®ÚLÚÓÙ@Ù¡Ø Ø{×ÍÖ·ÕöÓ|Ñ†ÎŠË ÉcÇÊÆMÇèȆËòÎÔÒÄÖdÚ‚ÝàâtãäØã‚âàîÜeÙÖ’Ó/ÒýÑÂÒ%ÔÜÕÎ× Ú®Ü°ßðâ8æaé_ì>ïòæôÂ÷¨ú™ýš±ëY ïïÌ> â!¬"?"˜ ÙB] ÿûøó¶î,ì`ëÏëãì9îÎïàñ¾ô‰øýüo  pžá  Ì 6   " • ¢õcèB"Å%Æ(+d,ô,Ö,0,.+*ù(V(a(G)+Â-1À4m8Ä;>}@¥AüA‘Aƒ@ù>=¿:ë7g4,0m+&""ógZ¨)¢ÇV 1 mDùýÁùµõßñEîìêÞç&åÓâîà}ß~ÞèݶÝÝÝAÞ¥Þ·Þ!޹ܔÚØcÕóҼЧΤÌÌÊjÉÞÈ~Éq˜ΦÒ×&ÛÞá‡â-ãã^âá,ßݾږئÖÕÜÓMÓzÓ_ÔÌÕ‡×jÙ{ÛßÝ«àÂãÔæ„é¡ëBíÌî¾ðzó÷Fûžÿ¯T¿ Wmü”…%"#8"Ê~` ;³þGúßõ–ñÃíàêeéé‘ëÿîjó6øËü¸¾ÌóV(­1ò…CH­ š ,[óûã `$'¨(÷(-(½&<%2$ñ#‘$ú%ø'K*¿,2/š14p6ð8r;Ù=í?cAäA*A?æ;î7´3Ÿ/ê+¡(À%D#'!N…ˆ!EÆ‘ ˆ –ƒçû'÷ òíãè¼å­ãtâ±áá—à,àäߵ߈ß@ß¾Þä݋܌ÚÕ×„ÔæÐm͋ʔȵÇïÇ0ÉWËAÎÆÑ¥ÕÙÝÜOߟàïàªàLààìß\ßÞÂÛøØEÖQÔÓÚÓÕÎÖ›ØCÚ³ÛÝkÞàâ<䓿ÛèòêÓì—îyðÑòùõ-úbÿ?4 ±Sü¹¢Â‘2ð¸y<6Ï…ûÒõñ}í:ë[êÝêžìXïªò'ömù6ügþ D6ëRTðTÐÀiõoÎ ì (Oc „!"."G"h"”"Ç"#N#Â#€$±%n'¿)•,Ú/{3W72;¡>$AMBúAe@>Š;29!75553ô0j.¬+é(N&ü#ó! <0Ëð”»„ ¸jþ)úßõŽñríïéfç÷ålåUåIåå¿äpä0äÍãéâ"áFÞuÚ ÖêÑmÎ ÌÝʧÊË ÌcÍ9Ï¡ÑÔÍ×Û#Þ¨àkâ<ããâžà߻ݧܲ۫Ú|Ù=Ø-×—Ö¸Ö§×UÙ…ÛÝÝøßˆálâÀâÏâã¹ãAå·çëíî'óy÷Îû3ºe šÏ•È* `!!XZ…X A™þ¥ùõiò!ð¡îÙíÌí‹î ð‚ò…õÚøü¸þV¶ôÿ~þðüÛû”û(üwýVÿªf|Î -gYöG\:ÊÛ6 ıl„xˆ®¶"W&I*@.ñ1 5·7Ë9Ž;=l>4?)?'>N<ú9š7~5½352¦0à.×,±*¥(×&6%z#I!mò3Wk /yXýø?ó4ïOì´êDê¨ê]ëÕë ë’êÁèvæüãˆá ߥÜéÙÍÖ`ÓèÏàÌÉÊʤÊzÌÏÒÕ ×ÀÙjÛÄÜÞEß„àzáÈá*á¡ß}Ý8ÛHÙû×r׫׌ØåÙuÛîÜ Þ¬ÞÑÞ¤ÞdÞQÞ¦Þˆßþàñâ9å«ç8êêìâïHó?÷ßû4)z ©\̬kxumé â…ÿ6úuõµñ9ï îî*ï*ñÑó¹öYù2ûþûÏûûúZùùVùûùëúü7ýxþæÿ¹1tu å=çe_àÐ6Ø™—VX"â%“)-Q083æ5d8:f<…=Ï===ù;V:°8K7:6]5}4c3ï1"0. ,2*©(^'&$&!Ìëä -»ü3ùkö@ôòñµï­îýí›íPí¿ìŒëƒé¦æ+ãdߢÛ)Ø Õ“Ò~ÐÜδÍÍ1ÍþÍxσÑöÓ©ÖhÙôÛÞ^ßãߣßÑÞ­ÝoÜFÛVÚ¾Ù’ÙÎÙTÚöÚ„ÛÕÛ×Û“Û3Û÷Ú%ÛÜÛýÜ-Þß@ßßÉÞß^àÎâVæÁêØïmõLû>X "TŒ´¶ƒ ¶– *àüøõ.ósò¯òózôJõâõsö<÷YøŸù±ú,ûÝúàù•ø|÷ ÷÷Þøîúoý8CŸG ŒgZ`¤q¾¥Þh31j NS!%)ç,Q0385ã6B8t9‚:Z;Ô;¾;ö:{9ƒ7j5™3c2ã1ù1J2c2Ö1f0.+À'?$• ›$%Æ U2´þû‘ø ÷^ö(öúõwõjôÍòºðWîÉë&éwæ¯ã°àbÝÆÙ֒ҴϼÍÇÌÎÌÂÍÏÒÕ#سÚ`ÜÝÊÜ"Ü‹ÛcÛÊÛ”ÜdÝ×ݰÝðÜÔÛµÚáمٮÙMÚCÛ_ÜXÝáÝÃÝüÜÇÛƒÚ‘Ù3Ù‰ÙœÚoÜßNâ3æ‹ê2ïôOùáþÙ :²Ìù(~È ± yüRÄü­ùX÷ïõwõÔõÉö øTùiú*û„ûjûËú«ù1ø­ö‹õ1õ×õ‚÷ýùöüð”& ¹ >†M[›'=<Œ„dæ˜6$!8#Ë%)¸,™0347 9å9Ë9 9 87m6ÿ5¼55c555ü4°4K4È33(2ª0`.+á&í!›I:” e µˆéÿÙýMüûúçø‡÷ùõgôôò–ñðÍí¡êsæá†Üï×MÔîÑçÐÑ6ÒÐÓpÕ¿Ö—×ØaØÔØ™Ù¼Ú Ü…ÝŸÞ2ß,ߣÞÏÝæÜÜwÛ1ÛjÛ:ÜŠÝßà[à‘ßñÝýÛGÚ1ÙÎØèØ$Ù;ÙÙõØ=ÙsÚûÜ÷à9æ_ìùò¢ù‡ ,ÚjÉü$z<š¢ H cAþ”úÐ÷Böñõ¥öü÷}ù±ú4ûÔú¤ù÷÷AöçôôÊóÒóôdô õ2öøÃú3þöS Ô c /‘ßMá‡!šð8›UžU£F ù#{'¢*`-Ã/â1Ë3n5š67Ù66ÿ454î344ß4µ5‡6<7»7Ý7n75641U-')Ï$ˆ jjb1Ö x`ßÿ7ý‹ûÚúóúrûËûcûÇù×öÕòFî¶éˆååáÇÞÜÚÙئ֭ÕÕÔAÔ-Ô|Ô]ÕçÖöØ+ÛÝÞýÝ(ÝüÛÛªÚÛîÛÝ Þ¨ÞÔÞ³Þ‡Þ‘ÞèÞlßÐßÄßßßÝ<ÜiÚØÐÖNÕ>ÔÞÓkÔ ÖÐØªÜyáçíóùÁþ ® ÇeUÀ¬\J 9ËÿÊý²üÇûûÎúçúPûÊûýû’ûUúVøçõ‡óµñËðíðòÿóvöùªûêýãÿÌìj- ß uûÕ`øà4ñUíÜ7þj!Æ$(i+”.q1¼3:5Ô5§5ü4043‹3*4~5]7d9;<Þ;»:ë8á65{320.Ž*¿%øÈÌ…@ $3 HV±;ÿ§û¼÷ýóÇð7îì ê‹çNäeàCÜ’ØñÕ°Ô¼Ô´Õ×x؉Ù1Ú}ÚÚ—Ú·ÚÿÚmÛîÛoÜáÜ=Ý~ݣݵÝÉÝùÝ\ÞýÞÑßÀàžá2â6âgá£ßÝÛÙ·Ö#Ô†Ò ÒšÒðÓ¼Õ¾×ëÙrܲßä¾é˜ðø ÿt nYþˆ*zjó # !3³ñ ˆ-ŒÿýÞúÉø÷«õ„ô…ó¼òQònò$óhôöøYúÁüCÿÆ/`BÃ Ý • þ 3 Q p ¢ ù ‚ K]Í»U¹Ù\!²%A)¥+Ú,7-F-…-;.q/ú0”2ý3 5¸56Q6Œ6â6Z7õ7¬8i9î9×9¦8õ5«1,Ï%ªT5RZÏ9M  •@:‹–þÝü´úý÷²ôîðçìæè*åßáßÑÜÛîÙSÙ+ÙGÙsيقÙlÙgÙÙüÙ¬Ú„ÛHܲÜÜèÛÛeÚxÚ{ÛQݕ߼áDãÜãoã)â[àaÞƒÜÞÚkÙ ØžÖÕyÓòÑÁÐ?ÐÈПÒÎÕ)Ú\ßå5ëŸñQø"ÿ¶Š [+í$@‹  â Å µ¯º×-Wso.“þ›ügú4øCö»ô§óóÒò&óô’õ÷—ù–ûVýØþIàÇû=" 6 8 8 ¥E~æS x ùƒÓ¹ ê!c#=%š'_**-q/º0Ø00Ý..N.Ê/r2×5Q9*<Ì=ç=„<þ9Õ6}360-Õ)v&×"ü#’†E Ü © {.«Ö”ÍþûÉ÷äóð¶ìÚéŠç™åÂãÊáŸßpÝšÛ{ÚJÚòÚ"ÜjÝ^Þ³ÞNÞ@ÝÌÛVÚPÙÙÀÙ2Û ÝÛÞHà)áá¶ááá=âÃâ6ãBã¡âAáOßÝàÚÉØÒÖëÔÓjÑ#ÐÏÍÏMÑ=Ô³ØÞwåàì7ôûíÔ¬ ~ Z]¬uîH¥  o § ¥ y W{ÿÂnœ¨ÂþÈû2ùW÷MöçõÍõ¬õZõìô§ôÕôªõ-÷LùåûÑþÕ›¶Ë°Ú36Qª ú \ëÄU6è«eªà"c&¼(Â)£)Ø(û'—'(`)Œ+E.71 4~6e8±9d:‚: :9†7©5‰3'1f.++'½"+ïyÅ3^è« Æ ˆL[Ñý™ûyù(÷]ôíðçìŸè¢ä‰á½ßDßÁß›à=áIá®à•ßGÞÝ ÜbÛ ÛùÚÛSÛ¿ÛbÜAÝTހߥà á\âÖâãDãwã½ãýãöãVãâáß‘Ü9ÙàÕÎÒ8ÐOÎIÍcÍÒδÑÿÕwÛ³á2è}îGô}ù6þŠn§ ï  P á H å å = ¹  : ê $ ó n µç!~Ôÿ³þzýôûú¹÷aõhóEòTòºóRö¯ù-ý«U|¶y?ò° ÅÔ~>‘Êõ ã DÅ#/ÉÝb!_"è"(#]#Ð#À$I&S(Ÿ*ä,ð.¾0l24Ö5‡79 :k:ñ9z8ý5£2Á.È*''$´!°¹Úáß4'À   T -;›‹ü]øaôÖðÝípëlé«çæ½ä«ãèâZâÍááÝßYÞ¤ÜÛËÙ-Ù:ÙÒÙ­ÚƒÛ(ÜŸÜ ÝÝ7ÞùÞÀßà„áÀâDäÜåççÒæÈä¡áÏÝÝÙFÖTÓÑŽÏÎTÎÛÎjÐ%Ó×ÜÛáèqîdô•ùÅýå Ñ÷Lè ¾ ô”3ã ø õ Xu[ÏUQ7À˜ü8ø·ô©òBòJó7õ]÷ùú\ú#úçùúÊú ü›ý;ÿ¶è¶ ÞPž"7 î ¤Åvá2‘Ɖ-!u":#Š#º#L$»%B(À+¿/3Á6À8y99ó7‘6Q5]4–3¤2"1É.+®'Ž#¨gqlŽyù Æ> n D¶ÞÿùûVø3õªò¦ðôî_íÃëê€èçŸå:ä«âßàñÞ)ÝØÛ2Û-ÛŠÛöÛ*ÜÜÛÛ¶ÚºÚWÛžÜxÞ¬àòâå·æáçkèBèYç¹åxã¸àšÝ?ÚÍÖzÓ‹ÐRÎÍ3ͺεÑöÕÛ“àÙåêcîžñôl÷­úbþkj× / ' Ô ¯ h « Þ  ¼ t‘£~@ 9 ÓqaÿÝü ûòùƒù‚ùžùŒù-ù–øø¿÷û÷ÈøúÞûÔý»ÿ> IîþBþeþmÿ4`oñ= ¨ … ùìô5ù¨¼.¥ #0& )o+i-(/á0¬2{4!6c78:8Ø77³5Ì331ó-R*Â&³#h!ÚÌæÜ~²p»'v ¬÷ˆÿü%ú:øœöõ5óñ–îíëHéÚæÌä7ãâGáàìßß!ÞÝùÛñÚÚsÙ9ÙqÙÚÛTܼÝMßáìâéäÝæ’èÃéêKéç ãß!ÚiÕ¦Ñ[ϵ΂Ï>ÑEÓÕpÖ¥×5ÙªÛUß&ä»é…ïöô¢ùBýÂÿA :^K­ ã –„•Óh ‹ r MG€ ÞÍÿšþý,ûù5÷àõ_õÇõööœøTú½û—üÔü üIü üYü÷üÌý‹þéþ¾þ#þwýEýþ,Ñ] N sëýìÛÐÇÅ×v³g!Ñ"«$Ê&F), /ß1M4%6R7Õ7´7õ6£5Ñ3š1%/¡,@*5(¥&“%×$!$#k!÷È l ? žs‹«›þ:üƒù†ökóhðµízë½écè<çæÑä_ãÅáàuÞÝÜ„ÛKÛÛŸÚ½Ù¦Ø××ê×TÙ-Ü!à‚äzèHësìáëÙéÝæ†ãYà­Ý¥Û.Ú ÙòטÖèÔ ÓjÑÐñÐÊÒÖoÚ}ß¼ä¹éî¦ñVôMöØ÷Uùûvýpç‚Å ; œé`i i © I 9 9 è Ý ×àaþtû úÁù%ú¤úÅú[ú“ùÑø€øãøõùrûóüþ°þ¨þþ&ýüëú#úóù‘úü2þÉxó ³ ý  4 …Úž7‰‘bãà6ü; è"ì%')r,™/]2|4Ê5;6å5÷4¢32ˆ0 /.E-Ê,_,½+¯*)ï&K$A!óŽGK³sY & ¥Âœvÿ›ü3ú/øHö'ô–ñžî‘ëÚèÔæ¢å$ååàä@äÚâà‰Ý0Ú×ïÔÔÐÔéÖüÙuݼà\ã åæqæ€æpæNææ‚å¥ä\ã‘á4ßHÜöؑՋÒWÐJωÏÑ´Ó'×ÛÔÞ6âìäúæ­èêîì=ð_ôíøGýÚ]íú yO D ï õ(ŽQ ¯ å !{óyøa¶þýeûóùÔø0ø"ø®øµùûú8ü)ý¥ý—ý ýüûúYù ù[ùõùØú÷ûNýØþ/ÌRÑ] Î ¤ s “µ{ë#YÖã½vñß"Õ&p*d-’/õ0˜1”11b0Ô/¶/0â0›1Ú1T10.Þ+º)Õ'&&{$‹" ‚Ô]l' „ I  u›Tý¬øQôéðÓî î.î îÀîîMìwéÐåÇáäÝ©ÚrØi×w×WتÙÛUÜdÝUÞOßpàÇáPãþä¿æeè›éîéìèaæ~âÝÝWÙ»ÕˆÓËÒ-ÓÔ Õ¤ÕãÕÖ¥Öù×9ÚIÝÚàŽäèIë"î»ðAóæõÔøüƒÿìu ³ a œ Œ [ + â Š Å h oýWÐÿ´ý4übû,ûmûöû˜ü*ýˆýšýWýÏü$ü~ûôú‰ú2úèù¹ù¾ùú©úrûLü*ýþ<ÿ«lk‹°Æ ¿ …úúiIÌWl€Ï;T0#&([)/*Ý*¦+³,.}/Õ0È1-2 2›1%1é0ö0 11?0t.”+Ü'Â#Îqæ, ( I‰À 2iÿ€ûù™÷ÍöQöÑõ õÅóÜñ8ïãëè9äÀàÞÜøÛùÛÿÛŽÛyÚüا×!×ä×ÚYÝ.á×ä©ç.é?éèïåwãáöÞ1Ý¥Û)Ú Ø×jÕøÓÞÒIÒUÒ ÓXÔÖ2ØeÚܡެàßâwåžèWìqð ôœø4üPÿïÖH˜ì T µ Ó lNn ç ë ²rW„(ÿ·þ¶þûþHÿ_ÿÿyþ§ýÛü;üËûuû ûÉú€úZú]úsúuúEúæùùVù¸ùàúÞüŽÿ¢5 ý ¯ ª ð   …%šËÙ÷På’" %W' )**µ*Û*ç*:+*,ß-;0×25w6|65Ž2k/F,)w'è%©$€#@"Å çvLfüu VåÀGíxþßûøõ¸ñï.íæëØêéªçåÇáYÞCÛýØÊ״וØ2ÚGÜ“ÞÓàÌâXäqå)æ–æ¼æ…æÎåä¨ânàÞÌÛÎÙ/ØóÖÖzÕ ÕóÔåÔïÔÕgÕÖ>×Ù˜Û¤ÞâråÜè;ì›ïúòGöhùMüþþ•)¾5 Y ó Ú Š “ L Õ B£¹ÆOEpŠ[ÊäÏÿ·þÒýRý[ýñýàþÆÿ-¼ÿ^þSüúWø÷×÷Vù­ûfþ 8¦ /[ÌžÁû  «  ˆ • ˜ª‚’8õ –"5#1##%#ä#g%§'}*«-Ø035T6Ô5:4ï1‚/{-9,Ø+&,ª,Á,Î+u)¿%!!UÈ“.$ùO ù £<0þÆûúÿø+ø)÷‘õ'óìïìèTä áaÞXÜéÚ Ú¶ÙÝÙhÚ>ÛRܪÝNß2á&ãÞäæYæÒå“äåâákßÞÚÜßÛñÚýÙùØÞ×§ÖUÕøÓÁÒôÑ×Ñ’ÒÔ#ÖwØÛÚ>Ý­ßAâåè3ë‰îòŒõùüºÿªAp! < © ` u "¾¥ Kv3XõC”ÿ2þZý-ý¯ý»þýÿcÝwÿzý`û¥ùŸøbøÂømùú¡ú+ûñû,ýåþí쇅Օý[6/÷z † Ü;Xæ£ojõ¦¿°¢#ö'ñ+î.›01Š0µ/ /ã.g/z0Ì1å2G32§0Å-e*'($Ó!ñ<nUÜòű 拳O7#Êÿïýû–ødõòÜî¢ëhè4å*âyßNݺ۽ÚLÚdÚÛ4ÜÐݤßiáÕâ·ãäÉã<ãâíáeáöààà…ß±Þ‰ÝÜ-Ú5ØXÖÐÔºÓÓãÒ Ó£Ó±Ô5ÖØÚ ÜïÝÛßâ­äýçøëwð)õ®ù«ýÛ|-<Öúk± E Ë B©À¨qè®^³’lÒf"ÚÿYÿxþ1ýªû)úùˆøÔøãùŒû˜ýÍÿõÏzçƒÁG¸ÿz æÌ µ c…‘óJ7+GPÈ ¾"$Ÿ%Q&'3(Ô)ß+.U0G2¿34™4â3—21q/.Ö,›+*4(Ì%ú"êËÂä:Æ Ê $ ~¾ÛàÞÕþ«ü6úS÷ýóNðvì®è*åâ­ßÞ5Ý(ݨÝnÞ7ßÝßWà·àáƒáùáaâ â¥â|âFâ"âââ°áêà™ßÒÝÅÛ¬Ùº×ÖæÔ>Ô$Ô‚ÔÕ¦ÕÝÕ³Õ\ÕHÕÖú×_ÛûßAå|ê ïˆòóô˜öí÷gùUûÊý™a°/Ä—ýL´8Á;§ ½†oe^^pœÓí°åp`þüû¯ùî÷!÷…÷"ùÀûèþðÞþÇôþuüûcû9ý1¡ßk È ä Ä × z à §bÄ|xóVn#"%.(+-z/·0U1„1„1ˆ1£1Á1´1J1_0è.ë,…*Ü'%X"·>ì³}6Õm+ > à ¤RsÝ¡þíúþöó)ïŽëVè¤å“ã*âRááà¦àyàIà àààGàxà¥àÝà=áßá¿â¨ãGäMä’ã$âEàQި܎ÛÛ!ÛOÛ+ÛMÚ”Ø1Ö¦Ó’Ñ}ШÐÒ6ÔæÖ¹Ù‚Ü9ßóáÁä§çšêí‚ðvóköPùüVþ:´àئE¨ÈªTÌ0F‘\ã-÷ºÍ ôüLÿ¯ûãøf÷b÷®øåú~ýÞÿ{õ? ÿŸý×ûÂú›úWû¶üfþЧo™g™AP ” ˱Šù’„çÀ£r >#Ó% (å)y+õ,w.0w1¢2S3t33I2N160û.-¨+h)×&$a!¶—6YùÔ²Y¦ Ž ;xþœú–ö˜òãî¸ëEéšç›ææå´äjã¬áÅß'ÞM݈ÝÒÞÊàÇâ äjä ã!â}à9ߢÞÀÞ^ß*àÊàëàSàìÞÏÜ;ÚŒ×"Õ@ÓÒlÑTÑ™Ñ%ÒøÒԠՃ׺Ù8ÜûÞâ}å,éÝì:ðó õÒö|ø€ú ýþÿøy f„¯le;ÿ\ÿá}”_  T ã Ÿ+hýÂû\ûü‡ýHÿÕÈîQ9ÿþ‹ýqý£ýìý þ(þþØý¿ýäýfþ[ÿÆžÃÿ ® Ë }  ¯ ¦äAŒµÒ™€½6Ñ u# &(µ*”,.3/0Ã0l1 2Ž2Ä22 1#0.­+)T&º#T!)-N…ᆇΠǟg K ¼Ksürù<÷„õåóò·ïíê<çÊäþâÿáÈá-âÖâ_ãxãã+â0á_àäßÅßóßZàñà®ásâ ã)ã–â8á/ßÅÜ[ÚAØÖaÕ`ÔcÓPÒ9ÑYÐÿÏnÐÍÑÔ×`ÚÝcà€âäYåøæ^éÉì$ñöÛúøþÚ6Ãàÿþý;ý²þDs•þ 3  ¡ sÃõÿ•ÿÑÿyEá ¶ RäÿæÿGÄÒçþ™ýpü§û[û”ûLüvýûþºƒ+™Ñî ; k ‡ { Dé$ó±Ña.ô€ ¾"À$«& (¦*£,m.Ü/å01-2±2303˜21.N+Å'u$Ê! ê‰ M¹Oi  ) 9ì¥þïú:÷ÌóÊð<îìaêéèlçÑææåÐã^âõàÊß ßÎÞßÉß©àwáüáâòááMááïàžàÝßiÞ"Ü#ÙÈÕ–ÒЫÎwÎ[ÏÿÐóÒÈÔÖÆÖËÖ€ÖoÖ7×QÙéÜÆáZçôìéñÂõKø‘ùÖù{ùôø³øùcúü[ÿNà­”¶\Ï4“à;d¡þƒ9,`ÊQÔ5^Cß3H0ÿ þöüü‹û[ûƒûóûŸüˆý¾þO3?-¸½M ©  º ˜ Ž v >úØ ¸ê‹g?Ù "Ò#G%«&N(t*2-S0]3±5Ä6X6–4ú1#/–, *M)y(ë'f'¹&¿%g$³"¸ “cDHqªÊžô · óÜÂþûä÷™õôóDò!ñmï&íŠêýçÝå_ä‚ããÐâuâÞá á(àqß.ߘßÃàŒâ”äQæ(ç£æœäQá^ÝÙgÖrÔ®ÓßÓ¥Ô’Õ=ÖNÖÕÔÒÐõÎ;Ï2ÑÁÔxÙ­Þµãè]ë«í#ïðåðÖñóÊôÐöùBûYý7ÿß[³âÖÑÈcž}šXšÿ†ÿòÜ„Îʤ…}r4”ÿ„ýü û~úú ûügýéþiÑ(‰”  x Y ï £ Þ á § îL]çì­éþÖL!%ë(i,P/x1Ô2v333P2^1[0g/“.Þ-+-P,(+¥)Ü'&Q$ý""\!™ l”û½O 0 (Z[ÿRý ûqø´õóõð[ï0î$íÝëê×ç4å}â à9ÞGÝ`ÝŠÞ™à/ãÀå¬çoèÃçÁå×â¨ßÙÜàÚéÙÛÙaÚÛ:Û«Ú$ÙÂÖäÓÑßΥ͘ͳÎÌФÓõÖsÚÓÝ×àZã[åúæsèêËëÏíìïöñÐó†õD÷8ùxûëýWw0»Î|Ù(X§Àÿªÿðÿ›–²¨68±Ñ×ö;‡ÿ¦þrýôûjú7ùÁøJùØú1ýåÿrg…Ó–7”È h º Ÿ T~Îs•YÙëüÚ##'£)f+¥,§-ž.›/‘0^1ß1ï1p1Z0À.Ú,ÿ*‰)º(—(å(5))(V&è#.!{û«jy•] Þ<¸¢þEüÁúýù¤ù<ùHøgönó{ïìêVæaâŸßiÞÄÞ`àªâòäæJçíæ¾å%ä‡â0áFàÏßÀßûßNàqààéÞòÜXÚz×ÃÔŒÒÑ(ÐîÏ8ÐôÐÒ™Ó|Õ±×"Ú°Ü2ß„á‰ã6å—æÑçé¹êÍì[ï:ò'õß÷BúUü:þë¤Õè>–Ls'Qº(x®èM÷âå¸| Ô6ÿ®ü¨úcùíø,ùöù"û†üöý>ÿ3Ãÿ q2|7Û$ Ñ ã | × >  ‚ ë E V³ëµB ·"‡%‹(y+.Ý/î021Æ0å/Ö.à-7-÷,-f-¦-‘-û,Ý+\*²('½%¡$§#’"!Å|6HN ÿña ¡-×Dlý¤økóXîûéÈæöäwäöäïåÓæ2çÚæÞå…ä)ãâ›á¯áFâ*ã ä™ä“ääãŸâôàß:ÝXÛlÙk×^ÕcÓ´Ñ”Ð9иÐùѼӬՅ×+Ù§ÚܬÝ`ß,áóâ¢ä6æÄçuéyëöí÷ðZô×÷ûµýÿÛ¬XÊ]ƒ ü‹ÿþÓþ»ÿ%â¼s¸Cì¼íÒ¾ìþý†üüóû3ü”üÞüêüµühüQü¼üÚý¥ÿÝCÑÎvÊÍ(Ü×ü / g ³ =7½ÎIö—!ì$Á'ì)[+,o,š,ë,•-.Ÿ/f0‘0÷/µ.&-À+ä*Â*G+),ý,R-Ã, + (î# uÍ\#ã *o)ì ‚ öÈýù õÎñ€ïúííìììê•éè•æTåmäßã•ãvãvã›ãïãwäå»åæÝå÷äWã"á›ÞÜÒÙù׈Ö^ÕTÔTÓpÒãÑôÑÕÒ}Ô ÖÇØƒÚœÛ'ÜsÜàܹÝßáKãÞå›èhë+îÕðbóàõføû ý6ªL£ûÿpþKýÉüýMþE­Ñ®†‰›fœ4ÿ¼/2ÿÅýüyúDùÅøù9úåûÍý¤ÿ1[&¦ø8‚îƒ0ÈñmÓ• ¹a × °zÔŠ™2¡ 5"%$z& )‰+’-Õ./v.-‚+#*s)¸)ó*ê,1/>1†2—2.1N.A*%Ú ÃµÒë—V·{š: º ÕÞÎ¥þrûQøkõäòÐð!ï©í$ìZêGèæDäãÇâ?ã)äåÏåææëåªåUåËäßãoâyàÞ‡ÛÙÁÖüÔÐÓIÓXÓÕÓƒÔ*Õ¨ÕÖPÖ½Ö\×*ØÙÚÛ1Ü€Ý ßÕàÕâ åçHêyíñøôãøwüQÿ%ÓqF¹þ@ýCüü¡üéýÿ/fè.\ŒÄ9[JÝînuBþ.üú§ù‚ùúèúçûÆüoýõý‡þWÿ‚°Bkí«»cÒtêÿfÒ  ï H"d+s Ö#N'*º+,U+È)(ó&Û&(p*–-ã0«3_5«5‘4^2†/~,–)ï&€$;"$ RÝÌû"ë¨ÆÆó o ,ø¢ 0ý.ú'÷;ô‰ñ$ïíWëÕéèMçPæ®ååæóæ(èHéùéþéEéåçæþãÞáËßÙÝÜ¥Ú†Ù»Ø2ØÎ×u××ÕÖªÖ²ÖüÖ‹×UØ?ÙÚÂÚÛðÚ·Ú½ÚqÛ*Ýàáãcèíñlõxø¦úü²üãüÍü§üŸüÏü:ýËýbþâþEÿ—ÿûÿ•¾8·õ®»òþœkgÿxþýeü)ûëùéømø³øÌù–ûËý“j‹ öx†)9sVµÊärã… `*I¬ è"¾##ñ"f"F"¬"‘#é$³&ô(ž+{.61d3¦4Ä4À3Ð1L/ž,"*(‚&Y%b$]#"r eZƒãWª°[Á V°`ÿ•ü©ù©ö¦ó»ðî¬ëÌé}èÈç¥çÿç¶èŸé‚ê$ëIëÌê¦éõç÷å÷ã3âÅàŸß’ÞgÝÜhÚËØi×Ö/ÖzÖ=×?Ø8ÙÞÙøÙqÙXØäÖjÕKÔåÓƒÔOÖBÙÝtáÏåÄéíÀïáñ°óZõüö’øú#ûÊûâû}û×úKú2úÆúüæýöÿèv€ETfйխܤÿýrúZø÷£öD÷Ñø û•ýèÿ‡ ´tÿÔþÿ>ÞeB$c›ÿBþÂýSþ¯/> ‰³e]x± ü’Bpo`'"r%Ô(ç+h.<0m12@22^1U0õ.V-—+Ü)@(Í&z%6$é"{!ã"Ks«öCz‰i" ¾ 8xeõþ:ûg÷Æó¢ð8î¥ìàëÀëìYììˆìJìêëëë•êøé%é è¢æåäÚâ™àLÞ1܉ڈÙHÙÀÙ¼ÚíÛ÷܃ÝTÝVܦڋØgÖ¡Ô‘Ó`Ó ÔlÕG×oÙÓÛwÞjá®ä2èÒëUï‚òõ÷øønø1øø@øÂøˆù{ú‹û±üæýÿ>;íì>ä¤ ˆ º ‡@‹)ý¶ú€ùwùFúzû¡üoýÄý±ýký;ýdýþ#ÿŽ WB«ÂuµºþÝüû<û9ü™þ'nÝ ë4…出Ҵ¸ âþu ?#>&A),x.X0¢1Y2‚2'2X1/0É.F-Å+]*)ð'Í&Œ% $="- _$E‹¨RT¢N ‡ ‹•Úýƒúª÷RõlóÝñ‹ðcïdî”íí¹ì¾ì íŽíîoî8î3íFëŽèaå4ây߈݉ÜpÜÝïÝÍÞKß=ߤޥÝyÜNÛ8Ú'Ùý×§Ö/ÕËÓÎÒÒDÓõÔ{ךÚÞÍáå5é~ì*ïñòžòòòwóeô¹õ3÷wø3ùHùÖø8øæ÷RøÃù:üvÿû4–É » ¢ãìw+ÿ@þ‰ýòünüíûeûÖúOúñùçù\úoû$ýVÿ¶Õ=תþ³ûñùùùúýû¥þÒ=˜œ Ü¥÷7žSlìÍ’p"É%é(«+Ø-U/*0y0m000Ü/x/ý.T.b-,\*V(+&$-"¥ ~±%¶4g-š†  ðBýËúö÷!õyò=ð¯îîCîJïµðò¨òYòñäîVì¹éMç)åKã¯á`àvßßýÞLß·ßààê߉ßþÞCÞ7ݱ۠Ù!׃Ô:ÒÀÐsÐyѾÓìÖ„ÚÞøàEãå˜æbè©êoítðIóxõ±öÝö&öíô°óæòéòßó½õPøQûtþr  K¾t¢’‘ÙxK}aµÿ ýnû{ùøš÷ ønùŠûþ¡ç›‹˜¾Ë>þÐûÞù©øPøÏøúëûAþ踄 T  "«Å°¸'0æ8ùðíÌ€"%`'‘)–+h-þ.P0O1æ1ù1z1e0Ñ.ã,Ì*½(à&Z%G$ª#j#M##I"õ 㮲÷JWÊz € ,ãý¾ù-÷Põô‹ó†óçósôãôùôŠô‡óýñðìí¼ë é£çÁåòã>âÃà¸ßVß½ßÝàlâôãíäåä§ãIá(ÞËÚÀ×pÕ Ô„Ó›ÓÔ…Ô Õ«ÕœÖØ6ÚùÜ9àÁãYçÊêßíbðòìòÏòòñ­ðoïªî·îÈï×ñªôß÷û¿ýÎÿ1«8ß§‚MÞ ­¨ö­ÿBüÓùøN÷¡÷ýø'ûÄýl¾ra…òÆ$+þÔûæù~øØ÷ø?ù*û ý[ˆƒçµ # 8    h ï Q² ¡!~$¦'ö*.0þ132P1¸/é-P,$+c*ß)])¯(Á'Ÿ&f%;$9#j"Æ!5!› ×ÊSS±cz' ¸‹ö1þDü û>úùõø=ø†÷óö›öxö[öôõäôåòìï>ìaèûä—â|áœá âäpåhæÆæ}æ åPä¹âÿà@ßÝîÛbÚåØt×Ö¿ÔžÓÖÒ¢ÒAÓãÔ—×:ÛwߨãÚçëAí^îŽîîRíŒì ì ì£ìÙí•ï¬ñëó!ö%øáùVûüáýUÿ'TO¿[ ´£N ýLûˆù|ø?øÓø!úÿû3þz“=>h§ ÏHþÚûÔùføž÷w÷í÷ýø¢ú¾üÿS*jc¤"1{ l ì O è ó´. 6"—%}(Á*c,m-î-ÿ-Á-\-í,,,o+›*)/(Ê&ˆ%¡$B$s$%É%(&Á%R$Û!þ_ùÐà ¢ Wö½ÿýüÿúÛú`û/üÛüýdüáúŒø—õLòøîâëFéQçæ¥åËåOæäæDçGçêæMæåå‹ä$ä ãÃâTá8ßyÜRÙ#ÖYÓ\ÑuÐÆÐIÒÖÔ)ØíÛ¿ß@ã æ,è\éÒéÓéµéÄé+êðêúë"íBîEï*ðþðÜñæò@ô öYøûþÄü–‡ÇP.ªÒÿý¬úùiø£ø ù.û"ýSÿ–°T2ÜÂhýû†ùÏøØø`ùú×ú…û:üýPþÒÿŽWýVGÇà¯a'3¬®N – ‚õ»ˆ!!¨#Ã%¥')a+$-.$/æ.Í-,4*‚(S'Æ&Ë&0'°' ((ß'k'Ü&>&ƒ%~$ú"È Ó*û‰$  ¸+ŽØà[ð=ôáÿþrü~ùvö£ó5ñ8ïíAìëÔéµè¿ç ç²æ´æç—çGèòèiéné¾è)çŸäBádÝuÙóÕIÓÄÑ„ÑyÒoÔ×ùÙÉÜ9ß*á«âêãåeæÄçéCêë®ëìLì’ìãìAí²íNî?ïµðÐò•õâøqüìÿr%]õâºèÿý€úÎø8øÖø€úßü‚ÿöâk*ò•2Ôþ~ý7üû%úùVù~ùùùÂúßû[ý7ÿSm,AƒùE4à2íϧ n Hqg16"l%÷'š)i*”*W*æ)d)á(^(Ø'M'Á&>&Ô%”%%Ë%D&è&”'((('&q#×w¹ è·0ë«*Ò!3-þ/üLú~ø­ö¼ô˜òFðæí§ë½éXèç§çxèñéËë›íæîCïsîvìŠéæpâßܲÙî×ËÖMÖwÖC×™ØKÚ ÜãÝxßåàHâÅãqå<çúèmêcëÍë½ëeëûê°ê£êâêyëwìñíûï¢òâõŸù¢ý’»”0ë@Ÿÿ\ý¢ûúûùú¾úõûýVÿ^>¢ŸYì]›‰ÿ=ý6ûKùÙ÷1÷}÷²øú´ü»þZq[‹ÀU“©S"–¢Y¸¥ ü3¶ï½"ã#L%c&;'Ö'%( (}'~&=%$#Î"0#5$¯%]'ñ(***’(&Â"û_Q%… Z € Ê  ø¨S"QvI€þòû¯øüôMñî¾ëmêê¤ê¼ë)í±î ð>ñËññnðoîÇëÆè¾åòâ‡à‡ÞðܵÛÏÚ9ÚûÙ Ú¹ÚÏÛYÝ7ß:á.ãóäæçç;é„ê¬ë„ìÓìzìƒë.êÞèÿçíçÛèÓê¹íXñkõ©ù¾ýV!ÝiÌ=ÑÿÍýSüyû&û(ûMûyû³ûüçü%þÎÿ«d™ûhôã’þaüšúaù¸ø‡ø­øùœùVú?ûVüŽýÔþ6,Þ6!™´§»ÿ7ÿPÿzYù E :h‘‘5"E$Ž%ø%Ž%$#¸!¬ / a A!¶"”$&ˆ( *Ö*¼*¤)£'÷$ý!r/), ÂsY ± ˜  Û Þ à ± , .œeŒ-þyú»öDóeðdîhípíMî­ï'ñ`òóIóýòVòlñ=ð¶îÃìeê¼çå…âsàêÞâÝ@ÝáܰܰÜûÜ°ÝæÞà¼âåsçŸéoëÄì„í¡ííáë7êXè§æ—ååÎæ`éíWñÇõÙù1ý¨ÿF7®Ñ®=i+’þÔü9ûúŽùÏùÅúGü þâV@„$ÍSæþýxülûnúƒùÅøWø\øèøûùzû9ýÿ’·KGÂì7ÿ²þþ“þØþ7ÿ©ÿ@ wgù ¢ `%Ä ¿ž z!K!E Íi“–|!#Ò$+& '}''Y'â&,&*%É#ü!Ã0g‘ÑBý  ò k / Þ s ã p Vçnÿ$ü'ù…öJô†òTñÉðéð›ñ¨òÈó±ô)õõsôaóòrðÂîøìëéçå+ã‰á)à ß/ÞŸÝsÝÎÝ×Þ¤à*ã4æ^é/ì0îïÁîlíyëcéœçqææEæ+çžèêôì¾ïÓòöCùDüçþvì÷l”þÂüAûKúùùHúûHü¥ýÿUzn)§Û»:P÷;ÿ;ý1ûeùøŒ÷º÷‡ø¶ùû?üRý<þÿœÿÿÿöÿÿ2ÿÓþŠþIþñýjý¶üþûˆû¦û¡ü£þªƒÔ )4g²Gkdc‚ËEöç |!¾"µ#h$í$]%¾%÷%Ó%%†#!!  ©1íjÒ%A@Þ Î  ì|ÿêû7ù÷„õ‡ôô ô_ô÷ô¬õTö¼ö¾öDöUõô¼òwñ\ðVï.î£ìŠêèçøäâ¸ß1Þ¼ÝbÞà[âåïç}ê…ìãíî—îîJíAì#ëêøèèsçGç¼çöèëÙí@ñîôŽøÎûgþ+H!ÿÛý¹üâûWûû¾ú‰úxú·úsû»üsþ`5®›æ-^]þbü©úaù¨ø‚øÜø‘ùoúIûÿû‡üòü^ýñý¿þÁÿÊ–Ø^ Mþ9üLúãø;ømøuù=û©ý™ãS© ¤ Óú°4¾oJ9á‚ÖÝF !ý"·$&µ&Ç&3&ý$.#Ú )0t3¡Ó»)ÖyÙ×hŠ7`÷ ÿœ¾þîûÛù–øÿ÷Ù÷à÷Û÷«÷R÷èööiööÇö÷C÷÷ ö{ô òûîë"èåÊâVáÈàáîáPã åùæüèêêŸìþíöî}ïˆï ïîoì‚ê†èâæ÷åæçé¸ë¬î´ñžôN÷±ù·ûPýlþÿÿ¹þüýþüàûÇúÔù(ùÜøù¬ùÙú~ü}þ¢¥3ö…¶üþœý¯ü ü½ûPû¾úúiùùù¡ù²ú!ü¾ýXÿÂ×u~Ýަþ\üúø³öOöâöLøKú˜üôþ<dsyz r M ðC9ÚB˜“YV ØñCŸ Â"c$M%f%º$j# !ƒ1¿DãÌ6N(²´ÙÁ¯quç  \ûYÛþ]ýÈû#ú•øT÷Žö[ö´ö{÷„ø™ù~úöúËúÙùø­õÐòÏïòìdê6èdæìäØã?ãDãä{å’çêˆì½îZð0ñ1ñmðïhí©ëêÏèüç¬çèç³è êéë-î³ðNóØõ6øXú4ü¼ýÖþ_ÿ7ÿWþÜüûUùø÷ì÷ùÀú¥ürþ÷ÿ õ‡ã¹2w—Ÿÿ’þpý7üõúÇùÛøgø™ø‰ù(ûCý„ÿ©ptð+ÿbý½ûOú!ù=øµ÷ž÷ø÷øWúüàýÍÿÀ¼ÅÓÏ ’ ó Ö <I8Lº¡ÆÖqÏ% Ü!#½#³#è"X!\uáNÖÆ˜D™ïöª)ù k ×  ±ý(ÿ{üDú¿øø ø¤øŒù‡ú`ûöû9ü%ü¼ûûúÚùHø:ö±óÅð©í¥êèæýäÂäT呿MèZê†ì™îXð‰ñò¾ñÐðsïðí‰ìhëœêê¿éŽé‘éòéåê’ìþîÿñDõjøûôüúý-þ·ýÌü¨û‚ú‰ùáøžøÈø\ùGúmû«üàýóþÚÿšIýÀ†$a[Lÿ%ý;ûÐù ùéø`ùPúœû(ýÔþ{í÷nBOåÿpþ ýÄû—ú†ù øü÷»÷ö÷¹øýù°û¶ýëÿ$5ú\[ „ è G § x  ÿ jm1=ßÙ "?"—!# Ãw}¯†sCù§a3 Î<)L ® Ý|./þ€ü#û'úžù—ùúðú ü$ýþ{þoþÕý©üéú™øÆõò1ïýëSé‚ç·æìæíçpé#ëÉì?î|ï†ð_ñò[òSòÖñÞðzïÏíìŒêqéïèéêˆëíðßò­õEøeúÙûˆü‚üúû6ûúúñùúZú–ú·úÊúïúRûü2ý þ5Ç3[&{Cp.ÿýdû2ú—ù•ùúûMü®ýÿ;0àNz_íÇÿþBünúÞøÀ÷)÷÷q÷'ø(ùhúáû…ý@ÿûœ>œ¼Œ-ØÓa´Þ Ì BîmcŒÉ%Ï)?D)ó½®í‘˜èW½òÌÒ S µ%›·þýÛûûÖúDûLüÅýfÿÒ²Ááÿ üµù¨ö¶ó ñ·îËìMëFêÆé×é{êŸëíÊîqðèñóÕó(ôôTóòkðhî\ìŸê†éGéñé_ëPíyïñšócõõöMøhù>úÐú$ûIûLû7û ûÄúkúúÈù±ùâùmú\û¯üXþ<-î@ïßË/‚îþŽýiüûÛúˆú•ú ûåûýfþÇÿ ºð®ùã‰ÿþ—ü4û÷ùíøø—÷b÷‰÷øùˆúTü\þlD ODš•”ö ò¬ м ¡eöGFÙéllY„’‰j=g*“)¿-[BìiÁéÄ4 … ‡epúþAý_üKüÞüàýÿPc0˜zºK<þ¹ûùø8ö¤óSñHï…íì!ëÇê*ëJìî ðCòôoõ öëõõ®óéñðAîÖìçë€ëŸë1ì íWîÄïRñíò~ôöõL÷„ø¢ù£úwûü2üïûEûYúaùœø9øWøüøúû]ý6ÿ›é×YlG"²xþýüËûþú¨úÏúkûiü¨ýÿJ^$•·™IÍ 0éþFý^ûhù¸÷Ÿö[ö÷nø`ú~üvþ-ÏÕdÉ&¦ÿrÿ´ÿ†ëÕ#®M ä _µÛÀJ[ÝÉ./ýËÂñRÑWÛht+õ¯DGÂÁP … …ˆ×±ÿDþžý¬ý>þ ÿ!ð“óú”±GTþâû ùüõðò+ðñíxìÙëìíxî@ð#òìófõdöÂöuöŠõ+ô“òñ¯ï²îîÁí¶íáí=îÌî˜ï«ð ò´óõt÷;ù³ú·û6ü5üÇû û)úHùøøþ÷IøüøúsûýÎþ:²Þ¤í¨ÐxÊlþ7ý}ü8üHüƒüËüýƒý"þ ÿA¡ú žŠÈlžþxüúýøï÷÷¹÷”øòùûTýÚþþÿ¥Ð”Šÿÿ¦þhþMþ[þ§þVÿŽhÝ¿Æ ¨ ).¼èËrÙõ½5m{unt•ç‚~ìÇò<i=†#Cø[ ¦ ¹½×íÿgÿQÿ°ÿzÅä¹í{ÍýÀú÷‚ôÚñÑïŽî!î{îvïÚðiòæó$õö…ö¥öröýõRõ|ôˆóòpñnðïîîî¬î#ïðGñÞò®ô•ökøú6ûðû3üü´û,û’úîùGù«ø6øøgøTù×úÍüøþͳâ¶SÎ1tƒTÿþôüüoûHûšû`ü…ýìþsôE8¢`fȼÿŽý’ûúù©ø³ø ùŸùbúUûsü©ýÑþºÿ:=Ëÿÿþ8ýŠü*ü+ü—üvýÊþŠ£ødÊ  ,²;³òÇ(¨§™=îN˜¸Ž ºh¶µ| ( Õ¡©ÏëÿJ)káNnØÝ§ËþÉûçø[öGô»ò¸ñ6ñ)ññ-òóô õëõ¡ö#÷h÷f÷÷XöKõúó‹ò3ñ&ðŠïkï¿ïnðXñhò—óìôköø¼ùEûvü!ý0ý§ü¨ûoú>ùSøÚ÷ä÷høNùuú¾ûýoþËÿWb)žÃž8”§kåÿ5þ“üFûú•úVû¨üHþíÿ]w0…z ?œÿøýPüÎúšùÑø‡ø¾økùqú¦ûÝüïý½þ7ÿTÿÿŒþ¾ýÍüßû"û»úÁú7ûü-ý}þñÿŒZe®& ° BïzU¯®z?$JÈ ¬ ÷ œ‰£ÉÜÂa«—!GS:Ç ! }9ŒÎ©ðmå í&³’׬GÛý‘û}ù§÷ö¸ô°ó óáò;óô4õyö¢÷øóøøø›øø÷+÷Jö`õpôyó~òñÎðeð|ð,ñqò(ôöøÕùBûGüáüýÙüFüoûwúŽùáø”ø®ø!ùÌùŽúUû)üýLþ·ÿOëV^Ü¿ ÜW¬ ÿœý€üËûƒûªû:ü%ýWþ°ÿ5{nï ØhÿÖýBüÏú¥ùèø°øùÌùäúü%ýëýNþOþþˆýûüsüøû‹û)ûÒú‡úSúLúŽú2ûKüßýçÿKë F ¶ ÌjwíÔIt„¡æ a  ú  n éL˜¿—à(ÔëƒÇ ðH‹ÇÁTJl‹ƒ>¯Ñ›÷v‚4¶ýCûùS÷öbõõ õ8õ‡õúõšöd÷Døù¬ùáù¤ù÷øò÷´ö[õôÂò·ññÏð2ñ/ò®óõf÷%ùúû&üfühüCüü»ûaûöúwúïùtù$ùù{ù?úcûÔüuþ'ÍIX¹˜õßtàTÿüýøüVüüEüËü ý´þóÿ<gG¸¡ýÛ^µþýµû¯úúåù úkúêúpûòûjüÑü#ýVýgýSýýÅüSüÉû'ûpú¯ùúøxøTøµøµùSûxýùÿ¤GÀ÷ Ù X kO5ÙQ°  a Ð e < l !  e:Ùÿw% N#Ê y U qÔ…þ€{Â,Û «Ý´C—¹ºÿ³ýÃûú–øw÷¬ö4ö ö7ö±öt÷nøù|ú4û{û5û[úùb÷´õ;ô&óò}òÙòŠósôõ öÐ÷ ù>ú_ûYüý‰ý©ý|ýýrü³ûäúúuùùñøEù úBûËü…þGíXp'tZÚþÒiâÿeþý?üêû/üý;þ¨ÿ 5ýT:¿õðÉÿ˜þzý…üÉûIûúúÏú¹ú³úÃúôúLûÊû]üíü_ý™ýˆý%ýuü„ûgú6ùø"÷†ö[ö¶öœ÷ùßúýTÿ¨æùØ‚ ô &  y k Ú Ü ¤ u šH˜| Ì Y û ”bk "–fª‹B  üR]CΡ} \ ; ¸âÈvôDjoþiü|úÔøž÷ùöîöm÷Røjù|úWûÝûüÁû,ûOú@ùøäöÎõéôGôóóïó6ô½ôõröŽ÷Éøú`û‘üŠý0þnþ<þ¢ýºü¨û˜ú±ùùÈøÖø5ùàùÒúüý,ÿð  qG’mÿrõþ±ýÌübü}üý þ-ÿPFóJP£o»ÿüþ3þbýüÁûûƒú-úúBú©úAûõû±üZýÖý þàýOý\ü"ûÌùŒø‹÷àöŒöö¨ö÷ª÷­ø%úü{þ¿+0´ ² 0 > ñ a ¢ Ð y<q%Q â ³ ”YÙó–èN_I ? s –vœìTËTð–0 ž » g ‘9sc4ÿý|û=úlù ù ùaùóù£úOûØû)ü4üöûuûÁúïùù.øN÷sö¨õõ’ôwôÃô{õ’öè÷Vù¸úöûýüÅýHþƒþqþþhý†ü†û…ú¥ùùµøÓødùjúÖûŽýoÿLò3î§ÂŒ4éÿÓþ þ¢ý”ýÖýRþðþžÿMïqÈëÛ£Mçsëÿ<ÿ\þPý3ü2û{ú3úcú÷úÆûüPýÇýüýûýÒý‹ý'ý üêûþúßù£øj÷Zö–õ8õPõäõòöoøNúyüÓþ7~ƒ$Hè Ä4{·Že¥b N G T 8¼¹òLM¸ M ß z -s&7ŸO0" ¿ . = Þ  » öõÿ3þÐü×û=ûëúÌúÏúðú,û~ûÞû:üzü†üMüÈûûúõøâ÷èööŠõ@õCõ•õ5ö÷.øfù­úïûýþÈþ,ÿ2ÿÖþþýáû úù­øUø‘øeù¹úgü<þœáÄ:@Ö èäÿÿªþ„þ™þÎþ ÿJÿÿéÿf¹bÚÃ(G@3ÿ<þhýÁüDüðûÆûÈûúûYüÝüuýþþäþýþÔþjþÀýÙü¹ûjúýø‹÷5ö!õtôGô¢ô€õÓö†øƒú°üóþ,7í*Ö탻ËëPi,WÍn º 8 †’Iš|ó à ˆ  ® N þ:ÚípSq›  V £  î þÀJ² kåÿŒþmý“üü·û±ûäû?ü«üýbýˆýwý(ýžüÝûðúéùáøï÷)÷˜ö=öö:öœöK÷Møù#û¸ü-þWÿ[%„ÿþ[ýüÈú°ùóø¶øùúvû.ýõþŽÎ£5ä‘&žö6rÿÄþIþþ3þžþCÿ Єz­«oúR˜ÿ¬þÒýýüüÑû½ûÜû.ü°üZýþÊþUÿžÿ–ÿ:ÿŠþ‘ý^üû‰ù ø›öRõOô³óœó"ôNõ÷?ù§ûþ-í5ÿXS‰ùt_dÙ_ã X µ ë é™éÆ*¸  y 1aõ¼Ÿ…T õ T ^ U Q¥#™Áÿ›þºý*ýëüðü$ýiý«ýÜýøýýýìý¿ýlýçü*ü8û%ú ùø1÷¡öaövöâö£÷¹øú¶ûeýøþ<1ÂÎÿ„þýÚûàúMú$ú[úÞú™û~üƒýžþÁÿÙÑ”G1Ý[ºG’ÿûþ’þhþ„þäþxÿ(Ü}ýRzsDðuÓ .ÿEþfý©ü"üàûåû$üŽüý ý8þÏþ_ÿÙÿ'*Æÿîþ¦ýü-úMø‘öõôŒóŒóô3õÁö¥ø³úºüþ)×$%ôª_& O½j_ž Ñ– L Ì ù ÀîUU •  ¿¦ãzd–¤iB Ø \ Œ T ´ ¼‰4ÙˆM--Vÿ°þCþþþ>þzþ´þÜþèþÔþ£þUþáý?ýfüTûúÁø‡÷˜ö%öKö ÷Løäùœû?ý¤þ´ÿd´¦C›ÿÂþÒýèüüûBûBû‡û üÅü¦ý£þ¬ÿ³¥pG@ñe³ó@«ÿ<ÿõþÕþÝþÿlÿïÿ’Båa ›Yé\Àmÿµþòý/ýüúû´û·ûü üpý^þNÿ$Å ¥ÿRþ©üÉú×ø÷xõ^ôÍóÎóXôUõ¥ö'ø¿ùUûÒü"þ4ÿþÿ}µ°7éÿ§ÿÿ‡ÿÎÿh_µ\7!í x ¨ q Í À Q Œ € B í£‡µ=![ØAÀa Ü   ¼ Ò;%Z«ÿÿ©þ‡þ¨þÿ‡ÿ^f?ÿþ²ü,û¯ù`øa÷Ìö¯ö÷Û÷ùfúàûKý„þwÿjm1Çÿ7ÿþÓýýsüûûÈûçû_ü$ýþ+ÿ6*ý©*{”o t¼[àÿÿ•ÿ¿ÿ{óoéZ¼5<µ!`Œÿ™þ·ýôüaü üüLüîü×ýíþ ÃêH7Êþý@ûfù¯÷>ö,õŠô]ôžô;õö5÷nø¼ùûNügýCþÐþÿëþ’þþý=ýý+ý–ýVþfÿÃe7ö› í Ñ = 6 Ï ! F O KK]”Îñn/ê¡ ^ c : ï‰\š‡bA;fÕÿŽÿ‘ÿØÿPßiÒúÉ.*Ïþ?ý¦û0úù>øâ÷ë÷KøóøØùíú#ücý•þ ÿhÞüË`Íÿ&ÿ{þÝýYýûüÏüÞü2ýÌý þžÿ®³”<ž½¡[ùˆš'½f0%H•‚ ŠûYž¾­^ÏíÿËþ½ýÛü8üåûðû]ü%ý3þdÿ‘4k*zlÿ•ýüûaúÙøt÷FödõâôÉôõÃõ·öÚ÷ùDú^ûRüý“ýËý·ý^ýÕü>üÀû€ûœûüÿü-þ’ÿº`‘÷ Ù (  p †x‹Øh9@p¼„øsï^¶îüÚƒñ#ä”N8tw ®>Ÿ¾•\VÿºýOüõúÌùîømøPø“ø+ùú û$ü<ýEþ1ÿõÿ„ÔÝjÿ§þòýjý ýýYýÎýlþ&ÿôÿËŸav·Ä¤`˜'´Fé« Ü>¿TñŠ…ÇÉ}Úæ®Q÷þÈýãü_üCü‹ü&ýýý÷þýÿùÒm´–$èÿuþçüVûÔùlø+÷!öbõõ õ…õaö„÷ÅøüùûÌûEüuühü/üÞûû$ûÒú™úŒú¿úFû.üzýÿóݲQ¡”) c N òa´cç[A;DašSÓ] œ ~  .â£x{¾I9“´F±Ý³-S9øÿ¨þ]ý%ü û"úsùùù[ù úû,üZývþeÿ‡´¢ZçÿXÿÂþ9þÊý†ýsý”ýèýfþÿÁÿ‹V´.z–†S ²Tï…ºnI`¿d?2ß^Š_ãà‘Iÿ%þEýÁü¢üæü{ýGþ.ÿ÷¸O°Ñ£*ÝÿDþ~ü´úù²÷¶ö"öîõ öeööö²÷Œøxùcú4ûÒû(ü/üîûtûÙú8ú¬ùNù2ùjùúýúUüôý¹ÿ)—»’#{¦ªPóyåF°:ôî+¦Qç«UÑ úÊÀŒR:cÛ¢°òWÍE²7/àGeCóÿþ+ýëûåú)úÅù¿ùú¯ú†û}ü}ýoþ@ÿãÿRŒ•p$»ÿ?ÿÁþQþþêý þdþåþ}ÿ³?Â@».ŒÅШPÓA«"´o_·›˜]ßÁ$?.úûÿÿWþ¹ýPý*ýUý×ýªþ¶ÿÖà¯(CüZj8ÖþTýÈûKú÷øá÷÷¢ö~ö«ö÷É÷ø„ùeú%û©ûßû¿ûPû¥úÛùùø9øMøÀøˆù‘úÁûýRþ ÿí5nŠ{3ªßØ @Á(…èhRã°Š\ùQ] î/FrÀ?ùñ&­?¶üÿ³)ü¨HÿûýØüìû?ûÔú¬úÆú"û»ûŠüyýmþFÿîÿU{h.àÿŽÿBÿÿÍþ§þ•þþ¾þþþ^ÿÚÿj¥CØ_Î;¿!ZŠÖ^:oï£n:ú¤2›ÕÔŒõþÈŽiÿsþÀý]ýNý’ý þêþÛÿØÄ† E)¸øô¸ÿQþÐüHûÑùƒø{÷Ñö–öËöa÷7ø'ùú´úû8ûû·ú<ú®ùùžø:øøû÷2ø¨øYù8ú;ûXüŠýÊþa¥Ð͈ñÂ@“Ø-¨YFsÜu0üÆz d†n—ã #C…ÍëRê—>Ê._[ «øäœIÿþëüüûaûûâûpüýÑý€þÿ¢ÿ?N9 ÕÿŸÿrÿOÿ2ÿÿðþÑþÈþëþKÿíÿǼ“-{Há[È3¨0Ö¥§âVúŤBÔ%+ßB^F׸ÿËþ&þÎýÁýõý^þïþ ÿf=ßxÁ£¡ýþFý¤û8úùOøâ÷Ë÷ý÷høøø•ù*úŸúäúòúËúwúú‰ùù£øKø øà÷Õ÷ô÷DøÌø’ù–úÎû-ý¡þv¯ªX°·y ˆ‘;ó RÈl2 Ú‚îãtÒN™ÿŠ?"5{ïŠ<î…æÓV•}EÏþ½ýçü]ü&ü:ü‡üöümýÙý4þ…þÔþ)ÿ†ÿâÿ.ZZ'ÈÿRÿÛþ{þGþMþ’þÿ·ÿzKÕsë6Q<øŽ yæ^Á5êÒÑʼn4¤Kz›°¾Ïÿóþ@þÊý¥ýÝýnþFÿK^_.µâ¬Øcÿßýmü.û5úŽù3ùù+ù\ùùæù+úeúúžú•útú8úæùƒùù“øø¡÷P÷5÷_÷×÷ø¥ùÜú.ü…ýÑþÀF™cûwï€BDˆ¥U§4¤òÂK­üM³;ïÓê3­Qà”Cб¥†qy¥ÿóþ`þâývýýâüÍüèü1ý¢ý0þÆþQÿÁÿ ,%úÿ´ÿ^ÿÿ¹þ†þzþ›þêþ_ÿïÿ;ë™>ÓK’›]Ý-gª¾±èTä‡/ÔrÞ þ«FI/ ÷ÿÿCþÍý°ýôýþpÿyŠ<«Á|âÿé¹ÿŠþpýzü²ûû¦úWú$ú úú-úaú¤úèúû6ûûÑúQú®ùýøRøÂ÷Z÷ ÷÷2÷|÷ù÷­øùÅúü{ýÔþù¦ 5'ò¥OþÀ¨Á ‡ Èo ŒõBpxOòa¦Önk Ú¹†(’ÃÀ;Ä0¹àýGÿˆþèýqý/ý%ýQý®ý,þ¹þ?ÿªÿïÿ ðÿÉÿ ÿyÿUÿ1ÿ ÿéþÛþðþ8ÿ½ÿlk[¤äá§EÊAµ4ÆyTZŠá[òžU ´:‰“P½àÈŠB ÿGþáýÝý5þÚþ³ÿ£ŠMÕäyæ5kŠÿ”þ–ýŸüÄûû¯ú‚úú½úûú4ûZûkûjûWû/ûïú“úúxùÄø øe÷áöŽövö¡ö÷À÷­øÍùûgü°ýÔþ¾ÿa½ÝÑ®‡hUNQb†È/ÄU$Î;Z$§ù5xÖ_@˜Ÿ6ÈM¾Usn?ãT’¨¦£¸ÿ÷þnþþþþ!þEþsþ¯þûþUÿµÿOiVÆÿfÿ ÿÏþ»þØþ+ÿ±ÿa/ â¡;©èøÝŸGÝgî}Óª¬ßDÙ”hE·/ä99ý©bL|ÿüþÈþÓþ ÿdÿÖÿ_ø™2¯ûÆE¼Úÿúþ&þfý¾ü4üÊû„ûcûaûvû˜û¼ûÚûêûäûÇûŽû3û±úú;ù\ø€÷Ãö@öö9ö¼ö…÷zø‚ù‹ú‡ûqüLýþÏþmÿâÿ%4Óÿ†ÿGÿ/ÿNÿ©ÿ<üÕ®pgˆk˜qì…>=vÎKêŸVõf—†<Æ2à/|ÈwÿîþˆþKþ<þ\þ£þÿoÿÔÿ$T^A´ÿ]ÿ ÿÎþ³þÄþÿlÿúÿ¤` ܉ ›ñ& Ó™ }ùšz«4 #àTuIÛ6fxtjjŠÛÿlÿ@ÿTÿ¢ÿ¯KádÉã‚ò@|µÿ÷þLþ³ý*ý²üLüüÙûÜû üUü­üôüýîüˆüâû ûú3ù]ø«÷#÷Èö™ö–öÁö÷¬÷nø\ùgú}ûŠüzý;þÄþÿ$ÿÿÇþ{þ<þ"þCþ¤þBÿ ç¸iíG~––}KûŽ {÷UNâk©EÓK©ìîŸ'ØH†ÚÿPÿòþÆþÌþûþGÿ›ÿëÿ)MR: Æÿuÿ"ÿ×þ¤þ–þ´þþþjÿðÿ‚²Rþ¶r¦óö¬!j£êSñÎëDÒŠ`CÙb©¨^Ñ*-(*D‰ÇÿÎÿŠ¥!ÂæñæÂ¾ßÿôþþ_ýßü üüÅüýJý„ý¥ý¨ýŠýKýéücüºûöú$úNù‚øÊ÷/÷¼öxömö¦ö)÷ó÷ôøú0û/üöüyý¹ýÆý´ý˜ý„ý„ý ýØý'þŠþÿŒÿ*Õ†0Ç;~Œf¥% %¼oD=\ y›9ÔbØ*K4ækÏf°nôÿŸÿxÿƒÿ¶ÿO‰¢“aËÿ‰ÿYÿ;ÿ)ÿÿÿ ÿÿ.ÿsÿçÿŠU<,ØsÚì˜h²}% oêŠEß¡A¬ÏžQYNMm½?빟œ±ã5£#¢ KV*Ç7‡Ãúÿ<ÿ•þþ¾ý•ýý¤ýÂýÝýïýôýíýÛý»ý…ý,ý¨üóûû úûøþ÷2÷¬öxö–öúö“÷Jø ùÈùyúû©û ü}ü¿üæüøüüüÿüý5ýyýÞýeþÿÀÿ€:âkËýê·q¼Sé‡9 ;‘ —2Ðk†ó8I²VÛKç®”‹…|sjaR:îÿ¹ÿ~ÿ@ÿÿÏþ©þþ¸þÿÿH//0Ûc°Æ©e‹mÛ] ó&¤bF0§IGÀH±@z»}Î·Ì mélâ8`S£€ìaâÿmÿÿþDþüýÒýÍýïý+þsþ¯þÊþ±þ\þÊýý ü(û/úCùuøÏ÷Z÷÷÷?÷—÷øŸø=ùÞùxúûlû¹ûäûõûöûøû ü:ü†üîümýüý–þ8ÿÞÿˆ1ÌN«Ùجa¥Jô£WçÿÚÿüÿXﲋb¬  Éjöxú…É‚K!ÿãÑÊÎÛìúùà¤DÉÿEÿÍþtþKþ[þ¡þÿ¤ÿN Ý»žy8Ä ®"t»‡-^Í]«Oã]¶êöÚ“»à3‹ñ>—öM‘Áâøú×’'˜ð=‘ÿüþŠþ?þþ+þXþ™þáþÿBÿ@ÿÿ±þ'þwý«üÇûØúèùùDø¯÷R÷7÷X÷ª÷ø˜øù~ùÜù,úrú²úíúû@ûWûjûƒû±ûü|üýÖý™þWÿ¥0¬r²Î¾‚–ÿjêÿŽÿbÿnÿ²ÿ*̇J¤lŽŠm@ Ή7Ò^ç}0 7n ¼ºšbÄi ¤ÿ<ÿ×þƒþPþMþƒþ÷þ¨ÿ‹ššx$’¾¨ZáQ½7Ίjj‡¾€ ·q)Å,O*Â'p±øQÁJï±…™ÅR¥õ8^]/ÒK§öKµÿ?ÿêþµþžþ þºþæþÿ]ÿ“ÿ¬ÿ–ÿFÿ¸þõý ýü"ûHúŒùîønø øÌ÷°÷»÷í÷?ø¥ø ùiù®ùÚùóùÿùúú7úiúªúøúTû½û4ü¼üVýþÈþ“ÿ]ÁC˜»¦[ãH ÿIÿ?ÿlÿÃÿ4®&œ’Œ÷Fld3âÁu:óÞÓÔÞï÷ÀhógÍÿ3ÿ¤þ2þîýåý!þ¦þlÿ^b^<îoÄóúÕ+±/µV#&bÑgÊvs´Ê´x«'—þbÌGÞœˆ£ä:“ãBK=ÖtñR¦ÿÿqÿ ÿÝþàþ ÿHÿ‰ÿÁÿæÿñÿàÿ®ÿ]ÿìþWþŸýÎüíû û3úzùèø†øPø<øAøVøtø•ø¶øØøùøù3ùHù[ùqùù±ùÝùúJúúåúUûëû®ü˜ýšþÿ‡@¹íå°a«U¾ÿ€ÿOÿ7ÿBÿuÿÐÿMà}š[—ºÇ¿¤yBΜsR=8Dc‘Çö ø¬'v®æÿ6ÿ°þ_þEþ]þ þ ÿ‘ÿ3é®yAøþ<EÃLÈHàœˆ£åC°%œhµØÈ…ˆìQÂDØ~8 I•îC‚‹Kä`Ì8¯7Óÿ‡ÿWÿDÿMÿoÿ¥ÿáÿ0)ùÿ¢ÿ%ÿ‰þÖýýFü|û¿úú‘ù/ùíøÂø¦ø‘ø}ømøcøhøøªøÛøù!ù#ù ùäø¿ø²øÏø!ù©ù_ú8û"ü ýèýµþlÿ ˆáò¬OëÿŠÿ6ÿóþÈþ¼þÐþÿ[ÿÉÿJÏL»p¹ù-P\IÐ7ýb½g–ž{,¸+éH¶ÿ:ÿÙþ–þtþxþªþÿ¤ÿfI7Ô^²ÔÏ­|?û²g'þõXÁDÑ\Ø?ÆââÆŠ*¨ c¿0ÂkxžÒ Fv–ž†LîsæTËPëÿ¤ÿzÿmÿ{ÿ¢ÿÛÿRqi4ÑÿHÿ§þüýVý¼ü.ü¥ûû’úúzùù­ø‚ø€øŸøÏøÿø ù&ùùéø¶øøPø,øø'øQøžøùªùcú0û üãü¸ý€þ2ÿÇÿ5wŠn+ÑÿsÿÿÞþ¸þ¬þ²þÂþÙþùþ'ÿmÿÏÿKÝx ÐøùÙ¢b'þñ4{ËLo~}kF ±1ÎLÿ´þNþ!þ0þtþâþpÿÆ:ìŒlš™r4í«z_Yeªê?©%©, ÷,9à~ÿlÑ8°Fäç,\ˆ©½À®‚5Æ:›øføÿºÿ­ÿÇÿõÿ%GRE)áÿ¸ÿ‚ÿ6ÿÎþHþ£ýéü)üoûÄú1úºùdù-ùùùù"ù(ù!ùùÙø¡ødø(øô÷Í÷´÷«÷·÷Û÷#ø—ø:ùúðúäûÎüœý@þ¸þ ÿ?ÿ^ÿlÿlÿ`ÿGÿ#ÿôþ¿þ‰þVþ.þþ.þjþÐþ[ÿûÿž/áöïíïô÷ý ,a«]¬Üàµ^âN«_Áÿ0ÿ·þaþ<þPþœþÿ¾ÿw3äƒ €Ø>ME*س™œÀýSÀ@ÌXÖ9wˆn-Ï`ìuþ‰¿zW\‡ÌHY<ô‰ ‡¢Dò«p>ÿÿöÿùÿ"("Ôÿ‚ÿÿ|þÏýýWüªûûŸú@úöùºù…ùZù:ù(ù"ùùùøøÃøuøøª÷K÷÷äöìö"÷‡÷øÂø€ùCúû²ûQüáügýçý`þÉþÿHÿLÿ(ÿâþ‰þ0þéýÁý¾ýßýþsþÐþ0ÿ“ÿöÿZ½e›³¯—ydby¦è5‡Ø)yÀ÷ä‡Y å5ÿ(ÿÜþ»þÄþöþMÿÃÿOç‚¥"‹â&Tf\7Ç™‡šÖ3¢ŒûdÉ(}¾ÛÈ‚àJÏzMBMc{ŠŒ}]+è—>á„)Îq¸e&Fn‰Šn7ëÿÿ%ÿ¬þ"þŒýëüEü¢û ûŒú'úàùµù¤ù¦ù¯ù±ùùhùù¡øø˜÷%÷Ôö©ö¦öÆöÿöH÷š÷ô÷\øÛøvù.úúúÏûšüHýÍý$þQþ^þVþ@þ$þþÛý°ýˆýkýfý‚ý¿ýþ‡þþþsÿÜÿ3y¯Øõ+J€Ë*— y×BE ÑYÁaº-ÀÿwÿJÿ6ÿ8ÿSÿ‹ÿäÿ_ø¤QìfºêüûðåÛе®¸Û ‡§AÍ@·µŠ<Öbíˆ?ùíãÔÀ¨‘viQ%∥1ÆiåÀ¬¦¨­µ»¼´¡HõÿƒÿòþGþýÒü&ü™û5ûúúâúÝúÚúÉúúTúõùŒù&ùÊø|ø8øø÷·÷t÷4÷÷îöüö0÷‡÷ü÷‰ø&ùËùwú'ûÕûyü ýý×ý þþþáý²ý…ý^ýBý5ý9ýLýoý¤ýëýEþ©þÿlÿ¾ÿÿÿ/Pfs{‚©á9­4Á@£áûôÒœW ŽðVÏÿjÿ3ÿ,ÿPÿ”ÿëÿO»/ª(£s¸ßìą̈`Seý‚ÀQÆMbaR8â§e"âª}`PLNPOC'ø¹n¸Yû¡Mü®f(÷ÚØïIij=àX·ÿÿxþòýƒý&ýÔüˆü;üíû¤ûcû*ûõúÁú‡úBúðùù&ù»øUøú÷¬÷l÷;÷÷ ÷÷5÷}÷é÷tøùÃùrúû´û<ü®üýBý`ýcýSý9ýýÿüìüáüßüäüóüýAýˆýâýJþ¶þÿ^ÿƒÿˆÿyÿdÿYÿgÿ‘ÿØÿ2’ñO­xâG›ÒãÍ•>ÏNÄ9µCéÿ¬ÿÿŠÿœÿÁÿúÿI²0¿SÚGŽ© ~N# 4vÏ;±'˜b¸7]poZ2ý‡S+  ûÛ°R+ߥQâ]ÐKà›}‚žÃâîãÀŠEó•.¾ÿEÿÉþPþáý‚ý2ýíü­ünü/üìû§ûbûû×ú‰ú2úÐùdùõø†øøº÷h÷'÷úöèö÷ö,÷†÷øšøAùéù‡úûŠûòûMüüãüý8ý9ýýäü¨üyüeüsü£üíü@ý‘ý×ýþ;þbþ‚þœþ³þÆþ×þéþÿ&ÿYÿ˜ÿãÿ<¥Ÿ(°*ŠÉâׯs(Ñq ›$®?ãÿ¥ÿÿ ÿßÿDÁIÏG¨í('  !IÁ a¾#‘oÈ(/! òàÕÌ¿§…Z,ëæò í¬MÚ_èy¼r9úö  ì¼z(Îp°ÿPÿñþ–þAþïý¢ýZýýÔü’üPüüÔû›û`ûûÇú[úÖù>ù¢øø¤÷Z÷6÷4÷H÷i÷’÷É÷øƒøù°ù^úû›ûüaüü¢ü üüwü`üPüNüZütüšüÇüõü!ýKývý¡ýÌýôýþ/þ?þEþDþGþXþ~þ¿þÿ’ÿ©4´'‹ã-kš¶·™\ŒsåhËÿºÿÕÿhÆ#yÆ G}¬Ïãéäßâõ"kÏB¶"Ë?x·÷0Yh]; جŽ{‡‘™˜vL ¸Sãnþ›I ணœ“„kD ¿h½w8øÿ®ÿTÿèþrþþ¤ýeýBý2ý%ý ýÝü‘ü-üºû@ûÆúNúØùfùøøø'øÌ÷‚÷N÷6÷@÷p÷É÷CøÕørùúžúûoû°ûÜûøû üü,ü;üGüQüYübüsüü¹üîü,ýiýœý½ýËýÈý¼ý­ý¢ý¢ý²ýÔý þQþ¨þ ÿuÿßÿI³"– †÷T’¥‹Gãièm©f5 3k»xË+886>W€µî*f¤å.„äK³tÄ4SbcV<ÿêãë1><,á¢Pìz‘7úØÉ¿¬‡PΘqT8ÛŽ,»EÓÿlÿÿÉþŽþ^þ2þþÒý™ýXýýÅüvü&üÒûvûû˜úúƒùëøVøÒ÷j÷(÷÷!÷U÷¤÷øgøÎø9ù¦ùúvúÐúûVû}û•û¢û«ûµûÁûÔûôû!üXü“üÎüý&ý8ý9ý/ý!ýýýý,ýIýkýŽý±ýÖýþDþšþ ÿ•ÿ2ÒhìX©âÖ(³:Êq8!(Ci“¼á)P{¦Ìë0LpÒ K’åG´(›^£Ø 380õöD‚»ßâÁ‚-Ò~7ýÉ™f+è Zíʳ¤–Y Õ|²Oõ¦_Úÿ’ÿAÿêþ“þEþ þÝý¼ýœýsý6ýÝühüÜûCû¢úújùßøføø³÷z÷Y÷S÷f÷“÷Ö÷0ø™ø ùvùÙù,úkú–ú¯ú¾úÌúáúû.ûjû¬ûéûü:üKüTü[ühü~ü›ü¸üÎüÖüÑüÄü·ü¯üµüÎüûü:ý‡ýßýDþ·þ9ÿÉÿe¢)ËÞËœZ¿q&㬆pktƒ”§½Ù1d‘´ÉÕÝé'VŠÂF›~‹^—±²¦š›®Õ?q–¦¤“xX6îÈžk,å˜Hý¾“{phZ>ÕFÅ‹OÃl ¢9Øÿ‚ÿ;ÿÿßþÂþ¦þ…þYþþÔývýýŒüü{ûëú\úÎùDù¾øDøÜ÷‘÷k÷m÷•÷Ü÷4øŽøÞøùLùrù—ùÀùòù-úmú«úâúû5ûUûsû•û¾ûìûüAü]üoüxü}ü€ü…ü‹üüüƒüuüküoü‰ü¼ü ýqýíýwþ ÿ©ÿGÞ`Æ ))óË¡r=Ì™pVOUdv‰·Øþ*X™£†‰¦äC¼AÈF² L~¦Éë@t«Þ$6?CJUcljW1ù´j$踓w_F'Ò¢vO, éÂO«GÜm¤TÜÿ°ÿ†ÿZÿ(ÿôþÁþþ[þ#þÞý„ýý€üÕûûeúºù%ù¯øZø#øøð÷è÷ê÷ø÷ø:øpø®øëø#ùRù{ù¥ùÓùúAú~ú¹úîúûCûkû–ûÃûïûü;üVüjüyüƒüˆüƒüqüSü0üüü ü8ü†üñüpýûýŒþÿ©ÿ.ªt¸àíãÈ£{U3íÂ’dA.1M|µì49)ݸ¢¥Æ_Æ/‘ç3y½Q í3o¾Öí 0`—Ë÷ýܹ•sR5ùÖ®‚Pëê œ˜ŒrD¶a ¼n$Û‹3Ôu"ãÿ¼ÿ®ÿ°ÿµÿ­ÿ‹ÿIÿèþoþåýQý¹ü ü…ûêúSúÇùNùêøœøbø<ø%øø!ø3øPøuøøÂøãøù)ùRù…ù¾ùûù6úgúú²úÕúûú)û`ûŸûÞûü:üKüGü2üüèûÀûžû„ûtûtû‰û¹ûüsü÷üŒý%þ¸þ<ÿ°ÿqÁCs” –wFÁM22Lx®ã  íʬœ®Éì@r¬òF¦ lÅUŠ·á ;n¨ç)g™¼Ñ×ÓÉÀ¼¼»µ¤†XÚ›iF2++%ðÆ›w[E. Õ„ª5Åa È“lP>2$ áÿ¡ÿNÿëþwþøýrýåüOü³ûû€ú÷ù‚ù"ùØø¡ø{ø^øHø8ø0ø1ø?ø\ø‡ø¹øëøù@ùcù…ù¨ùÐùþù2úkú¥úáú!ûfû«ûêûü9ü?ü,üüÊûŒûSû(ûûû4ûjû²ûücüÆü,ý—ý þˆþÿ›ÿ#ŸOuuV#è°‡uyލ¿ÐÜâäèíððéÛÈ´Ÿ‘‘£ÇþD–í?ˆÈÿ1c—Óhº UºÔäò *T ®£‚T%þâͽ©Žh<îÒ¾³°²´±¢ƒQ ­FÚq¼u; Ü´’t[C'Îÿÿÿþþ…ýøüoüìûoûôú}ú ú¢ùHùþøÄø˜ø}øpømøwøø­øÒøùøù?ù[ùrù…ùšù¸ùäù úmúÇú'ûƒûÑû ü*ü2ü!üüÕû©û„ûiûVûNûNûRûYûaûqû’ûÎû)ü¤ü=ýçý”þ4ÿ¼ÿ(v§ÁËËÆÀ¸¯§Ÿ—’–¢¸Ôñ  ïË¥€g_n“ÉAq”®Èï+}Ü?œé#NsÍCºé  +.,'!êÊ k2ûϱ¤¨¸ÊÕѼ™k5ù·nÀ]ü£YõÙŵ£Ši=ºÿdÿÿ›þ*þ³ý:ýÁüFüÌûQûÙúfú÷ù’ù;ùúøÒøÃøÇøÚøùøù1ùBùJùKùJùMùXùvù©ùóùLú­ú û^ûûÇûÝûêûòûûûü üüüîûÅûûPûûìúØúäúûdûÍûHüÎüVýÜý\þÓþ?ÿžÿìÿ(Smyyn]J;6BaŽ¿ééÁ—veeq€Ž–•™²ÚRœç-p®ê'e¥è0yÀ7a~ž°Êê -BE4縋a>! õæÝÚÛÝÜÖǪ}?ôŸCã„+Û•[.úéÕ»—i0îÿ§ÿ_ÿÿÃþmþþ¥ý.ýªüü‰ûûúwúú´ù~ùeùaùgùlùjù]ùFù,ùùùù;ùoù±ùøù=úyú­úÛúû1ûeû¡ûãû"üUüuü~üpüLüüÙû–ûUûûöúæúðúûHûûàû>ü¨üýŸý(þ°þ*ÿŠÿÉÿéÿðÿèÿÞÿÞÿðÿ=k’¬·³¦™‘Ž”–”ŠzfQ<,'0InšÊù$Jr£â1ŒìJ¡é"OvÆó$YŽ¿è+/* ñΨ‚aG2&"&-5::/ã¢Qõ”4ÚŠE Ù°iC鸉_;üÿÔÿÿPÿêþlþÛý>ý¢üü”û/ûáú¥úrú@ú úÎù”ù`ù9ù#ùù*ù?ùZùvù–ù¸ùÚùüù úHúyúµúüúNû¨ûýûDüvüüü|ü[ü2üüÝû¯û~ûLûûûúêúõú%ûzûïûwüýŠýÿý_þ¨þàþÿ9ÿbÿÿ»ÿéÿ=[oy|{~‡˜­¾ÆÁ¯’oO9007@HKHBCOh“ÏmÂaªî/k¤ÝKºô-a޶Ùö ùׯ…_@-)2E[r‚qIÈ{+Ý—Y ê²v5ï¦a)ðíó÷ìɉ2Ìÿ[ÿäþmþøý‡ýý°üHüåû‡û)ûÎúwú*úëù½ù¡ù–ù˜ù ù¨ù«ù©ù¥ù¦ù²ùÌùùù8ú€úÌúûYû˜ûÕûüMü‡ü·üÕü×ü¾ü‹üBüíû˜ûMûûýúû$ûcûµûüoüÈüýný»ýþWþ¨þöþ=ÿwÿ£ÿÅÿÜÿíÿþÿ0Qq §¡‘pgdfihbUA*ýÿêÿßÿÞÿìÿ+\–Ö[¡ë7ÉOŒÆÿ9u³ò3s®ßæÀ™x^OMYpŠ¢®ª’i7ܺœ|TÙ†,Ò€9ÛÆ½¹¶­™wD¶e¾ÿkÿÿ¹þOþØýXýÓüSüàûû2û÷úÆú™úkú>úúñùÖùÇùÆùÏùÝùîùúú0úOúyú²úüúUû¸ûü|üÈüùüýóüÆü‡ü?üùû¿û•û|ûqûtûû’û®ûÕû üQü¨ü ýmýÊýþbþšþÈþóþ!ÿRÿ‡ÿ½ÿñÿAXfllheelwƒŒƒqX<# ôÿàÿÒÿÊÿÊÿÐÿßÿøÿMˆÎl¹ÿ?|µî)j°úH›ñCоÚßѶ˜wy‚›¡¡—ˆwh[PHA7% á¬jÄo"㵘‡ziP/ 㿞~^5ü´\ùÿŒÿÿ¥þ5þÉýaýûü–ü5ü×û}û+ûçú´úúwúeúVúGú1úúøùàùÕùßùú=ú“úúúgûÍû$üfü“ü«ü²ü¯ü¤ü‘üsüMüüìû»û’ûuûlûyû˜ûÇûüMü—üÞü ý_ýœýØýþXþŸþèþ.ÿmÿ¤ÿÒÿõÿ )4>JXhy‡Ž‰ƒ{qdR8ùÿÜÿÄÿ´ÿ­ÿ±ÿÃÿäÿM”Þ#`“ÀêN”ìP¹ }Ì1L^lw~…Œ“™›˜lUD=@M]lrgIá¤f*ôÓd4Ù°q^QE5ýÒžb!Ý•Hôÿ˜ÿ2ÿÂþIþËýPýàü~ü/üôûÊûªû‡û[û%ûçú¤úbú+úúúùúúEú{ú»úûHû’ûÜû#üdüšüÂüØüÙüÄüœüiü3üüÖûºû­û­û¹ûÍûêûü7übüüÄüýEýýÞý,þvþ¸þñþ"ÿOÿyÿŸÿ¿ÿÛÿòÿ%2@MYeq|ƒ‡†kK!ñÿÃÿœÿƒÿÿÿ²ÿÜÿ1Wx–¶Ü EˆÖ/ôV±Cw¡Çî>c‚•›‘}dL913?Qaknh[H/úذMÙžh;úäÓ®‘mH$èÏ´Y «8»ÿ;ÿÀþSþõý¥ý`ý!ýåü¦ü`üüÄûvû.ûîú¶ú‡úaúCú/ú'ú/úIúuú¯úõúFû›ûìû3üiü‹üšü•üüeüIü/üüüïûÞûÐûÃû¼ûÀûÑûìûü@üvü´üõü8ý}ýÄý þMþŠþÂþöþ%ÿOÿuÿ—ÿ³ÿÆÿÑÿÕÿØÿßÿïÿ .Yƒ£³³£‡a7íÿÑÿ½ÿ´ÿµÿÁÿÓÿåÿõÿ/Ku®óC™ñCŽÒV™à(q´ë-;?<61-,,-/356568:93% á®wBå¾}Z1Õ©‚eUSY`^O-ø®V÷•2ÒÿtÿÿÆþsþ þÏý€ý1ýäü™üRüüÍûˆû?û÷ú´úzúPú;ú?úZúŠúÅú ûNûûÌûÿû,üQüoüüˆü†ü}ülüWü>ü&üüöûßûÍûÄûÈûØûôûüJü}ü°üâüýSý”ýÛý%þmþ®þâþÿÿ-ÿ5ÿ:ÿAÿPÿiÿŒÿ¶ÿåÿDi€†€mO.÷ÿçÿßÿÜÿÜÿÛÿÔÿÇÿ·ÿ©ÿ£ÿªÿ½ÿÝÿ ;p§ßW˜Þ*}Ô,ÒT‚§Æãú  ýòìîõ)44'óÓ³™ƒnU2ÎOÚ±•‡…‹–œ™‹qLæªi Ïv»ÿ]ÿÿ±þiþ)þéý¦ý]ý ý²üTüôû™ûHûûËú£úŒú…úú©úÎúþú3ûgûšûËûûû)üRürü‰ü•ü’üüfüHü*üüúûéûÞûØûÔûÓûÕûßûóûü:üpü±üúüEýŽýÓýþ@þcþzþ‰þ“þ™þ¢þ´þÔþÿ7ÿqÿ¨ÿ×ÿøÿ  ýÿùÿøÿ÷ÿòÿèÿØÿÃÿ«ÿ’ÿ|ÿnÿkÿqÿ~ÿ‘ÿ¨ÿÂÿÝÿûÿ N‡Ç\®S¢î9„ÍU·ÑÚÙÓÍÊÌÖåõ þóêäáààÞÓº’[Ø“T!úÞÊ»¯¦ž˜“ˆwZ-ó¬[°_Æÿ}ÿ8ÿõþ°þiþþÈýný ý§üDüéû–ûOûûåúÃú¬ú úŸú­úÉúðú!ûWûûÇûöûü4üFüPüRüQüMüHü@ü0üüüéûÒû»û§û›ûšû¥ûÀûìû)ütüÄüýXý“ý¿ýÝýïýüý þþ7þZþ…þ·þêþÿ@ÿbÿ~ÿ”ÿ©ÿ½ÿÔÿêÿýÿ ÷ÿáÿÊÿµÿ¢ÿ“ÿˆÿÿzÿsÿlÿgÿiÿvÿŽÿ®ÿÖÿ7h›ÓW¤ùV´ ^£Ü(>Pau‰¯¿ÇÄ»®¡˜—Ÿ±ÅÖßÞѺ™qDÝ¢f,ùέ˜“˜œž˜†g<Å~6ð®q6ûÿ¾ÿ~ÿ6ÿèþ”þ>þæýý3ýÙü€ü(üÐûû:ûûÞúËúÇúÒúèúû%ûKûuûžûÅûèûü ü7üJü[üiürürüeüMü+üüÑû¢û}ûhûhû}û¥ûÝûüaüüÏüùüý7ýOýgý…ý§ýËýïýþ9þZþwþ“þ²þÖþýþ(ÿQÿxÿ™ÿ°ÿ¾ÿÅÿÈÿÉÿÇÿÄÿÀÿºÿ¯ÿžÿ‰ÿsÿ`ÿPÿEÿ@ÿDÿNÿ\ÿkÿzÿ‹ÿžÿ´ÿÒÿüÿ4yË'ˆç?ŠÊ4e–Éý-Rjvyvnf`_`dkw†—¦³¼½²}U#é©j.øÌ«˜”𣬲­\3Ö¤o8ý¿€D Òÿ˜ÿYÿÿÈþsþþ¶ýRýíüˆü)üÔû‰ûLûûþúïúïúùú ûû8ûSûoûû¯ûÙûü7üeüŒü¦ü¯ü¤ü†ü[ü(üòûÀûšû„ûûŒû¤ûÄûéû ü.üNüoü‘üµüÚüþü!ýAý]ýtýŠý¢ý¿ýßýþ-þYþ…þ®þÓþõþÿ2ÿLÿdÿ{ÿÿžÿ¥ÿ¦ÿ¡ÿ–ÿ…ÿrÿaÿUÿQÿQÿUÿXÿXÿQÿCÿ1ÿ!ÿÿ"ÿ9ÿaÿ˜ÿÚÿ f®øCŽØ$r¾Jˆ¿í*<EHFA==@GRatˆ³ÆÒÓħz@þ½‚O%ëÚÎÅ¿»¹´¨•zX.üÆZ$ð½Œ[)ôÿ»ÿ|ÿ5ÿäþ‰þ$þ¹ýKýÞüxüüÔû•ûdû>û"û ûùúìúçúìúüúûAûyûºûüû7üfü…üüˆüqüQü-ü üèûÌû¶û§ûûšûœû§ûºûÔûôûü<ü`ü€ü›ü´üÊüàüõü ý&ýEýgý‹ý¯ýÓýöýþ8þ[þƒþ±þàþ ÿ1ÿNÿ^ÿaÿ[ÿRÿKÿHÿKÿQÿ[ÿeÿhÿcÿVÿDÿ/ÿÿÿòþêþíþ÷þÿ#ÿGÿqÿ¡ÿ×ÿUšä2„Ù-~É Hy£Åáôþÿúóíìõ&Jn¬ÀÆÁ±˜vIàªvG ïäßÞÝÛÔɹ£†`4Ïœi8èÁ™n;üÿ®ÿTÿñþˆþþ¶ýTýûü­üdüüÚû˜ûYûûðúÑúÅúÍúèúûIû„û¾ûòûüAüYüfüiüaüTü@ü&ü üëûÏû¸û¥û›ûœû¨û¾ûÙûõûü*ü>üOü_üuüü«üÇüáüùü ýý,ý?ýZý~ý«ýßýþOþþªþÉþßþîþùþÿ ÿÿ*ÿ8ÿFÿRÿ\ÿbÿbÿZÿLÿ;ÿ'ÿÿÿöþðþîþíþðþúþ ÿ!ÿ@ÿjÿ ÿßÿ!g³S§üQ¥ð/a…›¦¨¦¦©°¼Ïè(Lq“®½Á»¨‰a4Ö¨}Z?)   ýëЪzDÝ®‡iN4é³s(Õÿ~ÿ'ÿÔþ‚þ0þÞý‰ý/ýÒürüü¼ûmû*ûøúÚúÏúÖúëú û3û_ûû»ûçûü5üNüZüZüMü6üüøûÜûÇû¹û°û¬û­û±ûµûºûÃûÒûçûü!üAü_üwü†üü–üü§ü·üÏüïüýAýqý£ýÕýþ*þJþdþ{þþ¤þ¹þÐþéþÿÿ%ÿ2ÿ<ÿAÿAÿAÿ>ÿ9ÿ0ÿ!ÿÿüþêþÚþÐþÍþÐþÚþçþùþÿ2ÿ\ÿ‘ÿÒÿuÑ0ê<…Äù">PZ_bgo}•´Ù/Y~™­¹º±€]6 Ù®Šo^WY_daT;뺊`=ìÒ³Œ]'ì­m/ôÿ¹ÿzÿ3ÿäþŒþ+þÄýYýðüü1üÞû—û\û.ûûüúùú û)ûTû…û¶ûäû ü"ü/ü3ü0ü*ü"üü üùûæûÐû»û¨ûœû–û˜û¡û³ûÊûäûýûü*ü9ü@üCüCüDüJüVüiü†üªüÑüùüýDýhý‹ý¬ýÎýðýþ,þEþ\þrþ‰þŸþ·þÐþêþÿÿÿÿÿÿÿÿýþôþéþÜþÎþÁþ³þ§þ¡þ£þ°þÇþêþÿVÿžÿïÿF£a¹ PŠ·×êø '>\¤Ìù&Qyž¹ÈǶ˜pCðÓÀ·´µµ°£‹kF üÜÁ«–a=å´…X/ݰF½ÿoÿÿÂþcþÿý—ý-ýÁüZüýû±ûyûRû>û;ûEûYûtû’û²ûÒûðû üü/ü:ü>ü9ü/üüüîûÒû¹û¦û›ûšû¢û³ûÈûÞûïûüûü ü ü ü üüü%ü2üBüVüpüŽü¯üÕüüü"ýDýcýýšýµýÏýìý þ*þJþhþƒþþ²þÄþÓþâþðþüþÿÿ ÿÿüþìþÙþÄþ®þ˜þƒþsþkþjþrþ…þ¦þ×þÿdÿ½ÿá:‹ÒAk©¿ÐÝëü3ZŒÅ;n•­³§pP3 ûñãϵ™~gTC0åœtN(ܶiBöѨyB´ÿZÿôþ‡þþ¦ý7ýÎüpü"üáû¯ûŒûwûnûpûyûŠû¢ûÀûàûüü5üAüBü8ü%üüóûÚûÆû¹û±û¯û°ûµû¾ûËûØûäûïûøûÿûüÿûþûþûü üü-üGücü€üžü¼üØüõüý.ýNýoýý¯ýÎýìýþþ6þMþfþ€þ™þ³þÍþãþõþÿ ÿÿÿÿ ÿýþèþÍþ­þŠþjþQþAþ>þKþiþ–þÑþÿfÿ¼ÿnÇq¼û.To~‡´ÖB…É7[pxvpkfaZQF7%ÿîàÓÆ¸©—ƒmU;ýׯƒV)ýÖ³”xaK4òÂ…9àÿ|ÿÿ¥þ9þÏýiý ý±ü`üüàûµûšûûû û·ûÓûíûüü&ü*ü(üüüüìûÖûÄû¶û®û¬û°û¹ûÅûÑûÛûâûæûçûåûãûáûâûçûïûùûüü$ü5üHü^üxü–üµüÕüöüý1ýJýdý~ý˜ý²ýÍýèýþþ7þPþiþƒþžþ»þ×þòþ ÿÿÿÿÿåþÁþ™þsþPþ3þ þþþ(þCþjþŸþãþ4ÿÿóÿZ¿dœÂÜíû*Q‚¸ó.f˜Åî2MaowyvmbVF6%÷êÝÒÆ¸¨˜…oR/اsCöÛȺ® qM ë¬c¹ÿVÿíþ€þþ§ýBýæü–üUü#üþûçûßûãûðûüü-ü>üHüJüEü8ü'üüþûëûÝûÖûÔûÔûØûÞûãûæûéûìûïûóûöû÷û÷ûöûôûóûòûõûüûüü+üAüXünü…üüµüÏüéüý ý=ýWýnýƒý–ý¨ý»ýÑýìý þ2þZþƒþªþÊþáþìþíþåþ×þÂþ©þþoþNþ)þþâýËýÃýÎýñý+þzþÙþ=ÿ¡ÿÿÿSšÖ5]ƒ«Ô._‘Æü1e—Çô@\r‰‹Š…~sgXG6$ ÿøíÙ¼—j:שZ;  öçׯ³›|T!äœIíÿˆÿÿ°þBþÖýqýýÆü…üTü4ü#üü$ü/ü;üDüHüFü@ü8ü-ü!üüüûûñûçûàûÜûÜûßûåûîû÷ûÿûüüüÿûûû÷ûóûòûõûûûü üü#ü0ü@üRühü‚üŸü¿üÞüûüý%ý0ý7ý?ýLý]ývý–ýºýáýþ'þEþ`þyþ‘þ©þ¾þÏþ×þÑþ½þ›þkþ3þøýÂý™ý‚ýý‘ý¸ýðý4þ€þÐþ!ÿoÿ¹ÿÿÿ?|¶ìM{¨Ö5k£ÜL­Øÿ"B\p~„yl[L?61137971%öÓ¬R"ôÈ ~aI6' þí×»—i0è”2ÆÿTÿÞþlþþ¤ýRýýÜü¶ü›üˆü{üsüpüpüoünüjüdüYüJü8ü&üüüýûøûùûÿûü üüüüüüüüüüüüü üüüüüü.üLünüüªü¾üÌüÕüÛüáüêüøü ý ý4ýGýZýlý~ý“ý¯ýÓýÿý/þ_þŒþ±þÇþËþ¼þœþoþ8þÿýÈýšýyýfýaýkýƒý¨ýØýþTþžþëþ7ÿÿÇÿDz­ßDx®äQ‰Àú4l¤Ù 3Sjx}{tja[XW[airy{xn\B"ûТsGôÍ«taUNJG?1ð¸o¹Råÿxÿ ÿ¥þGþïý¢ý`ý+ýýâüÎüÁüºü´ü­ü¤ü—ü…üqü\üGü8ü-ü&ü#ü"ü!üüüüüüü%ü0ü;üAüAü8ü*üü üüÿûüü,üDü\üqü„ü”ü¡ü¬üºüÊüÛüìüûüý ýýý ý ýý(ýHývý­ýéý%þ\þˆþ¦þµþ´þ¥þ‹þfþ9þ þØý¨ýý`ýLýHýTýný–ýÉýþCþ„þÅþÿFÿ…ÿÂÿüÿ6n¤Ø >q¥ÜU˜Ü`œÒþ!;LUXVRPPT\iw†“œž›‘‚nU6黉V$öѵ¢˜–˜žšvS#ç Nó‘(½ÿQÿêþ‹þ8þñý¹ýŽýlýRý:ý"ýýîüÕü¿ü®ü ü–üŒüüsücüRüAü4ü-ü/ü8üFüVüeünüpüjü_üPü?ü1ü)ü%ü(ü.ü8üCüLüTü]ühüuüˆü ü¼üØüïüýýýüüëüÙüËüÄüÈüÙüõüýNýƒý¼ýôý*þYþ}þ–þŸþšþ‡þeþ:þþÔý¢ýwýWýBý:ý>ýNýhýŒý¶ýæýþVþ“þÑþÿKÿ†ÿ¾ÿòÿ$U†¸í&c¦í8…ÒbÎó)19AKWcqŒš¨µÂËÏÎų•n@ Ö¢rJ+ýø÷÷÷öñèÖ¸ŒMÿ£<Òh¨ÿVÿ ÿÇþ‡þJþþÝý°ýŠýkýTýAý0ýýýîüÐü°ü’üxüfü^ü_ügüuü‚üü“ü’üŒüütüjübü]üZüVüPüHü=ü3ü*ü&ü+ü9üQüoüü±üÎüãüïüñüìüßüËü·ü¤ü”üŒü‹ü•ü¬üÎüúü0ýmý¬ýéý þMþjþyþxþhþMþ)þþýÒý¦ýý]ýBý0ý'ý*ý7ýOýpýšýÊýþ:þtþ°þêþ ÿTÿ‚ÿ­ÿÖÿ-aâ/‚Ø,}È DužÀÜó *2;GVi€œ¹Óéöøîع”i=ᵉ_: (8B>, Ö˜O®X¨Mòÿ™ÿCÿôþ¯þvþIþ&þ þôýÜýÀýžývýLý!ýùüØüÀü´ü°ü¯ü±ü³ü³ü²ü±ü¯ü°ü´ü¹ü¾üÀü¿ü·ü¨ü’ü{üeüRüDü@üFüTülü‰ü©üÉüæüÿüýýýýýðüÔü¶ü›ü†ü{ü}üü¯üÜüýOýŒýÈýþý,þOþdþlþhþXþ>þþôýÊý ýyýVý9ý#ýýý$ý>ýcý‘ýÆýÿý6þjþ™þÃþçþ ÿ,ÿQÿ|ÿ®ÿçÿ)sÁf¹T›ÝR£½ÍØÞäï9\¤ÃÜïý üæÄ—`%鲄cRNT`my~{q`H)Ò˜S£?ØvËÿ‰ÿTÿ)ÿÿÚþ²þ…þTþþìý¼ý”ýqýTý;ý%ýýýðüãüÙüÕüØüßüêüöüýýýýñüÜüÃü©üüxüfü[üWüZüeüyü”üµü×üùüý+ý5ý3ý$ý ýíüÊü§üˆürügühüwü’ü¹üêü!ý[ý“ýÇýõýþ8þKþUþSþFþ/þþæýºýŒýaý<ý!ýýýý4ýUý|ý§ýÑýùýþ>þ\þzþšþ¿þçþÿGÿÿ»ÿüÿBã;—ñF’Ó-I_s†›²Ìæ7VxžÆð5HK=ó¾†PøÚÄ´¨ž—““˜ ¨®¬œ~M º`¨SÀ€D Ðÿ–ÿ[ÿ"ÿìþ¸þ‰þ^þ5þ þäý»ý“ýnýLý0ýýýýýý"ý,ý4ý9ý:ý6ý-ýýýîüÐü°ü’üxüfü_übüoü†ü¦üÊüïüý+ý>ýEý?ý-ýýñüÌü©ü‹ütühüfünüüžüÄüñü"ýWýýÁýñýþ:þOþVþPþ<þþòýÃý”ýiýGý0ý#ý"ý)ý8ýJý`ýxý’ý¯ýÎýîýþ-þJþdþ~þ›þ¾þêþ!ÿfÿ·ÿnÍ'{ÈKƒ¶ã /Lbs¡»áI‡Äù"<GD5á¿›tJ!øÔ¸¨¥¯ÂÛò êÄ‘VЊDý´k"Û˜Y ìÿ¼ÿÿ^ÿ/ÿþþÉþ•þ`þ.þÿýÔý¯ýýzýkýdýbýgýqý}ýˆý‘ý”ý‘ý†ýrýVý3ý ýäü¾üžü‡ü|üüŽü§üÈüíüý.ýEýTýWýOý>ý$ýýäüÁü ü…üpüaü[ü_ülü„ü§üÖü ýKýŠýÄýöýþ3þ:þ2þ þþäýÂýŸý~ý_ýDý-ýýýý%ý:ýTýrýý©ý¼ýÉýÒýÙýäýöýþ9þlþ©þîþ9ÿ‡ÿØÿ)|Ò(~Ñ`•»Ôâì÷ Fv®ê%]¼à/;=3ùÊ”]*ÿáÑÏÙéü#$ øØ°~D»q'ÞšZæ²€Oëÿ·ÿÿIÿÿÕþœþfþ3þþàýÄý°ý£ý ý§ý´ýÆý×ýãýêýæýÖýºý•ýiý;ý ýãüÃü®ü¤ü¦ü´üÌüéüý%ý>ýQý]ýaý^ýUýFý0ýýòüËü£ü}ü\üHüAüKüeüŒü½üôü.ýfý™ýÆýêýþþ%þ#þþþýÜý´ý‹ýeýEý.ý%ý(ý4ýEýYýlýzýƒý†ý†ý‡ý‹ý”ý¤ýºýÖýõýþAþpþ©þíþ;ÿ–ÿùÿaÇ&x»ï3Le€žÁè<g’Áõ,f Ø,?B3ðÖmI*ýûÿ!-471!ã¶EÂBÌ•a.üʘf3ýÿÄÿˆÿHÿÿÇþ‰þRþ$þþíýãýåýñýþþ$þ/þ1þ(þþñýÈý™ýjý>ýýþüìüãüáüæüòüýý+ýEý_ývý‡ýýŒý|ý`ý9ý ýÞü²üüpü]üUüXüfü~ü üÉüøü.ýhý¡ýÓýûýþ"þþþèýÃýžýýgýVýNýMýOýQýSýSýSýUýYý_ýhýrý{ý€ý‚ýƒý„ýŠý™ý·ýåý&þvþÐþ1ÿ“ÿòÿI–ÜS‡·ä .Jcz”´ÝLØbÍðéË«ˆdE*  $6FSYWK6õËše-ò¸~Eâ·Œb8 ×^Ñÿ†ÿ<ÿöþ¸þ†þ`þIþBþHþUþdþsþ}þ€þyþhþPþ2þþêýÂý›ýsýMý,ýýýþüýý0ýQýrýý¨ý¶ýºý²ý ý†ýfýBýýðüÅüüyü\üJüFüTüsü¡üÛüýZý’ý¾ýÚýéýìýæýÛýÌý¼ý¬ý›ý‰ýwýeýTýEý<ý9ý>ýIýWýdýnýpýjýZýEý0ý ýý"ý9ý^ý‘ýÍýþYþ§þùþMÿ¢ÿøÿL›áOw•­Á×ñ9j£ä)p¸ý=t¡ÅÝèæÙÃ¥„cF/!)6DR^hli]I,Ú¨t> Ö¦zS/ ëÅše'ß;æÿ—ÿRÿÿìþËþµþªþ¨þªþ®þ³þ¸þ»þ¸þ°þ¡þ‰þhþ>þþÛý©ý{ýUý;ý/ý.ý6ýEýYýoý„ý™ýªý¹ýÅýÌýÈýºý¡ýzýHýýÒü™üküKü=üBüWüyü¢üÏüüü&ýKýkýˆý¡ýµýÃýÊýÈý½ýªýýtý[ýIý@ý@ýHýVýfýrýwýsýhýWýBý,ýý ýýýüý ý#ýBýlý¢ýäý1þ…þßþ;ÿ–ÿìÿ:~·æ -Hc€ŸÁéN‹Í`«ò2g«¹¼·ª˜‚kUB2'#%-9FTdpwwpbJ(ýÍšg7 êεƒc:Ê„9êšLÁÿ†ÿSÿ*ÿ ÿ÷þíþëþñþýþÿÿÿÿðþÑþ©þ{þLþþöýÑý±ý˜ýƒýrýiýhýoýý™ý¸ýÚýúýþþþÿýÙý§ýmý3ýþüÑü®ü–ü‡üüƒüüžü·üÚüý0ý^ýˆý«ýÁýÉýÅý¸ý¥ýý}ýoýiýiýnýtý{ý‚ý†ý‡ýƒý|ýsýeýUýAý,ýýýïüáüÜüâüöüýHý†ýÏý þtþÊþÿpÿ»ÿ?v¤Êè4Sy¨ßc­ùD‹Ì6\v„‰†|lZG6&#4H^q~‚{jN(þÒ©ƒcI4! öÛº‘a*î«bÄt(âÿ§ÿyÿ[ÿJÿCÿEÿKÿQÿSÿNÿEÿ7ÿ$ÿ ÿïþÑþ¯þˆþ\þ+þøýÉý¡ý„ýuýwýŠý¨ýÍýóýþ.þ:þ:þ.þþýýÛý³ýˆýZý)ýøüÌü¨üü„ü‡ü›ü»üäüý:ý_ý}ý’ýœýžý›ý”ý‹ý‚ý{ývýtýtýtývýyýý„ý‰ýŽýý‹ýýkýPý1ýýðüÕüÁüµü´ü¾üÔü÷ü&ýaý§ýöýJþ¢þøþHÿ’ÿÓÿ 7\}™´ÐïBv²öAŽÛ%j©à3N_fdYJ6!þ%?[sƒ‹ˆ}gK+ íϳšƒo]L;+úÕ¦l%Õ(ÖŒKìÿÍÿ´ÿ¡ÿ’ÿ†ÿ~ÿxÿvÿxÿyÿwÿmÿWÿ6ÿÿÎþþRþþíýÌý¹ý²ý¸ýÆýÙýîýþþ6þJþXþ^þZþJþ,þþÑýšý`ý)ýúüØüÂüºüÀüÒüëüý$ý?ýXýný~ý‰ý‘ý•ý•ýýˆý€ýyýsýrýuý~ýŠý—ý¢ýªý­ý«ý¡ý‘ý{ýcýFý$ýýÞüÀü©üšü–ü¡üºüâüýTýœýêý;þ‹þÙþ!ÿcÿ›ÿÉÿòÿ3Pn‘¹çT“Øg°úA‚¼ì(2/%óééñ*BXhrwwpbL2÷ؼ¥•Œˆˆ‡‚rV-ø¸p&Ü”O ËŽU!ôÿÒÿ½ÿ´ÿµÿ½ÿÆÿÍÿÌÿÀÿ©ÿˆÿ^ÿ-ÿøþÃþ‘þdþ:þþüýêýâýäýïýþþ=þ\þxþþ—þ“þþ]þ2þþÏýýoýIý+ýýýýýý ý5ýLýdýxý†ýŽýýŽýˆýý{ýwýuýwý{ýýŠý–ý¡ý¬ýµý»ý¼ý·ý©ý•ý{ýZý3ý ýãü¿ü üˆü}üüü­üÙüýPý—ýáý,þtþ¸þöþ.ÿ_ÿŒÿ´ÿÙÿüÿDk”¿ñ*j±þP¤ó:w¨ËâëìèâÛÖÖÚâîÿ+CZkw{r_D$ä˼¸º¿ÃÅÀ´Ÿƒb=ߥbÉw&Û˜a8 öÿãÿÉÿ©ÿ‚ÿUÿ$ÿðþ¹þ„þUþ.þþþþþ.þNþmþ‰þ¡þ±þ¹þ¶þ©þ’þtþMþþïý¿ý•ýpýSýBý;ý=ýEýRýaýpý}ý‡ýŽý“ý”ý’ýý†ý€ý{ýwýuýxý€ý‹ý™ý¨ý¸ýÇýÔýÚýØýÏý½ý¢ý}ýTý'ýúüÎü¥ü†üsümüvüŒü¯üßüýVý˜ýÛýþaþŸþÛþÿFÿrÿ˜ÿ¹ÿ×ÿòÿ/WˆÃT¦úL˜ÜIpŒ «°®¨¢ £­ÀÝ$D\jlbO8  øéÞ×ÒÏÌÊÊËÉŽ¯—tCÂrÌ~7øÃ˜yaOD??@@<3Öÿ¢ÿiÿ.ÿòþ»þ‹þfþLþ<þ7þ>þPþhþ†þ¤þÁþØþåþçþÝþÉþªþƒþWþ+þþÛýºý ýý‚ý}ý|ý€ýˆý‘ýšý¡ý¦ý©ý§ý ý–ýŒýƒýzýtýqýtý~ý‹ý›ý­ýÁýÖýçýñýõýñýáýÆý¡ýuýDýýâü·ü–üüsüqü|ü“ü´üÞüýIýŠýÏýþWþ—þÐþÿ*ÿJÿdÿ}ÿ–ÿ´ÿØÿ9tµûF”â0|Âþ+K_fd_\`nƒž¾á4CMPLE;. ÿïâ×ÏÎÓÝèóúùîÖ³‡Rφ;ð¦^轟‹‚ƒ|q\>èÿ³ÿxÿ;ÿÿþÊþþ{þfþ^þcþtþŒþ¨þÆþáþöþÿÿþþðþØþ¹þ—þrþKþ%þþãýÌý¼ý±ý¬ý¬ý±ý¶ý¹ý»ýºý¸ý³ýªýŸý”ýˆý{ýqýkýkýsý€ý’ý«ýÅýßýõýþ þþùýáýÀý™ýnýAýýèüÂü ü„üpüiüpü„ü¥üÔü ýMýýÒýþGþzþ§þÐþöþÿ8ÿTÿoÿŒÿ®ÿÕÿB‰Ú0†Ù%e˜¾Ùëø )?XsŽ«ÆÞô *13."ûçØÍÆÅÊÔÞèòúþüòßÁ˜d$Þ“Fù±q9 æÍ½¶´µ¶µ¯ †a4ýÿÀÿ‚ÿFÿÿâþ¿þ¨þžþžþ¨þ¹þÐþêþÿÿ&ÿ/ÿ1ÿ)ÿÿüþÝþ»þ—þrþQþ4þþþøýîýèýåýäýãýãýâýÜýÓýÆýµý£ýý|ýmýfýfýný}ý’ý¬ýÆýÝýïýþýþ þþúýçýÍý©ý{ýIýýãüµüüvüjüküxüü°üÚü ýCý~ý¼ýúý4þhþ”þ¸þÕþëþþþÿ+ÿMÿyÿ°ÿôÿB”ç8‚Äü)Op¦½Ñåù !:Ww™»Û÷ !"øêÝÒÈÄÆÍÙéú ùÖ¨p1ì¢V ŇQ' øðïñôôëÙ½™l7üÿÁÿˆÿRÿ!ÿúþÝþÍþÆþÊþÖþèþÿþÿ)ÿ8ÿAÿCÿ<ÿ-ÿÿÿãþÄþ£þƒþfþKþ3þ"þþþ þ þ þ þþ÷ýäýÍý´ýœý†ýtýjýfýfýjýrý€ý’ý§ý¿ýÙýòýþþþþþèýÄý™ýlý=ýýáü¹ü˜ü€üqümüvüŽü²üáüýUý•ýÒýþ3þVþpþ„þ•þ¨þÁþãþÿCÿÿÄÿ Sšá'g¢×*JcyŽ£ºÓð3Wzœ¼Ùð  ûëÛ˾¶µºÅÓåù %*'Þ­q+ÞBû»†]A.#èÇžl5ûÿÀÿˆÿUÿ+ÿ ÿøþîþîþöþÿÿ#ÿ2ÿ@ÿKÿQÿPÿJÿ=ÿ(ÿ ÿéþÆþ¦þ‰þrþaþXþRþNþJþDþ=þ2þ#þþþíýØýÂýªý•ý„ýwýoýnýtýý•ý®ýÉýæýþþ&þ-þ-þ$þþøý×ý±ý„ýRýýëü½ü—ü{üpüxüü³üáüýKý}ýªýÑýñý þ'þ=þSþkþ‡þ¨þÏþýþ3ÿpÿ³ÿùÿ@ˆÍ Ey¦Íî %>Vo‰¦Èë7`‡ªÇÜëñïçÝе©¡žž£¯ÂÙò #4<7%ØŸ[Æ|6öÀ”sZJCBDD@5!Ù§q8ÊÿšÿpÿMÿ/ÿÿÿ ÿÿ ÿ3ÿHÿ\ÿkÿqÿnÿcÿQÿ9ÿÿÿæþÍþ¶þ¢þ’þ†þ}þuþoþjþdþ^þSþEþ4þ þþëýÍý±ý˜ý„ývýrývý‚ý“ý§ý¾ý×ýñý þ þ5þEþLþGþ7þþïý¹ý}ý?ýýÕü­ü”üŠüŽüŸüºüÜüý.ýXý~ý¡ý¿ýÙýïýþþ)þBþ`þ…þ²þæþÿ]ÿŸÿãÿ(kªæNwš·Ðçû/Os›ÆñDg†¡¶ÃÊÊ嫚Š}tqw‡ž¼Ýý2>?4üÍ“S Å}9Õ´ž’ŽŒŠƒyjU:ðÃWåÿ³ÿˆÿdÿMÿBÿ@ÿFÿRÿ`ÿpÿ}ÿƒÿ…ÿÿvÿgÿTÿ=ÿ&ÿÿöþÞþÈþ·þ©þžþ˜þ•þ”þ’þŠþ~þlþUþ9þþûýÞýÅý¯ý›ýŠýýxýwý}ýŠý ý½ýßýþ)þHþ_þiþgþWþ:þþÝý¥ýlý7ýýßüÃüµü´ü½üÏüéüý)ýIýfý‚ý™ý®ýÁýÓýçýýýþ3þUþ}þ«þßþÿZÿžÿãÿ'f Õ&Fd˜³Ïï5[ƒ­×)OqŽ£®±ªœŠwg[UU^nƒºÛý2@A4è°r1ï°xGûß˽³¬¦ –†nO(ùÈNåÿºÿ™ÿ‚ÿtÿmÿlÿoÿuÿ{ÿÿ…ÿ‡ÿ‡ÿ‚ÿuÿcÿLÿ1ÿÿüþæþ×þÍþÆþÂþ¾þºþ³þ©þ›þ‹þyþfþOþ6þþÿýàýÁý¢ý…ýoý_ýWýZýhýý¢ýÈýñýþ>þXþgþiþ^þFþ þòý¿ýŒýZý-ý ýðüàüÙüÚüäüôüýý6ýPýiý€ý•ý§ý¸ýÉýÛýïý þ)þPþ~þ´þðþ0ÿqÿ±ÿïÿ*a’½ä ,Mj…¡¼Ø÷GxªÛ 7[u‡“—”Œ~o^K<35AWu›Äê #13'ëÀŽVâ¬xJ"íÞÖÓÓÒË»£ƒ\/ûÇ•d5 äÿÅÿ¯ÿ ÿšÿÿ¤ÿ¬ÿ´ÿ¹ÿºÿµÿ§ÿ”ÿÿjÿTÿ@ÿ-ÿÿÿ ÿþþõþíþåþÞþÖþÍþÄþºþ«þ˜þ€þdþAþþïýÆý¡ýýhýZýYýeý}ýžýÆýòýþAþ[þkþnþeþOþ0þ þáýµýˆý^ý8ýýýóüìüðüûü ýý5ýJý_ýpý}ý‰ý”ýŸý­ýÁýÛýýý&þTþ†þ¼þõþ/ÿiÿ¥ÿãÿXŠ·Ýü*@Yv—¼æCr¢Ó,Pmƒ‹lU='":Y~¤Èæÿ øØ­y>É’c>#ÿúõðçÙÆ®i< ×¢m?üÿèÿÜÿØÿÚÿÞÿàÿàÿÝÿ×ÿÍÿÀÿ°ÿ¡ÿ‘ÿ€ÿoÿ]ÿMÿ=ÿ.ÿÿÿ ÿÿÿÿÿþýþùþïþÞþÇþ§þþPþþíýÀýšý~ýoýnýyýŽý­ýÐý÷ýþ=þWþjþtþsþeþNþ/þ þàý³ý†ý^ý<ý"ýý ýýý$ý1ý<ýGýPýVý^ýiývýƒý”ý§ý½ýÖýôýþDþxþ²þñþ2ÿtÿ³ÿìÿ Nx½Ùõ+Gd…ªÕ7pªá?av}xjXC.,C`¤Èê æ¼‹W#ðÀ”oP7# úìÖ·b0üÊœvW>+ úÿõÿîÿåÿÚÿÐÿÅÿ·ÿ§ÿ–ÿƒÿpÿ\ÿHÿ8ÿ.ÿ)ÿ(ÿ+ÿ2ÿ9ÿ>ÿ;ÿ1ÿ ÿÿáþµþƒþPþþðýÈýªý˜ý’ý•ý¡ý·ýÓýóýþ5þSþlþzþ}þsþ^þ@þþïýÅý¡ýýeýPý?ý5ý.ý)ý'ý*ý1ý:ýCýJýRýYý]ýaýgýrýƒý™ý·ýÝý þAþzþ´þñþ/ÿjÿ£ÿØÿ ;f‹«ÆÝò @h™ÑQ‘Ëü&F\iomeXG6'&>^‚¨Îð $"á¼’c1þÏ¥fSIEB>7,þÛ³ˆZ+ÿ×´”y`L<.! ùÿðÿãÿÑÿ»ÿ¢ÿ‰ÿpÿXÿEÿ9ÿ4ÿ5ÿ;ÿGÿVÿcÿiÿiÿ`ÿNÿ4ÿÿåþ·þˆþWþ'þúýÕý¸ý¤ýžý¤ý·ýÓýôýþ7þRþeþoþoþhþZþEþ+þ þîýÎý­ýýtý`ýQýGýBýBýFýJýMýNýMýKýGýCý@ýCýLý[ýoýŠý­ýÔýÿý/þdþŸþßþ"ÿcÿ¢ÿÜÿ 5Sj~¢»Ü0dœØQŒÅø%G^lphXE3%-D_}žÀàü#,*⸈U#õή–†|vpg[I1ðË¥}U/ äÁŸ€hSA4-)&" úÿâÿÅÿ¨ÿŒÿrÿ^ÿRÿMÿOÿUÿ^ÿjÿwÿÿ‰ÿÿŒÿƒÿpÿTÿ/ÿÿÍþ—þbþ4þþöýåýßýäýòýþþ5þOþfþxþ…þþŽþˆþyþdþIþ*þ þëýÏý¸ý¨ýý”ýŽý‰ý„ý}ýsýjýcý\ýVýTýSýUýWýZýaýnýƒýŸýÆý÷ý1þpþ±þñþ-ÿcÿ“ÿ»ÿÛÿ÷ÿ)@Xu”·Þ >z¹ú<{´ã+/+# !7Rs˜¼Þÿ&(èÀ“e;ùàÌ»­Ÿ€p\D*ïά‡a:è¡…o`XTRNF9)üÿãÿÊÿ°ÿ˜ÿ€ÿlÿ^ÿTÿPÿRÿ[ÿjÿ|ÿÿ›ÿ¥ÿ¦ÿœÿ‰ÿmÿHÿÿíþ¾þþgþEþ)þþþþþþþ5þOþhþ}þþ—þ˜þþþkþUþ@þ+þþþ÷ýèý×ýÇý·ý©ýžý–ýý‹ý‡ýýyýnýbýUýIýAýBýMýaýý§ýÖý þ?þtþ©þßþÿ@ÿjÿÿ²ÿÏÿæÿúÿ $>_†·ñ0q³ô1g•ºØïýúóîíò6]‡±Ùú ïѰoR5ñÝÈ´¢~lYD+ 潑c8îÓ¼¨™‚wlaTE2åÿÆÿ¥ÿ‡ÿnÿ\ÿQÿNÿSÿ`ÿrÿ…ÿ–ÿ£ÿ«ÿ«ÿ£ÿ“ÿ}ÿbÿAÿÿñþÆþ™þoþIþ+þþþþþ+þ?þRþbþnþvþzþ{þxþsþlþdþXþGþ4þ þ þõýâýÓýÊýÄýÀý½ý¹ý²ý§ý—ý‚ýný\ýLý@ý9ý;ýCýQýeý‚ý¦ýÑýþ6þmþ¥þÙþÿ1ÿTÿqÿˆÿšÿ«ÿ¾ÿÕÿñÿ>q¨âZ—Ñ ?p›¼ÔâæäÜÑÈÄÆÎßùAi’¸×îûþöé׬“wZ<îÛͶ¨˜„kN+à¸iE$íׯ¸¬£œ”‰yaE&Ýÿ¹ÿœÿ…ÿvÿmÿkÿnÿvÿ€ÿ‹ÿ˜ÿ¦ÿ²ÿ»ÿ½ÿ¹ÿ¬ÿ•ÿsÿJÿÿïþÁþ˜þwþ^þNþEþ@þ?þBþGþNþUþ_þjþvþþ…þ…þ€þtþbþMþ9þ&þþþýý÷ýñýëýåýÛýÐýÃý´ý¢ýý~ýlýYýIý<ý4ý2ý7ýEý]ýý©ýÙý þBþvþ£þËþìþÿÿ5ÿIÿ_ÿxÿ‘ÿ­ÿÍÿñÿGy²ð1q¯ê NsŽž¦¦Ÿ—’’˜¥ºÖõ7Ww“ª¾ÎÙÝÚÐÀ¬“w[A)ñãÕǶ¤ŽuZ<úÕ¬…_:ìà×ÐÉÀ²Ÿ†jL- ìÿÏÿ´ÿœÿ…ÿsÿhÿdÿhÿrÿ‚ÿ•ÿªÿ»ÿÆÿÈÿÁÿ°ÿ—ÿxÿWÿ5ÿÿóþÓþ¶þ›þ‚þlþ\þQþNþQþYþeþrþþ‰þþŽþŠþ‚þvþhþ[þOþDþ9þ0þ'þþþþþýýôýêýßýÑý¿ýªý‘ývý]ýHý9ý3ý7ýGý`ý€ý¤ýÌýöýþGþmþþ²þÑþíþÿÿ0ÿDÿZÿqÿ‹ÿ©ÿÌÿõÿ$[™Û_žÔ$<MW\^`djr~Ž¢¹Òï.Mj…›ª±±« }iVC0 ùéÛÌ¿³¤‘xZ8漕rU<) õéÛÌ»©•|`@öÿÑÿ¯ÿ’ÿÿwÿyÿÿŽÿÿ­ÿ»ÿÃÿÆÿÅÿÁÿ¸ÿ«ÿ™ÿ‚ÿgÿHÿ$ÿÿþÛþ¹þ›þƒþrþjþgþiþnþuþ{þþ€þ~þ|þyþtþlþdþ[þOþBþ3þ%þþþþþþþþ þúýçýÎý°ý’ýuý[ýFý5ý,ý,ý4ýDý[ývý—ýºýàýþ,þRþwþ™þ·þÒþéþûþ ÿÿ%ÿ9ÿSÿuÿŸÿÒÿ JŠÉCv¡Çåü $,28=FRbw’±Óõ2Lar}„†ƒ|o_M9$úòëäÜd@õÒ³•x]E/üôéØÀ zQ(ßÿÃÿ­ÿŸÿ—ÿ”ÿ•ÿ™ÿ¡ÿ«ÿµÿ¿ÿÉÿÑÿ×ÿÖÿÏÿÀÿªÿŽÿkÿFÿ#ÿÿçþÎþºþ¬þ¡þ—þþ‹þŠþ‹þþ’þ•þ—þ•þŒþ€þqþbþRþDþ:þ4þ2þ3þ5þ8þ;þ;þ6þ+þþþéýËý¬ýývý`ýNýAý:ý:ý?ýJý\ývý”ý¸ýÞýþ-þQþoþˆþœþ¬þ¸þÂþÍþÝþñþ ÿ-ÿWÿ‰ÿ¿ÿ÷ÿ2m§àDo”²ÈØäìòø0E^y•²Ðî (@R_ec[O@2& þòäѼ¦ŽtV5îɤ‚fQC940-&ïÒ°iG&ìÿÔÿÀÿ¯ÿ¢ÿœÿÿ¤ÿ±ÿÁÿÑÿàÿêÿìÿèÿÝÿÏÿ¼ÿ¦ÿÿsÿXÿ;ÿÿÿèþÒþÀþ³þ¬þ©þ©þ«þ¬þ¬þ«þ¥þ›þŽþ~þnþ_þQþFþAþAþDþHþLþPþQþMþDþ7þ'þþýýäýÉý®ý’ýwý]ýIý;ý2ý0ý7ýFý]ý{ýýÁýæýþ&þ?þSþbþoþzþ…þ“þ£þ·þÏþíþÿ<ÿkÿ ÿÙÿPŠÀñDc|‘¢±¾ÊÖãïü !;YyžÂä%/331/-*%  ûôìâÔî’oI"úÓ±•€qf]VMC6&ìÓ¸™vQ+éÿÐÿ¾ÿµÿ²ÿµÿ»ÿÃÿÌÿÕÿÝÿåÿêÿìÿëÿäÿ×ÿÆÿ±ÿ™ÿ~ÿ^ÿ>ÿ!ÿ ÿôþäþÙþÓþÑþÑþÐþÍþÇþ¾þ±þ¢þ’þƒþuþiþ`þ[þYþZþ\þ_þcþfþhþfþbþ[þQþCþ0þþþýßý¿ýŸý€ýeýPýCý@ýFýTýhýýý»ýÙýõýþ%þ:þJþXþcþlþvþþþ¢þ»þÜþÿ1ÿcÿ™ÿÑÿ=o ÏùA^u…˜Ÿ¦°ÀÕð-NnŒ¦½Óæõ  û÷õõ÷ù÷ïáͰjE"áŬ•€m^SKD>6,îάˆc@ íÿÚÿËÿÂÿ¾ÿ½ÿÀÿÆÿÐÿÚÿäÿîÿöÿùÿ÷ÿîÿßÿÊÿ°ÿ•ÿxÿ]ÿEÿ1ÿ"ÿÿ ÿÿÿþþøþðþæþÙþÊþºþ«þþ‘þ†þ~þyþvþtþsþuþyþþ„þ‰þŒþŠþƒþvþcþIþ+þ þåýÃý£ý‡ýrýbýZýYý^ýiýzýýªýÄýÞýöý þþ(þ/þ5þ;þCþMþ\þoþˆþ¤þÅþéþÿ>ÿnÿ¡ÿØÿH}«Ôö%5BO\j|¥½Öï &D`|™²ÇÖàããáàáåêòúûïà͸bBüÛ¾¥voje_WL<& ñÓ´”uW9ðÿáÿÖÿÑÿÒÿØÿâÿîÿùÿ üÿîÿÛÿÄÿ­ÿ–ÿÿoÿ^ÿPÿFÿ<ÿ4ÿ+ÿ ÿÿ ÿýþðþâþÓþÅþ·þ¨þšþþ…þþ}þ~þƒþ‹þ”þþ¥þ©þ©þ¢þ•þƒþlþQþ3þþñýÑý³ý˜ý‚ýtýpýrý}ýŒýžý³ýÆý×ýçýôýþ þþþ)þ2þ<þEþRþaþtþŒþ«þÐþýþ/ÿcÿšÿÐÿ3_†§ÄÝõ  2BP_n€•¯Îð1Mex…˜ ¨°¹ÂËÓÚáçëíìèàÓÁ¨ŒmJ&åʳ¢–Œ…}umdXK<*þâĤƒbC(õÿðÿðÿöÿþÿ ýÿîÿÝÿÊÿ¹ÿ¨ÿ™ÿŠÿ|ÿqÿfÿ\ÿRÿHÿ>ÿ5ÿ+ÿÿÿÿïþÜþÉþ¸þ«þ þ›þ™þ›þ þ¦þ­þµþ¼þÂþÆþÅþ¾þ±þþƒþbþ>þþøýÚýÁý­ý ý™ý—ý˜ýžý§ý±ý½ýËýÚýéý÷ýþ þþþþ þ"þ)þ5þFþ^þ~þ¤þÎþúþ(ÿWÿ†ÿ´ÿáÿ;eŠªÄÙéö#8Rn¬Êæ,?N]ju‰’›£­·ÄÒÝçíîéÝʲ—yY:éÒ¾®¡•‹ƒ}wof\N;$êɧ„cG0 úÿîÿàÿÑÿÂÿ²ÿ¤ÿ–ÿ‹ÿƒÿ|ÿuÿnÿeÿ\ÿOÿ@ÿ0ÿÿ ÿüþëþÜþÎþÂþ¸þ´þ³þ·þÀþËþØþäþîþòþñþéþÜþÇþ­þþqþRþ4þþÿýêýØýÉý½ý¶ýµý¸ýÀýËýÚýêý÷ýþþ þ þþþ þþþ$þ4þFþ[þuþ”þ·þàþ ÿ=ÿoÿ¡ÿÑÿýÿ#D`w ²ÆÛò $?Yt©ÂÛñ&1:BKUbq‚”¨¹ÈÓÚÜØÏÁ¯šgL1üäϽ®¡—‘މ…vjYD* ìɧ‰mWE7/*%###&'&$ ÿÿóÿçÿÚÿÎÿÅÿ¼ÿ´ÿ«ÿ£ÿšÿ“ÿ‹ÿ€ÿvÿjÿ\ÿKÿ8ÿ#ÿÿûþêþÝþÓþÐþÒþÙþäþðþýþÿÿÿÿÿüþíþÜþÇþ¯þ•þwþVþ7þþþîýâýÜýÜýßýäýêýðýöýúýýýþþþ þ þ þ þþþþ þ0þFþbþ„þ¬þØþÿ1ÿ^ÿ‡ÿ®ÿÑÿñÿ+E^v¢¸Îç:Wt§»ÍÛçòü#3FYn‚”¤°ºÁ¿¸¬Št\B(öáͼ°§¢ ž›—Žp[C( ìα–}gVI@9542/,)$ûÿðÿäÿÙÿÏÿÆÿ½ÿ·ÿ²ÿ­ÿ©ÿ£ÿ›ÿ‘ÿ…ÿuÿ`ÿHÿ0ÿÿÿ÷þíþçþåþçþêþïþöþÿþÿÿÿÿÿÿÿÿòþÙþ¼þžþþeþLþ7þ&þþþþþþþþþ þþþþþþþþþ þ þ þþ$þ8þPþmþŽþ±þÖþýþ%ÿLÿsÿ˜ÿ»ÿÚÿ÷ÿ(?Vl„ž¹×õ/Iav‰š©¶ÃÎÛêú 0DXl~œ¥«®­© ‘hO5îÛÍÁ¹´°¬¨£›‚q[B& îѶžˆufYOGA=950,& ôÿèÿÜÿÓÿÍÿÉÿÈÿÈÿÈÿÅÿ¿ÿµÿ¨ÿ—ÿ„ÿqÿ]ÿKÿ9ÿ'ÿÿ ÿþþöþòþòþ÷þÿþ ÿÿ%ÿ/ÿ6ÿ8ÿ6ÿ.ÿ ÿÿüþæþÏþ¸þ þˆþqþ[þHþ8þ+þ$þ!þ!þ$þ)þ-þ0þ2þ/þ,þ&þ þþþþþþþþ%þ7þMþfþ„þ¥þÉþïþÿ8ÿYÿxÿ•ÿ±ÿÊÿãÿúÿ,Gc›·Óî4FVer~‹˜©»Íßò-BVhx…Ž’’‹r`K5ôãÕʼ·´°«¤›€mYA(öÞDZœŠzmc\WTPKD;.!ýÿõÿïÿìÿèÿæÿäÿáÿÝÿØÿÑÿÇÿ½ÿ²ÿ¤ÿ“ÿ€ÿkÿUÿAÿ-ÿÿÿÿÿÿ ÿÿÿ&ÿ/ÿ6ÿ:ÿ=ÿ=ÿ:ÿ5ÿ+ÿÿ ÿøþáþÈþ¯þ—þ‚þoþ`þUþMþGþDþBþAþAþAþ@þ>þ<þ8þ3þ,þ&þþþþþþ þ,þ=þSþmþ‰þ¨þÆþæþÿ#ÿAÿ^ÿyÿ“ÿ¬ÿÆÿßÿùÿ0Nlˆ¤½Óèû *:HUdr€’£µÉÞô 4HXelnleYJ9&ÿíÝÏÄ»µ°¬§¡™†{m]K5ìÔ½©™‹zrkd[QG;0&ûÿõÿðÿìÿéÿçÿæÿäÿáÿÝÿÖÿËÿ¼ÿ«ÿ—ÿÿlÿXÿFÿ8ÿ.ÿ'ÿ!ÿÿÿ"ÿ'ÿ.ÿ6ÿ>ÿGÿMÿQÿRÿOÿGÿ;ÿ-ÿÿÿñþÜþÇþ´þ¢þ’þ„þxþpþjþeþdþcþcþbþ`þ[þTþLþBþ8þ0þ)þ"þþþ"þ)þ5þFþZþrþŒþ§þÃþÞþøþÿ*ÿCÿ]ÿvÿÿ«ÿÈÿäÿ8Tn‡ž´ÇÚëü &2>LYi{¦¾Õí,<GNPKD8) úëÝÐÅ»²«¥¡™”Ž„xhT>(ûæÔô¨œ‘†}sjaWMC8-  ûÿ÷ÿõÿõÿõÿ÷ÿöÿòÿìÿãÿ×ÿÉÿ¹ÿ¨ÿ•ÿ‚ÿoÿ]ÿLÿ=ÿ1ÿ(ÿ"ÿÿ ÿ$ÿ,ÿ4ÿ=ÿEÿLÿPÿQÿOÿJÿCÿ8ÿ+ÿÿÿôþßþÊþ·þ¦þ—þŒþƒþ}þyþuþrþoþlþhþcþ^þWþMþDþ9þ/þ'þ"þ þ"þ'þ1þ>þNþaþuþ‹þ¡þ¶þÌþãþùþÿ*ÿDÿaÿ|ÿ˜ÿµÿÐÿìÿ!<Wqˆž±ÃÒßíù(6G[qФ¾×î )./-'ùêÛÎÁ·°«§¤¢Ÿ™‘‡yjZI7%ïÜÍ¿±§”‹ƒynaSF7+! ýÿ÷ÿïÿäÿÖÿÆÿ´ÿ¡ÿŒÿxÿeÿUÿHÿ>ÿ7ÿ3ÿ2ÿ3ÿ7ÿ=ÿCÿKÿRÿZÿ`ÿaÿ_ÿZÿRÿEÿ6ÿ'ÿÿÿðþÞþÎþ¿þ±þ§þžþ˜þ“þþŒþ‰þ„þ~þwþmþbþWþLþAþ9þ3þ0þ1þ5þ;þCþNþZþgþvþ†þ˜þ¬þÀþÖþìþÿÿ4ÿLÿfÿÿžÿ»ÿ×ÿóÿ*D]uŠœ¬»ÆÑÚäïû /E[t¥¼Ñäõ þñäØÌý·³®©¥Ÿ˜‘‰~rdTB0 úëÝÏÄ»±§œ‘…xk^PC7-%  öÿêÿÛÿËÿºÿ¨ÿ•ÿƒÿqÿaÿTÿIÿAÿ>ÿ>ÿ@ÿFÿLÿSÿZÿaÿfÿhÿhÿfÿ`ÿWÿLÿ?ÿ/ÿÿ ÿûþêþÜþÐþÆþ¾þ¸þ´þ°þ¬þ§þ¡þ™þþ„þxþmþcþYþQþKþFþDþDþDþHþNþVþaþnþ{þŠþ›þ¬þ¿þÒþçþûþÿ*ÿBÿ[ÿuÿ‘ÿ®ÿÌÿêÿ!;Tj|Œ™¥°ºÃÏÛéø /E\t¥¼ÑâïøüüûöðçÞÖÍﵝª¦¡œ˜’‰€teVD3#÷êÝÒǼ°¥šŽ‚vj\OB6,$ ÷ÿéÿÙÿÈÿµÿ¡ÿÿ~ÿpÿeÿ\ÿWÿUÿVÿXÿ\ÿcÿhÿnÿtÿxÿzÿ{ÿyÿqÿgÿ\ÿMÿ<ÿ,ÿÿÿÿùþðþéþâþÜþÕþÏþÊþÃþºþ²þ§þþ’þˆþþuþmþfþaþ^þ]þ]þ`þeþlþuþ€þ‹þ˜þ§þ¶þÅþÖþçþúþÿ$ÿ<ÿUÿqÿŽÿ«ÿÈÿåÿÿÿ0EWix†’œ¦°ºÄÐÞð/Haz‘¥¸ÇÒÜâååáÛÕÎÆ¾·²¬§£Ÿ›–…{pbUH:+ÿóçÝÓȾ³¦šŒ~qdVJ@6-&!!#"  ýÿîÿÞÿÍÿ¼ÿ«ÿšÿŒÿÿsÿlÿeÿaÿbÿeÿjÿpÿwÿ}ÿÿ„ÿ…ÿÿ{ÿsÿiÿ]ÿQÿCÿ6ÿ*ÿÿÿ ÿÿúþòþìþæþÞþÖþÎþÅþ½þ´þªþŸþ–þþ„þ|þvþpþlþkþlþoþsþyþ‚þŠþ“þœþ§þ³þÁþÐþàþòþÿÿ6ÿPÿkÿ†ÿ£ÿ¿ÿÚÿôÿ #8K\kxƒ•ž©µÄÔæú&>Tk‚—©¹ÅÎÔÖÖÕÒÎÉÅÀ»·²®©¤ž—‡|ocVH<.! ÿôêßÔɽ°¢•ˆzk_QE<3,)'')+-.-+'!øÿéÿØÿÆÿµÿ¥ÿ–ÿ‰ÿ€ÿxÿuÿtÿvÿzÿ~ÿƒÿˆÿÿÿÿŽÿŠÿ„ÿ|ÿsÿiÿ^ÿSÿIÿ?ÿ5ÿ,ÿ#ÿÿÿ ÿÿÿøþñþëþâþÙþÏþÆþ¼þ±þ§þŸþ˜þ’þŽþŒþŠþŠþŒþŽþ’þ—þœþ£þªþ²þ¼þÈþÖþåþöþ ÿÿ6ÿOÿiÿ„ÿ ÿ»ÿÕÿîÿ->MYcmw€‰” ­¾Ðäù(@Wl©²¸¼¾½¼º¶´°­«¨¥¡›•†|qf[OC8.#úðæÜÒÇ»­Ÿ€qbVLC=96444579974/(òÿáÿÐÿ¿ÿ°ÿ£ÿ™ÿ‘ÿÿŠÿŠÿŒÿÿ’ÿ–ÿ™ÿœÿžÿœÿ™ÿ•ÿÿ‰ÿ€ÿwÿnÿdÿ[ÿQÿHÿ?ÿ7ÿ0ÿ)ÿ#ÿÿÿ ÿÿüþòþèþÝþÔþÊþÂþºþ³þ¬þ§þ£þ¡þŸþžþŸþ þ þ¢þ¥þ©þ®þ´þ½þÇþÑþÞþïþÿÿ.ÿGÿaÿ|ÿ—ÿ²ÿËÿãÿúÿ 0=IS\enxƒ °ÂÖì/EZl|‹•ž¥©«¬¬­­¬«©§£Ÿ›•†}tkaVK@5+" øïåÚ̾° ‘ƒuh]SJB><;;<>ACCB>80%øÿèÿÙÿËÿ½ÿ²ÿ©ÿ¢ÿŸÿžÿœÿÿŸÿ¢ÿ¥ÿ¦ÿ§ÿ§ÿ¦ÿ£ÿŸÿ™ÿ’ÿ‹ÿƒÿ{ÿrÿiÿaÿZÿSÿKÿEÿ>ÿ6ÿ.ÿ%ÿÿÿ ÿÿþôþêþâþÚþÒþÌþÅþ¾þ¹þµþ³þ±þ¯þ¯þ¯þ®þ®þ¯þ±þ´þ¸þ¾þÆþÐþÝþìþþþÿ)ÿAÿ[ÿuÿÿ¨ÿÁÿØÿîÿ-8BKU^hs€ŽŸ²ÇÜñ1EWfr{…“™œžŸŸ  žš–’†~vncXNE<3*" úðåÚÍ¿±£”…wk_UMGCABDFHJKKID=4) þÿñÿäÿ×ÿÌÿÁÿ¹ÿ´ÿ±ÿ¯ÿ¯ÿ¯ÿ°ÿ²ÿ³ÿ´ÿ´ÿ³ÿ±ÿ®ÿ¨ÿ¢ÿœÿ•ÿŽÿ‡ÿ€ÿzÿtÿlÿeÿ_ÿXÿPÿHÿ@ÿ7ÿ.ÿ%ÿÿÿÿýþôþëþãþÜþÕþÐþÌþÈþÅþÁþ¾þ¼þºþ¹þ¸þ¸þ¹þ¹þ¼þÁþÇþÒþÞþíþþþÿ&ÿ>ÿWÿpÿˆÿ ÿ·ÿÌÿàÿóÿ&1:BKVao‘£¶Êßô+;KXcnv|‚†‰ŒŽ‘І€yrjaYOG?70)" þôêÞÒĵ¦—‰{ncZSNLLMOQSUUSPKD:/# üÿïÿäÿØÿÏÿÈÿÃÿÀÿ¾ÿ¾ÿ¿ÿ¾ÿ¿ÿ¿ÿ¾ÿ½ÿ»ÿ¹ÿ´ÿ¯ÿ«ÿ¦ÿŸÿ™ÿ“ÿŒÿ†ÿÿ{ÿuÿoÿiÿaÿYÿQÿHÿ>ÿ4ÿ+ÿ!ÿÿÿÿýþöþîþéþåþàþÜþÙþÔþÑþÏþËþÈþÅþÄþÄþÃþÅþÊþÑþÚþåþóþÿÿ+ÿAÿYÿqÿ‡ÿžÿµÿÈÿÚÿëÿùÿ$.8BMYfu…—©¼Îáô&4@KU^ekqvy}€€}ytohaYPIB:2-'! üóèÜϳ£”†xmd[URPOPRTUWVURME<1& öÿëÿáÿÙÿÓÿÏÿËÿÈÿÇÿÆÿÅÿÄÿÄÿÂÿÀÿ¿ÿ»ÿ·ÿ´ÿ°ÿªÿ¦ÿ¡ÿÿ—ÿ’ÿÿ‡ÿ‚ÿ|ÿuÿmÿdÿ\ÿSÿJÿ@ÿ6ÿ,ÿ#ÿÿÿ ÿÿþþùþôþïþëþçþâþÝþÙþÕþÐþÌþÊþÇþÇþÉþËþÑþÙþåþòþÿÿ'ÿ<ÿRÿhÿ~ÿ“ÿ§ÿºÿËÿÚÿèÿôÿÿÿ (3>JWfv†—©¼ÍÞïþ '3=FOX_dinqrssokgb\UNF?81*%! ùïåÙ˽¯¡’„xnd]WURQSUVWXWVQLE<1'üÿóÿêÿâÿÜÿÙÿÕÿÑÿÐÿÏÿÍÿÌÿÊÿÇÿÇÿÅÿÁÿ¾ÿ»ÿ¸ÿ´ÿ°ÿ¬ÿ§ÿ£ÿŸÿšÿ”ÿÿ‰ÿÿyÿqÿiÿ`ÿWÿMÿDÿ;ÿ2ÿ*ÿ#ÿÿÿÿ ÿÿÿüþøþóþíþçþáþÛþÖþÑþÏþÍþÍþÐþÕþÜþçþõþÿÿ(ÿ=ÿRÿfÿzÿŽÿ¡ÿ²ÿÂÿÑÿÞÿèÿóÿþÿ%0=JYhxˆ™ª»ËÛé÷(2<ELSX\`bba`\XRLF?81+%  úòèÞÒÅ·©›ukb[XUSTUVWWWVSOJB90'ÿÿ÷ÿïÿçÿáÿÞÿÙÿÖÿÔÿÒÿÏÿÎÿÌÿÊÿÈÿÅÿÃÿÁÿ¾ÿ»ÿ·ÿ´ÿ±ÿ®ÿªÿ¥ÿ ÿœÿ•ÿŽÿ‡ÿ€ÿwÿoÿfÿ\ÿSÿLÿCÿ;ÿ4ÿ-ÿ(ÿ#ÿÿÿÿÿ ÿÿýþöþðþéþâþÜþ×þÓþÐþÑþÒþ×þßþéþõþÿÿ&ÿ9ÿLÿ_ÿrÿ†ÿ—ÿ§ÿ·ÿÄÿÐÿÜÿçÿðÿùÿ $/;IXgu…•¤³ÃÒßìú'1:BHLPSTSRNID>82+&!  ûôìãØÎÁ³¦˜‹ukc^YVVUUVVWWURNHB:2) ýÿôÿíÿèÿãÿßÿÛÿØÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÃÿÁÿ¾ÿ»ÿ¹ÿ¶ÿ²ÿ®ÿ¨ÿ£ÿžÿ—ÿÿ‡ÿÿwÿnÿfÿ^ÿVÿNÿGÿAÿ;ÿ6ÿ1ÿ+ÿ'ÿ"ÿÿÿÿ ÿÿûþóþíþçþáþÝþÛþÚþÜþàþçþñþüþ ÿÿ(ÿ:ÿMÿ_ÿoÿ€ÿ‘ÿ ÿ®ÿ¼ÿÈÿÒÿÜÿæÿñÿûÿ&2?KYguƒ’ ¯½Ê×äñý%,49=?@?=:50+&  þúöñëäÛÐŬž‘…zpga\XVUTUVVVVURNJD=5-% þÿ÷ÿòÿíÿéÿæÿâÿßÿÜÿÚÿØÿÖÿÔÿÓÿÒÿÐÿÏÿÍÿÊÿÇÿÅÿÂÿ¾ÿºÿµÿ°ÿªÿ£ÿœÿ•ÿŒÿ„ÿ{ÿsÿjÿcÿ\ÿUÿOÿJÿDÿ?ÿ:ÿ5ÿ/ÿ)ÿ"ÿÿÿ ÿÿüþõþîþçþâþßþßþáþåþêþñþýþ ÿÿ%ÿ6ÿFÿWÿfÿvÿ†ÿ“ÿ ÿ­ÿºÿÄÿÏÿÚÿãÿíÿøÿ $0<IWdq›©¶ÃÐÝéõ  %),-+*'# þüú÷óðêãÜÓȽ±¤˜Œ€tld^XUTSSSSTUTRPMIC>70(  þÿùÿôÿðÿìÿèÿåÿâÿàÿÞÿÝÿÛÿÚÿÙÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÈÿÄÿÀÿ»ÿµÿ®ÿ§ÿ ÿ˜ÿÿ‡ÿ€ÿxÿqÿjÿdÿ_ÿYÿSÿNÿJÿEÿ>ÿ8ÿ1ÿ)ÿ!ÿÿÿÿÿ÷þòþíþéþçþèþëþðþ÷þÿ ÿÿ&ÿ6ÿDÿSÿcÿrÿ€ÿŽÿ›ÿ¨ÿ³ÿ¾ÿÉÿÓÿÝÿæÿñÿûÿ'2>JWcp}‹˜¤³ÀÍÚåðú  ÿüú÷õôòðïëçáÚÒÊÀ´©ž‘…zpg`ZUQONMMNNNMMKGC?93-' ÿÿúÿõÿðÿìÿêÿæÿãÿáÿÞÿÜÿÛÿÚÿØÿØÿ×ÿÖÿÕÿÔÿÒÿÏÿÌÿÊÿÄÿ¿ÿºÿ´ÿ­ÿ¥ÿžÿ—ÿÿˆÿ‚ÿ{ÿuÿpÿjÿeÿ`ÿ[ÿWÿPÿKÿEÿ=ÿ5ÿ.ÿ%ÿÿÿ ÿÿýþøþôþðþñþóþ÷þýþÿÿÿ&ÿ4ÿBÿPÿ_ÿlÿzÿˆÿ”ÿ ÿ¬ÿ¶ÿÁÿËÿÕÿÞÿèÿòÿûÿ$/:EQ]ivƒª·ÄÐÛæï÷þ    ýùõòðïíëêéæãáÝÙÒËù¯¤™„zpg`[VRRQOOPPONNLIFB<61,% üÿøÿôÿðÿìÿéÿæÿäÿãÿâÿàÿßÿßÿÞÿÝÿÜÿÛÿÙÿÖÿÓÿÏÿËÿÆÿÁÿ»ÿ´ÿ­ÿ¦ÿŸÿ™ÿ’ÿ‹ÿ†ÿ€ÿ|ÿwÿrÿnÿhÿdÿ_ÿXÿQÿJÿBÿ9ÿ0ÿ'ÿÿÿ ÿÿÿüþúþùþûþþþÿ ÿÿÿ)ÿ5ÿAÿNÿ\ÿjÿvÿƒÿÿ›ÿ¦ÿ±ÿºÿÅÿÏÿØÿáÿëÿôÿýÿ$.9DO[gs€š§´ÀËÖàèïôøûüüúøöóðíëèæåãââàßÜÙÖÑËż²¨ž”ˆ~vme_ZVSRPOPPOPONMKGC?:5/*$ÿÿüÿøÿôÿñÿïÿíÿëÿêÿéÿèÿçÿçÿæÿäÿãÿáÿßÿÜÿØÿÔÿÏÿÉÿÃÿ½ÿ·ÿ°ÿ©ÿ£ÿžÿ˜ÿ‘ÿŒÿˆÿ„ÿÿ{ÿvÿpÿjÿdÿ]ÿVÿMÿDÿ:ÿ1ÿ(ÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿ)ÿ4ÿ@ÿKÿWÿcÿpÿ|ÿ‡ÿ“ÿžÿ¨ÿ±ÿ»ÿÅÿÎÿÖÿßÿèÿðÿùÿ )2>ITamz†“ ­¸ÂÌÕÜáæéêêêéçäâàÞÜÚÙÙØØ×ÕÓÑÍÉü´¬£™‡~ulf`ZVTRPOOPOONMKIFD?:61,&! þÿúÿ÷ÿõÿóÿðÿïÿíÿìÿìÿìÿëÿêÿêÿéÿæÿåÿãÿßÿÛÿÖÿÑÿÌÿÆÿ¿ÿ¹ÿ´ÿ®ÿ¨ÿ£ÿŸÿšÿ•ÿ‘ÿÿˆÿ‚ÿ}ÿxÿqÿjÿcÿ[ÿRÿHÿ?ÿ5ÿ,ÿ%ÿÿÿÿÿ ÿ ÿÿÿÿÿ&ÿ/ÿ9ÿCÿMÿYÿdÿoÿ{ÿ†ÿ‘ÿ›ÿ¤ÿ®ÿ·ÿÀÿÉÿÒÿÚÿãÿëÿóÿüÿ )3>IUbny†’ž©³½ÅÌÑ×ÚÛÜÛÚÙ×ÔÒÑÐÏÎÎÍÍËÊÉÆÃ¾º´¬¤œ“Šxph`[VQNMLKKJIIIHFEC@=:50,'" ÿÿúÿøÿöÿóÿñÿðÿïÿïÿîÿîÿíÿíÿìÿêÿèÿæÿãÿßÿÛÿÖÿÒÿÌÿÆÿÁÿ¼ÿ·ÿ±ÿ­ÿ©ÿ¤ÿ ÿÿ™ÿ”ÿÿŠÿ…ÿ~ÿwÿpÿhÿ^ÿUÿLÿBÿ9ÿ1ÿ)ÿ"ÿÿÿÿÿÿÿÿ!ÿ(ÿ0ÿ9ÿBÿMÿXÿcÿmÿxÿ‚ÿŒÿ—ÿ ÿ©ÿ³ÿ¼ÿÄÿÌÿÔÿÜÿäÿëÿôÿüÿ )3=ITamz…‘›¦°·¿ÅÉÌÎÏÐÏÎÍËÉÈÈÇÆÆÅÅÅÄÁ¿¼¹´­¦Ÿ–Ž…|skc\VROLIHGFFFGGGFDB@=961,'# ýÿúÿøÿ÷ÿöÿõÿôÿôÿóÿóÿóÿòÿñÿðÿîÿëÿçÿäÿáÿÜÿØÿÔÿÎÿÈÿÃÿ¾ÿ¹ÿµÿ±ÿ­ÿ©ÿ¦ÿ¢ÿÿ™ÿ”ÿÿ‰ÿ‚ÿzÿqÿiÿaÿXÿNÿFÿ>ÿ6ÿ/ÿ)ÿ%ÿ"ÿÿ ÿ"ÿ%ÿ*ÿ0ÿ6ÿ>ÿGÿOÿXÿbÿlÿwÿÿ‹ÿ”ÿžÿ§ÿ¯ÿ·ÿ¿ÿÇÿÎÿÕÿÜÿäÿëÿòÿúÿ '1;FS_jv‹– ¦­³·º½¾½½¼¼¼»¹¸¸¸¸¸¹¹¸¶´²®ª¤–‡~vnf^XSNJHFDCCCCDEEDCA><962.*%  þÿüÿûÿûÿúÿùÿùÿúÿúÿùÿùÿùÿöÿôÿóÿðÿíÿèÿäÿàÿÛÿÖÿÒÿÍÿÈÿÄÿÀÿ½ÿºÿ·ÿ³ÿ¯ÿ¬ÿ¨ÿ£ÿÿ—ÿ‘ÿ‰ÿÿyÿoÿeÿ[ÿRÿIÿ@ÿ9ÿ2ÿ-ÿ)ÿ&ÿ&ÿ'ÿ)ÿ-ÿ2ÿ7ÿ>ÿFÿOÿWÿ`ÿjÿsÿ|ÿ†ÿÿ—ÿ ÿ¨ÿ¯ÿ¶ÿ¾ÿÅÿÍÿÓÿÚÿàÿçÿïÿöÿþÿ#.8CO[fq}‡—ž¤¨¬¯°±±±°¯¯®­­®®®¯¯®­¬©¦¢—ˆ€xqi`YSNHEB@?>>@@??@?>=<:740-*%  ÿÿýÿüÿüÿûÿûÿûÿûÿûÿûÿûÿüÿúÿøÿöÿôÿñÿíÿéÿæÿâÿÝÿÙÿÕÿÑÿÍÿÊÿÆÿÃÿÀÿ½ÿ¹ÿ¶ÿ²ÿ­ÿ¨ÿ£ÿœÿ”ÿŒÿ„ÿ{ÿqÿgÿ^ÿUÿLÿDÿ>ÿ8ÿ4ÿ2ÿ0ÿ0ÿ2ÿ5ÿ8ÿ=ÿDÿKÿQÿYÿbÿkÿsÿ|ÿ„ÿŒÿ•ÿÿ¤ÿ«ÿ³ÿºÿÀÿÆÿÍÿÒÿÙÿßÿåÿìÿóÿúÿ )4>IU_is{‚Š”—™›››››šš™™™š›œžœœš–“Žˆ‚|tle^WPKGC?=;;;::;<<;;;:8752/-)&" ÿÿþÿþÿþÿýÿýÿüÿüÿýÿûÿùÿøÿöÿòÿïÿëÿçÿäÿàÿÜÿÖÿÒÿÏÿËÿÈÿÅÿÁÿ¾ÿ¼ÿ¹ÿµÿ±ÿ­ÿ§ÿ¡ÿ™ÿ‘ÿ‰ÿÿwÿmÿdÿ[ÿRÿJÿCÿ=ÿ8ÿ4ÿ2ÿ1ÿ1ÿ3ÿ6ÿ;ÿ@ÿGÿNÿVÿ^ÿeÿmÿwÿÿ‡ÿÿ˜ÿŸÿ¦ÿ­ÿ´ÿºÿ¿ÿÄÿËÿÑÿÕÿÛÿâÿèÿïÿ÷ÿ '1<HS]gpx~„‰Œ‘’’“““’’““””•—˜—••“‘Œˆ‚{tng_YRLGC?;997677889:9887520.+'$! sonic-visualiser-3.0.3/samples/silent.wav0000644000000000000000000000040013111512442016607 0ustar 00000000000000RIFFøWAVEfmt D¬± fact,PEAKè^ÊMdata°sonic-visualiser-3.0.3/samples/snare.wav0000644000000000000000000017715013111512442016442 0ustar 00000000000000RIFF`þWAVEfmt D¬±data<þÅÿÅÿ°7´ ; ´ ´ Î Î T Ú T Ú T Ú G G . . G Î ††óz; Á . . óz‚ÍÍÍÚ‚‚uumm7G Î Úçóó. . ù†øX÷LöÒöÅõ—ì~êâôÞaÝHÛ&ã áÅõ2ô¤"` G i\¨›\†Lö2ôãÒ±ÎãÒÊÐeèLæ¬ó&óÎ Î óÚu†&ó ñ‹ë‹ë¬ûqým. X÷\úüÔ×LÆ~Ê3äqéÎ \Ÿ"Ò&´ÚÉþÖý¹ôò‚ÿ"þmóP\¨þÒ—ì°î&ó?õ½T †. mó¨aÿm\úÅÿ¹ôX÷X÷Éøiûqý¬`Î P´ P ý~ ñzï“ñ“ñ¬û°iû7qé—ìàââ&ãqéeè†ðzï°î¤í?å&ãaÝHÛâôÞ áHÛôÞ×3äâeèXçLæâ3äHÛLæ áXçâ?åôÞ3äHÛ?å.ÙXçà~êLæ~ê?å3ä.Ù3ä.ÙeèàXçôÞ?åHÛ&ãüÔàãÒaÝÊÐHÛ—Ì.ÙLÆ×Â.ÙeÈ×eȱκLÆ]²üÔÂÊÐç½Âº”¡eÈ+®Êк×Âãúqé¨?õ¸$u:ZÕQhshs6o6okhsšwÿl^ÑfÕQV:Zl^:Z:ZBÿ?>E>El^ŸbÕQÕQ´9´96/i3‚5æ=ÿ?qIi3‚5ë(ë(ÿ?qI-i3ÁÚO1‚5>EqI>EÕQ£M:Z:Z6oV6oVšwŸbÿ£Mk£M6oÕQhs>EŸb›7V‚5ÕQi3£MÒ&B›6/mŸ"´ ÚTuT Á†ç7u`\ÿ¨ ñ½÷Xç—ìeè¤íXç‹ë áâôÞ?åXç°î—ìÅõeè¹ô?å†ðàeèHÛLæà‹ëà?åHÛôÞ×HÛ±ÎãÒãÒ××aÝãÒ×ÊÐüÔãÒ××.Ù.ÙHÛãÒÊÐüÔÊÐaÝaÝHÛaÝaÝôÞ&ãqéqé¬ó ñãú ñ\ú—ìÅõðÒö°î?õXç¤í&ãLæ‹ë¤íÒöÉø ú“ýÒöÖýøÒPùL ú¤ÿX¨ç †PiT PG ó; ½; Öÿ›°°mÒü&ãúzëþ´ LG ÉüX†üPýaÿ“ýÖÿ¹þiûú ù2ôX÷‹ë òâ‹ëaÝeèHÛ‹ë á ñqé òeè†ð&ãqéaÝàÊÐaÝ—ÌHÛLÆ×ÀüÔºÊж±Î]²—Ì+®eÈÆ¥ÂaÀ/™Àý”ÂÊ3ÄÊÂʺʺÊç½ý”Â/™3ÄaeÈ”¡eÈ”¡ÀaÂa~ÊÆ¥ãÒ+®üÔ]²ãÒ]²±Î]²±Î]²ÊжãÒº×ÂaÝ~ÊLæ.Ù¬ó‹ëL ú›Š7ŠT*\¨Ÿ"-+›7+›7+´9O1>E‚5qI-BÒ&›7¸$O1Ò&i3+´9‚5>E>EÕQÕQl^ÕQl^>EÕQ6/Í;Úë(´¸$ !ë(+O1i3´9›7æ=O1›7Ò&-͸$\ÁT u´ . Á ¨Ú Áz¨uóÚë(Ÿ"-çÒ&¨ ‚ÁzPPii\¨CÅõ¨ü3äXçHÛ.ÙôÞôÞLæ†ðqéÒö‹ëCø“ñ`Cü½XÁ¤ÚG óçó2ô›eèz¤íΨü; uPý´ÉøiP¨+ói3Í‚5 B+qIi3£MÍ;l^BÑf>EŸb>EŸb>EŸb>EŸbæ=l^Í;Vÿ?£MO1qI-qIÍ;£M>EÕQ›7>E-´9i3›7‚5‚5i3O1O1ë(Ò& Í‚†›óÍÎ ¨Ú ›†ÍP´. z½"þÁ vþÚ ãú´ Cø¹ôÞ‹ëÁqéeüeèzïaÝ.Ù~ÊLÆ]²¶/™ø©˜Œø©˜Œ]²ý”¶”¡Àø©Âø©ç½ø©Âºø©¶Æ¥]²”¡]²Æ¥À]²eȺeÈç½LÆÂ~Ê~ÊÊбÎüÔ±ÎÊÐeÈ—ÌLƱÎ3ÄãÒLÆ×±ÎaÝ×àôÞâLæ‹ëð2ôø“ùÞûqý.ý\úCüÒöøÅõò2ô°î ñ¤í°î‹ë°î~ê ñ¬ó"üL°` ¨iÚ ›†Áuç´¸$óë(Ÿ"-Ò&i3+›7+›7ë(i3¸$ë(Ú !\Î T óç iz‚ç ‚T \Á ó7Î L. ´ýC†ø&zïCøqéiûzï“ñïý¤í2ôXçXçaÝôÞ×ôÞ.Ù?åôÞeèââ.ÙãÒLƱÎ3ıÎ3ıÎ3ÄÊÐ3ÄãÒ3ÄüÔLÆ.Ù~Ê&ãüÔXç.ÙLæ×âãÒaÝÊÐHÛ—Ì.Ù—ÌHÛ±ÎHÛ±Î×3ÄÊкÊк×ÂaÝeÈôÞ—Ìà±ÎàÊÐHÛ±ÎãÒLÆãÒeÈHÛüÔ?å&ãXç3äXç&ãâ&ãaÝ&ãôÞLæLæ‹ëð?õ´ÿP´ÁŸ"Á¸$´Ÿ"› !óÍŸ"Ò&6/O1´9‚5ÿ?´9>Eæ=£M>EÕQ>EVqIŸb£MkÕQ6oVhsÕQhs£MkqIŸb>EŸb>El^BVæ=£Mÿ?£MqI:Z£Ml^qIl^ÿ?ÕQ›7qIi3>Ei3>Ei3>EO1B6/>E6/qI‚5qI›7>E-BÒ&‚5óë(P´mÎ "ü"þÉø úqÿ`ózÁ u` ÁPŸ"ó ¨›¤um‚†þ°X÷?ÿ ñCü¹ôÚþ"üç.ýç PÿP“ÿó¬û. ½÷óÅõÒö¨Cø°¬óó¬ó?õmðŠ“ñÁ\ú`Úþ¨ãú“ùqÿÖù¨þÒöëþÅõ.ý2ô&û—ì&ó áâôÞaÝ&ãà&ãôÞôÞaÝ áaÝ&ãHÛà.ÙôÞ.Ù áaÝ&ãà&ãHÛàüÔaݱÎaÝ~ÊôÞ~ÊôÞ3ÄHÛº.Ù¶×]²üÔ+®üÔø©üÔÆ¥ÊД¡ãÒÆ¥HÛ+®ôÞ+®aÝ+®.Ùø©ãÒÆ¥—Ì”¡±Îø©ãÒ+®ãÒ]².Ù¶ áºLæÀâç½aݺàºqé3Ä&ó—Ì&ûüÔÒ×øÿרþHÛLæó~ê\úà°îüÔLæãÒ3ä׋ë á ù°î¨X›uŸ" !¸$¸$¸$Ÿ"ë(¸$ë(Ò&¸$Ò&Ÿ"¸$¸$Ò&¸$ë(çë(ç+Ÿ"‚5+>Ei3£M‚5qI+ÿ? !i3ói3 !›7¸$Í;ë(ÿ?ë(>Eë(>EÒ&qI !B´›7uO1P6/\+Ú ¸$LÁ“ùz&û¨. Á*Pø¬óóÅõ¨ÅõÚ?õ¤ÿ òÖùzï2ô¤í¹ô‹ë?õeè¬ó3ä ò3ä°î?å~êâXçà?åâLæ~ê—ìò¬ó ò¹ô“ñ ò“ñ ò“ñÅõ†ðX÷~ê&óà~ê× áÊÐ.ÙÊÐüÔ×aÝ×âaÝeè—ì2ôTþTÎ; †ü½ ùTøóX÷°ÉøT†ü. qý; ‚ÿÁ *CÅÿqÿÒ"ü¤"þ°ïýqÿÉøiûPù.ÿL`T ¨†Á T óT óT \†¨Ú¸$O1æ=ÿ?ÕQBVÍ;£M›7>E›7B›7æ=‚5´9i3›7O1O1+ë(ë(ë(Ò&Ò& !Ÿ"Ÿ"Ÿ"ë(ë(----O16/›7O1‚5--+ë(6/ë(O1Ÿ"6/´ë(i !z´G †. ; Á ó; °°Þû¨qÿz; ‚\u\óç m¨çÿi`2þL ò“ñeè3ä~ê?å ñqéÅõ‹ë\ú¤í ù—ì?õqé¹ôqéÉø—ìú°îãú°î;2ôÞüXüþÞû¬û“ùøÅõ ò“ñð“ñ“ñ¬ó°î¬ó‹ë?õ‹ëú~ê&ûâ?õ×—ìÊÐeè±Î—ìãÒ—ìüÔ&ã±ÎHÛ3Ä.ÙÀ.Ù3ÄHÛeÈ.ÙÀ׺×À.ÙLÆaÝ~ÊôÞ—ÌHÛ—ÌàãÒ?å×Læ× áüÔôÞüÔaÝÊÐ.ÙLÆHÛÂaÝ3ÄaÝLÆHÛeÈüÔ~ÊüÔ~Ê×~ÊãÒLÆ~ÊÀ3ĺ3ÄÀLÆÂeÈeÈ~Ê~ÊLÆeÈ3ÄLÆLÆ~Ê3Ä—Ìç½~Ê—ÌÊÐ×âLæ—ì ñÅõqýüþ´ ½mçóz\¨´´ çm¸$‚6/´‚5¨‚5Á‚5 ‚5 O1›Ò&mÚÎ óPë(´- +Ÿ"+Ÿ"-¸$-ë(6/O1i3´9´9´9æ=i3Í;O1æ=i3ÿ?‚5B‚5æ=‚5æ=›7ÿ?›7ÿ?›7´9›7›7‚5´9i3Í;i3æ=´9ÿ?æ=Bÿ?>Eæ=>E´9B‚5æ=O1´9-´9ë(‚5Ÿ"6/ÁÒ&¨Ò&ë(P !óóóŸ"Î !—þP ò°&óTvþ†›zþ`ÅõÖý¬óüLö&û½÷†øÅõ¬ó ò°îò¤í ò°îð—ì—ìLæ—ì?åðeè?õqé?õXç2ôXç?õqé ñ&ã~êHÛXç.ÙeèHÛ?åüÔ á~ÊaÝLÆHÛeÈà~Ê&ã~ÊàLÆ á~Êqé×ÒöeèÅõÉø¤ ú; *ç ´ mCøX÷“ñzïPù†ü¤ç T PÚ ´ óÎ †PÚ m½¨¨´ ç ` óÚ . CmPÿ.ý\úÚPu\Ú ´ mC. T T ` Î"ð¹ôXç‹ë‹ë°îLöüeü`mç . umÉþT¨üÒ¬û\ ñ2ô3äXçHÛâ×à×HÛãÒ×±ÎüÔÊÐ×.ÙHÛ&ã&ã~ê~ê ñ°î¬ó†ð¬ó“ñ&ó ñzï†ðqé‹ëLæ&ã~ê&ã—ì&ãXçaÝaÝüÔHÛüÔâaÝðqéø¬ó¬ûúPùX÷zïeè?åãÒLæ±Î°îüÔ¹ôaÝúeè“ùiÁ Ái´\\Î ¨CøÁÒöüÁ G ëþzX÷—“ñz¬ó. Ú Póó. Á ÎzÿCTT Á Î T 7m. ÁΠ󨛗\C\ç ióuÚ ¨mÍ\ó‚Ÿ"¨Ÿ"PÁçóŸziçmçøÿ úT¬óÚþðãú ñ.ÿ¹ôÞÒö7X÷;CøÖÿ?õ´ý°î ú~êCø‹ëX÷ ñCø?õ.ý½÷›ãúÒCüÖÿ\ú\2ô‹ëú?å ñ&ãðâzïaÝXçaÝ á3äeèÒö¹þ¤†T \´›´ÚÁ¸$Í+ó6/ !+çÍP; m¬ûPýÒöÉø½ÅÿPT Á‚ÍÁŸ"¸$-O1›7Í;´9ÿ?O1æ=ë(i3¸$Ò&¸$Ÿ"ë(Ò&+¸$Úç ½Ú 7›P ›ç†´*ÁTÚCÍÁ ›ç X÷Ú&óÅÿ¹ô´ý¬óÞû°î´ý—ìï†ðz¹ôÖý“ñ?õ¤í ñ°î ò¬ózï°îeè3ä áHÛaÝüÔ á.ÙXç&ã¤í~ê†ð¤í“ñ~ê¤í&ãLæaÝ áôÞ.ÙôÞãÒ.ÙãÒ××aÝHÛ&ãaÝ3ä.Ù&ãÊÐHÛ—ÌüÔ×HÛüÔaݱÎ.Ù—ÌãÒÊÐüÔãÒ.ÙHÛâ~ê¬ó ú›`¨›ÚÖýÁ Åõ†þò¬ûÒöó¬û*çÿ°mT T \miÁ Ú °´ X‚ó Ÿ"¸$óó›uui\móÍ´¸$ë(-i3i3‚56/i3¸$-ÚŸ"u½7mT *u. ´. çÁ óÎ ´*P2þm ùó½÷` ú°Öù&û ñ°î á?åüÔaÝ—Ì×LÆüÔLÆHÛ±Îâ×à×HÛãÒ×±Î.ÙÊÐàüÔ áãÒaݱÎHÛÊÐ.Ù×aÝaÝôÞàüÔ×3ÄeȺÂLÆÊÐaÝ‹ë°î"þ2ôï¬óXX÷çÉø¨¹ô7“ñ¨?õmX÷ózï?åÒöXçX÷&ó7øÿóÎ Ú \½Ú ; im¨` ‚´ †mu¨Ú ¸$ !Ò& !Ò&¸$ë(ë(6/-i3-i3-O1ë(+¸$ë(ÚŸ"‚¨‚¨¨ !Áë(Á-Í+ó+ -Úë(¨¸$ !¨ çŸ" !Ò& !Ò& !Ò&Ÿ"ë( Ò&› óT ‚` ‚ç Ú ‚. i`Ú Åÿz½÷PùLöú\úL´ý&Öým¬ûCþCøãú?õ†øÅõ ùÒö“ù&óPù°î“ùð\ú2ôú¬óLö†ð¤í°îXç—ì?å‹ëXç“ñ—ìÉø¬ó&û ùÖùø&ózï‹ë?å‹ëôÞ¤íà~êHÛà±ÎHÛeÈôÞeÈXç~Ê—ì~Ê‹ë~ʆð—Ì\úÊІü×LöÊЗìeÈ3äÂaÝÀaݺôÞºaݶHÛ]².Ù+®üÔ+®×¶&ãÀ?õãÒó&ãeèëþ3ä¹ô.ÙqéÊÐ áÊЗìHÛX‹ë´ ?õ¨?õç“ñ7¬óÚ Éþ; LPù ù¹ôCü&ó* ùXLÒ°XÁ Ti°ç !. ¸$ç +\6/mŸ"ÖùuPùuÅÿÚLÚ ý›—þ´¸$më(Öÿ X÷¨¹ôÁÅõŸ"òŸ"eè‚eèi2ô Î6/; ‚5. i3—6/zO1Šë(¬ûç?õ¨?õ´“ù´ëüÁ\Ú. !iŸ"ç¸$¸$ë(Ÿ"+óë(Ÿ"ë(Ÿ"Ò&çŸ"Á¨Á\çuçu›Î iL›¬´›; ¨Ú Ú` ç !zÍT u"mÉümiûP“ùu&û¨Ú½ç. óÁ !ç Ú´ ‚L† ýç ¬ûm—þT ¨üç òL‹ë~°îΆð“ýLæPù áãúeè°2ôm2ôXò2þ°îÖùqéLöXç†ðXçXç&ã á.ÙôÞ.ÙàaÝà á á?åaÝ&ãHÛ&ã á¤í&ã2ô á“ñôÞ‹ëôÞLæaÝ&ã×ôÞ±ÎHÛÊÐHÛ× áaÝeè á¤í á‹ëaÝeè.ÙqéaݤíaÝeèHÛôÞHÛ.ÙâHÛeèàeè áLæâqéeè“ñòÖùÞûqýÒÅõÿ¤í“ù¬óeü*T G Î ; mmC. PuÍç ! ¸$Ÿ"¸$Ò&Ÿ"¸$Ÿ"Ÿ"Ò&Ò&Ÿ"¸$u´CÁ óCç ; P†›Á¨Ú´ Íó óÒ&Ò&-6/+6/Úë(m ½Ú´ óz !\ó; ‚TþÎ "þç ‚Ú ›óPL; øÿ7Pýz\úm úX\úëüÉøÅõPù&óiû¬ó\ú òÅõ¤í&ó‹ë“ñ¤í ñð“ñqézï.ÙzïÊЬóüÔÒö×òüÔ~êãÒXçãÒ3ä±Î&ã~Ê&ãLÆ3äÂ?åÂLæ3Ä?åÂ?åÀ&ãºLæç½&ó—Ì?ÿôÞ`~ꤗì*qé¬û&ãëüLæ* ò¨“ñ7zï¨?õÚ Éü½÷\ú~ê†ð&ã¬óeèÅõ‹ë¤í&ã&ã.ÙXç áð°îÞûüÁ ¤óç; móóC*Î "mçÎ !ó¸$Ú ¸$¨¸$¨ë(¨Ò&¤Ÿ"mó´ÿ mŸ"ïý ! ú !&û¸$ëüë(ëüë(øÿ-&O1›i3´9u´9T i3Ò+7+‚‚5ÚÍ;‚‚5` -ó6/†‚5Úë(Òö‚?õG \ç çzŸ"T !z¸$u-ië(` çmçiŸ"‚Ÿ"‚óuóÚ u—ÚÁ —u; ‚Ú ç G Î ´ P¨\ÚT üT ¬ûP`uÚ †`CCø¤íCüLæ†øaÝX÷.ÙX÷HÛ¹ôôÞ¤íHÛzïHÛ úâX&ãÞ3ä*Læ¨Xç¨Læ; ‹ëPÒö›"þ†Lö¤íï¤í¤qéþ.ÙðeÈ~ê°î~ʹôüÔÉø.Ù—þaÝPÿà†üâÖù3äX÷âLö?å ù°îÖý?õ¹þ“ñ&û‹ë&óLæeèaÝ?åaÝàaÝ××.ÙaÝ~êò†øm òÖù?åeèHÛàaÝ?å3ä¤íqé¬óqéø?åiû á ùLæCþ&ó; ùÚ °îqý3ä&ó&ã?õ?å2ôLæ?õLæ ù?å&ûâ½÷ôÞ?õ áÒö~êeþ†üç Tú` ~êiû?å2ô—ìÉüÒöç¹ô&ûð°îqéLæ áaÝ~ê?åLö°îÉø¬ó“ýaÿÚ´ `´ ýÒü` ýTvþvþT‚ÿ; *` ‚†´ PÎ &¨°aÿ“ùz ý\†çÁóÁÍ´ÁÚÚ !Ú Úç !Ÿ"¸$Ò&6/6/›7´9-O1 Ÿ"Á¨´¨Ú›ç‚ÁçŸ"¸$ !¸$´-¸$ë(Ò&ÚÚiPóÁ *~†þX÷¬ÞûiïÉøz ñaÿ¹ô—ÞûÚ›zç7m7Ú¤ÚeþÞiû?ÿX÷Öù ñ?õ~ê°îeèqé°î¤í.ý¨ü¤7øÿXCøeüëüçÿiû2þX÷üPùþ"ü\úøÿCøÁ úþøÿ°Ú7Ò›&ûŠúCü?õ¬ó—ì¬óð2ô2ô“ñzï°îLæ†ðeè?õ¤íÉüòçCø`ÒöCø—ì—ìXçLö?õ—þÖý“ýüÖý´ÿ´ÿ*´ý´  ú´ ¹þCнøÿ ýCþCømÖù**`T Á Í›´òC?åÅõeè¬óLö"üóÞLÚÖÿ7†þmó"ÒT Š—*zCþÚÞû°†ü°"þçT mz*´ ´ÿ¬PÿmT“ÿã; G `mLöX÷ ñ¬óø ùãqýó¬û°“ùúeþ\ú¹ô¹ôeèXç&ãaÝqé&ãÅõ“ñLÉü¤7¨üLöTþ°îLö‹ëÅõðÖù†ø†ü"þãú“ýCü\úüþÒöþ&óLö¤í~ê&ãâHÛ&ãôÞ¤íqé¨üð°“ñ ñeü°î†ø“ñqý“ùÒ ýÚeþm†ü"þ?õCþ¤íe轋ëçÒöó†þ`aÿ—*ç Á ´iÚ†P`½“ÿ"þÞûLöCø ùÖù›¬i\Ÿ"Ò&ë(- !¸$\‚´ Ú Ú?ÿzçG iç !Í †\. ¨. . 7´ †ü ÿÅõ¹ôLöøqý. ‚G ¨Þ\Öù&óëü¤í2ô~ê ñ°îLö?õüþÖùm¬óàòÊÐôÞ—Ì.ÙãÒaÝaÝ3ä?åLæ~êXçò~êÅõ“ñÒöX÷Lö“ù2ô ú?õÖùÞûCüTó½ãúÞûò†ð¤í‹ëòÅõeüÒz½z. ¨°´ý¬Lö ú?õø&û2þ½; i ›ó›‚zÁ °¤Tç. G ‚\›u›‚›u›iu\†\\†PóP\\´P͆͂ÚÚ ! ¸$óÒ&Á !‚Á‚Á¨ÁÁÍÁóÁçi¨; PT; ´ý7Éü†üzÚþXzm"ÉþÎ ùÖÿ2ô;Åõ"ü` X\ÚþmÉømò“ýqé ñLæXçLæ?åeèeè¤í—ì¹ôð"ü¹ôãúLöX÷‹ë—ìqé3ä—ì&ã¬ó~ê ùòú2ô½÷òLöðÒö°îÅõ¤í°îeèLæ á3äaÝ‹ëà†ðôÞ òaÝX÷âvþ‹ë2ôÁ  úmÿÎ ëü*X÷°“ñ"ü¤íÖù~êÉüqéÞqévþ3ä“ùàqýLæÁ †øu°Ámç\´Ú ç ãLLöú“ñX÷zï?õ~ê¬óLæ¬óeè°îqéqé‹ë‹ë†ð†ð&ó“ñ“ñ—ìzïXç ñeè¹ô òqý\Á ¨i*miû° ñ¹ô ñÅõCøiûCÅõ› ò ú ñX÷¤í¬ó~ê¤í‹ëð¤íX÷¤íÞû‹ëCþ°îX&ó. “ñÁ ñÁ “ñ¤†ð&û°î¬ó òX÷†ø“ýÒöÖý¬óeþÅõÞ&û7¨üT eüPÉüuqÿuÚ‚Á Áç óç ÚÎ ´; ´ ‚´ ‚󂂨›ÁP‚7Á LTm7T ç uÁ›\››` u´ ‚ç Ú¨Ò&Ÿ"-+O1i3-‚5+6/+ë(ë(Ò&ë(¸$Ò&çŸ"‚ !` Ÿ"G 󰨂¨`uzT “ù. X÷zÒ\z` çÿ“ù"üÅõ ù òÖý òÚ¨ü¨TÞmÒöÖùò¬ó½÷Åõ ÿeþþó“ùPùÒö‹ë?õ?å°î&ã~ê áXçaÝ áüÔaÝãÒHÛÊÐ×—ÌÊЗÌãÒ±ÎHÛüÔLæHÛ‹ë&ã—ìqéXçqéà?å á?åLæLæqéeè—ì‹ë—ì°îeè°îXç ñ¤í\ú“ñÁ†ðÖÿ ñü¤íX÷&ã‹ë.ÙaÝüÔ.ÙaÝ?åeèLöðqýzïÖý¤íÉþzï½2ô7?õ2ôzLöëþ°ç; ; mziPi†P\uÍç¸$Ò&Ò&+¸$+óë(͸$Í Úç´ÚumóóÍŸ"++i3ë(-óŸ"¨´´‚ç†ÍÁ ‚; uiP\Î G z7Ú½; ; †óç Á Á¹þ ò òð¬óÒö&û†þçÿXm¨*G ´ ó½ÖýLöX÷2ô2ôLö\úÉøÞûPùÒö“ùòÖù ñLö°î°îXçeèaÝ‹ë áðeè ñqé òqé¹ô‹ëX÷°îú†ð ý¹ôëü¬ó\ú¤í“ù—ìCøeèÒö&ã?õâò&ã~êââaÝà×qéHÛX÷Læçÿð“ÿ¬óÉü?õ ýX÷Cþ½÷ ù2ôò†ð°î—ì&óqéCü ñÚ¹þç°“ý?ÿ¹ô¬ó¤í~êqéeè°î ñ\ú&ûTi¨Úz*Ú ó?õó—ì ù‹ëX÷zïú¹ô‚ÿiû¤.ÿ´ eüÁ Pùm½÷PCø\iû‚aÿ››Ú¨°çÚçÿCøT “ñm¹ô`΂. ó; mÍmiøÿ†›\\i¬û\?õT ¬ó`iû`mz‚z‚` \` iG P"; ‚ÿ.ÿ“ù` ù\Cü¨mÚÚuÁ ç ! !Ú¨ÍzÚÎ çÚ ÍÎ ›ç´7Á¨¨7m´´ Ò&†+iŸ"T u´ Åõ* òÁ Òöiüþ‚¨ó7¤iûøëü7†þ°X÷m¬ó; ½÷\“ýóvþ`X÷¹þ“ñÿ?õ›"þ*.ý òð?å&ã?å3äqéqé~êeèeè3äeè?å~ê‹ëqézïXç“ñ3äð3ä—ìeè—ìð ò‹ë ñaÝ?å×aÝaÝ3ä3ä—ìâ~êHÛeèHÛqé&ã¤í~ê“ñ¤í†ðeè‹ëâeèeè ñ¬ó¨ü†øïLöþ&ó ù“ñ ù ñÖù¤í òeè~êâ?åôÞ3ä áeèâ¤íLæ ò—ìX÷ð ùzï&û“ñ¬ûT \*i›u†Cü; ëü½ÚÚ G PÚ \G †´ ó¤ç ¤ÿ´ ÞûŠ.ÿ úTCø. eüz‚¨ÚÎ ¸$ië(ÍŸ"´ÁP´\ ç ! !ÚççÍŸ"´Ÿ"iÚG ¨7u¨zÁ Î ½Þ“ýC†ü\*u. i; i\ç ‚zT "½Cç ` Ú ›çPãT ïÎ ¤Î çÁ ¤´ ¤Á zG ¨þ*ÖùøÿÒöÉüÅõ ú¹ô¹ô“ñ¤í—ì~êqé~êXç—ìqé°î°î†ðÅõLöú"þ“ù7&ó~¤íÖù¤í2ô°îzïqéqéXç3äqé3ä°îqé?õ—ì ù°î ù†ðCøòÖù òü&óPý¹ôLöŠÒöïX÷ úÞ¨ü›Pù¬û†ðLöqéÅõ‹ëú¬óÁ\ú´ý~"üÒöLöðð‹ë~ê‹ë‹ë“ñ&óX÷½÷¬ûiû“ýþ†þ¨þ7ïL½XT"Tz*`7. TT PÿÎ &ûzÅõ.ÿ†ðÅõ†ð ñ2ô&ó ò ù†ðqý¬óm ùÚ´ÿ; ¤` ½Ú ¤G T ¨Î um¨iÚ›ó‚Úç C\G ‚` uP\ç T . °C°**mT›mÎ; Іü&ó†ð°î~êiû&ó—¬ûTCü"iûÁ "†m\Pi` i. u. ¨; ÚC´m\*ç ÚÁ ;zÖùçÒö¨úÎ ´ýG ÿ¨?ÿ°çÿ`´ÿT“ý›\ú›†øÖùç"þ`“ÿ½“ùÉüÒö“ùLöCø ú&û2þiûú?õPù†ø´ÿ›*G ÞmCøëþ òiû2ôãú&óø‹ëð3äXç&ã&ã&ã?å3ä~ê?åzï?å°î&ãqéâeèLæ¤í‹ëðò“ñÒöÅõ¬óPù‹ë¬ûLæ2þXç¬~êÚ¤í½¹ô; ëüÁ ´ýCÞû7&û°Éø°?õÖýÅõ“ý\ú\øÖý¹ô&û2ô"üX÷—þú°&ûÒ†üÚÖÿøÿCü?õ?õ¤íø ò.ÿ¨þ¤ó¨z—›Éþ2þü“ù¬ûCøÅÿãúmqÿÁ m¨½½¹þ&ëü—Éþ´ LÚ `` ¤` ÞP7uÁ \ç´ .ÿCó½‚T ¨T ›; uÎ \¨u‚zG ` mÁ zçÁ T. ; T \` ; ‚z\`\½‚PióuG óÚ *z¤\`\ÚP?ÿ; ½÷~Åõ&ûÉøãú ý“ýçÿ*›úï¬óÉþòqýòiûòÞû òÖý?õ¨þÖù*¨üqÿCüiû\úPùiû‚ÿz¨¨T ¨G .ÿΠò¬ó—ìqé~êLæ~ê?åeè3äLæ&ãqéeè òòüÒöÖù¹ô?õ†ð?õ¤í ù—ì¬û¤íãúzï ù†ðiû ò*Cøïý¨“ý—Òöqÿ†ð¬û°îú°îÒö°î¹ôzïø òëü¬óTþ&óCü“ñü“ñXÉøG Úþ` øÿG z¤L†þüþ†øçÿÒöqý?õüX÷zm. øÿ°G*Tz稗¨Îþ\úÁPùaÿëü¬z—þãiûü—þÖýÚ"*óÁçPùL¹ôÚþ¹ô“ýÒö"þø†þ?õCü ñøòúÒöŸX÷TÅõ½ÒöÚãú¨aÿÎ ó°ç móTþóÖùeþÒöÚþÒöëþ&óÖù¹ô&û"üÞ›*¹þziûT.ÿ; çÚ Á P´ \›z¬ûãú“ù?õÉø½÷“ù&ûÚþ›"Ú½øÿó\úÒqýÚÁ G Ú T \Î iç —Á °ç ` ‚P›\uz` ¨G *Î m†°¨P›iz` G Á ç . \°u°T ‚` ` ó" ý ý´ÿ¨ü`vþm.ý"qým¨½Cm½½—°zm úiû2ôX÷òCø¹ôCø2ô†øò úò"ü¬ó¬û&óÒö°îzï—ì°î ñ¤í2ô~ê&ó¤í2ôÒö ú†ü—þãúiûÅõ¹ô“ñ¤í—ìLæeè&ã‹ë~ê&óX÷\úÖÿ¬ûqýPýCø†ü†ðÉø~ê½÷‹ë¬ó—ì~ê?å&ãaÝeè áðeè&ó‹ëX÷zïãú?õ¬ûÉø ùX÷½÷CøÞûÅÿ—Þ´ÿ“ÿ&û ú&ûøÞû?õÉø¹ô“ùX÷iû¬ûúaÿú—ÉþG mT PzPPPT T C¨X°eþX†üÉþ.ÿ“ÿzXøÿ—L½½ç Á i¨\°P¨‚ç ´\Á†´Î ¨´ ›¨; ´ç‚ !¨Ÿ"¨¸$ !\›T ó°´ ¤. çG —ç ;`  ú; \úÁ °†½uCç °*eüïÖù?ÿ“ùTþ&û¨þ“ýÚþÅÿ´ý7Úþ`´ýLÒöÞûòÒö“ñÒö&óiûÅõCüÅõX÷†ð&ó—ìÒö“ñÉþ“ùm¬û ý&ó&ó?å¤íaÝòâëü ñ¨üLöLö“ñX÷°î‚ÿ“ñ¤ÅõzÒöz¹ô"òïX÷ãmzÖùTLözø¨X÷ÞòÞû‹ëÅõ~ê?õ—ì†øzï“ùzïLö—ìX÷zï.ýÅõ¬\úT.ÿ*óqýÚþãúü¬û&û"þ ý ÿëþ¬û´ý¹ôPù—ì2ôeè ò¤íX÷ ùŸX; Úz ÿT Öù¨ ù. ½÷Lö½÷.ÿPù ÿ¹ôÖù°î2ô—ìÅõzïÉþ¬ó°ÅõÒö* ú´ \‚úç ñÚ¤íG“ñÚ“ùç &\—PÒç ¨þ´ ý½CþCTþCãúóÖùÚþCþÞÚ´ ; Ú ´ Ú *Öÿï†ø½¬ûi¨¨` ¨` ‚ç †G çm&—LG 7†°u; ¨mÚ\ç‚Ú‚izT T ¤óu½uçuCÁ G P´ Î ó¨¤; 7ó. †. ` ÚzvþøÿÖù¬ûÉø†þÞûz‚ÿÖÿ ý“ù úPù&ûÖÿeüÚïýT.ý´ÿ ùiû¬óø ò¬ó¬óð&óð ñ&ó ñ2ô“ñ†ð°î¤í~ê—ì~ê‹ë—ìqéqéeèLæ~êeèð†ð?õX÷Åõ½÷ ò¹ô“ñò¤í—ìeè?åLæ&ã~ê~ê òòÒö¬ó¬ó“ñ°îzï—ì‹ë~êXçeè?åeè3ä¤íXçLözïPùX÷ÒöCø&óò“ñ¤í¬ó ò“ù¬ûÚþ~vþ"þiû\úú“ùÞû"ü“ÿ*`zÁ Á G Ú Þ; Éüóiû¤.ýç°´ Á P\¨‚Á‚´u››u›ó›; ‚`†½Á ÞÁ \P¨u¨›. Á½Á¤´` ÚPóP \óPóóóG ͽuóz; ` Î ç ; m7z*P`\zÞ´ ç¨¨Ú ´ zÁ ` ; ´ Có``"þ°qÿTïóþ¬ûiûÅõPýø½÷þ ñÒöeè&óLæÅõ‹ëiû¬óCþÅõëü¬óÖùzïX÷‹ëÅõ‹ëú òçÿÖùÒ úPÿÅõü ñø¤í?õ~êø~ê†ü—ì‚ÿ—ìG—ì“ÿ‹ë úqéLöeèLö‹ëÒö—ìÒö—ìø‹ëPù¤íPù†ðPù†ð¬ûð¬û°î\úzïãú¬ó¬ûPù ú\úÖùø´ýÉø?ÿX÷¨üÅõú ù¬û&“ÿXT*. ; ½Ú~ü?ÿÒö.ýCøþüþ›çÿ*\úÞLö°Lö`X÷mX÷"Éø"PýCÎG z. &û2ôÿò.ýLö;üþ. `mmÚ `G óç ´ Cm—Ú T qý; “ù°øT ùXÞûÚ´ "m*Ú CüÚ¨ü½½½`´ 7Úm?ÿ. ÿ. &zó**m*qÿ¨ÎÚ ¤ç óç °ómm7G zmXmŠó´ uPi†T ç Á ç Á Î . 7¤7—C›z¨üz&ûŸç—*Ò7þaÿ\úeüúÖù¬ûÉü~C¨ç Ú . ´ Ò&ûëüX÷&û?õãú?õúÒöCøÒöLöX÷Lö ú\úçÿã‚ÿÿG´ý´ý ùÉø¬ó¹ô“ñò“ñð“ñ°î†ðð†ð“ñ†ðò ñò&óòÒö¹ô½÷Cø2ôX÷°îzï¤í—ì°î°î¤íð¤í¤í°î‹ëò—ì?õ†ðLö¹ô ùÖù´ýãÖÿç¤2þ~¬ûÞû¬û.ýCüüLÉüCþ7üþÚLÚÚT`Ú`"Òm¤mX2þ7ãú“ýCø ý†ø;¬ûÉþ"çó¤7Ú. C. ; 7½; Á mzz†Ú mPç ó¨ó—Îó—zç ó‚‚Î ; T G ç T óT Á Á m¨. °mÞG *`TÚ´ ; Ú mÚ ´ z°` ¨Ú Á Î ´ ¨7`ÞóaÿCüeþ&¨mmÉüøÿ úÞû†øX÷Lö“ñ?õ°î¹ô—ì ò~ê ñ—ìÅõÅõü"üëü&ûX÷ø&óLöÅõ“ùPÿi7mz½*"ü¬û¹ôÅõ†ð“ñ°îò°îÒö†ð ú òCü¹ô ýX÷ ÿú¤ÿiû¹þPùþ2ô¹þ“ñ°?õ¬ûã¹þÿÉþqÿCüÒøL¬óÁ¹ôΓù›ÖýÅÿÿã&ûø*¬û&Ò›m½›`°7‚ÿ7¨þ*þÚþ¨þ“ý~“ÿŠ\ÎÖýqÿ&ûüLöÖù2ôÒö2ô&ó?õòCøÒöiûeü ý*´ýLPý›¨ü~ ýóþ¬´ýïeüüqýmøÿ. *z"ü°PùüþÖù ÿiûïiûÞeü¤Á½½´ ´ ½m.ÿÖý¹þCþó°½°?ÿ*ãúÞ ùã"ü*¤TÞ½;7qý".ý*Ÿm½Þ°ïŸ ÿGm"z*¬Þ**iÞó¤½. . ç; Ú z; mT Ú Î Ú Á ç G mT T Á ¨ç`7ï*øÿÚþzCÁ ´ T °´ `; zÚ Á zG ç. ¬7z½Á T ´ Î 7. . G ´ T °. m›PÿÁþãqýü ýiû\úiûÉøiû½÷\úPù†øú½÷Pù“ùÉø ùøX÷LöÅõ¹ô2ô2ôò“ñòð?õ òãú½÷Éüú\ú½÷½÷¬óX÷òX÷†ðÅõ¤íò‹ë†ð‹ë¬ó“ñPù\ú¬ûãúü ùÉü ùeüÉøiû†øú½÷X÷¹ô&ózïò—ìøð°½÷mÞûÚþúú?õÒö“ñÅõ°îø—ì¬û—ì*ð½X÷`qÿÚXÒ~mÚóçÿ\¬û“ý&ûeü"ü´ýÚþTþãeü¤ÿÖùãú&û½÷?ÿX÷Þ ú½ÎÁ ´ Á ó´ Cç 7T `Î XÁ XÁ ½T "ç mPmó¨eü"iûm†üzqý7?ÿG ëþ¨üz¬ûT.ÿ½Þ´ ¤´ ¨óG zmT†T†ÒmG 7´ zG LG X½G`øÿ°L½7—¤óT*—Åÿ*qÿ¤½TXGiëþeþ“ýeü"ü´ýPý7X½¤ÿ›¤ÿzL—.ÿ´ÿëþÖùÎX÷¤ø½ÉøóÉøÚ†øç\ú¨Pÿ. ¬¤üzÒöÞÒö— ù›ú*iûÁÉüPÿeüqÿÖùLÞû—“ÿŠCü ýPùeü\ú.ÿ¨üPÿ¬ûiûX÷X÷òø†ð ý&óøÿÅõCþLöeüLö&ûÒö úX÷ãúÉøüú.ý&ûCü†øÉø òÒö¬óøX÷iûÖù“ý\úiûãú½÷"üLöþÒöëþøÉü½÷ÉøLöÒöÅõ“ùÒöqýÒöÉþX÷eüLö“ù½÷eü†üTÖÿqÿ. Éü´ &û½¬û úï½÷†þX÷ÉüÒö&ûX÷&û\úþPÿ&½Ú*¨mÁ Á ›´ Þ´ 7Î ¨G `7&*ÞLçózG ›Á Pÿ` ÿÒ*¤"CG °ç ´ mÎ óT ç G ; Ú z` mÎ ó; ½z½Ú7›°Úó¨´ ; ´ Á z. ó¨´ Á ó` PÚ †ç ó†Î zó. 7L›¤ÿ**Öÿm ÿóÖÿTÚ.ýX÷Éþ?õ"üÒöiûX÷ãú2ôú&óCø ò?õ†ðÅõ ñX÷¬ó½÷¹ôX÷¬ó†ø2ôÒö2ô“ñò†ðzï ò¤í2ô¤í¹ô°î?õzïÒözïX÷¤í2ô—ì ñ~êðqéðXç ñXç&óqéÅõ—ìCø ñCø¬ó?õ“ñ&ó¤í2ô‹ëÅõ‹ëÒö¤íPùòú¹ôÉø¬óLö ñ2ôðÅõ&óPù†øeü†ü´ý´ýþ¹þ´ÿXm´ 7´ *¨—ózÚ—zóXó*盤Ұ½mL°*. \` ~Ú ; &¨Á´ *´ z´ `G . ç ; P¨i‚ó›7¨´ ÁG ¨Á . um\›óãT ‚ÿ` Xç ›` ÚT ¤Ú C` ´ ` . m¨z°ç ¤Ú mÚ °G ó; 7´ ózTLÒóT°Ò—´ÿ“ýÒ.ým.ýÒþÚ ÿiû›½÷½÷†þ ùiûÅõ¬û2ôüþX÷LÉømCøGÉø ú ú°Pù7Pù¨ü"üiû½÷Éø òLözïÉø°îvþ“ñŠLöŸ½÷ÖýÅõÉü2ô¤ÿÅõÒ ù.ýzã´ÿÁ"ü2þÉø¬ûÒöÉø?õ†øÅõÖùLö ù2ô†ø&óÖù¬óãúÅõPù†øÒöCøÒöLö“ùÅõ¬ûX÷ÉüúþÖý.ÿ›—þXüÖýÉøãúÒö ùÒöúPù“ý"üG¬û&\úüþ\úþ&ûÚþÖù¤ÿ ù~üŠ.ýŸ&ûøÿPù\ú\úëþ úqÿ¨üÒ ýXiûÒú½"üóLT Ÿç Öý; ¹þz**Ò¤\¨þ—PýÞCþzÒ7iXÅÿaÿÿÖÿÞm7Úz*¨´ ; G ; ´ . ½´ zÁ CÁ ´ Á Î Á G . TÞi*çC½z½*mz°. ´ ¨´ `mŸ~ëþiÁ—z*›—mLPýÒqý¤\m* ý*ü—¹þ**qýTþPùqýÒö.ýøCü&ûúiû ùú ùPùÖù\úCü"üqýeü“ýiûÿ&û;iûøÿ&ûeþ“ù¨üú†þCþXm"üüþCø&û2ôÅõð ò°îÅõò ùLö ùCø ú\úãú†øCø¹ôLö¹ô†ø†ø úüÖùiû ù ù&ûú2þëüëþëüüþÞûüþ&ûaÿiû¤ÿ¬ûPýãú ú ù úX÷ ýCøiûqý~¬û.ÿ ù"þ“ù“ýCü´ýëüiû ùPùøú ý¬ûøÿCümëüŠ.ÿ—°zç; ½` zz°óó; zCÁ TÚ›—¤. mT —Î ÒÁ 7Á 7T ; m. m°Ú ½. ïóL. zÁ Pÿ. ýü.ýmüþ`;. T` . óG z; †7†›ç °´ ÚþmTþ`´ÿ7m. ¨ÚC¨ó¤‚ÿPÿPýãúÖý¬û“ÿÚþ¬›"LçóÚÿz´ýX´ý7 ÿaÿ›†þ—2þ—Éþeü\X÷.ý&ó&û òÞû¬ó¹þ2ôã¹ôÅõ½Cø¤PùXÅõ¤ÿòÚþ&ó*Pù"þüú?õ½÷“ñø ñ“ù¬óüX÷ëþü¤ÿÉüÉþ&ûëþü.ÿ´ýÒLz“ÿPÿ¬ûÞûÖùÖù\úPùãúX÷iûÅõiûLö ú“ùX÷úÅõÉøX÷“ù ú.ýCüqÿ.ýøÿCþó.ÿï“ý¤ÿãúiû\ú úãú\úÉüiû´ÿaÿ°çó¨¤ÿ`¬ûøÿ ú ý\ú†üÖù ý úvþ¬û¤ÿ"üóiûŠÖùüþøÖý†øÿiûÖÿ"ü?ÿ ý;Éþëþ*&¬›óLG* ÿ\eü"þ&ûþÖýÒó›m½óÒzÚLçXTÚ"°°¨¨´ ´ °. ó°óÒÖÿvþ*“ÿÞG¨´ Òz7. Á ; ´ *›z—°mó¤¨Ú. *LÒ*G½LC"z°—Tó`m`"¤°*X*¤óÞçï7mÚ*mó¤çÚ¤½¤mÚïXmÎïøÿ‚ÿ*qÿ¹þ—þ“ýqý ý ý“ý“ý¨þvþaÿ?ÿüþ2þÉþ“ý?ÿPÿøÿÖÿaÿÉþëþiûÖýú&ûú½÷PùX÷øCü\úqÿ¬ûÉþãú†ü\ú\úÖùãú\úëüCü´ýÉü†þüvþ&û"ü\ú†øøøCø\úãúÞû†üëü†üçÿ ýPý"þ ú ùÒö†ø?õ¨ü½÷2þÖùÉü“ùCüÖù¨þiûãúLPù“ù“ÿ&û¤ÿPÿ“ÿ7†þÞ.ý½eüÖýëüãúÖýúeüPùúú\úïýPÿ›X½&ïó*½ÞÚÚz½*¬°ó ÿïýLqýÉüçÿëüCüÒëþT7¤Ú½›7½Öý.ÿÞû¨ü¬ûëü´ý ÿ7—¤G Ò. 2þçÞûz´ýÒÚT¨77zÒ7¤çX°aÿeþÉüPÿ¹þTX½ç½¤ç—L7\½7Ÿzøÿ°´ÿ*qÿLqÿaÿmÅÿ;¬"þó†ü½¨þ›½óÒX7—ó*Á z´ óT—“ÿÁÉüëü&û¬ûÉüeüëþþÚþ°"þzÚþ7¹þüþiû"ü ùëüÖùüþÉü2þ¹þãúÉü†øÖùú“ù2þ\ú*\ú‚ÿ“ù.ÿ úÖÿCþCþÉþú úX÷X÷ ù½÷ïýÞû¬;zG.ÿvþqýiûPý¬û†üÉüüÖý"ü.ýiûãúiû\ú¨ü ú´ýÖù¨þ&û´ÿ2þ*ÅÿPÿÖý¹þqý—þ¹þ¹þëþÚþ†üPÿiûLqý½¬zT7XŸ´ÿ ýãú“ùÅõ†ø?õúÉø¬û&ûPýCü“ÿeþÁÞçÿÎ?ÿóã7ÒTÚ~T‚ÿ‚ÿ¬iëþ~—þ°°X"Öÿ°ëþÎ&ÚÒzX*LT›7ó; ½T çG ó“ý"üóaÿÚ›. ¤Á `Á "´ T´ T´ °¨Ÿ7X7*7“ÿÖý"ÿ¤Ò¨C°¤¤—Ú. ó. . C´ 7¨`*ν‚ÿ—¤ÿ¤m—aÿqýÒÞû2þÞûÖýÖÿ*zT›7zŠçÿ\aÿ¤ÿL‚ÿó“ÿÞ.ÿÅÿPýþ ú—þ úŸ.ýGqý¤ÿãúïýÉøTþúLCü~ãúeþÒöeü¹ôãúÒöiû†øïý½÷øÿÅõþòúðCø ñCøò“ù òÖù“ñÉø†ðú†ð“ý ò´ÿÒöCþCø"üøiûÒöÉüLöaÿ†øXiûqýLvþ´ý“ÿÖù"üÅõ¬ûÅõ¨üCøÉþ\úïüL¬ûóiûÉþú¬ûLö\úÅõ\úÒöúÒöeüÖùvþ¬\aÿTþeþëþ ÿLÿÚ ýT ú› ú` ýCTþóïý´ýÚ?ÿ`Ÿ°´ÿóPý* ý°.ÿ¨Úzm´ÿ`.ýTCü"&û°Öù´ ÖùG ãú; .ýCÖÿ*´ —; `; Ú; T. Ú´ çÎ *T Á Ú´ ç; 7; z. *7`m½z. ¨¨. 7½¤óvþ~Pý¤ÿ¬Ò7°"*½Éþëü7¬û›ãúÚãú°Éüçÿ°›Öÿ°“ýøÿ¬ûÁ\ú¬ÖùL&û7¨ü›iû½÷üþÅõ—þX÷Åÿú´ÿüëüÉü“ù úÒöLöLö ò†ø&ó"üX÷"þÞûqýPýþïýçÿ¨þÒÖý‚ÿúPý½÷ÞûÉø&ûiû ùãúøÉø“ùCø"ü\ú¨ü¬û&û"üÖùëüãú“ýú¨üX÷iû?õ&ûÒöiû“ùüiû¨ü\úCüCøãúÉøãú"ü´ýÚþGqÿ*"þ°ëü.ÿvþÿŸ“ÿ&*øÿÒeþÖÿÖýÖýPÿPýmPÿXÖýTþ&ûTþú°†üÒmmiX&77TT```Þ½¤. —7›ÉþŸüþ¤ÿ\ŠÎÞ"7¤´ "Cï`ÎÚ7zçÁ 7G ç¨7ç*7.ýiûÉþÖýÒTó°Á¨aÿz¹þ?ÿ½L"TGziziT;TqýLPýóÖÿï½XóÞ7zó°½XçÒ*½üþ¤PýT.ÿç*X*qýÉü“ù¬ûøqý†øøÿ úzÖýeþ´ÿeüvþ\ú´ý“ùqýCø.ÿ†øãú¬ãú‚ÿ“ùTþ ù ÿ“ù.ÿú†þÉøÖýLöÖý?õÚþX÷øÿ úøÿ&û—þøãúòø°îPùð ú¬ó úÒöPù†øX÷CøCøPù&û&û´ý¨üTþqý“ý†ü¨üiû ý"üÉþÿaÿÒ“ýëþãú\ú“ùÉøú\úãú¬ûÉøPùÉø†øeüüøÿó*7ÖýeüÒþ7aÿÒ ÿ7.ÿzÞÞ¨.ÿ*´ýÚ´ýÚÚþ`°½¨qÿzqý¤þ`zX. &m¨"Á zG ;¨qýC"þ. ¬CóóXC; ´ óz?ÿÚ ÿ‚ÿzÁ**—7ó—C`7`çT—óóiÎ*z¤XmÚm`°7ÞmóPÿL?ÿaÿÞ.ÿç“ÿ¤PÿÞ¨ü7¬û7´ýóÒvþ°ü¬PùÅÿÒö“ÿÒö7 ù7CüÞvþ“ým¬ûó&ûÞûú†üX÷&ûLöÞûX÷eþÖù ý›CþÖÿqý ý&ûãú“ù ú úÞû.ýÞûÖý ùãúÅõ†ø2ôX÷¹ôÒö?õ†øPùþüL úÁúqý&ûÉü"ü“ýeüëüCüÉüÞûeþ"üÒ´ý¤ÿ°ëþ&iû.ý\úú¨ü&ûøÿ“ý¬ü;ÉøÉüLö“ùÅõøÒö½÷øCøãú\ú¹þ¨ü;Öý—þPýCü¨ü¨ü ý ÿëþÞŸ°øÿ;ëþÉþÿ¤ÿmÒ¬m*qÿ¬ÖýÒ&ûGiûÞCþm.ÿ ý úCü“ùaÿTþÞ½`ç"çmÚ½"—¤—°mïÞÞ½ó°ç½Š*“ÿTçÿ"ï`—T. mC½½izÒ*ÒÚLL½;Î2þŠÉþL?ÿ½üþmÖÿmëü¤ÿüCþ¨üPÿqýÁeþXÒ›`ççççmçç¤ÚTmTXÖÿŠCþÞû.ÿãú2þ&ûüþ†üG¨þ½“ÿ*çÿ°‚ÿ2þŠeþL¤ÿÞŸ\ŠëþÅÿÉüãÞû72þzm\´ÿL.ÿ~—þ´ÿ ýÿü ÿ¬û¹þü“ýeüþ"ü?ÿ úCþPù¬ûPùÖù\úÖù úPùCøX÷ÒöÅõÒöLöX÷úÉøþãú ÿüCü&ûãú¨üeüÖÿÚþLaÿÒÉü°“ùÉüÉø“ùãúÖùÖý“ý ÿ7“ýiÖýaÿqÿëü*“ý°ó°›½Tþ.ÿ úþPù†þú¨þiû ÿãúTþÖùqý ý7*ç½óçÁ¤ã*Þç*¤*X;øÿ“ÿm*¤"¤"°X\mïÎ*°zm*7&z&~óóÒÒŸ?ÿTþ¹þ*°°ÒzXÚÚ¤mmóm°Ú¤mTÁ7Pÿã;óÒ—°~¤ÿ—þ.ýÚþiûãú›Þû°eþ7çÿTÒÚ›7¬Ò\*.ÿÁeþ¤ÿÉü ýiûüüvþëþÎm°7G¤ÿÅÿvþPÿPÿ°½mLeþïýÖýþ¤ÿ“ýëþ&û"ü ùPù\ú½÷CüCø¨üú¬û†üiû"þPýó¤ÿ´ÿ¤ÿóëþX.ýXãú ÿÉøþCøÖýÖù´ýiû2þ.ý´ÿeþmïýÿ"ü“ýiûëü.ýÉü"ü7iûŸ&û´ÿ ú¨þúCþiûüþvþm*7""*?ÿÒTþþeþþ¹þXG*¬aÿÚþÉü"üCþ ýzÿXX&ÎÅÿÒTþïýïý“ý†þÖÿüþX?ÿLŠÅÿTÖýzüÒ¨ü*¨þzmT"T››Šþ´ÿüÉþëüPÿüþiPÿÖýóÉüãÖýTmÒ´ ½. *qÿiCüÖýÉüCþ¹þmGÎ*ÞÒqÿÒ†üm¨üÞëþÒãÎÖÿüþ°qý7&ûqÿÞûŸ.ÿ½ï¤—7XmzX›ŸÒLL¤TzÚmóÒ;Cþaÿ"ü;2þz›LT°—þÁPýÞ ÿTGTŸ¨ü´ýúüþiûÞ¨þ°qÿ ÿz‚ÿÒÅÿL;LiÒ´ÿz"þÞþ7"þ"üPýÖùiû“ù¬ûãúiûãú&û“ùüÉøëüPùü“ùúPù“ù\úüÞû"þ¨ü"þÞûëü úiû†ø\úÒöÖùLö ú½÷†ü ú.ýeüãú¬ûÖùãú“ù ùÉøÅõCø¹ôPùX÷ãú\úeüÉü´ý2þXïý½qýøÿ†ü¬ûeü úÖý“ýüþçÿ´ýqÿeü"þþeþLPÿóaÿøÿ ÿÿÅÿaÿm¤ÿÁÅÿÎ&—›zC—z¤Î——›ç—ççç°óçóÚL›X\XÁX¤m`½ç›`mTŠT*Òz7½°zXzï77¤›7Þ°›XóÞÒ½Þ—¤*ó°. —zmzmG"ó`—T°iPÿPÿ¹þTþÿ¹þÚþçÿmÁ½ÁŸÒmÞzÒ¬7Pÿ¨þ ý¨üCü¨þ¨þÅÿmïý¹þ"ü&û´ýÞûqý;†üTþ ú¬ûúú&ûúeüúeü ú¬û&û ú¬û ù"üX÷ÉüÉøþ¨üPÿ—þPÿ.ÿ"þüþÉüïýÞûCüiû\ú¬ûÉø.ý ù.ÿÞûþüþ ýÉü\úÞû ù"ü“ùëüãúþëü†þ.ýþ¬ûqý&û†þ"ü¨þiû ý†øPýø´ÿúŠiû&ûÁ ý\‚ÿ´ÿ\ÖÿÅÿãaÿ› ÿãCþaÿqý"þPýþÉüPÿ"ü½Úþó*Ò`¤XçTm—¤mmqÿ?ÿþ¹þeþ\çÿ*¬›TÚ`7Ѝ7´ý7´ýX—þG¨þGÉþXPÿ›`°ÚXqÿLþ“ÿTó¤øÿ—qýÉüëü*PýiÖýŠÉü¬ëüïÉþŸX—Þ—7óóΰX›7°øÿ¤ÿPÿGëþóüþ`z½Ú°ó—´ÿÞeþÚëþ**ÅÿeþÖýLüLÖù?ÿ“ù‚ÿ úiqý7móÎÚþÎqým´ýŠüCø½Òö"“ù7ãú~ü"þþPýçÿvþeþ´ÿ&ûçÿÖù¤ÿiû†þüeüiû úiû úCüCüÖý´ýëþÖýþCü úú½÷Pùøãú¬û&û´ýÖùPýÖù¨üiû.ý´ýëþ—þøÿÉü—þúëüÖù ýiû“ÿüiûTÖùLCø.ÿ\ú“ÿ.ý~þ;ÖýÒeþG.ÿŸ ÿ“ÿþÖÿ.ýÁ“ý°üþ`üþ¤ ý½&ûÎÞû*ïýTÅÿ°Xó*;¬“ÿXLÎGóç°*óm*°ÚóÚ¨C´ `m¤`mÚ›m;Á¤ÿ~ããXŠÒz›Þ¤Ú*TÒm\;óÞ**mÒçz¤.ÿ ý.ÿÉü†þëüþCü ÿeüiTþ½¬ÞãiqýóCü†üþPÿÖÿþ¨þ¨üÞûeü ú“ý"ü´ýÖý ý“ý ýü"þiû‚ÿ¬û~üÒ"üLüÿÞûÖýÞûPýCüÉüÉü&û¬ûPù“ùú ú¨üeüPÿPýçÿ¨üeþ¬û†üÞûiû†ü&û¬ûãú ù ú½÷iûÉøþiûÖÿqý¤ÿþëþqýPÿ.ý“ýiûÖùÉø ùÉøü"üÅÿ‚ÿzÒ›Ÿ—þTþëüÖý´ýÖý.ÿÖý—þ“ý"üqý ú“ýãúeþ.ýqÿ\Pÿi¹þ½¨þŠ“ÿ°Šã77°ãÅÿÅÿ;7mÞÚÚ¤—Tó½›XÞzÒ½X¤ÿ*Pýã¨ü°Tþm~ÚLó½óÒ&móÞÚóÞmÒmzm—›¤G*ç¹þ"´ýL¨ü›´ý*‚ÿX½ÖÿóÖÿm‚ÿ".ÿ" ÿXvþL.ý*Éüüþqý.ÿeþøÿLŠÞiXX›ó&—þ;eþЬ7L›iŸmÅÿL ÿãeþÒPýçÿeüëü¬†þ›øÿÚmLóÅÿç?ÿT?ÿ—¤*ç*þ`qý¤Éþ;X;Òüþëþ“ý?ÿëüøÿ.ýqÿ ýþCüTþÉü\qÿ½7üþ¨þeü´ýÞû“ýeüqýiûqý&ûqýü†üÉü&ûëü&û¨ü¬û†ü¬ûeü úãú\úÉø\úX÷ÖùCø ùú½÷&ûÅõ&û?õ¬ûÒöÉüCø.ýøÞûø&ûCøüøÉü½÷ü“ùiûÉüüvþëüÖýPýïýÚþÖÿz&°Òçÿaÿi ýqÿiûÖýiûþ¬û—þiû—þiûþCüqý2þÖýX"—ïm~\Úþmvþ**"*ÚÞ`ÚTÚó`Òç½`›—Ú*¤°´ÿ7Šó"m*m`*"—ŠÒ¤ÿŠm½Š*TÒ›X*X7L~\øÿaÿmmm›7óXL°°ÒL½2þ ý´ÿ.ý“ÿ´ý¨þ“ýÖývþ¹þqÿ*?ÿÉþïýÚþ"üþ&û&û&ûÖù.ý\úçÿãúCüGqýz“ýG¨ü~ëüLÖý*¹þÖÿqÿqÿ ÿ"þPý†ü¬û¬ûeüeü¹þPýTþzqÿqÿqÿTþ¨þaÿÖý2þÅÿó›7mÒz?ÿüþþëü¨þ“ýøÿaÿÅÿ¤ÿqÿŸ½LLm7½X*7Ò**°ãm“ýPýiû¨ü"ü“ýqýþ2þþÅÿÅÿ;øÿÒóŸX7zŠX°¬½XTT°°.ÿ¤ÿÚþÅÿeþ?ÿTþþCþÖýþ“ÿ¨þL‚ÿ°çÿã´ÿGómÒ°XL7½zó´ÿ7¹þøÿüþþ;?ÿGXX*ÒmÒ¹þm ýG"ü“ÿeüþ.ýÖý†þ´ÿqÿÉþ‚ÿÉüþÞû´ýeü´ý†üëü“ýPý?ÿ¹þ“ÿ†þ“ÿ“ý;Tþ½“ÿ°°&Þ\*ÉþTþCþqý¨þTþÉþ¹þmÿ?ÿ;“ýGÉüG ýÁÖýŸÉþÒ?ÿ~qÿ\*¬L&~iÒX`°L7½çÿmÉþTïý°“ý7PýÎvþŸT´ýqÿ¬ûPÿëü° ÿ7mçÿ“ÿëþÿ2þ‚ÿþ´ý?ÿëüÿ†ü ÿëüþ“ý ý ýÞû&û&ûÖùÞû&ûeüÞûÉüü†üiû úúÉøPù†øÖùPùiû“ùÞû ù&ûÉøúPùPù\ú ù&û†ø úX÷ úX÷iûPùÞûiûãú¬û ùãú ù&û úÉü¬ûvþCüCþCüïýÞû.ÿ¬ûŸü\†üÚþ´ý†þøÿ*½~Pÿ7\zïÞ›ó"T礛—*"*Ú7—C—`LŸï›mÚ7¤"óm¨C½ó7¤zmó½¤ó—`—ÚÚT¤¤Þ¤7Ú½½;ÿ›Tþ´ý"þ›øÿ*Ò½Á7~**m;mŸ`LÞ¨þmÖýLTþz"þTPýëü*Pý“ýÖý´ýþ.ÿÖýÒ"þ.ÿ—mó°aÿ¨ü~ úvþ\úvþÞûqÿeü¤ÿ¬ûTþiû†üÉüÞû"þ¬û†þiû‚ÿÞû‚ÿÞûCþãú ý\ú.ýÞûëþ´ý7vþmCþG†ü.ÿ\úeþúÅÿÞûÒ ýã ý\¨ü?ÿCüÚþ†ü‚ÿ´ýL†þ*ïýçÿÉüÖÿ¬ûaÿãú¤ÿ&ûLüŸCüÒüãúüþú?ÿüeþ°‚ÿ.ÿTþãþmþÖÿ´ý"þ†üÉü¬û.ýiû ÿü¤ÿ"ü ÿ¬û—þãúÚþ úÉþ"ü¨þÚþPÿ\Γÿ~.ý"þ"üqýþqÿ*Öÿ´ýeþëüÖý´ýÚþCþ¹þ\ÖÿÒzÎm¬zL“ÿ´ÿ¹þãüþ½“ÿ*ÅÿÒÅÿ›çÿXãX°Úm*G—ÒX½ó½ó?ÿÞ“ým´ýX¹þz¤ÿ›“ÿ.ÿ´ÿï~ÒGzm›½½"νøÿz“ÿqÿGÁX›zL7øÿ&TþÚþ“ÿëþiãL*°¬7Š››z7óãã*“ÿÒëþ¨þïýÚëþ¤aÿ—qÿ?ÿ½?ÿLóÒ°°—þó"þXüþXÁ&qÿÅÿqýaÿPý;Úþ°¤ÿ´ÿ ÿþTþeü´ý¬ûPý¬ûëü¬û¬û"ü\ú ýãúPý.ý.ýüþ¨üüþ¬ûïý\úëüúeü&ûëü¬ûÖý¬ûëü&ûiû\úãúãúÞû\úeüÖùCüú¬ûúÖù\úÉøãúÖù&ûü úþ úÖÿãúmúÚþPù¨ü“ù¬û&ûCüÞû ýeü´ý ýTþ´ý´ÿeþXÿÒ½ã›m›Åÿ*Öÿ7çÿ*ãL›&½—mT—`**Òç›ç—¤Ú——›`ÒçÎÚóX¬ó››¤"*¤½T½7›Òm½7ÁXïLmÒ7½ï&&&°&üþ°Pý´ÿCüÿ"üvþeüPýeüÖýeü?ÿëüçÿ ýPÿCüëþiûqÿÞûLCü~"üÖÿÞûëþeüÉþCþÅÿçÿ*?ÿÉþTþ†ü.ý&û†ü¬û¨üÉü†üPýeüÖý ýÉþ"þ´ý¨ü"ü ú"üú.ý\úþÖù¹þ ùPÿÉø´ÿÖùÁCüL.ÿó¬*Šó*Cþ´ÿü¤ÿ ú;úGãúÞeüXPýŸÞûG&ûÒ†üÞTþÞ“ÿ½~óŸ“ÿçÿÿqÿÉþ´ÿvþãÚþGÉþ7ÿ\;*¤ÿqÿL;Îm*ÒXаóG*m›ãLCþ†þ†üvþÉüeþz´ÿóçÿÚPÿ¤¨þ½þŠ“ýmqým“ýã—þXÅÿ*çÿ½Pÿ—¹þ½ëþLÖÿÒ\T°"*L¬üþÞ.ÿ*°Š°i°°Xøÿ"‚ÿT"ÞïzóÞãzŠï¬*XÎ&¬ï*½L¤*mTÒ›ózó›°zmmÒL**Î&&z\&Åÿ~¤ÿŸŸÞó"›‚ÿ—þ“ýqý¨üCþ ý“ÿÖýóüþL;óŸÅÿ7†þPÿþïýïýïýþÿþ\“ý&ïý½?ÿ*iüþmÖý"þ¤ÿÉþ´ÿaÿ;qÿmüþqÿ"þ"þ´ý.ý.ý¨ü¬ûëü&ûëüÞû¬ûCü\úü úü"üëü“ýÚþ´ým“ýÖÿÖýþþ ý.ý¨ü†ü"ü†üÞûÞû¨ü&û ýãúëüãúeü ú&ûãú\úiû úiûiûÞû†üeüÉüÞûü&ûiûiû¬ûCü¨ü†ü“ý†ü´ý¨üqý†üqýeüÖý.ý"þ—þüþÿÅÿ“ýCþëüeü2þ†üëþ°m›T½ÚÒÚ\Ú7Òç"¤›`L*¬mÎ***½m—ç"¤XÚÞT"zXGÞÅÿøÿXï°›mTL›ÞmŠ›m°ÞT"½*Lm7óÞ77LLvþL“ý;TþÁçÿi“ÿŠ“ý~ü.ÿ¬û†ü½qýPým¨üeþ"ü.ý¬ûïýãúçÿ\ú° ú°iû"ü?ÿüþÞûïý¨ü¨þ“ýÿ´ý2þ ý ý ýPýþ"þ ÿCþ?ÿ´ý¹þ“ýÚþïýÅÿ¹þLqÿ´ÿëþ ÿþ“ÿ†þi~ÒióL~Šã¤ÿÒÉþzqýδý“ÿÎX°›¬7´ÿ°eþ°PÿÒ°7XLóX\Š\›;*óó7ŸmLŸÅÿi¤ÿL77ïÒLóÉþ´ÿÖý.ýÒeü°ëü~vþóëþiÉüÁãúãúaÿ"ü†þÖývþ¹þÖÿ¹þ¬†þPÿ°ÿŠ.ýaÿiû.ýãúÞû&û¬û¬ûCüÞûÖýÉüÅÿ“ý“ýPýçÿ.ý?ÿ´ý´ÿPÿL\aÿŸTþÚþm¤ÿ›Åÿ~“ÿÿ?ÿÖýÉþ“ýeþëþ ÿ~LïŠ7X°óLTþ*qý½¨þX¬7а¬*z°›Ÿ°;T;Ú\½´ÿmaÿLm*7øÿÞ“ÿXaÿ7;mÁG~G\G‚ÿ†þó¹þÁçÿŸÁ&zX´ÿaÿÿüþã ÿm.ÿÚþPÿüþm½Gøÿ;¹þ ÿeþTþ—þ¹þüþvþaÿ´ýPÿïýÉþvþ"þPÿqýøÿëü¤ÿ¬ûvþ¬ûCþ.ýaÿvþ“ÿÖý¹þ"üCþiû—þiû´ý¬û¨üCüëü.ý—þ"þ*¹þiëþ½TþL.ýÚþÉü ÿPýqýXÖýã†þÅÿvþ¹þïýeþïý"þCþqý.ýÉü"ü"üeüeü´ýqýÖý´ý“ý´ý"þ†þÖÿ\ÞŠX›½GóÁLLÖÿÁ½ÎÞXó~~Šãó°T½¤TmÚ°—ÚÒmÒÎ;Xz¤77›°°ç°`"—¤`¤*mó°¤ç—Ú"—Ú7Ú*—zóó´ÿGTþÖÿ´ýaÿ´ý‚ÿqýÅÿqý;eþ7 ÿ›Tþ~ ýPÿPým´ýX´ýóqý†ü“ÿ&û‚ÿúPÿ ú†þ&ûïýiûïýiûeþ&û†þ&û“ý&ûü&ûãúãú&ûúãúPù ú ú¬û†ü“ýÖý.ÿ2þ.ÿþ“ýqý&û.ýãú2þqýPÿvþ¤ÿPý¤ÿü~Éüþãþmëü´ÿ"ü ÿeüÿ.ýLþïÿóÖÿÖÿzÅÿTÖÿÚqÿT†þÞCþz¹þz¤ÿXmLøÿ›“ÿm\°m°ÁG\X~ÎãX´ÿmüþaÿ ÿ—þüþvþ2þ†þPýÉþ.ýÉþþ“ý—þ¨üaÿÉü\“ýÖýLþÅÿTþëþqýPýÞû ý&û“ýÞû“ýëüPý“ý“ý´ý"þÖýÚþÖýPÿ"þÅÿ2þPý¤ÿ¬û¨þ\ú´ý“ù ýãú¨üÉü“ý"þ?ÿCþÅÿ´ýqÿPý?ÿ.ýPÿëü—þqýCþ ÿ.ÿãÒi&óóÒX›½ïm.ÿm´ÿŸXÒ7ãÒ›½7ï—mÚLÚ›ïX—"Ò"&TÚ*—½Xóm77óm`L—°—LzÞ°ïm›mzXzÞÒóÎ;7¬X½Ò››°T&T´ÿzPÿmÅÿüþXÖý“ýG2þŸvþaÿCþüþ´ý¤ÿ¨üaÿü¹þeüeþPýCþ ýCþüÖýiûPý¨üÖýÖýïý2þëü"þ¬ûCþ&û"þ¬û"þÉü¨þ—þþ.ÿ ýÚþ¨üÖýCü"üü¬ûCü"ü¨üeüü¬ûü&û ýãúCþiûaÿ†üÖÿþ.ÿ¨þ2þvþCþ"þÚþ.ýÉþÞûÿüqÿÉü‚ÿ.ýqÿÖýüþïývþ.ý†þëüÖÿ¨þXçÿïÅÿGqÿ~ÖÿÁ7zL&Š7°ÞL½L›GXÖÿi**G°½~zŠÒÒóL°X½›°zÒ°LLzómmmãüþøÿqÿ°\¬¬ÿІþ7¨þÁPÿ\çÿ*çÿGqÿiüþ ÿ´ÿ´ÿ“ÿ´ÿëþÖÿ.ý‚ÿCü.ÿ†ü;¨üeüïý†ü¨ü.ý ýPý ý¨ü&û¬ûÖù úPù úÖù¬û¬û†üÉüqý.ýþ ý.ý¬û¨üiûïýÉüøÿÚþ;ÖÿçÿLPÿÅÿ†þÖýÿëü°ïýÿLþ7ü*¬û;“ý\þëüüG†ü¬qýιþLmÒ¬½Ò—T`çÚçÞ¤zÚ7TóTÒ—°Ú°TÞ°m\7ÞL›*XãÒÁ\L´ÿm\PÿïýóeüLÞûÞûïÞû›üøÿ"ü¹þCüÚþeüÖÿeü°†üÒ“ýÿ\Pÿ~þL†ü¤ÿ¨ü ÿïýaÿTþ.ÿ ýÖý¬ûÉü¬ûþ†ü\¨üŠ"ü½Cüz ý°qýPÿqý—þ"þ?ÿ´ÿó&mÎm°¬GGi7ãÎ&z½—½½"›"T›ÚÒ—¬TóÞŠzó›°X°óXóTmmXmmïLÒzz7›½7ŸÒçÿãøÿóçÿmøÿqÿãÚþŠ?ÿ7´ÿ*Pÿ‚ÿTþÿ2þüþ¨þÿ¹þ¹þþïý“ýPý´ýPýPý ý†üëü"ü.ý ý.ýCþeüÖýÞû¨ü"üCüëüeü“ýeüPýÞû"ü&û úÖù\úPù"üúëþ ýøÿÚþ¹þÉþÉüqý¬û¬ûiû ú¬ûãú"üÞû†üëü ýqýqýÉü.ýiûeüúeüÖù"þ"ü¤ÿCþëþÿ2þ“ýÉüïýüÅÿ.ý´ÿGLÒ*;Öÿ¹þ2þÖý ýeþPý?ÿ†þÖÿaÿm›¬Îï››7Á;Pÿ´ÿ†þ°‚ÿÒŠmz¬mÞmó½mzLzL½›½XXz°ÞmL"LÞLóm*\aÿÒçÿŠGzX—Öÿz.ÿLüþÎüþ›çÿ›ã7°ÁL*i㬊óÎó7¬m~\¤ÿŠ.ÿi¨þÅÿ¹þëþüþPÿ¹þ ÿ“ýÖýëüPý.ýþ´ý ÿ¨þøÿ“ÿÒ“ÿGvþ°.ýÅÿëüaÿÖý´ÿ?ÿøÿãmÁGøÿ¤ÿ¹þ2þ“ýþÉüÚþëüøÿïýÁ.ÿXÅÿ&‚ÿ¨þ\ïý&vþÞçÿ*ã*Šaÿ7†þX—þÎaÿmÒL7LÞ*›ÞÒŠÒ¬°m*ŠÚþ.ÿÁGLG*ã°Î°ÒmóïL°i;7Ò½G*Ÿ¬;°~~øÿqÿÖÿÖý?ÿÉüÉþÉü?ÿ†ü´ÿ"ü´ÿÞû?ÿ&ûïý\ú.ý\úþ úÅÿ ú ú\ú—þúÉü\úÞûãú¬ûãúiû&ûeüÞûþ"üÚþ¬ûTþiûPý¬û"üÞûiû"üü¨ü†üPý†ü2þëüÚþïýqÿÉþøÿ¨þÅÿÖý ÿÉü†þÉüÚþ—þ*ÒÒPÿ\2þ.ÿ½Á&7\ÚmmÎóó*Þ¤Á¤Á`~TPÿ›†þ› ÿT¤¬mXçó½&ÒLøÿi“ÿŸçÿm?ÿ‚ÿΟ¬çÿŠ—þz—þãøÿçÿÒaÿóÅÿŠøÿi¨þëüeþ¨üþPý†þïý“ÿTþó2þiÖý7qýó¨üeüPÿCüÉþiû2þ&ûPý¬ûÖý ýaÿqý‚ÿ“ý¹þ"þ¹þüþÖÿ¨þÅÿPývþ"üqý†üÖýeþ¨þ;ÿÁaÿ´ÿÅÿ"þçÿ´ý;—þó?ÿ\´ÿøÿŸÒÞŠãŸqÿ°´ÿŠó½z*ÖÿÅÿÅÿzÖÿÞ¤ÿLçÿó›"T"—z›°mÁ;óz°›½77óóX½GTXÒTÅÿÖÿ*ó*LXóó**Tz*øÿi~ÒÒói?ÿ\.ÿ*“ÿŸøÿGaÿ2þÖÿ´ýüþ“ý—þ´ý¹þ¨þ´ÿ7Lóçÿ¬ÚþÅÿ¹þTþ ÿeþTþ.ÿïýøÿ—þÅÿ ÿþqÿPýeþ¨üPýÞû.ýüïýëü†þPývþ†üTþ"ü—þeüÿ ýÖÿ ÿmPÿ\þ“ÿÉüCþeü¨ü.ýÞûüþ.ýmÉþó´ÿmÅÿaÿ¨þÉþþ ÿÉþaÿPÿëþþ.ÿëüãÖýeþŠ.ýiûÉþÞûëþ2þm¬ŠóLÒzŠÖÿ~¹þÚþã“ÿãmãÁÁ“ÿqÿvþ—þïÖÿmó¬&Ò\´ÿ´ÿëþÅÿ¤ÿÒ\i¤ÿz¨þ¬“ÿÒ;aÿÉþ¤ÿaÿaÿ‚ÿëþ?ÿ—þ‚ÿ?ÿÿÚþCþTþ"þÿÚþ~—þL"þÿÚþüþÿ?ÿ2þÿëüÉþeüüþ¨ü?ÿëü?ÿ†üÚþeü"þÉü´ý¨ü.ý¬û"ü¬ûeüPý“ýÿ¨þ´ÿ ÿÿTþeþ´ý†þeþ?ÿøÿqÿëþ¹þeþ“ýÿïýøÿ—þLÚþó¤ÿimz;7Éþ°Pý~ïýó*ïÞÒ°ómózzi—óÚTX½L77çÚ`z—m"°T½`Tç—`Ú``Ú—z"Þ›ç°çï›Ú*Ú*"Xó**?ÿ¨þ†þó†þ´ýiëüLÉüaÿëüvþeüCþ¬ûTþ&ûeþ¬û†þ"üTþeüþ¨üþ.ýþeüqý ú.ý\ú—þÞûÅÿqýïý´ý.ýçÿeüCþiû¨üãúiûÞû¬ûqý¨üeþPý¹þPýüþPýÚþëü"þüþÞûÉþ¨ü´ÿ“ý*2þ;2þ*qýüçÿiûiûmü´ý´ÿ¨þÅÿÚþ.ÿÒaÿ›aÿïüþeþvþzÿ"‚ÿ›aÿ7aÿóqÿÞ¹þþqý“ýëþXŸóÎ;óŸ¬óÒz~¤ÿ?ÿeþ´ÿCþÉþiPÿ“ÿÚþÅÿ¨þ´ÿ ÿaÿÅÿüþ¨þ—þÿ“ÿ&‚ÿ7Pÿó¤ÿ&çÿ¬Åÿ¬qÿ° ÿøÿ—þ´ÿ"þ´ÿ"þ“ÿCþÿvþPÿ ÿŸ.ÿ7vþL“ýaÿ´ýçÿvþ~Éþvþÿ2þ.ÿ†þPÿqÿ“ÿ~\mÒÖÿ‚ÿÒqÿøÿ“ÿqÿ´ÿqÿÖÿ“ÿ‚ÿ?ÿ.ÿ—þ?ÿeþçÿ ÿ‚ÿL—þaÿëüqÿ.ýmÉþóøÿ\ÅÿÅÿüþÅÿaÿ;çÿ¤ÿÖÿ†þ~ÉþïãX7XTL›G*z¬LÎÒXL7qÿ\?ÿøÿ ÿaÿ°“ÿ½øÿ°"óÞ7;&qÿã“ÿ7mL¬ÒiXÒÅÿΊ½¬çÿ&PÿÁ~ÞïÞm7Îó*&7°z¤ÿmeþÿ´ý¨þ†þqÿ‚ÿmPÿÒ"þã†ü;¬ûÖÿëüÒþÎeþiCþvþ?ÿüþ¤ÿ›øÿm“ÿ›†þŸqý´ÿ.ývþþTþÉþÉþ?ÿëþ¤ÿaÿÅÿ´ÿaÿPÿÚþTþÚþ†þ.ÿaÿÿÅÿvþ.ÿeþ†þPÿÉþ;Öÿ;çÿÖÿ\ÖÿGÅÿ**°LiŠz&LŠ7LÒ¬›ã›;7*°ó**LÒóóÁ7Š7°*Òi*½zÒ›7zï*7Gói7PÿÒCþLþ“ÿTþaÿqÿã¤ÿÞÉþX´ýçÿ ý¨þ ýÖý ý ýeüCü¨üëüqýïýqý“ý†üCüiû&ûiûãú"üiû¨ü¨ü ý“ýÉü“ýü†üiû¬ûãúiûúãúÖù&û úüÞûÉüëü ýCüÞûãú\ú úPù&û ùü\ú.ý¬ûTþeü ÿPýüþqý—þ.ýÉþ“ý ÿ“ýaÿëü´ÿeü“ÿÉüçÿqýóCþLëþzqÿ½ÿXÉþóqÿm‚ÿÎëþ½¹þ*“ÿL;°mzŸ½Ÿ\Ò7XXT½TTÞ*XXz7›LiÎ&&"&—ã½mL*7Öÿã¤ÿ&¤ÿ΂ÿm¹þLCþLÚþ°PÿÚþÒÖýqýŸ"þÿTaÿ"ÉþLCþ2þóTþG¨þzvþ´ýLqýCþóÅÿÞÁ½m´ÿ\“ÿ;mÒX*¬mi7Á~~Ò°LLÿ.ÿvþ†þ?ÿ¹þPÿŸ*~øÿÖÿÖÿÒŸŠz°Þ›XŸzLLzøÿ&*~çÿ;´ÿŸ&óóXŸ¤ÿÖÿ;;7ÞÞïLzÎÁ7Î;mÞŸ7L*üþPÿÖýqÿ"þÖÿzX&Λ ÿz¹þÁüþÖÿ“ÿaÿ‚ÿ‚ÿüþ†þ†þTþÚþ ÿÅÿ¤ÿ°Pÿm†þëþ"þþÖýÖý“ý"þþÿ¨þ.ÿ ÿTþ?ÿqýÿ.ý2þ ý ýëüëüëüÖýïý.ÿPÿ“ÿCþ.ÿ.ý—þ.ýeþþCþ¨þÚþÉþüþ¨þvþ†þÖý2þ ý.ýü†ü¬ûCþ ýøÿüþüþ“ÿïýCþqýqý´ý´ýCþÚþüþÿ´ÿÚþ;¹þmeþ\Öým´ý°eþ~¨þøÿÿ“ÿÅÿqÿÅÿ´ÿ.ÿ°?ÿ½Öÿ¬¤ÿ›´ÿïm*X*½ï7L°z&TÞ7°ÒL7zTX—7T7½ÒmΊҟ°\&Îïm›Î*½XG°GÞz›Š´ÿmÿÅÿÅÿ°Ÿ°ÒÞ°mŸPÿïýCþ ý“ý´ýëü¨þCü¹þëüqÿþ~qýÁ¨üÞû´ÿ&û†þiû2þeüþqýÖýÖýÖýCþ"þ¹þ†þüþÉþ†þ¨þÖý¹þëü—þCüþCü´ýÉü.ýPý ý"þþ—þ¹þ2þ ÿqý ÿPý—þ¹þaÿã°mó*qÿCþÅÿ†þÒ¤ÿ*øÿm~Þ7mŸó\ÒmаóÒz›óómÞïó*Þ›Ò›ÒzÒXzLŠãÒÁ**ÒŸiÚþ´ÿ"þüþ2þÖÿCþGTþ›eþÁCþÖý´ým2þÁCþŸqýÉü´ÿÉü‚ÿ¨ü ÿÞûþiû†ü&û&û&û&û¬ûü.ýqýüþ ÿqÿÖÿ¹þÚþ"þ“ýeþ“ý¨þþTþTþ2þvþ—þ¹þþ"þCþ2þÅÿPÿ\¤ÿ\†þ\ ýÉüÒÖýmþÅÿÉüÖÿCü;“ýLÉþm?ÿÎøÿóó7Šm7›;7¤ÿŠ´ÿL¤ÿ¬ÉþãTþGPÿmzÒ*LzÖÿãçÿ;‚ÿÖÿ¨þ\?ÿãLÒ~~¤ÿ°qÿŸŸaÿ.ÿm‚ÿøÿqÿ.ÿëþÚþ—þ—þÉþeþ?ÿ¨þaÿ‚ÿ¤ÿ*ã°&ÒiiŠ´ÿÒþÿqý†þTþ¤ÿ¹þ‚ÿüþ ÿPÿPÿPÿ†þ“ÿqý¹þÉüeþëüeþÖý¨þþ ÿqý‚ÿïýüþLçÿ\\Á‚ÿÿ‚ÿÚþ—þ¹þvþëþ¨þ´ÿ¹þøÿ¹þÿ“ýþ¨ü†þÖýÖÿ‚ÿ~L;;ÖÿPÿÿm.ÿ~ÉþPÿÉþ—þøÿ‚ÿÎ&Þ°ó°L*ŠÞãïãLÒ&ó*7*&Ò&X¬°°Þ°Š*½Þ½mï7°"7TÒ›Þó7°½7"z"Ò"ó—ÒTm›Þ7¬7X°óçÿó“ÿ°aÿz.ÿ\ ÿÅÿ ÿqÿ´ÿL~7Áã°Šqÿ¬.ÿX—þ›“ýï ýX ýÅÿ ý—þqýëþÉþ~“ÿóPÿøÿ—þ—þ2þ2þÖýeþqývþëü"þÉüPýPý.ýPýPý¨üÉü¨ü"üëüÞû.ýü.ý"ü´ý†üëþ´ýÖÿëþ“ÿ¨þ—þ“ýÖý†üïýCüëþ ýÅÿÖý´ÿÖýÿ“ý¹þPý†þëü¨þëüaÿPý~þCþ°qým¨üãëü¬ÖýL¹þL‚ÿ**;›´ÿÒëþ~vþó¹þaÿÒPÿó¹þÒüþqÿm‚ÿLPÿ›qÿ“ÿóÅÿó~Á›ã&L*ÿqÿaÿm›G~m~LÖÿ~qÿÒ‚ÿ°´ÿ´ÿçÿaÿ¹þLïý°“ýzPý7ëüøÿqý´ÿþçÿ"þ¤ÿ´ýÿ´ý ÿ“ý ÿPý¹þ ýeþ¨üCþCüþü“ýCüÖý ý—þ´ýÿþÚþþþ¨þ“ýqÿqýqÿ“ýqÿ†þçÿ“ÿ~çÿŸqÿŸ¹þ\CþÖÿ"þÅÿ—þ°¤ÿ›°X&ãzmimÁi~\Î;Š;*Òi½TXÚ——Tz7ó*°›°¬m›7Xï7ÁÒÁmG*7ÒÒÁóÒ*Ÿi\i;ŠŠ‚ÿz ÿiaÿz*ŠøÿaÿLüþÅÿ ÿÅÿaÿøÿmøÿ°Úþ*qý“ÿëü¤ÿPý;qý´ÿqývþ´ý´ý"þ"þþTþÖý¨þïýPÿ"þ?ÿ¹þ?ÿ‚ÿÅÿøÿ~Åÿ;ëþ?ÿ2þeþ2þeþ†þ?ÿ ÿqÿaÿeþ´ÿ´ýÁ†þÁÁÅÿPÿeþ¨þþüþÚþqÿaÿ*ÅÿLÁÖÿ¹þ"þ½Pÿmøÿ*X\mm;m\ã~Ÿ\ŸÁÅÿ7´ÿ*°ó*óøÿ~aÿó*GX7L°*møÿ›çÿ\´ÿóLX7XÎÎLÒm°&½\ã°Šã¨þ¤ÿ¨þ“ÿ¤ÿŸøÿPÿÚþqÿ.ÿ“ÿ°“ÿÁqÿ~‚ÿLqÿçÿÅÿ*\qÿ2þaÿÖýÿ2þÿ2þÉþïý2þ“ý´ý ýqý†ü.ý¨üqýqý"þCþvþvþþ†þþÚþ2þÚþ“ý¹þ ývþ¨ü2þCüCþCü—þëü¹þ´ý2þPý"þ¨üÉþ†ü¤ÿ ýçÿPý“ÿPý.ÿ.ýüþ.ýPÿÖýÅÿÚþmÅÿ&;ãÅÿqÿ¹þ¨þ—þþ.ÿCþ‚ÿ¹þÿ"þ†þPýÚþ“ý´ÿCþLþ—þ›aÿ›‚ÿXqÿiøÿ½GL°Ò°mmi*GÞ½Þï*zLŠm7›ÎLŸ¬Ÿ½Šóm"LTŠ7Ò*qÿi‚ÿ*ÖÿL*Ámzm¬*ó‚ÿ.ÿüþ7ëþ*†þ*þ&"þ ÿã´ÿX?ÿóþ¤ÿqýüþÖý‚ÿ¹þ*.ÿ*Éþ´ÿïýaÿPý.ÿqýÉþCþ—þ.ÿüþëþPÿ2þ?ÿþüþ—þ ÿ¹þüþ—þÚþ ÿaÿ;\óÒ&~XïÖÿï´ÿX¤ÿ&°XGÞ›Š7~~?ÿXüþLqÿL¬GXÒÒνz\ãøÿŠ7°½LG°ÒLm7\´ÿ7aÿ&aÿGaÿóÿøÿvþÉþ´ýeþÖývþvþÚþ.ÿPÿøÿ.ÿ~Tþm´ýþÅÿCþPÿïýTþPý.ý†ü¨üÞûü¬û¬ûeü†üqý.ý´ýqýqýPý´ýPýÖýPýÖýëü´ýeüÖý†ü´ý ý.ý“ý ý´ý“ýïývþ"þëþ2þüþTþüþeþÉþïývþ ý—þÉüÚþ“ýÿvþqÿ¨þÖÿ†þÖÿ"þ´ÿþ;üþÁaÿaÿ&“ÿG´ÿŠçÿ*LÎøÿó*Ÿmãm7Ÿiói&Á°&óŠiLÎÎLŠ›XziŠzŠ›\ŠG7G›zÞzL;óãXŠXÒøÿÒçÿÞ‚ÿzqÿG‚ÿLqÿ‚ÿ‚ÿaÿøÿ´ÿ\ãÒLÒLmçÿi&\i\Þ;*¬øÿXÖÿXçÿXÅÿŸ“ÿ?ÿ´ÿ¹þqÿTþÿ†þPÿPÿ´ÿøÿÅÿ\øÿL‚ÿ\?ÿ*ÿ´ÿ¹þPÿ¨þÉþÿTþÅÿ†þaÿ¤ÿÖÿqÿ´ÿ\øÿ´ÿmÿÉþ?ÿCþ.ÿeþÖÿ?ÿøÿ´ÿÖÿ“ÿÖÿÅÿÅÿó´ÿÁøÿ*;´ÿÁÅÿ¤ÿã ÿÁ ÿÅÿ½óL¬L›iΊ¬¬Þ*¬**7¬ŸmÖÿPÿ¤ÿÚþ“ÿ.ÿÅÿøÿΟm~ŸGÁ~ãmãÒ&ÁÒÅÿ—þaÿïýqÿCþ‚ÿëþ.ÿüþ—þÉþeþ¹þ—þÉþ¨þ†þCþCþþ2þþ†þ2þ ÿüþPÿ“ÿÿ‚ÿëþ.ÿ.ÿaÿÿqÿvþ.ÿïýÿ´ýÉþ“ý†þ“ýTþÖý´ýþ“ýþÖýþ´ýTþqý—þ ýÚþëüaÿ ýçÿ.ýqý*Öý°¨þŸëþ—þçÿTþÅÿvþ¤ÿ—þqÿ†þ.ÿ¨þPÿüþ;¤ÿz\ó*i*Š*G¬ŸqÿçÿÉþŸ“ÿ¬ó*½iL*mÞøÿïLã¬Áã´ÿm“ÿŸ~ãGŸ;;Öÿ;¤ÿøÿ‚ÿøÿ°´ÿ‚ÿ;´ÿ\øÿóÅÿi ÿ†þLTþ‚ÿ2þ?ÿCþqÿTþÖÿCþÖÿïýüþqý2þ“ýTþ—þPÿüþçÿ†þ¤ÿ´ý ÿqýÉþPý—þqý2þÖýþvþÿÿ~qÿ7qÿ¤ÿÒ“ÿmëþaÿ"þþÖýPý2þqýÿ¨þÅÿøÿŸ*‚ÿüþøÿ—þãÿGçÿm7°½ÁÞÒŠGŠ*°óÒÞm7miX¬X"ÒTó7°ÞL¬*ÎzÒóÎóGÞ°Ò°°m*\imÒÁ~m\çÿGÎ*ï~mã°øÿëþ\þëþþ ÿ—þçÿ.ÿŸ¤ÿó*;Ò“ÿ~.ÿ~ ÿ¹þ ÿþCþ"þ—þ†þ ÿ¹þÿ¨þPÿÉþ“ÿPÿøÿL;øÿ“ÿ“ÿüþaÿ—þaÿ†þPÿ¨þ?ÿ?ÿ‚ÿ\ÖÿŸÅÿ“ÿPÿCþ ÿ"þaÿ¹þÅÿüþ‚ÿ†þPÿCþqÿvþçÿ¹þ\†þŸþþm—þ\¹þ*vþTþ;eþÖÿïý¤ÿ´ýøÿvþ*qÿ.ÿ¤ÿvþ´ÿ¨þ¤ÿøÿaÿ?ÿvþvþCþþÚþvþÅÿ‚ÿŸ°&\m“ÿøÿ“ÿÅÿ\¤ÿPÿ´ÿÚþ‚ÿÉþ‚ÿPÿÖÿçÿ*~Ÿ;ÁŸÒ°°\;mÁçÿ~?ÿøÿqÿ~›Î“ÿó ÿÖÿ¹þ?ÿÉþ¤ÿPÿÅÿ*øÿ*Ÿã7~°qÿ´ÿëþ.ÿÉþ ÿ ÿaÿ´ÿó‚ÿÒvþ¤ÿ2þÿ¹þPÿaÿ´ÿaÿÖÿëþÅÿvþ?ÿ†þÉþ‚ÿaÿ\Ò°;¤ÿPÿqÿ ÿqÿëþaÿ¨þ“ÿ.ÿ¤ÿøÿ“ÿ\¤ÿ\øÿ;mLÒ°óŸŸøÿøÿøÿ\;Ÿm~LŸ~G½**Î*Á\*ÒÒ›½ï½*Î**ï*›ÞzGó›LóãiŠÞŠ*›°ï7¬7ï&imX°&øÿŸÅÿŸ¤ÿçÿã\Š~¬*&´ÿ~Pÿ*üþ;¹þmÉþ°.ÿãÿŸëþmëþ~¨þ;þ.ÿqýïýÖý.ý¹þ.ýëþ“ýeþÖý´ý2þ ý2þ ýÖý2þ´ýøÿ¨þŸ´ÿøÿaÿqÿÿüþÿvþ.ÿ"þPÿeþPÿ†þ ÿeþ ÿTþ¤ÿ¨þÅÿeþqÿqýÿëü?ÿPý¹þ*iŸ*Ò‚ÿ&aÿ*ïmXÅÿz?ÿ´ÿ**ïL*Á›óiÒXG“ÿGiXŸGmó\qÿÖÿëþqÿÿaÿçÿÅÿ\*m\mm~¤ÿÁ‚ÿ&Pÿó.ÿ~Pÿ;“ÿPÿPÿüþëþ ÿÿ ÿ‚ÿ†þPÿþüþÖýÿÖýaÿïýqÿïýPÿ´ý.ÿ ýëþ ý ÿqý?ÿqý—þ´ý"þCþTþÚþëþ?ÿqÿaÿ?ÿPÿ¨þ?ÿCþ ÿþëþþ ÿeþ.ÿ¨þÿÉþ.ÿÚþ‚ÿÉþÅÿCþ´ÿþÖÿeþL.ÿŸÖÿÅÿL.ÿ~.ÿGï7ά&GŸÁ\°øÿã¤ÿÖÿ7LGóÎz*¬›Xã7Ái7G›~ŠGÒ*çÿÖÿ;Á*X›*z*XÒÒ\*“ÿXqÿ7‚ÿãçÿ°ó\GÁL&7Ÿmçÿ°ÅÿÅÿÖÿL‚ÿ~qÿmLG›L*Îi&*ó*\iÖÿçÿim*Ÿ*zaÿÒ?ÿÁqÿã“ÿ¤ÿ7´ÿÒøÿ\;;\“ÿ*aÿŸ¤ÿŸ¤ÿ~‚ÿ~‚ÿmqÿÅÿ ÿÚþ†þ2þ2þïýeþëþÅÿ\&›\aÿøÿ ÿ.ÿ“ÿÿ“ÿÖÿaÿPÿëþÖÿaÿÖÿÁÖÿÅÿ~\ÁÒ7GGçÿ&PÿóëþŸPÿ°Òi&zãÁ´ÿaÿ‚ÿÅÿL~GÁ›mGLóŸó7XÒÁŸøÿÁÁ\qÿ\¨þqÿTþTþ†þ´ý.ÿ"þ¤ÿ ÿÅÿ¤ÿ¤ÿ¤ÿPÿPÿ ÿaÿëþ“ÿ ÿ¤ÿaÿqÿ?ÿPÿ—þ.ÿ´ýÉþ.ý¨þqý¨þïý¹þÖý¹þ´ý¨þþCþ¨þþ´ÿÉþ*¤ÿ´ÿ‚ÿÉþTþCþqýþ ý2þëü¹þqý.ÿ2þüþvþeþÖýþëüeþ†üÚþ.ýÚþþÉþ†þ¹þvþ¹þeþëþ—þ ÿ†þ?ÿvþ“ÿ¹þqÿ*Åÿ´ÿ\´ÿŸÖÿG;7øÿÒqÿÿ°¤ÿzÁ½¬›°\**;~°\G;›ŸL›LL›óXã&Á½&L**ó½Š;ÁózãX°Ò\ï*ó;´ÿøÿqÿ¤ÿÁøÿ›¤ÿ¬ ÿ7üþŸ“ÿ;qÿÚþçÿ¨þÅÿÚþ;aÿÁ´ÿ¤ÿÁ?ÿ;Úþçÿ¨þøÿ†þçÿCþ¤ÿ"þ“ÿvþøÿ?ÿLÖÿLøÿçÿ“ÿ‚ÿPÿqÿ‚ÿ“ÿøÿÅÿ*Öÿ;øÿLÅÿ\üþ*2þþvþ;Éþëþãüþqÿi;ÞGïïÞiÎÁ&L°mã&¬½mÞÞmL*﬊øÿëþÁ ÿãÅÿLóŸ°ó°GmóøÿL´ÿÅÿLL°LÒ7øÿiÅÿó¤ÿŸÅÿÅÿL?ÿqÿëþÚþÉþÚþ¨þëþþ¨þqýeþ“ýÉþ¨þÅÿ¤ÿ°Öÿmqÿ“ÿqÿ?ÿ‚ÿ ÿqÿÚþ.ÿCþeþ“ý2þÖý†þÉþüþaÿaÿ¤ÿPÿÅÿëþçÿ¨þÅÿ ÿ´ÿÖÿøÿm;m¤ÿ~qÿ°ÅÿçÿÖÿaÿ‚ÿ ÿçÿüþ;¹þ*CþLCþóüþzçÿzøÿÒ‚ÿÅÿ.ÿ ÿ¹þ ÿ†þqÿ¨þçÿüþLÅÿ°LÒ;°øÿmçÿLL~;mÖÿŸçÿŠmÎ~óÖÿ¤ÿPÿÚþPÿ¹þaÿÿ‚ÿ¤ÿ´ÿçÿøÿøÿçÿ“ÿ“ÿmãŸãÒm\mçÿ;‚ÿaÿ´ÿ;m;㟊~iÖÿ°aÿ;çÿŸXÁ½Ÿï~iLŸøÿ‚ÿ ÿëþçÿ?ÿ´ÿÖÿÖÿ~*Á\Á*~Åÿ“ÿ´ÿÅÿ¤ÿ\´ÿã‚ÿãëþ;†þqÿ—þÿ¨þ?ÿvþaÿCþaÿ—þaÿPÿPÿøÿ“ÿ;øÿ´ÿ“ÿ“ÿüþ¤ÿÉþ¤ÿ ÿ´ÿÅÿøÿçÿ´ÿ¤ÿüþaÿÉþ¤ÿPÿmóLÁL;\LmLã~ÁŸLŸ*Á&óX&óó°°iÞiÞ½&›LXøÿi*zÁ&&ÒGã7ÁmÒ*°;Òm7ÁЬXÁŸãóã&7m&ÒÁ7L°ŸÁÅÿÒ?ÿ~ëþÖÿÉþ‚ÿüþ“ÿ?ÿ¤ÿ¤ÿqÿ“ÿëþ.ÿ—þÚþÉþ¹þÚþ†þ¹þeþ¹þ†þüþÉþ‚ÿ ÿÖÿ?ÿ´ÿÿaÿ¹þ ÿCþ†þÖý´ýþqývþ“ý¹þ“ýëþþqÿ—þÅÿ¹þ´ÿ†þ“ÿüþPÿ ÿÿÚþqÿüþçÿ¨þ"þ´ÿ´ý?ÿ“ýqÿCþçÿüþ;ÿ* ÿ?ÿ*qÿ;aÿ;?ÿ;qÿmÅÿ~çÿÁÅÿÒ¤ÿÖÿmÁ\X~ŠL°øÿøÿÖÿL*iÒÎÁqÿPÿ.ÿÿPÿPÿ‚ÿ¤ÿ´ÿ¤ÿ´ÿ‚ÿqÿqÿaÿ¤ÿçÿçÿ~øÿ°¤ÿ~?ÿ ÿÅÿ?ÿÖÿ¤ÿ‚ÿ*ÿëþ.ÿ*qÿaÿÖÿÿ¤ÿÚþ‚ÿÚþqÿ ÿaÿÿaÿ?ÿPÿqÿ.ÿ¤ÿÿ‚ÿüþ‚ÿüþ¤ÿPÿ´ÿ“ÿ“ÿ“ÿ?ÿaÿ.ÿ?ÿ‚ÿ?ÿøÿ‚ÿ¤ÿøÿ“ÿ‚ÿmøÿ~m*\*\mÒLÁ;~L;~*Ò°ó7ãXÁŸ°Ÿ~~Xmii&zŠzz77ŸGøÿ¬\½°&°°Š°;\ïóÞóX°ãm°*Lçÿ*´ÿ*´ÿm*çÿ~çÿmøÿÒçÿ7Åÿi´ÿG´ÿÖÿ°;m\~¬*Îz°øÿ\ÅÿL¤ÿ;qÿøÿPÿ‚ÿqÿ‚ÿÖÿøÿL*~Lm\;m;*\;øÿ;øÿ**´ÿøÿPÿqÿPÿ‚ÿaÿçÿqÿ*¤ÿÅÿøÿÖÿ´ÿÅÿPÿ“ÿ ÿ“ÿÚþ¤ÿ¹þ“ÿ¹þ¤ÿÚþøÿPÿ;Åÿøÿ“ÿ‚ÿÉþ?ÿþ‚ÿïýøÿ2þ;†þ*¹þÖÿÉþÅÿÚþçÿÿçÿ‚ÿ´ÿ´ÿ´ÿ“ÿaÿL?ÿ ÿçÿ¹þçÿüþ;çÿ\~\\;Öÿøÿ?ÿqÿ†þPÿCþÉþÖÿ&Òãm;~ÒóŸ&m&m\ãÖÿó¤ÿ´ÿøÿaÿ; ÿçÿüþ“ÿëþÅÿaÿLÖÿÁÁ;~;\*Ÿøÿ°Pÿüþaÿ?ÿ.ÿ¤ÿqÿÅÿ‚ÿ“ÿqÿ.ÿqÿÉþ“ÿ¹þ‚ÿëþqÿ.ÿ¤ÿ ÿ?ÿÉþÉþÚþ¹þÿ.ÿPÿ.ÿ?ÿ¹þÿTþëþ†þüþüþ?ÿ‚ÿ‚ÿ´ÿ“ÿ‚ÿ“ÿ“ÿqÿ.ÿLëþÅÿ ÿ ÿ¤ÿÿ\ÖÿÁ~Ÿ~Løÿçÿ?ÿÖÿ ÿ*PÿŸ´ÿ°ÖÿŸ´ÿ°“ÿŸ¤ÿ*°~°\ŸmÁŸóã7&X&ómLÒŸÁ7GG¬½ã›GŠzGÁ~m\Á¬Ò½7ÁçÿÁøÿÒó*çÿ¤ÿÒ¤ÿ°çÿã*LG*XÅÿqÿmPÿ“ÿ;¤ÿ\ ÿ¨þÅÿÚþÿ ÿÖÿëþ.ÿ ÿ¹þqÿëþ“ÿÿqÿÿ?ÿëþPÿüþqÿ?ÿPÿqÿ?ÿ¤ÿqÿçÿÖÿ\°Ò\aÿ´ÿ¹þüþ¹þvþ?ÿ—þøÿqÿøÿÁ°Á~ãÁã77ó;*‚ÿ?ÿŸ?ÿãPÿ.ÿ;PÿmÅÿãL°7Ò7ÒÁ°øÿ\ÅÿL~L\øÿ\L*Åÿaÿ´ÿ‚ÿaÿøÿ?ÿ?ÿøÿÿqÿ¹þÉþ†þvþÉþ¨þ?ÿ ÿ¤ÿqÿøÿ~Ÿ~ó¤ÿÅÿPÿ.ÿ ÿÿÉþ ÿÚþÿPÿ¤ÿÖÿ\øÿ‚ÿ ÿaÿÿ‚ÿ‚ÿçÿçÿ*Åÿm“ÿLqÿÅÿaÿ.ÿÿÿüþ´ÿ?ÿm¤ÿÁŸÖÿ;.ÿ¨þøÿ—þ ÿ~´ÿøÿ~Lçÿ“ÿPÿaÿaÿÅÿ ÿçÿ?ÿçÿ7\7LŸÖÿ“ÿ?ÿ ÿPÿëþÅÿ‚ÿ*Öÿ*ÅÿÖÿLÁXÁã;;ÅÿÅÿm~\¤ÿ“ÿ“ÿaÿ‚ÿPÿëþëþ†þ—þ¹þüþ‚ÿóXÖÿXøÿXm›Ò½ó›Ÿ&*Ÿçÿmøÿ~*;~mL°Ÿ&&z7z°Š;›øÿXÅÿÒ´ÿL´ÿ;çÿ\L*;ÖÿL¤ÿÖÿóGLzL›;›*Xøÿã´ÿÅÿ\çÿL~*°*øÿçÿ.ÿ¤ÿÿ¤ÿqÿ“ÿ¤ÿ?ÿ¤ÿ ÿ‚ÿÿ‚ÿqÿÅÿçÿ*mÅÿ*?ÿ“ÿüþÿüþPÿ?ÿçÿ´ÿ\\LL\ÁŸÁÁm~;;~*ó;*°çÿ;´ÿ~;Š*z7Ò;Ÿ\ÁŸãÁãããã°ÁŸŸÁã;ã*ÁL~L\mçÿmçÿ*çÿøÿÖÿÖÿ;çÿ;ÖÿÅÿçÿ´ÿ¤ÿ‚ÿaÿ?ÿ“ÿ“ÿçÿçÿqÿ‚ÿÉþÚþ†þ—þÉþ¹þaÿüþ¤ÿ.ÿ“ÿaÿqÿÅÿaÿ“ÿ´ÿ´ÿ.ÿ¤ÿëþPÿÉþ.ÿüþ.ÿPÿ¹þPÿþëþïý¨þ—þ¹þPÿÉþ¤ÿ¹þqÿvþÿTþ.ÿ—þaÿÉþaÿÚþ‚ÿ?ÿqÿüþÿCþÚþ2þ.ÿ¹þ´ÿüþëþ\aÿ~L~ã;Åÿçÿ.ÿøÿ ÿ*.ÿ°´ÿó\ãÒãÒÒŸ\qÿÿçÿ?ÿ‚ÿ\´ÿÁçÿó\óóÒóÒãóG&iG&7°LÁmŸ\Ÿøÿçÿ~´ÿÅÿã&*&*ãŸøÿL´ÿçÿ¤ÿÖÿ¤ÿÖÿ?ÿ¤ÿëþ¤ÿüþaÿÁ‚ÿãaÿ°.ÿL.ÿçÿÿ´ÿÿøÿ?ÿ;qÿ*‚ÿ“ÿ;çÿŸ*Òçÿ;´ÿ¤ÿqÿaÿaÿ´ÿ¤ÿ\ã~ÒLLÅÿ;ÅÿLøÿ;Öÿ‚ÿ;aÿ´ÿÒ;ãm°;ŸøÿÒçÿøÿóÁLŸŸm~*ÅÿmLÒ°&iÒXÒóãŸ\øÿ.ÿ“ÿÉþqÿÿÅÿçÿLøÿ*ÖÿøÿLŸøÿŸÁm~ã\‚ÿ?ÿ*aÿ\Öÿ~L´ÿPÿ?ÿ\Åÿ*L;~m°LLÅÿçÿ“ÿ¤ÿ¤ÿÖÿmmÒ*ãøÿŸ*ÖÿÖÿ;øÿÖÿçÿøÿçÿ¤ÿ‚ÿaÿ ÿqÿ ÿ¤ÿqÿÖÿÖÿ\çÿm“ÿLaÿ;‚ÿ;“ÿÿ´ÿ¨þ‚ÿ¨þ“ÿÿ“ÿ ÿqÿÉþqÿ¹þ“ÿ—þ´ÿÉþ¤ÿ.ÿ‚ÿ“ÿ¤ÿÖÿÅÿçÿçÿÖÿøÿÅÿ“ÿLqÿLaÿÿÖÿüþ¤ÿ ÿ“ÿ?ÿ¤ÿ.ÿ´ÿëþ“ÿ—þPÿ†þqÿÚþçÿPÿ*¤ÿ;ÖÿmŸ;~´ÿçÿL°ãGÁG~ã\;L“ÿ*ÿ?ÿÖÿ\\Ÿm~;~ÁøÿãÒÒçÿ~¤ÿçÿ‚ÿ“ÿ¤ÿ´ÿ*çÿøÿ¤ÿÅÿ¤ÿ¤ÿçÿ‚ÿøÿ.ÿ“ÿ†þÚþ"þ—þCþ ÿ¨þÖÿëþ.ÿ´ÿøÿm¤ÿøÿPÿ‚ÿqÿqÿÖÿ¤ÿ*ÖÿLçÿøÿÅÿ.ÿ‚ÿÉþ.ÿÚþ.ÿ?ÿaÿ‚ÿ“ÿ´ÿ**óÒG&G7&óãmÒÅÿL´ÿ;çÿ~*°móãXziŠGã&ÒÁÁÁŸ&mã~ŸŸ°Ò°ÒŸ~\**;Ÿ*L&\ã~ÒLçÿqÿÁqÿ“ÿ‚ÿmqÿ‚ÿçÿ\Lã;çÿÒ“ÿ~qÿLPÿ*.ÿÖÿ.ÿaÿaÿaÿqÿ‚ÿaÿ´ÿ.ÿøÿÚþçÿ—þaÿ—þÚþÚþüþ ÿ?ÿ.ÿPÿ?ÿ?ÿqÿPÿ“ÿqÿÅÿ“ÿÅÿ´ÿøÿ¤ÿ¤ÿ¤ÿaÿ“ÿqÿqÿÅÿaÿaÿ;Pÿ;?ÿ;.ÿL?ÿ\qÿ~¤ÿ~Åÿ\Åÿ\¤ÿm‚ÿ°“ÿÒ“ÿÁqÿaÿ¤ÿçÿ°;ómómÁL*Lçÿ´ÿ;Öÿ\*;m*L;ÅÿLPÿ;aÿøÿ¤ÿÅÿ¤ÿ´ÿqÿÖÿ“ÿÖÿçÿ´ÿøÿ“ÿ´ÿ‚ÿPÿ¤ÿaÿÖÿ´ÿøÿçÿÖÿÅÿqÿ¤ÿPÿÖÿ‚ÿÅÿÖÿÅÿ;‚ÿL.ÿ ÿ“ÿÿqÿqÿÅÿÅÿ*ÖÿL“ÿçÿÿ‚ÿëþaÿ.ÿ¤ÿqÿçÿÅÿ*\**øÿ¤ÿ¤ÿ.ÿ‚ÿ?ÿ‚ÿ“ÿ“ÿÅÿÖÿÖÿ;m;Åÿøÿ¤ÿÖÿ*øÿ;Öÿ*ÖÿLó°Á°´ÿŸçÿÁL°Ÿ~mm**LL~L\;;øÿÅÿ‚ÿ*“ÿÖÿÖÿL\ã~XLi&øÿóøÿÒ*ãmó~Ò\°LLm*°;Á~Ÿ~\Løÿøÿ¤ÿÖÿçÿÖÿ\ÖÿŸ´ÿmqÿqÿçÿÖÿ*LãŸóÁã°~óLÒ\Ò\ã;ã°øÿ;Öÿ“ÿøÿPÿ¤ÿ.ÿ¤ÿaÿÖÿ¤ÿçÿøÿøÿçÿÖÿ¤ÿ´ÿ“ÿ“ÿ´ÿ‚ÿÅÿ¤ÿçÿ´ÿøÿÖÿçÿ´ÿçÿPÿ“ÿ.ÿqÿ‚ÿ“ÿÅÿ¤ÿÅÿ“ÿÅÿ‚ÿÅÿPÿÖÿqÿÅÿ~m´ÿ*PÿÖÿëþ‚ÿ¨þ“ÿÉþPÿ~¤ÿŸÅÿ~Åÿ\“ÿqÿøÿqÿ“ÿ*´ÿ*ÅÿL°~ÒÒÒ;°Ÿ*°L\*m~*~~Öÿm¤ÿ“ÿ‚ÿaÿ.ÿ?ÿ?ÿqÿ¤ÿ´ÿçÿÖÿÖÿ´ÿ;“ÿ;qÿaÿÖÿaÿ“ÿqÿqÿ“ÿ“ÿ“ÿÅÿaÿÖÿ.ÿÅÿÿÅÿÿ´ÿ ÿ¤ÿëþ¤ÿüþ“ÿ.ÿqÿ‚ÿqÿ¤ÿ“ÿaÿaÿÿ.ÿ ÿÿëþëþëþ¹þüþ¹þ.ÿüþqÿ?ÿ“ÿ‚ÿ‚ÿ¤ÿaÿ“ÿ.ÿ?ÿ.ÿëþaÿüþaÿaÿ‚ÿ¤ÿÖÿÅÿÖÿ*çÿ*øÿ*Öÿøÿqÿ ÿL.ÿŸ¤ÿÁçÿ°øÿ~çÿ\çÿm~;\;*ÅÿçÿqÿÅÿaÿøÿ¤ÿ;ÖÿÁL°*mçÿ;çÿLL~Ÿ~ŸLL\m*ŸLÒ㟰~\~\çÿLçÿ~Á*Ò*çÿ;´ÿøÿÖÿ;;ÖÿL´ÿ~¤ÿ“ÿ~“ÿ;“ÿ¤ÿ‚ÿPÿ*qÿLÅÿmçÿmÅÿLøÿ;;LL****~*Á\;;LL\;\;çÿÅÿÅÿ´ÿÅÿqÿçÿ¤ÿ;øÿ\mmŸ\Á°ãã&Ò°Ÿ;~°móŸó~ÁmŸŸÒŸÒ°Á°ÁŸmÒóŸÒŸ~m*;L\øÿ“ÿaÿ“ÿLÅÿ\ÖÿLÖÿ\çÿ\ÖÿLÅÿ;Åÿ;Åÿ*Åÿøÿ¤ÿ´ÿ‚ÿ‚ÿqÿPÿ“ÿaÿÅÿ´ÿÖÿÅÿÖÿ´ÿøÿ´ÿÅÿÖÿ¤ÿ“ÿqÿ‚ÿaÿ´ÿ¤ÿÖÿÖÿÖÿÅÿçÿ‚ÿ‚ÿ¤ÿÖÿÖÿçÿ*øÿ*çÿøÿÖÿ´ÿ¤ÿ“ÿqÿ“ÿaÿ¤ÿqÿ¤ÿÅÿ¤ÿ*´ÿLøÿ**ÖÿLÅÿ;´ÿ‚ÿÖÿ.ÿ¤ÿëþ¤ÿëþçÿPÿ;çÿL**øÿçÿçÿçÿ‚ÿçÿPÿÖÿqÿÖÿ‚ÿÅÿqÿ‚ÿ.ÿPÿÿ‚ÿ‚ÿ‚ÿÅÿPÿ¤ÿ‚ÿÖÿøÿ;Lm\*;çÿÅÿçÿ´ÿ´ÿ¤ÿÅÿ‚ÿ¤ÿøÿøÿÖÿ´ÿ´ÿ*´ÿ¤ÿçÿ“ÿ´ÿ¤ÿÖÿÅÿçÿçÿçÿÖÿ;ÖÿLçÿ;øÿL*;Ÿm\;~ÒÒL°øÿmÖÿøÿøÿøÿøÿøÿøÿLçÿŸÅÿÁ‚ÿ?ÿPÿÖÿ¤ÿ¤ÿÖÿ“ÿ´ÿ´ÿ‚ÿçÿPÿPÿ*qÿ;‚ÿ‚ÿÅÿÅÿ´ÿÖÿL*çÿÖÿ“ÿÅÿaÿøÿqÿ“ÿ“ÿ“ÿ´ÿøÿøÿLm°Ám\øÿaÿ?ÿ“ÿ*m\mŸ~ÒÁÁÒ~Ÿ*mÖÿ“ÿÅÿLL~°Á\Ò°øÿ;Ÿ~Á°ÁŸ\*çÿÅÿ“ÿÅÿqÿ;‚ÿÅÿÁøÿ&óçÿ\´ÿÖÿ“ÿ“ÿ‚ÿ¤ÿqÿçÿaÿÅÿ.ÿ?ÿ ÿ ÿ ÿ?ÿ?ÿ¤ÿqÿ´ÿ‚ÿ¤ÿ‚ÿ‚ÿ‚ÿqÿqÿqÿ‚ÿ“ÿ‚ÿÅÿqÿçÿaÿqÿ¤ÿøÿÖÿøÿøÿçÿ¤ÿçÿ“ÿÖÿ“ÿÅÿ“ÿ“ÿ¤ÿaÿ“ÿqÿ“ÿ‚ÿ“ÿaÿ‚ÿaÿ‚ÿqÿPÿqÿ ÿ“ÿüþÅÿÿøÿPÿ;‚ÿ\aÿLPÿ\PÿmPÿ\?ÿ;Pÿ;¤ÿLøÿm*\~~~\;\çÿÖÿŸÖÿ~Åÿ;¤ÿqÿLaÿŸ“ÿ~´ÿøÿ“ÿ‚ÿqÿ“ÿ¤ÿçÿÖÿøÿçÿçÿÅÿçÿÖÿçÿÖÿøÿçÿÖÿçÿÅÿçÿÅÿÖÿ;Öÿ\´ÿL¤ÿÖÿçÿ*´ÿ*“ÿøÿ‚ÿÖÿ¤ÿçÿ´ÿ;¤ÿ;¤ÿøÿÅÿ“ÿÖÿqÿÅÿ¤ÿ¤ÿçÿ¤ÿçÿ‚ÿ‚ÿqÿ?ÿ‚ÿqÿÅÿçÿøÿmøÿŸÖÿÖÿmm°*L\Ò~mŸLÁããÁÒ~~;ÖÿLÖÿ°L°L°m°Ÿ°°Ò°ã~ó~ã°ÒÁm~øÿ;çÿL*°ó°Ám;L;mmÁÁÖÿŸçÿ~*\~LL;ÖÿÖÿøÿ;°\\~*m*L*çÿøÿ‚ÿ.ÿ* ÿ\ ÿm?ÿ;qÿ´ÿL;\m;LmŸL~L\~Öÿ\¤ÿ´ÿ;ÖÿÖÿ°ÖÿLÖÿÅÿçÿ“ÿçÿÅÿçÿøÿøÿçÿÅÿÅÿqÿ¤ÿaÿ¤ÿ“ÿ“ÿ¤ÿ‚ÿ“ÿ¤ÿ“ÿøÿÖÿ;çÿ´ÿçÿ“ÿÖÿ¤ÿçÿçÿÖÿÅÿLÅÿmçÿm;¤ÿÖÿaÿqÿPÿÿPÿëþ‚ÿüþÖÿ?ÿøÿPÿøÿ?ÿqÿøÿ´ÿ´ÿÅÿçÿÖÿL´ÿ~qÿLPÿ*‚ÿ*çÿ;L*;LøÿL¤ÿ*‚ÿ“ÿçÿqÿ¤ÿPÿÅÿqÿçÿ~\ÁŸÁm*¤ÿ‚ÿçÿ‚ÿÅÿ“ÿ¤ÿ‚ÿ´ÿ¤ÿøÿ\LøÿÖÿøÿ“ÿaÿçÿ ÿ¤ÿëþqÿ.ÿ“ÿ¤ÿçÿÖÿøÿçÿøÿÅÿqÿ?ÿÖÿPÿ“ÿ‚ÿqÿaÿaÿ ÿaÿëþaÿüþPÿ?ÿqÿ‚ÿ´ÿ“ÿ´ÿ¤ÿ‚ÿÅÿaÿqÿ´ÿÖÿÖÿqÿÅÿ?ÿ¤ÿPÿ¤ÿqÿ´ÿ“ÿ¤ÿ¤ÿ“ÿ¤ÿ‚ÿÅÿqÿaÿ~‚ÿÒÅÿÁŸ*Ÿ*øÿ\øÿ;**;;\\mÒÒŸ°ŸŸ~°;ÒÒ;LŸmã°óó°ãL°ŸÁ*°*m;;*L\Öÿ;´ÿÖÿL°LóLã;Á*ÁÁÖÿ°¤ÿÅÿm~;~;´ÿPÿÖÿ.ÿÅÿPÿçÿ‚ÿÖÿ\mçÿ\çÿÖÿã¤ÿÒqÿmPÿçÿaÿqÿqÿ?ÿqÿPÿ“ÿ“ÿçÿçÿ*;øÿøÿ;*;*ÖÿL´ÿL“ÿ*´ÿ*LL*;*çÿçÿøÿmL~*~çÿÁÖÿ&7~~ÁÅÿm´ÿLÖÿ;øÿL;*;*çÿÖÿÖÿçÿ´ÿøÿÖÿøÿøÿÖÿ“ÿçÿ“ÿÅÿÖÿÖÿçÿøÿçÿçÿÖÿÅÿ“ÿ‚ÿ.ÿaÿÿaÿqÿ‚ÿ¤ÿ¤ÿ“ÿ‚ÿ‚ÿPÿ¤ÿPÿçÿ“ÿ*Öÿm°*°\çÿçÿÖÿ¤ÿ´ÿaÿ“ÿPÿ‚ÿ‚ÿ“ÿ“ÿ“ÿqÿ“ÿPÿ´ÿPÿçÿqÿçÿqÿ“ÿqÿaÿ´ÿ“ÿøÿÖÿøÿÅÿçÿ“ÿ¤ÿ\çÿ~øÿ~çÿmçÿmL;çÿ*´ÿ*¤ÿ¤ÿçÿ¤ÿÖÿÅÿÖÿçÿøÿ;;m;øÿLÅÿÅÿqÿ‚ÿ.ÿ“ÿ?ÿçÿÖÿ*;*Öÿ*´ÿ;Åÿ;*;;øÿÖÿçÿ*\;øÿøÿL\;**;*;\;~*m;mmŸ°Ÿ°°m~*L*L*Lçÿøÿçÿçÿøÿ*\Ÿçÿçÿ~çÿ\ÖÿLøÿLL\\çÿLçÿ;øÿmøÿ\çÿ*ÅÿÅÿÖÿÖÿøÿ´ÿÖÿ“ÿ´ÿ¤ÿÅÿÖÿøÿçÿøÿÖÿçÿ´ÿÖÿ´ÿøÿÖÿøÿøÿçÿÅÿøÿ´ÿøÿÖÿøÿÖÿÖÿçÿÖÿ;*\*m;~\~mLŸ**\\m~øÿmøÿm\\;L\;~L\Ÿ\Ÿ\°mŸm\\ÖÿøÿÖÿ´ÿÖÿ‚ÿ´ÿ“ÿ‚ÿÅÿ¤ÿøÿL\\~\\;øÿøÿçÿÖÿçÿ´ÿçÿ¤ÿçÿ“ÿÖÿqÿÅÿPÿ´ÿ.ÿ´ÿÿ¤ÿÿ“ÿ?ÿ¤ÿaÿÖÿ‚ÿçÿ“ÿÅÿ¤ÿ“ÿ´ÿ“ÿ´ÿ¤ÿ´ÿ´ÿ´ÿÖÿ“ÿ¤ÿPÿ?ÿÿ ÿ ÿPÿ?ÿ“ÿ‚ÿ¤ÿ´ÿ‚ÿÖÿ?ÿ ÿüþüþ.ÿøÿ‚ÿçÿ´ÿçÿÅÿçÿ´ÿçÿ‚ÿøÿaÿ“ÿLøÿ*\Åÿ;¤ÿLÖÿLÖÿ\ÅÿmÖÿ\Åÿ;Öÿçÿ*øÿm°Á~çÿ*“ÿøÿPÿçÿPÿçÿ“ÿøÿÅÿ*øÿL\øÿ\\*;*;*;;;Öÿ*ÖÿL\;L*\møÿL¤ÿqÿaÿqÿ*¤ÿLÅÿLÅÿ*ÖÿøÿøÿøÿøÿÅÿøÿ‚ÿçÿ?ÿÅÿ?ÿÅÿaÿøÿ“ÿ*Öÿ\~;°*°øÿ~¤ÿ‚ÿçÿ¤ÿçÿøÿ*øÿ;L;çÿÅÿøÿçÿL\øÿ\øÿ\\LŸmm*;\;ŸLŸLÒmÒ~°mmLL\;mL\Á\°\mm\~Lm*;øÿ*øÿ**;;L;;L*m;ŸmÖÿ´ÿ´ÿÅÿ¤ÿÖÿÅÿÖÿÖÿÅÿÖÿÅÿøÿÖÿ*øÿ\LøÿÖÿçÿÅÿøÿÖÿçÿøÿøÿçÿçÿçÿøÿøÿÖÿÖÿ´ÿ¤ÿ¤ÿ“ÿ´ÿ¤ÿÖÿÖÿøÿøÿ*øÿøÿçÿøÿçÿ´ÿÅÿ“ÿ¤ÿ¤ÿ¤ÿÖÿ“ÿçÿ“ÿ¤ÿ‚ÿqÿ“ÿ‚ÿ´ÿ¤ÿÅÿ“ÿÖÿaÿçÿPÿøÿaÿøÿqÿçÿ‚ÿÅÿqÿ¤ÿaÿ‚ÿqÿqÿ‚ÿ‚ÿqÿ¤ÿPÿ´ÿaÿÖÿ“ÿçÿ´ÿÖÿ“ÿÅÿPÿ´ÿ?ÿ¤ÿaÿ¤ÿ‚ÿ´ÿ¤ÿçÿÖÿøÿ;øÿ\çÿ\çÿ*Åÿøÿ´ÿÅÿ“ÿ¤ÿ‚ÿ´ÿ¤ÿçÿ\øÿ\Öÿ*´ÿqÿqÿøÿ¤ÿçÿ*L***øÿçÿ;*****Lm~~m\\;LçÿøÿçÿÖÿçÿÅÿçÿÖÿÅÿÅÿ*´ÿ¤ÿøÿ¤ÿøÿÅÿ*çÿÖÿ´ÿÅÿ´ÿøÿÅÿ*´ÿ*‚ÿøÿqÿÖÿqÿÖÿ“ÿÅÿ“ÿ¤ÿ‚ÿqÿqÿqÿ“ÿ¤ÿÖÿøÿ**øÿøÿÖÿ´ÿ´ÿÖÿÅÿ¤ÿøÿ“ÿ´ÿ*Öÿ*L\\;;*øÿÅÿLÖÿ*°ŸŸó~ã~ŸŸmLm;LLLm~ÁÁÁã\~;*L\;*øÿÅÿøÿ´ÿÖÿøÿøÿ*øÿ\\øÿLçÿ\çÿmÅÿm¤ÿ\¤ÿ*¤ÿ‚ÿçÿ.ÿ´ÿüþ“ÿ?ÿ“ÿ“ÿ´ÿÅÿÖÿ´ÿÖÿ“ÿ´ÿ“ÿ¤ÿ“ÿ¤ÿ‚ÿ¤ÿqÿ´ÿaÿÅÿqÿÖÿ‚ÿçÿ‚ÿÖÿqÿ´ÿaÿ¤ÿaÿ´ÿqÿÅÿ‚ÿÖÿ‚ÿçÿ¤ÿøÿøÿøÿøÿÅÿøÿ´ÿçÿÖÿçÿøÿøÿøÿçÿ*Öÿ*ÅÿÅÿ*´ÿL¤ÿ\‚ÿL‚ÿ*¤ÿ;Öÿ;*;~;ã\ó°m\;LLL*\~*\*;;;;;çÿ;çÿLøÿ;øÿ*øÿøÿøÿçÿçÿ´ÿÖÿ“ÿÖÿ¤ÿ¤ÿ´ÿçÿ*øÿL;çÿÅÿÖÿ´ÿ¤ÿÅÿ‚ÿÅÿaÿ´ÿPÿ¤ÿ?ÿ¤ÿ?ÿ¤ÿaÿÅÿ¤ÿøÿÅÿçÿÅÿ¤ÿ¤ÿqÿ¤ÿ¤ÿ´ÿÅÿÅÿ´ÿçÿ¤ÿøÿ¤ÿÖÿçÿ´ÿÖÿ¤ÿ´ÿ“ÿ¤ÿ¤ÿ¤ÿ“ÿ“ÿ“ÿ‚ÿ´ÿ¤ÿøÿ**øÿøÿ*\*\L;çÿçÿøÿøÿçÿÖÿçÿ´ÿçÿÅÿ;çÿçÿÖÿÖÿLÖÿ\ÖÿLøÿ\\*m;m\\~LŸL~;Løÿ*;;;*L*L;øÿ;çÿL;*;LL\mL°;Á;Á*Ÿ~m\Løÿ;ÅÿÅÿçÿøÿøÿøÿçÿøÿÖÿçÿçÿ*ÖÿÅÿÅÿÅÿÅÿ´ÿ¤ÿÅÿ¤ÿ´ÿ“ÿ´ÿ‚ÿ¤ÿ“ÿ¤ÿ´ÿÖÿ´ÿøÿ“ÿ‚ÿ*‚ÿ“ÿçÿ´ÿ´ÿ´ÿ´ÿÅÿ´ÿÖÿ“ÿçÿ‚ÿ´ÿ*øÿLLøÿLçÿ;çÿçÿøÿÅÿÖÿÅÿçÿÅÿÖÿ\øÿmçÿmÖÿ\Öÿmøÿ\;øÿÖÿ;Åÿ~çÿçÿ~çÿm\*L*LL;*;\\\\*LçÿÅÿøÿÅÿøÿÖÿçÿçÿÖÿÖÿÖÿÅÿÅÿ¤ÿ¤ÿqÿ“ÿ?ÿ“ÿ?ÿ“ÿaÿ“ÿ‚ÿ¤ÿÅÿ´ÿçÿ´ÿÖÿÅÿÖÿÖÿøÿçÿÅÿ‚ÿaÿÖÿPÿ“ÿaÿ‚ÿqÿ“ÿqÿ“ÿqÿ¤ÿ‚ÿ´ÿ‚ÿ´ÿaÿ“ÿ?ÿ‚ÿPÿ´ÿqÿçÿ“ÿøÿ“ÿ´ÿ‚ÿ‚ÿ¤ÿ‚ÿçÿ“ÿçÿ“ÿÖÿ¤ÿøÿÅÿ*øÿLLøÿ;øÿ*øÿøÿL*~\~m~~çÿ\ÖÿLøÿmŸ*Á;Á;Ÿ;m*\;\LL\LŸmÁ°ŸmŸmŸ~~mmLL;***L;m;m*\LçÿLçÿ;øÿ*;*LLLm*~øÿmÅÿ\“ÿ*‚ÿ‚ÿ*‚ÿ¤ÿÅÿ*Öÿ\Åÿ\Åÿ*ÅÿÖÿÅÿL´ÿ\´ÿ;ÖÿçÿøÿçÿçÿçÿøÿçÿÖÿøÿÖÿÖÿÅÿ´ÿÅÿÅÿ´ÿÖÿ¤ÿçÿ´ÿÅÿÖÿøÿøÿ*L*L;*;øÿ;Öÿ*Åÿçÿ;;\m\\\L~\ŸmL\;çÿ*Öÿ*çÿ*;L\mmmmLL**;;*L;\;L;;;;;;\øÿ~~*\øÿ*;**;LøÿLÖÿ´ÿÅÿÖÿçÿøÿÅÿøÿÅÿçÿÖÿçÿøÿÖÿøÿ´ÿÖÿ“ÿ´ÿ‚ÿ´ÿ“ÿÖÿ´ÿÅÿ*Åÿ;Åÿ;Öÿ*çÿçÿÖÿ¤ÿ“ÿ“ÿqÿ´ÿaÿÅÿqÿ´ÿqÿ“ÿqÿ“ÿaÿ´ÿ‚ÿçÿ´ÿçÿÅÿ´ÿ“ÿ¤ÿqÿÅÿ“ÿÖÿ¤ÿÅÿ¤ÿÅÿ“ÿ´ÿ“ÿ´ÿqÿ¤ÿPÿ¤ÿ?ÿÅÿ‚ÿçÿÅÿøÿÖÿ´ÿ*´ÿLÖÿLÖÿÅÿÅÿ*Åÿ;´ÿ;“ÿaÿ?ÿøÿ?ÿçÿPÿÖÿ‚ÿøÿ“ÿøÿ“ÿ“ÿ¤ÿ;ÖÿLøÿL*çÿ*çÿ**;*LL\\L;;\øÿmm*L;;**øÿ´ÿøÿÅÿçÿçÿÖÿÅÿ´ÿçÿÅÿçÿÅÿøÿ¤ÿçÿ“ÿøÿ¤ÿÅÿÖÿçÿçÿ;Öÿ*´ÿ‚ÿøÿaÿÖÿPÿÅÿqÿøÿ¤ÿ\Åÿ~ÅÿmÅÿ*´ÿÅÿøÿÖÿøÿøÿøÿÖÿ“ÿøÿ“ÿøÿÖÿøÿøÿçÿÖÿçÿçÿ**~\°\°LmmŸ~ÒŸÒ°°Ÿ~m~L*~~~\Ÿ°ÁãÁÁŸ~~mmm\~Lm;LLL~~ŸŸ~ŸL~Lm\~\~*m*øÿL\m\øÿ;çÿçÿøÿøÿ*çÿL¤ÿ*qÿÖÿPÿ“ÿ?ÿ‚ÿ?ÿ‚ÿ?ÿ¤ÿqÿ¤ÿ¤ÿ´ÿÅÿçÿÅÿ;´ÿ;“ÿøÿaÿ“ÿqÿ“ÿ“ÿ´ÿ“ÿÅÿ“ÿ´ÿ¤ÿ´ÿÅÿ´ÿÖÿÅÿ´ÿ¤ÿ“ÿaÿ‚ÿPÿ¤ÿPÿÖÿaÿçÿ‚ÿÖÿ¤ÿÖÿÅÿçÿÅÿçÿ¤ÿçÿ“ÿøÿaÿaÿqÿ“ÿÅÿçÿ*øÿ;ÖÿL´ÿ;ÅÿLçÿmm*m*~;~;LÖÿ´ÿ´ÿÅÿ;ÅÿLÖÿLçÿ*çÿçÿøÿ*øÿ;L;*øÿøÿ*øÿçÿøÿçÿøÿ;øÿLL;\;\;çÿÅÿøÿÖÿøÿÖÿøÿ´ÿçÿ´ÿÖÿÅÿÅÿçÿÅÿÅÿøÿçÿøÿçÿÖÿÅÿÅÿçÿøÿøÿøÿçÿøÿçÿçÿøÿçÿøÿçÿçÿ*çÿLøÿLøÿLçÿ*ÖÿÖÿøÿÖÿøÿçÿøÿøÿ*\*L;;;L*L*øÿøÿ***çÿ*çÿ**;\;m;\*;*;**;;LLL;øÿ;*L;L;;*çÿøÿÖÿøÿ*;**;*;;;;*øÿ*çÿ*øÿøÿøÿøÿøÿøÿøÿøÿÖÿøÿÅÿÅÿÖÿÖÿÖÿøÿÅÿÖÿÖÿÖÿçÿçÿçÿøÿÅÿçÿ“ÿçÿ‚ÿçÿ“ÿçÿ´ÿøÿÅÿÅÿøÿ´ÿçÿ´ÿÖÿ´ÿÖÿÅÿçÿÖÿÖÿøÿÅÿøÿÅÿçÿÅÿ´ÿ´ÿ“ÿ¤ÿ“ÿ“ÿ¤ÿ“ÿ¤ÿ“ÿ´ÿ“ÿÅÿ‚ÿÖÿ‚ÿÅÿ“ÿÅÿ“ÿÅÿ´ÿÖÿ´ÿçÿ´ÿøÿÖÿ*L\møÿLçÿ*çÿøÿ*Løÿmøÿ\;øÿçÿ*çÿ;çÿ;çÿ*øÿøÿ*;;øÿøÿøÿøÿøÿøÿøÿ*;*øÿçÿÖÿÖÿÅÿçÿÅÿçÿÅÿçÿÅÿÖÿÅÿÅÿÅÿ´ÿÅÿ´ÿ´ÿÅÿ¤ÿ´ÿ¤ÿ´ÿ¤ÿ´ÿ“ÿÅÿ‚ÿ´ÿ‚ÿ¤ÿ“ÿ“ÿ¤ÿ¤ÿ´ÿÅÿ´ÿçÿ´ÿçÿ´ÿÅÿÖÿÖÿçÿçÿçÿøÿøÿøÿøÿøÿÅÿøÿ“ÿøÿ“ÿÅÿøÿ*;;;çÿ;ÖÿLøÿ\L;;;L;\;\;L;;*L;m\mm\~m~m\\;\;\LL\L\;;**;L\m~\~LmLm;m*\*L*;;*çÿ*çÿÖÿÖÿçÿ;øÿL\Løÿ;çÿ*øÿLøÿmøÿLçÿ*ÖÿÅÿÅÿÖÿøÿøÿ*çÿ*ÅÿÅÿÖÿøÿÖÿçÿçÿçÿøÿøÿ;øÿ;çÿ;Öÿ;Åÿ*ÖÿçÿøÿøÿøÿøÿøÿøÿÖÿçÿ*;;;*çÿÖÿ*çÿ*øÿçÿçÿøÿøÿçÿÖÿçÿçÿ**;***øÿçÿÖÿçÿøÿçÿøÿÖÿøÿÖÿøÿçÿøÿçÿøÿÖÿçÿÅÿÅÿÅÿ¤ÿ¤ÿ“ÿ“ÿ´ÿ¤ÿÅÿ´ÿÅÿÅÿ´ÿçÿ´ÿÖÿ*øÿ***øÿÖÿçÿ´ÿ´ÿ¤ÿ¤ÿ“ÿ¤ÿ¤ÿ¤ÿ´ÿ´ÿ´ÿÅÿÅÿÖÿÅÿçÿÅÿçÿ´ÿÖÿ¤ÿÖÿ´ÿÖÿÖÿÅÿçÿÅÿçÿÅÿÖÿÅÿÅÿÅÿ´ÿ´ÿ¤ÿÅÿ¤ÿÖÿ´ÿÖÿ´ÿÅÿ´ÿÖÿ´ÿÅÿÖÿçÿøÿÖÿÖÿÅÿçÿÅÿøÿÖÿÖÿÖÿÖÿçÿÖÿøÿÅÿøÿ´ÿ´ÿÖÿøÿ*****;*L*LLL\øÿmøÿmL;;;L;LL;\*m;~L\~\~m\\LL*;;;øÿ;çÿ*çÿ;øÿL\m\;çÿÖÿÖÿçÿøÿ*øÿ;Öÿ*Åÿ´ÿ´ÿ´ÿøÿ´ÿ´ÿ´ÿøÿ¤ÿÖÿ¤ÿ´ÿ“ÿ´ÿ“ÿÖÿ¤ÿøÿ´ÿ´ÿ¤ÿçÿ¤ÿçÿ´ÿøÿÖÿøÿøÿÖÿøÿÖÿøÿÖÿøÿ*;L\;;*øÿ;L;øÿ;çÿ;L*L;L;;;*****;*L*\LLL;L;;;*øÿøÿøÿçÿÖÿÖÿÖÿÖÿøÿçÿçÿøÿÖÿÖÿÖÿÅÿÅÿÅÿÅÿ´ÿ´ÿ¤ÿ´ÿ¤ÿ´ÿÅÿ¤ÿçÿ“ÿÖÿ“ÿÅÿ´ÿ´ÿÅÿÅÿÅÿÖÿ´ÿÖÿ´ÿÖÿ¤ÿÖÿ“ÿÖÿ¤ÿÅÿ´ÿ¤ÿ´ÿ“ÿ´ÿ“ÿ¤ÿ¤ÿ´ÿ´ÿ´ÿ´ÿÅÿ´ÿÅÿ¤ÿ¤ÿ“ÿ¤ÿ“ÿ¤ÿ“ÿÅÿ“ÿÖÿ“ÿçÿ¤ÿøÿ´ÿøÿÖÿøÿøÿçÿøÿøÿøÿçÿøÿÖÿøÿ´ÿøÿ¤ÿ¤ÿ*ÅÿLçÿ\øÿ\L;çÿÖÿÖÿçÿçÿçÿçÿçÿøÿ*øÿ*øÿ;L*\*LL\\øÿLøÿ**øÿ;L;;;L;;L;\L\\*;øÿÖÿøÿÅÿøÿÅÿøÿÅÿçÿÖÿøÿøÿ;;øÿ*øÿ;L*L*L;øÿ*çÿÖÿçÿ*øÿçÿçÿ*Öÿ*Öÿ*çÿ*çÿ*çÿ*;***øÿçÿøÿ****øÿçÿçÿøÿ**L*\*\L\L\;L;;;*L*L*;*;*****L;\;\*;;;;*;LLøÿ;***;;;L;øÿ*;*L;;***øÿçÿçÿçÿçÿøÿøÿøÿçÿçÿøÿÖÿçÿÖÿçÿÅÿÖÿ´ÿÅÿ´ÿÅÿÖÿçÿÖÿçÿÖÿçÿçÿçÿøÿøÿÅÿøÿ“ÿÅÿ‚ÿ¤ÿ‚ÿ‚ÿ‚ÿaÿ“ÿaÿ¤ÿqÿÅÿ“ÿÖÿ“ÿÅÿqÿ¤ÿaÿ“ÿPÿ‚ÿPÿ‚ÿPÿ¤ÿqÿÅÿ“ÿøÿÅÿçÿøÿçÿçÿÅÿçÿ¤ÿçÿ¤ÿøÿ¤ÿÅÿ*Öÿ;çÿÅÿ´ÿçÿ‚ÿçÿaÿçÿaÿçÿ‚ÿøÿ¤ÿ´ÿ;ÖÿLçÿ\øÿ;øÿ*ÖÿÅÿ*´ÿ;´ÿ;ÖÿL\*mL~L~;~;mL\LL;;*;*øÿøÿÖÿçÿÖÿçÿçÿçÿøÿÖÿÖÿÅÿ´ÿøÿ´ÿçÿÅÿçÿÅÿçÿÅÿçÿÅÿçÿÅÿçÿÅÿøÿ´ÿ¤ÿøÿ¤ÿçÿ¤ÿøÿÅÿÅÿ;Åÿ;Åÿ´ÿøÿÅÿøÿçÿçÿçÿøÿÖÿçÿÖÿçÿÖÿÖÿ*Öÿ;çÿ*çÿ*øÿøÿ*******L*L*\*\;mm~~~m~mmm\mLm;m;\L\\\m\~\ŸmŸm\~Lm;\;;**;\;\;\L\LmLm;m*m\øÿLøÿçÿøÿçÿøÿ*;LøÿLÖÿ´ÿøÿ¤ÿøÿ´ÿÅÿ*Åÿ*ÖÿÖÿÅÿøÿ¤ÿçÿ¤ÿÖÿ´ÿçÿÅÿçÿÅÿøÿÖÿøÿÖÿøÿÖÿçÿÅÿÖÿÅÿÖÿÅÿÖÿ´ÿçÿÅÿøÿÅÿÖÿøÿÅÿçÿ´ÿÖÿ´ÿÅÿÖÿÖÿøÿçÿøÿçÿøÿçÿÖÿÅÿøÿ´ÿçÿ¤ÿçÿ¤ÿçÿ´ÿçÿÖÿçÿçÿøÿøÿ**øÿøÿçÿøÿçÿçÿÖÿÅÿÖÿ*Öÿ*øÿøÿçÿÖÿ*çÿ*øÿøÿÖÿøÿÅÿÅÿçÿ*çÿøÿ*øÿçÿçÿçÿøÿøÿøÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿøÿÅÿÅÿ*ÅÿÖÿçÿçÿçÿÖÿçÿÖÿÖÿçÿçÿçÿøÿøÿøÿøÿÖÿøÿçÿøÿøÿ*øÿçÿÖÿøÿÖÿøÿçÿøÿøÿçÿçÿøÿøÿøÿøÿçÿøÿøÿ;\\;;;L**L*\;\L\LL\;\;\*\;m;~L~;mLL\L;;;;øÿ;øÿ;øÿ;LL;øÿ*çÿ*Öÿ*Öÿ*Åÿ*Åÿ*ÅÿÖÿÅÿøÿÖÿøÿÖÿÅÿ´ÿÅÿøÿÖÿøÿÖÿçÿÅÿÖÿÅÿÖÿÖÿçÿÖÿøÿçÿøÿçÿøÿÖÿçÿÖÿÖÿÖÿçÿÖÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿçÿçÿçÿçÿøÿøÿøÿçÿçÿøÿøÿøÿ;L\;******øÿøÿøÿ**øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿçÿçÿÖÿçÿÖÿÖÿÖÿÖÿçÿÖÿçÿçÿçÿøÿÖÿøÿçÿçÿçÿÖÿÖÿÖÿ´ÿÅÿ´ÿÖÿÅÿçÿçÿÖÿçÿÅÿÖÿ´ÿÅÿ´ÿ´ÿÅÿ¤ÿÖÿÅÿçÿçÿøÿøÿøÿøÿçÿøÿÖÿøÿÖÿÖÿçÿøÿøÿçÿøÿÅÿçÿÅÿøÿÖÿøÿ********;***;*L*;******;;;*****;*LL;øÿ*øÿ*øÿ;;;L*L*L*L;*øÿ*øÿøÿ*;L;*****øÿ*çÿçÿøÿøÿ**øÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿçÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿÖÿçÿÖÿçÿçÿøÿøÿøÿøÿçÿøÿÖÿçÿ*****øÿçÿÖÿøÿÖÿøÿÖÿÖÿçÿçÿøÿçÿçÿçÿçÿÖÿçÿçÿøÿçÿçÿçÿøÿçÿøÿÖÿÖÿÖÿøÿçÿøÿçÿøÿøÿøÿøÿçÿçÿçÿÖÿøÿÖÿøÿÖÿçÿøÿÖÿçÿÖÿçÿÅÿçÿ´ÿÖÿ´ÿçÿÅÿçÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿøÿÖÿÖÿçÿøÿçÿøÿçÿøÿçÿçÿçÿÖÿÖÿÅÿÖÿÅÿÅÿÅÿÖÿÖÿÖÿçÿçÿÖÿÖÿÅÿÖÿøÿøÿøÿøÿøÿøÿ*;;;;**;;*L*L*LLL;*****;*L;L;;**;øÿLøÿ;;****;*øÿçÿøÿÖÿçÿÖÿçÿÖÿøÿÖÿçÿçÿçÿçÿÖÿÖÿçÿøÿøÿøÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿ*;*****;*L*;********;*;*;;*;****;;****;;*øÿøÿøÿøÿøÿøÿçÿçÿçÿøÿøÿøÿçÿøÿçÿøÿøÿøÿçÿøÿÖÿçÿÖÿÖÿÖÿÖÿçÿçÿøÿøÿøÿçÿøÿçÿçÿÖÿÖÿÖÿÖÿçÿçÿøÿøÿçÿÖÿÅÿÅÿçÿÅÿÖÿ´ÿÖÿ´ÿçÿÅÿøÿçÿçÿÖÿÖÿÖÿÖÿçÿÖÿøÿÅÿçÿ´ÿçÿÅÿøÿÖÿøÿÖÿÖÿÖÿøÿÖÿøÿÅÿøÿÖÿçÿçÿçÿÖÿÖÿÅÿÅÿÖÿçÿçÿçÿÖÿÖÿçÿøÿøÿøÿøÿøÿçÿçÿøÿøÿçÿÖÿÖÿçÿçÿøÿøÿøÿøÿøÿøÿçÿçÿçÿçÿçÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿçÿøÿøÿøÿøÿçÿÖÿÖÿçÿçÿøÿ*øÿ*øÿ*øÿøÿøÿ*;**;;*øÿøÿ****;;*;******************øÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿÖÿçÿÖÿçÿçÿøÿçÿÖÿÅÿøÿ´ÿçÿ´ÿÖÿ´ÿÖÿÅÿÖÿÅÿçÿÅÿçÿÅÿÖÿÅÿ´ÿÅÿ¤ÿÅÿ´ÿÅÿ´ÿÖÿÅÿÖÿÅÿÖÿÖÿÅÿÅÿÖÿÖÿçÿçÿçÿçÿøÿçÿøÿÖÿøÿÖÿøÿÅÿçÿÅÿÖÿÅÿÖÿÅÿÖÿÅÿÖÿÅÿÖÿÅÿçÿÖÿøÿøÿøÿøÿøÿçÿøÿ*øÿ*øÿ*çÿ*çÿÖÿ*çÿ*øÿ*****øÿøÿøÿøÿ*øÿøÿøÿøÿøÿøÿçÿçÿÖÿçÿçÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿøÿøÿøÿçÿøÿçÿçÿÖÿçÿÖÿçÿçÿçÿÖÿøÿÖÿøÿçÿøÿçÿøÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ********;*;**********;;*********;*LL;;;*******øÿ*øÿøÿøÿ**;;øÿ;øÿ*øÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿÖÿÖÿøÿÖÿøÿÖÿøÿÖÿøÿçÿøÿçÿçÿçÿøÿøÿøÿçÿøÿçÿøÿøÿøÿøÿçÿøÿÖÿøÿÖÿçÿÖÿøÿçÿçÿøÿøÿøÿøÿøÿøÿøÿçÿçÿçÿøÿøÿøÿøÿøÿøÿçÿçÿçÿçÿøÿçÿøÿçÿøÿÖÿÖÿçÿçÿçÿøÿøÿøÿçÿçÿçÿøÿ*øÿøÿøÿøÿøÿçÿøÿçÿçÿçÿçÿÖÿçÿÖÿøÿÖÿøÿçÿøÿøÿøÿøÿøÿøÿøÿÖÿøÿÅÿçÿÅÿÖÿÅÿÖÿÅÿçÿÖÿçÿÖÿÖÿÖÿÖÿçÿçÿøÿçÿçÿçÿÖÿçÿÖÿÖÿÖÿÖÿÖÿçÿÖÿçÿÖÿøÿÅÿçÿÅÿÖÿ´ÿÅÿ´ÿÅÿÅÿÅÿÖÿÖÿÖÿçÿÖÿçÿÖÿøÿÖÿçÿÖÿçÿÖÿçÿÖÿçÿÖÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿÖÿçÿÖÿçÿÖÿøÿÖÿøÿÖÿÖÿçÿøÿøÿøÿøÿøÿøÿ*;;*;*;;L;L;;;******;*;**;*L;L;L;L;L;;;;*;*øÿ*øÿ;øÿL\\LLLL;;L;;;øÿ;çÿ*ÖÿÖÿçÿçÿçÿçÿÖÿçÿçÿ*ÖÿÖÿÖÿÖÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿçÿÖÿçÿÖÿçÿÖÿÖÿÖÿÖÿçÿÖÿçÿÖÿçÿçÿÖÿçÿÖÿçÿÅÿçÿÅÿçÿÖÿçÿÖÿçÿÖÿçÿÖÿçÿçÿøÿçÿøÿçÿøÿçÿøÿÖÿçÿÅÿçÿÖÿçÿÖÿçÿÖÿÖÿÅÿÖÿ´ÿçÿ´ÿçÿÅÿøÿÖÿçÿçÿøÿçÿøÿçÿøÿøÿøÿçÿøÿÖÿÖÿçÿøÿ*øÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ***øÿøÿøÿ***;*øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿçÿçÿçÿçÿÖÿçÿÖÿçÿÖÿçÿÖÿçÿÖÿçÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿçÿçÿçÿçÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ******øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿøÿçÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿçÿçÿçÿçÿçÿçÿçÿçÿøÿçÿçÿçÿçÿçÿçÿÖÿçÿçÿçÿçÿçÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿçÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿçÿçÿçÿøÿøÿçÿçÿøÿøÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ************øÿøÿøÿøÿçÿçÿçÿçÿøÿçÿøÿçÿøÿçÿçÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿçÿçÿçÿøÿçÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿçÿøÿøÿøÿøÿçÿçÿøÿçÿøÿçÿøÿçÿçÿçÿçÿçÿøÿøÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ*øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿçÿøÿçÿçÿçÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿçÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿçÿøÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿçÿøÿçÿøÿøÿøÿøÿøÿ********øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿçÿçÿøÿçÿøÿçÿøÿÖÿøÿÖÿçÿçÿçÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿÖÿøÿÖÿøÿÖÿøÿÖÿøÿÖÿøÿçÿøÿçÿçÿøÿçÿçÿçÿçÿøÿøÿøÿøÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿçÿøÿçÿøÿçÿøÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿÖÿøÿÖÿøÿçÿøÿçÿøÿçÿøÿçÿøÿçÿøÿøÿøÿøÿøÿøÿsonic-visualiser-3.0.3/samples/stick.wav0000644000000000000000000006232413111512442016443 0ustar 00000000000000RIFFÌdWAVEfmt D¬ˆXdata¨dÇÿfýö’ô5ãß!þrÜÀ Âçô ã×ÇðÇ1 CÇ1†ýô¼sœô¼v Ï3ž'ø ‚ørÜbØõ 㳬“¤)ÊàjÚ-ë‚øRÔ9ÎzÞñIú9îæ1ìôjÚ ÂrÜ!è†!@÷=üõZÖ ãçÇ1râà!üñ9÷ÇİÇùÛç9Ž#zËÇ1Ï3»ä¸€f )ê†!zßø®+ ×5×m[âÓæ–%MS·-×5øãˆ!GMSGÏ3ß7ß7®+ü9îIÒjÚÇ1]W}_GüÃüù³ø Žåàaï;}_m[ > § § ¾õ¾õßýßýÖ!Ö!°°•ú•ú]]··E,E,õ1õ1yyK»K»ÊØÊØ+î+îiñiñêêFîFîÛjÛjµ:µ:÷ü÷üiiº´º´ÿÕÿÕOOë+ë+××  «Ê«Êä䬲¬²ŸÐŸÐ¯r¯rÌ=Ì=G÷G÷ZþZþ1¹1¹²×²×ïãïã>ë>ë X Xx/x/EEMM†Ò†Òuèuè…,…,‚­‚­ÑÑ  ? ? ææ‡ ‡ ] ] âòâòÒùÒùˆ«ˆ«£Í£Í€^€^,2,2߮߮°Ñ°Ñ++±ü±üôêôêÞïÞïWZWZ´1´1ÒµÒµ%×%×áágêgêZZ$1$1ÓÓ””ˆ ˆ Ø Ø K•K•xÄxÄOO  ¾ç¾çÀïÀï[[R3R3++##YÏYÏܿܿ˜!˜!~~ßßEEZëZë|÷|÷½‰½‰„º„º?@?@>>œëœëGòGòÑ.Ñ.@@úúãýãý»»^×^× U U..ÝßÝß‘ï‘ïðßðßxìxì'L'Lß*ß*@@¿¿ÝÝi i 3Ô3Ôìâìâ?C?C˜"˜",,®®üüww\ \ ——b»b»“Ù“ÙTÙTÙ‚å‚åföföƒôƒô ``9797ÊÊžžæÉæÉóUóUj/j/7 7 å å •’•’5Â5´û´û¼÷¼÷õíõíJðJðé*é*aañSñS€1€1oÿoÿ°°éé÷÷ää1ñ1ñÐ Ð ££†Ï†Ï‚ã‚ãß/ß/NNáÆáÆØÞØÞŸ/Ÿ/àà›ë›ë¡ô¡ô‹‹••t¼t¼U×U×zVzVX.X.œœÜܧ§ˆÇˆÇ á á««ÏÏ#µ#µ®Ò®Ò––ÓÓ__§ § ÔòÔòH÷H÷çëçë<ò<ò7474XXÑæÑæ±ò±ò==ÂÂ$$cc€ò€ò)ú)úY(Y(îîÒÒ…è…èðð÷÷ЩЩ½Í½ÍÎRÎR,,¢¢ÌÉÌÉxLxL ( (ö!ö!ÓÓžžÉÉœîœîèðèð++µµf3f3--ÀºÀº Ú Ú,T,TÑ/Ñ/èíèí¾ù¾ùWöWöoüoüßõßõîúîú]ª]ª¡Ì¡ÌÖZÖZ¡/¡/@®@®ÀÐÀÐííp p ¤Ù¤ÙýæýæUU\.\.©õ©õÝüÝüGòGòeùeùWWffN&N&**ÛŸÛŸŠÉŠÉ¶¶€€u1u1cc$ú$úŸþŸþ¤Á¤Á×Û×ÛH#H#++TæTæ:ð:ð«ý«ýœéœé±ð±ðç!ç!  @D@D))?Ì?Ìzæzæ99„"„"ÅÀÅÀÜÞÜÞÄ"Ä"žž  '¾'¾NÛNÛ1<1<!!¿¿££«š«šÖÅÖŶ$¶$+ñ+ñ:õ:õøø  ] ] ¥¥MËMËÊNÊNu)u)¤Ó¤ÓççŒòŒò¹õ¹õ¼¼/ / gôgôøø”ò”ò™ö™öLOLOf-f-JÆJÆââ¶þ¶þLþLþÐÒÐÒ ä äÿMÿM** ø ø þ þÏÏáÃáÃÿÞÿÞ<Í<Í-ß-ß?"?"––Œ,Œ,²²""YYΘΘaÆaÆ55AA­î­îööÃ3Ã3ÿÿQ Q H H LçLçáôáô•ü•üïþïþÌÌ`á`áþ#þ#ÙÙVÖVÖäæäæY=Y=_!_!µùµùdþdþ®®ÔÔèè‹‹EËEË â âIýIý~û~ûêêYðYðãÿãÿ]Ð]ÐçàçàÈÈoo2ú2úÄùÄù;;Ô.Ô.EEIICCÁÚÁÚ'ì'ìîïîïaõaõOGOG´(´(ÉýÉýµµ( ( & & i÷i÷þþÐÝÐÝhíhí  @@||@@..¸œ¸œáÄáÄ4/4/¶¶ê ê ¥¥P4P4TT_¼_¼ÈÚÈÚ••ÒþÒþ22‰ ‰ gágášíšíll 5í5íœôœôß'ß'QQ(æ(æiòiòÕþÕþÄþÄþÏÏ&â&â)<)<Ãà & &**à²à²ßÕßÕËéËéÏïÏï¿L¿L÷)÷)ÓÐÓÐ”æ”æ„„ØþØþc.c.°°xÜxÜ}í}íÕÕ³³<<ïïVVìì õ õkâkâBíBí••••E E OºOº2×2×Yñ>ƒ$ƒ$~á~á¾ñ¾ñ£æ£æ”ñ”ñ”Õ”Õ*å*åÃVÃV‡/‡/3º3ºyÙyÙ--Çǵµ• • øæøæúñúñÿ&ÿ&--ÐãÐã>ñ>ñ]]HHÁöÁö!ú!ú  ×דò“ò4ø4øÏÏÇáÇáé+é+»»H÷H÷™ú™úaaýý9 9 ÆÆMÍMÍîâîâ®î®î ò òGFGF_&_&R÷R÷eýeý-û-û|þ|þéöéöDûDûs*s*NNõúõú==˰˰µÒµÒÉ É ççB!B!**<â<â•î•î.ã.ã­ì­ìQ Q ¨¨QðQð3ô3ôÒÿÒÿ·ü·üëPëPû-û-½½RÜRÜîññê÷ê÷NNGGàà::þþÆÿÆÿÞÞéé//II¥Ó¥Ó\æ\æÉɱý±ý÷÷ÁøÁø¶=¶=›"›"hñhñAúAúgg{{  ÍäÍäûñûñÆìÆì!ô!ô{({(xx‹¶‹¶½Õ½ÕJAJA¹"¹"ÊÏÊÏÁäÁäWíWíIòIò,E,Eû%û%+Ý+ÝÖíÖí+Ø+Øçç+@+@Ò"Ò"¶ï¶ïmømø·Î·Îäâäâ„5„5††00TT´ö´öiýiýx»x»ˆØˆØ™õ™õ™õ™õ55øûøûÏKÏK'*'*”ÿ”ÿ''óýóýuuð½ð½]Ú]Ú¸¸UUUêUê˜ò˜ò!!œ œ Ö ÖFçFçôôÖõÖõûûèÞèÞþêþêE.E.--ãã\\áùáùwýwýqîqîäõäõl l ``ÂÂü ü ññHÚHÚ ë ëÿØÿØìæìædõdõ.õ.õ99ÑѸþ¸þAA‰Ö‰ÖÛçÛçáá/ / a8a8›!›!ïÎïÎëæëæ Ô Ô1å1åpòpòôôY5Y5Ïϵ µ ¾¾‡ ‡ ÓÓýýããmÌmÌôâôânánáëëõ,õ,mmææqðqð‰ ‰ ?ï?ï õ õÍüÍüüüù,ù,.ä.äañañ›!›!••¡Û¡ÛkìkìÄ3Ä3ìì°° Ó ÓÙðÙð(ó(óg g kkÍͨ ¨ ÈáÈá°í°í]D]Dp&p&ÊÊãã//¦¦××íéíéJ7J7àà. . M M ´Æ´ÆgágáÙ+Ù+ºº÷Ð÷Ð æ æ†&†&$$ÆÆÄÞÄÞOO''ÞÞ‰ÿ‰ÿÛÛéé¹"¹"|Ò|Òoäoä‹‹E E }}9Þ9ÞÏìÏì”2”2››ÍáÍánðnðVõVõ:ù:ùdàdàqëqëF2F2„û„ûÊþÊþBÕBÕsæsæY Y ù5ù5« « ‘¹‘¹§Ø§Ø‡ü‡üûûÅûÅûêúêúttÞÞÓÓ--Ö Ö è è }ü}üxxåìåìøõøõÙØÙØ“ç“ç‚‚ÜÿÜÿí í ××~â~âßìßì:6:688ôØôØêê¡ê¡ê ñ ñº(º(ÞÞ^÷^÷=ü=üaåaå8ï8ïÊÊPPa)a)11>>  ¼¼™Ø™Øµ µ ||ªïªï[ö[öää í í--uuÌ"Ì"##ÐúÐú77DDààĶĶ“Ò“Òk3k3II¬ç¬ç)ñ)ñ!ÿ!ÿåýåýÞòÞò?ö?ö¤ø¤øùùØ1Ø1996Ô6Ô‚æ‚æ44))Ð Ð 44ÂëÂëˆóˆóJ!J!NNHÒHÒVäVä**zzyy‡‡¬Ô¬ÔÓãÓã'"'"))AÍAÍcÞcÞ'ö'ö õ õÞÞ77**__<<”Ñ”ÑÖãÖã‰"‰"““dðdðI÷I÷:Å:Œגײ²õõóó¾ ¾ ÔÑÔÑáá•H•H--…ê…êœõœõ Πδ޴Þ^^O O ±æ±æÏíÏí¡*¡*BB5 5 ççéñéñ1ü1üýý‹é‹éûïûï[5[5ä!ä!¡ ¡ Á Á ®ë®ë®ô®ôîî&ó&óôþôþ{ý{ýBÐBÐ{Ü{Ü{ó{ónñnñ££ 11u"u"ôèôèãóãóŠŠj j ¸ê¸êºòºòllŠÑŠÑ¿à¿àùù°÷°÷ú#ú#äÿäÿ¶¶ÜÜ\ç\çôô55îîôô1ü1üüüAùAùúú‡ ‡ ßßû&û&>>üÙüÙÄèÄè1"1"]]çºçºÑÑçóçóòòKüKüÅøÅøå0å0ÏÏöö††çËçËÜÜûûøø€ÿ€ÿTTú×ú×NâNâÚ Ú ¦¦55^'^'GÌGÌôÝôÝÖÖ%%ççw¼w¼ÐÐ66$$ø ø . . ÓÄÓÄJÖJÖ' ' ##2÷2÷ö÷ö÷kàkà‹æ‹æ©3©3¢"¢"˜˜˜˜‚‚ee*ø*ø1ý1ýÄòÄò÷÷dÍdÍLÙLÙ ´´ÙõÙõvövöZ4Z4+%+%‡î‡îÊöÊö€ê€êsðsð²²÷÷""šš¯Ò¯Ò²ß²ßoýoýmûmû¨ ¨ ïïœàœà˜é˜éÆÆ33ããæêæêïïò ò ¢ð¢ð¸ô¸ôþþÚèÚèVðVðV×V×HßHߢ1¢1‹"‹"÷÷ÚÚRÓRÓËßËßïï žóžó™ö™öààìåìå22 # #áéáéqñqñ,,ä ä VÌVÌÓØÓØ·/·/1!1!GËGËçØçؼ ¼ BðBðRóRóì$ì$@@áþáþµµÒÒ//¯ò¯ò1÷1÷ ú úûûÝøÝø’ù’ùñìñì€ï€ïE E bb% % òò;»;»˜Ê˜Ê00hûhûNN==Ë"Ë"mm–¿–¿ Ï Ï|0|0«#«#ÖÖ××QùQùèûèûqâqâúçúç--("("EÄEÄðÑðÑöö  77Ü Ü ' ' oÑoÑÛÛ››PPïï¤ò¤òÏïÏïññ0606**qþqþ{{iûiû þ þ’Ô’ÔÝÝ%%¥¥ÂÂOO{Ù{ÙââlÞlÞµáµáô,ô,–"–"!Ü!܆ã†ã44%*%*ÌôÌôÁùÁùhÍh͵յզ¦Y Y @@ïïïïôôïÿïÿ§ÿ§ÿCÔCÔÄÚÄÚ~=~=“0“0õÞõÞ<ç<çAAbbÚ Ú   ÓÓÌÛÌÛo o U U · · òòQõQõ è è'ë'ë(é(énênê1"1"$$±±YYfùfù ý ýÇâÇâìçìçò ò ÷÷ÁüÁüQýQýMîMîFðFðùù¢ø¢ø ðð##//©ß©ßµãµã;;’’RRÅÅ/ / = = <<††yßyß#å#åèûèûìúìú³³ ù ù}û}û÷Ç÷ÇçÎçÎXXððååDDÉɬѬÑIIÿÿ%ü%ü…û…û]3]3u,u,‹å‹åîëîë ð ðòòªªíáíáˆåˆåI(I(b!b!ññññƒõƒõjj''þøþøöúöúáá§§ááääàðàðÊðÊðqöqöìõìõÛÛVV  MMµãµãcècè__€€xêxêqíqíKÚKÚâÜâÜæ.æ.b(b(YóYó ö ökëkë1í1í…û…ûÅúÅú{{šïšïqòqòËþËþ‹þ‹þ  ++~È~ÈûÎûÎããÛÛGGoo%#%#ýýÂÂ7 7 8 8 ƒ÷ƒ÷ùùKëKëüìüìééßßJóJóõõùù1ù1ùõåõå»ç»çøø*÷*÷Õ)Õ)%%gægæ è èKKccôô—ô—ôòòþþÝþÝþnónóVôVô  ""pÒpÒ¤Õ¤ÕÂ÷Â÷¶ö¶öÁ Á \\££©Ü©Ü®ß®ß¯ü¯üÞûÞûç.ç.»+»+Ú Ú å å ÐóÐóoõoõ¡ê¡ê¸ë¸ëjçjçüçüçãëãëÔëÔ룣ÄÄ‹‹ÜÜ00mÚmÚhÝhÝ¿þ¿þ«ý«ýã㸸{{TT) ) ´ ´ iýiýFþFþðñðñäòäò ø øøøÍûÍû”û”ûÊéÊéxêx꯯ÏÏ4ç4çèèmm””÷ì÷ì®í®í::Èȶ¶²²oèoèé銊ZZ3à3àrárá¹¹##££ÿ ÿ   CCIöIöºöºöEE77  ­î­îKïKïÁ÷Á÷±÷±÷ààéüéüñüñü™ö™öÈöÈölúlú`ú`úZZÅÅ==zâzâžãžãKKÇÇëë€ë€ë¡ ¡ Þ Þ {({(|'|'ÆëÆëííññLñLñyy¬¬ÄÔÄÔ™Ô™Ô¨¨ÏÏ¡¡·Þ·Þ™Þ™ÞXXyy˜˜ääüãüã !!33““••ÑÑÐÐÐÐWWvvééõèõèÙûÙûåûåûêêNíNí1í1í÷÷÷÷2*2*Z*Z*›ç›çpçpçÇ Ç Ö Ö ù ù ý ý wõwõdõdõòòúñúñ++¿ ¿ º º  ßìßìÈìÈìáåáåÖåÖåóóŒóŒó*ù*ù2ù2ùž ž ¯ ¯ '"'"×"×"LåLåoãoㆆ¦¦‡Ø‡ØÕÖÕÖ00CCãþãþóþóþñ ñ ""b b à à ~â~âááVæVæ,æ,æJJöö£ç£çSæSæ00‘ô‘ôFôFôé&é&(( ÷ ÷áõáõûñûñŒñŒñÁÁùù¦â¦âáᢢÛÛ2 2 N N <ø<ø‘÷‘÷ráráàà¿¿··,è,èqçqç½ ½ ´´žóžó¨ò¨òÏÏ©©?ß?ß´Ý´ÝEE}}wwzzçæçæßåßå22ééjæjæñìñì¼ì¼ìCCàà' ' Ì Ì MìMì\ê\êÛÛ› › dîdîçëçëÊÊ.Ú.Ú×תñªñ™ò™òŸŸªª“ü“ü½û½ûaüaü7ü7üîî3í3í..õ1õ1ûüûü”ú”ú×ç×çææŸ÷Ÿ÷MøMø‰ø‰ø¹ø¹ø ' 'ü)ü)îóîó>ñ>ñùùmùmù—ü—üÃüÃüÏñÏñ*ñ*ñµúµú(û(ûô!ô!ŠøŠø‚ö‚ööçöç’æ’æñ!ñ!S%S%\Ú\ÚzÖzÖ"ö"ö1÷1÷õ%õ%!)!)9 9 j j éé–å–å-û-ûaüaüuíuí_ì_ìYY}}ƒüƒü û ûãÿãÿÿÿÿÿ¼æ¼æpäp䦦øîøî¤ë¤ëÔ Ô   üümÞmÞ›Ú›ÚÏÏÔÔ‘þ‘þ‡ý‡ý'ò'òßðßðÿôÿôõõzôzôrôrôýýœœîî}}ÇÇÃåÃåÌâÌâžžââ&&ïïÁÁuu™Ý™Ý Ú Úaúaú‹ü‹üÎëÎëÃêÃê°°ÙÙÈêÈêÓçÓ篯““Ÿ!Ÿ!Ÿ$Ÿ$TôTô’ð’ð  g g HHOOÛÛóóëëÔԧΧÎÁýÁý--? ? / / Ïϳ³  {{OO""^þ^þƒýƒý··  aÛaÛÈÖÈÖñòñòZõZõ``··©©œœ  ÿÿ¯ý¯ýÇ Ç   ØæØæ¢â¢âÍ Í ÜÜêÜêܨר×ëñëñôóôóÖ Ö í í uùuùÈ÷È÷!ÿ!ÿ¦ÿ¦ÿmm**ƒîƒîêêø ø ú ú >û>û¤ù¤ù} } J J ÕþÕþyýyýììääêêhÛhÛ^Õ^Õîî¬ï¬ïáᘘ$ $ 9 9 ½ù½ù€÷€÷ §§¹ù¹ù!÷!÷ììss  ‹‹ááttççFçFç¤â¤â±±øøÆôÆô×ï×ïnînîËþËþððPP    òòøíøíqòqòGòGòöíöíKíKí× × ù ù    aèaè¨â¨â'þ'þ½½T T ” ” áásÚsÚwìwìÍíÍíooTT_í_íèè±ÿ±ÿ­ø­øÃ÷Ã÷ŠÿŠÿ-ü-ü¼û¼ûM M b b ŽöŽö¹ó¹ó¿¿—$—$##dþdþüúüúpùpù‘ú‘úxúxú)ø)ø»÷»÷˜˜šš™ý™ý‘î‘îNëN뉉33——``»»ýüýüaûaûàà@@ÙüÙüqûqûååÃàÃàýý11ììÚÚ??ÎóÎó¹ð¹ðÁüÁüJþJþkkÏÏÃÿÃÿõþõþdédéhåhåüü‚ø‚øÝ Ý ——]Û]ÛÌÒÌÒñøñøþþÑѼ ¼ ÆÆáá¦ù¦ùéõéõ††ßßññ²ë²ëÒãÒãNáNáJùJùýý¨¨øø”ò”òôôóó%%ÆÆUUëëkk’ñ’ñ£í£í??ÿ ÿ xñxñ¯ì¯ìsôsô)õ)õßßÝ Ý í írçrçG G ÓïÓï ê ê§§ØØü ü 1 1 4î4îvèvè÷ö÷öâøâøbb®é®é"à"àÁóÁóööoojjppÆûÆûó÷ó÷µ µ DDŽþŽþ‘û‘ûñ ñ X X ¢é¢éñâñâÓïÓï?ñ?ñ  ííêêÆÆ««ˆˆ@@hÿhÿæõæõÉóÉóxëxëaéaé´´`ê`ê¯å¯åTT¡ ¡ > > °°cc÷ð÷ð½ë½ë^÷^÷-ù-ù{þ{þxùxù5ø5ø>ù>ùEùEùõõôô__õõa a  òøòøNõNõóó÷ñ÷ñcící ì ì  ÔÔllBBGG»ö»öÌóÌóîîFìFìèè‰ ‰ 8ë8ëtàtàH H hh,ö,öÃðÃðRÿRÿÆÆ5ÿ5ÿ ÿ ÿüñüñëîëî<ù<ùûûú ú µµ\\ƒîƒî§è§èÙðÙð¼ñ¼ñ11C&C&9 9 úâúâ†Ø†ØBûBûŒŒ7ý7ýOýOý÷÷*ÿ*ÿuýuýQòQòlïlïôôŠôŠôˆˆÿÿðð5ø5øïñïñÒÒ­­Æ÷Æ÷"õ"õpñpñ ð ðÉùÉùüüÉúÉúÔúÔúAA>>¯¯/þ/þ@ø@øÜÜ7 7 üîüîèçèçÏ Ï ŒŒlìlìÝâÝâL÷L÷ûûî÷î÷¹÷¹÷…ü…ü½ý½ýòûòû°û°ûÉÉ>>iòiòôéôé¬ÿ¬ÿóó§§ÎÎîî¤þ¤þùù·· í í¡ç¡ç©©ÑÑuu¸¸aóaó6ë6ëÄúÄú}ý}ýææGGZÿZÿ©ý©ýÁøÁø2÷2÷2 2 **°û°û'÷'÷üü‰ü‰ü3î3îêê¥ú¥ú³þ³þ§§ÖÖ""””ÇôÇôëë»ñ»ñ0ò0òiýiýµµààååõ õ EåEåáÚáÚjjî î ÿ ÿ TTNíNí’ã’ãþøþø­ý­ýççhh~ ~ Á Á 9ú9úªõªõWïWïÔìÔìþ þ ”” ÷÷uúuú ö öÞÞQQ»þ»þÇýÇýüîüî•ê•ê  rr##ÝÝjøjøÂôÂôXèXè8ä8äXXiiåûåûaôaôÓêÓêíæíæ§§é é ÿÿ ü ü†÷†÷ÂõÂõƒƒÇ Ç iiŠŠ  ;;ËË]ä]äÖÛÖÛ%ü%ü&&ÿÿÑþÑþýýüü½½ëë55XXþþG G PìPìäâäâÙ÷Ù÷ýý" " © © FþFþúú´ ´ EEåûåûQõQõôôÁòÁò® ® bøbøjójó²î²îƒìƒìSSˆ ˆ ùùnînî77ß ß ÿÿ'ü'ü­ì­ìeçeç û û||»»ÔÔvøvø>ô>ôÉûÉû‘ý‘ý¸¸OOY Y ““ùù ô ôŽòŽòGñGñŸŸyöyö«ò«ò$$ÙÙ°°ïï‘ü‘üòíòísèsè§ý§ý˜ò˜òîOO­ ­ í í ÍùÍùóó£÷£÷ ø øéüéüþþ) ) __KüKüãöãöþþÌÿÌÿ  p p ÕîÕî.å.å$ú$úIöIöºóºó˜˜¨¨kk‡‡TøTø†ô†ôS S ÌïÌï¦à¦àZZööþþ¡õ¡õ ü ü!ý!ý@þ@þÇþÇþÓÓôô)ò)òVëVëF÷F÷tútúøø©÷©÷ÎúÎúÕûÕû«ý«ýqþqþýýŸüŸüOO[ [ ôôææœóœógögöÎÎüúüúÁ÷Á÷¯ ¯ hhÞÞÏÏ<õ<õ†ï†ï5ý5ýƒöƒöióió‘ù‘ùDûDû]](!(!ìóìóÄåÄå°°zzKýKýûóûó>÷>÷#÷#÷//ššuu7 7 é÷é÷ãñãñ®®GG÷÷†ò†ò3ü3üçþçþ¯ò¯òŒîŒî  p p O O ààEúEúäòäòÂöÂöN÷N÷î î ÔÔ77%%¤ö¤ö°ñ°ñl l ‹‹uùuù˜ñ˜ñÙòÙò`ò`òÞùÞù‘ü‘üww^^hh»»ÔûÔûùùp p ŸýŸýrùrùpópó¼ð¼ð†ø†øûûSSÁ Á ——ÂþÂþÔøÔøQöQöúú  xx~~mømø‡ò‡ò¿ô¿ôÛôÛôSS  ÿÿiúiú ú úYùYù¼÷¼÷÷÷GGj j •ú•úaõaõ77OO¼¼/ÿ/ÿ£ý£ýãüãüâúâúúú99R R //ŠŠàûàû ø ø5û5ûåûåû•ü•üëüëü^^  °ë°ëOãOã44¾¾ëÿëÿ5ù5ùVþVþžÿžÿõõ!ñ!ñ¨¨ººiöiöFðFðqüqü‘‘o o ïïZZÿÿÀÿÀÿdþdþ*û*û¾ù¾ù0ö0ö¡ô¡ôGýGýþôþôÒðÒðO O ààAöAö¦ë¦ëˆùˆù×ý×ýˆˆuub b P P oÿoÿLúLú55ÃÃ: : D D ::üü˜î˜îÕèÕè%%w w ùúùúõõhþhþMMq q  66ÑÑ”ò”òqëqëµúµúòÿòÿâþâþ ÿ ÿ*ù*ùáöáö©õ©õïôïô¹¹ÊÊè÷è÷ììÑõÑõ`ø`ø%ü%üéýéýÇ Ç 66çç—ÿ—ÿ ÷ ÷óóYóYóóó‡÷‡÷DùDùccaaßßddeþeþpp((55))®ò®òììBöBöáùáùEEŽŽèôèô‚í‚í< < __3þ3þkôkô©ø©øzùzù/ / ÅøÅøYòYòPþPþ±±aüaü)ú)ú  ßßÂöÂöììûûPP&ù&ùªöªö ü üþþÈúÈú™ù™ùG G ''ÿÿýý±±Üܬ¬ÎÎfðfðßçßçäöäö[ü[üPP™ ™ žž\\FôFôhíhí–– ··Œ÷Œ÷9ò9òœòœòAòAò)ü)üDDýý ¹ ¹ ÿ ÿ tÿtÿÑùÑùíÿíÿëë<ö<ö‰ñ‰ñ1ò1òòòZ Z ……3ÿ3ÿA÷A÷zzêêþþžûžû«ô«ô‰ñ‰ñÒùÒùÿüÿüµùµù¥ø¥ø››Y Y øøSðSðff  ××××’þ’þ*û*ûîúîú‰ú‰úNõNõñòñòFôFô©ô©ôò ò ÁÁ˜˜zþzþ>ô>ôïïÑñÑñ—ò—ò^ÿ^ÿzz³³ª ª R R úúÈñÈñïýïý™™ccç ç :ù:ù ò ògögö¹÷¹÷åå ý ýÚùÚù§ § ÓÓõõÝèÝèO O ‘‘``ÁüÁüòúòúúúŽùŽùââ11™õ™õ:ë:ë½ù½ùIÿIÿ–û–ûqúqúð ð ++®ù®ùqïqï ü üÂÂ,,ÄÄïï( ( .ÿ.ÿ±ù±ùBõBõÑòÑò)ü)ü~þ~þþþ¶¶GG‹‹??.ÿ.ÿ‹ü‹üFFzzáá"ô"ô;î;î ÷ ÷IûIûïïooôô­û­ûÛõÛõ÷÷@÷@÷ðð‚ ‚ º º yöyö°ì°ìDDßßcc)ø)ø ò ò!ÿ!ÿUUÆþÆþáüáüÞûÞû¬¬ÝÝGG++ÚÚqñqñêêéóéóô÷ô÷ ÿÿ%û%ûOOFFÑÑ¡ý¡ýºþºþþþþþ„ô„ô¡ï¡ï%%v v cc²²ttššßõßõaðaðö ö ÙüÙüöõöõTT$$ããQõQõsísíSòSòôô©ÿ©ÿ>>bbÍÍ`ÿ`ÿ û û§ý§ýŒþŒþçþçþ#ÿ#ÿØÿØÿ00 õ õÛïÛïšÿšÿ””ç ç ííæûæû7ó7ó!!vv¹ø¹øÒñÒñmùmùwüwü×þ×þ,,YûYû.ù.ù•ú•úûûô ô ãã½ü½ü|ò|ò‰÷‰÷ùù#ý#ý'ÿ'ÿßßCCÿÿÉÉ {{0þ0þ„ö„öwòwò7õ7õOöOööþöþMM­­––¯¯KKþþaûaûmümüÇüÇü÷ý÷ý‘þ‘þBÿBÿ¥ÿ¥ÿÆùÆùéöéö™ü™ü8ÿ8ÿhÿhÿ­ÿ­ÿç熆ôôGG……ýÿýÿøùøù÷ö÷öââëüëüÍøÍøáûáû#ý#ýUùUùŠ÷Š÷ÅûÅû¿ý¿ýëëššÊþÊþ–û–ûÜÜCCCCëëkk«ÿ«ÿÚÚããüüÅøÅøã㯯ÜÿÜÿ·ý·ýHúHúqøqøÐÐTTšûšû›ö›ö‘‘""ËË‹ý‹ý••__•ý•ýØúØúúúmùmùžûžû­ü­ü;;ŠŠµµ!ý!ýûûPúPúÊùÊùgügü©ý©ý††--××ëüëü‰ù‰ùíýíýàÿàÿgýgýOüOü÷÷( ( ëëÀÀ9ù9ù#ó#óáøáø†û†ûüüüü^^þ þ ssMýMý±ù±ùŽ÷Ž÷ìúìúüüTÿTÿÙÙ¦¦¹ ¹ ­ü­üööòò¾¾·ü·üQ÷Q÷WWªþªþrúrúQýQý“þ“þÐûÐûrúrúüüáüáüºÿºÿ<<þþ+ý+ýEýEý?ý?ýBBÐÐGGkkùþùþcücüAûAûˆúˆúÖÿÖÿ‰‰wwXXïüïüüüqûqûöúöú­ú­ú ü ü½ü½üýýSýSýççÕÕ::99§ý§ý™ø™ø×õ×õ$ú$ú9ü9üÖÖWW»»qqÛÛ•þ•þ_ý_ýbÿbÿZZßüßü!û!û5ý5ý4þ4þ¯ÿ¯ÿ~~ÍÿÍÿ|ÿ|ÿññ®®00ùùàÿàÿLÿLÿµúµúPøPøÀúÀúâûâû ÿ ÿžž{{ŽŽXÿXÿµüµü}ÿ}ÿÉÉTTÀÀ99ûýûý™ù™ù#÷#÷mÿmÿÏϬ¬µµUûUû`ø`øÝüÝü-ÿ-ÿ þ þ§ý§ýZþZþ¶þ¶þ­ü­ü•û•ûóóü ü ßßïï‡ü‡üùùýýÿÿ¿¿--èÿèÿÊÊÏÏcc¨¨ôÿôÿˆÿˆÿžþžþþþòûòûÁúÁúÙ÷Ù÷8ö8ö§ý§ýœœþþOüOü  ((AüAüùõùõÕýÕýÏÏzzèþèþûûÝýÝý¡ú¡ú·ü·üµýµý¦û¦û–ú–úööëë……ÙÙÓÓÓÓ¾¾ÿÿáüáü™û™ûøø'ö'ö33¡¡aýaý]]îî•û•û¡ö¡ö/ü/üûþûþ»»oo¦¦/ÿ/ÿnùnù6ö6öÁýÁý³³44¼¼qúqúP÷P÷¡ý¡ýéé„ÿ„ÿäþäþ÷ý÷ýoýoý‰ü‰üüü%ü%ü1ü1üdÿdÿººËËñúñú˜õ˜õÐûÐûôþôþFF­­å刈wwÛÿÛÿ­­®þ®þÿüÿü/ý/ý;ý;ýÒÒkkÈûÈûùöùö(þ(þÏÿÏÿ©þ©þJÿJÿœÿœÿ99''$þ$þåûåû¦û¦ûrûrû££´´¸þ¸þTúTúïþïþeeŽþŽþýý²û²ûæúæú""ûÿûÿooÃÃõýõýoýoýýýbÿbÿ««XX44ýý5û5ûZþZþþþ””¸¸33èÿèÿ1û1û„ø„øýý—ÿ—ÿMMéûéûnùnù=ý=ýQÿQÿ}}ccÿüÿü…ú…úÿÿSSëëçç¥ü¥üøø­þ­þKK;;/ÿ/ÿýÿýÿff#ý#ýMûMûÉüÉüýýíüíü™ü™ü??''©©aýaýUúUúxûxûüü{þ{þåÿåÿ/ÿ/ÿÔþÔþcýcýüü"ÿ"ÿŽŽÝÝÈÈŠþŠþ€ú€úÔÿÔÿµµLL ÿ ÿ†ÿ†ÿÂÿÂÿíÿíÿÍÿÍÿ­ÿ­ÿkýký%ü%ü¼¼KK×ý×ýÕúÕú9ú9úÊùÊùÿÿ  xx³ÿ³ÿÚÿÚÿîÿîÿ]ý]ýÚûÚûýý­ý­ýCC““ÙÙQQeeÒÒúþúþáýáýîûîûÄúÄúVþVþgg7ü7üÉùÉù×ý×ý--MMçýçýÀúÀúÿÿ††KýKýÙúÙú©ý©ýCÿCÿ‹þ‹þ&þ&þ>ÿ>ÿãÿãÿ‘‘““oo__NÿNÿ}ý}ý©ü©ü!ü!ü­þ­þ''«ÿ«ÿiÿiÿzz»»ããmmUUÛüÛü ù ùmúmú)û)û——ggþþ¼ù¼ùœœ““mýmýÿÿþÿþÿ%%AA`þ`þCýCý……ŒŒ‘þ‘þçüçüàûàûŸþŸþ55÷þ÷þBþBþÍüÍüðûðû99ççºÿºÿ)ü)ü7ü7ü-ü-üèþèþ‚‚QþQþ ý ýýÿýÿ®®ÁýÁýyûyûvv[[AA©©™ý™ý1û1û¯¯éüéüüøüøÎÿÎÿ½½××ÏÏxþxþýý‰‰üü^ø^øHûHûëüëüÅÿÅÿyyssyy÷ý÷ýæûæûõüõü‹ý‹ýee­­ççÿÿüü=ý=ýÙýÙýÞÞBB$$]ÿ]ÿ•þ•þþþ*þ*þ1þ1þùÿùÿëüëüfúfú‡ü‡üÏýÏýHHooËÿËÿ•ý•ý‚þ‚þ ÿ ÿ¾¾ÈÈÕüÕüÎùÎùKK;;iýiýDùDù™ü™ü™þ™þºþºþÒþÒþ Îεµßß›ÿ›ÿÿüÿü ÿ ÿCC§ÿ§ÿJÿJÿee›þ›þýý”ÿ”ÿ2ÿ2ÿ þ þ……­­àÿàÿüü©ù©ùöûöûYýYýóüóü¹ü¹ü³³##$$ôÿôÿÕýÕý…ü…ü))cc™ý™ý±ú±ú¤¤ßßEEcücüúúïýïýCC°°úú¸¸HÿHÿ}þ}þyüyü=û=ûßßSSlþlþØúØúüûüû¥ü¥ü¥¥··éþéþaûaû)þ)þÒÿÒÿ»»ùþùþ¯ü¯ü=ý=ýýý00kkÝÝVÿVÿZÿZÿXÿXÿþþ7ý7ý'ü'ü~û~û%ý%ý'þ'þŽŽ§§JJBþBþ©þ©þãþãþÙÿÙÿnnÒÒ­­³ý³ýªúªú~û~ûùûùû6þ6þ—ÿ—ÿ³³ŸŸðþðþýýøûøû”ÿ”ÿÄÄÿÿwýwýŸþŸþPÿPÿ—þ—þ(þ(þÕýÕýŸýŸýÛÛ××øÿøÿ9þ9þÿÿ›ÿ›ÿÇÿÇÿäÿäÿTþTþaýaý­þ­þwÿwÿAAÀÀEEüÿüÿäÿäÿÓÿÓÿOýOýµûµû×ü×ü‘ý‘ýÓÓaa——¹¹èÿèÿbÿbÿÿÿßþßþüüNúNúyûyû9ü9ü)ý)ýÁýÁýPÿPÿKK[[««GGÅÿÅÿ£þ£þíýíý¢¢]]aýaý5ú5úTþTþññ˜˜rrvÿvÿýý‰û‰û£ý£ýúþúþ™™¢¢þþ¹û¹û™ü™ü'ý'ýµýµýþþQÿQÿ¿ÿ¿ÿƒÿƒÿUUÒþÒþ}ü}ü©ý©ýiþiþttÁÁgg--LþLþuüuü½ý½ýþþ__++tt¾þ¾þ††ªªDþDþüüÿüÿü‘ý‘ý³³±±VVzz??LÿLÿÈþÈþiüiüêúêúÄþÄþ3311ŽÿŽÿ­ÿ­ÿÂÿÂÿµýµýgügü©ý©ýyþyþ‚ÿ‚ÿ((—þ—þ—ý—ý*þ*þ‡þ‡þ33DDáþáþ]ý]ýoýoý{ý{ýyy))[ÿ[ÿ6ÿ6ÿ!ÿ!ÿ ÿ ÿóÿóÿýÿýÿ55VVãýãýSüSü·ü·üõüõü•ÿ•ÿ<<œþœþïüïüŸÿŸÿTTHHBBLþLþgügüqÿqÿ]]ñýñýÂûÂû5ý5ý$þ$þ[[ÃɉbbÂÂ[[ÕüÕü™ú™úæþæþ  ÿÿ‡ý‡ý×þ×þ­ÿ­ÿHþHþcýcýeÿeÿ©©%%ÑÿÑÿZZ±±sýsýdûdûëüëüåýåý  §þ§þÙûÙûÍÍ-ÿ-ÿÝüÝülþlþkÿkÿ  77PPÄÄÓýÓýåûåûqþqþ""èþèþþþýýoüoü”þ”þËËNNçþçþOýOý ÿ ÿ33­þ­þ¥ý¥ý¢¢QþQþ÷ÿ÷ÿYÿYÿ5þ5þåýåýµýµýBÿBÿGGzz˜˜WýWý2û2û ÿ ÿÐþÐþQüQü÷ý÷ýÿÿ_þ_þãýãýíþíþŸÿŸÿ/ÿ/ÿâþâþÖþÖþÎþÎþÿÿ/ÿ/ÿ==ÿÿÛüÛüþþäþäþ`þ`þþþÔÔ±±EþEþYYëþëþMýMý‚ÿ‚ÿùù™ÿ™ÿªþªþ´ÿ´ÿõÿõÿUÿUÿëþëþìþìþîþîþ ÿ ÿÿÿQÿQÿqÿqÿrr‡ÿ‡ÿyþyþ ŠÿŠÿ}þ}þ‰ÿ‰ÿ::XXiiøÿøÿ¬ÿ¬ÿþþÓýÓý‰ÿ‰ÿ©©nnEE00""œÿœÿCÿCÿƒþƒþþþ_ÿ_ÿBB<ÿ<ÿŒþŒþvÿvÿíÿíÿÓÿÓÿ##ÖÿÖÿ¢ÿ¢ÿÝþÝþ]þ]þTÿTÿøÿøÿÅÿÅÿ¡ÿ¡ÿVV$ÿ$ÿYþYþlÿlÿ""´ÿ´ÿhÿhÿ†ÿ†ÿ›ÿ›ÿìÿìÿæÿæÿ¿ÿ¿ÿÑÿÑÿÝÿÝÿ@@4ÿ4ÿƒþƒþ@ÿ@ÿ¿ÿ¿ÿ#ÿ#ÿ»þ»þGÿGÿ¥ÿ¥ÿ³ÿ³ÿ»ÿ»ÿkÿkÿ7ÿ7ÿaÿaÿ|ÿ|ÿ ggÕÿÕÿtÿtÿòÿòÿEEMÿMÿ©þ©þÁþÁþÓþÓþ¶ÿ¶ÿII›ÿ›ÿ&ÿ&ÿ’ÿ’ÿÛÿÛÿ€€íí…ÿ…ÿ–þ–þÄÿÄÿŠŠFFNÿNÿÉþÉþÐþÐþÖþÖþóþóþÿÿ–ÿ–ÿôÿôÿ«ÿ«ÿzÿzÿeeæÿæÿÿÿWÿWÿ*ÿ*ÿ ÿ ÿÈÿÈÿAAWÿWÿºþºþEÿEÿ¡ÿ¡ÿOOÃÃùÿùÿqÿqÿˆÿˆÿ˜ÿ˜ÿÂÿÂÿÝÿÝÿ6ÿ6ÿÉþÉþOÿOÿ«ÿ«ÿõÿõÿ""ÎÿÎÿ’ÿ’ÿ´ÿ´ÿÍÿÍÿêþêþOþOþÿÿ£ÿ£ÿ,,‡‡ûÿûÿ˜ÿ˜ÿ8ÿ8ÿùþùþµÿµÿ33OÿOÿ®þ®þÚÿÚÿ¨¨’ÿ’ÿÏþÏþdÿdÿÎÿÎÿyÿyÿ<ÿ<ÿ‹ÿ‹ÿÁÿÁÿíÿíÿ €ÿ€ÿ!ÿ!ÿâÿâÿffÚÿÚÿwÿwÿuÿuÿuÿuÿ¯ÿ¯ÿ×ÿ×ÿäÿäÿìÿìÿŠÿŠÿFÿFÿÿÿòþòþôþôþöþöþ¡ÿ¡ÿžÿžÿKÿKÿ¢ÿ¢ÿàÿàÿÑÿÑÿÇÿÇÿ]ÿ]ÿÿÿzÿzÿÀÿÀÿ bb--qÿqÿ ÿ ÿ&ÿ&ÿ;ÿ;ÿ¹ÿ¹ÿ œÿœÿLÿLÿeÿeÿwÿwÿ–ÿ–ÿ«ÿ«ÿbÿbÿ0ÿ0ÿÍÿÍÿ77[ÿ[ÿÂþÂþ&ÿ&ÿmÿmÿûÿûÿVVöÿöÿ²ÿ²ÿªÿªÿ¥ÿ¥ÿXÿXÿ$ÿ$ÿ5ÿ5ÿCÿCÿûÿûÿvvÜÿÜÿoÿoÿ”ÿ”ÿ°ÿ°ÿÀÿÀÿÊÿÊÿŸÿŸÿÿÿÿÿÙþÙþ_ÿ_ÿ»ÿ»ÿ¨ÿ¨ÿ˜ÿ˜ÿ YYkÿkÿÆþÆþôþôþÿÿËÿËÿCCêÿêÿ²ÿ²ÿŽÿŽÿäÿäÿ}ÿ}ÿ ÿ ÿ9ÿ9ÿZÿZÿoÿoÿ~ÿ~ÿÐÿÐÿÌÿÌÿ¢ÿ¢ÿ´ÿ´ÿÃÿÃÿ‚ÿ‚ÿVÿVÿÈÿÈÿFÿFÿ¶þ¶þõþõþ"ÿ"ÿ·ÿ·ÿâÿâÿ¼ÿ¼ÿ“ÿ“ÿxÿxÿCÿCÿÿÿœÿœÿñÿñÿ”ÿ”ÿEÿEÿûþûþÊþÊþ·ÿ·ÿVV~ÿ~ÿæþæþÿÿÍÿÍÿ£ÿ£ÿEÿEÿÿÿuÿuÿÂÿÂÿnÿnÿ3ÿ3ÿZÿZÿuÿuÿ§ÿ§ÿÉÿÉÿ$$|ÿ|ÿÿÿÁÿÁÿ??ÏÿÏÿ~ÿ~ÿ£ÿ£ÿ¾ÿ¾ÿYÿYÿÿÿqÿqÿ²ÿ²ÿ<<ÑÿÑÿ†ÿ†ÿnÿnÿ`ÿ`ÿ@ÿ@ÿ*ÿ*ÿtÿtÿ¦ÿ¦ÿyÿyÿYÿYÿßÿßÿ99½ÿ½ÿeÿeÿµÿµÿîÿîÿ¦ÿ¦ÿuÿuÿØÿØÿÆÿÆÿ‰ÿ‰ÿÿÿ×þ×þyÿyÿéÿéÿ¡ÿ¡ÿmÿmÿ¢ÿ¢ÿÆÿÆÿPÿPÿþþþþ«ÿ«ÿ †ÿ†ÿÿÿdÿdÿ˜ÿ˜ÿ¦ÿ¦ÿ®ÿ®ÿ¬ÿ¬ÿªÿªÿ‚ÿ‚ÿfÿfÿÌÿÌÿnÿnÿ ÿ ÿ<ÿ<ÿ_ÿ_ÿžÿžÿÉÿÉÿúÿúÿ«ÿ«ÿ_ÿ_ÿBÿBÿ0ÿ0ÿ¤ÿ¤ÿõÿõÿòÿòÿïÿïÿºÿºÿ–ÿ–ÿvÿvÿbÿbÿiÿiÿnÿnÿ¯ÿ¯ÿÛÿÛÿãÿãÿèÿèÿFÿFÿØþØþ6ÿ6ÿxÿxÿÐÿÐÿ|ÿ|ÿÿÿ”ÿ”ÿïÿïÿÿÿÿÿgÿgÿøþøþwÿwÿÕÿÕÿ´ÿ´ÿ™ÿ™ÿ¥ÿ¥ÿ®ÿ®ÿŒÿŒÿrÿrÿ£ÿ£ÿÇÿÇÿ¤ÿ¤ÿŒÿŒÿZÿZÿ8ÿ8ÿrÿrÿœÿœÿÖÿÖÿýÿýÿ~ÿ~ÿ$ÿ$ÿ‡ÿ‡ÿÏÿÏÿÏÿÏÿÍÿÍÿÜÿÜÿçÿçÿžÿžÿkÿkÿJÿJÿ4ÿ4ÿ˜ÿ˜ÿßÿßÿ²ÿ²ÿÿÿ­ÿ­ÿÃÿÃÿÁÿÁÿ¾ÿ¾ÿ”ÿ”ÿvÿvÿ>ÿ>ÿÿÿ|ÿ|ÿÃÿÃÿ…ÿ…ÿWÿWÿ ÿ ÿÕÿÕÿÿÿAÿAÿˆÿˆÿºÿºÿËÿËÿÕÿÕÿØÿØÿÛÿÛÿ¸ÿ¸ÿ ÿ ÿjÿjÿFÿFÿžÿžÿÝÿÝÿÆÿÆÿ´ÿ´ÿœÿœÿ‹ÿ‹ÿbÿbÿFÿFÿ“ÿ“ÿÊÿÊÿ£ÿ£ÿˆÿˆÿYÿYÿ9ÿ9ÿŽÿŽÿÊÿÊÿáÿáÿðÿðÿÁÿÁÿŸÿŸÿÿÿœÿœÿžÿžÿŸÿŸÿ†ÿ†ÿuÿuÿpÿpÿmÿmÿ’ÿ’ÿ«ÿ«ÿmÿmÿAÿAÿgÿgÿ„ÿ„ÿÉÿÉÿøÿøÿéÿéÿÜÿÜÿŠÿŠÿQÿQÿ‹ÿ‹ÿ¶ÿ¶ÿcÿcÿ(ÿ(ÿžÿžÿòÿòÿÝÿÝÿËÿËÿºÿºÿ°ÿ°ÿŒÿŒÿsÿsÿPÿPÿ7ÿ7ÿjÿjÿÿÿÊÿÊÿòÿòÿ®ÿ®ÿ~ÿ~ÿ˜ÿ˜ÿ®ÿ®ÿuÿuÿMÿMÿUÿUÿ\ÿ\ÿ¹ÿ¹ÿúÿúÿŸÿŸÿ]ÿ]ÿoÿoÿ~ÿ~ÿÍÿÍÿÇÿÇÿšÿšÿaÿaÿ9ÿ9ÿhÿhÿ‹ÿ‹ÿ€ÿ€ÿxÿxÿ«ÿ«ÿÏÿÏÿÝÿÝÿçÿçÿ§ÿ§ÿ{ÿ{ÿªÿªÿÍÿÍÿ°ÿ°ÿšÿšÿ`ÿ`ÿ8ÿ8ÿrÿrÿÿÿ¤ÿ¤ÿ¨ÿ¨ÿ’ÿ’ÿ‚ÿ‚ÿ†ÿ†ÿ‰ÿ‰ÿ ÿ ÿ°ÿ°ÿ¡ÿ¡ÿ–ÿ–ÿ¯ÿ¯ÿÀÿÀÿ‚ÿ‚ÿVÿVÿ€ÿ€ÿ ÿ ÿÏÿÏÿðÿðÿ‰ÿ‰ÿ@ÿ@ÿˆÿˆÿ»ÿ»ÿ¯ÿ¯ÿ¤ÿ¤ÿ»ÿ»ÿÊÿÊÿ“ÿ“ÿlÿlÿrÿrÿxÿxÿ€ÿ€ÿ…ÿ…ÿºÿºÿßÿßÿÍÿÍÿÁÿÁÿªÿªÿœÿœÿÿÿ‰ÿ‰ÿyÿyÿnÿnÿ›ÿ›ÿ»ÿ»ÿžÿžÿ‰ÿ‰ÿoÿoÿ^ÿ^ÿ’ÿ’ÿ·ÿ·ÿÂÿÂÿÉÿÉÿ†ÿ†ÿXÿXÿnÿnÿ€ÿ€ÿ²ÿ²ÿÕÿÕÿ‘ÿ‘ÿ_ÿ_ÿ£ÿ£ÿÕÿÕÿ´ÿ´ÿœÿœÿ¢ÿ¢ÿ¨ÿ¨ÿžÿžÿ—ÿ—ÿ‰ÿ‰ÿ€ÿ€ÿ”ÿ”ÿ£ÿ£ÿ{ÿ{ÿ_ÿ_ÿ|ÿ|ÿ‘ÿ‘ÿ¶ÿ¶ÿÎÿÎÿ¤ÿ¤ÿ†ÿ†ÿŽÿŽÿ”ÿ”ÿ‹ÿ‹ÿ„ÿ„ÿˆÿˆÿ‹ÿ‹ÿ²ÿ²ÿÍÿÍÿ°ÿ°ÿšÿšÿ¨ÿ¨ÿ³ÿ³ÿžÿžÿÿÿoÿoÿYÿYÿÿÿ²ÿ²ÿ¦ÿ¦ÿÿÿ†ÿ†ÿwÿwÿžÿžÿ¹ÿ¹ÿ­ÿ­ÿ£ÿ£ÿŽÿŽÿÿÿxÿxÿsÿsÿ¦ÿ¦ÿÊÿÊÿ¼ÿ¼ÿ²ÿ²ÿ|ÿ|ÿWÿWÿ‚ÿ‚ÿ¡ÿ¡ÿ¬ÿ¬ÿ²ÿ²ÿ˜ÿ˜ÿ…ÿ…ÿ~ÿ~ÿyÿyÿ…ÿ…ÿŽÿŽÿŒÿŒÿ‹ÿ‹ÿ¸ÿ¸ÿØÿØÿªÿªÿ‰ÿ‰ÿ–ÿ–ÿ ÿ ÿŒÿŒÿ}ÿ}ÿ ÿ ÿºÿºÿ¥ÿ¥ÿ–ÿ–ÿ›ÿ›ÿŸÿŸÿšÿšÿ—ÿ—ÿ“ÿ“ÿÿÿ›ÿ›ÿ¢ÿ¢ÿ ÿ ÿŸÿŸÿ”ÿ”ÿ‹ÿ‹ÿ•ÿ•ÿœÿœÿÿÿžÿžÿ’ÿ’ÿŠÿŠÿÿÿxÿxÿÿÿ¡ÿ¡ÿ£ÿ£ÿ£ÿ£ÿ”ÿ”ÿŠÿŠÿÿÿ•ÿ•ÿ¤ÿ¤ÿ¯ÿ¯ÿ–ÿ–ÿ„ÿ„ÿœÿœÿ®ÿ®ÿœÿœÿÿÿ˜ÿ˜ÿžÿžÿ¤ÿ¤ÿ©ÿ©ÿ¤ÿ¤ÿ¡ÿ¡ÿ’ÿ’ÿˆÿˆÿ„ÿ„ÿƒÿƒÿ¡ÿ¡ÿ¶ÿ¶ÿÿÿ‹ÿ‹ÿœÿœÿ§ÿ§ÿˆÿˆÿrÿrÿŠÿŠÿ›ÿ›ÿœÿœÿœÿœÿŸÿŸÿ¡ÿ¡ÿÿÿƒÿƒÿšÿšÿ«ÿ«ÿŸÿŸÿ–ÿ–ÿ—ÿ—ÿ˜ÿ˜ÿ˜ÿ˜ÿ™ÿ™ÿ–ÿ–ÿ“ÿ“ÿŸÿŸÿ§ÿ§ÿ˜ÿ˜ÿŽÿŽÿÿÿÿÿŸÿŸÿªÿªÿ¡ÿ¡ÿ›ÿ›ÿ ÿ ÿ¤ÿ¤ÿœÿœÿ–ÿ–ÿ–ÿ–ÿ—ÿ—ÿŠÿŠÿ‚ÿ‚ÿŠÿŠÿÿÿ’ÿ’ÿ”ÿ”ÿ’ÿ’ÿÿÿÿÿ§ÿ§ÿÿÿ–ÿ–ÿ’ÿ’ÿÿÿ£ÿ£ÿ²ÿ²ÿ•ÿ•ÿÿÿŒÿŒÿ•ÿ•ÿ¢ÿ¢ÿ¬ÿ¬ÿ¨ÿ¨ÿ¦ÿ¦ÿžÿžÿ™ÿ™ÿ“ÿ“ÿŽÿŽÿŽÿŽÿŽÿŽÿšÿšÿ¢ÿ¢ÿ¢ÿ¢ÿ¡ÿ¡ÿ’ÿ’ÿ‡ÿ‡ÿÿÿ”ÿ”ÿ‘ÿ‘ÿÿÿ™ÿ™ÿ¡ÿ¡ÿ ÿ ÿ ÿ ÿ’ÿ’ÿ‰ÿ‰ÿ‘ÿ‘ÿ—ÿ—ÿ¢ÿ¢ÿªÿªÿ”ÿ”ÿ†ÿ†ÿ—ÿ—ÿ£ÿ£ÿÿÿ˜ÿ˜ÿžÿžÿ¢ÿ¢ÿ–ÿ–ÿŽÿŽÿÿÿ’ÿ’ÿÿÿ¤ÿ¤ÿ˜ÿ˜ÿÿÿŽÿŽÿŽÿŽÿÿÿ‘ÿ‘ÿ”ÿ”ÿ–ÿ–ÿ˜ÿ˜ÿ™ÿ™ÿšÿšÿ›ÿ›ÿ˜ÿ˜ÿ—ÿ—ÿœÿœÿ ÿ ÿšÿšÿ–ÿ–ÿžÿžÿ¤ÿ¤ÿÿÿ˜ÿ˜ÿ”ÿ”ÿ‘ÿ‘ÿ‘ÿ‘ÿ’ÿ’ÿœÿœÿ£ÿ£ÿŸÿŸÿœÿœÿšÿšÿ˜ÿ˜ÿ”ÿ”ÿÿÿ•ÿ•ÿ˜ÿ˜ÿ•ÿ•ÿ’ÿ’ÿ”ÿ”ÿ–ÿ–ÿ˜ÿ˜ÿ™ÿ™ÿ™ÿ™ÿšÿšÿ™ÿ™ÿ™ÿ™ÿšÿšÿšÿšÿ–ÿ–ÿ“ÿ“ÿ™ÿ™ÿÿÿ•ÿ•ÿÿÿ’ÿ’ÿ•ÿ•ÿšÿšÿžÿžÿœÿœÿ›ÿ›ÿ˜ÿ˜ÿ—ÿ—ÿ”ÿ”ÿ’ÿ’ÿ”ÿ”ÿ–ÿ–ÿ—ÿ—ÿ—ÿ—ÿ™ÿ™ÿ›ÿ›ÿœÿœÿœÿœÿšÿšÿ˜ÿ˜ÿ•ÿ•ÿ’ÿ’ÿ—ÿ—ÿ›ÿ›ÿœÿœÿœÿœÿ˜ÿ˜ÿ•ÿ•ÿ—ÿ—ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ•ÿ•ÿ“ÿ“ÿ–ÿ–ÿ˜ÿ˜ÿ™ÿ™ÿ™ÿ™ÿ—ÿ—ÿ–ÿ–ÿ–ÿ–ÿ–ÿ–ÿ˜ÿ˜ÿ™ÿ™ÿ›ÿ›ÿœÿœÿ˜ÿ˜ÿ•ÿ•ÿ–ÿ–ÿ–ÿ–ÿ—ÿ—ÿ—ÿ—ÿ™ÿ™ÿšÿšÿšÿšÿ™ÿ™ÿ—ÿ—ÿ•ÿ•ÿ–ÿ–ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ™ÿ™ÿ˜ÿ˜ÿ—ÿ—ÿ—ÿ—ÿ–ÿ–ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ—ÿ—ÿ—ÿ—ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ™ÿ™ÿ˜ÿ˜ÿ—ÿ—ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ—ÿ—ÿ—ÿ—ÿ—ÿ—ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ™ÿ™ÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿsonic-visualiser-3.0.3/samples/tap.wav0000644000000000000000000010625013111512442016107 0ustar 00000000000000RIFF ŒWAVEfmt D¬±data|ŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ’È’dsdsu‹u‹àÕàÕ×p×pŽŽ(o(oÇ Ç ^ê^ê§l§l,’,’uuè è -g-goËoËùÚùÚ††jájáùù£ò£ò·c·c››Ý›Ý›VaVaÞ'Þ'ÐñÐñfçfçÅŸÅŸ11°\°\¢¢!ï!ïfZfZ[¤[¤¦þ¦þ–N–N‹.‹.½ã½ãÑîÑî×ô×ô‰Þ‰Þêêyñyñ))rr5 5 wÜwÜ ç çõîõîŠôŠô÷÷÷÷AúAúb b 66!!§§ÎÎ((ÍÿÍÿŠÿŠÿ::÷ÿ÷ÿ«ÿ«ÿvÿvÿ¾ ¾ š š ŒŒ(ò(ò:ó:ó^^hh¤À¤ÀDDc×c×;;Ç$Ç$ õ õWÄWÄ]Û]Û©.©.KÚKÚA7A7ª ª íÇíÇôøôøå×å×9393†(†(ÔÊÔÊð ð ‡ü‡üé0é0ÆÆùüùüLÏLÏppòöòöÃüÃü&ö&öyÑyÑÿ+ÿ+ÓÓ°°öØöØy y `)`)"Õ"Õñ÷ñ÷Y Y ·ß·ßX&X&‚Û‚ÛŸäŸäêê  aùaùkòkò¿¿ýýÃÃýúýúüùüù¨ù¨ù>ú>úûûØûØûYYxx{{))ÈÈ}}5ý5ýqüqü‡ü‡üÝüÝüCýCý“ý“ýÙýÙýþþAþAþæõæõ9ô9ôîôîôRöRöÈ÷È÷ˆˆ  ù ù × × ÏÏõõtïtï½ù½ùÛýÛý„ú„úÍÍooçëçë\\&&°ñ°ñBíBíhhuuŸîŸîñõñõ³³«ö«ö^^#ð#ðJJEEIIUýUý¡ñ¡ñ  ¡ò¡òûýûýxûxûö ö æõæõùù' ' ÐЉ‰ ô ô33dûdûŸŸ11}ù}ù55±±ýüýüÌöÌöPþPþwÿwÿ‹ý‹ý<<äÿäÿ¹þ¹þEþEþýý•ü•üüüµüµüAA··++))òòSÿSÿ)þ)þµýµý™ý™ý¥ý¥ýÁýÁýãýãýþþKþKþwþwþ’þ’þ¦þ¦þ´þ´þÀþÀþïïýýúùúù½ø½øþþ88þþ±ü±üBBõõÖÖ  ùùúúáüáü××??……ÁøÁø????ÂøÂøyüyü…ü…ü££<<VV»ý»ýüümÿmÿHúHúcc9ú9ú••ÕýÕý«ÿ«ÿÙøÙø::}}úúmÿmÿÈøÈø¹ÿ¹ÿ11’þ’þkýkýóóùýùýgÿgÿ==jÿjÿ'þ'þœœ’’MýMýûû‘þ‘þèÿèÿllGýGýüü­û­û¾û¾û²ÿ²ÿ[[ííúúÎ΋‹þþIýIýÙüÙüÍüÍüíüíüýýSýSý…ý…ýµýµýÌÌ[[GG——ßÿßÿ€ÿ€ÿÕùÕùÒøÒø!ü!ü=þ=þww,,5ú5ú++ÐþÐþ/þ/þ³ý³ýÕøÕø++ÕøÕøee­û­û**úÿúÿ_þ_þÿÿÁÁØøØøzÿzÿ½½¤ÿ¤ÿ^ù^ùNNýüýüÒþÒþùüùü##''ôûôû22ÔùÔù@@ÙÙÝøÝømm€€ÝøÝøll—ý—ý™™ççÝøÝø##öûöûŸýŸýoþoþ::îî/ÿ/ÿjþjþ‚þ‚þ”þ”þ£þ£þ  ÷÷++  fþfþÙüÙüQüQüEüEümümü-þ-þÿþÿþYÿYÿ{ÿ{ÿÿÿ|ÿ|ÿrÿrÿfÿfÿ~þ~þ!þ!þþþ þ þ þ þ7þ7þ##GGqqÿÿ‡ý‡ýFÿFÿõûõûfúfú@ù@ù&&ûû××éøéø¡¡ñýñý$$‰‰AýAý=þ=þtùtù88*û*ûkk”ÿ”ÿÂÿÂÿÙùÙù‹ý‹ýWüWüÿÿqúqúÃÃ)ÿ)ÿHH¿¿ÉÉüüñüñüKK‚‚bþbþ9û9ûÔþÔþlÿlÿÿÿñøñø’’rrúúÁùÁù©ý©ýsÿsÿWW££þþñüñüMÿMÿLL¦¦!ÿ!ÿvþvþ5þ5þ&þ&þÿÿ 5544ÖþÖþUþUþ(þ(þ#þ#þ0þ0þCþCþXþXþlþlþþþþþÿÿHÿHÿ[ÿ[ÿ^ÿ^ÿ™ý™ýíüíüÅüÅüùù  ƒƒžžýøýøøúøú¤û¤û©þ©þ¹¹üü‘ÿ‘ÿÿÿÆÿÆÿ1ý1ýšûšûGG––ùùSSùùñÿñÿÿÿeeùù‡ü‡üïÿïÿþþ³ÿ³ÿùù½½uumûmûmÿmÿõùõùûûùù®®ÿÿúú“ý“ý·ü·üùù'ü'ü««ƒÿƒÿúþúþ..ÿÿ)ÿ)ÿéýéýãã!!UÿUÿ†þ†þ5þ5þþþWýWýýý#ý#ýEýEýsýsýÿÿ´ÿ´ÿôÿôÿõÿõÿßÿßÿÇÿÇÿ°ÿ°ÿVþVþËýËý£ý£ý©ý©ýÁýÁýßýßýMMNN››éÿéÿÿÿ¹þ¹þ˜˜‚û‚ûuùuùJûJûïïJÿJÿ&&§ü§üÐþÐþˆÿˆÿ§ü§üííùùïïÛüÛü=ý=ý88KüKüËËQýQýÖúÖú1û1ûëëUûUûœœOýOý;;IÿIÿÍͯ¯ùùûûƒþƒþ99kýký‘‘ÑúÑúçç û ûòûòû_ÿ_ÿææiýiýýýýý!ü!üäûäûääÃþÃþ†û†ûLúLúëýëý˜ÿ˜ÿLLˆˆ×ÿ×ÿ¬ÿ¬ÿÿÿxÿxÿgÿgÿ­þ­þ`þ`þGþGþHþHþTþTþdþdþuþuþ„þ„þ”þ”þ¡þ¡þ00ÏÏùùííZþZþ?ý?ýÛüÛü{þ{þ;ÿ;ÿ¨þ¨þmþmþƒƒþþ¥ù¥ù»»ÿÿ55éé)ú)ú5ü5üÚÚßÿßÿÿÿ/þ/þ‡‡xÿxÿ(ù(ù!þ!þ33‹ü‹üˆûˆûdÿdÿýýÿÿ××-ú-ú´´ þ þ¼ÿ¼ÿ=ÿ=ÿØÿØÿ»ÿ»ÿBúBú þ þÅýÅýÓÓÿÿýÿýÿääYüYü+ü+ü··.ù.ù¸¸þþ%û%ûëüëüÕýÕýççÐУÿ£ÿ?ý?ýIüIüÝüÝüAýAý‡ý‡ý¿ý¿ýpp‹‹ááÚÚ¨¨mÿmÿfþfþûýûýÛýÛýßýßýóýóý þ þ'þ'þËýËýµýµý¿ý¿ýÙýÙýõýõýþþbbµµ''++ªÿªÿ8þ8þŸýŸýmúmúIùIùýýÀþÀþÇÇooìÿìÿ9ù9ùÛüÛü®®ùúùúýýÛÛñûñû  ++TÿTÿiýiýAA­­??ûû®ù®ùƒüƒü††ûûQQÂÂFûFûdùdùüü™™ÐÐ÷÷<ÿ<ÿAùAùñùñùÙÙÕüÕüóÿóÿuýuýþþ¹¹÷÷“þ“þ¥ü¥üJJÖÖlþlþïüïüeüeü©ÿ©ÿ  þþ…ü…üýûýûñûñûüü]ü]üWþWþCÿCÿ§ÿ§ÿÊÿÊÿÍÿÍÿÂÿÂÿ°ÿ°ÿžÿžÿ‹ÿ‹ÿ|ÿ|ÿÃÿÃÿ×ÿ×ÿÒÿÒÿÃÿÃÿ22QQJJ_ý_ý)ü)ü%%œœmùmù55ÖúÖú‡‡ŽŽMùMù‰‰ÉùÉù33NùNù+ÿ+ÿ ÿ ÿÅúÅúMMxúxúÓÓóóSüSü¯¯ïüïü™ý™ýõúõú00ÃÿÃÿlúlú‹‹®®RùRùaýaýþþççïïËË…ÿ…ÿïüïü¼ù¼ùVþVþõÿõÿÎûÎû««àûàûüü‡‡;ÿ;ÿ«ý«ý ý ý‚‚õõ‰‰‘‘wwqÿqÿõþõþIüIüBûBû û û0û0ûƒþƒþŸŸËË¢¢>ÿ>ÿ›þ›þYþYþFþFþIþIþVþVþgþgþxþxþ‡þ‡þJþJþ;þ;þ@þ@þNþNþ`þ`þzzSSŽŽèèááDÿDÿþþÖþÖþ.ÿ.ÿaùaù  £ü£üþþ_ý_ýçýçýŸŸEûEûYÿYÿçç%ý%ýùùZúZúooQQúú==eùeù¡ü¡üžÿžÿ››ÙÙ…ú…ú››ÍýÍýfùfù¿¿!ú!ú˜˜þþhùhù‰‰/ü/ü++••ýý`þ`þüü——CC[ý[ýIüIüÑýÑý“þ“þ±û±ûžúžúIýIý“þ“þ.ÿ.ÿ³³FFddªªžžpp44ÜþÜþÑýÑýmýmý[ý[ýmýmýýý­þ­þ2ÿ2ÿkÿkÿ~ÿ~ÿ~ÿ~ÿvÿvÿlÿlÿ`ÿ`ÿUÿUÿ;þ;þÉýÉý©ý©ý±ý±ýåÿåÿÏÏüüúúkýkýÅþÅþ””)û)û  uýuýsþsþ*þ*þ‹‹‹‹œûœûÿÿvùvùûû›ý›ýˆˆ››ªùªù¼¼‘ÿ‘ÿúúèÿèÿ‡‡úúCC==yùyù‡‡ÅÅzùzùëþëþ™ý™ýúú„„{{ÿþÿþMýMý}ù}ùÿÿ‡ý‡ýƒƒ“þ“þwüwüÿÿ••UUµüµüXúXúýýÿþÿþ¹¹dd‰‰©þ©þeýeýïüïüÛüÛüûþûþíÿíÿHH]]QQ66ÓþÓþ6þ6þýýýýóýóýþþþþ.þ.þFþFþ]þ]þ£ÿ£ÿ))SSPP::™þ™þåýåý§ý§ýêêAADþDþ‡ü‡ühûhû û ûxxùù*ú*úÉÉŸýŸýiúiúwwgýgýrr‰ù‰ùnnŠùŠù¤¤WýWý??aaþþóýóýþþ¯ý¯ýôûôû­ÿ­ÿËËùùýýYYssùùssŽŽ¸þ¸þÕúÕúrrŽùŽù……­ÿ­ÿýýùùžž9ý9ý­ü­üoo„„ÿÿþþ\þ\þ„û„ûvúvúÿþÿþÈÈ®®bb**ÛýÛýçüçü™ü™üŸüŸüÇüÇüÇýÇýNþNþ”þ”þ»þ»þÐþÐþÝþÝþåþåþêþêþ¤¤PPxxbb22úúåýåý•ü•ü'ü'ü#ü#üMMgg½ÿ½ÿkýkýˆúˆú™ù™ùØØÝÝþþ!ÿ!ÿšùšùddÙûÙû]]±±ùù‹‹íí[ý[ý"û"ûÈúÈúGGÇÇlÿlÿþúþú!!³þ³þiüiü™ý™ýEE¹ÿ¹ÿ¢ú¢ú.ÿ.ÿüü­­ûû³ý³ýÁþÁþ¡ù¡ùþþ‡‡¢ù¢ùLþLþoþoþ\\ÿüÿü»ü»üþþþþÿÿÿÿýýõûõûŸŸûû)þ)þeýeýÿÿÒÿÒÿ&& ÿ ÿŠþŠþYþYþNþNþTþTþaþaþÃþÃþóþóþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þ þ§ý§ý‘ý‘ýýý¹ý¹ýfþfþ¼þ¼þçþçþòþòþøþøþÉÉßßSSöûöûccüü­ù­ùRRþþÙûÙûÑýÑý¯¯}ý}ýÑþÑþÉɰù°ùÑþÑþ}ÿ}ÿOO££÷÷íýíýNûNû[['ý'ýyýyýyúyúñüñüNN?ü?üÿÿ]ý]ýßß”ÿ”ÿWýWýÝݵùµùµüµü^^¹¹•ú•ú>þ>þKKQQéýéýUûUûÀûÀû#ü#üéüéücýcý››óóÏÏ11ÚÿÚÿ øÿøÿÕýÕý÷ü÷ü³ü³ü¹ü¹üáüáü•þ•þ_ÿ_ÿ²ÿ²ÿÌÿÌÿÌÿÌÿ¾ÿ¾ÿ­ÿ­ÿšÿšÿ44ffffOO00ÖÿÖÿ®ÿ®ÿ‘ÿ‘ÿÿÿÔþÔþ¼þ¼þþþßýßýýýçüçüWýWýþþEûEû  ™û™û¹¹¯ü¯üÉÿÉÿºûºû««áúáú ÿ ÿããÔÔÃÃåýåý…ÿ…ÿIICüCü1ý1ýâþâþ–þ–þ“ý“ý!þ!þÐÐ77ÑúÑúÿÿ™û™ûûû88ýýqüqü™™ÉùÉùœœÉùÉùYYññûûÆþÆþÖÖ¥¥>>ììýúýúÌùÌùwýwýºÿºÿ®®æþæþþþÏýÏýÁýÁýêþêþpÿpÿ¤ÿ¤ÿ±ÿ±ÿ¬ÿ¬ÿŸÿŸÿêÿêÿýÿýÿöÿöÿãÿãÿÍÿÍÿ¶ÿ¶ÿ ÿ ÿÿÿ|ÿ|ÿmÿmÿåýåýGýGýýý)ý)ý'þ'þ¦þ¦þåþåþ''..+þ+þBûBûii00gýgýAüAü  §§­û­ûÕùÕùáûáûgýgý††++zûzûqqÖùÖù-ÿ-ÿþþþþ((ëë9ú9úØùØù!!5û5û&ÿ&ÿGýGý''£þ£þÉüÉü““=ú=úÊʸ¸ñýñýÚùÚù)ÿ)ÿµúµú$$ááýý©©ÝùÝùùùTT÷ü÷ü˜û˜ûþþGGÃýÃýaûaû¹ü¹üwýwýåýåý}ÿ}ÿ))ddhhìÿìÿÇÿÇÿ©ÿ©ÿ’ÿ’ÿ†þ†þþþóýóýõýõýþþþþ6þ6þMþMþÇÇüüõõÒÒ¥¥µýµý{ü{üüü(ÿ(ÿ½û½ûåùåù½ü½üJþJþ¬ÿ¬ÿ2ÿ2ÿKüKü½ÿ½ÿæúæú+ý+ý‰ý‰ýµýµýíýíýOþOþMüMüãýãýnþnþžúžúêùêù·ü·ü}}ûûÑýÑý=û=û--¸þ¸þ<ÿ<ÿQúQúóóMüMü€€íùíùææ$ÿ$ÿ¥ü¥üýýýý‹‹¢¢ÅüÅü1û1û··CCñþñþÉþÉþºþºþ¸þ¸þÏüÏüüüöûöûüüEþEþHÿHÿ·ÿ·ÿÞÿÞÿáÿáÿÕÿÕÿ0ÿ0ÿäþäþÄþÄþ¹þ¹þ¹þ¹þ½þ½þÄþÄþÊþÊþÑþÑþÖþÖþXXððþþ¿ü¿üQüQü&ÿ&ÿddýýçç_ü_üLLÁÿÁÿ«ÿ«ÿùùùùËýËýÚÚÐЪªOOÃþÃþBÿBÿüùüùòûòûèÿèÿOO  hÿhÿ~~ ú ú;;ýùýùüüEElþlþÿÿYüYüÆÆ—þ—þÆÆ-ÿ-ÿÜÜúúÔúÔúlÿlÿ88;þ;þ0þ0þkkÿÿ’ÿ’ÿ‹ÿ‹ÿ´ÿ´ÿ»ÿ»ÿGüGüéúéúCÿCÿ--æædÿdÿ>þ>þÇýÇý¥ý¥ýçýçýþþ:þ:þVþVþnþnþ%ÿ%ÿvÿvÿ‘ÿ‘ÿ•ÿ•ÿÿÿÿÿtÿtÿgÿgÿ[ÿ[ÿÔÿÔÿýÿýÿñÿñÿÛÿÛÿ¶ÿ¶ÿšÿšÿ„ÿ„ÿ•ý•ýÑüÑü›ü›ü+ý+ý‡ý‡ý9ý9ý3ý3ýII--ÁúÁúÿÿõõEE ú úÂúÂú11XûXûSÿSÿåýåývÿvÿÐþÐþåå£ý£ýññ þ þÅýÅý#ý#ýßßÿÿûû®ÿ®ÿ““NNIþIþüÿüÿþþúúIþIþ‡‡OO…ü…üoþoþÿÿúú^þ^þúú½ü½üuÿuÿææmmttÿÿþþ›ý›ý¡ÿ¡ÿ}}ÇÇÌÌŸþŸþ­ý­ýWýWýIýIý_ý_ý…ý…ýþþIþIþuþuþþþ¤þ¤þ²þ²þ¾þ¾þÇþÇþÏþÏþÖþÖþžÿžÿîÿîÿüÿüÿ™™))77"þ"þ]ü]ü×ü×ü1ý1ýãã  xûxû¦¦%û%û!ü!ü´´„ú„úîî^û^ûXX««2û2ûuýuýßß!ú!úÕüÕü##ççŒþŒþ™™ðþðþœœ"ú"úiûiû~ÿ~ÿÝÝGGÿÿcücü$ú$ú ÿ ÿ%ú%úÛÛ}}yûyû/ý/ýÁþÁþýý¹ý¹ýÏüÏüšš••ÞÞŒÿŒÿÓýÓý!ý!ýeýeýýýÍýÍýãýãýÿýÿýþþ7þ7þÔÿÔÿ}}±±­­kkÌÿÌÿwÿwÿJÿJÿ1ÿ1ÿ#ÿ#ÿÿÿÿÿÿÿÿÿ®þ®þˆþˆþþþƒþƒþŒþŒþçýçý­ý­ý©ý©ý÷ü÷üÇüÇü;;ÑÑcýcýUúUúÍÍÙüÙü{ÿ{ÿ8ÿ8ÿýûýûþþbbûûøûøûÏÏ%%2ú2ú{þ{þwþwþÖÖÿÿüûüûüüÍÍggýýˆÿˆÿ¿ü¿ü`û`û¹ý¹ýõýõýãÿãÿËËŒþŒþµµ€ú€ú  6ú6ú[ý[ý9ý9ý©þ©þ’þ’þÇǵûµûêÿêÿôôÜÜçþçþ}ý}ýwþwþîþîþ$ÿ$ÿ+ý+ýiüiü9ü9üØþØþxx””^^//èÿèÿËÿËÿ±ÿ±ÿXþXþÇýÇý›ý›ýýýµýµýÓýÓýõýõýþþ0þ0þÿÿvÿvÿ›ÿ›ÿ¢ÿ¢ÿ$$ÿÿ›þ›þþþËýËý——éýéý_þ_þ”ú”úeþeþ¯ÿ¯ÿ½½âûâûüüÿÿ½½ÇÇEúEú„„ÇÇEúEúþþ~~ÝÝ“ý“ýûû))ÊÊ—ý—ýºÿºÿºþºþ‚ú‚ú¹¹ùüùüHúHú··iýiýIúIú¡¡ìþìþSýSýnn··¶¶ÉÿÉÿJúJúÇþÇþºþºþ¸þ¸þ¼þ¼þ×ÿ×ÿEE ÿ ÿLÿLÿéÿéÿ%%ýý{ü{ü)ü)ü3ü3üLþLþGÿGÿ²ÿ²ÿ×ÿ×ÿÚÿÚÿÎÿÎÿåÿåÿâÿâÿÒÿÒÿ¾ÿ¾ÿ©ÿ©ÿ•ÿ•ÿƒÿƒÿtÿtÿeÿeÿ—þ—þBþBþ(þ(þ*þ*þ8þ8þ;;  JJþþ­ü­üËüËüýüýüŽŽõüõüàúàú««}ü}ü……ÇþÇþUúUúÂþÂþáá1ý1ýÒþÒþ««)ý)ý¨û¨û¼ÿ¼ÿWüWüáÿáÿ©©dÿdÿXúXúBÿBÿ)û)ûƒƒ÷÷ýý5ý5ýœþœþ©©§ý§ýÿÿííZúZúxþxþ]ü]ü nnýý¥¥\ú\ú££‹ý‹ýWþWþ¥þ¥þÎþÎþÃÿÃÿ""ÓüÓüzûzû©ý©ý¸þ¸þ5ÿ5ÿÿÿêþêþâþâþàþàþ*ÿ*ÿHÿHÿRÿRÿQÿQÿKÿKÿSÿSÿQÿQÿKÿKÿDÿDÿ=ÿ=ÿ6ÿ6ÿ/ÿ/ÿ)ÿ)ÿ ÿ ÿÿþÿþùþùþ÷þ÷þ÷þ÷þ÷þ÷þÿÿÈÈõõÚÚÂûÂûeúeú1ü1ü­ý­ýÄÿÄÿ££»ý»ý™™  ªûªûöþöþ)ü)üÃýÃý™™húhú™™ýý±ü±ü¶ÿ¶ÿqqöûöûêûêûmþmþüúüú……//ÏüÏüýýýývvýûýûééüü‚û‚ûçýçý““YYÁýÁýrr¹ý¹ý.û.ûeýeýFÿFÿýüýüuu””=ü=üåüåüSýSýžžüü&ÿ&ÿßýßýþþ9þ9þWþWþiþiþ{þ{þŠþŠþ™þ™þ•ÿ•ÿýÿýÿìÿìÿêþêþyþyþOþOþGþGþOþOþ^þ^þoþoþ€þ€þŽþŽþrÿrÿÐÿÐÿîÿîÿìÿìÿÜÿÜÿ'ÿ'ÿÔþÔþ²þ²þ‰þ‰þþþ@þ@þ0þ0þ››…ý…ýçýçý)þ)þÂÿÂÿyúyú‡‡9þ9þJÿJÿÉûÉûÙûÙûgÿgÿ……¯¯<ÿ<ÿ¹ý¹ý7ü7ü ÿ ÿûû……ùúùú“þ“þ``þþEEƒþƒþ}ú}úGG³ü³üYÿYÿ½½~ú~ú|þ|þÉþÉþÝüÝü?ü?ü û ûýýþþ@ÿ@ÿ11MM~þ~þýý'ý'ýýý¹ý¹ýþþJþJþnþnþøþøþ5ÿ5ÿNÿNÿTÿTÿQÿQÿ™ÿ™ÿ°ÿ°ÿ¯ÿ¯ÿ¤ÿ¤ÿ•ÿ•ÿ…ÿ…ÿvÿvÿhÿhÿ GGLL::aþaþ±ý±ýwýwý²þ²þCÿCÿ€ÿ€ÿÿÿèþèþüüûû“ý“ýNNùúùúww/ý/ý›ý›ý««üüØÿØÿýýýýuu°ú°úÿÿéüéüÆþÆþÝýÝýuuýýáþáþ••úúyýyý¡¡ËËúú°°ÁûÁû8û8û ÿ ÿqq/þ/þ¤ÿ¤ÿ-û-ûáúáúqqƒýƒýOOþþÜúÜúkýký¨þ¨þ+þ+þþþàà  ˆþˆþÿüÿüqüqühÿhÿ±±))==èÿèÿ@ÿ@ÿòþòþÐþÐþÄþÄþÂþÂþþþhþhþhþhþqþqþþþŒþŒþ™þ™þ¦þ¦þ±þ±þ»þ»þµþµþ¸þ¸þ½þ½þÄþÄþ þ þÉýÉý¿ý¿ýãýãýþþííggCÿCÿ™ú™úûûyyeeùûùûÙÿÙÿ//¥û¥û—ü—ü€€ÍýÍýccúúyy¯ÿ¯ÿýýýýiýiýEEúú±þ±þÑýÑýaaPûPûaÿaÿïýïýVûVûðþðþËþËþaa”þ”þssÁÿÁÿ¡ú¡úCýCýzz??ŸüŸüwüwü««UU{{üü¤ú¤úzz……KÿKÿºþºþ‰ý‰ýýýýýýýÞþÞþ¨ÿ¨ÿøÿøÿ NÿNÿøþøþÒþÒþÄþÄþÂþÂþÅþÅþÊþÊþÐþÐþÀþÀþ½þ½þÀþÀþÅþÅþÌþÌþÒþÒþ|ÿ|ÿÀÿÀÿÓÿÓÿÏÿÏÿÁÿÁÿ®ÿ®ÿÿÿØþØþ‰û‰û¬ú¬ú%ý%ý··²þ²þ??6ÿ6ÿ=ÿ=ÿ­ú­úCCÂúÂúµüµü""uu®ú®ú5û5ûÅÅ……rþrþÿÿ>ÿ>ÿÿÿ°ú°ú//OOýûýûÊÊûûáýáý]ÿ]ÿeýeýçýçýOOéûéûýý ÿ ÿŒŒ¶¶AAÿÿÀúÀúûûÎþÎþ;;««ÂÂ,,ÚÿÚÿDþDþ›ý›ýeýeýþþwþwþ©þ©þÅþÅþÿþÿþÿÿ"ÿ"ÿ$ÿ$ÿ#ÿ#ÿ ÿ ÿ!ÿ!ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿýÿý—ý—ýýýýýÿÿÐÿÐÿÏÿÏÿ¤ÿ¤ÿ££ûû©©$$ÿÿ½ú½újj¤û¤ûkýkýñúñúþþOOÍýÍý99ÀÀ‚ÿ‚ÿââÚûÚû\\NþNþqûqû77êúêú99†þ†þ  ÛüÛüÉûÉûmýmý··aaýý#ü#üþþ››ÎÎüü[ÿ[ÿ¹ý¹ý==uuÅúÅúoüoüQýQý;;ˆþˆþÁüÁüüüÕýÕý®þ®þÄÿÄÿ22^^¾¾½½,þ,þ£ü£üüü ü üÞþÞþ žž½½¯¯ÇþÇþÿýÿýµýµý©ý©ý¹ý¹ýÕýÕýõýõýþþ/þ/þÉÉüüÛÛBþBþ#ý#ýÃüÃüGþGþÿÿåýåýyýyýbþbþÓþÓþ¹¹‡þ‡þUþUþ´´ððÃýÃý[ü[üŒŒ11õýõý«ü«ü'ü'ü[ý[ýïýïý//¿¿eþeþÑúÑúÍüÍü$$þþ~ÿ~ÿ«ü«ü:þ:þ°ÿ°ÿHÿHÿ||ÿÿûûÏüÏüOOSSþþñÿñÿ++ƒþƒþÕúÕú  ÂÿÂÿýýüûüûwþwþšÿšÿûþûþ³þ³þÿÿ,ÿ,ÿ:ÿ:ÿ¼þ¼þˆþˆþzþzþ{þ{þ&&ÓÓøøÔÔ¦¦MÿMÿ®þ®þlþlþXþXþZþZþeþeþtþtþƒþƒþ‘þ‘þŸþŸþ ÿ ÿ;ÿ;ÿMÿMÿPÿPÿƒýƒýÍüÍüŸüŸü¸þ¸þ«ÿ«ÿîÿîÿýÿýÿ“ÿ“ÿ22öÿöÿÿÿ$þ$þüüàúàú//±ý±ýáúáú¦¦ýýììyüyü÷ý÷ý;ü;ü  lløø ÿ ÿ—ü—üâúâú4þ4þ……äúäú“þ“þQÿQÿåúåú::ÛÿÛÿåúåúºÿºÿáþáþÿýÿýýýAýAý{{éüéüèúèú þ þÅÿÅÿªªöö—ÿ—ÿYÿYÿóþóþÅþÅþµþµþ²þ²þüþüþÿÿ)ÿ)ÿ,ÿ,ÿ+ÿ+ÿ(ÿ(ÿ°þ°þ€þ€þrþrþuþuþþþ‹þ‹þ˜þ˜þ¤þ¤þ°þ°þÌþÌþÜþÜþåþåþëþëþïþïþXXåå}ü}üîúîú!ÿ!ÿ  ‹ÿ‹ÿÎþÎþ\ÿ\ÿÿÿÿüÿüüü%ü%üXX¯ý¯ý3ü3üßÿßÿ/þ/þKýKý›ÿ›ÿpÿpÿüü@ÿ@ÿyyûÿûÿZÿZÿôúôúæþæþ½ÿ½ÿ=û=ûÿÿ22éé9ü9üKK  õúõúüü&ÿ&ÿæÿæÿ_ü_üÉýÉýIýIý  ââÂûÂû‡ü‡üXÿXÿ ÿ ÿêþêþ/þ/þéýéýJÿJÿâÿâÿÿÿHHDDpþpþ5ý5ýÅüÅü·ü·ü³þ³þšÿšÿ÷ÿ÷ÿ úÿúÿ(ÿ(ÿÉþÉþ¢þ¢þ–þ–þ˜þ˜þŸþŸþ¨þ¨þ²þ²þ»þ»þüþüþÿÿ#ÿ#ÿ&ÿ&ÿ0ÿ0ÿ2ÿ2ÿ/ÿ/ÿÿÿ ÿ ÿËýËýQýQýüüûûÄÿÄÿäÿäÿçüçü þ þÿÿ¸¸JJÛýÛýaûaûÿÿûûœÿœÿ77ýûýûÆÆýûýû*ÿ*ÿ…þ…þÜÿÜÿïïÁÁåýåý™ü™üœÿœÿ5ÿ5ÿVV##ûûûûùùûûùùÑýÑý’ÿ’ÿÎÿÎÿoýoý|þ|þ#ü#üšþšþ¹ÿ¹ÿÅþÅþ\þ\þ•ý•ýSýSýŒŒååOOÿÿ­ý­ýýýõüõüÛýÛýUþUþ–þ–þ»þ»þÐþÐþÜþÜþ\ÿ\ÿ‘ÿ‘ÿ¡ÿ¡ÿŸÿŸÿ”ÿ”ÿ‡ÿ‡ÿzÿzÿlÿlÿ`ÿ`ÿ±þ±þgþgþNþNþMþMþWþWþ°ÿ°ÿBBss¹ý¹ýüü<<ØØîî°û°ûKKûûQQXX-ý-ýzzûû»ü»üÎÎ""‹ü‹ü­ý­ýßßííŸüŸü¡ý¡ýííÿÿÁýÁý½ý½ý11ûû{ý{ýƒƒÃýÃýÙþÙþ66ûûëëûûhþhþÛþÛþ´´éégýgýíÿíÿÿÿ‘‘ ý ýooÛýÛýOO¨ÿ¨ÿÝþÝþüüûû}ý}ý³þ³þœþœþ˜þ˜þœþœþBBññ""¹ÿ¹ÿ ÿ ÿ¾þ¾þþþ”þ”þeþeþXþXþ\þ\þhþhþvþvþ„þ„þ’þ’þŸþŸþ¤ÿ¤ÿ22//ûýûýýýÑüÑüÑüÑüááddŠþŠþýûýû!û!ûÌÌaaXþXþ1û1ûßß!û!û{ü{üßß¶û¶û—ÿ—ÿwwËüËüaýaýÝÝDÿDÿÿÿñüñü<û<ûßýßýÛÛsþsþÕþÕþJJ{{%û%û–û–ûLÿLÿÛÛÿÿÍûÍûiiQýQý ÿ ÿ÷ý÷ýqýqý¿¿AþAþtÿtÿ¸ÿ¸ÿ#ý#ý/ÿ/ÿ™™ÃÿÃÿUÿUÿ/ÿ/ÿÿÿýüýü#ü#üÁýÁý’þ’þøþøþ§§TT€€oo²ÿ²ÿÜþÜþ|þ|þXþXþRþRþYþYþ¨þ¨þÒþÒþèþèþóþóþùþùþüþüþþþþþÿþÿþÿÿÊþÊþ´þ´þ¯þ¯þ±þ±þ·þ·þ²þ²þ´þ´þºþºþiüiüûûAýAý(þ(þäþäþ==ÏÏXXþþ1û1ûÇÇYÿYÿ2û2û—þ—þ¦¦QûQûÉüÉüñýñý``ØÿØÿÍÍeüeüJþJþ  ssüü0þ0þËˈþˆþ££>û>ûÅüÅüÃÃddÔÿÔÿ*þ*þ6û6ûííKÿKÿŒÿŒÿûûþþ--CýCý^þ^þµµµþµþ[ý[ý×ý×ý"þ"þ11ÇÇRR¢þ¢þáýáýHþHþþþ¢þ¢þ·þ·þÿÿ!ÿ!ÿ.ÿ.ÿ2ÿ2ÿ0ÿ0ÿÿÿÿÿúþúþøþøþ÷þ÷þ÷þ÷þøþøþùþùþÿÿÿÿÿÿÿÿÿÿÿÿ‘ý‘ý÷ü÷üÍüÍüÅýÅýHþHþþþòòììƒþƒþûüûü  ææ¸û¸û¤¤AûAû¡ý¡ý[[””BûBûÙÙáüáü’ÿ’ÿ½ü½üõõýÿýÿEûEû;ý;ý»»EûEû»»#ü#üRÿRÿ»»""EûEûþÿþÿSýSýFûFû¥ü¥ü€€ ý ý¹¹çýçý††ýýµüµüVVÝÝIûIû··µýµýPûPû?þ?þ¡ÿ¡ÿ×þ×þ}þ}þ[þ[þIÿIÿ±ÿ±ÿÖÿÖÿÛÿÛÿYÿYÿÿÿûþûþíþíþèþèþçþçþýþýþÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿ&ÿ&ÿ(ÿ(ÿ&ÿ&ÿ‰‰66ýýQûQûÑýÑýÿÿýý¯¯ÇýÇý ü ü]]õýõýÄÿÄÿ³ü³üÁüÁüoýoýþþ­­ÉûÉû­­ªûªûÕÕjjÿÿUûUû  ˆˆ­ý­ýUûUûÒÒ¦û¦û††âÿâÿáá/ÿ/ÿVûVû--;ÿ;ÿ‹‹XûXûÒÒ„þ„þ(ÿ(ÿÞÞ”ÿ”ÿãÿãÿYûYû?þ?þ¯ÿ¯ÿ¹ý¹ýéüéüêþêþÖÿÖÿ£ÿ£ÿ‚ÿ‚ÿmÿmÿÝþÝþžþžþ†þ†þƒþƒþñþñþ#ÿ#ÿ8ÿ8ÿ>ÿ>ÿ>ÿ>ÿŽÿŽÿ«ÿ«ÿ®ÿ®ÿ¦ÿ¦ÿ˜ÿ˜ÿ‰ÿ‰ÿ{ÿ{ÿmÿmÿ¼þ¼þoþoþUþUþSþSþ\þ\þjþjþ™ÿ™ÿCCþþ ý ý¹ü¹üuýuýãýãý‹‹­­µýµýŸŸ‚û‚ûAA¡¡ÙûÙûòûòû½ü½üOO¾þ¾þ!!@@þþåüåüccÅûÅûÿÿ››{þ{þåþåþ×ÿ×ÿµûµû$ÿ$ÿÔþÔþ«ÿ«ÿeûeû'ÿ'ÿ™™ÿÿüüoofûfû™™àûàûâÿâÿ—ý—ý¿ÿ¿ÿìì'ý'ý[[nþnþzþzþ‡þ‡þ^ÿ^ÿºÿºÿ¯ÿ¯ÿ ÿ ÿuþuþõýõýÉýÉýåýåýþþþþ7þ7þ˜þ˜þÊþÊþåþåþòþòþúþúþýþýþÿÿËÿËÿÚÿÚÿÔÿÔÿÅÿÅÿ³ÿ³ÿ ÿ ÿŽÿŽÿ~ÿ~ÿoÿoÿƒþƒþ þ þÿýÿýÿýÿý1ÿ1ÿ¹ÿ¹ÿíÿíÿÿÿIÿIÿÇýÇý+ý+ýàÿàÿææ[ü[ü#ý#ýÓÓ…ý…ýLþLþAÿAÿ#ý#ýÚÚrûrûXþXþšÿšÿIÿIÿÝüÝüuýuýGþGþfÿfÿÔÿÔÿoþoþuûuû ÿ ÿÿÿ‹‹uûuû‘ü‘üuuººÞþÞþ››!ü!üŸýŸýhþhþ660ÿ0ÿÊÿÊÿýýmmxûxûüüÇǯ¯mÿmÿÓþÓþJþJþþþÉýÉý·ý·ýÃýÃýUÿUÿGGRRËÿËÿ€ÿ€ÿWÿWÿ>ÿ>ÿ0ÿ0ÿ&ÿ&ÿþþSþSþ@þ@þCþCþPþPþ`þ`þqþqþþþþþ5þ5þþþþþ%þ%þ9þ9þüü!!yy«ý«ýûû—ÿ—ÿddªÿªÿÖþÖþ¤û¤ûßÿßÿåüåütþtþ^^wwùûùûxþxþÖÿÖÿèûèûŒÿŒÿ}}þþ…ý…ýEüEüHÿHÿ‹ý‹ý}}ÛýÛýþþfþfþ…û…ûÏÏÝýÝý…û…û{{íûíû,ÿ,ÿÈÿÈÿ­ÿ­ÿéýéýOOÌ̈ûˆûaýaýEEyygýgýüü—ÿ—ÿ))ˆˆ((ÁþÁþ þ þóýóýíýíýûýûýlþlþ§þ§þÈþÈþÚþÚþjÿjÿ¤ÿ¤ÿ¶ÿ¶ÿ³ÿ³ÿ§ÿ§ÿ˜ÿ˜ÿIÿIÿÿÿ ÿ ÿÿÿýþýþûþûþûþûþûþûþüþüþüþüþCýCý•ü•üiüiü}ü}ü»þ»þÅÿÅÿ11  !!ÓýÓýîûîûùùeeŽûŽûÜÜÿÿ¯ÿ¯ÿÛýÛýcc“þ“þüü9ÿ9ÿ33‘û‘ûÞÞ½½vvoýoý©û©û88¥þ¥þPP±ý±ý’û’ûttéüéü<<=ü=üuuRRnn<ÿ<ÿüüVVÖÿÖÿZþZþàûàûµµPþPþ•û•ûùùccFÿFÿÿÿÿÿøþøþ%þ%þÑýÑýïýïý þ þ*ÿ*ÿªÿªÿÛÿÛÿ{þ{þáýáý«ý«ý§ý§ýÅþÅþKÿKÿƒÿƒÿ–ÿ–ÿ•ÿ•ÿŒÿŒÿÕÿÕÿêÿêÿåÿåÿÖÿÖÿÂÿÂÿ®ÿ®ÿšÿšÿˆÿˆÿyÿyÿ)ÿ)ÿÿÿòþòþêþêþèþèþcýcýËüËü¥ü¥üIÿIÿww+ý+ýÅûÅû¨¨aaêÿêÿQýQýžûžû¬þ¬þaañýñýúÿúÿÂûÂû‹ü‹ü__•ü•ü"þ"þ__1ÿ1ÿ¡û¡û‡þ‡þ¹ý¹ýáá__­ý­ýzzäþäþ¢û¢û+ÿ+ÿÏÿÏÿùýùý^þ^þUU ÿ ÿ!!¤û¤û€ÿ€ÿ[[¥û¥ûææ¤ÿ¤ÿ¡¡uüuü#ý#ýëýëý[[(([ÿ[ÿƒþƒþþþíýíý¹ý¹ýµýµýÇýÇý‘ÿ‘ÿXXŸŸ.ÿ.ÿ‚þ‚þ:þ:þ%þ%þþþ(þ(þ9þ9þMþMþ`þ`þsþsþbÿbÿÉÿÉÿíÿíÿïÿïÿâÿâÿÏÿÏÿºÿºÿ¦ÿ¦ÿ“ÿ“ÿ¤ÿ¤ÿ¢ÿ¢ÿ˜ÿ˜ÿŠÿŠÿGýGý[ü[üüüùýùýæþæþZZSS­û­ûSSÿÿåÿåÿºþºþ7ý7ýÿÿ®û®û˜þ˜þQQÛýÛýÄþÄþ³ý³ý<þ<þQQ-ÿ-ÿÞÞ(þ(þ±û±ûÞÞ^ÿ^ÿ•ü•üžžàÿàÿýý9ü9üOO²û²ûÛÿÛÿ>>ýý“ü“üYþYþ.þ.þMMãýãýçÿçÿüüÊþÊþœÿœÿÇþÇþ&þ&þ7ÿ7ÿ±ÿ±ÿ\ÿ\ÿ0ÿ0ÿ0þ0þÇýÇý¿þ¿þ4ÿ4ÿgÿgÿBÿBÿ.ÿ.ÿ"ÿ"ÿÿÿ¶þ¶þŒþŒþþþƒþƒþŠþŠþ•þ•þþþ¦þ¦þ¯þ¯þ¹þ¹þÁþÁþÉþÉþÐþÐþÖþÖþÛþÛþ£ÿ£ÿöÿöÿ ÷ÿ÷ÿ ÿ ÿpÿpÿSÿSÿ þ þ…ý…ý„þ„þÿÿ––ÛüÛü^^ûýûýžÿžÿÃÃÞÿÞÿÇüÇüSüSüCCCýCýÄľû¾ûjÿjÿ‰ÿ‰ÿBBiüiü±±ºþºþÿÿDÿDÿOþOþ--wýwý×ý×ý¢¢oÿoÿ¢¢mþmþ…þ…þÁûÁûýýƒþƒþÁýÁýÓÓìþìþ³ý³ý==ÂûÂû‘þ‘þ==‹‹ÿÿÝüÝüWýWý§ý§ýóÿóÿîî;;ÙÿÙÿÅýÅýåüåüüü;þ;þÿÿ_ÿ_ÿ‚ÿ‚ÿÿÿÊþÊþ³þ³þ­þ­þ¯þ¯þbÿbÿ®ÿ®ÿÇÿÇÿÆÿÆÿ»ÿ»ÿªÿªÿ™ÿ™ÿˆÿˆÿ@ÿ@ÿÿÿÿÿÿÿüþüþûþûþÝýÝýkýkýOýOý]ý]ý ÿ ÿíÿíÿ  55CýCýÌûÌûúú>ÿ>ÿ‘‘küküwýwý}ü}ü!ü!üCýCýÇþÇþÎÿÎÿ==ÿÿ­­±þ±þ11ÿÿƒüƒüÇüÇü11))%ÿ%ÿÐûÐû4ÿ4ÿ«ü«üXþXþµÿµÿ¢ÿ¢ÿ11ýý||ÑûÑû‹ý‹ýÿÿ‰‰þþÒûÒûåýåýðþðþRRßßÉÿÉÿ?ý?ý1ü1üËÿËÿbb  ÉÉxþxþqýqýýý\þ\þýþýþGÿGÿeÿeÿ2ÿ2ÿÿÿ ÿ ÿÿÿÿÿÿÿ˜þ˜þoþoþeþeþjþjþuþuþ‚þ‚þþþœþœþ§þ§þ²þ²þŠÿŠÿåÿåÿÿÿÿÿíÿíÿ×ÿ×ÿÀÿÀÿþþWýWý×ý×ý"þ"þÜÜ%%™ü™üýýRþRþòòÜûÜû¯þ¯þÍÿÍÿàà…ý…ýïüïü¨¨½ý½ý~þ~þjÿjÿ  þþ»ÿ»ÿSýSýÙýÙý®ÿ®ÿ!!¨þ¨þQýQý''ÞûÞûÝþÝþËË))ÛýÛýIýIýåûåû¼¼··GüGü¿¿ÙÿÙÿeþeþáûáû{{©þ©þËýËýýýuýuý‡‡ØØÚÿÚÿäþäþÉþÉþÀþÀþÀþÀþsÿsÿ½ÿ½ÿÕÿÕÿÓÿÓÿþþWýWýýýýý7ý7ýÀþÀþxÿxÿÄÿÄÿÜÿÜÿÚÿÚÿÌÿÌÿºÿºÿ¦ÿ¦ÿvÿvÿYÿYÿGÿGÿ:ÿ:ÿ1ÿ1ÿ*ÿ*ÿ€ÿ€ÿžÿžÿ£ÿ£ÿ™þ™þ&þ&þÿýÿýþþÃþÃþ,,ÀÀéûéûBþBþþþ'ý'ýQýQýÿÿõüõü2222ùýùýüüìûìû¹¹ÝýÝý¢¢ÜþÜþAA;ÿ;ÿíûíûOüOüÑÿÑÿÏýÏý‘þ‘þ<ÿ<ÿ-ü-üQQýýõÿõÿUUµÿµÿ¥ÿ¥ÿðûðûþþ>>òþòþYýYýûÿûÿñûñûæÿæÿ¯¯¿ý¿ýüüHHmmŽÿŽÿ ÿ ÿ¯ý¯ýýýõüõüýý"þ"þ³þ³þúþúþÿÿ'ÿ'ÿ+ÿ+ÿtÿtÿŽÿŽÿ’ÿ’ÿ‹ÿ‹ÿ€ÿ€ÿtÿtÿgÿgÿ\ÿ\ÿQÿQÿGÿGÿ²þ²þsþsþ^þ^þ^þ^þDDNNýýöûöû±ý±ý’þ’þuþuþ  'ÿ'ÿ5ý5ýùûùû'þ'þÂÂ)ÿ)ÿ""üüKýKý‹ÿ‹ÿ99ËÿËÿ‰ý‰ýCýCý ü ü‘ÿ‘ÿ‚þ‚þmümü¨¨¹ý¹ý))©ý©ý¯ý¯ýwüwü\\±ý±ý²þ²þ**ýûýûeüeü«þ«þ?ü?üââ‰þ‰þFþFþ¹¹¾¾ÁÿÁÿÍþÍþ­þ­þ¤þ¤þÍýÍý}ý}ýoýoý!ÿ!ÿæÿæÿ00AAÒþÒþ+þ+þíýíýßýßýëýëýÒþÒþ?ÿ?ÿmÿmÿ|ÿ|ÿ{ÿ{ÿtÿtÿiÿiÿ_ÿ_ÿ|ÿ|ÿÿÿ~ÿ~ÿtÿtÿiÿiÿ^ÿ^ÿÙþÙþŸþŸþŠþŠþ ÿ ÿCÿCÿYÿYÿ)ý)ýEüEüZZúúüüüü=ý=ýúúüü66üüþþwÿwÿùùÈþÈþëüëüþþøø{ü{üMMÕýÕý??PP ü üššwüwüuu ü üUþUþ;;ààþþÑþÑþ––ýýcücü|þ|þ__ ü üôô ü ü þ þllôô&ÿ&ÿ÷ý÷ý–ÿ–ÿHHýý ü üÿÿyyÿÿrþrþ/þ/þ‰þ‰þºþºþÔþÔþãþãþÄÿÄÿ66//%ÿ%ÿ¾þ¾þ“þ“þ†þ†þ‡þ‡þþþ™þ™þ¤þ¤þ®þ®þ¸þ¸þþþÝýÝýÓýÓýáýáý–ÿ–ÿSS––äþäþþþœÿœÿ@@üüWþWþÜþÜþÓÓýýëëbbüü,,‡‡üüZþZþ77OO5ý5ýØÿØÿýýééñÿñÿþþ[ý[ýÜÿÜÿüüTTÛüÛüEE.ÿ.ÿèèüü¸¸ÏüÏü·ý·ý(þ(þçç£ü£üJþJþ¢¢üü¯ý¯ýƒÿƒÿ™™ŒþŒþ;ÿ;ÿÔÿÔÿrÿrÿíýíýKýKýýýÁýÁýgg''…ÿ…ÿ4ÿ4ÿ ÿ ÿÍþÍþ´þ´þ­þ­þ®þ®þ´þ´þ»þ»þnþnþSþSþRþRþ[þ[þiþiþxþxþ‡þ‡þ•þ•þ¢þ¢þÑþÑþéþéþõþõþüþüþÿþÿþ¶ÿ¶ÿÿÿÿÿÿþÿþ‚þ‚þ}þ}þ‚þ‚þÿÿÿÿÿÿ{ü{ü­ÿ­ÿÞÞ#ü#üÝÝ;ý;ýÅýÅýðþðþÝÝþþCÿCÿüüÜÜ9þ9þ#ü#ürÿrÿ––OýOýÀÀWW%ü%ü(þ(þ•ü•üÚÚÚÚ%ü%ü““gÿgÿ†ÿ†ÿ'ü'üñýñýþþíýíýÀÀ=ÿ=ÿ©ý©ý¡þ¡þ;;rrmmvv-ý-ý)ü)üãÿãÿ²²hÿhÿUþUþáýáý©þ©þÿÿ4ÿ4ÿùýùýyýyýUýUý]ý]ý‹þ‹þÿÿ\ÿ\ÿtÿtÿxÿxÿsÿsÿ›ÿ›ÿ¥ÿ¥ÿ ÿ ÿ”ÿ”ÿ†ÿ†ÿxÿxÿkÿkÿ^ÿ^ÿSÿSÿ«ÿ«ÿÉÿÉÿËÿËÿÀÿÀÿßýßýýýÕüÕüLþLþÿÿÛÿÛÿ//ÕÕºþºþ/ý/ý))XX1ü1ü1þ1þÿÿ«ý«ý›ÿ›ÿ..—ü—üûþûþ«ÿ«ÿýýÏýÏýZZ““cücü‘‘ÕþÕþ£þ£þ½þ½þ{{3ü3ü££ŸýŸýƒþƒþ­ü­üËËôÿôÿéýéýWüWüEÿEÿñýñýüþüþIýIýÅýÅýcc‚ÿ‚ÿ««…ý…ýaþaþÏþÏþ..½½çýçý«ü«ü©ý©ý1þ1þ|þ|þ88ññ((!!`ÿ`ÿ‹þ‹þ2þ2þþþþþ$þ$þfþfþþþ¦þ¦þ·þ·þÃþÃþÌþÌþÓþÓþÙþÙþÞþÞþ ÿ ÿ<ÿ<ÿEÿEÿFÿFÿBÿBÿ]]ll¤þ¤þÙýÙý#þ#þSþSþ4þ4þ1þ1þ¢¢ææÑÑ?ü?ü9þ9þ”þ”þhÿhÿÁÁ×ý×ý5ÿ5ÿ þ þýý““þþ,,/þ/þéÿéÿgügü^^AüAü““ÉýÉýoýoýbbOÿOÿ¾¾ìÿìÿCüCü¹ý¹ýÈÈ‹ÿ‹ÿ{ý{ýµµCüCü{ý{ý¼¼êêúú]ý]ý\þ\þÌþÌþEüEü‹ý‹ýXþXþÿÿSÿSÿ©©--IIþþYýYýãüãü0þ0þÔþÔþ!ÿ!ÿCÿCÿ4ÿ4ÿ+ÿ+ÿ$ÿ$ÿÿÿÿÿÿÿ”ÿ”ÿÄÿÄÿÏÿÏÿÈÿÈÿ¹ÿ¹ÿ§ÿ§ÿ•ÿ•ÿ„ÿ„ÿuÿuÿéýéýEýEýýýýýÿÿùÿùÿQQ[ÿ[ÿåþåþssùÿùÿéüéüÉüÉübbØÿØÿ{ü{üÃþÃþMüMüáÿáÿ£þ£þ³³9þ9þ™ü™ü’þ’þ®®²²ëÿëÿþþ™ý™ýƒƒÑüÑüþþäþäþOüOü ÿ ÿ8þ8þˆÿˆÿ‘ÿ‘ÿZZQüQü«ý«ýiýiý¯¯ :þ:þÿÿeýeý:þ:þÃãþ£þ®®QüQüGýGýÄÿÄÿÙÙoþoþ]ý]ý]ÿ]ÿ??/ÿ/ÿ°þ°þ{þ{þîþîþ$ÿ$ÿ:ÿ:ÿAÿAÿÁÿÁÿðÿðÿøÿøÿìÿìÿÚÿÚÿÄÿÄÿèþèþ„þ„þ_þ_þWþWþ]þ]þjþjþyþyþ†þ†þ”þ”þþþ”þ”þþþ§þ§þ°þ°þÞþÞþôþôþÿþÿþGGÊʦÿ¦ÿÿÿkk—ü—ü{þ{þùýùý¥ý¥ýii¦¦99[ü[üëþëþáýáýJJ$$«ý«ý¯þ¯þuþuþ¥ü¥üåüåü¤¤yþyþfÿfÿCÿCÿ ý ýÃýÃý££ÙýÙýÄÿÄÿ··ÂÿÂÿ]ü]üyýyýmmQQCÿCÿ>>‘ý‘ý_ü_ülÿlÿÿÿnþnþxx]ÿ]ÿ_ü_üxþxþÜÿÜÿpp•þ•þÁýÁýpþpþÇþÇþ™ÿ™ÿðÿðÿ$ÿ$ÿºþºþþþþþ~ÿ~ÿéÿéÿ þÿþÿÿÿ²þ²þ†þ†þ{þ{þ}þ}þ…þ…þþþœþœþdþdþTþTþWþWþbþbþqþqþ€þ€þñþñþ&ÿ&ÿ<ÿ<ÿBÿBÿHH­­àþàþþþbÿbÿøÿøÿ#þ#þ­ÿ­ÿîî þ þgügü™™¥¥gügü‹ý‹ý9þ9þ——ÀþÀþTT™ü™ü%ÿ%ÿ,þ,þ++;;iüiüýý³þ³þ--••««?þ?þ£ü£üOOküküþþøøÇÿÇÿ””[ý[ýeÿeÿæþæþ^^ÇþÇþËýËýëýëýœþœþAAmümü«þ«þýÿýÿ__yyœþœþÉýÉýOþOþ–þ–þ¾þ¾þ¸þ¸þ¹þ¹þ¾þ¾þÄþÄþ€ÿ€ÿÎÿÎÿæÿæÿãÿãÿÔÿÔÿÁÿÁÿÏþÏþdþdþ<þ<þ5þ5þ>þ>þNþNþ`þ`þqþqþ‚þ‚þþþ·ÿ·ÿ00WWTTÿÿþþUþUþþþþþKÿKÿ¹ÿ¹ÿàÿàÿääsüsümþmþ‹‹3ÿ3ÿÿÿuüuü44+ý+ý55!ý!ý÷ý÷ýLLýý§ÿ§ÿ$$þþÖþÖþBÿBÿ9þ9þšÿšÿŸÿŸÿ„þ„þUÿUÿwüwü‡‡JÿJÿ2ÿ2ÿRR»ý»ý11dþdþSýSýYýYýÛÿÛÿUþUþyüyü=ÿ=ÿ……mþmþJþJþþþþþSÿSÿÿÿ‘ÿ‘ÿ÷ÿ÷ÿÿÿžþžþqþqþöþöþ7ÿ7ÿSÿSÿ_ÿ_ÿcÿcÿbÿbÿ`ÿ`ÿ\ÿ\ÿXÿXÿ'ÿ'ÿÿÿ ÿ ÿÿÿ ÿ ÿÿÿÿÿÿÿÍþÍþ±þ±þ¬þ¬þ²þ²þ½þ½þÉþÉþkk00,ÿ,ÿ4þ4þÓýÓýªþªþÿÿ0ÿ0ÿ<ÿ<ÿpÿpÿ..=ý=ý..¯ý¯ýèÿèÿ§ý§ýÿÿ11yþyþ¾ÿ¾ÿíýíý ,,þþþþÿÿ´þ´þþþvþvþNþNþ,,©ý©ýúþúþùÿùÿúþúþ6þ6þ,,—ý—ý,,ÕþÕþ›þ›þYÿYÿ‰ÿ‰ÿAýAýœÿœÿSÿSÿ=þ=þ„þ„þ¦¦ØþØþGþGþþþ¿ÿ¿ÿxxøÿøÿ°ÿ°ÿ^þ^þÏýÏý£ý£ý´þ´þ8ÿ8ÿtÿtÿÿÿ..22&&ÿÿÿÿ9ÿ9ÿßþßþ¼þ¼þ²þ²þ¶þ¶þ¿þ¿þËþËþÕþÕþàþàþëþëþ°þ°þþþžþžþ§þ§þ™ÿ™ÿ##ÚÿÚÿ¯ÿ¯ÿ ÿ ÿÅþÅþ”þ”þ$$dÿdÿKýKýþþîîÌþÌþ–þ–þ{ý{ý$$kþkþ$$0þ0þ ÿ ÿäÿäÿjþjþ””šÿšÿˆþˆþGýGýÛþÛþpÿpÿTT“ý“ýÉþÉþ""PþPþ!!BþBþÿÿ77ÈÿÈÿÿÿÿÿKýKý++ÌÿÌÿVVàÿàÿKýKý  HþHþ³ý³ý``²þ²þõýõý††eÿeÿ]þ]þâþâþ$ÿ$ÿBÿBÿ¸þ¸þþþpþpþuþuþÿÿLÿLÿkÿkÿuÿuÿwÿwÿ—ÿ—ÿ ÿ ÿÿÿ—ÿ—ÿŽÿŽÿ…ÿ…ÿ|ÿ|ÿtÿtÿiÿiÿaÿaÿ[ÿ[ÿVÿVÿRÿRÿNÿNÿ/ÿ/ÿ ÿ ÿÿÿ²þ²þ‰þ‰þþþþþñýñý ööQýQýøÿøÿfþfþÿÿºÿºÿ©ý©ý€ÿ€ÿÿÿîÿîÿ9þ9þÙÿÙÿùýùýbÿbÿQýQý"ÿ"ÿÉýÉýþþÉÿÉÿÿÿ¥ý¥ý»ý»ý”þ”þ÷ý÷ý_ÿ_ÿWþWþŽÿŽÿ…þ…þPþPþ~~&þ&þ§§~ÿ~ÿ©ý©ýûÿûÿùÿùÿ!ÿ!ÿaýaýßþßþ’ÿ’ÿsÿsÿaÿaÿHþHþÕýÕýøþøþÿÿ»ÿ»ÿßÿßÿæÿæÿÞÿÞÿÒÿÒÿcÿcÿ/ÿ/ÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿýþýþÿþÿþÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿ§ÿ§ÿàÿàÿðÿðÿìÿìÿÿÿ£þ£þ}þ}þfÿfÿÎÿÎÿüþüþŸþŸþÕÿÕÿ,þ,þ,þ,þzþzþIÿIÿdÿdÿÿÿ~þ~þ{ý{ýýÿýÿ··hþhþÿÿÿÿùýùýÊÿÊÿ›þ›þeýeýáýáý ÿ ÿ]ý]ýÐÿÐÿ]ý]ý[þ[þ£þ£þ  ÿÿkÿkÿ(( ÿ ÿOþOþîþîþ‰ý‰ýãýãýòÿòÿVÿVÿRRþþÂÿÂÿiiÚþÚþ)þ)þ‘þ‘þËþËþJÿJÿ…ÿ…ÿÎÿÎÿçÿçÿèÿèÿŠÿŠÿYÿYÿBÿBÿ7ÿ7ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ#ÿ#ÿ%ÿ%ÿ'ÿ'ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿûÿûÿXXrríþíþ@þ@þlÿlÿñÿñÿ½þ½þ8þ8þýý##oÿoÿ¥ý¥ýoÿoÿ……eýeýÔþÔþ‹ý‹ý¿ý¿ýzzþþ"ÿ"ÿCCÿÿgýgýÿÿKKÊÿÊÿgýgývþvþ’þ’þlÿlÿRÿRÿiýiýRR99¥ý¥ýZÿZÿ@ÿ@ÿáþáþ½½¬¬iýiý—ý—ýŒŒÛÛ£þ£þDþDþ'þ'þÌÿÌÿpÿpÿïþïþ¹þ¹þãþãþüþüþ ÿ ÿAÿAÿYÿYÿbÿbÿdÿdÿ.ÿ.ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ\ÿ\ÿ~ÿ~ÿ‰ÿ‰ÿ‰ÿ‰ÿ„ÿ„ÿ~ÿ~ÿvÿvÿoÿoÿhÿhÿOÿOÿBÿBÿ<ÿ<ÿ8ÿ8ÿ†þ†þ?þ?þ-þ-þÿÿ++ÓþÓþ<þ<þ¢¢øÿøÿlÿlÿ¼þ¼þÍþÍþüübþbþûýûý……²þ²þ­þ­þ+þ+þ¯þ¯þÞÿÞÿûû4ÿ4ÿccoýoý]ÿ]ÿÿÿJÿJÿÔÿÔÿqýqýqÿqÿúú¼þ¼þBÿBÿüÿüÿSþSþJJqýqýŽÿŽÿwýwýcþcþøø*þ*þssåþåþOOÂÿÂÿÒÿÒÿþþsýsýÀþÀþ°ÿ°ÿŽÿŽÿxÿxÿ\\|ÿ|ÿÿÿâþâþ•þ•þ|þ|þ{þ{þ…þ…þéþéþÿÿ3ÿ3ÿ>ÿ>ÿCÿCÿDÿDÿ\ÿ\ÿdÿdÿeÿeÿdÿdÿ`ÿ`ÿ\ÿ\ÿXÿXÿTÿTÿPÿPÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ‘ÿ‘ÿÁÿÁÿ¨ÿ¨ÿ—ÿ—ÿÚþÚþ‰þ‰þ¤¤1ÿ1ÿII þ þ þ þ ÿ ÿ°þ°þåååÿåÿ8ÿ8ÿùýùý|ÿ|ÿLLyýyý-ÿ-ÿÿÿWÿWÿÇþÇþ•ý•ýðð{ý{ýðð{ý{ýºº&&öþöþ{ý{ý ëýëývÿvÿ:þ:þïï†ÿ†ÿõÿõÿNþNþ×þ×þhÿhÿ}ý}ýuÿuÿ]þ]þšþšþ$ÿ$ÿ·ÿ·ÿôÿôÿÿÿoÿoÿ<ÿ<ÿ%ÿ%ÿÿÿõÿõÿKKccûþûþZþZþþþþþÿÿoÿoÿžÿžÿ®ÿ®ÿ®ÿ®ÿ¨ÿ¨ÿDÿDÿÿÿÿÿþþþþþþþþÿÿÿÿ ÿ ÿÿÿSÿSÿoÿoÿzÿzÿzÿzÿÿÿðþðþáþáþoÿoÿ¬ÿ¬ÿµþµþKþKþéébþbþ"þ"þÌÌùþùþíÿíÿñþñþ ÿ ÿMþMþØØƒýƒý¡¡ÓÿÓÿhÿhÿæÿæÿƒýƒý\ÿ\ÿÿÿþþ‡þ‡þƒƒƒýƒýææÕÿÕÿAþAþ<þ<þÈÿÈÿDDÿÿþþ<þ<þ?þ?þ¯ÿ¯ÿßþßþÿÿÏþÏþóÿóÿ€€ää¶ÿ¶ÿ‡ý‡ý¾þ¾þyþyþfþfþÿÿ`ÿ`ÿfÿfÿfÿfÿŠÿŠÿ•ÿ•ÿ”ÿ”ÿ¤ÿ¤ÿ¤ÿ¤ÿŸÿŸÿ–ÿ–ÿ:ÿ:ÿÿÿÿþÿþúþúþüþüþÿÿ ÿ ÿ1ÿ1ÿ7ÿ7ÿ;ÿ;ÿ<ÿ<ÿ=ÿ=ÿ<ÿ<ÿ<ÿ<ÿ;ÿ;ÿ5ÿ5ÿ2ÿ2ÿ0ÿ0ÿ0ÿ0ÿ1ÿ1ÿjþjþþþþþ°ÿ°ÿhh¬þ¬þéýéýIÿIÿÿÿEEðÿðÿ ßßùýùý‹ý‹ýÞÞrþrþ¯¯sþsþ£ÿ£ÿýýËýËý×þ×þÝÝ¡ý¡ý¦¦ þ þÜÜêþêþ.þ.þ­ÿ­ÿ’þ’þ"þ"þmÿmÿÜÜöþöþsÿsÿÈÿÈÿýý––ýýßýßýÛÛ½ý½ý©ÿ©ÿÛÛÅýÅý++~ÿ~ÿùýùýÒÿÒÿŸŸuþuþ‘ý‘ý”ÿ”ÿ}} ÿ ÿþþCþCþ½þ½þûþûþÿÿ,ÿ,ÿEÿEÿPÿPÿSÿSÿSÿSÿQÿQÿVÿVÿVÿVÿUÿUÿQÿQÿOÿOÿLÿLÿIÿIÿGÿGÿ`ÿ`ÿiÿiÿjÿjÿhÿhÿdÿdÿ_ÿ_ÿ‚ÿ‚ÿŽÿŽÿŽÿŽÿ‰ÿ‰ÿ®þ®þSþSþ`ÿ`ÿØÿØÿÝÿÝÿÕÿÕÿ•ý•ýQQ•ý•ýSþSþ•ÿ•ÿ1ÿ1ÿ®®ýý ‘ÿ‘ÿ¯¯þþßþßþJþJþ&&ÿÿ"þ"þÝþÝþÔÔÿÿ¿ÿ¿ÿ§§þþ°ÿ°ÿCC­þ­þˆÿˆÿ™ý™ý¬ÿ¬ÿ1ÿ1ÿêÿêÿLÿLÿ"þ"þ·þ·þ11™ý™ý½ÿ½ÿ,ÿ,ÿœœTþTþÒÿÒÿ6þ6þ$ÿ$ÿ’ÿ’ÿ«þ«þIþIþ¡ÿ¡ÿ66SÿSÿéþéþ½þ½þÿÿMÿMÿ`ÿ`ÿgÿgÿ„ÿ„ÿŒÿŒÿ‹ÿ‹ÿ†ÿ†ÿ~ÿ~ÿwÿwÿ$ÿ$ÿþþþþñþñþïþïþòþòþ÷þ÷þþþþþÿÿ ÿ ÿÿÿyÿyÿ¥ÿ¥ÿ³ÿ³ÿ²ÿ²ÿFÿFÿÿÿÿÿÄþÄþ¯þ¯þ þ þ£þ£þÖÿÖÿÌÌ‘ÿ‘ÿŸýŸý––‡‡`ÿ`ÿ†ÿ†ÿŸýŸýŒÿŒÿêÿêÿŸýŸý˜þ˜þËËŸýŸýÛþÛþ‚ÿ‚ÿÜþÜþÊÊÕÿÕÿñþñþ‚ÿ‚ÿþþºº¡ý¡ýÉÉßþßþ¡ý¡ý³ý³ýÉÉCþCþŸŸ«ý«ýšþšþhhÃþÃþœœ£ý£ý6þ6þ}þ}þÿÿÈÈùÿùÿ ÿ ÿyþyþAþAþ ÿ ÿˆÿˆÿµÿµÿÂÿÂÿ¿ÿ¿ÿ7ÿ7ÿöþöþÞþÞþØþØþJÿJÿ~ÿ~ÿ‘ÿ‘ÿ•ÿ•ÿ‘ÿ‘ÿÿÿÝþÝþÊþÊþÇþÇþÍþÍþÔþÔþßþßþèþèþ^ÿ^ÿ’ÿ’ÿ¥ÿ¥ÿ¨ÿ¨ÿ£ÿ£ÿ›ÿ›ÿÿÿ…ÿ…ÿ{ÿ{ÿÿÿíþíþÜþÜþ¬þ¬þþþHÿHÿ—ÿ—ÿ§ý§ýÖþÖþÿÿÿÿpÿpÿ##0ÿ0ÿ§ý§ýåÿåÿkk*ÿ*ÿõýõý7ÿ7ÿ™þ™þ[[©ý©ý‘þ‘þùþùþÂÂþþ©ý©ý=þ=þeÿeÿÁÁeÿeÿtÿtÿ©ý©ý*þ*þººhÿhÿLþLþgÿgÿ·þ·þ£þ£þÀÀ{ÿ{ÿ­þ­þêÿêÿUÿUÿÌÿÌÿsÿsÿ+þ+þÏþÏþ!ÿ!ÿ°þ°þƒþƒþ4ÿ4ÿ‡ÿ‡ÿpÿpÿbÿbÿYÿYÿwÿwÿoÿoÿmÿmÿkÿkÿ•ÿ•ÿ§ÿ§ÿ«ÿ«ÿªÿªÿ¦ÿ¦ÿ¢ÿ¢ÿdÿdÿGÿGÿ<ÿ<ÿ9ÿ9ÿ;ÿ;ÿ?ÿ?ÿCÿCÿGÿGÿKÿKÿOÿOÿ|ÿ|ÿ‘ÿ‘ÿ™ÿ™ÿ™ÿ™ÿdÿdÿKÿKÿAÿAÿ=ÿ=ÿ>ÿ>ÿ…ÿ…ÿ¤ÿ¤ÿ™þ™þoÿoÿTÿTÿ¥ÿ¥ÿvÿvÿNþNþ ‹þ‹þÿÿüÿüÿÙþÙþ¢ÿ¢ÿ¤ÿ¤ÿ¤ÿ¤ÿNþNþhhÿÿ‡‡˜ÿ˜ÿMÿMÿjþjþlþlþÖÿÖÿûþûþ´ÿ´ÿÐÿÐÿFFÿÿÄÿÄÿQþQþµÿµÿMÿMÿøþøþãþãþ[ÿ[ÿCCHÿHÿõþõþÉÿÉÿ%%äþäþVþVþçþçþ2ÿ2ÿ–ÿ–ÿÃÿÃÿÓÿÓÿ·ÿ·ÿ¦ÿ¦ÿ›ÿ›ÿ“ÿ“ÿqÿqÿbÿbÿ[ÿ[ÿXÿXÿXÿXÿ[ÿ[ÿ]ÿ]ÿ_ÿ_ÿaÿaÿbÿbÿcÿcÿdÿdÿfÿfÿhÿhÿjÿjÿjÿjÿkÿkÿkÿkÿkÿkÿ8ÿ8ÿ#ÿ#ÿÿÿŽÿŽÿÂÿÂÿÕÿÕÿHÿHÿÿÿîÿîÿPPÿÿ_ÿ_ÿ¤þ¤þˆÿˆÿÓÿÓÿpþpþOODDUþUþ&ÿ&ÿÿÿff‰ÿ‰ÿÃÿÃÿrÿrÿþþþþ³þ³þ’þ’þŽþŽþww¢ÿ¢ÿíþíþ­þ­þ€€ÄþÄþ›ÿ›ÿ þ þÜÿÜÿ55•ÿ•ÿŸþŸþÙþÙþ\ÿ\ÿªÿªÿáÿáÿ ÿ ÿJÿJÿ`ÿ`ÿÿÿÅÿÅÿÜÿÜÿÀÿÀÿÝþÝþ{þ{þ‚ÿ‚ÿüÿüÿ ÿ ÿrÿrÿ]ÿ]ÿJÿJÿCÿCÿBÿBÿDÿDÿ>ÿ>ÿ>ÿ>ÿAÿAÿDÿDÿHÿHÿLÿLÿ|ÿ|ÿ’ÿ’ÿ›ÿ›ÿœÿœÿšÿšÿ–ÿ–ÿ’ÿ’ÿŽÿŽÿŠÿŠÿ‡ÿ‡ÿ¢ÿ¢ÿ«ÿ«ÿ­ÿ­ÿªÿªÿ}ÿ}ÿiÿiÿ_ÿ_ÿ$ÿ$ÿÿÿbþbþZþZþcÿcÿ“ÿ“ÿ||ÕÿÕÿ“þ“þ¿þ¿þÿÿ·ÿ·ÿ!!¿ÿ¿ÿ™ÿ™ÿþþKKÆÿÆÿÎþÎþÑÿÑÿ4ÿ4ÿdÿdÿüþüþÖþÖþüÿüÿ55\þ\þÿÿyÿyÿddsÿsÿÌþÌþ88¼þ¼þ!!fÿfÿ ]þ]þÜþÜþâÿâÿyy‚ÿ‚ÿòÿòÿqþqþ]þ]þÜÿÜÿÿÿªÿªÿ¸ÿ¸ÿºÿºÿoÿoÿMÿMÿ4ÿ4ÿ*ÿ*ÿÿÿÿÿ"ÿ"ÿ›ÿ›ÿÑÿÑÿæÿæÿèÿèÿlÿlÿ2ÿ2ÿÿÿÿÿÿÿÿÿ~ÿ~ÿ¬ÿ¬ÿ½ÿ½ÿÂÿÂÿ¾ÿ¾ÿ¸ÿ¸ÿ²ÿ²ÿ«ÿ«ÿ¤ÿ¤ÿ_ÿ_ÿ@ÿ@ÿ4ÿ4ÿ1ÿ1ÿ3ÿ3ÿæþæþÉþÉþÄþÄþ«ÿ«ÿ''''~ÿ~ÿ-ÿ-ÿaþaþ55ÓþÓþcÿcÿÜþÜþ6ÿ6ÿÝþÝþkÿkÿÿÿÿÿttÿÿJÿJÿ+ÿ+ÿƒÿƒÿ»ÿ»ÿ<<ÿÿsscþcþkþkþ7ÿ7ÿss¿ÿ¿ÿ//ÿÿVÿVÿÃþÃþÎþÎþcþcþ6ÿ6ÿooÁþÁþNÿNÿ%%ßÿßÿÿÿrrdþdþrÿrÿüþüþËþËþæÿæÿbb«ÿ«ÿQÿQÿ(ÿ(ÿ$ÿ$ÿ'ÿ'ÿ+ÿ+ÿ®ÿ®ÿçÿçÿûÿûÿüÿüÿÿÿXÿXÿ@ÿ@ÿ7ÿ7ÿ6ÿ6ÿ8ÿ8ÿ.ÿ.ÿ-ÿ-ÿ0ÿ0ÿ5ÿ5ÿ:ÿ:ÿ?ÿ?ÿDÿDÿHÿHÿMÿMÿ”ÿ”ÿ²ÿ²ÿ¼ÿ¼ÿ½ÿ½ÿÿÿbÿbÿTÿTÿäÿäÿQÿQÿñþñþâÿâÿÿÿgþgþÑþÑþ\\ÚþÚþ€ÿ€ÿ«þ«þ‚ÿ‚ÿnnuÿuÿ¼ÿ¼ÿhþhþjÿjÿ©ÿ©ÿnnþþÿÿƒÿƒÿ77ÿÿ•þ•þmmzÿzÿFÿFÿiþiþÿÿll))jþjþÀþÀþll++´þ´þùþùþ<ÿ<ÿiiëÿëÿÎþÎþ™ÿ™ÿMÿMÿ_ÿ_ÿ§ÿ§ÿŸþŸþÿÿXÿXÿøþøþÒþÒþÿÿBÿBÿ¾ÿ¾ÿôÿôÿ€ÿ€ÿ@ÿ@ÿ%ÿ%ÿÿÿ“ÿ“ÿÈÿÈÿÜÿÜÿßÿßÿÚÿÚÿÒÿÒÿ‹ÿ‹ÿiÿiÿXÿXÿRÿRÿPÿPÿQÿQÿSÿSÿUÿUÿXÿXÿ<ÿ<ÿ1ÿ1ÿ/ÿ/ÿ2ÿ2ÿ6ÿ6ÿ(ÿ(ÿ&ÿ&ÿ(ÿ(ÿWÿWÿmÿmÿhh™ÿ™ÿ5ÿ5ÿ..nþnþiÿiÿÞþÞþPPßþßþ!ÿ!ÿ*ÿ*ÿÿÿ11ºÿºÿÿÿíÿíÿãþãþ@@½þ½þgg1ÿ1ÿ;ÿ;ÿÿÿ oþoþúþúþRÿRÿgg¹þ¹þffÀþÀþÊÿÊÿyÿyÿŸþŸþ;;áþáþªþªþÚþÚþee..ŠþŠþqÿqÿ¹ÿ¹ÿqþqþKÿKÿOÿOÿRÿRÿVV ÿ ÿ’þ’þ3ÿ3ÿÿÿ¤ÿ¤ÿÿÿ–ÿ–ÿ‘ÿ‘ÿÿÿYÿYÿBÿBÿ:ÿ:ÿ9ÿ9ÿ;ÿ;ÿ}ÿ}ÿ›ÿ›ÿ§ÿ§ÿ©ÿ©ÿ¦ÿ¦ÿ¢ÿ¢ÿÿÿ˜ÿ˜ÿXÿXÿ:ÿ:ÿ/ÿ/ÿ.ÿ.ÿ0ÿ0ÿ5ÿ5ÿCÿCÿMÿMÿRÿRÿWÿWÿ¬ÿ¬ÿÑÿÑÿ55\ÿ\ÿöþöþÒÿÒÿLÿLÿ±ÿ±ÿfÿfÿnÿnÿuþuþ$$uþuþÉþÉþƒÿƒÿØþØþaaoÿoÿ©ÿ©ÿ//uþuþ·ÿ·ÿ^^uþuþ__ÕþÕþÊþÊþ``óþóþ©þ©þýþýþjÿjÿ…ÿ…ÿ``´þ´þEEKÿKÿ``vþvþªþªþEEÿÿ__†ÿ†ÿwþwþÇþÇþ__yþyþ_ÿ_ÿÊÿÊÿêÿêÿóÿóÿ|ÿ|ÿDÿDÿ]ÿ]ÿjÿjÿoÿoÿÿÿÝþÝþÒþÒþÕþÕþuÿuÿÀÿÀÿßÿßÿçÿçÿãÿãÿÛÿÛÿ¡ÿ¡ÿ‚ÿ‚ÿsÿsÿkÿkÿhÿhÿgÿgÿfÿfÿgÿgÿgÿgÿÿÿÖþÖþËþËþÏþÏþÙþÙþÇÿÇÿ00WWYÿYÿãþãþ.ÿ.ÿUÿUÿ==êþêþÆþÆþ\\3ÿ3ÿÚÿÚÿýþýþ‘þ‘þÿÿžÿžÿ=ÿ=ÿ[[þþII|þ|þ[[,ÿ,ÿ$$|þ|þŸÿŸÿNÿNÿÎþÎþZZjÿjÿÌÿÌÿžþžþÿÿZZÒÿÒÿçþçþæþæþgÿgÿ}þ}þYY¡ÿ¡ÿ¢ÿ¢ÿÊþÊþ}þ}þñþñþ°ÿ°ÿØÿØÿÕÿÕÿGÿGÿÿÿ{ÿ{ÿ°ÿ°ÿ²ÿ²ÿ¯ÿ¯ÿ†ÿ†ÿqÿqÿgÿgÿ-ÿ-ÿÿÿÿÿÿÿFÿFÿbÿbÿnÿnÿuÿuÿwÿwÿÿÿ™ÿ™ÿ›ÿ›ÿ™ÿ™ÿ–ÿ–ÿ’ÿ’ÿŽÿŽÿŠÿŠÿ`ÿ`ÿMÿMÿEÿEÿDÿDÿFÿFÿHÿHÿ‘ÿ‘ÿ±ÿ±ÿ¼ÿ¼ÿ½ÿ½ÿVÿVÿ'ÿ'ÿwÿwÿœÿœÿ`ÿ`ÿDÿDÿVV ÿ ÿ€þ€þ]ÿ]ÿ“ÿ“ÿßþßþ¿ÿ¿ÿ&ÿ&ÿÀÿÀÿòþòþ¼þ¼þÿÿ ÿ ÿ,ÿ,ÿãÿãÿËþËþUU„ÿ„ÿêÿêÿ2ÿ2ÿJÿJÿÓÿÓÿ+ÿ+ÿêþêþtÿtÿxÿxÿ*ÿ*ÿSSƒþƒþþþSSÈÿÈÿƒþƒþ´ÿ´ÿYÿYÿÿþÿþÿÿ¡ÿ¡ÿûÿûÿÂþÂþNÿNÿ‚ÿ‚ÿ™ÿ™ÿHÿHÿ%ÿ%ÿ°ÿ°ÿíÿíÿÑÿÑÿ¿ÿ¿ÿ²ÿ²ÿCÿCÿÿÿþþþþüþüþ7ÿ7ÿVÿVÿfÿfÿmÿmÿpÿpÿrÿrÿƒÿƒÿ‰ÿ‰ÿ‹ÿ‹ÿŠÿŠÿ‡ÿ‡ÿ…ÿ…ÿƒÿƒÿ€ÿ€ÿ}ÿ}ÿ|ÿ|ÿrÿrÿmÿmÿkÿkÿjÿjÿVÿVÿNÿNÿMÿMÿ½þ½þ†þ†þ[ÿ[ÿÀÿÀÿzÿzÿ‚ÿ‚ÿfÿfÿ”ÿ”ÿ@ÿ@ÿGG§þ§þ~ÿ~ÿÿÿJJ##‡þ‡þõþõþîÿîÿ<ÿ<ÿOO³ÿ³ÿˆþˆþ%%ÐÿÐÿÑÿÑÿQÿQÿˆþˆþNN,ÿ,ÿ¹ÿ¹ÿuÿuÿˆþˆþÇÿÇÿÉÿÉÿˆþˆþ¥ÿ¥ÿäÿäÿÒþÒþÿÿÎÿÎÿIÿIÿÖÿÖÿ’ÿ’ÿÊþÊþ˜ÿ˜ÿ¶þ¶þøÿøÿ öþöþŠþŠþ¨ÿ¨ÿ//©ÿ©ÿfÿfÿFÿFÿÿÿüþüþùþùþþþþþ‹ÿ‹ÿËÿËÿäÿäÿéÿéÿäÿäÿ”ÿ”ÿkÿkÿYÿYÿQÿQÿOÿOÿOÿOÿQÿQÿTÿTÿvÿvÿ†ÿ†ÿ‹ÿ‹ÿŒÿŒÿ‹ÿ‹ÿ‰ÿ‰ÿ/ÿ/ÿÿÿüþüþýþýþÿÿ ÿ ÿ]ÿ]ÿ„ÿ„ÿÂÿÂÿÚÿÚÿøÿøÿîÿîÿþþÝÿÝÿ2ÿ2ÿàþàþqÿqÿ’ÿ’ÿEEëþëþÈÿÈÿ"ÿ"ÿIIŽþŽþ#ÿ#ÿHHŽþŽþ þþ¨þ¨þ@ÿ@ÿ%%HHŽþŽþçþçþ //©ÿ©ÿMÿMÿwÿwÿ–þ–þ§þ§þfÿfÿØÿØÿ))áþáþèÿèÿ¬þ¬þŽÿŽÿ:::ÿ:ÿÿÿÿþÿþ¼þ¼þTÿTÿœÿœÿDÿDÿÿÿ‚ÿ‚ÿ±ÿ±ÿÂÿÂÿ·ÿ·ÿ­ÿ­ÿ¤ÿ¤ÿžÿžÿfÿfÿLÿLÿBÿBÿ?ÿ?ÿ@ÿ@ÿCÿCÿdÿdÿtÿtÿ{ÿ{ÿ}ÿ}ÿ}ÿ}ÿ|ÿ|ÿ{ÿ{ÿyÿyÿxÿxÿwÿwÿÿÿ‚ÿ‚ÿ‚ÿ‚ÿÿÿvÿvÿqÿqÿnÿnÿ þ þ’þ’þ{ÿ{ÿÊþÊþ((IÿIÿŸþŸþBÿBÿ00úÿúÿ‡ÿ‡ÿÿÿ’þ’þÊÿÊÿ’þ’þ“ÿ“ÿêþêþCC³þ³þ11))“þ“þÿÿCC“þ“þùÿùÿÜþÜþCCåÿåÿ“þ“þYÿYÿ”þ”þÿÿþþþþBBÿÿÅþÅþìÿìÿóþóþ ÿ ÿAAöþöþÿÿúÿúÿLÿLÿüþüþ‹ÿ‹ÿÌÿÌÿ±ÿ±ÿ¡ÿ¡ÿÿÿçþçþÔþÔþ.ÿ.ÿ\ÿ\ÿqÿqÿ{ÿ{ÿ²ÿ²ÿÈÿÈÿÍÿÍÿÊÿÊÿÃÿÃÿyÿyÿVÿVÿŠÿŠÿ†ÿ†ÿ†ÿ†ÿˆÿˆÿŠÿŠÿŒÿŒÿ›ÿ›ÿ¢ÿ¢ÿ¥ÿ¥ÿ¦ÿ¦ÿ§ÿ§ÿ¦ÿ¦ÿ¬ÿ¬ÿ­ÿ­ÿ­ÿ­ÿˆÿˆÿxÿxÿsÿsÿ((ÑÿÑÿ—ÿ—ÿÿÿåÿåÿ|ÿ|ÿ÷ÿ÷ÿÿÿ''>ÿ>ÿÉÿÉÿŸÿŸÿŠÿŠÿÿÿrÿrÿ³ÿ³ÿ—ÿ—ÿ''9ÿ9ÿZÿZÿÔÿÔÿ¾ÿ¾ÿmÿmÿóÿóÿ£ÿ£ÿŸÿŸÿÓÿÓÿ~ÿ~ÿdÿdÿýÿýÿ¦ÿ¦ÿÈÿÈÿÎÿÎÿÿÿïÿïÿÿÿ&&ÿÿØÿØÿBÿBÿãÿãÿ£ÿ£ÿQÿQÿ¹ÿ¹ÿèÿèÿÓÿÓÿÇÿÇÿvÿvÿRÿRÿ„ÿ„ÿÿÿ©ÿ©ÿ¦ÿ¦ÿ¤ÿ¤ÿ£ÿ£ÿ£ÿ£ÿ‡ÿ‡ÿ|ÿ|ÿxÿxÿyÿyÿ|ÿ|ÿÿÿ ÿ ÿ®ÿ®ÿµÿµÿ·ÿ·ÿ¶ÿ¶ÿµÿµÿ³ÿ³ÿ²ÿ²ÿ°ÿ°ÿ®ÿ®ÿÐÿÐÿÝÿÝÿàÿàÿÞÿÞÿ¦ÿ¦ÿ‹ÿ‹ÿ€ÿ€ÿµÿµÿÍÿÍÿÿÿ`ÿ`ÿBÿBÿÎÿÎÿ¡ÿ¡ÿÙÿÙÿpÿpÿxÿxÿÿÿ”ÿ”ÿ?ÿ?ÿ3ÿ3ÿàÿàÿdÿdÿæÿæÿœÿœÿºÿºÿ—ÿ—ÿSÿSÿËÿËÿ§ÿ§ÿ##mÿmÿ2ÿ2ÿyÿyÿ##<ÿ<ÿÓÿÓÿÿÿIÿIÿìÿìÿ""YÿYÿúÿúÿ»ÿ»ÿZÿZÿ±ÿ±ÿzÿzÿ€ÿ€ÿÿÿ§ÿ§ÿÿÿæÿæÿÿÿzÿzÿ¼ÿ¼ÿÙÿÙÿ£ÿ£ÿŠÿŠÿ½ÿ½ÿÓÿÓÿÛÿÛÿ’ÿ’ÿqÿqÿdÿdÿbÿbÿ…ÿ…ÿ—ÿ—ÿ ÿ ÿ¤ÿ¤ÿ¦ÿ¦ÿ¦ÿ¦ÿ¿ÿ¿ÿÈÿÈÿËÿËÿÉÿÉÿÇÿÇÿÃÿÃÿÀÿÀÿ½ÿ½ÿºÿºÿªÿªÿ¢ÿ¢ÿŸÿŸÿÿÿÿÿ[ÿ[ÿAÿAÿ9ÿ9ÿ¤ÿ¤ÿÖÿÖÿÐÿÐÿÊÿÊÿºÿºÿ±ÿ±ÿFÿFÿ˜ÿ˜ÿ!ÿ!ÿ¸ÿ¸ÿµÿµÿ¥ÿ¥ÿ ¾ÿ¾ÿ†ÿ†ÿ!ÿ!ÿàÿàÿ !ÿ!ÿ„ÿ„ÿŠÿŠÿãÿãÿYÿYÿ "ÿ"ÿÀÿÀÿµÿµÿ³ÿ³ÿÃÿÃÿÑÿÑÿ¶ÿ¶ÿßÿßÿ|ÿ|ÿ©ÿ©ÿ"ÿ"ÿžÿžÿ¾ÿ¾ÿ²ÿ²ÿhÿhÿëÿëÿ²ÿ²ÿ9ÿ9ÿ€ÿ€ÿ>ÿ>ÿÑÿÑÿ1ÿ1ÿdÿdÿžÿžÿ¹ÿ¹ÿòÿòÿÒÿÒÿ·ÿ·ÿ©ÿ©ÿ}ÿ}ÿkÿkÿeÿeÿ»ÿ»ÿâÿâÿñÿñÿóÿóÿµÿµÿ—ÿ—ÿŠÿŠÿ„ÿ„ÿ„ÿ„ÿ…ÿ…ÿ~ÿ~ÿ}ÿ}ÿ~ÿ~ÿÿÿ„ÿ„ÿ‡ÿ‡ÿŠÿŠÿÿÿÿÿÒÿÒÿðÿðÿùÿùÿùÿùÿ‰ÿ‰ÿUÿUÿBÿBÿ™ÿ™ÿÂÿÂÿXÿXÿíÿíÿšÿšÿ%ÿ%ÿ:ÿ:ÿ ¼ÿ¼ÿeÿeÿåÿåÿ†ÿ†ÿèÿèÿÑÿÑÿfÿfÿ‰ÿ‰ÿ%ÿ%ÿ¡ÿ¡ÿ6ÿ6ÿÏÿÏÿ•ÿ•ÿ%ÿ%ÿªÿªÿuÿuÿÐÿÐÿmÿmÿ2ÿ2ÿOÿOÿÿÿ{ÿ{ÿ|ÿ|ÿXÿXÿ½ÿ½ÿÞÿÞÿYÿYÿÛÿÛÿ¸ÿ¸ÿNÿNÿÏÿÏÿ&ÿ&ÿ‡ÿ‡ÿÕÿÕÿÕÿÕÿÓÿÓÿ_ÿ_ÿ-ÿ-ÿ¥ÿ¥ÿÝÿÝÿôÿôÿÇÿÇÿ°ÿ°ÿ¤ÿ¤ÿŸÿŸÿ“ÿ“ÿŽÿŽÿÿÿŽÿŽÿÿÿ‘ÿ‘ÿ˜ÿ˜ÿœÿœÿžÿžÿŸÿŸÿ ÿ ÿ ÿ ÿ¡ÿ¡ÿ¡ÿ¡ÿ¡ÿ¡ÿ¦ÿ¦ÿ©ÿ©ÿªÿªÿ©ÿ©ÿ©ÿ©ÿÿÿqÿqÿlÿlÿuÿuÿ}ÿ}ÿâÿâÿ ÕÿÕÿ·ÿ·ÿ¤ÿ¤ÿÅÿÅÿYÿYÿ?ÿ?ÿÌÿÌÿËÿËÿZÿZÿJÿJÿœÿœÿ[ÿ[ÿJÿJÿŒÿŒÿ ÿÿKÿKÿ„ÿ„ÿéÿéÿƒÿƒÿ©ÿ©ÿÑÿÑÿ)ÿ)ÿŽÿŽÿ¬ÿ¬ÿvÿvÿÄÿÄÿ)ÿ)ÿnÿnÿÿÿ¹ÿ¹ÿ)ÿ)ÿâÿâÿšÿšÿ_ÿ_ÿoÿoÿ¡ÿ¡ÿˆÿˆÿ€ÿ€ÿ~ÿ~ÿ¬ÿ¬ÿÁÿÁÿÕÿÕÿÜÿÜÿˆÿˆÿbÿbÿTÿTÿ¨ÿ¨ÿÏÿÏÿßÿßÿãÿãÿ™ÿ™ÿvÿvÿhÿhÿeÿeÿgÿgÿÿÿ£ÿ£ÿ¬ÿ¬ÿ°ÿ°ÿ±ÿ±ÿ±ÿ±ÿ°ÿ°ÿ®ÿ®ÿÿÿ–ÿ–ÿ“ÿ“ÿ’ÿ’ÿ“ÿ“ÿ”ÿ”ÿ¤ÿ¤ÿ«ÿ«ÿ®ÿ®ÿ¯ÿ¯ÿ°ÿ°ÿ¯ÿ¯ÿ…ÿ…ÿsÿsÿ›ÿ›ÿ®ÿ®ÿ ³ÿ³ÿ¦ÿ¦ÿ‡ÿ‡ÿóÿóÿbÿbÿ­ÿ­ÿ?ÿ?ÿZÿZÿßÿßÿžÿžÿgÿgÿ[ÿ[ÿ¤ÿ¤ÿ¸ÿ¸ÿ¯ÿ¯ÿ`ÿ`ÿhÿhÿwÿwÿäÿäÿÅÿÅÿdÿdÿ=ÿ=ÿWÿWÿ¯ÿ¯ÿƒÿƒÿ™ÿ™ÿ¡ÿ¡ÿ_ÿ_ÿËÿËÿ‹ÿ‹ÿ@ÿ@ÿ’ÿ’ÿ¡ÿ¡ÿŽÿŽÿ-ÿ-ÿjÿjÿÛÿÛÿ …ÿ…ÿGÿGÿÅÿÅÿþÿþÿÌÿÌÿ²ÿ²ÿ¥ÿ¥ÿ‡ÿ‡ÿzÿzÿwÿwÿwÿwÿŠÿŠÿ“ÿ“ÿ™ÿ™ÿœÿœÿžÿžÿŸÿŸÿ¸ÿ¸ÿÃÿÃÿÆÿÆÿÆÿÆÿÄÿÄÿÀÿÀÿ½ÿ½ÿºÿºÿ¸ÿ¸ÿŽÿŽÿ{ÿ{ÿuÿuÿtÿtÿvÿvÿ‘ÿ‘ÿžÿžÿ¤ÿ¤ÿÆÿÆÿÔÿÔÿƒÿƒÿ^ÿ^ÿÌÿÌÿ¤ÿ¤ÿ¸ÿ¸ÿ2ÿ2ÿnÿnÿòÿòÿ/ÿ/ÿ–ÿ–ÿ`ÿ`ÿIÿIÿ‚ÿ‚ÿªÿªÿ»ÿ»ÿ@ÿ@ÿñÿñÿÊÿÊÿ<ÿ<ÿ˜ÿ˜ÿhÿhÿ×ÿ×ÿRÿRÿÇÿÇÿRÿRÿÎÿÎÿ0ÿ0ÿ»ÿ»ÿŠÿŠÿ0ÿ0ÿˆÿˆÿÀÿÀÿ†ÿ†ÿ¸ÿ¸ÿbÿbÿ­ÿ­ÿ>ÿ>ÿxÿxÿŸÿŸÿzÿzÿkÿkÿÜÿÜÿ ”ÿ”ÿ[ÿ[ÿÿÿ¨ÿ¨ÿ´ÿ´ÿ¹ÿ¹ÿºÿºÿ¹ÿ¹ÿ¸ÿ¸ÿ¬ÿ¬ÿ¥ÿ¥ÿ¢ÿ¢ÿ¡ÿ¡ÿ ÿ ÿ­ÿ­ÿ²ÿ²ÿ³ÿ³ÿ³ÿ³ÿ²ÿ²ÿ±ÿ±ÿ¯ÿ¯ÿ®ÿ®ÿ€ÿ€ÿmÿmÿgÿgÿgÿgÿkÿkÿpÿpÿ¬ÿ¬ÿÇÿÇÿÒÿÒÿÔÿÔÿ–ÿ–ÿxÿxÿ–ÿ–ÿ¤ÿ¤ÿºÿºÿÂÿÂÿŽÿŽÿ³ÿ³ÿíÿíÿWÿWÿõÿõÿ´ÿ´ÿ`ÿ`ÿeÿeÿnÿnÿ“ÿ“ÿKÿKÿ´ÿ´ÿ3ÿ3ÿÊÿÊÿÏÿÏÿAÿAÿ¦ÿ¦ÿÈÿÈÿ3ÿ3ÿ«ÿ«ÿdÿdÿÑÿÑÿ3ÿ3ÿÑÿÑÿ\ÿ\ÿ3ÿ3ÿÖÿÖÿÑÿÑÿ3ÿ3ÿÏÿÏÿøÿøÿ]ÿ]ÿ¨ÿ¨ÿ–ÿ–ÿ„ÿ„ÿªÿªÿçÿçÿkÿkÿ²ÿ²ÿÒÿÒÿmÿmÿAÿAÿ™ÿ™ÿÂÿÂÿ£ÿ£ÿ•ÿ•ÿÿÿÆÿÆÿÞÿÞÿåÿåÿåÿåÿ³ÿ³ÿœÿœÿÿÿŒÿŒÿ‹ÿ‹ÿŒÿŒÿŒÿŒÿÿÿŽÿŽÿÿÿ’ÿ’ÿ”ÿ”ÿ–ÿ–ÿ—ÿ—ÿ˜ÿ˜ÿ™ÿ™ÿ»ÿ»ÿÊÿÊÿÎÿÎÿÎÿÎÿ¯ÿ¯ÿ ÿ ÿ™ÿ™ÿ‚ÿ‚ÿxÿxÿ¥ÿ¥ÿºÿºÿZÿZÿhÿhÿÿÿ MÿMÿ ÿ ÿ :ÿ:ÿ |ÿ|ÿWÿWÿÔÿÔÿ6ÿ6ÿnÿnÿÙÿÙÿªÿªÿxÿxÿ šÿšÿÙÿÙÿ6ÿ6ÿ¿ÿ¿ÿkÿkÿ “ÿ“ÿÏÿÏÿšÿšÿTÿTÿÔÿÔÿ`ÿ`ÿúÿúÿ7ÿ7ÿ 7ÿ7ÿõÿõÿòÿòÿpÿpÿ“ÿ“ÿÅÿÅÿ´ÿ´ÿvÿvÿ¼ÿ¼ÿNÿNÿkÿkÿ{ÿ{ÿ€ÿ€ÿ„ÿ„ÿîÿîÿ ¥ÿ¥ÿoÿoÿXÿXÿ¡ÿ¡ÿÄÿÄÿÒÿÒÿÖÿÖÿ¼ÿ¼ÿ®ÿ®ÿ§ÿ§ÿ£ÿ£ÿ¢ÿ¢ÿ“ÿ“ÿÿÿŒÿŒÿŒÿŒÿŽÿŽÿÿÿ‘ÿ‘ÿ“ÿ“ÿ³ÿ³ÿÁÿÁÿÆÿÆÿÆÿÆÿÄÿÄÿÁÿÁÿ†ÿ†ÿlÿlÿcÿcÿ­ÿ­ÿÏÿÏÿÝÿÝÿmÿmÿ;ÿ;ÿeÿeÿ|ÿ|ÿÆÿÆÿ³ÿ³ÿ9ÿ9ÿÈÿÈÿ­ÿ­ÿ”ÿ”ÿNÿNÿéÿéÿŒÿŒÿQÿQÿÅÿÅÿ:ÿ:ÿ»ÿ»ÿçÿçÿ9ÿ9ÿØÿØÿÿÿÐÿÐÿdÿdÿÒÿÒÿ™ÿ™ÿˆÿˆÿDÿDÿ³ÿ³ÿÉÿÉÿÆÿÆÿ:ÿ:ÿïÿïÿ¥ÿ¥ÿzÿzÿÿÿáÿáÿ:ÿ:ÿ§ÿ§ÿFÿFÿäÿäÿóÿóÿÂÿÂÿ’ÿ’ÿ}ÿ}ÿÿÿšÿšÿ{ÿ{ÿoÿoÿ†ÿ†ÿ“ÿ“ÿ™ÿ™ÿºÿºÿÈÿÈÿÌÿÌÿÌÿÌÿÊÿÊÿÇÿÇÿÃÿÃÿÀÿÀÿ¼ÿ¼ÿ¹ÿ¹ÿ“ÿ“ÿ‚ÿ‚ÿ{ÿ{ÿ{ÿ{ÿ}ÿ}ÿÿÿƒÿƒÿ†ÿ†ÿ‰ÿ‰ÿŒÿŒÿ±ÿ±ÿÂÿÂÿÈÿÈÿÉÿÉÿÿÿˆÿˆÿ€ÿ€ÿŽÿŽÿ–ÿ–ÿ¬ÿ¬ÿµÿµÿ©ÿ©ÿ®ÿ®ÿ«ÿ«ÿnÿnÿCÿCÿ³ÿ³ÿbÿbÿçÿçÿ\ÿ\ÿËÿËÿÞÿÞÿÇÿÇÿÓÿÓÿšÿšÿ¶ÿ¶ÿ<ÿ<ÿŸÿŸÿ‡ÿ‡ÿ°ÿ°ÿPÿPÿõÿõÿßÿßÿÝÿÝÿwÿwÿ=ÿ=ÿ½ÿ½ÿîÿîÿÿÿèÿèÿFÿFÿ§ÿ§ÿ–ÿ–ÿ§ÿ§ÿ=ÿ=ÿ>ÿ>ÿ®ÿ®ÿÌÿÌÿ•ÿ•ÿzÿzÿrÿrÿHÿHÿÿÿ²ÿ²ÿüÿüÿ{ÿ{ÿ>ÿ>ÿ™ÿ™ÿÈÿÈÿÜÿÜÿ¡ÿ¡ÿ†ÿ†ÿzÿzÿwÿwÿ¯ÿ¯ÿÈÿÈÿÒÿÒÿÓÿÓÿÒÿÒÿšÿšÿÿÿwÿwÿtÿtÿvÿvÿyÿyÿ}ÿ}ÿ€ÿ€ÿ·ÿ·ÿÐÿÐÿØÿØÿÙÿÙÿ×ÿ×ÿÓÿÓÿ{ÿ{ÿTÿTÿFÿFÿ›ÿ›ÿÃÿÃÿÓÿÓÿ×ÿ×ÿÖÿÖÿrÿrÿEÿEÿ¿ÿ¿ÿ¢ÿ¢ÿWÿWÿ­ÿ­ÿ°ÿ°ÿÃÿÃÿOÿOÿ®ÿ®ÿ}ÿ}ÿgÿgÿØÿØÿåÿåÿîÿîÿÈÿÈÿŽÿŽÿ\ÿ\ÿ@ÿ@ÿ°ÿ°ÿóÿóÿqÿqÿðÿðÿNÿNÿÎÿÎÿŽÿŽÿ‘ÿ‘ÿbÿbÿhÿhÿkÿkÿŠÿŠÿ}ÿ}ÿ|ÿ|ÿÛÿÛÿLÿLÿóÿóÿxÿxÿAÿAÿÙÿÙÿLÿLÿèÿèÿ{ÿ{ÿJÿJÿ‘ÿ‘ÿ³ÿ³ÿÑÿÑÿÜÿÜÿ–ÿ–ÿuÿuÿiÿiÿ©ÿ©ÿÆÿÆÿÒÿÒÿÔÿÔÿºÿºÿ¬ÿ¬ÿ¥ÿ¥ÿ¢ÿ¢ÿ ÿ ÿ ÿ ÿ˜ÿ˜ÿ–ÿ–ÿ•ÿ•ÿ•ÿ•ÿ–ÿ–ÿ—ÿ—ÿ˜ÿ˜ÿ™ÿ™ÿšÿšÿ›ÿ›ÿœÿœÿÕÿÕÿÕÿÕÿÖÿÖÿÛÿÛÿÝÿÝÿÞÿÞÿÖÿÖÿÒÿÒÿÙÿÙÿÝÿÝÿíÿíÿëÿëÿ­ÿ­ÿøÿøÿ­ÿ­ÿ­ÿ­ÿÃÿÃÿºÿºÿÁÿÁÿÜÿÜÿßÿßÿ¼ÿ¼ÿéÿéÿøÿøÿñÿñÿÉÿÉÿÐÿÐÿ­ÿ­ÿ®ÿ®ÿéÿéÿÌÿÌÿøÿøÿßÿßÿ­ÿ­ÿúÿúÿ¯ÿ¯ÿÃÿÃÿ¯ÿ¯ÿÍÿÍÿ­ÿ­ÿðÿðÿÑÿÑÿðÿðÿ·ÿ·ÿÃÿÃÿáÿáÿ÷ÿ÷ÿèÿèÿâÿâÿßÿßÿÓÿÓÿÎÿÎÿ½ÿ½ÿ¶ÿ¶ÿ×ÿ×ÿçÿçÿîÿîÿåÿåÿáÿáÿÞÿÞÿÜÿÜÿÎÿÎÿÈÿÈÿÆÿÆÿÆÿÆÿÇÿÇÿÈÿÈÿÓÿÓÿØÿØÿÚÿÚÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÚÿÚÿÚÿÚÿãÿãÿçÿçÿèÿèÿçÿçÿæÿæÿÞÿÞÿÙÿÙÿ×ÿ×ÿÊÿÊÿÄÿÄÿÚÿÚÿäÿäÿ¹ÿ¹ÿ®ÿ®ÿ¸ÿ¸ÿûÿûÿÏÿÏÿ®ÿ®ÿÈÿÈÿÐÿÐÿÒÿÒÿêÿêÿ®ÿ®ÿËÿËÿ÷ÿ÷ÿÂÿÂÿÿÿÿÿÎÿÎÿ¯ÿ¯ÿòÿòÿÑÿÑÿôÿôÿÎÿÎÿáÿáÿ¿ÿ¿ÿ¼ÿ¼ÿÔÿÔÿÍÿÍÿÝÿÝÿ×ÿ×ÿëÿëÿÍÿÍÿÌÿÌÿÿÿÿÿÃÿÃÿÿÿÿÿàÿàÿÚÿÚÿ¸ÿ¸ÿÄÿÄÿàÿàÿÛÿÛÿþÿþÿ×ÿ×ÿÅÿÅÿ×ÿ×ÿàÿàÿÓÿÓÿÍÿÍÿÓÿÓÿÖÿÖÿ×ÿ×ÿÎÿÎÿËÿËÿÉÿÉÿÎÿÎÿÑÿÑÿÒÿÒÿÓÿÓÿÝÿÝÿáÿáÿâÿâÿâÿâÿâÿâÿáÿáÿÖÿÖÿÑÿÑÿÎÿÎÿÎÿÎÿÎÿÎÿÏÿÏÿÐÿÐÿÐÿÐÿÑÿÑÿÞÿÞÿãÿãÿåÿåÿåÿåÿØÿØÿÒÿÒÿÏÿÏÿÛÿÛÿàÿàÿÛÿÛÿØÿØÿÄÿÄÿþÿþÿáÿáÿ°ÿ°ÿ¿ÿ¿ÿøÿøÿâÿâÿÔÿÔÿíÿíÿ³ÿ³ÿöÿöÿ°ÿ°ÿËÿËÿíÿíÿÍÿÍÿíÿíÿÅÿÅÿßÿßÿ¿ÿ¿ÿóÿóÿüÿüÿ°ÿ°ÿÀÿÀÿþÿþÿÐÿÐÿêÿêÿ¹ÿ¹ÿ÷ÿ÷ÿ²ÿ²ÿ¿ÿ¿ÿÕÿÕÿÑÿÑÿþÿþÿãÿãÿÃÿÃÿëÿëÿ¸ÿ¸ÿíÿíÿ·ÿ·ÿÇÿÇÿþÿþÿÐÿÐÿèÿèÿÊÿÊÿáÿáÿìÿìÿáÿáÿÛÿÛÿ¶ÿ¶ÿ°ÿ°ÿÅÿÅÿÔÿÔÿÛÿÛÿáÿáÿãÿãÿãÿãÿãÿãÿÝÿÝÿÙÿÙÿØÿØÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿÛÿÛÿÝÿÝÿÞÿÞÿÞÿÞÿÝÿÝÿÝÿÝÿÜÿÜÿÜÿÜÿÛÿÛÿÕÿÕÿÑÿÑÿÐÿÐÿÐÿÐÿÐÿÐÿÅÿÅÿÀÿÀÿ¿ÿ¿ÿÏÿÏÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿÓÿÓÿÑÿÑÿÙÿÙÿýÿýÿòÿòÿòÿòÿ±ÿ±ÿ»ÿ»ÿàÿàÿêÿêÿÙÿÙÿïÿïÿÁÿÁÿùÿùÿßÿßÿ±ÿ±ÿÅÿÅÿëÿëÿÖÿÖÿÈÿÈÿýÿýÿ³ÿ³ÿëÿëÿôÿôÿÑÿÑÿÄÿÄÿ±ÿ±ÿýÿýÿÂÿÂÿäÿäÿÚÿÚÿÕÿÕÿåÿåÿÏÿÏÿ½ÿ½ÿæÿæÿæÿæÿïÿïÿÞÿÞÿØÿØÿ´ÿ´ÿ²ÿ²ÿüÿüÿîÿîÿÚÿÚÿÑÿÑÿÆÿÆÿÂÿÂÿßÿßÿìÿìÿ×ÿ×ÿÍÿÍÿÉÿÉÿÓÿÓÿØÿØÿÚÿÚÿÛÿÛÿÚÿÚÿÙÿÙÿÙÿÙÿØÿØÿØÿØÿÒÿÒÿÏÿÏÿÎÿÎÿÎÿÎÿÏÿÏÿÐÿÐÿÐÿÐÿÑÿÑÿ×ÿ×ÿÙÿÙÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÛÿÜÿÜÿÛÿÛÿÛÿÛÿ×ÿ×ÿÕÿÕÿæÿæÿìÿìÿÕÿÕÿÊÿÊÿõÿõÿÈÿÈÿÖÿÖÿÁÿÁÿüÿüÿÉÿÉÿ¶ÿ¶ÿÚÿÚÿêÿêÿéÿéÿ¹ÿ¹ÿÚÿÚÿèÿèÿìÿìÿÈÿÈÿðÿðÿàÿàÿÆÿÆÿ³ÿ³ÿÀÿÀÿûÿûÿßÿßÿ·ÿ·ÿÓÿÓÿèÿèÿËÿËÿ¹ÿ¹ÿÉÿÉÿûÿûÿÏÿÏÿìÿìÿÉÿÉÿïÿïÿ³ÿ³ÿêÿêÿ³ÿ³ÿûÿûÿ³ÿ³ÿçÿçÿÄÿÄÿûÿûÿÓÿÓÿíÿíÿÝÿÝÿÕÿÕÿÍÿÍÿÊÿÊÿØÿØÿßÿßÿØÿØÿÕÿÕÿÔÿÔÿÌÿÌÿÉÿÉÿÈÿÈÿÈÿÈÿÏÿÏÿÒÿÒÿÔÿÔÿÕÿÕÿÖÿÖÿÖÿÖÿßÿßÿãÿãÿäÿäÿäÿäÿãÿãÿâÿâÿáÿáÿàÿàÿßÿßÿÖÿÖÿÒÿÒÿÑÿÑÿÐÿÐÿÐÿÐÿÌÿÌÿËÿËÿÌÿÌÿÞÿÞÿæÿæÿÓÿÓÿËÿËÿúÿúÿÄÿÄÿÕÿÕÿ»ÿ»ÿÔÿÔÿãÿãÿ×ÿ×ÿ÷ÿ÷ÿËÿËÿãÿãÿÌÿÌÿïÿïÿÆÿÆÿ×ÿ×ÿâÿâÿ´ÿ´ÿæÿæÿ»ÿ»ÿÕÿÕÿâÿâÿõÿõÿËÿËÿøÿøÿ´ÿ´ÿíÿíÿßÿßÿÛÿÛÿâÿâÿ¾ÿ¾ÿÜÿÜÿÅÿÅÿËÿËÿìÿìÿÙÿÙÿ´ÿ´ÿôÿôÿ¿ÿ¿ÿøÿøÿËÿËÿÊÿÊÿúÿúÿæÿæÿÓÿÓÿÉÿÉÿ»ÿ»ÿµÿµÿçÿçÿúÿúÿßÿßÿÑÿÑÿÌÿÌÿËÿËÿÊÿÊÿÑÿÑÿÔÿÔÿÖÿÖÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿÞÿÞÿáÿáÿâÿâÿâÿâÿáÿáÿàÿàÿßÿßÿÞÿÞÿÔÿÔÿÏÿÏÿÍÿÍÿÍÿÍÿÍÿÍÿÎÿÎÿßÿßÿçÿçÿêÿêÿêÿêÿÂÿÂÿµÿµÿËÿËÿØÿØÿãÿãÿèÿèÿÆÿÆÿßÿßÿíÿíÿ¼ÿ¼ÿÔÿÔÿìÿìÿÙÿÙÿ¶ÿ¶ÿíÿíÿêÿêÿµÿµÿØÿØÿõÿõÿßÿßÿÐÿÐÿµÿµÿÆÿÆÿÓÿÓÿâÿâÿôÿôÿÛÿÛÿáÿáÿíÿíÿÇÿÇÿÒÿÒÿëÿëÿáÿáÿ×ÿ×ÿÃÿÃÿÒÿÒÿµÿµÿºÿºÿÖÿÖÿïÿïÿãÿãÿÇÿÇÿÖÿÖÿîÿîÿÒÿÒÿÝÿÝÿÛÿÛÿÂÿÂÿ÷ÿ÷ÿÛÿÛÿÍÿÍÿÐÿÐÿÑÿÑÿâÿâÿéÿéÿÖÿÖÿÌÿÌÿÉÿÉÿÌÿÌÿÏÿÏÿÐÿÐÿÑÿÑÿÙÿÙÿÜÿÜÿÝÿÝÿÞÿÞÿÝÿÝÿÝÿÝÿÜÿÜÿÛÿÛÿÛÿÛÿÚÿÚÿÚÿÚÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿØÿØÿÉÿÉÿÃÿÃÿÁÿÁÿÂÿÂÿÓÿÓÿÛÿÛÿßÿßÿäÿäÿæÿæÿãÿãÿáÿáÿÉÿÉÿàÿàÿòÿòÿ¶ÿ¶ÿèÿèÿÆÿÆÿÍÿÍÿìÿìÿÌÿÌÿáÿáÿôÿôÿàÿàÿÎÿÎÿçÿçÿ¶ÿ¶ÿÒÿÒÿíÿíÿåÿåÿÏÿÏÿ¶ÿ¶ÿðÿðÿËÿËÿÒÿÒÿÐÿÐÿÐÿÐÿõÿõÿ¶ÿ¶ÿÞÿÞÿÍÿÍÿãÿãÿÍÿÍÿ÷ÿ÷ÿ·ÿ·ÿÌÿÌÿîÿîÿ÷ÿ÷ÿ»ÿ»ÿ÷ÿ÷ÿáÿáÿÊÿÊÿ½ÿ½ÿÅÿÅÿ÷ÿ÷ÿ½ÿ½ÿÝÿÝÿìÿìÿ×ÿ×ÿÍÿÍÿÚÿÚÿàÿàÿÕÿÕÿÐÿÐÿÍÿÍÿÐÿÐÿÑÿÑÿÒÿÒÿÓÿÓÿÚÿÚÿÝÿÝÿßÿßÿßÿßÿÞÿÞÿÚÿÚÿØÿØÿ×ÿ×ÿ×ÿ×ÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÖÿÑÿÑÿÏÿÏÿÎÿÎÿÎÿÎÿÏÿÏÿÐÿÐÿâÿâÿêÿêÿìÿìÿÖÿÖÿËÿËÿÇÿÇÿÊÿÊÿÌÿÌÿÕÿÕÿØÿØÿÚÿÚÿðÿðÿÞÿÞÿãÿãÿÆÿÆÿ×ÿ×ÿÒÿÒÿÞÿÞÿÛÿÛÿîÿîÿÛÿÛÿåÿåÿÑÿÑÿËÿËÿèÿèÿÄÿÄÿÇÿÇÿ¾ÿ¾ÿêÿêÿÀÿÀÿÒÿÒÿöÿöÿÂÿÂÿÎÿÎÿòÿòÿ¼ÿ¼ÿÌÿÌÿöÿöÿêÿêÿ¸ÿ¸ÿìÿìÿÕÿÕÿÞÿÞÿºÿºÿÜÿÜÿöÿöÿ×ÿ×ÿÔÿÔÿ¸ÿ¸ÿéÿéÿ¸ÿ¸ÿÉÿÉÿöÿöÿéÿéÿßÿßÿÉÿÉÿÀÿÀÿÝÿÝÿêÿêÿâÿâÿÞÿÞÿÜÿÜÿÕÿÕÿÒÿÒÿÑÿÑÿÑÿÑÿÐÿÐÿÏÿÏÿÏÿÏÿÐÿÐÿÑÿÑÿÑÿÑÿ×ÿ×ÿÚÿÚÿÛÿÛÿÜÿÜÿÛÿÛÿÛÿÛÿÛÿÛÿÚÿÚÿÚÿÚÿÚÿÚÿßÿßÿáÿáÿáÿáÿáÿáÿÖÿÖÿÑÿÑÿÏÿÏÿ¿ÿ¿ÿ¸ÿ¸ÿÞÿÞÿïÿïÿÊÿÊÿÍÿÍÿöÿöÿÈÿÈÿÓÿÓÿ¹ÿ¹ÿÚÿÚÿÉÿÉÿöÿöÿõÿõÿÖÿÖÿÌÿÌÿ¹ÿ¹ÿðÿðÿ¹ÿ¹ÿðÿðÿÀÿÀÿÃÿÃÿõÿõÿÌÿÌÿõÿõÿÃÿÃÿÅÿÅÿíÿíÿêÿêÿ¹ÿ¹ÿÕÿÕÿõÿõÿºÿºÿñÿñÿÌÿÌÿÆÿÆÿÝÿÝÿÙÿÙÿÙÿÙÿòÿòÿÒÿÒÿÚÿÚÿâÿâÿÙÿÙÿÑÿÑÿ¹ÿ¹ÿãÿãÿÓÿÓÿÕÿÕÿÕÿÕÿÏÿÏÿÌÿÌÿßÿßÿçÿçÿéÿéÿèÿèÿçÿçÿÒÿÒÿÈÿÈÿÅÿÅÿÄÿÄÿÏÿÏÿÕÿÕÿØÿØÿÙÿÙÿÚÿÚÿÙÿÙÿØÿØÿØÿØÿØÿØÿØÿØÿ×ÿ×ÿ×ÿ×ÿ×ÿ×ÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿØÿÖÿÖÿÕÿÕÿÕÿÕÿÕÿÕÿÕÿÕÿÖÿÖÿïÿïÿõÿõÿÕÿÕÿÄÿÄÿìÿìÿÂÿÂÿ¼ÿ¼ÿæÿæÿÖÿÖÿôÿôÿºÿºÿôÿôÿÊÿÊÿáÿáÿàÿàÿÄÿÄÿºÿºÿôÿôÿÉÿÉÿÍÿÍÿôÿôÿÅÿÅÿÎÿÎÿôÿôÿàÿàÿºÿºÿÖÿÖÿôÿôÿØÿØÿÞÿÞÿºÿºÿÔÿÔÿÁÿÁÿèÿèÿãÿãÿÃÿÃÿëÿëÿßÿßÿ¾ÿ¾ÿãÿãÿæÿæÿéÿéÿºÿºÿsonic-visualiser-3.0.3/server.pro0000644000000000000000000000236013111512442015165 0ustar 00000000000000 TEMPLATE = app CONFIG += stl c++11 exceptions console warn_on CONFIG -= qt exists(config.pri) { include(config.pri) } !exists(config.pri) { include(noconfig.pri) macx*: LIBS -= -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices -framework Accelerate -lbz2 -lz } # Can't support this flag with the JSON11 and basen modules as they stand QMAKE_CXXFLAGS -= -Werror # Using the "console" CONFIG flag above should ensure this happens for # normal Windows builds, but this may be necessary when cross-compiling win32-x-g++: QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle linux*: LIBS += -ldl TARGET = piper-vamp-simple-server OBJECTS_DIR = o MOC_DIR = o INCLUDEPATH += piper-cpp piper-cpp/ext vamp-plugin-sdk include(vamp-plugin-sdk-files.pri) for (file, VAMP_SOURCES) { SOURCES += $$file } for (file, VAMP_HEADERS) { HEADERS += $$file } HEADERS += \ piper-cpp/vamp-capnp/piper.capnp.h \ piper-cpp/vamp-capnp/VampnProto.h SOURCES += \ piper-cpp/vamp-capnp/piper-capnp.cpp \ piper-cpp/ext/json11/json11.cpp \ piper-cpp/vamp-server/simple-server.cpp sonic-visualiser-3.0.3/sonic-visualiser.desktop0000644000000000000000000000105713111512442020031 0ustar 00000000000000[Desktop Entry] Name=Sonic Visualiser Comment=Viewing and analysing the contents of music audio files Comment[fr]=Affichage et analyse des contenus des fichiers audio de musique Exec=sonic-visualiser %U Keywords=audio; sound; visualiser; sonic; Terminal=false Type=Application Icon=sv-icon Categories=Audio;AudioVideo; MimeType=application/x-sonicvisualiser;application/x-sonicvisualiser-layer;application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg; sonic-visualiser-3.0.3/sonic-visualiser.pro0000644000000000000000000000133613111512442017160 0ustar 00000000000000 TEMPLATE = subdirs # We build the tests on every platform, though at the time of # writing they are only automatically run on non-Windows platforms # (because of the difficulty of getting them running nicely in the # IDE without causing great confusion if a test fails). SUBDIRS += \ sub_test_svcore_base \ sub_test_svcore_data_fileio \ sub_test_svcore_data_model SUBDIRS += \ checker \ sub_server \ sub_convert \ sub_sv sub_test_svcore_base.file = test-svcore-base.pro sub_test_svcore_data_fileio.file = test-svcore-data-fileio.pro sub_test_svcore_data_model.file = test-svcore-data-model.pro sub_server.file = server.pro sub_convert.file = convert.pro sub_sv.file = sv.pro CONFIG += ordered sonic-visualiser-3.0.3/sonic-visualiser.qrc0000644000000000000000000001161013111512442017141 0ustar 00000000000000 icons/scalable/align.svg icons/scalable/colour3d.svg icons/scalable/cross.svg icons/scalable/datadelete.svg icons/scalable/dataedit.svg icons/scalable/draw.svg icons/scalable/editcopy.svg icons/scalable/editcut.svg icons/scalable/editdelete.svg icons/scalable/editpaste.svg icons/scalable/erase.svg icons/scalable/exit.svg icons/scalable/faders.svg icons/scalable/filenew.svg icons/scalable/fileopen.svg icons/scalable/filesave.svg icons/scalable/filesaveas.svg icons/scalable/filesavesv.svg icons/scalable/ffwd.svg icons/scalable/ffwd-end.svg icons/scalable/help.svg icons/scalable/instants.svg icons/scalable/measure.svg icons/scalable/move.svg icons/scalable/navigate.svg icons/scalable/normalise.svg icons/scalable/normalise-columns.svg icons/scalable/notes.svg icons/scalable/pane.svg icons/scalable/pause.svg icons/scalable/playloop.svg icons/scalable/playpause.svg icons/scalable/playselection.svg icons/scalable/playfollow.svg icons/scalable/play.svg icons/scalable/record.svg icons/scalable/redo.svg icons/scalable/regions.svg icons/scalable/rewind-start.svg icons/scalable/rewind.svg icons/scalable/select.svg icons/scalable/solo.svg icons/scalable/speaker.svg icons/scalable/spectrogram.svg icons/scalable/spectrum.svg icons/scalable/text.svg icons/scalable/timeruler.svg icons/scalable/undo.svg icons/scalable/values.svg icons/scalable/waveform.svg icons/scalable/zoom.svg icons/scalable/zoom-in.svg icons/scalable/zoom-out.svg icons/scalable/zoom-fit.svg icons/scalable/zoom-reset.svg icons/scalable/sv-icon-light.svg icons/scalable/sv-icon.svg icons/scalable/sv-splash.svg icons/scalable/sv-splash.png icons/scalable/sv-splash@2x.png icons/image.png icons/draw-curve.png icons/measure.png icons/measure1cursor.xbm icons/measure1mask.xbm icons/measure2cursor.xbm icons/measure2mask.xbm icons/new.png icons/annotation.png icons/info.png icons/datainsert.png icons/mono.png icons/stereo.png icons/sharpen.png icons/emptypage.png icons/invert-vertical.png icons/show-peaks.png icons/opaque.png icons/smooth.png icons/lines.png icons/derivative.png icons/sv-16x16.png icons/sv-22x22.png icons/sv-24x24.png icons/sv-32x32.png icons/sv-48x48.png icons/sv-64x64.png icons/sv-128x128.png icons/sv-splash.png icons/qm-logo-larger.png icons/qm-logo-smaller.png samples/bass.wav samples/beep.wav samples/bounce.wav samples/clap.wav samples/click.wav samples/cowbell.wav samples/elecpiano.wav samples/hihat.wav samples/kick.wav samples/organ.wav samples/piano.wav samples/silent.wav samples/snare.wav samples/stick.wav samples/strike.wav samples/tap.wav templates/default.svt templates/Scrolling Waveforms.svt templates/Spectrograms.svt templates/Waveform and Melodic Range Spectrogram.svt i18n/sonic-visualiser_ru.qm i18n/sonic-visualiser_en_GB.qm i18n/sonic-visualiser_en_US.qm i18n/sonic-visualiser_cs_CZ.qm i18n/tips_en.xml README README.OSC CHANGELOG COPYING CITATION sonic-visualiser-3.0.3/sv.pro0000644000000000000000000000306313111512442014310 0ustar 00000000000000 TEMPLATE = app exists(config.pri) { include(config.pri) } !exists(config.pri) { include(noconfig.pri) } include(base.pri) QT += network xml gui widgets svg TARGET = "Sonic Visualiser" linux*:TARGET = sonic-visualiser solaris*:TARGET = sonic-visualiser !win32 { QMAKE_POST_LINK += cp checker/vamp-plugin-load-checker . } linux* { sv_bins.path = /usr/local/bin/ sv_bins.files = sonic-visualiser piper-vamp-simple-server vamp-plugin-load-checker INSTALLS += sv_bins } TRANSLATIONS += \ i18n/sonic-visualiser_ru.ts \ i18n/sonic-visualiser_en_GB.ts \ i18n/sonic-visualiser_en_US.ts \ i18n/sonic-visualiser_cs_CZ.ts OBJECTS_DIR = o MOC_DIR = o ICON = icons/sv-macicon.icns RC_FILE = icons/sv.rc RESOURCES += sonic-visualiser.qrc # Mac integration QMAKE_INFO_PLIST = deploy/osx/Info.plist include(svgui/files.pri) include(svapp/files.pri) for (file, SVGUI_SOURCES) { SOURCES += $$sprintf("svgui/%1", $$file) } for (file, SVAPP_SOURCES) { SOURCES += $$sprintf("svapp/%1", $$file) } for (file, SVGUI_HEADERS) { HEADERS += $$sprintf("svgui/%1", $$file) } for (file, SVAPP_HEADERS) { HEADERS += $$sprintf("svapp/%1", $$file) } HEADERS += \ main/MainWindow.h \ main/NetworkPermissionTester.h \ main/Surveyer.h \ main/SVSplash.h \ main/PreferencesDialog.h SOURCES += \ main/main.cpp \ main/OSCHandler.cpp \ main/MainWindow.cpp \ main/NetworkPermissionTester.cpp \ main/Surveyer.cpp \ main/SVSplash.cpp \ main/PreferencesDialog.cpp sonic-visualiser-3.0.3/templates/Scrolling Waveforms.svt0000644000000000000000000000615613111512442021566 0ustar 00000000000000 sonic-visualiser-3.0.3/templates/Spectrograms.svt0000644000000000000000000000537313111512442020351 0ustar 00000000000000 sonic-visualiser-3.0.3/templates/Waveform and Melodic Range Spectrogram.svt0000644000000000000000000000340113111512442025020 0ustar 00000000000000 sonic-visualiser-3.0.3/templates/default.svt0000644000000000000000000000115213111512442017313 0ustar 00000000000000 sonic-visualiser-3.0.3/test-svcore-base.pro0000644000000000000000000000107513111512442017047 0ustar 00000000000000 TEMPLATE = app exists(config.pri) { include(config.pri) } !exists(config.pri) { include(noconfig.pri) } include(base.pri) CONFIG += console QT += network xml testlib QT -= gui win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle TARGET = test-svcore-base OBJECTS_DIR = o MOC_DIR = o include(svcore/base/test/files.pri) for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/base/test/%1", $$file) } for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/base/test/%1", $$file) } !win32* { QMAKE_POST_LINK = ./$${TARGET} } sonic-visualiser-3.0.3/test-svcore-data-fileio.pro0000644000000000000000000000113113111512442020304 0ustar 00000000000000 TEMPLATE = app exists(config.pri) { include(config.pri) } !exists(config.pri) { include(noconfig.pri) } include(base.pri) CONFIG += console QT += network xml testlib QT -= gui win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle TARGET = test-svcore-data-fileio OBJECTS_DIR = o MOC_DIR = o include(svcore/data/fileio/test/files.pri) for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/data/fileio/test/%1", $$file) } for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/data/fileio/test/%1", $$file) } !win32* { QMAKE_POST_LINK = ./$${TARGET} } sonic-visualiser-3.0.3/test-svcore-data-model.pro0000644000000000000000000000112513111512442020140 0ustar 00000000000000 TEMPLATE = app exists(config.pri) { include(config.pri) } !exists(config.pri) { include(noconfig.pri) } include(base.pri) CONFIG += console QT += network xml testlib QT -= gui win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle TARGET = test-svcore-data-model OBJECTS_DIR = o MOC_DIR = o include(svcore/data/model/test/files.pri) for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/data/model/test/%1", $$file) } for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/data/model/test/%1", $$file) } !win32* { QMAKE_POST_LINK = ./$${TARGET} } sonic-visualiser-3.0.3/vamp-plugin-sdk-files.pri0000644000000000000000000000233013111512442017764 0ustar 00000000000000 VAMP_HEADERS += \ vamp-plugin-sdk/vamp-hostsdk/PluginBase.h \ vamp-plugin-sdk/vamp-hostsdk/PluginBufferingAdapter.h \ vamp-plugin-sdk/vamp-hostsdk/PluginChannelAdapter.h \ vamp-plugin-sdk/vamp-hostsdk/Plugin.h \ vamp-plugin-sdk/vamp-hostsdk/PluginHostAdapter.h \ vamp-plugin-sdk/vamp-hostsdk/PluginInputDomainAdapter.h \ vamp-plugin-sdk/vamp-hostsdk/PluginLoader.h \ vamp-plugin-sdk/vamp-hostsdk/PluginSummarisingAdapter.h \ vamp-plugin-sdk/vamp-hostsdk/PluginWrapper.h \ vamp-plugin-sdk/vamp-hostsdk/RealTime.h \ vamp-plugin-sdk/src/vamp-hostsdk/Window.h VAMP_SOURCES += \ vamp-plugin-sdk/src/vamp-hostsdk/PluginBufferingAdapter.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/PluginChannelAdapter.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/PluginHostAdapter.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/PluginLoader.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/PluginWrapper.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/RealTime.cpp \ vamp-plugin-sdk/src/vamp-hostsdk/Files.cpp sonic-visualiser-3.0.3/version.h0000644000000000000000000000003313111512442014766 0ustar 00000000000000#define SV_VERSION "3.0.3" sonic-visualiser-3.0.3/version.h.in0000644000000000000000000000004713111512442015400 0ustar 00000000000000#define SV_VERSION "@PACKAGE_VERSION@" sonic-visualiser-3.0.3/x-sonicvisualiser-layer.desktop0000644000000000000000000000023613111512442021331 0ustar 00000000000000[Desktop Entry] Command=Sonic Visualiser layer file Hidden=false MimeType=application/x-sonicvisualiser-layer Patterns=*.svl;*.SVL Icon=sv-icon Type=MimeType sonic-visualiser-3.0.3/x-sonicvisualiser.desktop0000644000000000000000000000023013111512442020211 0ustar 00000000000000[Desktop Entry] Command=Sonic Visualiser session file Hidden=false MimeType=application/x-sonicvisualiser Patterns=*.sv;*.SV Icon=sv-icon Type=MimeType sonic-visualiser-3.0.3/bqaudioio/.hgtags0000644000000000000000000000157213111512442016373 0ustar 0000000000000026e8883683779eb2aaf4b3f98b6574e754c4f826 rbap_1.8_osx 26e8883683779eb2aaf4b3f98b6574e754c4f826 rbap_1.8_osx_appstore 5ad669796ee17e0ac7836039c2b3ab9ea89cf688 rbap_1.9_osx_appstore 5ad669796ee17e0ac7836039c2b3ab9ea89cf688 rbap_1.9_osx_appstore_rej 5ad669796ee17e0ac7836039c2b3ab9ea89cf688 rbap_1.9_win32 a52873c49ca2239ce1875ead591c116358d14568 rbap_1.8.1_win32 a52873c49ca2239ce1875ead591c116358d14568 rbap_1.8.5_win32 a52873c49ca2239ce1875ead591c116358d14568 rbap_1.8_win32_appup_0 a52873c49ca2239ce1875ead591c116358d14568 rbap_1.8_win32_appup_1 b420ea176a0626f9c2e0e8c31e9bff907a7fc18e rbap_1.7_osx b420ea176a0626f9c2e0e8c31e9bff907a7fc18e rubberband_v1.6 b420ea176a0626f9c2e0e8c31e9bff907a7fc18e rubberband_v1.7 b5d02dc025711f01dfa04bdf713dc2eaf4ac0d60 rbap_1.2.1_osx b5d02dc025711f01dfa04bdf713dc2eaf4ac0d60 rbap_1.2.1_osx_appstore b5d02dc025711f01dfa04bdf713dc2eaf4ac0d60 rbap_1.2_osx sonic-visualiser-3.0.3/bqaudioio/COPYING0000644000000000000000000000252713111512442016151 0ustar 00000000000000 Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/bqaudioio/Makefile0000644000000000000000000000254313111512442016554 0ustar 00000000000000 SOURCES := $(wildcard src/*.cpp) HEADERS := $(wildcard src/*.h) $(wildcard bqaudioio/*.h) OBJECTS := $(patsubst %.cpp,%.o,$(SOURCES)) LIBRARY := libbqaudioio.a CXXFLAGS := -std=c++11 -I. -I./bqaudioio -I../bqvec -I../bqresample -DHAVE_JACK -DHAVE_LIBPULSE -DHAVE_PORTAUDIO all: $(LIBRARY) $(LIBRARY): $(OBJECTS) ar cr $@ $^ clean: rm -f $(OBJECTS) distclean: clean rm -f $(LIBRARY) depend: makedepend -Y -fMakefile -I./bqaudioio $(SOURCES) $(HEADERS) # DO NOT DELETE src/SystemRecordSource.o: ./bqaudioio/SystemRecordSource.h src/SystemRecordSource.o: ./bqaudioio/Suspendable.h src/SystemRecordSource.o: ./bqaudioio/ApplicationRecordTarget.h src/AudioFactory.o: ./bqaudioio/AudioFactory.h src/JACKAudioIO.h src/AudioFactory.o: src/PortAudioIO.h src/PulseAudioIO.h src/SystemPlaybackTarget.o: ./bqaudioio/SystemPlaybackTarget.h src/SystemPlaybackTarget.o: ./bqaudioio/Suspendable.h src/ResamplerWrapper.o: ./bqaudioio/ResamplerWrapper.h src/ResamplerWrapper.o: ./bqaudioio/ApplicationPlaybackSource.h bqaudioio/SystemPlaybackTarget.o: ./bqaudioio/Suspendable.h bqaudioio/ResamplerWrapper.o: ./bqaudioio/ApplicationPlaybackSource.h bqaudioio/SystemAudioIO.o: ./bqaudioio/SystemRecordSource.h bqaudioio/SystemAudioIO.o: ./bqaudioio/Suspendable.h bqaudioio/SystemAudioIO.o: ./bqaudioio/SystemPlaybackTarget.h bqaudioio/SystemRecordSource.o: ./bqaudioio/Suspendable.h sonic-visualiser-3.0.3/bqaudioio/README0000644000000000000000000000037013111512442015770 0ustar 00000000000000 bqaudioio ========= A small library wrapping various audio record / playback APIs in C++. C++ standard required: C++11 Copyright 2007-2017 Particular Programs Ltd. Under a permissive BSD/MIT-style licence: see the file COPYING for details. sonic-visualiser-3.0.3/bqaudioio/bqaudioio/ApplicationPlaybackSource.h0000644000000000000000000001301713111512442024332 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_APPLICATION_PLAYBACK_SOURCE_H #define BQAUDIOIO_APPLICATION_PLAYBACK_SOURCE_H #include namespace breakfastquay { class SystemPlaybackTarget; /** * Interface for a source of playback samples from the application. To * be implemented in the application and passed to * AudioFactory::createCallbackPlayTarget or createAudioIO. */ class ApplicationPlaybackSource { public: virtual ~ApplicationPlaybackSource() { } /** * Return an identifier for the application client. May be used in * connection strings or (possibly) error and logging information. */ virtual std::string getClientName() const = 0; /** * Return the sample rate at which the application runs. The * target or IO will attempt to open its device at the rate * returned by this call at the point where the device is opened, * although it might not succeed; it will provide the actual rate * through a subsequent call to setSystemPlaybackSampleRate. * * Return 0 if the application has no central sample rate of its * own and is happy to accept the default rate of the device. * * This should not change during the lifetime of the target or * IO. If you want to handle a changing source sample rate, use a * ResamplerWrapper. */ virtual int getApplicationSampleRate() const = 0; /** * Return the number of audio channels that will be delivered by * the application. The target or IO will attempt to open its * device with this number of channels, though it might not * succeed; it will provide the actual number of channels through * a subsequent call to setSystemPlaybackChannelCount and will * mixdown as appropriate. * * This must not be zero and is not expected to change during the * lifetime of the target or IO. */ virtual int getApplicationChannelCount() const = 0; /** * Called by the system target/IO if processing will be using a * fixed block size, to tell the application what that block size * will be (in sample frames). If this is not called, the * application must assume that any number of samples could be * requested at a time. */ virtual void setSystemPlaybackBlockSize(int) = 0; /** * Called by the system target/IO to tell the application the * sample rate at which the audio device was opened. */ virtual void setSystemPlaybackSampleRate(int) = 0; /** * Called by the system target/IO to tell the application the * actual number of channels with which the audio device was * opened. Note that the target/IO handles channel mapping and * mixdown; this is just informative. */ virtual void setSystemPlaybackChannelCount(int) = 0; /** * Called by the system target/IO to tell the application the * system playback latency in sample frames at the playback sample * rate. */ virtual void setSystemPlaybackLatency(int) = 0; /** * Request a number of audio sample frames from the * application. The samples pointer will point to nchannels * channel buffers, each having enough space for nframes * samples. This function should write the requested number of * samples directly into those buffers. The value of nchannels is * guaranteed to be the same as getApplicationChannelCount() * returned at the time the device was initialised. * * Return value should be the number of sample frames written * (nframes unless fewer samples exist to be played). * * This may be called from a realtime context. */ virtual int getSourceSamples(float *const *samples, int nchannels, int nframes) = 0; /** * Report peak output levels for the last output * buffer. Potentially useful for monitoring. * * This may be called from a realtime context. */ virtual void setOutputLevels(float peakLeft, float peakRight) = 0; /** * Called when an audio dropout is reported due to a processing * overload. */ virtual void audioProcessingOverload() { } }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/ApplicationRecordTarget.h0000644000000000000000000001211013111512442024001 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_APPLICATION_RECORD_TARGET_H #define BQAUDIOIO_APPLICATION_RECORD_TARGET_H #include namespace breakfastquay { class SystemRecordSource; /** * Interface for an application sink that accepts recorded samples. To * be implemented in the application and passed to * AudioFactory::createCallbackRecordSource or createAudioIO. */ class ApplicationRecordTarget { public: virtual ~ApplicationRecordTarget() { } /** * Return an identifier for the application client. May be used in * connection strings or (possibly) error and logging information. */ virtual std::string getClientName() const = 0; /** * Return the sample rate at which the application runs. The * source or IO will attempt to open its device at the rate * returned by this call at the point where the device is opened, * although it might not succeed; it will provide the actual rate * through a subsequent call to setSystemPlaybackSampleRate. * * Return 0 if the application has no central sample rate of its * own and is happy to accept the default rate of the device. */ virtual int getApplicationSampleRate() const { return 0; } /** * Return the number of audio channels expected by the * application. The source or IO will attempt to open its device * with this number of channels, though it might not succeed; it * will provide the actual number of channels through a subsequent * call to setSystemPlaybackChannelCount and will mixdown as * appropriate. * * This must not be zero and is not expected to change during the * lifetime of the source or IO. */ virtual int getApplicationChannelCount() const = 0; /** * Called by the system source/IO if processing will be using a * fixed block size, to tell the application what that block size * will be (in sample frames). If this is not called, the * application must assume that any number of samples could be * provided at a time. */ virtual void setSystemRecordBlockSize(int) = 0; /** * Called by the system source/IO to tell the application the * sample rate at which the audio device was opened. */ virtual void setSystemRecordSampleRate(int) = 0; /** * Called by the system source/IO to tell the application the * actual number of channels with which the audio device was * opened. Note that the source/IO handles channel mapping and * mixdown; this is just informative. */ virtual void setSystemRecordChannelCount(int) = 0; /** * Called by the system source/IO to tell the application the * system record latency in sample frames. */ virtual void setSystemRecordLatency(int) = 0; /** * Accept a number of audio sample frames that have been received * from the record device. The samples pointer will point to * nchannels channel buffers each having nframes samples. The * value of nchannels will be whatever * getApplicationChannelCount() returned at the time the device * was initialised. * * This may be called from realtime context. */ virtual void putSamples(const float *const *samples, int nchannels, int nframes) = 0; /** * Report peak input levels for the last output * buffer. Potentially useful for monitoring. * * This may be called from realtime context. */ virtual void setInputLevels(float peakLeft, float peakRight) = 0; /** * Called when an audio dropout is reported due to a processing * overload. */ virtual void audioProcessingOverload() { } }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/AudioFactory.h0000644000000000000000000001631413111512442021633 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_AUDIO_FACTORY_H #define BQAUDIOIO_AUDIO_FACTORY_H #include #include namespace breakfastquay { class SystemRecordSource; class SystemPlaybackTarget; class SystemAudioIO; class ApplicationRecordTarget; class ApplicationPlaybackSource; class AudioFactory { public: struct LogCallback { virtual ~LogCallback() { } virtual void log(std::string) const = 0; }; /** * Set a log callback to be used globally by the bqaudioio * classes. The default is no callback, and this default may be * restored by passing nullptr to this function. If the logger is * non-null, any debug information that may otherwise have been * written to cerr will be sent to its log method. * * The caller retains ownership of the logger and must ensure * that it is not destroyed before the last audio driver has been * closed (or the next call to setLogCallback). */ static void setLogCallback(LogCallback *logger); static std::vector getImplementationNames(); static std::string getImplementationDescription(std::string implName); static std::vector getRecordDeviceNames(std::string implName); static std::vector getPlaybackDeviceNames(std::string implName); /** * Preferences for implementation (i.e. audio driver layer) and * audio device. * * Wherever a non-empty string is provided, then it will be used * by the factory; if the factory can't open the requested driver, * or select a requested device, creation will fail. * * Wherever an empty string is provided, the driver will make an * automatic selection and may potentially try more than one * implementation or device if its first choice can't be used. */ struct Preference { std::string implementation; std::string recordDevice; std::string playbackDevice; Preference() { } }; /** * Open the audio driver for duplex (i.e recording + playback) I/O * using the given driver and device preferences. Provide the * given record target and play source objects to the audio I/O * and return the new audio I/O. The record target and play source * must be non-null. * * Caller owns the returned object and must delete it when * done. Note that the record target and playback source must * outlive the returned IO object. * * Return a null pointer if the requested device could not be * opened, or, in the case where no preference was stated, if no * device could be opened. An error string may also be returned * through the errorString argument. (The error string will * generally be returned only if a specific implementation was * requested or if only one implementation is available; otherwise * we don't know which of the failed implementations to return an * error from.) * * Note that one possible cause of failure is that it was possible * to open one of the playback and record sides but not both. You * may want (for example) to fall back to createCallbackPlayTarget * if your application can proceed without audio input. */ static SystemAudioIO * createCallbackIO(ApplicationRecordTarget *recordTarget, ApplicationPlaybackSource *playSource, Preference preference, std::string &errorString); /** * Open the audio driver in record-only mode using the given * driver and device preferences. Provide the given record target * to the audio source and return the new audio source. The record * target must be non-null. * * Caller owns the returned object and must delete it when * done. Note that the record target must outlive the returned * source object. * * Return a null pointer if the requested device could not be * opened, or, in the case where no preference was stated, if no * device could be opened. An error string may also be returned * through the errorString argument. (The error string will * generally be returned only if a specific implementation was * requested or if only one implementation is available; otherwise * we don't know which of the failed implementations to return an * error from.) */ static SystemRecordSource * createCallbackRecordSource(ApplicationRecordTarget *recordTarget, Preference preference, std::string &errorString); /** * Open the audio driver in playback-only mode using the given * driver and device preferences. Provide the given playback * source to the audio source and return the new audio target. The * playback source must be non-null. * * Caller owns the returned object and must delete it when * done. Note that the playback source must outlive the returned * target object. * * Return a null pointer if the requested device could not be * opened, or, in the case where no preference was stated, if no * device could be opened. An error string may also be returned * through the errorString argument. (The error string will * generally be returned only if a specific implementation was * requested or if only one implementation is available; otherwise * we don't know which of the failed implementations to return an * error from.) */ static SystemPlaybackTarget * createCallbackPlayTarget(ApplicationPlaybackSource *playSource, Preference preference, std::string &errorString); private: AudioFactory(const AudioFactory &)=delete; AudioFactory &operator=(const AudioFactory &)=delete; }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/ResamplerWrapper.h0000644000000000000000000001105313111512442022530 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef RESAMPLER_WRAPPER_H #define RESAMPLER_WRAPPER_H #include "ApplicationPlaybackSource.h" namespace breakfastquay { class Resampler; /** * Utility class for applications that want automatic sample rate * conversion on playback (resampling on record is not provided). * * An ApplicationPlaybackSource may request a specific sample rate * through its getApplicationSampleRate callback. This will be used as * the default rate when opening the audio driver. However, not all * drivers can be opened at arbitrary rates (e.g. a JACK driver always * inherits the JACK graph sample rate), so it's possible that a * driver may be opened at a different rate from that requested by the * source. * * An application can accommodate this by wrapping its * ApplicationPlaybackSource in a ResamplerWrapper when passing it to * the AudioFactory. The ResamplerWrapper will automatically resample * output if the driver happened to be opened at a different rate from * that requested by the source. */ class ResamplerWrapper : public ApplicationPlaybackSource { public: /** * Create a wrapper around the given ApplicationPlaybackSource, * implementing another ApplicationPlaybackSource interface that * draws from the same source data but resampling to a playback * target's expected sample rate automatically. */ ResamplerWrapper(ApplicationPlaybackSource *source); ~ResamplerWrapper(); /** * Call this function (e.g. from the wrapped * ApplicationPlaybackSource) to indicate a change in the sample * rate that we should be resampling from. * * (The wrapped ApplicationPlaybackSource should not change the * value it returns from getApplicationSampleRate(), as the API * requires that that be fixed.) */ void changeApplicationSampleRate(int newRate); /** * Clear resampler buffers. */ void reset(); // These functions are passed through to the wrapped // ApplicationPlaybackSource virtual std::string getClientName() const; virtual int getApplicationSampleRate() const; virtual int getApplicationChannelCount() const; virtual void setSystemPlaybackBlockSize(int); virtual void setSystemPlaybackSampleRate(int); virtual void setSystemPlaybackChannelCount(int); virtual void setSystemPlaybackLatency(int); virtual void setOutputLevels(float peakLeft, float peakRight); virtual void audioProcessingOverload(); /** * Request some samples from the wrapped * ApplicationPlaybackSource, resample them if necessary, and * return them to the target */ virtual int getSourceSamples(float *const *samples, int nchannels, int nframes); private: ApplicationPlaybackSource *m_source; int m_channels; int m_targetRate; int m_sourceRate; Resampler *m_resampler; float **m_in; int m_inSize; float **m_resampled; int m_resampledSize; int m_resampledFill; float **m_ptrs; void setupBuffersFor(int reqsize); ResamplerWrapper(const ResamplerWrapper &)=delete; ResamplerWrapper &operator=(const ResamplerWrapper &)=delete; }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/Suspendable.h0000644000000000000000000000320013111512442021475 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_SUSPENDABLE_H #define BQAUDIOIO_SUSPENDABLE_H namespace breakfastquay { class Suspendable { public: virtual void suspend() = 0; virtual void resume() = 0; }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/SystemAudioIO.h0000644000000000000000000000636713111512442021747 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_SYSTEM_AUDIO_IO_H #define BQAUDIOIO_SYSTEM_AUDIO_IO_H #include "SystemRecordSource.h" #include "SystemPlaybackTarget.h" namespace breakfastquay { /** * Interface that combines a SystemPlaybackTarget and a * SystemRecordSource, encapsulating the system audio input and output * for duplex audio. Created by AudioFactory. The caller supplies an * ApplicationPlaybackSource implementation which provides playback * samples on request, and an ApplicationRecordTarget which accepts * record samples when called. * * The target will be continually processing samples for as long as it * is not suspended (see Suspendable interface). A newly-created * target is not suspended. * * The supplied ApplicationPlaybackSource and ApplicationRecordTarget * must outlive the IO object. That is, the application should delete * the IO before it deletes the associated source and target. */ class SystemAudioIO : public SystemRecordSource, public SystemPlaybackTarget { public: /** * Return true if the target has been constructed correctly and is * in a working state. */ bool isOK() const { return isSourceOK() && isTargetOK(); } /** * Return true if the target has been constructed correctly, is in * a working state, and is ready to play (so for example any * callback it receives from the audio driver to report that the * stream is open has been received). */ bool isReady() const { return isSourceReady() && isTargetReady(); } protected: SystemAudioIO(ApplicationRecordTarget *target, ApplicationPlaybackSource *source) : SystemRecordSource(target), SystemPlaybackTarget(source) { } SystemAudioIO(const SystemAudioIO &)=delete; SystemAudioIO &operator=(const SystemAudioIO &)=delete; }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/SystemPlaybackTarget.h0000644000000000000000000000762613111512442023352 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_SYSTEM_PLAYBACK_TARGET_H #define BQAUDIOIO_SYSTEM_PLAYBACK_TARGET_H #include "Suspendable.h" namespace breakfastquay { class ApplicationPlaybackSource; /** * Target for audio samples for playback, encapsulating the system * audio output. Created by AudioFactory. The caller supplies an * ApplicationPlaybackSource implementation which provides the samples * on request. * * The target will be continually requesting and playing samples for * as long as it is not suspended (see Suspendable interface). A * newly-created target is not suspended. * * The supplied ApplicationPlaybackSource must outlive the target * object. That is, the application should delete the target before it * deletes the associated source. */ class SystemPlaybackTarget : virtual public Suspendable { public: virtual ~SystemPlaybackTarget(); /** * Return true if the target has been constructed correctly and is * in a working state. */ virtual bool isTargetOK() const = 0; /** * Return true if the target has been constructed correctly, is in * a working state, and is ready to play (so for example any * callback it receives from the audio driver to report that the * stream is open has been received). */ virtual bool isTargetReady() const { return isTargetOK(); } /** * Get the current stream time in seconds. This is continually * incrementing for as long as the target exists (possibly pausing * when suspended, though that is implementation-dependent). */ virtual double getCurrentTime() const = 0; /** * Set the playback gain (0.0 = silence, 1.0 = levels unmodified * from the data provided by the source). The default is 1.0. */ virtual void setOutputGain(float gain); /** * Retrieve the playback gain. */ virtual float getOutputGain() const; /** * Set the playback balance for stereo output (-1.0 = hard left, * 1.0 = hard right, 0.0 = middle). The default is 0.0. */ virtual void setOutputBalance(float balance); /** * Retrieve the playback balance. */ virtual float getOutputBalance() const; protected: SystemPlaybackTarget(ApplicationPlaybackSource *source); ApplicationPlaybackSource *m_source; float m_outputGain; float m_outputBalance; SystemPlaybackTarget(const SystemPlaybackTarget &)=delete; SystemPlaybackTarget &operator=(const SystemPlaybackTarget &)=delete; }; } #endif sonic-visualiser-3.0.3/bqaudioio/bqaudioio/SystemRecordSource.h0000644000000000000000000000573513111512442023053 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_SYSTEM_RECORD_SOURCE_H #define BQAUDIOIO_SYSTEM_RECORD_SOURCE_H #include "Suspendable.h" namespace breakfastquay { class ApplicationRecordTarget; /** * Source of audio samples for recording, encapsulating the system * audio input. Created by AudioFactory. The caller supplies an * ApplicationRecordTarget implementation which accepts the samples * when called. * * The source will be continually providing samples for as long as it * is not suspended (see Suspendable interface). A newly-created * source is not suspended. * * The supplied ApplicationRecordTarget must outlive the source * object. That is, the application should delete the source before it * deletes the associated target. */ class SystemRecordSource : virtual public Suspendable { public: virtual ~SystemRecordSource(); /** * Return true if the source has been constructed correctly and is * in a working state. */ virtual bool isSourceOK() const = 0; /** * Return true if the source has been constructed correctly, is in * a working state, and is receiving samples (so for example any * callback it receives from the audio driver to report that the * stream is open has been received). */ virtual bool isSourceReady() const { return isSourceOK(); } protected: SystemRecordSource(ApplicationRecordTarget *target); ApplicationRecordTarget *m_target; SystemRecordSource(const SystemRecordSource &)=delete; SystemRecordSource &operator=(const SystemRecordSource &)=delete; }; } #endif sonic-visualiser-3.0.3/bqaudioio/src/AudioFactory.cpp0000644000000000000000000001675113111512442021006 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "AudioFactory.h" #include "JACKAudioIO.h" #include "PortAudioIO.h" #include "PulseAudioIO.h" #include "Log.h" #include using std::string; using std::vector; namespace breakfastquay { void AudioFactory::setLogCallback(LogCallback *callback) { Log::setLogCallback(callback); } vector AudioFactory::getImplementationNames() { vector names; #ifdef HAVE_JACK names.push_back("jack"); #endif #ifdef HAVE_LIBPULSE names.push_back("pulse"); #endif #ifdef HAVE_PORTAUDIO names.push_back("port"); #endif return names; } string AudioFactory::getImplementationDescription(string implementationName) { if (implementationName == "") { return "(auto)"; } if (implementationName == "jack") { return "JACK Audio Connection Kit"; } if (implementationName == "pulse") { return "PulseAudio Server"; } if (implementationName == "port") { return "PortAudio Driver"; } return "(unknown)"; } vector AudioFactory::getRecordDeviceNames(string implementationName) { if (implementationName == "") { // Can't offer implementation-specific choices as we don't // know which implementation will end up being used return { }; } #ifdef HAVE_JACK if (implementationName == "jack") { return JACKAudioIO::getRecordDeviceNames(); } #endif #ifdef HAVE_LIBPULSE if (implementationName == "pulse") { return PulseAudioIO::getRecordDeviceNames(); } #endif #ifdef HAVE_PORTAUDIO if (implementationName == "port") { return PortAudioIO::getRecordDeviceNames(); } #endif return {}; } vector AudioFactory::getPlaybackDeviceNames(string implementationName) { if (implementationName == "") { // Can't offer implementation-specific choices as we don't // know which implementation will end up being used return { }; } #ifdef HAVE_JACK if (implementationName == "jack") { return JACKAudioIO::getPlaybackDeviceNames(); } #endif #ifdef HAVE_LIBPULSE if (implementationName == "pulse") { return PulseAudioIO::getPlaybackDeviceNames(); } #endif #ifdef HAVE_PORTAUDIO if (implementationName == "port") { return PortAudioIO::getPlaybackDeviceNames(); } #endif return {}; } static SystemAudioIO * createIO(Mode mode, ApplicationRecordTarget *target, ApplicationPlaybackSource *source, AudioFactory::Preference preference, std::string &errorString) { string startupError; int implementationsTried = 0; #ifdef HAVE_JACK if (preference.implementation == "" || preference.implementation == "jack") { ++implementationsTried; JACKAudioIO *io = new JACKAudioIO(mode, target, source, preference.recordDevice, preference.playbackDevice); if (io->isOK()) return io; else { std::cerr << "WARNING: AudioFactory::createCallbackIO: Failed to open JACK I/O" << std::endl; startupError = io->getStartupErrorString(); delete io; } } #endif #ifdef HAVE_LIBPULSE if (preference.implementation == "" || preference.implementation == "pulse") { ++implementationsTried; PulseAudioIO *io = new PulseAudioIO(mode, target, source, preference.recordDevice, preference.playbackDevice); if (io->isOK()) return io; else { std::cerr << "WARNING: AudioFactory::createCallbackIO: Failed to open PulseAudio I/O" << std::endl; startupError = io->getStartupErrorString(); delete io; } } #endif #ifdef HAVE_PORTAUDIO if (preference.implementation == "" || preference.implementation == "port") { ++implementationsTried; PortAudioIO *io = new PortAudioIO(mode, target, source, preference.recordDevice, preference.playbackDevice); if (io->isOK()) return io; else { std::cerr << "WARNING: AudioFactory::createCallbackIO: Failed to open PortAudio I/O" << std::endl; startupError = io->getStartupErrorString(); delete io; } } #endif if (implementationsTried == 0) { if (preference.implementation == "") { errorString = "No audio drivers compiled in"; } else { errorString = "Requested audio driver is not compiled in"; } } else if (implementationsTried == 1) { errorString = startupError; } std::cerr << "WARNING: AudioFactory::createIO: No suitable implementation available" << std::endl; return nullptr; } SystemPlaybackTarget * AudioFactory::createCallbackPlayTarget(ApplicationPlaybackSource *source, Preference preference, std::string &errorString) { if (!source) { throw std::logic_error("ApplicationPlaybackSource must be provided"); } return createIO(Mode::Playback, 0, source, preference, errorString); } SystemRecordSource * AudioFactory::createCallbackRecordSource(ApplicationRecordTarget *target, Preference preference, std::string &errorString) { if (!target) { throw std::logic_error("ApplicationRecordTarget must be provided"); } return createIO(Mode::Record, target, 0, preference, errorString); } SystemAudioIO * AudioFactory::createCallbackIO(ApplicationRecordTarget *target, ApplicationPlaybackSource *source, Preference preference, std::string &errorString) { if (!target || !source) { throw std::logic_error("ApplicationRecordTarget and ApplicationPlaybackSource must both be provided"); } return createIO(Mode::Duplex, target, source, preference, errorString); } } sonic-visualiser-3.0.3/bqaudioio/src/DynamicJACK.h0000644000000000000000000002266713111512442020102 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_DYNAMIC_JACK_H #define BQAUDIOIO_DYNAMIC_JACK_H #ifdef BUILD_STATIC #if (! defined _WIN32) && (! defined __APPLE__) // Some lunacy to enable JACK support in static builds. JACK isn't // supposed to be linked statically, because it depends on a // consistent shared memory layout between client library and daemon, // so it's very fragile in the face of version mismatches. // // Therefore for static builds on Linux we avoid linking against JACK // at all during the build, instead using dlopen and runtime symbol // lookup to switch on JACK support at runtime. The following big // mess (down to the #endifs) is the code that implements this. #ifdef HAVE_JACK #include #include #include #include namespace breakfastquay { //#define DEBUG_AUDIO_JACK_TARGET 1 static void *symbol(const char *name) { static bool attempted = false; static void *library = 0; static std::map symbols; if (symbols.find(name) != symbols.end()) return symbols[name]; if (!library) { if (!attempted) { library = ::dlopen("libjack.so.1", RTLD_NOW); if (!library) library = ::dlopen("libjack.so.0", RTLD_NOW); if (!library) library = ::dlopen("libjack.so", RTLD_NOW); if (!library) { std::cerr << "WARNING: Failed to load JACK library: " << ::dlerror() << " (tried .so, .so.0, .so.1)" << std::endl; } attempted = true; } if (!library) return 0; } void *symbol = ::dlsym(library, name); if (!symbol) { std::cerr << "WARNING: JACKPlaybackTarget: Failed to locate symbol " << name << ": " << ::dlerror() << std::endl; } symbols[name] = symbol; return symbol; } static jack_client_t *dynamic_jack_client_open(const char *client_name, jack_options_t options, jack_status_t *status, ...) { typedef jack_client_t *(*func)(const char *client_name, jack_options_t options, jack_status_t *status, ...); void *s = symbol("jack_client_open"); if (!s) return 0; func f = (func)s; return f(client_name, options, status); // varargs not supported here } static int dynamic_jack_set_process_callback(jack_client_t *client, JackProcessCallback process_callback, void *arg) { typedef int (*func)(jack_client_t *client, JackProcessCallback process_callback, void *arg); void *s = symbol("jack_set_process_callback"); if (!s) return 1; func f = (func)s; return f(client, process_callback, arg); } static int dynamic_jack_set_xrun_callback(jack_client_t *client, JackXRunCallback xrun_callback, void *arg) { typedef int (*func)(jack_client_t *client, JackXRunCallback xrun_callback, void *arg); void *s = symbol("jack_set_xrun_callback"); if (!s) return 1; func f = (func)s; return f(client, xrun_callback, arg); } static const char **dynamic_jack_get_ports(jack_client_t *client, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags) { typedef const char **(*func)(jack_client_t *client, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags); void *s = symbol("jack_get_ports"); if (!s) return 0; func f = (func)s; return f(client, port_name_pattern, type_name_pattern, flags); } static jack_port_t *dynamic_jack_port_register(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size) { typedef jack_port_t *(*func)(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size); void *s = symbol("jack_port_register"); if (!s) return 0; func f = (func)s; return f(client, port_name, port_type, flags, buffer_size); } static int dynamic_jack_connect(jack_client_t *client, const char *source, const char *dest) { typedef int (*func)(jack_client_t *client, const char *source, const char *dest); void *s = symbol("jack_connect"); if (!s) return 1; func f = (func)s; return f(client, source, dest); } static void *dynamic_jack_port_get_buffer(jack_port_t *port, jack_nframes_t sz) { typedef void *(*func)(jack_port_t *, jack_nframes_t); void *s = symbol("jack_port_get_buffer"); if (!s) return 0; func f = (func)s; return f(port, sz); } static void dynamic_jack_port_get_latency_range(jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range) { typedef void (*func)(jack_port_t *, jack_latency_callback_mode_t, jack_latency_range_t *); void *s = symbol("jack_port_get_latency_range"); if (!s) { range->min = range->max = 0; return; } func f = (func)s; f(port, mode, range); } static int dynamic_jack_port_unregister(jack_client_t *client, jack_port_t *port) { typedef int(*func)(jack_client_t *, jack_port_t *); void *s = symbol("jack_port_unregister"); if (!s) return 0; func f = (func)s; return f(client, port); } #define dynamic1(rv, name, argtype, failval) \ static rv dynamic_##name(argtype arg) { \ typedef rv (*func) (argtype); \ void *s = symbol(#name); \ if (!s) return failval; \ func f = (func) s; \ return f(arg); \ } dynamic1(jack_client_t *, jack_client_new, const char *, 0); dynamic1(jack_nframes_t, jack_get_buffer_size, jack_client_t *, 0); dynamic1(jack_nframes_t, jack_get_sample_rate, jack_client_t *, 0); dynamic1(int, jack_activate, jack_client_t *, 1); dynamic1(int, jack_deactivate, jack_client_t *, 1); dynamic1(int, jack_client_close, jack_client_t *, 1); dynamic1(jack_nframes_t, jack_port_get_latency, jack_port_t *, 0); dynamic1(const char *, jack_port_name, const jack_port_t *, 0); #define jack_client_new dynamic_jack_client_new #define jack_client_open dynamic_jack_client_open #define jack_get_buffer_size dynamic_jack_get_buffer_size #define jack_get_sample_rate dynamic_jack_get_sample_rate #define jack_set_process_callback dynamic_jack_set_process_callback #define jack_set_xrun_callback dynamic_jack_set_xrun_callback #define jack_activate dynamic_jack_activate #define jack_deactivate dynamic_jack_deactivate #define jack_client_close dynamic_jack_client_close #define jack_get_ports dynamic_jack_get_ports #define jack_port_register dynamic_jack_port_register #define jack_port_unregister dynamic_jack_port_unregister #define jack_port_get_latency dynamic_jack_port_get_latency #define jack_port_name dynamic_jack_port_name #define jack_connect dynamic_jack_connect #define jack_port_get_buffer dynamic_jack_port_get_buffer #define jack_port_get_latency_range dynamic_jack_port_get_latency_range } #endif // HAVE_JACK #endif // (! defined _WIN32) && (! defined __APPLE__) #endif // BUILD_STATIC #endif // BQAUDIOIO_DYNAMIC_JACK_H sonic-visualiser-3.0.3/bqaudioio/src/Gains.h0000644000000000000000000000373613111512442017122 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_GAINS_H #define BQAUDIOIO_GAINS_H #include class Gains { public: static std::vector gainsFor(float gain, float balance, size_t channelCount) { std::vector gains(channelCount, gain); for (int c = 0; c < int(channelCount); ++c) { if (c == 0) { if (balance > 0.f) gains[c] *= (1.0f - balance); } else if (c == 1) { if (balance < 0.f) gains[c] *= (balance + 1.0f); } } return gains; } }; #endif sonic-visualiser-3.0.3/bqaudioio/src/JACKAudioIO.cpp0000644000000000000000000003024013111512442020324 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef HAVE_JACK #include "JACKAudioIO.h" #include "DynamicJACK.h" #include "ApplicationPlaybackSource.h" #include "ApplicationRecordTarget.h" #include "Gains.h" #include "Log.h" #include #include #include #include #include #include #include #include // getpid //#define DEBUG_AUDIO_JACK_IO 1 using namespace std; namespace breakfastquay { static string defaultConnectionName = "Default Connection"; static string noConnectionName = "No Connection"; static void log(string message) { Log::log("JACKAudioIO: " + message); } vector JACKAudioIO::getRecordDeviceNames() { return { defaultConnectionName, noConnectionName }; } vector JACKAudioIO::getPlaybackDeviceNames() { return { defaultConnectionName, noConnectionName }; } JACKAudioIO::JACKAudioIO(Mode mode, ApplicationRecordTarget *target, ApplicationPlaybackSource *source, string recordDevice, string playbackDevice) : SystemAudioIO(target, source), m_mode(mode), m_client(0), m_bufferSize(0), m_sampleRate(0) { log("starting"); if (m_mode == Mode::Playback) { m_target = 0; } if (m_mode == Mode::Record) { m_source = 0; } std::string clientName = (source ? source->getClientName() : target ? target->getClientName() : "bqaudioio"); JackOptions options = JackNullOption; #if defined(HAVE_PORTAUDIO) || defined(HAVE_LIBPULSE) options = JackNoStartServer; #endif JackStatus status = JackStatus(0); m_client = jack_client_open(clientName.c_str(), options, &status); if (!m_client) { m_startupError = "Failed to connect to JACK server"; log("ERROR: " + m_startupError); return; } m_bufferSize = jack_get_buffer_size(m_client); m_sampleRate = jack_get_sample_rate(m_client); jack_set_xrun_callback(m_client, xrunStatic, this); jack_set_process_callback(m_client, processStatic, this); if (jack_activate(m_client)) { m_startupError = "Failed to activate JACK client"; log("ERROR: " + m_startupError); return; } bool connectRecord = (recordDevice != noConnectionName); bool connectPlayback = (playbackDevice != noConnectionName); setup(connectRecord, connectPlayback); log("started successfully"); } JACKAudioIO::~JACKAudioIO() { if (m_client) { jack_deactivate(m_client); jack_client_close(m_client); log("closed"); } } bool JACKAudioIO::isSourceOK() const { if (m_mode == Mode::Playback) { // record source is irrelevant in playback mode return true; } else { return (m_client != 0); } } bool JACKAudioIO::isTargetOK() const { if (m_mode == Mode::Record) { // playback target is irrelevant in record mode return true; } else { return (m_client != 0); } } double JACKAudioIO::getCurrentTime() const { if (m_client && m_sampleRate) { return double(jack_frame_time(m_client)) / double(m_sampleRate); } else { return 0.0; } } int JACKAudioIO::processStatic(jack_nframes_t nframes, void *arg) { return ((JACKAudioIO *)arg)->process(nframes); } int JACKAudioIO::xrunStatic(void *arg) { return ((JACKAudioIO *)arg)->xrun(); } void JACKAudioIO::setup(bool connectRecord, bool connectPlayback) { lock_guard guard(m_mutex); int channelsPlay = 2; int channelsRec = 2; if (m_source) { m_source->setSystemPlaybackBlockSize(m_bufferSize); m_source->setSystemPlaybackSampleRate(m_sampleRate); if (m_source->getApplicationChannelCount() > 0) { channelsPlay = m_source->getApplicationChannelCount(); } } if (m_target) { m_target->setSystemRecordBlockSize(m_bufferSize); m_target->setSystemRecordSampleRate(m_sampleRate); if (m_target->getApplicationChannelCount() > 0) { channelsRec = m_target->getApplicationChannelCount(); } } if (!m_client) return; if (channelsPlay == int(m_outputs.size()) && channelsRec == int(m_inputs.size())) { return; } const char **playPorts = jack_get_ports(m_client, NULL, NULL, JackPortIsPhysical | JackPortIsInput); const char **capPorts = jack_get_ports(m_client, NULL, NULL, JackPortIsPhysical | JackPortIsOutput); int playPortCount = 0; while (playPorts && playPorts[playPortCount]) ++playPortCount; int capPortCount = 0; while (capPorts && capPorts[capPortCount]) ++capPortCount; { ostringstream os; os << "Setup: have " << channelsPlay << " playback channels, " << channelsRec << " capture channels, " << playPortCount << " playback ports, " << capPortCount << " capture ports"; log(os.str()); } if (m_source) { while (int(m_outputs.size()) < channelsPlay) { char name[20]; jack_port_t *port; sprintf(name, "out %ld", long(m_outputs.size() + 1)); port = jack_port_register(m_client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); if (!port) { ostringstream os; os << "ERROR: Failed to create JACK output port " << m_outputs.size(); log(os.str()); return; } else { jack_latency_range_t range; jack_port_get_latency_range(port, JackPlaybackLatency, &range); m_source->setSystemPlaybackLatency(range.max); } if (connectPlayback) { if (int(m_outputs.size()) < playPortCount) { jack_connect(m_client, jack_port_name(port), playPorts[m_outputs.size()]); } } m_outputs.push_back(port); } } if (m_target) { while (int(m_inputs.size()) < channelsRec) { char name[20]; jack_port_t *port; sprintf(name, "in %ld", long(m_inputs.size() + 1)); port = jack_port_register(m_client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); if (!port) { ostringstream os; os << "ERROR: Failed to create JACK input port " << m_inputs.size(); log(os.str()); return; } else { jack_latency_range_t range; jack_port_get_latency_range(port, JackCaptureLatency, &range); m_target->setSystemRecordLatency(range.max); } if (connectRecord) { if (int(m_inputs.size()) < capPortCount) { jack_connect(m_client, capPorts[m_inputs.size()], jack_port_name(port)); } } m_inputs.push_back(port); } } while (int(m_outputs.size()) > channelsPlay) { vector::iterator itr = m_outputs.end(); --itr; jack_port_t *port = *itr; if (port) jack_port_unregister(m_client, port); m_outputs.erase(itr); } while (int(m_inputs.size()) > channelsRec) { vector::iterator itr = m_inputs.end(); --itr; jack_port_t *port = *itr; if (port) jack_port_unregister(m_client, port); m_inputs.erase(itr); } if (m_source) { m_source->setSystemPlaybackChannelCount(channelsPlay); } if (m_target) { m_target->setSystemRecordChannelCount(channelsRec); } } int JACKAudioIO::process(jack_nframes_t j_nframes) { if (!m_mutex.try_lock()) { return 0; } lock_guard guard(m_mutex, adopt_lock); if (j_nframes > INT_MAX) j_nframes = 0; int nframes = int(j_nframes); if (m_outputs.empty() && m_inputs.empty()) { return 0; } #ifdef DEBUG_AUDIO_JACK_IO cout << "JACKAudioIO::process(" << nframes << "): have a purpose in life" << endl; #endif #ifdef DEBUG_AUDIO_JACK_IO if (m_bufferSize != nframes) { cerr << "WARNING: m_bufferSize != nframes (" << m_bufferSize << " != " << nframes << ")" << endl; } #endif float **inbufs = (float **)alloca(m_inputs.size() * sizeof(float *)); float **outbufs = (float **)alloca(m_outputs.size() * sizeof(float *)); float peakLeft, peakRight; if (m_target) { for (int ch = 0; in_range_for(m_inputs, ch); ++ch) { inbufs[ch] = (float *)jack_port_get_buffer(m_inputs[ch], nframes); } peakLeft = 0.0; peakRight = 0.0; for (int ch = 0; in_range_for(m_inputs, ch); ++ch) { float peak = 0.0; for (int i = 0; i < nframes; ++i) { float sample = fabsf(inbufs[ch][i]); if (sample > peak) peak = sample; } if (ch == 0) peakLeft = peak; if (ch > 0 || m_inputs.size() == 1) peakRight = peak; } m_target->setInputLevels(peakLeft, peakRight); m_target->putSamples(inbufs, int(m_inputs.size()), nframes); } auto gain = Gains::gainsFor(m_outputGain, m_outputBalance, m_outputs.size()); if (m_source) { for (int ch = 0; in_range_for(m_outputs, ch); ++ch) { outbufs[ch] = (float *)jack_port_get_buffer(m_outputs[ch], nframes); } int received = m_source->getSourceSamples (outbufs, int(m_outputs.size()), nframes); peakLeft = 0.0; peakRight = 0.0; for (int ch = 0; in_range_for(m_outputs, ch); ++ch) { float peak = 0.0; for (int i = received; i < nframes; ++i) { outbufs[ch][i] = 0.0; } for (int i = 0; i < nframes; ++i) { outbufs[ch][i] *= gain[ch]; float sample = fabsf(outbufs[ch][i]); if (sample > peak) peak = sample; } if (ch == 0) peakLeft = peak; if (ch > 0 || m_outputs.size() == 1) peakRight = peak; } m_source->setOutputLevels(peakLeft, peakRight); } else if (!m_outputs.empty()) { for (int ch = 0; in_range_for(m_outputs, ch); ++ch) { for (int i = 0; i < nframes; ++i) { outbufs[ch][i] = 0.0; } } } return 0; } int JACKAudioIO::xrun() { log("xrun!"); if (m_target) m_target->audioProcessingOverload(); if (m_source) m_source->audioProcessingOverload(); return 0; } } #endif /* HAVE_JACK */ sonic-visualiser-3.0.3/bqaudioio/src/JACKAudioIO.h0000644000000000000000000000611713111512442017777 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_JACK_IO_H_ #define BQAUDIOIO_JACK_IO_H_ #ifdef HAVE_JACK #include #include #include #include "SystemAudioIO.h" #include "AudioFactory.h" #include "Mode.h" namespace breakfastquay { class ApplicationRecordTarget; class ApplicationPlaybackSource; class JACKAudioIO : public SystemAudioIO { public: JACKAudioIO(Mode mode, ApplicationRecordTarget *recordTarget, ApplicationPlaybackSource *playSource, std::string recordDevice, std::string playbackDevice); virtual ~JACKAudioIO(); static std::vector getRecordDeviceNames(); static std::vector getPlaybackDeviceNames(); virtual bool isSourceOK() const; virtual bool isTargetOK() const; virtual void suspend() {} virtual void resume() {} virtual double getCurrentTime() const; std::string getStartupErrorString() const { return m_startupError; } protected: void setup(bool connectRecord, bool connectPlayback); int process(jack_nframes_t nframes); int xrun(); static int processStatic(jack_nframes_t, void *); static int xrunStatic(void *); Mode m_mode; jack_client_t *m_client; std::vector m_outputs; std::vector m_inputs; jack_nframes_t m_bufferSize; jack_nframes_t m_sampleRate; std::mutex m_mutex; std::string m_startupError; JACKAudioIO(const JACKAudioIO &)=delete; JACKAudioIO &operator=(const JACKAudioIO &)=delete; }; } #endif /* HAVE_JACK */ #endif sonic-visualiser-3.0.3/bqaudioio/src/Log.cpp0000644000000000000000000000356313111512442017133 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Log.h" #include #include using namespace std; namespace breakfastquay { static mutex cbMutex; static AudioFactory::LogCallback *cb = nullptr; void Log::setLogCallback(AudioFactory::LogCallback *callback) { lock_guard guard(cbMutex); cb = callback; } void Log::log(string message) { lock_guard guard(cbMutex); if (cb) cb->log(message); else cerr << message << endl; } } sonic-visualiser-3.0.3/bqaudioio/src/Log.h0000644000000000000000000000326313111512442016575 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_LOG_H #define BQAUDIOIO_LOG_H #include "AudioFactory.h" namespace breakfastquay { class Log { public: static void setLogCallback(AudioFactory::LogCallback *callback); static void log(std::string message); }; } #endif sonic-visualiser-3.0.3/bqaudioio/src/Mode.h0000644000000000000000000000313413111512442016735 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_MODE_H #define BQAUDIOIO_MODE_H namespace breakfastquay { enum class Mode { Playback, Record, Duplex // i.e. IO }; } #endif sonic-visualiser-3.0.3/bqaudioio/src/PortAudioIO.cpp0000644000000000000000000004401213111512442020542 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef HAVE_PORTAUDIO #include "PortAudioIO.h" #include "ApplicationPlaybackSource.h" #include "ApplicationRecordTarget.h" #include "Gains.h" #include "Log.h" #include "bqvec/VectorOps.h" #include "bqvec/Allocators.h" #include #include #include #include #include #include #include #ifndef __LINUX__ #ifndef _WIN32 #include #endif #endif //#define DEBUG_AUDIO_PORT_AUDIO_IO 1 using namespace std; namespace breakfastquay { static void log(string message) { Log::log("PortAudioIO: " + message); } #ifdef __LINUX__ extern "C" { void PaAlsa_EnableRealtimeScheduling(PaStream *, int); } #endif static bool // true if "can attempt on this platform", not "succeeded" enableRT(PaStream * #ifdef __LINUX__ stream #endif ) { #ifdef __LINUX__ // This will link only if the PA ALSA host API is linked statically PaAlsa_EnableRealtimeScheduling(stream, 1); return true; #else return false; #endif } static bool // true if "can attempt on this platform", not "succeeded" enableRT() { // on current thread #ifndef __LINUX__ #ifndef _WIN32 sched_param param; param.sched_priority = 20; if (pthread_setschedparam(pthread_self(), SCHED_RR, ¶m)) { log("NOTE: couldn't set RT scheduling class"); } else { log("NOTE: successfully set RT scheduling class"); } return true; #endif #endif return false; } static bool paio_initialised = false; static bool paio_working = false; static mutex paio_init_mutex; static bool initialise() { lock_guard guard(paio_init_mutex); if (!paio_initialised) { PaError err = Pa_Initialize(); paio_initialised = true; if (err != paNoError) { log("ERROR: Failed to initialize PortAudio"); paio_working = false; } else { paio_working = true; } } return paio_working; } static void deinitialise() { lock_guard guard(paio_init_mutex); if (paio_initialised && paio_working) { Pa_Terminate(); paio_initialised = false; } } static vector getDeviceNames(bool record) { if (!initialise()) { return {}; } vector names; PaDeviceIndex count = Pa_GetDeviceCount(); if (count < 0) { // error log(string("error in retrieving device list: ") + Pa_GetErrorText(count)); return names; } else { ostringstream os; os << "have " << count << " device(s)"; log(os.str()); } for (int i = 0; i < count; ++i) { const PaDeviceInfo *info = Pa_GetDeviceInfo(i); ostringstream os; os << "device " << i << " of " << count << ":" << endl; os << "name = \"" << info->name << "\"" << endl; os << "maxInputChannels = " << info->maxInputChannels << endl; os << "maxOutputChannels = " << info->maxOutputChannels << endl; os << "defaultSampleRate = " << info->defaultSampleRate; log(os.str()); if (record) { if (info->maxInputChannels > 0) { names.push_back(info->name); } } else { if (info->maxOutputChannels > 0) { names.push_back(info->name); } } } return names; } static PaDeviceIndex getDeviceIndex(string name, bool record) { { ostringstream os; os << "getDeviceIndex: name = \"" << name << "\", record = " << record; log(os.str()); } if (name != "") { PaDeviceIndex count = Pa_GetDeviceCount(); if (count < 0) { log(string("error in retrieving device index: ") + Pa_GetErrorText(count)); } for (int i = 0; i < count; ++i) { const PaDeviceInfo *info = Pa_GetDeviceInfo(i); if (record) { if (info->maxInputChannels > 0) { if (name == info->name) { return i; } } } else { if (info->maxOutputChannels > 0) { if (name == info->name) { return i; } } } } } // no name supplied, or no match in device list if (record) { return Pa_GetDefaultInputDevice(); } else { return Pa_GetDefaultOutputDevice(); } } vector PortAudioIO::getRecordDeviceNames() { return getDeviceNames(true); } vector PortAudioIO::getPlaybackDeviceNames() { return getDeviceNames(false); } PortAudioIO::PortAudioIO(Mode mode, ApplicationRecordTarget *target, ApplicationPlaybackSource *source, string recordDevice, string playbackDevice) : SystemAudioIO(target, source), m_stream(0), m_mode(mode), m_bufferSize(0), m_sampleRate(0), m_inputLatency(0), m_outputLatency(0), m_prioritySet(false), m_suspended(false), m_buffers(0), m_bufferChannels(0) { log("starting"); if (!initialise()) return; // solely to debug-log the list of devices, so both arg // and return value are irrelevant here: (void)getDeviceNames(false); if (m_mode == Mode::Playback) { m_target = 0; } if (m_mode == Mode::Record) { m_source = 0; } PaError err; m_bufferSize = 0; PaStreamParameters ip, op; ip.device = getDeviceIndex(recordDevice, true); op.device = getDeviceIndex(playbackDevice, false); { ostringstream os; os << "Obtained playback device index " << op.device << " and record device index " << ip.device; log(os.str()); } const PaDeviceInfo *inInfo = Pa_GetDeviceInfo(ip.device); const PaDeviceInfo *outInfo = Pa_GetDeviceInfo(op.device); if (outInfo) { m_sampleRate = outInfo->defaultSampleRate; } m_sourceChannels = 2; m_targetChannels = 2; int sourceRate = 0; int targetRate = 0; if (m_source) { sourceRate = m_source->getApplicationSampleRate(); if (sourceRate != 0) { m_sampleRate = sourceRate; } if (m_source->getApplicationChannelCount() != 0) { m_sourceChannels = m_source->getApplicationChannelCount(); } } if (m_target) { targetRate = m_target->getApplicationSampleRate(); if (targetRate != 0) { if (sourceRate != 0 && sourceRate != targetRate) { ostringstream os; os << "WARNING: Source and target both provide sample rates, but different ones (source " << sourceRate << ", target " << targetRate << ") - using source rate"; } else { m_sampleRate = targetRate; } } if (m_target->getApplicationChannelCount() != 0) { m_targetChannels = m_target->getApplicationChannelCount(); } } if (m_sampleRate == 0) { m_sampleRate = 44100; } m_inputChannels = m_targetChannels; m_outputChannels = m_sourceChannels; if (inInfo && m_inputChannels > inInfo->maxInputChannels && inInfo->maxInputChannels > 0) { m_inputChannels = inInfo->maxInputChannels; } if (outInfo && m_outputChannels > outInfo->maxOutputChannels && outInfo->maxOutputChannels > 0) { m_outputChannels = outInfo->maxOutputChannels; } ip.channelCount = m_inputChannels; op.channelCount = m_outputChannels; ip.sampleFormat = paFloat32; op.sampleFormat = paFloat32; ip.suggestedLatency = 0.2; op.suggestedLatency = 0.2; ip.hostApiSpecificStreamInfo = 0; op.hostApiSpecificStreamInfo = 0; m_bufferSize = 0; err = openStream(m_mode, &m_stream, &ip, &op, m_sampleRate, paFramesPerBufferUnspecified, this); if (err != paNoError) { m_bufferSize = 1024; err = openStream(m_mode, &m_stream, &ip, &op, m_sampleRate, 1024, this); } if (err != paNoError) { if (m_inputChannels != 2 || m_outputChannels != 2) { log(string("WARNING: Failed to open PortAudio stream: ") + Pa_GetErrorText(err) + ": trying again with 2x2 configuration"); m_inputChannels = 2; m_outputChannels = 2; ip.channelCount = m_inputChannels; op.channelCount = m_outputChannels; m_bufferSize = 0; err = openStream(m_mode, &m_stream, &ip, &op, m_sampleRate, paFramesPerBufferUnspecified, this); m_bufferSize = 1024; if (err != paNoError) { err = openStream(m_mode, &m_stream, &ip, &op, m_sampleRate, 1024, this); } } } if (err != paNoError) { m_startupError = "Failed to open PortAudio stream: "; m_startupError += Pa_GetErrorText(err); log("ERROR: " + m_startupError); m_stream = 0; deinitialise(); return; } const PaStreamInfo *info = Pa_GetStreamInfo(m_stream); m_outputLatency = int(info->outputLatency * m_sampleRate + 0.001); m_inputLatency = int(info->inputLatency * m_sampleRate + 0.001); if (m_bufferSize == 0) m_bufferSize = m_outputLatency; if (m_bufferSize == 0) m_bufferSize = m_inputLatency; if (enableRT(m_stream)) { m_prioritySet = true; } { ostringstream os; os << "block size " << m_bufferSize; log(os.str()); } if (m_source) { m_source->setSystemPlaybackBlockSize(m_bufferSize); m_source->setSystemPlaybackSampleRate(int(round(m_sampleRate))); m_source->setSystemPlaybackLatency(m_outputLatency); m_source->setSystemPlaybackChannelCount(m_outputChannels); } if (m_target) { m_target->setSystemRecordBlockSize(m_bufferSize); m_target->setSystemRecordSampleRate(int(round(m_sampleRate))); m_target->setSystemRecordLatency(m_inputLatency); m_target->setSystemRecordChannelCount(m_inputChannels); } m_bufferChannels = std::max(std::max(m_sourceChannels, m_targetChannels), std::max(m_inputChannels, m_outputChannels)); m_buffers = allocate_and_zero_channels(m_bufferChannels, m_bufferSize); err = Pa_StartStream(m_stream); if (err != paNoError) { m_startupError = "Failed to start PortAudio stream: "; m_startupError += Pa_GetErrorText(err); log("ERROR: " + m_startupError); Pa_CloseStream(m_stream); m_stream = 0; deinitialise(); return; } log("started successfully"); } PortAudioIO::~PortAudioIO() { if (m_stream) { PaError err; if (!m_suspended) { err = Pa_StopStream(m_stream); if (err != paNoError) { log("ERROR: Failed to stop PortAudio stream"); err = Pa_AbortStream(m_stream); if (err != paNoError) { log("ERROR: Failed to abort PortAudio stream"); } } } err = Pa_CloseStream(m_stream); if (err != paNoError) { log("ERROR: Failed to close PortAudio stream"); } deallocate_channels(m_buffers, m_bufferChannels); deinitialise(); log("closed"); } } PaError PortAudioIO::openStream(Mode mode, PaStream **stream, const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate, unsigned long framesPerBuffer, void *data) { switch (mode) { case Mode::Playback: return Pa_OpenStream(stream, 0, outputParameters, sampleRate, framesPerBuffer, paNoFlag, processStatic, data); case Mode::Record: return Pa_OpenStream(stream, inputParameters, 0, sampleRate, framesPerBuffer, paNoFlag, processStatic, data); case Mode::Duplex: return Pa_OpenStream(stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, paNoFlag, processStatic, data); }; return paNoError; } bool PortAudioIO::isSourceOK() const { if (m_mode == Mode::Playback) { // record source is irrelevant in playback mode return true; } else { return (m_stream != 0); } } bool PortAudioIO::isTargetOK() const { if (m_mode == Mode::Record) { // playback target is irrelevant in record mode return true; } else { return (m_stream != 0); } } double PortAudioIO::getCurrentTime() const { if (!m_stream) return 0.0; else return Pa_GetStreamTime(m_stream); } void PortAudioIO::suspend() { log("suspend called"); if (m_suspended || !m_stream) return; PaError err = Pa_StopStream(m_stream); if (err != paNoError) { log("ERROR: Failed to stop PortAudio stream"); } m_suspended = true; log("suspended"); } void PortAudioIO::resume() { log("resume called"); if (!m_suspended || !m_stream) return; PaError err = Pa_StartStream(m_stream); if (err != paNoError) { cerr << "ERROR: Failed to restart PortAudio stream"; } m_suspended = false; log("resumed"); } int PortAudioIO::processStatic(const void *input, void *output, unsigned long nframes, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags flags, void *data) { return ((PortAudioIO *)data)->process(input, output, nframes, timeInfo, flags); } int PortAudioIO::process(const void *inputBuffer, void *outputBuffer, unsigned long pa_nframes, const PaStreamCallbackTimeInfo *, PaStreamCallbackFlags) { #ifdef DEBUG_AUDIO_PORT_AUDIO_IO cout << "PortAudioIO::process(" << pa_nframes << ")" << endl; #endif if (!m_prioritySet) { enableRT(); m_prioritySet = true; } if (!m_source && !m_target) return 0; if (!m_stream) return 0; if (pa_nframes > INT_MAX) pa_nframes = 0; int nframes = int(pa_nframes); if (nframes > m_bufferSize) { m_buffers = reallocate_and_zero_extend_channels (m_buffers, m_bufferChannels, m_bufferSize, m_bufferChannels, nframes); m_bufferSize = nframes; } const float *input = (const float *)inputBuffer; float *output = (float *)outputBuffer; float peakLeft, peakRight; if (m_target && input) { v_deinterleave (m_buffers, input, m_inputChannels, nframes); v_reconfigure_channels_inplace (m_buffers, m_targetChannels, m_inputChannels, nframes); peakLeft = 0.0, peakRight = 0.0; for (int c = 0; c < m_targetChannels && c < 2; ++c) { float peak = 0.f; for (int i = 0; i < nframes; ++i) { if (m_buffers[c][i] > peak) { peak = m_buffers[c][i]; } } if (c == 0) peakLeft = peak; if (c > 0 || m_targetChannels == 1) peakRight = peak; } m_target->putSamples(m_buffers, m_targetChannels, nframes); m_target->setInputLevels(peakLeft, peakRight); } if (m_source && output) { int received = m_source->getSourceSamples(m_buffers, m_sourceChannels, nframes); if (received < nframes) { for (int c = 0; c < m_sourceChannels; ++c) { v_zero(m_buffers[c] + received, nframes - received); } } v_reconfigure_channels_inplace (m_buffers, m_outputChannels, m_sourceChannels, nframes); auto gain = Gains::gainsFor(m_outputGain, m_outputBalance, m_outputChannels); for (int c = 0; c < m_outputChannels; ++c) { v_scale(m_buffers[c], gain[c], nframes); } peakLeft = 0.0, peakRight = 0.0; for (int c = 0; c < m_outputChannels && c < 2; ++c) { float peak = 0.f; for (int i = 0; i < nframes; ++i) { if (m_buffers[c][i] > peak) { peak = m_buffers[c][i]; } } if (c == 0) peakLeft = peak; if (c == 1 || m_outputChannels == 1) peakRight = peak; } v_interleave (output, m_buffers, m_outputChannels, nframes); m_source->setOutputLevels(peakLeft, peakRight); } else if (m_outputChannels > 0) { v_zero(output, m_outputChannels * nframes); } return 0; } } #endif /* HAVE_PORTAUDIO */ sonic-visualiser-3.0.3/bqaudioio/src/PortAudioIO.h0000644000000000000000000000707213111512442020214 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_PORTAUDIO_IO_H #define BQAUDIOIO_PORTAUDIO_IO_H #ifdef HAVE_PORTAUDIO #include #include "SystemAudioIO.h" #include "AudioFactory.h" #include "Mode.h" #include #include namespace breakfastquay { class ApplicationRecordTarget; class ApplicationPlaybackSource; class PortAudioIO : public SystemAudioIO { public: PortAudioIO(Mode mode, ApplicationRecordTarget *recordTarget, ApplicationPlaybackSource *playSource, std::string recordDevice, std::string playbackDevice); virtual ~PortAudioIO(); static std::vector getRecordDeviceNames(); static std::vector getPlaybackDeviceNames(); virtual bool isSourceOK() const override; virtual bool isTargetOK() const override; virtual double getCurrentTime() const override; virtual void suspend() override; virtual void resume() override; std::string getStartupErrorString() const { return m_startupError; } protected: int process(const void *input, void *output, unsigned long frames, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags); static PaError openStream(Mode, PaStream **, const PaStreamParameters *, const PaStreamParameters *, double, unsigned long, void *); static int processStatic(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, PaStreamCallbackFlags, void *); PaStream *m_stream; Mode m_mode; int m_bufferSize; double m_sampleRate; int m_sourceChannels; int m_targetChannels; int m_inputChannels; int m_outputChannels; int m_inputLatency; int m_outputLatency; bool m_prioritySet; bool m_suspended; float **m_buffers; int m_bufferChannels; std::string m_startupError; PortAudioIO(const PortAudioIO &)=delete; PortAudioIO &operator=(const PortAudioIO &)=delete; }; } #endif /* HAVE_PORTAUDIO */ #endif sonic-visualiser-3.0.3/bqaudioio/src/PulseAudioIO.cpp0000644000000000000000000005267013111512442020717 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef HAVE_LIBPULSE #include "PulseAudioIO.h" #include "ApplicationPlaybackSource.h" #include "ApplicationRecordTarget.h" #include "Gains.h" #include "Log.h" #include "bqvec/VectorOps.h" #include "bqvec/Allocators.h" #include #include #include #include using namespace std; //#define DEBUG_PULSE_AUDIO_IO 1 namespace breakfastquay { static void log(string message) { Log::log("PulseAudioIO: " + message); } static string defaultDeviceName = "Default Device"; vector PulseAudioIO::getRecordDeviceNames() { return { defaultDeviceName }; } vector PulseAudioIO::getPlaybackDeviceNames() { return { defaultDeviceName }; } PulseAudioIO::PulseAudioIO(Mode mode, ApplicationRecordTarget *target, ApplicationPlaybackSource *source, string /* recordDevice */, string /* playbackDevice */) : SystemAudioIO(target, source), m_mode(mode), m_loop(0), m_api(0), m_context(0), m_in(0), m_out(0), m_buffers(0), m_interleaved(0), m_bufferChannels(0), m_bufferSize(0), m_sampleRate(0), m_done(false), m_captureReady(false), m_playbackReady(false), m_suspended(false) { log("starting"); if (m_mode == Mode::Playback) { m_target = 0; } if (m_mode == Mode::Record) { m_source = 0; } m_name = (source ? source->getClientName() : target ? target->getClientName() : "bqaudioio"); m_loop = pa_mainloop_new(); if (!m_loop) { m_startupError = "Failed to create PulseAudio main loop"; log("ERROR: " + m_startupError); return; } m_api = pa_mainloop_get_api(m_loop); int sourceRate = 0; int targetRate = 0; if (m_source) { sourceRate = m_source->getApplicationSampleRate(); if (sourceRate != 0) { m_sampleRate = sourceRate; } m_outSpec.channels = 2; if (m_source->getApplicationChannelCount() != 0) { m_outSpec.channels = (uint8_t)m_source->getApplicationChannelCount(); } } else { m_outSpec.channels = 0; } if (m_target) { targetRate = m_target->getApplicationSampleRate(); if (targetRate != 0) { if (sourceRate != 0 && sourceRate != targetRate) { ostringstream os; os << "WARNING: PulseAudioIO: Source and target both provide sample rates, but different ones (source " << sourceRate << ", target " << targetRate << ") - using source rate"; log(os.str()); } else { m_sampleRate = targetRate; } } m_inSpec.channels = 2; if (m_target->getApplicationChannelCount() != 0) { m_inSpec.channels = (uint8_t)m_target->getApplicationChannelCount(); } } else { m_inSpec.channels = 0; } if (m_sampleRate == 0) { m_sampleRate = 44100; } m_bufferSize = m_sampleRate / 2; // initially m_inSpec.rate = m_sampleRate; m_outSpec.rate = m_sampleRate; m_inSpec.format = PA_SAMPLE_FLOAT32NE; m_outSpec.format = PA_SAMPLE_FLOAT32NE; m_bufferChannels = std::max(m_inSpec.channels, m_outSpec.channels); m_buffers = allocate_and_zero_channels(m_bufferChannels, m_bufferSize); m_interleaved = allocate_and_zero(m_bufferChannels * m_bufferSize); m_context = pa_context_new(m_api, m_name.c_str()); if (!m_context) { m_startupError = "Failed to create PulseAudio context object"; log("ERROR: " + m_startupError); return; } pa_context_set_state_callback(m_context, contextStateChangedStatic, this); pa_context_connect(m_context, 0, (pa_context_flags_t)0, 0); // default server m_loopthread = thread([this]() { threadRun(); }); log("started successfully"); } PulseAudioIO::~PulseAudioIO() { log("closing"); if (m_context) { // (if we have no m_context, then we never started up PA // successfully at all so there's nothing to do for this bit) { if (m_loop) { pa_mainloop_wakeup(m_loop); } lock_guard cguard(m_contextMutex); lock_guard lguard(m_loopMutex); lock_guard sguard(m_streamMutex); m_done = true; if (m_loop) { pa_signal_done(); pa_mainloop_quit(m_loop, 0); } } m_loopthread.join(); { lock_guard sguard(m_streamMutex); if (m_in) { pa_stream_unref(m_in); m_in = 0; } if (m_out) { pa_stream_unref(m_out); m_out = 0; } } { lock_guard cguard(m_contextMutex); if (m_context) { pa_context_unref(m_context); m_context = 0; } } } deallocate_channels(m_buffers, m_bufferChannels); deallocate(m_interleaved); log("closed"); } void PulseAudioIO::threadRun() { int rv = 0; while (1) { { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::threadRun: locking loop mutex for prepare" << endl; #endif lock_guard lguard(m_loopMutex); if (m_done) return; //!!! not nice rv = pa_mainloop_prepare(m_loop, 1000); if (rv < 0) { log("ERROR: threadRun: Failure in pa_mainloop_prepare"); return; } } { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::threadRun: locking loop mutex for poll" << endl; #endif lock_guard lguard(m_loopMutex); if (m_done) return; rv = pa_mainloop_poll(m_loop); } if (rv < 0) { log("ERROR: threadRun: Failure in pa_mainloop_poll"); return; } { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::threadRun: locking loop mutex for dispatch" << endl; #endif lock_guard lguard(m_loopMutex); if (m_done) return; rv = pa_mainloop_dispatch(m_loop); if (rv < 0) { log("ERROR: threadRun: Failure in pa_mainloop_dispatch"); return; } } } } bool PulseAudioIO::isSourceOK() const { if (m_mode == Mode::Playback) { // record source is irrelevant in playback mode return true; } else { return (m_context != 0); } } bool PulseAudioIO::isTargetOK() const { if (m_mode == Mode::Record) { // playback target is irrelevant in record mode return true; } else { return (m_context != 0); } } bool PulseAudioIO::isSourceReady() const { return m_captureReady; } bool PulseAudioIO::isTargetReady() const { return m_playbackReady; } double PulseAudioIO::getCurrentTime() const { if (!m_out) return 0.0; pa_usec_t usec = 0; pa_stream_get_time(m_out, &usec); return double(usec) / 1000000.0; } void PulseAudioIO::streamWriteStatic(pa_stream *, size_t length, void *data) { PulseAudioIO *io = (PulseAudioIO *)data; if (length > INT_MAX) return; io->streamWrite(int(length)); } void PulseAudioIO::checkBufferCapacity(int nframes) { if (nframes > m_bufferSize) { m_buffers = reallocate_and_zero_extend_channels (m_buffers, m_bufferChannels, m_bufferSize, m_bufferChannels, nframes); m_interleaved = reallocate (m_interleaved, m_bufferChannels * m_bufferSize, m_bufferChannels * nframes); m_bufferSize = nframes; } } void PulseAudioIO::streamWrite(int requested) { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamWrite(" << requested << ")" << endl; #endif #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamWrite: locking stream mutex" << endl; #endif // Pulse is a consumer system with long buffers, this is not a RT // context like the other drivers lock_guard guard(m_streamMutex); if (m_done) return; if (!m_source) return; pa_usec_t latency = 0; int negative = 0; if (!pa_stream_get_latency(m_out, &latency, &negative)) { int latframes = latencyFrames(latency); if (latframes > 0) m_source->setSystemPlaybackLatency(latframes); } int channels = m_outSpec.channels; if (channels == 0) return; int nframes = requested / int(channels * sizeof(float)); checkBufferCapacity(nframes); #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamWrite: nframes = " << nframes << endl; #endif int received = m_source->getSourceSamples(m_buffers, channels, nframes); if (received < nframes) { for (int c = 0; c < channels; ++c) { v_zero(m_buffers[c] + received, nframes - received); } } float peakLeft = 0.0, peakRight = 0.0; auto gain = Gains::gainsFor(m_outputGain, m_outputBalance, channels); for (int c = 0; c < channels; ++c) { v_scale(m_buffers[c], gain[c], nframes); } for (int c = 0; c < channels && c < 2; ++c) { float peak = 0.f; for (int i = 0; i < nframes; ++i) { if (m_buffers[c][i] > peak) { peak = m_buffers[c][i]; } } if (c == 0) peakLeft = peak; if (c == 1 || channels == 1) peakRight = peak; } v_interleave(m_interleaved, m_buffers, channels, nframes); #ifdef DEBUG_PULSE_AUDIO_IO cerr << "calling pa_stream_write with " << nframes * channels * sizeof(float) << " bytes" << endl; #endif pa_stream_write(m_out, m_interleaved, nframes * channels * sizeof(float), 0, 0, PA_SEEK_RELATIVE); m_source->setOutputLevels(peakLeft, peakRight); return; } void PulseAudioIO::streamReadStatic(pa_stream *, size_t length, void *data) { PulseAudioIO *io = (PulseAudioIO *)data; if (length > INT_MAX) return; io->streamRead(int(length)); } void PulseAudioIO::streamRead(int available) { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamRead(" << available << ")" << endl; #endif #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamRead: locking stream mutex" << endl; #endif lock_guard guard(m_streamMutex); if (m_done) return; if (!m_target) return; pa_usec_t latency = 0; int negative = 0; if (!pa_stream_get_latency(m_in, &latency, &negative)) { int latframes = latencyFrames(latency); if (latframes > 0) m_target->setSystemRecordLatency(latframes); } int channels = m_inSpec.channels; if (channels == 0) return; int nframes = available / int(channels * sizeof(float)); #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamRead: nframes = " << nframes << endl; #endif checkBufferCapacity(nframes); float peakLeft = 0.0, peakRight = 0.0; size_t actual = available; const void *input = 0; pa_stream_peek(m_in, &input, &actual); int actualFrames = int(actual) / int(channels * sizeof(float)); if (actualFrames < nframes) { ostringstream os; os << "WARNING: streamRead: read " << actualFrames << " frames, expected " << nframes; log(os.str()); } const float *finput = (const float *)input; v_deinterleave(m_buffers, finput, channels, actualFrames); for (int c = 0; c < channels && c < 2; ++c) { float peak = 0.f; for (int i = 0; i < actualFrames; ++i) { if (m_buffers[c][i] > peak) { peak = m_buffers[c][i]; } } if (c == 0) peakLeft = peak; if (c > 0 || channels == 1) peakRight = peak; } m_target->putSamples(m_buffers, channels, actualFrames); m_target->setInputLevels(peakLeft, peakRight); pa_stream_drop(m_in); return; } void PulseAudioIO::streamStateChangedStatic(pa_stream *stream, void *data) { PulseAudioIO *io = (PulseAudioIO *)data; io->streamStateChanged(stream); } void PulseAudioIO::streamStateChanged(pa_stream *stream) { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamStateChanged" << endl; #endif #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamStateChanged: locking stream mutex" << endl; #endif lock_guard guard(m_streamMutex); if (m_done) return; assert(stream == m_in || stream == m_out); switch (pa_stream_get_state(stream)) { case PA_STREAM_UNCONNECTED: case PA_STREAM_CREATING: case PA_STREAM_TERMINATED: break; case PA_STREAM_READY: { if (stream == m_in) { log("streamStateChanged: Capture ready"); m_captureReady = true; } else { log("streamStateChanged: Playback ready"); m_playbackReady = true; } pa_usec_t latency = 0; int negative = 0; if (m_source && (stream == m_out)) { m_source->setSystemPlaybackSampleRate(m_sampleRate); m_source->setSystemPlaybackChannelCount(m_outSpec.channels); if (pa_stream_get_latency(m_out, &latency, &negative)) { log("streamStateChanged: Failed to query playback latency"); } else { ostringstream os; int latframes = latencyFrames(latency); os << "playback latency = " << latency << " usec, " << latframes << " frames"; log(os.str()); m_source->setSystemPlaybackLatency(latframes); } } if (m_target && (stream == m_in)) { m_target->setSystemRecordSampleRate(m_sampleRate); m_target->setSystemRecordChannelCount(m_inSpec.channels); if (pa_stream_get_latency(m_out, &latency, &negative)) { log("streamStateChanged: Failed to query record latency"); } else { ostringstream os; int latframes = latencyFrames(latency); os << "record latency = " << latency << " usec, " << latframes << " frames"; log(os.str()); m_target->setSystemRecordLatency(latframes); } } break; } case PA_STREAM_FAILED: default: log(string("streamStateChanged: Error: ") + pa_strerror(pa_context_errno(m_context))); //!!! do something... break; } #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::streamStateChanged complete" << endl; #endif } void PulseAudioIO::suspend() { if (m_loop) pa_mainloop_wakeup(m_loop); #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::suspend: locking all mutexes" << endl; #endif { lock_guard cguard(m_contextMutex); if (m_suspended) return; } lock_guard lguard(m_loopMutex); lock_guard sguard(m_streamMutex); if (m_done) return; if (m_in) { pa_stream_cork(m_in, 1, 0, 0); pa_stream_flush(m_in, 0, 0); } if (m_out) { pa_stream_cork(m_out, 1, 0, 0); pa_stream_flush(m_out, 0, 0); } m_suspended = true; #ifdef DEBUG_PULSE_AUDIO_IO cerr << "corked!" << endl; #endif } void PulseAudioIO::resume() { if (m_loop) pa_mainloop_wakeup(m_loop); #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::resume: locking all mutexes" << endl; #endif { lock_guard cguard(m_contextMutex); if (!m_suspended) return; } lock_guard lguard(m_loopMutex); lock_guard sguard(m_streamMutex); if (m_done) return; if (m_in) { pa_stream_flush(m_in, 0, 0); pa_stream_cork(m_in, 0, 0, 0); } if (m_out) { pa_stream_cork(m_out, 0, 0, 0); } m_suspended = false; #ifdef DEBUG_PULSE_AUDIO_IO cerr << "uncorked!" << endl; #endif } void PulseAudioIO::contextStateChangedStatic(pa_context *, void *data) { PulseAudioIO *io = (PulseAudioIO *)data; io->contextStateChanged(); } void PulseAudioIO::contextStateChanged() { #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::contextStateChanged" << endl; #endif #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::contextStateChanged: locking context mutex" << endl; #endif lock_guard guard(m_contextMutex); switch (pa_context_get_state(m_context)) { case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_READY: { log("contextStateChanged: Ready"); pa_stream_flags_t flags; flags = pa_stream_flags_t(PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE); if (m_suspended) { flags = pa_stream_flags_t(flags | PA_STREAM_START_CORKED); } if (m_inSpec.channels > 0) { m_in = pa_stream_new(m_context, "Capture", &m_inSpec, 0); if (!m_in) { log("contextStateChanged: Failed to create capture stream"); } else { pa_stream_set_state_callback(m_in, streamStateChangedStatic, this); pa_stream_set_read_callback(m_in, streamReadStatic, this); pa_stream_set_overflow_callback(m_in, streamOverflowStatic, this); pa_stream_set_underflow_callback(m_in, streamUnderflowStatic, this); if (pa_stream_connect_record (m_in, 0, 0, flags)) { log("contextStateChanged: Failed to connect record stream"); } } } if (m_outSpec.channels > 0) { m_out = pa_stream_new(m_context, "Playback", &m_outSpec, 0); if (!m_out) { log("contextStateChanged: Failed to create playback stream"); } else { pa_stream_set_state_callback(m_out, streamStateChangedStatic, this); pa_stream_set_write_callback(m_out, streamWriteStatic, this); pa_stream_set_overflow_callback(m_out, streamOverflowStatic, this); pa_stream_set_underflow_callback(m_out, streamUnderflowStatic, this); if (pa_stream_connect_playback(m_out, 0, 0, flags, 0, 0)) { log("contextStateChanged: Failed to connect playback stream"); } } } break; } case PA_CONTEXT_TERMINATED: log("contextStateChanged: Terminated"); break; case PA_CONTEXT_FAILED: default: log(string("contextStateChanged: Error: ") + pa_strerror(pa_context_errno(m_context))); break; } #ifdef DEBUG_PULSE_AUDIO_IO cerr << "PulseAudioIO::contextStateChanged complete" << endl; #endif } void PulseAudioIO::streamOverflowStatic(pa_stream *, void *data) { log("streamOverflowStatic: Overflow!"); PulseAudioIO *io = (PulseAudioIO *)data; if (io->m_target) io->m_target->audioProcessingOverload(); if (io->m_source) io->m_source->audioProcessingOverload(); } void PulseAudioIO::streamUnderflowStatic(pa_stream *, void *data) { log("streamUnderflowStatic: Underflow!"); PulseAudioIO *io = (PulseAudioIO *)data; if (io->m_target) io->m_target->audioProcessingOverload(); if (io->m_source) io->m_source->audioProcessingOverload(); } } #endif /* HAVE_LIBPULSE */ sonic-visualiser-3.0.3/bqaudioio/src/PulseAudioIO.h0000644000000000000000000000772713111512442020367 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQAUDIOIO_PULSE_AUDIO_IO_H #define BQAUDIOIO_PULSE_AUDIO_IO_H #ifdef HAVE_LIBPULSE #include #include "SystemAudioIO.h" #include "AudioFactory.h" #include "Mode.h" #include #include #include #include namespace breakfastquay { class ApplicationRecordTarget; class ApplicationPlaybackSource; class PulseAudioIO : public SystemAudioIO { public: PulseAudioIO(Mode mode, ApplicationRecordTarget *recordTarget, ApplicationPlaybackSource *playSource, std::string recordDevice, std::string playbackDevice); virtual ~PulseAudioIO(); static std::vector getRecordDeviceNames(); static std::vector getPlaybackDeviceNames(); virtual bool isSourceOK() const; virtual bool isSourceReady() const; virtual bool isTargetOK() const; virtual bool isTargetReady() const; virtual double getCurrentTime() const; virtual void suspend(); virtual void resume(); std::string getStartupErrorString() const { return m_startupError; } protected: void streamWrite(int); void streamRead(int); void streamStateChanged(pa_stream *); void contextStateChanged(); static void streamWriteStatic(pa_stream *, size_t, void *); static void streamReadStatic(pa_stream *, size_t, void *); static void streamStateChangedStatic(pa_stream *, void *); static void streamOverflowStatic(pa_stream *, void *); static void streamUnderflowStatic(pa_stream *, void *); static void contextStateChangedStatic(pa_context *, void *); int latencyFrames(pa_usec_t latusec) { return int((double(latusec) / 1000000.0) * double(m_sampleRate)); } std::mutex m_loopMutex; std::mutex m_contextMutex; mutable std::mutex m_streamMutex; std::thread m_loopthread; void threadRun(); Mode m_mode; std::string m_name; pa_mainloop *m_loop; pa_mainloop_api *m_api; pa_context *m_context; pa_stream *m_in; pa_stream *m_out; pa_sample_spec m_inSpec; pa_sample_spec m_outSpec; float **m_buffers; float *m_interleaved; int m_bufferChannels; int m_bufferSize; int m_sampleRate; bool m_done; bool m_captureReady; bool m_playbackReady; bool m_suspended; std::string m_startupError; void checkBufferCapacity(int nframes); PulseAudioIO(const PulseAudioIO &)=delete; PulseAudioIO &operator=(const PulseAudioIO &)=delete; }; } #endif /* HAVE_LIBPULSE */ #endif sonic-visualiser-3.0.3/bqaudioio/src/ResamplerWrapper.cpp0000644000000000000000000002055713111512442021707 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "ResamplerWrapper.h" #include "bqresample/Resampler.h" #include "bqvec/Allocators.h" #include "bqvec/VectorOps.h" #include "ApplicationPlaybackSource.h" #include //#define DEBUG_RESAMPLER_WRAPPER 1 using namespace std; namespace breakfastquay { static int defaultMaxBufferSize = 10240; // bigger will require dynamic resizing ResamplerWrapper::ResamplerWrapper(ApplicationPlaybackSource *source) : m_source(source), m_targetRate(44100), // will update when the target calls back m_sourceRate(0), m_resampler(0), m_in(0), m_inSize(0), m_resampled(0), m_resampledSize(0), m_resampledFill(0), m_ptrs(0) { m_sourceRate = m_source->getApplicationSampleRate(); // Note, m_sourceRate might be zero if the application is happy to // allow the device to be opened at any rate. We can't actually // work with a zero source rate, but the application may change it // through a call to changeApplicationSampleRate() before playback // begins, so we have to allow this at this point. m_channels = m_source->getApplicationChannelCount(); Resampler::Parameters params; params.quality = Resampler::FastestTolerable; params.maxBufferSize = defaultMaxBufferSize; if (m_sourceRate != 0) { params.initialSampleRate = m_sourceRate; } m_resampler = new Resampler(params, m_channels); m_ptrs = new float *[m_channels]; setupBuffersFor(defaultMaxBufferSize); } ResamplerWrapper::~ResamplerWrapper() { delete m_resampler; delete[] m_ptrs; if (m_in) { deallocate_channels(m_in, m_channels); deallocate_channels(m_resampled, m_channels); } } void ResamplerWrapper::changeApplicationSampleRate(int newRate) { m_sourceRate = newRate; setupBuffersFor(defaultMaxBufferSize); } std::string ResamplerWrapper::getClientName() const { return m_source->getClientName(); } int ResamplerWrapper::getApplicationSampleRate() const { // Although we could return 0 here (as we can accept any rate from // the target), things are simplest if the target can offer the // rate that we actually do want. But this isn't supposed to // change, so call this source function rather than returning our // m_sourceRate (which is changeable) return m_source->getApplicationSampleRate(); } int ResamplerWrapper::getApplicationChannelCount() const { return m_source->getApplicationChannelCount(); } void ResamplerWrapper::setSystemPlaybackBlockSize(int) { } void ResamplerWrapper::setSystemPlaybackSampleRate(int rate) { m_targetRate = rate; m_source->setSystemPlaybackSampleRate(m_targetRate); } void ResamplerWrapper::setSystemPlaybackChannelCount(int c) { m_source->setSystemPlaybackChannelCount(c); } void ResamplerWrapper::setSystemPlaybackLatency(int latency) { m_source->setSystemPlaybackLatency(latency); } void ResamplerWrapper::setOutputLevels(float left, float right) { m_source->setOutputLevels(left, right); } void ResamplerWrapper::audioProcessingOverload() { m_source->audioProcessingOverload(); } void ResamplerWrapper::reset() { if (m_resampler) m_resampler->reset(); m_resampledFill = 0; } int ResamplerWrapper::getSourceSamples(float *const *samples, int nchannels, int nframes) { #ifdef DEBUG_RESAMPLER_WRAPPER cerr << "ResamplerWrapper::getSourceSamples(" << nframes << "): source rate = " << m_sourceRate << ", target rate = " << m_targetRate << ", channels = " << m_channels << endl; #endif setupBuffersFor(nframes); if (m_sourceRate == 0) { v_zero_channels(samples, nchannels, nframes); return nframes; } if (nchannels != m_channels) { cerr << "nchannels = " << nchannels << ", m_channels = " << m_channels << endl; throw std::logic_error("Different number of channels requested than ResamplerWrapper declared"); } if (m_sourceRate == m_targetRate) { return m_source->getSourceSamples(samples, nchannels, nframes); } double ratio = double(m_targetRate) / double(m_sourceRate); int reqResampled = nframes - m_resampledFill + 1; int req = int(round(reqResampled / ratio)) + 1; int received = m_source->getSourceSamples(m_in, m_channels, req); for (int i = 0; i < m_channels; ++i) { m_ptrs[i] = m_resampled[i] + m_resampledFill; } #ifdef DEBUG_RESAMPLER_WRAPPER cerr << "ResamplerWrapper: nframes = " << nframes << ", ratio = " << ratio << endl; cerr << "ResamplerWrapper: m_inSize = " << m_inSize << ", m_resampledSize = " << m_resampledSize << ", m_resampledFill = " << m_resampledFill << endl; cerr << "ResamplerWrapper: reqResampled = " << reqResampled << ", req = " << req << ", received = " << received << endl; #endif if (received > 0) { int resampled = m_resampler->resample (m_ptrs, m_resampledSize - m_resampledFill, m_in, received, ratio); m_resampledFill += resampled; #ifdef DEBUG_RESAMPLER_WRAPPER cerr << "ResamplerWrapper: resampled = " << resampled << ", m_resampledFill now = " << m_resampledFill << endl; #endif } if (m_resampledFill < nframes) { for (int i = 0; i < m_channels; ++i) { v_zero(m_resampled[i] + m_resampledFill, nframes - m_resampledFill); } m_resampledFill = nframes; } v_copy_channels(samples, m_resampled, m_channels, nframes); if (m_resampledFill > nframes) { for (int i = 0; i < m_channels; ++i) { m_ptrs[i] = m_resampled[i] + nframes; } v_move_channels(m_resampled, m_ptrs, m_channels, m_resampledFill - nframes); } m_resampledFill -= nframes; #ifdef DEBUG_RESAMPLER_WRAPPER cerr << "ResamplerWrapper: m_resampledFill now = " << m_resampledFill << " and returning nframes = " << nframes << endl; #endif return nframes; } void ResamplerWrapper::setupBuffersFor(int nframes) { if (m_sourceRate == 0) return; if (m_sourceRate == m_targetRate) return; #ifdef DEBUG_RESAMPLER_WRAPPER cerr << "ResamplerWrapper::setupBuffersFor: Source rate " << m_sourceRate << " -> target rate " << m_targetRate << endl; #endif int slack = 100; double ratio = double(m_targetRate) / double(m_sourceRate); if (ratio > 50.0) { slack = int(ratio * 2); } int newResampledSize = nframes + slack; int newInSize = int(newResampledSize / ratio); #ifdef DEBUG_RESAMPLER_WRAPPER cerr << "newResampledSize = " << newResampledSize << ", newInSize = " << newInSize << endl; #endif if (!m_resampled || newResampledSize > m_resampledSize) { m_resampled = reallocate_and_zero_extend_channels (m_resampled, m_channels, m_resampledSize, m_channels, newResampledSize); m_resampledSize = newResampledSize; } if (!m_in || newInSize > m_inSize) { m_in = reallocate_and_zero_extend_channels (m_in, m_channels, m_inSize, m_channels, newInSize); m_inSize = newInSize; } } } sonic-visualiser-3.0.3/bqaudioio/src/SystemPlaybackTarget.cpp0000644000000000000000000000404313111512442022506 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "SystemPlaybackTarget.h" namespace breakfastquay { SystemPlaybackTarget::SystemPlaybackTarget(ApplicationPlaybackSource *source) : m_source(source), m_outputGain(1.0), m_outputBalance(0.0) { } SystemPlaybackTarget::~SystemPlaybackTarget() { } void SystemPlaybackTarget::setOutputGain(float gain) { m_outputGain = gain; } float SystemPlaybackTarget::getOutputGain() const { return m_outputGain; } void SystemPlaybackTarget::setOutputBalance(float balance) { m_outputBalance = balance; } float SystemPlaybackTarget::getOutputBalance() const { return m_outputBalance; } } sonic-visualiser-3.0.3/bqaudioio/src/SystemRecordSource.cpp0000644000000000000000000000330713111512442022212 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqaudioio Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "SystemRecordSource.h" #include "ApplicationRecordTarget.h" #include namespace breakfastquay { SystemRecordSource::SystemRecordSource(ApplicationRecordTarget *target) : m_target(target) { } SystemRecordSource::~SystemRecordSource() { } } sonic-visualiser-3.0.3/bqfft/.hgignore0000644000000000000000000000012513111512442016037 0ustar 00000000000000syntax: glob *~ *.o *.so *.dylib *.dll *.a *.lib *.bak test-fft moc_* test/Makefile sonic-visualiser-3.0.3/bqfft/.travis.yml0000644000000000000000000000064313111512442016352 0ustar 00000000000000language: cpp os: - linux - osx addons: apt: packages: - libboost-test-dev - valgrind - libfftw3-dev before_install: - ( cd .. ; git clone https://github.com/breakfastquay/bqvec ) - ( cd .. ; curl -OL 'https://downloads.sourceforge.net/project/kissfft/kissfft/v1_3_0/kiss_fft130.tar.gz' && tar xvzf kiss_fft130.tar.gz ) script: - ./build/run-platform-tests.sh "$TRAVIS_OS_NAME" sonic-visualiser-3.0.3/bqfft/COPYING0000644000000000000000000000252713111512442015277 0ustar 00000000000000 Copyright 2007-2015 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/bqfft/Makefile0000644000000000000000000000241013111512442015673 0ustar 00000000000000 # Add to FFT_DEFINES the relevant options for your desired third-party # library support. # # Available options are # # -DHAVE_IPP Intel's Integrated Performance Primitives are available # -DHAVE_VDSP Apple's Accelerate framework is available # -DHAVE_FFTW3 The FFTW library is available # -DHAVE_KISSFFT The KissFFT library is available # -DHAVE_MEDIALIB The Medialib library (from Sun) is available # -DHAVE_OPENMAX The OpenMAX signal processing library is available # -DUSE_BUILTIN_FFT Compile the built-in FFT code (which is very slow) # # You may define more than one of these. If you define # USE_BUILTIN_FFT, the code will be compiled in but will only be used # if no other option is available. If no flags are supplied, the code # will refuse to compile. # WARNING! The default option here is VERY SLOW! Read above for better # alternatives! FFT_DEFINES := -DUSE_BUILTIN_FFT # Add to VECTOR_DEFINES and ALLOCATOR_DEFINES any options desired for # the bqvec library (that are not already defined in FFT_DEFINES). # See the bqvec build documentation for more details. # VECTOR_DEFINES := ALLOCATOR_DEFINES := # Add any related includes and libraries here # THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := include build/Makefile.inc sonic-visualiser-3.0.3/bqfft/README.md0000644000000000000000000000177413111512442015526 0ustar 00000000000000 bqfft ===== A small library wrapping various FFT implementations for some common audio processing use cases. Note this is not a general FFT interface, as it handles only power-of-two FFT sizes and real inputs. Requires the bqvec library. This code originated as part of the Rubber Band Library written by the same authors (see https://bitbucket.org/breakfastquay/rubberband/). It has been pulled out into a separate library and relicensed under a more permissive licence. C++ standard required: C++98 (does not use C++11 or newer features) * To compile on Linux: Edit Makefile to select implementation, then make test. Do read the notes in the Makefile, and don't attempt to use the default implementation, which is very slow * To compile on macOS: make -f build/Makefile.osx test [![Build Status](https://travis-ci.org/breakfastquay/bqfft.svg?branch=master)](https://travis-ci.org/breakfastquay/bqfft) Copyright 2007-2017 Particular Programs Ltd. See the file COPYING for (BSD/MIT-style) licence terms. sonic-visualiser-3.0.3/bqfft/bqfft/FFT.h0000644000000000000000000001304113111512442016127 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqfft A small library wrapping various FFT implementations for some common audio processing use cases. Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQFFT_FFT_H #define BQFFT_FFT_H #include #include #include namespace breakfastquay { class FFTImpl; /** * Provide basic FFT computations using one of a set of candidate FFT * implementations (depending on compile flags). * * Implements real->complex FFTs of power-of-two sizes only. Note * that only the first half of the output signal is returned (the * complex conjugates half is omitted), so the "complex" arrays need * room for size/2+1 elements. * * The "interleaved" functions use the format sometimes called CCS -- * size/2+1 real+imaginary pairs. So, the array elements at indices 1 * and size+1 will always be zero (since the signal is real). * * All pointer arguments must point to valid data. A NullArgument * exception is thrown if any argument is NULL. * * Neither forward nor inverse transform is scaled. * * This class is reentrant but not thread safe: use a separate * instance per thread, or use a mutex. */ class FFT { public: enum Exception { NullArgument, InvalidSize, InvalidImplementation, InternalError }; FFT(int size, int debugLevel = 0); // may throw InvalidSize ~FFT(); int getSize() const; void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut); void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut); void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut); void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut); void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut); void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut); void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut); void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut); void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut); void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut); void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut); void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut); void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut); void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut); void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut); void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut); // Calling one or both of these is optional -- if neither is // called, the first call to a forward or inverse method will call // init(). You only need call these if you don't want to risk // expensive allocations etc happening in forward or inverse. void initFloat(); void initDouble(); enum Precision { SinglePrecision = 0x1, DoublePrecision = 0x2 }; typedef int Precisions; /** * Return the OR of all precisions supported by this * implementation. All of the functions (float and double) are * available regardless of the supported implementations, but they * will be calculated at the proper precision only if it is * available. (So float functions will be calculated using doubles * and then truncated if single-precision is unavailable, and * double functions will use single-precision arithmetic if double * is unavailable.) */ Precisions getSupportedPrecisions() const; static std::set getImplementations(); static std::string getDefaultImplementation(); static void setDefaultImplementation(std::string); #ifdef FFT_MEASUREMENT static std::string tune(); #endif protected: FFTImpl *d; static std::string m_implementation; static void pickDefaultImplementation(); private: FFT(const FFT &); // not provided FFT &operator=(const FFT &); // not provided }; } #endif sonic-visualiser-3.0.3/bqfft/build/Makefile.inc0000644000000000000000000000203413111512442017544 0ustar 00000000000000 SRC_DIR := src TEST_DIR := test HEADER_DIR := bqfft SOURCES := $(wildcard $(SRC_DIR)/*.cpp) HEADERS := $(wildcard $(HEADER_DIR)/*.h) $(wildcard $(SRC_DIR)/*.h) OBJECTS := $(SOURCES:.cpp=.o) OBJECTS := $(OBJECTS:.c=.o) TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) TEST_OBJECTS := $(TEST_SOURCES:.cpp=.o) OPTFLAGS ?= -O3 -ffast-math CXXFLAGS ?= -std=c++98 -Wall -Wextra -Werror $(FFT_DEFINES) $(VECTOR_DEFINES) $(ALLOCATOR_DEFINES) $(OPTFLAGS) -I. $(THIRD_PARTY_INCLUDES) -I../bqvec -fpic LIBRARY := libbqfft.a all: $(LIBRARY) test: $(LIBRARY) test-fft ./test-fft valgrind: $(LIBRARY) test-fft valgrind ./test-fft $(LIBRARY): $(OBJECTS) $(AR) rc $@ $^ test-fft: test/TestFFT.o $(LIBRARY) $(CXX) $(CXXFLAGS) -o $@ $^ -lboost_unit_test_framework -L. -lbqfft -L../bqvec -lbqvec $(THIRD_PARTY_LIBS) clean: rm -f $(OBJECTS) $(TEST_OBJECTS) distclean: clean rm -f $(LIBRARY) test-fft depend: makedepend -Y -fbuild/Makefile.inc $(SOURCES) $(HEADERS) $(TEST_SOURCES) # DO NOT DELETE src/FFT.o: bqfft/FFT.h test/TestFFT.o: bqfft/FFT.h sonic-visualiser-3.0.3/bqfft/build/Makefile.linux.fftw0000644000000000000000000000027313111512442021102 0ustar 00000000000000 FFT_DEFINES := -DHAVE_FFTW3 VECTOR_DEFINES := ALLOCATOR_DEFINES := -DHAVE_POSIX_MEMALIGN THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := -lfftw3 -lfftw3f include build/Makefile.inc sonic-visualiser-3.0.3/bqfft/build/Makefile.linux.ipp0000644000000000000000000000042513111512442020723 0ustar 00000000000000 FFT_DEFINES := -DHAVE_IPP VECTOR_DEFINES := ALLOCATOR_DEFINES := -DHAVE_POSIX_MEMALIGN THIRD_PARTY_INCLUDES := -I/opt/intel/ipp/include THIRD_PARTY_LIBS := -L/opt/intel/ipp/lib/intel64_lin -Wl,-Bstatic -lipps -lippvm -lippcore -Wl,-Bdynamic include build/Makefile.inc sonic-visualiser-3.0.3/bqfft/build/Makefile.osx0000644000000000000000000000027513111512442017611 0ustar 00000000000000 FFT_DEFINES := -DHAVE_VDSP VECTOR_DEFINES := ALLOCATOR_DEFINES := -DMALLOC_IS_ALIGNED THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := -framework Accelerate include build/Makefile.inc sonic-visualiser-3.0.3/bqfft/build/run-platform-tests.sh0000755000000000000000000000325513111512442021467 0ustar 00000000000000#!/bin/bash if [ -z "$1" ]; then echo "Usage: $0 " exit 2 fi platformtag="$1" set -eu ippdir=/opt/intel/ipp echo if [ -d "$ippdir" ]; then echo "Found IPP directory $ippdir, considering IPP as well as other options" else echo "No IPP directory $ippdir, not testing with IPP" fi if valgrind --version >/dev/null 2>&1 ; then have_valgrind=yes else echo echo "No valgrind executable found, not using valgrind" have_valgrind=no fi tmpfile=$(mktemp "/tmp/test_XXXXXX") trap "rm -f $tmpfile" 0 run() { successtext="$1" shift echo -n "Running \"$@\"..." if "$@" > "$tmpfile" 2>&1 ; then if [ -z "$successtext" ] || fgrep -q "$successtext" "$tmpfile" ; then echo " OK" return 0 else echo " Failed" cat "$tmpfile" return 1 fi else echo " Failed" cat "$tmpfile" return 1 fi } for mf in Makefile build/Makefile.$platformtag build/Makefile.$platformtag.* ; do case "$mf" in *~) continue;; *.bak) continue;; *ipp) if [ ! -d "$ippdir" ]; then continue fi;; esac if [ ! -f "$mf" ]; then continue fi echo echo "Building and testing with $mf:" echo if [ -f "../bqvec/$mf" ]; then echo "Similar Makefile exists in bqvec dir, building there first..." ( cd ../bqvec ; run "" make -f "$mf" clean && run "" make -f "$mf" ) echo "Build in bqvec done" echo fi run "" make -f "$mf" clean run "No errors detected" make -f "$mf" test if [ "$have_valgrind" = "yes" ]; then for t in test-* ; do if [ -x "$t" ]; then run "no leaks are possible" valgrind --leak-check=full ./"$t" fi done fi done echo echo "All tests passed" echo sonic-visualiser-3.0.3/bqfft/src/FFT.cpp0000644000000000000000000033127513111512442016163 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqfft A small library wrapping various FFT implementations for some common audio processing use cases. Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "bqfft/FFT.h" //#include "system/Thread.h" #include #include #include // Define USE_FFTW_WISDOM if you are defining HAVE_FFTW3 and you want // to use FFTW_MEASURE mode with persistent wisdom files. This will // make things much slower on first use if no suitable wisdom has been // saved, but may be faster during subsequent use. //#define USE_FFTW_WISDOM 1 // Define FFT_MEASUREMENT to include timing measurement code callable // via the static method FFT::tune(). Must be defined when the header // is included as well. //#define FFT_MEASUREMENT 1 #ifdef FFT_MEASUREMENT #include #endif #ifdef HAVE_IPP #include #include #endif #ifdef HAVE_FFTW3 #include #endif #ifdef HAVE_VDSP #include #endif #ifdef HAVE_MEDIALIB #include #endif #ifdef HAVE_OPENMAX #include #endif #ifdef HAVE_SFFT extern "C" { #include } #endif #ifdef HAVE_KISSFFT #include "kiss_fftr.h" #endif #ifndef HAVE_IPP #ifndef HAVE_FFTW3 #ifndef HAVE_KISSFFT #ifndef USE_BUILTIN_FFT #ifndef HAVE_VDSP #ifndef HAVE_MEDIALIB #ifndef HAVE_OPENMAX #ifndef HAVE_SFFT #error No FFT implementation selected! #endif #endif #endif #endif #endif #endif #endif #endif #include #include #include #include #include #include #ifdef FFT_MEASUREMENT #ifndef _WIN32 #include #endif #endif #ifdef _WIN32 #include #endif namespace breakfastquay { class FFTImpl { public: virtual ~FFTImpl() { } virtual FFT::Precisions getSupportedPrecisions() const = 0; virtual int getSize() const = 0; virtual void initFloat() = 0; virtual void initDouble() = 0; virtual void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) = 0; virtual void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) = 0; virtual void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) = 0; virtual void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) = 0; virtual void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) = 0; virtual void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) = 0; virtual void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) = 0; virtual void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) = 0; virtual void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) = 0; virtual void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) = 0; virtual void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) = 0; virtual void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) = 0; virtual void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) = 0; virtual void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) = 0; virtual void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) = 0; virtual void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) = 0; }; namespace FFTs { #ifdef HAVE_IPP class D_IPP : public FFTImpl { public: D_IPP(int size) : m_size(size), m_fspec(0), m_dspec(0) { for (int i = 0; ; ++i) { if (m_size & (1 << i)) { m_order = i; break; } } } ~D_IPP() { if (m_fspec) { #if (IPP_VERSION_MAJOR >= 9) ippsFree(m_fspecbuf); #else ippsFFTFree_R_32f(m_fspec); #endif ippsFree(m_fbuf); ippsFree(m_fpacked); ippsFree(m_fspare); } if (m_dspec) { #if (IPP_VERSION_MAJOR >= 9) ippsFree(m_dspecbuf); #else ippsFFTFree_R_64f(m_dspec); #endif ippsFree(m_dbuf); ippsFree(m_dpacked); ippsFree(m_dspare); } } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { return FFT::SinglePrecision | FFT::DoublePrecision; } //!!! rv check void initFloat() { if (m_fspec) return; #if (IPP_VERSION_MAJOR >= 9) int specSize, specBufferSize, bufferSize; ippsFFTGetSize_R_32f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, &specSize, &specBufferSize, &bufferSize); m_fspecbuf = ippsMalloc_8u(specSize); Ipp8u *tmp = ippsMalloc_8u(specBufferSize); m_fbuf = ippsMalloc_8u(bufferSize); m_fpacked = ippsMalloc_32f(m_size + 2); m_fspare = ippsMalloc_32f(m_size / 2 + 1); ippsFFTInit_R_32f(&m_fspec, m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, m_fspecbuf, tmp); ippsFree(tmp); #else int specSize, specBufferSize, bufferSize; ippsFFTGetSize_R_32f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, &specSize, &specBufferSize, &bufferSize); m_fbuf = ippsMalloc_8u(bufferSize); m_fpacked = ippsMalloc_32f(m_size + 2); m_fspare = ippsMalloc_32f(m_size / 2 + 1); ippsFFTInitAlloc_R_32f(&m_fspec, m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast); #endif } void initDouble() { if (m_dspec) return; #if (IPP_VERSION_MAJOR >= 9) int specSize, specBufferSize, bufferSize; ippsFFTGetSize_R_64f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, &specSize, &specBufferSize, &bufferSize); m_dspecbuf = ippsMalloc_8u(specSize); Ipp8u *tmp = ippsMalloc_8u(specBufferSize); m_dbuf = ippsMalloc_8u(bufferSize); m_dpacked = ippsMalloc_64f(m_size + 2); m_dspare = ippsMalloc_64f(m_size / 2 + 1); ippsFFTInit_R_64f(&m_dspec, m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, m_dspecbuf, tmp); ippsFree(tmp); #else int specSize, specBufferSize, bufferSize; ippsFFTGetSize_R_64f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, &specSize, &specBufferSize, &bufferSize); m_dbuf = ippsMalloc_8u(bufferSize); m_dpacked = ippsMalloc_64f(m_size + 2); m_dspare = ippsMalloc_64f(m_size / 2 + 1); ippsFFTInitAlloc_R_64f(&m_dspec, m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast); #endif } void packFloat(const float *BQ_R__ re, const float *BQ_R__ im) { int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[index++] = re[i]; index++; } index = 0; if (im) { for (int i = 0; i <= hs; ++i) { index++; m_fpacked[index++] = im[i]; } } else { for (int i = 0; i <= hs; ++i) { index++; m_fpacked[index++] = 0.f; } } } void packDouble(const double *BQ_R__ re, const double *BQ_R__ im) { int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_dpacked[index++] = re[i]; index++; } index = 0; if (im) { for (int i = 0; i <= hs; ++i) { index++; m_dpacked[index++] = im[i]; } } else { for (int i = 0; i <= hs; ++i) { index++; m_dpacked[index++] = 0.0; } } } void unpackFloat(float *re, float *BQ_R__ im) { // re may be equal to m_fpacked int index = 0; const int hs = m_size/2; if (im) { for (int i = 0; i <= hs; ++i) { index++; im[i] = m_fpacked[index++]; } } index = 0; for (int i = 0; i <= hs; ++i) { re[i] = m_fpacked[index++]; index++; } } void unpackDouble(double *re, double *BQ_R__ im) { // re may be equal to m_dpacked int index = 0; const int hs = m_size/2; if (im) { for (int i = 0; i <= hs; ++i) { index++; im[i] = m_dpacked[index++]; } } index = 0; for (int i = 0; i <= hs; ++i) { re[i] = m_dpacked[index++]; index++; } } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { if (!m_dspec) initDouble(); ippsFFTFwd_RToCCS_64f(realIn, m_dpacked, m_dspec, m_dbuf); unpackDouble(realOut, imagOut); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { if (!m_dspec) initDouble(); ippsFFTFwd_RToCCS_64f(realIn, complexOut, m_dspec, m_dbuf); } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { if (!m_dspec) initDouble(); ippsFFTFwd_RToCCS_64f(realIn, m_dpacked, m_dspec, m_dbuf); unpackDouble(m_dpacked, m_dspare); ippsCartToPolar_64f(m_dpacked, m_dspare, magOut, phaseOut, m_size/2+1); } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { if (!m_dspec) initDouble(); ippsFFTFwd_RToCCS_64f(realIn, m_dpacked, m_dspec, m_dbuf); unpackDouble(m_dpacked, m_dspare); ippsMagnitude_64f(m_dpacked, m_dspare, magOut, m_size/2+1); } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { if (!m_fspec) initFloat(); ippsFFTFwd_RToCCS_32f(realIn, m_fpacked, m_fspec, m_fbuf); unpackFloat(realOut, imagOut); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { if (!m_fspec) initFloat(); ippsFFTFwd_RToCCS_32f(realIn, complexOut, m_fspec, m_fbuf); } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { if (!m_fspec) initFloat(); ippsFFTFwd_RToCCS_32f(realIn, m_fpacked, m_fspec, m_fbuf); unpackFloat(m_fpacked, m_fspare); ippsCartToPolar_32f(m_fpacked, m_fspare, magOut, phaseOut, m_size/2+1); } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { if (!m_fspec) initFloat(); ippsFFTFwd_RToCCS_32f(realIn, m_fpacked, m_fspec, m_fbuf); unpackFloat(m_fpacked, m_fspare); ippsMagnitude_32f(m_fpacked, m_fspare, magOut, m_size/2+1); } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { if (!m_dspec) initDouble(); packDouble(realIn, imagIn); ippsFFTInv_CCSToR_64f(m_dpacked, realOut, m_dspec, m_dbuf); } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { if (!m_dspec) initDouble(); ippsFFTInv_CCSToR_64f(complexIn, realOut, m_dspec, m_dbuf); } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { if (!m_dspec) initDouble(); ippsPolarToCart_64f(magIn, phaseIn, realOut, m_dspare, m_size/2+1); packDouble(realOut, m_dspare); // to m_dpacked ippsFFTInv_CCSToR_64f(m_dpacked, realOut, m_dspec, m_dbuf); } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { if (!m_dspec) initDouble(); const int hs1 = m_size/2 + 1; ippsCopy_64f(magIn, m_dspare, hs1); ippsAddC_64f_I(0.000001, m_dspare, hs1); ippsLn_64f_I(m_dspare, hs1); packDouble(m_dspare, 0); ippsFFTInv_CCSToR_64f(m_dpacked, cepOut, m_dspec, m_dbuf); } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { if (!m_fspec) initFloat(); packFloat(realIn, imagIn); ippsFFTInv_CCSToR_32f(m_fpacked, realOut, m_fspec, m_fbuf); } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { if (!m_fspec) initFloat(); ippsFFTInv_CCSToR_32f(complexIn, realOut, m_fspec, m_fbuf); } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { if (!m_fspec) initFloat(); ippsPolarToCart_32f(magIn, phaseIn, realOut, m_fspare, m_size/2+1); packFloat(realOut, m_fspare); // to m_fpacked ippsFFTInv_CCSToR_32f(m_fpacked, realOut, m_fspec, m_fbuf); } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { if (!m_fspec) initFloat(); const int hs1 = m_size/2 + 1; ippsCopy_32f(magIn, m_fspare, hs1); ippsAddC_32f_I(0.000001f, m_fspare, hs1); ippsLn_32f_I(m_fspare, hs1); packFloat(m_fspare, 0); ippsFFTInv_CCSToR_32f(m_fpacked, cepOut, m_fspec, m_fbuf); } private: const int m_size; int m_order; IppsFFTSpec_R_32f *m_fspec; IppsFFTSpec_R_64f *m_dspec; Ipp8u *m_fspecbuf; Ipp8u *m_dspecbuf; Ipp8u *m_fbuf; Ipp8u *m_dbuf; float *m_fpacked; float *m_fspare; double *m_dpacked; double *m_dspare; }; #endif /* HAVE_IPP */ #ifdef HAVE_VDSP class D_VDSP : public FFTImpl { public: D_VDSP(int size) : m_size(size), m_fspec(0), m_dspec(0), m_fpacked(0), m_fspare(0), m_dpacked(0), m_dspare(0) { for (int i = 0; ; ++i) { if (m_size & (1 << i)) { m_order = i; break; } } } ~D_VDSP() { if (m_fspec) { vDSP_destroy_fftsetup(m_fspec); deallocate(m_fspare); deallocate(m_fspare2); deallocate(m_fbuf->realp); deallocate(m_fbuf->imagp); delete m_fbuf; deallocate(m_fpacked->realp); deallocate(m_fpacked->imagp); delete m_fpacked; } if (m_dspec) { vDSP_destroy_fftsetupD(m_dspec); deallocate(m_dspare); deallocate(m_dspare2); deallocate(m_dbuf->realp); deallocate(m_dbuf->imagp); delete m_dbuf; deallocate(m_dpacked->realp); deallocate(m_dpacked->imagp); delete m_dpacked; } } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { return FFT::SinglePrecision | FFT::DoublePrecision; } //!!! rv check void initFloat() { if (m_fspec) return; m_fspec = vDSP_create_fftsetup(m_order, FFT_RADIX2); m_fbuf = new DSPSplitComplex; //!!! "If possible, tempBuffer->realp and tempBuffer->imagp should be 32-byte aligned for best performance." m_fbuf->realp = allocate(m_size); m_fbuf->imagp = allocate(m_size); m_fpacked = new DSPSplitComplex; m_fpacked->realp = allocate(m_size / 2 + 1); m_fpacked->imagp = allocate(m_size / 2 + 1); m_fspare = allocate(m_size + 2); m_fspare2 = allocate(m_size + 2); } void initDouble() { if (m_dspec) return; m_dspec = vDSP_create_fftsetupD(m_order, FFT_RADIX2); m_dbuf = new DSPDoubleSplitComplex; //!!! "If possible, tempBuffer->realp and tempBuffer->imagp should be 32-byte aligned for best performance." m_dbuf->realp = allocate(m_size); m_dbuf->imagp = allocate(m_size); m_dpacked = new DSPDoubleSplitComplex; m_dpacked->realp = allocate(m_size / 2 + 1); m_dpacked->imagp = allocate(m_size / 2 + 1); m_dspare = allocate(m_size + 2); m_dspare2 = allocate(m_size + 2); } void packReal(const float *BQ_R__ const re) { // Pack input for forward transform vDSP_ctoz((DSPComplex *)re, 2, m_fpacked, 1, m_size/2); } void packComplex(const float *BQ_R__ const re, const float *BQ_R__ const im) { // Pack input for inverse transform if (re) v_copy(m_fpacked->realp, re, m_size/2 + 1); else v_zero(m_fpacked->realp, m_size/2 + 1); if (im) v_copy(m_fpacked->imagp, im, m_size/2 + 1); else v_zero(m_fpacked->imagp, m_size/2 + 1); fnyq(); } void unpackReal(float *BQ_R__ const re) { // Unpack output for inverse transform vDSP_ztoc(m_fpacked, 1, (DSPComplex *)re, 2, m_size/2); } void unpackComplex(float *BQ_R__ const re, float *BQ_R__ const im) { // Unpack output for forward transform // vDSP forward FFTs are scaled 2x (for some reason) float two = 2.f; vDSP_vsdiv(m_fpacked->realp, 1, &two, re, 1, m_size/2 + 1); vDSP_vsdiv(m_fpacked->imagp, 1, &two, im, 1, m_size/2 + 1); } void unpackComplex(float *BQ_R__ const cplx) { // Unpack output for forward transform // vDSP forward FFTs are scaled 2x (for some reason) const int hs1 = m_size/2 + 1; for (int i = 0; i < hs1; ++i) { cplx[i*2] = m_fpacked->realp[i] * 0.5f; cplx[i*2+1] = m_fpacked->imagp[i] * 0.5f; } } void packReal(const double *BQ_R__ const re) { // Pack input for forward transform vDSP_ctozD((DSPDoubleComplex *)re, 2, m_dpacked, 1, m_size/2); } void packComplex(const double *BQ_R__ const re, const double *BQ_R__ const im) { // Pack input for inverse transform if (re) v_copy(m_dpacked->realp, re, m_size/2 + 1); else v_zero(m_dpacked->realp, m_size/2 + 1); if (im) v_copy(m_dpacked->imagp, im, m_size/2 + 1); else v_zero(m_dpacked->imagp, m_size/2 + 1); dnyq(); } void unpackReal(double *BQ_R__ const re) { // Unpack output for inverse transform vDSP_ztocD(m_dpacked, 1, (DSPDoubleComplex *)re, 2, m_size/2); } void unpackComplex(double *BQ_R__ const re, double *BQ_R__ const im) { // Unpack output for forward transform // vDSP forward FFTs are scaled 2x (for some reason) double two = 2.0; vDSP_vsdivD(m_dpacked->realp, 1, &two, re, 1, m_size/2 + 1); vDSP_vsdivD(m_dpacked->imagp, 1, &two, im, 1, m_size/2 + 1); } void unpackComplex(double *BQ_R__ const cplx) { // Unpack output for forward transform // vDSP forward FFTs are scaled 2x (for some reason) const int hs1 = m_size/2 + 1; for (int i = 0; i < hs1; ++i) { cplx[i*2] = m_dpacked->realp[i] * 0.5; cplx[i*2+1] = m_dpacked->imagp[i] * 0.5; } } void fdenyq() { // for fft result in packed form, unpack the DC and Nyquist bins const int hs = m_size/2; m_fpacked->realp[hs] = m_fpacked->imagp[0]; m_fpacked->imagp[hs] = 0.f; m_fpacked->imagp[0] = 0.f; } void ddenyq() { // for fft result in packed form, unpack the DC and Nyquist bins const int hs = m_size/2; m_dpacked->realp[hs] = m_dpacked->imagp[0]; m_dpacked->imagp[hs] = 0.; m_dpacked->imagp[0] = 0.; } void fnyq() { // for ifft input in packed form, pack the DC and Nyquist bins const int hs = m_size/2; m_fpacked->imagp[0] = m_fpacked->realp[hs]; m_fpacked->realp[hs] = 0.f; m_fpacked->imagp[hs] = 0.f; } void dnyq() { // for ifft input in packed form, pack the DC and Nyquist bins const int hs = m_size/2; m_dpacked->imagp[0] = m_dpacked->realp[hs]; m_dpacked->realp[hs] = 0.; m_dpacked->imagp[hs] = 0.; } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { if (!m_dspec) initDouble(); packReal(realIn); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_FORWARD); ddenyq(); unpackComplex(realOut, imagOut); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { if (!m_dspec) initDouble(); packReal(realIn); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_FORWARD); ddenyq(); unpackComplex(complexOut); } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { if (!m_dspec) initDouble(); const int hs1 = m_size/2+1; packReal(realIn); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_FORWARD); ddenyq(); // vDSP forward FFTs are scaled 2x (for some reason) for (int i = 0; i < hs1; ++i) m_dpacked->realp[i] *= 0.5; for (int i = 0; i < hs1; ++i) m_dpacked->imagp[i] *= 0.5; v_cartesian_to_polar(magOut, phaseOut, m_dpacked->realp, m_dpacked->imagp, hs1); } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { if (!m_dspec) initDouble(); packReal(realIn); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_FORWARD); ddenyq(); const int hs1 = m_size/2+1; vDSP_zvmagsD(m_dpacked, 1, m_dspare, 1, hs1); vvsqrt(m_dspare2, m_dspare, &hs1); // vDSP forward FFTs are scaled 2x (for some reason) double two = 2.0; vDSP_vsdivD(m_dspare2, 1, &two, magOut, 1, hs1); } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { if (!m_fspec) initFloat(); packReal(realIn); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_FORWARD); fdenyq(); unpackComplex(realOut, imagOut); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { if (!m_fspec) initFloat(); packReal(realIn); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_FORWARD); fdenyq(); unpackComplex(complexOut); } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { if (!m_fspec) initFloat(); const int hs1 = m_size/2+1; packReal(realIn); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_FORWARD); fdenyq(); // vDSP forward FFTs are scaled 2x (for some reason) for (int i = 0; i < hs1; ++i) m_fpacked->realp[i] *= 0.5f; for (int i = 0; i < hs1; ++i) m_fpacked->imagp[i] *= 0.5f; v_cartesian_to_polar(magOut, phaseOut, m_fpacked->realp, m_fpacked->imagp, hs1); } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { if (!m_fspec) initFloat(); packReal(realIn); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_FORWARD); fdenyq(); const int hs1 = m_size/2 + 1; vDSP_zvmags(m_fpacked, 1, m_fspare, 1, hs1); vvsqrtf(m_fspare2, m_fspare, &hs1); // vDSP forward FFTs are scaled 2x (for some reason) float two = 2.f; vDSP_vsdiv(m_fspare2, 1, &two, magOut, 1, hs1); } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { if (!m_dspec) initDouble(); packComplex(realIn, imagIn); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_INVERSE); unpackReal(realOut); } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { if (!m_dspec) initDouble(); double *d[2] = { m_dpacked->realp, m_dpacked->imagp }; v_deinterleave(d, complexIn, 2, m_size/2 + 1); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_INVERSE); unpackReal(realOut); } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { if (!m_dspec) initDouble(); const int hs1 = m_size/2+1; vvsincos(m_dpacked->imagp, m_dpacked->realp, phaseIn, &hs1); double *const rp = m_dpacked->realp; double *const ip = m_dpacked->imagp; for (int i = 0; i < hs1; ++i) rp[i] *= magIn[i]; for (int i = 0; i < hs1; ++i) ip[i] *= magIn[i]; dnyq(); vDSP_fft_zriptD(m_dspec, m_dpacked, 1, m_dbuf, m_order, FFT_INVERSE); unpackReal(realOut); } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { if (!m_dspec) initDouble(); const int hs1 = m_size/2 + 1; v_copy(m_dspare, magIn, hs1); for (int i = 0; i < hs1; ++i) m_dspare[i] += 0.000001; vvlog(m_dspare2, m_dspare, &hs1); inverse(m_dspare2, 0, cepOut); } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { if (!m_fspec) initFloat(); packComplex(realIn, imagIn); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_INVERSE); unpackReal(realOut); } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { if (!m_fspec) initFloat(); float *f[2] = { m_fpacked->realp, m_fpacked->imagp }; v_deinterleave(f, complexIn, 2, m_size/2 + 1); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_INVERSE); unpackReal(realOut); } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { if (!m_fspec) initFloat(); const int hs1 = m_size/2+1; vvsincosf(m_fpacked->imagp, m_fpacked->realp, phaseIn, &hs1); float *const rp = m_fpacked->realp; float *const ip = m_fpacked->imagp; for (int i = 0; i < hs1; ++i) rp[i] *= magIn[i]; for (int i = 0; i < hs1; ++i) ip[i] *= magIn[i]; fnyq(); vDSP_fft_zript(m_fspec, m_fpacked, 1, m_fbuf, m_order, FFT_INVERSE); unpackReal(realOut); } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { if (!m_fspec) initFloat(); const int hs1 = m_size/2 + 1; v_copy(m_fspare, magIn, hs1); for (int i = 0; i < hs1; ++i) m_fspare[i] += 0.000001f; vvlogf(m_fspare2, m_fspare, &hs1); inverse(m_fspare2, 0, cepOut); } private: const int m_size; int m_order; FFTSetup m_fspec; FFTSetupD m_dspec; DSPSplitComplex *m_fbuf; DSPDoubleSplitComplex *m_dbuf; DSPSplitComplex *m_fpacked; float *m_fspare; float *m_fspare2; DSPDoubleSplitComplex *m_dpacked; double *m_dspare; double *m_dspare2; }; #endif /* HAVE_VDSP */ #ifdef HAVE_MEDIALIB class D_MEDIALIB : public FFTImpl { public: D_MEDIALIB(int size) : m_size(size), m_dpacked(0), m_fpacked(0) { for (int i = 0; ; ++i) { if (m_size & (1 << i)) { m_order = i; break; } } } ~D_MEDIALIB() { if (m_dpacked) { deallocate(m_dpacked); } if (m_fpacked) { deallocate(m_fpacked); } } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { return FFT::SinglePrecision | FFT::DoublePrecision; } //!!! rv check void initFloat() { m_fpacked = allocate(m_size*2); } void initDouble() { m_dpacked = allocate(m_size*2); } void packFloatConjugates() { const int hs = m_size / 2; for (int i = 1; i <= hs; ++i) { m_fpacked[(m_size-i)*2] = m_fpacked[2*i]; m_fpacked[(m_size-i)*2 + 1] = -m_fpacked[2*i + 1]; } } void packDoubleConjugates() { const int hs = m_size / 2; for (int i = 1; i <= hs; ++i) { m_dpacked[(m_size-i)*2] = m_dpacked[2*i]; m_dpacked[(m_size-i)*2 + 1] = -m_dpacked[2*i + 1]; } } void packFloat(const float *BQ_R__ re, const float *BQ_R__ im) { int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[index++] = re[i]; index++; } index = 0; if (im) { for (int i = 0; i <= hs; ++i) { index++; m_fpacked[index++] = im[i]; } } else { for (int i = 0; i <= hs; ++i) { index++; m_fpacked[index++] = 0.f; } } packFloatConjugates(); } void packDouble(const double *BQ_R__ re, const double *BQ_R__ im) { int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_dpacked[index++] = re[i]; index++; } index = 0; if (im) { for (int i = 0; i <= hs; ++i) { index++; m_dpacked[index++] = im[i]; } } else { for (int i = 0; i <= hs; ++i) { index++; m_dpacked[index++] = 0.0; } } packDoubleConjugates(); } void unpackFloat(float *re, float *BQ_R__ im) { // re may be equal to m_fpacked int index = 0; const int hs = m_size/2; if (im) { for (int i = 0; i <= hs; ++i) { index++; im[i] = m_fpacked[index++]; } } index = 0; for (int i = 0; i <= hs; ++i) { re[i] = m_fpacked[index++]; index++; } } void unpackDouble(double *re, double *BQ_R__ im) { // re may be equal to m_dpacked int index = 0; const int hs = m_size/2; if (im) { for (int i = 0; i <= hs; ++i) { index++; im[i] = m_dpacked[index++]; } } index = 0; for (int i = 0; i <= hs; ++i) { re[i] = m_dpacked[index++]; index++; } } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { if (!m_dpacked) initDouble(); mlib_SignalFFT_1_D64C_D64(m_dpacked, realIn, m_order); unpackDouble(realOut, imagOut); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { if (!m_dpacked) initDouble(); // mlib FFT gives the whole redundant complex result mlib_SignalFFT_1_D64C_D64(m_dpacked, realIn, m_order); v_copy(complexOut, m_dpacked, m_size + 2); } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { if (!m_dpacked) initDouble(); mlib_SignalFFT_1_D64C_D64(m_dpacked, realIn, m_order); const int hs = m_size/2; int index = 0; for (int i = 0; i <= hs; ++i) { int reali = index; ++index; magOut[i] = sqrt(m_dpacked[reali] * m_dpacked[reali] + m_dpacked[index] * m_dpacked[index]); phaseOut[i] = atan2(m_dpacked[index], m_dpacked[reali]) ; ++index; } } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { if (!m_dpacked) initDouble(); mlib_SignalFFT_1_D64C_D64(m_dpacked, realIn, m_order); const int hs = m_size/2; int index = 0; for (int i = 0; i <= hs; ++i) { int reali = index; ++index; magOut[i] = sqrt(m_dpacked[reali] * m_dpacked[reali] + m_dpacked[index] * m_dpacked[index]); ++index; } } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { if (!m_fpacked) initFloat(); mlib_SignalFFT_1_F32C_F32(m_fpacked, realIn, m_order); unpackFloat(realOut, imagOut); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { if (!m_fpacked) initFloat(); // mlib FFT gives the whole redundant complex result mlib_SignalFFT_1_F32C_F32(m_fpacked, realIn, m_order); v_copy(complexOut, m_fpacked, m_size + 2); } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { if (!m_fpacked) initFloat(); mlib_SignalFFT_1_F32C_F32(m_fpacked, realIn, m_order); const int hs = m_size/2; int index = 0; for (int i = 0; i <= hs; ++i) { int reali = index; ++index; magOut[i] = sqrtf(m_fpacked[reali] * m_fpacked[reali] + m_fpacked[index] * m_fpacked[index]); phaseOut[i] = atan2f(m_fpacked[index], m_fpacked[reali]); ++index; } } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { if (!m_fpacked) initFloat(); mlib_SignalFFT_1_F32C_F32(m_fpacked, realIn, m_order); const int hs = m_size/2; int index = 0; for (int i = 0; i <= hs; ++i) { int reali = index; ++index; magOut[i] = sqrtf(m_fpacked[reali] * m_fpacked[reali] + m_fpacked[index] * m_fpacked[index]); ++index; } } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { if (!m_dpacked) initDouble(); packDouble(realIn, imagIn); mlib_SignalIFFT_2_D64_D64C(realOut, m_dpacked, m_order); } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { if (!m_dpacked) initDouble(); v_copy(m_dpacked, complexIn, m_size + 2); packDoubleConjugates(); mlib_SignalIFFT_2_D64_D64C(realOut, m_dpacked, m_order); } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { if (!m_dpacked) initDouble(); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = magIn[i] * cos(phaseIn[i]); double imag = magIn[i] * sin(phaseIn[i]); m_dpacked[i*2] = real; m_dpacked[i*2 + 1] = imag; } packDoubleConjugates(); mlib_SignalIFFT_2_D64_D64C(realOut, m_dpacked, m_order); } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { if (!m_dpacked) initDouble(); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_dpacked[i*2] = log(magIn[i] + 0.000001); m_dpacked[i*2 + 1] = 0.0; } packDoubleConjugates(); mlib_SignalIFFT_2_D64_D64C(cepOut, m_dpacked, m_order); } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { if (!m_fpacked) initFloat(); packFloat(realIn, imagIn); mlib_SignalIFFT_2_F32_F32C(realOut, m_fpacked, m_order); } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { if (!m_fpacked) initFloat(); v_convert(m_fpacked, complexIn, m_size + 2); packFloatConjugates(); mlib_SignalIFFT_2_F32_F32C(realOut, m_fpacked, m_order); } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { if (!m_fpacked) initFloat(); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = magIn[i] * cos(phaseIn[i]); double imag = magIn[i] * sin(phaseIn[i]); m_fpacked[i*2] = real; m_fpacked[i*2 + 1] = imag; } packFloatConjugates(); mlib_SignalIFFT_2_F32_F32C(realOut, m_fpacked, m_order); } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { if (!m_fpacked) initFloat(); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i*2] = logf(magIn[i] + 0.000001); m_fpacked[i*2 + 1] = 0.f; } packFloatConjugates(); mlib_SignalIFFT_2_F32_F32C(cepOut, m_fpacked, m_order); } private: const int m_size; int m_order; double *m_dpacked; float *m_fpacked; }; #endif /* HAVE_MEDIALIB */ #ifdef HAVE_OPENMAX class D_OPENMAX : public FFTImpl { // Convert a signed 32-bit integer to a float in the range [-1,1) static inline float i2f(OMX_S32 i) { return float(i) / float(OMX_MAX_S32); } // Convert a signed 32-bit integer to a double in the range [-1,1) static inline double i2d(OMX_S32 i) { return double(i) / double(OMX_MAX_S32); } // Convert a float in the range [-1,1) to a signed 32-bit integer static inline OMX_S32 f2i(float f) { return OMX_S32(f * OMX_MAX_S32); } // Convert a double in the range [-1,1) to a signed 32-bit integer static inline OMX_S32 d2i(double d) { return OMX_S32(d * OMX_MAX_S32); } public: D_OPENMAX(int size) : m_size(size), m_packed(0) { for (int i = 0; ; ++i) { if (m_size & (1 << i)) { m_order = i; break; } } } ~D_OPENMAX() { if (m_packed) { deallocate(m_packed); deallocate(m_buf); deallocate(m_fbuf); deallocate(m_spec); } } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { return FFT::SinglePrecision; } //!!! rv check // The OpenMAX implementation uses a fixed-point representation in // 32-bit signed integers, with a downward scaling factor (0-32 // bits) supplied as an argument to the FFT function. void initFloat() { initDouble(); } void initDouble() { if (!m_packed) { m_buf = allocate(m_size); m_packed = allocate(m_size*2 + 2); m_fbuf = allocate(m_size*2 + 2); OMX_INT sz = 0; omxSP_FFTGetBufSize_R_S32(m_order, &sz); m_spec = (OMXFFTSpec_R_S32 *)allocate(sz); omxSP_FFTInit_R_S32(m_spec, m_order); } } void packFloat(const float *BQ_R__ re) { // prepare fixed point input for forward transform for (int i = 0; i < m_size; ++i) { m_buf[i] = f2i(re[i]); } } void packDouble(const double *BQ_R__ re) { // prepare fixed point input for forward transform for (int i = 0; i < m_size; ++i) { m_buf[i] = d2i(re[i]); } } void unpackFloat(float *BQ_R__ re, float *BQ_R__ im) { // convert fixed point output for forward transform int index = 0; const int hs = m_size/2; if (im) { for (int i = 0; i <= hs; ++i) { index++; im[i] = i2f(m_packed[index++]); } v_scale(im, m_size, hs + 1); } index = 0; for (int i = 0; i <= hs; ++i) { re[i] = i2f(m_packed[index++]); index++; } v_scale(re, m_size, hs + 1); } void unpackDouble(double *BQ_R__ re, double *BQ_R__ im) { // convert fixed point output for forward transform int index = 0; const int hs = m_size/2; if (im) { for (int i = 0; i <= hs; ++i) { index++; im[i] = i2d(m_packed[index++]); } v_scale(im, m_size, hs + 1); } index = 0; for (int i = 0; i <= hs; ++i) { re[i] = i2d(m_packed[index++]); index++; } v_scale(re, m_size, hs + 1); } void unpackFloatInterleaved(float *BQ_R__ cplx) { // convert fixed point output for forward transform for (int i = 0; i < m_size + 2; ++i) { cplx[i] = i2f(m_packed[i]); } v_scale(cplx, m_size, m_size + 2); } void unpackDoubleInterleaved(double *BQ_R__ cplx) { // convert fixed point output for forward transform for (int i = 0; i < m_size + 2; ++i) { cplx[i] = i2d(m_packed[i]); } v_scale(cplx, m_size, m_size + 2); } void packFloat(const float *BQ_R__ re, const float *BQ_R__ im) { // prepare fixed point input for inverse transform int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_packed[index++] = f2i(re[i]); index++; } index = 0; if (im) { for (int i = 0; i <= hs; ++i) { index++; m_packed[index++] = f2i(im[i]); } } else { for (int i = 0; i <= hs; ++i) { index++; m_packed[index++] = 0; } } } void packDouble(const double *BQ_R__ re, const double *BQ_R__ im) { // prepare fixed point input for inverse transform int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_packed[index++] = d2i(re[i]); index++; } index = 0; if (im) { for (int i = 0; i <= hs; ++i) { index++; m_packed[index++] = d2i(im[i]); } } else { for (int i = 0; i <= hs; ++i) { index++; m_packed[index++] = 0; } } } void convertFloat(const float *BQ_R__ f) { // convert interleaved input for inverse interleaved transform const int n = m_size + 2; for (int i = 0; i < n; ++i) { m_packed[i] = f2i(f[i]); } } void convertDouble(const double *BQ_R__ d) { // convert interleaved input for inverse interleaved transform const int n = m_size + 2; for (int i = 0; i < n; ++i) { m_packed[i] = d2i(d[i]); } } void unpackFloat(float *BQ_R__ re) { // convert fixed point output for inverse transform for (int i = 0; i < m_size; ++i) { re[i] = i2f(m_buf[i]) * m_size; } } void unpackDouble(double *BQ_R__ re) { // convert fixed point output for inverse transform for (int i = 0; i < m_size; ++i) { re[i] = i2d(m_buf[i]) * m_size; } } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { if (!m_packed) initDouble(); packDouble(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); unpackDouble(realOut, imagOut); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { if (!m_packed) initDouble(); packDouble(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); unpackDoubleInterleaved(complexOut); } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { if (!m_packed) initDouble(); packDouble(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); unpackDouble(magOut, phaseOut); // temporarily // at this point we actually have real/imag in the mag/phase arrays const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = magOut[i]; double imag = phaseOut[i]; c_magphase(magOut + i, phaseOut + i, real, imag); } } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { if (!m_packed) initDouble(); packDouble(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { int reali = i * 2; int imagi = reali + 1; double real = i2d(m_packed[reali]) * m_size; double imag = i2d(m_packed[imagi]) * m_size; magOut[i] = sqrt(real * real + imag * imag); } } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { if (!m_packed) initFloat(); packFloat(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); unpackFloat(realOut, imagOut); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { if (!m_packed) initFloat(); packFloat(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); unpackFloatInterleaved(complexOut); } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { if (!m_packed) initFloat(); packFloat(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); unpackFloat(magOut, phaseOut); // temporarily // at this point we actually have real/imag in the mag/phase arrays const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { float real = magOut[i]; float imag = phaseOut[i]; c_magphase(magOut + i, phaseOut + i, real, imag); } } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { if (!m_packed) initFloat(); packFloat(realIn); omxSP_FFTFwd_RToCCS_S32_Sfs(m_buf, m_packed, m_spec, m_order); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { int reali = i * 2; int imagi = reali + 1; float real = i2f(m_packed[reali]) * m_size; float imag = i2f(m_packed[imagi]) * m_size; magOut[i] = sqrtf(real * real + imag * imag); } } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { if (!m_packed) initDouble(); packDouble(realIn, imagIn); omxSP_FFTInv_CCSToR_S32_Sfs(m_packed, m_buf, m_spec, 0); unpackDouble(realOut); } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { if (!m_packed) initDouble(); convertDouble(complexIn); omxSP_FFTInv_CCSToR_S32_Sfs(m_packed, m_buf, m_spec, 0); unpackDouble(realOut); } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { if (!m_packed) initDouble(); int index = 0; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real, imag; c_phasor(&real, &imag, phaseIn[i]); m_fbuf[index++] = float(real); m_fbuf[index++] = float(imag); } convertFloat(m_fbuf); omxSP_FFTInv_CCSToR_S32_Sfs(m_packed, m_buf, m_spec, 0); unpackDouble(realOut); } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { if (!m_packed) initDouble(); //!!! implement #warning OpenMAX implementation lacks cepstral transforms } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { if (!m_packed) initFloat(); packFloat(realIn, imagIn); omxSP_FFTInv_CCSToR_S32_Sfs(m_packed, m_buf, m_spec, 0); unpackFloat(realOut); } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { if (!m_packed) initFloat(); convertFloat(complexIn); omxSP_FFTInv_CCSToR_S32_Sfs(m_packed, m_buf, m_spec, 0); unpackFloat(realOut); } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { if (!m_packed) initFloat(); const int hs = m_size/2; v_polar_to_cartesian_interleaved(m_fbuf, magIn, phaseIn, hs+1); convertFloat(m_fbuf); omxSP_FFTInv_CCSToR_S32_Sfs(m_packed, m_buf, m_spec, 0); unpackFloat(realOut); } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { if (!m_packed) initFloat(); //!!! implement #warning OpenMAX implementation lacks cepstral transforms } private: const int m_size; int m_order; OMX_S32 *m_packed; OMX_S32 *m_buf; float *m_fbuf; OMXFFTSpec_R_S32 *m_spec; }; #endif /* HAVE_OPENMAX */ #ifdef HAVE_FFTW3 /* Define FFTW_DOUBLE_ONLY to make all uses of FFTW functions be double-precision (so "float" FFTs are calculated by casting to doubles and using the double-precision FFTW function). Define FFTW_SINGLE_ONLY to make all uses of FFTW functions be single-precision (so "double" FFTs are calculated by casting to floats and using the single-precision FFTW function). Neither of these flags is desirable for either performance or precision. The main reason to define either flag is to avoid linking against both fftw3 and fftw3f libraries. */ //#define FFTW_DOUBLE_ONLY 1 //#define FFTW_SINGLE_ONLY 1 #if defined(FFTW_DOUBLE_ONLY) && defined(FFTW_SINGLE_ONLY) // Can't meaningfully define both #error Can only define one of FFTW_DOUBLE_ONLY and FFTW_SINGLE_ONLY #endif #if defined(FFTW_FLOAT_ONLY) #warning FFTW_FLOAT_ONLY is deprecated, use FFTW_SINGLE_ONLY instead #define FFTW_SINGLE_ONLY 1 #endif #ifdef FFTW_DOUBLE_ONLY #define fft_float_type double #define fftwf_complex fftw_complex #define fftwf_plan fftw_plan #define fftwf_plan_dft_r2c_1d fftw_plan_dft_r2c_1d #define fftwf_plan_dft_c2r_1d fftw_plan_dft_c2r_1d #define fftwf_destroy_plan fftw_destroy_plan #define fftwf_malloc fftw_malloc #define fftwf_free fftw_free #define fftwf_execute fftw_execute #define atan2f atan2 #define sqrtf sqrt #define cosf cos #define sinf sin #else #define fft_float_type float #endif /* FFTW_DOUBLE_ONLY */ #ifdef FFTW_SINGLE_ONLY #define fft_double_type float #define fftw_complex fftwf_complex #define fftw_plan fftwf_plan #define fftw_plan_dft_r2c_1d fftwf_plan_dft_r2c_1d #define fftw_plan_dft_c2r_1d fftwf_plan_dft_c2r_1d #define fftw_destroy_plan fftwf_destroy_plan #define fftw_malloc fftwf_malloc #define fftw_free fftwf_free #define fftw_execute fftwf_execute #define atan2 atan2f #define sqrt sqrtf #define cos cosf #define sin sinf #else #define fft_double_type double #endif /* FFTW_SINGLE_ONLY */ class D_FFTW : public FFTImpl { public: D_FFTW(int size) : m_fplanf(0), m_dplanf(0), m_size(size) { } ~D_FFTW() { if (m_fplanf) { lock(); bool save = false; if (m_extantf > 0 && --m_extantf == 0) save = true; (void)save; // avoid compiler warning #ifdef USE_FFTW_WISDOM #ifndef FFTW_DOUBLE_ONLY if (save) saveWisdom('f'); #endif #endif fftwf_destroy_plan(m_fplanf); fftwf_destroy_plan(m_fplani); fftwf_free(m_fbuf); fftwf_free(m_fpacked); unlock(); } if (m_dplanf) { lock(); bool save = false; if (m_extantd > 0 && --m_extantd == 0) save = true; (void)save; // avoid compiler warning #ifdef USE_FFTW_WISDOM #ifndef FFTW_SINGLE_ONLY if (save) saveWisdom('d'); #endif #endif fftw_destroy_plan(m_dplanf); fftw_destroy_plan(m_dplani); fftw_free(m_dbuf); fftw_free(m_dpacked); unlock(); } lock(); if (m_extantf <= 0 && m_extantd <= 0) { #ifndef FFTW_DOUBLE_ONLY fftwf_cleanup(); #endif #ifndef FFTW_SINGLE_ONLY fftw_cleanup(); #endif } unlock(); } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { #ifdef FFTW_SINGLE_ONLY return FFT::SinglePrecision; #else #ifdef FFTW_DOUBLE_ONLY return FFT::DoublePrecision; #else return FFT::SinglePrecision | FFT::DoublePrecision; #endif #endif } void initFloat() { if (m_fplanf) return; bool load = false; lock(); if (m_extantf++ == 0) load = true; (void)load; // avoid compiler warning #ifdef USE_FFTW_WISDOM #ifdef FFTW_DOUBLE_ONLY if (load) loadWisdom('d'); #else if (load) loadWisdom('f'); #endif #endif m_fbuf = (fft_float_type *)fftw_malloc(m_size * sizeof(fft_float_type)); m_fpacked = (fftwf_complex *)fftw_malloc ((m_size/2 + 1) * sizeof(fftwf_complex)); #ifdef USE_FFTW_WISDOM m_fplanf = fftwf_plan_dft_r2c_1d (m_size, m_fbuf, m_fpacked, FFTW_MEASURE); m_fplani = fftwf_plan_dft_c2r_1d (m_size, m_fpacked, m_fbuf, FFTW_MEASURE); #else m_fplanf = fftwf_plan_dft_r2c_1d (m_size, m_fbuf, m_fpacked, FFTW_ESTIMATE); m_fplani = fftwf_plan_dft_c2r_1d (m_size, m_fpacked, m_fbuf, FFTW_ESTIMATE); #endif unlock(); } void initDouble() { if (m_dplanf) return; bool load = false; lock(); if (m_extantd++ == 0) load = true; (void)load; // avoid compiler warning #ifdef USE_FFTW_WISDOM #ifdef FFTW_SINGLE_ONLY if (load) loadWisdom('f'); #else if (load) loadWisdom('d'); #endif #endif m_dbuf = (fft_double_type *)fftw_malloc(m_size * sizeof(fft_double_type)); m_dpacked = (fftw_complex *)fftw_malloc ((m_size/2 + 1) * sizeof(fftw_complex)); #ifdef USE_FFTW_WISDOM m_dplanf = fftw_plan_dft_r2c_1d (m_size, m_dbuf, m_dpacked, FFTW_MEASURE); m_dplani = fftw_plan_dft_c2r_1d (m_size, m_dpacked, m_dbuf, FFTW_MEASURE); #else m_dplanf = fftw_plan_dft_r2c_1d (m_size, m_dbuf, m_dpacked, FFTW_ESTIMATE); m_dplani = fftw_plan_dft_c2r_1d (m_size, m_dpacked, m_dbuf, FFTW_ESTIMATE); #endif unlock(); } void loadWisdom(char type) { wisdom(false, type); } void saveWisdom(char type) { wisdom(true, type); } void wisdom(bool save, char type) { #ifdef FFTW_DOUBLE_ONLY if (type == 'f') return; #endif #ifdef FFTW_SINGLE_ONLY if (type == 'd') return; #endif const char *home = getenv("HOME"); if (!home) return; char fn[256]; snprintf(fn, 256, "%s/%s.%c", home, ".turbot.wisdom", type); FILE *f = fopen(fn, save ? "wb" : "rb"); if (!f) return; if (save) { switch (type) { #ifdef FFTW_DOUBLE_ONLY case 'f': break; #else case 'f': fftwf_export_wisdom_to_file(f); break; #endif #ifdef FFTW_SINGLE_ONLY case 'd': break; #else case 'd': fftw_export_wisdom_to_file(f); break; #endif default: break; } } else { switch (type) { #ifdef FFTW_DOUBLE_ONLY case 'f': break; #else case 'f': fftwf_import_wisdom_from_file(f); break; #endif #ifdef FFTW_SINGLE_ONLY case 'd': break; #else case 'd': fftw_import_wisdom_from_file(f); break; #endif default: break; } } fclose(f); } void packFloat(const float *BQ_R__ re, const float *BQ_R__ im) { const int hs = m_size/2; fftwf_complex *const BQ_R__ fpacked = m_fpacked; for (int i = 0; i <= hs; ++i) { fpacked[i][0] = re[i]; } if (im) { for (int i = 0; i <= hs; ++i) { fpacked[i][1] = im[i]; } } else { for (int i = 0; i <= hs; ++i) { fpacked[i][1] = 0.f; } } } void packDouble(const double *BQ_R__ re, const double *BQ_R__ im) { const int hs = m_size/2; fftw_complex *const BQ_R__ dpacked = m_dpacked; for (int i = 0; i <= hs; ++i) { dpacked[i][0] = re[i]; } if (im) { for (int i = 0; i <= hs; ++i) { dpacked[i][1] = im[i]; } } else { for (int i = 0; i <= hs; ++i) { dpacked[i][1] = 0.0; } } } void unpackFloat(float *BQ_R__ re, float *BQ_R__ im) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { re[i] = m_fpacked[i][0]; } if (im) { for (int i = 0; i <= hs; ++i) { im[i] = m_fpacked[i][1]; } } } void unpackDouble(double *BQ_R__ re, double *BQ_R__ im) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { re[i] = m_dpacked[i][0]; } if (im) { for (int i = 0; i <= hs; ++i) { im[i] = m_dpacked[i][1]; } } } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { if (!m_dplanf) initDouble(); const int sz = m_size; fft_double_type *const BQ_R__ dbuf = m_dbuf; #ifndef FFTW_SINGLE_ONLY if (realIn != dbuf) #endif for (int i = 0; i < sz; ++i) { dbuf[i] = realIn[i]; } fftw_execute(m_dplanf); unpackDouble(realOut, imagOut); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { if (!m_dplanf) initDouble(); const int sz = m_size; fft_double_type *const BQ_R__ dbuf = m_dbuf; #ifndef FFTW_SINGLE_ONLY if (realIn != dbuf) #endif for (int i = 0; i < sz; ++i) { dbuf[i] = realIn[i]; } fftw_execute(m_dplanf); v_convert(complexOut, (const fft_double_type *)m_dpacked, sz + 2); } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { if (!m_dplanf) initDouble(); fft_double_type *const BQ_R__ dbuf = m_dbuf; const int sz = m_size; #ifndef FFTW_SINGLE_ONLY if (realIn != dbuf) #endif for (int i = 0; i < sz; ++i) { dbuf[i] = realIn[i]; } fftw_execute(m_dplanf); v_cartesian_interleaved_to_polar (magOut, phaseOut, (const fft_double_type *)m_dpacked, m_size/2+1); } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { if (!m_dplanf) initDouble(); fft_double_type *const BQ_R__ dbuf = m_dbuf; const int sz = m_size; #ifndef FFTW_SINGLE_ONLY if (realIn != m_dbuf) #endif for (int i = 0; i < sz; ++i) { dbuf[i] = realIn[i]; } fftw_execute(m_dplanf); v_cartesian_interleaved_to_magnitudes (magOut, (const fft_double_type *)m_dpacked, m_size/2+1); } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { if (!m_fplanf) initFloat(); fft_float_type *const BQ_R__ fbuf = m_fbuf; const int sz = m_size; #ifndef FFTW_DOUBLE_ONLY if (realIn != fbuf) #endif for (int i = 0; i < sz; ++i) { fbuf[i] = realIn[i]; } fftwf_execute(m_fplanf); unpackFloat(realOut, imagOut); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { if (!m_fplanf) initFloat(); fft_float_type *const BQ_R__ fbuf = m_fbuf; const int sz = m_size; #ifndef FFTW_DOUBLE_ONLY if (realIn != fbuf) #endif for (int i = 0; i < sz; ++i) { fbuf[i] = realIn[i]; } fftwf_execute(m_fplanf); v_convert(complexOut, (fft_float_type *)m_fpacked, sz + 2); } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { if (!m_fplanf) initFloat(); fft_float_type *const BQ_R__ fbuf = m_fbuf; const int sz = m_size; #ifndef FFTW_DOUBLE_ONLY if (realIn != fbuf) #endif for (int i = 0; i < sz; ++i) { fbuf[i] = realIn[i]; } fftwf_execute(m_fplanf); v_cartesian_interleaved_to_polar (magOut, phaseOut, (const fft_float_type *)m_fpacked, m_size/2+1); } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { if (!m_fplanf) initFloat(); fft_float_type *const BQ_R__ fbuf = m_fbuf; const int sz = m_size; #ifndef FFTW_DOUBLE_ONLY if (realIn != fbuf) #endif for (int i = 0; i < sz; ++i) { fbuf[i] = realIn[i]; } fftwf_execute(m_fplanf); v_cartesian_interleaved_to_magnitudes (magOut, (const fft_float_type *)m_fpacked, m_size/2+1); } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { if (!m_dplanf) initDouble(); packDouble(realIn, imagIn); fftw_execute(m_dplani); const int sz = m_size; fft_double_type *const BQ_R__ dbuf = m_dbuf; #ifndef FFTW_SINGLE_ONLY if (realOut != dbuf) #endif for (int i = 0; i < sz; ++i) { realOut[i] = dbuf[i]; } } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { if (!m_dplanf) initDouble(); v_convert((double *)m_dpacked, complexIn, m_size + 2); fftw_execute(m_dplani); const int sz = m_size; fft_double_type *const BQ_R__ dbuf = m_dbuf; #ifndef FFTW_SINGLE_ONLY if (realOut != dbuf) #endif for (int i = 0; i < sz; ++i) { realOut[i] = dbuf[i]; } } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { if (!m_dplanf) initDouble(); v_polar_to_cartesian_interleaved ((fft_double_type *)m_dpacked, magIn, phaseIn, m_size/2+1); fftw_execute(m_dplani); const int sz = m_size; fft_double_type *const BQ_R__ dbuf = m_dbuf; #ifndef FFTW_SINGLE_ONLY if (realOut != dbuf) #endif for (int i = 0; i < sz; ++i) { realOut[i] = dbuf[i]; } } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { if (!m_dplanf) initDouble(); fft_double_type *const BQ_R__ dbuf = m_dbuf; fftw_complex *const BQ_R__ dpacked = m_dpacked; const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { dpacked[i][0] = log(magIn[i] + 0.000001); } for (int i = 0; i <= hs; ++i) { dpacked[i][1] = 0.0; } fftw_execute(m_dplani); const int sz = m_size; #ifndef FFTW_SINGLE_ONLY if (cepOut != dbuf) #endif for (int i = 0; i < sz; ++i) { cepOut[i] = dbuf[i]; } } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { if (!m_fplanf) initFloat(); packFloat(realIn, imagIn); fftwf_execute(m_fplani); const int sz = m_size; fft_float_type *const BQ_R__ fbuf = m_fbuf; #ifndef FFTW_DOUBLE_ONLY if (realOut != fbuf) #endif for (int i = 0; i < sz; ++i) { realOut[i] = fbuf[i]; } } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { if (!m_fplanf) initFloat(); v_copy((float *)m_fpacked, complexIn, m_size + 2); fftwf_execute(m_fplani); const int sz = m_size; fft_float_type *const BQ_R__ fbuf = m_fbuf; #ifndef FFTW_DOUBLE_ONLY if (realOut != fbuf) #endif for (int i = 0; i < sz; ++i) { realOut[i] = fbuf[i]; } } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { if (!m_fplanf) initFloat(); v_polar_to_cartesian_interleaved ((fft_float_type *)m_fpacked, magIn, phaseIn, m_size/2+1); fftwf_execute(m_fplani); const int sz = m_size; fft_float_type *const BQ_R__ fbuf = m_fbuf; #ifndef FFTW_DOUBLE_ONLY if (realOut != fbuf) #endif for (int i = 0; i < sz; ++i) { realOut[i] = fbuf[i]; } } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { if (!m_fplanf) initFloat(); const int hs = m_size/2; fftwf_complex *const BQ_R__ fpacked = m_fpacked; for (int i = 0; i <= hs; ++i) { fpacked[i][0] = logf(magIn[i] + 0.000001f); } for (int i = 0; i <= hs; ++i) { fpacked[i][1] = 0.f; } fftwf_execute(m_fplani); const int sz = m_size; fft_float_type *const BQ_R__ fbuf = m_fbuf; #ifndef FFTW_DOUBLE_ONLY if (cepOut != fbuf) #endif for (int i = 0; i < sz; ++i) { cepOut[i] = fbuf[i]; } } private: fftwf_plan m_fplanf; fftwf_plan m_fplani; #ifdef FFTW_DOUBLE_ONLY double *m_fbuf; #else float *m_fbuf; #endif fftwf_complex *m_fpacked; fftw_plan m_dplanf; fftw_plan m_dplani; #ifdef FFTW_SINGLE_ONLY float *m_dbuf; #else double *m_dbuf; #endif fftw_complex *m_dpacked; const int m_size; static int m_extantf; static int m_extantd; #ifdef NO_THREADING void lock() {} void unlock() {} #else #ifdef _WIN32 static HANDLE m_commonMutex; void lock() { WaitForSingleObject(m_commonMutex, INFINITE); } void unlock() { ReleaseMutex(m_commonMutex); } #else static pthread_mutex_t m_commonMutex; static bool m_haveMutex; void lock() { pthread_mutex_lock(&m_commonMutex); } void unlock() { pthread_mutex_unlock(&m_commonMutex); } #endif #endif }; int D_FFTW::m_extantf = 0; int D_FFTW::m_extantd = 0; #ifndef NO_THREADING #ifdef _WIN32 HANDLE D_FFTW::m_commonMutex = CreateMutex(NULL, FALSE, NULL); #else pthread_mutex_t D_FFTW::m_commonMutex = PTHREAD_MUTEX_INITIALIZER; #endif #endif #endif /* HAVE_FFTW3 */ #ifdef HAVE_SFFT /* Define SFFT_DOUBLE_ONLY to make all uses of SFFT functions be double-precision (so "float" FFTs are calculated by casting to doubles and using the double-precision SFFT function). Define SFFT_SINGLE_ONLY to make all uses of SFFT functions be single-precision (so "double" FFTs are calculated by casting to floats and using the single-precision SFFT function). Neither of these flags is desirable for either performance or precision. */ //#define SFFT_DOUBLE_ONLY 1 //#define SFFT_SINGLE_ONLY 1 #if defined(SFFT_DOUBLE_ONLY) && defined(SFFT_SINGLE_ONLY) // Can't meaningfully define both #error Can only define one of SFFT_DOUBLE_ONLY and SFFT_SINGLE_ONLY #endif #ifdef SFFT_DOUBLE_ONLY #define fft_float_type double #define FLAG_SFFT_FLOAT SFFT_DOUBLE #define atan2f atan2 #define sqrtf sqrt #define cosf cos #define sinf sin #define logf log #else #define FLAG_SFFT_FLOAT SFFT_FLOAT #define fft_float_type float #endif /* SFFT_DOUBLE_ONLY */ #ifdef SFFT_SINGLE_ONLY #define fft_double_type float #define FLAG_SFFT_DOUBLE SFFT_FLOAT #define atan2 atan2f #define sqrt sqrtf #define cos cosf #define sin sinf #define log logf #else #define FLAG_SFFT_DOUBLE SFFT_DOUBLE #define fft_double_type double #endif /* SFFT_SINGLE_ONLY */ class D_SFFT : public FFTImpl { public: D_SFFT(int size) : m_fplanf(0), m_fplani(0), m_dplanf(0), m_dplani(0), m_size(size) { } ~D_SFFT() { if (m_fplanf) { sfft_free(m_fplanf); sfft_free(m_fplani); deallocate(m_fbuf); deallocate(m_fresult); } if (m_dplanf) { sfft_free(m_dplanf); sfft_free(m_dplani); deallocate(m_dbuf); deallocate(m_dresult); } } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { #ifdef SFFT_SINGLE_ONLY return FFT::SinglePrecision; #else #ifdef SFFT_DOUBLE_ONLY return FFT::DoublePrecision; #else return FFT::SinglePrecision | FFT::DoublePrecision; #endif #endif } void initFloat() { if (m_fplanf) return; m_fbuf = allocate(2 * m_size); m_fresult = allocate(2 * m_size); m_fplanf = sfft_init(m_size, SFFT_FORWARD | FLAG_SFFT_FLOAT); m_fplani = sfft_init(m_size, SFFT_BACKWARD | FLAG_SFFT_FLOAT); if (!m_fplanf || !m_fplani) { if (!m_fplanf) { std::cerr << "D_SFFT: Failed to construct forward float transform for size " << m_size << " (check SFFT library's target configuration)" << std::endl; } else { std::cerr << "D_SFFT: Failed to construct inverse float transform for size " << m_size << " (check SFFT library's target configuration)" << std::endl; } #ifndef NO_EXCEPTIONS throw FFT::InternalError; #else abort(); #endif } } void initDouble() { if (m_dplanf) return; m_dbuf = allocate(2 * m_size); m_dresult = allocate(2 * m_size); m_dplanf = sfft_init(m_size, SFFT_FORWARD | FLAG_SFFT_DOUBLE); m_dplani = sfft_init(m_size, SFFT_BACKWARD | FLAG_SFFT_DOUBLE); if (!m_dplanf || !m_dplani) { if (!m_dplanf) { std::cerr << "D_SFFT: Failed to construct forward double transform for size " << m_size << " (check SFFT library's target configuration)" << std::endl; } else { std::cerr << "D_SFFT: Failed to construct inverse double transform for size " << m_size << " (check SFFT library's target configuration)" << std::endl; } #ifndef NO_EXCEPTIONS throw FFT::InternalError; #else abort(); #endif } } void packFloat(const float *BQ_R__ re, const float *BQ_R__ im, fft_float_type *target, int n) { for (int i = 0; i < n; ++i) target[i*2] = re[i]; if (im) { for (int i = 0; i < n; ++i) target[i*2+1] = im[i]; } else { for (int i = 0; i < n; ++i) target[i*2+1] = 0.f; } } void packDouble(const double *BQ_R__ re, const double *BQ_R__ im, fft_double_type *target, int n) { for (int i = 0; i < n; ++i) target[i*2] = re[i]; if (im) { for (int i = 0; i < n; ++i) target[i*2+1] = im[i]; } else { for (int i = 0; i < n; ++i) target[i*2+1] = 0.0; } } void unpackFloat(const fft_float_type *source, float *BQ_R__ re, float *BQ_R__ im, int n) { for (int i = 0; i < n; ++i) re[i] = source[i*2]; if (im) { for (int i = 0; i < n; ++i) im[i] = source[i*2+1]; } } void unpackDouble(const fft_double_type *source, double *BQ_R__ re, double *BQ_R__ im, int n) { for (int i = 0; i < n; ++i) re[i] = source[i*2]; if (im) { for (int i = 0; i < n; ++i) im[i] = source[i*2+1]; } } template void mirror(T *BQ_R__ cplx, int n) { for (int i = 1; i <= n/2; ++i) { int j = n-i; cplx[j*2] = cplx[i*2]; cplx[j*2+1] = -cplx[i*2+1]; } } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { if (!m_dplanf) initDouble(); packDouble(realIn, 0, m_dbuf, m_size); sfft_execute(m_dplanf, m_dbuf, m_dresult); unpackDouble(m_dresult, realOut, imagOut, m_size/2+1); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { if (!m_dplanf) initDouble(); packDouble(realIn, 0, m_dbuf, m_size); sfft_execute(m_dplanf, m_dbuf, m_dresult); v_convert(complexOut, m_dresult, m_size+2); // i.e. m_size/2+1 complex } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { if (!m_dplanf) initDouble(); packDouble(realIn, 0, m_dbuf, m_size); sfft_execute(m_dplanf, m_dbuf, m_dresult); v_cartesian_interleaved_to_polar(magOut, phaseOut, m_dresult, m_size/2+1); } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { if (!m_dplanf) initDouble(); packDouble(realIn, 0, m_dbuf, m_size); sfft_execute(m_dplanf, m_dbuf, m_dresult); v_cartesian_interleaved_to_magnitudes(magOut, m_dresult, m_size/2+1); } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { if (!m_fplanf) initFloat(); packFloat(realIn, 0, m_fbuf, m_size); sfft_execute(m_fplanf, m_fbuf, m_fresult); unpackFloat(m_fresult, realOut, imagOut, m_size/2+1); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { if (!m_fplanf) initFloat(); packFloat(realIn, 0, m_fbuf, m_size); sfft_execute(m_fplanf, m_fbuf, m_fresult); v_convert(complexOut, m_fresult, m_size+2); // i.e. m_size/2+1 complex } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { if (!m_fplanf) initFloat(); packFloat(realIn, 0, m_fbuf, m_size); sfft_execute(m_fplanf, m_fbuf, m_fresult); v_cartesian_interleaved_to_polar(magOut, phaseOut, m_fresult, m_size/2+1); } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { if (!m_fplanf) initFloat(); packFloat(realIn, 0, m_fbuf, m_size); sfft_execute(m_fplanf, m_fbuf, m_fresult); v_cartesian_interleaved_to_magnitudes(magOut, m_fresult, m_size/2+1); } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { if (!m_dplanf) initDouble(); packDouble(realIn, imagIn, m_dbuf, m_size/2+1); mirror(m_dbuf, m_size); sfft_execute(m_dplani, m_dbuf, m_dresult); for (int i = 0; i < m_size; ++i) { realOut[i] = m_dresult[i*2]; } } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { if (!m_dplanf) initDouble(); v_convert((double *)m_dbuf, complexIn, m_size + 2); mirror(m_dbuf, m_size); sfft_execute(m_dplani, m_dbuf, m_dresult); for (int i = 0; i < m_size; ++i) { realOut[i] = m_dresult[i*2]; } } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { if (!m_dplanf) initDouble(); v_polar_to_cartesian_interleaved(m_dbuf, magIn, phaseIn, m_size/2+1); mirror(m_dbuf, m_size); sfft_execute(m_dplani, m_dbuf, m_dresult); for (int i = 0; i < m_size; ++i) { realOut[i] = m_dresult[i*2]; } } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { if (!m_dplanf) initDouble(); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_dbuf[i*2] = log(magIn[i] + 0.000001); m_dbuf[i*2+1] = 0.0; } mirror(m_dbuf, m_size); sfft_execute(m_dplani, m_dbuf, m_dresult); for (int i = 0; i < m_size; ++i) { cepOut[i] = m_dresult[i*2]; } } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { if (!m_fplanf) initFloat(); packFloat(realIn, imagIn, m_fbuf, m_size/2+1); mirror(m_fbuf, m_size); sfft_execute(m_fplani, m_fbuf, m_fresult); for (int i = 0; i < m_size; ++i) { realOut[i] = m_fresult[i*2]; } } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { if (!m_fplanf) initFloat(); v_convert((float *)m_fbuf, complexIn, m_size + 2); mirror(m_fbuf, m_size); sfft_execute(m_fplani, m_fbuf, m_fresult); for (int i = 0; i < m_size; ++i) { realOut[i] = m_fresult[i*2]; } } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { if (!m_fplanf) initFloat(); v_polar_to_cartesian_interleaved(m_fbuf, magIn, phaseIn, m_size/2+1); mirror(m_fbuf, m_size); sfft_execute(m_fplani, m_fbuf, m_fresult); for (int i = 0; i < m_size; ++i) { realOut[i] = m_fresult[i*2]; } } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { if (!m_fplanf) initFloat(); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fbuf[i*2] = logf(magIn[i] + 0.00001); m_fbuf[i*2+1] = 0.0f; } sfft_execute(m_fplani, m_fbuf, m_fresult); for (int i = 0; i < m_size; ++i) { cepOut[i] = m_fresult[i*2]; } } private: sfft_plan_t *m_fplanf; sfft_plan_t *m_fplani; fft_float_type *m_fbuf; fft_float_type *m_fresult; sfft_plan_t *m_dplanf; sfft_plan_t *m_dplani; fft_double_type *m_dbuf; fft_double_type *m_dresult; const int m_size; }; #endif /* HAVE_SFFT */ #ifdef HAVE_KISSFFT class D_KISSFFT : public FFTImpl { public: D_KISSFFT(int size) : m_size(size), m_fplanf(0), m_fplani(0) { #ifdef FIXED_POINT #error KISSFFT is not configured for float values #endif if (sizeof(kiss_fft_scalar) != sizeof(float)) { std::cerr << "ERROR: KISSFFT is not configured for float values" << std::endl; } m_fbuf = new kiss_fft_scalar[m_size + 2]; m_fpacked = new kiss_fft_cpx[m_size + 2]; m_fplanf = kiss_fftr_alloc(m_size, 0, NULL, NULL); m_fplani = kiss_fftr_alloc(m_size, 1, NULL, NULL); } ~D_KISSFFT() { kiss_fftr_free(m_fplanf); kiss_fftr_free(m_fplani); delete[] m_fbuf; delete[] m_fpacked; } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { return FFT::SinglePrecision; } void initFloat() { } void initDouble() { } void packFloat(const float *BQ_R__ re, const float *BQ_R__ im) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i].r = re[i]; } if (im) { for (int i = 0; i <= hs; ++i) { m_fpacked[i].i = im[i]; } } else { for (int i = 0; i <= hs; ++i) { m_fpacked[i].i = 0.f; } } } void unpackFloat(float *BQ_R__ re, float *BQ_R__ im) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { re[i] = m_fpacked[i].r; } if (im) { for (int i = 0; i <= hs; ++i) { im[i] = m_fpacked[i].i; } } } void packDouble(const double *BQ_R__ re, const double *BQ_R__ im) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i].r = float(re[i]); } if (im) { for (int i = 0; i <= hs; ++i) { m_fpacked[i].i = float(im[i]); } } else { for (int i = 0; i <= hs; ++i) { m_fpacked[i].i = 0.f; } } } void unpackDouble(double *BQ_R__ re, double *BQ_R__ im) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { re[i] = double(m_fpacked[i].r); } if (im) { for (int i = 0; i <= hs; ++i) { im[i] = double(m_fpacked[i].i); } } } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { v_convert(m_fbuf, realIn, m_size); kiss_fftr(m_fplanf, m_fbuf, m_fpacked); unpackDouble(realOut, imagOut); } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { v_convert(m_fbuf, realIn, m_size); kiss_fftr(m_fplanf, m_fbuf, m_fpacked); v_convert(complexOut, (float *)m_fpacked, m_size + 2); } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { v_convert(m_fbuf, realIn, m_size); kiss_fftr(m_fplanf, m_fbuf, m_fpacked); v_cartesian_interleaved_to_polar (magOut, phaseOut, (float *)m_fpacked, m_size/2+1); } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { v_convert(m_fbuf, realIn, m_size); kiss_fftr(m_fplanf, m_fbuf, m_fpacked); v_cartesian_interleaved_to_magnitudes (magOut, (float *)m_fpacked, m_size/2+1); } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { kiss_fftr(m_fplanf, realIn, m_fpacked); unpackFloat(realOut, imagOut); } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { kiss_fftr(m_fplanf, realIn, (kiss_fft_cpx *)complexOut); } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { kiss_fftr(m_fplanf, realIn, m_fpacked); v_cartesian_interleaved_to_polar (magOut, phaseOut, (float *)m_fpacked, m_size/2+1); } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { kiss_fftr(m_fplanf, realIn, m_fpacked); v_cartesian_interleaved_to_magnitudes (magOut, (float *)m_fpacked, m_size/2+1); } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { packDouble(realIn, imagIn); kiss_fftri(m_fplani, m_fpacked, m_fbuf); v_convert(realOut, m_fbuf, m_size); } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { v_convert((float *)m_fpacked, complexIn, m_size + 2); kiss_fftri(m_fplani, m_fpacked, m_fbuf); v_convert(realOut, m_fbuf, m_size); } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { v_polar_to_cartesian_interleaved ((float *)m_fpacked, magIn, phaseIn, m_size/2+1); kiss_fftri(m_fplani, m_fpacked, m_fbuf); v_convert(realOut, m_fbuf, m_size); } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i].r = float(log(magIn[i] + 0.000001)); m_fpacked[i].i = 0.0f; } kiss_fftri(m_fplani, m_fpacked, m_fbuf); v_convert(cepOut, m_fbuf, m_size); } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { packFloat(realIn, imagIn); kiss_fftri(m_fplani, m_fpacked, realOut); } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { v_copy((float *)m_fpacked, complexIn, m_size + 2); kiss_fftri(m_fplani, m_fpacked, realOut); } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { v_polar_to_cartesian_interleaved ((float *)m_fpacked, magIn, phaseIn, m_size/2+1); kiss_fftri(m_fplani, m_fpacked, realOut); } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i].r = logf(magIn[i] + 0.000001f); m_fpacked[i].i = 0.0f; } kiss_fftri(m_fplani, m_fpacked, cepOut); } private: const int m_size; kiss_fftr_cfg m_fplanf; kiss_fftr_cfg m_fplani; kiss_fft_scalar *m_fbuf; kiss_fft_cpx *m_fpacked; }; #endif /* HAVE_KISSFFT */ #ifdef USE_BUILTIN_FFT class D_Cross : public FFTImpl { public: D_Cross(int size) : m_size(size), m_table(0) { m_a = new double[size]; m_b = new double[size]; m_c = new double[size]; m_d = new double[size]; m_table = new int[m_size]; int bits; int i, j, k, m; for (i = 0; ; ++i) { if (m_size & (1 << i)) { bits = i; break; } } for (i = 0; i < m_size; ++i) { m = i; for (j = k = 0; j < bits; ++j) { k = (k << 1) | (m & 1); m >>= 1; } m_table[i] = k; } } ~D_Cross() { delete[] m_table; delete[] m_a; delete[] m_b; delete[] m_c; delete[] m_d; } int getSize() const { return m_size; } FFT::Precisions getSupportedPrecisions() const { return FFT::DoublePrecision; } void initFloat() { } void initDouble() { } void forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { basefft(false, realIn, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) realOut[i] = m_c[i]; if (imagOut) { for (int i = 0; i <= hs; ++i) imagOut[i] = m_d[i]; } } void forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { basefft(false, realIn, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) complexOut[i*2] = m_c[i]; for (int i = 0; i <= hs; ++i) complexOut[i*2+1] = m_d[i]; } void forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { basefft(false, realIn, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { magOut[i] = sqrt(m_c[i] * m_c[i] + m_d[i] * m_d[i]); phaseOut[i] = atan2(m_d[i], m_c[i]) ; } } void forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { basefft(false, realIn, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { magOut[i] = sqrt(m_c[i] * m_c[i] + m_d[i] * m_d[i]); } } void forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { for (int i = 0; i < m_size; ++i) m_a[i] = realIn[i]; basefft(false, m_a, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) realOut[i] = m_c[i]; if (imagOut) { for (int i = 0; i <= hs; ++i) imagOut[i] = m_d[i]; } } void forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { for (int i = 0; i < m_size; ++i) m_a[i] = realIn[i]; basefft(false, m_a, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) complexOut[i*2] = m_c[i]; for (int i = 0; i <= hs; ++i) complexOut[i*2+1] = m_d[i]; } void forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { for (int i = 0; i < m_size; ++i) m_a[i] = realIn[i]; basefft(false, m_a, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { magOut[i] = sqrt(m_c[i] * m_c[i] + m_d[i] * m_d[i]); phaseOut[i] = atan2(m_d[i], m_c[i]) ; } } void forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { for (int i = 0; i < m_size; ++i) m_a[i] = realIn[i]; basefft(false, m_a, 0, m_c, m_d); const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { magOut[i] = sqrt(m_c[i] * m_c[i] + m_d[i] * m_d[i]); } } void inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = realIn[i]; double imag = imagIn[i]; m_a[i] = real; m_b[i] = imag; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = -imag; } } basefft(true, m_a, m_b, realOut, m_d); } void inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = complexIn[i*2]; double imag = complexIn[i*2+1]; m_a[i] = real; m_b[i] = imag; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = -imag; } } basefft(true, m_a, m_b, realOut, m_d); } void inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = magIn[i] * cos(phaseIn[i]); double imag = magIn[i] * sin(phaseIn[i]); m_a[i] = real; m_b[i] = imag; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = -imag; } } basefft(true, m_a, m_b, realOut, m_d); } void inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { double real = log(magIn[i] + 0.000001); m_a[i] = real; m_b[i] = 0.0; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = 0.0; } } basefft(true, m_a, m_b, cepOut, m_d); } void inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { float real = realIn[i]; float imag = imagIn[i]; m_a[i] = real; m_b[i] = imag; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = -imag; } } basefft(true, m_a, m_b, m_c, m_d); for (int i = 0; i < m_size; ++i) realOut[i] = m_c[i]; } void inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { float real = complexIn[i*2]; float imag = complexIn[i*2+1]; m_a[i] = real; m_b[i] = imag; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = -imag; } } basefft(true, m_a, m_b, m_c, m_d); for (int i = 0; i < m_size; ++i) realOut[i] = m_c[i]; } void inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { float real = magIn[i] * cosf(phaseIn[i]); float imag = magIn[i] * sinf(phaseIn[i]); m_a[i] = real; m_b[i] = imag; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = -imag; } } basefft(true, m_a, m_b, m_c, m_d); for (int i = 0; i < m_size; ++i) realOut[i] = m_c[i]; } void inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { float real = logf(magIn[i] + 0.000001); m_a[i] = real; m_b[i] = 0.0; if (i > 0) { m_a[m_size-i] = real; m_b[m_size-i] = 0.0; } } basefft(true, m_a, m_b, m_c, m_d); for (int i = 0; i < m_size; ++i) cepOut[i] = m_c[i]; } private: const int m_size; int *m_table; double *m_a; double *m_b; double *m_c; double *m_d; void basefft(bool inverse, const double *BQ_R__ ri, const double *BQ_R__ ii, double *BQ_R__ ro, double *BQ_R__ io); }; void D_Cross::basefft(bool inverse, const double *BQ_R__ ri, const double *BQ_R__ ii, double *BQ_R__ ro, double *BQ_R__ io) { if (!ri || !ro || !io) return; int i, j, k, m; int blockSize, blockEnd; double tr, ti; double angle = 2.0 * M_PI; if (inverse) angle = -angle; const int n = m_size; if (ii) { for (i = 0; i < n; ++i) { ro[m_table[i]] = ri[i]; } for (i = 0; i < n; ++i) { io[m_table[i]] = ii[i]; } } else { for (i = 0; i < n; ++i) { ro[m_table[i]] = ri[i]; } for (i = 0; i < n; ++i) { io[m_table[i]] = 0.0; } } blockEnd = 1; for (blockSize = 2; blockSize <= n; blockSize <<= 1) { double delta = angle / (double)blockSize; double sm2 = -sin(-2 * delta); double sm1 = -sin(-delta); double cm2 = cos(-2 * delta); double cm1 = cos(-delta); double w = 2 * cm1; double ar[3], ai[3]; for (i = 0; i < n; i += blockSize) { ar[2] = cm2; ar[1] = cm1; ai[2] = sm2; ai[1] = sm1; for (j = i, m = 0; m < blockEnd; j++, m++) { ar[0] = w * ar[1] - ar[2]; ar[2] = ar[1]; ar[1] = ar[0]; ai[0] = w * ai[1] - ai[2]; ai[2] = ai[1]; ai[1] = ai[0]; k = j + blockEnd; tr = ar[0] * ro[k] - ai[0] * io[k]; ti = ar[0] * io[k] + ai[0] * ro[k]; ro[k] = ro[j] - tr; io[k] = io[j] - ti; ro[j] += tr; io[j] += ti; } } blockEnd = blockSize; } /* fftw doesn't rescale, so nor will we if (inverse) { double denom = (double)n; for (i = 0; i < n; i++) { ro[i] /= denom; io[i] /= denom; } } */ } #endif /* USE_BUILTIN_FFT */ } /* end namespace FFTs */ std::string FFT::m_implementation; std::set FFT::getImplementations() { std::set impls; #ifdef HAVE_IPP impls.insert("ipp"); #endif #ifdef HAVE_FFTW3 impls.insert("fftw"); #endif #ifdef HAVE_KISSFFT impls.insert("kissfft"); #endif #ifdef HAVE_VDSP impls.insert("vdsp"); #endif #ifdef HAVE_MEDIALIB impls.insert("medialib"); #endif #ifdef HAVE_OPENMAX impls.insert("openmax"); #endif #ifdef HAVE_SFFT impls.insert("sfft"); #endif #ifdef USE_BUILTIN_FFT impls.insert("cross"); #endif return impls; } void FFT::pickDefaultImplementation() { if (m_implementation != "") return; std::set impls = getImplementations(); std::string best = "cross"; if (impls.find("kissfft") != impls.end()) best = "kissfft"; if (impls.find("medialib") != impls.end()) best = "medialib"; if (impls.find("openmax") != impls.end()) best = "openmax"; if (impls.find("sfft") != impls.end()) best = "sfft"; if (impls.find("fftw") != impls.end()) best = "fftw"; if (impls.find("vdsp") != impls.end()) best = "vdsp"; if (impls.find("ipp") != impls.end()) best = "ipp"; m_implementation = best; } std::string FFT::getDefaultImplementation() { return m_implementation; } void FFT::setDefaultImplementation(std::string i) { m_implementation = i; } FFT::FFT(int size, int debugLevel) : d(0) { if ((size < 2) || (size & (size-1))) { std::cerr << "FFT::FFT(" << size << "): power-of-two sizes only supported, minimum size 2" << std::endl; #ifndef NO_EXCEPTIONS throw InvalidSize; #else abort(); #endif } if (m_implementation == "") pickDefaultImplementation(); std::string impl = m_implementation; if (debugLevel > 0) { std::cerr << "FFT::FFT(" << size << "): using implementation: " << impl << std::endl; } if (impl == "ipp") { #ifdef HAVE_IPP d = new FFTs::D_IPP(size); #endif } else if (impl == "fftw") { #ifdef HAVE_FFTW3 d = new FFTs::D_FFTW(size); #endif } else if (impl == "kissfft") { #ifdef HAVE_KISSFFT d = new FFTs::D_KISSFFT(size); #endif } else if (impl == "vdsp") { #ifdef HAVE_VDSP d = new FFTs::D_VDSP(size); #endif } else if (impl == "medialib") { #ifdef HAVE_MEDIALIB d = new FFTs::D_MEDIALIB(size); #endif } else if (impl == "openmax") { #ifdef HAVE_OPENMAX d = new FFTs::D_OPENMAX(size); #endif } else if (impl == "sfft") { #ifdef HAVE_SFFT d = new FFTs::D_SFFT(size); #endif } else if (impl == "cross") { #ifdef USE_BUILTIN_FFT d = new FFTs::D_Cross(size); #endif } if (!d) { std::cerr << "FFT::FFT(" << size << "): ERROR: implementation " << impl << " is not compiled in" << std::endl; #ifndef NO_EXCEPTIONS throw InvalidImplementation; #else abort(); #endif } } FFT::~FFT() { delete d; } #ifndef NO_EXCEPTIONS #define CHECK_NOT_NULL(x) \ if (!(x)) { \ std::cerr << "FFT: ERROR: Null argument " #x << std::endl; \ throw NullArgument; \ } #else #define CHECK_NOT_NULL(x) \ if (!(x)) { \ std::cerr << "FFT: ERROR: Null argument " #x << std::endl; \ std::cerr << "FFT: Would be throwing NullArgument here, if exceptions were not disabled" << std::endl; \ return; \ } #endif void FFT::forward(const double *BQ_R__ realIn, double *BQ_R__ realOut, double *BQ_R__ imagOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(realOut); CHECK_NOT_NULL(imagOut); d->forward(realIn, realOut, imagOut); } void FFT::forwardInterleaved(const double *BQ_R__ realIn, double *BQ_R__ complexOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(complexOut); d->forwardInterleaved(realIn, complexOut); } void FFT::forwardPolar(const double *BQ_R__ realIn, double *BQ_R__ magOut, double *BQ_R__ phaseOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(magOut); CHECK_NOT_NULL(phaseOut); d->forwardPolar(realIn, magOut, phaseOut); } void FFT::forwardMagnitude(const double *BQ_R__ realIn, double *BQ_R__ magOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(magOut); d->forwardMagnitude(realIn, magOut); } void FFT::forward(const float *BQ_R__ realIn, float *BQ_R__ realOut, float *BQ_R__ imagOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(realOut); CHECK_NOT_NULL(imagOut); d->forward(realIn, realOut, imagOut); } void FFT::forwardInterleaved(const float *BQ_R__ realIn, float *BQ_R__ complexOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(complexOut); d->forwardInterleaved(realIn, complexOut); } void FFT::forwardPolar(const float *BQ_R__ realIn, float *BQ_R__ magOut, float *BQ_R__ phaseOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(magOut); CHECK_NOT_NULL(phaseOut); d->forwardPolar(realIn, magOut, phaseOut); } void FFT::forwardMagnitude(const float *BQ_R__ realIn, float *BQ_R__ magOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(magOut); d->forwardMagnitude(realIn, magOut); } void FFT::inverse(const double *BQ_R__ realIn, const double *BQ_R__ imagIn, double *BQ_R__ realOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(imagIn); CHECK_NOT_NULL(realOut); d->inverse(realIn, imagIn, realOut); } void FFT::inverseInterleaved(const double *BQ_R__ complexIn, double *BQ_R__ realOut) { CHECK_NOT_NULL(complexIn); CHECK_NOT_NULL(realOut); d->inverseInterleaved(complexIn, realOut); } void FFT::inversePolar(const double *BQ_R__ magIn, const double *BQ_R__ phaseIn, double *BQ_R__ realOut) { CHECK_NOT_NULL(magIn); CHECK_NOT_NULL(phaseIn); CHECK_NOT_NULL(realOut); d->inversePolar(magIn, phaseIn, realOut); } void FFT::inverseCepstral(const double *BQ_R__ magIn, double *BQ_R__ cepOut) { CHECK_NOT_NULL(magIn); CHECK_NOT_NULL(cepOut); d->inverseCepstral(magIn, cepOut); } void FFT::inverse(const float *BQ_R__ realIn, const float *BQ_R__ imagIn, float *BQ_R__ realOut) { CHECK_NOT_NULL(realIn); CHECK_NOT_NULL(imagIn); CHECK_NOT_NULL(realOut); d->inverse(realIn, imagIn, realOut); } void FFT::inverseInterleaved(const float *BQ_R__ complexIn, float *BQ_R__ realOut) { CHECK_NOT_NULL(complexIn); CHECK_NOT_NULL(realOut); d->inverseInterleaved(complexIn, realOut); } void FFT::inversePolar(const float *BQ_R__ magIn, const float *BQ_R__ phaseIn, float *BQ_R__ realOut) { CHECK_NOT_NULL(magIn); CHECK_NOT_NULL(phaseIn); CHECK_NOT_NULL(realOut); d->inversePolar(magIn, phaseIn, realOut); } void FFT::inverseCepstral(const float *BQ_R__ magIn, float *BQ_R__ cepOut) { CHECK_NOT_NULL(magIn); CHECK_NOT_NULL(cepOut); d->inverseCepstral(magIn, cepOut); } void FFT::initFloat() { d->initFloat(); } void FFT::initDouble() { d->initDouble(); } int FFT::getSize() const { return d->getSize(); } FFT::Precisions FFT::getSupportedPrecisions() const { return d->getSupportedPrecisions(); } #ifdef FFT_MEASUREMENT std::string FFT::tune() { std::ostringstream os; os << "FFT::tune()..." << std::endl; std::vector sizes; std::map candidates; std::map wins; sizes.push_back(512); sizes.push_back(1024); sizes.push_back(2048); sizes.push_back(4096); for (unsigned int si = 0; si < sizes.size(); ++si) { int size = sizes[si]; while (!candidates.empty()) { delete candidates.begin()->first; candidates.erase(candidates.begin()); } FFTImpl *d; #ifdef HAVE_IPP os << "Constructing new IPP FFT object for size " << size << "..." << std::endl; d = new FFTs::D_IPP(size); d->initFloat(); d->initDouble(); candidates[d] = 0; #endif #ifdef HAVE_FFTW3 os << "Constructing new FFTW3 FFT object for size " << size << "..." << std::endl; d = new FFTs::D_FFTW(size); d->initFloat(); d->initDouble(); candidates[d] = 1; #endif #ifdef HAVE_KISSFFT os << "Constructing new KISSFFT object for size " << size << "..." << std::endl; d = new FFTs::D_KISSFFT(size); d->initFloat(); d->initDouble(); candidates[d] = 2; #endif #ifdef USE_BUILTIN_FFT os << "Constructing new Cross FFT object for size " << size << "..." << std::endl; d = new FFTs::D_Cross(size); d->initFloat(); d->initDouble(); candidates[d] = 3; #endif #ifdef HAVE_VDSP os << "Constructing new vDSP FFT object for size " << size << "..." << std::endl; d = new FFTs::D_VDSP(size); d->initFloat(); d->initDouble(); candidates[d] = 4; #endif #ifdef HAVE_MEDIALIB os << "Constructing new MediaLib FFT object for size " << size << "..." << std::endl; d = new FFTs::D_MEDIALIB(size); d->initFloat(); d->initDouble(); candidates[d] = 5; #endif #ifdef HAVE_OPENMAX os << "Constructing new OpenMAX FFT object for size " << size << "..." << std::endl; d = new FFTs::D_OPENMAX(size); d->initFloat(); d->initDouble(); candidates[d] = 6; #endif #ifdef HAVE_SFFT os << "Constructing new SFFT FFT object for size " << size << "..." << std::endl; d = new FFTs::D_SFFT(size); // d->initFloat(); d->initDouble(); candidates[d] = 6; #endif os << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << std::endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; os << "Timing order is: "; for (std::map::iterator ci = candidates.begin(); ci != candidates.end(); ++ci) { os << ci->second << " "; } os << std::endl; int iterations = 500; os << "Iterations: " << iterations << std::endl; double *da = new double[size]; double *db = new double[size]; double *dc = new double[size]; double *dd = new double[size]; double *di = new double[size + 2]; double *dj = new double[size + 2]; float *fa = new float[size]; float *fb = new float[size]; float *fc = new float[size]; float *fd = new float[size]; float *fi = new float[size + 2]; float *fj = new float[size + 2]; for (int type = 0; type < 16; ++type) { //!!! if ((type > 3 && type < 8) || (type > 11)) { continue; } if (type > 7) { // inverse transform: bigger inputs, to simulate the // fact that the forward transform is unscaled for (int i = 0; i < size; ++i) { da[i] = drand48() * size; fa[i] = da[i]; db[i] = drand48() * size; fb[i] = db[i]; } } else { for (int i = 0; i < size; ++i) { da[i] = drand48(); fa[i] = da[i]; db[i] = drand48(); fb[i] = db[i]; } } for (int i = 0; i < size + 2; ++i) { di[i] = drand48(); fi[i] = di[i]; } int low = -1; int lowscore = 0; const char *names[] = { "Forward Cartesian Double", "Forward Interleaved Double", "Forward Polar Double", "Forward Magnitude Double", "Forward Cartesian Float", "Forward Interleaved Float", "Forward Polar Float", "Forward Magnitude Float", "Inverse Cartesian Double", "Inverse Interleaved Double", "Inverse Polar Double", "Inverse Cepstral Double", "Inverse Cartesian Float", "Inverse Interleaved Float", "Inverse Polar Float", "Inverse Cepstral Float" }; os << names[type] << " :: "; for (std::map::iterator ci = candidates.begin(); ci != candidates.end(); ++ci) { FFTImpl *d = ci->first; double mean = 0; clock_t start = clock(); for (int i = 0; i < iterations; ++i) { if (i == 0) { for (int j = 0; j < size; ++j) { dc[j] = 0; dd[j] = 0; fc[j] = 0; fd[j] = 0; fj[j] = 0; dj[j] = 0; } } switch (type) { case 0: d->forward(da, dc, dd); break; case 1: d->forwardInterleaved(da, dj); break; case 2: d->forwardPolar(da, dc, dd); break; case 3: d->forwardMagnitude(da, dc); break; case 4: d->forward(fa, fc, fd); break; case 5: d->forwardInterleaved(fa, fj); break; case 6: d->forwardPolar(fa, fc, fd); break; case 7: d->forwardMagnitude(fa, fc); break; case 8: d->inverse(da, db, dc); break; case 9: d->inverseInterleaved(di, dc); break; case 10: d->inversePolar(da, db, dc); break; case 11: d->inverseCepstral(da, dc); break; case 12: d->inverse(fa, fb, fc); break; case 13: d->inverseInterleaved(fi, fc); break; case 14: d->inversePolar(fa, fb, fc); break; case 15: d->inverseCepstral(fa, fc); break; } if (i == 0) { mean = 0; for (int j = 0; j < size; ++j) { mean += dc[j]; mean += dd[j]; mean += fc[j]; mean += fd[j]; mean += fj[j]; mean += dj[j]; } mean /= size * 6; } } clock_t end = clock(); os << float(end - start)/divisor << " (" << mean << ") "; if (low == -1 || (end - start) < lowscore) { low = ci->second; lowscore = end - start; } } os << std::endl; os << " size " << size << ", type " << type << ": fastest is " << low << " (time " << float(lowscore)/divisor << ")" << std::endl; wins[low]++; } delete[] fa; delete[] fb; delete[] fc; delete[] fd; delete[] da; delete[] db; delete[] dc; delete[] dd; } while (!candidates.empty()) { delete candidates.begin()->first; candidates.erase(candidates.begin()); } int bestscore = 0; int best = -1; for (std::map::iterator wi = wins.begin(); wi != wins.end(); ++wi) { if (best == -1 || wi->second > bestscore) { best = wi->first; bestscore = wi->second; } } os << "overall winner is " << best << " with " << bestscore << " wins" << std::endl; return os.str(); } #endif } sonic-visualiser-3.0.3/bqfft/test/TestFFT.cpp0000644000000000000000000003203113111512442017177 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqfft A small library wrapping various FFT implementations for some common audio processing use cases. Copyright 2007-2015 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "bqfft/FFT.h" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include #include #include #include using namespace breakfastquay; BOOST_AUTO_TEST_SUITE(TestFFT) #ifdef TEST_FFT_IS_SINGLE_PRECISION_ONLY static const double eps = 1e-7; static const float epsf = 1e-6f; #else static const double eps = 1e-14; static const float epsf = 1e-7f; #endif #define COMPARE(a, b) BOOST_CHECK_SMALL(a-b, eps) #define COMPARE_F(a, b) BOOST_CHECK_SMALL(a-b, epsf) #define COMPARE_ZERO(a) BOOST_CHECK_SMALL(a, eps) #define COMPARE_ZERO_F(a) BOOST_CHECK_SMALL(a, epsf) #define COMPARE_ALL(a, x) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - x, eps); \ } #define COMPARE_ALL_F(a, x) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - x, epsf); \ } #define COMPARE_SCALED(a, b, s) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i]/s - b[cmp_i], eps); \ } #define COMPARE_SCALED_F(a, b, s) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i]/s - b[cmp_i], epsf); \ } BOOST_AUTO_TEST_CASE(dc) { // DC-only signal. The DC bin is purely real double in[] = { 1, 1, 1, 1 }; double re[3], im[3]; FFT(4).forward(in, re, im); COMPARE(re[0], 4.0); COMPARE_ZERO(re[1]); COMPARE_ZERO(re[2]); COMPARE_ALL(im, 0.0); double back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(showImplementation) { FFT f(4); // to ensure an implementation has been picked (void)f; // avoid compiler warning std::cerr << "Using implementation: " << FFT::getDefaultImplementation() << std::endl; } BOOST_AUTO_TEST_CASE(sine) { // Sine. Output is purely imaginary double in[] = { 0, 1, 0, -1 }; double re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ALL(re, 0.0); COMPARE_ZERO(im[0]); COMPARE(im[1], -2.0); COMPARE_ZERO(im[2]); double back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(cosine) { // Cosine. Output is purely real double in[] = { 1, 0, -1, 0 }; double re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ZERO(re[0]); COMPARE(re[1], 2.0); COMPARE_ZERO(re[2]); COMPARE_ALL(im, 0.0); double back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(sineCosine) { // Sine and cosine mixed double in[] = { 0.5, 1, -0.5, -1 }; double re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ZERO(re[0]); COMPARE(re[1], 1.0); COMPARE_ZERO(re[2]); COMPARE_ZERO(im[0]); COMPARE(im[1], -2.0); COMPARE_ZERO(im[2]); double back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(nyquist) { double in[] = { 1, -1, 1, -1 }; double re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ZERO(re[0]); COMPARE_ZERO(re[1]); COMPARE(re[2], 4.0); COMPARE_ALL(im, 0.0); double back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(interleaved) { // Sine and cosine mixed, test output format double in[] = { 0.5, 1, -0.5, -1 }; double out[6]; FFT(4).forwardInterleaved(in, out); COMPARE_ZERO(out[0]); COMPARE_ZERO(out[1]); COMPARE(out[2], 1.0); COMPARE(out[3], -2.0); COMPARE_ZERO(out[4]); COMPARE_ZERO(out[5]); double back[4]; FFT(4).inverseInterleaved(out, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(cosinePolar) { double in[] = { 1, 0, -1, 0 }; double mag[3], phase[3]; FFT(4).forwardPolar(in, mag, phase); COMPARE_ZERO(mag[0]); COMPARE(mag[1], 2.0); COMPARE_ZERO(mag[2]); // No meaningful tests for phase[i] where mag[i]==0 (phase // could legitimately be anything) COMPARE_ZERO(phase[1]); double back[4]; FFT(4).inversePolar(mag, phase, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(sinePolar) { double in[] = { 0, 1, 0, -1 }; double mag[3], phase[3]; FFT(4).forwardPolar(in, mag, phase); COMPARE_ZERO(mag[0]); COMPARE(mag[1], 2.0); COMPARE_ZERO(mag[2]); // No meaningful tests for phase[i] where mag[i]==0 (phase // could legitimately be anything) COMPARE(phase[1], -M_PI/2.0); double back[4]; FFT(4).inversePolar(mag, phase, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(magnitude) { // Sine and cosine mixed double in[] = { 0.5, 1, -0.5, -1 }; double out[3]; FFT(4).forwardMagnitude(in, out); COMPARE_ZERO(out[0]); COMPARE_F(float(out[1]), sqrtf(5.0)); COMPARE_ZERO(out[2]); } BOOST_AUTO_TEST_CASE(dirac) { double in[] = { 1, 0, 0, 0 }; double re[3], im[3]; FFT(4).forward(in, re, im); COMPARE(re[0], 1.0); COMPARE(re[1], 1.0); COMPARE(re[2], 1.0); COMPARE_ALL(im, 0.0); double back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED(back, in, 4); } BOOST_AUTO_TEST_CASE(cepstrum) { double in[] = { 1, 0, 0, 0, 1, 0, 0, 0 }; double mag[5]; FFT(8).forwardMagnitude(in, mag); double cep[8]; FFT(8).inverseCepstral(mag, cep); COMPARE_ZERO(cep[1]); COMPARE_ZERO(cep[2]); COMPARE_ZERO(cep[3]); COMPARE_ZERO(cep[5]); COMPARE_ZERO(cep[6]); COMPARE_ZERO(cep[7]); BOOST_CHECK_SMALL(-6.561181 - cep[0]/8, 0.000001); BOOST_CHECK_SMALL( 7.254329 - cep[4]/8, 0.000001); } BOOST_AUTO_TEST_CASE(forwardArrayBounds) { // initialise bins to something recognisable, so we can tell // if they haven't been written double in[] = { 1, 1, -1, -1 }; double re[] = { 999, 999, 999, 999, 999 }; double im[] = { 999, 999, 999, 999, 999 }; FFT(4).forward(in, re+1, im+1); // And check we haven't overrun the arrays COMPARE(re[0], 999.0); COMPARE(im[0], 999.0); COMPARE(re[4], 999.0); COMPARE(im[4], 999.0); } BOOST_AUTO_TEST_CASE(inverseArrayBounds) { // initialise bins to something recognisable, so we can tell // if they haven't been written double re[] = { 0, 1, 0 }; double im[] = { 0, -2, 0 }; double out[] = { 999, 999, 999, 999, 999, 999 }; FFT(4).inverse(re, im, out+1); // And check we haven't overrun the arrays COMPARE(out[0], 999.0); COMPARE(out[5], 999.0); } BOOST_AUTO_TEST_CASE(dcF) { // DC-only signal. The DC bin is purely real float in[] = { 1, 1, 1, 1 }; float re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_F(re[0], 4.0f); COMPARE_ZERO_F(re[1]); COMPARE_ZERO_F(re[2]); COMPARE_ALL_F(im, 0.0f); float back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(sineF) { // Sine. Output is purely imaginary float in[] = { 0, 1, 0, -1 }; float re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ALL_F(re, 0.0f); COMPARE_ZERO_F(im[0]); COMPARE_F(im[1], -2.0f); COMPARE_ZERO_F(im[2]); float back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(cosineF) { // Cosine. Output is purely real float in[] = { 1, 0, -1, 0 }; float re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ZERO_F(re[0]); COMPARE_F(re[1], 2.0f); COMPARE_ZERO_F(re[2]); COMPARE_ALL_F(im, 0.0f); float back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(sineCosineF) { // Sine and cosine mixed float in[] = { 0.5, 1, -0.5, -1 }; float re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ZERO_F(re[0]); COMPARE_F(re[1], 1.0f); COMPARE_ZERO_F(re[2]); COMPARE_ZERO_F(im[0]); COMPARE_F(im[1], -2.0f); COMPARE_ZERO_F(im[2]); float back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(nyquistF) { float in[] = { 1, -1, 1, -1 }; float re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_ZERO_F(re[0]); COMPARE_ZERO_F(re[1]); COMPARE_F(re[2], 4.0f); COMPARE_ALL_F(im, 0.0f); float back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(interleavedF) { // Sine and cosine mixed, test output format float in[] = { 0.5, 1, -0.5, -1 }; float out[6]; FFT(4).forwardInterleaved(in, out); COMPARE_ZERO_F(out[0]); COMPARE_ZERO_F(out[1]); COMPARE_F(out[2], 1.0f); COMPARE_F(out[3], -2.0f); COMPARE_ZERO_F(out[4]); COMPARE_ZERO_F(out[5]); float back[4]; FFT(4).inverseInterleaved(out, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(cosinePolarF) { float in[] = { 1, 0, -1, 0 }; float mag[3], phase[3]; FFT(4).forwardPolar(in, mag, phase); COMPARE_ZERO_F(mag[0]); COMPARE_F(mag[1], 2.0f); COMPARE_ZERO_F(mag[2]); // No meaningful tests for phase[i] where mag[i]==0 (phase // could legitimately be anything) COMPARE_ZERO_F(phase[1]); float back[4]; FFT(4).inversePolar(mag, phase, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(sinePolarF) { float in[] = { 0, 1, 0, -1 }; float mag[3], phase[3]; FFT(4).forwardPolar(in, mag, phase); COMPARE_ZERO_F(mag[0]); COMPARE_F(mag[1], 2.0f); COMPARE_ZERO_F(mag[2]); // No meaningful tests for phase[i] where mag[i]==0 (phase // could legitimately be anything) COMPARE_F(phase[1], -float(M_PI)/2.0f); float back[4]; FFT(4).inversePolar(mag, phase, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(magnitudeF) { // Sine and cosine mixed float in[] = { 0.5, 1, -0.5, -1 }; float out[3]; FFT(4).forwardMagnitude(in, out); COMPARE_ZERO_F(out[0]); COMPARE_F(float(out[1]), sqrtf(5.0f)); COMPARE_ZERO_F(out[2]); } BOOST_AUTO_TEST_CASE(diracF) { float in[] = { 1, 0, 0, 0 }; float re[3], im[3]; FFT(4).forward(in, re, im); COMPARE_F(re[0], 1.0f); COMPARE_F(re[1], 1.0f); COMPARE_F(re[2], 1.0f); COMPARE_ALL_F(im, 0.0f); float back[4]; FFT(4).inverse(re, im, back); COMPARE_SCALED_F(back, in, 4); } BOOST_AUTO_TEST_CASE(cepstrumF) { float in[] = { 1, 0, 0, 0, 1, 0, 0, 0 }; float mag[5]; FFT(8).forwardMagnitude(in, mag); float cep[8]; FFT(8).inverseCepstral(mag, cep); COMPARE_ZERO_F(cep[1]); COMPARE_ZERO_F(cep[2]); COMPARE_ZERO_F(cep[3]); COMPARE_ZERO_F(cep[5]); COMPARE_ZERO_F(cep[6]); COMPARE_ZERO_F(cep[7]); BOOST_CHECK_SMALL(-6.561181 - cep[0]/8, 0.000001); BOOST_CHECK_SMALL( 7.254329 - cep[4]/8, 0.000001); } BOOST_AUTO_TEST_CASE(forwardArrayBoundsF) { // initialise bins to something recognisable, so we can tell // if they haven't been written float in[] = { 1, 1, -1, -1 }; float re[] = { 999, 999, 999, 999, 999 }; float im[] = { 999, 999, 999, 999, 999 }; FFT(4).forward(in, re+1, im+1); // And check we haven't overrun the arrays COMPARE_F(re[0], 999.0f); COMPARE_F(im[0], 999.0f); COMPARE_F(re[4], 999.0f); COMPARE_F(im[4], 999.0f); } BOOST_AUTO_TEST_CASE(inverseArrayBoundsF) { // initialise bins to something recognisable, so we can tell // if they haven't been written float re[] = { 0, 1, 0 }; float im[] = { 0, -2, 0 }; float out[] = { 999, 999, 999, 999, 999, 999 }; FFT(4).inverse(re, im, out+1); // And check we haven't overrun the arrays COMPARE_F(out[0], 999.0f); COMPARE_F(out[5], 999.0f); } BOOST_AUTO_TEST_SUITE_END() sonic-visualiser-3.0.3/bqresample/.hgignore0000644000000000000000000000003713111512442017072 0ustar 00000000000000syntax: glob *~ *.o *.a test-* sonic-visualiser-3.0.3/bqresample/.travis.yml0000644000000000000000000000113313111512442017376 0ustar 00000000000000language: cpp os: - linux - osx addons: apt: packages: - libboost-test-dev - valgrind before_install: - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew install libsamplerate ; fi - if [[ "$TRAVIS_OS_NAME" = "linux" ]] ; then ( cd .. ; curl -O http://www.mega-nerd.com/SRC/libsamplerate-0.1.9.tar.gz && tar xvzf libsamplerate-0.1.9.tar.gz && cd libsamplerate-0.1.9 && ./configure --enable-static --disable-shared && make && sudo make install ) ; fi - ( cd .. ; git clone https://github.com/breakfastquay/bqvec ) script: - ./build/run-platform-tests.sh "$TRAVIS_OS_NAME" sonic-visualiser-3.0.3/bqresample/COPYING0000644000000000000000000000252713111512442016330 0ustar 00000000000000 Copyright 2007-2015 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/bqresample/Makefile0000644000000000000000000000204313111512442016726 0ustar 00000000000000 # Add to RESAMPLE_DEFINES the relevant options for your desired # third-party library support. # # Available options are # # -DHAVE_IPP Intel's Integrated Performance Primitives are available # -DHAVE_LIBRESAMPLE The libresample library is available # -DHAVE_LIBSAMPLERATE The libsamplerate library is available # -DUSE_SPEEX Compile the built-in Speex-derived resampler # # You may define more than one of these. If you define USE_SPEEX, the # code will be compiled in and will be used when it is judged to be # the best available option for a given quality setting. If no flags # are supplied, the code will refuse to compile. RESAMPLE_DEFINES := -DUSE_SPEEX # Add to VECTOR_DEFINES and ALLOCATOR_DEFINES any options desired for # the bqvec library (that are not already defined in RESAMPLE_DEFINES). # See the bqvec build documentation for more details. # VECTOR_DEFINES := ALLOCATOR_DEFINES := # Add any related includes and libraries here # THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := include build/Makefile.inc sonic-visualiser-3.0.3/bqresample/README.md0000644000000000000000000000152413111512442016550 0ustar 00000000000000 bqresample ========== A small C++ library wrapping various audio sample rate conversion libraries. Requires the bqvec library. This code originated as part of the Rubber Band Library written by the same authors (see https://bitbucket.org/breakfastquay/rubberband/). It has been pulled out into a separate library and relicensed under a more permissive licence. C++ standard required: C++98 (does not use C++11 or newer features) * To compile: read and follow the notes in Makefile, edit the Makefile, then make test. Or else use one of the pre-edited Makefiles in the build directory. [![Build Status](https://travis-ci.org/breakfastquay/bqresample.svg?branch=master)](https://travis-ci.org/breakfastquay/bqresample) Copyright 2007-2017 Particular Programs Ltd. Uses Speex code, see speex/COPYING for copyright and licence information. sonic-visualiser-3.0.3/bqresample/bqresample/Resampler.h0000644000000000000000000001174513111512442021535 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqresample A small library wrapping various audio sample rate conversion implementations in C++. Copyright 2007-2015 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQ_RESAMPLER_H #define BQ_RESAMPLER_H #include "bqvec/Restrict.h" namespace breakfastquay { class Resampler { public: enum Quality { Best, FastestTolerable, Fastest }; enum Exception { ImplementationError }; struct Parameters { /** * Resampler filter quality level. */ Quality quality; /** * Rate of expected input prior to resampling: may be used to * determine the filter bandwidth for the quality setting. If * you don't know what this will be, you can provide an * arbitrary rate (such as the default) and the resampler will * work fine, but quality may not be as designed. */ double initialSampleRate; /** * Bound on the maximum incount size that may be passed to the * resample function before the resampler needs to reallocate * its internal buffers. */ int maxBufferSize; /** * Debug output level, from 0 to 3. Controls the amount of * debug information printed to stderr. */ int debugLevel; Parameters() : quality(FastestTolerable), initialSampleRate(44100), maxBufferSize(0), debugLevel(0) { } }; /** * Construct a resampler to process the given number of channels, * with the given quality level, initial sample rate, and other * parameters. */ Resampler(Parameters parameters, int channels); ~Resampler(); /** * Resample the given multi-channel buffers, where incount is the * number of frames in the input buffers and outspace is the space * available in the output buffers. Generally you want outspace to * be at least ceil(incount * ratio). * * Returns the number of frames written to the output * buffers. This may be smaller than outspace even where the ratio * suggests otherwise, particularly at the start of processing * where there may be a filter tail to allow for. */ #ifdef __GNUC__ __attribute__((warn_unused_result)) #endif int resample(float *const BQ_R__ *const BQ_R__ out, int outspace, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final = false); /** * Resample the given interleaved buffer, where incount is the * number of frames in the input buffer (i.e. it has incount * * getChannelCount() samples) and outspace is the space available * in frames in the output buffer (i.e. it has space for at least * outspace * getChannelCount() samples). Generally you want * outspace to be at least ceil(incount * ratio). * * Returns the number of frames written to the output buffer. This * may be smaller than outspace even where the ratio suggests * otherwise, particularly at the start of processing where there * may be a filter tail to allow for. */ #ifdef __GNUC__ __attribute__((warn_unused_result)) #endif int resampleInterleaved(float *const BQ_R__ out, int outspace, const float *const BQ_R__ in, int incount, double ratio, bool final = false); int getChannelCount() const; void reset(); class Impl; protected: Impl *d; int m_method; }; } #endif sonic-visualiser-3.0.3/bqresample/build/Makefile.inc0000644000000000000000000000245013111512442020577 0ustar 00000000000000 SRC_DIR := src TEST_DIR := test SPEEX_DIR := speex HEADER_DIR := bqresample SOURCES := $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SPEEX_DIR)/*.c) HEADERS := $(wildcard $(HEADER_DIR)/*.h) $(wildcard $(SRC_DIR)/*.h) OBJECTS := $(SOURCES:.cpp=.o) OBJECTS := $(OBJECTS:.c=.o) TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) TEST_OBJECTS := $(TEST_SOURCES:.cpp=.o) OPTFLAGS ?= -O3 -ffast-math CXXFLAGS ?= -std=c++98 -fpic -Wall -Wextra -Werror $(RESAMPLE_DEFINES) $(VECTOR_DEFINES) $(ALLOCATOR_DEFINES) $(OPTFLAGS) -I. $(THIRD_PARTY_INCLUDES) -I../bqvec CFLAGS := -fpic -Wall -Wextra $(RESAMPLE_DEFINES) $(VECTOR_DEFINES) $(ALLOCATOR_DEFINES) $(OPTFLAGS) -I. $(THIRD_PARTY_INCLUDES) LIBRARY := libbqresample.a all: $(LIBRARY) test: $(LIBRARY) test-resampler ./test-resampler valgrind: $(LIBRARY) test-resampler valgrind ./test-resampler $(LIBRARY): $(OBJECTS) $(AR) rc $@ $^ test-resampler: test/TestResampler.o $(LIBRARY) $(CXX) $(CXXFLAGS) -o $@ $^ $(LIBRARY) -lboost_unit_test_framework -L../bqvec -lbqvec $(THIRD_PARTY_LIBS) clean: rm -f $(OBJECTS) $(TEST_OBJECTS) distclean: clean rm -f $(LIBRARY) test-resampler depend: makedepend -Y -fbuild/Makefile.inc $(SOURCES) $(HEADERS) $(TEST_SOURCES) # DO NOT DELETE src/Resampler.o: bqresample/Resampler.h test/TestResampler.o: bqresample/Resampler.h sonic-visualiser-3.0.3/bqresample/build/Makefile.linux.ipp0000644000000000000000000000043213111512442021752 0ustar 00000000000000 RESAMPLE_DEFINES := -DHAVE_IPP VECTOR_DEFINES := ALLOCATOR_DEFINES := -DHAVE_POSIX_MEMALIGN THIRD_PARTY_INCLUDES := -I/opt/intel/ipp/include THIRD_PARTY_LIBS := -L/opt/intel/ipp/lib/intel64_lin -Wl,-Bstatic -lipps -lippvm -lippcore -Wl,-Bdynamic include build/Makefile.inc sonic-visualiser-3.0.3/bqresample/build/Makefile.linux.libsamplerate0000644000000000000000000000030313111512442024003 0ustar 00000000000000 RESAMPLE_DEFINES := -DHAVE_LIBSAMPLERATE VECTOR_DEFINES := ALLOCATOR_DEFINES := -DHAVE_POSIX_MEMALIGN THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := -lsamplerate include build/Makefile.inc sonic-visualiser-3.0.3/bqresample/build/Makefile.osx.libsamplerate0000644000000000000000000000030113111512442023453 0ustar 00000000000000 RESAMPLE_DEFINES := -DHAVE_LIBSAMPLERATE VECTOR_DEFINES := ALLOCATOR_DEFINES := -DMALLOC_IS_ALIGNED THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := -lsamplerate include build/Makefile.inc sonic-visualiser-3.0.3/bqresample/build/run-platform-tests.sh0000755000000000000000000000325513111512442022520 0ustar 00000000000000#!/bin/bash if [ -z "$1" ]; then echo "Usage: $0 " exit 2 fi platformtag="$1" set -eu ippdir=/opt/intel/ipp echo if [ -d "$ippdir" ]; then echo "Found IPP directory $ippdir, considering IPP as well as other options" else echo "No IPP directory $ippdir, not testing with IPP" fi if valgrind --version >/dev/null 2>&1 ; then have_valgrind=yes else echo echo "No valgrind executable found, not using valgrind" have_valgrind=no fi tmpfile=$(mktemp "/tmp/test_XXXXXX") trap "rm -f $tmpfile" 0 run() { successtext="$1" shift echo -n "Running \"$@\"..." if "$@" > "$tmpfile" 2>&1 ; then if [ -z "$successtext" ] || fgrep -q "$successtext" "$tmpfile" ; then echo " OK" return 0 else echo " Failed" cat "$tmpfile" return 1 fi else echo " Failed" cat "$tmpfile" return 1 fi } for mf in Makefile build/Makefile.$platformtag build/Makefile.$platformtag.* ; do case "$mf" in *~) continue;; *.bak) continue;; *ipp) if [ ! -d "$ippdir" ]; then continue fi;; esac if [ ! -f "$mf" ]; then continue fi echo echo "Building and testing with $mf:" echo if [ -f "../bqvec/$mf" ]; then echo "Similar Makefile exists in bqvec dir, building there first..." ( cd ../bqvec ; run "" make -f "$mf" clean && run "" make -f "$mf" ) echo "Build in bqvec done" echo fi run "" make -f "$mf" clean run "No errors detected" make -f "$mf" test if [ "$have_valgrind" = "yes" ]; then for t in test-* ; do if [ -x "$t" ]; then run "no leaks are possible" valgrind --leak-check=full ./"$t" fi done fi done echo echo "All tests passed" echo sonic-visualiser-3.0.3/bqresample/speex/COPYING0000644000000000000000000000335613111512442017455 0ustar 00000000000000Copyright 2002-2007 Xiph.org Foundation Copyright 2002-2007 Jean-Marc Valin Copyright 2005-2007 Analog Devices Inc. Copyright 2005-2007 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Copyright 1993, 2002, 2006 David Rowe Copyright 2003 EpicGames Copyright 1992-1994 Jutta Degener, Carsten Bormann 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 the Xiph.org Foundation 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 FOUNDATION 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. sonic-visualiser-3.0.3/bqresample/speex/resample.c0000644000000000000000000011542713111512442020401 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Copyright (C) 2007 Jean-Marc Valin File: resample.c Arbitrary resampling code 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. */ /* The design goals of this code are: - Very fast algorithm - SIMD-friendly algorithm - Low memory requirement - Good *perceptual* quality (and not best SNR) Warning: This resampler is relatively new. Although I think I got rid of all the major bugs and I don't expect the API to change anymore, there may be something I've missed. So use with caution. This algorithm is based on this original resampling algorithm: Smith, Julius O. Digital Audio Resampling Home Page Center for Computer Research in Music and Acoustics (CCRMA), Stanford University, 2007. Web published at http://www-ccrma.stanford.edu/~jos/resample/. There is one main difference, though. This resampler uses cubic interpolation instead of linear interpolation in the above paper. This makes the table much smaller and makes it possible to compute that table on a per-stream basis. In turn, being able to tweak the table for each stream makes it possible to both reduce complexity on simple ratios (e.g. 2/3), and get rid of the rounding operations in the inner loop. The latter both reduces CPU time and makes the algorithm more SIMD-friendly. */ /* NOTE: This code has been cut down and reformatted by Chris Cannam for personal reading preference, and for use in the Rubber Band time stretching and pitch shifting library. If you have problems with this code, cast suspicion on the butchering it has undergone; it's probably my fault. If you want a properly functioning version, please go for the original Speex code first. I haven't made any substantial changes to this code, I've just made it less generally useful. */ #ifdef USE_SPEEX #include #include #include #ifdef HAVE_IPP #include #endif // Simple allocators with a fixed minimum, to avoid reallocation if // the size changes but remains smaller than that. The system alloc // functions no doubt do exactly the same thing for some value // probably not too distant from ours, but we want the certainty. #define ALLOC_MINIMUM 4096 static void *speex_alloc (int count, int size) { #ifdef HAVE_IPP void *rv; #endif if (count * size < ALLOC_MINIMUM) { count = ALLOC_MINIMUM / size; } #ifdef HAVE_IPP if (size == sizeof(float) && size == 4) { rv = ippsMalloc_32f(count); } else if (size == sizeof(double) && size == 8) { rv = ippsMalloc_64f(count); } else { rv = ippsMalloc_8u(count * size); } memset(rv, count * size, 0); return rv; #else return calloc(count, size); #endif } static void speex_free (void *ptr) { #ifdef HAVE_IPP ippsFree(ptr); #else free(ptr); #endif } static void *speex_realloc (void *ptr, int oldcount, int newcount, int size) { #ifdef HAVE_IPP void *newptr; #endif if (newcount * size < ALLOC_MINIMUM) { return ptr; } #ifdef HAVE_IPP newptr = speex_alloc(newcount, size); if (ptr && oldcount > 0) { int copy = newcount; if (oldcount < copy) copy = oldcount; memcpy(newptr, ptr, copy * size); } speex_free(ptr); return newptr; #else (void)oldcount; return realloc(ptr, newcount * size); #endif } #include "speex_resampler.h" #include #ifndef M_PI #define M_PI 3.14159263 #endif #define FILTER_SIZE 64 #define OVERSAMPLE 8 #define IMAX(a,b) ((a) > (b) ? (a) : (b)) #define IMIN(a,b) ((a) < (b) ? (a) : (b)) #ifndef NULL #define NULL 0 #endif typedef int (*resampler_basic_func)(SpeexResamplerState *, spx_uint32_t , const float *, spx_uint32_t *, float *, spx_uint32_t *); struct SpeexResamplerState_ { spx_uint32_t in_rate; spx_uint32_t out_rate; spx_uint32_t num_rate; spx_uint32_t den_rate; int quality; spx_uint32_t nb_channels; spx_uint32_t filt_len; spx_uint32_t mem_alloc_size; int int_advance; int frac_advance; float cutoff; spx_uint32_t oversample; int initialised; int started; /* These are per-channel */ spx_int32_t *last_sample; spx_uint32_t *samp_frac_num; spx_uint32_t *magic_samples; float *mem; float *sinc_table; spx_uint32_t sinc_table_length; spx_uint32_t sinc_table_alloc; resampler_basic_func resampler_ptr; int in_stride; int out_stride; } ; static double kaiser12_table[68] = { 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076, 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014, 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601, 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014, 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490, 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546, 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178, 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947, 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058, 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438, 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734, 0.00001000, 0.00000000 }; static double kaiser10_table[36] = { 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446, 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347, 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962, 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451, 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739, 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000 }; static double kaiser8_table[36] = { 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200, 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126, 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272, 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758, 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490, 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000 }; static double kaiser6_table[36] = { 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003, 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565, 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561, 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058, 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600, 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000 }; struct FuncDef { double *table; int oversample; }; static struct FuncDef _KAISER12 = {kaiser12_table, 64}; #define KAISER12 (&_KAISER12) static struct FuncDef _KAISER10 = {kaiser10_table, 32}; #define KAISER10 (&_KAISER10) static struct FuncDef _KAISER8 = {kaiser8_table, 32}; #define KAISER8 (&_KAISER8) static struct FuncDef _KAISER6 = {kaiser6_table, 32}; #define KAISER6 (&_KAISER6) struct QualityMapping { int base_length; int oversample; float downsample_bandwidth; float upsample_bandwidth; struct FuncDef *window_func; }; /* This table maps conversion quality to internal parameters. There are two reasons that explain why the up-sampling bandwidth is larger than the down-sampling bandwidth: 1) When up-sampling, we can assume that the spectrum is already attenuated close to the Nyquist rate (from an A/D or a previous resampling filter) 2) Any aliasing that occurs very close to the Nyquist rate will be masked by the sinusoids/noise just below the Nyquist rate (guaranteed only for up-sampling). */ static const struct QualityMapping quality_map[11] = { { 8, 4, 0.830f, 0.860f, KAISER6 }, /* Q0 */ { 16, 4, 0.850f, 0.880f, KAISER6 }, /* Q1 */ { 32, 4, 0.882f, 0.910f, KAISER6 }, /* Q2 */ /* 82.3% cutoff ( ~60 dB stop) 6 */ { 48, 8, 0.895f, 0.917f, KAISER8 }, /* Q3 */ /* 84.9% cutoff ( ~80 dB stop) 8 */ { 64, 8, 0.921f, 0.940f, KAISER8 }, /* Q4 */ /* 88.7% cutoff ( ~80 dB stop) 8 */ { 80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 */ /* 89.1% cutoff (~100 dB stop) 10 */ { 96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 */ /* 91.5% cutoff (~100 dB stop) 10 */ {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 */ /* 93.1% cutoff (~100 dB stop) 10 */ {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 */ /* 94.5% cutoff (~100 dB stop) 10 */ {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 */ /* 95.5% cutoff (~100 dB stop) 10 */ {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 */ /* 96.6% cutoff (~100 dB stop) 10 */ }; /*8,24,40,56,80,104,128,160,200,256,320*/ static double compute_func(float x, struct FuncDef *func) { float y, frac; double interp[4]; int ind; y = x * func->oversample; ind = (int)floor(y); frac = (y - ind); /* CSE with handle the repeated powers */ interp[3] = -0.1666666667 * frac + 0.1666666667 * (frac * frac * frac); interp[2] = frac + 0.5 * (frac * frac) - 0.5 * (frac * frac * frac); interp[0] = -0.3333333333 * frac + 0.5 * (frac * frac) - 0.1666666667 * (frac * frac * frac); /* Just to make sure we don't have rounding problems */ interp[1] = 1.f - interp[3] - interp[2] - interp[0]; /*sum = frac*accum[1] + (1-frac)*accum[2];*/ return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3]; } /* The slow way of computing a sinc for the table. Should improve that some day */ static float sinc(float cutoff, float x, int N, struct FuncDef *window_func) { float xx = x * cutoff; if (fabsf(x) < 1e-6) return cutoff; else if (fabsf(x) > .5*N) return 0; /*FIXME: Can it really be any slower than this? */ return cutoff*sin(M_PI*xx) / (M_PI*xx) * compute_func(fabs(2.*x / N), window_func); } static void cubic_coef(float frac, float interp[4]) { /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation but I know it's MMSE-optimal on a sinc */ interp[0] = -0.16667f * frac + 0.16667f * frac * frac * frac; interp[1] = frac + 0.5f * frac * frac - 0.5f * frac * frac * frac; interp[3] = -0.33333f * frac + 0.5f * frac * frac - 0.16667f * frac * frac * frac; /* Just to make sure we don't have rounding problems */ interp[2] = 1. - interp[0] - interp[1] - interp[3]; } static int resampler_basic_direct_single(SpeexResamplerState *st, unsigned int channel_index, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { int N = st->filt_len; int out_sample = 0; float *mem; int last_sample = st->last_sample[channel_index]; unsigned int samp_frac_num = st->samp_frac_num[channel_index]; mem = st->mem + channel_index * st->mem_alloc_size; while (!(last_sample >= (int)*in_len || out_sample >= (int)*out_len)) { int j; float sum = 0; /* We already have all the filter coefficients pre-computed in the table */ const float *ptr; for (j = 0; last_sample - N + 1 + j < 0; j++) { sum += ((float)(mem[last_sample+j]) * (float)(st->sinc_table[samp_frac_num*st->filt_len+j])); } /* Do the new part */ if (in != NULL) { ptr = in + st->in_stride * (last_sample - N + 1 + j); for (; j < N; j++) { sum += ((float)(*ptr) * (float)(st->sinc_table[samp_frac_num*st->filt_len+j])); ptr += st->in_stride; } } *out = (sum); out += st->out_stride; out_sample++; last_sample += st->int_advance; samp_frac_num += st->frac_advance; if (samp_frac_num >= st->den_rate) { samp_frac_num -= st->den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } /* This is the same as the previous function, except with a double-precision accumulator */ static int resampler_basic_direct_double(SpeexResamplerState *st, unsigned int channel_index, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { int N = st->filt_len; int out_sample = 0; float *mem; int last_sample = st->last_sample[channel_index]; unsigned int samp_frac_num = st->samp_frac_num[channel_index]; mem = st->mem + channel_index * st->mem_alloc_size; while (!(last_sample >= (int)*in_len || out_sample >= (int)*out_len)) { int j; double sum = 0; /* We already have all the filter coefficients pre-computed in * the table */ const float *ptr; for (j = 0; last_sample - N + 1 + j < 0; j++) { sum += ((float)(mem[last_sample+j]) * (float)((double)st->sinc_table[samp_frac_num*st->filt_len+j])); } /* Do the new part */ if (in != NULL) { ptr = in + st->in_stride * (last_sample - N + 1 + j); for (; j < N; j++) { sum += ((float)(*ptr) * (float)((double)st->sinc_table[samp_frac_num*st->filt_len+j])); ptr += st->in_stride; } } *out = sum; out += st->out_stride; out_sample++; last_sample += st->int_advance; samp_frac_num += st->frac_advance; if (samp_frac_num >= st->den_rate) { samp_frac_num -= st->den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } static int resampler_basic_interpolate_single(SpeexResamplerState *st, unsigned int channel_index, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { int N = st->filt_len; int out_sample = 0; float *mem; int last_sample = st->last_sample[channel_index]; unsigned int samp_frac_num = st->samp_frac_num[channel_index]; mem = st->mem + channel_index * st->mem_alloc_size; while (!(last_sample >= (int)*in_len || out_sample >= (int)*out_len)) { int j; float sum = 0; /* We need to interpolate the sinc filter */ float accum[4] = {0.f, 0.f, 0.f, 0.f}; float interp[4]; const float *ptr; int offset; float frac; offset = samp_frac_num * st->oversample / st->den_rate; frac = ((float)((samp_frac_num * st->oversample) % st->den_rate)) / st->den_rate; /* This code is written like this to make it easy to optimise * with SIMD. For most DSPs, it would be best to split the * loops in two because most DSPs have only two * accumulators */ for (j = 0; last_sample - N + 1 + j < 0; j++) { float curr_mem = mem[last_sample+j]; accum[0] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 2])); accum[1] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 1])); accum[2] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset])); accum[3] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset + 1])); } if (in != NULL) { ptr = in + st->in_stride * (last_sample - N + 1 + j); /* Do the new part */ for (; j < N; j++) { float curr_in = *ptr; ptr += st->in_stride; accum[0] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 2])); accum[1] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 1])); accum[2] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset])); accum[3] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset + 1])); } } cubic_coef(frac, interp); sum = ((interp[0]) * (accum[0])) + ((interp[1]) * (accum[1])) + ((interp[2]) * (accum[2])) + ((interp[3]) * (accum[3])); *out = (sum); out += st->out_stride; out_sample++; last_sample += st->int_advance; samp_frac_num += st->frac_advance; if (samp_frac_num >= st->den_rate) { samp_frac_num -= st->den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } /* This is the same as the previous function, except with a * double-precision accumulator */ static int resampler_basic_interpolate_double(SpeexResamplerState *st, unsigned int channel_index, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { int N = st->filt_len; int out_sample = 0; float *mem; int last_sample = st->last_sample[channel_index]; unsigned int samp_frac_num = st->samp_frac_num[channel_index]; mem = st->mem + channel_index * st->mem_alloc_size; while (!(last_sample >= (int)*in_len || out_sample >= (int)*out_len)) { int j; float sum = 0; /* We need to interpolate the sinc filter */ double accum[4] = {0.f, 0.f, 0.f, 0.f}; float interp[4]; const float *ptr; float alpha = ((float)samp_frac_num) / st->den_rate; int offset = samp_frac_num * st->oversample / st->den_rate; float frac = alpha * st->oversample - offset; /* This code is written like this to make it easy to optimise * with SIMD. For most DSPs, it would be best to split the * loops in two because most DSPs have only two * accumulators */ for (j = 0; last_sample - N + 1 + j < 0; j++) { double curr_mem = mem[last_sample + j]; accum[0] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 2])); accum[1] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 1])); accum[2] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset])); accum[3] += ((float)(curr_mem) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset + 1])); } if (in != NULL) { ptr = in + st->in_stride * (last_sample - N + 1 + j); /* Do the new part */ for (; j < N; j++) { double curr_in = *ptr; ptr += st->in_stride; accum[0] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 2])); accum[1] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset - 1])); accum[2] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset])); accum[3] += ((float)(curr_in) * (float)(st->sinc_table [4 + (j+1)*st->oversample - offset + 1])); } } cubic_coef(frac, interp); sum = interp[0] * accum[0] + interp[1] * accum[1] + interp[2] * accum[2] + interp[3] * accum[3]; *out = (sum); out += st->out_stride; out_sample++; last_sample += st->int_advance; samp_frac_num += st->frac_advance; if (samp_frac_num >= st->den_rate) { samp_frac_num -= st->den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } static void update_filter(SpeexResamplerState *st) { unsigned int old_length; /* fprintf(stderr, "update_filter\n"); */ old_length = st->filt_len; st->oversample = quality_map[st->quality].oversample; st->filt_len = quality_map[st->quality].base_length; if (st->num_rate > st->den_rate) { /* down-sampling */ st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate; st->filt_len = (unsigned int) ceil(st->filt_len * ((double)st->num_rate / (double)st->den_rate)); /* Round down to make sure we have a multiple of 4 */ st->filt_len &= (~0x3); if (2*st->den_rate < st->num_rate) st->oversample >>= 1; if (4*st->den_rate < st->num_rate) st->oversample >>= 1; if (8*st->den_rate < st->num_rate) st->oversample >>= 1; if (16*st->den_rate < st->num_rate) st->oversample >>= 1; if (st->oversample < 1) st->oversample = 1; } else { /* up-sampling */ st->cutoff = quality_map[st->quality].upsample_bandwidth; } /* Choose the resampling type that requires the least amount of memory */ if (st->den_rate <= st->oversample) { unsigned int i; if (!st->sinc_table) { st->sinc_table = (float *)speex_alloc (st->filt_len * st->den_rate, sizeof(float)); } else if (st->sinc_table_alloc < st->filt_len*st->den_rate) { // fprintf(stderr,"sinc_table=%p\n",st->sinc_table); st->sinc_table = (float *)speex_realloc (st->sinc_table, st->sinc_table_alloc, st->filt_len * st->den_rate, sizeof(float)); st->sinc_table_alloc = st->filt_len * st->den_rate; } for (i = 0; i < st->den_rate; i++) { int j; for (j = 0; j < (int)st->filt_len; j++) { st->sinc_table[i*st->filt_len+j] = sinc (st->cutoff, ((j - (int)st->filt_len / 2 + 1) - ((float)i) / st->den_rate), st->filt_len, quality_map[st->quality].window_func); } } if (st->quality > 8) { st->resampler_ptr = resampler_basic_direct_double; } else { st->resampler_ptr = resampler_basic_direct_single; } /* fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", st->cutoff); */ } else { int i; if (!st->sinc_table) { st->sinc_table = (float *)speex_alloc ((st->filt_len * st->oversample + 8), sizeof(float)); } else if (st->sinc_table_alloc < st->filt_len*st->oversample + 8) { //fprintf(stderr,"sinc_table=%p\n",st->sinc_table); st->sinc_table = (float *)speex_realloc (st->sinc_table, st->sinc_table_alloc, (st->filt_len * st->oversample + 8), sizeof(float)); st->sinc_table_alloc = st->filt_len * st->oversample + 8; } for (i = -4; i < (int)(st->oversample * st->filt_len + 4); i++) { st->sinc_table[i+4] = sinc (st->cutoff, (i / (float)st->oversample - st->filt_len / 2), st->filt_len, quality_map[st->quality].window_func); } if (st->quality > 8) st->resampler_ptr = resampler_basic_interpolate_double; else st->resampler_ptr = resampler_basic_interpolate_single; /* fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", st->cutoff); */ /* fprintf (stderr, "table length %d, filt len %d\n", st->sinc_table_length, st->filt_len); */ } st->int_advance = st->num_rate / st->den_rate; st->frac_advance = st->num_rate % st->den_rate; /* Here's the place where we update the filter memory to take into account the change in filter length. It's probably the messiest part of the code due to handling of lots of corner cases. */ if (!st->mem) { unsigned int i; st->mem = (float*)speex_alloc (st->nb_channels * (st->filt_len - 1), sizeof(float)); for (i = 0; i < st->nb_channels * (st->filt_len - 1); i++) st->mem[i] = 0; st->mem_alloc_size = st->filt_len - 1; } else if (!st->started) { unsigned int i; //fprintf(stderr,"mem=%p\n",st->mem); st->mem = (float*)speex_realloc (st->mem, 0, st->nb_channels * (st->filt_len - 1), sizeof(float)); for (i = 0; i < st->nb_channels * (st->filt_len - 1); i++) st->mem[i] = 0; st->mem_alloc_size = st->filt_len - 1; } else if (st->filt_len > old_length) { int i; /* Increase the filter length */ int old_alloc_size = st->mem_alloc_size; if (st->filt_len - 1 > st->mem_alloc_size) { //fprintf(stderr,"mem=%p\n",st->mem); st->mem = (float*)speex_realloc (st->mem, st->nb_channels * (old_length - 1), st->nb_channels * (st->filt_len - 1), sizeof(float)); st->mem_alloc_size = st->filt_len - 1; } for (i = st->nb_channels - 1; i >= 0; i--) { int j; unsigned int olen = old_length; /*if (st->magic_samples[i])*/ { /* Try and remove the magic samples as if nothing had happened */ /* FIXME: This is wrong but for now we need it to * avoid going over the array bounds */ olen = old_length + 2 * st->magic_samples[i]; for (j = old_length - 2 + st->magic_samples[i]; j >= 0; j--) { st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j]; } for (j = 0; j < (int)st->magic_samples[i]; j++) { st->mem[i*st->mem_alloc_size+j] = 0; } st->magic_samples[i] = 0; } if (st->filt_len > olen) { /* If the new filter length is still bigger than the * "augmented" length */ /* Copy data going backward */ for (j = 0; j < (int)olen - 1; j++) { st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)]; } /* Then put zeros for lack of anything better */ for (; j < (int)st->filt_len - 1; j++) { st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0; } /* Adjust last_sample */ st->last_sample[i] += (st->filt_len - olen) / 2; } else { /* Put back some of the magic! */ st->magic_samples[i] = (olen - st->filt_len) / 2; for (j = 0; j < (int)st->filt_len - 1 + (int)st->magic_samples[i]; j++) { st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; } } } } else if (st->filt_len < old_length) { unsigned int i; /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic" samples so they can be used directly as input the next time(s) */ for (i = 0; i < st->nb_channels; i++) { unsigned int j; unsigned int old_magic = st->magic_samples[i]; st->magic_samples[i] = (old_length - st->filt_len) / 2; /* We must copy some of the memory that's no longer used */ /* Copy data going backward */ for (j = 0; j < st->filt_len - 1 + st->magic_samples[i] + old_magic; j++) { st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; } st->magic_samples[i] += old_magic; } } } SpeexResamplerState *speex_resampler_init(unsigned int nb_channels, unsigned int in_rate, unsigned int out_rate, int quality, int *err) { return speex_resampler_init_frac(nb_channels, in_rate, out_rate, in_rate, out_rate, quality, err); } SpeexResamplerState *speex_resampler_init_frac(unsigned int nb_channels, unsigned int ratio_num, unsigned int ratio_den, unsigned int in_rate, unsigned int out_rate, int quality, int *err) { unsigned int i; SpeexResamplerState *st; if (quality > 10 || quality < 0) { if (err) *err = RESAMPLER_ERR_INVALID_ARG; return NULL; } st = (SpeexResamplerState *)speex_alloc(1, sizeof(SpeexResamplerState)); st->initialised = 0; st->started = 0; st->in_rate = 0; st->out_rate = 0; st->num_rate = 0; st->den_rate = 0; st->quality = -1; st->sinc_table = 0; st->sinc_table_length = 0; st->sinc_table_alloc = 0; st->mem_alloc_size = 0; st->filt_len = 0; st->mem = 0; st->resampler_ptr = 0; st->cutoff = 1.f; st->nb_channels = nb_channels; st->in_stride = 1; st->out_stride = 1; /* Per channel data */ st->last_sample = (int*)speex_alloc(nb_channels, sizeof(int)); st->magic_samples = (unsigned int*)speex_alloc(nb_channels, sizeof(int)); st->samp_frac_num = (unsigned int*)speex_alloc(nb_channels, sizeof(int)); for (i = 0; i < nb_channels; i++) { st->last_sample[i] = 0; st->magic_samples[i] = 0; st->samp_frac_num[i] = 0; } speex_resampler_set_quality(st, quality); speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate); update_filter(st); st->initialised = 1; if (err) *err = RESAMPLER_ERR_SUCCESS; return st; } void speex_resampler_destroy(SpeexResamplerState *st) { speex_free(st->mem); speex_free(st->sinc_table); speex_free(st->last_sample); speex_free(st->magic_samples); speex_free(st->samp_frac_num); speex_free(st); } static int speex_resampler_process_native(SpeexResamplerState *st, unsigned int channel_index, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { int j = 0; int N = st->filt_len; int out_sample = 0; float *mem; unsigned int tmp_out_len = 0; mem = st->mem + channel_index * st->mem_alloc_size; st->started = 1; /* Handle the case where we have samples left from a reduction in * filter length */ if (st->magic_samples[channel_index]) { int istride_save; unsigned int tmp_in_len; unsigned int tmp_magic; istride_save = st->in_stride; tmp_in_len = st->magic_samples[channel_index]; tmp_out_len = *out_len; /* magic_samples needs to be set to zero to avoid infinite recursion */ tmp_magic = st->magic_samples[channel_index]; st->magic_samples[channel_index] = 0; st->in_stride = 1; speex_resampler_process_native(st, channel_index, mem + N-1, &tmp_in_len, out, &tmp_out_len); st->in_stride = istride_save; /* If we couldn't process all "magic" input samples, save the * rest for next time */ if (tmp_in_len < tmp_magic) { unsigned int i; st->magic_samples[channel_index] = tmp_magic - tmp_in_len; for (i = 0; i < st->magic_samples[channel_index]; i++) { mem[N-1+i] = mem[N-1+i+tmp_in_len]; } } out += tmp_out_len * st->out_stride; *out_len -= tmp_out_len; } /* Call the right resampler through the function ptr */ out_sample = st->resampler_ptr(st, channel_index, in, in_len, out, out_len); if (st->last_sample[channel_index] < (int)*in_len) { *in_len = st->last_sample[channel_index]; } *out_len = out_sample + tmp_out_len; st->last_sample[channel_index] -= *in_len; for (j = 0; j < N-1 - (int)*in_len; j++) { mem[j] = mem[j+*in_len]; } if (in != NULL) { for ( ; j < N-1; j++) mem[j] = in[st->in_stride*(j+*in_len-N+1)]; } else { for ( ; j < N-1; j++) mem[j] = 0; } return RESAMPLER_ERR_SUCCESS; } int speex_resampler_process_float(SpeexResamplerState *st, unsigned int channel_index, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { return speex_resampler_process_native(st, channel_index, in, in_len, out, out_len); } int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, unsigned int *in_len, float *out, unsigned int *out_len) { unsigned int i; int istride_save, ostride_save; unsigned int bak_len = *out_len; istride_save = st->in_stride; ostride_save = st->out_stride; st->in_stride = st->out_stride = st->nb_channels; for (i = 0; i < st->nb_channels; i++) { *out_len = bak_len; if (in != NULL) { speex_resampler_process_float(st, i, in + i, in_len, out + i, out_len); } else { speex_resampler_process_float(st, i, NULL, in_len, out + i, out_len); } } st->in_stride = istride_save; st->out_stride = ostride_save; return RESAMPLER_ERR_SUCCESS; } int speex_resampler_set_rate(SpeexResamplerState *st, unsigned int in_rate, unsigned int out_rate) { return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate); } void speex_resampler_get_rate(SpeexResamplerState *st, unsigned int *in_rate, unsigned int *out_rate) { *in_rate = st->in_rate; *out_rate = st->out_rate; } static unsigned int gcd(unsigned int a, unsigned int b) { /* Euclid */ while (b) { unsigned int tmp = b; b = a % b; a = tmp; } return a; } int speex_resampler_set_rate_frac(SpeexResamplerState *st, unsigned int ratio_num, unsigned int ratio_den, unsigned int in_rate, unsigned int out_rate) { unsigned int old_den; unsigned int i; unsigned int g; if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den) { return RESAMPLER_ERR_SUCCESS; } old_den = st->den_rate; st->in_rate = in_rate; st->out_rate = out_rate; st->num_rate = ratio_num; st->den_rate = ratio_den; g = gcd(st->num_rate, st->den_rate); st->num_rate /= g; st->den_rate /= g; if (old_den > 0) { for (i = 0; i < st->nb_channels; i++) { st->samp_frac_num[i] = st->samp_frac_num[i] * st->den_rate / old_den; if (st->samp_frac_num[i] >= st->den_rate) { st->samp_frac_num[i] = st->den_rate - 1; } } } if (st->initialised) { update_filter(st); } return RESAMPLER_ERR_SUCCESS; } void speex_resampler_get_ratio(SpeexResamplerState *st, unsigned int *ratio_num, unsigned int *ratio_den) { *ratio_num = st->num_rate; *ratio_den = st->den_rate; } int speex_resampler_set_quality(SpeexResamplerState *st, int quality) { if (quality > 10 || quality < 0) { return RESAMPLER_ERR_INVALID_ARG; } if (st->quality == quality) { return RESAMPLER_ERR_SUCCESS; } st->quality = quality; if (st->initialised) { update_filter(st); } return RESAMPLER_ERR_SUCCESS; } void speex_resampler_get_quality(SpeexResamplerState *st, int *quality) { *quality = st->quality; } void speex_resampler_set_input_stride(SpeexResamplerState *st, unsigned int stride) { st->in_stride = stride; } void speex_resampler_get_input_stride(SpeexResamplerState *st, unsigned int *stride) { *stride = st->in_stride; } void speex_resampler_set_output_stride(SpeexResamplerState *st, unsigned int stride) { st->out_stride = stride; } void speex_resampler_get_output_stride(SpeexResamplerState *st, unsigned int *stride) { *stride = st->out_stride; } int speex_resampler_get_input_latency(SpeexResamplerState *st) { return st->filt_len / 2; } int speex_resampler_get_output_latency(SpeexResamplerState *st) { return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate; } int speex_resampler_skip_zeros(SpeexResamplerState *st) { unsigned int i; for (i = 0; i < st->nb_channels; i++) { st->last_sample[i] = st->filt_len / 2; } return RESAMPLER_ERR_SUCCESS; } int speex_resampler_reset_mem(SpeexResamplerState *st) { unsigned int i; for (i = 0; i < st->nb_channels*(st->filt_len - 1); i++) { st->mem[i] = 0; } return RESAMPLER_ERR_SUCCESS; } const char *speex_resampler_strerror(int err) { switch (err) { case RESAMPLER_ERR_SUCCESS: return "Success."; case RESAMPLER_ERR_ALLOC_FAILED: return "Memory allocation failed."; case RESAMPLER_ERR_BAD_STATE: return "Bad resampler state."; case RESAMPLER_ERR_INVALID_ARG: return "Invalid argument."; case RESAMPLER_ERR_PTR_OVERLAP: return "Input and output buffers overlap."; default: return "Unknown error. Bad error code or strange version mismatch."; } } #endif sonic-visualiser-3.0.3/bqresample/speex/speex_resampler.h0000644000000000000000000003137513111512442021773 0ustar 00000000000000/* Copyright (C) 2007 Jean-Marc Valin File: speex_resampler.h Resampling code The design goals of this code are: - Very fast algorithm - Low memory requirement - Good *perceptual* quality (and not best SNR) 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. */ #ifdef USE_SPEEX #ifndef SPEEX_RESAMPLER_H #define SPEEX_RESAMPLER_H /********* WARNING: MENTAL SANITY ENDS HERE *************/ /* If the resampler is defined outside of Speex, we change the symbol names so that there won't be any clash if linking with Speex later on. */ #define RANDOM_PREFIX bqresample #ifndef RANDOM_PREFIX #error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes" #endif #define CAT_PREFIX2(a,b) a ## b #define CAT_PREFIX(a,b) CAT_PREFIX2(a, b) #define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init) #define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac) #define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy) #define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float) #define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int) #define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float) #define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int) #define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate) #define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate) #define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac) #define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio) #define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality) #define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality) #define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride) #define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride) #define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride) #define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride) #define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency) #define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency) #define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros) #define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem) #define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror) #define spx_int16_t short #define spx_int32_t int #define spx_uint16_t unsigned short #define spx_uint32_t unsigned int #ifdef __cplusplus extern "C" { #endif #define SPEEX_RESAMPLER_QUALITY_MAX 10 #define SPEEX_RESAMPLER_QUALITY_MIN 0 #define SPEEX_RESAMPLER_QUALITY_DEFAULT 4 #define SPEEX_RESAMPLER_QUALITY_VOIP 3 #define SPEEX_RESAMPLER_QUALITY_DESKTOP 5 enum { RESAMPLER_ERR_SUCCESS = 0, RESAMPLER_ERR_ALLOC_FAILED = 1, RESAMPLER_ERR_BAD_STATE = 2, RESAMPLER_ERR_INVALID_ARG = 3, RESAMPLER_ERR_PTR_OVERLAP = 4, RESAMPLER_ERR_MAX_ERROR }; struct SpeexResamplerState_; typedef struct SpeexResamplerState_ SpeexResamplerState; /** Create a new resampler with integer input and output rates. * @param nb_channels Number of channels to be processed * @param in_rate Input sampling rate (integer number of Hz). * @param out_rate Output sampling rate (integer number of Hz). * @param quality Resampling quality between 0 and 10, where 0 has poor quality * and 10 has very high quality. * @return Newly created resampler state * @retval NULL Error: not enough memory */ SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err); /** Create a new resampler with fractional input/output rates. The sampling * rate ratio is an arbitrary rational number with both the numerator and * denominator being 32-bit integers. * @param nb_channels Number of channels to be processed * @param ratio_num Numerator of the sampling rate ratio * @param ratio_den Denominator of the sampling rate ratio * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). * @param quality Resampling quality between 0 and 10, where 0 has poor quality * and 10 has very high quality. * @return Newly created resampler state * @retval NULL Error: not enough memory */ SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err); /** Destroy a resampler state. * @param st Resampler state */ void speex_resampler_destroy(SpeexResamplerState *st); /** Resample a float array. The input and output buffers must *not* overlap. * @param st Resampler state * @param channel_index Index of the channel to process for the multi-channel * base (0 otherwise) * @param in Input buffer * @param in_len Number of input samples in the input buffer. Returns the * number of samples processed * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written */ int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len); /** Resample an interleaved float array. The input and output buffers must *not* overlap. * @param st Resampler state * @param in Input buffer * @param in_len Number of input samples in the input buffer. Returns the number * of samples processed. This is all per-channel. * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written. * This is all per-channel. */ int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len); /** Set (change) the input/output sampling rates (integer value). * @param st Resampler state * @param in_rate Input sampling rate (integer number of Hz). * @param out_rate Output sampling rate (integer number of Hz). */ int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate); /** Get the current input/output sampling rates (integer value). * @param st Resampler state * @param in_rate Input sampling rate (integer number of Hz) copied. * @param out_rate Output sampling rate (integer number of Hz) copied. */ void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate); /** Set (change) the input/output sampling rates and resampling ratio * (fractional values in Hz supported). * @param st Resampler state * @param ratio_num Numerator of the sampling rate ratio * @param ratio_den Denominator of the sampling rate ratio * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). */ int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate); /** Get the current resampling ratio. This will be reduced to the least * common denominator. * @param st Resampler state * @param ratio_num Numerator of the sampling rate ratio copied * @param ratio_den Denominator of the sampling rate ratio copied */ void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den); /** Set (change) the conversion quality. * @param st Resampler state * @param quality Resampling quality between 0 and 10, where 0 has poor * quality and 10 has very high quality. */ int speex_resampler_set_quality(SpeexResamplerState *st, int quality); /** Get the conversion quality. * @param st Resampler state * @param quality Resampling quality between 0 and 10, where 0 has poor * quality and 10 has very high quality. */ void speex_resampler_get_quality(SpeexResamplerState *st, int *quality); /** Set (change) the input stride. * @param st Resampler state * @param stride Input stride */ void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride); /** Get the input stride. * @param st Resampler state * @param stride Input stride copied */ void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride); /** Set (change) the output stride. * @param st Resampler state * @param stride Output stride */ void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride); /** Get the output stride. * @param st Resampler state copied * @param stride Output stride */ void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride); /** Get the latency in input samples introduced by the resampler. * @param st Resampler state */ int speex_resampler_get_input_latency(SpeexResamplerState *st); /** Get the latency in output samples introduced by the resampler. * @param st Resampler state */ int speex_resampler_get_output_latency(SpeexResamplerState *st); /** Make sure that the first samples to go out of the resamplers don't have * leading zeros. This is only useful before starting to use a newly created * resampler. It is recommended to use that when resampling an audio file, as * it will generate a file with the same length. For real-time processing, * it is probably easier not to use this call (so that the output duration * is the same for the first frame). * @param st Resampler state */ int speex_resampler_skip_zeros(SpeexResamplerState *st); /** Reset a resampler so a new (unrelated) stream can be processed. * @param st Resampler state */ int speex_resampler_reset_mem(SpeexResamplerState *st); /** Returns the English meaning for an error code * @param err Error code * @return English string */ const char *speex_resampler_strerror(int err); #ifdef __cplusplus } #endif #endif #endif sonic-visualiser-3.0.3/bqresample/src/Resampler.cpp0000644000000000000000000011361013111512442020516 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqresample A small library wrapping various audio sample rate conversion implementations in C++. Copyright 2007-2015 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "bqresample/Resampler.h" #include #include #include #include #include #include #ifdef HAVE_IPP #include #if (IPP_VERSION_MAJOR < 7) #include #include #include #else #include #endif #endif #ifdef HAVE_SAMPLERATE #define HAVE_LIBSAMPLERATE 1 #endif #ifdef HAVE_LIBSAMPLERATE #include #endif #ifdef HAVE_LIBRESAMPLE #include #endif #ifdef USE_SPEEX #include "../speex/speex_resampler.h" #endif #ifndef HAVE_IPP #ifndef HAVE_LIBSAMPLERATE #ifndef HAVE_LIBRESAMPLE #ifndef USE_SPEEX #error No resampler implementation selected! #endif #endif #endif #endif using namespace std; namespace breakfastquay { class Resampler::Impl { public: virtual ~Impl() { } virtual int resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final) = 0; virtual int resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final) = 0; virtual int getChannelCount() const = 0; virtual void reset() = 0; }; namespace Resamplers { #ifdef HAVE_IPP class D_IPP : public Resampler::Impl { public: D_IPP(Resampler::Quality quality, int channels, double initialSampleRate, int maxBufferSize, int debugLevel); ~D_IPP(); int resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final); int resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final = false); int getChannelCount() const { return m_channels; } void reset(); protected: // to m_outbuf int doResample(int outcount, double ratio, bool final); IppsResamplingPolyphase_32f **m_state; double m_initialSampleRate; float **m_inbuf; size_t m_inbufsz; float **m_outbuf; size_t m_outbufsz; int m_bufsize; int m_channels; int m_window; float m_factor; int m_history; int *m_lastread; double *m_time; int m_debugLevel; void setBufSize(int); }; D_IPP::D_IPP(Resampler::Quality quality, int channels, double initialSampleRate, int maxBufferSize, int debugLevel) : m_state(0), m_initialSampleRate(initialSampleRate), m_channels(channels), m_debugLevel(debugLevel) { if (m_debugLevel > 0) { cerr << "Resampler::Resampler: using IPP implementation" << endl; } int nStep = 16; IppHintAlgorithm hint = ippAlgHintFast; //!!! todo: make use of initialSampleRate to calculate parameters switch (quality) { case Resampler::Best: m_window = 64; nStep = 80; hint = ippAlgHintAccurate; break; case Resampler::FastestTolerable: nStep = 16; m_window = 16; hint = ippAlgHintFast; break; case Resampler::Fastest: m_window = 24; nStep = 64; hint = ippAlgHintFast; break; } m_factor = 8; // initial upper bound on m_ratio, may be amended later // This is largely based on the IPP docs and examples. Adapted // from the docs: // // m_time defines the time value for which the first output // sample is calculated. The input vector with indices less // than m_time [whose initial value is m_history below] // contains the history data of filters. // // The history length is [(1/2) window * max(1, 1/factor) ]+1 // where window is the size of the ideal lowpass filter // window. The input vector must contain the same number of // elements with indices greater than m_time + length for the // right filter wing for the last element. m_history = int(m_window * 0.5 * max(1.0, 1.0 / m_factor)) + 1; m_state = new IppsResamplingPolyphase_32f *[m_channels]; m_lastread = new int[m_channels]; m_time = new double[m_channels]; m_inbufsz = 0; m_outbufsz = 0; m_inbuf = 0; m_outbuf = 0; m_bufsize = 0; setBufSize(maxBufferSize + m_history); if (m_debugLevel > 1) { cerr << "bufsize = " << m_bufsize << ", window = " << m_window << ", nStep = " << nStep << ", history = " << m_history << endl; } #if (IPP_VERSION_MAJOR >= 7) int specSize = 0; ippsResamplePolyphaseGetSize_32f(float(m_window), nStep, &specSize, hint); if (specSize == 0) { #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #else abort(); #endif } #endif for (int c = 0; c < m_channels; ++c) { #if (IPP_VERSION_MAJOR < 7) ippsResamplePolyphaseInitAlloc_32f(&m_state[c], float(m_window), nStep, 0.95f, 9.0f, hint); #else m_state[c] = (IppsResamplingPolyphase_32f *)ippsMalloc_8u(specSize); ippsResamplePolyphaseInit_32f(float(m_window), nStep, 0.95f, 9.0f, m_state[c], hint); #endif m_lastread[c] = m_history; m_time[c] = m_history; } if (m_debugLevel > 1) { cerr << "Resampler init done" << endl; } } D_IPP::~D_IPP() { #if (IPP_VERSION_MAJOR < 7) for (int c = 0; c < m_channels; ++c) { ippsResamplePolyphaseFree_32f(m_state[c]); } #else for (int c = 0; c < m_channels; ++c) { ippsFree(m_state[c]); } #endif deallocate_channels(m_inbuf, m_channels); deallocate_channels(m_outbuf, m_channels); delete[] m_lastread; delete[] m_time; delete[] m_state; } void D_IPP::setBufSize(int sz) { if (m_debugLevel > 1) { if (m_bufsize > 0) { cerr << "resize bufsize " << m_bufsize << " -> "; } else { cerr << "initialise bufsize to "; } } m_bufsize = sz; if (m_debugLevel > 1) { cerr << m_bufsize << endl; } int n1 = m_bufsize + m_history + 2; if (m_debugLevel > 1) { cerr << "inbuf allocating " << m_bufsize << " + " << m_history << " + 2 = " << n1 << endl; } int n2 = (int)lrintf(ceil((m_bufsize - m_history) * m_factor + 2)); if (m_debugLevel > 1) { cerr << "outbuf allocating (" << m_bufsize << " - " << m_history << ") * " << m_factor << " + 2 = " << n2 << endl; } m_inbuf = reallocate_and_zero_extend_channels (m_inbuf, m_channels, m_inbufsz, m_channels, n1); m_outbuf = reallocate_and_zero_extend_channels (m_outbuf, m_channels, m_outbufsz, m_channels, n2); m_inbufsz = n1; m_outbufsz = n2; } int D_IPP::resample(float *const BQ_R__ *const BQ_R__ out, int outspace, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final) { if (ratio > m_factor) { m_factor = ratio; m_history = int(m_window * 0.5 * max(1.0, 1.0 / m_factor)) + 1; } if (m_debugLevel > 2) { cerr << "incount = " << incount << ", ratio = " << ratio << ", est space = " << lrintf(ceil(incount * ratio)) << ", outspace = " << outspace << ", final = " << final << endl; } for (int c = 0; c < m_channels; ++c) { if (m_lastread[c] + incount + m_history > m_bufsize) { setBufSize(m_lastread[c] + incount + m_history); } } for (int c = 0; c < m_channels; ++c) { for (int i = 0; i < incount; ++i) { m_inbuf[c][m_lastread[c] + i] = in[c][i]; } m_lastread[c] += incount; } if (m_debugLevel > 2) { cerr << "lastread advanced to " << m_lastread[0] << endl; } int got = doResample(outspace, ratio, final); for (int c = 0; c < m_channels; ++c) { v_copy(out[c], m_outbuf[c], got); } return got; } int D_IPP::resampleInterleaved(float *const BQ_R__ out, int outspace, const float *const BQ_R__ in, int incount, double ratio, bool final) { if (ratio > m_factor) { m_factor = ratio; m_history = int(m_window * 0.5 * max(1.0, 1.0 / m_factor)) + 1; } if (m_debugLevel > 2) { cerr << "incount = " << incount << ", ratio = " << ratio << ", est space = " << lrintf(ceil(incount * ratio)) << ", outspace = " << outspace << ", final = " << final << endl; } for (int c = 0; c < m_channels; ++c) { if (m_lastread[c] + incount + m_history > m_bufsize) { setBufSize(m_lastread[c] + incount + m_history); } } for (int c = 0; c < m_channels; ++c) { for (int i = 0; i < incount; ++i) { m_inbuf[c][m_lastread[c] + i] = in[i * m_channels + c]; } m_lastread[c] += incount; } if (m_debugLevel > 2) { cerr << "lastread advanced to " << m_lastread[0] << " after injection of " << incount << " samples" << endl; } int got = doResample(outspace, ratio, final); v_interleave(out, m_outbuf, m_channels, got); return got; } int D_IPP::doResample(int outspace, double ratio, bool final) { int outcount = 0; for (int c = 0; c < m_channels; ++c) { int n = m_lastread[c] - m_history - int(m_time[c]); if (c == 0 && m_debugLevel > 2) { cerr << "at start, lastread = " << m_lastread[c] << ", history = " << m_history << ", time = " << m_time[c] << ", therefore n = " << n << endl; } if (n <= 0) { if (c == 0 && m_debugLevel > 1) { cerr << "not enough input samples to do anything" << endl; } continue; } if (c == 0 && m_debugLevel > 2) { cerr << "before resample call, time = " << m_time[c] << endl; } // We're committed to not overrunning outspace, so we need to // offer the resampler only enough samples to ensure it won't int limit = int(floor(outspace / ratio)); if (n > limit) { if (c == 0 && m_debugLevel > 1) { cerr << "trimming input samples from " << n << " to " << limit << " to avoid overrunning " << outspace << " at output" << endl; } n = limit; } #if (IPP_VERSION_MAJOR < 7) ippsResamplePolyphase_32f(m_state[c], m_inbuf[c], n, m_outbuf[c], ratio, 1.0f, &m_time[c], &outcount); #else ippsResamplePolyphase_32f(m_inbuf[c], n, m_outbuf[c], ratio, 1.0f, &m_time[c], &outcount, m_state[c]); #endif int t = int(round(m_time[c])); if (c == 0 && m_debugLevel > 2) { cerr << "converted " << n << " samples to " << outcount << ", time advanced to " << t << endl; cerr << "will move " << m_lastread[c] + m_history - t << " unconverted samples back from index " << t - m_history << " to 0" << endl; } v_move(m_inbuf[c], m_inbuf[c] + t - m_history, m_lastread[c] + m_history - t); m_lastread[c] -= t - m_history; m_time[c] -= t - m_history; if (c == 0 && m_debugLevel > 2) { cerr << "lastread reduced to " << m_lastread[c] << ", time reduced to " << m_time[c] << endl; } if (final && n < limit) { // Looks like this actually produces too many samples // (additionalcount is a few samples too large). // Also, we aren't likely to have enough space in the // output buffer as the caller won't have allowed for // all the samples we're retrieving here. // What to do? int additionalcount = 0; if (c == 0 && m_debugLevel > 2) { cerr << "final call, padding input with " << m_history << " zeros (symmetrical with m_history)" << endl; } for (int i = 0; i < m_history; ++i) { m_inbuf[c][m_lastread[c] + i] = 0.f; } if (c == 0 && m_debugLevel > 2) { cerr << "before resample call, time = " << m_time[c] << endl; } int nAdditional = m_lastread[c] - int(m_time[c]); if (n + nAdditional > limit) { if (c == 0 && m_debugLevel > 1) { cerr << "trimming final input samples from " << nAdditional << " to " << (limit - n) << " to avoid overrunning " << outspace << " at output" << endl; } nAdditional = limit - n; } #if (IPP_VERSION_MAJOR < 7) ippsResamplePolyphase_32f(m_state[c], m_inbuf[c], nAdditional, m_outbuf[c], ratio, 1.0f, &m_time[c], &additionalcount); #else ippsResamplePolyphase_32f(m_inbuf[c], nAdditional, m_outbuf[c], ratio, 1.0f, &m_time[c], &additionalcount, m_state[c]); #endif if (c == 0 && m_debugLevel > 2) { cerr << "converted " << n << " samples to " << additionalcount << ", time advanced to " << m_time[c] << endl; cerr << "outcount = " << outcount << ", additionalcount = " << additionalcount << ", sum " << outcount + additionalcount << endl; } if (c == 0) { outcount += additionalcount; } } } if (m_debugLevel > 2) { cerr << "returning " << outcount << " samples" << endl; } return outcount; } void D_IPP::reset() { //!!! } #endif /* HAVE_IPP */ #ifdef HAVE_LIBSAMPLERATE class D_SRC : public Resampler::Impl { public: D_SRC(Resampler::Quality quality, int channels, double initialSampleRate, int maxBufferSize, int m_debugLevel); ~D_SRC(); int resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final); int resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final = false); int getChannelCount() const { return m_channels; } void reset(); protected: SRC_STATE *m_src; float *m_iin; float *m_iout; double m_lastRatio; int m_channels; int m_iinsize; int m_ioutsize; int m_debugLevel; }; D_SRC::D_SRC(Resampler::Quality quality, int channels, double, int maxBufferSize, int debugLevel) : m_src(0), m_iin(0), m_iout(0), m_lastRatio(1.0), m_channels(channels), m_iinsize(0), m_ioutsize(0), m_debugLevel(debugLevel) { if (m_debugLevel > 0) { cerr << "Resampler::Resampler: using libsamplerate implementation" << endl; } int err = 0; m_src = src_new(quality == Resampler::Best ? SRC_SINC_BEST_QUALITY : quality == Resampler::Fastest ? SRC_LINEAR : SRC_SINC_FASTEST, channels, &err); if (err) { cerr << "Resampler::Resampler: failed to create libsamplerate resampler: " << src_strerror(err) << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } if (maxBufferSize > 0 && m_channels > 1) { m_iinsize = maxBufferSize * m_channels; m_ioutsize = maxBufferSize * m_channels * 2; m_iin = allocate(m_iinsize); m_iout = allocate(m_ioutsize); } reset(); } D_SRC::~D_SRC() { src_delete(m_src); deallocate(m_iin); deallocate(m_iout); } int D_SRC::resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final) { SRC_DATA data; if (m_channels == 1) { data.data_in = const_cast(*in); //!!!??? data.data_out = *out; } else { if (incount * m_channels > m_iinsize) { m_iin = reallocate(m_iin, m_iinsize, incount * m_channels); m_iinsize = incount * m_channels; } if (outcount * m_channels > m_ioutsize) { m_iout = reallocate(m_iout, m_ioutsize, outcount * m_channels); m_ioutsize = outcount * m_channels; } v_interleave(m_iin, in, m_channels, incount); data.data_in = m_iin; data.data_out = m_iout; } data.input_frames = incount; data.output_frames = outcount; data.src_ratio = ratio; data.end_of_input = (final ? 1 : 0); int err = src_process(m_src, &data); if (err) { cerr << "Resampler::process: libsamplerate error: " << src_strerror(err) << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } if (m_channels > 1) { v_deinterleave(out, m_iout, m_channels, (int)data.output_frames_gen); } m_lastRatio = ratio; return (int)data.output_frames_gen; } int D_SRC::resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final) { SRC_DATA data; data.data_in = const_cast(in); data.data_out = out; data.input_frames = incount; data.output_frames = outcount; data.src_ratio = ratio; data.end_of_input = (final ? 1 : 0); int err = src_process(m_src, &data); if (err) { cerr << "Resampler::process: libsamplerate error: " << src_strerror(err) << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } m_lastRatio = ratio; return (int)data.output_frames_gen; } void D_SRC::reset() { src_reset(m_src); } #endif /* HAVE_LIBSAMPLERATE */ #ifdef HAVE_LIBRESAMPLE class D_Resample : public Resampler::Impl { public: D_Resample(Resampler::Quality quality, int channels, double initialSampleRate, int maxBufferSize, int m_debugLevel); ~D_Resample(); int resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final); int resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final); int getChannelCount() const { return m_channels; } void reset(); protected: void *m_src; float *m_iin; float *m_iout; float m_lastRatio; int m_channels; int m_iinsize; int m_ioutsize; int m_debugLevel; }; D_Resample::D_Resample(Resampler::Quality quality, int channels, double, int maxBufferSize, int debugLevel) : m_src(0), m_iin(0), m_iout(0), m_lastRatio(1.f), m_channels(channels), m_iinsize(0), m_ioutsize(0), m_debugLevel(debugLevel) { if (m_debugLevel > 0) { cerr << "Resampler::Resampler: using libresample implementation" << endl; } float min_factor = 0.125f; float max_factor = 8.0f; m_src = resample_open(quality == Resampler::Best ? 1 : 0, min_factor, max_factor); if (!m_src) { cerr << "Resampler::Resampler: failed to create libresample resampler: " << endl; throw Resampler::ImplementationError; //!!! of course, need to catch this! } if (maxBufferSize > 0 && m_channels > 1) { m_iinsize = maxBufferSize * m_channels; m_ioutsize = maxBufferSize * m_channels * 2; m_iin = allocate(m_iinsize); m_iout = allocate(m_ioutsize); } reset(); } D_Resample::~D_Resample() { resample_close(m_src); if (m_iinsize > 0) { deallocate(m_iin); } if (m_ioutsize > 0) { deallocate(m_iout); } } int D_Resample::resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final) { float *data_in; float *data_out; int input_frames, output_frames, end_of_input, source_used; float src_ratio; int outcount = (int)lrint(ceil(incount * ratio)); if (m_channels == 1) { data_in = const_cast(*in); //!!!??? data_out = *out; } else { if (incount * m_channels > m_iinsize) { m_iin = reallocate(m_iin, m_iinsize, incount * m_channels); m_iinsize = incount * m_channels; } if (outcount * m_channels > m_ioutsize) { m_iout = reallocate(m_iout, m_ioutsize, outcount * m_channels); m_ioutsize = outcount * m_channels; } v_interleave(m_iin, in, m_channels, incount); data_in = m_iin; data_out = m_iout; } input_frames = incount; output_frames = outcount; src_ratio = ratio; end_of_input = (final ? 1 : 0); int output_frames_gen = resample_process(m_src, src_ratio, data_in, input_frames, end_of_input, &source_used, data_out, output_frames); if (output_frames_gen < 0) { cerr << "Resampler::process: libresample error: " << endl; throw Resampler::ImplementationError; //!!! of course, need to catch this! } if (m_channels > 1) { v_deinterleave(out, m_iout, m_channels, output_frames_gen); } m_lastRatio = ratio; return output_frames_gen; } int D_Resample::resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final) { int input_frames, output_frames, end_of_input, source_used; float src_ratio; int outcount = (int)lrint(ceil(incount * ratio)); input_frames = incount; output_frames = outcount; src_ratio = ratio; end_of_input = (final ? 1 : 0); int output_frames_gen = resample_process(m_src, src_ratio, const_cast(in), input_frames, end_of_input, &source_used, out, output_frames); if (output_frames_gen < 0) { cerr << "Resampler::process: libresample error: " << endl; throw Resampler::ImplementationError; //!!! of course, need to catch this! } m_lastRatio = ratio; return output_frames_gen; } void D_Resample::reset() { } #endif /* HAVE_LIBRESAMPLE */ #ifdef USE_SPEEX class D_Speex : public Resampler::Impl { public: D_Speex(Resampler::Quality quality, int channels, double initialSampleRate, int maxBufferSize, int debugLevel); ~D_Speex(); int resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final); int resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final = false); int getChannelCount() const { return m_channels; } void reset(); protected: SpeexResamplerState *m_resampler; double m_initialSampleRate; float *m_iin; float *m_iout; int m_channels; int m_iinsize; int m_ioutsize; float m_lastratio; bool m_initial; int m_debugLevel; void setRatio(double); void doResample(const float *in, unsigned int &incount, float *out, unsigned int &outcount, double ratio, bool final); }; D_Speex::D_Speex(Resampler::Quality quality, int channels, double initialSampleRate, int maxBufferSize, int debugLevel) : m_resampler(0), m_initialSampleRate(initialSampleRate), m_iin(0), m_iout(0), m_channels(channels), m_iinsize(0), m_ioutsize(0), m_lastratio(1), m_initial(true), m_debugLevel(debugLevel) { int q = (quality == Resampler::Best ? 10 : quality == Resampler::Fastest ? 0 : 4); if (m_debugLevel > 0) { cerr << "Resampler::Resampler: using Speex implementation with q = " << q << endl; } int rrate = int(round(m_initialSampleRate)); int err = 0; m_resampler = speex_resampler_init_frac(m_channels, 1, 1, rrate, rrate, q, &err); if (err) { cerr << "Resampler::Resampler: failed to create Speex resampler" << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } if (maxBufferSize > 0 && m_channels > 1) { m_iinsize = maxBufferSize * m_channels; m_ioutsize = maxBufferSize * m_channels * 2; m_iin = allocate(m_iinsize); m_iout = allocate(m_ioutsize); } } D_Speex::~D_Speex() { speex_resampler_destroy(m_resampler); deallocate(m_iin); deallocate(m_iout); } void D_Speex::setRatio(double ratio) { // Speex wants a ratio of two unsigned integers, not a single // float. Let's do that. unsigned int big = 272408136U; unsigned int denom = 1, num = 1; if (ratio < 1.f) { denom = big; double dnum = double(big) * double(ratio); num = (unsigned int)dnum; } else if (ratio > 1.f) { num = big; double ddenom = double(big) / double(ratio); denom = (unsigned int)ddenom; } if (m_debugLevel > 1) { cerr << "D_Speex: Desired ratio " << ratio << ", requesting ratio " << num << "/" << denom << " = " << float(double(num)/double(denom)) << endl; } int fromRate = int(round(m_initialSampleRate)); int toRate = int(round(m_initialSampleRate * ratio)); int err = speex_resampler_set_rate_frac (m_resampler, denom, num, fromRate, toRate); if (err) { cerr << "Resampler::Resampler: failed to set rate on Speex resampler" << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } speex_resampler_get_ratio(m_resampler, &denom, &num); if (m_debugLevel > 1) { cerr << "D_Speex: Desired ratio " << ratio << ", got ratio " << num << "/" << denom << " = " << float(double(num)/double(denom)) << endl; } m_lastratio = ratio; if (m_initial) { speex_resampler_skip_zeros(m_resampler); m_initial = false; } } int D_Speex::resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final) { if (ratio != m_lastratio) { setRatio(ratio); } unsigned int uincount = incount; unsigned int uoutcount = outcount; float *data_in, *data_out; if (m_channels == 1) { data_in = const_cast(*in); data_out = *out; } else { if (int(incount * m_channels) > m_iinsize) { m_iin = reallocate(m_iin, m_iinsize, incount * m_channels); m_iinsize = incount * m_channels; } if (int(outcount * m_channels) > m_ioutsize) { m_iout = reallocate(m_iout, m_ioutsize, outcount * m_channels); m_ioutsize = outcount * m_channels; } v_interleave(m_iin, in, m_channels, incount); data_in = m_iin; data_out = m_iout; } doResample(data_in, uincount, data_out, uoutcount, ratio, final); if (m_channels > 1) { v_deinterleave(out, m_iout, m_channels, uoutcount); } return uoutcount; } int D_Speex::resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final) { if (ratio != m_lastratio) { setRatio(ratio); } unsigned int uincount = incount; unsigned int uoutcount = outcount; float *data_in = const_cast(in); float *data_out = out; doResample(data_in, uincount, data_out, uoutcount, ratio, final); return uoutcount; } void D_Speex::doResample(const float *data_in, unsigned int &uincount, float *data_out, unsigned int &uoutcount, double ratio, bool final) { int initial_outcount = int(uoutcount); int err = speex_resampler_process_interleaved_float (m_resampler, data_in, &uincount, data_out, &uoutcount); if (err) { cerr << "Resampler::Resampler: Speex resampler returned error " << err << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } if (final) { int actual = int(uoutcount); int expected = std::min(initial_outcount, int(round(uincount * ratio))); if (actual < expected) { unsigned int final_out = expected - actual; unsigned int final_in = (unsigned int)(round(final_out / ratio)); if (final_in > 0) { float *pad = allocate_and_zero(final_in * m_channels); err = speex_resampler_process_interleaved_float (m_resampler, pad, &final_in, data_out + actual * m_channels, &final_out); deallocate(pad); uoutcount += final_out; if (err) { cerr << "Resampler::Resampler: Speex resampler returned error " << err << endl; #ifndef NO_EXCEPTIONS throw Resampler::ImplementationError; #endif } } } } } void D_Speex::reset() { speex_resampler_reset_mem(m_resampler); } #endif } /* end namespace Resamplers */ Resampler::Resampler(Resampler::Parameters params, int channels) { m_method = -1; switch (params.quality) { case Resampler::Best: #ifdef HAVE_IPP m_method = 0; #endif #ifdef USE_SPEEX m_method = 2; #endif #ifdef HAVE_LIBRESAMPLE m_method = 3; #endif #ifdef HAVE_LIBSAMPLERATE m_method = 1; #endif break; case Resampler::FastestTolerable: #ifdef HAVE_IPP m_method = 0; #endif #ifdef HAVE_LIBRESAMPLE m_method = 3; #endif #ifdef HAVE_LIBSAMPLERATE m_method = 1; #endif #ifdef USE_SPEEX m_method = 2; #endif break; case Resampler::Fastest: #ifdef HAVE_IPP m_method = 0; #endif #ifdef HAVE_LIBRESAMPLE m_method = 3; #endif #ifdef USE_SPEEX m_method = 2; #endif #ifdef HAVE_LIBSAMPLERATE m_method = 1; #endif break; } if (m_method == -1) { cerr << "Resampler::Resampler: No implementation available!" << endl; abort(); } switch (m_method) { case 0: #ifdef HAVE_IPP d = new Resamplers::D_IPP (params.quality, channels, params.initialSampleRate, params.maxBufferSize, params.debugLevel); #else cerr << "Resampler::Resampler: No implementation available!" << endl; abort(); #endif break; case 1: #ifdef HAVE_LIBSAMPLERATE d = new Resamplers::D_SRC (params.quality, channels, params.initialSampleRate, params.maxBufferSize, params.debugLevel); #else cerr << "Resampler::Resampler: No implementation available!" << endl; abort(); #endif break; case 2: #ifdef USE_SPEEX d = new Resamplers::D_Speex (params.quality, channels, params.initialSampleRate, params.maxBufferSize, params.debugLevel); #else cerr << "Resampler::Resampler: No implementation available!" << endl; abort(); #endif break; case 3: #ifdef HAVE_LIBRESAMPLE d = new Resamplers::D_Resample (params.quality, channels, params.initialSampleRate, params.maxBufferSize, params.debugLevel); #else cerr << "Resampler::Resampler: No implementation available!" << endl; abort(); #endif break; } if (!d) { cerr << "Resampler::Resampler: Internal error: No implementation selected" << endl; abort(); } } Resampler::~Resampler() { delete d; } int Resampler::resample(float *const BQ_R__ *const BQ_R__ out, int outcount, const float *const BQ_R__ *const BQ_R__ in, int incount, double ratio, bool final) { return d->resample(out, outcount, in, incount, ratio, final); } int Resampler::resampleInterleaved(float *const BQ_R__ out, int outcount, const float *const BQ_R__ in, int incount, double ratio, bool final) { return d->resampleInterleaved(out, outcount, in, incount, ratio, final); } int Resampler::getChannelCount() const { return d->getChannelCount(); } void Resampler::reset() { d->reset(); } } sonic-visualiser-3.0.3/bqresample/test/TestResampler.cpp0000644000000000000000000001630713111512442021553 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "bqresample/Resampler.h" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include #include #include #include #include using namespace std; using namespace breakfastquay; BOOST_AUTO_TEST_SUITE(TestResampler) #define LEN(a) (int(sizeof(a)/sizeof(a[0]))) static vector sine(double samplerate, double frequency, int nsamples) { vector v(nsamples, 0.f); for (int i = 0; i < nsamples; ++i) { v[i] = sin ((i * 2.0 * M_PI * frequency) / samplerate); } return v; } #define COMPARE_N(a, b, n) \ for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ BOOST_CHECK_SMALL((a)[cmp_i] - (b)[cmp_i], 1e-4f); \ } static const float guard_value = -999.f; BOOST_AUTO_TEST_CASE(interpolated_sine_1ch_interleaved) { // Interpolating a sinusoid should give us a sinusoid, once we've // dropped the first few samples vector in = sine(8, 2, 1000); // 2Hz wave at 8Hz: [ 0, 1, 0, -1 ] etc vector expected = sine(16, 2, 2000); vector out(in.size() * 2 + 1, guard_value); Resampler r(Resampler::Parameters(), 1); int returned = r.resampleInterleaved (out.data(), out.size(), in.data(), in.size(), 2, true); // because final was true, we expect to have exactly the right // number of samples back BOOST_CHECK_EQUAL(returned, int(in.size() * 2)); BOOST_CHECK_NE(out[returned-1], guard_value); BOOST_CHECK_EQUAL(out[returned], guard_value); // and they should match the expected data, at least in the middle const float *outf = out.data() + 200, *expectedf = expected.data() + 200; COMPARE_N(outf, expectedf, 600); } BOOST_AUTO_TEST_CASE(interpolated_sine_1ch_noninterleaved) { // Interpolating a sinusoid should give us a sinusoid, once we've // dropped the first few samples vector in = sine(8, 2, 1000); // 2Hz wave at 8Hz: [ 0, 1, 0, -1 ] etc vector expected = sine(16, 2, 2000); vector out(in.size() * 2 + 1, guard_value); const float *in_data = in.data(); float *out_data = out.data(); Resampler r(Resampler::Parameters(), 1); int returned = r.resample (&out_data, out.size(), &in_data, in.size(), 2, true); // because final was true, we expect to have exactly the right // number of samples back BOOST_CHECK_EQUAL(returned, int(in.size() * 2)); BOOST_CHECK_NE(out[returned-1], guard_value); BOOST_CHECK_EQUAL(out[returned], guard_value); // and they should match the expected data, at least in the middle const float *outf = out.data() + 200, *expectedf = expected.data() + 200; COMPARE_N(outf, expectedf, 600); } BOOST_AUTO_TEST_CASE(overrun_interleaved) { // Check that the outcount argument is correctly used: any samples // already in the out buffer beyond outcount*channels must be left // untouched. We test this with short buffers (likely to be // shorter than the resampler filter length) and longer ones, with // resampler ratios that reduce, leave unchanged, and raise the // sample rate, and with all quality settings. // Options are ordered from most normal/likely to least. int channels = 2; int lengths[] = { 6000, 6 }; int constructionBufferSizes[] = { 0, 1000 }; double ratios[] = { 1.0, 10.0, 0.1 }; Resampler::Quality qualities[] = { Resampler::FastestTolerable, Resampler::Best, Resampler::Fastest }; bool failed = false; for (int li = 0; li < LEN(lengths); ++li) { for (int cbi = 0; cbi < LEN(constructionBufferSizes); ++cbi) { for (int ri = 0; ri < LEN(ratios); ++ri) { for (int qi = 0; qi < LEN(qualities); ++qi) { int length = lengths[li]; double ratio = ratios[ri]; Resampler::Parameters parameters; parameters.quality = qualities[qi]; parameters.maxBufferSize = constructionBufferSizes[cbi]; Resampler r(parameters, channels); float *inbuf = new float[length * channels]; for (int i = 0; i < length; ++i) { for (int c = 0; c < channels; ++c) { inbuf[i*channels+c] = sinf((i * 2.0 * M_PI * 440.0) / 44100.0); } } int outcount = int(round(length * ratio)); outcount -= 10; if (outcount < 1) outcount = 1; int outbuflen = outcount + 10; float *outbuf = new float[outbuflen * channels]; for (int i = 0; i < outbuflen; ++i) { for (int c = 0; c < channels; ++c) { outbuf[i*channels+c] = guard_value; } } /* cerr << "\nTesting with length = " << length << ", ratio = " << ratio << ", outcount = " << outcount << ", final = false" << endl; */ int returned = r.resampleInterleaved (outbuf, outcount, inbuf, length, ratio, false); BOOST_CHECK_LE(returned, outcount); for (int i = returned; i < outbuflen; ++i) { for (int c = 0; c < channels; ++c) { BOOST_CHECK_EQUAL(outbuf[i*channels+c], guard_value); if (outbuf[i*channels+c] != guard_value) { failed = true; } } } if (failed) { cerr << "Test failed, abandoning remaining loop cycles" << endl; break; } /* cerr << "\nContinuing with length = " << length << ", ratio = " << ratio << ", outcount = " << outcount << ", final = true" << endl; */ returned = r.resampleInterleaved (outbuf, outcount, inbuf, length, ratio, true); BOOST_CHECK_LE(returned, outcount); for (int i = returned; i < outbuflen; ++i) { for (int c = 0; c < channels; ++c) { BOOST_CHECK_EQUAL(outbuf[i*channels+c], guard_value); if (outbuf[i*channels+c] != guard_value) { failed = true; } } } delete[] outbuf; delete[] inbuf; if (failed) { cerr << "Test failed, abandoning remaining loop cycles" << endl; break; } } if (failed) break; } if (failed) break; } if (failed) break; } } BOOST_AUTO_TEST_SUITE_END() sonic-visualiser-3.0.3/bqvec/.hgignore0000644000000000000000000000007713111512442016043 0ustar 00000000000000syntax: glob *~ *.orig *.o *.bak *.so *.dylib *.dll *.a *.lib sonic-visualiser-3.0.3/bqvec/.travis.yml0000644000000000000000000000025513111512442016347 0ustar 00000000000000language: cpp os: - linux - osx addons: apt: packages: - libboost-test-dev - valgrind script: - ./build/run-platform-tests.sh "$TRAVIS_OS_NAME" sonic-visualiser-3.0.3/bqvec/COPYING0000644000000000000000000000455113111512442015274 0ustar 00000000000000 The following terms apply to the code in the src/ directory: Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. The following terms apply to the code in the pommier/ directory: Copyright (C) 2011 Julien Pommier This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. sonic-visualiser-3.0.3/bqvec/Makefile0000644000000000000000000000562413111512442015703 0ustar 00000000000000 # Add to VECTOR_DEFINES the relevant options for your desired # third-party library support. # # Available options are # # -DHAVE_IPP Intel's Integrated Performance Primitives are available # -DHAVE_VDSP Apple's Accelerate framework is available # # The above are optional (they affect performance, not function) and # you may define more than one of them. # # The following two options trade off speed against precision for single- # precision paths in cases where IPP and VDSP are not available: # # -DUSE_POMMIER_MATHFUN Use Julien Pommier's SSE/NEON implementation # of sincos in 32-bit polar-to-cartesian conversion # -DUSE_APPROXIMATE_ATAN2 Use a quick but *very* approximate atan2 # function in 32-bit cartesian-to-polar conversion # # And a handful of miscellaneous flags: # # -DLACK_SINCOS Math library lacks sincos() function # -DNO_COMPLEX_TYPES Don't bother defining bq_complex_t functions # -DUSE_SINGLE_PRECISION_COMPLEX Use float, not double, for bq_complex_t # -DNO_EXCEPTIONS Don't throw exceptions (abort instead) # # Add any relevant -I flags for include paths as well. # # Note that you must supply the same flags when including bqvec # headers later as you are using now when compiling the library. (You # may find it simplest to just add the bqvec source files to your # application's build system and not build a bqvec library at all.) VECTOR_DEFINES := # Add to ALLOCATOR_DEFINES options relating to aligned malloc. # These are not usually necessary. # # Available options are # # -DHAVE_POSIX_MEMALIGN The posix_memalign call is available in sys/mman.h # -DLACK_POSIX_MEMALIGN The posix_memalign call is not available # # -DMALLOC_IS_ALIGNED The malloc call already returns aligned memory # -DMALLOC_IS_NOT_ALIGNED The malloc call does not return aligned memory # # -DUSE_OWN_ALIGNED_MALLOC If no aligned malloc is available, roll your own # -DAVOID_OWN_ALIGNED_MALLOC If no aligned malloc is available, refuse to build # # -DLACK_BAD_ALLOC The C++ library lacks the std::bad_alloc exception # # Here "aligned" is assumed to mean "aligned enough for whatever # vector stuff the space will be used for" which likely means at least # 16-byte alignment. # # If no options are provided, we will use IPP functions if HAVE_IPP is # defined, or else use _aligned_malloc when building with Visual C++ # on Windows, roll our own when building with some other compiler on # Windows, use system malloc when building on OS/X, and use # posix_memalign elsewhere. # # Note that you must supply the same flags when including bqvec # headers later as you are using now when compiling the library. (You # may find it simplest to just add the bqvec source files to your # application's build system and not build a bqvec library at all.) ALLOCATOR_DEFINES := # Add any related includes and libraries here # THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := include build/Makefile.inc sonic-visualiser-3.0.3/bqvec/README.md0000644000000000000000000000235413111512442015517 0ustar 00000000000000 bqvec ===== A small library for vector management and arithmetic in C++ using raw C pointer arrays, designed for simple audio buffer-shuffling. Also includes aligned malloc wrappers and a lock-free ring buffer. The code can call out to vector arithmetic helpers (IPP, vDSP) in some places, and has loops written with an eye to auto-vectorising compilers, but mostly this is a convenience library rather than for performance -- it initially exists to give a fairly consistent API to useful functions over audio buffer arrays. This code originated as part of the Rubber Band Library written by the same authors (see https://bitbucket.org/breakfastquay/rubberband/). It has been pulled out into a separate library and relicensed under a more permissive licence. Generally expected to be vendored in to local project builds rather than being installed as a system library. C++ standard required: C++98 (does not use C++11 or newer features) * To compile on Linux: make test * To compile on macOS: make -f build/Makefile.osx test [![Build Status](https://travis-ci.org/breakfastquay/bqvec.svg?branch=master)](https://travis-ci.org/breakfastquay/bqvec) Copyright 2007-2017 Particular Programs Ltd. See the file COPYING for (BSD/MIT-style) licence terms. sonic-visualiser-3.0.3/bqvec/bqvec/Allocators.h0000644000000000000000000002615713111512442017623 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_ALLOCATORS_H #define BQVEC_ALLOCATORS_H /* * Aligned and per-channel allocators and deallocators for raw C array * buffers and C++ STL vectors. */ #include #include #include #include #ifndef HAVE_POSIX_MEMALIGN #ifndef LACK_POSIX_MEMALIGN #ifndef _WIN32 #ifndef __APPLE__ #define HAVE_POSIX_MEMALIGN #endif #endif #endif #endif #ifndef MALLOC_IS_ALIGNED #ifndef MALLOC_IS_NOT_ALIGNED #ifdef __APPLE__ #define MALLOC_IS_ALIGNED #endif #endif #endif #ifndef HAVE__ALIGNED_MALLOC #ifndef LACK__ALIGNED_MALLOC #ifdef _WIN32 #define HAVE__ALIGNED_MALLOC #endif #endif #endif #ifndef USE_OWN_ALIGNED_MALLOC #ifndef AVOID_OWN_ALIGNED_MALLOC #ifndef HAVE_POSIX_MEMALIGN #ifndef MALLOC_IS_ALIGNED #ifndef HAVE__ALIGNED_MALLOC #define USE_OWN_ALIGNED_MALLOC #endif #endif #endif #endif #endif #ifdef HAVE_POSIX_MEMALIGN #include #include #endif #ifndef NO_EXCEPTIONS #ifdef LACK_BAD_ALLOC namespace std { struct bad_alloc { }; } #endif #endif namespace breakfastquay { template T *allocate(size_t count) { void *ptr = 0; // We'd like to check HAVE_IPP first and, if it's defined, call // ippsMalloc_8u(count * sizeof(T)). But that isn't a general // replacement for malloc() because it only takes an int // argument. So we save it for the specialisations of // allocate and allocate below, where we're more // likely to get away with it. #ifdef MALLOC_IS_ALIGNED ptr = malloc(count * sizeof(T)); #else /* !MALLOC_IS_ALIGNED */ // That's the "sufficiently aligned" functions dealt with, the // rest need a specific alignment provided to the call. 32-byte // alignment is required for at least OpenMAX static const int alignment = 32; #ifdef HAVE__ALIGNED_MALLOC ptr = _aligned_malloc(count * sizeof(T), alignment); #else /* !HAVE__ALIGNED_MALLOC */ #ifdef HAVE_POSIX_MEMALIGN int rv = posix_memalign(&ptr, alignment, count * sizeof(T)); if (rv) { #ifndef NO_EXCEPTIONS if (rv == EINVAL) { throw std::logic_error("Internal error: invalid alignment"); } else { throw std::bad_alloc(); } #else abort(); #endif } #else /* !HAVE_POSIX_MEMALIGN */ #ifdef USE_OWN_ALIGNED_MALLOC #pragma message("Rolling own aligned malloc: this is unlikely to perform as well as the alternatives") // Alignment must be a power of two, bigger than the pointer // size. Stuff the actual malloc'd pointer in just before the // returned value. This is the least desirable way to do this -- // the other options below are all better size_t allocd = count * sizeof(T) + alignment; void *buf = malloc(allocd); if (buf) { char *adj = (char *)buf; while ((unsigned long long)adj & (alignment-1)) --adj; ptr = ((char *)adj) + alignment; ((void **)ptr)[-1] = buf; } #else /* !USE_OWN_ALIGNED_MALLOC */ #error "No aligned malloc available: define MALLOC_IS_ALIGNED to use system malloc, HAVE_POSIX_MEMALIGN if posix_memalign is available, HAVE__ALIGNED_MALLOC if _aligned_malloc is available, or USE_OWN_ALIGNED_MALLOC to roll our own" #endif /* !USE_OWN_ALIGNED_MALLOC */ #endif /* !HAVE_POSIX_MEMALIGN */ #endif /* !HAVE__ALIGNED_MALLOC */ #endif /* !MALLOC_IS_ALIGNED */ if (!ptr) { #ifndef NO_EXCEPTIONS throw std::bad_alloc(); #else abort(); #endif } return (T *)ptr; } #ifdef HAVE_IPP template <> float *allocate(size_t count); template <> double *allocate(size_t count); #endif template T *allocate_and_zero(size_t count) { T *ptr = allocate(count); for (size_t i = 0; i < count; ++i) { ptr[i] = T(); } return ptr; } template void deallocate(T *ptr) { if (!ptr) return; #ifdef MALLOC_IS_ALIGNED free((void *)ptr); #else /* !MALLOC_IS_ALIGNED */ #ifdef HAVE__ALIGNED_MALLOC _aligned_free((void *)ptr); #else /* !HAVE__ALIGNED_MALLOC */ #ifdef HAVE_POSIX_MEMALIGN free((void *)ptr); #else /* !HAVE_POSIX_MEMALIGN */ #ifdef USE_OWN_ALIGNED_MALLOC free(((void **)ptr)[-1]); #else /* !USE_OWN_ALIGNED_MALLOC */ #error "No aligned malloc available: define MALLOC_IS_ALIGNED to use system malloc, HAVE_POSIX_MEMALIGN if posix_memalign is available, or USE_OWN_ALIGNED_MALLOC to roll our own" #endif /* !USE_OWN_ALIGNED_MALLOC */ #endif /* !HAVE_POSIX_MEMALIGN */ #endif /* !HAVE__ALIGNED_MALLOC */ #endif /* !MALLOC_IS_ALIGNED */ } #ifdef HAVE_IPP template <> void deallocate(float *); template <> void deallocate(double *); #endif /// Reallocate preserving contents but leaving additional memory uninitialised template T *reallocate(T *ptr, size_t oldcount, size_t count) { T *newptr = allocate(count); if (oldcount && ptr) { size_t tocopy = oldcount; if (count < oldcount) tocopy = count; for (size_t i = 0; i < tocopy; ++i) { newptr[i] = ptr[i]; } } if (ptr) deallocate(ptr); return newptr; } /// Reallocate, zeroing all contents template T *reallocate_and_zero(T *ptr, size_t oldcount, size_t count) { ptr = reallocate(ptr, oldcount, count); for (size_t i = 0; i < count; ++i) { ptr[i] = T(); } return ptr; } /// Reallocate preserving contents and zeroing any additional memory template T *reallocate_and_zero_extension(T *ptr, size_t oldcount, size_t count) { ptr = reallocate(ptr, oldcount, count); if (count > oldcount) { for (size_t i = oldcount; i < count; ++i) { ptr[i] = T(); } } return ptr; } template T **allocate_channels(size_t channels, size_t count) { // We don't want to use the aligned allocate for the channel // pointers, it might even make things slower T **ptr = new T *[channels]; for (size_t c = 0; c < channels; ++c) { ptr[c] = allocate(count); } return ptr; } template T **allocate_and_zero_channels(size_t channels, size_t count) { // We don't want to use the aligned allocate for the channel // pointers, it might even make things slower T **ptr = new T *[channels]; for (size_t c = 0; c < channels; ++c) { ptr[c] = allocate_and_zero(count); } return ptr; } template void deallocate_channels(T **ptr, size_t channels) { if (!ptr) return; for (size_t c = 0; c < channels; ++c) { deallocate(ptr[c]); } delete[] ptr; } template T **reallocate_channels(T **ptr, size_t oldchannels, size_t oldcount, size_t channels, size_t count) { T **newptr = allocate_channels(channels, count); if (oldcount && ptr) { for (size_t c = 0; c < channels; ++c) { for (size_t i = 0; i < oldcount && i < count; ++i) { newptr[c][i] = ptr[c][i]; } } } if (ptr) deallocate_channels(ptr, oldchannels); return newptr; } template T **reallocate_and_zero_extend_channels(T **ptr, size_t oldchannels, size_t oldcount, size_t channels, size_t count) { T **newptr = allocate_and_zero_channels(channels, count); if (oldcount && ptr) { for (size_t c = 0; c < channels; ++c) { for (size_t i = 0; i < oldcount && i < count; ++i) { newptr[c][i] = ptr[c][i]; } } } if (ptr) deallocate_channels(ptr, oldchannels); return newptr; } /** Trivial RAII class to call deallocate() on destruction. */ template class Deallocator { public: Deallocator(T *t) : m_t(t) { } ~Deallocator() { deallocate(m_t); } private: T *m_t; }; /** Allocator for use with STL classes, e.g. vector, to ensure * alignment. Based on example code by Stephan T. Lavavej. * * e.g. std::vector > v; */ template class StlAllocator { public: typedef T *pointer; typedef const T *const_pointer; typedef T &reference; typedef const T &const_reference; typedef T value_type; typedef size_t size_type; typedef ptrdiff_t difference_type; StlAllocator() { } StlAllocator(const StlAllocator&) { } template StlAllocator(const StlAllocator&) { } ~StlAllocator() { } T * allocate(const size_t n) const { if (n == 0) return 0; if (n > max_size()) { #ifndef NO_EXCEPTIONS throw std::length_error("Size overflow in StlAllocator::allocate()"); #else abort(); #endif } return ::breakfastquay::allocate(n); } void deallocate(T *const p, const size_t) const { ::breakfastquay::deallocate(p); } template T * allocate(const size_t n, const U *) const { return allocate(n); } T * address(T &r) const { return &r; } const T * address(const T &s) const { return &s; } size_t max_size() const { return (static_cast(0) - static_cast(1)) / sizeof(T); } template struct rebind { typedef StlAllocator other; }; bool operator==(const StlAllocator &) const { return true; } bool operator!=(const StlAllocator &) const { return false; } void construct(T *const p, const T &t) const { void *const pv = static_cast(p); new (pv) T(t); } void destroy(T *const p) const { p->~T(); } private: StlAllocator& operator=(const StlAllocator&); }; } #endif sonic-visualiser-3.0.3/bqvec/bqvec/Barrier.h0000644000000000000000000000400313111512442017070 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_BARRIER_H #define BQVEC_BARRIER_H namespace breakfastquay { extern void system_memorybarrier(); } #if defined _WIN32 #define BQ_MBARRIER() ::breakfastquay::system_memorybarrier() #elif defined __APPLE__ #include #define BQ_MBARRIER() OSMemoryBarrier() #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) #define BQ_MBARRIER() __sync_synchronize() #else #define BQ_MBARRIER() ::breakfastquay::system_memorybarrier() #endif #endif sonic-visualiser-3.0.3/bqvec/bqvec/ComplexTypes.h0000644000000000000000000000366313111512442020151 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_COMPLEX_TYPES_H #define BQVEC_COMPLEX_TYPES_H namespace breakfastquay { #ifndef NO_COMPLEX_TYPES #ifdef USE_SINGLE_PRECISION_COMPLEX typedef float bq_complex_element_t; #else typedef double bq_complex_element_t; #endif // Convertible with other complex types that store re+im consecutively struct bq_complex_t { bq_complex_element_t re; bq_complex_element_t im; }; #endif } #endif sonic-visualiser-3.0.3/bqvec/bqvec/Range.h0000644000000000000000000000402413111512442016541 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_RANGE_H #define BQVEC_RANGE_H namespace breakfastquay { /** Check whether an integer index is in range for a container, avoiding overflows and signed/unsigned comparison warnings. */ template bool in_range_for(const C &container, T i) { if (i < 0) return false; if (sizeof(T) > sizeof(typename C::size_type)) { return i < static_cast(container.size()); } else { return static_cast(i) < container.size(); } } } #endif sonic-visualiser-3.0.3/bqvec/bqvec/Restrict.h0000644000000000000000000000343113111512442017305 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_RESTRICT_H #define BQVEC_RESTRICT_H #ifdef __MSVC__ #define BQ_R__ __restrict #endif #ifdef __clang__ #define BQ_R__ __restrict__ #else #ifdef __GNUC__ #define BQ_R__ __restrict__ #endif #endif #ifndef BQ_R__ #define BQ_R__ #endif #endif sonic-visualiser-3.0.3/bqvec/bqvec/RingBuffer.h0000644000000000000000000003156613111512442017551 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_RINGBUFFER_H #define BQVEC_RINGBUFFER_H //#define DEBUG_RINGBUFFER 1 #include "Barrier.h" #include "Allocators.h" #include "Restrict.h" #include "VectorOps.h" #include #include namespace breakfastquay { /** * RingBuffer implements a lock-free ring buffer for one writer and * one reader, that is to be used to store a sample type T. * * RingBuffer is thread-safe provided only one thread writes and only * one thread reads. */ template class RingBuffer { public: /** * Create a ring buffer with room to write n samples. * * Note that the internal storage size will actually be n+1 * samples, as one element is unavailable for administrative * reasons. Since the ring buffer performs best if its size is a * power of two, this means n should ideally be some power of two * minus one. */ RingBuffer(int n); virtual ~RingBuffer(); /** * Return the total capacity of the ring buffer in samples. * (This is the argument n passed to the constructor.) */ int getSize() const; /** * Return a new ring buffer (allocated with "new" -- caller must * delete when no longer needed) of the given size, containing the * same data as this one. If another thread reads from or writes * to this buffer during the call, the results may be incomplete * or inconsistent. If this buffer's data will not fit in the new * size, the contents are undefined. */ RingBuffer *resized(int newSize) const; /** * Reset read and write pointers, thus emptying the buffer. * Should be called from the write thread. */ void reset(); /** * Return the amount of data available for reading, in samples. */ int getReadSpace() const; /** * Return the amount of space available for writing, in samples. */ int getWriteSpace() const; /** * Read n samples from the buffer. If fewer than n are available, * the remainder will be zeroed out. Returns the number of * samples actually read. * * This is a template function, taking an argument S for the target * sample type, which is permitted to differ from T if the two * types are compatible for arithmetic operations. */ template int read(S *const BQ_R__ destination, int n); /** * Read n samples from the buffer, adding them to the destination. * If fewer than n are available, the remainder will be left * alone. Returns the number of samples actually read. * * This is a template function, taking an argument S for the target * sample type, which is permitted to differ from T if the two * types are compatible for arithmetic operations. */ template int readAdding(S *const BQ_R__ destination, int n); /** * Read one sample from the buffer. If no sample is available, * this will silently return zero. Calling this repeatedly is * obviously slower than calling read once, but it may be good * enough if you don't want to allocate a buffer to read into. */ T readOne(); /** * Read n samples from the buffer, if available, without advancing * the read pointer -- i.e. a subsequent read() or skip() will be * necessary to empty the buffer. If fewer than n are available, * the remainder will be zeroed out. Returns the number of * samples actually read. */ int peek(T *const BQ_R__ destination, int n) const; /** * Read one sample from the buffer, if available, without * advancing the read pointer -- i.e. a subsequent read() or * skip() will be necessary to empty the buffer. Returns zero if * no sample was available. */ T peekOne() const; /** * Pretend to read n samples from the buffer, without actually * returning them (i.e. discard the next n samples). Returns the * number of samples actually available for discarding. */ int skip(int n); /** * Write n samples to the buffer. If insufficient space is * available, not all samples may actually be written. Returns * the number of samples actually written. * * This is a template function, taking an argument S for the source * sample type, which is permitted to differ from T if the two * types are compatible for assignment. */ template int write(const S *const BQ_R__ source, int n); /** * Write n zero-value samples to the buffer. If insufficient * space is available, not all zeros may actually be written. * Returns the number of zeroes actually written. */ int zero(int n); protected: T *const BQ_R__ m_buffer; int m_writer; int m_reader; const int m_size; int readSpaceFor(int w, int r) const { int space; if (w > r) space = w - r; else if (w < r) space = (w + m_size) - r; else space = 0; return space; } int writeSpaceFor(int w, int r) const { int space = (r + m_size - w - 1); if (space >= m_size) space -= m_size; return space; } private: RingBuffer(const RingBuffer &); // not provided RingBuffer &operator=(const RingBuffer &); // not provided }; template RingBuffer::RingBuffer(int n) : m_buffer(allocate(n + 1)), m_writer(0), m_size(n + 1) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::RingBuffer(" << n << ")" << std::endl; #endif m_reader = 0; } template RingBuffer::~RingBuffer() { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::~RingBuffer" << std::endl; #endif deallocate(m_buffer); } template int RingBuffer::getSize() const { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::getSize(): " << m_size-1 << std::endl; #endif return m_size - 1; } template RingBuffer * RingBuffer::resized(int newSize) const { RingBuffer *newBuffer = new RingBuffer(newSize); int w = m_writer; int r = m_reader; while (r != w) { T value = m_buffer[r]; newBuffer->write(&value, 1); if (++r == m_size) r = 0; } return newBuffer; } template void RingBuffer::reset() { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::reset" << std::endl; #endif m_reader = m_writer; } template int RingBuffer::getReadSpace() const { return readSpaceFor(m_writer, m_reader); } template int RingBuffer::getWriteSpace() const { return writeSpaceFor(m_writer, m_reader); } template template int RingBuffer::read(S *const BQ_R__ destination, int n) { int w = m_writer; int r = m_reader; int available = readSpaceFor(w, r); if (n > available) { std::cerr << "WARNING: RingBuffer::read: " << n << " requested, only " << available << " available" << std::endl; n = available; } if (n == 0) return n; int here = m_size - r; T *const BQ_R__ bufbase = m_buffer + r; if (here >= n) { v_convert(destination, bufbase, n); } else { v_convert(destination, bufbase, here); v_convert(destination + here, m_buffer, n - here); } r += n; while (r >= m_size) r -= m_size; BQ_MBARRIER(); m_reader = r; return n; } template template int RingBuffer::readAdding(S *const BQ_R__ destination, int n) { int w = m_writer; int r = m_reader; int available = readSpaceFor(w, r); if (n > available) { std::cerr << "WARNING: RingBuffer::read: " << n << " requested, only " << available << " available" << std::endl; n = available; } if (n == 0) return n; int here = m_size - r; T *const BQ_R__ bufbase = m_buffer + r; if (here >= n) { v_add(destination, bufbase, n); } else { v_add(destination, bufbase, here); v_add(destination + here, m_buffer, n - here); } r += n; while (r >= m_size) r -= m_size; BQ_MBARRIER(); m_reader = r; return n; } template T RingBuffer::readOne() { int w = m_writer; int r = m_reader; if (w == r) { std::cerr << "WARNING: RingBuffer::readOne: no sample available" << std::endl; return T(); } T value = m_buffer[r]; if (++r == m_size) r = 0; BQ_MBARRIER(); m_reader = r; return value; } template int RingBuffer::peek(T *const BQ_R__ destination, int n) const { int w = m_writer; int r = m_reader; int available = readSpaceFor(w, r); if (n > available) { std::cerr << "WARNING: RingBuffer::peek: " << n << " requested, only " << available << " available" << std::endl; memset(destination + available, 0, (n - available) * sizeof(T)); n = available; } if (n == 0) return n; int here = m_size - r; const T *const BQ_R__ bufbase = m_buffer + r; if (here >= n) { v_copy(destination, bufbase, n); } else { v_copy(destination, bufbase, here); v_copy(destination + here, m_buffer, n - here); } return n; } template T RingBuffer::peekOne() const { int w = m_writer; int r = m_reader; if (w == r) { std::cerr << "WARNING: RingBuffer::peekOne: no sample available" << std::endl; return 0; } T value = m_buffer[r]; return value; } template int RingBuffer::skip(int n) { int w = m_writer; int r = m_reader; int available = readSpaceFor(w, r); if (n > available) { std::cerr << "WARNING: RingBuffer::skip: " << n << " requested, only " << available << " available" << std::endl; n = available; } if (n == 0) return n; r += n; while (r >= m_size) r -= m_size; // No memory barrier required, because we didn't read any data m_reader = r; return n; } template template int RingBuffer::write(const S *const BQ_R__ source, int n) { int w = m_writer; int r = m_reader; int available = writeSpaceFor(w, r); if (n > available) { std::cerr << "WARNING: RingBuffer::write: " << n << " requested, only room for " << available << std::endl; n = available; } if (n == 0) return n; int here = m_size - w; T *const BQ_R__ bufbase = m_buffer + w; if (here >= n) { v_convert(bufbase, source, n); } else { v_convert(bufbase, source, here); v_convert(m_buffer, source + here, n - here); } w += n; while (w >= m_size) w -= m_size; BQ_MBARRIER(); m_writer = w; return n; } template int RingBuffer::zero(int n) { int w = m_writer; int r = m_reader; int available = writeSpaceFor(w, r); if (n > available) { std::cerr << "WARNING: RingBuffer::zero: " << n << " requested, only room for " << available << std::endl; n = available; } if (n == 0) return n; int here = m_size - w; T *const BQ_R__ bufbase = m_buffer + w; if (here >= n) { v_zero(bufbase, n); } else { v_zero(bufbase, here); v_zero(m_buffer, n - here); } w += n; while (w >= m_size) w -= m_size; BQ_MBARRIER(); m_writer = w; return n; } } #endif // BQVEC_RINGBUFFER_H sonic-visualiser-3.0.3/bqvec/bqvec/VectorOps.h0000644000000000000000000010362313111512442017436 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_VECTOR_OPS_H #define BQVEC_VECTOR_OPS_H #ifdef HAVE_IPP #ifndef _MSC_VER #include #endif #include #include #if (IPP_VERSION_MAJOR <= 7) // Deprecated in v8, removed in v9 #include #endif #endif #ifdef HAVE_VDSP #include #endif #include #include #include "Restrict.h" namespace breakfastquay { /** * General principle: * * Write basic vector-manipulation loops in such a way as to promote * the likelihood that a good current C++ compiler can auto-vectorize * them (e.g. gcc-4+ with -ftree-vectorize/-O3). Provide calls out to * supported vector libraries (e.g. IPP, Accelerate) where useful. No * intrinsics or assembly. * * Size and index arguments are plain machine ints, to facilitate * compiler optimization and vectorization. In general these functions * should be used only with buffers whose sizes are calculated from * known processing parameters and that are known to be much smaller * than 32-bit int range. For security reasons you should not use * these functions with buffers whose sizes may be under control of * the user or external input. * * Argument ordering: * * If a function operates on one or more vector sequences in memory, * they appear as pointers at the start of the argument list. If one * vector is the "destination", it appears first, with "source" second * if present (i.e. argument ordering follows memcpy). * * The final argument is always a count of the number of elements in * each vector. * * Some functions operate on a set of vectors at once: their names all * contain the text _channels, and the number of channels (i.e. number * of vectors) is the argument before last. If the number of input and * output channels may differ, the output channel count immediately * follows the output channel pointer. * * Any additional arguments, e.g. scale factors, appear between the * vector pointers at the start and the counts at the end. * * The caller takes responsibility for ensuring that vector pointer * arguments are not aliased, i.e. that vectors provided as separate * arguments to the same function are distinct and do not overlap, * except where documented. */ /** * v_zero * * Zero the elements in the given vector, of length \arg count. */ template inline void v_zero(T *const BQ_R__ vec, const int count) { const T value = T(0); for (int i = 0; i < count; ++i) { vec[i] = value; } } #if defined HAVE_IPP template<> inline void v_zero(float *const BQ_R__ vec, const int count) { ippsZero_32f(vec, count); } template<> inline void v_zero(double *const BQ_R__ vec, const int count) { ippsZero_64f(vec, count); } #elif defined HAVE_VDSP template<> inline void v_zero(float *const BQ_R__ vec, const int count) { vDSP_vclr(vec, 1, count); } template<> inline void v_zero(double *const BQ_R__ vec, const int count) { vDSP_vclrD(vec, 1, count); } #endif // HAVE_IPP /** * v_zero_channels * * Zero the elements in the given set of \arg channels vectors, each * of length \arg count. */ template inline void v_zero_channels(T *const BQ_R__ *const BQ_R__ vec, const int channels, const int count) { for (int c = 0; c < channels; ++c) { v_zero(vec[c], count); } } /** * v_set * * Set all of the elements in the given vector, of length \arg count, * to \arg value. */ template inline void v_set(T *const BQ_R__ vec, const T value, const int count) { for (int i = 0; i < count; ++i) { vec[i] = value; } } /** * v_copy * * Copy the contents of the vector \arg src to the vector \arg dst, * both of length \arg count. * * Caller guarantees that \arg src and \arg dst are non-overlapping. */ template inline void v_copy(T *const BQ_R__ dst, const T *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { dst[i] = src[i]; } } #if defined HAVE_IPP template<> inline void v_copy(float *const BQ_R__ dst, const float *const BQ_R__ src, const int count) { ippsCopy_32f(src, dst, count); } template<> inline void v_copy(double *const BQ_R__ dst, const double *const BQ_R__ src, const int count) { ippsCopy_64f(src, dst, count); } #endif // HAVE_IPP /** * v_copy_channels * * Copy the contents of the individual vectors in the set \arg src to * the corresponding vectors in the set \arg dst. All vectors have * length \arg count and there are \arg channels vectors in each set. * * Caller guarantees that all of the \arg src and \arg dst vectors are * non-overlapping with each other. */ template inline void v_copy_channels(T *const BQ_R__ *const BQ_R__ dst, const T *const BQ_R__ *const BQ_R__ src, const int channels, const int count) { for (int c = 0; c < channels; ++c) { v_copy(dst[c], src[c], count); } } /** * v_move * * Copy the contents of vector \arg src to the vector \arg dst, both * of length \arg count. The two vectors may overlap. (If you know * that they cannot overlap, use v_copy instead.) */ template inline void v_move(T *const dst, // not BQ_R__ (aliased) const T *const src, // not BQ_R__ (aliased) const int count) { memmove(dst, src, count * sizeof(T)); } #if defined HAVE_IPP template<> inline void v_move(float *const dst, const float *const src, const int count) { ippsMove_32f(src, dst, count); } template<> inline void v_move(double *const dst, const double *const src, const int count) { ippsMove_64f(src, dst, count); } #endif // HAVE_IPP /** * v_move_channels * * Copy the contents of the individual vectors in the set \arg src to * the corresponding vectors in the set \arg dst. All vectors have * length \arg count and there are \arg channels vectors in each set. * * The source vectors may overlap with the target vectors of * corresponding channels. That is, src[i] may overlap with dst[i] but * not with any other source or target vector. (If you know that no * vectors can overlap, use v_copy instead.) */ template inline void v_move_channels(T *const *const dst, // not BQ_R__ (aliased) const T *const *const src, // not BQ_R__ (aliased) const int channels, const int count) { for (int c = 0; c < channels; ++c) { v_move(dst[c], src[c], count); } } /** * v_convert * * Copy the contents of vector \arg src to the vector \arg dst, both * of length \arg count. The two vectors may have different value * types, e.g. double and float. If they have the same type, this is * equivalent to v_copy. * * Caller guarantees that \arg src and \arg dst are non-overlapping. */ template inline void v_convert(U *const BQ_R__ dst, const T *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { dst[i] = U(src[i]); } } template<> inline void v_convert(float *const BQ_R__ dst, const float *const BQ_R__ src, const int count) { v_copy(dst, src, count); } template<> inline void v_convert(double *const BQ_R__ dst, const double *const BQ_R__ src, const int count) { v_copy(dst, src, count); } #if defined HAVE_IPP template<> inline void v_convert(double *const BQ_R__ dst, const float *const BQ_R__ src, const int count) { ippsConvert_32f64f(src, dst, count); } template<> inline void v_convert(float *const BQ_R__ dst, const double *const BQ_R__ src, const int count) { ippsConvert_64f32f(src, dst, count); } #elif defined HAVE_VDSP template<> inline void v_convert(double *const BQ_R__ dst, const float *const BQ_R__ src, const int count) { vDSP_vspdp((float *)src, 1, dst, 1, count); } template<> inline void v_convert(float *const BQ_R__ dst, const double *const BQ_R__ src, const int count) { vDSP_vdpsp((double *)src, 1, dst, 1, count); } #endif // HAVE_VDSP /** * v_convert_channels * * Copy the contents of the individual vectors in the set \arg src to * the corresponding vectors in the set \arg dst. All vectors have * length \arg count, and there are \arg channels vectors in each * set. The source and destination vectors may have different value * types, e.g. double and float. If they have the same type, this is * equivalent to v_copy_channels. * * Caller guarantees that all of the \arg src and \arg dst vectors are * non-overlapping with each other. */ template inline void v_convert_channels(U *const BQ_R__ *const BQ_R__ dst, const T *const BQ_R__ *const BQ_R__ src, const int channels, const int count) { for (int c = 0; c < channels; ++c) { v_convert(dst[c], src[c], count); } } /** * v_add * * Add the elements in the vector \arg src to the corresponding * elements in the vector \arg srcdst, both of length arg \count, leaving * the result in \arg srcdst. * * Caller guarantees that \arg src and \arg srcdst are non-overlapping. */ template inline void v_add(T *const BQ_R__ srcdst, const T *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] += src[i]; } } #if defined HAVE_IPP template<> inline void v_add(float *const BQ_R__ srcdst, const float *const BQ_R__ src, const int count) { ippsAdd_32f_I(src, srcdst, count); } inline void v_add(double *const BQ_R__ srcdst, const double *const BQ_R__ src, const int count) { ippsAdd_64f_I(src, srcdst, count); } #endif // HAVE_IPP /** * v_add_channels * * Add the elements in the individual vectors in the set \arg src to * the corresponding elements of the corresponding vectors in \arg * srcdst, leaving the results in \arg srcdst. All vectors have length \arg * count, and there are \arg channels vectors in each set. * * Caller guarantees that all of the \arg src and \arg srcdst vectors are * non-overlapping with each other. */ template inline void v_add_channels(T *const BQ_R__ *const BQ_R__ srcdst, const T *const BQ_R__ *const BQ_R__ src, const int channels, const int count) { for (int c = 0; c < channels; ++c) { v_add(srcdst[c], src[c], count); } } /** * v_add_with_gain * * Add the elements in the vector \arg src, each multiplied by the * constant factor \arg gain, to the corresponding elements in the * vector \arg srcdst, both of length arg \count, leaving the result in * \arg srcdst. * * Caller guarantees that \arg src and \arg srcdst are non-overlapping. */ template inline void v_add_with_gain(T *const BQ_R__ srcdst, const T *const BQ_R__ src, const G gain, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] += src[i] * gain; } } /** * v_add_channels_with_gain * * Add the elements in the individual vectors in the set \arg src, * each multiplied by the constant factor \arg gain, to the * corresponding elements of the corresponding vectors in \arg srcdst, * leaving the results in \arg srcdst. All vectors have length \arg * count, and there are \arg channels vectors in each set. * * Caller guarantees that all of the \arg src and \arg srcdst vectors are * non-overlapping with each other. */ template inline void v_add_channels_with_gain(T *const BQ_R__ *const BQ_R__ srcdst, const T *const BQ_R__ *const BQ_R__ src, const G gain, const int channels, const int count) { for (int c = 0; c < channels; ++c) { v_add_with_gain(srcdst[c], src[c], gain, count); } } /** * v_subtract * * Subtract the elements in the vector \arg src from the corresponding * elements in the vector \arg srcdst, both of length arg \count, leaving * the result in \arg srcdst. * * Caller guarantees that \arg src and \arg srcdst are non-overlapping. */ template inline void v_subtract(T *const BQ_R__ srcdst, const T *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] -= src[i]; } } #if defined HAVE_IPP template<> inline void v_subtract(float *const BQ_R__ srcdst, const float *const BQ_R__ src, const int count) { ippsSub_32f_I(src, srcdst, count); } inline void v_subtract(double *const BQ_R__ srcdst, const double *const BQ_R__ src, const int count) { ippsSub_64f_I(src, srcdst, count); } #endif // HAVE_IPP /** * v_scale * * Scale the elements in the vector \arg srcdst, of length \arg count, by * the factor \arg gain. */ template inline void v_scale(T *const BQ_R__ srcdst, const G gain, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] *= gain; } } #if defined HAVE_IPP template<> inline void v_scale(float *const BQ_R__ srcdst, const float gain, const int count) { ippsMulC_32f_I(gain, srcdst, count); } template<> inline void v_scale(double *const BQ_R__ srcdst, const double gain, const int count) { ippsMulC_64f_I(gain, srcdst, count); } #endif // HAVE_IPP /** * v_increment * * Add a constant quantity \incr to all of the elements in the vector * \arg srcdst, of length \arg count. */ template inline void v_increment(T *const BQ_R__ srcdst, const G incr, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] += T(incr); } } /** * v_multiply * * Multiply the elements in the vector \arg srcdst by the corresponding * elements in the vector \arg src, both of length arg \count, leaving * the result in \arg srcdst. * * Caller guarantees that \arg src and \arg srcdst are non-overlapping. */ template inline void v_multiply(T *const BQ_R__ srcdst, const T *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] *= src[i]; } } #if defined HAVE_IPP template<> inline void v_multiply(float *const BQ_R__ srcdst, const float *const BQ_R__ src, const int count) { ippsMul_32f_I(src, srcdst, count); } template<> inline void v_multiply(double *const BQ_R__ srcdst, const double *const BQ_R__ src, const int count) { ippsMul_64f_I(src, srcdst, count); } #endif // HAVE_IPP /** * v_multiply * * Multiply the corresponding elements of the vectors \arg src1 and * \arg src2, both of length arg \count, and write the results into * \arg dst. * * Caller guarantees that \arg src1, \arg src2 and \arg dst are * non-overlapping. */ template inline void v_multiply_to(T *const BQ_R__ dst, const T *const BQ_R__ src1, const T *const BQ_R__ src2, const int count) { for (int i = 0; i < count; ++i) { dst[i] = src1[i] * src2[i]; } } #if defined HAVE_IPP template<> inline void v_multiply_to(float *const BQ_R__ dst, const float *const BQ_R__ src1, const float *const BQ_R__ src2, const int count) { ippsMul_32f(src1, src2, dst, count); } template<> inline void v_multiply_to(double *const BQ_R__ dst, const double *const BQ_R__ src1, const double *const BQ_R__ src2, const int count) { ippsMul_64f(src1, src2, dst, count); } #endif // HAVE_IPP /** * v_divide * * Divide the elements in the vector \arg srcdst by the corresponding * elements in the vector \arg src, both of length arg \count, leaving * the result in \arg srcdst. * * Caller guarantees that \arg src and \arg srcdst are non-overlapping. */ template inline void v_divide(T *const BQ_R__ srcdst, const T *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] /= src[i]; } } #if defined HAVE_IPP template<> inline void v_divide(float *const BQ_R__ srcdst, const float *const BQ_R__ src, const int count) { ippsDiv_32f_I(src, srcdst, count); } template<> inline void v_divide(double *const BQ_R__ srcdst, const double *const BQ_R__ src, const int count) { ippsDiv_64f_I(src, srcdst, count); } #endif // HAVE_IPP /** * v_multiply_and_add * * Multiply the corresponding elements of the vectors \arg src1 and * \arg src2, both of length arg \count, and add the results to the * corresponding elements of vector \arg srcdst. * * Caller guarantees that \arg src1, \arg src2 and \arg srcdst are * non-overlapping. */ template inline void v_multiply_and_add(T *const BQ_R__ srcdst, const T *const BQ_R__ src1, const T *const BQ_R__ src2, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] += src1[i] * src2[i]; } } #if defined HAVE_IPP template<> inline void v_multiply_and_add(float *const BQ_R__ srcdst, const float *const BQ_R__ src1, const float *const BQ_R__ src2, const int count) { ippsAddProduct_32f(src1, src2, srcdst, count); } template<> inline void v_multiply_and_add(double *const BQ_R__ srcdst, const double *const BQ_R__ src1, const double *const BQ_R__ src2, const int count) { ippsAddProduct_64f(src1, src2, srcdst, count); } #endif // HAVE_IPP /** * v_sum * * Return the sum of the elements in vector \arg src, of length \arg * count. */ template inline T v_sum(const T *const BQ_R__ src, const int count) { T result = T(); for (int i = 0; i < count; ++i) { result += src[i]; } return result; } /** * v_multiply_and_sum * * Multiply the corresponding elements of the vectors \arg src1 and * \arg src2, both of length arg \count, sum the results, and return * the sum as a scalar value. * * Caller guarantees that \arg src1 and \arg src2 are non-overlapping. */ template inline T v_multiply_and_sum(const T *const BQ_R__ src1, const T *const BQ_R__ src2, const int count) { T result = T(); for (int i = 0; i < count; ++i) { result += src1[i] * src2[i]; } return result; } /** * v_log * * Replace each element in vector \arg srcdst, of length \arg count, with * its natural logarithm. */ template inline void v_log(T *const BQ_R__ srcdst, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] = log(srcdst[i]); } } #if defined HAVE_IPP template<> inline void v_log(float *const BQ_R__ srcdst, const int count) { ippsLn_32f_I(srcdst, count); } template<> inline void v_log(double *const BQ_R__ srcdst, const int count) { ippsLn_64f_I(srcdst, count); } #elif defined HAVE_VDSP // no in-place vForce functions for these -- can we use the // out-of-place functions with equal input and output vectors? can we // use an out-of-place one with temporary buffer and still be faster // than doing it any other way? template<> inline void v_log(float *const BQ_R__ srcdst, const int count) { float tmp[count]; vvlogf(tmp, srcdst, &count); v_copy(srcdst, tmp, count); } template<> inline void v_log(double *const BQ_R__ srcdst, const int count) { double tmp[count]; vvlog(tmp, srcdst, &count); v_copy(srcdst, tmp, count); } #endif // HAVE_VDSP /** * v_exp * * Replace each element in vector \arg srcdst, of length \arg count, with * its base-e exponential. */ template inline void v_exp(T *const BQ_R__ srcdst, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] = exp(srcdst[i]); } } #if defined HAVE_IPP template<> inline void v_exp(float *const BQ_R__ srcdst, const int count) { ippsExp_32f_I(srcdst, count); } template<> inline void v_exp(double *const BQ_R__ srcdst, const int count) { ippsExp_64f_I(srcdst, count); } #elif defined HAVE_VDSP // no in-place vForce functions for these -- can we use the // out-of-place functions with equal input and output vectors? can we // use an out-of-place one with temporary buffer and still be faster // than doing it any other way? template<> inline void v_exp(float *const BQ_R__ srcdst, const int count) { float tmp[count]; vvexpf(tmp, srcdst, &count); v_copy(srcdst, tmp, count); } template<> inline void v_exp(double *const BQ_R__ srcdst, const int count) { double tmp[count]; vvexp(tmp, srcdst, &count); v_copy(srcdst, tmp, count); } #endif // HAVE_VDSP /** * v_sqrt * * Replace each element in vector \arg srcdst, of length \arg count, with * its square root. */ template inline void v_sqrt(T *const BQ_R__ srcdst, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] = sqrt(srcdst[i]); } } #if defined HAVE_IPP template<> inline void v_sqrt(float *const BQ_R__ srcdst, const int count) { ippsSqrt_32f_I(srcdst, count); } template<> inline void v_sqrt(double *const BQ_R__ srcdst, const int count) { ippsSqrt_64f_I(srcdst, count); } #elif defined HAVE_VDSP // no in-place vForce functions for these -- can we use the // out-of-place functions with equal input and output vectors? can we // use an out-of-place one with temporary buffer and still be faster // than doing it any other way? template<> inline void v_sqrt(float *const BQ_R__ srcdst, const int count) { float tmp[count]; vvsqrtf(tmp, srcdst, &count); v_copy(srcdst, tmp, count); } template<> inline void v_sqrt(double *const BQ_R__ srcdst, const int count) { double tmp[count]; vvsqrt(tmp, srcdst, &count); v_copy(srcdst, tmp, count); } #endif // HAVE_VDSP /** * v_square * * Replace each element in vector \arg srcdst, of length \arg count, with * its square. */ template inline void v_square(T *const BQ_R__ srcdst, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] = srcdst[i] * srcdst[i]; } } #if defined HAVE_IPP template<> inline void v_square(float *const BQ_R__ srcdst, const int count) { ippsSqr_32f_I(srcdst, count); } template<> inline void v_square(double *const BQ_R__ srcdst, const int count) { ippsSqr_64f_I(srcdst, count); } #endif // HAVE_IPP /** * v_abs * * Replace each element in vector \arg srcdst, of length \arg count, with * its absolute value. */ template inline void v_abs(T *const BQ_R__ srcdst, const int count) { for (int i = 0; i < count; ++i) { srcdst[i] = fabs(srcdst[i]); } } #if defined HAVE_IPP template<> inline void v_abs(float *const BQ_R__ srcdst, const int count) { ippsAbs_32f_I(srcdst, count); } template<> inline void v_abs(double *const BQ_R__ srcdst, const int count) { ippsAbs_64f_I(srcdst, count); } #elif defined HAVE_VDSP template<> inline void v_abs(float *const BQ_R__ srcdst, const int count) { float tmp[count]; #if (defined(MACOSX_DEPLOYMENT_TARGET) && MACOSX_DEPLOYMENT_TARGET <= 1070 && MAC_OS_X_VERSION_MIN_REQUIRED <= 1070) vvfabf(tmp, srcdst, &count); #else vvfabsf(tmp, srcdst, &count); #endif v_copy(srcdst, tmp, count); } #endif // HAVE_VDSP /** * v_interleave * * Interleave (zip) the \arg channels vectors in \arg src, each of * length \arg count, into the single vector \arg dst of length \arg * channels * \arg count. * * Caller guarantees that the \arg src and \arg dst vectors are * non-overlapping. */ template inline void v_interleave(T *const BQ_R__ dst, const T *const BQ_R__ *const BQ_R__ src, const int channels, const int count) { int idx = 0; switch (channels) { case 2: // common case, may be vectorized by compiler if hardcoded for (int i = 0; i < count; ++i) { for (int j = 0; j < 2; ++j) { dst[idx++] = src[j][i]; } } return; case 1: v_copy(dst, src[0], count); return; default: for (int i = 0; i < count; ++i) { for (int j = 0; j < channels; ++j) { dst[idx++] = src[j][i]; } } } } #if defined HAVE_IPP #if (IPP_VERSION_MAJOR <= 7) // Deprecated in v8, removed in v9 template<> inline void v_interleave(float *const BQ_R__ dst, const float *const BQ_R__ *const BQ_R__ src, const int channels, const int count) { ippsInterleave_32f((const Ipp32f **)src, channels, count, dst); } // IPP does not (currently?) provide double-precision interleave #endif #endif // HAVE_IPP /** * v_deinterleave * * Deinterleave (unzip) the single vector \arg src, of length \arg * channels * \arg count, into the \arg channels vectors in \arg dst, * each of length \arg count. * * Caller guarantees that the \arg src and \arg dst vectors are * non-overlapping. */ template inline void v_deinterleave(T *const BQ_R__ *const BQ_R__ dst, const T *const BQ_R__ src, const int channels, const int count) { int idx = 0; switch (channels) { case 2: // common case, may be vectorized by compiler if hardcoded for (int i = 0; i < count; ++i) { for (int j = 0; j < 2; ++j) { dst[j][i] = src[idx++]; } } return; case 1: v_copy(dst[0], src, count); return; default: for (int i = 0; i < count; ++i) { for (int j = 0; j < channels; ++j) { dst[j][i] = src[idx++]; } } } } #if defined HAVE_IPP #if (IPP_VERSION_MAJOR <= 7) // Deprecated in v8, removed in v9 template<> inline void v_deinterleave(float *const BQ_R__ *const BQ_R__ dst, const float *const BQ_R__ src, const int channels, const int count) { ippsDeinterleave_32f((const Ipp32f *)src, channels, count, (Ipp32f **)dst); } // IPP does not (currently?) provide double-precision deinterleave #endif #endif // HAVE_IPP /** * v_fftshift * * Perform an in-place left-right shift of the vector \arg vec of * length \arg count, swapping the first and second halves of the * vector. */ template inline void v_fftshift(T *const BQ_R__ vec, const int count) { const int hs = count/2; for (int i = 0; i < hs; ++i) { T t = vec[i]; vec[i] = vec[i + hs]; vec[i + hs] = t; } } /** * v_mean * * Return the mean of the values in the vector \arg vec, of length * \arg count. For an empty vector, return 0.0. */ template inline T v_mean(const T *const BQ_R__ vec, const int count) { T t = T(0); if (count == 0) return t; for (int i = 0; i < count; ++i) { t += vec[i]; } t /= T(count); return t; } /** * v_mean_channels * * Return the mean of all the values in the set of \arg channels * vectors in \arg vec, each of length \arg count. (This is the single * mean of all values across all channels, not one mean per channel.) */ template inline T v_mean_channels(const T *const BQ_R__ *const BQ_R__ vec, const int channels, const int count) { T t = T(0); for (int c = 0; c < channels; ++c) { t += v_mean(vec[c], count); } t /= T(channels); return t; } /** * v_mix * * Mixdown N channels to 1 channel by simple averaging. * * Add the elements in the individual vectors in the set \arg in, * each multiplied by the a constant factor 1 / \arg channels, and * leave the results in \arg out. All vectors have length \arg count, * and there are \arg channels vectors in the input set. * * Caller guarantees that all of the \arg in and \arg out vectors are * non-overlapping with each other. */ template inline void v_mix(T *const BQ_R__ out, const T *const BQ_R__ *const BQ_R__ in, const int channels, const int count) { v_zero(out, count); for (int c = 0; c < channels; ++c) { v_add(out, in[c], count); } v_scale(out, T(1.0) / T(channels), count); } /** * v_reconfigure_channels * * Convert a fixed number of frames from n to m channels. * The rules are: * -- if n == m, copy the input through unchanged * -- else if m == 1, mixdown to mono by averaging all n input channels * -- else if n == 1, duplicate the mono input across all m output channels * -- else if n > m, take the first m channels of the input * -- else take all n channels of the input and add m-n silent channels */ template inline void v_reconfigure_channels(T *const BQ_R__ *const BQ_R__ out, const int m, /* out channel count */ const T *const BQ_R__ *const BQ_R__ in, const int n, /* in channel count */ const int count) { if (n == m) { v_copy_channels(out, in, n, count); } else if (m == 1) { v_mix(out[0], in, n, count); } else if (n == 1) { for (int c = 0; c < m; ++c) { v_copy(out[c], in[0], count); } } else { int c = 0; while (c < n && c < m) { v_copy(out[c], in[c], count); ++c; } while (c < m) { v_zero(out[c], count); ++c; } } } /** * v_reconfigure_channels_inplace * * Convert a fixed number of frames from n to m channels, operating * in-place. That is, the input and output buffer arrays are the same, * having space for max(n, m) channel arrays, and we read n channels * from them and write back m. * * The rules are: * -- if n >= m and m > 1, leave unchanged * -- else if m == 1, mixdown to mono by averaging all n channels * -- else if n == 1, duplicate the mono input across all m channels * -- else leave first n channels and add m-n silent channels */ template inline void v_reconfigure_channels_inplace(T *const BQ_R__ *const BQ_R__ inout, const int m, /* out channel count */ const int n, /* in channel count */ const int count) { if (n >= m && m > 1) { return; } else if (m == 1) { for (int c = 1; c < n; ++c) { v_add(inout[0], inout[c], count); } v_scale(inout[0], T(1.0) / T(n), count); } else if (n == 1) { for (int c = 1; c < m; ++c) { v_copy(inout[c], inout[0], count); } } else { int c = n; while (c < m) { v_zero(inout[c], count); ++c; } } } } #endif sonic-visualiser-3.0.3/bqvec/bqvec/VectorOpsComplex.h0000644000000000000000000005455613111512442021000 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef BQVEC_VECTOR_OPS_COMPLEX_H #define BQVEC_VECTOR_OPS_COMPLEX_H #include "VectorOps.h" #include "ComplexTypes.h" #include namespace breakfastquay { #ifndef NO_COMPLEX_TYPES template<> inline void v_zero(bq_complex_t *const BQ_R__ ptr, const int count) { #if defined HAVE_IPP if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsZero_32fc((Ipp32fc *)ptr, count); } else { ippsZero_64fc((Ipp64fc *)ptr, count); } #elif defined HAVE_VDSP if (sizeof(bq_complex_element_t) == sizeof(float)) { vDSP_vclr((float *)ptr, 1, count * 2); } else { vDSP_vclrD((double *)ptr, 1, count * 2); } #else // ! HAVE_VDSP const bq_complex_element_t value = 0.0; for (int i = 0; i < count; ++i) { ptr[i].re = value; ptr[i].im = value; } #endif } #if defined HAVE_IPP template<> inline void v_copy(bq_complex_t *const BQ_R__ dst, const bq_complex_t *const BQ_R__ src, const int count) { if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsCopy_32fc((const Ipp32fc *)src, (Ipp32fc *)dst, count); } else { ippsCopy_64fc((const Ipp64fc *)src, (Ipp64fc *)dst, count); } } template<> inline void v_move(bq_complex_t *const BQ_R__ dst, const bq_complex_t *const BQ_R__ src, const int count) { if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsMove_32fc((const Ipp32fc *)src, (Ipp32fc *)dst, count); } else { ippsMove_64fc((const Ipp64fc *)src, (Ipp64fc *)dst, count); } } #endif // HAVE_IPP template<> inline void v_convert(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ src, const int srccount) { const int targetcount = srccount / 2; int srcidx = 0; for (int i = 0; i < targetcount; ++i) { dst[i].re = src[srcidx++]; dst[i].im = src[srcidx++]; } } template<> inline void v_convert(bq_complex_element_t *const BQ_R__ dst, const bq_complex_t *const BQ_R__ src, const int srccount) { int targetidx = 0; for (int i = 0; i < srccount; ++i) { dst[targetidx++] = src[i].re; dst[targetidx++] = src[i].im; } } inline void c_add(bq_complex_t &srcdst, const bq_complex_t &src) { srcdst.re += src.re; srcdst.im += src.im; } inline void c_add_with_gain(bq_complex_t &srcdst, const bq_complex_t &src, const bq_complex_element_t gain) { srcdst.re += src.re * gain; srcdst.im += src.im * gain; } inline void c_multiply(bq_complex_t &dst, const bq_complex_t &src1, const bq_complex_t &src2) { // Note dst may alias src1 or src2. // The usual formula -- four multiplies, one add and one subtract // // (x1 + y1i)(x2 + y2i) = (x1x2 - y1y2) + (x1y2 + y1x2)i // // Alternative formula -- three multiplies, two adds, three // subtracts // // (x1 + y1i)(x2 + y2i) = (x1x2 - y1y2) + ((x1 + y1)(x2 + y2) - x1x2 - y1y2)i // // The first formulation tests marginally quicker here. bq_complex_element_t real = src1.re * src2.re - src1.im * src2.im; bq_complex_element_t imag = src1.re * src2.im + src1.im * src2.re; dst.re = real; dst.im = imag; } inline void c_multiply(bq_complex_t &srcdst, const bq_complex_t &src) { c_multiply(srcdst, srcdst, src); } inline void c_multiply_and_add(bq_complex_t &srcdst, const bq_complex_t &src1, const bq_complex_t &src2) { bq_complex_t tmp; c_multiply(tmp, src1, src2); c_add(srcdst, tmp); } template<> inline void v_add(bq_complex_t *const BQ_R__ srcdst, const bq_complex_t *const BQ_R__ src, const int count) { #if defined HAVE_IPP if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsAdd_32fc_I((Ipp32fc *)src, (Ipp32fc *)srcdst, count); } else { ippsAdd_64fc_I((Ipp64fc *)src, (Ipp64fc *)srcdst, count); } #else for (int i = 0; i < count; ++i) { srcdst[i].re += src[i].re; srcdst[i].im += src[i].im; } #endif // HAVE_IPP } template<> inline void v_add_with_gain(bq_complex_t *const BQ_R__ srcdst, const bq_complex_t *const BQ_R__ src, const bq_complex_element_t gain, const int count) { for (int i = 0; i < count; ++i) { srcdst[i].re += src[i].re * gain; srcdst[i].im += src[i].im * gain; } } template<> inline void v_multiply(bq_complex_t *const BQ_R__ srcdst, const bq_complex_t *const BQ_R__ src, const int count) { #ifdef HAVE_IPP if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsMul_32fc_I((const Ipp32fc *)src, (Ipp32fc *)srcdst, count); } else { ippsMul_64fc_I((const Ipp64fc *)src, (Ipp64fc *)srcdst, count); } #else for (int i = 0; i < count; ++i) { c_multiply(srcdst[i], src[i]); } #endif // HAVE_IPP } template<> inline void v_multiply_to(bq_complex_t *const BQ_R__ dst, const bq_complex_t *const BQ_R__ src1, const bq_complex_t *const BQ_R__ src2, const int count) { #ifdef HAVE_IPP if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsMul_32fc((const Ipp32fc *)src1, (const Ipp32fc *)src2, (Ipp32fc *)dst, count); } else { ippsMul_64fc((const Ipp64fc *)src1, (const Ipp64fc *)src2, (Ipp64fc *)dst, count); } #else for (int i = 0; i < count; ++i) { c_multiply(dst[i], src1[i], src2[i]); } #endif // HAVE_IPP } template<> inline void v_multiply_and_add(bq_complex_t *const BQ_R__ srcdst, const bq_complex_t *const BQ_R__ src1, const bq_complex_t *const BQ_R__ src2, const int count) { #ifdef HAVE_IPP if (sizeof(bq_complex_element_t) == sizeof(float)) { ippsAddProduct_32fc((const Ipp32fc *)src1, (const Ipp32fc *)src2, (Ipp32fc *)srcdst, count); } else { ippsAddProduct_64fc((const Ipp64fc *)src1, (const Ipp64fc *)src2, (Ipp64fc *)srcdst, count); } #else for (int i = 0; i < count; ++i) { c_multiply_and_add(srcdst[i], src1[i], src2[i]); } #endif // HAVE_IPP } #if defined( __GNUC__ ) && defined( _WIN32 ) // MinGW doesn't appear to have sincos, so define it -- it's // a single x87 instruction anyway static inline void sincos(double x, double *sin, double *cos) { __asm__ ("fsincos;" : "=t" (*cos), "=u" (*sin) : "0" (x) : "st(7)"); } static inline void sincosf(float fx, float *fsin, float *fcos) { double sin, cos; sincos(fx, &sin, &cos); *fsin = sin; *fcos = cos; } #endif #endif // !NO_COMPLEX_TYPES template inline void c_phasor(T *real, T *imag, T phase) { //!!! IPP contains ippsSinCos_xxx in ippvm.h -- these are //!!! fixed-accuracy, test and compare #if defined HAVE_VDSP int one = 1; if (sizeof(T) == sizeof(float)) { vvsincosf((float *)imag, (float *)real, (const float *)&phase, &one); } else { vvsincos((double *)imag, (double *)real, (const double *)&phase, &one); } #elif defined LACK_SINCOS if (sizeof(T) == sizeof(float)) { *real = cosf(phase); *imag = sinf(phase); } else { *real = cos(phase); *imag = sin(phase); } #elif defined __GNUC__ #if defined __APPLE__ #define sincos __sincos #define sincosf __sincosf #endif if (sizeof(T) == sizeof(float)) { sincosf(float(phase), (float *)imag, (float *)real); } else { sincos(phase, (double *)imag, (double *)real); } #else if (sizeof(T) == sizeof(float)) { *real = cosf(phase); *imag = sinf(phase); } else { *real = cos(phase); *imag = sin(phase); } #endif } template inline void c_magphase(T *mag, T *phase, T real, T imag) { *mag = sqrt(real * real + imag * imag); *phase = atan2(imag, real); } #ifdef USE_APPROXIMATE_ATAN2 // NB arguments in opposite order from usual for atan2f extern float approximate_atan2f(float real, float imag); template<> inline void c_magphase(float *mag, float *phase, float real, float imag) { float atan = approximate_atan2f(real, imag); *phase = atan; *mag = sqrtf(real * real + imag * imag); } #else // !USE_APPROXIMATE_ATAN2 template<> inline void c_magphase(float *mag, float *phase, float real, float imag) { *mag = sqrtf(real * real + imag * imag); *phase = atan2f(imag, real); } #endif #ifndef NO_COMPLEX_TYPES inline bq_complex_t c_phasor(bq_complex_element_t phase) { bq_complex_t c; c_phasor(&c.re, &c.im, phase); return c; } inline void c_magphase(bq_complex_element_t *mag, bq_complex_element_t *phase, bq_complex_t c) { c_magphase(mag, phase, c.re, c.im); } void v_polar_to_cartesian(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ mag, const bq_complex_element_t *const BQ_R__ phase, const int count); void v_polar_interleaved_to_cartesian(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ src, const int count); void v_cartesian_to_polar(bq_complex_element_t *const BQ_R__ mag, bq_complex_element_t *const BQ_R__ phase, const bq_complex_t *const BQ_R__ src, const int count); inline void v_cartesian_to_polar_interleaved(bq_complex_element_t *const BQ_R__ dst, const bq_complex_t *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { c_magphase(&dst[i*2], &dst[i*2+1], src[i].re, src[i].im); } } void v_cartesian_to_magnitudes(bq_complex_element_t *const BQ_R__ mag, const bq_complex_t *const BQ_R__ src, const int count); #endif // !NO_COMPLEX_TYPES template // S source, T target void v_polar_to_cartesian(T *const BQ_R__ real, T *const BQ_R__ imag, const S *const BQ_R__ mag, const S *const BQ_R__ phase, const int count) { for (int i = 0; i < count; ++i) { c_phasor(real + i, imag + i, phase[i]); } v_multiply(real, mag, count); v_multiply(imag, mag, count); } template void v_polar_interleaved_to_cartesian_inplace(T *const BQ_R__ srcdst, const int count) { T real, imag; for (int i = 0; i < count*2; i += 2) { c_phasor(&real, &imag, srcdst[i+1]); real *= srcdst[i]; imag *= srcdst[i]; srcdst[i] = real; srcdst[i+1] = imag; } } template // S source, T target void v_polar_to_cartesian_interleaved(T *const BQ_R__ dst, const S *const BQ_R__ mag, const S *const BQ_R__ phase, const int count) { T real, imag; for (int i = 0; i < count; ++i) { c_phasor(&real, &imag, phase[i]); real *= mag[i]; imag *= mag[i]; dst[i*2] = real; dst[i*2+1] = imag; } } #ifdef HAVE_IPP template<> inline void v_polar_to_cartesian(float *const BQ_R__ real, float *const BQ_R__ imag, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count) { ippsPolarToCart_32f(mag, phase, real, imag, count); } template<> inline void v_polar_to_cartesian(double *const BQ_R__ real, double *const BQ_R__ imag, const double *const BQ_R__ mag, const double *const BQ_R__ phase, const int count) { ippsPolarToCart_64f(mag, phase, real, imag, count); } template<> inline void v_polar_to_cartesian_interleaved(float *const BQ_R__ dst, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count) { ippsPolarToCart_32fc(mag, phase, (Ipp32fc *)dst, count); } template<> inline void v_polar_to_cartesian_interleaved(double *const BQ_R__ dst, const double *const BQ_R__ mag, const double *const BQ_R__ phase, const int count) { ippsPolarToCart_64fc(mag, phase, (Ipp64fc *)dst, count); } #elif defined USE_POMMIER_MATHFUN void v_polar_to_cartesian_pommier(float *const BQ_R__ real, float *const BQ_R__ imag, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count); void v_polar_interleaved_to_cartesian_inplace_pommier(float *const BQ_R__ srcdst, const int count); void v_polar_to_cartesian_interleaved_pommier(float *const BQ_R__ dst, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count); template<> inline void v_polar_to_cartesian(float *const BQ_R__ real, float *const BQ_R__ imag, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count) { v_polar_to_cartesian_pommier(real, imag, mag, phase, count); } template<> inline void v_polar_interleaved_to_cartesian_inplace(float *const BQ_R__ srcdst, const int count) { v_polar_interleaved_to_cartesian_inplace_pommier(srcdst, count); } template<> inline void v_polar_to_cartesian_interleaved(float *const BQ_R__ dst, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count) { v_polar_to_cartesian_interleaved_pommier(dst, mag, phase, count); } #endif // USE_POMMIER_MATHFUN template // S source, T target void v_cartesian_to_polar(T *const BQ_R__ mag, T *const BQ_R__ phase, const S *const BQ_R__ real, const S *const BQ_R__ imag, const int count) { for (int i = 0; i < count; ++i) { c_magphase(mag + i, phase + i, real[i], imag[i]); } } template // S source, T target void v_cartesian_interleaved_to_polar(T *const BQ_R__ mag, T *const BQ_R__ phase, const S *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { c_magphase(mag + i, phase + i, src[i*2], src[i*2+1]); } } #ifdef HAVE_IPP template<> inline void v_cartesian_to_polar(float *const BQ_R__ mag, float *const BQ_R__ phase, const float *const BQ_R__ real, const float *const BQ_R__ imag, const int count) { ippsCartToPolar_32f(real, imag, mag, phase, count); } template<> inline void v_cartesian_interleaved_to_polar(float *const BQ_R__ mag, float *const BQ_R__ phase, const float *const BQ_R__ src, const int count) { ippsCartToPolar_32fc((const Ipp32fc *)src, mag, phase, count); } template<> inline void v_cartesian_to_polar(double *const BQ_R__ mag, double *const BQ_R__ phase, const double *const BQ_R__ real, const double *const BQ_R__ imag, const int count) { ippsCartToPolar_64f(real, imag, mag, phase, count); } template<> inline void v_cartesian_interleaved_to_polar(double *const BQ_R__ mag, double *const BQ_R__ phase, const double *const BQ_R__ src, const int count) { ippsCartToPolar_64fc((const Ipp64fc *)src, mag, phase, count); } #elif defined HAVE_VDSP template<> inline void v_cartesian_to_polar(float *const BQ_R__ mag, float *const BQ_R__ phase, const float *const BQ_R__ real, const float *const BQ_R__ imag, const int count) { DSPSplitComplex c; c.realp = const_cast(real); c.imagp = const_cast(imag); vDSP_zvmags(&c, 1, phase, 1, count); // using phase as a temporary dest vvsqrtf(mag, phase, &count); // using phase as the source vvatan2f(phase, imag, real, &count); } template<> inline void v_cartesian_to_polar(double *const BQ_R__ mag, double *const BQ_R__ phase, const double *const BQ_R__ real, const double *const BQ_R__ imag, const int count) { // double precision, this is significantly faster than using vDSP_polar DSPDoubleSplitComplex c; c.realp = const_cast(real); c.imagp = const_cast(imag); vDSP_zvmagsD(&c, 1, phase, 1, count); // using phase as a temporary dest vvsqrt(mag, phase, &count); // using phase as the source vvatan2(phase, imag, real, &count); } #endif // HAVE_VDSP template void v_cartesian_to_polar_interleaved_inplace(T *const BQ_R__ srcdst, const int count) { T mag, phase; for (int i = 0; i < count * 2; i += 2) { c_magphase(&mag, &phase, srcdst[i], srcdst[i+1]); srcdst[i] = mag; srcdst[i+1] = phase; } } template // S source, T target void v_cartesian_to_magnitudes(T *const BQ_R__ mag, const S *const BQ_R__ real, const S *const BQ_R__ imag, const int count) { for (int i = 0; i < count; ++i) { mag[i] = T(sqrt(real[i] * real[i] + imag[i] * imag[i])); } } template // S source, T target void v_cartesian_interleaved_to_magnitudes(T *const BQ_R__ mag, const S *const BQ_R__ src, const int count) { for (int i = 0; i < count; ++i) { mag[i] = T(sqrt(src[i*2] * src[i*2] + src[i*2+1] * src[i*2+1])); } } #ifdef HAVE_IPP template<> inline void v_cartesian_to_magnitudes(float *const BQ_R__ mag, const float *const BQ_R__ real, const float *const BQ_R__ imag, const int count) { ippsMagnitude_32f(real, imag, mag, count); } template<> inline void v_cartesian_to_magnitudes(double *const BQ_R__ mag, const double *const BQ_R__ real, const double *const BQ_R__ imag, const int count) { ippsMagnitude_64f(real, imag, mag, count); } template<> inline void v_cartesian_interleaved_to_magnitudes(float *const BQ_R__ mag, const float *const BQ_R__ src, const int count) { ippsMagnitude_32fc((const Ipp32fc *)src, mag, count); } template<> inline void v_cartesian_interleaved_to_magnitudes(double *const BQ_R__ mag, const double *const BQ_R__ src, const int count) { ippsMagnitude_64fc((const Ipp64fc *)src, mag, count); } #endif } #endif sonic-visualiser-3.0.3/bqvec/build/Makefile.inc0000644000000000000000000000506713111512442017553 0ustar 00000000000000 SRC_DIR := src TEST_DIR := test HEADER_DIR := bqvec SOURCES := $(wildcard $(SRC_DIR)/*.cpp) HEADERS := $(wildcard $(HEADER_DIR)/*.h) $(wildcard $(SRC_DIR)/*.h) OBJECTS := $(SOURCES:.cpp=.o) OBJECTS := $(OBJECTS:.c=.o) TIMINGS_SOURCES := $(TEST_DIR)/Timings.cpp TIMINGS_OBJECTS := $(TIMINGS_SOURCES:.cpp=.o) TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) TEST_OBJECTS := $(TEST_SOURCES:.cpp=.o) OPTFLAGS := -O3 -ffast-math CXXFLAGS := -std=c++98 -fpic -Wall -Wextra -Werror $(VECTOR_DEFINES) $(ALLOCATOR_DEFINES) -I. $(THIRD_PARTY_INCLUDES) -I$(HEADER_DIR) $(OPTFLAGS) LIBRARY := libbqvec.a all: $(LIBRARY) timings test: $(LIBRARY) timings test-allocators test-vectorops test-vectorops-complex ./test-allocators && ./test-vectorops && ./test-vectorops-complex valgrind: $(LIBRARY) timings test-allocators test-vectorops test-vectorops-complex valgrind ./test-allocators && valgrind ./test-vectorops && valgrind ./test-vectorops-complex $(LIBRARY): $(OBJECTS) $(AR) rc $@ $^ timings: $(TIMINGS_OBJECTS) $(LIBRARY) $(CXX) $(CXXFLAGS) -o $@ $^ $(THIRD_PARTY_LIBS) test-allocators: test/TestAllocators.o $(LIBRARY) $(CXX) $(CXXFLAGS) -o $@ $^ -lboost_unit_test_framework -L. -lbqvec $(THIRD_PARTY_LIBS) test-vectorops: test/TestVectorOps.o $(LIBRARY) $(CXX) $(CXXFLAGS) -o $@ $^ -lboost_unit_test_framework -L. -lbqvec $(THIRD_PARTY_LIBS) test-vectorops-complex: test/TestVectorOpsComplex.o $(LIBRARY) $(CXX) $(CXXFLAGS) -o $@ $^ -lboost_unit_test_framework -L. -lbqvec $(THIRD_PARTY_LIBS) clean: rm -f $(OBJECTS) $(TEST_OBJECTS) $(TIMINGS_OBJECTS) distclean: clean rm -f $(LIBRARY) test-allocators test-vectorops test-vectorops-complex depend: makedepend -Y -fbuild/Makefile.inc $(TIMINGS_SOURCES) $(TEST_SOURCES) $(HEADERS) $(SOURCES) # DO NOT DELETE test/Timings.o: bqvec/VectorOpsComplex.h bqvec/VectorOps.h bqvec/Restrict.h test/Timings.o: bqvec/ComplexTypes.h test/Timings.o: bqvec/VectorOpsComplex.h bqvec/VectorOps.h bqvec/Restrict.h test/Timings.o: bqvec/ComplexTypes.h test/TestVectorOpsComplex.o: bqvec/VectorOpsComplex.h bqvec/VectorOps.h test/TestVectorOpsComplex.o: bqvec/Restrict.h bqvec/ComplexTypes.h test/TestVectorOpsComplex.o: bqvec/VectorOps.h test/TestVectorOps.o: bqvec/VectorOps.h test/TestAllocators.o: bqvec/VectorOps.h bqvec/Allocators.h bqvec/RingBuffer.o: bqvec/Barrier.h bqvec/Allocators.h bqvec/Restrict.h bqvec/RingBuffer.o: bqvec/VectorOps.h bqvec/VectorOpsComplex.o: bqvec/VectorOps.h bqvec/Restrict.h bqvec/VectorOpsComplex.o: bqvec/ComplexTypes.h bqvec/VectorOps.o: bqvec/Restrict.h src/Allocators.o: bqvec/Allocators.h src/Barrier.o: bqvec/Barrier.h sonic-visualiser-3.0.3/bqvec/build/Makefile.linux0000644000000000000000000000021513111512442020127 0ustar 00000000000000 VECTOR_DEFINES := THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := ALLOCATOR_DEFINES := -DHAVE_POSIX_MEMALIGN include build/Makefile.inc sonic-visualiser-3.0.3/bqvec/build/Makefile.linux.ipp0000644000000000000000000000040413111512442020716 0ustar 00000000000000 VECTOR_DEFINES := -DHAVE_IPP ALLOCATOR_DEFINES := -DHAVE_POSIX_MEMALIGN THIRD_PARTY_INCLUDES := -I/opt/intel/ipp/include THIRD_PARTY_LIBS := -L/opt/intel/ipp/lib/intel64_lin -Wl,-Bstatic -lipps -lippvm -lippcore -Wl,-Bdynamic include build/Makefile.inc sonic-visualiser-3.0.3/bqvec/build/Makefile.linux.min0000644000000000000000000000075113111512442020716 0ustar 00000000000000 # This Makefile resembles the sort of settings one might use on a # small device without library support. It's mainly here as another CI # test target that is quite different from the default configuration VECTOR_DEFINES := -DNO_EXCEPTIONS -DUSE_SINGLE_PRECISION_COMPLEX -DUSE_POMMIER_MATHFUN -DUSE_APPROXIMATE_ATAN2 ALLOCATOR_DEFINES := -DUSE_OWN_ALIGNED_MALLOC -DLACK_POSIX_MEMALIGN -DMALLOC_IS_NOT_ALIGNED THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := include build/Makefile.inc sonic-visualiser-3.0.3/bqvec/build/Makefile.osx0000644000000000000000000000025213111512442017602 0ustar 00000000000000 VECTOR_DEFINES := -DHAVE_VDSP ALLOCATOR_DEFINES := -DMALLOC_IS_ALIGNED THIRD_PARTY_INCLUDES := THIRD_PARTY_LIBS := -framework Accelerate include build/Makefile.inc sonic-visualiser-3.0.3/bqvec/build/run-platform-tests.sh0000755000000000000000000000266713111512442021473 0ustar 00000000000000#!/bin/bash if [ -z "$1" ]; then echo "Usage: $0 " exit 2 fi platformtag="$1" set -eu ippdir=/opt/intel/ipp echo if [ -d "$ippdir" ]; then echo "Found IPP directory $ippdir, considering IPP as well as other options" else echo "No IPP directory $ippdir, not testing with IPP" fi if valgrind --version >/dev/null 2>&1 ; then have_valgrind=yes else echo echo "No valgrind executable found, not using valgrind" have_valgrind=no fi tmpfile=$(mktemp "/tmp/test_XXXXXX") trap "rm -f $tmpfile" 0 run() { successtext="$1" shift echo -n "Running \"$@\"..." if "$@" > "$tmpfile" 2>&1 ; then if [ -z "$successtext" ] || fgrep -q "$successtext" "$tmpfile" ; then echo " OK" return 0 else echo " Failed" cat "$tmpfile" return 1 fi else echo " Failed" cat "$tmpfile" return 1 fi } for mf in Makefile build/Makefile.$platformtag build/Makefile.$platformtag.* ; do case "$mf" in *~) continue;; *.bak) continue;; *ipp) if [ ! -d "$ippdir" ]; then continue fi;; esac if [ ! -f "$mf" ]; then continue fi echo echo "Building and testing with $mf:" echo make -f "$mf" clean >/dev/null run "No errors detected" make -f "$mf" test if [ "$have_valgrind" = "yes" ]; then for t in test-* ; do if [ -x "$t" ]; then run "no leaks are possible" valgrind --leak-check=full ./"$t" fi done fi done sonic-visualiser-3.0.3/bqvec/pommier/neon_mathfun.h0000644000000000000000000002224513111512442020543 0ustar 00000000000000/* NEON implementation of sin, cos, exp and log Inspired by Intel Approximate Math library, and based on the corresponding algorithms of the cephes math library */ /* Copyright (C) 2011 Julien Pommier This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. (this is the zlib license) */ #include typedef float32x4_t v4sf; // vector of 4 float typedef uint32x4_t v4su; // vector of 4 uint32 typedef int32x4_t v4si; // vector of 4 uint32 #define c_inv_mant_mask ~0x7f800000u #define c_cephes_SQRTHF 0.707106781186547524 #define c_cephes_log_p0 7.0376836292E-2 #define c_cephes_log_p1 - 1.1514610310E-1 #define c_cephes_log_p2 1.1676998740E-1 #define c_cephes_log_p3 - 1.2420140846E-1 #define c_cephes_log_p4 + 1.4249322787E-1 #define c_cephes_log_p5 - 1.6668057665E-1 #define c_cephes_log_p6 + 2.0000714765E-1 #define c_cephes_log_p7 - 2.4999993993E-1 #define c_cephes_log_p8 + 3.3333331174E-1 #define c_cephes_log_q1 -2.12194440e-4 #define c_cephes_log_q2 0.693359375 /* natural logarithm computed for 4 simultaneous float return NaN for x <= 0 */ v4sf log_ps(v4sf x) { v4sf one = vdupq_n_f32(1); x = vmaxq_f32(x, vdupq_n_f32(0)); /* force flush to zero on denormal values */ v4su invalid_mask = vcleq_f32(x, vdupq_n_f32(0)); v4si ux = vreinterpretq_s32_f32(x); v4si emm0 = vshrq_n_s32(ux, 23); /* keep only the fractional part */ ux = vandq_s32(ux, vdupq_n_s32(c_inv_mant_mask)); ux = vorrq_s32(ux, vreinterpretq_s32_f32(vdupq_n_f32(0.5f))); x = vreinterpretq_f32_s32(ux); emm0 = vsubq_s32(emm0, vdupq_n_s32(0x7f)); v4sf e = vcvtq_f32_s32(emm0); e = vaddq_f32(e, one); /* part2: if( x < SQRTHF ) { e -= 1; x = x + x - 1.0; } else { x = x - 1.0; } */ v4su mask = vcltq_f32(x, vdupq_n_f32(c_cephes_SQRTHF)); v4sf tmp = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(x), mask)); x = vsubq_f32(x, one); e = vsubq_f32(e, vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(one), mask))); x = vaddq_f32(x, tmp); v4sf z = vmulq_f32(x,x); v4sf y = vdupq_n_f32(c_cephes_log_p0); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p1)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p2)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p3)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p4)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p5)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p6)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p7)); y = vmulq_f32(y, x); y = vaddq_f32(y, vdupq_n_f32(c_cephes_log_p8)); y = vmulq_f32(y, x); y = vmulq_f32(y, z); tmp = vmulq_f32(e, vdupq_n_f32(c_cephes_log_q1)); y = vaddq_f32(y, tmp); tmp = vmulq_f32(z, vdupq_n_f32(0.5f)); y = vsubq_f32(y, tmp); tmp = vmulq_f32(e, vdupq_n_f32(c_cephes_log_q2)); x = vaddq_f32(x, y); x = vaddq_f32(x, tmp); x = vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(x), invalid_mask)); // negative arg will be NAN return x; } #define c_exp_hi 88.3762626647949f #define c_exp_lo -88.3762626647949f #define c_cephes_LOG2EF 1.44269504088896341 #define c_cephes_exp_C1 0.693359375 #define c_cephes_exp_C2 -2.12194440e-4 #define c_cephes_exp_p0 1.9875691500E-4 #define c_cephes_exp_p1 1.3981999507E-3 #define c_cephes_exp_p2 8.3334519073E-3 #define c_cephes_exp_p3 4.1665795894E-2 #define c_cephes_exp_p4 1.6666665459E-1 #define c_cephes_exp_p5 5.0000001201E-1 /* exp() computed for 4 float at once */ v4sf exp_ps(v4sf x) { v4sf tmp, fx; v4sf one = vdupq_n_f32(1); x = vminq_f32(x, vdupq_n_f32(c_exp_hi)); x = vmaxq_f32(x, vdupq_n_f32(c_exp_lo)); /* express exp(x) as exp(g + n*log(2)) */ fx = vmlaq_f32(vdupq_n_f32(0.5f), x, vdupq_n_f32(c_cephes_LOG2EF)); /* perform a floorf */ tmp = vcvtq_f32_s32(vcvtq_s32_f32(fx)); /* if greater, substract 1 */ v4su mask = vcgtq_f32(tmp, fx); mask = vandq_u32(mask, vreinterpretq_u32_f32(one)); fx = vsubq_f32(tmp, vreinterpretq_f32_u32(mask)); tmp = vmulq_f32(fx, vdupq_n_f32(c_cephes_exp_C1)); v4sf z = vmulq_f32(fx, vdupq_n_f32(c_cephes_exp_C2)); x = vsubq_f32(x, tmp); x = vsubq_f32(x, z); static const float32_t cephes_exp_p[6] = { c_cephes_exp_p0, c_cephes_exp_p1, c_cephes_exp_p2, c_cephes_exp_p3, c_cephes_exp_p4, c_cephes_exp_p5 }; v4sf y = vld1q_dup_f32(cephes_exp_p+0); v4sf c1 = vld1q_dup_f32(cephes_exp_p+1); v4sf c2 = vld1q_dup_f32(cephes_exp_p+2); v4sf c3 = vld1q_dup_f32(cephes_exp_p+3); v4sf c4 = vld1q_dup_f32(cephes_exp_p+4); v4sf c5 = vld1q_dup_f32(cephes_exp_p+5); y = vmulq_f32(y, x); z = vmulq_f32(x,x); y = vaddq_f32(y, c1); y = vmulq_f32(y, x); y = vaddq_f32(y, c2); y = vmulq_f32(y, x); y = vaddq_f32(y, c3); y = vmulq_f32(y, x); y = vaddq_f32(y, c4); y = vmulq_f32(y, x); y = vaddq_f32(y, c5); y = vmulq_f32(y, z); y = vaddq_f32(y, x); y = vaddq_f32(y, one); /* build 2^n */ int32x4_t mm; mm = vcvtq_s32_f32(fx); mm = vaddq_s32(mm, vdupq_n_s32(0x7f)); mm = vshlq_n_s32(mm, 23); v4sf pow2n = vreinterpretq_f32_s32(mm); y = vmulq_f32(y, pow2n); return y; } #define c_minus_cephes_DP1 -0.78515625 #define c_minus_cephes_DP2 -2.4187564849853515625e-4 #define c_minus_cephes_DP3 -3.77489497744594108e-8 #define c_sincof_p0 -1.9515295891E-4 #define c_sincof_p1 8.3321608736E-3 #define c_sincof_p2 -1.6666654611E-1 #define c_coscof_p0 2.443315711809948E-005 #define c_coscof_p1 -1.388731625493765E-003 #define c_coscof_p2 4.166664568298827E-002 #define c_cephes_FOPI 1.27323954473516 // 4 / M_PI /* evaluation of 4 sines & cosines at once. The code is the exact rewriting of the cephes sinf function. Precision is excellent as long as x < 8192 (I did not bother to take into account the special handling they have for greater values -- it does not return garbage for arguments over 8192, though, but the extra precision is missing). Note that it is such that sinf((float)M_PI) = 8.74e-8, which is the surprising but correct result. Note also that when you compute sin(x), cos(x) is available at almost no extra price so both sin_ps and cos_ps make use of sincos_ps.. */ void sincos_ps(v4sf x, v4sf *ysin, v4sf *ycos) { // any x v4sf xmm1, xmm2, xmm3, y; v4su emm2; v4su sign_mask_sin, sign_mask_cos; sign_mask_sin = vcltq_f32(x, vdupq_n_f32(0)); x = vabsq_f32(x); /* scale by 4/Pi */ y = vmulq_f32(x, vdupq_n_f32(c_cephes_FOPI)); /* store the integer part of y in mm0 */ emm2 = vcvtq_u32_f32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = vaddq_u32(emm2, vdupq_n_u32(1)); emm2 = vandq_u32(emm2, vdupq_n_u32(~1)); y = vcvtq_f32_u32(emm2); /* get the polynom selection mask there is one polynom for 0 <= x <= Pi/4 and another one for Pi/4 /* yes I know, the top of this file is quite ugly */ #ifdef _MSC_VER /* visual c++ */ # define ALIGN16_BEG __declspec(align(16)) # define ALIGN16_END #else /* gcc or icc */ # define ALIGN16_BEG # define ALIGN16_END __attribute__((aligned(16))) #endif /* __m128 is ugly to write */ typedef __m128 v4sf; // vector of 4 float (sse1) #ifdef USE_SSE2 # include typedef __m128i v4si; // vector of 4 int (sse2) #else typedef __m64 v2si; // vector of 2 int (mmx) #endif /* declare some SSE constants -- why can't I figure a better way to do that? */ #define _PS_CONST(Name, Val) \ static const ALIGN16_BEG float _ps_##Name[4] ALIGN16_END = { Val, Val, Val, Val } #define _PI32_CONST(Name, Val) \ static const ALIGN16_BEG int _pi32_##Name[4] ALIGN16_END = { Val, Val, Val, Val } #define _PS_CONST_TYPE(Name, Type, Val) \ static const ALIGN16_BEG Type _ps_##Name[4] ALIGN16_END = { (Type)Val, (Type)Val, (Type)Val, (Type)Val } _PS_CONST(1 , 1.0f); _PS_CONST(0p5, 0.5f); /* the smallest non denormalized float number */ _PS_CONST_TYPE(min_norm_pos, int, 0x00800000); _PS_CONST_TYPE(mant_mask, int, 0x7f800000); _PS_CONST_TYPE(inv_mant_mask, int, ~0x7f800000); _PS_CONST_TYPE(sign_mask, int, 0x80000000); _PS_CONST_TYPE(inv_sign_mask, int, ~0x80000000); _PI32_CONST(1, 1); _PI32_CONST(inv1, ~1); _PI32_CONST(2, 2); _PI32_CONST(4, 4); _PI32_CONST(0x7f, 0x7f); _PS_CONST(cephes_SQRTHF, 0.707106781186547524); _PS_CONST(cephes_log_p0, 7.0376836292E-2); _PS_CONST(cephes_log_p1, - 1.1514610310E-1); _PS_CONST(cephes_log_p2, 1.1676998740E-1); _PS_CONST(cephes_log_p3, - 1.2420140846E-1); _PS_CONST(cephes_log_p4, + 1.4249322787E-1); _PS_CONST(cephes_log_p5, - 1.6668057665E-1); _PS_CONST(cephes_log_p6, + 2.0000714765E-1); _PS_CONST(cephes_log_p7, - 2.4999993993E-1); _PS_CONST(cephes_log_p8, + 3.3333331174E-1); _PS_CONST(cephes_log_q1, -2.12194440e-4); _PS_CONST(cephes_log_q2, 0.693359375); #if defined (__MINGW32__) /* the ugly part below: many versions of gcc used to be completely buggy with respect to some intrinsics The movehl_ps is fixed in mingw 3.4.5, but I found out that all the _mm_cmp* intrinsics were completely broken on my mingw gcc 3.4.5 ... Note that the bug on _mm_cmp* does occur only at -O0 optimization level */ inline __m128 my_movehl_ps(__m128 a, const __m128 b) { asm ( "movhlps %2,%0\n\t" : "=x" (a) : "0" (a), "x"(b) ); return a; } #warning "redefined _mm_movehl_ps (see gcc bug 21179)" #define _mm_movehl_ps my_movehl_ps inline __m128 my_cmplt_ps(__m128 a, const __m128 b) { asm ( "cmpltps %2,%0\n\t" : "=x" (a) : "0" (a), "x"(b) ); return a; } inline __m128 my_cmpgt_ps(__m128 a, const __m128 b) { asm ( "cmpnleps %2,%0\n\t" : "=x" (a) : "0" (a), "x"(b) ); return a; } inline __m128 my_cmpeq_ps(__m128 a, const __m128 b) { asm ( "cmpeqps %2,%0\n\t" : "=x" (a) : "0" (a), "x"(b) ); return a; } #warning "redefined _mm_cmpxx_ps functions..." #define _mm_cmplt_ps my_cmplt_ps #define _mm_cmpgt_ps my_cmpgt_ps #define _mm_cmpeq_ps my_cmpeq_ps #endif #ifndef USE_SSE2 typedef union xmm_mm_union { __m128 xmm; __m64 mm[2]; } xmm_mm_union; #define COPY_XMM_TO_MM(xmm_, mm0_, mm1_) { \ xmm_mm_union u; u.xmm = xmm_; \ mm0_ = u.mm[0]; \ mm1_ = u.mm[1]; \ } #define COPY_MM_TO_XMM(mm0_, mm1_, xmm_) { \ xmm_mm_union u; u.mm[0]=mm0_; u.mm[1]=mm1_; xmm_ = u.xmm; \ } #endif // USE_SSE2 /* natural logarithm computed for 4 simultaneous float return NaN for x <= 0 */ v4sf log_ps(v4sf x) { #ifdef USE_SSE2 v4si emm0; #else v2si mm0, mm1; #endif v4sf one = *(v4sf*)_ps_1; v4sf invalid_mask = _mm_cmple_ps(x, _mm_setzero_ps()); x = _mm_max_ps(x, *(v4sf*)_ps_min_norm_pos); /* cut off denormalized stuff */ #ifndef USE_SSE2 /* part 1: x = frexpf(x, &e); */ COPY_XMM_TO_MM(x, mm0, mm1); mm0 = _mm_srli_pi32(mm0, 23); mm1 = _mm_srli_pi32(mm1, 23); #else emm0 = _mm_srli_epi32(_mm_castps_si128(x), 23); #endif /* keep only the fractional part */ x = _mm_and_ps(x, *(v4sf*)_ps_inv_mant_mask); x = _mm_or_ps(x, *(v4sf*)_ps_0p5); #ifndef USE_SSE2 /* now e=mm0:mm1 contain the really base-2 exponent */ mm0 = _mm_sub_pi32(mm0, *(v2si*)_pi32_0x7f); mm1 = _mm_sub_pi32(mm1, *(v2si*)_pi32_0x7f); v4sf e = _mm_cvtpi32x2_ps(mm0, mm1); _mm_empty(); /* bye bye mmx */ #else emm0 = _mm_sub_epi32(emm0, *(v4si*)_pi32_0x7f); v4sf e = _mm_cvtepi32_ps(emm0); #endif e = _mm_add_ps(e, one); /* part2: if( x < SQRTHF ) { e -= 1; x = x + x - 1.0; } else { x = x - 1.0; } */ v4sf mask = _mm_cmplt_ps(x, *(v4sf*)_ps_cephes_SQRTHF); v4sf tmp = _mm_and_ps(x, mask); x = _mm_sub_ps(x, one); e = _mm_sub_ps(e, _mm_and_ps(one, mask)); x = _mm_add_ps(x, tmp); v4sf z = _mm_mul_ps(x,x); v4sf y = *(v4sf*)_ps_cephes_log_p0; y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p1); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p2); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p3); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p4); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p5); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p6); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p7); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_log_p8); y = _mm_mul_ps(y, x); y = _mm_mul_ps(y, z); tmp = _mm_mul_ps(e, *(v4sf*)_ps_cephes_log_q1); y = _mm_add_ps(y, tmp); tmp = _mm_mul_ps(z, *(v4sf*)_ps_0p5); y = _mm_sub_ps(y, tmp); tmp = _mm_mul_ps(e, *(v4sf*)_ps_cephes_log_q2); x = _mm_add_ps(x, y); x = _mm_add_ps(x, tmp); x = _mm_or_ps(x, invalid_mask); // negative arg will be NAN return x; } _PS_CONST(exp_hi, 88.3762626647949f); _PS_CONST(exp_lo, -88.3762626647949f); _PS_CONST(cephes_LOG2EF, 1.44269504088896341); _PS_CONST(cephes_exp_C1, 0.693359375); _PS_CONST(cephes_exp_C2, -2.12194440e-4); _PS_CONST(cephes_exp_p0, 1.9875691500E-4); _PS_CONST(cephes_exp_p1, 1.3981999507E-3); _PS_CONST(cephes_exp_p2, 8.3334519073E-3); _PS_CONST(cephes_exp_p3, 4.1665795894E-2); _PS_CONST(cephes_exp_p4, 1.6666665459E-1); _PS_CONST(cephes_exp_p5, 5.0000001201E-1); v4sf exp_ps(v4sf x) { v4sf tmp = _mm_setzero_ps(), fx; #ifdef USE_SSE2 v4si emm0; #else v2si mm0, mm1; #endif v4sf one = *(v4sf*)_ps_1; x = _mm_min_ps(x, *(v4sf*)_ps_exp_hi); x = _mm_max_ps(x, *(v4sf*)_ps_exp_lo); /* express exp(x) as exp(g + n*log(2)) */ fx = _mm_mul_ps(x, *(v4sf*)_ps_cephes_LOG2EF); fx = _mm_add_ps(fx, *(v4sf*)_ps_0p5); /* how to perform a floorf with SSE: just below */ #ifndef USE_SSE2 /* step 1 : cast to int */ tmp = _mm_movehl_ps(tmp, fx); mm0 = _mm_cvttps_pi32(fx); mm1 = _mm_cvttps_pi32(tmp); /* step 2 : cast back to float */ tmp = _mm_cvtpi32x2_ps(mm0, mm1); #else emm0 = _mm_cvttps_epi32(fx); tmp = _mm_cvtepi32_ps(emm0); #endif /* if greater, substract 1 */ v4sf mask = _mm_cmpgt_ps(tmp, fx); mask = _mm_and_ps(mask, one); fx = _mm_sub_ps(tmp, mask); tmp = _mm_mul_ps(fx, *(v4sf*)_ps_cephes_exp_C1); v4sf z = _mm_mul_ps(fx, *(v4sf*)_ps_cephes_exp_C2); x = _mm_sub_ps(x, tmp); x = _mm_sub_ps(x, z); z = _mm_mul_ps(x,x); v4sf y = *(v4sf*)_ps_cephes_exp_p0; y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_exp_p1); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_exp_p2); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_exp_p3); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_exp_p4); y = _mm_mul_ps(y, x); y = _mm_add_ps(y, *(v4sf*)_ps_cephes_exp_p5); y = _mm_mul_ps(y, z); y = _mm_add_ps(y, x); y = _mm_add_ps(y, one); /* build 2^n */ #ifndef USE_SSE2 z = _mm_movehl_ps(z, fx); mm0 = _mm_cvttps_pi32(fx); mm1 = _mm_cvttps_pi32(z); mm0 = _mm_add_pi32(mm0, *(v2si*)_pi32_0x7f); mm1 = _mm_add_pi32(mm1, *(v2si*)_pi32_0x7f); mm0 = _mm_slli_pi32(mm0, 23); mm1 = _mm_slli_pi32(mm1, 23); v4sf pow2n; COPY_MM_TO_XMM(mm0, mm1, pow2n); _mm_empty(); #else emm0 = _mm_cvttps_epi32(fx); emm0 = _mm_add_epi32(emm0, *(v4si*)_pi32_0x7f); emm0 = _mm_slli_epi32(emm0, 23); v4sf pow2n = _mm_castsi128_ps(emm0); #endif y = _mm_mul_ps(y, pow2n); return y; } _PS_CONST(minus_cephes_DP1, -0.78515625); _PS_CONST(minus_cephes_DP2, -2.4187564849853515625e-4); _PS_CONST(minus_cephes_DP3, -3.77489497744594108e-8); _PS_CONST(sincof_p0, -1.9515295891E-4); _PS_CONST(sincof_p1, 8.3321608736E-3); _PS_CONST(sincof_p2, -1.6666654611E-1); _PS_CONST(coscof_p0, 2.443315711809948E-005); _PS_CONST(coscof_p1, -1.388731625493765E-003); _PS_CONST(coscof_p2, 4.166664568298827E-002); _PS_CONST(cephes_FOPI, 1.27323954473516); // 4 / M_PI /* evaluation of 4 sines at onces, using only SSE1+MMX intrinsics so it runs also on old athlons XPs and the pentium III of your grand mother. The code is the exact rewriting of the cephes sinf function. Precision is excellent as long as x < 8192 (I did not bother to take into account the special handling they have for greater values -- it does not return garbage for arguments over 8192, though, but the extra precision is missing). Note that it is such that sinf((float)M_PI) = 8.74e-8, which is the surprising but correct result. Performance is also surprisingly good, 1.33 times faster than the macos vsinf SSE2 function, and 1.5 times faster than the __vrs4_sinf of amd's ACML (which is only available in 64 bits). Not too bad for an SSE1 function (with no special tuning) ! However the latter libraries probably have a much better handling of NaN, Inf, denormalized and other special arguments.. On my core 1 duo, the execution of this function takes approximately 95 cycles. From what I have observed on the experiments with Intel AMath lib, switching to an SSE2 version would improve the perf by only 10%. Since it is based on SSE intrinsics, it has to be compiled at -O2 to deliver full speed. */ v4sf sin_ps(v4sf x) { // any x v4sf xmm1, xmm2 = _mm_setzero_ps(), xmm3, sign_bit, y; #ifdef USE_SSE2 v4si emm0, emm2; #else v2si mm0, mm1, mm2, mm3; #endif sign_bit = x; /* take the absolute value */ x = _mm_and_ps(x, *(v4sf*)_ps_inv_sign_mask); /* extract the sign bit (upper one) */ sign_bit = _mm_and_ps(sign_bit, *(v4sf*)_ps_sign_mask); /* scale by 4/Pi */ y = _mm_mul_ps(x, *(v4sf*)_ps_cephes_FOPI); //printf("plop:"); print4(y); #ifdef USE_SSE2 /* store the integer part of y in mm0 */ emm2 = _mm_cvttps_epi32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = _mm_add_epi32(emm2, *(v4si*)_pi32_1); emm2 = _mm_and_si128(emm2, *(v4si*)_pi32_inv1); y = _mm_cvtepi32_ps(emm2); /* get the swap sign flag */ emm0 = _mm_and_si128(emm2, *(v4si*)_pi32_4); emm0 = _mm_slli_epi32(emm0, 29); /* get the polynom selection mask there is one polynom for 0 <= x <= Pi/4 and another one for Pi/4 #endif #include #include using std::cerr; using std::endl; namespace breakfastquay { #ifdef HAVE_IPP template <> float *allocate(size_t count) { if (count > INT_MAX) { #ifndef NO_EXCEPTIONS throw std::length_error("Size overflow in allocate"); #else abort(); #endif } float *ptr = ippsMalloc_32f(int(count)); if (!ptr) { #ifndef NO_EXCEPTIONS throw (std::bad_alloc()); #else abort(); #endif } return ptr; } template <> double *allocate(size_t count) { if (count > INT_MAX) { #ifndef NO_EXCEPTIONS throw std::length_error("Size overflow in allocate"); #else abort(); #endif } double *ptr = ippsMalloc_64f(int(count)); if (!ptr) { #ifndef NO_EXCEPTIONS throw (std::bad_alloc()); #else abort(); #endif } return ptr; } template <> void deallocate(float *ptr) { if (ptr) ippsFree((void *)ptr); } template <> void deallocate(double *ptr) { if (ptr) ippsFree((void *)ptr); } #endif } sonic-visualiser-3.0.3/bqvec/src/Barrier.cpp0000644000000000000000000000417413111512442017123 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2017 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Barrier.h" #if defined __APPLE__ #include #endif #if defined _WIN32 && defined _MSC_VER #include #endif namespace breakfastquay { void system_memorybarrier() { #if defined __APPLE__ OSMemoryBarrier(); #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) __sync_synchronize(); #elif defined _WIN32 #if defined _MSC_VER MemoryBarrier(); #else /* (mingw) */ LONG Barrier = 0; __asm__ __volatile__("xchgl %%eax,%0 " : "=r" (Barrier)); #endif #else #warning "No memory barrier defined" #endif } } sonic-visualiser-3.0.3/bqvec/src/VectorOpsComplex.cpp0000644000000000000000000002355313111512442021013 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* bqvec A small library for vector arithmetic and allocation in C++ using raw C pointer arrays. Copyright 2007-2016 Particular Programs Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of Chris Cannam and Particular Programs Ltd shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "VectorOpsComplex.h" #include #if defined USE_POMMIER_MATHFUN #if defined __ARMEL__ #include "pommier/neon_mathfun.h" #else #include "pommier/sse_mathfun.h" #endif #endif #if defined(_MSC_VER) || defined(WIN32) #include #ifndef alloca #define alloca _alloca #endif #else #include #endif #include using namespace std; namespace breakfastquay { #ifdef USE_APPROXIMATE_ATAN2 float approximate_atan2f(float real, float imag) { static const float pi = M_PI; static const float pi2 = M_PI / 2; float atan; if (real == 0.f) { if (imag > 0.0f) atan = pi2; else if (imag == 0.0f) atan = 0.0f; else atan = -pi2; } else { float z = imag/real; if (fabsf(z) < 1.f) { atan = z / (1.f + 0.28f * z * z); if (real < 0.f) { if (imag < 0.f) atan -= pi; else atan += pi; } } else { atan = pi2 - z / (z * z + 0.28f); if (imag < 0.f) atan -= pi; } } return atan; } #endif #if defined USE_POMMIER_MATHFUN #ifdef __ARMEL__ typedef union { float f[4]; int i[4]; v4sf v; } V4SF; #else typedef ALIGN16_BEG union { float f[4]; int i[4]; v4sf v; } ALIGN16_END V4SF; #endif void v_polar_to_cartesian_pommier(float *const BQ_R__ real, float *const BQ_R__ imag, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count) { int idx = 0, tidx = 0; int i = 0; for (int i = 0; i + 4 < count; i += 4) { V4SF fmag, fphase, fre, fim; for (int j = 0; j < 3; ++j) { fmag.f[j] = mag[idx]; fphase.f[j] = phase[idx++]; } sincos_ps(fphase.v, &fim.v, &fre.v); for (int j = 0; j < 3; ++j) { real[tidx] = fre.f[j] * fmag.f[j]; imag[tidx++] = fim.f[j] * fmag.f[j]; } } while (i < count) { float re, im; c_phasor(&re, &im, phase[i]); real[tidx] = re * mag[i]; imag[tidx++] = im * mag[i]; ++i; } } void v_polar_interleaved_to_cartesian_inplace_pommier(float *const BQ_R__ srcdst, const int count) { int i; int idx = 0, tidx = 0; for (i = 0; i + 4 < count; i += 4) { V4SF fmag, fphase, fre, fim; for (int j = 0; j < 3; ++j) { fmag.f[j] = srcdst[idx++]; fphase.f[j] = srcdst[idx++]; } sincos_ps(fphase.v, &fim.v, &fre.v); for (int j = 0; j < 3; ++j) { srcdst[tidx++] = fre.f[j] * fmag.f[j]; srcdst[tidx++] = fim.f[j] * fmag.f[j]; } } while (i < count) { float real, imag; float mag = srcdst[idx++]; float phase = srcdst[idx++]; c_phasor(&real, &imag, phase); srcdst[tidx++] = real * mag; srcdst[tidx++] = imag * mag; ++i; } } void v_polar_to_cartesian_interleaved_pommier(float *const BQ_R__ dst, const float *const BQ_R__ mag, const float *const BQ_R__ phase, const int count) { int i; int idx = 0, tidx = 0; for (i = 0; i + 4 <= count; i += 4) { V4SF fmag, fphase, fre, fim; for (int j = 0; j < 3; ++j) { fmag.f[j] = mag[idx]; fphase.f[j] = phase[idx]; ++idx; } sincos_ps(fphase.v, &fim.v, &fre.v); for (int j = 0; j < 3; ++j) { dst[tidx++] = fre.f[j] * fmag.f[j]; dst[tidx++] = fim.f[j] * fmag.f[j]; } } while (i < count) { float real, imag; c_phasor(&real, &imag, phase[i]); dst[tidx++] = real * mag[i]; dst[tidx++] = imag * mag[i]; ++i; } } #endif #ifndef NO_COMPLEX_TYPES void v_polar_to_cartesian(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ mag, const bq_complex_element_t *const BQ_R__ phase, const int count) { if (sizeof(bq_complex_element_t) == sizeof(float)) { v_polar_to_cartesian_interleaved((float *)dst, (const float *)mag, (const float *)phase, count); } else { v_polar_to_cartesian_interleaved((double *)dst, (const double *)mag, (const double *)phase, count); } } void v_cartesian_to_polar(bq_complex_element_t *const BQ_R__ mag, bq_complex_element_t *const BQ_R__ phase, const bq_complex_t *const BQ_R__ src, const int count) { if (sizeof(bq_complex_element_t) == sizeof(float)) { v_cartesian_interleaved_to_polar((float *)mag, (float *)phase, (const float *)src, count); } else { v_cartesian_interleaved_to_polar((double *)mag, (double *)phase, (const double *)src, count); } } void v_cartesian_to_magnitudes(bq_complex_element_t *const BQ_R__ mag, const bq_complex_t *const BQ_R__ src, const int count) { if (sizeof(bq_complex_element_t) == sizeof(float)) { v_cartesian_interleaved_to_magnitudes((float *)mag, (const float *)src, count); } else { v_cartesian_interleaved_to_magnitudes((double *)mag, (const double *)src, count); } } #if defined USE_POMMIER_MATHFUN //!!! further tests reqd. This is only single precision but it seems //!!! to be much faster than normal math library sincos. The comments //!!! note that precision suffers for high arguments to sincos though, //!!! and that is probably a common case for us void v_polar_interleaved_to_cartesian(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ src, const int count) { int idx = 0, tidx = 0; for (int i = 0; i < count; i += 4) { V4SF fmag, fphase, fre, fim; for (int j = 0; j < 3; ++j) { fmag.f[j] = src[idx++]; fphase.f[j] = src[idx++]; } sincos_ps(fphase.v, &fim.v, &fre.v); for (int j = 0; j < 3; ++j) { dst[tidx].re = fre.f[j] * fmag.f[j]; dst[tidx++].im = fim.f[j] * fmag.f[j]; } } } #elif (defined HAVE_IPP || defined HAVE_VDSP) // with a vector library, it should be faster to deinterleave and call // the basic fn void v_polar_interleaved_to_cartesian(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ src, const int count) { bq_complex_element_t *mag = (bq_complex_element_t *) alloca(count * sizeof(bq_complex_element_t)); bq_complex_element_t *phase = (bq_complex_element_t *) alloca(count * sizeof(bq_complex_element_t)); bq_complex_element_t *magphase[] = { mag, phase }; v_deinterleave(magphase, src, 2, count); v_polar_to_cartesian(dst, mag, phase, count); } #else // without a vector library, better avoid the deinterleave step void v_polar_interleaved_to_cartesian(bq_complex_t *const BQ_R__ dst, const bq_complex_element_t *const BQ_R__ src, const int count) { bq_complex_element_t mag, phase; int idx = 0; for (int i = 0; i < count; ++i) { mag = src[idx++]; phase = src[idx++]; dst[i] = c_phasor(phase); dst[i].re *= mag; dst[i].im *= mag; } } #endif void v_polar_interleaved_to_cartesian_inplace(bq_complex_element_t *const BQ_R__ srcdst, const int count) { bq_complex_element_t mag, phase; int ii = 0, io = 0; for (int i = 0; i < count; ++i) { mag = srcdst[ii++]; phase = srcdst[ii++]; bq_complex_t p = c_phasor(phase); srcdst[io++] = mag * p.re; srcdst[io++] = mag * p.im; } } #endif // NO_COMPLEX_TYPES } sonic-visualiser-3.0.3/bqvec/test/TestAllocators.cpp0000644000000000000000000000352313111512442020665 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "bqvec/VectorOps.h" #include "bqvec/Allocators.h" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include #include #include using namespace breakfastquay; BOOST_AUTO_TEST_SUITE(TestAllocators) #define COMPARE_ARRAY(a, b) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \ } #define COMPARE_N(a, b, n) \ for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \ } BOOST_AUTO_TEST_CASE(alloc_dealloc) { double *v = allocate(4); v[0] = 0.1; v[1] = 2.0; v[2] = -0.3; v[3] = 4.0; double *e = allocate(4); e[0] = -0.3; e[1] = 4.0; e[2] = 0.1; e[3] = 2.0; v_fftshift(v, 4); COMPARE_N(v, e, 4); deallocate(v); deallocate(e); } BOOST_AUTO_TEST_CASE(alloc_zero) { double *v = allocate_and_zero(4); BOOST_CHECK_EQUAL(v[0], 0.f); BOOST_CHECK_EQUAL(v[1], 0.f); BOOST_CHECK_EQUAL(v[2], 0.f); BOOST_CHECK_EQUAL(v[3], 0.f); deallocate(v); } BOOST_AUTO_TEST_CASE(alloc_dealloc_channels) { double **v = allocate_channels(2, 4); v[0][0] = 0.1; v[0][1] = 2.0; v[0][2] = -0.3; v[0][3] = 4.0; v[1][0] = -0.3; v[1][1] = 4.0; v[1][2] = 0.1; v[1][3] = 2.0; v_fftshift(v[0], 4); COMPARE_N(v[0], v[1], 4); deallocate_channels(v, 2); } BOOST_AUTO_TEST_CASE(stl) { std::vector > v; v.push_back(0.1); v.push_back(2.0); v.push_back(-0.3); v.push_back(4.0); double e[] = { -0.3, 4.0, 0.1, 2.0 }; v_fftshift(v.data(), 4); COMPARE_N(v.data(), e, 4); } BOOST_AUTO_TEST_SUITE_END() sonic-visualiser-3.0.3/bqvec/test/TestVectorOps.cpp0000644000000000000000000003063313111512442020510 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "bqvec/VectorOps.h" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include #include #include using namespace breakfastquay; BOOST_AUTO_TEST_SUITE(TestVectorOps) #define COMPARE_ARRAY(a, b) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \ } #define COMPARE_N(a, b, n) \ for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \ } BOOST_AUTO_TEST_CASE(add) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double expected[] = { 0.0, 5.0, -1.5 }; v_add(a, b, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(add_with_gain) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double expected[] = { -0.5, 6.5, -3.75 }; v_add_with_gain(a, b, 1.5, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(subtract) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double expected[] = { 2.0, -1.0, 7.5 }; v_subtract(a, b, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(increment) { double a[] = { -1.0, 3.0, -4.5 }; double incr = -0.5; double expected[] = { -1.5, 2.5, -5.0 }; v_increment(a, incr, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(scale) { double a[] = { -1.0, 3.0, -4.5 }; double scale = -0.5; double expected[] = { 0.5, -1.5, 2.25 }; v_scale(a, scale, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(multiply) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double expected[] = { -1.0, 6.0, -13.5 }; v_multiply(a, b, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(multiply_to) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double o[3]; double expected[] = { -1.0, 6.0, -13.5 }; v_multiply_to(o, a, b, 3); COMPARE_N(o, expected, 3); } BOOST_AUTO_TEST_CASE(multiply_and_add) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double c[] = { 3.0, -1.0, 4.0 }; double expected[] = { 2.0, 5.0, -9.5 }; v_multiply_and_add(c, a, b, 3); COMPARE_N(c, expected, 3); } BOOST_AUTO_TEST_CASE(divide) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { -1.0, 3.0, -4.5 }; double expected[] = { -1.0, 2.0/3.0, 3.0/-4.5 }; v_divide(a, b, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(sum) { double a[] = { 1.0, 2.0, -3.5 }; double s = v_sum(a, 3); BOOST_CHECK_EQUAL(s, -0.5); } BOOST_AUTO_TEST_CASE(multiply_and_sum) { double a[] = { 2.0, 0.0, -1.5 }; double b[] = { 3.0, 4.0, 5.0 }; double s = v_multiply_and_sum(a, b, 3); BOOST_CHECK_EQUAL(s, -1.5); } BOOST_AUTO_TEST_CASE(log) { double a[] = { 1.0, 1.0 / M_E, M_E }; double expected[] = { 0.0, -1.0, 1.0 }; v_log(a, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(exp) { double a[] = { 0.0, -1.0, 2.0 }; double expected[] = { 1.0, 1.0 / M_E, M_E * M_E }; v_exp(a, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(sqrt) { double a[] = { 0.0, 1.0, 4.0 }; double expected[] = { 0.0, 1.0, 2.0 }; v_sqrt(a, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(square) { double a[] = { 0.0, 1.5, -2.0 }; double expected[] = { 0.0, 2.25, 4.0 }; v_square(a, 3); COMPARE_N(a, expected, 3); } BOOST_AUTO_TEST_CASE(abs) { double a[] = { -1.9, 0.0, 0.01, -0.0 }; double expected[] = { 1.9, 0.0, 0.01, 0.0 }; v_abs(a, 4); COMPARE_N(a, expected, 4); } BOOST_AUTO_TEST_CASE(mean) { double a[] = { -1.0, 1.6, 3.0 }; double s = v_mean(a, 3); BOOST_CHECK_EQUAL(s, 1.2); } BOOST_AUTO_TEST_CASE(interleave_1) { double a[] = { 1.0, 2.0, 3.0 }; double *ch[] = { a }; double o[3]; double expected[] = { 1.0, 2.0, 3.0 }; v_interleave(o, ch, 1, 3); COMPARE_N(o, expected, 3); } BOOST_AUTO_TEST_CASE(interleave_2) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { 4.0, 5.0, 6.0 }; double *ch[] = { a, b }; double o[6]; double expected[] = { 1.0, 4.0, 2.0, 5.0, 3.0, 6.0 }; v_interleave(o, ch, 2, 3); COMPARE_N(o, expected, 6); } BOOST_AUTO_TEST_CASE(interleave_3) { double a[] = { 1.0, 2.0 }; double b[] = { 3.0, 4.0 }; double c[] = { 5.0, 6.0 }; double *ch[] = { a, b, c }; double o[6]; double expected[] = { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 }; v_interleave(o, ch, 3, 2); COMPARE_N(o, expected, 6); } BOOST_AUTO_TEST_CASE(deinterleave_1) { double a[] = { 1.0, 2.0, 3.0 }; double o[3]; double *oo[] = { o }; double *expected[] = { a }; v_deinterleave(oo, a, 1, 3); COMPARE_N(oo[0], expected[0], 3); } BOOST_AUTO_TEST_CASE(deinterleave_2) { double a[] = { 1.0, 4.0, 2.0, 5.0, 3.0, 6.0 }; double o1[3], o2[3]; double *oo[] = { o1, o2 }; double e1[] = { 1.0, 2.0, 3.0 }, e2[] = { 4.0, 5.0, 6.0 }; double *expected[] = { e1, e2 }; v_deinterleave(oo, a, 2, 3); COMPARE_N(oo[0], expected[0], 3); COMPARE_N(oo[1], expected[1], 3); } BOOST_AUTO_TEST_CASE(deinterleave_3) { double a[] = { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 }; double o1[2], o2[2], o3[2]; double *oo[] = { o1, o2, o3 }; double e1[] = { 1.0, 2.0 }, e2[] = { 3.0, 4.0 }, e3[] = { 5.0, 6.0 }; double *expected[] = { e1, e2, e3 }; v_deinterleave(oo, a, 3, 2); COMPARE_N(oo[0], expected[0], 2); COMPARE_N(oo[1], expected[1], 2); COMPARE_N(oo[2], expected[2], 2); } BOOST_AUTO_TEST_CASE(mix_1) { double a[] = { 1.0, 2.0, 3.0 }; double *ch[] = { a }; double o[3]; double expected[] = { 1.0, 2.0, 3.0 }; v_mix(o, ch, 1, 3); COMPARE_N(o, expected, 3); } BOOST_AUTO_TEST_CASE(mix_2) { double a[] = { 1.0, 2.0, 3.0 }; double b[] = { 4.0, 5.0, 6.0 }; double *ch[] = { a, b }; double o[6]; double expected[] = { 2.5, 3.5, 4.5 }; v_mix(o, ch, 2, 3); COMPARE_N(o, expected, 3); } BOOST_AUTO_TEST_CASE(mix_3) { double a[] = { 1.0, 2.0 }; double b[] = { 3.0, 4.0 }; double c[] = { 5.0, 6.0 }; double *ch[] = { a, b, c }; double o[6]; double expected[] = { 3.0, 4.0 }; v_mix(o, ch, 3, 2); COMPARE_N(o, expected, 2); } BOOST_AUTO_TEST_CASE(reconfigure_1_2) { double a[] = { 1.0, 2.0, 3.0 }; double *aa[] = { a }; double o1[3], o2[3]; double *oo[] = { o1, o2 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 1.0, 2.0, 3.0 }; double *expected[] = { e1, e2 }; v_reconfigure_channels(oo, 2, aa, 1, 3); COMPARE_N(oo[0], expected[0], 3); COMPARE_N(oo[1], expected[1], 3); } BOOST_AUTO_TEST_CASE(reconfigure_2_1) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double *aa[] = { a1, a2 }; double o1[3]; double *oo[] = { o1 }; double e1[] = { 2.5, 3.5, 4.5 }; double *expected[] = { e1 }; v_reconfigure_channels(oo, 1, aa, 2, 3); COMPARE_N(oo[0], expected[0], 3); } BOOST_AUTO_TEST_CASE(reconfigure_3_1) { double a1[] = { 1.0, 2.0 }; double a2[] = { 3.0, 4.0 }; double a3[] = { 5.0, 6.0 }; double *aa[] = { a1, a2, a3 }; double o1[2]; double *oo[] = { o1 }; double e1[] = { 3.0, 4.0 }; double *expected[] = { e1 }; v_reconfigure_channels(oo, 1, aa, 3, 2); COMPARE_N(oo[0], expected[0], 2); } BOOST_AUTO_TEST_CASE(reconfigure_1_3) { double a[] = { 1.0, 2.0, 3.0 }; double *aa[] = { a }; double o1[3], o2[3], o3[3]; double *oo[] = { o1, o2, o3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 1.0, 2.0, 3.0 }; double e3[] = { 1.0, 2.0, 3.0 }; double *expected[] = { e1, e2, e3 }; v_reconfigure_channels(oo, 3, aa, 1, 3); COMPARE_N(oo[0], expected[0], 3); COMPARE_N(oo[1], expected[1], 3); COMPARE_N(oo[2], expected[2], 3); } BOOST_AUTO_TEST_CASE(reconfigure_2_3) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double *aa[] = { a1, a2 }; double o1[3], o2[3], o3[3]; double *oo[] = { o1, o2, o3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 4.0, 5.0, 6.0 }; double e3[] = { 0.0, 0.0, 0.0 }; double *expected[] = { e1, e2, e3 }; v_reconfigure_channels(oo, 3, aa, 2, 3); COMPARE_N(oo[0], expected[0], 3); COMPARE_N(oo[1], expected[1], 3); COMPARE_N(oo[2], expected[2], 3); } BOOST_AUTO_TEST_CASE(reconfigure_3_2) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double a3[] = { 7.0, 8.0, 9.0 }; double *aa[] = { a1, a2, a3 }; double o1[3], o2[3]; double *oo[] = { o1, o2 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 4.0, 5.0, 6.0 }; double *expected[] = { e1, e2 }; v_reconfigure_channels(oo, 2, aa, 3, 3); COMPARE_N(oo[0], expected[0], 3); COMPARE_N(oo[1], expected[1], 3); } BOOST_AUTO_TEST_CASE(reconfigure_3_3) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double a3[] = { 7.0, 8.0, 9.0 }; double *aa[] = { a1, a2, a3 }; double o1[3], o2[3], o3[3]; double *oo[] = { o1, o2, o3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 4.0, 5.0, 6.0 }; double e3[] = { 7.0, 8.0, 9.0 }; double *expected[] = { e1, e2, e3 }; v_reconfigure_channels(oo, 3, aa, 3, 3); COMPARE_N(oo[0], expected[0], 3); COMPARE_N(oo[1], expected[1], 3); COMPARE_N(oo[2], expected[2], 3); } BOOST_AUTO_TEST_CASE(reconfigure_1_2_inplace) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[3]; double *aa[] = { a1, a2 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 1.0, 2.0, 3.0 }; double *expected[] = { e1, e2 }; v_reconfigure_channels_inplace(aa, 2, 1, 3); COMPARE_N(aa[0], expected[0], 3); COMPARE_N(aa[1], expected[1], 3); } BOOST_AUTO_TEST_CASE(reconfigure_2_1_inplace) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double *aa[] = { a1, a2 }; double e1[] = { 2.5, 3.5, 4.5 }; double *expected[] = { e1 }; v_reconfigure_channels_inplace(aa, 1, 2, 3); COMPARE_N(aa[0], expected[0], 3); } BOOST_AUTO_TEST_CASE(reconfigure_3_1_inplace) { double a1[] = { 1.0, 2.0 }; double a2[] = { 3.0, 4.0 }; double a3[] = { 5.0, 6.0 }; double *aa[] = { a1, a2, a3 }; double e1[] = { 3.0, 4.0 }; double *expected[] = { e1 }; v_reconfigure_channels_inplace(aa, 1, 3, 2); COMPARE_N(aa[0], expected[0], 2); } BOOST_AUTO_TEST_CASE(reconfigure_1_3_inplace) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[3], a3[3]; double *aa[] = { a1, a2, a3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 1.0, 2.0, 3.0 }; double e3[] = { 1.0, 2.0, 3.0 }; double *expected[] = { e1, e2, e3 }; v_reconfigure_channels_inplace(aa, 3, 1, 3); COMPARE_N(aa[0], expected[0], 3); COMPARE_N(aa[1], expected[1], 3); COMPARE_N(aa[2], expected[2], 3); } BOOST_AUTO_TEST_CASE(reconfigure_2_3_inplace) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double a3[3]; double *aa[] = { a1, a2, a3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 4.0, 5.0, 6.0 }; double e3[] = { 0.0, 0.0, 0.0 }; double *expected[] = { e1, e2, e3 }; v_reconfigure_channels_inplace(aa, 3, 2, 3); COMPARE_N(aa[0], expected[0], 3); COMPARE_N(aa[1], expected[1], 3); COMPARE_N(aa[2], expected[2], 3); } BOOST_AUTO_TEST_CASE(reconfigure_3_2_inplace) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double a3[] = { 7.0, 8.0, 9.0 }; double *aa[] = { a1, a2, a3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 4.0, 5.0, 6.0 }; double *expected[] = { e1, e2 }; v_reconfigure_channels_inplace(aa, 2, 3, 3); COMPARE_N(aa[0], expected[0], 3); COMPARE_N(aa[1], expected[1], 3); } BOOST_AUTO_TEST_CASE(reconfigure_3_3_inplace) { double a1[] = { 1.0, 2.0, 3.0 }; double a2[] = { 4.0, 5.0, 6.0 }; double a3[] = { 7.0, 8.0, 9.0 }; double *aa[] = { a1, a2, a3 }; double e1[] = { 1.0, 2.0, 3.0 }; double e2[] = { 4.0, 5.0, 6.0 }; double e3[] = { 7.0, 8.0, 9.0 }; double *expected[] = { e1, e2, e3 }; v_reconfigure_channels_inplace(aa, 3, 3, 3); COMPARE_N(aa[0], expected[0], 3); COMPARE_N(aa[1], expected[1], 3); COMPARE_N(aa[2], expected[2], 3); } BOOST_AUTO_TEST_CASE(fftshift) { double a[] = { 0.1, 2.0, -0.3, 4.0 }; double e[] = { -0.3, 4.0, 0.1, 2.0 }; v_fftshift(a, 4); COMPARE_N(a, e, 4); } BOOST_AUTO_TEST_SUITE_END() sonic-visualiser-3.0.3/bqvec/test/TestVectorOpsComplex.cpp0000644000000000000000000001423313111512442022036 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "bqvec/VectorOpsComplex.h" #include "bqvec/VectorOps.h" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include #include #include #include using namespace breakfastquay; using namespace std; BOOST_AUTO_TEST_SUITE(TestVectorOpsComplex) #ifdef USE_APPROXIMATE_ATAN2 static const double eps = 5.0e-3; #else #ifdef USE_SINGLE_PRECISION_COMPLEX static const double eps = 1.0e-7; #else static const double eps = 1.0e-14; #endif #endif #define COMPARE_N(a, b, n) \ for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], eps); \ } #define COMPARE_NC(a, b, n) \ for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], (bq_complex_element_t) eps); \ } #define COMPARE_CPLX_N(a, b, n) \ for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ BOOST_CHECK_SMALL(a[cmp_i].re - b[cmp_i].re, (bq_complex_element_t) eps); \ BOOST_CHECK_SMALL(a[cmp_i].im - b[cmp_i].im, (bq_complex_element_t) eps); \ } BOOST_AUTO_TEST_CASE(add) { bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; bq_complex_t expected[] = { { 0.0, 5.0 }, { -1.5, -4.0 } }; v_add(a, b, 2); COMPARE_CPLX_N(a, expected, 2); } BOOST_AUTO_TEST_CASE(add_with_gain) { bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; bq_complex_t expected[] = { { -0.5, 6.5 }, { -3.75, -4.0 } }; v_add_with_gain(a, b, (bq_complex_element_t) 1.5, 2); COMPARE_CPLX_N(a, expected, 2); } BOOST_AUTO_TEST_CASE(multiply) { bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; bq_complex_t expected[] = { { -7.0, 1.0 }, { -13.5, 18.0 } }; v_multiply(a, b, 2); COMPARE_CPLX_N(a, expected, 2); } BOOST_AUTO_TEST_CASE(multiply_to) { bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; bq_complex_t o[2]; bq_complex_t expected[] = { { -7.0, 1.0 }, { -13.5, 18.0 } }; v_multiply_to(o, a, b, 2); COMPARE_CPLX_N(o, expected, 2); } BOOST_AUTO_TEST_CASE(cartesian_to_magnitudes_bq) { bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; bq_complex_element_t o[2]; bq_complex_element_t expected[] = { sqrt(5.0), 5.0 }; v_cartesian_to_magnitudes(o, a, 2); COMPARE_NC(o, expected, 2); } BOOST_AUTO_TEST_CASE(cartesian_to_magnitudes) { double re[] = { 1.0, 3.0 }; double im[] = { 2.0, -4.0 }; double o[2]; double expected[] = { sqrt(5.0), 5.0 }; v_cartesian_to_magnitudes(o, re, im, 2); COMPARE_N(o, expected, 2); } BOOST_AUTO_TEST_CASE(cartesian_interleaved_to_magnitudes) { double a[] = { 1.0, 2.0, 3.0, -4.0 }; double o[2]; double expected[] = { sqrt(5.0), 5.0 }; v_cartesian_interleaved_to_magnitudes(o, a, 2); COMPARE_N(o, expected, 2); } BOOST_AUTO_TEST_CASE(cartesian_to_polar_bq) { bq_complex_t a[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; bq_complex_element_t mo[3], po[3]; bq_complex_element_t me[] = { 0.0, sqrt(2.0), 1.0 }; bq_complex_element_t pe[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; v_cartesian_to_polar(mo, po, a, 3); COMPARE_NC(mo, me, 3); COMPARE_NC(po, pe, 3); } BOOST_AUTO_TEST_CASE(cartesian_to_polar_interleaved_bq) { bq_complex_t a[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; bq_complex_element_t o[6]; bq_complex_element_t e[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; v_cartesian_to_polar_interleaved(o, a, 3); COMPARE_NC(o, e, 6); } BOOST_AUTO_TEST_CASE(cartesian_to_polar) { double re[] = { 0.0, 1.0, 0.0 }; double im[] = { 0.0, 1.0, -1.0 }; double mo[3], po[3]; double me[] = { 0.0, sqrt(2.0), 1.0 }; double pe[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; v_cartesian_to_polar(mo, po, re, im, 3); COMPARE_N(mo, me, 3); COMPARE_N(po, pe, 3); } BOOST_AUTO_TEST_CASE(cartesian_to_polar_interleaved_inplace) { double a[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; double e[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; v_cartesian_to_polar_interleaved_inplace(a, 3); COMPARE_N(a, e, 6); } BOOST_AUTO_TEST_CASE(cartesian_interleaved_to_polar) { double a[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; double mo[3], po[3]; double me[] = { 0.0, sqrt(2.0), 1.0 }; double pe[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; v_cartesian_interleaved_to_polar(mo, po, a, 3); COMPARE_N(mo, me, 3); COMPARE_N(po, pe, 3); } BOOST_AUTO_TEST_CASE(polar_to_cartesian_bq) { bq_complex_element_t m[] = { 0.0, sqrt(2.0), 1.0 }; bq_complex_element_t p[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; bq_complex_t o[3]; bq_complex_t e[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; v_polar_to_cartesian(o, m, p, 3); COMPARE_CPLX_N(o, e, 3); } BOOST_AUTO_TEST_CASE(polar_to_cartesian_interleaved_bq) { bq_complex_t a[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; bq_complex_element_t o[6]; bq_complex_element_t e[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; v_cartesian_to_polar_interleaved(o, a, 3); COMPARE_NC(o, e, 6); } BOOST_AUTO_TEST_CASE(polar_to_cartesian) { double m[] = { 0.0, sqrt(2.0), 1.0 }; double p[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; double ro[3], io[3]; double re[] = { 0.0, 1.0, 0.0 }; double ie[] = { 0.0, 1.0, -1.0 }; v_polar_to_cartesian(ro, io, m, p, 3); COMPARE_N(ro, re, 3); COMPARE_N(io, ie, 3); } BOOST_AUTO_TEST_CASE(polar_to_cartesian_interleaved_inplace) { double a[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; double e[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; v_polar_interleaved_to_cartesian_inplace(a, 3); COMPARE_N(a, e, 6); } BOOST_AUTO_TEST_CASE(polar_to_cartesian_interleaved) { double m[] = { 0.0, sqrt(2.0), 1.0 }; double p[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; double o[6]; double e[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; v_polar_to_cartesian_interleaved(o, m, p, 3); COMPARE_N(o, e, 6); } BOOST_AUTO_TEST_SUITE_END() sonic-visualiser-3.0.3/bqvec/test/Timings.cpp0000644000000000000000000001762313111512442017342 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "bqvec/VectorOpsComplex.h" #include #include #include using namespace std; using namespace breakfastquay; //!!! This is nonsense. TODO: Replace it with sense. #ifdef _WIN32 #define drand48() (-1+2*((float)rand())/RAND_MAX) #endif bool testMultiply() { cerr << "testVectorOps: testing v_multiply complex" << endl; const int N = 1024; //!!! todo: use aligned allocate(), otherwise results will vary randomly bq_complex_t target[N]; bq_complex_t src1[N]; bq_complex_t src2[N]; for (int i = 0; i < N; ++i) { src1[i].re = drand48(); src1[i].im = drand48(); src2[i].re = drand48(); src2[i].im = drand48(); } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { bq_complex_t result; c_multiply(result, src1[i], src2[i]); if (i == 0) first = result.re; if (i == N-1) last = result.im; total += result.re; total += result.im; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_multiply_to(target, src1, src2, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = target[i].re; if (i == N-1) last = target[i].im; total += target[i].re; total += target[i].im; } mean = total / (N*2); cerr << "v_multiply: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 50000; // cerr << "Iterations: " << iterations << endl; // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { c_multiply(target[i], src1[i], src2[i]); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_multiply_to(target, src1, src2, N); } end = clock(); cerr << "Time for v_multiply: " << float(end - start)/divisor << endl; return true; } bool testPolarToCart() { cerr << "testVectorOps: testing v_polar_to_cartesian" << endl; const int N = 1024; bq_complex_t target[N]; bq_complex_element_t mag[N]; bq_complex_element_t phase[N]; for (int i = 0; i < N; ++i) { mag[i] = drand48(); phase[i] = (drand48() * M_PI * 2) - M_PI; } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { double real = mag[i] * cos(phase[i]); double imag = mag[i] * sin(phase[i]); if (i == 0) first = real; if (i == N-1) last = imag; total += real; total += imag; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_polar_to_cartesian(target, mag, phase, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = target[i].re; if (i == N-1) last = target[i].im; total += target[i].re; total += target[i].im; } mean = total / (N*2); cerr << "v_polar_to_cartesian: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 10000; // cerr << "Iterations: " << iterations << endl; // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { target[i].re = mag[i] * cos(phase[i]); target[i].im = mag[i] * sin(phase[i]); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_polar_to_cartesian(target, mag, phase, N); } end = clock(); cerr << "Time for v_polar_to_cartesian: " << float(end - start)/divisor << endl; return true; } bool testPolarToCartInterleaved() { cerr << "testVectorOps: testing v_polar_interleaved_to_cartesian" << endl; const int N = 1024; bq_complex_t target[N]; bq_complex_element_t source[N*2]; for (int i = 0; i < N; ++i) { source[i*2] = drand48(); source[i*2+1] = (drand48() * M_PI * 2) - M_PI; } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { double real = source[i*2] * cos(source[i*2+1]); double imag = source[i*2] * sin(source[i*2+1]); if (i == 0) first = real; if (i == N-1) last = imag; total += real; total += imag; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_polar_interleaved_to_cartesian(target, source, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = target[i].re; if (i == N-1) last = target[i].im; total += target[i].re; total += target[i].im; } mean = total / (N*2); cerr << "v_polar_interleaved_to_cartesian: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 10000; // cerr << "Iterations: " << iterations << endl; // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { target[i].re = source[i*2] * cos(source[i*2+1]); target[i].im = source[i*2] * sin(source[i*2+1]); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_polar_interleaved_to_cartesian(target, source, N); } end = clock(); cerr << "Time for v_polar_interleaved_to_cartesian: " << float(end - start)/divisor << endl; return true; } bool testCartToPolar() { cerr << "testVectorOps: testing v_cartesian_to_polar" << endl; const int N = 1024; bq_complex_t source[N]; bq_complex_element_t mag[N]; bq_complex_element_t phase[N]; for (int i = 0; i < N; ++i) { source[i].re = (drand48() * 2.0) - 1.0; source[i].im = (drand48() * 2.0) - 1.0; } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { double mag = sqrt(source[i].re * source[i].re + source[i].im * source[i].im); double phase = atan2(source[i].im, source[i].re); if (i == 0) first = mag; if (i == N-1) last = phase; total += mag; total += phase; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_cartesian_to_polar(mag, phase, source, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = mag[i]; if (i == N-1) last = phase[i]; total += mag[i]; total += phase[i]; } mean = total / (N*2); cerr << "v_cartesian_to_polar: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 10000; // cerr << "Iterations: " << iterations << endl; // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { mag[i] = sqrt(source[i].re * source[i].re + source[i].im * source[i].im); phase[i] = atan2(source[i].im, source[i].re); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_cartesian_to_polar(mag, phase, source, N); } end = clock(); cerr << "Time for v_cartesian_to_polar: " << float(end - start)/divisor << endl; return true; } int main(int, char **) { if (!testMultiply()) return 1; if (!testPolarToCart()) return 1; if (!testPolarToCartInterleaved()) return 1; if (!testCartToPolar()) return 1; return 0; } sonic-visualiser-3.0.3/checker/.hgignore0000644000000000000000000000014013111512442016336 0ustar 00000000000000syntax: glob *~ *.o *.a Makefile* checker-client plugin-checker-helper vamp-plugin-load-checker sonic-visualiser-3.0.3/checker/COPYING0000644000000000000000000000256713111512442015605 0ustar 00000000000000 Copyright (c) 2016 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/checker/README0000644000000000000000000001225313111512442015423 0ustar 00000000000000 [Vamp] Plugin Load Checker ========================== This is a very small command-line program (C++98, no particular dependencies) for testing plugin libraries to see if they are loadable. You run the program, pass it a list of library paths to stdin, it tries to load them, and it reports to stdout whether each load succeeded or not. The program was written for use with Vamp audio analysis plugins, but it also works with other plugin formats. It has some hardcoded knowledge of Vamp, LADSPA, and DSSI plugins but it can be used with any plugins that involve loading DLLs and looking up descriptor functions from them. It comes with a library (C++11, Qt) that searches for candidate plugin files for some known formats in standard locations and runs the checker program as a separate process to check whether they can be loaded. This can be used to scan plugins and blacklist any that might crash a host on load. About the command-line program ------------------------------ The program (vamp-plugin-load-checker) accepts the name of a descriptor symbol as its only command-line argument. It then reads a list of plugin library paths from stdin, one per line. For each path read, it attempts to load that library and retrieve the named descriptor symbol, printing a line to stdout reporting whether this was successful or not and then flushing stdout. The output line format is described below. The program exits with code 0 if all libraries were loaded successfully and non-zero otherwise. Note that library paths must be ready to pass to dlopen() or equivalent; this usually means they should be absolute paths. Output line for successful load of library libname.so: SUCCESS|/path/to/libname.so| Output line for failed load of library libname.so: FAILURE|/path/to/libname.so|Reason for failure if available Although this program was written for use with Vamp audio analysis plugins, it also works with other plugin formats. The program has some hardcoded knowledge of Vamp, LADSPA, and DSSI plugins, but it can be used with any plugins that involve loading DLLs and looking up descriptor functions from them. Sometimes plugins will crash completely on load, bringing down this program with them. If the program exits before all listed plugins have been checked, this means that the plugin following the last reported one has crashed. Typically the caller may want to run it again, omitting that plugin. This program (src/helper.cpp) is written in C++98 and has no particular dependencies apart from the dynamic loader library. About the library ----------------- Two C++ classes are provided for use by a host application: PluginCandidates and KnownPlugins. PluginCandidates knows how to invoke the checker program (if you provide the path to it) and will do so for a set of plugin paths of your request, returning success or failure reports to you. KnownPlugins knows about a limited set of plugin formats (currently Vamp, LADSPA, DSSI) and will use PluginCandidates to test all plugins found in those formats' standard installation directories. These are C++11 classes using the Qt toolkit. How to compile -------------- A Qt project (checker.pro) is provided, which compiles the program and library: $ qmake checker.pro $ make It also builds a program called checker-client which exercises the library by using a KnownPlugins object with the program it just compiled and printing out the results. To compile only the command-line program, you should be able to use a single C++ compiler invocation like: $ c++ -o vamp-plugin-load-checker src/helper.cpp -ldl I expect that most often the program and library will be compiled as part of a larger host application. (They were written for use with Sonic Visualiser.) Copyright and licence --------------------- Written by Chris Cannam at the Centre for Digital Music, Queen Mary University of London. Copyright (c) 2016-2017 Queen Mary, University of London. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/checker/checker-client.pro0000644000000000000000000000050313111512442020140 0ustar 00000000000000 TEMPLATE = app include(checker.pri) # Using the "console" CONFIG flag above should ensure this happens for # normal Windows builds, but this may be necessary when cross-compiling win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle TARGET = checker-client SOURCES += \ src/checker.cpp sonic-visualiser-3.0.3/checker/checker-lib.pro0000644000000000000000000000012313111512442017426 0ustar 00000000000000 TEMPLATE = lib CONFIG += staticlib include(checker.pri) TARGET = checker sonic-visualiser-3.0.3/checker/checker.pri0000644000000000000000000000047613111512442016667 0ustar 00000000000000 CONFIG += qt stl c++11 exceptions console warn_on QT -= xml network gui widgets !win32 { QMAKE_CXXFLAGS += -Werror } OBJECTS_DIR = o MOC_DIR = o INCLUDEPATH += checker HEADERS += \ checker/plugincandidates.h \ checker/knownplugins.h SOURCES += \ src/plugincandidates.cpp \ src/knownplugins.cpp sonic-visualiser-3.0.3/checker/checker.pro0000644000000000000000000000032113111512442016662 0ustar 00000000000000 TEMPLATE = subdirs SUBDIRS = sub_checker_lib sub_checker_client sub_helper sub_checker_lib.file = checker-lib.pro sub_checker_client.file = checker-client.pro sub_helper.file = helper.pro CONFIG += ordered sonic-visualiser-3.0.3/checker/checker/knownplugins.h0000644000000000000000000000624613111512442021063 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Copyright (c) 2016 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef KNOWN_PLUGINS_H #define KNOWN_PLUGINS_H #include "plugincandidates.h" #include #include #include /** * Class to identify and list candidate shared-library files possibly * containing plugins in a hardcoded set of known formats. Uses a * separate process (the "helper", whose executable name must be * provided at construction) to test-load each library in order to * winnow out any that fail to load or crash on load. * * Requires C++11 and the Qt5 QtCore library. */ class KnownPlugins { typedef std::vector stringlist; public: enum PluginType { VampPlugin, LADSPAPlugin, DSSIPlugin }; KnownPlugins(std::string helperExecutableName, PluginCandidates::LogCallback *cb = 0); std::vector getKnownPluginTypes() const { return { VampPlugin, LADSPAPlugin, DSSIPlugin }; }; std::string getTagFor(PluginType type) const { return m_known.at(type).tag; } stringlist getCandidateLibrariesFor(PluginType type) const { return m_candidates.getCandidateLibrariesFor(getTagFor(type)); } std::string getHelperExecutableName() const { return m_helperExecutableName; } std::string getFailureReport() const; private: struct TypeRec { std::string tag; stringlist path; std::string descriptor; }; std::map m_known; stringlist expandConventionalPath(PluginType type, std::string var); std::string getDefaultPath(PluginType type); PluginCandidates m_candidates; std::string m_helperExecutableName; bool is32bit() const; // true if helper looks to be 32-bit on 64-bit system }; #endif sonic-visualiser-3.0.3/checker/checker/plugincandidates.h0000644000000000000000000000743213111512442021641 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Copyright (c) 2016 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PLUGIN_CANDIDATES_H #define PLUGIN_CANDIDATES_H #include #include #include /** * Class to identify and list candidate shared-library files possibly * containing plugins. Uses a separate process (the "helper", whose * executable name must be provided at construction) to test-load each * library in order to winnow out any that fail to load or crash on * load. * * Requires C++11 and the Qt5 QtCore library. */ class PluginCandidates { typedef std::vector stringlist; public: /** Construct a PluginCandidates scanner that uses the given * executable as its load check helper. */ PluginCandidates(std::string helperExecutableName); struct LogCallback { virtual ~LogCallback() { } /// implementation is responsible for adding \n and flushing output virtual void log(std::string) = 0; }; /** Set a callback to be called for log output. */ void setLogCallback(LogCallback *cb); /** Scan the libraries found in the given plugin path (i.e. list * of plugin directories), checking that the given descriptor * symbol can be looked up in each. Store the results * internally, associated with the given (arbitrary) tag, for * later querying using getCandidateLibrariesFor() and * getFailedLibrariesFor(). * * Not thread-safe. */ void scan(std::string tag, stringlist pluginPath, std::string descriptorSymbolName); /** Return list of plugin library paths that were checked * successfully during the scan for the given tag. */ stringlist getCandidateLibrariesFor(std::string tag) const; struct FailureRec { std::string library; std::string message; }; /** Return list of failure reports arising from the prior scan for * the given tag. */ std::vector getFailedLibrariesFor(std::string tag) const; private: std::string m_helper; std::map m_candidates; std::map > m_failures; LogCallback *m_logCallback; stringlist getLibrariesInPath(stringlist path); stringlist runHelper(stringlist libraries, std::string descriptor); void recordResult(std::string tag, stringlist results); void log(std::string); }; #endif sonic-visualiser-3.0.3/checker/helper.pro0000644000000000000000000000072413111512442016544 0ustar 00000000000000 TEMPLATE = app CONFIG += stl c++11 exceptions console warn_on CONFIG -= qt # Using the "console" CONFIG flag above should ensure this happens for # normal Windows builds, but this may be necessary when cross-compiling win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle !win32* { QMAKE_CXXFLAGS += -Werror } linux* { LIBS += -ldl } TARGET = vamp-plugin-load-checker OBJECTS_DIR = o MOC_DIR = o SOURCES += \ src/helper.cpp sonic-visualiser-3.0.3/checker/src/checker.cpp0000644000000000000000000000416113111512442017441 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Copyright (c) 2016 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "knownplugins.h" #include using namespace std; struct LogCallback : PluginCandidates::LogCallback { virtual void log(string message) { cerr << "checker: log: " << message; } }; int main(int, char **) { LogCallback cb; KnownPlugins kp("./vamp-plugin-load-checker", &cb); for (auto t: kp.getKnownPluginTypes()) { cout << "successful libraries for plugin type \"" << kp.getTagFor(t) << "\":" << endl; for (auto lib: kp.getCandidateLibrariesFor(t)) { cout << lib << endl; } } cout << "Failure message (if any):" << endl; cout << kp.getFailureReport() << endl; } sonic-visualiser-3.0.3/checker/src/helper.cpp0000644000000000000000000002061213111512442017313 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /** * [Vamp] Plugin Load Checker * * This program accepts the name of a descriptor symbol as its only * command-line argument. It then reads a list of plugin library paths * from stdin, one per line. For each path read, it attempts to load * that library and retrieve the named descriptor symbol, printing a * line to stdout reporting whether this was successful or not and * then flushing stdout. The output line format is described * below. The program exits with code 0 if all libraries were loaded * successfully and non-zero otherwise. * * Note that library paths must be ready to pass to dlopen() or * equivalent; this usually means they should be absolute paths. * * Output line for successful load of library libname.so: * SUCCESS|/path/to/libname.so| * * Output line for failed load of library libname.so: * FAILURE|/path/to/libname.so|Reason for failure if available * * Although this program was written for use with Vamp audio analysis * plugins, it also works with other plugin formats. The program has * some hardcoded knowledge of Vamp, LADSPA, and DSSI plugins, but it * can be used with any plugins that involve loading DLLs and looking * up descriptor functions from them. * * Sometimes plugins will crash completely on load, bringing down this * program with them. If the program exits before all listed plugins * have been checked, this means that the plugin following the last * reported one has crashed. Typically the caller may want to run it * again, omitting that plugin. */ /* Copyright (c) 2016-2017 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "../version.h" static const char programName[] = "vamp-plugin-load-checker"; #ifdef _WIN32 #include #include #include #ifdef UNICODE static std::string lastLibraryName = ""; static HMODULE LoadLibraryUTF8(std::string name) { lastLibraryName = name; int n = name.size(); int wn = MultiByteToWideChar(CP_UTF8, 0, name.c_str(), n, 0, 0); wchar_t *wname = new wchar_t[wn+1]; wn = MultiByteToWideChar(CP_UTF8, 0, name.c_str(), n, wname, wn); wname[wn] = L'\0'; HMODULE h = LoadLibraryW(wname); delete[] wname; return h; } static std::string GetErrorText() { wchar_t *buffer; DWORD err = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buffer, 0, NULL ); int wn = wcslen(buffer); int n = WideCharToMultiByte(CP_UTF8, 0, buffer, wn, 0, 0, 0, 0); if (n < 0) { LocalFree(&buffer); return "Unable to convert error string (internal error)"; } char *text = new char[n+1]; (void)WideCharToMultiByte(CP_UTF8, 0, buffer, wn, text, n, 0, 0); text[n] = '\0'; std::string s(text); LocalFree(&buffer); delete[] text; for (int i = s.size(); i > 0; ) { --i; if (s[i] == '\n' || s[i] == '\r') { s.erase(i, 1); } } std::size_t pos = s.find("%1"); if (pos != std::string::npos && lastLibraryName != "") { s.replace(pos, 2, lastLibraryName); } return s; } #define DLOPEN(a,b) LoadLibraryUTF8(a) #else #define DLOPEN(a,b) LoadLibrary((a).c_str()) #define GetErrorText() "" #endif #define DLSYM(a,b) (void *)GetProcAddress((HINSTANCE)(a),(b).c_str()) #define DLCLOSE(a) (!FreeLibrary((HINSTANCE)(a))) #define DLERROR() (GetErrorText()) #else #include #define DLOPEN(a,b) dlopen((a).c_str(),(b)) #define DLSYM(a,b) dlsym((a),(b).c_str()) #define DLCLOSE(a) dlclose((a)) #define DLERROR() dlerror() #endif #include #include //#include using namespace std; string error() { string e = DLERROR(); if (e == "") return "(unknown error)"; else return e; } string checkLADSPAStyleDescriptorFn(void *f) { typedef const void *(*DFn)(unsigned long); DFn fn = DFn(f); unsigned long index = 0; while (fn(index)) ++index; if (index == 0) return "Library contains no plugins"; // else cerr << "Library contains " << index << " plugin(s)" << endl; return ""; } string checkVampDescriptorFn(void *f) { typedef const void *(*DFn)(unsigned int, unsigned int); DFn fn = DFn(f); unsigned int index = 0; while (fn(2, index)) ++index; if (index == 0) return "Library contains no plugins"; // else cerr << "Library contains " << index << " plugin(s)" << endl; return ""; } string check(string soname, string descriptor) { void *handle = DLOPEN(soname, RTLD_NOW | RTLD_LOCAL); if (!handle) { return "Unable to open plugin library: " + error(); } void *fn = DLSYM(handle, descriptor); if (!fn) { return "Failed to find plugin descriptor " + descriptor + " in library: " + error(); } if (descriptor == "ladspa_descriptor") { return checkLADSPAStyleDescriptorFn(fn); } else if (descriptor == "dssi_descriptor") { return checkLADSPAStyleDescriptorFn(fn); } else if (descriptor == "vampGetPluginDescriptor") { return checkVampDescriptorFn(fn); } else { cerr << "Note: no descriptor logic known for descriptor function \"" << descriptor << "\"; not actually calling it" << endl; } return ""; } int main(int argc, char **argv) { bool allGood = true; string soname; bool showUsage = false; if (argc > 1) { string opt = argv[1]; if (opt == "-?" || opt == "-h" || opt == "--help") { showUsage = true; } else if (opt == "-v" || opt == "--version") { cout << CHECKER_VERSION << endl; return 0; } } if (argc != 2 || showUsage) { cerr << endl; cerr << programName << ": Test shared library objects for plugins to be" << endl; cerr << "loaded via descriptor functions." << endl; cerr << "\n Usage: " << programName << " \n" "\nwhere descriptorname is the name of a plugin descriptor symbol to be sought\n" "in each library (e.g. vampGetPluginDescriptor for Vamp plugins). The list of\n" "candidate plugin library filenames is read from stdin.\n" << endl; return 2; } string descriptor = argv[1]; #ifdef _WIN32 // Avoid showing the error-handler dialog for missing DLLs, // failing quietly instead. It's permissible for this program // to simply fail when a DLL can't be loaded -- showing the // error dialog wouldn't change this anyway, it would just // block the program until the user clicked it away and then // fail anyway. SetErrorMode(SEM_FAILCRITICALERRORS); #endif while (getline(cin, soname)) { string report = check(soname, descriptor); if (report != "") { cout << "FAILURE|" << soname << "|" << report << endl; allGood = false; } else { cout << "SUCCESS|" << soname << "|" << endl; } } return allGood ? 0 : 1; } sonic-visualiser-3.0.3/checker/src/knownplugins.cpp0000644000000000000000000001423613111512442020577 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Copyright (c) 2016 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "knownplugins.h" #include using namespace std; #if defined(_WIN32) #define PATH_SEPARATOR ';' #else #define PATH_SEPARATOR ':' #endif KnownPlugins::KnownPlugins(string helperExecutableName, PluginCandidates::LogCallback *cb) : m_candidates(helperExecutableName), m_helperExecutableName(helperExecutableName) { m_candidates.setLogCallback(cb); m_known = { { VampPlugin, { "vamp", expandConventionalPath(VampPlugin, "VAMP_PATH"), "vampGetPluginDescriptor" }, }, { LADSPAPlugin, { "ladspa", expandConventionalPath(LADSPAPlugin, "LADSPA_PATH"), "ladspa_descriptor" }, }, { DSSIPlugin, { "dssi", expandConventionalPath(DSSIPlugin, "DSSI_PATH"), "dssi_descriptor" } } }; for (const auto &k: m_known) { m_candidates.scan(k.second.tag, k.second.path, k.second.descriptor); } } bool KnownPlugins::is32bit() const { return m_helperExecutableName.find("-32") != std::string::npos; } string KnownPlugins::getDefaultPath(PluginType type) { switch (type) { #if defined(_WIN32) case VampPlugin: return "%ProgramFiles%\\Vamp Plugins"; case LADSPAPlugin: return "%ProgramFiles%\\LADSPA Plugins;%ProgramFiles%\\Audacity\\Plug-Ins"; case DSSIPlugin: return "%ProgramFiles%\\DSSI Plugins"; #elif defined(__APPLE__) case VampPlugin: return "$HOME/Library/Audio/Plug-Ins/Vamp:/Library/Audio/Plug-Ins/Vamp"; case LADSPAPlugin: return "$HOME/Library/Audio/Plug-Ins/LADSPA:/Library/Audio/Plug-Ins/LADSPA"; case DSSIPlugin: return "$HOME/Library/Audio/Plug-Ins/DSSI:/Library/Audio/Plug-Ins/DSSI"; #else /* Linux, BSDs, etc */ case VampPlugin: return "$HOME/vamp:$HOME/.vamp:/usr/local/lib/vamp:/usr/lib/vamp"; case LADSPAPlugin: return "$HOME/ladspa:$HOME/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa"; case DSSIPlugin: return "$HOME/dssi:$HOME/.dssi:/usr/local/lib/dssi:/usr/lib/dssi"; #endif } throw logic_error("unknown or unhandled plugin type"); } vector KnownPlugins::expandConventionalPath(PluginType type, string var) { vector pathList; string path; char *cpath = getenv(var.c_str()); if (cpath) path = cpath; #ifdef _WIN32 bool is32 = is32bit(); #endif if (path == "") { path = getDefaultPath(type); if (path != "") { char *home = getenv("HOME"); if (home) { string::size_type f; while ((f = path.find("$HOME")) != string::npos && f < path.length()) { path.replace(f, 5, home); } } #ifdef _WIN32 const char *pfiles = 0; if (is32) { pfiles = getenv("ProgramFiles(x86)"); } if (!pfiles) { pfiles = getenv("ProgramFiles"); } if (!pfiles) { if (is32) { pfiles = "C:\\Program Files (x86)"; } else { pfiles = "C:\\Program Files"; } } string::size_type f; while ((f = path.find("%ProgramFiles%")) != string::npos && f < path.length()) { path.replace(f, 14, pfiles); } #endif } } string::size_type index = 0, newindex = 0; while ((newindex = path.find(PATH_SEPARATOR, index)) < path.size()) { pathList.push_back(path.substr(index, newindex - index).c_str()); index = newindex + 1; } pathList.push_back(path.substr(index)); return pathList; } string KnownPlugins::getFailureReport() const { vector failures; for (auto t: getKnownPluginTypes()) { auto ff = m_candidates.getFailedLibrariesFor(getTagFor(t)); failures.insert(failures.end(), ff.begin(), ff.end()); } if (failures.empty()) return ""; int n = int(failures.size()); int i = 0; ostringstream os; os << "

    "; return os.str(); } sonic-visualiser-3.0.3/checker/src/plugincandidates.cpp0000644000000000000000000001744213111512442021361 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Copyright (c) 2016 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music and Queen Mary, University of London shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "plugincandidates.h" #include #include #include #include #include #include #if defined(_WIN32) #define PLUGIN_GLOB "*.dll" #elif defined(__APPLE__) #define PLUGIN_GLOB "*.dylib *.so" #else #define PLUGIN_GLOB "*.so" #endif using namespace std; PluginCandidates::PluginCandidates(string helperExecutableName) : m_helper(helperExecutableName), m_logCallback(0) { } void PluginCandidates::setLogCallback(LogCallback *cb) { m_logCallback = cb; } vector PluginCandidates::getCandidateLibrariesFor(string tag) const { if (m_candidates.find(tag) == m_candidates.end()) return {}; else return m_candidates.at(tag); } vector PluginCandidates::getFailedLibrariesFor(string tag) const { if (m_failures.find(tag) == m_failures.end()) return {}; else return m_failures.at(tag); } void PluginCandidates::log(string message) { if (m_logCallback) { m_logCallback->log("PluginCandidates: " + message); } else { cerr << "PluginCandidates: " << message << endl; } } vector PluginCandidates::getLibrariesInPath(vector path) { vector candidates; for (string dirname: path) { log("scanning directory " + dirname); QDir dir(dirname.c_str(), PLUGIN_GLOB, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::Readable); for (unsigned int i = 0; i < dir.count(); ++i) { QString soname = dir.filePath(dir[i]); // NB this means the library names passed to the helper // are UTF-8 encoded candidates.push_back(soname.toStdString()); } } return candidates; } void PluginCandidates::scan(string tag, vector pluginPath, string descriptorSymbolName) { vector libraries = getLibrariesInPath(pluginPath); vector remaining = libraries; int runlimit = 20; int runcount = 0; vector result; while (result.size() < libraries.size() && runcount < runlimit) { vector output = runHelper(remaining, descriptorSymbolName); result.insert(result.end(), output.begin(), output.end()); int shortfall = int(remaining.size()) - int(output.size()); if (shortfall > 0) { // Helper bailed out for some reason presumably associated // with the plugin following the last one it reported // on. Add a failure entry for that one and continue with // the following ones. string failed = *(remaining.rbegin() + shortfall - 1); log("helper output ended before result for plugin " + failed); result.push_back("FAILURE|" + failed + "|Plugin load check failed or timed out"); remaining = vector (remaining.rbegin(), remaining.rbegin() + shortfall - 1); } ++runcount; } recordResult(tag, result); } vector PluginCandidates::runHelper(vector libraries, string descriptor) { vector output; log("running helper " + m_helper + " with following library list:"); for (auto &lib: libraries) log(lib); QProcess process; process.setReadChannel(QProcess::StandardOutput); process.setProcessChannelMode(QProcess::ForwardedErrorChannel); process.start(m_helper.c_str(), { descriptor.c_str() }); if (!process.waitForStarted()) { QProcess::ProcessError err = process.error(); if (err == QProcess::FailedToStart) { std::cerr << "Unable to start helper process " << m_helper << std::endl; } else if (err == QProcess::Crashed) { std::cerr << "Helper process " << m_helper << " crashed on startup" << std::endl; } else { std::cerr << "Helper process " << m_helper << " failed on startup with error code " << err << std::endl; } throw runtime_error("plugin load helper failed to start"); } for (auto &lib: libraries) { process.write(lib.c_str(), lib.size()); process.write("\n", 1); } QTime t; t.start(); int timeout = 15000; // ms const int buflen = 4096; bool done = false; while (!done) { char buf[buflen]; qint64 linelen = process.readLine(buf, buflen); if (linelen > 0) { output.push_back(buf); done = (output.size() == libraries.size()); } else if (linelen < 0) { // error case log("received error code while reading from helper"); done = true; } else { // no error, but no line read (could just be between // lines, or could be eof) done = (process.state() == QProcess::NotRunning); if (!done) { if (t.elapsed() > timeout) { // this is purely an emergency measure log("timeout: helper took too long, killing it"); process.kill(); done = true; } else { process.waitForReadyRead(200); } } } } if (process.state() != QProcess::NotRunning) { process.close(); process.waitForFinished(); } log("helper completed"); return output; } void PluginCandidates::recordResult(string tag, vector result) { for (auto &r: result) { QString s(r.c_str()); QStringList bits = s.split("|"); log(("read output line from helper: " + s.trimmed()).toStdString()); if (bits.size() < 2 || bits.size() > 3) { log("invalid output line (wrong number of |-separated fields)"); continue; } string status = bits[0].toStdString(); string library = bits[1].toStdString(); if (bits.size() == 2) library = bits[1].trimmed().toStdString(); string message = ""; if (bits.size() > 2) message = bits[2].trimmed().toStdString(); if (status == "SUCCESS") { m_candidates[tag].push_back(library); } else if (status == "FAILURE") { m_failures[tag].push_back({ library, message }); } else { log("unexpected status \"" + status + "\" in output line"); } } } sonic-visualiser-3.0.3/checker/version.h0000644000000000000000000000003613111512442016375 0ustar 00000000000000#define CHECKER_VERSION "1.0" sonic-visualiser-3.0.3/dataquay/.hgignore0000644000000000000000000000012213111512442016543 0ustar 00000000000000syntax: glob re:^doc/html/ re:^o/ re:^tests/o/ *.a *~ *.gcda *.gcno *.gcov *.ttl sonic-visualiser-3.0.3/dataquay/.hgtags0000644000000000000000000000120613111512442016222 0ustar 000000000000009a02b2dc340a04f032b89e82c8212d5fd2a1129e v0.3 39682ebe2dc88294b1791ebfc6a1a34cfb4120bc v0.8 ddbaa1ddff11b6731070e393df109d9083a4d4d4 v0.9 ddbaa1ddff11b6731070e393df109d9083a4d4d4 v0.9 7e233fb8527cba17279ed28309e8e4de9fe5b43a v0.9 7e233fb8527cba17279ed28309e8e4de9fe5b43a v0.9 3e733c299c1d4574d9b55387f9b4275532b0d573 v0.9 3e733c299c1d4574d9b55387f9b4275532b0d573 v0.9 d0d0c2594e9d3058cad8c2d2f9e5750cffe81ec2 v0.9 d0d0c2594e9d3058cad8c2d2f9e5750cffe81ec2 v0.9 0000000000000000000000000000000000000000 v0.9 0000000000000000000000000000000000000000 v0.9 896ae07b84e1cc259c648275e6fee729304f0b3f v0.9 768fb9b053558d870233048c3b4c340772e2ccec v0.9.1 sonic-visualiser-3.0.3/dataquay/CHANGELOG0000644000000000000000000000642113111512442016162 0ustar 00000000000000 Changes in Dataquay 0.9.1 since the previous version 0.9: * Update to support Qt5 and newer C++ compilers. Now requires C++11 (though the library only makes minimal use of the standard). * Incorporate a number of build fixes Changes in Dataquay 0.9 since the previous version 0.8: * Rework Uri, Node, and Triple constructors. Now Uri is to be used only for absolute URIs; Node demands that Uri be used when constructing URI nodes, treating a string as a literal type; and Triple demands three Nodes, losing the short-circuiting constructors that used to take relative URIs as strings. This simplifies the rules for type usage: an absolute URI is a Uri, a literal is a string, and a relative URI must be expanded before it can be used. It also makes Triple construction patterns more consistent and easier to remember. * Add "slice" methods subjects(), predicates(), objects() to Triples * Rename matchFirst to matchOnce and queryFirst to queryOnce in Store API. There was no ordering by which the result could meaningfully be described as the first * Add Store::complete() to return a Node that completes a Triple with only one wildcard Node in it * Ensure store always has a base URI, and some fixes to base URI management for file loading (this will be reviewed again before 1.0 though) * Fix lack of predicate-index in Sord backend * Formalise ObjectStorer in the same way as the formalisation of the ObjectMapper and ObjectLoader for 0.8 * Replace ad-hoc unit tests with QtTest-based tests Changes in Dataquay 0.8 since the previous version 0.3: * Add support for David Robillard's lightweight Sord datastore as an alternative to the existing Redland support. The Dataquay Store now has a getSupportedFeatures() method to return capabilities of the underlying datastore. * Many fixes to ObjectMapper API, including a more formal approach to circular dependencies and formalising the object loading order * Add method to commit a transaction on a connection and simultaneously receive the set of changes * Hoist save() and import() to the Store interface from the BasicStore concrete class, and provide transactional implementations in TransactionalStore Changes in Dataquay 0.3 since the previous version 0.2: * Add the entire ObjectMapper API and implementation * Add the ability to extend Node with new converters between QVariant types and RDF literal types * Replace QUrl with a new, very thin Uri class throughout for representation of RDF URIs. QUrl turned out to be very costly for this and most of its facilities are not needed here * Change the Transaction interface so as to require an explicit commit() call rather than committing on delete (it's more work to use this way, but code written to use the old interface just didn't read well) * Change Node so as to use an untyped literal for string types rather than using xsd:string (necessary for practical interoperability) * Some very substantial performance improvements and further fixes Changes in Dataquay 0.2 since the initial version 0.1: * Add the ability to control how duplicate triples are handled on import * Make the transactional store emit a signal when a transaction is committed * A small number of other fixes sonic-visualiser-3.0.3/dataquay/COPYING0000644000000000000000000000253613111512442016006 0ustar 00000000000000 Dataquay Copyright (c) 2009-2016 Chris Cannam, Particular Programs Ltd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/dataquay/Doxyfile0000644000000000000000000020035313111512442016456 0ustar 00000000000000# Doxyfile 1.6.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Dataquay # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.8 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . \ dataquay \ dataquay/objectmapper # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc \ doc-overview # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enabled doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = NO # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES sonic-visualiser-3.0.3/dataquay/README.txt0000644000000000000000000001060713111512442016447 0ustar 00000000000000 Dataquay ======== Dataquay is a free open source library that provides a friendly C++ API for an RDF data store using Qt classes and containers. http://breakfastquay.com/dataquay/ This is version 0.9.1 of Dataquay. Note that this is a pre-1.0 release and the API is still subject to change. Dataquay is simple to use and easy to integrate. It is principally intended for use in Qt-based applications that would like to use an RDF datastore as backing for in-memory project data, to avoid having to provide application data-specific file formats and to make it easy to augment the data with descriptive metadata pulled in from external sources. Dataquay is also intended to be useful for applications whose primary purpose is not related to RDF but that have ad-hoc RDF needs for metadata management. Dataquay does not include the datastore implementation itself; instead it is a wrapper around either Redland (http://librdf.org) or Sord (http://drobilla.net/software/sord/). Dataquay provides these features: * Conversion between arbitrary data types and RDF nodes using the Node class and QVariant types. Data are converted to XSD datatypes where possible, using an easily extended mechanism. * Simple and flexible storage, query, and file I/O (natively using the Turtle format) functions provided by the Store and BasicStore classes. * Straightforward transactional interface via TransactionalStore and Transaction. Transactions are atomic at the library level, and are isolated from any non-transactional queries occurring at the same time. The transactional implementation is designed to be simple rather than scalable, intended for use in encapsulating single-user editing operations: it is probably not wise to use Dataquay as a store for server applications, although it might work. * Optional ODBC-style transactional Connection interface. * ObjectMapper, a facility which can take care of a complete object hierarchy, map it to the RDF store, and synchronise in both directions any changes to the hierarchy or the store. Arbitrary mappings between C++ class and property names and RDF URIs can be specified. The mapping is flexible enough to allow you to load many publicly generated Linked Data sources directly into object class hierarchies, if you wish (although this is not usually an ideal way to handle unpredictable data sources). * API documentation, thread safety, documentation of threading requirements, readable code, and basic unit tests included. * BSD licensing. You can use Dataquay cost-free in commercial or open source applications and modify it as you like with no particular requirements except acknowledgement in your copyright notes. We do ask that you let us know of any bugs, fixes and enhancements you might find -- particularly for serious bugs -- but you have no obligation to do so. Choice of datastore ------------------- Dataquay can be built against either Redland (http://librdf.org) or Sord (http://drobilla.net/software/sord/). You will need to have the Raptor, Rasqal and Redland libraries installed in order to build and use Dataquay with Redland, or the Sord and Serd libraries installed in order to use Sord. To use Redland, ensure USE_REDLAND is defined in config.pri; to use Sord, ensure USE_SORD is defined. The choice is made at compile time: Dataquay does not have any module or plugin system. Which to choose? Sord is smaller and simpler, Redland more complete. SPARQL queries and data loading from a remote (e.g. HTTP) resource are only available when using Redland. For this reason, anyone packaging Dataquay for general use (e.g. in a Linux distribution) is advised to build with Redland. Compiling Dataquay ------------------ Dataquay requires Qt 4.5 or newer with qmake. Make sure your preferred datastore (see above) is selected in the config.pri file. Run "qmake dataquay.pro", then make. This should compile the library and unit tests and automatically run the tests. If compilation succeeds but any unit tests fail, please do not use the library -- report the problem to me instead. Linux users can "make install" after building if desired. A debug build will print a lot of information to standard error during run time; this can be very helpful for debugging your application, but it can quickly become excessive. Perform a release build to eliminate this output. Chris Cannam chris.cannam@breakfastquay.com sonic-visualiser-3.0.3/dataquay/config.pri0000644000000000000000000000063013111512442016725 0ustar 00000000000000CONFIG -= debug CONFIG += release # Define these to use the Redland datastore (http://librdf.org/) DEFINES += USE_REDLAND QMAKE_CXXFLAGS += -I/usr/include/rasqal -I/usr/include/raptor2 EXTRALIBS += -lrdf # Define this to use the Sord datastore (http://drobilla.net/software/sord/) #DEFINES += USE_SORD #QMAKE_CXXFLAGS += -I/usr/include/sord-0 -I/usr/include/serd-0 -Werror #EXTRALIBS += -lsord-0 -lserd-0 sonic-visualiser-3.0.3/dataquay/dataquay.pro0000644000000000000000000000020613111512442017276 0ustar 00000000000000 TEMPLATE = subdirs SUBDIRS = sub_lib sub_tests sub_lib.file = lib.pro sub_tests.file = tests/tests.pro sub_tests.depends = sub_lib sonic-visualiser-3.0.3/dataquay/dataquay/BasicStore.h0000644000000000000000000001132713111512442020771 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_BASIC_STORE_H_ #define _DATAQUAY_BASIC_STORE_H_ #include "Store.h" namespace Dataquay { /** * \class BasicStore BasicStore.h * * BasicStore is an in-memory RDF data store implementing the Store * interface, providing add, remove, matching and query operations for * RDF triples and SPARQL, as well as export and import. * * BasicStore uses a Redland or Sord datastore internally, depending * on whether USE_REDLAND or USE_SORD was defined when Dataquay was * built. * * All operations are thread safe. */ class BasicStore : public Store { public: BasicStore(); ~BasicStore(); /** * Set the base URI for the store. This is used to expand the * empty URI prefix when adding and querying triples, and is also * used as the document base URI when exporting. */ void setBaseUri(Uri uri); /** * Retrieve the base URI for the store. */ Uri getBaseUri() const; /** * Empty the store of triples. Prefixes that have been added with * addPrefix are unaffected. *!!! hoist to Store()? */ void clear(); /** * Add a prefix/uri pair (an XML namespace, except that this class * doesn't directly deal in XML) for use in subsequent operations. * If the prefix has already been added, this overrides any uri * associated with it. * * Example: addPrefix("dc", "http://purl.org/dc/elements/1.1/") to * add a prefix for the Dublin Core namespace. * * The store always knows about the XSD and RDF namespaces. * * Note that the base URI is always available as the empty prefix. * For example, the URI ":blather" will be expanded to the base * URI plus "blather". */ void addPrefix(QString prefix, Uri uri); // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; /** * Construct a new BasicStore from the RDF document at the given * URL. May throw RDFException. The returned BasicStore is owned * by the caller and must be deleted using delete when finished * with. The return value is never NULL; all errors result in * exceptions. * * Note that the URL must be a URL, not just a filename * (i.e. local files need the file: prefix). The file URL will * also become the base URI of the store. * * If format is specified, it will be taken as the RDF parse * format (e.g. ntriples). The set of supported format strings * depends on the underlying RDF library configuration. The * default is to guess the format if possible. */ static BasicStore *load(QUrl url, QString format = ""); private: class D; D *m_d; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/Connection.h0000644000000000000000000001136313111512442021032 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_CONNECTION_H_ #define _DATAQUAY_CONNECTION_H_ #include "Store.h" namespace Dataquay { class TransactionalStore; class Transaction; /** * \class Connection Connection.h * * Connection provides a connection interface to TransactionalStore, * allowing it to be used in a convenient manner familiar to * programmers working with SQL databases. * * Each processing thread may construct a Connection to a central * TransactionalStore. The Connection will start a new Transaction on * the store when the first modifying function (add, remove, change or * revert) is called and will continue to use this Transaction for all * accesses to the store until either commit() or rollback() is called * on the Connection. * * Any read-only functions called on this class between a commit() or * rollback() and the next modifying function will be passed directly * to the store without any transaction. Read-only functions called * while a transaction is in progress will be passed through the * current transaction, and so will read the effective state of the * store with the partial transaction in force. * * The Connection commits any active Transaction when it is deleted. * To avoid this, call rollback() before deletion. No other * auto-commit functionality is provided -- if you want auto-commit, * use the TransactionalStore's own interface in AutoTransaction mode. * * Each Connection should be used in a single processing thread only. * Connection is not thread-safe. */ class Connection : public QObject, public Store { Q_OBJECT public: /** * Construct a Connection to the given TransactionalStore, through * which a series of transactions may be made in a single * processing thread. */ Connection(TransactionalStore *ts); /** * Destroy the Connection, first committing any outstanding * transaction. If you do not want any outstanding transaction to * be committed, call rollback() first. */ ~Connection(); // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; public slots: /** * Commit the outstanding Transaction, if any. */ void commit(); /** * Commit the outstanding Transaction, if any, and return the * changes committed. */ ChangeSet commitAndObtain(); /** * Roll back the outstanding Transaction, if any, and prepare to * begin a new Transaction the next time a modifying function is * called. */ void rollback(); signals: /// Forwarded from TransactionalStore void transactionCommitted(const ChangeSet &); /// Forwarded from TransactionalStore void transactionCommitted(); private: class D; D *m_d; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/Node.h0000644000000000000000000002174713111512442017627 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_NODE_H_ #define _DATAQUAY_NODE_H_ namespace Dataquay { class Node; } // Declare this early, to avoid any problems with instantiation order // arising from inclusion "races". If this is not found when // compiling, hoist this header so that it is included earlier than // any other header that includes extern unsigned int qHash(const Dataquay::Node &); #include "Uri.h" #include #include class QDataStream; class QTextStream; namespace Dataquay { /** * \class Node Node.h * * Node represents a single RDF node, with conversions to and from * variant types. */ class Node { public: /** * Node type. */ enum Type { Nothing, URI, Literal, Blank }; /** * Construct a node with no node type (used for example as an * undefined node when pattern matching a triple). */ Node() : type(Nothing), value() { } /** * Construct a node with a URI node type and the given URI. * * Note that relative URIs (using namespace prefixes) must be * expanded before they be represented in a Uri. Call * Store::expand() to achieve this. * * (One basic principle of this RDF library is that we use QString * to represent URIs that may be local or namespace prefixed, and * Uri to represent expanded or canonical URIs.) */ Node(Uri u) : type(URI), value(u.toString()) { } /** * Construct a literal node with the given value, and with no * defined datatype. */ Node(QString v) : type(Literal), value(v) { } /** * Construct a literal node with the given value and datatype. */ Node(QString v, Uri dt) : type(Literal), value(v), datatype(dt) { } Node(const Node &n) : type(n.type), value(n.value), datatype(n.datatype) { } Node &operator=(const Node &n) { type = n.type; value = n.value; datatype = n.datatype; return *this; } ~Node() { } /** * Convert a QVariant to a Node. * * Simple QVariant types (integer, etc) are converted to literal * Nodes whose values are encoded as XSD datatypes, with the * node's value storing the XSD representation and the node's * datatype storing the XSD datatype URI. * * QVariants containing \ref Uri are converted to URI nodes. Note * that URIs using namespace prefixes will need to be expanded * before they can safely be represented in a Uri or Uri QVariant. * Call Store::expand() to achieve this. In general you should * ensure that URIs are expanded when placed in a Node object * rather than being stored in prefixed form. * * For QVariants whose types have been registered using * registerDatatype, the registered VariantEncoder's fromVariant * method will be used to convert the variant to a string which * will be stored in a literal node. * * Other QVariants, including complex structures, are converted * into literals containing an encoded representation which may be * converted back again using toVariant but cannot be directly * read from or interchanged using the node's value. These types * are given a specific fixed datatype URI. */ static Node fromVariant(const QVariant &v); /** * Convert a Node to a QVariant. * * See fromVariant for details of the conversion. * * Note that URI nodes are returned as variants with user type * corresponding to Uri, not as QString variants. This may result * in invalid Uris if the URIs were not properly expanded on * construction (see the notes about fromVariant). */ QVariant toVariant() const; /** * Convert a Node to a QVariant, with a nudge for the variant * type, used to override the default variant type corresponding * to the node's datatype. This is marginally simpler than * setting the datatype on the node and then converting, and so * may be convenient in situations where the proper RDF datatype * is missing. * * Meaningful results still depend on having the proper encoder * available (i.e. the type name whose QMetaType id is metaTypeId * must have been registered using registerDatatype, if it is not * one of the types with built-in support). If no encoder is * found, a QString variant will be returned instead. */ QVariant toVariant(int metaTypeId) const; bool operator<(const Node &n) const { if (type != n.type) return type < n.type; if (value != n.value) return value < n.value; if (datatype != n.datatype) return datatype < n.datatype; return false; } /** * VariantEncoder is an abstract interface for classes that can * convert between QVariant and strings for storage in literal * Node objects. */ struct VariantEncoder { virtual ~VariantEncoder() { } /** * Convert a string to a variant. The VariantEncoder is * expected to be know the node type from which the string has * been obtained. */ virtual QVariant toVariant(const QString &n) = 0; /** * Convert a variant to a string. The specific VariantEncoder * is expected to know the node type which is the target of * the conversion. */ virtual QString fromVariant(const QVariant &v) = 0; }; /** * Register an association between a particular datatype URI and a * type which can be stored in a QVariant. This can be used to * provide meaningful conversions between literal nodes and * QVariant objects in addition to the built-in types. * * For conversions from variant, once an association has been made * via this call, a subsequent call to Node::fromVariant given a * variant whose type is that of the given variantTypeName will * return a Node of the specified datatype. If an encoder is also * given, it will be used for the QVariant-to-string conversion * needed to produce a value string in the correct form for the * RDF datatype. * * For conversions to variant, the encoder is required. If it is * provided, then a subsequent call to Node::toVariant on a node * of the given datatype will result in a variant of the specified * type, produced by calling the encoder's toVariant method with * the node's value string as argument. */ static void registerDatatype(Uri datatype, QString variantTypeName, VariantEncoder *encoder = 0); /** * Retrieve the datatype URI that has been associated with the * given variant type using \ref registerDatatype. If no such * association has been made or the variant type is unknown, * return the empty Uri. */ static Uri getDatatype(QString variantTypeName); /** * Retrieve the variant type that has been associated with the * given datatype Uri using \ref registerDatatype. If no such * association has been made, return an empty string. */ static QString getVariantTypeName(Uri datatype); Type type; QString value; Uri datatype; }; /** * A list of node types. */ typedef QList Nodes; bool operator==(const Node &a, const Node &b); bool operator!=(const Node &a, const Node &b); QDataStream &operator<<(QDataStream &out, const Node &); QDataStream &operator>>(QDataStream &in, Node &); std::ostream &operator<<(std::ostream &out, const Node &); QTextStream &operator<<(QTextStream &out, const Node &); } #endif sonic-visualiser-3.0.3/dataquay/dataquay/PropertyObject.h0000644000000000000000000004701213111512442021706 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_PROPERTY_OBJECT_H_ #define _DATAQUAY_PROPERTY_OBJECT_H_ #include #include #include #include #include #include "Node.h" namespace Dataquay { class Transaction; class Store; /** * \class PropertyObject PropertyObject.h * * PropertyObject is a helper class for managing RDF properties of an * object URI -- that is, triples that share a common subject and * possibly a common prefix for the predicate, and that have only one * value for each subject-predicate combination. This could be of use * in situations where properties of a single object URI are referred * to often. This class provides set and get methods that act * directly upon the backing datastore, optionally using a * transaction. See CacheingPropertyObject for a cacheing * alternative. * * PropertyObject is constructed using a "property prefix" (a string) * and "my URI" (a URI). The URI is used by the property object as * the subject for all RDF triples. * * All the property handling methods then also take a "property name", * which is a string. If this name contains no ':' character, it will * be prefixed with the property prefix that was supplied to the * PropertyObject constructor before being subjected to prefix * expansion in the RDF store. The result is then used as the * predicate for the RDF triple. If the name does contain a ':', it * is passed for expansion directly (the prefix is not prepended * first). As an exception, if the prefix is the special name "a", * it will be expanded (by the store) as "rdf:type". * * Example: If the property prefix is "myprops:" and the property name * passed to getProperty is "some_property", the returned value from * getProperty will be the result of matching on the triple (myUri, * "myprops:some_property", ()). Hopefully, the RDF store will have * already been told about the "myprops" prefix and will know how to * expand it. * * Example: If the property prefix is "http://example.com/property/" * and the property name passed to getProperty is "some_property", the * returned value from getProperty will be the result of matching on * the triple (myUri, "http://example.com/property/some_property", ()). * * Example: If the property prefix is "myprops:" and the property name * passed to getProperty is "yourprops:some_property", the returned * value from getProperty will be the result of matching on the triple * (myUri, "yourprops:some_property", ()). The property prefix is not * used at all in this example because the property name contains ':'. */ class PropertyObject { public: /** * Construct a PropertyObject acting on the given Store, with the * default prefix for properties taken from the global default * (see setDefaultPropertyPrefix) and the given "subject" URI. */ PropertyObject(Store *s, Uri myUri); /** * Construct a PropertyObject acting on the given Store, with the * default prefix for properties taken from the global default * (see setDefaultPropertyPrefix) and the given "subject" URI * (which will be prefix expanded). */ PropertyObject(Store *s, QString myUri); /** * Construct a PropertyObject acting on the given Store, with the * default prefix for properties taken from the global default * (see setDefaultPropertyPrefix) and the given "subject" node. * This is provided so as to permit querying the properties of * blank nodes or nodes returned from other queries. */ PropertyObject(Store *s, Node myNode); /** * Construct a PropertyObject acting on the given Store, with the * given default prefix (which will itself be prefix expanded) for * properties and the given "subject" URI. */ PropertyObject(Store *s, QString propertyPrefix, Uri myUri); /** * Construct a PropertyObject acting on the given Store, with the * given default prefix for properties and the given "subject" * URI (which will be prefix expanded). */ PropertyObject(Store *s, QString propertyPrefix, QString myUri); /** * Construct a PropertyObject acting on the given Store, with the * given default prefix for properties and the given node as its * subject. This is provided so as to permit querying the * properties of blank nodes or nodes returned from other queries. */ PropertyObject(Store *s, QString propertyPrefix, Node myNode); ~PropertyObject(); /** * Return the node passed to the constructor (or derived from the * URI passed to the constructor). */ Node getNode() const; /** * Return the rdf:type of my URI, if any. If more than one is * defined, return the first one found. */ Uri getObjectType() const; /** * Return the rdf:type of my URI, if any, querying through the * given transaction. If more than one is defined, return the * first one found. */ Uri getObjectType(Transaction *tx) const; /** * Return true if the property object has the given property. That * is, if the store contains at least one triple whose subject and * predicate match those for my URI and the expansion of the given * property name. */ bool hasProperty(QString name) const; /** * Return true if the property object has the given property, * querying through the given transaction. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name. */ bool hasProperty(Transaction *tx, QString name) const; /** * Get the value of the given property. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name, * convert the object part of the first such matching triple to a * QVariant via Node::toVariant and return that value. If there * is no such match, return QVariant(). */ QVariant getProperty(QString name) const; /** * Get the value of the given property, querying through the given * transaction. That is, if the store contains at least one * triple whose subject and predicate match those for my URI and * the expansion of the given property name, convert the object * part of the first such matching triple to a QVariant via * Node::toVariant and return that value. If there is no such * match, return QVariant(). */ QVariant getProperty(Transaction *tx, QString name) const; /** * Get the value of the given property as a list. That is, if the * store contains at least one triple whose subject and predicate * match those for my URI and the expansion of the given property * name, convert the object parts of all such matching triples to * QVariant via Node::toVariant and return a list of the resulting * values. If there is no such match, return an empty list. * * Note that the order of variants in the returned list is * arbitrary and may change from one call to the next. */ QVariantList getPropertyList(QString name) const; /** * Get the value of the given property as a list, querying through * the given transaction. That is, if the store contains at least * one triple whose subject and predicate match those for my URI * and the expansion of the given property name, convert the * object parts of all such matching triples to QVariant via * Node::toVariant and return a list of the resulting values. If * there is no such match, return QVariant(). * * Note that the order of variants in the returned list is * arbitrary and may change from one call to the next. */ QVariantList getPropertyList(Transaction *tx, QString name) const; /** * Get the node for the given property. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name, * return the object part of the first such matching triple. If * there is no such match, return Node(). */ Node getPropertyNode(QString name) const; /** * Get the node for the given property, querying through the given * transaction. That is, if the store contains at least one * triple whose subject and predicate match those for my URI and * the expansion of the given property name, return the object * part of the first such matching triple. If there is no such * match, return Node(). */ Node getPropertyNode(Transaction *tx, QString name) const; /** * Get the nodes for the given property. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name, * return the object parts of all such matching triples. If there * is no such match, return an empty list. * * Note that the order of nodes in the returned list is arbitrary * and may change from one call to the next. */ Nodes getPropertyNodeList(QString name) const; /** * Get the nodes for the given property, querying through the * given transaction. That is, if the store contains at least one * triple whose subject and predicate match those for my URI and * the expansion of the given property name, return the object * parts of all such matching triples. If there is no such match, * return an empty list. * * Note that the order of nodes in the returned list is arbitrary * and may change from one call to the next. * *!!! NB this is misnamed -- this looks up a set rather than a list */ Nodes getPropertyNodeList(Transaction *tx, QString name) const; /** * Get the names of this object's properties beginning with our * property prefix. That is, find all triples in the store whose * subject matches my URI and whose predicate begins with our * property prefix, and return a list of the remainder of their * predicate URIs following the property prefix. */ QStringList getPropertyNames() const; /** * Get the names of this object's properties beginning with our * property prefix, querying through the given transaction. That * is, find all triples in the store whose subject matches my URI * and whose predicate begins with our property prefix, and return * a list of the remainder of their predicate URIs following the * property prefix. */ QStringList getPropertyNames(Transaction *tx) const; /** * Set the given property to the given value. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple whose object part is the result * of converting the given variant to a node via * Node::fromVariant. */ void setProperty(QString name, QVariant value); /** * Set the given property to the given URI. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple whose object part is the URI. */ void setProperty(QString name, Uri uri); /** * Set the given property to the given node. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple whose object part is the node. */ void setProperty(QString name, Node node); /** * Set the given property to the given value through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * whose object part is the result of converting the given variant * to a node via Node::fromVariant. */ void setProperty(Transaction *tx, QString name, QVariant value); /** * Set the given property to the given URI through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * whose object part is the URI. */ void setProperty(Transaction *tx, QString name, Uri uri); /** * Set the given property to the given node through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * whose object part is the node. */ void setProperty(Transaction *tx, QString name, Node node); /** * Set the given property to the given values. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple for each variant in the value * list, whose object part is the result of converting that * variant to a node via Node::fromVariant. */ void setPropertyList(QString name, QVariantList values); /** * Set the given property to the given values through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * for each variant in the value list, whose object part is the * result of converting that variant to a node via * Node::fromVariant. */ void setPropertyList(Transaction *tx, QString name, QVariantList values); /** * Set the given property to the given nodes. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple for each node in the list, whose * object part is that node. */ void setPropertyList(QString name, Nodes nodes); /** * Set the given property to the given nodes through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * for each node in the list, whose object part is that node. */ void setPropertyList(Transaction *tx, QString name, Nodes nodes); /** * Remove the given property. That is, remove from the store any * triples whose subject and predicate match those for my URI and * the expansion of the given property name. */ void removeProperty(QString name); /** * Remove the given property. That is, remove from the store any * triples whose subject and predicate match those for my URI and * the expansion of the given property name. */ void removeProperty(Transaction *tx, QString name); /** * Return the Store object that will be used for modifications in * the given transaction. If the transaction is not * NoTransaction, then the returned Store will simply be the * transaction itself; otherwise it will be the store that was * passed to the constructor. */ Store *getStore(Transaction *tx) const; /** * Return the URI used for the "predicate" part of any triple * referring to the given property name. See the general * PropertyObject documentation for details of how these names are * expanded. */ Uri getPropertyUri(QString name) const; /** * Set the global default property prefix. This will be used as * the prefix for all PropertyObjects subsequently constructed * using the two-argument (prefixless) constructors. */ static void setDefaultPropertyPrefix(QString prefix); private: Store *m_store; QString m_pfx; Uri m_upfx; Node m_node; static QString m_defaultPrefix; }; /** * \class CacheingPropertyObject PropertyObject.h * * CacheingPropertyObject is a helper class for managing RDF * properties of an object URI -- that is, triples that share a common * subject and possibly a common prefix for the predicate, and that * have only one value for each subject-predicate combination. * * This class caches results from the datastore and so may be faster * than PropertyObject, but it can only be used in contexts where it * is known that no other agent may be modifying the same set of * properties. Its set of available functions is more limited than * PropertyObject also: it has no Transaction-based functions. * * See PropertyObject for individual method documentation. */ class CacheingPropertyObject { public: CacheingPropertyObject(Store *s, Uri myUri); CacheingPropertyObject(Store *s, QString myUri); CacheingPropertyObject(Store *s, QString propertyPrefix, Uri myUri); CacheingPropertyObject(Store *s, QString propertyPrefix, QString myUri); CacheingPropertyObject(Store *s, QString propertyPrefix, Node myUri); Uri getObjectType() const; bool hasProperty(QString name) const; QVariant getProperty(QString name) const; QVariantList getPropertyList(QString name) const; Node getPropertyNode(QString name) const; Nodes getPropertyNodeList(QString name) const; QStringList getPropertyNames() const; void setProperty(QString name, QVariant value); void setProperty(QString name, Uri value); void setProperty(QString name, Node node); void setPropertyList(QString name, QVariantList values); void setPropertyList(QString name, Nodes nodes); void removeProperty(QString name); Uri getPropertyUri(QString name) const; private: PropertyObject m_po; typedef QHash Properties; mutable Properties m_cache; // note: value is never empty mutable bool m_cached; void encache() const; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/RDFException.h0000644000000000000000000001243713111512442021230 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_EXCEPTION_H_ #define _DATAQUAY_EXCEPTION_H_ #include #include namespace Dataquay { class Uri; class Node; class Triple; /** * \class RDFException RDFException.h * * RDFException is an exception that results from incorrect usage of * the RDF store interface or unsuitable data provided to a function. * For example, this exception would be thrown in response to trying * to add an incomplete triple to the store. */ class RDFException : virtual public std::exception { public: RDFException(QString message) throw(); RDFException(QString message, QString data) throw(); RDFException(QString message, const Uri &uri) throw(); RDFException(QString message, const Node &node) throw(); RDFException(QString message, const Triple &triple) throw(); RDFException(const RDFException &e) throw(); RDFException &operator=(const RDFException &e) throw(); virtual ~RDFException() throw(); virtual const char *what() const throw() { return m_message; } protected: char *m_message; void setMessage(QString m); }; /** * \class RDFIncompleteURI RDFException.h * * RDFIncompleteURI is thrown when an attempt is made to construct a * Uri from an incomplete URI string, such as a relative URI or a * string with no scheme. Relative URIs should be represented as plain * strings, and expanded by the store using its base URI into Uri * objects. */ class RDFIncompleteURI : virtual public RDFException { public: RDFIncompleteURI(QString message, QString data) throw() : RDFException(message, data) { } virtual ~RDFIncompleteURI() throw() { } }; /** * \class RDFInternalError RDFException.h * * RDFInternalError is an exception that results from an internal * error in the RDF store. */ class RDFInternalError : virtual public RDFException { public: RDFInternalError(QString message, QString data = "") throw() : RDFException(message, data) { } RDFInternalError(QString message, const Uri &data) throw() : RDFException(message, data) { } virtual ~RDFInternalError() throw() { } }; /** * \class RDFUnsupportedError RDFException.h * * RDFUnsupportedError is an exception that results from an attempt to * use a feature that is not supported or not configured in the * current build. */ class RDFUnsupportedError : virtual public RDFException { public: RDFUnsupportedError(QString message, QString data = "") throw() : RDFException(message, data) { } RDFUnsupportedError(QString message, const Uri &data) throw() : RDFException(message, data) { } virtual ~RDFUnsupportedError() throw() { } }; /** * \class RDFTransactionError RDFException.h * * RDFTransactionError is an exception that results from incorrect use * of a Transaction, for example using a Transaction object after it * has been committed. */ class RDFTransactionError : virtual public RDFException { public: RDFTransactionError(QString message, QString data = "") throw() : RDFException(message, data) { } virtual ~RDFTransactionError() throw() { } }; /** * \class RDFDuplicateImportException RDFException.h * * RDFDuplicateImportException is an exception that results from an * import into a store from an RDF document in ImportFailOnDuplicates * mode, where the document contains a triple that already exists in * the store. */ class RDFDuplicateImportException : virtual public RDFException { public: RDFDuplicateImportException(QString message, QString data = "") throw() : RDFException(message, data) { } RDFDuplicateImportException(QString message, const Triple &t) throw() : RDFException(message, t) { } virtual ~RDFDuplicateImportException() throw() { } }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/Store.h0000644000000000000000000002523213111512442020027 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_STORE_H_ #define _DATAQUAY_STORE_H_ #include "Triple.h" #include #include #include #include #include namespace Dataquay { /// A mapping from key to node, used to list results for a set of result keys. typedef QHash Dictionary; /// A list of Dictionary types, used to contain a sequence of query results. typedef QList ResultSet; enum ChangeType { AddTriple, RemoveTriple }; /// An add or remove operation specified by add/remove token and triple. typedef QPair Change; /// A sequence of add/remove operations such as may be enacted by a transaction. typedef QList ChangeSet; /** * \class Store Store.h * * Store is an abstract interface for Dataquay RDF data stores. */ class Store { public: /** * Add a triple to the store. Return false if the triple was * already in the store. (Dataquay does not permit duplicate * triples in a store.) Throw RDFException if the triple can not * be added for some other reason. */ virtual bool add(Triple t) = 0; /** * Remove a triple from the store. If some nodes in the triple are * Nothing nodes, remove all matching triples. Return false if no * matching triple was found in the store. Throw RDFException if * removal failed for some other reason. */ virtual bool remove(Triple t) = 0; /** * Atomically apply the sequence of add/remove changes described * in the given ChangeSet. Throw RDFException if any operation * fails for any reason (including duplication etc). */ virtual void change(ChangeSet changes) = 0; /** * Atomically apply the sequence of add/remove changes described * in the given ChangeSet, in reverse (ie removing adds and * adding removes, in reverse order). Throw RDFException if any * operation fails for any reason (including duplication etc). */ virtual void revert(ChangeSet changes) = 0; /** * Return true if the store contains the given triple, false * otherwise. Throw RDFException if the triple is not complete or if * the test failed for any other reason. */ virtual bool contains(Triple t) const = 0; /** * Return all triples matching the given wildcard triple. A node * of type Nothing in any part of the triple matches any node in * the data store. Return an empty list if there are no matches; may * throw RDFException if matching fails in some other way. */ virtual Triples match(Triple t) const = 0; /** * Run a SPARQL query against the store and return its results. * Any prefixes added previously using addQueryPrefix will be * available in this query without needing to be declared in the * SPARQL given here (equivalent to writing "PREFIX prefix: " * for each prefix,uri pair set with addPrefix). * * May throw RDFException. * * Note that the RDF store must have an absolute base URI (rather * than the default "#") in order to perform queries, as relative * URIs in the query will be interpreted relative to the query * base rather than the store and without a proper base URI there * is no way to override that internally. */ virtual ResultSet query(QString sparql) const = 0; /** * Given a triple in which any two nodes are specified and the * other is a wildcard node of type Nothing, return a node that * can be substituted for the Nothing node in order to complete a * triple that exists in the store. If no matching triple can be * found, return a null node. If more than one triple matches, * the returned value may arbitrarily be from any of them. May * throw RDFException. */ virtual Node complete(Triple t) const = 0; /** * Return a triple from the store that matches the given wildcard * triple, or the empty triple if none matches. A node of type * Nothing in any part of the triple matches any node in the data * store. If more than one triple matches, the returned value may * arbitrarily be any of them. May throw RDFException. */ virtual Triple matchOnce(Triple t) const = 0; /** * Run a SPARQL query against the store and return the node of * the first result for the given query binding. This is a * shorthand for use with queries that are only expected to have * one result. May throw RDFException. */ virtual Node queryOnce(QString sparql, QString bindingName) const = 0; /** * Get a new URI, starting with the given prefix (e.g. ":event_"), * that does not currently exist within this store. The URI will * be prefix expanded. */ virtual Uri getUniqueUri(QString prefix) const = 0; /** * Create and return a new blank node. This node can only be * referred to using the given Node object, and only during its * lifetime within this instance of the store. */ virtual Node addBlankNode() = 0; /** * Expand the given URI (which may use local namespaces) and * prefix-expand it, returning the result as a Uri. (The Uri * class cannot be used to store URIs that have unexpanded * namespace prefixes.) * * The set of available prefixes for expansion depends on the * subclass implementation. See, for example, * BasicStore::addPrefix. */ virtual Uri expand(QString uri) const = 0; /** * Export the store to an RDF/TTL file with the given filename. * If the file already exists, it will if possible be overwritten. * May throw RDFException, FileOperationFailed, FailedToOpenFile, * etc. * * Note that unlike import (which takes a URL argument), save * takes a simple filename with no file:// prefix. */ virtual void save(QString filename) const = 0; /** * ImportDuplicatesMode determines the outcome when an import * operation encounters a triple in the imported data set that * already exists in the store. * * ImportIgnoreDuplicates: Any duplicate of a triple that is * already in the store is discarded without comment. * * ImportFailOnDuplicates: Import will fail with an * RDFDuplicateImportException if any duplicate of a triple * already in the store is found, and nothing will be imported. * * ImportPermitDuplicates: No tests for duplicate triples will be * carried out, and the behaviour when duplicates are imported * will depend on the underlying store implementation (which may * merge them or store them as separate duplicate triples). This * is usually inadvisable: besides its unpredictability, this * class does not generally handle duplicate triples well in other * contexts. */ enum ImportDuplicatesMode { ImportIgnoreDuplicates, ImportFailOnDuplicates, ImportPermitDuplicates }; /** * Import the RDF document found at the given URL into the current * store (in addition to its existing contents). Its behaviour * when a triple is encountered that already exists in the store * is controlled by the ImportDuplicatesMode. * * May throw RDFException or RDFDuplicateImportException. * * Note that the URL must be a URL, not just a filename * (i.e. local files need the file: prefix). * * If format is specified, it will be taken as the RDF parse * format (e.g. ntriples). The set of supported format strings * depends on the underlying RDF library configuration. The * default is to guess the format if possible. */ virtual void import(QUrl url, ImportDuplicatesMode idm, QString format = "") = 0; /** * Feature defines the set of optional features a Store * implementation may support. Code that uses Store should check * that the features it requires are available before trying to * make use of them. * * ModifyFeature: The store can be modified (triples can be added * to it). All current Store implementations support this feature. * * QueryFeature: The store supports SPARQL queries through the * query and queryOnce methods. A store that does not support * queries will throw RDFUnsupportedError when these functions are * called. * * RemoteImportFeature: The store can import URLs that represent * network resources as well as URLs referring to files on the * local disc. The extent to which this feature is actually * available may also depend on the configuration of the * underlying RDF library. A store that does not support remote * URLs will fail as if the resource was absent, when asked to * load one. */ enum Feature { ModifyFeature, QueryFeature, RemoteImportFeature }; typedef QSet Features; /** * Retrieve the set of optional features supported by this Store * implementation. */ virtual Features getSupportedFeatures() const = 0; protected: virtual ~Store() { } }; } QDataStream &operator<<(QDataStream &out, const Dataquay::ChangeType &); QDataStream &operator>>(QDataStream &in, Dataquay::ChangeType &); #endif sonic-visualiser-3.0.3/dataquay/dataquay/Transaction.h0000644000000000000000000001065513111512442021223 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRANSACTION_H_ #define _DATAQUAY_TRANSACTION_H_ #include "Store.h" namespace Dataquay { /** * \class Transaction Transaction.h * * Transaction is an abstract interface for classes that read and * write an RDF Store within the context of an atomic operation such * as an editing command. The Transaction interface provides the same * editing operations as the Store interface; it subclasses from Store * and may be interchanged with Store in most contexts. To obtain a * Transaction, use TransactionalStore. */ class Transaction : public Store { public: /** * Delete this transaction object. You must either commit or roll * back the transaction before deleting it. * * The destructor will throw RDFTransactionError if the * transaction has been used but not committed or rolled back. * Such a situation indicates a straightforward coding oversight: * fix the code, rather than catching the exception. */ virtual ~Transaction() { } /** * Commit this transaction. Changes made during the transaction * will be committed to the store, atomically with respect to * other active transactions. * * You should not attempt to use the Transaction object again * (except to call getChanges or to delete it) after this call is * made. Any further call to the transaction's Store interface * will throw an RDFTransactionError. */ virtual void commit() = 0; /** * Roll back this transaction. All changes made during the * transaction will be discarded. * * You should not attempt to use the Transaction object again * (except to delete it) after this call is made. Any further * call to the transaction's Store interface will throw an * RDFTransactionError. */ virtual void rollback() = 0; /** * Return the ChangeSet committed in this transaction. If the * transaction has not yet been committed (or has been rolled * back), this will be empty. * * (After a transaction has been committed, you can in principle * revert it in its entirety by calling Store::revert() with this * change set.) */ virtual ChangeSet getCommittedChanges() const = 0; /** * Return the ChangeSet for this transaction to date. This * returns all changes provisionally made (but not necessarily * committed) during the transaction. * * If the transaction has been rolled back, this will return the * changes that were accumulated prior to the roll back, i.e. the * changes that were then rolled back. * * If the transaction has been committed, this will return the * same ChangeSet as getCommittedChanges(). */ virtual ChangeSet getChanges() const = 0; protected: Transaction() { } private: Transaction(const Transaction &); Transaction &operator=(const Transaction &); }; extern Transaction *const NoTransaction; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/TransactionalStore.h0000644000000000000000000001667013111512442022560 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRANSACTIONAL_STORE_H_ #define _DATAQUAY_TRANSACTIONAL_STORE_H_ #include "Transaction.h" namespace Dataquay { /** * \class TransactionalStore TransactionalStore.h * * TransactionalStore is an RDF data store implementing the Store * interface, providing transaction support as a wrapper around a * non-transactional store such as a BasicStore. * * Write access to the store is permitted only in the context of a * transaction. If you call a modifying function directly on * TransactionalStore, the store will either throw RDFException (if * set to NoAutoTransaction) or create a single-use Transaction object * for the duration of that modification (if set to AutoTransaction). * Note that the latter behaviour will deadlock if a transaction is in * progress already. * * Read access may be carried out through a Transaction, in which case * the read state will reflect the changes made so far in that * transaction, or directly on the TransactionalStore, in which case * the read will be isolated from any pending transaction. * * Call startTransaction to obtain a new Transaction object and start * its transaction; use the Transaction's Store interface for all * accesses associated with that transaction; call commit on the * Transaction object once done, to finish the transaction, and then * delete the object; or call Transaction::rollback() if you decide * you do not wish to commit it. * * TransactionalStore is thread-safe. * *!!! ... but the individual Transactions that you get from it are _not_ thread-safe -- document this (it's probably acceptable) or fix it */ class TransactionalStore : public QObject, public Store { Q_OBJECT public: /** * DirectWriteBehaviour controls how TransactionalStore responds * when called directly (not through a Transaction) for a write * operation (add, remove, change, or revert). * * NoAutoTransaction (the default) means that an RDF exception * will be thrown whenever a write is attempted without a * transaction. * * AutoTransaction means that a Transaction object will be * created, used for the single access, and then closed. This may * cause a deadlock if another transaction is already ongoing * elsewhere. */ enum DirectWriteBehaviour { NoAutoTransaction, AutoTransaction }; /** * Create a TransactionalStore operating on the given (presumably * non-transactional) data store. * * Nothing in the code prevents the given _underlying_ store being * used non-transactionally elsewhere at the same time. Don't do * that: once you have set up a transactional store, you should * use it for all routine accesses to the underlying store. */ TransactionalStore(Store *store, DirectWriteBehaviour dwb = NoAutoTransaction); /** * Delete the TransactionalStore. This does _not_ delete the * underlying Store that is being wrapped (the one that was passed * to the constructor). */ ~TransactionalStore(); /** * Start a transaction and obtain a Transaction through which to * carry out its operations. Once the transaction is complete, * you must call commit on the Transaction object to finish the * transaction, and then you must delete the object. */ Transaction *startTransaction(); // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; signals: /** * Emitted after a transaction has been committed. Note that the * transaction lock on the store is unlocked before the signal is * emitted, so that in a multi-threaded context it is possible * that other users of the store may have carried out further * transactions before this signal can be acted on. */ void transactionCommitted(const ChangeSet &cs); /** * Emitted after a transaction has been committed. Note that the * transaction lock on the store is unlocked before the signal is * emitted, so that in a multi-threaded context it is possible * that other users of the store may have carried out further * transactions before this signal can be acted on. */ void transactionCommitted(); private: class D; D *m_d; class TSTransaction : public Transaction { public: // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; // Transaction interface void commit(); void rollback(); ChangeSet getCommittedChanges() const; ChangeSet getChanges() const; TSTransaction(TransactionalStore::D *td); virtual ~TSTransaction(); private: TSTransaction(const TSTransaction &); TSTransaction &operator=(const TSTransaction &); class D; D *m_d; }; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/Triple.h0000644000000000000000000001113113111512442020163 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRIPLE_H_ #define _DATAQUAY_TRIPLE_H_ #include "Node.h" namespace Dataquay { /** * \class Triple Triple.h * * Triple represents an RDF statement made up of three Node objects. */ class Triple { public: /** * Construct a triple of three Nothing nodes. */ Triple() { } /** * Construct a triple of the three given nodes. * * Our triples may contain anything, including the Nothing node * type for undefined elements (used in wildcard matching, etc). * * However, in order to be inserted in the RDF store, a triple * must have either URI or Blank type for its first (or subject) * node, URI for its second (or predicate) node, and either URI, * Blank, or Literal type for its third (or object) node. */ Triple(Node _a, Node _b, Node _c) : a(_a), b(_b), c(_c) { } ~Triple() { } /** * Return the subject node. This is synonymous with accessing the * data member a. */ Node subject() { return a; } /** * Return the predicate node. This is synonymous with accessing * the data member b. */ Node predicate() { return b; } /** * Return the object node. This is synonymous with accessing the * data member c. */ Node object() { return c; } bool operator<(const Triple &t) const { if (a != t.a) return a < t.a; if (b != t.b) return b < t.b; if (c != t.c) return c < t.c; return false; } Node a; Node b; Node c; }; bool operator==(const Triple &a, const Triple &b); bool operator!=(const Triple &a, const Triple &b); QDataStream &operator<<(QDataStream &out, const Triple &); QDataStream &operator>>(QDataStream &in, Triple &); std::ostream &operator<<(std::ostream &out, const Triple &); QTextStream &operator<<(QTextStream &out, const Triple &); /// A list of RDF triples. class Triples : public QList { public: /** * Return true if the two Triples lists contain the same elements. * Triples is an ordered list, so operator== returns true only if * the two lists have the same elements in the same order; this * test is independent of order (although not independent of * number, in the case of duplicate triples) and so may be more * meaningful in some cases. */ bool matches(const Triples &other) const { if (this == &other) return true; if (size() != other.size()) return false; if (size() < 2) return QList::operator==(other); // Triple has operator< but not qHash, hence use QMap rather than QSet QMap a, b; foreach (Triple t, *this) ++a[t]; foreach (Triple t, other) ++b[t]; return a == b; } Nodes subjects() { Nodes result; foreach (Triple t, *this) result.push_back(t.a); return result; } Nodes predicates() { Nodes result; foreach (Triple t, *this) result.push_back(t.b); return result; } Nodes objects() { Nodes result; foreach (Triple t, *this) result.push_back(t.c); return result; } }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/Uri.h0000644000000000000000000001231713111512442017472 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_URI_H_ #define _DATAQUAY_URI_H_ namespace Dataquay { class Uri; } // Declare this early, to avoid any problems with instantiation order // arising from inclusion "races" extern unsigned int qHash(const Dataquay::Uri &u); #include #include #include #include class QDataStream; class QTextStream; class QVariant; namespace Dataquay { /** * Uri represents a single URI. It is a very thin wrapper around a * string. Its purpose is to allow us to distinguish between * abbreviated URIs (CURIEs) which may be subject to prefix expansion * (represented by strings) and full URIs (represented by Uri). * * In terms of the Turtle syntax, anything written within angle * brackets is a Uri, while a bare string in URI context is not: it * should be stored as a QString and converted to a Uri using * Store::expand(). For example, is * a Uri, while foaf:name is just a string. Never store the latter * form in a Uri object without expanding it first. * * Dataquay uses Uri in preference to QUrl because the latter is * relatively slow to convert to and from string forms. Uri imposes * no overhead over a string, it simply aids type safety. */ class Uri { public: /** * Construct an empty (invalid, null) URI. */ Uri() { } /** * Construct a URI from the given string, which is expected to * contain the text of a complete well-formed absolute URI. * * As special cases, file: URIs are allowed to be relative * ("file:x" will be expanded to "file://x" automatically) and "a" * will be expanded to the rdf:type URI. * * This will throw RDFIncompleteURI if given an incomplete or * relative URI, so use care when constructing Uri objects from * unvalidated input. Call isComplete() if you wish to test * whether a URI string will be accepted before constructing. * * To construct a Uri from an abbreviated or relative URI via * prefix or base expansion, use Store::expand(). * * This constructor is intentionally marked explicit; no silent * conversion is available. */ explicit Uri(const QString &s) : m_uri(s) { checkComplete(); } /** * Construct a URI from the given QUrl, which is expected to * contain a complete well-formed URI. May throw * RDFIncompleteURI. */ explicit Uri(const QUrl &u) : m_uri(u.toString()) { checkComplete(); } ~Uri() { } inline QString toString() const { return m_uri; } inline QUrl toUrl() const { return QUrl(m_uri); } inline int length() const { return m_uri.length(); } QString scheme() const; bool operator==(const Uri &u) const; inline bool operator!=(const Uri &u) const { return !operator==(u); } inline bool operator<(const Uri &u) const { return m_uri < u.m_uri; } inline bool operator>(const Uri &u) const { return u < *this; } /** * Return true if the given string contains a complete URI, * i.e. if it is possible to construct a Uri object from it. */ static bool isCompleteUri(QString s); static QString metaTypeName(); static int metaTypeId(); /** * Return true if the given variant has metatype metatypeId(). */ static bool hasUriType(const QVariant &); /** * Return the rdf:type URI. */ static Uri rdfTypeUri(); private: void checkComplete(); QString m_uri; static bool canBeComplete(QString &s); }; typedef QList UriList; QDataStream &operator<<(QDataStream &out, const Uri &); QDataStream &operator>>(QDataStream &in, Uri &); std::ostream &operator<<(std::ostream &out, const Uri &); QTextStream &operator<<(QTextStream &out, const Uri &); } Q_DECLARE_METATYPE(Dataquay::Uri) #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ContainerBuilder.h0000644000000000000000000002026613111512442024641 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_CONTAINER_BUILDER_H_ #define _DATAQUAY_CONTAINER_BUILDER_H_ #include #include #include #include namespace Dataquay { /** * \class ContainerBuilder ContainerBuilder.h * * ContainerBuilder is a utility class which assists with storage of * arbitrary container objects into variant objects and subsequently * retrieving them into lists. * * Given types T and Container (where Container is typically something * like QList), ContainerBuilder can convert a QVariantList holding * type T into a QVariant holding Container, and back again. */ class ContainerBuilder { public: /** * Retrieve the single global instance of ContainerBuilder. */ static ContainerBuilder *getInstance(); /** * ContainerKind describes the sort of behaviour a container * displays with regard to ordering and structure. A container of * kind SequenceKind is externally ordered (order must be * preserved when serialising, for example); kind SetKind is * unordered or internally ordered (its ordering does not need to * be described). */ enum ContainerKind { UnknownKind = 0, SequenceKind, // e.g. list SetKind // e.g. set // perhaps also something for maps }; /** * Register Container as a container of kind ContainerKind holding * type T. T must be something capable of being stored in a * QVariant -- so typically a primitive type, a Qt utility type * such as QString, or a pointer type. Both T and Container must * be registered as Qt metatypes using qRegisterMetaType. * * The arguments typeName and containerName give the textual names * for the types T and Container; these must be the same as were * used when calling qRegisterMetaType. * * For example, to register QStringList: * * registerContainer * ("QString", "QStringList", SequenceKind); */ template void registerContainer(QString typeName, QString containerName, ContainerKind kind) { registerContainerExtractor (typeName, containerName, kind); } /** * Return true if the container named containerName can be * extracted from a variant. This is the case if containerName * was the name of a container provided to an earlier call to * registerContainer. */ bool canExtractContainer(QString containerName) { return m_containerExtractors.contains(containerName); } /** * Return true if the container named containerName can be * injected into a variant. This is the case if containerName was * the name of a container provided to an earlier call to * registerContainer. */ bool canInjectContainer(QString containerName) { return m_containerExtractors.contains(containerName); } /** * Return the typeName that is associated with the given * containerName. That is, when registerContainer was called for * a container with name containerName, typeName is the name that * was given as the first argument of that call. */ QString getTypeNameForContainer(QString containerName) { if (!canExtractContainer(containerName)) return QString(); return m_containerExtractors[containerName]->getTypeName(); } /** * Return the kind of the container with the given containerName. * That is, when registerContainer was called for a container with * name containerName, return the kind that was given as the final * argument of that call. */ ContainerKind getContainerKind(QString containerName) { if (!canExtractContainer(containerName)) return UnknownKind; return m_containerExtractors[containerName]->getKind(); } /** * Extract the named container type from the given variant object * (which must hold that container type) and return a list of * variants containing the individual elements in the container. */ QVariantList extractContainer(QString containerName, const QVariant &v) { if (!canExtractContainer(containerName)) return QVariantList(); return m_containerExtractors[containerName]->extract(v); } /** * Inject the named container type into a new variant object. * Taking a list of variants holding the individual elements in * the container, return a single variant holding the container * itself. */ QVariant injectContainer(QString containerName, const QVariantList &vl) { if (!canInjectContainer(containerName)) return QVariant(); return m_containerExtractors[containerName]->inject(vl); } private: ContainerBuilder() { registerContainer ("QString", "QStringList", SequenceKind); } ~ContainerBuilder() { for (ContainerExtractorMap::iterator i = m_containerExtractors.begin(); i != m_containerExtractors.end(); ++i) { delete *i; } } template void registerContainerExtractor(QString typeName, QString containerName, ContainerKind kind) { m_containerExtractors[containerName] = new ContainerExtractor(typeName, kind); } struct ContainerExtractorBase { virtual ~ContainerExtractorBase() { } virtual QVariantList extract(const QVariant &v) = 0; virtual QVariant inject(const QVariantList &) = 0; virtual QString getTypeName() const = 0; virtual ContainerKind getKind() const = 0; }; template struct ContainerExtractor : public ContainerExtractorBase { ContainerExtractor(QString typeName, ContainerKind kind) : m_typeName(typeName), m_kind(kind) { } virtual QVariantList extract(const QVariant &v) { Container tl = v.value(); QVariantList vl; foreach (const T &t, tl) vl << QVariant::fromValue(t); return vl; } virtual QVariant inject(const QVariantList &vl) { Container tl; foreach (const QVariant &v, vl) tl << v.value(); return QVariant::fromValue(tl); } virtual QString getTypeName() const { return m_typeName; } virtual ContainerKind getKind() const { return m_kind; } QString m_typeName; ContainerKind m_kind; }; typedef QHash ContainerExtractorMap; ContainerExtractorMap m_containerExtractors; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectBuilder.h0000644000000000000000000003100513111512442024116 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_BUILDER_H_ #define _DATAQUAY_OBJECT_BUILDER_H_ #include #include #include namespace Dataquay { /** * \class ObjectBuilder ObjectBuilder.h * * ObjectBuilder is a singleton object factory capable of constructing * new objects of classes that are subclassed from QObject. Given the * class name as a string, and optionally a parent object, it will * return a new instance of the class. To be capable of construction * using ObjectBuilder, a class must be declared using Q_OBJECT as * well as subclassed from QObject. * * All candidate object classes need to be registered with the builder * before they can be constructed. The only class that ObjectBuilder * is able to construct without registration is QObject itself. * * This class permits code to construct new objects dynamically, * without needing to know anything about them except for their class * names, and without needing their definitions to be visible. (The * definitions must be visible when the object classes are registered, * but not when the objects are constructed.) */ class ObjectBuilder { public: /** * Retrieve the single global instance of ObjectBuilder. */ static ObjectBuilder *getInstance(); /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a zero-argument constructor. * * For example, registerClass() declares that QAction is * a subclass of QObject that may be built by calling * QAction::QAction(). * * A subsequent call to ObjectBuilder::build("QAction") would * return a new QAction built with that constructor (since * "QAction" is the class name of QAction returned by its meta * object). */ template void registerClass() { m_builders[T::staticMetaObject.className()] = new Builder0(); } /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a single-argument constructor whose * argument is of pointer-to-Parent type, where Parent is also a * subclass of QObject. * * For example, registerClass() declares that * QWidget is a subclass of QObject that may be built by calling * QWidget::QWidget(QWidget *parent). * * A subsequent call to ObjectBuilder::build("QWidget", parent) * would return a new QWidget built with that constructor (since * "QWidget" is the class name of QWidget returned by its meta * object). */ template void registerClass() { m_builders[T::staticMetaObject.className()] = new Builder1(); } /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a zero-argument constructor. Also * declare pointerName to be the meta type name for pointers to * type T, such that QVariant can be used to store such pointers. * * For example, registerClass("QAction*") declares that * QAction is a subclass of QObject that may be built by calling * QAction::QAction(), and that "QAction*" has been registered * (using qRegisterMetaType) as the meta type name for * pointer-to-QAction. * * A subsequent call to ObjectBuilder::build("QAction") would * return a new QAction built with that constructor (since * "QAction" is the class name of QAction returned by its meta * object). */ template void registerClass(QString pointerName) { QString className = T::staticMetaObject.className(); m_cpmap[className] = pointerName; m_pcmap[pointerName] = className; m_builders[className] = new Builder0(); registerExtractor(pointerName); } /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a single-argument constructor whose * argument is of pointer-to-Parent type, where Parent is also a * subclass of QObject. Also declare pointerName to be the meta * type name for pointers to type T, such that QVariant can be * used to store such pointers. * * For example, registerClass("QWidget*") * declares that QWidget is a subclass of QObject that may be * built by calling QWidget::QWidget(QWidget *parent), and that * "QWidget*" has been registered (using qRegisterMetaType) as the * meta type name for pointer-to-QWidget. * * A subsequent call to ObjectBuilder::build("QWidget", parent) * would return a new QWidget built with that constructor (since * "QWidget" is the class name of QWidget returned by its meta * object). */ template void registerClass(QString pointerName) { QString className = T::staticMetaObject.className(); m_cpmap[className] = pointerName; m_pcmap[pointerName] = className; m_builders[className] = new Builder1(); registerExtractor(pointerName); } /** * Register type T, a subclass of QObject, as an interface (a pure * virtual class) and pointerName to be the meta type name for * pointers to type T, such that QVariant can be used to store * such pointers. * * For example, registerClass("Command*") declares that * Command is a subclass of QObject that may not be built directly * but that "Command*" has been registered (using * qRegisterMetaType) as the meta type name for * pointer-to-QAction. * * A subsequent call to ObjectBuilder::extract("Command*", v) * would extract a pointer of type Command* from the QVariant v. */ template void registerInterface(QString pointerName) { QString className = T::staticMetaObject.className(); m_cpmap[className] = pointerName; m_pcmap[pointerName] = className; registerExtractor(pointerName); } /** * Return true if the class whose class name (according to its * meta object) is className has been registered for building. */ bool knows(QString className) { return m_builders.contains(className); } /** * Return a new object whose class name (according to its meta * object) is className, with the given parent (cast * appropriately) passed to its single argument constructor. */ QObject *build(QString className, QObject *parent) { if (!knows(className)) return 0; return m_builders[className]->build(parent); } /** * Return a new object whose class name (according to its meta * object) is className, constructed with no parent. */ QObject *build(QString className) { if (!knows(className)) return 0; return m_builders[className]->build(0); } /** * Return true if the class whose pointer has meta-type name * pointerName has been registered with that pointer name * (i.e. using one of the registerClass(pointerName) methods or * registerInterface). */ bool canExtract(QString pointerName) { return m_extractors.contains(pointerName); } /** * Return true if the class whose pointer has meta-type name * pointerName has been registered with that pointer name * (i.e. using one of the registerClass(pointerName) methods or * registerInterface). */ bool canInject(QString pointerName) { return m_extractors.contains(pointerName); } /** * Provided the given pointerName has been registered using one of * the registerClass(pointerName) methods or registerInterface, * take the given variant containing that pointer type and extract * and return the pointer. */ QObject *extract(QString pointerName, QVariant &v) { if (!canExtract(pointerName)) return 0; return m_extractors[pointerName]->extract(v); } /** * Provided the given pointerName has been registered using one of * the registerClass(pointerName) methods or registerInterface, * take the given pointer and stuff it into a variant, returning * the result. */ QVariant inject(QString pointerName, QObject *p) { if (!canInject(pointerName)) return QVariant(); return m_extractors[pointerName]->inject(p); } /** * Provided the given pointerName has been registered using one of * the registerClass(pointerName) methods, return the name of the * class that was used as the template argument for that method. */ QString getClassNameForPointerName(QString pointerName) const { if (m_pcmap.contains(pointerName)) return m_pcmap[pointerName]; return ""; } /** * If the class whose class name (according to its meta object) is * className has been registered using one of the * registerClass(pointerName) methods, return the pointerName that * was passed to that method. */ QString getPointerNameForClassName(QString className) const { if (m_cpmap.contains(className)) return m_cpmap[className]; return ""; } private: ObjectBuilder() { registerClass("QObject*"); } ~ObjectBuilder() { for (BuilderMap::iterator i = m_builders.begin(); i != m_builders.end(); ++i) { delete *i; } for (ExtractorMap::iterator i = m_extractors.begin(); i != m_extractors.end(); ++i) { delete *i; } } template void registerExtractor(QString pointerName) { m_extractors[pointerName] = new Extractor(); } template void registerExtractor(QString pointerName, QString listName) { m_extractors[pointerName] = new Extractor(); } struct BuilderBase { virtual ~BuilderBase() { } virtual QObject *build(QObject *) = 0; }; template struct Builder0 : public BuilderBase { virtual QObject *build(QObject *) { return new T(); } }; template struct Builder1 : public BuilderBase { virtual QObject *build(QObject *p) { return new T(qobject_cast(p)); } }; typedef QHash BuilderMap; BuilderMap m_builders; struct ExtractorBase { virtual ~ExtractorBase() { } virtual QObject *extract(const QVariant &v) = 0; virtual QVariant inject(QObject *) = 0; }; template struct Extractor : public ExtractorBase { virtual QObject *extract(const QVariant &v) { return v.value(); } virtual QVariant inject(QObject *o) { Pointer p = qobject_cast(o); if (p) return QVariant::fromValue(p); else return QVariant(); } }; typedef QHash ExtractorMap; ExtractorMap m_extractors; QHash m_cpmap; QHash m_pcmap; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectLoader.h0000644000000000000000000002662413111512442023751 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_LOADER_H_ #define _DATAQUAY_OBJECT_LOADER_H_ #include "../Node.h" #include #include class QObject; namespace Dataquay { class Store; class TypeMapping; /** * \class ObjectLoader ObjectLoader.h * * ObjectLoader constructs objects corresponding to nodes in the RDF * store and sets properties on those objects corresponding to the * node's RDF properties. The class of each object is based on the * node's RDF type. TypeMapping is used to relate node types to * object classes, and ObjectBuilder is used to construct the objects * (which must be subclasses of QObject). * * In addition to some specification of which nodes to load, * ObjectLoader methods may also take a reference to a NodeObjectMap * in which is stored the object corresponding to each loaded node. * This map may be used by the caller as a persistent record of * node-object relationships, as it is updated on each new * ObjectLoader call with any unaffected nodes remaining unchanged in * the map. * * By default, ObjectLoader loads only those objects passed in to each * load() or reload() call. ObjectLoader sets as many QObject * properties on each object as possible, given the information * available to it: * * \li Properties with non-object-type values will be assigned from * RDF properties with literal value nodes, provided Node::toVariant * is able to carry out the conversion from literal; * * \li Properties with object-type values will be assigned from RDF * properties with URI value nodes, provided those URI nodes have * corresponding objects available to ObjectLoader, i.e. also in the * set being loaded or in the NodeObjectMap. (However, see also * FollowObjectProperties below.) * * \li Properties whose value types are sequenced containers such as * QList or std::vector will be assigned from RDF properties with * sequence values, provided their container types have been * registered with ContainerBuilder; * * \li Properties whose value types are set containers such as QSet * will be assigned from the aggregation of all RDF properties with * the appropriate subject and predicate, provided their container * types have been registered with ContainerBuilder. * * Some behaviour can be adjusted using setFollowPolicy and * setAbsentPropertyPolicy, as follows: * * \li \c FollowPolicy is a set of flags describing how ObjectLoader * should recurse from each object to those related to it. It can be * used to cause ObjectLoader to load more objects than are explicitly * requested. The flag \c FollowObjectProperties causes objects to be * loaded whenever they are required as the values of properties on * other objects in the loaded set. The flags \c FollowParent, \c * FollowSiblings and \c FollowChildren cause object tree * relationships to be followed up, using the "parent" and "follow" * properties with the TypeMapping's relationship prefix to determine * family relationships. * * \li \c AbsentPropertyPolicy determines how ObjectLoader handles * properties of an object that have no definition in the RDF store. * These properties are ignored if IgnoreAbsentProperties (the * default) is set, but if ResetAbsentProperties is set ObjectLoader * will attempt to reset each property to its default value based on * the value found in a freshly-constructed default instance of the * object class in question. * * The load procedure follows a defined order: * * \li The requested objects, and any relatives required by the * FollowPolicy, are constructed with their default properties (no * properties assigned from RDF yet). If the FollowPolicy includes * FollowParents or FollowSiblings, these will be followed before the * current object is loaded; if FollowChildren, they will be followed * afterwards; * * \li After all objects have been constructed, those properties that * have "simple" RDF literal values are assigned for each object; * * \li Next any immediate callbacks registered with addLoadCallback * are called for each object that has been loaded (i.e. any object * that was either constructed or assigned to). Use immediate * callbacks if you need to do any further initialisation work on an * object before its neighbours or property objects are loaded. * * \li After all "simple" properties have been assigned, any further * properties are set (those with container and object types); * * \li Finally, any final callbacks registered with addLoadCallback * are called for each object that has been loaded (i.e. any object * that was either constructed or assigned to). * * Note that ObjectLoader always maintains a one-to-one correspondence * between QObjects and the RDF nodes that it loads as QObjects. In * particular, where multiple objects have properties that refer to * the same URI, no more than a single value object will be * constructed and the same value object will be assigned to all of * those objects' properties. This implies that objects to be loaded * using ObjectLoader should be designed so that they do not attempt * to "own" (control lifecycle for) any other QObjects that appear as * their properties. Ownership must be maintained separately from the * property relationship. * * ObjectLoader is re-entrant, but not thread-safe. */ class ObjectLoader { public: /// Map from RDF node to object typedef QHash > NodeObjectMap; /** * Create an ObjectLoader ready to load objects from the given RDF * store. */ ObjectLoader(Store *s); ~ObjectLoader(); Store *getStore(); void setTypeMapping(const TypeMapping &); const TypeMapping &getTypeMapping() const; //!!! document this (after ObjectStorer) -- or pull it into ObjectMapperDefs enum FollowOption { FollowNone = 0, // the default FollowObjectProperties = 1, FollowParent = 2, FollowSiblings = 4, FollowChildren = 8 }; typedef int FollowPolicy; void setFollowPolicy(FollowPolicy policy); FollowPolicy getFollowPolicy() const; enum AbsentPropertyPolicy { IgnoreAbsentProperties, ResetAbsentProperties }; void setAbsentPropertyPolicy(AbsentPropertyPolicy policy); AbsentPropertyPolicy getAbsentPropertyPolicy() const; /** * Construct a QObject based on the properties of the given object * URI in the object mapper's store. The type of class created * will be calculated from the rdf:type for the URI, using the * current TypeMapping (see TypeMapping::getClassForTypeUri). * * Use caution in calling this method when the FollowPolicy is set * to anything other than FollowNone. Other objects may be loaded * when following connections from the given node according to the * current FollowPolicy, but only the object initially requested * is actually returned from the function -- other objects loaded * may be only accessible as parent/child or properties of this * node, or in some cases (e.g. FollowSiblings) may even be * inaccessible to the caller and be leaked. */ QObject *load(Node node); /** * For each node of the given RDF type found in the store, * construct a corresponding QObject, returning the objects. */ QObjectList loadType(Uri type); /** * For each node of the given RDF type found in the store, * construct a corresponding QObject, updating the map with all * resulting node-object correspondences and returning the * objects. */ QObjectList loadType(Uri type, NodeObjectMap &map); /** * Examine each of the nodes passed in, and if there is no * corresponding object in the node-object map, load the node as a * new QObject and place it in the map; if there is a * corresponding object in the node-object map, update it with * current properties from the store. If a node is passed in that * does not exist in the store, delete any object associated with * it from the map. */ void reload(Nodes nodes, NodeObjectMap &map); /** * Load and return an object for each node in the store that can * be loaded. */ QObjectList loadAll(); /** * Load and return an object for each node in the store that can * be loaded, updating the map with all resulting node-object * correspondences. Note that this loads all suitably-typed nodes * found in the store, not the objects found in the map. If there * are nodes in the map which are not found in the store, they * will be ignored (and not deleted from the map). */ QObjectList loadAll(NodeObjectMap &map); struct LoadCallback { /** * An object has been loaded by the given ObjectLoader from * the given RDF node. The node and object will also be found * in the NodeObjectMap, which additionally references any * other objects which have been loaded during this load * sequence. */ virtual void loaded(ObjectLoader *, NodeObjectMap &, Node, QObject *) = 0; }; /** * Type of a load callback. Immediate callbacks are called after * each node's literal properties have been assigned but before * any child, sibling, property etc relationships are followed. * Final callbacks are called after all work has been done on all * nodes and the graph is complete. */ enum LoadCallbackType { ImmediateCallback, FinalCallback }; /** * Register the given callback (a subclass of the abstract * LoadCallback class) as providing a "loaded" callback method * which will be called after each object is loaded. */ void addLoadCallback(LoadCallback *callback, LoadCallbackType type); private slots: void objectDestroyed(QObject *); private: ObjectLoader(const ObjectLoader &); ObjectLoader &operator=(const ObjectLoader &); class D; D *m_d; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectMapper.h0000644000000000000000000002537613111512442023772 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_H_ #define _DATAQUAY_OBJECT_MAPPER_H_ #include "../Node.h" #include "../Store.h" #include "ObjectMapperDefs.h" #include namespace Dataquay { class TransactionalStore; class TypeMapping; /** * \class ObjectMapper ObjectMapper.h * * ObjectMapper manages a set of objects, maintaining a consistent * record of their state in a TransactionalStore by mapping changes in * both directions between objects and store. It uses ObjectStorer to * map objects (derived from QObject) to the store, and then watches * both the objects and the store for changes, applying to the store * any changes in the objects and using ObjectLoader to bring the * objects up to date with any changes in the store. * * See ObjectStorer for details of how objects are mapped to the RDF * store, and ObjectLoader for details of how changes in the RDF store * are mapped back to the objects. * * ObjectMapper watches QObject properties' notify signals to * determine when a property has changed, and uses QObject::destroyed * to determine when an object has been deleted. You can also advise * it of changes using the objectModified slot directly (for example * where a property has no notify signal). * * ObjectMapper requires a TransactionalStore as its backing RDF * store, and uses the TransactionalStore's transactionCommitted * signal to tell it when a change has been made to the store which * should be mapped back to the object structure. * * You must call the commit() method to cause any changes to be * written to the store. This also commits the underlying * transaction. * * Call add() to add a new object to the store (managing it, and also * marking it to be stored on the next commit). ObjectMapper does not * have any other way to find out about new objects, even if they are * properties or children of existing managed objects. * * Alternatively, call manage() to manage an object without marking it * as needing to be written -- implying that the object is known to be * up-to-date with the store already. ObjectMapper will refuse to * manage any object that lacks a uri property, as any objects that * have not previously been mapped will normally need to be add()ed * (which gives them URIs) rather than manage()d. * * It is safe to call add() or manage() with an object that is already * managed; if add() is called with such an object it will be * rescheduled to be stored, but there will be no other effect. * * Call unmanage() to tell ObjectMapper to stop watching an object. * You should not call this when the object is destroyed, unless you * want to ensure that destroying it does not remove it from the * store. Managed objects are automatically monitored for destruction * and removed from the store and unmanaged appropriately. * * ObjectMapper is thread-safe. */ class ObjectMapper : public QObject { Q_OBJECT public: /** * Construct an object mapper backed by the given store. The * mapper is initially managing no objects. * * The store must be a TransactionalStore (rather than for example * a BasicStore) because the object mapper commits each update as * a single transaction and relies on the * TransactionalStore::transactionCommitted signal to learn about * changes in the store. */ ObjectMapper(TransactionalStore *ts); ~ObjectMapper(); /** * Obtain the TransactionalStore that was passed to the * constructor. */ TransactionalStore *getStore(); /** * Supply a TypeMapping object describing the RDF URIs that should * be used to encode each object's property and class names. * Without this, ObjectMapper (or rather its ObjectStorer and * ObjectLoader classes) will generate suitable-looking URIs for * each class and property names. */ void setTypeMapping(const TypeMapping &); /** * Obtain the TypeMapping previously set using setTypeMapping, or * the default (empty) TypeMapping if none has been set. */ const TypeMapping &getTypeMapping() const; /** * Set the policy used to determine whether to give an object a * URI or use a blank node for it. The default is * BlankNodesAsNeeded. */ void setBlankNodePolicy(BlankNodePolicy policy); /** * Retrieve the current policy used to determine whether to give * an object a URI or use a blank node for it. */ BlankNodePolicy getBlankNodePolicy() const; /** * Obtain the RDF node to which the given object has been mapped, * or a null Node if the object has not yet been stored by this * ObjectMapper. */ Node getNodeForObject(QObject *o) const; /** * Obtain the QObject which has been mapped to the given node, or * NULL if the node is not one that has been stored by this * ObjectMapper. */ QObject *getObjectByNode(Node n) const; //!!!doc QObject *load(Node node); //!!!doc QObjectList loadType(Uri type); signals: void committed(); public slots: /** * Add a new object to the store. This tells ObjectMapper to * manage the object, and also marks it to be stored the next time * \ref commit is called. * * You must call \ref add or \ref manage for every new object that * needs to be managed; ObjectMapper does not have any other way * to find out about new objects, even if they are properties or * children of existing managed objects. *!!! above is no longer correct (anything stored or loaded is managed automatically), document */ void add(QObject *); /** * Add a list of new objects to the store. This tells * ObjectMapper to manage the objects, and also marks them to be * stored the next time \ref commit is called. * * You must call \ref add or \ref manage for every new object that * needs to be managed; ObjectMapper does not have any other way * to find out about new objects, even if they are properties or * children of existing managed objects. *!!! above is no longer correct (anything stored or loaded is managed automatically), document */ void add(QObjectList); /** * Tell ObjectMapper to start managing an object. This tells * ObjectMapper to watch the object and commit to the store any * changes that it detects in the object's properties, or when the * object is destroyed. If the object was managed already, * nothing happens. * * This does not mark the object as needing to be written; it * implies that the object is known to be up-to-date with the * store already. ObjectMapper will refuse to manage any object * that lacks a uri property; if your object is a "new" one, you * should use \ref add instead of \ref manage. *!!! above is no longer enough (anything stored or loaded is managed automatically), document */ void manage(QObject *); /** * Tell ObjectMapper to start managing a list of objects. This * tells ObjectMapper to watch the objects and commit to the store * any changes that it detects in the objects' properties, or when * the objects are destroyed. * * Any objects that were managed already are ignored: there is no * harm in passing them more than once, except a small time * penalty. * * This does not mark the objects as needing to be written; it * implies that the objects are known to be up-to-date with the * store already. ObjectMapper will refuse to manage any object * that lacks a uri property; if your object is a "new" one, you * should use \ref add instead of \ref manage. *!!! above is no longer enough (anything stored or loaded is managed automatically), document */ void manage(QObjectList); /** * Tell ObjectMapper to stop managing the given object. */ void unmanage(QObject *); /** * Tell ObjectMapper to stop managing the given objects. */ void unmanage(QObjectList); /** * Commit to the store any changes that have happened to the * currently managed objects since the last commit. * * You need to call this (or commitAndObtain) if you want any * changes to appear in the store. */ void commit(); /** * Commit to the store any changes that have happened to the * currently managed objects since the last commit, and return the * changes committed. * * You need to call this (or commit) if you want any changes to * appear in the store. */ ChangeSet commitAndObtain(); /** * Notify ObjectMapper that the given object has changed. * ObjectMapper automatically watches the notify signals for an * object's properties, but it will not spot any changes that do * not have an associated notify signal. */ void objectModified(QObject *); /** * Notify ObjectMapper that the given object is being destroyed. * This should not normally be necessary, as ObjectMapper * automatically watches the destroyed signals for objects it * manages. */ void objectDestroyed(QObject *); private slots: void transactionCommitted(const ChangeSet &cs); private: ObjectMapper(const ObjectMapper &); ObjectMapper &operator=(const ObjectMapper &); class D; D *m_d; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectMapperDefs.h0000644000000000000000000000411113111512442024554 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_DEFS_H_ #define _DATAQUAY_OBJECT_MAPPER_DEFS_H_ namespace Dataquay { enum BlankNodePolicy { /** * Use blank nodes for objects with no existing URIs that are * not known to be referred to elsewhere. This is the * default. */ PermitBlankObjectNodes, /** * Ensure that every object explicitly stored has a URI. Blank * nodes may still appear as list nodes when storing * containers. */ NoBlankObjectNodes, /** * Never write a blank node: allocate a URI even for list * nodes. */ NeverUseBlankNodes }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectMapperExceptions.h0000644000000000000000000000720413111512442026022 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_EXCEPTIONS_H_ #define _DATAQUAY_OBJECT_MAPPER_EXCEPTIONS_H_ #include #include namespace Dataquay { /** * \class UnknownTypeException ObjectMapperExceptions.h * * UnknownTypeException is an exception thrown by ObjectMapper classes * when asked to load an object from an RDF entity whose type cannot * be mapped to a C++ class type using the current TypeMapping. */ class UnknownTypeException : virtual public std::exception { public: UnknownTypeException(QString type) throw() : m_type(type) { } virtual ~UnknownTypeException() throw() { } virtual const char *what() const throw() { return QString("Unknown type: %1").arg(m_type).toLocal8Bit().data(); } protected: QString m_type; }; /** * \class ConstructionFailedException ObjectMapperExceptions.h * * ConstructionFailedException is an exception that may be thrown by * ObjectMapper classes if a class mapped from an RDF entity type * could not be constructed. */ class ConstructionFailedException : virtual public std::exception { public: ConstructionFailedException(QString type) throw() : m_type(type) { } virtual ~ConstructionFailedException() throw() { } virtual const char *what() const throw() { return QString("Failed to construct type: %1") .arg(m_type).toLocal8Bit().data(); } protected: QString m_type; }; /** * \class NoUriException ObjectMapperExceptions.h * * NoUriException is an exception thrown by ObjectMapper classes when * asked to store a class that is expected to have been assigned a URI * already, if its URI property is absent. */ class NoUriException : virtual public std::exception { public: NoUriException(QString oname, QString cname) throw() : m_oname(oname), m_cname(cname) { } virtual ~NoUriException() throw() { } virtual const char *what() const throw() { return QString("Object of name \"%1\" and class %2 lacks URI") .arg(m_oname).arg(m_cname).toLocal8Bit().data(); } protected: QString m_oname; QString m_cname; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectMapperForwarder.h0000644000000000000000000000477313111512442025644 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_FORWARDER_H_ #define _DATAQUAY_OBJECT_MAPPER_FORWARDER_H_ #include namespace Dataquay { class ObjectMapper; /** * ObjectMapperForwarder notifies ObjectMapper when a QObject is * modified or destroyed. It connects all of the object's property * notify signals and its destroyed signal to itself, and then calls * ObjectMapper methods when they are activated. * * ObjectMapperForwarder is used automatically by ObjectMapper; you do * not normally need to use it yourself. * * The principal motivation for this class is to avoid the * ObjectMapper trying to connect many signals for each of many * managed objects directly to its slots: if the number of such * objects was large, this would be a serious performance bottleneck. */ class ObjectMapperForwarder : public QObject { Q_OBJECT public: ObjectMapperForwarder(ObjectMapper *mapper, QObject *o); private slots: void objectModified(); void objectDestroyed(); private: ObjectMapper *m_mapper; QObject *m_source; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/ObjectStorer.h0000644000000000000000000003357413111512442024023 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_STORER_H_ #define _DATAQUAY_OBJECT_STORER_H_ #include "../Node.h" #include "ObjectMapperDefs.h" #include class QObject; namespace Dataquay { class Store; class TypeMapping; /** * \class ObjectStorer ObjectStorer.h * * ObjectStorer is a storage handler capable of turning objects * derived from QObject into RDF triples in a Store, such that under * the right conditions the original objects can be recreated from the * store by ObjectLoader. * * See also ObjectMapper, for a class which manages a set of objects * and uses ObjectStorer and ObjectLoader to map changes * bidirectionally between object hierarchy and datastore. * * ObjectStorer typically creates a new URI for each object it stores, * based on the object's class name with a unique suffix. (In some * cases -- where an object only exists as the value of a property of * another object and is not referred to elsewhere in the hierarchy -- * it will by default be given a blank node instead of a URI.) The * URI created for an object will be stored in that object as a user * property named "uri" of type Dataquay::Uri. If that property * already exists, ObjectStorer will use its value instead of creating * a new URI; you can exploit this if you wish to override the * generated URI. Note that ObjectStorer cannot handle objects having * a uri property of any type other than Dataquay::Uri. * * For each object, ObjectStorer will write an rdf:type; an RDF * property for each of the QObject properties of the object that have * STORED set to true; and RDF properties identifying the parent and * sibling objects if the object is part of a QObject hierarchy. The * URIs used for the type and these properties can be controlled using * a TypeMapping object. * * ObjectStorer uses Node::fromVariant to convert QObject property * values to RDF literals: see Node::registerDatatype for the means to * add new datatypes. Properties with subclass-of-QObject-pointer * values can be written recursively (see setFollowPolicy); the * default is to write them only if the "value" QObject already has a * URI. ObjectStorer can write properties which have set and sequence * container types (converting sets to multiple RDF properties with * the same subject URI, and sequences to RDF lists) if those types * have been registered with ContainerBuilder. * * Finally, you can register callbacks (using addStoreCallback) to be * called after each object is stored, in case you wish to associate * more information with an object. * * ObjectStorer is primarily intended to provide a simple, open and * extensible storage format for small networks of * application-specific objects. With TypeMapping there is some * flexibility to assist with creating object structures from * arbitrary RDF graphs, and the mechanism has been tested and * optimised to some degree for some millions of triples, but that way * could lie madness. * * ObjectStorer is re-entrant, but not thread-safe. */ class ObjectStorer { public: /** * ObjectNodeMap contains a record of the RDF node used for each * object. This can be filled in a call to store() and passed to * subsequent calls in order to hasten lookup, avoid unnecessary * repeated stores, and ensure consistency for generated URIs. * * Note that, although ObjectStorer places the URI of each object * in its uri property, certain objects may be written using blank * nodes -- those nodes can only be retrieved through this map. * * The caller is responsible for ensuring that any objects * subsequently deleted are also removed from this map. */ typedef QHash ObjectNodeMap; /** * Create an ObjectStorer ready to store objects to the given * datastore. */ ObjectStorer(Store *s); ~ObjectStorer(); /** * Retrieve the store object that was passed to the constructor. */ Store *getStore(); /** * Provide a TypeMapping object, which controls the URIs chosen by * ObjectStorer to represent object types and properties. * Generally if you are using ObjectStorer and ObjectLoader * together, you will want to use the same TypeMapping object with * both. */ void setTypeMapping(const TypeMapping &); /** * Retrieve the current TypeMapping object. */ const TypeMapping &getTypeMapping() const; enum PropertyStorePolicy { /** * Store only properties that differ from default object */ StoreIfChanged, /** * Store all properties (if storable, readable & writable) (default) */ StoreAlways }; /** * Set the policy used to determine whether to store a property. * * If StoreIfChanged, properties will only be written if they * differ in value from those retrieved from a newly-constructed * instance of the object. If StoreAlways, all suitable * properties will be written. The default is StoreAlways. * * StoreIfChanged only works for objects that have been registered * with ObjectBuilder so that a default object can be constructed. * Any other objects will have all suitable properties written. * * In either case, only properties whose QObject property * definitions have all of READ, WRITE, and STORED set to true * will be considered suitable and stored. */ void setPropertyStorePolicy(PropertyStorePolicy policy); /** * Retrieve the current policy used to determine whether to store * a property. */ PropertyStorePolicy getPropertyStorePolicy() const; /** * Set the policy used to determine whether to give an object a * URI or use a blank node for it. * * If BlankNodesAsNeeded (the default), objects will be given * blank nodes if it appears to ObjectStorer that they do not need * URIs. In practice this means that objects which are referred * to because they are properties of other objects and which do * not appear elsewhere in the list of objects being stored, do * not have an existing uri property, and do not have a URI node * allocated in an ObjectNodeMap passed to the store method, will * be assigned blank nodes. * * If NoBlankObjectNodes, all objects written will be given URIs. * These will be drawn from the object's uri property if it exists * and is of Dataquay::Uri type, or else invented uniquely based * on the object's class name. * * If NeverUseBlankNodes, the ObjectStorer will never generate a * blank node -- all objects written will be given URIs, and list * nodes will be given URIs generated from those of their * contents. With this setting, an object graph written twice * using the same object-node map will produce identical RDF * graphs. *!!! ^^^ write a unit test for this, and ensure that it is true * * If you are using BlankNodesAsNeeded but would prefer * ObjectStorer not to use a blank node for a specific object, you * can assign a URI in advance by setting a Dataquay::Uri to its * "uri" property (either a declared property or a user property). * * Note that if a blank node is used for an object, there will be * no way to retrieve that node through the object (no equivalent * of the "uri" property). If you want to refer to the node * subsequently you will need to ensure you provide an * ObjectNodeMap to the store method to retrieve the node that was * generated. */ void setBlankNodePolicy(BlankNodePolicy policy); /** * Retrieve the current policy used to determine whether to give * an object a URI or use a blank node for it. */ BlankNodePolicy getBlankNodePolicy() const; enum FollowOption { FollowNone = 0, // the default FollowObjectProperties = 1, FollowParent = 2, FollowSiblings = 4, FollowChildren = 8 // there is no FollowAll; it generally isn't a good idea //!!! revise this in light of two-step rework }; typedef int FollowPolicy; /** * Set the policy used to determine which objects to store, based * on their relationship to an object whose storage is being * explicitly requested. * * If the policy is FollowNone, only the objects explicitly * requested for storage by being passed as arguments to a store() * method call will be stored. * * If the policy has FollowObjectProperties set, then where an * object has a property that is suitable for storing (see * setPropertyStorePolicy) and whose type is a pointer-to-object * class for some subclass of QObject, the object referred to by * that property will be stored. Otherwise, such properties will * only be written where their objects have URIs available already * (either because they exist in the object-node map or because * they have a QObject property of name uri and Dataquay::Uri * type). * * If the policy has FollowParent set, then where an object has a * QObject parent, that parent will also be written. * * If the policy has FollowSiblings set, then where an object has * QObject siblings (i.e. the object and those other objects share * a parent), those siblings will also be written. * * If the policy has FollowChildren set, then where an object has * QObject children, those children will also be written. */ void setFollowPolicy(FollowPolicy policy); FollowPolicy getFollowPolicy() const; /** * Store the given object and return its URI in the datastore. * Other objects may also be stored, depending on the FollowPolicy * setting. * * The object will be stored even if it already exists in the * store. No other data will be changed; for example, if other * triples already exist with this object's URI as subject, they * will be left alone. See setBlankNodePolicy for details of the * assignment of nodes to objects. */ Uri store(QObject *o); /** * Store the given object; add the object and its node to the * ObjectNodeMap, and return its URI in the datastore. Other * objects may also be stored, depending on the FollowPolicy * setting, and will be recorded in the ObjectNodeMap as well. * * The object will be stored even if it already exists in the * store. No other data will be changed; for example, if other * triples already exist with this object's URI as subject, they * will be left alone. See setBlankNodePolicy for details of the * assignment of nodes to objects. */ Uri store(QObject *o, ObjectNodeMap &map); /** * Store the given objects. Other objects may also be stored, * depending on the FollowPolicy setting. */ void store(QObjectList o); /** * Store the given objects, and add them and their nodes to the * ObjectNodeMap. Other objects may also be stored, depending on * the FollowPolicy setting. */ void store(QObjectList o, ObjectNodeMap &map); /** * Remove an object from the store, given its node. This removes * all triples with the node as subject. If any such triple * references a blank node that is not referred to elsewhere in * the store, all triples with that node as subject will be * removed as well. If such a blank node is also the head of an * RDF list, the rest of the RDF list will also be removed * provided it fulfils the same criteria. */ void removeObject(Node node); struct StoreCallback { /** * An object has been stored by the given ObjectStorer, * resulting in the given RDF node. The object and node will * also be found in the ObjectNodeMap, which additionally * references any other objects that have been stored during * this storage sequence. */ virtual void stored(ObjectStorer *, ObjectNodeMap &, QObject *, Node) = 0; }; /** * Register the given callback (a subclass of the abstract * StoreCallback class) as providing a "stored" callback method * which will be called after each object is stored. */ void addStoreCallback(StoreCallback *callback); private: ObjectStorer(const ObjectStorer &); ObjectStorer &operator=(const ObjectStorer &); class D; D *m_d; }; } #endif sonic-visualiser-3.0.3/dataquay/dataquay/objectmapper/TypeMapping.h0000644000000000000000000002256713111512442023653 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TYPE_MAPPING_H_ #define _DATAQUAY_TYPE_MAPPING_H_ #include "../Uri.h" #include namespace Dataquay { /** * TypeMapping describes a set of relationships between RDF entity and * property URIs, and C++ class and QObject property names. The * TypeMapping is referred to by ObjectMapper, ObjectStorer and * ObjectLoader when mapping between RDF entities and C++ objects. * * For example, say we have a class MyApplication::Person, with a * QObject string property called "name". We want the class to be * stored as a URI with RDF type foaf:Person, and the property to be * stored as a relationship for that URI of type foaf:name. These * URIs need to be expanded in order to be used with TypeMapping; we * assume here that "store" points to a Store which is aware of the * "foaf" prefix and can perform that expansion for us through * Store::expand. * * \code * TypeMapping tm; * tm.addTypeMapping("MyApplication::Person", store->expand("foaf:Person")); * tm.addPropertyMapping("MyApplication::Person", "name", store->expand("foaf:name")); * objectStorer->setTypeMapping(tm); * \endcode * * Now if objectStorer is used to store an object of class * MyApplication::Person, it will do so as a foaf:Person. Similarly, * whenever ObjectLoader is asked to load a foaf:Person, it will * create a MyApplication::Person object to do so. * * TypeMapping is re-entrant, but not thread-safe. * * *!!! TODO: Review method names */ class TypeMapping { public: /** * Construct a TypeMapping using default URIs throughout. */ TypeMapping(); TypeMapping(const TypeMapping &); TypeMapping &operator=(const TypeMapping &); ~TypeMapping(); /** * Set the prefix for synthetic type URIs. This is the prefix * used when asked to generate or convert type URIs for which no * specific mapping has been set using setTypeMapping. See also * \ref synthesiseTypeUriForClass and \ref synthesiseClassForTypeUri. */ void setObjectTypePrefix(Uri prefix); /** * Retrieve the prefix for synthetic type URIs. */ Uri getObjectTypePrefix() const; /** * Set the prefix for synthetic property URIs. This is the prefix * used when generating URIs for QObject properties for which no * specific mapping has been set using addPropertyMapping, and * when converting such URIs back to QObject properties. */ void setPropertyPrefix(Uri prefix); /** * Retrieve the prefix for synthetic property URIs. */ Uri getPropertyPrefix() const; /** * Set the prefix for ObjectMapper-specific property URIs. This * is the prefix used for object relationship properties such as * "parent" or "follows". */ void setRelationshipPrefix(Uri prefix); /** * Retrieve the prefix for ObjectMapper-specific property URIs. */ Uri getRelationshipPrefix() const; /** * Add a specific mapping from class name to entity URI. */ void addTypeMapping(QString className, Uri uri); /** * Retrieve the URI that has been set for the given class name * using \ref addTypeMapping, returning it in uri. Return true if * such a URI was found, false otherwise. */ bool getTypeUriForClass(QString className, Uri &uri) const; /** * Retrieve the C++ class name that has been set for the given * entity URI using \ref addTypeMapping, returning it in * className. Return true if such a name was found, false * otherwise. */ bool getClassForTypeUri(Uri uri, QString &className) const; /** * Return a URI for the RDF entity type corresponding to the given * C++ class. * * If a specific URI has been set for this class name using \ref * addTypeMapping (i.e. if \ref getTypeUriForClass would return a * result for this class name), the result will be that URI. * * Otherwise, the result will consist of the synthetic type URI * prefix (set using setObjectTypePrefix, or the default synthetic * type URI prefix if none has been set) followed by the class * name, with all namespace separators ("::") replaced by slashes * ("/"). */ Uri synthesiseTypeUriForClass(QString className) const; /** * Return a C++ class name corresponding to the given RDF entity * type URI. * * If a specific class name has been set for this URI using \ref * addTypeMapping (i.e. if \ref getClassForTypeUri would return a * result for this URI), the result will be that class name. * * Otherwise, the result will consist of the URI with the * synthetic type URI prefix (set using setObjectTypePrefix, or * the default synthetic type URI prefix if none has been set) * stripped off the beginning, and with subsequent slashes ("/") * replaced by namespace separators ("::"). * * Throws UnknownTypeException if no specific class name is * available and the URI does not begin with the synthetic type * URI prefix. */ QString synthesiseClassForTypeUri(Uri uri) const; /** * Add a mapping between class name and the common parts of any * URIs that are automatically generated when storing instances of * that class that have no URI property defined. * * For example, a mapping from "MyNamespace::MyClass" to * "http://mydomain.com/resource/" would ensure that automatically * generated "unique" URIs for instances that class all started * with that URI prefix. Note that the prefix itself is also * subject to namespace prefix expansion when stored. * * (If no prefix mapping was given for this example, its generated * URIs would start with ":mynamespace_myclass_".) * * Generated URIs are only checked for uniqueness within the store * being exported to and cannot be guaranteed to be globally * unique. For this reason, caution should be exercised in the * use of this function. * * Note that in principle the object mapper could use this when * loading, to infer class types for URIs in the store that have * no rdf:type. In practice that does not happen -- the object * mapper will not generate a class for URIs without rdf:type. */ void addTypeUriPrefixMapping(QString className, Uri prefix); /** * Retrieve the URI prefix set for the given className using \ref * addTypeUriPrefixMapping, if any, returning it in prefix. * Return true if such a prefix was found, false otherwise. */ bool getUriPrefixForClass(QString className, Uri &prefix) const; /** * Add a specific mapping for the given QObject property in the * given C++ class, to an RDF property URI. * * Note that distinct properties of the same class must map to * distinct URIs. If two properties of a class map to the same * URI, ObjectLoader will not be able to distinguish between them * (it does not attempt to resolve ambiguities using the type of * the argument, for example). */ void addPropertyMapping(QString className, QString propertyName, Uri uri); /** * Retrieve the URI that has been set for the given property in * the given class using \ref addPropertyMapping, returning it in * uri. Return true if such a URI was found, false otherwise. */ bool getPropertyUri(QString className, QString propertyName, Uri &uri) const; /** * Retrieve the name of the property for which the given URI has * been set in the given class using \ref addPropertyMapping, * returning it in propertyName. Return true if such a property * was found, false otherwise. */ bool getPropertyName(QString className, Uri propertyUri, QString &propertyName) const; //!!! Note no property equivalents of //!!! synthesiseClassForTypeUri/synthesiseTypeUriForClass -- do we want them? if only to have somewhere to put the documentation? private: class D; D *m_d; }; } #endif sonic-visualiser-3.0.3/dataquay/deploy/dataquay.pc.in0000644000000000000000000000040013111512442020775 0ustar 00000000000000prefix=%PREFIX% libdir=%LIBDIR% exec_prefix=${prefix} includedir=${prefix}/include Name: dataquay Version: 0.9.1 Description: C++ API for an RDF data store using Qt4 classes and containers Libs: -L${libdir} -ldataquay %EXTRALIBS% Cflags: -I${includedir} sonic-visualiser-3.0.3/dataquay/deploy/update-version.sh0000644000000000000000000000147613111512442021552 0ustar 00000000000000#!/bin/bash usage() { echo "Usage: $0 " echo " e.g. $0 2.2" exit 2; } version=$1 [ -n "$version" ] || usage major=${version%%.*} # 2.3 -> 2, 2.3.1 -> 2 minor=${version#*.} # 2.3 -> 3, 2.3.1 -> 3.1 point=${minor#*.} # 3 -> 3, 3.1 -> 1 if [ "$minor" = "$point" ]; then point=0; fi minor=${minor%.*} # 3 -> 3, 3.1 -> 3 echo "Major version = $major, minor version = $minor, point release = $point" acs="`echo $version | tr '.' '_'`" echo "acsymbols string = $acs" p="perl -i -p -e" $p 's/(This is version) [^ ]+/$1 '$version'/' \ README.txt $p 's/(VERSION)=[0-9\.]+/$1='$version'/' \ lib.pro $p 's/(Version:) .*/$1 '$version'/' \ deploy/dataquay.pc.in if ! grep -q "$acs" src/acsymbols.c ; then $p 's/^$/\nextern void dataquay_v_'$acs'_present(void) { }/' \ src/acsymbols.c fi sonic-visualiser-3.0.3/dataquay/doc-overview0000644000000000000000000000656513111512442017315 0ustar 00000000000000namespace Dataquay { /** \mainpage Dataquay \section about About Dataquay %Dataquay is a free open source library that provides a friendly C++ API for the Redland and Sord RDF data stores using Qt4 classes and containers. %Dataquay is intended to be simple to use and easy to integrate. It is principally intended for use in Qt-based applications that would like to use an RDF datastore as backing for in-memory project data, to avoid having to provide application data-specific file formats and to make it easy to augment the data with descriptive metadata pulled in from external sources. %Dataquay is also intended to be useful for applications whose primary purpose is not related to RDF but that have ad-hoc RDF needs for metadata management. \section contents What's in Dataquay? %Dataquay contains C++ abstractions for the RDF Node and Triple (or statement), and for the RDF Store. The standard BasicStore offers simple add, remove, matching, and querying functions and file I/O. Also provided is TransactionalStore, a transactional interface to the store that offers per-thread isolation, atomic commit, and a Connection class in the style of a traditional relational database interface. %Dataquay also offers ObjectMapper, a facility which can take care of a complete object hierarchy, map it to the RDF store, and synchronise in both directions any changes to the hierarchy or the store. Arbitrary mappings between C++ class and property names and RDF URIs can be specified using TypeMapping. The mapping is flexible enough to allow you to load many publicly generated Linked Data sources directly into object class hierarchies, if you wish (although this is not usually an ideal way to handle unpredictable data sources). The classes that manage the object-to-store and store-to-object mapping can also be used separately, as ObjectStorer and ObjectLoader. \section start Start Here... If you want your application to have access to RDF metadata but you are not intending to make RDF data the core of the application, then you probably want to focus on BasicStore. This can load and save RDF and perform queries, matches, and updates in a simple form. If you need to carry out updates to RDF data, particularly in a multi-threaded application, then you should look at TransactionalStore and its related Connection class. If you would like to use an RDF store as a "hibernation" mechanism for store and recall of an object hierarchy in an open and portable manner, then you could consider using a BasicStore, wrapping that in a TransactionalStore, and using ObjectMapper to deal with the hibernation side of things. In any of these cases you'll also want to look closely at the Uri, Node, and Triple classes. \section status Development Status Certain aspects of %Dataquay are still somewhat provisional, and the API may continue to change until the 1.0 release. However, most of the API design is likely to remain as it is now and the library has been reasonably well tested. The main focus for 1.0 is to expand the test suite and produce some more example code. Those activities might show up other things that need doing too, though. \section licence Licence %Dataquay is published under a liberal BSD-style licence, similar to (and of course compatible with) the Apache licence used by Redland. You can use it without fee in open-source or proprietary applications. See the COPYING file for details. */ } sonic-visualiser-3.0.3/dataquay/examples/ConnectionLoader.cpp0000644000000000000000000000236013111512442022516 0ustar 00000000000000/*!!! pulled out from ObjectLoader.cpp: can we do this using a callback, as an example? void ObjectLoader::D::loadConnections(NodeObjectMap &map) { QString slotTemplate = SLOT(xxx()); QString signalTemplate = SIGNAL(xxx()); // The store does not necessarily know m_relationshipPrefix ResultSet rs = m_s->query (QString (" PREFIX rel: <%1> " " SELECT ?sobj ?ssig ?tobj ?tslot WHERE { " " ?conn a rel:Connection; rel:source ?s; rel:target ?t. " " ?s rel:object ?sobj; rel:signal ?ssig. " " ?t rel:object ?tobj; rel:slot ?tslot. " " } ").arg(m_tm.getRelationshipPrefix().toString())); foreach (Dictionary d, rs) { Uri sourceUri(d["sobj"].value); Uri targetUri(d["tobj"].value); if (!map.contains(sourceUri) || !map.contains(targetUri)) continue; QString sourceSignal = signalTemplate.replace("xxx", d["ssig"].value); QString targetSlot = slotTemplate.replace("xxx", d["tslot"].value); QByteArray sigba = sourceSignal.toLocal8Bit(); QByteArray slotba = targetSlot.toLocal8Bit(); QObject::connect(map[sourceUri], sigba.data(), map[targetUri], slotba.data()); } } */ sonic-visualiser-3.0.3/dataquay/examples/TransactionalCommand.cpp0000644000000000000000000000402413111512442023370 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TransactionalCommand.h" #include "TransactionalStore.h" #include using std::unique_ptr; namespace Dataquay { TransactionalCommand::TransactionalCommand(TransactionalStore *store) : m_store(store), m_haveCs(false) { } void TransactionalCommand::execute() { if (m_haveCs) { m_store->change(m_cs); return; } unique_ptr tx(m_store->startTransaction()); performCommand(tx.get()); m_cs = tx->getChanges(); m_haveCs = true; } void TransactionalCommand::unexecute() { m_store->revert(m_cs); } } sonic-visualiser-3.0.3/dataquay/examples/TransactionalCommand.h0000644000000000000000000000374313111512442023044 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRANSACTIONAL_COMMAND_H_ #define _DATAQUAY_TRANSACTIONAL_COMMAND_H_ #include "Transaction.h" #include "base/Command.h" namespace Dataquay { class TransactionalStore; class TransactionalCommand : public Turbot::Command { public: virtual void execute(); virtual void unexecute(); protected: TransactionalCommand(TransactionalStore *store); virtual void performCommand(Transaction *tx) = 0; private: TransactionalStore *m_store; ChangeSet m_cs; bool m_haveCs; }; } #endif sonic-visualiser-3.0.3/dataquay/examples/VariantEncoderExample.cpp0000644000000000000000000000125513111512442023512 0ustar 00000000000000 /* Bits pulled out from Node.cpp during tidying -- not a useful example yet */ /*!!! move this (and converse) to examples/ as example of encoder registration static QString qTimeToXsdDuration(QTime t) { if (t.hour() != 0) { return QString("PT%1H%2M%3S") .arg(t.hour()) .arg(t.minute()) .arg(t.second() + double(t.msec())/1000.0); } else if (t.minute() != 0) { return QString("PT%1M%2S") .arg(t.minute()) .arg(t.second() + double(t.msec())/1000.0); } else { return QString("PT%1S") .arg(t.second() + double(t.msec())/1000.0); } } */ sonic-visualiser-3.0.3/dataquay/lib.pro0000644000000000000000000000473213111512442016243 0ustar 00000000000000 exists(debug.pri) { include(./debug.pri) } TEMPLATE = lib CONFIG += warn_on c++11 QT -= gui TARGET = dataquay exists(config.pri) { include(./config.pri) } VERSION=0.9.1 OBJECTS_DIR = o MOC_DIR = o QMAKE_LFLAGS_SHLIB *= $(LDFLAGS) INCLUDEPATH += dataquay !debug:DEFINES += NDEBUG HEADERS += dataquay/BasicStore.h \ dataquay/Connection.h \ dataquay/Node.h \ dataquay/PropertyObject.h \ dataquay/RDFException.h \ dataquay/Store.h \ dataquay/Transaction.h \ dataquay/TransactionalStore.h \ dataquay/Triple.h \ dataquay/Uri.h \ dataquay/objectmapper/ContainerBuilder.h \ dataquay/objectmapper/ObjectBuilder.h \ dataquay/objectmapper/ObjectLoader.h \ dataquay/objectmapper/ObjectMapper.h \ dataquay/objectmapper/ObjectMapperDefs.h \ dataquay/objectmapper/ObjectMapperForwarder.h \ dataquay/objectmapper/ObjectStorer.h \ dataquay/objectmapper/TypeMapping.h \ src/Debug.h SOURCES += src/Connection.cpp \ src/Node.cpp \ src/PropertyObject.cpp \ src/RDFException.cpp \ src/Store.cpp \ src/Transaction.cpp \ src/TransactionalStore.cpp \ src/Triple.cpp \ src/Uri.cpp \ src/backend/BasicStoreRedland.cpp \ src/backend/BasicStoreSord.cpp \ src/backend/define-check.cpp \ src/objectmapper/ContainerBuilder.cpp \ src/objectmapper/ObjectBuilder.cpp \ src/objectmapper/ObjectLoader.cpp \ src/objectmapper/ObjectMapper.cpp \ src/objectmapper/ObjectMapperForwarder.cpp \ src/objectmapper/ObjectStorer.cpp \ src/objectmapper/TypeMapping.cpp \ src/acsymbols.c linux* { isEmpty(PREFIX) { PREFIX = /usr/local } isEmpty(LIBDIR) { LIBDIR = $${PREFIX}/lib } target.path = $${LIBDIR} includes.path = $${PREFIX}/include includes.files = dataquay pkgconfig.path = $${PREFIX}/lib/pkgconfig pkgconfig.files = deploy/dataquay.pc pkgconfig.extra = sed -e "'"s.%PREFIX%.$${PREFIX}."'" -e "'"s.%LIBDIR%.$${LIBDIR}."'" -e "'"s.%EXTRALIBS%.$${EXTRALIBS}."'" deploy/dataquay.pc.in > deploy/dataquay.pc INSTALLS += target includes pkgconfig } exists(../platform-dataquay.pri) { include(../platform-dataquay.pri) } exists(platform.pri) { include(./platform.pri) } sonic-visualiser-3.0.3/dataquay/src/Connection.cpp0000644000000000000000000001504413111512442020343 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Connection.h" #include "TransactionalStore.h" #include "Transaction.h" namespace Dataquay { class Connection::D { public: D(TransactionalStore *ts); ~D(); bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format); Features getSupportedFeatures() const; void commit(); ChangeSet commitAndObtain(); void rollback(); private: TransactionalStore *m_ts; Transaction *m_tx; Store *getStore() const; void start(); }; Connection::D::D(TransactionalStore *ts) : m_ts(ts), m_tx(NoTransaction) { } Connection::D::~D() { commit(); } bool Connection::D::add(Triple t) { start(); return m_tx->add(t); } bool Connection::D::remove(Triple t) { start(); return m_tx->remove(t); } void Connection::D::change(ChangeSet cs) { start(); return m_tx->change(cs); } void Connection::D::revert(ChangeSet cs) { start(); return m_tx->revert(cs); } void Connection::D::start() { if (m_tx != NoTransaction) return; m_tx = m_ts->startTransaction(); } void Connection::D::commit() { if (m_tx) { m_tx->commit(); delete m_tx; m_tx = NoTransaction; } } ChangeSet Connection::D::commitAndObtain() { ChangeSet cs; if (m_tx) { m_tx->commit(); cs = m_tx->getCommittedChanges(); delete m_tx; m_tx = NoTransaction; } return cs; } void Connection::D::rollback() { if (m_tx) { m_tx->rollback(); delete m_tx; m_tx = NoTransaction; } } Store * Connection::D::getStore() const { if (m_tx) return m_tx; else return m_ts; } bool Connection::D::contains(Triple t) const { return getStore()->contains(t); } Triples Connection::D::match(Triple t) const { return getStore()->match(t); } ResultSet Connection::D::query(QString sparql) const { return getStore()->query(sparql); } Node Connection::D::complete(Triple t) const { return getStore()->complete(t); } Triple Connection::D::matchOnce(Triple t) const { return getStore()->matchOnce(t); } Node Connection::D::queryOnce(QString sparql, QString bindingName) const { return getStore()->queryOnce(sparql, bindingName); } Uri Connection::D::getUniqueUri(QString prefix) const { return getStore()->getUniqueUri(prefix); } Node Connection::D::addBlankNode() { start(); return m_tx->addBlankNode(); } Uri Connection::D::expand(QString uri) const { return getStore()->expand(uri); } void Connection::D::save(QString filename) const { getStore()->save(filename); } void Connection::D::import(QUrl url, ImportDuplicatesMode idm, QString format) { start(); m_tx->import(url, idm, format); } Connection::Features Connection::D::getSupportedFeatures() const { return getStore()->getSupportedFeatures(); } Connection::Connection(TransactionalStore *ts) : m_d(new D(ts)) { connect(ts, SIGNAL(transactionCommitted(const ChangeSet &)), this, SIGNAL(transactionCommitted(const ChangeSet &))); connect(ts, SIGNAL(transactionCommitted()), this, SIGNAL(transactionCommitted())); } Connection::~Connection() { delete m_d; } bool Connection::add(Triple t) { return m_d->add(t); } bool Connection::remove(Triple t) { return m_d->remove(t); } void Connection::change(ChangeSet changes) { m_d->change(changes); } void Connection::revert(ChangeSet changes) { m_d->revert(changes); } bool Connection::contains(Triple t) const { return m_d->contains(t); } Triples Connection::match(Triple t) const { return m_d->match(t); } ResultSet Connection::query(QString sparql) const { return m_d->query(sparql); } Node Connection::complete(Triple t) const { return m_d->complete(t); } Triple Connection::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node Connection::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri Connection::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Node Connection::addBlankNode() { return m_d->addBlankNode(); } Uri Connection::expand(QString uri) const { return m_d->expand(uri); } void Connection::save(QString filename) const { return m_d->save(filename); } void Connection::import(QUrl url, ImportDuplicatesMode idm, QString format) { return m_d->import(url, idm, format); } Connection::Features Connection::getSupportedFeatures() const { return m_d->getSupportedFeatures(); } void Connection::commit() { m_d->commit(); } ChangeSet Connection::commitAndObtain() { return m_d->commitAndObtain(); } void Connection::rollback() { m_d->rollback(); } } sonic-visualiser-3.0.3/dataquay/src/Debug.h0000644000000000000000000000423413111512442016736 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_INTERNAL_DEBUG_H_ #define _DATAQUAY_INTERNAL_DEBUG_H_ #include #ifndef NDEBUG #include #define DQ_DEBUG QDebug(QtDebugMsg) << "[dataquay] " namespace Dataquay { template inline QDebug &operator<<(QDebug &d, const T &t) { QString s; QTextStream ts(&s); ts << t; d << s; return d; } } #else namespace Dataquay { class NoDebug { public: inline NoDebug() {} inline ~NoDebug(){} template inline NoDebug &operator<<(const T &) { return *this; } inline NoDebug &operator<<(QTextStreamFunction) { return *this; } }; } #define DQ_DEBUG ::Dataquay::NoDebug() #endif /* !NDEBUG */ #endif /* !_DEBUG_H_ */ sonic-visualiser-3.0.3/dataquay/src/Node.cpp0000644000000000000000000003511413111512442017131 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Node.h" #include "Debug.h" #include #include #include #include #include #include #include namespace Dataquay { static const Uri encodedVariantTypeURI ("http://breakfastquay.com/dataquay/datatype/encodedvariant"); static const Uri xsdPrefix ("http://www.w3.org/2001/XMLSchema#"); struct StandardVariantEncoder : public Node::VariantEncoder { QString fromVariant(const QVariant &v) { return v.toString(); } }; struct LongVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s.toLong()); } }; struct ULongVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s.toULong()); } }; struct DoubleVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s.toDouble()); } }; struct StringVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s); } }; struct BoolVariantEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue((s == "true") || (s == "1")); } QString fromVariant(const QVariant &v) { return (v.toBool() ? "true" : "false"); } }; struct UriVariantEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(Uri(s)); } QString fromVariant(const QVariant &v) { return v.value().toString(); } }; struct QUrlVariantEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(QUrl(s)); } QString fromVariant(const QVariant &v) { return v.value().toString(); } }; // Type maps to be used when converting from Node to Variant and // Variant to Node, respectively. These are not symmetrical -- for // example, we convert xsd:string to QString, but convert QString to // an untyped literal ("literal" and "literal"^^xsd:string compare // differently and most people just use "literal", so we're more // likely to achieve interoperable results if we don't type plain // strings). Similarly we convert both double and float to // xsd:decimal, but always convert xsd:decimal to double. However, we // do currently impose symmetry for user-provided types (that is, our // registerDatatype method adds the datatype to both maps). class DatatypeMetatypeAssociation { public: static DatatypeMetatypeAssociation *instance() { static DatatypeMetatypeAssociation *inst = 0; static QMutex mutex; mutex.lock(); if (inst == 0) inst = new DatatypeMetatypeAssociation(); mutex.unlock(); return inst; } int getMetatypeId(Uri dt) { DatatypeMetatypeMap::const_iterator i = datatypeMetatypeMap.find(dt); if (i != datatypeMetatypeMap.end()) return i->first; return 0; } bool getDatatype(int mt, Uri &dt) { MetatypeDatatypeMap::const_iterator i = metatypeDatatypeMap.find(mt); if (i != metatypeDatatypeMap.end()) { dt = i->first; return true; } return false; } Node::VariantEncoder *getEncoder(Uri dt) { DatatypeMetatypeMap::const_iterator i = datatypeMetatypeMap.find(dt); if (i != datatypeMetatypeMap.end()) return i->second; return 0; } Node::VariantEncoder *getEncoder(int id) { MetatypeDatatypeMap::const_iterator i = metatypeDatatypeMap.find(id); if (i != metatypeDatatypeMap.end()) return i->second; return 0; } void registerDatatype(Uri dt, int id, Node::VariantEncoder *enc) { datatypeMetatypeMap[dt] = QPair(id, enc); } void registerDatatype(int id, Uri dt, Node::VariantEncoder *enc) { metatypeDatatypeMap[id] = QPair(dt, enc); } void registerXsd(QString name, int id, Node::VariantEncoder *enc) { registerDatatype(Uri(xsdPrefix.toString() + name), id, enc); } void registerXsd(int id, QString name, Node::VariantEncoder *enc) { registerDatatype(id, Uri(xsdPrefix.toString() + name), enc); } private: DatatypeMetatypeAssociation() { registerXsd("string", QMetaType::QString, new StringVariantEncoder()); registerXsd("boolean", QMetaType::Bool, new BoolVariantEncoder()); registerXsd("int", QMetaType::Int, new LongVariantEncoder()); registerXsd("long", QMetaType::Long, new LongVariantEncoder()); registerXsd("integer", QMetaType::Long, new LongVariantEncoder()); registerXsd("unsignedInt", QMetaType::UInt, new ULongVariantEncoder()); registerXsd("nonNegativeInteger", QMetaType::ULong, new ULongVariantEncoder()); registerXsd("float", QMetaType::Float, new DoubleVariantEncoder()); registerXsd("double", QMetaType::Double, new DoubleVariantEncoder()); registerXsd("decimal", QMetaType::Double, new DoubleVariantEncoder()); registerXsd(QMetaType::Bool, "boolean", new BoolVariantEncoder()); registerXsd(QMetaType::Int, "integer", new LongVariantEncoder()); registerXsd(QMetaType::Long, "integer", new LongVariantEncoder()); registerXsd(QMetaType::UInt, "integer", new ULongVariantEncoder()); registerXsd(QMetaType::ULong, "integer", new ULongVariantEncoder()); registerXsd(QMetaType::Float, "decimal", new DoubleVariantEncoder()); registerXsd(QMetaType::Double, "decimal", new DoubleVariantEncoder()); // Not necessary in normal use, because URIs are stored in URI // nodes and handled separately rather than being stored in // literal nodes... but necessary if an untyped literal is // presented for conversion via toVariant(Uri::metaTypeId()) registerDatatype(Uri::metaTypeId(), Uri(), new UriVariantEncoder()); // Similarly, although no datatype is associated with QUrl, it // could be presented when trying to convert a URI Node using // an explicit variant type target (e.g. to assign RDF URIs to // QUrl properties rather than Uri ones) registerDatatype(QMetaType::QUrl, Uri(), new QUrlVariantEncoder()); // QString is a known variant type, but has no datatype when // writing (we write strings as untyped literals because // that's what seems most useful). We already registered it // with xsd:string for reading. registerDatatype(QMetaType::QString, Uri(), new StringVariantEncoder()); } typedef QHash > DatatypeMetatypeMap; DatatypeMetatypeMap datatypeMetatypeMap; typedef QHash > MetatypeDatatypeMap; MetatypeDatatypeMap metatypeDatatypeMap; }; void Node::registerDatatype(Uri dt, QString typeName, VariantEncoder *enc) { QByteArray ba = typeName.toLocal8Bit(); int id = QMetaType::type(ba.data()); if (id <= 0) { std::cerr << "WARNING: Node::registerDatatype: Type name \"" << typeName.toLocal8Bit().data() << "\" is unknown to QMetaType, " << "cannot register it here" << std::endl; return; } DatatypeMetatypeAssociation::instance()->registerDatatype(dt, id, enc); DatatypeMetatypeAssociation::instance()->registerDatatype(id, dt, enc); } Uri Node::getDatatype(QString typeName) { QByteArray ba = typeName.toLocal8Bit(); int id = QMetaType::type(ba.data()); if (id <= 0) return Uri(); Uri dt; if (DatatypeMetatypeAssociation::instance()->getDatatype(id, dt)) return dt; return Uri(); } QString Node::getVariantTypeName(Uri datatype) { int id = DatatypeMetatypeAssociation::instance()->getMetatypeId(datatype); if (id > 0) return QMetaType::typeName(id); else return QString(); } Node Node::fromVariant(const QVariant &v) { DQ_DEBUG << "Node::fromVariant: QVariant type is " << v.userType() << " (" << int(v.userType()) << "), variant is " << v << endl; if (Uri::hasUriType(v)) { return Node(v.value()); } if (v.type() == QVariant::Url) { QString s = v.toUrl().toString(); if (Uri::isCompleteUri(s)) { return Node(Uri(s)); } } int id = v.userType(); DatatypeMetatypeAssociation *a = DatatypeMetatypeAssociation::instance(); Uri datatype; if (a->getDatatype(id, datatype)) { Node n; n.type = Literal; n.datatype = datatype; VariantEncoder *encoder = a->getEncoder(id); if (encoder) { n.value = encoder->fromVariant(v); } else { n.value = v.toString(); } return n; } else { // unknown type: use opaque encoding QByteArray b; QDataStream ds(&b, QIODevice::WriteOnly); ds << v; Node n; n.type = Literal; n.datatype = encodedVariantTypeURI; n.value = QString::fromLatin1(qCompress(b).toBase64()); return n; } } QVariant Node::toVariant() const { if (type == URI) { return QVariant::fromValue(Uri(value)); } if (type == Nothing || type == Blank) { return QVariant(); } if (datatype == Uri()) { return QVariant::fromValue(value); } if (datatype == encodedVariantTypeURI) { // Opaque encoding used for "unknown" types. If this is // encoding is in use, we must decode from it even if the type // is actually known QByteArray benc = value.toLatin1(); QByteArray b = qUncompress(QByteArray::fromBase64(benc)); QDataStream ds(&b, QIODevice::ReadOnly); QVariant v; ds >> v; return v; } DatatypeMetatypeAssociation *a = DatatypeMetatypeAssociation::instance(); int id = a->getMetatypeId(datatype); if (id > 0) { VariantEncoder *encoder = a->getEncoder(datatype); if (encoder) { return encoder->toVariant(value); } else { // datatype present, but no encoder: can do nothing // interesting with this, convert as string return QVariant::fromValue(value); } } else { // unknown datatype, but not "unknown type" encoding; // convert as a string return QVariant::fromValue(value); } } QVariant Node::toVariant(int metatype) const { VariantEncoder *encoder = DatatypeMetatypeAssociation::instance()->getEncoder(metatype); if (!encoder) { std::cerr << "WARNING: Node::toVariant: Unsupported metatype id " << metatype << " (\"" << QMetaType::typeName(metatype) << "\"), register it with registerDatatype please" << std::endl; return QVariant(); } return encoder->toVariant(value); } bool operator==(const Node &a, const Node &b) { if (a.type == Node::Nothing && b.type == Node::Nothing) return true; if (a.type == b.type && a.value == b.value && a.datatype == b.datatype) return true; return false; } bool operator!=(const Node &a, const Node &b) { return !operator==(a, b); } QDataStream & operator<<(QDataStream &out, const Node &n) { return out << (int)n.type << n.value << n.datatype; } QDataStream & operator>>(QDataStream &in, Node &n) { int t; in >> t >> n.value >> n.datatype; n.type = (Node::Type)t; return in; } std::ostream & operator<<(std::ostream &out, const Node &n) { switch (n.type) { case Node::Nothing: out << "[]"; break; case Node::URI: if (n.value == "") { out << "[empty-uri]"; } else { out << "<" << n.value.toLocal8Bit().data() << ">"; } break; case Node::Literal: out << "\"" << n.value.toLocal8Bit().data() << "\""; if (n.datatype != Uri()) out << "^^" << n.datatype; break; case Node::Blank: out << "[blank " << n.value.toLocal8Bit().data() << "]"; break; } return out; } QTextStream & operator<<(QTextStream &out, const Node &n) { switch (n.type) { case Node::Nothing: out << "[]"; break; case Node::URI: if (n.value == "") { out << "[empty-uri]"; } else { out << "<" << n.value << ">"; } break; case Node::Literal: out << "\"" << n.value << "\""; if (n.datatype != Uri()) out << "^^" << n.datatype; break; case Node::Blank: out << "[blank " << n.value << "]"; break; } return out; } } unsigned int qHash(const Dataquay::Node &n) { switch (n.type) { case Dataquay::Node::URI: return qHash(n.value); case Dataquay::Node::Literal: return qHash(n.value + n.datatype.toString()); case Dataquay::Node::Blank: return qHash(n.value); case Dataquay::Node::Nothing: default: return qHash(""); } } sonic-visualiser-3.0.3/dataquay/src/PropertyObject.cpp0000644000000000000000000003275113111512442021223 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Uri.h" #include "PropertyObject.h" #include "Transaction.h" #include "Node.h" namespace Dataquay { QString PropertyObject::m_defaultPrefix = "property:"; PropertyObject::PropertyObject(Store *s, Uri uri) : m_store(s), m_pfx(m_defaultPrefix), m_node(uri) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString uri) : m_store(s), m_pfx(m_defaultPrefix), m_node(s->expand(uri)) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, Node node) : m_store(s), m_pfx(m_defaultPrefix), m_node(node) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString pfx, Uri uri) : m_store(s), m_pfx(pfx), m_node(uri) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString pfx, QString uri) : m_store(s), m_pfx(pfx), m_node(s->expand(uri)) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString pfx, Node node) : m_store(s), m_pfx(pfx), m_node(node) { m_upfx = m_store->expand(m_pfx); } PropertyObject::~PropertyObject() { } Node PropertyObject::getNode() const { return m_node; } Uri PropertyObject::getObjectType() const { Triple t = m_store->matchOnce(Triple(m_node, Uri("a"), Node())); if (t != Triple()) { return Uri(t.c.value); } else { return Uri(); } } Uri PropertyObject::getObjectType(Transaction *tx) const { Store *s = getStore(tx); Triple t = s->matchOnce(Triple(m_node, Uri("a"), Node())); if (t != Triple()) { return Uri(t.c.value); } else { return Uri(); } } bool PropertyObject::hasProperty(QString name) const { Uri property = getPropertyUri(name); Triple r = m_store->matchOnce(Triple(m_node, property, Node())); return (r != Triple()); } bool PropertyObject::hasProperty(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple r = s->matchOnce(Triple(m_node, property, Node())); return (r != Triple()); } QVariant PropertyObject::getProperty(QString name) const { Uri property = getPropertyUri(name); Triple r = m_store->matchOnce(Triple(m_node, property, Node())); if (r == Triple()) return QVariant(); return r.c.toVariant(); } QVariant PropertyObject::getProperty(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple r = s->matchOnce(Triple(m_node, property, Node())); if (r == Triple()) return QVariant(); return r.c.toVariant(); } QVariantList PropertyObject::getPropertyList(QString name) const { Uri property = getPropertyUri(name); Triples r = m_store->match(Triple(m_node, property, Node())); QVariantList vl; for (int i = 0; i < r.size(); ++i) { vl.push_back(r[i].c.toVariant()); } return vl; } QVariantList PropertyObject::getPropertyList(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triples r = s->match(Triple(m_node, property, Node())); QVariantList vl; for (int i = 0; i < r.size(); ++i) { vl.push_back(r[i].c.toVariant()); } return vl; } Node PropertyObject::getPropertyNode(QString name) const { Uri property = getPropertyUri(name); Triple r = m_store->matchOnce(Triple(m_node, property, Node())); return r.c; } Node PropertyObject::getPropertyNode(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple r = s->matchOnce(Triple(m_node, property, Node())); return r.c; } Nodes PropertyObject::getPropertyNodeList(QString name) const { Uri property = getPropertyUri(name); Triples r = m_store->match(Triple(m_node, property, Node())); Nodes n; for (int i = 0; i < r.size(); ++i) n.push_back(r[i].c); return n; } Nodes PropertyObject::getPropertyNodeList(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triples r = s->match(Triple(m_node, property, Node())); Nodes n; for (int i = 0; i < r.size(); ++i) n.push_back(r[i].c); return n; } QStringList PropertyObject::getPropertyNames() const { QStringList properties; Triples ts = m_store->match(Triple(m_node, Node(), Node())); for (int i = 0; i < ts.size(); ++i) { QString propertyUri = ts[i].b.value; if (propertyUri.startsWith(m_pfx)) { properties.push_back(propertyUri.remove(0, m_pfx.length())); } } return properties; } QStringList PropertyObject::getPropertyNames(Transaction *tx) const { Store *s = getStore(tx); QStringList properties; Triples ts = s->match(Triple(m_node, Node(), Node())); for (int i = 0; i < ts.size(); ++i) { QString propertyUri = ts[i].b.value; if (propertyUri.startsWith(m_pfx)) { properties.push_back(propertyUri.remove(0, m_pfx.length())); } } return properties; } void PropertyObject::setProperty(QString name, QVariant value) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples t.c = Node::fromVariant(value); m_store->add(t); } void PropertyObject::setProperty(QString name, Uri uri) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples t.c = Node(uri); m_store->add(t); } void PropertyObject::setProperty(QString name, Node node) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples t.c = node; m_store->add(t); } void PropertyObject::setProperty(Transaction *tx, QString name, QVariant value) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples t.c = Node::fromVariant(value); s->add(t); } void PropertyObject::setProperty(Transaction *tx, QString name, Uri uri) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples t.c = Node(uri); s->add(t); } void PropertyObject::setProperty(Transaction *tx, QString name, Node node) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples t.c = node; s->add(t); } void PropertyObject::setPropertyList(QString name, QVariantList values) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples for (int i = 0; i < values.size(); ++i) { t.c = Node::fromVariant(values[i]); m_store->add(t); } } void PropertyObject::setPropertyList(Transaction *tx, QString name, QVariantList values) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples for (int i = 0; i < values.size(); ++i) { t.c = Node::fromVariant(values[i]); s->add(t); } } void PropertyObject::setPropertyList(QString name, Nodes nodes) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples for (int i = 0; i < nodes.size(); ++i) { t.c = nodes[i]; m_store->add(t); } } void PropertyObject::setPropertyList(Transaction *tx, QString name, Nodes nodes) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples for (int i = 0; i < nodes.size(); ++i) { t.c = nodes[i]; s->add(t); } } void PropertyObject::removeProperty(QString name) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples } void PropertyObject::removeProperty(Transaction *tx, QString name) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples } Store * PropertyObject::getStore(Transaction *tx) const { if (tx == NoTransaction) return m_store; else return tx; } Uri PropertyObject::getPropertyUri(QString name) const { if (name == "a") return m_store->expand(name); if (name.contains(':')) return m_store->expand(name); return Uri(m_upfx.toString() + name); // m_upfx is already expanded } void PropertyObject::setDefaultPropertyPrefix(QString prefix) { m_defaultPrefix = prefix; } CacheingPropertyObject::CacheingPropertyObject(Store *s, Uri uri) : m_po(s, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString uri) : m_po(s, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString pfx, Uri uri) : m_po(s, pfx, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString pfx, QString uri) : m_po(s, pfx, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString pfx, Node node) : m_po(s, pfx, node), m_cached(false) { } Uri CacheingPropertyObject::getObjectType() const { encache(); Uri key = Uri::rdfTypeUri(); if (!m_cache.contains(key) || m_cache[key][0].type != Node::URI) { return Uri(); } return Uri(m_cache[key][0].value); } bool CacheingPropertyObject::hasProperty(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); bool has = m_cache.contains(key); return has; } QVariant CacheingPropertyObject::getProperty(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); if (!m_cache.contains(key)) return QVariant(); return m_cache[key][0].toVariant(); } QVariantList CacheingPropertyObject::getPropertyList(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); if (!m_cache.contains(key)) return QVariantList(); QVariantList vl; foreach (const Node &n, m_cache[key]) { vl.push_back(n.toVariant()); } return vl; } Node CacheingPropertyObject::getPropertyNode(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); if (!m_cache.contains(key)) return Node(); return m_cache[key][0]; } Nodes CacheingPropertyObject::getPropertyNodeList(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); Nodes result; if (!m_cache.contains(key)) return result; result = m_cache[key]; return result; } QStringList CacheingPropertyObject::getPropertyNames() const { return m_po.getPropertyNames(); } void CacheingPropertyObject::setProperty(QString name, QVariant value) { m_po.setProperty(name, value); m_cached = false; } void CacheingPropertyObject::setProperty(QString name, Uri value) { m_po.setProperty(name, value); m_cached = false; } void CacheingPropertyObject::setProperty(QString name, Node node) { m_po.setProperty(name, node); m_cached = false; } void CacheingPropertyObject::setPropertyList(QString name, QVariantList values) { m_po.setPropertyList(name, values); m_cached = false; } void CacheingPropertyObject::setPropertyList(QString name, Nodes nodes) { m_po.setPropertyList(name, nodes); m_cached = false; } void CacheingPropertyObject::removeProperty(QString name) { m_po.removeProperty(name); m_cached = false; } Uri CacheingPropertyObject::getPropertyUri(QString name) const { return m_po.getPropertyUri(name); } void CacheingPropertyObject::encache() const { if (m_cached) return; m_cache.clear(); Triples ts = m_po.getStore(NoTransaction) ->match(Triple(m_po.getNode(), Node(), Node())); for (int i = 0; i < ts.size(); ++i) { if (ts[i].b.type != Node::URI) continue; // shouldn't happen, but m_cache[Uri(ts[i].b.value)].push_back(ts[i].c); } m_cached = true; } } sonic-visualiser-3.0.3/dataquay/src/RDFException.cpp0000644000000000000000000000602313111512442020533 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "RDFException.h" #include "Uri.h" #include "Node.h" #include "Triple.h" #include "Debug.h" #include #include #include namespace Dataquay { RDFException::RDFException(QString message) throw() : m_message(0) { setMessage(message); } RDFException::RDFException(QString message, QString data) throw() : m_message(0) { setMessage(QString("%1 [with string \"%2\"]").arg(message).arg(data)); } RDFException::RDFException(QString message, const Uri &uri) throw() : m_message(0) { setMessage(QString("%1 [with URI <%2>]").arg(message).arg(uri.toString())); } RDFException::RDFException(QString message, const Node &node) throw() : m_message(0) { QString s; QTextStream ts(&s); ts << node; setMessage(QString("%1 [with node <%2>]").arg(message).arg(s)); } RDFException::RDFException(QString message, const Triple &triple) throw() : m_message(0) { QString s; QTextStream ts(&s); ts << triple; setMessage(QString("%1 [with triple <%2>]").arg(message).arg(s)); } RDFException::RDFException(const RDFException &e) throw() { m_message = strdup(e.m_message); } RDFException & RDFException::operator=(const RDFException &e) throw() { if (&e == this) return *this; free(m_message); m_message = strdup(e.m_message); return *this; } RDFException::~RDFException() throw() { free(m_message); } void RDFException::setMessage(QString m) { if (m_message) free(m_message); m_message = strdup(m.toLocal8Bit().data()); DQ_DEBUG << "RDFException: " << m_message << endl; } } sonic-visualiser-3.0.3/dataquay/src/Store.cpp0000644000000000000000000000337713111512442017346 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Store.h" #include QDataStream &operator<<(QDataStream &out, const Dataquay::ChangeType &ct) { return (out << (qint32)ct); } QDataStream &operator>>(QDataStream &in, Dataquay::ChangeType &ct) { qint32 i; in >> i; ct = (Dataquay::ChangeType)i; return in; } sonic-visualiser-3.0.3/dataquay/src/Transaction.cpp0000644000000000000000000000305113111512442020524 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Transaction.h" namespace Dataquay { Transaction *const NoTransaction = 0; } sonic-visualiser-3.0.3/dataquay/src/TransactionalStore.cpp0000644000000000000000000006041313111512442022063 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TransactionalStore.h" #include "BasicStore.h" #include "RDFException.h" #include "Debug.h" #include #include #include #include // unique_ptr using std::unique_ptr; namespace Dataquay { class TransactionalStore::D { /** * Current store context. * * TxContext: changes pending for the transaction are present in the * store (committing the transaction would be a no-op; * non-transactional queries would return incorrect results). * * NonTxContext: changes pending for the transaction are absent from * the store (store is ready for non-transactional queries; * committing the transaction would require reapplying changes). */ enum Context { TxContext, NonTxContext }; public: D(TransactionalStore *ts, Store *store, DirectWriteBehaviour dwb) : m_ts(ts), m_store(store), m_dwb(dwb), m_currentTx(NoTransaction), m_context(NonTxContext) { } ~D() { if (m_currentTx != NoTransaction) { std::cerr << "WARNING: TransactionalStore deleted with transaction ongoing" << std::endl; } } Transaction *startTransaction() { QMutexLocker locker(&m_mutex); DQ_DEBUG << "TransactionalStore::startTransaction" << endl; if (m_currentTx != NoTransaction) { throw RDFTransactionError("ERROR: Attempt to start transaction when another transaction from the same thread is already in train"); } Transaction *tx = new TSTransaction(this); m_currentTx = tx; return tx; } void commitTransaction(Transaction *tx) { ChangeSet cs; { QMutexLocker locker(&m_mutex); DQ_DEBUG << "TransactionalStore::commitTransaction" << endl; if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } enterTransactionContext(); cs = m_currentTx->getChanges(); // The store is now in transaction context, which means // its changes have been committed; resetting m_currentTx // now ensures they will remain committed. Reset // m_context as well for symmetry with the initial state // in the constructor, though it shouldn't be necessary m_currentTx = NoTransaction; m_context = NonTxContext; } DQ_DEBUG << "TransactionalStore::commitTransaction: committed " << cs.size() << " change(s)" << endl; m_ts->transactionCommitted(cs); m_ts->transactionCommitted(); DQ_DEBUG << "TransactionalStore::commitTransaction complete" << endl; } void rollbackTransaction(Transaction *tx) { QMutexLocker locker(&m_mutex); DQ_DEBUG << "TransactionalStore::rollbackTransaction" << endl; if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } leaveTransactionContext(); // The store is now in non-transaction context, which means // the transaction's changes are uncommitted m_currentTx = NoTransaction; DQ_DEBUG << "TransactionalStore::rollbackTransaction complete" << endl; } class Operation { public: Operation(const D *d, const Transaction *tx) : m_d(d), m_tx(tx) { m_d->startOperation(m_tx); } ~Operation() { m_d->endOperation(m_tx); } private: const D *m_d; const Transaction *m_tx; }; class NonTransactionalAccess { public: NonTransactionalAccess(D *d) : m_d(d) { m_d->startNonTransactionalAccess(); } ~NonTransactionalAccess() { m_d->endNonTransactionalAccess(); } private: D *m_d; }; bool add(Transaction *tx, Triple t) { Operation op(this, tx); return m_store->add(t); } bool remove(Transaction *tx, Triple t) { Operation op(this, tx); return m_store->remove(t); } bool contains(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->contains(t); } Triples match(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->match(t); } ResultSet query(const Transaction *tx, QString sparql) const { Operation op(this, tx); return m_store->query(sparql); } Node complete(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->complete(t); } Triple matchOnce(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->matchOnce(t); } Node queryOnce(const Transaction *tx, QString sparql, QString bindingName) const { Operation op(this, tx); return m_store->queryOnce(sparql, bindingName); } Uri getUniqueUri(const Transaction *tx, QString prefix) const { Operation op(this, tx); return m_store->getUniqueUri(prefix); } Node addBlankNode(Transaction *tx) const { Operation op(this, tx); return m_store->addBlankNode(); } Uri expand(QString uri) const { return m_store->expand(uri); } void save(const Transaction *tx, QString filename) const { Operation op(this, tx); m_store->save(filename); } /*!!! void import(Transaction *tx, QUrl url, ImportDuplicatesMode idm, QString format) { Operation op(this, tx); m_store->import(url, idm, format); } */ Features getSupportedFeatures() const { return m_store->getSupportedFeatures(); } bool hasWrap() const { return m_dwb == AutoTransaction; } void startNonTransactionalAccess() { // This is only called from the containing TransactionalStore // when it wants to carry out a non-transactional read access. // Hence, it needs to take a lock and hold it until // endNonTransactionalAccess is called m_mutex.lock(); DQ_DEBUG << "TransactionalStore::startNonTransactionalAccess" << endl; if (m_context == NonTxContext) DQ_DEBUG << "(note: already in non-tx context)" << endl; leaveTransactionContext(); // return with mutex held } void endNonTransactionalAccess() { // We can remain in NonTxContext, since every transactional // access checks this via enterTransactionContext before doing // any work; this way is quicker if we may have multiple // non-transactional reads happening together. DQ_DEBUG << "TransactionalStore::endNonTransactionalAccess" << endl; m_mutex.unlock(); } Store *getStore() { return m_store; } const Store *getStore() const { return m_store; } private: // Most things are mutable here because the TransactionalStore // manipulates the Store extensively when entering and leaving // transaction context, which can happen on any supposedly // read-only access TransactionalStore *m_ts; mutable Store *m_store; DirectWriteBehaviour m_dwb; mutable QMutex m_mutex; const Transaction *m_currentTx; mutable Context m_context; void startOperation(const Transaction *tx) const { // This will succeed immediately if the mutex is already held // by this thread from a startTransaction call (because it is // a recursive mutex). If another thread is performing a // transaction, then we have to block until the whole // transaction is complete m_mutex.lock(); if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } enterTransactionContext(); } void endOperation(const Transaction *tx) const { if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } m_mutex.unlock(); } void enterTransactionContext() const { // This is always called from within this class, with the // mutex held already if (m_context == TxContext) { return; } if (m_currentTx == NoTransaction) { return; } ChangeSet cs = m_currentTx->getChanges(); if (!cs.empty()) { DQ_DEBUG << "TransactionalStore::enterTransactionContext: replaying" << endl; try { m_store->change(cs); } catch (RDFException &e) { throw RDFTransactionError(QString("Failed to enter transaction context. Has the store been modified non-transactionally while a transaction was in progress? Original error is: %1").arg(e.what())); } } m_context = TxContext; } void leaveTransactionContext() const { // This is always called from within this class, with the // mutex held already if (m_context == NonTxContext) { return; } if (m_currentTx == NoTransaction) { m_context = NonTxContext; return; } // N.B. This is the reason for Transaction::getChanges() // returning the change set prior to rollback, rather than // e.g. an empty change set, if called after a rollback ChangeSet cs = m_currentTx->getChanges(); if (!cs.empty()) { try { m_store->revert(cs); } catch (RDFException &e) { throw RDFTransactionError(QString("Failed to leave transaction context. Has the store been modified non-transactionally while a transaction was in progress? Original error is: %1").arg(e.what())); } } m_context = NonTxContext; } }; class TransactionalStore::TSTransaction::D { public: D(TransactionalStore::TSTransaction *tx, TransactionalStore::D *td) : m_tx(tx), m_td(td), m_committed(false), m_abandoned(false) { } ~D() { if (!m_committed && !m_abandoned && !m_tx->getChanges().empty()) { // we need to either commit or rollback, or else the next // transaction will stall m_td->rollbackTransaction(m_tx); // Not good form to throw an exception from the dtor std::cerr << "WARNING: Transaction deleted without having been committed or rolled back" << std::endl; } } void abandon() const { if (m_abandoned || m_committed) return; DQ_DEBUG << "TransactionalStore::TSTransaction::abandon: Auto-rollback triggered by exception" << endl; m_td->rollbackTransaction(m_tx); m_abandoned = true; } void check() const { if (m_abandoned) { throw RDFTransactionError("Transaction used after being rolled back"); } if (m_committed) { throw RDFTransactionError("Transaction used afted being committed"); } } bool add(Triple t) { check(); try { if (m_td->add(m_tx, t)) { m_changes.push_back(Change(AddTriple, t)); return true; } else { return false; } } catch (RDFException &) { abandon(); throw; } } bool remove(Triple t) { check(); try { // If some nodes are null, we need to remove all matching // triples -- we need to do that here instead of relying // on the underlying store (which does the same thing) // because we can't push the incomplete statement onto the // change set Triples tt; bool wild = false; if (t.a.type == Node::Nothing || t.b.type == Node::Nothing || t.c.type == Node::Nothing) { tt = m_td->match(m_tx, t); wild = true; } else { tt.push_back(t); } bool found = false; for (int i = 0; i < tt.size(); ++i) { if (m_td->remove(m_tx, tt[i])) { m_changes.push_back(Change(RemoveTriple, tt[i])); found = true; } else if (wild) { throw RDFInternalError("Failed to remove matched statement in remove() with wildcards"); } } return found; } catch (RDFException &) { abandon(); throw; } } void change(ChangeSet cs) { // this is all atomic anyway (as it's part of the // transaction), so unlike BasicStore we don't need a lock for (int i = 0; i < cs.size(); ++i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!add(triple)) { throw RDFException("Change add failed: triple is already in store", triple); } break; case RemoveTriple: if (!remove(cs[i].second)) { throw RDFException("Change remove failed: triple is not in store", triple); } break; } } } void revert(ChangeSet cs) { // this is all atomic anyway (as it's part of the // transaction), so unlike BasicStore we don't need a lock for (int i = cs.size()-1; i >= 0; --i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!remove(triple)) { throw RDFException("Revert of add failed: triple is not in store", triple); } break; case RemoveTriple: if (!add(triple)) { throw RDFException("Revert of remove failed: triple is already in store", triple); } break; } } } bool contains(Triple t) const { check(); try { return m_td->contains(m_tx, t); } catch (RDFException &) { abandon(); throw; } } Triples match(Triple t) const { check(); try { return m_td->match(m_tx, t); } catch (RDFException &) { abandon(); throw; } } ResultSet query(QString sparql) const { check(); try { return m_td->query(m_tx, sparql); } catch (RDFException &) { abandon(); throw; } } Node complete(Triple t) const { check(); try { return m_td->complete(m_tx, t); } catch (RDFException &) { abandon(); throw; } } Triple matchOnce(Triple t) const { check(); try { return m_td->matchOnce(m_tx, t); } catch (RDFException &) { abandon(); throw; } } Node queryOnce(QString sparql, QString bindingName) const { check(); try { return m_td->queryOnce(m_tx, sparql, bindingName); } catch (RDFException &) { abandon(); throw; } } Uri getUniqueUri(QString prefix) const { check(); try { return m_td->getUniqueUri(m_tx, prefix); } catch (RDFException &) { abandon(); throw; } } Node addBlankNode() { check(); try { return m_td->addBlankNode(m_tx); } catch (RDFException &) { abandon(); throw; } } Uri expand(QString uri) const { return m_td->expand(uri); } void save(QString filename) const { check(); try { return m_td->save(m_tx, filename); } catch (RDFException &) { abandon(); throw; } } void import(QUrl url, ImportDuplicatesMode idm, QString format) { check(); BasicStore *bs = 0; try { bs = BasicStore::load(url, format); Triples ts = bs->match(Triple()); foreach (Triple t, ts) { bool added = m_td->add(m_tx, t); if (added) { m_changes.push_back(Change(AddTriple, t)); } else if (idm == ImportFailOnDuplicates) { throw RDFDuplicateImportException("Duplicate statement encountered on import in ImportFailOnDuplicates mode"); } } delete bs; bs = 0; } catch (RDFException &) { delete bs; abandon(); throw; } } Features getSupportedFeatures() const { return m_td->getSupportedFeatures(); } void commit() { check(); DQ_DEBUG << "TransactionalStore::TSTransaction::commit: Committing" << endl; m_td->commitTransaction(m_tx); m_committed = true; } void rollback() { check(); DQ_DEBUG << "TransactionalStore::TSTransaction::rollback: Abandoning" << endl; m_td->rollbackTransaction(m_tx); m_abandoned = true; } ChangeSet getCommittedChanges() const { if (m_committed) return m_changes; else return ChangeSet(); } ChangeSet getChanges() const { return m_changes; } private: TransactionalStore::TSTransaction *m_tx; TransactionalStore::D *m_td; ChangeSet m_changes; mutable bool m_committed; mutable bool m_abandoned; }; TransactionalStore::TransactionalStore(Store *store, DirectWriteBehaviour dwb) : m_d(new D(this, store, dwb)) { } TransactionalStore::~TransactionalStore() { delete m_d; } Transaction * TransactionalStore::startTransaction() { return m_d->startTransaction(); } void TransactionalStore::save(QString filename) const { D::NonTransactionalAccess ntxa(m_d); m_d->getStore()->save(filename); } void TransactionalStore::import(QUrl url, ImportDuplicatesMode idm, QString format) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::import() called without Transaction"); } unique_ptr tx(startTransaction()); return tx->import(url, idm, format); } TransactionalStore::Features TransactionalStore::getSupportedFeatures() const { return m_d->getStore()->getSupportedFeatures(); } bool TransactionalStore::add(Triple t) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::add() called without Transaction"); } // unique_ptr here is very useful to ensure destruction on exceptions unique_ptr tx(startTransaction()); return tx->add(t); } bool TransactionalStore::remove(Triple t) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::remove() called without Transaction"); } unique_ptr tx(startTransaction()); return tx->remove(t); } void TransactionalStore::change(ChangeSet cs) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::change() called without Transaction"); } unique_ptr tx(startTransaction()); tx->change(cs); } void TransactionalStore::revert(ChangeSet cs) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::revert() called without Transaction"); } unique_ptr tx(startTransaction()); tx->revert(cs); } bool TransactionalStore::contains(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->contains(t); } Triples TransactionalStore::match(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->match(t); } ResultSet TransactionalStore::query(QString s) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->query(s); } Node TransactionalStore::complete(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->complete(t); } Triple TransactionalStore::matchOnce(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->matchOnce(t); } Node TransactionalStore::queryOnce(QString s, QString b) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->queryOnce(s, b); } Uri TransactionalStore::getUniqueUri(QString prefix) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->getUniqueUri(prefix); } Node TransactionalStore::addBlankNode() { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::addBlankNode() called without Transaction"); } unique_ptr tx(startTransaction()); return tx->addBlankNode(); } Uri TransactionalStore::expand(QString uri) const { return m_d->expand(uri); } TransactionalStore::TSTransaction::TSTransaction(TransactionalStore::D *td) : m_d(new D(this, td)) { } TransactionalStore::TSTransaction::~TSTransaction() { delete m_d; } bool TransactionalStore::TSTransaction::add(Triple t) { return m_d->add(t); } bool TransactionalStore::TSTransaction::remove(Triple t) { return m_d->remove(t); } void TransactionalStore::TSTransaction::change(ChangeSet cs) { m_d->change(cs); } void TransactionalStore::TSTransaction::revert(ChangeSet cs) { m_d->revert(cs); } bool TransactionalStore::TSTransaction::contains(Triple t) const { return m_d->contains(t); } Triples TransactionalStore::TSTransaction::match(Triple t) const { return m_d->match(t); } ResultSet TransactionalStore::TSTransaction::query(QString sparql) const { return m_d->query(sparql); } Node TransactionalStore::TSTransaction::complete(Triple t) const { return m_d->complete(t); } Triple TransactionalStore::TSTransaction::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node TransactionalStore::TSTransaction::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri TransactionalStore::TSTransaction::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Node TransactionalStore::TSTransaction::addBlankNode() { return m_d->addBlankNode(); } Uri TransactionalStore::TSTransaction::expand(QString uri) const { return m_d->expand(uri); } void TransactionalStore::TSTransaction::save(QString filename) const { return m_d->save(filename); } void TransactionalStore::TSTransaction::import(QUrl url, ImportDuplicatesMode idm, QString format) { m_d->import(url, idm, format); } TransactionalStore::TSTransaction::Features TransactionalStore::TSTransaction::getSupportedFeatures() const { return m_d->getSupportedFeatures(); } void TransactionalStore::TSTransaction::commit() { m_d->commit(); } void TransactionalStore::TSTransaction::rollback() { m_d->rollback(); } ChangeSet TransactionalStore::TSTransaction::getCommittedChanges() const { return m_d->getCommittedChanges(); } ChangeSet TransactionalStore::TSTransaction::getChanges() const { return m_d->getChanges(); } } sonic-visualiser-3.0.3/dataquay/src/Triple.cpp0000644000000000000000000000434513111512442017505 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Triple.h" #include #include namespace Dataquay { bool operator==(const Triple &a, const Triple &b) { if (a.a == b.a && a.b == b.b && a.c == b.c) return true; return false; } bool operator!=(const Triple &a, const Triple &b) { return !operator==(a, b); } QDataStream & operator<<(QDataStream &out, const Triple &t) { return out << t.a << t.b << t.c; } QDataStream & operator>>(QDataStream &in, Triple &t) { return in >> t.a >> t.b >> t.c; } std::ostream & operator<<(std::ostream &out, const Triple &t) { return out << "( " << t.a << " " << t.b << " " << t.c << " )"; } QTextStream & operator<<(QTextStream &out, const Triple &t) { return out << "( " << t.a << " " << t.b << " " << t.c << " )"; } } sonic-visualiser-3.0.3/dataquay/src/Uri.cpp0000644000000000000000000001205313111512442017000 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Uri.h" #include #include #include #include #include #include #include #ifndef NDEBUG #include #endif #include "Debug.h" #include "RDFException.h" namespace Dataquay { class UriRegistrar { public: static UriRegistrar *instance() { static UriRegistrar *inst = 0; static QMutex mutex; mutex.lock(); if (inst == 0) inst = new UriRegistrar(); mutex.unlock(); return inst; } int getType() const { return type; } QString getName() const { return name; } private: QString name; int type; UriRegistrar() : name("Dataquay::Uri") { DQ_DEBUG << "UriRegistrar: registering Dataquay::Uri" << endl; QByteArray bname = name.toLatin1(); type = qRegisterMetaType(bname.data()); qRegisterMetaTypeStreamOperators(bname.data()); } }; QString Uri::metaTypeName() { return UriRegistrar::instance()->getName(); } int Uri::metaTypeId() { int t = UriRegistrar::instance()->getType(); if (t <= 0) { DQ_DEBUG << "Uri::metaTypeId: No meta type available -- did static registration fail?" << endl; return 0; } return t; } void Uri::checkComplete() { if (!canBeComplete(m_uri)) { // may modify m_uri throw RDFIncompleteURI ("Uri::Uri: Given string is not a complete absolute URI", m_uri); } } bool Uri::isCompleteUri(QString s) { QString s0(s); return canBeComplete(s0); } bool Uri::canBeComplete(QString &s) { // An RDF URI must be absolute, with a few special cases if (s == "a") { s = rdfTypeUri().toString(); return true; } else if (s.isEmpty() || s[0] == '#' || s[0] == ':') { return false; } else { // look for scheme (and we know from the above that the first // char is not ':') bool hasScheme = false; for (int i = 0; i < s.length(); ++i) { if (s[i] == QChar(':')) { if (s[i+1] != QChar('/')) break; if (s[i+2] != QChar('/')) break; hasScheme = true; break; } if (!s[i].isLetter()) return false; } if (hasScheme) return true; // we are generous with file URIs: if we get file:x, convert // it to file://x if (s.startsWith("file:")) { s = "file://" + s.right(s.length() - 5); return true; } else { return false; } } } QString Uri::scheme() const { int index = m_uri.indexOf(':'); if (index < 0) return ""; return m_uri.left(index); } bool Uri::operator==(const Uri &u) const { const QString &other = u.m_uri; int len = length(); if (len != other.length()) return false; for (int i = len - 1; i >= 0; --i) { if (m_uri.at(i) != other.at(i)) return false; } return true; } bool Uri::hasUriType(const QVariant &v) { return (v.type() == QVariant::UserType && v.userType() == metaTypeId()); } Uri Uri::rdfTypeUri() { return Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); } QDataStream &operator<<(QDataStream &out, const Uri &u) { return out << u.toString(); } QDataStream &operator>>(QDataStream &in, Uri &u) { QString s; in >> s; u = Uri(s); return in; } std::ostream &operator<<(std::ostream &out, const Uri &u) { return out << u.toString().toLocal8Bit().data(); } QTextStream &operator<<(QTextStream &out, const Uri &u) { return out << u.toString(); } } unsigned int qHash(const Dataquay::Uri &u) { return qHash(u.toString()); } sonic-visualiser-3.0.3/dataquay/src/acsymbols.c0000644000000000000000000000030013111512442017665 0ustar 00000000000000/* These stubs are provided so that autoconf can check library * versions using C symbols only */ extern void dataquay_v_0_9_1_present(void) { } extern void dataquay_v_0_9_present(void) { } sonic-visualiser-3.0.3/dataquay/src/backend/BasicStoreRedland.cpp0000644000000000000000000010030413111512442023155 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef USE_REDLAND #include "BasicStore.h" #include "RDFException.h" #include #include #include #include #include #include #include #include #include "../Debug.h" #include #include namespace Dataquay { class BasicStore::D { public: D() : m_storage(0), m_model(0), m_counter(0) { m_prefixes["rdf"] = Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); m_prefixes["xsd"] = Uri("http://www.w3.org/2001/XMLSchema#"); clear(); } ~D() { QMutexLocker locker(&m_librdfLock); if (m_model) librdf_free_model(m_model); if (m_storage) librdf_free_storage(m_storage); } QString getNewString() const { QString s = QString::fromLocal8Bit (QCryptographicHash::hash (QString("%1").arg(random() + time(0)).toLocal8Bit(), QCryptographicHash::Sha1).toHex()) .left(12); // This may be used as the whole of a name in some contexts, // so it must not start with a digit if (s[0].isDigit()) { s = "x" + s.right(s.length()-1); } return s; } void collision() const { // If we get a collision when generating a "random" string, // seed the random number generator (it probably means the // generator hasn't been seeded at all). But only once. static QMutex m; static bool seeded = false; static QMutexLocker l(&m); if (!seeded) return; srandom(time(0)); seeded = true; } void setBaseUri(Uri baseUri) { QMutexLocker plocker(&m_prefixLock); m_baseUri = baseUri; m_prefixes[""] = m_baseUri; } Uri getBaseUri() const { return m_baseUri; } void clear() { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::clear" << endl; if (m_model) librdf_free_model(m_model); if (m_storage) librdf_free_storage(m_storage); m_storage = librdf_new_storage(m_w.getWorld(), "trees", 0, 0); if (!m_storage) { DQ_DEBUG << "Failed to create RDF trees storage, falling back to default storage type" << endl; m_storage = librdf_new_storage(m_w.getWorld(), 0, 0, 0); if (!m_storage) throw RDFInternalError("Failed to create RDF data storage"); } m_model = librdf_new_model(m_w.getWorld(), m_storage, 0); if (!m_model) throw RDFInternalError("Failed to create RDF data model"); } void addPrefix(QString prefix, Uri uri) { QMutexLocker plocker(&m_prefixLock); m_prefixes[prefix] = uri; } bool add(Triple t) { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::add: " << t << endl; return doAdd(t); } bool remove(Triple t) { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::remove: " << t << endl; if (t.a.type == Node::Nothing || t.b.type == Node::Nothing || t.c.type == Node::Nothing) { Triples tt = doMatch(t); if (tt.empty()) return false; DQ_DEBUG << "BasicStore::remove: Removing " << tt.size() << " triple(s)" << endl; for (int i = 0; i < tt.size(); ++i) { if (!doRemove(tt[i])) { DQ_DEBUG << "Failed to remove matched triple in remove() with wildcards; triple was: " << tt[i] << endl; throw RDFInternalError("Failed to remove matched statement in remove() with wildcards"); } } return true; } else { return doRemove(t); } } void change(ChangeSet cs) { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::change: " << cs.size() << " changes" << endl; for (int i = 0; i < cs.size(); ++i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doAdd(triple)) { throw RDFException("Change add failed: triple is already in store", triple); } break; case RemoveTriple: if (!doRemove(cs[i].second)) { throw RDFException("Change remove failed: triple is not in store", triple); } break; } } } void revert(ChangeSet cs) { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::revert: " << cs.size() << " changes" << endl; for (int i = cs.size()-1; i >= 0; --i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doRemove(triple)) { throw RDFException("Revert of add failed: triple is not in store", triple); } break; case RemoveTriple: if (!doAdd(triple)) { throw RDFException("Revert of remove failed: triple is already in store", triple); } break; } } } bool contains(Triple t) const { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::contains: " << t << endl; librdf_statement *statement = tripleToStatement(t); if (!checkComplete(statement)) { librdf_free_statement(statement); throw RDFException("Failed to test for triple (statement is incomplete)"); } if (!librdf_model_contains_statement(m_model, statement)) { librdf_free_statement(statement); return false; } else { librdf_free_statement(statement); return true; } } Triples match(Triple t) const { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::match: " << t << endl; Triples result = doMatch(t); #ifndef NDEBUG DQ_DEBUG << "BasicStore::match result (size " << result.size() << "):" << endl; for (int i = 0; i < result.size(); ++i) { DQ_DEBUG << i << ". " << result[i] << endl; } #endif return result; } Node complete(Triple t) const { int count = 0, match = 0; if (t.a == Node()) { ++count; match = 0; } if (t.b == Node()) { ++count; match = 1; } if (t.c == Node()) { ++count; match = 2; } if (count != 1) { throw RDFException("Cannot complete triple unless it has only a single wildcard node", t); } QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::complete: " << t << endl; Triples result = doMatch(t, true); if (result.empty()) return Node(); else switch (match) { case 0: return result[0].a; case 1: return result[0].b; case 2: return result[0].c; default: return Node(); } } Triple matchOnce(Triple t) const { if (t.c != Node() && t.b != Node() && t.a != Node()) { // triple is complete: short-circuit to a single lookup if (contains(t)) return t; else return Triple(); } QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::matchOnce: " << t << endl; Triples result = doMatch(t, true); #ifndef NDEBUG DQ_DEBUG << "BasicStore::matchOnce result:" << endl; for (int i = 0; i < result.size(); ++i) { DQ_DEBUG << i << ". " << result[i] << endl; } #endif if (result.empty()) return Triple(); else return result[0]; } ResultSet query(QString sparql) const { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::query: " << sparql << endl; ResultSet rs = runQuery(sparql); return rs; } Node queryOnce(QString sparql, QString bindingName) const { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::queryOnce: " << bindingName << " from " << sparql << endl; ResultSet rs = runQuery(sparql); if (rs.empty()) return Node(); for (ResultSet::const_iterator i = rs.begin(); i != rs.end(); ++i) { Dictionary::const_iterator j = i->find(bindingName); if (j == i->end()) continue; if (j->type == Node::Nothing) continue; return *j; } return Node(); } Uri getUniqueUri(QString prefix) const { QMutexLocker locker(&m_librdfLock); DQ_DEBUG << "BasicStore::getUniqueUri: prefix " << prefix << endl; bool good = false; Uri uri; while (!good) { QString s = getNewString(); uri = expand(prefix + s); Triples t = doMatch(Triple(uri, Node(), Node()), true); if (t.empty()) good = true; else collision(); } return uri; } Uri expand(QString shrt) const { if (shrt == "a") { return Uri::rdfTypeUri(); } int index = shrt.indexOf(':'); if (index == 0) { // starts with colon return Uri(m_baseUri.toString() + shrt.right(shrt.length() - 1)); } else if (index > 0) { // colon appears in middle somewhere if (index + 2 < shrt.length() && shrt[index+1] == '/' && shrt[index+2] == '/') { // we have found "://", this is a scheme, therefore // the uri is already expanded return Uri(shrt); } } else { // no colon present, no possibility of expansion return Uri(shrt); } // fall through only for colon in middle and no "://" found, // i.e. a plausible prefix appears QString prefix = shrt.left(index); QString expanded; m_prefixLock.lock(); PrefixMap::const_iterator pi = m_prefixes.find(prefix); if (pi != m_prefixes.end()) { expanded = pi.value().toString() + shrt.right(shrt.length() - (index + 1)); } else { expanded = shrt; } m_prefixLock.unlock(); return Uri(expanded); } Node addBlankNode() { QMutexLocker locker(&m_librdfLock); librdf_node *node = librdf_new_node_from_blank_identifier(m_w.getWorld(), 0); if (!node) throw RDFInternalError("Failed to create new blank node"); return lrdfNodeToNode(node); } void save(QString filename) const { QMutexLocker wlocker(&m_librdfLock); QMutexLocker plocker(&m_prefixLock); DQ_DEBUG << "BasicStore::save(" << filename << ")" << endl; librdf_uri *base_uri = uriToLrdfUri(m_baseUri); librdf_serializer *s = librdf_new_serializer(m_w.getWorld(), "turtle", 0, 0); if (!s) throw RDFInternalError("Failed to construct RDF serializer"); for (PrefixMap::const_iterator i = m_prefixes.begin(); i != m_prefixes.end(); ++i) { QByteArray b = i.key().toUtf8(); librdf_serializer_set_namespace(s, uriToLrdfUri(i.value()), b.data()); } librdf_serializer_set_namespace(s, uriToLrdfUri(m_baseUri), ""); QFile f(filename); if (!f.exists()) { if (!f.open(QFile::WriteOnly)) { throw RDFException("Failed to open file for writing", filename); } f.close(); } QString tmpFilename = QString("%1.part").arg(filename); QByteArray b = QFile::encodeName(tmpFilename); const char *lname = b.data(); if (librdf_serializer_serialize_model_to_file(s, lname, base_uri, m_model)) { librdf_free_serializer(s); QFile::remove(tmpFilename); throw RDFException("Failed to export RDF model to temporary file", tmpFilename); } librdf_free_serializer(s); // New file is now completed; the following is scruffy, but // that shouldn't really matter now if (!QFile::remove(filename)) { // Not necessarily fatal DQ_DEBUG << "BasicStore::save: Failed to remove former save file " << filename << endl; } if (!QFile::rename(tmpFilename, filename)) { throw RDFException("Failed to rename temporary file to save file", filename); } } void import(QUrl url, ImportDuplicatesMode idm, QString format) { QMutexLocker wlocker(&m_librdfLock); QMutexLocker plocker(&m_prefixLock); QString base = m_baseUri.toString(); if (base == "") { // No base URI in store: use file URL as base base = url.toString(); } // Redland doesn't like file://x for relative file paths, it // insists on file:x (the opposite of Serd) QString fileUri = Uri(url).toString(); if (fileUri.startsWith("file://") && !fileUri.startsWith("file:///")) { fileUri = "file:" + fileUri.right(fileUri.length()-7); } librdf_uri *luri = librdf_new_uri (m_w.getWorld(), (const unsigned char *)fileUri.toUtf8().data()); librdf_uri *base_uri = uriToLrdfUri(Uri(base)); if (format == "") format = "guess"; librdf_parser *parser = librdf_new_parser (m_w.getWorld(), format.toLocal8Bit().data(), NULL, NULL); if (!parser) { throw RDFInternalError("Failed to construct RDF parser"); } if (idm == ImportPermitDuplicates) { // The normal Redland behaviour, so the easy case. if (librdf_parser_parse_into_model (parser, luri, base_uri, m_model)) { librdf_free_parser(parser); DQ_DEBUG << "librdf_parser_parse_into_model failed" << endl; DQ_DEBUG << "luri = " << (const char *)librdf_uri_as_string(luri) << ", base_uri = " << (const char *)librdf_uri_as_string(base_uri) << endl; throw RDFException("Failed to import model from URL", url.toString()); } } else { // ImportFailOnDuplicates and ImportIgnoreDuplicates modes // This is complicated by our desire to avoid storing any // duplicate triples on import, and optionally to be able // to fail if any are found. So we import into a separate // model and then transfer over. Not very efficient, but // scalability is not generally the primary concern for us librdf_storage *is = librdf_new_storage(m_w.getWorld(), "trees", 0, 0); if (!is) is = librdf_new_storage(m_w.getWorld(), 0, 0, 0); if (!is) { librdf_free_parser(parser); throw RDFInternalError("Failed to create import RDF data storage"); } librdf_model *im = librdf_new_model(m_w.getWorld(), is, 0); if (!im) { librdf_free_storage(is); librdf_free_parser(parser); throw RDFInternalError("Failed to create import RDF data model"); } librdf_stream *stream = 0; librdf_statement *all = 0; try { // so as to free parser and im on exception //!!! This appears to be returning success even on a //!!! syntax error -- can this be correct? if (librdf_parser_parse_into_model(parser, luri, base_uri, im)) { DQ_DEBUG << "librdf_parser_parse_into_model failed" << endl; DQ_DEBUG << "luri = " << (const char *)librdf_uri_as_string(luri) << ", base_uri = " << (const char *)librdf_uri_as_string(base_uri) << endl; throw RDFException("Failed to import model from URL", url.toString()); } all = tripleToStatement(Triple()); if (idm == ImportFailOnDuplicates) { // Need to query twice, first time to check for dupes stream = librdf_model_find_statements(im, all); if (!stream) { throw RDFInternalError("Failed to list imported RDF model in duplicates check"); } while (!librdf_stream_end(stream)) { librdf_statement *current = librdf_stream_get_object(stream); if (!current) continue; if (librdf_model_contains_statement(m_model, current)) { throw RDFDuplicateImportException("Duplicate statement encountered on import in ImportFailOnDuplicates mode"); } librdf_stream_next(stream); } librdf_free_stream(stream); stream = 0; } // Now import. Have to do this "manually" because librdf // may allow duplicates and we want to avoid them stream = librdf_model_find_statements(im, all); if (!stream) { throw RDFInternalError("Failed to list imported RDF model"); } while (!librdf_stream_end(stream)) { librdf_statement *current = librdf_stream_get_object(stream); if (!current) continue; if (idm == ImportFailOnDuplicates || // (already tested if so) !librdf_model_contains_statement(m_model, current)) { librdf_model_add_statement(m_model, current); } librdf_stream_next(stream); } librdf_free_stream(stream); stream = 0; } catch (...) { if (stream) librdf_free_stream(stream); if (all) librdf_free_statement(all); librdf_free_parser(parser); librdf_free_model(im); librdf_free_storage(is); throw; } librdf_free_model(im); librdf_free_storage(is); } int namespaces = librdf_parser_get_namespaces_seen_count(parser); DQ_DEBUG << "Parser found " << namespaces << " namespaces" << endl; for (int i = 0; i < namespaces; ++i) { const char *pfx = librdf_parser_get_namespaces_seen_prefix(parser, i); librdf_uri *uri = librdf_parser_get_namespaces_seen_uri(parser, i); QString qpfx = QString::fromUtf8(pfx); Uri quri; try { quri = lrdfUriToUri(uri); } catch (RDFIncompleteURI &) { continue; } DQ_DEBUG << "namespace " << i << ": " << qpfx << " -> " << quri << endl; // don't call addPrefix; it tries to lock the mutex, // and anyway we want to add the prefix only if it // isn't already there (to avoid surprisingly changing // a prefix in unusual cases, or changing the base URI) if (m_prefixes.find(qpfx) == m_prefixes.end()) { m_prefixes[qpfx] = quri; } } librdf_free_parser(parser); } private: class World { public: World() { QMutexLocker locker(&m_mutex); if (!m_world) { m_world = librdf_new_world(); librdf_world_open(m_world); } ++m_refcount; } ~World() { QMutexLocker locker(&m_mutex); if (--m_refcount == 0) { DQ_DEBUG << "Freeing world" << endl; librdf_free_world(m_world); m_world = 0; } } librdf_world *getWorld() const { return m_world; } private: static QMutex m_mutex; static librdf_world *m_world; static int m_refcount; }; World m_w; librdf_storage *m_storage; librdf_model *m_model; static QMutex m_librdfLock; // assume the worst typedef QHash PrefixMap; Uri m_baseUri; PrefixMap m_prefixes; mutable QMutex m_prefixLock; // also protects m_baseUri mutable int m_counter; bool doAdd(Triple t) { librdf_statement *statement = tripleToStatement(t); if (!checkComplete(statement)) { librdf_free_statement(statement); throw RDFException("Failed to add triple (statement is incomplete)"); } if (librdf_model_contains_statement(m_model, statement)) { librdf_free_statement(statement); return false; } if (librdf_model_add_statement(m_model, statement)) { librdf_free_statement(statement); throw RDFInternalError("Failed to add statement to model"); } librdf_free_statement(statement); return true; } bool doRemove(Triple t) { librdf_statement *statement = tripleToStatement(t); if (!checkComplete(statement)) { librdf_free_statement(statement); throw RDFException("Failed to remove triple (statement is incomplete)"); } // Looks like librdf_model_remove_statement returns the wrong // value in trees storage as of 1.0.9, so let's do this check // separately and ignore its return value if (!librdf_model_contains_statement(m_model, statement)) { librdf_free_statement(statement); return false; } librdf_model_remove_statement(m_model, statement); librdf_free_statement(statement); return true; } librdf_uri *uriToLrdfUri(Uri uri) const { librdf_uri *luri = librdf_new_uri (m_w.getWorld(), (const unsigned char *)uri.toString().toUtf8().data()); if (!luri) throw RDFInternalError("Failed to convert URI to internal representation", uri); return luri; } Uri lrdfUriToUri(librdf_uri *u) const { const char *s = (const char *)librdf_uri_as_string(u); if (s) return Uri(QString::fromUtf8(s)); else return Uri(); } librdf_node *nodeToLrdfNode(Node v) const { // called with m_librdfLock held librdf_node *node = 0; switch (v.type) { case Node::Nothing: return 0; case Node::Blank: { QByteArray b = v.value.toUtf8(); const unsigned char *bident = (const unsigned char *)b.data(); node = librdf_new_node_from_blank_identifier(m_w.getWorld(), bident); if (!node) throw RDFException ("Failed to construct node from blank identifier", v.value); } break; case Node::URI: { librdf_uri *uri = uriToLrdfUri(Uri(v.value)); if (!uri) throw RDFException("Failed to construct URI from value ", v.value); node = librdf_new_node_from_uri(m_w.getWorld(), uri); if (!node) throw RDFException("Failed to construct node from URI"); } break; case Node::Literal: { QByteArray b = v.value.toUtf8(); const unsigned char *literal = (const unsigned char *)b.data(); if (v.datatype != Uri()) { Uri dtu = v.datatype; librdf_uri *type_uri = uriToLrdfUri(dtu); node = librdf_new_node_from_typed_literal (m_w.getWorld(), literal, 0, type_uri); if (!node) throw RDFException ("Failed to construct node from literal of type ", v.datatype); } else { node = librdf_new_node_from_literal (m_w.getWorld(), literal, 0, 0); if (!node) throw RDFException ("Failed to construct node from literal"); } } break; } return node; } Node lrdfNodeToNode(librdf_node *node) const { Node v; if (!node) return v; if (librdf_node_is_resource(node)) { v.type = Node::URI; librdf_uri *uri = librdf_node_get_uri(node); v.value = lrdfUriToUri(uri).toString(); } else if (librdf_node_is_literal(node)) { v.type = Node::Literal; const char *s = (const char *)librdf_node_get_literal_value(node); if (s) v.value = QString::fromUtf8(s); librdf_uri *type_uri = librdf_node_get_literal_value_datatype_uri(node); if (type_uri) v.datatype = lrdfUriToUri(type_uri); } else if (librdf_node_is_blank(node)) { v.type = Node::Blank; const char *s = (const char *)librdf_node_get_blank_identifier(node); if (s) v.value = s; } return v; } librdf_statement *tripleToStatement(Triple t) const { librdf_node *na = nodeToLrdfNode(t.a); librdf_node *nb = nodeToLrdfNode(t.b); librdf_node *nc = nodeToLrdfNode(t.c); librdf_statement *statement = librdf_new_statement_from_nodes(m_w.getWorld(), na, nb, nc); if (!statement) throw RDFException("Failed to construct statement"); return statement; } Triple statementToTriple(librdf_statement *statement) const { librdf_node *subject = librdf_statement_get_subject(statement); librdf_node *predicate = librdf_statement_get_predicate(statement); librdf_node *object = librdf_statement_get_object(statement); Triple triple(lrdfNodeToNode(subject), lrdfNodeToNode(predicate), lrdfNodeToNode(object)); return triple; } bool checkComplete(librdf_statement *statement) const { if (librdf_statement_is_complete(statement)) return true; else { unsigned char *text = librdf_statement_to_string(statement); QString str = QString::fromUtf8((char *)text); std::cerr << "BasicStore::checkComplete: WARNING: RDF statement is incomplete: " << str.toStdString() << std::endl; free(text); return false; } } Triples doMatch(Triple t, bool single = false) const { // Any of a, b, and c in t that have Nothing as their node type // will contribute all matching nodes to the returned triples Triples results; librdf_statement *templ = tripleToStatement(t); librdf_stream *stream = librdf_model_find_statements(m_model, templ); librdf_free_statement(templ); if (!stream) throw RDFInternalError("Failed to match RDF triples"); while (!librdf_stream_end(stream)) { librdf_statement *current = librdf_stream_get_object(stream); if (current) results.push_back(statementToTriple(current)); if (single) break; librdf_stream_next(stream); } librdf_free_stream(stream); return results; } ResultSet runQuery(QString rawQuery) const { QString sparql; m_prefixLock.lock(); for (PrefixMap::const_iterator i = m_prefixes.begin(); i != m_prefixes.end(); ++i) { sparql += QString(" PREFIX %1: <%2> ") .arg(i.key()).arg(i.value().toString()); } m_prefixLock.unlock(); sparql += rawQuery; ResultSet returned; librdf_query *query = librdf_new_query(m_w.getWorld(), "sparql", 0, (const unsigned char *)sparql.toUtf8().data(), 0); if (!query) return returned; librdf_query_results *results = librdf_query_execute(query, m_model); if (!results) { librdf_free_query(query); return returned; } if (!librdf_query_results_is_bindings(results)) { librdf_free_query_results(results); librdf_free_query(query); return returned; } while (!librdf_query_results_finished(results)) { int count = librdf_query_results_get_bindings_count(results); Dictionary dict; for (int i = 0; i < count; ++i) { const char *name = librdf_query_results_get_binding_name(results, i); if (!name) continue; QString key = (const char *)name; librdf_node *node = librdf_query_results_get_binding_value(results, i); dict[key] = lrdfNodeToNode(node); } returned.push_back(dict); librdf_query_results_next(results); } librdf_free_query_results(results); librdf_free_query(query); // DQ_DEBUG << "runQuery: returning " << returned.size() << " result(s)" << endl; return returned; } }; QMutex BasicStore::D::m_librdfLock; QMutex BasicStore::D::World::m_mutex; librdf_world * BasicStore::D::World::m_world = 0; int BasicStore::D::World::m_refcount = 0; BasicStore::BasicStore() : m_d(new D()) { } BasicStore::~BasicStore() { delete m_d; } void BasicStore::setBaseUri(Uri uri) { m_d->setBaseUri(uri); } Uri BasicStore::getBaseUri() const { return m_d->getBaseUri(); } void BasicStore::clear() { m_d->clear(); } bool BasicStore::add(Triple t) { return m_d->add(t); } bool BasicStore::remove(Triple t) { return m_d->remove(t); } void BasicStore::change(ChangeSet t) { m_d->change(t); } void BasicStore::revert(ChangeSet t) { m_d->revert(t); } bool BasicStore::contains(Triple t) const { return m_d->contains(t); } Triples BasicStore::match(Triple t) const { return m_d->match(t); } void BasicStore::addPrefix(QString prefix, Uri uri) { m_d->addPrefix(prefix, uri); } ResultSet BasicStore::query(QString sparql) const { return m_d->query(sparql); } Node BasicStore::complete(Triple t) const { return m_d->complete(t); } Triple BasicStore::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node BasicStore::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri BasicStore::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Uri BasicStore::expand(QString uri) const { return m_d->expand(uri); } Node BasicStore::addBlankNode() { return m_d->addBlankNode(); } void BasicStore::save(QString filename) const { m_d->save(filename); } void BasicStore::import(QUrl url, ImportDuplicatesMode idm, QString format) { m_d->import(url, idm, format); } BasicStore * BasicStore::load(QUrl url, QString format) { BasicStore *s = new BasicStore(); s->setBaseUri(Uri(url)); // store is empty, ImportIgnoreDuplicates is faster s->import(url, ImportIgnoreDuplicates, format); return s; } BasicStore::Features BasicStore::getSupportedFeatures() const { Features fs; fs << ModifyFeature << QueryFeature << RemoteImportFeature; return fs; } } #endif sonic-visualiser-3.0.3/dataquay/src/backend/BasicStoreSord.cpp0000644000000000000000000007305513111512442022527 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef USE_SORD #include "BasicStore.h" #include "RDFException.h" #include #include #include #include #include #include #include #include #include "../Debug.h" #include #include #include namespace Dataquay { class BasicStore::D { public: D() : m_model(0) { m_prefixes["rdf"] = Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); m_prefixes["xsd"] = Uri("http://www.w3.org/2001/XMLSchema#"); clear(); } ~D() { QMutexLocker locker(&m_backendLock); if (m_model) sord_free(m_model); } QString getNewString() const { QString s = QString::fromLocal8Bit (QCryptographicHash::hash (QString("%1").arg(rand() + time(0)).toLocal8Bit(), QCryptographicHash::Sha1).toHex()) .left(12); // This may be used as the whole of a name in some contexts, // so it must not start with a digit if (s[0].isDigit()) { s = "x" + s.right(s.length()-1); } return s; } void collision() const { // If we get a collision when generating a "random" string, // seed the random number generator (it probably means the // generator hasn't been seeded at all). But only once. static QMutex m; static bool seeded = false; static QMutexLocker l(&m); if (!seeded) return; srand((unsigned int)time(0)); seeded = true; } void setBaseUri(Uri baseUri) { QMutexLocker plocker(&m_prefixLock); m_baseUri = baseUri; m_prefixes[""] = m_baseUri; } Uri getBaseUri() const { return m_baseUri; } void clear() { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::clear" << endl; if (m_model) sord_free(m_model); // Sord can only perform wildcard matches if at least one of // the non-wildcard nodes in the matched triple is the primary // term for one of its indices m_model = sord_new(m_w.getWorld(), SORD_SPO|SORD_OPS|SORD_POS, false); if (!m_model) throw RDFInternalError("Failed to create RDF data model"); } void addPrefix(QString prefix, Uri uri) { QMutexLocker plocker(&m_prefixLock); m_prefixes[prefix] = uri; } bool add(Triple t) { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::add: " << t << endl; return doAdd(t); } bool remove(Triple t) { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::remove: " << t << endl; if (t.a.type == Node::Nothing || t.b.type == Node::Nothing || t.c.type == Node::Nothing) { Triples tt = doMatch(t); if (tt.empty()) return false; DQ_DEBUG << "BasicStore::remove: Removing " << tt.size() << " triple(s)" << endl; for (int i = 0; i < tt.size(); ++i) { if (!doRemove(tt[i])) { DQ_DEBUG << "Failed to remove matched triple in remove() with wildcards; triple was: " << tt[i] << endl; throw RDFInternalError("Failed to remove matched statement in remove() with wildcards"); } } return true; } else { return doRemove(t); } } void change(ChangeSet cs) { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::change: " << cs.size() << " changes" << endl; for (int i = 0; i < cs.size(); ++i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doAdd(triple)) { throw RDFException("Change add failed: triple is already in store", triple); } break; case RemoveTriple: if (!doRemove(cs[i].second)) { throw RDFException("Change remove failed: triple is not in store", triple); } break; } } } void revert(ChangeSet cs) { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::revert: " << cs.size() << " changes" << endl; for (int i = cs.size()-1; i >= 0; --i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doRemove(triple)) { throw RDFException("Revert of add failed: triple is not in store", triple); } break; case RemoveTriple: if (!doAdd(triple)) { throw RDFException("Revert of remove failed: triple is already in store", triple); } break; } } } bool contains(Triple t) const { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::contains: " << t << endl; SordQuad statement; tripleToStatement(t, statement); if (!checkComplete(statement)) { throw RDFException("Failed to test for triple (statement is incomplete)"); } if (!sord_contains(m_model, statement)) { return false; } freeStatement(statement); return true; } Triples match(Triple t) const { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::match: " << t << endl; Triples result = doMatch(t); #ifndef NDEBUG DQ_DEBUG << "BasicStore::match result (size " << result.size() << "):" << endl; for (int i = 0; i < result.size(); ++i) { DQ_DEBUG << i << ". " << result[i] << endl; } #endif return result; } Node complete(Triple t) const { int count = 0, match = 0; if (t.a == Node()) { ++count; match = 0; } if (t.b == Node()) { ++count; match = 1; } if (t.c == Node()) { ++count; match = 2; } if (count != 1) { throw RDFException("Cannot complete triple unless it has only a single wildcard node", t); } QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::complete: " << t << endl; Triples result = doMatch(t, true); if (result.empty()) return Node(); else switch (match) { case 0: return result[0].a; case 1: return result[0].b; case 2: return result[0].c; default: return Node(); } } Triple matchOnce(Triple t) const { if (t.c != Node() && t.b != Node() && t.a != Node()) { // triple is complete: short-circuit to a single lookup if (contains(t)) return t; else return Triple(); } QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::matchOnce: " << t << endl; Triples result = doMatch(t, true); #ifndef NDEBUG DQ_DEBUG << "BasicStore::matchOnce result:" << endl; for (int i = 0; i < result.size(); ++i) { DQ_DEBUG << i << ". " << result[i] << endl; } #endif if (result.empty()) return Triple(); else return result[0]; } ResultSet query(QString sparql) const { throw RDFUnsupportedError ("SPARQL queries are not supported with Sord backend", sparql); } Node queryOnce(QString sparql, QString /* bindingName */) const { throw RDFUnsupportedError ("SPARQL queries are not supported with Sord backend", sparql); } Uri getUniqueUri(QString prefix) const { QMutexLocker locker(&m_backendLock); DQ_DEBUG << "BasicStore::getUniqueUri: prefix " << prefix << endl; bool good = false; Uri uri; while (!good) { QString s = getNewString(); uri = expand(prefix + s); Triples t = doMatch(Triple(uri, Node(), Node()), true); if (t.empty()) good = true; else collision(); } return uri; } Uri expand(QString shrt) const { if (shrt == "a") { return Uri::rdfTypeUri(); } int index = shrt.indexOf(':'); if (index == 0) { // starts with colon return Uri(m_baseUri.toString() + shrt.right(shrt.length() - 1)); } else if (index > 0) { // colon appears in middle somewhere if (index + 2 < shrt.length() && shrt[index+1] == '/' && shrt[index+2] == '/') { // we have found "://", this is a scheme, therefore // the uri is already expanded return Uri(shrt); } } else { // no colon present, no possibility of expansion return Uri(shrt); } // fall through only for colon in middle and no "://" found, // i.e. a plausible prefix appears QString prefix = shrt.left(index); QString expanded; m_prefixLock.lock(); PrefixMap::const_iterator pi = m_prefixes.find(prefix); if (pi != m_prefixes.end()) { expanded = pi.value().toString() + shrt.right(shrt.length() - (index + 1)); } else { expanded = shrt; } m_prefixLock.unlock(); return Uri(expanded); } Node addBlankNode() { QMutexLocker locker(&m_backendLock); QString blankId = getNewString(); //!!! todo: how to check whether the blank node is already in use SordNode *node = sord_new_blank(m_w.getWorld(), (uint8_t *)blankId.toUtf8().data()); if (!node) throw RDFInternalError("Failed to create new blank node"); return sordNodeToNode(node); } static size_t saveSink(const void *buf, size_t len, void *stream) { QIODevice *dev = (QIODevice *)stream; qint64 r = dev->write((const char *)buf, len); if (r < 0) throw RDFException("Write failed"); else return r; } void save(QString filename) const { QMutexLocker wlocker(&m_backendLock); QMutexLocker plocker(&m_prefixLock); DQ_DEBUG << "BasicStore::save(" << filename << ")" << endl; QByteArray bb = m_baseUri.toString().toUtf8(); SerdURI bu; if (serd_uri_parse((uint8_t *)bb.data(), &bu) != SERD_SUCCESS) { throw RDFInternalError("Failed to parse base URI", m_baseUri); } SerdNode bn = serd_node_from_string(SERD_URI, (uint8_t *)bb.data()); SerdEnv *env = serd_env_new(&bn); for (PrefixMap::const_iterator i = m_prefixes.begin(); i != m_prefixes.end(); ++i) { addToSerdNamespace(env, i.key(), i.value().toString()); } // addToSerdNamespace(env, QString(), m_baseUri.toString()); QFile f(filename); if (!f.exists()) { if (!f.open(QFile::WriteOnly)) { throw RDFException("Failed to open file for writing", filename); } f.close(); } QString tmpFilename = QString("%1.part").arg(filename); QFile tf(tmpFilename); if (!tf.open(QFile::WriteOnly)) { throw RDFException("Failed to open partial file for writing", tmpFilename); } SerdEnv *wenv = serd_env_new(&bn); SerdWriter *writer = serd_writer_new (SERD_TURTLE, SerdStyle(SERD_STYLE_ABBREVIATED | SERD_STYLE_RESOLVED | SERD_STYLE_CURIED), wenv, &bu, saveSink, &tf); serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer); sord_write(m_model, writer, NULL); serd_writer_finish(writer); serd_writer_free(writer); serd_env_free(env); serd_env_free(wenv); tf.close(); // New file is now completed; the following is scruffy, but // that shouldn't really matter now if (!QFile::remove(filename)) { // Not necessarily fatal DQ_DEBUG << "BasicStore::save: Failed to remove former save file " << filename << endl; } if (!QFile::rename(tmpFilename, filename)) { throw RDFException("Failed to rename temporary file to save file", filename); } } void addPrefixOnImport(QString pfx, Uri uri) { DQ_DEBUG << "namespace: " << pfx << " -> " << uri << endl; // don't call addPrefix; it tries to lock the mutex, // and anyway we want to add the prefix only if it // isn't already there (to avoid surprisingly changing // a prefix in unusual cases, or changing the base URI) if (m_prefixes.find(pfx) == m_prefixes.end()) { m_prefixes[pfx] = uri; } } static SerdStatus addPrefixSink(void *handle, const SerdNode *name, const SerdNode *uri) { D *d = (D *)handle; try { QString qpfx(QString::fromUtf8((const char *)name->buf, (int)name->n_bytes)); Uri quri(QString::fromUtf8((const char *)uri->buf, (int)uri->n_bytes)); d->addPrefixOnImport(qpfx, quri); } catch (RDFIncompleteURI &) { } return SERD_SUCCESS; } void import(QUrl url, ImportDuplicatesMode idm, QString /* format */) { DQ_DEBUG << "BasicStoreSord::import: " << url << endl; QMutexLocker wlocker(&m_backendLock); QMutexLocker plocker(&m_prefixLock); //!!! todo: format? QString base = m_baseUri.toString(); if (base == "") { // No base URI in store: use file URL as base base = url.toString(); } QByteArray bb = base.toUtf8(); SerdURI bu; if (serd_uri_parse((uint8_t *)bb.data(), &bu) != SERD_SUCCESS) { throw RDFInternalError("Failed to parse base URI", base); } SerdNode bn = serd_node_from_string(SERD_URI, (uint8_t *)bb.data()); SerdEnv *env = serd_env_new(&bn); QString fileUri = url.toString(); // serd_uri_to_path doesn't like the brief file:blah // convention, it insists that file: is followed by // // (the opposite of Redland) if (fileUri.startsWith("file:") && !fileUri.startsWith("file://")) { // however, it's happy with scheme-less paths fileUri = fileUri.right(fileUri.length()-5); } if (idm == ImportPermitDuplicates) { // No special handling for duplicates, do whatever the // underlying engine does SerdReader *reader = sord_new_reader(m_model, env, SERD_TURTLE, NULL); // if we have data in the store already, then we must add // a prefix for the new blank nodes we're importing to // disambiguate them if (!doMatch(Triple(), true).empty()) { serd_reader_add_blank_prefix (reader, (uint8_t *)(getNewString().toUtf8().data())); } SerdStatus rv = serd_reader_read_file (reader, (const uint8_t *)fileUri.toLocal8Bit().data()); if (rv != SERD_SUCCESS) { serd_reader_free(reader); serd_env_free(env); throw RDFException (QString("Failed to import model from URL: %1") .arg(serdStatusToString(rv)), url.toString()); } serd_reader_free(reader); } else { // ImportFailOnDuplicates and ImportIgnoreDuplicates: // import into a separate model and transfer across SordModel *im = sord_new(m_w.getWorld(), 0, false); // no index SerdReader *reader = sord_new_reader(im, env, SERD_TURTLE, NULL); // if we have data in the store already, then we must add // a prefix for the new blank nodes we're importing to // disambiguate them if (!doMatch(Triple(), true).empty()) { serd_reader_add_blank_prefix (reader, (uint8_t *)(getNewString().toUtf8().data())); } SerdStatus rv = serd_reader_read_file (reader, (const uint8_t *)fileUri.toLocal8Bit().data()); if (rv != SERD_SUCCESS) { serd_reader_free(reader); sord_free(im); serd_env_free(env); throw RDFException (QString("Failed to import model from URL: %1") .arg(serdStatusToString(rv)), url.toString()); } serd_reader_free(reader); SordQuad templ; tripleToStatement(Triple(), templ); if (idm == ImportFailOnDuplicates) { SordIter *itr = sord_find(im, templ); while (!sord_iter_end(itr)) { SordQuad q; sord_iter_get(itr, q); if (sord_contains(m_model, q)) { Triple culprit = statementToTriple(q); sord_iter_free(itr); freeStatement(templ); sord_free(im); serd_env_free(env); throw RDFDuplicateImportException("Duplicate statement encountered on import in ImportFailOnDuplicates mode", culprit); } sord_iter_next(itr); } sord_iter_free(itr); } SordIter *itr = sord_find(im, templ); while (!sord_iter_end(itr)) { SordQuad q; sord_iter_get(itr, q); if (idm == ImportFailOnDuplicates || // (already tested if so) !sord_contains(m_model, q)) { sord_add(m_model, q); } sord_iter_next(itr); } sord_iter_free(itr); freeStatement(templ); sord_free(im); } serd_env_foreach(env, addPrefixSink, this); serd_env_free(env); } private: class World { public: World() { QMutexLocker locker(&m_mutex); if (!m_world) { m_world = sord_world_new(); } ++m_refcount; } ~World() { QMutexLocker locker(&m_mutex); DQ_DEBUG << "~World: About to lower refcount from " << m_refcount << endl; if (--m_refcount == 0) { DQ_DEBUG << "Freeing world" << endl; sord_world_free(m_world); m_world = 0; } } SordWorld *getWorld() const { return m_world; } private: static QMutex m_mutex; static SordWorld *m_world; static int m_refcount; }; World m_w; SordModel *m_model; static QMutex m_backendLock; // assume the worst typedef QHash PrefixMap; Uri m_baseUri; PrefixMap m_prefixes; mutable QMutex m_prefixLock; // also protects m_baseUri bool doAdd(Triple t) { SordQuad statement; tripleToStatement(t, statement); if (!checkComplete(statement)) { throw RDFException("Failed to add triple (statement is incomplete)"); } if (sord_contains(m_model, statement)) { return false; } sord_add(m_model, statement); freeStatement(statement); return true; } bool doRemove(Triple t) { SordQuad statement; tripleToStatement(t, statement); if (!checkComplete(statement)) { throw RDFException("Failed to remove triple (statement is incomplete)"); } if (!sord_contains(m_model, statement)) { return false; } sord_remove(m_model, statement); freeStatement(statement); return true; } SordNode *uriToSordNode(Uri uri) const { SordNode *node = sord_new_uri (m_w.getWorld(), (const unsigned char *)uri.toString().toUtf8().data()); if (!node) throw RDFInternalError("Failed to convert URI to internal representation", uri); return node; } //!!! utility function to extract string value from node would be more useful Uri sordNodeToUri(const SordNode *n) const { if (!n || sord_node_get_type(n) != SORD_URI) { return Uri(); } const uint8_t *s = sord_node_get_string(n); if (s) return Uri(QString::fromUtf8((char *)s)); else return Uri(); } SordNode *nodeToSordNode(Node v) const { // called with m_backendLock held SordNode *node = 0; switch (v.type) { case Node::Nothing: return 0; case Node::Blank: { QByteArray b = v.value.toUtf8(); const unsigned char *bident = (const unsigned char *)b.data(); node = sord_new_blank(m_w.getWorld(), bident); if (!node) throw RDFException ("Failed to construct node from blank identifier", v.value); } break; case Node::URI: { node = uriToSordNode(Uri(v.value)); if (!node) throw RDFException("Failed to construct node from URI"); } break; case Node::Literal: { QByteArray b = v.value.toUtf8(); const unsigned char *literal = (const unsigned char *)b.data(); if (v.datatype != Uri()) { SordNode *typeNode = uriToSordNode(v.datatype); node = sord_new_literal(m_w.getWorld(), typeNode, literal, 0); if (!node) throw RDFException ("Failed to construct node from literal of type ", v.datatype); } else { node = sord_new_literal(m_w.getWorld(), 0, literal, 0); if (!node) throw RDFException ("Failed to construct node from literal"); } } break; } return node; } Node sordNodeToNode(const SordNode *node) const { Node v; if (!node) return v; SordNodeType type = sord_node_get_type(node); switch (type) { case SORD_URI: v.type = Node::URI; v.value = sordNodeToUri(node).toString(); break; case SORD_BLANK: v.type = Node::Blank; //!!! utility function for this -- types and what if it's null? v.value = QString::fromUtf8((char *)sord_node_get_string(node)); break; case SORD_LITERAL: v.type = Node::Literal; //!!! utility function for this -- types and what if it's null? v.value = QString::fromUtf8((char *)sord_node_get_string(node)); v.datatype = sordNodeToUri(sord_node_get_datatype(node)); break; } return v; } void tripleToStatement(Triple t, SordQuad q) const { q[0] = nodeToSordNode(t.a); q[1] = nodeToSordNode(t.b); q[2] = nodeToSordNode(t.c); q[3] = 0; } void freeStatement(SordQuad q) const { // Not for removing statements from the store for (int i = 0; i < 4; ++i) { sord_node_free(m_w.getWorld(), (SordNode *)q[i]); } } Triple statementToTriple(const SordQuad q) const { Triple triple(sordNodeToNode(q[0]), sordNodeToNode(q[1]), sordNodeToNode(q[2])); return triple; } bool checkComplete(const SordQuad q) const { if (!q[0] || !q[1] || !q[2]) { std::cerr << "BasicStore::checkComplete: WARNING: RDF statement contains one or more NULL nodes" << std::endl; return false; } if ((sord_node_get_type(q[0]) == SORD_URI || sord_node_get_type(q[0]) == SORD_BLANK) && (sord_node_get_type(q[1]) == SORD_URI)) { return true; } else { std::cerr << "BasicStore::checkComplete: WARNING: RDF statement is incomplete: [" << sord_node_get_string(q[0]) << "," << sord_node_get_string(q[1]) << "," << sord_node_get_string(q[2]) << "]" << std::endl; return false; } } void addToSerdNamespace(SerdEnv *env, QString key, QString value) const { QByteArray b = key.toUtf8(); QByteArray v = value.toUtf8(); SerdNode name = serd_node_from_string(SERD_URI, (uint8_t *)b.data()); SerdNode uri = serd_node_from_string(SERD_URI, (uint8_t *)v.data()); serd_env_set_prefix(env, &name, &uri); // copies name, uri } Triples doMatch(Triple t, bool single = false) const { // Any of a, b, and c in t that have Nothing as their node type // will contribute all matching nodes to the returned triples Triples results; SordQuad templ; tripleToStatement(t, templ); SordIter *itr = sord_find(m_model, templ); while (!sord_iter_end(itr)) { SordQuad q; sord_iter_get(itr, q); results.push_back(statementToTriple(q)); if (single) break; sord_iter_next(itr); } sord_iter_free(itr); freeStatement(templ); return results; } QString serdStatusToString(SerdStatus s) { switch (s) { case SERD_SUCCESS: return "Success"; case SERD_FAILURE: return "Non-fatal failure"; case SERD_ERR_UNKNOWN: return "Unknown error"; case SERD_ERR_BAD_SYNTAX: return "Invalid syntax"; case SERD_ERR_NOT_FOUND: return "Not found"; case SERD_ERR_BAD_ARG: return "Bad argument"; case SERD_ERR_ID_CLASH: return "Blank node ID clash"; case SERD_ERR_BAD_CURIE: return "Bad abbreviated URI"; case SERD_ERR_INTERNAL: return "Internal error in Serd"; } return QString("Unknown Serd error type"); } }; QMutex BasicStore::D::m_backendLock; QMutex BasicStore::D::World::m_mutex; SordWorld * BasicStore::D::World::m_world = 0; int BasicStore::D::World::m_refcount = 0; BasicStore::BasicStore() : m_d(new D()) { } BasicStore::~BasicStore() { delete m_d; } void BasicStore::setBaseUri(Uri uri) { m_d->setBaseUri(uri); } Uri BasicStore::getBaseUri() const { return m_d->getBaseUri(); } void BasicStore::clear() { m_d->clear(); } bool BasicStore::add(Triple t) { return m_d->add(t); } bool BasicStore::remove(Triple t) { return m_d->remove(t); } void BasicStore::change(ChangeSet t) { m_d->change(t); } void BasicStore::revert(ChangeSet t) { m_d->revert(t); } bool BasicStore::contains(Triple t) const { return m_d->contains(t); } Triples BasicStore::match(Triple t) const { return m_d->match(t); } void BasicStore::addPrefix(QString prefix, Uri uri) { m_d->addPrefix(prefix, uri); } ResultSet BasicStore::query(QString sparql) const { return m_d->query(sparql); } Node BasicStore::complete(Triple t) const { return m_d->complete(t); } Triple BasicStore::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node BasicStore::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri BasicStore::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Uri BasicStore::expand(QString uri) const { return m_d->expand(uri); } Node BasicStore::addBlankNode() { return m_d->addBlankNode(); } void BasicStore::save(QString filename) const { m_d->save(filename); } void BasicStore::import(QUrl url, ImportDuplicatesMode idm, QString format) { m_d->import(url, idm, format); } BasicStore * BasicStore::load(QUrl url, QString format) { BasicStore *s = new BasicStore(); QString su = url.toString(); Uri baseUri(su.replace(" ", "%20")); s->setBaseUri(baseUri); // store is empty, ImportIgnoreDuplicates is faster s->import(url, ImportIgnoreDuplicates, format); return s; } BasicStore::Features BasicStore::getSupportedFeatures() const { Features fs; fs << ModifyFeature; return fs; } } #endif sonic-visualiser-3.0.3/dataquay/src/backend/define-check.cpp0000644000000000000000000000033013111512442022130 0ustar 00000000000000 #ifdef USE_REDLAND #ifdef USE_SORD #error Only one of USE_REDLAND and USE_SORD may be defined #endif #endif #ifndef USE_REDLAND #ifndef USE_SORD #error One of USE_REDLAND or USE_SORD must be defined #endif #endif sonic-visualiser-3.0.3/dataquay/src/objectmapper/ContainerBuilder.cpp0000644000000000000000000000344313111512442024150 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ContainerBuilder.h" #include #include namespace Dataquay { ContainerBuilder * ContainerBuilder::getInstance() { static ContainerBuilder *instance; static QMutex mutex; QMutexLocker locker(&mutex); if (!instance) instance = new ContainerBuilder(); return instance; } } sonic-visualiser-3.0.3/dataquay/src/objectmapper/ObjectBuilder.cpp0000644000000000000000000000342413111512442023433 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectBuilder.h" #include #include namespace Dataquay { ObjectBuilder * ObjectBuilder::getInstance() { static ObjectBuilder *instance; static QMutex mutex; QMutexLocker locker(&mutex); if (!instance) instance = new ObjectBuilder(); return instance; } } sonic-visualiser-3.0.3/dataquay/src/objectmapper/ObjectLoader.cpp0000644000000000000000000010077413111512442023261 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectLoader.h" #include "objectmapper/ObjectBuilder.h" #include "objectmapper/ContainerBuilder.h" #include "objectmapper/TypeMapping.h" #include "objectmapper/ObjectMapperExceptions.h" #include #include #include "PropertyObject.h" #include "Store.h" #include "../Debug.h" namespace Dataquay { /* * Generally we pass around a LoadState object recording current * progress and work still to do. See LoadState for the terminology * used. * * We have five phases: * * 1. Collect -- given the requested node set, fill the toAllocate, * toInitialise, and toPopulate sets based on the FollowPolicy. * * 2. Allocate -- construct new nodes for those in toAllocate that are * not yet in the map. Recurse as appropriate to parent, siblings and * children. (toAllocate contains all the nodes we will need to load, * including those we will recurse to when assigning properties for * FollowObjectProperties policy later.) * * 3. Initialise -- set the "literal" properties for each node in * toInitialise * * 4. Immediate callbacks -- call any registered immediate load * callbacks for each node (these are callbacks that may use the * "literal" data but should be called before related nodes are * loaded) * 5. Populate -- set all remaining properties for each node in * toPopulate * * 6. Final callbacks -- call any registered final load callbacks for * each node * * Notes * * We should construct a new object when: * * - a node in requested does not appear in map or is null in map * * - a node called for as parent or object property does not appear in * map and the relevant follows policy is set * * We should reload properties for an object node when: * * - the node is in requested * * - the node has just been loaded * * We should delete an object when: * * - a node in requested is in the map but not in the store * * Cycles are only a problem when loading objects -- not when setting * properties. So we need to ensure that all objects that will need * to be loaded for object properties or parents etc are identified * before we start loading, then we load relationship tree (no * cycles), then we load property objects, then we go through setting * properties on the appropriate objects. */ class ObjectLoader::D { typedef QSet NodeSet; public: struct LoadState { LoadState() : loadFlags(0) { } /// Nodes the customer has explicitly asked to load or reload Nodes requested; /// Nodes whose objects will need to be constructed if possible NodeSet toAllocate; /// Nodes pending the first (literal) property assignment NodeSet toInitialise; /// Nodes pending the full property assignment NodeSet toPopulate; /// All known node-object correspondences, to be updated as we go NodeObjectMap map; enum LoadFlags { /// Do not throw exception if RDF type unknown (for loadAll etc) IgnoreUnknownTypes = 1 << 0, }; unsigned int loadFlags; }; D(ObjectLoader *m, Store *s) : m_m(m), m_ob(ObjectBuilder::getInstance()), m_cb(ContainerBuilder::getInstance()), m_s(s), m_fp(FollowNone), m_ap(IgnoreAbsentProperties) { updatePropertyNames(); } Store *getStore() { return m_s; } void setTypeMapping(const TypeMapping &tm) { m_tm = tm; updatePropertyNames(); } const TypeMapping &getTypeMapping() const { return m_tm; } void setFollowPolicy(FollowPolicy fp) { m_fp = fp; } FollowPolicy getFollowPolicy() const { return m_fp; } void setAbsentPropertyPolicy(AbsentPropertyPolicy ap) { m_ap = ap; } AbsentPropertyPolicy getAbsentPropertyPolicy() const { return m_ap; } void updatePropertyNames() { m_parentProp = Uri(m_tm.getRelationshipPrefix().toString() + "parent"); m_followProp = Uri(m_tm.getRelationshipPrefix().toString() + "follows"); } QObject *load(Node node) { LoadState state; state.requested << node; collect(state); load(state); return state.map.value(node); } void reload(Nodes nodes, NodeObjectMap &map) { DQ_DEBUG << "reload: " << nodes << endl; LoadState state; state.requested = nodes; state.map = map; state.loadFlags = LoadState::IgnoreUnknownTypes; collect(state); load(state); map = state.map; } QObjectList loadType(Uri type) { NodeObjectMap map; return loadType(type, map); } QObjectList loadType(Uri type, NodeObjectMap &map) { return loadType(Node(type), map); } QObjectList loadType(Node typeNode, NodeObjectMap &map) { Nodes nodes; Triples candidates = m_s->match(Triple(Node(), Uri("a"), typeNode)); foreach (Triple t, candidates) { if (t.c.type != Node::URI) continue; nodes.push_back(t.a); } LoadState state; state.requested = nodes; state.map = map; collect(state); load(state); QObjectList objects; foreach (Node n, nodes) { QObject *o = map.value(n); if (o) objects.push_back(o); } return objects; } QObjectList loadAll() { NodeObjectMap map; return loadAll(map); } QObjectList loadAll(NodeObjectMap &map) { Nodes nodes; Triples candidates = m_s->match(Triple(Node(), Uri("a"), Node())); foreach (Triple t, candidates) { if (t.c.type != Node::URI) continue; nodes.push_back(t.a); } LoadState state; state.requested = nodes; state.map = map; state.loadFlags = LoadState::IgnoreUnknownTypes; collect(state); load(state); map = state.map; QObjectList objects; foreach (Node n, nodes) { QObject *o = map.value(n); if (o) objects.push_back(o); } return objects; } void addLoadCallback(LoadCallback *cb, LoadCallbackType type) { switch (type) { case ImmediateCallback: m_immediateCallbacks.push_back(cb); break; case FinalCallback: m_finalCallbacks.push_back(cb); break; } } private: ObjectLoader *m_m; ObjectBuilder *m_ob; ContainerBuilder *m_cb; Store *m_s; TypeMapping m_tm; FollowPolicy m_fp; AbsentPropertyPolicy m_ap; QList m_immediateCallbacks; QList m_finalCallbacks; Uri m_parentProp; Uri m_followProp; void collect(LoadState &state) { Nodes candidates = state.requested; NodeSet visited; // Avoid ever pushing the nil Node as a future candidate by // marking it as used already visited << Node(); // Use counter to iterate, so that when additional elements // pushed onto the end of state.desired will be iterated over for (int i = 0; i < candidates.size(); ++i) { Node node = candidates[i]; visited << node; if (!state.map.contains(node) || state.map.value(node) == 0) { if (!nodeHasTypeInStore(node)) { continue; } else { state.toAllocate.insert(node); state.toInitialise.insert(node); state.toPopulate.insert(node); } } else if (i < state.requested.size()) { // This is one of the requested nodes, which were at // the start of the candidates list if (!nodeHasTypeInStore(node)) { DQ_DEBUG << "Node " << node << " has no type in store, deleting and resetting" << endl; delete state.map.value(node); state.map.insert(node, 0); continue; } state.toInitialise.insert(node); state.toPopulate.insert(node); } Nodes relatives; if (m_fp & FollowParent) { relatives << parentOf(node); } if (m_fp & FollowChildren) { relatives << childrenOf(node); } if (m_fp & FollowSiblings) { relatives << prevSiblingOf(node) << nextSiblingOf(node); } if (m_fp & FollowObjectProperties) { relatives << potentialPropertyNodesOf(node); } foreach (Node r, relatives) { if (!visited.contains(r)) { candidates << r; } } } DQ_DEBUG << "ObjectLoader: collect: " << "requested = " << state.requested.size() << ", toAllocate = " << state.toAllocate.size() << ", toInitialise = " << state.toInitialise.size() << ", toPopulate = " << state.toPopulate.size() << endl; DQ_DEBUG << "Requested:"; foreach (Node n, state.requested) DQ_DEBUG << n; DQ_DEBUG << "toAllocate:"; foreach (Node n, state.toAllocate) DQ_DEBUG << n; DQ_DEBUG << "toInitialise:"; foreach (Node n, state.toInitialise) DQ_DEBUG << n; DQ_DEBUG << "toPopulate:"; foreach (Node n, state.toPopulate) DQ_DEBUG << n; DQ_DEBUG << endl; } bool nodeHasTypeInStore(Node node) { Triple t = m_s->matchOnce(Triple(node, Uri("a"), Node())); return (t.c.type == Node::URI); } Node parentOf(Node node) { Triple t = m_s->matchOnce(Triple(node, m_parentProp, Node())); if (t != Triple()) return t.c; else return Node(); } Nodes childrenOf(Node node) { Nodes nn; Triples tt = m_s->match(Triple(Node(), m_parentProp, node)); foreach (Triple t, tt) nn << t.a; return nn; } Node prevSiblingOf(Node node) { Triple t = m_s->matchOnce(Triple(node, m_followProp, Node())); if (t != Triple()) return t.c; else return Node(); } Node nextSiblingOf(Node node) { Triple t = m_s->matchOnce(Triple(Node(), m_followProp, node)); if (t != Triple()) return t.a; else return Node(); } Nodes orderedSiblingsOf(Node node) { Node current = node; Node prior; while ((prior = prevSiblingOf(current)) != Node()) { current = prior; } Nodes siblings; while (current != Node()) { siblings << current; current = nextSiblingOf(current); } return siblings; } Nodes orderedChildrenOf(Node node) { // We're not certain to find follows properties for all // children; if some or all are missing, we still need to // return the right number of children -- they just won't // actually be ordered Nodes children = childrenOf(node); if (children.empty()) return children; NodeSet remaining = NodeSet::fromList(children); Nodes ordered = orderedSiblingsOf(children[0]); remaining.subtract(NodeSet::fromList(ordered)); foreach (Node n, remaining) ordered.push_back(n); DQ_DEBUG << "orderedChildrenOf: Node " << node << " has " << ordered.size() << " children: " << ordered << endl; return ordered; } Nodes potentialPropertyNodesOf(Node node) { //!!! what to do about nodes that end up in candidates and so are loaded, but are never actually needed? Nodes nn; Triples tt = m_s->match(Triple(node, Node(), Node())); foreach (Triple t, tt) { if (nodeHasTypeInStore(t.c)) { nn << t.c; } else { Nodes sequence = sequenceStartingAt(t.c); foreach (Node sn, sequence) { if (nodeHasTypeInStore(sn)) { nn << sn; } } } } return nn; } Nodes sequenceStartingAt(Node node) { Nodes nn; Triple t; Node itr = node; Node nil = m_s->expand("rdf:nil"); while ((t = m_s->matchOnce(Triple(itr, m_s->expand("rdf:first"), Node()))) != Triple()) { nn << t.c; t = m_s->matchOnce(Triple(itr, m_s->expand("rdf:rest"), Node())); if (t == Triple()) break; itr = t.c; if (itr == nil) break; } if (!nn.empty()) { DQ_DEBUG << "sequenceStartingAt " << node << " has " << nn.size() << " item(s)" << endl; } return nn; } void load(LoadState &state) { foreach (Node node, state.toAllocate) { DQ_DEBUG << "load: calling allocate(" << node << ")" << endl; try { allocate(state, node); } catch (UnknownTypeException &e) { if (state.loadFlags & LoadState::IgnoreUnknownTypes) { DQ_DEBUG << "load: IgnoreUnknownTypes is set, removing object of unknown type and continuing" << endl; delete state.map.value(node); state.map.insert(node, 0); state.toInitialise.remove(node); state.toPopulate.remove(node); } else { throw; } } } // allocate() also calls initialise(), because we want the // initialise to happen before children are added to a node -- // this is just belt and braces foreach (Node node, state.toInitialise) { DQ_DEBUG << "load: calling initialise(" << node << ")" << endl; initialise(state, node); } // populate() removes from state.toPopulate, so we need to // make a note of the original set for calling load callbacks NodeSet tp = state.toPopulate; foreach (Node node, tp) { DQ_DEBUG << "load: calling populate(" << node << ")" << endl; populate(state, node); } foreach (Node node, tp) { DQ_DEBUG << "load: calling callLoadCallbacks(" << node << ")" << endl; callLoadCallbacks(state, node, m_finalCallbacks); } } QObject *parentObjectOf(LoadState &state, Node node) { Node parent = parentOf(node); QObject *parentObject = 0; if (parent != Node()) { allocate(state, parent); parentObject = state.map.value(parent); } return parentObject; } void allocate(LoadState &state, Node node) { //!!! too many of these tests, some must be redundant if (!state.toAllocate.contains(node)) return; QObject *parentObject = parentObjectOf(state, node); allocate(state, node, parentObject); } void allocate(LoadState &state, Node node, QObject *parentObject) { //!!! too many of these tests, some must be redundant if (!state.toAllocate.contains(node)) return; if (m_fp & FollowSiblings) { Nodes siblings = orderedSiblingsOf(node); foreach (Node s, siblings) { //!!! Hmm. Do we want to recurse to children of siblings if FollowChildren is set? Trouble is we don't want to recurse to siblings of siblings (that would lead to a cycle) allocateSingle(state, s, parentObject); } } QObject *o = allocateSingle(state, node, parentObject); if (state.toInitialise.contains(node)) { DQ_DEBUG << "load: calling initialise(" << node << ") from allocate" << endl; initialise(state, node); } if (m_fp & FollowChildren) { Nodes children = orderedChildrenOf(node); foreach (Node c, children) { allocate(state, c, o); } } } QObject *allocateSingle(LoadState &state, Node node) { QObject *parentObject = parentObjectOf(state, node); return allocateSingle(state, node, parentObject); } QObject *allocateSingle(LoadState &state, Node node, QObject *parentObject) { DQ_DEBUG << "allocateSingle: " << node << " (parent = " << parentObject << ")" << endl; //!!! too many of these tests, some must be redundant if (!state.toAllocate.contains(node)) { DQ_DEBUG << "already loaded: returning existing value (" << state.map.value(node) << ")" << endl; return state.map.value(node); } QObject *o = allocateObject(node, parentObject); DQ_DEBUG << "Setting object " << o << " to map for node " << node << endl; QObject *old = state.map.value(node); if (o != old) { DQ_DEBUG << "Deleting old object " << old << endl; delete old; } state.map.insert(node, o); state.toAllocate.remove(node); QObject *x = state.map.value(node); DQ_DEBUG << "New value is " << x << endl; return o; } void callLoadCallbacks(LoadState &state, Node node, QList &callbacks) { QObject *o = state.map.value(node); DQ_DEBUG << "callLoadCallbacks: " << node << " -> " << o << endl; if (!o) return; foreach (LoadCallback *cb, callbacks) { cb->loaded(m_m, state.map, node, o); } } QString getClassNameForNode(Node node); QObject *allocateObject(Node node, QObject *parent); void initialise(LoadState &, Node node); void populate(LoadState &, Node node); enum PropertyLoadType { LoadAllProperties, LoadLiteralProperties, LoadNonLiteralProperties }; void loadProperties(LoadState &, Node node, PropertyLoadType); QVariant propertyNodeListToVariant(LoadState &, QString typeName, Nodes pnodes); QObject *propertyNodeToObject(LoadState &, Node pnode); QVariant propertyNodeToVariant(LoadState &, QString typeName, Node pnode); QVariantList propertyNodeToList(LoadState &, QString typeName, Node pnode); }; void ObjectLoader::D::initialise(LoadState &state, Node node) { loadProperties(state, node, LoadLiteralProperties); callLoadCallbacks(state, node, m_immediateCallbacks); state.toInitialise.remove(node); } void ObjectLoader::D::populate(LoadState &state, Node node) { loadProperties(state, node, LoadNonLiteralProperties); state.toPopulate.remove(node); } void ObjectLoader::D::loadProperties(LoadState &state, Node node, PropertyLoadType loadType) { QObject *o = state.map.value(node); if (!o) return; QString cname = o->metaObject()->className(); CacheingPropertyObject *po = new CacheingPropertyObject (m_s, m_tm.getPropertyPrefix().toString(), node); QObject *defaultsObject = 0; for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable() || !property.isWritable()) { continue; } QString pname = property.name(); // name to use when setting on QObject QString plookup(pname); // name or URI for PropertyObject Uri puri; if (m_tm.getPropertyUri(cname, pname, puri)) { plookup = puri.toString(); } Nodes pnodes; bool haveProperty = po->hasProperty(plookup); if (haveProperty) { pnodes = po->getPropertyNodeList(plookup); if (pnodes.empty()) { haveProperty = false; } } if (loadType != LoadAllProperties) { bool literal = true; foreach (Node n, pnodes) { if (n.type != Node::Literal) { literal = false; break; } } if ( literal && (loadType == LoadNonLiteralProperties)) continue; if (!literal && (loadType == LoadLiteralProperties)) continue; } DQ_DEBUG << "For property " << pname << " of " << node << " have " << pnodes.size() << " node(s)" << endl; if (!haveProperty && m_ap == IgnoreAbsentProperties) continue; QVariant value; QByteArray pnba = pname.toLocal8Bit(); if (!haveProperty) { if (!defaultsObject) { if (m_ob->knows(cname)) { defaultsObject = m_ob->build(cname, 0); } else { DQ_DEBUG << "Can't reset absent property " << pname << " of object " << node << ": object builder " << "doesn't know type " << cname << " so cannot " << "build defaults object" << endl; } } if (defaultsObject) { DQ_DEBUG << "Resetting property " << pname << " to default" << endl; value = defaultsObject->property(pnba.data()); } } else { QString typeName = property.typeName(); DQ_DEBUG << "Setting property " << pname << " of type " << typeName << endl; value = propertyNodeListToVariant(state, typeName, pnodes); } if (!value.isValid()) { DQ_DEBUG << "Ignoring invalid variant for value of property " << pname << ", type " << property.typeName() << " of object " << node << endl; continue; } if (!o->setProperty(pnba.data(), value)) { DQ_DEBUG << "loadProperties: Property set failed " << "for property " << pname << " of type " << property.typeName() << " (" << property.userType() << ") to value of type " << value.type() << " and value " << value << " from (first) node " << pnodes[0].value << endl; DQ_DEBUG << "loadProperties: If the RDF datatype is correct, check " << "[1] that the datatype is known to Dataquay::Node for " << "node-variant conversion" << "(datatype is one of the standard set, " << "or registered with Node::registerDatatype) and " << "[2] that the Q_PROPERTY type declaration " << property.typeName() << " matches the name passed to qRegisterMetaType (including namespace)" << endl; std::cerr << "ObjectLoader::loadProperties: Failed to set property on object, ignoring" << std::endl; } } delete defaultsObject; delete po; } QVariant ObjectLoader::D::propertyNodeListToVariant(LoadState &state, QString typeName, Nodes pnodes) { if (pnodes.empty()) return QVariant(); Node firstNode = pnodes[0]; DQ_DEBUG << "propertyNodeListToVariant: typeName = " << typeName << endl; if (typeName == "") { return firstNode.toVariant(); } if (m_cb->canInjectContainer(typeName)) { QString inContainerType = m_cb->getTypeNameForContainer(typeName); ContainerBuilder::ContainerKind k = m_cb->getContainerKind(typeName); if (k == ContainerBuilder::SequenceKind) { QVariantList list = propertyNodeToList(state, inContainerType, firstNode); return m_cb->injectContainer(typeName, list); } else if (k == ContainerBuilder::SetKind) { QVariantList list; foreach (Node pnode, pnodes) { Nodes sublist; sublist << pnode; list << propertyNodeListToVariant(state, inContainerType, sublist); } return m_cb->injectContainer(typeName, list); } else { return QVariant(); } } else if (m_ob->canInject(typeName)) { QObject *obj = propertyNodeToObject(state, firstNode); QVariant v; if (obj) { v = m_ob->inject(typeName, obj); if (v == QVariant()) { DQ_DEBUG << "propertyNodeListToVariant: " << "Type of node " << firstNode << " is incompatible with expected " << typeName << endl; std::cerr << "ObjectLoader::propertyNodeListToVariant: " << "Incompatible node type, ignoring" << std::endl; //!!! don't delete the object without removing it from the map! // but which to do -- remove it, or leave it? // delete obj; } } return v; } else if (QString(typeName).contains("*") || QString(typeName).endsWith("Star")) { // do not attempt to read binary pointers! return QVariant(); } else { return propertyNodeToVariant(state, typeName, firstNode); } } QVariant ObjectLoader::D::propertyNodeToVariant(LoadState & /* state */, QString typeName, Node pnode) { // Usually we can take the default conversion from node to // QVariant. But in two cases this will fail in ways we need to // correct: // // - The node is an untyped literal and the property is known to // have a type other than string (default conversion would produce // a string) // // - The node is a URI and the property is known to have a type // other than Uri (several legitimate property types could // reasonably receive data from a URI node) // // One case should not be corrected: // // - The node has a type but it doesn't match that of the property // // We have to fail that one, because we're not in any position to // do general type conversion here. DQ_DEBUG << "propertyNodeToVariant: typeName = " << typeName << endl; if (typeName == "") { return pnode.toVariant(); } bool acceptDefault = true; if (pnode.type == Node::URI && typeName != Uri::metaTypeName()) { DQ_DEBUG << "ObjectLoader::propertyNodeListToVariant: " << "Non-URI property is target for RDF URI, converting" << endl; acceptDefault = false; } else if (pnode.type == Node::Literal && pnode.datatype == Uri() && // no datatype typeName != QMetaType::typeName(QMetaType::QString)) { DQ_DEBUG << "ObjectLoader::propertyNodeListToVariant: " << "No datatype for RDF literal, deducing from typename \"" << typeName << "\"" << endl; acceptDefault = false; } if (acceptDefault) { return pnode.toVariant(); } QByteArray ba = typeName.toLocal8Bit(); int metatype = QMetaType::type(ba.data()); if (metatype != 0) return pnode.toVariant(metatype); else return pnode.toVariant(); } QObject * ObjectLoader::D::propertyNodeToObject(LoadState &state, Node pnode) { QObject *o = 0; if (pnode.type == Node::URI || pnode.type == Node::Blank) { o = allocateSingle(state, pnode); } else { DQ_DEBUG << "Not an object node, ignoring" << endl; } return o; } QVariantList ObjectLoader::D::propertyNodeToList(LoadState &state, QString typeName, Node pnode) { Nodes sequence = sequenceStartingAt(pnode); QVariantList list; foreach (Node node, sequence) { Nodes vnodes; vnodes << node; QVariant value = propertyNodeListToVariant(state, typeName, vnodes); if (value.isValid()) { DQ_DEBUG << "Found value: " << value << endl; list.push_back(value); } else { DQ_DEBUG << "propertyNodeToList: Invalid value in list, skipping" << endl; } } DQ_DEBUG << "propertyNodeToList: list has " << list.size() << " item(s)" << endl; return list; } QString ObjectLoader::D::getClassNameForNode(Node node) { Uri typeUri; Triple t = m_s->matchOnce(Triple(node, Uri("a"), Node())); if (t.c.type == Node::URI) typeUri = Uri(t.c.value); QString className; if (typeUri != Uri()) { try { className = m_tm.synthesiseClassForTypeUri(typeUri); } catch (UnknownTypeException) { DQ_DEBUG << "getClassNameForNode: Unknown type URI " << typeUri << endl; throw; } } else { DQ_DEBUG << "getClassNameForNode: No type URI for " << node << endl; throw UnknownTypeException(""); } if (!m_ob->knows(className)) { DQ_DEBUG << "ObjectLoader::getClassNameForNode: Unknown object class " << className << endl; throw UnknownTypeException(className); } return className; } QObject * ObjectLoader::D::allocateObject(Node node, QObject *parent) { // Note that we cannot rely on the object class from a property // declaration to know what type to construct. For example, if we // have been called as part of a process of loading something // declared as container of base-class pointers, but each // individual object is actually of a derived class, then the RDF // should specify the derived class but we will only have been // passed the base class. So we must use the RDF type. QString className = getClassNameForNode(node); DQ_DEBUG << "Making object " << node.value << " of type " << className << " with parent " << parent << endl; QObject *o = m_ob->build(className, parent); if (!o) throw ConstructionFailedException(className); if (node.type == Node::URI) { o->setProperty("uri", QVariant::fromValue(m_s->expand(node.value))); } DQ_DEBUG << "Made object: " << o << endl; return o; } ObjectLoader::ObjectLoader(Store *s) : m_d(new D(this, s)) { } ObjectLoader::~ObjectLoader() { delete m_d; } Store * ObjectLoader::getStore() { return m_d->getStore(); } void ObjectLoader::setTypeMapping(const TypeMapping &tm) { m_d->setTypeMapping(tm); } const TypeMapping & ObjectLoader::getTypeMapping() const { return m_d->getTypeMapping(); } void ObjectLoader::setFollowPolicy(FollowPolicy policy) { m_d->setFollowPolicy(policy); } ObjectLoader::FollowPolicy ObjectLoader::getFollowPolicy() const { return m_d->getFollowPolicy(); } void ObjectLoader::setAbsentPropertyPolicy(AbsentPropertyPolicy policy) { m_d->setAbsentPropertyPolicy(policy); } ObjectLoader::AbsentPropertyPolicy ObjectLoader::getAbsentPropertyPolicy() const { return m_d->getAbsentPropertyPolicy(); } QObject * ObjectLoader::load(Node node) { return m_d->load(node); } void ObjectLoader::reload(Nodes nodes, NodeObjectMap &map) { m_d->reload(nodes, map); } QObjectList ObjectLoader::loadType(Uri type) { return m_d->loadType(type); } QObjectList ObjectLoader::loadType(Uri type, NodeObjectMap &map) { return m_d->loadType(type, map); } QObjectList ObjectLoader::loadAll() { return m_d->loadAll(); } QObjectList ObjectLoader::loadAll(NodeObjectMap &map) { return m_d->loadAll(map); } void ObjectLoader::addLoadCallback(LoadCallback *cb, LoadCallbackType type) { m_d->addLoadCallback(cb, type); } } sonic-visualiser-3.0.3/dataquay/src/objectmapper/ObjectMapper.cpp0000644000000000000000000006141113111512442023271 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectMapper.h" #include "objectmapper/ObjectMapperExceptions.h" #include "objectmapper/ObjectMapperForwarder.h" #include "objectmapper/ObjectLoader.h" #include "objectmapper/ObjectStorer.h" #include "objectmapper/ContainerBuilder.h" #include "objectmapper/TypeMapping.h" #include "TransactionalStore.h" #include "Connection.h" #include "PropertyObject.h" #include "../Debug.h" #include #include #include #include #include #include namespace Dataquay { class ObjectMapper::D : public QObject { struct Network { // Use Network only with mutex held please ObjectLoader::NodeObjectMap nodeObjectMap; ObjectStorer::ObjectNodeMap objectNodeMap; ObjectLoader::NodeObjectMap listNodeObjectMap; Node getNodeForObject(QObject *o) { ObjectStorer::ObjectNodeMap::const_iterator i = objectNodeMap.find(o); if (i != objectNodeMap.end()) return i.value(); return Node(); } QObject *getObjectByNode(Node n) { ObjectLoader::NodeObjectMap::const_iterator i = nodeObjectMap.find(n); if (i != nodeObjectMap.end()) return i.value(); return 0; } }; struct LoadStoreCallback : public ObjectStorer::StoreCallback, public ObjectLoader::LoadCallback { LoadStoreCallback(ObjectMapper::D *d) : m_d(d) { } void loaded(ObjectLoader *, ObjectLoader::NodeObjectMap &, Node, QObject *o) { DQ_DEBUG << "LoadStoreCallback::loaded: Object " << o << endl; m_d->manage(o); } void stored(ObjectStorer *, ObjectStorer::ObjectNodeMap &, QObject *o, Node) { DQ_DEBUG << "LoadStoreCallback::stored: Object " << o << endl; m_d->manage(o); } private: ObjectMapper::D *m_d; }; public: D(ObjectMapper *m, TransactionalStore *s) : m_m(m), m_s(s), m_c(s), m_mutex(QMutex::Recursive), m_inCommit(false), m_inReload(false), m_callback(this) { m_loader = new ObjectLoader(&m_c); m_loader->setAbsentPropertyPolicy(ObjectLoader::ResetAbsentProperties); m_loader->setFollowPolicy(ObjectLoader::FollowObjectProperties); m_loader->addLoadCallback(&m_callback, ObjectLoader::FinalCallback); m_storer = new ObjectStorer(&m_c); m_storer->setPropertyStorePolicy(ObjectStorer::StoreIfChanged); m_storer->setBlankNodePolicy(NoBlankObjectNodes); m_storer->setFollowPolicy(ObjectStorer::FollowObjectProperties); m_storer->addStoreCallback(&m_callback); connect(&m_c, SIGNAL(transactionCommitted(const ChangeSet &)), m_m, SLOT(transactionCommitted(const ChangeSet &))); } virtual ~D() { delete m_storer; delete m_loader; } TransactionalStore *getStore() { return m_s; } void setTypeMapping(const TypeMapping &tm) { QMutexLocker locker(&m_mutex); m_tm = tm; m_loader->setTypeMapping(m_tm); m_storer->setTypeMapping(m_tm); } const TypeMapping &getTypeMapping() const { return m_tm; } void setBlankNodePolicy(BlankNodePolicy bp) { m_storer->setBlankNodePolicy(bp); } BlankNodePolicy getBlankNodePolicy() const { return m_storer->getBlankNodePolicy(); } Node getNodeForObject(QObject *o) { QMutexLocker locker(&m_mutex); return m_n.getNodeForObject(o); } QObject *getObjectByNode(Node n) { QMutexLocker locker(&m_mutex); return m_n.getObjectByNode(n); } QObject *load(Node n) { QMutexLocker locker(&m_mutex); return m_loader->load(n); } QObjectList loadType(Uri u) { QMutexLocker locker(&m_mutex); return m_loader->loadType(u); } void add(QObject *o) { QMutexLocker locker(&m_mutex); try { manage(o); } catch (NoUriException) { // doesn't matter; it will be assigned one when mapped, // which will happen on the next commit because we are // adding it to the changed object map } DQ_DEBUG << "ObjectMapper::add: Adding " << o << " to changed list" << endl; m_changedObjects.insert(o); } void add(QObjectList ol) { QMutexLocker locker(&m_mutex); foreach (QObject *o, ol) { try { manage(o); } catch (NoUriException) { // doesn't matter (as above) } } DQ_DEBUG << "ObjectMapper::add: Adding " << ol.size() << " object(s) to changed list" << endl; foreach (QObject *o, ol) { m_changedObjects.insert(o); } } void manage(QObject *o) { QMutexLocker locker(&m_mutex); // Ensure that the Uri datatype has been registered. This is a // bit of a hack (void)Uri::metaTypeId(); Uri uri = o->property("uri").value(); if (uri == Uri()) { //!!! document this -- generally, document conditions for manage() to be used rather than add() throw NoUriException(o->objectName(), o->metaObject()->className()); } // An object is managed if we have it in both maps. If it's // only in one map, then it has probably been stored or loaded // by following a property or other connection, and stored in // the map by the loader/storer call, but not yet properly // managed (particularly, not yet connected to a forwarder). // This function is called from the load/store callback // specifically to deal with managing such // known-but-not-properly-managed objects before the two maps // are synchronised. If it wasn't called, such objects would // remain forever in a sort of half-managed limbo. if (m_n.objectNodeMap.contains(o) && m_n.nodeObjectMap.contains(Node(uri))) { DQ_DEBUG << "ObjectMapper::manage: Object " << o << " " << uri << " is already managed" << endl; return; } DQ_DEBUG << "ObjectMapper::manage: Managing " << o << " " << uri << endl; // The forwarder avoids us trying to connect potentially many, // many signals to the same mapper object -- which is slow. // Note the forwarder is a child of the ObjectMapper, so we // don't need to explicitly destroy it in dtor ObjectMapperForwarder *f = new ObjectMapperForwarder(m_m, o); m_forwarders.insert(o, f); m_n.objectNodeMap.insert(o, uri); m_n.nodeObjectMap.insert(uri, o); } void addListNodesFor(QObject *o) { DQ_DEBUG << "addListNodesFor(" << o << ")" << endl; if (!m_n.objectNodeMap.contains(o)) { DQ_DEBUG << "addListNodesFor(" << o << "): Object is unknown to us" << endl; return; } Node n = m_n.objectNodeMap.value(o); DQ_DEBUG << "addListNodesFor: Node is " << n << endl; ContainerBuilder *cb = ContainerBuilder::getInstance(); for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable()) { continue; } if (cb->getContainerKind(property.typeName()) == ContainerBuilder::SequenceKind) { DQ_DEBUG << "addListNodesFor: Property " << property.name() << " is a sequence kind" << endl; addListNodesForProperty(o, n, property); } } } void removeListNodesFor(QObject *o) { DQ_DEBUG << "removeListNodesFor(" << o << ")" << endl; //!!! ouch Nodes toRemove; for (ObjectLoader::NodeObjectMap::iterator i = m_n.listNodeObjectMap.begin(); i != m_n.listNodeObjectMap.end(); ++i) { if (i.value() == o) toRemove.push_back(i.key()); } foreach (Node n, toRemove) { m_n.listNodeObjectMap.remove(n); } } void addListNodesForProperty(QObject *o, Node n, const QMetaProperty &property) { //!!! todo: write a unit test! QString cname = o->metaObject()->className(); QString pname = property.name(); Uri puri; if (!m_tm.getPropertyUri(cname, pname, puri)) { PropertyObject po(m_s, m_tm.getPropertyPrefix().toString(), n); puri = po.getPropertyUri(pname); } //!!! should be matching all, surely? Node itr = m_s->matchOnce(Triple(n, puri, Node())).c; if (itr == Node()) { return; // property has no values } Node nil = m_s->expand("rdf:nil"); while (1) { Node next = m_s->matchOnce (Triple(itr, m_s->expand("rdf:rest"), Node())).c; if (next == Node()) { // This is not a list node at all! DQ_DEBUG << "addListNodesForProperty: Strange, node " << itr << " (from property URI " << puri << " of object node " << n << ", object " << o << ") is not a list node" << endl; break; } m_n.listNodeObjectMap[itr] = o; DQ_DEBUG << "addListNodesForProperty: Added node " << itr << " for object " << o << endl; if (next == nil) { // we've finished break; } itr = next; } } void manage(QObjectList ol) { foreach (QObject *o, ol) { manage(o); } } void unmanage(QObject *) { } //!!! void unmanage(QObjectList ol) { foreach (QObject *o, ol) { unmanage(o); } } void objectModified(QObject *o) { DQ_DEBUG << "ObjectMapper:: objectModified(" << o << ")" << endl; QMutexLocker locker(&m_mutex); if (m_inReload) { // This signal must have been emitted by a modification // caused by our own transactionCommitted method (see // similar comment about m_inCommit in that method). DQ_DEBUG << "(by us, ignoring it)" << endl; return; } //!!! what if the thing that changed about the object was its URL???!!! m_changedObjects.insert(o); DQ_DEBUG << "ObjectMapper::objectModified done" << endl; } void objectDestroyed(QObject *o) { DQ_DEBUG << "ObjectMapper::objectDestroyed(" << o << ")" << endl; QMutexLocker locker(&m_mutex); m_changedObjects.remove(o); if (m_forwarders.contains(o)) { delete m_forwarders.value(o); m_forwarders.remove(o); } Node node = m_n.objectNodeMap.value(o); if (node == Node()) { DQ_DEBUG << "(have no node for this)" << endl; return; } m_n.objectNodeMap.remove(o); removeListNodesFor(o); if (m_inReload) { // This signal must have been emitted by a modification // caused by our own transactionCommitted method (see // similar comment about m_inCommit in that method). // However, we can't indiscriminately ignore it -- // consider for example if user removed the triples for an // object from the store, causing us to delete the object // in our reload, but that object was the parent of // another managed object -- then we will end up here // because Qt deleted the child when the parent was // deleted, and we should take note of that. We only want // to ignore events for objects we know we are // synchronising already. if (m_reloading.contains(node)) { DQ_DEBUG << "(by us, ignoring it)" << endl; return; } // ^^^ write a unit test for this! } m_deletedObjectNodes.insert(node); DQ_DEBUG << "ObjectMapper::objectDestroyed done" << endl; } void transactionCommitted(const ChangeSet &cs) { DQ_DEBUG << "ObjectMapper::transactionCommitted" << endl; QMutexLocker locker(&m_mutex); if (m_inCommit) { // This signal must have been emitted by a commit invoked // from our own commit method. We only set m_inCommit // true for a period in which our own mutex is held, so if // it is set here, we must be in a recursive call from // that mutex section (noting that m_mutex is a recursive // mutex, otherwise we would have deadlocked). And we // don't want to update on the basis of our own commits, // only on the basis of commits happening elsewhere. DQ_DEBUG << "(by us, ignoring it)" << endl; return; } //!!! but now what? m_inReload = true; DQ_DEBUG << "ObjectMapper::transactionCommitted: Synchronising from " << cs.size() << " change(s) in transaction" << endl; #ifndef NDEBUG DQ_DEBUG << "ObjectMapper: before sync, node-object map contains:" << endl; for (ObjectLoader::NodeObjectMap::iterator i = m_n.nodeObjectMap.begin(); i != m_n.nodeObjectMap.end(); ++i) { QString n; QObject *o = i.value(); if (o) n = o->objectName(); DQ_DEBUG << i.key() << " -> " << i.value() << " [" << n << "]" << endl; } DQ_DEBUG << "ObjectMapper: before sync, object-node map contains:" << endl; for (ObjectStorer::ObjectNodeMap::iterator i = m_n.objectNodeMap.begin(); i != m_n.objectNodeMap.end(); ++i) { QString n; QObject *o = i.key(); if (o) n = o->objectName(); DQ_DEBUG << i.key() << " [" << n << "] -> " << i.value() << endl; } DQ_DEBUG << "ObjectMapper: before sync, list-node-object map contains:" << endl; for (ObjectLoader::NodeObjectMap::iterator i = m_n.listNodeObjectMap.begin(); i != m_n.listNodeObjectMap.end(); ++i) { QString n; QObject *o = i.value(); if (o) n = o->objectName(); DQ_DEBUG << i.key() << " -> " << i.value() << " [" << n << "]" << endl; } #endif //!!! if an object has been effectively deleted from the //!!! store, we can't know that without querying the store to //!!! discover whether any triples remain -- so we should let //!!! something like ObjectLoader::reload() handle deleting //!!! objects that have been removed from store foreach (const Change &c, cs) { Node subject = c.second.a; // If the subject of a change is a node for an object, // reload that object if (m_n.nodeObjectMap.contains(subject)) { m_reloading.insert(subject); continue; } // Also if the subject of a change is a list node for a // property of an object, reload that object. if (m_n.listNodeObjectMap.contains(subject)) { QObject *o = m_n.listNodeObjectMap.value(subject); DQ_DEBUG << "transactionCommitted: Node " << subject << " is a list node for object " << o << endl; if (m_n.objectNodeMap.contains(o)) { m_reloading.insert(m_n.objectNodeMap.value(o)); } } } Nodes nodes; foreach (const Node &n, m_reloading) { nodes.push_back(n); } DQ_DEBUG << "transactionCommitted: Have " << nodes.size() << " node(s) to reload" << endl; m_loader->reload(nodes, m_n.nodeObjectMap); m_reloading.clear(); // The load call will have updated m_n.nodeObjectMap; sync the // unchanged (since the last commit call) m_n.objectNodeMap // from it syncMap(m_n.objectNodeMap, m_n.nodeObjectMap); DQ_DEBUG << "ObjectMapper: after sync, object-node map contains:" << endl; for (ObjectStorer::ObjectNodeMap::iterator i = m_n.objectNodeMap.begin(); i != m_n.objectNodeMap.end(); ++i) { QString n; QObject *o = i.key(); if (o) n = o->objectName(); DQ_DEBUG << i.key() << " [" << n << "] -> " << i.value() << endl; } m_inReload = false; DQ_DEBUG << "ObjectMapper::transactionCommitted done" << endl; } void doCommit(ChangeSet *cs) { QMutexLocker locker(&m_mutex); DQ_DEBUG << "ObjectMapper::commit: Synchronising " << m_changedObjects.size() << " changed and " << m_deletedObjectNodes.size() << " deleted object(s)" << endl; //!!! if an object has been added as a new sibling of existing //!!! objects, then we presumably may have to rewrite our //!!! follows relationships? // What other objects can be affected by the addition or // modification of an object? // - Adding a new child -> affects nothing directly, as child // goes at end foreach (Node n, m_deletedObjectNodes) { m_storer->removeObject(n); } QObjectList ol; foreach (QObject *o, m_changedObjects) ol.push_back(o); m_storer->store(ol, m_n.objectNodeMap); m_inCommit = true; if (cs) { *cs = m_c.commitAndObtain(); } else { m_c.commit(); } m_inCommit = false; // The store call will have updated m_n.objectNodeMap; sync // the unchanged (since the last "external" transaction) // m_n.nodeObjectMap from it syncMap(m_n.nodeObjectMap, m_n.objectNodeMap); // If an object has list properties, then we (sadly) need to // associate all of the list nodes with the object as well in // order to ensure that it gets reloaded if the list tail // changes (i.e. if something in the list changes but its head // node does not). Note that we have to do this regardless of // whether the object is already managed -- we may have been // called from a reload callback. Quite a subtle problem that // has rather sad efficiency implications. foreach (QObject *o, m_changedObjects) { addListNodesFor(o); } m_deletedObjectNodes.clear(); m_changedObjects.clear(); DQ_DEBUG << "ObjectMapper::commit done" << endl; } void commit() { doCommit(0); } ChangeSet commitAndObtain() { ChangeSet cs; doCommit(&cs); return cs; } private: ObjectMapper *m_m; TransactionalStore *m_s; Connection m_c; TypeMapping m_tm; Network m_n; QMutex m_mutex; QHash m_forwarders; QSet m_changedObjects; QSet m_deletedObjectNodes; bool m_inCommit; bool m_inReload; QSet m_reloading; ObjectLoader *m_loader; ObjectStorer *m_storer; LoadStoreCallback m_callback; class InternalMappingInconsistency : virtual public std::exception { public: InternalMappingInconsistency(QString a, QString b) throw() : m_a(a), m_b(b) { } virtual ~InternalMappingInconsistency() throw() { } virtual const char *what() const throw() { return QString("Internal inconsistency: internal map from %1 to %2 " "contains different %2 from that found in map from " "%2 to %1").arg(m_a).arg(m_b).toLocal8Bit().data(); } protected: QString m_a; QString m_b; }; void syncMap(ObjectLoader::NodeObjectMap &target, ObjectStorer::ObjectNodeMap &source) { ObjectLoader::NodeObjectMap newMap; int inCommon = 0; for (ObjectStorer::ObjectNodeMap::iterator i = source.begin(); i != source.end(); ++i) { Node n = i.value(); if (target.contains(n)) { QObject *o = target.value(n); if (o && o != i.key()) { throw InternalMappingInconsistency("Node", "QObject"); } ++inCommon; } newMap.insert(n, i.key()); } DQ_DEBUG << "syncMap: Note: resized NodeObjectMap from " << target.size() << " to " << newMap.size() << " element(s); " << inCommon << " unchanged or trivial" << endl; target = newMap; } void syncMap(ObjectStorer::ObjectNodeMap &target, ObjectLoader::NodeObjectMap &source) { ObjectStorer::ObjectNodeMap newMap; int inCommon = 0; for (ObjectLoader::NodeObjectMap::iterator i = source.begin(); i != source.end(); ++i) { QObject *o = i.value(); if (!o) continue; if (target.contains(o)) { Node n(target.value(o)); if (n != Node() && n != i.key()) { throw InternalMappingInconsistency("QObject", "Node"); } ++inCommon; } newMap.insert(o, i.key()); } DQ_DEBUG << "syncMap: Note: resized ObjectNodeMap from " << target.size() << " to " << newMap.size() << " element(s); " << inCommon << " unchanged or trivial" << endl; target = newMap; } }; ObjectMapper::ObjectMapper(TransactionalStore *s) : m_d(new D(this, s)) { } ObjectMapper::~ObjectMapper() { delete m_d; } TransactionalStore * ObjectMapper::getStore() { return m_d->getStore(); } void ObjectMapper::setTypeMapping(const TypeMapping &tm) { m_d->setTypeMapping(tm); } const TypeMapping & ObjectMapper::getTypeMapping() const { return m_d->getTypeMapping(); } void ObjectMapper::setBlankNodePolicy(BlankNodePolicy policy) { m_d->setBlankNodePolicy(policy); } BlankNodePolicy ObjectMapper::getBlankNodePolicy() const { return m_d->getBlankNodePolicy(); } Node ObjectMapper::getNodeForObject(QObject *o) const { return m_d->getNodeForObject(o); } QObject * ObjectMapper::getObjectByNode(Node n) const { return m_d->getObjectByNode(n); } QObject * ObjectMapper::load(Node node) { return m_d->load(node); } QObjectList ObjectMapper::loadType(Uri type) { return m_d->loadType(type); } void ObjectMapper::add(QObject *o) { m_d->add(o); } void ObjectMapper::add(QObjectList ol) { m_d->add(ol); } void ObjectMapper::manage(QObject *o) { m_d->manage(o); } void ObjectMapper::manage(QObjectList ol) { m_d->manage(ol); } void ObjectMapper::unmanage(QObject *o) { m_d->unmanage(o); } void ObjectMapper::unmanage(QObjectList ol) { m_d->unmanage(ol); } void ObjectMapper::commit() { m_d->commit(); } ChangeSet ObjectMapper::commitAndObtain() { return m_d->commitAndObtain(); } void ObjectMapper::objectModified(QObject *o) { m_d->objectModified(o); } void ObjectMapper::objectDestroyed(QObject *o) { m_d->objectDestroyed(o); } void ObjectMapper::transactionCommitted(const ChangeSet &cs) { m_d->transactionCommitted(cs); } } sonic-visualiser-3.0.3/dataquay/src/objectmapper/ObjectMapperForwarder.cpp0000644000000000000000000000726713111512442025156 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectMapperForwarder.h" #include "objectmapper/ObjectMapper.h" #include #include "../Debug.h" namespace Dataquay { ObjectMapperForwarder::ObjectMapperForwarder(ObjectMapper *m, QObject *o) : QObject(m), m_mapper(m), m_source(o) { for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable() || !property.isWritable()) { continue; } if (!property.hasNotifySignal()) { DQ_DEBUG << "ObjectMapperForwarder: No notify signal for property " << property.name() << endl; continue; } // Signals can be connected to slots with fewer arguments, so // long as the arguments they do have match. So we connect // the property notify signal to our universal // property-changed slot, and use the sender() of that to // discover which object's property has changed. // Unfortunately, we don't then know which property it was // that changed, as the identity of the signal that activated // the slot is not available to us. The annoying part of this // is that Qt does actually store the identity of the signal // in the same structure as used for the sender() object data; // it just doesn't (at least as of Qt 4.5) make it available // through the public API. QString sig = QString("%1%2").arg(QSIGNAL_CODE) #if (QT_VERSION >= 0x050000) .arg(property.notifySignal().methodSignature().data()); #else .arg(property.notifySignal().signature()); #endif QByteArray ba = sig.toLocal8Bit(); if (!connect(o, ba.data(), this, SLOT(objectModified()))) { std::cerr << "ObjectMapperForwarder: Failed to connect notify signal" << std::endl; } } connect(o, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed())); } void ObjectMapperForwarder::objectDestroyed() { m_mapper->objectDestroyed(m_source); } void ObjectMapperForwarder::objectModified() { m_mapper->objectModified(m_source); } } sonic-visualiser-3.0.3/dataquay/src/objectmapper/ObjectStorer.cpp0000644000000000000000000007425313111512442023333 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectStorer.h" #include "objectmapper/ObjectBuilder.h" #include "objectmapper/ContainerBuilder.h" #include "objectmapper/TypeMapping.h" #include "PropertyObject.h" #include "Store.h" #include "../Debug.h" #include #include #include namespace Dataquay { class ObjectStorer::D { typedef QSet ObjectSet; public: struct StoreState { StoreState() { } /// Objects the customer has explicitly asked to store QObjectList requested; /// Objects needing URIs allocated ObjectSet toAllocate; /// Objects whose properties have not yet been stored ObjectSet toStore; /// Objects for which blank nodes shouldn't be used regardless of policy ObjectSet noBlanks; /// All known object-node correspondences, to be updated as we go ObjectNodeMap map; }; D(ObjectStorer *m, Store *s) : m_m(m), m_ob(ObjectBuilder::getInstance()), m_cb(ContainerBuilder::getInstance()), m_s(s), m_psp(StoreAlways), m_bp(PermitBlankObjectNodes), m_fp(FollowNone) { updatePropertyNames(); } Store *getStore() { return m_s; } void setTypeMapping(const TypeMapping &tm) { m_tm = tm; updatePropertyNames(); } const TypeMapping &getTypeMapping() const { return m_tm; } void setPropertyStorePolicy(PropertyStorePolicy psp) { m_psp = psp; } PropertyStorePolicy getPropertyStorePolicy() const { return m_psp; } void setBlankNodePolicy(BlankNodePolicy bp) { m_bp = bp; } BlankNodePolicy getBlankNodePolicy() const { return m_bp; } void setFollowPolicy(FollowPolicy fp) { m_fp = fp; } FollowPolicy getFollowPolicy() const { return m_fp; } void updatePropertyNames() { m_parentProp = Uri(m_tm.getRelationshipPrefix().toString() + "parent"); m_followProp = Uri(m_tm.getRelationshipPrefix().toString() + "follows"); } void removeObject(Node n) { Triples triples = m_s->match(Triple(n, Node(), Node())); foreach (Triple t, triples) { if (t.b.type == Node::URI) { removePropertyNodes(n, Uri(t.b.value)); } } m_s->remove(Triple(Node(), Node(), n)); } Uri store(QObject *o, ObjectNodeMap &map) { StoreState state; state.requested << o; state.map = map; collect(state); store(state); map = state.map; Node node = state.map.value(o); if (node.type != Node::URI) { // This shouldn't happen (see above) DQ_DEBUG << "ObjectStorer::store: Stored object node " << node << " is not a URI node" << endl; std::cerr << "WARNING: ObjectStorer::store: No URI for stored object!" << std::endl; return Uri(); } else { return Uri(node.value); } } void store(QObjectList ol, ObjectNodeMap &map) { StoreState state; state.requested = ol; state.map = map; collect(state); store(state); map = state.map; } void addStoreCallback(StoreCallback *cb) { m_storeCallbacks.push_back(cb); } private: ObjectStorer *m_m; ObjectBuilder *m_ob; ContainerBuilder *m_cb; Store *m_s; TypeMapping m_tm; PropertyStorePolicy m_psp; BlankNodePolicy m_bp; FollowPolicy m_fp; QList m_storeCallbacks; Uri m_parentProp; Uri m_followProp; void collect(StoreState &state) { QObjectList candidates = state.requested; state.noBlanks = ObjectSet::fromList(candidates); ObjectSet visited; // Avoid ever pushing null (if returned as absence case) as a // future candidate by marking it as used already visited << 0; // Use counter to iterate, so that when additional elements // pushed onto the end of state.desired will be iterated over for (int i = 0; i < candidates.size(); ++i) { QObject *obj = candidates[i]; visited << obj; if (!state.map.contains(obj) || state.map.value(obj) == Node()) { state.toAllocate.insert(obj); state.toStore.insert(obj); } else if (i < state.requested.size()) { // This is one of the requested objects, which were at // the start of the candidates list. It didn't hit // the previous test so it already has a node, but we // still need to store it as requested state.toStore.insert(obj); } QObjectList relatives; if (m_fp & FollowParent) { relatives << obj->parent(); } if (m_fp & FollowChildren) { relatives << obj->children(); } if (m_fp & FollowSiblings) { if (obj->parent()) { relatives << obj->parent()->children(); } } foreach (QObject *r, relatives) { if (!visited.contains(r)) { DQ_DEBUG << "ObjectStorer::collect: relative " << r << " is new, listing it as candidate" << endl; candidates << r; // Although (in PermitBlankObjectNodes mode) we // technically can use blank nodes for objects // that are not referred to as properties but are // accessible through the object tree, the result // can be rather counterintuitive -- it means we // end up with spare-looking blank nodes at top // level. Best avoided. state.noBlanks << r; } else { // We've seen this one before. If we see any // object more than once by different routes, that // implies that we can't use a blank node for it DQ_DEBUG << "ObjectStorer::collect: relative " << r << " has been seen more than once," << " ensuring it doesn't get a blank node" << endl; state.noBlanks << r; } } if (m_fp & FollowObjectProperties) { QObjectList properties = propertyObjectsOf(obj); foreach (QObject *p, properties) { if (!visited.contains(p)) { DQ_DEBUG << "ObjectStorer::collect: property " << p << " is new, listing it as candidate" << endl; candidates << p; } else { // We've seen this one before (as above) DQ_DEBUG << "ObjectStorer::collect: property " << p << " has been seen more than once," << " ensuring it doesn't get a blank node" << endl; state.noBlanks << p; } } } } DQ_DEBUG << "ObjectStorer::collect: " << "requested = " << state.requested.size() << ", toAllocate = " << state.toAllocate.size() << ", toStore = " << state.toStore.size() << endl; DQ_DEBUG << "Requested:"; foreach (QObject *obj, state.requested) DQ_DEBUG << obj; DQ_DEBUG << "toAllocate:"; foreach (QObject *obj, state.toAllocate) DQ_DEBUG << obj; DQ_DEBUG << "toStore:"; foreach (QObject *obj, state.toStore) DQ_DEBUG << obj; DQ_DEBUG << endl; } QObjectList objectsOf(QVariant v) { QObjectList objects; const char *typeName = QMetaType::typeName(v.userType()); if (!typeName) return objects; if (m_cb->canExtractContainer(typeName)) { QVariantList list = m_cb->extractContainer(typeName, v); foreach (QVariant member, list) { objects << objectsOf(member); } } else if (m_ob->canExtract(typeName)) { QObject *obj = m_ob->extract(typeName, v); if (obj) objects << obj; } return objects; } QObjectList propertyObjectsOf(QObject *o) { QObjectList pobjects; QString cname = o->metaObject()->className(); for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable()) { continue; } QString pname = property.name(); QByteArray pnba = pname.toLocal8Bit(); if (pname == "uri") continue; QVariant v = o->property(pnba.data()); if (v != QVariant()) pobjects << objectsOf(v); } return pobjects; } void store(StoreState &state) { foreach (QObject *obj, state.toAllocate) { DQ_DEBUG << "store: calling allocate(" << obj << ")" << endl; allocate(state, obj);//!!! can this fail, as it can in loader? } // store() removes from state.toStore, so we need to make a // note of the original set for calling load callbacks ObjectSet ts = state.toStore; foreach (QObject *obj, ts) { DQ_DEBUG << "store: calling store(" << obj << ")" << endl; store(state, obj); } foreach (QObject *obj, ts) { DQ_DEBUG << "store: calling callStoreCallbacks(" << obj << ")" << endl; callStoreCallbacks(state, obj); } } bool isStarType(const char *) const; bool variantsEqual(const QVariant &, const QVariant &) const; Uri getUriFrom(QObject *o) const; bool isListNode(Node n) const; void allocate(StoreState &state, QObject *o); void store(StoreState &state, QObject *o); void storeSingle(StoreState &state, QObject *o, Node node); void callStoreCallbacks(StoreState &state, QObject *o); void storeProperties(StoreState &state, QObject *o, Node node); void removeUnusedNode(Node node); void removePropertyNodes(Node node, Uri propertyUri, QSet *retain = 0); void replacePropertyNodes(Node node, Uri propertyUri, Node newValue); void replacePropertyNodes(Node node, Uri propertyUri, Nodes newValues); Nodes variantToPropertyNodeList(StoreState &state, QVariant v); Node objectToPropertyNode(StoreState &state, QObject *o); Node listToPropertyNode(StoreState &state, QVariantList list); }; bool ObjectStorer::D::isStarType(const char *typeName) const { // equivalent of: // QString(typeName).contains("*") || // QString(typeName).endsWith("Star") int i; for (i = 0; typeName[i]; ++i) { if (typeName[i] == '*') return true; } // i is now equal to length of typeName if (i >= 4 && !strcmp(typeName + i - 4, "Star")) return true; return false; } bool ObjectStorer::D::variantsEqual(const QVariant &v1, const QVariant &v2) const { if (v1 == v2) return true; if (v1.userType() != v2.userType()) return false; // "In the case of custom types, their equalness operators are not // called. Instead the values' addresses are compared." This is // acceptable for objects, but not sufficient to establish // equality for our purposes for those things that can in fact be // converted to Node. const char *typeName = QMetaType::typeName(v1.userType()); if (!typeName || isStarType(typeName) || m_cb->canExtractContainer(typeName) || m_ob->canExtract(typeName)) { // Objects, containers, weird unknown types: give up on these. // An occasional false negative is OK for us -- we claim that // the variants are equal if we return true, not that they // differ if we return false -- we are already doing better // than QVariant::operator== anyway return false; } Node n1 = Node::fromVariant(v1); Node n2 = Node::fromVariant(v2); DQ_DEBUG << "variantsEqual: comparing " << n1 << " and " << n2 << endl; return (n1 == n2); } Uri ObjectStorer::D::getUriFrom(QObject *o) const { Uri uri; QVariant uriVar = o->property("uri"); if (uriVar != QVariant()) { if (Uri::hasUriType(uriVar)) { uri = uriVar.value(); } else { uri = m_s->expand(uriVar.toString()); } } return uri; } void ObjectStorer::D::storeProperties(StoreState &state, QObject *o, Node node) { QString cname = o->metaObject()->className(); PropertyObject po(m_s, m_tm.getPropertyPrefix().toString(), node); for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable()) { continue; } QString pname = property.name(); QByteArray pnba = pname.toLocal8Bit(); if (pname == "uri") continue; QVariant value = o->property(pnba.data()); bool store = true; if (m_psp == StoreIfChanged) { if (m_ob->knows(cname)) { std::unique_ptr c(m_ob->build(cname, 0)); QVariant deftValue = c->property(pnba.data()); if (variantsEqual(value, deftValue)) { store = false; } else { DQ_DEBUG << "Property " << pname << " of object " << node << " is changed from default value " << c->property(pnba.data()) << ", writing" << endl; } } else { DQ_DEBUG << "Can't check property " << pname << " of object " << node << " for change from default value: " << "object builder doesn't know type " << cname << " so cannot build default object" << endl; } } if (store) { DQ_DEBUG << "For object " << node << " (" << o << ") writing property " << pname << " of type " << property.userType() << endl; } Uri puri; if (!m_tm.getPropertyUri(cname, pname, puri)) { puri = po.getPropertyUri(pname); } if (store) { Nodes pnodes = variantToPropertyNodeList(state, value); replacePropertyNodes(node, puri, pnodes); } else { removePropertyNodes(node, puri); } } } void ObjectStorer::D::removePropertyNodes(Node node, Uri propertyUri, QSet *retain) { Triple t(node, propertyUri, Node()); Triples m(m_s->match(t)); DQ_DEBUG << "removePropertyNodes: Node " << node << " and property " << propertyUri << " yields " << m.size() << " matching triples" << endl; foreach (t, m) { if (retain && retain->contains(t.c)) { DQ_DEBUG << "...retaining " << t.c << endl; retain->remove(t.c); } else { DQ_DEBUG << "...removing " << t.c << endl; m_s->remove(t); if (t.c == node) continue; // If this is a blank node, or if it is a node only used // as a list head, then we can safely remove it. Formerly // we removed only blank nodes here (list nodes are most // usually blank anyway), but that means we don't replace // list properties correctly with NeverUseBlankNodes if (t.c.type == Node::Blank) { removeUnusedNode(t.c); } else if (isListNode(t.c)) { removeUnusedNode(t.c); } } } } bool ObjectStorer::D::isListNode(Node n) const { Triples ts = m_s->match(Triple(n, Node(), Node())); bool isList = false; DQ_DEBUG << "isListNode: Testing node " << n << endl; // A list head should have only rdf:first and rdf:rest properties if (ts.size() == 2) { Node first = m_s->expand("rdf:first"); Node rest = m_s->expand("rdf:rest"); if ((ts[0].b == first || ts[1].b == rest) || (ts[0].b == rest || ts[1].b == first)) { isList = true; } } DQ_DEBUG << "isListNode: isList = " << isList << endl; return isList; } void ObjectStorer::D::replacePropertyNodes(Node node, Uri propertyUri, Node newValue) { QSet nodeSet; nodeSet << newValue; removePropertyNodes(node, propertyUri, &nodeSet); // nodeSet now contains only those nodes whose triples need to be // added, i.e. those not present as our properties before if (!nodeSet.empty()) { m_s->add(Triple(node, propertyUri, newValue)); } } void ObjectStorer::D::replacePropertyNodes(Node node, Uri propertyUri, Nodes newValues) { QSet nodeSet = QSet::fromList(newValues); removePropertyNodes(node, propertyUri, &nodeSet); // nodeSet now contains only those nodes whose triples need to be // added, i.e. those not present as our properties before foreach (Node pn, nodeSet) { m_s->add(Triple(node, propertyUri, pn)); } } void ObjectStorer::D::removeUnusedNode(Node node) { // The node is known to be a blank node or a list head. If it is // not referred to by anything else, then we want to remove // everything it refers to. If it happens to be a list node, then // we also want to recurse to its tail. if (m_s->matchOnce(Triple(Node(), Node(), node)) != Triple()) { // The node is still a target of some predicate, leave it alone DQ_DEBUG << "removeUnusedNode: Blank or list node " << node << " is still a target for another predicate, leaving" << endl; return; } DQ_DEBUG << "removeUnusedNode: Blank or list node " << node << " is not target for any other predicate" << endl; // check for a list tail (query first, but then delete our own // triples first so that the existence of this rdf:rest // relationship isn't seen as a reason not to delete the tail) Triples tails(m_s->match(Triple(node, m_s->expand("rdf:rest"), Node()))); DQ_DEBUG << "... removing everything with it as subject" << endl; m_s->remove(Triple(node, Node(), Node())); foreach (Triple t, tails) { DQ_DEBUG << "... recursing to list tail" << endl; removeUnusedNode(t.c); } } Nodes ObjectStorer::D::variantToPropertyNodeList(StoreState &state, QVariant v) { const char *typeName = QMetaType::typeName(v.userType()); Nodes nodes; if (!typeName) { std::cerr << "ObjectStorer::variantToPropertyNodeList: No type name?! Going ahead anyway" << std::endl; nodes << Node::fromVariant(v); return nodes; } DQ_DEBUG << "variantToPropertyNodeList: typeName = " << typeName << endl; if (m_cb->canExtractContainer(typeName)) { QVariantList list = m_cb->extractContainer(typeName, v); ContainerBuilder::ContainerKind k = m_cb->getContainerKind(typeName); if (k == ContainerBuilder::SequenceKind) { Node node = listToPropertyNode(state, list); if (node != Node()) nodes << node; } else if (k == ContainerBuilder::SetKind) { foreach (QVariant member, list) { nodes += variantToPropertyNodeList(state, member); } } } else if (m_ob->canExtract(typeName)) { QObject *obj = m_ob->extract(typeName, v); if (obj) { Node n = objectToPropertyNode(state, obj); if (n != Node()) nodes << n; } else { DQ_DEBUG << "variantToPropertyNodeList: Note: obtained NULL object from variant" << endl; } } else if (isStarType(typeName)) { // do not attempt to write binary pointers! DQ_DEBUG << "variantToPropertyNodeList: Note: Ignoring pointer type " << typeName << " that is unknown to container and object builders" << endl; return Nodes(); } else { Node node = Node::fromVariant(v); if (node != Node()) nodes << node; } return nodes; } Node ObjectStorer::D::objectToPropertyNode(StoreState &state, QObject *o) { Node pnode; DQ_DEBUG << "objectToPropertyNode: " << o << endl; if (state.map.contains(o) && state.map.value(o) != Node()) { pnode = state.map.value(o); } else { // if the object is not intended to be stored, but it has a // URI, we should nonetheless write a reference to that -- but // not put it in the map Uri uri = getUriFrom(o); if (uri != Uri()) { pnode = Node(uri); return pnode; } } return pnode; } Node ObjectStorer::D::listToPropertyNode(StoreState &state, QVariantList list) { DQ_DEBUG << "listToPropertyNode: have " << list.size() << " items" << endl; Node node, first, previous; foreach (QVariant v, list) { Nodes pnodes = variantToPropertyNodeList(state, v); if (pnodes.empty()) { std::cerr << "WARNING: ObjectStorer::listToPropertyNode: Obtained nil Node in list" << std::endl; continue; } else if (pnodes.size() > 1) { std::cerr << "WARNING: ObjectStorer::listToPropertyNode: Found set within sequence, can't handle this, using first element only" << std::endl; } Node pnode = pnodes[0]; if (m_bp != NeverUseBlankNodes) { node = m_s->addBlankNode(); } else { //!!! This is a hack -- we can give a list node a stable //!!! (and more attractive) URI by deriving it from the //!!! node it contains -- but we have no way to ensure //!!! that this is unique... hm if (pnode.type == Node::URI) { node = Node(Uri(pnode.value + "_listnode")); } else { node = Node(m_s->getUniqueUri(":listnode_")); } } if (first == Node()) first = node; if (previous != Node()) { m_s->remove(Triple(previous, m_s->expand("rdf:rest"), Node())); m_s->add(Triple(previous, m_s->expand("rdf:rest"), node)); } m_s->remove(Triple(node, m_s->expand("rdf:first"), Node())); m_s->add(Triple(node, m_s->expand("rdf:first"), pnode)); previous = node; } if (node != Node()) { m_s->remove(Triple(node, m_s->expand("rdf:rest"), Node())); m_s->add(Triple(node, m_s->expand("rdf:rest"), m_s->expand("rdf:nil"))); } return first; } void ObjectStorer::D::store(StoreState &state, QObject *o) { DQ_DEBUG << "ObjectStorer::store: Examining " << o << endl; if (!state.toStore.contains(o)) return; Node node = state.map.value(o); if (node == Node()) { // We don't allocate any nodes here -- that happened already DQ_DEBUG << "ObjectStorer::store: Strange -- object " << o << " has no node, why wasn't it allocated?" << endl; return; } storeSingle(state, o, node); DQ_DEBUG << "ObjectStorer::store: Object " << o << " has node " << node << endl; // If we have a parent with a node, write a parent property; if we // are following siblings, we need to write a follow property to // the prior sibling. We don't need to worry about actually // storing the sibling, parents or children -- they will already // be in the toStore list if we're supposed to be storing them QObject *parent = o->parent(); if (parent) { Node pn = state.map.value(parent); if (pn != Node()) { replacePropertyNodes(node, m_parentProp, pn); } } else { DQ_DEBUG << "ObjectStorer::store: Node " << node << " has no parent" << endl; m_s->remove(Triple(node, m_parentProp, Node())); } bool followsWritten = false; if (parent && (m_fp & FollowSiblings)) { QObjectList siblings = parent->children(); // find previous sibling (laboriously) QObject *previous = 0; for (int i = 0; i < siblings.size(); ++i) { if (siblings[i] == o) { if (i > 0) { previous = siblings[i-1]; } break; } } if (previous) { DQ_DEBUG << "ObjectStorer::store: Node " << node << " follows sibling object " << previous << endl; Node sn = state.map.value(previous); if (sn != Node()) { DQ_DEBUG << "ObjectStorer::store: Node " << node << " follows sibling " << sn << endl; replacePropertyNodes(node, m_followProp, sn); followsWritten = true; } else { // previous sibling has no node std::cerr << "Internal error: FollowSiblings set, but previous sibling has not been allocated" << std::endl; } } else { // no previous sibling DQ_DEBUG << "ObjectStorer::store: Node " << node << " is first child, follows nothing" << endl; } } if (!followsWritten) { m_s->remove(Triple(node, m_followProp, Node())); } DQ_DEBUG << "store: Finished with " << o << endl; } void ObjectStorer::D::allocate(StoreState &state, QObject *o) { DQ_DEBUG << "allocate " << o << endl; //!!! too many of these tests, some must be redundant Node node = state.map.value(o); if (node != Node()) { DQ_DEBUG << "allocate: object " << o << " already has node " << node << endl; return; } Uri uri = getUriFrom(o); if (uri != Uri()) { node = Node(uri); state.map.insert(o, node); state.toAllocate.remove(o); DQ_DEBUG << "allocate: object " << o << " has known uri " << uri << endl; return; } if (m_bp == PermitBlankObjectNodes && !state.noBlanks.contains(o)) { node = m_s->addBlankNode(); DQ_DEBUG << "allocate: object " << o << " being given new blank node " << node << endl; } else { QString className = o->metaObject()->className(); DQ_DEBUG << "className = " << className << endl; Uri prefix; if (!m_tm.getUriPrefixForClass(className, prefix)) { //!!! put this in TypeMapping? QString tag = className.toLower() + "_"; tag.replace("::", "_"); prefix = m_s->expand(":" + tag); } Uri uri = m_s->getUniqueUri(prefix.toString()); o->setProperty("uri", QVariant::fromValue(uri)); node = uri; DQ_DEBUG << "allocate: object " << o << " being given new URI " << uri << endl; } state.map.insert(o, node); state.toAllocate.remove(o); } void ObjectStorer::D::storeSingle(StoreState &state, QObject *o, Node node) { QString className = o->metaObject()->className(); m_s->add(Triple(node, Uri("a"), m_tm.synthesiseTypeUriForClass(className))); storeProperties(state, o, node); state.toStore.remove(o); } void ObjectStorer::D::callStoreCallbacks(StoreState &state, QObject *o) { Node node = state.map.value(o); foreach (StoreCallback *cb, m_storeCallbacks) { cb->stored(m_m, state.map, o, node); } } ObjectStorer::ObjectStorer(Store *s) : m_d(new D(this, s)) { } ObjectStorer::~ObjectStorer() { delete m_d; } Store * ObjectStorer::getStore() { return m_d->getStore(); } void ObjectStorer::setTypeMapping(const TypeMapping &tm) { m_d->setTypeMapping(tm); } const TypeMapping & ObjectStorer::getTypeMapping() const { return m_d->getTypeMapping(); } void ObjectStorer::setPropertyStorePolicy(PropertyStorePolicy policy) { m_d->setPropertyStorePolicy(policy); } ObjectStorer::PropertyStorePolicy ObjectStorer::getPropertyStorePolicy() const { return m_d->getPropertyStorePolicy(); } void ObjectStorer::setBlankNodePolicy(BlankNodePolicy policy) { m_d->setBlankNodePolicy(policy); } BlankNodePolicy ObjectStorer::getBlankNodePolicy() const { return m_d->getBlankNodePolicy(); } void ObjectStorer::setFollowPolicy(FollowPolicy policy) { m_d->setFollowPolicy(policy); } ObjectStorer::FollowPolicy ObjectStorer::getFollowPolicy() const { return m_d->getFollowPolicy(); } void ObjectStorer::removeObject(Node n) { m_d->removeObject(n); } Uri ObjectStorer::store(QObject *o) { ObjectNodeMap map; return m_d->store(o, map); } Uri ObjectStorer::store(QObject *o, ObjectNodeMap &map) { return m_d->store(o, map); } void ObjectStorer::store(QObjectList o) { ObjectNodeMap map; m_d->store(o, map); } void ObjectStorer::store(QObjectList o, ObjectNodeMap &map) { m_d->store(o, map); } void ObjectStorer::addStoreCallback(StoreCallback *cb) { m_d->addStoreCallback(cb); } } sonic-visualiser-3.0.3/dataquay/src/objectmapper/TypeMapping.cpp0000644000000000000000000001712113111512442023152 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/TypeMapping.h" #include "objectmapper/ObjectMapperExceptions.h" #include namespace Dataquay { static Uri defaultTypePrefix("http://breakfastquay.com/rdf/dataquay/objectmapper/type/"); static Uri defaultPropertyPrefix("http://breakfastquay.com/rdf/dataquay/objectmapper/property/"); static Uri defaultRelationshipPrefix("http://breakfastquay.com/rdf/dataquay/objectmapper/relationship/"); class TypeMapping::D { public: D() : m_typePrefix(defaultTypePrefix), m_propertyPrefix(defaultPropertyPrefix), m_relationshipPrefix(defaultRelationshipPrefix) { } Uri getObjectTypePrefix() const { return m_typePrefix; } void setObjectTypePrefix(Uri prefix) { m_typePrefix = prefix; } Uri getPropertyPrefix() const { return m_propertyPrefix; } void setPropertyPrefix(Uri prefix) { m_propertyPrefix = prefix; } Uri getRelationshipPrefix() const { return m_relationshipPrefix; } void setRelationshipPrefix(Uri prefix) { m_relationshipPrefix = prefix; } void addTypeMapping(QString className, Uri uri) { m_typeMap[uri] = className; m_typeRMap[className] = uri; } bool getTypeUriForClass(QString className, Uri &uri) const { QHash::const_iterator i = m_typeRMap.find(className); if (i != m_typeRMap.end()) { uri = *i; return true; } return false; } bool getClassForTypeUri(Uri typeUri, QString &className) const { QHash::const_iterator i = m_typeMap.find(typeUri); if (i != m_typeMap.end()) { className = *i; return true; } return false; } QString synthesiseClassForTypeUri(Uri typeUri) const { QString s; if (getClassForTypeUri(typeUri, s)) { return s; } s = typeUri.toString(); if (!s.startsWith(m_typePrefix.toString())) { throw UnknownTypeException(s); } s = s.right(s.length() - m_typePrefix.length()); s.replace('/', "::"); return s; } Uri synthesiseTypeUriForClass(QString className) const { Uri typeUri; if (getTypeUriForClass(className, typeUri)) { return typeUri; } typeUri = Uri(QString(m_typePrefix.toString() + className) .replace("::", "/")); return typeUri; } void addTypeUriPrefixMapping(QString className, Uri prefix) { m_typeUriPrefixMap[className] = prefix; } bool getUriPrefixForClass(QString className, Uri &prefix) const { QHash::const_iterator i = m_typeUriPrefixMap.find(className); if (i != m_typeUriPrefixMap.end()) { prefix = *i; return true; } return false; } void addPropertyMapping(QString className, QString propertyName, Uri uri) { m_propertyMap[className][uri] = propertyName; m_propertyRMap[className][propertyName] = uri; } bool getPropertyUri(QString className, QString propertyName, Uri &uri) const { QHash >::const_iterator j = m_propertyRMap.find(className); if (j != m_propertyRMap.end()) { QHash::const_iterator i = j->find(propertyName); if (i != j->end()) { uri = *i; return true; } } return false; } bool getPropertyName(QString className, Uri uri, QString &propertyName) const { QHash >::const_iterator j = m_propertyMap.find(className); if (j != m_propertyMap.end()) { QHash::const_iterator i = j->find(uri); if (i != j->end()) { propertyName = *i; return true; } } return false; } private: Uri m_typePrefix; Uri m_propertyPrefix; Uri m_relationshipPrefix; QHash m_typeMap; QHash m_typeRMap; QHash m_typeUriPrefixMap; QHash > m_propertyMap; QHash > m_propertyRMap; }; TypeMapping::TypeMapping() : m_d(new D()) { } TypeMapping::TypeMapping(const TypeMapping &tm) : m_d(new D(*tm.m_d)) { } TypeMapping & TypeMapping::operator=(const TypeMapping &tm) { if (this != &tm) { delete m_d; m_d = new D(*tm.m_d); } return *this; } TypeMapping::~TypeMapping() { delete m_d; } void TypeMapping::setObjectTypePrefix(Uri prefix) { m_d->setObjectTypePrefix(prefix); } Uri TypeMapping::getObjectTypePrefix() const { return m_d->getObjectTypePrefix(); } void TypeMapping::setPropertyPrefix(Uri prefix) { m_d->setPropertyPrefix(prefix); } Uri TypeMapping::getPropertyPrefix() const { return m_d->getPropertyPrefix(); } void TypeMapping::setRelationshipPrefix(Uri prefix) { m_d->setRelationshipPrefix(prefix); } Uri TypeMapping::getRelationshipPrefix() const { return m_d->getRelationshipPrefix(); } void TypeMapping::addTypeMapping(QString className, Uri uri) { m_d->addTypeMapping(className, uri); } bool TypeMapping::getTypeUriForClass(QString className, Uri &uri) const { return m_d->getTypeUriForClass(className, uri); } bool TypeMapping::getClassForTypeUri(Uri uri, QString &className) const { return m_d->getClassForTypeUri(uri, className); } Uri TypeMapping::synthesiseTypeUriForClass(QString className) const { return m_d->synthesiseTypeUriForClass(className); } QString TypeMapping::synthesiseClassForTypeUri(Uri typeUri) const { return m_d->synthesiseClassForTypeUri(typeUri); } void TypeMapping::addTypeUriPrefixMapping(QString className, Uri prefix) { m_d->addTypeUriPrefixMapping(className, prefix); } bool TypeMapping::getUriPrefixForClass(QString className, Uri &prefix) const { return m_d->getUriPrefixForClass(className, prefix); } void TypeMapping::addPropertyMapping(QString className, QString propertyName, Uri uri) { m_d->addPropertyMapping(className, propertyName, uri); } bool TypeMapping::getPropertyUri(QString className, QString propertyName, Uri &uri) const { return m_d->getPropertyUri(className, propertyName, uri); } bool TypeMapping::getPropertyName(QString className, Uri propertyUri, QString &propertyName) const { return m_d->getPropertyName(className, propertyUri, propertyName); } } sonic-visualiser-3.0.3/dataquay/tests/TestBasicStore.h0000644000000000000000000005130213111512442021157 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_BASIC_STORE_H_ #define _TEST_BASIC_STORE_H_ #include #include #include #include #include namespace Dataquay { class TestBasicStore : public QObject { Q_OBJECT private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); base = store.getBaseUri().toString(); count = 0; fromFred = 0; usingKnows = 0; toAlice = 0; } void makeUri() { // create absolute URI QString s("http://breakfastquay.com/rdf/dataquay/"); Uri uri(s); QCOMPARE(uri.length(), s.length()); // fail to create relative or bogus URI in a few different ways try { Uri uri("/rdf/dataquay"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { Uri uri("#x"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { Uri uri("x"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { Uri uri(""); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } // "a" is a special case uri = Uri("a"); QCOMPARE(uri, Uri::rdfTypeUri()); // succeed in creating relative file URI, Uri should fix it for us uri = Uri("file:a"); QVERIFY(uri.toString() == "file://a"); uri = Uri("file:/a/b"); QVERIFY(uri.toString() == "file:///a/b"); // but we don't like any other prefix without // try { uri = Uri("blah:a"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { uri = Uri("blah:/a"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } // succeed in creating absolute URI through store.expand uri = store.expand(":relative"); QCOMPARE(uri.length(), store.getBaseUri().length() + 8); // but fail in turning bogus URI into good one try { uri = store.expand("bogus"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } // and fail in expanding a relative URI through a store with // no base URI BasicStore s1; try { uri = s1.expand(":relative"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } } void simpleAdd() { // check triple can be added QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); ++count; ++fromFred; // alternative Triple constructor QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":alice")))); ++count; ++fromFred; ++usingKnows; ++toAlice; } void simpleLookup() { // check triple just added can be found again QVERIFY(store.contains (Triple(store.expand(":fred"), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Jenkins")))); } void simpleAbsentLookup() { // check absent triple lookups are correctly handled QVERIFY(!store.contains (Triple(store.expand(":fred"), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Johnson")))); } void addFromVariantInt() { // variant conversion QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":age"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(triples[0].c.toVariant().toInt(), 42); } void addFromVariantURI() { // variant conversion Uri fredUri("http://breakfastquay.com/rdf/person/fred"); QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_uri"), Node::fromVariant (QVariant::fromValue(fredUri))))); ++count; ++fromFred; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_local_uri"), Node::fromVariant (QVariant::fromValue(store.expand(":pootle")))))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":has_some_uri"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(Uri(triples[0].c.value), fredUri); triples = store.match (Triple(store.expand(":fred"), store.expand(":has_some_local_uri"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(triples[0].c.toVariant().value(), store.expand(":pootle")); } void addFromVariantFloat() { // variant conversion QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":likes_to_think_his_age_is"), Node::fromVariant(QVariant(21.9))))); ++count; ++fromFred; } void addFromVariantBool() { // variant conversion QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":is_sadly_deluded"), Node::fromVariant(true)))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":is_sadly_deluded"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(triples[0].c.toVariant().toBool(), true); } void addFromVariantList() { // variant conversion QStringList colours; colours << "turquoise"; colours << "red"; colours << "black"; QCOMPARE(colours.size(), 3); QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":favourite_colours_are"), Node::fromVariant(QVariant(colours))))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":favourite_colours_are"), Node())); QCOMPARE(triples.size(), 1); QStringList retrievedColours = triples[0].c.toVariant().toStringList(); QCOMPARE(colours, retrievedColours); } void addWithRdfTypeBuiltin() { // rdf:type builtin QVERIFY(store.add (Triple(store.expand(":fred"), Uri("a"), store.expand(":person")))); QVERIFY(store.contains (Triple(store.expand(":fred"), store.expand("rdf:type"), store.expand(":person")))); ++count; ++fromFred; } void addUsingPrefix() { // prefix expansion store.addPrefix("foaf", Uri("http://xmlns.com/foaf/0.1/")); QVERIFY(store.add (Triple(store.expand(":alice"), store.expand("foaf:knows"), store.expand(":fred")))); QVERIFY(store.contains (Triple(store.expand(":alice"), Node(Uri("http://xmlns.com/foaf/0.1/knows")), store.expand(":fred")))); QVERIFY(store.add (Triple(store.expand(":alice"), store.expand("foaf:name"), Node(QString("Alice Banquet"))))); ++usingKnows; ++count; ++count; } void addDuplicate() { // we try to add a triple that is a differently-expressed // duplicate of an already-added one -- this should be ignored // (returning false) and we do not increment our count QVERIFY(!store.add (Triple(Uri(base + "alice"), Uri("http://xmlns.com/foaf/0.1/name"), Node(QString("Alice Banquet"))))); // now we try to add a triple a bit like an existing one but // differing in prefix -- this should succeed, and we do increment // our count, although this is not a very useful statement QVERIFY(store.add (Triple(store.expand(":alice"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand("foaf:fred")))); ++usingKnows; ++count; } void addBlanks() { // things involving blank nodes Node blankNode = store.addBlankNode(); QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/maker"), blankNode))); ++count; ++fromFred; QVERIFY(store.add (Triple(blankNode, store.expand("foaf:name"), Node("Omnipotent Being")))); ++count; } void addBlankPredicateFail() { // can't have a blank node as predicate Node anotherBlank = store.addBlankNode(); try { QVERIFY(!store.add (Triple(store.expand(":fred"), anotherBlank, Node("this_statement_is_incomplete")))); } catch (RDFException &) { QVERIFY(1); } } void matchCounts() { // Must run after adds. Check match-all, and matches with each // of S, P and O primary QCOMPARE(store.match(Triple()).size(), count); QCOMPARE(store.match (Triple(store.expand(":fred"), Node(), Node())).size(), fromFred); QCOMPARE(store.match (Triple(Node(), store.expand("foaf:knows"), Node())).size(), usingKnows); QCOMPARE(store.match (Triple(Node(), Node(), store.expand(":alice"))).size(), toAlice); } void compareTriples() { // check empty Triples match QVERIFY(Triples().matches(Triples())); // check two identical searches return matching (non-empty) results Triples t1 = store.match(Triple(store.expand(":fred"), Node(), Node())); Triples t2 = store.match(Triple(store.expand(":fred"), Node(), Node())); QVERIFY(t1.size() > 0); QVERIFY(!t1.matches(Triples())); QVERIFY(t1.matches(t2)); QVERIFY(t2.matches(t1)); // check Triples matches itself in a different order t2 = Triples(); foreach (Triple t, t1) t2.push_front(t); QVERIFY(t1.matches(t2)); QVERIFY(t2.matches(t1)); // check two different searches return non-matching results t2 = store.match(Triple(store.expand(":alice"), Node(), Node())); QVERIFY(!t1.matches(t2)); QVERIFY(!t2.matches(t1)); } void sliceTriples() { Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); Nodes nna = tt.subjects(); QCOMPARE(nna.size(), count); foreach (Node n, nna) { QVERIFY(n.type == Node::URI || n.type == Node::Blank); } Nodes nnb = tt.predicates(); QVERIFY(nnb != nna); QCOMPARE(nnb.size(), count); foreach (Node n, nnb) { QVERIFY(n.type == Node::URI); } Nodes nnc = tt.objects(); QVERIFY(nnc != nna); QCOMPARE(nnc.size(), count); } void query() { QString q = QString(" SELECT ?a " " WHERE { :fred foaf:knows ?a } "); ResultSet results; // We cannot perform queries without an absolute base URI, // it seems, because the query engine takes relative URIs // as relative to the query URI and we can't override that // without an absolute prefix for the base URI try { results = store.query(q); QCOMPARE(results.size(), 1); Node v = store.queryOnce(q, "a"); QString expected = base + "alice"; QCOMPARE(v.type, Node::URI); QCOMPARE(v.value, expected); } catch (RDFUnsupportedError &e) { #if (QT_VERSION >= 0x050000) QSKIP("SPARQL queries not supported by current store backend"); #else QSKIP("SPARQL queries not supported by current store backend", SkipSingle); #endif } } void complete() { Node n = store.complete (Triple(store.expand(":alice"), store.expand("foaf:name"), Node())); QCOMPARE(n, Node("Alice Banquet")); n = store.complete (Triple(store.expand(":alice"), Node(), Node("Alice Banquet"))); QCOMPARE(n, Node(store.expand("foaf:name"))); n = store.complete (Triple(Node(), store.expand("foaf:name"), Node("Alice Banquet"))); QCOMPARE(n, Node(store.expand(":alice"))); try { n = store.complete (Triple(store.expand(":alice"), store.expand("foaf:name"), Node("Alice Banquet"))); QVERIFY(0); } catch (RDFException &) { // can't complete a complete triple QVERIFY(1); } try { n = store.complete (Triple(Node(), store.expand("foaf:name"), Node())); QVERIFY(0); } catch (RDFException &) { // can't complete an underspecified triple QVERIFY(1); } } void saveAndLoad() { store.save("test.ttl"); BasicStore *store2 = BasicStore::load(QUrl("file:test.ttl")); QVERIFY(store2); store2->save("test2.ttl"); QCOMPARE(store2->match(Triple()).size(), count); QCOMPARE(store2->match (Triple(store.expand(":fred"), Node(), Node())).size(), fromFred); QCOMPARE(store2->match (Triple(Node(), Node(), store.expand(":alice"))).size(), toAlice); delete store2; store.clear(); store.import(QUrl("file:test2.ttl"), BasicStore::ImportFailOnDuplicates); QCOMPARE(store.match(Triple()).size(), count); QCOMPARE(store.match (Triple(store.expand(":fred"), Node(), Node())).size(), fromFred); QCOMPARE(store.match (Triple(Node(), Node(), store.expand(":alice"))).size(), toAlice); } //!!! todo: files with explicit @base in file void loadRelative() { // Make test file without a base URI QFile f("test3.ttl"); QVERIFY(f.open(QFile::WriteOnly | QFile::Truncate)); QTextStream ts(&f); ts << "@prefix : <#> ." << endl << ":thing a :wotsit ." << endl; ts.flush(); f.close(); // If a file has no base URI, importing it into an existing // store with a base should result in URLs relative to that // base BasicStore s1; s1.setBaseUri(Uri("http://wox/")); s1.import(QUrl("file:test3.ttl"), BasicStore::ImportIgnoreDuplicates); Triple t = s1.matchOnce(Triple(Node(), Uri("a"), Node())); QCOMPARE(t.a, Node(Uri("http://wox/#thing"))); QCOMPARE(t.c, Node(Uri("http://wox/#wotsit"))); // And loading it should result in URLs relative to the file // URL BasicStore *s2 = BasicStore::load(QUrl("file:test3.ttl")); t = s2->matchOnce(Triple(Node(), Uri("a"), Node())); QCOMPARE(t.a, Node(Uri("file://test3.ttl#thing"))); QCOMPARE(t.c, Node(Uri("file://test3.ttl#wotsit"))); } void loadMultiBase() { // save two stores with different base URIs to files, check we // can reload them into the same store (i.e. that we resolve // the CURIEs properly relative to file base URI not target // store base URI on loading) BasicStore *otherStore = new BasicStore; otherStore->setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests/other#")); // this must be a triple we have already added to the first // store, using a local URI -- we are checking here for // duplicates on import QVERIFY(otherStore->add (Triple(otherStore->expand(":fred"), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Jenkins")))); // and this is to test that the reloaded :fred, despite having // the same name, is a different individual from the :fred in // our first store QVERIFY(otherStore->add (Triple(otherStore->expand(":fred"), otherStore->expand(":age"), Node::fromVariant(QVariant(3))))); store.save("multi-a.ttl"); otherStore->save("multi-b.ttl"); BasicStore *target = new BasicStore; target->setBaseUri(store.getBaseUri()); target->import(QUrl("file:multi-a.ttl"), BasicStore::ImportIgnoreDuplicates); QVERIFY(target); QCOMPARE(target->getBaseUri(), store.getBaseUri()); target->import(QUrl("file:multi-b.ttl"), Store::ImportFailOnDuplicates); QVERIFY(target->contains (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); QVERIFY(target->contains (Triple(Uri("http://breakfastquay.com/rdf/dataquay/tests#fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); QVERIFY(target->contains (Triple(Node(Uri("http://breakfastquay.com/rdf/dataquay/tests/other#fred")), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Jenkins")))); QVERIFY(target->contains (Triple(Uri("http://breakfastquay.com/rdf/dataquay/tests/other#fred"), Uri("http://breakfastquay.com/rdf/dataquay/tests/other#age"), Node("3", store.expand("xsd:integer"))))); QVERIFY(target->contains (Triple(Node(Uri("http://breakfastquay.com/rdf/dataquay/tests#fred")), store.expand(":age"), Node("42", store.expand("xsd:integer"))))); } void loadCompetingBlanks() { // import from two files which use the same blank genid for // different purposes and establish that the two don't // conflict with each other { QFile f("test-blank-1.ttl"); QVERIFY(f.open(QFile::WriteOnly | QFile::Truncate)); QTextStream ts(&f); ts << "@prefix : <#> ." << endl; ts << ":thing :has _:genid1 ." << endl; ts << "_:genid1 :name \"weevil\" ." << endl; ts.flush(); f.close(); } { QFile f("test-blank-2.ttl"); QVERIFY(f.open(QFile::WriteOnly | QFile::Truncate)); QTextStream ts(&f); ts << "@prefix : <#> ." << endl; ts << ":other :has _:genid1 ." << endl; ts << "_:genid1 :name \"squidlet\" ." << endl; ts.flush(); f.close(); } BasicStore *s = BasicStore::load(QUrl("file:test-blank-1.ttl")); s->import(QUrl("file:test-blank-2.ttl"), Store::ImportFailOnDuplicates); Triple t1 = s->matchOnce(Triple(Node(), Node(), Node("weevil"))); Triple t2 = s->matchOnce(Triple(Node(), Node(), Node("squidlet"))); QVERIFY(t1.a != t2.a); delete s; } void remove() { // check we can remove a triple QVERIFY(store.remove (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":alice")))); --count; --fromFred; --toAlice; // check we can't remove a triple that does not exist in store QVERIFY(!store.remove (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":tammy")))); Triples triples = store.match(Triple()); QCOMPARE(triples.size(), count); } void removeMatch() { // check we can remove triples matching wildcard pattern QVERIFY(store.remove(Triple(store.expand(":fred"), Node(), Node()))); Triples triples = store.match(Triple()); QCOMPARE(triples.size(), count - fromFred); QVERIFY(store.remove(Triple(Node(), Node(), Node()))); triples = store.match(Triple()); QCOMPARE(triples.size(), 0); } private: BasicStore store; QString base; int count; int fromFred; int usingKnows; int toAlice; }; } #endif sonic-visualiser-3.0.3/dataquay/tests/TestDatatypes.cpp0000644000000000000000000000332713111512442021416 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TestDatatypes.h" QDataStream &operator<<(QDataStream &out, StreamableValueType v) { return out << int(v); } QDataStream &operator>>(QDataStream &in, StreamableValueType &v) { int i; in >> i; v = StreamableValueType(i); return in; } sonic-visualiser-3.0.3/dataquay/tests/TestDatatypes.h0000644000000000000000000001624013111512442021061 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_DATATYPES_H_ #define _TEST_DATATYPES_H_ #include #include #include #include #include /* StreamableValueType is a type that can be streamed to QDataStream * and thus converted automatically to QVariant, but that will not be * registered with a Node encoder -- so Node must use an "unknown * type" datatype */ enum StreamableValueType { ValueA = 0, ValueB, ValueC, ValueD, ValueE }; /* NonStreamableValueType is a type that cannot be streamed to * QDataStream, but that we will register with a Node encoder -- so * Node can give it the proper datatype */ enum NonStreamableValueType { ValueF = 0, ValueG, ValueH, ValueI, ValueJ }; Q_DECLARE_METATYPE(StreamableValueType) Q_DECLARE_METATYPE(NonStreamableValueType) extern QDataStream &operator<<(QDataStream &out, StreamableValueType v); extern QDataStream &operator>>(QDataStream &in, StreamableValueType &v); namespace Dataquay { struct NonStreamableEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { if (s == "F") return QVariant::fromValue(ValueF); else if (s == "G") return QVariant::fromValue(ValueG); else if (s == "H") return QVariant::fromValue(ValueH); else if (s == "I") return QVariant::fromValue(ValueI); else if (s == "J") return QVariant::fromValue(ValueJ); else return QVariant(); } QString fromVariant(const QVariant &v) { NonStreamableValueType nsv = v.value(); switch (nsv) { case ValueF: return "F"; case ValueG: return "G"; case ValueH: return "H"; case ValueI: return "I"; case ValueJ: return "J"; default: return ""; } } }; class TestDatatypes : public QObject { Q_OBJECT private: Uri nsvDtUri; private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); qRegisterMetaType("StreamableValueType"); qRegisterMetaType("NonStreamableValueType"); qRegisterMetaTypeStreamOperators("StreamableValueType"); nsvDtUri = Uri("http://breakfastquay.com/rdf/dataquay/test/nonstreamable"); Node::registerDatatype(nsvDtUri, "NonStreamableValueType", new NonStreamableEncoder()); } void basicConversions() { Node n("Fred Jenkins", Uri()); QVariant v = n.toVariant(); QCOMPARE(v.userType(), (int)QMetaType::QString); QCOMPARE(Node::fromVariant(v).datatype, n.datatype); Triple t(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), n); QVERIFY(store.add(t)); t.c = Node(); Triple t0(store.matchOnce(t)); Node n0 = t.c; QCOMPARE(n0.datatype, n.datatype); n = Node("1", store.expand("xsd:integer")); v = n.toVariant(); QCOMPARE(v.userType(), (int)QMetaType::Long); n0 = Node::fromVariant(v); QCOMPARE(n0.datatype, n.datatype); t = Triple(store.expand(":fred"), store.expand(":number_of_jobs"), n); QVERIFY(store.add(t)); t.c = Node(); t0 = store.matchOnce(t); n0 = t0.c; QCOMPARE(n0.datatype, n.datatype); } void streamableTypeConversions() { StreamableValueType sv = ValueC; QVERIFY(QMetaType::type("StreamableValueType") > 0); // first some tests on basic QVariant storage just to ensure // we've registered the type correctly and our understanding // of expected behaviour is correct QVariant svv = QVariant::fromValue(sv); QCOMPARE(svv.userType(), (int)QMetaType::type("StreamableValueType")); QCOMPARE(svv.value(), sv); // we registered in initTestCase stream operators necessary to // permit Node-QVariant conversion using an opaque "unknown // type" node datatype and the standard QVariant datastream // streaming: test conversion that way Node n = Node::fromVariant(svv); //!!! no -- the type is actually encodedVariantTypeURI from Node.cpp, and this is what we should expect -- but it's not public! we can't test it -- fix this // QCOMPARE(n.datatype, Uri()); Triple t = Triple(store.expand(":fred"), store.expand(":has_some_value"), n); QVERIFY(store.add(t)); t.c = Node(); Triple t0 = store.matchOnce(t); Node n0 = t0.c; QCOMPARE(n0.datatype, n.datatype); QVariant v0 = n0.toVariant(); QCOMPARE(v0.userType(), svv.userType()); QCOMPARE(v0.value(), svv.value()); } void nonStreamableTypeConversions() { NonStreamableValueType nsv = ValueJ; QVERIFY(QMetaType::type("NonStreamableValueType") > 0); // as above but using NonStreamableValueType with a // registered encoder, rather than StreamableValueType with no // encoder but a stream operator instead QVariant nsvv = QVariant::fromValue(nsv); QCOMPARE(nsvv.userType(), (int)QMetaType::type("NonStreamableValueType")); QCOMPARE(nsvv.value(), nsv); Node n = Node::fromVariant(nsvv); QCOMPARE(n.datatype, nsvDtUri); Triple t = Triple(store.expand(":fred"), store.expand(":has_some_other_value"), n); QVERIFY(store.add(t)); t.c = Node(); Triple t0 = store.matchOnce(t); Node n0 = t0.c; QCOMPARE(n0.datatype, n.datatype); QVariant v0 = n0.toVariant(); QCOMPARE(v0.userType(), nsvv.userType()); QCOMPARE(v0.value(), nsvv.value()); } void explicitlyTypedRetrieval() { QVariant nsvv = QVariant::fromValue(ValueJ); Node n = Node::fromVariant(nsvv); n.datatype = Uri(); QVariant v0 = n.toVariant(); // having reset the datatype, this should be the default QCOMPARE(v0.userType(), (int)QMetaType::QString); // now convert with datatype prompting v0 = n.toVariant(QMetaType::type("NonStreamableValueType")); QCOMPARE(v0.userType(), nsvv.userType()); } private: BasicStore store; }; } #endif sonic-visualiser-3.0.3/dataquay/tests/TestImportOptions.h0000644000000000000000000001213713111512442021752 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_IMPORT_OPTIONS_H_ #define _TEST_IMPORT_OPTIONS_H_ #include #include #include #include #include #include #include namespace Dataquay { class TestImportOptions : public QObject { Q_OBJECT private slots: void initTestCase() { count = 0; store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); // If TestBasicStore has passed, these should be no problem QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_uri"), Node::fromVariant(QVariant::fromValue (Uri("http://breakfastquay.com/rdf/person/fred")))))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_local_uri"), Node::fromVariant(QVariant::fromValue (store.expand(":pootle")))))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":likes_to_think_his_age_is"), Node::fromVariant(QVariant(21.9))))); ++count; filename = "import-test.ttl"; fileUrl = QUrl("file:" + filename); store.save(filename); } void normal() { store.clear(); store.import(fileUrl, BasicStore::ImportIgnoreDuplicates); Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); } void duplicatesFail() { store.clear(); store.import(fileUrl, BasicStore::ImportFailOnDuplicates); bool caught = false; try { store.import(fileUrl, BasicStore::ImportFailOnDuplicates); } catch (RDFDuplicateImportException) { caught = true; } QVERIFY2(caught, "Failed to catch RDFDuplicateImportException when importing duplicate graph with ImportFailOnDuplicates"); Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); } void duplicatesIgnored() { store.clear(); store.import(fileUrl, BasicStore::ImportFailOnDuplicates); store.import(fileUrl, BasicStore::ImportIgnoreDuplicates); // note -- the number of triples after import is only the same // as count because there are no blank nodes involved, so all // nodes are duplicates. Blank nodes synthesised during import // can't be identified as identical to existing blank nodes, // so they would load multiple times successfully leaving us // with semantically identical triples in the store Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); } void duplicatesPermitted() { store.clear(); store.import(fileUrl, BasicStore::ImportFailOnDuplicates); store.import(fileUrl, BasicStore::ImportPermitDuplicates); // we can say nothing about the number of triples in store // here as it all depends on the back end (this is not a // useful mode if the store already has something in it, it's // just the fastest) } void transactionalIsolation() { // testing only isolation during import, there is a separate // TransactionalStore test suite TransactionalStore ts(&store); Connection c(&ts); c.remove(Triple()); c.commit(); c.import(fileUrl, BasicStore::ImportIgnoreDuplicates); { Connection c2(&ts); // unrelated connection, should be isolated QCOMPARE(c2.match(Triple()).size(), 0); } c.commit(); { Connection c2(&ts); QCOMPARE(c2.match(Triple()).size(), count); } } private: BasicStore store; QString filename; QUrl fileUrl; int count; }; } #endif sonic-visualiser-3.0.3/dataquay/tests/TestObjectMapper.h0000644000000000000000000005334413111512442021504 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_OBJECT_MAPPER_H_ #define _TEST_OBJECT_MAPPER_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Object types to be used in the tests class A : public QObject { Q_OBJECT Q_PROPERTY(QObject *ref READ getRef WRITE setRef STORED true) public: A(QObject *parent = 0) : QObject(parent), m_ref(0) { } QObject *getRef() const { return m_ref; } void setRef(QObject *r) { m_ref = r; } private: QObject *m_ref; }; Q_DECLARE_METATYPE(A*) class B : public QObject { Q_OBJECT Q_PROPERTY(A *aref READ getA WRITE setA STORED true) public: B(QObject *parent = 0) : QObject(parent), m_a(0) { } A *getA() const { return m_a; } void setA(A *r) { m_a = qobject_cast(r); } private: A *m_a; }; Q_DECLARE_METATYPE(B*) class C : public QObject { Q_OBJECT Q_PROPERTY(QString string READ getString WRITE setString NOTIFY stringChanged STORED true) Q_PROPERTY(QStringList strings READ getStrings WRITE setStrings NOTIFY stringsChanged STORED true) Q_PROPERTY(QList floats READ getFloats WRITE setFloats STORED true) Q_PROPERTY(QList bees READ getBees WRITE setBees STORED true) Q_PROPERTY(QSet cees READ getCees WRITE setCees STORED true) Q_PROPERTY(QObjectList objects READ getObjects WRITE setObjects STORED true) public: C(QObject *parent = 0) : QObject(parent) { } QString getString() const { return m_string; } void setString(QString s) { m_string = s; emit stringChanged(s); } QStringList getStrings() const { return m_strings; } void setStrings(QStringList sl) { m_strings = sl; emit stringsChanged(sl); } QList getFloats() const { return m_floats; } void setFloats(QList fl) { m_floats = fl; } QList getBees() const { return m_bees; } void setBees(QList bl) { m_bees = bl; } QSet getCees() const { return m_cees; } void setCees(QSet cl) { m_cees = cl; } QObjectList getObjects() const { return m_objects; } void setObjects(QObjectList ol) { m_objects = ol; } signals: void stringChanged(QString s); void stringsChanged(QStringList sl); private: QString m_string; QStringList m_strings; QList m_floats; QList m_bees; QSet m_cees; QObjectList m_objects; }; Q_DECLARE_METATYPE(C*) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QObjectList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QSet) namespace Dataquay { class TestObjectMapper : public QObject { Q_OBJECT public: TestObjectMapper() : store(), storer(&store) { } ~TestObjectMapper() { } private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); store.addPrefix("type", storer.getTypeMapping().getObjectTypePrefix()); store.addPrefix("property", storer.getTypeMapping().getPropertyPrefix()); store.addPrefix("rel", storer.getTypeMapping().getRelationshipPrefix()); } void init() { store.clear(); storer.setPropertyStorePolicy(ObjectStorer::StoreIfChanged); } void untypedStoreRecall() { QObject *o = new QObject; o->setObjectName("Test Object"); Uri uri = storer.store(o); QVERIFY(uri != Uri()); ObjectLoader loader(&store); QObject *recalled = loader.load(uri); QVERIFY(recalled); QCOMPARE(recalled->objectName(), o->objectName()); delete recalled; delete o; } void typedStoreRecall() { QTimer *t = new QTimer; t->setSingleShot(true); t->setInterval(4); Uri uri = storer.store(t); QVERIFY(uri != Uri()); ObjectLoader loader(&store); QObject *recalled = 0; try { // object type is not registered, this load should fail recalled = loader.load(uri); QVERIFY(0); } catch (UnknownTypeException) { QVERIFY(1); } ObjectBuilder::getInstance()->registerClass(); recalled = loader.load(uri); QVERIFY(recalled); QCOMPARE(recalled->objectName(), t->objectName()); QVERIFY(qobject_cast(recalled)); delete recalled; delete t; } void customTypeStoreRecall() { A *a = new A; a->setProperty("uri", QVariant::fromValue(store.expand(":a"))); Uri uri = storer.store(a); QVERIFY(uri != Uri()); ObjectLoader loader(&store); QObject *recalled = 0; try { // object type is not registered, this load should fail recalled = loader.load(uri); QVERIFY(0); } catch (UnknownTypeException) { QVERIFY(1); } qRegisterMetaType("A*"); ObjectBuilder::getInstance()->registerClass("A*"); recalled = loader.load(uri); QVERIFY(recalled); QCOMPARE(recalled->objectName(), a->objectName()); QVERIFY(qobject_cast(recalled)); delete recalled; delete a; } void prepareGraphTypes() { // We registered the metatype and object builder class for A // in the previous test qRegisterMetaType("B*"); qRegisterMetaType("C*"); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); qRegisterMetaType >("QSet"); qRegisterMetaType("QObjectList"); ObjectBuilder::getInstance()->registerClass("B*"); ObjectBuilder::getInstance()->registerClass("C*"); ContainerBuilder::getInstance()->registerContainer >("A*", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("B*", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("C*", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer("QObject*", "QObjectList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("float", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("C*", "QSet", ContainerBuilder::SetKind); } void complexGraphStoreRecall() { QObject *o = new QObject; o->setObjectName("Test Object"); A *a = new A(o); B *b = new B(o); b->setA(a); C *c = new C; c->setObjectName("C with many properties"); QStringList strings; strings << "First string"; strings << "Second string"; c->setStrings(strings); QList floats; floats << 1.f; floats << 2.f; floats << 3.f; floats << 4.f; c->setFloats(floats); QList blist; B *b0 = new B; b0->setA(a); b0->setObjectName("b0"); B *b1 = new B; A *a1 = new A; a1->setObjectName("a1"); b1->setA(a1); b1->setObjectName("b1"); B *b2 = new B; b2->setObjectName("b2"); blist << b0 << b1; c->setBees(blist); QSet cset; C *c1 = new C; c1->setObjectName("c1"); C *c2 = new C; c2->setObjectName("c2"); cset.insert(c1); cset.insert(c2); // nb circular reference cset.insert(c); c->setCees(cset); QObjectList ol; ol << b2; c->setObjects(ol); a->setRef(c); storer.setFollowPolicy(ObjectStorer::FollowObjectProperties | ObjectStorer::FollowChildren); ObjectStorer::ObjectNodeMap map; storer.store(o, map); // We should have: // // - one object with URI, one property, of type:QObject // - one object with URI, one property, follows, and parent, of type:A // - one blank node of type:A // - three blank nodes of type:C // - four blank nodes of type:B, one of which has parent // // We will check existence (though not qualities) of all the // above. First though we do a quick count of type triples, then // store again using the same object-node map, then check the // results match (in case the storer is generating new URIs or // blank nodes for things that already have them in the map). Triples test = store.match(Triple(Node(), Uri("a"), Node())); QCOMPARE(test.size(), 10); storer.store(o, map); test = store.match(Triple(Node(), Uri("a"), Node())); QCOMPARE(test.size(), 10); // Now the rest of the content tests test = store.match(Triple(Node(), Uri("a"), store.expand("type:QObject"))); QCOMPARE(test.size(), 1); QCOMPARE(test[0].a.type, Node::URI); test = store.match(Triple(Node(), Uri("a"), store.expand("type:A"))); QCOMPARE(test.size(), 2); int blankCount = 0, uriCount = 0; foreach (Triple t, test) { if (t.a.type == Node::URI) uriCount++; else if (t.a.type == Node::Blank) blankCount++; } QCOMPARE(blankCount, 1); QCOMPARE(uriCount, 1); test = store.match(Triple(Node(), Uri("a"), store.expand("type:B"))); QCOMPARE(test.size(), 4); /*!!! not a good test -- one of the Bs ("b") will be given a URI because it's a top-level node rather than a property foreach (Triple t, test) { if (t.a.type != Node::Blank) { cerr << "B-type node in store is not expected blank node" << endl; return false; } } */ test = store.match(Triple(Node(), Uri("a"), store.expand("type:C"))); QCOMPARE(test.size(), 3); // pull out the b0 object node and check some of its properties test = store.match(Triple(Node(), store.expand("property:objectName"), Node("b0"))); QCOMPARE(test.size(), 1); Node b0node = test[0].a; test = store.match(Triple(b0node, store.expand("property:aref"), Node())); QCOMPARE(test.size(), 1); Node anode = test[0].c; test = store.match(Triple(anode, Uri("a"), store.expand("type:A"))); QCOMPARE(test.size(), 1); test = store.match(Triple(anode, store.expand("rel:parent"), Node())); QCOMPARE(test.size(), 1); Node pnode = test[0].c; test = store.match(Triple(pnode, store.expand("property:objectName"), Node())); QCOMPARE(test.size(), 1); QCOMPARE(test[0].c.value, QString("Test Object")); store.save("test-complex-graph.ttl"); delete c; delete a; delete a1; delete b; delete b0; delete b1; delete b2; delete c1; delete c2; delete o; } void complexGraphReload() { // relies on test-complex-graph.ttl having been saved in // previous test ObjectLoader loader(&store); QObjectList objects = loader.loadAll(); QCOMPARE(objects.size(), 0); store.import(QUrl("file:test-complex-graph.ttl"), Store::ImportIgnoreDuplicates); objects = loader.loadAll(); QCOMPARE(objects.size(), 10); // Delete the objects we loaded -- but carefully as some are // children of others. Count the number of these so as // to test that the graph has similar shape to before int haveParent = 0; QObjectList toDelete; foreach (QObject *o, objects) { if (!o->parent()) toDelete.push_back(o); else ++haveParent; } foreach (QObject *o, toDelete) { delete o; } QCOMPARE(haveParent, 2); } void mapperSimpleAdd() { QObject *o = new QObject; o->setObjectName("Test Object"); A *a = new A(o); // prime things by storing one object ObjectStorer storer(&store); storer.store(o); TransactionalStore ts(&store); ObjectMapper mapper(&ts); try { // This should not be possible: the object lacks a URI, // has not been added to the store before, and needs to be // added, not just managed mapper.manage(a); QVERIFY(0); } catch (NoUriException) { QVERIFY(1); } // this should work, though, because o has been stored mapper.manage(o); mapper.add(a); // We haven't committed the add yet, so added object should // have no node yet Node anode = mapper.getNodeForObject(a); QCOMPARE(anode, Node()); // But the object that was stored earlier should have Node onode = mapper.getNodeForObject(o); QVERIFY(onode != Node()); // now commit the add mapper.commit(); // check properties of o Triples t = ts.match(Triple(onode, Node(), Node())); QCOMPARE(t.size(), 2); // type, name t = ts.match(Triple(onode, Uri("a"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, Node(store.expand("type:QObject"))); t = ts.match(Triple(onode, store.expand("property:objectName"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, Node("Test Object")); // and a should have a node now anode = mapper.getNodeForObject(a); QVERIFY(anode != Node()); t = ts.match(Triple(anode, Node(), Node())); QCOMPARE(t.size(), 2); // type, parent t = ts.match(Triple(anode, Uri("a"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, Node(store.expand("type:A"))); t = ts.match(Triple(anode, store.expand("rel:parent"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, onode); delete o; // also deletes a, as it's a child of o } void mapperSimplePropertyUpdate() { C *c = new C; TransactionalStore ts(&store); ObjectMapper mapper(&ts); mapper.add(c); mapper.commit(); Node n = mapper.getNodeForObject(c); QVERIFY(n != Node()); Triple t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c, Node()); c->setString("Lone string"); // should not have affected the store yet t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c, Node()); mapper.commit(); // now it should t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c.value, QString("Lone string")); c->setString("New lone string"); t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c.value, QString("Lone string")); mapper.commit(); t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c.value, QString("New lone string")); Transaction *tx = ts.startTransaction(); QVERIFY(tx->remove(Triple(n, store.expand("property:string"), Node()))); tx->commit(); delete tx; // deleting the property should have caused the object to be // reloaded QCOMPARE(c->getString(), QString()); tx = ts.startTransaction(); QVERIFY(tx->add(Triple(n, store.expand("property:string"), Node("Another lone string")))); tx->commit(); delete tx; QCOMPARE(c->getString(), QString("Another lone string")); delete c; } void mapperListPropertyUpdate() { C *c = new C; TransactionalStore ts(&store); ObjectMapper mapper(&ts); mapper.add(c); mapper.commit(); Node n = mapper.getNodeForObject(c); QVERIFY(n != Node()); QStringList strings; strings << "First string"; strings << "Second string"; c->setStrings(strings); Triple t = ts.matchOnce(Triple(n, store.expand("property:strings"), Node())); QCOMPARE(t.c, Node()); mapper.commit(); t = ts.matchOnce(Triple(n, store.expand("property:strings"), Node())); QVERIFY(t.c.type == Node::Blank); // list starts with blank node Triple v = ts.matchOnce(Triple(t.c, store.expand("rdf:first"), Node())); QCOMPARE(v.c.value, QString("First string")); t = ts.matchOnce(Triple(t.c, store.expand("rdf:rest"), Node())); QVERIFY(t.c.type == Node::Blank); v = ts.matchOnce(Triple(t.c, store.expand("rdf:first"), Node())); QCOMPARE(v.c.value, QString("Second string")); t = ts.matchOnce(Triple(t.c, store.expand("rdf:rest"), Node())); QCOMPARE(t.c, Node(store.expand("rdf:nil"))); strings.clear(); strings << "Replacement string"; c->setStrings(strings); mapper.commit(); t = ts.matchOnce(Triple(n, store.expand("property:strings"), Node())); QVERIFY(t.c.type == Node::Blank); v = ts.matchOnce(Triple(t.c, store.expand("rdf:first"), Node())); QCOMPARE(v.c.value, QString("Replacement string")); t = ts.matchOnce(Triple(t.c, store.expand("rdf:rest"), Node())); QCOMPARE(t.c, Node(store.expand("rdf:nil"))); // check the former strings are now gone t = ts.matchOnce(Triple(Node(), Node(), Node("First string"))); QCOMPARE(t, Triple()); t = ts.matchOnce(Triple(Node(), Node(), Node("Second string"))); QCOMPARE(t, Triple()); delete c; mapper.commit(); // all properties should now be gone, as c has been deleted t = ts.matchOnce(Triple()); QCOMPARE(t, Triple()); } void mapperResyncOnParentRemoval() { // This is a test for a very specific situation -- we cause to // be deleted the parent of a managed object, by removing all // references to the parent from the store so that the mapper // deletes the parent when the transaction is committed. This // causes the child to be deleted by Qt; is the mapper clever // enough to realise that this is a different deletion signal // from that of the parent, and re-sync the child accordingly? QObject *o = new QObject; o->setObjectName("Test Object"); A *a = new A(o); TransactionalStore ts(&store); ObjectMapper mapper(&ts); mapper.add(o); mapper.add(a); mapper.commit(); Node onode = mapper.getNodeForObject(o); QVERIFY(onode != Node()); Node anode = mapper.getNodeForObject(a); QVERIFY(anode != Node()); Triples t = ts.match(Triple(anode, Node(), Node())); QCOMPARE(t.size(), 2); // type and parent Transaction *tx = ts.startTransaction(); // remove all properties of the parent of a tx->remove(Triple(onode, Node(), Node())); tx->commit(); delete tx; mapper.commit(); t = ts.match(Triple(anode, Node(), Node())); QCOMPARE(t.size(), 0); // a should have been removed } void loaderPropertyOfParent() { // Another very specific one involving cycles -- an object // that is referred to as a property of its own parent. On // loading through the child with follow-parent set, we should // find that the object has the correct parent and that the // parent refers to the correct object in its property (and // not that the loader has instantiated the child without a // parent in order to fill the parent's property in a // recursive call while instantiating the parent for the // child) Node child(store.getUniqueUri(":child_")); Node parent(store.getUniqueUri(":parent_")); store.add(Triple(child, Uri("a"), store.expand("type:A"))); store.add(Triple(child, store.expand("rel:parent"), parent)); store.add(Triple(parent, Uri("a"), store.expand("type:B"))); store.add(Triple(parent, store.expand("property:aref"), child)); store.save("test-pp.ttl"); ObjectLoader loader(&store); loader.setFollowPolicy(ObjectLoader::FollowObjectProperties | ObjectLoader::FollowParent); ObjectLoader::NodeObjectMap testMap; loader.reload(Nodes() << child, testMap); QCOMPARE(testMap.size(), 2); QVERIFY(testMap.contains(parent)); QVERIFY(testMap.contains(child)); QVERIFY(testMap.value(parent)); QVERIFY(testMap.value(child)); A *testChild = qobject_cast(testMap.value(child).data()); B *testParent = qobject_cast(testMap.value(parent).data()); QVERIFY(testChild); QVERIFY(testParent); QCOMPARE(testChild->parent(), testParent); QCOMPARE(testParent->children().size(), 1); QCOMPARE(testParent->children()[0], testChild); QCOMPARE(testParent->getA(), testChild); } private: BasicStore store; ObjectStorer storer; }; } #endif sonic-visualiser-3.0.3/dataquay/tests/TestObjects.h0000644000000000000000000001125313111512442020513 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_OBJECTS_H_ #define _TEST_OBJECTS_H_ #include #include #include #include class A : public QObject { Q_OBJECT Q_PROPERTY(QObject *ref READ getRef WRITE setRef STORED true) public: A(QObject *parent = 0) : QObject(parent), m_ref(0) { } QObject *getRef() const { return m_ref; } void setRef(QObject *r) { m_ref = r; } private: QObject *m_ref; }; Q_DECLARE_METATYPE(A*) class B : public QObject { Q_OBJECT Q_PROPERTY(A *aref READ getA WRITE setA STORED true) public: B(QObject *parent = 0) : QObject(parent), m_a(0) { } A *getA() const { return m_a; } void setA(A *r) { m_a = qobject_cast(r); } private: A *m_a; }; Q_DECLARE_METATYPE(B*) class C : public QObject { Q_OBJECT Q_PROPERTY(QString string READ getString WRITE setString NOTIFY stringChanged STORED true) Q_PROPERTY(QStringList strings READ getStrings WRITE setStrings NOTIFY stringsChanged STORED true) Q_PROPERTY(QList floats READ getFloats WRITE setFloats STORED true) Q_PROPERTY(QList bees READ getBees WRITE setBees STORED true) Q_PROPERTY(QSet cees READ getCees WRITE setCees STORED true) Q_PROPERTY(QObjectList objects READ getObjects WRITE setObjects STORED true) public: C(QObject *parent = 0) : QObject(parent) { } QString getString() const { return m_string; } void setString(QString s) { m_string = s; emit stringChanged(s); } QStringList getStrings() const { return m_strings; } void setStrings(QStringList sl) { m_strings = sl; emit stringsChanged(sl); } QList getFloats() const { return m_floats; } void setFloats(QList fl) { m_floats = fl; } QList getBees() const { return m_bees; } void setBees(QList bl) { m_bees = bl; } QSet getCees() const { return m_cees; } void setCees(QSet cl) { m_cees = cl; } QObjectList getObjects() const { return m_objects; } void setObjects(QObjectList ol) { m_objects = ol; } signals: void stringChanged(QString s); void stringsChanged(QStringList sl); private: QString m_string; QStringList m_strings; QList m_floats; QList m_bees; QSet m_cees; QObjectList m_objects; }; Q_DECLARE_METATYPE(C*) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QObjectList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QSet) /* StreamableValueType is a type that can be streamed to QDataStream * and thus converted automatically to QVariant, but that will not be * registered with a Node encoder -- so Node must use an "unknown * type" datatype */ enum StreamableValueType { ValueA = 0, ValueB, ValueC, ValueD, ValueE }; /* NonStreamableValueType is a type that cannot be streamed to * QDataStream, but that we will register with a Node encoder -- so * Node can give it the proper datatype */ enum NonStreamableValueType { ValueF = 0, ValueG, ValueH, ValueI, ValueJ }; extern QDataStream &operator<<(QDataStream &out, StreamableValueType v); extern QDataStream &operator>>(QDataStream &in, StreamableValueType &v); Q_DECLARE_METATYPE(StreamableValueType) Q_DECLARE_METATYPE(NonStreamableValueType) #endif sonic-visualiser-3.0.3/dataquay/tests/TestQtWidgets.cpp0000644000000000000000000001463713111512442021401 0ustar 00000000000000 #include "dataquay/BasicStore.h" #include "dataquay/PropertyObject.h" #include "dataquay/TransactionalStore.h" #include "dataquay/Connection.h" #include "dataquay/RDFException.h" #include "dataquay/objectmapper/ObjectStorer.h" #include "dataquay/objectmapper/ObjectLoader.h" #include "dataquay/objectmapper/ObjectBuilder.h" #include "dataquay/objectmapper/TypeMapping.h" #include "../src/Debug.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::cerr; using std::endl; #include #include #include namespace Dataquay { namespace Test { static Uri qtypePrefix("http://breakfastquay.com/rdf/dataquay/qtype/"); static Uri dqPrefix("http://breakfastquay.com/rdf/dataquay/common/"); //??? struct LayoutLoader : public ObjectLoader::LoadCallback { void loaded(ObjectLoader *m, ObjectLoader::NodeObjectMap &map, Node node, QObject *o) { cerr << "LayoutLoader::loaded: uri " << node.value.toStdString() << ", object type " << o->metaObject()->className() << endl; Store *s = m->getStore(); PropertyObject pod(s, dqPrefix.toString(), node); //!!! was cacheing, but that doesn't support this interface yet QObject *parent = o->parent(); if (dynamic_cast(parent) && dynamic_cast(o)) { dynamic_cast(parent)->menuBar()->addMenu (dynamic_cast(o)); } if (dynamic_cast(parent) && dynamic_cast(o)) { dynamic_cast(parent)->addAction (dynamic_cast(o)); } QObject *layout = 0; QObject *layoutOf = 0; QObject *centralOf = 0; if (pod.hasProperty("layout")) { layout = map.value(Uri(pod.getProperty("layout").value())); std::cerr << "have layout property: in map is " << layout << std::endl; } if (pod.hasProperty("layout_of")) { layoutOf = map.value(Uri(pod.getProperty("layout_of").value())); std::cerr << "have layout_of property: in map is " << layoutOf << std::endl; } if (pod.hasProperty("central_widget_of")) { centralOf = map.value(Uri(pod.getProperty("central_widget_of").value())); std::cerr << "have central_widget_of property: in map is " << centralOf << std::endl; } if (centralOf) { QMainWindow *m = dynamic_cast(centralOf); QWidget *w = dynamic_cast(o); if (m && w) { m->setCentralWidget(w); std::cerr << "added central widget" << std::endl; } } if (layoutOf) { QWidget *w = dynamic_cast(layoutOf); QLayout *l = dynamic_cast(o); if (w && l) { w->setLayout(l); std::cerr << "added layout to widget" << std::endl; } } if (layout) { QLayout *cl = dynamic_cast(layout); if (cl) { QWidget *w = dynamic_cast(o); if (w) cl->addWidget(w); std::cerr << "added widget to layout" << std::endl; } } } }; struct LayoutStorer : public ObjectStorer::StoreCallback { void stored(ObjectStorer *m, ObjectStorer::ObjectNodeMap &map, QObject *o, Node node) { std::cerr << "LayoutStorer: stored: " << node << std::endl; PropertyObject pod(m->getStore(), dqPrefix.toString(), node); //!!! not right -- these calls back to store() cause an //!!! infinite loop -- we really need to store only if not //!!! stored already, or modify ObjectStorer so as to call //!!! callbacks only after all objects have been stored (as //!!! ObjectLoader does already) QLayout *layout = dynamic_cast(o); if (layout) { pod.setProperty(0, "layout_of", m->store(o->parent(), map)); } QWidget *widget = dynamic_cast(o); if (widget) { if (widget->layout()) { pod.setProperty(0, "layout", m->store(widget->layout(), map)); } } } }; extern int testQtWidgets(int argc, char **argv) { QApplication app(argc, argv); QString infile = "file:test-qt-widgets.ttl"; if (argc > 1) { infile = QString("file:%1").arg(argv[1]); } BasicStore store; store.import(infile, BasicStore::ImportIgnoreDuplicates); ObjectBuilder *b = ObjectBuilder::getInstance(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); TypeMapping mapping; mapping.setObjectTypePrefix(qtypePrefix); mapping.setPropertyPrefix(qtypePrefix); mapping.setRelationshipPrefix(dqPrefix); ObjectLoader oloader(&store); oloader.setTypeMapping(mapping); LayoutLoader loader; oloader.addLoadCallback(&loader, ObjectLoader::FinalCallback); std::cerr << "about to load all objects..." << std::endl; QObjectList objects = oloader.loadAll(); QMainWindow *mw = 0; if (!mw) { foreach (QObject *o, objects) { std::cerr << "child: " << o->metaObject()->className() << std::endl; QMainWindow *hmw = qobject_cast(o); if (hmw) { mw = hmw; std::cerr << "showing main window (it is " << hmw << ", object name \"" << hmw->objectName().toStdString() << "\")" << std::endl; } } } if (mw) mw->show(); else { std::cerr << "no main window! nothing will appear to happen!" << std::endl; } BasicStore store2; store2.setBaseUri(store.getBaseUri()); store2.addPrefix("dq", dqPrefix); store2.addPrefix("qtype", qtypePrefix); ObjectStorer ostorer(&store2); ostorer.setTypeMapping(mapping); ostorer.setPropertyStorePolicy(ObjectStorer::StoreIfChanged); LayoutStorer storer; ostorer.addStoreCallback(&storer); ostorer.setFollowPolicy(ObjectStorer::FollowObjectProperties | ObjectStorer::FollowSiblings | ObjectStorer::FollowParent | ObjectStorer::FollowChildren); std::cerr << "about to store all objects..." << std::endl; ostorer.store(objects); std::cerr << "about to save resulting store..." << std::endl; store2.save("test-qt-widgets-out.ttl"); return app.exec(); } } } int main(int argc, char **argv) { if (!Dataquay::Test::testQtWidgets(argc, argv)) return 1; std::cerr << "testQtWidgets successfully completed" << std::endl; return 0; } sonic-visualiser-3.0.3/dataquay/tests/TestTransactionalStore.h0000644000000000000000000002335413111512442022746 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_TRANSACTIONAL_STORE_H_ #define _TEST_TRANSACTIONAL_STORE_H_ #include #include #include #include #include #include #include namespace Dataquay { class TestTransactionalStore : public QObject { Q_OBJECT private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); ts = new TransactionalStore(&store); } void init() { store.clear(); } void simpleAdds() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // pause to test transactional isolation Triples triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); // do it again, just to check internal state isn't being bungled triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); // and check that reads *through* the transaction return the // partial state as expected triples = t->match(Triple()); QCOMPARE(triples.size(), added); t->commit(); triples = ts->match(Triple()); QCOMPARE(triples.size(), added); // this is the bogus value we added and then removed in addThings QVERIFY(!ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(43))))); // this is the value we actually retained QVERIFY(ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); delete t; } void simpleRollback() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); t->rollback(); delete t; Triples triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); } void autoRollback() { // automatic rollback triggered by an exception in e.g. add Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // Add incomplete statement to provoke an exception try { t->add(Triple(Node(), Uri("http://xmlns.com/foaf/0.1/name"), Node("this_statement_is_incomplete"))); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } // Now everything should fail on this tx try { t->add(Triple(store.expand(":fred2"), store.expand(":is_sadly_deluded"), Node::fromVariant(true))); QVERIFY2(0, "add succeeded after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } try { (void)t->match(Triple()); QVERIFY2(0, "match succeeded after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } // including commit try { t->commit(); QVERIFY2(0, "commit succeeded after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } // and rollback! try { t->rollback(); QVERIFY2(0, "rollback succeed after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } delete t; } void emptyTx() { Transaction *t = ts->startTransaction(); t->commit(); delete t; t = ts->startTransaction(); t->rollback(); delete t; } void mustCommitOrRollback() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // Logic has changed here -- we no longer throw from the // dtor. Instead it just recovers, but a warning message is // printed. delete t; // and check that this doesn't prevent any further // transactions from happening t = ts->startTransaction(); t->rollback(); delete t; } void noConcurrentTxInThread() { Transaction *t = ts->startTransaction(); try { Transaction *tt = ts->startTransaction(); QVERIFY(0); tt->rollback(); } catch (RDFException) { QVERIFY(1); } t->rollback(); delete t; } void consecutiveTxInThread() { Transaction *t = ts->startTransaction(); t->commit(); delete t; Transaction *tt = ts->startTransaction(); tt->commit(); delete tt; } void cannotUseFinishedTx() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // Test that we can't use the transaction after a rollback t->rollback(); try { QVERIFY(!t->add(Triple(store.expand(":fred2"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":samuel")))); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } delete t; t = ts->startTransaction(); QVERIFY(addThings(t, added)); //... or a commit t->commit(); try { Triples triples = t->match(Triple()); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } // and that we can't commit or rollback twice delete t; t = ts->startTransaction(); t->commit(); try { t->commit(); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } delete t; t = ts->startTransaction(); t->rollback(); try { t->rollback(); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } delete t; } void changesets() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); ChangeSet changes = t->getChanges(); QVERIFY(!changes.empty()); ChangeSet cchanges = t->getCommittedChanges(); QVERIFY(cchanges.empty()); t->commit(); cchanges = t->getCommittedChanges(); QCOMPARE(cchanges, changes); t = ts->startTransaction(); t->revert(changes); t->commit(); delete t; Triples triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); t = ts->startTransaction(); t->change(changes); t->commit(); delete t; triples = ts->match(Triple()); QCOMPARE(triples.size(), added); // this is the bogus value we added and then removed in addThings QVERIFY(!ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(43))))); // this is the value we actually retained QVERIFY(ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); } void simpleConnection() { Connection *c = new Connection(ts); int added = 0; QVERIFY(addThings(c, added)); // query on connection Triples triples = c->match(Triple()); QCOMPARE(triples.size(), added); // query on store triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); // query on a different connection { Connection c2(ts); triples = c2.match(Triple()); QCOMPARE(triples.size(), 0); } c->commit(); triples = c->match(Triple()); QCOMPARE(triples.size(), added); triples = ts->match(Triple()); QCOMPARE(triples.size(), added); c->add(Triple(store.expand(":fred"), store.expand(":likes_to_think_his_age_is"), Node::fromVariant(QVariant(21.9)))); ++added; triples = c->match(Triple()); QCOMPARE(triples.size(), added); triples = ts->match(Triple()); QCOMPARE(triples.size(), added-1); c->commit(); triples = c->match(Triple()); QCOMPARE(triples.size(), added); triples = ts->match(Triple()); QCOMPARE(triples.size(), added); // test implicit commit on dtor for (int i = 0; i < triples.size(); ++i) { c->remove(triples[i]); } delete c; triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); } private: BasicStore store; TransactionalStore *ts; bool addThings(Store *t, int &added) { added = 0; // These add calls are things we've tested in testBasicStore already if (!t->add(Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))) return false; ++added; if (!t->add(Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":alice")))) return false; ++added; t->add(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(43)))); ++added; if (!t->remove(Triple(store.expand(":fred"), store.expand(":age"), Node()))) return false; --added; if (!t->add(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))) return false; ++added; return true; } }; } #endif sonic-visualiser-3.0.3/dataquay/tests/main.cpp0000644000000000000000000000467413111512442017552 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TestBasicStore.h" #include "TestDatatypes.h" #include "TestTransactionalStore.h" #include "TestImportOptions.h" #include "TestObjectMapper.h" #include int main(int argc, char *argv[]) { int good = 0, bad = 0; QCoreApplication app(argc, argv); Dataquay::TestBasicStore tbs; if (QTest::qExec(&tbs, argc, argv) == 0) ++good; else ++bad; Dataquay::TestDatatypes td; if (QTest::qExec(&td, argc, argv) == 0) ++good; else ++bad; Dataquay::TestTransactionalStore tts; if (QTest::qExec(&tts, argc, argv) == 0) ++good; else ++bad; Dataquay::TestImportOptions ti; if (QTest::qExec(&ti, argc, argv) == 0) ++good; else ++bad; Dataquay::TestObjectMapper tom; if (QTest::qExec(&tom, argc, argv) == 0) ++good; else ++bad; if (bad > 0) { std::cerr << "\n********* " << bad << " test suite(s) failed!\n" << std::endl; return 1; } else { std::cerr << "All tests passed" << std::endl; return 0; } } sonic-visualiser-3.0.3/dataquay/tests/test-qt-widgets.ttl0000644000000000000000000000212113111512442021675 0ustar 00000000000000@base . @prefix rdf: . @prefix : <> . @prefix qtype: . @prefix dq: . @prefix xsd: . :mainwindow qtype:objectName "My Main Window" ; a qtype:QMainWindow . :menu dq:parent :mainwindow ; a qtype:QMenu ; qtype:title "File" . :exit dq:parent :menu ; a qtype:QAction ; qtype:text "Exit" . :exit_connection a dq:Connection ; dq:source [ dq:object :exit ; dq:signal "triggered" ] ; dq:target [ dq:object :mainwindow ; dq:slot "close" ] . :frame dq:parent :mainwindow ; dq:central_widget_of :mainwindow ; a qtype:QFrame . :vbox dq:parent :frame ; dq:layout_of :frame ; a qtype:QVBoxLayout . :label_1 a qtype:QLabel ; dq:parent :frame ; dq:follows :label_2 ; dq:layout :vbox ; qtype:text "Hello! I am the first label (but I go second)." . :label_2 a qtype:QLabel ; dq:parent :frame ; dq:layout :vbox ; qtype:text "Hello! I am the second label (but I go first)." . sonic-visualiser-3.0.3/dataquay/tests/test-qt.pro0000644000000000000000000000057213111512442020236 0ustar 00000000000000 TEMPLATE = app CONFIG += debug TARGET = test-qt-widgets INCLUDEPATH += . .. DEPENDPATH += . .. LIBPATH += .. PRE_TARGETDEPS += ../libdataquay.a OBJECTS_DIR = o MOC_DIR = o LIBS += ../libdataquay.a SOURCES += TestQtWidgets.cpp exists(./platform.pri) { include(./platform.pri) } !exists(./platform.pri) { exists(../platform.pri) { include(../platform.pri) } } sonic-visualiser-3.0.3/dataquay/tests/tests.pro0000644000000000000000000000165313111512442020000 0ustar 00000000000000 TEMPLATE = app CONFIG += debug console QT += testlib QT -= gui TARGET = test-dataquay win*: TARGET = "TestDataquay" exists(../config.pri) { include(../config.pri) } !defined(DESTDIR) { DESTDIR = ./ } INCLUDEPATH += . .. DEPENDPATH += . .. QMAKE_LIBDIR += .. OBJECTS_DIR = o MOC_DIR = o !win32: LIBS += -Wl,-rpath,.. LIBS += -L.. -ldataquay $${EXTRALIBS} HEADERS += TestBasicStore.h TestDatatypes.h TestTransactionalStore.h TestImportOptions.h TestObjectMapper.h SOURCES += TestDatatypes.cpp main.cpp exists(../../platform-dataquay.pri) { include(../../platform-dataquay.pri) } exists(./platform.pri) { include(./platform.pri) } !exists(./platform.pri) { exists(../platform.pri) { include(../platform.pri) } } !win32 { !macx* { QMAKE_POST_LINK=$${DESTDIR}/$${TARGET} } macx* { QMAKE_POST_LINK=./$${TARGET}.app/Contents/MacOS/$${TARGET} } } win32:QMAKE_POST_LINK=$${TARGET}.exe sonic-visualiser-3.0.3/icons/scalable/COPYING0000644000000000000000000003543313111512442017060 0ustar 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 sonic-visualiser-3.0.3/icons/scalable/README0000644000000000000000000000023013111512442016670 0ustar 00000000000000 Scalable SVG icons for use in Sonic Visualiser (http://sonicvisualiser.org). Drawn by Chris Cannam and provided under the GPL, see the file COPYING. sonic-visualiser-3.0.3/icons/scalable/align.svg0000644000000000000000000000731113111512442017632 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/colour3d.svg0000644000000000000000000001541313111512442020274 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/cross.svg0000644000000000000000000000533113111512442017671 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/datadelete.svg0000644000000000000000000000654013111512442020637 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/dataedit.svg0000644000000000000000000001464013111512442020322 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/draw.svg0000644000000000000000000001225213111512442017475 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/editcopy.svg0000644000000000000000000001143213111512442020357 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/editcut.svg0000644000000000000000000001116713111512442020205 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/editdelete.svg0000644000000000000000000001023513111512442020647 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/editpaste.svg0000644000000000000000000001173513111512442020527 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/erase.svg0000644000000000000000000001707113111512442017643 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/exit.svg0000644000000000000000000000633413111512442017515 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/faders.svg0000644000000000000000000001072013111512442020002 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/ffwd-end.svg0000644000000000000000000000522113111512442020230 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/ffwd.svg0000644000000000000000000000506413111512442017471 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/filenew.svg0000644000000000000000000000655713111512442020204 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/fileopen.svg0000644000000000000000000001076013111512442020343 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/filesave.svg0000644000000000000000000001031613111512442020335 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/filesaveas.svg0000644000000000000000000001464213111512442020667 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/filesavesv.svg0000644000000000000000000001226213111512442020710 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/help.svg0000644000000000000000000000722013111512442017467 0ustar 00000000000000 image/svg+xml ? sonic-visualiser-3.0.3/icons/scalable/instants.svg0000644000000000000000000000752313111512442020410 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/measure.svg0000644000000000000000000001120313111512442020174 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/move.svg0000644000000000000000000002446613111512442017520 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/navigate.svg0000644000000000000000000001326613111512442020344 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/normalise-columns.svg0000644000000000000000000001254713111512442022216 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/normalise.svg0000644000000000000000000001135213111512442020531 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/notes.svg0000644000000000000000000001330213111512442017665 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/pane.svg0000644000000000000000000000620713111512442017466 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/pause.svg0000644000000000000000000000461513111512442017661 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/play.svg0000644000000000000000000000463013111512442017506 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/playfollow.svg0000644000000000000000000000560113111512442020730 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/playloop.svg0000644000000000000000000000644613111512442020407 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/playpause.svg0000644000000000000000000000544413111512442020550 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/playselection.svg0000644000000000000000000000560313111512442021415 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/record.svg0000644000000000000000000001073013111512442020015 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/redo.svg0000644000000000000000000000517113111512442017473 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/regions.svg0000644000000000000000000001022313111512442020202 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/rewind-start.svg0000644000000000000000000000526513111512442021171 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/rewind.svg0000644000000000000000000000507013111512442020030 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/select.svg0000644000000000000000000000665313111512442020027 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/solo.svg0000644000000000000000000000613713111512442017521 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/speaker.svg0000644000000000000000000002615213111512442020176 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/spectrogram.svg0000644000000000000000000001142213111512442021064 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/spectrum.svg0000644000000000000000000000646413111512442020412 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/sv-128x128.png0000644000000000000000000000702613111512442020113 0ustar 00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsA›A›œU:ÏtEXtSoftwarewww.inkscape.org›î< “IDATxœík¬eÇOÏiO½Ðž{z¡ÔHKSÊE.¦5ˆEn1&¶&€šh”ÿ¨ÄDIŒ&Ä^B0Aý Ñ BVM$⥥Tè…Þ€–Þ8…öœÇ;Ûngçyç}çìÎΞ™r²ÛyŸywºóŸÿsy/+›Ö T(-Æuú*tJŽŠ%GE€’£"@ÉQ ä¨PrT(9z=ížÖ·ñ:*´«€«ÒŒ| °~é#z×h®¦B¾Ø¼V (9*”¾. ð‘Ï7ýÀ ªêÏ:ymEƘ €ˆL~ &4_ "©ê¾œ/«+0V\À­$ß|€)Àí9^KWa¬àË)íËr¹Š.D×@DƧ˜-ÎãZº]Oà|jÁž çED©ÃXÓž~€‰Àà¡‹È 5fG¯ƒÀßTõžÐþІ²2ø%pcÂñ5QvñN†> ƒ± ‹yÚYY‚ ™ \k4÷„öY4Œø*@0€ë¨¹ s3ôY(t5Dd0ÓÓ|v†øtJû¼ } ]Müå²)À%)ís2ôY(t;Î ° R`aŠY¥ÆüÛP0‡Z çBE€ãœÛP°Èæ"@‡¢"Ò`®‡Í`·W»úâ #À¬[è%[pYt-D¤8+ð´8ÀG ËÝ@×€ð§Âà£P c ë©ÜU PpdQ/-"3€3=ûìêrpGGEäóÀ jãù“¢ëù¢ª¾çqº¥ûH~2}ËÆ¾O?Æçt :F™ Ü LŽ5Ý |Ë£ Kv|ý?Æçt :é¾Aó͸CD|‚5K¶Ö}¥1t„"2øºÑÜß,^K¶3z„(@P "}"r‘ˆÜ&"w‹Èã"²:¤V¢S.àk¸ƒ,ç(\T}³ž¼mÀt£­ Ð'"3}f‰Èg‡€žXÓjY®ª¯|nKÐ)pKJ{Ú4îÙÀx£Í¥3Rú­#DÀß |Ÿæ›µÿË'?³%È‘¿0Åì™âhw¥€®`¼ˆ8Ó»hXHÉ< "‹pOO¿:ð3[‚N(Àu6‚[\E —@º}úÁOV¦´_‘ásGNàSžvu´Y  Ôð¶ãÜ4„øÿ:ZA€AqÍ?l r%@¼ùú:—¿¶`Ÿª~ÀèÀ"€»Œ6ŸLàÊ”v![y{TÈ[.¨ªGTu„ðbÐB’€,ää¥w|Ö£Žó’VªÃ"@öp±¥;Þ‡¦‚¾þ¿Žö£B^°ä_ß9ÎKŠF«`»ë&î4Þûœ[;xø¯ã¼Ón”ˆŒÇžÛW€,B> ð–ac d3¸ÁZ޶ ºi—Í{Rça_³¯ Hê·^²Èå£Ñj¥8B`y ý¨‡\Œ½Ìzc`ÙÖ7„p0;-ö‰ 9 %ÀbƒHmAp¥¢Wߢoà0lØ&À•Çû(@SQ h©Ê&ãx9ª@°üÿU­oÛæ;‡ÏR€ÄÒ3UU`²y"ÒjIï㈓h.µÜ> ¿wôã»ñÕ¨ÑIØÐðÞºQñ¹–¼¥ªIO{H1(­ XÇn`İ‹÷á"Õ³ÀQ£-mo¢–Á«|ïf¾w¯Èw£jìãxý5q|ÑT¶l^+‹¦OàÄ›m&ö0»n0©—%Gêpý=¼Óh×püý¡ZLÏ‚¸ý¬~–ïj¶‡ÿµ†y›×ÖäMk`ùoØ?¬Í$:k"Ëû]>Àåÿ4¨}ûzî-CÃÍ]õ 7Íê—F G•^……^UÆiìµc½#Jßñ‡•ùùJ^ü„Çòš±‰½Ž ?¸Œ;©-ãúùðàëÍ63'²”ZªÀŒ‰pôH³Ýµs¹´Ñ®ŽƒðLBÒ¶p*WÇí/šëÄ}áT¦ÄmOƒÍšm— p SÞ¯™ ¾º„uï}omn;¡ î;ÆmÉgúab_ðÙ‘uý=µ/±Ž©Æ\™ƒ ªp|v‚9/iĘfls a¨eOÂÓ0+aêYFŒWÝï'ÛM¸â#Éíy¢#X6z>yª±Äãðq‰É›‡O½c‘1cºA¬÷°×¸Yƒ 7;‰ÐL¢$—ÒØç5s’ûÏ!ÀűØþLÇl¹ÃÇk¯[Ù6& 8t†È4¬ðö±dÛÁج¦Tuì1HU'Pï8¸5´NØbtdmà¬~ž !²>z‚s0Ö l?¯— pèÅÝ\ |,Þ. ó&ñ+rþ£'8cÅÍ®£Üöd†Þ8ĤaMö¹'FxøOìØyÀ5q[¶äÁÅÓ9]ûH(‚©²™( ºi>ÙÊ;ŽÒR‡pB9€; @6­iŠæ›ðÜ.Öݱ‘u篮6¡Väè~ªª'«"²xÑøøËTõ%yX›Ð¾EU¹xÂèw©ª¾Ù] üŰ[­ªOÇú];‚® µ¹úV¨èZS?Z8¨ªM•UÂ^|2/öš—‚äŠB@UFÎî_æ0 ºyÖK¸žTKê#‚–¨ãÜÜQD°â€éÀ£M‰Eè ð°n–ëIM›d‘j¯ª&¾;ƒ"ÀrÓ±`»ªZ*uøÀg*˜o[}ÀÊgvQÇQ¤_ ³0€= ì ëp 0­K®›Ÿ€RÇ9ƒln%wI,0ÛøÀÊê 0ˆ=mÛ¥ÖRq¡´fq+¹£H°àBì_µ=]³µím¬Ì+0`¥UÓŒãàNëH#@Öt-aû$V9Ú*È"£Q€)Ñœ½L  ª‡©-K‚kǯŠB¿˜]ã ¤ƒ‚Š@1XnÀµÑT%€ï®šiM°æŠ’àZ[Øt3þíi—U|®Ç$a·ªZ«‹;‚"`µ!M_¼ìi—6 ”§ÊÿC²ô: ÿð´sí6 {á†ÏͪÐbø~AàD»m6š—‘­TG¨ ¨ß/hs´¦ÐVàúñéÔk‰²„=×J˜¶£[ à+ÿuXpmHí›®…¸×lsA·àïýZpmÎÜ„Æ mGÑ`MÌŒãýº2$Œ*}>ð•õ!ª /ãž µYÀ¡ORêϹÄR­ó½–­ÑŠåB¡PˆRAkºuÈÐu(BžT_ÎÿCÁá™”ö<¢¾. pþŠI€?9Ú¶Ïgè³m MIÛíaZ)€"ÿþTBÓð™Àü¿Žv*ø=Ý•øBU¯n67¾]U}ëÿq…T€"M = ªú¸ˆ< | ˜¯ªŒ¢»Ð404]KØæá4RUkòHGQXDûþü¢]í§6ï«x¡ ð4ðCG{áJÀuÒ´QzéZ~Öˆ"P½ÿ—pÏOȸæ‚R ‚ouÊÖ}޶ßfì³í¨ÐŒLåZU½‡Ú æo9µ•ÜSªº1KŸy "@32OÚTÕ-ªú#U]Im¢É Ñ_aQè °Åð%@KòuUÝ<ÙŠ¾Ú‰2)€o*XÈ|½](rU€nAE€Ó1Bsöv LØça³=ÏŸl+ÊDŸ'»Tòå"À›Ø? QG©@(¢adkW:*ãHsRÚÇÊF×þ.þë Ç ÊFרܳѨa©P6<X›><›ç…¥"@´Å«õSµës¼” LƒAuÜŒ§æóFïªjÚŽ£c¥#€ª¾¼Ðéë( Jå*4£"@Éáõ“1ÔÒ§õm¾– ­Å*àª4#ßà*ŸÎ*t*PrT(9*”JŽŠ%GE€’£"@ÉQ äø?O4lãÏ °—IEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-16x16.png0000644000000000000000000000100513111512442017732 0ustar 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs33¡HtEXtSoftwarewww.inkscape.org›î<‚IDAT8¥ÓÁj@àoÓ„j¤¡…Z%Vb«¶ =Ô>€‚xP%PßA<ûzñ*¾@ôô¨'D£ÒjÐj•”€Û¤ëe+1m5âÀ°³Ìüÿü3ˆjYô–Mç<ºwk&N°<ºËúØiTTËbµl&ƨÛñ³©ÉÕÞ|µl¦Z3ÛQ‡ޤ.Gq3„0ð§6û0‰ÄA4S]1„ÑŒ1671½ .á:¦PÅhRð%ÜÁåà%ÐÃDãD0™üw‚Û¯]{5V 9'6ÈóÎ.Xxºjv c­˜÷¦YøbO6ã¹Rh±ûÊT¡Õ6ô£cø|ɽ¡œFý«¹‹×7 ·:öžS[ùæØÈ úܘ–ñïØòŒ¸zŠŸ$ߟöp«Ÿg\ij®%·ñ y¼ï-î]"ÜÇÛ¯a%ÆC˨ý• Ƹ„¥tmàCŠçñ¢Ýö/ñãí Bú[>S6ʦ‚Ê?‚ÙOîÞš£‰WŒIEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-22x22.png0000644000000000000000000000126413111512442017733 0ustar 00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs G GIRN©tEXtSoftwarewww.inkscape.org›î<1IDAT8µ•MkSQ†Ÿ7^kJ´IM?ÔÔØ66ÅDð ± ©;‚HJ]Á wú Ä+@vŠK×"(Wn$õ+Z«5XK IÓ䎋œ`ToK:pæ<óž3çÞQ.ƒ±æ9ÿ˜ns H5ÀÓÚåVY’N§ÌìnêÌ„²@* ÷,p³©Ð”¤óÿÛœú%E]|¸Òð¨ó{’ëKº'é¤ Ó@‘ºê> «–””4,ip“”:@Ü©]º%m.÷%E‚(w~˜ú5ÌŸ`x œê”ËÝ|øæ ià wàà‹+–ݞѿ!À\#Wûõ(~x§÷wó|v‰CÃ] â±{±B,þæ+?Êø‡ãL>Yà`Äc6$îŒ'4¹âãÝ>F4vŠ«FÇrx©Fï¾3ç’¼-׈åË ŽDYìí¤Z©±½X¥/¡Ô¦ðs™R•î©Ç:(~/1T¨°³fîkÎe°\†¬™ÑX@ð]£ŽÀSêM¼Üž Ô¼7—!›Ë`­-Øä¨?±·æà80of~+@K°™-K*ŸÌ¬,)ì¢ì[\[ÚjŠ8åÄ€ê/¦ñšÞ­lfךÂF3ó%}–€WëQÜ\¤â®æ£‹}I=°úvöxÙT¬ú¯äµ€/¿‚&Ëͼ M)þüPÚb¿µïµ‹Šå¼¯IEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-24x24.png0000644000000000000000000000136113111512442017735 0ustar 00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs M MÒέNtEXtSoftwarewww.inkscape.org›î<nIDATH‰µ–ÏKTQÇ?GgÆtÆrÔiL_f?P¡¢éQPË iݺ}´iQÿA« !ZB®¤° JÁ+ÉÒmÒÌùáiñŽø°gFôÂãÜçžÏýžûî}Oq”=,>³ËÀØ.ÇîB€±Þgz¾˜§ˆœüªú®Üèc·eèó•ôtËC ¸b@hPÕÑRËœxÚ€«@{©‰U¥D¤ èÚD$hÝ=@«ˆv‘€ˆ„¬é5V?ê±Ävîß­~XVfiÂ6Öa z!"w*\êE$b€ 4ã¦K¯@‡ˆt7€‹…ý·É–×KÖìòüÈsÖçæ{¸\ýNz“¦  ÷ÍIÓ¸)Út‹ˆTÎÐv6"C-µÄD˜Vž0·ÞüäÜÍN’oçý\ö ¹Ô_|N=ÑÉ_sB´N¥™š_Å9ÝÌËYˬãz`MµòŠ-O i™ƇgéYZÃYÉÑØ%ó9Íz:K$«p¨Ž•#ûÉ.pðw–œSÏbw˜3ËÄVªÈW yU\5‰8šˆ3¢ªxà‰¥bÕ”>aàî¦þ^÷·ÎOÄIÄÑíÚœåû£ªæØ|‹6öàP œ²ý(X¶»*æÍ¾7›"@Ô3@_ŠÙNÁx@;’¦jÖÆ> RTª‰ÈuàµuÍã^ëlžòi NU—*dÐÓL™µÕ\(€.œ?!¯‹°á=ªúçª-ªØ-æÅ²¥ÅUä¿ÿ5'úXEíÕIEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-48x48.png0000644000000000000000000000261313111512442017752 0ustar 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYsšš›2aptEXtSoftwarewww.inkscape.org›î<IDAThÕšßoEÇ?ßB@¡Ôò«Xi) #!©< ¡1`H°ÆÛÄ'#úbâ+ñE£ÑÄWõ0èƒÆH0D MDŒ ¶Ô R)XŠBÑr|¸3ìÜé½pïv/ä~“Íœsfvæ|÷œ=³w÷ª¿£ŠQs¯˜-ªžÀÜH?ôÝ GÊÀv`“Wb}ÚKwןò0Ыwd–B’6HúÖ]YÍ{'dy<lqÇ“Î{[Ä)4<ÈÛ ´—ÜEûÚ̾ÊbÑLHªºSK1mÀ«NýÈ„@V)´Xè’æEc:y}FëfF`MÛªHoäfµY#+3RhŠôu<™S!ëL¶•јöH/Dºl”E@R‡¤]’¶qæ—À¶,SåV¡}@pMÒ 3‹œùÍÉ‹ HZÈ̔ʻo$í6ƒföF©•L@ÒCÎy€:`'ðiäÌŸÀe"äç¿"ˆ€¤Zàmr•lZÒ{fv¥¿ÊI¡žH_ëð@Dò „é3àÚ0…&)Ãs˜™nEQ®Hotm¹ªÅ ´¹v8êä@k4w¬EIܦÔ™½ƒa.#à#tщÏkæŽõ¢(5À'»Ö;^ɳ$–vO`„ÀI>mZ£õb½(J%ð¨k§H~ðøòWòº™]æö8Gޤ‡'ß­ëEQ.ãq¼ý’kë%ù*×ìÚ0oÖ{°D¿ò ³XÒIÍ’î—Ô$© Øê†fæö¼c¾_äêjIvåsî°è\Oà´×}zIª•´HRƒ¤“Óù¥?ÀAö8GÝB¹£àµNžz±ƒç抦^h©cÀî5tôêÄ»ÛxÓÏ·o}ûwñ£_çõGx¹¿‡£ ó™èiã•CÝê<»Žº[މaIL×€aàâ©‘¼ßåíÄ[W²úȘ242ÁÆ £ÌØPO=P·ja®àú ÚÆ§’ó×.f5ÐÔ¼ˆ9W&àê$Qïû»[Xziœ›_œ§æ¦%óäAÔæ©á‹­_¯òñÓyŸ\øk\ë)3Û/i'pвØïä'\ÿr`ÈÙžjœ¾ÊÌ.JÚôßo¹þÀð¹‚1A.^î릻qÏ{Ÿó"°¾ž³fv  ó—¹+Oºv˜äqa°ÄÙ'bþ~i!ÉÿQ3ósßJýÊû¹šæqz(»\;æ2³iÀ?Ç,')¡çÍÌGÛW¬•À'‡Õ©d¤!F`³kO™ÙÍÀVª°„zxgl‹le¡lfvƒä ÏqíÉhXH ÜÄ<ÂÍì®Gò£ðC¤—î`»#ÒŠôÃ‘î ¬&ÀÌF€ÿ¢sΤq$ ãÀF¸UÏÏEcâ+~šHKàx of“Q¿'n:ƒÑ˜³‘þ{GÒø¸àä#ú/°Å Œ˜Ù?iIõjÑÌú%µ“{z¨À˜@¸‰y„)”êêÃ,ÞšÙ(ðY‘î˜@¸‰y|ÈÇÒú‘åÛéq™ó3;&i-pðGÚ…*E Ž@¼Ñ`fgHY>=*õ‘ï*p=ЪÐ:•!àòýh`ú¹ë@e?³~CîeïÕHÀÌöšÙ\3[`fÿVjªÿЭè¿Uÿ¡{SØY ¨úªzÿ^$^K¿ÚP›IEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-64x64.png0000644000000000000000000000354013111512442017746 0ustar 00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYs Í ÍηͱtEXtSoftwarewww.inkscape.org›î<ÝIDATxœí›Kl”UÇgú¤R@(´<¬¥ƒ ‚ˆ" ‰aá‹F’]ƒ ãÎ÷&Ƙ•°0‘¨¢à[ÁG‘”GÊK¬åQ´S:ÇÅ÷ =ßûMg¦óÍ4Ö2™sϽ3÷|ÿïÜ{ÎwîŒüü Ê$FªÚTÿPmªZî°¯Ò†T+€éVá#`ßÒwuMEÌ©0~é’]À]Vç# ì‘UÀ<à*àcUí«Ä¼… qD¤Ø 4„ª7€ IÏ[(*± ®gôâÖT`΂Q nvÚí"2%n°ˆL‘º„mº‚J°Â3g»o ˆÔ‡´ˆ ŠÈSI—(á\âéšó‘U@K(7·'a—EÒpPïÑǰÒi/*¯9¹Hš€…1ú8®sÚ Êh‹IpmŒ¾Pæ$½!&M€w³#HŠ|p HOVYP-hu"R\ã›è27"Ò""ëDä*O·õ€£Fnq1öL\Dd;pØJ⺰ð½‘}¸îŸÅÄ$@Dnî7ß±ÒéoæÕwF"²\D>‘½"ò­ˆL-Üò(Æã;íù"2Ó´¯Ä´- "Òì|>Ž€ùÝ#À}¤ß <4¶¹~Œ‡ß¤F¶î?t;c]/° Ù·pÚK=c BIˆÈb ÓÓe/Ên€¿ä ѬïK#G‘r3ĸh3&Jõ€;bô³lúMU‡€ Fç`³ÆOî¼»ý1vÅ=wäE)X÷ÿ 8iÚY·žK´0–Ø <¾÷ÅôÇÝi_áeLŒ×ö oÙ‹²w#ÃèÝ,d ã|«ßÜüÈ)‹¿ÈÂÕò" JðBäÊ)ò•"ç’üòÏS„ÁM`Nw—´u4³¼7Ô¥àÌO2³»K˜×DúÄ¥@_#Ìíî’6€úépË›ÙÀ@w—´µ4rþì?®>Egw—´ýÜOæñxJ »þa-@JXµx†¦L¥ýà9ÞÌgóЇ]r–@¡?¸~:L­ƒ™¦âŸQ8? GMºÓn‚ÓÕfì¹t0àô¥Q}[SðÞj çÙþ¾ÁQ]­À= `Ñ´ ŽAŽL­ã|K#‡T¯d\ˆŽÊ4×ñ­ÀÖ ÃLÞÉ~þ“>ßÙÇ&‚‚(}ƒ¼!aÿáó´¯B@ôOý¬HgF?ß7ÈÇN 2x-ìgÿŸ¬«‡Û§jSœª6Ü»€ÅâÉ i:EN é”0œ‚áš }Ô#îõŠç"»‹9 C^Úy'ð>£§°¨ê{áØ9õƒ,S€Œ®YU/†»É­Öχíªzw¡v‚ÿptÜ!UU¢»»{}ÀÈýDWÙl¢;ü€ª^ ¿w0} ˆF€Þ’6(WMІÂ5FNœô ª—‰^T þ˜…› t˜voñfæ¢\Ø´uµ‘{TÕ]wn.à˳è5r'˜ëö!Ç-‚@~Ž9cy ÑrúQÊ€$<Àâ€Gço Ø­ÕDíí-Ô¸|HÂ,ö{tî#q¾%`=ÀFü4Ñg’‘´ìñèJ]¿«j&¦¯($IÀaU=íÑ[²y@®ü {¾£,ë’]¾»QÜÓãaØìõ|Gœgr°ŸÜ;µ×7(¶¸yNU/¸ƒñ_ìÄ" ÌÞ¾pÔ…x€…ëþYô¨+ å<~ßÈ»ñçP<ßTõ%àà +Ï.=^ÈGŠ·Ð²þPRUw-’úð08¥‰œ˜Åç*ٳĞð¥,¨ÈOe-TUE¤ŸhÊ 1>onfÛËiOÅ q–\bc»ªn¶%aHµþ/àÛ~¬¸T€SNû¤ªÆmމ¢Z¸a¬*wªG€Æ&vÕþ¢S•( ªŸ‰È&à°GUãr€ÄQ­0ˆª¾R­¹-&ýßæ|#“þosÓqNOþ˘ôKàªm@µñ/SÿÏçJŒU-IEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-icon-light.svg0000644000000000000000000004365413111512442021235 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/sv-icon.svg0000644000000000000000000004405213111512442020121 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/sv-splash.png0000644000000000000000000005011013111512442020440 0ustar 00000000000000‰PNG  IHDRHB m"TsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœìÝy|LWã?ðÏd—"""–XSÄRµV«(j«*Eµ¨¶T©¶j§OíUJéòèÃÓµ/ÕÅV{•û"±K$$A"²Íœßùe¾ÉäÎÌ™™;“Éø¼_/¯—Ì=÷Ü“Ifæ“sÎ=G@€ˆˆˆˆôÜŠºDDDDΆ‰ˆˆˆÈ‘$""""J–/_M›6ut[ˆˆˆˆêèÑ£HLL,ô¸b@jÚ´)¶lÙb÷F¥nݺaëÖ­…ç‘$"""" HDDDDˆˆˆˆ 0 `@""""2À€DDDDd€‰ˆˆˆÈ‘$"""" HDDDDˆˆˆˆ 0 `@""""2À€DDDDd€‰ˆˆˆÈ‘$"""" HDDDDˆˆˆˆ 0 ð(ê•ôèHd'\)êf9=wÿ@”lÔ©¨›AäP HôÄJÙµ÷ÿ^^ÔÍ rz%j4a@¢'‡Øˆˆˆˆ 0 `@""""2À€DDDDd€‰ˆˆˆÈ‘$"""" HDDDDˆˆˆˆ 0 `@""""2À€DDDDd€‰ˆˆˆÈ€GQ7€¨8ò®TžAaEÝ "iÚÔ{xó¿¢nQ±Á€Dd…€öï!°ËÇEÝ "iigváúÌŽEÝ ¢bƒClDDDDˆˆˆˆ pˆˆl’––†‰'bÏž=hÒ¤‰þ_£Fàëë[ÔÍ#"² YmïÞ½€Âd¹û÷ïcèСj‘zˆÈbþù'Ο?/Uöï¿ÿÆõë×íÜ"""u1 ‘Å6lØ ]VaQy""gÀ€DDÉÌÌÄæÍ›-:ç?þ°Skˆˆìƒ‰ˆ,²sçN‹ÏIKKCLLŒú!"²$"²ÈáÇ­:ïôéÓ*·DYbb"®]»†ŒŒ ‡\ˆ\IËÊʉ'¬:×ë!;w5BµjÕP¢D ”+Wõë×ǤI“ì~m"r-\I›ˆ¤:uÊêž™+W®¨Üš‚Ž9‚.]º 99YÿXRR’’’pîÜ9¸¹¹aæÌ™vm¹ö ‘´ÈÈH«Ïµg@Ú¿?Ú·o_ úüóÏñË/¿Ø­ DäZˆHÚ±cǬ>מi„ HKK3[néÒ¥vk¹$"’vîÜ9«Ï‹‹³Ë­þQQQÒ=[»ví2ÙËDD”‡‰ˆ¤hµZ\¼xÑêósrr˜˜¨b‹rmß¾]ºlvv6Ž?®zˆÈõ0 ‘”ØØX›oW©5ÿçСC•¿|ù²êm "×ÀDDRd7§5ÅéŸþ±¨üµk×To¹$"’bËü£çÞ½{ª¶ˆ\IqÆ€dÍö%–ö8Ñ“‰‰ˆÌÒjµªLnV; Y3ìwëÖ-UÛ@D®‰‰ˆÌºqã233m®Gí9HÖ¤ÄÄDdgg«Ú"r= HDdVLLŒ*õ¨Ùƒ”””dU}:Nõ FD®‡‰ˆÌRkí „„!T©Ë–»ênß¾­JˆÈu1 ‘Yj¤¬¬,Õ¶ú8{ö¬Õçr™Ã€DDf©5ĨwYTT”Õç2 ‘9 HDd–šÛs¨¢££­>—ClDd™¤ÕjqõêUÕêSk¢¶-¡=HDd™tíÚ5dee©VŸ=H™™™6…ö ‘9 HDd’šó€Ü;Ùl ­VkõùìA""sˆÈ$µ’=H¶Î‰Š‡N§³¹D予Ȥk×®©ZŸsl HYYYHLL´¹D予È$Ù€äæ&÷v¢F0Qã®:³‘) HDd’l@ª]»¶T¹{÷îÙК\j ûq¢6™Â€DD&ÉÞâß´iS©r÷îݳy»‘ØØX›Î؃DD¦1 ‘Q©©©HJJ’*Û¤I©rÙÙÙxøð¡ÕmÊÉÉQ¥÷‡=HDdŠGQ7€ˆl“ýû÷cóæÍHOOG»víЮ];”/_Þæº-™ -€Ü^¤Ò¥K[ѢܞŸœœ«Î5¬‡ˆÈ$¢blÏž=èÛ·o^ž~øï¼ó-Zë_æ²ÉÓÓ 6”®÷Þ½{¨Q£†]Ûd{ˆÈ±S›6mBç·À„øé§ŸÐ«W/›Öû‘ #•+W†ŸŸüýý¥ÊÛ2Q[­€Ä$"2…‰¨zøð!†Žììl“å6mÚ„uëÖY}Ù0(W®œTù»wïZÙ"$"r $¢bè³Ï>“"š2eŠÕsvìd'~+Q+ ¥§§#%%E•ºˆÈõ0 3<À?þ(]þòåËØ¸q£UײW@r†!6€½HDdQ1³jÕ*¤§§[tΖ-[¬º–«$NÔ&"cxQ1³víZ‹ÏÙ¹s't:ôv @î<§ääd©²Žšƒ”­j¯#z?~Œ¨¨(DEEA«Õ¢M›6¨R¥ŠÝ¯KD¶a@"*FîÝ»‡C‡Y|^bb"Ο?úõëKŸsãÆ é²ÕªU`ÿ¤[·nA«ÕZu®±úìE«ÕbÑ¢Eøì³Ï Íujݺ5Ö®]‹»]ŸˆlÃ!6¢bäÏ?ÿ´: œ8q¢ò7oÞ”*çáá¡ÿ ·÷$m5‡×û ±åää wïÞ1b„âDðýû÷£I“&ˆŒŒ´Ëõ‰Èv HDÅÈž={¬>×Ò€$Ûƒ wwwöbS; Ù«iܸqøí·ßL–‰‹‹C›6mpüøq»´ˆlÀDTŒìÛ·ÏêsOžM`` Ô9)))Võ„‡¤¨¨(üûßÿ–*›••…wÞyÇìzVDäx HDÅÄåË—qýúu«Ï?þ¼Eåe{W*Uª¤ÿPPÔ9:Nzx~²ÉÛÛ[ªœ=zÆŒcQà9sæŒEË6‘c0 ýõ—Mç'''[4÷GvRþ$Ù!6Àº‰Ú²IvãÜ””$¢bbïÞ½6×qùòeé²²Cl•+WÖÿ¿lÙ²Ðh4RçÙ3 µjÕJºN5‡Ù¬Y‚Èý¹ìܹSµv‘툊 [æ剉‰‘*'„~Ê<<< už¥);;[:Ì<ûì³Òk>©9̶fÍ«Ï]½zµjí "Û1 ÑÑÑHHH°¹Ù¤ÄÄDdffJ•Íû­…tóæMé‰ÝµjÕBùòå¥ÊªÕƒ…èèh«Ïÿý÷ߥŸs"²?$¢bàÀªÔ#;DeÉ"‘Ž H²m×h4 Chh¨TyµzlMMMµjP"²$¢b@­€$;ñZ¶œ¯¯o¡@TÔ)((¾¾¾î®3E­$5æˆíÞ½[…–‘ˆŠµ’lÏl@2ì=ìdÛž·/œ#{t:*sĈœ‘“»}û6®\¹¢J]·nÝ‚Âl9g H²mªZµ*8´éìÙ³V­ëdèøñãŠ[“‘ã1 9¹ýû÷«VWff¦ÔdoknñÏSÔ)¯M²I¤#GŽØ\»Áí?ÿü£J]Dd$"'gËþkJd‚†5‹Dæq–€$;Ä–˜˜ˆ¬¬,‹ÚbH­€ÿûßÿT«‹ˆ¬Ç€DääÔHñññfËç!6K{t:ÔsbŠš¡†‰È90 9±ØØXÕ7h57Ä–““ƒ;wîHÕeK@zøð¡tÏMrr²ô– –ö ¶ ³¥¦¦âÂ… VŸoèØ±cRóĈȾˆœ˜%½G² #&&&š</½ £R/=öc“í=þ/ ùùùI¯êmËDíãÇ«ºZrr2bccU«ˆ¬Ã€DäÄd÷çªX±"ž{î9©²æz, μ¼¼¬ÿÚ·úŸ:uJªœ···tgÏžµ¶9D¤$"'•••%^|ñEé$µ’¿¿?J•*Uèñ2eÊÀÃÃCªµRhhh=Øq'ÛéÓ§¥Ê5mÚT¿9çγº=D¤$"'µoß>¤¦¦J•mß¾}žSÌ ±É†cáC£Ñ 00PªÙ€dí²²É’!’oüÉÊÁñöÝäääHµ©Ô­H$ﺦx¬tÉxf>М߲uÒÍo{äÜü#Fƒ;‘HÞu¢Ð±¦O…áÐÙËfë8yò$JùA „Ô÷¡¤e0ðCk«N%z"1 #Þî@Ÿ¬½ˆÿa¯âq‘,WÏãÌ,\ùÏ0”È÷¥’Èïsx)âc—š,ãgúæ4½ë­E|‚òÖ*gM¾à¾u:â=•Uðd¾µ¨­Kk~ª£Qrmªè+ðpåHGDäx HDÅ„;0ø)Óe, Hct·%{|Ü4@°D@’mËÛ¬%J$sí©(îÈ$Éž¶š&’·;Ð]~z9Q1ñQPÁ̽¯Gî¯ ÀtK2 •󑻆l’aOV~ ’Å\–t’Äs À5É;ïk–6}üÍšò?/"r,$¢b a Ð_nmAéž›ûVö Uò“+WÚÊvä';ÄVA­€$Èn¤åÎ×’aª *—Þ¯#W9‘“ ðf5ËÚ’*/Ùs“l؃Tø.qE¡’I9HÒClfPEÉ6§çL´^sÓÕÍ$x;¨e¦§‰ˆ‰È‰ù‹Ÿª–”?G¶ÉphKvˆM¶I6 ™ $ ’I­!6À|/’ìíP¿Üycæx¸ß>+<‰È1x›?‘*áãƒî]:bÁ¬©(W6À¢s« ‰Cÿ0[N×äuÔþê ý×wÂH1{^“aóP»o/³å’º˜/—– „-ˆ†—WÁÛÐt:îþñó‹)6õjwhgôx-!à]ù)df™é é¿µ;ß $aÈàüV³õ4hõ"j/üÑl9¨ à`ütî3Q—̯DDöÇ€Dd…—_~å[)óòò‚ŸŸuÝ?Fƒ вeKøøøXUGùP¹[£’Ó2áxøð!’Ṙ#¨Ù ©þ@X½g̶©r•*ˆ‰1¿æíû&늊¹&Õ¦úOË=Oyª…áÇN`éÒ¥øæ›o+}.©‰È /¾ø"»|\ÔÍP$»[þ->®^½*]µjÕ¤ÊYºamHHÁ€$»õ ·õIÕªU¥Òõë×ËÎÎÆåËr= HD.JÍ€$;,¥ÄÒ$Ù!6k¿¿%JH‡«èèhîÁFô„b@"rQj$[†ŽìÕƒdË«§žzJªœ%=H HD®…‰ÈE·¤¤¤$!ì¶Šv~áááRåŽ?.½W]ݺu­n9$"¥V@òôô´©.Ù¤œœ-]¯µ·ù¹áÊ×××êó ±÷ˆÈõ0 ¹05>¸Õ¨Cv˜íÔ©SÒõÙpÜÜÜP«V-«Ï7Ä€Däzˆ\˜!ÀÖ$@~˜M¶ImTdç!É`@"r= HD.¬víÚ6סF@’íAŠ—*gËðZ5ç!©ñ‘sa@"raÎ,™¨-C¤úõë«Ð’\ìA"r= HD.¬Zµj6í„R¥JÙÜKnõ—¡FRÆ Uh  Ñh؃D䂈\˜‡‡‡MÞj-~èŒ=H5jÔ€ŸŸŸÍõ„„„¨zG9$"gËDí ¨Òµ{ÔX¾ÀÍÍ 6×Ãá5"×Ä€DäâlÙ#L¨ßƒ¤Æ Î0‡×ˆ\‘‹kÞ¼¹Õç:k’Cl€:ß{ˆ\‘‹³6 ¹»»;å¤Ò¥K«2qP§©N:*´„ˆœ ‘‹ µjÎNãÆUÙìP7 U©REµº5jdójj.@D΃‰è `M/RÛ¶mU»¾šClj¤’%KÚÔ‹äãペ5kªÖ"r HDO€V­ZY|ŽšÉÇÇGµÞ(5<÷ÜsVŸ[·n]¸»»«Ø"r HDO€ž={B£ÑH—÷óó³)8(Qk˜M[üó³&<æQk;9$¢'@•*U,êêׯŸj=>yÊ—/¯J=ÎÔƒdK¸""çÆ€Dô„˜={¶T/’ŸŸÆŽ«úõƒƒƒU©G퀂ððp«Îmݺµªm!"çÁ€Dô„hÚ´)&L˜`6$}óÍ7ªlrkÈYôíÛ×âs*T¨`—版œÑdÖ¬Y8pà@¡[ÓK–,‰^½zaÕªUx÷Ýwírm5†ØÜÝÝU[E;¿7ÞxÃâsÚ·o¯z;ˆÈyض;­ZµÂñãDZ`Á\»v Ý»wGÛ¶máíím×ëªÑƒbóºEJÂÃÃѤI;vLúœ~ýú©Þ"r HDO OOOŒ7Ρ×T# Ùcx-Ïûï¿ÁƒK•­S§^zé%»µ…ˆŠ‡ØˆÈ!œ= ½ýöÛhÙ²¥Ùr³gÏæúGD.މˆB9Hö HnnnX½z5š5kf´Œ»»;~øátïÞÝní "çÀ€DD¡F’Ú‹D ÃÁƒ1yòdý\'777T¨P 4Àúõëí6‰ˆœ ç ‘C”-[žžžÈÎζºŽªU«ªØ"e˜6m ”/_žÃiDO $"rFƒ   ÄÅÅY]‡#7†µwo97±‘ÃØ2Ìæææ†êÕ««Ø""ãˆÈal Haaav_«‰ˆ(9Œ-©V­Z*¶„ˆÈ4$"r[nõg@""Gb@""‡±¥‰Ã‘#1 ‘ÃØ²Ñ,{ˆÈ‘ˆÈalY ›=HDäH HDä0Ö$///»n3BDdˆ‰ˆ&$$žžžŸW½zuýÖDDŽÀ€DDãîînÕ<$Î?""Gc@""‡ ³øœððpõBDd9Tݺu->§qãÆvh ‘q HDäPŸÓ¬Y3;´„ˆÈ8$"r(KR`` 7©%"‡c@""‡jРEw¤=ÿüóÐh4vlQa HDäP¥K—¶hÈlðàÁvl ‘2$"r¸wß}Wª\XX:uêdçÖÆ€DD7pà@Ô¨QÃl¹áÇÃÝÝÝ-""*ˆ‰ˆÎÃÇƔ)SPèxhh(~þùgŒ3¦ZGDÄ€DDE¤\¹r˜:u*ëK,Ý IDAT®_¿Ž¯¿þ!!!ðòòÂG}„¨¨( 8“³‰¨Èps#"*Rþþþøøã1dÈ$''£R¥JEÝ$""$"r¾¾¾ðõõ-êfàQ! HDDDDˆˆˆˆ 0 à$m"+Üß· é—u3ˆ¤åÜO(ê&+ HDVȸv ×Nu3ˆˆÈN8ÄFDDDd€‰ˆˆˆÈ‘$"""" HDDDDˆˆˆˆ 0 `@""""2À€DDDDd€‰ˆˆˆÈ‘$"""" HDDDD<ŠºDE¥L›·áÞª¨›Aäô>¾Ðñ7ß|­[·V<7)) ÿý7Ξ=‹àÑ£Gª¶ÛœvíÚ¡oß¾ú¯wìØ_ýµP¹êÕ«cüøñvoÏäÉ“‘Pèñ×_mÛ¶µºÞÇcûöíHHH€N§S,SªT)4iÒ=zô€···U×1öZmÔ¨† fUj8pàV®\YèñL:UñN‡Ã‡ãøñã¸}û6îß¿!„[ZТE‹ ÑhiµZššŠ1cÆ8ôúùùùù! 6DÛ¶máïï_dmaø¯k×®¢¨\¿~]¼öÚkÂÃãP»ùoÊ”)FÛ˜””$>ùäQ®\9‡·+((HŒ3F¤¤¤(¶mÇŽRõ¸»»‹W^yE\¹rEµŸ]… ¯uôèQ}™áÇ+–éׯ_¡ú²³³Å—_~)‚‚‚Šôw€hÛ¶­*ÏÑüaôUªTéééª\ǘmÛ¶½~ÕªUõׯ[·®b™E‹ª3>>^ôïß_xyyéÏèã?.Ю9sæ(–kÙ²¥]Ÿã<áááŠ×ÿöÛo­®sÆŒ='õë×7oÞ´êZÆ^«¯¾úªÕíWÃâÅ‹ÛU§NBeu:øé§ŸDåÊ•‹ü=D§ÓjŸV«ß}÷ )Ò¶…‡‡ëÛ”PäÏUÞ????1vìX»¿/víÚUñúN5ÄfÍšá—_~ANNNQ7GÑ‘#G àÞ½{¿þÝ»w1oÞ<Ô«WGµº­V‹?þøX½zµŠ-T‡N§C¿~ý0nÜ8ܽ{·¨›£šîÝ»£}ûöŠÇnܸ ØíÚÙÙÙ=z´Ñã³gÏF‰%,ªóÆhÞ¼9V®\‰¬¬,[›H&ûLõk¦¤¤èçÒh4X°`ÑùÆÜ¹s›7oV£ydÆÒ¥KqâÄ «ÏŸ0a‚âü@Wæìï!ÎÞ>g³téR‡_ÓiÒ‘#GŠº &%%%)Nø,jëׯWeÒ²ƒÆÁƒUh•mt:MÇÅÁ´iÓP¦LÅcK—.ÅéÓ§U½Þ”)S””¤x¬ÿþhÖ¬™Åu9rÄá]ŸD©©©ø×¿þeS øòË/UjQñàìŸ)ÎÞ>gsæÌÕo‚2Çiîb3öæíããƒ1cÆ ^½zF‡%ì¡nݺ¾Þ·oŸÑîí   ôïßµk×F`` ªí¸wï.]º„•+W*>GZ­ûöíC=LÖS­Z5Œ?ýõ6nܨ8Ç+##=zôÀ¡C‡P«V-Õ¾KÝ¿ßè´6mÚàwÞCÛT¾|yUë ÂgŸ}¦8'H«ÕbôèÑØ½{·*׺pá‚Ñîi???|ñÅVÕkì5ëááÑ£G£aÆððpÜ[LQþÎÚÓ¬Y³Œ»¾øâ‹xûí·áåå ÷C÷»ï¾Sœ¯1þ| 2DG©«36G´uëÖxã7P¶lY‡¶'­V«5z§ZóæÍ1lØ0øúú:ªiÒwŠ}ýõרX±¢ÝÚ¡ÓépáÂ|þùçÐjµŽ !””„ÐÐP»]ßÓ¤ììlÅÇ6lˆ3f8¸5…›gáëë‹Ã‡£zõêv½þˆ#P¿~}Å-3$ C‡ÅСCqìØ1¼öÚk¸~ýz¡r÷îÝC—.]©ú2²LMП3gŽU½ÎhĈX¼x1¢££ Û³g6oÞlv© £G6úœŽ7Îê7c¯Ù5j`öìÙVÕI]½zÕè<šˆˆlÚ´©ÀiïÞ½QµjU|ôÑG…Ê?~üãÇÇÚµkíÖ^gbìw~„ èܹ³ƒ[SV«5Úû:}úttìØÑÁ-’Ó©S'„‡‡Ûý:ëׯÇÅ‹ =îè›·œfˆÍ77çh¢±´ß A»‡#¨Y³&êׯ¯xÌÒyQMš4Á_ý…àà`Åã111èÑ£‡Ã»3eX»¦‹3òòò¼yóŒ;v¬Ñ"kÛ¶mؾ}»â±Ê•+Ûe½gyͺ‚±cÇ}~óÍ7н Æ CDD„â9ëׯwŠaô¢ä쿟®ôg-GŽ™âÜ¿)Ƚ­ÝÖ 5v÷å±ô¶h[»–±¶™R­Z5lÚ´ÉhÄ[o½õÄÞì(/¿ü2:tè xìÒ¥KX´h‘ÕuËÜÖonüääd§ ×ÅÍßÿ7*ëÞ½;Úµk§xÌÃÃóçÏW<&„À'Ÿ|òD¿®á.d2ÍØ"³~~~m‡Ó ±Kõ111¨X±¢ÝÆÍ}}}Q¶lYDDDॗ^ÂsÏ=gñÝ<ÅU³fͰbÅ ôéÓGñ sýúõ Ü9sŠ uOŽùóçãé§ŸVì>ž6mú÷‹ëýþûﻩ E‹èׯŸÅuægì5›€Š+¢Zµjvy-•(Q¨W¯Ú·o¶mÛ:}¯€¥t:>ùäÅcžžžf'\wèÐݺuÖ-[ ;zô(V®\‰ªÒVgeìwoðàÁ˜7ož]æ1j4”)SaaahÒ¤ zõêeñT…÷Þ{Ïá«GwìØ³fÍ2[nòäÉFo.QË7—¯É{Ý;’Ó$SæîÝ»g÷Eÿøã|þùçhÔ¨–,Y‚§Ÿ~Ú®×s½zõÂ_|atë…/¿üÕ«WÇСCܲ'GDDÞ{ï=|ÿý÷…Ž%%%aÆŒF{ŒIJJ´iÓY{[¿!S¯Ù””»o—°yófÌž=uêÔÁO?ý„–-[ÚõzŽ´téRœ\ñØíÛ·]¾gØsVVfΜÉ?0U`¬GÕžœ& Õ«W]»v-êfœ›-ÚÉüùóѰaCÅa²ýë_èÓ§bÐY¸p!.]º¤Xg³fÍðæ›oªÞV%~~~v½;ªF¨X±¢â­ÀÅuo8­V[$“PÜíIV­ZeUïTqãîîŽråÊÙu—€N:)$Ùß͇,>ìHX³f zõꥸô;ÅFeË–9MHrª9HÎÌXH‹uÈ¢kZ­Öèü {ȼÛÿùñÇ1nÜ8‡ ×@KÔ­[ï¿ÿ¾â±¸¸8Å»îÝ»‡éÓ§+ž£Ñhðõ×_»l+X²dI‘Þ1qâDÅ[â•< ¯Á¢äªÏ¯——~ùå“Û¨¬\¹o½õ–U‹ÛÃ._¾ltÕÎü(Æþâ¸yó&Þzë-DEEÙeŸ˜ììlœ? @\\œbµ7RÍcîöÿ¹sç¢cÇŽ8|ø°ªß»©ò;wªvg6uêT£·ýñÅؼy³þ뤤$¼óÎ;F»ð_ýu—šcróæM£åæÿÝ1ö{týúu£w‰©%66‰‰‰ŠÇ ÛõðáC|öÙgvm9·nÝ2»ødž3gÎØ}]ºâJ«ÕâܹsfË™zÛµk—ˆ$oooüþûïhÛ¶­Ñ2«V­ršäTClÆ sèLÿœœ¤¦¦=^ºtiýÿM­³råJ¬\¹R¿ŠªšdÆ­›7o®ê5ó[¸p!®]»†]»v)ß½{7vïÞ OOOÕ~¡MM?~<¦L™âÐ-^ víÚ8|ø°Ã®ˆ)S¦(.7‘““ƒîÝ»£dÉ’ðôôÄÇMn…cÏ;@&L˜€ÿþ÷¿v«ßV«59$ÿk6ÿÿó‹‹‹C… Pºti»¬ÀmÉû Ìœ9ÓîMÆÜ¹s1xð`TªT €ñ×á•+WäðUããã-Ú§ìÚµkhܸ±[TXZZšÑ­±òÿÜ===áëë«Øk7kÖ,|õÕW½û®T©RŠCÖöP¢D lÞ¼:uÂ?ÿü£XfÕªUB`ùòåE:ÜæT)==Ýi&Yj4Ô¬YSÿuDDjÖ¬‰˜˜£ç!Þþ§žz uëÖµ[ýy·ÿ·jÕÊäâ™jî—çííªU«âúõëŠÇ322¾×—½&uš2|øp,Z´Èèv!iiifë3f ªT©¢vÓô?~ì4¯Y^³µk×6YöÁƒönŽ¢ü«ÇÆÆâÛo¿U,çëë‹èèh„††ªzý>úß}÷]¡ÇÓÓÓ1qâD¬X±@ÁçR‰3ýÜ•èt:§j£ájÕµjÕ2zgWff¦Cï¶sôÞ|~~~غu+:vìˆ#GŽ(–Y½z5„X±bE‘…¤'~ˆÍ˜¦M›¢bÅŠú¯5 fΜY„-RöùçŸÛý¥K—ÆÖ­[íúAk(ï.Æ'YÞmÿÖªX±¢Ñ-d\QíÚµ ü±ðì³Ï"88¸[TX¥J•дiSý×cÆŒ1úA8fÌÕÃ;|kl›˜U«Vé?°ºtéÂåUôÊ+¯øúI+Uª¶oßn²—oÍš50`@‘ ·1 )ðôôļyó =Þ·o_Œ3¦Z¤l„ {‘U­Zýõ—ÃBÒ„ âk9³.]º sçÎVkÏÛú››,XPà1///Ì;·ˆZT˜F£ÁW_}¥ÿkxïÞ½øý÷ßËV¬XQõ5«ò”-[Öè>}y·ý !òDl{êÔ©S¡UGމ°°°¢i“(S¦ vî܉ -³fÍôïßß.s|Ía@2„ 6àùçŸW<>wî\,[¶Ì®·‰šS¾|y¬X±Bµ-#dU¯^GµyxåË—ÇîÝ»Q¿~}»_ËÙ-\¸Ðè|cúöí‹Ø©EÎ¥L™2X±b…âŠÞ ÀþóŸ"Šþþþøïÿ‹>}úÈK5jÔ(£åg̘a×åMÞÿ}£Có‘‘‘X³f €ÜÞ¦I“&ÁÃéfc+={öTÜäµT©Rسgš4iR­rصk—É©"k׮ŀŠ$$ Ã]»vEaàÀ…Úbïþþþ¢jÕª¢{÷îbáÂ…"%%Eª­bݺubðàÁ¢qãÆ"88X”(QBõö•(QB‹gžyF 2DlذAdffm׎;ëiܸ±Z?&!„ÇŽ'NÍ›7•*UÞÞÞF¿‡£GêÏ>|¸b™~ýú)^'++KüòË/â7ÞuêÔB£Ñ8ü÷¤N:ª>–:yò¤èÔ©“ 4ÚFooo!¾úê+‘““cÓõêÖ­«xE‹(÷ÑG9ügQ²dIQ¹reѵkWñõ×_‹»wïšý~âââÄœ9sDÇŽEhh¨ðóó³{+Uª$:wî,æÍ›'îܹS =‹/6zn£F„V«µéç'cûöíFÛP¹re‘žž®/{ùòe1yòdѶm[»½×™û—‘‘aò¹3|ÆÆÆ:¼žžž"00P4mÚTŒ1B:tÈìÏ!''GlÚ´I 8PDDDˆ€€áæææÐv—.]Zßž„„£å.^¼¨Òo_aqqq¢víÚ&ÛÙ·o_‘­úµ»víªx=ÍÿÿO]»v5º˜‘«èÖ­¶nÝZèq±`@""""2À€DDDDd€‰ˆˆˆÈ‘$"""" HDDDDˆˆˆˆ 0 x"7ØÑjµˆGBB‚Ù²åÊ•Chhh½ˆâââxê©§¤÷yŠÅýû÷5ÒoZ™––†7nàñãÇ}úݶÓÓÓqýúu¤§§[TGݺuqÿþ}ÄÅÅÈݨ·råÊ0y^zz:¢¢¢än¬ijcÙ‡âòåËwwwT¬XåË——ncVV®\¹‚GP½zu£å£££‘ššª¿^xx8J”(¡XV§ÓáäÉ“ÒmÉãéé‰ÐÐP"99W¯^øúú¢N:&Ï=sæ ²³³ááá&÷ÜŠŠŠBzz:<<<аaCéö8qB”,Yááá8þ<222~~~¨Y³¦Ùýµnݺ¥Ô¯_ÉÉɸ}û6 víÚˆ‰‰N§Ô©S¾¾¾RmËÿú DXX?~ŒëׯëƲžzê)¤¥¥áÖ­[äî…U¥J•B;Ö§¦¦âæÍ›¿ëÕ«777œ={@î{GÕªUqòäIýód)øûûë_Ÿæ~÷ Ÿëׯ///³×ÉÌÌÄ7ððáC“åÜÜÜ‚ *(OJJÂíÛ·õ¿ß2ò~Gyüø1.\¸F¥J•¤ëV’––†ëׯë_Æxyy¡råÊ(S¦LÇ?®ÿ™2eP½zuh4“uÅÄÄàÁƒpssÃÓO?k×®!))É¢vçÏQ"„@||¼þµeJÙ²eQ©R%xzzêKHHпŽ<<-fΜYà1wwwÑ¿ý÷«äøñãúò3gÎ4ù}ÿùçŸ÷·ÑhD×®]ERR’Ùçì‡~eË–-p~ïÞ½–7n\¡ïÑßß_9rD±|ZZšM{uïÞ]$&&Š ÂÍÍMlÛ¶Íhû~üñGý¹íÚµ3»¯PãÆhö¹Ê/oo¼V­Z !„¨S§NvŠ~øÁd£FÒ—¿víšøüóÏõ_ïÝ»W¼ýöÛú¯ÇŽ+Õ®¬¬,ñÔSOéÏÛ²e‹˜8q¢ðññ±êùŒŒóçÏ·úçWºtiýó““#,<<<¬ªëÒ¥KâÆú¯ßyç!„°iß·_|Qܾ}[T¬XQ¾¾¾âÔ©SFŸßO?ýTî[o½eöçqõêUÑ¡C‹÷7,[¶¬˜3g޾ž¤¤$Ñ¡C«¾ÇgŸ}ÖdO:¥/ûÉ'ŸHü–);pà€ˆˆˆ°¸}Õ«W¿ÿþ»¾Ã}ÒªV­*¶nÝjòÚy{}ùøø!„xë­·¬þ¨T©’X¾|¹¾îììl1fÌQ²dI‹êñðð½{÷Öïehø:rww}úôÉÉÉF¿¯¨¨(}ùO?ýÔêŸMQ3¶”tÕ€ôñÇ[ýK @ 0@¡^@Z»v­M퉎Žüñ‡Mu(¤¼-Z´=Rü^l H²¿g;vìP|ã6Ž?nt“Çzõê)†[1gÎqåÊQ®\9@ˆØØØB×:|ø°>¸„……Im²j¯€”÷ïË/¿4Z‡¹€'üýý»Q®Ò÷lè›o¾Ñ×ñÒK/‰]»vÙôÜÛ€Ü FIJeËlªÇ^IˆÜß¼Y£F Å­7ê_/M›6?6ù³ÐétV†üÿ~þùg!„m›;" ݹsÇâ‘ÿŸ‡‡‡8{ö¬¢p@Ê;¾qãF£×W3 ¹d8p@!ÄôéÓmª«K—.BˆÂ)ï_ãÆþ±ìêé‰bÛ¶mÀÛÛ£GFÕªUÍžyóæ!--Mq3;[œ>}Zÿÿ÷Þ{Ï<óŒEç—/_k×®Õ=hÐ ´lÙÒ¢: »«GŒíÛ·#&&‡Æ›o¾‰7ÂÍMéjýúõÃöíÛ‘’’‚­[·bçÎèØ±c¡rZ­#GŽ„@î÷¶~ýz“Cˆ#GŽÔeŒ=µjÕÂO?ý„£GâüùóX¼x1>øà£ç7jÔÆ “ú>=z„qãÆ!''§OŸÆ¸qã°nÝ:¼ôÒKHIIA¯^½pèÐ!ýÐ^BB^{í5dffÂ×׿þú+Ê•+'u-5…††¢W¯^X¼x12331~üxT©R}ûöµ¸®Lœ8“&MBff&&L˜€õë×-Ÿ””„iÓ¦ÈíŸ?>þüóOýñ7Þx/¼ð‚Em¨^½:"##õ_øá‡ˆˆˆ:w÷îÝØ°a²³³qáœ:uJlôèѨ]»¶Em V¢úöÛo‘““Sèñ}ûöaÍš5€aÆ¡Q£F…Ê„††š7oŽE‹aРAˆEÿþý±yófî,$:­IDATýëòÂ… 4h„Ư¿þ “í½qãÎ;¨R¥ >üðC”*UÊä9B;v ?þø#`Ë–-8p þ¹Óh4øâ‹/ÌÑç,]ÖZ@ZZ€ÜçòÍ7ß,4´j(;;›7oÆŽ;““ƒíÛ·øÝzúé§Q¿~}¬X±999èß¿?öîÝ‹-ZXÔ¶9sæÆS¢Õj±k×.üöÛoB`ëÖ­xî¹çôŸkîîî9r¤Ôïí½{÷ðÕW_!99»víBVVVãï¿ÿ>öíÛ‡‹/âĉèÓ§6oÞlvXÞJM®Úƒäîî.ˆÖ­[[t^Ïž=õÏMrr²j=H£GÖ}âÄ K¿!DÁÞ¬ƒZUGþ¤Ó§O‹””ѰaCýc#GŽ,t޵=H¿üòK¿Ô[´h¡xÎÊ•+ ý… å¤õë×ëËwëÖMÿxll¬¾7¥\¹r…þòÎ߃ԣG³ÏU~¥K—Ä믿®ìÛo¿Õ×7pà@!Dî°ÒóÏ?¯|õêÕÒ×P»©AƒB!öìÙ£–õññÑÿ5šŸ¹$!r‡­«U«Vè¯Z%#FŒÐŸÿÁ!D:wíÚeÑ÷˜'ÿ_¾æ†:ò[³fMïgøðáú¯óz ,¥ÔƒdÌ¿ÿýo}Ùß~ûMªþ‘#GêÏ™2eŠBˆ””Q«V-äö†™úä·wï^}]Ó§O—:'O©R¥ñÌ3Ï!„hÑ¢…r‡Õ¦FÒìÙ³õulß¾]ú¼ü=$Æ Bü_RÞûPþaóòåË+ö¤šêAº}û¶t{ôçõéÓG!DùòåÛKn‰!C†èëº|ùr×Qdd¤HMMÍš5Ó?öÞ{ï™|~؃TÌiµZ°8ç/ŸW‡ÚÚ´i£Ÿ´-ëÚµk¾îÔ©“ÅßÛÅ‹ =V¦Llٲ͛7G\\¾þúkT«V }ô‘EuÓ¿Ì™3QQQ8|ø0¶mÛ†.]ºèkµZLŸ>]ÿõŒ3LÖ—‘‘qãÆÈÈ8wî\ý±êÕ«cäÈ‘˜3gîÝ»‡éÓ§cÁ‚ŠõìÛ·Mš4‘ú=z„È(œçÃ?Ä©S§°dÉ,_¾Íš5CTT83f úõë'u {j×®~øá 4èÑ£"##Q«V-‹êñññÁ—_~‰Þ½{CQ£FáÈ‘#…&­^¸p‹-;ÑxêÔ©…êzõÕW L•qâĉ_üñǘ>_|ñ…þë‹/êƒW~%K–DBB²³³1fÌlÚ´©P™Zµj¡gÏžŠ×Y½z5nÞ¼ ÷ }úôé¨Y³&Z¶lYè/RooolܸM›6Õß_½zu¬]»Öâ¿ÔímÚ´iˆ‰‰Áš5kƒW^y»wï–ê=ÉoÁ‚hÚ´)t:&Mš„ž={êoûߺu+vìØ wYcóÀZ·nmñ|Ã%6z÷î­x|RR~úé'ý¯¿þ:úôéƒ  F€-ZàèÑ£X½z5nݺ%u«ú¥K—pæÌäää`ïÞ½èÝ»·Eí·FÙ²eñûï¿ãÙgŸÕÿQÔ¢E üûßÿ¶ûµÍÉ»ÝyÏq¦Ñh°lÙ2ܼy‡ÂðöÛocÕªUf—pvõêÕÆ еkWdggcРA •î©,Ξ¨€äííÌÌLʼn¾½{÷†··7úô郌Œ ¼òÊ+ضm^xá…k³Øë/‚Ù³g£qãÆ6Õ1}út´jÕJ¥åêÞ½;¾úê+Œ9éééxùå—ñ×_Ù\¯F£ÁŒ3ðòË/¦NŠ—_~Ë—/×÷tíÚÕì¤óI“&èyؽ{·ÙkoÞ¼»víB‡ <^¯^=£=<ï¾û.^xáÄÇÇãæÍ›8pàhtòzHH&OžŒ¡C‡êÛi.w[i4,Y²7nÜÀÁƒqèÐ!¼ùæ›úÉò7nŒAƒaÉ’%¸yó&æÍ›‡É“'#++ £GÖ—›7ožÑa´ýë_…~&–4hÑÞß:uêèÛ²iÓ& <¸Ð‡sÆ -ZoêàÁƒú kz­áÇcΜ9€Y³fYüÞ”¿¼%ë§åää 33 ­±äããƒcÇŽYÔKöšË²ö{ÍÿÞon=)üþûïhÑ¢®\¹‚5kÖ $$DÕáC¥öä_ ÏÚºÌýîtèÐ .Ä{ï½§’ß»w¯Ô[ÅÙj×®³gÏâðáÃèØ±#ªU«f´Lzz:ºu놖-[bÏž=rDô÷÷/0Waܸq…†t”hµZìß¿@î“Oz>þøcÔ­[×¢ïç³Ï>+PÇØ±cQ¿~}‹êOþøãqùòe,\¸ hÖ¬™*½HyÏodd$Nž<‰¾}ûâСCr?¸óÏCRrüøq,_¾ÀÿÍ1%ïŽ3 wÈ'ÿ]KæÔªU {öìA›6m˜˜ˆ%K–@üÑhHÊÿ¦cíÝy?ßäädôïß_jQÒ‡ê?ÀdÊç½±·lÙ111øí·ßP¯^=‹?p?ÿüslذ©©©øüóσk×®áÒ¥Krßd»uëVàýÿ?ýôSüòË/]sÔ¨Q•ÍÌÌĤI“ôaÓ¦Múžâ+W®è‡¬üsøL-øiù{­ùýÊ¿8ã‚ pùòe³½Øy Qæ}¸Ê¼÷Ù*ÿóºnÝ:¤¥¥YtWmÿþý |¯C‡ÅÆÍÞå—••…¿ÿþ[ÿµÌ÷„­[·âÙgŸEJJ æÏŸ½{÷š\rüøñR‹¬fggëßó·§víÚˆ‹‹Ãå˗Ѻuk³ Õ@bb"¶lÙ wqÛ*Uª˜=gÈ!¸|ù2æÎ‹¤¤$´lÙÒ⻦‹£'æ.¶ H­ aìßgŸ}&„"22Òèz;2ÿž{î9!„ýõ—Å ´åÿwêÔ)›ÛYè.6%999¢GŠuXz[~»wïV¬³W¯^…êÉ›N§Ï=÷œ¾üÒ¥K¥~Úµk§?çûï¿·ø.¶3gΈÀÀ@ý9ƒ Z­V±lþ»õ–-[¦|øðá¢}ûö¢{÷îf¯7eÊ›~ggÍš%„(|›’K—.‰àà`ÅzŒÝÅfè‹/¾P¾$ß:2ù\! ÝÅfìgѯ_?Åz\ñ.¶'j/¶‘#Gâ§Ÿ~BË–-¥ç:”+WM›6Åwß}§¿ó¦E‹X±b5j$½½;ìÒ§O¬Zµ @îÝK–,Aƒ ,žó‘ÇÚ¶XÊÝÝëׯÇÌ™3Q³fM‹ï62æÅ_DÛ¶m ]+o½c6lØ€þù@îúE”ºÞ‚ ôó€¦L™¢ßúEVýúõ±sçNý_ÚË–-Ã;ï¼cÑVÿûßÿ°{÷nìÛ·ÏlÙI“&aüøñ “~Î===Q­Z5Lš4 cÆŒ‘nWíÚµqøða¼þúëV¯Ñ4jÔ(tëÖ­À\«àà`|ÿý÷Šë5jÔk×®Å3Ï<#½e­¦Nªï9}üø1^yåìڵ˪º|}}ѨQ#¬X±Íš5S³™±nÝ:Lœ8õë×/ЛgŒ››BCCѱcGüù矅^»öàææ†Í›7£sçÎ ²ª???ìß¿ƒ Bxx¸ÙÞ# w«zõêèÝ»7þùç‹¶Ñxá…pàÀtêÔ ¥K—¶ªÍ†<<<†W^yû÷ï×ßh2`À¬]»­[·6¹åS~xúé§1gÎ|ýõ×ÒmpssÃòåË1gÎÔ®]Û凨4ÈMJtíÚUßýFôÿÚ¹C# £AJ@c肺è¡Z@$þ‰JBfxOžZùÍÝÍòy}ß×0 o+ð}Ó4.‚¾Ô üƒ}ß«mÛšçùìQxáRŸ´á4MS˲œ=o¸A $€ ‚@ $€ ‚@ $€ ‚@ $€ ­ªîyØu]ãxÂ8¿³®kmÛöt~HWæ‰ $€ ‚@†cÙ‚iv„•IEND®B`‚sonic-visualiser-3.0.3/icons/scalable/sv-splash.svg0000644000000000000000000004255113111512442020465 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/sv-splash@2x.png0000644000000000000000000011726613111512442021032 0ustar 00000000000000‰PNG  IHDR„XGÀžsBIT|dˆ pHYs¯¯^‘tEXtSoftwarewww.inkscape.org›î< IDATxœìÝi”œgy'ü«7ík·%Yj­–±,Ë6ëâÄØÆflsX rÌdb™!̘9@æÍIœÈÂ$2ö$C¿€3CŒYâÛañ2Þ$Ù–%YK«­}Ww«·z?èm[Kw©»ê~êyªôû}²º«®ëV©ëÏu_OSD”ÆÐœ÷(6e (K€@Y$Ê P– €²H”%@ ,eµNäÅ¿ök¿W]uUVg xà¸í¶ÛÆýú HW]uU|ðƒœð¡(–‰H®°P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ¬Ö¼@mõmys… €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,e (K€@Y$Ê P– €²H”%@ ,eµæ}Î -3;bþ»~?ïc4´ÃßÇžúç¼@ P-SgEûÊû m`ï6™p… €²H”%@ ,e (ËSØ€ÜmÙ²%þìÏþ,¾ÿýïŸñ½¦¦¦xûÛßÿå¿ü—˜7o^§@€äæÙgŸOúÓqÛm·ÅÀÀÀ˜¯ûÌg>Ÿÿüçã·û·ã£ýhtttÔð”¸ÂäâG?úQ¼êU¯Šÿõ¿þWÙðhÄÑ£GãÓŸþt¬\¹2{챜€$ æî¼óÎxë[ß===~ï¡C‡âæ›oŽÝ»wgp2F#@jêÑG·¿ýíÑ××WqmÛ¶Å»Þõ®qM.P=P3ÃÃÃñ¡}(Iðsÿý÷Çoþæo&8g#@jæ+_ùJüìg?KVïoÿöoã[ßúV²zŒN€ÔÄþýû㓟üdòºù—™¼&§ 5ñå/9öîÝ›¼î<O>ùdòº¼D€d®T*ÅßüÍßdVÿ‹_übfµ 5ðàƒƳÏ>›Yý;î¸#³Ú€øêW¿šiý®®®X¿~}¦=Îe$ S¥R)¾÷½ïeÞç‡?üaæ=ÎU$ S=öXtwwgÞç‘GɼÀ¹J€dªÓG?þxMúœ‹H@¦~ðƒԤϳÏ>½½½5ép® ™éíí‡z¨&½cíÚµ5ép® ™ùùÏýýý5ëç@6H@fxàšö{â‰'jÚà\Ñš÷€Æ%@ªÎÐÐPÜvÛm1eÊ”X¾|y,_¾<æÍ›—÷±€s ÈÄÐÐPüô§?­iÏçž{®¦ý²´mÛ¶xï{ß÷ßÿ)_Ÿ6mZ,_¾{öìɼÐøH@Ry?-¢>¤Ç<2ï#@R É:t(ºººò>F]H=ôPMúìÝ»·&}€Æ&@’Y¿~}”J¥¼Q;~øášô1¤ @’)ÂõµˆˆD___ÞÇ(ëÑG­IH@ $ ™",ÐQäkl}}}ñÜsÏÕ¤×Î;kÒhl$ Òø<óÌ3144T“^;vì¨I ± €džy晼ð¢"ïAzê©§jÖK€¤ @’èéé)TXQä ¤ZNjéϨ_$ ‰M›6â l#Š Õr©«««P.@} IÔj)ôx9@ªåR___8p fý€Æ$@’ظqcÞG8EQw >|8¶mÛVÓž]]]5í4DÑ&Šúøúµk×ÖüJYQÃ4 ~€$Š6TÔ©–××F˜@ª%@’ذaCÞG8ÅÞ½{c`` ïcœaíÚµ5ïéIl@µH@Õzzz ·´zxx8öìÙ“÷1ÎPË'° Õ UÛ¸qc!_´P+ÂPŸH@ÕŠ¶@{DÑö íÞ½;—©(P-P5Òø<ûì³¹ô Õ U O^ŸÓ¾}û¢¯¯/—Þ@c UÛ¸qcÞG•é„R©ÝÝݹôƒ ¨š ¤ñÉósr ¨† ¨Ê±cÇ ÔŒ(Ú¹6lØ[oP P•çž{.J¥RÞÇU‘¤R©›7oέ¿ ¨† ¨JQ¯¯ED¼ð yáE;vìˆcÇŽåÚ R$ *E] qâzÝÑ£Gó>FDä´uuuåÚ¨o$ *y#gS”klyN&€j€ªy)¢8RÞŸ“ ¨† ¨ÊóÏ?Ÿ÷Ê*J€”çØ""º»»cxx8×3õK€T¬¿¿?º»»ó>FYEY¤÷¶Ø»wo®gê— ¨Ø¶mÛ ?Õ²k×®¼ÃÃñyóæ¼a‘6P1P±-[¶ä}„³*B€´}ûöèëëËûö  Ë"@š4iRÒzE¸¶•÷õµ$ R$ bYH—_~yÒz¤—€J €Š¥~Û¬Y³â¢‹.JZS€ôP)P±ÔH+V¬ˆyóæ%­Y„iÓ¦My!"H@åH@ÅRHË—/ŽŽŽ¤5÷ïßCCCIkNTêI­J €J €ŠôõõÅÎ;“Ö\¶lYœwÞyIkÇ’Öœ(PïH@E¶nÝÃÃÃIk®X±"y€‘ï5¶Ý»wÇÑ£Gs벃æ,@} @ô÷÷ÇøÃøæ7¿YˆÝ=ålݺ5yÍåË—7\€T”é£ÝÝÝy¨C­yÎuûöí‹{î¹'¾ûÝïÆw¾ó8tèÐ‹ß»à‚ âúë¯ë¯¿>n¼ñƘ9sfŽ'=UÁÈŠ+¢¹9ýÿ¿%@zÉŽ;’?éh|$ÈÉÁƒã}ï{_|ï{ßsÉóæÍ›ã‹_üb|ñ‹_Œ)S¦Ä;ßùÎøâ¿S§N­ñiÏ”zvĉH½½½Éë ^ÒÕÕ•÷€:ä ä`ÇŽqÍ5×Äw¿ûÝq?!¬¯¯/¾öµ¯ÅÞð†Ø·o_Æ'<»ÔÒܹscΜ9qÞyçESSSÒÚ{öìIZo"6oÞœ[ïÑX¤ TB€5öÄOÄë^÷ºxâ‰'*zÿÏ~ö³¸úê«sRHË—/ˆˆ¶¶¶˜5kVÒÚynE›@Êûç¨O$¨¡®®®xÃÞPõ5¢uëÖÅ5×\GŽIt²‰Ë*@Šˆä‹´]a{‰ ¨„ jdxx8þí¿ý·±ÿþ$õ6nÜð¤ÖDõööÆ®]»’Ö\±bÅ‹ÿÜ(Òàà`lß¾=—Þc • @|ùË_Ž»ï¾;iÍÿþßÿ{<ùä“IkŽÇ–-[¢T*%­¹lÙ²ÿ¹Q¤®®®È¥÷XH@%HP½½½që­·&¯;88Ÿüä'“×=›,žÀÖˆWØŠv}-"bçÎã^Ü0B€5ð¥/})³É»îº«æOúÊ"@jÄ+lE{[DÄÐÐPìܹ3ïcuF€5ðùÏ>³ÚÃÃÙÖM½M >|8úûû“Ö"N E¸ÆLœ 2öàƒÆÓO?iÿóþO¦õO—:@êè舙3g¾øëÔR©TŠ}ûö%­9Eœ@Š '@€Œ}ùË_Î¼ÇæÍ›cãÆ™÷‘z²æäëk餈|®±™@… 2tèС¸ýöÛkÒë®»îªIŸˆˆ­[·&­wòØ"HY %@€ ýÓ?ýSôôôÔ¤×~ðƒšô9vìXìÞ½;iÍFœ@ÊâsJ¥««+ï#u¦5ï@#»ãŽ;jÖëÞ{ï¾¾¾˜2eJ¦}ROEœº@;¢1¤-[¶D©TªiÏñj¤iÆ ±víÚxæ™gâ™gž‰§Ÿ~:Ž;¿ôK¿W_}u\sÍ5ÑÙÙ™÷1 î #ǯÙTPDDOOOüË¿üK\wÝu™öÙ¾}{òš§HíííÑÒÒCCCÉzä U#H›6mŠ|ä#ñï|gÔï?ýôÓñ¥/})"".¾øâø“?ù“xë[ßZË#@Cq… 2rß}÷ÅáÇkÚó‘GɼǶmÛ’×<=@jnnŽööö¤=j e1©•JWWWa§£ÎæèÑ£ñ‰O|"Ö¬Y3fxtºgžy&Þö¶·Å»ßýîØ¹sgÆ'€Æ$@€ŒŒ÷/·)ýßÿû3ï‘ÅÒÒ¥KÏøZêkl¤—ôõõž}ûò>Æ„íÛ·/®¼òÊøã?þã8~üø„ßûí·Çš5kâç?ÿy§€Æ&@€Œüð‡?¬yÏÇ{,ó©¤9sæÄÌ™3ÏøzGGGÒ>µ²˜ÔJ)‹ 0K‡Ž›nº)žzꩪêìß¿?n¼ñÆxôÑG Î $ÈÀ¶mÛbãÆ5ï»iӦ̯ͥ–,Y2ê×M e«žö õ÷÷Ç[Þò–xøá‡“Ô;xð`Üpà u¢@žH{î¹'—¾ÃÃÃñøãgÚ#õdÍh××""æÍ›—´éTõ }úÓŸŽûï¿?iÍ}ûöÅøÿ!iMhd$ÈÀ½÷Þ›[ï,¯±•J¥äÁÃXRê ¤={ö$­WNá—5×K€ôÔSOŧ>õ©Lj÷»ßo|ã™Ô€F#@€ ä5‘m€´wïÞèííMZsñâÅ£~=õ¤ÞÞÞèééIZs,Û¶m‹ááášôªT½Hþð‡£¿¿?Óúõ¸PjM€‰=÷Üs¹þå|ݺu™ÕÎb1ôX;R_a‹¨Ý5¶¢__‹¨%Ú>ø`Üwß}™öؽ{w|âŸÈ´4$–çôQĉ++Y„µºÂQ»)‹ mÑ¢EIëÕÃÒýÑÕ¤ÏW¿úÕxá…jÒ ê• Ë;@:tèPfû~²FÆ R_a‹¨Ý¤-[¶$¯ùK¿ôKIë=@Ú°aCüð‡?¬I¯ãÇÇ_ÿõ_פÔ+$T*•2¿r3YM!¥𛛣³³sÔïeq…­V»nRm3f̈—¿üåIköööz÷Ï—¿üå(•J5ë÷ùÏ>ù~/h$$HhíÚµ±{÷Y€”:Y°`ALš4iÔïeq…­VH©w -]ºtÌeãÕ(êÒÀÀ@|õ«_­iϽ{÷Æÿþßÿ»¦= ž ¡»ï¾;ï#DDýHc]_‹ˆ˜5kVLž<9i¿ZMܤ¾Â¶lÙ²L¤¢.Ò¾ï¾ûb×®]5ï[ëÐ ê‰ úñœ÷"¢~®°-I½©K´‡‡‡cÇŽIkf uéŽ;îÈ¥ï¿üË¿6T€¼ ‘R©>ø`ÞLjˆl¤ÁÁÁèîîNZsÙ²ee¿Ÿú[-¤îîîèïïOZ3«)uЕB©TÊ-@Žo~ó›¹ô€¢ @"ëׯ¯ÙcâÏfãÆÉkvwwÇÐÐPÒšg ERHµØ”Å“ê–-[Ó¦MK>‘UÄi›'žx"×ɨ¯ýë¹õ€" @"<ð@ÞGxÑ‘#GbçÎIkf6,Y²¤ì÷ëq)õ툗&µRO!ñ Û=÷Ü“kÿGy$“?C¨w$H¤HRDúI˜,&kj Õb‰váÃȲqRm|ÿûßÏûP8$HäþûïÏû§Hød1Tî)lÙL •J¥¤5O—:@š4iR,Z´("?@,Dû½ï}/ï#@á 矾pOø¤®7iÒ¤X°`AÙפâСCIkž.up·xñâhn>ñ¯lg›Øš¨cÇŽÅþýû“Ö¬Æ#<‡ÎûqÏ=÷ÄñãÇó>Š (ÂÔÄéŠ uvv¾ŒŒ%u€‘ý¤ÔH'?©.‹'±)ø,Âõµˆˆ£G扊P$H ˆRÑw íúZD6RÖ{RN¤|é,P$H ˆRÑ'Æs+‹iÏž=ÉkŽ8xð`9r$iÍs%@êë닟üä'yãE?þñó>Š ª´k׮ذaCÞÇ8CÊI˜žžžäW¿ò ²¼Â–õ¢ñF~ö³ŸEoooÞÇxÑÃ?===y C€Uzà2²W%víÚ•lpO`‹¨¿)õõµˆS'¦OŸsçÎMZ¿(ÒOúÓ¼pŠþþþ ò$@€*ñúZDD©TJd gšfêÔ©1}úô¤}³ ²c:;;Oùuê'±eñg[‰‡~8ï#œ¡¨ÿÙ€< J÷Þ{oÞGSªp ëÉšrRO!e¹D;‹ÏéôI­ÔרŠ2ôóŸÿ<ï#œá¡‡ÊûP$¨ÂîÝ»cíÚµycL©,‚‘ñNÒ¤êiRGGGL›6픯¥Š0´}ûöèîîÎûgøùÏ^Èë©Táî»ï.ô_0S…©§TfΜsæÌ×kSHY>…-õç4ZX”:@:vìXBY/¼ðB’:©§T&²Çç\ž@ísJ½)"ÿklE "Š}6¨%TA€T™F R.-1Úç”z)"ÿ©ˆûFàThÓ¦M±eË–¼QÖÎ;“Ôi¤éÀ144”´fĉ`ª¯¯/iÍZHyîAŠG}4·þgSħÃ@HP¡¢OE¤™@:xð`=z4Ái^rú“ÅÊI Çþýû“ÖŒ¨ÍØ"²¹Â¶cÇŽä5ÇkíڵɾRzôÑGc`` ïc@îHP¡,¤©S§&­—b)‹§cMdŠ&u€‘Í5¶,®ö9MŸ>}Ü ÈÇ+Ï ¤¢_ëëë+ô“ VHPR©÷Þ{oòºo{ÛÛ’Öëíí­ú [Y#y^a‹È&@ªÕRDú)¤ûlôöö&­yÍ5×ÄÅ_œ´¦ H0a»víÊäÑÞ×]w]œþùÉëV;”:@šÈôQDD[[Û„§ñ ))¤Ç{,yÍ×¼æ5qùå—'­ÙÝÝÉ“û ž`‚î¼óÎNZséÒ¥qá…FGGGLš4)iíj'R •„©¯±¥†††’ïŠkvD6RObË"@zÕ«^kÖ¬I^wݺuÉk@= Àe±ÿèú믈‹“,X´vµH©ƒ‘‰N E?@Ú¹sg $­Y.$Jý¶ˆlž"w6©h755Åå—_—]vYÒº‘|WÔLÀñãÇãG?úQòº7ÜpËÿœzR5HýýýÉŸ6׈RÓ;åB¢,¤<&RH\pAÌž=;.½ôÒ¤u#L € &à¾ûî‹#GŽ$­ÙÖÖÿú_ÿëzR5HÝÝÝɯë5â¶,—rWØf̘sçÎMÚ¯ÖH[¶lI¾W蕯|eDD¬X±"¦OŸž´¶EÚœëH0Y<}íª«®Š9sæ¼øëÔR5H©hGD,Z´hÂï)z€”Åê³må¦JÔz)õôQDÄ+^ñŠˆˆhnnŽK.¹$imHœëH0N¥R)“é-oyË)¿N}…íÀ188XÑ{³Šp…íðáÃÑßߟ¬^ê𥵵õ¬?©¤ZO e EDòklûöí‹Ý»w'­ õD€ãôÐCÅ–-[’×}ó›ß|ʯS/ÑŽ}ûöUôÞF "ÒN!¥.\­­­e_“zRWWWòëŠådñ¶‘+l餈ˆõë×'¯ õB€ãôo|#yÍ‹/¾8.¼ðÂS¾6þüä}*]„:@jmm­( ;פñ„C©¤ãÇÇ®]»’Ö,'õÒ‚ N¹¹fÍš¤õ#"ž~úéä5 ^`†‡‡ã›ßüfòº§__‹ˆ˜7o^ò>•H©wû,\¸0ZZZ&ü¾¢H©¯'J}…-¢v{<˜¼×ÉÓG«W¯NZ?B€À¹M€ãðÀdrëôëkÅ Rÿž+y[D±¤ä“;yHµÚƒôÔSOE©TJZóôiÉ’%1sæÌ¤=HœËH0YLÍ;7®¼òÊ3¾^¤©»»;é9*y[D±¤;v$ß4ž -õ¶ˆÚH©¼@;"¢©©).¾øâ¤=žx≤õ žà,ãþá’׽馛F]”ÜÞÞ^Ñ5¯r* J¥Rò ¤JhGœÛR&©¤,®}'êììLþ™Ôê ÛÚµk“×¼üòËÏøÚ%—\’´Çž={bëÖ­Ik@½ ÀYÜsÏ=™<¾û]ïzר_onnŽööö¤½* öìÙÇOzŽJ¯°eñ™9@Ïõ´ÖÖÖŠ'ºÆR«)õ$ÏÔ©Sãe/{Ù_O=ñÈ#$¯ õ@€gñõ¯=yÍY³fÅ7Þ8æ÷S?‰­’)õõµˆÊ¯°E¤¿Æ–*@J½hŠˆø•_ù•³¾&u€444˜Ð{vìØ‘ô ÕLEœ Rêë닞žžªjôööƾ}û脉H©'"ê/@š7o^Ùkj$HC€£8räH&O_[°`A\sÍ5g}]ê)âÄ~›‰H½©ÚGΧž@Ѝþ[WWW”J¥D§9a¼O`‹Èf)Ë+lÇçž{.iÍrÓG鯰EDÜÿý144”¼.™ Fñw÷w™,Ï~×»Þ5êãÆO—E€4Ñ+[E›@Ê"@ªvz(‹°e"RGGGLŸ>=iÿ,¤gžy&’Ö,·ÿ(âDp¹råʤ=÷íÛ?ýéO“Ö€¢ Àiã/þâ/2©}Ë-·ŒëuYH™¶ééé™ð•·³™H02šÔWØ"Š MôZZêklY^aËbùôXO`;ÙÕW_¼ïw¿ûÝä5 ÈHpšÛo¿=žþùäu_ûÚׯË_þòq½6ï+l©§"Š·)¢ú+lER_cË2@Z·n]òšg»Âãº6:QßùÎw’×€" ÀI†††âþè2©ý|`ܯíèèˆææ´ÿ3=‘+lçJ€T´ ¤iÓ¦Mø÷™:@Êò [꩹¹9· ¤gžy&žxâ‰äu ¨Hp’Ûn»-Ö¯_Ÿ¼îìÙ³Çõôµ­­­1gΜ¤g˜È´MWWWÒÞÕHsæÌ‰ÖÖÖD§9¡Ú)õçTÉu´ÔWØŽ=û÷ïOZsDêiåÊ•1mÚ´³¾néÒ¥±bÅŠ¤½#"þþïÿ>yM(*üÿz{{ã÷~ï÷2©ýž÷¼gÂËŽS/žH€TÄ ¤¦¦¦hooOtšŠ6TI”œز¸ÆvìØ±ØºukÒšã™>qã7&íq"pîïïO^Š(íÿcØ¿|üã¯iÏ£Gžõ‰O¥R)<'[¿eË–LÎòþ÷¿Âï™7o^lذ!Ùò¼Â6eÊ”$WÐ:::&´Ëél!@J=qâ÷õŠW¼"iÍõë×ÇððpÒškÖ¬÷kßò–·Äç>÷¹¤ý_xá…øú׿ï{ßû’Ö€" P‡Š?ù“?Éû¹¸âŠ+*úËx#M -Z´(šššª®“zR5K´9òbø˜J#O e±@{"Òµ×^3f̈£G&=ßþéŸÆ{Þóžhii™ð{9ƒƒƒg|}´' Æ‘#GÎøúñãÇ£§§çÅ_ÏÚº5&6ëã#@€Œýûÿï+z_ê'±å9´xñâ$uRHÕL á l#ïijjŠR©”ìYüÞò¦L™o|ããÛßþvÒ3¬[·.V¬XmmmÑßßÇŽ;ã5===qüøñ¤}ÇòÑË#~}UMZpŽ @†Ìh‹×>ñßbÓþó ¿·õ©IϲgçŽØôŸ_>®×n]ÿtÒÞ³w?9îÞåLÚœviõÎç*?×C[Μ©Vë>›žý« ¿¯}jKìë9s’¥RëïøBlº+Y½ˆˆG¾õ|Òz-ÍMÑö·ï‰M-ãŸl»²ï@¤NÈòÉuP$ÈÐ{/ˆ¡®§b¨‚÷ÎìK{–ュؿéɘv–ÿõ.EìI{Ë':J£okõ×½f&ÞW|°§?ú¶>YÑ{·mI{–ˆˆö#ÏG_{¦ÏŸ±¯ç쯯®½iþ¼N¶!mËf”&üŸ­«§DLkH˜µÀ9ÃSØ #3Û"ÞyAåïŸ;9ÝYFÇ-š½}CénCEDÄ‚©iêÌIü™ˆ¨p¯ó®Þ´g‰¨üsZxö'ÙOÈ΄aTDıÁˆ×¼pÖÄß3­5âúêç,däß\1£­ò÷ç u¹Â¥jóSH“ÒÔ9ÙÁ §šv%Df´Uþór~âiwoÚqÓáˆÄ™dERDÄ[—'=œ3H¹“#Þ{Q•52Köç ¥š@šE€Tánã݉'ίâ3J •Òþþ6JWkÄÊÙ•½ïŠyKf¤= œ HßX1½ÊMƒYL gÚf{âýGé®Xeñ™ªpigâiAŸQê+li¯±m<œ®ÖˆJ'š›"Þ÷²´g€s [<=âW/¬¾NaÉx&RH“["æMIS+‹+lã¹Ö7šÔ;ª¹æ—E€Ô]à©­9bYSDo_‘ÍÏ42$öñWœMª5­5M“çºÖöÄWØ:§Ÿ˜úH!õíˆÊv õ ENüD¸ª®°%º"x²¤Râ+lËgF´Vño±SZ"~-AÈ ç$ôú…×,JW/õRHK¦§«5{RD¢,êE•H©ŸRQÝÒySNLå¤Ô(H<2~Zë‚ ¯¯ì߬:ñ¹ã#@€DfMŠø½W¥­Ùž8@:ÛÒ±Áñ…L‘raqKSuO¶Í¡ ~¿©‘ˆê77¥¿Æ¶#Q€´©@ûN6½5â·/­¾œ+Hȼ:ýÓ°Rïi9p–i›,h§œ@ŠH?•u¶Ïd4©ŸÀQýÏNgâÏ9Õ¶Ô××"ÒHo_qÉÜ4µ Ñ w¯Œxãâôu“‡%g™¶éJ¼ÿ("ý#ÓS‡jãÙ uºÔO`‹¨î [Dú ¤z"J êdò¶Ùiê47Eüñ'v"å  JoXñ»¯Ì¦v­¤mL -M ¥¾ÖWÁÒ®Ä;¦´TŒ-J ŠØ×W}ÔH“šÓþL]0+â?¿<]=hT$¨Â/,ˆøÌ/œØÍ“…ÔÒáþˆ¡2c%]‰¤æ¦ˆE‰¯VÍNÔ3ŒÓâÅ‹ãÆoŒ?üÃ?ŒóÏ?¿6=÷¦¿wtÖ²˜~ÉÕg|}pp0¶ïÜ´×E—¿zÔ^ÕX¸úéˆH GÿÂËâ¼óÎ×ëûûûcÏþƒÉúGD,»äUUN®ŠI“&EwòÆÐÝÓTÕ¹6Ýÿt²³ŒxåµoNþ35bzD|óÎëã3ŸùL|üã¡¡¡Lú@= PÍÍÍ1wîÄîžÌ™3'šš2Z.S§N)S¦œñõ¾¾¾èî¦¦¸æškâºë®‹ë®».V­Z•ÙYÆ2ÞPc"öîÝ;ê×·o߃ƒƒI{­\¹2i½ˆˆŽŽŽä5÷íÛ7îϺ»»;†‡‡“ö_¼¸ú»S---±xñâØ¼ys‚°uëÖªÞ¿nݺD'yÉš5k’×<ÝÇ>ö±xýë_ûØÇâȼÔ5±lÙ²ØÿÝt±=WÌ›7/yÍ={öŒúõjÂÑÔS€4^;vìHÞ?E€±|ùò¤Ò–-[ªzêiêÔ©qÁµÙv}ÅWÄý÷ßÿøÿ_øÂâî»ïŽšô€" @µ··GsssÒ‰—±&ª F³bÅŠä5³ÆúLFÓÕÕ•¼ggg’:Ë—/ORgÄÖ­[£T*U< ˜:@ºøâ‹£¥¥%iͳ¹ùæ›ãæ›oŽýû÷Çý÷ß{öì‰C‡Å¡C‡âÀÑÜÜÓ¦M;ã}Ó¦M‹É“ÏÜ‚?sæÌhm=ó_ÁçÎ{Æ×ZZZbÖ¬Yg|}òäÉcöl¾û/bðþ/÷·ã&@€kii‰ööö gSË)u ‘͵¾‰L mß¾=yÿ%K–$©³lÙ²$uFôööÆîÝ»cÁ‚~ïÞ½{c÷î´;µjq}m,íííqóÍ7çÖ¼v=:'Òý·¼$Ã)¤Lƺ–:@š>}z&Wðí [[[[ÌŸ??I­,»J.Ö®]›ö ‘o€ç:\ê¦VHY„S¦L‰éÓ§'­9‘)õ¶E‹Essš%K=QùÏE½.ÐF'@€‚«× ¤¬¤ˆôSHyN ¥Z Q¬ ¤,¤K/½4yM`|HPp©'F “#õ å¹D;ÕíˆaT[[[²z•?/u€4mÚ´L&¬€ñ @Á¥ž@-,éêêŠÁÁÁ¤}²üË~êÏd¼HÃÃÃñ /$ír©¥¥%i½ˆÊ¤õë×'=Ç%—\’ìª0qþW .õÒñãÇãÈ‘#§|­Ò œ,¤¼®°íÚµ+yжhÑ¢¤õRO~=ÿüó~Ï®]»’>90Âþ#È› .‹ÇÖïÚµë”_WœM#^aÛ¾}{Ò¾K–,IZ/up·eË–(•Jz'°@ã @Á¥ž@Š83@Êb©ž¤ýû÷+$éîîNÚ7"í¤ˆôŸ{oo×Ç’úúZĉ+l@~HPp ,H^sçΧü:õئNšIð5"u€400‡>ë벘@J½³(‹«ƒýùÈbÉØ _$(¸z –/_MMMIkž,‹k}ãÙƒ”úIuÍÍͱpá¤5³˜üšè„Zê'°Í˜1#–.]š´&01$(¸ùóçGKKKÒš§HÛ¶mKZ?Ëëké'"ò æÏŸ“&MJZ3‹Ï~¢cO`Ë2ÎN€×ÒÒ’|âæäHÃÃÃÑÕÕ•´~=HãY¤ú [êëk#5[[[“ÖœÈRwww8p i×× $¨çŸ~Òz/¼ðÂ)ÿÜßߟ´~{xNÖ(H©hGD´¶¶&¦&ò”¾Ô××",Ѐ" @H <”ÅزòØT*•’HK–,IZoDêÏ"?#h@c @H ¼)õþ£ˆÈ|áñÌ™3“ï:[€´ÿþèííMÚsÑ¢EIëH}…p";Rï?Š0E @€:ÅR©TŠˆúœ@ŠHílRêýGÙì@ŠH ;v,vïÞ=®×¦ž@š5kVfŸ0~$¨ ,HZ¯¿¿?öïßé'ÚÚÚ’^£I m‰vêëkÙHYx›6m:ëkJ¥R<ýôÓIû®Y³ÆØ HP²dFö ¥/^---IkަÖHYHY,ÑŽˆX±bEòšã ºººâСCIû®Y³&i= 2$¨YH#{R_a«Åõµˆô‹´Ï uuu%í‘ÝÒ\¼æx¤,žÀ&@€b @È2@J=”õíµ¾Â–:@jooiÓ¦%­9bñâÅ1yòä¤57oÞ|Ö×d yƒ ê@VÒÁƒ“_9ªÕR½_aËr1tsssòEÚ&àÜ&@€:0gΜä%»víJ>}Q¿H½½½ÑÓÓ3æ÷SO eµÿhÄÊ•+“ÖËciîܹ±pá¤5€Ê 455%ÛÎ;“ï?Ѝß)¢üRê)ëGÓ§Þƒ´sçÎ8vìØ˜ßÏê l@1 N¤¾Æ¶sçÎL&êu‰vÄØÒ‘#GâðáÃI{ÕÛR©TŠçŸ~Ìïoݺ5Ž9’´§ ŠC€u¢^¤%K–$¯9š,&ÆZ¤]OO`‘:@Š(¿Éþ#hl$¨YH©¯°Í›7/³'‹®–WØê1@J}…-B€ç2Ô‰ÔÒÞ½{ǵy"ju}-¢¶Wز²¾ÂvÁDSSSÒšå~^HÐØHP'R/ÑŽ'Ÿ|2iÍZ-ÐŽ8ñdº–––¤5Ç º»»“ö‰È>@š:uj,Z´(iÍZN wÞyÉæ€Ê  N¤ž@Šˆ8~üxÒzµ š››cîܹIkÖjÒôéÓ“Ÿ}4©÷  'Û%—\’´PÔ‰,¤Ôjy…-"ý¤Z]aËzÿшÔ{¶lÙCCCg|ýù矞žž¤½.½ôÒ¤õ€ê NÔC€TË ¤ˆÚH;vìHÚ'ëëk#RO ÄöíÛÏøúúõë“ö‰0E#@€:±pá¼pV:4ZhR%K–$­7–,žÄ6Ú"íµk×&ïc ŠE€ubêÔ©1sæÌ¼QV­‚‘©ŸÄ6Z€Ô××7f°T©ÔË­Ç’z)bô=H& ñ  ŽùÛÔ©ScÞ¼y5í™zi´%Ú;vìˆR©”´ ¤òæÏŸ_óŸ% <Ô‘"HK—.¦¦¦šöL >|8úûûOùZêýGµÛ4oÞ¼˜5kVÒš§O ųÏ>›´Çš5k’Öª'@€:R«§wU¢Öû"ÒHg^cK½ÿ(¢¶Ž©§N6oÞ½½½I{ xHPGj½ch"òRï@Š83@êêêJÞ£–Rê=H§HëÖ­KZ?B€E$@€:RäiéÒ¥5ï™E€tú¤ÔWØ&Ož\Óý>©¤C‡Åþýû_üµ'°À¹A€u¤ÈWØòjq…-u€´hÑ¢šîŠÊâIl7n|ñŸ= Î $¨#y„4ãÕ(WØNŸ@J½©ÖSdY<‰í¹çž{ñŸSO -\¸0ÚÛÛ“Öª'@€:Rä ¤<®×µ··'Ÿæ©ÅR-e14òÔµÁÁÁذaCÒÚö@1  ŽÌ›7/¦L™’÷1ÎÐÒÒ’K€ÔÚÚsæÌIZóä ¤ÁÁÁصkWÒúµ—,YmmmIkŽH7nŒãÇ'­-@€b @ijj*äÒâÅ‹“‡ã•zÒÉHÝÝÝ144”´~­ÿüZ[[cÅŠIkŽHžÀçÔ™">‰mùòå¹õN½éä ¤®®®¤µ#ò¹†xñÅ'­·aÆ À9D€u¦ˆRê —‰H=ÔˆÒªU«’ÖëíííÛ·g y“ êL¤Fš@:ù ›ilÏ>ûlòiñâÅÉwZi ÎN•åRê'°µ´´Äù矟´æxd ­]»6ž{5]_€â @)âíFš@:|øp DDúéüóÏ–––¤5Ç#‹éÎ;ïŒþþþ¤5]_€â @1tªÔH¥RéÅkl©¤¼Â¿yóæE{{{Òš>ø`Òz& ÈHPgŠ µµµå:•z)â¥=H©w åù9¥~[ê飙 êÌܹscÆŒyãEK–,ÉåZÖˆÔH'ö GwwwÒºIëMDרR[½zuÞGÆ @€:T¤)¤+VäÚ?« ¤Ý»w'Ÿ²És©èR{{{Ìž=;ïcc @*R€”çþ£ˆì&Rï?Š •“w ”'@€:T¤)ï¿øwttDSSSÒšûöí‹íÛ·'­‘ïŸÛE]”[ïñ¸à‚ ò>P† êP‘¤¼ÿâßÖÖ³fÍJZsß¾}ÉhGä»é /ŒÖÖÖÜúŸMÞA$Pž êP‘¤ /¼0ï#$߃´wïÞä ´›ššbÑ¢EIkNĤI“ Òùl€ êRÞS?'+B€”zÒÞ½{“_a›?~Lž<9i͉*ò5¶"ýLg @Z¹reÞGˆˆˆyóæÅܹsó>Fò ¤}ûö%_¢çõµ_|qÞGSÞËØ€òŠ{SgggL™2%úúúr=ÇË^ö²\ûÈb)µ"\;,êRsss,[¶,ïce˜@€:ÔÜÜ\ˆ1E¸¾Q;òÜ4¢¨H‹-ÊýzPž êT®±%@J=tðàÁèééIZsñâÅIëUbÕªUyaTEC€òHP§Š å [ê ¤,!@Z°`A´··ç}Œ3X  Å'@€:%@zIê ¤,a‰vDÄå—_ž÷Î` ŠO€uªRQ®°™@¿"HEù9Æ&@€:•÷>›ùóçÇìÙ³s=Èz˜@*J€ôò—¿<ï#œ¡(“lÀØHP§V¬XS§NÍ­‘þÒ_ô ¤¹sçÆôéÓó>FD˜@*#@€:ÕÜÜ]tQný‹DtttDSSSÞÇSQ¦""Ö¬Y­­­yãE…\ì œJ€ulõêÕ¹õ¾ôÒKsë}ºI“&ÅÌ™3ó>Æ˜Š²@;"bêÔ©…š+ÒY€±  Žå i)¢Ø{–,Y’÷NQ¤?;ÔÔ±¼¤¦¦¦BM E{R‘&"Š ÙõA€uì’K.É¥ï’%KbΜ9¹ôK‘'Š éIl& > Ž­Zµ*—'±i‚eD‘'Š´D;¢X’ $¨$¨c­­­qÙe—Õ¼o=ϦÈHE /^\˜'Ÿ™@€ú @€:÷ÊW¾²æ=‹ y©hK´#Š1E6oÞ¼Â]…F'@€:—G€T„ðátE@š={vÌž=;ïcœ¡ר֬Y“÷€q @{Õ«^UÓ~Ó¦M‹U«VÕ´çxuiéÒ¥yaTE‹ö$?`l$¨s—]vYLž<¹fý®¸âŠhmm­Y¿ñ*êRQ¤Z£ @ý @›2eJ\qÅ5ëwå•WÖ¬×D˜@š˜K/½4¦OŸžëЏK  Àë_ÿúšõúÅ_üÅšõšHÓÚÚ¯~õ«sëßÔÔd êˆ ÀÕW_]“>­­­&&¨ˆO`ñÚ×¾6·ÞË–-‹Y³fåÖ˜4€_üÅ_ŒI“&eÞçu¯{]a»>yòä˜1cFÞÇ8òeËò>˜^÷º×åÖÛõ5¨/$hÓ¦M«É5¶›nº)óÕ(â’ ¤Ñ  ¾ AüʯüJæ=Š mRKKKtvvæ}Œ1uvvÆŠ+rémÿÔ4ˆw¼ã™^c[½zu¼â¯È¬~ óæÍËû§X´hQ´¶¶æ}Œ²®½öÚ\ú¾ò•¯Ì¥/P4ˆöööxãߘYýßú­ßЦ¦¦Ìê§0þü¼pŠ¢>ídyHsçÎU«VÕ¼/P94ßùßɤîôéÓã}ï{_&µS*Ú’it¯}ík F§ @¹îºëâ­o}kòº·ÜrKÌž=;yÝÔH×ÙÙ]tQM{æ¹¼¨Œ Ìg>󙤻֬YŸúÔ§’ÕËRÑ®°ù l'»ñÆkÚ磌®ªi? z$h0/{ÙËâCúP’ZS¦L‰Ûn»-¦M›–¤^ÖŠ6´lÙ²¼0.o{ÛÛjÖkÊ”)qå•WÖ¬† Э·Þšd·Í_ýÕ_Åå—_žàDµQ´©^&^ÿú×G{{{Mz]uÕU1uêÔšôÒ @š>}zÜyçqà 7T\ãƒü`ÜrË- O•½¢]a«‡H­­­ñ¦7½©&½²|R 4¨©S§ÆwÜüà'4ñ±råʸ뮻âsŸû\†§ËF‘&fΜsçÎÍûãö«¿ú«™÷hjjŠw¾ó™÷Ò @›ðÄ-·Ü?úÑâ'?ùI,X° :;;ãüóÏÎÎÎX°`A´µµå}Ԫ͛7/¶nÝš÷1êfÿÑˆæææxÿûß¿û»¿›Y÷¼ç=™Õ²%@€sHsssÜpà UíF*º¢Hõ²ÿèdÿîßý»¸õÖ[ãøñãÉkwtt Ž¹ÂÎê… IDAT4”¢,Ò®ÇéüóÏüã™Ôþä'?³fÍʤ6=ÐPвH»¤ˆˆO|â±zõê¤5;;;ã·~ë·’ÖjK€4”¢L ÕÛ¤“'OŽÿù?ÿg455%©×ÚÚŸýìg'ô$@ xH@C1T½k¯½6þãüU×™—]vYL™2¥&½ò @Öe—]V“>ÿê_ý«šôÈ‹ hXsçÎÎÎÎÌû\qÅ™÷È“ hhµ˜B N€4´¬÷ ͘1#V¯^i€¼ €†–u€ôš×¼&ZZZ2í7ÐÐ.¿üòLë¿æ5¯É´>@€†vùå—G{{{fõ¯¿þúÌj… hh---qíµ×fR{æÌ™qÍ5×dR HH@ûá†2©û¦7½)&OžœIm€"  ï—ù—cöìÙÉëþú¯ÿzòšE$@^{{{ü§ÿôŸ’Öü…_ø…Ì&›ŠF€œ~çw~'é2í[o½5Y-€¢ ç„Ù³gÇG?úÑ$µ®½öZO_Î)$àœñ‘|$Þüæ7WUã²Ë.‹Ûo¿=Ñ‰êƒ 8gL™2%¾ýíoÇ{ßûÞŠÞÿ²—½,~ðƒDGGGâ“ñÿ±wŸqQ\ïÛÀ/ª‚€¨ˆ5Æ‚bGÅØb‰‚b7нw`Ɔ+ú³—Ø{4`ÁÄX"VbŠ5jD± JéÌó"ü5;»0³eváú~>û™=37ãîÌœ{ç܇ˆˆˆŒHDDD”«XZZbÓ¦M2d,--³ÕÆÆÆ¾¾¾8yò$Š+¦ç‰ˆˆˆŒHDDD”ëXXX`Íš5ˆ‰‰Á±cÇ0qâD¸»»ÃÜüó[#www,]º‘‘‘رcJ”(¡PÄDDDDÊÊÞÏnDDDD9P¾|ùàáá‘Y;** ¡¡¡¸ÿ>:vìWWW…#$"""2L ýNNNèܹ³Òaa#""""""""˜@"""""""""˜@"""""""""˜@"""""""""˜@"""""""""˜@"""""""""˜@"""""""""˜@"""""""""˜@"""""""""˜@""""""""",•€ˆˆr‡ŒäĆý¬tDD9Zòó{J‡@DD9HDDdi±¯ñtÉ·J‡ADDDDD2piÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄiÄid©tDDdXæ6°)ë®tDD”ƒX;}©tDD¤gL å26.uPvÞe¥Ã """""Â!lDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤HDDDDDDDD¤‘¥Òä xÿþ=âãã«t8zçîî®×íÇÇÇ#..ñññHHHÐë¾´•/_>888ÀÞÞööözÙÇÓ§OñêÕ+ÉíammâÅ‹ÃÂÂB‘éÏ;wðáÇl¿¿T©R(\¸°ÊòÄÄDܾ}[Ҿ˕+GGGImÔ‰E||<Þ¿oôŸe])^¼8Š+¦t€Û·o#11Qr»‚ ¢L™2zˆHÑÑшˆˆÕ¶fÍš07ÿ÷·¦þùïÞ½Ëv[[[[TªTIÖ~ÿ+111ó:+%SUµjUäÉ“Gíúëׯ#---ÛÛ+R¤J–,©‹Ð÷ðáCÄÄÄdûýyóæE•*UôQö¤§§ãÙ³gxûö-ÒÓÓ%·/X° Š/®ñsar®«¥K—F¡B…ô‘ñ“zOãèèˆråÊédßì£h'>>>ó>.>>^§Û66ê>wr¾ó9…££cf?/oÞ¼J‡cT„ì¾V¯^-äv‰‰‰Â¾}û„1cÆM›6³}ürÊ+==]'ÇòŋŽ;„áÇ 5Š-ªøß¦ÍËÌÌL(Z´¨Ð¤IaĈ®]»„W¯^i}œüýýµŠËÚÚZ¨P¡‚àëë+¬_¿^xùò¥þ÷ô«F’þÆU«V‰nçÆ’×dÅüæÍaíÚµÂÀ…Úµk yóæUü3©ÄkÖ¬YÚü×ëÔܹseý NNN»wï”_gZµj%ë8´oßþ³ítêÔIRûZµjÉŠ7--Møõ×_… &-[¶œÿ\úõðáCǨP¡B’¶ççç'ëÿµk×NÒß^¡BEã=zô¨ÐºukÁÆÆF'Ÿ2eÊß}÷¡Èß#纺eËEb5îîî’ŽWÇŽeí‡}íú(qqqÂÖ­[…aÆ 4ìììÿ{ ùòññ=.r¾ó9ñU¢D ¡m۶´iÓ„Ë—/Ëþœ£Õ«WK=ÙsnN EDDC† É•'ãÿ¾´99''' [¶l7n,˜››+þ·èûeaa!4mÚTرc‡’’"ë˜i›@úïËÚÚZèÚµ«pãÆ ÙÿúfJ ¤3gÎíÚµ¬­­ÿ¼Ã˘H‰‰‰B™2edýþþþJ‡¯¿þú«ìóÄýû÷?Û–¾HoÞ¼üýýMþÇ]¼˜@RÏ”H³gÏÌÌÌôò±±±V¬Xa𿉠$éô@båÿ^rú(áááB=[[[ÅãWòÅ’´WõêÕ…uëÖéìÁ %IM ±RÒÓÓ±dÉT©Rk×®•ôØ4}n×®]pqqAŸ>}púôiddd(’Þ¥§§#44=zô@… °wï^¥CBJJ ~þùgÔ¨QƒF\\œÒ!™¤˜˜ 27Æ’’¢tHôyóæÅ‚ dµ]¾|9>|¨ãˆ +55~~~²ÚŽ=...:ŽH½­[·¢R¥JX¼x1^¾|i°ýéËâÅ‹1uêT‚ —í'&&bäÈ‘˜3gŽ^¶OÆ}í$%%aÊ”)¨U«vìØ!i˜!Ñ70xð`4mÚ÷ïßW:ƒbIƒ””téÒ~~~¹¦~‰>ÄÅÅ¡sçÎðõõEdd¤Òá(&""]»vE÷îÝbuFFÖ¯_777üùçŸJ‡cRž>}ŠúõëcݺuzëntîÜ7–Ü.%%&LÐCD†³zõjܽ{Wr»Â… cêÔ©zˆH• 5júô部¨(ƒì“HßîÞ½k°ïÐ?ü€£Gd_d<ØGÑNll,<<<0wî\¤¦¦*™°3gΠnݺ¸xñ¢Ò¡ H >ÁÁÁJ‡aÒÞ¼yƒfÍšá—_~Q:£±{÷n´hÑoß¾U:ÿ&¶š5k†ŸþYéPL‡àíí-«cNÊXºtif!h)‚‚‚púôi=D¤ÑÑј9s¦¬¶³fÍBþüùu‘¸9sæ`ÅŠÙ‘¡ 2IIIÙ— 6l˜ÁöGÆ}ù222еkWœ;wNéP(‡x÷î|||ðâÅ ¥C1&Ô Á† ”ä%''ÃÇÇW¯^U:£séÒ%´oßÞh~õHJJB÷îݱiÓ&¥C1zÓ§OÇ7”ƒ$¨Y³&úõë'«­ŸŸŸI·1c†¬$uµjÕ0hÐ =D¤êÚµk²“\DÆjß¾}O<ÿóÏ?øßÿþgÐ}’rØGÑÎêÕ«ùÔéÜ«W¯0}út¥Ã0&Ôøá‡”ÁäM™2…C£48sæ f̘¡t™2220hÐ ìÚµKéPŒÖË—/ù´„‰š={6ìíí%·»rå ¶oß®‡ˆôçöíÛX³f¬¶°°°ÐqDâf̘!i*z"c—””¤ØÐ×¹sçâÕ«WŠì› ‹}ù’’’0{öl¥Ã jÓ¦M¹b„H"nß¾k×®)†I»uë ˆE‹UáµôôtôíÛ'OžT:£´ÿ~0QE‹Å”)SdµýþûïMªÆ„¿¿¿¬ÄŒ<<<ô‘ªØØXüúë¯Ù‘¡,Y²=Rdßqqq«»DÊaE;'OžäD ¤7iiiؽ{·ÒaèH"~ûí7¥C0yóçÏç/ËÙ’’‚… *ÆgRRRо}{„‡‡+ŠÑa‡×´;åË——ÜîÙ³gX´h‘"ҽÇãÈ‘#’ÛY[[ô\tüøq£ÂK¤ ¯^½Â¼yóaãÆ¸r劢1~±¢?Ò·cÇŽ)‚Þ1$âÌ™3J‡`ÒâââŒbºzS±sçN£›:4..>>>ü•æ?xn0mÖÖÖ²;x .ijgÏt‘n¥¦¦bܸq²ÚŽ9*TÐqDêñ»D9ÍäÉ“§h ²ÏdxîÔéÛÅ‹‘’’¢tzÅ’všµsøðaó‘ !!¿ÿþ»Òa¨ˆˆˆ€Ñ%·”’””„˜˜¥Ã -uìØM›6•Ü.!!Aö8CYµj•¬±÷NNN¯©Áë,å$W®\Á–-[”Š   ¥Ã =á¹S;<~¤oiiiˆŽŽV: ½²T:côæÍÉm,--Q³fMƒM}¬$333ëÏž=«ÕöóçÏWWW888hµC‰Å½{÷´úåñìÙ³èСƒNâ)Q¢\\\ÈÈH­fºté|}}ñË/¿¬°®±’s^þ}êÅÍÍ-Wœ lÙ²J‡¥%K– víÚHOO—ÔnÛ¶m5jÜÝÝõ™|ÑÑѲg4›5ku‘fr¾Offf¨^½: .¬‡ˆŒ‹Ò!P6 ‚€±cÇʺÖZ[[ÃÝÝùòåSY¿þúKVL&L€··7òäÉ#«=/öQ4ÓÔGQQQ’·innŽêÕ«ÃÉÉI›ÐŒž›››N·•®ÕoÞ¼Á7 ‚ävÅŠÓSTÊcIDll¬¤÷ñÅ8sæ ¾üòK=EdZäÞðôìÙcÆŒ»»{–I*c“‘‘K—.aéÒ¥²Š§]½zUg±´nÝëׯ<}úË—/ÇÚµk%®?:pàüüür}Qt9ǯD‰8}ú´I$Ur“5j ÿþ™ß“ìÊÈÈ€¿¿?BCCõ˜¦OŸŽwïÞInWµjU 4Hi&õûäàà€S§N¡FzŠˆHž½{÷ÊS«V-i¼wfϞׯ_KnGÆ}ùäÜÇuëÖÉ£\®N:hܸ±¤6r>k¦„ $à£æŸ{õꕤ÷»»»cäÈ‘zŠÆðüýýQµjUImô=&»D‰ Ѫ†‹ŸŸöï߯èr¾/¾øBéH"EŠÈþ>Lœ8Ѩ $úùùÉšõ²M›6ðôôÔCDºÇë,£ÀÀ@Y?-Z´(ÛÃaÜÝÝ1vìXÉûˆ‹‹3xm32>ÀÇÇ=ÒqTD†—'OYCN‡ÀÉ)Æ©K©©©ð÷÷—ÕvĈpuuÕqDD¹Ç÷ß÷ïßKnssi·ß¼¯ôôtøùùInGDD¤H:œœ¬tddŒ¹Ž“™™Ö¯_/ù)©^½zoooY{‰ŒM‡мysÉíbbbdÏz¦++W®Ä½{÷$·+T¨¦M›¦‡ˆô‡×Y2&—/_ƶmÛ$·ëÔ©5j$kŸýû÷—5KÒüÁáç¹ÏDÚ“ZÓÈÎÎNO‘&tàÈ‘#ˆŽŽV: ¢l³¶¶FPPì'îܹƒŽ;U"¹aaa!¹Ýš5kpçÎ=D”µ¨¨(Ìš5KVÛ™3g¢@:ŽH¿ÎŸ?Ï'É(‚€ï¾ûNò°ó ‘vAüc]vkÜ™*ÃO½’=xð¥K—F£FP´hQY³e(ÅÞÞööö°³³ƒ‹‹ ÜÜÜPºti¥Ã"(X° BBBP¿~}YCqBCC1`ÀlݺըŸ¸"ÊŠ›› €uëÖIj—––†ñãÇ#$$DO‘©7cÆ YOV®\C† ÑCDúõöí[TªT 5BñâÅ‘7o^¥Cʶ|ùòe^gK—.5j \¹r’‡1‘qسgÎ;'¹Ý¨Q£dÕ\ûTóæÍÑ®];8p@R»`ùò岇¼’ébE;‡³gÏ ºO¥ >\ÖSŽb>|ˆ+W®èd[JJHHÀ–-[pãÆ Ií˜@Ê…äœ\ß¿ß~ûMÑž££#<==ѳgO´jÕʤ.6$‹‹ ‚ƒƒááá!ë1çíÛ·£L™2²Ÿ„ 2سgbcc%µ;|ø0Ž;†–-[ê)2U·nÝÂÚµkeµ]¼x1,-•¿ô˹®$''ãøñãzˆÆðò厦M›¢Gh×®lmm•‰²!11'N”ÜÎÉÉI«YP?µpáBüöÛo’Ÿ( @ïÞ½Q¸paÄAÊ`Ű}”Ë—/ãòåËz݇±ðòòÒY)7×^sqqÉñ×tþü%ÂÙÙY郟þ>>>øòË/±k×.¥C"=jذ!6nÜ(û)¢€€lÚ´IÇQ–³³³ì ýýý‘žž®ãˆÔóóóCZZšäv^^^hÕª•"’.·_gpøðaøúú¢xñâX¾|¹A?C$Ï¢E‹ðäÉÉíf̘!yr uÊ—/Q£FInkrµÏHUn?w²BÆ®E‹J‡ wL ‰(Z´¨Ò!/^À××­ZµÂÛ·o•‡ôÄ××W«‚ÀC† É1OPî5zôh¸¸¸HnŽ 6è!"U!!!8zô¨ävVVVX¼x±"’‡×Ùÿ‹Ñ£G£^½zxüø±ÒáÏž=“UèR¥J:6:uêTYO­_¿ááá:… ‹çÎÿÃ> £o¾ùFéôŽ $_ýµÒ!ßÿÍš5C\\œÒ¡žL:½{÷–Õ655;wÆÍ›7u‘áX[[cÑ¢E²ÚN›6 ñññ:Žès©©©7nœ¬¶Ã† CÅŠu‘|¼Îªº|ù26lˆ§OŸ* ‰˜ ‹2eÊ mÛ¶J‡¡wL ‰èÔ©“Ò!¥7n`À€J‡Azbff†õë×£I“&²ÚÇÆÆÂÛÛ/^¼ÐqdD†Ó®];Y¿zõ ?þø£"ú?+V¬<ðoÁüéÓ§ë!"ù|||X_OÄÓ§Oѹsgg32/^ÄöíÛ%·óôô„———" „ªU«Jnwüøq|P: Ò##oÞ¼²Ú‡„„`ذa:ŽŠÈpæÌ™#ë©={öàìÙ³:åöíÛX·n¬¶‹/6Ú¡bŽŽŽ8zô(Š/®t(FçÎ;xøð¡Òaäz‰‰‰˜bIƒæÍ›ãøñã¨P¡‚Ò¡•¤¤$„††*éYÆ ±aØ™™Éj¿~ýz£šõ‰HŠ‚ bÊ”)’Û ‚€ñãÇKî¢Éwß}‡´´4ÉíZµj…Ö­[ë,}¨Zµ*NŸ>¯¾úJéPŒÎï¿ÿ®t¹ÞÂ… e Kýþûï 6[–‹‹‹¬lbbbŒ®6eû(âØG!C¨R¥ þ÷¿ÿáÑ£GèÕ«—Òá\îI•ÉôÕW_áæÍ›X·n-Z„ˆˆ¥C2 ’I9r$Ö®]‹¿ÿþ[R»?ÿü»wïF÷îݵŽáСC²j:XZZšL·²ç.Ù IDAT\¹r¸pávïÞ9sæàÖ­[J‡dxUÖÓ§O±`ÁÉíòæÍ‹%J`ïÞ½zˆJ\åÊ•annŽŒŒ IíÖ­[‡áÇ£J•*zŠŒô‰}q>>’ÛNž<íÛ·‡ìý§¤¤`ܸq²Ú:•+W–½oC333C÷îÝѽ{wܽ{AAA8þ<îܹƒˆˆÉ㜀×YeMž< ’Û%%%¡wïÞzˆH÷ÒÒÒàççǧÝLû(ªxîT^§NàââbÐ}=zýõ—ìö*T@HHòå˧èr&&$rww‡»»{æ¿ãââ…wïÞ!!!Á¤fµHHHÀ£G°~ýzܾ}[R[Ž›Ï=ÌḬ̀~ýz<~ü§N’Ü>11>>> C¹råô!‘þ´mÛ-[¶”üÐãDZdÉ|ÿý÷²÷½råJÉO?ÿÎp6cÆ ÙûUZÅŠ?;n>|ÀË—/‹„„$%%)4‰‰‰xöì6oÞŒ .HjËë¬r.\¸€;v(†A=z!!!²Šq“qaå_º|˜I$ XD›P¨P!”(QBé0ÈÈ,X‡†“““¬ö÷îÝCûö표œ¬ãȈô«jÕª}^^^xÿþ½#Ë9˜@"’“Xȉu¤ð333“”1´† bãÆ²/è»víÊuÃÈô999Ézš(==þþþ’ÚŒ;VÖ#øžžž¬cB¤… àéÓ§J‡¡ˆwïÞ™tí4"¢Š/Ž'N téÒ²·Á$’zL ‘NY[[ÃÒRZi­ß~ûMÒØfc—œœŒ#GŽHjckkkR¿°øúúbæÌ™²Û/[¶ C‡ÍQÿïbXÃ$g1b\]]%·;~ü8:”­÷8pÇ—¼KKKJnGDÿŠŒŒÄÂ… •CQkÖ¬‘\°8;rã,Š”3ð>Ît•*U üñ¾øâ ÙÛ8sæ “H"˜@"‚€¸¸8m¯xñâ’ÞÿàÁŒ=ééé:‹A)iii6lž|x–ÃC¢££e×/èeÛ¦"--Mò“Ù!gò "@÷}©xgÚÊ”)ƒ'N X±b²·qæÌ´nÝšI¤O0”ËÅÅÅaúôé’o.5=-#g¶œ5kÖ V­ZX»v-þþûo“Êø§¥¥áîÝ»X¹r%ÜÜܰiÓ&ÉÛ0ņÌḬ̀~ýz4iÒDö6._¾ŒjÕªÁ××gΜQô&!+’Û¬Zµ ûöí3©Ï3iæíío¾ùFr»§OŸ¢Y³fj§r¿|ù2š6m*i–®µz"ô+)) «V­’<µ°¹¹ú[4©ç£}ûöaß¾}&ýCMrr26mÚ„sçÎIj§é8~†]»vÉ -G9rä~ýõWµë³s<ÿkùòå8xð IþÈðtÝG‘sŒÕ«WsV¾|yœ8qÎÎβ·qöìY´nÝñññ:ŒÌtIk”‹œ:u :tP: ½AÖ,?4NÅîîîŽÐÐPÉÛ¼qㆠàßáööö²b3´¸¸8­oŠj×®­£h ËÚÚAAA¨_¿¾ì_SSS±k׮̛÷üùóe–_δ艉‰èÒ¥‹I}žµÕ¦MlݺUé0ô*00nnn’ƒááá¨W¯òåËkkëÌå)))ZÍö1mÚ4Ù³#*éÑ£GpwwW: ½‹‰‰‘UóMSÑöB… áõë×ÙÞVBBºté “Ö;66VÖP(M÷+À¿÷B¬Ë÷¹qãÆ¡eË–¢ùåL&ðþý{´k×VVV°³³ÓEˆF+""Bïß1öQ4S÷·µµ… ³½­ŒŒ >#GŽDþüùeÅc*J”(ððp¥ÃЋJ•*áØ±chÞ¼¹ì'r?&‘~ûí·\sO¯Hj¤¦¦âÝ»wJ‡a´ .¬v]Ó¦Meóø(---Wÿ¦M›*‚l ÄáÇQ¿~}DWr˜‡&… ‚™™™¬NFnú<ç†iO+W®Œ¡C‡bÅŠ²Ú'$$èì8U¨P#FŒÐɶ -===×|/äÐt•›0ÌÇ\Óq€íÛ·ãâÅ‹’·k*É÷ïßK®7xçά^½£GVYçää$ûZ˜î­ ‘ˆÌ ÇQY;###%o3###ÇsS8Ÿi£zõê8zô(Z´h!;9yîÜ9&‘ÀÉT²dIµëZ¶l‰üùóm"ÀØ899™t \\\ û˜¯¥¥%J”(‘kgè¡Ï͘1;vìPü†rÑ¢EŸ=ÍD9‡¦ël©R¥ ‰iÓT@5!!“'O–µÝ¥K—Ê®YfHË—/MeeæÌ™èÙ³§ÊÓÖÖÖpvvÆ«W¯t"‘Neu@¢œ¡V­Z8rä<==e—Í8wîZµj…#GŽäÚ$k ‘dæææhÖ¬™ÚõyòäÁÀ ‘i2dˆä™ëŒQÆ ±uëV“šMNª-Z(‰B… aúôéŠÆÐ¼ys´mÛVÑH<<|8*V¬¨È¾-,,°téREöMúçì쌚5kª]ߪU«¬×kkkµ ¤'OžÈn¿hÑ"Ñú@ÆÈÒÒ .”ÕvõêÕ¸sçŽÊr///mÃ"Ò‹¬ú(¼#¨_¿>8[[[ÙÛ C«V­re‰ $’¬ÿþY¾§xñâ˜;w®¢1m ,Ȳ>ƒ©ùá‡0dÈ¥ÃÐ )RDé0ÈHXYYi]ïM®Aƒ¡ZµjŠì›ô¯_¿~g»*Z´(Ú´icÀˆLS—.]Ôþ˜5qâDIÅt?òðð€···¶¡T«V­d%}RSS1nÜ8•åíڵ˲89‘²ê£Ô©SnnnІŒY³fÍŒ¼yóÊÞFnM"1D’T®\9[ $1b|}}õ‘éêׯŸÉ</ÕÊ•+ñí·ß*†ÎÙØØ @é0Ȉxyy¡U«VÝgþüù1kÖ,ƒî“ §H‘"˜0aB–ïûñÇYÿJ[[[µß“sçÎaÏž=’·iaaE‹iš"/^,ë©©_ýGŽùl™½½½âCx‰þ+;}333,\¸OpÀÓÓûöíÓêZ–놳1DÙfgg‡;vdûKfff†Í›7£K—.zŽÌôøúúbݺuJ‡¡7عs§ÉÎ¥ÉÀѵkW¥Ã #hÐŽü´iÓrÜ“‹ô/KKKlÙ²%[OwT©RˆÊ4­Zµ eË–UYž‘‘±cÇÊš-«oß¾&ûôBÅŠeýö÷÷GZZÚgËFŽÉld4¤ôQZ¶l)údåNÞÞÞØ½{·VÃ’ÿüóO|óÍ7¹f)&([òçÏÔ¨QCR;+++ìÞ½³gÏÎ…¢µeee…ùóçcûöí9þx˜››cÅŠX·nVcŒ™™¶nÝŠŽ;* ‰J•*aÊ”)ÙW½zõdͨDÆ/Ož<رc¾ùæ›l·1bæÏŸ¯q¸[ncnnŽåË—£OŸ>¢ë·mÛ†K—.IÞ®É?:}út899Inwûöm¬Y³æ³eæææØ½{·É 磜GNeÞ¼y9r¤£"SÒ¡ClÛ¶ ²·‘›’H¼ã ,µoß7oÞD“&Mdµ777Ç”)SpýúuxyyåÊÇFÍÌÌàããƒððpL˜0!WƒAƒáêÕ«9ªèfžlܸ‘u 0yòd4lØP¯û(_¾<‚‚‚r|ò97jÔ¨®^½*ëéÆ &àôéÓ¨R¥Š"3-5jÔ@XX˜ÚŽáû÷ïñý÷ßËÚö„ P¬X1mÂS\dOt1cÆ ¼{÷î³e¶¶¶8xð V¯^ GGG]„H$‰Ü>ÊÇDóÁƒñÅ_è):2%ß~û-6mÚ¤Õ2.\ÈI$&H” ºuë†cÇŽ!88%K–Ôz›•+WÆáÇޱcÇ¢T©R:ˆÔ¸•.]ãÆÃíÛ·qàÀ¸ºº*’"\]]qøðaœ:u ¾¾¾Z¬3fffèׯîÞ½‹¹sç*6+++9rDo‰Ò:àüùó&ߥÿcee…6mÚà—_~Á©S§P¹reÙÛúúë¯qõêUlܸMš4ÉU?R˜››ÃÃÃ[·nÅ¥K—P§Nµï7ož?.y%K–„¿¿¿6aÁƒËJ6FGG‹Ö”277ÇСCqçÎÌš5 åË—×E˜Djé²Ò¶m[ܺu Ë–-ƒ»»»£$SÔ«W/¬[·N«kè… àé陣“Hü3³°°€ƒƒáàู¹ÁÍÍ M›6…ƒƒƒ^öû±nC`` îÝ»‡óçÏãÖ­[¸{÷.^¿~¸¸¸ÌWBB‚^bЕ|ùòÁÁÁÈŸ??œQ±bET­Z 4àÔ4nÜ7Æû÷ïqöìYœ>}wïÞÅÇñòåK$&&">>^é0%)\¸0&OžŒÉ“'㯿þÂ¥K—ð×_áæÍ›™Ÿçøøx£ÿ,“öòåˇuÿþ}œõéõoçÎxÿþ½^÷÷‘µµ5 (€ªU«¢\¹rY¾ÿǸ~ý:"##£÷øZµj…R¥J^½z…¨¼ÇÇÇ'óü±mÛ6Ñs®!Ô©SÕªUömÛT¾›Àç×X9±}ûvÑÏnûöíáìì,{Ûÿ•œœŒððp<~üñññ¢T–––°··G©R¥P­Z5ØÚÚf»í³gÏpýúu¼}û>|Ð:MªW¯ŽzõêÉn/õžÓ^¾|‰7nàÝ»w:»÷Ï—/P©R%”+WfffjßûÓO?‰ÞË.\E‹EíÚµaee¥uL·oßÆÙ³g?[fmm¾}ûø·¢õ~²ÃÆÆööö(_¾<*V¬(ùÞ,::ׯ_Gtt4Þ½{§³˜P¡BT¨PAcLê®G Ìü?Ë›7¯Ö1EDDàèÑ£*Ëû÷ïKK¦(ŒÝ×êÕ«2->|~üñG¡|ùòÙþ–û*V¬˜0qâD!::Z%ŽÄÄDÑ6ÿûßÿôòwoÙ²EtŸ½/::Z6l˜`oo¯÷ãóéë×_ý,ޏ¸8Áßß_(P €AãØ¾}{f ¶¶¶ßëèè(Œ1Bxûö­Vÿ7ëׯWÙ¶­­­VÛAøî»ï²ü{5j$\¼xQë}}êĉÂW_}•å¾÷ìÙ#yÛIIIBË–-³õY¥JáŸþ‘¼W¯^ô3÷ñeff&4iÒD¸|ù² ‚pýúu!_¾|*ïË›7oæ{䨼y³èþ]\\´þ,8Pe»*TÐj›š888¨ìoüøñ™ë;vì¨ñ˜[YY ^^^Bxx¸VqDFFŠnÿÔ©S™ï±³³SY?mÚ4AaòäÉ¢í¿úê+!##C«ØÄ,]ºTt®®®BJJŠðáÃá‡~ .lÐïÀÒ¥K3c,Uª”"ßÃÊ•+ ¿üò‹èq{ñâ…Я_?ÁÆÆÆ 1:t(3†sçΉ¾çÌ™3™ïqvvV䨿Î+‚ ¬Y³Fíg,66Vög·gÏž¢ÛíÖ­›Î¾+çÎ:tè X[[ëõXYXX­[·Ž=ª1žßÿ=[×T]¾Æ§Õ1Ìî=§¡$'' ‹/*Uª¤÷cçìì,øùù ¯^½ÅÒÒRcû £GÞ½{§Õß¼råJ•m;::f®?qâ„ÁÏaÀ€Âýû÷5ÆŸžž.¬[·N¨U«–Þcrtt†*>Þ  ±—”ÒÇW‘"E„ .Èþ¿Q2üÛ‰Þ·oŸÖûAX¾|¹`nnž­ýÊI M›6MÒÿgÍš5…ÔÔTIûP*ôñ•7o^áôéÓ‚ ÂÞ½{333•÷”.]ZˆŠŠ’|ü.]º$äÍ›We{öööÂÍ›7%oï¿L-ôéw`ÅŠ²ãÐ6'+VLtÛ¶m“€DDEE©MÌ:tHHNNš6mªÈgßH_«V­Rù?V*&SL ‚ :Tô=:t•ìQ—ø¬Q£†Î:XÓ§OÏö5L—¯#Fˆ“ 6ˆ^ôýÊI ¤çÏŸ Õ«W7ø1trrʼ–*«ÒÇWñâÅ…+W®Èþ»5ôñekk+ìÚµK4öØØX¡Q£FÉÎÎNØ¿¿J<Ù=÷(P@8~ü¸ìÿ3&Œ‡Ôk åP)))hݺµÊð Cxùò%¼¼¼ðúõkƒï[Š™3gâÞ½{J‡E‹áêÕ«J‡‘m¯^½‚‡‡‡Ê£Â¦"55}úôê#Åùóç1f̽ 3|üø1.\(©Í_ý…õë×ë%}IJJÂСC;wÆ”)STÞ___ICŠ^¿~N:© •233Ö-[P¥Jí7a©©©9r$æÏŸ¯Èþííí1gÎÑußÿ½N‡«LŸ>]t€§§'Ú´iƒµk×"44Tgû3UãÇÇ›7o2ÿ=iÒ$Ñ!¥¤Þ²eËиqc•åÁÁÁ’¿k¡¡¡7nœÊr'''K ¦Î† 0sæL½•³råJÌ›7ï³eoÞ¼Á˜1cô^B 'KOOGÛ¶mqãÆ ƒï;** mÛ¶Edd¤¬öÏŸ?GóæÍ¦ãȌÇлwo\¸pAe]÷îÝqæÌƒÇôþý{tëÖ ×¯_—ÕþÝ»whÓ¦ >¬ãÈÈØ1”CmÞ¼·oßVlÿQQQŠuN²kÏž=J‡Ø½{·Ò!HܹsGéPdIHHÀ!Cd·OJJ€ôzã=aÂYu=¦OŸn:%ºtûöíÌÏÒÌ™3áãã£òž£GbÚ´iÙÚ^ZZ¾ýö[ÑðÔ©SÑ¡CíÎ!&OžŒÍ›7+²ï>}úÀÝÝ]eydd$/^¬“}ܾ}k×®UYnii‰ÀÀ@ÆsPZBBŽ9àßZ8ÁÁÁ Gdz¬¬¬°wïÞÌúMŸš:u*Ž?ž­í>^eÝû÷ïqìØ±ÌIÔ} ( k )ô9Á†!iº÷/V¬Š)¢“{ÿ¨¨(<}úTô©àýû÷cÍš5 kkº·ŒŠŠ‚——ÂÂÂàää¤u¬YÑǽvll,?~¬2‘œ:u ÑÑÑ™÷Wš’õ… F±bÅtRd<&&Ož<éèÑ£HHHÐø/Q¢Eϵ>|@Û¶m†2eÊh+™†lwc $ÓQ´hQ•ÿ¿bÅŠi5¾XG©o#‚ñÕ@zöì™èú3fè%uÔ—Ñ£G4A¯´mÛ6!99YXµj•ÚBãuêÔ‘4^Ù5zôè!$$$žžž¢±»»»K®Mñþý{µ57Æ'ddd† :åIDATeÊ”QY—ÝHééé‚»»»èöwìØñÙ{ÃÂÂD ÜZ[[ ÿýw¶ö§®Ò¦M›$—ìJNN-V¼sçÎÏÞwÿþ}ÑÚ5ùóçîÝ»§vû[·ný{\]]3ÏGºb 5zöì)‚ üñÇjk¾9::Jª ¥m ¤OuíÚUt[ýû÷×âH BHHˆÚ¿õÍ›7ãôõõÕjßrˆÕœ9r¤Þö×¢E •ýùûû ‚ áááÙ:ÿBvj É!V\¸_¿~:ŠZvíÚ%ZË端¾Õ¶ëÓ§èßÛ«W/Å&êë+Mœ8Qc|r¤¤¤ .ÝߤI“2ß'v Ï“'ÖÅ• ÁXj ¹¸¸¨Äàää$„……é|_‘‘‘B:uDÿî§OŸf¾O¬Òž={„¤¤$aùò墓g4h é³(·Ò¥K—tz\>ŠŽŽ:tè ºÏ“'Of¾¯qãÆ*ëmmm…ß~ûMç1½~ýZhݺµhLŸÖ®»-Y²DHKK¶nÝ**THt•*U’49 k Ö@"²ºG¨U«–Î÷UºtiŒ=Zt]TT”Î÷§O%K–T:Æðï4¨Ã† ÃÑ£GE¸xñ"zôè¡H…ì°µµÅ®]»àè訲îÊ•+8xð ¤í­\¹RôéµZµjaþüùuËŽ-[¶ˆ>‚Þ¡Cøúú~¶¬^½z˜4i’Ê{SRRDëgkkël=Ùáââ‚Ý»w«üZ‹N:‰u¸zõªèÐDìß¿_ò“ 9I³fÍpþüyT«VMe]LL ¼½½EŸJÑ·ùóç‹>ñ¹yóf\»vMÖ6SSSáïï/ºî‡~ÈòWm}<õcläü²_ @=D’3uëÖ 'NTY~éÒ%Œ5J´Íòå˱eË•åîîî¢C1µ!vhii‰3fèü l+++Œ7… VY—Õ=¢èµ›Ä‰ý¿vîÜõêÕÓù¾J–, ???ÑuÙ¹÷Ï“'Fމ#GŽÀÆÆFeýùóçÑ»wo£½·ÌJÁ‚Õ ûôøˆýŸyxx U«V:©páÂ*CèÄbRǽzõ©S§DG0ܹs;vDJJŠÖ±’qc)‡{DQŸã«ë˜ñ$’sÔ«W;v쀹¹êicÿþýj;lÆ `Á‚jã›1cF¶‹v¾ÿ^ma뀀Ñc#E||¼hikkk,X°@´Í¸qãD;¼ĉ'´ŠG_þ;t€è ¤§§§h-µ›7obàÀŸ-‹ŠŠBÇŽUêF™››cûöí¨X±¢–Q›¾‚ "$$DthØãÇѶm[$$$4¦Ò¥K‹~7322ÔvN²²råJÑ *T¨€‘#GÊÚfN#öÌ*q`j?)mΜ9¢C¤úé'üôÓOŸ-;}ú´è÷ÀÙÙAAA¢çGmˆÝ#æÉ“G¯Ã÷ÅîÅâ ùÄŽ§>8ÑŽÆ ±uëVÑû§½{÷ªMx˜‚ìSü?«R¥ ‚‚‚`mm­².44d1üŽ5ˆ>€Õ«Wë}?!!!(Z´¨ÚõË–-3Hq×;w¢B… Ù~»ví°hÑ"ÑŽÝÒ¥KQ¦LµO£)m̘1X¶l™Jm‰k×®!((:uÊrË—/íD5hÐ^^^ZÇøã?Š>2räH¸¸¸ˆ¶±µµÅ¼yóУG•u~~~¸zõª¬š«V­ÒKaǧOŸŠÖãQ÷Ô¿¿?®]»†íÛ·¶|Ïž=¨[·.ÆŽ›Y4ûñãÇ*í§OŸŽ¶mÛê&ø T©R8xð š4i¢RçæÊ•+èÞ½;‚ƒƒuR'#»&Mš„M›6áùóçŸ-?yò$8eÍ«OEEEaÖ¬Y¢ë.\(zÃû_[¶lÉvÁcm¬Zµ uêÔQ»þÈ‘#èÚµ«Î÷'š\þ˜ˆV—ïÓ§túcTÞ¼yQ®\94jÔ]ºtÉQO š››cÇŽ¨[·®JBsäÈ‘pssÃW_}…§OŸ¢k×®*I+++üüóÏk&åt>|}ÊV×:wîŒÚµkë}?$®sçΘ;w®èÿõ‚ P¦L™ÌÙZÉ84iÒëׯGß¾}U’EÛ¶mC™2e0sæL…¢#}c‰è?í„êZV™þ§OŸâéÓ§zCÎtÙcÇŽÅýû÷Em~~~øòË/%uø ÅÞÞ“&Mý•wæÌ™èСƒÆ'ˆâââÔ¦ÖfÖ‘=z„%K–¨,/T¨P–3dtïÞË—/ÇŸþùÙò7nà§Ÿ~’5ãÜ¥K— 6«FáÂ…Q£F µë×­[‡{÷î©Ä3aÂÔªU Äü¡Ò®C‡øá‡t¯©«]»6vìØN:© 8tèÆŒƒ+V,;;;Ì;}ûöUY7aÂxyye»ˆèŒ3ðîÝ;•墳û‰yùò¥Úú$VLþSZ¶l™èXõæÍ›£Y³fZÇ6qâDÑa%Ó§Oϲöˆ™™–,Y"ZiÚ´i¢3“™3gÂÒRýï666 Ryj/-- >>>™S²ªråÊØ²e‹Ö5©rªöíÛ«޹råJÑcªO½zõíÀýý÷ßX¹re¶¶qëÖ-ÑZ1ÿ{LMß¾}3ŸrtrrR¤3….]º(: ¹>¸ººbçÎ*?P}T’t+V¬€ÁcIMMżyó ¾_}óòòÂܹsU–‹%÷ëÖ­‹U«V","£bee…½{÷¢råÊ*ëâããѦMDFF*©cff†7¢aÆ*ëRSSÑ©S'ܺuKÈHŸ˜@¢L_ý5Ž;&ú´Cdd$Z´hÁ7e²··W[÷åË—ðööFLLŒ‘i6`À”)SFeù;w°{÷nÑ6K–,ãííúõëkOFFÆŽ+º®I“&Ø¿?öîÝ›­—»»»èv–-[f°¡0ê4jÔðôôDïÞ½±téRDDDH*Ù Aƒ,ŸF177ÇÎ;Q¾|ymCΖ/_.:ÛKFFzöì©2,RŸ¾þúkÑš?oß¾U[×è£=zTeyþüù³l›[¸¹¹ÁÃÃèÖ­pëÖ-lÞ¼Y¥xrݺuñ矢}ûöÙª¥KgÏž5èþ e„ ¢IþO-Z¿üò‹^‹Y3GGG„„„ H‘"*ëž?ooï,‡ÿ’aåÉ“ÁÁÁ¢µ:cccáåå¥È,¯¤?¬DŸ©S§Nœ8OOO•bÁ=B‹-ŠâÅ‹+¡~õîÝ_ýµÞ÷#6ýå§:uêOOO½Ç¡ítÕ_|ñ:„&Mš¨ÌÞtûömtìØGŽ1xDkkkLŸ>]t\ö¬Y³Ð­[·Ï ¿{÷K—.Uy¯™™™è¸o©6oÞŒ«W¯Š®[»v­N¦oNIIÁøñãœí6+W®Ì²³ó_sæÌQ['ÊÎÎAAAZwŒ €k×®©­Ñ3{ölÑá•$îãÓ„ 6DxxøgëÑ®];„……¡lÙ²‰gþüù8xð Êlz«V­Â°aÃàêêªÒ&55ãÆÝÞÔ©SE§×ä›o¾AÇŽ%µ‘£R¥J×8Píì‹ê:týû÷}š2)) [¶lÉöõ»J•*Æû÷ïqëÖ-DFF"!!ÉÉÉ’bRçÇذanÞ¼ùÙòÿNtS˜™™á§Ÿ~½{÷DÏùÖÖÖØ·oŸè0ëÜÊÚÚÚ 5±Ä~T"å”)S@³fÍT®áááèÒ¥ BBB²]ôÏÉÉ !!!hРÊÃOž}úd. fЩS'Ô¬YS«8âããÕ©Óµýû÷ãäɓٮ×dkk›eí¥ÿZ¸p!’““E“;¿ýö:tè€àà`­“H8qâîܹóÙòš5kdÆžœÆÁÁ!!!¨W¯žÊ¯„¯_¿†——Ο?Ÿeâ[¾üòKøûû« »LMMÅ„ pàÀ•6+W®T™å \\\dÍ Y£F £8ÿæÍ›Wòw°wïÞHOOÇÀUÎÇ÷îÝCóæÍñÇHúÈÎÎuëÖEݺu%Å’ÉÉÉ*ßYuC‰s[[[¡téÒ*ëFm°”"gZo{{{üüóÏzˆ&÷0ÕéÔëÖ­‹-[¶ [·n*ç²£Gbذa¢·sSý?suuEPP<==U& ºrå ºuë†ýû÷t–WÒaË¡Äjü·³¥I•*U*:µö;wàááñYAáÿvÄ?2µ$ÿ½H)ÅXâÈ®víÚaÑ¢E¢ë¶mÛ†f9óœ!YXX¨^4 ³ŽJtt4–-[&©½sçÎ5ÈlO;V¯3333,[¶LmçûÈ‘#èСƒh±p)¬¬¬T j@Œ*QiJJ•*…ƒÂÖÖVeݽ{÷àááa°!Ì“&M} ãàÁƒ8vìØgË^¿~­vˆÚÂ… e=ýhê Œ~ýúaÕªU¢ß…{÷î¡Y³fxþü¹‘©ÊßW±û*’“…Ú»GüíÝ{PTåÇñÏ® Š4„ŒÑFʼ„2bxGÔtŒ t¼¤©`Ìf–÷j4/„6jh&d—Q§@i ¼å89嘔C‚Ž“ýcý‘:šƒ:ìïG~áž=îž]¡÷kfÿ9ÏÙçùî9{9û=Ïåúõëúý÷ß-iïêÕ«†+˶´kDoù;ÐÜko9sÆp»¯ÎëäÉ“ 瓤;vhþüùºuë–OÚ²‚'ÇÇèœUWW[öÞ±úœ9RÛ·o7ün/))Ñ‹/¾è2b-=Z©¨¨(—•ÓvïÞ­ððp=÷ÜsŠŒŒô(œ››«Ù³g»|Ø«ªªôì³ÏjÍš5:qâ„á2«ÁÁÁ CÜ-^RR¢~ýú©C‡ž¾´ûºvíšá]êÇá.ž={ö¨OŸ>–Ï?УGEDD¸cïÞ½2dˆå]=»wïn8μ)²³³USS£¼¼<—²üü|UVV*++뙌}òäÉzÿý÷UQQÑhû¹s甓“£±cǪ  Àp¬ýÔ©S 'yôÆùóç ‡ÆYéçŸV~~¾æÍ›gY6›Myyyª««ÓÎ;]Ê¿ýö[¥¦¦jß¾}-~ž£ÏïÅ‹õÅ_Üwx’7œN§*++uíÚ5bhªAƒéË/¿TZZšK»¼¼\ Z¸p¡åÃÙ´zõêF=ïš1c†6mÚ¤Ç\—/_Ö²eË ç'KJJRjjê}Û2:~Є Þ´ࡨ¨(ˆƒgdd¨®®N¯¿þºKÙÙ³g5jÔ(9rÄíp©K—.þá÷¥+W®¨´´Ôe»/ßÓ0f”€—¤ñãÇ+;;[O>ù¤O®?nܸ¡sçÎióæÍ†CæPl‰Ü½góòò”––fi‹ÐÐІߛ¨¨(—›Rw‡µ¦¦¦ª[·n>‰å¯¿þÒ?ü`¸’§Ífóéy]´h‘jjj´cÇ—²mÛ¶©¢¢B™™™M^¸¥ººÚç‰ìË—/«¼¼ÜíJ§ÿþÞ7:V§NÒ¤I“4mÚ4EGGûd¨Þßÿ­Ÿ~úÉí°h_þÍœ9Sµµµ†Ó<ªººZ‡Cþù§ÏÚ„ÿ9=}äåå9Ñ2Ì™3ÇãójÕcøðábjß¾}ÀcºvíšÓét:ëêêœv»=`q|úé§ÄqÉÍÍmˆ#44Ô¥üóÏ?÷ê}wëÖ-çøñ㽎#44´ïö;²²²\ê6mšésöïßïu¬ÁÁÁΚšÓz{öìéò¼={ö4Ú'--Ͱþ¡C‡:ÓÓÓ›ý˜4i’aý‘‘‘Î+W®4ÄqéÒ%Ãý š|.œN§óöíÛΩS§º=ŽãÆsÞ¸q£Éõ5ʥΤ¤¤fÅì­·ß~;`ŸÝ»µk×6Äó /¸”OŸ>Ýëו““Ó¤XŽ;ÖPG»ví\Ê—/_îq õõõÎÁƒ7)Ž6mÚ8+**ïƒ>ØqéÚµkCßÿ½á>ÇoÖqyê©§\êœ={v³êôÔíÛ· _ÓªU«üÒ¾Óétž={6`ç×Ýy4ú ˆˆðÛ1iŽo¾ù&`ÇpРA qdffüœ0 Ñ± rÙçÞë¡û¹yó¦s̘1^ÇÒ±cdž:>ðc#ÉÙ¡Cç­[·âZ³fMÀcŠŒŒtÖ××7Ädô{´aïÎY}}½é5 Ùãúõë^µ…æËËËóêÑ©•JOOW~~~@ÇÑÞ»|¸Nœ8Ñhû¥K—´jÕ*Ã^ƒ¾Ô¦M}öÙgºyó¦ák---Õĉµoß>µmÛÖÒXöîÝ«ü±Ñ¶ððp-^¼¸Yõ&&&6ëù¾`ż4‡CµµµÚºu«Ïëö”ÍfÓ† 4|øp¯Ç^~ùeÅÅÅy´obbâÓ+Ò .T]]–-[æRVSS£Q£FéèÑ£ÔÄÍV¼§ÑXll¬F­Ã‡,†¸¸8 :4`íûRBB‚ìv{À§˜7ož¶lÙÐa¸÷^ûûBpp°¾úê+ 6Ìí¬–bîܹ úÿßï3fèÝwßÕ?ÿü°˜222|Þ Ëf³©  @/^lµ+kþ—ÑO¸•iÇLPPvíÚ¥çŸÞ°¼¬¬L©©©.«¬øZYY™Ö®]ÛèñÑG5»Þ &4{(cs 4H#FŒ°¤î-[¶!ó§¡C‡jÊ”)^='<<Ü«Ïtvvv«ŸÐséÒ¥n¿·î&‘¬®æ)›Í¦¬¬¬@‡ñŸ°yófEDD¤í°°0}üñÇ­f¸b×®]5}úô@‡¡~ýúùma#cÇŽµl!šŽ;êСCêÝ»·%õûCß¾}]¾‹£££•›› ˆ¤øøx-\¸Ð’ºCBBTRRÂMV¨u|sÃPNNŽV­Z¥¿µi·Ûµ`ÁíÞ½ÛåÂ`ܸqÚ°aƒß—Ý´ÛíZ´h‘fÏžÝhû”)S´bÅŠ€_Àê¸X)22RGõËRØÍ5zôh%%%y´ozzºbbbšÕ^~~¾ÊËË]¶ÇÄÄø<é› 3f¸l¯««Ó›o¾éӶܹ{çpüøñ†åeeeš8q¢åI$+©¸¸¸Ù=Òš¢OŸ>***²ìûËn·+??_+W®ôëoȽ֯_ïÕä¹¹¹^­š O>ùÄò^pöÞ{ïé7Þ0,{P’HÁÁÁÚ¸q£FÐ8þ+z÷î­£GjÀ€~m÷‰'žÐÁƒ5xð`¿¶kµ-[¶hìØ±Cï¼óŽrss D°ŠÍfÓܹsUTTÔ¨w¯EEEé»ï¾SJJŠemX%99Y‡RÇŽ]Ê222´sçNÃ2+¥¥¥©´´Ôp"o_éСƒÊÊÊ4sæLËÚ€ÿ‘@jÅl6›/^¬ .hݺuJNNV=|:1h»ví­1cÆhÅŠúí·ß´iÓ&·ãYYYª¬¬”ÃáPBB‚:wîìó?@6›M:uÒÀõꫯêäÉ“Z³fá¾+W®ÔéÓ§õÚk¯)>>>`«8ùã¸ø[×®]UXX¨#GŽhþüùêÛ·¯ºtéè° Môw¯ÐÐÐfyºzõªÛž«W¯¶äOìêÕ« / uìØ1Ÿ·g$$$DEEEnuTJJJ‹L"õêÕK•••Ú¶m›&L˜ îÝ»[rãäää†$äc=æóvþÍn·kÅŠªªªÒòåËõÌ3Ï(::ÚÒ?÷zôÑGUVV¦‘#GºÔ7$$DÔ®]»št÷{Ö¬Yúõ×_µxñb 2D]ºtñëkô—õë×+33Ó°¬¶¶ÖïI$»Ý®ˆˆ%$$Èáp¨ªªÊm|°FÿþýuêÔ)8p@sçÎU||¼ºtéâ³ZAAAêܹ³âââôÒK/iïÞ½úå—_4dÈŸÔÿ i×®JKKU\\¬)S¦¨W¯^[e.;;[.\Pnn®RRRÔ³gOŸ.V¦¨¨(%%%iÉ’%:s挶oßni"â®ÈÈHëàÁƒJOOWŸ>}֓·~X‘‘‘6l˜²²²tòäIíß¿ßíäõÒ‰§/\¸ ­[·*--M±±±>]™±mÛ¶êÖ­›FŒ!‡Ã¡Ó§Oë믿öËuyxx¸vîÜ©'N(33SO?ý´yä‘ÿä*œ­…Mw&CòH^^ž%c[°Úœ9s”ŸŸ/éÎ<9F«ºÿ[·nÕ+¯¼âñþ-»‹ªªª’tçNÜÊ•+ ÐÂ@´zõõõ «·8ˇ­MëäÀ=®\¹¢iÓ¦Én·[¶âК‘@´z:uÒ¶mÛÐb1„ ¦H À $˜"S$`ŠL‘@€)H0E ¦H À $˜"S$`ŠL‘@€)H0E ¦H À $˜"S$`ŠL‘@€)H0E ¦H À $˜"S$`ŠL‘@€)H0E ¦‚¼ÙùøñãVÅ?ñ6Çc“ä´&´ a€)H0E ¦H À $˜"S$`ŠL‘@€)H0õ?;òrÎHuAIEND®B`‚sonic-visualiser-3.0.3/icons/scalable/text.svg0000644000000000000000000001032213111512442017520 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/timeruler.svg0000644000000000000000000000736413111512442020560 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/undo.svg0000644000000000000000000000513013111512442017502 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/values.svg0000644000000000000000000000575613111512442020052 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/waveform.svg0000644000000000000000000000647213111512442020375 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/zoom-fit.svg0000644000000000000000000001551013111512442020304 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/zoom-in.svg0000644000000000000000000001425713111512442020137 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/zoom-out.svg0000644000000000000000000001363713111512442020341 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/zoom-reset.svg0000644000000000000000000000563513111512442020653 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/icons/scalable/zoom.svg0000644000000000000000000001320613111512442017524 0ustar 00000000000000 image/svg+xml sonic-visualiser-3.0.3/piper-cpp/.gitignore0000644000000000000000000000011413111512442017017 0ustar 00000000000000*.o *.a o/ .qmake.stash *~ vamp-client/qt/Makefile vamp-client/qt/test bin/ sonic-visualiser-3.0.3/piper-cpp/.hgignore0000644000000000000000000000007113111512442016634 0ustar 00000000000000syntax: glob bin o *.capnp.c++ *.capnp.h *~ .qmake.stash sonic-visualiser-3.0.3/piper-cpp/.travis.yml0000644000000000000000000000167513111512442017155 0ustar 00000000000000dist: - trusty language: - cpp sudo: - false os: - linux - osx addons: apt: packages: - qt5-default before_install: - ( cd ../ ; git clone https://github.com/piper-audio/piper ) - ( cd ../ ; hg clone https://code.soundsoftware.ac.uk/hg/vamp-plugin-sdk ) - ( cd ../ ; git clone https://github.com/sandstorm-io/capnproto ) - ( cd ../capnproto/c++ ; ./setup-autotools.sh && autoreconf -i ) - ( cd ../capnproto/c++ ; ./configure && make && sudo make install ) - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew install qt5 ; fi - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then export PATH=$PATH:/usr/local/opt/qt5/bin ; fi - ( cd ../vamp-plugin-sdk ; if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then make -f build/Makefile.osx sdkstatic plugins ; else ./configure --disable-programs && make sdkstatic plugins; fi ) install: - sudo pip install jsonschema script: - VAMP_PATH=$(pwd)/../vamp-plugin-sdk/examples ./test.sh sonic-visualiser-3.0.3/piper-cpp/COPYING0000644000000000000000000000263113111512442016070 0ustar 00000000000000 Piper Copyright (c) 2015-2017 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-3.0.3/piper-cpp/Makefile0000644000000000000000000001275513111512442016505 0ustar 00000000000000 VAMPSDK_DIR := ../vamp-plugin-sdk PIPER_DIR := ../piper INCFLAGS := -Iext -I$(VAMPSDK_DIR) -I. -I/usr/local/include CXXFLAGS := -Wall -Wextra -Werror -g3 -std=c++11 $(INCFLAGS) #LDFLAGS := -L$(VAMPSDK_DIR) -L/usr/local/lib -lvamp-hostsdk -lcapnp -lkj LDFLAGS := $(VAMPSDK_DIR)/libvamp-hostsdk.a -lcapnp -lkj LDFLAGS += -ldl COMMON_OBJS := ext/json11/json11.o vamp-capnp/piper.capnp.o TEST_SRCS := test/main.cpp test/vamp-client/tst_PluginStub.cpp TEST_OBJS := $(TEST_SRCS:.cpp=.o) all: bin bin/piper-convert bin/piper-vamp-simple-server bin/test-suite bin: mkdir bin bin/piper-convert: vamp-server/convert.o $(COMMON_OBJS) c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) bin/piper-vamp-simple-server: vamp-server/simple-server.o $(COMMON_OBJS) c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) bin/test-suite: $(TEST_OBJS) c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) bin/test-suite vamp-capnp/piper.capnp.o: vamp-capnp/piper.capnp.c++ c++ $(CXXFLAGS) $(INCFLAGS) -c $< -o $@ vamp-capnp/piper.capnp.h: vamp-capnp/piper.capnp.c++ vamp-capnp/piper.capnp.c++: $(PIPER_DIR)/capnp/piper.capnp capnpc --src-prefix=$(PIPER_DIR)/capnp -oc++:vamp-capnp $< test: all bin/test-suite -s -d yes vamp-server/test.sh clean: rm -f */*.o distclean: clean rm -rf bin/* depend: makedepend -Y. */*.cpp */*/*.cpp */*/*/*.cpp */*.c++ # cancel implicit rule which otherwise could try to link %.capnp %: %.o # DO NOT DELETE vamp-capnp/piper-capnp.o: vamp-capnp/piper.capnp.c++ vamp-capnp/piper.capnp.h vamp-server/convert.o: vamp-json/VampJson.h vamp-support/PluginStaticData.h vamp-server/convert.o: vamp-support/PluginConfiguration.h vamp-server/convert.o: vamp-support/RequestResponse.h vamp-server/convert.o: vamp-support/PluginStaticData.h vamp-server/convert.o: vamp-support/PluginConfiguration.h vamp-server/convert.o: vamp-support/PluginHandleMapper.h vamp-server/convert.o: vamp-support/PluginOutputIdMapper.h vamp-server/convert.o: vamp-support/PluginOutputIdMapper.h vamp-server/convert.o: vamp-support/RequestResponseType.h vamp-server/convert.o: vamp-capnp/VampnProto.h vamp-capnp/piper.capnp.h vamp-server/convert.o: vamp-support/RequestOrResponse.h vamp-server/convert.o: vamp-support/RequestResponseType.h vamp-server/convert.o: vamp-support/RequestResponse.h vamp-server/convert.o: vamp-support/PreservingPluginHandleMapper.h vamp-server/convert.o: vamp-support/PluginHandleMapper.h vamp-server/convert.o: vamp-support/PreservingPluginOutputIdMapper.h vamp-server/simple-server.o: vamp-json/VampJson.h vamp-server/simple-server.o: vamp-support/PluginStaticData.h vamp-server/simple-server.o: vamp-support/PluginConfiguration.h vamp-server/simple-server.o: vamp-support/RequestResponse.h vamp-server/simple-server.o: vamp-support/PluginStaticData.h vamp-server/simple-server.o: vamp-support/PluginConfiguration.h vamp-server/simple-server.o: vamp-support/PluginHandleMapper.h vamp-server/simple-server.o: vamp-support/PluginOutputIdMapper.h vamp-server/simple-server.o: vamp-support/PluginOutputIdMapper.h vamp-server/simple-server.o: vamp-support/RequestResponseType.h vamp-server/simple-server.o: vamp-capnp/VampnProto.h vamp-capnp/piper.capnp.h vamp-server/simple-server.o: vamp-support/RequestOrResponse.h vamp-server/simple-server.o: vamp-support/RequestResponseType.h vamp-server/simple-server.o: vamp-support/RequestResponse.h vamp-server/simple-server.o: vamp-support/CountingPluginHandleMapper.h vamp-server/simple-server.o: vamp-support/PluginHandleMapper.h vamp-server/simple-server.o: vamp-support/AssignedPluginHandleMapper.h vamp-server/simple-server.o: vamp-support/DefaultPluginOutputIdMapper.h vamp-server/simple-server.o: vamp-support/LoaderRequests.h ext/json11/json11.o: ext/json11/json11.hpp ext/json11/test.o: ext/json11/json11.hpp test/vamp-client/tst_PluginStub.o: vamp-client/Loader.h test/vamp-client/tst_PluginStub.o: vamp-support/RequestResponse.h test/vamp-client/tst_PluginStub.o: vamp-support/PluginStaticData.h test/vamp-client/tst_PluginStub.o: vamp-support/PluginConfiguration.h test/vamp-client/tst_PluginStub.o: vamp-client/PluginClient.h test/vamp-client/tst_PluginStub.o: vamp-support/PluginConfiguration.h test/vamp-client/tst_PluginStub.o: vamp-client/PiperVampPlugin.h test/vamp-client/tst_PluginStub.o: vamp-support/PluginStaticData.h test/vamp-client/tst_PluginStub.o: vamp-client/PluginClient.h vamp-client/qt/test.o: vamp-client/qt/ProcessQtTransport.h vamp-client/qt/test.o: vamp-client/SynchronousTransport.h vamp-client/qt/test.o: vamp-client/Exceptions.h vamp-client/qt/test.o: vamp-client/qt/PiperAutoPlugin.h vamp-client/qt/test.o: vamp-client/CapnpRRClient.h vamp-client/Loader.h vamp-client/qt/test.o: vamp-support/RequestResponse.h vamp-client/qt/test.o: vamp-support/PluginStaticData.h vamp-client/qt/test.o: vamp-support/PluginConfiguration.h vamp-client/qt/test.o: vamp-client/PluginClient.h vamp-client/qt/test.o: vamp-client/PiperVampPlugin.h vamp-client/qt/test.o: vamp-support/PluginStaticData.h vamp-client/qt/test.o: vamp-support/PluginConfiguration.h vamp-client/qt/test.o: vamp-client/SynchronousTransport.h vamp-client/qt/test.o: vamp-support/AssignedPluginHandleMapper.h vamp-client/qt/test.o: vamp-support/PluginHandleMapper.h vamp-client/qt/test.o: vamp-support/PluginOutputIdMapper.h vamp-client/qt/test.o: vamp-support/DefaultPluginOutputIdMapper.h vamp-client/qt/test.o: vamp-capnp/VampnProto.h vamp-capnp/piper.capnp.h vamp-client/qt/test.o: vamp-support/PluginHandleMapper.h vamp-client/qt/test.o: vamp-support/PluginOutputIdMapper.h vamp-client/qt/test.o: vamp-support/RequestResponseType.h vamp-capnp/piper.capnp.o: vamp-capnp/piper.capnp.h sonic-visualiser-3.0.3/piper-cpp/README.md0000644000000000000000000000256513111512442016322 0ustar 00000000000000 # Piper Vamp C++ Supporting code in C++ for the Piper audio feature extractor protocol, primarily for making Vamp plugins work with the Piper protocol. _This is pre-1.0 code and the API may change at any time_ ## Contents * code to adapt Piper messages to the classes used in the Vamp SDK * a command-line converter between Piper serialisations that goes via Vamp SDK classes * a server that makes Vamp plugins available via Piper messages ## Directory index *vamp-json* - convert between Piper JSON messages and Vamp SDK classes *vamp-capnp* - convert between Piper Cap'n Proto messages and Vamp abstractions *vamp-support* - support classes for the above *vamp-server* - main programs for command-line converter and server *vamp-client* - logic to make Piper servers available to Vamp hosts through a Vamp-like API *vamp-client/qt* - logic specific to hosts written with Qt *ext* - json11 and base-n third-party libraries: see individual directories for copyright details [![Build Status](https://travis-ci.org/piper-audio/piper-vamp-cpp.svg?branch=master)](https://travis-ci.org/piper-audio/piper-vamp-cpp) ## Authors and licensing Written by Chris Cannam and Lucas Thompson at the Centre for Digital Music, Queen Mary, University of London. Copyright (c) 2015-2017 Queen Mary, University of London, provided under a BSD-style licence. See the file COPYING for details. sonic-visualiser-3.0.3/piper-cpp/ext/base-n/LICENSE0000644000000000000000000000207213111512442020006 0ustar 00000000000000Copyright (C) 2012 Andrzej Zawadzki (azawadzki@gmail.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sonic-visualiser-3.0.3/piper-cpp/ext/base-n/README.md0000644000000000000000000000437613111512442020271 0ustar 00000000000000base-n provides encoding/decoding support for BaseX encoding schemes accessible through a standard STL-like iterator interface. Standard Base16, Base32, and Base64 are available out-of-the-box. Adding or modifying custom schemes is supported. # Usage overview # base-n is a small, single-header library which provides standard Base16, Base32, Base64, and custom Base-N encoding support. The main functionality is delivered by the following functions in `bn` namespace: ``` template void encode_b16(Iter1 start, Iter1 end, Iter2 out); template void encode_b32(Iter1 start, Iter1 end, Iter2 out); template void encode_b64(Iter1 start, Iter1 end, Iter2 out); template void decode_b16(Iter1 start, Iter1 end, Iter2 out); template void decode_b32(Iter1 start, Iter1 end, Iter2 out); template void decode_b64(Iter1 start, Iter1 end, Iter2 out); ``` In order to encode and decode data in `std::string` variable `in`, you can do the following: ``` bn::encode_b64(in.begin(), in.end(), back_inserter(encoded)); bn::decode_b64(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); ``` Should you find yourself lacking some encoding scheme or the default character mapping rules are not good for your use case, you can easily provide your own encoder. For that, you need to define a struct type which will describe the new encoding. Sample below: ``` struct b8_custom { static size_t group_length() { return 3; } static char encode(int index) { const char* const dictionary = "01234567"; assert(index < strlen(dictionary)); return dictionary[index]; } static char decode(char c) { if (c >= '0' && c <= '7') { return c - '0'; } return -1; } }; ... string encoded; bn::impl::encode(in.begin(), in.end(), back_inserter(encoded)); bn::impl::decode(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); ``` For a full working example, see `basen_example.cpp` file in `example` directory. sonic-visualiser-3.0.3/piper-cpp/ext/base-n/example/basen_example.cpp0000644000000000000000000000726713111512442023756 0ustar 00000000000000/** * base-n, 1.0 * Copyright (C) 2012 Andrzej Zawadzki (azawadzki@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. **/ #include #include #include #include #include #include "basen.hpp" int main() { using namespace std; string in = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."; cout << in << endl; { string encoded; bn::encode_b64(in.begin(), in.end(), back_inserter(encoded)); bn::decode_b64(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); cout << endl; } { string encoded; bn::encode_b32(in.begin(), in.end(), back_inserter(encoded)); bn::decode_b32(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); cout << endl; } { string encoded; bn::encode_b16(in.begin(), in.end(), back_inserter(encoded)); bn::decode_b16(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); cout << endl; } { string encoded = "#TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz\n" "IHNpbmd1bGFyIHBhc3Npb24gZnJvbS@BvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg\n" " dGhlIG1(pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu\n" "\rdWVkIGFuZCBpbmRlZmF0aWdhY*mxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo\n" "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4"; bn::decode_b64(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); cout << endl; } { // move the struct definition outside of main() for non-C++11 compilers struct b8_custom { static size_t group_length() { return 3; } static char encode(unsigned int index) { const char* const dictionary = "01234567"; assert(index < strlen(dictionary)); return dictionary[index]; } static char decode(char c) { if (c >= '0' && c <= '7') { return c - '0'; } return -1; } }; string encoded; bn::impl::encode(in.begin(), in.end(), back_inserter(encoded)); bn::impl::decode(encoded.begin(), encoded.end(), ostream_iterator(cout, "")); cout << endl; } } sonic-visualiser-3.0.3/piper-cpp/ext/base-n/include/basen.hpp0000644000000000000000000002124213111512442022225 0ustar 00000000000000/** * base-n, 1.0 * Copyright (C) 2012 Andrzej Zawadzki (azawadzki@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. **/ #ifndef BASEN_HPP #define BASEN_HPP #include #include #include #include namespace bn { template void encode_b16(Iter1 start, Iter1 end, Iter2 out); template void encode_b32(Iter1 start, Iter1 end, Iter2 out); template void encode_b64(Iter1 start, Iter1 end, Iter2 out); template void decode_b16(Iter1 start, Iter1 end, Iter2 out); template void decode_b32(Iter1 start, Iter1 end, Iter2 out); template void decode_b64(Iter1 start, Iter1 end, Iter2 out); namespace impl { const int ERROR = -1; namespace { char extract_partial_bits(char value, unsigned int start_bit, unsigned int bits_count) { assert(start_bit + bits_count < 8); // shift extracted bits to the beginning of the byte char t1 = value >> (8 - bits_count - start_bit); // mask out bits on the left char t2 = t1 & ~(-1U << bits_count); return t2; } char extract_overlapping_bits(char previous, char next, unsigned int start_bit, unsigned int bits_count) { assert(start_bit + bits_count < 16); int bits_count_in_previous = 8 - start_bit; int bits_count_in_next = bits_count - bits_count_in_previous; char t1 = previous << bits_count_in_next; char t2 = next >> (8 - bits_count_in_next) & ~(-1U << bits_count_in_next) ; return (t1 | t2) & ~(-1U << bits_count); } } struct b16_conversion_traits { static size_t group_length() { return 4; } static char encode(unsigned int index) { const char* const dictionary = "0123456789ABCDEF"; assert(index < strlen(dictionary)); return dictionary[index]; } static char decode(char c) { if (c >= '0' && c <= '9') { return c - '0'; } else if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } return ERROR; } }; struct b32_conversion_traits { static size_t group_length() { return 5; } static char encode(unsigned int index) { const char * dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; assert(index < strlen(dictionary)); return dictionary[index]; } static char decode(char c) { if (c >= 'A' && c <= 'Z') { return c - 'A'; } else if (c >= '2' && c <= '7') { return c - '2' + 26; } return ERROR; } }; struct b64_conversion_traits { static size_t group_length() { return 6; } static char encode(unsigned int index) { const char* const dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; assert(index < strlen(dictionary)); return dictionary[index]; } static char decode(char c) { const int alph_len = 26; if (c >= 'A' && c <= 'Z') { return c - 'A'; } else if (c >= 'a' && c <= 'z') { return c - 'a' + alph_len * 1; } else if (c >= '0' && c <= '9') { return c - '0' + alph_len * 2; } else if (c == '+') { return c - '+' + alph_len * 2 + 10; } else if (c == '/') { return c - '/' + alph_len * 2 + 11; } return ERROR; } }; template void decode(Iter1 start, Iter1 end, Iter2 out) { Iter1 iter = start; int output_current_bit = 0; char buffer = 0; while (iter != end) { if (std::isspace(*iter)) { ++iter; continue; } char value = ConversionTraits::decode(*iter); if (value == ERROR) { // malformed data, but let's go on... ++iter; continue; } unsigned int bits_in_current_byte = std::min(output_current_bit + ConversionTraits::group_length(), 8) - output_current_bit; if (bits_in_current_byte == ConversionTraits::group_length()) { // the value fits within current byte, so we can extract it directly buffer |= value << (8 - output_current_bit - ConversionTraits::group_length()); output_current_bit += ConversionTraits::group_length(); // check if we filled up current byte completely; in such case we flush output and continue if (output_current_bit == 8) { *out++ = buffer; buffer = 0; output_current_bit = 0; } } else { // the value spans across the current and the next byte int bits_in_next_byte = ConversionTraits::group_length() - bits_in_current_byte; // fill the current byte and flush it to our output buffer |= value >> bits_in_next_byte; *out++ = buffer; buffer = 0; // save the remainder of our value in the buffer; it will be flushed // during next iterations buffer |= value << (8 - bits_in_next_byte); output_current_bit = bits_in_next_byte; } ++iter; } } template void encode(Iter1 start, Iter1 end, Iter2 out) { Iter1 iter = start; int start_bit = 0; bool has_backlog = false; char backlog = 0; while (has_backlog || iter != end) { if (!has_backlog) { if (start_bit + ConversionTraits::group_length() < 8) { // the value fits within single byte, so we can extract it // directly char v = extract_partial_bits(*iter, start_bit, ConversionTraits::group_length()); *out++ = ConversionTraits::encode(v); // since we know that start_bit + ConversionTraits::group_length() < 8 we don't need to go // to the next byte start_bit += ConversionTraits::group_length(); } else { // our bits are spanning across byte border; we need to keep the // starting point and move over to next byte. backlog = *iter++; has_backlog = true; } } else { // encode value which is made from bits spanning across byte // boundary char v; if (iter == end) v = extract_overlapping_bits(backlog, 0, start_bit, ConversionTraits::group_length()); else v = extract_overlapping_bits(backlog, *iter, start_bit, ConversionTraits::group_length()); *out++ = ConversionTraits::encode(v); has_backlog = false; start_bit = (start_bit + ConversionTraits::group_length()) % 8; } } } } // impl using namespace bn::impl; template void encode_b16(Iter1 start, Iter1 end, Iter2 out) { encode(start, end, out); } template void encode_b32(Iter1 start, Iter1 end, Iter2 out) { encode(start, end, out); } template void encode_b64(Iter1 start, Iter1 end, Iter2 out) { encode(start, end, out); } template void decode_b16(Iter1 start, Iter1 end, Iter2 out) { decode(start, end, out); } template void decode_b32(Iter1 start, Iter1 end, Iter2 out) { decode(start, end, out); } template void decode_b64(Iter1 start, Iter1 end, Iter2 out) { decode(start, end, out); } } // bn #endif // BASEN_HPP sonic-visualiser-3.0.3/piper-cpp/ext/catch/LICENSE_1_0.txt0000644000000000000000000000247213111512442021204 0ustar 00000000000000Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sonic-visualiser-3.0.3/piper-cpp/ext/catch/catch.hpp0000644000000000000000000141440113111512442020515 0ustar 00000000000000/* * Catch v1.7.1 * Generated: 2017-02-07 09:44:56.263047 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED #define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED #define TWOBLUECUBES_CATCH_HPP_INCLUDED #ifdef __clang__ # pragma clang system_header #elif defined __GNUC__ # pragma GCC system_header #endif // #included from: internal/catch_suppress_warnings.h #ifdef __clang__ # ifdef __ICC // icpc defines the __clang__ macro # pragma warning(push) # pragma warning(disable: 161 1682) # else // __ICC # pragma clang diagnostic ignored "-Wglobal-constructors" # pragma clang diagnostic ignored "-Wvariadic-macros" # pragma clang diagnostic ignored "-Wc99-extensions" # pragma clang diagnostic ignored "-Wunused-variable" # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wpadded" # pragma clang diagnostic ignored "-Wc++98-compat" # pragma clang diagnostic ignored "-Wc++98-compat-pedantic" # pragma clang diagnostic ignored "-Wswitch-enum" # pragma clang diagnostic ignored "-Wcovered-switch-default" # endif #elif defined __GNUC__ # pragma GCC diagnostic ignored "-Wvariadic-macros" # pragma GCC diagnostic ignored "-Wunused-variable" # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wpadded" #endif #if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) # define CATCH_IMPL #endif #ifdef CATCH_IMPL # ifndef CLARA_CONFIG_MAIN # define CLARA_CONFIG_MAIN_NOT_DEFINED # define CLARA_CONFIG_MAIN # endif #endif // #included from: internal/catch_notimplemented_exception.h #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED // #included from: catch_common.h #define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED // #included from: catch_compiler_capabilities.h #define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED // Detect a number of compiler features - mostly C++11/14 conformance - by compiler // The following features are defined: // // CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? // CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? // CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods // CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? // CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported // CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? // CATCH_CONFIG_CPP11_OVERRIDE : is override supported? // CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) // CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported? // CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported? // CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? // CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? // CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? // CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? // **************** // Note to maintainers: if new toggles are added please document them // in configuration.md, too // **************** // In general each macro has a _NO_ form // (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. // Many features, at point of detection, define an _INTERNAL_ macro, so they // can be combined, en-mass, with the _NO_ forms later. // All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 #ifdef __cplusplus # if __cplusplus >= 201103L # define CATCH_CPP11_OR_GREATER # endif # if __cplusplus >= 201402L # define CATCH_CPP14_OR_GREATER # endif #endif #ifdef __clang__ # if __has_feature(cxx_nullptr) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR # endif # if __has_feature(cxx_noexcept) # define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT # endif # if defined(CATCH_CPP11_OR_GREATER) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) # endif #endif // __clang__ //////////////////////////////////////////////////////////////////////////////// // Borland #ifdef __BORLANDC__ #endif // __BORLANDC__ //////////////////////////////////////////////////////////////////////////////// // EDG #ifdef __EDG_VERSION__ #endif // __EDG_VERSION__ //////////////////////////////////////////////////////////////////////////////// // Digital Mars #ifdef __DMC__ #endif // __DMC__ //////////////////////////////////////////////////////////////////////////////// // GCC #ifdef __GNUC__ # if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR # endif # if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" ) # endif // - otherwise more recent versions define __cplusplus >= 201103L // and will get picked up below #endif // __GNUC__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ #ifdef _MSC_VER #define CATCH_INTERNAL_CONFIG_WINDOWS_SEH #if (_MSC_VER >= 1600) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR # define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR #endif #if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) #define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT #define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS #define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE #define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS #endif #endif // _MSC_VER //////////////////////////////////////////////////////////////////////////////// // Use variadic macros if the compiler supports them #if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ ( defined __GNUC__ && __GNUC__ >= 3 ) || \ ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) #define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS #endif // Use __COUNTER__ if the compiler supports it #if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ ( defined __GNUC__ && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \ ( defined __clang__ && __clang_major__ >= 3 ) #define CATCH_INTERNAL_CONFIG_COUNTER #endif //////////////////////////////////////////////////////////////////////////////// // C++ language feature support // catch all support for C++11 #if defined(CATCH_CPP11_OR_GREATER) # if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR # endif # ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT # define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT # endif # ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS # define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS # endif # ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM # define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM # endif # ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE # define CATCH_INTERNAL_CONFIG_CPP11_TUPLE # endif # ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS # define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS # endif # if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) # define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG # endif # if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) # define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE # endif # if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) # define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR # endif # if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) # define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE # endif # if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) # define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS # endif #endif // __cplusplus >= 201103L // Now set the actual defines based on the above + anything the user has configured #if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_NULLPTR #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_NOEXCEPT #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_GENERATED_METHODS #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_IS_ENUM #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_TUPLE #endif #if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) # define CATCH_CONFIG_VARIADIC_MACROS #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_LONG_LONG #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_OVERRIDE #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_UNIQUE_PTR #endif // Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for // analytics) because, at time of writing, __COUNTER__ is not properly handled by it. // This does not affect compilation #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__) # define CATCH_CONFIG_COUNTER #endif #if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_SHUFFLE #endif # if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_TYPE_TRAITS # endif #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) # define CATCH_CONFIG_WINDOWS_SEH #endif #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS #endif // noexcept support: #if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) # define CATCH_NOEXCEPT noexcept # define CATCH_NOEXCEPT_IS(x) noexcept(x) #else # define CATCH_NOEXCEPT throw() # define CATCH_NOEXCEPT_IS(x) #endif // nullptr support #ifdef CATCH_CONFIG_CPP11_NULLPTR # define CATCH_NULL nullptr #else # define CATCH_NULL NULL #endif // override support #ifdef CATCH_CONFIG_CPP11_OVERRIDE # define CATCH_OVERRIDE override #else # define CATCH_OVERRIDE #endif // unique_ptr support #ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR # define CATCH_AUTO_PTR( T ) std::unique_ptr #else # define CATCH_AUTO_PTR( T ) std::auto_ptr #endif #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) #ifdef CATCH_CONFIG_COUNTER # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) #else # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) #endif #define INTERNAL_CATCH_STRINGIFY2( expr ) #expr #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) #include #include #include namespace Catch { struct IConfig; struct CaseSensitive { enum Choice { Yes, No }; }; class NonCopyable { #ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS NonCopyable( NonCopyable const& ) = delete; NonCopyable( NonCopyable && ) = delete; NonCopyable& operator = ( NonCopyable const& ) = delete; NonCopyable& operator = ( NonCopyable && ) = delete; #else NonCopyable( NonCopyable const& info ); NonCopyable& operator = ( NonCopyable const& ); #endif protected: NonCopyable() {} virtual ~NonCopyable(); }; class SafeBool { public: typedef void (SafeBool::*type)() const; static type makeSafe( bool value ) { return value ? &SafeBool::trueValue : 0; } private: void trueValue() const {} }; template inline void deleteAll( ContainerT& container ) { typename ContainerT::const_iterator it = container.begin(); typename ContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete *it; } template inline void deleteAllValues( AssociativeContainerT& container ) { typename AssociativeContainerT::const_iterator it = container.begin(); typename AssociativeContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete it->second; } bool startsWith( std::string const& s, std::string const& prefix ); bool startsWith( std::string const& s, char prefix ); bool endsWith( std::string const& s, std::string const& suffix ); bool endsWith( std::string const& s, char suffix ); bool contains( std::string const& s, std::string const& infix ); bool contains( std::string const& s, std::string const& infix ); void toLowerInPlace( std::string& s ); std::string toLower( std::string const& s ); std::string trim( std::string const& str ); bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); struct pluralise { pluralise( std::size_t count, std::string const& label ); friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); std::size_t m_count; std::string m_label; }; struct SourceLineInfo { SourceLineInfo(); SourceLineInfo( char const* _file, std::size_t _line ); # ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS SourceLineInfo(SourceLineInfo const& other) = default; SourceLineInfo( SourceLineInfo && ) = default; SourceLineInfo& operator = ( SourceLineInfo const& ) = default; SourceLineInfo& operator = ( SourceLineInfo && ) = default; # endif bool empty() const; bool operator == ( SourceLineInfo const& other ) const; bool operator < ( SourceLineInfo const& other ) const; char const* file; std::size_t line; }; std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); // This is just here to avoid compiler warnings with macro constants and boolean literals inline bool isTrue( bool value ){ return value; } inline bool alwaysTrue() { return true; } inline bool alwaysFalse() { return false; } void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); void seedRng( IConfig const& config ); unsigned int rngSeed(); // Use this in variadic streaming macros to allow // >> +StreamEndStop // as well as // >> stuff +StreamEndStop struct StreamEndStop { std::string operator+() { return std::string(); } }; template T const& operator + ( T const& value, StreamEndStop ) { return value; } } #define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) #define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); #include namespace Catch { class NotImplementedException : public std::exception { public: NotImplementedException( SourceLineInfo const& lineInfo ); NotImplementedException( NotImplementedException const& ) {} virtual ~NotImplementedException() CATCH_NOEXCEPT {} virtual const char* what() const CATCH_NOEXCEPT; private: std::string m_what; SourceLineInfo m_lineInfo; }; } // end namespace Catch /////////////////////////////////////////////////////////////////////////////// #define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) // #included from: internal/catch_context.h #define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED // #included from: catch_interfaces_generators.h #define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED #include namespace Catch { struct IGeneratorInfo { virtual ~IGeneratorInfo(); virtual bool moveNext() = 0; virtual std::size_t getCurrentIndex() const = 0; }; struct IGeneratorsForTest { virtual ~IGeneratorsForTest(); virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; virtual bool moveNext() = 0; }; IGeneratorsForTest* createGeneratorsForTest(); } // end namespace Catch // #included from: catch_ptr.hpp #define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { // An intrusive reference counting smart pointer. // T must implement addRef() and release() methods // typically implementing the IShared interface template class Ptr { public: Ptr() : m_p( CATCH_NULL ){} Ptr( T* p ) : m_p( p ){ if( m_p ) m_p->addRef(); } Ptr( Ptr const& other ) : m_p( other.m_p ){ if( m_p ) m_p->addRef(); } ~Ptr(){ if( m_p ) m_p->release(); } void reset() { if( m_p ) m_p->release(); m_p = CATCH_NULL; } Ptr& operator = ( T* p ){ Ptr temp( p ); swap( temp ); return *this; } Ptr& operator = ( Ptr const& other ){ Ptr temp( other ); swap( temp ); return *this; } void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } T* get() const{ return m_p; } T& operator*() const { return *m_p; } T* operator->() const { return m_p; } bool operator !() const { return m_p == CATCH_NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } private: T* m_p; }; struct IShared : NonCopyable { virtual ~IShared(); virtual void addRef() const = 0; virtual void release() const = 0; }; template struct SharedImpl : T { SharedImpl() : m_rc( 0 ){} virtual void addRef() const { ++m_rc; } virtual void release() const { if( --m_rc == 0 ) delete this; } mutable unsigned int m_rc; }; } // end namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif #include #include #include namespace Catch { class TestCase; class Stream; struct IResultCapture; struct IRunner; struct IGeneratorsForTest; struct IConfig; struct IContext { virtual ~IContext(); virtual IResultCapture* getResultCapture() = 0; virtual IRunner* getRunner() = 0; virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; virtual bool advanceGeneratorsForCurrentTest() = 0; virtual Ptr getConfig() const = 0; }; struct IMutableContext : IContext { virtual ~IMutableContext(); virtual void setResultCapture( IResultCapture* resultCapture ) = 0; virtual void setRunner( IRunner* runner ) = 0; virtual void setConfig( Ptr const& config ) = 0; }; IContext& getCurrentContext(); IMutableContext& getCurrentMutableContext(); void cleanUpContext(); Stream createStream( std::string const& streamName ); } // #included from: internal/catch_test_registry.hpp #define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED // #included from: catch_interfaces_testcase.h #define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED #include namespace Catch { class TestSpec; struct ITestCase : IShared { virtual void invoke () const = 0; protected: virtual ~ITestCase(); }; class TestCase; struct IConfig; struct ITestCaseRegistry { virtual ~ITestCaseRegistry(); virtual std::vector const& getAllTests() const = 0; virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; }; bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); std::vector const& getAllTestCasesSorted( IConfig const& config ); } namespace Catch { template class MethodTestCase : public SharedImpl { public: MethodTestCase( void (C::*method)() ) : m_method( method ) {} virtual void invoke() const { C obj; (obj.*m_method)(); } private: virtual ~MethodTestCase() {} void (C::*m_method)(); }; typedef void(*TestFunction)(); struct NameAndDesc { NameAndDesc( const char* _name = "", const char* _description= "" ) : name( _name ), description( _description ) {} const char* name; const char* description; }; void registerTestCase ( ITestCase* testCase, char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ); struct AutoReg { AutoReg ( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ); template AutoReg ( void (C::*method)(), char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { registerTestCase ( new MethodTestCase( method ), className, nameAndDesc, lineInfo ); } ~AutoReg(); private: AutoReg( AutoReg const& ); void operator= ( AutoReg const& ); }; void registerTestCaseFunction ( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ); } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ static void TestName(); \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ static void TestName() #define INTERNAL_CATCH_TESTCASE( ... ) \ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ namespace{ \ struct TestName : ClassName{ \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ } \ void TestName::test() #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); #else /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ static void TestName(); \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ static void TestName() #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ namespace{ \ struct TestCaseName : ClassName{ \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ } \ void TestCaseName::test() #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); #endif // #included from: internal/catch_capture.hpp #define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED // #included from: catch_result_builder.h #define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED // #included from: catch_result_type.h #define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED namespace Catch { // ResultWas::OfType enum struct ResultWas { enum OfType { Unknown = -1, Ok = 0, Info = 1, Warning = 2, FailureBit = 0x10, ExpressionFailed = FailureBit | 1, ExplicitFailure = FailureBit | 2, Exception = 0x100 | FailureBit, ThrewException = Exception | 1, DidntThrowException = Exception | 2, FatalErrorCondition = 0x200 | FailureBit }; }; inline bool isOk( ResultWas::OfType resultType ) { return ( resultType & ResultWas::FailureBit ) == 0; } inline bool isJustInfo( int flags ) { return flags == ResultWas::Info; } // ResultDisposition::Flags enum struct ResultDisposition { enum Flags { Normal = 0x01, ContinueOnFailure = 0x02, // Failures fail test, but execution continues FalseTest = 0x04, // Prefix expression with ! SuppressFail = 0x08 // Failures are reported but do not fail the test }; }; inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { return static_cast( static_cast( lhs ) | static_cast( rhs ) ); } inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } } // end namespace Catch // #included from: catch_assertionresult.h #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED #include namespace Catch { struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; struct DecomposedExpression { virtual ~DecomposedExpression() {} virtual bool isBinaryExpression() const { return false; } virtual void reconstructExpression( std::string& dest ) const = 0; // Only simple binary comparisons can be decomposed. // If more complex check is required then wrap sub-expressions in parentheses. template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& ); }; struct AssertionInfo { AssertionInfo() {} AssertionInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, std::string const& _capturedExpression, ResultDisposition::Flags _resultDisposition ); std::string macroName; SourceLineInfo lineInfo; std::string capturedExpression; ResultDisposition::Flags resultDisposition; }; struct AssertionResultData { AssertionResultData() : decomposedExpression( CATCH_NULL ) , resultType( ResultWas::Unknown ) , negated( false ) , parenthesized( false ) {} void negate( bool parenthesize ) { negated = !negated; parenthesized = parenthesize; if( resultType == ResultWas::Ok ) resultType = ResultWas::ExpressionFailed; else if( resultType == ResultWas::ExpressionFailed ) resultType = ResultWas::Ok; } std::string const& reconstructExpression() const { if( decomposedExpression != CATCH_NULL ) { decomposedExpression->reconstructExpression( reconstructedExpression ); if( parenthesized ) { reconstructedExpression.insert( 0, 1, '(' ); reconstructedExpression.append( 1, ')' ); } if( negated ) { reconstructedExpression.insert( 0, 1, '!' ); } decomposedExpression = CATCH_NULL; } return reconstructedExpression; } mutable DecomposedExpression const* decomposedExpression; mutable std::string reconstructedExpression; std::string message; ResultWas::OfType resultType; bool negated; bool parenthesized; }; class AssertionResult { public: AssertionResult(); AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); ~AssertionResult(); # ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS AssertionResult( AssertionResult const& ) = default; AssertionResult( AssertionResult && ) = default; AssertionResult& operator = ( AssertionResult const& ) = default; AssertionResult& operator = ( AssertionResult && ) = default; # endif bool isOk() const; bool succeeded() const; ResultWas::OfType getResultType() const; bool hasExpression() const; bool hasMessage() const; std::string getExpression() const; std::string getExpressionInMacro() const; bool hasExpandedExpression() const; std::string getExpandedExpression() const; std::string getMessage() const; SourceLineInfo getSourceInfo() const; std::string getTestMacroName() const; void discardDecomposedExpression() const; void expandDecomposedExpression() const; protected: AssertionInfo m_info; AssertionResultData m_resultData; }; } // end namespace Catch // #included from: catch_matchers.hpp #define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED namespace Catch { namespace Matchers { namespace Impl { namespace Generic { template class AllOf; template class AnyOf; template class Not; } template struct Matcher : SharedImpl { typedef ExpressionT ExpressionType; virtual ~Matcher() {} virtual Ptr clone() const = 0; virtual bool match( ExpressionT const& expr ) const = 0; virtual std::string toString() const = 0; Generic::AllOf operator && ( Matcher const& other ) const; Generic::AnyOf operator || ( Matcher const& other ) const; Generic::Not operator ! () const; }; template struct MatcherImpl : Matcher { virtual Ptr > clone() const { return Ptr >( new DerivedT( static_cast( *this ) ) ); } }; namespace Generic { template class Not : public MatcherImpl, ExpressionT> { public: explicit Not( Matcher const& matcher ) : m_matcher(matcher.clone()) {} Not( Not const& other ) : m_matcher( other.m_matcher ) {} virtual bool match( ExpressionT const& expr ) const CATCH_OVERRIDE { return !m_matcher->match( expr ); } virtual std::string toString() const CATCH_OVERRIDE { return "not " + m_matcher->toString(); } private: Ptr< Matcher > m_matcher; }; template class AllOf : public MatcherImpl, ExpressionT> { public: AllOf() {} AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} AllOf& add( Matcher const& matcher ) { m_matchers.push_back( matcher.clone() ); return *this; } virtual bool match( ExpressionT const& expr ) const { for( std::size_t i = 0; i < m_matchers.size(); ++i ) if( !m_matchers[i]->match( expr ) ) return false; return true; } virtual std::string toString() const { std::ostringstream oss; oss << "( "; for( std::size_t i = 0; i < m_matchers.size(); ++i ) { if( i != 0 ) oss << " and "; oss << m_matchers[i]->toString(); } oss << " )"; return oss.str(); } AllOf operator && ( Matcher const& other ) const { AllOf allOfExpr( *this ); allOfExpr.add( other ); return allOfExpr; } private: std::vector > > m_matchers; }; template class AnyOf : public MatcherImpl, ExpressionT> { public: AnyOf() {} AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} AnyOf& add( Matcher const& matcher ) { m_matchers.push_back( matcher.clone() ); return *this; } virtual bool match( ExpressionT const& expr ) const { for( std::size_t i = 0; i < m_matchers.size(); ++i ) if( m_matchers[i]->match( expr ) ) return true; return false; } virtual std::string toString() const { std::ostringstream oss; oss << "( "; for( std::size_t i = 0; i < m_matchers.size(); ++i ) { if( i != 0 ) oss << " or "; oss << m_matchers[i]->toString(); } oss << " )"; return oss.str(); } AnyOf operator || ( Matcher const& other ) const { AnyOf anyOfExpr( *this ); anyOfExpr.add( other ); return anyOfExpr; } private: std::vector > > m_matchers; }; } // namespace Generic template Generic::AllOf Matcher::operator && ( Matcher const& other ) const { Generic::AllOf allOfExpr; allOfExpr.add( *this ); allOfExpr.add( other ); return allOfExpr; } template Generic::AnyOf Matcher::operator || ( Matcher const& other ) const { Generic::AnyOf anyOfExpr; anyOfExpr.add( *this ); anyOfExpr.add( other ); return anyOfExpr; } template Generic::Not Matcher::operator ! () const { return Generic::Not( *this ); } namespace StdString { inline std::string makeString( std::string const& str ) { return str; } inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } struct CasedString { CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) : m_caseSensitivity( caseSensitivity ), m_str( adjustString( str ) ) {} std::string adjustString( std::string const& str ) const { return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; } std::string toStringSuffix() const { return m_caseSensitivity == CaseSensitive::No ? " (case insensitive)" : std::string(); } CaseSensitive::Choice m_caseSensitivity; std::string m_str; }; struct Equals : MatcherImpl { Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) : m_data( str, caseSensitivity ) {} Equals( Equals const& other ) : m_data( other.m_data ){} virtual ~Equals(); virtual bool match( std::string const& expr ) const { return m_data.m_str == m_data.adjustString( expr );; } virtual std::string toString() const { return "equals: \"" + m_data.m_str + '"' + m_data.toStringSuffix(); } CasedString m_data; }; struct Contains : MatcherImpl { Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) : m_data( substr, caseSensitivity ){} Contains( Contains const& other ) : m_data( other.m_data ){} virtual ~Contains(); virtual bool match( std::string const& expr ) const { return m_data.adjustString( expr ).find( m_data.m_str ) != std::string::npos; } virtual std::string toString() const { return "contains: \"" + m_data.m_str + '"' + m_data.toStringSuffix(); } CasedString m_data; }; struct StartsWith : MatcherImpl { StartsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) : m_data( substr, caseSensitivity ){} StartsWith( StartsWith const& other ) : m_data( other.m_data ){} virtual ~StartsWith(); virtual bool match( std::string const& expr ) const { return startsWith( m_data.adjustString( expr ), m_data.m_str ); } virtual std::string toString() const { return "starts with: \"" + m_data.m_str + '"' + m_data.toStringSuffix(); } CasedString m_data; }; struct EndsWith : MatcherImpl { EndsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) : m_data( substr, caseSensitivity ){} EndsWith( EndsWith const& other ) : m_data( other.m_data ){} virtual ~EndsWith(); virtual bool match( std::string const& expr ) const { return endsWith( m_data.adjustString( expr ), m_data.m_str ); } virtual std::string toString() const { return "ends with: \"" + m_data.m_str + '"' + m_data.toStringSuffix(); } CasedString m_data; }; } // namespace StdString } // namespace Impl // The following functions create the actual matcher objects. // This allows the types to be inferred template inline Impl::Generic::Not Not( Impl::Matcher const& m ) { return Impl::Generic::Not( m ); } template inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, Impl::Matcher const& m2 ) { return Impl::Generic::AllOf().add( m1 ).add( m2 ); } template inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, Impl::Matcher const& m2, Impl::Matcher const& m3 ) { return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); } template inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, Impl::Matcher const& m2 ) { return Impl::Generic::AnyOf().add( m1 ).add( m2 ); } template inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, Impl::Matcher const& m2, Impl::Matcher const& m3 ) { return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); } inline Impl::StdString::Equals Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { return Impl::StdString::Equals( str, caseSensitivity ); } inline Impl::StdString::Equals Equals( const char* str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { return Impl::StdString::Equals( Impl::StdString::makeString( str ), caseSensitivity ); } inline Impl::StdString::Contains Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { return Impl::StdString::Contains( substr, caseSensitivity ); } inline Impl::StdString::Contains Contains( const char* substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { return Impl::StdString::Contains( Impl::StdString::makeString( substr ), caseSensitivity ); } inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { return Impl::StdString::StartsWith( substr ); } inline Impl::StdString::StartsWith StartsWith( const char* substr ) { return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); } inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { return Impl::StdString::EndsWith( substr ); } inline Impl::StdString::EndsWith EndsWith( const char* substr ) { return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); } } // namespace Matchers using namespace Matchers; } // namespace Catch namespace Catch { struct TestFailureException{}; template class ExpressionLhs; struct CopyableStream { CopyableStream() {} CopyableStream( CopyableStream const& other ) { oss << other.oss.str(); } CopyableStream& operator=( CopyableStream const& other ) { oss.str(std::string()); oss << other.oss.str(); return *this; } std::ostringstream oss; }; class ResultBuilder : public DecomposedExpression { public: ResultBuilder( char const* macroName, SourceLineInfo const& lineInfo, char const* capturedExpression, ResultDisposition::Flags resultDisposition, char const* secondArg = "" ); template ExpressionLhs operator <= ( T const& operand ); ExpressionLhs operator <= ( bool value ); template ResultBuilder& operator << ( T const& value ) { m_stream.oss << value; return *this; } ResultBuilder& setResultType( ResultWas::OfType result ); ResultBuilder& setResultType( bool result ); void endExpression( DecomposedExpression const& expr ); virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE; AssertionResult build() const; AssertionResult build( DecomposedExpression const& expr ) const; void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); void captureResult( ResultWas::OfType resultType ); void captureExpression(); void captureExpectedException( std::string const& expectedMessage ); void captureExpectedException( Matchers::Impl::Matcher const& matcher ); void handleResult( AssertionResult const& result ); void react(); bool shouldDebugBreak() const; bool allowThrows() const; template void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ); private: AssertionInfo m_assertionInfo; AssertionResultData m_data; CopyableStream m_stream; bool m_shouldDebugBreak; bool m_shouldThrow; }; } // namespace Catch // Include after due to circular dependency: // #included from: catch_expression_lhs.hpp #define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED // #included from: catch_evaluate.hpp #define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4389) // '==' : signed/unsigned mismatch #endif #include namespace Catch { namespace Internal { enum Operator { IsEqualTo, IsNotEqualTo, IsLessThan, IsGreaterThan, IsLessThanOrEqualTo, IsGreaterThanOrEqualTo }; template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; template inline T& opCast(T const& t) { return const_cast(t); } // nullptr_t support based on pull request #154 from Konstantin Baumann #ifdef CATCH_CONFIG_CPP11_NULLPTR inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } #endif // CATCH_CONFIG_CPP11_NULLPTR // So the compare overloads can be operator agnostic we convey the operator as a template // enum, which is used to specialise an Evaluator for doing the comparison. template class Evaluator{}; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs) { return bool( opCast( lhs ) == opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return bool( opCast( lhs ) != opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return bool( opCast( lhs ) < opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return bool( opCast( lhs ) > opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return bool( opCast( lhs ) >= opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return bool( opCast( lhs ) <= opCast( rhs ) ); } }; template bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { return Evaluator::evaluate( lhs, rhs ); } // This level of indirection allows us to specialise for integer types // to avoid signed/ unsigned warnings // "base" overload template bool compare( T1 const& lhs, T2 const& rhs ) { return Evaluator::evaluate( lhs, rhs ); } // unsigned X to int template bool compare( unsigned int lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned long lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned char lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } // unsigned X to long template bool compare( unsigned int lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned long lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned char lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } // int to unsigned X template bool compare( int lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( int lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( int lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // long to unsigned X template bool compare( long lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // pointer to long (when comparing against NULL) template bool compare( long lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, long rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } // pointer to int (when comparing against NULL) template bool compare( int lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, int rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } #ifdef CATCH_CONFIG_CPP11_LONG_LONG // long long to unsigned X template bool compare( long long lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long long lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long long lhs, unsigned long long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long long lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // unsigned long long to X template bool compare( unsigned long long lhs, int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( unsigned long long lhs, long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( unsigned long long lhs, long long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( unsigned long long lhs, char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // pointer to long long (when comparing against NULL) template bool compare( long long lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, long long rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } #endif // CATCH_CONFIG_CPP11_LONG_LONG #ifdef CATCH_CONFIG_CPP11_NULLPTR // pointer to nullptr_t (when comparing against nullptr) template bool compare( std::nullptr_t, T* rhs ) { return Evaluator::evaluate( nullptr, rhs ); } template bool compare( T* lhs, std::nullptr_t ) { return Evaluator::evaluate( lhs, nullptr ); } #endif // CATCH_CONFIG_CPP11_NULLPTR } // end of namespace Internal } // end of namespace Catch #ifdef _MSC_VER #pragma warning(pop) #endif // #included from: catch_tostring.h #define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED #include #include #include #include #include #ifdef __OBJC__ // #included from: catch_objc_arc.hpp #define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED #import #ifdef __has_feature #define CATCH_ARC_ENABLED __has_feature(objc_arc) #else #define CATCH_ARC_ENABLED 0 #endif void arcSafeRelease( NSObject* obj ); id performOptionalSelector( id obj, SEL sel ); #if !CATCH_ARC_ENABLED inline void arcSafeRelease( NSObject* obj ) { [obj release]; } inline id performOptionalSelector( id obj, SEL sel ) { if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; return nil; } #define CATCH_UNSAFE_UNRETAINED #define CATCH_ARC_STRONG #else inline void arcSafeRelease( NSObject* ){} inline id performOptionalSelector( id obj, SEL sel ) { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" #endif if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; #ifdef __clang__ #pragma clang diagnostic pop #endif return nil; } #define CATCH_UNSAFE_UNRETAINED __unsafe_unretained #define CATCH_ARC_STRONG __strong #endif #endif #ifdef CATCH_CONFIG_CPP11_TUPLE #include #endif #ifdef CATCH_CONFIG_CPP11_IS_ENUM #include #endif namespace Catch { // Why we're here. template std::string toString( T const& value ); // Built in overloads std::string toString( std::string const& value ); std::string toString( std::wstring const& value ); std::string toString( const char* const value ); std::string toString( char* const value ); std::string toString( const wchar_t* const value ); std::string toString( wchar_t* const value ); std::string toString( int value ); std::string toString( unsigned long value ); std::string toString( unsigned int value ); std::string toString( const double value ); std::string toString( const float value ); std::string toString( bool value ); std::string toString( char value ); std::string toString( signed char value ); std::string toString( unsigned char value ); #ifdef CATCH_CONFIG_CPP11_LONG_LONG std::string toString( long long value ); std::string toString( unsigned long long value ); #endif #ifdef CATCH_CONFIG_CPP11_NULLPTR std::string toString( std::nullptr_t ); #endif #ifdef __OBJC__ std::string toString( NSString const * const& nsstring ); std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); std::string toString( NSObject* const& nsObject ); #endif namespace Detail { extern const std::string unprintableString; struct BorgType { template BorgType( T const& ); }; struct TrueType { char sizer[1]; }; struct FalseType { char sizer[2]; }; TrueType& testStreamable( std::ostream& ); FalseType testStreamable( FalseType ); FalseType operator<<( std::ostream const&, BorgType const& ); template struct IsStreamInsertable { static std::ostream &s; static T const&t; enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; }; #if defined(CATCH_CONFIG_CPP11_IS_ENUM) template::value > struct EnumStringMaker { static std::string convert( T const& ) { return unprintableString; } }; template struct EnumStringMaker { static std::string convert( T const& v ) { return ::Catch::toString( static_cast::type>(v) ); } }; #endif template struct StringMakerBase { #if defined(CATCH_CONFIG_CPP11_IS_ENUM) template static std::string convert( T const& v ) { return EnumStringMaker::convert( v ); } #else template static std::string convert( T const& ) { return unprintableString; } #endif }; template<> struct StringMakerBase { template static std::string convert( T const& _value ) { std::ostringstream oss; oss << _value; return oss.str(); } }; std::string rawMemoryToString( const void *object, std::size_t size ); template inline std::string rawMemoryToString( const T& object ) { return rawMemoryToString( &object, sizeof(object) ); } } // end namespace Detail template struct StringMaker : Detail::StringMakerBase::value> {}; template struct StringMaker { template static std::string convert( U* p ) { if( !p ) return "NULL"; else return Detail::rawMemoryToString( p ); } }; template struct StringMaker { static std::string convert( R C::* p ) { if( !p ) return "NULL"; else return Detail::rawMemoryToString( p ); } }; namespace Detail { template std::string rangeToString( InputIterator first, InputIterator last ); } //template //struct StringMaker > { // static std::string convert( std::vector const& v ) { // return Detail::rangeToString( v.begin(), v.end() ); // } //}; template std::string toString( std::vector const& v ) { return Detail::rangeToString( v.begin(), v.end() ); } #ifdef CATCH_CONFIG_CPP11_TUPLE // toString for tuples namespace TupleDetail { template< typename Tuple, std::size_t N = 0, bool = (N < std::tuple_size::value) > struct ElementPrinter { static void print( const Tuple& tuple, std::ostream& os ) { os << ( N ? ", " : " " ) << Catch::toString(std::get(tuple)); ElementPrinter::print(tuple,os); } }; template< typename Tuple, std::size_t N > struct ElementPrinter { static void print( const Tuple&, std::ostream& ) {} }; } template struct StringMaker> { static std::string convert( const std::tuple& tuple ) { std::ostringstream os; os << '{'; TupleDetail::ElementPrinter>::print( tuple, os ); os << " }"; return os.str(); } }; #endif // CATCH_CONFIG_CPP11_TUPLE namespace Detail { template std::string makeString( T const& value ) { return StringMaker::convert( value ); } } // end namespace Detail /// \brief converts any type to a string /// /// The default template forwards on to ostringstream - except when an /// ostringstream overload does not exist - in which case it attempts to detect /// that and writes {?}. /// Overload (not specialise) this template for custom typs that you don't want /// to provide an ostream overload for. template std::string toString( T const& value ) { return StringMaker::convert( value ); } namespace Detail { template std::string rangeToString( InputIterator first, InputIterator last ) { std::ostringstream oss; oss << "{ "; if( first != last ) { oss << Catch::toString( *first ); for( ++first ; first != last ; ++first ) oss << ", " << Catch::toString( *first ); } oss << " }"; return oss.str(); } } } // end namespace Catch namespace Catch { template class BinaryExpression; template class MatchExpression; // Wraps the LHS of an expression and overloads comparison operators // for also capturing those and RHS (if any) template class ExpressionLhs : public DecomposedExpression { public: ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {} template BinaryExpression operator == ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression operator != ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression operator < ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression operator > ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression operator <= ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression operator >= ( RhsT const& rhs ) { return captureExpression( rhs ); } BinaryExpression operator == ( bool rhs ) { return captureExpression( rhs ); } BinaryExpression operator != ( bool rhs ) { return captureExpression( rhs ); } void endExpression() { m_truthy = m_lhs ? true : false; m_rb .setResultType( m_truthy ) .endExpression( *this ); } virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { dest = Catch::toString( m_truthy ); } private: template BinaryExpression captureExpression( RhsT& rhs ) const { return BinaryExpression( m_rb, m_lhs, rhs ); } template BinaryExpression captureExpression( bool rhs ) const { return BinaryExpression( m_rb, m_lhs, rhs ); } private: ResultBuilder& m_rb; T m_lhs; bool m_truthy; }; template class BinaryExpression : public DecomposedExpression { public: BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs ) : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {} void endExpression() const { m_rb .setResultType( Internal::compare( m_lhs, m_rhs ) ) .endExpression( *this ); } virtual bool isBinaryExpression() const CATCH_OVERRIDE { return true; } virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { std::string lhs = Catch::toString( m_lhs ); std::string rhs = Catch::toString( m_rhs ); char delim = lhs.size() + rhs.size() < 40 && lhs.find('\n') == std::string::npos && rhs.find('\n') == std::string::npos ? ' ' : '\n'; dest.reserve( 7 + lhs.size() + rhs.size() ); // 2 for spaces around operator // 2 for operator // 2 for parentheses (conditionally added later) // 1 for negation (conditionally added later) dest = lhs; dest += delim; dest += Internal::OperatorTraits::getName(); dest += delim; dest += rhs; } private: ResultBuilder& m_rb; LhsT m_lhs; RhsT m_rhs; }; template class MatchExpression : public DecomposedExpression { public: MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString ) : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} virtual bool isBinaryExpression() const CATCH_OVERRIDE { return true; } virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { std::string matcherAsString = m_matcher.toString(); dest = Catch::toString( m_arg ); dest += ' '; if( matcherAsString == Detail::unprintableString ) dest += m_matcherString; else dest += matcherAsString; } private: ArgT m_arg; MatcherT m_matcher; char const* m_matcherString; }; } // end namespace Catch namespace Catch { template inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { return ExpressionLhs( *this, operand ); } inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { return ExpressionLhs( *this, value ); } template inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ) { MatchExpression expr( arg, matcher, matcherString ); setResultType( matcher.match( arg ) ); endExpression( expr ); } } // namespace Catch // #included from: catch_message.h #define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED #include namespace Catch { struct MessageInfo { MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ); std::string macroName; SourceLineInfo lineInfo; ResultWas::OfType type; std::string message; unsigned int sequence; bool operator == ( MessageInfo const& other ) const { return sequence == other.sequence; } bool operator < ( MessageInfo const& other ) const { return sequence < other.sequence; } private: static unsigned int globalCount; }; struct MessageBuilder { MessageBuilder( std::string const& macroName, SourceLineInfo const& lineInfo, ResultWas::OfType type ) : m_info( macroName, lineInfo, type ) {} template MessageBuilder& operator << ( T const& value ) { m_stream << value; return *this; } MessageInfo m_info; std::ostringstream m_stream; }; class ScopedMessage { public: ScopedMessage( MessageBuilder const& builder ); ScopedMessage( ScopedMessage const& other ); ~ScopedMessage(); MessageInfo m_info; }; } // end namespace Catch // #included from: catch_interfaces_capture.h #define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED #include namespace Catch { class TestCase; class AssertionResult; struct AssertionInfo; struct SectionInfo; struct SectionEndInfo; struct MessageInfo; class ScopedMessageBuilder; struct Counts; struct IResultCapture { virtual ~IResultCapture(); virtual void assertionEnded( AssertionResult const& result ) = 0; virtual bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) = 0; virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual std::string getCurrentTestName() const = 0; virtual const AssertionResult* getLastResult() const = 0; virtual void handleFatalErrorCondition( std::string const& message ) = 0; }; IResultCapture& getResultCapture(); } // #included from: catch_debugger.h #define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED // #included from: catch_platform.h #define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) # define CATCH_PLATFORM_MAC #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) # define CATCH_PLATFORM_IPHONE #elif defined(linux) || defined(__linux) || defined(__linux__) # define CATCH_PLATFORM_LINUX #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) # define CATCH_PLATFORM_WINDOWS # if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) # define CATCH_DEFINES_NOMINMAX # endif # if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) # define CATCH_DEFINES_WIN32_LEAN_AND_MEAN # endif #endif #include namespace Catch{ bool isDebuggerActive(); void writeToDebugConsole( std::string const& text ); } #ifdef CATCH_PLATFORM_MAC // The following code snippet based on: // http://cocoawithlove.com/2008/03/break-into-debugger.html #if defined(__ppc64__) || defined(__ppc__) #define CATCH_TRAP() \ __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ : : : "memory","r0","r3","r4" ) #else #define CATCH_TRAP() __asm__("int $3\n" : : ) #endif #elif defined(CATCH_PLATFORM_LINUX) // If we can use inline assembler, do it because this allows us to break // directly at the location of the failing check instead of breaking inside // raise() called from it, i.e. one stack frame below. #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) #define CATCH_TRAP() asm volatile ("int $3") #else // Fall back to the generic way. #include #define CATCH_TRAP() raise(SIGTRAP) #endif #elif defined(_MSC_VER) #define CATCH_TRAP() __debugbreak() #elif defined(__MINGW32__) extern "C" __declspec(dllimport) void __stdcall DebugBreak(); #define CATCH_TRAP() DebugBreak() #endif #ifdef CATCH_TRAP #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } #else #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); #endif // #included from: catch_interfaces_runner.h #define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED namespace Catch { class TestCase; struct IRunner { virtual ~IRunner(); virtual bool aborting() const = 0; }; } /////////////////////////////////////////////////////////////////////////////// // In the event of a failure works out if the debugger needs to be invoked // and/or an exception thrown and takes appropriate action. // This needs to be done as a macro so the debugger will stop in the user // source code rather than in Catch library code #define INTERNAL_CATCH_REACT( resultBuilder ) \ if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ resultBuilder.react(); /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ try { \ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ ( __catchResult <= expr ).endExpression(); \ } \ catch( ... ) { \ __catchResult.useActiveException( resultDisposition ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ if( Catch::getResultCapture().getLastResult()->succeeded() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ if( !Catch::getResultCapture().getLastResult()->succeeded() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ try { \ static_cast(expr); \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ } \ catch( ... ) { \ __catchResult.useActiveException( resultDisposition ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS( expr, resultDisposition, matcher, macroName ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ if( __catchResult.allowThrows() ) \ try { \ static_cast(expr); \ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ } \ catch( ... ) { \ __catchResult.captureExpectedException( matcher ); \ } \ else \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ if( __catchResult.allowThrows() ) \ try { \ static_cast(expr); \ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ } \ catch( exceptionType ) { \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ } \ catch( ... ) { \ __catchResult.useActiveException( resultDisposition ); \ } \ else \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) /////////////////////////////////////////////////////////////////////////////// #ifdef CATCH_CONFIG_VARIADIC_MACROS #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ __catchResult.captureResult( messageType ); \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) #else #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ __catchResult << log + ::Catch::StreamEndStop(); \ __catchResult.captureResult( messageType ); \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) #endif /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_INFO( log, macroName ) \ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ try { \ __catchResult.captureMatch( arg, matcher, #matcher ); \ } catch( ... ) { \ __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) // #included from: internal/catch_section.h #define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED // #included from: catch_section_info.h #define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED // #included from: catch_totals.hpp #define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED #include namespace Catch { struct Counts { Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} Counts operator - ( Counts const& other ) const { Counts diff; diff.passed = passed - other.passed; diff.failed = failed - other.failed; diff.failedButOk = failedButOk - other.failedButOk; return diff; } Counts& operator += ( Counts const& other ) { passed += other.passed; failed += other.failed; failedButOk += other.failedButOk; return *this; } std::size_t total() const { return passed + failed + failedButOk; } bool allPassed() const { return failed == 0 && failedButOk == 0; } bool allOk() const { return failed == 0; } std::size_t passed; std::size_t failed; std::size_t failedButOk; }; struct Totals { Totals operator - ( Totals const& other ) const { Totals diff; diff.assertions = assertions - other.assertions; diff.testCases = testCases - other.testCases; return diff; } Totals delta( Totals const& prevTotals ) const { Totals diff = *this - prevTotals; if( diff.assertions.failed > 0 ) ++diff.testCases.failed; else if( diff.assertions.failedButOk > 0 ) ++diff.testCases.failedButOk; else ++diff.testCases.passed; return diff; } Totals& operator += ( Totals const& other ) { assertions += other.assertions; testCases += other.testCases; return *this; } Counts assertions; Counts testCases; }; } namespace Catch { struct SectionInfo { SectionInfo ( SourceLineInfo const& _lineInfo, std::string const& _name, std::string const& _description = std::string() ); std::string name; std::string description; SourceLineInfo lineInfo; }; struct SectionEndInfo { SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) {} SectionInfo sectionInfo; Counts prevAssertions; double durationInSeconds; }; } // end namespace Catch // #included from: catch_timer.h #define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED #ifdef CATCH_PLATFORM_WINDOWS typedef unsigned long long uint64_t; #else #include #endif namespace Catch { class Timer { public: Timer() : m_ticks( 0 ) {} void start(); unsigned int getElapsedMicroseconds() const; unsigned int getElapsedMilliseconds() const; double getElapsedSeconds() const; private: uint64_t m_ticks; }; } // namespace Catch #include namespace Catch { class Section : NonCopyable { public: Section( SectionInfo const& info ); ~Section(); // This indicates whether the section should be executed or not operator bool() const; private: SectionInfo m_info; std::string m_name; Counts m_assertions; bool m_sectionIncluded; Timer m_timer; }; } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS #define INTERNAL_CATCH_SECTION( ... ) \ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) #else #define INTERNAL_CATCH_SECTION( name, desc ) \ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) #endif // #included from: internal/catch_generators.hpp #define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED #include #include #include #include namespace Catch { template struct IGenerator { virtual ~IGenerator() {} virtual T getValue( std::size_t index ) const = 0; virtual std::size_t size () const = 0; }; template class BetweenGenerator : public IGenerator { public: BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} virtual T getValue( std::size_t index ) const { return m_from+static_cast( index ); } virtual std::size_t size() const { return static_cast( 1+m_to-m_from ); } private: T m_from; T m_to; }; template class ValuesGenerator : public IGenerator { public: ValuesGenerator(){} void add( T value ) { m_values.push_back( value ); } virtual T getValue( std::size_t index ) const { return m_values[index]; } virtual std::size_t size() const { return m_values.size(); } private: std::vector m_values; }; template class CompositeGenerator { public: CompositeGenerator() : m_totalSize( 0 ) {} // *** Move semantics, similar to auto_ptr *** CompositeGenerator( CompositeGenerator& other ) : m_fileInfo( other.m_fileInfo ), m_totalSize( 0 ) { move( other ); } CompositeGenerator& setFileInfo( const char* fileInfo ) { m_fileInfo = fileInfo; return *this; } ~CompositeGenerator() { deleteAll( m_composed ); } operator T () const { size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); typename std::vector*>::const_iterator it = m_composed.begin(); typename std::vector*>::const_iterator itEnd = m_composed.end(); for( size_t index = 0; it != itEnd; ++it ) { const IGenerator* generator = *it; if( overallIndex >= index && overallIndex < index + generator->size() ) { return generator->getValue( overallIndex-index ); } index += generator->size(); } CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so } void add( const IGenerator* generator ) { m_totalSize += generator->size(); m_composed.push_back( generator ); } CompositeGenerator& then( CompositeGenerator& other ) { move( other ); return *this; } CompositeGenerator& then( T value ) { ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( value ); add( valuesGen ); return *this; } private: void move( CompositeGenerator& other ) { std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); m_totalSize += other.m_totalSize; other.m_composed.clear(); } std::vector*> m_composed; std::string m_fileInfo; size_t m_totalSize; }; namespace Generators { template CompositeGenerator between( T from, T to ) { CompositeGenerator generators; generators.add( new BetweenGenerator( from, to ) ); return generators; } template CompositeGenerator values( T val1, T val2 ) { CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); generators.add( valuesGen ); return generators; } template CompositeGenerator values( T val1, T val2, T val3 ){ CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); valuesGen->add( val3 ); generators.add( valuesGen ); return generators; } template CompositeGenerator values( T val1, T val2, T val3, T val4 ) { CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); valuesGen->add( val3 ); valuesGen->add( val4 ); generators.add( valuesGen ); return generators; } } // end namespace Generators using namespace Generators; } // end namespace Catch #define INTERNAL_CATCH_LINESTR2( line ) #line #define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) #define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) // #included from: internal/catch_interfaces_exception.h #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED #include #include // #included from: catch_interfaces_registry_hub.h #define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED #include namespace Catch { class TestCase; struct ITestCaseRegistry; struct IExceptionTranslatorRegistry; struct IExceptionTranslator; struct IReporterRegistry; struct IReporterFactory; struct IRegistryHub { virtual ~IRegistryHub(); virtual IReporterRegistry const& getReporterRegistry() const = 0; virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; }; struct IMutableRegistryHub { virtual ~IMutableRegistryHub(); virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; virtual void registerListener( Ptr const& factory ) = 0; virtual void registerTest( TestCase const& testInfo ) = 0; virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; }; IRegistryHub& getRegistryHub(); IMutableRegistryHub& getMutableRegistryHub(); void cleanUp(); std::string translateActiveException(); } namespace Catch { typedef std::string(*exceptionTranslateFunction)(); struct IExceptionTranslator; typedef std::vector ExceptionTranslators; struct IExceptionTranslator { virtual ~IExceptionTranslator(); virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; }; struct IExceptionTranslatorRegistry { virtual ~IExceptionTranslatorRegistry(); virtual std::string translateActiveException() const = 0; }; class ExceptionTranslatorRegistrar { template class ExceptionTranslator : public IExceptionTranslator { public: ExceptionTranslator( std::string(*translateFunction)( T& ) ) : m_translateFunction( translateFunction ) {} virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { try { if( it == itEnd ) throw; else return (*it)->translate( it+1, itEnd ); } catch( T& ex ) { return m_translateFunction( ex ); } } protected: std::string(*m_translateFunction)( T& ); }; public: template ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { getMutableRegistryHub().registerTranslator ( new ExceptionTranslator( translateFunction ) ); } }; } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ static std::string translatorName( signature ); \ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ static std::string translatorName( signature ) #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // #included from: internal/catch_approx.hpp #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED #include #include #if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) #include #endif namespace Catch { namespace Detail { class Approx { public: explicit Approx ( double value ) : m_epsilon( std::numeric_limits::epsilon()*100 ), m_scale( 1.0 ), m_value( value ) {} Approx( Approx const& other ) : m_epsilon( other.m_epsilon ), m_scale( other.m_scale ), m_value( other.m_value ) {} static Approx custom() { return Approx( 0 ); } Approx operator()( double value ) { Approx approx( value ); approx.epsilon( m_epsilon ); approx.scale( m_scale ); return approx; } #if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) template ::value>::type> friend bool operator == ( const T& lhs, Approx const& rhs ) { // Thanks to Richard Harris for his help refining this formula auto lhs_v = double(lhs); return fabs( lhs_v - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs_v), fabs(rhs.m_value) ) ); } template ::value>::type> friend bool operator == ( Approx const& lhs, const T& rhs ) { return operator==( rhs, lhs ); } template ::value>::type> friend bool operator != ( T lhs, Approx const& rhs ) { return !operator==( lhs, rhs ); } template ::value>::type> friend bool operator != ( Approx const& lhs, T rhs ) { return !operator==( rhs, lhs ); } template ::value>::type> friend bool operator <= ( T lhs, Approx const& rhs ) { return double(lhs) < rhs.m_value || lhs == rhs; } template ::value>::type> friend bool operator <= ( Approx const& lhs, T rhs ) { return lhs.m_value < double(rhs) || lhs == rhs; } template ::value>::type> friend bool operator >= ( T lhs, Approx const& rhs ) { return double(lhs) > rhs.m_value || lhs == rhs; } template ::value>::type> friend bool operator >= ( Approx const& lhs, T rhs ) { return lhs.m_value > double(rhs) || lhs == rhs; } #else friend bool operator == ( double lhs, Approx const& rhs ) { // Thanks to Richard Harris for his help refining this formula return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); } friend bool operator == ( Approx const& lhs, double rhs ) { return operator==( rhs, lhs ); } friend bool operator != ( double lhs, Approx const& rhs ) { return !operator==( lhs, rhs ); } friend bool operator != ( Approx const& lhs, double rhs ) { return !operator==( rhs, lhs ); } friend bool operator <= ( double lhs, Approx const& rhs ) { return lhs < rhs.m_value || lhs == rhs; } friend bool operator <= ( Approx const& lhs, double rhs ) { return lhs.m_value < rhs || lhs == rhs; } friend bool operator >= ( double lhs, Approx const& rhs ) { return lhs > rhs.m_value || lhs == rhs; } friend bool operator >= ( Approx const& lhs, double rhs ) { return lhs.m_value > rhs || lhs == rhs; } #endif Approx& epsilon( double newEpsilon ) { m_epsilon = newEpsilon; return *this; } Approx& scale( double newScale ) { m_scale = newScale; return *this; } std::string toString() const { std::ostringstream oss; oss << "Approx( " << Catch::toString( m_value ) << " )"; return oss.str(); } private: double m_epsilon; double m_scale; double m_value; }; } template<> inline std::string toString( Detail::Approx const& value ) { return value.toString(); } } // end namespace Catch // #included from: internal/catch_interfaces_tag_alias_registry.h #define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED // #included from: catch_tag_alias.h #define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED #include namespace Catch { struct TagAlias { TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} std::string tag; SourceLineInfo lineInfo; }; struct RegistrarForTagAliases { RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); }; } // end namespace Catch #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } // #included from: catch_option.hpp #define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED namespace Catch { // An optional type template class Option { public: Option() : nullableValue( CATCH_NULL ) {} Option( T const& _value ) : nullableValue( new( storage ) T( _value ) ) {} Option( Option const& _other ) : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) {} ~Option() { reset(); } Option& operator= ( Option const& _other ) { if( &_other != this ) { reset(); if( _other ) nullableValue = new( storage ) T( *_other ); } return *this; } Option& operator = ( T const& _value ) { reset(); nullableValue = new( storage ) T( _value ); return *this; } void reset() { if( nullableValue ) nullableValue->~T(); nullableValue = CATCH_NULL; } T& operator*() { return *nullableValue; } T const& operator*() const { return *nullableValue; } T* operator->() { return nullableValue; } const T* operator->() const { return nullableValue; } T valueOr( T const& defaultValue ) const { return nullableValue ? *nullableValue : defaultValue; } bool some() const { return nullableValue != CATCH_NULL; } bool none() const { return nullableValue == CATCH_NULL; } bool operator !() const { return nullableValue == CATCH_NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( some() ); } private: T* nullableValue; char storage[sizeof(T)]; }; } // end namespace Catch namespace Catch { struct ITagAliasRegistry { virtual ~ITagAliasRegistry(); virtual Option find( std::string const& alias ) const = 0; virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; static ITagAliasRegistry const& get(); }; } // end namespace Catch // These files are included here so the single_include script doesn't put them // in the conditionally compiled sections // #included from: internal/catch_test_case_info.h #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED #include #include #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { struct ITestCase; struct TestCaseInfo { enum SpecialProperties{ None = 0, IsHidden = 1 << 1, ShouldFail = 1 << 2, MayFail = 1 << 3, Throws = 1 << 4, NonPortable = 1 << 5 }; TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::set const& _tags, SourceLineInfo const& _lineInfo ); TestCaseInfo( TestCaseInfo const& other ); friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); bool isHidden() const; bool throws() const; bool okToFail() const; bool expectedToFail() const; std::string name; std::string className; std::string description; std::set tags; std::set lcaseTags; std::string tagsAsString; SourceLineInfo lineInfo; SpecialProperties properties; }; class TestCase : public TestCaseInfo { public: TestCase( ITestCase* testCase, TestCaseInfo const& info ); TestCase( TestCase const& other ); TestCase withName( std::string const& _newName ) const; void invoke() const; TestCaseInfo const& getTestCaseInfo() const; void swap( TestCase& other ); bool operator == ( TestCase const& other ) const; bool operator < ( TestCase const& other ) const; TestCase& operator = ( TestCase const& other ); private: Ptr test; }; TestCase makeTestCase( ITestCase* testCase, std::string const& className, std::string const& name, std::string const& description, SourceLineInfo const& lineInfo ); } #ifdef __clang__ #pragma clang diagnostic pop #endif #ifdef __OBJC__ // #included from: internal/catch_objc.hpp #define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED #import #include // NB. Any general catch headers included here must be included // in catch.hpp first to make sure they are included by the single // header for non obj-usage /////////////////////////////////////////////////////////////////////////////// // This protocol is really only here for (self) documenting purposes, since // all its methods are optional. @protocol OcFixture @optional -(void) setUp; -(void) tearDown; @end namespace Catch { class OcMethod : public SharedImpl { public: OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} virtual void invoke() const { id obj = [[m_cls alloc] init]; performOptionalSelector( obj, @selector(setUp) ); performOptionalSelector( obj, m_sel ); performOptionalSelector( obj, @selector(tearDown) ); arcSafeRelease( obj ); } private: virtual ~OcMethod() {} Class m_cls; SEL m_sel; }; namespace Detail{ inline std::string getAnnotation( Class cls, std::string const& annotationName, std::string const& testCaseName ) { NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; SEL sel = NSSelectorFromString( selStr ); arcSafeRelease( selStr ); id value = performOptionalSelector( cls, sel ); if( value ) return [(NSString*)value UTF8String]; return ""; } } inline size_t registerTestMethods() { size_t noTestMethods = 0; int noClasses = objc_getClassList( CATCH_NULL, 0 ); Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); objc_getClassList( classes, noClasses ); for( int c = 0; c < noClasses; c++ ) { Class cls = classes[c]; { u_int count; Method* methods = class_copyMethodList( cls, &count ); for( u_int m = 0; m < count ; m++ ) { SEL selector = method_getName(methods[m]); std::string methodName = sel_getName(selector); if( startsWith( methodName, "Catch_TestCase_" ) ) { std::string testCaseName = methodName.substr( 15 ); std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); const char* className = class_getName( cls ); getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); noTestMethods++; } } free(methods); } } return noTestMethods; } namespace Matchers { namespace Impl { namespace NSStringMatchers { template struct StringHolder : MatcherImpl{ StringHolder( NSString* substr ) : m_substr( [substr copy] ){} StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} StringHolder() { arcSafeRelease( m_substr ); } NSString* m_substr; }; struct Equals : StringHolder { Equals( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str isEqualToString:m_substr]; } virtual std::string toString() const { return "equals string: " + Catch::toString( m_substr ); } }; struct Contains : StringHolder { Contains( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location != NSNotFound; } virtual std::string toString() const { return "contains string: " + Catch::toString( m_substr ); } }; struct StartsWith : StringHolder { StartsWith( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == 0; } virtual std::string toString() const { return "starts with: " + Catch::toString( m_substr ); } }; struct EndsWith : StringHolder { EndsWith( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == [str length] - [m_substr length]; } virtual std::string toString() const { return "ends with: " + Catch::toString( m_substr ); } }; } // namespace NSStringMatchers } // namespace Impl inline Impl::NSStringMatchers::Equals Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } inline Impl::NSStringMatchers::Contains Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } inline Impl::NSStringMatchers::StartsWith StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } inline Impl::NSStringMatchers::EndsWith EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } } // namespace Matchers using namespace Matchers; } // namespace Catch /////////////////////////////////////////////////////////////////////////////// #define OC_TEST_CASE( name, desc )\ +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ {\ return @ name; \ }\ +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ { \ return @ desc; \ } \ -(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) #endif #ifdef CATCH_IMPL // #included from: internal/catch_impl.hpp #define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED // Collect all the implementation files together here // These are the equivalent of what would usually be cpp files #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wweak-vtables" #endif // #included from: ../catch_session.hpp #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED // #included from: internal/catch_commandline.hpp #define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED // #included from: catch_config.hpp #define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED // #included from: catch_test_spec_parser.hpp #define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif // #included from: catch_test_spec.hpp #define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif // #included from: catch_wildcard_pattern.hpp #define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED namespace Catch { class WildcardPattern { enum WildcardPosition { NoWildcard = 0, WildcardAtStart = 1, WildcardAtEnd = 2, WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd }; public: WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) : m_caseSensitivity( caseSensitivity ), m_wildcard( NoWildcard ), m_pattern( adjustCase( pattern ) ) { if( startsWith( m_pattern, '*' ) ) { m_pattern = m_pattern.substr( 1 ); m_wildcard = WildcardAtStart; } if( endsWith( m_pattern, '*' ) ) { m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); } } virtual ~WildcardPattern(); virtual bool matches( std::string const& str ) const { switch( m_wildcard ) { case NoWildcard: return m_pattern == adjustCase( str ); case WildcardAtStart: return endsWith( adjustCase( str ), m_pattern ); case WildcardAtEnd: return startsWith( adjustCase( str ), m_pattern ); case WildcardAtBothEnds: return contains( adjustCase( str ), m_pattern ); } #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunreachable-code" #endif throw std::logic_error( "Unknown enum" ); #ifdef __clang__ #pragma clang diagnostic pop #endif } private: std::string adjustCase( std::string const& str ) const { return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; } CaseSensitive::Choice m_caseSensitivity; WildcardPosition m_wildcard; std::string m_pattern; }; } #include #include namespace Catch { class TestSpec { struct Pattern : SharedImpl<> { virtual ~Pattern(); virtual bool matches( TestCaseInfo const& testCase ) const = 0; }; class NamePattern : public Pattern { public: NamePattern( std::string const& name ) : m_wildcardPattern( toLower( name ), CaseSensitive::No ) {} virtual ~NamePattern(); virtual bool matches( TestCaseInfo const& testCase ) const { return m_wildcardPattern.matches( toLower( testCase.name ) ); } private: WildcardPattern m_wildcardPattern; }; class TagPattern : public Pattern { public: TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} virtual ~TagPattern(); virtual bool matches( TestCaseInfo const& testCase ) const { return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); } private: std::string m_tag; }; class ExcludedPattern : public Pattern { public: ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} virtual ~ExcludedPattern(); virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } private: Ptr m_underlyingPattern; }; struct Filter { std::vector > m_patterns; bool matches( TestCaseInfo const& testCase ) const { // All patterns in a filter must match for the filter to be a match for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { if( !(*it)->matches( testCase ) ) return false; } return true; } }; public: bool hasFilters() const { return !m_filters.empty(); } bool matches( TestCaseInfo const& testCase ) const { // A TestSpec matches if any filter matches for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) if( it->matches( testCase ) ) return true; return false; } private: std::vector m_filters; friend class TestSpecParser; }; } #ifdef __clang__ #pragma clang diagnostic pop #endif namespace Catch { class TestSpecParser { enum Mode{ None, Name, QuotedName, Tag, EscapedName }; Mode m_mode; bool m_exclusion; std::size_t m_start, m_pos; std::string m_arg; std::vector m_escapeChars; TestSpec::Filter m_currentFilter; TestSpec m_testSpec; ITagAliasRegistry const* m_tagAliases; public: TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} TestSpecParser& parse( std::string const& arg ) { m_mode = None; m_exclusion = false; m_start = std::string::npos; m_arg = m_tagAliases->expandAliases( arg ); m_escapeChars.clear(); for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) visitChar( m_arg[m_pos] ); if( m_mode == Name ) addPattern(); return *this; } TestSpec testSpec() { addFilter(); return m_testSpec; } private: void visitChar( char c ) { if( m_mode == None ) { switch( c ) { case ' ': return; case '~': m_exclusion = true; return; case '[': return startNewMode( Tag, ++m_pos ); case '"': return startNewMode( QuotedName, ++m_pos ); case '\\': return escape(); default: startNewMode( Name, m_pos ); break; } } if( m_mode == Name ) { if( c == ',' ) { addPattern(); addFilter(); } else if( c == '[' ) { if( subString() == "exclude:" ) m_exclusion = true; else addPattern(); startNewMode( Tag, ++m_pos ); } else if( c == '\\' ) escape(); } else if( m_mode == EscapedName ) m_mode = Name; else if( m_mode == QuotedName && c == '"' ) addPattern(); else if( m_mode == Tag && c == ']' ) addPattern(); } void startNewMode( Mode mode, std::size_t start ) { m_mode = mode; m_start = start; } void escape() { if( m_mode == None ) m_start = m_pos; m_mode = EscapedName; m_escapeChars.push_back( m_pos ); } std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } template void addPattern() { std::string token = subString(); for( size_t i = 0; i < m_escapeChars.size(); ++i ) token = token.substr( 0, m_escapeChars[i]-i ) + token.substr( m_escapeChars[i]+1-i ); m_escapeChars.clear(); if( startsWith( token, "exclude:" ) ) { m_exclusion = true; token = token.substr( 8 ); } if( !token.empty() ) { Ptr pattern = new T( token ); if( m_exclusion ) pattern = new TestSpec::ExcludedPattern( pattern ); m_currentFilter.m_patterns.push_back( pattern ); } m_exclusion = false; m_mode = None; } void addFilter() { if( !m_currentFilter.m_patterns.empty() ) { m_testSpec.m_filters.push_back( m_currentFilter ); m_currentFilter = TestSpec::Filter(); } } }; inline TestSpec parseTestSpec( std::string const& arg ) { return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); } } // namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif // #included from: catch_interfaces_config.h #define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED #include #include #include namespace Catch { struct Verbosity { enum Level { NoOutput = 0, Quiet, Normal }; }; struct WarnAbout { enum What { Nothing = 0x00, NoAssertions = 0x01 }; }; struct ShowDurations { enum OrNot { DefaultForReporter, Always, Never }; }; struct RunTests { enum InWhatOrder { InDeclarationOrder, InLexicographicalOrder, InRandomOrder }; }; struct UseColour { enum YesOrNo { Auto, Yes, No }; }; class TestSpec; struct IConfig : IShared { virtual ~IConfig(); virtual bool allowThrows() const = 0; virtual std::ostream& stream() const = 0; virtual std::string name() const = 0; virtual bool includeSuccessfulResults() const = 0; virtual bool shouldDebugBreak() const = 0; virtual bool warnAboutMissingAssertions() const = 0; virtual int abortAfter() const = 0; virtual bool showInvisibles() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; virtual TestSpec const& testSpec() const = 0; virtual RunTests::InWhatOrder runOrder() const = 0; virtual unsigned int rngSeed() const = 0; virtual UseColour::YesOrNo useColour() const = 0; virtual std::vector const& getSectionsToRun() const = 0; }; } // #included from: catch_stream.h #define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED // #included from: catch_streambuf.h #define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED #include namespace Catch { class StreamBufBase : public std::streambuf { public: virtual ~StreamBufBase() CATCH_NOEXCEPT; }; } #include #include #include #include namespace Catch { std::ostream& cout(); std::ostream& cerr(); struct IStream { virtual ~IStream() CATCH_NOEXCEPT; virtual std::ostream& stream() const = 0; }; class FileStream : public IStream { mutable std::ofstream m_ofs; public: FileStream( std::string const& filename ); virtual ~FileStream() CATCH_NOEXCEPT; public: // IStream virtual std::ostream& stream() const CATCH_OVERRIDE; }; class CoutStream : public IStream { mutable std::ostream m_os; public: CoutStream(); virtual ~CoutStream() CATCH_NOEXCEPT; public: // IStream virtual std::ostream& stream() const CATCH_OVERRIDE; }; class DebugOutStream : public IStream { CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; mutable std::ostream m_os; public: DebugOutStream(); virtual ~DebugOutStream() CATCH_NOEXCEPT; public: // IStream virtual std::ostream& stream() const CATCH_OVERRIDE; }; } #include #include #include #include #include #ifndef CATCH_CONFIG_CONSOLE_WIDTH #define CATCH_CONFIG_CONSOLE_WIDTH 80 #endif namespace Catch { struct ConfigData { ConfigData() : listTests( false ), listTags( false ), listReporters( false ), listTestNamesOnly( false ), showSuccessfulTests( false ), shouldDebugBreak( false ), noThrow( false ), showHelp( false ), showInvisibles( false ), filenamesAsTags( false ), abortAfter( -1 ), rngSeed( 0 ), verbosity( Verbosity::Normal ), warnings( WarnAbout::Nothing ), showDurations( ShowDurations::DefaultForReporter ), runOrder( RunTests::InDeclarationOrder ), useColour( UseColour::Auto ) {} bool listTests; bool listTags; bool listReporters; bool listTestNamesOnly; bool showSuccessfulTests; bool shouldDebugBreak; bool noThrow; bool showHelp; bool showInvisibles; bool filenamesAsTags; int abortAfter; unsigned int rngSeed; Verbosity::Level verbosity; WarnAbout::What warnings; ShowDurations::OrNot showDurations; RunTests::InWhatOrder runOrder; UseColour::YesOrNo useColour; std::string outputFilename; std::string name; std::string processName; std::vector reporterNames; std::vector testsOrTags; std::vector sectionsToRun; }; class Config : public SharedImpl { private: Config( Config const& other ); Config& operator = ( Config const& other ); virtual void dummy(); public: Config() {} Config( ConfigData const& data ) : m_data( data ), m_stream( openStream() ) { if( !data.testsOrTags.empty() ) { TestSpecParser parser( ITagAliasRegistry::get() ); for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) parser.parse( data.testsOrTags[i] ); m_testSpec = parser.testSpec(); } } virtual ~Config() { } std::string const& getFilename() const { return m_data.outputFilename ; } bool listTests() const { return m_data.listTests; } bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } bool listTags() const { return m_data.listTags; } bool listReporters() const { return m_data.listReporters; } std::string getProcessName() const { return m_data.processName; } bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } std::vector const& getReporterNames() const { return m_data.reporterNames; } std::vector const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } int abortAfter() const { return m_data.abortAfter; } TestSpec const& testSpec() const { return m_testSpec; } bool showHelp() const { return m_data.showHelp; } bool showInvisibles() const { return m_data.showInvisibles; } // IConfig interface virtual bool allowThrows() const { return !m_data.noThrow; } virtual std::ostream& stream() const { return m_stream->stream(); } virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; } virtual unsigned int rngSeed() const { return m_data.rngSeed; } virtual UseColour::YesOrNo useColour() const { return m_data.useColour; } private: IStream const* openStream() { if( m_data.outputFilename.empty() ) return new CoutStream(); else if( m_data.outputFilename[0] == '%' ) { if( m_data.outputFilename == "%debug" ) return new DebugOutStream(); else throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); } else return new FileStream( m_data.outputFilename ); } ConfigData m_data; CATCH_AUTO_PTR( IStream const ) m_stream; TestSpec m_testSpec; }; } // end namespace Catch // #included from: catch_clara.h #define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED // Use Catch's value for console width (store Clara's off to the side, if present) #ifdef CLARA_CONFIG_CONSOLE_WIDTH #define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH #undef CLARA_CONFIG_CONSOLE_WIDTH #endif #define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH // Declare Clara inside the Catch namespace #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { // #included from: ../external/clara.h // Version 0.0.2.4 // Only use header guard if we are not using an outer namespace #if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) #ifndef STITCH_CLARA_OPEN_NAMESPACE #define TWOBLUECUBES_CLARA_H_INCLUDED #define STITCH_CLARA_OPEN_NAMESPACE #define STITCH_CLARA_CLOSE_NAMESPACE #else #define STITCH_CLARA_CLOSE_NAMESPACE } #endif #define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE // ----------- #included from tbc_text_format.h ----------- // Only use header guard if we are not using an outer namespace #if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) #ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE #define TBC_TEXT_FORMAT_H_INCLUDED #endif #include #include #include #include // Use optional outer namespace #ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { #endif namespace Tbc { #ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; #else const unsigned int consoleWidth = 80; #endif struct TextAttributes { TextAttributes() : initialIndent( std::string::npos ), indent( 0 ), width( consoleWidth-1 ), tabChar( '\t' ) {} TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } std::size_t initialIndent; // indent of first line, or npos std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos std::size_t width; // maximum width of text, including indent. Longer text will wrap char tabChar; // If this char is seen the indent is changed to current pos }; class Text { public: Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) : attr( _attr ) { std::string wrappableChars = " [({.,/|\\-"; std::size_t indent = _attr.initialIndent != std::string::npos ? _attr.initialIndent : _attr.indent; std::string remainder = _str; while( !remainder.empty() ) { if( lines.size() >= 1000 ) { lines.push_back( "... message truncated due to excessive size" ); return; } std::size_t tabPos = std::string::npos; std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); std::size_t pos = remainder.find_first_of( '\n' ); if( pos <= width ) { width = pos; } pos = remainder.find_last_of( _attr.tabChar, width ); if( pos != std::string::npos ) { tabPos = pos; if( remainder[width] == '\n' ) width--; remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); } if( width == remainder.size() ) { spliceLine( indent, remainder, width ); } else if( remainder[width] == '\n' ) { spliceLine( indent, remainder, width ); if( width <= 1 || remainder.size() != 1 ) remainder = remainder.substr( 1 ); indent = _attr.indent; } else { pos = remainder.find_last_of( wrappableChars, width ); if( pos != std::string::npos && pos > 0 ) { spliceLine( indent, remainder, pos ); if( remainder[0] == ' ' ) remainder = remainder.substr( 1 ); } else { spliceLine( indent, remainder, width-1 ); lines.back() += "-"; } if( lines.size() == 1 ) indent = _attr.indent; if( tabPos != std::string::npos ) indent += tabPos; } } } void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); _remainder = _remainder.substr( _pos ); } typedef std::vector::const_iterator const_iterator; const_iterator begin() const { return lines.begin(); } const_iterator end() const { return lines.end(); } std::string const& last() const { return lines.back(); } std::size_t size() const { return lines.size(); } std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } std::string toString() const { std::ostringstream oss; oss << *this; return oss.str(); } inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); it != itEnd; ++it ) { if( it != _text.begin() ) _stream << "\n"; _stream << *it; } return _stream; } private: std::string str; TextAttributes attr; std::vector lines; }; } // end namespace Tbc #ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE } // end outer namespace #endif #endif // TBC_TEXT_FORMAT_H_INCLUDED // ----------- end of #include from tbc_text_format.h ----------- // ........... back in clara.h #undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE // ----------- #included from clara_compilers.h ----------- #ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED #define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED // Detect a number of compiler features - mostly C++11/14 conformance - by compiler // The following features are defined: // // CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? // CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? // CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods // CLARA_CONFIG_CPP11_OVERRIDE : is override supported? // CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) // CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? // CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? // In general each macro has a _NO_ form // (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. // Many features, at point of detection, define an _INTERNAL_ macro, so they // can be combined, en-mass, with the _NO_ forms later. // All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 #ifdef __clang__ #if __has_feature(cxx_nullptr) #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR #endif #if __has_feature(cxx_noexcept) #define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT #endif #endif // __clang__ //////////////////////////////////////////////////////////////////////////////// // GCC #ifdef __GNUC__ #if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR #endif // - otherwise more recent versions define __cplusplus >= 201103L // and will get picked up below #endif // __GNUC__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ #ifdef _MSC_VER #if (_MSC_VER >= 1600) #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR #define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR #endif #if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) #define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT #define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS #endif #endif // _MSC_VER //////////////////////////////////////////////////////////////////////////////// // C++ language feature support // catch all support for C++11 #if defined(__cplusplus) && __cplusplus >= 201103L #define CLARA_CPP11_OR_GREATER #if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR #endif #ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT #define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT #endif #ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS #define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS #endif #if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) #define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE #endif #if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) #define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR #endif #endif // __cplusplus >= 201103L // Now set the actual defines based on the above + anything the user has configured #if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) #define CLARA_CONFIG_CPP11_NULLPTR #endif #if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) #define CLARA_CONFIG_CPP11_NOEXCEPT #endif #if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) #define CLARA_CONFIG_CPP11_GENERATED_METHODS #endif #if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) #define CLARA_CONFIG_CPP11_OVERRIDE #endif #if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) #define CLARA_CONFIG_CPP11_UNIQUE_PTR #endif // noexcept support: #if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) #define CLARA_NOEXCEPT noexcept # define CLARA_NOEXCEPT_IS(x) noexcept(x) #else #define CLARA_NOEXCEPT throw() # define CLARA_NOEXCEPT_IS(x) #endif // nullptr support #ifdef CLARA_CONFIG_CPP11_NULLPTR #define CLARA_NULL nullptr #else #define CLARA_NULL NULL #endif // override support #ifdef CLARA_CONFIG_CPP11_OVERRIDE #define CLARA_OVERRIDE override #else #define CLARA_OVERRIDE #endif // unique_ptr support #ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR # define CLARA_AUTO_PTR( T ) std::unique_ptr #else # define CLARA_AUTO_PTR( T ) std::auto_ptr #endif #endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED // ----------- end of #include from clara_compilers.h ----------- // ........... back in clara.h #include #include #include #if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) #define CLARA_PLATFORM_WINDOWS #endif // Use optional outer namespace #ifdef STITCH_CLARA_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE #endif namespace Clara { struct UnpositionalTag {}; extern UnpositionalTag _; #ifdef CLARA_CONFIG_MAIN UnpositionalTag _; #endif namespace Detail { #ifdef CLARA_CONSOLE_WIDTH const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; #else const unsigned int consoleWidth = 80; #endif using namespace Tbc; inline bool startsWith( std::string const& str, std::string const& prefix ) { return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; } template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct IsBool { static const bool value = false; }; template<> struct IsBool { static const bool value = true; }; template void convertInto( std::string const& _source, T& _dest ) { std::stringstream ss; ss << _source; ss >> _dest; if( ss.fail() ) throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); } inline void convertInto( std::string const& _source, std::string& _dest ) { _dest = _source; } char toLowerCh(char c) { return static_cast( ::tolower( c ) ); } inline void convertInto( std::string const& _source, bool& _dest ) { std::string sourceLC = _source; std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh ); if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) _dest = true; else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) _dest = false; else throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); } template struct IArgFunction { virtual ~IArgFunction() {} #ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS IArgFunction() = default; IArgFunction( IArgFunction const& ) = default; #endif virtual void set( ConfigT& config, std::string const& value ) const = 0; virtual bool takesArg() const = 0; virtual IArgFunction* clone() const = 0; }; template class BoundArgFunction { public: BoundArgFunction() : functionObj( CLARA_NULL ) {} BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} BoundArgFunction& operator = ( BoundArgFunction const& other ) { IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; delete functionObj; functionObj = newFunctionObj; return *this; } ~BoundArgFunction() { delete functionObj; } void set( ConfigT& config, std::string const& value ) const { functionObj->set( config, value ); } bool takesArg() const { return functionObj->takesArg(); } bool isSet() const { return functionObj != CLARA_NULL; } private: IArgFunction* functionObj; }; template struct NullBinder : IArgFunction{ virtual void set( C&, std::string const& ) const {} virtual bool takesArg() const { return true; } virtual IArgFunction* clone() const { return new NullBinder( *this ); } }; template struct BoundDataMember : IArgFunction{ BoundDataMember( M C::* _member ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { convertInto( stringValue, p.*member ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } M C::* member; }; template struct BoundUnaryMethod : IArgFunction{ BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { typename RemoveConstRef::type value; convertInto( stringValue, value ); (p.*member)( value ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } void (C::*member)( M ); }; template struct BoundNullaryMethod : IArgFunction{ BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { bool value; convertInto( stringValue, value ); if( value ) (p.*member)(); } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } void (C::*member)(); }; template struct BoundUnaryFunction : IArgFunction{ BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} virtual void set( C& obj, std::string const& stringValue ) const { bool value; convertInto( stringValue, value ); if( value ) function( obj ); } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } void (*function)( C& ); }; template struct BoundBinaryFunction : IArgFunction{ BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} virtual void set( C& obj, std::string const& stringValue ) const { typename RemoveConstRef::type value; convertInto( stringValue, value ); function( obj, value ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } void (*function)( C&, T ); }; } // namespace Detail inline std::vector argsToVector( int argc, char const* const* const argv ) { std::vector args( static_cast( argc ) ); for( std::size_t i = 0; i < static_cast( argc ); ++i ) args[i] = argv[i]; return args; } class Parser { enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; Mode mode; std::size_t from; bool inQuotes; public: struct Token { enum Type { Positional, ShortOpt, LongOpt }; Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} Type type; std::string data; }; Parser() : mode( None ), from( 0 ), inQuotes( false ){} void parseIntoTokens( std::vector const& args, std::vector& tokens ) { const std::string doubleDash = "--"; for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) parseIntoTokens( args[i], tokens); } void parseIntoTokens( std::string const& arg, std::vector& tokens ) { for( std::size_t i = 0; i <= arg.size(); ++i ) { char c = arg[i]; if( c == '"' ) inQuotes = !inQuotes; mode = handleMode( i, c, arg, tokens ); } } Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { switch( mode ) { case None: return handleNone( i, c ); case MaybeShortOpt: return handleMaybeShortOpt( i, c ); case ShortOpt: case LongOpt: case SlashOpt: return handleOpt( i, c, arg, tokens ); case Positional: return handlePositional( i, c, arg, tokens ); default: throw std::logic_error( "Unknown mode" ); } } Mode handleNone( std::size_t i, char c ) { if( inQuotes ) { from = i; return Positional; } switch( c ) { case '-': return MaybeShortOpt; #ifdef CLARA_PLATFORM_WINDOWS case '/': from = i+1; return SlashOpt; #endif default: from = i; return Positional; } } Mode handleMaybeShortOpt( std::size_t i, char c ) { switch( c ) { case '-': from = i+1; return LongOpt; default: from = i; return ShortOpt; } } Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) return mode; std::string optName = arg.substr( from, i-from ); if( mode == ShortOpt ) for( std::size_t j = 0; j < optName.size(); ++j ) tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); else if( mode == SlashOpt && optName.size() == 1 ) tokens.push_back( Token( Token::ShortOpt, optName ) ); else tokens.push_back( Token( Token::LongOpt, optName ) ); return None; } Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) return mode; std::string data = arg.substr( from, i-from ); tokens.push_back( Token( Token::Positional, data ) ); return None; } }; template struct CommonArgProperties { CommonArgProperties() {} CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} Detail::BoundArgFunction boundField; std::string description; std::string detail; std::string placeholder; // Only value if boundField takes an arg bool takesArg() const { return !placeholder.empty(); } void validate() const { if( !boundField.isSet() ) throw std::logic_error( "option not bound" ); } }; struct OptionArgProperties { std::vector shortNames; std::string longName; bool hasShortName( std::string const& shortName ) const { return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); } bool hasLongName( std::string const& _longName ) const { return _longName == longName; } }; struct PositionalArgProperties { PositionalArgProperties() : position( -1 ) {} int position; // -1 means non-positional (floating) bool isFixedPositional() const { return position != -1; } }; template class CommandLine { struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { Arg() {} Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} using CommonArgProperties::placeholder; // !TBD std::string dbgName() const { if( !longName.empty() ) return "--" + longName; if( !shortNames.empty() ) return "-" + shortNames[0]; return "positional args"; } std::string commands() const { std::ostringstream oss; bool first = true; std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); for(; it != itEnd; ++it ) { if( first ) first = false; else oss << ", "; oss << "-" << *it; } if( !longName.empty() ) { if( !first ) oss << ", "; oss << "--" << longName; } if( !placeholder.empty() ) oss << " <" << placeholder << ">"; return oss.str(); } }; typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; friend void addOptName( Arg& arg, std::string const& optName ) { if( optName.empty() ) return; if( Detail::startsWith( optName, "--" ) ) { if( !arg.longName.empty() ) throw std::logic_error( "Only one long opt may be specified. '" + arg.longName + "' already specified, now attempting to add '" + optName + "'" ); arg.longName = optName.substr( 2 ); } else if( Detail::startsWith( optName, "-" ) ) arg.shortNames.push_back( optName.substr( 1 ) ); else throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); } friend void setPositionalArg( Arg& arg, int position ) { arg.position = position; } class ArgBuilder { public: ArgBuilder( Arg* arg ) : m_arg( arg ) {} // Bind a non-boolean data member (requires placeholder string) template void bind( M C::* field, std::string const& placeholder ) { m_arg->boundField = new Detail::BoundDataMember( field ); m_arg->placeholder = placeholder; } // Bind a boolean data member (no placeholder required) template void bind( bool C::* field ) { m_arg->boundField = new Detail::BoundDataMember( field ); } // Bind a method taking a single, non-boolean argument (requires a placeholder string) template void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); m_arg->placeholder = placeholder; } // Bind a method taking a single, boolean argument (no placeholder string required) template void bind( void (C::* unaryMethod)( bool ) ) { m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); } // Bind a method that takes no arguments (will be called if opt is present) template void bind( void (C::* nullaryMethod)() ) { m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); } // Bind a free function taking a single argument - the object to operate on (no placeholder string required) template void bind( void (* unaryFunction)( C& ) ) { m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); } // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) template void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); m_arg->placeholder = placeholder; } ArgBuilder& describe( std::string const& description ) { m_arg->description = description; return *this; } ArgBuilder& detail( std::string const& detail ) { m_arg->detail = detail; return *this; } protected: Arg* m_arg; }; class OptBuilder : public ArgBuilder { public: OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} OptBuilder& operator[]( std::string const& optName ) { addOptName( *ArgBuilder::m_arg, optName ); return *this; } }; public: CommandLine() : m_boundProcessName( new Detail::NullBinder() ), m_highestSpecifiedArgPosition( 0 ), m_throwOnUnrecognisedTokens( false ) {} CommandLine( CommandLine const& other ) : m_boundProcessName( other.m_boundProcessName ), m_options ( other.m_options ), m_positionalArgs( other.m_positionalArgs ), m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) { if( other.m_floatingArg.get() ) m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); } CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { m_throwOnUnrecognisedTokens = shouldThrow; return *this; } OptBuilder operator[]( std::string const& optName ) { m_options.push_back( Arg() ); addOptName( m_options.back(), optName ); OptBuilder builder( &m_options.back() ); return builder; } ArgBuilder operator[]( int position ) { m_positionalArgs.insert( std::make_pair( position, Arg() ) ); if( position > m_highestSpecifiedArgPosition ) m_highestSpecifiedArgPosition = position; setPositionalArg( m_positionalArgs[position], position ); ArgBuilder builder( &m_positionalArgs[position] ); return builder; } // Invoke this with the _ instance ArgBuilder operator[]( UnpositionalTag ) { if( m_floatingArg.get() ) throw std::logic_error( "Only one unpositional argument can be added" ); m_floatingArg.reset( new Arg() ); ArgBuilder builder( m_floatingArg.get() ); return builder; } template void bindProcessName( M C::* field ) { m_boundProcessName = new Detail::BoundDataMember( field ); } template void bindProcessName( void (C::*_unaryMethod)( M ) ) { m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); } void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; std::size_t maxWidth = 0; for( it = itBegin; it != itEnd; ++it ) maxWidth = (std::max)( maxWidth, it->commands().size() ); for( it = itBegin; it != itEnd; ++it ) { Detail::Text usage( it->commands(), Detail::TextAttributes() .setWidth( maxWidth+indent ) .setIndent( indent ) ); Detail::Text desc( it->description, Detail::TextAttributes() .setWidth( width - maxWidth - 3 ) ); for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { std::string usageCol = i < usage.size() ? usage[i] : ""; os << usageCol; if( i < desc.size() && !desc[i].empty() ) os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) << desc[i]; os << "\n"; } } } std::string optUsage() const { std::ostringstream oss; optUsage( oss ); return oss.str(); } void argSynopsis( std::ostream& os ) const { for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { if( i > 1 ) os << " "; typename std::map::const_iterator it = m_positionalArgs.find( i ); if( it != m_positionalArgs.end() ) os << "<" << it->second.placeholder << ">"; else if( m_floatingArg.get() ) os << "<" << m_floatingArg->placeholder << ">"; else throw std::logic_error( "non consecutive positional arguments with no floating args" ); } // !TBD No indication of mandatory args if( m_floatingArg.get() ) { if( m_highestSpecifiedArgPosition > 1 ) os << " "; os << "[<" << m_floatingArg->placeholder << "> ...]"; } } std::string argSynopsis() const { std::ostringstream oss; argSynopsis( oss ); return oss.str(); } void usage( std::ostream& os, std::string const& procName ) const { validate(); os << "usage:\n " << procName << " "; argSynopsis( os ); if( !m_options.empty() ) { os << " [options]\n\nwhere options are: \n"; optUsage( os, 2 ); } os << "\n"; } std::string usage( std::string const& procName ) const { std::ostringstream oss; usage( oss, procName ); return oss.str(); } ConfigT parse( std::vector const& args ) const { ConfigT config; parseInto( args, config ); return config; } std::vector parseInto( std::vector const& args, ConfigT& config ) const { std::string processName = args[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); if( lastSlash != std::string::npos ) processName = processName.substr( lastSlash+1 ); m_boundProcessName.set( config, processName ); std::vector tokens; Parser parser; parser.parseIntoTokens( args, tokens ); return populate( tokens, config ); } std::vector populate( std::vector const& tokens, ConfigT& config ) const { validate(); std::vector unusedTokens = populateOptions( tokens, config ); unusedTokens = populateFixedArgs( unusedTokens, config ); unusedTokens = populateFloatingArgs( unusedTokens, config ); return unusedTokens; } std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { std::vector unusedTokens; std::vector errors; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); for(; it != itEnd; ++it ) { Arg const& arg = *it; try { if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { if( arg.takesArg() ) { if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) errors.push_back( "Expected argument to option: " + token.data ); else arg.boundField.set( config, tokens[++i].data ); } else { arg.boundField.set( config, "true" ); } break; } } catch( std::exception& ex ) { errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); } } if( it == itEnd ) { if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) unusedTokens.push_back( token ); else if( errors.empty() && m_throwOnUnrecognisedTokens ) errors.push_back( "unrecognised option: " + token.data ); } } if( !errors.empty() ) { std::ostringstream oss; for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); it != itEnd; ++it ) { if( it != errors.begin() ) oss << "\n"; oss << *it; } throw std::runtime_error( oss.str() ); } return unusedTokens; } std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { std::vector unusedTokens; int position = 1; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; typename std::map::const_iterator it = m_positionalArgs.find( position ); if( it != m_positionalArgs.end() ) it->second.boundField.set( config, token.data ); else unusedTokens.push_back( token ); if( token.type == Parser::Token::Positional ) position++; } return unusedTokens; } std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { if( !m_floatingArg.get() ) return tokens; std::vector unusedTokens; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; if( token.type == Parser::Token::Positional ) m_floatingArg->boundField.set( config, token.data ); else unusedTokens.push_back( token ); } return unusedTokens; } void validate() const { if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) throw std::logic_error( "No options or arguments specified" ); for( typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); it != itEnd; ++it ) it->validate(); } private: Detail::BoundArgFunction m_boundProcessName; std::vector m_options; std::map m_positionalArgs; ArgAutoPtr m_floatingArg; int m_highestSpecifiedArgPosition; bool m_throwOnUnrecognisedTokens; }; } // end namespace Clara STITCH_CLARA_CLOSE_NAMESPACE #undef STITCH_CLARA_OPEN_NAMESPACE #undef STITCH_CLARA_CLOSE_NAMESPACE #endif // TWOBLUECUBES_CLARA_H_INCLUDED #undef STITCH_CLARA_OPEN_NAMESPACE // Restore Clara's value for console width, if present #ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH #define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH #undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH #endif #include namespace Catch { inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } inline void abortAfterX( ConfigData& config, int x ) { if( x < 1 ) throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); config.abortAfter = x; } inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } inline void addWarning( ConfigData& config, std::string const& _warning ) { if( _warning == "NoAssertions" ) config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); else throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' ); } inline void setOrder( ConfigData& config, std::string const& order ) { if( startsWith( "declared", order ) ) config.runOrder = RunTests::InDeclarationOrder; else if( startsWith( "lexical", order ) ) config.runOrder = RunTests::InLexicographicalOrder; else if( startsWith( "random", order ) ) config.runOrder = RunTests::InRandomOrder; else throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' ); } inline void setRngSeed( ConfigData& config, std::string const& seed ) { if( seed == "time" ) { config.rngSeed = static_cast( std::time(0) ); } else { std::stringstream ss; ss << seed; ss >> config.rngSeed; if( ss.fail() ) throw std::runtime_error( "Argment to --rng-seed should be the word 'time' or a number" ); } } inline void setVerbosity( ConfigData& config, int level ) { // !TBD: accept strings? config.verbosity = static_cast( level ); } inline void setShowDurations( ConfigData& config, bool _showDurations ) { config.showDurations = _showDurations ? ShowDurations::Always : ShowDurations::Never; } inline void setUseColour( ConfigData& config, std::string const& value ) { std::string mode = toLower( value ); if( mode == "yes" ) config.useColour = UseColour::Yes; else if( mode == "no" ) config.useColour = UseColour::No; else if( mode == "auto" ) config.useColour = UseColour::Auto; else throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); } inline void forceColour( ConfigData& config ) { config.useColour = UseColour::Yes; } inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { std::ifstream f( _filename.c_str() ); if( !f.is_open() ) throw std::domain_error( "Unable to load input file: " + _filename ); std::string line; while( std::getline( f, line ) ) { line = trim(line); if( !line.empty() && !startsWith( line, '#' ) ) { if( !startsWith( line, '"' ) ) line = '"' + line + '"'; addTestOrTags( config, line + ',' ); } } } inline Clara::CommandLine makeCommandLineParser() { using namespace Clara; CommandLine cli; cli.bindProcessName( &ConfigData::processName ); cli["-?"]["-h"]["--help"] .describe( "display usage information" ) .bind( &ConfigData::showHelp ); cli["-l"]["--list-tests"] .describe( "list all/matching test cases" ) .bind( &ConfigData::listTests ); cli["-t"]["--list-tags"] .describe( "list all/matching tags" ) .bind( &ConfigData::listTags ); cli["-s"]["--success"] .describe( "include successful tests in output" ) .bind( &ConfigData::showSuccessfulTests ); cli["-b"]["--break"] .describe( "break into debugger on failure" ) .bind( &ConfigData::shouldDebugBreak ); cli["-e"]["--nothrow"] .describe( "skip exception tests" ) .bind( &ConfigData::noThrow ); cli["-i"]["--invisibles"] .describe( "show invisibles (tabs, newlines)" ) .bind( &ConfigData::showInvisibles ); cli["-o"]["--out"] .describe( "output filename" ) .bind( &ConfigData::outputFilename, "filename" ); cli["-r"]["--reporter"] // .placeholder( "name[:filename]" ) .describe( "reporter to use (defaults to console)" ) .bind( &addReporterName, "name" ); cli["-n"]["--name"] .describe( "suite name" ) .bind( &ConfigData::name, "name" ); cli["-a"]["--abort"] .describe( "abort at first failure" ) .bind( &abortAfterFirst ); cli["-x"]["--abortx"] .describe( "abort after x failures" ) .bind( &abortAfterX, "no. failures" ); cli["-w"]["--warn"] .describe( "enable warnings" ) .bind( &addWarning, "warning name" ); // - needs updating if reinstated // cli.into( &setVerbosity ) // .describe( "level of verbosity (0=no output)" ) // .shortOpt( "v") // .longOpt( "verbosity" ) // .placeholder( "level" ); cli[_] .describe( "which test or tests to use" ) .bind( &addTestOrTags, "test name, pattern or tags" ); cli["-d"]["--durations"] .describe( "show test durations" ) .bind( &setShowDurations, "yes|no" ); cli["-f"]["--input-file"] .describe( "load test names to run from a file" ) .bind( &loadTestNamesFromFile, "filename" ); cli["-#"]["--filenames-as-tags"] .describe( "adds a tag for the filename" ) .bind( &ConfigData::filenamesAsTags ); cli["-c"]["--section"] .describe( "specify section to run" ) .bind( &addSectionToRun, "section name" ); // Less common commands which don't have a short form cli["--list-test-names-only"] .describe( "list all/matching test cases names only" ) .bind( &ConfigData::listTestNamesOnly ); cli["--list-reporters"] .describe( "list all reporters" ) .bind( &ConfigData::listReporters ); cli["--order"] .describe( "test case order (defaults to decl)" ) .bind( &setOrder, "decl|lex|rand" ); cli["--rng-seed"] .describe( "set a specific seed for random numbers" ) .bind( &setRngSeed, "'time'|number" ); cli["--force-colour"] .describe( "force colourised output (deprecated)" ) .bind( &forceColour ); cli["--use-colour"] .describe( "should output be colourised" ) .bind( &setUseColour, "yes|no" ); return cli; } } // end namespace Catch // #included from: internal/catch_list.hpp #define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED // #included from: catch_text.h #define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED #define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH #define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch // #included from: ../external/tbc_text_format.h // Only use header guard if we are not using an outer namespace #ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE # ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED # ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED # define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED # endif # else # define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED # endif #endif #ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED #include #include #include // Use optional outer namespace #ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { #endif namespace Tbc { #ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; #else const unsigned int consoleWidth = 80; #endif struct TextAttributes { TextAttributes() : initialIndent( std::string::npos ), indent( 0 ), width( consoleWidth-1 ) {} TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } std::size_t initialIndent; // indent of first line, or npos std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos std::size_t width; // maximum width of text, including indent. Longer text will wrap }; class Text { public: Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) : attr( _attr ) { const std::string wrappableBeforeChars = "[({<\t"; const std::string wrappableAfterChars = "])}>-,./|\\"; const std::string wrappableInsteadOfChars = " \n\r"; std::string indent = _attr.initialIndent != std::string::npos ? std::string( _attr.initialIndent, ' ' ) : std::string( _attr.indent, ' ' ); typedef std::string::const_iterator iterator; iterator it = _str.begin(); const iterator strEnd = _str.end(); while( it != strEnd ) { if( lines.size() >= 1000 ) { lines.push_back( "... message truncated due to excessive size" ); return; } std::string suffix; std::size_t width = (std::min)( static_cast( strEnd-it ), _attr.width-static_cast( indent.size() ) ); iterator itEnd = it+width; iterator itNext = _str.end(); iterator itNewLine = std::find( it, itEnd, '\n' ); if( itNewLine != itEnd ) itEnd = itNewLine; if( itEnd != strEnd ) { bool foundWrapPoint = false; iterator findIt = itEnd; do { if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) { itEnd = findIt+1; itNext = findIt+1; foundWrapPoint = true; } else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) { itEnd = findIt; itNext = findIt; foundWrapPoint = true; } else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) { itNext = findIt+1; itEnd = findIt; foundWrapPoint = true; } if( findIt == it ) break; else --findIt; } while( !foundWrapPoint ); if( !foundWrapPoint ) { // No good wrap char, so we'll break mid word and add a hyphen --itEnd; itNext = itEnd; suffix = "-"; } else { while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos ) --itEnd; } } lines.push_back( indent + std::string( it, itEnd ) + suffix ); if( indent.size() != _attr.indent ) indent = std::string( _attr.indent, ' ' ); it = itNext; } } typedef std::vector::const_iterator const_iterator; const_iterator begin() const { return lines.begin(); } const_iterator end() const { return lines.end(); } std::string const& last() const { return lines.back(); } std::size_t size() const { return lines.size(); } std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } std::string toString() const { std::ostringstream oss; oss << *this; return oss.str(); } inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); it != itEnd; ++it ) { if( it != _text.begin() ) _stream << "\n"; _stream << *it; } return _stream; } private: std::string str; TextAttributes attr; std::vector lines; }; } // end namespace Tbc #ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE } // end outer namespace #endif #endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED #undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE namespace Catch { using Tbc::Text; using Tbc::TextAttributes; } // #included from: catch_console_colour.hpp #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED namespace Catch { struct Colour { enum Code { None = 0, White, Red, Green, Blue, Cyan, Yellow, Grey, Bright = 0x10, BrightRed = Bright | Red, BrightGreen = Bright | Green, LightGrey = Bright | Grey, BrightWhite = Bright | White, // By intention FileName = LightGrey, Warning = Yellow, ResultError = BrightRed, ResultSuccess = BrightGreen, ResultExpectedFailure = Warning, Error = BrightRed, Success = Green, OriginalExpression = Cyan, ReconstructedExpression = Yellow, SecondaryText = LightGrey, Headers = White }; // Use constructed object for RAII guard Colour( Code _colourCode ); Colour( Colour const& other ); ~Colour(); // Use static method for one-shot changes static void use( Code _colourCode ); private: bool m_moved; }; inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } } // end namespace Catch // #included from: catch_interfaces_reporter.h #define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED #include #include #include #include namespace Catch { struct ReporterConfig { explicit ReporterConfig( Ptr const& _fullConfig ) : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} std::ostream& stream() const { return *m_stream; } Ptr fullConfig() const { return m_fullConfig; } private: std::ostream* m_stream; Ptr m_fullConfig; }; struct ReporterPreferences { ReporterPreferences() : shouldRedirectStdOut( false ) {} bool shouldRedirectStdOut; }; template struct LazyStat : Option { LazyStat() : used( false ) {} LazyStat& operator=( T const& _value ) { Option::operator=( _value ); used = false; return *this; } void reset() { Option::reset(); used = false; } bool used; }; struct TestRunInfo { TestRunInfo( std::string const& _name ) : name( _name ) {} std::string name; }; struct GroupInfo { GroupInfo( std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount ) : name( _name ), groupIndex( _groupIndex ), groupsCounts( _groupsCount ) {} std::string name; std::size_t groupIndex; std::size_t groupsCounts; }; struct AssertionStats { AssertionStats( AssertionResult const& _assertionResult, std::vector const& _infoMessages, Totals const& _totals ) : assertionResult( _assertionResult ), infoMessages( _infoMessages ), totals( _totals ) { if( assertionResult.hasMessage() ) { // Copy message into messages list. // !TBD This should have been done earlier, somewhere MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); builder << assertionResult.getMessage(); builder.m_info.message = builder.m_stream.str(); infoMessages.push_back( builder.m_info ); } } virtual ~AssertionStats(); # ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS AssertionStats( AssertionStats const& ) = default; AssertionStats( AssertionStats && ) = default; AssertionStats& operator = ( AssertionStats const& ) = default; AssertionStats& operator = ( AssertionStats && ) = default; # endif AssertionResult assertionResult; std::vector infoMessages; Totals totals; }; struct SectionStats { SectionStats( SectionInfo const& _sectionInfo, Counts const& _assertions, double _durationInSeconds, bool _missingAssertions ) : sectionInfo( _sectionInfo ), assertions( _assertions ), durationInSeconds( _durationInSeconds ), missingAssertions( _missingAssertions ) {} virtual ~SectionStats(); # ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS SectionStats( SectionStats const& ) = default; SectionStats( SectionStats && ) = default; SectionStats& operator = ( SectionStats const& ) = default; SectionStats& operator = ( SectionStats && ) = default; # endif SectionInfo sectionInfo; Counts assertions; double durationInSeconds; bool missingAssertions; }; struct TestCaseStats { TestCaseStats( TestCaseInfo const& _testInfo, Totals const& _totals, std::string const& _stdOut, std::string const& _stdErr, bool _aborting ) : testInfo( _testInfo ), totals( _totals ), stdOut( _stdOut ), stdErr( _stdErr ), aborting( _aborting ) {} virtual ~TestCaseStats(); # ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS TestCaseStats( TestCaseStats const& ) = default; TestCaseStats( TestCaseStats && ) = default; TestCaseStats& operator = ( TestCaseStats const& ) = default; TestCaseStats& operator = ( TestCaseStats && ) = default; # endif TestCaseInfo testInfo; Totals totals; std::string stdOut; std::string stdErr; bool aborting; }; struct TestGroupStats { TestGroupStats( GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting ) : groupInfo( _groupInfo ), totals( _totals ), aborting( _aborting ) {} TestGroupStats( GroupInfo const& _groupInfo ) : groupInfo( _groupInfo ), aborting( false ) {} virtual ~TestGroupStats(); # ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS TestGroupStats( TestGroupStats const& ) = default; TestGroupStats( TestGroupStats && ) = default; TestGroupStats& operator = ( TestGroupStats const& ) = default; TestGroupStats& operator = ( TestGroupStats && ) = default; # endif GroupInfo groupInfo; Totals totals; bool aborting; }; struct TestRunStats { TestRunStats( TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting ) : runInfo( _runInfo ), totals( _totals ), aborting( _aborting ) {} virtual ~TestRunStats(); # ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS TestRunStats( TestRunStats const& _other ) : runInfo( _other.runInfo ), totals( _other.totals ), aborting( _other.aborting ) {} # else TestRunStats( TestRunStats const& ) = default; TestRunStats( TestRunStats && ) = default; TestRunStats& operator = ( TestRunStats const& ) = default; TestRunStats& operator = ( TestRunStats && ) = default; # endif TestRunInfo runInfo; Totals totals; bool aborting; }; class MultipleReporters; struct IStreamingReporter : IShared { virtual ~IStreamingReporter(); // Implementing class must also provide the following static method: // static std::string getDescription(); virtual ReporterPreferences getPreferences() const = 0; virtual void noMatchingTestCases( std::string const& spec ) = 0; virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; // The return value indicates if the messages buffer should be cleared: virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; virtual void sectionEnded( SectionStats const& sectionStats ) = 0; virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; virtual void skipTest( TestCaseInfo const& testInfo ) = 0; virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } }; struct IReporterFactory : IShared { virtual ~IReporterFactory(); virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; virtual std::string getDescription() const = 0; }; struct IReporterRegistry { typedef std::map > FactoryMap; typedef std::vector > Listeners; virtual ~IReporterRegistry(); virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; virtual FactoryMap const& getFactories() const = 0; virtual Listeners const& getListeners() const = 0; }; Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); } #include #include namespace Catch { inline std::size_t listTests( Config const& config ) { TestSpec testSpec = config.testSpec(); if( config.testSpec().hasFilters() ) Catch::cout() << "Matching test cases:\n"; else { Catch::cout() << "All available test cases:\n"; testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); } std::size_t matchedTests = 0; TextAttributes nameAttr, tagsAttr; nameAttr.setInitialIndent( 2 ).setIndent( 4 ); tagsAttr.setIndent( 6 ); std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); it != itEnd; ++it ) { matchedTests++; TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); Colour::Code colour = testCaseInfo.isHidden() ? Colour::SecondaryText : Colour::None; Colour colourGuard( colour ); Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; if( !testCaseInfo.tags.empty() ) Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; } if( !config.testSpec().hasFilters() ) Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl; else Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl; return matchedTests; } inline std::size_t listTestsNamesOnly( Config const& config ) { TestSpec testSpec = config.testSpec(); if( !config.testSpec().hasFilters() ) testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); std::size_t matchedTests = 0; std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); it != itEnd; ++it ) { matchedTests++; TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); if( startsWith( testCaseInfo.name, '#' ) ) Catch::cout() << '"' << testCaseInfo.name << '"' << std::endl; else Catch::cout() << testCaseInfo.name << std::endl; } return matchedTests; } struct TagInfo { TagInfo() : count ( 0 ) {} void add( std::string const& spelling ) { ++count; spellings.insert( spelling ); } std::string all() const { std::string out; for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); it != itEnd; ++it ) out += "[" + *it + "]"; return out; } std::set spellings; std::size_t count; }; inline std::size_t listTags( Config const& config ) { TestSpec testSpec = config.testSpec(); if( config.testSpec().hasFilters() ) Catch::cout() << "Tags for matching test cases:\n"; else { Catch::cout() << "All available tags:\n"; testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); } std::map tagCounts; std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); it != itEnd; ++it ) { for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), tagItEnd = it->getTestCaseInfo().tags.end(); tagIt != tagItEnd; ++tagIt ) { std::string tagName = *tagIt; std::string lcaseTagName = toLower( tagName ); std::map::iterator countIt = tagCounts.find( lcaseTagName ); if( countIt == tagCounts.end() ) countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; countIt->second.add( tagName ); } } for( std::map::const_iterator countIt = tagCounts.begin(), countItEnd = tagCounts.end(); countIt != countItEnd; ++countIt ) { std::ostringstream oss; oss << " " << std::setw(2) << countIt->second.count << " "; Text wrapper( countIt->second.all(), TextAttributes() .setInitialIndent( 0 ) .setIndent( oss.str().size() ) .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); Catch::cout() << oss.str() << wrapper << '\n'; } Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; return tagCounts.size(); } inline std::size_t listReporters( Config const& /*config*/ ) { Catch::cout() << "Available reporters:\n"; IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; std::size_t maxNameLen = 0; for(it = itBegin; it != itEnd; ++it ) maxNameLen = (std::max)( maxNameLen, it->first.size() ); for(it = itBegin; it != itEnd; ++it ) { Text wrapper( it->second->getDescription(), TextAttributes() .setInitialIndent( 0 ) .setIndent( 7+maxNameLen ) .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); Catch::cout() << " " << it->first << ':' << std::string( maxNameLen - it->first.size() + 2, ' ' ) << wrapper << '\n'; } Catch::cout() << std::endl; return factories.size(); } inline Option list( Config const& config ) { Option listedCount; if( config.listTests() ) listedCount = listedCount.valueOr(0) + listTests( config ); if( config.listTestNamesOnly() ) listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); if( config.listTags() ) listedCount = listedCount.valueOr(0) + listTags( config ); if( config.listReporters() ) listedCount = listedCount.valueOr(0) + listReporters( config ); return listedCount; } } // end namespace Catch // #included from: internal/catch_run_context.hpp #define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED // #included from: catch_test_case_tracker.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED #include #include #include #include #include namespace Catch { namespace TestCaseTracking { struct NameAndLocation { std::string name; SourceLineInfo location; NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) : name( _name ), location( _location ) {} }; struct ITracker : SharedImpl<> { virtual ~ITracker(); // static queries virtual NameAndLocation const& nameAndLocation() const = 0; // dynamic queries virtual bool isComplete() const = 0; // Successfully completed or failed virtual bool isSuccessfullyCompleted() const = 0; virtual bool isOpen() const = 0; // Started but not complete virtual bool hasChildren() const = 0; virtual ITracker& parent() = 0; // actions virtual void close() = 0; // Successfully complete virtual void fail() = 0; virtual void markAsNeedingAnotherRun() = 0; virtual void addChild( Ptr const& child ) = 0; virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; virtual void openChild() = 0; // Debug/ checking virtual bool isSectionTracker() const = 0; virtual bool isIndexTracker() const = 0; }; class TrackerContext { enum RunState { NotStarted, Executing, CompletedCycle }; Ptr m_rootTracker; ITracker* m_currentTracker; RunState m_runState; public: static TrackerContext& instance() { static TrackerContext s_instance; return s_instance; } TrackerContext() : m_currentTracker( CATCH_NULL ), m_runState( NotStarted ) {} ITracker& startRun(); void endRun() { m_rootTracker.reset(); m_currentTracker = CATCH_NULL; m_runState = NotStarted; } void startCycle() { m_currentTracker = m_rootTracker.get(); m_runState = Executing; } void completeCycle() { m_runState = CompletedCycle; } bool completedCycle() const { return m_runState == CompletedCycle; } ITracker& currentTracker() { return *m_currentTracker; } void setCurrentTracker( ITracker* tracker ) { m_currentTracker = tracker; } }; class TrackerBase : public ITracker { protected: enum CycleState { NotStarted, Executing, ExecutingChildren, NeedsAnotherRun, CompletedSuccessfully, Failed }; class TrackerHasName { NameAndLocation m_nameAndLocation; public: TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} bool operator ()( Ptr const& tracker ) { return tracker->nameAndLocation().name == m_nameAndLocation.name && tracker->nameAndLocation().location == m_nameAndLocation.location; } }; typedef std::vector > Children; NameAndLocation m_nameAndLocation; TrackerContext& m_ctx; ITracker* m_parent; Children m_children; CycleState m_runState; public: TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) : m_nameAndLocation( nameAndLocation ), m_ctx( ctx ), m_parent( parent ), m_runState( NotStarted ) {} virtual ~TrackerBase(); virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { return m_nameAndLocation; } virtual bool isComplete() const CATCH_OVERRIDE { return m_runState == CompletedSuccessfully || m_runState == Failed; } virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { return m_runState == CompletedSuccessfully; } virtual bool isOpen() const CATCH_OVERRIDE { return m_runState != NotStarted && !isComplete(); } virtual bool hasChildren() const CATCH_OVERRIDE { return !m_children.empty(); } virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { m_children.push_back( child ); } virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); return( it != m_children.end() ) ? it->get() : CATCH_NULL; } virtual ITracker& parent() CATCH_OVERRIDE { assert( m_parent ); // Should always be non-null except for root return *m_parent; } virtual void openChild() CATCH_OVERRIDE { if( m_runState != ExecutingChildren ) { m_runState = ExecutingChildren; if( m_parent ) m_parent->openChild(); } } virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } void open() { m_runState = Executing; moveToThis(); if( m_parent ) m_parent->openChild(); } virtual void close() CATCH_OVERRIDE { // Close any still open children (e.g. generators) while( &m_ctx.currentTracker() != this ) m_ctx.currentTracker().close(); switch( m_runState ) { case NotStarted: case CompletedSuccessfully: case Failed: throw std::logic_error( "Illogical state" ); case NeedsAnotherRun: break;; case Executing: m_runState = CompletedSuccessfully; break; case ExecutingChildren: if( m_children.empty() || m_children.back()->isComplete() ) m_runState = CompletedSuccessfully; break; default: throw std::logic_error( "Unexpected state" ); } moveToParent(); m_ctx.completeCycle(); } virtual void fail() CATCH_OVERRIDE { m_runState = Failed; if( m_parent ) m_parent->markAsNeedingAnotherRun(); moveToParent(); m_ctx.completeCycle(); } virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { m_runState = NeedsAnotherRun; } private: void moveToParent() { assert( m_parent ); m_ctx.setCurrentTracker( m_parent ); } void moveToThis() { m_ctx.setCurrentTracker( this ); } }; class SectionTracker : public TrackerBase { std::vector m_filters; public: SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) : TrackerBase( nameAndLocation, ctx, parent ) { if( parent ) { while( !parent->isSectionTracker() ) parent = &parent->parent(); SectionTracker& parentSection = static_cast( *parent ); addNextFilters( parentSection.m_filters ); } } virtual ~SectionTracker(); virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { SectionTracker* section = CATCH_NULL; ITracker& currentTracker = ctx.currentTracker(); if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { assert( childTracker ); assert( childTracker->isSectionTracker() ); section = static_cast( childTracker ); } else { section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); currentTracker.addChild( section ); } if( !ctx.completedCycle() ) section->tryOpen(); return *section; } void tryOpen() { if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) open(); } void addInitialFilters( std::vector const& filters ) { if( !filters.empty() ) { m_filters.push_back(""); // Root - should never be consulted m_filters.push_back(""); // Test Case - not a section filter std::copy( filters.begin(), filters.end(), std::back_inserter( m_filters ) ); } } void addNextFilters( std::vector const& filters ) { if( filters.size() > 1 ) std::copy( filters.begin()+1, filters.end(), std::back_inserter( m_filters ) ); } }; class IndexTracker : public TrackerBase { int m_size; int m_index; public: IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) : TrackerBase( nameAndLocation, ctx, parent ), m_size( size ), m_index( -1 ) {} virtual ~IndexTracker(); virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { IndexTracker* tracker = CATCH_NULL; ITracker& currentTracker = ctx.currentTracker(); if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { assert( childTracker ); assert( childTracker->isIndexTracker() ); tracker = static_cast( childTracker ); } else { tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); currentTracker.addChild( tracker ); } if( !ctx.completedCycle() && !tracker->isComplete() ) { if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) tracker->moveNext(); tracker->open(); } return *tracker; } int index() const { return m_index; } void moveNext() { m_index++; m_children.clear(); } virtual void close() CATCH_OVERRIDE { TrackerBase::close(); if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) m_runState = Executing; } }; inline ITracker& TrackerContext::startRun() { m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); m_currentTracker = CATCH_NULL; m_runState = Executing; return *m_rootTracker; } } // namespace TestCaseTracking using TestCaseTracking::ITracker; using TestCaseTracking::TrackerContext; using TestCaseTracking::SectionTracker; using TestCaseTracking::IndexTracker; } // namespace Catch // #included from: catch_fatal_condition.hpp #define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED namespace Catch { // Report the error condition inline void reportFatal( std::string const& message ) { IContext& context = Catch::getCurrentContext(); IResultCapture* resultCapture = context.getResultCapture(); resultCapture->handleFatalErrorCondition( message ); } } // namespace Catch #if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// // #included from: catch_windows_h_proxy.h #define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED #ifdef CATCH_DEFINES_NOMINMAX # define NOMINMAX #endif #ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #ifdef __AFXDLL #include #else #include #endif #ifdef CATCH_DEFINES_NOMINMAX # undef NOMINMAX #endif #ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN # undef WIN32_LEAN_AND_MEAN #endif # if !defined ( CATCH_CONFIG_WINDOWS_SEH ) namespace Catch { struct FatalConditionHandler { void reset() {} }; } # else // CATCH_CONFIG_WINDOWS_SEH is defined namespace Catch { struct SignalDefs { DWORD id; const char* name; }; extern SignalDefs signalDefs[]; // There is no 1-1 mapping between signals and windows exceptions. // Windows can easily distinguish between SO and SigSegV, // but SigInt, SigTerm, etc are handled differently. SignalDefs signalDefs[] = { { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, }; struct FatalConditionHandler { static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { reset(); reportFatal(signalDefs[i].name); } } // If its not an exception we care about, pass it along. // This stops us from eating debugger breaks etc. return EXCEPTION_CONTINUE_SEARCH; } FatalConditionHandler() { isSet = true; // 32k seems enough for Catch to handle stack overflow, // but the value was found experimentally, so there is no strong guarantee guaranteeSize = 32 * 1024; exceptionHandlerHandle = CATCH_NULL; // Register as first handler in current chain exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); // Pass in guarantee size to be filled SetThreadStackGuarantee(&guaranteeSize); } static void reset() { if (isSet) { // Unregister handler and restore the old guarantee RemoveVectoredExceptionHandler(exceptionHandlerHandle); SetThreadStackGuarantee(&guaranteeSize); exceptionHandlerHandle = CATCH_NULL; isSet = false; } } ~FatalConditionHandler() { reset(); } private: static bool isSet; static ULONG guaranteeSize; static PVOID exceptionHandlerHandle; }; bool FatalConditionHandler::isSet = false; ULONG FatalConditionHandler::guaranteeSize = 0; PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; } // namespace Catch # endif // CATCH_CONFIG_WINDOWS_SEH #else // Not Windows - assumed to be POSIX compatible ////////////////////////// #include namespace Catch { struct SignalDefs { int id; const char* name; }; extern SignalDefs signalDefs[]; SignalDefs signalDefs[] = { { SIGINT, "SIGINT - Terminal interrupt signal" }, { SIGILL, "SIGILL - Illegal instruction signal" }, { SIGFPE, "SIGFPE - Floating point error signal" }, { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, { SIGTERM, "SIGTERM - Termination request signal" }, { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } }; struct FatalConditionHandler { static bool isSet; static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; static stack_t oldSigStack; static char altStackMem[SIGSTKSZ]; static void handleSignal( int sig ) { std::string name = ""; for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { SignalDefs &def = signalDefs[i]; if (sig == def.id) { name = def.name; break; } } reset(); reportFatal(name); raise( sig ); } FatalConditionHandler() { isSet = true; stack_t sigStack; sigStack.ss_sp = altStackMem; sigStack.ss_size = SIGSTKSZ; sigStack.ss_flags = 0; sigaltstack(&sigStack, &oldSigStack); struct sigaction sa = { 0 }; sa.sa_handler = handleSignal; sa.sa_flags = SA_ONSTACK; for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); } } ~FatalConditionHandler() { reset(); } static void reset() { if( isSet ) { // Set signals back to previous values -- hopefully nobody overwrote them in the meantime for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL); } // Return the old stack sigaltstack(&oldSigStack, CATCH_NULL); isSet = false; } } }; bool FatalConditionHandler::isSet = false; struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; stack_t FatalConditionHandler::oldSigStack = {}; char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; } // namespace Catch #endif // not Windows #include #include namespace Catch { class StreamRedirect { public: StreamRedirect( std::ostream& stream, std::string& targetString ) : m_stream( stream ), m_prevBuf( stream.rdbuf() ), m_targetString( targetString ) { stream.rdbuf( m_oss.rdbuf() ); } ~StreamRedirect() { m_targetString += m_oss.str(); m_stream.rdbuf( m_prevBuf ); } private: std::ostream& m_stream; std::streambuf* m_prevBuf; std::ostringstream m_oss; std::string& m_targetString; }; /////////////////////////////////////////////////////////////////////////// class RunContext : public IResultCapture, public IRunner { RunContext( RunContext const& ); void operator =( RunContext const& ); public: explicit RunContext( Ptr const& _config, Ptr const& reporter ) : m_runInfo( _config->name() ), m_context( getCurrentMutableContext() ), m_activeTestCase( CATCH_NULL ), m_config( _config ), m_reporter( reporter ) { m_context.setRunner( this ); m_context.setConfig( m_config ); m_context.setResultCapture( this ); m_reporter->testRunStarting( m_runInfo ); } virtual ~RunContext() { m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); } void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); } void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); } Totals runTest( TestCase const& testCase ) { Totals prevTotals = m_totals; std::string redirectedCout; std::string redirectedCerr; TestCaseInfo testInfo = testCase.getTestCaseInfo(); m_reporter->testCaseStarting( testInfo ); m_activeTestCase = &testCase; do { ITracker& rootTracker = m_trackerContext.startRun(); dynamic_cast( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); do { m_trackerContext.startCycle(); m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); runCurrentTest( redirectedCout, redirectedCerr ); } while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); } // !TBD: deprecated - this will be replaced by indexed trackers while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); Totals deltaTotals = m_totals.delta( prevTotals ); if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { deltaTotals.assertions.failed++; deltaTotals.testCases.passed--; deltaTotals.testCases.failed++; } m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, redirectedCout, redirectedCerr, aborting() ) ); m_activeTestCase = CATCH_NULL; m_testCaseTracker = CATCH_NULL; return deltaTotals; } Ptr config() const { return m_config; } private: // IResultCapture virtual void assertionEnded( AssertionResult const& result ) { if( result.getResultType() == ResultWas::Ok ) { m_totals.assertions.passed++; } else if( !result.isOk() ) { m_totals.assertions.failed++; } if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) m_messages.clear(); // Reset working state m_lastAssertionInfo = AssertionInfo( std::string(), m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); m_lastResult = result; } virtual bool sectionStarted ( SectionInfo const& sectionInfo, Counts& assertions ) { ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); if( !sectionTracker.isOpen() ) return false; m_activeSections.push_back( §ionTracker ); m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; m_reporter->sectionStarting( sectionInfo ); assertions = m_totals.assertions; return true; } bool testForMissingAssertions( Counts& assertions ) { if( assertions.total() != 0 ) return false; if( !m_config->warnAboutMissingAssertions() ) return false; if( m_trackerContext.currentTracker().hasChildren() ) return false; m_totals.assertions.failed++; assertions.failed++; return true; } virtual void sectionEnded( SectionEndInfo const& endInfo ) { Counts assertions = m_totals.assertions - endInfo.prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); if( !m_activeSections.empty() ) { m_activeSections.back()->close(); m_activeSections.pop_back(); } m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); m_messages.clear(); } virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { if( m_unfinishedSections.empty() ) m_activeSections.back()->fail(); else m_activeSections.back()->close(); m_activeSections.pop_back(); m_unfinishedSections.push_back( endInfo ); } virtual void pushScopedMessage( MessageInfo const& message ) { m_messages.push_back( message ); } virtual void popScopedMessage( MessageInfo const& message ) { m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); } virtual std::string getCurrentTestName() const { return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name : std::string(); } virtual const AssertionResult* getLastResult() const { return &m_lastResult; } virtual void handleFatalErrorCondition( std::string const& message ) { ResultBuilder resultBuilder = makeUnexpectedResultBuilder(); resultBuilder.setResultType( ResultWas::FatalErrorCondition ); resultBuilder << message; resultBuilder.captureExpression(); handleUnfinishedSections(); // Recreate section for test case (as we will lose the one that was in scope) TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); Counts assertions; assertions.failed = 1; SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); m_reporter->sectionEnded( testCaseSectionStats ); TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); Totals deltaTotals; deltaTotals.testCases.failed = 1; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, std::string(), std::string(), false ) ); m_totals.testCases.failed++; testGroupEnded( std::string(), m_totals, 1, 1 ); m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); } public: // !TBD We need to do this another way! bool aborting() const { return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); } private: void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); m_reporter->sectionStarting( testCaseSection ); Counts prevAssertions = m_totals.assertions; double duration = 0; try { m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, std::string(), ResultDisposition::Normal ); seedRng( *m_config ); Timer timer; timer.start(); if( m_reporter->getPreferences().shouldRedirectStdOut ) { StreamRedirect coutRedir( Catch::cout(), redirectedCout ); StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); invokeActiveTestCase(); } else { invokeActiveTestCase(); } duration = timer.getElapsedSeconds(); } catch( TestFailureException& ) { // This just means the test was aborted due to failure } catch(...) { makeUnexpectedResultBuilder().useActiveException(); } m_testCaseTracker->close(); handleUnfinishedSections(); m_messages.clear(); Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); if( testCaseInfo.okToFail() ) { std::swap( assertions.failedButOk, assertions.failed ); m_totals.assertions.failed -= assertions.failedButOk; m_totals.assertions.failedButOk += assertions.failedButOk; } SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); m_reporter->sectionEnded( testCaseSectionStats ); } void invokeActiveTestCase() { FatalConditionHandler fatalConditionHandler; // Handle signals m_activeTestCase->invoke(); fatalConditionHandler.reset(); } private: ResultBuilder makeUnexpectedResultBuilder() const { return ResultBuilder( m_lastAssertionInfo.macroName.c_str(), m_lastAssertionInfo.lineInfo, m_lastAssertionInfo.capturedExpression.c_str(), m_lastAssertionInfo.resultDisposition ); } void handleUnfinishedSections() { // If sections ended prematurely due to an exception we stored their // infos here so we can tear them down outside the unwind process. for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), itEnd = m_unfinishedSections.rend(); it != itEnd; ++it ) sectionEnded( *it ); m_unfinishedSections.clear(); } TestRunInfo m_runInfo; IMutableContext& m_context; TestCase const* m_activeTestCase; ITracker* m_testCaseTracker; ITracker* m_currentSectionTracker; AssertionResult m_lastResult; Ptr m_config; Totals m_totals; Ptr m_reporter; std::vector m_messages; AssertionInfo m_lastAssertionInfo; std::vector m_unfinishedSections; std::vector m_activeSections; TrackerContext m_trackerContext; }; IResultCapture& getResultCapture() { if( IResultCapture* capture = getCurrentContext().getResultCapture() ) return *capture; else throw std::logic_error( "No result capture instance" ); } } // end namespace Catch // #included from: internal/catch_version.h #define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED namespace Catch { // Versioning information struct Version { Version( unsigned int _majorVersion, unsigned int _minorVersion, unsigned int _patchNumber, std::string const& _branchName, unsigned int _buildNumber ); unsigned int const majorVersion; unsigned int const minorVersion; unsigned int const patchNumber; // buildNumber is only used if branchName is not null std::string const branchName; unsigned int const buildNumber; friend std::ostream& operator << ( std::ostream& os, Version const& version ); private: void operator=( Version const& ); }; extern Version libraryVersion; } #include #include #include namespace Catch { Ptr createReporter( std::string const& reporterName, Ptr const& config ) { Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); if( !reporter ) { std::ostringstream oss; oss << "No reporter registered with name: '" << reporterName << "'"; throw std::domain_error( oss.str() ); } return reporter; } Ptr makeReporter( Ptr const& config ) { std::vector reporters = config->getReporterNames(); if( reporters.empty() ) reporters.push_back( "console" ); Ptr reporter; for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); it != itEnd; ++it ) reporter = addReporter( reporter, createReporter( *it, config ) ); return reporter; } Ptr addListeners( Ptr const& config, Ptr reporters ) { IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); it != itEnd; ++it ) reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); return reporters; } Totals runTests( Ptr const& config ) { Ptr iconfig = config.get(); Ptr reporter = makeReporter( config ); reporter = addListeners( iconfig, reporter ); RunContext context( iconfig, reporter ); Totals totals; context.testGroupStarting( config->name(), 1, 1 ); TestSpec testSpec = config->testSpec(); if( !testSpec.hasFilters() ) testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); it != itEnd; ++it ) { if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) totals += context.runTest( *it ); else reporter->skipTest( *it ); } context.testGroupEnded( iconfig->name(), totals, 1, 1 ); return totals; } void applyFilenamesAsTags( IConfig const& config ) { std::vector const& tests = getAllTestCasesSorted( config ); for(std::size_t i = 0; i < tests.size(); ++i ) { TestCase& test = const_cast( tests[i] ); std::set tags = test.tags; std::string filename = test.lineInfo.file; std::string::size_type lastSlash = filename.find_last_of( "\\/" ); if( lastSlash != std::string::npos ) filename = filename.substr( lastSlash+1 ); std::string::size_type lastDot = filename.find_last_of( "." ); if( lastDot != std::string::npos ) filename = filename.substr( 0, lastDot ); tags.insert( "#" + filename ); setTags( test, tags ); } } class Session : NonCopyable { static bool alreadyInstantiated; public: struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; Session() : m_cli( makeCommandLineParser() ) { if( alreadyInstantiated ) { std::string msg = "Only one instance of Catch::Session can ever be used"; Catch::cerr() << msg << std::endl; throw std::logic_error( msg ); } alreadyInstantiated = true; } ~Session() { Catch::cleanUp(); } void showHelp( std::string const& processName ) { Catch::cout() << "\nCatch v" << libraryVersion << "\n"; m_cli.usage( Catch::cout(), processName ); Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; } int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { try { m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); if( m_configData.showHelp ) showHelp( m_configData.processName ); m_config.reset(); } catch( std::exception& ex ) { { Colour colourGuard( Colour::Red ); Catch::cerr() << "\nError(s) in input:\n" << Text( ex.what(), TextAttributes().setIndent(2) ) << "\n\n"; } m_cli.usage( Catch::cout(), m_configData.processName ); return (std::numeric_limits::max)(); } return 0; } void useConfigData( ConfigData const& _configData ) { m_configData = _configData; m_config.reset(); } int run( int argc, char const* const* const argv ) { int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) returnCode = run(); return returnCode; } int run() { if( m_configData.showHelp ) return 0; try { config(); // Force config to be constructed seedRng( *m_config ); if( m_configData.filenamesAsTags ) applyFilenamesAsTags( *m_config ); // Handle list request if( Option listed = list( config() ) ) return static_cast( *listed ); return static_cast( runTests( m_config ).assertions.failed ); } catch( std::exception& ex ) { Catch::cerr() << ex.what() << std::endl; return (std::numeric_limits::max)(); } } Clara::CommandLine const& cli() const { return m_cli; } std::vector const& unusedTokens() const { return m_unusedTokens; } ConfigData& configData() { return m_configData; } Config& config() { if( !m_config ) m_config = new Config( m_configData ); return *m_config; } private: Clara::CommandLine m_cli; std::vector m_unusedTokens; ConfigData m_configData; Ptr m_config; }; bool Session::alreadyInstantiated = false; } // end namespace Catch // #included from: catch_registry_hub.hpp #define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED // #included from: catch_test_case_registry_impl.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED #include #include #include #include #include namespace Catch { struct RandomNumberGenerator { typedef std::ptrdiff_t result_type; result_type operator()( result_type n ) const { return std::rand() % n; } #ifdef CATCH_CONFIG_CPP11_SHUFFLE static constexpr result_type min() { return 0; } static constexpr result_type max() { return 1000000; } result_type operator()() const { return std::rand() % max(); } #endif template static void shuffle( V& vector ) { RandomNumberGenerator rng; #ifdef CATCH_CONFIG_CPP11_SHUFFLE std::shuffle( vector.begin(), vector.end(), rng ); #else std::random_shuffle( vector.begin(), vector.end(), rng ); #endif } }; inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { std::vector sorted = unsortedTestCases; switch( config.runOrder() ) { case RunTests::InLexicographicalOrder: std::sort( sorted.begin(), sorted.end() ); break; case RunTests::InRandomOrder: { seedRng( config ); RandomNumberGenerator::shuffle( sorted ); } break; case RunTests::InDeclarationOrder: // already in declaration order break; } return sorted; } bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); } void enforceNoDuplicateTestCases( std::vector const& functions ) { std::set seenFunctions; for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); it != itEnd; ++it ) { std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); if( !prev.second ) { std::ostringstream ss; ss << Colour( Colour::Red ) << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n' << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; throw std::runtime_error(ss.str()); } } } std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { std::vector filtered; filtered.reserve( testCases.size() ); for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); it != itEnd; ++it ) if( matchTest( *it, testSpec, config ) ) filtered.push_back( *it ); return filtered; } std::vector const& getAllTestCasesSorted( IConfig const& config ) { return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); } class TestRegistry : public ITestCaseRegistry { public: TestRegistry() : m_currentSortOrder( RunTests::InDeclarationOrder ), m_unnamedCount( 0 ) {} virtual ~TestRegistry(); virtual void registerTest( TestCase const& testCase ) { std::string name = testCase.getTestCaseInfo().name; if( name.empty() ) { std::ostringstream oss; oss << "Anonymous test case " << ++m_unnamedCount; return registerTest( testCase.withName( oss.str() ) ); } m_functions.push_back( testCase ); } virtual std::vector const& getAllTests() const { return m_functions; } virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { if( m_sortedFunctions.empty() ) enforceNoDuplicateTestCases( m_functions ); if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { m_sortedFunctions = sortTests( config, m_functions ); m_currentSortOrder = config.runOrder(); } return m_sortedFunctions; } private: std::vector m_functions; mutable RunTests::InWhatOrder m_currentSortOrder; mutable std::vector m_sortedFunctions; size_t m_unnamedCount; std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised }; /////////////////////////////////////////////////////////////////////////// class FreeFunctionTestCase : public SharedImpl { public: FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} virtual void invoke() const { m_fun(); } private: virtual ~FreeFunctionTestCase(); TestFunction m_fun; }; inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { std::string className = classOrQualifiedMethodName; if( startsWith( className, '&' ) ) { std::size_t lastColons = className.rfind( "::" ); std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); if( penultimateColons == std::string::npos ) penultimateColons = 1; className = className.substr( penultimateColons, lastColons-penultimateColons ); } return className; } void registerTestCase ( ITestCase* testCase, char const* classOrQualifiedMethodName, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { getMutableRegistryHub().registerTest ( makeTestCase ( testCase, extractClassName( classOrQualifiedMethodName ), nameAndDesc.name, nameAndDesc.description, lineInfo ) ); } void registerTestCaseFunction ( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ) { registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); } /////////////////////////////////////////////////////////////////////////// AutoReg::AutoReg ( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ) { registerTestCaseFunction( function, lineInfo, nameAndDesc ); } AutoReg::~AutoReg() {} } // end namespace Catch // #included from: catch_reporter_registry.hpp #define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED #include namespace Catch { class ReporterRegistry : public IReporterRegistry { public: virtual ~ReporterRegistry() CATCH_OVERRIDE {} virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { FactoryMap::const_iterator it = m_factories.find( name ); if( it == m_factories.end() ) return CATCH_NULL; return it->second->create( ReporterConfig( config ) ); } void registerReporter( std::string const& name, Ptr const& factory ) { m_factories.insert( std::make_pair( name, factory ) ); } void registerListener( Ptr const& factory ) { m_listeners.push_back( factory ); } virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { return m_factories; } virtual Listeners const& getListeners() const CATCH_OVERRIDE { return m_listeners; } private: FactoryMap m_factories; Listeners m_listeners; }; } // #included from: catch_exception_translator_registry.hpp #define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED #ifdef __OBJC__ #import "Foundation/Foundation.h" #endif namespace Catch { class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { public: ~ExceptionTranslatorRegistry() { deleteAll( m_translators ); } virtual void registerTranslator( const IExceptionTranslator* translator ) { m_translators.push_back( translator ); } virtual std::string translateActiveException() const { try { #ifdef __OBJC__ // In Objective-C try objective-c exceptions first @try { return tryTranslators(); } @catch (NSException *exception) { return Catch::toString( [exception description] ); } #else return tryTranslators(); #endif } catch( TestFailureException& ) { throw; } catch( std::exception& ex ) { return ex.what(); } catch( std::string& msg ) { return msg; } catch( const char* msg ) { return msg; } catch(...) { return "Unknown exception"; } } std::string tryTranslators() const { if( m_translators.empty() ) throw; else return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); } private: std::vector m_translators; }; } namespace Catch { namespace { class RegistryHub : public IRegistryHub, public IMutableRegistryHub { RegistryHub( RegistryHub const& ); void operator=( RegistryHub const& ); public: // IRegistryHub RegistryHub() { } virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { return m_reporterRegistry; } virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { return m_testCaseRegistry; } virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { return m_exceptionTranslatorRegistry; } public: // IMutableRegistryHub virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { m_reporterRegistry.registerReporter( name, factory ); } virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { m_reporterRegistry.registerListener( factory ); } virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { m_testCaseRegistry.registerTest( testInfo ); } virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { m_exceptionTranslatorRegistry.registerTranslator( translator ); } private: TestRegistry m_testCaseRegistry; ReporterRegistry m_reporterRegistry; ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; }; // Single, global, instance inline RegistryHub*& getTheRegistryHub() { static RegistryHub* theRegistryHub = CATCH_NULL; if( !theRegistryHub ) theRegistryHub = new RegistryHub(); return theRegistryHub; } } IRegistryHub& getRegistryHub() { return *getTheRegistryHub(); } IMutableRegistryHub& getMutableRegistryHub() { return *getTheRegistryHub(); } void cleanUp() { delete getTheRegistryHub(); getTheRegistryHub() = CATCH_NULL; cleanUpContext(); } std::string translateActiveException() { return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); } } // end namespace Catch // #included from: catch_notimplemented_exception.hpp #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED #include namespace Catch { NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) : m_lineInfo( lineInfo ) { std::ostringstream oss; oss << lineInfo << ": function "; oss << "not implemented"; m_what = oss.str(); } const char* NotImplementedException::what() const CATCH_NOEXCEPT { return m_what.c_str(); } } // end namespace Catch // #included from: catch_context_impl.hpp #define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED // #included from: catch_stream.hpp #define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED #include #include #include namespace Catch { template class StreamBufImpl : public StreamBufBase { char data[bufferSize]; WriterF m_writer; public: StreamBufImpl() { setp( data, data + sizeof(data) ); } ~StreamBufImpl() CATCH_NOEXCEPT { sync(); } private: int overflow( int c ) { sync(); if( c != EOF ) { if( pbase() == epptr() ) m_writer( std::string( 1, static_cast( c ) ) ); else sputc( static_cast( c ) ); } return 0; } int sync() { if( pbase() != pptr() ) { m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); setp( pbase(), epptr() ); } return 0; } }; /////////////////////////////////////////////////////////////////////////// FileStream::FileStream( std::string const& filename ) { m_ofs.open( filename.c_str() ); if( m_ofs.fail() ) { std::ostringstream oss; oss << "Unable to open file: '" << filename << '\''; throw std::domain_error( oss.str() ); } } std::ostream& FileStream::stream() const { return m_ofs; } struct OutputDebugWriter { void operator()( std::string const&str ) { writeToDebugConsole( str ); } }; DebugOutStream::DebugOutStream() : m_streamBuf( new StreamBufImpl() ), m_os( m_streamBuf.get() ) {} std::ostream& DebugOutStream::stream() const { return m_os; } // Store the streambuf from cout up-front because // cout may get redirected when running tests CoutStream::CoutStream() : m_os( Catch::cout().rdbuf() ) {} std::ostream& CoutStream::stream() const { return m_os; } #ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions std::ostream& cout() { return std::cout; } std::ostream& cerr() { return std::cerr; } #endif } namespace Catch { class Context : public IMutableContext { Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} Context( Context const& ); void operator=( Context const& ); public: virtual ~Context() { deleteAllValues( m_generatorsByTestName ); } public: // IContext virtual IResultCapture* getResultCapture() { return m_resultCapture; } virtual IRunner* getRunner() { return m_runner; } virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { return getGeneratorsForCurrentTest() .getGeneratorInfo( fileInfo, totalSize ) .getCurrentIndex(); } virtual bool advanceGeneratorsForCurrentTest() { IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); return generators && generators->moveNext(); } virtual Ptr getConfig() const { return m_config; } public: // IMutableContext virtual void setResultCapture( IResultCapture* resultCapture ) { m_resultCapture = resultCapture; } virtual void setRunner( IRunner* runner ) { m_runner = runner; } virtual void setConfig( Ptr const& config ) { m_config = config; } friend IMutableContext& getCurrentMutableContext(); private: IGeneratorsForTest* findGeneratorsForCurrentTest() { std::string testName = getResultCapture()->getCurrentTestName(); std::map::const_iterator it = m_generatorsByTestName.find( testName ); return it != m_generatorsByTestName.end() ? it->second : CATCH_NULL; } IGeneratorsForTest& getGeneratorsForCurrentTest() { IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); if( !generators ) { std::string testName = getResultCapture()->getCurrentTestName(); generators = createGeneratorsForTest(); m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); } return *generators; } private: Ptr m_config; IRunner* m_runner; IResultCapture* m_resultCapture; std::map m_generatorsByTestName; }; namespace { Context* currentContext = CATCH_NULL; } IMutableContext& getCurrentMutableContext() { if( !currentContext ) currentContext = new Context(); return *currentContext; } IContext& getCurrentContext() { return getCurrentMutableContext(); } void cleanUpContext() { delete currentContext; currentContext = CATCH_NULL; } } // #included from: catch_console_colour_impl.hpp #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED namespace Catch { namespace { struct IColourImpl { virtual ~IColourImpl() {} virtual void use( Colour::Code _colourCode ) = 0; }; struct NoColourImpl : IColourImpl { void use( Colour::Code ) {} static IColourImpl* instance() { static NoColourImpl s_instance; return &s_instance; } }; } // anon namespace } // namespace Catch #if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) # ifdef CATCH_PLATFORM_WINDOWS # define CATCH_CONFIG_COLOUR_WINDOWS # else # define CATCH_CONFIG_COLOUR_ANSI # endif #endif #if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// namespace Catch { namespace { class Win32ColourImpl : public IColourImpl { public: Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) { CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); } virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { case Colour::None: return setTextAttribute( originalForegroundAttributes ); case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Red: return setTextAttribute( FOREGROUND_RED ); case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); case Colour::Grey: return setTextAttribute( 0 ); case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Bright: throw std::logic_error( "not a colour" ); } } private: void setTextAttribute( WORD _textAttribute ) { SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); } HANDLE stdoutHandle; WORD originalForegroundAttributes; WORD originalBackgroundAttributes; }; IColourImpl* platformColourInstance() { static Win32ColourImpl s_instance; Ptr config = getCurrentContext().getConfig(); UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto; if( colourMode == UseColour::Auto ) colourMode = !isDebuggerActive() ? UseColour::Yes : UseColour::No; return colourMode == UseColour::Yes ? &s_instance : NoColourImpl::instance(); } } // end anon namespace } // end namespace Catch #elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// #include namespace Catch { namespace { // use POSIX/ ANSI console terminal codes // Thanks to Adam Strzelecki for original contribution // (http://github.com/nanoant) // https://github.com/philsquared/Catch/pull/131 class PosixColourImpl : public IColourImpl { public: virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { case Colour::None: case Colour::White: return setColour( "[0m" ); case Colour::Red: return setColour( "[0;31m" ); case Colour::Green: return setColour( "[0;32m" ); case Colour::Blue: return setColour( "[0;34m" ); case Colour::Cyan: return setColour( "[0;36m" ); case Colour::Yellow: return setColour( "[0;33m" ); case Colour::Grey: return setColour( "[1;30m" ); case Colour::LightGrey: return setColour( "[0;37m" ); case Colour::BrightRed: return setColour( "[1;31m" ); case Colour::BrightGreen: return setColour( "[1;32m" ); case Colour::BrightWhite: return setColour( "[1;37m" ); case Colour::Bright: throw std::logic_error( "not a colour" ); } } static IColourImpl* instance() { static PosixColourImpl s_instance; return &s_instance; } private: void setColour( const char* _escapeCode ) { Catch::cout() << '\033' << _escapeCode; } }; IColourImpl* platformColourInstance() { Ptr config = getCurrentContext().getConfig(); UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto; if( colourMode == UseColour::Auto ) colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) ? UseColour::Yes : UseColour::No; return colourMode == UseColour::Yes ? PosixColourImpl::instance() : NoColourImpl::instance(); } } // end anon namespace } // end namespace Catch #else // not Windows or ANSI /////////////////////////////////////////////// namespace Catch { static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } } // end namespace Catch #endif // Windows/ ANSI/ None namespace Catch { Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } Colour::~Colour(){ if( !m_moved ) use( None ); } void Colour::use( Code _colourCode ) { static IColourImpl* impl = platformColourInstance(); impl->use( _colourCode ); } } // end namespace Catch // #included from: catch_generators_impl.hpp #define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED #include #include #include namespace Catch { struct GeneratorInfo : IGeneratorInfo { GeneratorInfo( std::size_t size ) : m_size( size ), m_currentIndex( 0 ) {} bool moveNext() { if( ++m_currentIndex == m_size ) { m_currentIndex = 0; return false; } return true; } std::size_t getCurrentIndex() const { return m_currentIndex; } std::size_t m_size; std::size_t m_currentIndex; }; /////////////////////////////////////////////////////////////////////////// class GeneratorsForTest : public IGeneratorsForTest { public: ~GeneratorsForTest() { deleteAll( m_generatorsInOrder ); } IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { std::map::const_iterator it = m_generatorsByName.find( fileInfo ); if( it == m_generatorsByName.end() ) { IGeneratorInfo* info = new GeneratorInfo( size ); m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); m_generatorsInOrder.push_back( info ); return *info; } return *it->second; } bool moveNext() { std::vector::const_iterator it = m_generatorsInOrder.begin(); std::vector::const_iterator itEnd = m_generatorsInOrder.end(); for(; it != itEnd; ++it ) { if( (*it)->moveNext() ) return true; } return false; } private: std::map m_generatorsByName; std::vector m_generatorsInOrder; }; IGeneratorsForTest* createGeneratorsForTest() { return new GeneratorsForTest(); } } // end namespace Catch // #included from: catch_assertionresult.hpp #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED namespace Catch { AssertionInfo::AssertionInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, std::string const& _capturedExpression, ResultDisposition::Flags _resultDisposition ) : macroName( _macroName ), lineInfo( _lineInfo ), capturedExpression( _capturedExpression ), resultDisposition( _resultDisposition ) {} AssertionResult::AssertionResult() {} AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) : m_info( info ), m_resultData( data ) {} AssertionResult::~AssertionResult() {} // Result was a success bool AssertionResult::succeeded() const { return Catch::isOk( m_resultData.resultType ); } // Result was a success, or failure is suppressed bool AssertionResult::isOk() const { return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); } ResultWas::OfType AssertionResult::getResultType() const { return m_resultData.resultType; } bool AssertionResult::hasExpression() const { return !m_info.capturedExpression.empty(); } bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); } std::string AssertionResult::getExpression() const { if( isFalseTest( m_info.resultDisposition ) ) return '!' + m_info.capturedExpression; else return m_info.capturedExpression; } std::string AssertionResult::getExpressionInMacro() const { if( m_info.macroName.empty() ) return m_info.capturedExpression; else return m_info.macroName + "( " + m_info.capturedExpression + " )"; } bool AssertionResult::hasExpandedExpression() const { return hasExpression() && getExpandedExpression() != getExpression(); } std::string AssertionResult::getExpandedExpression() const { return m_resultData.reconstructExpression(); } std::string AssertionResult::getMessage() const { return m_resultData.message; } SourceLineInfo AssertionResult::getSourceInfo() const { return m_info.lineInfo; } std::string AssertionResult::getTestMacroName() const { return m_info.macroName; } void AssertionResult::discardDecomposedExpression() const { m_resultData.decomposedExpression = CATCH_NULL; } void AssertionResult::expandDecomposedExpression() const { m_resultData.reconstructExpression(); } } // end namespace Catch // #included from: catch_test_case_info.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED namespace Catch { inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { if( startsWith( tag, '.' ) || tag == "hide" || tag == "!hide" ) return TestCaseInfo::IsHidden; else if( tag == "!throws" ) return TestCaseInfo::Throws; else if( tag == "!shouldfail" ) return TestCaseInfo::ShouldFail; else if( tag == "!mayfail" ) return TestCaseInfo::MayFail; else if( tag == "!nonportable" ) return TestCaseInfo::NonPortable; else return TestCaseInfo::None; } inline bool isReservedTag( std::string const& tag ) { return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); } inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { if( isReservedTag( tag ) ) { { Colour colourGuard( Colour::Red ); Catch::cerr() << "Tag name [" << tag << "] not allowed.\n" << "Tag names starting with non alpha-numeric characters are reserved\n"; } { Colour colourGuard( Colour::FileName ); Catch::cerr() << _lineInfo << std::endl; } exit(1); } } TestCase makeTestCase( ITestCase* _testCase, std::string const& _className, std::string const& _name, std::string const& _descOrTags, SourceLineInfo const& _lineInfo ) { bool isHidden( startsWith( _name, "./" ) ); // Legacy support // Parse out tags std::set tags; std::string desc, tag; bool inTag = false; for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { char c = _descOrTags[i]; if( !inTag ) { if( c == '[' ) inTag = true; else desc += c; } else { if( c == ']' ) { TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); if( prop == TestCaseInfo::IsHidden ) isHidden = true; else if( prop == TestCaseInfo::None ) enforceNotReservedTag( tag, _lineInfo ); tags.insert( tag ); tag.clear(); inTag = false; } else tag += c; } } if( isHidden ) { tags.insert( "hide" ); tags.insert( "." ); } TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); return TestCase( _testCase, info ); } void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) { testCaseInfo.tags = tags; testCaseInfo.lcaseTags.clear(); std::ostringstream oss; for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { oss << '[' << *it << ']'; std::string lcaseTag = toLower( *it ); testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); testCaseInfo.lcaseTags.insert( lcaseTag ); } testCaseInfo.tagsAsString = oss.str(); } TestCaseInfo::TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::set const& _tags, SourceLineInfo const& _lineInfo ) : name( _name ), className( _className ), description( _description ), lineInfo( _lineInfo ), properties( None ) { setTags( *this, _tags ); } TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) : name( other.name ), className( other.className ), description( other.description ), tags( other.tags ), lcaseTags( other.lcaseTags ), tagsAsString( other.tagsAsString ), lineInfo( other.lineInfo ), properties( other.properties ) {} bool TestCaseInfo::isHidden() const { return ( properties & IsHidden ) != 0; } bool TestCaseInfo::throws() const { return ( properties & Throws ) != 0; } bool TestCaseInfo::okToFail() const { return ( properties & (ShouldFail | MayFail ) ) != 0; } bool TestCaseInfo::expectedToFail() const { return ( properties & (ShouldFail ) ) != 0; } TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} TestCase::TestCase( TestCase const& other ) : TestCaseInfo( other ), test( other.test ) {} TestCase TestCase::withName( std::string const& _newName ) const { TestCase other( *this ); other.name = _newName; return other; } void TestCase::swap( TestCase& other ) { test.swap( other.test ); name.swap( other.name ); className.swap( other.className ); description.swap( other.description ); tags.swap( other.tags ); lcaseTags.swap( other.lcaseTags ); tagsAsString.swap( other.tagsAsString ); std::swap( TestCaseInfo::properties, static_cast( other ).properties ); std::swap( lineInfo, other.lineInfo ); } void TestCase::invoke() const { test->invoke(); } bool TestCase::operator == ( TestCase const& other ) const { return test.get() == other.test.get() && name == other.name && className == other.className; } bool TestCase::operator < ( TestCase const& other ) const { return name < other.name; } TestCase& TestCase::operator = ( TestCase const& other ) { TestCase temp( other ); swap( temp ); return *this; } TestCaseInfo const& TestCase::getTestCaseInfo() const { return *this; } } // end namespace Catch // #included from: catch_version.hpp #define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED namespace Catch { Version::Version ( unsigned int _majorVersion, unsigned int _minorVersion, unsigned int _patchNumber, std::string const& _branchName, unsigned int _buildNumber ) : majorVersion( _majorVersion ), minorVersion( _minorVersion ), patchNumber( _patchNumber ), branchName( _branchName ), buildNumber( _buildNumber ) {} std::ostream& operator << ( std::ostream& os, Version const& version ) { os << version.majorVersion << '.' << version.minorVersion << '.' << version.patchNumber; if( !version.branchName.empty() ) { os << '-' << version.branchName << '.' << version.buildNumber; } return os; } Version libraryVersion( 1, 7, 1, "", 0 ); } // #included from: catch_message.hpp #define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED namespace Catch { MessageInfo::MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ) : macroName( _macroName ), lineInfo( _lineInfo ), type( _type ), sequence( ++globalCount ) {} // This may need protecting if threading support is added unsigned int MessageInfo::globalCount = 0; //////////////////////////////////////////////////////////////////////////// ScopedMessage::ScopedMessage( MessageBuilder const& builder ) : m_info( builder.m_info ) { m_info.message = builder.m_stream.str(); getResultCapture().pushScopedMessage( m_info ); } ScopedMessage::ScopedMessage( ScopedMessage const& other ) : m_info( other.m_info ) {} ScopedMessage::~ScopedMessage() { getResultCapture().popScopedMessage( m_info ); } } // end namespace Catch // #included from: catch_legacy_reporter_adapter.hpp #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED // #included from: catch_legacy_reporter_adapter.h #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED namespace Catch { // Deprecated struct IReporter : IShared { virtual ~IReporter(); virtual bool shouldRedirectStdout() const = 0; virtual void StartTesting() = 0; virtual void EndTesting( Totals const& totals ) = 0; virtual void StartGroup( std::string const& groupName ) = 0; virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; virtual void Aborted() = 0; virtual void Result( AssertionResult const& result ) = 0; }; class LegacyReporterAdapter : public SharedImpl { public: LegacyReporterAdapter( Ptr const& legacyReporter ); virtual ~LegacyReporterAdapter(); virtual ReporterPreferences getPreferences() const; virtual void noMatchingTestCases( std::string const& ); virtual void testRunStarting( TestRunInfo const& ); virtual void testGroupStarting( GroupInfo const& groupInfo ); virtual void testCaseStarting( TestCaseInfo const& testInfo ); virtual void sectionStarting( SectionInfo const& sectionInfo ); virtual void assertionStarting( AssertionInfo const& ); virtual bool assertionEnded( AssertionStats const& assertionStats ); virtual void sectionEnded( SectionStats const& sectionStats ); virtual void testCaseEnded( TestCaseStats const& testCaseStats ); virtual void testGroupEnded( TestGroupStats const& testGroupStats ); virtual void testRunEnded( TestRunStats const& testRunStats ); virtual void skipTest( TestCaseInfo const& ); private: Ptr m_legacyReporter; }; } namespace Catch { LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) : m_legacyReporter( legacyReporter ) {} LegacyReporterAdapter::~LegacyReporterAdapter() {} ReporterPreferences LegacyReporterAdapter::getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); return prefs; } void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { m_legacyReporter->StartTesting(); } void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { m_legacyReporter->StartGroup( groupInfo.name ); } void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { m_legacyReporter->StartTestCase( testInfo ); } void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); } void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { // Not on legacy interface } bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); it != itEnd; ++it ) { if( it->type == ResultWas::Info ) { ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); rb << it->message; rb.setResultType( ResultWas::Info ); AssertionResult result = rb.build(); m_legacyReporter->Result( result ); } } } m_legacyReporter->Result( assertionStats.assertionResult ); return true; } void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { if( sectionStats.missingAssertions ) m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); } void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { m_legacyReporter->EndTestCase ( testCaseStats.testInfo, testCaseStats.totals, testCaseStats.stdOut, testCaseStats.stdErr ); } void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { if( testGroupStats.aborting ) m_legacyReporter->Aborted(); m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); } void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { m_legacyReporter->EndTesting( testRunStats.totals ); } void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { } } // #included from: catch_timer.hpp #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wc++11-long-long" #endif #ifdef CATCH_PLATFORM_WINDOWS #else #include #endif namespace Catch { namespace { #ifdef CATCH_PLATFORM_WINDOWS uint64_t getCurrentTicks() { static uint64_t hz=0, hzo=0; if (!hz) { QueryPerformanceFrequency( reinterpret_cast( &hz ) ); QueryPerformanceCounter( reinterpret_cast( &hzo ) ); } uint64_t t; QueryPerformanceCounter( reinterpret_cast( &t ) ); return ((t-hzo)*1000000)/hz; } #else uint64_t getCurrentTicks() { timeval t; gettimeofday(&t,CATCH_NULL); return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); } #endif } void Timer::start() { m_ticks = getCurrentTicks(); } unsigned int Timer::getElapsedMicroseconds() const { return static_cast(getCurrentTicks() - m_ticks); } unsigned int Timer::getElapsedMilliseconds() const { return static_cast(getElapsedMicroseconds()/1000); } double Timer::getElapsedSeconds() const { return getElapsedMicroseconds()/1000000.0; } } // namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif // #included from: catch_common.hpp #define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED #include namespace Catch { bool startsWith( std::string const& s, std::string const& prefix ) { return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); } bool startsWith( std::string const& s, char prefix ) { return !s.empty() && s[0] == prefix; } bool endsWith( std::string const& s, std::string const& suffix ) { return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); } bool endsWith( std::string const& s, char suffix ) { return !s.empty() && s[s.size()-1] == suffix; } bool contains( std::string const& s, std::string const& infix ) { return s.find( infix ) != std::string::npos; } bool contains( std::string const& s, char infix ) { return s.find(infix) != std::string::npos; } char toLowerCh(char c) { return static_cast( ::tolower( c ) ); } void toLowerInPlace( std::string& s ) { std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); } std::string toLower( std::string const& s ) { std::string lc = s; toLowerInPlace( lc ); return lc; } std::string trim( std::string const& str ) { static char const* whitespaceChars = "\n\r\t "; std::string::size_type start = str.find_first_not_of( whitespaceChars ); std::string::size_type end = str.find_last_not_of( whitespaceChars ); return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); } bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { bool replaced = false; std::size_t i = str.find( replaceThis ); while( i != std::string::npos ) { replaced = true; str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); if( i < str.size()-withThis.size() ) i = str.find( replaceThis, i+withThis.size() ); else i = std::string::npos; } return replaced; } pluralise::pluralise( std::size_t count, std::string const& label ) : m_count( count ), m_label( label ) {} std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { os << pluraliser.m_count << ' ' << pluraliser.m_label; if( pluraliser.m_count != 1 ) os << 's'; return os; } SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){} SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) : file( _file ), line( _line ) {} bool SourceLineInfo::empty() const { return file[0] == '\0'; } bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); } bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); } void seedRng( IConfig const& config ) { if( config.rngSeed() != 0 ) std::srand( config.rngSeed() ); } unsigned int rngSeed() { return getCurrentContext().getConfig()->rngSeed(); } std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { #ifndef __GNUG__ os << info.file << '(' << info.line << ')'; #else os << info.file << ':' << info.line; #endif return os; } void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { std::ostringstream oss; oss << locationInfo << ": Internal Catch error: '" << message << '\''; if( alwaysTrue() ) throw std::logic_error( oss.str() ); } } // #included from: catch_section.hpp #define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED namespace Catch { SectionInfo::SectionInfo ( SourceLineInfo const& _lineInfo, std::string const& _name, std::string const& _description ) : name( _name ), description( _description ), lineInfo( _lineInfo ) {} Section::Section( SectionInfo const& info ) : m_info( info ), m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) { m_timer.start(); } Section::~Section() { if( m_sectionIncluded ) { SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); if( std::uncaught_exception() ) getResultCapture().sectionEndedEarly( endInfo ); else getResultCapture().sectionEnded( endInfo ); } } // This indicates whether the section should be executed or not Section::operator bool() const { return m_sectionIncluded; } } // end namespace Catch // #included from: catch_debugger.hpp #define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED #include #ifdef CATCH_PLATFORM_MAC #include #include #include #include #include namespace Catch{ // The following function is taken directly from the following technical note: // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). bool isDebuggerActive(){ int mib[4]; struct kinfo_proc info; size_t size; // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result. info.kp_proc.p_flag = 0; // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID. mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); // Call sysctl. size = sizeof(info); if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; return false; } // We're being debugged if the P_TRACED flag is set. return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); } } // namespace Catch #elif defined(CATCH_PLATFORM_LINUX) #include #include namespace Catch{ // The standard POSIX way of detecting a debugger is to attempt to // ptrace() the process, but this needs to be done from a child and not // this process itself to still allow attaching to this process later // if wanted, so is rather heavy. Under Linux we have the PID of the // "debugger" (which doesn't need to be gdb, of course, it could also // be strace, for example) in /proc/$PID/status, so just get it from // there instead. bool isDebuggerActive(){ std::ifstream in("/proc/self/status"); for( std::string line; std::getline(in, line); ) { static const int PREFIX_LEN = 11; if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { // We're traced if the PID is not 0 and no other PID starts // with 0 digit, so it's enough to check for just a single // character. return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; } } return false; } } // namespace Catch #elif defined(_MSC_VER) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); namespace Catch { bool isDebuggerActive() { return IsDebuggerPresent() != 0; } } #elif defined(__MINGW32__) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); namespace Catch { bool isDebuggerActive() { return IsDebuggerPresent() != 0; } } #else namespace Catch { inline bool isDebuggerActive() { return false; } } #endif // Platform #ifdef CATCH_PLATFORM_WINDOWS extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); namespace Catch { void writeToDebugConsole( std::string const& text ) { ::OutputDebugStringA( text.c_str() ); } } #else namespace Catch { void writeToDebugConsole( std::string const& text ) { // !TBD: Need a version for Mac/ XCode and other IDEs Catch::cout() << text; } } #endif // Platform // #included from: catch_tostring.hpp #define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED namespace Catch { namespace Detail { const std::string unprintableString = "{?}"; namespace { const int hexThreshold = 255; struct Endianness { enum Arch { Big, Little }; static Arch which() { union _{ int asInt; char asChar[sizeof (int)]; } u; u.asInt = 1; return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; } }; } std::string rawMemoryToString( const void *object, std::size_t size ) { // Reverse order for little endian architectures int i = 0, end = static_cast( size ), inc = 1; if( Endianness::which() == Endianness::Little ) { i = end-1; end = inc = -1; } unsigned char const *bytes = static_cast(object); std::ostringstream os; os << "0x" << std::setfill('0') << std::hex; for( ; i != end; i += inc ) os << std::setw(2) << static_cast(bytes[i]); return os.str(); } } std::string toString( std::string const& value ) { std::string s = value; if( getCurrentContext().getConfig()->showInvisibles() ) { for(size_t i = 0; i < s.size(); ++i ) { std::string subs; switch( s[i] ) { case '\n': subs = "\\n"; break; case '\t': subs = "\\t"; break; default: break; } if( !subs.empty() ) { s = s.substr( 0, i ) + subs + s.substr( i+1 ); ++i; } } } return '"' + s + '"'; } std::string toString( std::wstring const& value ) { std::string s; s.reserve( value.size() ); for(size_t i = 0; i < value.size(); ++i ) s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; return Catch::toString( s ); } std::string toString( const char* const value ) { return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); } std::string toString( char* const value ) { return Catch::toString( static_cast( value ) ); } std::string toString( const wchar_t* const value ) { return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); } std::string toString( wchar_t* const value ) { return Catch::toString( static_cast( value ) ); } std::string toString( int value ) { std::ostringstream oss; oss << value; if( value > Detail::hexThreshold ) oss << " (0x" << std::hex << value << ')'; return oss.str(); } std::string toString( unsigned long value ) { std::ostringstream oss; oss << value; if( value > Detail::hexThreshold ) oss << " (0x" << std::hex << value << ')'; return oss.str(); } std::string toString( unsigned int value ) { return Catch::toString( static_cast( value ) ); } template std::string fpToString( T value, int precision ) { std::ostringstream oss; oss << std::setprecision( precision ) << std::fixed << value; std::string d = oss.str(); std::size_t i = d.find_last_not_of( '0' ); if( i != std::string::npos && i != d.size()-1 ) { if( d[i] == '.' ) i++; d = d.substr( 0, i+1 ); } return d; } std::string toString( const double value ) { return fpToString( value, 10 ); } std::string toString( const float value ) { return fpToString( value, 5 ) + 'f'; } std::string toString( bool value ) { return value ? "true" : "false"; } std::string toString( char value ) { if ( value == '\r' ) return "'\\r'"; if ( value == '\f' ) return "'\\f'"; if ( value == '\n' ) return "'\\n'"; if ( value == '\t' ) return "'\\t'"; if ( '\0' <= value && value < ' ' ) return toString( static_cast( value ) ); char chstr[] = "' '"; chstr[1] = value; return chstr; } std::string toString( signed char value ) { return toString( static_cast( value ) ); } std::string toString( unsigned char value ) { return toString( static_cast( value ) ); } #ifdef CATCH_CONFIG_CPP11_LONG_LONG std::string toString( long long value ) { std::ostringstream oss; oss << value; if( value > Detail::hexThreshold ) oss << " (0x" << std::hex << value << ')'; return oss.str(); } std::string toString( unsigned long long value ) { std::ostringstream oss; oss << value; if( value > Detail::hexThreshold ) oss << " (0x" << std::hex << value << ')'; return oss.str(); } #endif #ifdef CATCH_CONFIG_CPP11_NULLPTR std::string toString( std::nullptr_t ) { return "nullptr"; } #endif #ifdef __OBJC__ std::string toString( NSString const * const& nsstring ) { if( !nsstring ) return "nil"; return "@" + toString([nsstring UTF8String]); } std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { if( !nsstring ) return "nil"; return "@" + toString([nsstring UTF8String]); } std::string toString( NSObject* const& nsObject ) { return toString( [nsObject description] ); } #endif } // end namespace Catch // #included from: catch_result_builder.hpp #define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED namespace Catch { std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) { return secondArg.empty() || secondArg == "\"\"" ? capturedExpression : capturedExpression + ", " + secondArg; } ResultBuilder::ResultBuilder( char const* macroName, SourceLineInfo const& lineInfo, char const* capturedExpression, ResultDisposition::Flags resultDisposition, char const* secondArg ) : m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ), m_shouldDebugBreak( false ), m_shouldThrow( false ) {} ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { m_data.resultType = result; return *this; } ResultBuilder& ResultBuilder::setResultType( bool result ) { m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; return *this; } void ResultBuilder::endExpression( DecomposedExpression const& expr ) { AssertionResult result = build( expr ); handleResult( result ); } void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { m_assertionInfo.resultDisposition = resultDisposition; m_stream.oss << Catch::translateActiveException(); captureResult( ResultWas::ThrewException ); } void ResultBuilder::captureResult( ResultWas::OfType resultType ) { setResultType( resultType ); captureExpression(); } void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { if( expectedMessage.empty() ) captureExpectedException( Matchers::Impl::Generic::AllOf() ); else captureExpectedException( Matchers::Equals( expectedMessage ) ); } void ResultBuilder::captureExpectedException( Matchers::Impl::Matcher const& matcher ) { assert( !isFalseTest( m_assertionInfo.resultDisposition ) ); AssertionResultData data = m_data; data.resultType = ResultWas::Ok; data.reconstructedExpression = m_assertionInfo.capturedExpression; std::string actualMessage = Catch::translateActiveException(); if( !matcher.match( actualMessage ) ) { data.resultType = ResultWas::ExpressionFailed; data.reconstructedExpression = actualMessage; } AssertionResult result( m_assertionInfo, data ); handleResult( result ); } void ResultBuilder::captureExpression() { AssertionResult result = build(); handleResult( result ); } void ResultBuilder::handleResult( AssertionResult const& result ) { getResultCapture().assertionEnded( result ); if( !result.isOk() ) { if( getCurrentContext().getConfig()->shouldDebugBreak() ) m_shouldDebugBreak = true; if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) m_shouldThrow = true; } } void ResultBuilder::react() { if( m_shouldThrow ) throw Catch::TestFailureException(); } bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } AssertionResult ResultBuilder::build() const { return build( *this ); } // CAVEAT: The returned AssertionResult stores a pointer to the argument expr, // a temporary DecomposedExpression, which in turn holds references to // operands, possibly temporary as well. // It should immediately be passed to handleResult; if the expression // needs to be reported, its string expansion must be composed before // the temporaries are destroyed. AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const { assert( m_data.resultType != ResultWas::Unknown ); AssertionResultData data = m_data; // Flip bool results if FalseTest flag is set if( isFalseTest( m_assertionInfo.resultDisposition ) ) { data.negate( expr.isBinaryExpression() ); } data.message = m_stream.oss.str(); data.decomposedExpression = &expr; // for lazy reconstruction return AssertionResult( m_assertionInfo, data ); } void ResultBuilder::reconstructExpression( std::string& dest ) const { dest = m_assertionInfo.capturedExpression; } } // end namespace Catch // #included from: catch_tag_alias_registry.hpp #define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED // #included from: catch_tag_alias_registry.h #define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED #include namespace Catch { class TagAliasRegistry : public ITagAliasRegistry { public: virtual ~TagAliasRegistry(); virtual Option find( std::string const& alias ) const; virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); static TagAliasRegistry& get(); private: std::map m_registry; }; } // end namespace Catch #include #include namespace Catch { TagAliasRegistry::~TagAliasRegistry() {} Option TagAliasRegistry::find( std::string const& alias ) const { std::map::const_iterator it = m_registry.find( alias ); if( it != m_registry.end() ) return it->second; else return Option(); } std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { std::string expandedTestSpec = unexpandedTestSpec; for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); it != itEnd; ++it ) { std::size_t pos = expandedTestSpec.find( it->first ); if( pos != std::string::npos ) { expandedTestSpec = expandedTestSpec.substr( 0, pos ) + it->second.tag + expandedTestSpec.substr( pos + it->first.size() ); } } return expandedTestSpec; } void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) { std::ostringstream oss; oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; throw std::domain_error( oss.str().c_str() ); } if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { std::ostringstream oss; oss << "error: tag alias, \"" << alias << "\" already registered.\n" << "\tFirst seen at " << find(alias)->lineInfo << '\n' << "\tRedefined at " << lineInfo; throw std::domain_error( oss.str().c_str() ); } } TagAliasRegistry& TagAliasRegistry::get() { static TagAliasRegistry instance; return instance; } ITagAliasRegistry::~ITagAliasRegistry() {} ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { try { TagAliasRegistry::get().add( alias, tag, lineInfo ); } catch( std::exception& ex ) { Colour colourGuard( Colour::Red ); Catch::cerr() << ex.what() << std::endl; exit(1); } } } // end namespace Catch // #included from: ../reporters/catch_reporter_multi.hpp #define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED namespace Catch { class MultipleReporters : public SharedImpl { typedef std::vector > Reporters; Reporters m_reporters; public: void add( Ptr const& reporter ) { m_reporters.push_back( reporter ); } public: // IStreamingReporter virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { return m_reporters[0]->getPreferences(); } virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->noMatchingTestCases( spec ); } virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->testRunStarting( testRunInfo ); } virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->testGroupStarting( groupInfo ); } virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->testCaseStarting( testInfo ); } virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->sectionStarting( sectionInfo ); } virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->assertionStarting( assertionInfo ); } // The return value indicates if the messages buffer should be cleared: virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { bool clearBuffer = false; for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) clearBuffer |= (*it)->assertionEnded( assertionStats ); return clearBuffer; } virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->sectionEnded( sectionStats ); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->testCaseEnded( testCaseStats ); } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->testGroupEnded( testGroupStats ); } virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->testRunEnded( testRunStats ); } virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); it != itEnd; ++it ) (*it)->skipTest( testInfo ); } virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { return this; } }; Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { Ptr resultingReporter; if( existingReporter ) { MultipleReporters* multi = existingReporter->tryAsMulti(); if( !multi ) { multi = new MultipleReporters; resultingReporter = Ptr( multi ); if( existingReporter ) multi->add( existingReporter ); } else resultingReporter = existingReporter; multi->add( additionalReporter ); } else resultingReporter = additionalReporter; return resultingReporter; } } // end namespace Catch // #included from: ../reporters/catch_reporter_xml.hpp #define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED // #included from: catch_reporter_bases.hpp #define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED #include namespace Catch { struct StreamingReporterBase : SharedImpl { StreamingReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = false; } virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { return m_reporterPrefs; } virtual ~StreamingReporterBase() CATCH_OVERRIDE; virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { currentTestRunInfo = _testRunInfo; } virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { currentGroupInfo = _groupInfo; } virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { currentTestCaseInfo = _testInfo; } virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { m_sectionStack.push_back( _sectionInfo ); } virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { currentTestCaseInfo.reset(); } virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { currentGroupInfo.reset(); } virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { currentTestCaseInfo.reset(); currentGroupInfo.reset(); currentTestRunInfo.reset(); } virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { // Don't do anything with this by default. // It can optionally be overridden in the derived class. } Ptr m_config; std::ostream& stream; LazyStat currentTestRunInfo; LazyStat currentGroupInfo; LazyStat currentTestCaseInfo; std::vector m_sectionStack; ReporterPreferences m_reporterPrefs; }; struct CumulativeReporterBase : SharedImpl { template struct Node : SharedImpl<> { explicit Node( T const& _value ) : value( _value ) {} virtual ~Node() {} typedef std::vector > ChildNodes; T value; ChildNodes children; }; struct SectionNode : SharedImpl<> { explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} virtual ~SectionNode(); bool operator == ( SectionNode const& other ) const { return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; } bool operator == ( Ptr const& other ) const { return operator==( *other ); } SectionStats stats; typedef std::vector > ChildSections; typedef std::vector Assertions; ChildSections childSections; Assertions assertions; std::string stdOut; std::string stdErr; }; struct BySectionInfo { BySectionInfo( SectionInfo const& other ) : m_other( other ) {} BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} bool operator() ( Ptr const& node ) const { return node->stats.sectionInfo.lineInfo == m_other.lineInfo; } private: void operator=( BySectionInfo const& ); SectionInfo const& m_other; }; typedef Node TestCaseNode; typedef Node TestGroupNode; typedef Node TestRunNode; CumulativeReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = false; } ~CumulativeReporterBase(); virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { return m_reporterPrefs; } virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); Ptr node; if( m_sectionStack.empty() ) { if( !m_rootSection ) m_rootSection = new SectionNode( incompleteStats ); node = m_rootSection; } else { SectionNode& parentNode = *m_sectionStack.back(); SectionNode::ChildSections::const_iterator it = std::find_if( parentNode.childSections.begin(), parentNode.childSections.end(), BySectionInfo( sectionInfo ) ); if( it == parentNode.childSections.end() ) { node = new SectionNode( incompleteStats ); parentNode.childSections.push_back( node ); } else node = *it; } m_sectionStack.push_back( node ); m_deepestSection = node; } virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { assert( !m_sectionStack.empty() ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back( assertionStats ); // AssertionResult holds a pointer to a temporary DecomposedExpression, // which getExpandedExpression() calls to build the expression string. // Our section stack copy of the assertionResult will likely outlive the // temporary, so it must be expanded or discarded now to avoid calling // a destroyed object later. prepareExpandedExpression( sectionNode.assertions.back().assertionResult ); return true; } virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { assert( !m_sectionStack.empty() ); SectionNode& node = *m_sectionStack.back(); node.stats = sectionStats; m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { Ptr node = new TestCaseNode( testCaseStats ); assert( m_sectionStack.size() == 0 ); node->children.push_back( m_rootSection ); m_testCases.push_back( node ); m_rootSection.reset(); assert( m_deepestSection ); m_deepestSection->stdOut = testCaseStats.stdOut; m_deepestSection->stdErr = testCaseStats.stdErr; } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { Ptr node = new TestGroupNode( testGroupStats ); node->children.swap( m_testCases ); m_testGroups.push_back( node ); } virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { Ptr node = new TestRunNode( testRunStats ); node->children.swap( m_testGroups ); m_testRuns.push_back( node ); testRunEndedCumulative(); } virtual void testRunEndedCumulative() = 0; virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} virtual void prepareExpandedExpression( AssertionResult& result ) const { if( result.isOk() ) result.discardDecomposedExpression(); else result.expandDecomposedExpression(); } Ptr m_config; std::ostream& stream; std::vector m_assertions; std::vector > > m_sections; std::vector > m_testCases; std::vector > m_testGroups; std::vector > m_testRuns; Ptr m_rootSection; Ptr m_deepestSection; std::vector > m_sectionStack; ReporterPreferences m_reporterPrefs; }; template char const* getLineOfChars() { static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; if( !*line ) { memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; } return line; } struct TestEventListenerBase : StreamingReporterBase { TestEventListenerBase( ReporterConfig const& _config ) : StreamingReporterBase( _config ) {} virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { return false; } }; } // end namespace Catch // #included from: ../internal/catch_reporter_registrars.hpp #define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED namespace Catch { template class LegacyReporterRegistrar { class ReporterFactory : public IReporterFactory { virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new LegacyReporterAdapter( new T( config ) ); } virtual std::string getDescription() const { return T::getDescription(); } }; public: LegacyReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; template class ReporterRegistrar { class ReporterFactory : public SharedImpl { // *** Please Note ***: // - If you end up here looking at a compiler error because it's trying to register // your custom reporter class be aware that the native reporter interface has changed // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. // However please consider updating to the new interface as the old one is now // deprecated and will probably be removed quite soon! // Please contact me via github if you have any questions at all about this. // In fact, ideally, please contact me anyway to let me know you've hit this - as I have // no idea who is actually using custom reporters at all (possibly no-one!). // The new interface is designed to minimise exposure to interface changes in the future. virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new T( config ); } virtual std::string getDescription() const { return T::getDescription(); } }; public: ReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; template class ListenerRegistrar { class ListenerFactory : public SharedImpl { virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new T( config ); } virtual std::string getDescription() const { return std::string(); } }; public: ListenerRegistrar() { getMutableRegistryHub().registerListener( new ListenerFactory() ); } }; } #define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } #define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } #define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } // #included from: ../internal/catch_xmlwriter.hpp #define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED #include #include #include #include namespace Catch { class XmlEncode { public: enum ForWhat { ForTextNodes, ForAttributes }; XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) : m_str( str ), m_forWhat( forWhat ) {} void encodeTo( std::ostream& os ) const { // Apostrophe escaping not necessary if we always use " to write attributes // (see: http://www.w3.org/TR/xml/#syntax) for( std::size_t i = 0; i < m_str.size(); ++ i ) { char c = m_str[i]; switch( c ) { case '<': os << "<"; break; case '&': os << "&"; break; case '>': // See: http://www.w3.org/TR/xml/#syntax if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) os << ">"; else os << c; break; case '\"': if( m_forWhat == ForAttributes ) os << """; else os << c; break; default: // Escape control chars - based on contribution by @espenalb in PR #465 and // by @mrpi PR #588 if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) os << "&#x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << static_cast( c ) << ';'; else os << c; } } } friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { xmlEncode.encodeTo( os ); return os; } private: std::string m_str; ForWhat m_forWhat; }; class XmlWriter { public: class ScopedElement { public: ScopedElement( XmlWriter* writer ) : m_writer( writer ) {} ScopedElement( ScopedElement const& other ) : m_writer( other.m_writer ){ other.m_writer = CATCH_NULL; } ~ScopedElement() { if( m_writer ) m_writer->endElement(); } ScopedElement& writeText( std::string const& text, bool indent = true ) { m_writer->writeText( text, indent ); return *this; } template ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { m_writer->writeAttribute( name, attribute ); return *this; } private: mutable XmlWriter* m_writer; }; XmlWriter() : m_tagIsOpen( false ), m_needsNewline( false ), m_os( &Catch::cout() ) { // We encode control characters, which requires // XML 1.1 // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 *m_os << "\n"; } XmlWriter( std::ostream& os ) : m_tagIsOpen( false ), m_needsNewline( false ), m_os( &os ) { *m_os << "\n"; } ~XmlWriter() { while( !m_tags.empty() ) endElement(); } XmlWriter& startElement( std::string const& name ) { ensureTagClosed(); newlineIfNecessary(); stream() << m_indent << '<' << name; m_tags.push_back( name ); m_indent += " "; m_tagIsOpen = true; return *this; } ScopedElement scopedElement( std::string const& name ) { ScopedElement scoped( this ); startElement( name ); return scoped; } XmlWriter& endElement() { newlineIfNecessary(); m_indent = m_indent.substr( 0, m_indent.size()-2 ); if( m_tagIsOpen ) { stream() << "/>"; m_tagIsOpen = false; } else { stream() << m_indent << ""; } stream() << std::endl; m_tags.pop_back(); return *this; } XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { if( !name.empty() && !attribute.empty() ) stream() << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; return *this; } XmlWriter& writeAttribute( std::string const& name, bool attribute ) { stream() << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; return *this; } template XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { std::ostringstream oss; oss << attribute; return writeAttribute( name, oss.str() ); } XmlWriter& writeText( std::string const& text, bool indent = true ) { if( !text.empty() ){ bool tagWasOpen = m_tagIsOpen; ensureTagClosed(); if( tagWasOpen && indent ) stream() << m_indent; stream() << XmlEncode( text ); m_needsNewline = true; } return *this; } XmlWriter& writeComment( std::string const& text ) { ensureTagClosed(); stream() << m_indent << ""; m_needsNewline = true; return *this; } XmlWriter& writeBlankLine() { ensureTagClosed(); stream() << '\n'; return *this; } void setStream( std::ostream& os ) { m_os = &os; } private: XmlWriter( XmlWriter const& ); void operator=( XmlWriter const& ); std::ostream& stream() { return *m_os; } void ensureTagClosed() { if( m_tagIsOpen ) { stream() << ">\n"; m_tagIsOpen = false; } } void newlineIfNecessary() { if( m_needsNewline ) { stream() << '\n'; m_needsNewline = false; } } bool m_tagIsOpen; bool m_needsNewline; std::vector m_tags; std::string m_indent; std::ostream* m_os; }; } // #included from: catch_reenable_warnings.h #define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED #ifdef __clang__ # ifdef __ICC // icpc defines the __clang__ macro # pragma warning(pop) # else # pragma clang diagnostic pop # endif #elif defined __GNUC__ # pragma GCC diagnostic pop #endif namespace Catch { class XmlReporter : public StreamingReporterBase { public: XmlReporter( ReporterConfig const& _config ) : StreamingReporterBase( _config ), m_xml(_config.stream()), m_sectionDepth( 0 ) { m_reporterPrefs.shouldRedirectStdOut = true; } virtual ~XmlReporter() CATCH_OVERRIDE; static std::string getDescription() { return "Reports test results as an XML document"; } public: // StreamingReporterBase virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { StreamingReporterBase::noMatchingTestCases( s ); } virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { StreamingReporterBase::testRunStarting( testInfo ); m_xml.startElement( "Catch" ); if( !m_config->name().empty() ) m_xml.writeAttribute( "name", m_config->name() ); } virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { StreamingReporterBase::testGroupStarting( groupInfo ); m_xml.startElement( "Group" ) .writeAttribute( "name", groupInfo.name ); } virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { StreamingReporterBase::testCaseStarting(testInfo); m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.name ); if ( m_config->showDurations() == ShowDurations::Always ) m_testCaseTimer.start(); } virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { StreamingReporterBase::sectionStarting( sectionInfo ); if( m_sectionDepth++ > 0 ) { m_xml.startElement( "Section" ) .writeAttribute( "name", trim( sectionInfo.name ) ) .writeAttribute( "description", sectionInfo.description ); } } virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { const AssertionResult& assertionResult = assertionStats.assertionResult; // Print any info messages in tags. if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); it != itEnd; ++it ) { if( it->type == ResultWas::Info ) { m_xml.scopedElement( "Info" ) .writeText( it->message ); } else if ( it->type == ResultWas::Warning ) { m_xml.scopedElement( "Warning" ) .writeText( it->message ); } } } // Drop out if result was successful but we're not printing them. if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) ) return true; // Print the expression if there is one. if( assertionResult.hasExpression() ) { m_xml.startElement( "Expression" ) .writeAttribute( "success", assertionResult.succeeded() ) .writeAttribute( "type", assertionResult.getTestMacroName() ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ); m_xml.scopedElement( "Original" ) .writeText( assertionResult.getExpression() ); m_xml.scopedElement( "Expanded" ) .writeText( assertionResult.getExpandedExpression() ); } // And... Print a result applicable to each result type. switch( assertionResult.getResultType() ) { case ResultWas::ThrewException: m_xml.scopedElement( "Exception" ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ) .writeText( assertionResult.getMessage() ); break; case ResultWas::FatalErrorCondition: m_xml.scopedElement( "FatalErrorCondition" ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ) .writeText( assertionResult.getMessage() ); break; case ResultWas::Info: m_xml.scopedElement( "Info" ) .writeText( assertionResult.getMessage() ); break; case ResultWas::Warning: // Warning will already have been written break; case ResultWas::ExplicitFailure: m_xml.scopedElement( "Failure" ) .writeText( assertionResult.getMessage() ); break; default: break; } if( assertionResult.hasExpression() ) m_xml.endElement(); return true; } virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { StreamingReporterBase::sectionEnded( sectionStats ); if( --m_sectionDepth > 0 ) { XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); e.writeAttribute( "successes", sectionStats.assertions.passed ); e.writeAttribute( "failures", sectionStats.assertions.failed ); e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); if ( m_config->showDurations() == ShowDurations::Always ) e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); m_xml.endElement(); } } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { StreamingReporterBase::testCaseEnded( testCaseStats ); XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); if ( m_config->showDurations() == ShowDurations::Always ) e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); if( !testCaseStats.stdOut.empty() ) m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); if( !testCaseStats.stdErr.empty() ) m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); m_xml.endElement(); } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { StreamingReporterBase::testGroupEnded( testGroupStats ); // TODO: Check testGroupStats.aborting and act accordingly. m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); m_xml.endElement(); } virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { StreamingReporterBase::testRunEnded( testRunStats ); m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", testRunStats.totals.assertions.passed ) .writeAttribute( "failures", testRunStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); m_xml.endElement(); } private: Timer m_testCaseTimer; XmlWriter m_xml; int m_sectionDepth; }; INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) } // end namespace Catch // #included from: ../reporters/catch_reporter_junit.hpp #define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED #include namespace Catch { namespace { std::string getCurrentTimestamp() { // Beware, this is not reentrant because of backward compatibility issues // Also, UTC only, again because of backward compatibility (%z is C++11) time_t rawtime; std::time(&rawtime); const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); #ifdef _MSC_VER std::tm timeInfo = {}; gmtime_s(&timeInfo, &rawtime); #else std::tm* timeInfo; timeInfo = std::gmtime(&rawtime); #endif char timeStamp[timeStampSize]; const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; #ifdef _MSC_VER std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); #else std::strftime(timeStamp, timeStampSize, fmt, timeInfo); #endif return std::string(timeStamp); } } class JunitReporter : public CumulativeReporterBase { public: JunitReporter( ReporterConfig const& _config ) : CumulativeReporterBase( _config ), xml( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = true; } virtual ~JunitReporter() CATCH_OVERRIDE; static std::string getDescription() { return "Reports test results in an XML format that looks like Ant's junitreport target"; } virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { CumulativeReporterBase::testRunStarting( runInfo ); xml.startElement( "testsuites" ); } virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { suiteTimer.start(); stdOutForSuite.str(""); stdErrForSuite.str(""); unexpectedExceptions = 0; CumulativeReporterBase::testGroupStarting( groupInfo ); } virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) unexpectedExceptions++; return CumulativeReporterBase::assertionEnded( assertionStats ); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { stdOutForSuite << testCaseStats.stdOut; stdErrForSuite << testCaseStats.stdErr; CumulativeReporterBase::testCaseEnded( testCaseStats ); } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { double suiteTime = suiteTimer.getElapsedSeconds(); CumulativeReporterBase::testGroupEnded( testGroupStats ); writeGroup( *m_testGroups.back(), suiteTime ); } virtual void testRunEndedCumulative() CATCH_OVERRIDE { xml.endElement(); } void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); TestGroupStats const& stats = groupNode.value; xml.writeAttribute( "name", stats.groupInfo.name ); xml.writeAttribute( "errors", unexpectedExceptions ); xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); xml.writeAttribute( "tests", stats.totals.assertions.total() ); xml.writeAttribute( "hostname", "tbd" ); // !TBD if( m_config->showDurations() == ShowDurations::Never ) xml.writeAttribute( "time", "" ); else xml.writeAttribute( "time", suiteTime ); xml.writeAttribute( "timestamp", getCurrentTimestamp() ); // Write test cases for( TestGroupNode::ChildNodes::const_iterator it = groupNode.children.begin(), itEnd = groupNode.children.end(); it != itEnd; ++it ) writeTestCase( **it ); xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); } void writeTestCase( TestCaseNode const& testCaseNode ) { TestCaseStats const& stats = testCaseNode.value; // All test cases have exactly one section - which represents the // test case itself. That section may have 0-n nested sections assert( testCaseNode.children.size() == 1 ); SectionNode const& rootSection = *testCaseNode.children.front(); std::string className = stats.testInfo.className; if( className.empty() ) { if( rootSection.childSections.empty() ) className = "global"; } writeSection( className, "", rootSection ); } void writeSection( std::string const& className, std::string const& rootName, SectionNode const& sectionNode ) { std::string name = trim( sectionNode.stats.sectionInfo.name ); if( !rootName.empty() ) name = rootName + '/' + name; if( !sectionNode.assertions.empty() || !sectionNode.stdOut.empty() || !sectionNode.stdErr.empty() ) { XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); if( className.empty() ) { xml.writeAttribute( "classname", name ); xml.writeAttribute( "name", "root" ); } else { xml.writeAttribute( "classname", className ); xml.writeAttribute( "name", name ); } xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); writeAssertions( sectionNode ); if( !sectionNode.stdOut.empty() ) xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); if( !sectionNode.stdErr.empty() ) xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); } for( SectionNode::ChildSections::const_iterator it = sectionNode.childSections.begin(), itEnd = sectionNode.childSections.end(); it != itEnd; ++it ) if( className.empty() ) writeSection( name, "", **it ); else writeSection( className, name, **it ); } void writeAssertions( SectionNode const& sectionNode ) { for( SectionNode::Assertions::const_iterator it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); it != itEnd; ++it ) writeAssertion( *it ); } void writeAssertion( AssertionStats const& stats ) { AssertionResult const& result = stats.assertionResult; if( !result.isOk() ) { std::string elementName; switch( result.getResultType() ) { case ResultWas::ThrewException: case ResultWas::FatalErrorCondition: elementName = "error"; break; case ResultWas::ExplicitFailure: elementName = "failure"; break; case ResultWas::ExpressionFailed: elementName = "failure"; break; case ResultWas::DidntThrowException: elementName = "failure"; break; // We should never see these here: case ResultWas::Info: case ResultWas::Warning: case ResultWas::Ok: case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: elementName = "internalError"; break; } XmlWriter::ScopedElement e = xml.scopedElement( elementName ); xml.writeAttribute( "message", result.getExpandedExpression() ); xml.writeAttribute( "type", result.getTestMacroName() ); std::ostringstream oss; if( !result.getMessage().empty() ) oss << result.getMessage() << '\n'; for( std::vector::const_iterator it = stats.infoMessages.begin(), itEnd = stats.infoMessages.end(); it != itEnd; ++it ) if( it->type == ResultWas::Info ) oss << it->message << '\n'; oss << "at " << result.getSourceInfo(); xml.writeText( oss.str(), false ); } } XmlWriter xml; Timer suiteTimer; std::ostringstream stdOutForSuite; std::ostringstream stdErrForSuite; unsigned int unexpectedExceptions; }; INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) } // end namespace Catch // #included from: ../reporters/catch_reporter_console.hpp #define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED namespace Catch { struct ConsoleReporter : StreamingReporterBase { ConsoleReporter( ReporterConfig const& _config ) : StreamingReporterBase( _config ), m_headerPrinted( false ) {} virtual ~ConsoleReporter() CATCH_OVERRIDE; static std::string getDescription() { return "Reports test results as plain lines of text"; } virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { stream << "No test cases matched '" << spec << '\'' << std::endl; } virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { AssertionResult const& result = _assertionStats.assertionResult; bool printInfoMessages = true; // Drop out if result was successful and we're not printing those if( !m_config->includeSuccessfulResults() && result.isOk() ) { if( result.getResultType() != ResultWas::Warning ) return false; printInfoMessages = false; } lazyPrint(); AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); printer.print(); stream << std::endl; return true; } virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { m_headerPrinted = false; StreamingReporterBase::sectionStarting( _sectionInfo ); } virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { if( _sectionStats.missingAssertions ) { lazyPrint(); Colour colour( Colour::ResultError ); if( m_sectionStack.size() > 1 ) stream << "\nNo assertions in section"; else stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } if( m_headerPrinted ) { if( m_config->showDurations() == ShowDurations::Always ) stream << "Completed in " << _sectionStats.durationInSeconds << 's' << std::endl; m_headerPrinted = false; } else { if( m_config->showDurations() == ShowDurations::Always ) stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << 's' << std::endl; } StreamingReporterBase::sectionEnded( _sectionStats ); } virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { StreamingReporterBase::testCaseEnded( _testCaseStats ); m_headerPrinted = false; } virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { if( currentGroupInfo.used ) { printSummaryDivider(); stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; printTotals( _testGroupStats.totals ); stream << '\n' << std::endl; } StreamingReporterBase::testGroupEnded( _testGroupStats ); } virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { printTotalsDivider( _testRunStats.totals ); printTotals( _testRunStats.totals ); stream << std::endl; StreamingReporterBase::testRunEnded( _testRunStats ); } private: class AssertionPrinter { void operator= ( AssertionPrinter const& ); public: AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) : stream( _stream ), stats( _stats ), result( _stats.assertionResult ), colour( Colour::None ), message( result.getMessage() ), messages( _stats.infoMessages ), printInfoMessages( _printInfoMessages ) { switch( result.getResultType() ) { case ResultWas::Ok: colour = Colour::Success; passOrFail = "PASSED"; //if( result.hasMessage() ) if( _stats.infoMessages.size() == 1 ) messageLabel = "with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "with messages"; break; case ResultWas::ExpressionFailed: if( result.isOk() ) { colour = Colour::Success; passOrFail = "FAILED - but was ok"; } else { colour = Colour::Error; passOrFail = "FAILED"; } if( _stats.infoMessages.size() == 1 ) messageLabel = "with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "with messages"; break; case ResultWas::ThrewException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "due to unexpected exception with message"; break; case ResultWas::FatalErrorCondition: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "due to a fatal error condition"; break; case ResultWas::DidntThrowException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "because no exception was thrown where one was expected"; break; case ResultWas::Info: messageLabel = "info"; break; case ResultWas::Warning: messageLabel = "warning"; break; case ResultWas::ExplicitFailure: passOrFail = "FAILED"; colour = Colour::Error; if( _stats.infoMessages.size() == 1 ) messageLabel = "explicitly with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "explicitly with messages"; break; // These cases are here to prevent compiler warnings case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: passOrFail = "** internal error **"; colour = Colour::Error; break; } } void print() const { printSourceInfo(); if( stats.totals.assertions.total() > 0 ) { if( result.isOk() ) stream << '\n'; printResultType(); printOriginalExpression(); printReconstructedExpression(); } else { stream << '\n'; } printMessage(); } private: void printResultType() const { if( !passOrFail.empty() ) { Colour colourGuard( colour ); stream << passOrFail << ":\n"; } } void printOriginalExpression() const { if( result.hasExpression() ) { Colour colourGuard( Colour::OriginalExpression ); stream << " "; stream << result.getExpressionInMacro(); stream << '\n'; } } void printReconstructedExpression() const { if( result.hasExpandedExpression() ) { stream << "with expansion:\n"; Colour colourGuard( Colour::ReconstructedExpression ); stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n'; } } void printMessage() const { if( !messageLabel.empty() ) stream << messageLabel << ':' << '\n'; for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); it != itEnd; ++it ) { // If this assertion is a warning ignore any INFO messages if( printInfoMessages || it->type != ResultWas::Info ) stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n'; } } void printSourceInfo() const { Colour colourGuard( Colour::FileName ); stream << result.getSourceInfo() << ": "; } std::ostream& stream; AssertionStats const& stats; AssertionResult const& result; Colour::Code colour; std::string passOrFail; std::string messageLabel; std::string message; std::vector messages; bool printInfoMessages; }; void lazyPrint() { if( !currentTestRunInfo.used ) lazyPrintRunInfo(); if( !currentGroupInfo.used ) lazyPrintGroupInfo(); if( !m_headerPrinted ) { printTestCaseAndSectionHeader(); m_headerPrinted = true; } } void lazyPrintRunInfo() { stream << '\n' << getLineOfChars<'~'>() << '\n'; Colour colour( Colour::SecondaryText ); stream << currentTestRunInfo->name << " is a Catch v" << libraryVersion << " host application.\n" << "Run with -? for options\n\n"; if( m_config->rngSeed() != 0 ) stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; currentTestRunInfo.used = true; } void lazyPrintGroupInfo() { if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { printClosedHeader( "Group: " + currentGroupInfo->name ); currentGroupInfo.used = true; } } void printTestCaseAndSectionHeader() { assert( !m_sectionStack.empty() ); printOpenHeader( currentTestCaseInfo->name ); if( m_sectionStack.size() > 1 ) { Colour colourGuard( Colour::Headers ); std::vector::const_iterator it = m_sectionStack.begin()+1, // Skip first section (test case) itEnd = m_sectionStack.end(); for( ; it != itEnd; ++it ) printHeaderString( it->name, 2 ); } SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; if( !lineInfo.empty() ){ stream << getLineOfChars<'-'>() << '\n'; Colour colourGuard( Colour::FileName ); stream << lineInfo << '\n'; } stream << getLineOfChars<'.'>() << '\n' << std::endl; } void printClosedHeader( std::string const& _name ) { printOpenHeader( _name ); stream << getLineOfChars<'.'>() << '\n'; } void printOpenHeader( std::string const& _name ) { stream << getLineOfChars<'-'>() << '\n'; { Colour colourGuard( Colour::Headers ); printHeaderString( _name ); } } // if string has a : in first line will set indent to follow it on // subsequent lines void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { std::size_t i = _string.find( ": " ); if( i != std::string::npos ) i+=2; else i = 0; stream << Text( _string, TextAttributes() .setIndent( indent+i) .setInitialIndent( indent ) ) << '\n'; } struct SummaryColumn { SummaryColumn( std::string const& _label, Colour::Code _colour ) : label( _label ), colour( _colour ) {} SummaryColumn addRow( std::size_t count ) { std::ostringstream oss; oss << count; std::string row = oss.str(); for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { while( it->size() < row.size() ) *it = ' ' + *it; while( it->size() > row.size() ) row = ' ' + row; } rows.push_back( row ); return *this; } std::string label; Colour::Code colour; std::vector rows; }; void printTotals( Totals const& totals ) { if( totals.testCases.total() == 0 ) { stream << Colour( Colour::Warning ) << "No tests ran\n"; } else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { stream << Colour( Colour::ResultSuccess ) << "All tests passed"; stream << " (" << pluralise( totals.assertions.passed, "assertion" ) << " in " << pluralise( totals.testCases.passed, "test case" ) << ')' << '\n'; } else { std::vector columns; columns.push_back( SummaryColumn( "", Colour::None ) .addRow( totals.testCases.total() ) .addRow( totals.assertions.total() ) ); columns.push_back( SummaryColumn( "passed", Colour::Success ) .addRow( totals.testCases.passed ) .addRow( totals.assertions.passed ) ); columns.push_back( SummaryColumn( "failed", Colour::ResultError ) .addRow( totals.testCases.failed ) .addRow( totals.assertions.failed ) ); columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) .addRow( totals.testCases.failedButOk ) .addRow( totals.assertions.failedButOk ) ); printSummaryRow( "test cases", columns, 0 ); printSummaryRow( "assertions", columns, 1 ); } } void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { std::string value = it->rows[row]; if( it->label.empty() ) { stream << label << ": "; if( value != "0" ) stream << value; else stream << Colour( Colour::Warning ) << "- none -"; } else if( value != "0" ) { stream << Colour( Colour::LightGrey ) << " | "; stream << Colour( it->colour ) << value << ' ' << it->label; } } stream << '\n'; } static std::size_t makeRatio( std::size_t number, std::size_t total ) { std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; return ( ratio == 0 && number > 0 ) ? 1 : ratio; } static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { if( i > j && i > k ) return i; else if( j > k ) return j; else return k; } void printTotalsDivider( Totals const& totals ) { if( totals.testCases.total() > 0 ) { std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) findMax( failedRatio, failedButOkRatio, passedRatio )++; while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) findMax( failedRatio, failedButOkRatio, passedRatio )--; stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); if( totals.testCases.allPassed() ) stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); else stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); } else { stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); } stream << '\n'; } void printSummaryDivider() { stream << getLineOfChars<'-'>() << '\n'; } private: bool m_headerPrinted; }; INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) } // end namespace Catch // #included from: ../reporters/catch_reporter_compact.hpp #define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED namespace Catch { struct CompactReporter : StreamingReporterBase { CompactReporter( ReporterConfig const& _config ) : StreamingReporterBase( _config ) {} virtual ~CompactReporter(); static std::string getDescription() { return "Reports test results on a single line, suitable for IDEs"; } virtual ReporterPreferences getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = false; return prefs; } virtual void noMatchingTestCases( std::string const& spec ) { stream << "No test cases matched '" << spec << '\'' << std::endl; } virtual void assertionStarting( AssertionInfo const& ) { } virtual bool assertionEnded( AssertionStats const& _assertionStats ) { AssertionResult const& result = _assertionStats.assertionResult; bool printInfoMessages = true; // Drop out if result was successful and we're not printing those if( !m_config->includeSuccessfulResults() && result.isOk() ) { if( result.getResultType() != ResultWas::Warning ) return false; printInfoMessages = false; } AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); printer.print(); stream << std::endl; return true; } virtual void testRunEnded( TestRunStats const& _testRunStats ) { printTotals( _testRunStats.totals ); stream << '\n' << std::endl; StreamingReporterBase::testRunEnded( _testRunStats ); } private: class AssertionPrinter { void operator= ( AssertionPrinter const& ); public: AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) : stream( _stream ) , stats( _stats ) , result( _stats.assertionResult ) , messages( _stats.infoMessages ) , itMessage( _stats.infoMessages.begin() ) , printInfoMessages( _printInfoMessages ) {} void print() { printSourceInfo(); itMessage = messages.begin(); switch( result.getResultType() ) { case ResultWas::Ok: printResultType( Colour::ResultSuccess, passedString() ); printOriginalExpression(); printReconstructedExpression(); if ( ! result.hasExpression() ) printRemainingMessages( Colour::None ); else printRemainingMessages(); break; case ResultWas::ExpressionFailed: if( result.isOk() ) printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); else printResultType( Colour::Error, failedString() ); printOriginalExpression(); printReconstructedExpression(); printRemainingMessages(); break; case ResultWas::ThrewException: printResultType( Colour::Error, failedString() ); printIssue( "unexpected exception with message:" ); printMessage(); printExpressionWas(); printRemainingMessages(); break; case ResultWas::FatalErrorCondition: printResultType( Colour::Error, failedString() ); printIssue( "fatal error condition with message:" ); printMessage(); printExpressionWas(); printRemainingMessages(); break; case ResultWas::DidntThrowException: printResultType( Colour::Error, failedString() ); printIssue( "expected exception, got none" ); printExpressionWas(); printRemainingMessages(); break; case ResultWas::Info: printResultType( Colour::None, "info" ); printMessage(); printRemainingMessages(); break; case ResultWas::Warning: printResultType( Colour::None, "warning" ); printMessage(); printRemainingMessages(); break; case ResultWas::ExplicitFailure: printResultType( Colour::Error, failedString() ); printIssue( "explicitly" ); printRemainingMessages( Colour::None ); break; // These cases are here to prevent compiler warnings case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: printResultType( Colour::Error, "** internal error **" ); break; } } private: // Colour::LightGrey static Colour::Code dimColour() { return Colour::FileName; } #ifdef CATCH_PLATFORM_MAC static const char* failedString() { return "FAILED"; } static const char* passedString() { return "PASSED"; } #else static const char* failedString() { return "failed"; } static const char* passedString() { return "passed"; } #endif void printSourceInfo() const { Colour colourGuard( Colour::FileName ); stream << result.getSourceInfo() << ':'; } void printResultType( Colour::Code colour, std::string passOrFail ) const { if( !passOrFail.empty() ) { { Colour colourGuard( colour ); stream << ' ' << passOrFail; } stream << ':'; } } void printIssue( std::string issue ) const { stream << ' ' << issue; } void printExpressionWas() { if( result.hasExpression() ) { stream << ';'; { Colour colour( dimColour() ); stream << " expression was:"; } printOriginalExpression(); } } void printOriginalExpression() const { if( result.hasExpression() ) { stream << ' ' << result.getExpression(); } } void printReconstructedExpression() const { if( result.hasExpandedExpression() ) { { Colour colour( dimColour() ); stream << " for: "; } stream << result.getExpandedExpression(); } } void printMessage() { if ( itMessage != messages.end() ) { stream << " '" << itMessage->message << '\''; ++itMessage; } } void printRemainingMessages( Colour::Code colour = dimColour() ) { if ( itMessage == messages.end() ) return; // using messages.end() directly yields compilation error: std::vector::const_iterator itEnd = messages.end(); const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); { Colour colourGuard( colour ); stream << " with " << pluralise( N, "message" ) << ':'; } for(; itMessage != itEnd; ) { // If this assertion is a warning ignore any INFO messages if( printInfoMessages || itMessage->type != ResultWas::Info ) { stream << " '" << itMessage->message << '\''; if ( ++itMessage != itEnd ) { Colour colourGuard( dimColour() ); stream << " and"; } } } } private: std::ostream& stream; AssertionStats const& stats; AssertionResult const& result; std::vector messages; std::vector::const_iterator itMessage; bool printInfoMessages; }; // Colour, message variants: // - white: No tests ran. // - red: Failed [both/all] N test cases, failed [both/all] M assertions. // - white: Passed [both/all] N test cases (no assertions). // - red: Failed N tests cases, failed M assertions. // - green: Passed [both/all] N tests cases with M assertions. std::string bothOrAll( std::size_t count ) const { return count == 1 ? std::string() : count == 2 ? "both " : "all " ; } void printTotals( const Totals& totals ) const { if( totals.testCases.total() == 0 ) { stream << "No tests ran."; } else if( totals.testCases.failed == totals.testCases.total() ) { Colour colour( Colour::ResultError ); const std::string qualify_assertions_failed = totals.assertions.failed == totals.assertions.total() ? bothOrAll( totals.assertions.failed ) : std::string(); stream << "Failed " << bothOrAll( totals.testCases.failed ) << pluralise( totals.testCases.failed, "test case" ) << ", " "failed " << qualify_assertions_failed << pluralise( totals.assertions.failed, "assertion" ) << '.'; } else if( totals.assertions.total() == 0 ) { stream << "Passed " << bothOrAll( totals.testCases.total() ) << pluralise( totals.testCases.total(), "test case" ) << " (no assertions)."; } else if( totals.assertions.failed ) { Colour colour( Colour::ResultError ); stream << "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.'; } else { Colour colour( Colour::ResultSuccess ); stream << "Passed " << bothOrAll( totals.testCases.passed ) << pluralise( totals.testCases.passed, "test case" ) << " with " << pluralise( totals.assertions.passed, "assertion" ) << '.'; } } }; INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) } // end namespace Catch namespace Catch { // These are all here to avoid warnings about not having any out of line // virtual methods NonCopyable::~NonCopyable() {} IShared::~IShared() {} IStream::~IStream() CATCH_NOEXCEPT {} FileStream::~FileStream() CATCH_NOEXCEPT {} CoutStream::~CoutStream() CATCH_NOEXCEPT {} DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} IContext::~IContext() {} IResultCapture::~IResultCapture() {} ITestCase::~ITestCase() {} ITestCaseRegistry::~ITestCaseRegistry() {} IRegistryHub::~IRegistryHub() {} IMutableRegistryHub::~IMutableRegistryHub() {} IExceptionTranslator::~IExceptionTranslator() {} IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} IReporter::~IReporter() {} IReporterFactory::~IReporterFactory() {} IReporterRegistry::~IReporterRegistry() {} IStreamingReporter::~IStreamingReporter() {} AssertionStats::~AssertionStats() {} SectionStats::~SectionStats() {} TestCaseStats::~TestCaseStats() {} TestGroupStats::~TestGroupStats() {} TestRunStats::~TestRunStats() {} CumulativeReporterBase::SectionNode::~SectionNode() {} CumulativeReporterBase::~CumulativeReporterBase() {} StreamingReporterBase::~StreamingReporterBase() {} ConsoleReporter::~ConsoleReporter() {} CompactReporter::~CompactReporter() {} IRunner::~IRunner() {} IMutableContext::~IMutableContext() {} IConfig::~IConfig() {} XmlReporter::~XmlReporter() {} JunitReporter::~JunitReporter() {} TestRegistry::~TestRegistry() {} FreeFunctionTestCase::~FreeFunctionTestCase() {} IGeneratorInfo::~IGeneratorInfo() {} IGeneratorsForTest::~IGeneratorsForTest() {} WildcardPattern::~WildcardPattern() {} TestSpec::Pattern::~Pattern() {} TestSpec::NamePattern::~NamePattern() {} TestSpec::TagPattern::~TagPattern() {} TestSpec::ExcludedPattern::~ExcludedPattern() {} Matchers::Impl::StdString::Equals::~Equals() {} Matchers::Impl::StdString::Contains::~Contains() {} Matchers::Impl::StdString::StartsWith::~StartsWith() {} Matchers::Impl::StdString::EndsWith::~EndsWith() {} void Config::dummy() {} namespace TestCaseTracking { ITracker::~ITracker() {} TrackerBase::~TrackerBase() {} SectionTracker::~SectionTracker() {} IndexTracker::~IndexTracker() {} } } #ifdef __clang__ #pragma clang diagnostic pop #endif #endif #ifdef CATCH_CONFIG_MAIN // #included from: internal/catch_default_main.hpp #define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED #ifndef __OBJC__ // Standard C/C++ main entry point int main (int argc, char * argv[]) { int result = Catch::Session().run( argc, argv ); return ( result < 0xff ? result : 0xff ); } #else // __OBJC__ // Objective-C entry point int main (int argc, char * const argv[]) { #if !CATCH_ARC_ENABLED NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; #endif Catch::registerTestMethods(); int result = Catch::Session().run( argc, (char* const*)argv ); #if !CATCH_ARC_ENABLED [pool drain]; #endif return ( result < 0xff ? result : 0xff ); } #endif // __OBJC__ #endif #ifdef CLARA_CONFIG_MAIN_NOT_DEFINED # undef CLARA_CONFIG_MAIN #endif ////// // If this config identifier is defined then all CATCH macros are prefixed with CATCH_ #ifdef CATCH_CONFIG_PREFIX_ALL #define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) #define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) #define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "CATCH_REQUIRE_THROWS" ) #define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) #define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "CATCH_REQUIRE_THROWS_WITH" ) #define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) #define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) #define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) #define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) #define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) #define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) #define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "", "CATCH_CHECK_THROWS" ) #define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) #define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH" ) #define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) #define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) #define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) #define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) #define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) #define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) #define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) #define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) #else #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) #endif #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) #define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) #define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) #define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) // "BDD-style" convenience wrappers #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) #define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) #else #define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) #define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) #endif #define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) #define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) #define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) #define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) #define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else #define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) #define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) #define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "REQUIRE_THROWS" ) #define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) #define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "REQUIRE_THROWS_WITH" ) #define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) #define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) #define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) #define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) #define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) #define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) #define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "", "CHECK_THROWS" ) #define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) #define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CHECK_THROWS_WITH" ) #define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) #define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) #define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) #define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) #define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) #define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) #define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) #else #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) #endif #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) #define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) #define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) #define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) #endif #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) // "BDD-style" convenience wrappers #ifdef CATCH_CONFIG_VARIADIC_MACROS #define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) #define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) #else #define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) #define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) #endif #define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) #define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) #define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) #define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) #define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) using Catch::Detail::Approx; #endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED sonic-visualiser-3.0.3/piper-cpp/ext/json11/CMakeLists.txt0000644000000000000000000000051513111512442021507 0ustar 00000000000000project(json11) cmake_minimum_required(VERSION 2.8) enable_testing() add_definitions( -std=c++11 -fno-rtti -fno-exceptions -Wall -Wextra -Werror) set(json11_SRCS json11.cpp) add_library(json11 STATIC ${json11_SRCS}) add_test(json11_test json11_test) add_executable(json11_test ${json11_SRCS} test.cpp) sonic-visualiser-3.0.3/piper-cpp/ext/json11/LICENSE.txt0000644000000000000000000000204113111512442020566 0ustar 00000000000000Copyright (c) 2013 Dropbox, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sonic-visualiser-3.0.3/piper-cpp/ext/json11/Makefile0000644000000000000000000000025213111512442020405 0ustar 00000000000000test: json11.cpp json11.hpp test.cpp $(CXX) -O -std=c++11 json11.cpp test.cpp -o test -fno-rtti -fno-exceptions clean: if [ -e test ]; then rm test; fi .PHONY: clean sonic-visualiser-3.0.3/piper-cpp/ext/json11/README.md0000644000000000000000000000270313111512442020227 0ustar 00000000000000json11 ------ json11 is a tiny JSON library for C++11, providing JSON parsing and serialization. The core object provided by the library is json11::Json. A Json object represents any JSON value: null, bool, number (int or double), string (std::string), array (std::vector), or object (std::map). Json objects act like values. They can be assigned, copied, moved, compared for equality or order, and so on. There are also helper methods Json::dump, to serialize a Json to a string, and Json::parse (static) to parse a std::string as a Json object. It's easy to make a JSON object with C++11's new initializer syntax: Json my_json = Json::object { { "key1", "value1" }, { "key2", false }, { "key3", Json::array { 1, 2, 3 } }, }; std::string json_str = my_json.dump(); There are also implicit constructors that allow standard and user-defined types to be automatically converted to JSON. For example: class Point { public: int x; int y; Point (int x, int y) : x(x), y(y) {} Json to_json() const { return Json::array { x, y }; } }; std::vector points = { { 1, 2 }, { 10, 20 }, { 100, 200 } }; std::string points_json = Json(points).dump(); JSON values can have their values queried and inspected: Json json = Json::array { Json::object { { "k", "v" } } }; std::string str = json[0]["k"].string_value(); More documentation is still to come. For now, see json11.hpp. sonic-visualiser-3.0.3/piper-cpp/ext/json11/json11.cpp0000644000000000000000000005753213111512442020601 0ustar 00000000000000/* Copyright (c) 2013 Dropbox, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "json11.hpp" #include #include #include #include #include namespace json11 { static const int max_depth = 200; using std::string; using std::vector; using std::map; using std::make_shared; using std::initializer_list; using std::move; /* * * * * * * * * * * * * * * * * * * * * Serialization */ static void dump(std::nullptr_t, string &out) { out += "null"; } static void dump(double value, string &out) { if (std::isfinite(value)) { char buf[32]; snprintf(buf, sizeof buf, "%.17g", value); out += buf; } else { out += "null"; } } static void dump(int value, string &out) { char buf[32]; snprintf(buf, sizeof buf, "%d", value); out += buf; } static void dump(bool value, string &out) { out += value ? "true" : "false"; } static void dump(const string &value, string &out) { out += '"'; for (size_t i = 0; i < value.length(); i++) { const char ch = value[i]; if (ch == '\\') { out += "\\\\"; } else if (ch == '"') { out += "\\\""; } else if (ch == '\b') { out += "\\b"; } else if (ch == '\f') { out += "\\f"; } else if (ch == '\n') { out += "\\n"; } else if (ch == '\r') { out += "\\r"; } else if (ch == '\t') { out += "\\t"; } else if (static_cast(ch) <= 0x1f) { char buf[8]; snprintf(buf, sizeof buf, "\\u%04x", ch); out += buf; } else if (static_cast(ch) == 0xe2 && static_cast(value[i+1]) == 0x80 && static_cast(value[i+2]) == 0xa8) { out += "\\u2028"; i += 2; } else if (static_cast(ch) == 0xe2 && static_cast(value[i+1]) == 0x80 && static_cast(value[i+2]) == 0xa9) { out += "\\u2029"; i += 2; } else { out += ch; } } out += '"'; } static void dump(const Json::array &values, string &out) { bool first = true; out += "["; for (const auto &value : values) { if (!first) out += ", "; value.dump(out); first = false; } out += "]"; } static void dump(const Json::object &values, string &out) { bool first = true; out += "{"; for (const auto &kv : values) { if (!first) out += ", "; dump(kv.first, out); out += ": "; kv.second.dump(out); first = false; } out += "}"; } void Json::dump(string &out) const { m_ptr->dump(out); } /* * * * * * * * * * * * * * * * * * * * * Value wrappers */ template class Value : public JsonValue { protected: // Constructors explicit Value(const T &value) : m_value(value) {} explicit Value(T &&value) : m_value(move(value)) {} // Get type tag Json::Type type() const override { return tag; } // Comparisons bool equals(const JsonValue * other) const override { return m_value == static_cast *>(other)->m_value; } bool less(const JsonValue * other) const override { return m_value < static_cast *>(other)->m_value; } const T m_value; void dump(string &out) const override { json11::dump(m_value, out); } }; class JsonDouble final : public Value { double number_value() const override { return m_value; } int int_value() const override { return static_cast(m_value); } bool equals(const JsonValue * other) const override { return m_value == other->number_value(); } bool less(const JsonValue * other) const override { return m_value < other->number_value(); } public: explicit JsonDouble(double value) : Value(value) {} }; class JsonInt final : public Value { double number_value() const override { return m_value; } int int_value() const override { return m_value; } bool equals(const JsonValue * other) const override { return m_value == other->number_value(); } bool less(const JsonValue * other) const override { return m_value < other->number_value(); } public: explicit JsonInt(int value) : Value(value) {} }; class JsonBoolean final : public Value { bool bool_value() const override { return m_value; } public: explicit JsonBoolean(bool value) : Value(value) {} }; class JsonString final : public Value { const string &string_value() const override { return m_value; } public: explicit JsonString(const string &value) : Value(value) {} explicit JsonString(string &&value) : Value(move(value)) {} }; class JsonArray final : public Value { const Json::array &array_items() const override { return m_value; } const Json & operator[](size_t i) const override; public: explicit JsonArray(const Json::array &value) : Value(value) {} explicit JsonArray(Json::array &&value) : Value(move(value)) {} }; class JsonObject final : public Value { const Json::object &object_items() const override { return m_value; } const Json & operator[](const string &key) const override; public: explicit JsonObject(const Json::object &value) : Value(value) {} explicit JsonObject(Json::object &&value) : Value(move(value)) {} }; class JsonNull final : public Value { public: JsonNull() : Value(nullptr) {} }; /* * * * * * * * * * * * * * * * * * * * * Static globals - static-init-safe */ struct Statics { const std::shared_ptr null = make_shared(); const std::shared_ptr t = make_shared(true); const std::shared_ptr f = make_shared(false); const string empty_string; const vector empty_vector; const map empty_map; Statics() {} }; static const Statics & statics() { static const Statics s {}; return s; } static const Json & static_null() { // This has to be separate, not in Statics, because Json() accesses statics().null. static const Json json_null; return json_null; } /* * * * * * * * * * * * * * * * * * * * * Constructors */ Json::Json() noexcept : m_ptr(statics().null) {} Json::Json(std::nullptr_t) noexcept : m_ptr(statics().null) {} Json::Json(double value) : m_ptr(make_shared(value)) {} Json::Json(int value) : m_ptr(make_shared(value)) {} Json::Json(bool value) : m_ptr(value ? statics().t : statics().f) {} Json::Json(const string &value) : m_ptr(make_shared(value)) {} Json::Json(string &&value) : m_ptr(make_shared(move(value))) {} Json::Json(const char * value) : m_ptr(make_shared(value)) {} Json::Json(const Json::array &values) : m_ptr(make_shared(values)) {} Json::Json(Json::array &&values) : m_ptr(make_shared(move(values))) {} Json::Json(const Json::object &values) : m_ptr(make_shared(values)) {} Json::Json(Json::object &&values) : m_ptr(make_shared(move(values))) {} /* * * * * * * * * * * * * * * * * * * * * Accessors */ Json::Type Json::type() const { return m_ptr->type(); } double Json::number_value() const { return m_ptr->number_value(); } int Json::int_value() const { return m_ptr->int_value(); } bool Json::bool_value() const { return m_ptr->bool_value(); } const string & Json::string_value() const { return m_ptr->string_value(); } const vector & Json::array_items() const { return m_ptr->array_items(); } const map & Json::object_items() const { return m_ptr->object_items(); } const Json & Json::operator[] (size_t i) const { return (*m_ptr)[i]; } const Json & Json::operator[] (const string &key) const { return (*m_ptr)[key]; } double JsonValue::number_value() const { return 0; } int JsonValue::int_value() const { return 0; } bool JsonValue::bool_value() const { return false; } const string & JsonValue::string_value() const { return statics().empty_string; } const vector & JsonValue::array_items() const { return statics().empty_vector; } const map & JsonValue::object_items() const { return statics().empty_map; } const Json & JsonValue::operator[] (size_t) const { return static_null(); } const Json & JsonValue::operator[] (const string &) const { return static_null(); } const Json & JsonObject::operator[] (const string &key) const { auto iter = m_value.find(key); return (iter == m_value.end()) ? static_null() : iter->second; } const Json & JsonArray::operator[] (size_t i) const { if (i >= m_value.size()) return static_null(); else return m_value[i]; } /* * * * * * * * * * * * * * * * * * * * * Comparison */ bool Json::operator== (const Json &other) const { if (m_ptr->type() != other.m_ptr->type()) return false; return m_ptr->equals(other.m_ptr.get()); } bool Json::operator< (const Json &other) const { if (m_ptr->type() != other.m_ptr->type()) return m_ptr->type() < other.m_ptr->type(); return m_ptr->less(other.m_ptr.get()); } /* * * * * * * * * * * * * * * * * * * * * Parsing */ /* esc(c) * * Format char c suitable for printing in an error message. */ static inline string esc(char c) { char buf[12]; if (static_cast(c) >= 0x20 && static_cast(c) <= 0x7f) { snprintf(buf, sizeof buf, "'%c' (%d)", c, c); } else { snprintf(buf, sizeof buf, "(%d)", c); } return string(buf); } static inline bool in_range(long x, long lower, long upper) { return (x >= lower && x <= upper); } /* JsonParser * * Object that tracks all state of an in-progress parse. */ struct JsonParser { /* State */ const string &str; size_t i; string &err; bool failed; const JsonParse strategy; /* fail(msg, err_ret = Json()) * * Mark this parse as failed. */ Json fail(string &&msg) { return fail(move(msg), Json()); } template T fail(string &&msg, const T err_ret) { if (!failed) err = std::move(msg); failed = true; return err_ret; } /* consume_whitespace() * * Advance until the current character is non-whitespace. */ void consume_whitespace() { while (str[i] == ' ' || str[i] == '\r' || str[i] == '\n' || str[i] == '\t') i++; } /* consume_comment() * * Advance comments (c-style inline and multiline). */ bool consume_comment() { bool comment_found = false; if (str[i] == '/') { i++; if (i == str.size()) return fail("unexpected end of input inside comment", 0); if (str[i] == '/') { // inline comment i++; if (i == str.size()) return fail("unexpected end of input inside inline comment", 0); // advance until next line while (str[i] != '\n') { i++; if (i == str.size()) return fail("unexpected end of input inside inline comment", 0); } comment_found = true; } else if (str[i] == '*') { // multiline comment i++; if (i > str.size()-2) return fail("unexpected end of input inside multi-line comment", 0); // advance until closing tokens while (!(str[i] == '*' && str[i+1] == '/')) { i++; if (i > str.size()-2) return fail( "unexpected end of input inside multi-line comment", 0); } i += 2; if (i == str.size()) return fail( "unexpected end of input inside multi-line comment", 0); comment_found = true; } else return fail("malformed comment", 0); } return comment_found; } /* consume_garbage() * * Advance until the current character is non-whitespace and non-comment. */ void consume_garbage() { consume_whitespace(); if(strategy == JsonParse::COMMENTS) { bool comment_found = false; do { comment_found = consume_comment(); consume_whitespace(); } while(comment_found); } } /* get_next_token() * * Return the next non-whitespace character. If the end of the input is reached, * flag an error and return 0. */ char get_next_token() { consume_garbage(); if (i == str.size()) return fail("unexpected end of input", 0); return str[i++]; } /* encode_utf8(pt, out) * * Encode pt as UTF-8 and add it to out. */ void encode_utf8(long pt, string & out) { if (pt < 0) return; if (pt < 0x80) { out += static_cast(pt); } else if (pt < 0x800) { out += static_cast((pt >> 6) | 0xC0); out += static_cast((pt & 0x3F) | 0x80); } else if (pt < 0x10000) { out += static_cast((pt >> 12) | 0xE0); out += static_cast(((pt >> 6) & 0x3F) | 0x80); out += static_cast((pt & 0x3F) | 0x80); } else { out += static_cast((pt >> 18) | 0xF0); out += static_cast(((pt >> 12) & 0x3F) | 0x80); out += static_cast(((pt >> 6) & 0x3F) | 0x80); out += static_cast((pt & 0x3F) | 0x80); } } /* parse_string() * * Parse a string, starting at the current position. */ string parse_string() { string out; long last_escaped_codepoint = -1; while (true) { if (i == str.size()) return fail("unexpected end of input in string", ""); char ch = str[i++]; if (ch == '"') { encode_utf8(last_escaped_codepoint, out); return out; } if (in_range(ch, 0, 0x1f)) return fail("unescaped " + esc(ch) + " in string", ""); // The usual case: non-escaped characters if (ch != '\\') { encode_utf8(last_escaped_codepoint, out); last_escaped_codepoint = -1; out += ch; continue; } // Handle escapes if (i == str.size()) return fail("unexpected end of input in string", ""); ch = str[i++]; if (ch == 'u') { // Extract 4-byte escape sequence string esc = str.substr(i, 4); // Explicitly check length of the substring. The following loop // relies on std::string returning the terminating NUL when // accessing str[length]. Checking here reduces brittleness. if (esc.length() < 4) { return fail("bad \\u escape: " + esc, ""); } for (int j = 0; j < 4; j++) { if (!in_range(esc[j], 'a', 'f') && !in_range(esc[j], 'A', 'F') && !in_range(esc[j], '0', '9')) return fail("bad \\u escape: " + esc, ""); } long codepoint = strtol(esc.data(), nullptr, 16); // JSON specifies that characters outside the BMP shall be encoded as a pair // of 4-hex-digit \u escapes encoding their surrogate pair components. Check // whether we're in the middle of such a beast: the previous codepoint was an // escaped lead (high) surrogate, and this is a trail (low) surrogate. if (in_range(last_escaped_codepoint, 0xD800, 0xDBFF) && in_range(codepoint, 0xDC00, 0xDFFF)) { // Reassemble the two surrogate pairs into one astral-plane character, per // the UTF-16 algorithm. encode_utf8((((last_escaped_codepoint - 0xD800) << 10) | (codepoint - 0xDC00)) + 0x10000, out); last_escaped_codepoint = -1; } else { encode_utf8(last_escaped_codepoint, out); last_escaped_codepoint = codepoint; } i += 4; continue; } encode_utf8(last_escaped_codepoint, out); last_escaped_codepoint = -1; if (ch == 'b') { out += '\b'; } else if (ch == 'f') { out += '\f'; } else if (ch == 'n') { out += '\n'; } else if (ch == 'r') { out += '\r'; } else if (ch == 't') { out += '\t'; } else if (ch == '"' || ch == '\\' || ch == '/') { out += ch; } else { return fail("invalid escape character " + esc(ch), ""); } } } /* parse_number() * * Parse a double. */ Json parse_number() { size_t start_pos = i; if (str[i] == '-') i++; // Integer part if (str[i] == '0') { i++; if (in_range(str[i], '0', '9')) return fail("leading 0s not permitted in numbers"); } else if (in_range(str[i], '1', '9')) { i++; while (in_range(str[i], '0', '9')) i++; } else { return fail("invalid " + esc(str[i]) + " in number"); } if (str[i] != '.' && str[i] != 'e' && str[i] != 'E' && (i - start_pos) <= static_cast(std::numeric_limits::digits10)) { return std::atoi(str.c_str() + start_pos); } // Decimal part if (str[i] == '.') { i++; if (!in_range(str[i], '0', '9')) return fail("at least one digit required in fractional part"); while (in_range(str[i], '0', '9')) i++; } // Exponent part if (str[i] == 'e' || str[i] == 'E') { i++; if (str[i] == '+' || str[i] == '-') i++; if (!in_range(str[i], '0', '9')) return fail("at least one digit required in exponent"); while (in_range(str[i], '0', '9')) i++; } return std::strtod(str.c_str() + start_pos, nullptr); } /* expect(str, res) * * Expect that 'str' starts at the character that was just read. If it does, advance * the input and return res. If not, flag an error. */ Json expect(const string &expected, Json res) { assert(i != 0); i--; if (str.compare(i, expected.length(), expected) == 0) { i += expected.length(); return res; } else { return fail("parse error: expected " + expected + ", got " + str.substr(i, expected.length())); } } /* parse_json() * * Parse a JSON object. */ Json parse_json(int depth) { if (depth > max_depth) { return fail("exceeded maximum nesting depth"); } char ch = get_next_token(); if (failed) return Json(); if (ch == '-' || (ch >= '0' && ch <= '9')) { i--; return parse_number(); } if (ch == 't') return expect("true", true); if (ch == 'f') return expect("false", false); if (ch == 'n') return expect("null", Json()); if (ch == '"') return parse_string(); if (ch == '{') { map data; ch = get_next_token(); if (ch == '}') return data; while (1) { if (ch != '"') return fail("expected '\"' in object, got " + esc(ch)); string key = parse_string(); if (failed) return Json(); ch = get_next_token(); if (ch != ':') return fail("expected ':' in object, got " + esc(ch)); data[std::move(key)] = parse_json(depth + 1); if (failed) return Json(); ch = get_next_token(); if (ch == '}') break; if (ch != ',') return fail("expected ',' in object, got " + esc(ch)); ch = get_next_token(); } return data; } if (ch == '[') { vector data; ch = get_next_token(); if (ch == ']') return data; while (1) { i--; data.push_back(parse_json(depth + 1)); if (failed) return Json(); ch = get_next_token(); if (ch == ']') break; if (ch != ',') return fail("expected ',' in list, got " + esc(ch)); ch = get_next_token(); (void)ch; } return data; } return fail("expected value, got " + esc(ch)); } }; Json Json::parse(const string &in, string &err, JsonParse strategy) { JsonParser parser { in, 0, err, false, strategy }; Json result = parser.parse_json(0); // Check for any trailing garbage parser.consume_garbage(); if (parser.i != in.size()) return parser.fail("unexpected trailing " + esc(in[parser.i])); return result; } // Documented in json11.hpp vector Json::parse_multi(const string &in, string &err, JsonParse strategy) { JsonParser parser { in, 0, err, false, strategy }; vector json_vec; while (parser.i != in.size() && !parser.failed) { json_vec.push_back(parser.parse_json(0)); // Check for another object parser.consume_garbage(); } return json_vec; } /* * * * * * * * * * * * * * * * * * * * * Shape-checking */ bool Json::has_shape(const shape & types, string & err) const { if (!is_object()) { err = "expected JSON object, got " + dump(); return false; } for (auto & item : types) { if ((*this)[item.first].type() != item.second) { err = "bad type for " + item.first + " in " + dump(); return false; } } return true; } } // namespace json11 sonic-visualiser-3.0.3/piper-cpp/ext/json11/json11.hpp0000644000000000000000000002071513111512442020577 0ustar 00000000000000/* json11 * * json11 is a tiny JSON library for C++11, providing JSON parsing and serialization. * * The core object provided by the library is json11::Json. A Json object represents any JSON * value: null, bool, number (int or double), string (std::string), array (std::vector), or * object (std::map). * * Json objects act like values: they can be assigned, copied, moved, compared for equality or * order, etc. There are also helper methods Json::dump, to serialize a Json to a string, and * Json::parse (static) to parse a std::string as a Json object. * * Internally, the various types of Json object are represented by the JsonValue class * hierarchy. * * A note on numbers - JSON specifies the syntax of number formatting but not its semantics, * so some JSON implementations distinguish between integers and floating-point numbers, while * some don't. In json11, we choose the latter. Because some JSON implementations (namely * Javascript itself) treat all numbers as the same type, distinguishing the two leads * to JSON that will be *silently* changed by a round-trip through those implementations. * Dangerous! To avoid that risk, json11 stores all numbers as double internally, but also * provides integer helpers. * * Fortunately, double-precision IEEE754 ('double') can precisely store any integer in the * range +/-2^53, which includes every 'int' on most systems. (Timestamps often use int64 * or long long to avoid the Y2038K problem; a double storing microseconds since some epoch * will be exact for +/- 275 years.) */ /* Copyright (c) 2013 Dropbox, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #pragma once #include #include #include #include #include namespace json11 { enum JsonParse { STANDARD, COMMENTS }; class JsonValue; class Json final { public: // Types enum Type { NUL, NUMBER, BOOL, STRING, ARRAY, OBJECT }; // Array and object typedefs typedef std::vector array; typedef std::map object; // Constructors for the various types of JSON value. Json() noexcept; // NUL Json(std::nullptr_t) noexcept; // NUL Json(double value); // NUMBER Json(int value); // NUMBER Json(bool value); // BOOL Json(const std::string &value); // STRING Json(std::string &&value); // STRING Json(const char * value); // STRING Json(const array &values); // ARRAY Json(array &&values); // ARRAY Json(const object &values); // OBJECT Json(object &&values); // OBJECT // Implicit constructor: anything with a to_json() function. template Json(const T & t) : Json(t.to_json()) {} // Implicit constructor: map-like objects (std::map, std::unordered_map, etc) template ::value && std::is_constructible::value, int>::type = 0> Json(const M & m) : Json(object(m.begin(), m.end())) {} // Implicit constructor: vector-like objects (std::list, std::vector, std::set, etc) template ::value, int>::type = 0> Json(const V & v) : Json(array(v.begin(), v.end())) {} // This prevents Json(some_pointer) from accidentally producing a bool. Use // Json(bool(some_pointer)) if that behavior is desired. Json(void *) = delete; // Accessors Type type() const; bool is_null() const { return type() == NUL; } bool is_number() const { return type() == NUMBER; } bool is_bool() const { return type() == BOOL; } bool is_string() const { return type() == STRING; } bool is_array() const { return type() == ARRAY; } bool is_object() const { return type() == OBJECT; } // Return the enclosed value if this is a number, 0 otherwise. Note that json11 does not // distinguish between integer and non-integer numbers - number_value() and int_value() // can both be applied to a NUMBER-typed object. double number_value() const; int int_value() const; // Return the enclosed value if this is a boolean, false otherwise. bool bool_value() const; // Return the enclosed string if this is a string, "" otherwise. const std::string &string_value() const; // Return the enclosed std::vector if this is an array, or an empty vector otherwise. const array &array_items() const; // Return the enclosed std::map if this is an object, or an empty map otherwise. const object &object_items() const; // Return a reference to arr[i] if this is an array, Json() otherwise. const Json & operator[](size_t i) const; // Return a reference to obj[key] if this is an object, Json() otherwise. const Json & operator[](const std::string &key) const; // Serialize. void dump(std::string &out) const; std::string dump() const { std::string out; dump(out); return out; } // Parse. If parse fails, return Json() and assign an error message to err. static Json parse(const std::string & in, std::string & err, JsonParse strategy = JsonParse::STANDARD); static Json parse(const char * in, std::string & err, JsonParse strategy = JsonParse::STANDARD) { if (in) { return parse(std::string(in), err, strategy); } else { err = "null input"; return nullptr; } } // Parse multiple objects, concatenated or separated by whitespace static std::vector parse_multi( const std::string & in, std::string & err, JsonParse strategy = JsonParse::STANDARD); bool operator== (const Json &rhs) const; bool operator< (const Json &rhs) const; bool operator!= (const Json &rhs) const { return !(*this == rhs); } bool operator<= (const Json &rhs) const { return !(rhs < *this); } bool operator> (const Json &rhs) const { return (rhs < *this); } bool operator>= (const Json &rhs) const { return !(*this < rhs); } /* has_shape(types, err) * * Return true if this is a JSON object and, for each item in types, has a field of * the given type. If not, return false and set err to a descriptive message. */ typedef std::initializer_list> shape; bool has_shape(const shape & types, std::string & err) const; private: std::shared_ptr m_ptr; }; // Internal class hierarchy - JsonValue objects are not exposed to users of this API. class JsonValue { protected: friend class Json; friend class JsonInt; friend class JsonDouble; virtual Json::Type type() const = 0; virtual bool equals(const JsonValue * other) const = 0; virtual bool less(const JsonValue * other) const = 0; virtual void dump(std::string &out) const = 0; virtual double number_value() const; virtual int int_value() const; virtual bool bool_value() const; virtual const std::string &string_value() const; virtual const Json::array &array_items() const; virtual const Json &operator[](size_t i) const; virtual const Json::object &object_items() const; virtual const Json &operator[](const std::string &key) const; virtual ~JsonValue() {} }; } // namespace json11 sonic-visualiser-3.0.3/piper-cpp/ext/json11/test.cpp0000644000000000000000000001412413111512442020433 0ustar 00000000000000#include #include #include #include #include #include "json11.hpp" #include #include #include #include using namespace json11; using std::string; // Check that Json has the properties we want. #include #define CHECK_TRAIT(x) static_assert(std::x::value, #x) CHECK_TRAIT(is_nothrow_constructible); CHECK_TRAIT(is_nothrow_default_constructible); CHECK_TRAIT(is_copy_constructible); CHECK_TRAIT(is_nothrow_move_constructible); CHECK_TRAIT(is_copy_assignable); CHECK_TRAIT(is_nothrow_move_assignable); CHECK_TRAIT(is_nothrow_destructible); void parse_from_stdin() { string buf; string line; while (std::getline(std::cin, line)) { buf += line + "\n"; } string err; auto json = Json::parse(buf, err); if (!err.empty()) { printf("Failed: %s\n", err.c_str()); } else { printf("Result: %s\n", json.dump().c_str()); } } int main(int argc, char **argv) { if (argc == 2 && argv[1] == string("--stdin")) { parse_from_stdin(); return 0; } const string simple_test = R"({"k1":"v1", "k2":42, "k3":["a",123,true,false,null]})"; string err; auto json = Json::parse(simple_test, err); std::cout << "k1: " << json["k1"].string_value() << "\n"; std::cout << "k3: " << json["k3"].dump() << "\n"; for (auto &k : json["k3"].array_items()) { std::cout << " - " << k.dump() << "\n"; } const string comment_test = R"({ // comment /* with nested comment */ "a": 1, // comment // continued "b": "text", /* multi line comment */ // and single-line comment "c": [1, 2, 3] })"; string err_comment; auto json_comment = Json::parse( comment_test, err_comment, JsonParse::COMMENTS); if (!err_comment.empty()) { printf("Failed: %s\n", err_comment.c_str()); } else { printf("Result: %s\n", json_comment.dump().c_str()); } string failing_comment_test = R"({ /* bad comment "a": 1, })"; string err_failing_comment; auto json_failing_comment = Json::parse( failing_comment_test, err_failing_comment, JsonParse::COMMENTS); if (!err_failing_comment.empty()) { printf("Failed: %s\n", err_failing_comment.c_str()); } else { printf("Result: %s\n", json_failing_comment.dump().c_str()); } failing_comment_test = R"({ / / bad comment })"; json_failing_comment = Json::parse( failing_comment_test, err_failing_comment, JsonParse::COMMENTS); if (!err_failing_comment.empty()) { printf("Failed: %s\n", err_failing_comment.c_str()); } else { printf("Result: %s\n", json_failing_comment.dump().c_str()); } failing_comment_test = R"({// bad comment })"; json_failing_comment = Json::parse( failing_comment_test, err_failing_comment, JsonParse::COMMENTS); if (!err_failing_comment.empty()) { printf("Failed: %s\n", err_failing_comment.c_str()); } else { printf("Result: %s\n", json_failing_comment.dump().c_str()); } failing_comment_test = R"({ "a": 1 }/)"; json_failing_comment = Json::parse( failing_comment_test, err_failing_comment, JsonParse::COMMENTS); if (!err_failing_comment.empty()) { printf("Failed: %s\n", err_failing_comment.c_str()); } else { printf("Result: %s\n", json_failing_comment.dump().c_str()); } failing_comment_test = R"({/* bad comment *})"; json_failing_comment = Json::parse( failing_comment_test, err_failing_comment, JsonParse::COMMENTS); if (!err_failing_comment.empty()) { printf("Failed: %s\n", err_failing_comment.c_str()); } else { printf("Result: %s\n", json_failing_comment.dump().c_str()); } std::list l1 { 1, 2, 3 }; std::vector l2 { 1, 2, 3 }; std::set l3 { 1, 2, 3 }; assert(Json(l1) == Json(l2)); assert(Json(l2) == Json(l3)); std::map m1 { { "k1", "v1" }, { "k2", "v2" } }; std::unordered_map m2 { { "k1", "v1" }, { "k2", "v2" } }; assert(Json(m1) == Json(m2)); // Json literals Json obj = Json::object({ { "k1", "v1" }, { "k2", 42.0 }, { "k3", Json::array({ "a", 123.0, true, false, nullptr }) }, }); std::cout << "obj: " << obj.dump() << "\n"; assert(Json("a").number_value() == 0); assert(Json("a").string_value() == "a"); assert(Json().number_value() == 0); assert(obj == json); assert(Json(42) == Json(42.0)); assert(Json(42) != Json(42.1)); const string unicode_escape_test = R"([ "blah\ud83d\udca9blah\ud83dblah\udca9blah\u0000blah\u1234" ])"; const char utf8[] = "blah" "\xf0\x9f\x92\xa9" "blah" "\xed\xa0\xbd" "blah" "\xed\xb2\xa9" "blah" "\0" "blah" "\xe1\x88\xb4"; Json uni = Json::parse(unicode_escape_test, err); assert(uni[0].string_value().size() == (sizeof utf8) - 1); assert(std::memcmp(uni[0].string_value().data(), utf8, sizeof utf8) == 0); // Demonstrates the behavior change in Xcode 7 / Clang 3.7 described // here: https://llvm.org/bugs/show_bug.cgi?id=23812 Json nested_array = Json::array { Json::array { 1, 2, 3 } }; assert(nested_array.is_array()); assert(nested_array.array_items().size() == 1); assert(nested_array.array_items()[0].is_array()); assert(nested_array.array_items()[0].array_items().size() == 3); Json my_json = Json::object { { "key1", "value1" }, { "key2", false }, { "key3", Json::array { 1, 2, 3 } }, }; std::string json_str = my_json.dump(); printf("%s\n", json_str.c_str()); class Point { public: int x; int y; Point (int x, int y) : x(x), y(y) {} Json to_json() const { return Json::array { x, y }; } }; std::vector points = { { 1, 2 }, { 10, 20 }, { 100, 200 } }; std::string points_json = Json(points).dump(); printf("%s\n", points_json.c_str()); } sonic-visualiser-3.0.3/piper-cpp/test.sh0000755000000000000000000000050213111512442016346 0ustar 00000000000000#!/bin/bash set -eu mypath=$(dirname "$0") echo "Building and testing simple server..." make -f "$mypath"/Makefile clean all test echo echo "Building and running test client..." ( cd "$mypath"/vamp-client/qt && qmake && make clean all test && ./test ../../bin/piper-vamp-simple-server ) echo echo "Done" echo sonic-visualiser-3.0.3/piper-cpp/test/main.cpp0000644000000000000000000000006513111512442017443 0ustar 00000000000000#define CATCH_CONFIG_MAIN #include "catch/catch.hpp" sonic-visualiser-3.0.3/piper-cpp/test/vamp-client/tst_PluginStub.cpp0000644000000000000000000001241513111512442023726 0ustar 00000000000000#include "catch/catch.hpp" #include "vamp-client/Loader.h" #include "vamp-client/PluginClient.h" #include "vamp-client/PiperVampPlugin.h" #include "vamp-support/RequestResponse.h" #include using namespace piper_vamp; using namespace piper_vamp::client; using AudioBuffer = std::vector>; // This stub fakes the interaction with a Piper server // Here we only need to implement the configure method // due to testing only the initialise implemention of PiperVampPlugin class StubClient : public PluginClient { public: StubClient(PluginStaticData staticData) : m_staticData(staticData) {} ConfigurationResponse configure(PiperVampPlugin* plugin, PluginConfiguration config) override { const float scale = plugin->getParameter("framing-scale"); ConfigurationResponse cr; cr.plugin = plugin; // we want to return different framing sizes than config provides // there isn't really any need to be doing this with a plugin param cr.framing.blockSize = config.framing.blockSize * scale; cr.framing.stepSize = config.framing.stepSize * scale; // just return some outputs anyway // to avoid a failure case we are not testing here. Vamp::Plugin::OutputDescriptor output; const auto basic = m_staticData.basicOutputInfo[0]; output.identifier = basic.identifier; output.name = basic.name; output.description = basic.description; cr.outputs = {output}; return cr; } Vamp::Plugin::FeatureSet process(PiperVampPlugin* /*plugin*/, AudioBuffer /*channels*/, Vamp::RealTime /*timestamp*/) override { return {}; } Vamp::Plugin::FeatureSet finish(PiperVampPlugin* /*plugin*/) override { return {}; } void reset(PiperVampPlugin* /*plugin*/, PluginConfiguration /*config*/) override {} private: PluginStaticData m_staticData; }; TEST_CASE("Init plugin with parameter dependent preferred framing sizes") { const std::size_t initialBlockSize = 1024; const std::size_t initialStepSize = 512; PluginConfiguration defaultConfig; defaultConfig.channelCount = 1; defaultConfig.framing.blockSize = initialBlockSize; defaultConfig.framing.stepSize = initialStepSize; defaultConfig.parameterValues = {{"framing-scale", 1.0}}; Vamp::PluginBase::ParameterDescriptor stubParam; stubParam.identifier = "framing-scale"; stubParam.name = "Framing Scale Factor"; stubParam.description = "Scales the preferred framing sizes"; stubParam.maxValue = 2.0; PluginStaticData staticData; staticData.pluginKey = "stub"; staticData.basic = {"param-init", "Stub", "Testing init"}; staticData.maker = "Lucas Thompson"; staticData.copyright = "GPL"; staticData.pluginVersion = 1; staticData.category = {"Test"}; staticData.minChannelCount = 1; staticData.maxChannelCount = 1; staticData.parameters = {stubParam}; staticData.inputDomain = Vamp::Plugin::InputDomain::TimeDomain; staticData.basicOutputInfo = {{"output", "NA", "Not real"}}; StubClient stub {staticData}; PiperVampPlugin vampPiperAdapter { &stub, "stub", // plugin key 44100.0, // sample rate 0, // adapter flags, don't care here staticData, defaultConfig }; const auto initWithPreferredFraming = [&]() -> bool { return vampPiperAdapter.initialise( 1, vampPiperAdapter.getPreferredStepSize(), vampPiperAdapter.getPreferredBlockSize() ); }; const AudioBuffer monoAudio { std::vector(vampPiperAdapter.getPreferredBlockSize()) }; const std::vector channelPtrs { monoAudio[0].data() }; SECTION("Initialises with default parameters") { REQUIRE( initWithPreferredFraming() ); } SECTION("Fails to init when changing framing influencing parameter") { const float scalingFactor = 2.0; vampPiperAdapter.setParameter("framing-scale", scalingFactor); REQUIRE( initWithPreferredFraming() == false ); const float configuredStepSize = vampPiperAdapter.getPreferredStepSize(); const float configuredBlockSize = vampPiperAdapter.getPreferredBlockSize(); REQUIRE( configuredStepSize == initialStepSize * scalingFactor ); REQUIRE( configuredBlockSize == initialBlockSize * scalingFactor ); } SECTION("Cannot process after a failed init call (due to framing)") { const float scalingFactor = 2.0; vampPiperAdapter.setParameter("framing-scale", scalingFactor); REQUIRE( initWithPreferredFraming() == false ); REQUIRE_THROWS( vampPiperAdapter.process(channelPtrs.data(), {}) ); REQUIRE_THROWS( initWithPreferredFraming() ); } SECTION("Can process after correctly initialising framing") { const float scalingFactor = 2.0; vampPiperAdapter.setParameter("framing-scale", scalingFactor); REQUIRE( initWithPreferredFraming() == false ); REQUIRE( initWithPreferredFraming() ); REQUIRE( vampPiperAdapter.process(channelPtrs.data(), {}).empty() ); } } sonic-visualiser-3.0.3/piper-cpp/vamp-capnp/VampnProto.h0000644000000000000000000010536313111512442021363 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2015-2016 QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "piper.capnp.h" #include #include #include #include "vamp-support/PluginStaticData.h" #include "vamp-support/PluginConfiguration.h" #include "vamp-support/RequestResponse.h" #include "vamp-support/PluginHandleMapper.h" #include "vamp-support/PluginOutputIdMapper.h" #include "vamp-support/RequestResponseType.h" namespace piper_vamp { /** * Convert the structures laid out in the Vamp SDK classes into Cap'n * Proto structures (and back again). * * At least some of this will be necessary for any implementation * using Cap'n Proto that uses the C++ Vamp SDK to provide its * reference structures. An implementation could alternatively use the * Cap'n Proto structures directly, and interact with Vamp plugins * using the Vamp C API, without using the C++ Vamp SDK classes at * all. That would avoid a lot of copying (in Cap'n Proto style). */ class VampnProto { public: typedef ::capnp::MallocMessageBuilder MsgBuilder; template static void buildBasicDescriptor(B &basic, const T &t) { basic.setIdentifier(t.identifier); basic.setName(t.name); basic.setDescription(t.description); } template static void readBasicDescriptor(T &t, const B &basic) { t.identifier = basic.getIdentifier(); t.name = basic.getName(); t.description = basic.getDescription(); } template static void buildValueExtents(M &m, const T &t) { m.setMinValue(t.minValue); m.setMaxValue(t.maxValue); } template static void readValueExtents(T &t, const M &m) { t.minValue = m.getMinValue(); t.maxValue = m.getMaxValue(); } static void buildRealTime(piper::RealTime::Builder &b, const Vamp::RealTime &t) { b.setSec(t.sec); b.setNsec(t.nsec); } static void readRealTime(Vamp::RealTime &t, const piper::RealTime::Reader &r) { t.sec = r.getSec(); t.nsec = r.getNsec(); } static piper::SampleType fromSampleType(Vamp::Plugin::OutputDescriptor::SampleType t) { switch (t) { case Vamp::Plugin::OutputDescriptor::OneSamplePerStep: return piper::SampleType::ONE_SAMPLE_PER_STEP; case Vamp::Plugin::OutputDescriptor::FixedSampleRate: return piper::SampleType::FIXED_SAMPLE_RATE; case Vamp::Plugin::OutputDescriptor::VariableSampleRate: return piper::SampleType::VARIABLE_SAMPLE_RATE; } throw std::logic_error("unexpected Vamp SampleType enum value"); } static Vamp::Plugin::OutputDescriptor::SampleType toSampleType(piper::SampleType t) { switch (t) { case piper::SampleType::ONE_SAMPLE_PER_STEP: return Vamp::Plugin::OutputDescriptor::OneSamplePerStep; case piper::SampleType::FIXED_SAMPLE_RATE: return Vamp::Plugin::OutputDescriptor::FixedSampleRate; case piper::SampleType::VARIABLE_SAMPLE_RATE: return Vamp::Plugin::OutputDescriptor::VariableSampleRate; } throw std::logic_error("unexpected Capnp SampleType enum value"); } static void buildConfiguredOutputDescriptor(piper::ConfiguredOutputDescriptor::Builder &b, const Vamp::Plugin::OutputDescriptor &od) { b.setUnit(od.unit); b.setSampleType(fromSampleType(od.sampleType)); b.setSampleRate(od.sampleRate); b.setHasDuration(od.hasDuration); b.setHasFixedBinCount(od.hasFixedBinCount); if (od.hasFixedBinCount) { b.setBinCount(int(od.binCount)); if (od.binNames.size() > 0) { auto binNames = b.initBinNames(unsigned(od.binNames.size())); for (int i = 0; i < int(od.binNames.size()); ++i) { binNames.set(i, od.binNames[i]); } } } b.setHasKnownExtents(od.hasKnownExtents); if (od.hasKnownExtents) { buildValueExtents(b, od); } b.setIsQuantized(od.isQuantized); if (od.isQuantized) { b.setQuantizeStep(od.quantizeStep); } } static void buildOutputDescriptor(piper::OutputDescriptor::Builder &b, const Vamp::Plugin::OutputDescriptor &od) { auto basic = b.initBasic(); buildBasicDescriptor(basic, od); auto configured = b.initConfigured(); buildConfiguredOutputDescriptor(configured, od); } static void readConfiguredOutputDescriptor(Vamp::Plugin::OutputDescriptor &od, const piper::ConfiguredOutputDescriptor::Reader &r) { od.unit = r.getUnit(); od.sampleType = toSampleType(r.getSampleType()); od.sampleRate = r.getSampleRate(); od.hasDuration = r.getHasDuration(); od.hasFixedBinCount = r.getHasFixedBinCount(); if (od.hasFixedBinCount) { od.binCount = r.getBinCount(); od.binNames.clear(); auto nn = r.getBinNames(); for (const auto &n: nn) { od.binNames.push_back(n); } } od.hasKnownExtents = r.getHasKnownExtents(); if (od.hasKnownExtents) { readValueExtents(od, r); } od.isQuantized = r.getIsQuantized(); if (od.isQuantized) { od.quantizeStep = r.getQuantizeStep(); } } static void readOutputDescriptor(Vamp::Plugin::OutputDescriptor &od, const piper::OutputDescriptor::Reader &r) { readBasicDescriptor(od, r.getBasic()); readConfiguredOutputDescriptor(od, r.getConfigured()); } static void buildParameterDescriptor(piper::ParameterDescriptor::Builder &b, const Vamp::Plugin::ParameterDescriptor &pd) { auto basic = b.initBasic(); buildBasicDescriptor(basic, pd); b.setUnit(pd.unit); buildValueExtents(b, pd); b.setDefaultValue(pd.defaultValue); b.setIsQuantized(pd.isQuantized); if (pd.isQuantized) { b.setQuantizeStep(pd.quantizeStep); } if (pd.valueNames.size() > 0) { auto valueNames = b.initValueNames(unsigned(pd.valueNames.size())); for (int i = 0; i < int(pd.valueNames.size()); ++i) { valueNames.set(i, pd.valueNames[i]); } } } static void readParameterDescriptor(Vamp::Plugin::ParameterDescriptor &pd, const piper::ParameterDescriptor::Reader &r) { readBasicDescriptor(pd, r.getBasic()); pd.unit = r.getUnit(); readValueExtents(pd, r); pd.defaultValue = r.getDefaultValue(); pd.isQuantized = r.getIsQuantized(); if (pd.isQuantized) { pd.quantizeStep = r.getQuantizeStep(); } pd.valueNames.clear(); auto nn = r.getValueNames(); for (const auto &n: nn) { pd.valueNames.push_back(n); } } static void buildFeature(piper::Feature::Builder &b, const Vamp::Plugin::Feature &f) { b.setHasTimestamp(f.hasTimestamp); if (f.hasTimestamp) { auto timestamp = b.initTimestamp(); buildRealTime(timestamp, f.timestamp); } b.setHasDuration(f.hasDuration); if (f.hasDuration) { auto duration = b.initDuration(); buildRealTime(duration, f.duration); } b.setLabel(f.label); if (f.values.size() > 0) { auto values = b.initFeatureValues(unsigned(f.values.size())); for (int i = 0; i < int(f.values.size()); ++i) { values.set(i, f.values[i]); } } } static void readFeature(Vamp::Plugin::Feature &f, const piper::Feature::Reader &r) { f.hasTimestamp = r.getHasTimestamp(); if (f.hasTimestamp) { readRealTime(f.timestamp, r.getTimestamp()); } f.hasDuration = r.getHasDuration(); if (f.hasDuration) { readRealTime(f.duration, r.getDuration()); } f.label = r.getLabel(); f.values.clear(); auto vv = r.getFeatureValues(); for (auto v: vv) { f.values.push_back(v); } } static void buildFeatureSet(piper::FeatureSet::Builder &b, const Vamp::Plugin::FeatureSet &fs, const PluginOutputIdMapper &omapper) { auto featureset = b.initFeaturePairs(unsigned(fs.size())); int ix = 0; for (const auto &fsi : fs) { auto fspair = featureset[ix]; fspair.setOutput(omapper.indexToId(fsi.first)); auto featurelist = fspair.initFeatures(unsigned(fsi.second.size())); for (int j = 0; j < int(fsi.second.size()); ++j) { auto feature = featurelist[j]; buildFeature(feature, fsi.second[j]); } ++ix; } } static void readFeatureSet(Vamp::Plugin::FeatureSet &fs, const piper::FeatureSet::Reader &r, const PluginOutputIdMapper &omapper) { fs.clear(); auto pp = r.getFeaturePairs(); for (const auto &p: pp) { Vamp::Plugin::FeatureList vfl; auto ff = p.getFeatures(); for (const auto &f: ff) { Vamp::Plugin::Feature vf; readFeature(vf, f); vfl.push_back(vf); } fs[omapper.idToIndex(p.getOutput())] = vfl; } } static piper::InputDomain fromInputDomain(Vamp::Plugin::InputDomain d) { switch(d) { case Vamp::Plugin::TimeDomain: return piper::InputDomain::TIME_DOMAIN; case Vamp::Plugin::FrequencyDomain: return piper::InputDomain::FREQUENCY_DOMAIN; default: throw std::logic_error("unexpected Vamp InputDomain enum value"); } } static Vamp::Plugin::InputDomain toInputDomain(piper::InputDomain d) { switch(d) { case piper::InputDomain::TIME_DOMAIN: return Vamp::Plugin::TimeDomain; case piper::InputDomain::FREQUENCY_DOMAIN: return Vamp::Plugin::FrequencyDomain; default: throw std::logic_error("unexpected Capnp InputDomain enum value"); } } static void buildExtractorStaticData(piper::ExtractorStaticData::Builder &b, const PluginStaticData &d) { b.setKey(d.pluginKey); auto basic = b.initBasic(); buildBasicDescriptor(basic, d.basic); b.setMaker(d.maker); b.setRights(d.copyright); b.setVersion(d.pluginVersion); auto clist = b.initCategory(unsigned(d.category.size())); for (int i = 0; i < int(d.category.size()); ++i) { clist.set(i, d.category[i]); } b.setMinChannelCount(int(d.minChannelCount)); b.setMaxChannelCount(int(d.maxChannelCount)); const auto &vparams = d.parameters; auto plist = b.initParameters(unsigned(vparams.size())); for (int i = 0; i < int(vparams.size()); ++i) { auto pd = plist[i]; buildParameterDescriptor(pd, vparams[i]); } const auto &vprogs = d.programs; auto pglist = b.initPrograms(unsigned(vprogs.size())); for (int i = 0; i < int(vprogs.size()); ++i) { pglist.set(i, vprogs[i]); } b.setInputDomain(fromInputDomain(d.inputDomain)); const auto &vouts = d.basicOutputInfo; auto olist = b.initBasicOutputInfo(unsigned(vouts.size())); for (int i = 0; i < int(vouts.size()); ++i) { auto od = olist[i]; buildBasicDescriptor(od, vouts[i]); } } static void readExtractorStaticData(PluginStaticData &d, const piper::ExtractorStaticData::Reader &r) { d.pluginKey = r.getKey(); readBasicDescriptor(d.basic, r.getBasic()); d.maker = r.getMaker(); d.copyright = r.getRights(); d.pluginVersion = r.getVersion(); d.category.clear(); auto cc = r.getCategory(); for (auto c: cc) { d.category.push_back(c); } d.minChannelCount = r.getMinChannelCount(); d.maxChannelCount = r.getMaxChannelCount(); d.parameters.clear(); auto pp = r.getParameters(); for (auto p: pp) { Vamp::Plugin::ParameterDescriptor pd; readParameterDescriptor(pd, p); d.parameters.push_back(pd); } d.programs.clear(); auto prp = r.getPrograms(); for (auto p: prp) { d.programs.push_back(p); } d.inputDomain = toInputDomain(r.getInputDomain()); d.basicOutputInfo.clear(); auto oo = r.getBasicOutputInfo(); for (auto o: oo) { PluginStaticData::Basic b; readBasicDescriptor(b, o); d.basicOutputInfo.push_back(b); } } static void buildConfiguration(piper::Configuration::Builder &b, const PluginConfiguration &c) { const auto &vparams = c.parameterValues; auto params = b.initParameterValues(unsigned(vparams.size())); int i = 0; for (const auto &pp : vparams) { auto param = params[i++]; param.setParameter(pp.first); param.setValue(pp.second); } b.setCurrentProgram(c.currentProgram); b.setChannelCount(c.channelCount); auto framing = b.initFraming(); framing.setStepSize(c.framing.stepSize); framing.setBlockSize(c.framing.blockSize); } static void readConfiguration(PluginConfiguration &c, const piper::Configuration::Reader &r) { auto pp = r.getParameterValues(); for (const auto &p: pp) { c.parameterValues[p.getParameter()] = p.getValue(); } c.currentProgram = r.getCurrentProgram(); c.channelCount = r.getChannelCount(); c.framing.stepSize = r.getFraming().getStepSize(); c.framing.blockSize = r.getFraming().getBlockSize(); } static void buildListRequest(piper::ListRequest::Builder &r, const ListRequest &resp) { auto p = r.initFrom(unsigned(resp.from.size())); for (int i = 0; i < int(resp.from.size()); ++i) { p.set(i, resp.from[i]); } } static void readListRequest(ListRequest &lr, const piper::ListRequest::Reader &r) { lr.from.clear(); for (auto f: r.getFrom()) { lr.from.push_back(f); } } static void buildListResponse(piper::ListResponse::Builder &r, const ListResponse &resp) { auto p = r.initAvailable(unsigned(resp.available.size())); for (int i = 0; i < int(resp.available.size()); ++i) { auto pd = p[i]; buildExtractorStaticData(pd, resp.available[i]); } } static void readListResponse(ListResponse &lr, const piper::ListResponse::Reader &r) { lr.available.clear(); auto pp = r.getAvailable(); for (const auto &p: pp) { PluginStaticData psd; readExtractorStaticData(psd, p); lr.available.push_back(psd); } } static void buildLoadRequest(piper::LoadRequest::Builder &r, const LoadRequest &req) { r.setKey(req.pluginKey); r.setInputSampleRate(req.inputSampleRate); std::vector flags; if (req.adapterFlags & Vamp::HostExt::PluginLoader::ADAPT_INPUT_DOMAIN) { flags.push_back(piper::AdapterFlag::ADAPT_INPUT_DOMAIN); } if (req.adapterFlags & Vamp::HostExt::PluginLoader::ADAPT_CHANNEL_COUNT) { flags.push_back(piper::AdapterFlag::ADAPT_CHANNEL_COUNT); } if (req.adapterFlags & Vamp::HostExt::PluginLoader::ADAPT_BUFFER_SIZE) { flags.push_back(piper::AdapterFlag::ADAPT_BUFFER_SIZE); } auto f = r.initAdapterFlags(unsigned(flags.size())); for (int i = 0; i < int(flags.size()); ++i) { f.set(i, flags[i]); } } static void readLoadRequest(LoadRequest &req, const piper::LoadRequest::Reader &r) { req.pluginKey = r.getKey(); req.inputSampleRate = r.getInputSampleRate(); int flags = 0; auto aa = r.getAdapterFlags(); for (auto a: aa) { if (a == piper::AdapterFlag::ADAPT_INPUT_DOMAIN) { flags |= Vamp::HostExt::PluginLoader::ADAPT_INPUT_DOMAIN; } if (a == piper::AdapterFlag::ADAPT_CHANNEL_COUNT) { flags |= Vamp::HostExt::PluginLoader::ADAPT_CHANNEL_COUNT; } if (a == piper::AdapterFlag::ADAPT_BUFFER_SIZE) { flags |= Vamp::HostExt::PluginLoader::ADAPT_BUFFER_SIZE; } } req.adapterFlags = flags; } static void buildLoadResponse(piper::LoadResponse::Builder &b, const LoadResponse &resp, const PluginHandleMapper &pmapper) { b.setHandle(pmapper.pluginToHandle(resp.plugin)); auto sd = b.initStaticData(); buildExtractorStaticData(sd, resp.staticData); auto conf = b.initDefaultConfiguration(); buildConfiguration(conf, resp.defaultConfiguration); } static void readLoadResponse(LoadResponse &resp, const piper::LoadResponse::Reader &r, const PluginHandleMapper &pmapper) { resp.plugin = pmapper.handleToPlugin(r.getHandle()); readExtractorStaticData(resp.staticData, r.getStaticData()); readConfiguration(resp.defaultConfiguration, r.getDefaultConfiguration()); } static void buildConfigurationRequest(piper::ConfigurationRequest::Builder &b, const ConfigurationRequest &cr, const PluginHandleMapper &pmapper) { b.setHandle(pmapper.pluginToHandle(cr.plugin)); auto c = b.initConfiguration(); buildConfiguration(c, cr.configuration); } static void readConfigurationRequest(ConfigurationRequest &cr, const piper::ConfigurationRequest::Reader &r, const PluginHandleMapper &pmapper) { auto h = r.getHandle(); cr.plugin = pmapper.handleToPlugin(h); auto c = r.getConfiguration(); readConfiguration(cr.configuration, c); } static void buildConfigurationResponse(piper::ConfigurationResponse::Builder &b, const ConfigurationResponse &cr, const PluginHandleMapper &pmapper) { b.setHandle(pmapper.pluginToHandle(cr.plugin)); auto olist = b.initOutputs(unsigned(cr.outputs.size())); for (int i = 0; i < int(cr.outputs.size()); ++i) { auto od = olist[i]; buildOutputDescriptor(od, cr.outputs[i]); } auto framing = b.initFraming(); framing.setStepSize(cr.framing.stepSize); framing.setBlockSize(cr.framing.blockSize); } static void readConfigurationResponse(ConfigurationResponse &cr, const piper::ConfigurationResponse::Reader &r, const PluginHandleMapper &pmapper) { cr.plugin = pmapper.handleToPlugin(r.getHandle()); cr.outputs.clear(); auto oo = r.getOutputs(); for (const auto &o: oo) { Vamp::Plugin::OutputDescriptor desc; readOutputDescriptor(desc, o); cr.outputs.push_back(desc); } cr.framing.stepSize = r.getFraming().getStepSize(); cr.framing.blockSize = r.getFraming().getBlockSize(); } static void buildProcessInput(piper::ProcessInput::Builder &b, Vamp::RealTime timestamp, const std::vector > &buffers) { auto t = b.initTimestamp(); buildRealTime(t, timestamp); auto vv = b.initInputBuffers(unsigned(buffers.size())); for (int ch = 0; ch < int(buffers.size()); ++ch) { const int n = int(buffers[ch].size()); vv.init(ch, n); auto v = vv[ch]; for (int i = 0; i < n; ++i) { v.set(i, buffers[ch][i]); } } } static void readProcessInput(Vamp::RealTime ×tamp, std::vector > &buffers, const piper::ProcessInput::Reader &b) { readRealTime(timestamp, b.getTimestamp()); buffers.clear(); auto vv = b.getInputBuffers(); for (const auto &v: vv) { std::vector buf; for (auto x: v) { buf.push_back(x); } buffers.push_back(buf); } } static void buildProcessRequest(piper::ProcessRequest::Builder &b, const ProcessRequest &pr, const PluginHandleMapper &pmapper) { b.setHandle(pmapper.pluginToHandle(pr.plugin)); auto input = b.initProcessInput(); buildProcessInput(input, pr.timestamp, pr.inputBuffers); } static void readProcessRequest(ProcessRequest &pr, const piper::ProcessRequest::Reader &r, const PluginHandleMapper &pmapper) { auto h = r.getHandle(); pr.plugin = pmapper.handleToPlugin(h); readProcessInput(pr.timestamp, pr.inputBuffers, r.getProcessInput()); } static void buildProcessResponse(piper::ProcessResponse::Builder &b, const ProcessResponse &pr, const PluginHandleMapper &pmapper) { b.setHandle(pmapper.pluginToHandle(pr.plugin)); auto f = b.initFeatures(); buildFeatureSet(f, pr.features, *pmapper.pluginToOutputIdMapper(pr.plugin)); } static void readProcessResponse(ProcessResponse &pr, const piper::ProcessResponse::Reader &r, const PluginHandleMapper &pmapper) { auto h = r.getHandle(); pr.plugin = pmapper.handleToPlugin(h); readFeatureSet(pr.features, r.getFeatures(), *pmapper.handleToOutputIdMapper(r.getHandle())); } static void buildFinishResponse(piper::FinishResponse::Builder &b, const FinishResponse &pr, const PluginHandleMapper &pmapper) { b.setHandle(pmapper.pluginToHandle(pr.plugin)); auto f = b.initFeatures(); buildFeatureSet(f, pr.features, *pmapper.pluginToOutputIdMapper(pr.plugin)); } static void readFinishResponse(FinishResponse &pr, const piper::FinishResponse::Reader &r, const PluginHandleMapper &pmapper) { auto h = r.getHandle(); pr.plugin = pmapper.handleToPlugin(h); readFeatureSet(pr.features, r.getFeatures(), *pmapper.handleToOutputIdMapper(r.getHandle())); } static void buildRpcRequest_List(piper::RpcRequest::Builder &b, const ListRequest &req) { auto r = b.getRequest().initList(); buildListRequest(r, req); } static void buildRpcResponse_List(piper::RpcResponse::Builder &b, const ListResponse &resp) { auto r = b.getResponse().initList(); buildListResponse(r, resp); } static void buildRpcRequest_Load(piper::RpcRequest::Builder &b, const LoadRequest &req) { auto u = b.getRequest().initLoad(); buildLoadRequest(u, req); } static void buildRpcResponse_Load(piper::RpcResponse::Builder &b, const LoadResponse &resp, const PluginHandleMapper &pmapper) { if (resp.plugin) { auto u = b.getResponse().initLoad(); buildLoadResponse(u, resp, pmapper); } else { buildRpcResponse_Error(b, "Failed to load plugin", RRType::Load); } } static void buildRpcRequest_Configure(piper::RpcRequest::Builder &b, const ConfigurationRequest &cr, const PluginHandleMapper &pmapper) { auto u = b.getRequest().initConfigure(); buildConfigurationRequest(u, cr, pmapper); } static void buildRpcResponse_Configure(piper::RpcResponse::Builder &b, const ConfigurationResponse &cr, const PluginHandleMapper &pmapper) { if (!cr.outputs.empty()) { auto u = b.getResponse().initConfigure(); buildConfigurationResponse(u, cr, pmapper); } else { buildRpcResponse_Error(b, "Failed to configure plugin", RRType::Configure); } } static void buildRpcRequest_Process(piper::RpcRequest::Builder &b, const ProcessRequest &pr, const PluginHandleMapper &pmapper) { auto u = b.getRequest().initProcess(); buildProcessRequest(u, pr, pmapper); } static void buildRpcResponse_Process(piper::RpcResponse::Builder &b, const ProcessResponse &pr, const PluginHandleMapper &pmapper) { auto u = b.getResponse().initProcess(); buildProcessResponse(u, pr, pmapper); } static void buildRpcRequest_Finish(piper::RpcRequest::Builder &b, const FinishRequest &req, const PluginHandleMapper &pmapper) { auto u = b.getRequest().initFinish(); u.setHandle(pmapper.pluginToHandle(req.plugin)); } static void buildRpcResponse_Finish(piper::RpcResponse::Builder &b, const FinishResponse &pr, const PluginHandleMapper &pmapper) { auto u = b.getResponse().initFinish(); buildFinishResponse(u, pr, pmapper); } static void buildRpcResponse_Error(piper::RpcResponse::Builder &b, const std::string &errorText, RRType responseType) { std::string type; auto e = b.getResponse().initError(); if (responseType == RRType::List) { type = "list"; } else if (responseType == RRType::Load) { type = "load"; } else if (responseType == RRType::Configure) { type = "configure"; } else if (responseType == RRType::Process) { type = "process"; } else if (responseType == RRType::Finish) { type = "finish"; } else { type = "invalid"; } e.setCode(0); if (responseType == RRType::NotValid) { e.setMessage(errorText); } else { e.setMessage (std::string("error in ") + type + " request: " + errorText); } } static void buildRpcResponse_Exception(piper::RpcResponse::Builder &b, const std::exception &e, RRType responseType) { return buildRpcResponse_Error(b, e.what(), responseType); } static RRType getRequestResponseType(const piper::RpcRequest::Reader &r) { switch (r.getRequest().which()) { case piper::RpcRequest::Request::Which::LIST: return RRType::List; case piper::RpcRequest::Request::Which::LOAD: return RRType::Load; case piper::RpcRequest::Request::Which::CONFIGURE: return RRType::Configure; case piper::RpcRequest::Request::Which::PROCESS: return RRType::Process; case piper::RpcRequest::Request::Which::FINISH: return RRType::Finish; } return RRType::NotValid; } static RRType getRequestResponseType(const piper::RpcResponse::Reader &r) { switch (r.getResponse().which()) { case piper::RpcResponse::Response::Which::ERROR: return RRType::NotValid; case piper::RpcResponse::Response::Which::LIST: return RRType::List; case piper::RpcResponse::Response::Which::LOAD: return RRType::Load; case piper::RpcResponse::Response::Which::CONFIGURE: return RRType::Configure; case piper::RpcResponse::Response::Which::PROCESS: return RRType::Process; case piper::RpcResponse::Response::Which::FINISH: return RRType::Finish; } return RRType::NotValid; } static void readRpcResponse_Error(int &code, std::string &message, const piper::RpcResponse::Reader &r) { if (getRequestResponseType(r) != RRType::NotValid) { throw std::logic_error("not an error response"); } code = r.getResponse().getError().getCode(); message = r.getResponse().getError().getMessage(); } static void readRpcRequest_List(ListRequest &req, const piper::RpcRequest::Reader &r) { if (getRequestResponseType(r) != RRType::List) { throw std::logic_error("not a list request"); } readListRequest(req, r.getRequest().getList()); } static void readRpcResponse_List(ListResponse &resp, const piper::RpcResponse::Reader &r) { if (getRequestResponseType(r) != RRType::List) { throw std::logic_error("not a list response"); } readListResponse(resp, r.getResponse().getList()); } static void readRpcRequest_Load(LoadRequest &req, const piper::RpcRequest::Reader &r) { if (getRequestResponseType(r) != RRType::Load) { throw std::logic_error("not a load request"); } readLoadRequest(req, r.getRequest().getLoad()); } static void readRpcResponse_Load(LoadResponse &resp, const piper::RpcResponse::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Load) { throw std::logic_error("not a load response"); } resp = {}; readLoadResponse(resp, r.getResponse().getLoad(), pmapper); } static void readRpcRequest_Configure(ConfigurationRequest &req, const piper::RpcRequest::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Configure) { throw std::logic_error("not a configuration request"); } readConfigurationRequest(req, r.getRequest().getConfigure(), pmapper); } static void readRpcResponse_Configure(ConfigurationResponse &resp, const piper::RpcResponse::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Configure) { throw std::logic_error("not a configuration response"); } resp = {}; readConfigurationResponse(resp, r.getResponse().getConfigure(), pmapper); } static void readRpcRequest_Process(ProcessRequest &req, const piper::RpcRequest::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Process) { throw std::logic_error("not a process request"); } readProcessRequest(req, r.getRequest().getProcess(), pmapper); } static void readRpcResponse_Process(ProcessResponse &resp, const piper::RpcResponse::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Process) { throw std::logic_error("not a process response"); } resp = {}; readProcessResponse(resp, r.getResponse().getProcess(), pmapper); } static void readRpcRequest_Finish(FinishRequest &req, const piper::RpcRequest::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Finish) { throw std::logic_error("not a finish request"); } req.plugin = pmapper.handleToPlugin (r.getRequest().getFinish().getHandle()); } static void readRpcResponse_Finish(FinishResponse &resp, const piper::RpcResponse::Reader &r, const PluginHandleMapper &pmapper) { if (getRequestResponseType(r) != RRType::Finish) { throw std::logic_error("not a finish response"); } resp = {}; readFinishResponse(resp, r.getResponse().getFinish(), pmapper); } }; } sonic-visualiser-3.0.3/piper-cpp/vamp-capnp/piper-capnp.cpp0000644000000000000000000000017413111512442022021 0ustar 00000000000000// This wrapper file exists in case a uniform .cpp extension is wanted // for your build system #include "piper.capnp.c++" sonic-visualiser-3.0.3/piper-cpp/vamp-capnp/piper.capnp.c++0000644000000000000000000040305413111512442021614 0ustar 00000000000000// Generated by Cap'n Proto compiler, DO NOT EDIT // source: piper.capnp #include "piper.capnp.h" namespace capnp { namespace schemas { static const ::capnp::_::AlignedData<64> b_b491ca63222c253f = { { 0, 0, 0, 0, 5, 0, 6, 0, 63, 37, 44, 34, 99, 202, 145, 180, 12, 0, 0, 0, 1, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 146, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 66, 97, 115, 105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 3, 0, 1, 0, 80, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 3, 0, 1, 0, 84, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 3, 0, 1, 0, 92, 0, 0, 0, 2, 0, 1, 0, 105, 100, 101, 110, 116, 105, 102, 105, 101, 114, 0, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 97, 109, 101, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_b491ca63222c253f = b_b491ca63222c253f.words; #if !CAPNP_LITE static const uint16_t m_b491ca63222c253f[] = {2, 0, 1}; static const uint16_t i_b491ca63222c253f[] = {0, 1, 2}; const ::capnp::_::RawSchema s_b491ca63222c253f = { 0xb491ca63222c253f, b_b491ca63222c253f.words, 64, nullptr, m_b491ca63222c253f, 0, 3, i_b491ca63222c253f, nullptr, nullptr, { &s_b491ca63222c253f, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<148> b_f8fda10bef70a97d = { { 0, 0, 0, 0, 5, 0, 6, 0, 125, 169, 112, 239, 11, 161, 253, 248, 12, 0, 0, 0, 1, 0, 3, 0, 6, 146, 153, 76, 196, 198, 177, 196, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 2, 1, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 80, 97, 114, 97, 109, 101, 116, 101, 114, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 0, 0, 0, 0, 0, 1, 0, 1, 0, 32, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 3, 0, 1, 0, 216, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 0, 0, 0, 3, 0, 1, 0, 220, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 3, 0, 1, 0, 228, 0, 0, 0, 2, 0, 1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 3, 0, 1, 0, 236, 0, 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 3, 0, 1, 0, 244, 0, 0, 0, 2, 0, 1, 0, 5, 0, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 3, 0, 1, 0, 252, 0, 0, 0, 2, 0, 1, 0, 6, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 3, 0, 1, 0, 4, 1, 0, 0, 2, 0, 1, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 1, 0, 28, 1, 0, 0, 2, 0, 1, 0, 98, 97, 115, 105, 99, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 63, 37, 44, 34, 99, 202, 145, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 110, 105, 116, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 105, 110, 86, 97, 108, 117, 101, 0, 0, 0, 0, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 120, 86, 97, 108, 117, 101, 0, 0, 0, 0, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 97, 117, 108, 116, 86, 97, 108, 117, 101, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 115, 81, 117, 97, 110, 116, 105, 122, 101, 100, 0, 0, 0, 0, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 117, 97, 110, 116, 105, 122, 101, 83, 116, 101, 112, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 97, 108, 117, 101, 78, 97, 109, 101, 115, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 12, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, } }; ::capnp::word const* const bp_f8fda10bef70a97d = b_f8fda10bef70a97d.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_f8fda10bef70a97d[] = { &s_b491ca63222c253f, }; static const uint16_t m_f8fda10bef70a97d[] = {0, 4, 5, 3, 2, 6, 1, 7}; static const uint16_t i_f8fda10bef70a97d[] = {0, 1, 2, 3, 4, 5, 6, 7}; const ::capnp::_::RawSchema s_f8fda10bef70a97d = { 0xf8fda10bef70a97d, b_f8fda10bef70a97d.words, 148, d_f8fda10bef70a97d, m_f8fda10bef70a97d, 1, 8, i_f8fda10bef70a97d, nullptr, nullptr, { &s_f8fda10bef70a97d, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<34> b_eca23e4a04bdfeb2 = { { 0, 0, 0, 0, 5, 0, 6, 0, 178, 254, 189, 4, 74, 62, 162, 236, 12, 0, 0, 0, 2, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 186, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 83, 97, 109, 112, 108, 101, 84, 121, 112, 101, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 12, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 110, 101, 83, 97, 109, 112, 108, 101, 80, 101, 114, 83, 116, 101, 112, 0, 0, 0, 0, 0, 0, 0, 0, 102, 105, 120, 101, 100, 83, 97, 109, 112, 108, 101, 82, 97, 116, 101, 0, 118, 97, 114, 105, 97, 98, 108, 101, 83, 97, 109, 112, 108, 101, 82, 97, 116, 101, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_eca23e4a04bdfeb2 = b_eca23e4a04bdfeb2.words; #if !CAPNP_LITE static const uint16_t m_eca23e4a04bdfeb2[] = {1, 0, 2}; const ::capnp::_::RawSchema s_eca23e4a04bdfeb2 = { 0xeca23e4a04bdfeb2, b_eca23e4a04bdfeb2.words, 34, nullptr, m_eca23e4a04bdfeb2, 0, 3, nullptr, nullptr, nullptr, { &s_eca23e4a04bdfeb2, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE CAPNP_DEFINE_ENUM(SampleType_eca23e4a04bdfeb2, eca23e4a04bdfeb2); static const ::capnp::_::AlignedData<215> b_b2d0c825aac8249c = { { 0, 0, 0, 0, 5, 0, 6, 0, 156, 36, 200, 170, 37, 200, 208, 178, 12, 0, 0, 0, 1, 0, 3, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 58, 1, 0, 0, 37, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 167, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 67, 111, 110, 102, 105, 103, 117, 114, 101, 100, 79, 117, 116, 112, 117, 116, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 1, 0, 0, 3, 0, 1, 0, 72, 1, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 0, 0, 3, 0, 1, 0, 84, 1, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1, 0, 0, 3, 0, 1, 0, 92, 1, 0, 0, 2, 0, 1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 89, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 1, 0, 0, 3, 0, 1, 0, 116, 1, 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 113, 1, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 1, 0, 0, 3, 0, 1, 0, 124, 1, 0, 0, 2, 0, 1, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 121, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 1, 0, 0, 3, 0, 1, 0, 132, 1, 0, 0, 2, 0, 1, 0, 6, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 129, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 3, 0, 1, 0, 140, 1, 0, 0, 2, 0, 1, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 137, 1, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 1, 0, 0, 3, 0, 1, 0, 148, 1, 0, 0, 2, 0, 1, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 145, 1, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 3, 0, 1, 0, 156, 1, 0, 0, 2, 0, 1, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 1, 0, 0, 3, 0, 1, 0, 164, 1, 0, 0, 2, 0, 1, 0, 10, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 161, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 1, 0, 0, 3, 0, 1, 0, 172, 1, 0, 0, 2, 0, 1, 0, 11, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 169, 1, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 1, 0, 0, 3, 0, 1, 0, 180, 1, 0, 0, 2, 0, 1, 0, 117, 110, 105, 116, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 97, 115, 70, 105, 120, 101, 100, 66, 105, 110, 67, 111, 117, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 105, 110, 67, 111, 117, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 105, 110, 78, 97, 109, 101, 115, 0, 0, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 12, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 104, 97, 115, 75, 110, 111, 119, 110, 69, 120, 116, 101, 110, 116, 115, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 105, 110, 86, 97, 108, 117, 101, 0, 0, 0, 0, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 120, 86, 97, 108, 117, 101, 0, 0, 0, 0, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 115, 81, 117, 97, 110, 116, 105, 122, 101, 100, 0, 0, 0, 0, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 117, 97, 110, 116, 105, 122, 101, 83, 116, 101, 112, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 97, 109, 112, 108, 101, 84, 121, 112, 101, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 178, 254, 189, 4, 74, 62, 162, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 97, 109, 112, 108, 101, 82, 97, 116, 101, 0, 0, 0, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 97, 115, 68, 117, 114, 97, 116, 105, 111, 110, 0, 0, 0, 0, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_b2d0c825aac8249c = b_b2d0c825aac8249c.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_b2d0c825aac8249c[] = { &s_eca23e4a04bdfeb2, }; static const uint16_t m_b2d0c825aac8249c[] = {2, 3, 11, 1, 4, 7, 6, 5, 8, 10, 9, 0}; static const uint16_t i_b2d0c825aac8249c[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const ::capnp::_::RawSchema s_b2d0c825aac8249c = { 0xb2d0c825aac8249c, b_b2d0c825aac8249c.words, 215, d_b2d0c825aac8249c, m_b2d0c825aac8249c, 1, 12, i_b2d0c825aac8249c, nullptr, nullptr, { &s_b2d0c825aac8249c, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<49> b_902c6065e1be824a = { { 0, 0, 0, 0, 5, 0, 6, 0, 74, 130, 190, 225, 101, 96, 44, 144, 12, 0, 0, 0, 1, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 234, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 79, 117, 116, 112, 117, 116, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 98, 97, 115, 105, 99, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 63, 37, 44, 34, 99, 202, 145, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 111, 110, 102, 105, 103, 117, 114, 101, 100, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 156, 36, 200, 170, 37, 200, 208, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_902c6065e1be824a = b_902c6065e1be824a.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_902c6065e1be824a[] = { &s_b2d0c825aac8249c, &s_b491ca63222c253f, }; static const uint16_t m_902c6065e1be824a[] = {0, 1}; static const uint16_t i_902c6065e1be824a[] = {0, 1}; const ::capnp::_::RawSchema s_902c6065e1be824a = { 0x902c6065e1be824a, b_902c6065e1be824a.words, 49, d_902c6065e1be824a, m_902c6065e1be824a, 2, 2, i_902c6065e1be824a, nullptr, nullptr, { &s_902c6065e1be824a, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<27> b_f50fb3b9c1bf75f4 = { { 0, 0, 0, 0, 5, 0, 6, 0, 244, 117, 191, 193, 185, 179, 15, 245, 12, 0, 0, 0, 2, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 194, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 73, 110, 112, 117, 116, 68, 111, 109, 97, 105, 110, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 105, 109, 101, 68, 111, 109, 97, 105, 110, 0, 0, 0, 0, 0, 0, 102, 114, 101, 113, 117, 101, 110, 99, 121, 68, 111, 109, 97, 105, 110, 0, } }; ::capnp::word const* const bp_f50fb3b9c1bf75f4 = b_f50fb3b9c1bf75f4.words; #if !CAPNP_LITE static const uint16_t m_f50fb3b9c1bf75f4[] = {1, 0}; const ::capnp::_::RawSchema s_f50fb3b9c1bf75f4 = { 0xf50fb3b9c1bf75f4, b_f50fb3b9c1bf75f4.words, 27, nullptr, m_f50fb3b9c1bf75f4, 0, 2, nullptr, nullptr, nullptr, { &s_f50fb3b9c1bf75f4, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE CAPNP_DEFINE_ENUM(InputDomain_f50fb3b9c1bf75f4, f50fb3b9c1bf75f4); static const ::capnp::_::AlignedData<221> b_b83ac85463e6caa1 = { { 0, 0, 0, 0, 5, 0, 6, 0, 161, 202, 230, 99, 84, 200, 58, 184, 12, 0, 0, 0, 1, 0, 2, 0, 6, 146, 153, 76, 196, 198, 177, 196, 8, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 2, 1, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 167, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 69, 120, 116, 114, 97, 99, 116, 111, 114, 83, 116, 97, 116, 105, 99, 68, 97, 116, 97, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 1, 0, 0, 3, 0, 1, 0, 72, 1, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 3, 0, 1, 0, 76, 1, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1, 0, 0, 3, 0, 1, 0, 80, 1, 0, 0, 2, 0, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 0, 0, 3, 0, 1, 0, 84, 1, 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 3, 0, 1, 0, 88, 1, 0, 0, 2, 0, 1, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 1, 0, 0, 3, 0, 1, 0, 112, 1, 0, 0, 2, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 1, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 1, 0, 0, 3, 0, 1, 0, 120, 1, 0, 0, 2, 0, 1, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 1, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 1, 0, 0, 3, 0, 1, 0, 128, 1, 0, 0, 2, 0, 1, 0, 8, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 1, 0, 0, 3, 0, 1, 0, 152, 1, 0, 0, 2, 0, 1, 0, 9, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 1, 0, 0, 3, 0, 1, 0, 176, 1, 0, 0, 2, 0, 1, 0, 10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 1, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 1, 0, 0, 3, 0, 1, 0, 184, 1, 0, 0, 2, 0, 1, 0, 11, 0, 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 1, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 1, 0, 0, 3, 0, 1, 0, 208, 1, 0, 0, 2, 0, 1, 0, 107, 101, 121, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 115, 105, 99, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 63, 37, 44, 34, 99, 202, 145, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 107, 101, 114, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 105, 103, 104, 116, 115, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 101, 114, 115, 105, 111, 110, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 97, 116, 101, 103, 111, 114, 121, 0, 0, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 12, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 105, 110, 67, 104, 97, 110, 110, 101, 108, 67, 111, 117, 110, 116, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 120, 67, 104, 97, 110, 110, 101, 108, 67, 111, 117, 110, 116, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 97, 114, 97, 109, 101, 116, 101, 114, 115, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 125, 169, 112, 239, 11, 161, 253, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 114, 111, 103, 114, 97, 109, 115, 0, 0, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 12, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 110, 112, 117, 116, 68, 111, 109, 97, 105, 110, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 244, 117, 191, 193, 185, 179, 15, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 115, 105, 99, 79, 117, 116, 112, 117, 116, 73, 110, 102, 111, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 63, 37, 44, 34, 99, 202, 145, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_b83ac85463e6caa1 = b_b83ac85463e6caa1.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_b83ac85463e6caa1[] = { &s_b491ca63222c253f, &s_f50fb3b9c1bf75f4, &s_f8fda10bef70a97d, }; static const uint16_t m_b83ac85463e6caa1[] = {1, 11, 5, 10, 0, 2, 7, 6, 8, 9, 3, 4}; static const uint16_t i_b83ac85463e6caa1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const ::capnp::_::RawSchema s_b83ac85463e6caa1 = { 0xb83ac85463e6caa1, b_b83ac85463e6caa1.words, 221, d_b83ac85463e6caa1, m_b83ac85463e6caa1, 3, 12, i_b83ac85463e6caa1, nullptr, nullptr, { &s_b83ac85463e6caa1, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<47> b_84d515888a427d07 = { { 0, 0, 0, 0, 5, 0, 6, 0, 7, 125, 66, 138, 136, 21, 213, 132, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 170, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 101, 97, 108, 84, 105, 109, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 3, 0, 1, 0, 52, 0, 0, 0, 2, 0, 1, 0, 115, 101, 99, 0, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 115, 101, 99, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_84d515888a427d07 = b_84d515888a427d07.words; #if !CAPNP_LITE static const uint16_t m_84d515888a427d07[] = {1, 0}; static const uint16_t i_84d515888a427d07[] = {0, 1}; const ::capnp::_::RawSchema s_84d515888a427d07 = { 0x84d515888a427d07, b_84d515888a427d07.words, 47, nullptr, m_84d515888a427d07, 0, 2, i_84d515888a427d07, nullptr, nullptr, { &s_84d515888a427d07, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<58> b_c6f3f05f2bc614ba = { { 0, 0, 0, 0, 5, 0, 6, 0, 186, 20, 198, 43, 95, 240, 243, 198, 12, 0, 0, 0, 1, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 202, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 80, 114, 111, 99, 101, 115, 115, 73, 110, 112, 117, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 3, 0, 1, 0, 84, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 3, 0, 1, 0, 92, 0, 0, 0, 2, 0, 1, 0, 105, 110, 112, 117, 116, 66, 117, 102, 102, 101, 114, 115, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 14, 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, 3, 0, 1, 0, 10, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 105, 109, 101, 115, 116, 97, 109, 112, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 7, 125, 66, 138, 136, 21, 213, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_c6f3f05f2bc614ba = b_c6f3f05f2bc614ba.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_c6f3f05f2bc614ba[] = { &s_84d515888a427d07, }; static const uint16_t m_c6f3f05f2bc614ba[] = {0, 1}; static const uint16_t i_c6f3f05f2bc614ba[] = {0, 1}; const ::capnp::_::RawSchema s_c6f3f05f2bc614ba = { 0xc6f3f05f2bc614ba, b_c6f3f05f2bc614ba.words, 58, d_c6f3f05f2bc614ba, m_c6f3f05f2bc614ba, 1, 2, i_c6f3f05f2bc614ba, nullptr, nullptr, { &s_c6f3f05f2bc614ba, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<116> b_d6a172208c9a1760 = { { 0, 0, 0, 0, 5, 0, 6, 0, 96, 23, 154, 140, 32, 114, 161, 214, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 4, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 162, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 87, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 70, 101, 97, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 24, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 3, 0, 1, 0, 164, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 3, 0, 1, 0, 172, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 3, 0, 1, 0, 180, 0, 0, 0, 2, 0, 1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 3, 0, 1, 0, 188, 0, 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 3, 0, 1, 0, 192, 0, 0, 0, 2, 0, 1, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 3, 0, 1, 0, 216, 0, 0, 0, 2, 0, 1, 0, 104, 97, 115, 84, 105, 109, 101, 115, 116, 97, 109, 112, 0, 0, 0, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 105, 109, 101, 115, 116, 97, 109, 112, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 7, 125, 66, 138, 136, 21, 213, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 97, 115, 68, 117, 114, 97, 116, 105, 111, 110, 0, 0, 0, 0, 0, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 117, 114, 97, 116, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 7, 125, 66, 138, 136, 21, 213, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 97, 98, 101, 108, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 101, 97, 116, 117, 114, 101, 86, 97, 108, 117, 101, 115, 0, 0, 0, 14, 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, 3, 0, 1, 0, 10, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, } }; ::capnp::word const* const bp_d6a172208c9a1760 = b_d6a172208c9a1760.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_d6a172208c9a1760[] = { &s_84d515888a427d07, }; static const uint16_t m_d6a172208c9a1760[] = {3, 5, 2, 0, 4, 1}; static const uint16_t i_d6a172208c9a1760[] = {0, 1, 2, 3, 4, 5}; const ::capnp::_::RawSchema s_d6a172208c9a1760 = { 0xd6a172208c9a1760, b_d6a172208c9a1760.words, 116, d_d6a172208c9a1760, m_d6a172208c9a1760, 1, 6, i_d6a172208c9a1760, nullptr, nullptr, { &s_d6a172208c9a1760, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<40> b_ffa3fccceb684869 = { { 0, 0, 0, 0, 5, 0, 6, 0, 105, 72, 104, 235, 204, 252, 163, 255, 12, 0, 0, 0, 1, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 186, 0, 0, 0, 29, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 70, 101, 97, 116, 117, 114, 101, 83, 101, 116, 0, 0, 4, 0, 0, 0, 1, 0, 1, 0, 36, 107, 49, 70, 195, 114, 37, 171, 1, 0, 0, 0, 58, 0, 0, 0, 70, 83, 80, 97, 105, 114, 0, 0, 4, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 3, 0, 1, 0, 40, 0, 0, 0, 2, 0, 1, 0, 102, 101, 97, 116, 117, 114, 101, 80, 97, 105, 114, 115, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 36, 107, 49, 70, 195, 114, 37, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_ffa3fccceb684869 = b_ffa3fccceb684869.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_ffa3fccceb684869[] = { &s_ab2572c346316b24, }; static const uint16_t m_ffa3fccceb684869[] = {0}; static const uint16_t i_ffa3fccceb684869[] = {0}; const ::capnp::_::RawSchema s_ffa3fccceb684869 = { 0xffa3fccceb684869, b_ffa3fccceb684869.words, 40, d_ffa3fccceb684869, m_ffa3fccceb684869, 1, 1, i_ffa3fccceb684869, nullptr, nullptr, { &s_ffa3fccceb684869, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<54> b_ab2572c346316b24 = { { 0, 0, 0, 0, 5, 0, 6, 0, 36, 107, 49, 70, 195, 114, 37, 171, 23, 0, 0, 0, 1, 0, 0, 0, 105, 72, 104, 235, 204, 252, 163, 255, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 242, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 70, 101, 97, 116, 117, 114, 101, 83, 101, 116, 46, 70, 83, 80, 97, 105, 114, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 72, 0, 0, 0, 2, 0, 1, 0, 111, 117, 116, 112, 117, 116, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 101, 97, 116, 117, 114, 101, 115, 0, 0, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 96, 23, 154, 140, 32, 114, 161, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, } }; ::capnp::word const* const bp_ab2572c346316b24 = b_ab2572c346316b24.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_ab2572c346316b24[] = { &s_d6a172208c9a1760, }; static const uint16_t m_ab2572c346316b24[] = {1, 0}; static const uint16_t i_ab2572c346316b24[] = {0, 1}; const ::capnp::_::RawSchema s_ab2572c346316b24 = { 0xab2572c346316b24, b_ab2572c346316b24.words, 54, d_ab2572c346316b24, m_ab2572c346316b24, 1, 2, i_ab2572c346316b24, nullptr, nullptr, { &s_ab2572c346316b24, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<49> b_fe907ebf410a65a4 = { { 0, 0, 0, 0, 5, 0, 6, 0, 164, 101, 10, 65, 191, 126, 144, 254, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 162, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 70, 114, 97, 109, 105, 110, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 3, 0, 1, 0, 52, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 3, 0, 1, 0, 60, 0, 0, 0, 2, 0, 1, 0, 98, 108, 111, 99, 107, 83, 105, 122, 101, 0, 0, 0, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 101, 112, 83, 105, 122, 101, 0, 0, 0, 0, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_fe907ebf410a65a4 = b_fe907ebf410a65a4.words; #if !CAPNP_LITE static const uint16_t m_fe907ebf410a65a4[] = {0, 1}; static const uint16_t i_fe907ebf410a65a4[] = {0, 1}; const ::capnp::_::RawSchema s_fe907ebf410a65a4 = { 0xfe907ebf410a65a4, b_fe907ebf410a65a4.words, 49, nullptr, m_fe907ebf410a65a4, 0, 2, i_fe907ebf410a65a4, nullptr, nullptr, { &s_fe907ebf410a65a4, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<88> b_db209a01f86fe045 = { { 0, 0, 0, 0, 5, 0, 6, 0, 69, 224, 111, 248, 1, 154, 32, 219, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 210, 0, 0, 0, 33, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 1, 0, 55, 221, 34, 212, 254, 86, 11, 144, 1, 0, 0, 0, 58, 0, 0, 0, 80, 86, 80, 97, 105, 114, 0, 0, 16, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 3, 0, 1, 0, 124, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 3, 0, 1, 0, 132, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 3, 0, 1, 0, 140, 0, 0, 0, 2, 0, 1, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 3, 0, 1, 0, 144, 0, 0, 0, 2, 0, 1, 0, 112, 97, 114, 97, 109, 101, 116, 101, 114, 86, 97, 108, 117, 101, 115, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 55, 221, 34, 212, 254, 86, 11, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 117, 114, 114, 101, 110, 116, 80, 114, 111, 103, 114, 97, 109, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 97, 110, 110, 101, 108, 67, 111, 117, 110, 116, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 114, 97, 109, 105, 110, 103, 0, 16, 0, 0, 0, 0, 0, 0, 0, 164, 101, 10, 65, 191, 126, 144, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_db209a01f86fe045 = b_db209a01f86fe045.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_db209a01f86fe045[] = { &s_900b56fed422dd37, &s_fe907ebf410a65a4, }; static const uint16_t m_db209a01f86fe045[] = {2, 1, 3, 0}; static const uint16_t i_db209a01f86fe045[] = {0, 1, 2, 3}; const ::capnp::_::RawSchema s_db209a01f86fe045 = { 0xdb209a01f86fe045, b_db209a01f86fe045.words, 88, d_db209a01f86fe045, m_db209a01f86fe045, 2, 4, i_db209a01f86fe045, nullptr, nullptr, { &s_db209a01f86fe045, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<50> b_900b56fed422dd37 = { { 0, 0, 0, 0, 5, 0, 6, 0, 55, 221, 34, 212, 254, 86, 11, 144, 26, 0, 0, 0, 1, 0, 1, 0, 69, 224, 111, 248, 1, 154, 32, 219, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 10, 1, 0, 0, 37, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 46, 80, 86, 80, 97, 105, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 3, 0, 1, 0, 52, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 112, 97, 114, 97, 109, 101, 116, 101, 114, 0, 0, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 97, 108, 117, 101, 0, 0, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_900b56fed422dd37 = b_900b56fed422dd37.words; #if !CAPNP_LITE static const uint16_t m_900b56fed422dd37[] = {0, 1}; static const uint16_t i_900b56fed422dd37[] = {0, 1}; const ::capnp::_::RawSchema s_900b56fed422dd37 = { 0x900b56fed422dd37, b_900b56fed422dd37.words, 50, nullptr, m_900b56fed422dd37, 0, 2, i_900b56fed422dd37, nullptr, nullptr, { &s_900b56fed422dd37, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<34> b_b5edf73eb2e79c4e = { { 0, 0, 0, 0, 5, 0, 6, 0, 78, 156, 231, 178, 62, 247, 237, 181, 12, 0, 0, 0, 2, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 194, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 65, 100, 97, 112, 116, 101, 114, 70, 108, 97, 103, 0, 0, 0, 0, 0, 1, 0, 1, 0, 12, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 97, 112, 116, 73, 110, 112, 117, 116, 68, 111, 109, 97, 105, 110, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 97, 112, 116, 67, 104, 97, 110, 110, 101, 108, 67, 111, 117, 110, 116, 0, 0, 0, 0, 0, 0, 0, 97, 100, 97, 112, 116, 66, 117, 102, 102, 101, 114, 83, 105, 122, 101, 0, } }; ::capnp::word const* const bp_b5edf73eb2e79c4e = b_b5edf73eb2e79c4e.words; #if !CAPNP_LITE static const uint16_t m_b5edf73eb2e79c4e[] = {2, 1, 0}; const ::capnp::_::RawSchema s_b5edf73eb2e79c4e = { 0xb5edf73eb2e79c4e, b_b5edf73eb2e79c4e.words, 34, nullptr, m_b5edf73eb2e79c4e, 0, 3, nullptr, nullptr, nullptr, { &s_b5edf73eb2e79c4e, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE CAPNP_DEFINE_ENUM(AdapterFlag_b5edf73eb2e79c4e, b5edf73eb2e79c4e); static const ::capnp::_::AlignedData<29> b_9ed58097be8bc6f3 = { { 0, 0, 0, 0, 5, 0, 6, 0, 243, 198, 139, 190, 151, 128, 213, 158, 12, 0, 0, 0, 4, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 202, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 97, 100, 97, 112, 116, 65, 108, 108, 83, 97, 102, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 14, 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, 3, 0, 1, 0, 15, 0, 0, 0, 0, 0, 0, 0, 78, 156, 231, 178, 62, 247, 237, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 19, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_9ed58097be8bc6f3 = b_9ed58097be8bc6f3.words; #if !CAPNP_LITE const ::capnp::_::RawSchema s_9ed58097be8bc6f3 = { 0x9ed58097be8bc6f3, b_9ed58097be8bc6f3.words, 29, nullptr, nullptr, 0, 0, nullptr, nullptr, nullptr, { &s_9ed58097be8bc6f3, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<28> b_eb49b9892c5b9b83 = { { 0, 0, 0, 0, 5, 0, 6, 0, 131, 155, 91, 44, 137, 185, 73, 235, 12, 0, 0, 0, 4, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 170, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 3, 0, 1, 0, 52, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 97, 100, 97, 112, 116, 65, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 14, 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, 3, 0, 1, 0, 15, 0, 0, 0, 0, 0, 0, 0, 78, 156, 231, 178, 62, 247, 237, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 27, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, } }; ::capnp::word const* const bp_eb49b9892c5b9b83 = b_eb49b9892c5b9b83.words; #if !CAPNP_LITE const ::capnp::_::RawSchema s_eb49b9892c5b9b83 = { 0xeb49b9892c5b9b83, b_eb49b9892c5b9b83.words, 28, nullptr, nullptr, 0, 0, nullptr, nullptr, nullptr, { &s_eb49b9892c5b9b83, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<36> b_b54ff18dabd0d4e1 = { { 0, 0, 0, 0, 5, 0, 6, 0, 225, 212, 208, 171, 141, 241, 79, 181, 12, 0, 0, 0, 1, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 194, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 76, 105, 115, 116, 82, 101, 113, 117, 101, 115, 116, 0, 0, 0, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 3, 0, 1, 0, 36, 0, 0, 0, 2, 0, 1, 0, 102, 114, 111, 109, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 12, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_b54ff18dabd0d4e1 = b_b54ff18dabd0d4e1.words; #if !CAPNP_LITE static const uint16_t m_b54ff18dabd0d4e1[] = {0}; static const uint16_t i_b54ff18dabd0d4e1[] = {0}; const ::capnp::_::RawSchema s_b54ff18dabd0d4e1 = { 0xb54ff18dabd0d4e1, b_b54ff18dabd0d4e1.words, 36, nullptr, m_b54ff18dabd0d4e1, 0, 1, i_b54ff18dabd0d4e1, nullptr, nullptr, { &s_b54ff18dabd0d4e1, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<38> b_c8b36e8e9e8d6f15 = { { 0, 0, 0, 0, 5, 0, 6, 0, 21, 111, 141, 158, 142, 110, 179, 200, 12, 0, 0, 0, 1, 0, 0, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 202, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 76, 105, 115, 116, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 3, 0, 1, 0, 40, 0, 0, 0, 2, 0, 1, 0, 97, 118, 97, 105, 108, 97, 98, 108, 101, 0, 0, 0, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 161, 202, 230, 99, 84, 200, 58, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_c8b36e8e9e8d6f15 = b_c8b36e8e9e8d6f15.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_c8b36e8e9e8d6f15[] = { &s_b83ac85463e6caa1, }; static const uint16_t m_c8b36e8e9e8d6f15[] = {0}; static const uint16_t i_c8b36e8e9e8d6f15[] = {0}; const ::capnp::_::RawSchema s_c8b36e8e9e8d6f15 = { 0xc8b36e8e9e8d6f15, b_c8b36e8e9e8d6f15.words, 38, d_c8b36e8e9e8d6f15, m_c8b36e8e9e8d6f15, 1, 1, i_c8b36e8e9e8d6f15, nullptr, nullptr, { &s_c8b36e8e9e8d6f15, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<68> b_fca0f520555d0c94 = { { 0, 0, 0, 0, 5, 0, 6, 0, 148, 12, 93, 85, 32, 245, 160, 252, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 194, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 76, 111, 97, 100, 82, 101, 113, 117, 101, 115, 116, 0, 0, 0, 0, 0, 1, 0, 1, 0, 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 3, 0, 1, 0, 76, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 3, 0, 1, 0, 84, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 3, 0, 1, 0, 108, 0, 0, 0, 2, 0, 1, 0, 107, 101, 121, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 110, 112, 117, 116, 83, 97, 109, 112, 108, 101, 82, 97, 116, 101, 0, 10, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 97, 112, 116, 101, 114, 70, 108, 97, 103, 115, 0, 0, 0, 0, 14, 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, 3, 0, 1, 0, 15, 0, 0, 0, 0, 0, 0, 0, 78, 156, 231, 178, 62, 247, 237, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_fca0f520555d0c94 = b_fca0f520555d0c94.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_fca0f520555d0c94[] = { &s_b5edf73eb2e79c4e, }; static const uint16_t m_fca0f520555d0c94[] = {2, 1, 0}; static const uint16_t i_fca0f520555d0c94[] = {0, 1, 2}; const ::capnp::_::RawSchema s_fca0f520555d0c94 = { 0xfca0f520555d0c94, b_fca0f520555d0c94.words, 68, d_fca0f520555d0c94, m_fca0f520555d0c94, 1, 3, i_fca0f520555d0c94, nullptr, nullptr, { &s_fca0f520555d0c94, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<66> b_82fb08d7f06fe81d = { { 0, 0, 0, 0, 5, 0, 6, 0, 29, 232, 111, 240, 215, 8, 251, 130, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 202, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 76, 111, 97, 100, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 3, 0, 1, 0, 76, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 3, 0, 1, 0, 84, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 3, 0, 1, 0, 96, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 97, 116, 105, 99, 68, 97, 116, 97, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 161, 202, 230, 99, 84, 200, 58, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 97, 117, 108, 116, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 69, 224, 111, 248, 1, 154, 32, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_82fb08d7f06fe81d = b_82fb08d7f06fe81d.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_82fb08d7f06fe81d[] = { &s_b83ac85463e6caa1, &s_db209a01f86fe045, }; static const uint16_t m_82fb08d7f06fe81d[] = {2, 0, 1}; static const uint16_t i_82fb08d7f06fe81d[] = {0, 1, 2}; const ::capnp::_::RawSchema s_82fb08d7f06fe81d = { 0x82fb08d7f06fe81d, b_82fb08d7f06fe81d.words, 66, d_82fb08d7f06fe81d, m_82fb08d7f06fe81d, 2, 3, i_82fb08d7f06fe81d, nullptr, nullptr, { &s_82fb08d7f06fe81d, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<50> b_fcf72b478bbe9d02 = { { 0, 0, 0, 0, 5, 0, 6, 0, 2, 157, 190, 139, 71, 43, 247, 252, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 10, 1, 0, 0, 37, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 82, 101, 113, 117, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 69, 224, 111, 248, 1, 154, 32, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_fcf72b478bbe9d02 = b_fcf72b478bbe9d02.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_fcf72b478bbe9d02[] = { &s_db209a01f86fe045, }; static const uint16_t m_fcf72b478bbe9d02[] = {1, 0}; static const uint16_t i_fcf72b478bbe9d02[] = {0, 1}; const ::capnp::_::RawSchema s_fcf72b478bbe9d02 = { 0xfcf72b478bbe9d02, b_fcf72b478bbe9d02.words, 50, d_fcf72b478bbe9d02, m_fcf72b478bbe9d02, 1, 2, i_fcf72b478bbe9d02, nullptr, nullptr, { &s_fcf72b478bbe9d02, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<68> b_c433db5864bf6d56 = { { 0, 0, 0, 0, 5, 0, 6, 0, 86, 109, 191, 100, 88, 219, 51, 196, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 18, 1, 0, 0, 37, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 3, 0, 1, 0, 76, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 3, 0, 1, 0, 96, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 3, 0, 1, 0, 100, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 117, 116, 112, 117, 116, 115, 0, 14, 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, 3, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 74, 130, 190, 225, 101, 96, 44, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 114, 97, 109, 105, 110, 103, 0, 16, 0, 0, 0, 0, 0, 0, 0, 164, 101, 10, 65, 191, 126, 144, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_c433db5864bf6d56 = b_c433db5864bf6d56.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_c433db5864bf6d56[] = { &s_902c6065e1be824a, &s_fe907ebf410a65a4, }; static const uint16_t m_c433db5864bf6d56[] = {2, 0, 1}; static const uint16_t i_c433db5864bf6d56[] = {0, 1, 2}; const ::capnp::_::RawSchema s_c433db5864bf6d56 = { 0xc433db5864bf6d56, b_c433db5864bf6d56.words, 68, d_c433db5864bf6d56, m_c433db5864bf6d56, 2, 3, i_c433db5864bf6d56, nullptr, nullptr, { &s_c433db5864bf6d56, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<49> b_ea87c8bff474ddce = { { 0, 0, 0, 0, 5, 0, 6, 0, 206, 221, 116, 244, 191, 200, 135, 234, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 218, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 80, 114, 111, 99, 101, 115, 115, 82, 101, 113, 117, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 114, 111, 99, 101, 115, 115, 73, 110, 112, 117, 116, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 186, 20, 198, 43, 95, 240, 243, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_ea87c8bff474ddce = b_ea87c8bff474ddce.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_ea87c8bff474ddce[] = { &s_c6f3f05f2bc614ba, }; static const uint16_t m_ea87c8bff474ddce[] = {0, 1}; static const uint16_t i_ea87c8bff474ddce[] = {0, 1}; const ::capnp::_::RawSchema s_ea87c8bff474ddce = { 0xea87c8bff474ddce, b_ea87c8bff474ddce.words, 49, d_ea87c8bff474ddce, m_ea87c8bff474ddce, 1, 2, i_ea87c8bff474ddce, nullptr, nullptr, { &s_ea87c8bff474ddce, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<49> b_fe801447309c2782 = { { 0, 0, 0, 0, 5, 0, 6, 0, 130, 39, 156, 48, 71, 20, 128, 254, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 226, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 80, 114, 111, 99, 101, 115, 115, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 101, 97, 116, 117, 114, 101, 115, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 105, 72, 104, 235, 204, 252, 163, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_fe801447309c2782 = b_fe801447309c2782.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_fe801447309c2782[] = { &s_ffa3fccceb684869, }; static const uint16_t m_fe801447309c2782[] = {1, 0}; static const uint16_t i_fe801447309c2782[] = {0, 1}; const ::capnp::_::RawSchema s_fe801447309c2782 = { 0xfe801447309c2782, b_fe801447309c2782.words, 49, d_fe801447309c2782, m_fe801447309c2782, 1, 2, i_fe801447309c2782, nullptr, nullptr, { &s_fe801447309c2782, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<33> b_d8c0271e01d84377 = { { 0, 0, 0, 0, 5, 0, 6, 0, 119, 67, 216, 1, 30, 39, 192, 216, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 210, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 70, 105, 110, 105, 115, 104, 82, 101, 113, 117, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 3, 0, 1, 0, 20, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_d8c0271e01d84377 = b_d8c0271e01d84377.words; #if !CAPNP_LITE static const uint16_t m_d8c0271e01d84377[] = {0}; static const uint16_t i_d8c0271e01d84377[] = {0}; const ::capnp::_::RawSchema s_d8c0271e01d84377 = { 0xd8c0271e01d84377, b_d8c0271e01d84377.words, 33, nullptr, m_d8c0271e01d84377, 0, 1, i_d8c0271e01d84377, nullptr, nullptr, { &s_d8c0271e01d84377, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<49> b_ff4c6fd2917a8eb7 = { { 0, 0, 0, 0, 5, 0, 6, 0, 183, 142, 122, 145, 210, 111, 76, 255, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 218, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 70, 105, 110, 105, 115, 104, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 3, 0, 1, 0, 56, 0, 0, 0, 2, 0, 1, 0, 104, 97, 110, 100, 108, 101, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 101, 97, 116, 117, 114, 101, 115, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 105, 72, 104, 235, 204, 252, 163, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_ff4c6fd2917a8eb7 = b_ff4c6fd2917a8eb7.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_ff4c6fd2917a8eb7[] = { &s_ffa3fccceb684869, }; static const uint16_t m_ff4c6fd2917a8eb7[] = {1, 0}; static const uint16_t i_ff4c6fd2917a8eb7[] = {0, 1}; const ::capnp::_::RawSchema s_ff4c6fd2917a8eb7 = { 0xff4c6fd2917a8eb7, b_ff4c6fd2917a8eb7.words, 49, d_ff4c6fd2917a8eb7, m_ff4c6fd2917a8eb7, 1, 2, i_ff4c6fd2917a8eb7, nullptr, nullptr, { &s_ff4c6fd2917a8eb7, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<47> b_a7e9dceb8fbd0e23 = { { 0, 0, 0, 0, 5, 0, 6, 0, 35, 14, 189, 143, 235, 220, 233, 167, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 146, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 69, 114, 114, 111, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 3, 0, 1, 0, 48, 0, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 3, 0, 1, 0, 52, 0, 0, 0, 2, 0, 1, 0, 99, 111, 100, 101, 0, 0, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 101, 115, 115, 97, 103, 101, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_a7e9dceb8fbd0e23 = b_a7e9dceb8fbd0e23.words; #if !CAPNP_LITE static const uint16_t m_a7e9dceb8fbd0e23[] = {0, 1}; static const uint16_t i_a7e9dceb8fbd0e23[] = {0, 1}; const ::capnp::_::RawSchema s_a7e9dceb8fbd0e23 = { 0xa7e9dceb8fbd0e23, b_a7e9dceb8fbd0e23.words, 47, nullptr, m_a7e9dceb8fbd0e23, 0, 2, i_a7e9dceb8fbd0e23, nullptr, nullptr, { &s_a7e9dceb8fbd0e23, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<33> b_df8b913d24f04413 = { { 0, 0, 0, 0, 5, 0, 6, 0, 19, 68, 240, 36, 61, 145, 139, 223, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 186, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 112, 99, 82, 101, 113, 117, 101, 115, 116, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 249, 194, 99, 230, 119, 47, 109, 165, 41, 0, 0, 0, 26, 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, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 58, 251, 21, 152, 157, 214, 251, 166, 17, 0, 0, 0, 66, 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, 105, 100, 0, 0, 0, 0, 0, 0, 114, 101, 113, 117, 101, 115, 116, 0, } }; ::capnp::word const* const bp_df8b913d24f04413 = b_df8b913d24f04413.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_df8b913d24f04413[] = { &s_a56d2f77e663c2f9, &s_a6fbd69d9815fb3a, }; static const uint16_t m_df8b913d24f04413[] = {0, 1}; static const uint16_t i_df8b913d24f04413[] = {0, 1}; const ::capnp::_::RawSchema s_df8b913d24f04413 = { 0xdf8b913d24f04413, b_df8b913d24f04413.words, 33, d_df8b913d24f04413, m_df8b913d24f04413, 2, 2, i_df8b913d24f04413, nullptr, nullptr, { &s_df8b913d24f04413, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<62> b_a56d2f77e663c2f9 = { { 0, 0, 0, 0, 5, 0, 6, 0, 249, 194, 99, 230, 119, 47, 109, 165, 23, 0, 0, 0, 1, 0, 1, 0, 19, 68, 240, 36, 61, 145, 139, 223, 2, 0, 7, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 112, 99, 82, 101, 113, 117, 101, 115, 116, 46, 105, 100, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 3, 0, 1, 0, 76, 0, 0, 0, 2, 0, 1, 0, 1, 0, 254, 255, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 3, 0, 1, 0, 80, 0, 0, 0, 2, 0, 1, 0, 2, 0, 253, 255, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 3, 0, 1, 0, 84, 0, 0, 0, 2, 0, 1, 0, 110, 117, 109, 98, 101, 114, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 97, 103, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 110, 101, 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, } }; ::capnp::word const* const bp_a56d2f77e663c2f9 = b_a56d2f77e663c2f9.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_a56d2f77e663c2f9[] = { &s_df8b913d24f04413, }; static const uint16_t m_a56d2f77e663c2f9[] = {2, 0, 1}; static const uint16_t i_a56d2f77e663c2f9[] = {0, 1, 2}; const ::capnp::_::RawSchema s_a56d2f77e663c2f9 = { 0xa56d2f77e663c2f9, b_a56d2f77e663c2f9.words, 62, d_a56d2f77e663c2f9, m_a56d2f77e663c2f9, 1, 3, i_a56d2f77e663c2f9, nullptr, nullptr, { &s_a56d2f77e663c2f9, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<93> b_a6fbd69d9815fb3a = { { 0, 0, 0, 0, 5, 0, 6, 0, 58, 251, 21, 152, 157, 214, 251, 166, 23, 0, 0, 0, 1, 0, 1, 0, 19, 68, 240, 36, 61, 145, 139, 223, 2, 0, 7, 0, 1, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 112, 99, 82, 101, 113, 117, 101, 115, 116, 46, 114, 101, 113, 117, 101, 115, 116, 0, 0, 20, 0, 0, 0, 3, 0, 4, 0, 0, 0, 255, 255, 1, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 3, 0, 1, 0, 132, 0, 0, 0, 2, 0, 1, 0, 1, 0, 254, 255, 1, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 3, 0, 1, 0, 136, 0, 0, 0, 2, 0, 1, 0, 2, 0, 253, 255, 1, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 3, 0, 1, 0, 144, 0, 0, 0, 2, 0, 1, 0, 3, 0, 252, 255, 1, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 3, 0, 1, 0, 148, 0, 0, 0, 2, 0, 1, 0, 4, 0, 251, 255, 1, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 3, 0, 1, 0, 152, 0, 0, 0, 2, 0, 1, 0, 108, 105, 115, 116, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 225, 212, 208, 171, 141, 241, 79, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 111, 97, 100, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 148, 12, 93, 85, 32, 245, 160, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 111, 110, 102, 105, 103, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 2, 157, 190, 139, 71, 43, 247, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 114, 111, 99, 101, 115, 115, 0, 16, 0, 0, 0, 0, 0, 0, 0, 206, 221, 116, 244, 191, 200, 135, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 105, 110, 105, 115, 104, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 119, 67, 216, 1, 30, 39, 192, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_a6fbd69d9815fb3a = b_a6fbd69d9815fb3a.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_a6fbd69d9815fb3a[] = { &s_b54ff18dabd0d4e1, &s_d8c0271e01d84377, &s_df8b913d24f04413, &s_ea87c8bff474ddce, &s_fca0f520555d0c94, &s_fcf72b478bbe9d02, }; static const uint16_t m_a6fbd69d9815fb3a[] = {2, 4, 0, 1, 3}; static const uint16_t i_a6fbd69d9815fb3a[] = {0, 1, 2, 3, 4}; const ::capnp::_::RawSchema s_a6fbd69d9815fb3a = { 0xa6fbd69d9815fb3a, b_a6fbd69d9815fb3a.words, 93, d_a6fbd69d9815fb3a, m_a6fbd69d9815fb3a, 6, 5, i_a6fbd69d9815fb3a, nullptr, nullptr, { &s_a6fbd69d9815fb3a, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<34> b_b1fd870b8c5fe885 = { { 0, 0, 0, 0, 5, 0, 6, 0, 133, 232, 95, 140, 11, 135, 253, 177, 12, 0, 0, 0, 1, 0, 1, 0, 6, 146, 153, 76, 196, 198, 177, 196, 2, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 194, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 112, 99, 82, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 219, 193, 90, 212, 174, 38, 213, 214, 41, 0, 0, 0, 26, 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, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 172, 211, 176, 133, 68, 187, 18, 173, 17, 0, 0, 0, 74, 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, 105, 100, 0, 0, 0, 0, 0, 0, 114, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_b1fd870b8c5fe885 = b_b1fd870b8c5fe885.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_b1fd870b8c5fe885[] = { &s_ad12bb4485b0d3ac, &s_d6d526aed45ac1db, }; static const uint16_t m_b1fd870b8c5fe885[] = {0, 1}; static const uint16_t i_b1fd870b8c5fe885[] = {0, 1}; const ::capnp::_::RawSchema s_b1fd870b8c5fe885 = { 0xb1fd870b8c5fe885, b_b1fd870b8c5fe885.words, 34, d_b1fd870b8c5fe885, m_b1fd870b8c5fe885, 2, 2, i_b1fd870b8c5fe885, nullptr, nullptr, { &s_b1fd870b8c5fe885, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<62> b_d6d526aed45ac1db = { { 0, 0, 0, 0, 5, 0, 6, 0, 219, 193, 90, 212, 174, 38, 213, 214, 24, 0, 0, 0, 1, 0, 1, 0, 133, 232, 95, 140, 11, 135, 253, 177, 2, 0, 7, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 112, 99, 82, 101, 115, 112, 111, 110, 115, 101, 46, 105, 100, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 3, 0, 4, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 3, 0, 1, 0, 76, 0, 0, 0, 2, 0, 1, 0, 1, 0, 254, 255, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 3, 0, 1, 0, 80, 0, 0, 0, 2, 0, 1, 0, 2, 0, 253, 255, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 3, 0, 1, 0, 84, 0, 0, 0, 2, 0, 1, 0, 110, 117, 109, 98, 101, 114, 0, 0, 4, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 97, 103, 0, 0, 0, 0, 0, 12, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 110, 101, 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, } }; ::capnp::word const* const bp_d6d526aed45ac1db = b_d6d526aed45ac1db.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_d6d526aed45ac1db[] = { &s_b1fd870b8c5fe885, }; static const uint16_t m_d6d526aed45ac1db[] = {2, 0, 1}; static const uint16_t i_d6d526aed45ac1db[] = {0, 1, 2}; const ::capnp::_::RawSchema s_d6d526aed45ac1db = { 0xd6d526aed45ac1db, b_d6d526aed45ac1db.words, 62, d_d6d526aed45ac1db, m_d6d526aed45ac1db, 1, 3, i_d6d526aed45ac1db, nullptr, nullptr, { &s_d6d526aed45ac1db, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<109> b_ad12bb4485b0d3ac = { { 0, 0, 0, 0, 5, 0, 6, 0, 172, 211, 176, 133, 68, 187, 18, 173, 24, 0, 0, 0, 1, 0, 1, 0, 133, 232, 95, 140, 11, 135, 253, 177, 2, 0, 7, 0, 1, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 87, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 105, 112, 101, 114, 46, 99, 97, 112, 110, 112, 58, 82, 112, 99, 82, 101, 115, 112, 111, 110, 115, 101, 46, 114, 101, 115, 112, 111, 110, 115, 101, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 3, 0, 4, 0, 0, 0, 255, 255, 1, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 3, 0, 1, 0, 160, 0, 0, 0, 2, 0, 1, 0, 1, 0, 254, 255, 1, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 3, 0, 1, 0, 164, 0, 0, 0, 2, 0, 1, 0, 2, 0, 253, 255, 1, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 3, 0, 1, 0, 168, 0, 0, 0, 2, 0, 1, 0, 3, 0, 252, 255, 1, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 3, 0, 1, 0, 176, 0, 0, 0, 2, 0, 1, 0, 4, 0, 251, 255, 1, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 3, 0, 1, 0, 180, 0, 0, 0, 2, 0, 1, 0, 5, 0, 250, 255, 1, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 3, 0, 1, 0, 184, 0, 0, 0, 2, 0, 1, 0, 101, 114, 114, 111, 114, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 35, 14, 189, 143, 235, 220, 233, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 105, 115, 116, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 21, 111, 141, 158, 142, 110, 179, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 111, 97, 100, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 29, 232, 111, 240, 215, 8, 251, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 111, 110, 102, 105, 103, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 86, 109, 191, 100, 88, 219, 51, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 114, 111, 99, 101, 115, 115, 0, 16, 0, 0, 0, 0, 0, 0, 0, 130, 39, 156, 48, 71, 20, 128, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 105, 110, 105, 115, 104, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 183, 142, 122, 145, 210, 111, 76, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_ad12bb4485b0d3ac = b_ad12bb4485b0d3ac.words; #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_ad12bb4485b0d3ac[] = { &s_82fb08d7f06fe81d, &s_a7e9dceb8fbd0e23, &s_b1fd870b8c5fe885, &s_c433db5864bf6d56, &s_c8b36e8e9e8d6f15, &s_fe801447309c2782, &s_ff4c6fd2917a8eb7, }; static const uint16_t m_ad12bb4485b0d3ac[] = {3, 0, 5, 1, 2, 4}; static const uint16_t i_ad12bb4485b0d3ac[] = {0, 1, 2, 3, 4, 5}; const ::capnp::_::RawSchema s_ad12bb4485b0d3ac = { 0xad12bb4485b0d3ac, b_ad12bb4485b0d3ac.words, 109, d_ad12bb4485b0d3ac, m_ad12bb4485b0d3ac, 7, 6, i_ad12bb4485b0d3ac, nullptr, nullptr, { &s_ad12bb4485b0d3ac, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE } // namespace schemas } // namespace capnp // ======================================================================================= namespace piper { // Basic constexpr uint16_t Basic::_capnpPrivate::dataWordSize; constexpr uint16_t Basic::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind Basic::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* Basic::_capnpPrivate::schema; #endif // !CAPNP_LITE // ParameterDescriptor constexpr uint16_t ParameterDescriptor::_capnpPrivate::dataWordSize; constexpr uint16_t ParameterDescriptor::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ParameterDescriptor::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ParameterDescriptor::_capnpPrivate::schema; #endif // !CAPNP_LITE // ConfiguredOutputDescriptor constexpr uint16_t ConfiguredOutputDescriptor::_capnpPrivate::dataWordSize; constexpr uint16_t ConfiguredOutputDescriptor::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ConfiguredOutputDescriptor::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ConfiguredOutputDescriptor::_capnpPrivate::schema; #endif // !CAPNP_LITE // OutputDescriptor constexpr uint16_t OutputDescriptor::_capnpPrivate::dataWordSize; constexpr uint16_t OutputDescriptor::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind OutputDescriptor::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* OutputDescriptor::_capnpPrivate::schema; #endif // !CAPNP_LITE // ExtractorStaticData constexpr uint16_t ExtractorStaticData::_capnpPrivate::dataWordSize; constexpr uint16_t ExtractorStaticData::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ExtractorStaticData::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ExtractorStaticData::_capnpPrivate::schema; #endif // !CAPNP_LITE // RealTime constexpr uint16_t RealTime::_capnpPrivate::dataWordSize; constexpr uint16_t RealTime::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RealTime::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RealTime::_capnpPrivate::schema; #endif // !CAPNP_LITE // ProcessInput constexpr uint16_t ProcessInput::_capnpPrivate::dataWordSize; constexpr uint16_t ProcessInput::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ProcessInput::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ProcessInput::_capnpPrivate::schema; #endif // !CAPNP_LITE // Feature constexpr uint16_t Feature::_capnpPrivate::dataWordSize; constexpr uint16_t Feature::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind Feature::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* Feature::_capnpPrivate::schema; #endif // !CAPNP_LITE // FeatureSet constexpr uint16_t FeatureSet::_capnpPrivate::dataWordSize; constexpr uint16_t FeatureSet::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind FeatureSet::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* FeatureSet::_capnpPrivate::schema; #endif // !CAPNP_LITE // FeatureSet::FSPair constexpr uint16_t FeatureSet::FSPair::_capnpPrivate::dataWordSize; constexpr uint16_t FeatureSet::FSPair::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind FeatureSet::FSPair::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* FeatureSet::FSPair::_capnpPrivate::schema; #endif // !CAPNP_LITE // Framing constexpr uint16_t Framing::_capnpPrivate::dataWordSize; constexpr uint16_t Framing::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind Framing::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* Framing::_capnpPrivate::schema; #endif // !CAPNP_LITE // Configuration constexpr uint16_t Configuration::_capnpPrivate::dataWordSize; constexpr uint16_t Configuration::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind Configuration::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* Configuration::_capnpPrivate::schema; #endif // !CAPNP_LITE // Configuration::PVPair constexpr uint16_t Configuration::PVPair::_capnpPrivate::dataWordSize; constexpr uint16_t Configuration::PVPair::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind Configuration::PVPair::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* Configuration::PVPair::_capnpPrivate::schema; #endif // !CAPNP_LITE const ::capnp::_::ConstList< ::piper::AdapterFlag> ADAPT_ALL_SAFE(::capnp::schemas::b_9ed58097be8bc6f3.words + 27); const ::capnp::_::ConstList< ::piper::AdapterFlag> ADAPT_ALL(::capnp::schemas::b_eb49b9892c5b9b83.words + 26); // ListRequest constexpr uint16_t ListRequest::_capnpPrivate::dataWordSize; constexpr uint16_t ListRequest::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ListRequest::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ListRequest::_capnpPrivate::schema; #endif // !CAPNP_LITE // ListResponse constexpr uint16_t ListResponse::_capnpPrivate::dataWordSize; constexpr uint16_t ListResponse::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ListResponse::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ListResponse::_capnpPrivate::schema; #endif // !CAPNP_LITE // LoadRequest constexpr uint16_t LoadRequest::_capnpPrivate::dataWordSize; constexpr uint16_t LoadRequest::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind LoadRequest::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* LoadRequest::_capnpPrivate::schema; #endif // !CAPNP_LITE // LoadResponse constexpr uint16_t LoadResponse::_capnpPrivate::dataWordSize; constexpr uint16_t LoadResponse::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind LoadResponse::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* LoadResponse::_capnpPrivate::schema; #endif // !CAPNP_LITE // ConfigurationRequest constexpr uint16_t ConfigurationRequest::_capnpPrivate::dataWordSize; constexpr uint16_t ConfigurationRequest::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ConfigurationRequest::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ConfigurationRequest::_capnpPrivate::schema; #endif // !CAPNP_LITE // ConfigurationResponse constexpr uint16_t ConfigurationResponse::_capnpPrivate::dataWordSize; constexpr uint16_t ConfigurationResponse::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ConfigurationResponse::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ConfigurationResponse::_capnpPrivate::schema; #endif // !CAPNP_LITE // ProcessRequest constexpr uint16_t ProcessRequest::_capnpPrivate::dataWordSize; constexpr uint16_t ProcessRequest::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ProcessRequest::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ProcessRequest::_capnpPrivate::schema; #endif // !CAPNP_LITE // ProcessResponse constexpr uint16_t ProcessResponse::_capnpPrivate::dataWordSize; constexpr uint16_t ProcessResponse::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind ProcessResponse::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* ProcessResponse::_capnpPrivate::schema; #endif // !CAPNP_LITE // FinishRequest constexpr uint16_t FinishRequest::_capnpPrivate::dataWordSize; constexpr uint16_t FinishRequest::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind FinishRequest::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* FinishRequest::_capnpPrivate::schema; #endif // !CAPNP_LITE // FinishResponse constexpr uint16_t FinishResponse::_capnpPrivate::dataWordSize; constexpr uint16_t FinishResponse::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind FinishResponse::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* FinishResponse::_capnpPrivate::schema; #endif // !CAPNP_LITE // Error constexpr uint16_t Error::_capnpPrivate::dataWordSize; constexpr uint16_t Error::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind Error::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* Error::_capnpPrivate::schema; #endif // !CAPNP_LITE // RpcRequest constexpr uint16_t RpcRequest::_capnpPrivate::dataWordSize; constexpr uint16_t RpcRequest::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RpcRequest::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RpcRequest::_capnpPrivate::schema; #endif // !CAPNP_LITE // RpcRequest::Id constexpr uint16_t RpcRequest::Id::_capnpPrivate::dataWordSize; constexpr uint16_t RpcRequest::Id::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RpcRequest::Id::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RpcRequest::Id::_capnpPrivate::schema; #endif // !CAPNP_LITE // RpcRequest::Request constexpr uint16_t RpcRequest::Request::_capnpPrivate::dataWordSize; constexpr uint16_t RpcRequest::Request::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RpcRequest::Request::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RpcRequest::Request::_capnpPrivate::schema; #endif // !CAPNP_LITE // RpcResponse constexpr uint16_t RpcResponse::_capnpPrivate::dataWordSize; constexpr uint16_t RpcResponse::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RpcResponse::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RpcResponse::_capnpPrivate::schema; #endif // !CAPNP_LITE // RpcResponse::Id constexpr uint16_t RpcResponse::Id::_capnpPrivate::dataWordSize; constexpr uint16_t RpcResponse::Id::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RpcResponse::Id::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RpcResponse::Id::_capnpPrivate::schema; #endif // !CAPNP_LITE // RpcResponse::Response constexpr uint16_t RpcResponse::Response::_capnpPrivate::dataWordSize; constexpr uint16_t RpcResponse::Response::_capnpPrivate::pointerCount; #if !CAPNP_LITE constexpr ::capnp::Kind RpcResponse::Response::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* RpcResponse::Response::_capnpPrivate::schema; #endif // !CAPNP_LITE } // namespace sonic-visualiser-3.0.3/piper-cpp/vamp-capnp/piper.capnp.h0000644000000000000000000076726313111512442021512 0ustar 00000000000000// Generated by Cap'n Proto compiler, DO NOT EDIT // source: piper.capnp #ifndef CAPNP_INCLUDED_c4b1c6c44c999206_ #define CAPNP_INCLUDED_c4b1c6c44c999206_ #include #if CAPNP_VERSION != 6000 #error "Version mismatch between generated code and library headers. You must use the same version of the Cap'n Proto compiler and library." #endif namespace capnp { namespace schemas { CAPNP_DECLARE_SCHEMA(b491ca63222c253f); CAPNP_DECLARE_SCHEMA(f8fda10bef70a97d); CAPNP_DECLARE_SCHEMA(eca23e4a04bdfeb2); enum class SampleType_eca23e4a04bdfeb2: uint16_t { ONE_SAMPLE_PER_STEP, FIXED_SAMPLE_RATE, VARIABLE_SAMPLE_RATE, }; CAPNP_DECLARE_ENUM(SampleType, eca23e4a04bdfeb2); CAPNP_DECLARE_SCHEMA(b2d0c825aac8249c); CAPNP_DECLARE_SCHEMA(902c6065e1be824a); CAPNP_DECLARE_SCHEMA(f50fb3b9c1bf75f4); enum class InputDomain_f50fb3b9c1bf75f4: uint16_t { TIME_DOMAIN, FREQUENCY_DOMAIN, }; CAPNP_DECLARE_ENUM(InputDomain, f50fb3b9c1bf75f4); CAPNP_DECLARE_SCHEMA(b83ac85463e6caa1); CAPNP_DECLARE_SCHEMA(84d515888a427d07); CAPNP_DECLARE_SCHEMA(c6f3f05f2bc614ba); CAPNP_DECLARE_SCHEMA(d6a172208c9a1760); CAPNP_DECLARE_SCHEMA(ffa3fccceb684869); CAPNP_DECLARE_SCHEMA(ab2572c346316b24); CAPNP_DECLARE_SCHEMA(fe907ebf410a65a4); CAPNP_DECLARE_SCHEMA(db209a01f86fe045); CAPNP_DECLARE_SCHEMA(900b56fed422dd37); CAPNP_DECLARE_SCHEMA(b5edf73eb2e79c4e); enum class AdapterFlag_b5edf73eb2e79c4e: uint16_t { ADAPT_INPUT_DOMAIN, ADAPT_CHANNEL_COUNT, ADAPT_BUFFER_SIZE, }; CAPNP_DECLARE_ENUM(AdapterFlag, b5edf73eb2e79c4e); CAPNP_DECLARE_SCHEMA(9ed58097be8bc6f3); CAPNP_DECLARE_SCHEMA(eb49b9892c5b9b83); CAPNP_DECLARE_SCHEMA(b54ff18dabd0d4e1); CAPNP_DECLARE_SCHEMA(c8b36e8e9e8d6f15); CAPNP_DECLARE_SCHEMA(fca0f520555d0c94); CAPNP_DECLARE_SCHEMA(82fb08d7f06fe81d); CAPNP_DECLARE_SCHEMA(fcf72b478bbe9d02); CAPNP_DECLARE_SCHEMA(c433db5864bf6d56); CAPNP_DECLARE_SCHEMA(ea87c8bff474ddce); CAPNP_DECLARE_SCHEMA(fe801447309c2782); CAPNP_DECLARE_SCHEMA(d8c0271e01d84377); CAPNP_DECLARE_SCHEMA(ff4c6fd2917a8eb7); CAPNP_DECLARE_SCHEMA(a7e9dceb8fbd0e23); CAPNP_DECLARE_SCHEMA(df8b913d24f04413); CAPNP_DECLARE_SCHEMA(a56d2f77e663c2f9); CAPNP_DECLARE_SCHEMA(a6fbd69d9815fb3a); CAPNP_DECLARE_SCHEMA(b1fd870b8c5fe885); CAPNP_DECLARE_SCHEMA(d6d526aed45ac1db); CAPNP_DECLARE_SCHEMA(ad12bb4485b0d3ac); } // namespace schemas } // namespace capnp namespace piper { struct Basic { Basic() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(b491ca63222c253f, 0, 3) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ParameterDescriptor { ParameterDescriptor() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(f8fda10bef70a97d, 3, 3) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; typedef ::capnp::schemas::SampleType_eca23e4a04bdfeb2 SampleType; struct ConfiguredOutputDescriptor { ConfiguredOutputDescriptor() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(b2d0c825aac8249c, 3, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct OutputDescriptor { OutputDescriptor() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(902c6065e1be824a, 0, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; typedef ::capnp::schemas::InputDomain_f50fb3b9c1bf75f4 InputDomain; struct ExtractorStaticData { ExtractorStaticData() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(b83ac85463e6caa1, 2, 8) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RealTime { RealTime() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(84d515888a427d07, 1, 0) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ProcessInput { ProcessInput() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(c6f3f05f2bc614ba, 0, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct Feature { Feature() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(d6a172208c9a1760, 1, 4) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct FeatureSet { FeatureSet() = delete; class Reader; class Builder; class Pipeline; struct FSPair; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(ffa3fccceb684869, 0, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct FeatureSet::FSPair { FSPair() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(ab2572c346316b24, 0, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct Framing { Framing() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(fe907ebf410a65a4, 1, 0) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct Configuration { Configuration() = delete; class Reader; class Builder; class Pipeline; struct PVPair; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(db209a01f86fe045, 1, 3) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct Configuration::PVPair { PVPair() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(900b56fed422dd37, 1, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; typedef ::capnp::schemas::AdapterFlag_b5edf73eb2e79c4e AdapterFlag; extern const ::capnp::_::ConstList< ::piper::AdapterFlag> ADAPT_ALL_SAFE; extern const ::capnp::_::ConstList< ::piper::AdapterFlag> ADAPT_ALL; struct ListRequest { ListRequest() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(b54ff18dabd0d4e1, 0, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ListResponse { ListResponse() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(c8b36e8e9e8d6f15, 0, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct LoadRequest { LoadRequest() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(fca0f520555d0c94, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct LoadResponse { LoadResponse() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(82fb08d7f06fe81d, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ConfigurationRequest { ConfigurationRequest() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(fcf72b478bbe9d02, 1, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ConfigurationResponse { ConfigurationResponse() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(c433db5864bf6d56, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ProcessRequest { ProcessRequest() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(ea87c8bff474ddce, 1, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct ProcessResponse { ProcessResponse() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(fe801447309c2782, 1, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct FinishRequest { FinishRequest() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(d8c0271e01d84377, 1, 0) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct FinishResponse { FinishResponse() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(ff4c6fd2917a8eb7, 1, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct Error { Error() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(a7e9dceb8fbd0e23, 1, 1) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RpcRequest { RpcRequest() = delete; class Reader; class Builder; class Pipeline; struct Id; struct Request; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(df8b913d24f04413, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RpcRequest::Id { Id() = delete; class Reader; class Builder; class Pipeline; enum Which: uint16_t { NUMBER, TAG, NONE, }; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(a56d2f77e663c2f9, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RpcRequest::Request { Request() = delete; class Reader; class Builder; class Pipeline; enum Which: uint16_t { LIST, LOAD, CONFIGURE, PROCESS, FINISH, }; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(a6fbd69d9815fb3a, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RpcResponse { RpcResponse() = delete; class Reader; class Builder; class Pipeline; struct Id; struct Response; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(b1fd870b8c5fe885, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RpcResponse::Id { Id() = delete; class Reader; class Builder; class Pipeline; enum Which: uint16_t { NUMBER, TAG, NONE, }; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(d6d526aed45ac1db, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; struct RpcResponse::Response { Response() = delete; class Reader; class Builder; class Pipeline; enum Which: uint16_t { ERROR, LIST, LOAD, CONFIGURE, PROCESS, FINISH, }; struct _capnpPrivate { CAPNP_DECLARE_STRUCT_HEADER(ad12bb4485b0d3ac, 1, 2) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE }; }; // ======================================================================================= class Basic::Reader { public: typedef Basic Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasIdentifier() const; inline ::capnp::Text::Reader getIdentifier() const; inline bool hasName() const; inline ::capnp::Text::Reader getName() const; inline bool hasDescription() const; inline ::capnp::Text::Reader getDescription() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class Basic::Builder { public: typedef Basic Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasIdentifier(); inline ::capnp::Text::Builder getIdentifier(); inline void setIdentifier( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initIdentifier(unsigned int size); inline void adoptIdentifier(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownIdentifier(); inline bool hasName(); inline ::capnp::Text::Builder getName(); inline void setName( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initName(unsigned int size); inline void adoptName(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownName(); inline bool hasDescription(); inline ::capnp::Text::Builder getDescription(); inline void setDescription( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initDescription(unsigned int size); inline void adoptDescription(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownDescription(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class Basic::Pipeline { public: typedef Basic Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ParameterDescriptor::Reader { public: typedef ParameterDescriptor Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasBasic() const; inline ::piper::Basic::Reader getBasic() const; inline bool hasUnit() const; inline ::capnp::Text::Reader getUnit() const; inline float getMinValue() const; inline float getMaxValue() const; inline float getDefaultValue() const; inline bool getIsQuantized() const; inline float getQuantizeStep() const; inline bool hasValueNames() const; inline ::capnp::List< ::capnp::Text>::Reader getValueNames() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ParameterDescriptor::Builder { public: typedef ParameterDescriptor Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasBasic(); inline ::piper::Basic::Builder getBasic(); inline void setBasic( ::piper::Basic::Reader value); inline ::piper::Basic::Builder initBasic(); inline void adoptBasic(::capnp::Orphan< ::piper::Basic>&& value); inline ::capnp::Orphan< ::piper::Basic> disownBasic(); inline bool hasUnit(); inline ::capnp::Text::Builder getUnit(); inline void setUnit( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initUnit(unsigned int size); inline void adoptUnit(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownUnit(); inline float getMinValue(); inline void setMinValue(float value); inline float getMaxValue(); inline void setMaxValue(float value); inline float getDefaultValue(); inline void setDefaultValue(float value); inline bool getIsQuantized(); inline void setIsQuantized(bool value); inline float getQuantizeStep(); inline void setQuantizeStep(float value); inline bool hasValueNames(); inline ::capnp::List< ::capnp::Text>::Builder getValueNames(); inline void setValueNames( ::capnp::List< ::capnp::Text>::Reader value); inline void setValueNames(::kj::ArrayPtr value); inline ::capnp::List< ::capnp::Text>::Builder initValueNames(unsigned int size); inline void adoptValueNames(::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value); inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> disownValueNames(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ParameterDescriptor::Pipeline { public: typedef ParameterDescriptor Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::Basic::Pipeline getBasic(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ConfiguredOutputDescriptor::Reader { public: typedef ConfiguredOutputDescriptor Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasUnit() const; inline ::capnp::Text::Reader getUnit() const; inline bool getHasFixedBinCount() const; inline ::int32_t getBinCount() const; inline bool hasBinNames() const; inline ::capnp::List< ::capnp::Text>::Reader getBinNames() const; inline bool getHasKnownExtents() const; inline float getMinValue() const; inline float getMaxValue() const; inline bool getIsQuantized() const; inline float getQuantizeStep() const; inline ::piper::SampleType getSampleType() const; inline float getSampleRate() const; inline bool getHasDuration() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ConfiguredOutputDescriptor::Builder { public: typedef ConfiguredOutputDescriptor Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasUnit(); inline ::capnp::Text::Builder getUnit(); inline void setUnit( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initUnit(unsigned int size); inline void adoptUnit(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownUnit(); inline bool getHasFixedBinCount(); inline void setHasFixedBinCount(bool value); inline ::int32_t getBinCount(); inline void setBinCount( ::int32_t value); inline bool hasBinNames(); inline ::capnp::List< ::capnp::Text>::Builder getBinNames(); inline void setBinNames( ::capnp::List< ::capnp::Text>::Reader value); inline void setBinNames(::kj::ArrayPtr value); inline ::capnp::List< ::capnp::Text>::Builder initBinNames(unsigned int size); inline void adoptBinNames(::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value); inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> disownBinNames(); inline bool getHasKnownExtents(); inline void setHasKnownExtents(bool value); inline float getMinValue(); inline void setMinValue(float value); inline float getMaxValue(); inline void setMaxValue(float value); inline bool getIsQuantized(); inline void setIsQuantized(bool value); inline float getQuantizeStep(); inline void setQuantizeStep(float value); inline ::piper::SampleType getSampleType(); inline void setSampleType( ::piper::SampleType value); inline float getSampleRate(); inline void setSampleRate(float value); inline bool getHasDuration(); inline void setHasDuration(bool value); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ConfiguredOutputDescriptor::Pipeline { public: typedef ConfiguredOutputDescriptor Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class OutputDescriptor::Reader { public: typedef OutputDescriptor Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasBasic() const; inline ::piper::Basic::Reader getBasic() const; inline bool hasConfigured() const; inline ::piper::ConfiguredOutputDescriptor::Reader getConfigured() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class OutputDescriptor::Builder { public: typedef OutputDescriptor Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasBasic(); inline ::piper::Basic::Builder getBasic(); inline void setBasic( ::piper::Basic::Reader value); inline ::piper::Basic::Builder initBasic(); inline void adoptBasic(::capnp::Orphan< ::piper::Basic>&& value); inline ::capnp::Orphan< ::piper::Basic> disownBasic(); inline bool hasConfigured(); inline ::piper::ConfiguredOutputDescriptor::Builder getConfigured(); inline void setConfigured( ::piper::ConfiguredOutputDescriptor::Reader value); inline ::piper::ConfiguredOutputDescriptor::Builder initConfigured(); inline void adoptConfigured(::capnp::Orphan< ::piper::ConfiguredOutputDescriptor>&& value); inline ::capnp::Orphan< ::piper::ConfiguredOutputDescriptor> disownConfigured(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class OutputDescriptor::Pipeline { public: typedef OutputDescriptor Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::Basic::Pipeline getBasic(); inline ::piper::ConfiguredOutputDescriptor::Pipeline getConfigured(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ExtractorStaticData::Reader { public: typedef ExtractorStaticData Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasKey() const; inline ::capnp::Text::Reader getKey() const; inline bool hasBasic() const; inline ::piper::Basic::Reader getBasic() const; inline bool hasMaker() const; inline ::capnp::Text::Reader getMaker() const; inline bool hasRights() const; inline ::capnp::Text::Reader getRights() const; inline ::int32_t getVersion() const; inline bool hasCategory() const; inline ::capnp::List< ::capnp::Text>::Reader getCategory() const; inline ::int32_t getMinChannelCount() const; inline ::int32_t getMaxChannelCount() const; inline bool hasParameters() const; inline ::capnp::List< ::piper::ParameterDescriptor>::Reader getParameters() const; inline bool hasPrograms() const; inline ::capnp::List< ::capnp::Text>::Reader getPrograms() const; inline ::piper::InputDomain getInputDomain() const; inline bool hasBasicOutputInfo() const; inline ::capnp::List< ::piper::Basic>::Reader getBasicOutputInfo() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ExtractorStaticData::Builder { public: typedef ExtractorStaticData Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasKey(); inline ::capnp::Text::Builder getKey(); inline void setKey( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initKey(unsigned int size); inline void adoptKey(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownKey(); inline bool hasBasic(); inline ::piper::Basic::Builder getBasic(); inline void setBasic( ::piper::Basic::Reader value); inline ::piper::Basic::Builder initBasic(); inline void adoptBasic(::capnp::Orphan< ::piper::Basic>&& value); inline ::capnp::Orphan< ::piper::Basic> disownBasic(); inline bool hasMaker(); inline ::capnp::Text::Builder getMaker(); inline void setMaker( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initMaker(unsigned int size); inline void adoptMaker(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownMaker(); inline bool hasRights(); inline ::capnp::Text::Builder getRights(); inline void setRights( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initRights(unsigned int size); inline void adoptRights(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownRights(); inline ::int32_t getVersion(); inline void setVersion( ::int32_t value); inline bool hasCategory(); inline ::capnp::List< ::capnp::Text>::Builder getCategory(); inline void setCategory( ::capnp::List< ::capnp::Text>::Reader value); inline void setCategory(::kj::ArrayPtr value); inline ::capnp::List< ::capnp::Text>::Builder initCategory(unsigned int size); inline void adoptCategory(::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value); inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> disownCategory(); inline ::int32_t getMinChannelCount(); inline void setMinChannelCount( ::int32_t value); inline ::int32_t getMaxChannelCount(); inline void setMaxChannelCount( ::int32_t value); inline bool hasParameters(); inline ::capnp::List< ::piper::ParameterDescriptor>::Builder getParameters(); inline void setParameters( ::capnp::List< ::piper::ParameterDescriptor>::Reader value); inline ::capnp::List< ::piper::ParameterDescriptor>::Builder initParameters(unsigned int size); inline void adoptParameters(::capnp::Orphan< ::capnp::List< ::piper::ParameterDescriptor>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::ParameterDescriptor>> disownParameters(); inline bool hasPrograms(); inline ::capnp::List< ::capnp::Text>::Builder getPrograms(); inline void setPrograms( ::capnp::List< ::capnp::Text>::Reader value); inline void setPrograms(::kj::ArrayPtr value); inline ::capnp::List< ::capnp::Text>::Builder initPrograms(unsigned int size); inline void adoptPrograms(::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value); inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> disownPrograms(); inline ::piper::InputDomain getInputDomain(); inline void setInputDomain( ::piper::InputDomain value); inline bool hasBasicOutputInfo(); inline ::capnp::List< ::piper::Basic>::Builder getBasicOutputInfo(); inline void setBasicOutputInfo( ::capnp::List< ::piper::Basic>::Reader value); inline ::capnp::List< ::piper::Basic>::Builder initBasicOutputInfo(unsigned int size); inline void adoptBasicOutputInfo(::capnp::Orphan< ::capnp::List< ::piper::Basic>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::Basic>> disownBasicOutputInfo(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ExtractorStaticData::Pipeline { public: typedef ExtractorStaticData Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::Basic::Pipeline getBasic(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RealTime::Reader { public: typedef RealTime Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getSec() const; inline ::int32_t getNsec() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RealTime::Builder { public: typedef RealTime Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getSec(); inline void setSec( ::int32_t value); inline ::int32_t getNsec(); inline void setNsec( ::int32_t value); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RealTime::Pipeline { public: typedef RealTime Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ProcessInput::Reader { public: typedef ProcessInput Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasInputBuffers() const; inline ::capnp::List< ::capnp::List>::Reader getInputBuffers() const; inline bool hasTimestamp() const; inline ::piper::RealTime::Reader getTimestamp() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ProcessInput::Builder { public: typedef ProcessInput Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasInputBuffers(); inline ::capnp::List< ::capnp::List>::Builder getInputBuffers(); inline void setInputBuffers( ::capnp::List< ::capnp::List>::Reader value); inline void setInputBuffers(::kj::ArrayPtr::Reader> value); inline ::capnp::List< ::capnp::List>::Builder initInputBuffers(unsigned int size); inline void adoptInputBuffers(::capnp::Orphan< ::capnp::List< ::capnp::List>>&& value); inline ::capnp::Orphan< ::capnp::List< ::capnp::List>> disownInputBuffers(); inline bool hasTimestamp(); inline ::piper::RealTime::Builder getTimestamp(); inline void setTimestamp( ::piper::RealTime::Reader value); inline ::piper::RealTime::Builder initTimestamp(); inline void adoptTimestamp(::capnp::Orphan< ::piper::RealTime>&& value); inline ::capnp::Orphan< ::piper::RealTime> disownTimestamp(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ProcessInput::Pipeline { public: typedef ProcessInput Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::RealTime::Pipeline getTimestamp(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class Feature::Reader { public: typedef Feature Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool getHasTimestamp() const; inline bool hasTimestamp() const; inline ::piper::RealTime::Reader getTimestamp() const; inline bool getHasDuration() const; inline bool hasDuration() const; inline ::piper::RealTime::Reader getDuration() const; inline bool hasLabel() const; inline ::capnp::Text::Reader getLabel() const; inline bool hasFeatureValues() const; inline ::capnp::List::Reader getFeatureValues() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class Feature::Builder { public: typedef Feature Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool getHasTimestamp(); inline void setHasTimestamp(bool value); inline bool hasTimestamp(); inline ::piper::RealTime::Builder getTimestamp(); inline void setTimestamp( ::piper::RealTime::Reader value); inline ::piper::RealTime::Builder initTimestamp(); inline void adoptTimestamp(::capnp::Orphan< ::piper::RealTime>&& value); inline ::capnp::Orphan< ::piper::RealTime> disownTimestamp(); inline bool getHasDuration(); inline void setHasDuration(bool value); inline bool hasDuration(); inline ::piper::RealTime::Builder getDuration(); inline void setDuration( ::piper::RealTime::Reader value); inline ::piper::RealTime::Builder initDuration(); inline void adoptDuration(::capnp::Orphan< ::piper::RealTime>&& value); inline ::capnp::Orphan< ::piper::RealTime> disownDuration(); inline bool hasLabel(); inline ::capnp::Text::Builder getLabel(); inline void setLabel( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initLabel(unsigned int size); inline void adoptLabel(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownLabel(); inline bool hasFeatureValues(); inline ::capnp::List::Builder getFeatureValues(); inline void setFeatureValues( ::capnp::List::Reader value); inline void setFeatureValues(::kj::ArrayPtr value); inline ::capnp::List::Builder initFeatureValues(unsigned int size); inline void adoptFeatureValues(::capnp::Orphan< ::capnp::List>&& value); inline ::capnp::Orphan< ::capnp::List> disownFeatureValues(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class Feature::Pipeline { public: typedef Feature Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::RealTime::Pipeline getTimestamp(); inline ::piper::RealTime::Pipeline getDuration(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class FeatureSet::Reader { public: typedef FeatureSet Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasFeaturePairs() const; inline ::capnp::List< ::piper::FeatureSet::FSPair>::Reader getFeaturePairs() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class FeatureSet::Builder { public: typedef FeatureSet Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasFeaturePairs(); inline ::capnp::List< ::piper::FeatureSet::FSPair>::Builder getFeaturePairs(); inline void setFeaturePairs( ::capnp::List< ::piper::FeatureSet::FSPair>::Reader value); inline ::capnp::List< ::piper::FeatureSet::FSPair>::Builder initFeaturePairs(unsigned int size); inline void adoptFeaturePairs(::capnp::Orphan< ::capnp::List< ::piper::FeatureSet::FSPair>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::FeatureSet::FSPair>> disownFeaturePairs(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class FeatureSet::Pipeline { public: typedef FeatureSet Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class FeatureSet::FSPair::Reader { public: typedef FSPair Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasOutput() const; inline ::capnp::Text::Reader getOutput() const; inline bool hasFeatures() const; inline ::capnp::List< ::piper::Feature>::Reader getFeatures() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class FeatureSet::FSPair::Builder { public: typedef FSPair Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasOutput(); inline ::capnp::Text::Builder getOutput(); inline void setOutput( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initOutput(unsigned int size); inline void adoptOutput(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownOutput(); inline bool hasFeatures(); inline ::capnp::List< ::piper::Feature>::Builder getFeatures(); inline void setFeatures( ::capnp::List< ::piper::Feature>::Reader value); inline ::capnp::List< ::piper::Feature>::Builder initFeatures(unsigned int size); inline void adoptFeatures(::capnp::Orphan< ::capnp::List< ::piper::Feature>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::Feature>> disownFeatures(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class FeatureSet::FSPair::Pipeline { public: typedef FSPair Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class Framing::Reader { public: typedef Framing Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getBlockSize() const; inline ::int32_t getStepSize() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class Framing::Builder { public: typedef Framing Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getBlockSize(); inline void setBlockSize( ::int32_t value); inline ::int32_t getStepSize(); inline void setStepSize( ::int32_t value); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class Framing::Pipeline { public: typedef Framing Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class Configuration::Reader { public: typedef Configuration Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasParameterValues() const; inline ::capnp::List< ::piper::Configuration::PVPair>::Reader getParameterValues() const; inline bool hasCurrentProgram() const; inline ::capnp::Text::Reader getCurrentProgram() const; inline ::int32_t getChannelCount() const; inline bool hasFraming() const; inline ::piper::Framing::Reader getFraming() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class Configuration::Builder { public: typedef Configuration Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasParameterValues(); inline ::capnp::List< ::piper::Configuration::PVPair>::Builder getParameterValues(); inline void setParameterValues( ::capnp::List< ::piper::Configuration::PVPair>::Reader value); inline ::capnp::List< ::piper::Configuration::PVPair>::Builder initParameterValues(unsigned int size); inline void adoptParameterValues(::capnp::Orphan< ::capnp::List< ::piper::Configuration::PVPair>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::Configuration::PVPair>> disownParameterValues(); inline bool hasCurrentProgram(); inline ::capnp::Text::Builder getCurrentProgram(); inline void setCurrentProgram( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initCurrentProgram(unsigned int size); inline void adoptCurrentProgram(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownCurrentProgram(); inline ::int32_t getChannelCount(); inline void setChannelCount( ::int32_t value); inline bool hasFraming(); inline ::piper::Framing::Builder getFraming(); inline void setFraming( ::piper::Framing::Reader value); inline ::piper::Framing::Builder initFraming(); inline void adoptFraming(::capnp::Orphan< ::piper::Framing>&& value); inline ::capnp::Orphan< ::piper::Framing> disownFraming(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class Configuration::Pipeline { public: typedef Configuration Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::Framing::Pipeline getFraming(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class Configuration::PVPair::Reader { public: typedef PVPair Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasParameter() const; inline ::capnp::Text::Reader getParameter() const; inline float getValue() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class Configuration::PVPair::Builder { public: typedef PVPair Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasParameter(); inline ::capnp::Text::Builder getParameter(); inline void setParameter( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initParameter(unsigned int size); inline void adoptParameter(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownParameter(); inline float getValue(); inline void setValue(float value); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class Configuration::PVPair::Pipeline { public: typedef PVPair Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ListRequest::Reader { public: typedef ListRequest Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasFrom() const; inline ::capnp::List< ::capnp::Text>::Reader getFrom() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ListRequest::Builder { public: typedef ListRequest Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasFrom(); inline ::capnp::List< ::capnp::Text>::Builder getFrom(); inline void setFrom( ::capnp::List< ::capnp::Text>::Reader value); inline void setFrom(::kj::ArrayPtr value); inline ::capnp::List< ::capnp::Text>::Builder initFrom(unsigned int size); inline void adoptFrom(::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value); inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> disownFrom(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ListRequest::Pipeline { public: typedef ListRequest Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ListResponse::Reader { public: typedef ListResponse Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasAvailable() const; inline ::capnp::List< ::piper::ExtractorStaticData>::Reader getAvailable() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ListResponse::Builder { public: typedef ListResponse Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasAvailable(); inline ::capnp::List< ::piper::ExtractorStaticData>::Builder getAvailable(); inline void setAvailable( ::capnp::List< ::piper::ExtractorStaticData>::Reader value); inline ::capnp::List< ::piper::ExtractorStaticData>::Builder initAvailable(unsigned int size); inline void adoptAvailable(::capnp::Orphan< ::capnp::List< ::piper::ExtractorStaticData>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::ExtractorStaticData>> disownAvailable(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ListResponse::Pipeline { public: typedef ListResponse Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class LoadRequest::Reader { public: typedef LoadRequest Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline bool hasKey() const; inline ::capnp::Text::Reader getKey() const; inline float getInputSampleRate() const; inline bool hasAdapterFlags() const; inline ::capnp::List< ::piper::AdapterFlag>::Reader getAdapterFlags() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class LoadRequest::Builder { public: typedef LoadRequest Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline bool hasKey(); inline ::capnp::Text::Builder getKey(); inline void setKey( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initKey(unsigned int size); inline void adoptKey(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownKey(); inline float getInputSampleRate(); inline void setInputSampleRate(float value); inline bool hasAdapterFlags(); inline ::capnp::List< ::piper::AdapterFlag>::Builder getAdapterFlags(); inline void setAdapterFlags( ::capnp::List< ::piper::AdapterFlag>::Reader value); inline void setAdapterFlags(::kj::ArrayPtr value); inline ::capnp::List< ::piper::AdapterFlag>::Builder initAdapterFlags(unsigned int size); inline void adoptAdapterFlags(::capnp::Orphan< ::capnp::List< ::piper::AdapterFlag>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::AdapterFlag>> disownAdapterFlags(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class LoadRequest::Pipeline { public: typedef LoadRequest Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class LoadResponse::Reader { public: typedef LoadResponse Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; inline bool hasStaticData() const; inline ::piper::ExtractorStaticData::Reader getStaticData() const; inline bool hasDefaultConfiguration() const; inline ::piper::Configuration::Reader getDefaultConfiguration() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class LoadResponse::Builder { public: typedef LoadResponse Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); inline bool hasStaticData(); inline ::piper::ExtractorStaticData::Builder getStaticData(); inline void setStaticData( ::piper::ExtractorStaticData::Reader value); inline ::piper::ExtractorStaticData::Builder initStaticData(); inline void adoptStaticData(::capnp::Orphan< ::piper::ExtractorStaticData>&& value); inline ::capnp::Orphan< ::piper::ExtractorStaticData> disownStaticData(); inline bool hasDefaultConfiguration(); inline ::piper::Configuration::Builder getDefaultConfiguration(); inline void setDefaultConfiguration( ::piper::Configuration::Reader value); inline ::piper::Configuration::Builder initDefaultConfiguration(); inline void adoptDefaultConfiguration(::capnp::Orphan< ::piper::Configuration>&& value); inline ::capnp::Orphan< ::piper::Configuration> disownDefaultConfiguration(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class LoadResponse::Pipeline { public: typedef LoadResponse Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::ExtractorStaticData::Pipeline getStaticData(); inline ::piper::Configuration::Pipeline getDefaultConfiguration(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ConfigurationRequest::Reader { public: typedef ConfigurationRequest Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; inline bool hasConfiguration() const; inline ::piper::Configuration::Reader getConfiguration() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ConfigurationRequest::Builder { public: typedef ConfigurationRequest Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); inline bool hasConfiguration(); inline ::piper::Configuration::Builder getConfiguration(); inline void setConfiguration( ::piper::Configuration::Reader value); inline ::piper::Configuration::Builder initConfiguration(); inline void adoptConfiguration(::capnp::Orphan< ::piper::Configuration>&& value); inline ::capnp::Orphan< ::piper::Configuration> disownConfiguration(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ConfigurationRequest::Pipeline { public: typedef ConfigurationRequest Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::Configuration::Pipeline getConfiguration(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ConfigurationResponse::Reader { public: typedef ConfigurationResponse Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; inline bool hasOutputs() const; inline ::capnp::List< ::piper::OutputDescriptor>::Reader getOutputs() const; inline bool hasFraming() const; inline ::piper::Framing::Reader getFraming() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ConfigurationResponse::Builder { public: typedef ConfigurationResponse Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); inline bool hasOutputs(); inline ::capnp::List< ::piper::OutputDescriptor>::Builder getOutputs(); inline void setOutputs( ::capnp::List< ::piper::OutputDescriptor>::Reader value); inline ::capnp::List< ::piper::OutputDescriptor>::Builder initOutputs(unsigned int size); inline void adoptOutputs(::capnp::Orphan< ::capnp::List< ::piper::OutputDescriptor>>&& value); inline ::capnp::Orphan< ::capnp::List< ::piper::OutputDescriptor>> disownOutputs(); inline bool hasFraming(); inline ::piper::Framing::Builder getFraming(); inline void setFraming( ::piper::Framing::Reader value); inline ::piper::Framing::Builder initFraming(); inline void adoptFraming(::capnp::Orphan< ::piper::Framing>&& value); inline ::capnp::Orphan< ::piper::Framing> disownFraming(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ConfigurationResponse::Pipeline { public: typedef ConfigurationResponse Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::Framing::Pipeline getFraming(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ProcessRequest::Reader { public: typedef ProcessRequest Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; inline bool hasProcessInput() const; inline ::piper::ProcessInput::Reader getProcessInput() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ProcessRequest::Builder { public: typedef ProcessRequest Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); inline bool hasProcessInput(); inline ::piper::ProcessInput::Builder getProcessInput(); inline void setProcessInput( ::piper::ProcessInput::Reader value); inline ::piper::ProcessInput::Builder initProcessInput(); inline void adoptProcessInput(::capnp::Orphan< ::piper::ProcessInput>&& value); inline ::capnp::Orphan< ::piper::ProcessInput> disownProcessInput(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ProcessRequest::Pipeline { public: typedef ProcessRequest Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::ProcessInput::Pipeline getProcessInput(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class ProcessResponse::Reader { public: typedef ProcessResponse Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; inline bool hasFeatures() const; inline ::piper::FeatureSet::Reader getFeatures() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class ProcessResponse::Builder { public: typedef ProcessResponse Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); inline bool hasFeatures(); inline ::piper::FeatureSet::Builder getFeatures(); inline void setFeatures( ::piper::FeatureSet::Reader value); inline ::piper::FeatureSet::Builder initFeatures(); inline void adoptFeatures(::capnp::Orphan< ::piper::FeatureSet>&& value); inline ::capnp::Orphan< ::piper::FeatureSet> disownFeatures(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class ProcessResponse::Pipeline { public: typedef ProcessResponse Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::FeatureSet::Pipeline getFeatures(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class FinishRequest::Reader { public: typedef FinishRequest Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class FinishRequest::Builder { public: typedef FinishRequest Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class FinishRequest::Pipeline { public: typedef FinishRequest Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class FinishResponse::Reader { public: typedef FinishResponse Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getHandle() const; inline bool hasFeatures() const; inline ::piper::FeatureSet::Reader getFeatures() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class FinishResponse::Builder { public: typedef FinishResponse Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getHandle(); inline void setHandle( ::int32_t value); inline bool hasFeatures(); inline ::piper::FeatureSet::Builder getFeatures(); inline void setFeatures( ::piper::FeatureSet::Reader value); inline ::piper::FeatureSet::Builder initFeatures(); inline void adoptFeatures(::capnp::Orphan< ::piper::FeatureSet>&& value); inline ::capnp::Orphan< ::piper::FeatureSet> disownFeatures(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class FinishResponse::Pipeline { public: typedef FinishResponse Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline ::piper::FeatureSet::Pipeline getFeatures(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class Error::Reader { public: typedef Error Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline ::int32_t getCode() const; inline bool hasMessage() const; inline ::capnp::Text::Reader getMessage() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class Error::Builder { public: typedef Error Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline ::int32_t getCode(); inline void setCode( ::int32_t value); inline bool hasMessage(); inline ::capnp::Text::Builder getMessage(); inline void setMessage( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initMessage(unsigned int size); inline void adoptMessage(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownMessage(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class Error::Pipeline { public: typedef Error Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RpcRequest::Reader { public: typedef RpcRequest Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline typename Id::Reader getId() const; inline typename Request::Reader getRequest() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RpcRequest::Builder { public: typedef RpcRequest Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline typename Id::Builder getId(); inline typename Id::Builder initId(); inline typename Request::Builder getRequest(); inline typename Request::Builder initRequest(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RpcRequest::Pipeline { public: typedef RpcRequest Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline typename Id::Pipeline getId(); inline typename Request::Pipeline getRequest(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RpcRequest::Id::Reader { public: typedef Id Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline Which which() const; inline bool isNumber() const; inline ::int32_t getNumber() const; inline bool isTag() const; inline bool hasTag() const; inline ::capnp::Text::Reader getTag() const; inline bool isNone() const; inline ::capnp::Void getNone() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RpcRequest::Id::Builder { public: typedef Id Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline Which which(); inline bool isNumber(); inline ::int32_t getNumber(); inline void setNumber( ::int32_t value); inline bool isTag(); inline bool hasTag(); inline ::capnp::Text::Builder getTag(); inline void setTag( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initTag(unsigned int size); inline void adoptTag(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownTag(); inline bool isNone(); inline ::capnp::Void getNone(); inline void setNone( ::capnp::Void value = ::capnp::VOID); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RpcRequest::Id::Pipeline { public: typedef Id Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RpcRequest::Request::Reader { public: typedef Request Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline Which which() const; inline bool isList() const; inline bool hasList() const; inline ::piper::ListRequest::Reader getList() const; inline bool isLoad() const; inline bool hasLoad() const; inline ::piper::LoadRequest::Reader getLoad() const; inline bool isConfigure() const; inline bool hasConfigure() const; inline ::piper::ConfigurationRequest::Reader getConfigure() const; inline bool isProcess() const; inline bool hasProcess() const; inline ::piper::ProcessRequest::Reader getProcess() const; inline bool isFinish() const; inline bool hasFinish() const; inline ::piper::FinishRequest::Reader getFinish() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RpcRequest::Request::Builder { public: typedef Request Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline Which which(); inline bool isList(); inline bool hasList(); inline ::piper::ListRequest::Builder getList(); inline void setList( ::piper::ListRequest::Reader value); inline ::piper::ListRequest::Builder initList(); inline void adoptList(::capnp::Orphan< ::piper::ListRequest>&& value); inline ::capnp::Orphan< ::piper::ListRequest> disownList(); inline bool isLoad(); inline bool hasLoad(); inline ::piper::LoadRequest::Builder getLoad(); inline void setLoad( ::piper::LoadRequest::Reader value); inline ::piper::LoadRequest::Builder initLoad(); inline void adoptLoad(::capnp::Orphan< ::piper::LoadRequest>&& value); inline ::capnp::Orphan< ::piper::LoadRequest> disownLoad(); inline bool isConfigure(); inline bool hasConfigure(); inline ::piper::ConfigurationRequest::Builder getConfigure(); inline void setConfigure( ::piper::ConfigurationRequest::Reader value); inline ::piper::ConfigurationRequest::Builder initConfigure(); inline void adoptConfigure(::capnp::Orphan< ::piper::ConfigurationRequest>&& value); inline ::capnp::Orphan< ::piper::ConfigurationRequest> disownConfigure(); inline bool isProcess(); inline bool hasProcess(); inline ::piper::ProcessRequest::Builder getProcess(); inline void setProcess( ::piper::ProcessRequest::Reader value); inline ::piper::ProcessRequest::Builder initProcess(); inline void adoptProcess(::capnp::Orphan< ::piper::ProcessRequest>&& value); inline ::capnp::Orphan< ::piper::ProcessRequest> disownProcess(); inline bool isFinish(); inline bool hasFinish(); inline ::piper::FinishRequest::Builder getFinish(); inline void setFinish( ::piper::FinishRequest::Reader value); inline ::piper::FinishRequest::Builder initFinish(); inline void adoptFinish(::capnp::Orphan< ::piper::FinishRequest>&& value); inline ::capnp::Orphan< ::piper::FinishRequest> disownFinish(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RpcRequest::Request::Pipeline { public: typedef Request Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RpcResponse::Reader { public: typedef RpcResponse Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline typename Id::Reader getId() const; inline typename Response::Reader getResponse() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RpcResponse::Builder { public: typedef RpcResponse Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline typename Id::Builder getId(); inline typename Id::Builder initId(); inline typename Response::Builder getResponse(); inline typename Response::Builder initResponse(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RpcResponse::Pipeline { public: typedef RpcResponse Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} inline typename Id::Pipeline getId(); inline typename Response::Pipeline getResponse(); private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RpcResponse::Id::Reader { public: typedef Id Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline Which which() const; inline bool isNumber() const; inline ::int32_t getNumber() const; inline bool isTag() const; inline bool hasTag() const; inline ::capnp::Text::Reader getTag() const; inline bool isNone() const; inline ::capnp::Void getNone() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RpcResponse::Id::Builder { public: typedef Id Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline Which which(); inline bool isNumber(); inline ::int32_t getNumber(); inline void setNumber( ::int32_t value); inline bool isTag(); inline bool hasTag(); inline ::capnp::Text::Builder getTag(); inline void setTag( ::capnp::Text::Reader value); inline ::capnp::Text::Builder initTag(unsigned int size); inline void adoptTag(::capnp::Orphan< ::capnp::Text>&& value); inline ::capnp::Orphan< ::capnp::Text> disownTag(); inline bool isNone(); inline ::capnp::Void getNone(); inline void setNone( ::capnp::Void value = ::capnp::VOID); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RpcResponse::Id::Pipeline { public: typedef Id Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE class RpcResponse::Response::Reader { public: typedef Response Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} inline ::capnp::MessageSize totalSize() const { return _reader.totalSize().asPublic(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); } #endif // !CAPNP_LITE inline Which which() const; inline bool isError() const; inline bool hasError() const; inline ::piper::Error::Reader getError() const; inline bool isList() const; inline bool hasList() const; inline ::piper::ListResponse::Reader getList() const; inline bool isLoad() const; inline bool hasLoad() const; inline ::piper::LoadResponse::Reader getLoad() const; inline bool isConfigure() const; inline bool hasConfigure() const; inline ::piper::ConfigurationResponse::Reader getConfigure() const; inline bool isProcess() const; inline bool hasProcess() const; inline ::piper::ProcessResponse::Reader getProcess() const; inline bool isFinish() const; inline bool hasFinish() const; inline ::piper::FinishResponse::Reader getFinish() const; private: ::capnp::_::StructReader _reader; template friend struct ::capnp::ToDynamic_; template friend struct ::capnp::_::PointerHelpers; template friend struct ::capnp::List; friend class ::capnp::MessageBuilder; friend class ::capnp::Orphanage; }; class RpcResponse::Response::Builder { public: typedef Response Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. inline Builder(decltype(nullptr)) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline operator Reader() const { return Reader(_builder.asReader()); } inline Reader asReader() const { return *this; } inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } #if !CAPNP_LITE inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE inline Which which(); inline bool isError(); inline bool hasError(); inline ::piper::Error::Builder getError(); inline void setError( ::piper::Error::Reader value); inline ::piper::Error::Builder initError(); inline void adoptError(::capnp::Orphan< ::piper::Error>&& value); inline ::capnp::Orphan< ::piper::Error> disownError(); inline bool isList(); inline bool hasList(); inline ::piper::ListResponse::Builder getList(); inline void setList( ::piper::ListResponse::Reader value); inline ::piper::ListResponse::Builder initList(); inline void adoptList(::capnp::Orphan< ::piper::ListResponse>&& value); inline ::capnp::Orphan< ::piper::ListResponse> disownList(); inline bool isLoad(); inline bool hasLoad(); inline ::piper::LoadResponse::Builder getLoad(); inline void setLoad( ::piper::LoadResponse::Reader value); inline ::piper::LoadResponse::Builder initLoad(); inline void adoptLoad(::capnp::Orphan< ::piper::LoadResponse>&& value); inline ::capnp::Orphan< ::piper::LoadResponse> disownLoad(); inline bool isConfigure(); inline bool hasConfigure(); inline ::piper::ConfigurationResponse::Builder getConfigure(); inline void setConfigure( ::piper::ConfigurationResponse::Reader value); inline ::piper::ConfigurationResponse::Builder initConfigure(); inline void adoptConfigure(::capnp::Orphan< ::piper::ConfigurationResponse>&& value); inline ::capnp::Orphan< ::piper::ConfigurationResponse> disownConfigure(); inline bool isProcess(); inline bool hasProcess(); inline ::piper::ProcessResponse::Builder getProcess(); inline void setProcess( ::piper::ProcessResponse::Reader value); inline ::piper::ProcessResponse::Builder initProcess(); inline void adoptProcess(::capnp::Orphan< ::piper::ProcessResponse>&& value); inline ::capnp::Orphan< ::piper::ProcessResponse> disownProcess(); inline bool isFinish(); inline bool hasFinish(); inline ::piper::FinishResponse::Builder getFinish(); inline void setFinish( ::piper::FinishResponse::Reader value); inline ::piper::FinishResponse::Builder initFinish(); inline void adoptFinish(::capnp::Orphan< ::piper::FinishResponse>&& value); inline ::capnp::Orphan< ::piper::FinishResponse> disownFinish(); private: ::capnp::_::StructBuilder _builder; template friend struct ::capnp::ToDynamic_; friend class ::capnp::Orphanage; template friend struct ::capnp::_::PointerHelpers; }; #if !CAPNP_LITE class RpcResponse::Response::Pipeline { public: typedef Response Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) : _typeless(kj::mv(typeless)) {} private: ::capnp::AnyPointer::Pipeline _typeless; friend class ::capnp::PipelineHook; template friend struct ::capnp::ToDynamic_; }; #endif // !CAPNP_LITE // ======================================================================================= inline bool Basic::Reader::hasIdentifier() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool Basic::Builder::hasIdentifier() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Basic::Reader::getIdentifier() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Basic::Builder::getIdentifier() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void Basic::Builder::setIdentifier( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Basic::Builder::initIdentifier(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void Basic::Builder::adoptIdentifier( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Basic::Builder::disownIdentifier() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool Basic::Reader::hasName() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool Basic::Builder::hasName() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Basic::Reader::getName() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Basic::Builder::getName() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void Basic::Builder::setName( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Basic::Builder::initName(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), size); } inline void Basic::Builder::adoptName( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Basic::Builder::disownName() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool Basic::Reader::hasDescription() const { return !_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline bool Basic::Builder::hasDescription() { return !_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Basic::Reader::getDescription() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Basic::Builder::getDescription() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline void Basic::Builder::setDescription( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Basic::Builder::initDescription(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), size); } inline void Basic::Builder::adoptDescription( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Basic::Builder::disownDescription() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline bool ParameterDescriptor::Reader::hasBasic() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ParameterDescriptor::Builder::hasBasic() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::Basic::Reader ParameterDescriptor::Reader::getBasic() const { return ::capnp::_::PointerHelpers< ::piper::Basic>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::Basic::Builder ParameterDescriptor::Builder::getBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Basic::Pipeline ParameterDescriptor::Pipeline::getBasic() { return ::piper::Basic::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void ParameterDescriptor::Builder::setBasic( ::piper::Basic::Reader value) { ::capnp::_::PointerHelpers< ::piper::Basic>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::Basic::Builder ParameterDescriptor::Builder::initBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ParameterDescriptor::Builder::adoptBasic( ::capnp::Orphan< ::piper::Basic>&& value) { ::capnp::_::PointerHelpers< ::piper::Basic>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Basic> ParameterDescriptor::Builder::disownBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool ParameterDescriptor::Reader::hasUnit() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool ParameterDescriptor::Builder::hasUnit() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader ParameterDescriptor::Reader::getUnit() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder ParameterDescriptor::Builder::getUnit() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void ParameterDescriptor::Builder::setUnit( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder ParameterDescriptor::Builder::initUnit(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), size); } inline void ParameterDescriptor::Builder::adoptUnit( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> ParameterDescriptor::Builder::disownUnit() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline float ParameterDescriptor::Reader::getMinValue() const { return _reader.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline float ParameterDescriptor::Builder::getMinValue() { return _builder.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ParameterDescriptor::Builder::setMinValue(float value) { _builder.setDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline float ParameterDescriptor::Reader::getMaxValue() const { return _reader.getDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline float ParameterDescriptor::Builder::getMaxValue() { return _builder.getDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void ParameterDescriptor::Builder::setMaxValue(float value) { _builder.setDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline float ParameterDescriptor::Reader::getDefaultValue() const { return _reader.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline float ParameterDescriptor::Builder::getDefaultValue() { return _builder.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline void ParameterDescriptor::Builder::setDefaultValue(float value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, value); } inline bool ParameterDescriptor::Reader::getIsQuantized() const { return _reader.getDataField( ::capnp::bounded<96>() * ::capnp::ELEMENTS); } inline bool ParameterDescriptor::Builder::getIsQuantized() { return _builder.getDataField( ::capnp::bounded<96>() * ::capnp::ELEMENTS); } inline void ParameterDescriptor::Builder::setIsQuantized(bool value) { _builder.setDataField( ::capnp::bounded<96>() * ::capnp::ELEMENTS, value); } inline float ParameterDescriptor::Reader::getQuantizeStep() const { return _reader.getDataField( ::capnp::bounded<4>() * ::capnp::ELEMENTS); } inline float ParameterDescriptor::Builder::getQuantizeStep() { return _builder.getDataField( ::capnp::bounded<4>() * ::capnp::ELEMENTS); } inline void ParameterDescriptor::Builder::setQuantizeStep(float value) { _builder.setDataField( ::capnp::bounded<4>() * ::capnp::ELEMENTS, value); } inline bool ParameterDescriptor::Reader::hasValueNames() const { return !_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline bool ParameterDescriptor::Builder::hasValueNames() { return !_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::capnp::Text>::Reader ParameterDescriptor::Reader::getValueNames() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), ::capnp::schemas::bp_f8fda10bef70a97d + 147); } inline ::capnp::List< ::capnp::Text>::Builder ParameterDescriptor::Builder::getValueNames() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), ::capnp::schemas::bp_f8fda10bef70a97d + 147); } inline void ParameterDescriptor::Builder::setValueNames( ::capnp::List< ::capnp::Text>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), value); } inline void ParameterDescriptor::Builder::setValueNames(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::capnp::Text>::Builder ParameterDescriptor::Builder::initValueNames(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::init(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), size); } inline void ParameterDescriptor::Builder::adoptValueNames( ::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::adopt(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> ParameterDescriptor::Builder::disownValueNames() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::disown(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline bool ConfiguredOutputDescriptor::Reader::hasUnit() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ConfiguredOutputDescriptor::Builder::hasUnit() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader ConfiguredOutputDescriptor::Reader::getUnit() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder ConfiguredOutputDescriptor::Builder::getUnit() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ConfiguredOutputDescriptor::Builder::setUnit( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder ConfiguredOutputDescriptor::Builder::initUnit(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void ConfiguredOutputDescriptor::Builder::adoptUnit( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> ConfiguredOutputDescriptor::Builder::disownUnit() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool ConfiguredOutputDescriptor::Reader::getHasFixedBinCount() const { return _reader.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline bool ConfiguredOutputDescriptor::Builder::getHasFixedBinCount() { return _builder.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setHasFixedBinCount(bool value) { _builder.setDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline ::int32_t ConfiguredOutputDescriptor::Reader::getBinCount() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline ::int32_t ConfiguredOutputDescriptor::Builder::getBinCount() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setBinCount( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline bool ConfiguredOutputDescriptor::Reader::hasBinNames() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool ConfiguredOutputDescriptor::Builder::hasBinNames() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::capnp::Text>::Reader ConfiguredOutputDescriptor::Reader::getBinNames() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), ::capnp::schemas::bp_b2d0c825aac8249c + 142); } inline ::capnp::List< ::capnp::Text>::Builder ConfiguredOutputDescriptor::Builder::getBinNames() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), ::capnp::schemas::bp_b2d0c825aac8249c + 142); } inline void ConfiguredOutputDescriptor::Builder::setBinNames( ::capnp::List< ::capnp::Text>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline void ConfiguredOutputDescriptor::Builder::setBinNames(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::capnp::Text>::Builder ConfiguredOutputDescriptor::Builder::initBinNames(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), size); } inline void ConfiguredOutputDescriptor::Builder::adoptBinNames( ::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> ConfiguredOutputDescriptor::Builder::disownBinNames() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool ConfiguredOutputDescriptor::Reader::getHasKnownExtents() const { return _reader.getDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline bool ConfiguredOutputDescriptor::Builder::getHasKnownExtents() { return _builder.getDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setHasKnownExtents(bool value) { _builder.setDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline float ConfiguredOutputDescriptor::Reader::getMinValue() const { return _reader.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline float ConfiguredOutputDescriptor::Builder::getMinValue() { return _builder.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setMinValue(float value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, value); } inline float ConfiguredOutputDescriptor::Reader::getMaxValue() const { return _reader.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline float ConfiguredOutputDescriptor::Builder::getMaxValue() { return _builder.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setMaxValue(float value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, value); } inline bool ConfiguredOutputDescriptor::Reader::getIsQuantized() const { return _reader.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline bool ConfiguredOutputDescriptor::Builder::getIsQuantized() { return _builder.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setIsQuantized(bool value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, value); } inline float ConfiguredOutputDescriptor::Reader::getQuantizeStep() const { return _reader.getDataField( ::capnp::bounded<4>() * ::capnp::ELEMENTS); } inline float ConfiguredOutputDescriptor::Builder::getQuantizeStep() { return _builder.getDataField( ::capnp::bounded<4>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setQuantizeStep(float value) { _builder.setDataField( ::capnp::bounded<4>() * ::capnp::ELEMENTS, value); } inline ::piper::SampleType ConfiguredOutputDescriptor::Reader::getSampleType() const { return _reader.getDataField< ::piper::SampleType>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline ::piper::SampleType ConfiguredOutputDescriptor::Builder::getSampleType() { return _builder.getDataField< ::piper::SampleType>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setSampleType( ::piper::SampleType value) { _builder.setDataField< ::piper::SampleType>( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline float ConfiguredOutputDescriptor::Reader::getSampleRate() const { return _reader.getDataField( ::capnp::bounded<5>() * ::capnp::ELEMENTS); } inline float ConfiguredOutputDescriptor::Builder::getSampleRate() { return _builder.getDataField( ::capnp::bounded<5>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setSampleRate(float value) { _builder.setDataField( ::capnp::bounded<5>() * ::capnp::ELEMENTS, value); } inline bool ConfiguredOutputDescriptor::Reader::getHasDuration() const { return _reader.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline bool ConfiguredOutputDescriptor::Builder::getHasDuration() { return _builder.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline void ConfiguredOutputDescriptor::Builder::setHasDuration(bool value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, value); } inline bool OutputDescriptor::Reader::hasBasic() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool OutputDescriptor::Builder::hasBasic() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::Basic::Reader OutputDescriptor::Reader::getBasic() const { return ::capnp::_::PointerHelpers< ::piper::Basic>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::Basic::Builder OutputDescriptor::Builder::getBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Basic::Pipeline OutputDescriptor::Pipeline::getBasic() { return ::piper::Basic::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void OutputDescriptor::Builder::setBasic( ::piper::Basic::Reader value) { ::capnp::_::PointerHelpers< ::piper::Basic>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::Basic::Builder OutputDescriptor::Builder::initBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void OutputDescriptor::Builder::adoptBasic( ::capnp::Orphan< ::piper::Basic>&& value) { ::capnp::_::PointerHelpers< ::piper::Basic>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Basic> OutputDescriptor::Builder::disownBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool OutputDescriptor::Reader::hasConfigured() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool OutputDescriptor::Builder::hasConfigured() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ConfiguredOutputDescriptor::Reader OutputDescriptor::Reader::getConfigured() const { return ::capnp::_::PointerHelpers< ::piper::ConfiguredOutputDescriptor>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ConfiguredOutputDescriptor::Builder OutputDescriptor::Builder::getConfigured() { return ::capnp::_::PointerHelpers< ::piper::ConfiguredOutputDescriptor>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::ConfiguredOutputDescriptor::Pipeline OutputDescriptor::Pipeline::getConfigured() { return ::piper::ConfiguredOutputDescriptor::Pipeline(_typeless.getPointerField(1)); } #endif // !CAPNP_LITE inline void OutputDescriptor::Builder::setConfigured( ::piper::ConfiguredOutputDescriptor::Reader value) { ::capnp::_::PointerHelpers< ::piper::ConfiguredOutputDescriptor>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ConfiguredOutputDescriptor::Builder OutputDescriptor::Builder::initConfigured() { return ::capnp::_::PointerHelpers< ::piper::ConfiguredOutputDescriptor>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void OutputDescriptor::Builder::adoptConfigured( ::capnp::Orphan< ::piper::ConfiguredOutputDescriptor>&& value) { ::capnp::_::PointerHelpers< ::piper::ConfiguredOutputDescriptor>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ConfiguredOutputDescriptor> OutputDescriptor::Builder::disownConfigured() { return ::capnp::_::PointerHelpers< ::piper::ConfiguredOutputDescriptor>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool ExtractorStaticData::Reader::hasKey() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasKey() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader ExtractorStaticData::Reader::getKey() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder ExtractorStaticData::Builder::getKey() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setKey( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder ExtractorStaticData::Builder::initKey(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptKey( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> ExtractorStaticData::Builder::disownKey() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool ExtractorStaticData::Reader::hasBasic() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasBasic() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::Basic::Reader ExtractorStaticData::Reader::getBasic() const { return ::capnp::_::PointerHelpers< ::piper::Basic>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::Basic::Builder ExtractorStaticData::Builder::getBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Basic::Pipeline ExtractorStaticData::Pipeline::getBasic() { return ::piper::Basic::Pipeline(_typeless.getPointerField(1)); } #endif // !CAPNP_LITE inline void ExtractorStaticData::Builder::setBasic( ::piper::Basic::Reader value) { ::capnp::_::PointerHelpers< ::piper::Basic>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::Basic::Builder ExtractorStaticData::Builder::initBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::adoptBasic( ::capnp::Orphan< ::piper::Basic>&& value) { ::capnp::_::PointerHelpers< ::piper::Basic>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Basic> ExtractorStaticData::Builder::disownBasic() { return ::capnp::_::PointerHelpers< ::piper::Basic>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool ExtractorStaticData::Reader::hasMaker() const { return !_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasMaker() { return !_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader ExtractorStaticData::Reader::getMaker() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder ExtractorStaticData::Builder::getMaker() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setMaker( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder ExtractorStaticData::Builder::initMaker(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptMaker( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> ExtractorStaticData::Builder::disownMaker() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline bool ExtractorStaticData::Reader::hasRights() const { return !_reader.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasRights() { return !_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader ExtractorStaticData::Reader::getRights() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder ExtractorStaticData::Builder::getRights() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setRights( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder ExtractorStaticData::Builder::initRights(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptRights( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> ExtractorStaticData::Builder::disownRights() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS)); } inline ::int32_t ExtractorStaticData::Reader::getVersion() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t ExtractorStaticData::Builder::getVersion() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ExtractorStaticData::Builder::setVersion( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool ExtractorStaticData::Reader::hasCategory() const { return !_reader.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasCategory() { return !_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::capnp::Text>::Reader ExtractorStaticData::Reader::getCategory() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_reader.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS)); } inline ::capnp::List< ::capnp::Text>::Builder ExtractorStaticData::Builder::getCategory() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setCategory( ::capnp::List< ::capnp::Text>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS), value); } inline void ExtractorStaticData::Builder::setCategory(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::capnp::Text>::Builder ExtractorStaticData::Builder::initCategory(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::init(_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptCategory( ::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::adopt(_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> ExtractorStaticData::Builder::disownCategory() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::disown(_builder.getPointerField( ::capnp::bounded<4>() * ::capnp::POINTERS)); } inline ::int32_t ExtractorStaticData::Reader::getMinChannelCount() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline ::int32_t ExtractorStaticData::Builder::getMinChannelCount() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void ExtractorStaticData::Builder::setMinChannelCount( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline ::int32_t ExtractorStaticData::Reader::getMaxChannelCount() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline ::int32_t ExtractorStaticData::Builder::getMaxChannelCount() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline void ExtractorStaticData::Builder::setMaxChannelCount( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<2>() * ::capnp::ELEMENTS, value); } inline bool ExtractorStaticData::Reader::hasParameters() const { return !_reader.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasParameters() { return !_builder.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::ParameterDescriptor>::Reader ExtractorStaticData::Reader::getParameters() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ParameterDescriptor>>::get(_reader.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::ParameterDescriptor>::Builder ExtractorStaticData::Builder::getParameters() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ParameterDescriptor>>::get(_builder.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setParameters( ::capnp::List< ::piper::ParameterDescriptor>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ParameterDescriptor>>::set(_builder.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::ParameterDescriptor>::Builder ExtractorStaticData::Builder::initParameters(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ParameterDescriptor>>::init(_builder.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptParameters( ::capnp::Orphan< ::capnp::List< ::piper::ParameterDescriptor>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ParameterDescriptor>>::adopt(_builder.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::ParameterDescriptor>> ExtractorStaticData::Builder::disownParameters() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ParameterDescriptor>>::disown(_builder.getPointerField( ::capnp::bounded<5>() * ::capnp::POINTERS)); } inline bool ExtractorStaticData::Reader::hasPrograms() const { return !_reader.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasPrograms() { return !_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::capnp::Text>::Reader ExtractorStaticData::Reader::getPrograms() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_reader.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS)); } inline ::capnp::List< ::capnp::Text>::Builder ExtractorStaticData::Builder::getPrograms() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setPrograms( ::capnp::List< ::capnp::Text>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS), value); } inline void ExtractorStaticData::Builder::setPrograms(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::capnp::Text>::Builder ExtractorStaticData::Builder::initPrograms(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::init(_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptPrograms( ::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::adopt(_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> ExtractorStaticData::Builder::disownPrograms() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::disown(_builder.getPointerField( ::capnp::bounded<6>() * ::capnp::POINTERS)); } inline ::piper::InputDomain ExtractorStaticData::Reader::getInputDomain() const { return _reader.getDataField< ::piper::InputDomain>( ::capnp::bounded<6>() * ::capnp::ELEMENTS); } inline ::piper::InputDomain ExtractorStaticData::Builder::getInputDomain() { return _builder.getDataField< ::piper::InputDomain>( ::capnp::bounded<6>() * ::capnp::ELEMENTS); } inline void ExtractorStaticData::Builder::setInputDomain( ::piper::InputDomain value) { _builder.setDataField< ::piper::InputDomain>( ::capnp::bounded<6>() * ::capnp::ELEMENTS, value); } inline bool ExtractorStaticData::Reader::hasBasicOutputInfo() const { return !_reader.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS).isNull(); } inline bool ExtractorStaticData::Builder::hasBasicOutputInfo() { return !_builder.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::Basic>::Reader ExtractorStaticData::Reader::getBasicOutputInfo() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Basic>>::get(_reader.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::Basic>::Builder ExtractorStaticData::Builder::getBasicOutputInfo() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Basic>>::get(_builder.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS)); } inline void ExtractorStaticData::Builder::setBasicOutputInfo( ::capnp::List< ::piper::Basic>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Basic>>::set(_builder.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::Basic>::Builder ExtractorStaticData::Builder::initBasicOutputInfo(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Basic>>::init(_builder.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS), size); } inline void ExtractorStaticData::Builder::adoptBasicOutputInfo( ::capnp::Orphan< ::capnp::List< ::piper::Basic>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Basic>>::adopt(_builder.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::Basic>> ExtractorStaticData::Builder::disownBasicOutputInfo() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Basic>>::disown(_builder.getPointerField( ::capnp::bounded<7>() * ::capnp::POINTERS)); } inline ::int32_t RealTime::Reader::getSec() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t RealTime::Builder::getSec() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void RealTime::Builder::setSec( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline ::int32_t RealTime::Reader::getNsec() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline ::int32_t RealTime::Builder::getNsec() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void RealTime::Builder::setNsec( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline bool ProcessInput::Reader::hasInputBuffers() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ProcessInput::Builder::hasInputBuffers() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::capnp::List>::Reader ProcessInput::Reader::getInputBuffers() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::List< ::capnp::List>::Builder ProcessInput::Builder::getInputBuffers() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ProcessInput::Builder::setInputBuffers( ::capnp::List< ::capnp::List>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline void ProcessInput::Builder::setInputBuffers(::kj::ArrayPtr::Reader> value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::capnp::List>::Builder ProcessInput::Builder::initInputBuffers(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void ProcessInput::Builder::adoptInputBuffers( ::capnp::Orphan< ::capnp::List< ::capnp::List>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::capnp::List>> ProcessInput::Builder::disownInputBuffers() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::List>>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool ProcessInput::Reader::hasTimestamp() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool ProcessInput::Builder::hasTimestamp() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::RealTime::Reader ProcessInput::Reader::getTimestamp() const { return ::capnp::_::PointerHelpers< ::piper::RealTime>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::RealTime::Builder ProcessInput::Builder::getTimestamp() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::RealTime::Pipeline ProcessInput::Pipeline::getTimestamp() { return ::piper::RealTime::Pipeline(_typeless.getPointerField(1)); } #endif // !CAPNP_LITE inline void ProcessInput::Builder::setTimestamp( ::piper::RealTime::Reader value) { ::capnp::_::PointerHelpers< ::piper::RealTime>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::RealTime::Builder ProcessInput::Builder::initTimestamp() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void ProcessInput::Builder::adoptTimestamp( ::capnp::Orphan< ::piper::RealTime>&& value) { ::capnp::_::PointerHelpers< ::piper::RealTime>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::RealTime> ProcessInput::Builder::disownTimestamp() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool Feature::Reader::getHasTimestamp() const { return _reader.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline bool Feature::Builder::getHasTimestamp() { return _builder.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void Feature::Builder::setHasTimestamp(bool value) { _builder.setDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool Feature::Reader::hasTimestamp() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool Feature::Builder::hasTimestamp() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::RealTime::Reader Feature::Reader::getTimestamp() const { return ::capnp::_::PointerHelpers< ::piper::RealTime>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::RealTime::Builder Feature::Builder::getTimestamp() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::RealTime::Pipeline Feature::Pipeline::getTimestamp() { return ::piper::RealTime::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void Feature::Builder::setTimestamp( ::piper::RealTime::Reader value) { ::capnp::_::PointerHelpers< ::piper::RealTime>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::RealTime::Builder Feature::Builder::initTimestamp() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void Feature::Builder::adoptTimestamp( ::capnp::Orphan< ::piper::RealTime>&& value) { ::capnp::_::PointerHelpers< ::piper::RealTime>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::RealTime> Feature::Builder::disownTimestamp() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool Feature::Reader::getHasDuration() const { return _reader.getDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline bool Feature::Builder::getHasDuration() { return _builder.getDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void Feature::Builder::setHasDuration(bool value) { _builder.setDataField( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline bool Feature::Reader::hasDuration() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool Feature::Builder::hasDuration() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::RealTime::Reader Feature::Reader::getDuration() const { return ::capnp::_::PointerHelpers< ::piper::RealTime>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::RealTime::Builder Feature::Builder::getDuration() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::RealTime::Pipeline Feature::Pipeline::getDuration() { return ::piper::RealTime::Pipeline(_typeless.getPointerField(1)); } #endif // !CAPNP_LITE inline void Feature::Builder::setDuration( ::piper::RealTime::Reader value) { ::capnp::_::PointerHelpers< ::piper::RealTime>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::RealTime::Builder Feature::Builder::initDuration() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void Feature::Builder::adoptDuration( ::capnp::Orphan< ::piper::RealTime>&& value) { ::capnp::_::PointerHelpers< ::piper::RealTime>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::RealTime> Feature::Builder::disownDuration() { return ::capnp::_::PointerHelpers< ::piper::RealTime>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool Feature::Reader::hasLabel() const { return !_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline bool Feature::Builder::hasLabel() { return !_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Feature::Reader::getLabel() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Feature::Builder::getLabel() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline void Feature::Builder::setLabel( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Feature::Builder::initLabel(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), size); } inline void Feature::Builder::adoptLabel( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Feature::Builder::disownLabel() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline bool Feature::Reader::hasFeatureValues() const { return !_reader.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS).isNull(); } inline bool Feature::Builder::hasFeatureValues() { return !_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List::Reader Feature::Reader::getFeatureValues() const { return ::capnp::_::PointerHelpers< ::capnp::List>::get(_reader.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), ::capnp::schemas::bp_d6a172208c9a1760 + 115); } inline ::capnp::List::Builder Feature::Builder::getFeatureValues() { return ::capnp::_::PointerHelpers< ::capnp::List>::get(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), ::capnp::schemas::bp_d6a172208c9a1760 + 115); } inline void Feature::Builder::setFeatureValues( ::capnp::List::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List>::set(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), value); } inline void Feature::Builder::setFeatureValues(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List>::set(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), value); } inline ::capnp::List::Builder Feature::Builder::initFeatureValues(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List>::init(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), size); } inline void Feature::Builder::adoptFeatureValues( ::capnp::Orphan< ::capnp::List>&& value) { ::capnp::_::PointerHelpers< ::capnp::List>::adopt(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List> Feature::Builder::disownFeatureValues() { return ::capnp::_::PointerHelpers< ::capnp::List>::disown(_builder.getPointerField( ::capnp::bounded<3>() * ::capnp::POINTERS)); } inline bool FeatureSet::Reader::hasFeaturePairs() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool FeatureSet::Builder::hasFeaturePairs() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::FeatureSet::FSPair>::Reader FeatureSet::Reader::getFeaturePairs() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::FeatureSet::FSPair>>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::FeatureSet::FSPair>::Builder FeatureSet::Builder::getFeaturePairs() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::FeatureSet::FSPair>>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void FeatureSet::Builder::setFeaturePairs( ::capnp::List< ::piper::FeatureSet::FSPair>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::FeatureSet::FSPair>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::FeatureSet::FSPair>::Builder FeatureSet::Builder::initFeaturePairs(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::FeatureSet::FSPair>>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void FeatureSet::Builder::adoptFeaturePairs( ::capnp::Orphan< ::capnp::List< ::piper::FeatureSet::FSPair>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::FeatureSet::FSPair>>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::FeatureSet::FSPair>> FeatureSet::Builder::disownFeaturePairs() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::FeatureSet::FSPair>>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool FeatureSet::FSPair::Reader::hasOutput() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool FeatureSet::FSPair::Builder::hasOutput() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader FeatureSet::FSPair::Reader::getOutput() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder FeatureSet::FSPair::Builder::getOutput() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void FeatureSet::FSPair::Builder::setOutput( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder FeatureSet::FSPair::Builder::initOutput(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void FeatureSet::FSPair::Builder::adoptOutput( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> FeatureSet::FSPair::Builder::disownOutput() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool FeatureSet::FSPair::Reader::hasFeatures() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool FeatureSet::FSPair::Builder::hasFeatures() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::Feature>::Reader FeatureSet::FSPair::Reader::getFeatures() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Feature>>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), ::capnp::schemas::bp_ab2572c346316b24 + 52); } inline ::capnp::List< ::piper::Feature>::Builder FeatureSet::FSPair::Builder::getFeatures() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Feature>>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), ::capnp::schemas::bp_ab2572c346316b24 + 52); } inline void FeatureSet::FSPair::Builder::setFeatures( ::capnp::List< ::piper::Feature>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Feature>>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::Feature>::Builder FeatureSet::FSPair::Builder::initFeatures(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Feature>>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), size); } inline void FeatureSet::FSPair::Builder::adoptFeatures( ::capnp::Orphan< ::capnp::List< ::piper::Feature>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Feature>>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::Feature>> FeatureSet::FSPair::Builder::disownFeatures() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Feature>>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::int32_t Framing::Reader::getBlockSize() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t Framing::Builder::getBlockSize() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void Framing::Builder::setBlockSize( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline ::int32_t Framing::Reader::getStepSize() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline ::int32_t Framing::Builder::getStepSize() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS); } inline void Framing::Builder::setStepSize( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } inline bool Configuration::Reader::hasParameterValues() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool Configuration::Builder::hasParameterValues() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::Configuration::PVPair>::Reader Configuration::Reader::getParameterValues() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Configuration::PVPair>>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::Configuration::PVPair>::Builder Configuration::Builder::getParameterValues() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Configuration::PVPair>>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void Configuration::Builder::setParameterValues( ::capnp::List< ::piper::Configuration::PVPair>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Configuration::PVPair>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::Configuration::PVPair>::Builder Configuration::Builder::initParameterValues(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Configuration::PVPair>>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void Configuration::Builder::adoptParameterValues( ::capnp::Orphan< ::capnp::List< ::piper::Configuration::PVPair>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Configuration::PVPair>>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::Configuration::PVPair>> Configuration::Builder::disownParameterValues() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::Configuration::PVPair>>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool Configuration::Reader::hasCurrentProgram() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool Configuration::Builder::hasCurrentProgram() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Configuration::Reader::getCurrentProgram() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Configuration::Builder::getCurrentProgram() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void Configuration::Builder::setCurrentProgram( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Configuration::Builder::initCurrentProgram(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), size); } inline void Configuration::Builder::adoptCurrentProgram( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Configuration::Builder::disownCurrentProgram() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::int32_t Configuration::Reader::getChannelCount() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t Configuration::Builder::getChannelCount() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void Configuration::Builder::setChannelCount( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool Configuration::Reader::hasFraming() const { return !_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline bool Configuration::Builder::hasFraming() { return !_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS).isNull(); } inline ::piper::Framing::Reader Configuration::Reader::getFraming() const { return ::capnp::_::PointerHelpers< ::piper::Framing>::get(_reader.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline ::piper::Framing::Builder Configuration::Builder::getFraming() { return ::capnp::_::PointerHelpers< ::piper::Framing>::get(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Framing::Pipeline Configuration::Pipeline::getFraming() { return ::piper::Framing::Pipeline(_typeless.getPointerField(2)); } #endif // !CAPNP_LITE inline void Configuration::Builder::setFraming( ::piper::Framing::Reader value) { ::capnp::_::PointerHelpers< ::piper::Framing>::set(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), value); } inline ::piper::Framing::Builder Configuration::Builder::initFraming() { return ::capnp::_::PointerHelpers< ::piper::Framing>::init(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline void Configuration::Builder::adoptFraming( ::capnp::Orphan< ::piper::Framing>&& value) { ::capnp::_::PointerHelpers< ::piper::Framing>::adopt(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Framing> Configuration::Builder::disownFraming() { return ::capnp::_::PointerHelpers< ::piper::Framing>::disown(_builder.getPointerField( ::capnp::bounded<2>() * ::capnp::POINTERS)); } inline bool Configuration::PVPair::Reader::hasParameter() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool Configuration::PVPair::Builder::hasParameter() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Configuration::PVPair::Reader::getParameter() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Configuration::PVPair::Builder::getParameter() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void Configuration::PVPair::Builder::setParameter( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Configuration::PVPair::Builder::initParameter(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void Configuration::PVPair::Builder::adoptParameter( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Configuration::PVPair::Builder::disownParameter() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline float Configuration::PVPair::Reader::getValue() const { return _reader.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline float Configuration::PVPair::Builder::getValue() { return _builder.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void Configuration::PVPair::Builder::setValue(float value) { _builder.setDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool ListRequest::Reader::hasFrom() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ListRequest::Builder::hasFrom() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::capnp::Text>::Reader ListRequest::Reader::getFrom() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::List< ::capnp::Text>::Builder ListRequest::Builder::getFrom() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ListRequest::Builder::setFrom( ::capnp::List< ::capnp::Text>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline void ListRequest::Builder::setFrom(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::capnp::Text>::Builder ListRequest::Builder::initFrom(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void ListRequest::Builder::adoptFrom( ::capnp::Orphan< ::capnp::List< ::capnp::Text>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::capnp::Text>> ListRequest::Builder::disownFrom() { return ::capnp::_::PointerHelpers< ::capnp::List< ::capnp::Text>>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool ListResponse::Reader::hasAvailable() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ListResponse::Builder::hasAvailable() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::ExtractorStaticData>::Reader ListResponse::Reader::getAvailable() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ExtractorStaticData>>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::ExtractorStaticData>::Builder ListResponse::Builder::getAvailable() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ExtractorStaticData>>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ListResponse::Builder::setAvailable( ::capnp::List< ::piper::ExtractorStaticData>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ExtractorStaticData>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::ExtractorStaticData>::Builder ListResponse::Builder::initAvailable(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ExtractorStaticData>>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void ListResponse::Builder::adoptAvailable( ::capnp::Orphan< ::capnp::List< ::piper::ExtractorStaticData>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ExtractorStaticData>>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::ExtractorStaticData>> ListResponse::Builder::disownAvailable() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::ExtractorStaticData>>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool LoadRequest::Reader::hasKey() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool LoadRequest::Builder::hasKey() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader LoadRequest::Reader::getKey() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder LoadRequest::Builder::getKey() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void LoadRequest::Builder::setKey( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder LoadRequest::Builder::initKey(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void LoadRequest::Builder::adoptKey( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> LoadRequest::Builder::disownKey() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline float LoadRequest::Reader::getInputSampleRate() const { return _reader.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline float LoadRequest::Builder::getInputSampleRate() { return _builder.getDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void LoadRequest::Builder::setInputSampleRate(float value) { _builder.setDataField( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool LoadRequest::Reader::hasAdapterFlags() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool LoadRequest::Builder::hasAdapterFlags() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::AdapterFlag>::Reader LoadRequest::Reader::getAdapterFlags() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::AdapterFlag>::Builder LoadRequest::Builder::getAdapterFlags() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void LoadRequest::Builder::setAdapterFlags( ::capnp::List< ::piper::AdapterFlag>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline void LoadRequest::Builder::setAdapterFlags(::kj::ArrayPtr value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::AdapterFlag>::Builder LoadRequest::Builder::initAdapterFlags(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), size); } inline void LoadRequest::Builder::adoptAdapterFlags( ::capnp::Orphan< ::capnp::List< ::piper::AdapterFlag>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::AdapterFlag>> LoadRequest::Builder::disownAdapterFlags() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::AdapterFlag>>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::int32_t LoadResponse::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t LoadResponse::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void LoadResponse::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool LoadResponse::Reader::hasStaticData() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool LoadResponse::Builder::hasStaticData() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::ExtractorStaticData::Reader LoadResponse::Reader::getStaticData() const { return ::capnp::_::PointerHelpers< ::piper::ExtractorStaticData>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::ExtractorStaticData::Builder LoadResponse::Builder::getStaticData() { return ::capnp::_::PointerHelpers< ::piper::ExtractorStaticData>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::ExtractorStaticData::Pipeline LoadResponse::Pipeline::getStaticData() { return ::piper::ExtractorStaticData::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void LoadResponse::Builder::setStaticData( ::piper::ExtractorStaticData::Reader value) { ::capnp::_::PointerHelpers< ::piper::ExtractorStaticData>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::ExtractorStaticData::Builder LoadResponse::Builder::initStaticData() { return ::capnp::_::PointerHelpers< ::piper::ExtractorStaticData>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void LoadResponse::Builder::adoptStaticData( ::capnp::Orphan< ::piper::ExtractorStaticData>&& value) { ::capnp::_::PointerHelpers< ::piper::ExtractorStaticData>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ExtractorStaticData> LoadResponse::Builder::disownStaticData() { return ::capnp::_::PointerHelpers< ::piper::ExtractorStaticData>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool LoadResponse::Reader::hasDefaultConfiguration() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool LoadResponse::Builder::hasDefaultConfiguration() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::Configuration::Reader LoadResponse::Reader::getDefaultConfiguration() const { return ::capnp::_::PointerHelpers< ::piper::Configuration>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::Configuration::Builder LoadResponse::Builder::getDefaultConfiguration() { return ::capnp::_::PointerHelpers< ::piper::Configuration>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Configuration::Pipeline LoadResponse::Pipeline::getDefaultConfiguration() { return ::piper::Configuration::Pipeline(_typeless.getPointerField(1)); } #endif // !CAPNP_LITE inline void LoadResponse::Builder::setDefaultConfiguration( ::piper::Configuration::Reader value) { ::capnp::_::PointerHelpers< ::piper::Configuration>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::Configuration::Builder LoadResponse::Builder::initDefaultConfiguration() { return ::capnp::_::PointerHelpers< ::piper::Configuration>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void LoadResponse::Builder::adoptDefaultConfiguration( ::capnp::Orphan< ::piper::Configuration>&& value) { ::capnp::_::PointerHelpers< ::piper::Configuration>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Configuration> LoadResponse::Builder::disownDefaultConfiguration() { return ::capnp::_::PointerHelpers< ::piper::Configuration>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::int32_t ConfigurationRequest::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t ConfigurationRequest::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ConfigurationRequest::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool ConfigurationRequest::Reader::hasConfiguration() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ConfigurationRequest::Builder::hasConfiguration() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::Configuration::Reader ConfigurationRequest::Reader::getConfiguration() const { return ::capnp::_::PointerHelpers< ::piper::Configuration>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::Configuration::Builder ConfigurationRequest::Builder::getConfiguration() { return ::capnp::_::PointerHelpers< ::piper::Configuration>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Configuration::Pipeline ConfigurationRequest::Pipeline::getConfiguration() { return ::piper::Configuration::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void ConfigurationRequest::Builder::setConfiguration( ::piper::Configuration::Reader value) { ::capnp::_::PointerHelpers< ::piper::Configuration>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::Configuration::Builder ConfigurationRequest::Builder::initConfiguration() { return ::capnp::_::PointerHelpers< ::piper::Configuration>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ConfigurationRequest::Builder::adoptConfiguration( ::capnp::Orphan< ::piper::Configuration>&& value) { ::capnp::_::PointerHelpers< ::piper::Configuration>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Configuration> ConfigurationRequest::Builder::disownConfiguration() { return ::capnp::_::PointerHelpers< ::piper::Configuration>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::int32_t ConfigurationResponse::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t ConfigurationResponse::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ConfigurationResponse::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool ConfigurationResponse::Reader::hasOutputs() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ConfigurationResponse::Builder::hasOutputs() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::List< ::piper::OutputDescriptor>::Reader ConfigurationResponse::Reader::getOutputs() const { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::OutputDescriptor>>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::List< ::piper::OutputDescriptor>::Builder ConfigurationResponse::Builder::getOutputs() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::OutputDescriptor>>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ConfigurationResponse::Builder::setOutputs( ::capnp::List< ::piper::OutputDescriptor>::Reader value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::OutputDescriptor>>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::List< ::piper::OutputDescriptor>::Builder ConfigurationResponse::Builder::initOutputs(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::OutputDescriptor>>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void ConfigurationResponse::Builder::adoptOutputs( ::capnp::Orphan< ::capnp::List< ::piper::OutputDescriptor>>&& value) { ::capnp::_::PointerHelpers< ::capnp::List< ::piper::OutputDescriptor>>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::List< ::piper::OutputDescriptor>> ConfigurationResponse::Builder::disownOutputs() { return ::capnp::_::PointerHelpers< ::capnp::List< ::piper::OutputDescriptor>>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool ConfigurationResponse::Reader::hasFraming() const { return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool ConfigurationResponse::Builder::hasFraming() { return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::Framing::Reader ConfigurationResponse::Reader::getFraming() const { return ::capnp::_::PointerHelpers< ::piper::Framing>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::Framing::Builder ConfigurationResponse::Builder::getFraming() { return ::capnp::_::PointerHelpers< ::piper::Framing>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::Framing::Pipeline ConfigurationResponse::Pipeline::getFraming() { return ::piper::Framing::Pipeline(_typeless.getPointerField(1)); } #endif // !CAPNP_LITE inline void ConfigurationResponse::Builder::setFraming( ::piper::Framing::Reader value) { ::capnp::_::PointerHelpers< ::piper::Framing>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::Framing::Builder ConfigurationResponse::Builder::initFraming() { return ::capnp::_::PointerHelpers< ::piper::Framing>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void ConfigurationResponse::Builder::adoptFraming( ::capnp::Orphan< ::piper::Framing>&& value) { ::capnp::_::PointerHelpers< ::piper::Framing>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Framing> ConfigurationResponse::Builder::disownFraming() { return ::capnp::_::PointerHelpers< ::piper::Framing>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::int32_t ProcessRequest::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t ProcessRequest::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ProcessRequest::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool ProcessRequest::Reader::hasProcessInput() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ProcessRequest::Builder::hasProcessInput() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::ProcessInput::Reader ProcessRequest::Reader::getProcessInput() const { return ::capnp::_::PointerHelpers< ::piper::ProcessInput>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::ProcessInput::Builder ProcessRequest::Builder::getProcessInput() { return ::capnp::_::PointerHelpers< ::piper::ProcessInput>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::ProcessInput::Pipeline ProcessRequest::Pipeline::getProcessInput() { return ::piper::ProcessInput::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void ProcessRequest::Builder::setProcessInput( ::piper::ProcessInput::Reader value) { ::capnp::_::PointerHelpers< ::piper::ProcessInput>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::ProcessInput::Builder ProcessRequest::Builder::initProcessInput() { return ::capnp::_::PointerHelpers< ::piper::ProcessInput>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ProcessRequest::Builder::adoptProcessInput( ::capnp::Orphan< ::piper::ProcessInput>&& value) { ::capnp::_::PointerHelpers< ::piper::ProcessInput>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ProcessInput> ProcessRequest::Builder::disownProcessInput() { return ::capnp::_::PointerHelpers< ::piper::ProcessInput>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::int32_t ProcessResponse::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t ProcessResponse::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void ProcessResponse::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool ProcessResponse::Reader::hasFeatures() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool ProcessResponse::Builder::hasFeatures() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::FeatureSet::Reader ProcessResponse::Reader::getFeatures() const { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::FeatureSet::Builder ProcessResponse::Builder::getFeatures() { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::FeatureSet::Pipeline ProcessResponse::Pipeline::getFeatures() { return ::piper::FeatureSet::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void ProcessResponse::Builder::setFeatures( ::piper::FeatureSet::Reader value) { ::capnp::_::PointerHelpers< ::piper::FeatureSet>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::FeatureSet::Builder ProcessResponse::Builder::initFeatures() { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void ProcessResponse::Builder::adoptFeatures( ::capnp::Orphan< ::piper::FeatureSet>&& value) { ::capnp::_::PointerHelpers< ::piper::FeatureSet>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::FeatureSet> ProcessResponse::Builder::disownFeatures() { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::int32_t FinishRequest::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t FinishRequest::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void FinishRequest::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline ::int32_t FinishResponse::Reader::getHandle() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t FinishResponse::Builder::getHandle() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void FinishResponse::Builder::setHandle( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool FinishResponse::Reader::hasFeatures() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool FinishResponse::Builder::hasFeatures() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::piper::FeatureSet::Reader FinishResponse::Reader::getFeatures() const { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::piper::FeatureSet::Builder FinishResponse::Builder::getFeatures() { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } #if !CAPNP_LITE inline ::piper::FeatureSet::Pipeline FinishResponse::Pipeline::getFeatures() { return ::piper::FeatureSet::Pipeline(_typeless.getPointerField(0)); } #endif // !CAPNP_LITE inline void FinishResponse::Builder::setFeatures( ::piper::FeatureSet::Reader value) { ::capnp::_::PointerHelpers< ::piper::FeatureSet>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::piper::FeatureSet::Builder FinishResponse::Builder::initFeatures() { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void FinishResponse::Builder::adoptFeatures( ::capnp::Orphan< ::piper::FeatureSet>&& value) { ::capnp::_::PointerHelpers< ::piper::FeatureSet>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::FeatureSet> FinishResponse::Builder::disownFeatures() { return ::capnp::_::PointerHelpers< ::piper::FeatureSet>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::int32_t Error::Reader::getCode() const { return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t Error::Builder::getCode() { return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void Error::Builder::setCode( ::int32_t value) { _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool Error::Reader::hasMessage() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool Error::Builder::hasMessage() { return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader Error::Reader::getMessage() const { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder Error::Builder::getMessage() { return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void Error::Builder::setMessage( ::capnp::Text::Reader value) { ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder Error::Builder::initMessage(unsigned int size) { return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void Error::Builder::adoptMessage( ::capnp::Orphan< ::capnp::Text>&& value) { ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> Error::Builder::disownMessage() { return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline typename RpcRequest::Id::Reader RpcRequest::Reader::getId() const { return typename RpcRequest::Id::Reader(_reader); } inline typename RpcRequest::Id::Builder RpcRequest::Builder::getId() { return typename RpcRequest::Id::Builder(_builder); } #if !CAPNP_LITE inline typename RpcRequest::Id::Pipeline RpcRequest::Pipeline::getId() { return typename RpcRequest::Id::Pipeline(_typeless.noop()); } #endif // !CAPNP_LITE inline typename RpcRequest::Id::Builder RpcRequest::Builder::initId() { _builder.setDataField< ::uint32_t>(::capnp::bounded<0>() * ::capnp::ELEMENTS, 0); _builder.setDataField< ::uint16_t>(::capnp::bounded<2>() * ::capnp::ELEMENTS, 0); _builder.getPointerField(::capnp::bounded<0>() * ::capnp::POINTERS).clear(); return typename RpcRequest::Id::Builder(_builder); } inline typename RpcRequest::Request::Reader RpcRequest::Reader::getRequest() const { return typename RpcRequest::Request::Reader(_reader); } inline typename RpcRequest::Request::Builder RpcRequest::Builder::getRequest() { return typename RpcRequest::Request::Builder(_builder); } #if !CAPNP_LITE inline typename RpcRequest::Request::Pipeline RpcRequest::Pipeline::getRequest() { return typename RpcRequest::Request::Pipeline(_typeless.noop()); } #endif // !CAPNP_LITE inline typename RpcRequest::Request::Builder RpcRequest::Builder::initRequest() { _builder.setDataField< ::uint16_t>(::capnp::bounded<3>() * ::capnp::ELEMENTS, 0); _builder.getPointerField(::capnp::bounded<1>() * ::capnp::POINTERS).clear(); return typename RpcRequest::Request::Builder(_builder); } inline ::piper::RpcRequest::Id::Which RpcRequest::Id::Reader::which() const { return _reader.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline ::piper::RpcRequest::Id::Which RpcRequest::Id::Builder::which() { return _builder.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline bool RpcRequest::Id::Reader::isNumber() const { return which() == RpcRequest::Id::NUMBER; } inline bool RpcRequest::Id::Builder::isNumber() { return which() == RpcRequest::Id::NUMBER; } inline ::int32_t RpcRequest::Id::Reader::getNumber() const { KJ_IREQUIRE((which() == RpcRequest::Id::NUMBER), "Must check which() before get()ing a union member."); return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t RpcRequest::Id::Builder::getNumber() { KJ_IREQUIRE((which() == RpcRequest::Id::NUMBER), "Must check which() before get()ing a union member."); return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void RpcRequest::Id::Builder::setNumber( ::int32_t value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcRequest::Id::NUMBER); _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool RpcRequest::Id::Reader::isTag() const { return which() == RpcRequest::Id::TAG; } inline bool RpcRequest::Id::Builder::isTag() { return which() == RpcRequest::Id::TAG; } inline bool RpcRequest::Id::Reader::hasTag() const { if (which() != RpcRequest::Id::TAG) return false; return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool RpcRequest::Id::Builder::hasTag() { if (which() != RpcRequest::Id::TAG) return false; return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader RpcRequest::Id::Reader::getTag() const { KJ_IREQUIRE((which() == RpcRequest::Id::TAG), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder RpcRequest::Id::Builder::getTag() { KJ_IREQUIRE((which() == RpcRequest::Id::TAG), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void RpcRequest::Id::Builder::setTag( ::capnp::Text::Reader value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcRequest::Id::TAG); ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder RpcRequest::Id::Builder::initTag(unsigned int size) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcRequest::Id::TAG); return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void RpcRequest::Id::Builder::adoptTag( ::capnp::Orphan< ::capnp::Text>&& value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcRequest::Id::TAG); ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> RpcRequest::Id::Builder::disownTag() { KJ_IREQUIRE((which() == RpcRequest::Id::TAG), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool RpcRequest::Id::Reader::isNone() const { return which() == RpcRequest::Id::NONE; } inline bool RpcRequest::Id::Builder::isNone() { return which() == RpcRequest::Id::NONE; } inline ::capnp::Void RpcRequest::Id::Reader::getNone() const { KJ_IREQUIRE((which() == RpcRequest::Id::NONE), "Must check which() before get()ing a union member."); return _reader.getDataField< ::capnp::Void>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::capnp::Void RpcRequest::Id::Builder::getNone() { KJ_IREQUIRE((which() == RpcRequest::Id::NONE), "Must check which() before get()ing a union member."); return _builder.getDataField< ::capnp::Void>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void RpcRequest::Id::Builder::setNone( ::capnp::Void value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcRequest::Id::NONE); _builder.setDataField< ::capnp::Void>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline ::piper::RpcRequest::Request::Which RpcRequest::Request::Reader::which() const { return _reader.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline ::piper::RpcRequest::Request::Which RpcRequest::Request::Builder::which() { return _builder.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline bool RpcRequest::Request::Reader::isList() const { return which() == RpcRequest::Request::LIST; } inline bool RpcRequest::Request::Builder::isList() { return which() == RpcRequest::Request::LIST; } inline bool RpcRequest::Request::Reader::hasList() const { if (which() != RpcRequest::Request::LIST) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcRequest::Request::Builder::hasList() { if (which() != RpcRequest::Request::LIST) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ListRequest::Reader RpcRequest::Request::Reader::getList() const { KJ_IREQUIRE((which() == RpcRequest::Request::LIST), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ListRequest>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ListRequest::Builder RpcRequest::Request::Builder::getList() { KJ_IREQUIRE((which() == RpcRequest::Request::LIST), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ListRequest>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::setList( ::piper::ListRequest::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::LIST); ::capnp::_::PointerHelpers< ::piper::ListRequest>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ListRequest::Builder RpcRequest::Request::Builder::initList() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::LIST); return ::capnp::_::PointerHelpers< ::piper::ListRequest>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::adoptList( ::capnp::Orphan< ::piper::ListRequest>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::LIST); ::capnp::_::PointerHelpers< ::piper::ListRequest>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ListRequest> RpcRequest::Request::Builder::disownList() { KJ_IREQUIRE((which() == RpcRequest::Request::LIST), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ListRequest>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcRequest::Request::Reader::isLoad() const { return which() == RpcRequest::Request::LOAD; } inline bool RpcRequest::Request::Builder::isLoad() { return which() == RpcRequest::Request::LOAD; } inline bool RpcRequest::Request::Reader::hasLoad() const { if (which() != RpcRequest::Request::LOAD) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcRequest::Request::Builder::hasLoad() { if (which() != RpcRequest::Request::LOAD) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::LoadRequest::Reader RpcRequest::Request::Reader::getLoad() const { KJ_IREQUIRE((which() == RpcRequest::Request::LOAD), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::LoadRequest>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::LoadRequest::Builder RpcRequest::Request::Builder::getLoad() { KJ_IREQUIRE((which() == RpcRequest::Request::LOAD), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::LoadRequest>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::setLoad( ::piper::LoadRequest::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::LOAD); ::capnp::_::PointerHelpers< ::piper::LoadRequest>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::LoadRequest::Builder RpcRequest::Request::Builder::initLoad() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::LOAD); return ::capnp::_::PointerHelpers< ::piper::LoadRequest>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::adoptLoad( ::capnp::Orphan< ::piper::LoadRequest>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::LOAD); ::capnp::_::PointerHelpers< ::piper::LoadRequest>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::LoadRequest> RpcRequest::Request::Builder::disownLoad() { KJ_IREQUIRE((which() == RpcRequest::Request::LOAD), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::LoadRequest>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcRequest::Request::Reader::isConfigure() const { return which() == RpcRequest::Request::CONFIGURE; } inline bool RpcRequest::Request::Builder::isConfigure() { return which() == RpcRequest::Request::CONFIGURE; } inline bool RpcRequest::Request::Reader::hasConfigure() const { if (which() != RpcRequest::Request::CONFIGURE) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcRequest::Request::Builder::hasConfigure() { if (which() != RpcRequest::Request::CONFIGURE) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ConfigurationRequest::Reader RpcRequest::Request::Reader::getConfigure() const { KJ_IREQUIRE((which() == RpcRequest::Request::CONFIGURE), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ConfigurationRequest>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ConfigurationRequest::Builder RpcRequest::Request::Builder::getConfigure() { KJ_IREQUIRE((which() == RpcRequest::Request::CONFIGURE), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ConfigurationRequest>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::setConfigure( ::piper::ConfigurationRequest::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::CONFIGURE); ::capnp::_::PointerHelpers< ::piper::ConfigurationRequest>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ConfigurationRequest::Builder RpcRequest::Request::Builder::initConfigure() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::CONFIGURE); return ::capnp::_::PointerHelpers< ::piper::ConfigurationRequest>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::adoptConfigure( ::capnp::Orphan< ::piper::ConfigurationRequest>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::CONFIGURE); ::capnp::_::PointerHelpers< ::piper::ConfigurationRequest>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ConfigurationRequest> RpcRequest::Request::Builder::disownConfigure() { KJ_IREQUIRE((which() == RpcRequest::Request::CONFIGURE), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ConfigurationRequest>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcRequest::Request::Reader::isProcess() const { return which() == RpcRequest::Request::PROCESS; } inline bool RpcRequest::Request::Builder::isProcess() { return which() == RpcRequest::Request::PROCESS; } inline bool RpcRequest::Request::Reader::hasProcess() const { if (which() != RpcRequest::Request::PROCESS) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcRequest::Request::Builder::hasProcess() { if (which() != RpcRequest::Request::PROCESS) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ProcessRequest::Reader RpcRequest::Request::Reader::getProcess() const { KJ_IREQUIRE((which() == RpcRequest::Request::PROCESS), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ProcessRequest>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ProcessRequest::Builder RpcRequest::Request::Builder::getProcess() { KJ_IREQUIRE((which() == RpcRequest::Request::PROCESS), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ProcessRequest>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::setProcess( ::piper::ProcessRequest::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::PROCESS); ::capnp::_::PointerHelpers< ::piper::ProcessRequest>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ProcessRequest::Builder RpcRequest::Request::Builder::initProcess() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::PROCESS); return ::capnp::_::PointerHelpers< ::piper::ProcessRequest>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::adoptProcess( ::capnp::Orphan< ::piper::ProcessRequest>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::PROCESS); ::capnp::_::PointerHelpers< ::piper::ProcessRequest>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ProcessRequest> RpcRequest::Request::Builder::disownProcess() { KJ_IREQUIRE((which() == RpcRequest::Request::PROCESS), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ProcessRequest>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcRequest::Request::Reader::isFinish() const { return which() == RpcRequest::Request::FINISH; } inline bool RpcRequest::Request::Builder::isFinish() { return which() == RpcRequest::Request::FINISH; } inline bool RpcRequest::Request::Reader::hasFinish() const { if (which() != RpcRequest::Request::FINISH) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcRequest::Request::Builder::hasFinish() { if (which() != RpcRequest::Request::FINISH) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::FinishRequest::Reader RpcRequest::Request::Reader::getFinish() const { KJ_IREQUIRE((which() == RpcRequest::Request::FINISH), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::FinishRequest>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::FinishRequest::Builder RpcRequest::Request::Builder::getFinish() { KJ_IREQUIRE((which() == RpcRequest::Request::FINISH), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::FinishRequest>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::setFinish( ::piper::FinishRequest::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::FINISH); ::capnp::_::PointerHelpers< ::piper::FinishRequest>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::FinishRequest::Builder RpcRequest::Request::Builder::initFinish() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::FINISH); return ::capnp::_::PointerHelpers< ::piper::FinishRequest>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcRequest::Request::Builder::adoptFinish( ::capnp::Orphan< ::piper::FinishRequest>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcRequest::Request::FINISH); ::capnp::_::PointerHelpers< ::piper::FinishRequest>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::FinishRequest> RpcRequest::Request::Builder::disownFinish() { KJ_IREQUIRE((which() == RpcRequest::Request::FINISH), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::FinishRequest>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline typename RpcResponse::Id::Reader RpcResponse::Reader::getId() const { return typename RpcResponse::Id::Reader(_reader); } inline typename RpcResponse::Id::Builder RpcResponse::Builder::getId() { return typename RpcResponse::Id::Builder(_builder); } #if !CAPNP_LITE inline typename RpcResponse::Id::Pipeline RpcResponse::Pipeline::getId() { return typename RpcResponse::Id::Pipeline(_typeless.noop()); } #endif // !CAPNP_LITE inline typename RpcResponse::Id::Builder RpcResponse::Builder::initId() { _builder.setDataField< ::uint32_t>(::capnp::bounded<0>() * ::capnp::ELEMENTS, 0); _builder.setDataField< ::uint16_t>(::capnp::bounded<2>() * ::capnp::ELEMENTS, 0); _builder.getPointerField(::capnp::bounded<0>() * ::capnp::POINTERS).clear(); return typename RpcResponse::Id::Builder(_builder); } inline typename RpcResponse::Response::Reader RpcResponse::Reader::getResponse() const { return typename RpcResponse::Response::Reader(_reader); } inline typename RpcResponse::Response::Builder RpcResponse::Builder::getResponse() { return typename RpcResponse::Response::Builder(_builder); } #if !CAPNP_LITE inline typename RpcResponse::Response::Pipeline RpcResponse::Pipeline::getResponse() { return typename RpcResponse::Response::Pipeline(_typeless.noop()); } #endif // !CAPNP_LITE inline typename RpcResponse::Response::Builder RpcResponse::Builder::initResponse() { _builder.setDataField< ::uint16_t>(::capnp::bounded<3>() * ::capnp::ELEMENTS, 0); _builder.getPointerField(::capnp::bounded<1>() * ::capnp::POINTERS).clear(); return typename RpcResponse::Response::Builder(_builder); } inline ::piper::RpcResponse::Id::Which RpcResponse::Id::Reader::which() const { return _reader.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline ::piper::RpcResponse::Id::Which RpcResponse::Id::Builder::which() { return _builder.getDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS); } inline bool RpcResponse::Id::Reader::isNumber() const { return which() == RpcResponse::Id::NUMBER; } inline bool RpcResponse::Id::Builder::isNumber() { return which() == RpcResponse::Id::NUMBER; } inline ::int32_t RpcResponse::Id::Reader::getNumber() const { KJ_IREQUIRE((which() == RpcResponse::Id::NUMBER), "Must check which() before get()ing a union member."); return _reader.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::int32_t RpcResponse::Id::Builder::getNumber() { KJ_IREQUIRE((which() == RpcResponse::Id::NUMBER), "Must check which() before get()ing a union member."); return _builder.getDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void RpcResponse::Id::Builder::setNumber( ::int32_t value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcResponse::Id::NUMBER); _builder.setDataField< ::int32_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline bool RpcResponse::Id::Reader::isTag() const { return which() == RpcResponse::Id::TAG; } inline bool RpcResponse::Id::Builder::isTag() { return which() == RpcResponse::Id::TAG; } inline bool RpcResponse::Id::Reader::hasTag() const { if (which() != RpcResponse::Id::TAG) return false; return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Id::Builder::hasTag() { if (which() != RpcResponse::Id::TAG) return false; return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } inline ::capnp::Text::Reader RpcResponse::Id::Reader::getTag() const { KJ_IREQUIRE((which() == RpcResponse::Id::TAG), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline ::capnp::Text::Builder RpcResponse::Id::Builder::getTag() { KJ_IREQUIRE((which() == RpcResponse::Id::TAG), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline void RpcResponse::Id::Builder::setTag( ::capnp::Text::Reader value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcResponse::Id::TAG); ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } inline ::capnp::Text::Builder RpcResponse::Id::Builder::initTag(unsigned int size) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcResponse::Id::TAG); return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), size); } inline void RpcResponse::Id::Builder::adoptTag( ::capnp::Orphan< ::capnp::Text>&& value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcResponse::Id::TAG); ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::capnp::Text> RpcResponse::Id::Builder::disownTag() { KJ_IREQUIRE((which() == RpcResponse::Id::TAG), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } inline bool RpcResponse::Id::Reader::isNone() const { return which() == RpcResponse::Id::NONE; } inline bool RpcResponse::Id::Builder::isNone() { return which() == RpcResponse::Id::NONE; } inline ::capnp::Void RpcResponse::Id::Reader::getNone() const { KJ_IREQUIRE((which() == RpcResponse::Id::NONE), "Must check which() before get()ing a union member."); return _reader.getDataField< ::capnp::Void>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline ::capnp::Void RpcResponse::Id::Builder::getNone() { KJ_IREQUIRE((which() == RpcResponse::Id::NONE), "Must check which() before get()ing a union member."); return _builder.getDataField< ::capnp::Void>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); } inline void RpcResponse::Id::Builder::setNone( ::capnp::Void value) { _builder.setDataField( ::capnp::bounded<2>() * ::capnp::ELEMENTS, RpcResponse::Id::NONE); _builder.setDataField< ::capnp::Void>( ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); } inline ::piper::RpcResponse::Response::Which RpcResponse::Response::Reader::which() const { return _reader.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline ::piper::RpcResponse::Response::Which RpcResponse::Response::Builder::which() { return _builder.getDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS); } inline bool RpcResponse::Response::Reader::isError() const { return which() == RpcResponse::Response::ERROR; } inline bool RpcResponse::Response::Builder::isError() { return which() == RpcResponse::Response::ERROR; } inline bool RpcResponse::Response::Reader::hasError() const { if (which() != RpcResponse::Response::ERROR) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Response::Builder::hasError() { if (which() != RpcResponse::Response::ERROR) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::Error::Reader RpcResponse::Response::Reader::getError() const { KJ_IREQUIRE((which() == RpcResponse::Response::ERROR), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::Error>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::Error::Builder RpcResponse::Response::Builder::getError() { KJ_IREQUIRE((which() == RpcResponse::Response::ERROR), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::Error>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::setError( ::piper::Error::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::ERROR); ::capnp::_::PointerHelpers< ::piper::Error>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::Error::Builder RpcResponse::Response::Builder::initError() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::ERROR); return ::capnp::_::PointerHelpers< ::piper::Error>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::adoptError( ::capnp::Orphan< ::piper::Error>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::ERROR); ::capnp::_::PointerHelpers< ::piper::Error>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::Error> RpcResponse::Response::Builder::disownError() { KJ_IREQUIRE((which() == RpcResponse::Response::ERROR), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::Error>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcResponse::Response::Reader::isList() const { return which() == RpcResponse::Response::LIST; } inline bool RpcResponse::Response::Builder::isList() { return which() == RpcResponse::Response::LIST; } inline bool RpcResponse::Response::Reader::hasList() const { if (which() != RpcResponse::Response::LIST) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Response::Builder::hasList() { if (which() != RpcResponse::Response::LIST) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ListResponse::Reader RpcResponse::Response::Reader::getList() const { KJ_IREQUIRE((which() == RpcResponse::Response::LIST), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ListResponse>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ListResponse::Builder RpcResponse::Response::Builder::getList() { KJ_IREQUIRE((which() == RpcResponse::Response::LIST), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ListResponse>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::setList( ::piper::ListResponse::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::LIST); ::capnp::_::PointerHelpers< ::piper::ListResponse>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ListResponse::Builder RpcResponse::Response::Builder::initList() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::LIST); return ::capnp::_::PointerHelpers< ::piper::ListResponse>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::adoptList( ::capnp::Orphan< ::piper::ListResponse>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::LIST); ::capnp::_::PointerHelpers< ::piper::ListResponse>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ListResponse> RpcResponse::Response::Builder::disownList() { KJ_IREQUIRE((which() == RpcResponse::Response::LIST), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ListResponse>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcResponse::Response::Reader::isLoad() const { return which() == RpcResponse::Response::LOAD; } inline bool RpcResponse::Response::Builder::isLoad() { return which() == RpcResponse::Response::LOAD; } inline bool RpcResponse::Response::Reader::hasLoad() const { if (which() != RpcResponse::Response::LOAD) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Response::Builder::hasLoad() { if (which() != RpcResponse::Response::LOAD) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::LoadResponse::Reader RpcResponse::Response::Reader::getLoad() const { KJ_IREQUIRE((which() == RpcResponse::Response::LOAD), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::LoadResponse>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::LoadResponse::Builder RpcResponse::Response::Builder::getLoad() { KJ_IREQUIRE((which() == RpcResponse::Response::LOAD), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::LoadResponse>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::setLoad( ::piper::LoadResponse::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::LOAD); ::capnp::_::PointerHelpers< ::piper::LoadResponse>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::LoadResponse::Builder RpcResponse::Response::Builder::initLoad() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::LOAD); return ::capnp::_::PointerHelpers< ::piper::LoadResponse>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::adoptLoad( ::capnp::Orphan< ::piper::LoadResponse>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::LOAD); ::capnp::_::PointerHelpers< ::piper::LoadResponse>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::LoadResponse> RpcResponse::Response::Builder::disownLoad() { KJ_IREQUIRE((which() == RpcResponse::Response::LOAD), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::LoadResponse>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcResponse::Response::Reader::isConfigure() const { return which() == RpcResponse::Response::CONFIGURE; } inline bool RpcResponse::Response::Builder::isConfigure() { return which() == RpcResponse::Response::CONFIGURE; } inline bool RpcResponse::Response::Reader::hasConfigure() const { if (which() != RpcResponse::Response::CONFIGURE) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Response::Builder::hasConfigure() { if (which() != RpcResponse::Response::CONFIGURE) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ConfigurationResponse::Reader RpcResponse::Response::Reader::getConfigure() const { KJ_IREQUIRE((which() == RpcResponse::Response::CONFIGURE), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ConfigurationResponse>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ConfigurationResponse::Builder RpcResponse::Response::Builder::getConfigure() { KJ_IREQUIRE((which() == RpcResponse::Response::CONFIGURE), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ConfigurationResponse>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::setConfigure( ::piper::ConfigurationResponse::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::CONFIGURE); ::capnp::_::PointerHelpers< ::piper::ConfigurationResponse>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ConfigurationResponse::Builder RpcResponse::Response::Builder::initConfigure() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::CONFIGURE); return ::capnp::_::PointerHelpers< ::piper::ConfigurationResponse>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::adoptConfigure( ::capnp::Orphan< ::piper::ConfigurationResponse>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::CONFIGURE); ::capnp::_::PointerHelpers< ::piper::ConfigurationResponse>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ConfigurationResponse> RpcResponse::Response::Builder::disownConfigure() { KJ_IREQUIRE((which() == RpcResponse::Response::CONFIGURE), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ConfigurationResponse>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcResponse::Response::Reader::isProcess() const { return which() == RpcResponse::Response::PROCESS; } inline bool RpcResponse::Response::Builder::isProcess() { return which() == RpcResponse::Response::PROCESS; } inline bool RpcResponse::Response::Reader::hasProcess() const { if (which() != RpcResponse::Response::PROCESS) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Response::Builder::hasProcess() { if (which() != RpcResponse::Response::PROCESS) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::ProcessResponse::Reader RpcResponse::Response::Reader::getProcess() const { KJ_IREQUIRE((which() == RpcResponse::Response::PROCESS), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ProcessResponse>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::ProcessResponse::Builder RpcResponse::Response::Builder::getProcess() { KJ_IREQUIRE((which() == RpcResponse::Response::PROCESS), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ProcessResponse>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::setProcess( ::piper::ProcessResponse::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::PROCESS); ::capnp::_::PointerHelpers< ::piper::ProcessResponse>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::ProcessResponse::Builder RpcResponse::Response::Builder::initProcess() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::PROCESS); return ::capnp::_::PointerHelpers< ::piper::ProcessResponse>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::adoptProcess( ::capnp::Orphan< ::piper::ProcessResponse>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::PROCESS); ::capnp::_::PointerHelpers< ::piper::ProcessResponse>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::ProcessResponse> RpcResponse::Response::Builder::disownProcess() { KJ_IREQUIRE((which() == RpcResponse::Response::PROCESS), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::ProcessResponse>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline bool RpcResponse::Response::Reader::isFinish() const { return which() == RpcResponse::Response::FINISH; } inline bool RpcResponse::Response::Builder::isFinish() { return which() == RpcResponse::Response::FINISH; } inline bool RpcResponse::Response::Reader::hasFinish() const { if (which() != RpcResponse::Response::FINISH) return false; return !_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline bool RpcResponse::Response::Builder::hasFinish() { if (which() != RpcResponse::Response::FINISH) return false; return !_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); } inline ::piper::FinishResponse::Reader RpcResponse::Response::Reader::getFinish() const { KJ_IREQUIRE((which() == RpcResponse::Response::FINISH), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::FinishResponse>::get(_reader.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline ::piper::FinishResponse::Builder RpcResponse::Response::Builder::getFinish() { KJ_IREQUIRE((which() == RpcResponse::Response::FINISH), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::FinishResponse>::get(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::setFinish( ::piper::FinishResponse::Reader value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::FINISH); ::capnp::_::PointerHelpers< ::piper::FinishResponse>::set(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), value); } inline ::piper::FinishResponse::Builder RpcResponse::Response::Builder::initFinish() { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::FINISH); return ::capnp::_::PointerHelpers< ::piper::FinishResponse>::init(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } inline void RpcResponse::Response::Builder::adoptFinish( ::capnp::Orphan< ::piper::FinishResponse>&& value) { _builder.setDataField( ::capnp::bounded<3>() * ::capnp::ELEMENTS, RpcResponse::Response::FINISH); ::capnp::_::PointerHelpers< ::piper::FinishResponse>::adopt(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); } inline ::capnp::Orphan< ::piper::FinishResponse> RpcResponse::Response::Builder::disownFinish() { KJ_IREQUIRE((which() == RpcResponse::Response::FINISH), "Must check which() before get()ing a union member."); return ::capnp::_::PointerHelpers< ::piper::FinishResponse>::disown(_builder.getPointerField( ::capnp::bounded<1>() * ::capnp::POINTERS)); } } // namespace #endif // CAPNP_INCLUDED_c4b1c6c44c999206_ sonic-visualiser-3.0.3/piper-cpp/vamp-client/CapnpRRClient.h0000644000000000000000000004165513111512442022102 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_CAPNP_CLIENT_H #define PIPER_CAPNP_CLIENT_H #include "Loader.h" #include "PluginClient.h" #include "PiperVampPlugin.h" #include "SynchronousTransport.h" #include "vamp-support/AssignedPluginHandleMapper.h" #include "vamp-capnp/VampnProto.h" #include #include //#define LOG_ENTRYPOINTS 1 #ifdef LOG_ENTRYPOINTS #define LOG_E(x) log(x) #else #define LOG_E(x) #endif namespace piper_vamp { namespace client { /** * Client for a request-response Piper server, i.e. using the * RpcRequest/RpcResponse structures with a single process call rather * than having individual RPC methods, with a synchronous transport * such as a subprocess pipe arrangement. Only one request can be * handled at a time. This class is thread-safe if and only if it is * constructed with a thread-safe SynchronousTransport implementation. * * This class takes Vamp-like structures (Plugin and the classes in * vamp-support) and uses them to communicate with a Piper server * using the Cap'n Proto serialisation of the Piper API. The transport * layer (and thus the nature of the server) is defined by the * SynchronousTransport passed to the constructor. * * This class implements both the Loader interface (which constructs * PluginStub objects) and the PluginClient (which accepts PluginStubs * and maps them into Piper handles). */ class CapnpRRClient : public PluginClient, public Loader { // unsigned to avoid undefined behaviour on possible wrap typedef uint32_t ReqId; class CompletenessChecker : public MessageCompletenessChecker { public: State check(const std::vector &message) const override { if (message.size() < sizeof(capnp::word)) { return Incomplete; } auto karr = toKJArray(message); size_t words = karr.size(); size_t expected = capnp::expectedSizeInWordsFromPrefix(karr); // Lacking a way to definitively check whether a message // is valid or not, we would still like to trap obvious // cases where a programming mistake results in garbage // being returned from the server. We impose a limit on // message size and, if a prefix is projected to exceed // that limit, call it invalid. If an extractor wants to // return a feature set greater than a gigaword in size, // it'll just have to do it across multiple process calls. size_t limit = size_t(1) << 30; // cerr << "CompletenessChecker: message.size() = " << message.size() // << ", words = " << words << ", limit = " << limit << ", expected = " << expected << endl; if (words > expected) { std::cerr << "WARNING: obtained more data than expected (" << words << " " << sizeof(capnp::word) << "-byte words, expected " << expected << ")" << std::endl; return Complete; } else if (words == expected) { return Complete; } else if (expected > limit) { std::cerr << "WARNING: apparently invalid message prefix: have " << words << " words in prefix, projected message size is " << expected << " against limit of " << limit << std::endl; return Invalid; } else { return Incomplete; } } }; public: CapnpRRClient(SynchronousTransport *transport, //!!! ownership? shared ptr? LogCallback *logger) : // logger may be nullptr for cerr m_logger(logger), m_transport(transport), m_completenessChecker(new CompletenessChecker) { transport->setCompletenessChecker(m_completenessChecker); } ~CapnpRRClient() { delete m_completenessChecker; } //!!! obviously, factor out all repetitive guff //!!! list and load are supposed to be called by application code, //!!! but the rest are only supposed to be called by the plugin -- //!!! sort out the api here // Loader methods: ListResponse list(const ListRequest &req) override { LOG_E("CapnpRRClient::listPluginData called"); checkServerOK(); capnp::MallocMessageBuilder message; piper::RpcRequest::Builder builder = message.initRoot(); VampnProto::buildRpcRequest_List(builder, req); ReqId id = getId(); builder.getId().setNumber(id); auto karr = call(message, "list", true); capnp::FlatArrayMessageReader responseMessage(karr); piper::RpcResponse::Reader reader = responseMessage.getRoot(); checkResponseType(reader, piper::RpcResponse::Response::Which::LIST, id); ListResponse lr; VampnProto::readListResponse(lr, reader.getResponse().getList()); LOG_E("CapnpRRClient::listPluginData returning"); return lr; } LoadResponse load(const LoadRequest &req) override { LOG_E("CapnpRRClient::loadPlugin called"); checkServerOK(); LoadResponse resp; PluginHandleMapper::Handle handle = serverLoad(req.pluginKey, req.inputSampleRate, req.adapterFlags, resp.staticData, resp.defaultConfiguration); Vamp::Plugin *plugin = new PiperVampPlugin(this, req.pluginKey, req.inputSampleRate, req.adapterFlags, resp.staticData, resp.defaultConfiguration); m_mapper.addPlugin(handle, plugin); resp.plugin = plugin; LOG_E("CapnpRRClient::loadPlugin returning"); return resp; } // PluginClient methods: virtual ConfigurationResponse configure(PiperVampPlugin *plugin, PluginConfiguration config) override { LOG_E("CapnpRRClient::configure called"); checkServerOK(); ConfigurationRequest request; request.plugin = plugin; request.configuration = config; capnp::MallocMessageBuilder message; piper::RpcRequest::Builder builder = message.initRoot(); VampnProto::buildRpcRequest_Configure(builder, request, m_mapper); ReqId id = getId(); builder.getId().setNumber(id); auto karr = call(message, "configure", true); capnp::FlatArrayMessageReader responseMessage(karr); piper::RpcResponse::Reader reader = responseMessage.getRoot(); checkResponseType(reader, piper::RpcResponse::Response::Which::CONFIGURE, id); ConfigurationResponse cr; VampnProto::readConfigurationResponse(cr, reader.getResponse().getConfigure(), m_mapper); LOG_E("CapnpRRClient::configure returning"); return cr; }; virtual Vamp::Plugin::FeatureSet process(PiperVampPlugin *plugin, std::vector > inputBuffers, Vamp::RealTime timestamp) override { LOG_E("CapnpRRClient::process called"); checkServerOK(); ProcessRequest request; request.plugin = plugin; request.inputBuffers = inputBuffers; request.timestamp = timestamp; capnp::MallocMessageBuilder message; piper::RpcRequest::Builder builder = message.initRoot(); VampnProto::buildRpcRequest_Process(builder, request, m_mapper); ReqId id = getId(); builder.getId().setNumber(id); auto karr = call(message, "process", false); capnp::FlatArrayMessageReader responseMessage(karr); piper::RpcResponse::Reader reader = responseMessage.getRoot(); checkResponseType(reader, piper::RpcResponse::Response::Which::PROCESS, id); ProcessResponse pr; VampnProto::readProcessResponse(pr, reader.getResponse().getProcess(), m_mapper); LOG_E("CapnpRRClient::process returning"); return pr.features; } virtual Vamp::Plugin::FeatureSet finish(PiperVampPlugin *plugin) override { LOG_E("CapnpRRClient::finish called"); checkServerOK(); FinishRequest request; request.plugin = plugin; capnp::MallocMessageBuilder message; piper::RpcRequest::Builder builder = message.initRoot(); VampnProto::buildRpcRequest_Finish(builder, request, m_mapper); ReqId id = getId(); builder.getId().setNumber(id); auto karr = call(message, "finish", true); capnp::FlatArrayMessageReader responseMessage(karr); piper::RpcResponse::Reader reader = responseMessage.getRoot(); checkResponseType(reader, piper::RpcResponse::Response::Which::FINISH, id); FinishResponse pr; VampnProto::readFinishResponse(pr, reader.getResponse().getFinish(), m_mapper); m_mapper.removePlugin(m_mapper.pluginToHandle(plugin)); // Don't delete the plugin. It's the plugin that is supposed // to be calling us here LOG_E("CapnpRRClient::finish returning"); return pr.features; } virtual void reset(PiperVampPlugin *plugin, PluginConfiguration config) override { // Reload the plugin on the server side, and configure it as requested log("CapnpRRClient: reset() called, plugin will be closed and reloaded"); checkServerOK(); if (m_mapper.havePlugin(plugin)) { (void)finish(plugin); // server-side unload } PluginStaticData psd; PluginConfiguration defaultConfig; PluginHandleMapper::Handle handle = serverLoad(plugin->getPluginKey(), plugin->getInputSampleRate(), plugin->getAdapterFlags(), psd, defaultConfig); m_mapper.addPlugin(handle, plugin); (void)configure(plugin, config); } private: AssignedPluginHandleMapper m_mapper; ReqId getId() { //!!! todo: mutex static ReqId m_nextId = 0; return m_nextId++; } static kj::Array toKJArray(const std::vector &buffer) { // We could do this whole thing with fewer copies, but let's // see whether it matters first size_t wordSize = sizeof(capnp::word); size_t words = buffer.size() / wordSize; kj::Array karr(kj::heapArray(words)); memcpy(karr.begin(), buffer.data(), words * wordSize); return karr; } void checkServerOK() { if (!m_transport->isOK()) { log("Piper server crashed or failed to start (caller should have checked this)"); throw ServerCrashed(); } } /** * Check (i) that the response has the same id as supplied (which * presumably is the corresponding request id) and (ii) that the * response has the expected type. * * Return only if both of these things are the case. * * If the response has the right id but is an error response, * throw a ServiceError exception with the error response's * message in it. * * If the response has the wrong id, or if it has the wrong type * and is not an error response, throw ProtocolError. (i.e. for * cases having errors that are not conveyed through our official * error response.) */ void checkResponseType(const piper::RpcResponse::Reader &r, piper::RpcResponse::Response::Which type, ReqId id) { if (ReqId(r.getId().getNumber()) != id) { std::ostringstream s; s << "checkResponseType: wrong response id (received " << r.getId().getNumber() << ", expected " << id << ")"; log(s.str()); throw ProtocolError("Wrong response id"); } if (r.getResponse().which() != type) { if (r.getResponse().which() == piper::RpcResponse::Response::Which::ERROR) { int code; std::string message; VampnProto::readRpcResponse_Error(code, message, r); std::ostringstream s; s << "checkResponseType: received an error with message: " << message; log(s.str()); throw ServiceError(message); } else { std::ostringstream s; s << "checkResponseType: wrong response type (received " << int(r.getResponse().which()) << ", expected " << int(type) << ")"; log(s.str()); throw ProtocolError("Wrong response type"); } } } kj::Array call(capnp::MallocMessageBuilder &message, std::string type, bool slow) { auto arr = capnp::messageToFlatArray(message); auto responseBuffer = m_transport->call(arr.asChars().begin(), arr.asChars().size(), type, slow); return toKJArray(responseBuffer); } PluginHandleMapper::Handle serverLoad(std::string key, float inputSampleRate, int adapterFlags, PluginStaticData &psd, PluginConfiguration &defaultConfig) { LoadRequest request; request.pluginKey = key; request.inputSampleRate = inputSampleRate; request.adapterFlags = adapterFlags; capnp::MallocMessageBuilder message; piper::RpcRequest::Builder builder = message.initRoot(); VampnProto::buildRpcRequest_Load(builder, request); ReqId id = getId(); builder.getId().setNumber(id); auto karr = call(message, "load", false); capnp::FlatArrayMessageReader responseMessage(karr); piper::RpcResponse::Reader reader = responseMessage.getRoot(); checkResponseType(reader, piper::RpcResponse::Response::Which::LOAD, id); const piper::LoadResponse::Reader &lr = reader.getResponse().getLoad(); VampnProto::readExtractorStaticData(psd, lr.getStaticData()); VampnProto::readConfiguration(defaultConfig, lr.getDefaultConfiguration()); return lr.getHandle(); }; private: LogCallback *m_logger; SynchronousTransport *m_transport; //!!! I don't own this, but should I? CompletenessChecker *m_completenessChecker; // I own this void log(std::string message) const { if (m_logger) m_logger->log(message); else std::cerr << message << std::endl; } }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/Exceptions.h0000644000000000000000000000445513111512442021554 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_CLIENT_EXCEPTIONS_H #define PIPER_CLIENT_EXCEPTIONS_H #include #include namespace piper_vamp { namespace client { class ServerCrashed : public std::runtime_error { public: ServerCrashed() : std::runtime_error("Piper server exited unexpectedly") {} }; class RequestTimedOut : public std::runtime_error { public: RequestTimedOut() : std::runtime_error("Piper request timed out") {} }; class ProtocolError : public std::runtime_error { public: ProtocolError() : std::runtime_error("Piper protocol error") {} ProtocolError(const char *msg) : std::runtime_error(msg) {} }; class ServiceError : public std::runtime_error { public: ServiceError(std::string msg) : std::runtime_error(msg) {} }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/Loader.h0000644000000000000000000000360213111512442020632 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_LOADER_H #define PIPER_LOADER_H #include "vamp-support/RequestResponse.h" namespace piper_vamp { namespace client { class Loader { public: virtual ListResponse list(const ListRequest &) = 0; virtual LoadResponse load(const LoadRequest &) = 0; }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/PiperVampPlugin.h0000644000000000000000000003156513111512442022517 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2017 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_VAMP_PLUGIN_H #define PIPER_VAMP_PLUGIN_H #include #include #include "vamp-support/PluginStaticData.h" #include "vamp-support/PluginConfiguration.h" #include "PluginClient.h" #include #include namespace piper_vamp { namespace client { /** * PiperVampPlugin presents a Piper feature extractor in the form of a * Vamp plugin. */ class PiperVampPlugin : public Vamp::Plugin { enum State { /** * The plugin's corresponding Piper feature extractor has been * loaded but no subsequent state change has happened. This is * the initial state of PiperVampPlugin on construction, since * it is associated with a pre-loaded handle. */ Loaded, /** * The plugin has been configured, and the step and block size * received from the host in its last call to initialise() * match those that were returned in the configuration * response (i.e. the server's desired step and block * size). Our m_config record reflects these correct * values. The plugin is ready to process. */ Configured, /** * The plugin has been configured, but the step and block size * received from the host in its last call to initialise() * differ from those returned by the server in the * configuration response. Our initialise() call therefore * returned false, and the plugin cannot be used until the * host calls initialise() again with the "correct" step and * block size. Our m_config record reflects these correct * values, so the host can retrieve them through * getPreferredStepSize and getPreferredBlockSize. */ Misconfigured, /** * The finish() function has been called and the plugin * unloaded. No further plugin activity is possible. */ Finished, /** * A call has failed unrecoverably. No further plugin activity * is possible. */ Failed }; public: PiperVampPlugin(PluginClient *client, std::string pluginKey, float inputSampleRate, int adapterFlags, PluginStaticData psd, PluginConfiguration defaultConfig) : Plugin(inputSampleRate), m_client(client), m_key(pluginKey), m_adapterFlags(adapterFlags), m_state(Loaded), m_psd(psd), m_defaultConfig(defaultConfig), m_config(defaultConfig) { } virtual ~PiperVampPlugin() { if (m_state != Finished && m_state != Failed) { try { (void)m_client->finish(this); } catch (const std::exception &e) { // Finish can throw, but our destructor must not std::cerr << "WARNING: PiperVampPlugin::~PiperVampPlugin: caught exception from finish(): " << e.what() << std::endl; } } } virtual std::string getIdentifier() const { return m_psd.basic.identifier; } virtual std::string getName() const { return m_psd.basic.name; } virtual std::string getDescription() const { return m_psd.basic.description; } virtual std::string getMaker() const { return m_psd.maker; } virtual std::string getCopyright() const { return m_psd.copyright; } virtual int getPluginVersion() const { return m_psd.pluginVersion; } virtual ParameterList getParameterDescriptors() const { return m_psd.parameters; } virtual float getParameter(std::string name) const { if (m_config.parameterValues.find(name) != m_config.parameterValues.end()) { return m_config.parameterValues.at(name); } else { return 0.f; } } virtual void setParameter(std::string name, float value) { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state != Loaded) { m_state = Failed; throw std::logic_error("Can't set parameter after plugin initialised"); } m_config.parameterValues[name] = value; } virtual ProgramList getPrograms() const { return m_psd.programs; } virtual std::string getCurrentProgram() const { return m_config.currentProgram; } virtual void selectProgram(std::string program) { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state != Loaded) { m_state = Failed; throw std::logic_error("Can't select program after plugin initialised"); } m_config.currentProgram = program; } virtual bool initialise(size_t inputChannels, size_t stepSize, size_t blockSize) { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state == Misconfigured) { if (int(stepSize) == m_config.framing.stepSize && int(blockSize) == m_config.framing.blockSize) { m_state = Configured; return true; } else { return false; } } if (m_state != Loaded) { m_state = Failed; throw std::logic_error("Plugin has already been initialised"); } m_config.channelCount = int(inputChannels); m_config.framing.stepSize = int(stepSize); m_config.framing.blockSize = int(blockSize); try { auto response = m_client->configure(this, m_config); m_outputs = response.outputs; // Update with the new preferred step and block size now // that the plugin has taken into account its parameter // settings. If the values passed in to initialise() // weren't suitable, then this ensures that a subsequent // call to getPreferredStepSize/BlockSize on this plugin // object will at least get acceptable values from now on m_config.framing = response.framing; // And if they didn't match up with the passed-in ones, // lodge ourselves in Misconfigured state and report // failure so as to provoke the host to call initialise() // again before any processing. if (m_config.framing.stepSize != int(stepSize) || m_config.framing.blockSize != int(blockSize)) { m_state = Misconfigured; return false; } } catch (const std::exception &e) { m_state = Failed; throw; } if (!m_outputs.empty()) { m_state = Configured; return true; } else { return false; } } virtual void reset() { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state == Loaded || m_state == Misconfigured) { // reset is a no-op if the plugin hasn't been initialised yet return; } try { m_client->reset(this, m_config); } catch (const std::exception &e) { m_state = Failed; throw; } m_state = Configured; } virtual InputDomain getInputDomain() const { return m_psd.inputDomain; } virtual size_t getPreferredBlockSize() const { // Return this from m_config instead of m_defaultConfig, so // that it gets updated in the event of an initialise() call // that fails for the wrong value return m_config.framing.blockSize; } virtual size_t getPreferredStepSize() const { // Return this from m_config instead of m_defaultConfig, so // that it gets updated in the event of an initialise() call // that fails for the wrong value return m_config.framing.stepSize; } virtual size_t getMinChannelCount() const { return m_psd.minChannelCount; } virtual size_t getMaxChannelCount() const { return m_psd.maxChannelCount; } virtual OutputList getOutputDescriptors() const { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state == Configured) { return m_outputs; } //!!! todo: figure out for which hosts (and adapters?) it may //!!! be a problem that the output descriptors are incomplete //!!! here. Any such hosts/adapters are broken, but I bet they //!!! exist OutputList staticOutputs; for (const auto &o: m_psd.basicOutputInfo) { OutputDescriptor od; od.identifier = o.identifier; od.name = o.name; od.description = o.description; staticOutputs.push_back(od); } return staticOutputs; } virtual FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp) { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state == Loaded || m_state == Misconfigured) { m_state = Failed; throw std::logic_error("Plugin has not been initialised"); } if (m_state == Finished) { m_state = Failed; throw std::logic_error("Plugin has already been disposed of"); } std::vector > vecbuf; for (int c = 0; c < m_config.channelCount; ++c) { vecbuf.push_back(std::vector (inputBuffers[c], inputBuffers[c] + m_config.framing.blockSize)); } try { return m_client->process(this, vecbuf, timestamp); } catch (const std::exception &e) { m_state = Failed; throw; } } virtual FeatureSet getRemainingFeatures() { if (m_state == Failed) { throw std::logic_error("Plugin is in failed state"); } if (m_state == Loaded || m_state == Misconfigured) { m_state = Failed; throw std::logic_error("Plugin has not been configured"); } if (m_state == Finished) { m_state = Failed; throw std::logic_error("Plugin has already been disposed of"); } m_state = Finished; try { return m_client->finish(this); } catch (const std::exception &e) { m_state = Failed; throw; } } // Not Plugin methods, but needed by the PluginClient to support reloads: virtual float getInputSampleRate() const { return m_inputSampleRate; } virtual std::string getPluginKey() const { return m_key; } virtual int getAdapterFlags() const { return m_adapterFlags; } private: PluginClient *m_client; std::string m_key; int m_adapterFlags; State m_state; PluginStaticData m_psd; OutputList m_outputs; PluginConfiguration m_defaultConfig; PluginConfiguration m_config; }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/PluginClient.h0000644000000000000000000000474713111512442022034 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PLUGIN_CLIENT_H #define PIPER_PLUGIN_CLIENT_H #include "vamp-support/PluginConfiguration.h" namespace piper_vamp { namespace client { class PiperVampPlugin; /** * Interface for a client that accepts Vamp-like structures (Plugin * and the classes in vamp-support) and communicates with a Piper * server, using some serialisation and transport defined by the * specific implementation. */ class PluginClient { public: virtual ConfigurationResponse configure(PiperVampPlugin *plugin, PluginConfiguration config) = 0; virtual Vamp::Plugin::FeatureSet process(PiperVampPlugin *plugin, std::vector > inputBuffers, Vamp::RealTime timestamp) = 0; virtual Vamp::Plugin::FeatureSet finish(PiperVampPlugin *plugin) = 0; virtual void reset(PiperVampPlugin *plugin, PluginConfiguration config) = 0; }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/SynchronousTransport.h0000644000000000000000000000706713111512442023704 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_SYNCHRONOUS_TRANSPORT_H #define PIPER_SYNCHRONOUS_TRANSPORT_H #include #include #include namespace piper_vamp { namespace client { class MessageCompletenessChecker // interface { public: enum State { Complete, Incomplete, Invalid }; virtual ~MessageCompletenessChecker() = default; virtual State check(const std::vector &message) const = 0; }; class LogCallback { public: virtual ~LogCallback() { } virtual void log(std::string) const = 0; }; class SynchronousTransport // interface { public: virtual ~SynchronousTransport() = default; /** * Set a completeness checker object. The caller retains ownership * of the checker and must ensure its lifespan outlives the transport. */ virtual void setCompletenessChecker(MessageCompletenessChecker *) = 0; /** * Make a synchronous call, passing a serialised request in the data array * of length bytes, and return the result. * * The type field is only used for logging and debug output. * * The slow flag is a hint that the recipient may take longer than usual * to process this request and so the caller may wish to be more relaxed * about idling to wait for the reply. (This shouldn't make any difference * with a sensible blocking network API, but you never know...) * * May throw ServerCrashed if the server endpoint disappeared during the * call. Throws std::logic_error if isOK() is not true at the time of * calling, so check that before you call. */ virtual std::vector call(const char *data, size_t bytes, std::string type, bool slow) = 0; /** * Check whether the transport was initialised correctly and is working. * This will return false if the endpoint could not be initialised or * the endpoint service has crashed or become unavailable. Always check * this before using call(). */ virtual bool isOK() const = 0; }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/qt/PiperAutoPlugin.h0000644000000000000000000001644713111512442023152 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2017 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_AUTO_PLUGIN_H #define PIPER_AUTO_PLUGIN_H #include "ProcessQtTransport.h" #include "../CapnpRRClient.h" #include "../Exceptions.h" #include namespace piper_vamp { namespace client { /** * AutoPlugin presents a Piper feature extractor in the form of a Vamp * plugin, managing its own single-use server instance. That is, the * distinguishing quality of AutoPlugin (in comparison with * PluginStub) is that it runs and terminates its own Piper server, * whose lifetime matches that of the plugin. * * Example usage: * * Vamp::Plugin *plugin = * new AutoPlugin("piper-server-name.exe", * "vamp-example-plugins:zerocrossing", * 44100.0f, * Vamp::HostExt::PluginLoader::ADAPT_ALL_SAFE, * nullptr); * plugin->initialise(...); * plugin->process(...); <-- in the normal way for a Vamp plugin * delete plugin; <-- causes the server to exit * * AutoPlugin makes use of the Loader and PluginClient interfaces, * providing them its own transport layer object for its single server. * * Note that any method may throw ServerCrashed, RequestTimedOut or * ProtocolError exceptions. */ class PiperAutoPlugin : public Vamp::Plugin { public: /** * Construct a PiperAutoPlugin that runs an instance of the Piper * server with the given server name (executable path), requesting * the given plugin key from the server. * * \param adapterFlags a bitwise OR of the values in the * Vamp::HostExt::PluginLoader::AdapterFlags enumeration * * \param logger an optional callback for log messages. Pass a * null pointer to use cerr instead. */ PiperAutoPlugin(std::string serverName, std::string pluginKey, float inputSampleRate, int adapterFlags, LogCallback *logger) : // logger may be nullptr for cerr Vamp::Plugin(inputSampleRate), m_logger(logger), m_transport(serverName, "capnp", logger), m_client(&m_transport, logger) { LoadRequest req; req.pluginKey = pluginKey; req.inputSampleRate = inputSampleRate; req.adapterFlags = adapterFlags; try { LoadResponse resp = m_client.load(req); m_plugin = resp.plugin; } catch (ServerCrashed c) { log(std::string("PiperAutoPlugin: Server crashed: ") + c.what()); m_plugin = 0; } } virtual ~PiperAutoPlugin() { delete m_plugin; // The transport is a plain data member and will be deleted // here, which will have the effect of terminating the server } bool isOK() const { return (m_plugin != nullptr); } virtual std::string getIdentifier() const { return getPlugin()->getIdentifier(); } virtual std::string getName() const { return getPlugin()->getName(); } virtual std::string getDescription() const { return getPlugin()->getDescription(); } virtual std::string getMaker() const { return getPlugin()->getMaker(); } virtual std::string getCopyright() const { return getPlugin()->getCopyright(); } virtual int getPluginVersion() const { return getPlugin()->getPluginVersion(); } virtual ParameterList getParameterDescriptors() const { return getPlugin()->getParameterDescriptors(); } virtual float getParameter(std::string name) const { return getPlugin()->getParameter(name); } virtual void setParameter(std::string name, float value) { getPlugin()->setParameter(name, value); } virtual ProgramList getPrograms() const { return getPlugin()->getPrograms(); } virtual std::string getCurrentProgram() const { return getPlugin()->getCurrentProgram(); } virtual void selectProgram(std::string program) { getPlugin()->selectProgram(program); } virtual bool initialise(size_t inputChannels, size_t stepSize, size_t blockSize) { return getPlugin()->initialise(inputChannels, stepSize, blockSize); } virtual void reset() { getPlugin()->reset(); } virtual InputDomain getInputDomain() const { return getPlugin()->getInputDomain(); } virtual size_t getPreferredBlockSize() const { return getPlugin()->getPreferredBlockSize(); } virtual size_t getPreferredStepSize() const { return getPlugin()->getPreferredStepSize(); } virtual size_t getMinChannelCount() const { return getPlugin()->getMinChannelCount(); } virtual size_t getMaxChannelCount() const { return getPlugin()->getMaxChannelCount(); } virtual OutputList getOutputDescriptors() const { return getPlugin()->getOutputDescriptors(); } virtual FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp) { return getPlugin()->process(inputBuffers, timestamp); } virtual FeatureSet getRemainingFeatures() { return getPlugin()->getRemainingFeatures(); } private: LogCallback *m_logger; ProcessQtTransport m_transport; CapnpRRClient m_client; Vamp::Plugin *m_plugin; Vamp::Plugin *getPlugin() const { if (!m_plugin) { log("PiperAutoPlugin: getPlugin() failed (caller should have called PiperAutoPlugin::isOK)"); throw std::logic_error("Plugin load failed"); } return m_plugin; } void log(std::string message) const { if (m_logger) m_logger->log(message); else std::cerr << message << std::endl; } }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/qt/ProcessQtTransport.h0000644000000000000000000002304113111512442023707 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PROCESS_QT_TRANSPORT_H #define PIPER_PROCESS_QT_TRANSPORT_H #include "../SynchronousTransport.h" #include "../Exceptions.h" #include #include #include #include #include //#define DEBUG_TRANSPORT 1 namespace piper_vamp { namespace client { /** * A SynchronousTransport implementation that spawns a sub-process * using Qt's QProcess abstraction and talks to it via stdin/stdout * channels. Calls are completely serialized; the protocol only * supports one call in process at a time, and therefore the transport * only allows one at a time. * * This class is thread-safe, but in practice you can only use it from * within a single thread, because the underlying QProcess does not * support switching threads. */ class ProcessQtTransport : public SynchronousTransport { public: ProcessQtTransport(std::string processName, std::string formatArg, LogCallback *logger) : // logger may be nullptr for cerr m_logger(logger), m_completenessChecker(0), m_crashed(false) { m_process = new QProcess(); m_process->setReadChannel(QProcess::StandardOutput); m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); m_process->start(QString::fromStdString(processName), { QString::fromStdString(formatArg) }); if (!m_process->waitForStarted()) { if (m_process->state() == QProcess::NotRunning) { QProcess::ProcessError err = m_process->error(); if (err == QProcess::FailedToStart) { log("Unable to start server process " + processName); } else if (err == QProcess::Crashed) { log("Server process " + processName + " crashed on startup"); } else { QString e = QString("%1").arg(err); log("Server process " + processName + " failed on startup with error code " + e.toStdString()); } delete m_process; m_process = nullptr; } } if (m_process) { log("Server process " + processName + " started OK"); } } ~ProcessQtTransport() { if (m_process) { if (m_process->state() != QProcess::NotRunning) { m_process->closeWriteChannel(); m_process->waitForFinished(200); m_process->close(); m_process->waitForFinished(); log("Server process exited normally"); } delete m_process; } } void setCompletenessChecker(MessageCompletenessChecker *checker) override { m_completenessChecker = checker; } bool isOK() const override { return (m_process != nullptr) && !m_crashed; } std::vector call(const char *ptr, size_t size, std::string type, bool slow) override { QMutexLocker locker(&m_mutex); if (!m_completenessChecker) { log("call: No completeness checker set on transport"); throw std::logic_error("No completeness checker set on transport"); } if (!isOK()) { log("call: Transport is not OK"); throw std::logic_error("Transport is not OK"); } #ifdef DEBUG_TRANSPORT std::cerr << "writing " << size << " bytes to server" << std::endl; #endif m_process->write(ptr, size); m_process->waitForBytesWritten(); std::vector buffer; bool complete = false; QTime t; t.start(); // We don't like to timeout at all while waiting for a // response -- we'd like to wait as long as the server // continues running. // int beforeResponseTimeout = 0; // ms, 0 = no timeout // But if the call is marked as fast (i.e. just retrieving // info rather than calculating something) we will time out // after a bit. // if (!slow) beforeResponseTimeout = 10000; // ms, 0 = no timeout // But we do timeout if the server sends part of a reply and // then gets stuck. It's reasonable to assume that a server // that's already prepared its message and started sending has // finished doing any real work. In each case the timeout is // measured since data was last read. // int duringResponseTimeout = 5000; // ms, 0 = no timeout while (!complete) { bool responseStarted = !buffer.empty(); // already have something int ms = t.elapsed(); // time since start or since last read qint64 byteCount = m_process->bytesAvailable(); if (!byteCount) { if (responseStarted) { if (duringResponseTimeout > 0 && ms > duringResponseTimeout) { log("Server timed out during response"); m_crashed = true; throw RequestTimedOut(); } } else { if (beforeResponseTimeout > 0 && ms > beforeResponseTimeout) { log("Server timed out before response"); m_crashed = true; throw RequestTimedOut(); } } #ifdef DEBUG_TRANSPORT std::cerr << "waiting for data from server (slow = " << slow << ")..." << std::endl; #endif if (slow) { m_process->waitForReadyRead(1000); } else { #ifdef _WIN32 // This is most unsatisfactory -- if we give a non-zero // arg here, then we end up sleeping way beyond the arrival // of the data to read -- can end up using less than 10% // CPU during processing which is crazy. So for Windows // only, we busy-wait during "fast" calls. It works out // much faster in the end. Could do with a simpler native // blocking API really. m_process->waitForReadyRead(0); #else m_process->waitForReadyRead(100); #endif } if (m_process->state() == QProcess::NotRunning && // don't give up until we've read all that's been buffered! !m_process->bytesAvailable()) { QProcess::ProcessError err = m_process->error(); if (err == QProcess::Crashed) { log("Server crashed during " + type + " request"); } else { QString e = QString("%1").arg(err); log("Server failed during " + type + " request with error code " + e.toStdString()); } m_crashed = true; throw ServerCrashed(); } } else { size_t formerSize = buffer.size(); buffer.resize(formerSize + byteCount); m_process->read(buffer.data() + formerSize, byteCount); switch (m_completenessChecker->check(buffer)) { case MessageCompletenessChecker::Complete: complete = true; break; case MessageCompletenessChecker::Incomplete: break; case MessageCompletenessChecker::Invalid: throw ProtocolError(); } (void)t.restart(); // reset timeout when we read anything } } return buffer; } private: LogCallback *m_logger; MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently) QProcess *m_process; // I own this QMutex m_mutex; bool m_crashed; void log(std::string message) const { if (m_logger) m_logger->log(message); else std::cerr << message << std::endl; } }; } } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-client/qt/test.cpp0000644000000000000000000001134013111512442021360 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "ProcessQtTransport.h" #include "CapnpRRClient.h" #include "PiperAutoPlugin.h" #include using std::cerr; using std::endl; using std::exception; using std::vector; int main(int argc, char **argv) { if (argc != 2) { cerr << "Usage: " << argv[0] << " " << endl; return 2; } try { piper_vamp::client::ProcessQtTransport transport(argv[1], "capnp", nullptr); if (!transport.isOK()) { cerr << "ERROR: Transport failed to start" << endl; return 1; } piper_vamp::client::CapnpRRClient client(&transport, nullptr); piper_vamp::ListResponse lr = client.list({}); cerr << "Plugins available:" << endl; int i = 1; for (const auto &p: lr.available) { cerr << i++ << ". [" << p.pluginKey << "] " << p.basic.name << endl; } piper_vamp::LoadRequest req; req.pluginKey = "vamp-example-plugins:zerocrossing"; req.inputSampleRate = 16; piper_vamp::LoadResponse resp = client.load(req); Vamp::Plugin *plugin = resp.plugin; if (!plugin->initialise(1, 4, 4)) { cerr << "initialisation failed" << endl; } else { vector buf = { 1.0, -1.0, 1.0, -1.0 }; float *bd = buf.data(); Vamp::Plugin::FeatureSet features = plugin->process (&bd, Vamp::RealTime::zeroTime); cerr << "results for output 0:" << endl; auto fl(features[0]); for (const auto &f: fl) { cerr << f.values[0] << endl; } } (void)plugin->getRemainingFeatures(); cerr << "calling reset..." << endl; plugin->reset(); cerr << "...round 2!" << endl; vector buf = { 1.0, -1.0, 1.0, -1.0 }; float *bd = buf.data(); Vamp::Plugin::FeatureSet features = plugin->process (&bd, Vamp::RealTime::zeroTime); cerr << "results for output 0:" << endl; auto fl(features[0]); for (const auto &f: fl) { cerr << f.values[0] << endl; } (void)plugin->getRemainingFeatures(); delete plugin; // Let's try a crazy PiperAutoPlugin piper_vamp::client::PiperAutoPlugin ap (argv[1], "vamp-example-plugins:zerocrossing", 16, 0, nullptr); if (!ap.isOK()) { cerr << "PiperAutoPlugin creation failed" << endl; } else { if (!ap.initialise(1, 4, 4)) { cerr << "initialisation failed" << endl; } else { vector buf = { 1.0, -1.0, 1.0, -1.0 }; float *bd = buf.data(); Vamp::Plugin::FeatureSet features = ap.process (&bd, Vamp::RealTime::zeroTime); cerr << "results for output 0:" << endl; auto fl(features[0]); for (const auto &f: fl) { cerr << f.values[0] << endl; } } } } catch (const exception &e) { cerr << "ERROR: Exception caught: " << e.what() << endl; return 1; } return 0; } sonic-visualiser-3.0.3/piper-cpp/vamp-client/qt/test.pro0000644000000000000000000000161213111512442021377 0ustar 00000000000000 TEMPLATE = app CONFIG += qt stl c++11 exceptions console warn_on QT -= xml network gui widgets !win32 { QMAKE_CXXFLAGS += -Werror } OBJECTS_DIR = ../o MOC_DIR = ../o VAMPSDK_DIR = ../../../vamp-plugin-sdk PIPER_DIR = ../../../piper QMAKE_CXXFLAGS = -I$$VAMPSDK_DIR -I.. -I../.. LIBS += -L/usr/local/lib -lcapnp -lkj -L$$VAMPSDK_DIR -lvamp-hostsdk # Using the "console" CONFIG flag above should ensure this happens for # normal Windows builds, but this may be necessary when cross-compiling win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console macx*: CONFIG -= app_bundle TARGET = test SOURCES += \ test.cpp \ ../../vamp-capnp/piper-capnp.cpp HEADERS += \ ProcessQtTransport.h \ PiperAutoPlugin.h \ ../CapnpRRClient.h \ ../Loader.h \ ../PluginClient.h \ ../PiperVampPlugin.h \ ../SynchronousTransport.h sonic-visualiser-3.0.3/piper-cpp/vamp-json/VampJson.h0000644000000000000000000014062113111512442020657 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2015-2016 QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_VAMP_JSON_H #define PIPER_VAMP_JSON_H #include #include #include #include #include #include #include #include #include #include "vamp-support/PluginStaticData.h" #include "vamp-support/PluginConfiguration.h" #include "vamp-support/RequestResponse.h" #include "vamp-support/PluginHandleMapper.h" #include "vamp-support/PluginOutputIdMapper.h" #include "vamp-support/RequestResponseType.h" namespace piper_vamp { /** * Convert the structures laid out in the Vamp SDK classes into JSON * (and back again) following the schema in the vamp-json-schema * project repo. * * Functions with names starting "from" convert from a Vamp SDK object * to JSON output. Most of them return a json11::Json object, with a * few exceptions for low-level utilities that return a string. These * functions succeed all of the time. * * Functions with names starting "to" convert to a Vamp SDK object * from JSON input. These functions all accept a json11::Json object * as first argument, with a few exceptions for low-level utilities * that accept a string. These functions all accept a string reference * as a final argument and return an error string through it if the * conversion fails. If conversion fails the return value is * undefined, and any returned object may be incomplete or * invalid. Callers should check for an empty error string (indicating * success) before using the returned value. */ class VampJson { public: /** Serialisation format for arrays of floats (process input and * feature values). Wherever such an array appears, it may * alternatively be replaced by a single string containing a * base-64 encoding of the IEEE float buffer. When parsing, if a * string is found instead of an array in this case, it will be * interpreted as a base-64 encoded buffer. Only array or base-64 * encoding may be provided, not both. */ enum class BufferSerialisation { /** Default JSON serialisation of values in array form. This * is relatively slow to parse and serialise, and can take a * lot of space. */ Array, /** Base64-encoded string of the raw data as packed * little-endian IEEE 32-bit floats. Faster and more compact * than the text encoding but more complicated to * provide. Note that Base64 serialisations produced by this * library do not including padding characters and so are not * necessarily multiples of 4 characters long. You will need * to pad them yourself if concatenating them or supplying to * a consumer that expects padding. */ Base64 }; static bool failed(const std::string &err) { return err != ""; } template static json11::Json fromBasicDescriptor(const T &t) { return json11::Json::object { { "identifier", t.identifier }, { "name", t.name }, { "description", t.description } }; } template static void toBasicDescriptor(json11::Json j, T &t, std::string &err) { if (!j.is_object()) { err = "object expected for basic descriptor content"; return; } if (!j["identifier"].is_string()) { err = "string expected for identifier"; return; } t.identifier = j["identifier"].string_value(); t.name = j["name"].string_value(); t.description = j["description"].string_value(); } template static json11::Json fromValueExtents(const T &t) { return json11::Json::object { { "min", t.minValue }, { "max", t.maxValue } }; } template static bool toValueExtents(json11::Json j, T &t, std::string &err) { if (j["extents"].is_null()) { return false; } else if (j["extents"].is_object()) { if (j["extents"]["min"].is_number() && j["extents"]["max"].is_number()) { t.minValue = float(j["extents"]["min"].number_value()); t.maxValue = float(j["extents"]["max"].number_value()); return true; } else { err = "numbers expected for min and max"; return false; } } else { err = "object expected for extents (if present)"; return false; } } static json11::Json fromRealTime(const Vamp::RealTime &r) { return json11::Json::object { { "s", r.sec }, { "n", r.nsec } }; } static Vamp::RealTime toRealTime(json11::Json j, std::string &err) { json11::Json sec = j["s"]; json11::Json nsec = j["n"]; if (!sec.is_number() || !nsec.is_number()) { err = "invalid Vamp::RealTime object " + j.dump(); return {}; } return Vamp::RealTime(sec.int_value(), nsec.int_value()); } static std::string fromSampleType(Vamp::Plugin::OutputDescriptor::SampleType type) { switch (type) { case Vamp::Plugin::OutputDescriptor::OneSamplePerStep: return "OneSamplePerStep"; case Vamp::Plugin::OutputDescriptor::FixedSampleRate: return "FixedSampleRate"; case Vamp::Plugin::OutputDescriptor::VariableSampleRate: return "VariableSampleRate"; } return ""; } static Vamp::Plugin::OutputDescriptor::SampleType toSampleType(std::string text, std::string &err) { if (text == "OneSamplePerStep") { return Vamp::Plugin::OutputDescriptor::OneSamplePerStep; } else if (text == "FixedSampleRate") { return Vamp::Plugin::OutputDescriptor::FixedSampleRate; } else if (text == "VariableSampleRate") { return Vamp::Plugin::OutputDescriptor::VariableSampleRate; } else { err = "invalid sample type string: " + text; return Vamp::Plugin::OutputDescriptor::OneSamplePerStep; } } static json11::Json fromConfiguredOutputDescriptor(const Vamp::Plugin::OutputDescriptor &desc) { json11::Json::object jo { { "unit", desc.unit }, { "sampleType", fromSampleType(desc.sampleType) }, { "sampleRate", desc.sampleRate }, { "hasDuration", desc.hasDuration } }; if (desc.hasFixedBinCount) { jo["binCount"] = int(desc.binCount); jo["binNames"] = json11::Json::array (desc.binNames.begin(), desc.binNames.end()); } if (desc.hasKnownExtents) { jo["extents"] = fromValueExtents(desc); } if (desc.isQuantized) { jo["quantizeStep"] = desc.quantizeStep; } return json11::Json(jo); } static json11::Json fromOutputDescriptor(const Vamp::Plugin::OutputDescriptor &desc) { json11::Json::object jo { { "basic", fromBasicDescriptor(desc) }, { "configured", fromConfiguredOutputDescriptor(desc) } }; return json11::Json(jo); } static Vamp::Plugin::OutputDescriptor toConfiguredOutputDescriptor(json11::Json j, std::string &err) { Vamp::Plugin::OutputDescriptor od; if (!j.is_object()) { err = "object expected for output descriptor"; return {}; } od.unit = j["unit"].string_value(); od.sampleType = toSampleType(j["sampleType"].string_value(), err); if (failed(err)) return {}; if (!j["sampleRate"].is_number()) { err = "number expected for sample rate"; return {}; } od.sampleRate = float(j["sampleRate"].number_value()); od.hasDuration = j["hasDuration"].bool_value(); if (j["binCount"].is_number() && j["binCount"].int_value() > 0) { od.hasFixedBinCount = true; od.binCount = j["binCount"].int_value(); for (auto &n: j["binNames"].array_items()) { if (!n.is_string()) { err = "string expected for bin name"; return {}; } od.binNames.push_back(n.string_value()); } } else { od.hasFixedBinCount = false; } bool extentsPresent = toValueExtents(j, od, err); if (failed(err)) return {}; od.hasKnownExtents = extentsPresent; if (j["quantizeStep"].is_number()) { od.isQuantized = true; od.quantizeStep = float(j["quantizeStep"].number_value()); } else { od.isQuantized = false; } return od; } static Vamp::Plugin::OutputDescriptor toOutputDescriptor(json11::Json j, std::string &err) { Vamp::Plugin::OutputDescriptor od; if (!j.is_object()) { err = "object expected for output descriptor"; return {}; } od = toConfiguredOutputDescriptor(j["configured"], err); if (failed(err)) return {}; toBasicDescriptor(j["basic"], od, err); if (failed(err)) return {}; return od; } static json11::Json fromParameterDescriptor(const Vamp::PluginBase::ParameterDescriptor &desc) { json11::Json::object jo { { "basic", fromBasicDescriptor(desc) }, { "unit", desc.unit }, { "extents", fromValueExtents(desc) }, { "defaultValue", desc.defaultValue }, { "valueNames", json11::Json::array (desc.valueNames.begin(), desc.valueNames.end()) } }; if (desc.isQuantized) { jo["quantizeStep"] = desc.quantizeStep; } return json11::Json(jo); } static Vamp::PluginBase::ParameterDescriptor toParameterDescriptor(json11::Json j, std::string &err) { Vamp::PluginBase::ParameterDescriptor pd; if (!j.is_object()) { err = "object expected for parameter descriptor"; return {}; } toBasicDescriptor(j["basic"], pd, err); if (failed(err)) return {}; pd.unit = j["unit"].string_value(); bool extentsPresent = toValueExtents(j, pd, err); if (failed(err)) return {}; if (!extentsPresent) { err = "extents must be present in parameter descriptor"; return {}; } if (!j["defaultValue"].is_number()) { err = "number expected for default value"; return {}; } pd.defaultValue = float(j["defaultValue"].number_value()); pd.valueNames.clear(); for (auto &n: j["valueNames"].array_items()) { if (!n.is_string()) { err = "string expected for value name"; return {}; } pd.valueNames.push_back(n.string_value()); } if (j["quantizeStep"].is_number()) { pd.isQuantized = true; pd.quantizeStep = float(j["quantizeStep"].number_value()); } else { pd.isQuantized = false; } return pd; } static std::string fromFloatBuffer(const float *buffer, size_t nfloats) { // must use char pointers, otherwise the converter will only // encode every 4th byte (as it will count up in float* steps) const char *start = reinterpret_cast(buffer); const char *end = reinterpret_cast(buffer + nfloats); std::string encoded; bn::encode_b64(start, end, back_inserter(encoded)); return encoded; } static std::vector toFloatBuffer(std::string encoded, std::string & /* err */) { std::string decoded; bn::decode_b64(encoded.begin(), encoded.end(), back_inserter(decoded)); const float *buffer = reinterpret_cast(decoded.c_str()); size_t n = decoded.size() / sizeof(float); return std::vector(buffer, buffer + n); } static json11::Json fromFeature(const Vamp::Plugin::Feature &f, BufferSerialisation serialisation) { json11::Json::object jo; if (f.values.size() > 0) { if (serialisation == BufferSerialisation::Array) { jo["featureValues"] = json11::Json::array(f.values.begin(), f.values.end()); } else { jo["featureValues"] = fromFloatBuffer(f.values.data(), f.values.size()); } } if (f.label != "") { jo["label"] = f.label; } if (f.hasTimestamp) { jo["timestamp"] = fromRealTime(f.timestamp); } if (f.hasDuration) { jo["duration"] = fromRealTime(f.duration); } return json11::Json(jo); } static Vamp::Plugin::Feature toFeature(json11::Json j, BufferSerialisation &serialisation, std::string &err) { Vamp::Plugin::Feature f; if (!j.is_object()) { err = "object expected for feature"; return {}; } if (j["timestamp"].is_object()) { f.timestamp = toRealTime(j["timestamp"], err); if (failed(err)) return {}; f.hasTimestamp = true; } if (j["duration"].is_object()) { f.duration = toRealTime(j["duration"], err); if (failed(err)) return {}; f.hasDuration = true; } if (j["featureValues"].is_string()) { f.values = toFloatBuffer(j["featureValues"].string_value(), err); if (failed(err)) return {}; serialisation = BufferSerialisation::Base64; } else if (j["featureValues"].is_array()) { for (auto v : j["featureValues"].array_items()) { f.values.push_back(float(v.number_value())); } serialisation = BufferSerialisation::Array; } f.label = j["label"].string_value(); return f; } static json11::Json fromFeatureSet(const Vamp::Plugin::FeatureSet &fs, const PluginOutputIdMapper &omapper, BufferSerialisation serialisation) { json11::Json::object jo; for (const auto &fsi : fs) { std::vector fj; for (const Vamp::Plugin::Feature &f: fsi.second) { fj.push_back(fromFeature(f, serialisation)); } jo[omapper.indexToId(fsi.first)] = fj; } return json11::Json(jo); } static Vamp::Plugin::FeatureList toFeatureList(json11::Json j, BufferSerialisation &serialisation, std::string &err) { Vamp::Plugin::FeatureList fl; if (!j.is_array()) { err = "array expected for feature list"; return fl; } for (const json11::Json &fj : j.array_items()) { fl.push_back(toFeature(fj, serialisation, err)); if (failed(err)) return fl; } return fl; } static Vamp::Plugin::FeatureSet toFeatureSet(json11::Json j, const PluginOutputIdMapper &omapper, BufferSerialisation &serialisation, std::string &err) { Vamp::Plugin::FeatureSet fs; if (!j.is_object()) { err = "object expected for feature set"; return fs; } for (auto &entry : j.object_items()) { int n = omapper.idToIndex(entry.first); if (fs.find(n) != fs.end()) { err = "duplicate numerical index for output"; return fs; } fs[n] = toFeatureList(entry.second, serialisation, err); if (failed(err)) return fs; } return fs; } static std::string fromInputDomain(Vamp::Plugin::InputDomain domain) { switch (domain) { case Vamp::Plugin::TimeDomain: return "TimeDomain"; case Vamp::Plugin::FrequencyDomain: return "FrequencyDomain"; } return ""; } static Vamp::Plugin::InputDomain toInputDomain(std::string text, std::string &err) { if (text == "TimeDomain") { return Vamp::Plugin::TimeDomain; } else if (text == "FrequencyDomain") { return Vamp::Plugin::FrequencyDomain; } else { err = "invalid input domain string: " + text; return {}; } } static json11::Json fromPluginStaticData(const PluginStaticData &d) { json11::Json::object jo; jo["key"] = d.pluginKey; jo["basic"] = fromBasicDescriptor(d.basic); jo["maker"] = d.maker; jo["rights"] = d.copyright; jo["version"] = d.pluginVersion; json11::Json::array cat; for (const std::string &c: d.category) cat.push_back(c); jo["category"] = cat; jo["minChannelCount"] = int(d.minChannelCount); jo["maxChannelCount"] = int(d.maxChannelCount); json11::Json::array params; Vamp::PluginBase::ParameterList vparams = d.parameters; for (auto &p: vparams) params.push_back(fromParameterDescriptor(p)); jo["parameters"] = params; json11::Json::array progs; Vamp::PluginBase::ProgramList vprogs = d.programs; for (auto &p: vprogs) progs.push_back(p); jo["programs"] = progs; jo["inputDomain"] = fromInputDomain(d.inputDomain); json11::Json::array outinfo; auto vouts = d.basicOutputInfo; for (auto &o: vouts) outinfo.push_back(fromBasicDescriptor(o)); jo["basicOutputInfo"] = outinfo; return json11::Json(jo); } static PluginStaticData toPluginStaticData(json11::Json j, std::string &err) { if (!j.has_shape({ { "key", json11::Json::STRING }, { "version", json11::Json::NUMBER }, { "minChannelCount", json11::Json::NUMBER }, { "maxChannelCount", json11::Json::NUMBER }, { "inputDomain", json11::Json::STRING }}, err)) { err = "malformed plugin static data: " + err; } else if (!j["basicOutputInfo"].is_array()) { err = "array expected for basic output info"; } else if (!j["maker"].is_null() && !j["maker"].is_string()) { err = "string expected for maker"; } else if (!j["rights"].is_null() && !j["rights"].is_string()) { err = "string expected for rights"; } else if (!j["category"].is_null() && !j["category"].is_array()) { err = "array expected for category"; } else if (!j["parameters"].is_null() && !j["parameters"].is_array()) { err = "array expected for parameters"; } else if (!j["programs"].is_null() && !j["programs"].is_array()) { err = "array expected for programs"; } else if (!j["inputDomain"].is_null() && !j["inputDomain"].is_string()) { err = "string expected for inputDomain"; } else if (!j["basicOutputInfo"].is_null() && !j["basicOutputInfo"].is_array()) { err = "array expected for basicOutputInfo"; } else { PluginStaticData psd; psd.pluginKey = j["key"].string_value(); toBasicDescriptor(j["basic"], psd.basic, err); if (failed(err)) return {}; psd.maker = j["maker"].string_value(); psd.copyright = j["rights"].string_value(); psd.pluginVersion = j["version"].int_value(); for (const auto &c : j["category"].array_items()) { if (!c.is_string()) { err = "strings expected in category array"; return {}; } psd.category.push_back(c.string_value()); } psd.minChannelCount = j["minChannelCount"].int_value(); psd.maxChannelCount = j["maxChannelCount"].int_value(); for (const auto &p : j["parameters"].array_items()) { auto pd = toParameterDescriptor(p, err); if (failed(err)) return {}; psd.parameters.push_back(pd); } for (const auto &p : j["programs"].array_items()) { if (!p.is_string()) { err = "strings expected in programs array"; return {}; } psd.programs.push_back(p.string_value()); } psd.inputDomain = toInputDomain(j["inputDomain"].string_value(), err); if (failed(err)) return {}; for (const auto &bo : j["basicOutputInfo"].array_items()) { PluginStaticData::Basic b; toBasicDescriptor(bo, b, err); if (failed(err)) return {}; psd.basicOutputInfo.push_back(b); } return psd; } // fallthrough error case return {}; } static json11::Json fromPluginConfiguration(const PluginConfiguration &c) { json11::Json::object jo; json11::Json::object paramValues; for (auto &vp: c.parameterValues) { paramValues[vp.first] = vp.second; } jo["parameterValues"] = paramValues; if (c.currentProgram != "") { jo["currentProgram"] = c.currentProgram; } jo["channelCount"] = c.channelCount; json11::Json::object framing; framing["stepSize"] = c.framing.stepSize; framing["blockSize"] = c.framing.blockSize; jo["framing"] = framing; return json11::Json(jo); } static PluginConfiguration toPluginConfiguration(json11::Json j, std::string &err) { if (!j.has_shape({ { "channelCount", json11::Json::NUMBER } }, err)) { err = "malformed plugin configuration: " + err; return {}; } if (!j["framing"].has_shape({ { "stepSize", json11::Json::NUMBER }, { "blockSize", json11::Json::NUMBER } }, err)) { err = "malformed framing: " + err; return {}; } if (!j["parameterValues"].is_null() && !j["parameterValues"].is_object()) { err = "object expected for parameter values"; return {}; } for (auto &pv : j["parameterValues"].object_items()) { if (!pv.second.is_number()) { err = "number expected for parameter value"; return {}; } } if (!j["currentProgram"].is_null() && !j["currentProgram"].is_string()) { err = "string expected for program name"; return {}; } PluginConfiguration config; config.channelCount = int(round(j["channelCount"].number_value())); config.framing.stepSize = int(round(j["framing"]["stepSize"].number_value())); config.framing.blockSize = int(round(j["framing"]["blockSize"].number_value())); for (auto &pv : j["parameterValues"].object_items()) { config.parameterValues[pv.first] = float(pv.second.number_value()); } if (j["currentProgram"].is_string()) { config.currentProgram = j["currentProgram"].string_value(); } return config; } static json11::Json fromAdapterFlags(int flags) { json11::Json::array arr; if (flags & Vamp::HostExt::PluginLoader::ADAPT_INPUT_DOMAIN) { arr.push_back("AdaptInputDomain"); } if (flags & Vamp::HostExt::PluginLoader::ADAPT_CHANNEL_COUNT) { arr.push_back("AdaptChannelCount"); } if (flags & Vamp::HostExt::PluginLoader::ADAPT_BUFFER_SIZE) { arr.push_back("AdaptBufferSize"); } return json11::Json(arr); } static Vamp::HostExt::PluginLoader::AdapterFlags toAdapterFlags(json11::Json j, std::string &err) { int flags = 0x0; if (!j.is_array()) { err = "array expected for adapter flags"; } else { for (auto &jj: j.array_items()) { if (!jj.is_string()) { err = "string expected for adapter flag"; break; } std::string text = jj.string_value(); if (text == "AdaptInputDomain") { flags |= Vamp::HostExt::PluginLoader::ADAPT_INPUT_DOMAIN; } else if (text == "AdaptChannelCount") { flags |= Vamp::HostExt::PluginLoader::ADAPT_CHANNEL_COUNT; } else if (text == "AdaptBufferSize") { flags |= Vamp::HostExt::PluginLoader::ADAPT_BUFFER_SIZE; } else if (text == "AdaptAllSafe") { flags |= Vamp::HostExt::PluginLoader::ADAPT_ALL_SAFE; } else if (text == "AdaptAll") { flags |= Vamp::HostExt::PluginLoader::ADAPT_ALL; } else { err = "invalid adapter flag string: " + text; break; } } } return Vamp::HostExt::PluginLoader::AdapterFlags(flags); } static json11::Json fromListRequest(const ListRequest &req) { json11::Json::object jo; json11::Json::array arr; for (const auto &f: req.from) { arr.push_back(f); } jo["from"] = arr; return json11::Json(jo); } static ListRequest toListRequest(json11::Json j, std::string &err) { ListRequest req; if (!j["from"].is_null() && !j["from"].is_array()) { err = "array expected for from field"; return {}; } for (const auto &a: j["from"].array_items()) { if (!a.is_string()) { err = "string expected for element in from array"; return {}; } req.from.push_back(a.string_value()); } return req; } static json11::Json fromListResponse(const ListResponse &resp) { json11::Json::array arr; for (const auto &a: resp.available) { arr.push_back(fromPluginStaticData(a)); } json11::Json::object jo; jo["available"] = arr; return json11::Json(jo); } static ListResponse toListResponse(json11::Json j, std::string &err) { ListResponse resp; for (const auto &a: j["available"].array_items()) { resp.available.push_back(toPluginStaticData(a, err)); if (failed(err)) return {}; } return resp; } static json11::Json fromLoadRequest(const LoadRequest &req) { json11::Json::object jo; jo["key"] = req.pluginKey; jo["inputSampleRate"] = req.inputSampleRate; jo["adapterFlags"] = fromAdapterFlags(req.adapterFlags); return json11::Json(jo); } static LoadRequest toLoadRequest(json11::Json j, std::string &err) { if (!j.has_shape({ { "key", json11::Json::STRING }, { "inputSampleRate", json11::Json::NUMBER } }, err)) { err = "malformed load request: " + err; return {}; } LoadRequest req; req.pluginKey = j["key"].string_value(); req.inputSampleRate = float(j["inputSampleRate"].number_value()); if (!j["adapterFlags"].is_null()) { req.adapterFlags = toAdapterFlags(j["adapterFlags"], err); if (failed(err)) return {}; } return req; } static json11::Json fromLoadResponse(const LoadResponse &resp, const PluginHandleMapper &pmapper) { json11::Json::object jo; jo["handle"] = double(pmapper.pluginToHandle(resp.plugin)); jo["staticData"] = fromPluginStaticData(resp.staticData); jo["defaultConfiguration"] = fromPluginConfiguration(resp.defaultConfiguration); return json11::Json(jo); } static LoadResponse toLoadResponse(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { if (!j.has_shape({ { "handle", json11::Json::NUMBER }, { "staticData", json11::Json::OBJECT }, { "defaultConfiguration", json11::Json::OBJECT } }, err)) { err = "malformed load response: " + err; return {}; } LoadResponse resp; resp.plugin = pmapper.handleToPlugin(j["handle"].int_value()); resp.staticData = toPluginStaticData(j["staticData"], err); if (failed(err)) return {}; resp.defaultConfiguration = toPluginConfiguration(j["defaultConfiguration"], err); if (failed(err)) return {}; return resp; } static json11::Json fromConfigurationRequest(const ConfigurationRequest &cr, const PluginHandleMapper &pmapper) { json11::Json::object jo; jo["handle"] = double(pmapper.pluginToHandle(cr.plugin)); jo["configuration"] = fromPluginConfiguration(cr.configuration); return json11::Json(jo); } static ConfigurationRequest toConfigurationRequest(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { if (!j.has_shape({ { "handle", json11::Json::NUMBER }, { "configuration", json11::Json::OBJECT } }, err)) { err = "malformed configuration request: " + err; return {}; } ConfigurationRequest cr; cr.plugin = pmapper.handleToPlugin(j["handle"].int_value()); cr.configuration = toPluginConfiguration(j["configuration"], err); if (failed(err)) return {}; return cr; } static json11::Json fromConfigurationResponse(const ConfigurationResponse &cr, const PluginHandleMapper &pmapper) { json11::Json::object jo; jo["handle"] = double(pmapper.pluginToHandle(cr.plugin)); json11::Json::array outs; for (auto &d: cr.outputs) { outs.push_back(fromOutputDescriptor(d)); } jo["outputList"] = outs; json11::Json::object framing; framing["stepSize"] = cr.framing.stepSize; framing["blockSize"] = cr.framing.blockSize; jo["framing"] = framing; return json11::Json(jo); } static ConfigurationResponse toConfigurationResponse(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { ConfigurationResponse cr; if (!j["framing"].has_shape({ { "stepSize", json11::Json::NUMBER }, { "blockSize", json11::Json::NUMBER } }, err)) { err = "malformed framing: " + err; return {}; } if (!j["outputList"].is_array()) { err = "array expected for output list"; return {}; } cr.plugin = pmapper.handleToPlugin(j["handle"].int_value()); for (const auto &o: j["outputList"].array_items()) { cr.outputs.push_back(toOutputDescriptor(o, err)); if (failed(err)) return {}; } cr.framing.stepSize = int(round(j["framing"]["stepSize"].number_value())); cr.framing.blockSize = int(round(j["framing"]["blockSize"].number_value())); return cr; } static json11::Json fromProcessRequest(const ProcessRequest &r, const PluginHandleMapper &pmapper, BufferSerialisation serialisation) { json11::Json::object jo; jo["handle"] = double(pmapper.pluginToHandle(r.plugin)); json11::Json::object io; io["timestamp"] = fromRealTime(r.timestamp); json11::Json::array chans; for (size_t i = 0; i < r.inputBuffers.size(); ++i) { if (serialisation == BufferSerialisation::Array) { chans.push_back(json11::Json::array(r.inputBuffers[i].begin(), r.inputBuffers[i].end())); } else { chans.push_back(fromFloatBuffer(r.inputBuffers[i].data(), r.inputBuffers[i].size())); } } io["inputBuffers"] = chans; jo["processInput"] = io; return json11::Json(jo); } static ProcessRequest toProcessRequest(json11::Json j, const PluginHandleMapper &pmapper, BufferSerialisation &serialisation, std::string &err) { if (!j.has_shape({ { "handle", json11::Json::NUMBER }, { "processInput", json11::Json::OBJECT } }, err)) { err = "malformed process request: " + err; return {}; } auto input = j["processInput"]; if (!input.has_shape({ { "timestamp", json11::Json::OBJECT }, { "inputBuffers", json11::Json::ARRAY } }, err)) { err = "malformed process request: " + err; return {}; } ProcessRequest r; r.plugin = pmapper.handleToPlugin(j["handle"].int_value()); r.timestamp = toRealTime(input["timestamp"], err); if (failed(err)) return {}; for (const auto &a: input["inputBuffers"].array_items()) { if (a.is_string()) { std::vector buf = toFloatBuffer(a.string_value(), err); if (failed(err)) return {}; r.inputBuffers.push_back(buf); serialisation = BufferSerialisation::Base64; } else if (a.is_array()) { std::vector buf; for (auto v : a.array_items()) { buf.push_back(float(v.number_value())); } r.inputBuffers.push_back(buf); serialisation = BufferSerialisation::Array; } else { err = "expected arrays or strings in inputBuffers array"; return {}; } } return r; } private: // go private briefly for a couple of helper functions static void checkRpcRequestType(json11::Json j, std::string expected, std::string &err) { if (!j["method"].is_string()) { err = "string expected for method"; return; } if (j["method"].string_value() != expected) { err = "expected value \"" + expected + "\" for type"; return; } if (!j["params"].is_null() && !j["params"].is_object()) { err = "object expected for params"; return; } if (!j["id"].is_null() && !j["id"].is_number() && !j["id"].is_string()) { err = "number or string expected for id"; return; } if (!j["jsonrpc"].is_null() && !j["jsonrpc"].is_string()) { err = "string expected for jsonrpc"; return; } for (const auto &kv: j.object_items()) { if (kv.first != "method" && kv.first != "params" && kv.first != "id" && kv.first != "jsonrpc") { err = "unexpected field \"" + kv.first + "\" in rpc request object"; return; } } } static bool successful(json11::Json j, std::string &err) { const bool hasResult = j["result"].is_object(); const bool hasError = j["error"].is_object(); if (hasResult && hasError) { err = "valid response may contain only one of result and error objects"; return false; } else if (hasError) { return false; } else if (!hasResult) { err = "either a result or an error object is required for a valid response"; return false; } else { return true; } } static void markRPC(json11::Json::object &jo) { jo["jsonrpc"] = "2.0"; } static void addId(json11::Json::object &jo, const json11::Json &id) { if (!id.is_null()) { jo["id"] = id; } } public: static json11::Json fromRpcRequest_List(const ListRequest &req, const json11::Json &id) { json11::Json::object jo; markRPC(jo); jo["method"] = "list"; jo["params"] = fromListRequest(req); addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcResponse_List(const ListResponse &resp, const json11::Json &id) { json11::Json::object jo; markRPC(jo); jo["method"] = "list"; jo["result"] = fromListResponse(resp); addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcRequest_Load(const LoadRequest &req, const json11::Json &id) { json11::Json::object jo; markRPC(jo); jo["method"] = "load"; jo["params"] = fromLoadRequest(req); addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcResponse_Load(const LoadResponse &resp, const PluginHandleMapper &pmapper, const json11::Json &id) { if (resp.plugin) { json11::Json::object jo; markRPC(jo); jo["method"] = "load"; jo["result"] = fromLoadResponse(resp, pmapper); addId(jo, id); return json11::Json(jo); } else { return fromError("Failed to load plugin", RRType::Load, id); } } static json11::Json fromRpcRequest_Configure(const ConfigurationRequest &req, const PluginHandleMapper &pmapper, const json11::Json &id) { json11::Json::object jo; markRPC(jo); jo["method"] = "configure"; jo["params"] = fromConfigurationRequest(req, pmapper); addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcResponse_Configure(const ConfigurationResponse &resp, const PluginHandleMapper &pmapper, const json11::Json &id) { if (!resp.outputs.empty()) { json11::Json::object jo; markRPC(jo); jo["method"] = "configure"; jo["result"] = fromConfigurationResponse(resp, pmapper); addId(jo, id); return json11::Json(jo); } else { return fromError("Failed to configure plugin", RRType::Configure, id); } } static json11::Json fromRpcRequest_Process(const ProcessRequest &req, const PluginHandleMapper &pmapper, BufferSerialisation serialisation, const json11::Json &id) { json11::Json::object jo; markRPC(jo); jo["method"] = "process"; jo["params"] = fromProcessRequest(req, pmapper, serialisation); addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcResponse_Process(const ProcessResponse &resp, const PluginHandleMapper &pmapper, BufferSerialisation serialisation, const json11::Json &id) { json11::Json::object jo; markRPC(jo); json11::Json::object po; po["handle"] = double(pmapper.pluginToHandle(resp.plugin)); po["features"] = fromFeatureSet(resp.features, *pmapper.pluginToOutputIdMapper(resp.plugin), serialisation); jo["method"] = "process"; jo["result"] = po; addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcRequest_Finish(const FinishRequest &req, const PluginHandleMapper &pmapper, const json11::Json &id) { json11::Json::object jo; markRPC(jo); json11::Json::object fo; fo["handle"] = double(pmapper.pluginToHandle(req.plugin)); jo["method"] = "finish"; jo["params"] = fo; addId(jo, id); return json11::Json(jo); } static json11::Json fromRpcResponse_Finish(const FinishResponse &resp, const PluginHandleMapper &pmapper, BufferSerialisation serialisation, const json11::Json &id) { json11::Json::object jo; markRPC(jo); json11::Json::object po; po["handle"] = double(pmapper.pluginToHandle(resp.plugin)); po["features"] = fromFeatureSet(resp.features, *pmapper.pluginToOutputIdMapper(resp.plugin), serialisation); jo["method"] = "finish"; jo["result"] = po; addId(jo, id); return json11::Json(jo); } static json11::Json fromError(std::string errorText, RRType responseType, const json11::Json &id, bool writeVerbatimError = false) { json11::Json::object jo; markRPC(jo); std::string type; if (responseType == RRType::List) type = "list"; else if (responseType == RRType::Load) type = "load"; else if (responseType == RRType::Configure) type = "configure"; else if (responseType == RRType::Process) type = "process"; else if (responseType == RRType::Finish) type = "finish"; else type = "invalid"; json11::Json::object eo; eo["code"] = 0; if (responseType == RRType::NotValid || writeVerbatimError) { eo["message"] = errorText; } else { eo["message"] = std::string("error in ") + type + " request: " + errorText; } jo["method"] = type; jo["error"] = eo; addId(jo, id); return json11::Json(jo); } static RRType getRequestResponseType(json11::Json j, std::string &err) { if (!j["method"].is_string()) { err = "string expected for method"; return RRType::NotValid; } std::string type = j["method"].string_value(); if (type == "list") return RRType::List; else if (type == "load") return RRType::Load; else if (type == "configure") return RRType::Configure; else if (type == "process") return RRType::Process; else if (type == "finish") return RRType::Finish; else if (type == "invalid") return RRType::NotValid; else { err = "unknown or unexpected request/response type \"" + type + "\""; return RRType::NotValid; } } static ListRequest toRpcRequest_List(json11::Json j, std::string &err) { checkRpcRequestType(j, "list", err); if (failed(err)) return {}; return toListRequest(j["params"], err); } static ListResponse toRpcResponse_List(json11::Json j, std::string &err) { ListResponse resp; if (successful(j, err) && !failed(err)) { resp = toListResponse(j["result"], err); } return resp; } static LoadRequest toRpcRequest_Load(json11::Json j, std::string &err) { checkRpcRequestType(j, "load", err); if (failed(err)) return {}; return toLoadRequest(j["params"], err); } static LoadResponse toRpcResponse_Load(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { LoadResponse resp; if (successful(j, err) && !failed(err)) { resp = toLoadResponse(j["result"], pmapper, err); } return resp; } static ConfigurationRequest toRpcRequest_Configure(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { checkRpcRequestType(j, "configure", err); if (failed(err)) return {}; return toConfigurationRequest(j["params"], pmapper, err); } static ConfigurationResponse toRpcResponse_Configure(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { ConfigurationResponse resp; if (successful(j, err) && !failed(err)) { resp = toConfigurationResponse(j["result"], pmapper, err); } return resp; } static ProcessRequest toRpcRequest_Process(json11::Json j, const PluginHandleMapper &pmapper, BufferSerialisation &serialisation, std::string &err) { checkRpcRequestType(j, "process", err); if (failed(err)) return {}; return toProcessRequest(j["params"], pmapper, serialisation, err); } static ProcessResponse toRpcResponse_Process(json11::Json j, const PluginHandleMapper &pmapper, BufferSerialisation &serialisation, std::string &err) { ProcessResponse resp; if (successful(j, err) && !failed(err)) { auto jc = j["result"]; auto h = jc["handle"].int_value(); resp.plugin = pmapper.handleToPlugin(h); resp.features = toFeatureSet(jc["features"], *pmapper.handleToOutputIdMapper(h), serialisation, err); } return resp; } static FinishRequest toRpcRequest_Finish(json11::Json j, const PluginHandleMapper &pmapper, std::string &err) { checkRpcRequestType(j, "finish", err); if (failed(err)) return {}; FinishRequest req; req.plugin = pmapper.handleToPlugin (j["params"]["handle"].int_value()); return req; } static FinishResponse toRpcResponse_Finish(json11::Json j, const PluginHandleMapper &pmapper, BufferSerialisation &serialisation, std::string &err) { FinishResponse resp; if (successful(j, err) && !failed(err)) { auto jc = j["result"]; auto h = jc["handle"].int_value(); resp.plugin = pmapper.handleToPlugin(h); resp.features = toFeatureSet(jc["features"], *pmapper.handleToOutputIdMapper(h), serialisation, err); } return resp; } }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-server/convert.cpp0000644000000000000000000004614613111512442021501 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "vamp-json/VampJson.h" #include "vamp-capnp/VampnProto.h" #include "vamp-support/RequestOrResponse.h" #include "vamp-support/PreservingPluginHandleMapper.h" #include #include #include #include // for _setmode stuff #ifdef _WIN32 #include #include #endif using namespace std; using namespace json11; using namespace piper_vamp; void usage() { string myname = "piper-convert"; cerr << "\n" << myname << ": Validate and convert Piper request and response messages\n\n" " Usage: " << myname << " [-i ] [-o ] request\n" " " << myname << " [-i ] [-o ] response\n\n" " where\n" " : the format to read from stdin\n" " (\"json\" or \"capnp\", default is \"json\")\n" " : the format to convert to and write to stdout\n" " (\"json\", \"json-b64\" or \"capnp\", default is \"json\")\n" " request|response: whether messages are Vamp request or response type\n\n" "If and differ, convert from to .\n" "If and are the same, just check validity of incoming\n" "messages and pass them to output.\n\n" "Specifying \"json-b64\" as output format forces base64 encoding for process and\n" "feature blocks, unlike the \"json\" output format which uses text encoding.\n" "The \"json\" input format accepts either.\n\n"; exit(2); } Json convertRequestJson(string input, string &err) { Json j = Json::parse(input, err); if (err != "") { err = "invalid json: " + err; return {}; } if (!j.is_object()) { err = "object expected at top level"; } else if (!j["method"].is_string()) { err = "string expected for method field"; } else if (!j["params"].is_null() && !j["params"].is_object()) { err = "object expected for params field"; } return j; } Json convertResponseJson(string input, string &err) { Json j = Json::parse(input, err); if (err != "") { err = "invalid json: " + err; return {}; } if (!j.is_object()) { err = "object expected at top level"; } else { if (!j["result"].is_object()) { if (!j["error"].is_object()) { err = "expected either result or error object"; } } } return j; } //!!! Lots of potential for refactoring the conversion classes based //!!! on the common matter in the following eight functions... PreservingPluginHandleMapper mapper; static RequestOrResponse::RpcId readJsonId(const Json &j) { RequestOrResponse::RpcId id; if (j["id"].is_number()) { id.type = RequestOrResponse::RpcId::Number; id.number = j["id"].number_value(); } else if (j["id"].is_string()) { id.type = RequestOrResponse::RpcId::Tag; id.tag = j["id"].string_value(); } else { id.type = RequestOrResponse::RpcId::Absent; } return id; } static Json writeJsonId(const RequestOrResponse::RpcId &id) { if (id.type == RequestOrResponse::RpcId::Number) { return id.number; } else if (id.type == RequestOrResponse::RpcId::Tag) { return id.tag; } else { return Json(); } } template static RequestOrResponse::RpcId readCapnpId(const Reader &r) { int number; string tag; switch (r.getId().which()) { case piper::RpcRequest::Id::Which::NUMBER: number = r.getId().getNumber(); return { RequestOrResponse::RpcId::Number, number, "" }; case piper::RpcRequest::Id::Which::TAG: tag = r.getId().getTag(); return { RequestOrResponse::RpcId::Tag, 0, tag }; case piper::RpcRequest::Id::Which::NONE: return { RequestOrResponse::RpcId::Absent, 0, "" }; } return { RequestOrResponse::RpcId::Absent, 0, "" }; } template static void buildCapnpId(Builder &b, const RequestOrResponse::RpcId &id) { switch (id.type) { case RequestOrResponse::RpcId::Number: b.getId().setNumber(id.number); break; case RequestOrResponse::RpcId::Tag: b.getId().setTag(id.tag); break; case RequestOrResponse::RpcId::Absent: b.getId().setNone(); break; } } RequestOrResponse readRequestJson(string &err, bool &eof) { RequestOrResponse rr; rr.direction = RequestOrResponse::Request; string input; if (!getline(cin, input)) { // the EOF case, not actually an error eof = true; return rr; } Json j = convertRequestJson(input, err); if (err != "") return {}; rr.type = VampJson::getRequestResponseType(j, err); if (err != "") return {}; rr.id = readJsonId(j); VampJson::BufferSerialisation serialisation = VampJson::BufferSerialisation::Array; switch (rr.type) { case RRType::List: rr.listRequest = VampJson::toRpcRequest_List(j, err); break; case RRType::Load: rr.loadRequest = VampJson::toRpcRequest_Load(j, err); break; case RRType::Configure: rr.configurationRequest = VampJson::toRpcRequest_Configure(j, mapper, err); break; case RRType::Process: rr.processRequest = VampJson::toRpcRequest_Process(j, mapper, serialisation, err); break; case RRType::Finish: rr.finishRequest = VampJson::toRpcRequest_Finish(j, mapper, err); break; case RRType::NotValid: break; } return rr; } void writeRequestJson(RequestOrResponse &rr, bool useBase64) { Json j; VampJson::BufferSerialisation serialisation = (useBase64 ? VampJson::BufferSerialisation::Base64 : VampJson::BufferSerialisation::Array); Json id = writeJsonId(rr.id); switch (rr.type) { case RRType::List: j = VampJson::fromRpcRequest_List(rr.listRequest, id); break; case RRType::Load: j = VampJson::fromRpcRequest_Load(rr.loadRequest, id); break; case RRType::Configure: j = VampJson::fromRpcRequest_Configure(rr.configurationRequest, mapper, id); break; case RRType::Process: j = VampJson::fromRpcRequest_Process (rr.processRequest, mapper, serialisation, id); break; case RRType::Finish: j = VampJson::fromRpcRequest_Finish(rr.finishRequest, mapper, id); break; case RRType::NotValid: break; } cout << j.dump() << endl; } RequestOrResponse readResponseJson(string &err, bool &eof) { RequestOrResponse rr; rr.direction = RequestOrResponse::Response; string input; if (!getline(cin, input)) { // the EOF case, not actually an error eof = true; return rr; } Json j = convertResponseJson(input, err); if (err != "") return {}; rr.type = VampJson::getRequestResponseType(j, err); if (err != "") return {}; rr.id = readJsonId(j); VampJson::BufferSerialisation serialisation = VampJson::BufferSerialisation::Array; const bool isSuccess = j["result"].is_object(); const bool isError = j["error"].is_object(); rr.success = isSuccess; rr.errorText = isError ? j["error"]["message"].string_value() : ""; switch (rr.type) { case RRType::List: rr.listResponse = VampJson::toRpcResponse_List(j, err); break; case RRType::Load: rr.loadResponse = VampJson::toRpcResponse_Load(j, mapper, err); break; case RRType::Configure: rr.configurationResponse = VampJson::toRpcResponse_Configure(j, mapper, err); break; case RRType::Process: rr.processResponse = VampJson::toRpcResponse_Process(j, mapper, serialisation, err); break; case RRType::Finish: rr.finishResponse = VampJson::toRpcResponse_Finish(j, mapper, serialisation, err); break; case RRType::NotValid: break; } return rr; } void writeResponseJson(RequestOrResponse &rr, bool useBase64) { Json j; VampJson::BufferSerialisation serialisation = (useBase64 ? VampJson::BufferSerialisation::Base64 : VampJson::BufferSerialisation::Array); Json id = writeJsonId(rr.id); if (!rr.success) { // errorText here likely contains a full message produced by simple-server // setting writeVerbatimError to true avoids doubling error descriptions j = VampJson::fromError(rr.errorText, rr.type, id, true); } else { switch (rr.type) { case RRType::List: j = VampJson::fromRpcResponse_List(rr.listResponse, id); break; case RRType::Load: j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper, id); break; case RRType::Configure: j = VampJson::fromRpcResponse_Configure(rr.configurationResponse, mapper, id); break; case RRType::Process: j = VampJson::fromRpcResponse_Process (rr.processResponse, mapper, serialisation, id); break; case RRType::Finish: j = VampJson::fromRpcResponse_Finish (rr.finishResponse, mapper, serialisation, id); break; case RRType::NotValid: j = VampJson::fromError(rr.errorText, rr.type, id); break; } } cout << j.dump() << endl; } RequestOrResponse readRequestCapnp(kj::BufferedInputStreamWrapper &buffered) { RequestOrResponse rr; rr.direction = RequestOrResponse::Request; capnp::InputStreamMessageReader message(buffered); piper::RpcRequest::Reader reader = message.getRoot(); rr.type = VampnProto::getRequestResponseType(reader); rr.id = readCapnpId(reader); switch (rr.type) { case RRType::List: VampnProto::readRpcRequest_List(rr.listRequest, reader); break; case RRType::Load: VampnProto::readRpcRequest_Load(rr.loadRequest, reader); break; case RRType::Configure: VampnProto::readRpcRequest_Configure(rr.configurationRequest, reader, mapper); break; case RRType::Process: VampnProto::readRpcRequest_Process(rr.processRequest, reader, mapper); break; case RRType::Finish: VampnProto::readRpcRequest_Finish(rr.finishRequest, reader, mapper); break; case RRType::NotValid: break; } return rr; } void writeRequestCapnp(RequestOrResponse &rr) { capnp::MallocMessageBuilder message; piper::RpcRequest::Builder builder = message.initRoot(); buildCapnpId(builder, rr.id); switch (rr.type) { case RRType::List: VampnProto::buildRpcRequest_List(builder, rr.listRequest); break; case RRType::Load: VampnProto::buildRpcRequest_Load(builder, rr.loadRequest); break; case RRType::Configure: VampnProto::buildRpcRequest_Configure(builder, rr.configurationRequest, mapper); break; case RRType::Process: VampnProto::buildRpcRequest_Process(builder, rr.processRequest, mapper); break; case RRType::Finish: VampnProto::buildRpcRequest_Finish(builder, rr.finishRequest, mapper); break; case RRType::NotValid: break; } writeMessageToFd(1, message); } RequestOrResponse readResponseCapnp(kj::BufferedInputStreamWrapper &buffered) { RequestOrResponse rr; rr.direction = RequestOrResponse::Response; capnp::InputStreamMessageReader message(buffered); piper::RpcResponse::Reader reader = message.getRoot(); rr.type = VampnProto::getRequestResponseType(reader); rr.success = true; rr.errorText = ""; rr.id = readCapnpId(reader); int errorCode = 0; switch (rr.type) { case RRType::List: VampnProto::readRpcResponse_List(rr.listResponse, reader); break; case RRType::Load: VampnProto::readRpcResponse_Load(rr.loadResponse, reader, mapper); break; case RRType::Configure: VampnProto::readRpcResponse_Configure(rr.configurationResponse, reader, mapper); break; case RRType::Process: VampnProto::readRpcResponse_Process(rr.processResponse, reader, mapper); break; case RRType::Finish: VampnProto::readRpcResponse_Finish(rr.finishResponse, reader, mapper); break; case RRType::NotValid: VampnProto::readRpcResponse_Error(errorCode, rr.errorText, reader); break; } return rr; } void writeResponseCapnp(RequestOrResponse &rr) { capnp::MallocMessageBuilder message; piper::RpcResponse::Builder builder = message.initRoot(); buildCapnpId(builder, rr.id); if (!rr.success) { VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type); } else { switch (rr.type) { case RRType::List: VampnProto::buildRpcResponse_List(builder, rr.listResponse); break; case RRType::Load: VampnProto::buildRpcResponse_Load(builder, rr.loadResponse, mapper); break; case RRType::Configure: VampnProto::buildRpcResponse_Configure(builder, rr.configurationResponse, mapper); break; case RRType::Process: VampnProto::buildRpcResponse_Process(builder, rr.processResponse, mapper); break; case RRType::Finish: VampnProto::buildRpcResponse_Finish(builder, rr.finishResponse, mapper); break; case RRType::NotValid: VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type); break; } } writeMessageToFd(1, message); } RequestOrResponse readInputJson(RequestOrResponse::Direction direction, string &err, bool &eof) { if (direction == RequestOrResponse::Request) { return readRequestJson(err, eof); } else { return readResponseJson(err, eof); } } RequestOrResponse readInputCapnp(RequestOrResponse::Direction direction, bool &eof) { static kj::FdInputStream stream(0); // stdin static kj::BufferedInputStreamWrapper buffered(stream); if (buffered.tryGetReadBuffer() == nullptr) { eof = true; return {}; } if (direction == RequestOrResponse::Request) { return readRequestCapnp(buffered); } else { return readResponseCapnp(buffered); } } RequestOrResponse readInput(string format, RequestOrResponse::Direction direction, bool &eof) { eof = false; if (format == "json") { string err; auto result = readInputJson(direction, err, eof); if (err != "") throw runtime_error(err); else return result; } else if (format == "capnp") { return readInputCapnp(direction, eof); } else { throw runtime_error("unknown input format \"" + format + "\""); } } void writeOutput(string format, RequestOrResponse &rr) { if (format == "json") { if (rr.direction == RequestOrResponse::Request) { writeRequestJson(rr, false); } else { writeResponseJson(rr, false); } } else if (format == "json-b64") { if (rr.direction == RequestOrResponse::Request) { writeRequestJson(rr, true); } else { writeResponseJson(rr, true); } } else if (format == "capnp") { if (rr.direction == RequestOrResponse::Request) { writeRequestCapnp(rr); } else { writeResponseCapnp(rr); } } else { throw runtime_error("unknown output format \"" + format + "\""); } } int main(int argc, char **argv) { if (argc < 2) { usage(); } string informat = "json", outformat = "json"; RequestOrResponse::Direction direction = RequestOrResponse::Request; bool haveDirection = false; for (int i = 1; i < argc; ++i) { string arg = argv[i]; bool final = (i + 1 == argc); if (arg == "-i") { if (final) usage(); else informat = argv[++i]; } else if (arg == "-o") { if (final) usage(); else outformat = argv[++i]; } else if (arg == "request") { direction = RequestOrResponse::Request; haveDirection = true; } else if (arg == "response") { direction = RequestOrResponse::Response; haveDirection = true; } else { usage(); } } if (informat == "" || outformat == "" || !haveDirection) { usage(); } #ifdef _WIN32 if (informat == "capnp") { int result = _setmode(_fileno(stdin), _O_BINARY); if (result == -1) { cerr << "Failed to set binary mode on stdin, necessary for capnp format" << endl; exit(1); } } if (outformat == "capnp") { int result = _setmode(_fileno(stdout), _O_BINARY); if (result == -1) { cerr << "Failed to set binary mode on stdout, necessary for capnp format" << endl; exit(1); } } #endif while (true) { try { bool eof = false; RequestOrResponse rr = readInput(informat, direction, eof); if (eof) break; writeOutput(outformat, rr); } catch (std::exception &e) { cerr << "Error: " << e.what() << endl; exit(1); } } exit(0); } sonic-visualiser-3.0.3/piper-cpp/vamp-server/simple-server.cpp0000644000000000000000000005217613111512442022616 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "vamp-json/VampJson.h" #include "vamp-capnp/VampnProto.h" #include "vamp-support/RequestOrResponse.h" #include "vamp-support/CountingPluginHandleMapper.h" #include "vamp-support/LoaderRequests.h" #include #include #include #include #include #include // pid for logging #ifdef _WIN32 #include static int pid = _getpid(); #else #include static int pid = getpid(); #endif // for _setmode stuff and _dup #ifdef _WIN32 #include #include #endif // for dup, open etc #ifndef _WIN32 #include #include #endif using namespace std; using namespace json11; using namespace piper_vamp; using namespace Vamp; static string myname = "piper-vamp-simple-server"; static void version() { cout << "1.0" << endl; exit(0); } static void usage(bool successful = false) { cerr << "\n" << myname << ": Load & run Vamp plugins in response to Piper messages\n\n" " Usage: " << myname << " [-d] \n" " " << myname << " -v\n" " " << myname << " -h\n\n" " where\n" " : the format to read and write messages in (\"json\" or \"capnp\")\n" " -d: also print debug information to stderr\n" " -v: print version number to stdout and exit\n" " -h: print this text to stderr and exit\n\n" "Expects Piper request messages in either Cap'n Proto or JSON format on stdin,\n" "and writes response messages in the same format to stdout.\n\n" "This server is intended for simple process separation. It's only suitable for\n" "use with a single trusted client per server invocation.\n\n" "The two formats behave differently in case of parser errors. JSON messages are\n" "expected one per input line; because the JSON support is really intended for\n" "interactive troubleshooting, any unparseable message is reported and discarded\n" "and the server waits for another message. In contrast, because of the assumption\n" "that the client is trusted and coupled to the server instance, a mangled\n" "Cap'n Proto message causes the server to exit.\n\n"; if (successful) exit(0); else exit(2); } static CountingPluginHandleMapper mapper; // We write our output to stdout, but want to ensure that the plugin // doesn't write anything itself. To do this we open a null file // descriptor and dup2() it into place of stdout in the gaps between // our own output activity. static int normalFd = -1; static int suspendedFd = -1; static void initFds(bool binary) { #ifdef _WIN32 if (binary) { int result = _setmode(0, _O_BINARY); if (result == -1) { throw runtime_error("Failed to set binary mode on stdin"); } result = _setmode(1, _O_BINARY); if (result == -1) { throw runtime_error("Failed to set binary mode on stdout"); } } normalFd = _dup(1); suspendedFd = _open("NUL", _O_WRONLY); #else (void)binary; normalFd = dup(1); suspendedFd = open("/dev/null", O_WRONLY); #endif if (normalFd < 0 || suspendedFd < 0) { throw runtime_error("Failed to initialise fds for stdio suspend/resume"); } } static void suspendOutput() { #ifdef _WIN32 _dup2(suspendedFd, 1); #else dup2(suspendedFd, 1); #endif } static void resumeOutput() { #ifdef _WIN32 _dup2(normalFd, 1); #else dup2(normalFd, 1); #endif } static RequestOrResponse::RpcId readId(const piper::RpcRequest::Reader &r) { int number; string tag; switch (r.getId().which()) { case piper::RpcRequest::Id::Which::NUMBER: number = r.getId().getNumber(); return { RequestOrResponse::RpcId::Number, number, "" }; case piper::RpcRequest::Id::Which::TAG: tag = r.getId().getTag(); return { RequestOrResponse::RpcId::Tag, 0, tag }; case piper::RpcRequest::Id::Which::NONE: return { RequestOrResponse::RpcId::Absent, 0, "" }; } return { RequestOrResponse::RpcId::Absent, 0, "" }; } static void buildId(piper::RpcResponse::Builder &b, const RequestOrResponse::RpcId &id) { switch (id.type) { case RequestOrResponse::RpcId::Number: b.getId().setNumber(id.number); break; case RequestOrResponse::RpcId::Tag: b.getId().setTag(id.tag); break; case RequestOrResponse::RpcId::Absent: b.getId().setNone(); break; } } static RequestOrResponse::RpcId readJsonId(const Json &j) { RequestOrResponse::RpcId id; if (j["id"].is_number()) { id.type = RequestOrResponse::RpcId::Number; id.number = int(round(j["id"].number_value())); } else if (j["id"].is_string()) { id.type = RequestOrResponse::RpcId::Tag; id.tag = j["id"].string_value(); } else { id.type = RequestOrResponse::RpcId::Absent; } return id; } static Json writeJsonId(const RequestOrResponse::RpcId &id) { if (id.type == RequestOrResponse::RpcId::Number) { return id.number; } else if (id.type == RequestOrResponse::RpcId::Tag) { return id.tag; } else { return Json(); } } static Json convertRequestJson(string input, string &err) { Json j = Json::parse(input, err); if (err != "") { err = "invalid json: " + err; return {}; } if (!j.is_object()) { err = "object expected at top level"; } else if (!j["method"].is_string()) { err = "string expected for method field"; } else if (!j["params"].is_null() && !j["params"].is_object()) { err = "object expected for params field"; } return j; } RequestOrResponse readRequestJson(string &err, bool &eof) { RequestOrResponse rr; rr.direction = RequestOrResponse::Request; string input; if (!getline(cin, input)) { // the EOF case, not actually an error eof = true; return rr; } Json j = convertRequestJson(input, err); if (err != "") return {}; rr.type = VampJson::getRequestResponseType(j, err); if (err != "") return {}; rr.id = readJsonId(j); VampJson::BufferSerialisation serialisation = VampJson::BufferSerialisation::Array; switch (rr.type) { case RRType::List: rr.listRequest = VampJson::toRpcRequest_List(j, err); break; case RRType::Load: rr.loadRequest = VampJson::toRpcRequest_Load(j, err); break; case RRType::Configure: rr.configurationRequest = VampJson::toRpcRequest_Configure(j, mapper, err); break; case RRType::Process: rr.processRequest = VampJson::toRpcRequest_Process(j, mapper, serialisation, err); break; case RRType::Finish: rr.finishRequest = VampJson::toRpcRequest_Finish(j, mapper, err); break; case RRType::NotValid: break; } return rr; } void writeResponseJson(RequestOrResponse &rr, bool useBase64) { Json j; VampJson::BufferSerialisation serialisation = (useBase64 ? VampJson::BufferSerialisation::Base64 : VampJson::BufferSerialisation::Array); Json id = writeJsonId(rr.id); if (!rr.success) { j = VampJson::fromError(rr.errorText, rr.type, id); } else { switch (rr.type) { case RRType::List: j = VampJson::fromRpcResponse_List(rr.listResponse, id); break; case RRType::Load: j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper, id); break; case RRType::Configure: j = VampJson::fromRpcResponse_Configure(rr.configurationResponse, mapper, id); break; case RRType::Process: j = VampJson::fromRpcResponse_Process (rr.processResponse, mapper, serialisation, id); break; case RRType::Finish: j = VampJson::fromRpcResponse_Finish (rr.finishResponse, mapper, serialisation, id); break; case RRType::NotValid: break; } } cout << j.dump() << endl; } void writeExceptionJson(const exception &e, RRType type, RequestOrResponse::RpcId id) { Json jid = writeJsonId(id); Json j = VampJson::fromError(e.what(), type, jid); cout << j.dump() << endl; } RequestOrResponse readRequestCapnp(bool &eof) { RequestOrResponse rr; rr.direction = RequestOrResponse::Request; static kj::FdInputStream stream(0); // stdin static kj::BufferedInputStreamWrapper buffered(stream); if (buffered.tryGetReadBuffer() == nullptr) { eof = true; return rr; } capnp::InputStreamMessageReader message(buffered); piper::RpcRequest::Reader reader = message.getRoot(); rr.type = VampnProto::getRequestResponseType(reader); rr.id = readId(reader); switch (rr.type) { case RRType::List: VampnProto::readRpcRequest_List(rr.listRequest, reader); break; case RRType::Load: VampnProto::readRpcRequest_Load(rr.loadRequest, reader); break; case RRType::Configure: VampnProto::readRpcRequest_Configure(rr.configurationRequest, reader, mapper); break; case RRType::Process: VampnProto::readRpcRequest_Process(rr.processRequest, reader, mapper); break; case RRType::Finish: VampnProto::readRpcRequest_Finish(rr.finishRequest, reader, mapper); break; case RRType::NotValid: break; } return rr; } void writeResponseCapnp(RequestOrResponse &rr) { capnp::MallocMessageBuilder message; piper::RpcResponse::Builder builder = message.initRoot(); buildId(builder, rr.id); if (!rr.success) { VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type); } else { switch (rr.type) { case RRType::List: VampnProto::buildRpcResponse_List(builder, rr.listResponse); break; case RRType::Load: VampnProto::buildRpcResponse_Load(builder, rr.loadResponse, mapper); break; case RRType::Configure: VampnProto::buildRpcResponse_Configure(builder, rr.configurationResponse, mapper); break; case RRType::Process: VampnProto::buildRpcResponse_Process(builder, rr.processResponse, mapper); break; case RRType::Finish: VampnProto::buildRpcResponse_Finish(builder, rr.finishResponse, mapper); break; case RRType::NotValid: break; } } writeMessageToFd(1, message); } void writeExceptionCapnp(const exception &e, RRType type, RequestOrResponse::RpcId id) { capnp::MallocMessageBuilder message; piper::RpcResponse::Builder builder = message.initRoot(); buildId(builder, id); VampnProto::buildRpcResponse_Exception(builder, e, type); writeMessageToFd(1, message); } RequestOrResponse handleRequest(const RequestOrResponse &request, bool debug) { RequestOrResponse response; response.direction = RequestOrResponse::Response; response.type = request.type; switch (request.type) { case RRType::List: response.listResponse = LoaderRequests().listPluginData(request.listRequest); response.success = true; break; case RRType::Load: response.loadResponse = LoaderRequests().loadPlugin(request.loadRequest); if (response.loadResponse.plugin != nullptr) { mapper.addPlugin(response.loadResponse.plugin); if (debug) { cerr << "piper-vamp-server " << pid << ": loaded plugin, handle = " << mapper.pluginToHandle(response.loadResponse.plugin) << endl; } response.success = true; } break; case RRType::Configure: { auto &creq = request.configurationRequest; if (!creq.plugin) { throw runtime_error("unknown plugin handle supplied to configure"); } auto h = mapper.pluginToHandle(creq.plugin); if (mapper.isConfigured(h)) { throw runtime_error("plugin has already been configured"); } if (creq.configuration.framing.stepSize == 0 || creq.configuration.framing.blockSize == 0) { throw runtime_error("step and block size must be non-zero"); } response.configurationResponse = LoaderRequests().configurePlugin(creq); if (!response.configurationResponse.outputs.empty()) { mapper.markConfigured (h, creq.configuration.channelCount, response.configurationResponse.framing.blockSize); response.success = true; } break; } case RRType::Process: { auto &preq = request.processRequest; if (!preq.plugin) { throw runtime_error("unknown plugin handle supplied to process"); } auto h = mapper.pluginToHandle(preq.plugin); if (!mapper.isConfigured(h)) { throw runtime_error("plugin has not been configured"); } int channels = int(preq.inputBuffers.size()); if (channels != mapper.getChannelCount(h)) { throw runtime_error("wrong number of channels supplied to process"); } const float **fbuffers = new const float *[channels]; for (int i = 0; i < channels; ++i) { if (int(preq.inputBuffers[i].size()) != mapper.getBlockSize(h)) { ostringstream os; os << "wrong block size supplied to process (" << preq.inputBuffers[i].size() << ", expecting " << mapper.getBlockSize(h) << ")" << ends; delete[] fbuffers; throw runtime_error(os.str()); } fbuffers[i] = preq.inputBuffers[i].data(); } response.processResponse.plugin = preq.plugin; response.processResponse.features = preq.plugin->process(fbuffers, preq.timestamp); response.success = true; delete[] fbuffers; break; } case RRType::Finish: { auto &freq = request.finishRequest; if (!freq.plugin) { throw runtime_error("unknown plugin handle supplied to finish"); } response.finishResponse.plugin = freq.plugin; auto h = mapper.pluginToHandle(freq.plugin); // Finish can be called (to unload the plugin) even if the // plugin has never been configured or used. But we want to // make sure we call getRemainingFeatures only if we have // actually configured the plugin. if (mapper.isConfigured(h)) { response.finishResponse.features = freq.plugin->getRemainingFeatures(); } // We do not delete the plugin here -- we need it in the // mapper when converting the features. It gets deleted in the // calling function. response.success = true; break; } case RRType::NotValid: break; } return response; } RequestOrResponse readRequest(string format, bool &eof) { if (format == "capnp") { return readRequestCapnp(eof); } else if (format == "json") { string err; auto result = readRequestJson(err, eof); if (err != "") throw runtime_error(err); else return result; } else { throw runtime_error("unknown input format \"" + format + "\""); } } void writeResponse(string format, RequestOrResponse &rr) { resumeOutput(); if (format == "capnp") { writeResponseCapnp(rr); } else if (format == "json") { writeResponseJson(rr, false); } else { throw runtime_error("unknown output format \"" + format + "\""); } suspendOutput(); } void writeException(string format, const exception &e, RRType type, RequestOrResponse::RpcId id) { resumeOutput(); if (format == "capnp") { writeExceptionCapnp(e, type, id); } else if (format == "json") { writeExceptionJson(e, type, id); } else { throw runtime_error("unknown output format \"" + format + "\""); } suspendOutput(); } int main(int argc, char **argv) { if (argc != 2 && argc != 3) { usage(); } bool debug = false; string arg = argv[1]; if (arg == "-h") { if (argc == 2) { usage(true); } else { usage(); } } else if (arg == "-v") { if (argc == 2) { version(); } else { usage(); } } else if (arg == "-d") { if (argc == 2) { usage(); } else { debug = true; arg = argv[2]; } } string format = arg; if (format != "capnp" && format != "json") { usage(); } try { initFds(format == "capnp"); } catch (exception &e) { cerr << "ERROR: " << e.what() << endl; exit(1); } suspendOutput(); if (debug) { cerr << myname << " " << pid << ": waiting for format: " << format << endl; } while (true) { RequestOrResponse request; try { bool eof = false; request = readRequest(format, eof); if (eof) { if (debug) { cerr << myname << " " << pid << ": eof reached, exiting" << endl; } break; } if (debug) { cerr << myname << " " << pid << ": request received, of type " << int(request.type) << endl; } } catch (exception &e) { if (debug) { cerr << myname << " " << pid << ": error: " << e.what() << endl; } writeException(format, e, request.type, request.id); if (format == "capnp") { // Don't try to continue; we can't recover from a // mangled input stream. However, we can return a // successful error code because we are reporting the // status in our Capnp output stream instead if (debug) { cerr << myname << " " << pid << ": not attempting to recover from capnp parse problems, exiting" << endl; } exit(0); } } try { RequestOrResponse response = handleRequest(request, debug); response.id = request.id; if (debug) { cerr << myname << " " << pid << ": request handled, writing response" << endl; } writeResponse(format, response); if (debug) { cerr << myname << " " << pid << ": response written" << endl; } if (request.type == RRType::Finish) { auto h = mapper.pluginToHandle(request.finishRequest.plugin); if (debug) { cerr << myname << " " << pid << ": deleting the plugin with handle " << h << endl; } mapper.removePlugin(h); delete request.finishRequest.plugin; } } catch (exception &e) { if (debug) { cerr << myname << " " << pid << ": error: " << e.what() << endl; } writeException(format, e, request.type, request.id); } } exit(0); } sonic-visualiser-3.0.3/piper-cpp/vamp-server/test.sh0000755000000000000000000002224413111512442020624 0ustar 00000000000000#!/bin/bash set -eu mydir=$(dirname "$0") piperdir="$mydir"/../../piper vampsdkdir="$mydir"/../../vamp-plugin-sdk bindir="$mydir"/../bin schemadir="$piperdir"/json/schema if [ ! -d "$schemadir" ]; then echo "WARNING: schema directory $schemadir not found, won't be validating JSON schema" 1>&2 fi tmpdir=$(mktemp -d) if [ ! -d "$tmpdir" ]; then echo "Temp directory creation failed" 1>&2 exit 1 fi trap "rm -rf $tmpdir" 0 reqfile="$tmpdir/req.json" respfile="$tmpdir/resp.json" allrespfile="$tmpdir/resp.all" input="$tmpdir/input" expected="$tmpdir/expected" expected_less_strict="$tmpdir/expected-less-strict" obtained="$tmpdir/obtained" validate() { local file="$1" local schemaname="$2" if [ -d "$schemadir" ]; then echo " * validating against schema $schemaname... " 1>&2 jsonschema -i "$file" "$schemadir/$schemaname.json" 1>&2 && \ echo " -> validated against schema $schemaname" 1>&2 || \ echo " !! failed to validate $schemaname!" 1>&2 else echo "(schema directory $schemadir not found, skipping validation)" 1>&2 fi } validate_request() { local json="$1" echo "$json" > "$reqfile" validate "$reqfile" "rpcrequest" } validate_response() { local json="$1" echo "$json" > "$respfile" validate "$respfile" "rpcresponse" } # NB this list of commands includes a couple that are expected to fail # (process before configure, configure with nonexistent handle, finish # same handle twice) cat > "$input" < "$expected" <> "$allrespfile" validate_response "$response" done ) < "$input" # Skip plugin lists tail -n +4 "$allrespfile" > "$obtained" echo "Checking response contents against expected contents..." # the expected configuration response is fragile, capnp fills in optional fields, # json doesn't - which is fine behaviour, but causes the test to fail - remove empty binCount and binNames expected_without_optional_fields=$( cat "$expected" | sed -E 's/\"(binCount|binNames)\": ?((\[\])|0),? ?//g') echo "$expected_without_optional_fields" > "$expected_less_strict" if cmp "$obtained" "$expected" -s || cmp "$obtained" "$expected_less_strict" -s; then echo "OK" else diff -U 1 "$obtained" "$expected" fi echo "Checking plugin counts from list responses..." # Now check the plugin lists, but as the descriptions etc are # probably a bit fragile, let's just count the number of plugins # First, with no "from" arg to the list call list_no_from=$(head -n +1 "$allrespfile" | fmt -1 | grep '"key"' | wc -l | sed 's/[^0-9]//g') # Now with a "from" arg that includes the library that exists list_with_good_from=$(tail -n +2 "$allrespfile" | head -n +1 | fmt -1 | grep '"key"' | wc -l | sed 's/[^0-9]//g') # Now with a "from" arg that doesn't include any real library list_with_bad_from=$(tail -n +3 "$allrespfile" | head -n +1 | fmt -1 | grep '"key"' | wc -l | sed 's/[^0-9]//g') if [ "$list_no_from" != "6" ]; then echo "Wrong number of plugins from list response without \"from\" arg" echo "Expected 6, obtained $list_no_from" false fi if [ "$list_with_good_from" != "6" ]; then echo "Wrong number of plugins from list response with good \"from\" arg" echo "Expected 6, obtained $list_with_good_from" false fi if [ "$list_with_bad_from" != "0" ]; then echo "Wrong number of plugins from list response with bad \"from\" arg" echo "Expected 0, obtained $list_with_bad_from" false fi echo OK rm "$allrespfile" done echo "Tests succeeded" # set -e at top should ensure we don't get here otherwise sonic-visualiser-3.0.3/piper-cpp/vamp-support/AssignedPluginHandleMapper.h0000644000000000000000000001133113111512442025055 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_ASSIGNED_PLUGIN_HANDLE_MAPPER_H #define PIPER_ASSIGNED_PLUGIN_HANDLE_MAPPER_H #include "PluginHandleMapper.h" #include "PluginOutputIdMapper.h" #include "DefaultPluginOutputIdMapper.h" #include #include #include namespace piper_vamp { class AssignedPluginHandleMapper : public PluginHandleMapper { public: AssignedPluginHandleMapper() { } void addPlugin(Handle h, Vamp::Plugin *p) { if (!p) return; if (m_rplugins.find(p) == m_rplugins.end()) { if (m_plugins.find(h) != m_plugins.end()) { std::cerr << "ERROR: Duplicate plugin handle " << h << " for plugin " << p << " (already used for plugin " << m_plugins[h] << ")" << std::endl; throw std::logic_error("Duplicate plugin handle"); } m_plugins[h] = p; m_rplugins[p] = h; m_outputMappers[h] = std::make_shared(p); } } void removePlugin(Handle h) { if (m_plugins.find(h) == m_plugins.end()) return; Vamp::Plugin *p = m_plugins[h]; m_outputMappers.erase(h); m_plugins.erase(h); if (isConfigured(h)) { m_configuredPlugins.erase(h); m_channelCounts.erase(h); } m_rplugins.erase(p); } bool havePlugin(Vamp::Plugin *p) { return (m_rplugins.find(p) != m_rplugins.end()); } Handle pluginToHandle(Vamp::Plugin *p) const noexcept { if (m_rplugins.find(p) == m_rplugins.end()) { return INVALID_HANDLE; } return m_rplugins.at(p); } Vamp::Plugin *handleToPlugin(Handle h) const noexcept { if (m_plugins.find(h) == m_plugins.end()) { return nullptr; } return m_plugins.at(h); } const std::shared_ptr pluginToOutputIdMapper (Vamp::Plugin *p) const noexcept { return handleToOutputIdMapper(pluginToHandle(p)); } const std::shared_ptr handleToOutputIdMapper (Handle h) const noexcept { if (h != INVALID_HANDLE && m_outputMappers.find(h) != m_outputMappers.end()) { return m_outputMappers.at(h); } else { return {}; } } bool isConfigured(Handle h) const noexcept { if (h == INVALID_HANDLE) return false; return m_configuredPlugins.find(h) != m_configuredPlugins.end(); } void markConfigured(Handle h, int channelCount, int blockSize) { if (h == INVALID_HANDLE) return; m_configuredPlugins.insert(h); m_channelCounts[h] = channelCount; m_blockSizes[h] = blockSize; } int getChannelCount(Handle h) const noexcept { if (m_channelCounts.find(h) == m_channelCounts.end()) { return 0; } return m_channelCounts.at(h); } int getBlockSize(Handle h) const noexcept { if (m_blockSizes.find(h) == m_blockSizes.end()) { return 0; } return m_blockSizes.at(h); } private: std::map m_plugins; std::map m_rplugins; std::set m_configuredPlugins; std::map m_channelCounts; std::map m_blockSizes; std::map> m_outputMappers; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/CountingPluginHandleMapper.h0000644000000000000000000000625513111512442025117 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_COUNTING_PLUGIN_HANDLE_MAPPER_H #define PIPER_COUNTING_PLUGIN_HANDLE_MAPPER_H #include "PluginHandleMapper.h" #include "PluginOutputIdMapper.h" #include "AssignedPluginHandleMapper.h" #include #include namespace piper_vamp { class CountingPluginHandleMapper : public PluginHandleMapper { public: CountingPluginHandleMapper() : m_nextHandle(1) { } void addPlugin(Vamp::Plugin *p) { Handle h = m_nextHandle++; m_sub.addPlugin(h, p); } void removePlugin(Handle h) { m_sub.removePlugin(h); } Handle pluginToHandle(Vamp::Plugin *p) const noexcept { return m_sub.pluginToHandle(p); } Vamp::Plugin *handleToPlugin(Handle h) const noexcept { return m_sub.handleToPlugin(h); } const std::shared_ptr pluginToOutputIdMapper (Vamp::Plugin *p) const noexcept { return m_sub.pluginToOutputIdMapper(p); } const std::shared_ptr handleToOutputIdMapper (Handle h) const noexcept { return m_sub.handleToOutputIdMapper(h); } bool isConfigured(Handle h) const noexcept { return m_sub.isConfigured(h); } void markConfigured(Handle h, int channelCount, int blockSize) { m_sub.markConfigured(h, channelCount, blockSize); } int getChannelCount(Handle h) const noexcept { return m_sub.getChannelCount(h); } int getBlockSize(Handle h) const noexcept { return m_sub.getBlockSize(h); } private: Handle m_nextHandle; // NB plugin handle type must fit in JSON number AssignedPluginHandleMapper m_sub; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/DefaultPluginOutputIdMapper.h0000644000000000000000000000453613111512442025277 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_DEFAULT_PLUGIN_ID_MAPPER_H #define PIPER_DEFAULT_PLUGIN_ID_MAPPER_H #include namespace piper_vamp { class DefaultPluginOutputIdMapper : public PluginOutputIdMapper { public: DefaultPluginOutputIdMapper(Vamp::Plugin *p) { Vamp::Plugin::OutputList outputs = p->getOutputDescriptors(); for (const auto &d: outputs) { m_ids.push_back(d.identifier); } } virtual int idToIndex(std::string outputId) const noexcept { int n = int(m_ids.size()); for (int i = 0; i < n; ++i) { if (outputId == m_ids[i]) { return i; } } return -1; } virtual std::string indexToId(int index) const noexcept { if (index < 0 || size_t(index) >= m_ids.size()) return ""; return m_ids[index]; } private: std::vector m_ids; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/LoaderRequests.h0000644000000000000000000001667013111512442022635 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_LOADER_REQUESTS_H #define PIPER_LOADER_REQUESTS_H #include "PluginStaticData.h" #include "PluginConfiguration.h" #include #include #include #include namespace piper_vamp { class LoaderRequests { public: ListResponse listPluginData(ListRequest req) { auto loader = Vamp::HostExt::PluginLoader::getInstance(); // std::cerr << "listPluginData: about to ask loader to list plugins" << std::endl; std::vector keys; if (req.from.empty()) { keys = loader->listPlugins(); } else { keys = loader->listPluginsIn(req.from); } // std::cerr << "listPluginData: loader listed " << keys.size() << " plugins" << std::endl; ListResponse response; for (std::string key: keys) { // std::cerr << "listPluginData: loading plugin and querying static data: " << key << std::endl; Vamp::Plugin *p = loader->loadPlugin(key, 44100, 0); if (!p) continue; auto category = loader->getPluginCategory(key); response.available.push_back (PluginStaticData::fromPlugin(key, category, p)); delete p; } return response; } LoadResponse loadPlugin(LoadRequest req) { auto loader = Vamp::HostExt::PluginLoader::getInstance(); Vamp::Plugin *plugin = loader->loadPlugin(req.pluginKey, req.inputSampleRate, req.adapterFlags); LoadResponse response; response.plugin = plugin; if (!plugin) return response; response.plugin = plugin; response.staticData = PluginStaticData::fromPlugin (req.pluginKey, loader->getPluginCategory(req.pluginKey), plugin); int defaultChannels = 0; if (plugin->getMinChannelCount() == plugin->getMaxChannelCount()) { defaultChannels = int(plugin->getMinChannelCount()); } response.defaultConfiguration = PluginConfiguration::fromPlugin (plugin, defaultChannels, int(plugin->getPreferredStepSize()), int(plugin->getPreferredBlockSize())); return response; } ConfigurationResponse configurePlugin(ConfigurationRequest req) { for (PluginConfiguration::ParameterMap::const_iterator i = req.configuration.parameterValues.begin(); i != req.configuration.parameterValues.end(); ++i) { req.plugin->setParameter(i->first, i->second); } if (req.configuration.currentProgram != "") { req.plugin->selectProgram(req.configuration.currentProgram); } ConfigurationResponse response; response.plugin = req.plugin; if (req.configuration.framing.stepSize == 0 || req.configuration.framing.blockSize == 0) { return response; } Framing pluginPreferredFraming; pluginPreferredFraming.stepSize = req.plugin->getPreferredStepSize(); pluginPreferredFraming.blockSize = req.plugin->getPreferredBlockSize(); if (req.plugin->initialise(req.configuration.channelCount, req.configuration.framing.stepSize, req.configuration.framing.blockSize)) { response.outputs = req.plugin->getOutputDescriptors(); // If the Vamp plugin initialise() call succeeds, then by // definition it is accepting the step and block size // passed in response.framing = req.configuration.framing; } else { // If initialise() fails, one reason could be that it // didn't like the passed-in framing (step and block // size). // // Vamp and Piper have quite different mechanisms for // negotiating step and block size: // // - If a Vamp plugin doesn't like the step and block size // passed to initialise(), it fails the initialise() call, // returning false from it. The host is expected to have // called getPreferredStepSize()/BlockSize() after it made // any parameter changes that might have affected these // preferences (but before calling initialise). // // - If a Piper server doesn't like the step and block // size passed in a configure request, but if everything // else about the configure request is OK, then it returns // a successful configure response including its preferred // step and block sizes in the response (which the host // must then use). The important thing to note is that // this is still a successful response, something we do // not yet have here. // // We need to check whether the passed-in framing differs // from the plugin's preferences; if so, then we form a // working supposition that initialise() failed because of // this. Vamp contains nothing to allow us to test this, // except to try initialise() again with different // values. So we try again with the values the plugin told // us it would prefer and, if that succeeds, return them // in a successful response in the Piper manner. // // Note that if the "other side" (i.e. the client) wants // to interpret this as if it were dealing with a Vamp // plugin, then it's going to need some equal-but-opposite // acrobatics. if (req.plugin->initialise(req.configuration.channelCount, pluginPreferredFraming.stepSize, pluginPreferredFraming.blockSize)) { response.outputs = req.plugin->getOutputDescriptors(); response.framing = pluginPreferredFraming; } // ... else we return no outputs, which is the error // case (presumably to be converted to Piper error // response). } return response; } }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/PluginConfiguration.h0000644000000000000000000000711513111512442023653 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PLUGIN_CONFIGURATION_H #define PIPER_PLUGIN_CONFIGURATION_H #include #include #include namespace piper_vamp { /** * \struct Framing * * A structure bundling the processing step and block size. */ struct Framing { Framing() : // invalid by default stepSize(0), blockSize(0) { } int stepSize; int blockSize; }; /** * \class PluginConfiguration * * PluginConfiguration is a structure bundling together data that * affect the configuration of a plugin: parameter values, programs, * and initialisation settings. Although an interactive Vamp plugin * host may configure a plugin in stages, for example to take into * account that a plugin's preferred step and block size may change * when its parameters are changed, a batch host or a host supporting * store and recall of configurations may wish to keep all * configuration settings together. */ struct PluginConfiguration { PluginConfiguration() : // invalid configuration by default channelCount(0) { } int channelCount; Framing framing; typedef std::map ParameterMap; ParameterMap parameterValues; std::string currentProgram; /** * Extract the configuration from the given plugin (without * retaining any persistent reference to the plugin itself). */ static PluginConfiguration fromPlugin(Vamp::Plugin *p, int channelCount, int stepSize, int blockSize) { PluginConfiguration c; c.channelCount = channelCount; c.framing.stepSize = stepSize; c.framing.blockSize = blockSize; Vamp::PluginBase::ParameterList params = p->getParameterDescriptors(); for (Vamp::PluginBase::ParameterList::const_iterator i = params.begin(); i != params.end(); ++i) { std::string pid = i->identifier; c.parameterValues[pid] = p->getParameter(pid); } if (!p->getPrograms().empty()) { c.currentProgram = p->getCurrentProgram(); } return c; } }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/PluginHandleMapper.h0000644000000000000000000000705313111512442023405 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PLUGIN_HANDLE_MAPPER_H #define PIPER_PLUGIN_HANDLE_MAPPER_H #include "PluginOutputIdMapper.h" #include #include namespace piper_vamp { /** * Convert plugin pointers to handles within some scope defined by the * individual PluginHandleMapper implementation. * * The special handle 0 and the NULL plugin pointer are both used to * represent "not found" and will be returned in any case where an * unknown handle or plugin is requested. * * Note that the handle type must be representable as a JSON number, * hence the use of a 32-bit rather than 64-bit int. * * This interface also includes methods for obtaining a * PluginOutputIdMapper, \see PluginOutputIdMapper. */ class PluginHandleMapper { public: typedef uint32_t Handle; // unsigned to avoid undefined behaviour on possible wrap const Handle INVALID_HANDLE = 0; virtual ~PluginHandleMapper() noexcept { } /** * Look up and return the handle for a given plugin pointer. * If the given pointer is null or not known, return INVALID_HANDLE. */ virtual Handle pluginToHandle(Vamp::Plugin *) const noexcept = 0; /** * Look up and return the plugin for a given handle. * If the given handle is INVALID_HANDLE or not known, return nullptr. */ virtual Vamp::Plugin *handleToPlugin(Handle) const noexcept = 0; /** * Return a shared pointer to a PluginOutputIdMapper * implementation for the given plugin pointer. If the given * pointer is null or not known, return the null shared_ptr. */ virtual const std::shared_ptr pluginToOutputIdMapper (Vamp::Plugin *p) const noexcept = 0; /** * Return a shared pointer to a PluginOutputIdMapper * implementation for the given plugin handle. If the given * handle is INVALID_HANDLE or not known, return the null shared_ptr. */ virtual const std::shared_ptr handleToOutputIdMapper (Handle h) const noexcept = 0; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/PluginOutputIdMapper.h0000644000000000000000000000434613111512442023771 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PLUGIN_ID_MAPPER_H #define PIPER_PLUGIN_ID_MAPPER_H #include #include #include namespace piper_vamp { class PluginOutputIdMapper { public: virtual ~PluginOutputIdMapper() { } /** * Return the index of the given output id in the plugin. The * first output has index 0. If the given output id is unknown, * return -1. */ virtual int idToIndex(std::string outputId) const noexcept = 0; /** * Return the id of the output with the given index in the * plugin. If the index is out of range, return the empty string. */ virtual std::string indexToId(int index) const noexcept = 0; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/PluginStaticData.h0000644000000000000000000000757013111512442023072 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PLUGIN_STATIC_DATA_H #define PIPER_PLUGIN_STATIC_DATA_H #include namespace piper_vamp { /** * \class PluginStaticData * * PluginStaticData is a structure bundling together all the * information about a plugin that cannot be changed by the plugin * after it is loaded. That is, everything that does not depend on a * parameter or initialisation setting. * * All of the information in here can be queried from other sources * directly (notably the Vamp::Plugin class itself); this structure * just pulls it together in one place and provides something that can * be stored and recalled without having a Vamp::Plugin object to * hand. */ struct PluginStaticData { public: struct Basic { std::string identifier; std::string name; std::string description; }; typedef std::vector BasicList; PluginStaticData() : // invalid static data by default pluginVersion(0), minChannelCount(0), maxChannelCount(0), inputDomain(Vamp::Plugin::TimeDomain) { } std::string pluginKey; Basic basic; std::string maker; std::string copyright; int pluginVersion; std::vector category; size_t minChannelCount; size_t maxChannelCount; Vamp::PluginBase::ParameterList parameters; Vamp::PluginBase::ProgramList programs; Vamp::Plugin::InputDomain inputDomain; BasicList basicOutputInfo; static PluginStaticData fromPlugin(std::string pluginKey, std::vector category, Vamp::Plugin *p) { PluginStaticData d; d.pluginKey = pluginKey; d.basic.identifier = p->getIdentifier(); d.basic.name = p->getName(); d.basic.description = p->getDescription(); d.maker = p->getMaker(); d.copyright = p->getCopyright(); d.pluginVersion = p->getPluginVersion(); d.category = category; d.minChannelCount = p->getMinChannelCount(); d.maxChannelCount = p->getMaxChannelCount(); d.parameters = p->getParameterDescriptors(); d.programs = p->getPrograms(); d.inputDomain = p->getInputDomain(); Vamp::Plugin::OutputList outputs = p->getOutputDescriptors(); for (Vamp::Plugin::OutputList::const_iterator i = outputs.begin(); i != outputs.end(); ++i) { Basic b; b.identifier = i->identifier; b.name = i->name; b.description = i->description; d.basicOutputInfo.push_back(b); } return d; } }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/PreservingPluginHandleMapper.h0000644000000000000000000000634313111512442025453 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PRESERVING_PLUGIN_HANDLE_MAPPER_H #define PIPER_PRESERVING_PLUGIN_HANDLE_MAPPER_H #include "PluginHandleMapper.h" #include "PreservingPluginOutputIdMapper.h" #include namespace piper_vamp { //!!! document -- this is a passthrough thing for a single plugin //!!! handle only, it does not use actually valid Plugin pointers at //!!! all class PreservingPluginHandleMapper : public PluginHandleMapper { public: PreservingPluginHandleMapper() : m_handle(0), m_plugin(0), m_omapper(std::make_shared()) { } virtual Handle pluginToHandle(Vamp::Plugin *p) const noexcept { if (!p) return INVALID_HANDLE; if (p == m_plugin) return m_handle; else { std::cerr << "PreservingPluginHandleMapper: p = " << p << " differs from saved m_plugin " << m_plugin << " (not returning saved handle " << m_handle << ")" << std::endl; return INVALID_HANDLE; } } virtual Vamp::Plugin *handleToPlugin(Handle h) const noexcept { if (h == INVALID_HANDLE) return nullptr; m_handle = h; m_plugin = reinterpret_cast(h); return m_plugin; } virtual const std::shared_ptr pluginToOutputIdMapper (Vamp::Plugin *p) const noexcept { if (!p) return {}; return m_omapper; } virtual const std::shared_ptr handleToOutputIdMapper (Handle h) const noexcept { if (h == INVALID_HANDLE) return {}; return m_omapper; } private: mutable Handle m_handle; mutable Vamp::Plugin *m_plugin; std::shared_ptr m_omapper; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/PreservingPluginOutputIdMapper.h0000644000000000000000000000464613111512442026041 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_PRESERVING_PLUGIN_OUTPUT_ID_MAPPER_H #define PIPER_PRESERVING_PLUGIN_OUTPUT_ID_MAPPER_H #include "PluginOutputIdMapper.h" #include namespace piper_vamp { //!!! document -- this is a passthrough thing that invents its //!!! numerical ids, they have no correspondence with any real plugin class PreservingPluginOutputIdMapper : public PluginOutputIdMapper { public: PreservingPluginOutputIdMapper() { } virtual int idToIndex(std::string outputId) const noexcept { int n = int(m_ids.size()); int i = 0; while (i < n) { if (outputId == m_ids[i]) { return i; } ++i; } m_ids.push_back(outputId); return i; } virtual std::string indexToId(int index) const noexcept { if (index < 0 || size_t(index) >= m_ids.size()) return ""; return m_ids[index]; } private: mutable std::vector m_ids; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/RequestOrResponse.h0000644000000000000000000000511113111512442023327 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_REQUEST_OR_RESPONSE_H #define PIPER_REQUEST_OR_RESPONSE_H #include "RequestResponseType.h" #include "PluginStaticData.h" #include "RequestResponse.h" #include #include namespace piper_vamp { class RequestOrResponse { public: enum Direction { Request, Response }; struct RpcId { enum { Absent, Number, Tag } type; int number; std::string tag; }; RequestOrResponse() : // nothing by default direction(Request), type(RRType::NotValid), success(false), id({ RpcId::Absent, 0, "" }) { } Direction direction; RRType type; bool success; std::string errorText; RpcId id; ListRequest listRequest; ListResponse listResponse; LoadRequest loadRequest; LoadResponse loadResponse; ConfigurationRequest configurationRequest; ConfigurationResponse configurationResponse; ProcessRequest processRequest; ProcessResponse processResponse; FinishRequest finishRequest; FinishResponse finishResponse; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/RequestResponse.h0000644000000000000000000001736413111512442023043 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_REQUEST_RESPONSE_H #define PIPER_REQUEST_RESPONSE_H #include "PluginStaticData.h" #include "PluginConfiguration.h" #include #include namespace piper_vamp { /** * \class ListRequest * * ListRequest is a structure containing the information needed to * list plugins. * * \see ListResponse */ struct ListRequest { ListRequest() { } // no constraints by default std::vector from; }; /** * \class ListResponse * * ListResponse is a structure containing the information returned by * PluginLoader when asked to list static information about the * available plugins. * * \see PluginStaticData */ struct ListResponse { ListResponse() { } // empty by default std::vector available; }; /** * \class LoadRequest * * LoadRequest is a structure containing the information necessary to * load a plugin. When a request is made to load a plugin using a * LoadRequest, the response is typically returned in a LoadResponse * structure. * * \see LoadResponse */ struct LoadRequest { LoadRequest() : // invalid request by default inputSampleRate(0.f), adapterFlags(0) { } /** * PluginKey is a string type that is used to identify a plugin * uniquely within the scope of "the current system". For further * details \see Vamp::PluginLoader::PluginKey. */ typedef std::string PluginKey; /** * The identifying key for the plugin to be loaded. */ PluginKey pluginKey; /** * Sample rate to be passed to the plugin's constructor. */ float inputSampleRate; /** * A bitwise OR of the values in the PluginLoader::AdapterFlags * enumeration, indicating under which circumstances an adapter * should be used to wrap the original plugin. If adapterFlags is * 0, no optional adapters will be used. * * \see Vamp::PluginLoader::AdapterFlags */ int adapterFlags; }; /** * \class LoadResponse * * LoadResponse is a structure containing the information returned by * PluginLoader when asked to load a plugin using a LoadRequest. * * If the plugin could not be loaded, the plugin field will be 0. * * The caller takes ownership of the plugin contained here, which * should be deleted (using the standard C++ delete keyword) after * use. * * \see LoadRequest */ struct LoadResponse { LoadResponse() : // invalid (failed) response by default plugin(0) { } /** * A pointer to the loaded plugin, or 0 if loading failed. Caller * takes ownership of the plugin and must delete it after use. */ Vamp::Plugin *plugin; /** * The static data associated with the loaded plugin, that is, all * information about it that does not depend on its configuration * (parameters, programs, initialisation parameters). The contents * of this structure are only valid if plugin is non-0. * * Much of the data in here is duplicated with the plugin itself. */ PluginStaticData staticData; /** * The default configuration for this plugin, that is, default * values for parameters etc. The contents of this structure are * only valid if plugin is non-0. */ PluginConfiguration defaultConfiguration; }; /** * \class ConfigurationRequest * * A wrapper for a plugin pointer and PluginConfiguration, bundling up * the data needed to configure a plugin after it has been loaded. * * \see PluginConfiguration, ConfigurationResponse, LoadRequest, LoadResponse */ struct ConfigurationRequest { public: ConfigurationRequest() : // invalid request by default plugin(0) { } Vamp::Plugin *plugin; PluginConfiguration configuration; }; /** * \class ConfigurationResponse * * The return value from a configuration request (i.e. setting the * parameters and initialising the plugin). If the configuration was * successful, the output list will contain the final * post-initialisation output descriptors and the required step and * block size. (The step and block size will usually match those * passed to configure, but may differ if the parameter settings * turned out to be incompatible with those.) If configuration failed, * the output list will be empty. * * \see PluginConfiguration, ConfigurationRequest, LoadRequest, LoadResponse */ struct ConfigurationResponse { public: ConfigurationResponse() : // failed by default plugin(0) { } Vamp::Plugin *plugin; Vamp::Plugin::OutputList outputs; Framing framing; }; /** * \class ProcessRequest * * A structure that bundles the necessary data for making a process * call: plugin, input buffers, and timestamp. Caller retains * ownership of the plugin, but the buffers are passed "by value" to * avoid ownership concerns. * * \see Vamp::Plugin::process() */ struct ProcessRequest { public: ProcessRequest() : // invalid by default plugin(0) { } Vamp::Plugin *plugin; std::vector > inputBuffers; Vamp::RealTime timestamp; }; /** * \class ProcessResponse * * A structure that bundles the data returned by a process call. This * is simply a FeatureSet wrapper that happens to reference the plugin * as well. * * \see FinishResponse, Vamp::Plugin::process() */ struct ProcessResponse { public: ProcessResponse() : // invalid by default plugin(0) { } Vamp::Plugin *plugin; Vamp::Plugin::FeatureSet features; }; /** * \class FinishRequest * * A structure that bundles the necessary data for finishing * processing, i.e. calling getRemainingFeatures(). This consists only * of the plugin pointer. Caller retains ownership of the plugin. * * \see Vamp::Plugin::getRemainingFeatures() */ struct FinishRequest { public: FinishRequest() : // invalid by default plugin(0) { } Vamp::Plugin *plugin; }; /** * \class FinishResponse * * A structure that bundles the data returned by a * getRemainingFeatures() call. This is identical to ProcessResponse. * * \see ProcessResponse, Vamp::Plugin::getRemainingFeatures() */ struct FinishResponse { public: FinishResponse() : // invalid by default plugin(0) { } Vamp::Plugin *plugin; Vamp::Plugin::FeatureSet features; }; } #endif sonic-visualiser-3.0.3/piper-cpp/vamp-support/RequestResponseType.h0000644000000000000000000000334513111512442023677 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Piper C++ Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef PIPER_REQUEST_RESPONSE_TYPE_H #define PIPER_REQUEST_RESPONSE_TYPE_H namespace piper_vamp { enum class RRType { List, Load, Configure, Process, Finish, NotValid }; } #endif sonic-visualiser-3.0.3/svapp/.hgignore0000644000000000000000000000016713111512442016074 0ustar 00000000000000syntax: glob Makefile */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej sonic-visualiser-3.0.3/svapp/.hgtags0000644000000000000000000000272313111512442015547 0ustar 00000000000000017206f2e4c5673486fe1037b0d625dd0fc4b015 sv-v1.7.2 0619006a1ee3d982346035eb38934fe8e5848dae last-cc-copyright 0619006a1ee3d982346035eb38934fe8e5848dae sv1-1.0pre1 0619006a1ee3d982346035eb38934fe8e5848dae sv1-1.0pre2 0619006a1ee3d982346035eb38934fe8e5848dae sv1-1.0pre3 0619006a1ee3d982346035eb38934fe8e5848dae sv1-1.0pre4 0619006a1ee3d982346035eb38934fe8e5848dae sv1-1.0rc1 0619006a1ee3d982346035eb38934fe8e5848dae sv1-v1.0 0bd09fb9e584313802feb86834168eabaeaf47c3 sv-v1.5pre1 366f044c20e4abc3c437dce3c7d11501c002f194 sv-v1.6 3b616971bdc6b0f7f9e4537de2988bedd46ab5e6 sv1-v1.2pre3 3b61a975b47e5e3ae978720daea8d7258cbf4ced sv1-v1.3 3b61a975b47e5e3ae978720daea8d7258cbf4ced sv1-v1.3rc1 54287e5e745135ec42463f102c54784242cbe937 sv1-v0.9rc1 54287e5e745135ec42463f102c54784242cbe937 sv1-v0.9rc2 5a40619c72d82e7e21a68ca31b80021b9cd50170 sv-v1.7.1 7dca515713202773bb0bb093e0505861e6d8f162 sv-v1.4rc1 7fff1bb8cc3d55554a9d8139cd1c8169cc31a5e7 sv-v1.5 9cc9862333bd7f89cbc2721d7fda33bf6e501aba sv1-v1.2pre4 9f49d0f1bd2016234db09bb7ee90879819c04f20 sv-v1.7 b774a451b093e3439b74423585f1c93f6a7957ae sv-v1.4 cd5cbdecc82dea9b2c2424228b618d6ff3fbc5c1 sv1-v1.2 e177e6ee7c12d493a514c8d25e95caa4422c2c22 sv1-v1.2pre5 64dfa7d6171d3ebe036f2676ab0a8556b56a41b4 sv_v1.8 eaef94d9f9bfb39440dc7b837bd1e8cd502428da sv_v1.9 7ee215c095dd6466ad5409b72841608cebfba147 sv_v2.0 32d8084f8543e6fd47f2516ab339eaac834a7b8b sv_v2.1 32d8084f8543e6fd47f2516ab339eaac834a7b8b sv_v2.1 8cb01cd2441d1009fce5c1234ecbe033ce45484a sv_v2.1 sonic-visualiser-3.0.3/svapp/.tonioni0000644000000000000000000000000013111512442015733 0ustar 00000000000000sonic-visualiser-3.0.3/svapp/COPYING0000644000000000000000000003543313111512442015330 0ustar 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 sonic-visualiser-3.0.3/svapp/Doxyfile0000644000000000000000000014253313111512442016003 0ustar 00000000000000# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = svapp # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = audioio framework # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-3.0.3/svapp/INSTALL.txt0000644000000000000000000000412113111512442016132 0ustar 00000000000000 To compile from source ---------------------- This file provides various instructions useful when compiling the SV libraries from source, but it doesn't have a complete recipe for any one platform -- there are too many variables. However, you can find a recipe for one platform (Ubuntu Linux) in the file INSTALL.ubuntu. To build, run $ ./configure && make The following additional libraries are required or optional when building the SV core libraries: REQUIRED Qt v4.4 or newer http://qt.nokia.com/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED Rubber Band Library http://www.breakfastquay.com/rubberband/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Redland RDF libraries http://librdf.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://www.annodex.net/software/libraries.html Optional liblo OSC library http://www.plugin.org.uk/liblo/ The Redland RDF libraries include the Raptor RDF parser library, Rasqal RDF query library, and librdf, the Redland RDF datastore (which depends on both of those). The SV libraries require all of these. If you are going to build the rest of the SV libraries, you will also need one or more of: Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have one or the other of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). If you happen to be using a Debian-based Linux, you probably want to apt-get install the following packages: libqt4-dev libsndfile1-dev libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev librdf0-dev . sonic-visualiser-3.0.3/svapp/acinclude.m40000644000000000000000000002160413111512442016461 0ustar 00000000000000 AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, $QTDIR/bin/qt5-qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, qt5-qmake,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) # From autoconf archive: # ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # # The first argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The second argument, if specified 'mandatory' or if left unspecified, # indicates that baseline C++11 support is required and that the macro # should error out if no mode with that support is found. If specified # 'optional', then configuration proceeds regardless, after defining # HAVE_CXX11 if and only if a supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014 Alexey Sokolov # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; ]]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi AC_SUBST(HAVE_CXX11) fi ]) sonic-visualiser-3.0.3/svapp/audio/AudioCallbackPlaySource.cpp0000644000000000000000000015403013111512442022562 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "AudioCallbackPlaySource.h" #include "AudioGenerator.h" #include "data/model/Model.h" #include "base/ViewManagerBase.h" #include "base/PlayParameterRepository.h" #include "base/Preferences.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/WaveFileModel.h" #include "data/model/ReadOnlyWaveFileModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "plugin/RealTimePluginInstance.h" #include "bqaudioio/SystemPlaybackTarget.h" #include "bqaudioio/ResamplerWrapper.h" #include "bqvec/VectorOps.h" #include using namespace RubberBand; using breakfastquay::v_zero_channels; #include #include //#define DEBUG_AUDIO_PLAY_SOURCE 1 //#define DEBUG_AUDIO_PLAY_SOURCE_PLAYING 1 static const int DEFAULT_RING_BUFFER_SIZE = 131071; AudioCallbackPlaySource::AudioCallbackPlaySource(ViewManagerBase *manager, QString clientName) : m_viewManager(manager), m_audioGenerator(new AudioGenerator()), m_clientName(clientName.toUtf8().data()), m_readBuffers(0), m_writeBuffers(0), m_readBufferFill(0), m_writeBufferFill(0), m_bufferScavenger(1), m_sourceChannelCount(0), m_blockSize(1024), m_sourceSampleRate(0), m_deviceSampleRate(0), m_deviceChannelCount(0), m_playLatency(0), m_target(0), m_lastRetrievalTimestamp(0.0), m_lastRetrievedBlockSize(0), m_trustworthyTimestamps(true), m_lastCurrentFrame(0), m_playing(false), m_exiting(false), m_lastModelEndFrame(0), m_ringBufferSize(DEFAULT_RING_BUFFER_SIZE), m_outputLeft(0.0), m_outputRight(0.0), m_levelsSet(false), m_auditioningPlugin(0), m_auditioningPluginBypassed(false), m_playStartFrame(0), m_playStartFramePassed(false), m_timeStretcher(0), m_monoStretcher(0), m_stretchRatio(1.0), m_stretchMono(false), m_stretcherInputCount(0), m_stretcherInputs(0), m_stretcherInputSizes(0), m_fillThread(0), m_resamplerWrapper(0) { m_viewManager->setAudioPlaySource(this); connect(m_viewManager, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); connect(m_viewManager, SIGNAL(playLoopModeChanged()), this, SLOT(playLoopModeChanged())); connect(m_viewManager, SIGNAL(playSelectionModeChanged()), this, SLOT(playSelectionModeChanged())); connect(this, SIGNAL(playStatusChanged(bool)), m_viewManager, SLOT(playStatusChanged(bool))); connect(PlayParameterRepository::getInstance(), SIGNAL(playParametersChanged(PlayParameters *)), this, SLOT(playParametersChanged(PlayParameters *))); connect(Preferences::getInstance(), SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); } AudioCallbackPlaySource::~AudioCallbackPlaySource() { #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::~AudioCallbackPlaySource entering" << endl; #endif m_exiting = true; if (m_fillThread) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource dtor: awakening thread" << endl; #endif m_condition.wakeAll(); m_fillThread->wait(); delete m_fillThread; } clearModels(); if (m_readBuffers != m_writeBuffers) { delete m_readBuffers; } delete m_writeBuffers; delete m_audioGenerator; for (int i = 0; i < m_stretcherInputCount; ++i) { delete[] m_stretcherInputs[i]; } delete[] m_stretcherInputSizes; delete[] m_stretcherInputs; delete m_timeStretcher; delete m_monoStretcher; m_bufferScavenger.scavenge(true); m_pluginScavenger.scavenge(true); #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::~AudioCallbackPlaySource finishing" << endl; #endif } void AudioCallbackPlaySource::addModel(Model *model) { if (m_models.find(model) != m_models.end()) return; bool willPlay = m_audioGenerator->addModel(model); m_mutex.lock(); m_models.insert(model); if (model->getEndFrame() > m_lastModelEndFrame) { m_lastModelEndFrame = model->getEndFrame(); } bool buffersIncreased = false, srChanged = false; int modelChannels = 1; ReadOnlyWaveFileModel *rowfm = qobject_cast(model); if (rowfm) modelChannels = rowfm->getChannelCount(); if (modelChannels > m_sourceChannelCount) { m_sourceChannelCount = modelChannels; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource: Adding model with " << modelChannels << " channels at rate " << model->getSampleRate() << endl; #endif if (m_sourceSampleRate == 0) { SVDEBUG << "AudioCallbackPlaySource::addModel: Source rate changing from 0 to " << model->getSampleRate() << endl; m_sourceSampleRate = model->getSampleRate(); srChanged = true; } else if (model->getSampleRate() != m_sourceSampleRate) { // If this is a read-only wave file model and we have no // other, we can just switch to this model's sample rate if (rowfm) { bool conflicting = false; for (std::set::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { // Only read-only wave file models should be // considered conflicting -- writable wave file models // are derived and we shouldn't take their rates into // account. Also, don't give any particular weight to // a file that's already playing at the wrong rate // anyway ReadOnlyWaveFileModel *other = qobject_cast(*i); if (other && other != rowfm && other->getSampleRate() != model->getSampleRate() && other->getSampleRate() == m_sourceSampleRate) { SVDEBUG << "AudioCallbackPlaySource::addModel: Conflicting wave file model " << *i << " found" << endl; conflicting = true; break; } } if (conflicting) { SVDEBUG << "AudioCallbackPlaySource::addModel: ERROR: " << "New model sample rate does not match" << endl << "existing model(s) (new " << model->getSampleRate() << " vs " << m_sourceSampleRate << "), playback will be wrong" << endl; emit sampleRateMismatch(model->getSampleRate(), m_sourceSampleRate, false); } else { SVDEBUG << "AudioCallbackPlaySource::addModel: Source rate changing from " << m_sourceSampleRate << " to " << model->getSampleRate() << endl; m_sourceSampleRate = model->getSampleRate(); srChanged = true; } } } if (!m_writeBuffers || (int)m_writeBuffers->size() < getTargetChannelCount()) { cerr << "m_writeBuffers size = " << (m_writeBuffers ? m_writeBuffers->size() : 0) << endl; cerr << "target channel count = " << (getTargetChannelCount()) << endl; clearRingBuffers(true, getTargetChannelCount()); buffersIncreased = true; } else { if (willPlay) clearRingBuffers(true); } if (srChanged) { SVCERR << "AudioCallbackPlaySource: Source rate changed" << endl; if (m_resamplerWrapper) { SVCERR << "AudioCallbackPlaySource: Source sample rate changed to " << m_sourceSampleRate << ", updating resampler wrapper" << endl; m_resamplerWrapper->changeApplicationSampleRate (int(round(m_sourceSampleRate))); m_resamplerWrapper->reset(); } delete m_timeStretcher; delete m_monoStretcher; m_timeStretcher = 0; m_monoStretcher = 0; if (m_stretchRatio != 1.f) { setTimeStretch(m_stretchRatio); } } rebuildRangeLists(); m_mutex.unlock(); m_audioGenerator->setTargetChannelCount(getTargetChannelCount()); if (buffersIncreased) { SVDEBUG << "AudioCallbackPlaySource::addModel: Number of buffers increased to " << getTargetChannelCount() << endl; if (getTargetChannelCount() > getDeviceChannelCount()) { SVDEBUG << "AudioCallbackPlaySource::addModel: This is more than the device channel count, signalling channelCountIncreased" << endl; emit channelCountIncreased(getTargetChannelCount()); } else { SVDEBUG << "AudioCallbackPlaySource::addModel: This is no more than the device channel count (" << getDeviceChannelCount() << "), so taking no action" << endl; } } if (!m_fillThread) { m_fillThread = new FillThread(*this); m_fillThread->start(); } #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::addModel: now have " << m_models.size() << " model(s)" << endl; #endif connect(model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::addModel: awakening thread" << endl; #endif m_condition.wakeAll(); } void AudioCallbackPlaySource::modelChangedWithin(sv_frame_t #ifdef DEBUG_AUDIO_PLAY_SOURCE startFrame #endif , sv_frame_t endFrame) { #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::modelChangedWithin(" << startFrame << "," << endFrame << ")" << endl; #endif if (endFrame > m_lastModelEndFrame) { m_lastModelEndFrame = endFrame; rebuildRangeLists(); } } void AudioCallbackPlaySource::removeModel(Model *model) { m_mutex.lock(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::removeModel(" << model << ")" << endl; #endif disconnect(model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); m_models.erase(model); // I don't think we have to do this any more: if a new model is // loaded at a different rate, we'll hit the non-conflicting path // in addModel and the rate will be updated without problems; but // if a new model is loaded at the rate that we were using for the // last one, then we save work by not having reset this here // // if (m_models.empty()) { // m_sourceSampleRate = 0; // } sv_frame_t lastEnd = 0; for (std::set::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::removeModel(" << model << "): checking end frame on model " << *i << endl; #endif if ((*i)->getEndFrame() > lastEnd) { lastEnd = (*i)->getEndFrame(); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "(done, lastEnd now " << lastEnd << ")" << endl; #endif } m_lastModelEndFrame = lastEnd; m_audioGenerator->removeModel(model); m_mutex.unlock(); clearRingBuffers(); } void AudioCallbackPlaySource::clearModels() { m_mutex.lock(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::clearModels()" << endl; #endif m_models.clear(); m_lastModelEndFrame = 0; m_sourceSampleRate = 0; m_mutex.unlock(); m_audioGenerator->clearModels(); clearRingBuffers(); } void AudioCallbackPlaySource::clearRingBuffers(bool haveLock, int count) { if (!haveLock) m_mutex.lock(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "clearRingBuffers" << endl; #endif rebuildRangeLists(); if (count == 0) { if (m_writeBuffers) count = int(m_writeBuffers->size()); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "current playing frame = " << getCurrentPlayingFrame() << endl; cout << "write buffer fill (before) = " << m_writeBufferFill << endl; #endif m_writeBufferFill = getCurrentBufferedFrame(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "current buffered frame = " << m_writeBufferFill << endl; #endif if (m_readBuffers != m_writeBuffers) { delete m_writeBuffers; } m_writeBuffers = new RingBufferVector; for (int i = 0; i < count; ++i) { m_writeBuffers->push_back(new RingBuffer(m_ringBufferSize)); } m_audioGenerator->reset(); // cout << "AudioCallbackPlaySource::clearRingBuffers: Created " // << count << " write buffers" << endl; if (!haveLock) { m_mutex.unlock(); } } void AudioCallbackPlaySource::play(sv_frame_t startFrame) { if (!m_target) return; if (!m_sourceSampleRate) { SVCERR << "AudioCallbackPlaySource::play: No source sample rate available, not playing" << endl; return; } if (m_viewManager->getPlaySelectionMode() && !m_viewManager->getSelections().empty()) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::play: constraining frame " << startFrame << " to selection = "; #endif startFrame = m_viewManager->constrainFrameToSelection(startFrame); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << startFrame << endl; #endif } else { if (startFrame < 0) { startFrame = 0; } if (startFrame >= m_lastModelEndFrame) { startFrame = 0; } } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "play(" << startFrame << ") -> aligned playback model "; #endif startFrame = m_viewManager->alignReferenceToPlaybackFrame(startFrame); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << startFrame << endl; #endif // The fill thread will automatically empty its buffers before // starting again if we have not so far been playing, but not if // we're just re-seeking. // NO -- we can end up playing some first -- always reset here m_mutex.lock(); if (m_timeStretcher) { m_timeStretcher->reset(); } if (m_monoStretcher) { m_monoStretcher->reset(); } m_readBufferFill = m_writeBufferFill = startFrame; if (m_readBuffers) { for (int c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *rb = getReadRingBuffer(c); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "reset ring buffer for channel " << c << endl; #endif if (rb) rb->reset(); } } m_mutex.unlock(); m_audioGenerator->reset(); m_playStartFrame = startFrame; m_playStartFramePassed = false; m_playStartedAt = RealTime::zeroTime; if (m_target) { m_playStartedAt = RealTime::fromSeconds(m_target->getCurrentTime()); } bool changed = !m_playing; m_lastRetrievalTimestamp = 0; m_lastCurrentFrame = 0; m_playing = true; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::play: awakening thread" << endl; #endif m_condition.wakeAll(); if (changed) { emit playStatusChanged(m_playing); emit activity(tr("Play from %1").arg (RealTime::frame2RealTime (m_playStartFrame, m_sourceSampleRate).toText().c_str())); } } void AudioCallbackPlaySource::stop() { #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::stop()" << endl; #endif bool changed = m_playing; m_playing = false; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::stop: awakening thread" << endl; #endif m_condition.wakeAll(); m_lastRetrievalTimestamp = 0; if (changed) { emit playStatusChanged(m_playing); emit activity(tr("Stop at %1").arg (RealTime::frame2RealTime (m_lastCurrentFrame, m_sourceSampleRate).toText().c_str())); } m_lastCurrentFrame = 0; } void AudioCallbackPlaySource::selectionChanged() { if (m_viewManager->getPlaySelectionMode()) { clearRingBuffers(); } } void AudioCallbackPlaySource::playLoopModeChanged() { clearRingBuffers(); } void AudioCallbackPlaySource::playSelectionModeChanged() { if (!m_viewManager->getSelections().empty()) { clearRingBuffers(); } } void AudioCallbackPlaySource::playParametersChanged(PlayParameters *) { clearRingBuffers(); } void AudioCallbackPlaySource::preferenceChanged(PropertyContainer::PropertyName ) { } void AudioCallbackPlaySource::audioProcessingOverload() { SVCERR << "Audio processing overload!" << endl; if (!m_playing) return; RealTimePluginInstance *ap = m_auditioningPlugin; if (ap && !m_auditioningPluginBypassed) { m_auditioningPluginBypassed = true; emit audioOverloadPluginDisabled(); return; } if (m_timeStretcher && m_timeStretcher->getTimeRatio() < 1.0 && m_stretcherInputCount > 1 && m_monoStretcher && !m_stretchMono) { m_stretchMono = true; emit audioTimeStretchMultiChannelDisabled(); return; } } void AudioCallbackPlaySource::setSystemPlaybackTarget(breakfastquay::SystemPlaybackTarget *target) { if (target == 0) { // reset target-related facts and figures m_deviceSampleRate = 0; m_deviceChannelCount = 0; } m_target = target; } void AudioCallbackPlaySource::setResamplerWrapper(breakfastquay::ResamplerWrapper *w) { m_resamplerWrapper = w; if (m_resamplerWrapper && m_sourceSampleRate != 0) { m_resamplerWrapper->changeApplicationSampleRate (int(round(m_sourceSampleRate))); } } void AudioCallbackPlaySource::setSystemPlaybackBlockSize(int size) { cout << "AudioCallbackPlaySource::setTarget: Block size -> " << size << endl; if (size != 0) { m_blockSize = size; } if (size * 4 > m_ringBufferSize) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::setTarget: Buffer size " << size << " > a quarter of ring buffer size " << m_ringBufferSize << ", calling for more ring buffer" << endl; #endif m_ringBufferSize = size * 4; if (m_writeBuffers && !m_writeBuffers->empty()) { clearRingBuffers(); } } } int AudioCallbackPlaySource::getTargetBlockSize() const { // cout << "AudioCallbackPlaySource::getTargetBlockSize() -> " << m_blockSize << endl; return int(m_blockSize); } void AudioCallbackPlaySource::setSystemPlaybackLatency(int latency) { m_playLatency = latency; } sv_frame_t AudioCallbackPlaySource::getTargetPlayLatency() const { return m_playLatency; } sv_frame_t AudioCallbackPlaySource::getCurrentPlayingFrame() { // This method attempts to estimate which audio sample frame is // "currently coming through the speakers". sv_samplerate_t deviceRate = getDeviceSampleRate(); sv_frame_t latency = m_playLatency; // at target rate RealTime latency_t = RealTime::zeroTime; if (deviceRate != 0) { latency_t = RealTime::frame2RealTime(latency, deviceRate); } return getCurrentFrame(latency_t); } sv_frame_t AudioCallbackPlaySource::getCurrentBufferedFrame() { return getCurrentFrame(RealTime::zeroTime); } sv_frame_t AudioCallbackPlaySource::getCurrentFrame(RealTime latency_t) { // The ring buffers contain data at the source sample rate and all // processing (including time stretching) happens at this // rate. Resampling only happens after the audio data leaves this // class. // (But because historically more than one sample rate could have // been involved here, we do latency calculations using RealTime // values instead of samples.) sv_samplerate_t rate = getSourceSampleRate(); if (rate == 0) return 0; int inbuffer = 0; // at target rate for (int c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *rb = getReadRingBuffer(c); if (rb) { int here = rb->getReadSpace(); if (c == 0 || here < inbuffer) inbuffer = here; } } sv_frame_t readBufferFill = m_readBufferFill; sv_frame_t lastRetrievedBlockSize = m_lastRetrievedBlockSize; double lastRetrievalTimestamp = m_lastRetrievalTimestamp; double currentTime = 0.0; if (m_target) currentTime = m_target->getCurrentTime(); bool looping = m_viewManager->getPlayLoopMode(); RealTime inbuffer_t = RealTime::frame2RealTime(inbuffer, rate); sv_frame_t stretchlat = 0; double timeRatio = 1.0; if (m_timeStretcher) { stretchlat = m_timeStretcher->getLatency(); timeRatio = m_timeStretcher->getTimeRatio(); } RealTime stretchlat_t = RealTime::frame2RealTime(stretchlat, rate); // When the target has just requested a block from us, the last // sample it obtained was our buffer fill frame count minus the // amount of read space (converted back to source sample rate) // remaining now. That sample is not expected to be played until // the target's play latency has elapsed. By the time the // following block is requested, that sample will be at the // target's play latency minus the last requested block size away // from being played. RealTime sincerequest_t = RealTime::zeroTime; RealTime lastretrieved_t = RealTime::zeroTime; if (m_target && m_trustworthyTimestamps && lastRetrievalTimestamp != 0.0) { lastretrieved_t = RealTime::frame2RealTime(lastRetrievedBlockSize, rate); // calculate number of frames at target rate that have elapsed // since the end of the last call to getSourceSamples if (m_trustworthyTimestamps && !looping) { // this adjustment seems to cause more problems when looping double elapsed = currentTime - lastRetrievalTimestamp; if (elapsed > 0.0) { sincerequest_t = RealTime::fromSeconds(elapsed); } } } else { lastretrieved_t = RealTime::frame2RealTime(getTargetBlockSize(), rate); } RealTime bufferedto_t = RealTime::frame2RealTime(readBufferFill, rate); if (timeRatio != 1.0) { lastretrieved_t = lastretrieved_t / timeRatio; sincerequest_t = sincerequest_t / timeRatio; latency_t = latency_t / timeRatio; } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "\nbuffered to: " << bufferedto_t << ", in buffer: " << inbuffer_t << ", time ratio " << timeRatio << "\n stretcher latency: " << stretchlat_t << ", device latency: " << latency_t << "\n since request: " << sincerequest_t << ", last retrieved quantity: " << lastretrieved_t << endl; #endif // Normally the range lists should contain at least one item each // -- if playback is unconstrained, that item should report the // entire source audio duration. if (m_rangeStarts.empty()) { rebuildRangeLists(); } if (m_rangeStarts.empty()) { // this code is only used in case of error in rebuildRangeLists RealTime playing_t = bufferedto_t - latency_t - stretchlat_t - lastretrieved_t - inbuffer_t + sincerequest_t; if (playing_t < RealTime::zeroTime) playing_t = RealTime::zeroTime; sv_frame_t frame = RealTime::realTime2Frame(playing_t, rate); return m_viewManager->alignPlaybackFrameToReference(frame); } int inRange = 0; int index = 0; for (int i = 0; i < (int)m_rangeStarts.size(); ++i) { if (bufferedto_t >= m_rangeStarts[i]) { inRange = index; } else { break; } ++index; } if (inRange >= int(m_rangeStarts.size())) { inRange = int(m_rangeStarts.size())-1; } RealTime playing_t = bufferedto_t; playing_t = playing_t - latency_t - stretchlat_t - lastretrieved_t - inbuffer_t + sincerequest_t; // This rather gross little hack is used to ensure that latency // compensation doesn't result in the playback pointer appearing // to start earlier than the actual playback does. It doesn't // work properly (hence the bail-out in the middle) because if we // are playing a relatively short looped region, the playing time // estimated from the buffer fill frame may have wrapped around // the region boundary and end up being much smaller than the // theoretical play start frame, perhaps even for the entire // duration of playback! if (!m_playStartFramePassed) { RealTime playstart_t = RealTime::frame2RealTime(m_playStartFrame, rate); if (playing_t < playstart_t) { // cout << "playing_t " << playing_t << " < playstart_t " // << playstart_t << endl; if (/*!!! sincerequest_t > RealTime::zeroTime && */ m_playStartedAt + latency_t + stretchlat_t < RealTime::fromSeconds(currentTime)) { // cout << "but we've been playing for long enough that I think we should disregard it (it probably results from loop wrapping)" << endl; m_playStartFramePassed = true; } else { playing_t = playstart_t; } } else { m_playStartFramePassed = true; } } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "playing_t " << playing_t; #endif playing_t = playing_t - m_rangeStarts[inRange]; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << " as offset into range " << inRange << " (start =" << m_rangeStarts[inRange] << " duration =" << m_rangeDurations[inRange] << ") = " << playing_t << endl; #endif while (playing_t < RealTime::zeroTime) { if (inRange == 0) { if (looping) { inRange = int(m_rangeStarts.size()) - 1; } else { break; } } else { --inRange; } playing_t = playing_t + m_rangeDurations[inRange]; } playing_t = playing_t + m_rangeStarts[inRange]; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << " playing time: " << playing_t << endl; #endif if (!looping) { if (inRange == (int)m_rangeStarts.size()-1 && playing_t >= m_rangeStarts[inRange] + m_rangeDurations[inRange]) { cout << "Not looping, inRange " << inRange << " == rangeStarts.size()-1, playing_t " << playing_t << " >= m_rangeStarts[inRange] " << m_rangeStarts[inRange] << " + m_rangeDurations[inRange] " << m_rangeDurations[inRange] << " -- stopping" << endl; stop(); } } if (playing_t < RealTime::zeroTime) playing_t = RealTime::zeroTime; sv_frame_t frame = RealTime::realTime2Frame(playing_t, rate); if (m_lastCurrentFrame > 0 && !looping) { if (frame < m_lastCurrentFrame) { frame = m_lastCurrentFrame; } } m_lastCurrentFrame = frame; return m_viewManager->alignPlaybackFrameToReference(frame); } void AudioCallbackPlaySource::rebuildRangeLists() { bool constrained = (m_viewManager->getPlaySelectionMode()); m_rangeStarts.clear(); m_rangeDurations.clear(); sv_samplerate_t sourceRate = getSourceSampleRate(); if (sourceRate == 0) return; RealTime end = RealTime::frame2RealTime(m_lastModelEndFrame, sourceRate); if (end == RealTime::zeroTime) return; if (!constrained) { m_rangeStarts.push_back(RealTime::zeroTime); m_rangeDurations.push_back(end); return; } MultiSelection::SelectionList selections = m_viewManager->getSelections(); MultiSelection::SelectionList::const_iterator i; #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::rebuildRangeLists" << endl; #endif if (!selections.empty()) { for (i = selections.begin(); i != selections.end(); ++i) { RealTime start = (RealTime::frame2RealTime (m_viewManager->alignReferenceToPlaybackFrame(i->getStartFrame()), sourceRate)); RealTime duration = (RealTime::frame2RealTime (m_viewManager->alignReferenceToPlaybackFrame(i->getEndFrame()) - m_viewManager->alignReferenceToPlaybackFrame(i->getStartFrame()), sourceRate)); m_rangeStarts.push_back(start); m_rangeDurations.push_back(duration); } } else { m_rangeStarts.push_back(RealTime::zeroTime); m_rangeDurations.push_back(end); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Now have " << m_rangeStarts.size() << " play ranges" << endl; #endif } void AudioCallbackPlaySource::setOutputLevels(float left, float right) { if (left > m_outputLeft) m_outputLeft = left; if (right > m_outputRight) m_outputRight = right; m_levelsSet = true; } bool AudioCallbackPlaySource::getOutputLevels(float &left, float &right) { left = m_outputLeft; right = m_outputRight; bool valid = m_levelsSet; m_outputLeft = 0.f; m_outputRight = 0.f; m_levelsSet = false; return valid; } void AudioCallbackPlaySource::setSystemPlaybackSampleRate(int sr) { m_deviceSampleRate = sr; } void AudioCallbackPlaySource::setSystemPlaybackChannelCount(int count) { m_deviceChannelCount = count; } void AudioCallbackPlaySource::setAuditioningEffect(Auditionable *a) { RealTimePluginInstance *plugin = dynamic_cast(a); if (a && !plugin) { SVCERR << "WARNING: AudioCallbackPlaySource::setAuditioningEffect: auditionable object " << a << " is not a real-time plugin instance" << endl; } m_mutex.lock(); m_auditioningPlugin = plugin; m_auditioningPluginBypassed = false; m_mutex.unlock(); } void AudioCallbackPlaySource::setSoloModelSet(std::set s) { m_audioGenerator->setSoloModelSet(s); clearRingBuffers(); } void AudioCallbackPlaySource::clearSoloModelSet() { m_audioGenerator->clearSoloModelSet(); clearRingBuffers(); } sv_samplerate_t AudioCallbackPlaySource::getDeviceSampleRate() const { return m_deviceSampleRate; } int AudioCallbackPlaySource::getSourceChannelCount() const { return m_sourceChannelCount; } int AudioCallbackPlaySource::getTargetChannelCount() const { if (m_sourceChannelCount < 2) return 2; return m_sourceChannelCount; } int AudioCallbackPlaySource::getDeviceChannelCount() const { return m_deviceChannelCount; } sv_samplerate_t AudioCallbackPlaySource::getSourceSampleRate() const { return m_sourceSampleRate; } void AudioCallbackPlaySource::setTimeStretch(double factor) { m_stretchRatio = factor; int rate = int(getSourceSampleRate()); if (!rate) return; // have to make our stretcher later if (m_timeStretcher || (factor == 1.0)) { // stretch ratio will be set in next process call if appropriate } else { m_stretcherInputCount = getTargetChannelCount(); RubberBandStretcher *stretcher = new RubberBandStretcher (rate, m_stretcherInputCount, RubberBandStretcher::OptionProcessRealTime, factor); RubberBandStretcher *monoStretcher = new RubberBandStretcher (rate, 1, RubberBandStretcher::OptionProcessRealTime, factor); m_stretcherInputs = new float *[m_stretcherInputCount]; m_stretcherInputSizes = new sv_frame_t[m_stretcherInputCount]; for (int c = 0; c < m_stretcherInputCount; ++c) { m_stretcherInputSizes[c] = 16384; m_stretcherInputs[c] = new float[m_stretcherInputSizes[c]]; } m_monoStretcher = monoStretcher; m_timeStretcher = stretcher; } emit activity(tr("Change time-stretch factor to %1").arg(factor)); } int AudioCallbackPlaySource::getSourceSamples(float *const *buffer, int requestedChannels, int count) { // In principle, the target will handle channel mapping in cases // where our channel count differs from the device's. But that // only holds if our channel count doesn't change -- i.e. if // getApplicationChannelCount() always returns the same value as // it did when the target was created, and if this function always // returns that number of channels. // // Unfortunately that can't hold for us -- we always have at least // 2 channels but if the user opens a new main model with more // channels than that (and more than the last main model) then our // target channel count necessarily gets increased. // // We have: // // getSourceChannelCount() -> number of channels available to // provide from real model data // // getTargetChannelCount() -> number we will actually provide; // same as getSourceChannelCount() except that it is always at // least 2 // // getDeviceChannelCount() -> number the device will emit, usually // equal to the value of getTargetChannelCount() at the time the // device was initialised, unless the device could not provide // that number // // requestedChannels -> number the device is expecting from us, // always equal to the value of getTargetChannelCount() at the // time the device was initialised // // If the requested channel count is at least the target channel // count, then we go ahead and provide the target channels as // expected. We just zero any spare channels. // // If the requested channel count is smaller than the target // channel count, then we don't know what to do and we provide // nothing. This shouldn't happen as long as management is on the // ball -- we emit channelCountIncreased() when the target channel // count increases, and whatever code "owns" the driver should // have reopened the audio device when it got that signal. But // there's a race condition there, which we accommodate with this // check. int channels = getTargetChannelCount(); if (!m_playing) { #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "AudioCallbackPlaySource::getSourceSamples: Not playing" << endl; #endif v_zero_channels(buffer, requestedChannels, count); return 0; } if (requestedChannels < channels) { SVDEBUG << "AudioCallbackPlaySource::getSourceSamples: Not enough device channels (" << requestedChannels << ", need " << channels << "); hoping device is about to be reopened" << endl; v_zero_channels(buffer, requestedChannels, count); return 0; } if (requestedChannels > channels) { v_zero_channels(buffer + channels, requestedChannels - channels, count); } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "AudioCallbackPlaySource::getSourceSamples: Playing" << endl; #endif // Ensure that all buffers have at least the amount of data we // need -- else reduce the size of our requests correspondingly for (int ch = 0; ch < channels; ++ch) { RingBuffer *rb = getReadRingBuffer(ch); if (!rb) { SVCERR << "WARNING: AudioCallbackPlaySource::getSourceSamples: " << "No ring buffer available for channel " << ch << ", returning no data here" << endl; count = 0; break; } int rs = rb->getReadSpace(); if (rs < count) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cerr << "WARNING: AudioCallbackPlaySource::getSourceSamples: " << "Ring buffer for channel " << ch << " has only " << rs << " (of " << count << ") samples available (" << "ring buffer size is " << rb->getSize() << ", write " << "space " << rb->getWriteSpace() << "), " << "reducing request size" << endl; #endif count = rs; } } if (count == 0) return 0; RubberBandStretcher *ts = m_timeStretcher; RubberBandStretcher *ms = m_monoStretcher; double ratio = ts ? ts->getTimeRatio() : 1.0; if (ratio != m_stretchRatio) { if (!ts) { SVCERR << "WARNING: AudioCallbackPlaySource::getSourceSamples: Time ratio change to " << m_stretchRatio << " is pending, but no stretcher is set" << endl; m_stretchRatio = 1.0; } else { ts->setTimeRatio(m_stretchRatio); if (ms) ms->setTimeRatio(m_stretchRatio); if (m_stretchRatio >= 1.0) m_stretchMono = false; } } int stretchChannels = m_stretcherInputCount; if (m_stretchMono) { if (ms) { ts = ms; stretchChannels = 1; } else { m_stretchMono = false; } } if (m_target) { m_lastRetrievedBlockSize = count; m_lastRetrievalTimestamp = m_target->getCurrentTime(); } if (!ts || ratio == 1.f) { int got = 0; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "channels == " << channels << endl; #endif for (int ch = 0; ch < channels; ++ch) { RingBuffer *rb = getReadRingBuffer(ch); if (rb) { // this is marginally more likely to leave our channels in // sync after a processing failure than just passing "count": sv_frame_t request = count; if (ch > 0) request = got; got = rb->read(buffer[ch], int(request)); #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "AudioCallbackPlaySource::getSamples: got " << got << " (of " << count << ") samples on channel " << ch << ", signalling for more (possibly)" << endl; #endif } for (int ch = 0; ch < channels; ++ch) { for (int i = got; i < count; ++i) { buffer[ch][i] = 0.0; } } } applyAuditioningEffect(count, buffer); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::getSamples: awakening thread" << endl; #endif m_condition.wakeAll(); return got; } sv_frame_t available; sv_frame_t fedToStretcher = 0; int warned = 0; // The input block for a given output is approx output / ratio, // but we can't predict it exactly, for an adaptive timestretcher. while ((available = ts->available()) < count) { sv_frame_t reqd = lrint(double(count - available) / ratio); reqd = std::max(reqd, sv_frame_t(ts->getSamplesRequired())); if (reqd == 0) reqd = 1; sv_frame_t got = reqd; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "reqd = " <= m_stretcherInputCount) continue; RingBuffer *rb = getReadRingBuffer(c); if (rb) { sv_frame_t gotHere; if (stretchChannels == 1 && c > 0) { gotHere = rb->readAdding(m_stretcherInputs[0], int(got)); } else { gotHere = rb->read(m_stretcherInputs[c], int(got)); } if (gotHere < got) got = gotHere; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING if (c == 0) { cout << "feeding stretcher: got " << gotHere << ", " << rb->getReadSpace() << " remain" << endl; } #endif } else { SVCERR << "WARNING: No ring buffer available for channel " << c << " in stretcher input block" << endl; } } if (got < reqd) { SVCERR << "WARNING: Read underrun in playback (" << got << " < " << reqd << ")" << endl; } ts->process(m_stretcherInputs, size_t(got), false); fedToStretcher += got; if (got == 0) break; if (ts->available() == available) { SVCERR << "WARNING: AudioCallbackPlaySource::getSamples: Added " << got << " samples to time stretcher, created no new available output samples (warned = " << warned << ")" << endl; if (++warned == 5) break; } } ts->retrieve(buffer, size_t(count)); v_zero_channels(buffer + stretchChannels, channels - stretchChannels, count); applyAuditioningEffect(count, buffer); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::getSamples [stretched]: awakening thread" << endl; #endif m_condition.wakeAll(); return count; } void AudioCallbackPlaySource::applyAuditioningEffect(sv_frame_t count, float *const *buffers) { if (m_auditioningPluginBypassed) return; RealTimePluginInstance *plugin = m_auditioningPlugin; if (!plugin) return; if ((int)plugin->getAudioInputCount() != getTargetChannelCount()) { // cout << "plugin input count " << plugin->getAudioInputCount() // << " != our channel count " << getTargetChannelCount() // << endl; return; } if ((int)plugin->getAudioOutputCount() != getTargetChannelCount()) { // cout << "plugin output count " << plugin->getAudioOutputCount() // << " != our channel count " << getTargetChannelCount() // << endl; return; } if ((int)plugin->getBufferSize() < count) { // cout << "plugin buffer size " << plugin->getBufferSize() // << " < our block size " << count // << endl; return; } float **ib = plugin->getAudioInputBuffers(); float **ob = plugin->getAudioOutputBuffers(); for (int c = 0; c < getTargetChannelCount(); ++c) { for (int i = 0; i < count; ++i) { ib[c][i] = buffers[c][i]; } } plugin->run(Vamp::RealTime::zeroTime, int(count)); for (int c = 0; c < getTargetChannelCount(); ++c) { for (int i = 0; i < count; ++i) { buffers[c][i] = ob[c][i]; } } } // Called from fill thread, m_playing true, mutex held bool AudioCallbackPlaySource::fillBuffers() { static float *tmp = 0; static sv_frame_t tmpSize = 0; sv_frame_t space = 0; for (int c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { sv_frame_t spaceHere = wb->getWriteSpace(); if (c == 0 || spaceHere < space) space = spaceHere; } } if (space == 0) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: no space to fill" << endl; #endif return false; } // space is now the number of samples that can be written on each // channel's write ringbuffer sv_frame_t f = m_writeBufferFill; bool readWriteEqual = (m_readBuffers == m_writeBuffers); #ifdef DEBUG_AUDIO_PLAY_SOURCE if (!readWriteEqual) { cout << "AudioCallbackPlaySourceFillThread: note read buffers != write buffers" << endl; } cout << "AudioCallbackPlaySourceFillThread: filling " << space << " frames" << endl; #endif #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "buffered to " << f << " already" << endl; #endif int channels = getTargetChannelCount(); static float **bufferPtrs = 0; static int bufferPtrCount = 0; if (bufferPtrCount < channels) { if (bufferPtrs) delete[] bufferPtrs; bufferPtrs = new float *[channels]; bufferPtrCount = channels; } sv_frame_t generatorBlockSize = m_audioGenerator->getBlockSize(); // space must be a multiple of generatorBlockSize sv_frame_t reqSpace = space; space = (reqSpace / generatorBlockSize) * generatorBlockSize; if (space == 0) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "requested fill of " << reqSpace << " is less than generator block size of " << generatorBlockSize << ", leaving it" << endl; #endif return false; } if (tmpSize < channels * space) { delete[] tmp; tmp = new float[channels * space]; tmpSize = channels * space; } for (int c = 0; c < channels; ++c) { bufferPtrs[c] = tmp + c * space; for (int i = 0; i < space; ++i) { tmp[c * space + i] = 0.0f; } } sv_frame_t got = mixModels(f, space, bufferPtrs); // also modifies f for (int c = 0; c < channels; ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { int actual = wb->write(bufferPtrs[c], int(got)); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Wrote " << actual << " samples for ch " << c << ", now " << wb->getReadSpace() << " to read" << endl; #endif if (actual < got) { SVCERR << "WARNING: Buffer overrun in channel " << c << ": wrote " << actual << " of " << got << " samples" << endl; } } } m_writeBufferFill = f; if (readWriteEqual) m_readBufferFill = f; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Read buffer fill is now " << m_readBufferFill << ", write buffer fill " << m_writeBufferFill << endl; #endif //!!! how do we know when ended? need to mark up a fully-buffered flag and check this if we find the buffers empty in getSourceSamples return true; } sv_frame_t AudioCallbackPlaySource::mixModels(sv_frame_t &frame, sv_frame_t count, float **buffers) { sv_frame_t processed = 0; sv_frame_t chunkStart = frame; sv_frame_t chunkSize = count; sv_frame_t selectionSize = 0; sv_frame_t nextChunkStart = chunkStart + chunkSize; bool looping = m_viewManager->getPlayLoopMode(); bool constrained = (m_viewManager->getPlaySelectionMode() && !m_viewManager->getSelections().empty()); int channels = getTargetChannelCount(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "mixModels: start " << frame << ", size " << count << ", channels " << channels << endl; #endif #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING if (constrained) { cout << "Manager has " << m_viewManager->getSelections().size() << " selection(s):" << endl; for (auto sel: m_viewManager->getSelections()) { cout << sel.getStartFrame() << " -> " << sel.getEndFrame() << " (" << (sel.getEndFrame() - sel.getStartFrame()) << " frames)" << endl; } } #endif static float **chunkBufferPtrs = 0; static int chunkBufferPtrCount = 0; if (chunkBufferPtrCount < channels) { if (chunkBufferPtrs) delete[] chunkBufferPtrs; chunkBufferPtrs = new float *[channels]; chunkBufferPtrCount = channels; } for (int c = 0; c < channels; ++c) { chunkBufferPtrs[c] = buffers[c]; } while (processed < count) { chunkSize = count - processed; nextChunkStart = chunkStart + chunkSize; selectionSize = 0; sv_frame_t fadeIn = 0, fadeOut = 0; if (constrained) { sv_frame_t rChunkStart = m_viewManager->alignPlaybackFrameToReference(chunkStart); Selection selection = m_viewManager->getContainingSelection(rChunkStart, true); if (selection.isEmpty()) { if (looping) { selection = *m_viewManager->getSelections().begin(); chunkStart = m_viewManager->alignReferenceToPlaybackFrame (selection.getStartFrame()); fadeIn = 50; } } if (selection.isEmpty()) { chunkSize = 0; nextChunkStart = chunkStart; } else { sv_frame_t sf = m_viewManager->alignReferenceToPlaybackFrame (selection.getStartFrame()); sv_frame_t ef = m_viewManager->alignReferenceToPlaybackFrame (selection.getEndFrame()); selectionSize = ef - sf; if (chunkStart < sf) { chunkStart = sf; fadeIn = 50; } nextChunkStart = chunkStart + chunkSize; if (nextChunkStart >= ef) { nextChunkStart = ef; fadeOut = 50; } chunkSize = nextChunkStart - chunkStart; } } else if (looping && m_lastModelEndFrame > 0) { if (chunkStart >= m_lastModelEndFrame) { chunkStart = 0; } if (chunkSize > m_lastModelEndFrame - chunkStart) { chunkSize = m_lastModelEndFrame - chunkStart; } nextChunkStart = chunkStart + chunkSize; } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "chunkStart " << chunkStart << ", chunkSize " << chunkSize << ", nextChunkStart " << nextChunkStart << ", frame " << frame << ", count " << count << ", processed " << processed << endl; #endif if (!chunkSize) { // We need to maintain full buffers so that the other // thread can tell where it's got to in the playback -- so // return the full amount here frame = frame + count; if (frame < nextChunkStart) { frame = nextChunkStart; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "mixModels: ending at " << nextChunkStart << ", returning frame as " << frame << endl; #endif return count; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "mixModels: chunk at " << chunkStart << " -> " << nextChunkStart << " (size " << chunkSize << ")" << endl; #endif if (selectionSize < 100) { fadeIn = 0; fadeOut = 0; } else if (selectionSize < 300) { if (fadeIn > 0) fadeIn = 10; if (fadeOut > 0) fadeOut = 10; } if (fadeIn > 0) { if (processed * 2 < fadeIn) { fadeIn = processed * 2; } } if (fadeOut > 0) { if ((count - processed - chunkSize) * 2 < fadeOut) { fadeOut = (count - processed - chunkSize) * 2; } } for (std::set::iterator mi = m_models.begin(); mi != m_models.end(); ++mi) { (void) m_audioGenerator->mixModel(*mi, chunkStart, chunkSize, chunkBufferPtrs, fadeIn, fadeOut); } for (int c = 0; c < channels; ++c) { chunkBufferPtrs[c] += chunkSize; } processed += chunkSize; chunkStart = nextChunkStart; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "mixModels returning " << processed << " frames to " << nextChunkStart << endl; #endif frame = nextChunkStart; return processed; } void AudioCallbackPlaySource::unifyRingBuffers() { if (m_readBuffers == m_writeBuffers) return; // only unify if there will be something to read for (int c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { if (wb->getReadSpace() < m_blockSize * 2) { if ((m_writeBufferFill + m_blockSize * 2) < m_lastModelEndFrame) { // OK, we don't have enough and there's more to // read -- don't unify until we can do better #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "AudioCallbackPlaySource::unifyRingBuffers: Not unifying: write buffer has less (" << wb->getReadSpace() << ") than " << m_blockSize*2 << " to read and write buffer fill (" << m_writeBufferFill << ") is not close to end frame (" << m_lastModelEndFrame << ")" << endl; #endif return; } } break; } } sv_frame_t rf = m_readBufferFill; RingBuffer *rb = getReadRingBuffer(0); if (rb) { int rs = rb->getReadSpace(); //!!! incorrect when in non-contiguous selection, see comments elsewhere // cout << "rs = " << rs << endl; if (rs < rf) rf -= rs; else rf = 0; } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "AudioCallbackPlaySource::unifyRingBuffers: m_readBufferFill = " << m_readBufferFill << ", rf = " << rf << ", m_writeBufferFill = " << m_writeBufferFill << endl; #endif sv_frame_t wf = m_writeBufferFill; sv_frame_t skip = 0; for (int c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { if (c == 0) { int wrs = wb->getReadSpace(); // cout << "wrs = " << wrs << endl; if (wrs < wf) wf -= wrs; else wf = 0; // cout << "wf = " << wf << endl; if (wf < rf) skip = rf - wf; if (skip == 0) break; } // cout << "skipping " << skip << endl; wb->skip(int(skip)); } } m_bufferScavenger.claim(m_readBuffers); m_readBuffers = m_writeBuffers; m_readBufferFill = m_writeBufferFill; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "unified" << endl; #endif } void AudioCallbackPlaySource::FillThread::run() { AudioCallbackPlaySource &s(m_source); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread starting" << endl; #endif s.m_mutex.lock(); bool previouslyPlaying = s.m_playing; bool work = false; while (!s.m_exiting) { s.unifyRingBuffers(); s.m_bufferScavenger.scavenge(); s.m_pluginScavenger.scavenge(); if (work && s.m_playing && s.getSourceSampleRate()) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: not waiting" << endl; #endif s.m_mutex.unlock(); s.m_mutex.lock(); } else { double ms = 100; if (s.getSourceSampleRate() > 0) { ms = double(s.m_ringBufferSize) / s.getSourceSampleRate() * 1000.0; } if (s.m_playing) ms /= 10; #ifdef DEBUG_AUDIO_PLAY_SOURCE if (!s.m_playing) cout << endl; cout << "AudioCallbackPlaySourceFillThread: waiting for " << ms << "ms..." << endl; #endif s.m_condition.wait(&s.m_mutex, int(ms)); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: awoken" << endl; #endif work = false; if (!s.getSourceSampleRate()) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: source sample rate is zero" << endl; #endif continue; } bool playing = s.m_playing; if (playing && !previouslyPlaying) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: playback state changed, resetting" << endl; #endif for (int c = 0; c < s.getTargetChannelCount(); ++c) { RingBuffer *rb = s.getReadRingBuffer(c); if (rb) rb->reset(); } } previouslyPlaying = playing; work = s.fillBuffers(); } s.m_mutex.unlock(); } sonic-visualiser-3.0.3/svapp/audio/AudioCallbackPlaySource.h0000644000000000000000000003514013111512442022227 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_AUDIO_CALLBACK_PLAY_SOURCE_H #define SV_AUDIO_CALLBACK_PLAY_SOURCE_H #include "base/RingBuffer.h" #include "base/AudioPlaySource.h" #include "base/PropertyContainer.h" #include "base/Scavenger.h" #include #include #include #include #include "base/Thread.h" #include "base/RealTime.h" #include #include #include namespace RubberBand { class RubberBandStretcher; } namespace breakfastquay { class ResamplerWrapper; } class Model; class ViewManagerBase; class AudioGenerator; class PlayParameters; class RealTimePluginInstance; class AudioCallbackPlayTarget; /** * AudioCallbackPlaySource manages audio data supply to callback-based * audio APIs such as JACK or CoreAudio. It maintains one ring buffer * per channel, filled during playback by a non-realtime thread, and * provides a method for a realtime thread to pick up the latest * available sample data from these buffers. */ class AudioCallbackPlaySource : public QObject, public AudioPlaySource, public breakfastquay::ApplicationPlaybackSource { Q_OBJECT public: AudioCallbackPlaySource(ViewManagerBase *, QString clientName); virtual ~AudioCallbackPlaySource(); /** * Add a data model to be played from. The source can mix * playback from a number of sources including dense and sparse * models. The models must match in sample rate, but they don't * have to have identical numbers of channels. */ virtual void addModel(Model *model); /** * Remove a model. */ virtual void removeModel(Model *model); /** * Remove all models. (Silence will ensue.) */ virtual void clearModels(); /** * Start making data available in the ring buffers for playback, * from the given frame. If playback is already under way, reseek * to the given frame and continue. */ virtual void play(sv_frame_t startFrame) override; /** * Stop playback and ensure that no more data is returned. */ virtual void stop() override; /** * Return whether playback is currently supposed to be happening. */ virtual bool isPlaying() const override { return m_playing; } /** * Return the frame number that is currently expected to be coming * out of the speakers. (i.e. compensating for playback latency.) */ virtual sv_frame_t getCurrentPlayingFrame() override; /** * Return the last frame that would come out of the speakers if we * stopped playback right now. */ virtual sv_frame_t getCurrentBufferedFrame(); /** * Return the frame at which playback is expected to end (if not looping). */ virtual sv_frame_t getPlayEndFrame() { return m_lastModelEndFrame; } /** * Set the playback target. */ virtual void setSystemPlaybackTarget(breakfastquay::SystemPlaybackTarget *); /** * Set the resampler wrapper, if one is in use. */ virtual void setResamplerWrapper(breakfastquay::ResamplerWrapper *); /** * Set the block size of the target audio device. This should be * called by the target class. */ virtual void setSystemPlaybackBlockSize(int blockSize) override; /** * Get the block size of the target audio device. This may be an * estimate or upper bound, if the target has a variable block * size; the source should behave itself even if this value turns * out to be inaccurate. */ virtual int getTargetBlockSize() const override; /** * Set the playback latency of the target audio device, in frames * at the device sample rate. This is the difference between the * frame currently "leaving the speakers" and the last frame (or * highest last frame across all channels) requested via * getSamples(). The default is zero. */ virtual void setSystemPlaybackLatency(int) override; /** * Get the playback latency of the target audio device. */ sv_frame_t getTargetPlayLatency() const; /** * Specify that the target audio device has a fixed sample rate * (i.e. cannot accommodate arbitrary sample rates based on the * source). If the target sets this to something other than the * source sample rate, this class will resample automatically to * fit. */ virtual void setSystemPlaybackSampleRate(int) override; /** * Return the sample rate set by the target audio device (or the * source sample rate if the target hasn't set one). */ virtual sv_samplerate_t getDeviceSampleRate() const override; /** * Indicate how many channels the target audio device was opened * with. Note that the target device does channel mixing in the * case where our requested channel count does not match its, so * long as we provide the number of channels we specified when the * target was started in getApplicationChannelCount(). */ virtual void setSystemPlaybackChannelCount(int) override; /** * Set the current output levels for metering (for call from the * target) */ virtual void setOutputLevels(float left, float right) override; /** * Return the current output levels in the range 0.0 -> 1.0, for * metering purposes. The values returned are the peak values * since the last time this function was called (after which they * are reset to zero until setOutputLevels is called again by the * driver). * * Return true if the values have been set since this function was * last called (i.e. if they are meaningful). Return false if they * have not been set (in which case both will be zero). */ virtual bool getOutputLevels(float &left, float &right) override; /** * Get the number of channels of audio that in the source models. * This may safely be called from a realtime thread. Returns 0 if * there is no source yet available. */ int getSourceChannelCount() const; /** * Get the number of channels of audio that will be provided * to the play target. This may be more than the source channel * count: for example, a mono source will provide 2 channels * after pan. * * This may safely be called from a realtime thread. Returns 0 if * there is no source yet available. * * override from AudioPlaySource */ virtual int getTargetChannelCount() const override; /** * Get the number of channels of audio the device is * expecting. Equal to whatever getTargetChannelCount() was * returning at the time the device was initialised. */ int getDeviceChannelCount() const; /** * ApplicationPlaybackSource equivalent of the above. * * override from breakfastquay::ApplicationPlaybackSource */ virtual int getApplicationChannelCount() const override { return getTargetChannelCount(); } /** * Get the actual sample rate of the source material (the main * model). This may safely be called from a realtime thread. * Returns 0 if there is no source yet available. * * When this changes, the AudioCallbackPlaySource notifies its * ResamplerWrapper of the new sample rate so that it can resample * correctly on the way to the device (which is opened at a fixed * rate, see getApplicationSampleRate). */ virtual sv_samplerate_t getSourceSampleRate() const override; /** * ApplicationPlaybackSource interface method: get the sample rate * at which the application wants the device to be opened. We * always allow the device to open at its default rate, and then * we resample if the audio is at a different rate. This avoids * having to close and re-open the device to obtain consistent * behaviour for consecutive sessions with different source rates. */ virtual int getApplicationSampleRate() const override { return 0; } /** * Get "count" samples (at the target sample rate) of the mixed * audio data, in all channels. This may safely be called from a * realtime thread. */ virtual int getSourceSamples(float *const *buffer, int nchannels, int count) override; /** * Set the time stretcher factor (i.e. playback speed). */ void setTimeStretch(double factor); /** * Set a single real-time plugin as a processing effect for * auditioning during playback. * * The plugin must have been initialised with * getTargetChannelCount() channels and a getTargetBlockSize() * sample frame processing block size. * * This playback source takes ownership of the plugin, which will * be deleted at some point after the following call to * setAuditioningEffect (depending on real-time constraints). * * Pass a null pointer to remove the current auditioning plugin, * if any. */ virtual void setAuditioningEffect(Auditionable *plugin) override; /** * Specify that only the given set of models should be played. */ void setSoloModelSet(std::sets); /** * Specify that all models should be played as normal (if not * muted). */ void clearSoloModelSet(); virtual std::string getClientName() const override { return m_clientName; } signals: void playStatusChanged(bool isPlaying); void sampleRateMismatch(sv_samplerate_t requested, sv_samplerate_t available, bool willResample); void channelCountIncreased(int count); // target channel count (see getTargetChannelCount()) void audioOverloadPluginDisabled(); void audioTimeStretchMultiChannelDisabled(); void activity(QString); public slots: void audioProcessingOverload() override; protected slots: void selectionChanged(); void playLoopModeChanged(); void playSelectionModeChanged(); void playParametersChanged(PlayParameters *); void preferenceChanged(PropertyContainer::PropertyName); void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); protected: ViewManagerBase *m_viewManager; AudioGenerator *m_audioGenerator; std::string m_clientName; class RingBufferVector : public std::vector *> { public: virtual ~RingBufferVector() { while (!empty()) { delete *begin(); erase(begin()); } } }; std::set m_models; RingBufferVector *m_readBuffers; RingBufferVector *m_writeBuffers; sv_frame_t m_readBufferFill; sv_frame_t m_writeBufferFill; Scavenger m_bufferScavenger; int m_sourceChannelCount; sv_frame_t m_blockSize; sv_samplerate_t m_sourceSampleRate; sv_samplerate_t m_deviceSampleRate; int m_deviceChannelCount; sv_frame_t m_playLatency; breakfastquay::SystemPlaybackTarget *m_target; double m_lastRetrievalTimestamp; sv_frame_t m_lastRetrievedBlockSize; bool m_trustworthyTimestamps; sv_frame_t m_lastCurrentFrame; bool m_playing; bool m_exiting; sv_frame_t m_lastModelEndFrame; int m_ringBufferSize; float m_outputLeft; float m_outputRight; bool m_levelsSet; RealTimePluginInstance *m_auditioningPlugin; bool m_auditioningPluginBypassed; Scavenger m_pluginScavenger; sv_frame_t m_playStartFrame; bool m_playStartFramePassed; RealTime m_playStartedAt; RingBuffer *getWriteRingBuffer(int c) { if (m_writeBuffers && c < (int)m_writeBuffers->size()) { return (*m_writeBuffers)[c]; } else { return 0; } } RingBuffer *getReadRingBuffer(int c) { RingBufferVector *rb = m_readBuffers; if (rb && c < (int)rb->size()) { return (*rb)[c]; } else { return 0; } } void clearRingBuffers(bool haveLock = false, int count = 0); void unifyRingBuffers(); RubberBand::RubberBandStretcher *m_timeStretcher; RubberBand::RubberBandStretcher *m_monoStretcher; double m_stretchRatio; bool m_stretchMono; int m_stretcherInputCount; float **m_stretcherInputs; sv_frame_t *m_stretcherInputSizes; // Called from fill thread, m_playing true, mutex held // Return true if work done bool fillBuffers(); // Called from fillBuffers. Return the number of frames written, // which will be count or fewer. Return in the frame argument the // new buffered frame position (which may be earlier than the // frame argument passed in, in the case of looping). sv_frame_t mixModels(sv_frame_t &frame, sv_frame_t count, float **buffers); // Called from getSourceSamples. void applyAuditioningEffect(sv_frame_t count, float *const *buffers); // Ranges of current selections, if play selection is active std::vector m_rangeStarts; std::vector m_rangeDurations; void rebuildRangeLists(); sv_frame_t getCurrentFrame(RealTime outputLatency); class FillThread : public Thread { public: FillThread(AudioCallbackPlaySource &source) : Thread(Thread::NonRTThread), m_source(source) { } virtual void run(); protected: AudioCallbackPlaySource &m_source; }; QMutex m_mutex; QWaitCondition m_condition; FillThread *m_fillThread; breakfastquay::ResamplerWrapper *m_resamplerWrapper; // I don't own this }; #endif sonic-visualiser-3.0.3/svapp/audio/AudioCallbackRecordTarget.cpp0000644000000000000000000002022513111512442023057 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "AudioCallbackRecordTarget.h" #include "base/ViewManagerBase.h" #include "base/TempDirectory.h" #include "data/model/WritableWaveFileModel.h" #include #include AudioCallbackRecordTarget::AudioCallbackRecordTarget(ViewManagerBase *manager, QString clientName) : m_viewManager(manager), m_clientName(clientName.toUtf8().data()), m_recording(false), m_recordSampleRate(44100), m_recordChannelCount(2), m_frameCount(0), m_model(0), m_buffers(0), m_bufferCount(0), m_inputLeft(0.f), m_inputRight(0.f), m_levelsSet(false) { m_viewManager->setAudioRecordTarget(this); connect(this, SIGNAL(recordStatusChanged(bool)), m_viewManager, SLOT(recordStatusChanged(bool))); recreateBuffers(); } AudioCallbackRecordTarget::~AudioCallbackRecordTarget() { m_viewManager->setAudioRecordTarget(0); QMutexLocker locker(&m_bufPtrMutex); for (int c = 0; c < m_bufferCount; ++c) { delete m_buffers[c]; } delete[] m_buffers; } void AudioCallbackRecordTarget::recreateBuffers() { static int bufferSize = 441000; int count = m_recordChannelCount; if (count > m_bufferCount) { RingBuffer **newBuffers = new RingBuffer *[count]; for (int c = 0; c < m_bufferCount; ++c) { newBuffers[c] = m_buffers[c]; } for (int c = m_bufferCount; c < count; ++c) { newBuffers[c] = new RingBuffer(bufferSize); } // This is the only place where m_buffers is rewritten and // should be the only possible source of contention against // putSamples for this mutex (as the model-updating code is // supposed to run in the same thread as this) QMutexLocker locker(&m_bufPtrMutex); delete[] m_buffers; m_buffers = newBuffers; m_bufferCount = count; } } int AudioCallbackRecordTarget::getApplicationSampleRate() const { return 0; // don't care } int AudioCallbackRecordTarget::getApplicationChannelCount() const { return m_recordChannelCount; } void AudioCallbackRecordTarget::setSystemRecordBlockSize(int) { } void AudioCallbackRecordTarget::setSystemRecordSampleRate(int n) { m_recordSampleRate = n; } void AudioCallbackRecordTarget::setSystemRecordLatency(int) { } void AudioCallbackRecordTarget::setSystemRecordChannelCount(int c) { m_recordChannelCount = c; recreateBuffers(); } void AudioCallbackRecordTarget::putSamples(const float *const *samples, int, int nframes) { // This may be called from RT context, and in a different thread // from everything else in this class. It takes a mutex that // should almost never be contended (see recreateBuffers()) if (!m_recording) return; QMutexLocker locker(&m_bufPtrMutex); if (m_buffers && m_bufferCount >= m_recordChannelCount) { for (int c = 0; c < m_recordChannelCount; ++c) { m_buffers[c]->write(samples[c], nframes); } } } void AudioCallbackRecordTarget::updateModel() { bool secChanged = false; sv_frame_t frameToEmit = 0; int nframes = 0; for (int c = 0; c < m_recordChannelCount; ++c) { if (c == 0 || m_buffers[c]->getReadSpace() < nframes) { nframes = m_buffers[c]->getReadSpace(); } } if (nframes == 0) { return; } float **samples = new float *[m_recordChannelCount]; for (int c = 0; c < m_recordChannelCount; ++c) { samples[c] = new float[nframes]; m_buffers[c]->read(samples[c], nframes); } m_model->addSamples(samples, nframes); for (int c = 0; c < m_recordChannelCount; ++c) { delete[] samples[c]; } delete[] samples; sv_frame_t priorFrameCount = m_frameCount; m_frameCount += nframes; RealTime priorRT = RealTime::frame2RealTime(priorFrameCount, m_recordSampleRate); RealTime postRT = RealTime::frame2RealTime(m_frameCount, m_recordSampleRate); secChanged = (postRT.sec > priorRT.sec); if (secChanged) { m_model->updateModel(); frameToEmit = m_frameCount; } if (secChanged) { emit recordDurationChanged(frameToEmit, m_recordSampleRate); } if (m_recording) { QTimer::singleShot(1000, this, SLOT(updateModel())); } } void AudioCallbackRecordTarget::setInputLevels(float left, float right) { if (left > m_inputLeft) m_inputLeft = left; if (right > m_inputRight) m_inputRight = right; m_levelsSet = true; } bool AudioCallbackRecordTarget::getInputLevels(float &left, float &right) { left = m_inputLeft; right = m_inputRight; bool valid = m_levelsSet; m_inputLeft = 0.f; m_inputRight = 0.f; m_levelsSet = false; return valid; } void AudioCallbackRecordTarget::modelAboutToBeDeleted() { if (sender() == m_model) { m_model = 0; m_recording = false; } } QString AudioCallbackRecordTarget::getRecordContainerFolder() { QDir parent(TempDirectory::getInstance()->getContainingPath()); QString subdirname("recorded"); if (!parent.mkpath(subdirname)) { SVCERR << "ERROR: AudioCallbackRecordTarget::getRecordContainerFolder: Failed to create recorded dir in \"" << parent.canonicalPath() << "\"" << endl; return ""; } else { return parent.filePath(subdirname); } } QString AudioCallbackRecordTarget::getRecordFolder() { QDir parent(getRecordContainerFolder()); QDateTime now = QDateTime::currentDateTime(); QString subdirname = QString("%1").arg(now.toString("yyyyMMdd")); if (!parent.mkpath(subdirname)) { SVCERR << "ERROR: AudioCallbackRecordTarget::getRecordFolder: Failed to create recorded dir in \"" << parent.canonicalPath() << "\"" << endl; return ""; } else { return parent.filePath(subdirname); } } WritableWaveFileModel * AudioCallbackRecordTarget::startRecording() { if (m_recording) { SVCERR << "WARNING: AudioCallbackRecordTarget::startRecording: We are already recording" << endl; return 0; } m_model = 0; m_frameCount = 0; QString folder = getRecordFolder(); if (folder == "") return 0; QDir recordedDir(folder); QDateTime now = QDateTime::currentDateTime(); // Don't use QDateTime::toString(Qt::ISODate) as the ":" character // isn't permitted in filenames on Windows QString nowString = now.toString("yyyyMMdd-HHmmss-zzz"); QString filename = tr("recorded-%1.wav").arg(nowString); QString label = tr("Recorded %1").arg(nowString); m_audioFileName = recordedDir.filePath(filename); m_model = new WritableWaveFileModel(m_recordSampleRate, m_recordChannelCount, m_audioFileName); if (!m_model->isOK()) { SVCERR << "ERROR: AudioCallbackRecordTarget::startRecording: Recording failed" << endl; //!!! and throw? delete m_model; m_model = 0; return 0; } m_model->setObjectName(label); m_recording = true; emit recordStatusChanged(true); QTimer::singleShot(1000, this, SLOT(updateModel())); return m_model; } void AudioCallbackRecordTarget::stopRecording() { if (!m_recording) { SVCERR << "WARNING: AudioCallbackRecordTarget::startRecording: Not recording" << endl; return; } m_recording = false; m_bufPtrMutex.lock(); m_bufPtrMutex.unlock(); // buffers should now be up-to-date updateModel(); m_model->writeComplete(); m_model = 0; emit recordStatusChanged(false); emit recordCompleted(); } sonic-visualiser-3.0.3/svapp/audio/AudioCallbackRecordTarget.h0000644000000000000000000000673713111512442022540 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_AUDIO_CALLBACK_RECORD_TARGET_H #define SV_AUDIO_CALLBACK_RECORD_TARGET_H #include "base/AudioRecordTarget.h" #include #include #include #include #include #include "base/BaseTypes.h" #include "base/RingBuffer.h" class ViewManagerBase; class WritableWaveFileModel; class AudioCallbackRecordTarget : public QObject, public AudioRecordTarget, public breakfastquay::ApplicationRecordTarget { Q_OBJECT public: AudioCallbackRecordTarget(ViewManagerBase *, QString clientName); virtual ~AudioCallbackRecordTarget(); virtual std::string getClientName() const override { return m_clientName; } virtual int getApplicationSampleRate() const override; virtual int getApplicationChannelCount() const override; virtual void setSystemRecordBlockSize(int) override; virtual void setSystemRecordSampleRate(int) override; virtual void setSystemRecordLatency(int) override; virtual void setSystemRecordChannelCount(int) override; virtual void putSamples(const float *const *samples, int nchannels, int nframes) override; virtual void setInputLevels(float peakLeft, float peakRight) override; virtual void audioProcessingOverload() override { } QString getRecordContainerFolder(); QString getRecordFolder(); virtual bool isRecording() const override { return m_recording; } virtual sv_frame_t getRecordDuration() const override { return m_frameCount; } /** * Return the current input levels in the range 0.0 -> 1.0, for * metering purposes. The values returned are the peak values * since the last time this function was called (after which they * are reset to zero until setInputLevels is called again by the * driver). * * Return true if the values have been set since this function was * last called (i.e. if they are meaningful). Return false if they * have not been set (in which case both will be zero). */ virtual bool getInputLevels(float &left, float &right) override; WritableWaveFileModel *startRecording(); // caller takes ownership of model void stopRecording(); signals: void recordStatusChanged(bool recording); void recordDurationChanged(sv_frame_t, sv_samplerate_t); // emitted occasionally void recordCompleted(); protected slots: void modelAboutToBeDeleted(); void updateModel(); private: ViewManagerBase *m_viewManager; std::string m_clientName; std::atomic_bool m_recording; sv_samplerate_t m_recordSampleRate; int m_recordChannelCount; sv_frame_t m_frameCount; QString m_audioFileName; WritableWaveFileModel *m_model; RingBuffer **m_buffers; QMutex m_bufPtrMutex; int m_bufferCount; float m_inputLeft; float m_inputRight; bool m_levelsSet; void recreateBuffers(); }; #endif sonic-visualiser-3.0.3/svapp/audio/AudioGenerator.cpp0000644000000000000000000005063613111512442021014 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "AudioGenerator.h" #include "base/TempDirectory.h" #include "base/PlayParameters.h" #include "base/PlayParameterRepository.h" #include "base/Pitch.h" #include "base/Exceptions.h" #include "data/model/NoteModel.h" #include "data/model/FlexiNoteModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/NoteData.h" #include "ClipMixer.h" #include "ContinuousSynth.h" #include #include #include #include const sv_frame_t AudioGenerator::m_processingBlockSize = 1024; QString AudioGenerator::m_sampleDir = ""; //#define DEBUG_AUDIO_GENERATOR 1 AudioGenerator::AudioGenerator() : m_sourceSampleRate(0), m_targetChannelCount(1), m_waveType(0), m_soloing(false), m_channelBuffer(0), m_channelBufSiz(0), m_channelBufCount(0) { initialiseSampleDir(); connect(PlayParameterRepository::getInstance(), SIGNAL(playClipIdChanged(const Playable *, QString)), this, SLOT(playClipIdChanged(const Playable *, QString))); } AudioGenerator::~AudioGenerator() { #ifdef DEBUG_AUDIO_GENERATOR SVDEBUG << "AudioGenerator::~AudioGenerator" << endl; #endif for (int i = 0; i < m_channelBufCount; ++i) { delete[] m_channelBuffer[i]; } delete[] m_channelBuffer; } void AudioGenerator::initialiseSampleDir() { if (m_sampleDir != "") return; try { m_sampleDir = TempDirectory::getInstance()->getSubDirectoryPath("samples"); } catch (DirectoryCreationFailed f) { cerr << "WARNING: AudioGenerator::initialiseSampleDir:" << " Failed to create temporary sample directory" << endl; m_sampleDir = ""; return; } QDir sampleResourceDir(":/samples", "*.wav"); for (unsigned int i = 0; i < sampleResourceDir.count(); ++i) { QString fileName(sampleResourceDir[i]); QFile file(sampleResourceDir.filePath(fileName)); QString target = QDir(m_sampleDir).filePath(fileName); if (!file.copy(target)) { cerr << "WARNING: AudioGenerator::getSampleDir: " << "Unable to copy " << fileName << " into temporary directory \"" << m_sampleDir << "\"" << endl; } else { QFile tf(target); tf.setPermissions(tf.permissions() | QFile::WriteOwner | QFile::WriteUser); } } } bool AudioGenerator::addModel(Model *model) { if (m_sourceSampleRate == 0) { m_sourceSampleRate = model->getSampleRate(); } else { DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) { m_sourceSampleRate = model->getSampleRate(); return true; } } const Playable *playable = model; if (!playable || !playable->canPlay()) return 0; PlayParameters *parameters = PlayParameterRepository::getInstance()->getPlayParameters(playable); bool willPlay = !parameters->isPlayMuted(); if (usesClipMixer(model)) { ClipMixer *mixer = makeClipMixerFor(model); if (mixer) { QMutexLocker locker(&m_mutex); m_clipMixerMap[model] = mixer; return willPlay; } } if (usesContinuousSynth(model)) { ContinuousSynth *synth = makeSynthFor(model); if (synth) { QMutexLocker locker(&m_mutex); m_continuousSynthMap[model] = synth; return willPlay; } } return false; } void AudioGenerator::playClipIdChanged(const Playable *playable, QString) { const Model *model = dynamic_cast(playable); if (!model) { cerr << "WARNING: AudioGenerator::playClipIdChanged: playable " << playable << " is not a supported model type" << endl; return; } if (m_clipMixerMap.find(model) == m_clipMixerMap.end()) return; ClipMixer *mixer = makeClipMixerFor(model); if (mixer) { QMutexLocker locker(&m_mutex); m_clipMixerMap[model] = mixer; } } bool AudioGenerator::usesClipMixer(const Model *model) { bool clip = (qobject_cast(model) || qobject_cast(model) || qobject_cast(model)); return clip; } bool AudioGenerator::wantsQuieterClips(const Model *model) { // basically, anything that usually has sustain (like notes) or // often has multiple sounds at once (like notes) wants to use a // quieter level than simple click tracks bool does = (qobject_cast(model) || qobject_cast(model)); return does; } bool AudioGenerator::usesContinuousSynth(const Model *model) { bool cont = (qobject_cast(model)); return cont; } ClipMixer * AudioGenerator::makeClipMixerFor(const Model *model) { QString clipId; const Playable *playable = model; if (!playable || !playable->canPlay()) return 0; PlayParameters *parameters = PlayParameterRepository::getInstance()->getPlayParameters(playable); if (parameters) { clipId = parameters->getPlayClipId(); } #ifdef DEBUG_AUDIO_GENERATOR std::cerr << "AudioGenerator::makeClipMixerFor(" << model << "): sample id = " << clipId << std::endl; #endif if (clipId == "") { SVDEBUG << "AudioGenerator::makeClipMixerFor(" << model << "): no sample, skipping" << endl; return 0; } ClipMixer *mixer = new ClipMixer(m_targetChannelCount, m_sourceSampleRate, m_processingBlockSize); double clipF0 = Pitch::getFrequencyForPitch(60, 0, 440.0); // required QString clipPath = QString("%1/%2.wav").arg(m_sampleDir).arg(clipId); double level = wantsQuieterClips(model) ? 0.5 : 1.0; if (!mixer->loadClipData(clipPath, clipF0, level)) { delete mixer; return 0; } #ifdef DEBUG_AUDIO_GENERATOR std::cerr << "AudioGenerator::makeClipMixerFor(" << model << "): loaded clip " << clipId << std::endl; #endif return mixer; } ContinuousSynth * AudioGenerator::makeSynthFor(const Model *model) { const Playable *playable = model; if (!playable || !playable->canPlay()) return 0; ContinuousSynth *synth = new ContinuousSynth(m_targetChannelCount, m_sourceSampleRate, m_processingBlockSize, m_waveType); #ifdef DEBUG_AUDIO_GENERATOR std::cerr << "AudioGenerator::makeSynthFor(" << model << "): created synth" << std::endl; #endif return synth; } void AudioGenerator::removeModel(Model *model) { SparseOneDimensionalModel *sodm = dynamic_cast(model); if (!sodm) return; // nothing to do QMutexLocker locker(&m_mutex); if (m_clipMixerMap.find(sodm) == m_clipMixerMap.end()) return; ClipMixer *mixer = m_clipMixerMap[sodm]; m_clipMixerMap.erase(sodm); delete mixer; } void AudioGenerator::clearModels() { QMutexLocker locker(&m_mutex); while (!m_clipMixerMap.empty()) { ClipMixer *mixer = m_clipMixerMap.begin()->second; m_clipMixerMap.erase(m_clipMixerMap.begin()); delete mixer; } } void AudioGenerator::reset() { QMutexLocker locker(&m_mutex); #ifdef DEBUG_AUDIO_GENERATOR cerr << "AudioGenerator::reset()" << endl; #endif for (ClipMixerMap::iterator i = m_clipMixerMap.begin(); i != m_clipMixerMap.end(); ++i) { if (i->second) { i->second->reset(); } } m_noteOffs.clear(); } void AudioGenerator::setTargetChannelCount(int targetChannelCount) { if (m_targetChannelCount == targetChannelCount) return; // SVDEBUG << "AudioGenerator::setTargetChannelCount(" << targetChannelCount << ")" << endl; QMutexLocker locker(&m_mutex); m_targetChannelCount = targetChannelCount; for (ClipMixerMap::iterator i = m_clipMixerMap.begin(); i != m_clipMixerMap.end(); ++i) { if (i->second) i->second->setChannelCount(targetChannelCount); } } sv_frame_t AudioGenerator::getBlockSize() const { return m_processingBlockSize; } void AudioGenerator::setSoloModelSet(std::set s) { QMutexLocker locker(&m_mutex); m_soloModelSet = s; m_soloing = true; } void AudioGenerator::clearSoloModelSet() { QMutexLocker locker(&m_mutex); m_soloModelSet.clear(); m_soloing = false; } sv_frame_t AudioGenerator::mixModel(Model *model, sv_frame_t startFrame, sv_frame_t frameCount, float **buffer, sv_frame_t fadeIn, sv_frame_t fadeOut) { if (m_sourceSampleRate == 0) { cerr << "WARNING: AudioGenerator::mixModel: No base source sample rate available" << endl; return frameCount; } QMutexLocker locker(&m_mutex); Playable *playable = model; if (!playable || !playable->canPlay()) return frameCount; PlayParameters *parameters = PlayParameterRepository::getInstance()->getPlayParameters(playable); if (!parameters) return frameCount; bool playing = !parameters->isPlayMuted(); if (!playing) { #ifdef DEBUG_AUDIO_GENERATOR cout << "AudioGenerator::mixModel(" << model << "): muted" << endl; #endif return frameCount; } if (m_soloing) { if (m_soloModelSet.find(model) == m_soloModelSet.end()) { #ifdef DEBUG_AUDIO_GENERATOR cout << "AudioGenerator::mixModel(" << model << "): not one of the solo'd models" << endl; #endif return frameCount; } } float gain = parameters->getPlayGain(); float pan = parameters->getPlayPan(); DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) { return mixDenseTimeValueModel(dtvm, startFrame, frameCount, buffer, gain, pan, fadeIn, fadeOut); } if (usesClipMixer(model)) { return mixClipModel(model, startFrame, frameCount, buffer, gain, pan); } if (usesContinuousSynth(model)) { return mixContinuousSynthModel(model, startFrame, frameCount, buffer, gain, pan); } std::cerr << "AudioGenerator::mixModel: WARNING: Model " << model << " of type " << model->getTypeName() << " is marked as playable, but I have no mechanism to play it" << std::endl; return frameCount; } sv_frame_t AudioGenerator::mixDenseTimeValueModel(DenseTimeValueModel *dtvm, sv_frame_t startFrame, sv_frame_t frames, float **buffer, float gain, float pan, sv_frame_t fadeIn, sv_frame_t fadeOut) { sv_frame_t maxFrames = frames + std::max(fadeIn, fadeOut); int modelChannels = dtvm->getChannelCount(); if (m_channelBufSiz < maxFrames || m_channelBufCount < modelChannels) { for (int c = 0; c < m_channelBufCount; ++c) { delete[] m_channelBuffer[c]; } delete[] m_channelBuffer; m_channelBuffer = new float *[modelChannels]; for (int c = 0; c < modelChannels; ++c) { m_channelBuffer[c] = new float[maxFrames]; } m_channelBufCount = modelChannels; m_channelBufSiz = maxFrames; } sv_frame_t got = 0; if (startFrame >= fadeIn/2) { auto data = dtvm->getMultiChannelData(0, modelChannels - 1, startFrame - fadeIn/2, frames + fadeOut/2 + fadeIn/2); for (int c = 0; c < modelChannels; ++c) { copy(data[c].begin(), data[c].end(), m_channelBuffer[c]); } got = data[0].size(); } else { sv_frame_t missing = fadeIn/2 - startFrame; if (missing > 0) { cerr << "note: channelBufSiz = " << m_channelBufSiz << ", frames + fadeOut/2 = " << frames + fadeOut/2 << ", startFrame = " << startFrame << ", missing = " << missing << endl; } auto data = dtvm->getMultiChannelData(0, modelChannels - 1, startFrame, frames + fadeOut/2); for (int c = 0; c < modelChannels; ++c) { copy(data[c].begin(), data[c].end(), m_channelBuffer[c] + missing); } got = data[0].size() + missing; } for (int c = 0; c < m_targetChannelCount; ++c) { int sourceChannel = (c % modelChannels); // SVDEBUG << "mixing channel " << c << " from source channel " << sourceChannel << endl; float channelGain = gain; if (pan != 0.0) { if (c == 0) { if (pan > 0.0) channelGain *= 1.0f - pan; } else { if (pan < 0.0) channelGain *= pan + 1.0f; } } for (sv_frame_t i = 0; i < fadeIn/2; ++i) { float *back = buffer[c]; back -= fadeIn/2; back[i] += (channelGain * m_channelBuffer[sourceChannel][i] * float(i)) / float(fadeIn); } for (sv_frame_t i = 0; i < frames + fadeOut/2; ++i) { float mult = channelGain; if (i < fadeIn/2) { mult = (mult * float(i)) / float(fadeIn); } if (i > frames - fadeOut/2) { mult = (mult * float((frames + fadeOut/2) - i)) / float(fadeOut); } float val = m_channelBuffer[sourceChannel][i]; if (i >= got) val = 0.f; buffer[c][i] += mult * val; } } return got; } sv_frame_t AudioGenerator::mixClipModel(Model *model, sv_frame_t startFrame, sv_frame_t frames, float **buffer, float gain, float pan) { ClipMixer *clipMixer = m_clipMixerMap[model]; if (!clipMixer) return 0; int blocks = int(frames / m_processingBlockSize); //!!! todo: the below -- it matters //!!! hang on -- the fact that the audio callback play source's //buffer is a multiple of the plugin's buffer size doesn't mean //that we always get called for a multiple of it here (because it //also depends on the JACK block size). how should we ensure that //all models write the same amount in to the mix, and that we //always have a multiple of the plugin buffer size? I guess this //class has to be queryable for the plugin buffer size & the //callback play source has to use that as a multiple for all the //calls to mixModel sv_frame_t got = blocks * m_processingBlockSize; #ifdef DEBUG_AUDIO_GENERATOR cout << "mixModel [clip]: start " << startFrame << ", frames " << frames << ", blocks " << blocks << ", have " << m_noteOffs.size() << " note-offs" << endl; #endif ClipMixer::NoteStart on; ClipMixer::NoteEnd off; NoteOffSet ¬eOffs = m_noteOffs[model]; float **bufferIndexes = new float *[m_targetChannelCount]; for (int i = 0; i < blocks; ++i) { sv_frame_t reqStart = startFrame + i * m_processingBlockSize; NoteList notes; NoteExportable *exportable = dynamic_cast(model); if (exportable) { notes = exportable->getNotesWithin(reqStart, reqStart + m_processingBlockSize); } std::vector starts; std::vector ends; for (NoteList::const_iterator ni = notes.begin(); ni != notes.end(); ++ni) { sv_frame_t noteFrame = ni->start; if (noteFrame < reqStart || noteFrame >= reqStart + m_processingBlockSize) continue; while (noteOffs.begin() != noteOffs.end() && noteOffs.begin()->frame <= noteFrame) { sv_frame_t eventFrame = noteOffs.begin()->frame; if (eventFrame < reqStart) eventFrame = reqStart; off.frameOffset = eventFrame - reqStart; off.frequency = noteOffs.begin()->frequency; #ifdef DEBUG_AUDIO_GENERATOR cerr << "mixModel [clip]: adding note-off at frame " << eventFrame << " frame offset " << off.frameOffset << " frequency " << off.frequency << endl; #endif ends.push_back(off); noteOffs.erase(noteOffs.begin()); } on.frameOffset = noteFrame - reqStart; on.frequency = ni->getFrequency(); on.level = float(ni->velocity) / 127.0f; on.pan = pan; #ifdef DEBUG_AUDIO_GENERATOR cout << "mixModel [clip]: adding note at frame " << noteFrame << ", frame offset " << on.frameOffset << " frequency " << on.frequency << ", level " << on.level << endl; #endif starts.push_back(on); noteOffs.insert (NoteOff(on.frequency, noteFrame + ni->duration)); } while (noteOffs.begin() != noteOffs.end() && noteOffs.begin()->frame <= reqStart + m_processingBlockSize) { sv_frame_t eventFrame = noteOffs.begin()->frame; if (eventFrame < reqStart) eventFrame = reqStart; off.frameOffset = eventFrame - reqStart; off.frequency = noteOffs.begin()->frequency; #ifdef DEBUG_AUDIO_GENERATOR cerr << "mixModel [clip]: adding leftover note-off at frame " << eventFrame << " frame offset " << off.frameOffset << " frequency " << off.frequency << endl; #endif ends.push_back(off); noteOffs.erase(noteOffs.begin()); } for (int c = 0; c < m_targetChannelCount; ++c) { bufferIndexes[c] = buffer[c] + i * m_processingBlockSize; } clipMixer->mix(bufferIndexes, gain, starts, ends); } delete[] bufferIndexes; return got; } sv_frame_t AudioGenerator::mixContinuousSynthModel(Model *model, sv_frame_t startFrame, sv_frame_t frames, float **buffer, float gain, float pan) { ContinuousSynth *synth = m_continuousSynthMap[model]; if (!synth) return 0; // only type we support here at the moment SparseTimeValueModel *stvm = qobject_cast(model); if (stvm->getScaleUnits() != "Hz") return 0; int blocks = int(frames / m_processingBlockSize); //!!! todo: see comment in mixClipModel sv_frame_t got = blocks * m_processingBlockSize; #ifdef DEBUG_AUDIO_GENERATOR cout << "mixModel [synth]: frames " << frames << ", blocks " << blocks << endl; #endif float **bufferIndexes = new float *[m_targetChannelCount]; for (int i = 0; i < blocks; ++i) { sv_frame_t reqStart = startFrame + i * m_processingBlockSize; for (int c = 0; c < m_targetChannelCount; ++c) { bufferIndexes[c] = buffer[c] + i * m_processingBlockSize; } SparseTimeValueModel::PointList points = stvm->getPoints(reqStart, reqStart + m_processingBlockSize); // by default, repeat last frequency float f0 = 0.f; // go straight to the last freq that is genuinely in this range for (SparseTimeValueModel::PointList::const_iterator itr = points.end(); itr != points.begin(); ) { --itr; if (itr->frame >= reqStart && itr->frame < reqStart + m_processingBlockSize) { f0 = itr->value; break; } } // if we found no such frequency and the next point is further // away than twice the model resolution, go silent (same // criterion TimeValueLayer uses for ending a discrete curve // segment) if (f0 == 0.f) { SparseTimeValueModel::PointList nextPoints = stvm->getNextPoints(reqStart + m_processingBlockSize); if (nextPoints.empty() || nextPoints.begin()->frame > reqStart + 2 * stvm->getResolution()) { f0 = -1.f; } } // cerr << "f0 = " << f0 << endl; synth->mix(bufferIndexes, gain, pan, f0); } delete[] bufferIndexes; return got; } sonic-visualiser-3.0.3/svapp/audio/AudioGenerator.h0000644000000000000000000001047213111512442020453 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_GENERATOR_H_ #define _AUDIO_GENERATOR_H_ class Model; class NoteModel; class FlexiNoteModel; class DenseTimeValueModel; class SparseOneDimensionalModel; class Playable; class ClipMixer; class ContinuousSynth; #include #include #include #include #include #include "base/BaseTypes.h" class AudioGenerator : public QObject { Q_OBJECT public: AudioGenerator(); virtual ~AudioGenerator(); /** * Add a data model to be played from and initialise any necessary * audio generation code. Returns true if the model will be * played. The model will be added regardless of the return * value. */ virtual bool addModel(Model *model); /** * Remove a model. */ virtual void removeModel(Model *model); /** * Remove all models. */ virtual void clearModels(); /** * Reset playback, clearing buffers and the like. */ virtual void reset(); /** * Set the target channel count. The buffer parameter to mixModel * must always point to at least this number of arrays. */ virtual void setTargetChannelCount(int channelCount); /** * Return the internal processing block size. The frameCount * argument to all mixModel calls must be a multiple of this * value. */ virtual sv_frame_t getBlockSize() const; /** * Mix a single model into an output buffer. */ virtual sv_frame_t mixModel(Model *model, sv_frame_t startFrame, sv_frame_t frameCount, float **buffer, sv_frame_t fadeIn = 0, sv_frame_t fadeOut = 0); /** * Specify that only the given set of models should be played. */ virtual void setSoloModelSet(std::sets); /** * Specify that all models should be played as normal (if not * muted). */ virtual void clearSoloModelSet(); protected slots: void playClipIdChanged(const Playable *, QString); protected: sv_samplerate_t m_sourceSampleRate; int m_targetChannelCount; int m_waveType; bool m_soloing; std::set m_soloModelSet; struct NoteOff { NoteOff(float _freq, sv_frame_t _frame) : frequency(_freq), frame(_frame) { } float frequency; sv_frame_t frame; struct Comparator { bool operator()(const NoteOff &n1, const NoteOff &n2) const { return n1.frame < n2.frame; } }; }; typedef std::map ClipMixerMap; typedef std::multiset NoteOffSet; typedef std::map NoteOffMap; typedef std::map ContinuousSynthMap; QMutex m_mutex; ClipMixerMap m_clipMixerMap; NoteOffMap m_noteOffs; static QString m_sampleDir; ContinuousSynthMap m_continuousSynthMap; bool usesClipMixer(const Model *); bool wantsQuieterClips(const Model *); bool usesContinuousSynth(const Model *); ClipMixer *makeClipMixerFor(const Model *model); ContinuousSynth *makeSynthFor(const Model *model); static void initialiseSampleDir(); virtual sv_frame_t mixDenseTimeValueModel (DenseTimeValueModel *model, sv_frame_t startFrame, sv_frame_t frameCount, float **buffer, float gain, float pan, sv_frame_t fadeIn, sv_frame_t fadeOut); virtual sv_frame_t mixClipModel (Model *model, sv_frame_t startFrame, sv_frame_t frameCount, float **buffer, float gain, float pan); virtual sv_frame_t mixContinuousSynthModel (Model *model, sv_frame_t startFrame, sv_frame_t frameCount, float **buffer, float gain, float pan); static const sv_frame_t m_processingBlockSize; float **m_channelBuffer; sv_frame_t m_channelBufSiz; int m_channelBufCount; }; #endif sonic-visualiser-3.0.3/svapp/audio/ClipMixer.cpp0000644000000000000000000001522313111512442017771 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam, 2006-2014 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ClipMixer.h" #include #include #include "base/Debug.h" //#define DEBUG_CLIP_MIXER 1 ClipMixer::ClipMixer(int channels, sv_samplerate_t sampleRate, sv_frame_t blockSize) : m_channels(channels), m_sampleRate(sampleRate), m_blockSize(blockSize), m_clipData(0), m_clipLength(0), m_clipF0(0), m_clipRate(0) { } ClipMixer::~ClipMixer() { if (m_clipData) free(m_clipData); } void ClipMixer::setChannelCount(int channels) { m_channels = channels; } bool ClipMixer::loadClipData(QString path, double f0, double level) { if (m_clipData) { cerr << "ClipMixer::loadClipData: Already have clip loaded" << endl; return false; } SF_INFO info; SNDFILE *file; float *tmpFrames; sv_frame_t i; info.format = 0; file = sf_open(path.toLocal8Bit().data(), SFM_READ, &info); if (!file) { cerr << "ClipMixer::loadClipData: Failed to open file path \"" << path << "\": " << sf_strerror(file) << endl; return false; } tmpFrames = (float *)malloc(info.frames * info.channels * sizeof(float)); if (!tmpFrames) { cerr << "ClipMixer::loadClipData: malloc(" << info.frames * info.channels * sizeof(float) << ") failed" << endl; return false; } sf_readf_float(file, tmpFrames, info.frames); sf_close(file); m_clipData = (float *)malloc(info.frames * sizeof(float)); if (!m_clipData) { cerr << "ClipMixer::loadClipData: malloc(" << info.frames * sizeof(float) << ") failed" << endl; free(tmpFrames); return false; } for (i = 0; i < info.frames; ++i) { int j; m_clipData[i] = 0.0f; for (j = 0; j < info.channels; ++j) { m_clipData[i] += tmpFrames[i * info.channels + j] * float(level); } } free(tmpFrames); m_clipLength = info.frames; m_clipF0 = f0; m_clipRate = info.samplerate; return true; } void ClipMixer::reset() { m_playing.clear(); } double ClipMixer::getResampleRatioFor(double frequency) { if (!m_clipData || !m_clipRate) return 1.0; double pitchRatio = m_clipF0 / frequency; double resampleRatio = m_sampleRate / m_clipRate; return pitchRatio * resampleRatio; } sv_frame_t ClipMixer::getResampledClipDuration(double frequency) { return sv_frame_t(ceil(double(m_clipLength) * getResampleRatioFor(frequency))); } void ClipMixer::mix(float **toBuffers, float gain, std::vector newNotes, std::vector endingNotes) { foreach (NoteStart note, newNotes) { if (note.frequency > 20 && note.frequency < 5000) { m_playing.push_back(note); } } std::vector remaining; float *levels = new float[m_channels]; #ifdef DEBUG_CLIP_MIXER cerr << "ClipMixer::mix: have " << m_playing.size() << " playing note(s)" << " and " << endingNotes.size() << " note(s) ending here" << endl; #endif foreach (NoteStart note, m_playing) { for (int c = 0; c < m_channels; ++c) { levels[c] = note.level * gain; } if (note.pan != 0.0 && m_channels == 2) { levels[0] *= 1.0f - note.pan; levels[1] *= note.pan + 1.0f; } sv_frame_t start = note.frameOffset; sv_frame_t durationHere = m_blockSize; if (start > 0) durationHere = m_blockSize - start; bool ending = false; foreach (NoteEnd end, endingNotes) { if (end.frequency == note.frequency && end.frameOffset >= start && end.frameOffset <= m_blockSize) { ending = true; durationHere = end.frameOffset; if (start > 0) durationHere = end.frameOffset - start; break; } } sv_frame_t clipDuration = getResampledClipDuration(note.frequency); if (start + clipDuration > 0) { if (start < 0 && start + clipDuration < durationHere) { durationHere = start + clipDuration; } if (durationHere > 0) { mixNote(toBuffers, levels, note.frequency, start < 0 ? -start : 0, start > 0 ? start : 0, durationHere, ending); } } if (!ending) { NoteStart adjusted = note; adjusted.frameOffset -= m_blockSize; remaining.push_back(adjusted); } } delete[] levels; m_playing = remaining; } void ClipMixer::mixNote(float **toBuffers, float *levels, float frequency, sv_frame_t sourceOffset, sv_frame_t targetOffset, sv_frame_t sampleCount, bool isEnd) { if (!m_clipData) return; double ratio = getResampleRatioFor(frequency); double releaseTime = 0.01; sv_frame_t releaseSampleCount = sv_frame_t(round(releaseTime * m_sampleRate)); if (releaseSampleCount > sampleCount) { releaseSampleCount = sampleCount; } double releaseFraction = 1.0/double(releaseSampleCount); for (sv_frame_t i = 0; i < sampleCount; ++i) { sv_frame_t s = sourceOffset + i; double os = double(s) / ratio; sv_frame_t osi = sv_frame_t(floor(os)); //!!! just linear interpolation for now (same as SV's sample //!!! player). a small sinc kernel would be better and //!!! probably "good enough" double value = 0.0; if (osi < m_clipLength) { value += m_clipData[osi]; } if (osi + 1 < m_clipLength) { value += (m_clipData[osi + 1] - m_clipData[osi]) * (os - double(osi)); } if (isEnd && i + releaseSampleCount > sampleCount) { value *= releaseFraction * double(sampleCount - i); // linear ramp for release } for (int c = 0; c < m_channels; ++c) { toBuffers[c][targetOffset + i] += float(levels[c] * value); } } } sonic-visualiser-3.0.3/svapp/audio/ClipMixer.h0000644000000000000000000000526613111512442017444 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam, 2006-2014 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef CLIP_MIXER_H #define CLIP_MIXER_H #include #include #include "base/BaseTypes.h" /** * Mix in synthetic notes produced by resampling a prerecorded * clip. (i.e. this is an implementation of a digital sampler in the * musician's sense.) This can mix any number of notes of arbitrary * frequency, so long as they all use the same sample clip. */ class ClipMixer { public: ClipMixer(int channels, sv_samplerate_t sampleRate, sv_frame_t blockSize); ~ClipMixer(); void setChannelCount(int channels); /** * Load a sample clip from a wav file. This can only happen once: * construct a new ClipMixer if you want a different clip. The * clip was recorded at a pitch with fundamental frequency clipF0, * and should be scaled by level (in the range 0-1) when playing * back. */ bool loadClipData(QString clipFilePath, double clipF0, double level); void reset(); // discarding any playing notes struct NoteStart { sv_frame_t frameOffset; // within current processing block float frequency; // Hz float level; // volume in range (0,1] float pan; // range [-1,1] }; struct NoteEnd { sv_frame_t frameOffset; // in current processing block float frequency; // matching note start }; void mix(float **toBuffers, float gain, std::vector newNotes, std::vector endingNotes); private: int m_channels; sv_samplerate_t m_sampleRate; sv_frame_t m_blockSize; QString m_clipPath; float *m_clipData; sv_frame_t m_clipLength; double m_clipF0; sv_samplerate_t m_clipRate; std::vector m_playing; double getResampleRatioFor(double frequency); sv_frame_t getResampledClipDuration(double frequency); void mixNote(float **toBuffers, float *levels, float frequency, sv_frame_t sourceOffset, // within resampled note sv_frame_t targetOffset, // within target buffer sv_frame_t sampleCount, bool isEnd); }; #endif sonic-visualiser-3.0.3/svapp/audio/ContinuousSynth.cpp0000644000000000000000000000751213111512442021273 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "ContinuousSynth.h" #include "base/Debug.h" #include "system/System.h" #include ContinuousSynth::ContinuousSynth(int channels, sv_samplerate_t sampleRate, sv_frame_t blockSize, int waveType) : m_channels(channels), m_sampleRate(sampleRate), m_blockSize(blockSize), m_prevF0(-1.0), m_phase(0.0), m_wavetype(waveType) // 0: 3 sinusoids, 1: 1 sinusoid, 2: sawtooth, 3: square { } ContinuousSynth::~ContinuousSynth() { } void ContinuousSynth::reset() { m_phase = 0; } void ContinuousSynth::mix(float **toBuffers, float gain, float pan, float f0f) { double f0(f0f); if (f0 == 0.0) f0 = m_prevF0; bool wasOn = (m_prevF0 > 0.0); bool nowOn = (f0 > 0.0); if (!nowOn && !wasOn) { m_phase = 0; return; } sv_frame_t fadeLength = 100; float *levels = new float[m_channels]; for (int c = 0; c < m_channels; ++c) { levels[c] = gain * 0.5f; // scale gain otherwise too loud compared to source } if (pan != 0.0 && m_channels == 2) { levels[0] *= 1.0f - pan; levels[1] *= pan + 1.0f; } // cerr << "ContinuousSynth::mix: f0 = " << f0 << " (from " << m_prevF0 << "), phase = " << m_phase << endl; for (sv_frame_t i = 0; i < m_blockSize; ++i) { double fHere = (nowOn ? f0 : m_prevF0); if (wasOn && nowOn && (f0 != m_prevF0) && (i < fadeLength)) { // interpolate the frequency shift fHere = m_prevF0 + ((f0 - m_prevF0) * double(i)) / double(fadeLength); } double phasor = (fHere * 2 * M_PI) / m_sampleRate; m_phase = m_phase + phasor; int harmonics = int((m_sampleRate / 4) / fHere - 1); if (harmonics < 1) harmonics = 1; switch (m_wavetype) { case 1: harmonics = 1; break; case 2: break; case 3: break; default: harmonics = 3; break; } for (int h = 0; h < harmonics; ++h) { double v = 0; double hn = 0; double hp = 0; switch (m_wavetype) { case 1: // single sinusoid v = sin(m_phase); break; case 2: // sawtooth if (h != 0) { hn = h + 1; hp = m_phase * hn; v = -(1.0 / M_PI) * sin(hp) / hn; } else { v = 0.5; } break; case 3: // square hn = h*2 + 1; hp = m_phase * hn; v = sin(hp) / hn; break; default: // 3 sinusoids hn = h + 1; hp = m_phase * hn; v = sin(hp) / hn; break; } if (!wasOn && i < fadeLength) { // fade in v = v * (double(i) / double(fadeLength)); } else if (!nowOn) { // fade out if (i > fadeLength) v = 0; else v = v * (1.0 - (double(i) / double(fadeLength))); } for (int c = 0; c < m_channels; ++c) { toBuffers[c][i] += float(levels[c] * v); } } } m_prevF0 = f0; delete[] levels; } sonic-visualiser-3.0.3/svapp/audio/ContinuousSynth.h0000644000000000000000000000354613111512442020743 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef CONTINUOUS_SYNTH_H #define CONTINUOUS_SYNTH_H #include "base/BaseTypes.h" /** * Mix into a target buffer a signal synthesised so as to sound at a * specific frequency. The frequency may change with each processing * block, or may be switched on or off. */ class ContinuousSynth { public: ContinuousSynth(int channels, sv_samplerate_t sampleRate, sv_frame_t blockSize, int waveType); ~ContinuousSynth(); void setChannelCount(int channels); void reset(); /** * Mix in a signal to be heard at the given fundamental * frequency. Any oscillator state will be maintained between * process calls so as to provide a continuous sound. The f0 value * may vary between calls. * * Supply f0 equal to 0 if you want to maintain the f0 from the * previous block (without having to remember what it was). * * Supply f0 less than 0 for silence. You should continue to call * this even when the signal is silent if you want to ensure the * sound switches on and off cleanly. */ void mix(float **toBuffers, float gain, float pan, float f0); private: int m_channels; sv_samplerate_t m_sampleRate; sv_frame_t m_blockSize; double m_prevF0; double m_phase; int m_wavetype; }; #endif sonic-visualiser-3.0.3/svapp/audio/PlaySpeedRangeMapper.cpp0000644000000000000000000000515613111512442022111 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PlaySpeedRangeMapper.h" #include #include // PlaySpeedRangeMapper maps a position in the range [0,120] on to a // play speed factor on a logarithmic scale in the range 0.125 -> // 8. This ensures that the desirable speed factors 0.25, 0.5, 1, 2, // and 4 are all mapped to exact positions (respectively 20, 40, 60, // 80, 100). // Note that the "factor" referred to below is a play speed factor // (higher = faster, 1.0 = normal speed), the "value" is a percentage // (higher = faster, 100 = normal speed), and the "position" is an // integer step on the dial's scale (0-120, 60 = centre). PlaySpeedRangeMapper::PlaySpeedRangeMapper() : m_minpos(0), m_maxpos(120) { } int PlaySpeedRangeMapper::getPositionForValue(double value) const { // value is percent double factor = getFactorForValue(value); int position = getPositionForFactor(factor); return position; } int PlaySpeedRangeMapper::getPositionForValueUnclamped(double value) const { // We don't really provide this return getPositionForValue(value); } double PlaySpeedRangeMapper::getValueForPosition(int position) const { double factor = getFactorForPosition(position); double pc = getValueForFactor(factor); return pc; } double PlaySpeedRangeMapper::getValueForPositionUnclamped(int position) const { // We don't really provide this return getValueForPosition(position); } double PlaySpeedRangeMapper::getValueForFactor(double factor) const { return factor * 100.0; } double PlaySpeedRangeMapper::getFactorForValue(double value) const { return value / 100.0; } int PlaySpeedRangeMapper::getPositionForFactor(double factor) const { if (factor == 0) return m_minpos; int pos = int(lrint((log2(factor) + 3.0) * 20.0)); if (pos < m_minpos) pos = m_minpos; if (pos > m_maxpos) pos = m_maxpos; return pos; } double PlaySpeedRangeMapper::getFactorForPosition(int position) const { return pow(2.0, double(position) * 0.05 - 3.0); } QString PlaySpeedRangeMapper::getUnit() const { return "%"; } sonic-visualiser-3.0.3/svapp/audio/PlaySpeedRangeMapper.h0000644000000000000000000000266213111512442021555 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLAY_SPEED_RANGE_MAPPER_H_ #define _PLAY_SPEED_RANGE_MAPPER_H_ #include "base/RangeMapper.h" class PlaySpeedRangeMapper : public RangeMapper { public: PlaySpeedRangeMapper(); int getMinPosition() const { return m_minpos; } int getMaxPosition() const { return m_maxpos; } virtual int getPositionForValue(double value) const; virtual int getPositionForValueUnclamped(double value) const; virtual double getValueForPosition(int position) const; virtual double getValueForPositionUnclamped(int position) const; int getPositionForFactor(double factor) const; double getValueForFactor(double factor) const; double getFactorForPosition(int position) const; double getFactorForValue(double value) const; virtual QString getUnit() const; protected: int m_minpos; int m_maxpos; }; #endif sonic-visualiser-3.0.3/svapp/bootstrap.sh0000644000000000000000000000004413111512442016634 0ustar 00000000000000#!/bin/sh aclocal -I . && autoconf sonic-visualiser-3.0.3/svapp/config.pri.in0000644000000000000000000000062113111512442016652 0ustar 00000000000000 CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ linux*:LIBS += -lasound macx*:DEFINES += HAVE_QUICKTIME macx*:LIBS += -framework QuickTime -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-3.0.3/svapp/configure0000755000000000000000000075057613111512442016220 0ustar 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for SVapp 2.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='SVapp' PACKAGE_TARNAME='svapp' PACKAGE_VERSION='2.1' PACKAGE_STRING='SVapp 2.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="framework/Document.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_LIBS portaudio_CFLAGS liblo_LIBS liblo_CFLAGS rubberband_LIBS rubberband_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP HAVE_CXX11 MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS rubberband_CFLAGS rubberband_LIBS liblo_CFLAGS liblo_LIBS portaudio_CFLAGS portaudio_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures SVapp 2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/svapp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of SVapp 2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_CFLAGS C compiler flags for portaudio, overriding pkg-config portaudio_LIBS linker flags for portaudio, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF SVapp configure 2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by SVapp $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } # We are daringly making use of C++11 now ax_cxx_compile_cxx11_required=true ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -Werror -g" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rubberband" >&5 $as_echo_n "checking for rubberband... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS" LIBS="$LIBS $portaudio_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio" >&5 $as_echo_n "checking for portaudio... " >&6; } if test -n "$portaudio_CFLAGS"; then pkg_cv_portaudio_CFLAGS="$portaudio_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_LIBS"; then pkg_cv_portaudio_LIBS="$portaudio_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_CFLAGS=$pkg_cv_portaudio_CFLAGS portaudio_LIBS=$pkg_cv_portaudio_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS";LIBS="$LIBS $portaudio_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by SVapp $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ SVapp config.status 2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r svapp.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-3.0.3/svapp/configure.ac0000644000000000000000000001055113111512442016555 0ustar 00000000000000 AC_INIT([SVapp], [2.1], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(framework/Document.h) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P # We are daringly making use of C++11 now AX_CXX_COMPILE_STDCXX_11(noext) AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -Werror -g" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r svapp.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-3.0.3/svapp/files.pri0000644000000000000000000000172513111512442016110 0ustar 00000000000000 SVAPP_HEADERS += \ audio/AudioCallbackPlaySource.h \ audio/AudioCallbackRecordTarget.h \ audio/AudioGenerator.h \ audio/ClipMixer.h \ audio/ContinuousSynth.h \ audio/PlaySpeedRangeMapper.h \ framework/Align.h \ framework/Document.h \ framework/MainWindowBase.h \ framework/SVFileReader.h \ framework/TransformUserConfigurator.h \ framework/VersionTester.h SVAPP_SOURCES += \ audio/AudioCallbackPlaySource.cpp \ audio/AudioCallbackRecordTarget.cpp \ audio/AudioGenerator.cpp \ audio/ClipMixer.cpp \ audio/ContinuousSynth.cpp \ audio/PlaySpeedRangeMapper.cpp \ framework/Align.cpp \ framework/Document.cpp \ framework/MainWindowBase.cpp \ framework/SVFileReader.cpp \ framework/TransformUserConfigurator.cpp \ framework/VersionTester.cpp sonic-visualiser-3.0.3/svapp/framework/Align.cpp0000644000000000000000000002413513111512442020025 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Align.h" #include "data/model/WaveFileModel.h" #include "data/model/ReadOnlyWaveFileModel.h" #include "data/model/AggregateWaveModel.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/AlignmentModel.h" #include "data/fileio/CSVFileReader.h" #include "transform/TransformFactory.h" #include "transform/ModelTransformerFactory.h" #include "transform/FeatureExtractionModelTransformer.h" #include #include #include bool Align::alignModel(Model *ref, Model *other) { QSettings settings; settings.beginGroup("Preferences"); bool useProgram = settings.value("use-external-alignment", false).toBool(); QString program = settings.value("external-alignment-program", "").toString(); settings.endGroup(); if (useProgram && (program != "")) { return alignModelViaProgram(ref, other, program); } else { return alignModelViaTransform(ref, other); } } QString Align::getAlignmentTransformName() { QSettings settings; settings.beginGroup("Alignment"); TransformId id = settings.value("transform-id", "vamp:match-vamp-plugin:match:path").toString(); settings.endGroup(); return id; } bool Align::canAlign() { TransformId id = getAlignmentTransformName(); TransformFactory *factory = TransformFactory::getInstance(); return factory->haveTransform(id); } bool Align::alignModelViaTransform(Model *ref, Model *other) { RangeSummarisableTimeValueModel *reference = qobject_cast (ref); RangeSummarisableTimeValueModel *rm = qobject_cast (other); if (!reference || !rm) return false; // but this should have been tested already // This involves creating three new models: // 1. an AggregateWaveModel to provide the mixdowns of the main // model and the new model in its two channels, as input to the // MATCH plugin // 2. a SparseTimeValueModel, which is the model automatically // created by FeatureExtractionPluginTransformer when running the // MATCH plugin (thus containing the alignment path) // 3. an AlignmentModel, which stores the path model and carries // out alignment lookups on it. // The first two of these are provided as arguments to the // constructor for the third, which takes responsibility for // deleting them. The AlignmentModel, meanwhile, is passed to the // new model we are aligning, which also takes responsibility for // it. We should not have to delete any of these new models here. AggregateWaveModel::ChannelSpecList components; components.push_back(AggregateWaveModel::ModelChannelSpec (reference, -1)); components.push_back(AggregateWaveModel::ModelChannelSpec (rm, -1)); Model *aggregateModel = new AggregateWaveModel(components); ModelTransformer::Input aggregate(aggregateModel); TransformId id = getAlignmentTransformName(); TransformFactory *tf = TransformFactory::getInstance(); Transform transform = tf->getDefaultTransformFor (id, aggregateModel->getSampleRate()); transform.setStepSize(transform.getBlockSize()/2); transform.setParameter("serialise", 1); transform.setParameter("smooth", 0); SVDEBUG << "Align::alignModel: Alignment transform step size " << transform.getStepSize() << ", block size " << transform.getBlockSize() << endl; ModelTransformerFactory *mtf = ModelTransformerFactory::getInstance(); QString message; Model *transformOutput = mtf->transform(transform, aggregate, message); if (!transformOutput) { transform.setStepSize(0); transformOutput = mtf->transform(transform, aggregate, message); } SparseTimeValueModel *path = dynamic_cast (transformOutput); if (!path) { cerr << "Align::alignModel: ERROR: Failed to create alignment path (no MATCH plugin?)" << endl; delete transformOutput; delete aggregateModel; m_error = message; return false; } path->setCompletion(0); AlignmentModel *alignmentModel = new AlignmentModel (reference, other, aggregateModel, path); connect(alignmentModel, SIGNAL(completionChanged()), this, SLOT(alignmentCompletionChanged())); rm->setAlignment(alignmentModel); return true; } void Align::alignmentCompletionChanged() { AlignmentModel *am = qobject_cast(sender()); if (!am) return; if (am->isReady()) { disconnect(am, SIGNAL(completionChanged()), this, SLOT(alignmentCompletionChanged())); emit alignmentComplete(am); } } bool Align::alignModelViaProgram(Model *ref, Model *other, QString program) { WaveFileModel *reference = qobject_cast(ref); WaveFileModel *rm = qobject_cast(other); if (!reference || !rm) { return false; // but this should have been tested already } while (!reference->isReady(0) || !rm->isReady(0)) { qApp->processEvents(); } // Run an external program, passing to it paths to the main // model's audio file and the new model's audio file. It returns // the path in CSV form through stdout. ReadOnlyWaveFileModel *roref = qobject_cast(reference); ReadOnlyWaveFileModel *rorm = qobject_cast(rm); if (!roref || !rorm) { cerr << "ERROR: Align::alignModelViaProgram: Can't align non-read-only models via program (no local filename available)" << endl; return false; } QString refPath = roref->getLocalFilename(); QString otherPath = rorm->getLocalFilename(); if (refPath == "" || otherPath == "") { m_error = "Failed to find local filepath for wave-file model"; return false; } m_error = ""; AlignmentModel *alignmentModel = new AlignmentModel(reference, other, 0, 0); rm->setAlignment(alignmentModel); QProcess *process = new QProcess; QStringList args; args << refPath << otherPath; connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(alignmentProgramFinished(int, QProcess::ExitStatus))); m_processModels[process] = alignmentModel; process->start(program, args); bool success = process->waitForStarted(); if (!success) { cerr << "ERROR: Align::alignModelViaProgram: Program did not start" << endl; m_error = "Alignment program could not be started"; m_processModels.erase(process); rm->setAlignment(0); // deletes alignmentModel as well delete process; } return success; } void Align::alignmentProgramFinished(int exitCode, QProcess::ExitStatus status) { cerr << "Align::alignmentProgramFinished" << endl; QProcess *process = qobject_cast(sender()); if (m_processModels.find(process) == m_processModels.end()) { cerr << "ERROR: Align::alignmentProgramFinished: Process " << process << " not found in process model map!" << endl; return; } AlignmentModel *alignmentModel = m_processModels[process]; if (exitCode == 0 && status == 0) { CSVFormat format; format.setModelType(CSVFormat::TwoDimensionalModel); format.setTimingType(CSVFormat::ExplicitTiming); format.setTimeUnits(CSVFormat::TimeSeconds); format.setColumnCount(2); // The output format has time in the reference file first, and // time in the "other" file in the second column. This is a // more natural approach for a command-line alignment tool, // but it's the opposite of what we expect for native // alignment paths, which map from "other" file to // reference. These column purpose settings reflect that. format.setColumnPurpose(1, CSVFormat::ColumnStartTime); format.setColumnPurpose(0, CSVFormat::ColumnValue); format.setAllowQuoting(false); format.setSeparator(','); CSVFileReader reader(process, format, alignmentModel->getSampleRate()); if (!reader.isOK()) { cerr << "ERROR: Align::alignmentProgramFinished: Failed to parse output" << endl; m_error = QString("Failed to parse output of program: %1") .arg(reader.getError()); goto done; } Model *csvOutput = reader.load(); SparseTimeValueModel *path = qobject_cast(csvOutput); if (!path) { cerr << "ERROR: Align::alignmentProgramFinished: Output did not convert to sparse time-value model" << endl; m_error = QString("Output of program did not produce sparse time-value model"); goto done; } if (path->getPoints().empty()) { cerr << "ERROR: Align::alignmentProgramFinished: Output contained no mappings" << endl; m_error = QString("Output of alignment program contained no mappings"); goto done; } cerr << "Align::alignmentProgramFinished: Setting alignment path (" << path->getPoints().size() << " point(s))" << endl; alignmentModel->setPathFrom(path); emit alignmentComplete(alignmentModel); } else { cerr << "ERROR: Align::alignmentProgramFinished: Aligner program " << "failed: exit code " << exitCode << ", status " << status << endl; m_error = "Aligner process returned non-zero exit status"; } done: m_processModels.erase(process); delete process; } sonic-visualiser-3.0.3/svapp/framework/Align.h0000644000000000000000000000471413111512442017473 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef ALIGN_H #define ALIGN_H #include #include #include #include class Model; class AlignmentModel; class Align : public QObject { Q_OBJECT public: Align() : m_error("") { } /** * Align the "other" model to the reference, attaching an * AlignmentModel to it. Alignment is carried out by the method * configured in the user preferences (either a plugin transform * or an external process) and is done asynchronously. * * A single Align object may carry out many simultanous alignment * calls -- you do not need to create a new Align object each * time, nor to wait for an alignment to be complete before * starting a new one. * * The Align object must survive after this call, for at least as * long as the alignment takes. The usual expectation is that the * Align object will simply share the process or document * lifespan. */ bool alignModel(Model *reference, Model *other); // via user preference bool alignModelViaTransform(Model *reference, Model *other); bool alignModelViaProgram(Model *reference, Model *other, QString program); /** * Return true if the alignment facility is available (relevant * plugin installed, etc). */ static bool canAlign(); QString getError() const { return m_error; } signals: /** * Emitted when an alignment is successfully completed. The * reference and other models can be queried from the alignment * model. */ void alignmentComplete(AlignmentModel *alignment); private slots: void alignmentCompletionChanged(); void alignmentProgramFinished(int, QProcess::ExitStatus); private: static QString getAlignmentTransformName(); QString m_error; std::map m_processModels; }; #endif sonic-visualiser-3.0.3/svapp/framework/Document.cpp0000644000000000000000000013002613111512442020546 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Document.h" #include "Align.h" #include "data/model/WaveFileModel.h" #include "data/model/WritableWaveFileModel.h" #include "data/model/DenseThreeDimensionalModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/FlexiNoteModel.h" #include "data/model/AggregateWaveModel.h" #include "layer/Layer.h" #include "widgets/CommandHistory.h" #include "base/Command.h" #include "view/View.h" #include "base/PlayParameterRepository.h" #include "base/PlayParameters.h" #include "transform/TransformFactory.h" #include "transform/ModelTransformerFactory.h" #include "transform/FeatureExtractionModelTransformer.h" #include #include #include #include #include #include "data/model/AlignmentModel.h" #include "Align.h" using std::vector; //#define DEBUG_DOCUMENT 1 //!!! still need to handle command history, documentRestored/documentModified Document::Document() : m_mainModel(0), m_autoAlignment(false), m_align(new Align()) { connect(this, SIGNAL(modelAboutToBeDeleted(Model *)), ModelTransformerFactory::getInstance(), SLOT(modelAboutToBeDeleted(Model *))); connect(ModelTransformerFactory::getInstance(), SIGNAL(transformFailed(QString, QString)), this, SIGNAL(modelGenerationFailed(QString, QString))); connect(m_align, SIGNAL(alignmentComplete(AlignmentModel *)), this, SIGNAL(alignmentComplete(AlignmentModel *))); } Document::~Document() { //!!! Document should really own the command history. atm we //still refer to it in various places that don't have access to //the document, be nice to fix that #ifdef DEBUG_DOCUMENT cerr << "\n\nDocument::~Document: about to clear command history" << endl; #endif CommandHistory::getInstance()->clear(); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::~Document: about to delete layers" << endl; #endif while (!m_layers.empty()) { deleteLayer(*m_layers.begin(), true); } if (!m_models.empty()) { SVDEBUG << "Document::~Document: WARNING: " << m_models.size() << " model(s) still remain -- " << "should have been garbage collected when deleting layers" << endl; while (!m_models.empty()) { Model *model = m_models.begin()->first; if (model == m_mainModel) { // just in case! SVDEBUG << "Document::~Document: WARNING: Main model is also" << " in models list!" << endl; } else if (model) { model->aboutToDelete(); emit modelAboutToBeDeleted(model); delete model; } m_models.erase(m_models.begin()); } } #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::~Document: About to get rid of main model" << endl; #endif if (m_mainModel) { m_mainModel->aboutToDelete(); emit modelAboutToBeDeleted(m_mainModel); } emit mainModelChanged(0); delete m_mainModel; } Layer * Document::createLayer(LayerFactory::LayerType type) { Layer *newLayer = LayerFactory::getInstance()->createLayer(type); if (!newLayer) return 0; newLayer->setObjectName(getUniqueLayerName(newLayer->objectName())); m_layers.insert(newLayer); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::createLayer: Added layer of type " << type << ", now have " << m_layers.size() << " layers" << endl; #endif emit layerAdded(newLayer); return newLayer; } Layer * Document::createMainModelLayer(LayerFactory::LayerType type) { Layer *newLayer = createLayer(type); if (!newLayer) return 0; setModel(newLayer, m_mainModel); return newLayer; } Layer * Document::createImportedLayer(Model *model) { LayerFactory::LayerTypeSet types = LayerFactory::getInstance()->getValidLayerTypes(model); if (types.empty()) { cerr << "WARNING: Document::importLayer: no valid display layer for model" << endl; return 0; } //!!! for now, just use the first suitable layer type LayerFactory::LayerType type = *types.begin(); Layer *newLayer = LayerFactory::getInstance()->createLayer(type); if (!newLayer) return 0; newLayer->setObjectName(getUniqueLayerName(newLayer->objectName())); addImportedModel(model); setModel(newLayer, model); //!!! and all channels setChannel(newLayer, -1); m_layers.insert(newLayer); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::createImportedLayer: Added layer of type " << type << ", now have " << m_layers.size() << " layers" << endl; #endif emit layerAdded(newLayer); return newLayer; } Layer * Document::createEmptyLayer(LayerFactory::LayerType type) { if (!m_mainModel) return 0; Model *newModel = LayerFactory::getInstance()->createEmptyModel(type, m_mainModel); if (!newModel) return 0; Layer *newLayer = createLayer(type); if (!newLayer) { delete newModel; return 0; } addImportedModel(newModel); setModel(newLayer, newModel); return newLayer; } Layer * Document::createDerivedLayer(LayerFactory::LayerType type, TransformId transform) { Layer *newLayer = createLayer(type); if (!newLayer) return 0; newLayer->setObjectName(getUniqueLayerName (TransformFactory::getInstance()-> getTransformFriendlyName(transform))); return newLayer; } Layer * Document::createDerivedLayer(const Transform &transform, const ModelTransformer::Input &input) { Transforms transforms; transforms.push_back(transform); vector layers = createDerivedLayers(transforms, input); if (layers.empty()) return 0; else return layers[0]; } vector Document::createDerivedLayers(const Transforms &transforms, const ModelTransformer::Input &input) { QString message; vector newModels = addDerivedModels(transforms, input, message, 0); if (newModels.empty()) { //!!! This identifier may be wrong! emit modelGenerationFailed(transforms[0].getIdentifier(), message); return vector(); } else if (message != "") { //!!! This identifier may be wrong! emit modelGenerationWarning(transforms[0].getIdentifier(), message); } QStringList names; for (int i = 0; i < (int)newModels.size(); ++i) { names.push_back(getUniqueLayerName (TransformFactory::getInstance()-> getTransformFriendlyName (transforms[i].getIdentifier()))); } vector layers = createLayersForDerivedModels(newModels, names); return layers; } class AdditionalModelConverter : public ModelTransformerFactory::AdditionalModelHandler { public: AdditionalModelConverter(Document *doc, Document::LayerCreationHandler *handler) : m_doc(doc), m_handler(handler) { } virtual ~AdditionalModelConverter() { } void setPrimaryLayers(vector layers) { m_primary = layers; } void moreModelsAvailable(vector models) { std::cerr << "AdditionalModelConverter::moreModelsAvailable: " << models.size() << " model(s)" << std::endl; // We can't automatically regenerate the additional models on // reload -- we should delete them instead QStringList names; foreach (Model *model, models) { m_doc->addAdditionalModel(model); names.push_back(QString()); } vector layers = m_doc->createLayersForDerivedModels (models, names); m_handler->layersCreated(this, m_primary, layers); delete this; } void noMoreModelsAvailable() { std::cerr << "AdditionalModelConverter::noMoreModelsAvailable" << std::endl; m_handler->layersCreated(this, m_primary, vector()); delete this; } void cancel() { foreach (Layer *layer, m_primary) { Model *model = layer->getModel(); if (model) { model->abandon(); } } } private: Document *m_doc; vector m_primary; Document::LayerCreationHandler *m_handler; //!!! how to handle destruction of this? }; Document::LayerCreationAsyncHandle Document::createDerivedLayersAsync(const Transforms &transforms, const ModelTransformer::Input &input, LayerCreationHandler *handler) { QString message; AdditionalModelConverter *amc = new AdditionalModelConverter(this, handler); vector newModels = addDerivedModels (transforms, input, message, amc); QStringList names; for (int i = 0; i < (int)newModels.size(); ++i) { names.push_back(getUniqueLayerName (TransformFactory::getInstance()-> getTransformFriendlyName (transforms[i].getIdentifier()))); } vector layers = createLayersForDerivedModels(newModels, names); amc->setPrimaryLayers(layers); if (newModels.empty()) { //!!! This identifier may be wrong! emit modelGenerationFailed(transforms[0].getIdentifier(), message); //!!! what to do with amc? } else if (message != "") { //!!! This identifier may be wrong! emit modelGenerationWarning(transforms[0].getIdentifier(), message); //!!! what to do with amc? } return amc; } void Document::cancelAsyncLayerCreation(Document::LayerCreationAsyncHandle h) { AdditionalModelConverter *conv = static_cast(h); conv->cancel(); } vector Document::createLayersForDerivedModels(vector newModels, QStringList names) { vector layers; for (int i = 0; i < (int)newModels.size(); ++i) { Model *newModel = newModels[i]; LayerFactory::LayerTypeSet types = LayerFactory::getInstance()->getValidLayerTypes(newModel); if (types.empty()) { cerr << "WARNING: Document::createLayerForTransformer: no valid display layer for output of transform " << names[i] << endl; //!!! inadequate cleanup: newModel->aboutToDelete(); emit modelAboutToBeDeleted(newModel); m_models.erase(newModel); delete newModel; return vector(); } //!!! for now, just use the first suitable layer type Layer *newLayer = createLayer(*types.begin()); setModel(newLayer, newModel); //!!! We need to clone the model when adding the layer, so that it //can be edited without affecting other layers that are based on //the same model. Unfortunately we can't just clone it now, //because it probably hasn't been completed yet -- the transform //runs in the background. Maybe the transform has to handle //cloning and cacheing models itself. // // Once we do clone models here, of course, we'll have to avoid // leaking them too. // // We want the user to be able to add a model to a second layer // _while it's still being calculated in the first_ and have it // work quickly. That means we need to put the same physical // model pointer in both layers, so they can't actually be cloned. if (newLayer) { newLayer->setObjectName(names[i]); } emit layerAdded(newLayer); layers.push_back(newLayer); } return layers; } void Document::setMainModel(WaveFileModel *model) { Model *oldMainModel = m_mainModel; m_mainModel = model; emit modelAdded(m_mainModel); if (model) { emit activity(tr("Set main model to %1").arg(model->objectName())); } else { emit activity(tr("Clear main model")); } std::vector obsoleteLayers; std::set failedTransformers; // We need to ensure that no layer is left using oldMainModel or // any of the old derived models as its model. Either replace the // model, or delete the layer for each layer that is currently // using one of these. Carry out this replacement before we // delete any of the models. #ifdef DEBUG_DOCUMENT cerr << "Document::setMainModel: Have " << m_layers.size() << " layers" << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; cerr << "Old main model: " << oldMainModel << endl; #endif for (LayerSet::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { Layer *layer = *i; Model *model = layer->getModel(); #ifdef DEBUG_DOCUMENT cerr << "Document::setMainModel: inspecting model " << (model ? model->objectName(): "(null)") << " in layer " << layer->objectName() << endl; #endif if (model == oldMainModel) { #ifdef DEBUG_DOCUMENT cerr << "... it uses the old main model, replacing" << endl; #endif LayerFactory::getInstance()->setModel(layer, m_mainModel); continue; } if (!model) { cerr << "WARNING: Document::setMainModel: Null model in layer " << layer << endl; // get rid of this hideous degenerate obsoleteLayers.push_back(layer); continue; } if (m_models.find(model) == m_models.end()) { cerr << "WARNING: Document::setMainModel: Unknown model " << model << " in layer " << layer << endl; // and this one obsoleteLayers.push_back(layer); continue; } if (m_models[model].source && (m_models[model].source == oldMainModel)) { #ifdef DEBUG_DOCUMENT cerr << "... it uses a model derived from the old main model, regenerating" << endl; #endif // This model was derived from the previous main // model: regenerate it. const Transform &transform = m_models[model].transform; QString transformId = transform.getIdentifier(); //!!! We have a problem here if the number of channels in //the main model has changed. QString message; Model *replacementModel = addDerivedModel(transform, ModelTransformer::Input (m_mainModel, m_models[model].channel), message); if (!replacementModel) { cerr << "WARNING: Document::setMainModel: Failed to regenerate model for transform \"" << transformId << "\"" << " in layer " << layer << endl; if (failedTransformers.find(transformId) == failedTransformers.end()) { emit modelRegenerationFailed(layer->objectName(), transformId, message); failedTransformers.insert(transformId); } obsoleteLayers.push_back(layer); } else { if (message != "") { emit modelRegenerationWarning(layer->objectName(), transformId, message); } #ifdef DEBUG_DOCUMENT cerr << "Replacing model " << model << " (type " << typeid(*model).name() << ") with model " << replacementModel << " (type " << typeid(*replacementModel).name() << ") in layer " << layer << " (name " << layer->objectName() << ")" << endl; RangeSummarisableTimeValueModel *rm = dynamic_cast(replacementModel); if (rm) { cerr << "new model has " << rm->getChannelCount() << " channels " << endl; } else { cerr << "new model " << replacementModel << " is not a RangeSummarisableTimeValueModel!" << endl; } #endif setModel(layer, replacementModel); } } } for (size_t k = 0; k < obsoleteLayers.size(); ++k) { deleteLayer(obsoleteLayers[k], true); } for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (i->second.additional) { Model *m = i->first; m->aboutToDelete(); emit modelAboutToBeDeleted(m); delete m; } } for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { Model *m = i->first; #ifdef DEBUG_DOCUMENT SVDEBUG << "considering alignment for model " << m << " (name \"" << m->objectName() << "\")" << endl; #endif if (m_autoAlignment) { alignModel(m); } else if (oldMainModel && (m->getAlignmentReference() == oldMainModel)) { alignModel(m); } } if (oldMainModel) { oldMainModel->aboutToDelete(); emit modelAboutToBeDeleted(oldMainModel); } if (m_autoAlignment) { SVDEBUG << "Document::setMainModel: auto-alignment is on, aligning model if possible" << endl; alignModel(m_mainModel); } emit mainModelChanged(m_mainModel); delete oldMainModel; } void Document::addAlreadyDerivedModel(const Transform &transform, const ModelTransformer::Input &input, Model *outputModelToAdd) { if (m_models.find(outputModelToAdd) != m_models.end()) { cerr << "WARNING: Document::addAlreadyDerivedModel: Model already added" << endl; return; } #ifdef DEBUG_DOCUMENT if (input.getModel()) { cerr << "Document::addAlreadyDerivedModel: source is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl; } else { cerr << "Document::addAlreadyDerivedModel: source is " << input.getModel() << endl; } #endif ModelRecord rec; rec.source = input.getModel(); rec.channel = input.getChannel(); rec.transform = transform; rec.additional = false; rec.refcount = 0; outputModelToAdd->setSourceModel(input.getModel()); m_models[outputModelToAdd] = rec; #ifdef DEBUG_DOCUMENT cerr << "Document::addAlreadyDerivedModel: Added model " << outputModelToAdd << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif emit modelAdded(outputModelToAdd); } void Document::addImportedModel(Model *model) { if (m_models.find(model) != m_models.end()) { cerr << "WARNING: Document::addImportedModel: Model already added" << endl; return; } ModelRecord rec; rec.source = 0; rec.channel = 0; rec.refcount = 0; rec.additional = false; m_models[model] = rec; #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::addImportedModel: Added model " << model << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif if (m_autoAlignment) { SVDEBUG << "Document::addImportedModel: auto-alignment is on, aligning model if possible" << endl; alignModel(model); } else { SVDEBUG << "Document(" << this << "): addImportedModel: auto-alignment is off" << endl; } emit modelAdded(model); } void Document::addAdditionalModel(Model *model) { if (m_models.find(model) != m_models.end()) { cerr << "WARNING: Document::addAdditionalModel: Model already added" << endl; return; } ModelRecord rec; rec.source = 0; rec.channel = 0; rec.refcount = 0; rec.additional = true; m_models[model] = rec; #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::addAdditionalModel: Added model " << model << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif if (m_autoAlignment) { SVDEBUG << "Document::addAdditionalModel: auto-alignment is on, aligning model if possible" << endl; alignModel(model); } emit modelAdded(model); } void Document::addAggregateModel(AggregateWaveModel *model) { connect(model, SIGNAL(modelInvalidated()), this, SLOT(aggregateModelInvalidated())); m_aggregateModels.insert(model); } void Document::aggregateModelInvalidated() { QObject *s = sender(); AggregateWaveModel *aggregate = qobject_cast(s); if (aggregate) releaseModel(aggregate); } Model * Document::addDerivedModel(const Transform &transform, const ModelTransformer::Input &input, QString &message) { for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (i->second.transform == transform && i->second.source == input.getModel() && i->second.channel == input.getChannel()) { std::cerr << "derived model taken from map " << std::endl; return i->first; } } Transforms tt; tt.push_back(transform); vector mm = addDerivedModels(tt, input, message, 0); if (mm.empty()) return 0; else return mm[0]; } vector Document::addDerivedModels(const Transforms &transforms, const ModelTransformer::Input &input, QString &message, AdditionalModelConverter *amc) { vector mm = ModelTransformerFactory::getInstance()->transformMultiple (transforms, input, message, amc); for (int j = 0; j < (int)mm.size(); ++j) { Model *model = mm[j]; // The transform we actually used was presumably identical to // the one asked for, except that the version of the plugin // may differ. It's possible that the returned message // contains a warning about this; that doesn't concern us // here, but we do need to ensure that the transform we // remember is correct for what was actually applied, with the // current plugin version. //!!! would be nice to short-circuit this -- the version is //!!! static data, shouldn't have to construct a plugin for it //!!! (which may be expensive in Piper-world) Transform applied = transforms[j]; applied.setPluginVersion (TransformFactory::getInstance()-> getDefaultTransformFor(applied.getIdentifier(), applied.getSampleRate()) .getPluginVersion()); if (!model) { cerr << "WARNING: Document::addDerivedModel: no output model for transform " << applied.getIdentifier() << endl; } else { addAlreadyDerivedModel(applied, input, model); } } return mm; } void Document::releaseModel(Model *model) // Will _not_ release main model! { if (model == 0) { return; } if (model == m_mainModel) { return; } bool toDelete = false; if (m_models.find(model) != m_models.end()) { if (m_models[model].refcount == 0) { SVCERR << "WARNING: Document::releaseModel: model " << model << " reference count is zero already!" << endl; } else { if (--m_models[model].refcount == 0) { toDelete = true; } } } else if (m_aggregateModels.find(model) != m_aggregateModels.end()) { SVDEBUG << "Document::releaseModel: is an aggregate model" << endl; toDelete = true; } else { SVCERR << "WARNING: Document::releaseModel: Unfound model " << model << endl; toDelete = true; } if (toDelete) { int sourceCount = 0; for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (i->second.source == model) { ++sourceCount; i->second.source = 0; } } if (sourceCount > 0) { SVDEBUG << "Document::releaseModel: Deleting model " << model << " even though it is source for " << sourceCount << " other derived model(s) -- resetting " << "their source fields appropriately" << endl; } model->aboutToDelete(); emit modelAboutToBeDeleted(model); m_models.erase(model); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::releaseModel: Deleted model " << model << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif delete model; } } void Document::deleteLayer(Layer *layer, bool force) { if (m_layerViewMap.find(layer) != m_layerViewMap.end() && m_layerViewMap[layer].size() > 0) { cerr << "WARNING: Document::deleteLayer: Layer " << layer << " [" << layer->objectName() << "]" << " is still used in " << m_layerViewMap[layer].size() << " views!" << endl; if (force) { #ifdef DEBUG_DOCUMENT cerr << "(force flag set -- deleting from all views)" << endl; #endif for (std::set::iterator j = m_layerViewMap[layer].begin(); j != m_layerViewMap[layer].end(); ++j) { // don't use removeLayerFromView, as it issues a command layer->setLayerDormant(*j, true); (*j)->removeLayer(layer); } m_layerViewMap.erase(layer); } else { return; } } if (m_layers.find(layer) == m_layers.end()) { SVDEBUG << "Document::deleteLayer: Layer " << layer << " (" << typeid(layer).name() << ") does not exist, or has already been deleted " << "(this may not be as serious as it sounds)" << endl; return; } m_layers.erase(layer); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::deleteLayer: Removing, now have " << m_layers.size() << " layers" << endl; #endif releaseModel(layer->getModel()); emit layerRemoved(layer); emit layerAboutToBeDeleted(layer); delete layer; } void Document::setModel(Layer *layer, Model *model) { if (model && model != m_mainModel && m_models.find(model) == m_models.end()) { cerr << "ERROR: Document::setModel: Layer " << layer << " (\"" << layer->objectName() << "\") wants to use unregistered model " << model << ": register the layer's model before setting it!" << endl; return; } Model *previousModel = layer->getModel(); if (previousModel == model) { SVDEBUG << "NOTE: Document::setModel: Layer " << layer << " (\"" << layer->objectName() << "\") is already set to model " << model << " (\"" << (model ? model->objectName(): "(null)") << "\")" << endl; return; } if (model && model != m_mainModel) { m_models[model].refcount ++; } if (model && previousModel) { PlayParameterRepository::getInstance()->copyParameters (previousModel, model); } LayerFactory::getInstance()->setModel(layer, model); // std::cerr << "layer type: " << LayerFactory::getInstance()->getLayerTypeName(LayerFactory::getInstance()->getLayerType(layer)) << std::endl; if (previousModel) { releaseModel(previousModel); } } void Document::setChannel(Layer *layer, int channel) { LayerFactory::getInstance()->setChannel(layer, channel); } void Document::addLayerToView(View *view, Layer *layer) { Model *model = layer->getModel(); if (!model) { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::addLayerToView: Layer (\"" << layer->objectName() << "\") with no model being added to view: " << "normally you want to set the model first" << endl; #endif } else { if (model != m_mainModel && m_models.find(model) == m_models.end()) { cerr << "ERROR: Document::addLayerToView: Layer " << layer << " has unregistered model " << model << " -- register the layer's model before adding the layer!" << endl; return; } } CommandHistory::getInstance()->addCommand (new Document::AddLayerCommand(this, view, layer)); } void Document::removeLayerFromView(View *view, Layer *layer) { CommandHistory::getInstance()->addCommand (new Document::RemoveLayerCommand(this, view, layer)); } void Document::addToLayerViewMap(Layer *layer, View *view) { bool firstView = (m_layerViewMap.find(layer) == m_layerViewMap.end() || m_layerViewMap[layer].empty()); if (m_layerViewMap[layer].find(view) != m_layerViewMap[layer].end()) { cerr << "WARNING: Document::addToLayerViewMap:" << " Layer " << layer << " -> view " << view << " already in" << " layer view map -- internal inconsistency" << endl; } m_layerViewMap[layer].insert(view); if (firstView) emit layerInAView(layer, true); } void Document::removeFromLayerViewMap(Layer *layer, View *view) { if (m_layerViewMap[layer].find(view) == m_layerViewMap[layer].end()) { cerr << "WARNING: Document::removeFromLayerViewMap:" << " Layer " << layer << " -> view " << view << " not in" << " layer view map -- internal inconsistency" << endl; } m_layerViewMap[layer].erase(view); if (m_layerViewMap[layer].empty()) { m_layerViewMap.erase(layer); emit layerInAView(layer, false); } } QString Document::getUniqueLayerName(QString candidate) { for (int count = 1; ; ++count) { QString adjusted = (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) : candidate); bool duplicate = false; for (LayerSet::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->objectName() == adjusted) { duplicate = true; break; } } if (!duplicate) return adjusted; } } std::vector Document::getTransformInputModels() { std::vector models; if (!m_mainModel) return models; models.push_back(m_mainModel); //!!! This will pick up all models, including those that aren't visible... for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { Model *model = i->first; if (!model || model == m_mainModel) continue; DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) { models.push_back(dtvm); } } return models; } bool Document::isKnownModel(const Model *model) const { if (model == m_mainModel) return true; return (m_models.find(const_cast(model)) != m_models.end()); } bool Document::canAlign() { return Align::canAlign(); } void Document::alignModel(Model *model) { SVDEBUG << "Document::alignModel(" << model << ")" << endl; if (!m_mainModel) { SVDEBUG << "(no main model to align to)" << endl; return; } RangeSummarisableTimeValueModel *rm = dynamic_cast(model); if (!rm) { SVDEBUG << "(main model is not alignable-to)" << endl; return; } if (rm->getAlignmentReference() == m_mainModel) { SVDEBUG << "(model " << rm << " is already aligned to main model " << m_mainModel << ")" << endl; return; } if (model == m_mainModel) { // The reference has an empty alignment to itself. This makes // it possible to distinguish between the reference and any // unaligned model just by looking at the model itself, // without also knowing what the main model is SVDEBUG << "Document::alignModel(" << model << "): is main model, setting appropriately" << endl; rm->setAlignment(new AlignmentModel(model, model, 0, 0)); return; } if (!m_align->alignModel(m_mainModel, rm)) { cerr << "Alignment failed: " << m_align->getError() << endl; emit alignmentFailed(m_align->getError()); } } void Document::alignModels() { for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { alignModel(i->first); } alignModel(m_mainModel); } Document::AddLayerCommand::AddLayerCommand(Document *d, View *view, Layer *layer) : m_d(d), m_view(view), m_layer(layer), m_name(qApp->translate("AddLayerCommand", "Add %1 Layer").arg(layer->objectName())), m_added(false) { } Document::AddLayerCommand::~AddLayerCommand() { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::AddLayerCommand::~AddLayerCommand" << endl; #endif if (!m_added) { m_d->deleteLayer(m_layer); } } QString Document::AddLayerCommand::getName() const { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::AddLayerCommand::getName(): Name is " << m_name << endl; #endif return m_name; } void Document::AddLayerCommand::execute() { for (int i = 0; i < m_view->getLayerCount(); ++i) { if (m_view->getLayer(i) == m_layer) { // already there m_layer->setLayerDormant(m_view, false); m_added = true; return; } } m_view->addLayer(m_layer); m_layer->setLayerDormant(m_view, false); m_d->addToLayerViewMap(m_layer, m_view); m_added = true; } void Document::AddLayerCommand::unexecute() { m_view->removeLayer(m_layer); m_layer->setLayerDormant(m_view, true); m_d->removeFromLayerViewMap(m_layer, m_view); m_added = false; } Document::RemoveLayerCommand::RemoveLayerCommand(Document *d, View *view, Layer *layer) : m_d(d), m_view(view), m_layer(layer), m_wasDormant(layer->isLayerDormant(view)), m_name(qApp->translate("RemoveLayerCommand", "Delete %1 Layer").arg(layer->objectName())), m_added(true) { } Document::RemoveLayerCommand::~RemoveLayerCommand() { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::RemoveLayerCommand::~RemoveLayerCommand" << endl; #endif if (!m_added) { m_d->deleteLayer(m_layer); } } QString Document::RemoveLayerCommand::getName() const { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::RemoveLayerCommand::getName(): Name is " << m_name << endl; #endif return m_name; } void Document::RemoveLayerCommand::execute() { bool have = false; for (int i = 0; i < m_view->getLayerCount(); ++i) { if (m_view->getLayer(i) == m_layer) { have = true; break; } } if (!have) { // not there! m_layer->setLayerDormant(m_view, true); m_added = false; return; } m_view->removeLayer(m_layer); m_layer->setLayerDormant(m_view, true); m_d->removeFromLayerViewMap(m_layer, m_view); m_added = false; } void Document::RemoveLayerCommand::unexecute() { m_view->addLayer(m_layer); m_layer->setLayerDormant(m_view, m_wasDormant); m_d->addToLayerViewMap(m_layer, m_view); m_added = true; } void Document::toXml(QTextStream &out, QString indent, QString extraAttributes) const { toXml(out, indent, extraAttributes, false); } void Document::toXmlAsTemplate(QTextStream &out, QString indent, QString extraAttributes) const { toXml(out, indent, extraAttributes, true); } void Document::toXml(QTextStream &out, QString indent, QString extraAttributes, bool asTemplate) const { out << indent + QString("\n") .arg(extraAttributes == "" ? "" : " ").arg(extraAttributes); if (m_mainModel) { if (asTemplate) { writePlaceholderMainModel(out, indent + " "); } else { m_mainModel->toXml(out, indent + " ", "mainModel=\"true\""); } PlayParameters *playParameters = PlayParameterRepository::getInstance()->getPlayParameters(m_mainModel); if (playParameters) { playParameters->toXml (out, indent + " ", QString("model=\"%1\"") .arg(XmlExportable::getObjectExportId(m_mainModel))); } } // Models that are not used in a layer that is in a view should // not be written. Get our list of required models first. std::set used; for (LayerViewMap::const_iterator i = m_layerViewMap.begin(); i != m_layerViewMap.end(); ++i) { if (i->first && !i->second.empty()) { // Layer exists, is in views Model *m = i->first->getModel(); if (m) { used.insert(m); if (m->getSourceModel()) { used.insert(m->getSourceModel()); } } } } // Write aggregate models first, so that when re-reading // derivations we already know about their existence. But only // those that are actually used for (std::set::iterator i = m_aggregateModels.begin(); i != m_aggregateModels.end(); ++i) { SVDEBUG << "checking aggregate model " << *i << endl; AggregateWaveModel *aggregate = qobject_cast(*i); if (!aggregate) continue; if (used.find(aggregate) == used.end()) { SVDEBUG << "(unused, skipping)" << endl; continue; } SVDEBUG << "(used, writing)" << endl; aggregate->toXml(out, indent + " "); } std::set written; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { Model *model = i->first; const ModelRecord &rec = i->second; if (used.find(model) == used.end()) continue; // We need an intelligent way to determine which models need // to be streamed (i.e. have been edited, or are small) and // which should not be (i.e. remain as generated by a // transform, and are large). // // At the moment we can get away with deciding not to stream // dense 3d models or writable wave file models, provided they // were generated from a transform, because at the moment there // is no way to edit those model types so it should be safe to // regenerate them. That won't always work in future though. // It would be particularly nice to be able to ask the user, // as well as making an intelligent guess. bool writeModel = true; bool haveDerivation = false; if (rec.source && rec.transform.getIdentifier() != "") { haveDerivation = true; } if (haveDerivation) { if (dynamic_cast(model)) { writeModel = false; } else if (dynamic_cast(model)) { writeModel = false; } } if (writeModel) { model->toXml(out, indent + " "); written.insert(model); } if (haveDerivation) { writeBackwardCompatibleDerivation(out, indent + " ", model, rec); } //!!! We should probably own the PlayParameterRepository PlayParameters *playParameters = PlayParameterRepository::getInstance()->getPlayParameters(model); if (playParameters) { playParameters->toXml (out, indent + " ", QString("model=\"%1\"") .arg(XmlExportable::getObjectExportId(model))); } } //!!! // We should write out the alignment models here. AlignmentModel // needs a toXml that writes out the export IDs of its reference // and aligned models, and then streams its path model. Note that // this will only work when the alignment is complete, so we // should probably wait for it if it isn't already by this point. for (std::set::const_iterator i = written.begin(); i != written.end(); ++i) { const Model *model = *i; const AlignmentModel *alignment = model->getAlignment(); if (!alignment) continue; alignment->toXml(out, indent + " "); } for (LayerSet::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { (*i)->toXml(out, indent + " "); } out << indent + "\n"; } void Document::writePlaceholderMainModel(QTextStream &out, QString indent) const { out << indent; out << QString("\n") .arg(getObjectExportId(m_mainModel)) .arg(m_mainModel->getSampleRate()); } void Document::writeBackwardCompatibleDerivation(QTextStream &out, QString indent, Model *targetModel, const ModelRecord &rec) const { // There is a lot of redundancy in the XML we output here, because // we want it to work with older SV session file reading code as // well. // // Formerly, a transform was described using a derivation element // which set out the source and target models, execution context // (step size, input channel etc) and transform id, containing a // plugin element which set out the transform parameters and so // on. (The plugin element came from a "configurationXml" string // obtained from PluginXml.) // // This has been replaced by a derivation element setting out the // source and target models and input channel, containing a // transform element which sets out everything in the Transform. // // In order to retain compatibility with older SV code, however, // we have to write out the same stuff into the derivation as // before, and manufacture an appropriate plugin element as well // as the transform element. In order that newer code knows it's // dealing with a newer format, we will also write an attribute // 'type="transform"' in the derivation element. const Transform &transform = rec.transform; // Just for reference, this is what we would write if we didn't // have to be backward compatible: // // out << indent // << QString("\n") // .arg(XmlExportable::getObjectExportId(rec.source)) // .arg(XmlExportable::getObjectExportId(targetModel)) // .arg(rec.channel); // // transform.toXml(out, indent + " "); // // out << indent << "\n"; // // Unfortunately, we can't just do that. So we do this... QString extentsAttributes; if (transform.getStartTime() != RealTime::zeroTime || transform.getDuration() != RealTime::zeroTime) { extentsAttributes = QString("startFrame=\"%1\" duration=\"%2\" ") .arg(RealTime::realTime2Frame(transform.getStartTime(), targetModel->getSampleRate())) .arg(RealTime::realTime2Frame(transform.getDuration(), targetModel->getSampleRate())); } out << indent; out << QString("\n") .arg(XmlExportable::getObjectExportId(rec.source)) .arg(XmlExportable::getObjectExportId(targetModel)) .arg(rec.channel) .arg(TransformFactory::getInstance()->getTransformInputDomain (transform.getIdentifier())) .arg(transform.getStepSize()) .arg(transform.getBlockSize()) .arg(extentsAttributes) .arg(int(transform.getWindowType())) .arg(XmlExportable::encodeEntities(transform.getIdentifier())); transform.toXml(out, indent + " "); out << indent << " " << TransformFactory::getInstance()->getPluginConfigurationXml(transform); out << indent << "\n"; } sonic-visualiser-3.0.3/svapp/framework/Document.h0000644000000000000000000003646013111512442020222 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _DOCUMENT_H_ #define _DOCUMENT_H_ #include "layer/LayerFactory.h" #include "transform/Transform.h" #include "transform/ModelTransformer.h" #include "transform/FeatureExtractionModelTransformer.h" #include "base/Command.h" #include #include class Model; class Layer; class View; class WaveFileModel; class AggregateWaveModel; class AdditionalModelConverter; class Align; /** * A Sonic Visualiser document consists of a set of data models, and * also the visualisation layers used to display them. Changes to the * layers and their layout need to be stored and managed in much the * same way as changes to the underlying data. * * The document manages: * * - A main data Model, which provides the underlying sample rate and * such like. This must be a WaveFileModel. * * - Any number of imported Model objects, which contain data without any * requirement to remember where the data came from or how to * regenerate it. * * - Any number of Model objects that were generated by a Transformer * such as FeatureExtractionModelTransformer. For these, we also * record the source model and the name of the transform used to * generate the model so that we can regenerate it (potentially * from a different source) on demand. * * - A flat list of Layer objects. Elsewhere, the GUI may distribute these * across any number of View widgets. A layer may be viewable on more * than one view at once, in principle. A layer refers to one model, * but the same model can be in use in more than one layer. * * The document does *not* manage the existence or structure of Pane * and other view widgets. However, it does provide convenience * methods for reference-counted command-based management of the * association between layers and views (addLayerToView, * removeLayerFromView). */ class Document : public QObject, public XmlExportable { Q_OBJECT public: Document(); virtual ~Document(); /** * Create and return a new layer of the given type, associated * with no model. The caller may set any model on this layer, but * the model must also be registered with the document via the * add-model methods below. */ Layer *createLayer(LayerFactory::LayerType); /** * Create and return a new layer of the given type, associated * with the current main model (if appropriate to the layer type). */ Layer *createMainModelLayer(LayerFactory::LayerType); /** * Create and return a new layer associated with the given model, * and register the model as an imported model. */ Layer *createImportedLayer(Model *); /** * Create and return a new layer of the given type, with an * appropriate empty model. If the given type is not one for * which an empty model can meaningfully be created, return 0. */ Layer *createEmptyLayer(LayerFactory::LayerType); /** * Create and return a new layer of the given type, associated * with the given transform name. This method does not run the * transform itself, nor create a model. The caller can safely * add a model to the layer later, but note that all models used * by a transform layer _must_ be registered with the document * using addDerivedModel below. */ Layer *createDerivedLayer(LayerFactory::LayerType, TransformId); /** * Create and return a suitable layer for the given transform, * running the transform and associating the resulting model with * the new layer. */ Layer *createDerivedLayer(const Transform &, const ModelTransformer::Input &); /** * Create and return suitable layers for the given transforms, * which must be identical apart from the output (i.e. must use * the same plugin and configuration). The layers are returned in * the same order as the transforms are supplied. */ std::vector createDerivedLayers(const Transforms &, const ModelTransformer::Input &); typedef void *LayerCreationAsyncHandle; class LayerCreationHandler { public: virtual ~LayerCreationHandler() { } /** * The primary layers are those corresponding 1-1 to the input * models, listed in the same order as the input models. The * additional layers vector contains any layers (from all * models) that were returned separately at the end of * processing. The handle indicates which async process this * callback was initiated by. It must not be used again after * this function returns. */ virtual void layersCreated(LayerCreationAsyncHandle handle, std::vector primary, std::vector additional) = 0; }; /** * Create suitable layers for the given transforms, which must be * identical apart from the output (i.e. must use the same plugin * and configuration). This method returns after initialising the * transformer process, and the layers are returned through a * subsequent call to the provided handler (which must be * non-null). The handle returned will be passed through to the * handler callback, and may be also used for cancelling the task. */ LayerCreationAsyncHandle createDerivedLayersAsync(const Transforms &, const ModelTransformer::Input &, LayerCreationHandler *handler); /** * Indicate that the async layer creation task associated with the * given handle should be cancelled. There is no guarantee about * what this will mean, and the handler callback may still be * called. */ void cancelAsyncLayerCreation(LayerCreationAsyncHandle handle); /** * Delete the given layer, and also its associated model if no * longer used by any other layer. In general, this should be the * only method used to delete layers -- doing so directly is a bit * of a social gaffe. */ void deleteLayer(Layer *, bool force = false); /** * Set the main model (the source for playback sample rate, etc) * to the given wave file model. This will regenerate any derived * models that were based on the previous main model. */ void setMainModel(WaveFileModel *); /** * Get the main model (the source for playback sample rate, etc). */ WaveFileModel *getMainModel() { return m_mainModel; } /** * Get the main model (the source for playback sample rate, etc). */ const WaveFileModel *getMainModel() const { return m_mainModel; } std::vector getTransformInputModels(); bool isKnownModel(const Model *) const; /** * Add a derived model associated with the given transform, * running the transform and returning the resulting model. */ Model *addDerivedModel(const Transform &transform, const ModelTransformer::Input &input, QString &returnedMessage); /** * Add derived models associated with the given set of related * transforms, running the transforms and returning the resulting * models. */ friend class AdditionalModelConverter; std::vector addDerivedModels(const Transforms &transforms, const ModelTransformer::Input &input, QString &returnedMessage, AdditionalModelConverter *); /** * Add a derived model associated with the given transform. This * is necessary to register any derived model that was not created * by the document using createDerivedModel or createDerivedLayer. */ void addAlreadyDerivedModel(const Transform &transform, const ModelTransformer::Input &input, Model *outputModelToAdd); /** * Add an imported (non-derived, non-main) model. This is * necessary to register any imported model that is associated * with a layer. */ void addImportedModel(Model *); /** * Add an aggregate model (one which represents a set of component * wave models as one model per channel in a single wave * model). Aggregate models are unusual in that they are created * for a single transform each and have no refcount. (This * probably isn't ideal!) They are recorded separately from other * models, and will be deleted if any of their component models * are removed. */ void addAggregateModel(AggregateWaveModel *); /** * Associate the given model with the given layer. The model must * have already been registered using one of the addXXModel * methods above. */ void setModel(Layer *, Model *); /** * Set the given layer to use the given channel of its model (-1 * means all available channels). */ void setChannel(Layer *, int); /** * Add the given layer to the given view. If the layer is * intended to show a particular model, the model should normally * be set using setModel before this method is called. */ void addLayerToView(View *, Layer *); /** * Remove the given layer from the given view. Ownership of the * layer is transferred to a command object on the undo stack, and * the layer will be deleted when the undo stack is pruned. */ void removeLayerFromView(View *, Layer *); /** * Return true if alignment is supported (i.e. if the necessary * plugin is found). */ static bool canAlign(); /** * Specify whether models added via addImportedModel should be * automatically aligned against the main model if appropriate. */ void setAutoAlignment(bool on) { m_autoAlignment = on; } /** * Generate alignments for all appropriate models against the main * model. Existing alignments will not be re-calculated unless * the main model has changed since they were calculated. */ void alignModels(); void toXml(QTextStream &, QString indent, QString extraAttributes) const; void toXmlAsTemplate(QTextStream &, QString indent, QString extraAttributes) const; signals: void layerAdded(Layer *); void layerRemoved(Layer *); void layerAboutToBeDeleted(Layer *); // Emitted when a layer is first added to a view, or when it is // last removed from a view void layerInAView(Layer *, bool); void modelAdded(Model *); void mainModelChanged(WaveFileModel *); // emitted after modelAdded void modelAboutToBeDeleted(Model *); void modelGenerationFailed(QString transformName, QString message); void modelGenerationWarning(QString transformName, QString message); void modelRegenerationFailed(QString layerName, QString transformName, QString message); void modelRegenerationWarning(QString layerName, QString transformName, QString message); void alignmentComplete(AlignmentModel *); void alignmentFailed(QString message); void activity(QString); protected slots: void aggregateModelInvalidated(); protected: void releaseModel(Model *model); /** * If model is suitable for alignment, align it against the main * model and store the alignment in the model. (If the model has * an alignment already for the current main model, leave it * unchanged.) */ void alignModel(Model *); /* * Every model that is in use by a layer in the document must be * found in either m_mainModel or m_models. We own and control * the lifespan of all of these models. */ /** * The model that provides the underlying sample rate, etc. This * model is not reference counted for layers, and is not freed * unless it is replaced or the document is deleted. */ WaveFileModel *m_mainModel; struct ModelRecord { // Information associated with a non-main model. If this // model is derived from another, then source will be non-NULL // and the transform name will be set appropriately. If the // transform name is set but source is NULL, then there was a // transform involved but the (target) model has been modified // since being generated from it. // This does not use ModelTransformer::Input, because it would // be confusing to have Input objects hanging around with NULL // models in them. const Model *source; int channel; Transform transform; bool additional; // Count of the number of layers using this model. int refcount; }; typedef std::map ModelMap; ModelMap m_models; /** * Add an extra derived model (returned at the end of processing a * transform). */ void addAdditionalModel(Model *); std::set m_aggregateModels; class AddLayerCommand : public Command { public: AddLayerCommand(Document *d, View *view, Layer *layer); virtual ~AddLayerCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: Document *m_d; View *m_view; // I don't own this Layer *m_layer; // Document owns this, but I determine its lifespan QString m_name; bool m_added; }; class RemoveLayerCommand : public Command { public: RemoveLayerCommand(Document *d, View *view, Layer *layer); virtual ~RemoveLayerCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: Document *m_d; View *m_view; // I don't own this Layer *m_layer; // Document owns this, but I determine its lifespan bool m_wasDormant; QString m_name; bool m_added; }; typedef std::map > LayerViewMap; LayerViewMap m_layerViewMap; void addToLayerViewMap(Layer *, View *); void removeFromLayerViewMap(Layer *, View *); QString getUniqueLayerName(QString candidate); void writeBackwardCompatibleDerivation(QTextStream &, QString, Model *, const ModelRecord &) const; void toXml(QTextStream &, QString, QString, bool asTemplate) const; void writePlaceholderMainModel(QTextStream &, QString) const; std::vector createLayersForDerivedModels(std::vector, QStringList names); /** * And these are the layers. We also control the lifespans of * these (usually through the commands used to add and remove them). */ typedef std::set LayerSet; LayerSet m_layers; bool m_autoAlignment; Align *m_align; }; #endif sonic-visualiser-3.0.3/svapp/framework/MainWindowBase.cpp0000644000000000000000000035663713111512442021661 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "MainWindowBase.h" #include "Document.h" #include "view/Pane.h" #include "view/PaneStack.h" #include "data/model/ReadOnlyWaveFileModel.h" #include "data/model/WritableWaveFileModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/NoteModel.h" #include "data/model/FlexiNoteModel.h" #include "data/model/Labeller.h" #include "data/model/TabularModel.h" #include "view/ViewManager.h" #include "layer/WaveformLayer.h" #include "layer/TimeRulerLayer.h" #include "layer/TimeInstantLayer.h" #include "layer/TimeValueLayer.h" #include "layer/Colour3DPlotLayer.h" #include "layer/SliceLayer.h" #include "layer/SliceableLayer.h" #include "layer/ImageLayer.h" #include "layer/NoteLayer.h" #include "layer/FlexiNoteLayer.h" #include "layer/RegionLayer.h" #include "widgets/ListInputDialog.h" #include "widgets/CommandHistory.h" #include "widgets/ProgressDialog.h" #include "widgets/MIDIFileImportDialog.h" #include "widgets/CSVFormatDialog.h" #include "widgets/ModelDataTableDialog.h" #include "widgets/InteractiveFileFinder.h" #include "audio/AudioCallbackPlaySource.h" #include "audio/AudioCallbackRecordTarget.h" #include "audio/PlaySpeedRangeMapper.h" #include "data/fileio/DataFileReaderFactory.h" #include "data/fileio/PlaylistFileReader.h" #include "data/fileio/WavFileWriter.h" #include "data/fileio/MIDIFileWriter.h" #include "data/fileio/BZipFileDevice.h" #include "data/fileio/FileSource.h" #include "data/fileio/AudioFileReaderFactory.h" #include "rdf/RDFImporter.h" #include "base/RecentFiles.h" #include "base/PlayParameterRepository.h" #include "base/XmlExportable.h" #include "base/Profiler.h" #include "base/Preferences.h" #include "base/TempWriteFile.h" #include "base/Exceptions.h" #include "base/ResourceFinder.h" #include "data/osc/OSCQueue.h" #include "data/midi/MIDIInput.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::vector; using std::map; using std::set; #ifdef Q_WS_X11 #define Window X11Window #include #include #include #include static int handle_x11_error(Display *dpy, XErrorEvent *err) { char errstr[256]; XGetErrorText(dpy, err->error_code, errstr, 256); if (err->error_code != BadWindow) { cerr << "Sonic Visualiser: X Error: " << errstr << " " << int(err->error_code) << "\nin major opcode: " << int(err->request_code) << endl; } return 0; } #undef Window #endif MainWindowBase::MainWindowBase(SoundOptions options) : m_document(0), m_paneStack(0), m_viewManager(0), m_timeRulerLayer(0), m_soundOptions(options), m_playSource(0), m_recordTarget(0), m_resamplerWrapper(0), m_playTarget(0), m_audioIO(0), m_oscQueue(0), m_oscQueueStarter(0), m_midiInput(0), m_recentFiles("RecentFiles", 20), m_recentTransforms("RecentTransforms", 20), m_documentModified(false), m_openingAudioFile(false), m_abandoning(false), m_labeller(0), m_lastPlayStatusSec(0), m_initialDarkBackground(false), m_defaultFfwdRwdStep(2, 0), m_audioRecordMode(RecordCreateAdditionalModel), m_statusLabel(0), m_iconsVisibleInMenus(true), m_menuShortcutMapper(0) { Profiler profiler("MainWindowBase::MainWindowBase"); SVDEBUG << "MainWindowBase::MainWindowBase" << endl; if (options & WithAudioInput) { if (!(options & WithAudioOutput)) { SVCERR << "WARNING: MainWindowBase: WithAudioInput requires WithAudioOutput -- recording will not work" << endl; } } qRegisterMetaType("sv_frame_t"); qRegisterMetaType("sv_samplerate_t"); #ifdef Q_WS_X11 XSetErrorHandler(handle_x11_error); #endif connect(this, SIGNAL(hideSplash()), this, SLOT(emitHideSplash())); connect(CommandHistory::getInstance(), SIGNAL(commandExecuted()), this, SLOT(documentModified())); connect(CommandHistory::getInstance(), SIGNAL(documentRestored()), this, SLOT(documentRestored())); SVDEBUG << "MainWindowBase: Creating view manager" << endl; m_viewManager = new ViewManager(); connect(m_viewManager, SIGNAL(selectionChanged()), this, SLOT(updateMenuStates())); connect(m_viewManager, SIGNAL(inProgressSelectionChanged()), this, SLOT(inProgressSelectionChanged())); SVDEBUG << "MainWindowBase: Calculating view font size" << endl; // set a sensible default font size for views -- cannot do this // in Preferences, which is in base and not supposed to use QtGui int viewFontSize = int(QApplication::font().pointSize() * 0.9); QSettings settings; settings.beginGroup("Preferences"); viewFontSize = settings.value("view-font-size", viewFontSize).toInt(); settings.setValue("view-font-size", viewFontSize); settings.endGroup(); SVDEBUG << "MainWindowBase: View font size is " << viewFontSize << endl; #ifdef NOT_DEFINED // This no longer works correctly on any platform AFAICS Preferences::BackgroundMode mode = Preferences::getInstance()->getBackgroundMode(); m_initialDarkBackground = m_viewManager->getGlobalDarkBackground(); if (mode != Preferences::BackgroundFromTheme) { m_viewManager->setGlobalDarkBackground (mode == Preferences::DarkBackground); } #endif m_paneStack = new PaneStack(0, m_viewManager); connect(m_paneStack, SIGNAL(currentPaneChanged(Pane *)), this, SLOT(currentPaneChanged(Pane *))); connect(m_paneStack, SIGNAL(currentLayerChanged(Pane *, Layer *)), this, SLOT(currentLayerChanged(Pane *, Layer *))); connect(m_paneStack, SIGNAL(rightButtonMenuRequested(Pane *, QPoint)), this, SLOT(rightButtonMenuRequested(Pane *, QPoint))); connect(m_paneStack, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); connect(m_paneStack, SIGNAL(paneAdded(Pane *)), this, SLOT(paneAdded(Pane *))); connect(m_paneStack, SIGNAL(paneHidden(Pane *)), this, SLOT(paneHidden(Pane *))); connect(m_paneStack, SIGNAL(paneAboutToBeDeleted(Pane *)), this, SLOT(paneAboutToBeDeleted(Pane *))); connect(m_paneStack, SIGNAL(dropAccepted(Pane *, QStringList)), this, SLOT(paneDropAccepted(Pane *, QStringList))); connect(m_paneStack, SIGNAL(dropAccepted(Pane *, QString)), this, SLOT(paneDropAccepted(Pane *, QString))); connect(m_paneStack, SIGNAL(paneDeleteButtonClicked(Pane *)), this, SLOT(paneDeleteButtonClicked(Pane *))); SVDEBUG << "MainWindowBase: Creating play source" << endl; m_playSource = new AudioCallbackPlaySource (m_viewManager, QApplication::applicationName()); if (m_soundOptions & WithAudioInput) { SVDEBUG << "MainWindowBase: Creating record target" << endl; m_recordTarget = new AudioCallbackRecordTarget (m_viewManager, QApplication::applicationName()); connect(m_recordTarget, SIGNAL(recordDurationChanged(sv_frame_t, sv_samplerate_t)), this, SLOT(recordDurationChanged(sv_frame_t, sv_samplerate_t))); } connect(m_playSource, SIGNAL(sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool)), this, SLOT(sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool))); connect(m_playSource, SIGNAL(channelCountIncreased(int)), this, SLOT(audioChannelCountIncreased(int))); connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()), this, SLOT(audioOverloadPluginDisabled())); connect(m_playSource, SIGNAL(audioTimeStretchMultiChannelDisabled()), this, SLOT(audioTimeStretchMultiChannelDisabled())); connect(m_viewManager, SIGNAL(monitoringLevelsChanged(float, float)), this, SLOT(monitoringLevelsChanged(float, float))); connect(m_viewManager, SIGNAL(playbackFrameChanged(sv_frame_t)), this, SLOT(playbackFrameChanged(sv_frame_t))); connect(m_viewManager, SIGNAL(globalCentreFrameChanged(sv_frame_t)), this, SLOT(globalCentreFrameChanged(sv_frame_t))); connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, sv_frame_t)), this, SLOT(viewCentreFrameChanged(View *, sv_frame_t))); connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, int, bool)), this, SLOT(viewZoomLevelChanged(View *, int, bool))); connect(Preferences::getInstance(), SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); SVDEBUG << "MainWindowBase: Creating labeller" << endl; Labeller::ValueType labellerType = Labeller::ValueFromTwoLevelCounter; settings.beginGroup("MainWindow"); labellerType = (Labeller::ValueType) settings.value("labellertype", (int)labellerType).toInt(); int cycle = settings.value("labellercycle", 4).toInt(); settings.endGroup(); m_labeller = new Labeller(labellerType); m_labeller->setCounterCycleSize(cycle); if (m_soundOptions & WithMIDIInput) { SVDEBUG << "MainWindowBase: Creating MIDI input" << endl; m_midiInput = new MIDIInput(QApplication::applicationName(), this); } QTimer::singleShot(1500, this, SIGNAL(hideSplash())); SVDEBUG << "MainWindowBase: Constructor done" << endl; } MainWindowBase::~MainWindowBase() { SVDEBUG << "MainWindowBase::~MainWindowBase" << endl; // We have to delete the breakfastquay::SystemPlaybackTarget or // breakfastquay::SystemAudioIO object (whichever we have -- it // depends on whether we handle recording or not) before we delete // the ApplicationPlaybackSource and ApplicationRecordTarget that // they refer to. deleteAudioIO(); // Then delete the Application objects. delete m_playSource; delete m_recordTarget; delete m_viewManager; delete m_oscQueue; delete m_oscQueueStarter; delete m_midiInput; Profiles::getInstance()->dump(); } void MainWindowBase::emitHideSplash() { SVDEBUG << "MainWindowBase: Hiding splash screen" << endl; emit hideSplash(this); } void MainWindowBase::finaliseMenus() { SVDEBUG << "MainWindowBase::finaliseMenus called" << endl; delete m_menuShortcutMapper; m_menuShortcutMapper = 0; foreach (QShortcut *sc, m_appShortcuts) { delete sc; } m_appShortcuts.clear(); QMenuBar *mb = menuBar(); // This used to find all children of QMenu type, and call // finaliseMenu on those. But it seems we are getting hold of some // menus that way that are not actually active in the menu bar and // are not returned in their parent menu's actions() list, and if // we finalise those, we end up with duplicate shortcuts in the // app shortcut mapper. So we should do this by descending the // menu tree through only those menus accessible via actions() // from their parents instead. QList menus = mb->findChildren (QString(), Qt::FindDirectChildrenOnly); foreach (QMenu *menu, menus) { if (menu) finaliseMenu(menu); } SVDEBUG << "MainWindowBase::finaliseMenus done" << endl; } void MainWindowBase::finaliseMenu(QMenu *menu) { foreach (QAction *a, menu->actions()) { a->setIconVisibleInMenu(m_iconsVisibleInMenus); } #ifdef Q_OS_MAC // See https://bugreports.qt-project.org/browse/QTBUG-38256 and // our issue #890 http://code.soundsoftware.ac.uk/issues/890 -- // single-key shortcuts that are associated only with a menu // action (and not with a toolbar button) do not work with Qt 5.x // under OS/X. // // Apparently Cocoa never handled them as a matter of course, but // earlier versions of Qt picked them up as widget shortcuts and // handled them anyway. That behaviour was removed to fix a crash // when invoking a menu while its window was overridden by a modal // dialog (https://bugreports.qt-project.org/browse/QTBUG-30657). // // This workaround restores the single-key shortcut behaviour by // searching in menus for single-key shortcuts that are associated // only with the menu and not with a toolbar button, and // augmenting them with global application shortcuts that invoke // the relevant actions, testing whether the actions are enabled // on invocation. // // (Previously this acted on all single-key shortcuts in menus, // and it removed the shortcut from the action when it created // each new global one, in order to avoid an "ambiguous shortcut" // error in the case where the action was also associated with a // toolbar button. But that has the unwelcome side-effect of // removing the shortcut hint from the menu entry. So now we leave // the shortcut in the menu action as well as creating a global // one, and we only act on shortcuts that have no toolbar button, // i.e. that will not otherwise work. The downside is that if this // bug is fixed in a future Qt release, we will start getting // "ambiguous shortcut" errors from the menu entry actions and // will need to update the code.) // Update: The bug was fixed in Qt 5.4 for shortcuts with no // modifier, and I believe it is fixed in Qt 5.5 for shortcuts // with Shift modifiers. The below reflects that #if (QT_VERSION < QT_VERSION_CHECK(5, 5, 0)) if (!m_menuShortcutMapper) { m_menuShortcutMapper = new QSignalMapper(this); connect(m_menuShortcutMapper, SIGNAL(mapped(QObject *)), this, SLOT(menuActionMapperInvoked(QObject *))); } foreach (QAction *a, menu->actions()) { if (a->isSeparator()) { continue; } else if (a->menu()) { finaliseMenu(a->menu()); } else { QWidgetList ww = a->associatedWidgets(); bool hasButton = false; foreach (QWidget *w, ww) { if (qobject_cast(w)) { hasButton = true; break; } } if (hasButton) continue; QKeySequence sc = a->shortcut(); // Note that the set of "single-key shortcuts" that aren't // working and that we need to handle here includes those // with the Shift modifier mask as well as those with no // modifier at all #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) // Nothing needed if (false) { #elif (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) if (sc.count() == 1 && (sc[0] & Qt::KeyboardModifierMask) == Qt::ShiftModifier) { #else if (sc.count() == 1 && ((sc[0] & Qt::KeyboardModifierMask) == Qt::NoModifier || (sc[0] & Qt::KeyboardModifierMask) == Qt::ShiftModifier)) { #endif QShortcut *newSc = new QShortcut(sc, a->parentWidget()); QObject::connect(newSc, SIGNAL(activated()), m_menuShortcutMapper, SLOT(map())); m_menuShortcutMapper->setMapping(newSc, a); m_appShortcuts.push_back(newSc); } } } #endif #endif } void MainWindowBase::menuActionMapperInvoked(QObject *o) { QAction *a = qobject_cast(o); if (a && a->isEnabled()) { a->trigger(); } } void MainWindowBase::resizeConstrained(QSize size) { QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); QSize actual(std::min(size.width(), available.width()), std::min(size.height(), available.height())); resize(actual); } void MainWindowBase::startOSCQueue() { m_oscQueueStarter = new OSCQueueStarter(this); connect(m_oscQueueStarter, SIGNAL(finished()), this, SLOT(oscReady())); m_oscQueueStarter->start(); } void MainWindowBase::oscReady() { if (m_oscQueue && m_oscQueue->isOK()) { connect(m_oscQueue, SIGNAL(messagesAvailable()), this, SLOT(pollOSC())); QTimer *oscTimer = new QTimer(this); connect(oscTimer, SIGNAL(timeout()), this, SLOT(pollOSC())); oscTimer->start(1000); SVCERR << "Finished setting up OSC interface" << endl; } } QString MainWindowBase::getOpenFileName(FileFinder::FileType type) { FileFinder *ff = FileFinder::getInstance(); if (type == FileFinder::AnyFile) { if (getMainModel() != 0 && m_paneStack != 0 && m_paneStack->getCurrentPane() != 0) { // can import a layer return ff->getOpenFileName(FileFinder::AnyFile, m_sessionFile); } else { return ff->getOpenFileName(FileFinder::SessionOrAudioFile, m_sessionFile); } } QString lastPath = m_sessionFile; if (type == FileFinder::AudioFile) { lastPath = m_audioFile; } return ff->getOpenFileName(type, lastPath); } QString MainWindowBase::getSaveFileName(FileFinder::FileType type) { QString lastPath = m_sessionFile; if (type == FileFinder::AudioFile) { lastPath = m_audioFile; } FileFinder *ff = FileFinder::getInstance(); return ff->getSaveFileName(type, lastPath); } void MainWindowBase::registerLastOpenedFilePath(FileFinder::FileType type, QString path) { FileFinder *ff = FileFinder::getInstance(); ff->registerLastOpenedFilePath(type, path); } QString MainWindowBase::getDefaultSessionTemplate() const { QSettings settings; settings.beginGroup("MainWindow"); QString templateName = settings.value("sessiontemplate", "").toString(); if (templateName == "") templateName = "default"; return templateName; } void MainWindowBase::setDefaultSessionTemplate(QString n) { QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("sessiontemplate", n); } void MainWindowBase::updateMenuStates() { Pane *currentPane = 0; Layer *currentLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentLayer = currentPane->getSelectedLayer(); bool havePrevPane = false, haveNextPane = false; bool havePrevLayer = false, haveNextLayer = false; if (currentPane) { for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == currentPane) { if (i > 0) havePrevPane = true; if (i < m_paneStack->getPaneCount()-1) haveNextPane = true; break; } } // the prev/next layer commands actually include the pane // itself as one of the selectables -- so we always have a // prev and next layer, as long as we have a pane with at // least one layer in it if (currentPane->getLayerCount() > 0) { havePrevLayer = true; haveNextLayer = true; } } bool haveCurrentPane = (currentPane != 0); bool haveCurrentLayer = (haveCurrentPane && (currentLayer != 0)); bool haveMainModel = (getMainModel() != 0); bool havePlayTarget = (m_playTarget != 0 || m_audioIO != 0); bool haveSelection = (m_viewManager && !m_viewManager->getSelections().empty()); bool haveCurrentEditableLayer = (haveCurrentLayer && currentLayer->isLayerEditable()); bool haveCurrentTimeInstantsLayer = (haveCurrentLayer && dynamic_cast(currentLayer)); bool haveCurrentDurationLayer = (haveCurrentLayer && (dynamic_cast(currentLayer) || dynamic_cast(currentLayer) || dynamic_cast(currentLayer))); bool haveCurrentColour3DPlot = (haveCurrentLayer && dynamic_cast(currentLayer)); bool haveClipboardContents = (m_viewManager && !m_viewManager->getClipboard().empty()); bool haveTabularLayer = (haveCurrentLayer && dynamic_cast(currentLayer->getModel())); emit canAddPane(haveMainModel); emit canDeleteCurrentPane(haveCurrentPane); emit canZoom(haveMainModel && haveCurrentPane); emit canScroll(haveMainModel && haveCurrentPane); emit canAddLayer(haveMainModel && haveCurrentPane); emit canImportMoreAudio(haveMainModel); emit canReplaceMainAudio(haveMainModel); emit canImportLayer(haveMainModel && haveCurrentPane); emit canExportAudio(haveMainModel); emit canChangeSessionTemplate(haveMainModel); emit canExportLayer(haveMainModel && (haveCurrentEditableLayer || haveCurrentColour3DPlot)); emit canExportImage(haveMainModel && haveCurrentPane); emit canDeleteCurrentLayer(haveCurrentLayer); emit canRenameLayer(haveCurrentLayer); emit canEditLayer(haveCurrentEditableLayer); emit canEditLayerTabular(haveCurrentEditableLayer || haveTabularLayer); emit canMeasureLayer(haveCurrentLayer); emit canSelect(haveMainModel && haveCurrentPane); emit canPlay(haveMainModel && havePlayTarget); emit canFfwd(haveMainModel); emit canRewind(haveMainModel); emit canPaste(haveClipboardContents); emit canInsertInstant(haveCurrentPane); emit canInsertInstantsAtBoundaries(haveCurrentPane && haveSelection); emit canInsertItemAtSelection(haveCurrentPane && haveSelection && haveCurrentDurationLayer); emit canRenumberInstants(haveCurrentTimeInstantsLayer && haveSelection); emit canSubdivideInstants(haveCurrentTimeInstantsLayer && haveSelection); emit canWinnowInstants(haveCurrentTimeInstantsLayer && haveSelection); emit canPlaySelection(haveMainModel && havePlayTarget && haveSelection); emit canClearSelection(haveSelection); emit canEditSelection(haveSelection && haveCurrentEditableLayer); emit canSave(m_sessionFile != "" && m_documentModified); emit canSaveAs(haveMainModel); emit canSelectPreviousPane(havePrevPane); emit canSelectNextPane(haveNextPane); emit canSelectPreviousLayer(havePrevLayer); emit canSelectNextLayer(haveNextLayer); // This is quite subtle -- whereas we can play back only if a // system play target or I/O exists, we can record even if no // record source (i.e. audioIO) exists because we can record into // an empty session before the audio device has been // opened. However, if there is no record *target* then recording // was actively disabled (flag not set in m_soundOptions). And if // we have a play target instead of an audioIO, then we must have // tried to open the device but failed to find any capture source. bool recordDisabled = (m_recordTarget == nullptr); bool recordDeviceFailed = (m_playTarget != nullptr && m_audioIO == nullptr); emit canRecord(!recordDisabled && !recordDeviceFailed); } void MainWindowBase::documentModified() { // SVDEBUG << "MainWindowBase::documentModified" << endl; if (!m_documentModified) { //!!! this in subclass implementation? setWindowTitle(tr("%1 (modified)").arg(windowTitle())); } m_documentModified = true; updateMenuStates(); } void MainWindowBase::documentRestored() { // SVDEBUG << "MainWindowBase::documentRestored" << endl; if (m_documentModified) { //!!! this in subclass implementation? QString wt(windowTitle()); wt.replace(tr(" (modified)"), ""); setWindowTitle(wt); } m_documentModified = false; updateMenuStates(); } void MainWindowBase::playLoopToggled() { QAction *action = dynamic_cast(sender()); if (action) { m_viewManager->setPlayLoopMode(action->isChecked()); } else { m_viewManager->setPlayLoopMode(!m_viewManager->getPlayLoopMode()); } } void MainWindowBase::playSelectionToggled() { QAction *action = dynamic_cast(sender()); if (action) { m_viewManager->setPlaySelectionMode(action->isChecked()); } else { m_viewManager->setPlaySelectionMode(!m_viewManager->getPlaySelectionMode()); } } void MainWindowBase::playSoloToggled() { QAction *action = dynamic_cast(sender()); if (action) { m_viewManager->setPlaySoloMode(action->isChecked()); } else { m_viewManager->setPlaySoloMode(!m_viewManager->getPlaySoloMode()); } if (m_viewManager->getPlaySoloMode()) { currentPaneChanged(m_paneStack->getCurrentPane()); } else { m_viewManager->setPlaybackModel(0); if (m_playSource) { m_playSource->clearSoloModelSet(); } } } void MainWindowBase::currentPaneChanged(Pane *p) { updateMenuStates(); updateVisibleRangeDisplay(p); if (!p) return; if (!(m_viewManager && m_playSource && m_viewManager->getPlaySoloMode())) { if (m_viewManager) m_viewManager->setPlaybackModel(0); return; } Model *prevPlaybackModel = m_viewManager->getPlaybackModel(); // What we want here is not the currently playing frame (unless we // are about to clear out the audio playback buffers -- which may // or may not be possible, depending on the audio driver). What // we want is the frame that was last committed to the soundcard // buffers, as the audio driver will continue playing up to that // frame before switching to whichever one we decide we want to // switch to, regardless of our efforts. sv_frame_t frame = m_playSource->getCurrentBufferedFrame(); cerr << "currentPaneChanged: current frame (in ref model) = " << frame << endl; View::ModelSet soloModels = p->getModels(); View::ModelSet sources; for (View::ModelSet::iterator mi = soloModels.begin(); mi != soloModels.end(); ++mi) { // If a model in this pane is derived from something else, // then we want to play that model as well -- if the model // that's derived from it is not something that is itself // individually playable (e.g. a waveform) if (*mi && !dynamic_cast(*mi) && (*mi)->getSourceModel()) { sources.insert((*mi)->getSourceModel()); } } for (View::ModelSet::iterator mi = sources.begin(); mi != sources.end(); ++mi) { soloModels.insert(*mi); } //!!! Need an "atomic" way of telling the play source that the //playback model has changed, and changing it on ViewManager -- //the play source should be making the setPlaybackModel call to //ViewManager for (View::ModelSet::iterator mi = soloModels.begin(); mi != soloModels.end(); ++mi) { if (dynamic_cast(*mi)) { m_viewManager->setPlaybackModel(*mi); } } RangeSummarisableTimeValueModel *a = dynamic_cast(prevPlaybackModel); RangeSummarisableTimeValueModel *b = dynamic_cast(m_viewManager-> getPlaybackModel()); m_playSource->setSoloModelSet(soloModels); if (a && b && (a != b)) { if (m_playSource->isPlaying()) m_playSource->play(frame); } } void MainWindowBase::currentLayerChanged(Pane *p, Layer *) { updateMenuStates(); updateVisibleRangeDisplay(p); } void MainWindowBase::selectAll() { if (!getMainModel()) return; m_viewManager->setSelection(Selection(getMainModel()->getStartFrame(), getMainModel()->getEndFrame())); } void MainWindowBase::selectToStart() { if (!getMainModel()) return; m_viewManager->setSelection(Selection(getMainModel()->getStartFrame(), m_viewManager->getGlobalCentreFrame())); } void MainWindowBase::selectToEnd() { if (!getMainModel()) return; m_viewManager->setSelection(Selection(m_viewManager->getGlobalCentreFrame(), getMainModel()->getEndFrame())); } void MainWindowBase::selectVisible() { Model *model = getMainModel(); if (!model) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; sv_frame_t startFrame, endFrame; if (currentPane->getStartFrame() < 0) startFrame = 0; else startFrame = currentPane->getStartFrame(); if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame(); else endFrame = currentPane->getEndFrame(); m_viewManager->setSelection(Selection(startFrame, endFrame)); } void MainWindowBase::clearSelection() { m_viewManager->clearSelections(); } void MainWindowBase::cut() { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *layer = currentPane->getSelectedLayer(); if (!layer) return; Clipboard &clipboard = m_viewManager->getClipboard(); clipboard.clear(); MultiSelection::SelectionList selections = m_viewManager->getSelections(); CommandHistory::getInstance()->startCompoundOperation(tr("Cut"), true); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { layer->copy(currentPane, *i, clipboard); layer->deleteSelection(*i); } CommandHistory::getInstance()->endCompoundOperation(); } void MainWindowBase::copy() { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *layer = currentPane->getSelectedLayer(); if (!layer) return; Clipboard &clipboard = m_viewManager->getClipboard(); clipboard.clear(); MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { layer->copy(currentPane, *i, clipboard); } } void MainWindowBase::paste() { pasteRelative(0); } void MainWindowBase::pasteAtPlaybackPosition() { sv_frame_t pos = getFrame(); Clipboard &clipboard = m_viewManager->getClipboard(); if (!clipboard.empty()) { sv_frame_t firstEventFrame = clipboard.getPoints()[0].getFrame(); sv_frame_t offset = 0; if (firstEventFrame < 0) { offset = pos - firstEventFrame; } else if (firstEventFrame < pos) { offset = pos - firstEventFrame; } else { offset = -(firstEventFrame - pos); } pasteRelative(offset); } } void MainWindowBase::pasteRelative(sv_frame_t offset) { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *layer = currentPane->getSelectedLayer(); Clipboard &clipboard = m_viewManager->getClipboard(); bool inCompound = false; if (!layer || !layer->isLayerEditable()) { CommandHistory::getInstance()->startCompoundOperation (tr("Paste"), true); // no suitable current layer: create one of the most // appropriate sort LayerFactory::LayerType type = LayerFactory::getInstance()->getLayerTypeForClipboardContents(clipboard); layer = m_document->createEmptyLayer(type); if (!layer) { CommandHistory::getInstance()->endCompoundOperation(); return; } m_document->addLayerToView(currentPane, layer); m_paneStack->setCurrentLayer(currentPane, layer); inCompound = true; } layer->paste(currentPane, clipboard, offset, true); if (inCompound) CommandHistory::getInstance()->endCompoundOperation(); } void MainWindowBase::deleteSelected() { if (m_paneStack->getCurrentPane() && m_paneStack->getCurrentPane()->getSelectedLayer()) { Layer *layer = m_paneStack->getCurrentPane()->getSelectedLayer(); if (m_viewManager) { if (m_viewManager->getToolMode() == ViewManager::MeasureMode) { layer->deleteCurrentMeasureRect(); } else { MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { layer->deleteSelection(*i); } } } } } // FrameTimer method sv_frame_t MainWindowBase::getFrame() const { if (m_playSource && m_playSource->isPlaying()) { return m_playSource->getCurrentPlayingFrame(); } else { return m_viewManager->getPlaybackFrame(); } } void MainWindowBase::insertInstant() { insertInstantAt(getFrame()); } void MainWindowBase::insertInstantsAtBoundaries() { MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { sv_frame_t start = i->getStartFrame(); sv_frame_t end = i->getEndFrame(); if (start != end) { insertInstantAt(start); insertInstantAt(end); } } } void MainWindowBase::insertInstantAt(sv_frame_t frame) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { return; } frame = pane->alignFromReference(frame); Layer *layer = dynamic_cast (pane->getSelectedLayer()); if (!layer) { for (int i = pane->getLayerCount(); i > 0; --i) { layer = dynamic_cast(pane->getLayer(i - 1)); if (layer) break; } if (!layer) { CommandHistory::getInstance()->startCompoundOperation (tr("Add Point"), true); layer = m_document->createEmptyLayer(LayerFactory::TimeInstants); if (layer) { m_document->addLayerToView(pane, layer); m_paneStack->setCurrentLayer(pane, layer); } CommandHistory::getInstance()->endCompoundOperation(); } } if (layer) { Model *model = layer->getModel(); SparseOneDimensionalModel *sodm = dynamic_cast (model); if (sodm) { SparseOneDimensionalModel::Point point(frame, ""); SparseOneDimensionalModel::Point prevPoint(0); bool havePrevPoint = false; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(sodm, tr("Add Point")); if (m_labeller) { if (m_labeller->requiresPrevPoint()) { SparseOneDimensionalModel::PointList prevPoints = sodm->getPreviousPoints(frame); if (!prevPoints.empty()) { prevPoint = *prevPoints.begin(); havePrevPoint = true; } } m_labeller->setSampleRate(sodm->getSampleRate()); if (m_labeller->actingOnPrevPoint() && havePrevPoint) { command->deletePoint(prevPoint); } m_labeller->label (point, havePrevPoint ? &prevPoint : 0); if (m_labeller->actingOnPrevPoint() && havePrevPoint) { command->addPoint(prevPoint); } } command->addPoint(point); command->setName(tr("Add Point at %1 s") .arg(RealTime::frame2RealTime (frame, sodm->getSampleRate()) .toText(false).c_str())); Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } } } void MainWindowBase::insertItemAtSelection() { MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { sv_frame_t start = i->getStartFrame(); sv_frame_t end = i->getEndFrame(); if (start < end) { insertItemAt(start, end - start); } } } void MainWindowBase::insertItemAt(sv_frame_t frame, sv_frame_t duration) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { return; } // ugh! sv_frame_t alignedStart = pane->alignFromReference(frame); sv_frame_t alignedEnd = pane->alignFromReference(frame + duration); if (alignedStart >= alignedEnd) return; sv_frame_t alignedDuration = alignedEnd - alignedStart; Command *c = 0; QString name = tr("Add Item at %1 s") .arg(RealTime::frame2RealTime (alignedStart, getMainModel()->getSampleRate()) .toText(false).c_str()); Layer *layer = pane->getSelectedLayer(); if (!layer) return; RegionModel *rm = dynamic_cast(layer->getModel()); if (rm) { RegionModel::Point point(alignedStart, rm->getValueMaximum() + 1, alignedDuration, ""); RegionModel::EditCommand *command = new RegionModel::EditCommand(rm, tr("Add Point")); command->addPoint(point); command->setName(name); c = command->finish(); } if (c) { CommandHistory::getInstance()->addCommand(c, false); return; } NoteModel *nm = dynamic_cast(layer->getModel()); if (nm) { NoteModel::Point point(alignedStart, nm->getValueMinimum(), alignedDuration, 1.f, ""); NoteModel::EditCommand *command = new NoteModel::EditCommand(nm, tr("Add Point")); command->addPoint(point); command->setName(name); c = command->finish(); } if (c) { CommandHistory::getInstance()->addCommand(c, false); return; } FlexiNoteModel *fnm = dynamic_cast(layer->getModel()); if (fnm) { FlexiNoteModel::Point point(alignedStart, fnm->getValueMinimum(), alignedDuration, 1.f, ""); FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(fnm, tr("Add Point")); command->addPoint(point); command->setName(name); c = command->finish(); } if (c) { CommandHistory::getInstance()->addCommand(c, false); return; } } void MainWindowBase::renumberInstants() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; Layer *layer = dynamic_cast(pane->getSelectedLayer()); if (!layer) return; MultiSelection ms(m_viewManager->getSelection()); Model *model = layer->getModel(); SparseOneDimensionalModel *sodm = dynamic_cast (model); if (!sodm) return; if (!m_labeller) return; Labeller labeller(*m_labeller); labeller.setSampleRate(sodm->getSampleRate()); Command *c = labeller.labelAll(*sodm, &ms); if (c) CommandHistory::getInstance()->addCommand(c, false); } void MainWindowBase::subdivideInstantsBy(int n) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; Layer *layer = dynamic_cast(pane->getSelectedLayer()); if (!layer) return; MultiSelection ms(m_viewManager->getSelection()); Model *model = layer->getModel(); SparseOneDimensionalModel *sodm = dynamic_cast(model); if (!sodm) return; if (!m_labeller) return; Labeller labeller(*m_labeller); labeller.setSampleRate(sodm->getSampleRate()); Command *c = labeller.subdivide (*sodm, &ms, n); if (c) CommandHistory::getInstance()->addCommand(c, false); } void MainWindowBase::winnowInstantsBy(int n) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; Layer *layer = dynamic_cast(pane->getSelectedLayer()); if (!layer) return; MultiSelection ms(m_viewManager->getSelection()); Model *model = layer->getModel(); SparseOneDimensionalModel *sodm = dynamic_cast(model); if (!sodm) return; if (!m_labeller) return; Labeller labeller(*m_labeller); labeller.setSampleRate(sodm->getSampleRate()); Command *c = labeller.winnow (*sodm, &ms, n); if (c) CommandHistory::getInstance()->addCommand(c, false); } MainWindowBase::FileOpenStatus MainWindowBase::openPath(QString fileOrUrl, AudioFileOpenMode mode) { ProgressDialog dialog(tr("Opening file or URL..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); return open(FileSource(fileOrUrl, &dialog), mode); } MainWindowBase::FileOpenStatus MainWindowBase::open(FileSource source, AudioFileOpenMode mode) { FileOpenStatus status; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); bool canImportLayer = (getMainModel() != 0 && m_paneStack != 0 && m_paneStack->getCurrentPane() != 0); bool rdf = (source.getExtension().toLower() == "rdf" || source.getExtension().toLower() == "n3" || source.getExtension().toLower() == "ttl"); bool audio = AudioFileReaderFactory::getKnownExtensions().contains (source.getExtension().toLower()); bool rdfSession = false; if (rdf) { RDFImporter::RDFDocumentType rdfType = RDFImporter::identifyDocumentType (QUrl::fromLocalFile(source.getLocalFilename()).toString()); if (rdfType == RDFImporter::AudioRefAndAnnotations || rdfType == RDFImporter::AudioRef) { rdfSession = true; } else if (rdfType == RDFImporter::NotRDF) { rdf = false; } } try { if (rdf) { if (rdfSession) { bool cancel = false; if (!canImportLayer || shouldCreateNewSessionForRDFAudio(&cancel)) { return openSession(source); } else if (cancel) { return FileOpenCancelled; } else { return openLayer(source); } } else { if ((status = openSession(source)) != FileOpenFailed) { return status; } else if (!canImportLayer) { return FileOpenWrongMode; } else if ((status = openLayer(source)) != FileOpenFailed) { return status; } else { return FileOpenFailed; } } } if (audio && (status = openAudio(source, mode)) != FileOpenFailed) { return status; } else if ((status = openSession(source)) != FileOpenFailed) { return status; } else if ((status = openPlaylist(source, mode)) != FileOpenFailed) { return status; } else if (!canImportLayer) { return FileOpenWrongMode; } else if ((status = openImage(source)) != FileOpenFailed) { return status; } else if ((status = openLayer(source)) != FileOpenFailed) { return status; } else { return FileOpenFailed; } } catch (const InsufficientDiscSpace &e) { emit hideSplash(); m_openingAudioFile = false; SVCERR << "MainWindowBase: Caught InsufficientDiscSpace in file open" << endl; QMessageBox::critical (this, tr("Not enough disc space"), tr("Not enough disc space

    There doesn't appear to be enough spare disc space to accommodate any necessary temporary files.

    Please clear some space and try again.

    ").arg(e.what())); return FileOpenFailed; } catch (const std::bad_alloc &e) { // reader may have rethrown this after cleaning up emit hideSplash(); m_openingAudioFile = false; SVCERR << "MainWindowBase: Caught bad_alloc in file open" << endl; QMessageBox::critical (this, tr("Not enough memory"), tr("Not enough memory

    There doesn't appear to be enough memory to accommodate any necessary temporary data.

    ")); return FileOpenFailed; } } MainWindowBase::FileOpenStatus MainWindowBase::openAudio(FileSource source, AudioFileOpenMode mode, QString templateName) { SVDEBUG << "MainWindowBase::openAudio(" << source.getLocation() << ") with mode " << mode << " and template " << templateName << endl; if (templateName == "") { templateName = getDefaultSessionTemplate(); SVDEBUG << "(Default template is: \"" << templateName << "\")" << endl; } // cerr << "template is: \"" << templateName << "\"" << endl; if (!source.isAvailable()) { if (source.wasCancelled()) { return FileOpenCancelled; } else { return FileOpenFailed; } } source.waitForData(); m_openingAudioFile = true; sv_samplerate_t rate = 0; if (Preferences::getInstance()->getFixedSampleRate() != 0) { rate = Preferences::getInstance()->getFixedSampleRate(); } else if (Preferences::getInstance()->getResampleOnLoad()) { if (getMainModel()) { rate = getMainModel()->getSampleRate(); } } ReadOnlyWaveFileModel *newModel = new ReadOnlyWaveFileModel(source, rate); if (!newModel->isOK()) { delete newModel; m_openingAudioFile = false; if (source.wasCancelled()) { return FileOpenCancelled; } else { return FileOpenFailed; } } // cerr << "mode = " << mode << endl; if (mode == AskUser) { if (getMainModel()) { QSettings settings; settings.beginGroup("MainWindow"); int lastMode = settings.value("lastaudioopenmode", 0).toBool(); settings.endGroup(); int imode = 0; QStringList items; items << tr("Close the current session and start a new one") << tr("Replace the main audio file in this session") << tr("Add the audio file to this session"); bool ok = false; QString item = ListInputDialog::getItem (this, tr("Select target for import"), tr("Select a target for import

    You already have an audio file loaded.
    What would you like to do with the new audio file?"), items, lastMode, &ok); if (!ok || item.isEmpty()) { delete newModel; m_openingAudioFile = false; return FileOpenCancelled; } for (int i = 0; i < items.size(); ++i) { if (item == items[i]) imode = i; } settings.beginGroup("MainWindow"); settings.setValue("lastaudioopenmode", imode); settings.endGroup(); mode = (AudioFileOpenMode)imode; } else { // no main model: make a new session mode = ReplaceSession; } } if (mode == ReplaceCurrentPane) { Pane *pane = m_paneStack->getCurrentPane(); if (pane) { if (getMainModel()) { View::ModelSet models(pane->getModels()); if (models.find(getMainModel()) != models.end()) { // Current pane contains main model: replace that mode = ReplaceMainModel; } // Otherwise the current pane has a non-default model, // which we will deal with later } else { // We have no main model, so start a new session with // optional template mode = ReplaceSession; } } else { // We seem to have no current pane! Oh well mode = CreateAdditionalModel; } } if (mode == CreateAdditionalModel && !getMainModel()) { SVDEBUG << "Mode is CreateAdditionalModel but we have no main model, switching to ReplaceSession mode" << endl; mode = ReplaceSession; } bool loadedTemplate = false; if (mode == ReplaceSession) { if (!checkSaveModified()) return FileOpenCancelled; SVDEBUG << "SV looking for template " << templateName << endl; if (templateName != "") { FileOpenStatus tplStatus = openSessionTemplate(templateName); if (tplStatus == FileOpenCancelled) { SVDEBUG << "Template load cancelled" << endl; return FileOpenCancelled; } if (tplStatus != FileOpenFailed) { SVDEBUG << "Template load succeeded" << endl; loadedTemplate = true; } } if (!loadedTemplate) { SVDEBUG << "No template found: closing session, creating new empty document" << endl; closeSession(); createDocument(); } SVDEBUG << "Now switching to ReplaceMainModel mode" << endl; mode = ReplaceMainModel; } emit activity(tr("Import audio file \"%1\"").arg(source.getLocation())); if (mode == ReplaceMainModel) { Model *prevMain = getMainModel(); if (prevMain) { m_playSource->removeModel(prevMain); PlayParameterRepository::getInstance()->removePlayable(prevMain); } PlayParameterRepository::getInstance()->addPlayable(newModel); SVDEBUG << "SV about to call setMainModel(" << newModel << "): prevMain is " << prevMain << endl; m_document->setMainModel(newModel); setupMenus(); if (loadedTemplate || (m_sessionFile == "")) { //!!! shouldn't be dealing directly with title from here -- call a method setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(source.getLocation())); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; } else { setWindowTitle(tr("%1: %2 [%3]") .arg(QApplication::applicationName()) .arg(QFileInfo(m_sessionFile).fileName()) .arg(source.getLocation())); if (m_documentModified) { m_documentModified = false; documentModified(); // so as to restore "(modified)" window title } } if (!source.isRemote()) m_audioFile = source.getLocalFilename(); } else if (mode == CreateAdditionalModel) { SVCERR << "Mode is CreateAdditionalModel" << endl; CommandHistory::getInstance()->startCompoundOperation (tr("Import \"%1\"").arg(source.getBasename()), true); m_document->addImportedModel(newModel); AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); if (m_timeRulerLayer) { SVCERR << "Have time ruler, adding it" << endl; m_document->addLayerToView(pane, m_timeRulerLayer); } else { SVCERR << "Do not have time ruler" << endl; } Layer *newLayer = m_document->createImportedLayer(newModel); if (newLayer) { m_document->addLayerToView(pane, newLayer); } CommandHistory::getInstance()->endCompoundOperation(); } else if (mode == ReplaceCurrentPane) { // We know there is a current pane, otherwise we would have // reset the mode to CreateAdditionalModel above; and we know // the current pane does not contain the main model, otherwise // we would have reset it to ReplaceMainModel. But we don't // know whether the pane contains a waveform model at all. Pane *pane = m_paneStack->getCurrentPane(); Layer *replace = 0; for (int i = 0; i < pane->getLayerCount(); ++i) { Layer *layer = pane->getLayer(i); if (dynamic_cast(layer)) { replace = layer; break; } } CommandHistory::getInstance()->startCompoundOperation (tr("Import \"%1\"").arg(source.getBasename()), true); m_document->addImportedModel(newModel); if (replace) { m_document->removeLayerFromView(pane, replace); } Layer *newLayer = m_document->createImportedLayer(newModel); if (newLayer) { m_document->addLayerToView(pane, newLayer); } CommandHistory::getInstance()->endCompoundOperation(); } updateMenuStates(); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { // for file dialog registerLastOpenedFilePath(FileFinder::AudioFile, source.getLocalFilename()); } m_openingAudioFile = false; currentPaneChanged(m_paneStack->getCurrentPane()); emit audioFileLoaded(); return FileOpenSucceeded; } MainWindowBase::FileOpenStatus MainWindowBase::openPlaylist(FileSource source, AudioFileOpenMode mode) { SVDEBUG << "MainWindowBase::openPlaylist(" << source.getLocation() << ")" << endl; std::set extensions; PlaylistFileReader::getSupportedExtensions(extensions); QString extension = source.getExtension().toLower(); if (extensions.find(extension) == extensions.end()) return FileOpenFailed; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); PlaylistFileReader reader(source.getLocalFilename()); if (!reader.isOK()) return FileOpenFailed; PlaylistFileReader::Playlist playlist = reader.load(); bool someSuccess = false; for (PlaylistFileReader::Playlist::const_iterator i = playlist.begin(); i != playlist.end(); ++i) { ProgressDialog dialog(tr("Opening playlist..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); FileOpenStatus status = openAudio(FileSource(*i, &dialog), mode); if (status == FileOpenCancelled) { return FileOpenCancelled; } if (status == FileOpenSucceeded) { someSuccess = true; mode = CreateAdditionalModel; } } if (someSuccess) return FileOpenSucceeded; else return FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openLayer(FileSource source) { SVDEBUG << "MainWindowBase::openLayer(" << source.getLocation() << ")" << endl; Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindowBase::openLayer: no current pane" << endl; return FileOpenWrongMode; } if (!getMainModel()) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindowBase::openLayer: No main model -- hence no default sample rate available" << endl; return FileOpenWrongMode; } if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); QString path = source.getLocalFilename(); RDFImporter::RDFDocumentType rdfType = RDFImporter::identifyDocumentType(QUrl::fromLocalFile(path).toString()); // cerr << "RDF type: (in layer) " << (int) rdfType << endl; if (rdfType != RDFImporter::NotRDF) { return openLayersFromRDF(source); } else if (source.getExtension().toLower() == "svl" || (source.getExtension().toLower() == "xml" && (SVFileReader::identifyXmlFile(source.getLocalFilename()) == SVFileReader::SVLayerFile))) { PaneCallback callback(this); QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { cerr << "ERROR: MainWindowBase::openLayer(" << source.getLocation() << "): Failed to open file for reading" << endl; return FileOpenFailed; } SVFileReader reader(m_document, callback, source.getLocation()); connect (&reader, SIGNAL(modelRegenerationFailed(QString, QString, QString)), this, SLOT(modelRegenerationFailed(QString, QString, QString))); connect (&reader, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); reader.setCurrentPane(pane); QXmlInputSource inputSource(&file); reader.parse(inputSource); if (!reader.isOK()) { cerr << "ERROR: MainWindowBase::openLayer(" << source.getLocation() << "): Failed to read XML file: " << reader.getErrorString() << endl; return FileOpenFailed; } emit activity(tr("Import layer XML file \"%1\"").arg(source.getLocation())); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { registerLastOpenedFilePath(FileFinder::LayerFile, path); // for file dialog } return FileOpenSucceeded; } else { try { MIDIFileImportDialog midiDlg(this); Model *model = DataFileReaderFactory::loadNonCSV (path, &midiDlg, getMainModel()->getSampleRate()); if (!model) { CSVFormat format(path); format.setSampleRate(getMainModel()->getSampleRate()); CSVFormatDialog *dialog = new CSVFormatDialog(this, format); if (dialog->exec() == QDialog::Accepted) { model = DataFileReaderFactory::loadCSV (path, dialog->getFormat(), getMainModel()->getSampleRate()); } } if (model) { SVDEBUG << "MainWindowBase::openLayer: Have model" << endl; emit activity(tr("Import MIDI file \"%1\"").arg(source.getLocation())); Layer *newLayer = m_document->createImportedLayer(model); if (newLayer) { m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { registerLastOpenedFilePath (FileFinder::LayerFile, path); // for file dialog } return FileOpenSucceeded; } } } catch (DataFileReaderFactory::Exception e) { if (e == DataFileReaderFactory::ImportCancelled) { return FileOpenCancelled; } } } return FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openImage(FileSource source) { SVDEBUG << "MainWindowBase::openImage(" << source.getLocation() << ")" << endl; Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindowBase::openImage: no current pane" << endl; return FileOpenWrongMode; } if (!m_document->getMainModel()) { return FileOpenWrongMode; } bool newLayer = false; ImageLayer *il = dynamic_cast(pane->getSelectedLayer()); if (!il) { for (int i = pane->getLayerCount()-1; i >= 0; --i) { il = dynamic_cast(pane->getLayer(i)); if (il) break; } } if (!il) { il = dynamic_cast (m_document->createEmptyLayer(LayerFactory::Image)); if (!il) return FileOpenFailed; newLayer = true; } // We don't put the image file in Recent Files cerr << "openImage: trying location \"" << source.getLocation() << "\" in image layer" << endl; if (!il->addImage(m_viewManager->getGlobalCentreFrame(), source.getLocation())) { if (newLayer) { m_document->deleteLayer(il); // also releases its model } return FileOpenFailed; } else { if (newLayer) { m_document->addLayerToView(pane, il); } m_paneStack->setCurrentLayer(pane, il); } return FileOpenSucceeded; } MainWindowBase::FileOpenStatus MainWindowBase::openDirOfAudio(QString dirPath) { QDir dir(dirPath); QStringList files = dir.entryList(QDir::Files | QDir::Readable); files.sort(); FileOpenStatus status = FileOpenFailed; bool first = true; bool cancelled = false; foreach (QString file, files) { FileSource source(dir.filePath(file)); if (!source.isAvailable()) { continue; } if (AudioFileReaderFactory::getKnownExtensions().contains (source.getExtension().toLower())) { AudioFileOpenMode mode = CreateAdditionalModel; if (first) mode = ReplaceSession; switch (openAudio(source, mode)) { case FileOpenSucceeded: status = FileOpenSucceeded; first = false; break; case FileOpenFailed: break; case FileOpenCancelled: cancelled = true; break; case FileOpenWrongMode: break; } } if (cancelled) break; } return status; } MainWindowBase::FileOpenStatus MainWindowBase::openSessionPath(QString fileOrUrl) { ProgressDialog dialog(tr("Opening session..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); return openSession(FileSource(fileOrUrl, &dialog)); } MainWindowBase::FileOpenStatus MainWindowBase::openSession(FileSource source) { SVDEBUG << "MainWindowBase::openSession(" << source.getLocation() << ")" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); QString sessionExt = InteractiveFileFinder::getInstance()->getApplicationSessionExtension(); if (source.getExtension().toLower() != sessionExt) { RDFImporter::RDFDocumentType rdfType = RDFImporter::identifyDocumentType (QUrl::fromLocalFile(source.getLocalFilename()).toString()); // cerr << "RDF type: " << (int)rdfType << endl; if (rdfType == RDFImporter::AudioRefAndAnnotations || rdfType == RDFImporter::AudioRef) { return openSessionFromRDF(source); } else if (rdfType != RDFImporter::NotRDF) { return FileOpenFailed; } if (source.getExtension().toLower() == "xml") { if (SVFileReader::identifyXmlFile(source.getLocalFilename()) == SVFileReader::SVSessionFile) { cerr << "This XML file looks like a session file, attempting to open it as a session" << endl; } else { return FileOpenFailed; } } else { return FileOpenFailed; } } QXmlInputSource *inputSource = 0; BZipFileDevice *bzFile = 0; QFile *rawFile = 0; if (source.getExtension().toLower() == sessionExt) { bzFile = new BZipFileDevice(source.getLocalFilename()); if (!bzFile->open(QIODevice::ReadOnly)) { delete bzFile; return FileOpenFailed; } inputSource = new QXmlInputSource(bzFile); } else { rawFile = new QFile(source.getLocalFilename()); inputSource = new QXmlInputSource(rawFile); } if (!checkSaveModified()) { if (bzFile) bzFile->close(); delete inputSource; delete bzFile; delete rawFile; return FileOpenCancelled; } QString error; closeSession(); createDocument(); PaneCallback callback(this); m_viewManager->clearSelections(); SVFileReader reader(m_document, callback, source.getLocation()); connect (&reader, SIGNAL(modelRegenerationFailed(QString, QString, QString)), this, SLOT(modelRegenerationFailed(QString, QString, QString))); connect (&reader, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); reader.parse(*inputSource); if (!reader.isOK()) { error = tr("SV XML file read error:\n%1").arg(reader.getErrorString()); } if (bzFile) bzFile->close(); delete inputSource; delete bzFile; delete rawFile; bool ok = (error == ""); if (ok) { emit activity(tr("Import session file \"%1\"").arg(source.getLocation())); setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(source.getLocation())); if (!source.isRemote()) m_sessionFile = source.getLocalFilename(); setupMenus(); findTimeRulerLayer(); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; updateMenuStates(); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { // for file dialog registerLastOpenedFilePath(FileFinder::SessionFile, source.getLocalFilename()); } emit sessionLoaded(); } else { setWindowTitle(QApplication::applicationName()); } return ok ? FileOpenSucceeded : FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openSessionTemplate(QString templateName) { // Template in the user's template directory takes // priority over a bundled one; we don't unbundle, but // open directly from the bundled file (where applicable) ResourceFinder rf; QString tfile = rf.getResourcePath("templates", templateName + ".svt"); if (tfile != "") { cerr << "SV loading template file " << tfile << endl; return openSessionTemplate(FileSource("file:" + tfile)); } else { return FileOpenFailed; } } MainWindowBase::FileOpenStatus MainWindowBase::openSessionTemplate(FileSource source) { cerr << "MainWindowBase::openSessionTemplate(" << source.getLocation() << ")" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); QXmlInputSource *inputSource = 0; QFile *file = 0; file = new QFile(source.getLocalFilename()); inputSource = new QXmlInputSource(file); if (!checkSaveModified()) { delete inputSource; delete file; return FileOpenCancelled; } QString error; closeSession(); createDocument(); PaneCallback callback(this); m_viewManager->clearSelections(); SVFileReader reader(m_document, callback, source.getLocation()); connect (&reader, SIGNAL(modelRegenerationFailed(QString, QString, QString)), this, SLOT(modelRegenerationFailed(QString, QString, QString))); connect (&reader, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); reader.parse(*inputSource); if (!reader.isOK()) { error = tr("SV XML file read error:\n%1").arg(reader.getErrorString()); } delete inputSource; delete file; bool ok = (error == ""); setWindowTitle(QApplication::applicationName()); if (ok) { emit activity(tr("Open session template \"%1\"").arg(source.getLocation())); setupMenus(); findTimeRulerLayer(); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; updateMenuStates(); emit sessionLoaded(); } return ok ? FileOpenSucceeded : FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openSessionFromRDF(FileSource source) { SVDEBUG << "MainWindowBase::openSessionFromRDF(" << source.getLocation() << ")" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); if (!checkSaveModified()) { return FileOpenCancelled; } closeSession(); createDocument(); FileOpenStatus status = openLayersFromRDF(source); setupMenus(); findTimeRulerLayer(); setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(source.getLocation())); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; emit sessionLoaded(); return status; } MainWindowBase::FileOpenStatus MainWindowBase::openLayersFromRDF(FileSource source) { sv_samplerate_t rate = 0; SVDEBUG << "MainWindowBase::openLayersFromRDF" << endl; ProgressDialog dialog(tr("Importing from RDF..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); if (getMainModel()) { rate = getMainModel()->getSampleRate(); } else if (Preferences::getInstance()->getResampleOnLoad()) { if (getMainModel()) { rate = getMainModel()->getSampleRate(); } } RDFImporter importer (QUrl::fromLocalFile(source.getLocalFilename()).toString(), rate); if (!importer.isOK()) { if (importer.getErrorString() != "") { QMessageBox::critical (this, tr("Failed to import RDF"), tr("Failed to import RDF

    Importing data from RDF document at \"%1\" failed: %2

    ") .arg(source.getLocation()).arg(importer.getErrorString())); } return FileOpenFailed; } std::vector models = importer.getDataModels(&dialog); dialog.setMessage(tr("Importing from RDF...")); if (models.empty()) { QMessageBox::critical (this, tr("Failed to import RDF"), tr("Failed to import RDF

    No suitable data models found for import from RDF document at \"%1\"

    ").arg(source.getLocation())); return FileOpenFailed; } emit activity(tr("Import RDF document \"%1\"").arg(source.getLocation())); std::set added; for (int i = 0; i < (int)models.size(); ++i) { Model *m = models[i]; WaveFileModel *w = dynamic_cast(m); if (w) { Pane *pane = addPaneToStack(); Layer *layer = 0; if (m_timeRulerLayer) { m_document->addLayerToView(pane, m_timeRulerLayer); } if (!getMainModel()) { m_document->setMainModel(w); layer = m_document->createMainModelLayer(LayerFactory::Waveform); } else { layer = m_document->createImportedLayer(w); } m_document->addLayerToView(pane, layer); added.insert(w); for (int j = 0; j < (int)models.size(); ++j) { Model *dm = models[j]; if (dm == m) continue; if (dm->getSourceModel() != m) continue; layer = m_document->createImportedLayer(dm); if (layer->isLayerOpaque() || dynamic_cast(layer)) { // these always go in a new pane, with nothing // else going in the same pane Pane *singleLayerPane = addPaneToStack(); if (m_timeRulerLayer) { m_document->addLayerToView(singleLayerPane, m_timeRulerLayer); } m_document->addLayerToView(singleLayerPane, layer); } else if (layer->getLayerColourSignificance() == Layer::ColourHasMeaningfulValue) { // these can go in a pane with something else, but // only if none of the something elses also have // this quality bool needNewPane = false; for (int i = 0; i < pane->getLayerCount(); ++i) { Layer *otherLayer = pane->getLayer(i); if (otherLayer && (otherLayer->getLayerColourSignificance() == Layer::ColourHasMeaningfulValue)) { needNewPane = true; break; } } if (needNewPane) { pane = addPaneToStack(); } m_document->addLayerToView(pane, layer); } else { if (pane->getLayerCount() > 4) { pane = addPaneToStack(); } m_document->addLayerToView(pane, layer); } added.insert(dm); } } } for (int i = 0; i < (int)models.size(); ++i) { Model *m = models[i]; if (added.find(m) == added.end()) { Layer *layer = m_document->createImportedLayer(m); if (!layer) return FileOpenFailed; Pane *singleLayerPane = addPaneToStack(); if (m_timeRulerLayer) { m_document->addLayerToView(singleLayerPane, m_timeRulerLayer); } m_document->addLayerToView(singleLayerPane, layer); } } m_recentFiles.addFile(source.getLocation()); return FileOpenSucceeded; } class AudioLogCallback : public breakfastquay::AudioFactory::LogCallback { public: void log(std::string message) const override { SVDEBUG << message << endl; } }; void MainWindowBase::createAudioIO() { if (m_playTarget || m_audioIO) return; static AudioLogCallback audioLogCallback; breakfastquay::AudioFactory::setLogCallback(&audioLogCallback); if (!(m_soundOptions & WithAudioOutput)) return; QSettings settings; settings.beginGroup("Preferences"); QString implementation = settings.value ("audio-target", "").toString(); QString suffix; if (implementation != "") suffix = "-" + implementation; QString recordDevice = settings.value ("audio-record-device" + suffix, "").toString(); QString playbackDevice = settings.value ("audio-playback-device" + suffix, "").toString(); settings.endGroup(); if (implementation == "auto") { implementation = ""; } breakfastquay::AudioFactory::Preference preference; preference.implementation = implementation.toStdString(); preference.recordDevice = recordDevice.toStdString(); preference.playbackDevice = playbackDevice.toStdString(); SVCERR << "createAudioIO: Preferred implementation = \"" << preference.implementation << "\"" << endl; SVCERR << "createAudioIO: Preferred playback device = \"" << preference.playbackDevice << "\"" << endl; SVCERR << "createAudioIO: Preferred record device = \"" << preference.recordDevice << "\"" << endl; if (!m_resamplerWrapper) { m_resamplerWrapper = new breakfastquay::ResamplerWrapper(m_playSource); m_playSource->setResamplerWrapper(m_resamplerWrapper); } std::string errorString; if (m_soundOptions & WithAudioInput) { m_audioIO = breakfastquay::AudioFactory:: createCallbackIO(m_recordTarget, m_resamplerWrapper, preference, errorString); if (m_audioIO) { m_audioIO->suspend(); // start in suspended state m_playSource->setSystemPlaybackTarget(m_audioIO); } else { // Failed to create audio I/O; this may just mean there is // no record device, so fall through to see what happens // next. We only report complete failure if we end up with // neither m_audioIO nor m_playTarget. } } if (!m_audioIO) { m_playTarget = breakfastquay::AudioFactory:: createCallbackPlayTarget(m_resamplerWrapper, preference, errorString); if (m_playTarget) { m_playTarget->suspend(); // start in suspended state m_playSource->setSystemPlaybackTarget(m_playTarget); } } if (!m_playTarget && !m_audioIO) { emit hideSplash(); QString message; QString error = errorString.c_str(); QString firstBit, secondBit; if (implementation == "") { if (error == "") { firstBit = tr("No audio available

    Could not open an audio device.

    "); } else { firstBit = tr("No audio available

    Could not open audio device: %1

    ").arg(error); } if (m_soundOptions & WithAudioInput) { secondBit = tr("

    Automatic audio device detection failed. Audio playback and recording will not be available during this session.

    "); } else { secondBit = tr("

    Automatic audio device detection failed. Audio playback will not be available during this session.

    "); } } else { QString driverName = breakfastquay::AudioFactory:: getImplementationDescription(implementation.toStdString()) .c_str(); if (error == "") { firstBit = tr("No audio available

    Failed to open your preferred audio driver (\"%1\").

    ").arg(driverName); } else { firstBit = tr("No audio available

    Failed to open your preferred audio driver (\"%1\"): %2.

    ").arg(driverName).arg(error); } if (m_soundOptions & WithAudioInput) { secondBit = tr("

    Audio playback and recording will not be available during this session.

    "); } else { secondBit = tr("

    Audio playback will not be available during this session.

    "); } } SVDEBUG << "createAudioIO: ERROR: Failed to open audio device \"" << implementation << "\": error is: " << error << endl; QMessageBox::warning(this, tr("Couldn't open audio device"), firstBit + secondBit, QMessageBox::Ok); } } void MainWindowBase::deleteAudioIO() { // First prevent this trying to call target. if (m_playSource) { m_playSource->setSystemPlaybackTarget(0); m_playSource->setResamplerWrapper(0); } // Then delete the breakfastquay::System object. // Only one of these two exists! delete m_audioIO; delete m_playTarget; // And the breakfastquay resampler wrapper. We need to // delete/recreate this if the channel count changes, which is one // of the use cases for recreateAudioIO() calling this delete m_resamplerWrapper; m_audioIO = 0; m_playTarget = 0; m_resamplerWrapper = 0; } void MainWindowBase::recreateAudioIO() { deleteAudioIO(); createAudioIO(); } void MainWindowBase::audioChannelCountIncreased(int) { recreateAudioIO(); } WaveFileModel * MainWindowBase::getMainModel() { if (!m_document) return 0; return m_document->getMainModel(); } const WaveFileModel * MainWindowBase::getMainModel() const { if (!m_document) return 0; return m_document->getMainModel(); } void MainWindowBase::createDocument() { m_document = new Document; connect(m_document, SIGNAL(layerAdded(Layer *)), this, SLOT(layerAdded(Layer *))); connect(m_document, SIGNAL(layerRemoved(Layer *)), this, SLOT(layerRemoved(Layer *))); connect(m_document, SIGNAL(layerAboutToBeDeleted(Layer *)), this, SLOT(layerAboutToBeDeleted(Layer *))); connect(m_document, SIGNAL(layerInAView(Layer *, bool)), this, SLOT(layerInAView(Layer *, bool))); connect(m_document, SIGNAL(modelAdded(Model *)), this, SLOT(modelAdded(Model *))); connect(m_document, SIGNAL(mainModelChanged(WaveFileModel *)), this, SLOT(mainModelChanged(WaveFileModel *))); connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), this, SLOT(modelAboutToBeDeleted(Model *))); connect(m_document, SIGNAL(modelGenerationFailed(QString, QString)), this, SLOT(modelGenerationFailed(QString, QString))); connect(m_document, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); connect(m_document, SIGNAL(alignmentComplete(AlignmentModel *)), this, SLOT(alignmentComplete(AlignmentModel *))); connect(m_document, SIGNAL(alignmentFailed(QString)), this, SLOT(alignmentFailed(QString))); emit replacedDocument(); } bool MainWindowBase::saveSessionFile(QString path) { try { TempWriteFile temp(path); BZipFileDevice bzFile(temp.getTemporaryFilename()); if (!bzFile.open(QIODevice::WriteOnly)) { cerr << "Failed to open session file \"" << temp.getTemporaryFilename() << "\" for writing: " << bzFile.errorString() << endl; return false; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QTextStream out(&bzFile); out.setCodec(QTextCodec::codecForName("UTF-8")); toXml(out, false); out.flush(); QApplication::restoreOverrideCursor(); if (!bzFile.isOK()) { QMessageBox::critical(this, tr("Failed to write file"), tr("Save failed

    Failed to write to file \"%1\": %2") .arg(path).arg(bzFile.errorString())); bzFile.close(); return false; } bzFile.close(); temp.moveToTarget(); return true; } catch (FileOperationFailed &f) { QMessageBox::critical(this, tr("Failed to write file"), tr("Save failed

    Failed to write to file \"%1\": %2") .arg(path).arg(f.what())); return false; } } bool MainWindowBase::saveSessionTemplate(QString path) { try { TempWriteFile temp(path); QFile file(temp.getTemporaryFilename()); if (!file.open(QIODevice::WriteOnly)) { cerr << "Failed to open session template file \"" << temp.getTemporaryFilename() << "\" for writing: " << file.errorString() << endl; return false; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QTextStream out(&file); out.setCodec(QTextCodec::codecForName("UTF-8")); toXml(out, true); out.flush(); QApplication::restoreOverrideCursor(); file.close(); temp.moveToTarget(); return true; } catch (FileOperationFailed &f) { QMessageBox::critical(this, tr("Failed to write file"), tr("Save failed

    Failed to write to file \"%1\": %2") .arg(path).arg(f.what())); return false; } } void MainWindowBase::toXml(QTextStream &out, bool asTemplate) { QString indent(" "); out << "\n"; out << "\n"; out << "\n"; if (asTemplate) { m_document->toXmlAsTemplate(out, "", ""); } else { m_document->toXml(out, "", ""); } out << "\n"; out << QString(" \n") .arg(width()).arg(height()); for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (pane) { pane->toXml(out, indent); } } out << "\n"; m_viewManager->getSelection().toXml(out); out << "\n"; } Pane * MainWindowBase::addPaneToStack() { cerr << "MainWindowBase::addPaneToStack()" << endl; AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); return pane; } void MainWindowBase::zoomIn() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->zoom(true); } void MainWindowBase::zoomOut() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->zoom(false); } void MainWindowBase::zoomToFit() { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Model *model = getMainModel(); if (!model) return; sv_frame_t start = model->getStartFrame(); sv_frame_t end = model->getEndFrame(); if (m_playSource) end = std::max(end, m_playSource->getPlayEndFrame()); int pixels = currentPane->width(); int sw = currentPane->getVerticalScaleWidth(); if (pixels > sw * 2) pixels -= sw * 2; else pixels = 1; if (pixels > 4) pixels -= 4; int zoomLevel = int((end - start) / pixels); if (zoomLevel < 1) zoomLevel = 1; currentPane->setZoomLevel(zoomLevel); currentPane->setCentreFrame((start + end) / 2); } void MainWindowBase::zoomDefault() { Pane *currentPane = m_paneStack->getCurrentPane(); QSettings settings; settings.beginGroup("MainWindow"); int zoom = settings.value("zoom-default", 1024).toInt(); settings.endGroup(); if (currentPane) currentPane->setZoomLevel(zoom); } void MainWindowBase::scrollLeft() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(false, false); } void MainWindowBase::jumpLeft() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(false, true); } void MainWindowBase::peekLeft() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(false, false, false); } void MainWindowBase::scrollRight() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(true, false); } void MainWindowBase::jumpRight() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(true, true); } void MainWindowBase::peekRight() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(true, false, false); } void MainWindowBase::showNoOverlays() { m_viewManager->setOverlayMode(ViewManager::NoOverlays); } void MainWindowBase::showMinimalOverlays() { m_viewManager->setOverlayMode(ViewManager::StandardOverlays); } void MainWindowBase::showAllOverlays() { m_viewManager->setOverlayMode(ViewManager::AllOverlays); } void MainWindowBase::findTimeRulerLayer() { for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!dynamic_cast(layer)) continue; m_timeRulerLayer = layer; return; } } if (m_timeRulerLayer) { SVCERR << "WARNING: Time ruler layer was not reset to 0 before session template loaded?" << endl; delete m_timeRulerLayer; m_timeRulerLayer = 0; } } void MainWindowBase::toggleTimeRulers() { bool haveRulers = false; bool someHidden = false; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!dynamic_cast(layer)) continue; haveRulers = true; if (layer->isLayerDormant(pane)) someHidden = true; } } if (haveRulers) { bool show = someHidden; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!dynamic_cast(layer)) continue; layer->showLayer(pane, show); } } } } void MainWindowBase::toggleZoomWheels() { if (m_viewManager->getZoomWheelsEnabled()) { m_viewManager->setZoomWheelsEnabled(false); } else { m_viewManager->setZoomWheelsEnabled(true); } } void MainWindowBase::togglePropertyBoxes() { if (m_paneStack->getLayoutStyle() == PaneStack::NoPropertyStacks) { if (Preferences::getInstance()->getPropertyBoxLayout() == Preferences::VerticallyStacked) { m_paneStack->setLayoutStyle(PaneStack::PropertyStackPerPaneLayout); } else { m_paneStack->setLayoutStyle(PaneStack::SinglePropertyStackLayout); } } else { m_paneStack->setLayoutStyle(PaneStack::NoPropertyStacks); } } QLabel * MainWindowBase::getStatusLabel() const { if (!m_statusLabel) { m_statusLabel = new QLabel(); statusBar()->addWidget(m_statusLabel, 1); } QList frames = statusBar()->findChildren(); foreach (QFrame *f, frames) { f->setFrameStyle(QFrame::NoFrame); } return m_statusLabel; } void MainWindowBase::toggleStatusBar() { QSettings settings; settings.beginGroup("MainWindow"); bool sb = settings.value("showstatusbar", true).toBool(); if (sb) { statusBar()->hide(); } else { statusBar()->show(); } settings.setValue("showstatusbar", !sb); settings.endGroup(); } void MainWindowBase::toggleCentreLine() { if (m_viewManager->shouldShowCentreLine()) { m_viewManager->setShowCentreLine(false); } else { m_viewManager->setShowCentreLine(true); } } void MainWindowBase::preferenceChanged(PropertyContainer::PropertyName name) { if (name == "Property Box Layout") { if (m_paneStack->getLayoutStyle() != PaneStack::NoPropertyStacks) { if (Preferences::getInstance()->getPropertyBoxLayout() == Preferences::VerticallyStacked) { m_paneStack->setLayoutStyle(PaneStack::PropertyStackPerPaneLayout); } else { m_paneStack->setLayoutStyle(PaneStack::SinglePropertyStackLayout); } } } else if (name == "Background Mode" && m_viewManager) { Preferences::BackgroundMode mode = Preferences::getInstance()->getBackgroundMode(); if (mode == Preferences::BackgroundFromTheme) { m_viewManager->setGlobalDarkBackground(m_initialDarkBackground); } else if (mode == Preferences::DarkBackground) { m_viewManager->setGlobalDarkBackground(true); } else { m_viewManager->setGlobalDarkBackground(false); } } } void MainWindowBase::play() { if ((m_recordTarget && m_recordTarget->isRecording()) || (m_playSource && m_playSource->isPlaying())) { stop(); QAction *action = qobject_cast(sender()); if (action) action->setChecked(false); } else { if (m_audioIO) m_audioIO->resume(); else if (m_playTarget) m_playTarget->resume(); playbackFrameChanged(m_viewManager->getPlaybackFrame()); m_playSource->play(m_viewManager->getPlaybackFrame()); } } void MainWindowBase::record() { QAction *action = qobject_cast(sender()); if (!(m_soundOptions & WithAudioInput)) { if (action) action->setChecked(false); return; } if (!m_recordTarget) { if (action) action->setChecked(false); return; } if (!m_audioIO) { cerr << "MainWindowBase::record: about to create audio IO" << endl; createAudioIO(); } if (!m_audioIO) { if (!m_playTarget) { // Don't need to report this, createAudioIO should have if (action) action->setChecked(false); return; } else { // Need to report this: if the play target exists instead // of the audio IO, then that means we failed to open a // capture device. The record control should be disabled // in that situation, so if it happens here, that must // mean this is the first time we ever tried to open the // audio device, hence the need to report the problem here QMessageBox::critical (this, tr("No record device available"), tr("No record device available

    Failed to find or open an audio device for recording. Only playback will be available.

    ")); if (action) action->setChecked(false); updateMenuStates(); return; } } if (m_recordTarget->isRecording()) { stop(); return; } if (m_audioRecordMode == RecordReplaceSession) { if (!checkSaveModified()) { if (action) action->setChecked(false); return; } } if (m_viewManager) m_viewManager->setGlobalCentreFrame(0); SVDEBUG << "MainWindowBase::record: about to resume" << endl; m_audioIO->resume(); WritableWaveFileModel *model = m_recordTarget->startRecording(); if (!model) { SVCERR << "ERROR: MainWindowBase::record: Recording failed" << endl; QMessageBox::critical (this, tr("Recording failed"), tr("Recording failed

    Failed to switch to record mode (some internal problem?)

    ")); if (action) action->setChecked(false); return; } if (!model->isOK()) { m_recordTarget->stopRecording(); m_audioIO->suspend(); if (action) action->setChecked(false); delete model; return; } PlayParameterRepository::getInstance()->addPlayable(model); if (m_audioRecordMode == RecordReplaceSession || !getMainModel()) { //!!! duplication with openAudio here QString templateName = getDefaultSessionTemplate(); bool loadedTemplate = false; if (templateName != "") { FileOpenStatus tplStatus = openSessionTemplate(templateName); if (tplStatus == FileOpenCancelled) { m_recordTarget->stopRecording(); m_audioIO->suspend(); PlayParameterRepository::getInstance()->removePlayable(model); return; } if (tplStatus != FileOpenFailed) { loadedTemplate = true; } } if (!loadedTemplate) { closeSession(); createDocument(); } Model *prevMain = getMainModel(); if (prevMain) { m_playSource->removeModel(prevMain); PlayParameterRepository::getInstance()->removePlayable(prevMain); } m_document->setMainModel(model); setupMenus(); findTimeRulerLayer(); if (loadedTemplate || (m_sessionFile == "")) { //!!! shouldn't be dealing directly with title from here -- call a method setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(model->getLocation())); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; } else { setWindowTitle(tr("%1: %2 [%3]") .arg(QApplication::applicationName()) .arg(QFileInfo(m_sessionFile).fileName()) .arg(model->getLocation())); if (m_documentModified) { m_documentModified = false; documentModified(); // so as to restore "(modified)" window title } } } else { CommandHistory::getInstance()->startCompoundOperation (tr("Import Recorded Audio"), true); m_document->addImportedModel(model); AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); if (m_timeRulerLayer) { m_document->addLayerToView(pane, m_timeRulerLayer); } Layer *newLayer = m_document->createImportedLayer(model); if (newLayer) { m_document->addLayerToView(pane, newLayer); } CommandHistory::getInstance()->endCompoundOperation(); } updateMenuStates(); m_recentFiles.addFile(model->getLocation()); currentPaneChanged(m_paneStack->getCurrentPane()); emit audioFileLoaded(); } void MainWindowBase::ffwd() { if (!getMainModel()) return; sv_frame_t frame = m_viewManager->getPlaybackFrame(); ++frame; Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = getSnapLayer(); sv_samplerate_t sr = getMainModel()->getSampleRate(); if (!layer) { frame = RealTime::realTime2Frame (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep, sr); if (frame > getMainModel()->getEndFrame()) { frame = getMainModel()->getEndFrame(); } } else { int resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapRight)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getEndFrame(); } } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); if (frame == getMainModel()->getEndFrame() && m_playSource && m_playSource->isPlaying() && !m_viewManager->getPlayLoopMode()) { stop(); } } void MainWindowBase::ffwdEnd() { if (!getMainModel()) return; if (m_playSource && m_playSource->isPlaying() && !m_viewManager->getPlayLoopMode()) { stop(); } sv_frame_t frame = getMainModel()->getEndFrame(); if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); } void MainWindowBase::ffwdSimilar() { if (!getMainModel()) return; Layer *layer = getSnapLayer(); if (!layer) { ffwd(); return; } Pane *pane = m_paneStack->getCurrentPane(); sv_frame_t frame = m_viewManager->getPlaybackFrame(); int resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapRight)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getEndFrame(); } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); if (frame == getMainModel()->getEndFrame() && m_playSource && m_playSource->isPlaying() && !m_viewManager->getPlayLoopMode()) { stop(); } } void MainWindowBase::rewind() { if (!getMainModel()) return; sv_frame_t frame = m_viewManager->getPlaybackFrame(); if (frame > 0) --frame; Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = getSnapLayer(); sv_samplerate_t sr = getMainModel()->getSampleRate(); // when rewinding during playback, we want to allow a period // following a rewind target point at which the rewind will go to // the prior point instead of the immediately neighbouring one if (m_playSource && m_playSource->isPlaying()) { RealTime ct = RealTime::frame2RealTime(frame, sr); ct = ct - RealTime::fromSeconds(0.15); if (ct < RealTime::zeroTime) ct = RealTime::zeroTime; frame = RealTime::realTime2Frame(ct, sr); } if (!layer) { frame = RealTime::realTime2Frame (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr); if (frame < getMainModel()->getStartFrame()) { frame = getMainModel()->getStartFrame(); } } else { int resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapLeft)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getStartFrame(); } } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); } void MainWindowBase::rewindStart() { if (!getMainModel()) return; sv_frame_t frame = getMainModel()->getStartFrame(); if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); } void MainWindowBase::rewindSimilar() { if (!getMainModel()) return; Layer *layer = getSnapLayer(); if (!layer) { rewind(); return; } Pane *pane = m_paneStack->getCurrentPane(); sv_frame_t frame = m_viewManager->getPlaybackFrame(); int resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapLeft)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getStartFrame(); } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); } Layer * MainWindowBase::getSnapLayer() const { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return 0; Layer *layer = pane->getSelectedLayer(); if (!dynamic_cast(layer) && !dynamic_cast(layer) && !dynamic_cast(layer) && !dynamic_cast(layer)) { layer = 0; for (int i = pane->getLayerCount(); i > 0; --i) { Layer *l = pane->getLayer(i-1); if (dynamic_cast(l)) { layer = l; break; } } } return layer; } void MainWindowBase::stop() { if (m_recordTarget && m_recordTarget->isRecording()) { m_recordTarget->stopRecording(); } if (!m_playSource) return; m_playSource->stop(); if (m_audioIO) m_audioIO->suspend(); else if (m_playTarget) m_playTarget->suspend(); if (m_paneStack && m_paneStack->getCurrentPane()) { updateVisibleRangeDisplay(m_paneStack->getCurrentPane()); } else { m_myStatusMessage = ""; getStatusLabel()->setText(""); } } MainWindowBase::AddPaneCommand::AddPaneCommand(MainWindowBase *mw) : m_mw(mw), m_pane(0), m_prevCurrentPane(0), m_added(false) { } MainWindowBase::AddPaneCommand::~AddPaneCommand() { if (m_pane && !m_added) { m_mw->m_paneStack->deletePane(m_pane); } } QString MainWindowBase::AddPaneCommand::getName() const { return tr("Add Pane"); } void MainWindowBase::AddPaneCommand::execute() { if (!m_pane) { m_prevCurrentPane = m_mw->m_paneStack->getCurrentPane(); m_pane = m_mw->m_paneStack->addPane(); connect(m_pane, SIGNAL(contextHelpChanged(const QString &)), m_mw, SLOT(contextHelpChanged(const QString &))); } else { m_mw->m_paneStack->showPane(m_pane); } m_mw->m_paneStack->setCurrentPane(m_pane); m_added = true; } void MainWindowBase::AddPaneCommand::unexecute() { m_mw->m_paneStack->hidePane(m_pane); m_mw->m_paneStack->setCurrentPane(m_prevCurrentPane); m_added = false; } MainWindowBase::RemovePaneCommand::RemovePaneCommand(MainWindowBase *mw, Pane *pane) : m_mw(mw), m_pane(pane), m_prevCurrentPane(0), m_added(true) { } MainWindowBase::RemovePaneCommand::~RemovePaneCommand() { if (m_pane && !m_added) { m_mw->m_paneStack->deletePane(m_pane); } } QString MainWindowBase::RemovePaneCommand::getName() const { return tr("Remove Pane"); } void MainWindowBase::RemovePaneCommand::execute() { m_prevCurrentPane = m_mw->m_paneStack->getCurrentPane(); m_mw->m_paneStack->hidePane(m_pane); m_added = false; } void MainWindowBase::RemovePaneCommand::unexecute() { m_mw->m_paneStack->showPane(m_pane); m_mw->m_paneStack->setCurrentPane(m_prevCurrentPane); m_added = true; } void MainWindowBase::deleteCurrentPane() { CommandHistory::getInstance()->startCompoundOperation (tr("Delete Pane"), true); Pane *pane = m_paneStack->getCurrentPane(); if (pane) { while (pane->getLayerCount() > 0) { Layer *layer = pane->getLayer(0); if (layer) { m_document->removeLayerFromView(pane, layer); } else { break; } } RemovePaneCommand *command = new RemovePaneCommand(this, pane); CommandHistory::getInstance()->addCommand(command); } CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); } void MainWindowBase::deleteCurrentLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (pane) { Layer *layer = pane->getSelectedLayer(); if (layer) { m_document->removeLayerFromView(pane, layer); } } updateMenuStates(); } void MainWindowBase::editCurrentLayer() { Layer *layer = 0; Pane *pane = m_paneStack->getCurrentPane(); if (pane) layer = pane->getSelectedLayer(); if (!layer) return; Model *model = layer->getModel(); if (!model) return; TabularModel *tabular = dynamic_cast(model); if (!tabular) { //!!! how to prevent this function from being active if not //appropriate model type? or will we ultimately support //tabular display for all editable models? SVDEBUG << "NOTE: Not a tabular model" << endl; return; } if (m_layerDataDialogMap.find(layer) != m_layerDataDialogMap.end()) { if (!m_layerDataDialogMap[layer].isNull()) { m_layerDataDialogMap[layer]->show(); m_layerDataDialogMap[layer]->raise(); return; } } QString title = layer->getLayerPresentationName(); ModelDataTableDialog *dialog = new ModelDataTableDialog(tabular, title, this); dialog->setAttribute(Qt::WA_DeleteOnClose); connectLayerEditDialog(dialog); m_layerDataDialogMap[layer] = dialog; m_viewDataDialogMap[pane].insert(dialog); dialog->show(); } void MainWindowBase::connectLayerEditDialog(ModelDataTableDialog *dialog) { connect(m_viewManager, SIGNAL(globalCentreFrameChanged(sv_frame_t)), dialog, SLOT(userScrolledToFrame(sv_frame_t))); connect(m_viewManager, SIGNAL(playbackFrameChanged(sv_frame_t)), dialog, SLOT(playbackScrolledToFrame(sv_frame_t))); connect(dialog, SIGNAL(scrollToFrame(sv_frame_t)), m_viewManager, SLOT(setGlobalCentreFrame(sv_frame_t))); connect(dialog, SIGNAL(scrollToFrame(sv_frame_t)), m_viewManager, SLOT(setPlaybackFrame(sv_frame_t))); } void MainWindowBase::previousPane() { if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == currentPane) { if (i == 0) return; m_paneStack->setCurrentPane(m_paneStack->getPane(i-1)); updateMenuStates(); return; } } } void MainWindowBase::nextPane() { if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == currentPane) { if (i == m_paneStack->getPaneCount()-1) return; m_paneStack->setCurrentPane(m_paneStack->getPane(i+1)); updateMenuStates(); return; } } } void MainWindowBase::previousLayer() { if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; int count = currentPane->getLayerCount(); if (count == 0) return; Layer *currentLayer = currentPane->getSelectedLayer(); if (!currentLayer) { // The pane itself is current m_paneStack->setCurrentLayer (currentPane, currentPane->getFixedOrderLayer(count-1)); } else { for (int i = 0; i < count; ++i) { if (currentPane->getFixedOrderLayer(i) == currentLayer) { if (i == 0) { m_paneStack->setCurrentLayer (currentPane, 0); // pane } else { m_paneStack->setCurrentLayer (currentPane, currentPane->getFixedOrderLayer(i-1)); } break; } } } updateMenuStates(); } void MainWindowBase::nextLayer() { if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; int count = currentPane->getLayerCount(); if (count == 0) return; Layer *currentLayer = currentPane->getSelectedLayer(); if (!currentLayer) { // The pane itself is current m_paneStack->setCurrentLayer (currentPane, currentPane->getFixedOrderLayer(0)); } else { for (int i = 0; i < count; ++i) { if (currentPane->getFixedOrderLayer(i) == currentLayer) { if (i == currentPane->getLayerCount()-1) { m_paneStack->setCurrentLayer (currentPane, 0); // pane } else { m_paneStack->setCurrentLayer (currentPane, currentPane->getFixedOrderLayer(i+1)); } break; } } } updateMenuStates(); } void MainWindowBase::playbackFrameChanged(sv_frame_t frame) { if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; updatePositionStatusDisplays(); RealTime now = RealTime::frame2RealTime (frame, getMainModel()->getSampleRate()); if (now.sec == m_lastPlayStatusSec) return; RealTime then = RealTime::frame2RealTime (m_playSource->getPlayEndFrame(), getMainModel()->getSampleRate()); QString nowStr; QString thenStr; QString remainingStr; if (then.sec > 10) { nowStr = now.toSecText().c_str(); thenStr = then.toSecText().c_str(); remainingStr = (then - now).toSecText().c_str(); m_lastPlayStatusSec = now.sec; } else { nowStr = now.toText(true).c_str(); thenStr = then.toText(true).c_str(); remainingStr = (then - now).toText(true).c_str(); } m_myStatusMessage = tr("Playing: %1 of %2 (%3 remaining)") .arg(nowStr).arg(thenStr).arg(remainingStr); getStatusLabel()->setText(m_myStatusMessage); } void MainWindowBase::recordDurationChanged(sv_frame_t frame, sv_samplerate_t rate) { RealTime duration = RealTime::frame2RealTime(frame, rate); QString durStr = duration.toSecText().c_str(); m_myStatusMessage = tr("Recording: %1").arg(durStr); getStatusLabel()->setText(m_myStatusMessage); } void MainWindowBase::globalCentreFrameChanged(sv_frame_t ) { if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; Pane *p = 0; if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; if (!p->getFollowGlobalPan()) return; updateVisibleRangeDisplay(p); } void MainWindowBase::viewCentreFrameChanged(View *v, sv_frame_t frame) { // SVDEBUG << "MainWindowBase::viewCentreFrameChanged(" << v << "," << frame << ")" << endl; if (m_viewDataDialogMap.find(v) != m_viewDataDialogMap.end()) { for (DataDialogSet::iterator i = m_viewDataDialogMap[v].begin(); i != m_viewDataDialogMap[v].end(); ++i) { (*i)->userScrolledToFrame(frame); } } if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; Pane *p = 0; if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; if (v == p) updateVisibleRangeDisplay(p); } void MainWindowBase::viewZoomLevelChanged(View *v, int , bool ) { if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; Pane *p = 0; if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; if (v == p) updateVisibleRangeDisplay(p); } void MainWindowBase::layerAdded(Layer *) { // SVDEBUG << "MainWindowBase::layerAdded(" << layer << ")" << endl; updateMenuStates(); } void MainWindowBase::layerRemoved(Layer *) { // SVDEBUG << "MainWindowBase::layerRemoved(" << layer << ")" << endl; updateMenuStates(); } void MainWindowBase::layerAboutToBeDeleted(Layer *layer) { // SVDEBUG << "MainWindowBase::layerAboutToBeDeleted(" << layer << ")" << endl; removeLayerEditDialog(layer); if (m_timeRulerLayer && (layer == m_timeRulerLayer)) { // cerr << "(this is the time ruler layer)" << endl; m_timeRulerLayer = 0; } } void MainWindowBase::layerInAView(Layer *layer, bool inAView) { // SVDEBUG << "MainWindowBase::layerInAView(" << layer << "," << inAView << ")" << endl; if (!inAView) removeLayerEditDialog(layer); // Check whether we need to add or remove model from play source Model *model = layer->getModel(); if (model) { if (inAView) { m_playSource->addModel(model); } else { bool found = false; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *pl = pane->getLayer(j); if (pl && !dynamic_cast(pl) && (pl->getModel() == model)) { found = true; break; } } if (found) break; } if (!found) { m_playSource->removeModel(model); } } } updateMenuStates(); } void MainWindowBase::removeLayerEditDialog(Layer *layer) { if (m_layerDataDialogMap.find(layer) != m_layerDataDialogMap.end()) { ModelDataTableDialog *dialog = m_layerDataDialogMap[layer]; for (ViewDataDialogMap::iterator vi = m_viewDataDialogMap.begin(); vi != m_viewDataDialogMap.end(); ++vi) { vi->second.erase(dialog); } m_layerDataDialogMap.erase(layer); delete dialog; } } void MainWindowBase::modelAdded(Model *model) { // SVDEBUG << "MainWindowBase::modelAdded(" << model << ")" << endl; std::cerr << "\nAdding model " << model->getTypeName() << " to playsource " << std::endl; m_playSource->addModel(model); } void MainWindowBase::mainModelChanged(WaveFileModel *model) { // SVDEBUG << "MainWindowBase::mainModelChanged(" << model << ")" << endl; updateDescriptionLabel(); if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate()); if (model && !(m_playTarget || m_audioIO) && (m_soundOptions & WithAudioOutput)) { createAudioIO(); } } void MainWindowBase::modelAboutToBeDeleted(Model *model) { // SVDEBUG << "MainWindowBase::modelAboutToBeDeleted(" << model << ")" << endl; if (model == m_viewManager->getPlaybackModel()) { m_viewManager->setPlaybackModel(0); } m_playSource->removeModel(model); } void MainWindowBase::paneDeleteButtonClicked(Pane *pane) { bool found = false; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == pane) { found = true; break; } } if (!found) { SVDEBUG << "MainWindowBase::paneDeleteButtonClicked: Unknown pane " << pane << endl; return; } CommandHistory::getInstance()->startCompoundOperation (tr("Delete Pane"), true); while (pane->getLayerCount() > 0) { Layer *layer = pane->getLayer(0); if (layer) { m_document->removeLayerFromView(pane, layer); } else { break; } } RemovePaneCommand *command = new RemovePaneCommand(this, pane); CommandHistory::getInstance()->addCommand(command); CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); } void MainWindowBase::alignmentComplete(AlignmentModel *model) { cerr << "MainWindowBase::alignmentComplete(" << model << ")" << endl; } void MainWindowBase::pollOSC() { if (!m_oscQueue || m_oscQueue->isEmpty()) return; SVDEBUG << "MainWindowBase::pollOSC: have " << m_oscQueue->getMessagesAvailable() << " messages" << endl; if (m_openingAudioFile) return; OSCMessage message = m_oscQueue->readMessage(); if (message.getTarget() != 0) { return; //!!! for now -- this class is target 0, others not handled yet } handleOSCMessage(message); } void MainWindowBase::inProgressSelectionChanged() { Pane *currentPane = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) { //cerr << "JTEST: mouse event on selection pane" << endl; updateVisibleRangeDisplay(currentPane); } } void MainWindowBase::contextHelpChanged(const QString &s) { QLabel *lab = getStatusLabel(); if (s == "" && m_myStatusMessage != "") { if (lab->text() != m_myStatusMessage) { lab->setText(m_myStatusMessage); } return; } lab->setText(s); } void MainWindowBase::openHelpUrl(QString url) { // This method mostly lifted from Qt Assistant source code QProcess *process = new QProcess(this); connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); QStringList args; #ifdef Q_OS_MAC args.append(url); process->start("open", args); #else #ifdef Q_OS_WIN32 QString pf(getenv("ProgramFiles")); QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE"); args.append(url); process->start(command, args); #else if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { args.append("exec"); args.append(url); process->start("kfmclient", args); } else if (!qgetenv("BROWSER").isEmpty()) { args.append(url); process->start(qgetenv("BROWSER"), args); } else { args.append(url); process->start("firefox", args); } #endif #endif } void MainWindowBase::openLocalFolder(QString path) { QDir d(path); if (d.exists()) { QStringList args; QString path = d.canonicalPath(); #if defined Q_OS_WIN32 // Although the Win32 API is quite happy to have // forward slashes as directory separators, Windows // Explorer is not path = path.replace('/', '\\'); args << path; QProcess::execute("c:/windows/explorer.exe", args); #else args << path; QProcess::execute( #if defined Q_OS_MAC "/usr/bin/open", #else "/usr/bin/xdg-open", #endif args); #endif } } sonic-visualiser-3.0.3/svapp/framework/MainWindowBase.h0000644000000000000000000003630113111512442021305 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_MAIN_WINDOW_BASE_H #define SV_MAIN_WINDOW_BASE_H #include #include #include #include #include #include #include "base/Command.h" #include "view/ViewManager.h" #include "base/PropertyContainer.h" #include "base/RecentFiles.h" #include "base/FrameTimer.h" #include "layer/LayerFactory.h" #include "transform/Transform.h" #include "SVFileReader.h" #include "data/fileio/FileFinder.h" #include "data/fileio/FileSource.h" #include "data/osc/OSCQueue.h" #include class Document; class PaneStack; class Pane; class View; class Fader; class Overview; class Layer; class WaveformLayer; class WaveFileModel; class AudioCallbackPlaySource; class AudioCallbackRecordTarget; class CommandHistory; class QMenu; class AudioDial; class LevelPanWidget; class LevelPanToolButton; class QLabel; class QCheckBox; class PreferencesDialog; class QTreeView; class QPushButton; class OSCMessage; class MIDIInput; class KeyReference; class Labeller; class ModelDataTableDialog; class QSignalMapper; class QShortcut; class AlignmentModel; namespace breakfastquay { class SystemPlaybackTarget; class SystemAudioIO; class ResamplerWrapper; } /** * The base class for the SV main window. This includes everything to * do with general document and pane stack management, but nothing * that involves user interaction -- this doesn't create the widget or * menu structures or editing tools, and if a function needs to open a * dialog, it shouldn't be in here. This permits "variations on SV" * to use different subclasses retaining the same general structure. */ class MainWindowBase : public QMainWindow, public FrameTimer { Q_OBJECT public: enum SoundOption { WithAudioOutput = 0x01, WithAudioInput = 0x02, WithMIDIInput = 0x04, WithEverything = 0xff, WithNothing = 0x00 }; typedef int SoundOptions; MainWindowBase(SoundOptions options = WithEverything); virtual ~MainWindowBase(); enum AudioFileOpenMode { ReplaceSession, ReplaceMainModel, CreateAdditionalModel, ReplaceCurrentPane, AskUser }; enum FileOpenStatus { FileOpenSucceeded, FileOpenFailed, FileOpenCancelled, FileOpenWrongMode // attempted to open layer when no main model present }; enum AudioRecordMode { RecordReplaceSession, RecordCreateAdditionalModel }; virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser); virtual FileOpenStatus openPath(QString fileOrUrl, AudioFileOpenMode = AskUser); virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = ""); virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser); virtual FileOpenStatus openLayer(FileSource source); virtual FileOpenStatus openImage(FileSource source); virtual FileOpenStatus openDirOfAudio(QString dirPath); virtual FileOpenStatus openSession(FileSource source); virtual FileOpenStatus openSessionPath(QString fileOrUrl); virtual FileOpenStatus openSessionTemplate(QString templateName); virtual FileOpenStatus openSessionTemplate(FileSource source); virtual bool saveSessionFile(QString path); virtual bool saveSessionTemplate(QString path); /// Implementation of FrameTimer interface method virtual sv_frame_t getFrame() const; void setDefaultFfwdRwdStep(RealTime step) { m_defaultFfwdRwdStep = step; } void setAudioRecordMode(AudioRecordMode mode) { m_audioRecordMode = mode; } signals: // Used to toggle the availability of menu actions void canAddPane(bool); void canDeleteCurrentPane(bool); void canAddLayer(bool); void canImportMoreAudio(bool); void canReplaceMainAudio(bool); void canImportLayer(bool); void canChangeSessionTemplate(bool); void canExportAudio(bool); void canExportLayer(bool); void canExportImage(bool); void canRenameLayer(bool); void canEditLayer(bool); void canEditLayerTabular(bool); void canMeasureLayer(bool); void canSelect(bool); void canClearSelection(bool); void canEditSelection(bool); void canDeleteSelection(bool); void canPaste(bool); void canInsertInstant(bool); void canInsertInstantsAtBoundaries(bool); void canInsertItemAtSelection(bool); void canRenumberInstants(bool); void canSubdivideInstants(bool); void canWinnowInstants(bool); void canDeleteCurrentLayer(bool); void canZoom(bool); void canScroll(bool); void canPlay(bool); void canRecord(bool); void canFfwd(bool); void canRewind(bool); void canPlaySelection(bool); void canSpeedUpPlayback(bool); void canSlowDownPlayback(bool); void canChangePlaybackSpeed(bool); void canSelectPreviousPane(bool); void canSelectNextPane(bool); void canSelectPreviousLayer(bool); void canSelectNextLayer(bool); void canSave(bool); void canSaveAs(bool); void hideSplash(); void hideSplash(QWidget *); void sessionLoaded(); void audioFileLoaded(); void replacedDocument(); void activity(QString); public slots: virtual void preferenceChanged(PropertyContainer::PropertyName); virtual void resizeConstrained(QSize); virtual void recreateAudioIO(); protected slots: virtual void zoomIn(); virtual void zoomOut(); virtual void zoomToFit(); virtual void zoomDefault(); virtual void scrollLeft(); virtual void scrollRight(); virtual void jumpLeft(); virtual void jumpRight(); virtual void peekLeft(); virtual void peekRight(); virtual void showNoOverlays(); virtual void showMinimalOverlays(); virtual void showAllOverlays(); virtual void toggleTimeRulers(); virtual void toggleZoomWheels(); virtual void togglePropertyBoxes(); virtual void toggleStatusBar(); virtual void toggleCentreLine(); virtual void play(); virtual void ffwd(); virtual void ffwdEnd(); virtual void rewind(); virtual void rewindStart(); virtual void record(); virtual void stop(); virtual void ffwdSimilar(); virtual void rewindSimilar(); virtual void deleteCurrentPane(); virtual void deleteCurrentLayer(); virtual void editCurrentLayer(); virtual void previousPane(); virtual void nextPane(); virtual void previousLayer(); virtual void nextLayer(); virtual void playLoopToggled(); virtual void playSelectionToggled(); virtual void playSoloToggled(); virtual void audioChannelCountIncreased(int count); virtual void sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool) = 0; virtual void audioOverloadPluginDisabled() = 0; virtual void audioTimeStretchMultiChannelDisabled() = 0; virtual void playbackFrameChanged(sv_frame_t); virtual void globalCentreFrameChanged(sv_frame_t); virtual void viewCentreFrameChanged(View *, sv_frame_t); virtual void viewZoomLevelChanged(View *, int, bool); virtual void monitoringLevelsChanged(float, float) = 0; virtual void recordDurationChanged(sv_frame_t, sv_samplerate_t); virtual void currentPaneChanged(Pane *); virtual void currentLayerChanged(Pane *, Layer *); virtual void selectAll(); virtual void selectToStart(); virtual void selectToEnd(); virtual void selectVisible(); virtual void clearSelection(); virtual void cut(); virtual void copy(); virtual void paste(); virtual void pasteAtPlaybackPosition(); virtual void pasteRelative(sv_frame_t offset); virtual void deleteSelected(); virtual void insertInstant(); virtual void insertInstantAt(sv_frame_t); virtual void insertInstantsAtBoundaries(); virtual void insertItemAtSelection(); virtual void insertItemAt(sv_frame_t, sv_frame_t); virtual void renumberInstants(); virtual void subdivideInstantsBy(int); virtual void winnowInstantsBy(int); virtual void documentModified(); virtual void documentRestored(); virtual void layerAdded(Layer *); virtual void layerRemoved(Layer *); virtual void layerAboutToBeDeleted(Layer *); virtual void layerInAView(Layer *, bool); virtual void mainModelChanged(WaveFileModel *); virtual void modelAdded(Model *); virtual void modelAboutToBeDeleted(Model *); virtual void updateMenuStates(); virtual void updateDescriptionLabel() = 0; virtual void modelGenerationFailed(QString, QString) = 0; virtual void modelGenerationWarning(QString, QString) = 0; virtual void modelRegenerationFailed(QString, QString, QString) = 0; virtual void modelRegenerationWarning(QString, QString, QString) = 0; virtual void alignmentComplete(AlignmentModel *); virtual void alignmentFailed(QString) = 0; virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0; virtual void paneAdded(Pane *) = 0; virtual void paneHidden(Pane *) = 0; virtual void paneAboutToBeDeleted(Pane *) = 0; virtual void paneDropAccepted(Pane *, QStringList) = 0; virtual void paneDropAccepted(Pane *, QString) = 0; virtual void paneDeleteButtonClicked(Pane *); virtual void oscReady(); virtual void pollOSC(); virtual void handleOSCMessage(const OSCMessage &) = 0; virtual void contextHelpChanged(const QString &); virtual void inProgressSelectionChanged(); virtual FileOpenStatus openSessionFromRDF(FileSource source); virtual FileOpenStatus openLayersFromRDF(FileSource source); virtual void closeSession() = 0; virtual void emitHideSplash(); virtual void newerVersionAvailable(QString) { } virtual void menuActionMapperInvoked(QObject *); protected: QString m_sessionFile; QString m_audioFile; Document *m_document; PaneStack *m_paneStack; ViewManager *m_viewManager; Layer *m_timeRulerLayer; SoundOptions m_soundOptions; AudioCallbackPlaySource *m_playSource; AudioCallbackRecordTarget *m_recordTarget; breakfastquay::ResamplerWrapper *m_resamplerWrapper; breakfastquay::SystemPlaybackTarget *m_playTarget; // only one of this... breakfastquay::SystemAudioIO *m_audioIO; // ... and this exists class OSCQueueStarter : public QThread { public: OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { } virtual void run() { OSCQueue *queue = new OSCQueue(); // can take a long time m_mwb->m_oscQueue = queue; } private: MainWindowBase *m_mwb; }; OSCQueue *m_oscQueue; OSCQueueStarter *m_oscQueueStarter; void startOSCQueue(); MIDIInput *m_midiInput; RecentFiles m_recentFiles; RecentFiles m_recentTransforms; bool m_documentModified; bool m_openingAudioFile; bool m_abandoning; Labeller *m_labeller; int m_lastPlayStatusSec; mutable QString m_myStatusMessage; bool m_initialDarkBackground; RealTime m_defaultFfwdRwdStep; AudioRecordMode m_audioRecordMode; mutable QLabel *m_statusLabel; QLabel *getStatusLabel() const; WaveFileModel *getMainModel(); const WaveFileModel *getMainModel() const; void createDocument(); Pane *addPaneToStack(); Layer *getSnapLayer() const; typedef std::map > LayerDataDialogMap; typedef std::set > DataDialogSet; typedef std::map ViewDataDialogMap; LayerDataDialogMap m_layerDataDialogMap; ViewDataDialogMap m_viewDataDialogMap; void removeLayerEditDialog(Layer *); class PaneCallback : public SVFileReaderPaneCallback { public: PaneCallback(MainWindowBase *mw) : m_mw(mw) { } virtual Pane *addPane() { return m_mw->addPaneToStack(); } virtual void setWindowSize(int width, int height) { m_mw->resizeConstrained(QSize(width, height)); } virtual void addSelection(sv_frame_t start, sv_frame_t end) { m_mw->m_viewManager->addSelectionQuietly(Selection(start, end)); } protected: MainWindowBase *m_mw; }; class AddPaneCommand : public Command { public: AddPaneCommand(MainWindowBase *mw); virtual ~AddPaneCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; Pane *getPane() { return m_pane; } protected: MainWindowBase *m_mw; Pane *m_pane; // Main window owns this, but I determine its lifespan Pane *m_prevCurrentPane; // I don't own this bool m_added; }; class RemovePaneCommand : public Command { public: RemovePaneCommand(MainWindowBase *mw, Pane *pane); virtual ~RemovePaneCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: MainWindowBase *m_mw; Pane *m_pane; // Main window owns this, but I determine its lifespan Pane *m_prevCurrentPane; // I don't own this bool m_added; }; virtual bool checkSaveModified() = 0; virtual QString getOpenFileName(FileFinder::FileType type); virtual QString getSaveFileName(FileFinder::FileType type); virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path); virtual QString getDefaultSessionTemplate() const; virtual void setDefaultSessionTemplate(QString); virtual void findTimeRulerLayer(); virtual void createAudioIO(); virtual void deleteAudioIO(); virtual void openHelpUrl(QString url); virtual void openLocalFolder(QString path); virtual void setupMenus() = 0; virtual void updateVisibleRangeDisplay(Pane *p) const = 0; virtual void updatePositionStatusDisplays() const = 0; // Call this after setting up the menu bar, to fix up single-key // shortcuts on OS/X and do any other platform-specific tidying virtual void finaliseMenus(); virtual void finaliseMenu(QMenu *); // Call before finaliseMenus if you wish to have a say in this question void setIconsVisibleInMenus(bool visible) { m_iconsVisibleInMenus = visible; } bool m_iconsVisibleInMenus; // Only used on OS/X to work around a Qt/Cocoa bug, see finaliseMenus QSignalMapper *m_menuShortcutMapper; QList m_appShortcuts; virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; } virtual void connectLayerEditDialog(ModelDataTableDialog *dialog); virtual void toXml(QTextStream &stream, bool asTemplate); }; #endif sonic-visualiser-3.0.3/svapp/framework/SVFileReader.cpp0000644000000000000000000012721713111512442021253 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SVFileReader.h" #include "layer/Layer.h" #include "view/View.h" #include "base/PlayParameters.h" #include "base/PlayParameterRepository.h" #include "base/Preferences.h" #include "data/fileio/AudioFileReaderFactory.h" #include "data/fileio/FileSource.h" #include "data/fileio/FileFinder.h" #include "data/model/ReadOnlyWaveFileModel.h" #include "data/model/EditableDenseThreeDimensionalModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/FlexiNoteModel.h" #include "data/model/RegionModel.h" #include "data/model/TextModel.h" #include "data/model/ImageModel.h" #include "data/model/AlignmentModel.h" #include "transform/TransformFactory.h" #include "view/Pane.h" #include "widgets/ProgressDialog.h" #include "Document.h" #include #include #include #include SVFileReader::SVFileReader(Document *document, SVFileReaderPaneCallback &callback, QString location) : m_document(document), m_paneCallback(callback), m_location(location), m_currentPane(0), m_currentLayer(0), m_currentDataset(0), m_currentDerivedModel(0), m_currentDerivedModelId(-1), m_currentPlayParameters(0), m_currentTransformSource(0), m_currentTransformChannel(0), m_currentTransformIsNewStyle(true), m_datasetSeparator(" "), m_inRow(false), m_inLayer(false), m_inView(false), m_inData(false), m_inSelections(false), m_rowNumber(0), m_ok(false) { } void SVFileReader::parse(const QString &xmlData) { QXmlInputSource inputSource; inputSource.setData(xmlData); parse(inputSource); } void SVFileReader::parse(QXmlInputSource &inputSource) { QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); m_ok = reader.parse(inputSource); } bool SVFileReader::isOK() { return m_ok; } SVFileReader::~SVFileReader() { if (!m_awaitingDatasets.empty()) { cerr << "WARNING: SV-XML: File ended with " << m_awaitingDatasets.size() << " unfilled model dataset(s)" << endl; } std::set unaddedModels; for (std::map::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (m_addedModels.find(i->second) == m_addedModels.end()) { unaddedModels.insert(i->second); } } if (!unaddedModels.empty()) { cerr << "WARNING: SV-XML: File contained " << unaddedModels.size() << " unused models" << endl; while (!unaddedModels.empty()) { delete *unaddedModels.begin(); unaddedModels.erase(unaddedModels.begin()); } } } bool SVFileReader::startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes &attributes) { QString name = qName.toLower(); bool ok = false; // Valid element names: // // sv // data // dataset // display // derivation // playparameters // layer // model // point // row // view // window // plugin // transform // selections // selection // measurement if (name == "sv") { // nothing needed ok = true; } else if (name == "data") { // nothing needed m_inData = true; ok = true; } else if (name == "display") { // nothing needed ok = true; } else if (name == "window") { ok = readWindow(attributes); } else if (name == "model") { ok = readModel(attributes); } else if (name == "dataset") { ok = readDatasetStart(attributes); } else if (name == "bin") { ok = addBinToDataset(attributes); } else if (name == "point") { ok = addPointToDataset(attributes); } else if (name == "row") { ok = addRowToDataset(attributes); } else if (name == "layer") { addUnaddedModels(); // all models must be specified before first layer ok = readLayer(attributes); } else if (name == "view") { m_inView = true; ok = readView(attributes); } else if (name == "derivation") { ok = readDerivation(attributes); } else if (name == "playparameters") { ok = readPlayParameters(attributes); } else if (name == "plugin") { ok = readPlugin(attributes); } else if (name == "selections") { m_inSelections = true; ok = true; } else if (name == "selection") { ok = readSelection(attributes); } else if (name == "measurement") { ok = readMeasurement(attributes); } else if (name == "transform") { ok = readTransform(attributes); } else if (name == "parameter") { ok = readParameter(attributes); } else { cerr << "WARNING: SV-XML: Unexpected element \"" << name << "\"" << endl; } if (!ok) { cerr << "WARNING: SV-XML: Failed to completely process element \"" << name << "\"" << endl; } return true; } bool SVFileReader::characters(const QString &text) { bool ok = false; if (m_inRow) { ok = readRowData(text); if (!ok) { cerr << "WARNING: SV-XML: Failed to read row data content for row " << m_rowNumber << endl; } } return true; } bool SVFileReader::endElement(const QString &, const QString &, const QString &qName) { QString name = qName.toLower(); if (name == "dataset") { if (m_currentDataset) { bool foundInAwaiting = false; for (std::map::iterator i = m_awaitingDatasets.begin(); i != m_awaitingDatasets.end(); ++i) { if (haveModel(i->second) && m_models[i->second] == m_currentDataset) { m_awaitingDatasets.erase(i); foundInAwaiting = true; break; } } if (!foundInAwaiting) { cerr << "WARNING: SV-XML: Dataset precedes model, or no model uses dataset" << endl; } } m_currentDataset = 0; } else if (name == "data") { addUnaddedModels(); m_inData = false; } else if (name == "derivation") { if (!m_currentDerivedModel) { if (m_currentDerivedModelId < 0) { cerr << "WARNING: SV-XML: Bad derivation output model id " << m_currentDerivedModelId << endl; } else if (haveModel(m_currentDerivedModelId)) { cerr << "WARNING: SV-XML: Derivation has existing model " << m_currentDerivedModelId << " as target, not regenerating" << endl; } else { QString message; m_currentDerivedModel = m_models[m_currentDerivedModelId] = m_document->addDerivedModel (m_currentTransform, ModelTransformer::Input(m_currentTransformSource, m_currentTransformChannel), message); if (!m_currentDerivedModel) { emit modelRegenerationFailed(tr("(derived model in SV-XML)"), m_currentTransform.getIdentifier(), message); } else if (message != "") { emit modelRegenerationWarning(tr("(derived model in SV-XML)"), m_currentTransform.getIdentifier(), message); } } } else { m_document->addAlreadyDerivedModel (m_currentTransform, ModelTransformer::Input(m_currentTransformSource, m_currentTransformChannel), m_currentDerivedModel); } m_addedModels.insert(m_currentDerivedModel); m_currentDerivedModel = 0; m_currentDerivedModelId = -1; m_currentTransformSource = 0; m_currentTransform = Transform(); m_currentTransformChannel = -1; } else if (name == "row") { m_inRow = false; } else if (name == "layer") { m_inLayer = false; } else if (name == "view") { m_inView = false; } else if (name == "selections") { m_inSelections = false; } else if (name == "playparameters") { m_currentPlayParameters = 0; } return true; } bool SVFileReader::error(const QXmlParseException &exception) { m_errorString = QString("ERROR: SV-XML: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << m_errorString << endl; return QXmlDefaultHandler::error(exception); } bool SVFileReader::fatalError(const QXmlParseException &exception) { m_errorString = QString("FATAL ERROR: SV-XML: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << m_errorString << endl; return QXmlDefaultHandler::fatalError(exception); } #define READ_MANDATORY(TYPE, NAME, CONVERSION) \ TYPE NAME = attributes.value(#NAME).trimmed().CONVERSION(&ok); \ if (!ok) { \ cerr << "WARNING: SV-XML: Missing or invalid mandatory " #TYPE " attribute \"" #NAME "\"" << endl; \ return false; \ } bool SVFileReader::readWindow(const QXmlAttributes &) { // The window element contains window dimensions, which we used to // read and size the window accordingly. This was a Bad Idea [tm] // and we now do nothing instead. See #1769 Loading window // dimensions from session file is a really bad idea return true; } void SVFileReader::addUnaddedModels() { std::set unaddedModels; for (std::map::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (m_addedModels.find(i->second) == m_addedModels.end()) { unaddedModels.insert(i->second); } } for (std::set::iterator i = unaddedModels.begin(); i != unaddedModels.end(); ++i) { Model *model = *i; // don't want to add these models, because their lifespans // are entirely dictated by the models that "own" them even // though they were read independently from the .sv file. // (pity we don't have a nicer way) if (!dynamic_cast(model) && !dynamic_cast(model)) { m_document->addImportedModel(model); } // but we add all models here, so they don't get deleted // when the file loader is destroyed m_addedModels.insert(model); } } bool SVFileReader::readModel(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, id, toInt); if (haveModel(id)) { cerr << "WARNING: SV-XML: Ignoring duplicate model id " << id << endl; return false; } QString name = attributes.value("name"); SVDEBUG << "SVFileReader::readModel: model name \"" << name << "\"" << endl; READ_MANDATORY(double, sampleRate, toDouble); QString type = attributes.value("type").trimmed(); bool isMainModel = (attributes.value("mainModel").trimmed() == "true"); if (type == "wavefile") { WaveFileModel *model = 0; FileFinder *ff = FileFinder::getInstance(); QString originalPath = attributes.value("file"); QString path = ff->find(FileFinder::AudioFile, originalPath, m_location); SVDEBUG << "Wave file originalPath = " << originalPath << ", path = " << path << endl; ProgressDialog dialog(tr("Opening file or URL..."), true, 2000); FileSource file(path, &dialog); file.waitForStatus(); if (!file.isOK()) { cerr << "SVFileReader::readModel: Failed to retrieve file \"" << path << "\" for wave file model: " << file.getErrorString() << endl; } else if (!file.isAvailable()) { cerr << "SVFileReader::readModel: Failed to retrieve file \"" << path << "\" for wave file model: Source unavailable" << endl; } else { file.waitForData(); sv_samplerate_t rate = sampleRate; if (Preferences::getInstance()->getFixedSampleRate() != 0) { rate = Preferences::getInstance()->getFixedSampleRate(); } else if (rate == 0 && !isMainModel && Preferences::getInstance()->getResampleOnLoad()) { WaveFileModel *mm = m_document->getMainModel(); if (mm) rate = mm->getSampleRate(); } model = new ReadOnlyWaveFileModel(file, rate); if (!model->isOK()) { delete model; model = 0; } } if (!model) return false; model->setObjectName(name); m_models[id] = model; if (isMainModel) { m_document->setMainModel(model); m_addedModels.insert(model); } // Derived models will be added when their derivation // is found. return true; } else if (type == "dense") { READ_MANDATORY(int, dimensions, toInt); // Currently the only dense model we support here is the dense // 3d model. Dense time-value models are always file-backed // waveform data, at this point, and they come in as wavefile // models. if (dimensions == 3) { READ_MANDATORY(int, windowSize, toInt); READ_MANDATORY(int, yBinCount, toInt); EditableDenseThreeDimensionalModel *model = new EditableDenseThreeDimensionalModel (sampleRate, windowSize, yBinCount, EditableDenseThreeDimensionalModel::NoCompression); float minimum = attributes.value("minimum").trimmed().toFloat(&ok); if (ok) model->setMinimumLevel(minimum); float maximum = attributes.value("maximum").trimmed().toFloat(&ok); if (ok) model->setMaximumLevel(maximum); int dataset = attributes.value("dataset").trimmed().toInt(&ok); if (ok) m_awaitingDatasets[dataset] = id; int startFrame = attributes.value("startFrame").trimmed().toInt(&ok); if (ok) model->setStartFrame(startFrame); model->setObjectName(name); m_models[id] = model; return true; } else { cerr << "WARNING: SV-XML: Unexpected dense model dimension (" << dimensions << ")" << endl; } } else if (type == "sparse") { READ_MANDATORY(int, dimensions, toInt); if (dimensions == 1) { READ_MANDATORY(int, resolution, toInt); if (attributes.value("subtype") == "image") { bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true"); ImageModel *model = new ImageModel(sampleRate, resolution, notifyOnAdd); model->setObjectName(name); m_models[id] = model; } else { SparseOneDimensionalModel *model = new SparseOneDimensionalModel (sampleRate, resolution); model->setObjectName(name); m_models[id] = model; } int dataset = attributes.value("dataset").trimmed().toInt(&ok); if (ok) m_awaitingDatasets[dataset] = id; return true; } else if (dimensions == 2 || dimensions == 3) { READ_MANDATORY(int, resolution, toInt); bool haveMinMax = true; float minimum = attributes.value("minimum").trimmed().toFloat(&ok); if (!ok) haveMinMax = false; float maximum = attributes.value("maximum").trimmed().toFloat(&ok); if (!ok) haveMinMax = false; float valueQuantization = attributes.value("valueQuantization").trimmed().toFloat(&ok); bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true"); QString units = attributes.value("units"); if (dimensions == 2) { if (attributes.value("subtype") == "text") { TextModel *model = new TextModel (sampleRate, resolution, notifyOnAdd); model->setObjectName(name); m_models[id] = model; } else if (attributes.value("subtype") == "path") { PathModel *model = new PathModel (sampleRate, resolution, notifyOnAdd); model->setObjectName(name); m_models[id] = model; } else { SparseTimeValueModel *model; if (haveMinMax) { model = new SparseTimeValueModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new SparseTimeValueModel (sampleRate, resolution, notifyOnAdd); } model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } } else { if (attributes.value("subtype") == "region") { RegionModel *model; if (haveMinMax) { model = new RegionModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new RegionModel (sampleRate, resolution, notifyOnAdd); } model->setValueQuantization(valueQuantization); model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } else if (attributes.value("subtype") == "flexinote") { FlexiNoteModel *model; if (haveMinMax) { model = new FlexiNoteModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new FlexiNoteModel (sampleRate, resolution, notifyOnAdd); } model->setValueQuantization(valueQuantization); model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } else { // note models written out by SV 1.3 and earlier // have no subtype, so we can't test that NoteModel *model; if (haveMinMax) { model = new NoteModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new NoteModel (sampleRate, resolution, notifyOnAdd); } model->setValueQuantization(valueQuantization); model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } } int dataset = attributes.value("dataset").trimmed().toInt(&ok); if (ok) m_awaitingDatasets[dataset] = id; return true; } else { cerr << "WARNING: SV-XML: Unexpected sparse model dimension (" << dimensions << ")" << endl; } } else if (type == "alignment") { READ_MANDATORY(int, reference, toInt); READ_MANDATORY(int, aligned, toInt); READ_MANDATORY(int, path, toInt); Model *refModel = 0, *alignedModel = 0, *pathModel = 0; if (m_models.find(reference) != m_models.end()) { refModel = m_models[reference]; } else { cerr << "WARNING: SV-XML: Unknown reference model id " << reference << " in alignment model id " << id << endl; } if (m_models.find(aligned) != m_models.end()) { alignedModel = m_models[aligned]; } else { cerr << "WARNING: SV-XML: Unknown aligned model id " << aligned << " in alignment model id " << id << endl; } if (m_models.find(path) != m_models.end()) { pathModel = m_models[path]; } else { cerr << "WARNING: SV-XML: Unknown path model id " << path << " in alignment model id " << id << endl; } if (refModel && alignedModel && pathModel) { AlignmentModel *model = new AlignmentModel (refModel, alignedModel, 0, 0); PathModel *pm = dynamic_cast(pathModel); if (!pm) { cerr << "WARNING: SV-XML: Model id " << path << " referenced as path for alignment " << id << " is not a path model" << endl; } else { model->setPath(pm); pm->setCompletion(100); } model->setObjectName(name); m_models[id] = model; alignedModel->setAlignment(model); return true; } } else { SVCERR << "WARNING: SV-XML: Unexpected model type \"" << type << "\" for model id " << id << endl; } return false; } bool SVFileReader::readView(const QXmlAttributes &attributes) { QString type = attributes.value("type"); m_currentPane = 0; if (type != "pane") { cerr << "WARNING: SV-XML: Unexpected view type \"" << type << "\"" << endl; return false; } m_currentPane = m_paneCallback.addPane(); cerr << "SVFileReader::addPane: pane is " << m_currentPane << endl; if (!m_currentPane) { cerr << "WARNING: SV-XML: Internal error: Failed to add pane!" << endl; return false; } bool ok = false; View *view = m_currentPane; // The view properties first READ_MANDATORY(int, centre, toInt); READ_MANDATORY(int, zoom, toInt); READ_MANDATORY(int, followPan, toInt); READ_MANDATORY(int, followZoom, toInt); QString tracking = attributes.value("tracking"); // Specify the follow modes before we set the actual values view->setFollowGlobalPan(followPan); view->setFollowGlobalZoom(followZoom); view->setPlaybackFollow(tracking == "scroll" ? PlaybackScrollContinuous : tracking == "page" ? PlaybackScrollPageWithCentre : tracking == "daw" ? PlaybackScrollPage : PlaybackIgnore); // Then set these values view->setCentreFrame(centre); view->setZoomLevel(zoom); // And pane properties READ_MANDATORY(int, centreLineVisible, toInt); m_currentPane->setCentreLineVisible(centreLineVisible); int height = attributes.value("height").toInt(&ok); if (ok) { m_currentPane->resize(m_currentPane->width(), height); } return true; } bool SVFileReader::readLayer(const QXmlAttributes &attributes) { QString type = attributes.value("type"); int id; bool ok = false; id = attributes.value("id").trimmed().toInt(&ok); if (!ok) { cerr << "WARNING: SV-XML: No layer id for layer of type \"" << type << "\"" << endl; return false; } Layer *layer = 0; bool isNewLayer = false; // Layers are expected to be defined in layer elements in the data // section, and referred to in layer elements in the view // sections. So if we're in the data section, we expect this // layer not to exist already; if we're in the view section, we // expect it to exist. if (m_inData) { if (m_layers.find(id) != m_layers.end()) { cerr << "WARNING: SV-XML: Ignoring duplicate layer id " << id << " in data section" << endl; return false; } layer = m_layers[id] = m_document->createLayer (LayerFactory::getInstance()->getLayerTypeForName(type)); if (layer) { m_layers[id] = layer; isNewLayer = true; } } else { if (!m_currentPane) { cerr << "WARNING: SV-XML: No current pane for layer " << id << " in view section" << endl; return false; } if (m_layers.find(id) != m_layers.end()) { layer = m_layers[id]; } else { cerr << "WARNING: SV-XML: Layer id " << id << " in view section has not been defined -- defining it here" << endl; layer = m_document->createLayer (LayerFactory::getInstance()->getLayerTypeForName(type)); if (layer) { m_layers[id] = layer; isNewLayer = true; } } } if (!layer) { cerr << "WARNING: SV-XML: Failed to add layer of type \"" << type << "\"" << endl; return false; } if (isNewLayer) { QString name = attributes.value("name"); layer->setObjectName(name); QString presentationName = attributes.value("presentationName"); layer->setPresentationName(presentationName); int modelId; bool modelOk = false; modelId = attributes.value("model").trimmed().toInt(&modelOk); if (modelOk) { if (haveModel(modelId)) { Model *model = m_models[modelId]; m_document->setModel(layer, model); } else { cerr << "WARNING: SV-XML: Unknown model id " << modelId << " in layer definition" << endl; if (!layer->canExistWithoutModel()) { // Don't add a layer with an unknown model id // unless it explicitly supports this state m_document->deleteLayer(layer); m_layers[id] = layer = 0; return false; } } } if (layer) layer->setProperties(attributes); } if (!m_inData && m_currentPane && layer) { QString visible = attributes.value("visible"); bool dormant = (visible == "false"); // We need to do this both before and after adding the layer // to the view -- we need it to be dormant if appropriate // before it's actually added to the view so that any property // box gets the right state when it's added, but the add layer // command sets dormant to false because it assumes it may be // restoring a previously dormant layer, so we need to set it // again afterwards too. Hm layer->setLayerDormant(m_currentPane, dormant); m_document->addLayerToView(m_currentPane, layer); layer->setLayerDormant(m_currentPane, dormant); } m_currentLayer = layer; m_inLayer = (layer != 0); return true; } bool SVFileReader::readDatasetStart(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, id, toInt); READ_MANDATORY(int, dimensions, toInt); if (m_awaitingDatasets.find(id) == m_awaitingDatasets.end()) { cerr << "WARNING: SV-XML: Unwanted dataset " << id << endl; return false; } int modelId = m_awaitingDatasets[id]; Model *model = 0; if (haveModel(modelId)) { model = m_models[modelId]; } else { cerr << "WARNING: SV-XML: Internal error: Unknown model " << modelId << " expecting dataset " << id << endl; return false; } bool good = false; switch (dimensions) { case 1: if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; break; case 2: if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; break; case 3: if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) { m_datasetSeparator = attributes.value("separator"); good = true; } break; } if (!good) { cerr << "WARNING: SV-XML: Model id " << modelId << " has wrong number of dimensions or inappropriate type for " << dimensions << "-D dataset " << id << endl; m_currentDataset = 0; return false; } m_currentDataset = model; return true; } bool SVFileReader::addPointToDataset(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, frame, toInt); // SVDEBUG << "SVFileReader::addPointToDataset: frame = " << frame << endl; SparseOneDimensionalModel *sodm = dynamic_cast (m_currentDataset); if (sodm) { // cerr << "Current dataset is a sparse one dimensional model" << endl; QString label = attributes.value("label"); sodm->addPoint(SparseOneDimensionalModel::Point(frame, label)); return true; } SparseTimeValueModel *stvm = dynamic_cast (m_currentDataset); if (stvm) { // cerr << "Current dataset is a sparse time-value model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); QString label = attributes.value("label"); stvm->addPoint(SparseTimeValueModel::Point(frame, value, label)); return ok; } NoteModel *nm = dynamic_cast(m_currentDataset); if (nm) { // cerr << "Current dataset is a note model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); int duration = 0; duration = attributes.value("duration").trimmed().toInt(&ok); QString label = attributes.value("label"); float level = attributes.value("level").trimmed().toFloat(&ok); if (!ok) { // level is optional level = 1.f; ok = true; } nm->addPoint(NoteModel::Point(frame, value, duration, level, label)); return ok; } FlexiNoteModel *fnm = dynamic_cast(m_currentDataset); if (fnm) { // cerr << "Current dataset is a flexinote model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); int duration = 0; duration = attributes.value("duration").trimmed().toInt(&ok); QString label = attributes.value("label"); float level = attributes.value("level").trimmed().toFloat(&ok); if (!ok) { // level is optional level = 1.f; ok = true; } fnm->addPoint(FlexiNoteModel::Point(frame, value, duration, level, label)); return ok; } RegionModel *rm = dynamic_cast(m_currentDataset); if (rm) { // cerr << "Current dataset is a region model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); int duration = 0; duration = attributes.value("duration").trimmed().toInt(&ok); QString label = attributes.value("label"); rm->addPoint(RegionModel::Point(frame, value, duration, label)); return ok; } TextModel *tm = dynamic_cast(m_currentDataset); if (tm) { // cerr << "Current dataset is a text model" << endl; float height = 0.0; height = attributes.value("height").trimmed().toFloat(&ok); QString label = attributes.value("label"); // SVDEBUG << "SVFileReader::addPointToDataset: TextModel: frame = " << frame << ", height = " << height << ", label = " << label << ", ok = " << ok << endl; tm->addPoint(TextModel::Point(frame, height, label)); return ok; } PathModel *pm = dynamic_cast(m_currentDataset); if (pm) { // cerr << "Current dataset is a path model" << endl; int mapframe = attributes.value("mapframe").trimmed().toInt(&ok); // SVDEBUG << "SVFileReader::addPointToDataset: PathModel: frame = " << frame << ", mapframe = " << mapframe << ", ok = " << ok << endl; pm->addPoint(PathModel::Point(frame, mapframe)); return ok; } ImageModel *im = dynamic_cast(m_currentDataset); if (im) { // cerr << "Current dataset is an image model" << endl; QString image = attributes.value("image"); QString label = attributes.value("label"); // SVDEBUG << "SVFileReader::addPointToDataset: ImageModel: frame = " << frame << ", image = " << image << ", label = " << label << ", ok = " << ok << endl; im->addPoint(ImageModel::Point(frame, image, label)); return ok; } cerr << "WARNING: SV-XML: Point element found in non-point dataset" << endl; return false; } bool SVFileReader::addBinToDataset(const QXmlAttributes &attributes) { EditableDenseThreeDimensionalModel *dtdm = dynamic_cast (m_currentDataset); if (dtdm) { bool ok = false; int n = attributes.value("number").trimmed().toInt(&ok); if (!ok) { cerr << "WARNING: SV-XML: Missing or invalid bin number" << endl; return false; } QString name = attributes.value("name"); dtdm->setBinName(n, name); return true; } cerr << "WARNING: SV-XML: Bin definition found in incompatible dataset" << endl; return false; } bool SVFileReader::addRowToDataset(const QXmlAttributes &attributes) { m_inRow = false; bool ok = false; m_rowNumber = attributes.value("n").trimmed().toInt(&ok); if (!ok) { cerr << "WARNING: SV-XML: Missing or invalid row number" << endl; return false; } m_inRow = true; // cerr << "SV-XML: In row " << m_rowNumber << endl; return true; } bool SVFileReader::readRowData(const QString &text) { EditableDenseThreeDimensionalModel *dtdm = dynamic_cast (m_currentDataset); bool warned = false; if (dtdm) { QStringList data = text.split(m_datasetSeparator); DenseThreeDimensionalModel::Column values; for (QStringList::iterator i = data.begin(); i != data.end(); ++i) { if (int(values.size()) == dtdm->getHeight()) { if (!warned) { cerr << "WARNING: SV-XML: Too many y-bins in 3-D dataset row " << m_rowNumber << endl; warned = true; } } bool ok; float value = i->toFloat(&ok); if (!ok) { cerr << "WARNING: SV-XML: Bad floating-point value " << i->toLocal8Bit().data() << " in row data" << endl; } else { values.push_back(value); } } dtdm->setColumn(m_rowNumber, values); return true; } cerr << "WARNING: SV-XML: Row data found in non-row dataset" << endl; return false; } bool SVFileReader::readDerivation(const QXmlAttributes &attributes) { int modelId = 0; bool modelOk = false; modelId = attributes.value("model").trimmed().toInt(&modelOk); if (!modelOk) { cerr << "WARNING: SV-XML: No model id specified for derivation" << endl; return false; } if (haveModel(modelId)) { m_currentDerivedModel = m_models[modelId]; } else { // we'll regenerate the model when the derivation element ends m_currentDerivedModel = 0; } m_currentDerivedModelId = modelId; int sourceId = 0; bool sourceOk = false; sourceId = attributes.value("source").trimmed().toInt(&sourceOk); if (sourceOk && haveModel(sourceId)) { m_currentTransformSource = m_models[sourceId]; } else { SVDEBUG << "NOTE: SV-XML: Can't find a model with id " << sourceId << " for derivation source, falling back to main model" << endl; m_currentTransformSource = m_document->getMainModel(); } m_currentTransform = Transform(); bool ok = false; int channel = attributes.value("channel").trimmed().toInt(&ok); if (ok) m_currentTransformChannel = channel; else m_currentTransformChannel = -1; QString type = attributes.value("type"); if (type == "transform") { m_currentTransformIsNewStyle = true; return true; } else { m_currentTransformIsNewStyle = false; SVDEBUG << "NOTE: SV-XML: Reading old-style derivation element" << endl; } QString transformId = attributes.value("transform"); m_currentTransform.setIdentifier(transformId); int stepSize = attributes.value("stepSize").trimmed().toInt(&ok); if (ok) m_currentTransform.setStepSize(stepSize); int blockSize = attributes.value("blockSize").trimmed().toInt(&ok); if (ok) m_currentTransform.setBlockSize(blockSize); int windowType = attributes.value("windowType").trimmed().toInt(&ok); if (ok) m_currentTransform.setWindowType(WindowType(windowType)); if (!m_currentTransformSource) return true; QString startFrameStr = attributes.value("startFrame"); QString durationStr = attributes.value("duration"); int startFrame = 0; int duration = 0; if (startFrameStr != "") { startFrame = startFrameStr.trimmed().toInt(&ok); if (!ok) startFrame = 0; } if (durationStr != "") { duration = durationStr.trimmed().toInt(&ok); if (!ok) duration = 0; } m_currentTransform.setStartTime (RealTime::frame2RealTime (startFrame, m_currentTransformSource->getSampleRate())); m_currentTransform.setDuration (RealTime::frame2RealTime (duration, m_currentTransformSource->getSampleRate())); return true; } bool SVFileReader::readPlayParameters(const QXmlAttributes &attributes) { m_currentPlayParameters = 0; int modelId = 0; bool modelOk = false; modelId = attributes.value("model").trimmed().toInt(&modelOk); if (!modelOk) { cerr << "WARNING: SV-XML: No model id specified for play parameters" << endl; return false; } if (haveModel(modelId)) { bool ok = false; PlayParameters *parameters = PlayParameterRepository::getInstance()-> getPlayParameters(m_models[modelId]); if (!parameters) { cerr << "WARNING: SV-XML: Play parameters for model " << modelId << " not found - has model been added to document?" << endl; return false; } bool muted = (attributes.value("mute").trimmed() == "true"); parameters->setPlayMuted(muted); float pan = attributes.value("pan").toFloat(&ok); if (ok) parameters->setPlayPan(pan); float gain = attributes.value("gain").toFloat(&ok); if (ok) parameters->setPlayGain(gain); QString clipId = attributes.value("clipId"); if (clipId != "") parameters->setPlayClipId(clipId); m_currentPlayParameters = parameters; // cerr << "Current play parameters for model: " << m_models[modelId] << ": " << m_currentPlayParameters << endl; } else { cerr << "WARNING: SV-XML: Unknown model " << modelId << " for play parameters" << endl; return false; } return true; } bool SVFileReader::readPlugin(const QXmlAttributes &attributes) { if (m_currentDerivedModelId >= 0) { return readPluginForTransform(attributes); } else if (m_currentPlayParameters) { return readPluginForPlayback(attributes); } else { cerr << "WARNING: SV-XML: Plugin found outside derivation or play parameters" << endl; return false; } } bool SVFileReader::readPluginForTransform(const QXmlAttributes &attributes) { if (m_currentTransformIsNewStyle) { // Not needed, we have the transform element instead return true; } QString configurationXml = " setParametersFromPluginConfigurationXml(m_currentTransform, configurationXml); return true; } bool SVFileReader::readPluginForPlayback(const QXmlAttributes &attributes) { // Obsolete but supported for compatibility QString ident = attributes.value("identifier"); if (ident == "sample_player") { QString clipId = attributes.value("program"); if (clipId != "") m_currentPlayParameters->setPlayClipId(clipId); } return true; } bool SVFileReader::readTransform(const QXmlAttributes &attributes) { if (m_currentDerivedModelId < 0) { cerr << "WARNING: SV-XML: Transform found outside derivation" << endl; return false; } m_currentTransform = Transform(); m_currentTransform.setFromXmlAttributes(attributes); return true; } bool SVFileReader::readParameter(const QXmlAttributes &attributes) { if (m_currentDerivedModelId < 0) { cerr << "WARNING: SV-XML: Parameter found outside derivation" << endl; return false; } QString name = attributes.value("name"); if (name == "") { cerr << "WARNING: SV-XML: Ignoring nameless transform parameter" << endl; return false; } float value = attributes.value("value").trimmed().toFloat(); m_currentTransform.setParameter(name, value); return true; } bool SVFileReader::readSelection(const QXmlAttributes &attributes) { bool ok; READ_MANDATORY(int, start, toInt); READ_MANDATORY(int, end, toInt); m_paneCallback.addSelection(start, end); return true; } bool SVFileReader::readMeasurement(const QXmlAttributes &attributes) { SVDEBUG << "SVFileReader::readMeasurement: inLayer " << m_inLayer << ", layer " << m_currentLayer << endl; if (!m_inLayer) { cerr << "WARNING: SV-XML: Measurement found outside layer" << endl; return false; } m_currentLayer->addMeasurementRect(attributes); return true; } SVFileReaderPaneCallback::~SVFileReaderPaneCallback() { } class SVFileIdentifier : public QXmlDefaultHandler { public: SVFileIdentifier() : m_inSv(false), m_inData(false), m_type(SVFileReader::UnknownFileType) { } virtual ~SVFileIdentifier() { } void parse(QXmlInputSource &source) { QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); reader.parse(source); } SVFileReader::FileType getType() const { return m_type; } virtual bool startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes& atts) { QString name = qName.toLower(); // SV session files have an sv element containing a data // element containing a model element with mainModel="true". // If the sv element is present but the rest does not satisfy, // then it's (probably) an SV layer file. // Otherwise, it's of unknown type. if (name == "sv") { m_inSv = true; if (m_type == SVFileReader::UnknownFileType) { m_type = SVFileReader::SVLayerFile; } return true; } else if (name == "data") { if (!m_inSv) return true; m_inData = true; } else if (name == "model") { if (!m_inData) return true; if (atts.value("mainModel").trimmed() == "true") { if (m_type == SVFileReader::SVLayerFile) { m_type = SVFileReader::SVSessionFile; return false; // done } } } return true; } virtual bool endElement(const QString &, const QString &, const QString &qName) { QString name = qName.toLower(); if (name == "sv") { if (m_inSv) { m_inSv = false; return false; // done } } else if (name == "data") { if (m_inData) { m_inData = false; return false; // also done, nothing after the first // data element is of use here } } return true; } private: bool m_inSv; bool m_inData; SVFileReader::FileType m_type; }; SVFileReader::FileType SVFileReader::identifyXmlFile(QString path) { QFile file(path); SVFileIdentifier identifier; QXmlInputSource source(&file); identifier.parse(source); return identifier.getType(); } sonic-visualiser-3.0.3/svapp/framework/SVFileReader.h0000644000000000000000000002100113111512442020700 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SV_FILE_READER_H_ #define _SV_FILE_READER_H_ #include "layer/LayerFactory.h" #include "transform/Transform.h" #include #include class Pane; class Model; class Document; class PlayParameters; class SVFileReaderPaneCallback { public: virtual ~SVFileReaderPaneCallback(); virtual Pane *addPane() = 0; virtual void setWindowSize(int width, int height) = 0; virtual void addSelection(sv_frame_t start, sv_frame_t end) = 0; }; /** SVFileReader loads Sonic Visualiser XML files. (The SV file format is bzipped XML.) Some notes about the SV XML format follow. We're very lazy with our XML: there's no schema or DTD, and we depend heavily on elements being in a particular order. \verbatim \endverbatim */ class SVFileReader : public QObject, QXmlDefaultHandler { Q_OBJECT public: SVFileReader(Document *document, SVFileReaderPaneCallback &callback, QString location = ""); // for audio file locate mechanism virtual ~SVFileReader(); void parse(const QString &xmlData); void parse(QXmlInputSource &source); bool isOK(); QString getErrorString() const { return m_errorString; } // For loading a single layer onto an existing pane void setCurrentPane(Pane *pane) { m_currentPane = pane; } virtual bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes& atts); virtual bool characters(const QString &); virtual bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); bool error(const QXmlParseException &exception); bool fatalError(const QXmlParseException &exception); enum FileType { SVSessionFile, SVLayerFile, UnknownFileType }; static FileType identifyXmlFile(QString path); signals: void modelRegenerationFailed(QString layerName, QString transformName, QString message); void modelRegenerationWarning(QString layerName, QString transformName, QString message); protected: bool readWindow(const QXmlAttributes &); bool readModel(const QXmlAttributes &); bool readView(const QXmlAttributes &); bool readLayer(const QXmlAttributes &); bool readDatasetStart(const QXmlAttributes &); bool addBinToDataset(const QXmlAttributes &); bool addPointToDataset(const QXmlAttributes &); bool addRowToDataset(const QXmlAttributes &); bool readRowData(const QString &); bool readDerivation(const QXmlAttributes &); bool readPlayParameters(const QXmlAttributes &); bool readPlugin(const QXmlAttributes &); bool readPluginForTransform(const QXmlAttributes &); bool readPluginForPlayback(const QXmlAttributes &); bool readTransform(const QXmlAttributes &); bool readParameter(const QXmlAttributes &); bool readSelection(const QXmlAttributes &); bool readMeasurement(const QXmlAttributes &); void addUnaddedModels(); bool haveModel(int id) { return (m_models.find(id) != m_models.end()) && m_models[id]; } Document *m_document; SVFileReaderPaneCallback &m_paneCallback; QString m_location; Pane *m_currentPane; std::map m_layers; std::map m_models; std::set m_addedModels; std::map m_awaitingDatasets; // map dataset id -> model id Layer *m_currentLayer; Model *m_currentDataset; Model *m_currentDerivedModel; int m_currentDerivedModelId; PlayParameters *m_currentPlayParameters; Transform m_currentTransform; Model *m_currentTransformSource; int m_currentTransformChannel; bool m_currentTransformIsNewStyle; QString m_datasetSeparator; bool m_inRow; bool m_inLayer; bool m_inView; bool m_inData; bool m_inSelections; int m_rowNumber; QString m_errorString; bool m_ok; }; #endif sonic-visualiser-3.0.3/svapp/framework/TransformUserConfigurator.cpp0000644000000000000000000001564013111512442024171 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "TransformUserConfigurator.h" #include "transform/TransformFactory.h" #include "widgets/PluginParameterDialog.h" #include "plugin/FeatureExtractionPluginFactory.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/RealTimePluginInstance.h" #include "data/model/DenseTimeValueModel.h" #include #include #include static QWidget *parentWidget = 0; void TransformUserConfigurator::setParentWidget(QWidget *w) { parentWidget = w; } bool TransformUserConfigurator::getChannelRange(TransformId identifier, Vamp::PluginBase *plugin, int &minChannels, int &maxChannels) { if (plugin && plugin->getType() == "Feature Extraction Plugin") { Vamp::Plugin *vp = static_cast(plugin); SVDEBUG << "TransformUserConfigurator::getChannelRange: is a Vamp plugin" << endl; minChannels = int(vp->getMinChannelCount()); maxChannels = int(vp->getMaxChannelCount()); return true; } else { SVDEBUG << "TransformUserConfigurator::getChannelRange: is not a Vamp plugin" << endl; return TransformFactory::getInstance()-> getTransformChannelRange(identifier, minChannels, maxChannels); } } bool TransformUserConfigurator::configure(ModelTransformer::Input &input, Transform &transform, Vamp::PluginBase *plugin, Model *&inputModel, AudioPlaySource *source, sv_frame_t startFrame, sv_frame_t duration, const QMap &modelMap, QStringList candidateModelNames, QString defaultModelName) { bool ok = false; QString id = transform.getPluginIdentifier(); QString output = transform.getOutput(); QString outputLabel = ""; QString outputDescription = ""; bool frequency = false; bool effect = false; bool generator = false; if (!plugin) return false; SVDEBUG << "TransformUserConfigurator::configure: identifier " << id << endl; if (RealTimePluginFactory::instanceFor(id)) { RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(id); const RealTimePluginDescriptor *desc = factory->getPluginDescriptor(id); if (desc->audioInputPortCount > 0 && desc->audioOutputPortCount > 0 && !desc->isSynth) { effect = true; } if (desc->audioInputPortCount == 0) { generator = true; } if (output != "A") { int outputNo = output.toInt(); if (outputNo >= 0 && outputNo < int(desc->controlOutputPortCount)) { outputLabel = desc->controlOutputPortNames[outputNo].c_str(); } } RealTimePluginInstance *rtp = static_cast(plugin); if (effect && source) { SVDEBUG << "Setting auditioning effect" << endl; source->setAuditioningEffect(rtp); } } else { Vamp::Plugin *vp = static_cast(plugin); frequency = (vp->getInputDomain() == Vamp::Plugin::FrequencyDomain); std::vector od = vp->getOutputDescriptors(); // cerr << "configure: looking for output: " << output << endl; if (od.size() > 1) { for (size_t i = 0; i < od.size(); ++i) { if (od[i].identifier == output.toStdString()) { outputLabel = od[i].name.c_str(); outputDescription = od[i].description.c_str(); break; } } } } int sourceChannels = 1; if (dynamic_cast(inputModel)) { sourceChannels = dynamic_cast(inputModel) ->getChannelCount(); } int minChannels = 1, maxChannels = sourceChannels; getChannelRange(transform.getIdentifier(), plugin, minChannels, maxChannels); int targetChannels = sourceChannels; if (!effect) { if (sourceChannels < minChannels) targetChannels = minChannels; if (sourceChannels > maxChannels) targetChannels = maxChannels; } int defaultChannel = -1; //!!! no longer saved! [was context.channel] PluginParameterDialog *dialog = new PluginParameterDialog (plugin, parentWidget); dialog->setMoreInfoUrl(TransformFactory::getInstance()-> getTransformInfoUrl(transform.getIdentifier())); if (candidateModelNames.size() > 1 && !generator) { dialog->setCandidateInputModels(candidateModelNames, defaultModelName); } if (startFrame != 0 || duration != 0) { dialog->setShowSelectionOnlyOption(true); } if (targetChannels > 0) { dialog->setChannelArrangement(sourceChannels, targetChannels, defaultChannel); } dialog->setOutputLabel(outputLabel, outputDescription); dialog->setShowProcessingOptions(true, frequency); if (dialog->exec() == QDialog::Accepted) { ok = true; } QString selectedInput = dialog->getInputModel(); if (selectedInput != "") { if (modelMap.contains(selectedInput)) { inputModel = modelMap.value(selectedInput); SVDEBUG << "Found selected input \"" << selectedInput << "\" in model map, result is " << inputModel << endl; } else { SVDEBUG << "Failed to find selected input \"" << selectedInput << "\" in model map" << endl; } } else { SVDEBUG << "Selected input empty: \"" << selectedInput << "\"" << endl; } // Write parameters back to transform object TransformFactory::getInstance()-> setParametersFromPlugin(transform, plugin); input.setChannel(dialog->getChannel()); //!!! The dialog ought to be taking & returning transform //objects and input objects and stuff rather than passing //around all this misc stuff, but that's for tomorrow //(whenever that may be) if (startFrame != 0 || duration != 0) { if (dialog->getSelectionOnly()) { transform.setStartTime(RealTime::frame2RealTime (startFrame, inputModel->getSampleRate())); transform.setDuration(RealTime::frame2RealTime (duration, inputModel->getSampleRate())); } } int stepSize = 0, blockSize = 0; WindowType windowType = HanningWindow; dialog->getProcessingParameters(stepSize, blockSize, windowType); transform.setStepSize(stepSize); transform.setBlockSize(blockSize); transform.setWindowType(windowType); delete dialog; if (effect && source) { source->setAuditioningEffect(0); } return ok; } sonic-visualiser-3.0.3/svapp/framework/TransformUserConfigurator.h0000644000000000000000000000267513111512442023642 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_USER_CONFIGURATOR_H_ #define _TRANSFORM_USER_CONFIGURATOR_H_ #include "transform/ModelTransformerFactory.h" class TransformUserConfigurator : public ModelTransformerFactory::UserConfigurator { public: // This is of course absolutely gross virtual bool configure(ModelTransformer::Input &input, Transform &transform, Vamp::PluginBase *plugin, Model *&inputModel, AudioPlaySource *source, sv_frame_t startFrame, sv_frame_t duration, const QMap &modelMap, QStringList candidateModelNames, QString defaultModelName); static void setParentWidget(QWidget *); private: bool getChannelRange(TransformId identifier, Vamp::PluginBase *plugin, int &min, int &max); }; #endif sonic-visualiser-3.0.3/svapp/framework/VersionTester.cpp0000644000000000000000000000657613111512442021620 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2009 Chris Cannam. */ #include "VersionTester.h" #include "base/Debug.h" #include #include VersionTester::VersionTester(QString hostname, QString versionFilePath, QString myVersion) : m_myVersion(myVersion), m_reply(0), m_httpFailed(false), m_nm(new QNetworkAccessManager) { QUrl url(QString("http://%1/%2").arg(hostname).arg(versionFilePath)); cerr << "VersionTester: URL is " << url << endl; m_reply = m_nm->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError))); connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); } VersionTester::~VersionTester() { if (m_reply) { m_reply->abort(); m_reply->deleteLater(); } delete m_nm; } bool VersionTester::isVersionNewerThan(QString a, QString b) { QRegExp re("[._-]"); QStringList alist = a.split(re, QString::SkipEmptyParts); QStringList blist = b.split(re, QString::SkipEmptyParts); int ae = alist.size(); int be = blist.size(); int e = std::max(ae, be); for (int i = 0; i < e; ++i) { int an = 0, bn = 0; if (i < ae) { an = alist[i].toInt(); if (an == 0 && alist[i] != "0") { an = -1; // non-numeric field -> "-pre1" etc } } if (i < be) { bn = blist[i].toInt(); if (bn == 0 && blist[i] != "0") { bn = -1; } } if (an < bn) return false; if (an > bn) return true; } return false; } void VersionTester::error(QNetworkReply::NetworkError) { cerr << "VersionTester: error: " << m_reply->errorString() << endl; m_httpFailed = true; } void VersionTester::finished() { QNetworkReply *r = m_reply; m_reply = 0; r->deleteLater(); if (m_httpFailed) return; int status = r->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (status / 100 != 2) { cerr << "VersionTester: error: http status = " << status << endl; return; } QByteArray responseData = r->readAll(); QString str = QString::fromUtf8(responseData.data()); QStringList lines = str.split('\n', QString::SkipEmptyParts); if (lines.empty()) return; QString latestVersion = lines[0]; cerr << "Comparing current version \"" << m_myVersion << "\" with latest version \"" << latestVersion << "\"" << endl; if (isVersionNewerThan(latestVersion, m_myVersion)) { cerr << "Latest version \"" << latestVersion << "\" is newer than current version \"" << m_myVersion << "\"" << endl; emit newerVersionAvailable(latestVersion); } } sonic-visualiser-3.0.3/svapp/framework/VersionTester.h0000644000000000000000000000257113111512442021254 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2009 Chris Cannam. */ #ifndef _VERSION_TESTER_H_ #define _VERSION_TESTER_H_ #include #include #include #include class QNetworkAccessManager; class VersionTester : public QObject { Q_OBJECT public: VersionTester(QString hostname, QString versionFilePath, QString myVersion); virtual ~VersionTester(); static bool isVersionNewerThan(QString, QString); signals: void newerVersionAvailable(QString); protected slots: void finished(); void error(QNetworkReply::NetworkError); private: QString m_myVersion; QNetworkReply *m_reply; bool m_httpFailed; QNetworkAccessManager *m_nm; }; #endif sonic-visualiser-3.0.3/svapp/install-sh0000755000000000000000000003246413111512442016302 0ustar 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-3.0.3/svapp/svapp.pro0000644000000000000000000000072013111512442016137 0ustar 00000000000000 TEMPLATE = lib INCLUDEPATH += ../vamp-plugin-sdk exists(config.pri) { include(config.pri) } CONFIG += staticlib qt thread warn_on stl rtti exceptions c++11 QT += network xml gui widgets TARGET = svapp DEPENDPATH += . ../bqaudioio ../svcore ../svgui ../piper-cpp INCLUDEPATH += . ../bqaudioio ../svcore ../svgui ../piper-cpp OBJECTS_DIR = o MOC_DIR = o include(files.pri) HEADERS = $$(SVAPP_HEADERS) SOURCES = $$(SVAPP_SOURCES) sonic-visualiser-3.0.3/svcore/.hgignore0000644000000000000000000000016713111512442016244 0ustar 00000000000000syntax: glob Makefile */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej sonic-visualiser-3.0.3/svcore/.hgtags0000644000000000000000000000360113111512442015713 0ustar 0000000000000021792a550ec982d3b5977197dec26aa3d628ead6 last-cc-copyright 21f86744d38e829c18637dffbdb351df1efee2cc sv-v1.4 2fc6f3829f04c5ef0ff171d9b97d0a0a5343f185 sv1-1.0rc1 40db5491bcf82c7c3294eddc2a83d3efee69e15c sv1-1.0pre2 40db5491bcf82c7c3294eddc2a83d3efee69e15c sv1-1.0pre3 4cd620bd4c619a2ddaa5dc1b6c4495c8ab2847c7 sv1-1.0pre1 4fa2b135acbcdd43d024f32cb4e240f8363c1815 sv-v1.6 524bcd89743b72caa6c1e78233df00659f9d2ec3 sv1-v1.0 62789d79b98f21aca19745c134671382c616a1cd sv1-v1.2pre4 7033e188b2b2fe6dba6887965739e94a2c1a1e08 sv1-1.0pre4 7207e3eba44f15bb62dc2f4d1c412ce08e3f61d7 sv-v1.4rc1 7cc6b7b0d8193b256ab9d8d85c792cb58dc0abda sv1-v1.2pre3 9867f99e0bb7b2cf540e22c483a783304332c67e sv1-v1.2 b1dc68507e463e65a9dcd6024a83880eb9130279 sv-v1.7.1 bc4712c7d269c4718d37cf4747a15c1fbcdc768b sv1-v1.2pre5 c30728d5625c58dae94f65c2a6f54e4512d2ee10 sv1-v0.9rc1 cff476cfce772d06f660ef73ce9642b1285518e7 sv1-v1.3 cff476cfce772d06f660ef73ce9642b1285518e7 sv1-v1.3rc1 dfc4dd561bb6bc3df4126b800b686a0940271a74 sv-v1.5pre1 eb1b517f5eeb2847374394683dbd835088e84b18 sv-v1.7 f19437971e17e5acd1aa0b103fb62192c9c287fa sv-v1.7.2 f9cf4b49b08bea3021486ee5f1179ccab21efd38 sv-v1.5 fda016f64f7cec6818fe821a010997e7b65d6838 sv1-v0.9rc2 611a4fa14dde377cc8d9778d10bd2b39f197a835 sv_v1.8 97fbb6b3e7496c55a99afd3920f86446363dc8fa sv_v1.9 b1b40fa0cf9cc84486fb4c42433e903ec1fbecd7 sonic-annotator-0.6 97fbb6b3e7496c55a99afd3920f86446363dc8fa sv_v1.9 579b2da21e7ad4e661e865ba7104c286fac3d510 sv_v1.9 579b2da21e7ad4e661e865ba7104c286fac3d510 sv_v1.9 9a0272c2d596b144ab145466cd8752c196a2016d sv_v1.9 aca6e61eaea35a9c3f865a68521820b17cce7d3d sv_v2.0 383f0b9458d2910c0ad70759e1f44da39ef1b196 sonic-annotator-0.7 dc6c0e50724cc1eea8d77177f9e9a5d3c5d4cebd 2.0.1_osx c808c57e556048f4e9bdffa09cee691cd73b6466 sonic-annotator-1.0 67003fb58ba4d69022a4af9339e54bb60158683a sv_v2.1 67003fb58ba4d69022a4af9339e54bb60158683a sv_v2.1 f85050b6f5229c083f639811aa39a87c8afa7820 sv_v2.1 sonic-visualiser-3.0.3/svcore/.tonioni0000644000000000000000000000000013111512442016103 0ustar 00000000000000sonic-visualiser-3.0.3/svcore/COPYING0000644000000000000000000003543313111512442015500 0ustar 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 sonic-visualiser-3.0.3/svcore/Doxyfile0000644000000000000000000014265513111512442016160 0ustar 00000000000000# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = svcore # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = base data/fft data/fileio data/midi data/model data/osc plugin plugin/plugins transform rdf system # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-3.0.3/svcore/INSTALL.txt0000644000000000000000000000401313111512442016302 0ustar 00000000000000 To compile from source ---------------------- This file provides various instructions useful when compiling the SV libraries from source, but it doesn't have a complete recipe for any one platform -- there are too many variables. However, you can find a recipe for one platform (Ubuntu Linux) in the file INSTALL.ubuntu. To build, run $ ./configure && make The following additional libraries are required or optional when building the SV core libraries: REQUIRED Qt v4.4 or newer http://qt.nokia.com/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Redland RDF libraries http://librdf.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://www.annodex.net/software/libraries.html Optional liblo OSC library http://www.plugin.org.uk/liblo/ The Redland RDF libraries include the Raptor RDF parser library, Rasqal RDF query library, and librdf, the Redland RDF datastore (which depends on both of those). The SV libraries require all of these. If you are going to build the rest of the SV libraries, you will also need one or more of: Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have one or the other of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). If you happen to be using a Debian-based Linux, you probably want to apt-get install the following packages: libqt4-dev libsndfile1-dev libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev librdf0-dev . sonic-visualiser-3.0.3/svcore/acinclude.m40000644000000000000000000002160413111512442016631 0ustar 00000000000000 AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, $QTDIR/bin/qt5-qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, qt5-qmake,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) # From autoconf archive: # ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # # The first argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The second argument, if specified 'mandatory' or if left unspecified, # indicates that baseline C++11 support is required and that the macro # should error out if no mode with that support is found. If specified # 'optional', then configuration proceeds regardless, after defining # HAVE_CXX11 if and only if a supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014 Alexey Sokolov # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; ]]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi AC_SUBST(HAVE_CXX11) fi ]) sonic-visualiser-3.0.3/svcore/base/AudioLevel.cpp0000644000000000000000000001641613111512442020114 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include "AudioLevel.h" #include #include #include #include #include #include "system/System.h" const double AudioLevel::DB_FLOOR = -1000.; struct FaderDescription { FaderDescription(double _minDb, double _maxDb, double _zeroPoint) : minDb(_minDb), maxDb(_maxDb), zeroPoint(_zeroPoint) { } double minDb; double maxDb; double zeroPoint; // as fraction of total throw }; static const FaderDescription faderTypes[] = { FaderDescription(-40., +6., 0.75), // short FaderDescription(-70., +10., 0.80), // long FaderDescription(-70., 0., 1.00), // IEC268 FaderDescription(-70., +10., 0.80), // IEC268 long FaderDescription(-40., 0., 1.00), // preview }; //typedef std::vector LevelList; //static std::map previewLevelCache; //static const LevelList &getPreviewLevelCache(int levels); double AudioLevel::multiplier_to_dB(double multiplier) { if (multiplier == 0.) return DB_FLOOR; else if (multiplier < 0.) return multiplier_to_dB(-multiplier); double dB = 10 * log10(multiplier); return dB; } double AudioLevel::dB_to_multiplier(double dB) { if (dB == DB_FLOOR) return 0.; double m = pow(10., dB / 10.); return m; } /* IEC 60-268-18 fader levels. Thanks to Steve Harris. */ static double iec_dB_to_fader(double db) { double def = 0.0f; // Meter deflection %age if (db < -70.0f) { def = 0.0f; } else if (db < -60.0f) { def = (db + 70.0f) * 0.25f; } else if (db < -50.0f) { def = (db + 60.0f) * 0.5f + 2.5f; // corrected from 5.0f base, thanks Robin Gareus } else if (db < -40.0f) { def = (db + 50.0f) * 0.75f + 7.5f; } else if (db < -30.0f) { def = (db + 40.0f) * 1.5f + 15.0f; } else if (db < -20.0f) { def = (db + 30.0f) * 2.0f + 30.0f; } else { def = (db + 20.0f) * 2.5f + 50.0f; } return def; } static double iec_fader_to_dB(double def) // Meter deflection %age { double db = 0.0f; if (def >= 50.0f) { db = (def - 50.0f) / 2.5f - 20.0f; } else if (def >= 30.0f) { db = (def - 30.0f) / 2.0f - 30.0f; } else if (def >= 15.0f) { db = (def - 15.0f) / 1.5f - 40.0f; } else if (def >= 7.5f) { db = (def - 7.5f) / 0.75f - 50.0f; } else if (def >= 2.5f) { db = (def - 2.5f) / 0.5f - 60.0f; } else { db = (def / 0.25f) - 70.0f; } return db; } double AudioLevel::fader_to_dB(int level, int maxLevel, FaderType type) { if (level == 0) return DB_FLOOR; if (type == IEC268Meter || type == IEC268LongMeter) { double maxPercent = iec_dB_to_fader(faderTypes[type].maxDb); double percent = double(level) * maxPercent / double(maxLevel); double dB = iec_fader_to_dB(percent); return dB; } else { // scale proportional to sqrt(fabs(dB)) int zeroLevel = int(maxLevel * faderTypes[type].zeroPoint); if (level >= zeroLevel) { double value = level - zeroLevel; double scale = (maxLevel - zeroLevel) / sqrt(faderTypes[type].maxDb); value /= scale; double dB = pow(value, 2.); return dB; } else { double value = zeroLevel - level; double scale = zeroLevel / sqrt(0. - faderTypes[type].minDb); value /= scale; double dB = pow(value, 2.); return 0. - dB; } } } int AudioLevel::dB_to_fader(double dB, int maxLevel, FaderType type) { if (dB == DB_FLOOR) return 0; if (type == IEC268Meter || type == IEC268LongMeter) { // The IEC scale gives a "percentage travel" for a given dB // level, but it reaches 100% at 0dB. So we want to treat the // result not as a percentage, but as a scale between 0 and // whatever the "percentage" for our (possibly >0dB) max dB is. double maxPercent = iec_dB_to_fader(faderTypes[type].maxDb); double percent = iec_dB_to_fader(dB); int faderLevel = int((maxLevel * percent) / maxPercent + 0.01f); if (faderLevel < 0) faderLevel = 0; if (faderLevel > maxLevel) faderLevel = maxLevel; return faderLevel; } else { int zeroLevel = int(maxLevel * faderTypes[type].zeroPoint); if (dB >= 0.) { if (faderTypes[type].maxDb <= 0.) { return maxLevel; } else { double value = sqrt(dB); double scale = (maxLevel - zeroLevel) / sqrt(faderTypes[type].maxDb); value *= scale; int level = int(value + 0.01f) + zeroLevel; if (level > maxLevel) level = maxLevel; return level; } } else { dB = 0. - dB; double value = sqrt(dB); double scale = zeroLevel / sqrt(0. - faderTypes[type].minDb); value *= scale; int level = zeroLevel - int(value + 0.01f); if (level < 0) level = 0; return level; } } } double AudioLevel::fader_to_multiplier(int level, int maxLevel, FaderType type) { if (level == 0) return 0.; return dB_to_multiplier(fader_to_dB(level, maxLevel, type)); } int AudioLevel::multiplier_to_fader(double multiplier, int maxLevel, FaderType type) { if (multiplier == 0.) return 0; double dB = multiplier_to_dB(multiplier); int fader = dB_to_fader(dB, maxLevel, type); return fader; } /* const LevelList & getPreviewLevelCache(int levels) { LevelList &ll = previewLevelCache[levels]; if (ll.empty()) { for (int i = 0; i <= levels; ++i) { double m = AudioLevel::fader_to_multiplier (i + levels/4, levels + levels/4, AudioLevel::PreviewLevel); if (levels == 1) m /= 100; // noise ll.push_back(m); } } return ll; } */ int AudioLevel::multiplier_to_preview(double m, int levels) { assert(levels > 0); return multiplier_to_fader(m, levels, PreviewLevel); /* The original multiplier_to_preview which follows is not thread-safe. if (m < 0.) return -multiplier_to_preview(-m, levels); const LevelList &ll = getPreviewLevelCache(levels); int result = -1; int lo = 0, hi = levels; // binary search int level = -1; while (result < 0) { int newlevel = (lo + hi) / 2; if (newlevel == level || newlevel == 0 || newlevel == levels) { result = newlevel; break; } level = newlevel; if (ll[level] >= m) { hi = level; } else if (ll[level+1] >= m) { result = level; } else { lo = level; } } return result; */ } double AudioLevel::preview_to_multiplier(int level, int levels) { assert(levels > 0); return fader_to_multiplier(level, levels, PreviewLevel); /* if (level < 0) return -preview_to_multiplier(-level, levels); const LevelList &ll = getPreviewLevelCache(levels); return ll[level]; */ } sonic-visualiser-3.0.3/svcore/base/AudioLevel.h0000644000000000000000000000404113111512442017550 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _AUDIO_LEVEL_H_ #define _AUDIO_LEVEL_H_ /** * AudioLevel converts audio sample levels between various scales: * * - dB values (-inf -> 0dB) * - floating-point values (-1.0 -> 1.0) such as used for a * multiplier for gain or in floating-point WAV files * - integer values intended to correspond to pixels on a fader * or vu level scale. */ class AudioLevel { public: static const double DB_FLOOR; enum FaderType { ShortFader = 0, // -40 -> +6 dB LongFader = 1, // -70 -> +10 dB IEC268Meter = 2, // -70 -> 0 dB IEC268LongMeter = 3, // -70 -> +10 dB (0dB aligns with LongFader) PreviewLevel = 4 }; static double multiplier_to_dB(double multiplier); static double dB_to_multiplier(double dB); static double fader_to_dB(int level, int maxLevel, FaderType type); static int dB_to_fader(double dB, int maxFaderLevel, FaderType type); static double fader_to_multiplier(int level, int maxLevel, FaderType type); static int multiplier_to_fader(double multiplier, int maxFaderLevel, FaderType type); // fast if "levels" doesn't change often -- for audio segment previews static int multiplier_to_preview(double multiplier, int levels); static double preview_to_multiplier(int level, int levels); }; #endif sonic-visualiser-3.0.3/svcore/base/AudioPlaySource.h0000644000000000000000000000673413111512442020602 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_AUDIO_PLAY_SOURCE_H #define SV_AUDIO_PLAY_SOURCE_H #include "BaseTypes.h" struct Auditionable { virtual ~Auditionable() { } }; /** * Simple interface for audio playback. This should be all that the * ViewManager needs to know about to synchronise with playback by * sample frame, but it doesn't provide enough to determine what is * actually being played or how. See the audioio directory for a * concrete subclass. */ class AudioPlaySource { public: virtual ~AudioPlaySource() { } /** * Start playing from the given frame. If playback is already * under way, reseek to the given frame and continue. */ virtual void play(sv_frame_t startFrame) = 0; /** * Stop playback. */ virtual void stop() = 0; /** * Return whether playback is currently supposed to be happening. */ virtual bool isPlaying() const = 0; /** * Return the frame number that is currently expected to be coming * out of the speakers. (i.e. compensating for playback latency.) */ virtual sv_frame_t getCurrentPlayingFrame() = 0; /** * Return the current (or thereabouts) output levels in the range * 0.0 -> 1.0, for metering purposes. The values returned are * peak values since the last call to this function was made * (i.e. calling this function also resets them). */ virtual bool getOutputLevels(float &left, float &right) = 0; /** * Return the sample rate of the source material -- any material * that wants to play at a different rate will sound wrong. */ virtual sv_samplerate_t getSourceSampleRate() const = 0; /** * Return the sample rate set by the target audio device (or 0 if * the target hasn't told us yet). If the source and target * sample rates differ, resampling will occur. * * Note that we don't actually do any processing at the device * sample rate. All processing happens at the source sample rate, * and then a resampler is applied if necessary at the interface * between application and driver layer. */ virtual sv_samplerate_t getDeviceSampleRate() const = 0; /** * Get the block size of the target audio device. This may be an * estimate or upper bound, if the target has a variable block * size; the source should behave itself even if this value turns * out to be inaccurate. */ virtual int getTargetBlockSize() const = 0; /** * Get the number of channels of audio that will be provided * to the play target. This may be more than the source channel * count: for example, a mono source will provide 2 channels * after pan. */ virtual int getTargetChannelCount() const = 0; /** * Set a plugin or other subclass of Auditionable as an * auditioning effect. */ virtual void setAuditioningEffect(Auditionable *) = 0; }; #endif sonic-visualiser-3.0.3/svcore/base/AudioRecordTarget.h0000644000000000000000000000264113111512442021072 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_AUDIO_RECORD_TARGET_H #define SV_AUDIO_RECORD_TARGET_H #include "BaseTypes.h" /** * The record target API used by the view manager. See also AudioPlaySource. */ class AudioRecordTarget { public: virtual ~AudioRecordTarget() { } /** * Return whether recording is currently happening. */ virtual bool isRecording() const = 0; /** * Return the approximate duration of the audio recording so far. */ virtual sv_frame_t getRecordDuration() const = 0; /** * Return the current (or thereabouts) input levels in the range * 0.0 -> 1.0, for metering purposes. Only valid while recording. * The values returned are peak values since the last call to this * function was made (i.e. calling this function also resets them). */ virtual bool getInputLevels(float &left, float &right) = 0; }; #endif sonic-visualiser-3.0.3/svcore/base/BaseTypes.h0000644000000000000000000000367213111512442017427 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef BASE_TYPES_H #define BASE_TYPES_H #include #include #include #include /** Frame index, the unit of our time axis. This is signed because the axis conceptually extends below zero: zero represents the start of the main loaded audio model, not the start of time; a windowed transform could legitimately produce results before then. We also use this for frame counts, simply to avoid error-prone arithmetic between signed and unsigned types. */ typedef int64_t sv_frame_t; /** Check whether an integer index is in range for a container, avoiding overflows and signed/unsigned comparison warnings. */ template bool in_range_for(const C &container, T i) { if (i < 0) return false; if (sizeof(T) > sizeof(typename C::size_type)) { return i < static_cast(container.size()); } else { return static_cast(i) < container.size(); } } /** Sample rate. We have to deal with sample rates provided as float or (unsigned) int types, so we might as well have a type that can represent both. Storage size isn't an issue anyway. */ typedef double sv_samplerate_t; typedef std::vector> floatvec_t; typedef std::vector, breakfastquay::StlAllocator>> complexvec_t; #endif sonic-visualiser-3.0.3/svcore/base/Clipboard.cpp0000644000000000000000000001343213111512442017755 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Clipboard.h" Clipboard::Point::Point(sv_frame_t frame, QString label) : m_haveFrame(true), m_frame(frame), m_haveValue(false), m_value(0), m_haveDuration(false), m_duration(0), m_haveLabel(true), m_label(label), m_haveLevel(false), m_level(0.f), m_haveReferenceFrame(false), m_referenceFrame(frame) { } Clipboard::Point::Point(sv_frame_t frame, float value, QString label) : m_haveFrame(true), m_frame(frame), m_haveValue(true), m_value(value), m_haveDuration(false), m_duration(0), m_haveLabel(true), m_label(label), m_haveLevel(false), m_level(0.f), m_haveReferenceFrame(false), m_referenceFrame(frame) { } Clipboard::Point::Point(sv_frame_t frame, float value, sv_frame_t duration, QString label) : m_haveFrame(true), m_frame(frame), m_haveValue(true), m_value(value), m_haveDuration(true), m_duration(duration), m_haveLabel(true), m_label(label), m_haveLevel(false), m_level(0.f), m_haveReferenceFrame(false), m_referenceFrame(frame) { } Clipboard::Point::Point(sv_frame_t frame, float value, sv_frame_t duration, float level, QString label) : m_haveFrame(true), m_frame(frame), m_haveValue(true), m_value(value), m_haveDuration(true), m_duration(duration), m_haveLabel(true), m_label(label), m_haveLevel(true), m_level(level), m_haveReferenceFrame(false), m_referenceFrame(frame) { } Clipboard::Point::Point(const Point &point) : m_haveFrame(point.m_haveFrame), m_frame(point.m_frame), m_haveValue(point.m_haveValue), m_value(point.m_value), m_haveDuration(point.m_haveDuration), m_duration(point.m_duration), m_haveLabel(point.m_haveLabel), m_label(point.m_label), m_haveLevel(point.m_haveLevel), m_level(point.m_level), m_haveReferenceFrame(point.m_haveReferenceFrame), m_referenceFrame(point.m_referenceFrame) { } Clipboard::Point & Clipboard::Point::operator=(const Point &point) { if (this == &point) return *this; m_haveFrame = point.m_haveFrame; m_frame = point.m_frame; m_haveValue = point.m_haveValue; m_value = point.m_value; m_haveDuration = point.m_haveDuration; m_duration = point.m_duration; m_haveLabel = point.m_haveLabel; m_label = point.m_label; m_haveLevel = point.m_haveLevel; m_level = point.m_level; m_haveReferenceFrame = point.m_haveReferenceFrame; m_referenceFrame = point.m_referenceFrame; return *this; } bool Clipboard::Point::haveFrame() const { return m_haveFrame; } sv_frame_t Clipboard::Point::getFrame() const { return m_frame; } Clipboard::Point Clipboard::Point::withFrame(sv_frame_t frame) const { Point p(*this); p.m_haveFrame = true; p.m_frame = frame; return p; } bool Clipboard::Point::haveValue() const { return m_haveValue; } float Clipboard::Point::getValue() const { return m_value; } Clipboard::Point Clipboard::Point::withValue(float value) const { Point p(*this); p.m_haveValue = true; p.m_value = value; return p; } bool Clipboard::Point::haveDuration() const { return m_haveDuration; } sv_frame_t Clipboard::Point::getDuration() const { return m_duration; } Clipboard::Point Clipboard::Point::withDuration(sv_frame_t duration) const { Point p(*this); p.m_haveDuration = true; p.m_duration = duration; return p; } bool Clipboard::Point::haveLabel() const { return m_haveLabel; } QString Clipboard::Point::getLabel() const { return m_label; } Clipboard::Point Clipboard::Point::withLabel(QString label) const { Point p(*this); p.m_haveLabel = true; p.m_label = label; return p; } bool Clipboard::Point::haveLevel() const { return m_haveLevel; } float Clipboard::Point::getLevel() const { return m_level; } Clipboard::Point Clipboard::Point::withLevel(float level) const { Point p(*this); p.m_haveLevel = true; p.m_level = level; return p; } bool Clipboard::Point::haveReferenceFrame() const { return m_haveReferenceFrame; } bool Clipboard::Point::referenceFrameDiffers() const { return m_haveReferenceFrame && (m_referenceFrame != m_frame); } sv_frame_t Clipboard::Point::getReferenceFrame() const { return m_referenceFrame; } void Clipboard::Point::setReferenceFrame(sv_frame_t f) { m_haveReferenceFrame = true; m_referenceFrame = f; } Clipboard::Clipboard() { } Clipboard::~Clipboard() { } void Clipboard::clear() { m_points.clear(); } bool Clipboard::empty() const { return m_points.empty(); } const Clipboard::PointList & Clipboard::getPoints() const { return m_points; } void Clipboard::setPoints(const PointList &pl) { m_points = pl; } void Clipboard::addPoint(const Point &point) { m_points.push_back(point); } bool Clipboard::haveReferenceFrames() const { for (PointList::const_iterator i = m_points.begin(); i != m_points.end(); ++i) { if (i->haveReferenceFrame()) return true; } return false; } bool Clipboard::referenceFramesDiffer() const { for (PointList::const_iterator i = m_points.begin(); i != m_points.end(); ++i) { if (i->referenceFrameDiffers()) return true; } return false; } sonic-visualiser-3.0.3/svcore/base/Clipboard.h0000644000000000000000000000514413111512442017423 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _CLIPBOARD_H_ #define _CLIPBOARD_H_ #include #include #include "BaseTypes.h" class Clipboard { public: class Point { public: Point(sv_frame_t frame, QString label); Point(sv_frame_t frame, float value, QString label); Point(sv_frame_t frame, float value, sv_frame_t duration, QString label); Point(sv_frame_t frame, float value, sv_frame_t duration, float level, QString label); Point(const Point &point); Point &operator=(const Point &point); bool haveFrame() const; sv_frame_t getFrame() const; Point withFrame(sv_frame_t frame) const; bool haveValue() const; float getValue() const; Point withValue(float value) const; bool haveDuration() const; sv_frame_t getDuration() const; Point withDuration(sv_frame_t duration) const; bool haveLabel() const; QString getLabel() const; Point withLabel(QString label) const; bool haveLevel() const; float getLevel() const; Point withLevel(float level) const; bool haveReferenceFrame() const; bool referenceFrameDiffers() const; // from point frame sv_frame_t getReferenceFrame() const; void setReferenceFrame(sv_frame_t); private: bool m_haveFrame; sv_frame_t m_frame; bool m_haveValue; float m_value; bool m_haveDuration; sv_frame_t m_duration; bool m_haveLabel; QString m_label; bool m_haveLevel; float m_level; bool m_haveReferenceFrame; sv_frame_t m_referenceFrame; }; Clipboard(); ~Clipboard(); typedef std::vector PointList; void clear(); bool empty() const; const PointList &getPoints() const; void setPoints(const PointList &points); void addPoint(const Point &point); bool haveReferenceFrames() const; bool referenceFramesDiffer() const; protected: PointList m_points; }; #endif sonic-visualiser-3.0.3/svcore/base/ColumnOp.cpp0000644000000000000000000001243613111512442017615 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColumnOp.h" #include #include #include #include "base/Debug.h" using namespace std; ColumnOp::Column ColumnOp::fftScale(const Column &in, int fftSize) { return applyGain(in, 2.0 / fftSize); } ColumnOp::Column ColumnOp::peakPick(const Column &in) { vector out(in.size(), 0.f); for (int i = 0; in_range_for(in, i); ++i) { if (isPeak(in, i)) { out[i] = in[i]; } } return out; } ColumnOp::Column ColumnOp::normalize(const Column &in, ColumnNormalization n) { if (n == ColumnNormalization::None || in.empty()) { return in; } float shift = 0.f; float scale = 1.f; if (n == ColumnNormalization::Range01) { float min = 0.f; float max = 0.f; bool have = false; for (auto v: in) { if (v < min || !have) { min = v; } if (v > max || !have) { max = v; } have = true; } if (min != 0.f) { shift = -min; max -= min; } if (max != 0.f) { scale = 1.f / max; } } else if (n == ColumnNormalization::Sum1) { float sum = 0.f; for (auto v: in) { sum += fabsf(v); } if (sum != 0.f) { scale = 1.f / sum; } } else { float max = 0.f; for (auto v: in) { v = fabsf(v); if (v > max) { max = v; } } if (n == ColumnNormalization::Max1) { if (max != 0.f) { scale = 1.f / max; } } else if (n == ColumnNormalization::Hybrid) { if (max > 0.f) { scale = log10f(max + 1.f) / max; } } } return applyGain(applyShift(in, shift), scale); } ColumnOp::Column ColumnOp::distribute(const Column &in, int h, const vector &binfory, int minbin, bool interpolate) { vector out(h, 0.f); int bins = int(in.size()); if (interpolate) { // If the bins are all closer together than the target y // coordinate increments, then we don't want to interpolate // after all. But because the binfory mapping isn't // necessarily linear, just checking e.g. whether bins > h is // not enough -- the bins could still be spaced more widely at // either end of the scale. We are prepared to assume however // that if the bins are closer at both ends of the scale, they // aren't going to diverge mysteriously in the middle. if (h > 1 && fabs(binfory[1] - binfory[0]) >= 1.0 && fabs(binfory[h-1] - binfory[h-2]) >= 1.0) { interpolate = false; } } for (int y = 0; y < h; ++y) { if (interpolate) { double sy = binfory[y] - minbin - 0.5; double syf = floor(sy); int mainbin = int(syf); int other = mainbin; if (sy > syf) { other = mainbin + 1; } else if (sy < syf) { other = mainbin - 1; } if (mainbin < 0) { mainbin = 0; } if (mainbin >= bins) { mainbin = bins - 1; } if (other < 0) { other = 0; } if (other >= bins) { other = bins - 1; } double prop = 1.0 - fabs(sy - syf); double v0 = in[mainbin]; double v1 = in[other]; out[y] = float(prop * v0 + (1.0 - prop) * v1); } else { double sy0 = binfory[y] - minbin; double sy1; if (y+1 < h) { sy1 = binfory[y+1] - minbin; } else { sy1 = bins; } int by0 = int(sy0 + 0.0001); int by1 = int(sy1 + 0.0001); if (by0 < 0 || by0 >= bins || by1 > bins) { SVCERR << "ERROR: bin index out of range in ColumnOp::distribute: by0 = " << by0 << ", by1 = " << by1 << ", sy0 = " << sy0 << ", sy1 = " << sy1 << ", y = " << y << ", binfory[y] = " << binfory[y] << ", minbin = " << minbin << ", bins = " << bins << endl; continue; } for (int bin = by0; bin == by0 || bin < by1; ++bin) { float value = in[bin]; if (bin == by0 || value > out[y]) { out[y] = value; } } } } return out; } sonic-visualiser-3.0.3/svcore/base/ColumnOp.h0000644000000000000000000000746213111512442017265 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef COLUMN_OP_H #define COLUMN_OP_H #include "BaseTypes.h" #include /** * Display normalization types for columns in e.g. grid plots. * * Max1 means to normalize to max value = 1.0. * Sum1 means to normalize to sum of values = 1.0. * * Range01 means to normalize such that the max value = 1.0 and the * min value (if different from the max value) = 0.0. * * Hybrid means normalize to max = 1.0 and then multiply by * log10 of the max value, to retain some difference between * levels of neighbouring columns. * * Area normalization is handled separately. */ enum class ColumnNormalization { None, Max1, Sum1, Range01, Hybrid }; /** * Class containing static functions for simple operations on data * columns, for use by display layers. */ class ColumnOp { public: /** * Column type. */ typedef std::vector Column; /** * Scale the given column using the given gain multiplier. */ static Column applyGain(const Column &in, double gain) { if (gain == 1.0) return in; Column out; out.reserve(in.size()); for (auto v: in) out.push_back(float(v * gain)); return out; } /** * Shift the values in the given column by the given offset. */ static Column applyShift(const Column &in, float offset) { if (offset == 0.f) return in; Column out; out.reserve(in.size()); for (auto v: in) out.push_back(v + offset); return out; } /** * Scale an FFT output downward by half the FFT size. */ static Column fftScale(const Column &in, int fftSize); /** * Determine whether an index points to a local peak. */ static bool isPeak(const Column &in, int ix) { if (!in_range_for(in, ix)) { return false; } if (ix == 0) { return in[0] >= in[1]; } if (!in_range_for(in, ix+1)) { return in[ix] > in[ix-1]; } if (in[ix] < in[ix+1]) { return false; } if (in[ix] <= in[ix-1]) { return false; } return true; } /** * Return a column containing only the local peak values (all * others zero). */ static Column peakPick(const Column &in); /** * Return a column normalized from the input column according to * the given normalization scheme. * * Note that the sum or max (as appropriate) used for * normalisation will be calculated from the absolute values of * the column elements, should any of them be negative. */ static Column normalize(const Column &in, ColumnNormalization n); /** * Distribute the given column into a target vector of a different * size, optionally using linear interpolation. The binfory vector * contains a mapping from y coordinate (i.e. index into the * target vector) to bin (i.e. index into the source column). The * source column ("in") may be a partial column; it's assumed to * contain enough bins to span the destination range, starting * with the bin of index minbin. */ static Column distribute(const Column &in, int h, const std::vector &binfory, int minbin, bool interpolate); }; #endif sonic-visualiser-3.0.3/svcore/base/Command.cpp0000644000000000000000000000357713111512442017445 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Command.h" #include MacroCommand::MacroCommand(QString name) : m_name(name) { } MacroCommand::~MacroCommand() { for (size_t i = 0; i < m_commands.size(); ++i) { delete m_commands[i]; } } void MacroCommand::addCommand(Command *command) { m_commands.push_back(command); } void MacroCommand::deleteCommand(Command *command) { for (std::vector::iterator i = m_commands.begin(); i != m_commands.end(); ++i) { if (*i == command) { m_commands.erase(i); delete command; return; } } } bool MacroCommand::haveCommands() const { return !m_commands.empty(); } void MacroCommand::execute() { for (size_t i = 0; i < m_commands.size(); ++i) { m_commands[i]->execute(); } } void MacroCommand::unexecute() { for (size_t i = 0; i < m_commands.size(); ++i) { m_commands[m_commands.size() - i - 1]->unexecute(); } } QString MacroCommand::getName() const { return m_name; } void MacroCommand::setName(QString name) { m_name = name; } BundleCommand::BundleCommand(QString name) : MacroCommand(name) { } BundleCommand::~BundleCommand() { } QString BundleCommand::getName() const { if (m_commands.size() == 1) return m_name; return tr("%1 (%n change(s))", "", int(m_commands.size())).arg(m_name); } sonic-visualiser-3.0.3/svcore/base/Command.h0000644000000000000000000000330413111512442017076 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _COMMAND_H_ #define _COMMAND_H_ #include #include #include #include "Debug.h" class Command { public: virtual ~Command() { } virtual void execute() = 0; virtual void unexecute() = 0; virtual QString getName() const = 0; }; class MacroCommand : public Command { public: MacroCommand(QString name); virtual ~MacroCommand(); virtual void addCommand(Command *command); virtual void deleteCommand(Command *command); virtual bool haveCommands() const; virtual void execute(); virtual void unexecute(); virtual QString getName() const; virtual void setName(QString name); protected: QString m_name; std::vector m_commands; }; /** * BundleCommand is a MacroCommand whose name includes a note of how * many commands it contains. It is a QObject with Q_OBJECT macro so * that it can do plural-sensitive translations. */ class BundleCommand : public QObject, public MacroCommand { Q_OBJECT public: BundleCommand(QString name); virtual ~BundleCommand(); virtual QString getName() const; }; #endif sonic-visualiser-3.0.3/svcore/base/DataExportOptions.h0000644000000000000000000000141513111512442021150 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef DATA_EXPORT_OPTIONS_H #define DATA_EXPORT_OPTIONS_H enum DataExportOption { DataExportDefaults = 0x0, DataExportFillGaps = 0x1, DataExportOmitLevels = 0x2, }; typedef int DataExportOptions; #endif sonic-visualiser-3.0.3/svcore/base/Debug.cpp0000644000000000000000000000540513111512442017105 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2010-2011 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Debug.h" #include "ResourceFinder.h" #include #include #include #include #include static SVDebug *svdebug = 0; static SVCerr *svcerr = 0; static QMutex mutex; SVDebug &getSVDebug() { mutex.lock(); if (!svdebug) { svdebug = new SVDebug(); } mutex.unlock(); return *svdebug; } SVCerr &getSVCerr() { mutex.lock(); if (!svcerr) { if (!svdebug) { svdebug = new SVDebug(); } svcerr = new SVCerr(*svdebug); } mutex.unlock(); return *svcerr; } bool SVDebug::m_silenced = false; bool SVCerr::m_silenced = false; SVDebug::SVDebug() : m_prefix(0), m_ok(false), m_eol(true) { if (m_silenced) return; if (qApp->applicationName() == "") { cerr << "ERROR: Can't use SVDEBUG before setting application name" << endl; throw std::logic_error("Can't use SVDEBUG before setting application name"); } QString pfx = ResourceFinder().getUserResourcePrefix(); QDir logdir(QString("%1/%2").arg(pfx).arg("log")); m_prefix = strdup(QString("[%1]") .arg(QCoreApplication::applicationPid()) .toLatin1().data()); //!!! what to do if mkpath fails? if (!logdir.exists()) logdir.mkpath(logdir.path()); QString fileName = logdir.path() + "/sv-debug.log"; m_stream.open(fileName.toLocal8Bit().data(), std::ios_base::out); if (!m_stream) { QDebug(QtWarningMsg) << (const char *)m_prefix << "Failed to open debug log file " << fileName << " for writing"; } else { // cerr << m_prefix << ": Log file is " << fileName << endl; m_ok = true; } } SVDebug::~SVDebug() { if (m_stream) m_stream.close(); } QDebug & operator<<(QDebug &dbg, const std::string &s) { dbg << QString::fromUtf8(s.c_str()); return dbg; } std::ostream & operator<<(std::ostream &target, const QString &str) { return target << str.toStdString(); } std::ostream & operator<<(std::ostream &target, const QUrl &u) { return target << "<" << u.toString().toStdString() << ">"; } sonic-visualiser-3.0.3/svcore/base/Debug.h0000644000000000000000000000463313111512442016554 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2010-2011 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_DEBUG_H #define SV_DEBUG_H #include #include #include "RealTime.h" #include #include #include class QString; class QUrl; QDebug &operator<<(QDebug &, const std::string &); std::ostream &operator<<(std::ostream &, const QString &); std::ostream &operator<<(std::ostream &, const QUrl &); using std::cout; using std::cerr; using std::endl; class SVDebug { public: SVDebug(); ~SVDebug(); template inline SVDebug &operator<<(const T &t) { if (m_silenced) return *this; if (m_ok) { if (m_eol) { m_stream << m_prefix << " "; } m_stream << t; m_eol = false; } return *this; } inline SVDebug &operator<<(QTextStreamFunction) { if (m_silenced) return *this; m_stream << std::endl; m_eol = true; return *this; } static void silence() { m_silenced = true; } private: std::fstream m_stream; char *m_prefix; bool m_ok; bool m_eol; static bool m_silenced; }; class SVCerr { public: SVCerr(SVDebug &d) : m_d(d) { } template inline SVCerr &operator<<(const T &t) { if (m_silenced) return *this; m_d << t; cerr << t; return *this; } inline SVCerr &operator<<(QTextStreamFunction f) { if (m_silenced) return *this; m_d << f; cerr << std::endl; return *this; } static void silence() { m_silenced = true; } private: SVDebug &m_d; static bool m_silenced; }; extern SVDebug &getSVDebug(); extern SVCerr &getSVCerr(); // Writes to debug log only #define SVDEBUG getSVDebug() // Writes to both SVDEBUG and cerr #define SVCERR getSVCerr() #endif /* !_DEBUG_H_ */ sonic-visualiser-3.0.3/svcore/base/Exceptions.cpp0000644000000000000000000000717013111512442020201 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Exceptions.h" #include #include "Debug.h" FileNotFound::FileNotFound(QString file) throw() : m_file(file) { cerr << "ERROR: File not found: " << file << endl; } const char * FileNotFound::what() const throw() { return QString("File \"%1\" not found") .arg(m_file).toLocal8Bit().data(); } FailedToOpenFile::FailedToOpenFile(QString file) throw() : m_file(file) { cerr << "ERROR: Failed to open file: " << file << endl; } const char * FailedToOpenFile::what() const throw() { return QString("Failed to open file \"%1\"") .arg(m_file).toLocal8Bit().data(); } DirectoryCreationFailed::DirectoryCreationFailed(QString directory) throw() : m_directory(directory) { cerr << "ERROR: Directory creation failed for directory: " << directory << endl; } const char * DirectoryCreationFailed::what() const throw() { return QString("Directory creation failed for \"%1\"") .arg(m_directory).toLocal8Bit().data(); } FileReadFailed::FileReadFailed(QString file) throw() : m_file(file) { cerr << "ERROR: File read failed for file: " << file << endl; } const char * FileReadFailed::what() const throw() { return QString("File read failed for \"%1\"") .arg(m_file).toLocal8Bit().data(); } FileOperationFailed::FileOperationFailed(QString file, QString op) throw() : m_file(file), m_operation(op) { cerr << "ERROR: File " << op << " failed for file: " << file << endl; } const char * FileOperationFailed::what() const throw() { return QString("File %1 failed for \"%2\"") .arg(m_operation).arg(m_file).toLocal8Bit().data(); } InsufficientDiscSpace::InsufficientDiscSpace(QString directory, size_t required, size_t available) throw() : m_directory(directory), m_required(required), m_available(available) { cerr << "ERROR: Not enough disc space available in " << directory << ": need " << required << ", only have " << available << endl; } InsufficientDiscSpace::InsufficientDiscSpace(QString directory) throw() : m_directory(directory), m_required(0), m_available(0) { cerr << "ERROR: Not enough disc space available in " << directory << endl; } const char * InsufficientDiscSpace::what() const throw() { if (m_required > 0) { return QString("Not enough space available in \"%1\": need %2, have %3") .arg(m_directory).arg(m_required).arg(m_available).toLocal8Bit().data(); } else { return QString("Not enough space available in \"%1\"") .arg(m_directory).toLocal8Bit().data(); } } AllocationFailed::AllocationFailed(QString purpose) throw() : m_purpose(purpose) { cerr << "ERROR: Allocation failed: " << purpose << endl; } const char * AllocationFailed::what() const throw() { return QString("Allocation failed: %1") .arg(m_purpose).toLocal8Bit().data(); } sonic-visualiser-3.0.3/svcore/base/Exceptions.h0000644000000000000000000000536413111512442017651 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _EXCEPTIONS_H_ #define _EXCEPTIONS_H_ #include #include #include "Debug.h" class FileNotFound : virtual public std::exception { public: FileNotFound(QString file) throw(); virtual ~FileNotFound() throw() { } virtual const char *what() const throw(); protected: QString m_file; }; class FailedToOpenFile : virtual public std::exception { public: FailedToOpenFile(QString file) throw(); virtual ~FailedToOpenFile() throw() { } virtual const char *what() const throw(); protected: QString m_file; }; class DirectoryCreationFailed : virtual public std::exception { public: DirectoryCreationFailed(QString directory) throw(); virtual ~DirectoryCreationFailed() throw() { } virtual const char *what() const throw(); protected: QString m_directory; }; class FileReadFailed : virtual public std::exception { public: FileReadFailed(QString file) throw(); virtual ~FileReadFailed() throw() { } virtual const char *what() const throw(); protected: QString m_file; }; class FileOperationFailed : virtual public std::exception { public: FileOperationFailed(QString file, QString operation) throw(); virtual ~FileOperationFailed() throw() { } virtual const char *what() const throw(); protected: QString m_file; QString m_operation; }; class InsufficientDiscSpace : virtual public std::exception { public: InsufficientDiscSpace(QString directory, size_t required, size_t available) throw(); InsufficientDiscSpace(QString directory) throw(); virtual ~InsufficientDiscSpace() throw() { } virtual const char *what() const throw(); QString getDirectory() const { return m_directory; } size_t getRequired() const { return m_required; } size_t getAvailable() const { return m_available; } protected: QString m_directory; size_t m_required; size_t m_available; }; class AllocationFailed : virtual public std::exception { public: AllocationFailed(QString purpose) throw(); virtual ~AllocationFailed() throw() { } virtual const char *what() const throw(); protected: QString m_purpose; }; #endif sonic-visualiser-3.0.3/svcore/base/FrameTimer.h0000644000000000000000000000170313111512442017554 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FRAME_TIMER_H_ #define _FRAME_TIMER_H_ #include "BaseTypes.h" /** * A trivial interface for things that permit retrieving "the current * frame". Implementations of this interface are used, for example, * for timestamping incoming MIDI events when tapping to MIDI. */ class FrameTimer { public: virtual sv_frame_t getFrame() const = 0; }; #endif sonic-visualiser-3.0.3/svcore/base/HelperExecPath.cpp0000644000000000000000000000512113111512442020713 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "HelperExecPath.h" #include #include #include #include QStringList HelperExecPath::getTags() { if (sizeof(void *) == 8) { if (m_type == NativeArchitectureOnly) { return { "64", "" }; } else { return { "64", "", "32" }; } } else { return { "", "32" }; } } static bool isGood(QString path) { return QFile(path).exists() && QFileInfo(path).isExecutable(); } QList HelperExecPath::getHelperExecutables(QString basename) { QStringList dummy; return search(basename, dummy); } QString HelperExecPath::getHelperExecutable(QString basename) { auto execs = getHelperExecutables(basename); if (execs.empty()) return ""; else return execs[0].executable; } QStringList HelperExecPath::getHelperDirPaths() { QStringList dirs; QString myDir = QCoreApplication::applicationDirPath(); dirs.push_back(myDir + "/helpers"); dirs.push_back(myDir); return dirs; } QStringList HelperExecPath::getHelperCandidatePaths(QString basename) { QStringList candidates; (void)search(basename, candidates); return candidates; } QList HelperExecPath::search(QString basename, QStringList &candidates) { // Helpers are expected to exist either in the same directory as // this executable was found, or in a subdirectory called helpers. QString extension = ""; #ifdef _WIN32 extension = ".exe"; #endif QList executables; QStringList dirs = getHelperDirPaths(); for (QString t: getTags()) { for (QString d: dirs) { QString path = d + QDir::separator() + basename; if (t != QString()) path += "-" + t; path += extension; candidates.push_back(path); if (isGood(path)) { executables.push_back({ path, t }); break; } } } return executables; } sonic-visualiser-3.0.3/svcore/base/HelperExecPath.h0000644000000000000000000000537613111512442020374 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_HELPER_EXEC_PATH_H #define SV_HELPER_EXEC_PATH_H #include /** * Class to find helper executables that have been installed alongside * the application. There may be more than one executable available * with a given base name, because it's possible to have more than one * implementation of a given service. For example, a plugin helper or * scanner may exist in both 32-bit and 64-bit variants. * * This class encodes both the expected locations of helper * executables, and the expected priority between different * implementations (e.g. preferring the architecture that matches that * of the host). */ class HelperExecPath { public: enum SearchType { NativeArchitectureOnly, AllInstalled }; HelperExecPath(SearchType type) : m_type(type) { } /** * Find a helper executable with the given base name in the bundle * directory or installation location, if one exists, and return * its full path. Equivalent to calling getHelperExecutables() and * taking the first result from the returned list (or "" if empty). */ QString getHelperExecutable(QString basename); struct HelperExec { QString executable; QString tag; }; /** * Find all helper executables with the given base name in the * bundle directory or installation location, and return their * full paths in order of priority. The "tag" string contains an * identifier for the location or architecture of the helper, for * example "32", "64", "js" etc. An empty tag signifies a default * helper that matches the application's architecture. */ QList getHelperExecutables(QString basename); /** * Return the list of directories searched for helper * executables. */ QStringList getHelperDirPaths(); /** * Return the list of executable paths examined in the search for * the helper executable with the given basename. */ QStringList getHelperCandidatePaths(QString basename); private: SearchType m_type; QList search(QString, QStringList &); QStringList getTags(); }; #endif sonic-visualiser-3.0.3/svcore/base/HitCount.h0000644000000000000000000000322413111512442017256 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef HIT_COUNT_H #define HIT_COUNT_H #include #include /** * Profile class for counting cache hits and the like. */ class HitCount { public: HitCount(std::string name) : m_name(name), m_hit(0), m_partial(0), m_miss(0) { } ~HitCount() { #ifndef NO_HIT_COUNTS using namespace std; int total = m_hit + m_partial + m_miss; cerr << "Hit count: " << m_name << ": "; if (m_partial > 0) { cerr << m_hit << " hits, " << m_partial << " partial, " << m_miss << " misses"; } else { cerr << m_hit << " hits, " << m_miss << " misses"; } if (total > 0) { if (m_partial > 0) { cerr << " (" << ((m_hit * 100.0) / total) << "%, " << ((m_partial * 100.0) / total) << "%, " << ((m_miss * 100.0) / total) << "%)"; } else { cerr << " (" << ((m_hit * 100.0) / total) << "%, " << ((m_miss * 100.0) / total) << "%)"; } } cerr << endl; #endif } void hit() { ++m_hit; } void partial() { ++m_partial; } void miss() { ++m_miss; } private: std::string m_name; int m_hit; int m_partial; int m_miss; }; #endif sonic-visualiser-3.0.3/svcore/base/LogRange.cpp0000644000000000000000000000570713111512442017562 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "LogRange.h" #include "system/System.h" #include #include #include void LogRange::mapRange(double &min, double &max, double logthresh) { static double eps = 1e-10; // ensure that max > min: if (min > max) std::swap(min, max); if (max == min) max = min + 1; if (min >= 0.0) { // and max > min, so we know min >= 0 and max > 0 max = log10(max); if (min == 0.0) min = std::min(logthresh, max); else min = log10(min); } else if (max <= 0.0) { // and max > min, so we know min < 0 and max <= 0 min = log10(-min); if (max == 0.0) max = std::min(logthresh, min); else max = log10(-max); std::swap(min, max); } else { // min < 0 and max > 0 max = log10(std::max(max, -min)); min = std::min(logthresh, max); } if (fabs(max - min) < eps) min = max - 1; } double LogRange::map(double value, double thresh) { if (value == 0.0) return thresh; return log10(fabs(value)); } double LogRange::unmap(double value) { return pow(10.0, value); } static double sd(const std::vector &values, int start, int n) { double sum = 0.0, mean = 0.0, variance = 0.0; for (int i = 0; i < n; ++i) { sum += values[start + i]; } mean = sum / n; for (int i = 0; i < n; ++i) { double diff = values[start + i] - mean; variance += diff * diff; } variance = variance / n; return sqrt(variance); } bool LogRange::shouldUseLogScale(std::vector values) { // Principle: Partition the data into two sets around the median; // calculate the standard deviation of each set; if the two SDs // are very different, it's likely that a log scale would be good. int n = int(values.size()); if (n < 4) return false; std::sort(values.begin(), values.end()); int mi = n / 2; double sd0 = sd(values, 0, mi); double sd1 = sd(values, mi, n - mi); SVDEBUG << "LogRange::useLogScale: sd0 = " << sd0 << ", sd1 = " << sd1 << endl; if (sd0 == 0 || sd1 == 0) return false; // I wonder what method of determining "one sd much bigger than // the other" would be appropriate here... if (std::max(sd0, sd1) / std::min(sd0, sd1) > 10.) return true; else return false; } sonic-visualiser-3.0.3/svcore/base/LogRange.h0000644000000000000000000000335113111512442017220 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LOG_RANGE_H_ #define _LOG_RANGE_H_ #include #include "Debug.h" class LogRange { public: /** * Map a value onto a logarithmic range. This just means taking * the base-10 log of the absolute value, or using the threshold * value if the absolute value is zero. */ static double map(double value, double thresh = -10); /** * Map a value from the logarithmic range back again. This just * means taking the value'th power of ten. */ static double unmap(double value); /** * Map a linear range onto a logarithmic range. min and max are * passed as the extents of the linear range and returned as the * extents of the logarithmic range. thresh is the minimum value * for the log range, to be used if the linear range spans zero. */ static void mapRange(double &min, double &max, double thresh = -10); /** * Estimate whether a set of values would be more properly shown * using a logarithmic than a linear scale. This is only ever * going to be a rough guess. */ static bool shouldUseLogScale(std::vector values); }; #endif sonic-visualiser-3.0.3/svcore/base/MagnitudeRange.h0000644000000000000000000000425213111512442020415 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef MAGNITUDE_RANGE_H #define MAGNITUDE_RANGE_H #include /** * Maintain a min and max value, and update them when supplied a new * data point. */ class MagnitudeRange { public: MagnitudeRange() : m_min(0), m_max(0) { } MagnitudeRange(float min, float max) : m_min(min), m_max(max) { } bool operator==(const MagnitudeRange &r) { return r.m_min == m_min && r.m_max == m_max; } bool operator!=(const MagnitudeRange &r) { return !(*this == r); } bool isSet() const { return (m_min != 0.f || m_max != 0.f); } void set(float min, float max) { m_min = min; m_max = max; if (m_max < m_min) m_max = m_min; } bool sample(float f) { bool changed = false; if (isSet()) { if (f < m_min) { m_min = f; changed = true; } if (f > m_max) { m_max = f; changed = true; } } else { m_max = m_min = f; changed = true; } return changed; } bool sample(const std::vector &ff) { bool changed = false; for (auto f: ff) { if (sample(f)) { changed = true; } } return changed; } bool sample(const MagnitudeRange &r) { bool changed = false; if (isSet()) { if (r.m_min < m_min) { m_min = r.m_min; changed = true; } if (r.m_max > m_max) { m_max = r.m_max; changed = true; } } else { m_min = r.m_min; m_max = r.m_max; changed = true; } return changed; } float getMin() const { return m_min; } float getMax() const { return m_max; } private: float m_min; float m_max; }; #endif sonic-visualiser-3.0.3/svcore/base/Pitch.cpp0000644000000000000000000001317713111512442017133 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Pitch.h" #include "Preferences.h" #include "system/System.h" #include double Pitch::getFrequencyForPitch(int midiPitch, double centsOffset, double concertA) { if (concertA <= 0.0) { concertA = Preferences::getInstance()->getTuningFrequency(); } double p = double(midiPitch) + (centsOffset / 100); return concertA * pow(2.0, (p - 69.0) / 12.0); } int Pitch::getPitchForFrequency(double frequency, double *centsOffsetReturn, double concertA) { if (concertA <= 0.0) { concertA = Preferences::getInstance()->getTuningFrequency(); } double p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0; int midiPitch = int(round(p)); double centsOffset = (p - midiPitch) * 100.0; if (centsOffset >= 50.0) { midiPitch = midiPitch + 1; centsOffset = -(100.0 - centsOffset); } if (centsOffset < -50.0) { midiPitch = midiPitch - 1; centsOffset = (100.0 + centsOffset); } if (centsOffsetReturn) *centsOffsetReturn = centsOffset; return midiPitch; } int Pitch::getPitchForFrequencyDifference(double frequencyA, double frequencyB, double *centsOffsetReturn, double concertA) { if (concertA <= 0.0) { concertA = Preferences::getInstance()->getTuningFrequency(); } if (frequencyA > frequencyB) { std::swap(frequencyA, frequencyB); } double pA = 12.0 * (log(frequencyA / (concertA / 2.0)) / log(2.0)) + 57.0; double pB = 12.0 * (log(frequencyB / (concertA / 2.0)) / log(2.0)) + 57.0; double p = pB - pA; int midiPitch = int(p + 0.00001); double centsOffset = (p - midiPitch) * 100.0; if (centsOffset >= 50.0) { midiPitch = midiPitch + 1; centsOffset = -(100.0 - centsOffset); } if (centsOffsetReturn) *centsOffsetReturn = centsOffset; return midiPitch; } static QString notes[] = { "C%1", "C#%1", "D%1", "D#%1", "E%1", "F%1", "F#%1", "G%1", "G#%1", "A%1", "A#%1", "B%1" }; static QString flatNotes[] = { "C%1", "Db%1", "D%1", "Eb%1", "E%1", "F%1", "Gb%1", "G%1", "Ab%1", "A%1", "Bb%1", "B%1" }; int Pitch::getPitchForNoteAndOctave(int note, int octave) { int baseOctave = Preferences::getInstance()->getOctaveOfLowestMIDINote(); return (octave - baseOctave) * 12 + note; } void Pitch::getNoteAndOctaveForPitch(int midiPitch, int ¬e, int &octave) { int baseOctave = Preferences::getInstance()->getOctaveOfLowestMIDINote(); octave = baseOctave; // Note, this only gets the right octave number at octave // boundaries because Cb is enharmonic with B (not B#) and B# is // enharmonic with C (not Cb). So neither B# nor Cb will be // spelled from a MIDI pitch + flats flag in isolation. if (midiPitch < 0) { while (midiPitch < 0) { midiPitch += 12; --octave; } } else { octave = midiPitch / 12 + baseOctave; } note = midiPitch % 12; } QString Pitch::getPitchLabel(int midiPitch, double centsOffset, bool useFlats) { int note, octave; getNoteAndOctaveForPitch(midiPitch, note, octave); QString plain = (useFlats ? flatNotes : notes)[note].arg(octave); long ic = lrint(centsOffset); if (ic == 0) return plain; else if (ic > 0) return QString("%1+%2c").arg(plain).arg(ic); else return QString("%1%2c").arg(plain).arg(ic); } QString Pitch::getPitchLabelForFrequency(double frequency, double concertA, bool useFlats) { if (concertA <= 0.0) { concertA = Preferences::getInstance()->getTuningFrequency(); } double centsOffset = 0.0; int midiPitch = getPitchForFrequency(frequency, ¢sOffset, concertA); return getPitchLabel(midiPitch, centsOffset, useFlats); } QString Pitch::getLabelForPitchRange(int semis, double cents) { if (semis > 0) { while (cents < 0.0) { --semis; cents += 100.0; } } if (semis < 0) { while (cents > 0.0) { ++semis; cents -= 100.0; } } long ic = lrint(cents); if (ic == 0) { if (semis >= 12) { return QString("%1'%2").arg(semis/12).arg(semis - 12*(semis/12)); } else { return QString("%1").arg(semis); } } else { if (ic > 0) { if (semis >= 12) { return QString("%1'%2+%3c").arg(semis/12).arg(semis - 12*(semis/12)).arg(ic); } else { return QString("%1+%3c").arg(semis).arg(ic); } } else { if (semis >= 12) { return QString("%1'%2%3c").arg(semis/12).arg(semis - 12*(semis/12)).arg(ic); } else { return QString("%1%3c").arg(semis).arg(ic); } } } } bool Pitch::isFrequencyInMidiRange(double frequency, double concertA) { double centsOffset = 0.0; int midiPitch = getPitchForFrequency(frequency, ¢sOffset, concertA); return (midiPitch >= 0 && midiPitch < 128); } sonic-visualiser-3.0.3/svcore/base/Pitch.h0000644000000000000000000001501613111512442016572 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PITCH_H_ #define _PITCH_H_ #include class Pitch { public: /** * Return the frequency at the given MIDI pitch plus centsOffset * cents (1/100ths of a semitone). centsOffset does not have to * be in any particular range or sign. * * If concertA is non-zero, use that as the reference frequency * for the A at MIDI pitch 69; otherwise use the tuning frequency * specified in the application preferences (default 440Hz). */ static double getFrequencyForPitch(int midiPitch, double centsOffset = 0, double concertA = 0.0); /** * Return the nearest MIDI pitch to the given frequency. * * If centsOffsetReturn is non-NULL, return in *centsOffsetReturn * the number of cents (1/100ths of a semitone) difference between * the given frequency and that of the returned MIDI pitch. The * cents offset will be in the range [-50,50). * * If concertA is non-zero, use that as the reference frequency * for the A at MIDI pitch 69; otherwise use the tuning frequency * specified in the application preferences (default 440Hz). */ static int getPitchForFrequency(double frequency, double *centsOffsetReturn = 0, double concertA = 0.0); /** * Compatibility version of getPitchForFrequency accepting float * pointer argument. */ static int getPitchForFrequency(double frequency, float *centsOffsetReturn, double concertA = 0.0) { double c; int p = getPitchForFrequency(frequency, &c, concertA); if (centsOffsetReturn) *centsOffsetReturn = float(c); return p; } /** * Return the nearest MIDI pitch range to the given frequency * range, that is, the difference in MIDI pitch values between the * higher and lower frequencies. * * If centsOffsetReturn is non-NULL, return in *centsOffsetReturn * the number of cents (1/100ths of a semitone) difference between * the given frequency difference and the returned MIDI pitch * range. The cents offset will be in the range [-50,50). * * If concertA is non-zero, use that as the reference frequency * for the A at MIDI pitch 69; otherwise use the tuning frequency * specified in the application preferences (default 440Hz). */ static int getPitchForFrequencyDifference(double frequencyA, double frequencyB, double *centsOffsetReturn = 0, double concertA = 0.0); /** * Compatibility version of getPitchForFrequencyDifference * accepting float pointer argument. */ static int getPitchForFrequencyDifference(double frequencyA, double frequencyB, float *centsOffsetReturn, double concertA = 0.0) { double c; int p = getPitchForFrequencyDifference(frequencyA, frequencyB, &c, concertA); if (centsOffsetReturn) *centsOffsetReturn = float(c); return p; } /** * Return the MIDI pitch for the given note number (0-12 where 0 * is C) and octave number. The octave numbering system is based * on the application preferences (default is C4 = middle C, * though in previous SV releases that was C3). */ static int getPitchForNoteAndOctave(int note, int octave); /** * Return the note number (0-12 where 0 is C) and octave number * for the given MIDI pitch. The octave numbering system is based * on the application preferences (default is C4 = middle C, * though in previous SV releases that was C3). */ static void getNoteAndOctaveForPitch(int midiPitch, int ¬e, int &octave); /** * Return a string describing the given MIDI pitch, with optional * cents offset. This consists of the note name, octave number, * and optional cents. The octave numbering system is based on the * application preferences (default is C4 = middle C, though in * previous SV releases that was C3). * * For example, "A#3" (A# in octave 3) or "C2-12c" (C in octave 2, * minus 12 cents). * * If useFlats is true, spell notes with flats instead of sharps, * e.g. Bb3 instead of A#3. */ static QString getPitchLabel(int midiPitch, double centsOffset = 0, bool useFlats = false); /** * Return a string describing the nearest MIDI pitch to the given * frequency, with cents offset. * * If concertA is non-zero, use that as the reference frequency * for the A at MIDI pitch 69; otherwise use the tuning frequency * specified in the application preferences (default 440Hz). * * If useFlats is true, spell notes with flats instead of sharps, * e.g. Bb3 instead of A#3. */ static QString getPitchLabelForFrequency(double frequency, double concertA = 0.0, bool useFlats = false); /** * Return a string describing the given pitch range in octaves, * semitones and cents. This is in the form e.g. "1'2+4c". */ static QString getLabelForPitchRange(int semis, double cents = 0); /** * Return true if the given frequency falls within the range of * MIDI note pitches, plus or minus half a semitone. This is * equivalent to testing whether getPitchForFrequency returns a * pitch in the MIDI range (0 to 127 inclusive) with any cents * offset. * * If concertA is non-zero, use that as the reference frequency * for the A at MIDI pitch 69; otherwise use the tuning frequency * specified in the application preferences (default 440Hz). */ static bool isFrequencyInMidiRange(double frequency, double concertA = 0.0); }; #endif sonic-visualiser-3.0.3/svcore/base/PlayParameterRepository.cpp0000644000000000000000000001266713111512442022735 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PlayParameterRepository.h" #include "PlayParameters.h" #include "Playable.h" #include PlayParameterRepository * PlayParameterRepository::m_instance = new PlayParameterRepository; PlayParameterRepository * PlayParameterRepository::getInstance() { return m_instance; } PlayParameterRepository::~PlayParameterRepository() { } void PlayParameterRepository::addPlayable(const Playable *playable) { // cerr << "PlayParameterRepository:addPlayable playable = " << playable << endl; if (!getPlayParameters(playable)) { // Give all playables the same type of play parameters for the // moment // cerr << "PlayParameterRepository:addPlayable: Adding play parameters for " << playable << endl; PlayParameters *params = new PlayParameters; m_playParameters[playable] = params; params->setPlayClipId (playable->getDefaultPlayClipId()); params->setPlayAudible (playable->getDefaultPlayAudible()); connect(params, SIGNAL(playParametersChanged()), this, SLOT(playParametersChanged())); connect(params, SIGNAL(playClipIdChanged(QString)), this, SLOT(playClipIdChanged(QString))); // cerr << "Connected play parameters " << params << " for playable " // << playable << " to this " << this << endl; } } void PlayParameterRepository::removePlayable(const Playable *playable) { if (m_playParameters.find(playable) == m_playParameters.end()) { cerr << "WARNING: PlayParameterRepository::removePlayable: unknown playable " << playable << endl; return; } delete m_playParameters[playable]; m_playParameters.erase(playable); } void PlayParameterRepository::copyParameters(const Playable *from, const Playable *to) { if (!getPlayParameters(from)) { cerr << "ERROR: PlayParameterRepository::copyParameters: source playable unknown" << endl; return; } if (!getPlayParameters(to)) { cerr << "WARNING: PlayParameterRepository::copyParameters: target playable unknown, adding it now" << endl; addPlayable(to); } getPlayParameters(to)->copyFrom(getPlayParameters(from)); } PlayParameters * PlayParameterRepository::getPlayParameters(const Playable *playable) { if (m_playParameters.find(playable) == m_playParameters.end()) return 0; return m_playParameters.find(playable)->second; } void PlayParameterRepository::playParametersChanged() { PlayParameters *params = dynamic_cast(sender()); emit playParametersChanged(params); } void PlayParameterRepository::playClipIdChanged(QString id) { PlayParameters *params = dynamic_cast(sender()); for (PlayableParameterMap::iterator i = m_playParameters.begin(); i != m_playParameters.end(); ++i) { if (i->second == params) { emit playClipIdChanged(i->first, id); return; } } } void PlayParameterRepository::clear() { // cerr << "PlayParameterRepository: PlayParameterRepository::clear" << endl; while (!m_playParameters.empty()) { delete m_playParameters.begin()->second; m_playParameters.erase(m_playParameters.begin()); } } PlayParameterRepository::EditCommand::EditCommand(PlayParameters *params) : m_params(params) { m_from.copyFrom(m_params); m_to.copyFrom(m_params); } void PlayParameterRepository::EditCommand::setPlayMuted(bool muted) { m_to.setPlayMuted(muted); } void PlayParameterRepository::EditCommand::setPlayAudible(bool audible) { m_to.setPlayAudible(audible); } void PlayParameterRepository::EditCommand::setPlayPan(float pan) { m_to.setPlayPan(pan); } void PlayParameterRepository::EditCommand::setPlayGain(float gain) { m_to.setPlayGain(gain); } void PlayParameterRepository::EditCommand::setPlayClipId(QString id) { m_to.setPlayClipId(id); } void PlayParameterRepository::EditCommand::execute() { m_params->copyFrom(&m_to); } void PlayParameterRepository::EditCommand::unexecute() { m_params->copyFrom(&m_from); } QString PlayParameterRepository::EditCommand::getName() const { QString name; QString multiname = tr("Adjust Playback Parameters"); int changed = 0; if (m_to.isPlayAudible() != m_from.isPlayAudible()) { name = tr("Change Playback Mute State"); if (++changed > 1) return multiname; } if (m_to.getPlayGain() != m_from.getPlayGain()) { name = tr("Change Playback Gain"); if (++changed > 1) return multiname; } if (m_to.getPlayPan() != m_from.getPlayPan()) { name = tr("Change Playback Pan"); if (++changed > 1) return multiname; } if (m_to.getPlayClipId() != m_from.getPlayClipId()) { name = tr("Change Playback Sample"); if (++changed > 1) return multiname; } if (name == "") return multiname; return name; } sonic-visualiser-3.0.3/svcore/base/PlayParameterRepository.h0000644000000000000000000000405113111512442022366 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLAY_PARAMETER_REPOSITORY_H_ #define _PLAY_PARAMETER_REPOSITORY_H_ #include "PlayParameters.h" #include "Command.h" class Playable; #include #include #include class PlayParameterRepository : public QObject { Q_OBJECT public: static PlayParameterRepository *getInstance(); virtual ~PlayParameterRepository(); void addPlayable(const Playable *playable); void removePlayable(const Playable *playable); void copyParameters(const Playable *from, const Playable *to); PlayParameters *getPlayParameters(const Playable *playable); void clear(); class EditCommand : public Command { public: EditCommand(PlayParameters *params); void setPlayMuted(bool); void setPlayAudible(bool); void setPlayPan(float); void setPlayGain(float); void setPlayClipId(QString); void execute(); void unexecute(); QString getName() const; protected: PlayParameters *m_params; PlayParameters m_from; PlayParameters m_to; }; signals: void playParametersChanged(PlayParameters *); void playClipIdChanged(const Playable *, QString); protected slots: void playParametersChanged(); void playClipIdChanged(QString); protected: typedef std::map PlayableParameterMap; PlayableParameterMap m_playParameters; static PlayParameterRepository *m_instance; }; #endif sonic-visualiser-3.0.3/svcore/base/PlayParameters.cpp0000644000000000000000000000627213111512442021013 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PlayParameters.h" #include #include void PlayParameters::copyFrom(const PlayParameters *pp) { bool changed = false; if (m_playMuted != pp->isPlayMuted()) { m_playMuted = pp->isPlayMuted(); emit playMutedChanged(m_playMuted); emit playAudibleChanged(!m_playMuted); changed = true; } if (m_playPan != pp->getPlayPan()) { m_playPan = pp->getPlayPan(); emit playPanChanged(m_playPan); changed = true; } if (m_playGain != pp->getPlayGain()) { m_playGain = pp->getPlayGain(); emit playGainChanged(m_playGain); changed = true; } if (m_playClipId != pp->getPlayClipId()) { m_playClipId = pp->getPlayClipId(); emit playClipIdChanged(m_playClipId); changed = true; } if (changed) emit playParametersChanged(); } void PlayParameters::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("\n"; if (m_playClipId != "") { // for backward compatibility stream << indent << " "; stream << QString("\n") .arg("sample_player") .arg(m_playClipId); } stream << indent << "\n"; } void PlayParameters::setPlayMuted(bool muted) { // cerr << "PlayParameters: setPlayMuted(" << muted << ")" << endl; if (m_playMuted != muted) { m_playMuted = muted; emit playMutedChanged(muted); emit playAudibleChanged(!muted); emit playParametersChanged(); } } void PlayParameters::setPlayAudible(bool audible) { // cerr << "PlayParameters(" << this << "): setPlayAudible(" << audible << ")" << endl; setPlayMuted(!audible); } void PlayParameters::setPlayPan(float pan) { if (m_playPan != pan) { m_playPan = pan; emit playPanChanged(pan); emit playParametersChanged(); } } void PlayParameters::setPlayGain(float gain) { if (m_playGain != gain) { m_playGain = gain; emit playGainChanged(gain); emit playParametersChanged(); } } void PlayParameters::setPlayClipId(QString id) { if (m_playClipId != id) { m_playClipId = id; emit playClipIdChanged(id); emit playParametersChanged(); } } sonic-visualiser-3.0.3/svcore/base/PlayParameters.h0000644000000000000000000000404313111512442020452 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLAY_PARAMETERS_H_ #define _PLAY_PARAMETERS_H_ #include #include "XmlExportable.h" class PlayParameters : public QObject, public XmlExportable { Q_OBJECT public: PlayParameters() : m_playMuted(false), m_playPan(0.0), m_playGain(1.0) { } virtual bool isPlayMuted() const { return m_playMuted; } virtual bool isPlayAudible() const { return !m_playMuted; } virtual float getPlayPan() const { return m_playPan; } // -1.0 -> 1.0 virtual float getPlayGain() const { return m_playGain; } virtual QString getPlayClipId() const { return m_playClipId; } virtual void copyFrom(const PlayParameters *); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; public slots: virtual void setPlayMuted(bool muted); virtual void setPlayAudible(bool nonMuted); virtual void setPlayPan(float pan); virtual void setPlayGain(float gain); virtual void setPlayClipId(QString id); signals: void playParametersChanged(); void playMutedChanged(bool); void playAudibleChanged(bool); void playPanChanged(float); void playGainChanged(float); void playClipIdChanged(QString); protected: bool m_playMuted; float m_playPan; float m_playGain; QString m_playClipId; private: PlayParameters(const PlayParameters &); PlayParameters &operator=(const PlayParameters &); }; #endif sonic-visualiser-3.0.3/svcore/base/Playable.h0000644000000000000000000000162313111512442017253 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLAYABLE_H_ #define _PLAYABLE_H_ #include class Playable { public: virtual ~Playable() { } virtual bool canPlay() const { return false; } virtual QString getDefaultPlayClipId() const { return ""; } virtual bool getDefaultPlayAudible() const { return true; } }; #endif sonic-visualiser-3.0.3/svcore/base/Preferences.cpp0000644000000000000000000005203113111512442020315 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Preferences.h" #include "Exceptions.h" #include "TempDirectory.h" #include #include #include #include Preferences * Preferences::m_instance = 0; Preferences * Preferences::getInstance() { if (!m_instance) m_instance = new Preferences(); return m_instance; } Preferences::Preferences() : m_spectrogramSmoothing(SpectrogramInterpolated), m_spectrogramXSmoothing(SpectrogramXInterpolated), m_tuningFrequency(440), m_propertyBoxLayout(VerticallyStacked), m_windowType(HanningWindow), m_runPluginsInProcess(true), m_omitRecentTemps(true), m_tempDirRoot(""), m_fixedSampleRate(0), m_resampleOnLoad(false), m_gapless(true), m_normaliseAudio(false), m_viewFontSize(10), m_backgroundMode(BackgroundFromTheme), m_timeToTextMode(TimeToTextMs), m_showHMS(true), m_octave(4), m_showSplash(true) { QSettings settings; settings.beginGroup("Preferences"); m_spectrogramSmoothing = SpectrogramSmoothing (settings.value("spectrogram-y-smoothing", int(m_spectrogramSmoothing)).toInt()); m_spectrogramXSmoothing = SpectrogramXSmoothing (settings.value("spectrogram-x-smoothing", int(m_spectrogramXSmoothing)).toInt()); m_tuningFrequency = settings.value("tuning-frequency", 440.).toDouble(); m_propertyBoxLayout = PropertyBoxLayout (settings.value("property-box-layout", int(VerticallyStacked)).toInt()); m_windowType = WindowType (settings.value("window-type", int(HanningWindow)).toInt()); m_runPluginsInProcess = settings.value("run-vamp-plugins-in-process", true).toBool(); m_fixedSampleRate = settings.value("fixed-sample-rate", 0).toDouble(); m_resampleOnLoad = settings.value("resample-on-load", false).toBool(); m_gapless = settings.value("gapless", true).toBool(); m_normaliseAudio = settings.value("normalise-audio", false).toBool(); m_backgroundMode = BackgroundMode (settings.value("background-mode", int(BackgroundFromTheme)).toInt()); m_timeToTextMode = TimeToTextMode (settings.value("time-to-text-mode", int(TimeToTextMs)).toInt()); m_showHMS = (settings.value("show-hours-minutes-seconds", true)).toBool(); m_octave = (settings.value("octave-of-middle-c", 4)).toInt(); m_viewFontSize = settings.value("view-font-size", 10).toInt(); m_showSplash = settings.value("show-splash", true).toBool(); settings.endGroup(); settings.beginGroup("TempDirectory"); m_tempDirRoot = settings.value("create-in", "$HOME").toString(); settings.endGroup(); } Preferences::~Preferences() { } Preferences::PropertyList Preferences::getProperties() const { PropertyList props; props.push_back("Spectrogram Y Smoothing"); props.push_back("Spectrogram X Smoothing"); props.push_back("Tuning Frequency"); props.push_back("Property Box Layout"); props.push_back("Window Type"); props.push_back("Resample Quality"); props.push_back("Omit Temporaries from Recent Files"); props.push_back("Resample On Load"); props.push_back("Use Gapless Mode"); props.push_back("Normalise Audio"); props.push_back("Fixed Sample Rate"); props.push_back("Temporary Directory Root"); props.push_back("Background Mode"); props.push_back("Time To Text Mode"); props.push_back("Show Hours And Minutes"); props.push_back("Octave Numbering System"); props.push_back("View Font Size"); props.push_back("Show Splash Screen"); return props; } QString Preferences::getPropertyLabel(const PropertyName &name) const { if (name == "Spectrogram Y Smoothing") { return tr("Spectrogram y-axis interpolation:"); } if (name == "Spectrogram X Smoothing") { return tr("Spectrogram x-axis interpolation:"); } if (name == "Tuning Frequency") { return tr("Frequency of concert A"); } if (name == "Property Box Layout") { return tr("Property box layout"); } if (name == "Window Type") { return tr("Spectral analysis window shape"); } if (name == "Resample Quality") { return tr("Playback resampler type"); } if (name == "Normalise Audio") { return tr("Normalise audio signal when reading from audio file"); } if (name == "Omit Temporaries from Recent Files") { return tr("Omit temporaries from Recent Files menu"); } if (name == "Resample On Load") { return tr("Resample mismatching files on import"); } if (name == "Use Gapless Mode") { return tr("Load mp3 files in gapless mode"); } if (name == "Fixed Sample Rate") { return tr("Single fixed sample rate to resample all files to"); } if (name == "Temporary Directory Root") { return tr("Location for cache file directory"); } if (name == "Background Mode") { return tr("Background colour preference"); } if (name == "Time To Text Mode") { return tr("Time display precision"); } if (name == "Show Hours And Minutes") { return tr("Use hours:minutes:seconds format"); } if (name == "Octave Numbering System") { return tr("Label middle C as"); } if (name == "View Font Size") { return tr("Font size for text overlays"); } if (name == "Show Splash Screen") { return tr("Show splash screen on startup"); } return name; } Preferences::PropertyType Preferences::getPropertyType(const PropertyName &name) const { if (name == "Spectrogram Y Smoothing") { return ValueProperty; } if (name == "Spectrogram X Smoothing") { return ValueProperty; } if (name == "Tuning Frequency") { return RangeProperty; } if (name == "Property Box Layout") { return ValueProperty; } if (name == "Window Type") { return ValueProperty; } if (name == "Resample Quality") { return ValueProperty; } if (name == "Normalise Audio") { return ToggleProperty; } if (name == "Omit Temporaries from Recent Files") { return ToggleProperty; } if (name == "Resample On Load") { return ToggleProperty; } if (name == "Use Gapless Mode") { return ToggleProperty; } if (name == "Fixed Sample Rate") { return ValueProperty; } if (name == "Temporary Directory Root") { // It's an arbitrary string, we don't have a set of values for this return InvalidProperty; } if (name == "Background Mode") { return ValueProperty; } if (name == "Time To Text Mode") { return ValueProperty; } if (name == "Show Hours And Minutes") { return ToggleProperty; } if (name == "Octave Numbering System") { return ValueProperty; } if (name == "View Font Size") { return RangeProperty; } if (name == "Show Splash Screen") { return ToggleProperty; } return InvalidProperty; } int Preferences::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { if (name == "Spectrogram Y Smoothing") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(SpectrogramInterpolated); return int(m_spectrogramSmoothing); } if (name == "Spectrogram X Smoothing") { if (min) *min = 0; if (max) *max = 1; if (deflt) *deflt = int(SpectrogramXInterpolated); return int(m_spectrogramXSmoothing); } //!!! freq mapping if (name == "Property Box Layout") { if (min) *min = 0; if (max) *max = 1; if (deflt) *deflt = 0; return m_propertyBoxLayout == Layered ? 1 : 0; } if (name == "Window Type") { if (min) *min = int(RectangularWindow); if (max) *max = int(BlackmanHarrisWindow); if (deflt) *deflt = int(HanningWindow); return int(m_windowType); } if (name == "Run Vamp Plugins In Process") { return m_runPluginsInProcess; } if (name == "Omit Temporaries from Recent Files") { if (deflt) *deflt = 1; return m_omitRecentTemps ? 1 : 0; } if (name == "Background Mode") { if (min) *min = 0; if (max) *max = 2; if (deflt) *deflt = 0; return int(m_backgroundMode); } if (name == "Time To Text Mode") { if (min) *min = 0; if (max) *max = 6; if (deflt) *deflt = 0; return int(m_timeToTextMode); } if (name == "Show Hours And Minutes") { if (deflt) *deflt = 1; return m_showHMS ? 1 : 0; } if (name == "Octave Numbering System") { // we don't support arbitrary octaves in the gui, because we // want to be able to label what the octave system comes // from. so we support 0, 3, 4 and 5. if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = 2; return int(getSystemWithMiddleCInOctave(m_octave)); } if (name == "View Font Size") { if (min) *min = 3; if (max) *max = 48; if (deflt) *deflt = 10; return int(m_viewFontSize); } if (name == "Show Splash Screen") { if (deflt) *deflt = 1; return m_showSplash ? 1 : 0; } return 0; } QString Preferences::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Property Box Layout") { if (value == 0) return tr("Show boxes for all panes"); else return tr("Show box for current pane only"); } if (name == "Window Type") { switch (WindowType(value)) { case RectangularWindow: return tr("Rectangular"); case BartlettWindow: return tr("Triangular"); case HammingWindow: return tr("Hamming"); case HanningWindow: return tr("Hann"); case BlackmanWindow: return tr("Blackman"); case GaussianWindow: return tr("Gaussian"); case ParzenWindow: return tr("Parzen"); case NuttallWindow: return tr("Nuttall"); case BlackmanHarrisWindow: return tr("Blackman-Harris"); } } if (name == "Resample Quality") { switch (value) { case 0: return tr("Fastest"); case 1: return tr("Standard"); case 2: return tr("Highest quality"); } } if (name == "Spectrogram Y Smoothing") { switch (value) { case NoSpectrogramSmoothing: return tr("None"); case SpectrogramInterpolated: return tr("Linear interpolation"); case SpectrogramZeroPadded: return tr("4 x Oversampling"); case SpectrogramZeroPaddedAndInterpolated: return tr("4 x Oversampling with interpolation"); } } if (name == "Spectrogram X Smoothing") { switch (value) { case NoSpectrogramXSmoothing: return tr("None"); case SpectrogramXInterpolated: return tr("Linear interpolation"); } } if (name == "Background Mode") { switch (value) { case BackgroundFromTheme: return tr("Follow desktop theme"); case DarkBackground: return tr("Dark background"); case LightBackground: return tr("Light background"); } } if (name == "Time To Text Mode") { switch (value) { case TimeToTextMs: return tr("Standard (to millisecond)"); case TimeToTextUs: return tr("High resolution (to microsecond)"); case TimeToText24Frame: return tr("24 FPS"); case TimeToText25Frame: return tr("25 FPS"); case TimeToText30Frame: return tr("30 FPS"); case TimeToText50Frame: return tr("50 FPS"); case TimeToText60Frame: return tr("60 FPS"); } } if (name == "Octave Numbering System") { switch (value) { case C0_Centre: return tr("C0 - middle of octave scale"); case C3_Logic: return tr("C3 - common MIDI sequencer convention"); case C4_ASA: return tr("C4 - ASA American standard"); case C5_Sonar: return tr("C5 - used in Cakewalk and others"); } } return ""; } QString Preferences::getPropertyContainerName() const { return tr("Preferences"); } QString Preferences::getPropertyContainerIconName() const { return "preferences"; } void Preferences::setProperty(const PropertyName &name, int value) { if (name == "Spectrogram Y Smoothing") { setSpectrogramSmoothing(SpectrogramSmoothing(value)); } else if (name == "Spectrogram X Smoothing") { setSpectrogramXSmoothing(SpectrogramXSmoothing(value)); } else if (name == "Tuning Frequency") { //!!! } else if (name == "Property Box Layout") { setPropertyBoxLayout(value == 0 ? VerticallyStacked : Layered); } else if (name == "Window Type") { setWindowType(WindowType(value)); } else if (name == "Run Vamp Plugins In Process") { setRunPluginsInProcess(value ? true : false); } else if (name == "Omit Temporaries from Recent Files") { setOmitTempsFromRecentFiles(value ? true : false); } else if (name == "Background Mode") { setBackgroundMode(BackgroundMode(value)); } else if (name == "Time To Text Mode") { setTimeToTextMode(TimeToTextMode(value)); } else if (name == "Show Hours And Minutes") { setShowHMS(value ? true : false); } else if (name == "Octave Numbering System") { setOctaveOfMiddleC(getOctaveOfMiddleCInSystem (OctaveNumberingSystem(value))); } else if (name == "View Font Size") { setViewFontSize(value); } else if (name == "Show Splash Screen") { setShowSplash(value ? true : false); } } void Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing) { if (m_spectrogramSmoothing != smoothing) { // "smoothing" is one of those words that looks increasingly // ridiculous the more you see it. Smoothing smoothing smoothing. m_spectrogramSmoothing = smoothing; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("spectrogram-y-smoothing", int(smoothing)); settings.endGroup(); emit propertyChanged("Spectrogram Y Smoothing"); } } void Preferences::setSpectrogramXSmoothing(SpectrogramXSmoothing smoothing) { if (m_spectrogramXSmoothing != smoothing) { // "smoothing" is one of those words that looks increasingly // ridiculous the more you see it. Smoothing smoothing smoothing. m_spectrogramXSmoothing = smoothing; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("spectrogram-x-smoothing", int(smoothing)); settings.endGroup(); emit propertyChanged("Spectrogram X Smoothing"); } } void Preferences::setTuningFrequency(double freq) { if (m_tuningFrequency != freq) { m_tuningFrequency = freq; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("tuning-frequency", freq); settings.endGroup(); emit propertyChanged("Tuning Frequency"); } } void Preferences::setPropertyBoxLayout(PropertyBoxLayout layout) { if (m_propertyBoxLayout != layout) { m_propertyBoxLayout = layout; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("property-box-layout", int(layout)); settings.endGroup(); emit propertyChanged("Property Box Layout"); } } void Preferences::setWindowType(WindowType type) { if (m_windowType != type) { m_windowType = type; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("window-type", int(type)); settings.endGroup(); emit propertyChanged("Window Type"); } } void Preferences::setRunPluginsInProcess(bool run) { if (m_runPluginsInProcess != run) { m_runPluginsInProcess = run; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("run-vamp-plugins-in-process", run); settings.endGroup(); emit propertyChanged("Run Vamp Plugins In Process"); } } void Preferences::setOmitTempsFromRecentFiles(bool omit) { if (m_omitRecentTemps != omit) { m_omitRecentTemps = omit; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("omit-recent-temporaries", omit); settings.endGroup(); emit propertyChanged("Omit Temporaries from Recent Files"); } } void Preferences::setTemporaryDirectoryRoot(QString root) { if (root == QDir::home().absolutePath()) { root = "$HOME"; } if (m_tempDirRoot != root) { m_tempDirRoot = root; QSettings settings; settings.beginGroup("TempDirectory"); settings.setValue("create-in", root); settings.endGroup(); emit propertyChanged("Temporary Directory Root"); } } void Preferences::setResampleOnLoad(bool resample) { if (m_resampleOnLoad != resample) { m_resampleOnLoad = resample; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("resample-on-load", resample); settings.endGroup(); emit propertyChanged("Resample On Load"); } } void Preferences::setUseGaplessMode(bool gapless) { if (m_gapless != gapless) { m_gapless = gapless; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("gapless", gapless); settings.endGroup(); emit propertyChanged("Use Gapless Mode"); } } void Preferences::setFixedSampleRate(sv_samplerate_t rate) { if (m_fixedSampleRate != rate) { m_fixedSampleRate = rate; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("fixed-sample-rate", rate); settings.endGroup(); emit propertyChanged("Fixed Sample Rate"); } } void Preferences::setNormaliseAudio(bool norm) { if (m_normaliseAudio != norm) { m_normaliseAudio = norm; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("normalise-audio", norm); settings.endGroup(); emit propertyChanged("Normalise Audio"); } } void Preferences::setBackgroundMode(BackgroundMode mode) { if (m_backgroundMode != mode) { m_backgroundMode = mode; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("background-mode", int(mode)); settings.endGroup(); emit propertyChanged("Background Mode"); } } void Preferences::setTimeToTextMode(TimeToTextMode mode) { if (m_timeToTextMode != mode) { m_timeToTextMode = mode; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("time-to-text-mode", int(mode)); settings.endGroup(); emit propertyChanged("Time To Text Mode"); } } void Preferences::setShowHMS(bool show) { if (m_showHMS != show) { m_showHMS = show; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("show-hours-minutes-seconds", show); settings.endGroup(); emit propertyChanged("Show Hours And Minutes"); } } void Preferences::setOctaveOfMiddleC(int oct) { if (m_octave != oct) { m_octave = oct; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("octave-of-middle-c", int(oct)); settings.endGroup(); emit propertyChanged("Octave Numbering System"); } } int Preferences::getOctaveOfMiddleCInSystem(OctaveNumberingSystem s) { switch (s) { case C0_Centre: return 0; case C3_Logic: return 3; case C4_ASA: return 4; case C5_Sonar: return 5; default: return 4; } } Preferences::OctaveNumberingSystem Preferences::getSystemWithMiddleCInOctave(int o) { switch (o) { case 0: return C0_Centre; case 3: return C3_Logic; case 4: return C4_ASA; case 5: return C5_Sonar; default: return C4_ASA; } } void Preferences::setViewFontSize(int size) { if (m_viewFontSize != size) { m_viewFontSize = size; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("view-font-size", size); settings.endGroup(); emit propertyChanged("View Font Size"); } } void Preferences::setShowSplash(bool show) { if (m_showSplash != show) { m_showSplash = show; QSettings settings; settings.beginGroup("Preferences"); settings.setValue("show-splash", show); settings.endGroup(); emit propertyChanged("Show Splash Screen"); } } sonic-visualiser-3.0.3/svcore/base/Preferences.h0000644000000000000000000001355513111512442017772 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PREFERENCES_H_ #define _PREFERENCES_H_ #include "PropertyContainer.h" #include "Window.h" class Preferences : public PropertyContainer { Q_OBJECT public: static Preferences *getInstance(); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *, int *, int *) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual QString getPropertyContainerName() const; virtual QString getPropertyContainerIconName() const; enum SpectrogramSmoothing { NoSpectrogramSmoothing, SpectrogramInterpolated, SpectrogramZeroPadded, SpectrogramZeroPaddedAndInterpolated }; enum SpectrogramXSmoothing { NoSpectrogramXSmoothing, SpectrogramXInterpolated }; SpectrogramSmoothing getSpectrogramSmoothing() const { return m_spectrogramSmoothing; } SpectrogramXSmoothing getSpectrogramXSmoothing() const { return m_spectrogramXSmoothing; } double getTuningFrequency() const { return m_tuningFrequency; } WindowType getWindowType() const { return m_windowType; } bool getRunPluginsInProcess() const { return m_runPluginsInProcess; } //!!! harmonise with PaneStack enum PropertyBoxLayout { VerticallyStacked, Layered }; PropertyBoxLayout getPropertyBoxLayout() const { return m_propertyBoxLayout; } int getViewFontSize() const { return m_viewFontSize; } bool getOmitTempsFromRecentFiles() const { return m_omitRecentTemps; } QString getTemporaryDirectoryRoot() const { return m_tempDirRoot; } /// If we should always resample audio to the same rate, return it; otherwise (the normal case) return 0 sv_samplerate_t getFixedSampleRate() const { return m_fixedSampleRate; } /// True if we should resample second or subsequent audio file to match first audio file's rate bool getResampleOnLoad() const { return m_resampleOnLoad; } /// True if mp3 files should be loaded "gaplessly", i.e. compensating for encoder/decoder delay and padding bool getUseGaplessMode() const { return m_gapless; } /// True if audio files should be loaded with normalisation (max == 1) bool getNormaliseAudio() const { return m_normaliseAudio; } enum BackgroundMode { BackgroundFromTheme, DarkBackground, LightBackground }; BackgroundMode getBackgroundMode() const { return m_backgroundMode; } enum TimeToTextMode { TimeToTextMs, TimeToTextUs, TimeToText24Frame, TimeToText25Frame, TimeToText30Frame, TimeToText50Frame, TimeToText60Frame }; TimeToTextMode getTimeToTextMode() const { return m_timeToTextMode; } bool getShowHMS() const { return m_showHMS; } int getOctaveOfMiddleC() const { // weed out unsupported octaves return getOctaveOfMiddleCInSystem(getSystemWithMiddleCInOctave(m_octave)); } int getOctaveOfLowestMIDINote() const { return getOctaveOfMiddleC() - 5; } bool getShowSplash() const { return m_showSplash; } public slots: virtual void setProperty(const PropertyName &, int); void setSpectrogramSmoothing(SpectrogramSmoothing smoothing); void setSpectrogramXSmoothing(SpectrogramXSmoothing smoothing); void setTuningFrequency(double freq); void setPropertyBoxLayout(PropertyBoxLayout layout); void setWindowType(WindowType type); void setRunPluginsInProcess(bool r); void setOmitTempsFromRecentFiles(bool omit); void setTemporaryDirectoryRoot(QString tempDirRoot); void setFixedSampleRate(sv_samplerate_t); void setResampleOnLoad(bool); void setUseGaplessMode(bool); void setNormaliseAudio(bool); void setBackgroundMode(BackgroundMode mode); void setTimeToTextMode(TimeToTextMode mode); void setShowHMS(bool show); void setOctaveOfMiddleC(int oct); void setViewFontSize(int size); void setShowSplash(bool); private: Preferences(); // may throw DirectoryCreationFailed virtual ~Preferences(); static Preferences *m_instance; // We don't support arbitrary octaves in the gui, because we want // to be able to label what the octave system comes from. These // are the ones we support. (But we save and load as octave // numbers, so as not to make the prefs format really confusing) enum OctaveNumberingSystem { C0_Centre, C3_Logic, C4_ASA, C5_Sonar }; static int getOctaveOfMiddleCInSystem(OctaveNumberingSystem s); static OctaveNumberingSystem getSystemWithMiddleCInOctave(int o); SpectrogramSmoothing m_spectrogramSmoothing; SpectrogramXSmoothing m_spectrogramXSmoothing; double m_tuningFrequency; PropertyBoxLayout m_propertyBoxLayout; WindowType m_windowType; bool m_runPluginsInProcess; bool m_omitRecentTemps; QString m_tempDirRoot; sv_samplerate_t m_fixedSampleRate; bool m_resampleOnLoad; bool m_gapless; bool m_normaliseAudio; int m_viewFontSize; BackgroundMode m_backgroundMode; TimeToTextMode m_timeToTextMode; bool m_showHMS; int m_octave; bool m_showSplash; }; #endif sonic-visualiser-3.0.3/svcore/base/Profiler.cpp0000644000000000000000000001371413111512442017643 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam, Guillaume Laurent, and QMUL. */ #include #include "Profiler.h" #include #include #include #include #include Profiles* Profiles::m_instance = 0; Profiles* Profiles::getInstance() { if (!m_instance) m_instance = new Profiles(); return m_instance; } Profiles::Profiles() { } Profiles::~Profiles() { dump(); } #ifndef NO_TIMING void Profiles::accumulate( const char* id, clock_t time, RealTime rt ) { ProfilePair &pair(m_profiles[id]); ++pair.first; pair.second.first += time; pair.second.second = pair.second.second + rt; TimePair &lastPair(m_lastCalls[id]); lastPair.first = time; lastPair.second = rt; TimePair &worstPair(m_worstCalls[id]); if (time > worstPair.first) { worstPair.first = time; } if (rt > worstPair.second) { worstPair.second = rt; } } #endif void Profiles::dump() const { #ifndef NO_TIMING fprintf(stderr, "Profiling points:\n"); fprintf(stderr, "\nBy name:\n"); typedef std::set > StringSet; StringSet profileNames; for (ProfileMap::const_iterator i = m_profiles.begin(); i != m_profiles.end(); ++i) { profileNames.insert(i->first); } for (StringSet::const_iterator i = profileNames.begin(); i != profileNames.end(); ++i) { ProfileMap::const_iterator j = m_profiles.find(*i); if (j == m_profiles.end()) continue; const ProfilePair &pp(j->second); fprintf(stderr, "%s(%d):\n", *i, pp.first); fprintf(stderr, "\tCPU: \t%.9g ms/call \t[%d ms total]\n", (((double)pp.second.first * 1000.0 / (double)pp.first) / CLOCKS_PER_SEC), int((double(pp.second.first) * 1000.0) / CLOCKS_PER_SEC)); fprintf(stderr, "\tReal: \t%s ms \t[%s ms total]\n", ((pp.second.second / pp.first) * 1000).toString().c_str(), (pp.second.second * 1000).toString().c_str()); WorstCallMap::const_iterator k = m_worstCalls.find(*i); if (k == m_worstCalls.end()) continue; const TimePair &wc(k->second); fprintf(stderr, "\tWorst:\t%s ms/call \t[%d ms CPU]\n", (wc.second * 1000).toString().c_str(), int((double(wc.first) * 1000.0) / CLOCKS_PER_SEC)); } typedef std::multimap TimeRMap; typedef std::multimap IntRMap; TimeRMap totmap, avgmap, worstmap; IntRMap ncallmap; for (ProfileMap::const_iterator i = m_profiles.begin(); i != m_profiles.end(); ++i) { totmap.insert(TimeRMap::value_type(i->second.second.second, i->first)); avgmap.insert(TimeRMap::value_type(i->second.second.second / i->second.first, i->first)); ncallmap.insert(IntRMap::value_type(i->second.first, i->first)); } for (WorstCallMap::const_iterator i = m_worstCalls.begin(); i != m_worstCalls.end(); ++i) { worstmap.insert(TimeRMap::value_type(i->second.second, i->first)); } fprintf(stderr, "\nBy total:\n"); for (TimeRMap::const_iterator i = totmap.end(); i != totmap.begin(); ) { --i; fprintf(stderr, "%-40s %s ms\n", i->second, (i->first * 1000).toString().c_str()); } fprintf(stderr, "\nBy average:\n"); for (TimeRMap::const_iterator i = avgmap.end(); i != avgmap.begin(); ) { --i; fprintf(stderr, "%-40s %s ms\n", i->second, (i->first * 1000).toString().c_str()); } fprintf(stderr, "\nBy worst case:\n"); for (TimeRMap::const_iterator i = worstmap.end(); i != worstmap.begin(); ) { --i; fprintf(stderr, "%-40s %s ms\n", i->second, (i->first * 1000).toString().c_str()); } fprintf(stderr, "\nBy number of calls:\n"); for (IntRMap::const_iterator i = ncallmap.end(); i != ncallmap.begin(); ) { --i; fprintf(stderr, "%-40s %d\n", i->second, i->first); } #endif } #ifndef NO_TIMING Profiler::Profiler(const char* c, bool showOnDestruct) : m_c(c), m_showOnDestruct(showOnDestruct), m_ended(false) { m_startCPU = clock(); struct timeval tv; (void)gettimeofday(&tv, 0); m_startTime = RealTime::fromTimeval(tv); } void Profiler::update() const { clock_t elapsedCPU = clock() - m_startCPU; struct timeval tv; (void)gettimeofday(&tv, 0); RealTime elapsedTime = RealTime::fromTimeval(tv) - m_startTime; cerr << "Profiler : id = " << m_c << " - elapsed so far = " << ((elapsedCPU * 1000) / CLOCKS_PER_SEC) << "ms CPU, " << elapsedTime << " real" << endl; } Profiler::~Profiler() { if (!m_ended) end(); } void Profiler::end() { clock_t elapsedCPU = clock() - m_startCPU; struct timeval tv; (void)gettimeofday(&tv, 0); RealTime elapsedTime = RealTime::fromTimeval(tv) - m_startTime; Profiles::getInstance()->accumulate(m_c, elapsedCPU, elapsedTime); if (m_showOnDestruct) cerr << "Profiler : id = " << m_c << " - elapsed = " << ((elapsedCPU * 1000) / CLOCKS_PER_SEC) << "ms CPU, " << elapsedTime << " real" << endl; m_ended = true; } #endif sonic-visualiser-3.0.3/svcore/base/Profiler.h0000644000000000000000000000573713111512442017316 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam, Guillaume Laurent, and QMUL. */ #ifndef _PROFILER_H_ #define _PROFILER_H_ #include "system/System.h" #include #include "RealTime.h" //#define NO_TIMING 1 //#define WANT_TIMING 1 #ifdef NDEBUG #ifndef WANT_TIMING #define NO_TIMING 1 #endif #endif #ifndef NO_TIMING #include #include #endif /** * Profiling classes */ /** * The class holding all profiling data * * This class is a singleton */ class Profiles { public: static Profiles* getInstance(); ~Profiles(); #ifndef NO_TIMING void accumulate(const char* id, clock_t time, RealTime rt); #endif void dump() const; protected: Profiles(); #ifndef NO_TIMING typedef std::pair TimePair; typedef std::pair ProfilePair; typedef std::map ProfileMap; typedef std::map LastCallMap; typedef std::map WorstCallMap; ProfileMap m_profiles; LastCallMap m_lastCalls; WorstCallMap m_worstCalls; #endif static Profiles* m_instance; }; #ifndef NO_TIMING /** * Profile point instance class. Construct one of these on the stack * at the start of a function, in order to record the time consumed * within that function. The profiler object should be effectively * optimised out if NO_TIMING is defined, so any overhead in a release * build should be negligible so long as you remember to define that. */ class Profiler { public: /** * Create a profile point instance that records time consumed * against the given profiling point name. If showOnDestruct is * true, the time consumed will be printed to stderr when the * object is destroyed; otherwise, only the accumulated, mean and * worst-case times will be shown when the program exits or * Profiles::dump() is called. */ Profiler(const char *name, bool showOnDestruct = false); ~Profiler(); void update() const; void end(); // same action as dtor protected: const char* m_c; clock_t m_startCPU; RealTime m_startTime; bool m_showOnDestruct; bool m_ended; }; #else class Profiler { public: Profiler(const char *, bool = false) { } ~Profiler() { } void update() const { } void end() { } }; #endif #endif sonic-visualiser-3.0.3/svcore/base/ProgressPrinter.cpp0000644000000000000000000000355513111512442021233 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ProgressPrinter.h" #include #include "Debug.h" ProgressPrinter::ProgressPrinter(QString message, QObject *parent) : ProgressReporter(parent), m_prefix(message), m_lastProgress(0), m_definite(true) { if (m_prefix.length() > 70) { m_prefix = m_prefix.left(70) + "..."; } } ProgressPrinter::~ProgressPrinter() { if (m_lastProgress > 0 && m_lastProgress != 100) { cerr << "\r\n"; } // cerr << "(progress printer dtor)" << endl; } bool ProgressPrinter::isDefinite() const { return m_definite; } void ProgressPrinter::setDefinite(bool definite) { m_definite = definite; } void ProgressPrinter::setMessage(QString message) { m_prefix = message; if (m_prefix.length() > 70) { m_prefix = m_prefix.left(70) + "..."; } } void ProgressPrinter::done() { cerr << "\r" << m_prefix << (m_prefix == "" ? "" : " ") << "Done" << endl; } void ProgressPrinter::setProgress(int progress) { if (progress == m_lastProgress) return; cerr << "\r" << m_prefix << (m_prefix == "" ? "" : " "); if (m_definite) { cerr << progress << "%"; } else { cerr << "|/-\\"[progress % 4]; } m_lastProgress = progress; } sonic-visualiser-3.0.3/svcore/base/ProgressPrinter.h0000644000000000000000000000230013111512442020663 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PROGRESS_PRINTER_H_ #define _PROGRESS_PRINTER_H_ #include "ProgressReporter.h" class ProgressPrinter : public ProgressReporter { Q_OBJECT public: ProgressPrinter(QString message, QObject *parent = 0); virtual ~ProgressPrinter(); virtual bool isDefinite() const; virtual void setDefinite(bool definite); virtual bool wasCancelled() const { return false; } // no mechanism public slots: virtual void setMessage(QString); virtual void setProgress(int); virtual void done(); protected: QString m_prefix; int m_lastProgress; bool m_definite; }; #endif sonic-visualiser-3.0.3/svcore/base/ProgressReporter.cpp0000644000000000000000000000135713111512442021410 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ProgressReporter.h" ProgressReporter::ProgressReporter(QObject *parent) : QObject(parent) { } ProgressReporter::~ProgressReporter() { } sonic-visualiser-3.0.3/svcore/base/ProgressReporter.h0000644000000000000000000000221513111512442021047 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PROGRESS_REPORTER_H_ #define _PROGRESS_REPORTER_H_ #include #include class ProgressReporter : public QObject { Q_OBJECT public: ProgressReporter(QObject *parent = 0); virtual ~ProgressReporter(); virtual bool isDefinite() const = 0; virtual void setDefinite(bool definite) = 0; // default should be definite virtual bool wasCancelled() const = 0; signals: void cancelled(); public slots: virtual void setMessage(QString text) = 0; virtual void setProgress(int percentage) = 0; }; #endif sonic-visualiser-3.0.3/svcore/base/PropertyContainer.cpp0000644000000000000000000001517213111512442021550 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PropertyContainer.h" #include "RangeMapper.h" #include "UnitDatabase.h" #include PropertyContainer::PropertyList PropertyContainer::getProperties() const { return PropertyList(); } PropertyContainer::PropertyType PropertyContainer::getPropertyType(const PropertyName &) const { return InvalidProperty; } QString PropertyContainer::getPropertyIconName(const PropertyName &) const { return QString(); } QString PropertyContainer::getPropertyGroupName(const PropertyName &) const { return QString(); } int PropertyContainer::getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const { if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 0; return 0; } QString PropertyContainer::getPropertyValueLabel(const PropertyName &, int) const { return QString(); } QString PropertyContainer::getPropertyValueIconName(const PropertyName &, int) const { return QString(); } RangeMapper * PropertyContainer::getNewPropertyRangeMapper(const PropertyName &) const { return 0; } void PropertyContainer::setProperty(const PropertyName &name, int) { cerr << "WARNING: PropertyContainer[" << getPropertyContainerName() << "]::setProperty(" << name << "): no implementation in subclass!" << endl; } Command * PropertyContainer::getSetPropertyCommand(const PropertyName &name, int value) { int currentValue = getPropertyRangeAndValue(name, 0, 0, 0); if (value == currentValue) return 0; return new SetPropertyCommand(this, name, value); } void PropertyContainer::setPropertyFuzzy(QString nameString, QString valueString) { PropertyName name; int value; if (!convertPropertyStrings(nameString, valueString, name, value)) { cerr << "WARNING: PropertyContainer::setProperty(\"" << nameString << "\", \"" << valueString << "\"): Name and value conversion failed" << endl; return; } setProperty(name, value); } Command * PropertyContainer::getSetPropertyCommand(QString nameString, QString valueString) { PropertyName name; int value; if (!convertPropertyStrings(nameString, valueString, name, value)) { cerr << "WARNING: PropertyContainer::getSetPropertyCommand(\"" << nameString << "\", \"" << valueString << "\"): Name and value conversion failed" << endl; return 0; } return getSetPropertyCommand(name, value); } bool PropertyContainer::convertPropertyStrings(QString nameString, QString valueString, PropertyName &name, int &value) { PropertyList pl = getProperties(); QString adjusted = nameString.trimmed(); adjusted.replace('_', ' '); adjusted.replace('-', ' '); name = ""; for (PropertyList::iterator pli = pl.begin(); pli != pl.end(); ++pli) { QString label = getPropertyLabel(*pli); if (label != "" && (nameString == label || adjusted == label)) { name = *pli; break; } else if (nameString == *pli) { name = *pli; break; } } if (name == "") { cerr << "PropertyContainer::convertPropertyStrings: Unable to match name string \"" << nameString << "\"" << endl; return false; } value = 0; bool success = false; bool isDouble = false; double dval = valueString.toDouble(&isDouble); switch (getPropertyType(name)) { case ToggleProperty: if (valueString == tr("yes") || valueString == tr("on") || valueString == tr("true")) { value = 1; success = true; } else if (valueString == tr("no") || valueString == tr("off") || valueString == tr("false")) { value = 0; success = true; } break; case RangeProperty: if (isDouble) { RangeMapper *mapper = getNewPropertyRangeMapper(name); if (mapper) { value = mapper->getPositionForValue(dval); delete mapper; success = true; } } break; case ValueProperty: case ColourProperty: case ColourMapProperty: { int min, max; getPropertyRangeAndValue(name, &min, &max, 0); for (int i = min; i <= max; ++i) { if (valueString == getPropertyValueLabel(name, i)) { value = i; success = true; break; } } break; } case UnitsProperty: value = UnitDatabase::getInstance()->getUnitId(valueString, false); if (value >= 0) success = true; else value = 0; break; case InvalidProperty: SVDEBUG << "PropertyContainer::convertPropertyStrings: Invalid property name \"" << name << "\"" << endl; return false; } if (success) return true; int min, max; getPropertyRangeAndValue(name, &min, &max, 0); bool ok = false; int i = valueString.toInt(&ok); if (!ok) { cerr << "PropertyContainer::convertPropertyStrings: Unable to parse value string \"" << valueString << "\"" << endl; return false; } else if (i < min || i > max) { SVDEBUG << "PropertyContainer::convertPropertyStrings: Property value \"" << i << "\" outside valid range " << min << " to " << max << endl; return false; } value = i; return true; } PropertyContainer::SetPropertyCommand::SetPropertyCommand(PropertyContainer *pc, const PropertyName &pn, int value) : m_pc(pc), m_pn(pn), m_value(value), m_oldValue(0) { } void PropertyContainer::SetPropertyCommand::execute() { m_oldValue = m_pc->getPropertyRangeAndValue(m_pn, 0, 0, 0); m_pc->setProperty(m_pn, m_value); } void PropertyContainer::SetPropertyCommand::unexecute() { m_pc->setProperty(m_pn, m_oldValue); } QString PropertyContainer::SetPropertyCommand::getName() const { return tr("Set %1 Property").arg(m_pn); } sonic-visualiser-3.0.3/svcore/base/PropertyContainer.h0000644000000000000000000001422613111512442021214 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_PROPERTY_CONTAINER_H #define SV_PROPERTY_CONTAINER_H #include "Command.h" #include #include #include class PlayParameters; class RangeMapper; class PropertyContainer : public QObject { Q_OBJECT public: virtual ~PropertyContainer() { } typedef QString PropertyName; typedef std::vector PropertyList; enum PropertyType { ToggleProperty, // on or off RangeProperty, // range of integers ValueProperty, // range of integers given string labels ColourProperty, // colours, get/set as ColourDatabase indices ColourMapProperty, // colour maps, get/set as ColourMapper::StandardMap enum UnitsProperty, // unit from UnitDatabase, get/set unit id InvalidProperty, // property not found! }; /** * Get a list of the names of all the supported properties on this * container. These should be fixed (i.e. not internationalized). */ virtual PropertyList getProperties() const; /** * Return the human-readable (and i18n'ised) name of a property. */ virtual QString getPropertyLabel(const PropertyName &) const = 0; /** * Return the type of the given property, or InvalidProperty if * the property is not supported on this container. */ virtual PropertyType getPropertyType(const PropertyName &) const; /** * Return an icon for the property, if any. */ virtual QString getPropertyIconName(const PropertyName &) const; /** * If this property has something in common with other properties * on this container, return a name that can be used to group them * (in order to save screen space, for example). e.g. "Window * Type" and "Window Size" might both have a group name of "Window". * If this property is not groupable, return the empty string. */ virtual QString getPropertyGroupName(const PropertyName &) const; /** * Return the minimum and maximum values for the given property * and its current value in this container. Min and/or max may be * passed as NULL if their values are not required. */ virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; /** * If the given property is a ValueProperty, return the display * label to be used for the given value for that property. */ virtual QString getPropertyValueLabel(const PropertyName &, int value) const; /** * If the given property is a ValueProperty, return the icon to be * used for the given value for that property, if any. */ virtual QString getPropertyValueIconName(const PropertyName &, int value) const; /** * If the given property is a RangeProperty, return a new * RangeMapper object mapping its integer range onto an underlying * floating point value range for human-intelligible display, if * appropriate. The RangeMapper should be allocated with new, and * the caller takes responsibility for deleting it. Return NULL * (as in the default implementation) if there is no such mapping. */ virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual QString getPropertyContainerName() const = 0; virtual QString getPropertyContainerIconName() const = 0; virtual PlayParameters *getPlayParameters() { return 0; } signals: void propertyChanged(PropertyContainer::PropertyName); public slots: /** * Set a property. This is used for all property types. For * boolean properties, zero is false and non-zero true; for * colours, the integer value is an index into the colours in the * global ColourDatabase. */ virtual void setProperty(const PropertyName &, int value); /** * Obtain a command that sets the given property, which can be * added to the command history for undo/redo. Returns NULL * if the property is already set to the given value. */ virtual Command *getSetPropertyCommand(const PropertyName &, int value); /** * Set a property using a fuzzy match. Compare nameString with * the property labels and underlying names, and if it matches one * (with preference given to labels), try to convert valueString * appropriately and set it. The valueString should contain a * value label for value properties, a mapped value for range * properties, "on" or "off" for toggle properties, a colour or * unit name, or the underlying integer value for the property. * * Note that as property and value labels may be translatable, the * results of this function may vary by locale. It is intended * for handling user-originated strings, _not_ persistent storage. * * The default implementation should work for most subclasses. */ virtual void setPropertyFuzzy(QString nameString, QString valueString); /** * As above, but returning a command. */ virtual Command *getSetPropertyCommand(QString nameString, QString valueString); protected: class SetPropertyCommand : public Command { public: SetPropertyCommand(PropertyContainer *pc, const PropertyName &pn, int); virtual ~SetPropertyCommand() { } virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: PropertyContainer *m_pc; PropertyName m_pn; int m_value; int m_oldValue; }; virtual bool convertPropertyStrings(QString nameString, QString valueString, PropertyName &name, int &value); }; #endif sonic-visualiser-3.0.3/svcore/base/RangeMapper.cpp0000644000000000000000000002404613111512442020262 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RangeMapper.h" #include "system/System.h" #include #include #include LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos, double minval, double maxval, QString unit, bool inverted, std::map labels) : m_minpos(minpos), m_maxpos(maxpos), m_minval(minval), m_maxval(maxval), m_unit(unit), m_inverted(inverted), m_labels(labels) { assert(m_maxval != m_minval); assert(m_maxpos != m_minpos); } int LinearRangeMapper::getPositionForValue(double value) const { int position = getPositionForValueUnclamped(value); if (position < m_minpos) position = m_minpos; if (position > m_maxpos) position = m_maxpos; return position; } int LinearRangeMapper::getPositionForValueUnclamped(double value) const { int position = m_minpos + int(lrint(((value - m_minval) / (m_maxval - m_minval)) * (m_maxpos - m_minpos))); if (m_inverted) return m_maxpos - (position - m_minpos); else return position; } double LinearRangeMapper::getValueForPosition(int position) const { if (position < m_minpos) position = m_minpos; if (position > m_maxpos) position = m_maxpos; double value = getValueForPositionUnclamped(position); return value; } double LinearRangeMapper::getValueForPositionUnclamped(int position) const { if (m_inverted) position = m_maxpos - (position - m_minpos); double value = m_minval + ((double(position - m_minpos) / double(m_maxpos - m_minpos)) * (m_maxval - m_minval)); // cerr << "getValueForPositionUnclamped(" << position << "): minval " << m_minval << ", maxval " << m_maxval << ", value " << value << endl; return value; } QString LinearRangeMapper::getLabel(int position) const { if (m_labels.find(position) != m_labels.end()) { return m_labels.at(position); } else { return ""; } } LogRangeMapper::LogRangeMapper(int minpos, int maxpos, double minval, double maxval, QString unit, bool inverted) : m_minpos(minpos), m_maxpos(maxpos), m_unit(unit), m_inverted(inverted) { convertMinMax(minpos, maxpos, minval, maxval, m_minlog, m_ratio); // cerr << "LogRangeMapper: minpos " << minpos << ", maxpos " // << maxpos << ", minval " << minval << ", maxval " // << maxval << ", minlog " << m_minlog << ", ratio " << m_ratio // << ", unit " << unit << endl; assert(m_maxpos != m_minpos); m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog; // cerr << "LogRangeMapper: maxlog = " << m_maxlog << endl; } void LogRangeMapper::convertMinMax(int minpos, int maxpos, double minval, double maxval, double &minlog, double &ratio) { static double thresh = powf(10, -10); if (minval < thresh) minval = thresh; minlog = log10(minval); ratio = (maxpos - minpos) / (log10(maxval) - minlog); } void LogRangeMapper::convertRatioMinLog(double ratio, double minlog, int minpos, int maxpos, double &minval, double &maxval) { minval = pow(10, minlog); maxval = pow(10, (maxpos - minpos) / ratio + minlog); } int LogRangeMapper::getPositionForValue(double value) const { int position = getPositionForValueUnclamped(value); if (position < m_minpos) position = m_minpos; if (position > m_maxpos) position = m_maxpos; return position; } int LogRangeMapper::getPositionForValueUnclamped(double value) const { static double thresh = pow(10, -10); if (value < thresh) value = thresh; int position = int(lrint((log10(value) - m_minlog) * m_ratio)) + m_minpos; if (m_inverted) return m_maxpos - (position - m_minpos); else return position; } double LogRangeMapper::getValueForPosition(int position) const { if (position < m_minpos) position = m_minpos; if (position > m_maxpos) position = m_maxpos; double value = getValueForPositionUnclamped(position); return value; } double LogRangeMapper::getValueForPositionUnclamped(int position) const { if (m_inverted) position = m_maxpos - (position - m_minpos); double value = pow(10, (position - m_minpos) / m_ratio + m_minlog); return value; } InterpolatingRangeMapper::InterpolatingRangeMapper(CoordMap pointMappings, QString unit) : m_mappings(pointMappings), m_unit(unit) { for (CoordMap::const_iterator i = m_mappings.begin(); i != m_mappings.end(); ++i) { m_reverse[i->second] = i->first; } } int InterpolatingRangeMapper::getPositionForValue(double value) const { int pos = getPositionForValueUnclamped(value); CoordMap::const_iterator i = m_mappings.begin(); if (pos < i->second) pos = i->second; i = m_mappings.end(); --i; if (pos > i->second) pos = i->second; return pos; } int InterpolatingRangeMapper::getPositionForValueUnclamped(double value) const { double p = interpolate(&m_mappings, value); return int(lrint(p)); } double InterpolatingRangeMapper::getValueForPosition(int position) const { double val = getValueForPositionUnclamped(position); CoordMap::const_iterator i = m_mappings.begin(); if (val < i->first) val = i->first; i = m_mappings.end(); --i; if (val > i->first) val = i->first; return val; } double InterpolatingRangeMapper::getValueForPositionUnclamped(int position) const { return interpolate(&m_reverse, position); } template double InterpolatingRangeMapper::interpolate(T *mapping, double value) const { // lower_bound: first element which does not compare less than value typename T::const_iterator i = mapping->lower_bound(typename T::key_type(value)); if (i == mapping->begin()) { // value is less than or equal to first element, so use the // gradient from first to second and extend it ++i; } if (i == mapping->end()) { // value is off the end, so use the gradient from penultimate // to ultimate and extend it --i; } typename T::const_iterator j = i; --j; double gradient = double(i->second - j->second) / double(i->first - j->first); return j->second + (value - j->first) * gradient; } AutoRangeMapper::AutoRangeMapper(CoordMap pointMappings, QString unit) : m_mappings(pointMappings), m_unit(unit) { m_type = chooseMappingTypeFor(m_mappings); CoordMap::const_iterator first = m_mappings.begin(); CoordMap::const_iterator last = m_mappings.end(); --last; switch (m_type) { case StraightLine: m_mapper = new LinearRangeMapper(first->second, last->second, first->first, last->first, unit, false); break; case Logarithmic: m_mapper = new LogRangeMapper(first->second, last->second, first->first, last->first, unit, false); break; case Interpolating: m_mapper = new InterpolatingRangeMapper(m_mappings, unit); break; } } AutoRangeMapper::~AutoRangeMapper() { delete m_mapper; } AutoRangeMapper::MappingType AutoRangeMapper::chooseMappingTypeFor(const CoordMap &mappings) { // how do we work out whether a linear/log mapping is "close enough"? CoordMap::const_iterator first = mappings.begin(); CoordMap::const_iterator last = mappings.end(); --last; LinearRangeMapper linm(first->second, last->second, first->first, last->first, "", false); bool inadequate = false; for (CoordMap::const_iterator i = mappings.begin(); i != mappings.end(); ++i) { int candidate = linm.getPositionForValue(i->first); int diff = candidate - i->second; if (diff < 0) diff = -diff; if (diff > 1) { // cerr << "AutoRangeMapper::chooseMappingTypeFor: diff = " << diff // << ", straight-line mapping inadequate" << endl; inadequate = true; break; } } if (!inadequate) { return StraightLine; } LogRangeMapper logm(first->second, last->second, first->first, last->first, "", false); inadequate = false; for (CoordMap::const_iterator i = mappings.begin(); i != mappings.end(); ++i) { int candidate = logm.getPositionForValue(i->first); int diff = candidate - i->second; if (diff < 0) diff = -diff; if (diff > 1) { // cerr << "AutoRangeMapper::chooseMappingTypeFor: diff = " << diff // << ", log mapping inadequate" << endl; inadequate = true; break; } } if (!inadequate) { return Logarithmic; } return Interpolating; } int AutoRangeMapper::getPositionForValue(double value) const { return m_mapper->getPositionForValue(value); } double AutoRangeMapper::getValueForPosition(int position) const { return m_mapper->getValueForPosition(position); } int AutoRangeMapper::getPositionForValueUnclamped(double value) const { return m_mapper->getPositionForValueUnclamped(value); } double AutoRangeMapper::getValueForPositionUnclamped(int position) const { return m_mapper->getValueForPositionUnclamped(position); } sonic-visualiser-3.0.3/svcore/base/RangeMapper.h0000644000000000000000000002152413111512442017725 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RANGE_MAPPER_H_ #define _RANGE_MAPPER_H_ #include #include "Debug.h" #include class RangeMapper { public: virtual ~RangeMapper() { } /** * Return the position that maps to the given value, rounding to * the nearest position and clamping to the minimum and maximum * extents of the mapper's positional range. */ virtual int getPositionForValue(double value) const = 0; /** * Return the position that maps to the given value, rounding to * the nearest position, without clamping. That is, whatever * mapping function is in use will be projected even outside the * minimum and maximum extents of the mapper's positional * range. (The mapping outside that range is not guaranteed to be * exact, except if the mapper is a linear one.) */ virtual int getPositionForValueUnclamped(double value) const = 0; /** * Return the value mapped from the given position, clamping to * the minimum and maximum extents of the mapper's value range. */ virtual double getValueForPosition(int position) const = 0; /** * Return the value mapped from the given position, without * clamping. That is, whatever mapping function is in use will be * projected even outside the minimum and maximum extents of the * mapper's value range. (The mapping outside that range is not * guaranteed to be exact, except if the mapper is a linear one.) */ virtual double getValueForPositionUnclamped(int position) const = 0; /** * Get the unit of the mapper's value range. */ virtual QString getUnit() const { return ""; } /** * The mapper may optionally provide special labels for one or * more individual positions (such as the minimum position, the * default, or indeed all positions). These should be used in any * display context in preference to just showing the numerical * value for the position. If a position has such a label, return * it here. */ virtual QString getLabel(int /* position */) const { return ""; } }; class LinearRangeMapper : public RangeMapper { public: /** * Map values in range minval->maxval linearly into integer range * minpos->maxpos. minval and minpos must be less than maxval and * maxpos respectively. If inverted is true, the range will be * mapped "backwards" (minval to maxpos and maxval to minpos). */ LinearRangeMapper(int minpos, int maxpos, double minval, double maxval, QString unit = "", bool inverted = false, std::map labels = {}); virtual int getPositionForValue(double value) const; virtual int getPositionForValueUnclamped(double value) const; virtual double getValueForPosition(int position) const; virtual double getValueForPositionUnclamped(int position) const; virtual QString getUnit() const { return m_unit; } virtual QString getLabel(int position) const; protected: int m_minpos; int m_maxpos; double m_minval; double m_maxval; QString m_unit; bool m_inverted; std::map m_labels; }; class LogRangeMapper : public RangeMapper { public: /** * Map values in range minval->maxval into integer range * minpos->maxpos such that logs of the values are mapped * linearly. minval must be greater than zero, and minval and * minpos must be less than maxval and maxpos respectively. If * inverted is true, the range will be mapped "backwards" (minval * to maxpos and maxval to minpos). */ LogRangeMapper(int minpos, int maxpos, double minval, double maxval, QString m_unit = "", bool inverted = false); static void convertRatioMinLog(double ratio, double minlog, int minpos, int maxpos, double &minval, double &maxval); static void convertMinMax(int minpos, int maxpos, double minval, double maxval, double &ratio, double &minlog); virtual int getPositionForValue(double value) const; virtual int getPositionForValueUnclamped(double value) const; virtual double getValueForPosition(int position) const; virtual double getValueForPositionUnclamped(int position) const; virtual QString getUnit() const { return m_unit; } protected: int m_minpos; int m_maxpos; double m_ratio; double m_minlog; double m_maxlog; QString m_unit; bool m_inverted; }; class InterpolatingRangeMapper : public RangeMapper { public: typedef std::map CoordMap; /** * Given a series of (value, position) coordinate mappings, * construct a range mapper that maps arbitrary values, in the * range between minimum and maximum of the provided values, onto * coordinates using linear interpolation between the supplied * points. * *!!! todo: Cubic -- more generally useful than linear interpolation *!!! todo: inverted flag * * The set of provided mappings must contain at least two * coordinates. * * It is expected that the values and positions in the coordinate * mappings will both be monotonically increasing (i.e. no * inflections in the mapping curve). Behaviour is undefined if * this is not the case. */ InterpolatingRangeMapper(CoordMap pointMappings, QString unit); virtual int getPositionForValue(double value) const; virtual int getPositionForValueUnclamped(double value) const; virtual double getValueForPosition(int position) const; virtual double getValueForPositionUnclamped(int position) const; virtual QString getUnit() const { return m_unit; } protected: CoordMap m_mappings; std::map m_reverse; QString m_unit; template double interpolate(T *mapping, double v) const; }; class AutoRangeMapper : public RangeMapper { public: enum MappingType { Interpolating, StraightLine, Logarithmic, }; typedef std::map CoordMap; /** * Given a series of (value, position) coordinate mappings, * construct a range mapper that maps arbitrary values, in the * range between minimum and maximum of the provided values, onto * coordinates. * * The mapping used may be * * Interpolating -- an InterpolatingRangeMapper will be used * * StraightLine -- a LinearRangeMapper from the minimum to * maximum value coordinates will be used, ignoring all other * supplied coordinate mappings * * Logarithmic -- a LogRangeMapper from the minimum to * maximum value coordinates will be used, ignoring all other * supplied coordinate mappings * * The mapping will be chosen automatically by looking at the * supplied coordinates. If the supplied coordinates fall on a * straight line, a StraightLine mapping will be used; if they * fall on a log curve, a Logarithmic mapping will be used; * otherwise an Interpolating mapping will be used. * *!!! todo: inverted flag * * The set of provided mappings must contain at least two * coordinates, or at least three if the points are not supposed * to be in a straight line. * * It is expected that the values and positions in the coordinate * mappings will both be monotonically increasing (i.e. no * inflections in the mapping curve). Behaviour is undefined if * this is not the case. */ AutoRangeMapper(CoordMap pointMappings, QString unit); ~AutoRangeMapper(); /** * Return the mapping type in use. */ MappingType getType() const { return m_type; } virtual int getPositionForValue(double value) const; virtual int getPositionForValueUnclamped(double value) const; virtual double getValueForPosition(int position) const; virtual double getValueForPositionUnclamped(int position) const; virtual QString getUnit() const { return m_unit; } protected: MappingType m_type; CoordMap m_mappings; QString m_unit; RangeMapper *m_mapper; MappingType chooseMappingTypeFor(const CoordMap &); }; #endif sonic-visualiser-3.0.3/svcore/base/RealTime.h0000644000000000000000000001411013111512442017217 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef SV_REAL_TIME_H #define SV_REAL_TIME_H #include "BaseTypes.h" #include #include #include #ifdef _MSC_VER #include "winsock.h" // struct timeval is in here #else #include "sys/time.h" #endif /** * RealTime represents time values to nanosecond precision * with accurate arithmetic and frame-rate conversion functions. */ struct RealTime { int sec; int nsec; int usec() const { return nsec / 1000; } int msec() const { return nsec / 1000000; } RealTime(): sec(0), nsec(0) {} RealTime(int s, int n); RealTime(const RealTime &r) : sec(r.sec), nsec(r.nsec) { } RealTime(const Vamp::RealTime &r) : sec(r.sec), nsec(r.nsec) { } static RealTime fromSeconds(double sec); static RealTime fromMilliseconds(int msec); static RealTime fromTimeval(const struct timeval &); static RealTime fromXsdDuration(std::string xsdd); double toDouble() const; Vamp::RealTime toVampRealTime() const { return Vamp::RealTime(sec, nsec); } RealTime &operator=(const RealTime &r) { sec = r.sec; nsec = r.nsec; return *this; } RealTime operator+(const RealTime &r) const { return RealTime(sec + r.sec, nsec + r.nsec); } RealTime operator-(const RealTime &r) const { return RealTime(sec - r.sec, nsec - r.nsec); } RealTime operator-() const { return RealTime(-sec, -nsec); } bool operator <(const RealTime &r) const { if (sec == r.sec) return nsec < r.nsec; else return sec < r.sec; } bool operator >(const RealTime &r) const { if (sec == r.sec) return nsec > r.nsec; else return sec > r.sec; } bool operator==(const RealTime &r) const { return (sec == r.sec && nsec == r.nsec); } bool operator!=(const RealTime &r) const { return !(r == *this); } bool operator>=(const RealTime &r) const { if (sec == r.sec) return nsec >= r.nsec; else return sec >= r.sec; } bool operator<=(const RealTime &r) const { if (sec == r.sec) return nsec <= r.nsec; else return sec <= r.sec; } RealTime operator*(int m) const; RealTime operator/(int d) const; RealTime operator*(double m) const; RealTime operator/(double d) const; /** * Return the ratio of two times. */ double operator/(const RealTime &r) const; /** * Return a human-readable debug-type string to full precision * (probably not a format to show to a user directly). If align * is true, prepend " " to the start of positive values so that * they line up with negative ones (which start with "-"). */ std::string toString(bool align = false) const; /** * Convert a string as obtained from toString back to a RealTime * object. */ static RealTime fromString(std::string); /** * Return a user-readable string to the nearest millisecond, * typically in a form like HH:MM:SS.mmm. The exact format will * depend on the application preferences for time display * precision and hours:minutes:seconds format -- this function * simply dispatches to toMSText or toFrameText with appropriate * arguments depending on the preferences. * * If fixedDp is true, the result will be padded to 3 dp, * i.e. millisecond resolution, even if the number of milliseconds * is a multiple of 10. */ std::string toText(bool fixedDp = false) const; /** * Return a user-readable string to the nearest millisecond. * * If fixedDp is true, the result will be padded to 3 dp, * i.e. millisecond resolution, even if the number of milliseconds * is a multiple of 10. * * If hms is true, results may be returned in the form * HH:MM:SS.mmm (if the time is large enough). If hms is false, * the result will always be a (fractional) number of seconds. * * Unlike toText, this function does not depend on the application * preferences. */ std::string toMSText(bool fixedDp, bool hms) const; /** * Return a user-readable string in which seconds are divided into * frames (presumably at a lower frame rate than audio rate, * e.g. 24 or 25 video frames), in a form like HH:MM:SS:FF. fps * gives the number of frames per second, and must be integral * (29.97 not supported). * * Unlike toText, this function does not depend on the application * preferences. */ std::string toFrameText(int fps, bool hms) const; /** * Return a user-readable string to the nearest second, in H:M:S * form. Does not include milliseconds or frames. The result will * be suffixed "s" if it contains only seconds (no hours or * minutes). * * Unlike toText, this function does not depend on the application * preferences. */ std::string toSecText() const; /** * Return a string in xsd:duration format. */ std::string toXsdDuration() const; /** * Convert a RealTime into a sample frame at the given sample rate. */ static sv_frame_t realTime2Frame(const RealTime &r, sv_samplerate_t sampleRate); /** * Convert a sample frame at the given sample rate into a RealTime. */ static RealTime frame2RealTime(sv_frame_t frame, sv_samplerate_t sampleRate); static const RealTime zeroTime; }; std::ostream &operator<<(std::ostream &out, const RealTime &rt); #endif sonic-visualiser-3.0.3/svcore/base/RealTimeSV.cpp0000644000000000000000000002620113111512442020027 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include #include #include #include "RealTime.h" #include "Debug.h" #include "Preferences.h" // A RealTime consists of two ints that must be at least 32 bits each. // A signed 32-bit int can store values exceeding +/- 2 billion. This // means we can safely use our lower int for nanoseconds, as there are // 1 billion nanoseconds in a second and we need to handle double that // because of the implementations of addition etc that we use. // // The maximum valid RealTime on a 32-bit system is somewhere around // 68 years: 999999999 nanoseconds longer than the classic Unix epoch. #define ONE_BILLION 1000000000 RealTime::RealTime(int s, int n) : sec(s), nsec(n) { if (sec == 0) { while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } } else if (sec < 0) { while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } } else { while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } } } RealTime RealTime::fromSeconds(double sec) { if (sec >= 0) { return RealTime(int(sec), int((sec - int(sec)) * ONE_BILLION + 0.5)); } else { return -fromSeconds(-sec); } } RealTime RealTime::fromMilliseconds(int msec) { return RealTime(msec / 1000, (msec % 1000) * 1000000); } RealTime RealTime::fromTimeval(const struct timeval &tv) { return RealTime(int(tv.tv_sec), int(tv.tv_usec * 1000)); } RealTime RealTime::fromXsdDuration(std::string xsdd) { RealTime t; int year = 0, month = 0, day = 0, hour = 0, minute = 0; double second = 0.0; char *loc = setlocale(LC_NUMERIC, 0); (void)setlocale(LC_NUMERIC, "C"); // avoid strtod expecting ,-separator in DE int i = 0; const char *s = xsdd.c_str(); int len = int(xsdd.length()); bool negative = false, afterT = false; while (i < len) { if (s[i] == '-') { if (i == 0) negative = true; ++i; continue; } double value = 0.0; char *eptr = 0; if (isdigit(s[i]) || s[i] == '.') { value = strtod(&s[i], &eptr); i = int(eptr - s); } if (i == len) break; switch (s[i]) { case 'Y': year = int(value + 0.1); break; case 'D': day = int(value + 0.1); break; case 'H': hour = int(value + 0.1); break; case 'M': if (afterT) minute = int(value + 0.1); else month = int(value + 0.1); break; case 'S': second = value; break; case 'T': afterT = true; break; }; ++i; } if (year > 0) { cerr << "WARNING: This xsd:duration (\"" << xsdd << "\") contains a non-zero year.\nWith no origin and a limited data size, I will treat a year as exactly 31556952\nseconds and you should expect overflow and/or poor results." << endl; t = t + RealTime(year * 31556952, 0); } if (month > 0) { cerr << "WARNING: This xsd:duration (\"" << xsdd << "\") contains a non-zero month.\nWith no origin and a limited data size, I will treat a month as exactly 2629746\nseconds and you should expect overflow and/or poor results." << endl; t = t + RealTime(month * 2629746, 0); } if (day > 0) { t = t + RealTime(day * 86400, 0); } if (hour > 0) { t = t + RealTime(hour * 3600, 0); } if (minute > 0) { t = t + RealTime(minute * 60, 0); } t = t + fromSeconds(second); setlocale(LC_NUMERIC, loc); if (negative) { return -t; } else { return t; } } double RealTime::toDouble() const { double d = sec; d += double(nsec) / double(ONE_BILLION); return d; } std::ostream &operator<<(std::ostream &out, const RealTime &rt) { if (rt < RealTime::zeroTime) { out << "-"; } else { out << " "; } int s = (rt.sec < 0 ? -rt.sec : rt.sec); int n = (rt.nsec < 0 ? -rt.nsec : rt.nsec); out << s << "."; int nn(n); if (nn == 0) out << "00000000"; else while (nn < (ONE_BILLION / 10)) { out << "0"; nn *= 10; } out << n << "R"; return out; } std::string RealTime::toString(bool align) const { std::stringstream out; out << *this; std::string s = out.str(); if (!align && *this >= RealTime::zeroTime) { // remove leading " " s = s.substr(1, s.length() - 1); } // remove trailing R return s.substr(0, s.length() - 1); } RealTime RealTime::fromString(std::string s) { bool negative = false; int section = 0; std::string ssec, snsec; for (size_t i = 0; i < s.length(); ++i) { char c = s[i]; if (isspace(c)) continue; if (section == 0) { if (c == '-') negative = true; else if (isdigit(c)) { section = 1; ssec += c; } else if (c == '.') section = 2; else break; } else if (section == 1) { if (c == '.') section = 2; else if (isdigit(c)) ssec += c; else break; } else if (section == 2) { if (isdigit(c)) snsec += c; else break; } } while (snsec.length() < 8) snsec += '0'; int sec = atoi(ssec.c_str()); int nsec = atoi(snsec.c_str()); if (negative) sec = -sec; // SVDEBUG << "RealTime::fromString: string " << s << " -> " // << sec << " sec, " << nsec << " nsec" << endl; return RealTime(sec, nsec); } std::string RealTime::toText(bool fixedDp) const { if (*this < RealTime::zeroTime) return "-" + (-*this).toText(fixedDp); Preferences *p = Preferences::getInstance(); bool hms = true; if (p) { hms = p->getShowHMS(); int fps = 0; switch (p->getTimeToTextMode()) { case Preferences::TimeToTextMs: break; case Preferences::TimeToTextUs: fps = 1000000; break; case Preferences::TimeToText24Frame: fps = 24; break; case Preferences::TimeToText25Frame: fps = 25; break; case Preferences::TimeToText30Frame: fps = 30; break; case Preferences::TimeToText50Frame: fps = 50; break; case Preferences::TimeToText60Frame: fps = 60; break; } if (fps != 0) return toFrameText(fps, hms); } return toMSText(fixedDp, hms); } static void writeSecPart(std::stringstream &out, bool hms, int sec) { if (hms) { if (sec >= 3600) { out << (sec / 3600) << ":"; } if (sec >= 60) { int minutes = (sec % 3600) / 60; if (sec >= 3600 && minutes < 10) out << "0"; out << minutes << ":"; } if (sec >= 10) { out << ((sec % 60) / 10); } out << (sec % 10); } else { out << sec; } } std::string RealTime::toMSText(bool fixedDp, bool hms) const { if (*this < RealTime::zeroTime) return "-" + (-*this).toMSText(fixedDp, hms); std::stringstream out; writeSecPart(out, hms, sec); int ms = msec(); if (ms != 0) { out << "."; out << (ms / 100); ms = ms % 100; if (ms != 0) { out << (ms / 10); ms = ms % 10; } else if (fixedDp) { out << "0"; } if (ms != 0) { out << ms; } else if (fixedDp) { out << "0"; } } else if (fixedDp) { out << ".000"; } std::string s = out.str(); return s; } std::string RealTime::toFrameText(int fps, bool hms) const { if (*this < RealTime::zeroTime) return "-" + (-*this).toFrameText(fps, hms); std::stringstream out; writeSecPart(out, hms, sec); // avoid rounding error if fps does not divide into ONE_BILLION int64_t fbig = nsec; fbig *= fps; int f = int(fbig / ONE_BILLION); int div = 1; int n = fps - 1; while ((n = n / 10)) { div *= 10; } out << ":"; // cerr << "div = " << div << ", f = "<< f << endl; while (div) { int d = (f / div) % 10; out << d; div /= 10; } std::string s = out.str(); // cerr << "converted " << toString() << " to " << s << endl; return s; } std::string RealTime::toSecText() const { if (*this < RealTime::zeroTime) return "-" + (-*this).toSecText(); std::stringstream out; writeSecPart(out, true, sec); if (sec < 60) { out << "s"; } std::string s = out.str(); return s; } std::string RealTime::toXsdDuration() const { std::string s = "PT" + toString(false) + "S"; return s; } RealTime RealTime::operator*(int m) const { double t = (double(nsec) / ONE_BILLION) * m; t += sec * m; return fromSeconds(t); } RealTime RealTime::operator/(int d) const { int secdiv = sec / d; int secrem = sec % d; double nsecdiv = (double(nsec) + ONE_BILLION * double(secrem)) / d; return RealTime(secdiv, int(nsecdiv + 0.5)); } RealTime RealTime::operator*(double m) const { double t = (double(nsec) / ONE_BILLION) * m; t += sec * m; return fromSeconds(t); } RealTime RealTime::operator/(double d) const { double t = (double(nsec) / ONE_BILLION) / d; t += sec / d; return fromSeconds(t); } double RealTime::operator/(const RealTime &r) const { double lTotal = double(sec) * ONE_BILLION + double(nsec); double rTotal = double(r.sec) * ONE_BILLION + double(r.nsec); if (rTotal == 0) return 0.0; else return lTotal/rTotal; } static RealTime frame2RealTime_i(sv_frame_t frame, sv_frame_t iSampleRate) { if (frame < 0) return -frame2RealTime_i(-frame, iSampleRate); int sec = int(frame / iSampleRate); frame -= sec * iSampleRate; int nsec = int((double(frame) / double(iSampleRate)) * ONE_BILLION + 0.5); // Use ctor here instead of setting data members directly to // ensure nsec > ONE_BILLION is handled properly. It's extremely // unlikely, but not impossible. return RealTime(sec, nsec); } sv_frame_t RealTime::realTime2Frame(const RealTime &time, sv_samplerate_t sampleRate) { if (time < zeroTime) return -realTime2Frame(-time, sampleRate); double s = time.sec + double(time.nsec) / 1000000000.0; return sv_frame_t(s * sampleRate + 0.5); } RealTime RealTime::frame2RealTime(sv_frame_t frame, sv_samplerate_t sampleRate) { if (sampleRate == double(int(sampleRate))) { return frame2RealTime_i(frame, int(sampleRate)); } double sec = double(frame) / sampleRate; return fromSeconds(sec); } const RealTime RealTime::zeroTime(0,0); sonic-visualiser-3.0.3/svcore/base/RecentFiles.cpp0000644000000000000000000000620113111512442020255 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "RecentFiles.h" #include "Preferences.h" #include #include #include RecentFiles::RecentFiles(QString settingsGroup, int maxCount) : m_settingsGroup(settingsGroup), m_maxCount(maxCount) { read(); } RecentFiles::~RecentFiles() { // nothing } void RecentFiles::read() { m_names.clear(); QSettings settings; settings.beginGroup(m_settingsGroup); for (int i = 0; i < 100; ++i) { QString key = QString("recent-%1").arg(i); QString name = settings.value(key, "").toString(); if (name == "") break; if (i < m_maxCount) m_names.push_back(name); else settings.setValue(key, ""); } settings.endGroup(); } void RecentFiles::write() { QSettings settings; settings.beginGroup(m_settingsGroup); for (int i = 0; i < m_maxCount; ++i) { QString key = QString("recent-%1").arg(i); QString name = ""; if (i < (int)m_names.size()) name = m_names[i]; settings.setValue(key, name); } settings.endGroup(); } void RecentFiles::truncateAndWrite() { while (int(m_names.size()) > m_maxCount) { m_names.pop_back(); } write(); } std::vector RecentFiles::getRecent() const { std::vector names; for (int i = 0; i < m_maxCount; ++i) { if (i < (int)m_names.size()) { names.push_back(m_names[i]); } } return names; } void RecentFiles::add(QString name) { bool have = false; for (int i = 0; i < int(m_names.size()); ++i) { if (m_names[i] == name) { have = true; break; } } if (!have) { m_names.push_front(name); } else { std::deque newnames; newnames.push_back(name); for (int i = 0; i < int(m_names.size()); ++i) { if (m_names[i] == name) continue; newnames.push_back(m_names[i]); } m_names = newnames; } truncateAndWrite(); emit recentChanged(); } void RecentFiles::addFile(QString name) { static QRegExp schemeRE("^[a-zA-Z]{2,5}://"); static QRegExp tempRE("[\\/][Tt]e?mp[\\/]"); if (schemeRE.indexIn(name) == 0) { add(name); } else { QString absPath = QFileInfo(name).absoluteFilePath(); if (tempRE.indexIn(absPath) != -1) { Preferences *prefs = Preferences::getInstance(); if (prefs && !prefs->getOmitTempsFromRecentFiles()) { add(absPath); } } else { add(absPath); } } } sonic-visualiser-3.0.3/svcore/base/RecentFiles.h0000644000000000000000000000424113111512442017724 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RECENT_FILES_H_ #define _RECENT_FILES_H_ #include #include #include #include /** * RecentFiles manages a list of the names of recently-used objects, * saving and restoring that list via QSettings. The names do not * actually have to refer to files. */ class RecentFiles : public QObject { Q_OBJECT public: /** * Construct a RecentFiles object that saves and restores in the * given QSettings group and truncates when the given count of * strings is reached. */ RecentFiles(QString settingsGroup = "RecentFiles", int maxCount = 10); virtual ~RecentFiles(); QString getSettingsGroup() const { return m_settingsGroup; } int getMaxCount() const { return m_maxCount; } std::vector getRecent() const; /** * Add a name that should be treated as a literal string. */ void add(QString name); /** * Add a name that is known to be either a file path or a URL. If * it looks like a URL, add it literally; otherwise treat it as a * file path and canonicalise it appropriately. Also takes into * account the user preference for whether to include temporary * files in the recent files menu: the file will not be added if * the preference is set and the file appears to be a temporary * one. */ void addFile(QString name); signals: void recentChanged(); protected: QString m_settingsGroup; int m_maxCount; std::deque m_names; void read(); void write(); void truncateAndWrite(); }; #endif sonic-visualiser-3.0.3/svcore/base/ResourceFinder.cpp0000644000000000000000000002770713111512442021007 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2005-2011 Chris Cannam and the Rosegarden development team. */ #include "ResourceFinder.h" #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #endif #include #include #include /** Resource files may be found in three places: * Bundled into the application as Qt4 resources. These may be opened using Qt classes such as QFile, with "fake" file paths starting with a colon. For example ":icons/fileopen.png". * Installed with the package, or in the user's equivalent home directory location. For example, - on Linux, in /usr/share/ or /usr/local/share/ - on Linux, in $HOME/.local/share/ - on OS/X, in /Library/Application Support/ - on OS/X, in $HOME/Library/Application Support/ - on Windows, in %ProgramFiles%// - on Windows, in (where?) something from http://msdn.microsoft.com/en-us/library/dd378457%28v=vs.85%29.aspx ? These locations are searched in reverse order (user-installed copies take priority over system-installed copies take priority over bundled copies). Also, /usr/local takes priority over /usr. */ QStringList ResourceFinder::getSystemResourcePrefixList() { // returned in order of priority QStringList list; #ifdef Q_OS_WIN32 char *programFiles = getenv("ProgramFiles"); if (programFiles && programFiles[0]) { list << QString("%1/%2/%3") .arg(programFiles) .arg(qApp->organizationName()) .arg(qApp->applicationName()); } else { list << QString("C:/Program Files/%1/%2") .arg(qApp->organizationName()) .arg(qApp->applicationName()); } #else #ifdef Q_OS_MAC list << QString("/Library/Application Support/%1") .arg(qApp->applicationName()); #else list << QString("/usr/local/share/%1") .arg(qApp->applicationName()); list << QString("/usr/share/%1") .arg(qApp->applicationName()); #endif #endif return list; } static QString getOldStyleUserResourcePrefix() { #ifdef Q_OS_WIN32 // This is awkward and does not work correctly for non-ASCII home // directory names, hence getNewStyleUserResourcePrefix() below char *homedrive = getenv("HOMEDRIVE"); char *homepath = getenv("HOMEPATH"); QString home; if (homedrive && homepath) { home = QString("%1%2").arg(homedrive).arg(homepath); } else { home = QDir::home().absolutePath(); } if (home == "") return ""; return QString("%1/.%2").arg(home).arg(qApp->applicationName()); //!!! wrong #else char *home = getenv("HOME"); if (!home || !home[0]) return ""; #ifdef Q_OS_MAC return QString("%1/Library/Application Support/%2") .arg(home) .arg(qApp->applicationName()); #else return QString("%1/.local/share/%2") .arg(home) .arg(qApp->applicationName()); #endif #endif } static QString getNewStyleUserResourcePrefix() { if (qApp->applicationName() == "") { cerr << "ERROR: Can't use ResourceFinder before setting application name" << endl; throw std::logic_error("Can't use ResourceFinder before setting application name"); } #if QT_VERSION >= 0x050000 // This is expected to be much more reliable than // getOldStyleUserResourcePrefix(), but it returns a different // directory because it includes the organisation name (which is // fair enough). Hence migrateOldStyleResources() which moves // across any resources found in the old-style path the first time // we look for the new-style one #if QT_VERSION >= 0x050400 return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); #else cerr << "WARNING: ResourceFinder::getOldStyleUserResourcePrefix: Building with older version of Qt (pre 5.4), resource location may be incompatible with future versions" << endl; return QStandardPaths::writableLocation(QStandardPaths::DataLocation); #endif #else cerr << "WARNING: ResourceFinder::getOldStyleUserResourcePrefix: Building with very old version of Qt (pre 5.0?), resource location may be incompatible with future versions" << endl; return getOldStyleUserResourcePrefix(); #endif } static void migrateOldStyleResources() { QString oldPath = getOldStyleUserResourcePrefix(); QString newPath = getNewStyleUserResourcePrefix(); if (oldPath != newPath && QDir(oldPath).exists() && !QDir(newPath).exists()) { QDir d(oldPath); if (!d.mkpath(newPath)) { cerr << "WARNING: Failed to create new-style resource path \"" << newPath << "\" to migrate old resources to" << endl; return; } QDir target(newPath); bool success = true; QStringList entries (d.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)); foreach (QString entry, entries) { if (d.rename(entry, target.filePath(entry))) { cerr << "NOTE: Successfully moved resource \"" << entry << "\" from old resource path to new" << endl; } else { cerr << "WARNING: Failed to move old resource \"" << entry << "\" from old location \"" << oldPath << "\" to new location \"" << newPath << "\"" << endl; success = false; } } if (success) { if (!d.rmdir(oldPath)) { cerr << "WARNING: Failed to remove old resource path \"" << oldPath << "\" after migrating " << entries.size() << " resource(s) to new path \"" << newPath << "\" (directory not empty?)" << endl; } else { cerr << "NOTE: Successfully moved " << entries.size() << " resource(s) from old resource " << "path \"" << oldPath << "\" to new path \"" << newPath << "\"" << endl; } } } } QString ResourceFinder::getUserResourcePrefix() { migrateOldStyleResources(); return getNewStyleUserResourcePrefix(); } QStringList ResourceFinder::getResourcePrefixList() { // returned in order of priority QStringList list; QString user = getUserResourcePrefix(); if (user != "") list << user; list << getSystemResourcePrefixList(); list << ":"; // bundled resource location return list; } QString ResourceFinder::getResourcePath(QString resourceCat, QString fileName) { // We don't simply call getResourceDir here, because that returns // only the "installed file" location. We also want to search the // bundled resources and user-saved files. QStringList prefixes = getResourcePrefixList(); if (resourceCat != "") resourceCat = "/" + resourceCat; for (QStringList::const_iterator i = prefixes.begin(); i != prefixes.end(); ++i) { QString prefix = *i; // cerr << "ResourceFinder::getResourcePath: Looking up file \"" << fileName << "\" for category \"" << resourceCat << "\" in prefix \"" << prefix << "\"" << endl; QString path = QString("%1%2/%3").arg(prefix).arg(resourceCat).arg(fileName); if (QFileInfo(path).exists() && QFileInfo(path).isReadable()) { // cerr << "Found it!" << endl; return path; } } return ""; } QString ResourceFinder::getResourceDir(QString resourceCat) { // Returns only the "installed file" location QStringList prefixes = getSystemResourcePrefixList(); if (resourceCat != "") resourceCat = "/" + resourceCat; for (QStringList::const_iterator i = prefixes.begin(); i != prefixes.end(); ++i) { QString prefix = *i; QString path = QString("%1%2").arg(prefix).arg(resourceCat); if (QFileInfo(path).exists() && QFileInfo(path).isDir() && QFileInfo(path).isReadable()) { return path; } } return ""; } QString ResourceFinder::getResourceSavePath(QString resourceCat, QString fileName) { QString dir = getResourceSaveDir(resourceCat); if (dir == "") return ""; return dir + "/" + fileName; } QString ResourceFinder::getResourceSaveDir(QString resourceCat) { // Returns the "user" location QString user = getUserResourcePrefix(); if (user == "") return ""; if (resourceCat != "") resourceCat = "/" + resourceCat; QDir userDir(user); if (!userDir.exists()) { if (!userDir.mkpath(user)) { cerr << "ResourceFinder::getResourceSaveDir: ERROR: Failed to create user resource path \"" << user << "\"" << endl; return ""; } } if (resourceCat != "") { QString save = QString("%1%2").arg(user).arg(resourceCat); QDir saveDir(save); if (!saveDir.exists()) { if (!saveDir.mkpath(save)) { cerr << "ResourceFinder::getResourceSaveDir: ERROR: Failed to create user resource path \"" << save << "\"" << endl; return ""; } } return save; } else { return user; } } QStringList ResourceFinder::getResourceFiles(QString resourceCat, QString fileExt) { QStringList results; QStringList prefixes = getResourcePrefixList(); QStringList filters; filters << QString("*.%1").arg(fileExt); for (QStringList::const_iterator i = prefixes.begin(); i != prefixes.end(); ++i) { QString prefix = *i; QString path; if (resourceCat != "") { path = QString("%1/%2").arg(prefix).arg(resourceCat); } else { path = prefix; } QDir dir(path); if (!dir.exists()) continue; dir.setNameFilters(filters); QStringList entries = dir.entryList (QDir::Files | QDir::Readable, QDir::Name); for (QStringList::const_iterator j = entries.begin(); j != entries.end(); ++j) { results << QString("%1/%2").arg(path).arg(*j); } } return results; } bool ResourceFinder::unbundleResource(QString resourceCat, QString fileName) { QString path = getResourcePath(resourceCat, fileName); if (!path.startsWith(':')) return true; // This is the lowest-priority alternative path for this // resource, so we know that there must be no installed copy. // Install one to the user location. SVDEBUG << "ResourceFinder::unbundleResource: File " << fileName << " is bundled, un-bundling it" << endl; QString target = getResourceSavePath(resourceCat, fileName); QFile file(path); if (!file.copy(target)) { cerr << "ResourceFinder::unbundleResource: ERROR: Failed to un-bundle resource file \"" << fileName << "\" to user location \"" << target << "\"" << endl; return false; } QFile chmod(target); chmod.setPermissions(QFile::ReadOwner | QFile::ReadUser | /* for potential platform-independence */ QFile::ReadGroup | QFile::ReadOther | QFile::WriteOwner| QFile::WriteUser); /* for potential platform-independence */ return true; } sonic-visualiser-3.0.3/svcore/base/ResourceFinder.h0000644000000000000000000001171313111512442020442 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2005-2011 Chris Cannam and the Rosegarden development team. */ #ifndef _RESOURCE_FINDER_H_ #define _RESOURCE_FINDER_H_ #include #include "Debug.h" class ResourceFinder { public: ResourceFinder() { } virtual ~ResourceFinder() { } /** * Return the location (as a true file path, or a Qt4 ":"-prefixed * resource path) of the file best matching the given resource * filename in the given resource category. * * Category should be a relative directory path without leading or * trailing slashes, for example "chords". The fileName is the * remainder of the file name without any path content, for * example "user_chords.xml". * * Returns an empty string if no matching resource is found. * * Use this when you know that a particular resource is required * and just need to locate it. */ QString getResourcePath(QString resourceCat, QString fileName); /** * Return a list of full file paths for files with the given file * extension, found in the given resource category. * * Category should be a relative directory path without leading or * trailing slashes, for example "chords". File extension should * be the extension without the dot, for example "xml". Returned * list may mix true file paths in both installed and user * locations with Qt4 ":"-prefixed resource paths. * * Use this when you need to enumerate the options available for * use directly in the program (rather than e.g. offering the user * a file-open dialog). */ QStringList getResourceFiles(QString resourceCat, QString fileExt); /** * Return the true file path for installed resource files in the * given resource category. Category should be a relative * directory path without leading or trailing slashes, for example * "chords". Note that resources may also exist in the Qt4 * resource bundle; this method only returns the external * (installed) resource location. Use getResourceFiles instead to * return an authoritative list of available resources of a given * type. * * Use this when you need a file path, e.g. for use in a file * finder dialog. */ QString getResourceDir(QString resourceCat); /** * Return the true file path for the location in which the named * resource file in the given resource category should be saved. * ResourceFinder will make a best effort to ensure this directory * actually exists, before returning. */ QString getResourceSavePath(QString resourceCat, QString fileName); /** * Return the true file path for the location in which resource * files in the given resource category should be saved. */ QString getResourceSaveDir(QString resourceCat); /** * If the named resource file in the given resource category is * available only as a bundled resource, copy it out into the user * location returned by getResourceSavePath so that it can be read * by non-Qt code. Any subsequent call to getResourcePath for * this resource should return a true file path (if the resource * exists) in either user or system location, or an empty string * (if the resource does not exist), but never a ":"-prefixed * resource path. This function does not overwrite any existing * unbundled copy of the resource. * * Return false if a system error occurs during unbundling * (e.g. disk full). */ bool unbundleResource(QString resourceCat, QString fileName); /** * Return the root path for user-specific resource installation * for this application (i.e. resources beneath the user's home * directory). */ QString getUserResourcePrefix(); /** * Return the root paths for systemwide resource installations for * this application. */ QStringList getSystemResourcePrefixList(); /** * Return all root paths for resource installations for this * application, in the order in which they will be searched. This * list consists of the user-specific path * (getUserResourcePrefix()) followed by the systemwide paths * (getSystemResourcePrefixList()). */ QStringList getResourcePrefixList(); }; #endif sonic-visualiser-3.0.3/svcore/base/RingBuffer.h0000644000000000000000000003504213111512442017555 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _RINGBUFFER_H_ #define _RINGBUFFER_H_ #include #include "system/System.h" #include // memcpy, memset &c //#define DEBUG_RINGBUFFER 1 #ifdef DEBUG_RINGBUFFER #include #endif /** * RingBuffer implements a lock-free ring buffer for one writer and N * readers, that is to be used to store a sample type T. * * For efficiency, RingBuffer frequently initialises samples by * writing zeroes into their memory space, so T should normally be a * simple type that can safely be set to zero using memset. */ template class RingBuffer { public: /** * Create a ring buffer with room to write n samples. * * Note that the internal storage size will actually be n+1 * samples, as one element is unavailable for administrative * reasons. Since the ring buffer performs best if its size is a * power of two, this means n should ideally be some power of two * minus one. */ RingBuffer(int n); virtual ~RingBuffer(); /** * Return the total capacity of the ring buffer in samples. * (This is the argument n passed to the constructor.) */ int getSize() const; /** * Return a new ring buffer (allocated with "new" -- caller must * delete when no longer needed) of the given size, containing the * same data as this one as perceived by reader 0 of this buffer. * If another thread reads from or writes to this buffer during * the call, the contents of the new buffer may be incomplete or * inconsistent. If this buffer's data will not fit in the new * size, the contents are undefined. */ RingBuffer *resized(int newSize) const; /** * Lock the ring buffer into physical memory. Returns true * for success. */ bool mlock(); /** * Reset read and write pointers, thus emptying the buffer. * Should be called from the write thread. */ void reset(); /** * Return the amount of data available for reading by reader R, in * samples. */ int getReadSpace(int R = 0) const; /** * Return the amount of space available for writing, in samples. */ int getWriteSpace() const; /** * Read n samples from the buffer, for reader R. If fewer than n * are available, the remainder will be zeroed out. Returns the * number of samples actually read. */ int read(T *destination, int n, int R = 0); /** * Read n samples from the buffer, for reader R, adding them to * the destination. If fewer than n are available, the remainder * will be left alone. Returns the number of samples actually * read. */ int readAdding(T *destination, int n, int R = 0); /** * Read one sample from the buffer, for reader R. If no sample is * available, this will silently return zero. Calling this * repeatedly is obviously slower than calling read once, but it * may be good enough if you don't want to allocate a buffer to * read into. */ T readOne(int R = 0); /** * Read n samples from the buffer, if available, for reader R, * without advancing the read pointer -- i.e. a subsequent read() * or skip() will be necessary to empty the buffer. If fewer than * n are available, the remainder will be zeroed out. Returns the * number of samples actually read. */ int peek(T *destination, int n, int R = 0) const; /** * Read one sample from the buffer, if available, without * advancing the read pointer -- i.e. a subsequent read() or * skip() will be necessary to empty the buffer. Returns zero if * no sample was available. */ T peekOne(int R = 0) const; /** * Pretend to read n samples from the buffer, for reader R, * without actually returning them (i.e. discard the next n * samples). Returns the number of samples actually available for * discarding. */ int skip(int n, int R = 0); /** * Write n samples to the buffer. If insufficient space is * available, not all samples may actually be written. Returns * the number of samples actually written. */ int write(const T *source, int n); /** * Write n zero-value samples to the buffer. If insufficient * space is available, not all zeros may actually be written. * Returns the number of zeroes actually written. */ int zero(int n); protected: T *m_buffer; bool m_mlocked; int m_writer; int *m_readers; int m_size; int m_spare; private: RingBuffer(const RingBuffer &); // not provided RingBuffer &operator=(const RingBuffer &); // not provided }; template RingBuffer::RingBuffer(int n) : m_buffer(new T[n + 1]), m_mlocked(false), m_writer(0), m_readers(new int[N]), m_size(n + 1) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::RingBuffer(" << n << ")" << std::endl; #endif /* std::cerr << "note: sizeof(RingBuffer = " << sizeof(RingBuffer) << ")" << std::endl; std::cerr << "this = " << this << std::endl; std::cerr << "&m_buffer = " << &m_buffer << std::endl; std::cerr << "&m_mlocked = " << &m_mlocked << std::endl; std::cerr << "&m_writer = " << &m_writer << std::endl; std::cerr << "&m_readers = " << &m_readers << std::endl; std::cerr << "&m_size = " << &m_size << std::endl; */ for (int i = 0; i < N; ++i) m_readers[i] = 0; } template RingBuffer::~RingBuffer() { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::~RingBuffer" << std::endl; #endif delete[] m_readers; if (m_mlocked) { MUNLOCK((void *)m_buffer, m_size * sizeof(T)); } delete[] m_buffer; } template int RingBuffer::getSize() const { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::getSize(): " << m_size-1 << std::endl; #endif return m_size - 1; } template RingBuffer * RingBuffer::resized(int newSize) const { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::resized(" << newSize << ")" << std::endl; #endif RingBuffer *newBuffer = new RingBuffer(newSize); int w = m_writer; int r = m_readers[0]; while (r != w) { T value = m_buffer[r]; newBuffer->write(&value, 1); if (++r == m_size) r = 0; } return newBuffer; } template bool RingBuffer::mlock() { if (MLOCK((void *)m_buffer, m_size * sizeof(T))) return false; m_mlocked = true; return true; } template void RingBuffer::reset() { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::reset" << std::endl; #endif m_writer = 0; for (int i = 0; i < N; ++i) m_readers[i] = 0; } template int RingBuffer::getReadSpace(int R) const { int writer = m_writer; int reader = m_readers[R]; int space = 0; if (writer > reader) space = writer - reader; else space = ((writer + m_size) - reader) % m_size; #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::getReadSpace(" << R << "): " << space << std::endl; #endif return space; } template int RingBuffer::getWriteSpace() const { int space = 0; for (int i = 0; i < N; ++i) { int here = (m_readers[i] + m_size - m_writer - 1) % m_size; if (i == 0 || here < space) space = here; } #ifdef DEBUG_RINGBUFFER int rs(getReadSpace()), rp(m_readers[0]); std::cerr << "RingBuffer: write space " << space << ", read space " << rs << ", total " << (space + rs) << ", m_size " << m_size << std::endl; std::cerr << "RingBuffer: reader " << rp << ", writer " << m_writer << std::endl; #endif #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::getWriteSpace(): " << space << std::endl; #endif return space; } template int RingBuffer::read(T *destination, int n, int R) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::read(dest, " << n << ", " << R << ")" << std::endl; #endif int available = getReadSpace(R); if (n > available) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: Only " << available << " samples available" << std::endl; #endif memset(destination + available, 0, (n - available) * sizeof(T)); n = available; } if (n == 0) return n; int here = m_size - m_readers[R]; if (here >= n) { memcpy(destination, m_buffer + m_readers[R], n * sizeof(T)); } else { memcpy(destination, m_buffer + m_readers[R], here * sizeof(T)); memcpy(destination + here, m_buffer, (n - here) * sizeof(T)); } MBARRIER(); m_readers[R] = (m_readers[R] + n) % m_size; #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::read: read " << n << ", reader now " << m_readers[R] << std::endl; #endif return n; } template int RingBuffer::readAdding(T *destination, int n, int R) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::readAdding(dest, " << n << ", " << R << ")" << std::endl; #endif int available = getReadSpace(R); if (n > available) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: Only " << available << " samples available" << std::endl; #endif n = available; } if (n == 0) return n; int here = m_size - m_readers[R]; if (here >= n) { for (int i = 0; i < n; ++i) { destination[i] += (m_buffer + m_readers[R])[i]; } } else { for (int i = 0; i < here; ++i) { destination[i] += (m_buffer + m_readers[R])[i]; } for (int i = 0; i < (n - here); ++i) { destination[i + here] += m_buffer[i]; } } MBARRIER(); m_readers[R] = (m_readers[R] + n) % m_size; return n; } template T RingBuffer::readOne(int R) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::readOne(" << R << ")" << std::endl; #endif if (m_writer == m_readers[R]) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: No sample available" << std::endl; #endif T t; memset(&t, 0, sizeof(T)); return t; } T value = m_buffer[m_readers[R]]; MBARRIER(); if (++m_readers[R] == m_size) m_readers[R] = 0; return value; } template int RingBuffer::peek(T *destination, int n, int R) const { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::peek(dest, " << n << ", " << R << ")" << std::endl; #endif int available = getReadSpace(R); if (n > available) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: Only " << available << " samples available" << std::endl; #endif memset(destination + available, 0, (n - available) * sizeof(T)); n = available; } if (n == 0) return n; int here = m_size - m_readers[R]; if (here >= n) { memcpy(destination, m_buffer + m_readers[R], n * sizeof(T)); } else { memcpy(destination, m_buffer + m_readers[R], here * sizeof(T)); memcpy(destination + here, m_buffer, (n - here) * sizeof(T)); } #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::peek: read " << n << std::endl; #endif return n; } template T RingBuffer::peekOne(int R) const { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::peek(" << R << ")" << std::endl; #endif if (m_writer == m_readers[R]) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: No sample available" << std::endl; #endif T t; memset(&t, 0, sizeof(T)); return t; } T value = m_buffer[m_readers[R]]; return value; } template int RingBuffer::skip(int n, int R) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::skip(" << n << ", " << R << ")" << std::endl; #endif int available = getReadSpace(R); if (n > available) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: Only " << available << " samples available" << std::endl; #endif n = available; } if (n == 0) return n; m_readers[R] = (m_readers[R] + n) % m_size; return n; } template int RingBuffer::write(const T *source, int n) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::write(" << n << ")" << std::endl; #endif int available = getWriteSpace(); if (n > available) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: Only room for " << available << " samples" << std::endl; #endif n = available; } if (n == 0) return n; int here = m_size - m_writer; if (here >= n) { memcpy(m_buffer + m_writer, source, n * sizeof(T)); } else { memcpy(m_buffer + m_writer, source, here * sizeof(T)); memcpy(m_buffer, source + here, (n - here) * sizeof(T)); } MBARRIER(); m_writer = (m_writer + n) % m_size; #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::write: wrote " << n << ", writer now " << m_writer << std::endl; #endif return n; } template int RingBuffer::zero(int n) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::zero(" << n << ")" << std::endl; #endif int available = getWriteSpace(); if (n > available) { #ifdef DEBUG_RINGBUFFER std::cerr << "WARNING: Only room for " << available << " samples" << std::endl; #endif n = available; } if (n == 0) return n; int here = m_size - m_writer; if (here >= n) { memset(m_buffer + m_writer, 0, n * sizeof(T)); } else { memset(m_buffer + m_writer, 0, here * sizeof(T)); memset(m_buffer, 0, (n - here) * sizeof(T)); } MBARRIER(); m_writer = (m_writer + n) % m_size; return n; } #endif // _RINGBUFFER_H_ sonic-visualiser-3.0.3/svcore/base/ScaleTickIntervals.h0000644000000000000000000002233213111512442021254 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2017 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_SCALE_TICK_INTERVALS_H #define SV_SCALE_TICK_INTERVALS_H #include #include #include #include "LogRange.h" #include "Debug.h" // Can't have this on by default, as we're called on every refresh //#define DEBUG_SCALE_TICK_INTERVALS 1 class ScaleTickIntervals { public: struct Range { double min; // start of value range double max; // end of value range int n; // number of divisions (approximate only) }; struct Tick { double value; // value this tick represents std::string label; // value as written }; typedef std::vector Ticks; /** * Return a set of ticks that divide the range r linearly into * roughly r.n equal divisions, in such a way as to yield * reasonably human-readable labels. */ static Ticks linear(Range r) { return linearTicks(r); } /** * Return a set of ticks that divide the range r into roughly r.n * logarithmic divisions, in such a way as to yield reasonably * human-readable labels. */ static Ticks logarithmic(Range r) { LogRange::mapRange(r.min, r.max); return logarithmicAlready(r); } /** * Return a set of ticks that divide the range r into roughly r.n * logarithmic divisions, on the asssumption that r.min and r.max * already represent the logarithms of the boundary values rather * than the values themselves. */ static Ticks logarithmicAlready(Range r) { return logTicks(r); } private: enum Display { Fixed, Scientific, Auto }; struct Instruction { double initial; // value of first tick double limit; // max from original range double spacing; // increment between ticks double roundTo; // what all displayed values should be rounded to Display display; // whether to use fixed precision (%e, %f, or %g) int precision; // number of dp (%f) or sf (%e) bool logUnmap; // true if values represent logs of display values }; static Instruction linearInstruction(Range r) { Display display = Auto; if (r.max < r.min) { return linearInstruction({ r.max, r.min, r.n }); } if (r.n < 1 || r.max == r.min) { return { r.min, r.min, 1.0, r.min, display, 1, false }; } double inc = (r.max - r.min) / r.n; double digInc = log10(inc); double digMax = log10(fabs(r.max)); double digMin = log10(fabs(r.min)); int precInc = int(floor(digInc)); double roundTo = pow(10.0, precInc); if (precInc > -4 && precInc < 4) { display = Fixed; } else if ((digMax >= -2.0 && digMax <= 3.0) && (digMin >= -3.0 && digMin <= 3.0)) { display = Fixed; } else { display = Scientific; } int precRange = int(ceil(digMax - digInc)); int prec = 1; if (display == Fixed) { if (digInc < 0) { prec = -precInc; } else { prec = 0; } } else { prec = precRange; } #ifdef DEBUG_SCALE_TICK_INTERVALS SVDEBUG << "ScaleTickIntervals: calculating linearInstruction" << endl << "ScaleTickIntervals: min = " << r.min << ", max = " << r.max << ", n = " << r.n << ", inc = " << inc << endl; SVDEBUG << "ScaleTickIntervals: digMax = " << digMax << ", digInc = " << digInc << endl; SVDEBUG << "ScaleTickIntervals: display = " << display << ", inc = " << inc << ", precInc = " << precInc << ", precRange = " << precRange << ", prec = " << prec << ", roundTo = " << roundTo << endl; #endif double min = r.min; if (roundTo != 0.0) { inc = round(inc / roundTo) * roundTo; if (inc < roundTo) inc = roundTo; min = ceil(min / roundTo) * roundTo; if (min > r.max) min = r.max; } if (display == Scientific && min != 0.0) { double digNewMin = log10(fabs(min)); if (digNewMin < digInc) { prec = int(ceil(digMax - digNewMin)); #ifdef DEBUG_SCALE_TICK_INTERVALS SVDEBUG << "ScaleTickIntervals: min is smaller than increment, adjusting prec to " << prec << endl; #endif } } return { min, r.max, inc, roundTo, display, prec, false }; } static Instruction logInstruction(Range r) { Display display = Auto; if (r.n < 1) { return {}; } if (r.max < r.min) { return logInstruction({ r.max, r.min, r.n }); } if (r.max == r.min) { return { r.min, r.max, 1.0, r.min, display, 1, true }; } double inc = (r.max - r.min) / r.n; double digInc = log10(inc); int precInc = int(floor(digInc)); double roundTo = pow(10.0, precInc); if (roundTo != 0.0) { inc = round(inc / roundTo) * roundTo; if (inc < roundTo) inc = roundTo; } // if inc is close to giving us powers of two, nudge it if (fabs(inc - 0.301) < 0.01) { inc = log10(2.0); } // smallest increment as displayed double minDispInc = LogRange::unmap(r.min + inc) - LogRange::unmap(r.min); int prec = 1; if (minDispInc > 0.0) { prec = int(floor(log10(minDispInc))); if (prec < 0) prec = -prec; } if (r.max >= -2.0 && r.max <= 3.0 && r.min >= -3.0 && r.min <= 3.0) { display = Fixed; if (prec == 0) prec = 1; } #ifdef DEBUG_SCALE_TICK_INTERVALS SVDEBUG << "ScaleTickIntervals: calculating logInstruction" << endl << "ScaleTickIntervals: min = " << r.min << ", max = " << r.max << ", n = " << r.n << ", inc = " << inc << ", minDispInc = " << minDispInc << ", digInc = " << digInc << endl; SVDEBUG << "ScaleTickIntervals: display = " << display << ", inc = " << inc << ", precInc = " << precInc << ", prec = " << prec << endl; SVDEBUG << "ScaleTickIntervals: roundTo = " << roundTo << endl; #endif double min = r.min; if (inc != 0.0) { min = ceil(r.min / inc) * inc; if (min > r.max) min = r.max; } return { min, r.max, inc, 0.0, display, prec, true }; } static Ticks linearTicks(Range r) { Instruction instruction = linearInstruction(r); Ticks ticks = explode(instruction); return ticks; } static Ticks logTicks(Range r) { Instruction instruction = logInstruction(r); Ticks ticks = explode(instruction); return ticks; } static Tick makeTick(Display display, int precision, double value) { const int buflen = 40; char buffer[buflen]; snprintf(buffer, buflen, display == Auto ? "%.*g" : display == Fixed ? "%.*f" : "%.*e", precision, value); return Tick({ value, std::string(buffer) }); } static Ticks explode(Instruction instruction) { #ifdef DEBUG_SCALE_TICK_INTERVALS SVDEBUG << "ScaleTickIntervals::explode:" << endl << "initial = " << instruction.initial << ", limit = " << instruction.limit << ", spacing = " << instruction.spacing << ", roundTo = " << instruction.roundTo << ", display = " << instruction.display << ", precision = " << instruction.precision << ", logUnmap = " << instruction.logUnmap << endl; #endif if (instruction.spacing == 0.0) { return {}; } double eps = 1e-7; if (instruction.spacing < eps * 10.0) { eps = instruction.spacing / 10.0; } double max = instruction.limit; int n = 0; Ticks ticks; while (true) { double value = instruction.initial + n * instruction.spacing; if (value >= max + eps) { break; } if (instruction.logUnmap) { value = pow(10.0, value); } if (instruction.roundTo != 0.0) { value = instruction.roundTo * round(value / instruction.roundTo); } ticks.push_back(makeTick(instruction.display, instruction.precision, value)); ++n; } return ticks; } }; #endif sonic-visualiser-3.0.3/svcore/base/Scavenger.h0000644000000000000000000001114513111512442017437 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _SCAVENGER_H_ #define _SCAVENGER_H_ #include "system/System.h" #include #include #include #include /** * A very simple class that facilitates running things like plugins * without locking, by collecting unwanted objects and deleting them * after a delay so as to be sure nobody's in the middle of using * them. Requires scavenge() to be called regularly from a non-RT * thread. * * This is currently not at all suitable for large numbers of objects * -- it's just a quick hack for use with things like plugins. */ template class Scavenger { public: Scavenger(int sec = 2, int defaultObjectListSize = 200); ~Scavenger(); /** * Call from an RT thread etc., to pass ownership of t to us. * Only one thread should be calling this on any given scavenger. */ void claim(T *t); /** * Call from a non-RT thread. * Only one thread should be calling this on any given scavenger. */ void scavenge(bool clearNow = false); protected: typedef std::pair ObjectTimePair; typedef std::vector ObjectTimeList; ObjectTimeList m_objects; time_t m_sec; typedef std::list ObjectList; ObjectList m_excess; time_t m_lastExcess; QMutex m_excessMutex; void pushExcess(T *); void clearExcess(time_t); unsigned int m_claimed; unsigned int m_scavenged; }; /** * A wrapper to permit arrays to be scavenged. */ template class ScavengerArrayWrapper { public: ScavengerArrayWrapper(T *array) : m_array(array) { } ~ScavengerArrayWrapper() { delete[] m_array; } private: T *m_array; }; template Scavenger::Scavenger(int sec, int defaultObjectListSize) : m_objects(ObjectTimeList(defaultObjectListSize)), m_sec(sec), m_lastExcess(0), m_claimed(0), m_scavenged(0) { } template Scavenger::~Scavenger() { if (m_scavenged < m_claimed) { for (size_t i = 0; i < m_objects.size(); ++i) { ObjectTimePair &pair = m_objects[i]; if (pair.first != 0) { T *ot = pair.first; pair.first = 0; delete ot; ++m_scavenged; } } } clearExcess(0); } template void Scavenger::claim(T *t) { // std::cerr << "Scavenger::claim(" << t << ")" << std::endl; struct timeval tv; (void)gettimeofday(&tv, 0); time_t sec = tv.tv_sec; for (size_t i = 0; i < m_objects.size(); ++i) { ObjectTimePair &pair = m_objects[i]; if (pair.first == 0) { pair.second = sec; pair.first = t; ++m_claimed; return; } } std::cerr << "WARNING: Scavenger::claim(" << t << "): run out of slots, " << "using non-RT-safe method" << std::endl; pushExcess(t); } template void Scavenger::scavenge(bool clearNow) { // std::cerr << "Scavenger::scavenge: scavenged " << m_scavenged << ", claimed " << m_claimed << std::endl; if (m_scavenged >= m_claimed) return; struct timeval tv; (void)gettimeofday(&tv, 0); time_t sec = tv.tv_sec; for (size_t i = 0; i < m_objects.size(); ++i) { ObjectTimePair &pair = m_objects[i]; if (clearNow || (pair.first != 0 && pair.second + m_sec < sec)) { T *ot = pair.first; pair.first = 0; delete ot; ++m_scavenged; } } if (sec > m_lastExcess + m_sec) { clearExcess(sec); } } template void Scavenger::pushExcess(T *t) { m_excessMutex.lock(); m_excess.push_back(t); struct timeval tv; (void)gettimeofday(&tv, 0); m_lastExcess = tv.tv_sec; m_excessMutex.unlock(); } template void Scavenger::clearExcess(time_t sec) { m_excessMutex.lock(); for (typename ObjectList::iterator i = m_excess.begin(); i != m_excess.end(); ++i) { delete *i; } m_excess.clear(); m_lastExcess = sec; m_excessMutex.unlock(); } #endif sonic-visualiser-3.0.3/svcore/base/Selection.cpp0000644000000000000000000001225213111512442020002 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Selection.h" #include Selection::Selection() : m_startFrame(0), m_endFrame(0) { } Selection::Selection(sv_frame_t startFrame, sv_frame_t endFrame) : m_startFrame(startFrame), m_endFrame(endFrame) { if (m_startFrame > m_endFrame) { sv_frame_t tmp = m_endFrame; m_endFrame = m_startFrame; m_startFrame = tmp; } } Selection::Selection(const Selection &s) : m_startFrame(s.m_startFrame), m_endFrame(s.m_endFrame) { } Selection & Selection::operator=(const Selection &s) { if (this != &s) { m_startFrame = s.m_startFrame; m_endFrame = s.m_endFrame; } return *this; } Selection::~Selection() { } bool Selection::isEmpty() const { return m_startFrame == m_endFrame; } sv_frame_t Selection::getStartFrame() const { return m_startFrame; } sv_frame_t Selection::getEndFrame() const { return m_endFrame; } bool Selection::contains(sv_frame_t frame) const { return (frame >= m_startFrame) && (frame < m_endFrame); } bool Selection::operator<(const Selection &s) const { if (isEmpty()) { if (s.isEmpty()) return false; else return true; } else { if (s.isEmpty()) return false; else return (m_startFrame < s.m_startFrame); } } bool Selection::operator==(const Selection &s) const { if (isEmpty()) return s.isEmpty(); return (m_startFrame == s.m_startFrame && m_endFrame == s.m_endFrame); } MultiSelection::MultiSelection() { } MultiSelection::~MultiSelection() { } const MultiSelection::SelectionList & MultiSelection::getSelections() const { return m_selections; } void MultiSelection::setSelection(const Selection &selection) { clearSelections(); addSelection(selection); } void MultiSelection::addSelection(const Selection &selection) { m_selections.insert(selection); // Cope with a sitation where the new selection overlaps one or // more existing ones. This is a terribly inefficient way to do // this, but that probably isn't significant in real life. // It's essential for the correct operation of // getContainingSelection that the selections do not overlap, so // this is not just a frill. for (SelectionList::iterator i = m_selections.begin(); i != m_selections.end(); ) { SelectionList::iterator j = i; if (++j == m_selections.end()) break; if (i->getEndFrame() >= j->getStartFrame()) { Selection merged(i->getStartFrame(), std::max(i->getEndFrame(), j->getEndFrame())); m_selections.erase(i); m_selections.erase(j); m_selections.insert(merged); i = m_selections.begin(); } else { ++i; } } } void MultiSelection::removeSelection(const Selection &selection) { //!!! Likewise this needs to cope correctly with the situation //where selection is not one of the original selection set but //simply overlaps one of them (cutting down the original selection //appropriately) if (m_selections.find(selection) != m_selections.end()) { m_selections.erase(selection); } } void MultiSelection::clearSelections() { if (!m_selections.empty()) { m_selections.clear(); } } void MultiSelection::getExtents(sv_frame_t &startFrame, sv_frame_t &endFrame) const { startFrame = 0; endFrame = 0; for (SelectionList::const_iterator i = m_selections.begin(); i != m_selections.end(); ++i) { if (i == m_selections.begin() || i->getStartFrame() < startFrame) { startFrame = i->getStartFrame(); } if (i == m_selections.begin() || i->getEndFrame() > endFrame) { endFrame = i->getEndFrame(); } } } Selection MultiSelection::getContainingSelection(sv_frame_t frame, bool defaultToFollowing) const { // This scales very badly with the number of selections, but it's // more efficient for very small numbers of selections than a more // scalable method, and I think that may be what we need for (SelectionList::const_iterator i = m_selections.begin(); i != m_selections.end(); ++i) { if (i->contains(frame)) return *i; if (i->getStartFrame() > frame) { if (defaultToFollowing) return *i; else return Selection(); } } return Selection(); } void MultiSelection::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent << QString("\n").arg(extraAttributes); for (SelectionList::iterator i = m_selections.begin(); i != m_selections.end(); ++i) { stream << indent << QString(" \n") .arg(i->getStartFrame()).arg(i->getEndFrame()); } stream << indent << "\n"; } sonic-visualiser-3.0.3/svcore/base/Selection.h0000644000000000000000000000554613111512442017457 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SELECTION_H_ #define _SELECTION_H_ #include #include #include "XmlExportable.h" #include "BaseTypes.h" /** * A selection object simply represents a range in time, via start and * end frame. * * The end frame is the index of the frame just *after* the end of the * selection. For example a selection of length 10 frames starting at * time 0 will have start frame 0 and end frame 10. This will be * contiguous with (rather than overlapping with) a selection that * starts at frame 10. * * Any selection with equal start and end frames is empty, * representing "no selection". All empty selections are equal under * the comparison operators. The default constructor makes an empty * selection with start and end frames equal to zero. */ class Selection { public: Selection(); Selection(sv_frame_t startFrame, sv_frame_t endFrame); Selection(const Selection &); Selection &operator=(const Selection &); virtual ~Selection(); bool isEmpty() const; sv_frame_t getStartFrame() const; sv_frame_t getEndFrame() const; bool contains(sv_frame_t frame) const; bool operator<(const Selection &) const; bool operator==(const Selection &) const; protected: sv_frame_t m_startFrame; sv_frame_t m_endFrame; }; class MultiSelection : public XmlExportable { public: MultiSelection(); virtual ~MultiSelection(); typedef std::set SelectionList; const SelectionList &getSelections() const; void setSelection(const Selection &selection); void addSelection(const Selection &selection); void removeSelection(const Selection &selection); void clearSelections(); void getExtents(sv_frame_t &startFrame, sv_frame_t &endFrame) const; /** * Return the selection that contains a given frame. * If defaultToFollowing is true, and if the frame is not in a * selected area, return the next selection after the given frame. * Return the empty selection if no appropriate selection is found. */ Selection getContainingSelection(sv_frame_t frame, bool defaultToFollowing) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; protected: SelectionList m_selections; }; #endif sonic-visualiser-3.0.3/svcore/base/Serialiser.cpp0000644000000000000000000000271213111512442020157 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Serialiser.h" #include QMutex Serialiser::m_mapMutex; std::map Serialiser::m_mutexMap; Serialiser::Serialiser(QString id) : m_id(id) { m_mapMutex.lock(); if (m_mutexMap.find(m_id) == m_mutexMap.end()) { m_mutexMap[m_id] = new QMutex; } // The id mutexes are never deleted, so once we have a reference // to the one we need, we can hold on to it while we release the // map mutex. We need to release the map mutex, otherwise if the // id mutex is currently held, it will never be released (because // the destructor needs to hold the map mutex to release the id // mutex). QMutex *idMutex = m_mutexMap[m_id]; m_mapMutex.unlock(); idMutex->lock(); } Serialiser::~Serialiser() { m_mapMutex.lock(); m_mutexMap[m_id]->unlock(); m_mapMutex.unlock(); } sonic-visualiser-3.0.3/svcore/base/Serialiser.h0000644000000000000000000000165113111512442017625 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SERIALISER_H_ #define _SERIALISER_H_ #include #include #include class Serialiser { public: Serialiser(QString id); ~Serialiser(); QString getId() const { return m_id; } protected: QString m_id; static QMutex m_mapMutex; static std::map m_mutexMap; }; #endif sonic-visualiser-3.0.3/svcore/base/StorageAdviser.cpp0000644000000000000000000002401113111512442020773 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "StorageAdviser.h" #include "Exceptions.h" #include "TempDirectory.h" #include "system/System.h" #include QString StorageAdviser::criteriaToString(int criteria) { QStringList labels; if (criteria & SpeedCritical) labels.push_back("SpeedCritical"); if (criteria & PrecisionCritical) labels.push_back("PrecisionCritical"); if (criteria & LongRetentionLikely) labels.push_back("LongRetentionLikely"); if (criteria & FrequentLookupLikely) labels.push_back("FrequentLookupLikely"); if (labels.empty()) return "None"; else return labels.join("+"); } QString StorageAdviser::recommendationToString(int recommendation) { QStringList labels; if (recommendation & UseMemory) labels.push_back("UseMemory"); if (recommendation & PreferMemory) labels.push_back("PreferMemory"); if (recommendation & PreferDisc) labels.push_back("PreferDisc"); if (recommendation & UseDisc) labels.push_back("UseDisc"); if (recommendation & ConserveSpace) labels.push_back("ConserveSpace"); if (recommendation & UseAsMuchAsYouLike) labels.push_back("UseAsMuchAsYouLike"); if (labels.empty()) return "None"; else return labels.join("+"); } QString StorageAdviser::storageStatusToString(StorageStatus status) { if (status == Insufficient) return "Insufficient"; if (status == Marginal) return "Marginal"; if (status == Sufficient) return "Sufficient"; return "Unknown"; } size_t StorageAdviser::m_discPlanned = 0; size_t StorageAdviser::m_memoryPlanned = 0; StorageAdviser::Recommendation StorageAdviser::m_baseRecommendation = StorageAdviser::NoRecommendation; StorageAdviser::Recommendation StorageAdviser::recommend(Criteria criteria, size_t minimumSize, size_t maximumSize) { SVDEBUG << "StorageAdviser::recommend: criteria " << criteria << " (" + criteriaToString(criteria) + ")" << ", minimumSize " << minimumSize << ", maximumSize " << maximumSize << endl; if (m_baseRecommendation != NoRecommendation) { SVDEBUG << "StorageAdviser::recommend: Returning fixed recommendation " << m_baseRecommendation << " (" << recommendationToString(m_baseRecommendation) << ")" << endl; return m_baseRecommendation; // for now } QString path; try { path = TempDirectory::getInstance()->getPath(); } catch (std::exception e) { SVDEBUG << "StorageAdviser::recommend: ERROR: Failed to get temporary directory path: " << e.what() << endl; int r = UseMemory | ConserveSpace; SVDEBUG << "StorageAdviser: returning fallback " << r << " (" << recommendationToString(r) << ")" << endl; return Recommendation(r); } ssize_t discFree = GetDiscSpaceMBAvailable(path.toLocal8Bit()); ssize_t memoryFree, memoryTotal; GetRealMemoryMBAvailable(memoryFree, memoryTotal); SVDEBUG << "StorageAdviser: disc space: " << discFree << "M, memory free: " << memoryFree << "M, memory total: " << memoryTotal << "M" << endl; // In 32-bit addressing mode we can't address more than 4Gb. // If the total memory is reported as more than 4Gb, we should // reduce the available amount by the difference between 4Gb // and the total. This won't give us an accurate idea of the // amount of memory available any more, but it should be enough // to prevent us from trying to allocate more for our own use // than can be addressed at all! if (sizeof(void *) < 8) { if (memoryTotal > 4096) { ssize_t excess = memoryTotal - 4096; if (memoryFree > excess) { memoryFree -= excess; } else { memoryFree = 0; } SVDEBUG << "StorageAdviser: more real memory found than we " << "can address in a 32-bit process, reducing free " << "estimate to " << memoryFree << "M accordingly" << endl; } } SVDEBUG << "StorageAdviser: disc planned: " << (m_discPlanned / 1024) << "K, memory planned: " << (m_memoryPlanned / 1024) << "K" << endl; SVDEBUG << "StorageAdviser: min requested: " << minimumSize << "K, max requested: " << maximumSize << "K" << endl; if (discFree > ssize_t(m_discPlanned / 1024 + 1)) { discFree -= m_discPlanned / 1024 + 1; } else if (discFree > 0) { // can also be -1 for unknown discFree = 0; } if (memoryFree > ssize_t(m_memoryPlanned / 1024 + 1)) { memoryFree -= m_memoryPlanned / 1024 + 1; } else if (memoryFree > 0) { // can also be -1 for unknown memoryFree = 0; } //!!! We have a potentially serious problem here if multiple //recommendations are made in advance of any of the resulting //allocations, as the allocations that have been recommended for //won't be taken into account in subsequent recommendations. StorageStatus memoryStatus = Unknown; StorageStatus discStatus = Unknown; ssize_t minmb = ssize_t(minimumSize / 1024 + 1); ssize_t maxmb = ssize_t(maximumSize / 1024 + 1); if (memoryFree == -1) memoryStatus = Unknown; else if (memoryFree < memoryTotal / 3 && memoryFree < 512) memoryStatus = Insufficient; else if (minmb > (memoryFree * 3) / 4) memoryStatus = Insufficient; else if (maxmb > (memoryFree * 3) / 4) memoryStatus = Marginal; else if (minmb > (memoryFree / 3)) memoryStatus = Marginal; else if (memoryTotal == -1 || minmb > (memoryTotal / 10)) memoryStatus = Marginal; else memoryStatus = Sufficient; if (discFree == -1) discStatus = Unknown; else if (minmb > (discFree * 3) / 4) discStatus = Insufficient; else if (maxmb > (discFree / 4)) discStatus = Marginal; else if (minmb > (discFree / 10)) discStatus = Marginal; else discStatus = Sufficient; SVDEBUG << "StorageAdviser: memory status: " << memoryStatus << " (" << storageStatusToString(memoryStatus) << ")" << ", disc status " << discStatus << " (" << storageStatusToString(discStatus) << ")" << endl; int recommendation = NoRecommendation; if (memoryStatus == Insufficient || memoryStatus == Unknown) { recommendation |= UseDisc; if (discStatus == Insufficient && minmb > discFree) { throw InsufficientDiscSpace(path, minmb, discFree); } if (discStatus == Insufficient || discStatus == Marginal) { recommendation |= ConserveSpace; } else if (discStatus == Unknown && !(criteria & PrecisionCritical)) { recommendation |= ConserveSpace; } else { recommendation |= UseAsMuchAsYouLike; } } else if (memoryStatus == Marginal) { if (((criteria & SpeedCritical) || (criteria & FrequentLookupLikely)) && !(criteria & PrecisionCritical) && !(criteria & LongRetentionLikely)) { // requirements suggest a preference for memory if (discStatus != Insufficient) { recommendation |= PreferMemory; } else { recommendation |= UseMemory; } recommendation |= ConserveSpace; } else { if (discStatus == Insufficient) { recommendation |= (UseMemory | ConserveSpace); } else if (discStatus == Marginal) { recommendation |= (PreferMemory | ConserveSpace); } else if (discStatus == Unknown) { recommendation |= (PreferDisc | ConserveSpace); } else { recommendation |= (UseDisc | UseAsMuchAsYouLike); } } } else { if (discStatus == Insufficient) { recommendation |= (UseMemory | ConserveSpace); } else if (discStatus != Sufficient) { recommendation |= (PreferMemory | ConserveSpace); } else { if ((criteria & SpeedCritical) || (criteria & FrequentLookupLikely)) { recommendation |= PreferMemory; if (criteria & PrecisionCritical) { recommendation |= UseAsMuchAsYouLike; } else { recommendation |= ConserveSpace; } } else { recommendation |= PreferDisc; recommendation |= UseAsMuchAsYouLike; } } } SVDEBUG << "StorageAdviser: returning recommendation " << recommendation << " (" << recommendationToString(recommendation) << ")" << endl; return Recommendation(recommendation); } void StorageAdviser::notifyPlannedAllocation(AllocationArea area, size_t size) { if (area == MemoryAllocation) m_memoryPlanned += size; else if (area == DiscAllocation) m_discPlanned += size; SVDEBUG << "StorageAdviser: storage planned up: now memory: " << m_memoryPlanned << ", disc " << m_discPlanned << endl; } void StorageAdviser::notifyDoneAllocation(AllocationArea area, size_t size) { if (area == MemoryAllocation) { if (m_memoryPlanned > size) m_memoryPlanned -= size; else m_memoryPlanned = 0; } else if (area == DiscAllocation) { if (m_discPlanned > size) m_discPlanned -= size; else m_discPlanned = 0; } SVDEBUG << "StorageAdviser: storage planned down: now memory: " << m_memoryPlanned << ", disc " << m_discPlanned << endl; } void StorageAdviser::setFixedRecommendation(Recommendation recommendation) { m_baseRecommendation = recommendation; } sonic-visualiser-3.0.3/svcore/base/StorageAdviser.h0000644000000000000000000000713713111512442020452 0ustar 00000000000000 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_STORAGE_ADVISER_H #define SV_STORAGE_ADVISER_H #include #include /** * A utility class designed to help decide whether to store cache data * (for example FFT outputs) in memory or on disk in the TempDirectory. * This is basically a compendium of simple rules of thumb. */ class StorageAdviser { public: // pass to recommend() zero or more of these OR'd together enum Criteria { NoCriteria = 0, SpeedCritical = 1, PrecisionCritical = 2, LongRetentionLikely = 4, FrequentLookupLikely = 8 }; // recommend() returns one or two of these OR'd together enum Recommendation { NoRecommendation = 0, UseMemory = 1, // Disc is strongly contraindicated PreferMemory = 2, // Either would do; memory probably better PreferDisc = 4, // Either would do; disc probably better UseDisc = 8, // Probably won't fit in memory ConserveSpace = 16,// Whatever you choose, keep it compact UseAsMuchAsYouLike = 32 // Take my advice and there'll be space for all }; /** * Recommend where to store some data, given certain storage and * recall criteria. The minimum size is the approximate amount of * data in kilobytes that will be stored if the recommendation is * to ConserveSpace; the maximum size is approximately the amount * that will be used if UseAsMuchAsYouLike is returned. * * May throw InsufficientDiscSpace exception if there appears to * be nowhere the minimum amount of data can be stored. */ static Recommendation recommend(Criteria criteria, size_t minimumSize, size_t maximumSize); enum AllocationArea { MemoryAllocation, DiscAllocation }; /** * Specify that we are planning to use a given amount of storage * (in kilobytes), but haven't allocated it yet. */ static void notifyPlannedAllocation(AllocationArea area, size_t size); /** * Specify that we have now allocated, or abandoned the allocation * of, the given amount (in kilobytes) of a storage area that was * previously notified using notifyPlannedAllocation. */ static void notifyDoneAllocation(AllocationArea area, size_t size); /** * Force all subsequent recommendations to use the (perhaps * partial) specification given here. If NoRecommendation given * here, this will reset to the default free behaviour. */ static void setFixedRecommendation(Recommendation recommendation); private: static size_t m_discPlanned; static size_t m_memoryPlanned; static Recommendation m_baseRecommendation; enum StorageStatus { Unknown, Insufficient, Marginal, Sufficient }; static QString criteriaToString(int); static QString recommendationToString(int); static QString storageStatusToString(StorageStatus); }; #endif sonic-visualiser-3.0.3/svcore/base/StringBits.cpp0000644000000000000000000000663613111512442020156 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2010 Chris Cannam. */ #include "StringBits.h" #include "Debug.h" using namespace std; double StringBits::stringToDoubleLocaleFree(QString s, bool *ok) { int dp = 0; int sign = 1; int i = 0; double result = 0.0; int len = s.length(); result = 0.0; if (ok) *ok = true; while (i < len && s[i].isSpace()) ++i; if (i < len && s[i] == '-') sign = -1; while (i < len) { QChar c = s[i]; if (c.isDigit()) { double d = c.digitValue(); if (dp > 0) { for (int p = dp; p > 0; --p) d /= 10.0; ++dp; } else { result *= 10.0; } result += d; } else if (c == '.') { dp = 1; } else if (ok) { *ok = false; } ++i; } return result * sign; } QStringList StringBits::splitQuoted(QString s, QChar separator) { QStringList tokens; QString tok; // sep -> just seen a field separator (or start of line) // unq -> in an unquoted field // q1 -> in a single-quoted field // q2 -> in a double-quoted field enum { sep, unq, q1, q2 } mode = sep; for (int i = 0; i < s.length(); ++i) { QChar c = s[i]; if (c == '\'') { switch (mode) { case sep: mode = q1; break; case unq: case q2: tok += c; break; case q1: mode = unq; break; } } else if (c == '"') { switch (mode) { case sep: mode = q2; break; case unq: case q1: tok += c; break; case q2: mode = unq; break; } } else if (c == separator || (separator == ' ' && c.isSpace())) { switch (mode) { case sep: if (separator != ' ') tokens << ""; break; case unq: mode = sep; tokens << tok; tok = ""; break; case q1: case q2: tok += c; break; } } else if (c == '\\') { if (++i < s.length()) { c = s[i]; switch (mode) { case sep: mode = unq; tok += c; break; case unq: case q1: case q2: tok += c; break; } } } else { switch (mode) { case sep: mode = unq; tok += c; break; case unq: case q1: case q2: tok += c; break; } } } if (tok != "" || mode != sep) { if (mode == q1) { tokens << ("'" + tok); // turns out it wasn't quoted after all } else if (mode == q2) { tokens << ("\"" + tok); } else { tokens << tok; } } return tokens; } QStringList StringBits::split(QString line, QChar separator, bool quoted) { if (quoted) { return splitQuoted(line, separator); } else { return line.split(separator, separator == ' ' ? QString::SkipEmptyParts : QString::KeepEmptyParts); } } sonic-visualiser-3.0.3/svcore/base/StringBits.h0000644000000000000000000000413313111512442017611 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2010 Chris Cannam. */ #ifndef _STRING_BITS_H_ #define _STRING_BITS_H_ #include #include #include class StringBits { public: /** * Convert a string to a double using basic "C"-locale syntax, * i.e. always using '.' as a decimal point. We use this as a * fallback when parsing files from an unknown source, if * locale-specific conversion fails. Does not support e notation. * If ok is non-NULL, *ok will be set to true if conversion * succeeds or false otherwise. */ static double stringToDoubleLocaleFree(QString s, bool *ok = 0); /** * Split a string at the given separator character, allowing * quoted sections that contain the separator. If the separator * is ' ', any (amount of) whitespace will be considered as a * single separator. If the separator is another whitespace * character such as '\t', it will be used literally. */ static QStringList splitQuoted(QString s, QChar separator); /** * Split a string at the given separator character. If quoted is * true, do so by calling splitQuoted (above). If quoted is * false, use QString::split; if separator is ' ', use * SkipEmptyParts behaviour, otherwise use KeepEmptyParts (this is * analogous to the behaviour of splitQuoted). */ static QStringList split(QString s, QChar separator, bool quoted); }; #endif sonic-visualiser-3.0.3/svcore/base/Strings.cpp0000644000000000000000000000136213111512442017506 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "Strings.h" QString Strings::pi = QChar(0x3c0); QString Strings::minus_pi = "-" + pi; QString Strings::infinity = QChar(0x221e); QString Strings::minus_infinity = "-" + infinity; sonic-visualiser-3.0.3/svcore/base/Strings.h0000644000000000000000000000141013111512442017145 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_STRINGS_H #define SV_STRINGS_H #include class Strings { public: static QString pi; static QString minus_pi; static QString infinity; static QString minus_infinity; }; #endif sonic-visualiser-3.0.3/svcore/base/TempDirectory.cpp0000644000000000000000000001566013111512442020655 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "TempDirectory.h" #include "ResourceFinder.h" #include "system/System.h" #include "Exceptions.h" #include #include #include #include #include #include #include TempDirectory * TempDirectory::m_instance = new TempDirectory; TempDirectory * TempDirectory::getInstance() { return m_instance; } TempDirectory::TempDirectory() : m_tmpdir("") { } TempDirectory::~TempDirectory() { SVDEBUG << "TempDirectory::~TempDirectory" << endl; cleanup(); } void TempDirectory::cleanup() { cleanupDirectory(""); } QString TempDirectory::getContainingPath() { QMutexLocker locker(&m_mutex); QSettings settings; settings.beginGroup("TempDirectory"); QString svDirParent = settings.value("create-in", "$HOME").toString(); settings.endGroup(); QString svDir = ResourceFinder().getUserResourcePrefix(); if (svDirParent != "$HOME") { //!!! iffy svDir.replace(QDir::home().absolutePath(), svDirParent); } if (!QFileInfo(svDir).exists()) { if (!QDir(svDirParent).mkpath(svDir)) { throw DirectoryCreationFailed(QString("%1 directory in %2") .arg(svDir).arg(svDirParent)); } } else if (!QFileInfo(svDir).isDir()) { throw DirectoryCreationFailed(QString("%1 is not a directory") .arg(svDir)); } cleanupAbandonedDirectories(svDir); return svDir; } QString TempDirectory::getPath() { if (m_tmpdir != "") return m_tmpdir; return createTempDirectoryIn(getContainingPath()); } QString TempDirectory::createTempDirectoryIn(QString dir) { // Entered with mutex held. QDir tempDirBase(dir); // Generate a temporary directory. Qt4.1 doesn't seem to be able // to do this for us, and mkdtemp is not standard. This method is // based on the way glibc does mkdtemp. static QString chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; QString suffix; int padlen = 6, attempts = 100; unsigned int r = (unsigned int)(time(0) ^ getpid()); for (int i = 0; i < padlen; ++i) { suffix += "X"; } for (int j = 0; j < attempts; ++j) { unsigned int v = r; for (int i = 0; i < padlen; ++i) { suffix[i] = chars[v % 62]; v /= 62; } QString candidate = QString("sv_%1").arg(suffix); if (tempDirBase.mkpath(candidate)) { m_tmpdir = tempDirBase.filePath(candidate); break; } r = r + 7777; } if (m_tmpdir == "") { throw DirectoryCreationFailed(QString("temporary subdirectory in %1") .arg(tempDirBase.canonicalPath())); } QString pidpath = QDir(m_tmpdir).filePath(QString("%1.pid").arg(getpid())); QFile pidfile(pidpath); if (!pidfile.open(QIODevice::WriteOnly)) { throw DirectoryCreationFailed(QString("pid file creation in %1") .arg(m_tmpdir)); } else { pidfile.close(); } return m_tmpdir; } QString TempDirectory::getSubDirectoryPath(QString subdir) { QString tmpdirpath = getPath(); QMutexLocker locker(&m_mutex); QDir tmpdir(tmpdirpath); QFileInfo fi(tmpdir.filePath(subdir)); if (!fi.exists()) { if (!tmpdir.mkdir(subdir)) { throw DirectoryCreationFailed(fi.filePath()); } else { return fi.filePath(); } } else if (fi.isDir()) { return fi.filePath(); } else { throw DirectoryCreationFailed(fi.filePath()); } } void TempDirectory::cleanupDirectory(QString tmpdir) { bool isRoot = false; if (tmpdir == "") { m_mutex.lock(); isRoot = true; tmpdir = m_tmpdir; if (tmpdir == "") { m_mutex.unlock(); return; } } QDir dir(tmpdir); dir.setFilter(QDir::Dirs | QDir::Files); for (unsigned int i = 0; i < dir.count(); ++i) { if (dir[i] == "." || dir[i] == "..") continue; QFileInfo fi(dir.filePath(dir[i])); if (fi.isDir()) { cleanupDirectory(fi.absoluteFilePath()); } else { if (!QFile(fi.absoluteFilePath()).remove()) { cerr << "WARNING: TempDirectory::cleanup: " << "Failed to unlink file \"" << fi.absoluteFilePath() << "\"" << endl; } } } QString dirname = dir.dirName(); if (dirname != "") { if (!dir.cdUp()) { cerr << "WARNING: TempDirectory::cleanup: " << "Failed to cd to parent directory of " << tmpdir << endl; return; } if (!dir.rmdir(dirname)) { cerr << "WARNING: TempDirectory::cleanup: " << "Failed to remove directory " << dirname << endl; } } if (isRoot) { m_tmpdir = ""; m_mutex.unlock(); } } void TempDirectory::cleanupAbandonedDirectories(QString svDir) { QDir dir(svDir, "sv_*", QDir::Name, QDir::Dirs); for (unsigned int i = 0; i < dir.count(); ++i) { QString dirpath = dir.filePath(dir[i]); QDir subdir(dirpath, "*.pid", QDir::Name, QDir::Files); if (subdir.count() == 0) { cerr << "INFO: Found temporary directory with no .pid file in it!\n(directory=\"" << dirpath << "\"). Removing it..." << endl; cleanupDirectory(dirpath); cerr << "...done." << endl; continue; } for (unsigned int j = 0; j < subdir.count(); ++j) { bool ok = false; int pid = QFileInfo(subdir[j]).baseName().toInt(&ok); if (!ok) continue; if (GetProcessStatus(pid) == ProcessNotRunning) { cerr << "INFO: Found abandoned temporary directory from " << "a previous, defunct process\n(pid=" << pid << ", directory=\"" << dirpath << "\"). Removing it..." << endl; cleanupDirectory(dirpath); cerr << "...done." << endl; break; } } } } sonic-visualiser-3.0.3/svcore/base/TempDirectory.h0000644000000000000000000000522513111512442020316 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TEMP_DIRECTORY_H_ #define _TEMP_DIRECTORY_H_ #include #include #include /** * A class that manages the creation and removal of a temporary * directory tree to store data during the program run. There is one * root temporary directory for the program, created on demand and * deleted when the program exits. * * This class is thread safe. */ class TempDirectory { public: static TempDirectory *getInstance(); virtual ~TempDirectory(); /** * Return the path of the directory in which the temporary * directory has been or will be created. This directory is * particular to this application, although not to this instance * of it, and it will not be removed when the application exits. * Persistent cache data or similar may be placed in this * directory or other, non-temporary subdirectories of it. * * If this directory does not exist, it will be created. Throw * DirectoryCreationFailed if the directory cannot be created. */ QString getContainingPath(); /** * Create the root temporary directory if necessary, and return * its path. This directory will be removed when the application * exits. * * Throw DirectoryCreationFailed if the directory cannot be * created. */ QString getPath(); /** * Create an immediate subdirectory of the root temporary * directory of the given name, if it doesn't already exist, and * return its path. This directory will be removed when the * application exits. * * Throw DirectoryCreationFailed if the directory cannot be * created. */ QString getSubDirectoryPath(QString subdir); /** * Delete the temporary directory (before exiting). */ void cleanup(); protected: TempDirectory(); QString createTempDirectoryIn(QString inDir); void cleanupDirectory(QString tmpDir); void cleanupAbandonedDirectories(QString svDir); QString m_tmpdir; QMutex m_mutex; static TempDirectory *m_instance; }; #endif sonic-visualiser-3.0.3/svcore/base/TempWriteFile.cpp0000644000000000000000000000371113111512442020575 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "TempWriteFile.h" #include "Exceptions.h" #include #include #include TempWriteFile::TempWriteFile(QString target) : m_target(target) { QTemporaryFile temp(m_target + "."); temp.setAutoRemove(false); temp.open(); // creates the file and opens it atomically if (temp.error()) { SVCERR << "TempWriteFile: Failed to create temporary file in directory of " << m_target << ": " << temp.errorString() << endl; throw FileOperationFailed(temp.fileName(), "creation"); } m_temp = temp.fileName(); temp.close(); // does not remove the file } TempWriteFile::~TempWriteFile() { if (m_temp != "") { QDir dir(QFileInfo(m_temp).dir()); dir.remove(m_temp); } } QString TempWriteFile::getTemporaryFilename() { return m_temp; } void TempWriteFile::moveToTarget() { if (m_temp == "") return; QFile tempFile(m_temp); QFile targetFile(m_target); if (targetFile.exists()) { if (!targetFile.remove()) { SVCERR << "TempWriteFile: WARNING: Failed to remove existing target file " << m_target << " prior to moving temporary file " << m_temp << " to it" << endl; } } if (!tempFile.rename(m_target)) { SVCERR << "TempWriteFile: Failed to rename temporary file " << m_temp << " to target " << m_target << endl; throw FileOperationFailed(m_temp, "rename"); } m_temp = ""; } sonic-visualiser-3.0.3/svcore/base/TempWriteFile.h0000644000000000000000000000326413111512442020245 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_TEMP_WRITE_FILE_H #define SV_TEMP_WRITE_FILE_H #include /** * A class that manages the creation of a temporary file with a given * prefix and the renaming of that file to the prefix after use. For * use when saving a file over an existing one, to avoid clobbering * the original before the save is complete. */ class TempWriteFile { public: TempWriteFile(QString targetFileName); // may throw FileOperationFailed /** * Destroy the temporary file object. If moveToTarget has not * been called, the associated temporary file will be deleted * without being copied to the target location. */ ~TempWriteFile(); /** * Return the name of the temporary file. Unless the constructor * threw an exception, this file will have been created already * (but it will not be open). * * (If moveToTarget has already been called, return an empty * string.) */ QString getTemporaryFilename(); /** * Rename the temporary file to the target filename. */ void moveToTarget(); protected: QString m_target; QString m_temp; }; #endif sonic-visualiser-3.0.3/svcore/base/TextMatcher.cpp0000644000000000000000000000642313111512442020310 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "TextMatcher.h" TextMatcher::TextMatcher() { } TextMatcher::~TextMatcher() { } void TextMatcher::test(Match &match, QStringList keywords, QString text, QString textType, int score) { /* if (text.toLower() == keyword.toLower()) { match.score += score * 1.5; match.fragments << tr("%1: %2").arg(textType).arg(text); return; } */ int len = text.length(); int prevEnd = 0; QString fragment; while (1) { bool first = (prevEnd == 0); int idx = -1; QString keyword; for (int ki = 0; ki < keywords.size(); ++ki) { int midx = text.indexOf(keywords[ki], prevEnd, Qt::CaseInsensitive); if (midx >= 0 && midx < len) { if (midx < idx || idx == -1) { idx = midx; keyword = keywords[ki]; } } } if (idx < 0 || idx >= len) break; int klen = keyword.length(); if (first) { match.score += score; } else { match.score += score / 4; } int start = idx; int end = start + klen; if (start == 0) match.score += 1; if (end == len) match.score += 1; if (start > prevEnd + 14) { QString s = text.right((len - start) + 10); s = XmlExportable::encodeEntities(s.left(10)) + "" + XmlExportable::encodeEntities(s.left(klen + 10).right(klen)) + ""; fragment += QString("...%1").arg(s); } else { QString s = text.right(len - prevEnd); s = XmlExportable::encodeEntities(s.left(start - prevEnd)) + "" + XmlExportable::encodeEntities(s.left(end - prevEnd).right(klen)) + ""; fragment += s; } prevEnd = end; } if (prevEnd > 0 && prevEnd < len) { int n = len - prevEnd; fragment += XmlExportable::encodeEntities(text.right(n).left(n < 8 ? n : 8)); } if (fragment != "") { match.fragments[textType] = fragment; } } bool TextMatcher::Match::operator<(const Match &m) const { if (score != m.score) { return score < m.score; } if (key != m.key) { return key < m.key; } if (fragments.size() != m.fragments.size()) { return fragments.size() < m.fragments.size(); } for (FragmentMap::const_iterator i = fragments.begin(), j = m.fragments.begin(); i != fragments.end(); ++i, ++j) { if (i->first != j->first) return i->first < j->first; if (i->second != j->second) return i->second < j->second; } return false; } sonic-visualiser-3.0.3/svcore/base/TextMatcher.h0000644000000000000000000000315013111512442017747 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_MATCHER_H_ #define _TEXT_MATCHER_H_ #include #include #include "XmlExportable.h" #include /// A rather eccentric interface for matching texts in differently-scored fields class TextMatcher { public: TextMatcher(); virtual ~TextMatcher(); struct Match { QString key; // This field is not used by TextMatcher int score; typedef std::map FragmentMap; // text type -> fragment FragmentMap fragments; Match() : score(0) { } Match(const Match &m) : key(m.key), score(m.score), fragments(m.fragments) { } bool operator<(const Match &m) const; // sort by score first }; void test(Match &match, // existing match record to be augmented QStringList keywords, // search terms QString text, // to search within QString textType, // key to use for fragment map int score); // relative weight for hits within this text type }; #endif sonic-visualiser-3.0.3/svcore/base/Thread.cpp0000644000000000000000000000406013111512442017262 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Thread.h" #ifndef _WIN32 #include #endif //#define DEBUG_MUTEX_LOCKER 1 #include Thread::Thread(Type type, QObject *parent) : QThread(parent), m_type(type) { setStackSize(512 * 1024); } void Thread::start() { QThread::start(); #ifndef _WIN32 struct sched_param param; ::memset(¶m, 0, sizeof(param)); if (m_type == RTThread) { param.sched_priority = 5; if (::pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m)) { ::perror("INFO: pthread_setschedparam to SCHED_FIFO failed"); } } else { if (::pthread_setschedparam(pthread_self(), SCHED_OTHER, ¶m)) { ::perror("WARNING: pthread_setschedparam to SCHED_OTHER failed"); } } #endif } MutexLocker::MutexLocker(QMutex *mutex, const char *name) : m_profiler(name, false), m_printer(name), m_locker(mutex) { #ifdef DEBUG_MUTEX_LOCKER cerr << "... locked mutex " << mutex << endl; #endif m_profiler.end(); } MutexLocker::~MutexLocker() { } MutexLocker::Printer::Printer(const char *name) : m_name(name) { #ifdef DEBUG_MUTEX_LOCKER cerr << "MutexLocker: Locking \"" << m_name << "\" in " << (void *)QThread::currentThreadId() << endl; #endif } MutexLocker::Printer::~Printer() { #ifdef DEBUG_MUTEX_LOCKER cerr << "MutexLocker: Unlocking \"" << m_name << "\" in " << (void *)QThread::currentThreadId() << endl; #endif } sonic-visualiser-3.0.3/svcore/base/Thread.h0000644000000000000000000000242313111512442016730 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _THREAD_H_ #define _THREAD_H_ #include #include #include "Profiler.h" class Thread : public QThread { Q_OBJECT public: enum Type { RTThread, NonRTThread }; Thread(Type type = NonRTThread, QObject *parent = 0); public slots: void start(); protected: virtual void run() = 0; private: Type m_type; }; class MutexLocker { public: MutexLocker(QMutex *mutex, const char *name); ~MutexLocker(); private: class Printer { public: Printer(const char *name); ~Printer(); private: const char *m_name; }; Profiler m_profiler; Printer m_printer; QMutexLocker m_locker; }; #endif sonic-visualiser-3.0.3/svcore/base/UnitDatabase.cpp0000644000000000000000000000307013111512442020417 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "UnitDatabase.h" UnitDatabase UnitDatabase::m_instance; UnitDatabase * UnitDatabase::getInstance() { return &m_instance; } UnitDatabase::UnitDatabase() : m_nextId(0) { } QStringList UnitDatabase::getKnownUnits() const { QStringList list; for (UnitMap::const_iterator i = m_units.begin(); i != m_units.end(); ++i) { list.push_back(i->first); } return list; } void UnitDatabase::registerUnit(QString unit) { if (m_units.find(unit) == m_units.end()) { m_units[unit] = m_nextId++; emit unitDatabaseChanged(); } } int UnitDatabase::getUnitId(QString unit, bool registerNew) { if (m_units.find(unit) == m_units.end()) { if (registerNew) registerUnit(unit); else return -1; } return m_units[unit]; } QString UnitDatabase::getUnitById(int id) { for (UnitMap::const_iterator i = m_units.begin(); i != m_units.end(); ++i) { if (i->second == id) return i->first; } return ""; } sonic-visualiser-3.0.3/svcore/base/UnitDatabase.h0000644000000000000000000000322213111512442020063 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _UNIT_DATABASE_H_ #define _UNIT_DATABASE_H_ #include #include #include #include // This grandly named class is just a list of the names of known scale // units for the various models, for use as the set of fixed values in // unit dropdown menus etc. Of course, the user should be allowed to // enter their own as well. class UnitDatabase : public QObject { Q_OBJECT public: static UnitDatabase *getInstance(); QStringList getKnownUnits() const; void registerUnit(QString unit); /** * Return the reference id for a given unit name. If registerNew is * true and the unit is not known, register it and return its new * id. If register is false and the unit is not known, return -1. */ int getUnitId(QString unit, bool registerNew = true); QString getUnitById(int id); signals: void unitDatabaseChanged(); protected: UnitDatabase(); typedef std::map UnitMap; UnitMap m_units; int m_nextId; static UnitDatabase m_instance; }; #endif sonic-visualiser-3.0.3/svcore/base/ViewManagerBase.cpp0000644000000000000000000000125313111512442021054 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ViewManagerBase.h" ViewManagerBase::~ViewManagerBase() { } sonic-visualiser-3.0.3/svcore/base/ViewManagerBase.h0000644000000000000000000000463013111512442020523 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _VIEW_MANAGER_BASE_H_ #define _VIEW_MANAGER_BASE_H_ #include #include "Selection.h" class AudioPlaySource; class AudioRecordTarget; /** * Base class for ViewManager, with no GUI content. This should * define all of the ViewManager interface that e.g. audio I/O classes * need to refer to. */ class ViewManagerBase : public QObject { Q_OBJECT public: virtual ~ViewManagerBase(); virtual void setAudioPlaySource(AudioPlaySource *source) = 0; virtual void setAudioRecordTarget(AudioRecordTarget *target) = 0; virtual sv_frame_t alignPlaybackFrameToReference(sv_frame_t) const = 0; virtual sv_frame_t alignReferenceToPlaybackFrame(sv_frame_t) const = 0; virtual const MultiSelection &getSelection() const = 0; virtual const MultiSelection::SelectionList &getSelections() const = 0; virtual sv_frame_t constrainFrameToSelection(sv_frame_t frame) const = 0; virtual Selection getContainingSelection (sv_frame_t frame, bool defaultToFollowing) const = 0; virtual bool getPlayLoopMode() const = 0; virtual bool getPlaySelectionMode() const = 0; virtual bool getPlaySoloMode() const = 0; virtual bool getAlignMode() const = 0; signals: /** Emitted when the selection has changed. */ void selectionChanged(); /** Emitted when the play loop mode has been changed. */ void playLoopModeChanged(); void playLoopModeChanged(bool); /** Emitted when the play selection mode has been changed. */ void playSelectionModeChanged(); void playSelectionModeChanged(bool); /** Emitted when the play solo mode has been changed. */ void playSoloModeChanged(); void playSoloModeChanged(bool); /** Emitted when the alignment mode has been changed. */ void alignModeChanged(); void alignModeChanged(bool); }; #endif sonic-visualiser-3.0.3/svcore/base/Window.h0000644000000000000000000001414513111512442016774 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _WINDOW_H_ #define _WINDOW_H_ #include #include #include #include #include #include #include #include "system/System.h" enum WindowType { RectangularWindow, BartlettWindow, HammingWindow, HanningWindow, BlackmanWindow, GaussianWindow, ParzenWindow, NuttallWindow, BlackmanHarrisWindow }; template class Window { public: /** * Construct a windower of the given type and size. * * Note that the cosine windows are periodic by design, rather * than symmetrical. (A window of size N is equivalent to a * symmetrical window of size N+1 with the final element missing.) */ Window(WindowType type, int size) : m_type(type), m_size(size), m_cache(0) { encache(); } Window(const Window &w) : m_type(w.m_type), m_size(w.m_size), m_cache(0) { encache(); } Window &operator=(const Window &w) { if (&w == this) return *this; m_type = w.m_type; m_size = w.m_size; encache(); return *this; } virtual ~Window() { breakfastquay::deallocate(m_cache); } inline void cut(T *const BQ_R__ block) const { breakfastquay::v_multiply(block, m_cache, m_size); } inline void cut(const T *const BQ_R__ src, T *const BQ_R__ dst) const { breakfastquay::v_multiply(dst, src, m_cache, m_size); } T getArea() { return m_area; } T getValue(int i) { return m_cache[i]; } WindowType getType() const { return m_type; } int getSize() const { return m_size; } // The names used by these functions are un-translated, for use in // e.g. XML I/O. Use Preferences::getPropertyValueLabel if you // want translated names for use in the user interface. static std::string getNameForType(WindowType type); static WindowType getTypeForName(std::string name); protected: WindowType m_type; int m_size; T *BQ_R__ m_cache; T m_area; void encache(); void cosinewin(T *, double, double, double, double); }; template void Window::encache() { if (!m_cache) m_cache = breakfastquay::allocate(m_size); const int n = m_size; breakfastquay::v_set(m_cache, T(1.0), n); int i; switch (m_type) { case RectangularWindow: for (i = 0; i < n; ++i) { m_cache[i] *= T(0.5); } break; case BartlettWindow: for (i = 0; i < n/2; ++i) { m_cache[i] *= T(i) / T(n/2); m_cache[i + n/2] *= T(1.0) - T(i) / T(n/2); } break; case HammingWindow: cosinewin(m_cache, 0.54, 0.46, 0.0, 0.0); break; case HanningWindow: cosinewin(m_cache, 0.50, 0.50, 0.0, 0.0); break; case BlackmanWindow: cosinewin(m_cache, 0.42, 0.50, 0.08, 0.0); break; case GaussianWindow: for (i = 0; i < n; ++i) { m_cache[i] *= T(pow(2, - pow((i - (n-1)/2.0) / ((n-1)/2.0 / 3), 2))); } break; case ParzenWindow: { int N = n-1; for (i = 0; i < N/4; ++i) { T m = T(2 * pow(1.0 - (T(N)/2 - T(i)) / (T(N)/2), 3)); m_cache[i] *= m; m_cache[N-i] *= m; } for (i = N/4; i <= N/2; ++i) { int wn = i - N/2; T m = T(1.0 - 6 * pow(T(wn) / (T(N)/2), 2) * (1.0 - T(abs(wn)) / (T(N)/2))); m_cache[i] *= m; m_cache[N-i] *= m; } break; } case NuttallWindow: cosinewin(m_cache, 0.3635819, 0.4891775, 0.1365995, 0.0106411); break; case BlackmanHarrisWindow: cosinewin(m_cache, 0.35875, 0.48829, 0.14128, 0.01168); break; } m_area = 0; for (int i = 0; i < n; ++i) { m_area += m_cache[i]; } m_area /= T(n); } template void Window::cosinewin(T *mult, double a0, double a1, double a2, double a3) { const int n = m_size; for (int i = 0; i < n; ++i) { mult[i] *= T(a0 - a1 * cos((2 * M_PI * i) / n) + a2 * cos((4 * M_PI * i) / n) - a3 * cos((6 * M_PI * i) / n)); } } template std::string Window::getNameForType(WindowType type) { switch (type) { case RectangularWindow: return "rectangular"; case BartlettWindow: return "bartlett"; case HammingWindow: return "hamming"; case HanningWindow: return "hanning"; case BlackmanWindow: return "blackman"; case GaussianWindow: return "gaussian"; case ParzenWindow: return "parzen"; case NuttallWindow: return "nuttall"; case BlackmanHarrisWindow: return "blackman-harris"; } std::cerr << "WARNING: Window::getNameForType: unknown type " << type << std::endl; return "unknown"; } template WindowType Window::getTypeForName(std::string name) { if (name == "rectangular") return RectangularWindow; if (name == "bartlett") return BartlettWindow; if (name == "hamming") return HammingWindow; if (name == "hanning") return HanningWindow; if (name == "blackman") return BlackmanWindow; if (name == "gaussian") return GaussianWindow; if (name == "parzen") return ParzenWindow; if (name == "nuttall") return NuttallWindow; if (name == "blackman-harris") return BlackmanHarrisWindow; std::cerr << "WARNING: Window::getTypeForName: unknown name \"" << name << "\", defaulting to \"hanning\"" << std::endl; return HanningWindow; } #endif sonic-visualiser-3.0.3/svcore/base/XmlExportable.cpp0000644000000000000000000000340313111512442020641 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "XmlExportable.h" #include #include #include #include #include QString XmlExportable::toXmlString(QString indent, QString extraAttributes) const { // SVDEBUG << "XmlExportable::toXmlString" << endl; QString s; { QTextStream out(&s); toXml(out, indent, extraAttributes); } return s; } QString XmlExportable::encodeEntities(QString s) { s .replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'"); return s; } QString XmlExportable::encodeColour(int ri, int gi, int bi) { QString r, g, b; r.setNum(ri, 16); if (ri < 16) r = "0" + r; g.setNum(gi, 16); if (gi < 16) g = "0" + g; b.setNum(bi, 16); if (bi < 16) b = "0" + b; return "#" + r + g + b; } int XmlExportable::getObjectExportId(const void * object) { static QMutex mutex; QMutexLocker locker(&mutex); static std::map idMap; static int maxId = 0; if (idMap.find(object) == idMap.end()) { idMap[object] = maxId++; } return idMap[object]; } sonic-visualiser-3.0.3/svcore/base/XmlExportable.h0000644000000000000000000000275313111512442020315 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _XML_EXPORTABLE_H_ #define _XML_EXPORTABLE_H_ #include #include "Debug.h" class QTextStream; class XmlExportable { public: virtual ~XmlExportable() { } /** * Stream this exportable object out to XML on a text stream. */ virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const = 0; /** * Convert this exportable object to XML in a string. The default * implementation calls toXml and returns the result as a string. * Do not override this unless you really know what you're doing. */ virtual QString toXmlString(QString indent = "", QString extraAttributes = "") const; static QString encodeEntities(QString); static QString encodeColour(int r, int g, int b); static int getObjectExportId(const void *); // thread-safe }; #endif sonic-visualiser-3.0.3/svcore/base/ZoomConstraint.h0000644000000000000000000000412513111512442020513 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _ZOOM_CONSTRAINT_H_ #define _ZOOM_CONSTRAINT_H_ #include /** * ZoomConstraint is a simple interface that describes a limitation on * the available zoom sizes for a view, for example based on cache * strategy or a (processing) window-size limitation. * * The default ZoomConstraint imposes no actual constraint except for * a nominal maximum. */ class ZoomConstraint { public: virtual ~ZoomConstraint() { } enum RoundingDirection { RoundDown, RoundUp, RoundNearest }; /** * Given the "ideal" block size (frames per pixel) for a given * zoom level, return the nearest viable block size for this * constraint. * * For example, if a block size of 1523 frames per pixel is * requested but the underlying model only supports value * summaries at powers-of-two block sizes, return 1024 or 2048 * depending on the rounding direction supplied. */ virtual int getNearestBlockSize(int requestedBlockSize, RoundingDirection = RoundNearest) const { if (requestedBlockSize > getMaxZoomLevel()) return getMaxZoomLevel(); else return requestedBlockSize; } /** * Return the maximum zoom level within range for this constraint. * This is quite large -- individual views will probably want to * limit how far a user might reasonably zoom out based on other * factors such as the duration of the file. */ virtual int getMaxZoomLevel() const { return 4194304; } // 2^22, arbitrarily }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestColumnOp.h0000644000000000000000000002252013111512442021074 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_COLUMN_OP_H #define TEST_COLUMN_OP_H #include "../ColumnOp.h" #include #include #include #include //#define REPORT 1 using namespace std; class TestColumnOp : public QObject { Q_OBJECT typedef ColumnOp C; typedef ColumnOp::Column Column; typedef vector BinMapping; #ifdef REPORT template void report(vector v) { cerr << "Vector is: [ "; for (int i = 0; i < int(v.size()); ++i) { if (i > 0) cerr << ", "; cerr << v[i]; } cerr << " ]\n"; } #else template void report(vector ) { } #endif private slots: void applyGain() { QCOMPARE(C::applyGain({}, 1.0), Column()); Column c { 1, 2, 3, -4, 5, 6 }; Column actual(C::applyGain(c, 1.5)); Column expected { 1.5f, 3, 4.5f, -6, 7.5f, 9 }; QCOMPARE(actual, expected); actual = C::applyGain(c, 1.0); QCOMPARE(actual, c); actual = C::applyGain(c, 0.0); expected = { 0, 0, 0, 0, 0, 0 }; QCOMPARE(actual, expected); } void fftScale() { QCOMPARE(C::fftScale({}, 2.0), Column()); Column c { 1, 2, 3, -4, 5 }; Column actual(C::fftScale(c, 8)); Column expected { 0.25f, 0.5f, 0.75f, -1, 1.25f }; QCOMPARE(actual, expected); } void isPeak_null() { QVERIFY(!C::isPeak({}, 0)); QVERIFY(!C::isPeak({}, 1)); QVERIFY(!C::isPeak({}, -1)); } void isPeak_obvious() { Column c { 0.4f, 0.5f, 0.3f }; QVERIFY(!C::isPeak(c, 0)); QVERIFY(C::isPeak(c, 1)); QVERIFY(!C::isPeak(c, 2)); } void isPeak_edges() { Column c { 0.5f, 0.4f, 0.3f }; QVERIFY(C::isPeak(c, 0)); QVERIFY(!C::isPeak(c, 1)); QVERIFY(!C::isPeak(c, 2)); QVERIFY(!C::isPeak(c, 3)); QVERIFY(!C::isPeak(c, -1)); c = { 1.4f, 1.5f }; QVERIFY(!C::isPeak(c, 0)); QVERIFY(C::isPeak(c, 1)); } void isPeak_flat() { Column c { 0.0f, 0.0f, 0.0f }; QVERIFY(C::isPeak(c, 0)); QVERIFY(!C::isPeak(c, 1)); QVERIFY(!C::isPeak(c, 2)); } void isPeak_mixedSign() { Column c { 0.4f, -0.5f, -0.3f, -0.6f, 0.1f, -0.3f }; QVERIFY(C::isPeak(c, 0)); QVERIFY(!C::isPeak(c, 1)); QVERIFY(C::isPeak(c, 2)); QVERIFY(!C::isPeak(c, 3)); QVERIFY(C::isPeak(c, 4)); QVERIFY(!C::isPeak(c, 5)); } void isPeak_duplicate() { Column c({ 0.5f, 0.5f, 0.4f, 0.4f }); QVERIFY(C::isPeak(c, 0)); QVERIFY(!C::isPeak(c, 1)); QVERIFY(!C::isPeak(c, 2)); QVERIFY(!C::isPeak(c, 3)); c = { 0.4f, 0.4f, 0.5f, 0.5f }; QVERIFY(C::isPeak(c, 0)); // counterintuitive but necessary QVERIFY(!C::isPeak(c, 1)); QVERIFY(C::isPeak(c, 2)); QVERIFY(!C::isPeak(c, 3)); } void peakPick() { QCOMPARE(C::peakPick({}), Column()); Column c({ 0.5f, 0.5f, 0.4f, 0.4f }); QCOMPARE(C::peakPick(c), Column({ 0.5f, 0.0f, 0.0f, 0.0f })); c = Column({ 0.4f, -0.5f, -0.3f, -0.6f, 0.1f, -0.3f }); QCOMPARE(C::peakPick(c), Column({ 0.4f, 0.0f, -0.3f, 0.0f, 0.1f, 0.0f })); } void normalize_null() { QCOMPARE(C::normalize({}, ColumnNormalization::None), Column()); QCOMPARE(C::normalize({}, ColumnNormalization::Sum1), Column()); QCOMPARE(C::normalize({}, ColumnNormalization::Max1), Column()); QCOMPARE(C::normalize({}, ColumnNormalization::Range01), Column()); QCOMPARE(C::normalize({}, ColumnNormalization::Hybrid), Column()); } void normalize_none() { Column c { 1, 2, 3, 4 }; QCOMPARE(C::normalize(c, ColumnNormalization::None), c); } void normalize_none_mixedSign() { Column c { 1, 2, -3, -4 }; QCOMPARE(C::normalize(c, ColumnNormalization::None), c); } void normalize_sum1() { Column c { 1, 2, 4, 3 }; QCOMPARE(C::normalize(c, ColumnNormalization::Sum1), Column({ 0.1f, 0.2f, 0.4f, 0.3f })); } void normalize_sum1_mixedSign() { Column c { 1, 2, -4, -3 }; QCOMPARE(C::normalize(c, ColumnNormalization::Sum1), Column({ 0.1f, 0.2f, -0.4f, -0.3f })); } void normalize_max1() { Column c { 4, 3, 2, 1 }; QCOMPARE(C::normalize(c, ColumnNormalization::Max1), Column({ 1.0f, 0.75f, 0.5f, 0.25f })); } void normalize_max1_mixedSign() { Column c { -4, -3, 2, 1 }; QCOMPARE(C::normalize(c, ColumnNormalization::Max1), Column({ -1.0f, -0.75f, 0.5f, 0.25f })); } void normalize_range01() { Column c { 4, 3, 2, 1 }; QCOMPARE(C::normalize(c, ColumnNormalization::Range01), Column({ 1.0f, 2.f/3.f, 1.f/3.f, 0.0f })); } void normalize_range01_mixedSign() { Column c { -2, -3, 2, 1 }; QCOMPARE(C::normalize(c, ColumnNormalization::Range01), Column({ 0.2f, 0.0f, 1.0f, 0.8f })); } void normalize_hybrid() { // with max == 99, log10(max+1) == 2 so scale factor will be 2/99 Column c { 22, 44, 99, 66 }; QCOMPARE(C::normalize(c, ColumnNormalization::Hybrid), Column({ 44.0f/99.0f, 88.0f/99.0f, 2.0f, 132.0f/99.0f })); } void normalize_hybrid_mixedSign() { // with max == 99, log10(max+1) == 2 so scale factor will be 2/99 Column c { 22, 44, -99, -66 }; QCOMPARE(C::normalize(c, ColumnNormalization::Hybrid), Column({ 44.0f/99.0f, 88.0f/99.0f, -2.0f, -132.0f/99.0f })); } void distribute_simple() { Column in { 1, 2, 3 }; BinMapping binfory { 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f }; Column expected { 1, 1, 2, 2, 3, 3 }; Column actual(C::distribute(in, 6, binfory, 0, false)); report(actual); QCOMPARE(actual, expected); } void distribute_simple_interpolated() { Column in { 1, 2, 3 }; BinMapping binfory { 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f }; // There is a 0.5-bin offset from the distribution you might // expect, because this corresponds visually to the way that // bin values are duplicated upwards in simple_distribution. // It means that switching between interpolated and // non-interpolated views retains the visual position of each // bin peak as somewhere in the middle of the scale area for // that bin. Column expected { 1, 1, 1.5f, 2, 2.5f, 3 }; Column actual(C::distribute(in, 6, binfory, 0, true)); report(actual); QCOMPARE(actual, expected); } void distribute_nonlinear() { Column in { 1, 2, 3 }; BinMapping binfory { 0.0f, 0.2f, 0.5f, 1.0f, 2.0f, 2.5f }; Column expected { 1, 1, 1, 2, 3, 3 }; Column actual(C::distribute(in, 6, binfory, 0, false)); report(actual); QCOMPARE(actual, expected); } void distribute_nonlinear_interpolated() { // See distribute_simple_interpolated Column in { 1, 2, 3 }; BinMapping binfory { 0.0f, 0.2f, 0.5f, 1.0f, 2.0f, 2.5f }; Column expected { 1, 1, 1, 1.5, 2.5, 3 }; Column actual(C::distribute(in, 6, binfory, 0, true)); report(actual); QCOMPARE(actual, expected); } void distribute_shrinking() { Column in { 4, 1, 2, 3, 5, 6 }; BinMapping binfory { 0.0f, 2.0f, 4.0f }; Column expected { 4, 3, 6 }; Column actual(C::distribute(in, 3, binfory, 0, false)); report(actual); QCOMPARE(actual, expected); } void distribute_shrinking_interpolated() { // should be same as distribute_shrinking, we don't // interpolate when resizing down Column in { 4, 1, 2, 3, 5, 6 }; BinMapping binfory { 0.0f, 2.0f, 4.0f }; Column expected { 4, 3, 6 }; Column actual(C::distribute(in, 3, binfory, 0, true)); report(actual); QCOMPARE(actual, expected); } void distribute_nonlinear_someshrinking_interpolated() { // But we *should* interpolate if the mapping involves // shrinking some bins but expanding others. See // distribute_simple_interpolated for note on 0.5 offset Column in { 4, 1, 2, 3, 5, 6 }; BinMapping binfory { 0.0f, 3.0f, 4.0f, 4.5f }; Column expected { 4.0f, 2.5f, 4.0f, 5.0f }; Column actual(C::distribute(in, 4, binfory, 0, true)); report(actual); QCOMPARE(actual, expected); binfory = BinMapping { 0.5f, 1.0f, 2.0f, 5.0f }; expected = { 4.0f, 2.5f, 1.5f, 5.5f }; actual = (C::distribute(in, 4, binfory, 0, true)); report(actual); QCOMPARE(actual, expected); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestLogRange.h0000644000000000000000000002362213111512442021042 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_LOG_RANGE_H #define TEST_LOG_RANGE_H #include "../LogRange.h" #include #include #include #include using namespace std; class TestLogRange : public QObject { Q_OBJECT private slots: void mapPositiveAboveDefaultThreshold() { QCOMPARE(LogRange::map(10.0), 1.0); QCOMPARE(LogRange::map(100.0), 2.0); QCOMPARE(LogRange::map(0.1), -1.0); QCOMPARE(LogRange::map(1.0), 0.0); QCOMPARE(LogRange::map(0.0000001), -7.0); QCOMPARE(LogRange::map(20.0), log10(20.0)); } void mapPositiveAboveSetThreshold() { QCOMPARE(LogRange::map(10.0, -10.0), 1.0); QCOMPARE(LogRange::map(100.0, 1.0), 2.0); QCOMPARE(LogRange::map(0.1, -5.0), -1.0); QCOMPARE(LogRange::map(1.0, -0.01), 0.0); QCOMPARE(LogRange::map(0.0000001, -20.0), -7.0); QCOMPARE(LogRange::map(20.0, 0.0), log10(20.0)); } void mapZeroDefaultThreshold() { QCOMPARE(LogRange::map(0.0), -10.0); } void mapZeroSetThreshold() { QCOMPARE(LogRange::map(0.0, 12.0), 12.0); QCOMPARE(LogRange::map(0.0, -12.0), -12.0); QCOMPARE(LogRange::map(0.0, 0.0), 0.0); } void mapPositiveBelowDefaultThreshold() { // The threshold is used only for zero values, not for very // small ones -- it's arguably a stand-in or replacement value // rather than a threshold. So this should behave the same as // for values above the threshold. QCOMPARE(LogRange::map(1e-10), -10.0); QCOMPARE(LogRange::map(1e-20), -20.0); QCOMPARE(LogRange::map(1e-100), -100.0); } void mapPositiveBelowSetThreshold() { // As above QCOMPARE(LogRange::map(10.0, 4.0), 1.0); QCOMPARE(LogRange::map(1e-10, 4.0), -10.0); QCOMPARE(LogRange::map(1e-20, -15.0), -20.0); QCOMPARE(LogRange::map(1e-100, -100.0), -100.0); } void mapNegative() { // Should always return map of absolute value. These are // picked from vaarious of the above tests. QCOMPARE(LogRange::map(-10.0), 1.0); QCOMPARE(LogRange::map(-100.0), 2.0); QCOMPARE(LogRange::map(-0.1), -1.0); QCOMPARE(LogRange::map(-1.0), 0.0); QCOMPARE(LogRange::map(-0.0000001), -7.0); QCOMPARE(LogRange::map(-20.0), log10(20.0)); QCOMPARE(LogRange::map(-10.0, 4.0), 1.0); QCOMPARE(LogRange::map(-1e-10, 4.0), -10.0); QCOMPARE(LogRange::map(-1e-20, -15.0), -20.0); QCOMPARE(LogRange::map(-1e-100, -100.0), -100.0); QCOMPARE(LogRange::map(-0.0, 12.0), 12.0); QCOMPARE(LogRange::map(-0.0, -12.0), -12.0); QCOMPARE(LogRange::map(-0.0, 0.0), 0.0); } void unmap() { // Simply pow(10, x) QCOMPARE(LogRange::unmap(0.0), 1.0); QCOMPARE(LogRange::unmap(1.0), 10.0); QCOMPARE(LogRange::unmap(-1.0), 0.1); QCOMPARE(LogRange::unmap(100.0), 1e+100); QCOMPARE(LogRange::unmap(-100.0), 1e-100); } void mapRangeAllPositiveDefaultThreshold() { double min, max; min = 1.0; max = 10.0; LogRange::mapRange(min, max); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); min = 10.0; max = 1.0; LogRange::mapRange(min, max); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); // if equal, the function uses an arbitrary 1.0 range before mapping min = 10.0; max = 10.0; LogRange::mapRange(min, max); QCOMPARE(min, 1.0); QCOMPARE(max, log10(11.0)); } void mapRangeAllPositiveSetThreshold() { double min, max; min = 1.0; max = 10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); min = 10.0; max = 1.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); // if equal, the function uses an arbitrary 1.0 range before mapping min = 10.0; max = 10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, 1.0); QCOMPARE(max, log10(11.0)); } void mapRangeAllNegativeDefaultThreshold() { double min, max; min = -1.0; max = -10.0; LogRange::mapRange(min, max); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); min = -10.0; max = -1.0; LogRange::mapRange(min, max); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); // if equal, the function uses an arbitrary 1.0 range before mapping min = -10.0; max = -10.0; LogRange::mapRange(min, max); QCOMPARE(min, log10(9.0)); QCOMPARE(max, 1.0); } void mapRangeAllNegativeSetThreshold() { double min, max; min = -1.0; max = -10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); min = -10.0; max = -1.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, 0.0); QCOMPARE(max, 1.0); // if equal, the function uses an arbitrary 1.0 range before mapping min = -10.0; max = -10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, log10(9.0)); QCOMPARE(max, 1.0); } void mapRangeAllNonNegativeDefaultThreshold() { double min, max; min = 0.0; max = 10.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); min = 10.0; max = 0.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); // if equal, the function uses an arbitrary 1.0 range before mapping min = 0.0; max = 0.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 0.0); } void mapRangeAllNonNegativeSetThreshold() { double min, max; min = 0.0; max = 10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); min = 10.0; max = 0.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); // if equal, the function uses an arbitrary 1.0 range before mapping min = 0.0; max = 0.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 0.0); } void mapRangeAllNonPositiveDefaultThreshold() { double min, max; min = 0.0; max = -10.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); min = -10.0; max = 0.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); } void mapRangeAllNonPositiveSetThreshold() { double min, max; min = 0.0; max = -10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); min = -10.0; max = 0.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); } void mapRangeSpanningZeroDefaultThreshold() { double min, max; min = -1.0; max = 10.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); min = -100.0; max = 1.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 2.0); min = -10.0; max = 1e-200; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); min = 1e-200; max = -10.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); min = -1e-200; max = 100.0; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 2.0); min = 10.0; max = -1e-200; LogRange::mapRange(min, max); QCOMPARE(min, -10.0); QCOMPARE(max, 1.0); // if none of the input range is above the threshold in // magnitude, but it still spans zero, we use the input max as // threshold and then add 1 for range min = -1e-200; max = 1e-300; LogRange::mapRange(min, max); QCOMPARE(min, -201.0); QCOMPARE(max, -200.0); min = 1e-200; max = -1e-300; LogRange::mapRange(min, max); QCOMPARE(min, -201.0); QCOMPARE(max, -200.0); } void mapRangeSpanningZeroSetThreshold() { double min, max; min = -1.0; max = 10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); min = -100.0; max = 1.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 2.0); min = -10.0; max = 1e-200; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); min = 1e-200; max = -10.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); min = -1e-200; max = 100.0; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 2.0); min = 10.0; max = -1e-200; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -4.0); QCOMPARE(max, 1.0); // if none of the input range is above the threshold in // magnitude, but it still spans zero, we use the input max as // threshold and then add 1 for range min = -1e-200; max = 1e-300; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -201.0); QCOMPARE(max, -200.0); min = 1e-200; max = -1e-300; LogRange::mapRange(min, max, -4.0); QCOMPARE(min, -201.0); QCOMPARE(max, -200.0); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestOurRealTime.h0000644000000000000000000004755413111512442021546 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_OUR_REALTIME_H #define TEST_OUR_REALTIME_H #include #include #include #include #include "../RealTime.h" using namespace std; #define ONE_MILLION 1000000 #define ONE_BILLION 1000000000 class TestOurRealTime : public QObject { Q_OBJECT void compareTexts(string s, const char *e) { QCOMPARE(QString(s.c_str()), QString(e)); } typedef sv_frame_t frame_type; private slots: void zero() { QCOMPARE(RealTime(0, 0), RealTime::zeroTime); QCOMPARE(RealTime(0, 0).sec, 0); QCOMPARE(RealTime(0, 0).nsec, 0); QCOMPARE(RealTime(0, 0).msec(), 0); QCOMPARE(RealTime(0, 0).usec(), 0); } void ctor() { QCOMPARE(RealTime(0, 0), RealTime(0, 0)); // wraparounds QCOMPARE(RealTime(0, ONE_BILLION/2), RealTime(1, -ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2), RealTime(-1, ONE_BILLION/2)); QCOMPARE(RealTime(1, ONE_BILLION), RealTime(2, 0)); QCOMPARE(RealTime(1, -ONE_BILLION), RealTime(0, 0)); QCOMPARE(RealTime(-1, ONE_BILLION), RealTime(0, 0)); QCOMPARE(RealTime(-1, -ONE_BILLION), RealTime(-2, 0)); QCOMPARE(RealTime(1, -ONE_BILLION-ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(-1, ONE_BILLION+ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(2, -ONE_BILLION*2), RealTime(0, 0)); QCOMPARE(RealTime(2, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(-2, ONE_BILLION*2), RealTime(0, 0)); QCOMPARE(RealTime(-2, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2)); QCOMPARE(RealTime(0, 1).sec, 0); QCOMPARE(RealTime(0, 1).nsec, 1); QCOMPARE(RealTime(0, -1).sec, 0); QCOMPARE(RealTime(0, -1).nsec, -1); QCOMPARE(RealTime(1, -1).sec, 0); QCOMPARE(RealTime(1, -1).nsec, ONE_BILLION-1); QCOMPARE(RealTime(-1, 1).sec, 0); QCOMPARE(RealTime(-1, 1).nsec, -ONE_BILLION+1); QCOMPARE(RealTime(-1, -1).sec, -1); QCOMPARE(RealTime(-1, -1).nsec, -1); QCOMPARE(RealTime(2, -ONE_BILLION*2).sec, 0); QCOMPARE(RealTime(2, -ONE_BILLION*2).nsec, 0); QCOMPARE(RealTime(2, -ONE_BILLION/2).sec, 1); QCOMPARE(RealTime(2, -ONE_BILLION/2).nsec, ONE_BILLION/2); QCOMPARE(RealTime(-2, ONE_BILLION*2).sec, 0); QCOMPARE(RealTime(-2, ONE_BILLION*2).nsec, 0); QCOMPARE(RealTime(-2, ONE_BILLION/2).sec, -1); QCOMPARE(RealTime(-2, ONE_BILLION/2).nsec, -ONE_BILLION/2); } void fromSeconds() { QCOMPARE(RealTime::fromSeconds(0), RealTime(0, 0)); QCOMPARE(RealTime::fromSeconds(0.5).sec, 0); QCOMPARE(RealTime::fromSeconds(0.5).nsec, ONE_BILLION/2); QCOMPARE(RealTime::fromSeconds(0.5).usec(), ONE_MILLION/2); QCOMPARE(RealTime::fromSeconds(0.5).msec(), 500); QCOMPARE(RealTime::fromSeconds(0.5), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime::fromSeconds(1), RealTime(1, 0)); QCOMPARE(RealTime::fromSeconds(1.5), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime::fromSeconds(-0.5).sec, 0); QCOMPARE(RealTime::fromSeconds(-0.5).nsec, -ONE_BILLION/2); QCOMPARE(RealTime::fromSeconds(-0.5).usec(), -ONE_MILLION/2); QCOMPARE(RealTime::fromSeconds(-0.5).msec(), -500); QCOMPARE(RealTime::fromSeconds(-1.5).sec, -1); QCOMPARE(RealTime::fromSeconds(-1.5).nsec, -ONE_BILLION/2); QCOMPARE(RealTime::fromSeconds(-1.5).usec(), -ONE_MILLION/2); QCOMPARE(RealTime::fromSeconds(-1.5).msec(), -500); QCOMPARE(RealTime::fromSeconds(-0.5), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime::fromSeconds(-1), RealTime(-1, 0)); QCOMPARE(RealTime::fromSeconds(-1.5), RealTime(-1, -ONE_BILLION/2)); } void fromMilliseconds() { QCOMPARE(RealTime::fromMilliseconds(0), RealTime(0, 0)); QCOMPARE(RealTime::fromMilliseconds(500), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime::fromMilliseconds(1000), RealTime(1, 0)); QCOMPARE(RealTime::fromMilliseconds(1500), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime::fromMilliseconds(-0), RealTime(0, 0)); QCOMPARE(RealTime::fromMilliseconds(-500), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime::fromMilliseconds(-1000), RealTime(-1, 0)); QCOMPARE(RealTime::fromMilliseconds(-1500), RealTime(-1, -ONE_BILLION/2)); } void fromTimeval() { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, 0)); tv.tv_sec = 0; tv.tv_usec = ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, ONE_BILLION/2)); tv.tv_sec = 1; tv.tv_usec = 0; QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, 0)); tv.tv_sec = 1; tv.tv_usec = ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, ONE_BILLION/2)); tv.tv_sec = 0; tv.tv_usec = -ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, -ONE_BILLION/2)); tv.tv_sec = -1; tv.tv_usec = 0; QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, 0)); tv.tv_sec = -1; tv.tv_usec = -ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, -ONE_BILLION/2)); } void fromXsdDuration() { QCOMPARE(RealTime::fromXsdDuration("PT0"), RealTime::zeroTime); QCOMPARE(RealTime::fromXsdDuration("PT0S"), RealTime::zeroTime); QCOMPARE(RealTime::fromXsdDuration("PT10S"), RealTime(10, 0)); QCOMPARE(RealTime::fromXsdDuration("PT10.5S"), RealTime(10, ONE_BILLION/2)); QCOMPARE(RealTime::fromXsdDuration("PT1.5S").sec, 1); QCOMPARE(RealTime::fromXsdDuration("PT1.5S").msec(), 500); QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").sec, -1); QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").msec(), -500); QCOMPARE(RealTime::fromXsdDuration("PT1M30.5S"), RealTime(90, ONE_BILLION/2)); QCOMPARE(RealTime::fromXsdDuration("PT1H2M30.5S"), RealTime(3750, ONE_BILLION/2)); } void toDouble() { QCOMPARE(RealTime(0, 0).toDouble(), 0.0); QCOMPARE(RealTime(0, ONE_BILLION/2).toDouble(), 0.5); QCOMPARE(RealTime(1, 0).toDouble(), 1.0); QCOMPARE(RealTime(1, ONE_BILLION/2).toDouble(), 1.5); QCOMPARE(RealTime(0, -ONE_BILLION/2).toDouble(), -0.5); QCOMPARE(RealTime(-1, 0).toDouble(), -1.0); QCOMPARE(RealTime(-1, -ONE_BILLION/2).toDouble(), -1.5); } void assign() { RealTime r; r = RealTime(0, 0); QCOMPARE(r, RealTime::zeroTime); r = RealTime(0, ONE_BILLION/2); QCOMPARE(r.sec, 0); QCOMPARE(r.nsec, ONE_BILLION/2); r = RealTime(-1, -ONE_BILLION/2); QCOMPARE(r.sec, -1); QCOMPARE(r.nsec, -ONE_BILLION/2); } void plus() { QCOMPARE(RealTime(0, 0) + RealTime(0, 0), RealTime(0, 0)); QCOMPARE(RealTime(0, 0) + RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(0, ONE_BILLION/2), RealTime(1, 0)); QCOMPARE(RealTime(1, 0) + RealTime(0, ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(0, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(-1, 0)); QCOMPARE(RealTime(-1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, 0)); QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(-1, 0), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(1, 0), RealTime(0, ONE_BILLION/2)); } void minus() { QCOMPARE(RealTime(0, 0) - RealTime(0, 0), RealTime(0, 0)); QCOMPARE(RealTime(0, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(0, ONE_BILLION/2), RealTime(0, 0)); QCOMPARE(RealTime(1, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(0, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(0, 0)); QCOMPARE(RealTime(-1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, 0)); QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(-1, 0), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(1, 0), RealTime(-1, -ONE_BILLION/2)); } void negate() { QCOMPARE(-RealTime(0, 0), RealTime(0, 0)); QCOMPARE(-RealTime(1, 0), RealTime(-1, 0)); QCOMPARE(-RealTime(1, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2)); QCOMPARE(-RealTime(-1, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); } void compare() { int sec, nsec; for (sec = -2; sec <= 2; sec += 2) { for (nsec = -1; nsec <= 1; nsec += 1) { QCOMPARE(RealTime(sec, nsec) < RealTime(sec, nsec), false); QCOMPARE(RealTime(sec, nsec) > RealTime(sec, nsec), false); QCOMPARE(RealTime(sec, nsec) == RealTime(sec, nsec), true); QCOMPARE(RealTime(sec, nsec) != RealTime(sec, nsec), false); QCOMPARE(RealTime(sec, nsec) <= RealTime(sec, nsec), true); QCOMPARE(RealTime(sec, nsec) >= RealTime(sec, nsec), true); } } RealTime prev(-3, 0); for (sec = -2; sec <= 2; sec += 2) { for (nsec = -1; nsec <= 1; nsec += 1) { RealTime curr(sec, nsec); QCOMPARE(prev < curr, true); QCOMPARE(prev > curr, false); QCOMPARE(prev == curr, false); QCOMPARE(prev != curr, true); QCOMPARE(prev <= curr, true); QCOMPARE(prev >= curr, false); QCOMPARE(curr < prev, false); QCOMPARE(curr > prev, true); QCOMPARE(curr == prev, false); QCOMPARE(curr != prev, true); QCOMPARE(curr <= prev, false); QCOMPARE(curr >= prev, true); prev = curr; } } } void frame() { int frames[] = { 0, 1, 2047, 2048, 6656, 32767, 32768, 44100, 44101, 999999999, 2000000000 }; int n = sizeof(frames)/sizeof(frames[0]); int rates[] = { 1, 2, 8000, 22050, 44100, 44101, 192000, 2000000001 }; int m = sizeof(rates)/sizeof(rates[0]); vector> realTimes = { { { 0, 0 }, { 1, 0 }, { 2047, 0 }, { 2048, 0 }, { 6656, 0 }, { 32767, 0 }, { 32768, 0 }, { 44100, 0 }, { 44101, 0 }, { 999999999, 0 }, { 2000000000, 0 } }, { { 0, 0 }, { 0, 500000000 }, { 1023, 500000000 }, { 1024, 0 }, { 3328, 0 }, { 16383, 500000000 }, { 16384, 0 }, { 22050, 0 }, { 22050, 500000000 }, { 499999999, 500000000 }, { 1000000000, 0 } }, { { 0, 0 }, { 0, 125000 }, { 0, 255875000 }, { 0, 256000000 }, { 0, 832000000 }, { 4, 95875000 }, { 4, 96000000 }, { 5, 512500000 }, { 5, 512625000 }, { 124999, 999875000 }, { 250000, 0 } }, { { 0, 0 }, { 0, 45351 }, { 0, 92834467 }, { 0, 92879819 }, { 0, 301859410 }, { 1, 486031746 }, { 1, 486077098 }, { 2, 0 }, { 2, 45351 }, { 45351, 473877551 }, { 90702, 947845805 } }, { { 0, 0 }, { 0, 22676 }, { 0, 46417234 }, { 0, 46439909 }, { 0, 150929705 }, { 0, 743015873 }, { 0, 743038549 }, { 1, 0 }, { 1, 22676 }, { 22675, 736938776 }, { 45351, 473922902 } }, { { 0, 0 }, { 0, 22675 }, { 0, 46416181 }, { 0, 46438856 }, { 0, 150926283 }, { 0, 742999025 }, { 0, 743021700 }, { 0, 999977325 }, { 1, 0 }, { 22675, 222761389 }, { 45350, 445568128 } }, { { 0, 0 }, { 0, 5208 }, { 0, 10661458 }, { 0, 10666667 }, { 0, 34666667 }, { 0, 170661458 }, { 0, 170666667 }, { 0, 229687500 }, { 0, 229692708 }, { 5208, 333328125 }, { 10416, 666666667 } }, { { 0, 0 }, { 0, 0 }, { 0, 1023 }, { 0, 1024 }, { 0, 3328 }, { 0, 16383 }, { 0, 16384 }, { 0, 22050 }, { 0, 22050 }, { 0, 499999999 }, { 1, 0 } } }; for (int i = 0; i < n; ++i) { frame_type frame = frames[i]; for (int j = 0; j < m; ++j) { int rate = rates[j]; RealTime rt = RealTime::frame2RealTime(frame, rate); QCOMPARE(rt.sec, realTimes[j][i].sec); QCOMPARE(rt.nsec, realTimes[j][i].nsec); frame_type conv = RealTime::realTime2Frame(rt, rate); rt = RealTime::frame2RealTime(-frame, rate); frame_type negconv = RealTime::realTime2Frame(rt, rate); if (rate > ONE_BILLION) { // We don't have enough precision in RealTime // for this absurd sample rate, so a round trip // conversion may round QVERIFY(abs(frame - conv) < 2); QVERIFY(abs(-frame - negconv) < 2); } else { QCOMPARE(conv, frame); QCOMPARE(negconv, -frame); } } } } // Our own RealTime has toMSText, toFrameText, toSecText void toText() { // we want to use QStrings, because then the Qt test library // will print out any conflicts. The compareTexts function // does this for us int halfSec = ONE_BILLION/2; // nsec RealTime rt = RealTime(0, 0); compareTexts(rt.toMSText(false, false), "0"); compareTexts(rt.toMSText(true, false), "0.000"); compareTexts(rt.toMSText(false, true), "0"); compareTexts(rt.toMSText(true, true), "0.000"); compareTexts(rt.toFrameText(24, false), "0:00"); compareTexts(rt.toFrameText(24, true), "0:00"); compareTexts(rt.toSecText(), "0s"); rt = RealTime(1, halfSec); compareTexts(rt.toMSText(false, false), "1.5"); compareTexts(rt.toMSText(true, false), "1.500"); compareTexts(rt.toMSText(false, true), "1.5"); compareTexts(rt.toMSText(true, true), "1.500"); compareTexts(rt.toFrameText(24, false), "1:12"); compareTexts(rt.toFrameText(24, true), "1:12"); compareTexts(rt.toFrameText(25, false), "1:12"); compareTexts(rt.toFrameText(25, true), "1:12"); compareTexts(rt.toSecText(), "1s"); rt = RealTime::fromSeconds(-1.5); compareTexts(rt.toMSText(false, false), "-1.5"); compareTexts(rt.toMSText(true, false), "-1.500"); compareTexts(rt.toMSText(false, true), "-1.5"); compareTexts(rt.toMSText(true, true), "-1.500"); compareTexts(rt.toFrameText(24, false), "-1:12"); compareTexts(rt.toFrameText(24, true), "-1:12"); compareTexts(rt.toSecText(), "-1s"); rt = RealTime(1, 1000); compareTexts(rt.toMSText(false, false), "1"); compareTexts(rt.toFrameText(24, false), "1:00"); compareTexts(rt.toFrameText(ONE_MILLION, false), "1:000001"); compareTexts(rt.toSecText(), "1s"); rt = RealTime(1, 100000); compareTexts(rt.toFrameText(ONE_MILLION, false), "1:000100"); compareTexts(rt.toSecText(), "1s"); rt = RealTime::fromSeconds(60); compareTexts(rt.toMSText(false, false), "60"); compareTexts(rt.toMSText(true, false), "60.000"); compareTexts(rt.toMSText(false, true), "1:00"); compareTexts(rt.toMSText(true, true), "1:00.000"); compareTexts(rt.toFrameText(24, false), "60:00"); compareTexts(rt.toFrameText(24, true), "1:00:00"); compareTexts(rt.toSecText(), "1:00"); rt = RealTime::fromSeconds(61.05); compareTexts(rt.toMSText(false, false), "61.05"); compareTexts(rt.toMSText(true, false), "61.050"); compareTexts(rt.toMSText(false, true), "1:01.05"); compareTexts(rt.toMSText(true, true), "1:01.050"); compareTexts(rt.toFrameText(24, false), "61:01"); compareTexts(rt.toFrameText(24, true), "1:01:01"); compareTexts(rt.toSecText(), "1:01"); rt = RealTime::fromSeconds(601.05); compareTexts(rt.toMSText(false, false), "601.05"); compareTexts(rt.toMSText(true, false), "601.050"); compareTexts(rt.toMSText(false, true), "10:01.05"); compareTexts(rt.toMSText(true, true), "10:01.050"); compareTexts(rt.toFrameText(24, false), "601:01"); compareTexts(rt.toFrameText(24, true), "10:01:01"); compareTexts(rt.toSecText(), "10:01"); rt = RealTime::fromSeconds(3600); compareTexts(rt.toMSText(false, false), "3600"); compareTexts(rt.toMSText(true, false), "3600.000"); compareTexts(rt.toMSText(false, true), "1:00:00"); compareTexts(rt.toMSText(true, true), "1:00:00.000"); compareTexts(rt.toFrameText(24, false), "3600:00"); compareTexts(rt.toFrameText(24, true), "1:00:00:00"); compareTexts(rt.toSecText(), "1:00:00"); // For practical reasons our time display always rounds down rt = RealTime(3599, ONE_BILLION-1); compareTexts(rt.toMSText(false, false), "3599.999"); compareTexts(rt.toMSText(true, false), "3599.999"); compareTexts(rt.toMSText(false, true), "59:59.999"); compareTexts(rt.toMSText(true, true), "59:59.999"); compareTexts(rt.toFrameText(24, false), "3599:23"); compareTexts(rt.toFrameText(24, true), "59:59:23"); compareTexts(rt.toSecText(), "59:59"); rt = RealTime::fromSeconds(3600 * 4 + 60 * 5 + 3 + 0.01); compareTexts(rt.toMSText(false, false), "14703.01"); compareTexts(rt.toMSText(true, false), "14703.010"); compareTexts(rt.toMSText(false, true), "4:05:03.01"); compareTexts(rt.toMSText(true, true), "4:05:03.010"); compareTexts(rt.toFrameText(24, false), "14703:00"); compareTexts(rt.toFrameText(24, true), "4:05:03:00"); compareTexts(rt.toSecText(), "4:05:03"); rt = RealTime::fromSeconds(-(3600 * 4 + 60 * 5 + 3 + 0.01)); compareTexts(rt.toMSText(false, false), "-14703.01"); compareTexts(rt.toMSText(true, false), "-14703.010"); compareTexts(rt.toMSText(false, true), "-4:05:03.01"); compareTexts(rt.toMSText(true, true), "-4:05:03.010"); compareTexts(rt.toFrameText(24, false), "-14703:00"); compareTexts(rt.toFrameText(24, true), "-4:05:03:00"); compareTexts(rt.toSecText(), "-4:05:03"); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestPitch.h0000644000000000000000000000722713111512442020416 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_PITCH_H #define TEST_PITCH_H #include "../Pitch.h" #include "../Preferences.h" #include #include #include #include using namespace std; class TestPitch : public QObject { Q_OBJECT private slots: void init() { Preferences::getInstance()->setOctaveOfMiddleC(4); Preferences::getInstance()->setTuningFrequency(440); } void pitchLabel() { QCOMPARE(Pitch::getPitchLabel(60, 0, false), QString("C4")); QCOMPARE(Pitch::getPitchLabel(69, 0, false), QString("A4")); QCOMPARE(Pitch::getPitchLabel(61, 0, false), QString("C#4")); QCOMPARE(Pitch::getPitchLabel(61, 0, true), QString("Db4")); QCOMPARE(Pitch::getPitchLabel(59, 0, false), QString("B3")); QCOMPARE(Pitch::getPitchLabel(59, 0, true), QString("B3")); QCOMPARE(Pitch::getPitchLabel(0, 0, false), QString("C-1")); QCOMPARE(Pitch::getPitchLabel(60, -40, false), QString("C4-40c")); QCOMPARE(Pitch::getPitchLabel(60, 40, false), QString("C4+40c")); QCOMPARE(Pitch::getPitchLabel(58, 4, false), QString("A#3+4c")); Preferences::getInstance()->setOctaveOfMiddleC(3); QCOMPARE(Pitch::getPitchLabel(60, 0, false), QString("C3")); QCOMPARE(Pitch::getPitchLabel(69, 0, false), QString("A3")); QCOMPARE(Pitch::getPitchLabel(61, 0, false), QString("C#3")); QCOMPARE(Pitch::getPitchLabel(61, 0, true), QString("Db3")); QCOMPARE(Pitch::getPitchLabel(59, 0, false), QString("B2")); QCOMPARE(Pitch::getPitchLabel(59, 0, true), QString("B2")); QCOMPARE(Pitch::getPitchLabel(0, 0, false), QString("C-2")); QCOMPARE(Pitch::getPitchLabel(60, -40, false), QString("C3-40c")); QCOMPARE(Pitch::getPitchLabel(60, 40, false), QString("C3+40c")); QCOMPARE(Pitch::getPitchLabel(58, 4, false), QString("A#2+4c")); } void pitchLabelForFrequency() { QCOMPARE(Pitch::getPitchLabelForFrequency(440, 440, false), QString("A4")); QCOMPARE(Pitch::getPitchLabelForFrequency(440, 220, false), QString("A5")); QCOMPARE(Pitch::getPitchLabelForFrequency(261.63, 440, false), QString("C4")); } #define MIDDLE_C 261.6255653005986 void frequencyForPitch() { QCOMPARE(Pitch::getFrequencyForPitch(60, 0), MIDDLE_C); QCOMPARE(Pitch::getFrequencyForPitch(69, 0), 440.0); QCOMPARE(Pitch::getFrequencyForPitch(60, 0, 220), MIDDLE_C / 2.0); QCOMPARE(Pitch::getFrequencyForPitch(69, 0, 220), 220.0); } void pitchForFrequency() { double centsOffset = 0.0; QCOMPARE(Pitch::getPitchForFrequency(MIDDLE_C, ¢sOffset), 60); QCOMPARE(centsOffset + 1.0, 1.0); // avoid ineffective fuzzy-compare to 0 QCOMPARE(Pitch::getPitchForFrequency(261.0, ¢sOffset), 60); QCOMPARE(int(centsOffset), -4); QCOMPARE(Pitch::getPitchForFrequency(440.0, ¢sOffset), 69); QCOMPARE(centsOffset + 1.0, 1.0); } void pitchForFrequencyF() { float centsOffset = 0.f; QCOMPARE(Pitch::getPitchForFrequency(MIDDLE_C, ¢sOffset), 60); QCOMPARE(centsOffset + 1.f, 1.f); // avoid ineffective fuzzy-compare to 0 QCOMPARE(Pitch::getPitchForFrequency(261.0, ¢sOffset), 60); QCOMPARE(int(centsOffset), -4); QCOMPARE(Pitch::getPitchForFrequency(440.0, ¢sOffset), 69); QCOMPARE(centsOffset + 1.f, 1.f); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestRangeMapper.h0000644000000000000000000002376513111512442021555 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_RANGE_MAPPER_H #define TEST_RANGE_MAPPER_H #include "../RangeMapper.h" #include #include #include #include using namespace std; class TestRangeMapper : public QObject { Q_OBJECT private slots: void linearUpForward() { LinearRangeMapper rm(1, 8, 0.5, 4.0, "x", false); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getPositionForValue(0.5), 1); QCOMPARE(rm.getPositionForValue(4.0), 8); QCOMPARE(rm.getPositionForValue(3.0), 6); QCOMPARE(rm.getPositionForValue(3.1), 6); QCOMPARE(rm.getPositionForValue(3.4), 7); QCOMPARE(rm.getPositionForValue(0.2), 1); QCOMPARE(rm.getPositionForValue(-12), 1); QCOMPARE(rm.getPositionForValue(6.1), 8); QCOMPARE(rm.getPositionForValueUnclamped(3.0), 6); QCOMPARE(rm.getPositionForValueUnclamped(0.2), 0); QCOMPARE(rm.getPositionForValueUnclamped(-12), -24); QCOMPARE(rm.getPositionForValueUnclamped(6.1), 12); } void linearDownForward() { LinearRangeMapper rm(1, 8, 0.5, 4.0, "x", true); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getPositionForValue(0.5), 8); QCOMPARE(rm.getPositionForValue(4.0), 1); QCOMPARE(rm.getPositionForValue(3.0), 3); QCOMPARE(rm.getPositionForValue(3.1), 3); QCOMPARE(rm.getPositionForValue(3.4), 2); QCOMPARE(rm.getPositionForValue(0.2), 8); QCOMPARE(rm.getPositionForValue(-12), 8); QCOMPARE(rm.getPositionForValue(6.1), 1); QCOMPARE(rm.getPositionForValueUnclamped(3.0), 3); QCOMPARE(rm.getPositionForValueUnclamped(0.2), 9); QCOMPARE(rm.getPositionForValueUnclamped(-12), 33); QCOMPARE(rm.getPositionForValueUnclamped(6.1), -3); } void linearUpBackward() { LinearRangeMapper rm(1, 8, 0.5, 4.0, "x", false); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getValueForPosition(1), 0.5); QCOMPARE(rm.getValueForPosition(8), 4.0); QCOMPARE(rm.getValueForPosition(6), 3.0); QCOMPARE(rm.getValueForPosition(7), 3.5); QCOMPARE(rm.getValueForPosition(0), rm.getValueForPosition(1)); QCOMPARE(rm.getValueForPosition(9), rm.getValueForPosition(8)); QCOMPARE(rm.getValueForPositionUnclamped(6), 3.0); QCOMPARE(rm.getValueForPositionUnclamped(0) + 1.0, 0.0 + 1.0); QCOMPARE(rm.getValueForPositionUnclamped(-24), -12.0); QCOMPARE(rm.getValueForPositionUnclamped(12), 6.0); } void linearDownBackward() { LinearRangeMapper rm(1, 8, 0.5, 4.0, "x", true); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getValueForPosition(8), 0.5); QCOMPARE(rm.getValueForPosition(1), 4.0); QCOMPARE(rm.getValueForPosition(3), 3.0); QCOMPARE(rm.getValueForPosition(2), 3.5); QCOMPARE(rm.getValueForPosition(0), rm.getValueForPosition(1)); QCOMPARE(rm.getValueForPosition(9), rm.getValueForPosition(8)); QCOMPARE(rm.getValueForPositionUnclamped(3), 3.0); QCOMPARE(rm.getValueForPositionUnclamped(9) + 1.0, 0.0 + 1.0); QCOMPARE(rm.getValueForPositionUnclamped(33), -12.0); QCOMPARE(rm.getValueForPositionUnclamped(-3), 6.0); } void logUpForward() { LogRangeMapper rm(3, 7, 10, 100000, "x", false); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getPositionForValue(10.0), 3); QCOMPARE(rm.getPositionForValue(100000.0), 7); QCOMPARE(rm.getPositionForValue(1.0), 3); QCOMPARE(rm.getPositionForValue(1000000.0), 7); QCOMPARE(rm.getPositionForValue(1000.0), 5); QCOMPARE(rm.getPositionForValue(900.0), 5); QCOMPARE(rm.getPositionForValue(20000), 6); QCOMPARE(rm.getPositionForValueUnclamped(1.0), 2); QCOMPARE(rm.getPositionForValueUnclamped(1000000.0), 8); QCOMPARE(rm.getPositionForValueUnclamped(1000.0), 5); } void logDownForward() { LogRangeMapper rm(3, 7, 10, 100000, "x", true); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getPositionForValue(10.0), 7); QCOMPARE(rm.getPositionForValue(100000.0), 3); QCOMPARE(rm.getPositionForValue(1.0), 7); QCOMPARE(rm.getPositionForValue(1000000.0), 3); QCOMPARE(rm.getPositionForValue(1000.0), 5); QCOMPARE(rm.getPositionForValue(900.0), 5); QCOMPARE(rm.getPositionForValue(20000), 4); QCOMPARE(rm.getPositionForValueUnclamped(1.0), 8); QCOMPARE(rm.getPositionForValueUnclamped(1000000.0), 2); QCOMPARE(rm.getPositionForValueUnclamped(1000.0), 5); } void logUpBackward() { LogRangeMapper rm(3, 7, 10, 100000, "x", false); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getValueForPosition(3), 10.0); QCOMPARE(rm.getValueForPosition(7), 100000.0); QCOMPARE(rm.getValueForPosition(5), 1000.0); QCOMPARE(rm.getValueForPosition(6), 10000.0); QCOMPARE(rm.getValueForPosition(0), rm.getValueForPosition(3)); QCOMPARE(rm.getValueForPosition(9), rm.getValueForPosition(7)); QCOMPARE(rm.getValueForPositionUnclamped(2), 1.0); QCOMPARE(rm.getValueForPositionUnclamped(8), 1000000.0); QCOMPARE(rm.getValueForPositionUnclamped(5), 1000.0); } void logDownBackward() { LogRangeMapper rm(3, 7, 10, 100000, "x", true); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getValueForPosition(7), 10.0); QCOMPARE(rm.getValueForPosition(3), 100000.0); QCOMPARE(rm.getValueForPosition(5), 1000.0); QCOMPARE(rm.getValueForPosition(4), 10000.0); QCOMPARE(rm.getValueForPosition(0), rm.getValueForPosition(3)); QCOMPARE(rm.getValueForPosition(9), rm.getValueForPosition(7)); QCOMPARE(rm.getValueForPositionUnclamped(8), 1.0); QCOMPARE(rm.getValueForPositionUnclamped(2), 1000000.0); QCOMPARE(rm.getValueForPositionUnclamped(5), 1000.0); } void interpolatingForward() { InterpolatingRangeMapper::CoordMap mappings; mappings[1] = 10; mappings[3] = 30; mappings[5] = 70; InterpolatingRangeMapper rm(mappings, "x"); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getPositionForValue(1.0), 10); QCOMPARE(rm.getPositionForValue(0.0), 10); QCOMPARE(rm.getPositionForValue(5.0), 70); QCOMPARE(rm.getPositionForValue(6.0), 70); QCOMPARE(rm.getPositionForValue(3.0), 30); QCOMPARE(rm.getPositionForValue(2.5), 25); QCOMPARE(rm.getPositionForValue(4.5), 60); QCOMPARE(rm.getPositionForValueUnclamped(0.0), 0); QCOMPARE(rm.getPositionForValueUnclamped(2.5), 25); QCOMPARE(rm.getPositionForValueUnclamped(6.0), 90); } void interpolatingBackward() { InterpolatingRangeMapper::CoordMap mappings; mappings[1] = 10; mappings[3] = 30; mappings[5] = 70; InterpolatingRangeMapper rm(mappings, "x"); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getValueForPosition(10), 1.0); QCOMPARE(rm.getValueForPosition(9), 1.0); QCOMPARE(rm.getValueForPosition(70), 5.0); QCOMPARE(rm.getValueForPosition(80), 5.0); QCOMPARE(rm.getValueForPosition(30), 3.0); QCOMPARE(rm.getValueForPosition(25), 2.5); QCOMPARE(rm.getValueForPosition(60), 4.5); } void autoLinearForward() { AutoRangeMapper::CoordMap mappings; mappings[0.5] = 1; mappings[4.0] = 8; AutoRangeMapper rm1(mappings, "x"); QCOMPARE(rm1.getUnit(), QString("x")); QCOMPARE(rm1.getType(), AutoRangeMapper::StraightLine); QCOMPARE(rm1.getPositionForValue(0.1), 1); QCOMPARE(rm1.getPositionForValue(0.5), 1); QCOMPARE(rm1.getPositionForValue(4.0), 8); QCOMPARE(rm1.getPositionForValue(4.5), 8); QCOMPARE(rm1.getPositionForValue(3.0), 6); QCOMPARE(rm1.getPositionForValue(3.1), 6); QCOMPARE(rm1.getPositionForValueUnclamped(0.1), 0); QCOMPARE(rm1.getPositionForValueUnclamped(3.1), 6); QCOMPARE(rm1.getPositionForValueUnclamped(4.5), 9); mappings[3.0] = 6; mappings[3.5] = 7; AutoRangeMapper rm2(mappings, "x"); QCOMPARE(rm2.getUnit(), QString("x")); QCOMPARE(rm2.getType(), AutoRangeMapper::StraightLine); QCOMPARE(rm2.getPositionForValue(0.5), 1); QCOMPARE(rm2.getPositionForValue(4.0), 8); QCOMPARE(rm2.getPositionForValue(3.0), 6); QCOMPARE(rm2.getPositionForValue(3.1), 6); } void autoLogForward() { AutoRangeMapper::CoordMap mappings; mappings[10] = 3; mappings[1000] = 5; mappings[100000] = 7; AutoRangeMapper rm1(mappings, "x"); QCOMPARE(rm1.getUnit(), QString("x")); QCOMPARE(rm1.getType(), AutoRangeMapper::Logarithmic); QCOMPARE(rm1.getPositionForValue(10.0), 3); QCOMPARE(rm1.getPositionForValue(100000.0), 7); QCOMPARE(rm1.getPositionForValue(1.0), 3); QCOMPARE(rm1.getPositionForValue(1000000.0), 7); QCOMPARE(rm1.getPositionForValue(1000.0), 5); QCOMPARE(rm1.getPositionForValue(900.0), 5); QCOMPARE(rm1.getPositionForValue(20000), 6); QCOMPARE(rm1.getPositionForValueUnclamped(1.0), 2); QCOMPARE(rm1.getPositionForValueUnclamped(900.0), 5); QCOMPARE(rm1.getPositionForValueUnclamped(1000000.0), 8); mappings[100] = 4; AutoRangeMapper rm2(mappings, "x"); QCOMPARE(rm2.getUnit(), QString("x")); QCOMPARE(rm2.getType(), AutoRangeMapper::Logarithmic); QCOMPARE(rm2.getPositionForValue(10.0), 3); QCOMPARE(rm2.getPositionForValue(100000.0), 7); QCOMPARE(rm2.getPositionForValue(1.0), 3); QCOMPARE(rm2.getPositionForValue(1000000.0), 7); QCOMPARE(rm2.getPositionForValue(1000.0), 5); QCOMPARE(rm2.getPositionForValue(900.0), 5); QCOMPARE(rm2.getPositionForValue(20000), 6); } void autoInterpolatingForward() { AutoRangeMapper::CoordMap mappings; mappings[1] = 10; mappings[3] = 30; mappings[5] = 70; AutoRangeMapper rm(mappings, "x"); QCOMPARE(rm.getUnit(), QString("x")); QCOMPARE(rm.getType(), AutoRangeMapper::Interpolating); QCOMPARE(rm.getPositionForValue(1.0), 10); QCOMPARE(rm.getPositionForValue(0.0), 10); QCOMPARE(rm.getPositionForValue(5.0), 70); QCOMPARE(rm.getPositionForValue(6.0), 70); QCOMPARE(rm.getPositionForValue(3.0), 30); QCOMPARE(rm.getPositionForValue(2.5), 25); QCOMPARE(rm.getPositionForValue(4.5), 60); QCOMPARE(rm.getPositionForValueUnclamped(0.0), 0); QCOMPARE(rm.getPositionForValueUnclamped(5.0), 70); QCOMPARE(rm.getPositionForValueUnclamped(6.0), 90); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestScaleTickIntervals.h0000644000000000000000000003230713111512442023076 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_SCALE_TICK_INTERVALS_H #define TEST_SCALE_TICK_INTERVALS_H #include "../ScaleTickIntervals.h" #include #include #include #include using namespace std; class TestScaleTickIntervals : public QObject { Q_OBJECT void printDiff(vector ticks, vector expected) { cerr << "Have " << ticks.size() << " ticks, expected " << expected.size() << endl; for (int i = 0; i < int(ticks.size()); ++i) { cerr << i << ": have " << ticks[i].value << " \"" << ticks[i].label << "\", expected "; if (i < int(expected.size())) { cerr << expected[i].value << " \"" << expected[i].label << "\"" << endl; } else { cerr << "(n/a)" << endl; } } } void compareTicks(ScaleTickIntervals::Ticks ticks, ScaleTickIntervals::Ticks expected, bool fuzzier = false) { double eps = 1e-7; for (int i = 0; i < int(expected.size()); ++i) { if (i < int(ticks.size())) { bool pass = true; if (ticks[i].label != expected[i].label) { pass = false; } else if (!fuzzier) { if (fabs(ticks[i].value - expected[i].value) > eps) { pass = false; } } else { if (fabs(ticks[i].value - expected[i].value) > fabs(ticks[i].value) * 1e-5) { pass = false; } } if (!pass) { printDiff(ticks, expected); QCOMPARE(ticks[i].label, expected[i].label); QCOMPARE(ticks[i].value, expected[i].value); } } } if (ticks.size() != expected.size()) { printDiff(ticks, expected); } QCOMPARE(ticks.size(), expected.size()); } private slots: void linear_0_1_10() { auto ticks = ScaleTickIntervals::linear({ 0, 1, 10 }); ScaleTickIntervals::Ticks expected { { 0.0, "0.0" }, { 0.1, "0.1" }, { 0.2, "0.2" }, { 0.3, "0.3" }, { 0.4, "0.4" }, { 0.5, "0.5" }, { 0.6, "0.6" }, { 0.7, "0.7" }, { 0.8, "0.8" }, { 0.9, "0.9" }, { 1.0, "1.0" } }; compareTicks(ticks, expected); } void linear_0_5_5() { auto ticks = ScaleTickIntervals::linear({ 0, 5, 5 }); ScaleTickIntervals::Ticks expected { { 0, "0" }, { 1, "1" }, { 2, "2" }, { 3, "3" }, { 4, "4" }, { 5, "5" }, }; compareTicks(ticks, expected); } void linear_0_10_5() { auto ticks = ScaleTickIntervals::linear({ 0, 10, 5 }); ScaleTickIntervals::Ticks expected { { 0, "0" }, { 2, "2" }, { 4, "4" }, { 6, "6" }, { 8, "8" }, { 10, "10" } }; compareTicks(ticks, expected); } void linear_10_0_5() { auto ticks = ScaleTickIntervals::linear({ 10, 0, 5 }); ScaleTickIntervals::Ticks expected { { 0, "0" }, { 2, "2" }, { 4, "4" }, { 6, "6" }, { 8, "8" }, { 10, "10" } }; compareTicks(ticks, expected); } void linear_m10_0_5() { auto ticks = ScaleTickIntervals::linear({ -10, 0, 5 }); ScaleTickIntervals::Ticks expected { { -10, "-10" }, { -8, "-8" }, { -6, "-6" }, { -4, "-4" }, { -2, "-2" }, { 0, "0" } }; compareTicks(ticks, expected); } void linear_0_m10_5() { auto ticks = ScaleTickIntervals::linear({ 0, -10, 5 }); ScaleTickIntervals::Ticks expected { { -10, "-10" }, { -8, "-8" }, { -6, "-6" }, { -4, "-4" }, { -2, "-2" }, { 0, "0" } }; compareTicks(ticks, expected); } void linear_0_0p1_5() { auto ticks = ScaleTickIntervals::linear({ 0, 0.1, 5 }); ScaleTickIntervals::Ticks expected { { 0.00, "0.00" }, { 0.02, "0.02" }, { 0.04, "0.04" }, { 0.06, "0.06" }, { 0.08, "0.08" }, { 0.10, "0.10" } }; compareTicks(ticks, expected); } void linear_0_0p01_5() { auto ticks = ScaleTickIntervals::linear({ 0, 0.01, 5 }); ScaleTickIntervals::Ticks expected { { 0.000, "0.000" }, { 0.002, "0.002" }, { 0.004, "0.004" }, { 0.006, "0.006" }, { 0.008, "0.008" }, { 0.010, "0.010" } }; compareTicks(ticks, expected); } void linear_0_0p005_5() { auto ticks = ScaleTickIntervals::linear({ 0, 0.005, 5 }); ScaleTickIntervals::Ticks expected { { 0.000, "0.000" }, { 0.001, "0.001" }, { 0.002, "0.002" }, { 0.003, "0.003" }, { 0.004, "0.004" }, { 0.005, "0.005" } }; compareTicks(ticks, expected); } void linear_0_0p001_5() { auto ticks = ScaleTickIntervals::linear({ 0, 0.001, 5 }); ScaleTickIntervals::Ticks expected { { 0.0000, "0.0e+00" }, { 0.0002, "2.0e-04" }, { 0.0004, "4.0e-04" }, { 0.0006, "6.0e-04" }, { 0.0008, "8.0e-04" }, { 0.0010, "1.0e-03" } }; compareTicks(ticks, expected); } void linear_1_1p001_5() { auto ticks = ScaleTickIntervals::linear({ 1, 1.001, 5 }); ScaleTickIntervals::Ticks expected { { 1.0000, "1.0000" }, { 1.0002, "1.0002" }, { 1.0004, "1.0004" }, { 1.0006, "1.0006" }, { 1.0008, "1.0008" }, { 1.0010, "1.0010" } }; compareTicks(ticks, expected); } void linear_0p001_1_5() { auto ticks = ScaleTickIntervals::linear({ 0.001, 1, 5 }); ScaleTickIntervals::Ticks expected { { 0.1, "0.1" }, { 0.3, "0.3" }, { 0.5, "0.5" }, { 0.7, "0.7" }, { 0.9, "0.9" }, }; compareTicks(ticks, expected); } void linear_10000_10010_5() { auto ticks = ScaleTickIntervals::linear({ 10000, 10010, 5 }); ScaleTickIntervals::Ticks expected { { 10000, "10000" }, { 10002, "10002" }, { 10004, "10004" }, { 10006, "10006" }, { 10008, "10008" }, { 10010, "10010" }, }; compareTicks(ticks, expected); } void linear_10000_20000_5() { auto ticks = ScaleTickIntervals::linear({ 10000, 20000, 5 }); ScaleTickIntervals::Ticks expected { { 10000, "10000" }, { 12000, "12000" }, { 14000, "14000" }, { 16000, "16000" }, { 18000, "18000" }, { 20000, "20000" }, }; compareTicks(ticks, expected); } void linear_m1_1_10() { auto ticks = ScaleTickIntervals::linear({ -1, 1, 10 }); ScaleTickIntervals::Ticks expected { { -1.0, "-1.0" }, { -0.8, "-0.8" }, { -0.6, "-0.6" }, { -0.4, "-0.4" }, { -0.2, "-0.2" }, { 0.0, "0.0" }, { 0.2, "0.2" }, { 0.4, "0.4" }, { 0.6, "0.6" }, { 0.8, "0.8" }, { 1.0, "1.0" } }; compareTicks(ticks, expected); } void linear_221p23_623p7_57p4() { auto ticks = ScaleTickIntervals::linear({ 221.23, 623.7, 4 }); // only 4 ticks, not 5, because none of the rounded tick // values lies on an end value ScaleTickIntervals::Ticks expected { { 300, "300" }, { 400, "400" }, { 500, "500" }, { 600, "600" }, }; compareTicks(ticks, expected); } void linear_sqrt2_pi_7() { auto ticks = ScaleTickIntervals::linear({ sqrt(2.0), M_PI, 7 }); // This would be better in steps of 0.25, but we only round to // integral powers of ten ScaleTickIntervals::Ticks expected { { 1.5, "1.5" }, { 1.7, "1.7" }, { 1.9, "1.9" }, { 2.1, "2.1" }, { 2.3, "2.3" }, { 2.5, "2.5" }, { 2.7, "2.7" }, { 2.9, "2.9" }, { 3.1, "3.1" }, }; compareTicks(ticks, expected); } void linear_pi_avogadro_7() { auto ticks = ScaleTickIntervals::linear({ M_PI, 6.022140857e23, 7 }); ScaleTickIntervals::Ticks expected { // not perfect, but ok-ish { 1e+22, "1.00e+22" }, { 1e+23, "1.00e+23" }, { 1.9e+23, "1.90e+23" }, { 2.8e+23, "2.80e+23" }, { 3.7e+23, "3.70e+23" }, { 4.6e+23, "4.60e+23" }, { 5.5e+23, "5.50e+23" }, }; compareTicks(ticks, expected); } void linear_2_3_1() { auto ticks = ScaleTickIntervals::linear({ 2, 3, 1 }); ScaleTickIntervals::Ticks expected { { 2.0, "2" }, { 3.0, "3" } }; compareTicks(ticks, expected); } void linear_2_3_2() { auto ticks = ScaleTickIntervals::linear({ 2, 3, 2 }); ScaleTickIntervals::Ticks expected { { 2.0, "2.0" }, { 2.5, "2.5" }, { 3.0, "3.0" } }; compareTicks(ticks, expected); } void linear_2_3_3() { auto ticks = ScaleTickIntervals::linear({ 2, 3, 3 }); ScaleTickIntervals::Ticks expected { { 2.0, "2.0" }, { 2.3, "2.3" }, { 2.6, "2.6" }, { 2.9, "2.9" } }; compareTicks(ticks, expected); } void linear_2_3_4() { auto ticks = ScaleTickIntervals::linear({ 2, 3, 4 }); // This would be better in steps of 0.25, but we only round to // integral powers of ten ScaleTickIntervals::Ticks expected { { 2.0, "2.0" }, { 2.3, "2.3" }, { 2.6, "2.6" }, { 2.9, "2.9" } }; compareTicks(ticks, expected); } void linear_2_3_5() { auto ticks = ScaleTickIntervals::linear({ 2, 3, 5 }); ScaleTickIntervals::Ticks expected { { 2.0, "2.0" }, { 2.2, "2.2" }, { 2.4, "2.4" }, { 2.6, "2.6" }, { 2.8, "2.8" }, { 3.0, "3.0" } }; compareTicks(ticks, expected); } void linear_2_3_6() { auto ticks = ScaleTickIntervals::linear({ 2, 3, 6 }); ScaleTickIntervals::Ticks expected { { 2.0, "2.0" }, { 2.2, "2.2" }, { 2.4, "2.4" }, { 2.6, "2.6" }, { 2.8, "2.8" }, { 3.0, "3.0" } }; compareTicks(ticks, expected); } void linear_1_1_10() { // pathological range auto ticks = ScaleTickIntervals::linear({ 1, 1, 10 }); ScaleTickIntervals::Ticks expected { { 1.0, "1" } }; compareTicks(ticks, expected); } void linear_0_0_10() { // pathological range auto ticks = ScaleTickIntervals::linear({ 0, 0, 10 }); ScaleTickIntervals::Ticks expected { { 0.0, "0" } }; compareTicks(ticks, expected); } void linear_0_1_1() { auto ticks = ScaleTickIntervals::linear({ 0, 1, 1 }); ScaleTickIntervals::Ticks expected { { 0.0, "0" }, { 1.0, "1" } }; compareTicks(ticks, expected); } void linear_0_1_0() { // senseless input auto ticks = ScaleTickIntervals::linear({ 0, 1, 0 }); ScaleTickIntervals::Ticks expected { { 0.0, "0" }, }; compareTicks(ticks, expected); } void linear_0_1_m1() { // senseless input auto ticks = ScaleTickIntervals::linear({ 0, 1, -1 }); ScaleTickIntervals::Ticks expected { { 0.0, "0" }, }; compareTicks(ticks, expected); } void linear_0p465_778_10() { // a case that gave unsatisfactory results in real life // (initially it had the first tick at 1) auto ticks = ScaleTickIntervals::linear({ 0.465, 778.08, 10 }); ScaleTickIntervals::Ticks expected { { 10, "10" }, { 90, "90" }, { 170, "170" }, { 250, "250" }, { 330, "330" }, { 410, "410" }, { 490, "490" }, { 570, "570" }, { 650, "650" }, { 730, "730" }, }; compareTicks(ticks, expected); } void log_1_10_2() { auto ticks = ScaleTickIntervals::logarithmic({ 1, 10, 2 }); ScaleTickIntervals::Ticks expected { { 1.0, "1.0" }, { pow(10.0, 0.5), "3.2" }, { 10.0, "10.0" }, }; compareTicks(ticks, expected); } void log_0_10_2() { auto ticks = ScaleTickIntervals::logarithmic({ 0, 10, 2 }); ScaleTickIntervals::Ticks expected { { 1e-6, "1e-06" }, { 1, "1" }, }; compareTicks(ticks, expected); } void log_pi_avogadro_7() { auto ticks = ScaleTickIntervals::logarithmic({ M_PI, 6.022140857e23, 7 }); ScaleTickIntervals::Ticks expected { { 1000, "1e+03" }, { 1e+06, "1e+06" }, { 1e+09, "1e+09" }, { 1e+12, "1e+12" }, { 1e+15, "1e+15" }, { 1e+18, "1e+18" }, { 1e+21, "1e+21" }, }; compareTicks(ticks, expected, true); } void log_0p465_778_10() { auto ticks = ScaleTickIntervals::logarithmic({ 0.465, 778.08, 10 }); ScaleTickIntervals::Ticks expected { { 0.5, "0.5" }, { 1, "1.0" }, { 2, "2.0" }, { 4, "4.0" }, { 8, "8.0" }, { 16, "16.0" }, { 32, "32.0" }, { 64, "64.0" }, { 128, "128.0" }, { 256, "256.0" }, { 512, "512.0" }, }; compareTicks(ticks, expected); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/TestStringBits.h0000644000000000000000000001354613111512442021440 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_STRINGBITS_H #define TEST_STRINGBITS_H #include "../StringBits.h" #include #include #include #include using namespace std; class TestStringBits : public QObject { Q_OBJECT private: void testSplitQuoted(QString in, QStringList out) { // Only suitable where the output strings do not have // consecutive spaces in them QCOMPARE(StringBits::splitQuoted(in, ' '), out); QString in2(in); in2.replace(' ', ','); QStringList out2; foreach (QString o, out) { out2 << o.replace(' ', ','); } QCOMPARE(StringBits::splitQuoted(in2, ','), out2); } private slots: void simple() { QString in = "a b c d"; QStringList out; out << "a" << "b" << "c" << "d"; testSplitQuoted(in, out); } void dquoted() { QString in = "a \"b c\" d"; QStringList out; out << "a" << "b c" << "d"; testSplitQuoted(in, out); } void drunon() { QString in = "a \"b c\"d e"; QStringList out; out << "a" << "b cd" << "e"; testSplitQuoted(in, out); } void squoted() { QString in = "a 'b c' d"; QStringList out; out << "a" << "b c" << "d"; testSplitQuoted(in, out); } void srunon() { QString in = "a 'b c'd e"; QStringList out; out << "a" << "b cd" << "e"; testSplitQuoted(in, out); } void dempty() { QString in = "\"\" \"\" \"\""; QStringList out; out << "" << "" << ""; testSplitQuoted(in, out); } void sempty() { QString in = "'' '' ''"; QStringList out; out << "" << "" << ""; testSplitQuoted(in, out); } void descaped() { QString in = "a \"b c\\\" d\""; QStringList out; out << "a" << "b c\" d"; testSplitQuoted(in, out); } void sescaped() { QString in = "a 'b c\\' d'"; QStringList out; out << "a" << "b c' d"; testSplitQuoted(in, out); } void dnested() { QString in = "a \"b c' d\""; QStringList out; out << "a" << "b c' d"; testSplitQuoted(in, out); } void snested() { QString in = "a 'b c\" d'"; QStringList out; out << "a" << "b c\" d"; testSplitQuoted(in, out); } void snested2() { QString in = "aa 'bb cc\" dd'"; QStringList out; out << "aa" << "bb cc\" dd"; testSplitQuoted(in, out); } void qquoted() { QString in = "a'a 'bb' \\\"cc\" dd\\\""; QStringList out; out << "a'a" << "bb" << "\"cc\"" << "dd\""; testSplitQuoted(in, out); } void multispace() { QString in = " a'a \\' 'bb' ' \\\"cc\" ' dd\\\" '"; QStringList out; out << "a'a" << "'" << "bb" << " \"cc\" " << "dd\"" << "'"; QCOMPARE(StringBits::splitQuoted(in, ' '), out); QString in2 = ",,a'a,\\',,,,,,,,,'bb',,,,',,,,,,\\\"cc\",',dd\\\",'"; QStringList out2; out2 << "" << "" << "a'a" << "'" << "" << "" << "" << "" << "" << "" << "" << "" << "bb" << "" << "" << "" << ",,,,,,\"cc\"," << "dd\"" << "'"; QCOMPARE(StringBits::splitQuoted(in2, ','), out2); } }; #endif /* r928 Config: Using QtTest library 5.3.2, Qt 5.3.2 PASS : TestStringBits::initTestCase() PASS : TestStringBits::simple() PASS : TestStringBits::dquoted() PASS : TestStringBits::squoted() PASS : TestStringBits::descaped() FAIL! : TestStringBits::sescaped() Compared lists have different sizes. Actual (StringBits::splitQuoted(in, ' ')) size: 3 Expected (out) size: 2 Loc: [o/../TestStringBits.h(65)] PASS : TestStringBits::dnested() PASS : TestStringBits::snested() PASS : TestStringBits::snested2() PASS : TestStringBits::qquoted() FAIL! : TestStringBits::multispace() Compared lists differ at index 1. Actual (StringBits::splitQuoted(in, ' ')): " " Expected (out): "'" Loc: [o/../TestStringBits.h(100)] FAIL! : TestStringBits::qcommas() Compared lists have different sizes. Actual (StringBits::splitQuoted(in, ',')) size: 4 Expected (out) size: 3 Loc: [o/../TestStringBits.h(107)] PASS : TestStringBits::cleanupTestCase() Totals: 10 passed, 3 failed, 0 skipped */ /*curr PASS : TestStringBits::initTestCase() PASS : TestStringBits::simple() PASS : TestStringBits::dquoted() PASS : TestStringBits::squoted() PASS : TestStringBits::descaped() FAIL! : TestStringBits::sescaped() Compared lists have different sizes. Actual (StringBits::splitQuoted(in, ' ')) size: 3 Expected (out) size: 2 Loc: [o/../TestStringBits.h(65)] PASS : TestStringBits::dnested() PASS : TestStringBits::snested() PASS : TestStringBits::snested2() PASS : TestStringBits::qquoted() FAIL! : TestStringBits::multispace() Compared lists have different sizes. Actual (StringBits::splitQuoted(in, ' ')) size: 5 Expected (out) size: 6 Loc: [o/../TestStringBits.h(100)] PASS : TestStringBits::qcommas() PASS : TestStringBits::cleanupTestCase() Totals: 11 passed, 2 failed, 0 skipped */ sonic-visualiser-3.0.3/svcore/base/test/TestVampRealTime.h0000644000000000000000000003627513111512442021702 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_VAMP_REALTIME_H #include #include #include #include #include using namespace std; #define ONE_MILLION 1000000 #define ONE_BILLION 1000000000 class TestVampRealTime : public QObject { Q_OBJECT void compareTexts(string s, const char *e) { QString actual(s.c_str()); QString expected(e); QCOMPARE(actual, expected); } typedef Vamp::RealTime RealTime; typedef long frame_type; private slots: void zero() { QCOMPARE(RealTime(0, 0), RealTime::zeroTime); QCOMPARE(RealTime(0, 0).sec, 0); QCOMPARE(RealTime(0, 0).nsec, 0); QCOMPARE(RealTime(0, 0).msec(), 0); QCOMPARE(RealTime(0, 0).usec(), 0); } void ctor() { QCOMPARE(RealTime(0, 0), RealTime(0, 0)); // wraparounds QCOMPARE(RealTime(0, ONE_BILLION/2), RealTime(1, -ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2), RealTime(-1, ONE_BILLION/2)); QCOMPARE(RealTime(1, ONE_BILLION), RealTime(2, 0)); QCOMPARE(RealTime(1, -ONE_BILLION), RealTime(0, 0)); QCOMPARE(RealTime(-1, ONE_BILLION), RealTime(0, 0)); QCOMPARE(RealTime(-1, -ONE_BILLION), RealTime(-2, 0)); QCOMPARE(RealTime(2, -ONE_BILLION*2), RealTime(0, 0)); QCOMPARE(RealTime(2, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(-2, ONE_BILLION*2), RealTime(0, 0)); QCOMPARE(RealTime(-2, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2)); QCOMPARE(RealTime(0, 1).sec, 0); QCOMPARE(RealTime(0, 1).nsec, 1); QCOMPARE(RealTime(0, -1).sec, 0); QCOMPARE(RealTime(0, -1).nsec, -1); QCOMPARE(RealTime(1, -1).sec, 0); QCOMPARE(RealTime(1, -1).nsec, ONE_BILLION-1); QCOMPARE(RealTime(-1, 1).sec, 0); QCOMPARE(RealTime(-1, 1).nsec, -ONE_BILLION+1); QCOMPARE(RealTime(-1, -1).sec, -1); QCOMPARE(RealTime(-1, -1).nsec, -1); QCOMPARE(RealTime(2, -ONE_BILLION*2).sec, 0); QCOMPARE(RealTime(2, -ONE_BILLION*2).nsec, 0); QCOMPARE(RealTime(2, -ONE_BILLION/2).sec, 1); QCOMPARE(RealTime(2, -ONE_BILLION/2).nsec, ONE_BILLION/2); QCOMPARE(RealTime(-2, ONE_BILLION*2).sec, 0); QCOMPARE(RealTime(-2, ONE_BILLION*2).nsec, 0); QCOMPARE(RealTime(-2, ONE_BILLION/2).sec, -1); QCOMPARE(RealTime(-2, ONE_BILLION/2).nsec, -ONE_BILLION/2); } void fromSeconds() { QCOMPARE(RealTime::fromSeconds(0), RealTime(0, 0)); QCOMPARE(RealTime::fromSeconds(0.5).sec, 0); QCOMPARE(RealTime::fromSeconds(0.5).nsec, ONE_BILLION/2); QCOMPARE(RealTime::fromSeconds(0.5).usec(), ONE_MILLION/2); QCOMPARE(RealTime::fromSeconds(0.5).msec(), 500); QCOMPARE(RealTime::fromSeconds(0.5), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime::fromSeconds(1), RealTime(1, 0)); QCOMPARE(RealTime::fromSeconds(1.5), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime::fromSeconds(-0.5).sec, 0); QCOMPARE(RealTime::fromSeconds(-0.5).nsec, -ONE_BILLION/2); QCOMPARE(RealTime::fromSeconds(-0.5).usec(), -ONE_MILLION/2); QCOMPARE(RealTime::fromSeconds(-0.5).msec(), -500); QCOMPARE(RealTime::fromSeconds(-1.5).sec, -1); QCOMPARE(RealTime::fromSeconds(-1.5).nsec, -ONE_BILLION/2); QCOMPARE(RealTime::fromSeconds(-1.5).usec(), -ONE_MILLION/2); QCOMPARE(RealTime::fromSeconds(-1.5).msec(), -500); QCOMPARE(RealTime::fromSeconds(-0.5), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime::fromSeconds(-1), RealTime(-1, 0)); QCOMPARE(RealTime::fromSeconds(-1.5), RealTime(-1, -ONE_BILLION/2)); } void fromMilliseconds() { QCOMPARE(RealTime::fromMilliseconds(0), RealTime(0, 0)); QCOMPARE(RealTime::fromMilliseconds(500), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime::fromMilliseconds(1000), RealTime(1, 0)); QCOMPARE(RealTime::fromMilliseconds(1500), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime::fromMilliseconds(-0), RealTime(0, 0)); QCOMPARE(RealTime::fromMilliseconds(-500), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime::fromMilliseconds(-1000), RealTime(-1, 0)); QCOMPARE(RealTime::fromMilliseconds(-1500), RealTime(-1, -ONE_BILLION/2)); } #ifndef Q_OS_WIN void fromTimeval() { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, 0)); tv.tv_sec = 0; tv.tv_usec = ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, ONE_BILLION/2)); tv.tv_sec = 1; tv.tv_usec = 0; QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, 0)); tv.tv_sec = 1; tv.tv_usec = ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, ONE_BILLION/2)); tv.tv_sec = 0; tv.tv_usec = -ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, -ONE_BILLION/2)); tv.tv_sec = -1; tv.tv_usec = 0; QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, 0)); tv.tv_sec = -1; tv.tv_usec = -ONE_MILLION/2; QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, -ONE_BILLION/2)); } #endif void assign() { RealTime r; r = RealTime(0, 0); QCOMPARE(r, RealTime::zeroTime); r = RealTime(0, ONE_BILLION/2); QCOMPARE(r.sec, 0); QCOMPARE(r.nsec, ONE_BILLION/2); r = RealTime(-1, -ONE_BILLION/2); QCOMPARE(r.sec, -1); QCOMPARE(r.nsec, -ONE_BILLION/2); } void plus() { QCOMPARE(RealTime(0, 0) + RealTime(0, 0), RealTime(0, 0)); QCOMPARE(RealTime(0, 0) + RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(0, ONE_BILLION/2), RealTime(1, 0)); QCOMPARE(RealTime(1, 0) + RealTime(0, ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(0, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(-1, 0)); QCOMPARE(RealTime(-1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, 0)); QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(-1, 0), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(1, 0), RealTime(0, ONE_BILLION/2)); } void minus() { QCOMPARE(RealTime(0, 0) - RealTime(0, 0), RealTime(0, 0)); QCOMPARE(RealTime(0, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(0, ONE_BILLION/2), RealTime(0, 0)); QCOMPARE(RealTime(1, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(0, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(0, 0)); QCOMPARE(RealTime(-1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, 0)); QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, ONE_BILLION/2)); QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(-1, 0), RealTime(1, ONE_BILLION/2)); QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(1, 0), RealTime(-1, -ONE_BILLION/2)); } void negate() { QCOMPARE(-RealTime(0, 0), RealTime(0, 0)); QCOMPARE(-RealTime(1, 0), RealTime(-1, 0)); QCOMPARE(-RealTime(1, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2)); QCOMPARE(-RealTime(-1, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2)); } void compare() { int sec, nsec; for (sec = -2; sec <= 2; sec += 2) { for (nsec = -1; nsec <= 1; nsec += 1) { QCOMPARE(RealTime(sec, nsec) < RealTime(sec, nsec), false); QCOMPARE(RealTime(sec, nsec) > RealTime(sec, nsec), false); QCOMPARE(RealTime(sec, nsec) == RealTime(sec, nsec), true); QCOMPARE(RealTime(sec, nsec) != RealTime(sec, nsec), false); QCOMPARE(RealTime(sec, nsec) <= RealTime(sec, nsec), true); QCOMPARE(RealTime(sec, nsec) >= RealTime(sec, nsec), true); } } RealTime prev(-3, 0); for (sec = -2; sec <= 2; sec += 2) { for (nsec = -1; nsec <= 1; nsec += 1) { RealTime curr(sec, nsec); QCOMPARE(prev < curr, true); QCOMPARE(prev > curr, false); QCOMPARE(prev == curr, false); QCOMPARE(prev != curr, true); QCOMPARE(prev <= curr, true); QCOMPARE(prev >= curr, false); QCOMPARE(curr < prev, false); QCOMPARE(curr > prev, true); QCOMPARE(curr == prev, false); QCOMPARE(curr != prev, true); QCOMPARE(curr <= prev, false); QCOMPARE(curr >= prev, true); prev = curr; } } } void frame() { int frames[] = { 0, 1, 2047, 2048, 6656, 32767, 32768, 44100, 44101, 999999999, 2000000000 }; int n = sizeof(frames)/sizeof(frames[0]); int rates[] = { 1, 2, 8000, 22050, 44100, 44101, 192000, 2000000001 }; int m = sizeof(rates)/sizeof(rates[0]); vector> realTimes = { { { 0, 0 }, { 1, 0 }, { 2047, 0 }, { 2048, 0 }, { 6656, 0 }, { 32767, 0 }, { 32768, 0 }, { 44100, 0 }, { 44101, 0 }, { 999999999, 0 }, { 2000000000, 0 } }, { { 0, 0 }, { 0, 500000000 }, { 1023, 500000000 }, { 1024, 0 }, { 3328, 0 }, { 16383, 500000000 }, { 16384, 0 }, { 22050, 0 }, { 22050, 500000000 }, { 499999999, 500000000 }, { 1000000000, 0 } }, { { 0, 0 }, { 0, 125000 }, { 0, 255875000 }, { 0, 256000000 }, { 0, 832000000 }, { 4, 95875000 }, { 4, 96000000 }, { 5, 512500000 }, { 5, 512625000 }, { 124999, 999875000 }, { 250000, 0 } }, { { 0, 0 }, { 0, 45351 }, { 0, 92834467 }, { 0, 92879819 }, { 0, 301859410 }, { 1, 486031746 }, { 1, 486077098 }, { 2, 0 }, { 2, 45351 }, { 45351, 473877551 }, { 90702, 947845805 } }, { { 0, 0 }, { 0, 22676 }, { 0, 46417234 }, { 0, 46439909 }, { 0, 150929705 }, { 0, 743015873 }, { 0, 743038549 }, { 1, 0 }, { 1, 22676 }, { 22675, 736938776 }, { 45351, 473922902 } }, { { 0, 0 }, { 0, 22675 }, { 0, 46416181 }, { 0, 46438856 }, { 0, 150926283 }, { 0, 742999025 }, { 0, 743021700 }, { 0, 999977325 }, { 1, 0 }, { 22675, 222761389 }, { 45350, 445568128 } }, { { 0, 0 }, { 0, 5208 }, { 0, 10661458 }, { 0, 10666667 }, { 0, 34666667 }, { 0, 170661458 }, { 0, 170666667 }, { 0, 229687500 }, { 0, 229692708 }, { 5208, 333328125 }, { 10416, 666666667 } }, { { 0, 0 }, { 0, 0 }, { 0, 1023 }, { 0, 1024 }, { 0, 3328 }, { 0, 16383 }, { 0, 16384 }, { 0, 22050 }, { 0, 22050 }, { 0, 499999999 }, { 1, 0 } } }; for (int i = 0; i < n; ++i) { frame_type frame = frames[i]; for (int j = 0; j < m; ++j) { int rate = rates[j]; RealTime rt = RealTime::frame2RealTime(frame, rate); QCOMPARE(rt.sec, realTimes[j][i].sec); QCOMPARE(rt.nsec, realTimes[j][i].nsec); frame_type conv = RealTime::realTime2Frame(rt, rate); rt = RealTime::frame2RealTime(-frame, rate); frame_type negconv = RealTime::realTime2Frame(rt, rate); if (rate > ONE_BILLION) { // We don't have enough precision in RealTime // for this absurd sample rate, so a round trip // conversion may round QVERIFY(abs(frame - conv) < 2); QVERIFY(abs(-frame - negconv) < 2); } else { QCOMPARE(conv, frame); QCOMPARE(negconv, -frame); } } } } // Vamp SDK version just has toText, which is like our own // toMSText with true for its second arg void toText() { // we want to use QStrings, because then the Qt test library // will print out any conflicts. The compareTexts function // does this for us int halfSec = ONE_BILLION/2; // nsec RealTime rt = RealTime(0, 0); compareTexts(rt.toText(false), "0"); compareTexts(rt.toText(true), "0.000"); rt = RealTime(1, halfSec); compareTexts(rt.toText(false), "1.5"); compareTexts(rt.toText(true), "1.500"); rt = RealTime::fromSeconds(-1.5); compareTexts(rt.toText(false), "-1.5"); compareTexts(rt.toText(true), "-1.500"); rt = RealTime::fromSeconds(60); compareTexts(rt.toText(false), "1:00"); compareTexts(rt.toText(true), "1:00.000"); rt = RealTime::fromSeconds(61.05); compareTexts(rt.toText(false), "1:01.05"); compareTexts(rt.toText(true), "1:01.050"); rt = RealTime::fromSeconds(601.05); compareTexts(rt.toText(false), "10:01.05"); compareTexts(rt.toText(true), "10:01.050"); rt = RealTime::fromSeconds(3600); compareTexts(rt.toText(false), "1:00:00"); compareTexts(rt.toText(true), "1:00:00.000"); // For practical reasons our time display always rounds down rt = RealTime(3599, ONE_BILLION-1); compareTexts(rt.toText(false), "59:59.999"); compareTexts(rt.toText(true), "59:59.999"); rt = RealTime::fromSeconds(3600 * 4 + 60 * 5 + 3 + 0.01); compareTexts(rt.toText(false), "4:05:03.01"); compareTexts(rt.toText(true), "4:05:03.010"); rt = RealTime::fromSeconds(-(3600 * 4 + 60 * 5 + 3 + 0.01)); compareTexts(rt.toText(false), "-4:05:03.01"); compareTexts(rt.toText(true), "-4:05:03.010"); } }; #endif sonic-visualiser-3.0.3/svcore/base/test/files.pri0000644000000000000000000000041613111512442020145 0ustar 00000000000000TEST_HEADERS = \ TestColumnOp.h \ TestLogRange.h \ TestRangeMapper.h \ TestOurRealTime.h \ TestPitch.h \ TestScaleTickIntervals.h \ TestStringBits.h \ TestVampRealTime.h TEST_SOURCES += \ svcore-base-test.cpp sonic-visualiser-3.0.3/svcore/base/test/svcore-base-test.cpp0000644000000000000000000000363613111512442022230 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "TestLogRange.h" #include "TestRangeMapper.h" #include "TestPitch.h" #include "TestScaleTickIntervals.h" #include "TestStringBits.h" #include "TestOurRealTime.h" #include "TestVampRealTime.h" #include "TestColumnOp.h" #include #include int main(int argc, char *argv[]) { int good = 0, bad = 0; QCoreApplication app(argc, argv); app.setOrganizationName("sonic-visualiser"); app.setApplicationName("test-svcore-base"); { TestRangeMapper t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestPitch t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestOurRealTime t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestVampRealTime t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestStringBits t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestColumnOp t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestLogRange t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { TestScaleTickIntervals t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } if (bad > 0) { cerr << "\n********* " << bad << " test suite(s) failed!\n" << endl; return 1; } else { cerr << "All tests passed" << endl; return 0; } } sonic-visualiser-3.0.3/svcore/bootstrap.sh0000644000000000000000000000004413111512442017004 0ustar 00000000000000#!/bin/sh aclocal -I . && autoconf sonic-visualiser-3.0.3/svcore/config.pri.in0000644000000000000000000000071013111512442017021 0ustar 00000000000000CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ HAVE_DATAQUAY QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ QMAKE_LFLAGS += @LDFLAGS@ linux*:LIBS += -lasound -ldl macx*:DEFINES += HAVE_COREAUDIO MACOSX_DEPLOYMENT_TARGET=1060 macx*:LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-3.0.3/svcore/configure0000755000000000000000000073545513111512442016367 0ustar 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for SVcore 2.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='SVcore' PACKAGE_TARNAME='svcore' PACKAGE_VERSION='2.1' PACKAGE_STRING='SVcore 2.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="base/Pitch.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_2_0_LIBS portaudio_2_0_CFLAGS liblo_LIBS liblo_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP HAVE_CXX11 MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS liblo_CFLAGS liblo_LIBS portaudio_2_0_CFLAGS portaudio_2_0_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures SVcore 2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/svcore] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of SVcore 2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_2_0_CFLAGS C compiler flags for portaudio_2_0, overriding pkg-config portaudio_2_0_LIBS linker flags for portaudio_2_0, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF SVcore configure 2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by SVcore $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } # We are daringly making use of C++11 now ax_cxx_compile_cxx11_required=true ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -Werror -g" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio_2_0 SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio_2_0 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_2_0_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS" LIBS="$LIBS $portaudio_2_0_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio_2_0" >&5 $as_echo_n "checking for portaudio_2_0... " >&6; } if test -n "$portaudio_2_0_CFLAGS"; then pkg_cv_portaudio_2_0_CFLAGS="$portaudio_2_0_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_2_0_LIBS"; then pkg_cv_portaudio_2_0_LIBS="$portaudio_2_0_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_2_0_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_2_0_CFLAGS=$pkg_cv_portaudio_2_0_CFLAGS portaudio_2_0_LIBS=$pkg_cv_portaudio_2_0_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS";LIBS="$LIBS $portaudio_2_0_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by SVcore $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ SVcore config.status 2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r svcore.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-3.0.3/svcore/configure.ac0000644000000000000000000001036413111512442016727 0ustar 00000000000000 AC_INIT([SVcore], [2.1], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(base/Pitch.h) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P # We are daringly making use of C++11 now AX_CXX_COMPILE_STDCXX_11(noext) AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -Werror -g" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r svcore.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-3.0.3/svcore/data/fileio/AudioFileReader.cpp0000644000000000000000000000230413111512442022304 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "AudioFileReader.h" using std::vector; vector AudioFileReader::getDeInterleavedFrames(sv_frame_t start, sv_frame_t count) const { floatvec_t interleaved = getInterleavedFrames(start, count); int channels = getChannelCount(); if (channels == 1) return { interleaved }; sv_frame_t rc = interleaved.size() / channels; vector frames(channels, floatvec_t(rc, 0.f)); for (int c = 0; c < channels; ++c) { for (sv_frame_t i = 0; i < rc; ++i) { frames[c][i] = interleaved[i * channels + c]; } } return frames; } sonic-visualiser-3.0.3/svcore/data/fileio/AudioFileReader.h0000644000000000000000000001162213111512442021754 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_FILE_READER_H_ #define _AUDIO_FILE_READER_H_ #include #include "base/BaseTypes.h" #include "FileSource.h" #include #include class AudioFileReader : public QObject { Q_OBJECT public: virtual ~AudioFileReader() { } /** * Return true if the file was opened successfully and no error * has subsequently occurred. */ bool isOK() const { return (m_channelCount > 0); } /** * If isOK() is false, return an error string. */ virtual QString getError() const { return ""; } /** * Return the number of audio sample frames (i.e. samples per * channel) in the file. */ sv_frame_t getFrameCount() const { return m_frameCount; } /** * Return the number of channels in the file. */ int getChannelCount() const { return m_channelCount; } /** * Return the samplerate at which the file is being read. This is * the rate requested when the file was opened, which may differ * from the native rate of the file (in which case the file will * be resampled as it is read). */ sv_samplerate_t getSampleRate() const { return m_sampleRate; } /** * Return the native samplerate of the file. This will differ from * getSampleRate() if the file is being resampled because it was * requested to open at a different rate from native. */ virtual sv_samplerate_t getNativeRate() const { return m_sampleRate; } /** * Return the location of the audio data in the reader (as passed * in to the FileSource constructor, for example). */ virtual QString getLocation() const { return ""; } /** * Return the title of the work in the audio file, if known. This * may be implemented by subclasses that support file tagging. * This is not the same thing as the file name. */ virtual QString getTitle() const { return ""; } /** * Return the "maker" of the work in the audio file, if known. * This could represent almost anything (band, composer, * conductor, artist etc). */ virtual QString getMaker() const { return ""; } /** * Return the local file path of the audio data. This is the * location most likely to contain readable audio data: it may be * in a different place or format from the originally specified * location, for example if the file has been retrieved and * decoded. In some cases there may be no local file path, and * this will return "" if there is none. */ virtual QString getLocalFilename() const { return ""; } typedef std::map TagMap; virtual TagMap getTags() const { return TagMap(); } /** * Return true if this file supports fast seek and random * access. Typically this will be true for uncompressed formats * and false for compressed ones. */ virtual bool isQuicklySeekable() const = 0; /** * Return interleaved samples for count frames from index start. * The resulting vector will contain count * getChannelCount() * samples (or fewer if end of file is reached). * * The subclass implementations of this function must be * thread-safe -- that is, safe to call from multiple threads with * different arguments on the same object at the same time. */ virtual floatvec_t getInterleavedFrames(sv_frame_t start, sv_frame_t count) const = 0; /** * Return de-interleaved samples for count frames from index * start. Implemented in this class (it calls * getInterleavedFrames and de-interleaves). The resulting vector * will contain getChannelCount() sample blocks of count samples * each (or fewer if end of file is reached). */ virtual std::vector getDeInterleavedFrames(sv_frame_t start, sv_frame_t count) const; // only subclasses that do not know exactly how long the audio // file is until it's been completely decoded should implement this virtual int getDecodeCompletion() const { return 100; } // % virtual bool isUpdating() const { return false; } signals: void frameCountChanged(); protected: sv_frame_t m_frameCount; int m_channelCount; sv_samplerate_t m_sampleRate; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/AudioFileReaderFactory.cpp0000644000000000000000000002015313111512442023636 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "AudioFileReaderFactory.h" #include "WavFileReader.h" #include "DecodingWavFileReader.h" #include "OggVorbisFileReader.h" #include "MP3FileReader.h" #include "CoreAudioFileReader.h" #include "AudioFileSizeEstimator.h" #include "base/StorageAdviser.h" #include #include #include QString AudioFileReaderFactory::getKnownExtensions() { std::set extensions; WavFileReader::getSupportedExtensions(extensions); #ifdef HAVE_MAD MP3FileReader::getSupportedExtensions(extensions); #endif #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND OggVorbisFileReader::getSupportedExtensions(extensions); #endif #endif #ifdef HAVE_COREAUDIO CoreAudioFileReader::getSupportedExtensions(extensions); #endif QString rv; for (std::set::const_iterator i = extensions.begin(); i != extensions.end(); ++i) { if (i != extensions.begin()) rv += " "; rv += "*." + *i; } return rv; } AudioFileReader * AudioFileReaderFactory::createReader(FileSource source, Parameters params, ProgressReporter *reporter) { QString err; SVDEBUG << "AudioFileReaderFactory: url \"" << source.getLocation() << "\": requested rate: " << params.targetRate << (params.targetRate == 0 ? " (use source rate)" : "") << endl; SVDEBUG << "AudioFileReaderFactory: local filename \"" << source.getLocalFilename() << "\", content type \"" << source.getContentType() << "\"" << endl; if (!source.isOK()) { SVCERR << "AudioFileReaderFactory::createReader(\"" << source.getLocation() << "\": Failed to retrieve source (transmission error?): " << source.getErrorString() << endl; return 0; } if (!source.isAvailable()) { SVCERR << "AudioFileReaderFactory::createReader(\"" << source.getLocation() << "\": Source not found" << endl; return 0; } AudioFileReader *reader = 0; sv_samplerate_t targetRate = params.targetRate; bool normalised = (params.normalisation == Normalisation::Peak); sv_frame_t estimatedSamples = AudioFileSizeEstimator::estimate(source, targetRate); CodedAudioFileReader::CacheMode cacheMode = CodedAudioFileReader::CacheInTemporaryFile; if (estimatedSamples > 0) { size_t kb = (estimatedSamples * sizeof(float)) / 1024; SVDEBUG << "AudioFileReaderFactory: checking where to potentially cache " << kb << "K of sample data" << endl; StorageAdviser::Recommendation rec = StorageAdviser::recommend(StorageAdviser::SpeedCritical, kb, kb); if ((rec & StorageAdviser::UseMemory) || (rec & StorageAdviser::PreferMemory)) { SVDEBUG << "AudioFileReaderFactory: cacheing (if at all) in memory" << endl; cacheMode = CodedAudioFileReader::CacheInMemory; } else { SVDEBUG << "AudioFileReaderFactory: cacheing (if at all) on disc" << endl; } } CodedAudioFileReader::DecodeMode decodeMode = (params.threadingMode == ThreadingMode::Threaded ? CodedAudioFileReader::DecodeThreaded : CodedAudioFileReader::DecodeAtOnce); // We go through the set of supported readers at most twice: once // picking out only the readers that claim to support the given // file's extension or MIME type, and (if that fails) again // providing the file to every reader in turn regardless of // extension or type. (If none of the readers claim to support a // file, that may just mean its extension is missing or // misleading. We have to be confident that the reader won't open // just any old text file or whatever and pretend it's succeeded.) for (int any = 0; any <= 1; ++any) { bool anyReader = (any > 0); if (!anyReader) { SVDEBUG << "AudioFileReaderFactory: Checking whether any reader officially handles this source" << endl; } else { SVDEBUG << "AudioFileReaderFactory: Source not officially handled by any reader, trying again with each reader in turn" << endl; } #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND // If we have the "real" Ogg reader, use that first. Otherwise // the WavFileReader will likely accept Ogg files (as // libsndfile supports them) but it has no ability to return // file metadata, so we get a slightly less useful result. if (anyReader || OggVorbisFileReader::supports(source)) { reader = new OggVorbisFileReader (source, decodeMode, cacheMode, targetRate, normalised, reporter); if (reader->isOK()) { SVDEBUG << "AudioFileReaderFactory: Ogg file reader is OK, returning it" << endl; return reader; } else { delete reader; } } #endif #endif if (anyReader || WavFileReader::supports(source)) { reader = new WavFileReader(source); sv_samplerate_t fileRate = reader->getSampleRate(); if (reader->isOK() && (!reader->isQuicklySeekable() || normalised || (cacheMode == CodedAudioFileReader::CacheInMemory) || (targetRate != 0 && fileRate != targetRate))) { SVDEBUG << "AudioFileReaderFactory: WAV file reader rate: " << reader->getSampleRate() << ", normalised " << normalised << ", seekable " << reader->isQuicklySeekable() << ", in memory " << (cacheMode == CodedAudioFileReader::CacheInMemory) << ", creating decoding reader" << endl; delete reader; reader = new DecodingWavFileReader (source, decodeMode, cacheMode, targetRate ? targetRate : fileRate, normalised, reporter); } if (reader->isOK()) { SVDEBUG << "AudioFileReaderFactory: WAV file reader is OK, returning it" << endl; return reader; } else { delete reader; } } #ifdef HAVE_MAD if (anyReader || MP3FileReader::supports(source)) { MP3FileReader::GaplessMode gapless = params.gaplessMode == GaplessMode::Gapless ? MP3FileReader::GaplessMode::Gapless : MP3FileReader::GaplessMode::Gappy; reader = new MP3FileReader (source, decodeMode, cacheMode, gapless, targetRate, normalised, reporter); if (reader->isOK()) { SVDEBUG << "AudioFileReaderFactory: MP3 file reader is OK, returning it" << endl; return reader; } else { delete reader; } } #endif #ifdef HAVE_COREAUDIO if (anyReader || CoreAudioFileReader::supports(source)) { reader = new CoreAudioFileReader (source, decodeMode, cacheMode, targetRate, normalised, reporter); if (reader->isOK()) { SVDEBUG << "AudioFileReaderFactory: CoreAudio reader is OK, returning it" << endl; return reader; } else { delete reader; } } #endif } SVCERR << "AudioFileReaderFactory::Failed to create a reader for " << "url \"" << source.getLocation() << "\" (local filename \"" << source.getLocalFilename() << "\", content type \"" << source.getContentType() << "\")" << endl; return nullptr; } sonic-visualiser-3.0.3/svcore/data/fileio/AudioFileReaderFactory.h0000644000000000000000000001123213111512442023301 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef AUDIO_FILE_READER_FACTORY_H #define AUDIO_FILE_READER_FACTORY_H #include #include "FileSource.h" #include "base/BaseTypes.h" class AudioFileReader; class ProgressReporter; class AudioFileReaderFactory { public: /** * Return the file extensions that we have audio file readers for, * in a format suitable for use with QFileDialog. For example, * "*.wav *.aiff *.ogg". */ static QString getKnownExtensions(); enum class Normalisation { /** * Do not normalise file data. */ None, /** * Normalise file data to abs(max) == 1.0. */ Peak }; enum class GaplessMode { /** * Any encoder delay and padding found in file metadata will * be compensated for, giving gapless decoding (assuming the * metadata are correct). This is currently only applicable to * mp3 files: all other supported files are always gapless * where the file metadata provides for it. See documentation * for MP3FileReader::GaplessMode for details of the specific * implementation. */ Gapless, /** * No delay compensation will happen and the results will be * equivalent to the behaviour of audio readers before the * compensation logic was implemented. This is currently only * applicable to mp3 files: all other supported files are * always gapless where the file metadata provides for it. See * documentation for MP3FileReader::GaplessMode for details of * the specific implementation. */ Gappy }; enum class ThreadingMode { /** * Any necessary decoding will happen synchronously when the * reader is created. */ NotThreaded, /** * If the reader supports threaded decoding, it will be used * and the file will be decoded in a background thread. If the * reader does not support threaded decoding, behaviour will * be as for NotThreaded. */ Threaded }; struct Parameters { /** * Sample rate to open the file at. If zero (the default), the * file's native rate will be used. If non-zero, the file will * be automatically resampled to that rate. You can query * reader->getNativeRate() if you want to find out whether the * file needed to be resampled. */ sv_samplerate_t targetRate; /** * Normalisation to use. The default is Normalisation::None. */ Normalisation normalisation; /** * Gapless mode to use. The default is GaplessMode::Gapless. */ GaplessMode gaplessMode; /** * Threading mode. The default is ThreadingMode::NotThreaded. */ ThreadingMode threadingMode; Parameters() : targetRate(0), normalisation(Normalisation::None), gaplessMode(GaplessMode::Gapless), threadingMode(ThreadingMode::NotThreaded) { } }; /** * Return an audio file reader initialised to the file at the * given path, or NULL if no suitable reader for this path is * available or the file cannot be opened. * * If a ProgressReporter is provided, it will be updated with * progress status. This will only be meaningful if decoding is * being carried out in non-threaded mode (either because the * threaded parameter was not supplied or because the specific * file reader used does not support it); in threaded mode, * reported progress will jump straight to 100% before threading * takes over. Caller retains ownership of the reporter object. * * Caller owns the returned object and must delete it after use. */ static AudioFileReader *createReader(FileSource source, Parameters parameters, ProgressReporter *reporter = 0); }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/AudioFileSizeEstimator.cpp0000644000000000000000000000743613111512442023717 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "AudioFileSizeEstimator.h" #include "WavFileReader.h" #include #include "base/Debug.h" sv_frame_t AudioFileSizeEstimator::estimate(FileSource source, sv_samplerate_t targetRate) { sv_frame_t estimate = 0; SVDEBUG << "AudioFileSizeEstimator: Sample count estimate requested for file \"" << source.getLocalFilename() << "\"" << endl; // Most of our file readers don't know the sample count until // after they've finished decoding. This is an exception: WavFileReader *reader = new WavFileReader(source); if (reader->isOK() && reader->getChannelCount() > 0 && reader->getFrameCount() > 0) { sv_frame_t samples = reader->getFrameCount() * reader->getChannelCount(); sv_samplerate_t rate = reader->getSampleRate(); if (targetRate != 0.0 && targetRate != rate) { samples = sv_frame_t(double(samples) * targetRate / rate); } SVDEBUG << "AudioFileSizeEstimator: WAV file reader accepts this file, reports " << samples << " samples" << endl; estimate = samples; } else { SVDEBUG << "AudioFileSizeEstimator: WAV file reader doesn't like this file, " << "estimating from file size and extension instead" << endl; } delete reader; reader = 0; if (estimate == 0) { // The remainder just makes an estimate based on the file size // and extension. We don't even know its sample rate at this // point, so the following is a wild guess. double rateRatio = 1.0; if (targetRate != 0.0) { rateRatio = targetRate / 44100.0; } QString extension = source.getExtension(); source.waitForData(); if (!source.isOK()) return 0; sv_frame_t sz = 0; { QFile f(source.getLocalFilename()); if (f.open(QFile::ReadOnly)) { SVDEBUG << "AudioFileSizeEstimator: opened file, size is " << f.size() << endl; sz = f.size(); f.close(); } } if (extension == "ogg" || extension == "oga" || extension == "m4a" || extension == "mp3" || extension == "wma") { // Usually a lossy file. Compression ratios can vary // dramatically, but don't usually exceed about 20x compared // to 16-bit PCM (e.g. a 128kbps mp3 has 11x ratio over WAV at // 44.1kHz). We can estimate the number of samples to be file // size x 20, divided by 2 as we're comparing with 16-bit PCM. estimate = sv_frame_t(double(sz) * 10 * rateRatio); } if (extension == "flac") { // FLAC usually takes up a bit more than half the space of // 16-bit PCM. So the number of 16-bit samples is roughly the // same as the file size in bytes. As above, let's be // conservative. estimate = sv_frame_t(double(sz) * 1.2 * rateRatio); } SVDEBUG << "AudioFileSizeEstimator: for extension \"" << extension << "\", estimate = " << estimate << " samples" << endl; } return estimate; } sonic-visualiser-3.0.3/svcore/data/fileio/AudioFileSizeEstimator.h0000644000000000000000000000343413111512442023356 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef AUDIO_FILE_SIZE_ESTIMATOR_H #define AUDIO_FILE_SIZE_ESTIMATOR_H #include "base/BaseTypes.h" #include "data/fileio/FileSource.h" /** * Estimate the number of samples in an audio file. For many * compressed files this returns only a very approximate estimate, * based on a rough estimate of compression ratio. Initially we're * only aiming for a conservative estimate for purposes like "will * this file fit in memory?" (and if unsure, say no). */ class AudioFileSizeEstimator { public: /** * Return an estimate of the number of samples (across all * channels) in the given audio file, once it has been decoded and * (if applicable) resampled to the given rate. * * This function is intended to be reasonably fast -- it may open * the file, but it should not do any decoding. (However, if the * file source is remote, it will probably be downloaded in its * entirety before anything can be estimated.) * * The returned value is an estimate, and is deliberately usually * on the high side. If the estimator has no idea at all, this * will return 0. */ static sv_frame_t estimate(FileSource source, sv_samplerate_t targetRate = 0); }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/BZipFileDevice.cpp0000644000000000000000000001571013111512442022111 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "BZipFileDevice.h" #include #include #include "base/Debug.h" // for dup: #ifdef _MSC_VER #include #else #include #endif BZipFileDevice::BZipFileDevice(QString fileName) : m_fileName(fileName), m_qfile(fileName), m_file(0), m_bzFile(0), m_atEnd(true), m_ok(true) { } BZipFileDevice::~BZipFileDevice() { // SVDEBUG << "BZipFileDevice::~BZipFileDevice(" << m_fileName << ")" << endl; if (m_bzFile) close(); } bool BZipFileDevice::isOK() const { return m_ok; } bool BZipFileDevice::open(OpenMode mode) { setErrorString(""); if (m_bzFile) { setErrorString(tr("File is already open")); return false; } if (mode & Append) { setErrorString(tr("Append mode not supported")); m_ok = false; return false; } if ((mode & (ReadOnly | WriteOnly)) == 0) { setErrorString(tr("File access mode not specified")); m_ok = false; return false; } if ((mode & ReadOnly) && (mode & WriteOnly)) { setErrorString(tr("Read and write modes both specified")); m_ok = false; return false; } // This is all going to be a bit silly. // // We open the file with QFile so as not to have to worry about locale // support ourselves (especially on Windows). Then we get a fd from // QFile and "convert" it to a FILE* using fdopen because that is what // the bz2 library needs for reading and writing an already-open file. // // fdopen takes over the fd it is given, and will close it when fclose // is called. (We must call fclose, because it's needed to avoid // leaking the file stream structure.) // // But QFile will also close its fd, either when we call QFile::close // or on destruction -- there doesn't seem to be a way to avoid that // for a file that QFile opened. // // So we have to add an extra dup() in to the fdopen to avoid a double // close. // // Note that bz2 will *not* fclose the FILE* it was passed, so we // don't have a problem with calling both bzWriteClose and fclose. if (mode & WriteOnly) { if (!m_qfile.open(QIODevice::WriteOnly)) { setErrorString(tr("Failed to open file for writing")); m_ok = false; return false; } m_file = fdopen(dup(m_qfile.handle()), "wb"); if (!m_file) { setErrorString(tr("Failed to open file handle for writing")); m_qfile.close(); m_ok = false; return false; } int bzError = BZ_OK; m_bzFile = BZ2_bzWriteOpen(&bzError, m_file, 9, 0, 0); if (!m_bzFile) { fclose(m_file); m_file = 0; m_qfile.close(); setErrorString(tr("Failed to open bzip2 stream for writing")); m_ok = false; return false; } // cerr << "BZipFileDevice: opened \"" << m_fileName << "\" for writing" << endl; setErrorString(QString()); setOpenMode(mode); return true; } if (mode & ReadOnly) { if (!m_qfile.open(QIODevice::ReadOnly)) { setErrorString(tr("Failed to open file for reading")); m_ok = false; return false; } m_file = fdopen(dup(m_qfile.handle()), "rb"); if (!m_file) { setErrorString(tr("Failed to open file handle for reading")); m_ok = false; return false; } int bzError = BZ_OK; m_bzFile = BZ2_bzReadOpen(&bzError, m_file, 0, 0, NULL, 0); if (!m_bzFile) { fclose(m_file); m_file = 0; m_qfile.close(); setErrorString(tr("Failed to open bzip2 stream for reading")); m_ok = false; return false; } // cerr << "BZipFileDevice: opened \"" << m_fileName << "\" for reading" << endl; m_atEnd = false; setErrorString(QString()); setOpenMode(mode); return true; } setErrorString(tr("Internal error (open for neither read nor write)")); m_ok = false; return false; } void BZipFileDevice::close() { if (!m_bzFile) { setErrorString(tr("File not open")); m_ok = false; return; } int bzError = BZ_OK; if (openMode() & WriteOnly) { unsigned int in = 0, out = 0; BZ2_bzWriteClose(&bzError, m_bzFile, 0, &in, &out); // cerr << "Wrote bzip2 stream (in=" << in << ", out=" << out << ")" << endl; if (bzError != BZ_OK) { setErrorString(tr("bzip2 stream write close error")); } fclose(m_file); m_qfile.close(); m_bzFile = 0; m_file = 0; m_ok = false; return; } if (openMode() & ReadOnly) { BZ2_bzReadClose(&bzError, m_bzFile); if (bzError != BZ_OK) { setErrorString(tr("bzip2 stream read close error")); } fclose(m_file); m_qfile.close(); m_bzFile = 0; m_file = 0; m_ok = false; return; } setErrorString(tr("Internal error (close for neither read nor write)")); return; } qint64 BZipFileDevice::readData(char *data, qint64 maxSize) { if (m_atEnd) return 0; int bzError = BZ_OK; int read = BZ2_bzRead(&bzError, m_bzFile, data, int(maxSize)); // SVDEBUG << "BZipFileDevice::readData: requested " << maxSize << ", read " << read << endl; if (bzError != BZ_OK) { if (bzError != BZ_STREAM_END) { cerr << "BZipFileDevice::readData: error condition" << endl; setErrorString(tr("bzip2 stream read error")); m_ok = false; return -1; } else { // SVDEBUG << "BZipFileDevice::readData: reached end of file" << endl; m_atEnd = true; } } return read; } qint64 BZipFileDevice::writeData(const char *data, qint64 maxSize) { int bzError = BZ_OK; BZ2_bzWrite(&bzError, m_bzFile, (void *)data, int(maxSize)); // SVDEBUG << "BZipFileDevice::writeData: " << maxSize << " to write" << endl; if (bzError != BZ_OK) { cerr << "BZipFileDevice::writeData: error condition" << endl; setErrorString("bzip2 stream write error"); m_ok = false; return -1; } // SVDEBUG << "BZipFileDevice::writeData: wrote " << maxSize << endl; return maxSize; } sonic-visualiser-3.0.3/svcore/data/fileio/BZipFileDevice.h0000644000000000000000000000237413111512442021560 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_BZIP_FILE_DEVICE_H #define SV_BZIP_FILE_DEVICE_H #include #include #include class BZipFileDevice : public QIODevice { Q_OBJECT public: BZipFileDevice(QString fileName); virtual ~BZipFileDevice(); virtual bool open(OpenMode mode); virtual void close(); virtual bool isOK() const; virtual bool isSequential() const { return true; } protected: virtual qint64 readData(char *data, qint64 maxSize); virtual qint64 writeData(const char *data, qint64 maxSize); QString m_fileName; QFile m_qfile; FILE *m_file; BZFILE *m_bzFile; bool m_atEnd; bool m_ok; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/CSVFileReader.cpp0000644000000000000000000003706113111512442021706 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "CSVFileReader.h" #include "model/Model.h" #include "base/RealTime.h" #include "base/StringBits.h" #include "model/SparseOneDimensionalModel.h" #include "model/SparseTimeValueModel.h" #include "model/EditableDenseThreeDimensionalModel.h" #include "model/RegionModel.h" #include "model/NoteModel.h" #include "DataFileReaderFactory.h" #include #include #include #include #include #include #include #include using namespace std; CSVFileReader::CSVFileReader(QString path, CSVFormat format, sv_samplerate_t mainModelSampleRate) : m_format(format), m_device(0), m_ownDevice(true), m_warnings(0), m_mainModelSampleRate(mainModelSampleRate) { QFile *file = new QFile(path); bool good = false; if (!file->exists()) { m_error = QFile::tr("File \"%1\" does not exist").arg(path); } else if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) { m_error = QFile::tr("Failed to open file \"%1\"").arg(path); } else { good = true; } if (good) { m_device = file; m_filename = QFileInfo(path).fileName(); } else { delete file; } } CSVFileReader::CSVFileReader(QIODevice *device, CSVFormat format, sv_samplerate_t mainModelSampleRate) : m_format(format), m_device(device), m_ownDevice(false), m_warnings(0), m_mainModelSampleRate(mainModelSampleRate) { } CSVFileReader::~CSVFileReader() { SVDEBUG << "CSVFileReader::~CSVFileReader: device is " << m_device << endl; if (m_device && m_ownDevice) { SVDEBUG << "CSVFileReader::CSVFileReader: Closing device" << endl; m_device->close(); delete m_device; } } bool CSVFileReader::isOK() const { return (m_device != 0); } QString CSVFileReader::getError() const { return m_error; } sv_frame_t CSVFileReader::convertTimeValue(QString s, int lineno, sv_samplerate_t sampleRate, int windowSize) const { QRegExp nonNumericRx("[^0-9eE.,+-]"); int warnLimit = 10; CSVFormat::TimeUnits timeUnits = m_format.getTimeUnits(); sv_frame_t calculatedFrame = 0; bool ok = false; QString numeric = s; numeric.remove(nonNumericRx); if (timeUnits == CSVFormat::TimeSeconds) { double time = numeric.toDouble(&ok); if (!ok) time = StringBits::stringToDoubleLocaleFree(numeric, &ok); calculatedFrame = sv_frame_t(time * sampleRate + 0.5); } else if (timeUnits == CSVFormat::TimeMilliseconds) { double time = numeric.toDouble(&ok); if (!ok) time = StringBits::stringToDoubleLocaleFree(numeric, &ok); calculatedFrame = sv_frame_t((time / 1000.0) * sampleRate + 0.5); } else { long n = numeric.toLong(&ok); if (n >= 0) calculatedFrame = n; if (timeUnits == CSVFormat::TimeWindows) { calculatedFrame *= windowSize; } } if (!ok) { if (m_warnings < warnLimit) { cerr << "WARNING: CSVFileReader::load: " << "Bad time format (\"" << s << "\") in data line " << lineno+1 << endl; } else if (m_warnings == warnLimit) { cerr << "WARNING: Too many warnings" << endl; } ++m_warnings; } return calculatedFrame; } Model * CSVFileReader::load() const { if (!m_device) return 0; CSVFormat::ModelType modelType = m_format.getModelType(); CSVFormat::TimingType timingType = m_format.getTimingType(); CSVFormat::TimeUnits timeUnits = m_format.getTimeUnits(); sv_samplerate_t sampleRate = m_format.getSampleRate(); int windowSize = m_format.getWindowSize(); QChar separator = m_format.getSeparator(); bool allowQuoting = m_format.getAllowQuoting(); if (timingType == CSVFormat::ExplicitTiming) { if (modelType == CSVFormat::ThreeDimensionalModel) { // This will be overridden later if more than one line // appears in our file, but we want to choose a default // that's likely to be visible windowSize = 1024; } else { windowSize = 1; } if (timeUnits == CSVFormat::TimeSeconds || timeUnits == CSVFormat::TimeMilliseconds) { sampleRate = m_mainModelSampleRate; } } SparseOneDimensionalModel *model1 = 0; SparseTimeValueModel *model2 = 0; RegionModel *model2a = 0; NoteModel *model2b = 0; EditableDenseThreeDimensionalModel *model3 = 0; Model *model = 0; QTextStream in(m_device); unsigned int warnings = 0, warnLimit = 10; unsigned int lineno = 0; float min = 0.0, max = 0.0; sv_frame_t frameNo = 0; sv_frame_t duration = 0; sv_frame_t endFrame = 0; bool haveAnyValue = false; bool haveEndTime = false; bool pitchLooksLikeMIDI = true; sv_frame_t startFrame = 0; // for calculation of dense model resolution bool firstEverValue = true; map labelCountMap; int valueColumns = 0; for (int i = 0; i < m_format.getColumnCount(); ++i) { if (m_format.getColumnPurpose(i) == CSVFormat::ColumnValue) { ++valueColumns; } } while (!in.atEnd()) { // QTextStream's readLine doesn't cope with old-style Mac // CR-only line endings. Why did they bother making the class // cope with more than one sort of line ending, if it still // can't be configured to cope with all the common sorts? // For the time being we'll deal with this case (which is // relatively uncommon for us, but still necessary to handle) // by reading the entire file using a single readLine, and // splitting it. For CR and CR/LF line endings this will just // read a line at a time, and that's obviously OK. QString chunk = in.readLine(); QStringList lines = chunk.split('\r', QString::SkipEmptyParts); for (int li = 0; li < lines.size(); ++li) { QString line = lines[li]; if (line.startsWith("#")) continue; QStringList list = StringBits::split(line, separator, allowQuoting); if (!model) { switch (modelType) { case CSVFormat::OneDimensionalModel: model1 = new SparseOneDimensionalModel(sampleRate, windowSize); model = model1; break; case CSVFormat::TwoDimensionalModel: model2 = new SparseTimeValueModel(sampleRate, windowSize, false); model = model2; break; case CSVFormat::TwoDimensionalModelWithDuration: model2a = new RegionModel(sampleRate, windowSize, false); model = model2a; break; case CSVFormat::TwoDimensionalModelWithDurationAndPitch: model2b = new NoteModel(sampleRate, windowSize, false); model = model2b; break; case CSVFormat::ThreeDimensionalModel: model3 = new EditableDenseThreeDimensionalModel (sampleRate, windowSize, valueColumns, EditableDenseThreeDimensionalModel::NoCompression); model = model3; break; } if (model) { if (m_filename != "") { model->setObjectName(m_filename); } } } float value = 0.f; float pitch = 0.f; QString label = ""; duration = 0.f; haveEndTime = false; for (int i = 0; i < list.size(); ++i) { QString s = list[i]; CSVFormat::ColumnPurpose purpose = m_format.getColumnPurpose(i); switch (purpose) { case CSVFormat::ColumnUnknown: break; case CSVFormat::ColumnStartTime: frameNo = convertTimeValue(s, lineno, sampleRate, windowSize); break; case CSVFormat::ColumnEndTime: endFrame = convertTimeValue(s, lineno, sampleRate, windowSize); haveEndTime = true; break; case CSVFormat::ColumnDuration: duration = convertTimeValue(s, lineno, sampleRate, windowSize); break; case CSVFormat::ColumnValue: value = s.toFloat(); haveAnyValue = true; break; case CSVFormat::ColumnPitch: pitch = s.toFloat(); if (pitch < 0.f || pitch > 127.f) { pitchLooksLikeMIDI = false; } break; case CSVFormat::ColumnLabel: label = s; break; } } ++labelCountMap[label]; if (haveEndTime) { // ... calculate duration now all cols read if (endFrame > frameNo) { duration = endFrame - frameNo; } } if (modelType == CSVFormat::OneDimensionalModel) { SparseOneDimensionalModel::Point point(frameNo, label); model1->addPoint(point); } else if (modelType == CSVFormat::TwoDimensionalModel) { SparseTimeValueModel::Point point(frameNo, value, label); model2->addPoint(point); } else if (modelType == CSVFormat::TwoDimensionalModelWithDuration) { RegionModel::Point point(frameNo, value, duration, label); model2a->addPoint(point); } else if (modelType == CSVFormat::TwoDimensionalModelWithDurationAndPitch) { float level = ((value >= 0.f && value <= 1.f) ? value : 1.f); NoteModel::Point point(frameNo, pitch, duration, level, label); model2b->addPoint(point); } else if (modelType == CSVFormat::ThreeDimensionalModel) { DenseThreeDimensionalModel::Column values; for (int i = 0; i < list.size(); ++i) { if (m_format.getColumnPurpose(i) != CSVFormat::ColumnValue) { continue; } bool ok = false; float value = list[i].toFloat(&ok); values.push_back(value); if (firstEverValue || value < min) min = value; if (firstEverValue || value > max) max = value; if (firstEverValue) { startFrame = frameNo; model3->setStartFrame(startFrame); } else if (lineno == 1 && timingType == CSVFormat::ExplicitTiming) { model3->setResolution(int(frameNo - startFrame)); } firstEverValue = false; if (!ok) { if (warnings < warnLimit) { cerr << "WARNING: CSVFileReader::load: " << "Non-numeric value \"" << list[i] << "\" in data line " << lineno+1 << ":" << endl; cerr << line << endl; ++warnings; } else if (warnings == warnLimit) { // cerr << "WARNING: Too many warnings" << endl; } } } // SVDEBUG << "Setting bin values for count " << lineno << ", frame " // << frameNo << ", time " << RealTime::frame2RealTime(frameNo, sampleRate) << endl; model3->setColumn(lineno, values); } ++lineno; if (timingType == CSVFormat::ImplicitTiming || list.size() == 0) { frameNo += windowSize; } } } if (!haveAnyValue) { if (model2a) { // assign values for regions based on label frequency; we // have this in our labelCountMap, sort of map > countLabelValueMap; for (map::iterator i = labelCountMap.begin(); i != labelCountMap.end(); ++i) { countLabelValueMap[i->second][i->first] = -1.f; } float v = 0.f; for (map >::iterator i = countLabelValueMap.end(); i != countLabelValueMap.begin(); ) { --i; cerr << "count -> " << i->first << endl; for (map::iterator j = i->second.begin(); j != i->second.end(); ++j) { j->second = v; cerr << "label -> " << j->first << ", value " << v << endl; v = v + 1.f; } } map pointMap; for (RegionModel::PointList::const_iterator i = model2a->getPoints().begin(); i != model2a->getPoints().end(); ++i) { RegionModel::Point p(*i); int count = labelCountMap[p.label]; v = countLabelValueMap[count][p.label]; cerr << "mapping from label \"" << p.label << "\" (count " << count << ") to value " << v << endl; RegionModel::Point pp(p.frame, v, p.duration, p.label); pointMap[p] = pp; } for (map::iterator i = pointMap.begin(); i != pointMap.end(); ++i) { // There could be duplicate regions; if so replace // them all -- but we need to check we're not // replacing a region by itself (or else this will // never terminate) if (i->first.value == i->second.value) { continue; } while (model2a->containsPoint(i->first)) { model2a->deletePoint(i->first); model2a->addPoint(i->second); } } } } if (model2b) { if (pitchLooksLikeMIDI) { model2b->setScaleUnits("MIDI Pitch"); } else { model2b->setScaleUnits("Hz"); } } if (model3) { model3->setMinimumLevel(min); model3->setMaximumLevel(max); } return model; } sonic-visualiser-3.0.3/svcore/data/fileio/CSVFileReader.h0000644000000000000000000000354413111512442021352 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_CSV_FILE_READER_H #define SV_CSV_FILE_READER_H #include "DataFileReader.h" #include "CSVFormat.h" #include "base/BaseTypes.h" #include #include #include class QFile; class CSVFileReader : public DataFileReader { public: /** * Construct a CSVFileReader to read the CSV file at the given * path, with the given format. */ CSVFileReader(QString path, CSVFormat format, sv_samplerate_t mainModelSampleRate); /** * Construct a CSVFileReader to read from the given * QIODevice. Caller retains ownership of the QIODevice: the * CSVFileReader will not close or delete it and it must outlive * the CSVFileReader. */ CSVFileReader(QIODevice *device, CSVFormat format, sv_samplerate_t mainModelSampleRate); virtual ~CSVFileReader(); virtual bool isOK() const; virtual QString getError() const; virtual Model *load() const; protected: CSVFormat m_format; QIODevice *m_device; bool m_ownDevice; QString m_filename; QString m_error; mutable int m_warnings; sv_samplerate_t m_mainModelSampleRate; sv_frame_t convertTimeValue(QString, int lineno, sv_samplerate_t sampleRate, int windowSize) const; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/CSVFileWriter.cpp0000644000000000000000000000553013111512442021754 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "CSVFileWriter.h" #include "model/Model.h" #include "model/SparseOneDimensionalModel.h" #include "model/SparseTimeValueModel.h" #include "model/NoteModel.h" #include "model/TextModel.h" #include "base/TempWriteFile.h" #include "base/Exceptions.h" #include "base/Selection.h" #include #include CSVFileWriter::CSVFileWriter(QString path, Model *model, QString delimiter, DataExportOptions options) : m_path(path), m_model(model), m_error(""), m_delimiter(delimiter), m_options(options) { } CSVFileWriter::~CSVFileWriter() { } bool CSVFileWriter::isOK() const { return m_error == ""; } QString CSVFileWriter::getError() const { return m_error; } void CSVFileWriter::write() { try { TempWriteFile temp(m_path); QFile file(temp.getTemporaryFilename()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { m_error = tr("Failed to open file %1 for writing") .arg(temp.getTemporaryFilename()); return; } QTextStream out(&file); out << m_model->toDelimitedDataStringWithOptions (m_delimiter, m_options); file.close(); temp.moveToTarget(); } catch (FileOperationFailed &f) { m_error = f.what(); } } void CSVFileWriter::writeSelection(MultiSelection *selection) { try { TempWriteFile temp(m_path); QFile file(temp.getTemporaryFilename()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { m_error = tr("Failed to open file %1 for writing") .arg(temp.getTemporaryFilename()); return; } QTextStream out(&file); for (MultiSelection::SelectionList::iterator i = selection->getSelections().begin(); i != selection->getSelections().end(); ++i) { sv_frame_t f0(i->getStartFrame()), f1(i->getEndFrame()); out << m_model->toDelimitedDataStringSubsetWithOptions (m_delimiter, m_options, f0, f1); } file.close(); temp.moveToTarget(); } catch (FileOperationFailed &f) { m_error = f.what(); } } sonic-visualiser-3.0.3/svcore/data/fileio/CSVFileWriter.h0000644000000000000000000000247713111512442021430 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _CSV_FILE_WRITER_H_ #define _CSV_FILE_WRITER_H_ #include #include #include "base/DataExportOptions.h" class Model; class MultiSelection; class CSVFileWriter : public QObject { Q_OBJECT public: CSVFileWriter(QString path, Model *model, QString delimiter = ",", DataExportOptions options = DataExportDefaults); virtual ~CSVFileWriter(); virtual bool isOK() const; virtual QString getError() const; virtual void write(); virtual void writeSelection(MultiSelection *selection); protected: QString m_path; Model *m_model; QString m_error; QString m_delimiter; DataExportOptions m_options; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/CSVFormat.cpp0000644000000000000000000002344013111512442021130 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "CSVFormat.h" #include "base/StringBits.h" #include #include #include #include #include #include #include "base/Debug.h" CSVFormat::CSVFormat(QString path) : m_separator(""), m_sampleRate(44100), m_windowSize(1024), m_allowQuoting(true) { guessFormatFor(path); } void CSVFormat::guessFormatFor(QString path) { m_modelType = TwoDimensionalModel; m_timingType = ExplicitTiming; m_timeUnits = TimeSeconds; m_maxExampleCols = 0; m_columnCount = 0; m_variableColumnCount = false; m_example.clear(); m_columnQualities.clear(); m_columnPurposes.clear(); m_prevValues.clear(); QFile file(path); if (!file.exists()) return; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&file); in.seek(0); int lineno = 0; while (!in.atEnd()) { // See comment about line endings in CSVFileReader::load() QString chunk = in.readLine(); QStringList lines = chunk.split('\r', QString::SkipEmptyParts); for (int li = 0; li < lines.size(); ++li) { QString line = lines[li]; if (line.startsWith("#") || line == "") continue; guessQualities(line, lineno); ++lineno; } if (lineno >= 50) break; } guessPurposes(); } void CSVFormat::guessSeparator(QString line) { char candidates[] = { ',', '\t', ' ', '|', '/', ':' }; for (int i = 0; i < int(sizeof(candidates)/sizeof(candidates[0])); ++i) { if (StringBits::split(line, candidates[i], m_allowQuoting).size() >= 2) { m_separator = candidates[i]; return; } } } void CSVFormat::guessQualities(QString line, int lineno) { if (m_separator == "") guessSeparator(line); QStringList list = StringBits::split(line, getSeparator(), m_allowQuoting); int cols = list.size(); if (lineno == 0 || (cols > m_columnCount)) m_columnCount = cols; if (cols != m_columnCount) m_variableColumnCount = true; // All columns are regarded as having these qualities until we see // something that indicates otherwise: ColumnQualities defaultQualities = ColumnNumeric | ColumnIntegral | ColumnIncreasing | ColumnNearEmpty; for (int i = 0; i < cols; ++i) { while (m_columnQualities.size() <= i) { m_columnQualities.push_back(defaultQualities); m_prevValues.push_back(0.f); } QString s(list[i]); bool ok = false; ColumnQualities qualities = m_columnQualities[i]; bool numeric = (qualities & ColumnNumeric); bool integral = (qualities & ColumnIntegral); bool increasing = (qualities & ColumnIncreasing); bool large = (qualities & ColumnLarge); // this one defaults to off bool emptyish = (qualities & ColumnNearEmpty); if (lineno > 1 && s.trimmed() != "") { emptyish = false; } float value = 0.f; //!!! how to take into account headers? if (numeric) { value = s.toFloat(&ok); if (!ok) { value = (float)StringBits::stringToDoubleLocaleFree(s, &ok); } if (ok) { if (lineno < 2 && value > 1000.f) large = true; } else { numeric = false; } } if (numeric) { if (integral) { if (s.contains('.') || s.contains(',')) { integral = false; } } if (increasing) { if (lineno > 0 && value <= m_prevValues[i]) { increasing = false; } } m_prevValues[i] = value; } m_columnQualities[i] = (numeric ? ColumnNumeric : 0) | (integral ? ColumnIntegral : 0) | (increasing ? ColumnIncreasing : 0) | (large ? ColumnLarge : 0) | (emptyish ? ColumnNearEmpty : 0); } if (lineno < 10) { m_example.push_back(list); if (lineno == 0 || cols > m_maxExampleCols) { m_maxExampleCols = cols; } } if (lineno < 10) { SVDEBUG << "Estimated column qualities for line " << lineno << " (reporting up to first 10): "; for (int i = 0; i < m_columnCount; ++i) { SVDEBUG << int(m_columnQualities[i]) << " "; } SVDEBUG << endl; } } void CSVFormat::guessPurposes() { m_timingType = CSVFormat::ImplicitTiming; m_timeUnits = CSVFormat::TimeWindows; int timingColumnCount = 0; // if our first column has zero or one entries in it and the rest // have more, then we'll default to ignoring the first column and // counting the next one as primary. (e.g. Sonic Annotator output // with filename at start of first column.) int primaryColumnNo = 0; if (m_columnCount >= 2) { if ( (m_columnQualities[0] & ColumnNearEmpty) && !(m_columnQualities[1] & ColumnNearEmpty)) { primaryColumnNo = 1; } } for (int i = 0; i < m_columnCount; ++i) { ColumnPurpose purpose = ColumnUnknown; if (i < primaryColumnNo) { setColumnPurpose(i, purpose); continue; } bool primary = (i == primaryColumnNo); ColumnQualities qualities = m_columnQualities[i]; bool numeric = (qualities & ColumnNumeric); bool integral = (qualities & ColumnIntegral); bool increasing = (qualities & ColumnIncreasing); bool large = (qualities & ColumnLarge); bool timingColumn = (numeric && increasing); if (timingColumn) { ++timingColumnCount; if (primary) { purpose = ColumnStartTime; m_timingType = ExplicitTiming; if (integral && large) { m_timeUnits = TimeAudioFrames; } else { m_timeUnits = TimeSeconds; } } else { if (timingColumnCount == 2 && m_timingType == ExplicitTiming) { purpose = ColumnEndTime; } } } if (purpose == ColumnUnknown) { if (numeric) { purpose = ColumnValue; } else { purpose = ColumnLabel; } } setColumnPurpose(i, purpose); } int valueCount = 0; for (int i = 0; i < m_columnCount; ++i) { if (m_columnPurposes[i] == ColumnValue) ++valueCount; } if (valueCount == 2 && timingColumnCount == 1) { // If we have exactly two apparent value columns and only one // timing column, but one value column is integral and the // other is not, guess that whichever one matches the integral // status of the time column is either duration or end time if (m_timingType == ExplicitTiming) { int a = -1, b = -1; for (int i = 0; i < m_columnCount; ++i) { if (m_columnPurposes[i] == ColumnValue) { if (a == -1) a = i; else b = i; } } if ((m_columnQualities[a] & ColumnIntegral) != (m_columnQualities[b] & ColumnIntegral)) { int timecol = a; if ((m_columnQualities[a] & ColumnIntegral) != (m_columnQualities[0] & ColumnIntegral)) { timecol = b; } if (m_columnQualities[timecol] & ColumnIncreasing) { // This shouldn't happen; should have been settled above m_columnPurposes[timecol] = ColumnEndTime; } else { m_columnPurposes[timecol] = ColumnDuration; } --valueCount; } } } if (timingColumnCount > 1) { m_modelType = TwoDimensionalModelWithDuration; } else { if (valueCount == 0) { m_modelType = OneDimensionalModel; } else if (valueCount == 1) { m_modelType = TwoDimensionalModel; } else { m_modelType = ThreeDimensionalModel; } } SVDEBUG << "Estimated column purposes: "; for (int i = 0; i < m_columnCount; ++i) { SVDEBUG << int(m_columnPurposes[i]) << " "; } SVDEBUG << endl; SVDEBUG << "Estimated model type: " << m_modelType << endl; SVDEBUG << "Estimated timing type: " << m_timingType << endl; SVDEBUG << "Estimated units: " << m_timeUnits << endl; } CSVFormat::ColumnPurpose CSVFormat::getColumnPurpose(int i) { while (m_columnPurposes.size() <= i) { m_columnPurposes.push_back(ColumnUnknown); } return m_columnPurposes[i]; } CSVFormat::ColumnPurpose CSVFormat::getColumnPurpose(int i) const { if (m_columnPurposes.size() <= i) { return ColumnUnknown; } return m_columnPurposes[i]; } void CSVFormat::setColumnPurpose(int i, ColumnPurpose p) { while (m_columnPurposes.size() <= i) { m_columnPurposes.push_back(ColumnUnknown); } m_columnPurposes[i] = p; } sonic-visualiser-3.0.3/svcore/data/fileio/CSVFormat.h0000644000000000000000000001125113111512442020572 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_CSV_FORMAT_H #define SV_CSV_FORMAT_H #include #include #include "base/BaseTypes.h" class CSVFormat { public: enum ModelType { OneDimensionalModel, TwoDimensionalModel, TwoDimensionalModelWithDuration, TwoDimensionalModelWithDurationAndPitch, ThreeDimensionalModel }; enum TimingType { ExplicitTiming, ImplicitTiming }; enum TimeUnits { TimeSeconds, TimeMilliseconds, TimeAudioFrames, TimeWindows, }; enum ColumnPurpose { ColumnUnknown, ColumnStartTime, ColumnEndTime, ColumnDuration, ColumnValue, ColumnPitch, ColumnLabel }; enum ColumnQuality { ColumnNumeric = 1, ColumnIntegral = 2, ColumnIncreasing = 4, ColumnLarge = 8, ColumnNearEmpty = 16, }; typedef unsigned int ColumnQualities; CSVFormat() : // arbitrary defaults m_modelType(TwoDimensionalModel), m_timingType(ExplicitTiming), m_timeUnits(TimeSeconds), m_separator(","), m_sampleRate(44100), m_windowSize(1024), m_columnCount(0), m_variableColumnCount(false), m_allowQuoting(true), m_maxExampleCols(0) { } CSVFormat(QString path); // guess format /** * Guess the format of the given CSV file, setting the fields in * this object accordingly. If the current separator is the empty * string, the separator character will also be guessed; otherwise * the current separator will be used. The other properties of * this object will be set according to guesses from the file. */ void guessFormatFor(QString path); ModelType getModelType() const { return m_modelType; } TimingType getTimingType() const { return m_timingType; } TimeUnits getTimeUnits() const { return m_timeUnits; } sv_samplerate_t getSampleRate() const { return m_sampleRate; } int getWindowSize() const { return m_windowSize; } int getColumnCount() const { return m_columnCount; } bool getAllowQuoting() const { return m_allowQuoting; } QChar getSeparator() const { if (m_separator == "") return ' '; else return m_separator[0]; } void setModelType(ModelType t) { m_modelType = t; } void setTimingType(TimingType t) { m_timingType = t; } void setTimeUnits(TimeUnits t) { m_timeUnits = t; } void setSeparator(QChar s) { m_separator = s; } void setSampleRate(sv_samplerate_t r) { m_sampleRate = r; } void setWindowSize(int s) { m_windowSize = s; } void setColumnCount(int c) { m_columnCount = c; } void setAllowQuoting(bool q) { m_allowQuoting = q; } QList getColumnPurposes() const { return m_columnPurposes; } void setColumnPurposes(QList cl) { m_columnPurposes = cl; } ColumnPurpose getColumnPurpose(int i); ColumnPurpose getColumnPurpose(int i) const; void setColumnPurpose(int i, ColumnPurpose p); // read-only; only valid if format has been guessed: QList getColumnQualities() const { return m_columnQualities; } // read-only; only valid if format has been guessed: QList getExample() const { return m_example; } int getMaxExampleCols() const { return m_maxExampleCols; } protected: ModelType m_modelType; TimingType m_timingType; TimeUnits m_timeUnits; QString m_separator; sv_samplerate_t m_sampleRate; int m_windowSize; int m_columnCount; bool m_variableColumnCount; QList m_columnQualities; QList m_columnPurposes; QList m_prevValues; bool m_allowQuoting; QList m_example; int m_maxExampleCols; void guessSeparator(QString line); void guessQualities(QString line, int lineno); void guessPurposes(); void guessFormatFor_Old(QString path); }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/CachedFile.cpp0000644000000000000000000001754613111512442021305 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "CachedFile.h" #include "base/TempDirectory.h" #include "base/ProgressReporter.h" #include "base/Exceptions.h" #include "FileSource.h" #include #include #include #include #include #include #include "base/Profiler.h" #include CachedFile::OriginLocalFilenameMap CachedFile::m_knownGoodCaches; QString CachedFile::getLocalFilenameFor(QUrl url) { Profiler p("CachedFile::getLocalFilenameFor"); QDir dir(getCacheDirectory()); QString filename = QString::fromLocal8Bit (QCryptographicHash::hash(url.toString().toLocal8Bit(), QCryptographicHash::Sha1).toHex()); return dir.filePath(filename); } QString CachedFile::getCacheDirectory() { QDir dir = TempDirectory::getInstance()->getContainingPath(); QString cacheDirName("cache"); QFileInfo fi(dir.filePath(cacheDirName)); if ((fi.exists() && !fi.isDir()) || (!fi.exists() && !dir.mkdir(cacheDirName))) { throw DirectoryCreationFailed(fi.filePath()); } return fi.filePath(); } CachedFile::CachedFile(QString origin, ProgressReporter *reporter, QString preferredContentType) : m_origin(origin), m_preferredContentType(preferredContentType), m_reporter(reporter), m_ok(false) { Profiler p("CachedFile::CachedFile[1]"); SVDEBUG << "CachedFile::CachedFile: origin is \"" << origin << "\"" << endl; checkFile(); } CachedFile::CachedFile(QUrl url, ProgressReporter *reporter, QString preferredContentType) : m_origin(url.toString()), m_preferredContentType(preferredContentType), m_reporter(reporter), m_ok(false) { Profiler p("CachedFile::CachedFile[2]"); SVDEBUG << "CachedFile::CachedFile: url is \"" << url.toString() << "\"" << endl; checkFile(); } CachedFile::~CachedFile() { } bool CachedFile::isOK() const { return m_ok; } QString CachedFile::getLocalFilename() const { return m_localFilename; } void CachedFile::checkFile() { //!!! n.b. obvious race condition here if different CachedFile // objects for same url used in more than one thread -- need to // lock appropriately. also consider race condition between // separate instances of the program! OriginLocalFilenameMap::const_iterator i = m_knownGoodCaches.find(m_origin); if (i != m_knownGoodCaches.end()) { m_ok = true; m_localFilename = i->second; return; } m_localFilename = getLocalFilenameFor(m_origin); if (!QFileInfo(m_localFilename).exists()) { SVDEBUG << "CachedFile::check: Local file does not exist, making a note that it hasn't been retrieved" << endl; updateLastRetrieval(false); // empirically! } QDateTime lastRetrieval = getLastRetrieval(); if (lastRetrieval.isValid()) { SVDEBUG << "CachedFile::check: Valid last retrieval at " << lastRetrieval.toString() << endl; // this will not be the case if the file is missing, after // updateLastRetrieval(false) was called above m_ok = true; if (lastRetrieval.addDays(2) < QDateTime::currentDateTime()) { //!!! SVDEBUG << "CachedFile::check: Out of date; trying to retrieve again" << endl; // doesn't matter if retrieval fails -- we just don't // update the last retrieval time //!!! but we do want an additional last-attempted // timestamp so as to ensure we aren't retrying the // retrieval every single time if it isn't working if (retrieve()) { SVDEBUG << "CachedFile::check: Retrieval succeeded" << endl; updateLastRetrieval(true); } else { cerr << "CachedFile::check: Retrieval failed, will try again later (using existing file for now)" << endl; } } } else { SVDEBUG << "CachedFile::check: No valid last retrieval" << endl; // there is no acceptable file if (retrieve()) { SVDEBUG << "CachedFile::check: Retrieval succeeded" << endl; m_ok = true; updateLastRetrieval(true); } else { cerr << "CachedFile::check: Retrieval failed, remaining in invalid state" << endl; // again, we don't need to do anything here -- the last // retrieval timestamp is already invalid } } if (m_ok) { m_knownGoodCaches[m_origin] = m_localFilename; } } bool CachedFile::retrieve() { //!!! need to work by retrieving the file to another name, and //!!! then "atomically" moving it to its proper place (I'm not //!!! sure we can do an atomic move to replace an existing file //!!! using Qt classes, but a plain delete then copy is probably //!!! good enough) FileSource fs(m_origin, m_reporter, m_preferredContentType); if (!fs.isOK() || !fs.isAvailable()) { SVDEBUG << "CachedFile::retrieve: ERROR: FileSource reported unavailable or failure" << endl; return false; } fs.waitForData(); if (!fs.isOK()) { SVDEBUG << "CachedFile::retrieve: ERROR: FileSource reported failure during receive" << endl; return false; } QString tempName = fs.getLocalFilename(); QFile tempFile(tempName); if (!tempFile.exists()) { SVDEBUG << "CachedFile::retrieve: ERROR: FileSource reported success, but local temporary file \"" << tempName << "\" does not exist" << endl; return false; } QFile previous(m_localFilename); if (previous.exists()) { if (!previous.remove()) { cerr << "CachedFile::retrieve: ERROR: Failed to remove previous copy of cached file at \"" << m_localFilename << "\"" << endl; return false; } } //!!! This is not ideal, could leave us with nothing (old file //!!! removed, new file not able to be copied in because e.g. no //!!! disk space left) if (!tempFile.copy(m_localFilename)) { cerr << "CachedFile::retrieve: ERROR: Failed to copy newly retrieved file from \"" << tempName << "\" to \"" << m_localFilename << "\"" << endl; return false; } SVDEBUG << "CachedFile::retrieve: Successfully copied newly retrieved file \"" << tempName << "\" to its home at \"" << m_localFilename << "\"" << endl; return true; } QDateTime CachedFile::getLastRetrieval() { QSettings settings; settings.beginGroup("FileCache"); QString key("last-retrieval-times"); QMap timeMap = settings.value(key).toMap(); QDateTime lastTime = timeMap[m_localFilename].toDateTime(); settings.endGroup(); return lastTime; } void CachedFile::updateLastRetrieval(bool successful) { //!!! note !successful does not mean "we failed to update the //!!! file" (and so it remains the same as before); it means "the //!!! file is not there at all" QSettings settings; settings.beginGroup("FileCache"); QString key("last-retrieval-times"); QMap timeMap = settings.value(key).toMap(); QDateTime dt; if (successful) dt = QDateTime::currentDateTime(); timeMap[m_localFilename] = dt; settings.setValue(key, timeMap); settings.endGroup(); } sonic-visualiser-3.0.3/svcore/data/fileio/CachedFile.h0000644000000000000000000000311013111512442020730 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _CACHED_FILE_H_ #define _CACHED_FILE_H_ #include #include #include #include class ProgressReporter; class CachedFile { public: CachedFile(QString fileOrUrl, ProgressReporter *reporter = 0, QString preferredContentType = ""); CachedFile(QUrl url, ProgressReporter *reporter = 0, QString preferredContentType = ""); virtual ~CachedFile(); bool isOK() const; QString getLocalFilename() const; protected: QString m_origin; QString m_localFilename; QString m_preferredContentType; ProgressReporter *m_reporter; bool m_ok; void checkFile(); bool retrieve(); QDateTime getLastRetrieval(); void updateLastRetrieval(bool successful); static QString getCacheDirectory(); static QString getLocalFilenameFor(QUrl url); typedef std::map OriginLocalFilenameMap; static OriginLocalFilenameMap m_knownGoodCaches; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/CodedAudioFileReader.cpp0000644000000000000000000004571313111512442023256 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "CodedAudioFileReader.h" #include "WavFileReader.h" #include "base/TempDirectory.h" #include "base/Exceptions.h" #include "base/Profiler.h" #include "base/Serialiser.h" #include "base/StorageAdviser.h" #include #include #include #include #include using namespace std; CodedAudioFileReader::CodedAudioFileReader(CacheMode cacheMode, sv_samplerate_t targetRate, bool normalised) : m_cacheMode(cacheMode), m_initialised(false), m_serialiser(0), m_fileRate(0), m_cacheFileWritePtr(0), m_cacheFileReader(0), m_cacheWriteBuffer(0), m_cacheWriteBufferIndex(0), m_cacheWriteBufferFrames(65536), m_resampler(0), m_resampleBuffer(0), m_resampleBufferFrames(0), m_fileFrameCount(0), m_normalised(normalised), m_max(0.f), m_gain(1.f), m_trimFromStart(0), m_trimFromEnd(0), m_clippedCount(0), m_firstNonzero(0), m_lastNonzero(0) { SVDEBUG << "CodedAudioFileReader:: cache mode: " << cacheMode << " (" << (cacheMode == CacheInTemporaryFile ? "CacheInTemporaryFile" : "CacheInMemory") << ")" << ", rate: " << targetRate << (targetRate == 0 ? " (use source rate)" : "") << ", normalised: " << normalised << endl; m_frameCount = 0; m_sampleRate = targetRate; } CodedAudioFileReader::~CodedAudioFileReader() { QMutexLocker locker(&m_cacheMutex); if (m_serialiser) endSerialised(); if (m_cacheFileWritePtr) sf_close(m_cacheFileWritePtr); SVDEBUG << "CodedAudioFileReader::~CodedAudioFileReader: deleting cache file reader" << endl; delete m_cacheFileReader; delete[] m_cacheWriteBuffer; if (m_cacheFileName != "") { SVDEBUG << "CodedAudioFileReader::~CodedAudioFileReader: deleting cache file " << m_cacheFileName << endl; if (!QFile(m_cacheFileName).remove()) { SVDEBUG << "WARNING: CodedAudioFileReader::~CodedAudioFileReader: Failed to delete cache file \"" << m_cacheFileName << "\"" << endl; } } delete m_resampler; delete[] m_resampleBuffer; if (!m_data.empty()) { StorageAdviser::notifyDoneAllocation (StorageAdviser::MemoryAllocation, (m_data.size() * sizeof(float)) / 1024); } } void CodedAudioFileReader::setFramesToTrim(sv_frame_t fromStart, sv_frame_t fromEnd) { m_trimFromStart = fromStart; m_trimFromEnd = fromEnd; } void CodedAudioFileReader::startSerialised(QString id) { SVDEBUG << "CodedAudioFileReader(" << this << ")::startSerialised: id = " << id << endl; delete m_serialiser; m_serialiser = new Serialiser(id); } void CodedAudioFileReader::endSerialised() { SVDEBUG << "CodedAudioFileReader(" << this << ")::endSerialised: id = " << (m_serialiser ? m_serialiser->getId() : "(none)") << endl; delete m_serialiser; m_serialiser = 0; } void CodedAudioFileReader::initialiseDecodeCache() { QMutexLocker locker(&m_cacheMutex); SVDEBUG << "CodedAudioFileReader::initialiseDecodeCache: file rate = " << m_fileRate << endl; if (m_channelCount == 0) { SVCERR << "CodedAudioFileReader::initialiseDecodeCache: No channel count set!" << endl; throw std::logic_error("No channel count set"); } if (m_fileRate == 0) { SVDEBUG << "CodedAudioFileReader::initialiseDecodeCache: ERROR: File sample rate unknown (bug in subclass implementation?)" << endl; throw FileOperationFailed("(coded file)", "sample rate unknown (bug in subclass implementation?)"); } if (m_sampleRate == 0) { m_sampleRate = m_fileRate; SVDEBUG << "CodedAudioFileReader::initialiseDecodeCache: rate (from file) = " << m_fileRate << endl; } if (m_fileRate != m_sampleRate) { SVDEBUG << "CodedAudioFileReader: resampling " << m_fileRate << " -> " << m_sampleRate << endl; breakfastquay::Resampler::Parameters params; params.quality = breakfastquay::Resampler::FastestTolerable; params.maxBufferSize = int(m_cacheWriteBufferFrames); params.initialSampleRate = m_fileRate; m_resampler = new breakfastquay::Resampler(params, m_channelCount); double ratio = m_sampleRate / m_fileRate; m_resampleBufferFrames = int(ceil(double(m_cacheWriteBufferFrames) * ratio + 1)); m_resampleBuffer = new float[m_resampleBufferFrames * m_channelCount]; } m_cacheWriteBuffer = new float[m_cacheWriteBufferFrames * m_channelCount]; m_cacheWriteBufferIndex = 0; if (m_cacheMode == CacheInTemporaryFile) { try { QDir dir(TempDirectory::getInstance()->getPath()); m_cacheFileName = dir.filePath(QString("decoded_%1.w64") .arg((intptr_t)this)); SF_INFO fileInfo; int fileRate = int(round(m_sampleRate)); if (m_sampleRate != sv_samplerate_t(fileRate)) { SVDEBUG << "CodedAudioFileReader: WARNING: Non-integer sample rate " << m_sampleRate << " presented for writing, rounding to " << fileRate << endl; } fileInfo.samplerate = fileRate; fileInfo.channels = m_channelCount; // Previously we were writing SF_FORMAT_PCM_16 and in a // comment I wrote: "No point in writing 24-bit or float; // generally this class is used for decoding files that // have come from a 16 bit source or that decode to only // 16 bits anyway." That was naive -- we want to preserve // the original values to the same float precision that we // use internally. Saving PCM_16 obviously doesn't // preserve values for sources at bit depths greater than // 16, but it also doesn't always do so for sources at bit // depths less than 16. // // (This came to light with a bug in libsndfile 1.0.26, // which always reports every file as non-seekable, so // that coded readers were being used even for WAV // files. This changed the values that came from PCM_8 WAV // sources, breaking Sonic Annotator's output comparison // tests.) // // So: now we write floats. fileInfo.format = SF_FORMAT_W64 | SF_FORMAT_FLOAT; #ifdef Q_OS_WIN m_cacheFileWritePtr = sf_wchar_open ((LPCWSTR)m_cacheFileName.utf16(), SFM_WRITE, &fileInfo); #else m_cacheFileWritePtr = sf_open (m_cacheFileName.toLocal8Bit(), SFM_WRITE, &fileInfo); #endif if (m_cacheFileWritePtr) { // Ideally we would do this now only if we were in a // threaded mode -- creating the reader later if we're // not threaded -- but we don't have access to that // information here m_cacheFileReader = new WavFileReader(m_cacheFileName); if (!m_cacheFileReader->isOK()) { SVDEBUG << "ERROR: CodedAudioFileReader::initialiseDecodeCache: Failed to construct WAV file reader for temporary file: " << m_cacheFileReader->getError() << endl; delete m_cacheFileReader; m_cacheFileReader = 0; m_cacheMode = CacheInMemory; sf_close(m_cacheFileWritePtr); } } else { SVDEBUG << "CodedAudioFileReader::initialiseDecodeCache: failed to open cache file \"" << m_cacheFileName << "\" (" << m_channelCount << " channels, sample rate " << m_sampleRate << " for writing, falling back to in-memory cache" << endl; m_cacheMode = CacheInMemory; } } catch (DirectoryCreationFailed f) { SVDEBUG << "CodedAudioFileReader::initialiseDecodeCache: failed to create temporary directory! Falling back to in-memory cache" << endl; m_cacheMode = CacheInMemory; } } if (m_cacheMode == CacheInMemory) { m_data.clear(); } if (m_trimFromEnd >= (m_cacheWriteBufferFrames * m_channelCount)) { SVCERR << "WARNING: CodedAudioFileReader::setSamplesToTrim: Can't handle trimming more frames from end (" << m_trimFromEnd << ") than can be stored in cache-write buffer (" << (m_cacheWriteBufferFrames * m_channelCount) << "), won't trim anything from the end after all"; m_trimFromEnd = 0; } m_initialised = true; } void CodedAudioFileReader::addSamplesToDecodeCache(float **samples, sv_frame_t nframes) { QMutexLocker locker(&m_cacheMutex); if (!m_initialised) return; for (sv_frame_t i = 0; i < nframes; ++i) { if (m_trimFromStart > 0) { --m_trimFromStart; continue; } for (int c = 0; c < m_channelCount; ++c) { float sample = samples[c][i]; m_cacheWriteBuffer[m_cacheWriteBufferIndex++] = sample; } pushCacheWriteBufferMaybe(false); } } void CodedAudioFileReader::addSamplesToDecodeCache(float *samples, sv_frame_t nframes) { QMutexLocker locker(&m_cacheMutex); if (!m_initialised) return; for (sv_frame_t i = 0; i < nframes; ++i) { if (m_trimFromStart > 0) { --m_trimFromStart; continue; } for (int c = 0; c < m_channelCount; ++c) { float sample = samples[i * m_channelCount + c]; m_cacheWriteBuffer[m_cacheWriteBufferIndex++] = sample; } pushCacheWriteBufferMaybe(false); } } void CodedAudioFileReader::addSamplesToDecodeCache(const floatvec_t &samples) { QMutexLocker locker(&m_cacheMutex); if (!m_initialised) return; for (float sample: samples) { if (m_trimFromStart > 0) { --m_trimFromStart; continue; } m_cacheWriteBuffer[m_cacheWriteBufferIndex++] = sample; pushCacheWriteBufferMaybe(false); } } void CodedAudioFileReader::finishDecodeCache() { QMutexLocker locker(&m_cacheMutex); Profiler profiler("CodedAudioFileReader::finishDecodeCache"); if (!m_initialised) { SVDEBUG << "WARNING: CodedAudioFileReader::finishDecodeCache: Cache was never initialised!" << endl; return; } pushCacheWriteBufferMaybe(true); delete[] m_cacheWriteBuffer; m_cacheWriteBuffer = 0; delete[] m_resampleBuffer; m_resampleBuffer = 0; delete m_resampler; m_resampler = 0; if (m_cacheMode == CacheInTemporaryFile) { sf_close(m_cacheFileWritePtr); m_cacheFileWritePtr = 0; if (m_cacheFileReader) m_cacheFileReader->updateFrameCount(); } else { // I know, I know, we already allocated it... StorageAdviser::notifyPlannedAllocation (StorageAdviser::MemoryAllocation, (m_data.size() * sizeof(float)) / 1024); } SVDEBUG << "CodedAudioFileReader: File decodes to " << m_fileFrameCount << " frames" << endl; if (m_fileFrameCount != m_frameCount) { SVDEBUG << "CodedAudioFileReader: Resampled to " << m_frameCount << " frames" << endl; } SVDEBUG << "CodedAudioFileReader: Signal abs max is " << m_max << ", " << m_clippedCount << " samples clipped, first non-zero frame is at " << m_firstNonzero << ", last at " << m_lastNonzero << endl; if (m_normalised) { SVDEBUG << "CodedAudioFileReader: Normalising, gain is " << m_gain << endl; } } void CodedAudioFileReader::pushCacheWriteBufferMaybe(bool final) { if (final || (m_cacheWriteBufferIndex == m_cacheWriteBufferFrames * m_channelCount)) { if (m_trimFromEnd > 0) { sv_frame_t framesToPush = (m_cacheWriteBufferIndex / m_channelCount) - m_trimFromEnd; if (framesToPush <= 0 && !final) { // This won't do, the buffer is full so we have to push // something. Should have checked for this earlier throw std::logic_error("Buffer full but nothing to push"); } pushBuffer(m_cacheWriteBuffer, framesToPush, final); m_cacheWriteBufferIndex -= framesToPush * m_channelCount; for (sv_frame_t i = 0; i < m_cacheWriteBufferIndex; ++i) { m_cacheWriteBuffer[i] = m_cacheWriteBuffer[framesToPush * m_channelCount + i]; } } else { pushBuffer(m_cacheWriteBuffer, m_cacheWriteBufferIndex / m_channelCount, final); m_cacheWriteBufferIndex = 0; } if (m_cacheFileReader) { m_cacheFileReader->updateFrameCount(); } } } sv_frame_t CodedAudioFileReader::pushBuffer(float *buffer, sv_frame_t sz, bool final) { m_fileFrameCount += sz; double ratio = 1.0; if (m_resampler && m_fileRate != 0) { ratio = m_sampleRate / m_fileRate; } if (ratio != 1.0) { pushBufferResampling(buffer, sz, ratio, final); } else { pushBufferNonResampling(buffer, sz); } return sz; } void CodedAudioFileReader::pushBufferNonResampling(float *buffer, sv_frame_t sz) { float clip = 1.0; sv_frame_t count = sz * m_channelCount; // statistics for (sv_frame_t j = 0; j < sz; ++j) { for (int c = 0; c < m_channelCount; ++c) { sv_frame_t i = j * m_channelCount + c; float v = buffer[i]; if (!m_normalised) { if (v > clip) { buffer[i] = clip; ++m_clippedCount; } else if (v < -clip) { buffer[i] = -clip; ++m_clippedCount; } } v = fabsf(v); if (v != 0.f) { if (m_firstNonzero == 0) { m_firstNonzero = m_frameCount; } m_lastNonzero = m_frameCount; if (v > m_max) { m_max = v; } } } ++m_frameCount; } if (m_max > 0.f) { m_gain = 1.f / m_max; // used when normalising only } switch (m_cacheMode) { case CacheInTemporaryFile: if (sf_writef_float(m_cacheFileWritePtr, buffer, sz) < sz) { sf_close(m_cacheFileWritePtr); m_cacheFileWritePtr = 0; throw InsufficientDiscSpace(TempDirectory::getInstance()->getPath()); } break; case CacheInMemory: m_dataLock.lock(); try { m_data.insert(m_data.end(), buffer, buffer + count); } catch (const std::bad_alloc &e) { m_data.clear(); SVCERR << "CodedAudioFileReader: Caught bad_alloc when trying to add " << count << " elements to buffer" << endl; m_dataLock.unlock(); throw e; } m_dataLock.unlock(); break; } } void CodedAudioFileReader::pushBufferResampling(float *buffer, sv_frame_t sz, double ratio, bool final) { // SVDEBUG << "pushBufferResampling: ratio = " << ratio << ", sz = " << sz << ", final = " << final << endl; if (sz > 0) { sv_frame_t out = m_resampler->resampleInterleaved (m_resampleBuffer, m_resampleBufferFrames, buffer, int(sz), ratio, false); pushBufferNonResampling(m_resampleBuffer, out); } if (final) { sv_frame_t padFrames = 1; if (double(m_frameCount) / ratio < double(m_fileFrameCount)) { padFrames = m_fileFrameCount - sv_frame_t(double(m_frameCount) / ratio) + 1; } sv_frame_t padSamples = padFrames * m_channelCount; SVDEBUG << "CodedAudioFileReader::pushBufferResampling: frameCount = " << m_frameCount << ", equivFileFrames = " << double(m_frameCount) / ratio << ", m_fileFrameCount = " << m_fileFrameCount << ", padFrames = " << padFrames << ", padSamples = " << padSamples << endl; float *padding = new float[padSamples]; for (sv_frame_t i = 0; i < padSamples; ++i) padding[i] = 0.f; sv_frame_t out = m_resampler->resampleInterleaved (m_resampleBuffer, m_resampleBufferFrames, padding, int(padFrames), ratio, true); SVDEBUG << "CodedAudioFileReader::pushBufferResampling: resampled padFrames to " << out << " frames" << endl; sv_frame_t expected = sv_frame_t(round(double(m_fileFrameCount) * ratio)); if (m_frameCount + out > expected) { out = expected - m_frameCount; SVDEBUG << "CodedAudioFileReader::pushBufferResampling: clipping that to " << out << " to avoid producing more samples than desired" << endl; } pushBufferNonResampling(m_resampleBuffer, out); delete[] padding; } } floatvec_t CodedAudioFileReader::getInterleavedFrames(sv_frame_t start, sv_frame_t count) const { // Lock is only required in CacheInMemory mode (the cache file // reader is expected to be thread safe and manage its own // locking) if (!m_initialised) { SVDEBUG << "CodedAudioFileReader::getInterleavedFrames: not initialised" << endl; return {}; } floatvec_t frames; switch (m_cacheMode) { case CacheInTemporaryFile: if (m_cacheFileReader) { frames = m_cacheFileReader->getInterleavedFrames(start, count); } break; case CacheInMemory: { if (!isOK()) return {}; if (count == 0) return {}; sv_frame_t ix0 = start * m_channelCount; sv_frame_t ix1 = ix0 + (count * m_channelCount); // This lock used to be a QReadWriteLock, but it appears that // its lock mechanism is significantly slower than QMutex so // it's not a good idea in cases like this where we don't // really have threads taking a long time to read concurrently m_dataLock.lock(); sv_frame_t n = sv_frame_t(m_data.size()); if (ix0 > n) ix0 = n; if (ix1 > n) ix1 = n; frames = floatvec_t(m_data.begin() + ix0, m_data.begin() + ix1); m_dataLock.unlock(); break; } } if (m_normalised) { for (auto &f: frames) f *= m_gain; } return frames; } sonic-visualiser-3.0.3/svcore/data/fileio/CodedAudioFileReader.h0000644000000000000000000000733113111512442022715 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_CODED_AUDIO_FILE_READER_H #define SV_CODED_AUDIO_FILE_READER_H #include "AudioFileReader.h" #include #include #ifdef Q_OS_WIN #include #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 #endif #include class WavFileReader; class Serialiser; namespace breakfastquay { class Resampler; } class CodedAudioFileReader : public AudioFileReader { Q_OBJECT public: virtual ~CodedAudioFileReader(); enum CacheMode { CacheInTemporaryFile, CacheInMemory }; enum DecodeMode { DecodeAtOnce, // decode the file on construction, with progress DecodeThreaded // decode in a background thread after construction }; virtual floatvec_t getInterleavedFrames(sv_frame_t start, sv_frame_t count) const; virtual sv_samplerate_t getNativeRate() const { return m_fileRate; } virtual QString getLocalFilename() const { return m_cacheFileName; } /// Intermediate cache means all CodedAudioFileReaders are quickly seekable virtual bool isQuicklySeekable() const { return true; } signals: void progress(int); protected: CodedAudioFileReader(CacheMode cacheMode, sv_samplerate_t targetRate, bool normalised); void initialiseDecodeCache(); // samplerate, channels must have been set // compensation for encoder delays: void setFramesToTrim(sv_frame_t fromStart, sv_frame_t fromEnd); // may throw InsufficientDiscSpace: void addSamplesToDecodeCache(float **samples, sv_frame_t nframes); void addSamplesToDecodeCache(float *samplesInterleaved, sv_frame_t nframes); void addSamplesToDecodeCache(const floatvec_t &interleaved); // may throw InsufficientDiscSpace: void finishDecodeCache(); bool isDecodeCacheInitialised() const { return m_initialised; } void startSerialised(QString id); void endSerialised(); private: void pushCacheWriteBufferMaybe(bool final); sv_frame_t pushBuffer(float *interleaved, sv_frame_t sz, bool final); // to be called only by pushBuffer void pushBufferResampling(float *interleaved, sv_frame_t sz, double ratio, bool final); // to be called only by pushBuffer and pushBufferResampling void pushBufferNonResampling(float *interleaved, sv_frame_t sz); protected: QMutex m_cacheMutex; CacheMode m_cacheMode; floatvec_t m_data; mutable QMutex m_dataLock; bool m_initialised; Serialiser *m_serialiser; sv_samplerate_t m_fileRate; QString m_cacheFileName; SNDFILE *m_cacheFileWritePtr; WavFileReader *m_cacheFileReader; float *m_cacheWriteBuffer; sv_frame_t m_cacheWriteBufferIndex; // buffer write pointer in samples sv_frame_t m_cacheWriteBufferFrames; // buffer size in frames breakfastquay::Resampler *m_resampler; float *m_resampleBuffer; int m_resampleBufferFrames; sv_frame_t m_fileFrameCount; bool m_normalised; float m_max; float m_gain; sv_frame_t m_trimFromStart; sv_frame_t m_trimFromEnd; sv_frame_t m_clippedCount; sv_frame_t m_firstNonzero; sv_frame_t m_lastNonzero; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/CoreAudioFileReader.cpp0000644000000000000000000001614413111512442023124 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2012 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_COREAUDIO #include "CoreAudioFileReader.h" #include "base/Profiler.h" #include "base/ProgressReporter.h" #include "system/System.h" #include #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__) #include #include #else #include "AudioToolbox.h" #include "ExtendedAudioFile.h" #endif class CoreAudioFileReader::D { public: D() : blockSize(1024), valid(false) { } ExtAudioFileRef file; AudioBufferList buffer; OSStatus err; AudioStreamBasicDescription asbd; int blockSize; bool valid; }; static QString codestr(OSStatus err) { char text[5]; UInt32 uerr = err; text[0] = (uerr >> 24) & 0xff; text[1] = (uerr >> 16) & 0xff; text[2] = (uerr >> 8) & 0xff; text[3] = (uerr) & 0xff; text[4] = '\0'; return QString("%1 (%2)").arg(err).arg(QString::fromLocal8Bit(text)); } CoreAudioFileReader::CoreAudioFileReader(FileSource source, DecodeMode /* decodeMode */, CacheMode mode, sv_samplerate_t targetRate, bool normalised, ProgressReporter *reporter) : CodedAudioFileReader(mode, targetRate, normalised), m_source(source), m_path(source.getLocalFilename()), m_d(new D), m_reporter(reporter), m_cancelled(false), m_completion(0), m_decodeThread(0) { SVDEBUG << "CoreAudioFileReader: local path: \"" << m_path << "\"" << endl; m_channelCount = 0; m_fileRate = 0; m_d->buffer.mBuffers[0].mData = 0; Profiler profiler("CoreAudioFileReader::CoreAudioFileReader", true); QByteArray ba = m_path.toLocal8Bit(); CFURLRef url = CFURLCreateFromFileSystemRepresentation (kCFAllocatorDefault, (const UInt8 *)ba.data(), (CFIndex)ba.length(), false); //!!! how do we find out if the file open fails because of DRM protection? //#if (MACOSX_DEPLOYMENT_TARGET <= 1040 && MAC_OS_X_VERSION_MIN_REQUIRED <= 1040) // FSRef fsref; // if (!CFURLGetFSRef(url, &fsref)) { // returns Boolean, not error code // m_error = "CoreAudioReadStream: Error looking up FS ref (file not found?)"; // return; // } // m_d->err = ExtAudioFileOpen(&fsref, &m_d->file); //#else m_d->err = ExtAudioFileOpenURL(url, &m_d->file); //#endif CFRelease(url); if (m_d->err) { m_error = "CoreAudioReadStream: Error opening file: code " + codestr(m_d->err); return; } if (!m_d->file) { m_error = "CoreAudioReadStream: Failed to open file, but no error reported!"; return; } UInt32 propsize = sizeof(AudioStreamBasicDescription); m_d->err = ExtAudioFileGetProperty (m_d->file, kExtAudioFileProperty_FileDataFormat, &propsize, &m_d->asbd); if (m_d->err) { m_error = "CoreAudioReadStream: Error in getting basic description: code " + codestr(m_d->err); ExtAudioFileDispose(m_d->file); return; } m_channelCount = m_d->asbd.mChannelsPerFrame; m_fileRate = m_d->asbd.mSampleRate; SVDEBUG << "CoreAudioFileReader: " << m_channelCount << " channels, " << m_fileRate << " Hz" << endl; m_d->asbd.mFormatID = kAudioFormatLinearPCM; m_d->asbd.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; m_d->asbd.mBitsPerChannel = sizeof(float) * 8; m_d->asbd.mBytesPerFrame = sizeof(float) * m_channelCount; m_d->asbd.mBytesPerPacket = sizeof(float) * m_channelCount; m_d->asbd.mFramesPerPacket = 1; m_d->asbd.mReserved = 0; m_d->err = ExtAudioFileSetProperty (m_d->file, kExtAudioFileProperty_ClientDataFormat, propsize, &m_d->asbd); if (m_d->err) { m_error = "CoreAudioReadStream: Error in setting client format: code " + codestr(m_d->err); ExtAudioFileDispose(m_d->file); return; } m_d->buffer.mNumberBuffers = 1; m_d->buffer.mBuffers[0].mNumberChannels = m_channelCount; m_d->buffer.mBuffers[0].mDataByteSize = sizeof(float) * m_channelCount * m_d->blockSize; m_d->buffer.mBuffers[0].mData = new float[m_channelCount * m_d->blockSize]; m_d->valid = true; initialiseDecodeCache(); if (m_reporter) { connect(m_reporter, SIGNAL(cancelled()), this, SLOT(cancelled())); m_reporter->setMessage (tr("Decoding %1...").arg(QFileInfo(m_path).fileName())); } while (1) { UInt32 framesRead = m_d->blockSize; m_d->err = ExtAudioFileRead(m_d->file, &framesRead, &m_d->buffer); if (m_d->err) { m_error = QString("Error in CoreAudio decoding: code %1") .arg(m_d->err); break; } //!!! progress? // cerr << "Read " << framesRead << " frames (block size " << m_d->blockSize << ")" << endl; // buffers are interleaved unless specified otherwise addSamplesToDecodeCache((float *)m_d->buffer.mBuffers[0].mData, framesRead); if ((int)framesRead < m_d->blockSize) break; } finishDecodeCache(); endSerialised(); m_completion = 100; } CoreAudioFileReader::~CoreAudioFileReader() { SVDEBUG << "CoreAudioFileReader::~CoreAudioFileReader" << endl; if (m_d->valid) { ExtAudioFileDispose(m_d->file); delete[] (float *)(m_d->buffer.mBuffers[0].mData); } delete m_d; } void CoreAudioFileReader::cancelled() { m_cancelled = true; } void CoreAudioFileReader::getSupportedExtensions(std::set &extensions) { extensions.insert("aiff"); extensions.insert("aif"); extensions.insert("au"); extensions.insert("m4a"); extensions.insert("m4b"); extensions.insert("m4p"); extensions.insert("mp3"); extensions.insert("mp4"); extensions.insert("wav"); } bool CoreAudioFileReader::supportsExtension(QString extension) { std::set extensions; getSupportedExtensions(extensions); return (extensions.find(extension.toLower()) != extensions.end()); } bool CoreAudioFileReader::supportsContentType(QString type) { return (type == "audio/x-aiff" || type == "audio/x-wav" || type == "audio/mpeg" || type == "audio/basic" || type == "audio/x-aac"); } bool CoreAudioFileReader::supports(FileSource &source) { return (supportsExtension(source.getExtension()) || supportsContentType(source.getContentType())); } #endif sonic-visualiser-3.0.3/svcore/data/fileio/CoreAudioFileReader.h0000644000000000000000000000443713111512442022573 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2012 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _COREAUDIO_FILE_READER_H_ #define _COREAUDIO_FILE_READER_H_ #ifdef HAVE_COREAUDIO #include "CodedAudioFileReader.h" #include "base/Thread.h" #include class ProgressReporter; class CoreAudioFileReader : public CodedAudioFileReader { Q_OBJECT public: CoreAudioFileReader(FileSource source, DecodeMode decodeMode, CacheMode cacheMode, sv_samplerate_t targetRate = 0, bool normalised = false, ProgressReporter *reporter = nullptr); virtual ~CoreAudioFileReader(); virtual QString getError() const { return m_error; } virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getTitle() const { return m_title; } static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return m_completion; } virtual bool isUpdating() const { return m_decodeThread && m_decodeThread->isRunning(); } public slots: void cancelled(); protected: FileSource m_source; QString m_path; QString m_error; QString m_title; class D; D *m_d; ProgressReporter *m_reporter; bool m_cancelled; int m_completion; class DecodeThread : public Thread { public: // DecodeThread(QuickTimeFileReader *reader) : m_reader(reader) { } virtual void run(); protected: // QuickTimeFileReader *m_reader; }; DecodeThread *m_decodeThread; }; #endif #endif sonic-visualiser-3.0.3/svcore/data/fileio/DataFileReader.h0000644000000000000000000000404213111512442021562 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _DATA_FILE_READER_H_ #define _DATA_FILE_READER_H_ #include #include class Model; class DataFileReader : public QObject { public: /** * Return true if the file appears to be of the correct type. * * The DataFileReader will be constructed by passing a file path * to its constructor. If the file can at that time be determined * to be not of a type that this reader can read, it should return * false in response to any subsequent call to isOK(). * * If the file is apparently of the correct type, isOK() should * return true; if it turns out that the file cannot after all be * read (because it's corrupted or the detection misfired), then * the read() function may return NULL. */ virtual bool isOK() const = 0; virtual QString getError() const { return ""; } /** * Read the file and return the corresponding data model. This * function is not expected to be thread-safe or reentrant. This * function may be interactive (i.e. it's permitted to pop up * dialogs and windows and ask the user to specify any details * that can't be automatically extracted from the file). * * Return NULL if the file cannot be parsed at all (although it's * preferable to return a partial model and warn the user). * * Caller owns the returned model and must delete it after use. */ virtual Model *load() const = 0; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/DataFileReaderFactory.cpp0000644000000000000000000000740013111512442023446 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "DataFileReaderFactory.h" #include "MIDIFileReader.h" #include "CSVFileReader.h" #include "model/Model.h" #include QString DataFileReaderFactory::getKnownExtensions() { return "*.svl *.csv *.lab *.mid *.txt"; } DataFileReader * DataFileReaderFactory::createReader(QString path, bool csv, MIDIFileImportPreferenceAcquirer *acquirer, CSVFormat format, sv_samplerate_t mainModelSampleRate) { QString err; DataFileReader *reader = 0; if (!csv) { reader = new MIDIFileReader(path, acquirer, mainModelSampleRate); if (reader->isOK()) return reader; if (reader->getError() != "") err = reader->getError(); delete reader; } if (csv) { reader = new CSVFileReader(path, format, mainModelSampleRate); if (reader->isOK()) return reader; if (reader->getError() != "") err = reader->getError(); delete reader; } return 0; } DataFileReader * DataFileReaderFactory::createReader(QString path, MIDIFileImportPreferenceAcquirer *acquirer, sv_samplerate_t mainModelSampleRate) { DataFileReader *reader = createReader (path, false, acquirer, CSVFormat(), mainModelSampleRate); if (reader) return reader; reader = createReader (path, true, acquirer, CSVFormat(path), mainModelSampleRate); if (reader) return reader; return 0; } Model * DataFileReaderFactory::load(QString path, MIDIFileImportPreferenceAcquirer *acquirer, sv_samplerate_t mainModelSampleRate) { DataFileReader *reader = createReader(path, acquirer, mainModelSampleRate); if (!reader) return NULL; try { Model *model = reader->load(); delete reader; return model; } catch (Exception) { delete reader; throw; } } Model * DataFileReaderFactory::loadNonCSV(QString path, MIDIFileImportPreferenceAcquirer *acquirer, sv_samplerate_t mainModelSampleRate) { DataFileReader *reader = createReader(path, false, acquirer, CSVFormat(), mainModelSampleRate); if (!reader) return NULL; try { Model *model = reader->load(); delete reader; return model; } catch (Exception) { delete reader; throw; } } Model * DataFileReaderFactory::loadCSV(QString path, CSVFormat format, sv_samplerate_t mainModelSampleRate) { DataFileReader *reader = createReader(path, true, 0, format, mainModelSampleRate); if (!reader) return NULL; try { Model *model = reader->load(); delete reader; return model; } catch (Exception) { delete reader; throw; } } sonic-visualiser-3.0.3/svcore/data/fileio/DataFileReaderFactory.h0000644000000000000000000000577413111512442023127 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _DATA_FILE_READER_FACTORY_H_ #define _DATA_FILE_READER_FACTORY_H_ #include #include "CSVFormat.h" #include "MIDIFileReader.h" class DataFileReader; class Model; class DataFileReaderFactory { public: enum Exception { ImportCancelled }; /** * Return the file extensions that we have data file readers for, * in a format suitable for use with QFileDialog. For example, * "*.csv *.xml". */ static QString getKnownExtensions(); /** * Return a data file reader initialised to the file at the * given path, or NULL if no suitable reader for this path is * available or the file cannot be opened. * * Caller owns the returned object and must delete it after use. * * Note that this function is non-interactive -- the user is not * asked for file format preferences. */ static DataFileReader *createReader(QString path, MIDIFileImportPreferenceAcquirer *, sv_samplerate_t mainModelSampleRate); /** * Read the given path, if a suitable reader is available. * Return NULL if no reader succeeded in reading this file. * * Note that this function is non-interactive -- the user is not * asked for file format preferences. If the CSV file reader is * used, it is with default format. */ static Model *load(QString path, MIDIFileImportPreferenceAcquirer *acquirer, sv_samplerate_t mainModelSampleRate); /** * Read the given path, if a suitable reader is available. * Return NULL if no reader succeeded in reading this file. * Do not attempt the general CSV reader. */ static Model *loadNonCSV(QString path, MIDIFileImportPreferenceAcquirer *acquirer, sv_samplerate_t mainModelSampleRate); /** * Read the given path using the CSV reader with the given format. * Return NULL if it failed in reading this file. */ static Model *loadCSV(QString path, CSVFormat format, sv_samplerate_t mainModelSampleRate); protected: static DataFileReader *createReader(QString path, bool csv, MIDIFileImportPreferenceAcquirer *, CSVFormat format, sv_samplerate_t mainModelSampleRate); }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/DecodingWavFileReader.cpp0000644000000000000000000001205413111512442023440 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "DecodingWavFileReader.h" #include "WavFileReader.h" #include "base/Profiler.h" #include "base/ProgressReporter.h" #include using namespace std; DecodingWavFileReader::DecodingWavFileReader(FileSource source, DecodeMode decodeMode, CacheMode mode, sv_samplerate_t targetRate, bool normalised, ProgressReporter *reporter) : CodedAudioFileReader(mode, targetRate, normalised), m_source(source), m_path(source.getLocalFilename()), m_cancelled(false), m_processed(0), m_completion(0), m_original(0), m_reporter(reporter), m_decodeThread(0) { SVDEBUG << "DecodingWavFileReader: local path: \"" << m_path << "\", decode mode: " << decodeMode << " (" << (decodeMode == DecodeAtOnce ? "DecodeAtOnce" : "DecodeThreaded") << ")" << endl; m_channelCount = 0; m_fileRate = 0; Profiler profiler("DecodingWavFileReader::DecodingWavFileReader"); m_original = new WavFileReader(m_path); if (!m_original->isOK()) { m_error = m_original->getError(); return; } m_channelCount = m_original->getChannelCount(); m_fileRate = m_original->getSampleRate(); initialiseDecodeCache(); if (decodeMode == DecodeAtOnce) { if (m_reporter) { connect(m_reporter, SIGNAL(cancelled()), this, SLOT(cancelled())); m_reporter->setMessage (tr("Decoding %1...").arg(QFileInfo(m_path).fileName())); } sv_frame_t blockSize = 16384; sv_frame_t total = m_original->getFrameCount(); floatvec_t block; for (sv_frame_t i = 0; i < total; i += blockSize) { sv_frame_t count = blockSize; if (i + count > total) count = total - i; block = m_original->getInterleavedFrames(i, count); addBlock(block); if (m_cancelled) break; } if (isDecodeCacheInitialised()) finishDecodeCache(); endSerialised(); if (m_reporter) m_reporter->setProgress(100); delete m_original; m_original = 0; } else { if (m_reporter) m_reporter->setProgress(100); m_decodeThread = new DecodeThread(this); m_decodeThread->start(); } } DecodingWavFileReader::~DecodingWavFileReader() { if (m_decodeThread) { m_cancelled = true; m_decodeThread->wait(); delete m_decodeThread; } delete m_original; } void DecodingWavFileReader::cancelled() { m_cancelled = true; } void DecodingWavFileReader::DecodeThread::run() { if (m_reader->m_cacheMode == CacheInTemporaryFile) { m_reader->startSerialised("DecodingWavFileReader::Decode"); } sv_frame_t blockSize = 16384; sv_frame_t total = m_reader->m_original->getFrameCount(); floatvec_t block; for (sv_frame_t i = 0; i < total; i += blockSize) { sv_frame_t count = blockSize; if (i + count > total) count = total - i; block = m_reader->m_original->getInterleavedFrames(i, count); m_reader->addBlock(block); if (m_reader->m_cancelled) break; } if (m_reader->isDecodeCacheInitialised()) m_reader->finishDecodeCache(); m_reader->m_completion = 100; m_reader->endSerialised(); delete m_reader->m_original; m_reader->m_original = 0; } void DecodingWavFileReader::addBlock(const floatvec_t &frames) { addSamplesToDecodeCache(frames); m_processed += frames.size(); double ratio = double(m_sampleRate) / double(m_fileRate); int progress = int(lrint((double(m_processed) * ratio * 100) / double(m_original->getFrameCount()))); if (progress > 99) progress = 99; m_completion = progress; if (m_reporter) { m_reporter->setProgress(progress); } } void DecodingWavFileReader::getSupportedExtensions(set &extensions) { WavFileReader::getSupportedExtensions(extensions); } bool DecodingWavFileReader::supportsExtension(QString extension) { return WavFileReader::supportsExtension(extension); } bool DecodingWavFileReader::supportsContentType(QString type) { return WavFileReader::supportsContentType(type); } bool DecodingWavFileReader::supports(FileSource &source) { return WavFileReader::supports(source); } sonic-visualiser-3.0.3/svcore/data/fileio/DecodingWavFileReader.h0000644000000000000000000000446213111512442023111 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _DECODING_WAV_FILE_READER_H_ #define _DECODING_WAV_FILE_READER_H_ #include "CodedAudioFileReader.h" #include "base/Thread.h" #include class WavFileReader; class ProgressReporter; class DecodingWavFileReader : public CodedAudioFileReader { Q_OBJECT public: DecodingWavFileReader(FileSource source, DecodeMode decodeMode, // determines when to resample CacheMode cacheMode, sv_samplerate_t targetRate = 0, bool normalised = false, ProgressReporter *reporter = 0); virtual ~DecodingWavFileReader(); virtual QString getError() const { return m_error; } virtual QString getLocation() const { return m_source.getLocation(); } static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return m_completion; } virtual bool isUpdating() const { return m_decodeThread && m_decodeThread->isRunning(); } public slots: void cancelled(); protected: FileSource m_source; QString m_path; QString m_error; bool m_cancelled; sv_frame_t m_processed; int m_completion; WavFileReader *m_original; ProgressReporter *m_reporter; void addBlock(const floatvec_t &frames); class DecodeThread : public Thread { public: DecodeThread(DecodingWavFileReader *reader) : m_reader(reader) { } virtual void run(); protected: DecodingWavFileReader *m_reader; }; DecodeThread *m_decodeThread; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/FileFinder.h0000644000000000000000000000366113111512442021003 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_FILE_FINDER_H #define SV_FILE_FINDER_H #include class FileFinder { public: enum FileType { SessionFile, AudioFile, LayerFile, LayerFileNoMidi, SessionOrAudioFile, ImageFile, SVGFile, AnyFile, CSVFile, LayerFileNonSV, LayerFileNoMidiNonSV, }; virtual QString getOpenFileName(FileType type, QString fallbackLocation = "") = 0; virtual QString getSaveFileName(FileType type, QString fallbackLocation = "") = 0; virtual void registerLastOpenedFilePath(FileType type, QString path) = 0; virtual QString find(FileType type, QString location, QString lastKnownLocation = "") = 0; static FileFinder *getInstance() { FFContainer *container = FFContainer::getInstance(); return container->getFileFinder(); } protected: class FFContainer { public: static FFContainer *getInstance() { static FFContainer instance; return &instance; } void setFileFinder(FileFinder *ff) { m_ff = ff; } FileFinder *getFileFinder() const { return m_ff; } private: FileFinder *m_ff; }; static void registerFileFinder(FileFinder *ff) { FFContainer *container = FFContainer::getInstance(); container->setFileFinder(ff); } }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/FileReadThread.cpp0000644000000000000000000002105413111512442022126 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "FileReadThread.h" #include "base/Profiler.h" #include "base/Thread.h" #include #ifdef _MSC_VER #include #define _lseek lseek #else #include #endif #include //#define DEBUG_FILE_READ_THREAD 1 FileReadThread::FileReadThread() : m_nextToken(0), m_exiting(false) { } void FileReadThread::run() { MutexLocker locker(&m_mutex, "FileReadThread::run::m_mutex"); while (!m_exiting) { if (m_queue.empty()) { m_condition.wait(&m_mutex, 1000); } else { process(); } notifyCancelled(); } notifyCancelled(); #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::run() exiting" << endl; #endif } void FileReadThread::finish() { #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::finish()" << endl; #endif { MutexLocker locker(&m_mutex, "FileReadThread::finish::m_mutex"); while (!m_queue.empty()) { m_cancelledRequests[m_queue.begin()->first] = m_queue.begin()->second; m_newlyCancelled.insert(m_queue.begin()->first); m_queue.erase(m_queue.begin()); } m_exiting = true; } m_condition.wakeAll(); #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::finish() exiting" << endl; #endif } int FileReadThread::request(const Request &request) { int token; { MutexLocker locker(&m_mutex, "FileReadThread::request::m_mutex"); token = m_nextToken++; m_queue[token] = request; } m_condition.wakeAll(); return token; } void FileReadThread::cancel(int token) { { MutexLocker locker(&m_mutex, "FileReadThread::cancel::m_mutex"); if (m_queue.find(token) != m_queue.end()) { m_cancelledRequests[token] = m_queue[token]; m_queue.erase(token); m_newlyCancelled.insert(token); } else if (m_readyRequests.find(token) != m_readyRequests.end()) { m_cancelledRequests[token] = m_readyRequests[token]; m_readyRequests.erase(token); } else { cerr << "WARNING: FileReadThread::cancel: token " << token << " not found" << endl; } } #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::cancel(" << token << ") waking condition" << endl; #endif m_condition.wakeAll(); } bool FileReadThread::isReady(int token) { MutexLocker locker(&m_mutex, "FileReadThread::isReady::m_mutex"); bool ready = m_readyRequests.find(token) != m_readyRequests.end(); return ready; } bool FileReadThread::isCancelled(int token) { MutexLocker locker(&m_mutex, "FileReadThread::isCancelled::m_mutex"); bool cancelled = m_cancelledRequests.find(token) != m_cancelledRequests.end() && m_newlyCancelled.find(token) == m_newlyCancelled.end(); return cancelled; } bool FileReadThread::haveRequest(int token) { MutexLocker locker(&m_mutex, "FileReadThread::haveRequest::m_mutex"); bool found = false; if (m_queue.find(token) != m_queue.end()) { found = true; } else if (m_cancelledRequests.find(token) != m_cancelledRequests.end()) { found = true; } else if (m_readyRequests.find(token) != m_readyRequests.end()) { found = true; } return found; } bool FileReadThread::getRequest(int token, Request &request) { MutexLocker locker(&m_mutex, "FileReadThread::getRequest::m_mutex"); bool found = false; if (m_queue.find(token) != m_queue.end()) { request = m_queue[token]; found = true; } else if (m_cancelledRequests.find(token) != m_cancelledRequests.end()) { request = m_cancelledRequests[token]; found = true; } else if (m_readyRequests.find(token) != m_readyRequests.end()) { request = m_readyRequests[token]; found = true; } return found; } void FileReadThread::done(int token) { MutexLocker locker(&m_mutex, "FileReadThread::done::m_mutex"); bool found = false; if (m_cancelledRequests.find(token) != m_cancelledRequests.end()) { m_cancelledRequests.erase(token); m_newlyCancelled.erase(token); found = true; } else if (m_readyRequests.find(token) != m_readyRequests.end()) { m_readyRequests.erase(token); found = true; } else if (m_queue.find(token) != m_queue.end()) { cerr << "WARNING: FileReadThread::done(" << token << "): request is still in queue (wait or cancel it)" << endl; } if (!found) { cerr << "WARNING: FileReadThread::done(" << token << "): request not found" << endl; } } void FileReadThread::process() { // entered with m_mutex locked and m_queue non-empty Profiler profiler("FileReadThread::process", true); int token = m_queue.begin()->first; Request request = m_queue.begin()->second; m_mutex.unlock(); #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::process: reading " << request.start << ", " << request.size << " on " << request.fd << endl; #endif bool successful = false; bool seekFailed = false; ssize_t r = 0; { MutexLocker rlocker(request.mutex, "FileReadThread::process::request.mutex"); if (::lseek(request.fd, request.start, SEEK_SET) == (off_t)-1) { seekFailed = true; } else { // if request.size is large, we want to avoid making a single // system call to read it all as it may block too much static const size_t blockSize = 256 * 1024; size_t size = request.size; char *destination = request.data; while (size > 0) { size_t readSize = size; if (readSize > blockSize) readSize = blockSize; ssize_t br = ::read(request.fd, destination, readSize); if (br < 0) { r = br; break; } else { r += br; if (br < ssize_t(readSize)) break; } destination += readSize; size -= readSize; } } } if (seekFailed) { ::perror("Seek failed"); cerr << "ERROR: FileReadThread::process: seek to " << request.start << " failed" << endl; request.size = 0; } else { if (r < 0) { ::perror("ERROR: FileReadThread::process: Read failed"); cerr << "ERROR: FileReadThread::process: read of " << request.size << " at " << request.start << " failed" << endl; request.size = 0; } else if (r < ssize_t(request.size)) { cerr << "WARNING: FileReadThread::process: read " << request.size << " returned only " << r << " bytes" << endl; request.size = r; usleep(100000); } else { successful = true; } } // Check that the token hasn't been cancelled and the thread // hasn't been asked to finish m_mutex.lock(); request.successful = successful; if (m_queue.find(token) != m_queue.end() && !m_exiting) { m_queue.erase(token); m_readyRequests[token] = request; #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::process: done, marking as ready (success = " << m_readyRequests[token].successful << ")" << endl; #endif } else { #ifdef DEBUG_FILE_READ_THREAD if (m_exiting) { SVDEBUG << "FileReadThread::process: exiting" << endl; } else { SVDEBUG << "FileReadThread::process: request disappeared" << endl; } #endif } } void FileReadThread::notifyCancelled() { // entered with m_mutex locked while (!m_newlyCancelled.empty()) { int token = *m_newlyCancelled.begin(); #ifdef DEBUG_FILE_READ_THREAD SVDEBUG << "FileReadThread::notifyCancelled: token " << token << endl; #endif m_newlyCancelled.erase(token); } } sonic-visualiser-3.0.3/svcore/data/fileio/FileReadThread.h0000644000000000000000000000357213111512442021600 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FILE_READ_THREAD_H_ #define _FILE_READ_THREAD_H_ #include "base/Thread.h" #include #include #include #include #include class FileReadThread : public Thread { Q_OBJECT public: FileReadThread(); virtual void run(); virtual void finish(); struct Request { int fd; QMutex *mutex; // used to synchronise access to fd; may be null off_t start; size_t size; char *data; // caller is responsible for allocating and deallocating bool successful; // set by FileReadThread after processing request }; virtual int request(const Request &request); virtual void cancel(int token); virtual bool isReady(int token); virtual bool isCancelled(int token); // and safe to delete virtual bool haveRequest(int token); virtual bool getRequest(int token, Request &request); virtual void done(int token); protected: int m_nextToken; bool m_exiting; typedef std::map RequestQueue; RequestQueue m_queue; RequestQueue m_cancelledRequests; RequestQueue m_readyRequests; std::set m_newlyCancelled; QMutex m_mutex; QWaitCondition m_condition; void process(); void notifyCancelled(); }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/FileSource.cpp0000644000000000000000000006232213111512442021366 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "FileSource.h" #include "base/TempDirectory.h" #include "base/Exceptions.h" #include "base/ProgressReporter.h" #include "system/System.h" #include #include #include #include #include #include #include #include //#define DEBUG_FILE_SOURCE 1 int FileSource::m_count = 0; QMutex FileSource::m_fileCreationMutex; FileSource::RemoteRefCountMap FileSource::m_refCountMap; FileSource::RemoteLocalMap FileSource::m_remoteLocalMap; QMutex FileSource::m_mapMutex; #ifdef DEBUG_FILE_SOURCE static int extantCount = 0; static int threadCount = 0; static std::map urlExtantCountMap; static QMutex countMutex; static void incCount(QString url) { QMutexLocker locker(&countMutex); ++extantCount; if (urlExtantCountMap.find(url) == urlExtantCountMap.end()) { urlExtantCountMap[url] = 1; } else { ++urlExtantCountMap[url]; } cerr << "FileSource: Now " << urlExtantCountMap[url] << " for this url, " << extantCount << " total" << endl; } static void decCount(QString url) { QMutexLocker locker(&countMutex); --extantCount; --urlExtantCountMap[url]; cerr << "FileSource: Now " << urlExtantCountMap[url] << " for this url, " << extantCount << " total" << endl; } void FileSource::debugReport() { QMutexLocker locker(&countMutex); cerr << "\nFileSource::debugReport: Have " << extantCount << " FileSource object(s) extant across " << threadCount << " thread(s)" << endl; cerr << "URLs by extant count:" << endl; cerr << "Count | URL" << endl; for (std::map::const_iterator i = urlExtantCountMap.begin(); i != urlExtantCountMap.end(); ++i) { cerr << i->second << " | " << i->first << endl; } cerr << "FileSource::debugReport done\n" << endl; } #else void FileSource::debugReport() { } #endif static QThreadStorage nms; FileSource::FileSource(QString fileOrUrl, ProgressReporter *reporter, QString preferredContentType) : m_rawFileOrUrl(fileOrUrl), m_url(fileOrUrl, QUrl::StrictMode), m_localFile(0), m_reply(0), m_preferredContentType(preferredContentType), m_ok(false), m_cancelled(false), m_lastStatus(0), m_resource(fileOrUrl.startsWith(':')), m_remote(isRemote(fileOrUrl)), m_done(false), m_leaveLocalFile(false), m_reporter(reporter), m_refCounted(false) { if (m_resource) { // qrc file m_url = QUrl("qrc" + fileOrUrl); } if (m_url.toString() == "") { m_url = QUrl(fileOrUrl, QUrl::TolerantMode); } #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(" << fileOrUrl << "): url <" << m_url.toString() << ">" << endl; incCount(m_url.toString()); #endif if (!canHandleScheme(m_url)) { cerr << "FileSource::FileSource: ERROR: Unsupported scheme in URL \"" << m_url.toString() << "\"" << endl; m_errorString = tr("Unsupported scheme in URL"); return; } init(); if (!isRemote() && !isAvailable()) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource: Failed to open local file with URL \"" << m_url.toString() << "\"; trying again assuming filename was encoded" << endl; #endif m_url = QUrl::fromEncoded(fileOrUrl.toLatin1()); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource: URL is now \"" << m_url.toString() << "\"" << endl; #endif init(); } if (isRemote() && (fileOrUrl.contains('%') || fileOrUrl.contains("--"))) { // for IDNA waitForStatus(); if (!isAvailable()) { // The URL was created on the assumption that the string // was human-readable. Let's try again, this time // assuming it was already encoded. cerr << "FileSource::FileSource: Failed to retrieve URL \"" << fileOrUrl << "\" as human-readable URL; " << "trying again treating it as encoded URL" << endl; // even though our cache file doesn't exist (because the // resource was 404), we still need to ensure we're no // longer associating a filename with this url in the // refcount map -- or createCacheFile will think we've // already done all the work and no request will be sent deleteCacheFile(); m_url = QUrl::fromEncoded(fileOrUrl.toLatin1()); m_ok = false; m_done = false; m_lastStatus = 0; init(); } } if (!isRemote()) { emit statusAvailable(); emit ready(); } #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(string) exiting" << endl; #endif } FileSource::FileSource(QUrl url, ProgressReporter *reporter) : m_url(url), m_localFile(0), m_reply(0), m_ok(false), m_cancelled(false), m_lastStatus(0), m_resource(false), m_remote(isRemote(url.toString())), m_done(false), m_leaveLocalFile(false), m_reporter(reporter), m_refCounted(false) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(" << url.toString() << ") [as url]" << endl; incCount(m_url.toString()); #endif if (!canHandleScheme(m_url)) { cerr << "FileSource::FileSource: ERROR: Unsupported scheme in URL \"" << m_url.toString() << "\"" << endl; m_errorString = tr("Unsupported scheme in URL"); return; } init(); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(url) exiting" << endl; #endif } FileSource::FileSource(const FileSource &rf) : QObject(), m_url(rf.m_url), m_localFile(0), m_reply(0), m_ok(rf.m_ok), m_cancelled(rf.m_cancelled), m_lastStatus(rf.m_lastStatus), m_resource(rf.m_resource), m_remote(rf.m_remote), m_done(false), m_leaveLocalFile(false), m_reporter(rf.m_reporter), m_refCounted(false) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(" << m_url.toString() << ") [copy ctor]" << endl; incCount(m_url.toString()); #endif if (!canHandleScheme(m_url)) { cerr << "FileSource::FileSource: ERROR: Unsupported scheme in URL \"" << m_url.toString() << "\"" << endl; m_errorString = tr("Unsupported scheme in URL"); return; } if (!isRemote()) { m_localFilename = rf.m_localFilename; } else { QMutexLocker locker(&m_mapMutex); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(copy ctor): ref count is " << m_refCountMap[m_url] << endl; #endif if (m_refCountMap[m_url] > 0) { m_refCountMap[m_url]++; #ifdef DEBUG_FILE_SOURCE cerr << "raised it to " << m_refCountMap[m_url] << endl; #endif m_localFilename = m_remoteLocalMap[m_url]; m_refCounted = true; } else { m_ok = false; m_lastStatus = 404; } } m_done = true; #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(" << m_url.toString() << ") [copy ctor]: note: local filename is \"" << m_localFilename << "\"" << endl; #endif #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::FileSource(copy ctor) exiting" << endl; #endif } FileSource::~FileSource() { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource(" << m_url.toString() << ")::~FileSource" << endl; decCount(m_url.toString()); #endif cleanup(); if (isRemote() && !m_leaveLocalFile) deleteCacheFile(); } void FileSource::init() { if (isResource()) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Is a resource" << endl; #endif QString resourceFile = m_url.toString(); resourceFile.replace(QRegExp("^qrc:"), ":"); if (!QFileInfo(resourceFile).exists()) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Resource file of this name does not exist, switching to non-resource URL" << endl; #endif m_url = resourceFile; m_resource = false; } } if (!isRemote() && !isResource()) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Not a remote URL" << endl; #endif bool literal = false; m_localFilename = m_url.toLocalFile(); if (m_localFilename == "") { // QUrl may have mishandled the scheme (e.g. in a DOS path) m_localFilename = m_rawFileOrUrl; #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Trying literal local filename \"" << m_localFilename << "\"" << endl; #endif literal = true; } m_localFilename = QFileInfo(m_localFilename).absoluteFilePath(); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: URL translates to absolute filename \"" << m_localFilename << "\" (with literal=" << literal << ")" << endl; #endif m_ok = true; m_lastStatus = 200; if (!QFileInfo(m_localFilename).exists()) { if (literal) { m_lastStatus = 404; } else { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Local file of this name does not exist, trying URL as a literal filename" << endl; #endif // Again, QUrl may have been mistreating us -- // e.g. dropping a part that looks like query data m_localFilename = m_rawFileOrUrl; literal = true; if (!QFileInfo(m_localFilename).exists()) { m_lastStatus = 404; } } } m_done = true; return; } if (createCacheFile()) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Already have this one" << endl; #endif m_ok = true; if (!QFileInfo(m_localFilename).exists()) { m_lastStatus = 404; } else { m_lastStatus = 200; } m_done = true; return; } if (m_localFilename == "") return; m_localFile = new QFile(m_localFilename); m_localFile->open(QFile::WriteOnly); if (isResource()) { // Absent resource file case was dealt with at the top -- this // is the successful case QString resourceFileName = m_url.toString(); resourceFileName.replace(QRegExp("^qrc:"), ":"); QFile resourceFile(resourceFileName); resourceFile.open(QFile::ReadOnly); QByteArray ba(resourceFile.readAll()); #ifdef DEBUG_FILE_SOURCE cerr << "Copying " << ba.size() << " bytes from resource file to cache file" << endl; #endif qint64 written = m_localFile->write(ba); m_localFile->close(); delete m_localFile; m_localFile = 0; if (written != ba.size()) { #ifdef DEBUG_FILE_SOURCE cerr << "Copy failed (wrote " << written << " bytes)" << endl; #endif m_ok = false; return; } else { m_ok = true; m_lastStatus = 200; m_done = true; } } else { QString scheme = m_url.scheme().toLower(); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Don't have local copy of \"" << m_url.toString() << "\", retrieving" << endl; #endif if (scheme == "http" || scheme == "https" || scheme == "ftp") { initRemote(); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource: initRemote returned" << endl; #endif } else { m_remote = false; m_ok = false; } } if (m_ok) { QMutexLocker locker(&m_mapMutex); if (m_refCountMap[m_url] > 0) { // someone else has been doing the same thing at the same time, // but has got there first cleanup(); m_refCountMap[m_url]++; #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::init: Another FileSource has got there first, abandoning our download and using theirs" << endl; #endif m_localFilename = m_remoteLocalMap[m_url]; m_refCounted = true; m_ok = true; if (!QFileInfo(m_localFilename).exists()) { m_lastStatus = 404; } m_done = true; return; } m_remoteLocalMap[m_url] = m_localFilename; m_refCountMap[m_url]++; m_refCounted = true; if (m_reporter && !m_done) { m_reporter->setMessage (tr("Downloading %1...").arg(m_url.toString())); connect(m_reporter, SIGNAL(cancelled()), this, SLOT(cancelled())); connect(this, SIGNAL(progress(int)), m_reporter, SLOT(setProgress(int))); } } } void FileSource::initRemote() { m_ok = true; QNetworkRequest req; req.setUrl(m_url); if (m_preferredContentType != "") { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource: indicating preferred content type of \"" << m_preferredContentType << "\"" << endl; #endif req.setRawHeader ("Accept", QString("%1, */*").arg(m_preferredContentType).toLatin1()); } { // check we have a QNetworkAccessManager QMutexLocker locker(&m_mapMutex); if (!nms.hasLocalData()) { #ifdef DEBUG_FILE_SOURCE ++threadCount; #endif nms.setLocalData(new QNetworkAccessManager()); } } m_reply = nms.localData()->get(req); connect(m_reply, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(replyFailed(QNetworkReply::NetworkError))); connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); connect(m_reply, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged())); connect(m_reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); } void FileSource::cleanup() { if (m_done) { delete m_localFile; // does not actually delete the file m_localFile = 0; } m_done = true; if (m_reply) { QNetworkReply *r = m_reply; disconnect(r, 0, this, 0); m_reply = 0; // Can only call abort() when there are no errors. if (r->error() == QNetworkReply::NoError) { r->abort(); } r->deleteLater(); } if (m_localFile) { delete m_localFile; // does not actually delete the file m_localFile = 0; } } bool FileSource::isRemote(QString fileOrUrl) { // Note that a "scheme" with length 1 is probably a DOS drive letter QString scheme = QUrl(fileOrUrl).scheme().toLower(); if (scheme == "" || scheme == "file" || scheme.length() == 1) return false; return true; } bool FileSource::canHandleScheme(QUrl url) { // Note that a "scheme" with length 1 is probably a DOS drive letter QString scheme = url.scheme().toLower(); return (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "file" || scheme == "qrc" || scheme == "" || scheme.length() == 1); } bool FileSource::isAvailable() { waitForStatus(); bool available = true; if (!m_ok) { available = false; } else { // http 2xx status codes mean success available = (m_lastStatus / 100 == 2); } #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::isAvailable: " << (available ? "yes" : "no") << endl; #endif return available; } void FileSource::waitForStatus() { while (m_ok && (!m_done && m_lastStatus == 0)) { // cerr << "waitForStatus: processing (last status " << m_lastStatus << ")" << endl; QCoreApplication::processEvents(); } } void FileSource::waitForData() { while (m_ok && !m_done) { // cerr << "FileSource::waitForData: calling QApplication::processEvents" << endl; QCoreApplication::processEvents(); usleep(10000); } } void FileSource::setLeaveLocalFile(bool leave) { m_leaveLocalFile = leave; } bool FileSource::isOK() const { return m_ok; } bool FileSource::isDone() const { return m_done; } bool FileSource::wasCancelled() const { return m_cancelled; } bool FileSource::isResource() const { return m_resource; } bool FileSource::isRemote() const { return m_remote; } QString FileSource::getLocation() const { return m_url.toString(); } QString FileSource::getLocalFilename() const { return m_localFilename; } QString FileSource::getBasename() const { return QFileInfo(m_localFilename).fileName(); } QString FileSource::getContentType() const { return m_contentType; } QString FileSource::getExtension() const { if (m_localFilename != "") { return QFileInfo(m_localFilename).suffix().toLower(); } else { return QFileInfo(m_url.toLocalFile()).suffix().toLower(); } } QString FileSource::getErrorString() const { return m_errorString; } void FileSource::readyRead() { m_localFile->write(m_reply->readAll()); } void FileSource::metaDataChanged() { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::metaDataChanged" << endl; #endif if (!m_reply) { cerr << "WARNING: FileSource::metaDataChanged() called without a reply object being known to us" << endl; return; } // Handle http transfer status codes. int status = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // If this is a redirection (3xx) code, do the redirect if (status / 100 == 3) { QString location = m_reply->header (QNetworkRequest::LocationHeader).toString(); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::metaDataChanged: redirect to \"" << location << "\" received" << endl; #endif if (location != "") { QUrl newUrl(location); if (newUrl != m_url) { cleanup(); deleteCacheFile(); #ifdef DEBUG_FILE_SOURCE decCount(m_url.toString()); incCount(newUrl.toString()); #endif m_url = newUrl; m_localFile = 0; m_lastStatus = 0; m_done = false; m_refCounted = false; init(); return; } } } m_lastStatus = status; // 400 and up are failures, get the error string if (m_lastStatus / 100 >= 4) { m_errorString = QString("%1 %2") .arg(status) .arg(m_reply->attribute (QNetworkRequest::HttpReasonPhraseAttribute).toString()); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::metaDataChanged: " << m_errorString << endl; #endif } else { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::metaDataChanged: " << m_lastStatus << endl; #endif m_contentType = m_reply->header(QNetworkRequest::ContentTypeHeader).toString(); } emit statusAvailable(); } void FileSource::downloadProgress(qint64 done, qint64 total) { int percent = int((double(done) / double(total)) * 100.0 - 0.1); emit progress(percent); } void FileSource::cancelled() { m_done = true; cleanup(); m_ok = false; m_cancelled = true; m_errorString = tr("Download cancelled"); } void FileSource::replyFinished() { emit progress(100); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::replyFinished()" << endl; #endif if (m_done) return; QString scheme = m_url.scheme().toLower(); // For ftp transfers, replyFinished() will be called on success. // metaDataChanged() is never called for ftp transfers. if (scheme == "ftp") { m_lastStatus = 200; // http ok } bool error = (m_lastStatus / 100 >= 4); cleanup(); if (!error) { QFileInfo fi(m_localFilename); if (!fi.exists()) { m_errorString = tr("Failed to create local file %1").arg(m_localFilename); error = true; } else if (fi.size() == 0) { m_errorString = tr("File contains no data!"); error = true; } } if (error) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::done: error is " << error << ", deleting cache file" << endl; #endif deleteCacheFile(); } m_ok = !error; if (m_localFile) m_localFile->flush(); m_done = true; emit ready(); } void FileSource::replyFailed(QNetworkReply::NetworkError) { emit progress(100); if (!m_reply) { cerr << "WARNING: FileSource::replyFailed() called without a reply object being known to us" << endl; } else { m_errorString = m_reply->errorString(); } m_ok = false; m_done = true; cleanup(); emit ready(); } void FileSource::deleteCacheFile() { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::deleteCacheFile(\"" << m_localFilename << "\")" << endl; #endif cleanup(); if (m_localFilename == "") { return; } if (!isRemote()) { #ifdef DEBUG_FILE_SOURCE cerr << "not a cache file" << endl; #endif return; } if (m_refCounted) { QMutexLocker locker(&m_mapMutex); m_refCounted = false; if (m_refCountMap[m_url] > 0) { m_refCountMap[m_url]--; #ifdef DEBUG_FILE_SOURCE cerr << "reduced ref count to " << m_refCountMap[m_url] << endl; #endif if (m_refCountMap[m_url] > 0) { m_done = true; return; } } } m_fileCreationMutex.lock(); if (!QFile(m_localFilename).remove()) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::deleteCacheFile: ERROR: Failed to delete file \"" << m_localFilename << "\"" << endl; #endif } else { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::deleteCacheFile: Deleted cache file \"" << m_localFilename << "\"" << endl; #endif m_localFilename = ""; } m_fileCreationMutex.unlock(); m_done = true; } bool FileSource::createCacheFile() { { QMutexLocker locker(&m_mapMutex); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::createCacheFile: refcount is " << m_refCountMap[m_url] << endl; #endif if (m_refCountMap[m_url] > 0) { m_refCountMap[m_url]++; m_localFilename = m_remoteLocalMap[m_url]; #ifdef DEBUG_FILE_SOURCE cerr << "raised it to " << m_refCountMap[m_url] << endl; #endif m_refCounted = true; return true; } } QDir dir; try { dir = TempDirectory::getInstance()->getSubDirectoryPath("download"); } catch (DirectoryCreationFailed f) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::createCacheFile: ERROR: Failed to create temporary directory: " << f.what() << endl; #endif return false; } QString filepart = m_url.path().section('/', -1, -1, QString::SectionSkipEmpty); QString extension = ""; if (filepart.contains('.')) extension = filepart.section('.', -1); QString base = filepart; if (extension != "") { base = base.left(base.length() - extension.length() - 1); } if (base == "") base = "remote"; QString filename; if (extension == "") { filename = base; } else { filename = QString("%1.%2").arg(base).arg(extension); } QString filepath(dir.filePath(filename)); #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::createCacheFile: URL is \"" << m_url.toString() << "\", dir is \"" << dir.path() << "\", base \"" << base << "\", extension \"" << extension << "\", filebase \"" << filename << "\", filename \"" << filepath << "\"" << endl; #endif QMutexLocker fcLocker(&m_fileCreationMutex); ++m_count; if (QFileInfo(filepath).exists() || !QFile(filepath).open(QFile::WriteOnly)) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::createCacheFile: Failed to create local file \"" << filepath << "\" for URL \"" << m_url.toString() << "\" (or file already exists): appending suffix instead" << endl; #endif if (extension == "") { filename = QString("%1_%2").arg(base).arg(m_count); } else { filename = QString("%1_%2.%3").arg(base).arg(m_count).arg(extension); } filepath = dir.filePath(filename); if (QFileInfo(filepath).exists() || !QFile(filepath).open(QFile::WriteOnly)) { #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::createCacheFile: ERROR: Failed to create local file \"" << filepath << "\" for URL \"" << m_url.toString() << "\" (or file already exists)" << endl; #endif return false; } } #ifdef DEBUG_FILE_SOURCE cerr << "FileSource::createCacheFile: url " << m_url.toString() << " -> local filename " << filepath << endl; #endif m_localFilename = filepath; return false; } sonic-visualiser-3.0.3/svcore/data/fileio/FileSource.h0000644000000000000000000002035513111512442021033 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FILE_SOURCE_H_ #define _FILE_SOURCE_H_ #include #include #include #include #include #include #include "base/Debug.h" class QFile; class ProgressReporter; /** * FileSource is a class used to refer to the contents of a file that * may be either local or at a remote location such as a HTTP URL. * * When a FileSource object is constructed, the file or URL passed to * its constructor is tested for validity, and if it refers to a * remote HTTP or FTP location it is retrieved asynchronously (the Qt * event loop must be running) and cached locally. You can then query * a local path for the file and refer to that as a normal filename. * * Use isAvailable() to test whether the file or remote URL exists, * and isOK() to test for internal validity or transmission errors. * Call waitForStatus() to block until the availability and validity * of the URL have been established so that isAvailable may be called, * and waitForData() to block until the entire file has been cached. * * FileSource handles reference counting for cache files. You can * construct many FileSource objects with the same URL and you will * receive the same cached file for each; it is also reasonable to * pass FileSource objects by value. FileSource only makes sense for * stateless URLs that result in the same data on each request. * * Cached files share a lifetime with their "owning" FileSource * objects; when the last FileSource referring to a given URL is * deleted or goes out of scope, its cached file (if any) is also * removed. */ class FileSource : public QObject { Q_OBJECT public: /** * Construct a FileSource using the given local file path or URL. * The URL may be raw or encoded. * * If a ProgressReporter is provided, it will be updated with * progress status. Note that the progress() signal will also be * emitted regularly during retrieval, even if no reporter is * supplied here. Caller retains ownership of the reporter object. */ FileSource(QString fileOrUrl, ProgressReporter *reporter = 0, QString preferredContentType = ""); /** * Construct a FileSource using the given remote URL. * * If a ProgressReporter is provided, it will be updated with * progress status. Note that the progress() signal will also be * emitted regularly during retrieval, even if no reporter is * supplied here. Caller retains ownership of the reporter object. */ FileSource(QUrl url, ProgressReporter *reporter = 0); FileSource(const FileSource &); virtual ~FileSource(); /** * Block on a sub-event-loop until the availability of the file or * remote URL is known. */ void waitForStatus(); /** * Block on a sub-event-loop until the whole of the data has been * retrieved (if it is remote). */ void waitForData(); /** * Return true if the FileSource object is valid and neither error * nor cancellation occurred while retrieving the file or remote * URL. Non-existence of the file or URL is not an error -- call * isAvailable() to test for that. */ bool isOK() const; /** * Return true if the file or remote URL exists. This may block * on a sub-event-loop (calling waitForStatus) if the status is * not yet available. */ bool isAvailable(); /** * Return true if the entire file has been retrieved and is * available. */ bool isDone() const; /** * Return true if the operation was cancelled by the user through * the ProgressReporter interface. Note that the cancelled() * signal will have been emitted, and isOK() will also return * false in this case. */ bool wasCancelled() const; /** * Return true if this FileSource is referring to a QRC resource. */ bool isResource() const; /** * Return true if this FileSource is referring to a remote URL. */ bool isRemote() const; /** * Return the location filename or URL as passed to the * constructor. */ QString getLocation() const; /** * Return the name of the local file this FileSource refers to. * This is the filename that should be used when reading normally * from the FileSource. If the filename passed to the constructor * was a local file, this will return the same filename; otherwise * this will be the name of the temporary cache file owned by the * FileSource. */ QString getLocalFilename() const; /** * Return the base name, i.e. the final path element (including * extension, if any) of the location. */ QString getBasename() const; /** * Return the MIME content type of this file, if known. */ QString getContentType() const; /** * Return the file extension for this file, if any. The returned * extension is always lower-case. */ QString getExtension() const; /** * Return an error message, if isOK() is false. */ QString getErrorString() const; /** * Specify whether any local, cached file should remain on disc * after this FileSource has been destroyed. The default is false * (cached files share their FileSource owners' lifespans). */ void setLeaveLocalFile(bool leave); /** * Return true if the given filename or URL refers to a remote * URL. */ static bool isRemote(QString fileOrUrl); /** * Return true if FileSource can handle the retrieval scheme for * the given URL (or if the URL is for a local file). */ static bool canHandleScheme(QUrl url); /** * Print some stats, if FileSource was compiled with debugging. * It's safe to leave a call to this function in release code, as * long as FileSource itself is compiled with release flags. */ static void debugReport(); signals: /** * Emitted during URL retrieval, when the retrieval progress * notches up to a new percentage. */ void progress(int percent); /** * Emitted when the file's existence has been tested and/or * response header received. Calls to isAvailable() after this * has been emitted will not block. */ void statusAvailable(); /** * Emitted when the entire file data has been retrieved and the * local file is complete (if no error has occurred). */ void ready(); protected slots: void metaDataChanged(); void readyRead(); void replyFailed(QNetworkReply::NetworkError); void replyFinished(); void downloadProgress(qint64 done, qint64 total); void cancelled(); protected: FileSource &operator=(const FileSource &); // not provided QString m_rawFileOrUrl; QUrl m_url; QFile *m_localFile; QNetworkReply *m_reply; QString m_localFilename; QString m_errorString; QString m_contentType; QString m_preferredContentType; bool m_ok; bool m_cancelled; int m_lastStatus; bool m_resource; bool m_remote; bool m_done; bool m_leaveLocalFile; ProgressReporter *m_reporter; typedef std::map RemoteRefCountMap; typedef std::map RemoteLocalMap; static RemoteRefCountMap m_refCountMap; static RemoteLocalMap m_remoteLocalMap; static QMutex m_mapMutex; bool m_refCounted; void init(); void initRemote(); void cleanup(); // Create a local file for m_url. If it already existed, return true. // The local filename is stored in m_localFilename. bool createCacheFile(); void deleteCacheFile(); static QMutex m_fileCreationMutex; static int m_count; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/MIDIFileReader.cpp0000644000000000000000000007003713111512442021775 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Richard Bown and Chris Cannam. */ #include #include #include #include #include #include "MIDIFileReader.h" #include "data/midi/MIDIEvent.h" #include "model/Model.h" #include "base/Pitch.h" #include "base/RealTime.h" #include "model/NoteModel.h" #include #include #include #include "base/Debug.h" using std::string; using std::ifstream; using std::stringstream; using std::ends; using std::ios; using std::vector; using std::map; using std::set; using namespace MIDIConstants; //#define MIDI_DEBUG 1 MIDIFileReader::MIDIFileReader(QString path, MIDIFileImportPreferenceAcquirer *acquirer, sv_samplerate_t mainModelSampleRate) : m_smpte(false), m_timingDivision(0), m_fps(0), m_subframes(0), m_format(MIDI_FILE_BAD_FORMAT), m_numberOfTracks(0), m_trackByteCount(0), m_decrementCount(false), m_path(path), m_midiFile(0), m_fileSize(0), m_mainModelSampleRate(mainModelSampleRate), m_acquirer(acquirer) { if (parseFile()) { m_error = ""; } } MIDIFileReader::~MIDIFileReader() { for (MIDIComposition::iterator i = m_midiComposition.begin(); i != m_midiComposition.end(); ++i) { for (MIDITrack::iterator j = i->second.begin(); j != i->second.end(); ++j) { delete *j; } i->second.clear(); } m_midiComposition.clear(); } bool MIDIFileReader::isOK() const { return (m_error == ""); } QString MIDIFileReader::getError() const { return m_error; } long MIDIFileReader::midiBytesToLong(const string& bytes) { if (bytes.length() != 4) { throw MIDIException(tr("Wrong length for long data in MIDI stream (%1, should be %2)").arg(bytes.length()).arg(4)); } long longRet = ((long)(((MIDIByte)bytes[0]) << 24)) | ((long)(((MIDIByte)bytes[1]) << 16)) | ((long)(((MIDIByte)bytes[2]) << 8)) | ((long)((MIDIByte)(bytes[3]))); return longRet; } int MIDIFileReader::midiBytesToInt(const string& bytes) { if (bytes.length() != 2) { throw MIDIException(tr("Wrong length for int data in MIDI stream (%1, should be %2)").arg(bytes.length()).arg(2)); } int intRet = ((int)(((MIDIByte)bytes[0]) << 8)) | ((int)(((MIDIByte)bytes[1]))); return(intRet); } // Gets a single byte from the MIDI byte stream. For each track // section we can read only a specified number of bytes held in // m_trackByteCount. // MIDIByte MIDIFileReader::getMIDIByte() { if (!m_midiFile) { throw MIDIException(tr("getMIDIByte called but no MIDI file open")); } if (m_midiFile->eof()) { throw MIDIException(tr("End of MIDI file encountered while reading")); } if (m_decrementCount && m_trackByteCount <= 0) { throw MIDIException(tr("Attempt to get more bytes than expected on Track")); } char byte; if (m_midiFile->read(&byte, 1)) { --m_trackByteCount; return (MIDIByte)byte; } throw MIDIException(tr("Attempt to read past MIDI file end")); } // Gets a specified number of bytes from the MIDI byte stream. For // each track section we can read only a specified number of bytes // held in m_trackByteCount. // string MIDIFileReader::getMIDIBytes(unsigned long numberOfBytes) { if (!m_midiFile) { throw MIDIException(tr("getMIDIBytes called but no MIDI file open")); } if (m_midiFile->eof()) { throw MIDIException(tr("End of MIDI file encountered while reading")); } if (m_decrementCount && (numberOfBytes > (unsigned long)m_trackByteCount)) { throw MIDIException(tr("Attempt to get more bytes than available on Track (%1, only have %2)").arg(numberOfBytes).arg(m_trackByteCount)); } string stringRet; char fileMIDIByte; while (stringRet.length() < numberOfBytes && m_midiFile->read(&fileMIDIByte, 1)) { stringRet += fileMIDIByte; } // if we've reached the end of file without fulfilling the // quota then panic as our parsing has performed incorrectly // if (stringRet.length() < numberOfBytes) { stringRet = ""; throw MIDIException(tr("Attempt to read past MIDI file end")); } // decrement the byte count if (m_decrementCount) m_trackByteCount -= stringRet.length(); return stringRet; } // Get a long number of variable length from the MIDI byte stream. // long MIDIFileReader::getNumberFromMIDIBytes(int firstByte) { if (!m_midiFile) { throw MIDIException(tr("getNumberFromMIDIBytes called but no MIDI file open")); } long longRet = 0; MIDIByte midiByte; if (firstByte >= 0) { midiByte = (MIDIByte)firstByte; } else if (m_midiFile->eof()) { return longRet; } else { midiByte = getMIDIByte(); } longRet = midiByte; if (midiByte & 0x80) { longRet &= 0x7F; do { midiByte = getMIDIByte(); longRet = (longRet << 7) + (midiByte & 0x7F); } while (!m_midiFile->eof() && (midiByte & 0x80)); } return longRet; } // Seek to the next track in the midi file and set the number // of bytes to be read in the counter m_trackByteCount. // bool MIDIFileReader::skipToNextTrack() { if (!m_midiFile) { throw MIDIException(tr("skipToNextTrack called but no MIDI file open")); } string buffer, buffer2; m_trackByteCount = -1; m_decrementCount = false; while (!m_midiFile->eof() && (m_decrementCount == false)) { buffer = getMIDIBytes(4); if (buffer.compare(0, 4, MIDI_TRACK_HEADER) == 0) { m_trackByteCount = midiBytesToLong(getMIDIBytes(4)); m_decrementCount = true; } } if (m_trackByteCount == -1) { // we haven't found a track return false; } else { return true; } } // Read in a MIDI file. The parsing process throws exceptions back up // here if we run into trouble which we can then pass back out to // whoever called us using a nice bool. // bool MIDIFileReader::parseFile() { m_error = ""; #ifdef MIDI_DEBUG SVDEBUG << "MIDIFileReader::open() : fileName = " << m_fileName.c_str() << endl; #endif // Open the file m_midiFile = new ifstream(m_path.toLocal8Bit().data(), ios::in | ios::binary); if (!*m_midiFile) { m_error = "File not found or not readable."; m_format = MIDI_FILE_BAD_FORMAT; delete m_midiFile; m_midiFile = 0; return false; } bool retval = false; try { // Set file size so we can count it off // m_midiFile->seekg(0, ios::end); std::streamoff off = m_midiFile->tellg(); m_fileSize = 0; if (off > 0) m_fileSize = off; m_midiFile->seekg(0, ios::beg); // Parse the MIDI header first. The first 14 bytes of the file. if (!parseHeader(getMIDIBytes(14))) { m_format = MIDI_FILE_BAD_FORMAT; m_error = "Not a MIDI file."; goto done; } unsigned int i = 0; for (unsigned int j = 0; j < m_numberOfTracks; ++j) { #ifdef MIDI_DEBUG SVDEBUG << "Parsing Track " << j << endl; #endif if (!skipToNextTrack()) { #ifdef MIDI_DEBUG SVDEBUG << "Couldn't find Track " << j << endl; #endif m_error = "File corrupted or in non-standard format?"; m_format = MIDI_FILE_BAD_FORMAT; goto done; } #ifdef MIDI_DEBUG SVDEBUG << "Track has " << m_trackByteCount << " bytes" << endl; #endif // Run through the events taking them into our internal // representation. if (!parseTrack(i)) { #ifdef MIDI_DEBUG SVDEBUG << "Track " << j << " parsing failed" << endl; #endif m_error = "File corrupted or in non-standard format?"; m_format = MIDI_FILE_BAD_FORMAT; goto done; } ++i; // j is the source track number, i the destination } m_numberOfTracks = i; retval = true; } catch (MIDIException e) { SVDEBUG << "MIDIFileReader::open() - caught exception - " << e.what() << endl; m_error = e.what(); } done: m_midiFile->close(); delete m_midiFile; for (unsigned int track = 0; track < m_numberOfTracks; ++track) { // Convert the deltaTime to an absolute time since the track // start. The addTime method returns the sum of the current // MIDI Event delta time plus the argument. unsigned long acc = 0; for (MIDITrack::iterator i = m_midiComposition[track].begin(); i != m_midiComposition[track].end(); ++i) { acc = (*i)->addTime(acc); } if (consolidateNoteOffEvents(track)) { // returns true if some notes exist m_loadableTracks.insert(track); } } for (unsigned int track = 0; track < m_numberOfTracks; ++track) { updateTempoMap(track); } calculateTempoTimestamps(); return retval; } // Parse and ensure the MIDI Header is legitimate // bool MIDIFileReader::parseHeader(const string &midiHeader) { if (midiHeader.size() < 14) { #ifdef MIDI_DEBUG SVDEBUG << "MIDIFileReader::parseHeader() - file header undersized" << endl; #endif return false; } if (midiHeader.compare(0, 4, MIDI_FILE_HEADER) != 0) { #ifdef MIDI_DEBUG SVDEBUG << "MIDIFileReader::parseHeader()" << "- file header not found or malformed" << endl; #endif return false; } if (midiBytesToLong(midiHeader.substr(4,4)) != 6L) { #ifdef MIDI_DEBUG SVDEBUG << "MIDIFileReader::parseHeader()" << " - header length incorrect" << endl; #endif return false; } m_format = (MIDIFileFormatType) midiBytesToInt(midiHeader.substr(8,2)); m_numberOfTracks = midiBytesToInt(midiHeader.substr(10,2)); m_timingDivision = midiBytesToInt(midiHeader.substr(12,2)); if (m_timingDivision >= 32768) { m_smpte = true; m_fps = 256 - (m_timingDivision >> 8); m_subframes = (m_timingDivision & 0xff); } else { m_smpte = false; } return true; } // Extract the contents from a MIDI file track and places it into // our local map of MIDI events. // bool MIDIFileReader::parseTrack(unsigned int &lastTrackNum) { MIDIByte midiByte, metaEventCode, data1, data2; MIDIByte eventCode = 0x80; string metaMessage; long messageLength; long deltaTime; long accumulatedTime = 0; // The trackNum passed in to this method is the default track for // all events provided they're all on the same channel. If we find // events on more than one channel, we increment trackNum and record // the mapping from channel to trackNum in this channelTrackMap. // We then return the new trackNum by reference so the calling // method knows we've got more tracks than expected. // This would be a vector but we need -1 to indicate // "not yet used" vector channelTrackMap(16, -1); // This is used to store the last absolute time found on each track, // allowing us to modify delta-times correctly when separating events // out from one to multiple tracks // map trackTimeMap; // Meta-events don't have a channel, so we place them in a fixed // track number instead unsigned int metaTrack = lastTrackNum; // Remember the last non-meta status byte (-1 if we haven't seen one) int runningStatus = -1; bool firstTrack = true; while (!m_midiFile->eof() && (m_trackByteCount > 0)) { if (eventCode < 0x80) { #ifdef MIDI_DEBUG SVDEBUG << "WARNING: Invalid event code " << eventCode << " in MIDI file" << endl; #endif throw MIDIException(tr("Invalid event code %1 found").arg(int(eventCode))); } deltaTime = getNumberFromMIDIBytes(); #ifdef MIDI_DEBUG SVDEBUG << "read delta time " << deltaTime << endl; #endif // Get a single byte midiByte = getMIDIByte(); if (!(midiByte & MIDI_STATUS_BYTE_MASK)) { if (runningStatus < 0) { throw MIDIException(tr("Running status used for first event in track")); } eventCode = (MIDIByte)runningStatus; data1 = midiByte; #ifdef MIDI_DEBUG SVDEBUG << "using running status (byte " << int(midiByte) << " found)" << endl; #endif } else { #ifdef MIDI_DEBUG SVDEBUG << "have new event code " << int(midiByte) << endl; #endif eventCode = midiByte; data1 = getMIDIByte(); } if (eventCode == MIDI_FILE_META_EVENT) { metaEventCode = data1; messageLength = getNumberFromMIDIBytes(); //#ifdef MIDI_DEBUG SVDEBUG << "Meta event of type " << int(metaEventCode) << " and " << messageLength << " bytes found, putting on track " << metaTrack << endl; //#endif metaMessage = getMIDIBytes(messageLength); long gap = accumulatedTime - trackTimeMap[metaTrack]; accumulatedTime += deltaTime; deltaTime += gap; trackTimeMap[metaTrack] = accumulatedTime; MIDIEvent *e = new MIDIEvent(deltaTime, MIDI_FILE_META_EVENT, metaEventCode, metaMessage); m_midiComposition[metaTrack].push_back(e); if (metaEventCode == MIDI_TRACK_NAME) { m_trackNames[metaTrack] = metaMessage.c_str(); } } else { // non-meta events runningStatus = eventCode; MIDIEvent *midiEvent; int channel = (eventCode & MIDI_CHANNEL_NUM_MASK); if (channelTrackMap[channel] == -1) { if (!firstTrack) ++lastTrackNum; else firstTrack = false; channelTrackMap[channel] = lastTrackNum; } unsigned int trackNum = channelTrackMap[channel]; // accumulatedTime is abs time of last event on any track; // trackTimeMap[trackNum] is that of last event on this track long gap = accumulatedTime - trackTimeMap[trackNum]; accumulatedTime += deltaTime; deltaTime += gap; trackTimeMap[trackNum] = accumulatedTime; switch (eventCode & MIDI_MESSAGE_TYPE_MASK) { case MIDI_NOTE_ON: case MIDI_NOTE_OFF: case MIDI_POLY_AFTERTOUCH: case MIDI_CTRL_CHANGE: data2 = getMIDIByte(); // create and store our event midiEvent = new MIDIEvent(deltaTime, eventCode, data1, data2); /* SVDEBUG << "MIDI event for channel " << channel << " (track " << trackNum << ")" << endl; midiEvent->print(); */ m_midiComposition[trackNum].push_back(midiEvent); if (midiEvent->getChannelNumber() == MIDI_PERCUSSION_CHANNEL) { m_percussionTracks.insert(trackNum); } break; case MIDI_PITCH_BEND: data2 = getMIDIByte(); // create and store our event midiEvent = new MIDIEvent(deltaTime, eventCode, data1, data2); m_midiComposition[trackNum].push_back(midiEvent); break; case MIDI_PROG_CHANGE: case MIDI_CHNL_AFTERTOUCH: // create and store our event midiEvent = new MIDIEvent(deltaTime, eventCode, data1); m_midiComposition[trackNum].push_back(midiEvent); break; case MIDI_SYSTEM_EXCLUSIVE: messageLength = getNumberFromMIDIBytes(data1); #ifdef MIDI_DEBUG SVDEBUG << "SysEx of " << messageLength << " bytes found" << endl; #endif metaMessage= getMIDIBytes(messageLength); if (MIDIByte(metaMessage[metaMessage.length() - 1]) != MIDI_END_OF_EXCLUSIVE) { #ifdef MIDI_DEBUG SVDEBUG << "MIDIFileReader::parseTrack() - " << "malformed or unsupported SysEx type" << endl; #endif continue; } // chop off the EOX // length fixed by Pedro Lopez-Cabanillas (20030523) // metaMessage = metaMessage.substr(0, metaMessage.length()-1); midiEvent = new MIDIEvent(deltaTime, MIDI_SYSTEM_EXCLUSIVE, metaMessage); m_midiComposition[trackNum].push_back(midiEvent); break; default: #ifdef MIDI_DEBUG SVDEBUG << "MIDIFileReader::parseTrack()" << " - Unsupported MIDI Event Code: " << (int)eventCode << endl; #endif break; } } } if (lastTrackNum > metaTrack) { for (unsigned int track = metaTrack + 1; track <= lastTrackNum; ++track) { m_trackNames[track] = QString("%1 <%2>") .arg(m_trackNames[metaTrack]).arg(track - metaTrack + 1); } } return true; } // Delete dead NOTE OFF and NOTE ON/Zero Velocity Events after // reading them and modifying their relevant NOTE ONs. Return true // if there are some notes in this track. // bool MIDIFileReader::consolidateNoteOffEvents(unsigned int track) { bool notesOnTrack = false; bool noteOffFound; for (MIDITrack::iterator i = m_midiComposition[track].begin(); i != m_midiComposition[track].end(); i++) { if ((*i)->getMessageType() == MIDI_NOTE_ON && (*i)->getVelocity() > 0) { notesOnTrack = true; noteOffFound = false; for (MIDITrack::iterator j = i; j != m_midiComposition[track].end(); j++) { if (((*j)->getChannelNumber() == (*i)->getChannelNumber()) && ((*j)->getPitch() == (*i)->getPitch()) && ((*j)->getMessageType() == MIDI_NOTE_OFF || ((*j)->getMessageType() == MIDI_NOTE_ON && (*j)->getVelocity() == 0x00))) { (*i)->setDuration((*j)->getTime() - (*i)->getTime()); delete *j; m_midiComposition[track].erase(j); noteOffFound = true; break; } } // If no matching NOTE OFF has been found then set // Event duration to length of track // if (!noteOffFound) { MIDITrack::iterator j = m_midiComposition[track].end(); --j; (*i)->setDuration((*j)->getTime() - (*i)->getTime()); } } } return notesOnTrack; } // Add any tempo events found in the given track to the global tempo map. // void MIDIFileReader::updateTempoMap(unsigned int track) { SVDEBUG << "updateTempoMap for track " << track << " (" << m_midiComposition[track].size() << " events)" << endl; for (MIDITrack::iterator i = m_midiComposition[track].begin(); i != m_midiComposition[track].end(); ++i) { if ((*i)->isMeta() && (*i)->getMetaEventCode() == MIDI_SET_TEMPO) { MIDIByte m0 = (*i)->getMetaMessage()[0]; MIDIByte m1 = (*i)->getMetaMessage()[1]; MIDIByte m2 = (*i)->getMetaMessage()[2]; long tempo = (((m0 << 8) + m1) << 8) + m2; SVDEBUG << "updateTempoMap: have tempo, it's " << tempo << " at " << (*i)->getTime() << endl; if (tempo != 0) { double qpm = 60000000.0 / double(tempo); m_tempoMap[(*i)->getTime()] = TempoChange(RealTime::zeroTime, qpm); } } } } void MIDIFileReader::calculateTempoTimestamps() { unsigned long lastMIDITime = 0; RealTime lastRealTime = RealTime::zeroTime; double tempo = 120.0; int td = m_timingDivision; if (td == 0) td = 96; for (TempoMap::iterator i = m_tempoMap.begin(); i != m_tempoMap.end(); ++i) { unsigned long mtime = i->first; unsigned long melapsed = mtime - lastMIDITime; double quarters = double(melapsed) / double(td); double seconds = (60.0 * quarters) / tempo; RealTime t = lastRealTime + RealTime::fromSeconds(seconds); i->second.first = t; lastRealTime = t; lastMIDITime = mtime; tempo = i->second.second; } } RealTime MIDIFileReader::getTimeForMIDITime(unsigned long midiTime) const { unsigned long tempoMIDITime = 0; RealTime tempoRealTime = RealTime::zeroTime; double tempo = 120.0; TempoMap::const_iterator i = m_tempoMap.lower_bound(midiTime); if (i != m_tempoMap.begin()) { --i; tempoMIDITime = i->first; tempoRealTime = i->second.first; tempo = i->second.second; } int td = m_timingDivision; if (td == 0) td = 96; unsigned long melapsed = midiTime - tempoMIDITime; double quarters = double(melapsed) / double(td); double seconds = (60.0 * quarters) / tempo; /* SVDEBUG << "MIDIFileReader::getTimeForMIDITime(" << midiTime << ")" << endl; SVDEBUG << "timing division = " << td << endl; SVDEBUG << "nearest tempo event (of " << m_tempoMap.size() << ") is at " << tempoMIDITime << " (" << tempoRealTime << ")" << endl; SVDEBUG << "quarters since then = " << quarters << endl; SVDEBUG << "tempo = " << tempo << " quarters per minute" << endl; SVDEBUG << "seconds since then = " << seconds << endl; SVDEBUG << "resulting time = " << (tempoRealTime + RealTime::fromSeconds(seconds)) << endl; */ return tempoRealTime + RealTime::fromSeconds(seconds); } Model * MIDIFileReader::load() const { if (!isOK()) return 0; if (m_loadableTracks.empty()) { if (m_acquirer) { m_acquirer->showError (tr("MIDI file \"%1\" has no notes in any track").arg(m_path)); } return 0; } std::set tracksToLoad; if (m_loadableTracks.size() == 1) { tracksToLoad.insert(*m_loadableTracks.begin()); } else { QStringList displayNames; for (set::iterator i = m_loadableTracks.begin(); i != m_loadableTracks.end(); ++i) { unsigned int trackNo = *i; QString label; QString perc; if (m_percussionTracks.find(trackNo) != m_percussionTracks.end()) { perc = tr(" - uses GM percussion channel"); } if (m_trackNames.find(trackNo) != m_trackNames.end()) { label = tr("Track %1 (%2)%3") .arg(trackNo).arg(m_trackNames.find(trackNo)->second) .arg(perc); } else { label = tr("Track %1 (untitled)%3").arg(trackNo).arg(perc); } displayNames << label; } QString singleTrack; bool haveSomePercussion = (!m_percussionTracks.empty() && (m_percussionTracks.size() < m_loadableTracks.size())); MIDIFileImportPreferenceAcquirer::TrackPreference pref; if (m_acquirer) { pref = m_acquirer->getTrackImportPreference(displayNames, haveSomePercussion, singleTrack); } else { pref = MIDIFileImportPreferenceAcquirer::MergeAllTracks; } if (pref == MIDIFileImportPreferenceAcquirer::ImportNothing) return 0; if (pref == MIDIFileImportPreferenceAcquirer::MergeAllTracks || pref == MIDIFileImportPreferenceAcquirer::MergeAllNonPercussionTracks) { for (set::iterator i = m_loadableTracks.begin(); i != m_loadableTracks.end(); ++i) { if (pref == MIDIFileImportPreferenceAcquirer::MergeAllTracks || m_percussionTracks.find(*i) == m_percussionTracks.end()) { tracksToLoad.insert(*i); } } } else { int j = 0; for (set::iterator i = m_loadableTracks.begin(); i != m_loadableTracks.end(); ++i) { if (singleTrack == displayNames[j]) { tracksToLoad.insert(*i); break; } ++j; } } } if (tracksToLoad.empty()) return 0; int n = int(tracksToLoad.size()), count = 0; Model *model = 0; for (std::set::iterator i = tracksToLoad.begin(); i != tracksToLoad.end(); ++i) { int minProgress = (100 * count) / n; int progressAmount = 100 / n; model = loadTrack(*i, model, minProgress, progressAmount); ++count; } if (dynamic_cast(model)) { dynamic_cast(model)->setCompletion(100); } return model; } Model * MIDIFileReader::loadTrack(unsigned int trackToLoad, Model *existingModel, int minProgress, int progressAmount) const { if (m_midiComposition.find(trackToLoad) == m_midiComposition.end()) { return 0; } NoteModel *model = 0; if (existingModel) { model = dynamic_cast(existingModel); if (!model) { SVDEBUG << "WARNING: MIDIFileReader::loadTrack: Existing model given, but it isn't a NoteModel -- ignoring it" << endl; } } if (!model) { model = new NoteModel(m_mainModelSampleRate, 1, 0.0, 0.0, false); model->setValueQuantization(1.0); model->setObjectName(QFileInfo(m_path).fileName()); } const MIDITrack &track = m_midiComposition.find(trackToLoad)->second; int totalEvents = int(track.size()); int count = 0; bool sharpKey = true; for (MIDITrack::const_iterator i = track.begin(); i != track.end(); ++i) { RealTime rt; unsigned long midiTime = (*i)->getTime(); if (m_smpte) { rt = RealTime::frame2RealTime(midiTime, m_fps * m_subframes); } else { rt = getTimeForMIDITime(midiTime); } // We ignore most of these event types for now, though in // theory some of the text ones could usefully be incorporated if ((*i)->isMeta()) { switch((*i)->getMetaEventCode()) { case MIDI_KEY_SIGNATURE: // minorKey = (int((*i)->getMetaMessage()[1]) != 0); sharpKey = (int((*i)->getMetaMessage()[0]) >= 0); break; case MIDI_TEXT_EVENT: case MIDI_LYRIC: case MIDI_TEXT_MARKER: case MIDI_COPYRIGHT_NOTICE: case MIDI_TRACK_NAME: // The text events that we could potentially use break; case MIDI_SET_TEMPO: // Already dealt with in a separate pass previously break; case MIDI_TIME_SIGNATURE: // Not yet! break; case MIDI_SEQUENCE_NUMBER: case MIDI_CHANNEL_PREFIX_OR_PORT: case MIDI_INSTRUMENT_NAME: case MIDI_CUE_POINT: case MIDI_CHANNEL_PREFIX: case MIDI_SEQUENCER_SPECIFIC: case MIDI_SMPTE_OFFSET: default: break; } } else { switch ((*i)->getMessageType()) { case MIDI_NOTE_ON: if ((*i)->getVelocity() == 0) break; // effective note-off else { RealTime endRT; unsigned long endMidiTime = (*i)->getTime() + (*i)->getDuration(); if (m_smpte) { endRT = RealTime::frame2RealTime(endMidiTime, m_fps * m_subframes); } else { endRT = getTimeForMIDITime(endMidiTime); } long startFrame = RealTime::realTime2Frame (rt, model->getSampleRate()); long endFrame = RealTime::realTime2Frame (endRT, model->getSampleRate()); QString pitchLabel = Pitch::getPitchLabel((*i)->getPitch(), 0, !sharpKey); QString noteLabel = tr("%1 - vel %2") .arg(pitchLabel).arg(int((*i)->getVelocity())); float level = float((*i)->getVelocity()) / 128.f; Note note(startFrame, (*i)->getPitch(), endFrame - startFrame, level, noteLabel); // SVDEBUG << "Adding note " << startFrame << "," << (endFrame-startFrame) << " : " << int((*i)->getPitch()) << endl; model->addPoint(note); break; } case MIDI_PITCH_BEND: // I guess we could make some use of this... break; case MIDI_NOTE_OFF: case MIDI_PROG_CHANGE: case MIDI_CTRL_CHANGE: case MIDI_SYSTEM_EXCLUSIVE: case MIDI_POLY_AFTERTOUCH: case MIDI_CHNL_AFTERTOUCH: break; default: break; } } model->setCompletion(minProgress + (count * progressAmount) / totalEvents); ++count; } return model; } sonic-visualiser-3.0.3/svcore/data/fileio/MIDIFileReader.h0000644000000000000000000000764013111512442021442 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Richard Bown and Chris Cannam. */ #ifndef SV_MIDI_FILE_READER_H #define SV_MIDI_FILE_READER_H #include "DataFileReader.h" #include "base/RealTime.h" #include #include #include #include class MIDIEvent; typedef unsigned char MIDIByte; class MIDIFileImportPreferenceAcquirer // welcome to our grand marble foyer { public: enum TrackPreference { ImportNothing, ImportSingleTrack, MergeAllTracks, MergeAllNonPercussionTracks }; virtual ~MIDIFileImportPreferenceAcquirer() { } virtual TrackPreference getTrackImportPreference (QStringList trackNames, bool haveSomePercussion, QString &singleTrack) const = 0; virtual void showError(QString error) = 0; }; class MIDIFileReader : public DataFileReader { Q_OBJECT public: MIDIFileReader(QString path, MIDIFileImportPreferenceAcquirer *pref, // may be null sv_samplerate_t mainModelSampleRate); virtual ~MIDIFileReader(); virtual bool isOK() const; virtual QString getError() const; virtual Model *load() const; protected: typedef std::vector MIDITrack; typedef std::map MIDIComposition; typedef std::pair TempoChange; // time, qpm typedef std::map TempoMap; // key is MIDI time typedef enum { MIDI_SINGLE_TRACK_FILE = 0x00, MIDI_SIMULTANEOUS_TRACK_FILE = 0x01, MIDI_SEQUENTIAL_TRACK_FILE = 0x02, MIDI_FILE_BAD_FORMAT = 0xFF } MIDIFileFormatType; bool parseFile(); bool parseHeader(const std::string &midiHeader); bool parseTrack(unsigned int &trackNum); Model *loadTrack(unsigned int trackNum, Model *existingModel = 0, int minProgress = 0, int progressAmount = 100) const; bool consolidateNoteOffEvents(unsigned int track); void updateTempoMap(unsigned int track); void calculateTempoTimestamps(); RealTime getTimeForMIDITime(unsigned long midiTime) const; // Internal convenience functions // int midiBytesToInt(const std::string &bytes); long midiBytesToLong(const std::string &bytes); long getNumberFromMIDIBytes(int firstByte = -1); MIDIByte getMIDIByte(); std::string getMIDIBytes(unsigned long bytes); bool skipToNextTrack(); bool m_smpte; int m_timingDivision; // pulses per quarter note int m_fps; // if smpte int m_subframes; // if smpte MIDIFileFormatType m_format; unsigned int m_numberOfTracks; long m_trackByteCount; bool m_decrementCount; std::map m_trackNames; std::set m_loadableTracks; std::set m_percussionTracks; MIDIComposition m_midiComposition; TempoMap m_tempoMap; QString m_path; std::ifstream *m_midiFile; size_t m_fileSize; QString m_error; sv_samplerate_t m_mainModelSampleRate; MIDIFileImportPreferenceAcquirer *m_acquirer; }; #endif // _MIDI_FILE_READER_H_ sonic-visualiser-3.0.3/svcore/data/fileio/MIDIFileWriter.cpp0000644000000000000000000002613413111512442022046 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2007 Richard Bown and Chris Cannam and copyright 2007 QMUL. */ #include "MIDIFileWriter.h" #include "data/midi/MIDIEvent.h" #include "model/NoteData.h" #include "base/Pitch.h" #include #include #include //#define DEBUG_MIDI_FILE_WRITER 1 using std::ofstream; using std::string; using std::ios; using namespace MIDIConstants; MIDIFileWriter::MIDIFileWriter(QString path, const NoteExportable *exportable, sv_samplerate_t sampleRate, float tempo) : m_path(path), m_exportable(exportable), m_sampleRate(sampleRate), m_tempo(tempo), m_midiFile(0) { if (!convert()) { m_error = "Conversion from model to internal MIDI format failed"; } } MIDIFileWriter::~MIDIFileWriter() { for (MIDIComposition::iterator i = m_midiComposition.begin(); i != m_midiComposition.end(); ++i) { for (MIDITrack::iterator j = i->second.begin(); j != i->second.end(); ++j) { delete *j; } i->second.clear(); } m_midiComposition.clear(); } bool MIDIFileWriter::isOK() const { return m_error == ""; } QString MIDIFileWriter::getError() const { return m_error; } void MIDIFileWriter::write() { writeComposition(); } string MIDIFileWriter::intToMIDIBytes(int number) const { MIDIByte upper; MIDIByte lower; upper = MIDIByte((number & 0xFF00) >> 8); lower = MIDIByte( number & 0x00FF); string rv; rv += upper; rv += lower; return rv; } string MIDIFileWriter::longToMIDIBytes(unsigned long number) const { MIDIByte upper1; MIDIByte lower1; MIDIByte upper2; MIDIByte lower2; upper1 = MIDIByte((number & 0xff000000) >> 24); lower1 = MIDIByte((number & 0x00ff0000) >> 16); upper2 = MIDIByte((number & 0x0000ff00) >> 8); lower2 = MIDIByte((number & 0x000000ff)); string rv; rv += upper1; rv += lower1; rv += upper2; rv += lower2; return rv; } // Turn a delta time into a MIDI time - overlapping into // a maximum of four bytes using the MSB as the carry on // flag. // string MIDIFileWriter::longToVarBuffer(unsigned long number) const { string rv; long inNumber = number; long outNumber; // get the lowest 7 bits of the number outNumber = number & 0x7f; // Shift and test and move the numbers // on if we need them - setting the MSB // as we go. // while ((inNumber >>= 7 ) > 0) { outNumber <<= 8; outNumber |= 0x80; outNumber += (inNumber & 0x7f); } // Now move the converted number out onto the buffer // while (true) { rv += (MIDIByte)(outNumber & 0xff); if (outNumber & 0x80) outNumber >>= 8; else break; } return rv; } bool MIDIFileWriter::writeHeader() { *m_midiFile << MIDI_FILE_HEADER; // Number of bytes in header *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) 0x06; // File format *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) m_format; *m_midiFile << intToMIDIBytes(m_numberOfTracks); *m_midiFile << intToMIDIBytes(m_timingDivision); return true; } bool MIDIFileWriter::writeTrack(int trackNumber) { bool retOK = true; MIDIByte eventCode = 0; MIDITrack::iterator midiEvent; // First we write into the trackBuffer, then write it out to the // file with its accompanying length. // string trackBuffer; for (midiEvent = m_midiComposition[trackNumber].begin(); midiEvent != m_midiComposition[trackNumber].end(); midiEvent++) { // Write the time to the buffer in MIDI format trackBuffer += longToVarBuffer((*midiEvent)->getTime()); if ((*midiEvent)->isMeta()) { trackBuffer += MIDI_FILE_META_EVENT; trackBuffer += (*midiEvent)->getMetaEventCode(); // Variable length number field trackBuffer += longToVarBuffer((*midiEvent)-> getMetaMessage().length()); trackBuffer += (*midiEvent)->getMetaMessage(); } else { // Send the normal event code (with encoded channel information) if (((*midiEvent)->getEventCode() != eventCode) || ((*midiEvent)->getEventCode() == MIDI_SYSTEM_EXCLUSIVE)) { trackBuffer += (*midiEvent)->getEventCode(); eventCode = (*midiEvent)->getEventCode(); } // Send the relevant data // switch ((*midiEvent)->getMessageType()) { case MIDI_NOTE_ON: case MIDI_NOTE_OFF: case MIDI_POLY_AFTERTOUCH: trackBuffer += (*midiEvent)->getData1(); trackBuffer += (*midiEvent)->getData2(); break; case MIDI_CTRL_CHANGE: trackBuffer += (*midiEvent)->getData1(); trackBuffer += (*midiEvent)->getData2(); break; case MIDI_PROG_CHANGE: trackBuffer += (*midiEvent)->getData1(); break; case MIDI_CHNL_AFTERTOUCH: trackBuffer += (*midiEvent)->getData1(); break; case MIDI_PITCH_BEND: trackBuffer += (*midiEvent)->getData1(); trackBuffer += (*midiEvent)->getData2(); break; case MIDI_SYSTEM_EXCLUSIVE: // write out message length trackBuffer += longToVarBuffer((*midiEvent)->getMetaMessage().length()); // now the message trackBuffer += (*midiEvent)->getMetaMessage(); break; default: break; } } } // Now we write the track - First the standard header.. // *m_midiFile << MIDI_TRACK_HEADER; // ..now the length of the buffer.. // *m_midiFile << longToMIDIBytes((long)trackBuffer.length()); // ..then the buffer itself.. // *m_midiFile << trackBuffer; return retOK; } bool MIDIFileWriter::writeComposition() { bool retOK = true; m_midiFile = new ofstream(m_path.toLocal8Bit().data(), ios::out | ios::binary); if (!(*m_midiFile)) { m_error = "Can't open file for writing."; delete m_midiFile; m_midiFile = 0; return false; } if (!writeHeader()) { retOK = false; } for (unsigned int i = 0; i < m_numberOfTracks; i++) { if (!writeTrack(i)) { retOK = false; } } m_midiFile->close(); delete m_midiFile; m_midiFile = 0; if (!retOK) { m_error = "MIDI file write failed"; } return retOK; } bool MIDIFileWriter::convert() { m_timingDivision = 480; m_format = MIDI_SINGLE_TRACK_FILE; m_numberOfTracks = 1; int track = 0; MIDIEvent *event; event = new MIDIEvent (0, MIDI_FILE_META_EVENT, MIDI_CUE_POINT, ("Exported from " + qApp->applicationName()).toStdString()); m_midiComposition[track].push_back(event); long tempoValue = long(60000000.0 / m_tempo + 0.01); string tempoString; tempoString += (MIDIByte)(tempoValue >> 16 & 0xFF); tempoString += (MIDIByte)(tempoValue >> 8 & 0xFF); tempoString += (MIDIByte)(tempoValue & 0xFF); event = new MIDIEvent(0, MIDI_FILE_META_EVENT, MIDI_SET_TEMPO, tempoString); m_midiComposition[track].push_back(event); // Omit time signature NoteList notes = m_exportable->getNotes(); for (NoteList::const_iterator i = notes.begin(); i != notes.end(); ++i) { sv_frame_t frame = i->start; sv_frame_t duration = i->duration; int pitch = i->midiPitch; int velocity = i->velocity; int channel = i->channel; if (pitch < 0) pitch = 0; if (pitch > 127) pitch = 127; if (channel < 0) channel = 0; if (channel > 15) channel = 0; // Convert frame to MIDI time double seconds = double(frame) / m_sampleRate; double quarters = (seconds * m_tempo) / 60.0; unsigned long midiTime = int(quarters * m_timingDivision + 0.5); // Get the sounding time for the matching NOTE_OFF seconds = double(frame + duration) / m_sampleRate; quarters = (seconds * m_tempo) / 60.0; unsigned long endTime = int(quarters * m_timingDivision + 0.5); // At this point all the notes we insert have absolute times // in the delta time fields. We resolve these into delta // times further down (can't do it until all the note offs are // in place). event = new MIDIEvent(midiTime, MIDI_NOTE_ON | channel, pitch, velocity); m_midiComposition[track].push_back(event); event = new MIDIEvent(endTime, MIDI_NOTE_OFF | channel, pitch, 127); // loudest silence you can muster m_midiComposition[track].push_back(event); #ifdef DEBUG_MIDI_FILE_WRITER cerr << "midiTime = " << midiTime << ", endTime = " << endTime << endl; #endif } // Now gnash through the MIDI events and turn the absolute times // into delta times. // for (unsigned int i = 0; i < m_numberOfTracks; i++) { unsigned long lastMidiTime = 0; // First sort the track with the MIDIEvent comparator. Use // stable_sort so that events with equal times are maintained // in their current order. // std::stable_sort(m_midiComposition[i].begin(), m_midiComposition[i].end(), MIDIEventCmp()); for (MIDITrack::iterator it = m_midiComposition[i].begin(); it != m_midiComposition[i].end(); it++) { unsigned long deltaTime = (*it)->getTime() - lastMidiTime; #ifdef DEBUG_MIDI_FILE_WRITER cerr << "time = " << (*it)->getTime() << ", lastMidiTime = " << lastMidiTime << ", deltaTime = " << deltaTime << endl; #endif lastMidiTime = (*it)->getTime(); (*it)->setTime(deltaTime); } // Insert end of track event (delta time = 0) // event = new MIDIEvent(0, MIDI_FILE_META_EVENT, MIDI_END_OF_TRACK, ""); m_midiComposition[i].push_back(event); } return true; } sonic-visualiser-3.0.3/svcore/data/fileio/MIDIFileWriter.h0000644000000000000000000000524413111512442021512 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2007 Richard Bown and Chris Cannam and copyright 2007 QMUL. */ #ifndef _MIDI_FILE_WRITER_H_ #define _MIDI_FILE_WRITER_H_ #include "base/RealTime.h" #include "base/BaseTypes.h" #include #include #include #include class MIDIEvent; class NoteExportable; /** * Write a MIDI file. This includes file write code for generic * simultaneous-track MIDI files, but the conversion stage only * supports a single-track MIDI file with fixed tempo, time signature * and timing division. */ class MIDIFileWriter { public: MIDIFileWriter(QString path, const NoteExportable *exportable, sv_samplerate_t sampleRate, // used to convert exportable sample timings float tempo = 120.f); virtual ~MIDIFileWriter(); virtual bool isOK() const; virtual QString getError() const; virtual void write(); protected: typedef std::vector MIDITrack; typedef std::map MIDIComposition; typedef enum { MIDI_SINGLE_TRACK_FILE = 0x00, MIDI_SIMULTANEOUS_TRACK_FILE = 0x01, MIDI_SEQUENTIAL_TRACK_FILE = 0x02, MIDI_FILE_BAD_FORMAT = 0xFF } MIDIFileFormatType; std::string intToMIDIBytes(int number) const; std::string longToMIDIBytes(unsigned long number) const; std::string longToVarBuffer(unsigned long number) const; unsigned long getMIDITimeForTime(RealTime t) const; bool writeHeader(); bool writeTrack(int track); bool writeComposition(); bool convert(); QString m_path; const NoteExportable *m_exportable; sv_samplerate_t m_sampleRate; float m_tempo; int m_timingDivision; // pulses per quarter note MIDIFileFormatType m_format; unsigned int m_numberOfTracks; MIDIComposition m_midiComposition; std::ofstream *m_midiFile; QString m_error; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/MP3FileReader.cpp0000644000000000000000000004441513111512442021653 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_MAD #include "MP3FileReader.h" #include "base/ProgressReporter.h" #include "system/System.h" #include #include #include #include #include #ifdef HAVE_ID3TAG #include #endif #ifdef _WIN32 #include #include #else #include #include #endif #include #include using std::string; static sv_frame_t DEFAULT_DECODER_DELAY = 529; MP3FileReader::MP3FileReader(FileSource source, DecodeMode decodeMode, CacheMode mode, GaplessMode gaplessMode, sv_samplerate_t targetRate, bool normalised, ProgressReporter *reporter) : CodedAudioFileReader(mode, targetRate, normalised), m_source(source), m_path(source.getLocalFilename()), m_gaplessMode(gaplessMode), m_decodeErrorShown(false), m_decodeThread(0) { SVDEBUG << "MP3FileReader: local path: \"" << m_path << "\", decode mode: " << decodeMode << " (" << (decodeMode == DecodeAtOnce ? "DecodeAtOnce" : "DecodeThreaded") << ")" << endl; m_channelCount = 0; m_fileRate = 0; m_fileSize = 0; m_bitrateNum = 0; m_bitrateDenom = 0; m_cancelled = false; m_mp3FrameCount = 0; m_completion = 0; m_done = false; m_reporter = reporter; if (m_gaplessMode == GaplessMode::Gapless) { CodedAudioFileReader::setFramesToTrim(DEFAULT_DECODER_DELAY, 0); } m_fileSize = 0; m_fileBuffer = 0; m_fileBufferSize = 0; m_sampleBuffer = 0; m_sampleBufferSize = 0; QFile qfile(m_path); if (!qfile.open(QIODevice::ReadOnly)) { m_error = QString("Failed to open file %1 for reading.").arg(m_path); SVDEBUG << "MP3FileReader: " << m_error << endl; return; } m_fileSize = qfile.size(); try { // We need a mysterious MAD_BUFFER_GUARD (== 8) zero bytes at // end of input, to ensure libmad decodes the last frame // correctly. Otherwise the decoded audio is truncated. SVDEBUG << "file size = " << m_fileSize << ", buffer guard = " << MAD_BUFFER_GUARD << endl; m_fileBufferSize = m_fileSize + MAD_BUFFER_GUARD; m_fileBuffer = new unsigned char[m_fileBufferSize]; memset(m_fileBuffer + m_fileSize, 0, MAD_BUFFER_GUARD); } catch (...) { m_error = QString("Out of memory"); SVDEBUG << "MP3FileReader: " << m_error << endl; return; } auto amountRead = qfile.read(reinterpret_cast(m_fileBuffer), m_fileSize); if (amountRead < m_fileSize) { SVCERR << QString("MP3FileReader::MP3FileReader: Warning: reached EOF after only %1 of %2 bytes") .arg(amountRead).arg(m_fileSize) << endl; memset(m_fileBuffer + amountRead, 0, m_fileSize - amountRead); m_fileSize = amountRead; } loadTags(qfile.handle()); qfile.close(); if (decodeMode == DecodeAtOnce) { if (m_reporter) { connect(m_reporter, SIGNAL(cancelled()), this, SLOT(cancelled())); m_reporter->setMessage (tr("Decoding %1...").arg(QFileInfo(m_path).fileName())); } if (!decode(m_fileBuffer, m_fileBufferSize)) { m_error = QString("Failed to decode file %1.").arg(m_path); } if (m_sampleBuffer) { for (int c = 0; c < m_channelCount; ++c) { delete[] m_sampleBuffer[c]; } delete[] m_sampleBuffer; m_sampleBuffer = 0; } delete[] m_fileBuffer; m_fileBuffer = 0; if (isDecodeCacheInitialised()) finishDecodeCache(); endSerialised(); } else { if (m_reporter) m_reporter->setProgress(100); m_decodeThread = new DecodeThread(this); m_decodeThread->start(); while ((m_channelCount == 0 || m_fileRate == 0 || m_sampleRate == 0) && !m_done) { usleep(10); } SVDEBUG << "MP3FileReader: decoding startup complete, file rate = " << m_fileRate << endl; } if (m_error != "") { SVDEBUG << "MP3FileReader::MP3FileReader(\"" << m_path << "\"): ERROR: " << m_error << endl; } } MP3FileReader::~MP3FileReader() { if (m_decodeThread) { m_cancelled = true; m_decodeThread->wait(); delete m_decodeThread; } } void MP3FileReader::cancelled() { m_cancelled = true; } void MP3FileReader::loadTags(int fd) { m_title = ""; #ifdef HAVE_ID3TAG #ifdef _WIN32 int id3fd = _dup(fd); #else int id3fd = dup(fd); #endif id3_file *file = id3_file_fdopen(id3fd, ID3_FILE_MODE_READONLY); if (!file) return; // We can do this a lot more elegantly, but we'll leave that for // when we implement support for more than just the one tag! id3_tag *tag = id3_file_tag(file); if (!tag) { SVDEBUG << "MP3FileReader::loadTags: No ID3 tag found" << endl; id3_file_close(file); // also closes our dup'd fd return; } m_title = loadTag(tag, "TIT2"); // work title if (m_title == "") m_title = loadTag(tag, "TIT1"); if (m_title == "") SVDEBUG << "MP3FileReader::loadTags: No title found" << endl; m_maker = loadTag(tag, "TPE1"); // "lead artist" if (m_maker == "") m_maker = loadTag(tag, "TPE2"); if (m_maker == "") SVDEBUG << "MP3FileReader::loadTags: No artist/maker found" << endl; for (unsigned int i = 0; i < tag->nframes; ++i) { if (tag->frames[i]) { QString value = loadTag(tag, tag->frames[i]->id); if (value != "") { m_tags[tag->frames[i]->id] = value; } } } id3_file_close(file); // also closes our dup'd fd #else SVDEBUG << "MP3FileReader::loadTags: ID3 tag support not compiled in" << endl; #endif } QString MP3FileReader::loadTag(void *vtag, const char *name) { #ifdef HAVE_ID3TAG id3_tag *tag = (id3_tag *)vtag; id3_frame *frame = id3_tag_findframe(tag, name, 0); if (!frame) { SVDEBUG << "MP3FileReader::loadTag: No \"" << name << "\" frame found in ID3 tag" << endl; return ""; } if (frame->nfields < 2) { cerr << "MP3FileReader::loadTag: WARNING: Not enough fields (" << frame->nfields << ") for \"" << name << "\" in ID3 tag" << endl; return ""; } unsigned int nstrings = id3_field_getnstrings(&frame->fields[1]); if (nstrings == 0) { SVDEBUG << "MP3FileReader::loadTag: No strings for \"" << name << "\" in ID3 tag" << endl; return ""; } id3_ucs4_t const *ustr = id3_field_getstrings(&frame->fields[1], 0); if (!ustr) { SVDEBUG << "MP3FileReader::loadTag: Invalid or absent data for \"" << name << "\" in ID3 tag" << endl; return ""; } id3_utf8_t *u8str = id3_ucs4_utf8duplicate(ustr); if (!u8str) { SVDEBUG << "MP3FileReader::loadTag: ERROR: Internal error: Failed to convert UCS4 to UTF8 in ID3 tag" << endl; return ""; } QString rv = QString::fromUtf8((const char *)u8str); free(u8str); SVDEBUG << "MP3FileReader::loadTag: Tag \"" << name << "\" -> \"" << rv << "\"" << endl; return rv; #else return ""; #endif } void MP3FileReader::DecodeThread::run() { if (!m_reader->decode(m_reader->m_fileBuffer, m_reader->m_fileBufferSize)) { m_reader->m_error = QString("Failed to decode file %1.").arg(m_reader->m_path); } delete[] m_reader->m_fileBuffer; m_reader->m_fileBuffer = 0; if (m_reader->m_sampleBuffer) { for (int c = 0; c < m_reader->m_channelCount; ++c) { delete[] m_reader->m_sampleBuffer[c]; } delete[] m_reader->m_sampleBuffer; m_reader->m_sampleBuffer = 0; } if (m_reader->isDecodeCacheInitialised()) m_reader->finishDecodeCache(); m_reader->m_done = true; m_reader->m_completion = 100; m_reader->endSerialised(); } bool MP3FileReader::decode(void *mm, sv_frame_t sz) { DecoderData data; struct mad_decoder decoder; data.start = (unsigned char const *)mm; data.length = sz; data.finished = false; data.reader = this; mad_decoder_init(&decoder, // decoder to initialise &data, // our own data block for callbacks input_callback, // provides (entire) input to mad 0, // checks header filter_callback, // filters frame before decoding output_callback, // receives decoded output error_callback, // handles decode errors 0); // "message_func" mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); mad_decoder_finish(&decoder); SVDEBUG << "MP3FileReader: Decoding complete, decoded " << m_mp3FrameCount << " mp3 frames" << endl; m_done = true; return true; } enum mad_flow MP3FileReader::input_callback(void *dp, struct mad_stream *stream) { DecoderData *data = (DecoderData *)dp; if (!data->length) { data->finished = true; return MAD_FLOW_STOP; } unsigned char const *start = data->start; sv_frame_t length = data->length; #ifdef HAVE_ID3TAG while (length > ID3_TAG_QUERYSIZE) { ssize_t taglen = id3_tag_query(start, ID3_TAG_QUERYSIZE); if (taglen <= 0) { break; } SVDEBUG << "MP3FileReader: ID3 tag length to skip: " << taglen << endl; start += taglen; length -= taglen; } #endif mad_stream_buffer(stream, start, length); data->length = 0; return MAD_FLOW_CONTINUE; } enum mad_flow MP3FileReader::filter_callback(void *dp, struct mad_stream const *stream, struct mad_frame *frame) { DecoderData *data = (DecoderData *)dp; return data->reader->filter(stream, frame); } static string toMagic(unsigned long fourcc) { string magic("...."); for (int i = 0; i < 4; ++i) { magic[3-i] = char((fourcc >> (8*i)) & 0xff); } return magic; } enum mad_flow MP3FileReader::filter(struct mad_stream const *stream, struct mad_frame *) { if (m_mp3FrameCount > 0) { // only handle info frame if it appears as first mp3 frame return MAD_FLOW_CONTINUE; } if (m_gaplessMode == GaplessMode::Gappy) { // Our non-gapless mode does not even filter out the Xing/LAME // frame. That's because the main reason non-gapless mode // exists is for backward compatibility with MP3FileReader // behaviour before the gapless support was added, so we even // need to keep the spurious 1152 samples resulting from // feeding Xing/LAME frame to the decoder as otherwise we'd // have different output from before. SVDEBUG << "MP3FileReader: Not gapless mode, not checking Xing/LAME frame" << endl; return MAD_FLOW_CONTINUE; } struct mad_bitptr ptr = stream->anc_ptr; string magic = toMagic(mad_bit_read(&ptr, 32)); if (magic == "Xing" || magic == "Info") { SVDEBUG << "MP3FileReader: Found Xing/LAME metadata frame (magic = \"" << magic << "\")" << endl; // All we want at this point is the LAME encoder delay and // padding values. We expect to see the Xing/Info magic (which // we've already read), then 116 bytes of Xing data, then LAME // magic, 5 byte version string, 12 bytes of LAME data that we // aren't currently interested in, then the delays encoded as // two 12-bit numbers into three bytes. // // (See gabriel.mp3-tech.org/mp3infotag.html) for (int skip = 0; skip < 116; ++skip) { (void)mad_bit_read(&ptr, 8); } magic = toMagic(mad_bit_read(&ptr, 32)); if (magic == "LAME") { SVDEBUG << "MP3FileReader: Found LAME-specific metadata" << endl; for (int skip = 0; skip < 5 + 12; ++skip) { (void)mad_bit_read(&ptr, 8); } auto delay = mad_bit_read(&ptr, 12); auto padding = mad_bit_read(&ptr, 12); sv_frame_t delayToDrop = DEFAULT_DECODER_DELAY + delay; sv_frame_t paddingToDrop = padding - DEFAULT_DECODER_DELAY; if (paddingToDrop < 0) paddingToDrop = 0; SVDEBUG << "MP3FileReader: LAME encoder delay = " << delay << ", padding = " << padding << endl; SVDEBUG << "MP3FileReader: Will be trimming " << delayToDrop << " samples from start and " << paddingToDrop << " from end" << endl; CodedAudioFileReader::setFramesToTrim(delayToDrop, paddingToDrop); } else { SVDEBUG << "MP3FileReader: Xing frame has no LAME metadata" << endl; } return MAD_FLOW_IGNORE; } else { return MAD_FLOW_CONTINUE; } } enum mad_flow MP3FileReader::output_callback(void *dp, struct mad_header const *header, struct mad_pcm *pcm) { DecoderData *data = (DecoderData *)dp; return data->reader->accept(header, pcm); } enum mad_flow MP3FileReader::accept(struct mad_header const *header, struct mad_pcm *pcm) { int channels = pcm->channels; int frames = pcm->length; if (header) { m_bitrateNum = m_bitrateNum + double(header->bitrate); m_bitrateDenom ++; } if (frames < 1) return MAD_FLOW_CONTINUE; if (m_channelCount == 0) { m_fileRate = pcm->samplerate; m_channelCount = channels; SVDEBUG << "MP3FileReader::accept: file rate = " << pcm->samplerate << ", channel count = " << channels << ", about to init " << "decode cache" << endl; initialiseDecodeCache(); if (m_cacheMode == CacheInTemporaryFile) { // SVDEBUG << "MP3FileReader::accept: channel count " << m_channelCount << ", file rate " << m_fileRate << ", about to start serialised section" << endl; startSerialised("MP3FileReader::Decode"); } } if (m_bitrateDenom > 0) { double bitrate = m_bitrateNum / m_bitrateDenom; double duration = double(m_fileSize * 8) / bitrate; double elapsed = double(m_frameCount) / m_sampleRate; double percent = 100; if (duration > 0.0) percent = ((elapsed * 100.0) / duration); int p = int(percent); if (p < 1) p = 1; if (p > 99) p = 99; if (m_completion != p && m_reporter) { m_completion = p; m_reporter->setProgress(m_completion); } } if (m_cancelled) { SVDEBUG << "MP3FileReader: Decoding cancelled" << endl; return MAD_FLOW_STOP; } if (!isDecodeCacheInitialised()) { SVDEBUG << "MP3FileReader::accept: fallback case: file rate = " << pcm->samplerate << ", channel count = " << channels << ", about to init " << "decode cache" << endl; initialiseDecodeCache(); } if (m_sampleBufferSize < size_t(frames)) { if (!m_sampleBuffer) { m_sampleBuffer = new float *[channels]; for (int c = 0; c < channels; ++c) { m_sampleBuffer[c] = 0; } } for (int c = 0; c < channels; ++c) { delete[] m_sampleBuffer[c]; m_sampleBuffer[c] = new float[frames]; } m_sampleBufferSize = frames; } int activeChannels = int(sizeof(pcm->samples) / sizeof(pcm->samples[0])); for (int ch = 0; ch < channels; ++ch) { for (int i = 0; i < frames; ++i) { mad_fixed_t sample = 0; if (ch < activeChannels) { sample = pcm->samples[ch][i]; } float fsample = float(sample) / float(MAD_F_ONE); m_sampleBuffer[ch][i] = fsample; } } addSamplesToDecodeCache(m_sampleBuffer, frames); ++m_mp3FrameCount; return MAD_FLOW_CONTINUE; } enum mad_flow MP3FileReader::error_callback(void *dp, struct mad_stream *stream, struct mad_frame *) { DecoderData *data = (DecoderData *)dp; sv_frame_t ix = stream->this_frame - data->start; if (stream->error == MAD_ERROR_LOSTSYNC && (data->finished || ix >= data->length)) { // We are at end of file, losing sync is expected behaviour, // don't report it return MAD_FLOW_CONTINUE; } if (!data->reader->m_decodeErrorShown) { char buffer[256]; snprintf(buffer, 255, "MP3 decoding error 0x%04x (%s) at byte offset %lld", stream->error, mad_stream_errorstr(stream), (long long int)ix); SVCERR << "Warning: in file \"" << data->reader->m_path << "\": " << buffer << " (continuing; will not report any further decode errors for this file)" << endl; data->reader->m_decodeErrorShown = true; } return MAD_FLOW_CONTINUE; } void MP3FileReader::getSupportedExtensions(std::set &extensions) { extensions.insert("mp3"); } bool MP3FileReader::supportsExtension(QString extension) { std::set extensions; getSupportedExtensions(extensions); return (extensions.find(extension.toLower()) != extensions.end()); } bool MP3FileReader::supportsContentType(QString type) { return (type == "audio/mpeg"); } bool MP3FileReader::supports(FileSource &source) { return (supportsExtension(source.getExtension()) || supportsContentType(source.getContentType())); } #endif sonic-visualiser-3.0.3/svcore/data/fileio/MP3FileReader.h0000644000000000000000000001173113111512442021313 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MP3_FILE_READER_H_ #define _MP3_FILE_READER_H_ #ifdef HAVE_MAD #include "CodedAudioFileReader.h" #include "base/Thread.h" #include #include class ProgressReporter; class MP3FileReader : public CodedAudioFileReader { Q_OBJECT public: /** * How the MP3FileReader should handle leading and trailing gaps. * See http://lame.sourceforge.net/tech-FAQ.txt for a technical * explanation of the numbers here. */ enum class GaplessMode { /** * Trim unwanted samples from the start and end of the decoded * audio. From the start, trim a number of samples equal to * the decoder delay (a fixed 529 samples) plus any encoder * delay that may be specified in Xing/LAME metadata. From the * end, trim any padding specified in Xing/LAME metadata, less * the fixed decoder delay. This usually results in "gapless" * audio, i.e. with no spurious zero padding at either end. */ Gapless, /** * Do not trim any samples. Also do not suppress any frames * from being passed to the mp3 decoder, even Xing/LAME * metadata frames. This will result in the audio being padded * with zeros at either end: at the start, typically * 529+576+1152 = 2257 samples for LAME-encoded mp3s; at the * end an unknown number depending on the fill ratio of the * final coded frame, but typically less than 1152-529 = 623. * * This mode produces the same output as produced by older * versions of this code before the gapless option was added, * and is present mostly for backward compatibility. */ Gappy }; MP3FileReader(FileSource source, DecodeMode decodeMode, CacheMode cacheMode, GaplessMode gaplessMode, sv_samplerate_t targetRate = 0, bool normalised = false, ProgressReporter *reporter = 0); virtual ~MP3FileReader(); virtual QString getError() const { return m_error; } virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getTitle() const { return m_title; } virtual QString getMaker() const { return m_maker; } virtual TagMap getTags() const { return m_tags; } static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return m_completion; } virtual bool isUpdating() const { return m_decodeThread && m_decodeThread->isRunning(); } public slots: void cancelled(); protected: FileSource m_source; QString m_path; QString m_error; QString m_title; QString m_maker; TagMap m_tags; GaplessMode m_gaplessMode; sv_frame_t m_fileSize; double m_bitrateNum; int m_bitrateDenom; int m_mp3FrameCount; int m_completion; bool m_done; unsigned char *m_fileBuffer; size_t m_fileBufferSize; float **m_sampleBuffer; size_t m_sampleBufferSize; ProgressReporter *m_reporter; bool m_cancelled; bool m_decodeErrorShown; struct DecoderData { unsigned char const *start; sv_frame_t length; bool finished; MP3FileReader *reader; }; bool decode(void *mm, sv_frame_t sz); enum mad_flow filter(struct mad_stream const *, struct mad_frame *); enum mad_flow accept(struct mad_header const *, struct mad_pcm *); static enum mad_flow input_callback(void *, struct mad_stream *); static enum mad_flow output_callback(void *, struct mad_header const *, struct mad_pcm *); static enum mad_flow filter_callback(void *, struct mad_stream const *, struct mad_frame *); static enum mad_flow error_callback(void *, struct mad_stream *, struct mad_frame *); class DecodeThread : public Thread { public: DecodeThread(MP3FileReader *reader) : m_reader(reader) { } virtual void run(); protected: MP3FileReader *m_reader; }; DecodeThread *m_decodeThread; void loadTags(int fd); QString loadTag(void *vtag, const char *name); }; #endif #endif sonic-visualiser-3.0.3/svcore/data/fileio/OggVorbisFileReader.cpp0000644000000000000000000002014113111512442023143 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND #include "OggVorbisFileReader.h" #include "base/ProgressReporter.h" #include "base/Profiler.h" #include "system/System.h" #include #include #include #include #include //static int instances = 0; OggVorbisFileReader::OggVorbisFileReader(FileSource source, DecodeMode decodeMode, CacheMode mode, sv_samplerate_t targetRate, bool normalised, ProgressReporter *reporter) : CodedAudioFileReader(mode, targetRate, normalised), m_source(source), m_path(source.getLocalFilename()), m_qfile(0), m_ffile(0), m_oggz(0), m_fishSound(0), m_reporter(reporter), m_fileSize(0), m_bytesRead(0), m_commentsRead(false), m_cancelled(false), m_completion(0), m_decodeThread(0) { SVDEBUG << "OggVorbisFileReader: local path: \"" << m_path << "\", decode mode: " << decodeMode << " (" << (decodeMode == DecodeAtOnce ? "DecodeAtOnce" : "DecodeThreaded") << ")" << endl; m_channelCount = 0; m_fileRate = 0; // SVDEBUG << "OggVorbisFileReader::OggVorbisFileReader(" << m_path << "): now have " << (++instances) << " instances" << endl; Profiler profiler("OggVorbisFileReader::OggVorbisFileReader"); // These shenanigans are to avoid using oggz_open(..) with a local // codepage on Windows (make sure proper filename encoding is used) m_qfile = new QFile(m_path); if (!m_qfile->open(QIODevice::ReadOnly)) { m_error = QString("Failed to open file %1 for reading.").arg(m_path); SVDEBUG << "OggVorbisFileReader: " << m_error << endl; delete m_qfile; m_qfile = 0; return; } m_fileSize = m_qfile->size(); m_ffile = fdopen(dup(m_qfile->handle()), "rb"); if (!m_ffile) { m_error = QString("Failed to open file pointer for file %1").arg(m_path); SVDEBUG << "OggVorbisFileReader: " << m_error << endl; delete m_qfile; m_qfile = 0; return; } if (!(m_oggz = oggz_open_stdio(m_ffile, OGGZ_READ))) { m_error = QString("File %1 is not an OGG file.").arg(m_path); fclose(m_ffile); m_ffile = 0; delete m_qfile; m_qfile = 0; return; } FishSoundInfo fsinfo; m_fishSound = fish_sound_new(FISH_SOUND_DECODE, &fsinfo); fish_sound_set_decoded_callback(m_fishSound, acceptFrames, this); oggz_set_read_callback(m_oggz, -1, (OggzReadPacket)readPacket, this); if (decodeMode == DecodeAtOnce) { if (m_reporter) { connect(m_reporter, SIGNAL(cancelled()), this, SLOT(cancelled())); m_reporter->setMessage (tr("Decoding %1...").arg(QFileInfo(m_path).fileName())); } while (oggz_read(m_oggz, 1024) > 0); fish_sound_delete(m_fishSound); m_fishSound = 0; oggz_close(m_oggz); m_oggz = 0; if (isDecodeCacheInitialised()) finishDecodeCache(); endSerialised(); } else { if (m_reporter) m_reporter->setProgress(100); while (oggz_read(m_oggz, 1024) > 0 && (m_channelCount == 0 || m_fileRate == 0 || m_sampleRate == 0)); if (m_channelCount > 0) { m_decodeThread = new DecodeThread(this); m_decodeThread->start(); } } } OggVorbisFileReader::~OggVorbisFileReader() { // SVDEBUG << "OggVorbisFileReader::~OggVorbisFileReader(" << m_path << "): now have " << (--instances) << " instances" << endl; if (m_decodeThread) { m_cancelled = true; m_decodeThread->wait(); delete m_decodeThread; } if (m_qfile) { // don't fclose m_ffile; oggz_close did that delete m_qfile; m_qfile = 0; } } void OggVorbisFileReader::cancelled() { m_cancelled = true; } void OggVorbisFileReader::DecodeThread::run() { if (m_reader->m_cacheMode == CacheInTemporaryFile) { m_reader->m_completion = 1; m_reader->startSerialised("OggVorbisFileReader::Decode"); } while (oggz_read(m_reader->m_oggz, 1024) > 0); fish_sound_delete(m_reader->m_fishSound); m_reader->m_fishSound = 0; oggz_close(m_reader->m_oggz); m_reader->m_oggz = 0; // don't fclose m_ffile; oggz_close did that delete m_reader->m_qfile; m_reader->m_qfile = 0; if (m_reader->isDecodeCacheInitialised()) m_reader->finishDecodeCache(); m_reader->m_completion = 100; m_reader->endSerialised(); } int OggVorbisFileReader::readPacket(OGGZ *, ogg_packet *packet, long, void *data) { OggVorbisFileReader *reader = (OggVorbisFileReader *)data; FishSound *fs = reader->m_fishSound; fish_sound_prepare_truncation(fs, packet->granulepos, int(packet->e_o_s)); fish_sound_decode(fs, packet->packet, packet->bytes); reader->m_bytesRead += packet->bytes; // The number of bytes read by this function is smaller than // the file size because of the packet headers int p = int(lrint(double(reader->m_bytesRead) * 114 / double(reader->m_fileSize))); if (p > 99) p = 99; reader->m_completion = p; reader->progress(p); if (reader->m_fileSize > 0 && reader->m_reporter) { reader->m_reporter->setProgress(p); } if (reader->m_cancelled) return 1; return 0; } int OggVorbisFileReader::acceptFrames(FishSound *fs, float **frames, long nframes, void *data) { OggVorbisFileReader *reader = (OggVorbisFileReader *)data; if (!reader->m_commentsRead) { const FishSoundComment *comment; comment = fish_sound_comment_first_byname(fs, (char *)"TITLE"); if (comment && comment->value) { reader->m_title = QString::fromUtf8(comment->value); } comment = fish_sound_comment_first_byname(fs, (char *)"ARTIST"); if (comment && comment->value) { reader->m_maker = QString::fromUtf8(comment->value); } comment = fish_sound_comment_first(fs); while (comment) { reader->m_tags[QString::fromUtf8(comment->name).toUpper()] = QString::fromUtf8(comment->value); comment = fish_sound_comment_next(fs, comment); } reader->m_commentsRead = true; } if (reader->m_channelCount == 0) { FishSoundInfo fsinfo; fish_sound_command(fs, FISH_SOUND_GET_INFO, &fsinfo, sizeof(FishSoundInfo)); reader->m_fileRate = fsinfo.samplerate; reader->m_channelCount = fsinfo.channels; reader->initialiseDecodeCache(); } if (nframes > 0) { reader->addSamplesToDecodeCache(frames, nframes); } if (reader->m_cancelled) return 1; return 0; } void OggVorbisFileReader::getSupportedExtensions(std::set &extensions) { extensions.insert("ogg"); extensions.insert("oga"); } bool OggVorbisFileReader::supportsExtension(QString extension) { std::set extensions; getSupportedExtensions(extensions); return (extensions.find(extension.toLower()) != extensions.end()); } bool OggVorbisFileReader::supportsContentType(QString type) { return (type == "application/ogg"); } bool OggVorbisFileReader::supports(FileSource &source) { return (supportsExtension(source.getExtension()) || supportsContentType(source.getContentType())); } #endif #endif sonic-visualiser-3.0.3/svcore/data/fileio/OggVorbisFileReader.h0000644000000000000000000000543713111512442022623 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_OGG_VORBIS_FILE_READER_H #define SV_OGG_VORBIS_FILE_READER_H #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND #include "CodedAudioFileReader.h" #include "base/Thread.h" #include #include #include #include class ProgressReporter; class OggVorbisFileReader : public CodedAudioFileReader { Q_OBJECT public: OggVorbisFileReader(FileSource source, DecodeMode decodeMode, CacheMode cacheMode, sv_samplerate_t targetRate = 0, bool normalised = false, ProgressReporter *reporter = nullptr); virtual ~OggVorbisFileReader(); virtual QString getError() const { return m_error; } virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getTitle() const { return m_title; } virtual QString getMaker() const { return m_maker; } virtual TagMap getTags() const { return m_tags; } static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return m_completion; } virtual bool isUpdating() const { return m_decodeThread && m_decodeThread->isRunning(); } public slots: void cancelled(); protected: FileSource m_source; QString m_path; QString m_error; QString m_title; QString m_maker; TagMap m_tags; QFile *m_qfile; FILE *m_ffile; OGGZ *m_oggz; FishSound *m_fishSound; ProgressReporter *m_reporter; sv_frame_t m_fileSize; sv_frame_t m_bytesRead; bool m_commentsRead; bool m_cancelled; int m_completion; static int readPacket(OGGZ *, ogg_packet *, long, void *); static int acceptFrames(FishSound *, float **, long, void *); class DecodeThread : public Thread { public: DecodeThread(OggVorbisFileReader *reader) : m_reader(reader) { } virtual void run(); protected: OggVorbisFileReader *m_reader; }; DecodeThread *m_decodeThread; }; #endif #endif #endif sonic-visualiser-3.0.3/svcore/data/fileio/PlaylistFileReader.cpp0000644000000000000000000000747313111512442023060 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PlaylistFileReader.h" #include #include #include #include #include #include PlaylistFileReader::PlaylistFileReader(QString path) : m_source(path), m_file(0) { if (!m_source.isAvailable()) { m_error = QFile::tr("File or URL \"%1\" could not be retrieved") .arg(path); return; } init(); } PlaylistFileReader::PlaylistFileReader(FileSource source) : m_source(source), m_file(0) { if (!m_source.isAvailable()) { m_error = QFile::tr("File or URL \"%1\" could not be retrieved") .arg(source.getLocation()); return; } init(); } PlaylistFileReader::~PlaylistFileReader() { if (m_file) m_file->close(); delete m_file; } void PlaylistFileReader::init() { if (!m_source.isAvailable()) return; m_source.waitForData(); QString filename = m_source.getLocalFilename(); m_file = new QFile(filename); bool good = false; if (!m_file->exists()) { m_error = QFile::tr("File \"%1\" does not exist") .arg(m_source.getLocation()); } else if (!m_file->open(QIODevice::ReadOnly | QIODevice::Text)) { m_error = QFile::tr("Failed to open file \"%1\"") .arg(m_source.getLocation()); } else { good = true; } if (good) { if (!m_source.isRemote()) { m_basedir = QFileInfo(filename).dir().canonicalPath(); } } if (!good) { delete m_file; m_file = 0; } } bool PlaylistFileReader::isOK() const { return (m_file != 0); } QString PlaylistFileReader::getError() const { return m_error; } PlaylistFileReader::Playlist PlaylistFileReader::load() const { if (!m_file) return Playlist(); QTextStream in(m_file); in.seek(0); Playlist playlist; while (!in.atEnd()) { // cope with old-style Mac line endings (c.f. CSVFileReader) // as well as DOS/Unix style QString chunk = in.readLine(); QStringList lines = chunk.split('\r', QString::SkipEmptyParts); for (int li = 0; li < lines.size(); ++li) { QString line = lines[li]; if (line.startsWith("#")) continue; // line is expected to be a URL or a file path. If it // appears to be a local relative file path, then we // should check whether it can be resolved relative to the // location of the playlist file and, if so, do so. if (!FileSource::isRemote(line)) { if (QFileInfo(line).isRelative() && m_basedir != "") { QString testpath = QDir(m_basedir).filePath(line); if (QFileInfo(testpath).exists() && QFileInfo(testpath).isFile()) { cerr << "Path \"" << line << "\" is relative, resolving to \"" << testpath << "\"" << endl; line = testpath; } } } playlist.push_back(line); } } return playlist; } void PlaylistFileReader::getSupportedExtensions(std::set &extensions) { extensions.insert("m3u"); } sonic-visualiser-3.0.3/svcore/data/fileio/PlaylistFileReader.h0000644000000000000000000000235113111512442022513 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLAYLIST_FILE_READER_H_ #define _PLAYLIST_FILE_READER_H_ #include "FileSource.h" #include #include #include class QFile; class PlaylistFileReader { public: typedef std::vector Playlist; PlaylistFileReader(QString path); PlaylistFileReader(FileSource source); virtual ~PlaylistFileReader(); virtual bool isOK() const; virtual QString getError() const; virtual Playlist load() const; static void getSupportedExtensions(std::set &extensions); protected: void init(); FileSource m_source; QFile *m_file; QString m_basedir; QString m_error; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/WavFileReader.cpp0000644000000000000000000001633613111512442022012 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "WavFileReader.h" #include "base/HitCount.h" #include "base/Profiler.h" #include #include #include using namespace std; WavFileReader::WavFileReader(FileSource source, bool fileUpdating) : m_file(0), m_source(source), m_path(source.getLocalFilename()), m_seekable(false), m_lastStart(0), m_lastCount(0), m_updating(fileUpdating) { m_frameCount = 0; m_channelCount = 0; m_sampleRate = 0; m_fileInfo.format = 0; m_fileInfo.frames = 0; #ifdef Q_OS_WIN m_file = sf_wchar_open((LPCWSTR)m_path.utf16(), SFM_READ, &m_fileInfo); #else m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo); #endif if (!m_file || (!fileUpdating && m_fileInfo.channels <= 0)) { SVDEBUG << "WavFileReader::initialize: Failed to open file at \"" << m_path << "\" (" << sf_strerror(m_file) << ")" << endl; if (m_file) { m_error = QString("Couldn't load audio file '%1':\n%2") .arg(m_path).arg(sf_strerror(m_file)); } else { m_error = QString("Failed to open audio file '%1'") .arg(m_path); } return; } if (m_fileInfo.channels > 0) { m_frameCount = m_fileInfo.frames; m_channelCount = m_fileInfo.channels; m_sampleRate = m_fileInfo.samplerate; m_seekable = (m_fileInfo.seekable != 0); int type = m_fileInfo.format & SF_FORMAT_TYPEMASK; int subtype = m_fileInfo.format & SF_FORMAT_SUBMASK; if (type >= SF_FORMAT_FLAC || type >= SF_FORMAT_OGG) { // Our m_seekable reports whether a file is rapidly // seekable, so things like Ogg don't qualify. We // cautiously report every file type of "at least" the // historical period of Ogg or FLAC as non-seekable. m_seekable = false; } else if (type == SF_FORMAT_WAV && subtype <= SF_FORMAT_DOUBLE) { // libsndfile 1.0.26 has a bug (subsequently fixed in the // repo) that causes all files to be reported as // non-seekable. We know that certain common file types // are definitely seekable so, again cautiously, identify // and mark those (basically only non-adaptive WAVs). m_seekable = true; } } SVDEBUG << "WavFileReader: Filename " << m_path << ", frame count " << m_frameCount << ", channel count " << m_channelCount << ", sample rate " << m_sampleRate << ", format " << m_fileInfo.format << ", seekable " << m_fileInfo.seekable << " adjusted to " << m_seekable << endl; } WavFileReader::~WavFileReader() { if (m_file) sf_close(m_file); } void WavFileReader::updateFrameCount() { QMutexLocker locker(&m_mutex); sv_frame_t prevCount = m_fileInfo.frames; if (m_file) { sf_close(m_file); #ifdef Q_OS_WIN m_file = sf_wchar_open((LPCWSTR)m_path.utf16(), SFM_READ, &m_fileInfo); #else m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo); #endif if (!m_file || m_fileInfo.channels <= 0) { SVDEBUG << "WavFileReader::updateFrameCount: Failed to open file at \"" << m_path << "\" (" << sf_strerror(m_file) << ")" << endl; } } // SVDEBUG << "WavFileReader::updateFrameCount: now " << m_fileInfo.frames << endl; m_frameCount = m_fileInfo.frames; if (m_channelCount == 0) { m_channelCount = m_fileInfo.channels; m_sampleRate = m_fileInfo.samplerate; } if (m_frameCount != prevCount) { emit frameCountChanged(); } } void WavFileReader::updateDone() { updateFrameCount(); m_updating = false; } floatvec_t WavFileReader::getInterleavedFrames(sv_frame_t start, sv_frame_t count) const { static HitCount lastRead("WavFileReader: last read"); if (count == 0) return {}; QMutexLocker locker(&m_mutex); Profiler profiler("WavFileReader::getInterleavedFrames"); if (!m_file || !m_channelCount) { return {}; } if (start >= m_fileInfo.frames) { // SVDEBUG << "WavFileReader::getInterleavedFrames: " << start // << " > " << m_fileInfo.frames << endl; return {}; } if (start + count > m_fileInfo.frames) { count = m_fileInfo.frames - start; } // Because WaveFileModel::getSummaries() is called separately for // individual channels, it's quite common for us to be called // repeatedly for the same data. So this is worth cacheing. if (start == m_lastStart && count == m_lastCount) { lastRead.hit(); return m_buffer; } // We don't actually support partial cache reads, but let's use // the term partial to refer to any forward seek and consider a // backward seek to be a miss if (start >= m_lastStart) { lastRead.partial(); } else { lastRead.miss(); } if (sf_seek(m_file, start, SEEK_SET) < 0) { return {}; } floatvec_t data; sv_frame_t n = count * m_fileInfo.channels; data.resize(n); m_lastStart = start; m_lastCount = count; sf_count_t readCount = 0; if ((readCount = sf_readf_float(m_file, data.data(), count)) < 0) { return {}; } m_buffer = data; return data; } void WavFileReader::getSupportedExtensions(set &extensions) { int count; if (sf_command(0, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof(count))) { extensions.insert("wav"); extensions.insert("aiff"); extensions.insert("aifc"); extensions.insert("aif"); return; } SF_FORMAT_INFO info; for (int i = 0; i < count; ++i) { info.format = i; if (!sf_command(0, SFC_GET_FORMAT_MAJOR, &info, sizeof(info))) { QString ext = QString(info.extension).toLower(); extensions.insert(ext); if (ext == "oga") { // libsndfile is awfully proper, it says it only // supports .oga but lots of Ogg audio files in the // wild are .ogg and it will accept that extensions.insert("ogg"); } } } } bool WavFileReader::supportsExtension(QString extension) { set extensions; getSupportedExtensions(extensions); return (extensions.find(extension.toLower()) != extensions.end()); } bool WavFileReader::supportsContentType(QString type) { return (type == "audio/x-wav" || type == "audio/x-aiff" || type == "audio/basic"); } bool WavFileReader::supports(FileSource &source) { return (supportsExtension(source.getExtension()) || supportsContentType(source.getContentType())); } sonic-visualiser-3.0.3/svcore/data/fileio/WavFileReader.h0000644000000000000000000000473313111512442021455 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_WAV_FILE_READER_H #define SV_WAV_FILE_READER_H #include "AudioFileReader.h" #ifdef Q_OS_WIN #include #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 #endif #include #include #include /** * Reader for audio files using libsndfile. * * This is typically intended for seekable file types that can be read * directly (e.g. WAV, AIFF etc). * * Compressed files supported by libsndfile (e.g. Ogg, FLAC) should * normally be read using DecodingWavFileReader instead (which decodes * to an intermediate cached file). */ class WavFileReader : public AudioFileReader { public: WavFileReader(FileSource source, bool fileUpdating = false); virtual ~WavFileReader(); virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getError() const { return m_error; } virtual QString getLocalFilename() const { return m_path; } virtual bool isQuicklySeekable() const { return m_seekable; } /** * Must be safe to call from multiple threads with different * arguments on the same object at the same time. */ virtual floatvec_t getInterleavedFrames(sv_frame_t start, sv_frame_t count) const; static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return 100; } bool isUpdating() const { return m_updating; } void updateFrameCount(); void updateDone(); protected: SF_INFO m_fileInfo; SNDFILE *m_file; FileSource m_source; QString m_path; QString m_error; bool m_seekable; mutable QMutex m_mutex; mutable floatvec_t m_buffer; mutable sv_frame_t m_lastStart; mutable sv_frame_t m_lastCount; bool m_updating; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/WavFileWriter.cpp0000644000000000000000000001267213111512442022063 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "WavFileWriter.h" #include "model/DenseTimeValueModel.h" #include "base/Selection.h" #include "base/TempWriteFile.h" #include "base/Exceptions.h" #include #include #include using namespace std; WavFileWriter::WavFileWriter(QString path, sv_samplerate_t sampleRate, int channels, FileWriteMode mode) : m_path(path), m_sampleRate(sampleRate), m_channels(channels), m_temp(0), m_file(0) { SF_INFO fileInfo; int fileRate = int(round(m_sampleRate)); if (m_sampleRate != sv_samplerate_t(fileRate)) { cerr << "WavFileWriter: WARNING: Non-integer sample rate " << m_sampleRate << " presented, rounding to " << fileRate << endl; } fileInfo.samplerate = fileRate; fileInfo.channels = m_channels; fileInfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; try { QString writePath = m_path; if (mode == WriteToTemporary) { m_temp = new TempWriteFile(m_path); writePath = m_temp->getTemporaryFilename(); } #ifdef Q_OS_WIN m_file = sf_wchar_open((LPCWSTR)writePath.utf16(), SFM_WRITE, &fileInfo); #else m_file = sf_open(writePath.toLocal8Bit(), SFM_WRITE, &fileInfo); #endif if (!m_file) { cerr << "WavFileWriter: Failed to open file (" << sf_strerror(m_file) << ")" << endl; m_error = QString("Failed to open audio file '%1' for writing") .arg(writePath); } } catch (FileOperationFailed &f) { m_error = f.what(); m_temp = 0; m_file = 0; } } WavFileWriter::~WavFileWriter() { if (m_file) close(); } bool WavFileWriter::isOK() const { return (m_error.isEmpty()); } QString WavFileWriter::getError() const { return m_error; } QString WavFileWriter::getWriteFilename() const { if (m_temp) { return m_temp->getTemporaryFilename(); } else { return m_path; } } bool WavFileWriter::writeModel(DenseTimeValueModel *source, MultiSelection *selection) { if (source->getChannelCount() != m_channels) { SVDEBUG << "WavFileWriter::writeModel: Wrong number of channels (" << source->getChannelCount() << " != " << m_channels << ")" << endl; m_error = QString("Failed to write model to audio file '%1'") .arg(getWriteFilename()); return false; } if (!m_file) { m_error = QString("Failed to write model to audio file '%1': File not open") .arg(getWriteFilename()); return false; } bool ownSelection = false; if (!selection) { selection = new MultiSelection; selection->setSelection(Selection(source->getStartFrame(), source->getEndFrame())); ownSelection = true; } sv_frame_t bs = 2048; for (MultiSelection::SelectionList::iterator i = selection->getSelections().begin(); i != selection->getSelections().end(); ++i) { sv_frame_t f0(i->getStartFrame()), f1(i->getEndFrame()); for (sv_frame_t f = f0; f < f1; f += bs) { sv_frame_t n = min(bs, f1 - f); floatvec_t interleaved(n * m_channels, 0.f); for (int c = 0; c < int(m_channels); ++c) { auto chanbuf = source->getData(c, f, n); for (int i = 0; in_range_for(chanbuf, i); ++i) { interleaved[i * m_channels + c] = chanbuf[i]; } } sf_count_t written = sf_writef_float(m_file, interleaved.data(), n); if (written < n) { m_error = QString("Only wrote %1 of %2 frames at file frame %3") .arg(written).arg(n).arg(f); break; } } } if (ownSelection) delete selection; return isOK(); } bool WavFileWriter::writeSamples(const float *const *samples, sv_frame_t count) { if (!m_file) { m_error = QString("Failed to write model to audio file '%1': File not open") .arg(getWriteFilename()); return false; } float *b = new float[count * m_channels]; for (sv_frame_t i = 0; i < count; ++i) { for (int c = 0; c < int(m_channels); ++c) { b[i * m_channels + c] = samples[c][i]; } } sv_frame_t written = sf_writef_float(m_file, b, count); delete[] b; if (written < count) { m_error = QString("Only wrote %1 of %2 frames") .arg(written).arg(count); } return isOK(); } bool WavFileWriter::close() { if (m_file) { sf_close(m_file); m_file = 0; } if (m_temp) { m_temp->moveToTarget(); delete m_temp; m_temp = 0; } return true; } sonic-visualiser-3.0.3/svcore/data/fileio/WavFileWriter.h0000644000000000000000000000424513111512442021525 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_WAV_FILE_WRITER_H #define SV_WAV_FILE_WRITER_H #include #ifdef Q_OS_WIN #include #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 #endif #include #include "base/BaseTypes.h" class DenseTimeValueModel; class MultiSelection; class TempWriteFile; class WavFileWriter { public: /** * Specify the method used to open the destination file. * * If WriteToTemporary, the destination will be opened as a * temporary file which is moved to the target location when the * WavFileWriter is closed or deleted (to avoid clobbering an * existing file with a partially written replacement). * * If WriteToTarget, the target file will be opened directly * (necessary when e.g. doing a series of incremental writes to a * file while keeping it open for reading). */ enum FileWriteMode { WriteToTemporary, WriteToTarget }; WavFileWriter(QString path, sv_samplerate_t sampleRate, int channels, FileWriteMode mode); virtual ~WavFileWriter(); bool isOK() const; virtual QString getError() const; QString getPath() const { return m_path; } bool writeModel(DenseTimeValueModel *source, MultiSelection *selection = 0); bool writeSamples(const float *const *samples, sv_frame_t count); // count per channel bool close(); protected: QString m_path; sv_samplerate_t m_sampleRate; int m_channels; TempWriteFile *m_temp; SNDFILE *m_file; QString m_error; QString getWriteFilename() const; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/test/AudioFileReaderTest.h0000644000000000000000000004247413111512442023604 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2013 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_AUDIO_FILE_READER_H #define TEST_AUDIO_FILE_READER_H #include "../AudioFileReaderFactory.h" #include "../AudioFileReader.h" #include "../WavFileWriter.h" #include "AudioTestData.h" #include #include #include #include #include using namespace std; class AudioFileReaderTest : public QObject { Q_OBJECT private: QString testDirBase; QString audioDir; QString diffDir; public: AudioFileReaderTest(QString base) { if (base == "") { base = "svcore/data/fileio/test"; } testDirBase = base; audioDir = base + "/audio"; diffDir = base + "/diffs"; } private: const char *strOf(QString s) { return strdup(s.toLocal8Bit().data()); } void getFileMetadata(QString filename, QString &extension, sv_samplerate_t &rate, int &channels, int &bitdepth) { QStringList fileAndExt = filename.split("."); QStringList bits = fileAndExt[0].split("-"); extension = fileAndExt[1]; rate = bits[0].toInt(); channels = bits[1].toInt(); bitdepth = 16; if (bits.length() > 2) { bitdepth = bits[2].toInt(); } } void getExpectedThresholds(QString format, QString filename, bool resampled, bool gapless, bool normalised, double &maxLimit, double &rmsLimit) { QString extension; sv_samplerate_t fileRate; int channels; int bitdepth; getFileMetadata(filename, extension, fileRate, channels, bitdepth); if (normalised) { if (format == "ogg") { // Our ogg is not especially high quality and is // actually further from the original if normalised maxLimit = 0.1; rmsLimit = 0.03; } else if (format == "aac") { // Terrible performance for this test, load of spill // from one channel to the other. I guess they know // what they're doing, it's perceptual after all, but // it does make this check a bit superfluous, you // could probably pass it with a signal that sounds // nothing like the original maxLimit = 0.2; rmsLimit = 0.1; } else if (format == "mp3") { if (resampled && !gapless) { // We expect worse figures here, because the // combination of uncompensated encoder delay + // resampling results in a fractional delay which // means the decoded signal is slightly out of // phase compared to the test signal maxLimit = 0.1; rmsLimit = 0.05; } else { maxLimit = 0.05; rmsLimit = 0.01; } } else { // lossless formats (wav, aiff, flac, apple_lossless) if (bitdepth >= 16 && !resampled) { maxLimit = 1e-3; rmsLimit = 3e-4; } else { maxLimit = 0.01; rmsLimit = 5e-3; } } } else { // !normalised if (format == "ogg") { maxLimit = 0.06; rmsLimit = 0.03; } else if (format == "aac") { maxLimit = 0.1; rmsLimit = 0.1; } else if (format == "mp3") { // all mp3 figures are worse when not normalising maxLimit = 0.1; rmsLimit = 0.05; } else { // lossless formats (wav, aiff, flac, apple_lossless) if (bitdepth >= 16 && !resampled) { maxLimit = 1e-3; rmsLimit = 3e-4; } else { maxLimit = 0.02; rmsLimit = 0.01; } } } } QString testName(QString format, QString filename, int rate, bool norm, bool gapless) { return QString("%1/%2 at %3%4%5") .arg(format) .arg(filename) .arg(rate) .arg(norm ? " normalised": "") .arg(gapless ? "" : " non-gapless"); } private slots: void init() { if (!QDir(audioDir).exists()) { QString cwd = QDir::currentPath(); cerr << "ERROR: Audio test file directory \"" << audioDir << "\" does not exist (cwd = " << cwd << ")" << endl; QVERIFY2(QDir(audioDir).exists(), "Audio test file directory not found"); } if (!QDir(diffDir).exists() && !QDir().mkpath(diffDir)) { cerr << "ERROR: Audio diff directory \"" << diffDir << "\" does not exist and could not be created" << endl; QVERIFY2(QDir(diffDir).exists(), "Audio diff directory not found and could not be created"); } } void read_data() { QTest::addColumn("format"); QTest::addColumn("audiofile"); QTest::addColumn("rate"); QTest::addColumn("normalised"); QTest::addColumn("gapless"); QStringList dirs = QDir(audioDir).entryList(QDir::Dirs | QDir::NoDotAndDotDot); for (QString format: dirs) { QStringList files = QDir(QDir(audioDir).filePath(format)) .entryList(QDir::Files); int readRates[] = { 44100, 48000 }; bool norms[] = { false, true }; bool gaplesses[] = { true, false }; foreach (QString filename, files) { for (int rate: readRates) { for (bool norm: norms) { for (bool gapless: gaplesses) { if (format != "mp3" && !gapless) { continue; } QString desc = testName (format, filename, rate, norm, gapless); QTest::newRow(strOf(desc)) << format << filename << rate << norm << gapless; } } } } } } void read() { QFETCH(QString, format); QFETCH(QString, audiofile); QFETCH(int, rate); QFETCH(bool, normalised); QFETCH(bool, gapless); sv_samplerate_t readRate(rate); // cerr << "\naudiofile = " << audiofile << endl; AudioFileReaderFactory::Parameters params; params.targetRate = readRate; params.normalisation = (normalised ? AudioFileReaderFactory::Normalisation::Peak : AudioFileReaderFactory::Normalisation::None); params.gaplessMode = (gapless ? AudioFileReaderFactory::GaplessMode::Gapless : AudioFileReaderFactory::GaplessMode::Gappy); AudioFileReader *reader = AudioFileReaderFactory::createReader (audioDir + "/" + format + "/" + audiofile, params); if (!reader) { #if ( QT_VERSION >= 0x050000 ) QSKIP("Unsupported file, skipping"); #else QSKIP("Unsupported file, skipping", SkipSingle); #endif } QString extension; sv_samplerate_t fileRate; int channels; int fileBitdepth; getFileMetadata(audiofile, extension, fileRate, channels, fileBitdepth); QCOMPARE((int)reader->getChannelCount(), channels); QCOMPARE(reader->getNativeRate(), fileRate); QCOMPARE(reader->getSampleRate(), readRate); AudioTestData tdata(readRate, channels); float *reference = tdata.getInterleavedData(); sv_frame_t refFrames = tdata.getFrameCount(); // The reader should give us exactly the expected number of // frames, except for mp3/aac files. We ask for quite a lot // more, though, so we can (a) check that we only get the // expected number back (if this is not mp3/aac) or (b) take // into account silence at beginning and end (if it is). floatvec_t test = reader->getInterleavedFrames(0, refFrames + 5000); delete reader; reader = 0; sv_frame_t read = test.size() / channels; bool perceptual = (extension == "mp3" || extension == "aac" || extension == "m4a"); if (perceptual && !gapless) { // allow silence at start and end QVERIFY(read >= refFrames); } else { QCOMPARE(read, refFrames); } bool resampled = readRate != fileRate; double maxLimit, rmsLimit; getExpectedThresholds(format, audiofile, resampled, gapless, normalised, maxLimit, rmsLimit); double edgeLimit = maxLimit * 3; // in first or final edgeSize frames if (resampled && edgeLimit < 0.1) edgeLimit = 0.1; int edgeSize = 100; // And we ignore completely the last few frames when upsampling int discard = 1 + int(round(readRate / fileRate)); int offset = 0; if (perceptual) { // Look for an initial offset. // // We know the first channel has a sinusoid in it. It // should have a peak at 0.4ms (see AudioTestData.h) but // that might have been clipped, which would make it // imprecise. We can tell if it's clipped, though, as // there will be samples having exactly identical // values. So what we look for is the peak if it's not // clipped and, if it is, the first zero crossing after // the peak, which should be at 0.8ms. int expectedPeak = int(0.0004 * readRate); int expectedZC = int(0.0008 * readRate); bool foundPeak = false; for (int i = 1; i+1 < read; ++i) { float prevSample = test[(i-1) * channels]; float thisSample = test[i * channels]; float nextSample = test[(i+1) * channels]; if (thisSample > 0.8 && nextSample < thisSample) { foundPeak = true; if (thisSample > prevSample) { // not clipped offset = i - expectedPeak - 1; break; } } if (foundPeak && (thisSample >= 0.0 && nextSample < 0.0)) { // cerr << "thisSample = " << thisSample << ", nextSample = " // << nextSample << endl; offset = i - expectedZC - 1; break; } } // int fileRateEquivalent = int((offset / readRate) * fileRate); // std::cerr << "offset = " << offset << std::endl; // std::cerr << "at file rate would be " << fileRateEquivalent << std::endl; // Previously our m4a test file had a fixed offset of 1024 // at the file sample rate -- this may be because it was // produced by FAAC which did not write in the delay as // metadata? We now have an m4a produced by Core Audio // which gives a 0 offset. What to do... // Anyway, mp3s should have 0 offset in gapless mode and // "something else" otherwise. if (gapless) { if (format == "aac") { // ouch! if (offset == -1) offset = 0; } QCOMPARE(offset, 0); } } { // Write the diff file now, so that it's already been written // even if the comparison fails. We aren't checking anything // here except as necessary to avoid buffer overruns etc QString diffFile = testName(format, audiofile, rate, normalised, gapless); diffFile.replace("/", "_"); diffFile.replace(".", "_"); diffFile.replace(" ", "_"); diffFile += ".wav"; diffFile = QDir(diffDir).filePath(diffFile); WavFileWriter diffWriter(diffFile, readRate, channels, WavFileWriter::WriteToTemporary); QVERIFY(diffWriter.isOK()); vector> diffs(channels); for (int c = 0; c < channels; ++c) { for (int i = 0; i < refFrames; ++i) { int ix = i + offset; if (ix < read) { float signeddiff = test[ix * channels + c] - reference[i * channels + c]; diffs[c].push_back(signeddiff); } } } float **ptrs = new float*[channels]; for (int c = 0; c < channels; ++c) { ptrs[c] = diffs[c].data(); } diffWriter.writeSamples(ptrs, refFrames); delete[] ptrs; } for (int c = 0; c < channels; ++c) { double maxDiff = 0.0; double totalDiff = 0.0; double totalSqrDiff = 0.0; int maxIndex = 0; for (int i = 0; i < refFrames; ++i) { int ix = i + offset; if (ix >= read) { cerr << "ERROR: audiofile " << audiofile << " reads truncated (read-rate reference frames " << i << " onward, of " << refFrames << ", are lost)" << endl; QVERIFY(ix < read); } if (ix + discard >= read) { // we forgive the very edge samples when // resampling (discard > 0) continue; } double diff = fabs(test[ix * channels + c] - reference[i * channels + c]); totalDiff += diff; totalSqrDiff += diff * diff; // in edge areas, record this only if it exceeds edgeLimit if (i < edgeSize || i + edgeSize >= refFrames) { if (diff > edgeLimit && diff > maxDiff) { maxDiff = diff; maxIndex = i; } } else { if (diff > maxDiff) { maxDiff = diff; maxIndex = i; } } } double meanDiff = totalDiff / double(refFrames); double rmsDiff = sqrt(totalSqrDiff / double(refFrames)); /* cerr << "channel " << c << ": mean diff " << meanDiff << endl; cerr << "channel " << c << ": rms diff " << rmsDiff << endl; cerr << "channel " << c << ": max diff " << maxDiff << " at " << maxIndex << endl; */ if (rmsDiff >= rmsLimit) { cerr << "ERROR: for audiofile " << audiofile << ": RMS diff = " << rmsDiff << " for channel " << c << " (limit = " << rmsLimit << ")" << endl; QVERIFY(rmsDiff < rmsLimit); } if (maxDiff >= maxLimit) { cerr << "ERROR: for audiofile " << audiofile << ": max diff = " << maxDiff << " at frame " << maxIndex << " of " << read << " on channel " << c << " (limit = " << maxLimit << ", edge limit = " << edgeLimit << ", mean diff = " << meanDiff << ", rms = " << rmsDiff << ")" << endl; QVERIFY(maxDiff < maxLimit); } // and check for spurious material at end for (sv_frame_t i = refFrames; i + offset < read; ++i) { sv_frame_t ix = i + offset; float quiet = 0.1f; //!!! allow some ringing - but let's come back to this, it should tail off float mag = fabsf(test[ix * channels + c]); if (mag > quiet) { cerr << "ERROR: audiofile " << audiofile << " contains spurious data after end of reference (found sample " << test[ix * channels + c] << " at index " << ix << " of channel " << c << " after reference+offset ended at " << refFrames+offset << ")" << endl; QVERIFY(mag < quiet); } } } } }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/test/AudioFileWriterTest.h0000644000000000000000000000770413111512442023653 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_AUDIO_FILE_WRITER_H #define TEST_AUDIO_FILE_WRITER_H #include "../AudioFileReaderFactory.h" #include "../AudioFileReader.h" #include "../WavFileWriter.h" #include "AudioTestData.h" #include "bqvec/VectorOps.h" #include "bqvec/Allocators.h" #include #include #include #include #include using namespace std; using namespace breakfastquay; class AudioFileWriterTest : public QObject { Q_OBJECT private: QString testDirBase; QString outDir; static const int rate = 44100; public: AudioFileWriterTest(QString base) { if (base == "") { base = "svcore/data/fileio/test"; } testDirBase = base; outDir = base + "/outfiles"; } const char *strOf(QString s) { return strdup(s.toLocal8Bit().data()); } QString testName(bool direct, int channels) { return QString("%1 %2 %3") .arg(channels) .arg(channels > 1 ? "channels" : "channel") .arg(direct ? "direct" : "via temporary"); } private slots: void init() { if (!QDir(outDir).exists() && !QDir().mkpath(outDir)) { cerr << "ERROR: Audio out directory \"" << outDir << "\" does not exist and could not be created" << endl; QVERIFY2(QDir(outDir).exists(), "Audio out directory not found and could not be created"); } } void write_data() { QTest::addColumn("direct"); QTest::addColumn("channels"); for (int direct = 0; direct <= 1; ++direct) { for (int channels = 1; channels < 8; ++channels) { if (channels == 1 || channels == 2 || channels == 5 || channels == 8) { QString desc = testName(direct, channels); QTest::newRow(strOf(desc)) << (bool)direct << channels; } } } } void write() { QFETCH(bool, direct); QFETCH(int, channels); QString outfile = QString("%1/out-%2ch-%3.wav") .arg(outDir).arg(channels).arg(direct ? "direct" : "via-temporary"); WavFileWriter writer(outfile, rate, channels, direct ? WavFileWriter::WriteToTarget : WavFileWriter::WriteToTemporary); QVERIFY(writer.isOK()); AudioTestData data(rate, channels); data.generate(); sv_frame_t frameCount = data.getFrameCount(); float *interleaved = data.getInterleavedData(); float **nonInterleaved = allocate_channels(channels, frameCount); v_deinterleave(nonInterleaved, interleaved, channels, int(frameCount)); bool ok = writer.writeSamples(nonInterleaved, frameCount); deallocate_channels(nonInterleaved, channels); QVERIFY(ok); ok = writer.close(); QVERIFY(ok); AudioFileReaderFactory::Parameters params; AudioFileReader *rereader = AudioFileReaderFactory::createReader(outfile, params); QVERIFY(rereader != nullptr); floatvec_t readFrames = rereader->getInterleavedFrames(0, frameCount); floatvec_t expected(interleaved, interleaved + frameCount * channels); QCOMPARE(readFrames, expected); delete rereader; } }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/test/AudioTestData.h0000644000000000000000000000542013111512442022441 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2013 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef AUDIO_TEST_DATA_H #define AUDIO_TEST_DATA_H #include #include "base/BaseTypes.h" /** * Class that generates a single fixed test pattern to a given sample * rate and number of channels. * * The test pattern is two seconds long and consists of: * * -- in channel 0, a 600Hz sinusoid with peak amplitude 1.0 * * -- in channel 1, four triangular forms with peaks at +1.0, -1.0, * +1.0, -1.0 respectively, of 10ms width, starting at 0.0, 0.5, * 1.0 and 1.5 seconds; silence elsewhere * * -- in subsequent channels, a flat DC offset at +(channelNo / 20.0) */ class AudioTestData { public: AudioTestData(double rate, int channels) : m_channelCount(channels), m_duration(2.0), m_sampleRate(rate), m_sinFreq(600.0), m_pulseFreq(2) { m_frameCount = lrint(m_duration * m_sampleRate); m_data = new float[m_frameCount * m_channelCount]; m_pulseWidth = 0.01 * m_sampleRate; generate(); } ~AudioTestData() { delete[] m_data; } void generate() { double hpw = m_pulseWidth / 2.0; for (int i = 0; i < m_frameCount; ++i) { for (int c = 0; c < m_channelCount; ++c) { double s = 0.0; if (c == 0) { double phase = (i * m_sinFreq * 2.0 * M_PI) / m_sampleRate; s = sin(phase); } else if (c == 1) { int pulseNo = int((i * m_pulseFreq) / m_sampleRate); int index = int(round((i * m_pulseFreq) - (m_sampleRate * pulseNo))); if (index < m_pulseWidth) { s = 1.0 - fabs(hpw - index) / hpw; if (pulseNo % 2) s = -s; } } else { s = c / 20.0; } m_data[i * m_channelCount + c] = float(s); } } } float *getInterleavedData() const { return m_data; } sv_frame_t getFrameCount() const { return m_frameCount; } int getChannelCount() const { return m_channelCount; } sv_samplerate_t getSampleRate () const { return m_sampleRate; } double getDuration() const { // seconds return m_duration; } private: float *m_data; sv_frame_t m_frameCount; int m_channelCount; double m_duration; sv_samplerate_t m_sampleRate; double m_sinFreq; double m_pulseFreq; double m_pulseWidth; }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/test/EncodingTest.h0000644000000000000000000002055113111512442022336 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_AUDIO_ENCODINGS_H #define TEST_AUDIO_ENCODINGS_H // Quick tests for filename encodings and encoding of ID3 data. Not a // test of audio codecs. #include "../AudioFileReaderFactory.h" #include "../AudioFileReader.h" #include "../WavFileWriter.h" #include #include #include #include #include using namespace std; const char utf8_name_cdp_1[] = "Caf\303\251 de Paris"; const char utf8_name_cdp_2[] = "Caf\303\251 de \351\207\215\345\272\206"; const char utf8_name_tsprk[] = "T\303\253mple of Sp\303\266rks"; const char utf8_name_sprkt[] = "\343\202\271\343\203\235\343\203\274\343\202\257\343\201\256\345\257\272\351\231\242"; // Mapping between filename and expected title metadata field static const char *mapping[][2] = { { "id3v2-iso-8859-1", utf8_name_cdp_1 }, { "id3v2-ucs-2", utf8_name_cdp_2 }, { utf8_name_tsprk, utf8_name_tsprk }, { utf8_name_sprkt, utf8_name_sprkt }, }; static const int mappingCount = 4; class EncodingTest : public QObject { Q_OBJECT private: QString testDirBase; QString encodingDir; QString outDir; public: EncodingTest(QString base) { if (base == "") { base = "svcore/data/fileio/test"; } testDirBase = base; encodingDir = base + "/encodings"; outDir = base + "/outfiles"; } private: const char *strOf(QString s) { return strdup(s.toLocal8Bit().data()); } void addAudioFiles() { QTest::addColumn("audiofile"); QStringList files = QDir(encodingDir).entryList(QDir::Files); foreach (QString filename, files) { QTest::newRow(strOf(filename)) << filename; } } private slots: void init() { if (!QDir(encodingDir).exists()) { cerr << "ERROR: Audio encoding file directory \"" << encodingDir << "\" does not exist" << endl; QVERIFY2(QDir(encodingDir).exists(), "Audio encoding file directory not found"); } if (!QDir(outDir).exists() && !QDir().mkpath(outDir)) { cerr << "ERROR: Audio out directory \"" << outDir << "\" does not exist and could not be created" << endl; QVERIFY2(QDir(outDir).exists(), "Audio out directory not found and could not be created"); } } void readAudio_data() { addAudioFiles(); } void readAudio() { // Ensure that we can open all the files QFETCH(QString, audiofile); AudioFileReaderFactory::Parameters params; AudioFileReader *reader = AudioFileReaderFactory::createReader (encodingDir + "/" + audiofile, params); QVERIFY(reader != nullptr); delete reader; } void readMetadata_data() { addAudioFiles(); } void readMetadata() { // All files other than WAVs should have title metadata; check // that the title matches whatever is in our mapping structure // defined at the top QFETCH(QString, audiofile); AudioFileReaderFactory::Parameters params; AudioFileReader *reader = AudioFileReaderFactory::createReader (encodingDir + "/" + audiofile, params); QVERIFY(reader != nullptr); QStringList fileAndExt = audiofile.split("."); QString file = fileAndExt[0]; QString extension = fileAndExt[1]; if (extension == "wav") { // Nothing delete reader; } else { #if (!defined (HAVE_OGGZ) || !defined(HAVE_FISHSOUND)) if (extension == "ogg") { QSKIP("Lack native Ogg Vorbis reader, so won't be getting metadata"); } #endif auto blah = reader->getInterleavedFrames(0, 10); QString title = reader->getTitle(); QVERIFY(title != QString()); delete reader; bool found = false; for (int m = 0; m < mappingCount; ++m) { if (file == QString::fromUtf8(mapping[m][0])) { found = true; QString expected = QString::fromUtf8(mapping[m][1]); if (title != expected) { cerr << "Title does not match expected: codepoints are" << endl; cerr << "Title (" << title.length() << "ch): "; for (int i = 0; i < title.length(); ++i) { cerr << title[i].unicode() << " "; } cerr << endl; cerr << "Expected (" << expected.length() << "ch): "; for (int i = 0; i < expected.length(); ++i) { cerr << expected[i].unicode() << " "; } cerr << endl; } QCOMPARE(title, expected); break; } } if (!found) { // Note that this can happen legitimately on Windows, // where (for annoying VCS-related reasons) the test // files may have a different filename encoding from // the expected UTF-16. We check this properly in // readWriteAudio below, by saving out the file to a // name matching the metadata cerr << "Couldn't find filename \"" << file << "\" in title mapping array" << endl; QSKIP("Couldn't find filename in title mapping array"); } } } void readWriteAudio_data() { addAudioFiles(); } void readWriteAudio() { // For those files that have title metadata (i.e. all of them // except the WAVs), read the title metadata and write a wav // file (of arbitrary content) whose name matches that. Then // check that we can re-read it. This is intended to exercise // systems on which the original test filename is miscoded (as // can happen on Windows). QFETCH(QString, audiofile); QStringList fileAndExt = audiofile.split("."); QString file = fileAndExt[0]; QString extension = fileAndExt[1]; if (extension == "wav") { return; } #if (!defined (HAVE_OGGZ) || !defined(HAVE_FISHSOUND)) if (extension == "ogg") { QSKIP("Lack native Ogg Vorbis reader, so won't be getting metadata"); } #endif AudioFileReaderFactory::Parameters params; AudioFileReader *reader = AudioFileReaderFactory::createReader (encodingDir + "/" + audiofile, params); QVERIFY(reader != nullptr); QString title = reader->getTitle(); QVERIFY(title != QString()); for (int useTemporary = 0; useTemporary <= 1; ++useTemporary) { QString outfile = outDir + "/" + file + ".wav"; WavFileWriter writer(outfile, reader->getSampleRate(), 1, useTemporary ? WavFileWriter::WriteToTemporary : WavFileWriter::WriteToTarget); QVERIFY(writer.isOK()); floatvec_t data { 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0 }; const float *samples = data.data(); bool ok = writer.writeSamples(&samples, 8); QVERIFY(ok); ok = writer.close(); QVERIFY(ok); AudioFileReader *rereader = AudioFileReaderFactory::createReader(outfile, params); QVERIFY(rereader != nullptr); floatvec_t readFrames = rereader->getInterleavedFrames(0, 8); QCOMPARE(readFrames, data); delete rereader; } delete reader; } }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/test/MIDIFileReaderTest.h0000644000000000000000000000421613111512442023255 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2013 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_MIDI_FILE_READER_H #define TEST_MIDI_FILE_READER_H #include "../MIDIFileReader.h" #include #include #include #include #include "base/Debug.h" #include using namespace std; class MIDIFileReaderTest : public QObject { Q_OBJECT private: QString testDirBase; QString midiDir; const char *strOf(QString s) { return strdup(s.toLocal8Bit().data()); } public: MIDIFileReaderTest(QString base) { if (base == "") { base = "svcore/data/fileio/test"; } testDirBase = base; midiDir = base + "/midi"; } private slots: void init() { if (!QDir(midiDir).exists()) { cerr << "ERROR: MIDI file directory \"" << midiDir << "\" does not exist" << endl; QVERIFY2(QDir(midiDir).exists(), "MIDI file directory not found"); } } void read_data() { QTest::addColumn("filename"); QStringList files = QDir(midiDir).entryList(QDir::Files); foreach (QString filename, files) { QTest::newRow(strOf(filename)) << filename; } } void read() { QFETCH(QString, filename); QString path = midiDir + "/" + filename; MIDIFileReader reader(path, nullptr, 44100); Model *m = reader.load(); if (!m) { cerr << "MIDI load failed for path: \"" << path << "\"" << endl; } QVERIFY(m != nullptr); //!!! Ah, now here we could do something a bit more informative } }; #endif sonic-visualiser-3.0.3/svcore/data/fileio/test/audio/aac/32000-1.m4a0000644000000000000000000003046413111512442022635 0ustar 00000000000000ftypM4A M4A mp42isomømoovlmvhdÔfä¢Ôfä¢}@trak\tkhdÔfä¢Ôfä¢@€mdia mdhdÔfä¢Ôfä¢}"hdlrsoun6minfsmhd$dinfdref url ústblvstsdfmp4a}3esds€€€"€€€@˜ »€€€€ˆ€€€sbtdI16sttsA(stscstszA›a;GQKTOZgglddbii„yt†ƒ}„}ƒ‡‰|„…{‡Í—‘ˆ”—–”Ž™›—“•¥¦¥²¡›£¨ú×@$stco[&‚0ô1udta)ludt!tlou(€#Ù#ÙÙoudtagmeta"hdlrmdirappl9ilst¼----meancom.apple.iTunesnameiTunSMPB„data 00000000 00000840 000001C0 000000000000FA00 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000u----meancom.apple.iTunesnameiTunNORM=data 0000771F 00007812 00000020 00007FFF 00000000 äfree!SEû2~<ßëñ:µbèËÿs oît øg7ºÚîàªóGþ¢«Î¶Oîüª¼ê'äú*»DúŸEÁáU–"OÙú_GÕe]Õ¢aê{î×¶« @üŸÊö>˽ï²Ç+›&±û¿sÛö½ºŠºÄyßö¿iÛ‚ð8|‡Àá€ÑÿÑÿÑÿÑ€Bض`ip³-˜_ÿ"#X«Ê²±rcßÿ B•…¦ <é5"Iä1sf'Q᫬Ƴ¡`õ˜D€’Á ®àŽñÉÖx…ç·˜YÈÿjÈÀˆ‹€86 ‰œ!@®ùÍ÷럱ÿûp¹ ‘»Ù—Fp>¾ñPš @(Ù¸8‚Z<^0€„ !¿Yÿöøÿý½lrBBn…?³w˜=qŸ¯ÕãHç@ÎdJÉÀ‰„@€’{Ch8€[ „e@‰À‚„7ÿõ3ÿöün!ÌÈ ™‹¶ûª–íw:»ºNÂ~Ú‘(ËADêkÿÚâ&&û½R‹7PF±88%aŒÚ^z¬­ÿý®;ÿúeB¡Y€ººùÿÿT‹%8%ˆXùåq`X‚འ+̹5ÄWHXIí€@¸8Žpp•Æ" @EguUÿöùýZ½•B°€Øþ„ ´ Þ¡KÀ¬+[÷Šéy ì J}˜\€º¬ÀF£  £Æ †P8#ðµÑ—JÀ.®€þÿÕ"b€/ÓðH¤\Œ ¬gæDÝ€Y)Ø@¶~¨‰¤ê´”÷‹6Q¡™PR™ Á¢xm°\8ŽpX„á2(À*S8¬îª¿þß/ÿÝñœ^ ÅLƒ}è@À1"ý.Ð*¿`«ÉéáÛâBp$¨˜ýLD‰j`)?XK” gA’ÀX®À(:¤È ˜BRyÈ\Á”8#,BP‰ œÖz¬§ÿÄïÿü~h£vUl5j JJ¥î" Óà×àCR‘Bô°/ÄÈ¿Š–P LV‚ÔBCí‚ÁE€¹~@H½€£X5…p8‚Z0Bp‰fôׯYÿöøÿÿ?‡ysbò­›ô›¡OìÝà ½` lØœg4D°ƒÖ/š(*,«ü”–`D(° ÍÀJqÒà;à ÂÖ® „À08€[ „!(DŠ3*„Nÿú™ÿÿ¾`¼¶F]R°„„ÌÅÛ}Ö!ðñr·tçÀŒË&~©ÊìÓ)(¯ád€WEE™‰!`à 9$pi €88%`± B$qˆÔ¢PëÞ²·ÿö¸ïÿþý87©²UPW@ÿ?ÿê‘1° ý|€9yÔ{Œ „!Ÿ0 h‚-Ÿª›†` ê’É*@©P@¥„—)U€T< °gÀ8ŽpX„á©„j0FVwU_ÿo—ÿîøÑ»ªê°ÀÀÀÀ ìB`év’œî‹£šSB‰¥5+ëÅ€*ÓÊTIü„€¦hTˆ<¬C<|ƒ8½bÀÊà8#9BfP˜Ø&TBkŸÑe#DõW{ÎÞ£³ „‡? EȉßúØ’IezxF‚”°‚€p_‚—@Q2cúH U.¨Âÿ·€X(Ÿ¹p80X„᪌ª„ÖoÆVÿüÿþ[2)nos8Ø û÷€3ï¿ß ‰XŠÆ¾fEÌ„X%Åd4X ux¾p Êá T¤O4~!`)|¶TFÕ`UÝÒ“óŽ}dÎáE»ÝÀù´VEYê¾ßh^@ û‘G8€K,Bp€PJ€ „ã8€.ž¿þßÿïø³‹ªÇÛ pÅØòÍH3€„b´R³¯MÀ±RPíÚ–¼¦ú÷–gº”(Œux»’ @cþÀ@PáÉp)pTT”¥È³ß8üä ÂÁ§ÐÐHÉR•ð0÷XS û‘g8#,Bp€UFUÂk3ÆSÿ«Çÿ÷þf^4Ù“%k0 Zµ |L¨î 3\Úøý®…Ö¨cÇu-˜D¥AÕã=@H¢®ãúYzD”’(œ,(4°I'˜U.öù”@$ äìñ …@B~ä`p8’pX„áª* „£¸@/Ž}xªÏþ™_ÿï÷‹ÃsY‹Àúû©¬È»ü•؈Á0MåÛÌ¥MàWk2‰*òL š“^^©øÄUĉ ‹¥ÛŠþª;ø%„–ûsÇÑcš‡@#ØA"€*«ý} ›äW(/쌎8€K„!(LŠ3„Æ£¸@!ÿô»Ÿÿãð€Ý›¼´ä€$$$$bí¿˜A#{…¨‰©ø}¢š€”r/S²D°B$jwþ¶ à|8¯(” :&ý "¿{¸þK€…µÉÂÿ·°P—Ü‹88 0X„ì2¨Dn ãÖüeoÿÁŸÿç÷ETRVõUZæèúµµ€÷ßïÅ–ÊýM) F|%À¸kP²BVùœ™I J‹R7§·Àb+¢¤‚  Q4g~iÃ'{¸ósˆVˆšøø@ b²e÷"Ž8€K,BVT ÂtõÿöÿÿºÐ¡Smv¶á‹°!åšgÀ¯çêÀK²¯.Œ9€–(P‹#¿ó̃p…¢5 L…‚PìäÑL*q wLø‚ÓÞH[»´ô.@°t½ =j †Ð_r,à8#,Bp€U •B#p€ZÌñ”ÿêñÿýÿ¶Ê˜^è Zµ |L¨î $‚ê_µ°¨ñ \¶ HI×㎩ÁJ¶S‹› §Ö@ò•®=Î=àJõfïx ó:ñX€B¹> ¨/¹.8’pX„á2(ÌjŒFá¾9õâ«?úeÿŸñšÝÔa|ÞEò?_u5™7‘ò»¬r¼¯K«˜ŠÈõ5Ÿô˜h›œN(¤åÊz`X :ËŸò¤R`^›Ý$I–œñô tVï|#ظ€K+ »ý|€`_r(à8€K„åA9V Ðâ|>þÇsÿûÏÃ!“-Çg1ü;|;YÀf.Ûð6åÔhÎ3y4¢qÊ2ѧ›ÛDÜÀ±Ü=œ«ò´î׌^ÕÆ º(Ný˜e˜EÀ"ï[ñ9²‰LJA TxÆ*n;š„‰*”ñóªë ö†±ˆ åFíßñÁÈîÝRÜ,AR-k<ºç³Â¾}«÷@LëÕÅJ"vÐùïÀÞùç:SÎ e°Ì[ˆ®¯wgÝÖúºº80\Ä¢28Ÿ«óã+øwÿþoï(ƹ¼ôb@9ùùzn€NS)#€ðXBº­åFÚ÷M!iÍDÅbÎUlXfZ…ùÝdHJ€ß±¬Æl¹}Îʵmeƒ0Í 7 ÿÍ÷ÈšÌ «¼ûþЊÁù¨ ›ï7Üá@ƔĀc÷f‚€À8€K,DÁs˜äfE‰Âtõÿ÷©ÿò_Ý…&ž¼¥(Øc†.À‡–jAª ždÎØÍåA—Âí «jȨ«Y+UP_—¬PQk ûÀ"¦þÃ!DD?!ŒËˆ?–ø4‘´ ÷¿~Ú Äô¹‰ørrò]Ê‹PX ns88 %-Ôc‘˜Ô&Gíž½U?ú·ÿþüù™1\rP&³ÿÛ²%ñ2£Ä@Ài³à@2!ðûP4@£R@çX/°€ €ß BƒQ—ûõd'/tœñB_žk$ W@\7ò?R‘ ” …¢zp4û!!l±&b 3‹€ûr88’p[‘*1¨ÄN ãŸ^1ŸüvÿÿϸÊ^ͯ( ]}ÔÖdç‘ò»` kêùªäÆîÕŒ~®›œ_¬å£Õawž÷’€¯+@BÃ~ €%qFèÇ* %¤À¸Z>·ß$ ó|à‚CÌÌ_©R —\@!ï È1öæŽ8€K„ê1É*3„¿>¿þ—sÿý߯”Ê×:ØßH,þ¬à3mø l¾<ò¼ñ’®ø¼ã)º¼±A-ù¡Šö)V¹f¥]y;XÂh°øŒ@ •üø…X“¸N™#¯Æ¼(˜.ÿ‰éÐjÄ ¯ä~¡<™ ­=òþ æ9D( ~ìæp80\¨Ç#1¸LŽ Ú}½eoÿÿÿÍüpe/»¡ëÊPŸ/MÐ)Êe$p fäÈ.…m¯lÒRÄ.$Ä\BëÎj²e…¹{ƒ0©K=˜ýÃ$„CÇ'$Œö`ÃüÇr«ÀB³c}ïä›A!ùÉ…ó®/Ÿ¸X?&"BcF@Ì ~ìÑÀ8€K-Ècq˜äfE‰Âtõÿ÷©ÿþgÝX§ƒk(l1Ã`CË5 Õ ”ñxF5yk®’N_ ´J^^°1ÇQˆy:ù°øX RÍø×ûí"âN~€œIÏ–"`Ë÷¯,FÐ,áÞ}÷`˜ L=.`=2`€,òYæ*€ÇÛ™88%-Ôc‘˜Ô&Gû¿>õOþ¬ÿþï<V¶¡¶“h…Íç‰/‰•#`;@ÂQŸgæ‰.òf²åÒŠ0p– Ø»ÙÍÐøˆ{çä¨ âô"!„Éþª€,3t€Šù¨ÀÓ¦{V x=Ðàc}0Xûsg8’p[Fã1ÈÀJ##„øç׊¬ÿã·ÿÿuª*_zÌHª€gë ;ü•ØÓbÝ´$„-ŽÌ}Θ…í'€”êFv“²š ˜i@ͯWn_óÅ Á'ŒdŽ*I»È®|c®Xl ¯šä€+æ¹ ¯¡p¹ð"¼‰•°­„€cíÍ8€K„ê1ÈÄJ3„ø|ÿýŽçÿû×ÔV+\Þ DÈ ÏáÛáÚÎ1v߀  ä™Åy\§ä·¿¦Ef…ƒZ(CB(^`y}È¡oÁˆ‹F•ÿ%ÜC¸I…>QxC/âºD@3ŠÄ |‡Ôä  €_À€Vžý€·@/J@°1öäp80[¨Ç#1¸LŽ ï?>2·ÿ‡ÿÝí¤ä¾b“¹«Å 9ñõún€NS)#€ðb§D°S_S ^‘)ŒáÕÅ ÝÉ,~¾å€’FønTåüøÚ‹ xäÜ;ꈆ³õ B³ÀMwŸ“í@˜"}€y•!1{÷ å@¸ePýÙ8€K,Ä–˜ÜB'Ó×ÿÞ§ÿ÷|&µÛ ÀvÃ1v<³R P+×  $ÏûöÙŸ›@˜ÿ.Q êøðKòÜÄ…€Ä }¹8 %-ÈAr˜ä€‘Â{g¯Oþ­ÿÿ瞌Êã›o5ßSöûv@¾&Tx‹›-!QlsË?³íijee; ãg¿nV&³BÃÜŠ ½ð€IÝßóÅh›/Bfj&Š^`•_žk$ Voæþ=´ îX!`k÷8‰¼€ó¾X^cBB¯Ý›88’p[¨Ç$¨ŒŽ ãŸ^*³ÿŽßÿýí‰Í¹·=Xbë ;ü•ØÓi5ùªZ¢±^û5ä6ªEq35•àÆEJ¢á ÞÆ-°CéÁ¥Y* £äÈRËÉãTž »È¦úß|¸Ø_Íò€¾ksû"Á¡àw@Ñð Zb‚ƒWîÍ8€K„0)N yõÿô»Ÿÿï_@1ƒ,Œ@ÎÏáÚÎ1v߀ †<½…ÕëE$ˆÇ¤ïÁŽ¢€jæ-Å dÎÂ¼ç‘Æ$ 09ñz \‰.+åøäZè8^ V LPþkÓ jÄ€¿‘ú„ p¤à +æHCß H}ð$ÀÈ _»2p 80\ÀD¢28@/3óã+øwÿþdÜL¦/mQ@9ñòôÝœ¦RGàÄóÀj¨)—Íd µG:EÖíê@¯9®À ¢Ç>€]½Û2ÀËŽÀJ|, a÷@H@ÂûßÉ6 X õH‚Bâ÷îó1.EÀ€1öäp8€K-M*2(„N §¯ÿ½OÿîëI™ZÖ¹hí†8bìyf¤ v,÷p[†gŽ£ù~J\¡L7gSu6φjȵ‡y×ÌÀ¢ÖÌÀB%ƒ|åöüD„HµîÌ €Õ– Ÿ‹u€¼€¢Ã7;ï».ùhï§põÈóÄ4Т@Õ年8%-Bt䀑Â~¯Ï¬§ÿVÿÝuµ+XÁ½^2ÁçæóÄ€—ÄÊâ°`ÇhC ©w9ÿ_kat@KzÂö¬(»ÙÍ… ßTYŒãü™)kFöâô$ãT2DŸê  W€_!õ€ÜH°¯ÕŽ` x1,+æàcLûsg8€K„%`ÊŒj1„øæ¿þ¥gÿ÷ãÍîù/ ¯»°?_u5ÓX=WBîý 0@4cS¿Ê×W§ŽI¼µkWöæÅŠ1L1G˜û+Ìl@sýŠi@ÍAφP3„#n_¥âe…/„Hf¡\âHA²x%`26zŸäv  á8Ÿ™@l ú %×À gº%ƒhòÈ£ 5~ìàp8 €K-G–”†'ðïÿêdÿÿZúÒ¹/wTx½J Λ:iD€Ñ)}7òÀ(Ðý•­…‰b–÷ï+ËuÊŠµË¦ÙBpëq‚üïrT ](9æð*V“é\lx6¤ ÚD«-ˆ ß÷»ƒ ,õX·~ëëò`@#ØHŸÜ¸À«¯0žœFì3l«÷g#€80\ÀD¢28@/ÄüøÊßþÿÿ½~ÂûºÅòÔ >>¿MÐ)Êe$p @jñ „e,&ªwhîü†Q$Þc1œ¹*¥a»;À*ýŸœ 1óéÄ2a4nŒ¿ßwL®µkY )Ž xf 3ýŸ­@@μçë{@% €O¨-AÉp —ó]À-æ»…æ^ÃBB¯Ý›88€K,ÄÄ ¹N+ FqºzÿûŽÿ»é ®Žk\µ*ªÁÏ pÅØdÑà T 8ºQ77B1a`¦Íét#C¨ë%9h€ØÌFX¿¹rßgê#–84Á¤­luá”R–BÄß@]„'[©œeö—3BÈÛ ÃßÕ€+Ș\ç“—€`üÚ -AÝäÜ^^¼7ä *²Õû³A@à80\ÀD¢28@/׿^2ŸýOÿ÷>,¡¸Úùp ·ÙË„À |L¨l”°mn`¤h“yBsùŸB¸ëÈ\W+ Z÷éMÀ«l o÷Í›”R·’_{£"ͤQQ­ú^2Rà W „*Ú°ÃjÀ°+üd€€1^P ÷þGôm¢A( ~d k÷E@Lo<™†‡äwKÅ5~ìÙÀ8€K„048@/®kÿêVÿ}Ôb÷Ø(@Å×ÝMtÖUл¿C0 §ßV Ò‚®nqùb¡zËtåâpJ`]s¼¬L 2$¾}5‚K ãÒ2¢Q¡!KȱΕ]À'çýj@+`¯ò=HZp, ~eCþ$†AlÒŸ•!£ @¾Êb\8€K„äAÊ@.€ Ìçÿêfÿÿƾ­Œ]LÄÝ”€Ï޳HD¥ôø jcÕðjÊEÎhc„~'¶Vä—1°äâ6¼Ä» ÊåyΖ-B"çË]@„JÙ~_X@CzúE ÊÚ¯@ hX?ã{šÂHUY€„ïýß× €.<%]j€HÐ@£HfhfîÎG 80\¬ƒ$(ŒŽ Ùöõ•¿ü;ÿÿw÷³1yyµ÷w0ÏÏËÓt r™I€üéš‹˜Ú7hîü†¶†Y“[+[­XnÎbPEÖTº¯9Ça! Ps騳{Ú2ÂJÙqì,¹ºÎͯ A`~ÉÜ’Ð0¿;úÆÀ @õ*@N$Wèf@/›¸&húÑ/2–s(«íÍœX-l@ â@Ê Î ÷oŸÎwÌ×N¿Úi~Ú‰ºPîçn¦3EÈz€DDDîÜ'f¡>õÕ ò ÑmHt«t†@Ç sâÃXÝôügÌó¹qâóDQ¡c¦j¢Qj  8ðð÷añÑáîA†a²ãÏnh˜b¡† ¤ÇVÝ[e ìÊ 0B[e¶1ˆLPz"ÆzöæLAz¼¼ý7rªŒ#+°þöâCcGwkW;Ÿ³޲ÖTÈIÅ›€kªÝèv@F@HˆKö˜`ù0±ìÚ°,/àÀ ~P@‰H³¬í¤pH›þ ”„Љ"%Ïãâ|kZ™ç‡ð<èøœì?‰.Á͉Ù+Æ»6&{„Næ_ã‹»ÌmÈop‰ÜËüqqm‡dÐÅKl;!n§Dü[T†u:&ô¡ ÅoJpµî¦PbWnÞ½ÔÊ<ñEôú|”ó'ž(¾œóÏ_Dü”ósÏOsÏ<ñq‹Ïs'æ-3ÏóïM4É&›îß,û·Ë$ IÀsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/aac/44100-2.m4a0000644000000000000000000006200413111512442022635 0ustar 00000000000000ftypM4A M4A mp42isom…moovlmvhdÔfä£Ôf䣬Dd@utrak\tkhdÔfä£Ôfä£d@àmdia mdhdÔfä£Ôf䣬Dd"hdlrsoun–minfsmhd$dinfdref url Zstblvstsdfmp4a¬D3esds€€€"€€€@a 耀€€€€sbtdI16sttsY(stscxstszYÆúU?ACGHD^KN¯«¹ –‡¦³ùY5 »ÈâÔÙÆ¯»¾ÑÐ×Ǽ¼ÇÒxVÛà þüü ýþ‹Ú›nû! ÷ /-"'¸ $stcoÊ/ãHcþ1udta)ludt!tlou(€#Ø#ÙÙœudta”meta"hdlrmdirapplfilst¼----meancom.apple.iTunesnameiTunSMPB„data 00000000 00000840 00000338 0000000000015888 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000¢----meancom.apple.iTunesnameiTunNORMjdata 000072E0 000000C9 00007435 000001BD 0000055A 000001E8 00007FFD 00007FB5 00000000 00000000 WfreeT mdat! @h!NäÿøTCÀ:âù¨*ÍpÅ;UE„ûyøü4Ù߯ü¿ÿGßùøöé…ÿýÿôûëë[Ö!Ö¼¿úÐ0wZë@ÀAâ_ÌÏúÊÿX7ú Hâ!pÈÉY&Œù$©À#]D¦ŠC¥-:ó0þ›ñßÜÝCÑÚMê–µi½x×»ÅîñWº‡„^²YYX ä¿Ë{ýéIE_ó‘ü"þÚÉþñÿ×{ð…öÒ”ÔÖ¹[ûÞ­ˆ^ÄÃú…þ‚Èן¨_ÊxöÃ’ ·Ùd¤d•;±ÃéìÌŽ +䢴Ÿ´¾v‘ÿOú·xÍ ó·è ȧ„^BõŽ\lÙ²;º‡âøˆDºÈ‡áùׯ™É¯_ý|¾óW:(^%á.¼(Iãá?óÇR_’_±$x~Œ–b©¼ÒVÚG_ƒ%Ák‰$É WE Bäžvÿn+Ì·½/dö âŽð‘i‚È.$ÿ”Dÿ™£úµ’þnŸçé%Ô½fOú «“|íîêɦ/m›áÙ^€{ŠFÍžëL¸©¹6“ÙååÊå‹l”Fà¦$Ad9$õ-ÝæQgŠ A³%À!lHÁ򯁠¡„@·ÿ_OM·tö“êÖÕH‘…#k•3'‰gyé/y£Ö¿MmbXµ<¼XòR)YÙOéf©êšƒsUµL§§i—ÀƒÌ˜“`>ùNîšîŠÛ2. =Ë;P3H]ÔîUH»%«5 S\+n誤]’ÎI5 Ee5TSA5jY©i ©ª¡Ñ&¥é rER/8BZÙ&i,€ilTçÊd£D–\‚¤“BlkD,„‡–wãGiÃÆh îJ?;†îŽ:ÕHAI½À®”—Ï=S³½·Ôâ2-Fk€ãð|ÂXç V‘L€„@÷;Ï·ñ¶Óùÿ¿\ ‚åT øoç®[Ü?Ó•¸$L=vVgÀLb5ë‘­=r”§®N2&—‡tÀrà醀8 „T4ˆ!‰‚çíý<óÿû¹kÊŒ1=«ã^¨nÝöqÄdÍö£=,Ñ@p8\>pH p |T4ˆ!šAãþ<ßÿþ ʈ8?§ÛözÿÿÀdzÚåfàŽæ–,£ÌÒ.*#L|täǹ–áBáu …×i¼eäÔˆ Ps@ }V€`˜f€m{ÿ?‡Ïÿî„>ÅÊŒ3•J_=Î 0ÓŸ5s²Dn›Ý‹}{|ªßô¢«Ü‚ãüÐ3–Íp ~V€ZBƒTˆ€b#Û¿éöþ+×ÿüÐ@Ç5ÊåGߎ•ž$|0t˜ øè³®v†½æojCa×^%zõêã¬~ ùêÑwF³%z|ï/žÛû;TEEêV&¯HoìËgCMfh”Nk;q\~¯ ˜«£+¨V°Öû"«0°+à®ï‡XÌÊl^%2kX1…âjñ+ ­k§»§úô` B±žzÿ= p p €T5ˆÊA°PFGDuÏñúx÷ïÿüKëh°˜ÈÝ¿! çÎkcÝüäEb†cî,ú¹Ï,,, ,*,,,,,KµaaaaaaaaaaRXZ/ù« Šx2ƒÕ}.G*¶dd¤°·,gßœxïA6)±NØM‰lSA4b~¥{Ï=Éí:z{œX ¶‘ÂÃß¼^ý½û{¾ìKN<®D€iýœôsEµP]HIaHÜ É`?†[‰bÆ<Æ!½à'”‰ïcÉ.à”w9̈!!(þŠ P„µ¿-PLÐ!,C­­„…cX(C"Æ'“ÿÓxëÙÖ¸q¯mKËnèÜs‰[.RÒdB'îïn“õ—šIø'„Ôx€‡¾þNús÷\…+.àˆ%D»bxébQ4V-¹LE4f)ûNðÑ‘N…—–" û€0ãÃÃÜÇ?–#Ë—û—POÓ‡ŽñzAynòÆM ¹¯aç8å<ß<…3\ÆX“³É Û(KçÓ  0ÃÑŽ:¹sZ¢Áãw"ÆV£‹ÛêSIÛ2Ü0ô¾gwnˆ¢„)ý×GGJôj—*ÑO…ª7€@^Þ±Ñ*êlõü™€€DÀM"à!Nþ€óhŒFH¿ÿGŸßùëËYOZë@¢ýxHúÐ(ZëÀÀ!ÿׄ‡ÿ¯‡‡ˆÁŸI“þ—ÿ²‚=kìѹÿëÕ%ð›Þ?¤_òo%ƾ½üœÿ¬èÂÿ¡×õP#ú¢Gôõþ¦"_ ~Hþyßߌ„Ϥ¿s?éMÉ%§2®)`Ú´·•qOÁâU â­wE*'攚§€æµ¿*s80Ô´œLÈN¦s-XÊ’•TÖ™²“)š¦ZÃ*Ê©i™à†¦ªkZ[«šYU4™º¹¥'ª¦–‘K*¦ªŽ pC†87v5ÓŽᮺkÃ)#&ëÃ/´Ë dÅÛ»^uÓŽ׋õ×Mt¿v2S&$Å{ž8c]5ÒW“801°```‘!%BBA‰=à‘7rÊô¹ Ú¹<}U®WÄÒW8żçÕ<þe[À!NÞþ#¥¨m³ V(Xƒþ?ßùúó­]ÿ§ëüû|jîZëÀàÖ„‡ú˜cuàa!ÿëáœë@ÂCýx|?Ä?Œg٢ϟü™„Ö§ü1Hÿ_õí’úqøã!üÙÎZù-\E!€ îq©±ºÅ©j›L†yÛ|¹ë´Ý:\¼Ã\ØS\ùÁgU—Á¿w^×I^W‘ã‡]x×€f;¥Ê@›¡é. L£ ¦C¡ü§%ü`¿ÌÜGà÷Ô"Ç›üÃ$û÷Åâ?É7ü”¤¾}m!üCÏdCÆ_ /ßñPhš-³ƒÐ;Ç‚LÔ7ìí±æw[[Hõ Ñj{‘ˆ^Ò®ƒ|ªš[¼Iìl²iQ´º†Øo&•Sæ6FUTbóì&ѤÊMY¨´Ëϼý—,,wuáÏ gYÖ¯¼)¬h©î‹ÖÀÀǦÏD„•Tª2#+mЇ\ ˆ-Œäüì(H'KUÒb„~þÚóÇßßüz×/W¯µ×¹¸¿© Oöû¢'ýp¿ÉNKýqÿÂ?ÌÏýXD½;í’ÓSüß{ÂÁú¤ÉjæÊ{¾ð”4ã?ØMËÖÞtãüßšå¹×ωI ÃqªË„Ò2U± ü¯—m»VOH5¯q«#V„(ÍÛˆ×è)¡¨<EVê› ª—’ãƒ: £ˆz0óÎ9u|!lH ÁêØ‚ˆ0PLˆD€ßÅóý=Ù»øó:óÄâ娵@Q‡Ž×)¦>û<{¬‘—8+dry9 ÙóHÇ›~u@³¤2r¯Y¹_èæ™æ™‚óM³ J¡§©® )v¼UÍüÿüœ<Û¸Y… sƒÐ,H~(ëŠ!bó‘5Š=_ ‹v™Ö)v&Ìü¹ÏŸ–_/Weý“ç–h°°¨¾‰aaQQgXZ¬`QG(qQÜŠd9ƒˆiŽ[üc|€0Ò‡8fD™DðXƒ”TN±è¥hj®RTÌbKżæ–pf“„lº°kÔÂq15Ù",(#¥”yg20aø¹°¨º$ —í`b¤Fðpc@ |P2ˆ‚1`6 …„“ˆ€B0sý<|÷ïÿþßW´¤;ªç`Ô^=~‚Š’ÈÅkGÛfI1l&¶ b9ó+âO,õOT,òè–*žT–%ùKD¨³ŒT ƒ3BÀ¡ÀCÅå€n‡0³ŠË„X s $ï:£Ó,±T]ñ¥Ä4¡ÄAÊE)~ÊŠ‚•¹Â’¢Ýåšd£&³çYæÌ„ö"jq˜2ŽWp`58‚#IJ&³LýÚ€,c@gCCÚ¬ D\.4À |V€J ˆB‘l*iŒ#/¿ÏçôoÿÖÞÓ(„ ÎO –aÒ ‰ú1ÒÊ<„ûô>~Ö ÓMóÓÓM4ÓÉo¸ÕD³g43pàPRTÝÑBú Œk¢‰Œñê£lNF_ý_~p†gá £”Ð=™¦qMG(a8°tú5!%¯¯HA&®þ} -8¸G-õ‚ôݶ˜’Ö€…Û¶Ùœ¢iB¾óÇ]Úf3“[âö€PE€À p „V€R‚BPØH6‰Bbqˆ€B õçû|üçÿö’!e&å»o[k0ÏVÈ€ ¡]„Ì·[QkÀ”§„Î À™‚| ‘,,,,þtÜËÛ½ÞMÑ@Lc÷ÜÜ\ 0cGwÌÄV,SL,®¡»ÿдF>—•†¬0PY£}€ñת)`£ÌŠH¿/P ¯ë€¿î I@§æ`.@X4À |V€S¡°ÈŒ’` Œ¼þ??ÃÇÿûë]êatÀϬ&”Û#a¨˜h2㇠MĶ·ðZde}mY½;µêëÜddndqq)15§ô¿È ÝKm¢¸;pG,óý›ÍÒ‚ a¢Ü?´ ,S ¬JÕÎòº´ä«ÕÿgÓ¦fWƒÒ<|Pqº6 ƒE÷Õ±Eªôø GÈñÌ*×Þê¤MβŽaDD+Ûñ›„ÆXHÃÞ`] €Æ€8 }V4ˆCb¤H ”Äã1„ GÇíüxþ+¿ÿò¿ŒŒ"c‡'a2Ž®äW©ÍÛ¾Î8:ãHÆÉçž[Ï<óÛwíºû¬¶ËNÛÊË‹%ºËl´í¼¬ŸÃìóß¿ÛÚ\ïïïM0¾^lêâ釺òêÖx^$:"Ȉ8ËÍÒ² Þ³0 ®5ªQdÜÚÑ1)—ÝÊÀÈíQ@]ZÿbÀhBú˜ÕaPKSPÿµ@wÃÒ  ƒV€K*°¨Ìr1 F~7ü~Þž?ýÒüójMeì¥C{ç0Ù"û¥3Ú3 eqL”ŸÐ66’‘‘ÂÂÂÂÂÆÝûxç’ÂÂÂÂÝœç d°pdpdds¬,,,-ÞÆRXT‡Ì‡KçF!¢a·q³‘Ýc1‡e–&RªœCâ"=Ç_¾Û€˜Ä;2‹FÁ}]7Z«X¼ç”v0uz¿©ÕÙÿÇÅ0éz©ª×ÕRaB'íú+¹k]Ïh×Ç**à Lk%aHP6;ˆFןǿìÏÿ‚ý©'7I»çT3màgåñÿË}pRPµ²®;«Ö3òË'ŽYåœý‘œùÇVs­Ì6Âl ƒùè6Cd&D¸‰¬Y8ÀÀ’ÁÀåó¬ábXÁ…Ç䜬/ Ã?‘°, AÊC¾²)¦P⸮î²Rß:ŠÕ66ßû,`’'[†¯…*ê* oñh¦ôµZ×l…µpÇüaJ@­o—` Aí@ ~T4ˆʰ l(G0ˆ#8¯éöý¿ÿÓé /wJ­Öm€ç0–»†÷¤å‹¢ OÂP¶7`ÂÀÀ²¢¦ž¬öK<¹v|zOœùõgFs˳õ–˜–z§Ï)c>­Œ°°±,UvsY"À ÂÝò¢Z Åè"I–NPå2©w´bèœCD£¥q6Æ,¡Š,ÁÀþeFëã–> :*RœWEÀè¿:ÅŠ±™}-VQžSUØf¶qtYˆ¥JbWâË0M~žˆ J˜€ þ’€ €˜Ð |P2ˆCb ”6 …Jbqˆ€B xþ<|ü¿þ5ü0.˜«ÅÛ›:×:-tQHöLÀµ0_íQcQESáá‰gÓ”™H’§aŠ** ,ªÐh¿7,`vî'_Æ-6‚‹(dÕž&ØÃˆiKåGÊÚ3 8…‹qÊÂm˜1¥–XÅ÷z¯jÀŠ›m¸’)_VB¨!ÔÂÑ11Χ%kp+ôöOp¾Ç«þŒú@€gŸ‹`<€”@p4À „V6ˆÅp ¤v3D€Ÿ®ÿ¿¿¾zÿÿWÓ!¾7®V ñNؙũœÔì,땱Á¥ŒF½â‚‚‚Â’M-z’I…$¢I…E1Ê2‰Æ»†ÆˆØ8à.…)¹b!ĸ$‹Å{ÿýtÌ¢qÊèÆï@QŒûïJ haeÊkµ ’@c»”Þ« ÎwT û”€¬ûü@Q‹@(³.ËQ?• Àþ @€°,Æ€8 „T4ˆÆQØH6Pˆ#>ïíöþ+¿ÿï«(CÞëV\—íÚØw·ŽŒ™trÄÔ¡ØŽºkgjÎíuÓ].ÎÎy ³›³³ƒ¦Â.¢¦§*Ž ¼â¦¯÷…7cF,Ã. LÀX~újœP\(·ÌÈ'‚ÀÑ 0 ÆÎ°¸´ÐÁ4› jìH°LÁ´;"À«4´pŒà X§>Ì GL,™#Gð6€àià |V2Œƒ‚0ä( ¤FßÇñãó^?þDúdÂ'w2`æƒ  ùåôóƒßfļÁfõëÜ%ëׯ^Ã#~D2¡B È€Åb¡  ˜‚Øìm­R;NŒ””Ž̇¡‘“AÛbÿ¿Ž5x^ÊhñaÄ 2–hQ…”i€`¼hêr²’ÉSUåÍšéYÖkÑŠ3¡WM€*bï—Ú0Hĉ¾ùÑae…»÷ì€b€Ö à }T4ˆBdXdHG0ˆ##þ<Ÿÿ÷C%.”cšÛ`—õ ~éz÷·Ž— ë÷±ùçžyçÊÎû;û.³.ùÝfKvvÙn~Žy_u±y_eŽ·(, Ë ŠG‡ñPRNb84C˜8ƒ‰%g­«W…Öu_ìz{:3¬ê÷k¼f‘Òg§7Ë)8c‡èÓ˳1óž°fw¹ ™¡W}ž7DÑ%g°`¡w‡6•L×ùtÐ0xäcé0¦ 1€ÀLh€!,HJÁÎØ„„ ì" ‘Bq€„ 1 7þ¾¿»í=ž^Þx¯.CTÚ„Íú\¦¤H„D>Güy!ñÜd=1× ðŸP“õßIJ6>³ÊçÉê6$èÓ'V´÷=É£#;€àXÅí¼^›üŸâñu³4{CÃÛ8ÅF#ÏwW·,°*¡ŠŠŽâ€¶íüù}Ûuhˆ ã m³–¥L§i¤6néÄy‚L{éúò )Nùã¤Û‚0ˆ9Ítcå ý޽קÍÁÌÒþüq«)éÛV°æX•·õæªÏª ‘ž\Hÿ¶@Tš+,uù_› ÁÆÑ]€‰0=8C€!Nì€ x6ÆDÌZLˆƒµ˜7ÿèúýÒ}JÇÿ›ñúþ=¾õçÿÛ§ßé õàaÿë@À!ýhH¯‡‡^þ´ ?Ö„ƒúð(‰|óñéúo%Ù~Ðûþ¾Â?ý¼OúKÿ<£ì ǧúײQI É%­™²]Øï[E”¬ì0xXº«Î7ëe5¦eII™Ìµc*J^ֶ냪Éð²ûÖ·eÉÙw7mÉšHu™Øè²R¹ÕªI”‰H)"’" ™i‘I”‘HM10 Hq)xâ¿!Áíá%lf†æd¾Æù€‡ó9þwäÿÊ#ø§%ú[ÿ8É/Àã`ŸòMþÌÝ#L_Då $XÓdC‹:©™Ô´’"†Ž[ÇÛ“ ©öî«Ñ½~mÜv¬?ªò¯YÍ,Ö'”Ë=r\Ž*6ÈÊñ§ÍyÑè»åžÎ4½ïL¬GZ[%%3ÓÞd–$)ÜD ŸÜ¿ÐÒ Wr.äzýM^ô* ƒ ‘*b+Nâ¬vÅêP‰r¡0oÿ‡×œÔoóÿ÷>}ò²ö‡^Á¢¿¢~v¹!õâBOèÈ&åRCüž_ÀL—â/üòC_³RÊgúO~„záÁÚ1ÕŽäøˆæÕÅ0º›¯Ó_]Òvñ{5Y1hoŸ^—4…ukÿZ2¼ý ?ka{Ñ‘W‚[ïŸ}”žÁÖZe ”äϹ¾Ì˯ëVQ ¤çá¬Úzš¢×oWÓrö½`ŒU¥Ä~ô~xÈ{[ðõÀöï­&ÐsLøÍ×0µ½é¯Ô;> ýgWöp¥p!lHÁòØÃ¥0¬, ¤qˆ€bù¯éÏÎ>5ðö|_IÄ”¡EQã*f.…›%Æz9.³Ù‰xÄ„°vÉ[¹+F"Fûi:˜Š™HEä³°?~ÙÖ×Þ»«°±gxnÅî-¶BìÑ~‹èUwPtµJxJ|&}«kU+Q†õZ¦Ûi¿|^ñŸlÛÕ!‹ä½ƒ…Òju‡ü– ÕEW`Îê£iÁÕ Ì,z†z¦‚\a9)aw~9sѯG:5oñþdË4¦jU¤¥X³ò¹CŒ'”½•Ízz`ï$J‹ÃÝI7øò‚¢9ÙÎÀ½<³( 9TKÃèêY`z¶–LÑlÆêü"¢"«iõüµ»Yœ×»:¬(Ð-më¯ÿÔk×˯9ÿÒ%u‹r tôsî¾ä€ €(Xô „!» ?¯¼ƒ€ ƒV’KÁ‘XTFWF;ç×5—×OƯO©¡C/&ÐSݵʌ1ý,‚ WIz{Ôw7J×ÛW#tL˜BsXãªÙóÏ<ð<óÏ<óÏ<öº©®šé®šé¯_wZc…5뮚魟­Úºk2g¦Û÷ùDHšgÔÙajêSo£±)5:>ƒ³í¤†9cRг%€ ¬Céß08Y¦Y‰¾tHB ¨M`½ëûÀÊD\4ºgó1EE»°Ë'¥Í$à ©>%f—¨% à ¸h€ |T2Œƒ°°ì,; ‘ \Â@^¿§Íxÿ÷ÜúÚºìÖúÊPªÊxd¶ï_}Syàz㌴¸Ÿ¤»w˜ÝºFíÓ³©ˆ4-– èÎÛ ÊÚÛáKÇ ë’ÑQ³xÈÔ­©™2’À’ ‚•÷^† }°$`öÁÄÌžŠö0à9‡Bè‹æ*»©ÎÈt»–€Ca¥2¯”“g{ý'–3¸!¡ÙPÈ×+ôÕÒ¸ÿÚ¶ax^gW†XÊY¶]¦»oG¸7ô:fÿˆ{ƒ˜!¤i³‹ô‰•ÖÝ)µ_þšK/Z7s+0­?ν%X’L:¬„DË`ÌLDc@ ~V€J ð°ì, ŠÂ° ¤fpËú~~_?þ÷Ñ®'+o)¼ÈäKtxÚ3Uq\•ʵ3‚00>2ìËìi…Žƒt™M†Ø/# ÞÂb›–Mudýµ’šF7íüá`ç–– ¸ ,/òY¥Sކ$ÔaÄ4Í$CƒˆØ!`Z ­2•Táb³ä¢¥H…“ª„M¢‹ùôŠö4ÁÌ;Ê”‡ .‹"rŒ©F”¤bdÇ‹22†0ùƒ²ÖS9_c€§køBÒåNlÙÆiÁè"ï_Çêͧë3L:Ÿó˜+;Å1¨Œ¸ÉÃÖ©EÃ$…°4À41Ô³N$ÁÉÛyôm’§ûa8Ð\ç¤ÃF#§ù(3à‚é°"AîÐ;¦øD`(4À |V€J Âð ˜6 ……(¨L '^þÿ·ÏªÿøOf^¶^^â¦[ää­Y8éÂþ:¬Q`"“"„Ê{yeÒòÊ—êdÇÅ/©¤®D;€PZ“âúÀ«—Š3án&Puj—ÿX‚;((?1ÆÁsQey(²‹UH]ž„jSzXÐï9˜¢‹(iÀE×A€ 9 -‚Â^Ù‚,}<¢c•ýN)‹ÃZe1ž8Z¹©+¢ÿ/¶î«Ît›.' m¸Êóĉê4™áxq£ê;bÙÔã4ZY¯+ Ôð·R_²Îéäl,;…@`(4À |T6ˆ‚°°ì,' …ƒa‘°\À Óþþs×ÿÇ×—w­–rÒ··.A«lNÕÕlììë•ÁåŠú„Ízÿ²ˆÎì 7SjÇO®¿GjèåL†-J×pêC¬ 0¨¤§!!{ œ"U1UxH˜y µöC@oú$Pk„(•!9b(€c ê ¨ˆ³EËKˆ3¢*£;”¹P”ÏE’ÕÙÿñjaWróÎ'•Š+Ц£ïÿ숮W[ ›ãh© ¤)´:­<ªˆ3ýíË fm9à%ŽÕOïP4I*y$€1`XÐ |V€J Âð°œ6 †Ia ¹*( ñëöý¿/ŸÿöúÛ=»/%›ªå°ÂÕÒ?J°tR#Lºæ7s aÝMz÷߯^rÆ6¬ÛÑ…IéÝe­YÖIHRFódZŽ-a+R¥) Zí3˜{Š÷2882 ‚Ø»œæ­¿Â\È ‰Tí‘@Ñ¤Ó ÅeJÇ€µì¸7€4Ó`k„¯œº2Ë¢vĪñó©¥ßU²æ§‰ý÷[=Ꭰ*ô±ç ¦àB³¤ý +1ìô_“d)‡ÿ9Ü bc… aø0À © âºÀ)`X p }V€J Âð°ì* ŠÃ&1(L€7¶oÛòõÿñëÙ[óÝæ²ò2ñ36æö X²Îæà½ôÍèÓïŽÀ“ùDQ +×»¢×‘JǦTQEËzn²ë#;o´ÈÜáHñµÙeHÕc4ÄŠ¨B’Ü•yÂÅ—fFµ`ÈíÀ 0¡³7ÛËCLfŽŒuUÕ×”Qe |L¢Tfc2à"ŽV¦½>ÚÁSÓ=SSX¯ë“[¿¬é€Y¯;ìàâQñÊ4gxµáex¯ÈÆu›·éC.Fulêîhc½uuÐéÈÊ4fW?¥pNè2N!¡Œ¥ÆøÝŸeãØ&:€XW¦1@XÐ }V€BÂð°ì( aQ8Ìà&ŸÇíòûûîþ)'55“vLÈç&aØBÊ_{Á¦滚Fj—˜ÿ0`ÏÛy®ŽM@m1¨egW?-—YbøÏ–Ù¹ÏeÙ©èºNpNš ¹ñ w*Ö ”¥#%%%€ô }UÙ3z^ƈt A$,H{w0Ϭk3K0Ñ&£˜7E*iWl¯6uÓhM*»ÙÉ…ñ¾aUšâðl4ibßb­¾§ãËͰä)‹ -— Œé{ªe¶üò¢û9l¼?§VÒ»´àˆ„M ?É@æ,¹Ìðz°KÅ5D@Ph€ €V€Cð°ì( FÁ“ m?·£çÿßw𠫨޲R³)¼ ´AéÁÄ@Q®ÞF—$–§^𰳌,-Ï ‘åé§[v•lS@°K˜Û‘9„ÀYäIf%X9Äé#3g—)rþ>’åœXZaaBiÕ‹mè-ØP óÌÈ3€PâB3|ד|øƒˆ]Å3Xq 2 hµžÓAEštX•Îè$e<3«ì¿õôn“\ìCˆÏ™1Ÿ…þÉ ŒÝOO ðºØpdOa+“°xí3ÙÀư˜ôêažb×W€T‚»PNÈÀ22,fÐÈ0•C@ ~V€B ۰ä( Gar€T&PÛŸãíùç×ÿ¾üù”sí)[ÍͶ]Þ8>p±‘“~Ö£©ÏL"i“°8|äg:° ãTŸˆV‚®Ò{â×ÄmˆóÞm‚ÈR“‰2ÆÉÒ'sŠuEŒçRX†u…Œáa`?j a[Ñg…|õ8°˜×£U†MŸüâÊDÿ›+Xr€G˜ðýTK;:]g›:äee_a–ë‰ê~ŨÁŽpŒóÒÂVhçL Ž:Õq¥¨cãåÎr¥žmLUõz'ŠÊý{š3Ü)Jÿ½A\ TpMù%À`*4À T2ˆƒ°°ì,; B“™ÀooŸã¿—Ûÿá/ÚÕ2yQ΀h›–²ºŠ0ÖD24í|ûÍ1é¦/4Éøö°Th|N:r¾9I?g~™¥¡zºP1Tâ¸MÞ¼iGÄu$¡PSåÄR¤]œ ¨VÂeJ®B¡Ìêà¼ÁØåbŒ9C”‰„bJ`K=ðtÿ«ú%MgožpªD62fT{l‡5õÊ=šž9õêuXK=M)"&.­ŽTgÙÓÎr6Þjð«8*îɘM#¡” ìMüÃ,b2ƫȜwá+ÁÄøQçª pDÿl¸ú¡¦ #@ „V€J Âð°œ6 ……! ÉŒà'ïŸÇíó>þ7×2ï13Œ¡ƒÊÇ`0¸¶Í\Ò™d±ABvŠC'Ðe¼o9l“MÇ‚fsV‚±cÞ¨’³¶”•¤gšNª©v)F±W9T|‚’Lô~¥tt&© Þa~ývOÆ,¢ÊùûãÀÅ )h”ñ­¹¾þa@Q¼û*"h!f¡vº—”‹åvr,€MH.AƒóÎ΀ÙhÚ÷ì&-Ÿ­o|ÌÝìÿ±MÜ×m¼‹åí ¼ç(ÎlË ÚÀ¾†DÏév ù‰ÂóA†Ë«8ßS°­`؉ú0zH(4À }V;ƒ° ˜6 …Åa@Ø\  ”ö~Ÿ×ó]¿ý_ ¥ò–d&èÍåo©‡?sÁ` wM£!Eu<…nçAå<ȰgjÕÍÙãeýÝuÀ«„Ýan¢Cª{P¼µ-sôxBä‰Òx¬˜9i`ˆòió•¢\©ª, ý€¤Î]K…0q)O¼¬ˆif”¢«F†µ—0²Å,L¢xsŽ–=;[¢E»ªMÛã”`À8 F¢˜)†agWÙBá)wŽÍe%6…:™ÈVQ2WU€WWhþ –Te0S ÊÒ7þ%\ ò ¸œÜ,à }V€;Âð°ì( ŠB œF€ë×ßúÖÿý×¶Ù{IL±TÊÛlØ10ðïQãéô MÖJ!Œã“ȺÔòqc###)ˆÈÈûšÛ-sx•gg‰·'4ݵÓvÜ=ÕßuîPw^äíq­¢5’9À{Ì U  –=v±)]ܼ¸4ÎEq°@{˜‹1ºG—w9àÃù/›×«¬û(¨iåMÚq¶õNëúb•zÆžtž›ü½ÕÎxeÄÄ]MS¿#^+ÛwŒû-Â3rnG`#ÎQº?×]Ïul2ÿ`0Ë^d Ú̺îs?ƒ]Ls„OÓ.= `¨Ð V€:Äð°ä( BA° \†péý=ýoßÿÅ>µºšî¬c9•O2Ï})?‰A¾ÉLÏ6®4Īü±lmÁdnÝÔwEˆ™M þÒP‹ŽÜŽ|÷çݶë.² ï¶Ì¶ì¾ëî÷Ò„z¦Ð1ävµ…!Üe|-ÉZ‘Ìpdvô¡HÁ¬3¬ïò?žeáqźTßDCD>õá%r¶ÄÄÕ @w #Œ+1)Ý´L”v?ï2M#W\­ôåòy#1ï¥ãa£¶ 4ö´tÆEø³VÏ ²1ú$\H™*º8ÿA»˜°{¤â~Œ'î‘ p!,HÁÊ×E²Pì0; € d,'B%ý¿oö¿ùë„,1š8C9>®Í»ufˉ Ë&"r0ÁÍûIìÿ“ø·ÄØŸæŽÀ~ìH,i[¦x¦àñr×ñÈα´u‰ÌdœÜ®¿ÕçñéÙ9‚9.r¨)ËëÐíüÇ#ìvxZÊa  ˆ³7WM9îla ñŽxË2gF†Æ4ܺKNiñUÀ”Õº"Î1†ÁѶ̣©æL¸³¥4šj9âžìRñ”¯q„ƒ­¡W;¿q4m ’ðúŸâ…'?eûˆ9”âziUXG'F/ ã•3…E òT;K/ë`³c4óžïòöaèL®âbs±{/“Õýe.tF •PÈ€„°B\à!NnÛø·¡3iºL‰fºP‰ÿý_ÏãùÆâþ¿×þü~µY3ž?ÿ?ïÿ=~õ†ûzð0õàQÿë@¢#ýh?­õ Pðþ¼ "?ýx<D~¾|a'þXoãÉ«ÕOc™ a‡V£ÇÊûïä­eií¦Ž\§e°†Ÿµ•̲‹)ÿ 7ïÐà»ýDšò}!üÿf¤½µøß%ùhÿBòs2QKÚz$¼¤ÐsõŒ_¦ýk‚ò¶²y&V,yòš"Î$‰ÉþÃÒS$ó?æùu©ç–fVK1M‘¤°=WÛZ-†tMf±¯m<*à€Õ“Ý=2K }2=A%N_*![o7¬«I;€¹ýÂOùn+r:/Ÿ$(ç}%îÏ„ä?”?õÉß4I~’¿Í?æžÝ^q­¤Õ8”b‹ãºJYÂù^˜¾ð˜t—8¡´¤ #ì¿5&šP"ô6B&=Gà¾ã(·$è5ûÝ{ÐüVë™f:·Õm»—žý­×bÌä_óUT5O>fϵ-8Ò3i2]Œi-K”BT®m˜Ô2•¥ÀËÉ"‘03:¼ ¤S)B))My†çÎlüºb?Çä2vçÔPFGCMÚhÁß0Y ‡ýŸ»lÙ×úûOŽ•ÍW/^äô¶ Aõ÷àÀõâ%¾i'õ#Èä"ÂÎð0bL ©éÏæé¯¨ôíbŽSŽ‘¦jQ•@ÞD¯3 EpŸøÀÿ¦É ÿ¯Œ—öŠþ«D?œÇò!å.äKè7úÏîµô™ºî'8àC%P×k‰S5M$A ÄîœêUB»×iΰ8t_äˆÁn œžžªîÂ0u n—ž½·×kbüÄHAíwút¶ý’µî‹ÑÖ϶§=•‘aWÊ'k*±Êf…ý‹PÕaI¤c7*nZ73âLö;jA³³¡#˜s½éÀ!lHÁÚÙ´@ì, ƒ!`ØP, Ïšþ=z’çÔ×´ø·lf›IЬÅmr¦aòññOF#äÿZóo ˆúçÝDxŽüŽû€K˜òT°ä‘$•*ä(•*ÄH–6Áß4Œù„c4ŠEE"0٠Fþ6vö¬«¥_Ù|ßW£©Ì§q_ÒÝÇÛ»rl|SžŸuæÙ¯\>ÿ¹nDž¬½­‰â‹Å;Ð<ûš2>x}ml•ò^F‰ßFÁ à V’ÍC°°l,+ BÁs@Hïçåú]u×áñí/Ê^L*¦ä£Ýlì„d€R!Y ?:ÄÎÒíÚPºVR•ò¬¯‰'Áü}fj¹±E”óÏ<éS%Q…†‰åëÄô®“¿tž•¾ì]çµtž•¾ïÖˆ¤àZ ü·¶ûw¶ÛÍ'ßzñNô_Nñ:ñø¥}'á½·Ó¾Óµî’Ê8vQÑY÷Ê75OWª±›(ÜÙÇ‹±6lšËa¯NÏWh¬µ)Ù*ì”móWªëf´YL”‹)¦¼3¥3 Ô²ÂS%RJÁ„Øc&86áO/ÉX’éJÌ©%<ðö‰Ø›$z]žbggÅØ‘æ×I^ìþDh›ÏW&d+ÅLQ•ûo"QÛ#xøÛ«ºè|”MåšNÓ©]^ÞçFPòçljú¨•áÎл͊e"n»ÒäÊÛ´Aœ€€ Và,6ô°Th€ „V3ƒ°°H2$ –Âå¨L€7ï?oéºü¿ý8kãÑÅn@Uóu™•Xˆé/®ÿy¦2auœ£'ÁýÇ@h%ДÄÎΕ3³µxÈÎÑͦ<}Wi%LoøW«nJD÷\†^… `¦«0;9×ï‘2è8sšÌºì±«Êû¸šø/íø†ZC³UåôTnýSÛå–.ßiy^î9^XÅY£Ê2íq‹«ÔÙ¦“ƒûæQ•Î:±$1ÄF³P©|À¢‹(e‡`a¢)b±32ÈÍ|Ž'Q°”ÿÊ–Fé±iA{ 5þûÝ  `fA\€.=Q‘  }V€;Âð°ì( B“ÀO‡ö÷ôþßþ¶øã)®bd(·¸Í+ýí*Ôñ[ÈT…óy׉“Ò|þ• È$dddv™-[é®Ê6¹&¡m6éÊ›i·nû úÛÑ}§kQòkh(Ûi¬œ¸Ua#¤+-ÍÌ’Ûî L6ÿ,æçwb¹hÌ6'31¢26†éwží(?î4¡Á~f•Å54 8²´uÙ]ê EqÉDÓ÷ªÍ=Wþ=£¾TEöúÐʙߊùMÙ»¨éª-|¨fš‰PÎ(ÍÞE”‘lëæÿþ:Ÿvá…˜&)™ÝƒL¥ôG·ÝsÄ@?,Îù"9VVY_/ƒ……‹+XXXÍÓˆ;à‡ëFŽKÁÎìl†òb› †|BÐm‰"-ЯåúRe4Ð>™&€À=D( 1š,E Gþ`„–Þä£È}áý‡@:åîÈÌ…!´À‘×Ae#1¿å;PÁÐ’ Vù\¨,á*)éí‰7v¹ã•á|]LðžÃùÜóÂb¸“™­“·í¨¹Ûà ðÄ¢ ƒ$œx˜ Ò!o;œ.³âèÔàÃÓîâb°œ 5òŠUñ~‰¬Mr šVš^±f$®@˜˜ˆà\h€ €V3Ű  6 †FA°¨œfpë¿·íùvÿò¨Üeíi[™›°H¾)¶´ (×pÝäÒ¶~[ a :»é‡Eµ…já$ÈËi˜œFØm‚èSˆÚÐdÄwÇ`焇Ä>'!Lì@{pœ `G0 ,d©üÓè0úÔ¶W•â3)ç«V?ß—¾ú>w¢”E)™NØ”òØÚ}@ÿ (¶Mäx× –¹ÒÂze§f}UD³«ŽCÕŸïÂÈÀÛ Ð9‘Jƒd6E\º¤ ùÂι.–%ʾ †‹™ÖЍàæG~]ŸfxNý·ý%"qt’iÅÙ™µâ/(lñ2‰Pp£–S {+XR± Ò—â Øœ'¤ÿ+8®±âÌ^«¾³©ÃŸŠŠðßýlðÎ<Ë¿‰LNW–5yeÇU©5uЙû¾ŽxK<`ŒQ'`«ÏÕ‡Èô$XL@L…}R Å@s@ |V2Äð¨P, †Â””&P§ñùùôÏÿHöú𓘾nݳxlì-,ÙZ‰w*³„³¥°x ×åþCC4°ši¦=4ÇïË×/]˜çYÄ£¹ÔûlQ$þ–ª‰gr©ª›M:§’qÎï¬:|¨v€ÜL{º¦ OM0rÀY~ O”QKy²‰,Ð0A%Ä}8 ,¦_±GŠa€#h°o]4ÕÌ0hHcÉ•õDÄé~ÿ2ÌÖB.ðÂs/ gìÿšÉßoÒaXB4Ákl"¼8v2Í8þYº¨hç¨ÆÉ3R|)/‘UHT2+Žo€P(4À |V3Âð¨ì( ’Âä3€Þ_ÓöÍü×ÿ¦µÕ±+%î÷më*VéÌÀZiÌ]“ëßÅLÒ0£k‰KCùÚƒÜËÆ,ÙÙÙúÝŸõÉ¢Aê‚2¬Øuþf‘0nÜF¡èÕ3±)Îä  U¦ëug£ø~æc;ŽÔ±s’ó¿ß9eµrÆ»ŠÇ04µÂ¨(v³áè PQҸ楀ãB–Ñ­£h»ÂIVxQO l»Ã‰Ä©§CþÓJUoˆäÑyAà 4ØZØà€ºY蠺Πv$“ËÚƒ/ñó-RªeˆWÏå`K rcÜ2÷ ¨*h€ |V€9Äð ¤vQœOŸÛÓóÿç/êa®ËÍs"lÌÜÁè54»¢6‰sDFBf”³ä3î ïñSÏ<Ì^yò‰EI s¦(wŠ‚‹[E×Ã="×+›ÑR»:ŒžrvmTGhÇÕ1?8õ‰+é]·ˆÓÊêúˆ][•­füÿåY2½N|ØÏRàÎôÌÀ7KÐEmŒX¥¯|ˆå yˆ­JÌ_w„£-}‚¹_êõå‚´0…¯jî¯vŒÞ ôïÍq«~Ç®¥\sæÖ`¨ÀVÍ4˜èíR#ì™@JVÂå"«ê”³°3Ò.;¦€ Th€ V€9Äð°ì, B°¹@* ø¿ãýqýýc㊩®B…^éU¶ðC–·,œ9EªôÃLþn9¶ _­‰çž{ç$zFÉž\2}r ÝçËŸ“=÷Ç;¬qg)2²Û-h¶¸JÛÕNpž7T² —õI-Ëm5‰_Ô1|,yâ˜;kи҅W„*¨…˜XÆ2, lBæVuEÔßêÿ(VkítÒ)©ÄŒàYÖ@'¯ñ<Ž Ÿ¶5†UÛþ}ÆÊiŽ”C¨4È­SwXûiä(¤óMÆSÁCªÈ‹¸+²jéHÏÙ@3‚j’“#wwbº1JHl+p°*h€ ~V€9 aØXv ……!@ÈXN38 õ_ßÇç??þëó<±}ÓYtÙ¶Í€Ìó'?÷en$ hÌÈÕÆ •.J°ä´é{4A8,ØMà.ùÛ ÈçÈ»°ìî' ›a«bZ £MP¹~ »:õ`SdŽyB°°©Ò V€TŒ–; aH»Œ¡Ðfok€m#Öq‘~6Xâ+,ʃU ÊФ×tv!‰L`È÷P8ûÁ½¯¶£<9îxøZ£”`:mÕÆq»ºþF]‡r¬ð¼ùö9¨À"Ã3 dž¥ ÇŠT{:NP0¸U¯ñ’:&‚òqÎ3ЀºnD@ƒ@ €V‘‰aØXv ……!`ÉLà7×þ>oÞ~ï2')®ÒùÖ¼0”Ÿ¡Ö3£×bÛ {XX—¿„,UZܰvÔV\¹z8X³ûtƒ•”ìã¾× ì–®‹«Üã‚ ç AÁ&Rª”8p`ꃿP, ¬ r—œ…ÆUxtÿß¶Ô•ÆÈÐ J)Œ<'÷˜…<ó~Sý‰.1ªg8À¬ú› 8“4©ùò¬©Y§)[r O¨µBpÇ¡2õ@ÇŠj€¦€8 ‚V‘ ‹aØXv%…(€ŸÏ/ÏÚxÃ_=IƒeÓ-Q¸Î[£°)yÉèN»©gšÈÛî xY3®ùø|#÷!ä9p©‘ eùöø­Bõë¨V±¾a[Œ¤­ÆVëïë5ÚHf$[˜Ù‘¡²/’ÜÄÞiÇ1´ ‘%&P(Y(úE·•³…€÷ª,¼(Ï CwõD 1c,œ¥jAabb0Í’ðχ 3Á©ù÷£éàŒú*À—/@ΙbEÞYÞ1· 8œ£†–X‡ø…f=€G“KZF=+ù½=Ñ3ç0ÝšpßÖZpe¾rÂÛ§´pv…dšiÓ[:×  †ü¦àÒøyfr2¥° YÈ92 &0\ p |V‘,Âð ¤vLP™iÕ_]à×â{}JŽïŸnÈ›Y´s\°«8_Ü^²9y/šºi­ëXDü©Ì¨¡’¯ «D5jÕ©çÞ¡Îèwú=ÝϬ¯¬¯ïnx«ø¸ß¬©Slš6ê¢]D´I–š$œRȾ$éVhÄTW8·`ÇñËû™å7T̤ Œú8‰g©Õã8N™ÿƒ¾3ŒïK ¦³<&3sDÁ̸¥ñ¶ÀÃƬž²‚bÒ“+›¡38t_ßó0¸Ã #Õ1ldWèÿËmW‹‹NÈI„\®D„r¡FnÀ‹g´Ÿ´PnÌÜíÈ£Ñ?ˆ ˆÂ É(’·9XµÚÛl\ìùÑq¢Î­Ù^6;¢¸Y‘ª¬3WxÌ) [ Íx¼ÂÐŽ9y¢Uê(àÉ„O_0N31WY˜›ÿB*F,@)·CäÓJ-Q€B»6Bq]‡@¢ÇËs0[E–**¸¦Ä×>§$^a¥ŒÜ/|qLõ?ûª˜¼yº6âÏn¤S.‡ûÆÌ×àLãmn ¨¼ªLp»ZzneILO¸ëÌ¥©5KL@¬fEx{ ÊÐ ¦Ðg2-€ Œ%@p1p |V aaØXR; &¨L '–|üïÕ´ŸqšÁSaŽYÈZ´1|. 9ØÛ÷éQ¿NÝó‰?]~àˆ|šG>·@ ÀÀÀÀÀÕ4ªj¨Ò£uÑ•E¦Z R’’q‰¨jUÓ&}Ø»=’RLì ìGŒã+0MEÖN¹¡ þ¥G2gW`h`3îè««õe&ý7ÿC8ç¥K¥çDå{G0PCË4` [ˆÏ_4"3„H®‚ _K· _yö<Õ5.U‘ÌŸ˜F•z7Üq‚ú¾ø+S@¥0ÆK¡KêñÒÑ@÷lÔIœœ†ÿVI\í0^ÙO&îÐ?’T@h€ ~V ‹aaØX" …aaH¬( B$µ§ç×>ïòûôÉ(ºï‰EY¾@JÅŽ·/SO¢­•™y9“íÊ>w'Ì?tD9Ì‚0PÀlóÏ:Y“f_Ñ=Á_ß@Û¨Ó%™5 xI©¤oâs4zI•¼òón¾ë  î;oß-w’À¤ÇØí}€Ó ªïMׯ¿%ð ù=Ä©_Õ` ·ùEVA†Y£x4@U[$øa•¸É`Qˆc™Pj‚”8¦€(оSRG=0° 3_ëPT åÓ…GGþk+¦kg€Ê†uŸ†[÷1ËBK>(`Ï[“Ø .|)&4étä^§2¯›Å Çzn˜çYÁdS‰ñ” Ó!t3 Ôz`O(.h€!,HÁâéC°Àì,   X.0 „Jqñ_ÛßÓ®¾³ÏtªQ¼¼S¶Ü‹”ôˆ{?Ød=Oç¢}"G­p2…ßÖù?âüó‰ÿIŸí–Oü ãS'ñ“åQ?ž?O‰ùÍ$ý#í¢}óçQ~ÿ_YŒ]ØÊºìšZMðIêõ$ôºy¬‘‚Á­Ï93à?ÉùϘþ§°7pògI3œ›M&‚}¯[Ï1ÿè>ùód‹ŸôŸöï–J«0Ù L!P† ¿ÞÌ¡U¶E:Û)ËB=(¢:B9©Œ_äb(óÉèh͵٨O˜hå¥>9 Ì€F{÷žó™„NXNš‰Ú(ŽõG6ß0”›Çüùës1½ûíë@ ýhD;­ˆõàañëÀ¢ÿÖ½¼ƒúШøO¼qÒ?´ÏÙù/|>!ô ü D<%ûzü¹‘í_Iü'ÿ9/P#û—ú¾Gé/¬‰~ëÿ–Q"¤ˆVO\)*’~ÃbpZ¤bÉöé_ƒÚ¦¡ø)DÌžô´(–'RF–XàTV4ÍI)XR\Dr'Ôúq /"Ÿƒ †Ö`8òYiLŽÈ¤²i#‡Öµ“%·†G/އ¾åü\„äãÇ êL²I&nuŒF¸ LM$D« ŒÃÓžR<¹‚‚/+zó—*ÔEý/wìʾºúo/O£û÷ŒïêÉŸEÃHM‚MgÈYÕ•‰lágôÀUÄv[çYç÷á¯Ú3JNÐsœç;7v× ¢¹Fø˜j+]˜×?¿ÓÏáôöj`­sC‡eÁ(55Ⱥ¯Òv¯³­¬¤dƒÀà!`@hsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/aiff/12000-6-16.aiff0000644000000000000000000106246613111512442023501 0ustar 00000000000000FORMe.AIFFCOMM]À@ »€SSNDe Í3™ 'ŽD Í3™ K<ˆ Í3™ g Í Í3™ y» Í3™ ÿU Í3™ y»™ Í3™ gÞ Í3™ K<"" Í3™ 'Ž&f Í3™ *ª Í3™ Ør.ï Í3™ ´Ä33 Í3™ ˜s7w Í3™ †E;» Í3™ €@ Í3™ †EDD Í3™ ˜sHˆ Í3™ ´ÄLÌ Í3™ ØrQ Í3™ UU Í3™ 'ŽY™ Í3™ K<]Ý Í3™ gb! Í3™ y»ff Í3™ ÿjª Í3™ y»nî Í3™ gs2 Í3™ K Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ ' Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ ' Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ ' Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ ' Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ ' Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ ' Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ ' Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ ' Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Žû¼ Í3™ K;÷x Í3™ gó3 Í3™ y¼îï Í3™ ÿê« Í3™ y»æg Í3™ gŽâ" Í3™ K<ÝÞ Í3™ 'ŒÙš Í3™ ÕV Í3™ ØqÑ Í3™ ´ÅÌÍ Í3™ ˜sȉ Í3™ †DÄE Í3™ €À Í3™ †E»¼ Í3™ ˜r·x Í3™ ´Ä³4 Í3™ Øq®ð Í3™ ª« Í3™ '¦g Í3™ K;¢# Í3™ gß Í3™ y»™š Í3™ ÿ•V Í3™ y»‘ Í3™ gŽŒÎ Í3™ K;ˆ‰ Í3™ '„E Í3™ € Í3™ Øq„E Í3™ ´Åˆ‰ Í3™ ˜rŒÎ Í3™ †E‘ Í3™ €•V Í3™ †E™š Í3™ ˜sß Í3™ ´Å¢# Í3™ Øq¦g Í3™ ª« Í3™ '®ð Í3™ K<³4 Í3™ gŽ·x Í3™ y»»¼ Í3™ ÿÀ Í3™ y¼ÄE Í3™ gȉ Í3™ K;ÌÍ Í3™ 'Ñ Í3™ ÿÿÕV Í3™ ØtÙš Í3™ ´ÄÝÞ Í3™ ˜râ" Í3™ †Eæg Í3™ €ê« Í3™ †Dîï Í3™ ˜só3 Í3™ ´Å÷x Í3™ Ørû¼ Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øs Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™ Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ä Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øs Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ 'Ž Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™  Í3™ Ør Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™ ÿÿ Í3™ ' Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y» Í3™ gŽ Í3™ K< Í3™ ' Í3™ Í3™ Øq Í3™ ´Å Í3™ ˜s Í3™ †E Í3™ € Í3™ †E Í3™ ˜r Í3™ ´Å Í3™ Øq Í3™ Í3™ ' Í3™ K; Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K; Í3™ ' Í3™ Í3™ Øq Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øq Í3™  Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Ž Í3™ ÿÿ Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Ør Í3™  Í3™ 'Œ Í3™ K< Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Ã Í3™ Øs Í3™  Í3™ ' Í3™ K= Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K= Í3™ ' Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ã Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K= Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜r Í3™ †F Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øp Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øp Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †E Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y½ Í3™ gŽ Í3™ K= Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜r Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †C Í3™ ˜r Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K= Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K= Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜r Í3™ †F Í3™ € Í3™ †E Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øp Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øp Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †E Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿþ Í3™ ' Í3™ K= Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y» Í3™ ÿ Í3™ y½ Í3™ gŽ Í3™ K= Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'ŽD Í3™ K=ˆ Í3™ g Í Í3™ yº Í3™ ÿU Í3™ y»™ Í3™ gŒÞ Í3™ K9"" Í3™ '&f Í3™ *ª Í3™ Ør.ï Í3™ ´Ã33 Í3™ ˜q7w Í3™ †F;» Í3™ €@ Í3™ †EDD Í3™ ˜tHˆ Í3™ ´ÇLÌ Í3™ ØpQ Í3™ ÿÿUU Í3™ 'ŽY™ Í3™ K>]Ý Í3™ gb! Í3™ yºff Í3™ ÿjª Í3™ y»nî Í3™ gŒs2 Í3™ K9ww Í3™ '{» Í3™ ÿ Í3™ Ør{» Í3™ ´Âww Í3™ ˜us2 Í3™ †Enî Í3™ €jª Í3™ †Eff Í3™ ˜tb! Í3™ ´Á]Ý Í3™ ØpY™ Í3™ ÿÿUU Í3™ 'Q Í3™ K>LÌ Í3™ g‹Hˆ Í3™ y»DD Í3™ ÿ@ Í3™ y»;» Í3™ g‹7w Í3™ K?33 Í3™ '.ï Í3™ *ª Í3™ Øq&f Í3™ ´Â"" Í3™ ˜uÞ Í3™ †E™ Í3™ €U Í3™ †E Í3™ ˜u Í Í3™ ´Áˆ Í3™ ØqD Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øo Í3™ ÿþ Í3™ 'Ž Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™  Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ã Í3™ Øs Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K; Í3™ '‹ Í3™  Í3™ Øu Í3™ ´Å Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ ' Í3™ K= Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ '‘ Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Á Í3™ ˜t Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Ør Í3™  Í3™ '‘ Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øv Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™  Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øv Í3™ ÿý Í3™ 'Œ Í3™ K< Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K: Í3™ 'Š Í3™  Í3™ Øs Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K: Í3™ '‘ Í3™  Í3™ Øs Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Æ Í3™ Øo Í3™ ÿþ Í3™ ' Í3™ K= Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Ã Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Ç Í3™ Øp Í3™ ÿÿ Í3™ 'Ž Í3™ K> Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ gŒ Í3™ K9 Í3™ ' Í3™  Í3™ Ør Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜t Í3™ ´Á Í3™ Øp Í3™ ÿÿ Í3™ ' Í3™ K> Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K? Í3™ ' Í3™ Í3™ Øq Í3™ ´Â Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Á Í3™ Øq Í3™ Í3™ ' Í3™ K? Í3™ g‹ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ ' Í3™ Í3™ Øq Í3™ ´Á Í3™ ˜u Í3™ †E Í3™ € Í3™ †E Í3™ ˜u Í3™ ´Â Í3™ Øq Í3™  Í3™ ' Í3™ K? Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ y» Í3™ g‹ Í3™ K> Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Â Í3™ Ør Í3™  Í3™ ' Í3™ K9 Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ 'Ž Í3™ ÿÿ Í3™ Øp Í3™ ´Ç Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ gŒ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K= Í3™ ' Í3™ ÿþ Í3™ Øo Í3™ ´Æ Í3™ ˜t Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ã Í3™ Øs Í3™  Í3™ '‘ Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ ' Í3™ ÿý Í3™ Øv Í3™ ´Æ Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ 'Š Í3™ K: Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ 'Œ Í3™ ÿý Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Ä Í3™ Øt Í3™  Í3™ '‹ Í3™ K; Í3™ g Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ gŽ Í3™ K< Í3™ '‹ Í3™ ÿü Í3™ Øu Í3™ ´Å Í3™ ˜s Í3™ †D Í3™ € Í3™ †D Í3™ ˜r Í3™ ´Å Í3™ Øu Í3™ ÿü Í3™ '‹ Í3™ K; Í3™ gŽ Í3™ y¼ Í3™ ÿ Í3™ y¼ Í3™ g Í3™ K; Í3™ '‹ Í3™  Í3™ Øt Í3™ ´Ä Í3™ ˜r Í3™ †D Í3™ € Í3™ †D Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øw Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿú Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿþ Í3™ '” Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´È Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ K@ Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿú Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿú Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿþ Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿú Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ë Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿþ Í3™ '” Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ K@ Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿú Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿú Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '”û¼ Í3™ K=÷x Í3™ gŠó3 Í3™ y½îï Í3™ ÿê« Í3™ y¹æg Í3™ gâ" Í3™ K@ÝÞ Í3™ 'ŠÙš Í3™ ÕV Í3™ ØkÑ Í3™ ´ÃÌÍ Í3™ ˜vȉ Í3™ †CÄE Í3™ €À Í3™ †G»¼ Í3™ ˜t·x Í3™ ´À³4 Í3™ Øw®ð Í3™ ÿþª« Í3™ '•¦g Í3™ K=¢# Í3™ gŠß Í3™ y½™š Í3™ ÿ•V Í3™ y¹‘ Í3™ gŒŒÎ Í3™ K@ˆ‰ Í3™ '‰„E Í3™ € Í3™ Øk„E Í3™ ´Ãˆ‰ Í3™ ˜vŒÎ Í3™ †C‘ Í3™ €•V Í3™ †B™š Í3™ ˜tß Í3™ ´À¢# Í3™ Øw¦g Í3™ ÿÿª« Í3™ '†®ð Í3™ K=³4 Í3™ gŠ·x Í3™ y½»¼ Í3™ ÿÀ Í3™ y¾ÄE Í3™ gŒÈ‰ Í3™ K?ÌÍ Í3™ '‰Ñ Í3™ ÕV Í3™ ØzÙš Í3™ ´ÂÝÞ Í3™ ˜uâ" Í3™ †Cæg Í3™ €ê« Í3™ †Bîï Í3™ ˜tó3 Í3™ ´Á÷x Í3™ Øxû¼ Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿþ Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ë Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿþ Í3™ '” Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿú Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿú Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K= Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿþ Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ë Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿþ Í3™ '” Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øv Í3™ ´À Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿú Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿú Í3™ '‘ Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ gˆ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ ÿý Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´À Í3™ Øv Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ 'ˆ Í3™ Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øl Í3™  Í3™ 'Š Í3™ K@ Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ gŠ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øm Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜s Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øt Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜x Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Æ Í3™ Øn Í3™  Í3™ ' Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øo Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿø Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øo Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K6 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øs Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜n Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K< Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KA Í3™ 'Š Í3™  Í3™ Øl Í3™ ´Ä Í3™ ˜v Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øv Í3™ ÿý Í3™ '” Í3™ K= Í3™ gŠ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ K@ Í3™ 'Š Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †G Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿþ Í3™ '• Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¹ Í3™ gŒ Í3™ K@ Í3™ '‰ Í3™  Í3™ Øk Í3™ ´Ã Í3™ ˜v Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´À Í3™ Øw Í3™ ÿÿ Í3™ '† Í3™ K= Í3™ gŠ Í3™ y½ Í3™ ÿ Í3™ y¾ Í3™ gŒ Í3™ K? Í3™ '‰ Í3™  Í3™ Øz Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †B Í3™ ˜t Í3™ ´Á Í3™ Øx Í3™ ÿÿ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ gŒ Í3™ K? Í3™ 'ˆ Í3™  Í3™ Øy Í3™ ´Â Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Á Í3™ Øx Í3™ Í3™ '‡ Í3™ K> Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K? Í3™ '‡ Í3™ Í3™ Øx Í3™ ´Á Í3™ ˜u Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™ Í3™ 'ˆ Í3™ K? Í3™ g‹ Í3™ y½ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '‡ Í3™ ÿÿ Í3™ Øx Í3™ ´Á Í3™ ˜t Í3™ †C Í3™ € Í3™ †C Í3™ ˜u Í3™ ´Â Í3™ Øy Í3™  Í3™ 'ˆ Í3™ K? Í3™ gŒ Í3™ y¾ Í3™ ÿ Í3™ y½ Í3™ g‹ Í3™ K> Í3™ '† Í3™ ÿÿ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †B Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øz Í3™  Í3™ '‰ Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '• Í3™ ÿþ Í3™ Øw Í3™ ´À Í3™ ˜t Í3™ †G Í3™ € Í3™ †C Í3™ ˜v Í3™ ´Ã Í3™ Øk Í3™  Í3™ 'Š Í3™ K@ Í3™ gŒ Í3™ y¹ Í3™ ÿ Í3™ y½ Í3™ gŠ Í3™ K= Í3™ '” Í3™ ÿþ Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜v Í3™ ´Ä Í3™ Øl Í3™  Í3™ 'Š Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '” Í3™ ÿý Í3™ Øv Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Ä Í3™ Øl Í3™  Í3™ '‹ Í3™ KA Í3™ g Í3™ y¹ Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K< Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¿ Í3™ ˜s Í3™ †G Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øm Í3™  Í3™ '‹ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g‰ Í3™ K; Í3™ '“ Í3™ ÿü Í3™ Øu Í3™ ´¾ Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜w Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ KB Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ gˆ Í3™ K; Í3™ '’ Í3™ ÿû Í3™ Øt Í3™ ´Ë Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜n Í3™ ´Å Í3™ Øn Í3™  Í3™ 'Œ Í3™ K6 Í3™ gŽ Í3™ yº Í3™ ÿ Í3™ y¼ Í3™ g’ Í3™ K: Í3™ '’ Í3™ ÿû Í3™ Øs Í3™ ´Ê Í3™ ˜r Í3™ †F Í3™ € Í3™ †D Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K6 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K: Í3™ '‘ Í3™ ÿú Í3™ Øs Í3™ ´Ê Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Æ Í3™ Øo Í3™  Í3™ ' Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g‘ Í3™ K9 Í3™ '‘ Í3™ ÿú Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †F Í3™ € Í3™ †E Í3™ ˜o Í3™ ´Ç Í3™ Øp Í3™  Í3™ 'Ž Í3™ K7 Í3™ g Í3™ yº Í3™ ÿ Í3™ y» Í3™ g Í3™ K9 Í3™ ' Í3™ ÿù Í3™ Ør Í3™ ´É Í3™ ˜q Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´Ç Í3™ Øp Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™ ÿø Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™  Í3™ ' Í3™ K8 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K8 Í3™ ' Í3™  Í3™ Øq Í3™ ´È Í3™ ˜p Í3™ †E Í3™ € Í3™ †E Í3™ ˜p Í3™ ´È Í3™ Øq Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g Í3™ y» Í3™ ÿ Í3™ y» Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜p Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Ør Í3™ ÿù Í3™ ' Í3™ K9 Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ 'Ž Í3™  Í3™ Øp Í3™ ´Ç Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´É Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y» Í3™ ÿ Í3™ yº Í3™ g Í3™ K7 Í3™ ' Í3™  Í3™ Øo Í3™ ´Æ Í3™ ˜o Í3™ †E Í3™ € Í3™ †F Í3™ ˜q Í3™ ´Ê Í3™ Øs Í3™ ÿú Í3™ '‘ Í3™ K: Í3™ g‘ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ ' Í3™  Í3™ Øn Í3™ ´Æ Í3™ ˜o Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´Ê Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K: Í3™ g’ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ K6 Í3™ 'Œ Í3™  Í3™ Øn Í3™ ´Å Í3™ ˜x Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øt Í3™ ÿû Í3™ '’ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ yº Í3™ gŽ Í3™ KB Í3™ 'Œ Í3™  Í3™ Øm Í3™ ´Å Í3™ ˜w Í3™ †D Í3™ € Í3™ †F Í3™ ˜r Í3™ ´¾ Í3™ Øu Í3™ ÿü Í3™ '“ Í3™ K; Í3™ g‰ Í3™ y¼ Í3™ ÿ Í3™ y¹ Í3™ g Í3™ KB Í3™ '‹ Í3™  Í3™ Øm Í3™ ´Ä Í3™ ˜w Í3™ †D Í3™ € Í3™ †G Í3™ ˜s Í3™ ´¿ Í3™ Øu Í3™ sonic-visualiser-3.0.3/svcore/data/fileio/test/audio/aiff/48000-1-24.aiff0000644000000000000000000106246613111512442023504 0ustar 00000000000000FORMe.AIFFCOMMw@»€SSNDe ó áŠ'Þ0ûÅ:\Bá;K<‹S!Z‚yaTûgÞm#Pr €vA®y¼8|v~l’šüÿÿšü~l’|vy¼7vA¯r m#PgÞaTûZ‚yS!K<‹Bá::]0ûÅ'ÞአòÿÿÿõõëùöâwØr"Ï;Å㤽Å´Ãt¬Þä¥}ˆž«˜r!’ܲó‰¾R†CɃ‰c“o€e€€e“oƒ‰c†Cɉ¾Ró’ܲ˜r!ž«¥}†¬Þã´Ãt½ÅÅã¤Ï;Ør"âwëùöõõ ô áˆ'Ý0ûÄ:[Bá:K<‹S!Z‚yaTûgÞm#Pr €vA¯y¼8|v~l‘šüÿÿšü~l‘|vœy¼6vA°r m#QgßaTýZ‚{S!K:X0û¹'éጠå õõëùîâhØr*Ï<Å㽸´Ã{¬Þã¥}ž«˜r&’ܰó|‰¾W†Cʃ‰b“m€e€€e“pƒ‰`†Clj¾Só†’Ü«˜r!ž« ¥}‘¬ÞÜ´Ãt½ËÅã²Ï3Ør"â~ëùåõõ üýáƒ'à0ûÎ:PBá6K<ŽS!%Z‚paTøgàm#Vr {vA­y¼9|v ~lšüÿÿšû~l“|vžy¼5vA©r ƒm#OgÙaUZ‚~S!K<„BáG:a0ûÃ'Ôá– ïÿÿôõõëùùârØrÏEÅã§½À´Ãj¬Þë¥}ˆž«˜r’ܵó‰¾O†Că‰e“n€e€€e“oƒ‰e†Cĉ¾Oó’ܶ˜rž«¥}ЬÞí´Ãk½ÂÅã¨ÏGØrâtëùúõõÿÿö ñá˜'Ö0ûÅ:cBá-K<…S!Z‚aTñgÚm#Pr „vA©y¼6|vž~l“šûÿÿšü~l|v y¼9vA­r zm#UgßaT÷Z‚oS!$K<ŒBá5:N0ûÍ'Þá úÿÿÿõõëúâ}Ør Ï2Å㰽ɴÃr¬ÞÛ¥}ž«˜r ’ܪ󅉾S†Cǃ‰_“p€e€€e“mƒ‰b†Cˉ¾Xó}’ܱ˜r'žªû¥}‚¬Þå´Ã|½¹ÅãŸÏ=Ør,âjëùðõõ çáŽ'ê0û»:ZBá@K<—S!Z‚xaTÿgæm#Kr vA±y¼3|vœ~l’šýÿÿšü~l‘|v›y¼:X0û¹'èጠä õõëùîâhØr*Ï;Åã½Ò´Ã{¬Þã¥}ž«˜r&’ܰó|‰¾W†Cʃ‰b“m€e€€e“pƒ‰`†Clj¾Só†’Ü«˜r!ž« ¥}‘¬ÞÝ´Ãt½ËÅã²Ï4Ør"âëùæõõ üýá„'à0ûÏ:PBá7K<ŽS!%Z‚paTøgàm#Vr {vA­y¼9|v¡~lšüÿÿšû~l“|vy¼5vA¨r ƒm#OgÙaUZ‚~S!K<ƒBáG:a0ûÃ'Ôá– ïÿÿôõõëùøârØrÏEÅ㦽À´Ãi¬Þë¥}ˆž«˜r’ܵ󀉾N†C̓‰d“n€e€€e“oƒ‰e†Cĉ¾Oó‚’ܶ˜rž«¥}ЬÞí´Ãk½ÂÅã©ÏGØrâtëùûõõÿÿ÷ ñá™'Ö0ûÅ:cBá.K<†S!Z‚aTñgÚm#Pr „vA©y¼@|vž~lŽšþÿÿšþ~l|v y¼/vA¬r ˆm#DgßaU Z‚nS!#K óõá\'Ž0ûä:eBá/KõôÁ v÷áÛ'ž0ûç:õBá1K<×S ðZ‚™aT¶gÝm#…r ivAÄy¼|vŸ~l£šùÿÿ›~l|vy¼AvA’r £m#BgŽ'aU Z‚>S!QKᆡ ÿÿÄõõhëùèâØrCÏûÅãí½²´Ã¬Þ÷¥}Ož«4˜r’Üï󇉾0†C܃‰Y“€€e€€e“vƒ‰K†Cɉ¾{ól’ÜИqìž« ¥}Ú¬Þɴí½Åã·Ï¯Ør âÃëù¬õõ,ÿÿ‡ âbáK'Ž0û^:VBáŽK<_S!BZ‚1aTügŽm#8r švA‹y¼;|v¸~lŒ›ÿÿšú~l~|v¤y¼ vAËr rm#gèaTÂZ‚§S þK<æBáB:0ûø'°áí ‰.õôÓëúQâlØqµÏ]Åãh½ ´Ãd¬Þ…¥}›žªÓ˜rN’ܡ󸉾X†C®ƒ‰r“h€e €€e “fƒ‰n†C¨‰¾Ró°’ܘ˜rDžªÈ¥}ެß;´ÃV½þÅãXÏMØr—â[ëú@õô xùáÝ'Ÿ0ûè:÷Bá3K<ØS ñZ‚šaT·gÞm#†r jvAÄy¼|vŸ~l£šùÿÿ›~l|vy¼@vA’r ¢m#AgŽ&aUZ‚=S!OKëù¾âÔØrÏÓÅãǽ´Ã»¬ÞÖ¥}1ž«˜qö’ÜÙót‰¾†Cσ‰O“y€e€€e“}ƒ‰U†C׉¾)ó€’Üæ˜rž«)¥}C¬Þê´ÃϽ£ÅãÞÏëØr2âíëù×õõWÿÿ² áu'Ž-0û†:|BàØK<‚S!cZ‚OaUgŸm#Nr ®vA›y¼H|v‡~l“›ÿÿš÷~lŸ|všy¼vAºr _m#xgÏaUMZ‚ˆS ÞK<ÃBá:Ä0ûÐ'‡áÄß ^õô©ëú'âBØrÏ5ÅãB½è´ÃB¬ß'¥}|žª·˜r5’܋󤉾H†Cðƒ‰h“b€e €€dû“lƒ‰x†C¶‰¾bóO’ܯ˜r]žªä¥}­¬Þ™´Ãy½#ÅãÏuØqÍâ…ëújõôíH £#á 'È0ü:BáWK<,S!Z‚¹aTÓg÷m#r ~vAÕy¼'|vª~l‚šüÿÿšÿ~lˆ|v²y¼3vAr m#*gŽ aTìZ‚S!/KK<[BáŠ:Q0ûY'ŽáF] Ýÿÿ‚õõ'ëù¨â¾ØrÏ«Åã³½z´Ã©¬ÞÅ¥}Öž« ˜qé’ÜÍój‰¾y†Cȃ‰J“v€dÿ€€e“ƒ‰Z†C݉¾2óŠ’Üò˜rž«7¥}S¬Þú´Ã½¶ÅãñÏÿØrGâ ëùíõõmÿÿÈ #¥á‹'ŽB0ûš:BàëK<”S!tZ‚_aU'g¬m#Zr ¸vA¤y¼O|vŒ~l–šòÿÿšõ~lœ|v”y¼[vA²r Tm#mgÂaU>Z‚yS ÍK<±Bá :°0û¼'rá®É Gÿÿíõô’ëúâ-ØrjÏ!Åä½Õ´Ã0¬ß¥}lž«O˜r(’Ü󚉾?†C郉c“^€e€€dý“pƒ‰}†C½‰¾kóY’ܺ˜rjžªò¥}¼¬Þ©´Ã‹½[Åã’ωØqââ›ëù„õõ^ ¹9á#'Ý0ü$:1BájK<>S!#Z‚ÈaTágŽm#"r ˆvAÝy¼.|v¯~l…šþÿÿšþ~l„|v­y¼,vAÛr …m#gŽaTÝZ‚ÄS!K<8Báe:+0ü'×á3 ²Wõôýëù}â”ØqÜσÅã½0´Ã†¬Þ¥¥}¸žªî˜rg’Ü·óV‰¾h†C»ƒ‰|“o€dü€€e“_ƒ‰d†C뉾Bó’܃˜r,ž«S¥}q¬ß´Ã5½ÛÅã4Ï'Ørpâ3ëúõô™ÿÿó NÐá´'x0ûÂ:¶BáK<·S ÒZ‚}aUBgÅm#pr WvA´y¼]|v–~lšöÿÿ›~l•|vŠy¼MvA¡r µm#Vg¨aU"Z‚ZS!oKž«%˜r’Üãó}‰¾'†CÕƒ‰T“|€e€€e“zƒ‰Q†Cщ¾"ów’Üܘqúž«¥}5¬ÞÛ´ÃÀ½“ÅãÍÏÙØr âÚëùÄõõDÿÿŸ úyáb'Ž0ût:kBá¢KÏöÅ㽈´ÃÙ¬Þó¥}Lžª‹˜r£’Üí󅉾.†C‹ƒ‰”“€e€€e“Oƒ‰L†Cˉ¾|óâ’ÜM˜qïž«¥}ݬߴÂὃÅã¼Ï´ØsâÏëù±õõ1Œ æjáP'Ž 0üO:>Bà·K:0û'Žžáé „ÿÿ)õõÎëúLâgØq°ÏlÅäH½ ´Ãa¬Þ¥|âž«v˜rK’ÜŸóA‰½õ†Cûƒ‰q“h€dø€€dø“fƒ‰o†Cù‰½òó>’Ü›˜rGž«q¥|ݬÞ|´ÃZ½ÅäAÏeØq©â`ëúEõõÆÿÿ! }ýáá'Ž—0û:ûBá7K<ÜS!·ZéaTºgàm#ˆr ávAdy¼|v¡~l¤› ÿÿ›~lŽ|v€y»ðvAòr  m#>gaT^Z‚ïS!LK0ûŠ:€Bá¶K=US ¤Z‚RaUgŽ8m"Ër õôãëùdâƒØr·ÏlÅãv½@´Ä@¬ßT¥}¦žªÞ˜qÁ’Ý/󿉾^†C³ƒ‰:““€e€€e “‹ƒ‰.†C¤‰¾Ló©’ݘq¤žª¾¥}ƒ¬ß.´Ä½ÅãJÏ>ØrˆâEëù3õô² gæàÔ'0ûÙ:ÍBâK;üS åZ‚aUSgŽkm"ør cvA¾y¼d|vØ~lyšøÿÿšð~l¹|vÀy¼EvA˜r 5m#ÏgŽ0aUZ‚HS ™K=IBáª:s0û}'1âeƒ ÿÿ¨õôNëúÊâãØr)ÏâÅâñ½u´ÃǬÞâ¥}<žª|˜r–’Üáó{‰¾%†C…ƒ‰“|€e€€e“Sƒ‰Q†CÒ‰¾…óí’ÜX˜qüž«¥}í¬ß ´Âó½–ÅãÏÏÈØq0âäëùÇõõG¢ þ€áf'Ž0üc:ŠBàÊK’Ü“ó7‰¾°†Cõƒ‰l“d€d÷€€dú“jƒ‰t†D‰½úóH’ܦ˜rTž«€¥|ì¬ÞŒ´Ãl½ÅäUÏyØq¾âvëú[õõÜÿÿ8 “á÷'ެ0û:BáJK<îS!ÈZøaTÉgîm#”r ëvAmy¼#|v¦~l¨›ÿÿ›~lŠ|vzy»évAér –m#3g€aUœZ‚ßS!;K†C˜ƒ‰“…€e€€e“Iƒ‰B†C¾‰¾móÐ’Ü7˜qמªõ¥}À¬ßp´ÂÀ½_Åã—ÏŽØrÚâ¦ëùˆõõc ½Aá('â0ü):Bà”K½à¬'i0û³:¨BáÜK;ÛS ÆZ‚raU8gŽRm"âr PvA®y¼X|vÎ~lršôÿÿšó~lp|vÊy¼RvA¨r Hm"ÙgŽHaU-Z‚eS ¸K;ÌBáÍ:˜0û£'Xà›¬ ,ÿÿÒõôwëøùâ ØrPÏÅ㽘´Ãé¬ß¥}Yžª—˜r¯’Ü÷󎉾5†C‘ƒ‰˜“‚€e€€e“Lƒ‰H†Cʼn¾uóÚ’ÜC˜qäž«¥}ϬߴÂÒ½rÅã«Ï¢Ørïâ¼ëùžõõy ÓWá='÷0ü=:-Bà§K:6BápK=S eZ‚aTægŽm#«r vA~y¼0|v°~l¯šëÿÿšý~lƒ|vpy¼yvAØr ‚m#gfaUZ‚¿S!K<3Bà…: 0ü'Ñá/ «Qõôöëùwâ•ØrÉÏ}ÅㇽP´Â²¬ßb¥}³žªê˜qÌ’Ü.óȉ¾f†C¹ƒ‰>“–€e€€e “ˆƒ‰*†Cž‰¾Dó ’Ý ˜q™žª±¥}v¬ß ´Ä ½Åã9Ï-Ørvâ2ëù!õôŸÿÿú TÓàÂ'~0ûÈ:¼BáïK;íS ×Z‚‚aUGgŽ`m"îr ZvA·y¼^|vÓ~lvšöÿÿšñ~ll|vÅy¼KvAŸr >m"ÍgŽ;aUZ‚VS §K=YBáº:„0ûŽ'Câw– ÿÿ¼õôaëúÝâöØr;ÏóÅ㽆´Ã׬Þñ¥}Jžª‰˜r¡’Üë󄉾-†CŠƒ‰““€e€€e“Pƒ‰M†C̉¾~óä’ÜN˜qñž«¥}߬ߒ´Âä½…Åã¾Ï·ØsâÒëù´õõ4 émáS'Ž 0üR:yBàºK†C¸‰¾eóÇ’Ü-˜qÌžªé¥}²¬ßa´Â°½OÅã†Ï|ØrÈâ”ëùuõôõP ª.á'Ï0ü:Bà„K<2S!Z‚¾aU~gem#r vAØy¼y|vp~lƒšýÿÿšë~l¯|v±y¼1vA~r m#¬gŽ aTæZ‚S fK=Báq:80û?'Œñâ$A Áÿÿfõö ëúˆâ¢ØqéϤÅä}½<´Ã‘¬Þ¯¥} ž«ž˜ro’ܾó]‰¾ †Dƒ‰“q€dý€€dó“]ƒ‰a†C找žó"’Ü{˜r#ž«J¥~¬ÞN´Ã)½ÏÅä ÏØqoâ%ëú õõŠå @Âá§'Ž^0ü¡:ÅBáK<«S!‰Zƒ(aT“g½m#ir ÅvAMy¼ |v“~l›› ÿÿ›~l—|vŽy¼vB r ¼m#^g±aT…ZƒS!zK<šBàò:²0üŽ'ŽJá’­ ,ÐõõuëùôâØq[ÏóÅãø½½´Ã¬Þ>¥~ ž«=˜r’Üp󉾖†Càƒ‰\“Z€dñ€€dÿ“tƒ‰„†D‰¾óf’Üɘr{ž««¥}¬Þ¿´Ã¢½NÅâÈÏ·Øqýâ¶ëúõô ÿÿ{ ÕUâ8'0ûR:JBáƒK=$S vZ‚(aTôgŽm#·r !vA†y¼7|vµ~l²šìÿÿšû~l€|vky¼svAÐr xm#gYaUqZ‚°S!K¬ßQ¥}£žªÛ˜q¿’Ý.󾉾]†C²ƒ‰9“’€e€€e “Œƒ‰/†C¥‰¾Móª’ݘq¦žªÀ¥}…¬ß1´Ä½ÅãMÏAØr‹âHëù7õô¶ jéà×'“0ûÜ:ÏBâK;ÿS çZ‚‘aUUgŽmm"ùr dvA¿y¼e|vØ~lyšøÿÿšð~l¹|v¿y¼DvA–r 4m#ÍgŽ.aUZ‚FS –K=GBá§:p0ûz'-âa€ ÿÿ¥õôKëúÇâàØr&ÏßÅâî½s´ÃŬÞà¥}:žªz˜r”’Üàóz‰¾$†C„ƒ‰Ž“{€e€€e“Sƒ‰R†CÓ‰¾†óî’ÜZ˜qþž«!¥}ï¬ß£´Âö½˜ÅãÒÏËØq3âçëùÊõõK¥ ƒái'Ž!0üf:ŒBàÍK|v»~lµšîÿÿšú~l||vfy¼lvAÇr nm#gLaUbZ‚ S ÷K<Bâ:â0ûï'¦àëý $õôÊëùKâ\ØrŸÏTÅã_½*´Ä,¬ß@¥}”žªÍ˜q²’Ý"󳉾U†C«ƒ‰4“€e €€e “ƒ‰4†C«‰¾Uó´’Ý#˜q³žªÎ¥}•¬ßB´Ä-½,ÅãaÏVØr¡â]ëùMõôÌ& ÿàí'¨0ûñ:ãBàaK<S øZ‚¡aUdgMm#r nvAÈy¼l|vf~l}šúÿÿšî~lµ|vºy¼>vAŽr *m#ÂgŽ!aUZ‚6S …K=5Bá”:]0ûe'âLj êÿÿõô5ëú±âÊØrÏÊÅâÚ½`´Ã³¬ÞÏ¥}*žªl˜r‡’ÜÔóp‰¾†C}ƒ‰‰“x€e€€e“Vƒ‰W†CÚ‰¾ó’Üf˜r ž«/¥}ÿ¬Þ.´Ã½«ÅãæÏàØqHâýëùàõõa¼ ™á~'Ž60ü{: BààK<ŠS!jZƒ aTxg¥m#Sr ²vBy»ü|v‰~l”›ÿÿ› ~lž|v—y¼vAUr Îm#sgÉaT ZÌS!™K<¼Bá:×0úÛ'ŽqáºÖ Uúõõžëúâ9ØqƒÏÅä½à´Ã:¬Þ]¥~*ž«W˜r/’܆ó,‰¾¦†C탉f“`€dõ€€dü“nƒ‰z†D‰¾óT’Ü´˜rcž«¥|þ¬Þ ´Ã½+ÅäkÏ‘ØqÖâŽëútõõöÿÿQ ¬-â'ŽÄ0û,:%Bá`K=S!ÜZ‚ aTÙgüm#¡r vAvy¼*|v¬~l¬šéÿÿšÿ~l†|vty¼vAàr ‹m#%gqaUŒZ‚ÍS!'Kž«g¥~;¬Þo´ÃM½õÅä3ÏVØq™âPëú5õõ¶ÿÿ mîáÒ'Žˆ0úñ:íBá)K<ÏS!«ZÝaT°g×m#€r ÙvA^y¼|v~l¢› ÿÿ›~l|vƒy»õvAør §m#Gg–aThZ‚úS!XK¥~¬Þ?´Ã½¾ÅãúÏôØq]âëùöõõwÒ -¯á”'ŽL0ü:´BàóK<œS!{ZƒaT‡g²m#_r ¼vB y¼|vŽ~l˜›ÿÿ› ~lš|v’y¼vBr Äm#hg¼aT’Zƒ'S!ˆK<ªBá:Ã0ü 'Ž\á¥À ?ãõõˆëúâ#ØqmÏÅä ½Í´Ã(¬ÞL¥~ž«I˜r"’Üzó"‰¾ž†C惉`“]€dó€€dý“qƒ‰†D‰¾ ó^’Ü¿˜rpž«Ÿ¥}¬Þ±´Ã“½>ÅäϦØqëâ¤ëúŠõö ÿÿg ÂCâ%'Œó0ûA:9BásK=S gZ‚aTègŽ m#­r vAy¼1|v±~l¯šëÿÿšý~lƒ|voy¼xvA×r €m#gdaU}Z‚½S!K<1Bà‚:0ü'Îá, ¨Nõôóëùtâ’ØrÆÏzÅㄽN´Â¯¬ß`¥}±žªè˜qÊ’Ü,󯉾e†C¸ƒ‰>“•€e€€e “‰ƒ‰+†CŸ‰¾Fó¢’Ý ˜q›žª³¥}x¬ß"´Ä ½ Åã<Ï0Øryâ5ëù$õô¢ÿÿý WÖàÅ'0ûË:¾BáòK;ïS ÙZ‚„aUIgŽam"ïr \vA¸y¼_|vÔ~lvšöÿÿšñ~ll|vÄy¼JvAžr =m"ÌgŽ9aUZ‚SS ¥K=VBá¸:0û‹'@ât’ ÿÿ¸õô^ëúÚâóØr8ÏðÅâÿ½ƒ´ÃÔ¬Þî¥}Gžª‡˜r ’Üê󂉾+†C‰ƒ‰’“~€e€€e“Pƒ‰N†C͉¾óå’ÜP˜qóž«¥}á¬ß”´Â罈ÅãÁϺØsâÕëù·õõ8’ ìpáV'Ž0üU:{Bà½Kr  vAñy»ï|v~lŽ›ÿÿ›~l¤|v¡y¼vAer ám#‰gáaT»ZêS!¸K<ÝBá8:ü0û'Ž˜áãÿ ~ÿÿ#õõÈëúFâaØqªÏfÅäB½´Ã[¬Þ}¥|Þž«r˜rH’Ü›ó?‰½ò†Cùƒ‰o“g€dø€€dø“gƒ‰q†Cû‰½ôóA’Üž˜rKž«u¥|á¬Þ€´Ã_½ÅäFÏkØq¯âfëúKõõÍÿÿ( ƒáç'Ž0û:Bá ½ÿÿbõöëú…âŸØqæÏ¡Åä{½:´Ã¬Þ­¥} ž«œ˜rm’ܽó[‰¾ †D ƒ‰~“q€dý€€dó“]ƒ‰b†C牾 ó$’Ü}˜r%ž«L¥~¬ÞP´Ã,½ÑÅäÏ Øqrâ(ëú õõè DÅáª'Ža0ü¤:ÈBáK<®S!ŒZƒ*aT•g¿m#jr ÇvANy¼ |v“~l›› ÿÿ›~l—|vy¼vBr ºm#\g¯aTƒZƒS!wK<˜Bàï:°0ü‹'ŽG᪠(ÍõõrëùñâØqXÏðÅãõ½º´Ã¬Þ;¥~ ž«:˜r’Üo󉾕†C߃‰[“Y€dñ€€dÿ“uƒ‰…†D‰¾óh’ܢr}žªa¥}¬Þ´å½QÅâËϺØrâºëú õô$ÿÿ~ ÙYâ;'0ûU:MBá†K='S xZ‚*aTögŽm#¸r "vA‡y¼8|v¶~l³šìÿÿšû~l|vjy¼rvAÎr vm#gWaUoZ‚­S!K<Bào:ó0ü'¹àþ ’8õôÝëù^ânØr±ÏfÅãp½;´Ä;¬ßO¥}¡žªÙ˜q½’Ý,󼉾\†C±ƒ‰8“’€e€€e “Œƒ‰0†C¦‰¾Nó¬’ݘq¨žªÂ¥}ˆ¬ß3´Ä½ÅãPÏDØrŽâKëù:õô¹ nìàÚ'–0ûß:ÒBâK<S êZ‚”aUWgŽom"ûr fvAÁy¼f|vÙ~lzšøÿÿšï~l¸|v¿y¼CvA•r 2m#ËgŽ,aUZ‚DS ”K=DBá¥:m0ûw'*â^| ýÿÿ¢õôHëúÄâÝØr#ÏÜÅâë½p´Ã¬ÞÝ¥}8žªx˜r’’ÜÞóx‰¾#†Cƒƒ‰“{€e€€e“Tƒ‰S†CÔ‰¾‡óï’Ü\˜rž«#¥}ñ¬ß¥´Âù½›ÅãÕÏÎØq6âêëùÍõõN© †ál'Ž$0üi:BàÐK ™áý'޲0û:BáOK<óS!ÍZýaTÍgñm#—r îvAoy¼%|v§~l©›ÿÿ›~l‰|vyy¼…vAçr “m#/g|aU˜Z‚ÚS!6K½äÅä"ÏØq‡â>ëú"õõ£ÿ ZÛá¿'Žv0úà:ÜBáK<ÀS!ZÐaT£gÌm#vr ÑvAWy¼|v˜~lŸ› ÿÿ›~l“|vˆy»ûvAÿr °m#Qg¢aTuZƒS!fK<†BàÜ:œ0üv'Ž2áy” ·õõ\ëùÛâøØqCÏÛÅãâ½§´Ã¬Þ*¥}ûž«,˜r’Ücó ‰¾†C؃‰V“V€e€€e“xƒ‰Š†C~‰¾ór’ÜטrŠžªo¥}.¬ÞӴ÷½dÅâßÏÏØrâÏëú¶õô:ÿÿ” ïoâQ'0ûj:aBá™K=9S ‰Z‚:aUgŽ$m#Är ,vAy¼?|v»~l¶šîÿÿšù~l||vey¼kvAÆr lm#gJaU`Z‚žS õK< Bâ:ß0ûì'£àèú |!õôÇëùHâYØrœÏQÅã\½(´Ä)¬ß>¥}‘žªË˜q°’Ý ó²‰¾T†Cªƒ‰3“Ž€e €€e “ƒ‰5†C¬‰¾Wó¶’Ý%˜qµžªÐ¥}—¬ßD´Ä0½/ÅãdÏYØr¤âaëùPõôÏ) „àð'«0ûô:æBàcK<S ûZ‚£aUfgOm#r pvAÉy¼m|vg~l}šúÿÿšî~lµ|v¹y¼=vAr (m#ÀgŽaTÿZ‚4S ƒK=2Bá’:Z0ûb'âIf çÿÿŒõô2ëú®âÇØrÏÇÅâ×½]´Ã°¬ÞÌ¥}(žªj˜r…’ÜÒón‰¾†C|ƒ‰ˆ“w€e€€dð“Wƒ‰X†CÛ‰¾ó’Üg˜r ž«1¥~¬Þ1´Ã ½®ÅãéÏãØqKâëùãõõd¿ œá'Ž90ü~:£BàãK<ŒS!lZƒ aTzg§m#Ur ´vBy»ý|vŠ~l•›ÿÿ› ~l|v—y¼vATr Ím#rgÇaTžZÊS!—K<¹Bá:Ô0ü±'Žná·Ó Röõõ›ëúâ6Øq€ÏÅä½Ý´Ã7¬Þ[¥~(ž«U˜r.’Ü„ó*‰¾¥†C색e“`€dô€€dü“nƒ‰{†D ‰¾óU’ܵ˜rež«’¥}¬Þ¢´Ãƒ½.ÅänÏ”ØqÙâ‘ëúwõõùÿÿT ¯0â'ŽÈ0û/:(BábK=S!ÞZ‚ aTÛgþm#£r vAxy¼+|v­~l¬šéÿÿšþ~l†|vty¼~vAÞr ‰m#$goaUŠZ‚ËS!%K<@Bà“:0ü''àá&? »aõõëù†â¥ØrØÏŒÅ㕽^´Â¾¬ßn¥}¾žªô˜qÖ’Ü6óω¾l†C½ƒ‰B“H€e€€e“†ƒ‰ž†C™‰¾>ó™’ݘqžª§¥}j¬ß´Ãü½øÅã+ÏØrgâ#ëùõôÿÿê DÃà²'o0û¹:­BáâK;àS ÊZ‚vaUm"Ðr )vA¡y»¯|vÆ~lm›ÿÿ›~lu|vÒy»¿vAµr @m"ëgŽ]aS÷Z‚~S"XK;éBáë:ï0ûÃ'`à½Î Qÿÿõõö™ëùâ-Øp‹Ï(Åäý½´Ä¬Ý—¥}rž«û˜q–’Ý òµ‰¾B†D:ƒ‰)“‡€dà€€dè“—ƒ‰@†DX‰¾hòâ’Ý<˜qÏž¬:¥}·¬Ýá´ÄT½UÅåTÏ‚ØpçâŒëù|õöúV ².á'½0ü:FBâ>K<7S—Z‚ÃaT6gŽ–m#r œvAÚy»Ý|vé~l„šÕÿÿ›~l^|v¯y¼ÍvA|r ým"gŽaV/Z‚S!æK;pBál:ú0û9'ŽÒà+: ¹ÿÿ_õöëøˆâœØsÊÏžÅäx½‚´ÃŒ¬à0¥}ž«™˜q>’Ü»ôB‰¾ †D ƒ‰“p€e%€€dô“®ƒ‰b†CJ‰¾¡ó%’ÝŠ˜r'žª¥~ ¬ÞR´ÄͽÔÅâHÏ Øquâ ëúõó’ë GÂá­'Œ}0ü§:ËBâ½K<°S Zƒ-aT—gŽîm#lr àvBy¼ |w ~lœšáÿÿ›~lF|vŒy¼ŸvABr ¹m"Og­aUÎZ«S!uK:÷Bàì:u0ú¯'ŽDßš§ $ÿþÊõõoëûèâ Øs<ÏÅãó½ l´Ã¬ß¾¥|Ÿž«8˜s@’Ümóÿ‰½Ð†CÞƒ‰Ò“Y€e€€dÿ“%ƒ‰…†Cx‰¾Úói’ÛÁ˜ržªc¥~ЬÞÄ´Â ½TÅâÎÏ–ØrâËëú£õô' Übâ>' 0ý1:PBßÔK=)S {Zƒ–aTøgŒìm#ºr #vBMy¼9|v?~l³šíÿÿšû~lÏ|viy¼qvA r um$gUaUmZAS!K=ºBàm:ð0ú%'¶âì ÿþ4õôÚëûTâyØr®ÏŠÅãm½í´Âš¬ßM¥|5žª×˜rè’Ü󻉽—†C°ƒ‰¯“A€e €€e “=ƒ‰¨†C¦‰¿ó­’ܘrמªÄ¥| ¬ß6´Â‚½ÓÅãSÏnØr’â\ëû7õô¼ÿþ qöâÏ'™0ú :ÕBàSK=¢S ìZ,aUYgCm$r gv@þy¼g|vb~lÊšøÿÿšï~l¸|vFy¼BvBXr 1m#ÊgŒýaU Zƒ«S ‘K=ABßí:k0ýM''â[€ úŸõôEëúÁâèØr ϲÅâè½m´Â!¬ÞÛ¥~Ÿžªv˜r‘’ÛÑów‰¾æ†C‚ƒ‰Œ“*€e€€e“Tƒ‰Ë†CÕ‰½Åóñ’Ü]˜s/ž«%¥|‰¬ß§´Âû½ RÅãØÏøØs âîëûÊõõQÿþ¬ ‰ãa'Ž'0ú“:ZBàÓK>S!^Z–aUºg›m$Vr «vA7y¼–|v…~lB›ÿÿšã~l |wy¼vBr ím#|gŽÿaT«ZƒBS K<ÈBâ×:å0üÃ'Œ™áÊß e õó°ëú-â :Øq’Ï(Åâc½î´Äå¬Þi¥~6žª˜r9’Ýšó3‰¾¬†CSƒ‰i“³€dö€€e"“kƒˆÿ†D‰½þô5’Ü«˜q-ž«†¥|ó¬à´Ãt½iÅä]Ï‚Øs®âëøkõõæÿÿA ›à'޵0û:àBáRK;WS!ÐZÿaVgóm"r ïvApy¼Ä|v¨~lY›ÿÿšØ~l‰|vðy»ævAær ©m#.gާaTIZ‚ØS®K!BàÙ:a0úš'Ž/ãh‘ ÿþ´õõYëûÒâõØs'ÏÿÅãß½ Y´Ã¬ß­¥|ž«*˜s3’Üaóô‰½È†C׃‰Í“U€e€€e“)ƒ‰Š†C‰¾ãós’Û͘rŒžªq¥~š¬Þմ½gÅâáÏ«Ørâàëú¹õô=— òxâT' 0ýF:dBßçK=;S ŒZƒ¦aUgŒùm#Ær .vBUy¼@|vE~l¶šîÿÿšù~lÌ|vdy¼jvAr km$ gHaU^Z1S òK=¨BàZ:Ü0ú' â×ý xÿþõôÄëû>âdØr™ÏuÅãZ½ڴˆ¬ß<¥|%žªÉ˜rÛ’Ü󱉽ކC©ƒ‰ª“>€e €€e “@ƒ‰­†C­‰½”ó·’ܘr䞪ҥ|/¬ßG´Â”½æÅãgσØr§ârëûMõôÒÿþ- ‡ âå'®0ú:éBàfK=´S ýZBàÆ:M0ú†'ŽãS{ ÷ÿþõõBëû¼âߨsÏëÅã˽ F´Âï¬ßœ¥|ž«˜s&’ÜVóꉽ¿†CЃ‰È“R€e€€e“,ƒ‰†C†‰¾ëó}’ÛØ˜r™žª€¥~ª¬Þæ´Â-½zÅâõÏ¿Ør.âöëúÏõôS­ Žâi'50ýZ:xBßúK=MS Zƒ¶aUgm#Ñr 8vB^y¼G|vJ~lºšðÿÿš÷~lÈ|v_y¼cv@ør am$g;aUPZ"S áK=–BàG:È0ùü'‹âÁç bÿþõô­ëû(âNØr„ÏÅãF½Ç´Âv¬ß+¥~鞪º˜rÎ’Ü󦉿†C¢ƒ‰¥“:€e €€e“Dƒ‰³†C´‰½œóÁ’Ü&˜rñžªá¥|?¬ßX´Â¦½ùÅãzÏ—Ør¼â‡ëûcõôèÿþC "âû'Ã0ú2:ýBàyK=ÆS!ZKaUvg^m$ r {vAy¼u|vm~lÑšüÿÿšì~l±|vr m#§gŒÖaTàZƒ|S _K= Bß´:/0ý'Œèâ> ·\õôëúâ§ØqàÏtÅâ­½4´Áë¬Þ¨¥~pžªK˜ri’Û®óX‰¾Ì†Cmƒ‰}“€dü€€e“^ƒˆì†C鉽Þô’Ü€˜püž«P¥|¹¬ßÚ´Ã1½"ÅäÏ6Øs_â.ëøõõ“ÿþï HËß¾'Žg0úÑ:–Bá K;S!‘ZÅaUægÃm"br ÉvAQy¼ª|v•~lL› ÿÿšÞ~l–|wy¼vBr Ïm#YgŽØaTZƒSíK<’Bâž:ª0ü…'ŒZበ"ÇõómëùëâùØqRÏêÅâ(½µ´Ä¯¬Þ6¥~ž©ê˜r’Ýw󉾓†C?ƒ‰Z“¨€dñ€€e(“vƒ‰†D‰¾ôS’ÜΘqTž«±¥}"¬àL´Ãª½¢Åä™ÏÀØsíâÀëø¬õö(ÿÿ„ Ý_àO'Žõ0û[:Bá‹K;ŽS"Z‚.aVGgŽm"°r vAŠy»œ|v¸~lc›ÿÿ›#~l~|vày»ÑvAÌr \m# gŽ€aTZ‚©S"†K<Bâ:%0ûû'™àø 1õöÕëùWâhØpÄÏ`Åå3½5´Ä6¬ÝÅ¥}ž¬"˜qº’Ý)òщ¾Z†DMƒ‰7“‘€d倀d㓃‰1†DF‰¾Qòƒݘq¬ž¬¥}Œ¬Ý³´Ä#½!ÅåÏJØp®âQëù@õö¾ vòàá'ƒ0ûå:Bâ K<S"tZ‚˜aTgŽrm"þr QvAÃy»Ê|vÛ~l{›!ÿÿ›~lg|v½y»£vA“r m"½gŽ(aS½Z‚?S"K;¡BáŸ: 0ûq' àfv øÿÿœõö@ëøÄâרtÏÖÅ䮽¶´Ã½¬à^¥}3ž«Á˜qb’ÜÛô^‰¾ †Dƒ‰“z€e*€€dï“¥ƒ‰T†C7‰¾Šó ’Ýj˜rž©Û¥}ö¬Þ%´Äœ½¡ÅâÏÔØq<ââëùÔõóV¯ †ár'ŒC0üo:•BâŠK<SÛZƒaTpgŽÊm#Mr ÄvAüy»ø|vý~l’šÜÿÿ› ~lP|všy¼±vAZr Ôm"ogÐaUõZÕS!£K;(Bá :«0úç'Ž}ßÕâ `ÿÿõõ«ëø0âEØsvÏLÅä(½6´ÃD¬ßì¥|Éž«`˜q ’ÜŒô‰½ç†Cñƒˆñ“b€e€€dû“¼ƒ‰w†Cf‰¾ÃóN’ݹ˜r\žª<¥~_¬Þ–´Áؽ Åâ˜Ï^ØqÊâëúgõóëE  &â'ŒÑ0üù:Bß K<øS MZƒlaTÑgŒÈm#›r vB5y¼'|v1~lªšèÿÿ›~lÙ|vwy¼ƒvA r m$7gyaU”ZlS!1K=ëBà :&0ú]'ïã'O Ëÿþqõõëûâ´ØrçÏÂÅ㣽 ´Âˬßz¥|`žªÿ˜s ’Ü>óÖ‰½®†Cƒ‰½“K€e€€e“3ƒ‰š†C”‰¾üó’’Ûð˜r³žª¥~ɬß´ÂQ½ŸÅãÏèØrXâ!ëúûõô€Ú 5ºâ•'`0ýƒ:ŸBà K=qS ¾ZƒÕaU2g m#ér LvBoy¼U|vT~lÁšôÿÿšô~lÁ|vTy¼UvBor Lm#ég!aU3ZƒÖS ¿K=rBà!: 0ý…'aâ–» 6Ûõôëúüâ#ØrYÏêÅ㽡´ÂR¬ß ¥~Êžª˜r´’Ûð󒉾ý†C”ƒ‰š“3€e€€e“Kƒ‰½†C‰½®óÖ’Ü>˜s žªþ¥|_¬ßz´Âʽ Åã¢ÏÀØræâ³ëûõõÿþo ÊNã&'î0ú\:%BàŸK=êS!0ZkaU“gxm$7r vA y¼ƒ|vw~lØšÿÿÿšè~lª|v2y¼'vB6r m#›gŒÉaTÒZƒlS NK<ùBß¡:0üû'ŒÓâ( ¡Fõóìëúiâ‘ØqËÏ_Å♽!´ÁÙ¬Þ—¥~`žª<˜r\’ݹóN‰¾Ã†Cfƒ‰w“¼€dû€€e“bƒˆñ†Cð‰½çô’ÜŒ˜q ž«_¥|Ȭßë´ÃC½5Åä'ÏJØstâDëø/õõªÿÿ _áßÔ'Ž|0úæ:ªBáK;'S!¢ZÕaUôgÐm"nr ÔvAYy¼±|vš~lP› ÿÿšÜ~l’|vþy»ùvAýr Åm#MgŽËaTqZƒSÜK<€Bâ‹:–0üp'ŒEás‡ °õóWëùÕâäØq=ÏÕÅâ½¢´Ä¬Þ%¥}÷ž©Û˜r’Ýkó ‰¾Š†C8ƒ‰U“¥€de)“yƒ‰†D‰¾ ô]’ÜÚ˜qaž«À¥}2¬à]´Ã¼½µÅä¬ÏÕØtâÕëøÂõö?ÿÿš ÷uàe' 0ûp:žBážK; S"Z‚>aS¼gŽ(m"¼r vA’y»£|v½~lg›ÿÿ›!~l{|vÛy»ËvAÃr Rm"ÿgŽsaTZ‚™S"uK<Bâ :0ûæ'„àâô wõö¿ëùAâRØp¯ÏKÅå½"´Ä$¬Ý´¥}ž¬˜q­’Ýòlj¾Q†DFƒ‰2“€d då“‘ƒ‰7†DM‰¾YòÐ’Ý(˜q¹ž¬!¥}œ¬ÝÄ´Ä5½4Åå2Ï_ØpÃâgëùVõöÔ0 Œàö'˜0ûú:$BâK<S"…Z‚¨aTgŽm# r [vAÌy»Ñ|và~l~›#ÿÿ›~ld|v¸y»œvAŠr m"±gŽaS¯Z‚/S"K;BáŒ:0û\'ŽöàQ` ßÿÿ…õö*ëø®âÁØsïÏÁÅäš½£´Ã«¬àM¥}#ž«²˜qU’ÜÏôT‰¾†Dƒ‰“v€e(€€dñ“¨ƒ‰Z†C>‰¾’ó’Ýv˜rž©é¥~¬Þ5´Ä®½´Åâ&ÏéØqQâøëùêõólÅ !œáˆ'ŒY0ü„:©BâK<‘SìZƒaT~gŽ×m#Xr ÎvBy»ÿ|w~l–šÞÿÿ› ~lL|v•y¼«vAQr Êm"cgÃaUæZÆS!’K;Bá :—0úÒ'Žhß¿Ì Jÿþðõõ•ëøâ0Øs`Ï7Åä½#´Ã2¬ßÛ¥|ºž«Q˜pý’Üô‰½ß†Cꃈì“_€e€€dü“ƒ‰|†Cm‰¾ÌóX’Û­˜rižªJ¥~o¬Þ§´Áê½3Åâ¬ÏsØqßâ¦ëú}õô[ ¶<â'Œç0ý:.Bß³K= S ^Zƒ{aTßgŒÕm#¦r vB>y¼-|v6~l­šêÿÿšþ~lÕ|vry¼|vAr †m$,gkaU…Z\S! K=ÙBà:0úH'Úã9 µÿþZõõëûzâžØrÒÏ­Åã½ ´Â¹¬ßj¥|Pžªð˜rÿ’Ü3ó̉½¥†C¼ƒ‰¸“G€e€€e“7ƒ‰Ÿ†C›‰¿óœ’Ûû˜rÀžª«¥~٬ߴÂc½²Åã1ÏýØrmâ7ëûõô–ð KÐâª'u0ý˜:³Bà3K=ƒS ÏZaU@g-m#ôr Vv@ïy¼\|vY~lÄšõÿÿšò~l¾|vOy¼NvBgr Bm#ÞgaU$ZƒÆS ®K=`Bà:0ýp'L‥ Åõôkëúæâ ØrDÏÕÅã ½Ž´Â@¬Þø¥~ºžª˜r§’Ûå󈉾ô†Cƒ‰•“0€e€€e“Nƒ‰Â†Cɉ½¶óà’ÜI˜sž« ¥|n¬ßŠ´Âܽ 2Åã¶ÏÕØrûâÈëû¥õõ+ÿþ† àdã<'Ž0úp:8Bà²K=üS!AZ{aU¢g…m$Br švA(y¼Š|v|~lÜ›ÿÿšæ~l¦|v,y¼ vB-r þm#gŒ¼aTÃZƒ]S =K<çBߎ:0üæ'Œ¾áï ‹0õóÖëúSâ _Øq¶ÏKÅâ…½´Å¬Þ†¥~Qžª.˜rO’Ý®óD‰¾»†C_ƒ‰r“¹€dù€€e “eƒˆö†C÷‰½ïô#’Ü—˜qž«m¥|جßü´ÃU½HÅä;Ï_ØsŠâZëøEõõÀÿÿ u÷ßé'Ž‘0úú:¾Bá2K;9S!³ZäaVgÝm"yr ÞvAby¼¸|vŸ~lS› ÿÿšÛ~l|vùy»òvAôr »m#Bg޾aTbZ‚óSËKS!RZŠaU°g’m$Nr ¤vA1y¼‘|v~lß›ÿÿšå~l£|v'y¼vB%r ôm#„g aTµZƒMS ,K<ÕBâä:ô0üÑ'Œ¨áÙï tõóÀëú=â JØq¡Ï6Åâq½û´Äò¬Þu¥~Ažª˜rB’Ý¢ó:‰¾²†CXƒ‰m“µ€d÷€€e!“iƒˆû†Cþ‰½øô.’Ü£˜q#ž«|¥|è¬à ´Ãg½[ÅäOÏtØsŸâoëø[õõÖÿÿ1 ‹ ßÿ'ަ0û:ÑBáEK;KS!ÄZôaVgêm"…r èvAjy¼¿|v¤~lV›ÿÿšÙ~l‹|vóy»ëvAìr °m#6gޱaTTZ‚ãSºK<\Bâe:n0üG'ŒáH[ ß„õó+ëù©â¸ØqϬÅáì½|´Äy¬Þ¥}מ©¾˜qê’ÝTòö‰¾y†Dgƒ‰J“ž€d뀀dÝ“€ƒ‰†D,‰¾1ò¡’Üñ˜q{ž«Ý¥}R¬Ýt´Ãà½ÛÅäÔÏþØp_âëøîõökÿÿÇ #¡à'40û™:ÆBáÄK;ÄS"5Z‚^aSÙgŽBm"Ór ,vA£y»±|vÇ~ln›ÿÿ›~lt|vÐy»½vA²r >m"ègŽYaSóZ‚zS"SK;ãBáæ:é0û½'Zà·È Jÿÿîõö’ëùâ'Øp„Ï"Åä÷½ü´Ä¬Ý’¥}mž«ö˜q’’Ýò²‰¾@†D8ƒ‰'“†€dà€€d蓘ƒ‰A†DZ‰¾jòä’Ý?˜qÓž¬>¥}»¬Ýæ´ÄY½ZÅåYψØpíâ’ëù‚õ÷\ ¸4á"'Ã0ü#:KBâCK<ãx  ÿþÃõõhëûáâØs6ÏÅãí½ f´Ã¬ß¹¥|šž«4˜s=’Üjóü‰½Î†C܃‰Ñ“X€e€€e“&ƒ‰‡†Cz‰¾Ýól’ÛĘrƒžªg¥~¬Þɴ½YÅâÓÏœØr âÑëú©õô-‡ âhâD'0ý7:VBßÙK=.S €Zƒ›aTügŒïm#¾r &vBOy¼;|vA~l´šíÿÿšú~lÎ|vhy¼ovAr rm$gQaUhZƒ‰ª†C¨‰½Žó°’ܘrÛžªÈ¥|$¬ß;´Â‡½ØÅãXÏtØr˜âbëû=õôÂÿþ wüâÖ'Ÿ0ú:ÛBàYK=§S ñZ0aU]gGm$ r jvAy¼i|vd~lËšùÿÿšï~l·|vEy¼@vBVr .m#ÆgŒùaUZƒ§S K=ëúºââØrϬÅâã½h´Â¬ÞÖ¥~›žªr˜r’ÛÍót‰¾ã†C€ƒ‰‹“)€e€€e“Uƒ‰Í†C׉½Çóô’Üa˜s3ž«)¥|ެ߬´Ã½ XÅãÞÏþØs&âôëûÑõõWÿþ² ãg'Ž-0ú™:`BàØK> S!cZšaU¾gŸm$Zr ®vA9y¼˜|v‡~lC›ÿÿšã~lŸ|wy¼vBr êm#xgŽûaT¦Zƒ=S K<ÃBâÑ:à0ü½'Œ“áÄÙ ^õó©ëú'â 4ØqŒÏ"Åâ]½è´Äà¬Þd¥~1žª˜r5’Ý–ó0‰¾ª†CQƒ‰h“²€dõ€€e#“lƒ‰†D‰¾ô8’ܯ˜q0ž«Š¥|ø¬à´Ãy½nÅäcψØs´â…ëøqõõìÿÿH ¡#à'Ž»0û#:åBáXK;]S!ÔZ‚aV g÷m"‘r òvAsy¼Æ|vª~lZ›ÿÿš×~lˆ|vîy»ävAãr ¦m#*gޤaTEZ‚ÔS©KBàÔ:[0ú”'Ž(ãbŠ ÿþ­õõRëûÌâïØs!ÏùÅãÙ½ T´Âü¬ß¨¥|Šž«&˜s/’Ü^óò‰½Å†CÕƒ‰Ë“T€e€€e“*ƒ‰Œ†C‰¾åóv’ÛИržªu¥~ž¬ÞÚ´Â ½lÅâçϱØrâçëú¿õôCž ø~âZ'&0ýL:jBßìK=@S Zƒ«aU gŒüm#Ér 0vBWy¼B|vF~l·šïÿÿšù~lË|vcy¼hv@þr hm$ gDaUZZ-S íK=£BàT:Ö0ú 'šâÑ÷ rÿþõô½ëû8â]Ør“ÏoÅãT½Դƒ¬ß7¥|!žªÅ˜rØ’Ü󮉿†C§ƒ‰¨“=€e €€e “Aƒ‰¯†C¯‰½–óº’ܘr螪ץ|4¬ßL´Â™½ëÅãlωØr­âxëûSõôØÿþ3 âë'´0ú$:ïBàlK=¹S!Z@aUlgTm$r tvA y¼p|vi~lÏšûÿÿší~l³|v@y¼:vBMr $m#»gŒìaTùZƒ—S |K=*BßÕ:Q0ý2' â?c Ý‚õô(ëú¤âÌØrÏ—ÅâϽU´Â ¬ÞÅ¥~‹žªd˜r€’ÛÂój‰¾Û†Cyƒ‰†“%€dÿ€€e“Xƒ‰Ò†CÞ‰½Ðóþ’Ül˜s@ž«8¥|ž¬ß½´Ã½ kÅãñÏØs;â ëûçõõmÿþÉ "¦ß™'ŽC0ú®:tBàëK:öS!tZªaUÍg¬m"Nr ¸vABy¼ž|vŒ~lF›ÿÿšá~lœ|w y¼ vBr àm#mgŽîaT˜Zƒ-S K<±Bâ¾:Ì0ü¨'Œ~á®à Híõó“ëúâ ØqvÏ ÅâJ½Õ´ÄάÞS¥~!žª˜r(’Ý‹ó&‰¾¡†CKƒ‰c“®€dô€€e%“pƒ‰†D ‰¾ ôB’ܺ˜q>ž«™¥}¬à/´Ã‹½ÅäwÏØsÉâ›ëø‡õöÿÿ^ ·9à*'ŽÑ0û8:ùBákK;oS!åZ‚aV.gŽm"œr üvA{y¼Í|v¯~l]›ÿÿšÕ~l„|véy»ÝvAÛr œm#gŽ—aT7Z‚ÄS˜K<8Bâ?:G0ü'¾á/ ³Wõöûëù}âØpèσÅåU½V´ÄU¬Ýâ¥}¸ž¬;˜qÐ’Ý=ò≾h†DYƒ‰@“—€d耀dà“‡ƒ‰)†D:‰¾Bòµ’ݘq•ž«ú¥}q¬Ý–´Ä½ÅäüÏ'Øp‰â,ëùõö—ÿÿó PÍà¼'_0ûÂ:îBáêK;èS"WZ‚}aSögŽ\m"êr @vA´y»¾|vÒ~lu›ÿÿ›~lm|vÆy»¯vA¡r )m"ÑgŽ?aSÖZ‚ZS"1K;¿BáÀ:Â0û”'0à‹œ ÿÿÂõöfëøéâüØpZÏùÅäнÖ´ÃܬÝp¥}Nž«Ù˜qx’Üîòž‰¾/†D+ƒ‰“€dÜ€€d쓟ƒ‰K†C,‰¾{òù’ÝW˜q힩¥}Û¬Þ´Ä}½€ÅáñϱØqâ½ëù®õó0‰ å`áM'Œ0üL:sBâiK BàÁ:H0ú€'ŽãLt ñÿþ—õõ<ëû¶âÙØs ÏåÅ㎠A´Âê¬ß—¥|{ž«˜s"’ÜRó牽½†C΃‰Æ“Q€e€€e“-ƒ‰‘†Cˆ‰¾îó€’Ûܘržª„¥~®¬Þë´Â2½ÅâûÏÅØr4âüëúÕõôZ´ ”âp';0ý`:}BßÿK=RS ¡ZƒºaUg m#Õr ;vB`y¼I|vK~l»šñÿÿš÷~lÇ|v]y¼av@ör ^m#ýg7aULZS ÜK=‘BàA:Â0ùö'…â»á \ÿþõô§ëû"âHØr~Ï Åã@½Á´Âq¬ß&¥~垪¶˜rË’Ü󤉿 †C ƒ‰£“9€e €€e“Eƒ‰´†C¶‰½ŸóÄ’Ü*˜rõžªå¥|D¬ß]´Â«½þÅã€ÏØrÂâŽëûiõôïÿþI ¤(ã'Ê0ú8:BàK=ËS!ZPaUzgam$#r ~vAy¼w|vn~lÒšüÿÿšë~l°|v:y¼3vBDr m#¯gŒßaTêZƒ‡S kK=BßÂ:=0ý'Œ÷â*M ÇlõôëúŽâ¶ØqïσÅ⻽B´Áø¬Þ´¥~{žªU˜rs’Û¶ó`‰¾Ò†Crƒ‰€“"€dþ€€e“\ƒ‰×†C䉽Øô’Üx˜sMž«F¥|­¬ßδÃ$½ÅäÏ'ØsPâëø õõ„ÿþß 9¼߯'ŽX0úÂ:ˆBàþK;S!…ZºaUÛg¹m"Zr ÂvAKy¼¥|v‘~lJ›ÿÿšß~l˜|wy¼vB r Öm#agŽáaT‰ZƒSùK<ŸBâ¬:¸0ü”'Œiᘭ 2Öõó}ëùûâ ØqaÏùÅâ6½´ļ¬ÞB¥~ž©ô˜r’Ý󉾙†CDƒ‰]“«€dò€€e&“sƒ‰ †D‰¾ôL’ÜÆ˜qKž«§¥}¬à@´Ã½”Åä‹Ï±ØsÞâ°ëøõöÿÿt ÎOà@'Žæ0ûL: Bá~K;S!öZ‚#aVž«Ë˜qk’Üãôe‰¾&†D$ƒ‰“|€e+€€dî“¢ƒ‰Q†C3‰¾„ó’Ýb˜qúž©Ð¥}ë¬Þ´Ä½“ÅâÏÆØq-âÓëùÄõóFŸ ûvác'Œ40üa:‡Bâ|Kã'ß0úM:Bà’K=ÝS!$Z`aU‰gnm$/r ˆvAy¼~|vs~lÖšþÿÿšé~l¬|v5y¼,vBám ªõóQëùÏâÝØq7ÏÏÅ⽜´Ä˜¬Þ!¥}òž©×˜r’Ýh󉾈†C6ƒ‰S“¤€de*“zƒ‰†D ‰¾"ô`’Üݘqež«Ä¥}7¬àb´ÃÁ½ºÅä²ÏÚØt âÜëøÉõöEÿÿ¡ ý{àk'0ûv:¤Bá£K;¥S"Z‚CaSÀgŽ+m"¿r vA•y»¥|v¾~lh›ÿÿ› ~lz|vÙy»ÉvAÁr Om"ügŽoaT Z‚•S"pK<Bâ: 0ûà'~àÜí põö¸ëù;âLØp©ÏEÅ彴Ĭݯ¥}ˆž¬˜q©’Ýòĉ¾O†DDƒ‰0“Œ€d då“’ƒ‰8†DO‰¾\òÓ’Ý+˜q½ž¬%¥} ¬ÝÉ´Ä:½:Åå7ÏeØpÉâmëù\õöÚ6 ’àý'ž0ü:)Bâ#K<S"ŠZ‚¬aT!gŽƒm# r ^vAÎy»Ó|vá~l›#ÿÿ›~lc|v¶y»švAˆr m"®gŽaVCZ‚+S!þK;‰Bá‡:0ûV'ŽðàJZ Øÿÿõö#ëø§â»ØsèÏ»Å䔽´Ã¦¬àH¥}ž«®˜qQ’ÜÌôQ‰¾†Dƒ‰ “u€e'€€dñ“©ƒ‰[†C@‰¾•ó’Ýy˜rž©í¥~ ¬Þ:´Ä³½¹Åâ,ÏïØqWâþëùðõórÌ '¢áŽ'Œ_0üŠ:¯Bâ¢K<—SñZƒaT‚gŽÛm#[r ÑvBy¼|w~l—šßÿÿ› ~lK|v”y¼©vAOr Çm"`gÀaUâZÁS!K;Bá:‘0úÌ'Žbß¹Æ CÿþêõõŽëøâ)ØsZÏ1Åä½´Ã-¬ßÖ¥|µž«M˜pù’Ü}ô ‰½Ü†C胉ٓ^€e€€dý“ ƒ‰~†Co‰¾Îó[’Û°˜rlžªN¥~t¬Þ¬´Áð½9Åâ±ÏyØqåâ¬ëú„õôa ¼Câ'Œí0ý:4Bß¹K=S cZƒ€aTägŒÙm#ªr vB@y¼/|v8~l®šêÿÿšý~lÔ|vqy¼zvAr ƒm$(ghaUZWS!K=ÔBàˆ: 0úB'Ôã 3 ®ÿþTõôùëûtâ˜ØrÌϧÅ㊽ ´Â´¬ße¥|Kžªì˜rû’Ü/óɉ½£†Cºƒ‰·“F€e€€e “8ƒ‰¡†C‰¿óŸ’Ûÿ˜rÄžª¯¥~ݬß´Âi½¸Åã7ÏØrsâ=ëûõôœ÷ QÖâ±'{0ùì:¹Bà8K=ˆS ÔZaUEg1m#ør Yv@òy¼^|v[~lÅšöÿÿšò~l½|vNy¼LvBdr ?m#ÚgaU ZƒÂS ªK=[Bà:‡0ýj'FâzŸ ¿õôdëúàâØr>ÏÏÅ㽈´Â;¬Þó¥~¶žª‹˜r£’Ûá󅉾ò†C‹ƒ‰”“/€e€€e“Oƒ‰Ä†Cˉ½¸óã’ÜM˜sž«¥|s¬ß´Âá½ 7Åã¼ÏÛØsâÏëû«õõ1ÿþŒ æjãB'Ž 0úv:>Bà¸K>S!FZaU¦g‰m$Fr vA+y¼Œ|v~~lÝ›ÿÿšæ~l¥|v+y¼vB+r üm#ŒgŒ¸aT¿ZƒXS 8K<âB߉:0üà'Œ·áéÿ „)õóÏëúLâ YØq°ÏEÅâ½ ´Äÿ¬Þ¥~Lžª*˜rK’ݪóA‰¾¸†C]ƒ‰q“¸€dø€€e “fƒˆø†Cù‰½òô&’Ü›˜qž«q¥|ݬà´ÃZ½NÅäAÏeØsâ`ëøKõõÆÿÿ" {þßð'Ž—0û:ÃBá7K;>S!·ZéaVgám"}r ávAdy¼º|v¡~lT› ÿÿšÚ~lŽ|v÷y»ðvAòr ¸m#>gŽºaT^Z‚îSÆKõôãëû^â‚Ør·Ï“Åãv½õ´Â¢¬ßT¥|<žªÝ˜rî’Ü$󿉽›†C³ƒ‰±“C€e€€e “;ƒ‰¦†C¤‰¿ó©’Ü ˜rÑžª¾¥~í¬ß/´Â{½ËÅãJÏeØr‰âSëû-õô²ÿþ gìâÆ'0ú:ÍBàKK=šS åZ%aUSg>m$r cv@úy¼d|v`~lÉšøÿÿšð~l¹|vIy¼EvB\r 5m#ÏgaUZƒ²S ™K=IBßõ:s0ýV'0âd‰ ¨õôNëúÊâñØr)ϺÅâñ½u´Â)¬Þâ¥~¦žª|˜r–’ÛÖó{‰¾é†C„ƒ‰Ž“+€e€€e“Sƒ‰É†CÒ‰½Áóí’ÜX˜s)ž«¥|ƒ¬ß ´Âó½ JÅãÐÏïØsâäëûÁõõGÿþ¢ ü€ãX'Ž0ú‹:RBàËK>S!WZaU´g–m$Qr §vA3y¼“|vƒ~là›ÿÿšä~l¢|wy¼vB"r ñm#gaT±ZƒHS 'K<ÐBâß:î0üË'Œ¢áÓé nõó¹ëú6â CØq›Ï0Åâl½ö´Äí¬Þp¥~<žª˜r>’ÝŸó7‰¾°†CVƒ‰l“´€d÷€€e"“jƒˆý†D‰½úô1’ܦ˜q'ž«€¥|ì¬à´Ãl½aÅäUÏzØs¥âvëøaõõÜÿÿ8 ‘à'ެ0û:×BáJK;PS!ÈZùaVgîm"ˆr ëvAmy¼Á|v¦~lW›ÿÿšØ~lŠ|vòy»évAér ®m#3gŽ­aTPZ‚ßSµK†D6ƒ‰&“…€d߀€dé“™ƒ‰C†D\‰¾mòç’ÝC˜qמ¬B¥}À¬Ýë´Ä^½`Åå_ÏŽØpóâ˜ëùˆõ÷c ¿;á('‹û0ü):QBâIKgŽm#%r ¡vAßy»á|vì~l†šÖÿÿ›~l\|v¬y¼ÉvAwr ÷m"–gýaV&Z‚ S!ÝK;eBáa:ï0û-'ŽÆà. ¬ÿÿRõõ÷ëø{âØs¾Ï’Åäl½w´Ã‚¬à&¥|ÿž«‘˜q7’Ü´ô=‰¾†Dƒ‰“n€e$€€dõ“°ƒ‰e†CN‰¾¦ó+’Ý‘˜r/žª ¥~)¬Þ\´Ä×½ßÅâTÏØqâ *ëúõóŸø TÎá¹'Œ‰0ü³:ÖBâÈK<»S Zƒ6aTŸgŽõm#sr åvBy¼|w~lžšâÿÿ›~lD|v‰y¼›vA>r ³m"Hg¥aUÅZ¢S!kK>)Bàá:j0ú£'Ž8ãqš ÿþ½õõbëûÛâþØs0ÏÅãç½ a´Ã ¬ß´¥|–ž«0˜s9’Üfóù‰½Ë†CÚƒ‰Ï“W€e€€e“'ƒ‰ˆ†C|‰¾ßóo’ÛȘr‡žªk¥~“¬Þδ½^ÅâÙÏ¢Ørâ×ëú°õô4Ž éoâK'0ý=:[BßßK=4S „ZƒŸaUgŒóm#Ár )vBQy¼=|vB~lµšîÿÿšú~lÍ|vfy¼mvAr om$gNaUdZ8S ùK=°Bàb:ä0ú'©âà ‚ÿþ(õôÍëûHâmØr¢Ï~Åãb½â´Â¬ßC¥|,žªÏ˜rá’Ü󵉽’†C¬ƒ‰¬“?€e €€e “?ƒ‰«†Cª‰½ó³’ܘrÞžªÌ¥|)¬ß@´Â½ÞÅã^ÏzØržâiëûCõôÉÿþ# ~âÜ'¥0ú:áBà^K=¬S öZ5aUbgKm$r mvAy¼k|ve~lÌšùÿÿšî~l¶|vCy¼>vBSr +m#ÃgŒöaUZƒ¢S ˆK=7Bßâ:_0ýA'âOs í’õô8ëú´âÛØrϦÅâݽb´Â¬ÞÑ¥~–žªn˜r‰’ÛÊóq‰¾á†C~ƒ‰‰“(€e€€e“Vƒ‰Î†CÙ‰½Êó÷’Üd˜s6ž«-¥|’¬ß±´Ã½ ]ÅããÏØs,âúëû×õõ^ÿþ¹ –ãm'Ž30úŸ:fBàÞK>%S!hZŸaUÃg£m"Fr ±vA'Œ0ü=:eBâ\KBàÎ:V0ú'Ž"ã\„ ÿþ§õõLëûÅâèØsÏóÅãÓ½ N´Â÷¬ß¤¥|†ž«"˜s,’Ü[óÆCÓƒ‰Ê“S€e€€e“+ƒ‰†Cƒ‰¾èóy’ÛÓ˜r”žªz¥~£¬Þß´Â&½qÅâí϶Ør%âíëúÆõôJ¤ ÿ…â`',0ýR:oBßòK=FS •Zƒ¯aUgm#Ìr 3vBZy¼D|vH~l¸šðÿÿšø~lÊ|vay¼fv@ür em$g@aUVZ(S èK=žBàO:Ñ0ú'”âÊñ lÿþõô·ëû2âWØrÏiÅãN½Ï´Â~¬ß2¥~ðžªÁ˜rÔ’Ü ó«‰¿†C¥ƒ‰§“<€e €€e“Bƒ‰°†C±‰½™ó½’Ü!˜r랪ۥ|9¬ßP´ÂŸ½ñÅãrÏØr³â~ëûYõôßÿþ9 ”âò'º0ú*:ôBàqK=¾S!ZEaUpgXm$r wvA y¼r|vj~lКûÿÿšì~l²|v>y¼8vBKr !m#·gŒéaTõZƒ“S wK=%BßÏ:K0ý,'â9] ×|õô"ëúžâÆØqþÏ‘ÅâɽO´Â¬ÞÀ¥~†žª_˜r|’Û¾óg‰¾Ø†Cwƒ‰„“$€dÿ€€e“Yƒ‰Ó†Cà‰½Òô’Üp˜sCž«<¥|¢¬ß´Ã½ pÅã÷ÏØsAâëûíõõtÿþÏ )¬ߟ'ŽI0ú´:zBàñK:ûS!yZ®aUÑg°m"Rr »vADy¼ |v~lG›ÿÿšá~l›|w y¼ vBr Ým#igŽëaT”Zƒ)S K<¬Bâ¹:Æ0ü¢'Œxᨽ Bæõóëú â ØqpÏÅâD½дÄɬÞO¥~ž©þ˜r$’݇ó#‰¾Ÿ†CIƒ‰a“­€dó€€e%“qƒ‰†D‰¾ ôE’ܾ˜qAž«¥} ¬à4´Ã½‡Åä|Ï£ØsÏâ¡ëøõö ÿÿd ¾@à0'Ž×0û>:ÿBápK;tS!êZ‚aV2gŽm" r ÿvA~y¼Ï|v°~l^›ÿÿšÕ~lƒ|vçy»ÛvAØr ™m#gŽ“aT3Z‚¿S"žK<3Bâ::A0ü'¸á) ­Qõöõëùwâ‡ØpâÏ}ÅåO½P´ÄP¬ÝÝ¥}³ž¬6˜qÌ’Ý9ò߉¾f†DWƒ‰>“–€d瀀dᓈƒ‰*†D<‰¾Dò¸’Ý ˜q™ž«þ¥}v¬Ý›´Ä ½ÅåÏ-Øpâ2ëù!õöžÿÿú VÓàÂ'e0ûÈ:ôBáïK;íS"\Z‚‚aSúgŽ`m"îr CvA·y»À|vÓ~lv›ÿÿ›~ll|vÅy»­vAŸr &m"ÍgŽ;aSÒZ‚VS",K;ºBáº:¼0ûŽ')à…• ÿÿ»õö`ëøãâöØpTÏóÅäʽÑ´Ã׬Ýk¥}Iž«Õ˜qt’Üëò›‰¾-†D)ƒ‰“~€e,€€dì“ ƒ‰M†C.‰¾~òü’ÝZ˜qñž©Æ¥}ß¬Þ ´Ä‚½†ÅáöÏ·ØqâÄëù´õó6 ëgáS'Œ%0üR:yBâoKBà»:B0úz'Ž ãFn êÿþõõ6ëû¯âÓØsÏßÅãÀ½ ;´Âå¬ß“¥|vž«˜s’ÜOó䉽º†C̃‰Å“P€e€€e“.ƒ‰“†CЉ¾ðóƒ’Ûߘr¡žªˆ¥~³¬Þð´Â8½„ÅãÏËØr:âëúÜõô`º ›âv'A0ýf:ƒBàK=XS ¦Zƒ¿aUg m#Ør =vBby¼K|vM~l¼šñÿÿšö~lÆ|v\y¼_v@ór [m#úg3aUGZS ×K=ŒBà<:½0ùð'âµÛ Uûõô¡ëûâBØrwÏÅã:½¼´Âl¬ß!¥~àžª²˜rÇ’Ü󡉿 †Cžƒ‰¢“8€e €€e“Fƒ‰¶†C¸‰½¡óÇ’Ü-˜rùžªé¥|H¬ßa´Â±½ Åã†Ï£ØrÈâ”ëûoõôõÿþP ª.ã'Ð0ú>:Bà„K=ÐS!ZTaU~gem$&r vAy¼y|vp~lÓšýÿÿšë~l¯|v9y¼1vBBr m#¬gŒÛaTæZƒƒS fK=Bß¼:80ý'Œñâ#G Àfõô ëúˆâ°ØqéÏ}Åâµ½<´Áó¬Þ¯¥~wžªQ˜ro’Û³ó]‰¾Ð†Cpƒ‰“!€dý€€e“]ƒ‰Ø†C扽Ûô ’Ü{˜p÷ž«J¥|²¬ßÓ´Ã)½Åä Ï-ØsVâ%ëøõõŠÿþå ?Âßµ'Ž^0úÈ:BáK; S!ŠZ¾aUàg½m"]r ÅvAMy¼§|v“~lK› ÿÿšß~l—|wy¼vB r Óm#^gŽÞaT…ZƒSôK<šBâ¦:²0üŽ'Œcá’§ +Ðõówëùôâ Øq[ÏóÅâ0½½´Ä·¬Þ>¥~ ž©ð˜r’Ý|󉾖†CBƒ‰\“ª€dñ€€e'“tƒ‰ †D‰¾ôO’ÜɘqNž««¥}¬àE´Ã¢½šÅäÏ·Øsäâ·ëø£õöÿÿ{ ÔVàF'Žì0ûR:BáƒK;†S!ûZ‚(aVAgŽm"«r vA†y¼Õ|vµ~lb›ÿÿ›#~l€|vây»ÔvAÐr `m#gކaT$Z‚¯S"K¬ÝÌ¥}£ž¬(˜q¿’Ý.òÕ‰¾]†DPƒ‰9“’€d怀dⓌƒ‰/†DC‰¾Mò’ݘq¦ž¬ ¥}…¬Ý¬´Ä½ÅåÏAØp¥âHëù7õö´ léà×'z0ûÜ:BâK;ÿS"mZ‚‘aT gŽmm"ùr MvA¿y»Ç|vØ~ly› ÿÿ›~li|v¿y»¦vA–r m"ÂgŽ.aSÃZ‚FS"K;¨Bá§:¨0ûz'ào ÿÿ¥õöIëøÍâàØp?ÏÞÅä¶½¾´ÃŬàe¥}:ž«Ç˜qg’Üßôb‰¾$†D"ƒ‰“{€e*€€dî“£ƒ‰R†C5‰¾†ó’Ýf˜qþž©Ô¥}ï¬Þ´Ä”½™Åâ ÏËØq3âÙëùÊõóL¦ }ái'Œ:0üg:Bâ‚K´ÃL¬ßó¥|О«f˜q’Ü‘ô‰½ë†Côƒˆó“d€e€€dú“»ƒ‰u†Cc‰¾¿óJ’Ý´˜rVžª5¥~Y¬Þ´Å ½ÅâÏVØqÁâ‡ëú^õóá; –áú'ŒÈ0üñ:BߘK<ñS FZƒeaTËgŒÃm#–r vB2y¼$|v/~l¨šçÿÿ›~lÚ|vzy¼†vA$r •m$Åâ·ÏØqëâ²ëúŠõôh ÃIâ%'Œó0ý:9Bß¾K=S gZƒ„aTègŒÝm#­r vBCy¼1|v9~l¯šëÿÿšý~lÓ|voy¼xvAr €m$%gdaU}ZSS!K=ÏBà‚:0ú<'Îã, ¨ÿþNõôóëûmâ’ØrÆÏ¡Åㄽ ´Â¯¬ß`¥|Gžªè˜r÷’Ü,󯉽¡†C¸ƒ‰µ“E€e€€e “9ƒ‰¢†CŸ‰¿ ó¢’ܘrÈžª³¥~â¬ß#´Ân½½Åã<Ï ØryâDëûõô£ý XÝâ·'0ùò:¿Bà>K=ŽS ÙZaUIg5m#ûr \v@ôy¼`|v\~lÆšöÿÿšñ~l¼|vLy¼JvBbr S!KZ„aUªgŒm$Ir  vA-y¼Ž|v~lÞ›ÿÿšå~l¤|v)y¼vB(r ùm#‰gŒ´aT»ZƒTS 3K<ÝBâí:ü0üÚ'Œ±áâø ~#õóÉëúFâ SØqªÏ?Åâz½´Äù¬Þ|¥~Hžª&˜rH’ݧó>‰¾¶†C[ƒ‰o“·€dø€€e!“gƒˆù†Cû‰½ôô)’Üž˜qž«v¥|á¬à´Ã`½SÅäGÏkØs–âfëøQõõÍÿÿ( ‚ßö'Ž0û:ÉBá=K;CS!¼ZíaV gäm"€r ãvAgy¼¼|v¢~lU›ÿÿšÚ~l|vöy»îvAïr µm#;g޶aTZZ‚êSÁKS!\Z“aU¸gšm$Ur ªvA6y¼•|v„~lá›ÿÿšä~l¡|wy¼vB r ïm#}gaT¬ZƒDS "K<ËBâÚ:è0üÆ'ŒœáÍâ h õó³ëú0â =Øq•Ï*Åâf½ð´Äç¬Þl¥~8žª˜r;’Ý›ó4‰¾®†CTƒ‰j“³€dö€€e"“kƒˆþ†D‰½ýô3’ܪ˜q+ž«„¥|ñ¬à´Ãr½fÅäZÏØs«â|ëøgõõãÿÿ> ˜à '޲0û:ÝBáOK;US!ÍZýaVgñm"Œr îvAoy¼Ã|v§~lX›ÿÿšØ~l‰|vðy»çvAçr «m#/gŽ©aTKZ‚ÚS°Kÿÿâõö†ëù âØpxÏÅäì½ñ´Ãö¬Ýˆ¥}dž«î˜q‹’Üÿò­‰¾;†D4ƒ‰$“„€d߀€d铚ƒ‰D†D^‰¾oòê’ÝF˜qÛž¬F¥}ĬÝï´Äc½eÅåeÏ”ØpùâŸëùõói ÅAá.'Œ0ü/:WBâNK$BàÜ:d0ú'Ž1ãk” ÿþ·õõ\ëûÕâøØs*ÏÅãá½ \´Ã¬ß°¥|‘ž«,˜s5’Ücóö‰½É†C؃‰Î“V€e€€e“(ƒ‰Š†C~‰¾áór’Û˘rŠžªo¥~˜¬ÞӴ½dÅâßϨØrâÞëú¶õô:” ïuâQ'0ýC:aBßäK=9S ‰Zƒ¤aUgŒ÷m#Är ,vBTy¼?|vD~l¶šîÿÿšù~lÌ|vey¼kvAr lm$gJaU`Z3S ôK=«Bà\:ß0ú'£âÚ {ÿþ!õôÇëûAâgØrœÏxÅã\½ܴ‹¬ß>¥|'žªË˜rÝ’Ü󲉽†Cªƒ‰«“>€e €€e “@ƒ‰­†C¬‰½“ó¶’ܘr➪Х|-¬ßD´Â’½ãÅãdÏ€Ør¤âoëûJõôÏÿþ* „ ââ'«0ú:æBàdK=²S ûZ9aUfgOm$r pvAy¼m|vg~lÍšúÿÿšî~lµ|vBy¼y¼›|vŠ~lE›ÿÿšâ~l|wy¼vBr äm#rgŽôaTžZƒ4S K<¹BâÇ:Ô0ü±'Œ‡á·Ì Qöõóëúâ (ØqÏÅâR½Ý´ÄÕ¬Þ[¥~(žª ˜r-’Ýó*‰¾¥†CMƒ‰e“°€dô€€e$“nƒ‰†D ‰¾ô>’ܵ˜q8ž«“¥}¬à(´Ã„½yÅänÏ”ØsÀâ’ëø}õõùÿÿU ®0à!'ŽÈ0û/:ñBábK;gS!ÞZ‚ aV(gþm"—r øvAxy¼Ê|v­~l\›ÿÿšÖ~l†|vëy»àvAÞr ¡m#$gŽœaT=Z‚ÊSŸK<@BâG:O0ü''‹ùá&9 ¼aõ÷ëù†â–ØpñÏŒÅå]½^´Ä]¬Ýé¥}¾ž¬A˜qÖ’ÝBò找l†D\ƒ‰B“˜€d退dß“†ƒ‰&†D7‰¾>ò°’ݘqž«ô¥}j¬Ý´Ãü½ùÅäóÏØp€â#ëùõöŽÿÿê FÃà²'V0û¹:åBáâK;àS"PZ‚waSðgŽVm"ær ¬Þr´Äî½÷ÅâmÏ2Øqâ Fëú8õó» pëáÕ'Œ¤0üÍ:ðBâáK<ÒS )ZƒJaT²gm#‚r òvB#y¼|v&~l¢šäÿÿ›~là|v‚y¼’vA3r ¦m$Pg•aU³ZS!UK>BàÉ:P0ú‰'ŽãV~ úÿþ õõEëû¿ââØsÏîÅãν I´Âò¬ßŸ¥|ž«˜s(’ÜWó쉽À†Cу‰È“R€e€€e“,ƒ‰†C…‰¾êó|’Ûטr—žª~¥~§¬Þä´Â+½wÅâóϼØr+âóëúÌõôPª ‹âf'20ýX:uBß÷K=KS šZƒ´aUgm#Ðr 6vB\y¼F|vI~l¹šðÿÿšø~lÉ|v`y¼dv@ùr bm$g=aURZ$S äK=™BàI:Ë0ùÿ'ŽâÄê eÿþ õô°ëû+âQØr‡ÏcÅãH½É´Ây¬ß-¥~잪¼˜rÐ’Ü ó¨‰¿†C£ƒ‰¥“;€e €€e“Cƒ‰²†C³‰½›óÀ’Ü%˜rߥ|=¬ßU´Â¤½öÅãxÏ”Ør¹â„ëû`õôåÿþ@ šâø'Á0ú0:úBàwK=ÄS! ZIaUtg\m$r zvAy¼t|vl~lÑšüÿÿšì~l±|v=y¼6vBHr m#´gŒåaTñZƒŽS rK= BßÊ:F0ý''â3W Ðuõôëú˜âÀØqøÏ‹ÅâýJ´Â¬Þ»¥~‚žª[˜rx’Û»ód‰¾Ö†Cuƒ‰ƒ“#€dþ€€e“Zƒ‰Õ†CችÕô’Üs˜sGž«@¥|§¬ßǴý vÅãýÏØsGâëøõõzÿþÕ /²ߥ'ŽO0úº:BàöK;S!}Z³aUÕg´m"Ur ¾vAGy¼¢|v~lH›ÿÿšà~lš|w y¼vBr Úm#fgŽçaTZƒ$S K<§Bâ´:Á0üœ'Œrᢶ ;àõó†ëúâ ØqjÏÅâ>½Ê´ÄìÞJ¥~ž©ú˜r ’Ý„ó ‰¾œ†CGƒ‰`“¬€dó€€e&“rƒ‰ †D‰¾ôH’ÜÁ˜qEž«¡¥}¬à9´Ã–½ŒÅä‚Ï©ØsÕâ§ëø“õöÿÿk ÄFà7'ŽÝ0ûD:BáuK;yS!ïZ‚aV6gŽ m"£r vA€y¼Ñ|v²~l_›ÿÿšÔ~l‚|væy»ÙvAÖr gm#gŽaT.Z‚»S"™K<.Bâ4:;0ü'²á# ¦JõöîëùpâØpÜÏwÅåI½K´ÄK¬ÝØ¥}¯ž¬2˜qÉ’Ý6ò܉¾c†DUƒ‰=“•€d瀀dᓉƒ‰,†D>‰¾Gò»’ݘqž¬¥}z¬Ý ´Ä½ ÅåÏ3Øp–â9ëù'õö¤ \ÙàÈ'k0ûÎ:ùBáõK;òS"aZ‚†aSþgŽcm"ñr FvA¹y»Â|vÕ~lw›ÿÿ›~lk|vÃy»«vAr #m"ÊgŽ7aSÍZ‚QS"(K;µBáµ:¶0ûˆ'#à ÿÿµõöYëøÝâïØpNÏíÅäĽË´ÃÒ¬Ýf¥}Ež«Ñ˜qq’Üèò˜‰¾*†D'ƒ‰“}€e,€€dí“¡ƒ‰N†C0‰¾€òþ’Ý]˜qõž©Ê¥}ä¬Þ´Ä‡½‹ÅáüϽØq$âÊëù»õó<– ñmáY'Œ+0üX:~BâtKBà¶:<0út'Žã@h äÿþŠõõ/ëû©âÍØsÏÙÅ㺽 6´Âà¬ßŽ¥|rž«˜s’ÜLó≽¸†Cʃ‰Ã“O€e€€e“/ƒ‰”†CŒ‰¾óó†’Ûâ˜r¤žªŒ¥~·¬Þõ´Â=½ŠÅãÏÑØr@â ëúâõôfÁ ¡â|'H0ýl:‰Bà K=]S «ZƒÃaU"gm#Ûr @vBey¼M|vN~l½šòÿÿšö~lÅ|vZy¼]v@ñr Xm#÷g0aUCZS ÓK=‡Bà6:·0ýœ'yâ¯Ô Oõõôšëûâ;ØrqÏÅã5½¶´Âg¬ß¥~Üžª®˜rÃ’Ûý󞉿†Cœƒ‰ “7€e€€e“Gƒ‰·†Cº‰½¤óÊ’Ü0˜rüžªí¥|M¬ßf´Â¶½ ÅãŒÏ©ØoâšëûvõøøÿþV ° (ß*'Ö0ýö:~BàŠK=ÖSZYaUƒgÃm"r „vBžy»?|vq~lÔš­ÿÿšê~l |w'y¼/v@¸r åm#¨gŒØaW{Zƒ~S aK9ÑBã :20ù`'¹âA ·_õôëöŽâ ŽØqãÏÅÅæ@½7´Áî¬áµ¥~ržªM˜p’ÝÆóZ‰½E†Dªƒ‰}“ €eM€€e“þƒˆë†C艿eò=’ܘsTž¨µ¥|·¬ßØ´Æk½ ÅäÏåØoŽâ+ëü õñ”ÿþì E ¼ß»'Žd0þ€:Bá K>OS„ZÃaUägm"ar ÈvB×y»m|v”~lìš¹ÿÿšÞ~kö|wy¼v@~r ¡m#ZgŒ€aWZƒSïK9XBâ¡:­0øÖ'*ጭ "ÊõópëýáâüØqUÏ;Å廽·´Áu¬áC¥~ ž©ì˜tm’Ýxó‰½ †D|ƒ‰[“ €eA€€e(’Õƒ‰†D‰¿žò’Ü͘s¬ž©¥} ¬àJ´Àk½ŸÅä–ÏoØpâ½ëüõò)ÿÿ ÚhàL'Žò0ÿ :ˆBáˆK>ÇSõZ‚,aVEg‹¿m"¯r vCy»›|v·~mšÅÿÿšÓ~m|váy»Òv@Er ]m# gŒ(aV¹Z‚«S~K?XBâ!:'0øL'œàû 4õòÛëýNâkØpÇϱÅå6½8´Àü¬àÒ¥}Ÿž©‹˜t’Ý*òÒ‰¼Ó†DNƒ‰8’ñ€e6€€e3’탉1†DE‰¿×òŒݘtž©w¥}Š¬à»´Àä½ÅåÏ•Øp«âNëý0õò¾ oüàÞ'€0ø0: BâK?@SgZ‚–aV¦gŒm"ýr Pv@:y»É|vÚ~mšÐÿÿšÇ~m|v¾y»¤vCr m"¾g‹ÐaVXZ‚AS K>ßBá¢:¢0ÿ&'ài† øÿÿŸõòFëüºâÚØp9Ï‹Åä°½¸´Àƒ¬à`¥}5ž©*˜s½’ÜÜòމ¿©†D ƒ‰’Ú€e*€€e?“ƒ‰T†Ds‰½ó ’Ýi˜t\ž©Ù¥}ô¬á-´Á]½žÅå ÏØq9âßëýÄõóS¬ áo'0øº:’Bâ‡K?¹SÙZƒaWgŒnm#Kr ”v@sy»÷|vý~kñšÜÿÿš»~lð|v›y»vvBãr Öm"pg,aU÷ZØSšK>gBá":0þœ'Ž€ߨ Ù cÿÿ õñ±ëü&âHØo«ÏÅä+½9´Æƒ¬ßî¥|Ëž¨É˜sf’ÜŽòJ‰¿p†Còƒˆò”€e€€eK“ƒ‰v†D¡‰½:óL’Ý·˜pžª:¥~]¬áŸ´Áֽſ%Ï©ØqÇâ qëöqõóèA ™#â'œ0ùE:BãK9¹S JZƒiaWhgŒÆm#™r ×v@¬y¼&|w ~l šèÿÿš¯~lÙ|vxy»HvB©r ’m""gÔaU–ZnS)K=îBà£:˜0þ'òßF E Îÿþtõñëû“â·ØoÏvÅ㦽º´Æ ¬ß}¥|bž­š˜s’Ü@ò‰¿7†CÈϓë€e€€d¶“3ƒ‰™†Dω½só’Þ˜pXžª›¥~ǬÛû´ÂO½Åæ«Ï3ØrUâ!ë÷õô}× 5·â’'‘+0ùÏ:Bã†K:2S ¼ZƒÓaR—gm#çrv@æy¼T|wB~l šôÿÿ›D~lÂ|vUy»vBpr Nm!Ôg|aU5ZS#ÌK=uBà#:0ý‡'dÞµ² 9ÿýÞõøëúÿâ&ØnŽÏìÅã!½:´Å‘¬ß ¥{øž­9˜r¶’Ûòñɾþ†C•ƒˆ¬“Ô€e€€dÁ“Jƒ‰¼†Dþ‰½¬óÔ’ÞS˜p°žªü¥1¬Üm´ÂȽ Åç0ϾØrãâ!”ë÷˜õõl ÊKã#'Š0úY:"BäK:«S!.Z„=aRøgvm$5r ½vAy¼‚|we~l8šÿÿÿ›9~lª|v2y½dvB7r m!†g%aTÔZ€šS#[K<üBߤ:®0üý'ŒÖÞ$ ¤ÿýIõ÷ìëúlâ”ØuœÏbÅ✽»´Å¬Þ™¥{Žž¬×˜r^’Û¤õ!‰¾Å†Cgƒˆ‰“½€dû€€dÍ“aƒ‰ß†B³‰½æô’Þ¡˜qž«]¥š¬ÜÞ´ÃA½ œÅà”ÏHØsqâ"%ëø,õõ§ _Þã´'Š«0úã:§Bä…K;$S!ŸZ„¦aSYgÎm$ƒr vAXy¼°|wˆ~lO› ÿÿ›-~l“|vy½6vAþr Æm%fgŽÍaTsZ€1S"éK<ƒBß$:)0üs'ŒGåZŠ ÿü³õ÷WëùØâØuÏØÅâ½" ´ÄŸ¬Þ(¥{%ž¬v˜r’ÛVô݉¾‹†C9ƒŠD“¥€ddÙ“yƒŠ†Bቾô\’ÚÁ˜q_ž«¾¥€¬ÝP´Ãº½!ÅáÏÒØtâïëø¿õö<— ôräF'‹90ûm:,BÞ2K;S"Z…aSºgŽ&m$Ñr EvA‘y¼Þ|uÍ~lf›ÿÿ›!~l{|uìy½vAÅr ‚m%gŽuaTZÇS"wK< BÞ¥:¤0ûé'‹¹äÉ÷ zÿüõöÂëùDârØt€ÏNÅᑽ!Ž´Ä&¬Ý¶¥z»ž¬˜q®’Ûô™‰¾R†C ƒŠ"“Ž€d d哃Š%†C‰¾Xô ’Û˜q·ž¬¥zƬÝÁ´Ä3½!›ÅáŸÏ\ØtŽâ€ëùSõöÑÿü- ‰ä×'‹Ç0û÷:±BÞ²K<S"ƒZÒaTgŽ~m%r ‰vAÊy½ |uð~l~›"ÿÿ›~ld|uÊy¼ÚvA‹r >m$ÊgŽaS°Z…S"K;‘BÞ&:0û_'‹+ä7c åˆõö-ëø±âàØsñÏÄÅá ½!´Ã®¬ÝE¥úž«´˜qV’ÚºôU‰¾†B܃‰ÿ“w€dØ€€d𓨃ŠH†C=‰¾‘ôä’Û]˜rž¬€¥{/¬Þ3´Ä«½"Åâ$ÏæØuâëùçõ÷fÿü ™åh'ŒV0ü:6Bß1Kg…m!Ür UvBvy»|vY~lÄ›Fÿÿšò~l|w?y¼Ov@àrm#ßgaRZƒÉS ±K:&Bãy:0ùÁ'‘⃨ &Èõônëööâ ôØrGÏ&Åæ½´ÂC¬Ûð¥~¼žª‘˜pO’Ýý󊉽m†D˃‰–“0€dµ€€e“҆Cȉ¿=ò ’ÜH˜sž¨q¥|l¬ßˆ´Æ½ÆÅã³Ï„Øo+âÅëû¢õñ+ÿþƒ Ý TßU'Ž0þ:¥Bà°K=úS4ZxaU gÝm"*r ˜vB¯y»L|v|~lÛš±ÿÿšç~l|wy¼!v@§r Ñm#‘gŒ¾aW^Zƒ_S ?K9­Bâú: 0ù7'Žáò ‹3õóÙëöbâ bØq¹ÏœÅæ½´Áʬᓥ~Sžª0˜o÷’ݯóF‰½4†Dƒ‰s“€eJ€€e”ƒˆõ†Cö‰¿vòQ’Ü–˜snž¨Ò¥|Ö¬ßú´Æ½FÅä8ÏØo¹âWëü5õñÀÿÿ r èßæ'ŽŽ0þ©:*Bá/K>sS¦ZâaVg5m"xr ÜvBèy»{|vž~lóš¼ÿÿšÛ~m/|vùy»óv@mr m#CgŒfaVýZ‚õSÍK?­Bâ{:…0ø­'áa öõóDëýµâÑØq+ÏÅ哽‘´ÁQ¬á"¥}鞩ϘtS’Ýaó‰¼û†Dnƒ‰P“€e>€€e+’܃‰†D$‰¿¯ò•’Üä˜sÆž©3¥}@¬àk´À½ÅÅä¾Ï˜ØpGâèëüÉõòUÿÿ® ”àx'0ÿ3:°Bá®K>ëSZ‚LaVbg‹Ùm"Ær vC"y»©|vÁ~m šÈÿÿšÏ~m|vÖy»Åv@4r Im"õgŒaVœZ‚‹S\K?4Báû:0ø#'ràÏí `õò¯ëý"â@ØpÏìÅå½´Àجథ}ž©n˜sû’Ýò¾‰¿Ò†D@ƒ‰-’ê€e2€€e7’ôƒ‰;†DS‰¼ÙòÙ’Ý2˜tž©”¥}©¬àÝ´Á½EÅåCϾØpÕâyëý\õòêC œ(á '«0øY:5Bâ.K?dS‰Z‚µaVÃgŒ1m#r dv@Ky»×|vä~m!šÔÿÿšÃ~m|v³y»–vC r m"§g‹¶aV;Z‚"SêK>»Bá|:{0þý'Žäà>Z ËÿÿrõòëüŽâ®ØpÏaÅ䉽’´À_¬à>¥}ž© ˜s£’ÜÅòz‰¿˜†Dƒ‰ ’Ó€e&€€eB“ ƒ‰^†D‰½ó’Ý€˜tvž©õ¥~¬áO´Á½ÄÅåÈÏHØqcâ ëö õóÙ 1¼áš'90øä:ºBâ­K9dSûZƒaW$gŒ‰m#br ¨v@„y¼|w~køšàÿÿš¸~lé|v‘y»hvBÒr Ám"YgaUÚZ¸SxK>BBàü:õ0þr'ŽVß­ ­ 6ÿþÝõñ…ëûûâØo€Ï×Åä½´Æ_¬ßÍ¥|¬ž¨¬˜sK’Üwò6‰¿_†C䃈ç“ü€e€€eN“"ƒ‰†D¯‰½Kóa’ÝΘpžªW¥~}¬áÀ´Áú½CÅæMÏÓØqñâ œëöõôn ÆOâ,'Ç0ùn:?Bã-K9ÝS lZƒ‰aW…gŒàm#°r ìv@½y¼3|w*~lšëÿÿš¬~lÒ|vny»:vB˜r }m" gºaUyZNS$K=ÊBà}:p0ýè'Èß  ¡ÿþGõøéëûgâŒØnòÏMÅã~½”´Åæ¬ß[¥|Bž­}˜rô’Ü)ñò‰¿&†C¶ƒˆÅ“ä€e€€d¹“:ƒ‰¤†D݉½„ó¤’Þ˜pržª¸¥~æ¬Ü´Âs½ÃÅæÒÏ]Ør€â!-ë÷1õô© aãâ½'‘U0ùø:ÄBã¬K:VS ÞZƒóaR´g8m#þr0v@÷y¼b|wM~l'š÷ÿÿ›A~l»|vKy» vB_r :m!½gbaUZ€åS#ªK=QBßý:ë0ý^'9ÞŠ† ÿý²õøTëúÓâúØndÏÃÅâù½´Åm¬Þé¥{Ùž­˜rœ’ÛÛõP‰¾í†C‡ƒˆ¢“Í€e€€dÅ“Qƒ‰Ç†B’‰½½óè’Þj˜pÊž«¥P¬ÜŽ´Âì½ BÅà7ÏçØsâ!¿ë÷Äõõ>™ öwãN'ŠG0ú‚:IBä,K:ÏS!PZ„\aSgm$Lr ÒvA0y¼|wp~l?›ÿÿ›5~l£|v(y½VvB&r öm!og aT·Z€{S#9K<ØBß~:‡0üÔ'Œ«Ýùò wÿýõ÷¿ëú@âiØurÏ9Åât½•´Äô¬Þx¥{ož¬»˜rD’ÛŒõ ‰¾´†CYƒˆ“¶€d÷€€dÑ“hƒ‰ê†BÁ‰½÷ô,’Þ¹˜q"ž«z¥º¬Ý´Ãe½ ÂÅà¼ÏqØsœâ"PëøXõõÓ. ‹ ãà'ŠÕ0û :ÏBÝÙK;HS!ÁZ„ÆaSvgèm$›r vAiy¼¾|uµ~lV›ÿÿ›)~lŒ|vy½(vAír ²m%Ng޲aTVZ€S"ÇK<_BÞÿ:0üJ'Œå/^ âÿü‡õ÷*ëù¬âØØtãϯÅáï½!ç´Ä{¬Þ¥{ž¬Y˜qì’Û>ôɉ¾z†C+ƒŠ:“ž€d쀀dÜ“€ƒŠ †B0ôp’ÚÙ˜qyž«Û¥€$¬Ýr´ÃÞ½!AÅáAÏûØt*âëøëõöhÄ žäq'‹d0û–:TBÞXK;ÁS"3Z…0aS×gŽ@m$ér YvA¢y¼ì|u×~lm›ÿÿ›~lu|uây¼úvA´r nm%gŽ[aSõZ¨S"UK;æBÞ:|0ûÀ'‹äË Mñõö•ëùâFØtUÏ%Åáj½!h´Ä¬Ý”¥€Dž«ø˜q”’Úðô…‰¾A†BýƒŠ“‡€dà€€dè“—ƒŠ/†C‰¾iô´’Û'˜qÑž¬<¥zå¬Ýã´ÄW½!ÁÅáÆÏ…Øt¸â«ëùõöýÿüY µ1å'‹ò0ü :ÙBÞØK<:S"¥ZñaT8gŽ˜m%7r vAÛy½|uú~l…›&ÿÿ›~l]|u¿y¼ÌvAzr *m$²gŽaS”Z„æS!äK;mBÞ:÷0û6'‹ä 7 ¸\õöëø…âµØsÇÏ›Åàä½ é´ÃЬÝ#¥Úž«—˜q<’Ú¢ôA‰¾†Bσ‰ô“p€dÔ€€dô“¯ƒˆt†CK‰¾¢ôø’Ûu˜r)ž¬¥{O¬ÞU´ÄϽnÅâKÏØuFâ=ëúõ÷’ÿüï JÅÝÌ'Œ€0üª:^BßWK<³S#Z€[aT™gŽðm!Wr ávBy½H|v~lœ›2ÿÿ›~lF|wzy¼žvAAr æm$dg«aS2Z„|S!rK:ôBäR:r0ú¬'Šsã{£ #Æõõkë÷ñâ!ëØs9ÏÅà_½ i´Ã¬Ü±¥pž«6˜pä’Þ‚óý‰½Ï†B¡ƒ‰Ñ“X€dÉ€€e“ƃˆ—†Cy‰¾Ûõ<’ÛØrž¬þ¥{¸¬ÞÇ´ÅH½íÅâÑÏ™ØuÔâÎëú¦õø'ÿý„ ßYÞ^'0ý4:ãBß×K=,S#ˆZ€ÅaTúgGm!¥r %vBNyºþ|v@~l´›=ÿÿšû~l.|wWy¼pvArDm$gSaRÑZ„S!K:{BãÓ:í0ú"'‘€âé Ž1õôÖë÷^â!ZØr«Ï‡Åæû½ê´Â˜¬Ü?¥žªÕ˜p’Þ4󹉽–†D냉®“A€d½€€e “݃ˆº†C¨‰¿ñޒܘrÙž­_¥|"¬ß8´ÅÁ½mÅãVÏ#ØnÇâ_ëû:õø¼ÿþ tìÞï'œ0ý¾:HBàVK=¥S#ùZ.aU[gŸm!ór ivB‡y»,|vc~lË›Iÿÿšï~l|w5y¼Av@Ïrm#ÈgŒûaRpZƒ©S K:BãT:h0ù˜'òâX| ùœõôAëöÊâ ÈØrÏýÅæv½j´Â¬áã¥~žªt˜p5’Ýæóu‰½\†D½ƒ‰Œ“)€eR€€e“õƒˆÝ†CÖ‰¿Nò"’Ü_˜s1ž¨Ž¥|Œ¬ßª´Æ:½ìÅãÛÏ­ØoUâñëûÎõñWÿþ¯  €߀'Ž*0þH:ÍBàÖK>SVZ˜aU¼g÷m"Ar ­vBÀy»Z|v†~lâš´ÿÿšã~l|wy¼v@–r ¼m#zgŒ£aWAZƒ?S K9‰BâÔ:â0ù'dáÇé ^õó¬ëö6â 7ØqÏsÅåñ½ë´Á¦¬áq¥~3žª˜oݒݘó1‰½#†Dƒ‰i“€eF€€e#” ƒ‰†D‰¿‡òe’Ü­˜s‰ž¨ï¥|õ¬à´À:½lÅä`Ï7Øoãâ‚ëüaõñìÿÿE ž-à'޹0þÓ:RBáUK>—SÇZ‚aVg‹›m"r ðvBùy»ˆ|v©~lúšÀÿÿš×~m)|vïy»åv@\r ym#,gŒKaVàZ‚ÖS¬K?‰BâU:]0ø„'Öá5U Éqõóëý‰â¦ØqÏèÅåk½k´Á-¬á¥}Êž©²˜t9’ÝJòê†Daƒ‰F’û€e:€€e.’ド#†D2‰¿Àò©’Üû˜sàž©P¥}_¬à´À³½ëÅäåÏÂØpqâëüõõòÿÿÚ 3Àà£'G0ÿ]:×BáÔK?S9Z‚kaVg‹óm"Ýr 4vC3y»·|vÌ~mšÌÿÿšÌ~m|vÌy»·vC3r 5m"Þg‹ôaVZ‚lS:K?BáÕ:Ø0ÿ^'Hà¤Á 4ÿÿÛõò‚ëüöâØprÏÂÅäæ½ì´À´¬àŽ¥}`ž©Q˜sá’Üüòª‰¿Á†D2ƒ‰#’ã€e/€€e:’ûƒ‰E†D`‰¼êòí’ÝI˜t8ž©±¥}ɬàÿ´Á,½kÅåjÏèØpÿâ¥ëýˆõóp ÈTá4'Õ0øƒ:\BâTK?ˆS«Z‚ÕaVàgŒKm#+r xv@\y»å|vï~m(š×ÿÿšÀ~lú|v©y»‰vBúr ñm"g‹œaVZ‚SÈK>—BáV:S0þÓ'޹à. ŸÿÿFõñíëübâƒØoäÏ8Åäa½l´À;¬à¥|öž¨ð˜s‰’Ü®òf‰¿‡†Dƒ‰” €e#€€eF“ƒ‰h†Dމ½#ó1’Ý—˜oÜžª¥~3¬áq´Á¥½êÅåðÏrØqŽâ 6ëö5õó« ]èáÆ'c0ù :âBâÓK9ˆS Zƒ?aWAgŒ£m#yr ¼v@•y¼|w~kÿšãÿÿš´~lâ|v†y»ZvBÁr ­m"BgøaU½Z™SWK>BàÖ:Î0þI'Ž+ß ÿþ°õñXëûÏâòØoVÏ®Åãܽí´Æ;¬ß«¥|Œž¨˜s1’Ü`ò"‰¿N†CÖƒˆÝ“õ€e€€eR“)ƒ‰‹†D½‰½\óu’Ýå˜p4žªs¥~œ¬áâ´Â½iÅæuÏüØrâ ÇëöÉõô@› ø{âW'ñ0ù—:gBãSK:S ŽZƒ¨aRpgŒûm#Èrv@Îy¼A|w4~lšïÿÿ›I~lË|vcy»,vB‡r im!óg aU\Z/S#úK=¦BàW:I0ý¿'Þðí uÿþõø½ëû;â`ØnÈÏ$ÅãW½n´Å¬ß9¥|#ž­`˜rÙ’ÜñÞ‰¿†C¨ƒˆº“Þ€e €€d½“Aƒ‰®†D뉽•ó¹’Þ4˜pŒžªÕ¥¬Ü?´Â—½éÅæúφØrªâ!Yë÷]õôÕ0 âè'‘0ú!:ìBãÒK:zS!Z„aRÑgSm$rDvAy¼o|wW~l.šúÿÿ›=~l´|v@yºþvBNr %m!¥gHaTûZ€ÅS#‰K=-Bß×:ä0ý5'Þ_Z àÿý…õø(ëú§âÏØuÕÏšÅâѽî´ÅI¬ÞÇ¥{¹ž¬ÿ˜r‚’ÛÃõ<‰¾Ü†Czƒˆ—“Æ€e€€dÈ“Xƒ‰Ñ†B ‰½Îóý’Þ‚˜päž«6¥p¬Ü°´Ã½ hÅà^ÏØs8â!êë÷ðõõjÅ "£ãz'Šr0ú«:qBäRK:óS!qZ„|aS2gªm$dr ævAAy¼|wz~lF›ÿÿ›2~lœ|vy½IvBr âm!WgŽðaTšZ€\S#K<´BßX:_0ü«'ŒÝÍÆ Kÿüðõ÷“ëúâ>ØuGÏÅâL½o´ÄЬÞV¥{Ož¬ž˜r*’Ûuôø‰¾£†CKƒˆt“¯€dô€€dÔ“oƒ‰ô†BΉ¾ô@’Ú¢˜q<ž«—¥Ù¬Ý"´Ã‰½ èÅàäÏšØsÆâ´ëø„õõÿ[ ·6ä '‹0û5:öBÝÿK;lS!ãZ„åaS“gŽm$²r *vAzy¼Ì|u¿~l]›ÿÿ›&~l…|uûy½vAÜr žm%7gŽ˜aT9ZòS"¥K<;BÞÙ:Ú0ü!'‹óå2 ¶ÿüZõöþëù€â¬Øt¹Ï†Åáǽ!Á´ÄW¬Ýä¥z枬=˜qÒ’Û'ô´‰¾i†CƒŠ0“—€d耀dà“‡ƒŠ†Bý‰¾Aô„’Úð˜q”ž«ø¥€C¬Ý”´Ä½!gÅáiÏ$ØtTâEëùõö”ð LÊäœ'‹Ž0û¿:{BÞ~K;åS"UZ§aSôgŽZm%r nvA³y¼ú|uâ~lt›ÿÿ›~ln|uØy¼ìvA£r Zm$égŽ@aSØZ…0S"4K;ÂBÞY:U0û—'‹eärŸ !ÅõöiëøìâØt+ÏüÅáB½!B´ÃÞ¬Ýr¥€$ž«Û˜qz’ÚÙôq‰¾0†B “€€dÜ€€d쓞ƒŠ:†C+‰¾zôÈ’Û>˜q랬Y¥{¬Þ´Ä{½!çÅáîÏ®Øtãâ×ëù«õ÷)ÿü† á]å.'Œ0üI:BÞþK<^S"ÆZ€aTUg޲m%Nr ±vAìy½(|v~lŒ›)ÿÿ›~lV|uµy¼¾vAir m$›géaSwZ„ÇS!ÂK;IBÝÚ:Ð0û 'ŠÖãá Œ/õõÔëøYâ"QØsÏrÅཽ ôÃf¬Ý¥»ž«z˜q"’Þ¹ô-‰½÷†BÁƒ‰ê“i€dÑ€€d÷“¶ƒˆ†CY‰¾³õ ’ÛŒ˜rCž¬º¥{n¬Þw´Äô½”ÅâsÏ8Øuqâhëú?õ÷¾ÿý wñÝø'Œª0üÓ:†Bß}K<×S#8Z€zaT¶g m!nr õvB&y½V|v(~l£›5ÿÿ›~l?|wpy¼vA0r Òm$Mg‘aSZ„]S!PK:ÐBä,:J0úƒ'ŠHãOx ÷šõõ?ë÷Åâ!ÀØsÏèÅà8½ C´Âí¬Ü¥Qž«˜pÊ’Þkó鉽¾†B“ƒ‰Ç“Q€dÅ€€e“̓ˆ¡†C‡‰¾ìõP’ÛÚ˜r›ž­¥{جÞé´Ål½ÅâøÏÂØncâùëúÒõøSÿý± …Þ‰'80ý]:êBßýK=PS#ªZ€äaUgbm!¼r 9vB_y» |vK~lº›Aÿÿš÷~l'|wMy¼bv@÷r0m#ÿg9aR´ZƒóS ßK:WBã­:Å0ùù'‘Vâ¾ä bõôªë÷2â!.Ør€Ï^ſӽĴÂt¬Ü¥~瞪¸˜pr’Þ󥉽…†D݃‰¤“:€d¹€€e“䃈ĆCµ‰¿&ñò’Ü(˜róž­|¥|B¬ßZ´Å当Åã}ÏLØnñâ‹ëûfõøèÿþF ¡ ß'Ç0ýè:oBà|K=ÉS$ZNaUxg¹m" r }vB˜y»:|vm~lÒš¬ÿÿšë~l|w*y¼4v@¾r ìm#±gŒáaW…ZƒŠS mK9ÞBã.:@0ùo'Èâ-P Çoõôëöžâ ØqòÏÓÅæN½D´Áû¬áÁ¥~}žªW˜p’ÝÏóa‰½K†D¯ƒ‰“"€eN€€e“üƒˆç†C㉿_ò6’Üv˜sKž¨«¥|«¬ßÌ´Æ^½ÅäÏרoâëûúõñ„ÿþÜ 6 ¬߬'ŽU0þr:õBàûK>BSxZ·aUÙgm"Xr ÁvBÑy»h|v~l隸ÿÿšà~kù|wy¼v@…r ¨m#cgŒ‰aW$Zƒ SûK9eBâ®:»0øä':᛽ 2Úõó€ëö â ØqdÏIÅåɽÅ´Á‚¬áO¥~ž©ö˜tw’Ý󉽆Dƒ‰^“ €eC€€e&’Óƒ‰ †D‰¿˜òz’ÜĘs£ž© ¥}¬à=´À^½’ÅäˆÏaØp â­ëüõòÿÿq ËYà='Žã0þü:zBá{K>»SéZ‚!aV:g‹µm"¦r vC y»–|v³~mšÃÿÿšÔ~m"|väy»×v@Kr dm#gŒ1aVÃZ‚¶SŠK?eBâ/:60øZ'«á ) Dõòëëý]âzØpÖÏ¿ÅåD½E´Á ¬àÞ¥}ªž©•˜t’Ý3òÙ‰¼Ù†DSƒ‰;’ô€e7€€e2’ꃉ-†D@‰¿Ñò¾’ݘsûž©m¥}¬à¯´À×½Åå ÏëØpœâ?ëý!õò® `ìàÎ'q0ø":ÿBáúK?4S[Z‚‹aVœgŒ m"õr Iv@4y»Ä|vÖ~mšÏÿÿšÈ~m |vÂy»©vC"r !m"Æg‹ÙaVbZ‚LSK>ìBá¯:°0ÿ4'ày• ÿÿ¯õòVëüÊâéØpHÏ™Å侽ƴÀ¬àl¥}@ž©4˜sÇ’Üäò–‰¿°†D%ƒ‰’Ü€e+€€e>“ƒ‰P†Dn‰¼ûó’Ýa˜tRž©Î¥}è¬á!´ÁP½Åå’ÏØq*âÐëý´õóCœ õ€á`'ÿ0ø¬:„BâzK?¬SÍZ‚ôaVýgŒem#Cr Œv@my»ò|vù~m/šÛÿÿš¼~ló|vŸy»{vBér Ým"xg5aVZãS¦K>sBá0:+0þª'Žßç é sÿÿõñÁëü6âXØoºÏÅä9½F´Æ¬ßû¥|מ¨Ó˜so’Ü–òR‰¿v†Cöƒˆö”€e€€eI“ƒ‰s†Dœ‰½4óE’ݯ˜o÷žª/¥~R¬á’´ÁɽÅæÏ›Øq¸â aëöaõóØ2 Šáñ'0ù6: BâùK9­S >Zƒ^aW^gŒ½m#‘r Ðv@¦y¼!|w~lšçÿÿš±~lÛ|v|y»MvB°r ™m"*gÞaU ZyS5K=úBà°:¦0þ 'ŽßV U Þÿþ„õñ,ëû£âÆØo,Ï…Å㴽ǴƬ߉¥|mž¨r˜s’ÜHò‰¿=†CȃˆÓ“î€e€€dµ“0ƒ‰–†Dʉ½mó‰’Ýý˜pNžª¥~¼¬Ûï´ÂB½ÅæÏ%ØrFâ óëöõõômÇ %§â‚'‘0ùÀ:ŽBãyK:%S °ZƒÈaRgm#ßrv@ßy¼O|w?~lšòÿÿ›F~lÄ|vYy»vBvr Um!Üg†aU?ZS#ØK=‚Bà1:!0ý–'sÞÅÁ Iÿýîõø‘ëûâ5ØnÏûÅã/½H´Åž¬ß¥|ž­C˜r¿’Ûúñʉ¿†Cšƒˆ°“×€e€€dÀ“Hƒ‰¹†Dù‰½¦óÍ’ÞK˜p¦žªñ¥%¬Ü`´Â»½ Åç"ϯØrÔâ!„ë÷‰õõ] º;ã'‘ª0úJ:BãøK:žS!"Z„2aRîgmm$-r ¶vAy¼}|wb~l5šþÿÿ›:~l­|v6y½ivB=r m!Žg.aTÞZ€¦S#gK= Bß±:½0ý 'ŒåÞ3. ´ÿýYõ÷üëú{â¤Øu«ÏqÅ⪽È´Å%¬Þ¦¥{šž¬â˜rg’Û¬õ(‰¾Ë†Clƒˆ“¿€dü€€dÌ“_ƒ‰Û†B®‰½ßô’Þ™˜pþž«S¥¬ÜÒ´Ã4½ ŽÅà†Ï9Øsbâ"ëøõõ—ò OÏã¥'Šœ0úÔ:™BäxK;S!“Z„›aSOgÅm${r úvARy¼«|w…~lM› ÿÿ›.~l•|vy½;vBr Ím!@gŽÖaT}Z€ƒŠH“¨€dð€€dØ“vƒ‰þ†B܉¾ôU’Ú¹˜qVž«´¥ù¬ÝD´Ã­½!Åá ÏÃØsñâßëø°õö,‡ äbä6'‹*0û^:BÞ%K;S"Z…aS°gŽm$Ér >vA‹y¼Ù|uÉ~ld›ÿÿ›"~l~|uðy½ vAËr ‰m% gŽ~aTZÒS"ƒK<BÞ³:²0ûø'‹ÈäØ Šÿü.õöÒëùTâØtÏ]Å៽!œ´Ä3¬ÝÂ¥zÆž¬ ˜q¸’Ûô ‰¾X†CƒŠ%“€d倀d㓎ƒŠ!†C ‰¾Rô™’Û˜q®ž¬¥zº¬Ýµ´Ä&½!ÅáÏMØtâqëùCõöÁÿü yöäÈ'‹¸0ûè:£BÞ¤K< S"wZÆaTgŽtm%r ‚vAÄy½|uì~l{›!ÿÿ›~lg|uÍy¼ßvA’r Fm$ÒgŽ&aS»Z…S"K;žBÞ3:-0ûn'‹:äGs õ˜õö=ëøÀâðØtÏÓÅá½!´Ãº¬ÝQ¥€ž«¿˜q`’ÚÂô\‰¾†B჊“y€dÙ€€dï“¥ƒŠD†C8‰¾‹ôÜ’ÛU˜rž¬v¥{$¬Þ'´ÄŸ½" ÅâÏרu âëù×õ÷Vÿü² ‰åY'ŒG0ür:(Bß$K<‚S"èZ€0aTrgŽÌm%er ÆvAýy½6|v~l“›-ÿÿ› ~lO|wˆy¼°vAXr m$„gÎaSZZ„§S! K;%Bä†:¨0úä'Ьãµß `õõ¨ëø-â"&ØsrÏIÅà•½ ´ÃA¬Üߥ›ž«]˜q’Þ¢ô‰½æ†B³ƒ‰ß“b€dÍ€€dû“½ƒˆ‰†Cg‰¾Äõ ’Û£˜r]ž¬×¥{Ž¬Þ™´Å½ºÅâ›ÏaØu›â“ëúkõ÷ëÿýH £Þ#'ŒÕ0üü:®BߣK<ûS#ZZ€šaTÓg$m!…r vB7y½d|v2~lª›9ÿÿšÿ~l8|wfy¼‚vAr ¾m$6gwaRùZ„=S!.K:¬Bä:#0úZ'Šã$L Ëmõõë÷™â!”ØräϾÅç1½ ´ÂɬÜm¥1žªü˜p°’ÞTóÕ‰½­†Dþƒ‰½“J€d€€e“Ôƒˆ¬†C•‰¾ýñÂ’Ûñ˜rµž­8¥{÷¬ß ´Å½9Åã ÏëØnâ%ëúþõø€ÿýÝ 8±Þ´'c0ý‡:Bà#K=tS#ÌZaU4g|m!Ór MvBpy»|vU~lÁ›Dÿÿšô~l |wCy¼Tv@ærm#ègaR˜ZƒÔS ½K:3Bã‡:0ùÏ'‘,⓸ 6Øõô~ë÷â!ØrVÏ4Åæ¬½ž´ÂP¬Ûü¥~Èžª›˜pX’Þ󑉽t†DЃ‰š“3€d¶€€e“냈φCÉ¿7ò’Ü?˜s ž­™¥|a¬ß|´Æ ½¹Åã¥ÏvØoâ¶ëû’õñÿþs Í DßF'ñ0þ:—Bà¢K=íS(ZmaU•gÔm"!r ‘vB©y»G|vx~lÙš¯ÿÿšè~l |w y¼&v@­r Øm#šgŒÇaWiZƒjS KK9ºBã:0ùE'â$ šBõóéëörâ rØqÈÏªÅæ&½´Á׬៥~^žª:˜p’Ý·óM‰½:†D¡ƒ‰w“€eK€€e”ƒˆò†Cñ‰¿pòJ’ÜŽ˜sež¨È¥|ˬßî´Æ‚½8Åä*ÏØoªâGëü&õñ°ÿÿ b Øß×'Ž0þ›:Bá!K>fSšZ×aUög+m"pr ÕvBây»v|v›~lðš»ÿÿšÜ~kò|výy»øv@tr ”m#KgŒoaWZƒSÙK?ºBâˆ:“0ø»'áp‘ ­õóTëýÅâàØq:Ï Å塽Ÿ´Á^¬á.¥}ôž©Ù˜t\’Ýió ‰½†Dsƒ‰T“€e?€€e*’Úƒ‰†D‰¿©òŽ’Üܘs½ž©)¥}4¬à_´À‚½¸Åä¯ÏŠØp8âÙëü¹õòEÿÿž ÷…àh' 0ÿ%:¡Bá¡K>ßS Z‚AaVWg‹Ðm"¾r vCy»¤|v¾~mšÇÿÿšÐ~m|vÚy»Év@:r Pm"ýgŒaV¦Z‚—ShK?ABâ :0ø1'àßý põò¿ëý1âOØp¬Ï–Åå½´Àå¬à¼¥}‹ž©x˜t’Ýòʼn¿Ø†DEƒ‰1’í€e3€€e5’ñƒ‰7†DN‰¼ÓòÒ’Ý*˜tž©Š¥}ž¬àÑ´Àû½7Åå5ϰØpÆâjëýMõòÚ3 Œàú'›0øK:'Bâ K?XS}Z‚ªaV¸gŒ'm# r ]v@Ey»Ò|vá~mšÓÿÿšÅ~m|v·y»›vCr m"¯g‹¿aVEZ‚-SöK>ÈBá‰:‰0ÿ 'ŽóàMi Ûÿÿ‚õò*ëüžâ¾ØpÏpÅä—½ ´Àl¬àJ¥}!ž©˜s­’ÜÍò‰¿ž†Dƒ‰’Õ€e(€€eA“ƒ‰Z†D|‰½ ó’Ýx˜tmž©ë¥~¬áC´Át½¶ÅåºÏ:ØqTâûëýàõóoÉ !¬á‹'*0øÕ:¬Bâ K9XSïZƒaWgŒm#Zr ¡v@~y¼|w~köšÞÿÿš¹~lì|v”y»mvBØr Èm"agaUäZÃS„K>OBá :0þ'Žeß¼ ½ Fÿþíõñ•ëü â,ØoÏæÅä½!´Æl¬ßÙ¥|·ž¨¶˜sU’Üò=‰¿e†C郈ë“þ€e€€eM“ ƒ‰}†Dª‰½EóY’ÝÆ˜pžªL¥~r¬á´´Áí½6Åæ?ÏÄØqââ ëöõô^ ¶@â'¸0ù_:1BãK9ÑS `Zƒ~aW{gŒ×m#¨r äv@·y¼.|w&~l šêÿÿš­~lÕ|vqy»?vBžr …m"gÃaUƒZZSK=ÖBàŠ:~0ý÷'×ß+ ) ±ÿþWõøùëûwâ›ØoÏ\Å㌽¡´Åó¬ßg¥|Nž­‡˜rý’Ü1ñú‰¿,†CºƒˆÈ“ç€e€€d¸“7ƒ‰ †D؉½~ó’Þ˜pižª­¥~ܴ۬Âf½µÅæÄÏNØrpâ!ë÷!õô™ô QÓâ®'‘F0ùé:¶BãŸK:IS ÒZƒçaRªg/m#ör(v@ñy¼]|wI~l%šöÿÿ›B~l½|vNy»vBer Am!ÅglaU"Z€ðS#¶K=]Bà :ù0ým'HÞ™• ÿýÂõødëúãâ ØnsÏÒÅã½"´Åz¬Þõ¥{äž­&˜r¥’Ûãñ¶‰¾ó†CŒƒˆ¥“Ѐe€€dÄ“Oƒ‰Ã†Bމ½·óá’Þb˜pÀž«¥E¬Ü‚´Âß½ 5Åà)ÏØØrÿâ!¯ë÷µõõ.‰ ægã?'Š80ús:;BäK:ÂS!DZ„QaS g‡m$Dr ÊvA*y¼‹|wl~l<›ÿÿ›6~l¦|v,y½[vB,r ým!wgaTÁZ€†S#EK<åBß‹:•0üã'ŒºÞ ‡ÿý,õ÷ÏëúOâxØuÏHÅ₽¢´Å¬Þ„¥{zž¬Å˜rM’Û•õ‰¾º†C^ƒˆƒ“¸€dù€€dÏ“fƒ‰æ†B¼‰½ñô%’Þ°˜qž«o¥¯¬Üô´ÃX½ ´Åà®ÏbØsâ"AëøHõõà {ûãÐ'ŠÆ0úý:ÁBäžK;;S!µZ„»aSlgßm$’r vAcy¼¹|u±~lT› ÿÿ›+~lŽ|v y½-vAór ¹m%Wg޼aT`Z€S"ÓKn òÿü—õ÷:ëù¼âçØtóϾÅáý½!õ´Äˆ¬Þ¥{ž¬d˜qõ’ÛGôЉ¾€†C0ƒŠ>“¡€d퀀dÛ“}ƒŠ †Bꉾ*ôi’ÚИqpž«Ñ¥€¬Ýf´Ãѽ!4Åá3ÏìØtâ ëøÜõöX´ Žäb'‹U0û‡:FBÞKK;´S"'Z…$aSÍgŽ7m$àr RvAœy¼ç|uÔ~lk›ÿÿ›~lw|uæy¼ÿvAºr um% gŽdaSÿZ³S"bK;óBÞ:Š0ûÏ'‹žä­Ú ]ÿüõö¥ëù(âVØtdÏ4Åáx½!v´Ä¬Ý ¥€Ož¬˜q’ÚùôŒ‰¾G†CƒŠ“‰€dကdç“•ƒŠ,†C‰¾cô­’Û˜qÈž¬2¥zÚ¬Ý×´ÄJ½!³Åá¸ÏvØt©âœëùoõöíÿüI ¥"äó'‹ã0ü:ËBÞÊK<-S"˜ZæaT.gŽŽm%.r –vAÕy½|u÷~l‚›%ÿÿ›~l`|uÃy¼ÑvA€r 1m$»gŽ aSžZ„ñS!ðK;zBÞ :0ûE'‹äG Èlõöëø”âÄØsÖϪÅàó½ ö´Ã–¬Ý/¥åž«¢˜qF’Ú«ôH‰¾†BÔƒ‰ø“r€dÕ€€d󓬃ŠO†CF‰¾œôñ’Ûl˜r ž¬“¥{D¬ÞI´Äý`Åâ=ÏØu7â-ëúõ÷‚ÿüß :µݽ'Œq0üœ:PBßJK<¦S# Z€PaTgŽæm!Nr ÚvBy½D|v~lš›0ÿÿ›~lH|w~y¼£vAGr ím$mg´aS=Z„ˆS!~K;Bä`:€0ú»'Š‚ãŠ³ 3Öõõ{ëøâ!úØsHÏÅàm½ w´Ã¬Ü½¥|ž«A˜pî’Þ‹ô‰½Õ†B¥ƒ‰Õ“[€dÊ€€dþ“È“†Ct‰¾Õõ4’Û»˜rxž¬ô¥{­¬Þ»´Å<½àÅâÂÏ‹ØuÅâ¿ëú—õøÿýt ÏIÞN'Œÿ0ý&:ÕBßÉK=S#|Z€¹aTðg>m!r vBHy½r|v<~l±›<ÿÿšü~l1|w[y¼tvArKm$g\aRÜZ„S! K:ˆBãà:û0ú0'‘âù žAõôæë÷mâ!iØrºÏ•Åç ½÷´Â¥¬ÜK¥žªß˜p–’Þ<óÀ‰½œ†Dðƒ‰²“C€d¾€€e “Ûƒˆ¶†C£‰¿ñ×’Ü ˜rО­U¥|¬ß,´Åµ½_ÅãHÏØn¸âPëû*õø¬ÿþ dÝÞà'0ý°::BàIK=˜S#íZ#aUQg–m!ër bvBy»'|v_~lÈ›Hÿÿšð~l|w8y¼Fv@Õrm#ÐgaR{Zƒ´S ›K:Bãa:v0ù¦'‘âgŒ  «õôQëöÚâ ØØr,Ï Åæ„½x´Â,¬ÛÚ¥~¨žª~˜p>’Ýîó|‰½b†Dƒ‰“,€eS€€e“òƒˆÙ†Cщ¿Hò’ÜW˜s'ž¨„¥|¬ßž´Æ-½ßÅãÍÏŸØoFâáëû¾õñHÿþŸ ù pßq'Ž0þ::¿BàÈK>SJZaU²gîm"9r ¥vBºy»U|v‚~làš³ÿÿšä~l|wy¼v@œr Äm#‚gŒ­aWLZƒKS )K9–Bââ:ñ0ù'sáÖø nõó¼ëöFâ FØqžÏÅåÿ½ø´Á³¬á}¥~>žª˜oæ’Ý ó9‰½)†D”ƒ‰l“€eG€€e"” ƒˆü†Cÿ‰¿ò^’Ü¥˜sž¨å¥|ê¬à´Æ¦½^ÅäRÏ)ØoÔâsëüRõñÝÿÿ5 Žà'Ž©0þÄ:DBáGK>ŠS»ZöaVg‹’m"‡r évBóy»ƒ|v¥~l÷š¿ÿÿšÙ~m+|vóy»êv@br €m#4gŒUaVëZ‚áS¸K?–Bâb:k0ø’'åáEe Ù€õó'ëý™âµØqÏ÷Ååy½y´Á:¬á ¥}Õž©¼˜tB’ÝRòõ‰¼ð†Deƒ‰I’ý€e<€€e-’჉†D-‰¿ºò¢’Üó˜sמ©F¥}T¬à´À¦½ÞÅä×ϳØpbâëüåõòrÿÿÊ #±à”'80ÿN:ÉBáÇK?S-Z‚`aVtg‹êm"Õr -vC,y»²|vÈ~mšÊÿÿšÍ~m|vÐy»¼v@)r ¤Bác:a0þâ'ŽÉà"= ¯ÿÿVõñýëürâ’ØoóÏGÅäo½z´ÀH¬à(¥}ž¨ú˜s’’ܶòm‰¿†D ƒ‰’΀e$€€eE“ƒ‰e†DЉ½ó*’ݘoÓžª¥~'¬áe´Á˜½ÜÅåâÏcØq~â 'ëö&õóœõ MØá¶'T0øþ:ÓBâÆK9|S Zƒ3aW6gŒ™m#qr µv@y¼|w~kýšâÿÿšµ~lå|vŠy»_vBÇr ´m"JgaUÇZ¤ScK>+Bàä:Ü0þX'Ž:ß‘ ‘ ÿþÀõñhëûÞâØoeϽÅãê½û´ÆH¬ß·¥|˜ž¨™˜s;’Ühò)‰¿T†CÛƒˆá“÷€e€€eP“'ƒ‰ˆ†D¸‰½Vón’Ýݘp+žªi¥~‘¬áִ½\ÅægÏíØr â ¸ëö¹õô1‹ âlâH'â0ùˆ:YBãEK9õS ‚ZƒaRegŒñm#¿r ùv@Èy¼<|w1~lšîÿÿ›J~lÎ|vgy»1vBr pm!üg©aUfZ:S$K=²Bàd:W0ýÎ'¬Þÿý …ÿþ+õøÍëûKâpØn×Ï3Åãe½{´ÅϬßE¥|.ž­j˜rã’Üñ剿†C­ƒˆ¾“à€e €€d¼“>ƒ‰ª†D扽ó²’Þ+˜pƒžªÊ¥~û¬Ü3´ÂнÛÅæìÏwØr›â!Ië÷MõôÆ ~ÿâÙ'‘p0ú:ÞBãÅK:nS ôZ„aRÆgIm$ r=vAy¼j|wT~l,šùÿÿ›?~l¶|vDy»vBTr -m!®gQaUZ€ÐS#•K=9Bßå:Ò0ýD'Þni ðÿý•õø8ëú·âÞØuäÏ©Åâà½ü´ÅV¬ÞÓ¥{Äž­ ˜r‹’ÛÌõC‰¾â†Cƒˆ›“É€e€€dÇ“Vƒ‰Í†B›‰½Èóõ’Þy˜pÛž«+¥d¬Ü¤´Ã½ [ÅàPÏØs)â!Ûë÷áõõ[¶ “ãj'Šc0úœ:cBäDK:æS!eZ„qaS(g¡m$[r ßvA;y¼™|wv~lC›ÿÿ›3~lŸ|v!y½NvBr ém!`gŽùaT¤Z€gS##K<ÁBßf:m0üº'ŒÝÝÖ [ÿýõ÷£ëú#âMØuVÏÅâZ½|´ÄݬÞb¥{[ž¬¨˜r3’Û~ôÿ‰¾©†CPƒˆx“±€dõ€€dÓ“mƒ‰ð†Bɉ¾ô9’ÞȘq2ž«Œ¥άÝ´Ã|½ ÚÅàÕÏ‹Øs·â¥ëøtõõðK ¨&ãü'Šñ0û&:èBÝñK;_S!×Z„ÚaS‰gùm$ªr "vAty¼Ç|u»~lZ›ÿÿ›'~l‡|uþy½vAâr ¥m%@gŽ¢aTCZýS"±KØrÏlÅæá½Ѵ€¬Ü*¥~òžªÃ˜p|’Þ%󬉽‹†D⃉¨“<€d»€€e“⃈Á†C°‰¿ ñë’Ü ˜rêž­r¥|6¬ßN´ÅÙ½…ÅãoÏ>Ønââ{ëûVõøÙÿþ6 ‘ ß '¸0ýÙ:aBàoK=¼S$ZBaUng°m"r vvB’y»5|vj~lÏ›Kÿÿší~l|w.y¼9v@Är óm#¹gŒêaWZƒ•S yK9ëBã;:N0ù}'×â<` ×õô%ëö®â ­ØrÏâÅæ\½R´Â¬áÍ¥~‰žªa˜p$’Ý×óh‰½Q†D´ƒ‰…“%€eP€€e“ùƒˆä†C߉¿Yò/’Ün˜sBž¨¡¥| ¬ßÀ´ÆQ½ÅãôÏÈØopâ ëûêõñtÿþÌ & œßœ'ŽF0þc:æBàîK>5SlZ¬aUÏgm"Pr ºvBËy»c|v~lçš¶ÿÿšá~kû|w y¼ v@‹r ¯m#kgŒ“aW/Zƒ+S K9rBâ¼:É0øó'Iá«Ì Béõóëöâ ØqsÏXÅå×½Ò´Á¬á\¥~žª˜o̒݉ó$‰½†D†ƒ‰b“€eD€€e%’Ѓ‰†D ‰¿’òr’ܼ˜s™ž©¥} ¬à1´ÀR½„ÅäzÏRØoþâžëü~õò ÿÿa »Ià.'ŽÔ0þí:lBámK>®SÝZ‚aV0g‹¬m"žr þvCy»‘|v°~lþšÂÿÿšÕ~m$|vèy»Üv@Qr lm#gŒ;aVÎZ‚ÁS–K?rBâ<:D0øi'»á9 ­TõòûëýmâŠØpåÏÎÅåR½S´Á¬àê¥}µž©Ÿ˜t(’Ý;òቼ߆DXƒ‰?’ö€e8€€e1’胉)†D;‰¿Ëò¶’Ý ˜sñž©c¥}s¬à£´ÀʽÅäÿÏÜØpâ/ëýõòžÿÿ÷ PÝà¿'b0ø:ñBáíK?'SOZ‚€aV‘gŒm"ìr Av@.y»¿|vÒ~mšÎÿÿšÉ~m |vÅy»®vC(r (m"Ïg‹ãaVmZ‚XS$K>ùBá½:¿0ÿC',àˆ¥ ÿÿ¾õòfëüÙâøØpWϨÅäͽÓ´À¬àx¥}Lž©>˜sÐ’Üíò‰¿¶†D*ƒ‰’߀e,€€e<’ÿƒ‰L†Di‰¼õòú’ÝX˜tIž©Ä¥}ݬá´ÁC½ƒÅå„ÏØqâÁëý¥õó3Œ åpáP'ð0ø:vBâlK? SÁZ‚éaVògŒ\m#:r …v@gy»î|võ~m-šÚÿÿš¾~lõ|v¢y»€vBïr äm"g‹‹aV ZîS²K>€Bá=:90þ¹'Žžß÷ ø ƒÿÿ)õñÑëüFâgØoÉÏÅäG½T´Æ¬à¥|➨ݘsx’ÜŸòY‰¿|†Cûƒˆù”€e!€€eH“ƒ‰o†D—‰½.ó>’ݦ˜o힪%¥~G¬á†´Á¼½Åæ ÏŒØq©â RëöRõóÈ" záâ'~0ù':ûBâìK9 S 2ZƒSaWSgŒ´m#ˆr Év@ y¼|w~lšåÿÿš²~lÞ|vy»RvB¶r  m"3gçaUªZ„SAK>Bà¾:´0þ/'Žße e îÿþ”õñ<ëû²âÖØo;Ï”Åã½Õ´Æ$¬ß•¥|xž¨|˜s ’ÜQò‰¿C†C̓ˆÖ“ð€e€€eT“.ƒ‰’†DƉ½gó‚’Ýô˜pEžª†¥~±¬Ûã´Â5½‚ÅæŽÏØr7â ãëöåõô]· ˜âs'‘ 0ù±:€BãkK:S ¤Zƒ½aR‚g m#×r v@Ùy¼J|w;~lšñÿÿ›G~lÇ|v]y»#vB|r \m!ägaUIZS#äK=ŽBà>:/0ý¥'‚ÞÔÑ Yÿýþõø ëûâDØn­Ï Åã=½U´Å«¬ß#¥|ž­M˜rÉ’Üñщ¿ †CŸƒˆ³“Ù€e €€d¿“Eƒ‰µ†Dô‰½ óÆ’ÞC˜pžªç¥¬ÜT´Â®½ ÅçÏ ØrÅâ!uë÷yõôòM ª+ã'‘›0ú;:BãëK:’S!Z„&aRãgcm$%r ¯vAy¼x|w^~l3šýÿÿ›;~l¯|v:y½nvBCr m!–g7aTèZ€±S#sK=Bß¿:Ë0ý'ŒôÞC= Ãÿýiõø ëú‹â³ØuºÏ€Å⸽Ö´Å2¬Þ²¥{¥ž¬ì˜rq’Û´õ/‰¾Ñ†Cqƒˆ‘“€dý€€dË“\ƒ‰Ø†B©‰½Ùô ’Þ‘˜põž«H¥„¬ÜÆ´Ã'½ ÅàxÏ*ØsSâ"ëø õõ‡â ?¿ã–'Š0úÅ:‹BäjK; S!‡Z„aSDg»m$sr óvALy¼¦|w~lJ›ÿÿ›/~l˜|vy½@vB r Ôm!HgŽßaT‡Z€GS#KõöáëùdâØtžÏkÅᮽ!©´Ä@¬ÝÎ¥zÑž¬*˜qÁ’Ûô§‰¾^†CƒŠ)““€d怀dâ“‹ƒŠ†C‰¾Lô‘’Úÿ˜q¤ž¬ ¥€W¬Ý©´Ä½!€Åá‚Ï?Øtpâaëù4õö±ÿü iæä¸'‹©0ûÚ:•BÞ—K;üS"kZ»aTgŽkm%r {vA¾y½|ué~ly› ÿÿ›~li|uÑy¼ãvA˜r Mm$ÚgŽ0aSÅZ…S"K;«BÞA:;0û|'‹IäV‚ ¨õöLëøÐâÿØtÏáÅá(½!*´ÃǬÝ]¥€ž«É˜qi’ÚÊôc‰¾%†B惊“{€dÚ€€dî“£ƒŠ@†C4‰¾…ôÕ’ÛM˜qüž¬k¥{¬Þ´Ä’½!ÿÅâÏÉØtþâóëùÇõ÷Fÿü£ þzåJ'Œ70üd:BßKg€aSZ„IS!;K:¹Bä:10úh'Š-ã3[ Ú}õõ"ë÷©â!¤ØróÏÍÅའ+´ÂÕ¬Üy¥=ž«˜p¹’Þ\ó܉½³†Eƒ‰À“M€dÀ€e“уˆ¨†C‰¾÷ñ»’Ûé˜r¬ž­.¥{ì¬Þþ´Å„½,ÅãÏÝØn~âëúïõøpÿýÍ (¡Þ¥'T0ýx:BàK=gS#¿Z€øaU*grm!Ër FvBjy»|vQ~l¿›Cÿÿšõ~l#|wFy¼Yv@ìr#m#ðg(aR¢ZƒßS ÉK:@Bã•:¬0ùÞ'‘;â¢È Eèõôë÷â!ØreÏCÅæº½«´Â\¬Ü¥~Óžª¦˜pb’Þ󘉽z†DÕƒ‰“5€d·€€e“郈ˆC¾‰¿1ñÿ’Ü7˜sž­¥|V¬ßp´Åý½«Åã—ÏgØo â§ëû‚õùÿþc ½ 5ß6'â0þ:‰Bà”K=àSZbaU‹gÊm"r ŠvB£y»C|vt~lÖš®ÿÿšé~l |w$y¼+v@³r ßm#¢gŒÐaWsZƒuS WK9ÇBã:&0ùT'¬â4 ªRõóøëö‚â Øq×Ï¹Åæ4½,´Áä¬á«¥~ižªE˜p ’ÝÀóT‰½@†D¦ƒ‰z“€eL€€e”ƒˆî†C쉿jòC’Ü…˜s\ž¨¾¥|À¬ßâ´Æu½+ÅäÏñØo›â8ëüõñ ÿþø R ÈßÇ'Žp0þŒ:BáK>YSZÌaUìg"m"gr ÎvBÜy»q|v—~lÿÿšÝ~kô|wy»ýv@zr ›m#TgŒxaWZƒ SæK?ÇBâ–:¡0øÊ'á  ½õócëýÕâðØqIÏ/Å寽¬´Ák¬á:¥}ÿž©ã˜tf’Ýr󉽆Dxƒ‰X“€e@€€e)’׃‰†D‰¿£ò‡’ÜÓ˜s´ž©¥})¬àS´Àv½ªÅä¡Ï{Øp)âÉëüªõò5ÿÿŽ çuàY'Žþ0ÿ:“Bá“K>ÒSÿZ‚5aVMg‹Æm"µr vCy»Ÿ|vº~mšÆÿÿšÒ~m|vÞy»Îv@@r Wm#gŒ aV±Z‚¢StK?NBâ:0ø@'àî €'õòÎëýAâ_Øp»Ï¥Åå*½-´Àò¬àÈ¥}–ž©‚˜t’Ý$ò̉¼Î†DJƒ‰5’ï€e5€€e4’4†DI‰¼ÍòË’Ý!˜t ž©€¥}“¬àÅ´Àî½)Åå'Ï¡Øp·â[ëý=õòÊ# | àê'Œ0ø<:BâK?KSqZ‚ŸaV®gŒm#r Vv@?y»Í|vÝ~mšÑÿÿšÆ~m|v»y» vCr m"¸g‹ÉaVPZ‚8SK>ÕBá—:—0ÿ'à]y ëÿÿ’õò9ëü­âÍØp-ÏÅ䥽­´Ày¬àV¥},ž©!˜s¶’ÜÕò‰‰¿¥†Dƒ‰’Ø€e)€€e@“ƒ‰W†Dw‰½ó’Ýp˜tcž©á¥}ý¬á7´Ág½©Åå¬Ï+ØqEâìëýÑõó_¹ œá{'0øÆ:žBâ’K?ÄSâZƒ aWgŒvm#Rr ™v@xy»û|w~kóšÝÿÿšº~lî|v˜y»rvBÞr Ðm"ig%aUïZÏS‘K>\Bá:0þ'ŽtßË Ì Vÿþüõñ¤ëüâ<ØožÏõÅä ½.´Æy¬ßå¥|ž¨À˜s^’܇òE‰¿k†Ce€€eL“ƒ‰y†D¥‰½?óR’ݾ˜pžªB¥~f¬á¨´Áà½(Åæ1ϵØqÓâ }ëö~õóôN ¦0â '©0ùP:#BãK9ÄS TZƒraWpgŒÎm# r Ýv@±y¼*|w#~l šéÿÿš®~l×|vuy»DvB¥r Œm"gÍaUŽZeSK=ãBà˜:0þ'æß: 9 Áÿþgõù ëû†â«ØoÏkÅ㛽¯´Æ¬ßs¥|Yž­‘˜s’Ü9ò‰¿2†C¿ƒˆÌ“é€e€€d·“5ƒ‰œ†DÓ‰½xó–’Þ ˜p_žª£¥~ЬÜ´ÂY½¨Åæ¶Ï?Øraâ!ë÷õô‰ä AÄâž'‘70ùÚ:¨Bã‘K:=S ÆZƒÜaRŸg&m#îr!v@êy¼X|wE~l"šõÿÿ›C~lÀ|vRy»vBkr Hm!ÍguaU,Z€ûS#ÃK=jBà:0ý|'XÞ©¥ ,ÿýÒõøtëúóâØn‚ÏáÅã½/´Å‡¬ß¥{ïž­0˜r®’Ûëñ½‰¾ù†C‘ƒˆ©“Ò€e€€d“Lƒ‰¿†E‰½±óÚ’ÞZ˜p·ž«¥:¬Üv´ÂÒ½ 'ÅàÏÉØrðâ! ë÷¥õõy ÖWã/'Š)0úe:-BäK:¶S!7Z„FaSg~m$S>ZaU¨gäm"0r žvB´y»P|v~lÝš²ÿÿšæ~l|wy¼v@¢r Ëm#‹gŒ¶aWVZƒVS 5K9£Bâï:ÿ0ù+'‚áå ~&õóÌëöVâ VØq­ÏÅæ ½´ÁÀ¬á‰¥~Jžª(˜oð’ݨó@‰½/†D™ƒ‰p“€eI€€e ”ƒˆø†Cú‰¿{òW’ܘsvž¨Û¥|߬à´Æš½QÅäDÏØoÅâcëüBõñÍÿÿ%  ôßó'Žš0þµ:6Bá:K>}S¯ZëaV g‹‰m"r âvBíy»|v¡~lõš½ÿÿšÚ~m-|vöy»ïv@ir ‡m#öS!Z‚UaVjg‹àm"Ír &vC&y»­|vÄ~m šÉÿÿšÎ~m|vÓy»Áv@/r Cm"îgŒaV”Z‚‚SRK?*Báð:ô0ø'fàÃá Tÿÿûõò¢ëýâ3ØpÏàÅå½´Àάথ}vž©e˜sô’Ý ò¸‰¿Í†D<ƒ‰*’è€e1€€e8’öƒ‰>†DV‰¼Þòß’Ý9˜t&ž©¥}²¬àç´Á½OÅåNÏÊØpáâ†ëýiõò÷P ©5á'·0øe:@Bâ9K?oS“Z‚¿aVËgŒ8m#r jv@Py»Û|vç~m#šÕÿÿšÂ~lÿ|v°y»’vCr ÿm" g‹®aV3Z‚SàK>±Báq:o0þñ'ŽØà1M ¿ÿÿeõò ëüâ¢ØpÏVÅä}½ˆ´ÀU¬à4¥} ž©˜sœ’ܾòt‰¿”†Dƒ‰’Ñ€e%€€eC“ ƒ‰a†D…‰½ó#’݇˜oÊž©þ¥~¬áX´Á‹½ÏÅåÓÏTØqoâ ëöõóŒå >Èá§'E0øï:ÅBâ¸K9oS Zƒ(aW,gŒm#ir ®v@‰y¼ |w ~kúšáÿÿš·~lç|vŽy»dvBÍr »m"Rg aUÒZ¯SoK>8Bàñ:ê0þg'ŽJß    *ÿþÐõñxëûîâØotÏÌÅãø½´ÆU¬ßÃ¥|£ž¨£˜sD’Üpò0‰¿Z†Càƒˆä“ú€e€€eO“$ƒ‰„†D³‰½Póf’ÝÕ˜p"žª_¥~†¬áʴ½NÅæYÏÞØqþâ ©ëöªõô!{ Ó\â8'Ó0ùy:KBã8K9èS vZƒ’aWgŒèm#·r ñv@Ây¼7|w-~lšìÿÿ›L~lÐ|vky»6vB“r xm"g³aUqZES$K=¿Bàr:e0ýÝ'»ß •ÿþ:õøÝëûZâØnæÏAÅãs½‰´ÅܬßQ¥|9ž­t˜rì’Ü"ñ퉿!†C²ƒˆÂ“â€e€€dº“<ƒ‰§†Dች‰óª’Þ#˜pyžªÀ¥~ð¬Ü&´Â}½ÎÅæÞÏhØrŒâ!:ë÷=õô¶ nðâÉ'‘a0ú:ÐBã·K:aS èZƒüaR¼g@m$r5v@ûy¼e|wP~l)šøÿÿ›@~l¹|vHy»vBZr 4m!¶g[aUZ€ÜS#¡K=FBßò:à0ýR'-Þ}y ÿý¥õøHëúÇâîØnXÏ·Åâî½ ´Åc¬Þà¥{О­˜r”’ÛÔõK‰¾è†CƒƒˆŸ“Ë€e€€dÆ“Sƒ‰Ê†B–‰½Âóî’Þq˜pÑž«!¥Y¬Ü˜´Âö½ MÅàBÏóØsâ!Ëë÷ÑõõK¦ ƒã['ŠT0úŽ:UBä7K:ÚS!YZ„eaSg˜m$Sr ×vA5y¼”|ws~lA›ÿÿ›4~l¡|v%y½SvB!r ðm!hgaT®Z€rS#/K<ÍBßs:{0üÈ'ŒŸÝìå kÿýõ÷³ëú3â]ØueÏ-Åâi½Š´Äê¬Þn¥{fž¬²˜r<’Û†õ‰¾¯†CUƒˆ|“´€dö€€dÒ“jƒ‰í†Bʼn½ûô2’Þ¿˜q)ž«‚¥Ã¬Ý ´Ão½ ÍÅàÇÏ}Øs¨â•ëødõõà; ˜ãì'Šâ0û:ÚBÝäK;SS!ËZ„ÏaS~gðm$¡r vAny¼Â|u¸~lX›ÿÿ›(~lŠ|vy½$vAèr ¬m%HgŽ«aTMZ€S"½K'Œå"R Öÿüzõ÷ëùŸâËØt×Ï£Åáã½!Ý´Äq¬Ýü¥züž¬Q˜qå’Û8ôɾu†C'ƒŠ7“œ€d뀀dÝ“‚ƒŠ†Bó‰¾5ôv’Úߘqž«ã¥€-¬Ý{´Ãè½!LÅáLÏØt6â'ëøøõöuÑ -ªä}'‹p0û¢:_BÞcK;ËS"=Z…9aSßgŽGm$ïr _vA§y¼ð|uÚ~lo›ÿÿ›~lr|ußy¼övA¯r hm$úgŽSaSìZ…GS"LK;ÜBÞt:q0û´'‹ƒä‘¾ Aåõö‰ëù â:ØtIÏÅá^½!]´Ãø¬Ý‹¥€;ž«ð˜q’Úêô‰¾<†BùƒŠ“…€d߀€dé“™ƒŠ2†C!‰¾nôº’Û-˜qÙž¬D¥zî¬Ýí´Äa½!ÌÅáÒÏ‘ØtÄâ¸ëùŒõ÷ ÿüf Â>å'‹þ0ü,:äBÞãKÿÿšú~l,|wUy¼lvAr>m$gLaRÉZ„ S ÷K:qBãÈ:á0ú'‘tâÝ ‚$õôÊë÷Qâ!MØrŸÏ{Åæï½ߴ¬Ü6¥~þžªÍ˜p…’Þ-󳉽‘†D烉«“?€d¼€€e “߃ˆ½†C«‰¿ñä’ܘràž­g¥|+¬ßB´Å̽xÅãaÏ/ØnÓâlëûGõøÉÿþ' ùÞû'¨0ýÊ:SBàaK=¯S$Z7aUdg§m!úr ovBŒy»0|vf~lÍ›Jÿÿšî~l|w2y¼=v@Êr ûm#ÁgŒôaRhZƒ S …K9øBãI:\0ùŒ'æâKp æõô5ëö½â ¼ØrÏñÅæj½_´Â¬áÙ¥~”žªl˜p-’Ýßóo‰½X†D¹ƒ‰‰“'€eQ€€e“÷ƒˆà†CÚ‰¿Sò'’Üf˜s8ž¨–¥|•¬ß´´ÆE½÷ÅãæÏ¹ØoaâýëûÚõñdÿþ¼  ß'Ž70þT:ØBààK>(S`Z¡aUÅgÿm"Hr ²vBÅy»^|v‰~läšµÿÿšâ~kþ|wy¼v@‘r ·m#sgŒœaW9Zƒ6S K9BâÉ:×0ù'XáºÜ Qùõó ëö*â +Øq‚ÏgÅåå½à´Á›¬áh¥~*žª ˜oÕ’Ý‘ó,‰½†D‹ƒ‰f“€eE€€e$”ƒ‰†D‰¿Œòk’Ü´˜sž¨ø¥|ÿ¬à%´ÀE½wÅälÏCØoïâëünõñùÿÿQ «9à'ŽÅ0þÞ:]Bá`K>¡SÑZ‚ aV&g‹£m"–r övBþy»Œ|v¬~lüšÁÿÿšÖ~m'|vìy»áv@Wr sm#%gŒDaVØZ‚ÍS¢K?BâJ:R0øx'Êá)H ¼dõó ëý}â™ØpôÏÝÅå`½`´Á#¬àö¥}Àž©ª˜t1’ÝCò艼å†D]ƒ‰C’ù€e9€€e0’僉&†D6‰¿Åò¯’ݘsèž©Y¥}h¬à—´À¾½öÅäñÏÍØp}â ëýõòŽÿÿç @Íà¯'S0ÿh:ãBáßK?SCZ‚taV‡g‹ûm"är :v@(y»º|vÏ~mšÍÿÿšË~m|vÉy»³vC.r /m"×g‹ìaVwZ‚cS0K?BáÊ:Í0ÿR';à—µ 'ÿÿÎõòvëüéâØpfÏ·ÅäÛ½á´Àª¬à„¥}Wž©I˜sÙ’Üõò¤‰¿¼†D.ƒ‰ ’á€e.€€e;’ýƒ‰H†Dd‰¼ïòó’ÝP˜t@ž©º¥}Ò¬á ´Á7½uÅåvÏóØq â±ëý•õó#| ÕaáA'á0øŽ:hBâ_K?“SµZ‚ÞaVègŒRm#2r ~v@ay»é|vò~m*šØÿÿš¿~lø|v¦y»…vBõr ëm"‰g‹”aVZùS¾K>BáK:H0þÈ'Ž­à! ’ÿÿ9õñáëüVâwØoØÏ-ÅäV½b´Æª¬à¥|힨è˜s‚’ܧò`‰¿‚†Dƒˆý” €e"€€eG“ƒ‰k†D’‰½(ó7’Ýž˜o䞪¥~<¬áz´Á¯½õÅåûÏ}Øqšâ CëöBõó¸ jôáÒ'o0ù:íBâÞK9“S &ZƒHaWIgŒªm#€r Âv@šy¼|w~lšäÿÿš³~là|vƒy»VvB¼r §m";gðaUµZSMK>BàË:Â0þ>'Žßu t ýÿþ£õñLëûÂâåØoJÏ¢Åãнâ´Æ1¬ß¡¥|ƒž¨†˜s*’ÜYò‰¿I†CÒƒˆÚ“ó€e€€eS“+ƒ‰Ž†DÁ‰½aó{’Ýì˜p<žª|¥~¥¬áì´Â(½tÅæ€ÏØr(â ÔëöÖõôM§ ˆâc'ý0ù£:rBã^K: S ˜Zƒ±aRxgm#Îrv@Óy¼E|w7~lšðÿÿ›H~lÉ|v`y»(vB‚r cm!íg˜aUTZ&S#ðK=›BàL:=0ý³'‘Þãá hÿþõø°ëû.âTØn¼ÏÅãK½c´Å¸¬ß/¥|ž­W˜rÒ’Ü ñ؉¿†C¤ƒˆ·“Ü€e €€d¾“Cƒ‰±†Dšó¿’Þ:˜p”žªÝ¥¬ÜH´Â¡½ôÅçÏ’Ør¶â!eë÷iõôâ= šâõ'‘‹0ú-:÷BãÝK:…S! Z„aRÙgZm$rJvA y¼s|wZ~l0šûÿÿ›<~l²|v=y½svBIr m!Ÿg@aTóZ€¼S#K="BßÍ:Ù0ý)'ÞRM Óÿýxõøëú›âÃØuÉÏŽÅâÆ½ã´Å?¬Þ¾¥{°ž¬ö˜rz’Û½õ6‰¾×†Cvƒˆ”“Ä€dÿ€€dÉ“Zƒ‰Ô†B¤‰½Óô’Þˆ˜pëž«>¥y¬Üº´Ã½ sÅàjÏØsDâ!÷ë÷ýõõwÒ /¯ã†'Š~0ú·:}Bä\K:þS!{Z„…aS:g²m$jr ìvAFy¼¡|w}~lH›ÿÿ›1~lš|vy½EvBr Üm!QgŽéaT’Z€RS# K<©BßM:T0üŸ'ŒuÝÁ¹ >ÿüãõ÷†ëúâ1Øu;ÏÅâA½d´ÄƬÞL¥{Fž¬•˜r"’Ûoôò‰¾ž†CHƒŠP“­€dó€€dÕ“qƒ‰÷†BÒ‰¾ ôF’Ú¨˜qCž«Ÿ¥â¬Ý,´Ã“½ óÅàïϦØsÒâÀëøõö h ÄCä'‹ 0ûA:BÞ K;wS!íZ„îaS›gŽ m$¹r 0vAy¼Ð|uÂ~l_›ÿÿ›%~lƒ|uøy½vA×r ˜m%1gŽ‘aT0ZéS"œK<0BÞÎ:Î0ü'‹çä÷& ©ÿüNõöñëùsâ Øt­ÏzÅá¼½!·´ÄM¬ÝÚ¥zÝž¬4˜qÊ’Û ô¯‰¾d†CƒŠ-“•€d瀀dᓉƒŠ†C‰¾FôŠ’Ú÷˜q›ž¬¥€L¬Ý´Ä ½!rÅátÏ0ØtaâRëù$õö¡ý YÖä©'‹š0ûË:‡BÞ‰K;ïS"^Z°aSügŽbm%r svA¸y¼þ|uå~lv›ÿÿ›~ll|uÕy¼èvAžr Tm$âgŽ9aSÏZ…'S"*K;¸BÞN:I0û‹'‹Xäf’ ¸õö\ëøàâØtÏðÅá7½!7´ÃÔ¬Ýi¥€ž«Ó˜qr’ÚÒôk‰¾+†B냊 “~€dÛ€€dí“ ƒŠ=†C/‰¾ôÎ’ÛE˜qóž¬a¥{¬Þ´Ä…½!òÅáùϺØtïâãëù¸õ÷6ÿü“ îjå:'Œ(0üU: Bß K|vp~lÔš­ÿÿšê~l|w'y¼0v@¹r æm#ªgŒÚaW}Zƒ€S cK9ÔBã#:50ùc'¼â D ºbõôëö‘â ‘ØqæÏÈÅæC½9´Áð¬á·¥~tžªO˜p’ÝÈó[‰½F†D«ƒ‰~“ €eM€€e“þƒˆê†C牿dò<’Ü}˜sRž¨³¥|´¬ßÖ´Æi½ÅäÏâØoŒâ)ëüõñ‘ÿþé B ¹߸'Ža0þ}:BáK>LSZÀaUâgm"_r ÇvBÖy»l|v“~lëš¹ÿÿšß~k÷|wy¼v@€r ¢m#\gŒ‚aWZƒSòK9[Bâ£:¯0øÙ'-á° %ÍõósëýäâÿØqXÏ>Åå½½º´Áw¬áF¥~ ž©î˜to’Ýzó‰½ †D}ƒ‰[“ €eB€€e'’Õƒ‰ †D‰¿ò’ܢsªž©¥}¬àG´Ài½Åä“ÏlØpâºëüšõò&ÿÿ~ ×eàI'Žï0ÿ:…Bá†K>ÅSóZ‚*aVCg‹½m"­r vCy»š|v¶~mšÄÿÿšÓ~m |váy»Óv@Fr _m#gŒ*aV»Z‚­S€K?[Bâ$:*0øO'Ÿàý 7õòÞëýQânØpÊϳÅå8½:´Àÿ¬àÔ¥}¡ž©˜t’Ý,òÔ‰¼Ô†DOƒ‰8’ò€e6€€e3’색0†DD‰¿ÖòÒݘtž©u¥}ˆ¬à¹´Àâ½ÅåÏ’Øp¨âKëý-õò» lùàÛ'}0ø-: BâK?>SeZ‚”aV¤gŒm"ûr Nv@9y»È|vÙ~mšÐÿÿšÇ~m|v¿y»¥vCr m"Àg‹ÒaVZZ‚CSK>âBá¤:¥0ÿ)'àl‰ ûÿÿ¢õòIëü½âÝØp<ÏÅä³½»´À†¬àb¥}7ž©,˜s¿’ÜÞò‰¿«†D!ƒ‰’Ú€e*€€e?“ƒ‰S†Dr‰½ó’Ýg˜tZž©×¥}ñ¬á+´Á[½›ÅåžÏØq6âÝëýÁõóP© ál' 0ø¸:Bâ…K?·SÖZ‚þaWgŒmm#Ir ’v@ry»ö|vü~m1šÜÿÿš»~lñ|vœy»wvBär ×m"rg.aUùZÚSK>iBá%: 0þž'ŽƒßÛ Ü fÿÿ õñ´ëü*âKØo®ÏÅä.½<´Æ†¬ßñ¥|Ξ¨Ë˜sg’ÜòL‰¿q†Còƒˆó”€e€€eJ“ƒ‰v†D ‰½9óK’ݵ˜oþžª8¥~[¬áœ´Áӽſ#ϧØqÄâ nëönõóå> – áý'š0ùB:BãK9·S HZƒgaWfgŒÄm#—r Öv@«y¼%|w~lšèÿÿš°~lÙ|vyy»IvB«r “m"$gÖaU˜ZpS+K=ðBà¥:›0þ'õßI H Ñÿþwõñëû–âºØoÏyÅ㩽¼´Æ ¬ß¥|dž­œ˜s’ÜBò‰¿8†CăˆÐ“ì€e€€d¶“2ƒ‰™†DΉ½ró’Þ˜pVžª™¥~ŬÛù´ÂL½šÅæ¨Ï1ØrRâ ÿë÷õôzÔ 2´â'‘(0ùÌ:šBã„K:0S ºZƒÑaR•gm#ærv@äy¼S|wB~l šóÿÿ›E~lÂ|vVy»vBqr Om!Õg~aU7ZS#ÏK=wBà&:0ýŠ'gÞ¸µ <ÿýáõø„ëûâ)Øn‘ÏïÅã$½=´Å”¬ß ¥{úž­;˜r¸’Ûóñĉ¾ÿ†C–ƒˆ­“Õ€e€€dÁ“Jƒ‰¼†Dý‰½«óÓ’ÞR˜p®žªú¥.¬Üj´ÂŽ Åç-Ï»Øràâ!‘ë÷•õõi ÇHã 'Š0úV:BäK:©S!+Z„;aRögtm$4r ¼vAy¼|we~l7šÿÿÿ›9~l«|v3y½evB8r m!‡g&aTÖZ€S#]K<þBß§:±0ý'ŒÙÞ'! §ÿýLõ÷ïëúoâ—ØuŸÏeÅâž½½´Å¬Þœ¥{‘ž¬Ù˜r`’Û¥õ"‰¾Æ†ChƒˆŠ“½€dû€€dÍ“aƒ‰Þ†B²‰½äô’Þ ˜qž«[¥˜¬ÜÜ´Ã>½ ™Åà‘ÏEØsoâ""ëø)õõ¤ÿ \Ûã±'Ѝ0úà:¤Bä‚K;"S!Z„¤aSWgÌm$‚r vAWy¼¯|wˆ~lO› ÿÿ›-~l“|vy½7vAÿr Çm!9gŽÎaTuZ€3S"ëK<…Bß':,0üv'ŒJå] ÿü¶õ÷ZëùÛâØuÏÛÅâ½"´Ä¢¬Þ*¥{'ž¬x˜r’ÛWôÞ‰¾†C:ƒŠE“¦€ddÙ“xƒŠ†Bà‰¾ôZ’ÚÀ˜q]ž«¼¥€¬ÝN´Ã·½!ÅáÏÏØsýâìëø¼õö9” ñoäC'‹60ûj:)BÞ0K;›S"Z…aS¸gŽ$m$Ðr DvAy¼Ý|uÌ~lf›ÿÿ›!~l||uíy½ vAÆr „m%gŽwaTZÉS"zK< BÞ¨:§0ûì'‹¼äÌú }ÿü!õöÅëùGâuØtƒÏQÅᔽ!‘´Ä)¬Ý¸¥z½ž¬˜q°’Û ôš‰¾S†C ƒŠ"“Ž€d䀀d䓃Š$†C‰¾Wôž’Û˜qµž¬¥zìݿ´Ä0½!˜ÅáœÏYØt‹â}ëùPõöÎÿü* †äÔ'‹Å0ûô:¯BÞ¯K<S"€ZÏaTgŽ|m%r ˆvAÉy½ |uï~l}›"ÿÿ›~le|uÊy¼ÛvAr @m$ËgŽaS²Z…S"K;“BÞ(:"0ûb'‹.ä:f èŒõö0ëø´âãØsôÏÇÅá½!´Ã°¬ÝG¥üž«¶˜qX’Ú»ôV‰¾†B݃‰ÿ“w€dØ€€d𓧃ŠG†C<‰¾ôâ’Û\˜r ž¬~¥{-¬Þ1´Ä©½"Åâ!ÏãØuâëùäõ÷cÿü¿ –åe'ŒS0ü~:4Bß/K<ŒS"òZ€9aTzgŽÔm!>r ËvBy½:|v~l•›.ÿÿ› ~lM|w…y¼¬vASr üm$}gÇaSQZ„žS!–K;Bä{:œ0úØ'Š ã©Ó Söõõ›ëø â"ØsfÏ=ÅàŠ½ ’´Ã7¬ÜÕ¥’ž«U˜q’Þ›ô‰½á†B¯ƒ‰Ü“`€dÌ€€dü“¿ƒˆŒ†Ck‰¾Éõ&’Ûª˜rež¬ß¥{—¬Þ¢´Å"½ÅÅâ¦ÏmØu§â ëúwõ÷øÿýU °*Þ/'Œá0ý:¹Bß®K=S#dZ€£aTÛg+m!Œr vBpS£ZàaUÿg3m"vr ÛvBçy»z|vž~lòš¼ÿÿšÛ~m0|vúy»ôv@or Žm#EgŒgaVÿZ‚÷SÐK?°Bâ}:ˆ0ø¯'ád„ ù õóGëý¸âÔØq.ÏÅå–½”´ÁS¬á$¥}랩јtU’Ýcó‰¼ü†Doƒ‰Q“€e>€€e+’܃‰†D#‰¿®ò”’Üâ˜sÄž©1¥}>¬ài´À½ÂÅä»Ï–ØpDâåëüÆõòRÿÿ« ‘àu'0ÿ1:­Bá¬K>éSZ‚JaV`g‹×m"Är vC y»¨|vÁ~m šÈÿÿšÏ~m|v×y»Æv@5r Jm"÷gŒaVžZ‚ŽS^K?7Báþ:0ø%'uàÒð d õò²ëý%âCØpŸÏŠÅå½´À۬ಥ}‚ž©p˜sý’Ýò¿‰¿Ó†DAƒ‰.’ë€e2€€e6’óƒ‰:†DR‰¼×òØ’Ý0˜tž©’¥}§¬àÛ´Á½BÅå@ϼØpÒâvëýYõòç@ ™%á'¨0øW:2Bâ+K?bS‡Z‚³aVÁgŒ/m#r cv@Jy»Ö|vä~m!šÔÿÿšÄ~m|v´y»—vC r m"©g‹¸aV=Z‚$SìK>¾Bá~:}0þÿ'ŽçàA] Ïÿÿuõòëü‘â±ØpÏdÅ䋽•´Àb¬àA¥}ž©˜s¥’ÜÆò{‰¿š†Dƒ‰ ’Ó€e'€€eB“ ƒ‰]†D€‰½ó’ݘttž©ó¥~¬áL´Á½ÁÅåÅÏFØq`â ëöõó|Õ .¹á—'60øá:·Bâ«K9bSøZƒaW"gŒ‡m#ar ¦v@ƒy¼|w~køšßÿÿš¸~lê|v‘y»ivBÓr Ãm"ZgaUÜZºS{K>EBàÿ:ø0þu'ŽYß° ° :ÿþàõñˆëûþâ ØoƒÏÚÅä½´Æb¬ßÏ¥|®ž¨®˜sM’Üxò8‰¿`†C僈è“ü€e€€eN“"ƒ‰€†D®‰½Jó_’Ý͘pžªU¥~{¬á¾´Á÷½AÅæJÏÐØqîâ ™ëöšõôk ÃLâ)'Ä0ùk:›ÿÿ›5~l¤|v)y½WvB'r ÷m!pg aT¹Z€}S#;K<ÚBß:‰0ü×'Œ®Ýûõ {ÿýõ÷ÂëúCâlØutÏ<Åâw½—´Ä÷¬Þz¥{qž¬½˜rF’ÛŽõ‰¾µ†CZƒˆ€“¶€dø€€dГhƒ‰é†BÀ‰½õô+’Þ·˜q ž«x¥¸¬Üþ´Ãb½ ¿Åà¹ÏnØs™â"MëøUõõÐ+ ˆãÝ'ŠÓ0û :ÌBÝÖK;FS!¿Z„ÄaStgæm$™r vAhy¼½|u´~lV›ÿÿ›*~lŒ|vy½)vAîr ³m%PgŽ´aTXZ€S"ÉKÏøØt'âëøèõöeÁ ›än'‹a0û“:QBÞVK;¿S"1Z…-aSÕgŽ>m$çr XvA¡y¼ë|u×~lm›ÿÿ›~lu|uãy¼ûvAµr om%gŽ\aS÷ZªS"XK;èBÞ‚:0ûÃ'‹’ä Î Qôõö˜ëùâIØtXÏ(Åál½!k´Ä¬Ý—¥€Fž«ú˜q–’Úòô†‰¾B†BþƒŠ“‡€dà€€dè“—ƒŠ/†C‰¾hô³’Û%˜qÏž¬:¥zã¬Ýá´ÄT½!¾ÅáÄÏ‚Øtµâ¨ëù|õöúÿüV ².äÿ'‹ï0ü:ÖBÞÕK<8S"¢ZïaT6gŽ–m%5r œvAÚy½|uú~l„›&ÿÿ›~l^|uÀy¼ÍvA|r ,m$´gŽaS–Z„èS!æK;oBÞ:ú0û9'‹ä: ¼_õöëøˆâ¸ØsÊÏžÅàç½ ë´ÃŒ¬Ý%¥Üž«™˜q>’Ú¤ôB‰¾ †BЃ‰õ“p€dÔ€€dô“®ƒŠR†CJ‰¾¡ôö’Ûs˜r'ž¬›¥{M¬ÞS´ÄͽkÅâIÏ ØuCâ:ëúõ÷ÿüì GÂÝÉ'Œ}0ü§:[BßUK<°S#Z€YaT—gŽîm!Ur àvBy½G|v~lœ›1ÿÿ›~lF|w{y¼ŸvABr èm$fg­aS4Z„S!tK:÷BäU:u0ú¯'Švã~§ &Êõõnë÷ôâ!îØs<ÏÅàb½ l´Ã¬Ü³¥rž«8˜pæ’Þ„óþ‰½Ð†B¡ƒ‰Ò“Y€dÉ€€dÿ“Ńˆ–†Cx‰¾Úõ:’ÛÁ˜rž¬ü¥{¶¬ÞÄ´ÅF½ëÅâÎÏ–ØuÒâËëú£õø$ÿý ÜVÞ[' 0ý1:áBßÔK=)S#…Z€ÂaTøgFm!£r $vBMyºý|v?~l³›=ÿÿšû~l/|wXy¼qvA rFm$gUaRÓZ„S!K:~BãÖ:ð0ú%'‘ƒâì ‘4õôÙë÷aâ!]Ør®ÏŠÅæþ½ì´Âš¬ÜB¥ žª×˜pŽ’Þ6󻉽—†D색¯“A€d½€€e “݃ˆ¹†C§‰¿ñܒܘrמ­]¥| ¬ß6´Å¿½jÅãSÏ ØnÄâ\ëû7õø¹ÿþ qéÞì'™0ý¼:EBàSK=¢S#÷Z,aUYgm!ñr gvB†y»+|vb~lÊ›Iÿÿšï~l|w5y¼Bv@Ðrm#ÊgŒýaRrZƒ«S ‘K:BãV:j0ù›'õâ[ üŸõôDëöÍâ ËØr ÏÿÅæx½m´Â!¬áå¥~Ÿžªv˜p7’Ýèów‰½^†D¾ƒ‰Œ“*€eR€€e“ôƒˆÜ†CÕ‰¿Mò ’Ü]˜s/ž¨Œ¥|Ьߍ´Æ8½êÅãØÏ«ØoRâîëûËõñTÿþ¬  }ß}'Ž(0þF:ÊBàÓK>SSZ–aUºgõm"?r «vB¿y»Y|v…~lâš´ÿÿšã~l|wy¼v@—r ¾m#|gŒ¥aWCZƒBS K9ŒBâ×:å0ù'gáÊì a õó¯ëö9â :Øq‘ÏuÅåó½í´Á¨¬át¥~5žª˜oß’Ý™ó3‰½$†Dƒ‰i“€eF€€e#” ƒˆÿ†D‰¿†òd’Ü«˜s‡ž¨í¥|ó¬à´Æ±½iÅä]Ï5Øoàâëü^õñéÿÿB ›*à'޶0þÐ:OBáRK>”SÅZÿaVg‹™m"Žr ïvBøy»‡|v¨~lùšÀÿÿšØ~m)|vðy»æv@^r zm#-gŒMaVâZ‚ØS®K?ŒBâW:`0ø†'Ùá8X ÌtõóëýŒâ©ØqÏëÅån½n´Á/¬á¥}Ìž©´˜t;’ÝKòë†Dbƒ‰F’û€e;€€e.’ド"†D1‰¿¿ò¨’Üú˜sßž©N¥}]¬à‹´À±½èÅäãÏ¿Øpnâëüòõò~ÿÿ× 0½à 'D0ÿZ:ÕBáÒK? S7Z‚iaV}g‹ñm"Ür 3vC1y»¶|vË~mšËÿÿšÌ~m|vÍy»¸vC4r 6m"ßg‹õaVZ‚nSšBáX:V0þÖ'޼à1 ¢ÿÿIõñðëüeâ†ØoçÏ;Åäd½o´À>¬à¥|øž¨ò˜s‹’ܯòg‰¿‰†Dƒ‰” €e#€€eF“ƒ‰h†Dމ½"ó0’Ý–˜oÛžª¥~0¬án´Á£½çÅåíÏoØq‹â 3ëö2õó¨ ZåáÃ'`0ù :ßBâÑK9†S Zƒ=aW?gŒ¡m#xr »v@”y¼|w~kÿšãÿÿš´~lã|v‡y»[vBÂr ®m"CgúaU¿Z›SYK>!BàÙ:Ð0þL'Ž.ß„ „ ÿþ³õñ[ëûÒâõØoYϱÅãß½ð´Æ>¬ß­¥|ž¨‘˜s3’Üaò#‰¿O†C׃ˆÞ“õ€e€€eQ“)ƒ‰‹†D¼‰½[ós’Ýä˜p2žªq¥~š¬áà´Â½gÅærÏùØrâ ÄëöÆõô=— ïxâT'î0ù”:dBãPK9ÿS ŒZƒ¦aRngŒùm#Ær þv@Íy¼@|w4~lšïÿÿ›I~lÌ|vdy»-vB‰r km!õg¢aU^Z1S#ýK=¨BàY:K0ýÂ' Þóð xÿþõøÀëû>âcØnËÏ'ÅãY½p´ÅŬß;¥|%ž­b˜rÛ’Üñà‰¿†C©ƒˆ»“Þ€e €€d½“@ƒ‰­†Dꉽ”ó·’Þ2˜pŠžªÓ¥¬Ü<´Â”½æÅæ÷σØr§â!Vë÷ZõôÒ- Š âå'‘|0ú:éBãÐK:xS ýZ„aRÏgQm$rBvAy¼n|wW~l.šúÿÿ›>~l´|vAyºÿvBOr 'm!§gJaTýZ€ÇS#‹K=/BßÚ:ç0ý8'Þb] ãÿýˆõø+ëúªâÒØuØÏÅâÔ½ñ´ÅL¬ÞÊ¥{»ž­˜rƒ’ÛÅõ>‰¾Ý†C{ƒˆ˜“Ç€e€€dÈ“Xƒ‰Ð†BŸ‰½Íóû’Þ€˜pâž«4¥m¬Ü®´Ã ½ fÅà\Ï Øs5â!çë÷íõõg  ãw'Šo0ú¨:nBäOK:ñS!oZ„zaS0g©m$br ävA@y¼|wy~lE›ÿÿ›2~l|vy½JvBr ãm!YgŽòaTœZ€^S#K<¶Bß[:b0ü®'Œ„ÝÐÉ Nÿüóõ÷–ëúâAØuJÏÅâO½q´ÄÓ¬ÞX¥{Rž¬ ˜r,’Ûwôú‰¾¤†CLƒˆu“¯€dô€€dÔ“oƒ‰ó†B͉¾ô?’Ú ˜q:ž«•¥×¬Ý ´Ã†½ åÅàáÏ—ØsÃâ±ëøõõüX ´3ä'Šý0û2:ôBÝüK;jS!áZ„ãaS‘gŽm$°r (vAyy¼Ë|u¾~l\›ÿÿ›&~l…|uûy½vAÝr Ÿm%9gŽšaT;ZôS"¨K<=BÞÛ:Ý0ü$'‹öå5 ¹ÿü]õ÷ëùƒâ¯Øt¼Ï‰Åáʽ!Ä´ÄZ¬Ýæ¥z螬?˜qÔ’Û)ô¶‰¾k†CƒŠ0“˜€d耀dà“†ƒŠ†Bü‰¾@ôƒ’Úî˜q’ž«ö¥€A¬Ý‘´Ãÿ½!eÅáfÏ!ØtQâBëùõö‘í IÇä™'‹‹0û¼:yBÞ|K;ãS"RZ¥aSògŽXm$þr lvA²y¼ù|uá~lt›ÿÿ›~ln|uØy¼ívA¤r [m$ëgŽBaSÚZ…2S"6K;ÄBÞ\:W0ûš'‹gäu¢ $ÈõölëøïâØt.ÏÿÅáE½!E´Ãá¬Ýu¥€&ž«Ý˜q|’ÚÛôr‰¾1†BðƒŠ “€€dÝ€€d듞ƒŠ9†C*‰¾yôÇ’Û<˜qꞬW¥{¬Þ´Äx½!äÅáëÏ«ØtàâÔëù¨õ÷&ÿüƒ ÞZå+'Œ0üF:þBÞûK<\S"ÄZ€aTSgްm%Lr °vAëy½'|v~l‹›)ÿÿ›~lW|uµy¼¿vAkr m$gêaSyZ„ÉS!ÄK;KBÝÜ:Ò0û'ŠÙãä 2õõ×ëø\â"TØs ÏuÅ࿽ Å´Ãh¬Ý¥½ž«|˜q$’Þ»ô.‰½ø†Bƒ‰ë“i€dÑ€€d÷“µƒˆ~†CX‰¾²õ ’ÛŠ˜rBž¬¸¥{l¬Þu´Äñ½‘ÅâpÏ5Øunâeëú<õ÷»ÿý sîÝõ'Œ§0üÑ:ƒBß{K<ÔS#6Z€xaT´gm!lr ôvB$y½U|v'~l£›5ÿÿ›~l?|wqy¼‘vA1r Óm$Og“aSZ„_S!SK:ÒBä/:M0ú†'ŠKãR{ úõõBë÷Èâ!ÃØsÏêÅà:½ F´Âï¬Ü‘¥Sž«˜pÌ’Þmóꉽ¿†B”ƒ‰È“R€dÅ€€e“̃ˆ¡†C†‰¾ëõO’ÛØ˜r™ž­¥{Ö¬Þæ´Åj½ÅâöÏ¿Øn`âöëúÏõøPÿý® ‚Þ†'60ý[:çBßúK=MS#§Z€âaUg`m!»r 8vB^y» |vJ~lº›Aÿÿš÷~l(|wNy¼cv@ør1m$g;aR¶ZƒõS áK:ZBã°:È0ùû'‘YâÁç eõô­ë÷5â!1ØrƒÏ`ÅæÖ½Æ´Âv¬Ü ¥~鞪º˜pt’Þ󦉽††DÞƒ‰¥“:€dº€€e“䃈ĆC´‰¿$ññ’Ü'˜rñž­z¥|?¬ßX´Åã½Åã{ÏJØnîâˆëûcõøåÿþC  ß'Ä0ýå:mBàyK=ÆS$ZLaUvg¸m" r |vB—y»9|vm~lÑš¬ÿÿšì~l|w+y¼5v@¿r ím#²gŒãaW‡ZƒŒS oK9áBã0:C0ùq'Ëâ0S Êrõôëö¡â  ØqõÏÖÅæQ½G´Áý¬áÃ¥~€žªY˜p’ÝÐób‰½M†D°ƒ‰‚“#€eO€€e“ûƒˆç†C㉿^ò4’Üu˜sIž¨©¥|©¬ßÊ´Æ\½ÅäÏÔØo|âëû÷õñÿþÙ 2 ©ß©'ŽR0þo:òBàùK>?SuZµaU×gm"Wr ¿vBÐy»g|v~léš·ÿÿšà~kù|wy¼v@†r ªm#dgŒ‹aW&Zƒ"SþK9hBâ±:¾0øç'<ážÀ 5Ýõóƒëö â ØqgÏLÅå̽Ç´Á„¬áR¥~ž©ø˜tx’݂󉽆D‚ƒ‰_“ €eC€€e&’Òƒ‰ †D‰¿—òx’ÜØs¡ž© ¥}¬à;´À\½Åä…Ï^Øp âªëüŠõòÿÿn ÇVà:'Žà0þù:wBáxK>¸SçZ‚aV8g‹´m"¥r vC y»•|v³~mšÃÿÿšÔ~m"|våy»Øv@Mr fm#gŒ3aVÅZ‚¸SŒK?hBâ1:80ø]'®á ,  Gõòîëý`â}ØpÙÏÂÅåF½H´Á ¬àà¥}¬ž©—˜t ’Ý4òÛ‰¼Ú†DTƒ‰<’ô€e7€€e2’ꃉ,†D?‰¿Ðò¼’ݘsùž©k¥}|¬à­´ÀÕ½Åå ÏèØp™â<ëýõò« \éàË'n0ø:üBáøK?1SYZ‚‰aVšgŒ m"ór Gv@3y»Ã|vÕ~mšÏÿÿšÈ~m |vÂy»ªvC#r "m"Èg‹ÛaVdZ‚OSK>ïBá²:³0ÿ7' à|˜ ÿÿ²õòYëüÍâìØpKÏœÅäÁ½É´À’¬àn¥}Cž©6˜sÉ’Üæò—‰¿±†D&ƒ‰’Ý€e+€€e=“ƒ‰O†Dm‰¼úó’Ý_˜tQž©Ì¥}æ¬á´ÁN½ŽÅåÏØq'âÍëý±õó@™ ñ}á]'ü0ø©:BâwK?ªSÊZ‚òaVûgŒcm#Ar ‹v@ly»ò|vø~m/šÛÿÿš½~ló|vŸy»|vBêr Þm"zg7aVZåS©K>vBá2:.0þ­'Ž’ßê ì vÿÿõñÄëü9â[Øo½ÏÅä<½I´Æ’¬ßý¥|Ùž¨Õ˜sq’ܘòS‰¿x†C÷ƒˆö”€e €€eI“ƒ‰r†D›‰½3óD’Ý­˜oõžª-¥~P¬á´Áǽ ÅæÏ˜Øqµâ ^ëö^õóÕ/ †áî'Š0ù3:Bâ÷K9ªS †CɃˆÓ“î€e€€d´“0ƒ‰•†Dʉ½lóˆ’Ýû˜pMžªŽ¥~º¬Ûí´Â@½ÅæšÏ"ØrCâ ðëöòõôjÄ "¤â'‘0ù½:ŒBãvK:#S ®ZƒÆaR‹gm#Ýrv@Þy¼N|w>~lšòÿÿ›F~lÅ|vZy»vBwr Vm!Þg‡aUAZS#ÛK=„Bà4:$0ý™'vÞÈÄ Lÿýñõø”ëûâ8Øn ÏþÅã2½J´Å¡¬ß¥|ž­E˜rÁ’Ûüñˉ¿†C›ƒˆ°“×€e€€dÀ“Gƒ‰¸†Dø‰½¥óÌ’ÞI˜p¤žªï¥#¬Ü^´Â¸½ ÅçϬØrÑâ!ë÷†õôÿY ·8ã'‘§0úG:BãõK:œS!Z„/aRìgkm$+r µvAy¼||wa~l5šþÿÿ›:~l­|v7y½jvB>r m!g0aTàZ€¨S#iK= Bß´:¿0ý'ŒèÞ61 ·ÿý\õ÷ÿëú~â§Øu®ÏtÅ⬽Ë´Å(¬Þ¨¥{œž¬ä˜ri’Û®õ)‰¾Ì†CmƒˆŽ“À€dü€€dÌ“^ƒ‰Û†B­‰½Þô’Þ—˜püž«Q¥¬ÜдÃ1½ ŒÅàƒÏ6Øs_â"ëøõõ”ï LÌã¢'Š™0úÑ:–BäuK;S!‘Z„™aSMgÃm$yr ùvAQy¼ª|w„~lL› ÿÿ›.~l–|vy½S"÷K<’Bß5::0ü…'ŒYål "ÿüÆõ÷jëùëâØu ÏêÅâ'½"´Ä¯¬Þ6¥{2ž¬ƒ˜r’Û`ô剾“†C?ƒŠI“¨€dñ€€dדvƒ‰þ†BÛ‰¾ôS’Ú·˜qTž«²¥÷¬ÝA´Ãª½! Åá ÏÀØsîâÜëø­õö)„ á_ä3'‹'0û[:BÞ"K;ŽS"Z…aS®gŽm$Çr =vAŠy¼Ø|uÉ~lc›ÿÿ›#~l~|uñy½vAÌr ‹m%"gŽ€aTZÔS"†K<BÞµ:µ0ûû'‹ËäÛ ÿü1õöÕëùWâ„Øt’Ï`Åᢽ!ž´Ä6¬ÝÅ¥zÈž¬"˜q¹’Ûô¢‰¾Y†CƒŠ&“‘€d倀d㓃Š!†C ‰¾Qô—’Û˜q¬ž¬¥z¸¬Ý³´Ä#½!‹ÅáŽÏJØt|ânëù@õö¾ÿü vóäÅ'‹µ0ûå: BÞ¢K<S"tZÄaTgŽrm%r €vAÃy½|uì~l{›!ÿÿ›~lg|uÎy¼àvA“r Gm$ÓgŽ(aS½Z…S"K; BÞ6:00ûq'‹=äJv ø›õö@ëøÃâóØtÏÕÅá½!´Ã½¬ÝS¥€ž«Á˜qb’ÚÃô^‰¾ †B⃊“y€dÙ€€dï“¥ƒŠC†C8‰¾ŠôÛ’ÛT˜rž¬t¥{"¬Þ%´Äœ½" ÅâÏÔØu âÿëùÔõ÷Sÿü¯ †åV'ŒD0üp:&Bß!K<€S"æZ€.aTpgŽÊm%dr ÄvAüy½5|v~l’›-ÿÿ› ~lP|w‰y¼±vAZr m$…gÐaS\Z„©S!¢K;'Bäˆ:«0úç'Нã¸â cõõ«ëø0â")ØsuÏKÅà˜½ Ÿ´ÃD¬Üᥞ«_˜q ’Þ£ô‰½ç†B´ƒ‰à“b€d΀€dû“¼ƒˆˆ†Cf‰¾Ãõ’Û¢˜r\ž¬Õ¥{Œ¬Þ–´Å½·Åâ˜Ï_Øu˜âëúhõ÷èÿýE  Þ 'ŒÒ0üú:«Bß¡K<ùS#XZ€˜aTÑg"m!„r vB6y½c|v1~lª›8ÿÿ›~l8|wfy¼ƒvA r ¿m$7gxaRûZ„@S!1K:®Bä :%0ú\'Š!ã'O Îpõõë÷œâ!—ØrçÏÁÅç3½ ´ÂˬÜp¥4žªþ˜p²’ÞUóÖ‰½®†Dÿƒ‰½“K€d€€e“Óƒˆ«†C”‰¾üñÁ’Ûð˜r´ž­6¥{õ¬ß´Å޽7ÅãÏéØnŠâ"ëúûõø}ÿýÚ 5®Þ±'`0ý„:Bà K=qS#ÉZaU2gzm!Òr LvBoy»|vT~lÁ›Dÿÿšô~l!|wCy¼Uv@çrm#ég!aRšZƒÖS ¿K:6BãŠ: 0ùÒ'‘.â–» 9Ûõôë÷ â!ØrYÏ7Åæ®½ ´ÂR¬Ûþ¥~Êžª˜pZ’Þ󒉽u†Dу‰š“3€d¶€€e“냈ΆC‰¿6ò’Ü>˜s ž­—¥|_¬ßz´Æ½¶Åã¢ÏsØoâ³ëûõñÿþp Ê AßC'î0þ:”BàŸK=êS&ZkaU“gÒm" r vB¨y»F|vw~lØš¯ÿÿšè~l |w!y¼'v@®r Ùm#›gŒÉaWkZƒlS MK9½Bã :0ùH' â' Fõóìëöuâ uØqËÏ­Åæ)½!´Á٬ᢥ~`žª<˜p’ݹóN‰½<†D¢ƒ‰w“€eK€€e”ƒˆñ†Cð‰¿oòI’ÜŒ˜scž¨Æ¥|ɬßë´Æ€½6Åä(ÏýØo§âDëü#õñ­ÿÿ _ ÕßÔ'Ž|0þ˜:BáK>cS—ZÕaUôg*m"nr ÔvBáy»u|vš~lðš»ÿÿšÜ~kò|vþy»ùv@ur •m#MgŒqaW ZƒSÜK?½Bâ‹:–0ø¾'ás” °õóWëýÈâãØq=Ï#Å夽¡´Á`¬á0¥}öž©Û˜t^’Ýkó ‰½†Dtƒ‰U“€e?€€e*’Ùƒ‰†D‰¿¨òŒ’ÜÚ˜s»ž©'¥}2¬à]´À€½µÅä­Ï‡Øp5âÖëü¶õòBÿÿ› ô‚àe' 0ÿ":ŸBážK>ÜS Z‚>aVUg‹Îm"¼r vCy»£|v½~mšÇÿÿšÑ~m|vÛy»Êv@;r Rm"ÿgŒaV¨Z‚™SjK?DBâ :0ø4'„àâ sõòÂëý4âRØp¯Ï™Åå½"´Àç¬à¾¥}ž©z˜t’Ýòlj¿Ù†DFƒ‰2’í€e4€€e5’ñƒ‰7†DM‰¼ÑòÐ’Ý(˜tž©ˆ¥}œ¬àÏ´Àù½4Åå2Ï­ØpÃâgëýJõò×0 ‰à÷'™0øH:$BâK?US{Z‚¨aV¶gŒ&m# r [v@Dy»Ñ|và~mšÒÿÿšÅ~m|v¸y»œvCr m"±g‹ÁaVGZ‚/SøK>ËBáŒ:‹0ÿ'ŽöàPl Þÿÿ…õò-ëü¡âÁØp ÏsÅäš½£´Àn¬àM¥}#ž©˜s®’ÜÏòƒ‰¿ †Dƒ‰’Ö€e(€€eA“ƒ‰Z†D{‰½ ó’Ýv˜tkž©é¥~¬á@´Ár½´Åå·Ï7ØqQâøëýÝõólÆ ©áˆ''0øÒ:©BâK9USìZƒaWgŒ}m#Xr Ÿv@}y»ÿ|w~kõšÞÿÿš¹~lì|v•y»nvBÙr Êm"cgaUæZÅS‡K>RBá :0þ„'Žhß¿ À Iÿþðõñ˜ëü â/Øo’ÏéÅä½#´Æn¬ßÛ¥|¹ž¨¸˜sW’Üò?‰¿f†Cꃈì“ÿ€e€€eM“ƒ‰|†D©‰½DóX’ÝĘpžªJ¥~o¬á²´Áë½3Åæ<ÏÁØqßâ ŠëöŠõô[ ³=â'µ0ù\:.BãK9ÎS ^Zƒ{aWygŒÕm#¦r ãv@¶y¼-|w&~l šêÿÿš­~lÕ|vry»@vB r †m"gÅaU…Z\SK=ÙBà:0ýú'Úß. , ´ÿþZõøüëûzâžØoÏ_Å㽤´Åõ¬ßi¥|Pž­‰˜rÿ’Ü3ñû‰¿-†C»ƒˆÉ“ç€e€€d¸“7ƒ‰Ÿ†D׉½}óœ’Þ˜pgžª«¥~٬ܴÂd½³ÅæÁÏKØrnâ!ë÷õô–ñ NÐâ«'‘C0ùæ:³BãœK:GS ÐZƒåaR¨g-m#ôr'v@ïy¼\|wH~l$šöÿÿ›B~l¾|vOy»vBfr Bm!ÇgmaU$Z€òS#¹K=`Bà:ü0ýp'KÞœ˜ ÿýÅõøgëúæâ ØnvÏÕÅã ½$´Å}¬Þø¥{æž­(˜r§’Ûäñ·‰¾ô†Cƒˆ¦“Ѐe€€dÓNƒ‰Â†B‰½¶óà’Þa˜p¿ž« ¥C¬Ü€´Âܽ 2Åà&ÏÕØrüâ!¬ë÷±õõ+† ãdã<'Š50úp:9BäK:ÀS!AZ„OaS g…m$Cr ÉvA)y¼Š|wk~l<›ÿÿ›7~l¦|v,y½\vB-r þm!xgaTÃZ€ˆS#GK<çBߎ:˜0üæ'Œ½Þ  Šÿý/õ÷ÒëúRâ{Øu„ÏKÅâ…½¥´Å¬Þ†¥{|ž¬Ç˜rO’Û–õ‰¾»†C_ƒˆƒ“¹€dù€€dÏ“eƒ‰å†B»‰½ïô$’Þ¯˜qž«m¥¬¬Üò´ÃU½ ²Åà«Ï_ØsŠâ">ëøEõõÀ x÷ãÍ'ŠÃ0úú:¾Bä›K;9S!³Z„¹aSjgÝm$‘r vAby¼¸|u°~lS› ÿÿ›+~l|v y½.vAôr ºm%Xg޾aTbZ€S"ÖK“¡€d퀀dÛ“}ƒŠ†B鉾)ôg’ÚϘqnž«Ï¥€¬Ýc´Ãν!1Åá0ÏéØtâëøÙõöU± ‹ä_'‹R0û…:CBÞHK;²S"$Z…"aSËgŽ5m$ßr QvA›y¼æ|uÓ~lj›ÿÿ›~lw|uæy½vA»r wm% gŽfaTZµS"dK;õBÞ:0ûÒ'‹¡ä°Ý `ÿüõö¨ëù+âYØtgÏ6Åáz½!x´Ä¬Ý£¥€Qž¬˜qŸ’Úúô‰¾H†CƒŠ“Š€dကdç“”ƒŠ+†C‰¾bô«’Û˜qÆž¬0¥zجÝÕ´ÄG½!±ÅáµÏtØt¦â™ëùlõöêÿüF ¢äð'‹à0ü:ÈBÞÈK<+S"–ZäaT,gŽm%-r •vAÔy½|uö~l‚›$ÿÿ›~l`|uÄy¼ÒvA‚r 3m$¼gŽaS Z„óS!òK;|BÞ:0ûG'‹äJ Ëoõöëø—âÇØsÙϬÅàõ½ ù´Ã™¬Ý1¥çž«¤˜qG’Ú¬ôI‰¾†BÕƒ‰ù“s€dÖ€€dò“¬ƒŠN†CE‰¾›ôï’Ûk˜rž¬‘¥{A¬ÞG´ÄÀ½^Åâ;ÏþØu4â*ëúõ÷ÿüÜ 7²ݺ'Œn0ü™:MBßGK<¤S#Z€MaTgŽäm!Mr ØvB y½C|v~l™›0ÿÿ›~lI|wy¼¤vAHr ïm$ng¶aS?Z„ŠS!K;Bäc:ƒ0ú½'Š…ã¶ 6Ùõõ~ëøâ!ýØsKÏ"Åàp½ y´Ã ¬Ü¿¥~ž«C˜pð’ÞŒô‰½Ö†B¦ƒ‰Ö“[€dÊ€€dþ“È“†Cs‰¾Ôõ3’Û¹˜rvž¬ò¥{«¬Þ¸´Å9½ÝÅâÀψØuÂâ¼ëú”õøÿýq ÌFÞK'Œü0ý#:ÒB߯K=S#yZ€·aTîg󉽆Dñƒ‰³“D€d¾€€e “Úƒˆ¶†C¢‰¿ ñՒܘrΞ­S¥|¬ß*´Å²½]ÅãEÏØnµâMëû'õø©ÿþ aÚÞÝ'Š0ý­:7BàFK=•S#ëZ!aUOg”m!ér `vB€y»&|v_~lÈ›Hÿÿšð~l|w9y¼Gv@Ör m#ÒgaR}Zƒ¶S K:Bãd:y0ù©'‘âj  ®õôTëöÝâ ÛØr/ÏÅæ‡½z´Â.¬ÛÜ¥~ªžª€˜p@’Ýðó~‰½d†DÉ“,€eS€€e“òƒˆØ†CЉ¿Gò’ÜU˜s&ž¨‚¥|~¬ßœ´Æ+½ÜÅãÊÏœØoCâÞëû»õñEÿþœ ö mßn'Ž0þ7:¼BàÅK>SGZ‹aU°gìm"7r ¤vB¹y»T|v‚~lßš³ÿÿšå~l|wy¼v@r Åm#„gŒ®aWNZƒMS ,K9™Bâä:ó0ù'váÙû qõó¿ëöIâ IØq¡Ï„Åæ½û´Áµ¬á€¥~Ažª˜oè’Ý¢ó:‰½*†D•ƒ‰m“€eH€€e!” ƒˆû†Cþ‰¿€ò]’Ü£˜s}ž¨ã¥|è¬à ´Æ¤½[ÅäOÏ&ØoÑâpëüOõñÚÿÿ2 ‹ßÿ'ާ0þÁ:ABáEK>‡S¹ZôaVg‹m"…r èvBòy»‚|v¤~l÷š¾ÿÿšÙ~m+|vóy»ëv@dr m#6gŒWaVíZ‚ãSºK?™Bâe:n0ø•'èáHh Ü„õó*ëýœâ¸ØqÏúÅå|½{´Á<¬á¥}מ©¾˜tD’ÝTòö‰¼ñ†Dfƒ‰J’þ€e<€€e-’àƒ‰†D,‰¿¹ò¡’Üñ˜sÕž©D¥}R¬à´À¤½ÛÅäÔϰØp_âëüâõòoÿÿÇ ®à‘'50ÿK:ÆBáÄK?S+Z‚^aVrg‹èm"Ór ,vC+y»±|vÇ~mšÊÿÿšÍ~m|vÐy»½v@*r =m"èg‹ÿaVŒZ‚ySHK? Báå:é0ÿo'Zà¶Ô Gÿÿîõò•ëýâ'Øp„ÏÔÅä÷½ü´ÀÃ¬àœ¥}mž©]˜sì’Ýò²‰¿È†D8ƒ‰'’æ€e0€€e9’øƒ‰A†DZ‰¼âòå’Ý?˜t-ž©¥¥}»¬àñ´Á½ZÅåZÏÖØpíâ’ëývõó] µAá"'Ã0øq:LBâDK?ySœZ‚ÈaVÓgŒ@m#!r pv@Uy»ß|vê~m%šÖÿÿšÁ~lý|v­y»ŽvCr úm"šg‹§aV*Z‚S×K>§Báf:d0þå'ŽËà%@ ²ÿÿYõòëüuâ•ØoöÏJÅär½}´ÀJ¬à+¥}ž¨ü˜s”’Ü·òn‰¿†D ƒ‰’Ï€e$€€eD“ƒ‰d†D‰‰½ó(’ݘoÑžª¥~%¬áb´Á–½ÚÅåßÏ`Øq|â $ëö#õó™ò JÕá³'Q0øû:ÑBâÃK9yS Zƒ1aW4gŒ˜m#pr ³v@Žy¼ |w ~küšâÿÿš¶~lå|v‹y»`vBÈr ¶m"KgaUÉZ¦SeK>.Bàæ:ß0þ['Ž=ß” ” ÿþÃõñkëûáâØohÏÀÅãí½ý´ÆJ¬ß¹¥|šž¨›˜s<’Üiò+‰¿U†C܃ˆá“ø€e€€eP“&ƒ‰‡†D·‰½Uól’Ýܘp)žªg¥~¬áԴ½YÅædÏêØr â µëö¶õô.ˆ ßiâE'ß0ù…:VBãCK9òS €Zƒ›aRcgŒðm#¾r ÷v@Çy¼;|w0~lšíÿÿ›K~lÎ|vhy»2vBr rm!ýg«aUhZƒ‰ª†D剽Žó°’Þ*˜pžªÈ¥~ù¬Ü0´Âˆ½ÙÅæéÏtØr˜â!Fë÷Jõôà {üâÖ'‘m0ú:ÛBãÂK:kS ñZ„aRÄgGm$ r;vAy¼i|wS~l+šùÿÿ›?~l·|vEy»vBUr .m!¯gSaUZ€ÓS#—K=S"BK;ÑBÞi:f0û¨'‹w䄱 4Øõö|ëøÿâ-Øt=Ï ÅáS½!R´Ãî¬Ý¥€2ž«è˜q…’Úãôy‰¾7†BõƒŠ“ƒ€dÞ€€dê“›ƒŠ5†C%‰¾sôÀ’Û4˜qàž¬M¥z÷¬Ý÷´Äk½!ÖÅáÝÏØtÑâÄëù˜õ÷ÿüs ÏKå'Œ 0ü8:ðBÞîK:Q0ù€'Úâ?c Ú‚õô(ëö±â ¯ØrÏåÅæ_½T´Â ¬áÐ¥~‹žªc˜p&’ÝÙój‰½S†Dµƒ‰†“%€eP€€e“ùƒˆã†CÞ‰¿Xò-’Ül˜s@ž¨Ÿ¥|ž¬ß½´ÆO½ÅãòÏÅØomâ ëûçõñqÿþÉ # ™ß™'ŽC0þ`:äBàëK>2SiZªaUÍgm"Nr ¸vBÊy»b|vŒ~læš¶ÿÿšá~kü|w y¼ v@Œr ±m#mgŒ”aW1Zƒ-S K9uBâ¾:Ì0øö'Lá®Ï Eìõó“ëöâ ØqvÏ[ÅåÚ½Õ´Á‘¬á^¥~!žª˜oÎ’Ý‹ó&‰½†D‡ƒ‰c“€eD€€e%’Ѓ‰†D ‰¿‘òq’ܺ˜s˜ž©¥}¬à/´ÀO½ÅäwÏOØoûâ›ëüzõòÿÿ^ ¸Fà+'ŽÑ0þê:iBákK>«SÛZ‚aV.g‹ªm"r üvCy»|v¯~lþšÂÿÿšÕ~m%|véy»Ýv@Sr mm#gŒüBá¿:Á0ÿF'/à‹¨ ÿÿÂõòiëüÜâûØpZÏ«ÅäϽÖ´ÀŸ¬à{¥}Nž©@˜sÒ’Üîòž‰¿·†D*ƒ‰’߀e-€€e<’ÿƒ‰K†Dh‰¼óòù’ÝW˜tGž©Â¥}Û¬á´ÁA½€ÅåÏÿØqâ¾ëý¢õó0‰ âmáM'í0øš:sBâjK?S¾Z‚çaVðgŒZm#9r „v@fy»í|võ~m,šÙÿÿš¾~lö|v£y»vBðr åm"‚g‹aVZðSµK>ƒBá@:<0þ¼'Ž¡ßú û †ÿÿ,õñÔëüIâjØoÌÏ!ÅäJ½W´ÆŸ¬à ¥|䞨ߘsz’Ü òZ‰¿~†Cüƒˆú”€e!€€eH“ƒ‰n†D–‰½-ó=’Ý¥˜o랪#¥~E¬á„´Áº½ÅæÏ‰Øq¦â OëöOõóÅ wáß'{0ù$:øBâéK9S 0ZƒQaWQgŒ²m#‡r Èv@Ÿy¼|w~lšåÿÿš²~lÞ|v€y»RvB·r ¡m"4géaU¬Z†SCK> BàÀ:·0þ2'Žßh h ñÿþ—õñ?ëûµâÙØo>Ï—ÅãŽ×´Æ&¬ß—¥|zž¨~˜s"’ÜRò‰¿D†C΃ˆ×“ñ€e€€eT“-ƒ‰‘†Dʼn½fó€’Ýó˜pCžª„¥~®¬Ûà´Â3½ÅæŒÏØr4â àëöâõôZ´ •âp'‘ 0ù®:~BãiK:S ¢ZƒºaR€g m#Õr v@Øy¼I|w:~lšñÿÿ›G~lÇ|v]y»$vB~r ^m!æg‘aUKZS#çK=‘BàA:20ý¨'…Þ×Ô \ÿþõø¤ëû"âGØn¯Ï Åã@½X´Å­¬ß&¥|ž­O˜rÊ’ÜñÓ‰¿ †C ƒˆ´“Ú€e €€d¿“Eƒ‰´†D󉽟óÄ’ÞA˜p›žªå¥¬ÜR´Â¬½ÿÅçÏØrÂâ!rë÷võôïJ §(ã'‘˜0ú9:BãèK:S!Z„$aRágbm$#rOvAy¼w|w]~l2šüÿÿ›;~l°|v:y½ovBDr m!˜g9aTêZ€³S#uK=BßÂ:Í0ý'Œ÷ÞF@ ÇÿýlõøëúŽâ¶Øu½Ï‚Å⻽Ø´Å4¬Þ´¥{§ž¬î˜rs’Û¶õ0‰¾Ò†Crƒˆ‘“€dþ€€dÊ“\ƒ‰×†B¨‰½Øô’Þ˜póž«F¥‚¬ÜÄ´Ã%½ ~ÅàuÏ(ØsPâ"ëø õõ„ß <¼ã“'ŠŠ0úÃ:ˆBägK;S!…Z„ŽaSBg¹m$qr ñvAKy¼¥|w€~lJ›ÿÿ›0~l˜|vy½AvB r Öm!JgŽáaT‰Z€IS#K<ŸBßB:H0ü“'ŒiÝ´­ 2ÿüÖõ÷yëùúâ%Øu/ÏøÅâ5½"+´Ä¼¬ÞB¥{=ž¬˜r’Ûhô퉾™†CDƒŠM“«€dò€€dÖ“sƒ‰ú†BÖ‰¾ôL’Ú¯˜qKž«§¥ë¬Ý5´Ã½ þÅàúϲØsßâÍëøõöu ÑOä$'‹0ûM: BÞK;S!÷Z„øaS¤gŽm$¿r 5vA„y¼Ô|uÅ~la›ÿÿ›$~l|uõy½vAÒr ’m%*gމaT(ZàS"’K<&BÞÃ:Ã0ü '‹Úäê ÿüAõöäëùgâ“Øt¡ÏnÅá°½!¬´ÄC¬ÝÑ¥zÔž¬,˜qÃ’Ûô©‰¾`†CƒŠ*““€d怀dâ“‹ƒŠ†C‰¾Kô’Úý˜q£ž¬¥€U¬Ý§´Ä½!}Åá€Ï<Øtmâ^ëù1õö®ÿü fãäµ'‹¦0û×:’BÞ”K;úS"hZ¹aTgŽim% r yvA½y½|uè~lx› ÿÿ›~lj|uÒy¼ävA™r Nm$ÜgŽ1aSÇZ…S" K;­BÞC:>0û'‹LäY… «õöOëøÓâØtÏäÅá+½!,´ÃʬÝ_¥€ž«Ë˜qk’ÚÌôe‰¾&†B烊“|€dÚ€€dî“¢ƒŠ@†C3‰¾„ôÔ’ÛK˜qûž¬i¥{¬Þ´Ä½!üÅâÏÆØtûâðëùÄõ÷CÿüŸ ûwåG'Œ50üa:BßKâ¥Ë Iëõôë÷â!ØrhÏFÅæ¼½®´Â_¬Ü ¥~Õžª¨˜pc’Þ󙉽{†DÖƒ‰ž“6€d·€€e“胈ʆC½‰¿/ñþ’Ü6˜sž­¥|T¬ßn´Åú½©Åã”ÏdØo â¤ëûõùÿþ` º 2ß3'ß0ýÿ:†Bà’K=ÞSZ`aU‰gÉm"r ‰vB¢y»B|vs~lÖš®ÿÿšé~l |w$y¼,v@´r àm#£gŒÒaWuZƒwS ZK9ÉBã:)0ùW'¯â7 ­Uõóûëö…â „ØqÚÏ¼Åæ7½.´Áæ¬á®¥~kžªG˜p ’ÝÁóU‰½B†D§ƒ‰{“€eL€€e”ƒˆí†C뉿iòA’Ü„˜sZž¨¼¥|½¬ßß´Æs½(ÅäÏîØo˜â5ëüõñÿþõ O ÅßÄ'Žm0þ‰: BáK>VS‹ZÊaUêg m"fr ÌvBÛy»p|v–~l횺ÿÿšÞ~kõ|wy»þv@{r m#UgŒzaWZƒSèK9QBâ˜:¤0øÍ'!á‚£ ÀõófëýØâóØqLÏ2Åå²½¯´Ám¬á<¥~ž©å˜th’Ýs󉽆Dyƒ‰X“€eA€€e(’׃‰†D‰¿¢ò…’ÜÒ˜s²ž©¥}'¬àQ´Às½§ÅäŸÏxØp&âÆëü¦õò2ÿÿ‹ äràV'Žû0ÿ:‘Bá‘K>ÏSýZ‚3aVKg‹Äm"´r vCy»ž|v¹~mšÅÿÿšÒ~m|vÞy»Ïv@Br Ym#gŒ"aV³Z‚¤SvK?PBâ:0øC'“àñ ƒ*õòÑëýDâbØp¾Ï¨Åå-½0´Àô¬àÊ¥}˜ž©„˜t’Ý%òΉ¼Ï†DKƒ‰5’ð€e5€€e4’3†DH‰¼ËòÉ’Ý ˜t ž©~¥}‘¬àôÀì½'Åå$ÏžØp´âXëý:õòÇ yàç'‰0ø9:BâK?HSnZ‚aV¬gŒm#r Tv@>y»Ì|vÜ~mšÑÿÿšÆ~m|v¼y»¡vCr m"¹g‹ÊaVRZ‚:SK>ØBá™:š0ÿ'à`| îÿÿ•õò<ëü±âÐØp0Ï‚Å䨽°´À{¬àY¥}.ž©#˜s¸’Ü×òЉ¿¦†Dƒ‰’Ø€e)€€e@“ƒ‰V†Dv‰½ó ’Ýn˜tbž©ß¥}ú¬á4´Áe½¦Åå©Ï(ØqBâéëýÎõó\¶ ™áy'0øÃ:›BâK?ÁSàZƒaW gŒtm#Pr ˜v@wy»ú|vÿ~kóšÝÿÿšº~lï|v™y»svBßr Ñm"kg&aUñZÑS“K>_Bá:0þ“'ŽwßÎ Ï Yÿÿõñ§ëüâ?Øo¡ÏøÅä"½1´Æ{¬ßç¥|Åž¨Â˜s`’܉òF‰¿m†Cð”€e€€eK“ƒ‰y†D¤‰½>óQ’ݼ˜pžª@¥~d¬á¦´ÁÞ½&Åæ.ϲØqÐâ zëö{õóñK £-â '¦0ùN: BãK9ÁS RZƒpaWngŒÌm#žr Üv@°y¼)|w"~l šéÿÿš¯~l×|vvy»EvB¦r m"gÎaUZgS!K=æBà›:0þ 'éß= < Äÿþjõñëû‰â­ØoÏmÅã½±´Æ¬ßu¥|[ž­“˜s’Ü;ò‰¿3†CÀƒˆÍ“ê€e€€d·“4ƒ‰œ†DÒ‰½wó•’Þ ˜p]žª¡¥~άÜ´ÂW½¥Åæ³Ï<Ør^â! ë÷õô†á >Áâ›'‘40ùØ:¥BãK::S ÃZƒÚaRg$m#ìr v@éy¼W|wE~l"šôÿÿ›D~lÀ|vSy»vBmr Im!ÏgwaU.Z€ýS#ÅK=mBà: 0ý~'ZÞ¬¨ /ÿýÕõøwëúöâØn…ÏãÅã½2´Å‰¬ß¥{ñž­2˜r°’Ûíñ¾‰¾ú†C’ƒˆª“Ó€e€€d“Lƒ‰¿†E‰½°óÙ’ÞX˜pµž«¥8¬Üt´Âн %ÅàÏÇØríâ!ë÷¢õõv ÓTã-'Š&0úb:*BäK:³S!5Z„DaRþg|m$:r ÂvA"y¼…|wh~l9›ÿÿ›8~l©|v0y½avB3r m!gaTÍZ€”S#SK<ôBßœ:¦0üô'ŒÌÞ šÿý?õ÷âëúbâ‹Øu“ÏYÅ⓽²´Å¬Þ’¥{ˆž¬Ñ˜rX’ÛŸõ‰¾Á†Cdƒˆ‡“»€dú€€dΓcƒ‰á†B¶‰½éô’Þ¦˜q ž«c¥¡¬Üæ´ÃI½ ¤ÅàÏQØs{â".ëø5õõ° hèã¾'Š´0úì:°BäK;,S!§Z„­aS_gÔm$ˆr vA\y¼³|w‹~lQ› ÿÿ›,~l‘|v y½3vAúr Âm%agŽÇaTlZ€*S"âK<{Bß:!0üj'Œ>åP ÿüªõ÷MëùÎâùØuÏÏÅâ½"´Ä˜¬Þ ¥{ž¬p˜r’ÛQô؉¾ˆ†C6ƒŠB“¤€ddÚ“zƒŠ†B䉾"ô`’ÚÆ˜qež«Ä¥€ ¬ÝW´ÃÁ½!$Åá"ÏÛØt âøëøÉõöE¡ ý{äO'‹C0ûv:5BÞ;K;¥S"Z…aSÁgŽ+m$Ör JvA•y¼á|uÏ~lh›ÿÿ› ~lz|uêy½vAÁr ~m%gŽoaT ZÀS"pK<BÞ:›0ûà'‹°ä¿í pÿüõö¸ëù;âhØtvÏEÅች!†´Ä¬Ý¯¥z´ž¬˜q©’Ûô•‰¾O†CƒŠ“Œ€d då“’ƒŠ'†C‰¾\ô¤’Û˜q½ž¬%¥z̬ÝÉ´Ä:½!£Åá§ÏeØt—âŠëù]õöÚÿü7 ’äá'‹Ñ0ü:ºBÞºK<S"ŠZÙaT"gŽƒm%%r vAÎy½|uò~l›#ÿÿ›~lc|uÇy¼×vAˆr :m$ÄgŽaSªZ„ÿS!þK;‰BÞ:0ûV'‹"ä.Y Ûõö#ëø§âרsèÏ»Åá½!´Ã¦¬Ý=¥óž«®˜qQ’Ú´ôQ‰¾†BÙƒ‰ü“u€d×€€dñ“©ƒŠJ†C@‰¾•ôè’Ûc˜rž¬†¥{6¬Þ;´Ä³½""Åâ,ÏïØu%âëùðõ÷oÿüÌ '£ݪ'Œ_0üŠ:?Bß:K<—S"üZ€BaTƒgŽÛm!Er ÑvBy½>|v~l—›/ÿÿ› ~lK|w‚y¼¨vAOr öm$vg¿aSIZ„•S!K;Bäp:‘0úÌ'Š”ãœÆ FéõõŽëøâ" ØsZÏ1Åà~½ ‡´Ã-¬ÜË¥‰ž«M˜pù’Þ”ô ‰½Ü†B«ƒ‰Ù“^€dË€€dý“Áƒˆ†Co‰¾Îõ,’Û±˜rmž¬ç¥{ ¬Þ¬´Å,½ÐÅâ²ÏyØu³â¬ëú„õøÿýa ¼6Þ<'Œí0ý:ÄBß¹K=S#mZ€¬aTäg3m!“r vB@y½l|v8~l®›;ÿÿšý~l4|w`y¼zvAr ²m$(ghaRèZ„+S!K:—Bãñ: 0úB'‘¡ã 2 ±Tõôùë÷€â!|ØrÌϧÅç½ ´Â´¬ÜZ¥žªì˜p¡’ÞFóɉ½£†Döƒ‰·“F€dÀ€€e “؃ˆ²†C‰¿ñÎ’Ûÿ˜rÄž­I¥| ¬ß´Å¥½OÅã7ÏØn¦â>ëûõø™ÿý÷ QÊÞÍ'{0ýž:)Bà8K=‰S#ßZaUEg‹m!ár YvBzy»!|v[~lÅ›Fÿÿšò~l|w=y¼Lv@Ürm#ÚgaR‡ZƒÂS ©K:Bãq:‡0ù¸'‘âzŸ ¾õôdëöìâ êØr>ÏÅæ•½ˆ´Â;¬Ûè¥~¶žª‹˜pI’Ýøó…‰½j†Dȃ‰”“/€d´€€e“ՆCˉ¿@ò’ÜM˜sž¨x¥|s¬ß´Æ½ÏÅã¼ÏØo4âÏëû«õñ5ÿþŒ æ ^ß^'Ž 0þ(:®Bà¸K>S;ZaU¦gãm"/r vB³y»O|v~~lÝš±ÿÿšæ~l|wy¼v@£r Ìm#ŒgŒ¸aWXZƒXS 8K9¥Bâò:0ù.'…áè )õóÏëöYâ YØq°Ï“Åæ½´Á¬ጥ~Lžª*˜oñ’ݪóA‰½1†Dšƒ‰q“€eI€€e ”ƒˆø†Cù‰¿zòV’Ü›˜stž¨Ù¥|ݬà´Æ—½NÅäAÏØoÂâ`ëü?õñÊÿÿ" { ñßð'Ž—0þ²:3Bá7K>zS­ZéaVg‹‡m"}r ávBìy»~|v¡~lôš½ÿÿšÚ~m.|v÷y»ðv@jr ˆm#>gŒ`aV÷Z‚îSÆK?¥Bâr:|0ø¤'÷áWw ì“õó:ëý¬âÈØq!Ï Å劽‰´ÁI¬á¥}➩ɘtM’Ý\òý‰¼÷†Dkƒ‰N“€e=€€e,’Þƒ‰†D'‰¿³ò™’Üé˜sÌž©:¥}G¬às´À—½ÍÅäÆÏ¡ØpPâòëüÒõò_ÿÿ· žà'&0ÿ<:¸Bá·K>óSZ‚SaVhg‹ßm"Ër %vC%y»¬|vÄ~m šÉÿÿšÎ~m|vÔy»Âv@0r Em"ðgŒaV–Z‚…STK?,Báó:÷0ø'iàÆä Wÿÿþõò¥ëýâ6Øp“ÏãÅå½ ´ÀЬਥ}xž©g˜sõ’Ýòº‰¿Î†D=ƒ‰+’é€e1€€e8’õƒ‰=†DV‰¼ÜòÝ’Ý7˜t$ž©›¥}°¬àä´Á½MÅåKÏÇØpÞâƒëýfõòôM ¥2á'´0øb:=Bâ6K?lSZ‚¼aVÉgŒ6m#r hv@Oy»Ú|væ~m#šÕÿÿšÃ~lÿ|v±y»“vCr m"¢g‹°aV5Z‚SãK>´Bás:r0þô'ŽÛà4P Âÿÿhõòëü…â¥ØpÏXÅ䀽Š´ÀW¬à7¥}ž©˜sž’ÜÀòv‰¿•†Dƒ‰’Ñ€e&€€eC“ ƒ‰`†D„‰½ó!’Ý…˜t|ž©ü¥~¬áV´Á‰½ÌÅåÑÏQØqmâ ëöõó‰â :Åá¤'B0øí:ÃBâ¶K9lS Zƒ&aW*gŒŽm#gr ¬v@ˆy¼|w ~kúšàÿÿš·~lè|vŽy»evBÎr ½m"Tg aUÔZ±SqK>;Bàô:í0þi'ŽLߣ £ -ÿþÓõñ{ëûñâØowÏÎÅãû½ ´ÆW¬ßÅ¥|¥ž¨¥˜sF’Ürò2‰¿[†C჈å“ú€e€€eO“$ƒ‰ƒ†D²‰½Oóe’ÝÓ˜p žª]¥~„¬áȴ½LÅæVÏÜØqûâ ¦ëö§õôx ÏYâ5'Ð0ùw:HBã5K9åS tZƒaW‹gŒæm#µr ðv@Áy¼6|w,~lšìÿÿ›L~lÐ|vky»7vB•r ym"g´aUsZHS$K=ÂBàu:h0ýß'¾ß  ˜ÿþ>õøàëû]â‚ØnéÏDÅãv½‹´ÅÞ¬ßT¥|;ž­v˜rî’Ü$ñ"†C³ƒˆÂ“ã€e€€dº“;ƒ‰¦†Dà‰½ˆó©’Þ!˜pxžª¾¥~í¬Ü$´Â{½ËÅæÛÏfØr‰â!7ë÷:õô³ kíâÆ'‘^0ú:ÍBã´K:^S åZƒùaRºg>m$r4v@úy¼e|wO~l)šøÿÿ›@~l¹|vIy» vB[r 5m!¸g\aUZ€ÞS#£K=IBßõ:â0ýU'0Þ€| ÿý¨õøKëúÊâñØn[ϺÅâð½ ´Åe¬Þâ¥{Òž­˜r–’ÛÕõL‰¾é†C„ƒˆŸ“Ì€e€€dÆ“Sƒ‰É†B•‰½Áóí’Þp˜pÏž«¥W¬Ü–´Âô½ KÅà?ÏðØsâ!Èë÷ÎõõH£ €ãX'ŠQ0ú‹:RBä4K:×S!WZ„caSg–m$Rr ÖvA4y¼“|wr~l@›ÿÿ›4~l¢|v&y½SvB"r ñm!igaT°Z€tS#1K<ÐBßv:~0üË'Œ¢Ýïè nÿýõ÷¶ëú6â`ØuhÏ0Åâk½Œ´Äì¬Þp¥{hž¬´˜r>’Û‡õ‰¾°†CVƒˆ}“´€d÷€€dÑ“jƒ‰ì†Bĉ½úô1’Þ¾˜q'ž«€¥Á¬Ý´Ãm½ ÊÅàÅÏzØs¥â"ZëøaõõÝ8 •ãé'Šß0û:×BÝáK;PS!ÉZ„ÍaS|gîm$ r vAmy¼Á|u·~lX›ÿÿ›)~lŠ|vy½%vAér ­m%IgŽ­aTOZ€ S"ÀKÿÿšú~l-|wUy¼mvAr@m$gMaRËZ„ S ùK:sBãË:ä0ú'‘wâà …'õôÍë÷Tâ!PØr¢Ï~Åæò½á´Â¬Ü8¥žªÏ˜p‡’Þ/󵉽’†D胉¬“?€d¼€€e “߃ˆ¼†C«‰¿ñâ’ܘrßž­e¥|)¬ß@´ÅɽuÅã^Ï,ØnÐâiëûDõøÆÿþ# ~öÞø'¦0ýÇ:PBà^K=­S$Z5aUbg¥m!ør mvB‹y»/|ve~lÌ›Jÿÿšî~l|w2y¼>v@Ër üm#ÃgŒõaRjZƒ¢S ‡K9úBãK:_0ù'éâNs é’õô8ëöÀâ ¿ØrÏôÅæm½b´Â¬áÜ¥~–žªn˜p/’Ýáóq‰½Y†Dºƒ‰‰“(€eQ€€e“öƒˆß†CÙ‰¿Rò&’Üd˜s6ž¨”¥|“¬ß±´ÆB½ôÅãä϶Øo^âúëû×õñaÿþ¹  Šߊ'Ž40þQ:ÖBàÞK>&S]ZŸaUÃgým"Fr ±vBÄy»]|vˆ~läšµÿÿšâ~kþ|wy¼v@’r ¸m#ugŒžaW;Zƒ8S K9BâÌ:Ú0ù'[á½ß Tüõó£ëö-â .Øq…ÏjÅåè½â´Áž¬áj¥~,žª ˜o×’Ý“ó-‰½ †DŒƒ‰f“€eE€€e$”ƒ‰†D‰¿‹òj’ܲ˜sŽž¨ö¥|ü¬à#´ÀB½tÅäiÏ@ØoìâŒëükõñöÿÿN ¨6à'ŽÂ0þÜ:[Bá]K>žSÏZ‚aV$g‹¡m"”r õvBýy»‹|v«~lûšÁÿÿš×~m'|víy»âv@Yr tm#'gŒFaVÚZ‚ÏS¤K?BâL:U0øz'Íá,K ¿gõóëý€âœØp÷ÏßÅåc½c´Á%¬àø¥}Þ©¬˜t3’ÝEò鉼æ†D^ƒ‰C’ù€e:€€e/’僉%†D5‰¿Äò®’ݘsæž©W¥}f¬à•´À»½óÅäîÏËØp{âëüþõò‹ÿÿä =Êà¬'P0ÿf:àBáÝK?SAZ‚raV…g‹ùm"âr 9vC6y»º|vÎ~mšÌÿÿšË~m|vÊy»´vC/r 0m"Ùg‹îaVyZ‚eS2K?BáÍ:Ï0ÿU'>àš¸ *ÿÿÑõòyëüìâ ØpiϹÅäݽä´À¬¬à‡¥}Yž©K˜sÛ’Ü÷ò¥‰¿½†D/ƒ‰!’â€e.€€e;’üƒ‰H†Dc‰¼íòò’ÝN˜t>ž©¸¥}Ьá´Á4½sÅåsÏñØq â®ëý’õó y Ò^á>'Þ0øŒ:eBâ\K?S²Z‚ÜaVægŒQm#0r }v@`y»è|vñ~m*šØÿÿš¿~lø|v§y»†vBör ím"‹g‹–aVZûSÁK>BáM:J0þÊ'ްà $ •ÿÿ<õñäëüYâzØoÛÏ/ÅäX½d´Æ¬¬à¥|é˜sƒ’Ü©òa‰¿„†Dƒˆþ” €e"€€eG“ƒ‰k†D‘‰½'ó5’Ýœ˜o➪¥~9¬áx´Á­½òÅåøÏ{Øq—â @ëö?õóµ gñáÏ'l0ù:êBâÜK9S $ZƒFaWGgŒ©m#r Àv@™y¼|w~lšäÿÿš³~lá|v„y»WvB½r ©m"BàÎ:Å0þ@'Ž"ßx w ÿþ¦õñOëûÅâèØoMÏ¥Åãӽ崯3¬ß£¥|†ž¨ˆ˜s,’ÜZò‰¿J†CÓƒˆÛ“ó€e€€eR“+ƒ‰Ž†DÀ‰½`óy’Ýë˜p:žªz¥~£¬áê´Â&½rÅæ~ÏØr%â ÑëöÓõôJ¤ …â`'ú0ù :oBã[K: S –Zƒ¯aRvgm#Írv@Òy¼D|w7~lšðÿÿ›H~lÊ|vay»)vB„r em!îgšaUVZ(S#óK=žBàO:@0ý¶'”Þæä kÿþõø³ëû1âWØn¿ÏÅãN½e´Åº¬ß2¥|ž­Y˜rÔ’Ü ñÚ‰¿†C¥ƒˆ¸“Ü€e €€d¾“Bƒ‰°†D™ó½’Þ9˜p’žªÛ¥ ¬ÜF´ÂŸ½ñÅçÏØr³â!bë÷fõôß: —âò'‘‰0ú*:õBãÚK:‚S!Z„aR×gXm$rHvA y¼r|wZ~l0šûÿÿ›=~l²|v>y½tvBJr !m! gBaTõZ€¾S#K=%BßÏ:Ü0ý,'ÞUP Öÿý|õøëúžâÆØuÌÏ‘Åâɽæ´ÅA¬ÞÀ¥{²ž¬ø˜r|’Û¾õ8‰¾Ø†Cwƒˆ•“Å€dÿ€€dÉ“Zƒ‰Ó†B£‰½Òô’Þ‡˜pêž«<¥w¬Ü¸´Ã½ qÅàgÏØsAâ!ôë÷úõõtÏ ,¬ãƒ'Š{0ú´:zBäZK:ûS!yZ„ƒaS8g°m$ir êvAEy¼ |w|~lG›ÿÿ›1~l›|vy½FvBr Ým!RgŽêaT”Z€US#K<¬BßP:V0ü¢'ŒxÝļ Aÿüæõ÷‰ëú â4Øu>ÏÅâD½f´ÄȬÞN¥{Iž¬—˜r$’Ûpôô‰¾Ÿ†CHƒŠP“­€dó€€dÕ“qƒ‰ö†Bщ¾ ôE’Ú§˜qAž«¥à¬Ý)´Ã‘½ ðÅàìÏ£ØsÏâ¾ëøõö e Á@ä'‹ 0û>:ÿBÞK;tS!êZ„ìaS™gŽm$·r .vA~y¼Ï|uÁ~l^›ÿÿ›%~lƒ|uøy½vAØr ™m%2gŽ“aT2ZëS"žK<3BÞÐ:Ñ0ü'‹éäú) ¬ÿüQõöôëùvâ£Øt°Ï}Åá¾½!¹´ÄO¬ÝÝ¥zßž¬6˜qÌ’Û"ô°‰¾f†CƒŠ-“–€d瀀dᓈƒŠ†C‰¾Eô‰’Úõ˜q™ž«þ¥€J¬Ý›´Ä ½!oÅáqÏ-Øt^âOëù!õöžú VÓä¦'‹—0ûÈ:„BÞ‡K;íS"\Z®aSúgŽ`m%r rvA·y¼ý|uä~lv›ÿÿ›~ll|uÕy¼évAŸr Um$ägŽ;aSÑZ…)S",K;ºBÞQ:L0ûŽ'‹[äh• »õö_ëøãâØt"ÏóÅá9½!:´Ã׬Ýk¥€ž«Õ˜qt’ÚÔôl‰¾,†B샊 “~€dÜ€€dì“ ƒŠ<†C.‰¾~ôÍ’ÛC˜qñž¬_¥{ ¬Þ ´Ä‚½!ïÅá÷Ï·Øtìâàëùµõ÷3ÿü ëgå7'Œ%0üR: BßKvBcy»|vM~l¼›Bÿÿšö~l&|wKy¼_v@ór,m#úg3aR®ZƒìS ×K:OBã¥:¼0ùð'‘Mâ´Ú Xûõô ë÷(â!%ØrwÏUÅæË½»´Âl¬Ü¥~àžª²˜pm’Þ󡉽†DÚƒ‰¢“8€d¹€€e“惈džC¸‰¿)ñö’Ü-˜rùž­‚¥|H¬ßb´Åí½›Åã†ÏUØnúâ”ëûpõøòÿþP ª "ß$'Ð0ýñ:xBà„K=ÑS$#ZUaUg¿m"r vBœy»=|vp~lÓš­ÿÿšë~l|w(y¼1v@ºr èm#¬gŒÛaWZƒƒS fK9ÖBã%:70ùf'¾â#G ½eõô ëö”â ”ØqéÏÊÅæE½<´Áó¬áº¥~wžªQ˜p’ÝÊó]‰½H†D¬ƒ‰“!€eN€€e“ýƒˆé†C承cò:’Ü{˜sQž¨±¥|²¬ßÓ´Æf½Åä ÏàØo‰â&ëüõñÿþå ? ¶ßµ'Ž^0þ{:ýBáK>JSZ¾aUàgm"]r ÅvBÕy»k|v“~l뚸ÿÿšß~k÷|wy¼v@r ¤m#^gŒƒaWZƒSôK9]Bâ¦:²0øÛ'0á’³ (Ðõóvëýçâ Øq[Ï@ÅåÀ½¼´Áz¬áH¥~ ž©ð˜tq’Ý|󉽆D~ƒ‰\“ €eB€€e'’Ôƒ‰ †D‰¿œò~’Üɘs¨ž©¥}¬àE´Àf½šÅäÏjØpâ·ëü—õò"ÿÿ{ ÔbàF'Žì0ÿ:‚BáƒK>ÃSñZ‚(aVAg‹»m"¬r vCy»™|v¶~mšÄÿÿšÓ~m |vây»Ôv@Hr `m#gŒ,aV½Z‚¯S‚K?]Bâ&:-0øQ'¢á “:õòáëýTâqØpÍ϶Åå;½=´Á¬àÖ¥}£ž©˜t’Ý-òÕ‰¼Õ†DPƒ‰9’ò€e6€€e3’색/†DC‰¿Õò’ݘtž©t¥}†¬à·´Àß½ÅåÏØp¥âHëý*õò¸ iöàØ'z0ø+:BâK?;SbZ‚’aV¢gŒm"úr Mv@8y»Ç|vØ~mšÐÿÿšÇ~m |v¿y»¦vCr m"Ág‹ÔaV\Z‚FSK>äBá§:¨0ÿ+'àoŒ þÿÿ¥õòLëüÀâàØp?ÏÅä¶½¾´Àˆ¬àe¥}9ž©.˜sÁ’Üßò‘‰¿¬†D"ƒ‰’Û€e*€€e>“ƒ‰R†Dq‰¼þó’Ýf˜tXž©Õ¥}ï¬á(´ÁX½™Åå›ÏØq3âÚëý¾õóM¦ þŠái'0øµ:Bâ‚K?´SÔZ‚ûaWgŒkm#Hr ‘v@qy»õ|vû~m1šÜÿÿš¼~lñ|vœy»xvBår Øm"sg0aUûZÜSŸK>kBá':#0þ¡'ކßÞ ß iÿÿõñ·ëü-âNØo°ÏÅä1½>´Æˆ¬ßó¥|О¨Í˜si’Ü‘òM‰¿s†Cóƒˆó”€e€€eJ“ƒ‰u†DŸ‰½8óJ’Ý´˜oüžª6¥~Y¬áš´ÁѽÅæ ϤØqÁâ këökõóâ; “áú'—0ù?:BãK9´S FZƒeaWdgŒÃm#–r Õv@ªy¼$|w~lšçÿÿš°~lÚ|vzy»JvB¬r ”m"%gØaUšZrS-K=óBà¨:0þ'øßL K Ôÿþzõñ"ëû™â½Øo"Ï|Å㫽¿´Æ¬ß¥|fž­ž˜s’ÜCò ‰¿9†CŃˆÐ“ì€e€€dµ“2ƒ‰˜†D͉½qó’Þ˜pTžª—¥~ìÛö´ÂJ½˜Åæ¥Ï.ØrOâ üëöÿõôwÑ /±âŒ'‘%0ùÉ:—BãK:-S ·ZƒÏaR“gm#ärv@ãy¼R|wA~lšóÿÿ›E~lÃ|vWy»vBsr Qm!×g€aU9Z S#ÑK=zBà):0ý'jÞ»¸ ?ÿýäõø‡ëûâ,Øn”ÏòÅã&½?´Å–¬ß¥{üž­=˜rº’ÛõñƉ¿†C—ƒˆ®“Õ€e€€dÁ“Iƒ‰»†Dü‰½ªóÑ’ÞP˜p¬žªø¥,¬Üh´Âý Åç*ϸØrÞâ!Žë÷’õõ f ÄEã'Š0úS:BäK:¦S!)Z„8aRôgrm$2r »vAy¼€|wd~l7šÿÿÿ›9~l«|v4y½fvB9r m!‰g(aTØZ€ŸS#_K=Bß©:´0ý'ŒÛÞ*$ ªÿýOõ÷òëúrâšØu¢ÏhÅ⡽À´Å¬Þž¥{“ž¬Û˜rb’Û§õ#‰¾Ç†Ciƒˆ‹“¾€dû€€dÍ“aƒ‰Þ†B±‰½ãô’Þž˜qž«Y¥–¬ÜÚ´Ã<½ —ÅàÏBØslâ"ëø&õõ¡ü YØã®'Š¥0úÝ:¢Bä€K;S!›Z„¢aSUgÊm$€r þvAVy¼®|w‡~lN› ÿÿ›-~l”|vy½8vBr Ém!;gŽÐaTwZ€5S"îK<ˆBß*:/0üy'ŒMå` ÿüºõ÷]ëùÞâ ØuÏÞÅâ½"´Ä¤¬Þ,¥{)ž¬z˜r ’ÛYôà‰¾Ž†C;ƒŠF“¦€dð€€dØ“xƒŠ†B߉¾ôY’Ú¾˜q\ž«º¥€¬ÝK´Ãµ½!ÅáÏÌØsúâéëø¹õö6‘ îlä@'‹30ûg:'BÞ-K;˜S" Z… aS¶gŽ"m$Îr BvAy¼Ü|uÌ~le›ÿÿ›"~l||uîy½ vAÇr …m%gŽxaTZËS"|K<BÞª:©0ûï'‹¿äÏý €ÿü$õöÈëùJâxØt…ÏTÅá—½!“´Ä+¬Ý»¥z¿ž¬˜q²’Û ôœ‰¾U†C ƒŠ#“€d䀀d䓃Š$†C ‰¾Vô’Û ˜q´ž¬¥zÁ¬Ý½´Ä.½!•Åá™ÏVØtˆâzëùMõöËÿü' ƒÿäÑ'‹Â0ûñ:¬BÞ­K<S"~ZÍaTgŽzm%r †vAÈy½ |uï~l}›"ÿÿ›~le|uËy¼ÜvAŽr Am$ÍgŽ!aS´Z… S" K;–BÞ+:$0ûe'‹1ä=i ëõö3ëø·âæØs÷ÏÊÅá½!´Ã³¬ÝI¥þž«¸˜qZ’Ú½ôX‰¾†BÞƒŠ“w€dØ€€d𓧃ŠF†C<‰¾ôá’ÛZ˜r ž¬|¥{+¬Þ.´Ä§½"ÅâÏàØuâ ëùáõ÷`ÿü¼ “åb'ŒP0ü{:1Bß,K<ŠS"ðZ€7aTxgŽÒm!¥{þ¬ß´Å˜½BÅã)ÏôØn—â.ëûõøŠÿýç BºÞ¾'l0ý:Bà+K=|S#ÓZ aU:g‚m!Ør RvBty»|vW~lÛEÿÿšó~l|w@y¼Qv@ârm#ãgaR‘ZƒÍS µK:+Bã:•0ùÆ'‘"≮ ,Îõôtëöüâ úØrMÏ+Åæ£½•´ÂH¬Ûô¥~Ážª•˜pS’Þ󌉽p†D̓‰—“1€dµ€€e“탈цCƉ¿:ò ’ÜE˜sž¨m¥|h¬ßƒ´Æ½ÁÅã®ÏØo%â¿ëûœõñ%ÿþ} × NßO'ú0þ: BàªK=õS/ZtaUœgÙm"'r –vB­y»J|vz~lÚš°ÿÿšç~l|wy¼#v@©r Óm#”gŒÁaWbZƒcS DK9²Bâÿ:0ù<'”áø ‘9õóßëöhâ hØq¿Ï¡Åæ½´ÁϬᘥ~Wžª4˜oû’ݲóH‰½7†Džƒ‰t“€eJ€€e”ƒˆô†Cô‰¿tòN’Ü“˜skž¨Î¥|Ò¬ßõ´ÆŠ½@Åä3Ï Øo³âQëü/õñºÿÿ l âßà'Žˆ0þ¤:%Bá*K>nS¡ZÞaUýg1m"ur ÙvBæy»y|v~lòš¼ÿÿšÛ~m0|vûy»õv@pr m#FgŒiaWZ‚ùSÒK?²Bâ€:Š0ø²'áf‡ ü£õóJëý»âרq1ÏÅ嘽—´ÁV¬á&¥}힩ӘtW’Ýdó‰¼ý†Dpƒ‰R“€e>€€e+’Ûƒ‰†D"‰¿­ò’’Üá˜sÞ©/¥};¬àg´ÀнÀÅä¸Ï“ØpAââëüÃõòOÿÿ§ Žàr'0ÿ.:ªBá©K>çSZ‚GaV^g‹Õm"Ãr vCy»§|vÀ~m šÈÿÿšÐ~m|vØy»Æv@7r Lm"øgŒaV Z‚S`K?9Bâ:0ø('xàÕó gõòµëý(âFØp¢ÏÅå½´Àݬ൥}„ž©r˜sÿ’ÝòÁ‰¿Ô†DBƒ‰/’ë€e3€€e6’óƒ‰:†DQ‰¼ÖòÖ’Ý/˜tž©¥}¥¬àØ´Á½?Åå=ϹØpÏâtëýVõòä= –"á'¥0øT:/Bâ)K?_S„Z‚±aV¿gŒ-m#r av@Iy»Õ|vã~m šÓÿÿšÄ~m|vµy»˜vC r m"ªg‹ºaV?Z‚&SïK>ÀBá:€0ÿ'ŽêàD` Òÿÿxõò ëü”â´ØpÏgÅ䎽˜´Àd¬àC¥}ž©˜s§’ÜÈò}‰¿›†Dƒ‰ ’Ô€e'€€eB“ ƒ‰]†D‰½ó’Ý}˜trž©ñ¥~¬áJ´Á|½¿ÅåÃÏCØq]â ëöõóyÒ +¶á”'30øÞ:´Bâ¨K9_SöZƒaW gŒ…m#_r ¥v@‚y¼|w~k÷šßÿÿš¸~lê|v’y»jvBÔr Äm"\gaUÞZ¼S}K>GBá:û0þx'Ž\ß² ³ =ÿþãõñ‹ëüâ#Øo†ÏÝÅä ½´Æd¬ßÑ¥|°ž¨°˜sO’Üzò9‰¿b†C惈é“ý€e€€eN“!ƒ‰†D­‰½Ió^’ݢpžªS¥~x¬á¼´Áõ½>ÅæHÏÍØqìâ –ëö—õôh ÀIâ&'Á0ùh::Bã(K9ØS hZƒ…aWgŒÝm#­r év@»y¼1|w)~lšëÿÿš¬~lÓ|voy»›ÿÿ›6~l¤|v)y½XvB(r ùm!rgaT»Z€S#=K<ÝB߃:Œ0üÚ'Œ±Ýþø ~ÿý"õ÷ÆëúFâoØuwÏ?Åây½š´Äù¬Þ|¥{sž¬¾˜rG’Ûõ‰¾¶†C[ƒˆ€“·€dø€€dГgƒ‰è†B¿‰½ôô)’Þµ˜qž«v¥¶¬Üû´Ã`½ ½Åà¶ÏkØs–â"JëøRõõÍ( …ãÚ'ŠÐ0û:ÉBÝÔK;CS!½Z„ÂaSrgäm$—r vAgy¼¼|u³~lU›ÿÿ›*~l|vy½*vAïr µm%Rg޶aTZZ€S"ÌKSQZ”aU¸gôm">r ªvB¾y»X|v…~láš´ÿÿšä~l|wy¼v@˜r ¿m#}gŒ§aWEZƒDS "K9ŽBâÙ:è0ù'jáÍï d õó²ëö<â =Øq”ÏxÅåö½ð´Á«¬áv¥~8žª˜oá’Ý›ó4‰½&†D‘ƒ‰j“€eG€€e"” ƒˆþ†D‰¿…òc’ܪ˜s…ž¨ë¥|ñ¬à´Æ®½fÅä[Ï2ØoÝâ|ëü[õñæÿÿ? ˜'à '޳0þÍ:MBáPK>’SÃZýaVg‹˜m"Œr îvB÷y»†|v§~lùš¿ÿÿšØ~m)|vðy»çv@_r {m#/gŒOaVäZ‚ÚS°K?ŽBâZ:c0ø‰'Üá;[ Ïwõóëýâ¬ØqÏîÅåq½q´Á2¬á¥}Ξ©¶˜t<’ÝMòð‰¼ì†Dbƒ‰G’ü€e;€€e.’⃉!†D0‰¿¾ò§’Üø˜sÝž©L¥}[¬à‰´À®½æÅäàϼØpkâ ëüïõò{ÿÿÔ -ºà'A0ÿW:ÒBáÏK? S4Z‚gaV{g‹ïm"Úr 2vC0y»µ|vÊ~mšËÿÿšÌ~m|vÍy»¹vC5r 8m"ág‹÷aVƒZ‚pS?K?BáÚ:Þ0ÿc'MàªÇ :ÿÿáõòˆëüüâØpxÏÈÅäì½ñ´À¹¬à“¥}dž©U˜så’Üÿò­‰¿Ã†D4ƒ‰$’ä€e/€€e:’úƒ‰D†D^‰¼çòê’ÝF˜t5ž©­¥}Ŭàú´Á'½eÅåeÏâØpúâŸëý‚õói ÂNá.'Ï0ø}:WBâOK?ƒS¦Z‚ÑaVÜgŒGm#(r uv@Zy»ã|ví~m'š×ÿÿšÀ~lû|vªy»‹vBür ôm"“g‹ŸaV"Z‚SÍK>œBá[:X0þÙ'Ž¿à4 ¥ÿÿLõñóëühâ‰ØoêÏ>Åäf½r´À@¬à!¥|úž¨ô˜s’ܱòi‰¿Š†Dƒ‰” €e#€€eE“ƒ‰g†D‰½!ó.’Ý”˜oÙžª¥~.¬ál´Á ½åÅåêÏlØqˆâ 0ëö/õó¥ÿ WâáÀ']0ù:ÜBâÎK9„S Zƒ:aW=gŒŸm#vr ¹v@“y¼|w~kþšãÿÿšµ~lã|vˆy»\vBÃr °m"EgûaUÁZS[K>#BàÜ:Ó0þO'Ž1߇ ‡ ÿþ¶õñ^ëûÕâøØo\Ï´Åãá½ò´Æ@¬ß¯¥|‘ž¨“˜s5’Ücò%‰¿Q†C؃ˆÞ“ö€e€€eQ“(ƒ‰Š†D»‰½Zór’Ýâ˜p1žªo¥~˜¬á޴½dÅæoÏöØrâ ÁëöÃõô:” ìuâQ'ë0ù‘:aBãMK9üS ‰Zƒ¤aRlgŒ÷m#Är ýv@Ìy¼?|w3~lšîÿÿ›J~lÌ|vey».vBŠr lm!÷g£aU`Z3S#ÿK=«Bà\:N0ýÅ'£Þöó {ÿþ!õøÃëûAâfØnÎÏ*Åã\½s´ÅǬß>¥|'ž­d˜rÝ’Üñቿ†Cªƒˆ¼“Þ€e €€d¼“@ƒ‰­†D鉽“ó¶’Þ0˜pˆžªÑ¥¬Ü:´Â’½äÅæõÏ€Ør¤â!Së÷WõôÏ* ‡ ââ'‘y0ú:çBãÍK:uS ûZ„aRÍgOm$rAvAy¼m|wV~l-šúÿÿ›>~lµ|vBy»vBQr (m!©gLaTÿZ€ÊS#K=2BßÝ:ê0ý;'Þd` æÿý‹õø.ëú­âÕØuÛÏ Åâ×½ó´ÅN¬ÞÌ¥{½ž­˜r…’ÛÇõ?‰¾Þ†C|ƒˆ™“Ç€e€€dÈ“Wƒ‰Ð†Bž‰½Ìóú’Þ˜pàž«2¥k¬Ü¬´Ã ½ cÅàYÏ Øs2â!äë÷êõõd¿ œãt'Šl0ú¥:lBäLK:îS!mZ„waS.g§m$ar ãvA?y¼œ|wy~lE›ÿÿ›2~l|vy½KvBr äm!ZgŽôaTžZ€`S#K<¹Bß]:d0ü±'Œ‡ÝÓÌ Qÿüöõ÷™ëúâDØuMÏÅâR½t´ÄÕ¬ÞZ¥{Tž¬¢˜r-’Ûxôû‰¾¥†CMƒˆv“°€dô€€dÔ“nƒ‰ó†B̉¾ô>’ÚŸ˜q8ž«“¥Õ¬Ý´Ã„½ ãÅàÞÏ”ØsÀâ®ëø~õõùU ±0ä'Šú0û/:ñBÝúK;gS!ÞZ„áaSgÿm$¯r 'vAxy¼Ê|u¾~l\›ÿÿ›&~l†|uüy½vAÞr  m%:gŽœaT=ZöS"ªK<@BÞÞ:ß0ü''‹ùå 8 ¼ÿü`õ÷ëù†â²Øt¿ÏŒÅáͽ!Ç´Ä\¬Ýé¥zꞬ@˜qÕ’Û*ô·‰¾l†CƒŠ1“˜€d退dß“†ƒŠ†Bû‰¾>ô‚’Úí˜qž«ô¥€?¬Ý´Ãý½!bÅácÏØtOâ?ëùõöŽê FÄä–'‹ˆ0ûº:vBÞyK;àS"PZ…KaSðgŽVm$ýr kvA±y¼ø|uà~ls›ÿÿ›~ln|uÙy¼îvA¥r ]m$ìgŽDaSÜZ…5S"8K;ÇBÞ^:Z0û'‹jäx¥ 'Ëõöoëøòâ!Øt1ÏÅáG½!G´Ãã¬Ýw¥€)ž«ß˜q~’ÚÜôs‰¾2†BñƒŠ“€dÝ€€d듃Š8†C)‰¾xôÅ’Û;˜q螬U¥{¬Þ´Äv½!áÅáèϨØtÝâÑëù¥õ÷#ÿü€ ÛWå('Œ0üD:ûBÞøK=SsZ³aUÕgm"Ur ¾vBÏy»f|v~lèš·ÿÿšà~kú|w y¼v@‡r «m#fgŒaW(Zƒ$S K9jBâ³:À0øê'?á¡à 8àõó†ëöâ ØqjÏOÅåνÊ´Á‡¬áT¥~ž©ú˜tz’Ý„ó ‰½†Dƒƒ‰`“ €eC€€e&’Òƒ‰ †D‰¿–òw’ÜÁ˜sŸž©¥}¬à9´ÀY½ŒÅä‚Ï[Øpâ§ëü‡õòÿÿk ÄSà7'ŽÝ0þö:tBávK>¶SåZ‚aV6g‹²m"£r vCy»”|v²~mšÃÿÿšÔ~m#|væy»Ùv@Nr gm#gŒ5aVÇZ‚»SŽK?jBâ4:;0ø`'±á/ £Jõòñëýcâ€ØpÜÏÅÅåI½K´Á¬àâ¥}®ž©™˜t"’Ý6ò܉¼Û†DUƒ‰=’õ€e7€€e2’郉,†D>‰¿Ïò»’ݘs÷ž©i¥}z¬à«´ÀÒ½ ÅåÏåØp–â9ëýõò¨ YæàÈ'k0ø:ùBáõK?/SVZ‚†aV˜gŒ m"ñr Fv@2y»Â|vÕ~mšÏÿÿšÉ~m |vÃy»«vC$r #m"Êg‹ÝaVfZ‚QSK>ñBá´:¶0ÿ:'#à› ÿÿµõò\ëüÐâïØpNÏŸÅäĽË´À•¬àq¥}Ež©8˜sÊ’Üèò˜‰¿²†D'ƒ‰’Ý€e,€€e=“ƒ‰N†Dl‰¼øòÿ’Ý]˜tOž©Ê¥}ä¬á´ÁK½‹ÅåÏ Øq$âÊëý®õó=– îzáZ'ù0ø¦:BâuK?¨SÈZ‚ðaVùgŒbm#?r Šv@ky»ñ|vø~m.šÚÿÿš½~lô|v y»}vBër ßm"|g‹…aVZçS«K>xBá5:10þ°'Ž•ßí ï yÿÿõñÇëü<â^ØoÀÏÅä?½L´Æ•¬ßÿ¥|Ûž¨×˜ss’ÜšòT‰¿y†Cøƒˆ÷”€e €€eI“ƒ‰q†Dš‰½2óB’Ý«˜oóžª+¥~N¬áŽ´ÁĽ ÅæÏ•Øq²â [ëö[õóÒ+ ƒáë'ˆ0ù0:BâôK9¨S :ZƒZaWZgŒ¹m#Žr Ív@¤y¼|w~lšæÿÿš±~lÜ|v}y»OvB²r œm"-gáaU¤Z}S9K=ÿBà¶:¬0þ&'Žß\ [ äÿþŠõñ2ëû©âÌØo1Ï‹Å㺽̴Ƭߥ|qž¨v˜s’ÜKò‰¿?†CʃˆÔ“ï€e€€d´“/ƒ‰”†Dɉ½kó†’Ýú˜pKžªŒ¥~·¬Ûê´Â=½ŠÅæ—ÏØr@â íëöïõôgÁ ¡â|'‘0ùº:‰BãsK: S «ZƒÄaR‰gm#Ürv@Ýy¼M|w=~lšòÿÿ›F~lÅ|vZy» vByr Xm!ßg‰aUCZS#ÝK=†Bà6:&0ýœ'yÞËÇ Oÿýôõø—ëûâ;Øn£ÏÅã4½M´Å£¬ß¥|ž­G˜rÃ’Ûýñ͉¿†Cœƒˆ±“Ø€e€€dÀ“Gƒ‰·†D÷‰½¤óÊ’ÞH˜p£žªí¥!¬Ü\´Â¶½ ÅçÏ©ØrÎâ!~ë÷‚õôüV ´5ã'‘¤0úD:BãóK:™S!Z„-aRêgim$*r ³vAy¼{|w`~l4šþÿÿ›:~l®|v7y½kvB?r m!‘g1aTâZ€ªS#kK=Bß·:Â0ý'ŒëÞ94 ºÿý_õøëúâªØu±ÏwÅ⯽Í´Å*¬Þª¥{žž¬æ˜rk’Û¯õ+‰¾Í†CnƒˆŽ“À€dý€€dË“^ƒ‰Ú†B¬‰½Ýô’Þ–˜púž«O¥‹¬ÜÍ´Ã/½ ‰ÅàÏ3Øs]â"ëøõõ‘ì IÈãŸ'Š–0úÎ:“BärK;S!Z„—aSKgÁm$xr ÷vAPy¼©|wƒ~lL› ÿÿ›/~l–|vy½=vBr Ðm!CgŽÚaTZ€@S"úK<•Bß7:=0üˆ'Œ\ݨ  %ÿüÉõ÷mëùîâØu#ÏìÅâ*½" ´Ä±¬Þ9¥{4ž¬…˜r’Ûaô牾”†C@ƒŠJ“©€dñ€€dדuƒ‰ý†BÚ‰¾ôR’Ú¶˜qRž«°¥õ¬Ý?´Ã¨½!ÅáϽØsëâÙëøªõö& Þ\ä0'‹$0ûY:BÞ K;‹S"Z…aS¬gŽm$Ær ;vA‰y¼Ø|uÈ~lc›ÿÿ›#~l|uòy½vAÍr Œm%#gŽ‚aT Z×S"ˆK<BÞ¸:¸0ûþ'‹ÎäÞ ÿü4õöØëùZâ‡Øt•ÏbÅ᥽!¡´Ä8¬ÝÇ¥zËž¬$˜q»’Ûô£‰¾[†CƒŠ'“‘€d倀dã“ƒŠ †C‰¾Pô–’Û˜qªž¬¥z¶¬Ý±´Ä!½!ˆÅá‹ÏHØtyâkëù=õö»ÿü sðäÂ'‹³0ûã:žBÞŸK<S"rZÂaT gŽqm%r vAÂy½|uë~lz›!ÿÿ›~lh|uÏy¼àvA”r Hm$ÕgŽ*aS¿Z…S"K;£BÞ8:20ûs'‹@äMy ûžõöCëøÆâöØtÏØÅá ½!!´Ã¿¬ÝU¥€ ž«Â˜qc’ÚÅô_‰¾!†Bナ“z€dÙ€€dƒŠC†C7‰¾‰ôÚ’ÛR˜rž¬r¥{ ¬Þ"´¾!½5ÅâÏÒØuâ#Äì¸õïVÿü¬ ƒåS'“Ü0õ :BßK<}S"äZ…ÔaY gŠm!4r ÃvAûy½4|wì~kQšŒÿÿ› ~lP|u¬yº9vDjr¦m$‡gÒaS^ZSKA£Bä‹:­0úé'вÛô Ì _ õõ®ëø3âdØkÝÏ ²Å绽 ¢´ÃF¬Üä¥y÷ž¦0˜u¿’Þ¥ô‰½è†Bµƒˆ”£€eo€€dú“¼ƒŠf†EÞ‰»²ñ|’Û ˜rZž¬Ó¥2¬äª´¾š½µÅâ•Ï\Øu•â$Uëò~õïëÿýB åä'”k0õ“:‡BßžK<öS#UZ†>aZgŠlm!‚r vB4y½b|x~kiš—ÿÿ›~l9|u‰yº vD1rbm$9gzaRýZ~šSKA*Bä :(0ú_'Š$Ûb 8 Êtõõë÷ŸâÓØkNÏ (Åç6½ "´ÂάÜr¥yŽž°3˜uh’ÞWó׉½¯†B‡ƒ‡à”Œ€ec€€e“ÓƒŠ‰†F ‰»ìñÀ’Ûî˜r²ž­4¥›¬Øñ´¿½4ÅãÏæØv#â$æëóõð€ÿý× 2«æv'”ù0ö: BàK=oS#ÇZ†§aOþgŠÄm!Ðr KvBny½|x1~k€š£ÿÿšô~l!|ufy¹ÝvCørm#ëg"aRœZ~0S&×K@±BãŒ:£0ùÕ'‰–ÚÑ ¥ 5Þõô„ë÷ âBØjÀÏ žÅæ±½£´ÂU¬Ü¥y$ž¯Ò˜u’Þ ó“‰½v†BYƒ‡½”t€eW€€e“ꃊ«†F:‰¼%ò’Ü<˜s ž­•¥‚¬Ùb´¿Œ½³Åã ÏpØv²â%xëó¥õñÿþm Ç >ç'†O0ö§:’BàK=èS$9Z‡aP_g‹m"r ŽvB§y½¾|xT~k—š¯ÿÿšè~l |uCy¾ vC¿r Ûm#gŒÊaR:Z}ÆS&eK@8Bã :0ùK'‰Ú@   Iõóïëöxâ°ØyjÏ Åæ,½#´Áܬۥxºž¯p˜t¸’Ý»óP‰½=†B+ƒ‡š”]€eK€€e”ƒŠÎ†Aw‰¼^òG’ÜŠ˜saž­ö¥‚o¬ÙÔ´À½3Åä%ÏúØw@â& ëô9õñªÿÿ \ Òç˜'†Ý0÷1:BáK>aS$ªZ‡{aPÀg‹tm"lr ÒvBày½í|xw~k¯š»ÿÿšÝ~kó|u y¾rvC†r —m#OgŒsaQÙZ}\S%óK?¿Bâ:™0øÁ'ˆyé= }  ³õóZëõäâØxÛÏŠÅå§½¤´Ác¬Û¥xQž¯˜t`’Ýmó ‰½†Aüƒ‹4”F€e@€€e)”ƒŠñ†A¥‰¼—ò‹’ÜØ˜s¹ž®W¥‚جÚE´À}½²ÅäªÏ„ØwÎâ ëôÌõò?ÿÿ˜ ñ eè*'‡l0÷»:œBáœK>ÚS%Z‡äaQ!g‹Ìm"ºr vCy¾|tÞ~kÆšÆÿÿšÑ~kÛ|týy¾DvCLr Sm#gŒaQxZ|óS%‚K?FBâ:0ø7'‡ëè¬ ê võòÅëõQâŽØxMÏÅå!½%´Àê¬Ú«¥wçž®®˜t’Ýòȉ¼Ê†A΃‹”.€e4€€e5”1ƒ‹†AÓ‰¼ÐòÏ’Ý'˜tž®¸¥wò¬Ú·´Àö½2Åå/ÏØx\âëõ`õòÔ- † ùè»'‡ú0øE:!BâK?SS%Z|þaQ‚gŒ$m# r ZvCRy¾I|u~kÞšÒÿÿšÅ~kÄ|tÚy¾vCr m"²g‹ÃaQZ‡ÙS%K>ÍBáŽ:Ž0÷­'‡]è V áÿÿˆõò0ëô½âüØw¿ÏvÅ䜽¥´Àq¬Ú:¥‚Ξ®M˜s°’ÜÐò„‰¼‘†A ƒŠî”€e(€€eA”Hƒ‹7†B‰½ ó’Ýu˜tiž¯¥x\¬Û)´Áo½±Åå´Ï˜Øxêâ.ëõôõóià  éL'ˆˆ0øÏ:¦Bâ›K?ÌS%ÿZ}gaQãgŒ|m#Wr žvC‹y¾w|u$~kõšÞÿÿš¹~k¬|xty½èvBÚr Ëm"dg‹kaP¶Z‡pS$žK>TBá: 0÷#'†Ïç‰ à Lÿþóõñ›ëô)â%úØw1ÏìÅä½&´¿ø¬ÙÈ¥‚dž­ì˜sX’Ü‚ò@‰¼X†ArƒŠË“ÿ€e€€eL”_ƒ‡ž†B/‰½CóW’ÝØtÁž¯z¥xŬۚ´Áè½1Åæ:Ï "Øyxâ¿ëö‡õóþX ° ÚO'‰0ùY:,BãK@DS&qZ}ÑaRDgŒÔm#¥r âvCÅy¾¥|uG~l šêÿÿš®~k•|xQy½ºvB¡r ‡m"g‹aPUZ‡S$-K=ÛBà:„0ö™'•xæø / ·ÿþ]õñëó–â%hØv£ÏbÅã’½¦´¿¬ÙV¥úž­‹˜s’Ü4ñü‰¼†F5ƒŠ¨“è€e€€eX”wƒ‡Á†B]‰½|ó›’Þ˜už¯Ü¥y/¬Ü ´Âa½°Åæ¿Ï ¬ØjÏâQë÷õô“í E ´Úà'‰¤0ùã:±Bã™K@½S&âZ~;aR¦g+m#ór&vCþy¹â|uj~l$šõÿÿš¢~k~|x.y½‹vBhr Dm!ÈgŠ»aOôZ†œS#»K=bBà:ÿ0ö'”êæg› "ÿýÈõðqëóâ$רvÏØÅã ½'´¿¬Øå¥ž­*˜r©’Ûæñ¹‰»æ†FƒŠ…“Ñ€e€€ed”Žƒ‡ä†BŒ‰½µóÞ’Þ_˜uqž¥Ù¥y™¬Ü~´ÂÚ½ 0ÅçDÏ 7Øk]ââë÷®õõ(ƒ Ú HÛr'Š20ún:6BäKA6S)Z~¤aSgƒm$ArivD7yº|uŒ~l;›ÿÿš–~kf|x y½]vB.r m!zgŠcaY÷Z†3S#IK<êBß‘:y0õ„'”\åÕ ÿý2õïÜëòoâ$FØu†ÏMÅ∽§´¾¬äž¥'ž¬É˜rQ’Û˜ñu‰»¬†EÙƒŠb“¹€dù€€ep”¦ƒˆ†Bº‰½îô"’Þ­˜uÉž¦:¥z¬Üï´ÃS½ ¯ÅçÉÏ ÁØkëâsëøBõõ½ o ÛÜ'ŠÁ0úø:»Bä˜KA¯S›ZaShgÛm$r­vDpyº>|u¯~lS› ÿÿšŠ~mÏ|wèy½/vAõr ¼m!,gŠ aY–Z…ÉS"ØKÃyºš|uõ~l›$ÿÿšs~m¡|w¢y¼ÓvAƒr 4m g‰\aXÔZ„öS!õK;BÞ:ê1®'’±ä!M Îÿûrõîìâ"’ØsÜϯÅàø½)´½#¬ãI¥êž«¦˜qI’Ú®ð©‰Á †ENƒ‰ù“s€dÖ€€e“’kƒˆo†CD‰¾šôî’ß—˜vО§]¥{?¬ÞD´Ä¾½"-ÅéYÎý—Øm–â'ëùýõ÷|Ù .ÿÉÝ·'Œk0ü–:KBæK6(SðZ€KaT‹gŽãm%yryv>üyºÉ|v~l™›0ÿÿšg~m‰|wy¼¥vAJr ðm Bg’kaXsZ„ŒS!ƒK;BÝ“:e1$'’#ã¹ 9ÿúÜõíˆëÿîâ"ØsNÏ%Åàs½ª´É›¬â×¥€ž«D˜pñ’Ú`ðe‰Àç†E ƒ‰Ö“\€dÊ€€eŸ’‚ƒˆ’†Cs‰¾Óõ2’ßæ˜mÀž§¾¥{©¬Þ¶´Å7½"­ÅéÞÎþ!Øn$â¹ëú‘õøn Ã\ÞH'Œù0ý :ÐBæ–K6¡SbZ€µaTìg;m%Çr½v?6yº÷|v;~l°›<ÿÿš[~mr|w]y¼vvAr ¬móg’aXZ„"S!K:BÝ:à1š'‘•âÿ& ¤ÿúGõüæëÿZâ!oØrÀÏ›Åßî½*´É"¬âe¥žªã˜pš’Úð"‰À®†Dòƒ‰´“D€d¿€€di’šƒˆµ†C¡‰¿ õv’à4˜nž¨¥|¬ß(´Å°½#,ÅêcÎþ«Øn²âJëû$õø¦ dðÞÚ'‡0ýª: UBçK7SÓZaUMg’m&rv?oy»%|v^~lÇ›Gÿÿ›‘~m[|w:y¼Hv@×r hm¥g‘¼aW±Zƒ¹S  K:BÜ”:Z1'‘âm’ ÿù²õüQëþÆâ ÞØr2ÏÅßi½«´Èª¬áô¥~¬žª‚˜pB’ÙÃ÷!‰Àu†D㉑“-€d³€€du’±ƒˆØ†Cω¿Eõ¹’à‚˜npž¨€¥||¬ß™´Æ(½#¬ÅܧÎÿ5Øo@âÛëû¸õù;™ úƒßk'Ž0þ4: ÚBç•K7“SEZˆaU®gêm&dr v?¨y»S|v~lß›Sÿÿ›…~mC|wy¼v@žr %mWg‘daWPZƒOS .K9›BÜ:#1†'yáÜþ zÿùõû¼ëþ3â LØq£Ï‡ÅÞã½+´È1¬á‚¥~Cžª!˜oê’Ùuö݉À;†D–ƒ‰n“€d§€€d’ȃˆû†Cý‰¿õý’àИnÈž¨á¥|æ¬à ´Æ¡½$+ÅÝ,Îÿ¿ØoÎâmëüKõùÐ/ ßü'ޤ0þ¾:!_BÚpK8 S·ZòaVgBm&²r Ev?áy»‚|v¤~lö›_ÿÿ›z~m,|vôy»ìv@er ám'eg‘ aVïZ‚åS¼K9"BÛ•:"’0ÿü'ëáKk åÿø‡õû'ëýŸâ»ØqÏýÅÞ^½%P´Ç¸¬á¥}Ùž©À˜o’’Ù'ö™‰À†Dgƒ‰K’þ€d›€€dŒ’àƒ‰†D+‰¿¸öA’ØÂ˜o ž©B¥}P¬à}´Ç½$«ÅݱÏIØp\âþëüßõúeÄ $«àŽ'20ÿH:!äBÚïK8…S(Z‚\aVpgšm'r ˆv@y»°|vÇ~m›jÿÿ›n~m|vÑy»¾v@,r m'g´aVZ‚|SKK8©BÛ:" 0ÿr']à¹× Pñõú’ëý â*Øp‡ÏsÅÝÙ½$Ñ´Ç?¬àŸ¥}ož©_˜o:’ØÙöV‰¿É†D9ƒ‰(’ç€d€€d˜’÷ƒ‰@†DY‰¿ñö…’Ù˜oxž©£¥}¹¬àî´Ç“½%*ÅÞ6ÏÓØpëâëýsõúúÿøZ ¹>á'À0ÿÒ:"jBÛoK8þSšZ‚ÅaVÑgòm'Nr Ìv@Ty»Þ|vé~m%›vÿÿ›b~lý|v®y»v?òr Ym&Ég\aV,Z‚SÙK80BÚ–:!‡0þè'ŽÎà(C »\õùýëüxâ˜ØoùÎÿéÅÝT½$Q´ÆÆ¬à-¥}ž¨þ˜nâ’Ø‹ö‰¿†D ƒ‰’Ï€d„€€d¤“ƒ‰c†Dˆ‰À*öÉ’Ù^˜oÏžª¥~#¬á`´È ½ÅÞ»Ï]Øqyâ !ëþõûÿøï NÒá°'N1\:"ïBÛîK9wS Zƒ/aW2g‘Jm@r v@y¼ |w ~m<›‚ÿÿ›W~læ|v‹y»av?¹r m&{gaUËZ¨SgK7·Bç»:!0þ^'Ž@ß—° &ÆõùhëûäâØokÎÿ^ÅÜϽ#Ò´ÆM¬ß»¥|œž¨˜n‹’à™õΉ¿W†C݃ˆâ’¸€dx€€d¯“&ƒ‰††D¶‰Àc÷ ’Ù¬˜p'žªe¥~¬áÒ´È…½…Åß@ÏçØrâ ²ëþšõü$ÿù… ãfâB'Ü1ç:#tBÜnK9ðS }Zƒ™aW“g‘¡mŽr Tv@Æy¼:|w/~mT›Žÿÿ›K~lÎ|vhy»3v?€rm&-g­aUjZ>SöK7>Bç<: }0ýÔ'²ß ‘1õøÓëûQâvØnÝÎþÔÅꋽ#S´ÅÔ¬ßJ¥|2ž¨<˜n3’àKõЉ¿†C¯ƒˆ¿’¡€dm€€d»“=ƒ‰©†Dä‰Àð ’Ùú˜pžªÆ¥~ö¬âC´Èþ½Å߯ÏqØr•â!Cëÿ.õü¹ÿú xùâÓ'‘j1q:¸BÜíK:iS ïZ„aWõg‘ùmÜr ˜v@ÿy¼h|wR~mk›™ÿÿ›?~l·|vFy»v?GrÑm%ßgUaU Z€ÕS„K6ÅBæ¼:ø0ýI'$Þt‰ ü›õø>ëú½âäØnOÎþJÅê½"Ó´Å[¬ÞØ¥{Éž§Û˜mÛ’ßýõF‰¾ä†C€ƒˆœ’‰€e¢€€dÇ“Uƒ‰Ì†E‰ÀÖðQ’ÚH˜pמ«'¥`¬âµ´Éw½ƒÅàKÏüØs#â!ÕëÿÁõí[ÿú¯  ãd'‘ù1û:=BÝmK:áS!aZ„laXVg’Qm *r ÜvA8y¼—|wu~m‚šdÿÿ›3~l |v#yº×v? rm%‘gŽýaT¨Z€kSK6LBæ=:s0ü¿'Œ–Ýãÿõ [õ÷©ëú)âSØmÀÎýÀÅé½"T´Äâ¬Þf¥{_ž§z˜mƒ’߯õ‰¾«†CRƒˆz’r€e—€€dÒ“lƒ‰ï†EA‰Áð•’Ú–˜q/ž«ˆ¥ʬã'´¼þ½ÅàÐφØs±â"fìUõíðÿûE ¢ ãö'’‡1…:ÂBÝìK;ZS!ÒZ„ÖaX·g‰Am xr vAry¼Å|w˜~mššoÿÿ›(~lˆ|vyº¨v>ÔrIm%CgŽ¥aTGZ€S¡KBÅBå½:í0ü5'ŒÝQÿa Æpõ÷ëù–âÂØm2Îý6Åèü½!Ô´Äi¬Ýõ¥zõž§˜v“’ßaô¾‰¾r†C$ƒˆW’[€e‹€€dÞ“ƒƒŠ†Eo‰ÁHðÙ’Úä˜q‡ž«é¥€3¬ã˜´½w½‚ÅáUÏØt?â"÷ìéõî…ÿûÚ 7´ä‡'“1:GBÞlK;ÓS"DZ…@aYg‰™m Ær dvA«y¼ó|w»~m±š{ÿÿ›~lq|uÝyºzvDºrm$õgŽMaSæZ˜S/KBLBå>:h0û«'‹yÜÀþÎ 1Ûõöëùâ0Øl¤Ï tÅèv½!U´Ãð¬Ýƒ¥zŒž¦¸˜v;’ßôz‰¾9†Böƒˆ4’C€e€€dê“›ƒŠ5†E‰»bñ’Û2˜qßž¬K¥€¬ä ´½ð½ÅáÚÏšØtÎâ#‰ì|õïÿüp ÌHå'“£0ôÑ:ÌBÞëKS#™Z†}aO×gŠ¡m!±r /vBVy½~|x#~kvšžÿÿšù~l+|uty¹ðvDr:m$ gFaRÃZ~[S'K@âBãÀ:Ù0ú '‰ÏÛ  à rõôÀë÷Gâ|ØjúÏ ÖÅæç½Ö´Â…¬Ü.¥yOž¯ù˜u3’Þ(󯉽†Bkƒ‡Ë”~€e\€€e “჊†F(‰¼ñè’ܘræž­n¥Ú¬Ù4´¿[½€ÅãjÏ8Øvxâ%=ëóiõðÙÿþ0 ‹ æÌ'•M0öo:\BàiK=·S$ Z†æaP8gŠùm!ÿr svBy½¬|xF~kŽšªÿÿší~l|uQy¹ÁvCÖr öm#¼gŒîaRbZ}ñS&“K@iBã@:T0ùƒ'‰AÚ{ M Ý…õô+ëö´âëØy£Ï LÅæb½W´Â ¬Û½¥x垯˜˜tÛ’ÝÚók‰½T†B=ƒ‡¨”f€eP€€e“øƒŠÀ†Ad‰¼Gò,’Ük˜s>ž­Ï¥‚D¬Ù¦´¿Ô½ÿÅãïÏÂØwâ%ÎëóýõñnÿþÆ  –ç^'†¤0öù:áBàéK>0S$|Z‡PaP™g‹Qm"Mr ·vBÉy½Ú|xi~k¥š¶ÿÿšá~kü|u.y¾…vCr ²m#ngŒ–aRZ}‡S&!K?ðBâÁ:Î0øù'ˆ³Ùé ¹ Hðõó–ëö âZØyÏÂÅåܽØ´Á”¬ÛK¥x{ž¯7˜tƒ’ÝŒó'‰½†Bƒ‡…”O€eD€€e%”ƒŠã†A’‰¼€òp’ܹ˜s–ž®0¥‚®¬Ú´ÀM½ÅätÏLØw”âÑëô‘õòÿÿ[ µ *çï'‡20÷ƒ:fBáhK>©S$îZ‡ºaPúg‹¨m"›r ûvCy¾|tÐ~k½šÂÿÿšÖ~kå|u y¾WvCcr nm# gŒ>aQ Z}S%°K?wBâA:I0øo'ˆ%èç % ³ZõóëõŒâÈØx‡Ï8ÅåW½X´Á¬ÚÙ¥xž®Õ˜t,’Ý>ò㉼á†A჋”8€e9€€e0”'ƒ‹†AÀ‰¼¹ò´’ݘsîž®‘¥ƒ¬Ú‰´ÀŽþÅäùÏÖØx#âbëõ$õò˜ÿÿñ J ½è€'‡À0ø :ëBáèK?"S%`Z|ÓaQ[gŒm"ér ?vC;y¾6|tó~kÔšÍÿÿšÊ~kÍ|tèy¾)vC*r +m"Òg‹æaQ>ZˆS%>K>þBáÂ:Ä0÷å'‡–èU ’ ÿÿÅõòlëôùâ7ØwùÏ®ÅäÒ½Ù´À¢¬Úh¥‚øž®t˜sÔ’ÜðòŸ‰¼¨†A³ƒŠü” €e-€€e<”>ƒ‹)†Aòò÷’ÝU˜tFž®ò¥x1¬Úû´Á>½~ÅåÏ`Øx±âóëõ¸õó-† ß Qé'ˆO0ø—:qBâgK?›S%ÑZ}=aQ¼gŒXm#7r ‚vCty¾d|u~kìšÙÿÿš¾~k¶|tÅy½úvBñr çm"„g‹aPÝZ‡šS$ÌK>…BáC:?0÷Z'‡çÄ þ ‰ÿÿ/õñ×ëôeâ&5ØwjÏ$ÅäM½Y´À)¬Ùö¥‚ž®˜s|’Ü¢ò\‰¼o†A…ƒŠÙ” €e!€€eH”Vƒ‡†B‰½+ó;’Ý£˜tž¯S¥xš¬Ûl´Á·½ýÅæÏëØy?â…ëöLõó t åÚ'ˆÝ0ù":öBâæK@S&CZ}¦aRgŒ°m#…r ÆvC®y¾“|u9~lšåÿÿš²~kž|x_y½ÌvB¸r £m"6g‹7aP|Z‡1S$[K> BàÃ:º0öÐ'†zç3 k ôÿþšõñBëóÑâ%£ØvÜÏ™ÅãȽÚ´¿°¬Ù„¥‚%ž­²˜s$’ÜTò‰¼6†AVƒŠ¶“ñ€e€€eS”mƒ‡³†BK‰½eó’Ýñ˜tõž¯´¥y¬ÛÞ´Â0½}Åæ‰Ï uØj•âëößõôW±   xÚ¥'‰k0ù¬:{BãfK@ŒS&´Z~aR~gm#Ór vCçy¹Ï|u[~lšñÿÿš§~k‡|xâ%ØvNÏÅãC½Z´¿7¬Ù¥»ž­Q˜rÌ’ÜñÔ‰»ý†FƒŠ““Ú€e €€e_”…ƒ‡Ö†By‰½žóÃ’Þ?˜uMž°¥yn¬ÜP´Â©½üÅçÏ ÿØk$â§ë÷sõôìG ž Û7'‰ù0ú6:BãåKAS'&Z~zaRßg`m$!rNvD y¹ý|u~~l2šüÿÿš›~kp|xy½pvBFr m!šgЇaZZ†]S#wK=BßÄ:¯0õ¼'”•æC Êÿýoõðëòªâ$ØuÀÏ…Åâ½½Û´¾¾¬äÌ¥Qž¬ð˜rt’Û¸ñ‰»Ä†E샊p“Àdþ€€ek”œƒ‡ø†B§‰½×ô’Þ˜u¥ž¦¥y׬ÜÁ´Ã"½ |Åç“Ï ‰Øk²â9ëøõõÜ 3  ÛÈ'Ї0úÀ:…BäeKA~SmZ~ãaSAg¸m$pr’vDYyº+|u¡~lI›ÿÿš~kX|wöy½BvB r ×m!KgŠ/aY½Z…ôS#K<¡BßE:*0õ2'”å° 5ÿüÙõïƒëòâ#ïØu2ÏûÅâ8½[´¾E¬äZ¥€èž¬˜r’ÛiñL‰»Š†E½ƒŠM“«€dò€€ew’3ƒˆ†BÕ‰¾ôK’Þܘuýž¦s¥zA¬Ý3´Ã›½ ûÅèÏ Øl@âÊëøšõöq ÈþfÜY'‹0ûJ: BääKA÷SßZMaS¢gŽm$¾rÖvD’yºZ|uÄ~l`›ÿÿšƒ~mÂ|wÓy½vAÓr “m ýg‰×aY\Z…ŠS"”K<)BÞÅ:¥0ô¨'“yäí  ÿüDõîîìQâ#^Øt¤ÏqÅ᳽ܴ½Ì¬ã襀~ž¬.˜qÅ’Ûñ‰»Q†EƒŠ*“”€d怀e‚’Jƒˆ>†C‰¾Iô’ß*˜vUž¦Ô¥z«¬Ý¥´Ä½!zÅèžÏ ØlÎâ[ëù.õö« ]þùÜë'‹£0ûÔ:BådKBpSPZ·aTgŽgm% rv>¬yºˆ|uç~lx›ÿÿšx~mª|w°y¼åvAšr Pm ¯g‰aXûZ… S""K;°BÞF: 1æ'’ëä\ˆ ÿû®õîYì½â"ÍØtÏçÅá.½]´½S¬ãw¥€ž«Í˜qm’ÚÍðʼnÁ7†EaƒŠ“|€dÛ€€eŽ’aƒˆa†C2‰¾ƒôÒ’ßx˜v­ž§5¥{¬Þ´Ä½!úÅé#Îý_Øm\âíëùÁõ÷@œ òÿÝ|'Œ20ü^:BåãKBéSÂZ€!aTdgŽ¿m%Zr]v>åyº¶|v ~l›+ÿÿšl~m“|wŽy¼·vAar m ag’aXšZ„·S!±K;7BÝÆ:›1\'’]ãËõ vÿûõíÄì)â";Øs‡Ï]Å੽Ý´É̬㥫ž«l˜q’Úð‰Àþ†E3ƒ‰å“e€dÏ€€eš’yƒˆ„†C`‰¾¼õ’߯˜mž§—¥{~¬Þˆ´Å½"yÅé¨ÎýéØmêâ~ëúUõ÷Õ2 ‡!Þ 'ŒÀ0üè:šBæcK6pS4Z€ŠaTÅgm%¨r¡v?yºä|v-~l§›7ÿÿš`~m{|wky¼‰vA(r Èm g’7aX9Z„MS!?K:¾BÝG:1Ò'‘Ïã9a áÿúƒõí/ëÿ–â!ªØrùÏÓÅà#½^´ÉS¬â“¥Až« ˜p½’Ú1ð=‰ÀņEƒ‰Â“N€dÀ€dd’ƒˆ§†Cމ¾õõZ’à˜mõž§ø¥{è¬Þú´Å½"ùÅê-ÎþsØnxâëúéõøjÇ (´ÞŸ'N0ýr: BæâK6éS¥Z€ôaU&gom%öråv?Xy»|vP~l¾›Cÿÿ›–~md|wHy¼[v@îr „mÅg‘ßaWØZƒãS ÎK:EBÜÈ:1H'‘@â¨Î Lÿùîõüëÿâ!ØrkÏIÅßž½Þ´ÈÚ¬â"¥~מªª˜pe’Ùãïù‰ÀŒ†DÖƒ‰Ÿ“6€d¸€€dp’¨ƒˆÊ†C¼‰¿.õž’àb˜nMž¨Y¥|R¬ßk´Åø½#xÅê²ÎþýØoâ¡ëû|õøÿ] ½Hß0'Ü0ýü: ¤BçaK7bSZ^aU‡gÇm&Dråv?‘y»A|vs~lÕ›Nÿÿ›Š~mM|w%y¼-v@µr @mwg‘‡aWwZƒzS \K9ÌBÜH:#M1¾'²â: ·ÿùXõûøëþnâ ‡ØqÝÏ¿Åß½_´Èa¬á°¥~mžªI˜p ’Ù•öù‰ÀS†D¨ƒ‰|“€d¬€€d|’¿ƒˆì†Cꉿgõâ’à°˜n¤ž¨º¥|»¬ßÝ´Æq½#øÅÜöÎÿ‡Øo•â2ëüõù”ò RÛßÂ'Žj0þ†:!)BçáK7ÛS‰ZÇaUègm&’r )v?Êy»o|v–~lí›Zÿÿ›~~m5|wy»þv@|r üm)g‘0aWZƒSêK9SBÛÉ:"Ç14'$á…¦ "ÿøÃõûcëýÛâöØqOÏ5ÅÞ”½%„´Çé¬á>¥~ž©ç˜o¶’ÙGöµ‰À†Dzƒ‰Y“€d €€d‡’Öƒ‰†D‰¿¡ö&’Ø¢˜nüž©¥}%¬àO´Æé½$wÅÝ{ÏØp#âÃëü£õú)ˆ çoàS'Žø0ÿ:!¯BÚ¼K8TSúZ‚1aVIgvm&àr mv@y»|v¸~m›fÿÿ›s~m|vßy»Ðv@Cr ¸m'7gØaVµZ‚¦SyK8ÚBÛI:"B0ÿª'–àô ÿø.õúÎëýGâdØpÁϪÅÞ½%´Çp¬àÍ¥}šž©†˜o^’Øùöq‰¿à†DLƒ‰6’ð€d”€€d“’2†DG‰¿Úöj’Øð˜oTž©|¥}¬àÀ´Çb½$÷ÅÞÏ›Øp±âUëý7õú¾ÿø |àä'‡0ÿ›:"4BÛ;K8ÍSlZ‚›aVªgÎm'.r ±v@˜o¬ž©Ý¥}ø¬á2´ÇÛ½%vÅÞ†Ï&Øq?âæëýËõûSÿø³ –áv'1%:"¹BÛ»K9FSÞZƒaW g‘&m'|r õv@vy»ù|vþ~m3›}ÿÿ›[~lï|v™y»tv?Ðr 1m&›g(aUóZÓS•K7èBçï:!80þ•'ŽzßÑë cõù¤ëü âBØo¤Îÿ–Åݽ$´Æ~¬ßé¥|Çž¨Ä˜n®’à¹õ鉿n†Cð’Á€d}€€d«“ƒ‰x†D£‰ÀLöñ’ÙŒ˜pžª>¥~b¬á¤´ÈT½QÅß Ï°ØqÍâ wëþ^õûèÿùH ¦*â'£1¯:#>BÜ:K9¿S OZƒnaWlg‘~mnr 9v@¯y¼(|w!~mJ›‰ÿÿ›P~lØ|vwy»Fv?—rím&LgÐaU’ZiS$K7oBço: ³0þ 'ìß@X ÎmõùëûŒâ°ØoÎÿ ÅêÁ½#†´Æ¬ßx¥|]ž¨c˜nV’àkõ¥‰¿4†CÁƒˆÍ’ª€dq€€d¶“4ƒ‰›†DщÀ†ïò’ÙÛ˜p\žªŸ¥~̬â´ÈͽÐÅßÏ:Ør\â! ëþòõü}ÿùÞ ;¾â˜'‘119:‚BܺK:8S ÁZƒØaWÍg‘Öm¼r }v@èy¼V|wD~mb›”ÿÿ›D~lÁ|vTy»v?^rìm%þgxaU0Z€ÿS²K6öBæð: .0ý']Þ¯Ä 9ØõøzëúùâØnˆÎþ‚Åê<½#´ÅŒ¬ß¥{󞨘mþ’àõb‰¾û†C“ƒˆ«’“€df€€d“Kƒ‰¾†E‰À¿ð6’Ú)˜p³ž«¥5¬â‡´ÉF½PÅàÏÄØrêâ!šëÿ†õíÿús ÐQã*'‘¿1Ã:BÝ9K:±S!3Z„AaX.g’.m r ÀvA!y¼„|wg~myš_ÿÿ›8~l©|v1yºév?%r©m%°g!aTÏZ€–S@K6}Bæp:¨0ü÷'ŒÏÞ1 —Bõ÷åëúeâŽØmúÎýøÅé·½"‡´Å¬Þ”¥{Šž§¡˜m§’ßÎõ‰¾Â†Ceƒˆˆ’{€e›€€dΓcƒ‰á†E.‰Àøðy’Úw˜q ž«a¥Ÿ¬âù´É¿½ÏÅàšÏNØsxâ"+ìõí´ÿû eåã»'’M1M:ŒBݹK;*S!¤Z„«aXg’…m Yr vA[y¼²|wŠ~mškÿÿ›,~l’|vyº»v>ërem%bgŽÉaTnZ€,SÏKBöBåñ:#0üm'ŒAÝŒÿ ­õ÷PëùÑâüØmlÎýnÅé1½"´Äš¬Þ#¥{ ž§@˜v¶’߀ôÚ‰¾‰†C7ƒˆe’d€e€€dÙ“zƒŠ†E\‰Á1ð½’ÚŘqcž«Â¥€ ¬ãj´½F½OÅáÏØØtâ"½ì­õîIÿûž úxäL'’Û1×:BÞ8K;¢S"Z…aXðg‰vm §r HvA”y¼à|w­~m¨švÿÿ›!~lz|uëyºv>²r!m%gŽqaT ZÂS]KB}Bår:ž0ûã'‹³Üûÿ mõö»ëù>âkØlÞÎüäÅ謽!ˆ´Ä!¬Ý±¥z¶ž¦ß˜v^’ß2ô–‰¾P†C ƒˆB’M€e„€€då“‘ƒŠ'†EЉ»Kñ’Û˜q»ž¬#¥€r¬ãÜ´½¿½ÎÅá¥ÏbØt”â#Nì@õîÞÿü3  äÞ'“j0ô™:–BÞ·K<S"ˆZ…aYRg‰Îm õr ŒvAÍy½|wÐ~m¿š‚ÿÿ›~lc|uÈyº_vD˜rÝm$ÆgŽaS¬ZYSëKBBäò:0ûY'‹%Üiþv Ø‚õö&ëøªâÚØlOÏ "Åè'½! ´Ã¨¬Ý?¥zMž¦~˜v’ÞäôR‰¾†BÚƒˆ’5€ex€€dñ“©ƒŠI†E¸‰»„ñE’Ûa˜rž¬„¥€Ü¬äN´¾8½NÅâ*ÏìØu"â#ßìÔõïsÿüÉ $ åo'“ø0õ#:Bß7K<”S"ùZ…èaY³gŠ%m!Cr ÐvBy½=|wò~kVšŽÿÿ› ~lL|u¥yº0vD_r™m$xgÁaSKZ~ïSyKA‹Bäs:”0úÏ'Š—ÛØ ° Cìõõ‘ëøâHØkÁÏ ˜Å碽 ‰´Ã/¬ÜÎ¥y㞦˜u¯’Þ–ô‰½Ý†B¬ƒ‡ü”Ÿ€el€€dý“ÀƒŠl†E牻½ñ‰’Û¯˜rkž¬å¥F¬ä¿´¾±½ÍÅâ¯ÏvØu°â$qëòšõðÿý^ ¹3æ'”†0õ­:¡Bß¶K= S#kZ†RaZgŠ}m!‘r vB?y½k|x~kmššÿÿšþ~l4|u‚yºvD&rUm$*giaRêZ~…SKABãó:0úE'ŠÛG  ®Wõôüë÷ƒâ·Øk3Ï Åç½ ´Â¶¬Ü\¥yyž° ˜uW’ÞHóʉ½¤†B~ƒ‡Ù”‡€ea€€e“×ƒŠ†F‰»öñÍ’Ûý˜rÞ­G¥°¬Ù´¿*½LÅã4ÏØv?â%ëó.õðÿýô NÇæ’'•0ö7:&Bà6K=†S#ÝZ†¼aPgŠÕm!ßr XvBxy½™|x8~k„š¥ÿÿšò~l|u_y¹ÔvCírm#ÜgaR‰Z~S&ÁK@šBãt:‰0ù»'‰zÚµ ˆ Áõôgëöïâ&Øj¥Ï „Åæ—½Š´Â=¬Ûê¥yž¯¿˜tÿ’Ýú󆉽k†BPƒ‡¶”p€eU€€e“²†AQ‰¼0ò’ÜK˜sž­¨¥‚¬Ùx´¿£½ÌÅã¹ÏŠØvÍâ%“ëóÁõñ2ÿþ‰ ã [ç#'†k0öÁ:«BàµK=ÿS$NZ‡%aPrg‹-m"-r ›vB²y½Ç|x[~kœš±ÿÿšæ~l|uÏØw[â&%ëôUõñÇÿÿ x îç´'†ù0÷K:0Bá5K>xS$ÀZ‡aPÓg‹…m"{r ßvBëy½õ|tÂ~k³š½ÿÿšÚ~kî|uy¾ivC{r Šm#@gŒbaQÇZ}HS%ÞK?¨Bâu:0ø¦'ˆ^é! a ï–õó=ëõÈâØxÀÏpÅ彌´ÁL¬Û¥x<ž®ý˜tO’Ý^òÿ‰¼ù†Aôƒ‹-”A€e=€€e,”ƒŠø†A®‰¼¢ò˜’Üç˜sÊž®j¥‚í¬Ú[´À•½ËÅäÄÏŸØwéâ'ëôéõò\ÿÿ´  ‚èF'‡‡0÷Ö:¶Bá´K>ñS%2Z‡ùaQ4g‹Ým"Ér #vC$y¾$|tå~kËšÉÿÿšÏ~k×|t÷y¾;vCAr Fm"ògŒ aQfZ|ÞS%lK?/Báõ:ú0ø'‡Ðè Î Zõò¨ëõ4ârØx2ÏåÅå½ ´ÀÓ¬Ú–¥ƒ#ž®œ˜s÷’Ýò»‰¼¿†AŃ‹ ”*€e2€€e7”5ƒ‹†A܉¼ÛòÜ’Ý6˜t"ž®Ë¥x¬ÚÍ´Á½JÅåIÏ)Øxwâ¹ëõ|õòñJ ¢ è×'ˆ0ø`:;Bâ4K?jS%£Z}aQ•gŒ5m#r gvC]y¾R|u~kâšÔÿÿšÃ~k¿|tÔy¾ vCr m"£g‹²aQZ‡ÅS$úK>¶Báv:u0÷’'‡Bçÿ : Åÿÿlõòëô¡âàØw¤Ï[Å䃽´ÀZ¬Ú$¥‚¹ž®;˜sŸ’ÜÁòw‰¼††A—ƒŠç”€e&€€eC”Lƒ‹>†B ‰½ó ’Ý„˜tzž¯,¥xp¬Û?´Á†½ÊÅåÎϳØyâJëöõó†ß 7 ©ÙÙ'ˆ£0øê:ÀBâ³K?ãS&Z}|aQögŒm#fr «vC–y¾€|u*~kùšàÿÿš·~k¨|xmy½ßvBÏr ¾m"Ug‹ZaP£Z‡[S$‰K>=Bà÷:ï0÷'†´çm ¦ 0ÿþÖõñ~ëô â%ÞØwÏÑÅãþ½ ´¿á¬Ù²¥‚Pž­Ù˜sH’Üsò3‰¼M†AiƒŠÄ“û€e€€eO”dƒ‡¥†B8‰½Nód’ÝÒ˜tÒž¯¥xÙ¬Û°´Áÿ½IÅæSÏ =Øy”âÛëö¤õôu Ì =Úk'‰10ùt:EBã2K@\S&‡Z}åaRWgŒäm#´r ïvCÐy¾®|uM~lšìÿÿš«~k|xJy½±vB–r zm"g‹aPBZ†òS$K=ÄBàw:j0ö~'•]æÜ  ›ÿþAõðéëózâ%MØvˆÏGÅãx½Ž´¿h¬ÙA¥æž­x˜rð’Ü%ñ†F-ƒŠ¡“ã€e€€eZ”{ƒ‡Ç†Bf‰½‡ó¨’Þ ˜u*ž¯î¥yC¬Ü"´Âx½ÉÅæØÏ ÇØjêâmë÷7õô° a ÐÚü'‰À0ùþ:ÊBã²K@ÕS&øZ~OaR¸gÎyº£|uü~l†›&ÿÿšq~mœ|wœy¼ÊvAxr 'm g‰KaXÁZ„áS!ßK;hBÝú:Ð1”'’–ä1 ²ÿûUõîìeâ"vØsÁÏ•ÅàÞ½´½ ¬ã3¥Õž«“˜q8’ÚŸðœ‰Á†EFƒ‰ó“n€dÔ€€e•’oƒˆv†CM‰¾¥ôû’ߦ˜myž§o¥{S¬ÞZ´ÄÕ½"FÅérÎý±Øm±âCëúõ÷™õ JÿåÝÓ'Œ†0ü°:dBæ/K6?SZ€`aTžgŽôm%ˆr†v?yºÒ|v~l›2ÿÿše~m…|wyy¼œvA?r ãm 3g’[aX`Z„xS!mK:ïBÝz:K1 '’ãt ÿúÀõíkëÿÑâ!åØs3Ï ÅàY½‘´É„¬âÁ¥lž«2˜pá’ÚQðX‰À܆Eƒ‰Ð“W€dÈ€€e¡’‡ƒˆ™†C{‰¾Þõ?’ßõ˜mÑž§Ð¥{½¬ÞÌ´ÅN½"ÅÅé÷Îþ;Øn?âÕëú­õø.‹ ßxÞd'0ý::éBæ®K6¸SxZ€ÉaTÿgKm%ÖrÊv?@y»|vB~lµ›>ÿÿ›š~mn|wVy¼nvAr Ÿmäg’aWÿZ„S ûK:vBÜû:Æ1€'‘zâã ˆÿú*õüÉëÿ>â!SØr¤ÏÅßÔ½´É ¬âP¥žªÑ˜p‰’Úð‰À£†D郉­“@€d¼€€dk’žƒˆ¼†Cª‰¿õƒ’àC˜n)ž¨1¥|'¬ß=´Åǽ#EÅê}ÎþÅØnÍâfëûAõøÃ  Þõ'£0ýÅ: nBç.K71SéZ3aU`g£m&$r v?zy».|ve~lÌ›Jÿÿ›~mV|w3y¼?v@Ìr [m–g‘«aWžZƒ¤S ŠK9ýBÜ|:A1ö'ìâQv óÿù•õü4ëþªâ ÂØrÏöÅßO½’´È’¬áÞ¥~˜žªp˜p1’Ùµ÷‰Àj†D»ƒ‰Š“(€d±€€dw’µƒˆÞ†C؉¿PõÆ’à‘˜nž¨’¥|‘¬ß¯´Æ@½#ÄÅÜÀÎÿOØo[â÷ëûÔõùX¶  ߇'Ž10þO: ôBç­K7ªS[ZaUÁgûm&sr v?³y»\|vˆ~lã›Uÿÿ›ƒ~m?|wy¼v@“r mHg‘SaW=Zƒ;S K9„BÛü:"ý1l'^áÀâ ^ÿøÿõûŸëþâ 1ØqˆÏlÅÞʽ´È¬ál¥~/žª˜oÙ’ÙföЉÀ0†Dƒ‰g“€d¥€€dƒ’̓‰†D‰¿Šö ’àߘnÙž¨ô¥|ú¬à!´Æ¹½$DÅÝEÎÿÚØoéâ‰ëühõùíK «3à'Ž¿0þÙ:!yBÚˆK8#SÍZ‚aV"gSm&Ár Rv?ìy»Š|vª~lû›aÿÿ›w~m'|víy»ãv@Zr Ôm'VgûaVÜZ‚ÑS¦K9 BÛ}:"x0ÿá'Ïá/N Éÿøjõû ëýƒâŸØpúÏâÅÞE½%8´Ç ¬àû¥}Åž©®˜o’ÙöŒ‰¿÷†D_ƒ‰D’ú€d™€€dŽ’äƒ‰$†D4‰¿ÃöN’ØÑ˜o1ž©U¥}d¬à’´Ç2½$ÃÅÝËÏdØpxâëüûõú‚á @Çà©'M0ÿc:!þBÛK8œS>Z‚paVƒg«m'r •v@%y»¹|vÍ~m›mÿÿ›l~m|vÊy»µv@!r m'g£aV{Z‚gS5K8’BÚý:!ó0ÿW'Aà» 4ÔõúuëüïâØplÏXÅÝ¿½$¸´Ç(¬à‰¥}[ž©M˜o)’ØÊöI‰¿¾†D0ƒ‰!’â€d€€dš’üƒ‰G†Db‰¿üö’’Ù˜oˆž©¶¥}άá´Çª½%CÅÞPÏîØqâ«ëýõûÿøv Õ[á;'Û0ÿí:"ƒBÛ‡K9S°Z‚ÚaVäg‘m']r Ùv@_y»ç|vð~m)›xÿÿ›`~lù|v¨y»‡v?çr Lm&ºgLaVZþSÃK8BÚ~:!n0þÍ'޳à ' Ÿ?õùàëü\â}ØoÞÎÿÎÅÝ:½$9´Æ¯¬à¥|ñž¨ë˜nÒ’àØö‰¿…†Dƒˆþ’Ë€d‚€€d¦“ƒ‰j†D‘‰À5öÖ’Ùm˜oàžª¥~7¬áv´È#½ÅÞÕÏxØq”â =ëþ#õû¬ÿù jîáÌ'i1w:#BÜK9ŽS "ZƒCaWEg‘ZmOr v@˜y¼|w~mA›„ÿÿ›T~lá|v…y»Xv?®r m&lgôaU¹Z”SQK7 Bç£: é0þC'Ž%ß{“  ªõùKëûÈâëØoPÎÿDÅܵ½#º´Æ6¬ß¦¥|ˆž¨Š˜nz’àŠõÁ‰¿L†CÔƒˆÛ’´€dv€€d²“*ƒ‰†D¿‰Àn÷’Ù»˜p8žªx¥~¡¬áç´Èœ½ÅßZÏØr"â Îëþ¶õüAÿù¡ ÿ‚â]'ø1:LB܆K:S “Zƒ­aW¦g‘²mr av@Ñy¼C|w6~mX›ÿÿ›I~lÊ|vby»*v?urm&gœaUXZ*SàK7'Bç#: c0ý¹'—Þé uõø¶ëû4âZØnÁÎþºÅêr½#:´Å½¬ß4¥|ž¨)˜n"’à<õ}‰¿†C¦ƒˆ¹’œ€dj€€d½“Bƒ‰°†Dí‰À¨ð’Ú ˜pžªÙ¥ ¬âY´É½ÅßßÏŒØr°â!_ëÿJõüÖÿú7 ”âï'‘†1‹:ÑBÝK:€S!Z„aXg’ mër ¥vA y¼q|wY~mp››ÿÿ›=~l³|v?yºüv?â!ñëÿÞõíwÿúÌ )©ã€'’1:VBÝ…K:ùS!wZ„€aXhg’bm 9r évACy¼ |w|~m‡šfÿÿ›1~l›|vyºÎv?r€m%‚gŽìaT–Z€WSüK65Bæ$:Y0ü¥'Œ{ÝÇÿÙ >éõ÷Œëú â7Øm¥Îý¦Åég½";´ÄˬÞQ¥{Kž§g˜mr’ß ôõ‰¾ †CIƒˆs’m€e”€€dÕ“pƒ‰ö†EI‰Áð¢’Ú¥˜q@ž«›¥Þ¬ã<´½½ÅàêÏ ØsÍâ"‚ìqõî ÿûb ¾=ä'’¢1Ÿ:ÛBÞK;rS!èZ„êaXÉg‰Rm ‡r -vA}y¼Î|wŸ~mžšrÿÿ›%~l„|uùyº v>ÉrØuwâ$6ëò_õïËÿý" }øåÅ'”L0õu:kB߃K<ÜS#=Z†'aYìgŠZm!qr øvB(y½X|x~kdš•ÿÿ›~l>|uyºvD=rqm$IgaSZ~°S6KACBä':D0ú}'ŠBÛ X ê“õõ8ë÷¿âòØkmÏ FÅçR½ =´Âç¬ÜŠ¥y¤ž¥ã˜uz’Þg󿉽»†B‘ƒ‡ç”‘€ee€€e“ÎƒŠ†F‰»ßñ±’ÛÞ˜rŸž­¥…¬ØØ´¾ù½ÅâþÏÈØvâ$Çëòòõð`ÿý· ‹æW'”Û0õÿ:ðBàK=US#¯Z†‘aOégвm!Àr GS$’Z‡daP¬g‹am"\r ÄvBÔy½ã|xp~kªš¸ÿÿšß~kø|u(y¾|vC’r ¥m#_gŒ…aQîZ}sS& K?ÙBâ¨:µ0øÞ'ˆ—ÙÍ +Óõóyëöâ>ØxúϧÅåý¿´Á|¬Û5¥xgž¯$˜ts’Ý}󉽆Bƒ‹;”J€eB€€e'”ƒŠê†A›‰¼‹ò}’ÜȘs§ž®C¥‚¬Ú-´Àd½—ÅäŽÏgØw°âíëô­õòÿÿx Ñ Fè '‡M0÷ž:€BáK>ÀS%Z‡ÎaQ g‹¹m"ªr vC y¾|tÖ~kÁšÄÿÿšÓ~kà|uy¾NvCXr am#gŒ-aQZ} S%šK?`Bâ):00øT'ˆ èË –=õòäëõpâ­ØxkÏÅå>½@´Á¬ÚÃ¥wýž®Ã˜t’Ý/òÖ‰¼Ö†A؃‹”3€e6€€e3”,ƒ‹ †Aɉ¼ÄòÁ’ݘsÿž®¤¥ƒ,¬ÚŸ´ÀݽÅåÏñØx>â~ëõAõò´ f Úèœ'‡Ü0ø(:BâK?9S%uZ|çaQngŒm"ør LvCFy¾?|tù~kÙšÐÿÿšÈ~kÉ|tây¾ vCr m"Ãg‹ÖaQ,Z‡ðS%(K>çBáª:ª0÷Ê'‡{è9 v ÿÿ¨õòOëôÜâØwÝÏ“Åä¹½À´À‹¬ÚR¥‚äž®b˜sÃ’Üáò’‰¼†AªƒŠõ”€e+€€e>”Cƒ‹0†A÷‰¼ýó’Ýd˜tVž¯¥xE¬Û´ÁV½–Åå˜Ï{ØxÌâëõÔõóI£ û mé-'ˆj0ø²:ŠBâK?²S%çZ}QaQÏgŒim#Fr vCy¾m|u~kðšÛÿÿš¼~k±|x{y½òvBær Úm"ug‹~aPËZ‡†S$·K>nBá*:%0÷@'†íç¨ â lÿÿõñºëôIâ&ØwOÏ Åä3½A´À¬Ùूzž®˜sk’Ü“òO‰¼d†A|ƒŠÒ”€e€€eJ”Zƒ‡–†B&‰½6óH’ݲ˜t®ž¯f¥x¯¬Û‚´ÁϽÅæÏ ØyZâ¡ëöhõóÞ8  Ú0'ˆø0ù<:BâÿK@+S&YZ}»aR0gŒÁm#”r ÓvC¸y¾›|u?~lšçÿÿš°~kš|xXy½ÃvB­r –m"'g‹&aPjZ‡S$EK=õBà«: 0ö¶'†_ç N ×ÿþ}õñ%ëóµâ%‡ØvÁÏÅ㮽Á´¿™¬Ùo¥‚ž­ ˜s’ÜEò ‰¼+†F?ƒŠ¯“í€e€€eV”rƒ‡¹†BT‰½póŒ’Þ˜už¯Ç¥y¬Ûô´ÂG½•Åæ¢Ï Øj±â2ëöüõôsÎ % •ÚÁ'‰†0ùÆ:”Bã~K@¤S&ÊZ~$aR‘gm#ârvCòy¹Ø|ub~lšóÿÿš¤~k‚|x5y½•vBtr Rm!ÙgŠÎaP Z†³S#ÓK=|Bà+:0ö,'•æ…» Bÿýèõðëó"â$öØv3ÏõÅã)½B´¿ ¬Øý¥§ž­>˜r»’Û÷ñlj»ò†FƒŠŒ“Õ€e€€ea”‰ƒ‡Ü†B‚‰½©óÐ’ÞN˜u^ž°(¥y‚¬Üf´ÂÀ½ Åç(Ï Øk?âÃë÷õõc º (ÛS'Š0úP:BãþKASZ~ŽaRògqm$0r[vD+yº|u…~l6šÿÿÿš™~kk|xy½gvB;r m!‹gŠvaZ Z†IS#bK=B߬:–0õ¢'”zåô' ­ÿýRõïûëòŽâ$eØu¥ÏkÅ⤽´¾§¬ä¶¥=ž¬Ý˜rc’Û©ñƒ‰»¹†Eナi“¾€dü€€em”¡ƒ‡ÿ†B°‰½âô’Þœ˜u¶ž¦%¥yì¬Ü×´Ã9½ ”Åç­Ï £ØkÍâUëø#õõù O ¼Ûä'Š¢0úÚ:ŸBä}KA•SƒZ~øaSSgÈm$~rŸvDdyº4|u¨~lN› ÿÿš~kT|wðy½9vBr Êm!·yº‘|uî~l|›"ÿÿšu~m¦|wªy¼ÝvAr Cm  g‰naXèZ… S" K;˜BÞ-:1Ì'’Ðä@l îÿû’õî<ì¡â"±ØsúÏÌÅá½D´½<¬ãa¥€ž«º˜q\’Ú¾ð¸‰Á,†EXƒŠ“x€dØ€€e‘’fƒˆh†C;‰¾Žôߒ߇˜v¾ž§H¥{)¬Þ,´Ä¤½"Åé<ÎýyØmwâ ëùÞõ÷]¹ ÿ©ݘ'ŒM0üy:.BåüKCSØZ€5aTvgŽÐm%irjv>ðyº¿|v~l”›-ÿÿšj~mŽ|w‡y¼®vAVr ÿm Rg’~aX‡Z„¢S!›K; BÝ®:1B'’Aã¯Ù Yÿúüõí§ì â"ØslÏBÅà½Ŵɵ¬â稜ž«Y˜q’Úpðt‰Àó†E*ƒ‰Þ“a€dÍ€€eœ’}ƒˆ‹†Ci‰¾Çõ#’ßÕ˜m®ž§©¥{’¬Þž´Å½"’ÅéÂÎþØnâšëúqõ÷òO £=Þ)'ŒÛ0ý:³Bæ{K6‡SJZ€ŸaT×g(m%·r®v?)yºí|v4~l«›9ÿÿš^~mw|wdy¼€vAr »m g’&aX&Z„9S!)K:§BÝ/:ü1·'‘³ãE Äÿúgõýëÿyâ!ŽØrÞϸÅà ½E´É<¬â~¥-žªø˜p¬’Ú"ð0‰Àº†Düƒ‰»“I€dÁ€€dg’•ƒˆ­†C—‰¿õg’à#˜nž¨ ¥{ü¬ß´Å–½#ÅêGÎþŽØn”â+ëûõø‡ä EÐÞ»'i0ý: 9BæúK7S»ZaU9g€m&ròv?cy»|vW~lÛEÿÿ›”~m`|wAy¼Rv@ãr wm¶g‘ÎaWÅZƒÏS ¸K:.Bܯ:w1-'‘%⌱ /ÿùÑõüqëþæâ ýØrPÏ.Åß…½Æ´Èì⠥~Þª—˜pT’ÙÔïì‰À†D΃‰˜“2€dµ€€dr’¬ƒˆÐ†Cʼn¿9õ«’àq˜n]ž¨k¥|f¬ß´Æ½#‘ÅÜŠÎÿØo"â½ëû™õùy ÚdßL'÷0þ: ¾BçzK7yS-ZraUšgØm&Sròv?œy»J|vy~lÚ›Qÿÿ›ˆ~mH|wy¼$v@ªr 3mhg‘waWdZƒeS FK9µBÜ0:#31£'—áû šÿù<õûÜëþRâ kØqÂϤÅß½F´ÈJ¬áš¥~Yžª6˜oý’Ù†öì‰ÀH†DŸƒ‰u“€dª€€d~’Èó†Có‰¿rõï’࿘nµž¨Ì¥|Ьßó´Æˆ½$ÅÝÎÿ¢Øo°âNëü,õù± oøßÝ'Ž…0þ¡:!CBçùK7òSŸZÜaUûg/m&¡r 6v?Õy»x|vœ~lñ›\ÿÿ›|~m1|vûy»öv@qr ïm'vg‘aWZ‚üSÔK9âßëüÀõúF¤ ‹ào'0ÿ+:!ÈBÚÔK8kSZ‚EaV\g‡m&ïr zv@y»¦|v¿~m ›hÿÿ›p~m|vØy»Çv@8r «m'(gÇaV¢Z‚’ScK8ÃBÛ1:")0ÿ'{àØö pÿøõú²ëý+âIØp¥ÏÅÝõ½$ì´ÇX¬à·¥}†ž©t˜oM’Øêöd‰¿Õ†DCƒ‰/’ì€d’€€d•’òƒ‰9†DP‰¿åöw’Øÿ˜oež©Ž¥}£¬àÖ´Çz½%ÅÞ϶ØpÌâqëýSõúÛÿø: ™á'¢0ÿµ:"MBÛTK8äS‚Z‚¯aV½gßm'=r ¾v@Gy»Ô|vâ~m ›tÿÿ›e~m|v¶y»™v?ÿr gm&ÚgoaVAZ‚(SñK8JBÚ±:!¤0ÿ'ŽíàGc Û{õúëü—â·ØpÏÅÝp½$m´Æß¬àE¥}ž©˜nõ’Øœö ‰¿œ†Dƒ‰ ’Ô€d‡€€d¡“ ƒ‰\†D~‰Àö»’ÙM˜o½ž©ï¥~ ¬áH´Çó½%ŽÅÞŸÏ@Øq[â ëýçõûpÿøÏ .³á‘'01?:"ÒBÛÓK9]SôZƒaWg‘7m/r v@y¼|w~m7›ÿÿ›Y~lë|v“y»kv?År $m&ŒgaUàZ¿SK7ÑBçÖ:!0þ{'Ž^ßµÏ Fæõùˆëüâ&Øo‰Îÿ|ÅÜë½#í´Æg¬ßÔ¥|²ž¨²˜n’àªõ܉¿c†C烈꒽€d{€€d­“!ƒ‰†D¬‰ÀWöþ’Ù›˜pžªQ¥~v¬á¹´Èk½iÅß$ÏÊØqéâ “ëþ{õüÿùe ÃFâ#'¾1É:#XBÜSK9ÖS eZƒ‚aWg‘m}r Fv@ºy¼0|w(~mO›‹ÿÿ›M~lÓ|vpy»=v?Œràm&>g¿aUZUSK7XBçW: ™0ýñ'Ðß$< ±Põøóëûpâ•ØnûÎþòÅê§½#n´Åî¬ßb¥|Iž¨Q˜nE’à\õ˜‰¿*†C¸ƒˆÇ’¦€do€€d¹“8ƒ‰¢†DÚ‰À‘ïÿ’Ùê˜plžª²¥~à¬â+´Èä½éÅß©ÏTØrwâ!%ëÿõüšÿùú XÚâ´'‘L1S:›BÜÒK:OS ×ZƒìaWàg‘çmËr Šv@óy¼_|wK~mf›—ÿÿ›B~l¼|vMy»v?Srßm%ïghaUZ€ëSœK6ßBæ×: 0ýg'BÞ“¨ »õø^ëúÜâØnmÎþhÅê"½"î´Åu¬Þð¥{ßž§ð˜mî’àõU‰¾ð†CŠƒˆ¤’Ž€e¥€€dÄ“Pƒ‰Å†E‰ÀÊðC’Ú8˜pÄž«¥J¬â´É]½hÅà/ÏÞØsâ!¶ëÿ¢õí;ÿú ímãE'‘Ú1Ý: BÝRK:ÈS!IZ„VaXAg’>m r ÍvA,y¼|wn~m}šaÿÿ›6~l¥|v*yºàv?rœm%¡gaT½Z€S*K6fBæX:0üÝ'Œ´Þ z%õ÷ÉëúIârØmßÎýÞÅé½"o´Äü¬Þ¥{už§Ž˜m–’ß¿õ‰¾·†C\ƒˆ’w€e™€€dГgƒ‰ç†E7‰Áð†’Ú†˜qž«t¥³¬ã´ÉÖ½èÅà´ÏhØs“â"Gì6õíÐÿû% ‚ã×'’i1g:¦BÝÑK;AS!ºZ„¿aX¢g‰/m hr vAey¼»|w~m•šmÿÿ›*~l|vyº²v>àrXm%SgޏaT\Z€S¹KBßBåÙ: 0üS'Œ&Ýpÿ åõ÷4ëùµâáØmPÎýSÅé½!ï´Äƒ¬Þ ¥{ ž§-˜v¥’ßqô͉¾~†C.ƒˆ^’`€e€€dÜ“~ƒŠ †Ee‰Á<ðÊ’ÚÔ˜qtž«Õ¥€¬ã€´½]½gÅá9ÏòØt!â"ÙìÉõîeÿû» •äh'’÷1ò:+BÞPK;ºS",Z…)aYg‰‡m ¶r UvAŸy¼é|w³~m¬šyÿÿ›~lv|uäyº„v>§rm%gŽ`aSûZ®SGKBfBåY:…0ûÉ'‹˜Üßþí PûõöŸëù!âOØlÂÏ ’Å蓽!p´Ä ¬Ý›¥z¢ž¦Ì˜vN’ß#ô‰‰¾E†Cƒˆ;’H€e‚€€dç“–ƒŠ-†E“‰»Vñ’Û"˜qÌž¬6¥€‡¬ãò´½Ö½çÅá¾Ï}Øt¯â#jì]õîúÿüP ¬(äù'“…0ô³:°BÞÐK<3S"žZ…“aYdg‰Þm!r ™vAØy½|wÖ~mÚ„ÿÿ›~l_|uÁyºVvDrÐm$·gŽaSšZDSÕKAíBäÚ:ÿ0û>'‹ ÜMþY »eõö ëøŽâ¾Øl4Ï Åè ½ ð´Ã‘¬Ý*¥z8ž¦k˜uö’ÞÕôE‰¾ †BÒƒˆ’1€ev€€dó“­ƒŠP†EÁ‰»ñR’Ûp˜r$ž¬—¥€ð¬äc´¾O½fÅâCÏØu>â#ûëò#õïÿüæ A¼å‹'”0õ>:5BßOK<¬S#Z…üaYÅgŠ6m!Rr ÝvBy½F|wù~kZšÿÿ›~lG|užyº(vDTrŒm$ig°aS8Z~ÛSdKAtBäZ:z0ú´'Š{Û¼ “ &Ðõõuë÷úâ-Øk¦Ï }Å爽 q´Ã¬Ü¸¥yÏž¦ ˜už’Þ‡ô‰½Ò†B£ƒ‡õ”š€ej€€dÿ“ŃŠs†Eð‰»Èñ–’Û¾˜r|ž¬ø¥Z¬äÕ´¾È½åÅâÈÏ‘ØuÌâ$ëò¶õð$ÿý{ ÖPæ'”¡0õÈ:ºBßÏK=$S#Z†faZ&gŠŽm! r !vBJy½t|x~kršœÿÿšû~l0|u{y¹ùvDrHm$gXaR×Z~qS'K@ûBãÛ:õ0ú*'‰íÛ+ ‘:õôàë÷gâ›ØkÏ óÅç½ñ´ÂŸ¬ÜF¥yež° ˜uF’Þ9󽉽™†Buƒ‡Ó”ƒ€e^€€e “ÜƒŠ–†F‰¼ñÚ’Ü ˜rÓž­Y¥Ä¬Ù´¿A½eÅãNÏØvZâ%ëóJõð¹ÿþ kãæ­'•/0öR:@BàNK=S#òZ†ÐaP#gŠæm!îr evBƒy½¢|x?~k‰š¨ÿÿšð~l|uYy¹ËvCârm#ÍgaRvZ~S&«K@‚Bã[:p0ù '‰_Ú™ l ü¥õôKëöÓâ ØjŠÏ iÅæ~½r´Â&¬ÛÕ¥xûž¯¬˜tî’Ýëóy‰½`†BGƒ‡°”k€eS€€e“󃊹†AZ‰¼;ò’ÜZ˜s+ž­º¥‚.¬ÙŽ´¿º½äÅãÓÏ¥Øvèâ%¯ëóÞõñNÿþ¦  wç?'††0öÜ:ÅBàÎK>S$dZ‡9aP„g‹>m"S$ÖZ‡£aPåg‹–m"Šr ìvBöy½þ|tÈ~k¸š¿ÿÿšØ~kê|uy¾avCpr }m#1gŒQaQ´Z}4S%ÈK?‘Bâ\:e0øŒ'ˆCé E Òzõó!ëõ¬âçØx¥ÏUÅåt½s´Á4¬Úñ¥x(ž®ê˜t>’ÝOòò‰¼î†A냋&”=€e;€€e.”"ƒŠÿ†A·‰¼­ò¥’Üö˜sÛž®|¥ƒ¬Úq´À¬½ãÅäÝϹØxâCëõõòxÿÿÑ * žèa'‡¢0÷ð:ÏBáÍK?S%GZˆ aQFg‹îm"Ør 0vC/y¾,|të~kÏšËÿÿšÌ~kÒ|tðy¾2vC6r 9m"ãg‹ùaQSZˆS%VK?BáÝ:à0ø'‡µèt ± =ÿÿäõòŒëõâVØxÏËÅäî½ô´À»¬Ú€¥ƒž®‰˜sæ’Ýò®‰¼´†A½ƒ‹”%€e/€€e:”:ƒ‹"†A剼æòé’ÝD˜t3ž®Þ¥x¬Úã´Á%½cÅåbÏCØx“âÔëõ™õó f ¿ 2èó'ˆ00øz:TBâLK?S%¹Z}&aQ¨gŒFm#'r tvChy¾[|u~kçš×ÿÿšÁ~k»|tÍy¾vBýr õm"”g‹¡aPòZ‡±S$äK>ŸBá^:[0÷x'‡&çã  ¨ÿÿOõñ÷ëô„âÅØw‰ÏAÅäi½t´ÀC¬Ú¥‚¥ž®(˜s’ܲòj‰¼{†AŽƒŠà”€e$€€eE”Qƒ‡ˆ†B‰½ó-’Ý“˜t‹ž¯?¥x„¬ÛT´Áž½âÅåçÏÍØy!âfëö,õó¢ü T ÅÙõ'ˆ¾0ù:ÙBâËK?úS&+Z}aR gŒm#ur ¸vC¡y¾‰|u1~kþšâÿÿšµ~k£|xfy½ÖvBÄr ±m"Fg‹IaP‘Z‡GS$sK>&BàÞ:Ö0öî'†˜çR Š ÿþ¹õñbëóñâ%ÂØvúÏ·Åãä½õ´¿Ê¬Ùœ¥‚;ž­Ç˜s7’Üdò&‰¼B†A`ƒŠ½“ö€e€€eQ”hƒ‡«†BA‰½Yóq’Ýá˜t㞯 ¥xî¬Ûƴ½bÅæmÏ WØy¯â÷ëöÀõô7‘ é YÚ‡'‰M0ùŽ:_BãKK@sS&œZ}úaRjgŒõm#Ãr üvCÛy¹Å|uT~lšîÿÿš©~kŒ|xCy½¨vB‹r mm!øgŠñaP0Z†ÝS$K=­Bà_:Q0öd'•BæÀö ~ÿþ$õðÌëó]â%1ØvlÏ-Åã_½u´¿Q¬Ù+¥Òž­f˜rß’Üñ≼ †F$ƒŠš“߀e €€e]”€ƒ‡Î†Bo‰½’óµ’Þ/˜u;ž°¥yW¬Ü8´Â½áÅæòÏ áØkâˆë÷SõôÌ' ~ íÛ'‰Û0ú:äBãÊK@ìS'Z~caRËgMm$r@vDy¹ó|uw~l-šúÿÿš~ku|x y½zvBRr *m!ªgŠšaOÏZ†tS#K=4Bßß:Ì0õÙ'”³æ/c éÿýŽõð7ëòÊâ$ŸØuÞÏ£ÅâÚ½ö´¾Ø¬ää¥hž­˜r‡’ÛÈñŸ‰»Ð†EöƒŠx“È€e€€eh”—ƒ‡ñ†B‰½Ëóø’Þ}˜u’ž¥þ¥yÁ¬Ü©´Ã½ `ÅçwÏ lØk”âë÷çõõa¼  €Û©'Ši0ú¢:iBäJKAeSUZ~ÍaS,g¥m$_rƒvDMyº"|uš~lD›ÿÿš’~k]|wþy½LvBr æm!\gŠBaYÒZ† S#K<»Bß`:F0õO'”%åžÏ Tÿüùõï¢ëò6â$ØuPÏÅâT½w´¾_¬är¥€þž¬¤˜r/’Ûzñ[‰»—†EǃŠU“°€dõ€€et”¯ƒˆ†B̉¾ô<’Þ˘uꞦ_¥z+¬Ý´Ã½ àÅçüÏ öØl"â«ëø{õõöR ¨þFÜ;'Š÷0û-:îBäÉKAÞSÇZ7aSgým$­rÇvD†yºP|u½~l\›ÿÿš†~mÇ|wÛy½vAßr ¢m!g‰êaYqZ… S"¬K yº~|uà~ls›ÿÿšz~m¯|w¸y¼ïvA¦r ^m Àg‰’aYZ…7S";K;ÉBÞa:<1'“ ä{¨ *ÿûÎõîxìÜâ"ëØt4ÏÅáJ½x´½m¬ã¥€+ž«á˜q’ÚÞðÓ‰ÁD†EkƒŠ“€dÝ€€eŒ’]ƒˆZ†C(‰¾wôÄ’ßg˜všž§!¥zþ¬Ýþ´Äs½!ßÅéÎýBØm>âÎëù¢õ÷ } ÒÿnÝ]'Œ0üA:øBåÈKBÏSªZ€ aTOgŽ­m%IrOv>Ùyº¬|v~lŠ›)ÿÿšn~m˜|w•y¼ÁvAmr m rg‰:aX¯Z„ÍS!ÉK;PBÝá:·1y'’{ãê •ÿû9õíãìIâ"ZØs¥ÏzÅàŽø´Éæ¬ã¥Áž«€˜q(’Úð‰Á †E=ƒ‰ì“j€dÑ€€e˜’tƒˆ|†CV‰¾°õ’ßµ˜mŠž§‚¥{h¬Þp´Äì½"^ÅéŒÎýÌØmÌâ_ëú6õ÷µ gÝï'Œ¢0üË:~BæGK6WSZ€taT°gm%—r“v?yºÚ|v&~l¢›4ÿÿšc~m€|wry¼“vA4r Öm $g’JaXNZ„cS!WK:×BÝb:21ï'‘íãX ÿú£õíNëÿµâ!ÉØsÏðÅà@½y´Ém¬â«¥Wž«˜pÐ’ÚBðK‰ÀцEƒ‰É“S€dÆ€€e£’‹ƒˆŸ†C„‰¾éõL’à˜mâž§ã¥{ѬÞâ´Åe½"ÞÅêÎþVØnZâðëúÉõøJ¨  •Þ€'00ýU: BæÇK6ÏSZ€ÞaUg\m%år×v?Ky» |vH~l¹›@ÿÿ›˜~mi|wOy¼ev@úr ’mÕg‘òaWìZƒúS æK:_BÜã:¬1e'‘_âÇí kÿúõü­ëÿ!â!7Ør‰ÏfÅß»½ù´Èô¬â:¥~¾˜px’Ùôð‰À˜†Dàƒ‰¦“;€dº€€dn’£ƒˆÂ†C²‰¿"õ’àR˜n:ž¨D¥|;¬ßS´ÅÞ½#]Åê–ÎþàØnèâ‚ëû]õøß= ž(ß'¾0ýß: ˆBçFK7HSÿZGaUrg´m&3rv?…y»7|vk~lЛLÿÿ›~mR|w,y¼6v@Ár Nm‡g‘šaW‹ZƒS tK9æBÜc:#i1Û'Ðâ6Y ÖÿùxõüëþŽâ ¦ØqûÏÜÅß5½z´È{¬áÈ¥~„žª]˜p ’Ù¦÷‰À_†D²ƒ‰ƒ“$€d®€€dy’ºƒˆå†Cቿ[õÓ’à ˜n’ž¨¥¥|¥¬ßÅ´ÆW½#ÝÅÜÚÎÿjØowâëûðõùtÓ 3¼ߣ'ŽL0þi:! BçÆK7ÁSqZ±aUÓg m&r v?¾y»e|vŽ~lè›Xÿÿ›~m:|w y¼v@ˆr m9g‘BaW*Zƒ&S K9mBÛä:"ä1Q'Bá¤Æ Aÿøãõûƒëýúâ ØqmÏRÅÞ°½û´È¬áV¥~ž©ü˜oÈ’ÙWöÉÀ%†D„ƒ‰`“ €d£€€d…’у‰†D‰¿•ö’Ø’˜nêž©¥}¬à7´ÆÐ½$\ÅÝ_ÎÿôØpâ¤ëü„õú h ÈPà4'ŽÚ0þó:!’BÚ¡K8:SâZ‚aV4gdm&Ðr _v?÷y»“|v±~lÿ›cÿÿ›u~m#|vçy»Úv@Or Çm'GgêaVÉZ‚½S‘K8ôBÛd:"_0ÿÇ'´á2 ¬ÿøMõúîëýfâƒØpßÏÈÅÞ+½% ´Ç‰¬àå¥}±ž©›˜op’Ù ö‰¿ì†DVƒ‰=’õ€d—€€d‘’郉+†D=‰¿Îö[’Øà˜oAž©g¥}x¬à¨´ÇI½$ÜÅÝäÏ~Øp“â6ëýõúžþ ]ãàÅ'h0ÿ}:"BÛ K8³STZ‚„aV–g¼m'r ¢v@0y»Á|vÔ~m›oÿÿ›i~m |vÄy»¬v@r ƒm&ùg“aVhZ‚SSK8{BÚå:!Ù0ÿ='&à‚ž ¸õúYëüÓâòØpQÏ>Åݦ½$ ´Ç¬às¥}Gž©:˜o’Ø»ö<‰¿³†D'ƒ‰’Þ€d‹€€dœ“ƒ‰N†Dk‰ÀöŸ’Ù.˜o™ž©È¥}â¬á´Ç½%[ÅÞiÏØq!âÇëý«õû3ÿø“ òwáW'ö1:"BÛ K9,SÆZ‚îaV÷g‘m'lr æv@jy»ð|v÷~m.›{ÿÿ›^~lô|v¡y»~v?Ür ?m&«g;aVZéS­K8Bè :!T0þ³'Ž˜ßð ‚"õùÄëü?âaØoÂÎÿ´ÅÝ!½$!´Æ—¬à¥|Ýž¨Ù˜nÁ’àÉõø‰¿z†Cùƒˆø’Æ€d€€€d¨“ƒ‰q†D™‰À@öã’Ù|˜oñžª)¥~L¬áŒ´È;½6ÅÞîÏ’Øq¯â Xëþ?õûÈÿù( ‡ áè'…1‘:#"BÜK9¥S 7ZƒXaWXg‘km^r *v@£y¼|w~mE›†ÿÿ›R~lÝ|v~y»Ov?£rûm&]gãaU¦Z€SØn¦ÎþŸÅêX½#"´Å¦¬ß¥| ž¨˜n’à-õp‰¿†Cƒˆ²’˜€dh€€dÀ“Fƒ‰¶†Dö‰À³ð'’Ú˜p¡žªë¥¬âo´É,½5ÅßùϦØrÌâ!{ëÿfõüòÿúS ±2ã '‘¡1¦:ëBÝK:—S!Z„+aXg’múr ²vAy¼z|w`~mtš\ÿÿ›;~l®|v8yºóv?1r·m%Ág3aTäZ€¬SXK6—Bæ‹:Å0ý'ŒíÞ<P ·bõøëú„â­ØnÎþÅéÓ½"¢´Å-¬Þ­¥{ ž§¶˜m¹’ßßõ,‰¾Î†Coƒˆ’€€ež€€dË“^ƒ‰Ù†E$‰Àìðk’Úf˜pùž«M¥‰¬âá´É¥½´Åà~Ï1ØsZâ" ëÿúõí”ÿúé FÅãœ'’/10:pBÝK;S!ŒZ„•aX{g’sm Hr övANy¼¨|w‚~m‹šhÿÿ›/~l—|vyºÅv>ørsm%sgŽÛaTƒZ€CSçK6Bæ :@0üŠ'Œ_Ý«ÿ¼ "Ìõ÷pëùñâØmŠÎý‹ÅéN½"#´Ä´¬Þ;¥{6ž§U˜vÉ’ß‘ô艾•†CAƒˆl’i€e’€€dדuƒ‰ü†ER‰Á%ð¯’Ú´˜qQž«®¥ò¬ãR´½-½4ÅáÏ»Øsèâ"žìŽõî)ÿû~ ÛYä-'’½1º:õBÞK;‰S!þZ„þaXÜg‰cm –r :vAˆy¼×|w¥~m£štÿÿ›#~l|uòyº—v>¾r/m%%gŽ„aT"ZÙSuKB—Bå:º0ü'‹ÑÝÿ) Œ7õöÛëù]âŠØlüÎýÅèȽ!£´Ä;¬ÝÉ¥zÍž¦ô˜vq’ßCô¤‰¾\†CƒˆI’R€e†€€d㓌ƒŠ†E€‰Á^ðó’Û˜q¨ž¬¥€\¬ãÄ´½¦½³ÅáˆÏEØtvâ#/ì!õî¾ÿü píä¿'“K0ô|:zBÞœK<S"pZ…haY=g‰»m är ~vAÁy½|wÈ~mºš€ÿÿ›~lh|uÏyºhvD¥rëm$×gŽ,aSÁZoSKBBå :50ûv'‹C܈þ• ÷¡õöFëøÉâùØlnÏ ?ÅèC½!$´Ã¬ÝX¥zcž¦“˜v’Þõô`‰¾#†B䃈&’:€e{€€dƒŠB†E¯‰»xñ6’ÛP˜rž¬p¥€Æ¬ä6´¾½3Åâ ÏÏØuâ#ÁìµõïSÿü© €åP'“Ú0õ:ÿBßK<{S"áZ…ÒaYžgŠm!2r ÁvAúy½3|wë~mÑš‹ÿÿ› ~lQ|u­yº:vDkr¨m$‰gÔaS`ZS’KA¥BäŽ:°0úì'еÛ÷ Ï b õõ±ëø6âgØkßÏ µÅç¾½ ¤´ÃI¬Üæ¥yùž¦2˜uÁ’Þ§ô‰½é†B¶ƒˆ”¤€eo€€dú“»ƒŠe†E݉»±ñz’Ûž˜rXž¬Ñ¥/¬ä§´¾—½²Åâ“ÏYØu’â$Rëò{õïèÿý? šåá'”h0õ:…Bß›K<ôS#SZ†;aYÿgŠkm!€r vB3y½a|x~khš—ÿÿ›~l9|uŠyº vD2rdm$:g|aRÿZ~œS KA,Bä:+0úb'Š'Ûe ; Íwõõë÷¢âÖØkQÏ +Åç9½ %´ÂЬÜt¥yž°5˜ui’ÞXóÙ‰½°†Bˆƒ‡á”Œ€ec€€e“ÒƒŠˆ†F ‰»êñ¾’Ûí˜r°ž­2¥™¬Øî´¿½1ÅãÏãØv â$ãëóõð}ÿýÔ /¨æs'”ö0ö: BàK=lS#ÅZ†¥aOügŠÃm!Ïr IvBly½|x1~kš£ÿÿšô~l"|ugy¹ÞvCùr m#ìg$aRžZ~2S&ÙK@³Bã:¦0ùØ'‰˜ÚÔ ¨ 8áõô‡ë÷âEØjÃÏ ¡Åæ´½¦´ÂW¬Ü¥y&ž¯Ó˜u’Þ ó•‰½w†BZƒ‡¾”u€eW€€e“ꃊ«†F9‰¼$ò’Ü;˜sž­“¥‚¬Ù`´¿‰½±ÅãÏmØv¯â%uëó¢õñÿþj Ä ;ç'†L0ö¤:BàšK=åS$6Z‡aP]g‹m"r vB¦y½½|xT~k—š¯ÿÿšé~l |uDy¾¡vCÀr Üm#žgŒÌaR†B+ƒ‡›”]€eL€€e”ƒŠÎ†Av‰¼]òF’܉˜s`ž­ô¥‚m¬ÙÒ´À½0Åä"Ï÷Øw=â&ëô6õñ§ÿþÿ Y Ïç•'†Û0÷.:BáK>^S$¨Z‡xaP¾g‹rm"kr ÑvBßy½ì|xv~k®šºÿÿšÝ~kó|u!y¾svC‡r ˜m#PgŒtaQÛZ}_S%öK?ÁBâ:›0øÄ'ˆ|é@ € ¶õó]ëõçâ"ØxÞÏÅ婽§´Áe¬Û¥xSž¯˜tb’Ýnó ‰½†Aýƒ‹4”F€e@€€e)”ƒŠñ†A¤‰¼–òŠ’Üטs¸ž®U¥‚Ö¬ÚC´À{½°Åä§ÏØwËâëôÉõò<ÿÿ• î bè''‡i0÷¸:™Bá™K>×S%Z‡âaQg‹Êm"¹r vCy¾|tÝ~kÆšÆÿÿšÑ~kÜ|tþy¾EvCNr Tm#gŒaQzZ|õS%„K?IBâ:0ø:'‡îè¯ í y!õòÈëõTâ‘ØxPÏÅå$½'´Àì¬Ú®¥wéž®°˜t ’Ý òɉ¼Ë†Aσ‹”/€e4€€e5”0ƒ‹†AÒ‰¼ÏòÎ’Ý%˜tž®¶¥wð¬Úµ´Àô½/Åå,Ï ØxYâšëõ]õòÑ* ƒ öè¸'‡÷0øB:BâK?PS%‹Z|ûaQ€gŒ"m#r YvCQy¾H|u~kÝšÒÿÿšÅ~kÄ|tÛy¾vCr m"´g‹ÅaQZ‡ÛS%K>ÐBá‘:‘0÷°'‡`è Y äÿÿ‹õò3ëôÀâÿØwÂÏyÅ䟽¨´Às¬Ú<¥‚О®O˜s²’ÜÒò…‰¼’†A¡ƒŠî”€e(€€eA”Gƒ‹6†B‰½ó’Ýs˜tgž¯¥xY¬Û&´Ám½¯Åå²Ï•Øxçâ+ëõñõófÀ  ŠéI'ˆ…0øÌ:¤Bâ˜K?ÉS%ýZ}eaQágŒzm#Ur œvCŠy¾v|u#~kôšÞÿÿšº~k­|xty½évBÛr Ím"fg‹maP¸Z‡rS$¡K>WBá: 0÷%'†ÒçŒ Æ Oÿþöõñžëô,â%ýØw4ÏïÅä½(´¿ú¬ÙÊ¥‚fž­î˜sZ’Ü„òB‰¼Y†AsƒŠÌ”€e€€eL”_ƒ‡†B.‰½AóU’ÝÁ˜t¿ž¯x¥xìۘ´Áæ½.Åæ7Ï Øyuâ¼ëö„õóûU ­ ÚL'‰0ùW:)BãK@BS&nZ}ÏaRCgŒÒm#£r àvCÃy¾¤|uF~l šéÿÿš®~k•|xQy½»vB¢r ‰m"g‹aPWZ‡S$/K=ÞBà’:‡0ö›'†Dæû 2 ºÿþ`õñ ëó™â%kØv¦ÏdÅ㕽©´¿‚¬ÙY¥üž­˜s’Ü6ñþ‰¼ †F6ƒŠ©“è€e€€eX”vƒ‡À†B]‰½{ó™’Þ˜už¯Ú¥y-¬Ü ´Â_½®Åæ¼Ï ªØjÌâNë÷õôê B ±ÚÝ'‰¡0ùá:®Bã—K@»S&àZ~9aR¤g*m#ñr$vCýy¹á|ui~l#šõÿÿš¢~k~|x/y½ŒvBir Em!ÊgнaOöZ†žS#½K=eBà:0ö'”íæjž %ÿýËõðtëóâ$ÚØvÏÚÅã½)´¿ ¬Øç¥“ž­,˜rª’Ûèñº‰»ç†FƒŠ†“Ñ€e€€ed”Žƒ‡ã†B‹‰½´óÝ’Þ]˜uož¥×¥y–¬Ü{´Âؽ -ÅçAÏ 4ØkZâßë÷«õõ%€ × EÛo'Š00úk:3BäKA4S'Z~¢aSgm$?rhvD6yº|uŒ~l;›ÿÿš–~kg|x y½^vB0r m!|gŠeaYùZ†5S#LK<ìBß“:|0õ‡'”_åØ ÿý5õïßëòrâ$IØu‰ÏPÅ⊽ª´¾¬ä ¥)ž¬Ë˜rS’Ûšñv‰»®†EÚƒŠc“º€dù€€eo”¥ƒˆ†B¹‰½íô!’Þ«˜uÇž¦8¥z¬Üí´ÃP½ ¬ÅçÆÏ ¾Økèâpëø?õõº l ØÜ'о0úõ:¸Bä–KA­S™Z aSfgÙm$r¬vDoyº=|u¯~lR› ÿÿš‹~mÐ|wéy½0vAör ½m!-gŠ aY˜Z…ËS"ÚKÂyºš|uõ~l›$ÿÿšs~m¡|w£y¼ÔvA„r 6m ‘g‰^aXÖZ„øS!÷K;BÞ:í1±'’´ä$P Ñÿûuõî ì„â"•ØsßϲÅàû½,´½%¬ãK¥ìž«¨˜qK’Ú¯ð«‰Á"†EOƒ‰ú“s€dÖ€€e“’jƒˆn†CC‰¾™ôì’ß–˜vΞ§[¥{=¬ÞB´Ä»½"+ÅéVÎý”Øm“â$ëùúõ÷yÖ +ÿÆÝ´'Œh0ü“:HBæK6&SîZ€IaT‰gŽám%xrwv>ûyºÈ|v~l˜›0ÿÿšg~mŠ|w€y¼¥vAKr òm Cg’maXuZ„ŽS!…K;BÝ–:g1''’&㓼 <ÿúßõí‹ëÿñâ"ØsQÏ(Åàv½¬´Éž¬âÙ¥‚ž«F˜pó’Úaðg‰Àè†E!ƒ‰×“\€dË€€eŸ’‚ƒˆ‘†Cr‰¾Òõ0’ßä˜m¿ž§¼¥{§¬Þ´´Å4½"ªÅéÛÎþØn!â¶ëúŽõøk ÀYÞE'Œö0ý:ÍBæ“K6ŸS_Z€³aTêg9m%Ær»v?4yºö|v:~l°›;ÿÿš\~ms|w]y¼wvAr ®mõg’aXZ„$S!K:BÝ:â1'‘˜ã) §ÿúJõüéëÿ]â!rØrÃÏžÅßð½-´É%¬âh¥žªå˜p›’Úð#‰À¯†D󃉴“E€d¿€€di’™ƒˆ´†C ‰¿ õt’à2˜nž¨¥|¬ß%´Å­½#*Åê`Îþ¨Øn¯âGëû!õø£ aíÞ×'„0ý§: RBçK7SÑZaUKg‘m&rÿv?ny»$|v]~lÇ›Gÿÿ›‘~m[|w:y¼Iv@Ør jm§g‘¾aW³Zƒ»S ¢K:BÜ—:]1'‘ âp• ÿùµõüTëþÉâ áØr4ÏÅßk½­´È¬¬áö¥~¯žª„˜pD’ÙÅï߉Àv†Dщ‘“-€d³€€du’±ƒˆ×†CΉ¿Dõ¸’à€˜nnž¨~¥|z¬ß—´Æ&½#©ÅܤÎÿ2Øo=âØëûµõù8– ö€ßh'Ž0þ1: ×Bç’K7SCZ†aU¬gèm&brÿv?§y»R|v€~lÞ›Sÿÿ›†~mD|wy¼v@Ÿr &mYg‘faWRZƒQS 0K9žBÜ:#1‰'|áß }ÿùõû¿ëþ6â OØq¦ÏŠÅÞæ½.´È3¬á„¥~Ežª#˜oì’Ùwö߉À=†D—ƒ‰n“€d§€€d€’ȃˆú†Cü‰¿}õü’àΘnÆž¨ß¥|ä¬à ´ÆŸ½$)ÅÝ)Îÿ¼ØoËâjëüHõùÍ, ‹ßù'Ž¡0þ»:!]BÚmK8 S´ZðaV g@m&°r Cv?ày»|v£~lö›^ÿÿ›z~m,|võy»ív@fr âm'gg‘aVñZ‚çS¿K9%BÛ˜:"”0ÿÿ'îáNn èÿøŠõû*ëý¢â¾ØqÏÅÞa½%S´Çº¬á¥}Ûž©Â˜o”’Ù)ö›‰À†Dhƒ‰L’ÿ€dœ€€dŒ’߃‰†D*‰¿·ö@’ØÀ˜ož©@¥}M¬àz´Ç½$¨ÅÝ®ÏFØpYâûëüÜõúbÁ  ¨à‹'/0ÿE:!âBÚíK8‚S&Z‚ZaVng˜m&þr ‡v@y»¯|vÆ~m ›jÿÿ›n~m|vÒy»¿v@-r žm'g¶aVZ‚~SMK8¬BÛ:"0ÿu'_à¼Ú Sôõú•ëýâ-ØpŠÏuÅÝܽ$Ô´ÇA¬à¡¥}rž©a˜o<’ØÛöW‰¿Ê†D:ƒ‰)’ç€d€€d˜’÷ƒ‰@†DY‰¿ðö„’Ù˜ovž©¡¥}·¬àì´Ç‘½%'ÅÞ3ÏÐØpèâŒëýpõú÷ÿøW µ;á'½0ÿÐ:"gBÛlK8ûS˜Z‚ÃaVÏgðm'Lr Ëv@Ry»Ý|vé~m$›vÿÿ›b~lþ|v¯y»v?ôr Zm&Ëg^aV.Z‚SÛK83BÚ™:!Š0þë'ŽÑà+F ¾_õúëü{â›ØoüÎÿëÅÝW½$T´ÆÈ¬à/¥}ž©˜nä’Øö‰¿‘†D ƒ‰’Ѐd„€€d£“ƒ‰c†D‡‰À)öÈ’Ù\˜oΞª¥~!¬á^´È ½ÅÞ¹ÏZØqvâ ëþõûŒÿøì JÏá­'K1Z:"ìBÛìK9tS Zƒ-aW0g‘Hm>r v@Œy¼ |w ~m<›‚ÿÿ›W~læ|vŒy»bv?ºr m&}gaUÍZªSjK7ºBç¾:!0þ`'ŽCßš³ )Éõùkëûçâ ØonÎÿaÅÜѽ#Õ´ÆO¬ß¾¥|žž¨Ÿ˜nŒ’à›õω¿X†CÞƒˆã’¸€dy€€d¯“%ƒ‰…†Dµ‰Àb÷ ’Ùª˜p%žªc¥~‹¬áϴȃ½‚Åß>ÏåØrâ ¯ëþ—õü!ÿù‚ ßcâ?'Ù1ä:#qBÜkK9íS {Zƒ—aW’g‘ mŒr Sv@Åy¼9|w/~mS›ÿÿ›K~lÏ|viy»4v?rm&/g¯aUlZASøK7ABç>: €0ýÖ'µß ”4õøÖëûTâyØnàÎþ×Åꎽ#U´ÅÖ¬ßL¥|5ž¨>˜n4’àMõ‹‰¿†C°ƒˆÀ’¡€dm€€d»“=ƒ‰¨†Dã‰Àœð ’Ùø˜p}žªÄ¥~ô¬âA´Èü½ÅßÃÏoØr’â!@ëÿ+õü¶ÿú uöâÐ'‘g1n:µBÜëK:fS íZ„aWóg‘÷mÚr —v@þy¼h|wQ~mk›™ÿÿ›?~l¸|vFy»v?HrÒm%àgWaU Z€×S†K6ÈBæ¿:ú0ýL''ÞwŒ ÿžõøAëúÀâçØnQÎþMÅê ½"Ö´Å]¬ÞÚ¥{Ëž§Ý˜mÝ’ßÿõG‰¾å†Cƒˆ’Š€e£€€dÇ“Tƒ‰Ë†E‰ÀÕðP’ÚG˜pÕž«%¥^¬â³´Éu½ÅàHÏùØs â!Òëÿ¾õíXÿú¬  Šãa'‘ö1ø::BÝjK:ßS!^Z„jaXTg’Om (r ÚvA7y¼–|wt~m‚šcÿÿ›4~l |v#yºØv?rŽm%’gŽÿaTªZ€mSK6OBæ?:u0üÂ'Œ™Ýæÿø ^ õ÷¬ëú,âVØmÃÎýÃÅ都"V´Äå¬Þi¥{až§|˜m…’ß°õ‰¾¬†CSƒˆz’r€e—€€dÒ“kƒ‰î†E@‰Áð“’Ú•˜q-ž«†¥Ȭã$´Éí½ÅàÍσØs®â"cìRõííÿûB Ÿãó'’„1‚:¿BÝéK;XS!ÐZ„ÔaXµg‰@m wr vApy¼Ä|w—~m™šoÿÿ›(~l‰|vyº©v>ÕrKm%DgާaTIZ€S£KBÈBåÀ:ð0ü8'Œ ÝTÿd Ésõ÷ëù™âÅØm5Îý9Åèþ½!×´Äl¬Ý÷¥z÷ž§˜v•’ßbôÀ‰¾s†C%ƒˆW’[€e‹€€dÞ“ƒƒŠ†En‰ÁGð×’Úã˜q…ž«ç¥€1¬ã–´½u½€ÅáRÏ Øt=â"ôìåõî‚ÿû× 4±ä„'“1 :DBÞiK;ÑS"BZ…=aYg‰—m År bvAªy¼ò|wº~m±š{ÿÿ›~lq|uÞyº{vD¼rm$ögŽOaSèZšS1KBOBåA:k0û®'‹|ÜÃþÑ 4Þõö‚ëùâ3Øl§Ï wÅèy½!W´Ãó¬Ý…¥zŽž¦º˜v=’ßô|‰¾:†B÷ƒˆ5’D€e€€dꓚƒŠ4†Eœ‰»añ’Û1˜qÝž¬I¥€›¬ä´½î½ÿÅáØÏ—ØtËâ#†ìyõïÿüm ÉEå'“ 0ôÎ:ÊBÞèKƒ‡©”g€eP€€e“øƒŠÀ†Ac‰¼Fò*’Üi˜s<ž­Í¥‚B¬Ù¤´¿Ñ½ýÅãìÏ¿Øwâ%Ëëóúõñkÿþà  “ç['†¡0öö:ÞBàæK>-S$zZ‡NaP—g‹Om"Kr µvBÈy½Ù|xh~k¥š¶ÿÿšâ~kü|u/y¾†vCžr ´m#pgŒ˜aRZ}‰S&$K?òBâÃ:Ñ0øü'ˆ¶Ùì ¼ Kóõó™ëö#â]ØyÏÅÅåß½Ú´Á–¬ÛM¥x}ž¯9˜t…’ÝŽó)‰½†Bƒ‡†”O€eE€€e$”ƒŠã†A‘‰¼òn’Ü·˜s”ž®.¥‚¬¬Ú´ÀJ½|ÅäqÏIØw‘âÎëôŽõòÿÿX ² 'çì'‡/0÷€:cBáfK>¦S$ìZ‡·aPøg‹§m"™r ùvCy¾|tÏ~k¼šÁÿÿšÖ~kå|u y¾XvCer pm#"gŒ@aQ¡Z} S%²K?yBâD:L0øq'ˆ'èê ) ¶]õóëõâËØxŠÏ;ÅåZ½[´Á¬ÚÜ¥xž®×˜t-’Ý@ò剼ã†A⃋”8€e9€€e0”'ƒ‹†A¿‰¼¸ò²’ݘsìž®¥ƒ¬Ú‡´ÀýüÅä÷ÏÔØx â_ëõ!õò•ÿÿî G ºè}'‡½0ø :éBáåK?S%]Z|ÑaQYg‹ÿm"çr =vC:y¾5|tò~kÔšÍÿÿšÊ~kÎ|téy¾*vC+r ,m"Ôg‹èaQ@ZˆS%@K?BáÅ:Ç0÷ç'‡™èX • !ÿÿÈõòoëôüâ:ØwûϰÅäÕ½Û´À¤¬Új¥‚úž®v˜sÖ’Üòò¡‰¼©†A´ƒŠý”!€e-€€e<”>ƒ‹(†Añòö’ÝS˜tDž®ð¥x/¬Úù´Á<½{Åå|Ï^Øx®âðëõµõó*ƒ Ü Né'ˆL0ø•:nBâdK?˜S%ÏZ}:aQºgŒVm#6r vCsy¾c|u~këšÙÿÿš¾~k¶|tÆy½ûvBòr èm"…g‹aPßZ‡S$ÏK>ˆBáE:B0÷]'‡ çÇ  Œÿÿ2õñÚëôhâ&8ØwmÏ&ÅäP½\´À+¬Ùø¥‚‘ž®˜s~’Ü£ò]‰¼p†A†ƒŠÚ” €e!€€eH”Uƒ‡†B‰½*ó:’Ý¢˜tœž¯Q¥x˜¬Ûj´Áµ½ûÅæÏèØy<â‚ëöIõó¿ q âÚ'ˆÚ0ù:óBâäK@S&@Z}¤aRgŒ®m#„r ÅvC¬y¾’|u8~lšåÿÿš³~kŸ|x`y½ÍvB¹r ¤m"7g‹8aP~Z‡3S$]K>BàÆ:¼0öÓ'†}ç6 n ÷ÿþõñEëóÕâ%¦ØvßÏœÅãʽÜ´¿²¬Ù‡¥‚'ž­´˜s&’ÜUò‰¼7†AWƒŠ·“ò€e€€eS”mƒ‡²†BJ‰½dó~’Ýð˜t󞯲¥y¬ÛÜ´Â.½zÅæ†Ï rØj“âëöÜõôT®  uÚ¢'‰h0ù©:xBãcK@ŠS&²Z~aR|gm#Òr vCæy¹Î|u[~lšðÿÿš§~k‡|x=y½ŸvB€r `m!égŠáaPZ†ÉS#ëK=–BàF:70öI'•&æ¤Ú bÿþõð°ëóAâ%ØvQÏÅãE½]´¿:¬Ù¥½ž­S˜rÎ’ÜñÕ‰»þ†FƒŠ”“Ú€e €€e_”„ƒ‡Õ†Bx‰½óÂ’Þ>˜uKž°¥yl¬ÜM´Â§½ùÅç Ï üØk!â¤ë÷põôéD › Û4'‰ö0ú3:ýBããKAS'$Z~xaRÝg^m$ rMvDy¹ü|u~~l1šüÿÿš›~kp|xy½qvBGr m!›gЉaZ Z†`S#zK=BßÇ:²0õ¿'”˜æF Íÿýrõðëò­â$„ØuÃψÅâÀ½Þ´¾Á¬äÎ¥Tž¬ò˜rv’Û¹ñ’‰»Å†E탊q“Àdþ€€ek”œƒ‡ø†B¦‰½Öô’ÞŒ˜u£ž¦¥yլܿ´Ã ½ yÅç‘Ï †Øk¯â6ëøõõ~Ù 0 ÛÅ'Š„0ú½:ƒBäbKA|SkZ~áaS?g¶m$nrvDXyº*|u¡~lI›ÿÿš~kY|w÷y½CvBr Ùm!MgŠ1aY¿Z…öS#K<¤BßG:-0õ5'” 傳 8ÿüÜõï†ëòâ#òØu5ÏþÅâ;½^´¾H¬ä\¥€êž¬‘˜r’ÛkñN‰»Œ†E¾ƒŠN“¬€dò€€ev’2ƒˆ†BÔ‰¾ôI’ÞÚ˜uûž¦q¥z?¬Ý1´Ã™½ øÅèÏ Øl=âÇëø—õön ÅþcÜV'‹0ûG:BäâKAõSÜZKaS gŽm$¼rÔvD‘yºY|uÃ~l`›ÿÿš„~mÂ|wÔy½vAÔr •m ÿg‰ÙaY^Z…ŒS"–K<+BÞÈ:¨0ô«'“|äð £ÿüGõîñìTâ#aØt§ÏtÅᶽߴ½Ï¬ã륀€ž¬0˜qÆ’Ûñ ‰»R†EƒŠ+“”€d瀀e‚’Jƒˆ=†C‰¾Hô’ß(˜vSž¦Ò¥z©¬Ý¢´Ä½!xÅè›Ï šØlËâXëù+õö¨ ZþöÜè'‹¡0ûÑ:BåaKBnSNZµaTgŽfm% rv>«yº‡|uæ~lw›ÿÿšx~m«|w±y¼ævA›r Qm ±g‰aXýZ…"S"%K;²BÞH:"1é'’îä_Œ ÿû±õî\ìÀâ"ÏØtÏêÅá1½_´½V¬ãy¥€ž«Ï˜qo’ÚÏðƉÁ9†EbƒŠ“}€dÛ€€eŽ’aƒˆ`†C1‰¾ôÑ’ßv˜v«ž§3¥{¬Þ´Äн!÷Åé Îý\ØmYâêëù¾õ÷=™ ïÿŠÝy'Œ/0ü[:BåàKBçSÀZ€aTbg޽m%Xr\v>äyºµ|v ~l›+ÿÿšl~m“|wŽy¼¸vAbr m cg’‘aXœZ„¹S!³K;9BÝÉ:1_'’`ãÎø yÿûõíÇì,â">ØsŠÏ`Å૽à´ÉϬ㥭ž«n˜q’Úð‚‰Àÿ†E4ƒ‰å“f€dÏ€€eš’xƒˆƒ†C_‰¾»õ’ßĘm›ž§•¥{|¬Þ†´Å½"wÅé¥ÎýæØmçâ{ëúRõ÷Ò/ „Þ 'Œ½0üå:—Bæ`K6nS1Z€ˆaTÃgm%¦r v?yºã|v,~l¦›7ÿÿš`~m||wky¼ŠvA)r Ém g’9aX;Z„OS!AK:ÀBÝJ:1Õ'‘Ñã<d äÿú†õí2ëÿ™â!­ØrüÏÖÅà&½`´ÉV¬â–¥Cž« ˜p¿’Ú3ð>‰ÀƆEƒ‰Â“N€dÄ€€dd’ƒˆ¦†C‰¾ôõY’à˜móž§ö¥{æ¬Þ÷´Å|½"öÅê*ÎþpØnvâ ëúæõøgÄ %±Þœ'K0ýo: BæßK6çS£Z€òaU$gmm%ôräv?Vy»|vO~l¾›Bÿÿ›–~me|wIy¼\v@ðr …mÆg‘áaWÚZƒåS ÐK:GBÜÊ:“1K'‘Câ«Ñ Oÿùñõüëÿâ!ØrnÏLÅß¡½á´Èݬâ$¥~Ùžª¬˜pg’Ùåïû‰À†D׃‰Ÿ“7€d¸€€dp’§ƒˆÉ†C»‰¿-õ’àa˜nKž¨W¥|O¬ßi´Åõ½#vÅê°ÎþúØoâžëûyõøüZ ºEß-'Ù0ýú: ¢Bç_K7`SZ[aU…gÅm&Bräv?y»@|vr~lÕ›Nÿÿ›Š~mM|w&y¼.v@¶r Amxg‘‰aWyZƒ|S ^K9ÎBÜK:#O1Á'µâ= ºÿù[õûûëþqâ ŠØqàÏÁÅß½b´Èd¬á²¥~pžªK˜p’Ù—öú‰ÀT†D©ƒ‰}“€d¬€€d|’¾ƒˆì†C鉿fõà’௘n£ž¨¸¥|¹¬ßÛ´Æn½#õÅÜóÎÿ„Øo’â/ëü õù‘ï OØß¿'Žg0þ„:!'BçÞK7ÙS†ZÅaUægm&r (v?Éy»n|v•~lì›Zÿÿ›~m6|wy»ÿv@}r þm*g‘1aWZƒSíK9UBÛË:"Ê17''ሩ %ÿøÆõûfëýÞâùØqRÏ7ÅÞ—½%‡´Çë¬áA¥~ž©é˜o·’ÙHö¶‰À†D{ƒ‰Z“€d €€d‡’Öƒ‰†D‰¿ ö$’Ø¡˜núž©¥}#¬àL´Æç½$uÅÝxÏØp âÀëü õú&… älàP'Žõ0ÿ:!¬BÚ¹K8QSøZ‚/aVGgum&ßr lv@y»œ|v¸~m›eÿÿ›s~m|vày»Ñv@Dr ºm'8gÚaV·Z‚¨S{K8ÝBÛL:"E0ÿ¬'™à÷ ÿø1õúÑëýJâgØpÃÏ­ÅÞ½%´Çr¬àÏ¥}œž©ˆ˜o_’Øúör‰¿á†DMƒ‰7’ñ€d•€€d“’탉2†DF‰¿Ùöh’Øï˜oRž©z¥}Œ¬à¾´Ç`½$ôÅÝþÏ™Øp®âRëý4õú»ÿø yàá'„0ÿ˜:"1BÛ9K8ÊSjZ‚™aV¨gÌm'-r °v@;y»Ê|vÛ~m›qÿÿ›g~m|v½y»£v@ r vm&êg‚aVVZ‚?S K8dBÚÌ:!À0ÿ"' àf‚ û›õú<ëü·âÖØp5Ï#ÅÝŒ½$ˆ´Æù¬à]¥}3ž©'˜o’جö/‰¿¨†Dƒ‰’Ù€d‰€€dŸ“ƒ‰T†Dt‰Àö¬’Ù=˜oªž©Û¥}ö¬á0´ÇÙ½%sÅÞƒÏ#Øq<âãëýÈõûPÿø° “ás'1":"¶BÛ¸K9CSÛZƒaW g‘$m'{r óv@uy»ø|vþ~m2›}ÿÿ›\~lð|všy»uv?Ñr 2m&œg*aUõZÕS˜K7ëBçñ:!;0þ˜'Ž}ßÔî fõù§ëü#âEØo§Îÿ™Åݽ$´Æ€¬ßì¥|Éž¨Æ˜n°’àºõ뉿o†Cðƒˆñ’€d}€€dª“ƒ‰w†D¢‰ÀKöð’Ù‹˜pžª<¥~`¬á¡´ÈR½NÅßÏ­ØqÊâ tëþ[õûåÿùE £'â' 1¬:#;BÜ8K9¼S MZƒlaWjg‘|mmr 7v@®y¼'|w ~mJ›‰ÿÿ›P~lØ|vwy»Gv?˜rîm&NgÒaU”ZkS&K7rBçr: µ0þ'îßC[ Ñpõùëûâ³ØoÎÿÅêĽ#‰´Æ¬ßz¥|_ž¨e˜nX’àlõ§‰¿6†CƒˆÎ’«€dr€€d¶“3ƒ‰š†DЉÀ„ïð’ÙÙ˜pZžª¥~ʬâ´È˽ÎÅßÏ7ØrYâ!ëþïõüzÿùÛ 8»â•'‘.16:BÜ·K:5S ¿ZƒÖaWËg‘Ôm»r {v@çy¼U|wC~ma›”ÿÿ›D~lÁ|vTy»v?_rîm&gzaU2ZS´K6ùBæò: 00ý„'`Þ²Ç <Ûõø}ëúüâ"Øn‹Îþ…Åê>½# ´Åެߥ{öž¨˜n’àõc‰¾ü†C”ƒˆ«’“€df€€d“Kƒ‰½†Dÿ‰À¾ð4’Ú'˜p²žªþ¥3¬â…´ÉD½MÅàÏÁØrçâ!—ëÿƒõíÿúp ÍNã''‘¼1À:BÝ6K:®S!0Z„?aX,g’,m r ¿vA y¼ƒ|wf~mxš_ÿÿ›8~lª|v1yºêv?&rªm%²g"aTÑZ€˜SCK6€Bæs:«0üú'ŒÒÞ 4 šEõ÷èëúhâ‘ØmýÎýûÅé¹½"Š´Å¬Þ—¥{Œž§£˜m¨’ßÐõ‰¾Ã†Cfƒˆˆ’|€eœ€€dÍ“bƒ‰à†E-‰À÷ðx’Úu˜q ž«_¥¬âö´É½½ÍÅà—ÏKØsuâ"(ìõí±ÿû bâã¸'’J1J:‰BݶK;'S!¢Z„©aXg’„m Wr vAYy¼±|w‰~mšjÿÿ›-~l’|vyº¼v>írfm%dgŽËaTpZ€.SÑKBùBåô:&0üp'ŒDÝÿ  °õ÷SëùÔâÿØmoÎýqÅé4½" ´Äœ¬Þ%¥{"ž§B˜v¸’ß‚ôÛ‰¾Š†C8ƒˆe’d€e€€dÙ“yƒŠ†E[‰Á0ð¼’ÚØqaž«À¥€¬ãh´½D½LÅáÏÕØtâ"ºìªõîFÿû› ÷uäI'’Ø1Ô:BÞ5K; S"Z…aXîg‰tm ¥r GvA“y¼ß|w¬~m§švÿÿ›!~l{|uìyºŽv>³r"m%gŽsaTZÅS_KB€Båt:¡0ûæ'‹¶Üþÿ põö¾ëùAânØlàÎüçÅ诽!‹´Ä$¬Ý³¥z¸ž¦á˜v`’ß4ô—‰¾Q†C ƒˆC’M€e„€€då“‘ƒŠ&†E‰‰»Jñ’Û˜q¹ž¬!¥€p¬ãÚ´½½½ÌÅá¢Ï_Øt‘â#Kì=õîÛÿü0 Œ äÛ'“g0ô–:”BÞµK<S"…Z…|aYPg‰Ìm ór ‹vAÌy½|wÏ~m¿š‚ÿÿ›~ld|uÉyº`vDšrÞm$ÈgŽaS®Z[SîKBBäõ:0û\'‹(Ülþy Û…õö)ëø­âÝØlRÏ %Åè*½! ´Ã«¬ÝB¥zOž¦€˜v’ÞæôS‰¾†BÛƒˆ ’6€ex€€dñ“¨ƒŠI†E¸‰»ƒñD’Û_˜rž¬‚¥€Ú¬äK´¾6½KÅâ'ÏéØuâ#ÜìÑõïpÿüÆ !ål'“õ0õ :Bß4K<’S"÷Z…æaY±gŠ$m!Ar ÎvBy½<|wò~kUšŽÿÿ› ~lL|u¦yº1vD`r›m$zgÃaSMZ~ñS|KAŽBäu:–0úÒ'ŠšÛÛ ³ Fïõõ”ëøâKØkÄÏ ›Å祽 Œ´Ã2¬ÜÐ¥y垦˜u°’Þ˜ô‰½Þ†B­ƒ‡ý”Ÿ€em€€dü“ÀƒŠl†E扻¼ñ‡’Û­˜riž¬ã¥D¬ä½´¾¯½ÊÅâ¬ÏsØu®â$nëò—õðÿý[ ¶0åý'”ƒ0õª:žBß´K= S#iZ†PaZgŠ|m!r vB>y½j|x~kmš™ÿÿšþ~l5|uƒyºvD'rWm$,gkaRìZ~‡S KABãö:0úH'Š ÛJ  ±Zõôÿë÷†âºØk6Ï Åç½ ´Â¹¬Ü^¥y{ž°"˜uY’ÞIó̉½¥†Bƒ‡Ú”ˆ€ea€€e“×ƒŠ†F‰»õñË’Ûü˜rÁž­E¥­¬Ù´¿'½JÅã1ÏýØv<â$ÿëó+õðšÿýñ KÄæ'•0ö4:#Bà3K=„S#ÚZ†¹aPgŠÓm!Þr VvBwy½˜|x7~k„š¥ÿÿšò~l|u`y¹ÕvCîrm#ÝgaR‹Z~S&ÃK@œBãv:Œ0ù½'‰}Ú¸ ‹ Äõôjëöòâ)Øj¨Ï ‡Åæš½´Â@¬Ûí¥yž¯Á˜u’Ýû󈉽l†BQƒ‡·”p€eU€€e“±†AP‰¼.ò’ÜJ˜sž­¦¥‚¬Ùv´¿ ½ÉÅã¶ÏˆØvÊâ%ëó¾õñ/ÿþ† à Xç '†h0ö¿:¨Bà³K=ýS$LZ‡#aPpg‹+m",r švB±y½Æ|xZ~k›š±ÿÿšæ~l|u=y¾˜vCµr Ïm#gŒ»aR*Z}´S&RK@#Bâ÷:0ù3'ˆïÚ' ø ‡/õóÕëö_â—ØyQÏüÅæ½´ÁǬÛ{¥x¨ž¯`˜t©’Ý­óD‰½3†B#ƒ‡””Y€eI€€e ”ƒŠÔ†A‰¼hòS’ܘ˜sqž®¥‚¬Ùç´À½IÅä<ÏØwXâ&"ëôRõñÄÿÿ u ëç±'†ö0÷I:.Bá2K>vS$¾Z‡aPÑg‹ƒm"zr ÞvBêy½ô|tÁ~k³š½ÿÿšÛ~kï|uy¾jvC|r ‹m#AgŒdaQÉZ}JS%àK?ªBâx:‚0ø©'ˆaé$ d ò™õó@ëõËâØxÃÏrÅ彎´ÁN¬Û ¥x>ž®ÿ˜tQ’Ý_ó‰¼ú†Aôƒ‹.”B€e>€€e+”ƒŠ÷†A­‰¼¡ò—’Üæ˜sÈž®h¥‚ë¬ÚY´À’½ÈÅäÁÏœØwæâ$ëôæõòYÿÿ±  èC'‡„0÷Ó:³Bá²K>îS%/Z‡öaQ2g‹Ûm"Èr "vC#y¾#|tä~kÊšÈÿÿšÏ~k×|t÷y¾¸Báy:w0÷•'‡Eè = Èÿÿoõòëô¤âãØw§Ï^Åä…½´À\¬Ú&¥‚»ž®=˜s¡’ÜÃòx‰¼‡†A˜ƒŠè”€e&€€eC”Lƒ‹=†B ‰½ó’Ý‚˜txž¯*¥xn¬Û<´Á„½ÇÅåËϰØyâGëö õóƒÜ 4 ¦ÙÖ'ˆ 0øç:½Bâ°K?àS&Z}yaQôgŒ‹m#dr ©vC•y¾|u*~kùšàÿÿš·~k¨|xny½àvBÐr Àm"Wg‹\aP¥Z‡^S$‹K>@Bàù:ò0÷ '†¶çp © 3ÿþÙõñëôâ%áØwÏÔÅä½´¿ã¬Ùµ¥‚Rž­Û˜sI’Üuò5‰¼N†AjƒŠÅ“û€e€€eO”cƒ‡¤†B7‰½Lób’ÝИtО¯‹¥x׬ۮ´Áý½GÅæPÏ :Øy‘âØëö¡õôr É :Úh'‰.0ùq:BBã0K@YS&„Z}ãaRUgŒãm#²r ívCÎy¾­|uM~lšìÿÿš¬~k‘|xKy½²vB—r |m" g‹aPDZ†ôS$K=ÇBàz:m0ö'•`æß  žÿþDõðìëó}â%PØvŠÏJÅã{½´¿j¬ÙC¥èž­z˜rñ’Ü'ññ‰¼†F.ƒŠ¢“ä€e€€eZ”{ƒ‡Ç†Be‰½†ó¦’Þ˜u(ž¯ì¥yA¬Ü ´Âv½ÆÅæÖÏ ÄØjçâjë÷4õô­ ^ ÍÚù'‰½0ùû:ÈBã¯K@ÒS&öZ~MaR¶g:m$r1vDy¹ê|up~l(š÷ÿÿš ~kz|x(y½„vB^r 8m!»gЬaOãZ†ŠS#¨K=NBßú:è0õ÷'”ÒæN‚ ÿý®õðWëòéâ$¾ØuüÏÀÅâö½´¾ñ¬ØÑ¥~ž­˜rš’ÛÙñ­‰»Ü†EÿƒŠ“Í€e€€ef”’ƒ‡ê†B”‰½¿óê’Þl˜u€ž¥é¥y«¬Ü‘´Âï½ EÅç[Ï NØkuâûë÷ÈõõB ó aÛŠ'ŠK0ú…:MBä/KAKS=Z~·aSg’m$NruvDAyº|u’~l?›ÿÿš”~kb|xy½UvB%r ôm!mgŠTaYæZ†!S#6K<ÕBß{:c0õm'”Då¼î tÿýõïÂëòUâ$-ØunÏ6Åâq½’´¾y¬äŠ¥ž¬¸˜rB’Û‹ñi‰»£†EуŠ\“µ€d÷€€er”ªƒˆ †B‰½øô.’Þº˜uØž¦J¥z¬Ý´Ãh½ ÅÅçàÏ ØØlâŒëø[õõ×2 ˆþ'Ü'ŠÙ0û:ÒBä®KAÄS¯Z aSxgêm$œr¹vDzyºF|uµ~lW›ÿÿšˆ~mË|wây½'vAër °m!g‰üaY…Z…·S"ÄK<\BÞû:Ý0ôã'“µå+[ ßÿüƒõï-ìâ#œØtàϬÅáì½´¾¬ä¥€«ž¬W˜qê’Û=ñ%‰»i†E£ƒŠ9“ž€d뀀e~’@ƒˆ/†Bð‰¾1ôr’ß ˜v/ž¦«¥z~¬Ýt´Ãá½!DÅèeÏ bØl’âëøïõölÈ þ»Ü­'‹g0û™:WBå.KB=S ZŠaSÙgŽBm$ërývD³yºt|uØ~ln›ÿÿš}~m´|w¿y¼ùvA²r lm Ðg‰¥aY$Z…MS"SK;ãBÞ|:X1!'“'äšÇ Jÿûîõî˜ìüâ# ØtRÏ"Åáf½“´½‡¬ã§¥€Až«ö˜q’’Úîðá‰ÁP†EuƒŠ“†€dà€€e‰’XƒˆR†C‰¾jô¶’ßW˜v‡ž§ ¥zè¬Ýæ´ÄY½!ÄÅèêÎý$Øm â¯ëùƒõ÷] ²ÿNÝ>'‹õ0ü#:ÜBå­KB¶S’ZôaT;gŽšm%9rAv>Íyº¢|uû~l…›&ÿÿšq~m|wœy¼ËvAyr (m ‚g‰MaXÃZ„äS!áK;jBÝý:Ó1—'’™ä4 µÿûXõîìhâ"yØsÄϘÅàá½´½¬ã5¥מ«•˜q:’Ú ðž‰Á†EFƒ‰ó“o€dÔ€€e•’oƒˆu†CL‰¾¤ôù’ߥ˜mxž§m¥{Q¬ÞX´ÄÒ½"CÅéoÎý®Øm®â@ëúõ÷–ò GÿâÝÐ'Œƒ0ü®:aBæ,K6=SZ€]aTœgŽòm%‡r„v?yºÑ|v~l›2ÿÿše~m…|wzy¼vA@r åm 4g’\aXbZ„zS!oK:ñBÝ}:N1 '’ ãw   ÿúÃõínëÿÔâ!èØs6Ï Åà\½”´É‡¬âÄ¥nž«4˜pâ’ÚRðZ‰À݆Eƒ‰Ð“X€dÈ€€e¡’†ƒˆ˜†Cz‰¾Ýõ=’ßó˜mО§Î¥{»¬ÞÉ´ÅK½"ÃÅéõÎþ8Øn<âÒëúªõø+ˆ ÜuÞa'0ý8:çBæ¬K6¶SuZ€ÇaTýgJm%ÕrÈv??yºÿ|vA~l´›>ÿÿ››~mn|wWy¼nvAr ¡mæg’aXZ„S þK:xBÜþ:É1‚'‘}âæ ‹ÿú-õüÌëÿAâ!VØr§ÏƒÅß×½´É¬âR¥žªÓ˜p‹’Úð‰À¤†Dꃉ®“@€d½€€dk’žƒˆ»†C©‰¿õ’àA˜n'ž¨/¥|%¬ß;´ÅĽ#BÅêzÎþÃØnÊâcëû>õøÀ ~ Þò' 0ýÂ: lBç+K7/SçZ1aU^g¡m&#r v?yy»-|vd~lË›Iÿÿ›~mW|w4y¼@v@Ír ]m˜g‘­aW Zƒ¦S ŒK9ÿBÜ~:D1ø'ïâTy öÿù˜õü7ëþ­â ÅØrÏùÅßR½•´È•¬áà¥~šžªr˜p3’Ù¶÷‰Àk†D¼ƒ‰‹“)€d±€€dw’µƒˆÞ†C׉¿OõÅ’à˜nž¨¥|ެ߭´Æ=½#ÂÅܽÎÿMØoXâôëûÑõùU³ ß„'Ž.0þL: ñBç«K7¨SYZšaU¿gùm&qr v?²y»[|v‡~lã›Uÿÿ›ƒ~m?|wy¼v@”r mJg‘UaW?Zƒ=S K9†BÛÿ:#1n'`áÃå aÿùõû¢ëþâ 4Øq‹ÏoÅÞͽ´È¬áo¥~1žª˜oÛ’ÙhöÒ‰À2†DŽƒ‰h“€d¥€€dƒ’̃‰†D‰¿ˆö ’àݘnמ¨ò¥|ø¬à´Æ¶½$AÅÝCÎÿרoçâ†ëüeõùêH ¨0à'޼0þÖ:!vBÚ†K8!SÊZ‚aV gQm&¿r Pv?ëy»‰|vª~lú›aÿÿ›x~m(|vîy»äv@[r Õm'XgýaVÞZ‚ÓS©K9 BÛ:"{0ÿä'Òá2Q Ìÿømõû ëý†â¢ØpýÏåÅÞG½%;´Ç£¬àý¥}Çž©°˜oƒ’Ùöމ¿ø†D_ƒ‰E’ú€d™€€dŽ’äƒ‰#†D3‰¿ÂöM’ØÏ˜o/ž©S¥}b¬à´Ç/½$ÀÅÝÈÏaØpuâëüøõúÞ =Äà¦'J0ÿ`:!ûBÛK8šSÿùž üâZ'õ1þ:IBÜ„K:S ‘Zƒ«aW¤g‘°m›r `v@Ðy¼B|w5~mX›ÿÿ›I~lÊ|vby»+v?vr m& gžaUZZ,SâK7*Bç&: f0ý¼'šÞì xõø¹ëû7â]ØnÄÎþ½Åêt½#=´Å¿¬ß6¥| ž¨+˜n$’à>õ~‰¿†C§ƒˆ¹’€dk€€d½“Aƒ‰¯†Dì‰À¦ð’Ú˜pŽžª×¥ ¬âW´É½ÅßÜωØr­â!\ëÿGõüÓÿú4 ‘âì'‘ƒ1ˆ:ÎBÝK:}S!Z„aXg’mér ¤vA y¼p|wX~mo››ÿÿ›=~l³|v@yºýv?=rÅm%ÑgFaTùZ€ÃSpK6±Bæ¦:á0ý2' Þ[o Ö‚õø$ëú¤âÌØn6Îþ3Åéï½"½´ÅF¬ÞÅ¥{·ž§Ê˜mÌ’ßðõ:‰¾Ú†Cyƒˆ–’…€e €€dÉ“Yƒ‰Ò†E‰Ààð]’ÚV˜pæž«8¥r¬âÈ´ÉŒ½™ÅàbÏØs;â!îëÿÛõítÿúÉ &¦ã}'’1:TBÝ‚K:öS!tZ„~aXfg’`m 7r çvABy¼Ÿ|w{~m†šfÿÿ›1~lœ|vyºÏv?rm%ƒgŽîaT˜Z€YSÿK68Bæ':\0ü¨'Œ}ÝÊÿÜ Aìõ÷ëúâ:Øm¨Îý©Åéj½">´ÄͬÞS¥{Mž§i˜mt’ߢô÷‰¾¡†CJƒˆt’n€e•€€dÔ“pƒ‰õ†EH‰Áð ’Ú¤˜q>ž«™¥ܬã:´½½ÅàçÏØsÊâ"ìnõî ÿû_ »:ä'’Ÿ1œ:ÙBÞK;oS!æZ„èaXÇg‰Pm †r +vA{y¼Í|wž~mžšqÿÿ›&~l„|uúyº v>Êr>m%5gŽ–aT6ZïSKB±Bå¨:×0ü'‹ïÝ8ÿH ¬Wõöúëù|â©ØmÎýÅèå½!¾´ÄT¬Ýá¥zãž§˜v„’ßSô³‰¾h†CƒˆQ’W€e‰€€dà“‡ƒŠ†Ew‰ÁRðä’Úò˜q–ž«ú¥€F¬ã¬´½Œ½˜ÅálÏ'ØtXâ#ìõîžÿûô PÍä '“-1':^BÞK;èS"WZ…RaY(g‰¨m Ôr ovAµy¼û|wÁ~mµš}ÿÿ›~lm|u×yºrvD±rúm$çgŽ>aSÕZ†SKB8Bå(:Q0û”'‹aܧþ´ ÁõöeëøéâØlŒÏ ]Åè`½!?´ÃÛ¬Ýp¥zzž¦§˜v,’ßôo‰¾/†B.’?€e}€€d쓟ƒŠ;†E¥‰»lñ(’Û@˜q[¥€¯¬ä´¾½ÅáñϱØtæâ#¢ì•õï3ÿüŠ åaå1'“»0ôè:ãBßK|u‘yºvD>rrm$KgaSZ~²S8KAFBä):G0ú'ŠEÛ„ [ í–õõ;ë÷ÂâõØkoÏ HÅçU½ @´Âê¬ÜŒ¥y¦ž¥å˜u|’Þió牽¼†B’ƒ‡è”‘€ef€€e“ÎƒŠ€†F‰»Þñ°’Ûܘrž­¥ƒ¬ØÖ´¾÷½ÅâûÏÆØvâ$Äëòïõð]ÿý´ ˆæT'”Ø0õý:íBàK=SS#¬Z†aOçgаm!¾r ;vB`y½…|x)~kzš ÿÿš÷~l'|uny¹èvDr.m#ýg7aR²Z~HS&ñK@ÍBãª:Â0ùõ'‰·Úó Ç Xõô¦ë÷.âdØjáÏ ¾ÅæÐ½Á´Âq¬Ü¥y=ž¯è˜u$’Þ󣉽ƒ†Bcƒ‡Å”z€eZ€€e“僊£†F/‰¼ñô’Ü*˜rõž­~¥ì¬ÙH´¿o½–ÅãÏPØvâ%VëóƒõðòÿþJ ¤ æå'•f0ö‡:sBàK=ÌS$Z†øaPHg‹m" r vB™y½´|xL~k’š¬ÿÿšë~l|uKy¾«vCÌr êm#¯gŒßaRQZ}ßS&K@TBã*:=0ùk'‰)Úb 3 ÃkõôëöšâÒØy‹Ï 4ÅæK½A´Áø¬Û©¥xÓž¯‡˜tÌ’ÝÍó_‰½J†B5ƒ‡¢”b€eN€€e“üƒŠÆ†Al‰¼Qò7’Üx˜sMž­ß¥‚V¬Ù¹´¿è½ÅäÏÚØwâ%çëôõñ‡ÿþß 9 ¯çv'†¼0÷:øBàÿK>ES$Z‡baPªg‹`m"Zr ÃvBÓy½â|xo~k©š¸ÿÿšß~kø|u(y¾}vC“r §m#agŒ‡aQðZ}uS&K?ÛBâ«:¸0øá'ˆšÙÐ   .Öõó|ëöâAØxýϪÅ寽´Á¬Û7¥xiž¯&˜tt’Ý󉽆Bƒ‹<”K€eB€€e'”ƒŠé†Aš‰¼Šò{’ÜÆ˜s¥ž®A¥‚À¬Ú+´Àa½•Åä‹ÏdØw­âêëôªõòÿÿu Î Cè'‡K0÷›:}Bá~K>¾S%Z‡ÌaQ g‹¸m"¨r vC y¾|tÖ~kÁšÄÿÿšÔ~ká|uy¾OvCZr cm#gŒ/aQZ} S%œK?bBâ,:20øW'ˆ èÎ ™@õòçëõsâ°ØxnÏ Åå@½B´Á¬ÚÆ¥xž®Å˜t’Ý1ò؉¼Ø†AÙƒ‹”4€e7€€e2”+ƒ‹ †Aȉ¼Ãò¿’ݘsýž®¢¥ƒ*¬Ú´ÀÚ½ÅåÏîØx;â{ëõ>õò± c ×è™'‡Ù0ø%:BáýK?6S%sZ|åaQlgŒm"ör JvCEy¾>|tù~kØšÏÿÿšÈ~kÉ|tây¾!vC r m"Åg‹×aQ.Z‡òS%+K>éBá¬:­0÷Í'‡~è< y ÿÿ«õòRëôßâØwàÏ–Å份ôÀ¬ÚT¥‚æž®d˜sÅ’Üãò”‰¼ž†A«ƒŠö”€e+€€e>”Cƒ‹/†Aö‰¼üó’Ýb˜tUž¯¥xC¬Û´ÁS½”Åå•ÏxØxÉâ ëõÑõóF  ø jé*'ˆg0ø¯:‡Bâ}K?¯S%åZ}OaQÍgŒgm#Er ŽvC~y¾l|u~kðšÛÿÿš¼~k²|t¿y½òvBçr Ûm"vg‹aPÍZ‡ˆS$¹K>pBá-:(0÷C'†ðç« å oÿÿõñ½ëôLâ&ØwRÏ Åä6½C´À¬Ù㥂|ž®˜sm’Ü”òP‰¼e†A}ƒŠÓ”€e€€eJ”Zƒ‡–†B%‰½5óG’ݱ˜t¬ž¯d¥x­¬Û€´Á̽ÅæÏ ØyWâžëöeõóÛ5  þÚ-'ˆõ0ù9: BâüK@(S&VZ}¸aR.gŒ¿m#“r ÒvC·y¾š|u?~lšçÿÿš°~kš|xYy½ÄvB®r —m"(g‹(aPlZ‡S$GK=øBà­:£0ö¹'†bç Q Úÿþ€õñ(ëó¸â%ŠØvÄÏ‚Å㱽Ĵ¿›¬Ùq¥‚ž­¢˜s’ÜFò ‰¼,†F@ƒŠ°“í€e€€eV”qƒ‡¹†BS‰½nó‹’Ýÿ˜už¯Å¥y¬Ûò´ÂE½’Åæ Ï ŒØj®â/ëöøõôpË " ’Ú¾'‰ƒ0ùÃ:’Bã|K@¡S&ÈZ~"aRgm#árvCðy¹×|ua~lšóÿÿš¥~kƒ|x6y½–vBur Sm!ÚgŠÐaP Z†µS#ÖK=Bà.:0ö/'• 戾 Eÿýëõð“ëó%â$ùØv6ÏøÅã,½E´¿"¬Øÿ¥©ž­@˜r½’Ûøñȉ»ó†FƒŠ“Ö€e€€ea”‰ƒ‡Û†B‰½¨óÏ’ÞM˜u\ž°&¥y€¬Üc´Â¾½ Åç%Ï Øk<âÀë÷Œõõ` · %ÛP'Š0úM:BãûKASZ~ŒaRðgom$/rZvD*yº|u„~l6šþÿÿš™~kl|xy½hvBgŠ aY­Z…âS"òK¶yº|uí~l|›!ÿÿšv~m¦|wªy¼ÝvAr Dm ¢g‰paXêZ…S"K;›BÞ0: 1Î'’ÓäCo ñÿû•õî?ì¤â"´ØsýÏÏÅá½G´½?¬ãc¥€ž«¼˜q^’ÚÀð¹‰Á.†EYƒŠ“x€dÙ€€e’eƒˆg†C:‰¾ŒôÞ’ß…˜v¼ž§F¥{'¬Þ*´Ä¢½"Åé:ÎýwØmuâëùÛõ÷Y¶  ÿ¦Ý•'ŒJ0üv:,BåùKBþSÖZ€3aTtgŽÎm%griv>ïyº¾|v~l“›-ÿÿšj~m|wˆy¼¯vAWr m Tg’€aX‰Z„¥S!K;"Bݱ:„1D'’Dã²Ü \ÿúÿõíªìâ""ØsoÏEÅà’½Ǵɸ¬âò¥˜ž«[˜q’Úrðu‰Àô†E+ƒ‰ß“a€dÍ€€eœ’}ƒˆŠ†Ch‰¾Æõ"’ßÓ˜m¬ž§§¥{¬Þ›´Å½"Åé¿ÎþØnâ—ëúnõ÷îL  :Þ&'ŒØ0ý:±BæxK6…SGZ€œaTÕg&m%µr­v?(yºì|v3~l«›9ÿÿš^~mw|wey¼vAr ¼m g’(aX(Z„;S!,K:©BÝ1:ÿ1º'‘¶ã H Çÿújõíëÿ|â!‘ØráÏ»Åà ½H´É?¬â€¥/žªú˜p®’Ú$ð1‰À»†Dýƒ‰¼“J€dÁ€€df’”ƒˆ­†C–‰¾ÿõf’à!˜nž¨¥{ú¬ß ´Å“½#ÅêDÎþ‹Øn‘â(ëûõøƒá BÍÞ¸'f0ýŠ: 6BæøK6þS¹ZaU7g~m&rñv?ay»|vV~l›Eÿÿ›”~m`|wBy¼Sv@år xm·g‘ÐaWÇZƒÑS ºK:0Bܲ:y10'‘(â´ 2ÿùÔõütëþéâ!ØrSÏ1Å߈½É´ÈƬâ¥~Åžª™˜pV’ÙÖïî‰À‚†D󉙓2€d¶€€dr’¬ƒˆÐ†Cĉ¿8õª’àp˜n\ž¨i¥|d¬ß´Æ ½#ŽÅ܈ÎÿØoâºëû•õùv ×aßI'ô0þ: »BçwK7wS+ZpaU˜gÖm&Qrñv?›y»I|vy~lÙ›Pÿÿ›ˆ~mI|wy¼%v@«r 4mig‘xaWfZƒhS HK9·BÜ2:#61¦'šáþ! ÿù?õûßëþUâ nØqÅϧÅß½I´ÈM¬á¥~[žª8˜oþ’Ùˆöí‰ÀI†D ƒ‰v“€dª€€d~’Èò†Cò‰¿qõî’྘n´ž¨Ê¥|ͬßð´Æ…½$ ÅÝ ÎÿŸØo­âKëü)õù­ lõßÚ'Žƒ0þž:!@Bç÷K7ðSœZÙaUùg.m&Ÿr 5v?Ôy»w|vœ~lñ›\ÿÿ›|~m1|vüy»÷v@rr ñm'wg‘!aWZ‚þS×K9>BÛ³:"±1' ál ÿø©õûJëýÁâÝØq6ÏÅÞ}½%n´ÇÔ¬á+¥}òž©×˜o¦’Ù:ö©‰À†Drƒ‰S“€dž€€d‰’Úƒ‰†D!‰¿ªö1’ذ˜o ž©+¥}7¬àb´Æþ½$ÅÝ’Ï)Øp;âÜëü½õúB¡ ˆàl'0ÿ(:!ÅBÚÒK8iSZ‚CaVZg…m&îr yv@ y»¥|v¾~m›hÿÿ›q~m|vÙy»Èv@9r ­m')gÉaV¤Z‚”SeK8ÅBÛ3:"+0ÿ’'~àÛù sÿøõúµëý.âLØp¨Ï“ÅÝø½$ï´Ç[¬à¹¥}ˆž©v˜oO’Øëöe‰¿Ö†DDƒ‰0’ì€d’€€d•’òƒ‰8†DO‰¿äöu’Øþ˜ocž©Œ¥}¡¬àÔ´Çw½% ÅÞϳØpÉânëýPõú×ÿø7 –àý'Ÿ0ÿ²:"KBÛQK8âS€Z‚­aV»gÝm'v?rám&?gÁaUZWSK7[BçY: œ0ýô'Óß'? ´Sõøöëûsâ˜ØnþÎþõÅꪽ#p´Åð¬ßd¥|Kž¨S˜nG’à]õš‰¿+†C¹ƒˆÇ’¦€do€€d¸“8ƒ‰¡†DÙ‰Àïý’Ùè˜pkžª°¥~Þ¬â)´Èâ½æÅß§ÏQØrtâ!"ëÿ õü—ÿù÷ U×â±'‘I1P:™BÜÏK:LS ÕZƒêaWÞg‘åmÊr ˆv@òy¼^|wJ~mf›–ÿÿ›B~l½|vNy»v?Trám%ñgiaU Z€íSžK6âBæÚ: 0ýj'EÞ–« ¾õøaëúßâØnpÎþjÅê%½"ñ´Åw¬Þó¥{áž§ò˜mï’àõV‰¾ñ†C‹ƒˆ¥’€dd€€dÄ“Oƒ‰Ä†E‰ÀÉðA’Ú6˜pÞ«¥G¬âš´É[½fÅà,ÏÛØsâ!³ëÿŸõí8ÿú êjãB'‘×1Û:BÝOK:ÅS!FZ„TaX?g’=m r ÌvA+y¼Œ|wm~m}šaÿÿ›6~l¥|v+yºáv?rm%£gaT¿Z€„S-K6iBæ[:’0üà'Œ·Þ })õ÷ÌëúLâuØmáÎýàÅé ½"q´Äþ¬Þ¥{xž§˜m—’ßÁõ‰¾¸†C]ƒˆ‚’w€e™€€dГgƒ‰ç†E6‰Áð…’Ú„˜qž«r¥±¬ã ´ÉÔ½åÅà±ÏfØsâ"Dì3õíÍÿû" þãÔ'’f1e:£BÝÎK;>S!¸Z„½aX g‰-m fr vAdy¼º|w~m”šmÿÿ›*~lŽ|vyº³v>ârYm%UgŽºaT^Z€S»KBáBåÛ: 0üU'Œ)Ýsÿ„ è“õ÷7ëù¸âäØmSÎýVÅé½!ò´Ä…¬Þ¥{ž§/˜v§’ßsôΉ¾†C/ƒˆ_’`€eŽ€€dÛ“~ƒŠ †Ed‰Á;ðÉ’ÚÒ˜qrž«Ó¥€¬ã~´½[½eÅá6ÏðØtâ"ÖìÆõîbÿû¸ ’äe'’ô1ï:(BÞNK;·S"*Z…'aYg‰…m ´r TvAžy¼è|w³~m¬šxÿÿ›~lv|uåyº…v>¨rm%gŽbaSýZ°SIKBiBå\:‡0ûË'‹›Üâþð Sþõö¢ëù$âRØlÅÏ ”Å蕽!r´Ä ¬Ýž¥z¤ž¦Î˜vO’ß%ôЉ¾F†Cƒˆ<’I€e‚€€dç“•ƒŠ-†E’‰»Uñ ’Û ˜qÊž¬4¥€…¬ãï´½Ô½äÅá»ÏzØt­â#gìZõî÷ÿüM ©%äö'“‚0ô±:­BÞÍK<0S"›Z…‘aYbg‰Ým!r ˜vA×y½|wÖ~mÚ„ÿÿ›~l_|uÂyºWvDrÑm$¹gŽ aSœZGSØKAðBäÜ:0ûA'‹ ÜPþ\ ¾hõö ëø‘âÁØl7Ï Åè½ ó´Ã“¬Ý,¥z;ž¦m˜u÷’Þ×ôF‰¾ †BÒƒˆ’1€ev€€dó“­ƒŠO†EÀ‰»ŽñQ’Ûn˜r"ž¬•¥€î¬äa´¾M½cÅâ@ÏØu;â#øëò õïŒÿüã >¹åˆ'”0õ;:2BßMK<©S# Z…úaYÃgŠ5m!Pr ÜvBy½E|wø~kZšÿÿ›~lH|uŸyº)vDUrŽm$kg²aS:Z~ÝSfKAwBä]:}0ú·'Š~Û¿ – )Óõõxë÷ýâ0Øk©Ï €Å狽 t´Ã¬Üº¥yÑž¦ ˜u ’Þ‰ô‰½Ó†B¤ƒ‡ö”›€ej€€dÿ“ăŠr†EÇñ”’Û¼˜rzž¬ö¥X¬äÓ´¾Æ½ãÅâÆÏŽØuÉâ$Šëò³õð!ÿýx ÓMæ'”ž0õÅ:¸BßÌK="S#Z†daZ$gŠŒm!žr vBIy½s|x~kqšœÿÿšü~l0|u|y¹úvDrJm$gZaRÙZ~sS'K@þBãÝ:ø0ú-'‰ðÛ.  ”=õôãë÷jâžØkÏ öÅç½ô´Â¢¬ÜI¥ygž°˜uH’Þ;󿉽š†Bvƒ‡Ó”ƒ€e_€€e “ÛƒŠ•†F‰¼ñØ’Ü ˜rÒž­W¥Â¬Ù´¿?½bÅãKÏØvWâ%ëóGõð¶ÿþ hàæª'•,0öO:=BàLK=›S#ðZ†ÎaP!gŠäm!ír cvB‚y½¡|x>~kˆš§ÿÿšð~l|uYy¹ÌvCãrm#ÎgaRxZ~ S&­K@…Bã^:s0ù£'‰bÚœ o ÿ¨õôNëöÖâ ØjÏ lÅæ½u´Â)¬Û×¥xþž¯®˜tð’Ýìó{‰½a†BHƒ‡°”l€eS€€e“󃊸†AY‰¼9ò’ÜY˜s*ž­¸¥‚+¬Ù‹´¿¸½âÅãÐÏ¢Øvåâ%¬ëóÛõñKÿþ£ ý tç<'†ƒ0öÙ:ÂBàËK>S$bZ‡7aP‚g‹ëônõñàÿÿ8 ’ çÍ'‡0÷c:GBáKK>S$ÓZ‡¡aPãg‹”m"‰r ëvBõy½ý|tÈ~k·š¿ÿÿšØ~kê|uy¾avCqr ~m#2gŒSaQ¶Z}6S%ÊK?“Bâ_:h0ø'ˆFé  H Õ}õó$ëõ¯âêØx¨ÏXÅåv½v´Á7¬Úô¥x*ž®ì˜t@’ÝPòó‰¼ï†A샋'”=€e;€€e.”"ƒŠþ†A¶‰¼¬ò¤’Üõ˜sÙž®z¥‚ÿ¬Úo´À©½áÅäÚ϶Øxâ@ëõõòuÿÿÎ ' ›è^'‡Ÿ0÷í:ÌBáÊK?S%EZˆ aQDg‹ìm"×r /vC.y¾+|të~kÏšËÿÿšÍ~kÓ|tñy¾3vC8r :m"äg‹ûaQUZˆS%XK?Báà:ã0ø'‡·èw ´ @ÿÿçõòëõâYØxÏÎÅäñ½ö´À¾¬Ú‚¥ƒž®‹˜sè’Ýò¯‰¼¶†A½ƒ‹”&€e0€€e9”9ƒ‹!†A䉼åòè’ÝC˜t1ž®Ü¥x¬Úà´Á"½`Åå`Ï@ØxâÑëõ–õó c ¼ /èð'ˆ-0øw:RBâIK?S%·Z}$aQ¦gŒDm#%r svCgy¾Z|u ~kæšÖÿÿšÁ~k»|tÎy¾vBþr öm"–g‹£aPôZ‡³S$çK>¡Bá`:^0÷{'‡)çæ ! «ÿÿRõñúëô‡âÈØwŒÏDÅäl½w´ÀE¬Ú¥‚§ž®*˜s’Ü´òk‰¼|†AƒŠá”€e$€€eE”Pƒ‡ˆ†B‰½ó+’Ý‘˜t‰ž¯=¥x‚¬ÛR´Á›½àÅååÏÊØyâcëö)õóŸù Q ÂÙò'ˆ¼0ù:×BâÉK?÷S&(Z}ŽaRgŒœm#sr ¶vC y¾ˆ|u0~kýšâÿÿšµ~k¤|xgy½×vBÅr ³m"Hg‹KaP“Z‡IS$uK>(Bàá:Ù0öñ'†›çU ÿþ¼õñeëóôâ%ÅØvýϺÅãç½÷´¿Ì¬ÙŸ¥‚=ž­É˜s8’Üfò(‰¼C†AaƒŠ¾“÷€e€€eQ”hƒ‡«†B@‰½Wóo’Ýߘtឯž¥xì¬ÛĴ½_ÅæjÏ UØy¬âôëö½õô4Ž æ VÚ„'‰J0ù‹:\BãHK@pS&šZ}÷aRhgŒóm#Ár úvCÙy¹Ä|uS~lšîÿÿš©~kŒ|xDy½©vBŒr om!úgŠóaP2Z†àS$K=¯Bàa:S0öf'•EæÃù ÿþ'õðÐëó`â%4ØvoÏ/Åãb½x´¿S¬Ù-¥Ôž­h˜rá’Üñ䉼 †F%ƒŠ›“߀e €€e]”ƒ‡Í†Bn‰½‘ó³’Þ-˜u9ž¯ÿ¥yU¬Ü5´Â½ÞÅæïÏ ßØkâ…ë÷PõôÉ$ { êÛ'‰Ø0ú:áBãÈK@éS' Z~aaRÉgKm$r>vDy¹ò|uv~l,šúÿÿšž~ku|x!y½{vBSr +m!¬gŠ›aOÑZ†vS#’K=7Bßâ:Î0õÜ'”¶æ2f ìÿý‘õð;ëòÍâ$¢ØuáÏ¥Åâܽù´¾Ú¬äæ¥jž­˜r‰’ÛÊñ ‰»Ñ†EöƒŠx“È€e€€eh”—ƒ‡ð†Bœ‰½Êó÷’Þ{˜u‘ž¥ü¥y¿¬Ü§´Ã½ ^ÅçtÏ iØk‘âë÷äõõ^¹  }Û¦'Šf0ú :fBäGKAbSSZ~ËaS*g£m$]r‚vDLyº!|u™~lD›ÿÿš’~k^|wþy½LvBr çm!^gŠCaYÔZ† S# K<¾Bßb:I0õR'”(å¡Ò Wÿüüõï¦ëò9â$ØuSÏÅâW½y´¾a¬ät¥ž¬¦˜r1’Û|ñ\‰»˜†EȃŠU“±€dõ€€et”®ƒˆ†Bˉ¾ô;’Þɘu螦]¥z)¬Ý´Ã½ ÝÅçùÏ óØlâ¨ëøxõõóO ¥þCÜ8'Šô0û*:ëBäÇKAÛSÄZ5aS‹gûm$«rÆvD…yºO|u¼~l[›ÿÿš†~mÇ|wÛy½vAàr £m!g‰ìaYsZ…£S"¯K Âÿügõïìsâ#€ØtÅÏ‘ÅáÒ½ú´½è¬ä¥€—ž¬D˜qÙ’Û.ñ‰»_†EšƒŠ2“™€d退e€’Eƒˆ6†Bù‰¾<ô’ߘv@ž¦¾¥z’¬ÝŠ´Ãø½!]ÅèÏ }Øl­â9ëù õöˆä :þ×ÜÉ'‹‚0û´:qBåFKBTS6ZžaSìgŽSm$úr v>Ÿyº}|uß~lr›ÿÿšz~m°|w¹y¼ðvA§r _m Ág‰”aYZ…9S"=K;ÌBÞd:?1'“ ä~« -ÿûÑõî|ìßâ"îØt7ÏÅáM½z´½p¬ã‘¥€-ž«ã˜q’ÚßðÔ‰ÁE†ElƒŠ“‚€dÝ€€eŒ’\ƒˆY†C'‰¾uôÃ’ßf˜v˜ž§¥zü¬Ýü´Äq½!ÜÅéÎý?Øm;âËëùŸõ÷z ÏÿkÝZ'Œ0ü>:öBåÅKBÍS¨Z€aTMgŽ«m%HrNv>Øyº«|v~lŠ›(ÿÿšo~m˜|w–y¼ÂvAnr m sg‰ƒ‰í“j€dÒ€€e—’sƒˆ|†CU‰¾¯õ’ß´˜m‰ž§€¥{f¬Þn´Äê½"\Åé‰ÎýÉØmÉâ\ëú3õ÷² dÿþÝì'ŒŸ0üÈ:{BæEK6TSZ€raT®gm%–r‘v?yºÙ|v%~l¡›4ÿÿšc~m|wsy¼”vA5r Øm %g’LaXPZ„fS!ZK:ÚBÝe:41ò'‘ðã[„ ÿú¦õíRëÿ¸â!ÌØsÏóÅàB½{´Éo¬â®¥Yž«!˜pÑ’ÚCðM‰ÀÒ†Eƒ‰Ê“S€dÆ€€e£’‹ƒˆŸ†Cƒ‰¾èõJ’à˜màž§á¥{ϬÞß´Åc½"ÛÅêÎþSØnWâíëúÆõøG¥ ’Þ}'-0ýR: BæÄK6ÍS‹Z€ÛaUgZm%ärÕv?Jy»|vH~l¹›@ÿÿ›˜~mj|wPy¼fv@ür ”m×g‘ôaWîZƒüS èK:aBÜå:¯1h'‘bâÊð nÿúõü°ëÿ$â!:ØrŒÏiÅß½½ü´È÷¬â<¥~ðžªÀ˜pz’Ùõð ‰À™†D჉§“<€dº€€dm’¢ƒˆÁ†C²‰¿!õŽ’àP˜n8ž¨B¥|9¬ßQ´ÅÛ½#[Åê“ÎþÝØnæâëûZõøÜ: ›%ß'»0ýÜ: …BçDK7FSýZEaUpg²m&2rv?„y»6|vk~lЛLÿÿ›~mR|w-y¼7v@Âr Pm‰g‘œaWZƒ’S vK9èBÜf:#l1Þ'Óâ9\ Ùÿù{õüëþ‘â ©ØqþÏßÅß8½}´È~¬áÊ¥~†žª_˜p"’Ù§÷ ‰À`†D³ƒ‰„“$€d¯€€dy’¹ƒˆä†Cà‰¿ZõÒ’àž˜nž¨£¥|£¬ßôÆT½#ÚÅÜ×ÎÿgØotâëûíõùqÐ 0¹ß 'ŽI0þf:! BçÃK7¿SnZ¯aUÑg m&€r v?½y»d|v~lç›Wÿÿ›~m;|w y¼ v@‰r m;g‘DaW,Zƒ)S K9oBÛæ:"æ1T'Eá§É Dÿøæõû†ëýýâ ØqpÏUÅÞ³½ý´È¬áY¥~ž©þ˜oÊ’ÙYöʼnÀ'†D…ƒ‰a“ €d£€€d…’у‰†D‰¿“ö’ؘnèž©¥} ¬à4´ÆÍ½$YÅÝ\ÎÿñØpâ¡ëüõúe ÅMà1'Ž×0þð:!BÚžK88SàZ‚aV2gbm&Îr ]v?öy»’|v°~lÿ›cÿÿ›u~m#|vçy»Ûv@Pr Èm'IgìaVËZ‚¿S“K8öBÛg:"a0ÿÊ'·á5 ¯ÿøPõúñëýjâ†ØpâÏËÅÞ.½%"´ÇŒ¬àç¥}³ž©˜or’Ù ö‰¿í†DWƒ‰>’ö€d—€€d’胉*†D<‰¿ÍöZ’ØÞ˜o@ž©e¥}v¬à¦´ÇF½$ÙÅÝáÏ{Øpâ3ëýõú›ú ZààÂ'e0ÿz:"BÛK8±SRZ‚‚aV”gºm'r ¡v@/y»À|vÓ~m›oÿÿ›j~m |vÄy»­v@r „m&ûg”aVjZ‚US!K8}BÚç:!Ü0ÿ@')à…¡ »õú\ëüÖâõØpSÏAÅÝ©½$£´Ç¬àu¥}Iž©<˜o’ؽö=‰¿´†D(ƒ‰’Þ€d‹€€dœ“ƒ‰M†Dj‰Àöž’Ù,˜o˜ž©Æ¥}à¬á´Ç¿½%XÅÞgÏØqâÄëý¨õû0ÿø ïtáT'ô1:"šBÛK9*SÃZ‚ìaVõg‘m'jr åv@hy»ï|vö~m-›zÿÿ›^~lõ|v¢y»v?Þr @m&­g=aV ZëS°K8Bè :!W0þ¶'Ž›ßó …%õùÇëüBâdØoÅÎÿ¶ÅÝ$½$#´Æš¬à¥|ßž¨Û˜nÂ’àËõù‰¿{†Cúƒˆø’Ç€d€€€d¨“ƒ‰p†D˜‰À?öâ’Ùz˜o'¥~I¬á‰´È8½3ÅÞìÏØq¬â Vëþ<õûÅÿù% „áå'‚1:#BÜK9£S 5ZƒVaWVg‘im\r )v@¢y¼|w~mE›†ÿÿ›R~lÝ|vy»Pv?¤rüm&_gåaU¨Z‚S>K7‹Bç: Ò0þ,'Ž ßbz ðõù2ëû¯âÒØo7Îÿ,ÅÜž½#¤´Æ!¬ß’¥|vž¨z˜nk’à}õµ‰¿B†C̃ˆÖ’°€dt€€d´“.ƒ‰“†DljÀxïâ’ÙȘpGžªˆ¥~³¬áû´È±½³ÅßqÏØr:â çëþÐõüZÿù» ›âv'‘1:cBÜœK:S §Zƒ¿aW·g‘Ámªr mv@Ûy¼K|w<~m\›’ÿÿ›G~lÆ|v\y»"v?krüm&gaUGZSÌK7Bç : M0ý¡'~ÞÐç [úõøëûâAØn©Îþ¢Åê[½#$´Å¨¬ß ¥| ž¨˜n’à/õq‰¿ †Cžƒˆ³’˜€dh€€d¿“Fƒ‰¶†Dõ‰À±ð&’Ú˜pŸžªé¥¬âm´É*½2ÅßöϤØrÉâ!xëÿcõüïÿúP ®/ã'‘ž1£:èBÝK:”S!Z„)aXg’mør ±vAy¼y|w_~mtš\ÿÿ›;~l¯|v9yºôv?2r¸m%Ãg5aTæZ€®S[K6šBæŽ:Ç0ý'ŒðÞ?S ºeõøëú‡â°ØnÎþÅéÖ½"¥´Å/¬Þ¯¥{¢ž§¸˜m»’ßáõ-‰¾Ï†Cpƒˆ’€ež€€dË“]ƒ‰Ù†E#‰Àëðj’Úe˜p÷ž«K¥†¬âÞ´É£½²Åà{Ï.ØsWâ" ëÿ÷õí‘ÿúæ CÂã™'’,1-:mBÝ›K; S!ŠZ„“aXyg’qm Fr ôvAMy¼§|w‚~m‹šhÿÿ›/~l—|vyºÆv>ùrtm%tgŽÝaT…Z€ESéK6!Bæ:B0ü'ŒbÝ®ÿ¿ %Ïõ÷sëùôâØmÎýŽÅéP½"%´Ä¶¬Þ=¥{9ž§W˜vË’ß“ôꉾ–†CAƒˆm’i€e’€€dדtƒ‰ü†EQ‰Á$ð­’Ú³˜qOž«¬¥ð¬ãP´½*½1ÅáϸØsåâ"›ì‹õî&ÿû{ ØVä*'’º1·:òBÞK;†S!üZ„üaXÚg‰am •r 8vA†y¼Ö|w¥~m¢štÿÿ›#~l€|uóyº˜v>¿r1m%&gŽ…aT$ZÛSwKB™Bå:½0ü'‹ÔÝÿ, :õöÞëù`âØlÿÎýÅè˽!¦´Ä=¬ÝÌ¥zÏž¦ö˜vs’ßDô¦‰¾]†CƒˆJ’R€e‡€€dⓌƒŠ†E‰Á]ðñ’Û˜q§ž¬ ¥€Z¬ã´½£½±Åá†ÏBØtsâ#,ìõî»ÿü mêä¼'“H0ôy:wBÞšK;ÿS"mZ…faY;g‰¹m ãr |vAÀy½|wÇ~mºšÿÿ›~lh|uÐyºivD¦rím$ØgŽ-aSÃZqSKB!Bå:80ûy'‹FÜ‹þ˜ û¥õöIëøÌâüØlpÏ BÅèF½!&´ÃĬÝZ¥zež¦•˜v’Þöôb‰¾$†B僈'’;€e{€€dî“£ƒŠA†E®‰»wñ5’ÛO˜qþž¬n¥€Ä¬ä3´¾½0Åâ ÏÌØuâ#¾ì²õïPÿü¦ }åM'“×0õ:ýBßK Ñzõõë÷¥âÙØkTÏ .Åç<½ (´ÂÒ¬Üw¥y’ž°7˜uk’ÞZóÚ‰½±†B‰ƒ‡á”€ec€€e“ÒƒŠ‡†F ‰»éñ½’Ûë˜r®ž­0¥—¬Øì´¿½/ÅãÏàØvâ$àëó õðzÿýÑ ,¥æp'”ó0ö:BàK=jS#ÂZ†£aOúgŠÁm!Ír HvBky½Ž|x0~kš£ÿÿšõ~l"|ugy¹ßvCúr!m#îg&aR Z~4S&ÛK@¶Bã‘:¨0ùÛ'‰›Ú× « <äõôŠë÷âHØjÆÏ ¤Åæ¶½¨´ÂZ¬Ü¥y(ž¯Õ˜u’Þ ó–‰½x†B[ƒ‡¿”u€eX€€e“郊ª†F8‰¼"ò’Ü9˜sž­‘¥‚¬Ù^´¿‡½®ÅãšÏjØv¬â%rëóŸõñÿþg Á 8ç'†I0ö¡:ŒBà˜K=ãS$4Z‡ aP[g‹m"r ŒvB¤y½¼|xS~k–š®ÿÿšé~l |uDy¾¢vCÁr Ým# gŒÎaR>Z}ÊS&jK@=Bã:#0ùQ'‰ ÚF  §Oõóõëö~â¶ØyoÏ Åæ1½)´Áá¬Û“¥x¿ž¯t˜t»’ݾóR‰½?†B,ƒ‡œ”^€eL€€e”ƒŠÍ†Au‰¼\òD’܇˜s^ž­ò¥‚j¬ÙÏ´À½.ÅäÏôØw:â&ëô3õñ¤ÿþü V Ìç’'†Ø0÷+:BáK>\S$¦Z‡vaP¼g‹pm"ir ÐvBÞy½ë|xv~k®šºÿÿšÝ~kô|u"y¾tvCˆr šm#RgŒvaQÝZ}aS%øK?ÄBâ“:ž0øÇ'ˆéC „ ¹õó`ëõêâ%ØxáÏÅ嬽©´Áh¬Û"¥xUž¯˜td’Ýp󉽆Aþƒ‹5”F€e@€€e)”ƒŠð†A£‰¼•òˆ’ÜÕ˜s¶ž®S¥‚Ô¬ÚA´Àx½­Åä¥Ï~ØwÈâëôÆõò9ÿÿ’ ë _è$'‡f0÷µ:—Bá–K>ÕS%Z‡àaQg‹Èm"·r vCy¾|tÜ~kÅšÆÿÿšÑ~kÜ|tÿy¾FvCOr Vm#gŒaQ|Z|÷S%†K?KBâ:0ø='‡ñè² ð }$õòËëõWâ”ØxSÏÅå'½*´Àï¬Ú°¥wëž®²˜t ’Ý"òˉ¼Í†AЃ‹”/€e4€€e5”0ƒ‹†Aщ¼ÎòÌ’Ý#˜tž®´¥wî¬Ú²´Àñ½-Åå*Ï ØxVâ—ëõZõòÎ' € óèµ'‡ô0ø?:BâK?NS%‰Z|ùaQ~gŒ m#r WvCPy¾G|tÿ~kÝšÒÿÿšÆ~kÅ|tÜy¾vCr m"¶g‹ÆaQZ‡ÞS%K>ÒBá”:”0÷²'‡cè! \ èÿÿŽõò6ëôÃâØwÅÏ{Å䢽ª´Àv¬Ú>¥‚Òž®Q˜s´’ÜÔò‡‰¼“†A¢ƒŠï”€e)€€e@”Gƒ‹6†Aÿ‰½ó’Ýq˜tež¯¥xW¬Û$´Áj½¬Åå¯Ï“Øxäâ(ëõîõóc¼  ‡éF'ˆ‚0øÊ:¡Bâ•K?ÇS%úZ}caQßgŒxm#Sr ›vC‰y¾u|u"~kôšÝÿÿšº~k­|xuy½êvBÜr Îm"hg‹oaPºZ‡tS$£K>YBá:0÷('†Õç É Sÿþùõñ¡ëô0â&Øw7ÏñÅä½+´¿ý¬ÙÍ¥‚hž­ð˜s\’Ü…òC‰¼Z†AtƒŠÌ”€e€€eL”^ƒ‡œ†B-‰½@óT’ÝÀ˜t½ž¯v¥xÁ¬Û–´Áã½+Åæ4Ï Øyrâ¹ëöõóøR ª ÚI'‰0ùT:&BãK@?S&lZ}ÍaRAgŒÐm#¢r ßvCÂy¾£|uE~l šéÿÿš®~k–|xRy½»vB£r Šm"g‹aPYZ‡ S$1K=àBà•:‰0öž'†Fæþ 5 ¾ÿþcõñ ëóœâ%nØv©ÏgÅã—½¬´¿„¬Ù[¥þž­˜s’Ü7ñÿ‰¼!†F7ƒŠ©“é€e€€eX”vƒ‡¿†B\‰½yó˜’Þ˜už¯Ø¥y+¬Ü´Â\½«Åæ¹Ï §ØjÉâKë÷õôç ? ®ÚÚ'‰ž0ùÞ:«Bã”K@¸S&ÞZ~6aR¢g(m#ðr#vCûy¹à|uh~l#šõÿÿš¢~k~|x/y½vBjr Fm!ËgŠ¿aOøZ†¡S#ÀK=gBà:0ö'”ðæm¡ (ÿýÎõðwëóâ$ÝØvÏÝÅã½,´¿ ¬Øé¥•ž­.˜r¬’Ûéñ»‰»è†F ƒŠ†“Ñ€e€€ed”ƒ‡â†BЉ½³óÜ’Þ\˜umž¥Õ¥y”¬Üy´ÂÕ½ *Åç>Ï 1ØkWâÜë÷¨õõ"} Ô BÛl'Š-0úh:0BäKA1S%Z~ aSg€m$>rgvD5yº|u‹~l:›ÿÿš—~kg|x y½_vB1r m!}gŠgaYûZ†7S#NK<îBß–:0õŠ'”båÛ “ÿý8õïâëòuâ$LØuŒÏSÅâ½­´¾’¬ä¢¥+ž¬Í˜rT’Û›ñw‰»¯†EÛƒŠc“º€dú€€eo”¥ƒˆ†B¸‰½ìô’Þª˜uÅž¦6¥yþ¬Üë´ÃN½ ªÅçÄÏ »Økåâmëø<õõ· i ÕÛý'Š»0úò:¶Bä“KAªS–Z aSdgØm$ŒrªvDnyº<|u®~lR› ÿÿš‹~mÐ|wêy½1vAør ¿m!/gŠaYšZ…ÍS"ÜKÁyº™|uô~l€›$ÿÿšs~m¢|w¤y¼ÕvA…r 7m “g‰_aXØZ„úS!ùK;„BÞ:ï1´'’·ä'S Ôÿûxõî#ì‡â"˜ØsâϵÅàý½.´½(¬ãM¥îž«ª˜qM’Ú±ð¬‰Á#†EPƒ‰û“t€dÖ€€e“’jƒˆn†CB‰¾—ôë’ß”˜vÍž§Y¥{;¬Þ@´Ä¹½"(ÅéSÎý‘Ømâ!ëù÷õ÷vÓ (ÿÂݱ'Œe0ü:EBæK6#SëZ€GaT‡gŽßm%vrvv>úyºÇ|v~l˜›/ÿÿšh~mŠ|wy¼¦vALr óm Eg’oaXwZ„S!ˆK; Bݘ:j1*'’)ã–¿ ?ÿúãõíŽëÿôâ"ØsTÏ+Åàx½¯´É ¬âÜ¥„ž«H˜põ’Úcðh‰Àé†E"ƒ‰Ø“]€dË€€ež’ƒˆ‘†Cq‰¾Ñõ/’ßâ˜m½ž§º¥{¥¬Þ±´Å2½"¨ÅéØÎþØnâ³ëú‹õø h ½VÞB'Œó0ý:ÊBæ‘K6œS]Z€±aTèg7m%Ärºv?3yºõ|v:~l¯›;ÿÿš\~ms|w^y¼xvAr ¯m÷g’aXZ„'S!K:’BÝ:å1 '‘›ã, ªÿúMõüìëÿ`â!uØrÆÏ¡Åßó½0´É'¬âj¥žªç˜p’Úð$‰À°†Dôƒ‰µ“E€d¿€€di’™ƒˆ³†CŸ‰¿ õs’à0˜nž¨¥|¬ß#´Å«½#'Åê^Îþ¥Øn¬âDëûõø þ ^êÞÔ'‚0ý¤: OBçK7SÏZaUIgm&rþv?ly»#|v\~lÇ›Gÿÿ›’~m\|w;y¼Jv@Úr km©g‘¿aWµZƒ½S ¤K:BÜ™:`1'‘ âs˜ ÿù¸õüWëþÌâ äØr7ÏÅßn½°´È®¬áø¥~±žª†˜pE’ÙÇïà‰Àw†Dƃ‰’“.€d³€€dt’°ƒˆÖ†C͉¿Cõ·’à˜nmž¨|¥|x¬ß•´Æ$½#¦ÅÜ¡Îÿ/Øo:âÕëû²õù5“ ó}ße'Ž0þ.: ÕBçK7ŽS@Z„aUªgçm&`rþv?¦y»Q|v~lÞ›Sÿÿ›†~mD|wy¼v@ r 'mZg‘haWTZƒSS 3K9 BÜ:#1Œ'áâ €ÿù"õûÂëþ9â RØq©ÏŒÅÞé½1´È6¬á‡¥~Gžª%˜oí’Ùyöà‰À>†D—ƒ‰o“€d¨€€d€’ǃˆù†Cû‰¿|õû’à͘nÄž¨Ý¥|â¬à´Æœ½$&ÅÝ&Îÿ¹ØoÈâgëüEõùÊ) ˆßö'Žž0þ¹:!ZBÚkK8S²ZîaV g>m&®r Bv?ßy»€|v¢~lõ›^ÿÿ›z~m-|võy»îv@gr äm'hg‘aVóZ‚êSÁK9'BÛš:"—1'ñáQq ëÿøõû-ëý¥âÁØqÏÅÞd½%V´Ç½¬á¥}Ýž©Ä˜o–’Ù+öœ‰À†Diƒ‰L’ÿ€dœ€€dŒ’߃‰†D)‰¿µö>’Ø¿˜ož©>¥}K¬àx´Ç½$¥ÅݬÏCØpWâøëüÙõú_¾ ¥àˆ',0ÿC:!ßBÚêK8€S$Z‚WaVlg–m&ür †v@y»®|vÅ~m ›jÿÿ›n~m|vÓy»¿v@.r  m'g¸aV‘Z‚€SOK8®BÛ:"0ÿw'bà¿Ý V÷õú˜ëýâ0ØpÏxÅÝÞ½$Ö´ÇD¬à£¥}tž©c˜o>’ØÜöX‰¿Ë†D;ƒ‰)’è€d€€d—’öƒ‰?†DX‰¿ïö‚’Ù ˜otž©Ÿ¥}µ¬àê´Ç޽%%ÅÞ1ÏÎØpåâ‰ëýmõúôÿøT ²8á'º0ÿÍ:"dBÛjK8ùS•Z‚ÁaVÍgîm'Kr Êv@Qy»Ü|vè~m$›vÿÿ›c~lþ|v°y»‘v?õr \m&Ìg`aV0Z‚SÞK85BÚ›:!0þí'ŽÔà.I Ábõúëü~âžØoÿÎÿîÅÝY½$W´ÆË¬à2¥} ž©˜næ’ØŽö‰¿’†D ƒ‰’Ѐd…€€d£“ ƒ‰b†D†‰À(öÆ’Ù[˜oÌžª¥~¬á[´È½ÅÞ¶ÏXØqsâ ëþõû‰ÿøé GÌáª'H1W:"éBÛéK9rS Zƒ+aW.g‘Fmm ur vAoy¼Ã|w–~m™šoÿÿ›(~l‰|vyºªv>×rLm%FgŽ©aTKZ€S¥KBÊBåÃ:ó0ü;'Œ ÝWÿg Ìvõ÷ëùœâÈØm8Îý<Åé½!Ù´Än¬Ýù¥zúž§˜v–’ßdôÁ‰¾t†C&ƒˆX’\€e‹€€dÞ“‚ƒŠ†Em‰ÁFðÖ’Úá˜qƒž«å¥€/¬ã”´½r½}ÅáPÏ Øt:â"ñìâõîÿûÔ 0®ä'“1 :BBÞfK;ÎS"?Z…;aYg‰–m Ãr avA¨y¼ñ|w¹~m°š{ÿÿ›~lr|uÞyº|vD½rm$øgŽQaSêZœS4KBQBåC:n0û±'‹ÜÆþÔ 7áõö…ëùâ6ØlªÏ zÅè|½!Z´Ãõ¬Ýˆ¥zž¦¼˜v>’ßô}‰¾;†Bøƒˆ5’D€e€€€d铚ƒŠ3†E›‰»`ñ’Û/˜qÛž¬G¥€™¬ä´½ë½üÅáÕÏ”ØtÈâ#ƒìvõïÿüj ÅBå'“0ôË:ÇBÞæKÿý• ïiæ5'”¹0õß:ÑBßåK=9S#”Z†xaOÓgŠm!­r ,vBTy½||x"~kvšžÿÿšù~l,|uvy¹ñvDr=m$gIaRÇZ~_S' K@çBãÅ:Þ0ú'‰ÕÛ æ x!õôÆë÷Mâ‚ØjÿÏ ÜÅæì½ܴЬÜ3¥ySž¯ý˜u7’Þ,󲉽†Bmƒ‡Í”€e\€€e “àƒŠœ†F&‰¼ ñå’ܘrãž­j¥Ö¬Ù0´¿V½{ÅãdÏ2Øvrâ%7ëócõðÓÿþ* „ýæÆ'•H0öi:VBàdK=²S$Z†âaP4gŠõm!ür pvBy½ª|xE~kšªÿÿšî~l|uSy¹ÃvCØr ùm#¿gŒòaRfZ}õS&˜K@nBãF:Y0ù‰'‰GÚ€ S ã‹õô1ëöºâñØy©Ï RÅæg½\´Â¬ÛÁ¥x鞯œ˜tß’ÝÝón‰½V†B?ƒ‡ª”g€eQ€€e“÷ƒŠ¿†Ab‰¼Dò)’Üh˜s:ž­Ë¥‚@¬Ù¡´¿Ï½úÅãêϽØwâ%Èëó÷õñhÿþÀ  çX'†ž0öó:ÜBàäK>+S$xZ‡LaP•g‹Mm"Jr ´vBÆy½Ø|xh~k¤šµÿÿšâ~ký|u0y¾‡vCŸr µm#qgŒšaRZ}‹S&&K?õBâÆ:Ô0øþ'ˆ¹Ùï ¿ Nöõóœëö&â`ØyÏÇÅåâ½Ý´Á™¬ÛP¥x€ž¯;˜t‡’Ýó*‰½†Bƒ‡‡”P€eE€€e$”ƒŠâ†A‰¼~òm’ܶ˜s’ž®,¥‚©¬Ú´ÀH½zÅäoÏGØwâËëô‹õñýÿÿU ¯ $çé'‡,0÷~:aBácK>¤S$éZ‡µaPög‹¥m"˜r øvCy¾|tÎ~k¼šÁÿÿšÖ~kæ|u y¾YvCfr qm##gŒBaQ£Z}"S%´K?|BâG:O0øt'ˆ*èí , ¹`õóëõ’âÎØxÏ=Åå]½]´Á ¬ÚÞ¥xž®Ù˜t/’ÝAò扼ä†Aニ ”9€e9€€e0”&ƒ‹†A¾‰¼·ò±’ݘsêž®¥ƒ¬Ú…´ÀÁ½ùÅäôÏÑØxâ\ëõõò’ÿÿë D ·èz'‡»0ø:æBáâK?S%[ZˆaQWg‹ým"ær ƒ‹(†A퉼ðòõ’ÝR˜tBž®î¥x,¬Úö´Á9½yÅåyÏ[Øx«âíëõ²õó'€ Ù Ké 'ˆI0ø’:kBâbK?–S%ÍZ}8aQ¸gŒUm#4r €vCry¾b|u~këšÙÿÿš¿~k·|tÇy½üvBór ém"‡g‹’aPáZ‡ŸS$ÑK>ŠBáH:D0÷`'‡çÊ  ÿÿ5õñÝëôkâ&;ØwpÏ)ÅäR½^´À.¬Ùû¥‚“ž®˜s’Ü¥ò^‰¼q†A†ƒŠÚ” €e"€€eG”Uƒ‡Ž†B‰½)ó8’Ý ˜tšž¯O¥x–¬Ûh´Á²½øÅåþÏåØy9âëöFõó¼ n ßÚ'ˆ×0ù:ðBâáK@S&>Z}¢aRgŒ¬m#‚r ÃvC«y¾‘|u7~lšäÿÿš³~kŸ|x`y½ÎvBºr ¦m"9g‹:aP€Z‡5S$_K>BàÈ:¿0öÖ'†€ç9 q úÿþ õñHëóØâ%©ØvâÏŸÅãͽß´¿µ¬Ù‰¥‚)ž­¶˜s(’ÜWò‰¼8†AXƒŠ·“ò€e€€eS”lƒ‡±†BI‰½bó|’Ýî˜tòž¯°¥y¬ÛÙ´Â+½wÅæƒÏ oØjâëöÙõôQ«  rÚŸ'‰e0ù¦:uBãaK@ˆS&°Z~ aRzgm#ÐrvCäy¹Í|uZ~lšðÿÿš§~kˆ|x=y½ vBr bm!ëgŠâaPZ†ËS#îK=˜BàI::0öL'•)æ§Ý eÿþ õð³ëóDâ%ØvTÏÅãH½`´¿<¬Ù¥¿ž­U˜rÐ’Ü ñ׉»ÿ†FƒŠ•“Û€e €€e_”„ƒ‡Ô†Bw‰½œóÀ’Þ<˜uJž°¥yi¬ÜK´Â¤½÷Åç Ï ùØkâ¡ë÷mõôæ@ ˜ Û1'‰ó0ú0:ûBãàKAS'!Z~uaRÛg\m$rKvDy¹û|u}~l1šüÿÿš›~kq|xy½rvBHr m!gŠŠaZ"Z†bS#|K=BßÉ:µ0õÂ'”›æI Ðÿýuõðëò°â$†ØuÆÏ‹ÅâýാìäÐ¥Vž¬ô˜rx’Û»ñ“‰»Æ†Er“Ä€dþ€€ek”›ƒ‡÷†B¥‰½Õô’ÞŠ˜u¡ž¦¥yӬܽ´Ã½ vÅçŽÏ ƒØk¬â3ëøõõ{Ö - šÛÂ'Š0úº:€Bä`KAyShZ~ßaS=g´m$lrvDWyº*|u ~lH›ÿÿš~kY|wøy½DvBr Úm!OgŠ3aYÁZ…øS# K<¦BßJ:00õ8'” å…¶ ;ÿüßõï‰ëòâ#õØu8ÏÅâ>½a´¾J¬ä_¥€ìž¬“˜r ’ÛmñO‰»†E¿ƒŠO“¬€dó€€ev’2ƒˆ†BÓ‰¾ôH’ÞØ˜uùž¦o¥z=¬Ý.´Ã–½ öÅèÏ Øl:âÄëø”õök Âþ`ÜT'‹0ûD:BäßKAòSÚZIaSžgŽ m$ºrÓvDyºX|uÃ~l`›ÿÿš„~mÃ|wÕy½vAÕr –m!g‰ÛaY`Z…ŽS"™K<.BÞË:ª0ô®'“äó" ¦ÿüJõîôìWâ#dØt©ÏwÅḽᴽѬãí¥€‚ž¬2˜qÈ’Ûñ ‰»T†E‘ƒŠ,“•€d瀀e‚’Iƒˆ=†C‰¾GôŒ’ß'˜vQž¦Ð¥z§¬Ý ´Ä½!uÅè˜Ï —ØlÈâUëù(õö¥ WþóÜå'‹ž0ûÎ:ŠBå^KBkSLZ³aSÿgŽdm%rv>ªyº†|uæ~lw›ÿÿšx~m«|w²y¼çvAœr Rm ²g‰ƒaXÿZ…%S"'K;µBÞK:%1ì'’ñäb ÿû´õî_ìÃâ"ÒØtÏíÅá3½b´½X¬ã{¥€ž«Ñ˜qp’ÚÐðljÁ:†EcƒŠ “}€dÛ€€eŽ’aƒˆ`†C0‰¾€ôÐ’ßu˜v©ž§2¥{¬Þ´Äˆ½!õÅéÎýYØmVâçëù»õ÷:– ìÿ‡Ýv'Œ,0üX:BåÞKBäS½Z€aT`g޼m%Wr[v>ãyº´|v ~lŽ›+ÿÿšl~m”|wy¼¹vAcr m dg‰+aXžZ„»S!µK;îrgm%egŽÌaTrZ€0SÓKBûBåö:)0üs'ŒGÝ’ÿ£ ³õ÷Vëù×âØmrÎýtÅé7½" ´ÄŸ¬Þ'¥{$ž§D˜vº’ß„ô݉¾‹†C9ƒˆf’e€e€€dÙ“yƒŠ†EZ‰Á/ðº’Ú˜q`ž«¾¥€¬ãf´½A½JÅáÏÒØtâ"·ì§õîCÿû˜ ôräF'’Ö1Ñ: BÞ3K;žS"Z…aXíg‰rm ¤r EvA‘y¼Þ|w«~m§švÿÿ›!~l{|uìyºv>´r$m%gŽtaTZÇSbKB‚Båw:¤0ûé'‹¹Ýÿ sõöÁëùDâqØlãÎüêÅè²½!´Ä&¬Ý¶¥z»ž¦ã˜vb’ß5ô™‰¾R†C ƒˆC’N€e„€€d哃Š%†Eˆ‰»Iðþ’Û˜q·ž¬¥€n¬ã×´½º½ÉÅáŸÏ\ØtŽâ#Hì:õîØÿü- ‰äØ'“d0ô“:‘BÞ²K<S"ƒZ…zaYNg‰Êm òr ‰vAËy½ |wÎ~m¾š‚ÿÿ›~ld|uÉyºavD›ràm$ÉgŽaS°Z]SðKB Bä÷:0û_'‹+Üoþ| Þˆõö,ëø°âàØlUÏ (Åè,½!´Ã­¬ÝD¥zQž¦‚˜v ’ÞçôU‰¾†B܃ˆ ’6€ex€€d𓨃ŠH†E·‰»‚ñB’Û^˜rž¬€¥€Ø¬äI´¾3½HÅâ$ÏæØuâ#ÙìÎõïmÿüà šåi'“ò0õ:Bß2Ky¾™vC¶r Ðm#‘gŒ½aR,Z}¶S&TK@&Bâú: 0ù6'ˆòÚ* û Š2õóØëöbâšØyTÏÿÅæ½´ÁɬÛ~¥xªž¯b˜t«’ݯóE‰½4†B$ƒ‡•”Y€eJ€€e”ƒŠÔ†A~‰¼fòQ’Ü–˜sož®¥‚¬Ùå´À½FÅä9ÏØwUâ&ëôOõñÁÿÿ r èç®'†ó0÷F:+Bá/K>sS$»Z‡‹aPÏg‹m"xr ÝvBéy½ó|tÀ~k²š¼ÿÿšÛ~kï|uy¾kvC}r m#CgŒeaQËZ}LS%âK?­Bâz:„0ø¬'ˆdé' g õõóCëõÎâ ØxÆÏuÅ哽‘´ÁQ¬Û ¥xAž¯˜tS’Ýaó‰¼û†Aõƒ‹.”B€e>€€e+”ƒŠ÷†A¬‰¼ ò•’Üä˜sÇž®f¥‚è¬ÚW´À½ÆÅä¾Ï™Øwãâ!ëôãõòVÿÿ®  |è@'‡0÷Ð:°Bá¯K>ìS%-Z‡ôaQ0g‹Ùm"Ær vC"y¾"|tã~kÊšÈÿÿšÏ~kØ|tøy¾=vCDr Im"õgŒ aQjZ|ãS%qK?4Báû:ÿ0ø"'‡Öè– Ô `õò®ëõ:âxØx8ÏëÅå ½´Àجښ¥ƒ'ž® ˜sû’Ýò¾‰¼Â†Aǃ‹ ”+€e2€€e7”4ƒ‹†AÚ‰¼ÙòÙ’Ý2˜tž®Ç¥x¬ÚÈ´Á ½EÅåCÏ#Øxqâ³ëõvõòëD œ èÑ'ˆ0øZ:5Bâ.K?eS%ŸZ}aQ‘gŒ1m#r dvC[y¾P|u~kášÔÿÿšÃ~kÀ|tÕy¾vC r m"§g‹¶aQ Z‡ÉS$ÿK>»Bá{:z0÷˜'‡Gè @ Ëÿÿrõòëô§âæØwªÏaÅ䈽’´À_¬Ú)¥‚¾ž®>˜s£’ÜÅòz‰¼‰†A™ƒŠè”€e&€€eC”Kƒ‹<†B‰½ó’Ý€˜tvž¯(¥xk¬Û:´Á‚½ÄÅåÈÏ­ØyâDëö õó€Ù 1 £ÙÓ'ˆ0øä:ºBâ®K?ÞS&Z}waQògŒ‰m#br ¨vC”y¾~|u)~kùšàÿÿš¸~k©|xny½ávBÑr Ám"Yg‹^aP§Z‡`S$K>BBàü:õ0÷'†¹çs ¬ 6ÿþÜõñ„ëôâ%äØwÏ×Åä½´¿æ¬Ù·¥‚Tž­Ý˜sK’Üvò6‰¼O†AkƒŠÆ“ü€e€€eN”cƒ‡£†B6‰½Kóa’ÝϘtΞ¯‰¥xÕ¬Û¬´Áú½DÅæNÏ 7ØyŽâÕëöõôo Æ 7Úe'‰,0ùn:@Bã-K@WS&‚Z}áaRSgŒám#±r ìvCÍy¾¬|uL~lšëÿÿš¬~k‘|xKy½³vB˜r }m" g‹aPFZ†öS$K=ÉBà|:p0ö„'•cæâ  ¡ÿþGõðïëó€â%SØvÏMÅã~½“´¿m¬ÙE¥êž­|˜ró’Ü(ñò‰¼†F/ƒŠ£“ä€e€€eZ”zƒ‡Æ†Bd‰½„ó¥’Þ˜u&ž¯ê¥y?¬Ü´Âs½ÃÅæÓÏ ÁØjäâgë÷1õôª [ ÊÚö'‰º0ùø:ÅBã­K@ÐS&ôZ~KaR´g9m#ÿr0vDy¹é|uo~l'š÷ÿÿš ~kz|x)y½„vB_r 9m!¼gŠ®aOåZ†ŒS#ªK=PBßý:ë0õú'”ÕæQ… ÿý±õðZëòìâ$ÁØuÿÏÃÅâù½´¾ô¬ØÔ¥€ž­˜r›’ÛÚñ®‰»Ý†FƒŠ€“Í€e€€ef”’ƒ‡é†B“‰½¾óé’Þk˜u~ž¥ç¥y¨¬Ü´Âì½ CÅçXÏ KØksâøë÷Åõõ?š ð ^Û‡'ŠH0ú‚:JBä,KAHS;Z~´aSg‘m$MrtvD@yº|u’~l?›ÿÿš”~kc|xy½VvB&r õm!ngŠVaYèZ†#S#8K<×Bß}:e0õp'”Få¿ñ wÿýõïÅëòXâ$0ØuqÏ9Åâs½”´¾{¬ä¥ž¬º˜rD’ÛŒñj‰»¤†EÒƒŠ]“¶€d÷€€er”©ƒˆ †BÁ‰½÷ô,’Þ¹˜uÖž¦H¥z¬Ý´Ãe½ ÂÅçÝÏ ÖØlâ‰ëøXõõÔ/ … ñÜ'ŠÖ0û :ÏBä¬KAÁS¬ZaSvgèm$›r·vDyyºE|uµ~lV›ÿÿš‰~mÌ|wãy½(vAír ²m! g‰þaY‡Z…¹S"ÇK<^BÞþ:à0ôå'“¸å.^ âÿü†õï0ì’â#ŸØtãϯÅáî½´¾¬ä¥€­ž¬Y˜qì’Û>ñ'‰»k†E¤ƒŠ:“ž€d쀀e}’@ƒˆ/†B0ôp’ߘv.ž¦©¥z|¬Ýr´ÃÞ½!BÅèbÏ `ØlâëøìõöiÄ þ¸ܪ'‹d0û—:TBå+KB:SZˆaS×gŽ@m$érûvD²yºs|uØ~lm›ÿÿš}~mµ|wÀy¼úvA³r nm Òg‰¦aY&Z…OS"UK;åBÞ:[1$'“*äÊ Mÿûñõî›ìÿâ# ØtUÏ$Åái½•´½‰¬ã©¥€Cž«ø˜q”’Úððã‰ÁQ†EvƒŠ“‡€dà€€e‰’WƒˆQ†C‰¾iô´’ßU˜v†ž§ ¥zå¬Ýä´ÄW½!ÁÅèèÎý!Ømâ¬ëù€õöþZ ¯ÿKÝ;'‹ò0ü!:ÙBåªKB³SZòaT9gŽ˜m%7r?v>Ìyº¡|uú~l…›&ÿÿšq~m|wy¼ÌvAzr *m „g‰NaXÅZ„æS!ãK;mBÝÿ:Ö1™'’œä 7 ¸ÿû[õîìkâ"|ØsÇÏšÅàä½´½¬ã8¥Úž«—˜q<’Ú¢ðŸ‰Á†EGƒ‰ô“o€dÔ€€e•’nƒˆt†CK‰¾¢ôø’ߣ˜mvž§k¥{O¬ÞU´Äн"AÅémÎý¬Øm«â=ëúõ÷“ï DÿßÝÍ'Œ€0ü«:_Bæ*K6:SZ€[aTšgŽðm%…rƒv?yºÐ|v~lœ›2ÿÿše~m†|wzy¼žvAAr æm 6g’^aXdZ„|S!rK:ôBÝ€:Q1'’ãz£ #ÿúÆõíqëÿ×â!ëØs8ÏÅà_½–´É‰¬âÆ¥pž«6˜pä’ÚTð[‰ÀÞ†Eƒ‰Ñ“X€dÈ€€e¡’†ƒˆ—†Cz‰¾Üõ<’ßñ˜mΞ§Ì¥{¹¬ÞÇ´ÅI½"ÀÅéòÎþ6Øn9âÏëú§õø(… ÙrÞ^'0ý5:äBæ©K6³SsZ€ÅaTûgHm%ÓrÇv?>yºþ|v@~l´›=ÿÿ››~mo|wWy¼ovAr ¢mèg’aXZ„S!K:{BÝ:Ë1…'‘€âé Žÿú0õüÐëÿDâ!YØrªÏ†ÅßÚ½´É¬âT¥žªÕ˜pŒ’Úð‰À¥†D냉®“A€d½€€dk’ƒˆº†C¨‰¿õ€’à?˜n&ž¨-¥|#¬ß9´Å½#?ÅêwÎþÀØnÇâ`ëû:õø½ {Þï'0ý¿: iBç)K7,SåZ/aU\g m&!r v?wy»,|vc~lË›Iÿÿ›~mW|w4y¼Av@Ïr ^mšg‘¯aW¢Zƒ©S ŽK:BÜ:F1û'òâW| ùÿù›õü;ëþ°â ÈØrÏüÅßT½˜´È—¬áã¥~žªt˜p4’Ù¸÷‰Àl†D½ƒ‰‹“)€d±€€dw’µƒˆÝ†CÖ‰¿NõÄ’àŽ˜n}ž¨Ž¥|Œ¬ßª´Æ;½#¿ÅÜ»ÎÿJØoVâñëûÎõùR° šß'Ž+0þI: îBç¨K7¥SVZ˜aU½g÷m&or v?±y»Z|v†~lâ›Uÿÿ›„~m@|wy¼v@•r mKg‘WaWAZƒ?S K9‰BÜ:#1q'cáÆè dÿùõû¦ëþâ 6ØqŽÏrÅÞϽ´È¬áq¥~3žª˜oÝ’ÙjöÓ‰À3†Dƒ‰h“€d¥€€d‚’̃‰†D‰¿‡ö’àܘnÕž¨ð¥|ö¬à´Æ´½$>ÅÝ@ÎÿÔØoäâƒëübõùçE ¥-à'޹0þÓ:!sBÚƒK8SÈZ‚aVgOm&½r Ov?êy»ˆ|v©~lú›`ÿÿ›x~m(|vïy»åv@\r ×m'YgÿaVàZ‚ÕS«K9BÛ‚:"~0ÿç'Õá5T Ïÿøpõûëý‰â¥ØqÏèÅÞJ½%=´Ç¥¬àÿ¥}Éž©²˜o…’Ùö‰¿ú†D`ƒ‰F’û€dš€€dŽ’ãƒ‰#†D2‰¿ÀöK’ØÎ˜o-ž©Q¥}`¬àŽ´Ç-½$¾ÅÝÅÏ^Øprâëüõõú|Û :Áà¤'G0ÿ]:!øBÛK8—S:Z‚laVg§m' r “v@#y»·|vÌ~m›lÿÿ›l~m|vÌy»·v@#r “m' g§aVZ‚lS9K8—BÛ:!ø0ÿ]'Gà£Á :Ûõú{ëüõâØprÏ^ÅÝŽ$¾´Ç,¬àŽ¥}_ž©Q˜o-’ØÎöK‰¿À†D2ƒ‰#’ã€dŽ€€dš’ûƒ‰F†D`‰¿úö’Ù˜o…ž©²¥}ɬàÿ´Ç¦½%=ÅÞJÏèØqâ¥ëý‰õûÿøp ÏUá5'Õ0ÿç:"~BÛ‚K9S«Z‚ÕaVàgÿm'Zr ×v@\y»å|vï~m(›xÿÿ›`~lú|v©y»ˆv?êr Om&½gOaVZ‚SÈK8BÚƒ:!s0þÓ'޹à- ¥Eõùæëübâ‚ØoäÎÿÔÅÝ@½$>´Æ´¬à¥|öž¨ï˜nÕ’àÜö‰¿‡†Dƒ‰’Ì€d‚€€d¥“ƒ‰i†D‰À3öÓ’Ùj˜oÝžª¥~3¬áq´È½ÅÞÏÏrØqŽâ 7ëþõû¦ÿù dèáÆ'd1q:#BÜK9‰S Zƒ?aWAg‘WmKr v@•y¼|w~m@›„ÿÿ›U~lâ|v†y»Zv?±r m&og÷aU½Z˜SVK7¥Bç¨: î0þI'Ž+ßš °õùQëûÎâñØoUÎÿJÅÜ»½#¿´Æ;¬ßª¥|Œž¨Ž˜n}’àõĉ¿N†CÖƒˆÝ’´€dw€€d±“)ƒ‰‹†D½‰Àl÷’Ù¸˜p5žªt¥~¬áã´È—½˜ÅßUÏüØrâ Èëþ°õü;ÿù› ù|âX'ò1û:FBÜK:S Zƒ©aW¢g‘¯mšr ^v@Ïy¼A|w5~mW›ÿÿ›I~lË|vcy»,v?wr m&!g aU\Z/SäK7,Bç): i0ý¿'Þï {õø¼ëû:â`ØnÇÎþÀÅêw½#?´Å¬ß9¥|"ž¨-˜n%’à?õ€‰¿†C¨ƒˆº’€dk€€d½“Aƒ‰®†Dë‰À¥ð’Ú˜pŒžªÕ¥¬âT´É½ÅßÚφØrªâ!YëÿDõüÐÿú1 Žâé'‘€1…:ÌBÝK:{S!Z„aXg’mèr ¢vAy¼o|wW~mo››ÿÿ›=~l´|v@yºþv?>rÇm%ÓgHaTûZ€ÅSsK6³Bæ©:ä0ý5'Þ^r Ù…õø'ëú§âÎØn9Îþ6Åéò½"À´ÅI¬ÞÇ¥{¹ž§Ì˜mÎ’ßñõ<‰¾Ü†Cyƒˆ—’†€e¡€€dÉ“Xƒ‰Ñ†E‰Àßð[’ÚT˜päž«6¥p¬âƴɉ½—Åà_ÏØs9â!ëëÿØõíqÿúÆ #£ãz'’1:QBÝ€K:ôS!rZ„|aXdg’^m 6r ævAAy¼ž|wz~m†šeÿÿ›2~lœ|vyºÐv?rƒm%…gŽðaTšZ€[SK6:Bæ*:_0ü«'Œ€ÝÍÿß Dïõ÷’ëúâ=Øm«Îý«Åém½"@´ÄЬÞU¥{Ož§k˜mv’ߣôø‰¾¢†CKƒˆt’n€e•€€dÔ“oƒ‰ô†EG‰ÁðŸ’Ú¢˜q<ž«—¥Ú¬ã8´½½ÅàäÏšØsÇâ"|ìkõîÿû\ ¸7ä '’œ1š:ÖBÝÿK;mS!äZ„æaXÅg‰Om „r *vAzy¼Ì|w~mšqÿÿ›&~l…|uúyº¡v>Ìr?m%7gŽ˜aT8ZñSKB³Båª:Ù0ü '‹òÝ;ÿK ¯Zõöýëùâ¬ØmÎý!Åèç½!Á´ÄW¬Ýä¥zåž§ ˜v…’ßUô´‰¾i†CƒˆQ’W€e‰€€dà“‡ƒŠ†Ev‰ÁQðã’Úð˜q”ž«ø¥€C¬ã©´½‰½•ÅáiÏ%ØtUâ# ìÿõî›ÿûñ MÊä'“*1$:[BÞK;æS"UZ…OaY&g‰¦m Òr nvA³y¼ú|wÀ~mµš}ÿÿ›~lm|uØyºsvD²rûm$égŽ@aS×ZˆSKB:Bå+:T0û–'‹dܪþ· ÄõöhëøìâØlÏ _Åèb½!B´ÃÞ¬Ýr¥z|ž¦©˜v.’ßôp‰¾0†B/’@€e}€€d쓞ƒŠ:†E¤‰»kñ'’Û>˜q재Y¥€­¬ä´¾½ÅáîϯØtãâ#Ÿì’õï0ÿü† â^å.'“¸0ôæ:àBÞþK<^S"ÇZ…¹aY‡g‰þm! r ²vAíy½(|wã~mÌš‰ÿÿ›~lV|uµyºEvDyr·m$›gèaSvZS¬KAÁBä«:Ï0û 'ŠÖÜ ñ …/õõÓëøXâ‰ØlÏ ÕÅçݽ ´Ãe¬Ý¥zž¦H˜uÖ’Þ¹ô,‰½÷†BÁƒˆ ”©€eq€€d÷“¶ƒŠ]†EÒ‰»¤ñk’ÛŒ˜rDž¬º¥¬ä´¾{½”ÅâtÏ9Øuqâ$0ëòXõïÅÿý wòåÀ'”G0õp:fBß~K<×S#8Z†#aYègŠVm!nr övB&y½V|x~kcš”ÿÿ›~l?|u’yºvD@rtm$MgaSZ~´S:KAHBä,:J0ú‚'ŠHÛ‡ ^ ð™õõ>ë÷ÅâøØkrÏ KÅçX½ C´Âì¬Ü¥y¨ž¥ç˜u~’Þkó鉽¾†B“ƒ‡é”’€ef€€e“ÍƒŠ€†F‰»Ýñ®’ÛÚ˜r›ž­¥¬ØÔ´¾ô½ÅâùÏÃØuÿâ$ÁëòìõðZÿý± …æQ'”Õ0õú:ëBßýK=PS#ªZ†ŒaOågŠ®m!¼r 9vB_y½…|x)~kzš ÿÿš÷~l'|uoy¹évDr0m#ÿg9aR´Z~KS&óK@ÏBã­:Å0ùø'‰ºÚö Ê [õô©ë÷1âfØjäÏ ÁÅæÓ½ôÂs¬Ü¥y?ž¯ê˜u&’Þ󥉽„†Bdƒ‡Æ”z€eZ€€e“䃊£†F/‰¼ñò’Ü(˜róž­|¥ê¬ÙE´¿m½“Åã~ÏMØvŽâ%Sëó€õðïÿþG ¡ æâ'•c0ö„:pBà}K=ÉS$Z†öaPFg‹m" r }vB˜y½³|xK~k‘š¬ÿÿšë~l|uLy¾¬vCÍr ìm#°gŒáaRSZ}áS&‚K@WBã-:?0ùn'‰+Úe 6 ÆnõôëöâÕØyŽÏ 7ÅæN½D´Áú¬Û«¥xÕž¯‰˜tÎ’ÝÎóa‰½K†B6ƒ‡£”c€eN€€e“üƒŠÆ†Ak‰¼Oò6’Üw˜sKž­Þ¥‚T¬Ù·´¿æ½ÅäÏרwâ%äëôõñ„ÿþÜ 6 ¬çt'†¹0÷:õBàüK>BS$Z‡`aP¨g‹^m"Yr ÁvBÑy½á|xn~k©š¸ÿÿšà~kø|u)y¾~vC”r ¨m#bgŒ‰aQòZ}wS&K?ÞBâ®:º0øä'ˆÙÓ £ 1Ùõóëö âDØxÿÏ­ÅåȽÄ´Á¬Û:¥xkž¯(˜tv’݀󉽆Bƒ‹<”K€eC€€e&”ƒŠè†A™‰¼‰òz’ÜŘs£ž®?¥‚¾¬Ú)´À_½’ÅäˆÏaØwªâçëô§õòÿÿr Ë @è'‡H0÷˜:zBá{K>»S$ÿZ‡ÉaQ g‹¶m"§r vC y¾|tÕ~kÀšÃÿÿšÔ~ká|uy¾PvC[r dm#gŒ1aQ‘Z} S%žK?eBâ.:50øZ'ˆèÑ  œCõòêëõvâ²ØxqÏ#ÅåC½E´Á¬ÚÈ¥xž®Ç˜t’Ý2òÙ‰¼Ù†AÚƒ‹”4€e7€€e2”+ƒ‹ †Alj¼Âò¾’ݘsûž® ¥ƒ'¬Úš´ÀؽÅå ÏëØx8âxëõ;õò® ` Ôè–'‡Ö0ø":ÿBáûK?4S%qZ|ãaQjgŒm"õr IvCDy¾=|tø~kØšÏÿÿšÈ~kÊ|tãy¾"vC"r m"Æg‹ÙaQ0Z‡ôS%-K>ìBá¯:°0÷Ð'‡è? | ÿÿ®õòUëôââ!ØwãÏ™Å侽ŴÀ¬ÚW¥‚èž®f˜sÆ’Üäò•‰¼ †A¬ƒŠ÷”€e+€€e>”Bƒ‹.†Aõ‰¼ûó’Ýa˜tSž¯¥xA¬Û ´ÁQ½‘Åå“ÏuØxÆâ ëõÎõóC õ gé('ˆd0ø¬:…BâzK?­S%âZ}MaQËgŒem#Cr vC}y¾k|u~kïšÛÿÿš¼~k²|tÀy½óvBèr Üm"xg‹aPÏZ‡ŠS$»K>sBá/:+0÷F'†óç® è rÿÿõñÀëôOâ&ØwUÏÅä9½F´À¬Ù奂ž®˜so’Ü–òQ‰¼f†A~ƒŠÔ”€e€€eJ”Yƒ‡•†B$‰½4óE’ݯ˜t«ž¯b¥xª¬Û~´ÁʽÅæÏÿØyTâ›ëöbõóØ2 Š ûÚ*'ˆò0ù6: BâúK@&S&TZ}¶aR,gŒ½m#‘r ÑvC¶y¾™|u>~lšçÿÿš±~k›|xZy½ÅvB¯r ™m"*g‹)aPnZ‡!S$JK=úBà°:¦0ö¼'†eç T Ýÿþƒõñ+ëó»â%ØvÇÏ…Å㴽Ǵ¿ž¬Ùs¥‚ž­¤˜s’ÜHò‰¼-†FAƒŠ±“î€e€€eU”qƒ‡¸†BR‰½mó‰’Ýý˜už¯Ã¥y¬Ûï´ÂB½ÅæÏ ŠØj«â,ëöõõômÈ  Ú»'‰€0ùÀ:BãyK@ŸS&ÆZ~ aRgm#ßrvCïy¹Ö|ua~lšòÿÿš¥~kƒ|x7y½—vBvr Um!ÜgŠÒaP Z†·S#ØK=Bà0: 0ö1'•æ‹Á Hÿýîõð–ëó(â$üØv9ÏúÅã.½G´¿%¬Ù¥«ž­B˜r¿’Ûúñʉ»ô†FƒŠŽ“Ö€e€€ea”ˆƒ‡Û†B€‰½¦óÍ’ÞK˜uZž°$¥y~¬Üa´Â»½ Åç"Ï Øk9â½ë÷‰õõ] ´ "ÛM'Š0úK:BãùKAS Z~ŠaRîgmm$-rXvD(yº|u„~l5šþÿÿš™~kl|xy½ivB=r m!ŽgŠzaZZ†MS#fK=Bß±:›0õ§'”€åú- ³ÿýXõðëò”â$kØuªÏpÅ⩽È´¾¬¬ä»¥Až¬á˜rg’Û¬ñ†‰»»†E僊k“¿€dü€€em” ƒ‡þ†B®‰½àô’Þ™˜u²ž¦!¥yç¬ÜÓ´Ã4½ Åç§Ï žØkÇâOëøõõ—ó I ¶ÛÞ'Š0úÕ:™BäxKA‘S~Z~óaSOgÅm${rœvDbyº2|u§~lM› ÿÿš~kU|wñy½;vBr Ím!@gŠ"aY¯Z…äS"õKµyº|uì~l{›!ÿÿšv~m§|w«y¼ÞvA‘r Em £g‰raXìZ…S"K;BÞ3: 1Ñ'’ÕäFr ôÿû˜õîBì§â"·ØtÏÒÅá½I´½A¬ãf¥€ž«¾˜q_’ÚÂðº‰Á/†EZƒŠ“y€dÙ€€e’eƒˆf†C9‰¾‹ôÝ’ß„˜vºž§D¥{$¬Þ(´ÄŸ½" Åé7ÎýtØmrâëùØõ÷V³ ÿ£Ý’'ŒG0üs:)BåöKBûSÓZ€1aTrgŽÌm%frhv>îyº½|v~l“›-ÿÿšj~m|wˆy¼°vAXr m Ug’‚aX‹Z„§S! K;$Bݳ:†1G'’Gãµß _ÿûõí­ìâ"%ØsrÏHÅà•½ʴɺ¬âô¥›ž«]˜q’Úsðw‰Àö†E,ƒ‰ß“b€dÍ€€eœ’|ƒˆ‰†Cg‰¾Äõ!’ßÒ˜mªž§¥¥{Ž¬Þ™´Å½"Åé¼ÎýþØnâ”ëúkõ÷ëH 7Þ#'ŒÕ0üý:®BævK6‚SEZ€šaTÓg$m%´r«v?'yºë|v2~lª›9ÿÿš^~mx|wey¼‚vAr ¾m g’*aX*Z„=S!.K:¬BÝ4:1½'‘¹ã#K Êÿúmõíëÿâ!”ØräϾÅà½K´ÉA¬â‚¥1žªü˜p°’Ú%ð3‰À¼†Dþƒ‰¼“J€d€€df’”ƒˆ¬†C•‰¾þõd’à ˜nž¨¥{ø¬ß ´Å‘½# ÅêAÎþˆØnŽâ%ëúÿõø€Þ ?ÊÞµ'c0ý‡: 3BæõK6ûS·ZaU5g|m&rïv?`y»|vU~l›Dÿÿ›”~ma|wCy¼Tv@ær zm¹g‘ÒaWÉZƒÓS ¼K:3BÜ´:|13'‘+â’· 5ÿù×õüwëþìâ!ØrVÏ4Åߊ½Ë´ÈȬâ¥~Çžª›˜pX’Ù×ïï‰Àƒ†D󉙓3€d¶€€dr’«ƒˆÏ†CÉ¿7õ¨’àn˜nZž¨g¥|a¬ß|´Æ ½#‹ÅÜ…ÎÿØoâ·ëû’õùs Ô^ßF'ò0þ: ¸BçuK7tS(ZnaU–gÔm&Prïv?™y»H|vx~lÙ›Pÿÿ›ˆ~mI|w y¼&v@­r 6mkg‘zaWhZƒjS KK9ºBÜ5:#81©'â$  ÿùBõûâëþXâ qØqÇϪÅß½L´ÈO¬áŸ¥~^žª:˜p’Ù‰öï‰ÀJ†D¡ƒ‰w“€dª€€d~’ƒˆò†Cñ‰¿põì’༘n²ž¨È¥|ˬßî´Æƒ½$ ÅÝ ÎÿœØoªâHëü&õùª iòß×'Ž€0þ›:!>BçôK7íSšZ×aU÷g,m&žr 3v?Óy»v|v›~lð›\ÿÿ›}~m2|výy»÷v@sr òm'yg‘"aWZƒSÙK9ABÛµ:"³1'áo  ÿø¬õûMëýÅâàØq9Ï ÅÞ€½%q´ÇÖ¬á-¥}ôž©Ù˜o¨’Ù;ö«‰À†Dsƒ‰T“€dž€€d‰’Úƒ‰†D ‰¿©ö0’Ø®˜o ž©)¥}5¬à`´Æü½$ŠÅÝÏ&Øp8âÙëüºõú?ž þ…ài'0ÿ%:!ÃBÚÏK8fS Z‚AaVXg„m&ìr wv@ y»¤|v¾~m›gÿÿ›q~m|vÚy»Év@:r ®m'+gËaV¦Z‚–SgK8ÈBÛ6:".0ÿ•'àÞü vÿøõú¸ëý1âOØp«Ï–ÅÝû½$ñ´Ç]¬à¼¥}Šž©x˜oP’Øíög‰¿×†DEƒ‰1’í€d“€€d•’ñƒ‰8†DN‰¿ãöt’Øü˜oaž©Š¥}Ÿ¬àÑ´Çu½% ÅÞϰØpÇâkëýMõúÔÿø4 “àú'œ0ÿ¯:"HBÛOK8ßS}Z‚«aV¹gÛm':r »v@Ey»Ò|vá~m›sÿÿ›e~m|v·y»›v@r jm&ÝgsaVEZ‚-SöK8OBÚ¶:!©0ÿ 'ŽòàMi áõú#ëüâ½ØpÏ ÅÝv½$r´Æä¬àJ¥} ž©˜nù’ØŸö#‰¿ž†Dƒ‰’Õ€d‡€€d¡“ ƒ‰Z†D|‰Àö¸’ÙJ˜o¹ž©ì¥~¬áC´Çî½%‰ÅÞšÏ:ØqUâüëýáõûiÿøÉ (­á‹'*1::"ÍBÛÎK9XSïZƒaWg‘3m,r ÿv@~y¼|w~m6›ÿÿ›Y~lì|v”y»mv?Èr &m&gaUäZÃS„K7ÖBçÛ:!$0þ'Ždß»Õ LìõùŽëü â,ØoÎÿÅÜð½#ò´Æk¬ßØ¥|·ž¨¶˜n¡’à­õ߉¿e†C郈뒾€d{€€d¬“ ƒ‰}†Dª‰ÀUöü’Ù˜˜pžªM¥~r¬áµ´Èg½dÅßÏÄØqãâ ëþuõûþÿù_ ½@â'¸1Ä:#RBÜMK9ÑS aZƒ~aW{g‘‹mzr Cv@¸y¼/|w&~mN›‹ÿÿ›N~lÔ|vqy»?v?Žrâm&AgÃaUƒZYSK7]Bç\: Ÿ0ý÷'Öß*B ·Wõøùëûvâ›ØoÎþ÷Åê­½#s´Åó¬ßg¥|Mž¨U˜nI’à_õ›‰¿,†CºƒˆÈ’§€dp€€d¸“7ƒ‰ †D؉ÀŽïü’Ùæ˜pižª®¥~ܬâ&´Èß½äÅߤÏOØrqâ!ëÿõü“ÿùô RÔâ®'‘F1N:–BÜÍK:JS ÒZƒèaWÜg‘ãmÈr ‡v@ñy¼]|wI~me›–ÿÿ›B~l½|vNy»v?Urâm%ógkaU"Z€ðS¡K6äBæÝ: 0ýl'HÞ™® "Áõødëúââ ØnsÎþmÅê(½"ó´Åz¬Þõ¥{ãž§ô˜mñ’àõW‰¾ó†CŒƒˆ¥’€dd€€dÄ“Oƒ‰Ã†E‰ÀÇð@’Ú4˜pÁž«¥E¬â˜´ÉX½cÅà)ÏÙØrÿâ!°ëÿœõí5ÿúŠ çgã?'‘Õ1Ø:BÝLK:ÃS!DZ„QaX=g’;m r ËvA*y¼‹|wl~m|šaÿÿ›6~l¦|v+yºâv?ržm%¥gaTÁZ€†S/K6kBæ]:”0üâ'ŒºÞ €,õ÷ÏëúOâxØmäÎýãÅ颽"t´Å¬Þƒ¥{zž§’˜m™’ßÃõ‰¾¹†C^ƒˆ‚’x€eš€€dÏ“fƒ‰æ†E5‰Áð„’Ú‚˜qž«p¥¯¬ã ´ÉѽãÅà®ÏcØsâ"Aì0õíÊÿû |ûãÑ'’c1b: BÝÌK;ãrZm%VgŽ»aT`Z€S½KBäBåÞ:0üX'Œ,Ývÿ‡ ë–õ÷:ëù»âçØmVÎýYÅé½!ô´Äˆ¬Þ¥{ž§1˜v©’ßuôЉ¾€†C0ƒˆ`’`€eŽ€€dÛ“}ƒŠ †Ec‰Á:ðÇ’Úјqpž«Ñ¥€¬ã{´½Y½bÅá3ÏíØtâ"ÓìÃõî_ÿûµ äb'’ñ1ì:%BÞKK;µS"'Z…%aXÿg‰ƒm ³r RvAœy¼ç|w²~m«šxÿÿ›~lw|uæyº†v>ªrm%gŽdaSÿZ²SLKBkBå^:Š0ûÎ'‹Üåþó Võö¥ëù'âUØlÈÏ —Å蘽!u´Ä¬Ý ¥z¦ž¦Ð˜vQ’ß&ôŒ‰¾G†Cƒˆ=’I€e‚€€dç“•ƒŠ,†E‘‰»Tñ ’Û˜qÈž¬2¥€‚¬ãí´½Ñ½áÅá¹ÏwØtªâ#dìWõîôÿüJ ¦"äó'“0ô®:«BÞËK<.S"™Z…ŽaY`g‰Ûm!r –vAÖy½|wÕ~mÚ„ÿÿ›~l`|uÃyºXvDrÓm$ºgŽ aSžZISÚKAòBäß:0ûD'‹ÜSþ_ Ákõöëø”âÄØl:Ï Åè½ ö´Ã–¬Ý.¥z=ž¦o˜uù’ÞØôH‰¾†BÓƒˆ’2€ev€€d󓬃ŠO†E¿‰»ñO’Ûm˜r ž¬“¥€ì¬ä_´¾J½aÅâ>ÏØu8â#õëòõï‰ÿüà ;¶å…'” 0õ8:0BßJK<§S# Z…øaYÁgŠ3m!Or ÚvBy½D|wø~kYšÿÿ›~lH|u yº)vDWrm$lg´aSS$_Z‡5aP€g‹:m"9r ¦vBºy½Î|x`~kŸš³ÿÿšä~l|u7y¾‘vC«r Ãm#‚gŒ¬aRZ}¢S&>K@Bâá:ð0ù'ˆ×Ú Þ mõó¼ëöEâØy9ÏåÅåþ½ø´Á²¬Ûh¥x–ž¯O˜tš’Ý ó8‰½)†Bƒ‡Ž”U€eG€€e"” ƒŠÚ†A‡‰¼qò^’Ü¥˜s€ž®¥‚“¬Ùû´À.½_ÅäRÏ)Øwpâ&;ëôkõñÝÿÿ5  çÊ'‡0÷`:DBáHK>ŠS$ÑZ‡ŸaPág‹’m"‡r êvBôy½ü|tÇ~k·š¿ÿÿšÙ~kë|uy¾bvCrr €m#4gŒTaQ¸Z}8S%ÌK?–Bâb:k0ø’'ˆIé  K Ø€õó'ëõ²âíØx«Ï[Ååy½x´Á9¬Úö¥x,ž®î˜tB’ÝRòõ‰¼ð†A탋(”>€e<€€e-”!ƒŠý†Aµ‰¼«ò¢’Üó˜sמ®x¥‚ý¬Úl´À§½ÞÅäØÏ³Øwÿâ=ëôÿõòrÿÿË $ ˜è['‡œ0÷ê:ÊBáÇK?S%CZˆaQBg‹êm"Õr -vC-y¾+|tê~kΚÊÿÿšÍ~kÓ|tñy¾4vC9r ØxâÏëõ“õó` ¹ ,èí'ˆ+0øt:OBâGK?|S%´Z}"aQ¤gŒBm##r qvCfy¾Y|u ~kæšÖÿÿšÁ~k¼|tÎy¾vCr øm"˜g‹¥aPöZ‡µS$éK>¤Bác:a0÷}'‡,çé $ ®ÿÿUõñýëôŠâËØwŽÏFÅäo½z´ÀG¬Ú¥‚©ž®,˜s’’ܶòm‰¼~†AƒŠâ”€e$€€eE”Pƒ‡‡†B‰½ó*’ݘt‡ž¯;¥x€¬ÛP´Á™½ÝÅåâÏÈØyâ`ëö&õóœö N ¿Ùï'ˆ¹0øÿ:ÔBâÆK?õS&&Z}ŒaRgŒšm#qr µvCŸy¾‡|u0~kýšâÿÿšµ~k¤|xhy½ØvBÆr ´m"Jg‹MaP•Z‡KS$wK>+Bàã:Û0öó'†žçW ÿþ¿õñhëó÷â%ÈØwϼÅãé½ú´¿Ï¬Ù¡¥‚@ž­Ë˜s:’Ügò)‰¼D†AbƒŠ¿“÷€e€€eQ”gƒ‡ª†B?‰½Vón’Ýݘtßž¯œ¥xé¬ÛÁ´Â½\ÅægÏ RØy©âñëöºõô1‹ ã SÚ'‰G0ù‰:YBãFK@nS&˜Z}õaRfgŒòm#Àr ùvCØy¹Ã|uS~lšîÿÿšª~k|xEy½ªvBr pm!ûgŠõaP4Z†âS$K=²Bàd:V0öi'•GæÆü „ÿþ*õðÓëócâ%7ØvrÏ2Åãd½{´¿V¬Ù0¥Öž­j˜râ’Üñ剼 †F&ƒŠœ“à€e €€e\”ƒ‡Í†Bm‰½ó²’Þ,˜u7ž¯ý¥yS¬Ü3´Â‹½ÜÅæìÏ ÜØkâƒë÷MõôÆ! x çÛ'‰Õ0ú:ÞBãÅK@çS' Z~_aRÇgJm$r=vDy¹ñ|uv~l,šùÿÿšž~kv|x"y½|vBTr ,m!­gŠaOÓZ†xS#”K=9Bßä:Ñ0õß'”¹æ5i ïÿý•õð>ëòÐâ$¥ØuäϨÅâß½û´¾Ý¬äé¥lž­ ˜r‹’ÛËñ¡‰»Ò†E÷ƒŠy“É€e€€eh”–ƒ‡ð†B›‰½Éóö’Þz˜už¥ú¥y½¬Ü¥´Ã½ [ÅçrÏ fØkŽâë÷áõõ[¶   zÛ£'Šc0ú:dBäEKA`SPZ~ÉaS(g¡m$\rvDKyº |u˜~lC›ÿÿš’~k^|wÿy½MvBr èm!_gŠEaYÖZ†S##K<ÀBße:L0õU'”+å£Õ Zÿüÿõï©ëò<â$ØuVÏÅâZ½|´¾d¬äw¥ž¬¨˜r3’Û}ñ]‰»™†EɃŠV“±€dõ€€et”®ƒˆ†Bʉ¾ô9’ÞȘu瞦[¥z&¬Ý´Ã|½ ÛÅç÷Ï ðØlâ¥ëøuõõðL ¢þ@Ü5'Šñ0û':éBäÄKAÙSÂZ2aS‰gùm$ªrÄvD„yºN|u»~l[›ÿÿš†~mÇ|wÜy½vAâr ¥m!g‰íaYuZ…¥S"±K×yºª|v~l‰›(ÿÿšo~m™|w–y¼ÃvAor m ug‰>aX³Z„ÑS!ÎK;UBÝç:¼1'’ãï ›ÿû?õíêìOâ"`Øs«Ï€Åàʽý´Éë¬ã"¥Åž«„˜q+’Ú“ð’‰Á †E?ƒ‰í“k€dÒ€€e—’sƒˆ{†CT‰¾­õ’ß²˜m‡ž§~¥{c¬Þk´Äç½"YÅé†ÎýÆØmÆâYëú0õ÷¯ aÿûÝé'Œœ0üÅ:xBæBK6RSZ€oaT¬gm%”rv?yºÙ|v$~l¡›4ÿÿšc~m|wty¼•vA6r Ùm 'g’MaXRZ„hS!\K:ÜBÝg:71õ'‘óã^‡ ÿú©õíUëÿ»â!ÏØsÏöÅàE½~´Ér¬â°¥\ž«#˜pÓ’ÚEðN‰ÀÔ†Eƒ‰Ê“T€dÆ€€e£’Šƒˆž†C‚‰¾çõI’à˜mßž§ß¥{ͬÞÝ´Å`½"ØÅê ÎþPØnTâëëúÃõøD¢ Þz'*0ýO:ýBæÂK6ËS‰Z€ÙaU gYm%ârÔv?Iy»|vG~l¸›@ÿÿ›™~mj|wQy¼gv@ýr •mÙg‘öaWðZƒþS êK:cBÜè:²1k'‘dâÍó qÿúõü³ëÿ'â!=ØrÏlÅßÀ½ÿ´Èù¬â>¥~òžªÂ˜p{’Ù÷ð ‰Àš†D⃉¨“<€d»€€dm’¢ƒˆÁ†C±‰¿ õ’àN˜n6ž¨@¥|7¬ßO´ÅÙ½#XÅê‘ÎþÚØnãâ|ëûWõøÙ7 ˜"ß '¸0ýÙ: ƒBçAK7CSúZCaUng°m&0rv?‚y»5|vj~lÏ›Kÿÿ›~mS|w.y¼8v@Är Qm‹g‘žaWZƒ”S yK9ëBÜh:#n1á'Öâ;_ Üÿù~õüëþ”â ¬ØrÏâÅß;½´È€¬áÍ¥~ˆžªa˜p$’Ù©÷ ‰Àa†D´ƒ‰…“%€d¯€€dy’¹ƒˆä†C߉¿YõÑ’à˜nŽž¨¡¥| ¬ßÀ´ÆR½#×ÅÜÔÎÿdØoqâ ëûêõùnÌ -¶ß'ŽF0þc:!BçÁK7¼SlZ­aUÏgm&~r v?¼y»c|v~lç›Wÿÿ›~m;|w y¼ v@Šr mž©c¥}t¬à¤´ÇD½$ÖÅÝßÏxØpâ0ëýõú˜÷ WÝà¿'c0ÿx:"BÛK8®SOZ‚€aV’g¸m'r  v@.y»À|vÓ~m›nÿÿ›j~m |vÅy»®v@r †m&üg–aVlZ‚WS$K8€BÚê:!ß0ÿC',à‡¤ ¾õú_ëüÙâøØpVÏCÅÝ«½$¥´Ç¬àx¥}Kž©>˜o’Ø¿ö>‰¿µ†D)ƒ‰’߀dŒ€€dœ’ÿƒ‰L†Di‰Àöœ’Ù+˜o–ž©Ä¥}Þ¬á´Ç½½%VÅÞdÏØqâÁëý¥õû-ÿø ìqáQ'ñ1:"—BÛšK9'SÁZ‚êaVóg‘m'ir äv@gy»î|võ~m-›zÿÿ›^~lõ|v¢y»€v?ßr Bm&®g>aV ZîS²K8BÚk:!Z0þ¸'Žžßö ˆ(õùÊëüEâgØoÈÎÿ¹ÅÝ&½$&´Æœ¬à¥|➨ݘnÄ’àÍõú‰¿|†Cûƒˆù’Ç€d€€€d¨“ƒ‰o†D˜‰À>öà’Ùy˜o%¥~G¬á‡´È6½1ÅÞéÏØq©â Sëþ9õûÂÿù" áâ'1Œ:#BÜK9 S 3ZƒSaWTg‘hmZr 'v@ y¼|w~mD›†ÿÿ›S~lÞ|vy»Qv?¦rþm&`gçaUªZ„S@K7ŽBç: Ô0þ.'Žße} ó“õù5ëû²âÕØo:Îÿ/ÅÜ¡½#¦´Æ#¬ß”¥|xž¨|˜nl’à~õ·‰¿C†C̓ˆÖ’°€dt€€d³“.ƒ‰’†DƉÀwïá’ÙǘpEžª†¥~±¬áù´È¯½°ÅßnÏØr8â äëþÍõüWÿù¸ ˜âs'‘ 1:`BÜ™K:S ¤Zƒ½aWµg‘¿m©r kv@Úy¼J|w;~m\›’ÿÿ›G~lÆ|v\y»#v?lrþm&gaUIZSÏK7Bç: O0ý¤'ÞÓê ^ýõø ëûâDØn¬Îþ¥Åê]½#'´Åª¬ß#¥|ž¨˜n’à0õs‰¿ †CŸƒˆ³’™€di€€d¿“Eƒ‰µ†Dô‰À°ð$’Ú˜pžªè¥¬âj´É(½0ÅßóÏ¡ØrÆâ!uëÿ`õüìÿúM «,ã'‘›1 :åBÝK:’S!Z„'aXg’m÷r ¯vAy¼x|w^~msš\ÿÿ›;~l¯|v:yºõv?3rºm%Äg7aTèZ€±S]K6œBæ‘:Ê0ý'ŒóÞBV ½hõø ëúŠâ³ØnÎþÅ騽"§´Å2¬Þ±¥{¤ž§º˜m½’ßâõ/‰¾Ñ†Cqƒˆ’€ež€€dË“]ƒ‰Ø†E"‰Àêðh’Úc˜põž«I¥„¬âÜ´É ½¯ÅàxÏ+ØsTâ"ëÿôõíŽÿúã @¿ã–'’)1*:jBݘK; S!ˆZ„aXwg’om Er óvALy¼¦|w~mŠšhÿÿ›/~l˜|vyºÇv>úrvm%vgŽßaT‡Z€GSëK6#Bæ:E0ü'Œeݱÿ (Óõ÷vëù÷â!ØmÎý‘ÅéS½"(´Ä¹¬Þ@¥{;ž§Y˜vÍ’ß”ô뉾—†CBƒˆn’j€e“€€dÖ“tƒ‰û†EP‰Á#ð¬’Ú±˜qMž«ª¥î¬ãN´½(½.ÅàþϵØsââ"˜ì‡õî#ÿûx ÕSä''’·1´:ðBÞK;„S!ùZ„úaXØg‰_m “r 7vA…y¼Õ|w¤~m¢šsÿÿ›$~l€|uôyº™v>Ár2m%(gއaT&ZÝSzKBœBå’:À0ü'‹×Ýÿ/ “=õöáëùcâØmÎýÅèν!©´Ä@¬ÝÎ¥zÑž¦ø˜vu’ßFô§‰¾^†CƒˆK’S€e‡€€dâ“‹ƒŠ†E‰Á\ðð’Úÿ˜q¥ž¬ ¥€X¬ã¿´½¡½®ÅáƒÏ?Øtpâ#)ìõî¸ÿü jçä¹'“F0ôv:uBÞ—K;ýS"kZ…daY9g‰·m ár {vA¾y½|wÇ~m¹šÿÿ›~li|uÑyºjvD§rîm$ÚgŽ/aSÅZsSKB#Bå:;0û|'‹IÜŽþ› þ¨õöLëøÐâÿØlsÏ EÅèI½!)´ÃǬÝ\¥zgž¦—˜v’Þøôc‰¾%†B惈(’;€e{€€dî“£ƒŠA†E­‰»vñ4’ÛM˜qýž¬l¥€Á¬ä1´¾½-ÅâÏÉØtþâ#»ì¯õïMÿü£ ÿzåJ'“Ô0õ:úBßKg€aSZ~ S%KA1Bä:00úh'Š,Ûk A Ô}õõ"ë÷¨âÜØkWÏ 1Åç>½ *´ÂÕ¬Üy¥y”ž¥Ô˜um’Þ\ó܉½³†BŠƒ‡â”€ec€€e“ÒƒŠ††F ‰»èñ»’Ûé˜r¬ž­.¥•¬Øê´¿ ½,ÅãÏÝØvâ$ÝëóõðwÿýÎ )¢æm'”ð0ö:BàK=hS#ÀZ†¡aOøgŠ¿m!Ër FvBjy½|x/~kš¢ÿÿšõ~l#|uhy¹àvCûr#m#ðg(aR¡Z~6S&ÞK@¸Bã”:«0ùÞ'‰žÚÚ ® ?çõôë÷âKØjÉÏ §Åæ¹½«´Â\¬Ü¥y*ž¯×˜u’Þ󘉽y†B\ƒ‡¿”v€eX€€e“郊©†F7‰¼!ñÿ’Ü7˜sž­¥ÿ¬Ù[´¿„½¬Åã—ÏgØv©â%oëóœõñ ÿþd ¾ 5æþ'†G0öž:‰Bà•K=àS$2Z‡ aPYg‹m"r ŠvB£y½¼|xR~k–š®ÿÿšé~l |uEy¾£vCÂr ßm#¢gŒÐaR@Z}ÍS&lK@?Bã:&0ùT'‰ÚI  ªRõóøëöâ¹ØyrÏ Åæ4½+´Áã¬Û–¥xÁž¯v˜t½’Ý¿óT‰½@†B-ƒ‡œ”^€eL€€e”ƒŠÌ†At‰¼ZòC’܆˜s\ž­ð¥‚h¬ÙÍ´¿ý½+ÅäÏòØw7â&ëô0õñ¡ÿþù S Éç'†Õ0÷(:BáK>YS$£Z‡taPºg‹om"hr ÎvBÜy½ê|xu~k­šºÿÿšÝ~kô|u"y¾uvC‰r ›m#SgŒxaQßZ}cS%úK?ÆBâ•:¡0øÉ'ˆ‚éF ‡ ¼õócëõíâ(ØxäÏ’Å寽¬´Áj¬Û$¥xWž¯˜te’Ýq󉽆Aÿƒ‹6”G€e@€€e)”ƒŠï†A¢‰¼”ò‡’ÜÔ˜s´ž®Q¥‚Ò¬Ú?´Àv½«Åä¢Ï|ØwÅâëôÃõò6ÿÿŽ è \è!'‡c0÷³:”Bá”K>ÒS%Z‡ÞaQg‹Çm"¶r vCy¾|tÜ~kÅšÆÿÿšÒ~kÝ|tÿy¾GvCPr Wm#gŒ aQ~Z|ùS%‰K?NBâ:0ø?'‡ôèµ ó €'õòÎëõZâ—ØxVÏÅå*½,´Àñ¬Ú²¥wíž®´˜t’Ý#ò̉¼Î†Aу‹”0€e5€€e4”/ƒ‹†AЉ¼ÍòË’Ý"˜t ž®²¥wë¬Ú°´Àï½*Åå'ÏØxSâ”ëõWõòË$ } ðè²'‡ñ0ø=:BâK?KS%†Z|÷aQ|gŒm#r VvCOy¾F|tÿ~kÜšÑÿÿšÆ~kÅ|tÜy¾vCr m"·g‹ÈaQZ‡àS%K>ÕBá–:–0÷µ'‡fè$ _ ëÿÿ‘õò9ëôÆâØwÈÏ~Å䤽­´Àx¬ÚA¥‚Ôž®S˜s¶’ÜÕòˆ‰¼•†A£ƒŠð”€e)€€e@”Gƒ‹5†Aþ‰½ó’Ýp˜tdž¯¥xU¬Û"´Áh½©Åå¬ÏØxáâ%ëõëõó`¹  „éC'ˆ0øÇ:žBâ“K?ÄS%øZ}aaQÝgŒvm#Rr švCˆy¾t|u"~kôšÝÿÿšº~k®|xvy½ëvBÞr Ïm"ig‹paP¼Z‡vS$¥K>\Bá:0÷+'†Øç’ Ì Vÿþüõñ¤ëô3â&Øw:ÏôÅä½.´¿ÿ¬ÙÏ¥‚jž­ò˜s^’܇òD‰¼[†AuƒŠÍ”€e€€eL”^ƒ‡œ†B,‰½?óR’ݾ˜t¼ž¯t¥x¿¬Û“´Áá½)Åæ1Ï Øypâ¶ëö~õóõO § ÚF'‰ 0ùQ:#BãK@=S&jZ}ËaR?gŒÎm# r ÞvCÁy¾¢|uE~l šéÿÿš®~k–|xSy½¼vB¤r Œm"g‹aP[Z‡ S$4K=ãBà—:Œ0ö¡'†Iç 8 ÁÿþfõñëóŸâ%qØv¬ÏjÅãš½®´¿‡¬Ù]¥‚ž­‘˜s’Ü9ò‰¼"†F8ƒŠª“é€e€€eX”uƒ‡¿†B[‰½xó–’Þ ˜už¯Ö¥y(¬Ü´ÂZ½¨Åæ·Ï ¤ØjÆâHë÷õôŠä < «Ú×'‰œ0ùÛ:©Bã’K@¶S&ÛZ~4aR g&m#îr!vCúy¹ß|ug~l"šõÿÿš£~k|x0y½ŽvBkr Hm!ÍgŠÁaOúZ†£S#ÂK=jBà:0ö'”óæp¤ ,ÿýÑõðzëó â$àØvÏàÅã½/´¿¬Øì¥—ž­0˜r®’Ûëñ½‰»é†F ƒŠ‡“Ò€e€€ec”ƒ‡á†B‰‰½±óÚ’ÞZ˜ukž°7¥y’¬Üw´ÂÓ½ (Åç<Ï .ØkTâÙë÷¥õõz Ñ ?Ûi'Š*0úe:.BäKA/S"Z~žaSg~m$Àyº˜|uó~l€›#ÿÿšt~m¢|w¥y¼ÖvA†r 8m ”g‰aaXÚZ„üS!üK;†BÞ:ò1·'’ºä*V Øÿû{õî&ìŠâ"›ØsåϸÅá½1´½*¬ãP¥𞫬˜qO’Ú³ð­‰Á$†EQƒ‰û“t€d×€€e’’iƒˆm†CB‰¾–ôê’ß“˜vËž§W¥{9¬Þ=´Ä¶½"&ÅéPÎýŽØmâëùôõ÷sÐ %ÿ¿Ý®'Œb0ü:BBæK6!SéZ€EaT…gŽÝm%uruv>ùyºÆ|v~l—›/ÿÿšh~m‹|w‚y¼§vAMr ôm Fg’qaXyZ„’S!ŠK; BÝ›:m1-'’,ã™ Cÿúæõí‘ëÿ÷â" ØsWÏ.Åà{½²´É£¬âÞ¥†ž«J˜p÷’Údðj‰Àë†E#ƒ‰Ù“]€dË€€ež’ƒˆ†Cp‰¾Ïõ.’ßá˜m»ž§¸¥{¢¬Þ¯´Å/½"¥ÅéÖÎþØnâ°ëúˆõøe ºSÞ?'Œð0ý:ÈBæŽK6šS[Z€®aTæg5m%Ãr¸v?2yºô|v9~l¯›;ÿÿš\~ms|w_y¼yvAr ±møg’aXZ„)S!K:”BÝ:è1£'‘žã/ ®ÿúPõüïëÿcâ!xØrÈÏ£Åßö½2´É*¬âl¥žªé˜pŸ’Úð&‰À±†Dõƒ‰¶“F€d¿€€dh’˜ƒˆ³†Cž‰¿ õq’à/˜nž¨¥| ¬ß!´Å¨½#$Åê[Îþ¢Øn©âAëûõøû [çÞÑ'0ý¢: MBçK7SÌZaUGgm&rüv?ky»"|v\~lÆ›Gÿÿ›’~m\|wZ‚aU¨gåm&_rýv?¤y»P|v~lÝ›Rÿÿ›†~mE|wy¼v@¢r )m\g‘iaWVZƒUS 5K9¢BÜ:#1Ž'‚áå ƒÿù%õûÅëþ<â UØq¬ÏÅÞì½3´È8¬á‰¥~Ižª'˜oï’Ùzöâ‰À?†D˜ƒ‰p“€d¨€€d€’ǃˆø†Cú‰¿{õù’à˘nÞ¨Û¥|߬à´Æš½$#ÅÝ$Îÿ·ØoÅâdëüBõùÇ& …ßó'Ž›0þ¶:!WBè K8S°ZìaV g=m&­r @v?Þy»|v¢~lõ›^ÿÿ›z~m-|vöy»ïv@hr åm'jg‘aVõZ‚ìSÃK9*BÛ:"š1'óáTt îÿøõû0ëý¨âÄØqÏÅÞf½%X´Ç¿¬á¥}àž©Æ˜o—’Ù,öž‰À†Djƒ‰M“€dœ€€d‹’Þƒ‰†D(‰¿´ö=’ؽ˜ož©<¥}I¬àv´Ç½$£ÅÝ©ÏAØpTâõëüÖõú\» ¢à…')0ÿ@:!ÜBÚçK8}S!Z‚UaVjg”m&ûr „v@y»­|vÄ~m ›jÿÿ›o~m|vÓy»Àv@/r ¡m'gºaV“Z‚‚SRK8±BÛ:"0ÿz'eàÂà Yúõú›ëýâ3ØpÏ{ÅÝá½$Ù´ÇF¬à¦¥}vž©e˜o@’ØÞöZ‰¿Í†D<ƒ‰*’è€d€€d—’öƒ‰>†DW‰¿îö’Ù ˜orž©¥}³¬àç´ÇŒ½%"ÅÞ.ÏËØpââ†ëýjõúñÿøP ¯5á'·0ÿÊ:"aBÛgK8öS“Z‚¿aVËgìm'Ir Èv@Py»Û|vç~m$›uÿÿ›c~lÿ|v°y»’v?ör ]m&ÎgbaV2Z‚SàK88BÚž:!0þð'Ž×à1M Äeõúëüâ¡ØpÎÿñÅÝ\½$Y´ÆÍ¬à4¥} ž©˜nè’Øö‰¿“†Dƒ‰’Ñ€d…€€d£“ ƒ‰a†D…‰À'öÅ’ÙY˜oÊž©þ¥~¬áY´È½ýÅÞ³ÏUØqpâ ëýýõû†ÿøæ DÉá§'E1T:"çBÛæK9oS Zƒ)aW,g‘Dm;r v@‰y¼ |w ~m;›ÿÿ›W~lç|vy»dv?½r m&€g aUÑZ¯SnK7¿BçÃ:! 0þf'ŽIß ¹ /ÏõùqëûíâØotÎÿgÅÜ×½#Ú´ÆT¬ßÂ¥|£ž¨£˜n’àžõÒ‰¿Z†Càƒˆä’¹€dy€€d¯“$ƒ‰„†D³‰À`÷ ’Ù§˜p"žª_¥~†¬áË´È~½}Åß8Ïߨqþâ ©ëþ‘õüÿù{ Ù]â9'Ô1Þ:#lBÜfK9èS vZƒ’aWŽg‘œm‰r Pv@Ãy¼7|w-~mR›ÿÿ›L~lÐ|vky»6v?ƒrm&2g²aUpZESýK7FBçD: …0ýÜ'»ß% š:õøÜëûZâØnåÎþÝÅꓽ#Z´ÅÛ¬ßQ¥|9ž¨B˜n8’àPõމ¿!†C±ƒˆÁ’¢€dm€€dº“<ƒ‰§†Dá‰À™ð ’Ùõ˜pzžªÀ¥~ð¬â<´È÷½üÅß½ÏiØrŒâ!:ëÿ%õü°ÿú nðâÊ'‘b1h:¯BÜåK:aS èZƒüaWïg‘ôm×r ”v@üy¼f|wP~mj›˜ÿÿ›@~l¹|vHy»v?JrÕm%ägZaUZ€ÛS‹K6ÍBæÄ: 0ýR'-Þ}’ ¤õøGëúÆâíØnWÎþSÅê½"Û´Åb¬Þߥ{Ïž§á˜mà’àõJ‰¾è†CƒƒˆŸ’‹€e£€€dÆ“Sƒ‰Ê†E‰ÀÒðM’ÚC˜pÒž«!¥Z¬â®´Ép½|ÅàCÏóØsâ!Ìëÿ¸õíRÿú¦ „ã['‘ð1ò:5BÝeK:ÚS!ZZ„faXPg’Lm %r ØvA5y¼”|ws~mšcÿÿ›4~l¡|v%yºÙv?r‘m%–gaT®Z€rSK6TBæE:{0üÈ'ŒŸÝìÿþ dõ÷²ëú2â\ØmÉÎýÉÅ鉽"\´Äé¬Þm¥{ež§€˜mˆ’ß´õ‰¾®†CUƒˆ|’s€e—€€dÒ“kƒ‰í†E>‰Á ð‘’Ú‘˜q)ž«‚¥ì㠴Éé½ûÅàÈÏ}Øs©â"]ìLõíçÿû< ˜ãí'’~1|:ºBÝäK;SS!ËZ„ÏaX±g‰ØrMm%HgŽ«aTMZ€S¨KBÍBåÅ:ö0ü>'ŒÝZÿj Ïyõ÷ëùŸâËØm;Îý?Åé½!Ü´Äq¬Ýü¥züž§˜v˜’ßfôɾu†C'ƒˆY’\€e‹€€dÝ“‚ƒŠ†El‰ÁEðÔ’Úà˜qž«ã¥€-¬ã‘´½p½zÅáMÏØt7â"îìßõî|ÿûÑ -«ä~'“ 1:?BÞdK;ÌS"=Z…9aYg‰”m Ár _vA§y¼ð|w¹~m°šzÿÿ›~lr|ußyº}v>Ÿr m$ùgŽSaSìZžS6KBTBåF:p0û´'‹‚ÜÉþ× :äõöˆëù â9Øl­Ï }Åè½!]´Ãø¬ÝŠ¥z’ž¦¾˜v@’ßô‰¾<†Bùƒˆ6’E€e€€€dé“™ƒŠ3†Eš‰»_ñ’Û.˜qÙž¬E¥€—¬ä´½é½úÅáÒÏ‘ØtÅâ#€ìsõïÿüg Â?å'“š0ôÈ:ÄBÞãKm$gKaRÉZ~aS' K@éBãÈ:á0ú'‰ØÛ é {$õôÉë÷Pâ…ØkÏ ÞÅæï½޴¬Ü5¥yUž¯ÿ˜u9’Þ-󳉽†Bnƒ‡Í”€e\€€e “ßƒŠ›†F%‰¼ ñä’ܘráž­h¥Ô¬Ù-´¿S½xÅãbÏ0Øvoâ%4ëó`õðÐÿþ' úæÃ'•E0ög:TBàaK=°S$Z†àaP2gŠóm!úr ovBŒy½©|xD~kŒš©ÿÿšî~l|uSy¹ÄvCÙr úm#ÁgŒóaRhZ}÷S&šK@pBãH:\0ù‹'‰JÚƒ V æŽõô4ëö½âôØy¬Ï TÅæj½_´Â¬ÛÄ¥x랯ž˜tá’Ýßóo‰½W†B@ƒ‡ª”h€eQ€€e“÷ƒŠ¾†Aa‰¼Cò(’Üf˜s9ž­É¥‚>¬ÙŸ´¿Ì½øÅãçϺØvýâ%Åëóôõñeÿþ½  çU'†›0öñ:ÙBàáK>(S$uZ‡IaP“g‹Km"Hr ³vBÅy½×|xg~k¤šµÿÿšâ~ký|u0y¾ˆvC r ¶m#sgŒœaRZ}ŽS&(K?÷BâÉ:×0ù'ˆ»Ùò  QùõóŸëö)âcØyÏÊÅåå½ß´Á›¬ÛR¥x‚ž¯=˜t‰’Ý‘ó+‰½†Bƒ‡ˆ”P€eE€€e$”ƒŠá†A‰¼|òl’Ü´˜sž®*¥‚§¬Ú´ÀE½wÅälÏDØwŒâÈëôˆõñúÿÿR « !çæ'‡)0÷{:^Bá`K>¡S$çZ‡³aPôg‹£m"–r ÷vBþy¾|tÎ~k»šÁÿÿšÖ~kæ|u y¾ZvCgr sm#%gŒDaQ¥Z}$S%·K?~BâI:Q0øw'ˆ-èð / ¼cõó ëõ•âÑØxÏ@Åå_½`´Á"¬Úà¥xž®Û˜t1’ÝCò艼å†A䃋!”9€e9€€e0”&ƒ‹†A¾‰¼¶ò¯’ݘsèž®‹¥ƒ¬Ú‚´À¾½öÅäñÏÎØxâYëõõòÿÿè @ ´èw'‡¸0ø:ãBáàK?S%YZˆaQUg‹ûm"är :vC8y¾3|tñ~kÓšÍÿÿšË~kÏ|tëy¾+vC.r /m"×g‹ìaQDZˆ S%EK?BáÊ:Ì0÷í'‡Ÿè^ › 'ÿÿÎõòuëõâ@Øx϶ÅäÚ½à´À©¬Úo¥‚ÿž®z˜sÙ’Üõò¤‰¼¬†A¶ƒŠþ”"€e.€€e;”=ƒ‹'†A쉼ïòó’ÝP˜t@ž®ì¥x*¬Úô´Á7½vÅåvÏXØx¨âêëõ¯õó$} Õ Hé 'ˆF0ø:hBâ_K?“S%ÊZ}6aQ¶gŒSm#2r ~vCqy¾b|u~kêšØÿÿš¿~k·|tÈy½ývBõr ëm"‰g‹”aPãZ‡¡S$ÓK>BáJ:G0÷c'‡çÍ  ’ÿÿ8õñàëônâ&>ØwsÏ,ÅäU½a´À0¬Ùý¥‚•ž®˜s’ܧò`‰¼s†A‡ƒŠÛ” €e"€€eG”Tƒ‡Ž†B‰½(ó7’Ýž˜t˜ž¯M¥x”¬Ûe´Á°½õÅåüÏâØy6â|ëöBõó¹ j ÜÚ 'ˆÔ0ù:îBâßK@ S&BàË:Â0öÙ'†ƒç< t ýÿþ£õñKëóÛâ%¬ØvåÏ¢Åãнâ´¿·¬Ù‹¥‚+ž­¸˜s)’ÜYò‰¼9†AYƒŠ¸“ó€e€€eS”lƒ‡°†BH‰½aó{’Ýì˜t𞯮¥xþ¬Û×´Â)½uÅæÏ lØjâ ëöÖõôN¨ ÿ oÚ'‰b0ù£:sBã^K@…S&­Z~ aRxgm#ÏrvCãy¹Ì|uY~lšðÿÿš§~kˆ|x>y½¡vB‚r cm!ìgŠäaP!Z†ÎS#ðK=›BàK:=0öO'•,æªà hÿþ õð¶ëóGâ%ØvWÏÅãK½b´¿>¬Ù¥Âž­W˜rÒ’Ü ñ؉¼†FƒŠ•“Û€e €€e_”ƒƒ‡Ó†Bv‰½šó¿’Þ;˜uHž°¥yg¬ÜI´Â¢½ôÅçÏ öØkâžë÷jõôã= ” Û.'‰ð0ú-:øBãÞK@þS'Z~saRÙgZm$rJvDy¹ú|u|~l0šüÿÿšœ~kq|xy½svBIr m!žgŠŒaZ$Z†dS#~K="BßÌ:·0õÅ'”žæL Óÿýxõð!ëò³â$‰ØuÉÏŽÅâÆ½㴾ƬäÓ¥Xž¬ö˜rz’Û¼ñ”‰»Ç†Er“Ä€dÿ€€ej”›ƒ‡ö†B¤‰½Ôô’Þ‰˜u ž¦ ¥yѬܺ´Ã½ tÅç‹Ï €Øk©â0ë÷ýõõxÓ ) –Û¿'Š~0ú·:}Bä]KAwSfZ~ÝaS;g²m$krŽvDVyº)|uŸ~lH›ÿÿš~kZ|wøy½EvBr Ûm!PgŠ4aYÃZ…úS# K<©BßM:20õ;'”刹 >ÿüâõïŒëò â#øØu;ÏÅâ@½c´¾M¬äa¥€îž¬•˜r"’ÛnñP‰»Ž†EÀƒŠO“­€dó€€ev’1ƒˆ†BÓ‰¾ ôF’Þטuøž¦m¥z;¬Ý,´Ã”½ óÅèÏ Øl7âÁëø‘õö h ¾þ]ÜQ'‹ 0ûA:BäÜKAðSØZGaSœgŽ m$¹rÑvDyºW|uÂ~l_›ÿÿš„~mÃ|wÕy½vA×r ˜m!g‰ÝaYbZ…S"›K<0BÞÍ:­0ô°'“‚äö% ©ÿüMõî÷ìZâ#gØt¬ÏzÅỽä´½Ô¬ã鹿„ž¬4˜qÊ’Û ñ ‰»U†E’ƒŠ,“•€d瀀e‚’Iƒˆ<†C‰¾FôŠ’ß%˜vOž¦Î¥z¤¬Ýž´Ä ½!sÅè•Ï •ØlÅâRëù%õö¢þ SþðÜâ'‹›0ûÌ:‡Bå\KBiSIZ°aSýgŽbm%rv>¨yº…|uå~lv›ÿÿšx~m¬|w³y¼èvAr Tm ´g‰…aYZ…'S")K;·BÞN:(1ï'’ôäe’ ÿû·õîbìÆâ"ÕØtÏïÅá6½d´½[¬ã~¥€ž«Ó˜qr’ÚÒðɉÁ;†EdƒŠ “~€dÛ€€eŽ’`ƒˆ_†C/‰¾ôÎ’ßs˜v§ž§0¥{¬Þ´Ä…½!òÅéÎýVØmSâäëù¸õ÷7“ èÿ„Ýs'Œ)0üV: BåÛKBâS»Z€aT^gŽºm%UrYv>âyº³|v~lŽ›*ÿÿšm~m”|wy¼ºvAdr m fg‰-aX Z„½S!¸K;>BÝÎ:£1e'’eãÔþ ÿû"õíÍì2â"DØsÏeÅà±½å´ÉԬ㠥±ž«r˜q’Ú„ð…‰Á†E6ƒ‰ç“f€dЀ€e™’wƒˆ‚†C]‰¾¸õ’ßÁ˜m˜ž§‘¥{x¬Þ´Äþ½"qÅé ÎýáØmââuëúLõ÷Ì) }Þ'Œ·0üà:’Bæ[K6iS-Z€„aT¿gm%£rv?yºá|v+~l¥›6ÿÿša~m}|wmy¼ŒvA+r Ìm g’=aX?Z„SS!FK:ÅBÝO:1Ú'‘×ãBj êÿúõí8ëÿŸâ!³ØsÏÛÅà,½f´É[¬âš¥Gž«˜pÂ’Ú6ðA‰ÀɆEƒ‰Ä“O€dÄ€€dd’ƒˆ¥†C‹‰¾òõV’à˜mïž§ò¥{á¬Þó´Åw½"ñÅê%ÎþkØnpâëúàõøa¾ «Þ–'E0ýj: BæÚK6âSŸZ€íaU gim%ñráv?Ty»|vN~l½›Bÿÿ›–~mf|wJy¼^v@òr ˆmÊg‘åaWÞZƒêS ÔK:LBÜÏ:˜1P'‘Iâ±× Uÿù÷õü–ëÿ â!!ØrtÏQÅß§½æ´Èâ¬â)¥~Þžª°˜pk’Ùèïý‰À†DÙƒ‰¡“8€d¸€€do’¦ƒˆÇ†C¹‰¿+õš’à]˜nGž¨S¥|K¬ßd´Åð½#pÅêªÎþõØnþâ˜ëûsõøöT ´?ß''Ó0ýô: œBçZK7[SZWaUgÁm&?ráv?y»>|vq~lÔ›Nÿÿ›‹~mN|w'y¼/v@¹r Dm|g‘aW}Zƒ€S cK9ÓBÜP:#U1Æ'»â C Àÿùbõüëþwâ ØqæÏÇÅß!½g´Èi¬á·¥~tžªN˜p’Ùšöý‰ÀV†D«ƒ‰~“ €d­€€d{’½ƒˆê†C艿dõޒଘnŸž¨´¥|µ¬ßÖ´Æi½#ðÅÜîÎÿØoŒâ)ëüõù‹é IÒß¹'Ža0þ~:!!BçÙK7ÔS‚ZÁaUâgm&r %v?Çy»l|v“~lë›Yÿÿ›~m7|wy¼v@r m-g‘5aWZƒSñK9ZBÛÐ:"Ð1<'-Ꭿ +ÿøÌõûlëýäâÿØqWÏ=ÅÞœ½%Œ´Çð¬áE¥~ ž©í˜o»’ÙLö¹‰À†D}ƒ‰[“ €d¡€€d‡’Õƒ‰ †D‰¿ö"’ؘn÷ž©¥}¬àH´Æâ½$oÅÝsÏ Øpâºëüšõú  ÞfàJ'Žð0ÿ:!¦BÚ´K8MSôZ‚+aVCgqm&Ûr iv@y»š|v¶~m›eÿÿ›s~m|váy»Óv@Fr ¼m';gÝaV»Z‚­S€K8áBÛQ:"J0ÿ²'Ÿàý –ÿø7õú×ëýPâmØpÉϳÅÞ½% ´Çw¬àÔ¥}¡ž©Œ˜oc’Øþöu‰¿ä†DOƒ‰8’ò€d•€€d’’색0†DD‰¿Ööe’Øì˜oOž©v¥}ˆ¬à¹´Ç[½$ïÅÝøÏ“Øp¨âLëý.õúµÿø súàÛ'~0ÿ’:",BÛ3K8ÅSeZ‚”aV¤gÉm')r ­v@9y»È|vÙ~m›qÿÿ›h~m|v¾y»¥v@ r ym&íg…aVZZ‚CSK8iBÚÒ:!Å0ÿ('àlˆ ¡õúBëü½âÜØp;Ï)ÅÝ’½$´Æþ¬àb¥}7ž©+˜o ’ذö1‰¿ª†D ƒ‰’Ú€d‰€€dž“ƒ‰S†Dr‰Àö©’Ù:˜o§ž©×¥}ò¬á+´ÇÔ½%nÅÞ}ÏØq7âÝëýÂõûJÿøª ám' 1:"±BÛ³K9>S×Z‚þaWg‘!m'wr ñv@ry»÷|vü~m1›|ÿÿ›\~lñ|vœy»wv?Ôr 5m&Ÿg.aUùZÙSœK7ðBçö:!@0þž'Ž‚ßÚõ l õù­ëü)âKØo­ÎÿŸÅÝ ½$ ´Æ…¬ßð¥|Íž¨Ê˜n³’à¾õ퉿q†Còƒˆò’Àd~€€dª“ƒ‰v†D ‰ÀIöí’Ùˆ˜oþžª8¥~[¬á´ÈM½IÅßϧØqÅâ nëþUõûßÿù? !áþ'š1¦:#6BÜ2K9·S HZƒhaWfg‘ymir 4v@«y¼%|w~mI›ˆÿÿ›P~lÙ|vyy»Iv?›rñm&QgÖaU—ZpS+K7wBçw: »0þ'ôßIa ×võùëû•â¹ØoÎÿÅ܈½#Ž´Æ ¬ß¥|dž¨i˜n\’àoõª‰¿8†CăˆÐ’¬€dr€€d¶“2ƒ‰™†DωÀ‚ïî’ÙÖ˜pVžª™¥~Ŭâ´ÈƽÉÅ߈Ï1ØrSâ!ëþéõütÿùÔ 2´â'‘(10:yBܲK:0S ºZƒÑaWÇg‘Ðm¸r xv@åy¼S|wB~m`›”ÿÿ›E~lÂ|vVy»v?arñm&g~aU6ZS¹K6þBæø: 60ýŠ'fÞ¸Í Báõøƒëûâ(Øn‘Îþ‹ÅêD½#´Å“¬ß ¥{úž¨˜n’à!õf‰¾ÿ†C–ƒˆ­’”€df€€dÁ“Jƒ‰¼†Dý‰À»ð1’Ú$˜p®žªú¥/¬â€´É?½HÅà Ï»Øráâ!‘ëÿ}õíÿúj ÇHã!'‘¶1º:ÿBÝ1K:©S!,Z„;aX(g’(m r ¼vAy¼|we~mxš^ÿÿ›9~l«|v3yºìv?(r­m%µg&aTÕZ€œSGK6…Bæx:±0ý'ŒØÞ&:  Kõ÷îëúnâ—ØnÎþÅ鿽"´Å¬Þ›¥{ž§§˜m¬’ßÓõ"‰¾Æ†ChƒˆŠ’}€eœ€€dÍ“aƒ‰ß†E+‰Àôðu’Úr˜qž«[¥™¬âò´É¸½ÈÅà’ÏEØsoâ""ìõíªÿúÿ \Üã²'’E1E:„BݱK;"S!Z„¥aX‰g’€m Tr vAWy¼¯|wˆ~mšjÿÿ›-~l“|vyº¾v>ïrim%ggŽÎaTtZ€3SÖKBþBåù:+0üv'ŒJÝ•ÿ¦  ¶õ÷YëùÚâØmtÎývÅé:½"´Ä¡¬Þ*¥{'ž§F˜v¼’ß…ôÞ‰¾Œ†C:ƒˆg’e€e€€dÙ“xƒŠ†EY‰Á.ð¹’ÚÀ˜q^ž«¼¥€¬ãc´½?½GÅáÏÏØsýâ"´ì¤õî?ÿû• ñoäC'’Ó1Ï: BÞ0K;›S"Z…aXëg‰pm ¢r DvAy¼Þ|w«~m¦švÿÿ›!~l||uíyºv>¶r%m%gŽvaTZÉSdKB…Båy:¦0ûì'‹¼Ýÿ v õöÄëùGâtØlæÎüìÅè´½!´Ä)¬Ý¸¥z½ž¦å˜vd’ß7ôš‰¾S†C ƒˆD’N€e„€€d䓃Š$†E‡‰»Gðý’Û˜q¶ž¬¥€l¬ãÕ´½¸½ÆÅáœÏZØt‹â#Eì7õîÔÿü* †äÕ'“a0ô:ŽBÞ°K<S"Z…xaYLg‰Èm ðr ˆvAÉy½ |wÍ~m¾šÿÿ›~ld|uÊyºavDœrám$ËgŽaS²Z_SòKB Bäú:!0ûa'‹.Ürþ á‹õö/ëø³âãØlXÏ *Åè/½!´Ã°¬ÝF¥zSž¦„˜v ’ÞéôV‰¾†B݃ˆ!’7€ey€€d𓧃ŠG†E¶‰»ñA’Û\˜r ž¬~¥€Ö¬äG´¾1½FÅâ!ÏäØuâ#ÖìËõïiÿüÀ —åf'“ï0õ:Bß/Kr ÌvBy½:|wð~kTšÿÿ› ~lM|u§yº3vDcrm$}gÇaSQZ~õS€KA“Bäz:œ0ú×'ŠŸÛá ¹ Lõõõšëø âQØkÊÏ  Å窽 ‘´Ã7¬ÜÕ¥y鞦#˜u´’Þ›ô‰½á†B¯ƒ‡þ” €em€€dü“¿ƒŠj†E䉻ºñ…’Ûª˜rež¬ß¥?¬ä¸´¾ª½ÅÅâ§ÏnØu¨â$hëò‘õïþÿýU °*å÷'”}0õ¥:™B߯K=S#dZ†KaZgŠxm!Œr vBy¾švC·r Òm#“gŒ¿aR.Z}¸S&VK@(Bâü: 0ù9'ˆõÚ- þ 5õóÛëöeâØyWÏ Åæ½´Á̬ۀ¥x¬ž¯d˜t¬’ݰóG‰½5†B%ƒ‡–”Z€eJ€€e”ƒŠÓ†A}‰¼eòP’Ü•˜smž®¥‚}¬Ùã´À½DÅä6Ï ØwRâ&ëôLõñ¾ÿÿ o åç«'†ð0÷C:(Bá-K>qS$¹Z‡ˆaPÍg‹€m"wr ÛvBçy½ó|tÀ~k²š¼ÿÿšÛ~kð|uy¾lvC~r Žm#DgŒgaQÍZ}OS%åK?¯Bâ}:‡0ø¯'ˆgé* j ø õóFëõÑâ ØxÉÏxÅ啽“´ÁS¬Û¥xCž¯˜tU’Ýbó‰¼ü†Aöƒ‹/”B€e>€€e+”ƒŠö†A«‰¼Ÿò”’Üã˜sÅž®d¥‚æ¬ÚT´À½ÃÅä»Ï–ØwàâëôàõòSÿÿ«  yè='‡~0÷Í:­Bá¬K>éS%+Z‡òaQ.g‹×m"År vC!y¾!|tâ~kÉšÈÿÿšÏ~kØ|tùy¾>vCEr Jm"ögŒaQlZ|åS%sK?6Báý:0ø%'‡Ùè™ × c õò±ëõ=â{Øx;ÏîÅå½´ÀÚ¬Ú¥ƒ)ž®¢˜sý’Ýò¿‰¼Ã†Aȃ‹ ”+€e2€€e7”4ƒ‹†AÙ‰¼ØòØ’Ý1˜tž®Å¥x¬ÚÆ´Á½BÅåAÏ Øxoâ°ëõsõòèA ™ èÎ'ˆ 0øW:3Bâ,K?bS%œZ} aQgŒ/m#r cvCZy¾O|u~kášÔÿÿšÄ~kÁ|tÖy¾vC r m"¨g‹·aQ Z‡ÌS%K>½Bá~:}0÷›'‡Jè C ÎÿÿuõòëôªâéØw­ÏdÅ䋽•´Àa¬Ú+¥‚Àž®@˜s¥’ÜÆò{‰¼Š†AšƒŠé”€e'€€eB”Kƒ‹<†B‰½ó’ݘtuž¯&¥xi¬Û8´Á½ÂÅåÆÏªØxýâAëöõó}Ö .  ÙÐ'ˆš0øá:¸Bâ«K?ÛS&Z}uaQðgŒ‡m#ar §vC“y¾}|u(~køšßÿÿš¸~k©|xoy½âvBÓr Âm"Zg‹`aP©Z‡bS$K>EBàþ:ø0÷'†¼çv ¯ 9ÿþßõñ‡ëôâ%çØwÏÚÅä½´¿è¬Ù¹¥‚Vž­ß˜sM’Üxò7‰¼Q†AlƒŠÆ“ü€e€€eN”bƒ‡¢†B5‰½Jó_’Ý͘tÌž¯‡¥xÓ¬Û©´Áø½AÅæKÏ 4Øy‹âÒëöšõôl à 4Úb'‰)0ùk:=Bã+K@TS&€Z}ßaRQgŒßm#¯r ëvCÌy¾«|uK~lšëÿÿš¬~k’|xLy½´vB™r m" g‹aPHZ†øS$K=ÌBà:r0ö‡'•fæå  ¤ÿþJõðòëóƒâ%VØvÏPÅã½–´¿o¬ÙH¥ìž­~˜rõ’Ü*ñô‰¼†F/ƒŠ£“å€e€€eZ”zƒ‡Å†Bd‰½ƒó£’Þ˜u$ž¯è¥y=¬Ü´Âq½ÁÅæÐÏ ¾Øjáâdë÷.õô§ X ÇÚó'‰·0ùõ:ÂBãªK@ÍS&ñZ~IaR²g7m#ýr.vDy¹è|un~l'š÷ÿÿš ~kz|x)y½…vB`r ;m!¾gаaOçZ†S#¬K=SBà:í0õü'”׿Tˆ ÿý´õð]ëòïâ$ÄØvÏÆÅâû½´¾ö¬ØÖ¥ƒž­˜r’ÛÜñ°‰»Þ†FƒŠ€“Í€e€€ef”‘ƒ‡è†B’‰½¼óç’Þi˜u|ž¥å¥y¦¬Ü´Âê½ @ÅçUÏ IØkpâõë÷Âõõ<– í [Û„'ŠE0ú€:GBä)KAFS8Z~²aSgm$KrrvD>yº|u‘~l>›ÿÿš•~kc|xy½WvB'r ÷m!pgŠXaYêZ†%S#;K<ÚB߀:h0õr'”IåÂô zÿýõïÈëò[â$3ØutÏ;Åâv½—´¾~¬ä¥ž¬¼˜rE’ÛŽñl‰»¥†EÓƒŠ^“¶€dø€€eq”©ƒˆ †BÀ‰½öô+’Þ·˜uÔž¦F¥z¬Üþ´Ãc½ ÀÅçÚÏ ÓØkþâ†ëøUõõÑ, ‚ îÜ'ŠÓ0û :ÌBä©KA¿SªZaStgçm$™r¶vDxyºD|u´~lV›ÿÿš‰~mÌ|wäy½)vAîr ³m!"gŠaY‰Z…»S"ÉKm$çrúvD±yºr|u×~lm›ÿÿš}~mµ|wÁy¼ûvAµr om Ôg‰¨aY(Z…RS"WK;èBÞ:^1&'“-ä Í Pÿûôõîžìâ#ØtXÏ'Åál½˜´½Œ¬ã¬¥€Ež«ú˜q–’Úòðä‰ÁR†EwƒŠ“‡€dà€€e‰’WƒˆQ†C‰¾hô³’ßS˜v„ž§¥zã¬Ýá´ÄU½!¿ÅèåÎýØmâ©ëù}õöûW ¬ÿHÝ8'‹ï0ü:×Bå¨KB±SZïaT7gŽ–m%5r>v>Ëyº¡|uú~l„›&ÿÿšq~mž|wžy¼ÍvA{r +m …g‰PaXÇZ„èS!æK;oBÞ:Ù1œ'’Ÿä: »ÿû^õî ìnâ"ØsÉÏÅàç½´½¬ã:¥Üž«™˜q>’Ú¤ð ‰Á†EHƒ‰õ“p€dÔ€€e•’nƒˆt†CJ‰¾¡ô÷’ߢ˜mtž§i¥{M¬ÞS´Äͽ">ÅéjÎý©Øm¨â:ëúõ÷ì AÿÜÝÊ'Œ~0ü¨:\Bæ'K68SÿZ€YaT˜gŽîm%ƒr‚v?yºÏ|v~lœ›1ÿÿšf~m†|w{y¼ŸvABr çm 7g’`aXfZ„~S!tK:öBÝ‚:S1'’ã}¦ &ÿúÉõítëÿÚâ!íØs;ÏÅàa½™´ÉŒ¬âÈ¥rž«8˜pæ’ÚUð]‰Àà†Eƒ‰Ò“Y€dÉ€€e ’…ƒˆ–†Cy‰¾Úõ;’ßð˜mÌž§Ê¥{·¬ÞÅ´ÅF½"½ÅéïÎþ3Øn6âÌëú¤õø%‚ ÖoÞ[' 0ý2:áBæ§K6±SqZ€ÃaTùgFm%ÒrÅv?=yºý|v@~l³›=ÿÿ››~mo|wXy¼pvA r ¤még’aXZ„S!K:}BÝ:Î1ˆ'‘ƒâì ‘ÿú3õüÓëÿGâ!\Ør­Ï‰Åßܽ´É¬âW¥žª×˜pŽ’Úð‰À¦†D색¯“A€d½€€dk’ƒˆ¹†C§‰¿õ~’à>˜n$ž¨+¥| ¬ß6´Å¿½#=ÅêtÎþ½ØnÄâ]ëû7õøº xÞí'š0ý¼: fBç&K7*SâZ,aUZgžm& r v?vy»+|vb~lË›Iÿÿ›~mX|w5y¼Bv@Ðr `m›g‘°aW¤Zƒ«S ‘K:B܃:I1þ'ôâZ üÿùžõü>ëþ³â ËØrÏÿÅßW½š´Èš¬áå¥~Ÿžªv˜p6’Ù¹÷‰Àm†D¾ƒ‰Œ“*€d±€€dv’´ƒˆÜ†CÕ‰¿MõÂ’àŒ˜n|ž¨¥|Ьߍ´Æ8½#¼ÅܸÎÿGØoSâîëûËõùO­  —ß~'Ž(0þF: ëBç¥K7£STZ–aU»göm&nr v?¯y»Y|v…~lâ›Uÿÿ›„~m@|wy¼v@—r mMg‘YaWCZƒAS K9‹BÜ:#1t'fáÉë gÿù õû©ëþ â 9Øq‘ÏuÅÞÒ½´È!¬ás¥~5žª˜oÞ’ÙköÕ‰À4†Dƒ‰i“€d¦€€d‚’˃ˆÿ†D‰¿†ö’àÚ˜nÓž¨î¥|ô¬à´Æ±½$<ÅÝ=ÎÿÑØoáâ€ëü_õùäB ¢*à'޶0þÐ:!qBÚ€K8SÆZ‚aVgNm&¼r Mv?éy»ˆ|v¨~lù›`ÿÿ›x~m)|vïy»æv@]r Øm'[g‘aVâZ‚×S­K9BÛ„:"€0ÿê'Øá8W ÒÿøsõûëýŒâ¨ØqÏëÅÞM½%@´Ç¨¬á¥}Ëž©´˜o‡’Ùö‘‰¿û†Daƒ‰F’û€dš€€dŽ’ãƒ‰"†D1‰¿¿öJ’ØÌ˜o+ž©O¥}]¬à‹´Ç*½$»ÅÝÂÏ[ØpoâëüòõúyØ 7¾à¡'D0ÿZ:!öBÛK8•S7Z‚jaV}g¥m' r ‘v@"y»¶|vË~m›lÿÿ›l~m|vÍy»¸v@$r ”m' g©aVZ‚nS~l´|vAyºÿv??rÈm%ÕgIaTýZ€ÇSuK6¶Bæ¬:æ0ý7'Þau ܈õø+ëúªâÑØn<Îþ8Åéõ½"ôÅK¬ÞÉ¥{»ž§Î˜mÏ’ßóõ=‰¾Ý†Czƒˆ˜’†€e¡€€dÈ“Xƒ‰Ð†E‰ÀÝðZ’ÚR˜pâž«4¥n¬âĴɇ½”Åà\ÏØs6â!èëÿÕõínÿúà   ãw'’ 1 :NBÝ}K:ñS!pZ„zaXbg’\m 4r åvA@y¼|wz~m…šeÿÿ›2~l|vyºÑv?r„m%‡gŽòaT›Z€]SK6=Bæ,:a0ü­'ŒƒÝÐÿâ Gòõ÷–ëúâ@Øm®Îý®Åéo½"C´ÄÒ¬ÞX¥{Qž§m˜mx’ߥôù‰¾¤†CLƒˆu’o€e•€€dÔ“oƒ‰ó†EG‰Áðž’Ú ˜q:ž«•¥جã5´½½ÅàáϘØsÄâ"yìhõîÿûX µ4ä '’™1—:ÓBÝýK;jS!áZ„äaXÃg‰Mm ‚r )vAyy¼Ë|wœ~mšqÿÿ›&~l…|uûyº¢v>Ír@m%9gŽšaT:ZôS’KB¶Bå­:Ü0ü#'‹õÝ>ÿN ²]õ÷ëù‚â¯Øm Îý$Åèê½!Ä´ÄY¬Ýæ¥zèž§ ˜v‡’ßWô¶‰¾j†CƒˆR’X€e‰€€dà“†ƒŠ†Eu‰ÁPðá’Úï˜q’ž«ö¥€A¬ã§´½‡½“ÅágÏ"ØtRâ# ìüõî˜ÿûî JÇäš'“'1!:XBÞ|K;ãS"SZ…MaY$g‰¥m Ðr lvA²y¼ù|w¿~m´š}ÿÿ›~ln|uØyºtvD³rým$êgŽBaSÙZŠS KB=Bå-:W0û™'‹gÜ­þº ÇõökëøïâØl’Ï bÅèe½!D´Ãà¬Ýt¥z~ž¦«˜v/’ßôr‰¾1†Bðƒˆ/’@€e}€€d듞ƒŠ9†E£‰»jñ%’Û=˜qꞬW¥€«¬ä´¾½ÅáìϬØtàâ#œìõï-ÿüƒ ß[å+'“¶0ôã:ÞBÞüK<\S"ÄZ…·aY…g‰ým!r °vAëy½'|wâ~mËšˆÿÿ›~lW|uµyºFvDzr¹m$œgêaSxZ S®KAÄBä®:Ò0û'ŠÙÜþ' ˆ2õõÖëø[âŒØlÏ ØÅçའŴÃh¬Ý¥zž¦J˜uØ’Þºô.‰½ø†Bƒˆ ”ª€er€€d÷“µƒŠ\†Eщ»£ñi’Û‹˜rBž¬¸¥¬äŠ´¾y½’ÅâqÏ6Øunâ$-ëòUõïÂÿý tïå½'”D0õm:cBß{K<ÕS#6Z†!aYægŠTm!mr ôvB%y½U|x~kbš”ÿÿ›~l?|u’yºvDArum$Ng’aSZ~¶S=KAKBä/:M0ú…'ŠKÛŠ a óœõõAë÷ÈâûØkuÏ NÅç[½ E´Âï¬Ü‘¥y«ž¥é˜u€’Þlóꉽ¿†B”ƒ‡ê”’€ef€€e“̓ІEÿ‰»Üñ­’ÛÙ˜ršž­¥~¬ØÑ´¾ò½ÅâöÏÀØuüâ$¾ëòéõðWÿý® ‚æN'”Ò0õ÷:èBßúK=NS#¨Z†ŠaOãgЬm!»r 8vB^y½„|x(~kzš ÿÿš÷~l(|upy¹êvDr1m$g:aR¶Z~MS&öK@ÒBã¯:Ç0ùû'‰¼Úù Í ^õô¬ë÷4âiØjçÏ ÄÅæÕ½Æ´Âv¬Ü¥yAž¯ì˜u(’Þ󦉽††Beƒ‡Ç”{€eZ€€e“䃊¢†F.‰¼ññ’Ü'˜ròž­z¥è¬ÙC´¿k½‘Åã{ÏJØv‹â%Pëó}õðìÿþD ž æß'•`0ö:mBàzK=ÇS$Z†ôaPDg‹m" r |vB—y½²|xK~k‘š¬ÿÿšì~l|uMy¾­vCÎr ím#²gŒãaRUZ}ãS&„K@YBã0:B0ùq'‰.Úh 9 Éqõôëö âØØy‘Ï :ÅæP½F´Áý¬Û®¥xמ¯‹˜tÐ’ÝÐób‰½L†B7ƒ‡¤”c€eN€€e“ûƒŠÅ†Aj‰¼Nò5’Üu˜sIž­Ü¥‚R¬Ùµ´¿ã½ÅäÏÔØwâ%áëôõñÿþÙ 3 ©çq'†·0÷ :òBàùK>@S$‹Z‡^aP¦g‹\m"Wr ÀvBÐy½à|xn~k¨š·ÿÿšà~kù|u*y¾vC•r ©m#dgŒ‹aQôZ}yS&K?àBâ°:½0øç'ˆ ÙÖ ¦ 4Üõó‚ëö âGØyϰÅå˽Ç´Á„¬Û<¥xnž¯*˜tx’݂󉽆B ƒ‹=”L€eC€€e&”ƒŠè†A˜‰¼‡òy’ÜØs¡ž®=¥‚¼¬Ú&´À\½Åä†Ï^Øw§âäëô¤õòÿÿo È =è'‡E0÷•:xBáyK>¹S$ýZ‡ÇaQg‹´m"¥r vC y¾|tÔ~kÀšÃÿÿšÔ~kâ|uy¾QvC\r fm#gŒ3aQ“Z}S%¡K?gBâ1:80ø]'ˆèÔ  ŸGõòíëõyâµØxtÏ&ÅåF½G´Á ¬ÚÊ¥xž®É˜t ’Ý4òÚ‰¼Ú†AÛƒ‹”5€e7€€e2”*ƒ‹ †AƉ¼Áò¼’ݘsùž®ž¥ƒ%¬Ú˜´ÀÕ½Åå ÏèØx5âuëõ8õò« ] Ñè“'‡Ó0ø:ýBáøK?2S%nZ|áaQhgŒ m"ór GvCCy¾<|t÷~kךÏÿÿšÈ~kÊ|täy¾#vC#r "m"Èg‹ÛaQ2Z‡öS%/K>îBá±:³0÷Ó'‡„èB  ÿÿ±õòXëôåâ$ØwæÏœÅäÁ½È´À’¬ÚY¥‚êž®h˜sÈ’Üæò—‰¼¡†A­ƒŠ÷”€e+€€e>”Bƒ‹.†Aõ‰¼úó’Ý_˜tQž®ÿ¥x?¬Û ´ÁN½ŽÅåÏrØxÃâëõËõó@š ò dé%'ˆa0ø©:‚BâxK?ªS%àZ}JaQÉgŒdm#Ar ‹vC|y¾j|u~kïšÛÿÿš½~k³|tÁy½ôvBêr Þm"zg‹ƒaPÑZ‡S$¾K>uBá2:-0÷H'†öç± ë uÿÿõñÃëôRâ&"ØwXÏÅä<½I´À¬Ù祂ž®˜sp’ܘòS‰¼h†AƒŠÔ”€e €€eI”Yƒ‡”†B#‰½3óD’Ý­˜t©ž¯`¥x¨¬Û{´ÁǽÅæÏýØyQâ˜ëö_õóÕ/ ‡ øÚ''ˆï0ù4:Bâ÷K@#S&RZ}´aR*gŒ¼m#r ÏvCµy¾™|u=~lšæÿÿš±~k›|xZy½ÆvB°r šm",g‹+aPpZ‡#S$LK=üBà²:¨0ö¾'†hç  W àÿþ†õñ.ëó¾â%ØvÊχÅ㶽ɴ¿ ¬Ùv¥‚ž­¦˜s’ÜJò‰¼.†APƒŠ±“î€e€€eU”pƒ‡·†BQ‰½lóˆ’Ýû˜už¯Á¥y¬Ûí´Â@½ÅæšÏ ‡Øj¨â)ëöòõôjÅ  ŒÚ¸'‰}0ù¾:ŒBãwK@œS&ÃZ~aR‹gm#ÞrvCîy¹Õ|u`~lšòÿÿš¥~k„|x7y½˜vBwr Vm!ÝgŠÓaPZ†¹S#ÚK=„Bà3:#0ö4'•æŽÄ Kÿýñõð™ëó+â$ÿØv<ÏýÅã1½J´¿'¬Ù¥­ž­D˜rÁ’Ûûñˉ»õ†FƒŠ“×€e€€ea”ˆƒ‡Ú†B‰½¥óÌ’ÞJ˜uYž°"¥y|¬Ü_´Â¹½ ÅçÏ Øk6âºë÷†õôÿZ ± ÛJ'Š 0úH:BãöKAS Z~ˆaRìgkm$,rWvD'yº|uƒ~l5šþÿÿš™~km|xy½jvB>r m!gŠ{aZZ†PS#iK= Bß´:ž0õª'”ƒåý0 ¶ÿý[õðëò—â$nØu­ÏsÅ⬽Ê´¾®¬ä½¥Dž¬ã˜ri’Û­ñ‡‰»¼†E惊l“À€dü€€em”Ÿƒ‡ý†B­‰½ßô’Þ˜˜u±ž¦¥yå¬ÜдÃ2½ ŒÅç¥Ï ›ØkÄâLëøõõ”ð F ³ÛÛ'Šš0úÒ:—BäuKAŽS|Z~ñaSMgÃm$zr›vD`yº1|u¦~lL› ÿÿšŽ~kU|wòy½³yºŽ|uì~l{›!ÿÿšv~m§|w¬y¼ßvA’r Gm ¥g‰taXîZ…S"K; BÞ5:1Ô'’ØäIu ÷ÿû›õîEìªâ"ºØtÏÕÅá½L´½D¬ãh¥€ž«À˜qa’ÚÃð¼‰Á0†E[ƒŠ“y€dÙ€€e’eƒˆf†C8‰¾ŠôÛ’ß‚˜v¸ž§B¥{"¬Þ%´Ä½" Åé4ÎýqØmoâëùÕõ÷S° ÿ Ý'ŒD0üp:&BåôKBùSÑZ€.aTpgŽËm%drfv>íyº¼|v~l’›-ÿÿšj~m|w‰y¼±vAYr m Wg’ƒaXZ„©S!¢K;'Bݶ:‰1J'’Jã¸â bÿûõí°ìâ"(ØsuÏKÅà—½ʹɼ¬âö¥ž«_˜q ’Úuðx‰À÷†E-ƒ‰à“b€dÍ€€eœ’|ƒˆˆ†Cf‰¾Ãõ’ßИm¨ž§£¥{Œ¬Þ—´Å½"ŠÅé¹ÎýûØmýâ‘ëúhõ÷èE š4Þ 'ŒÒ0üú:«BæsK6€SCZ€˜aTÑg"m%²rªv?&yºê|v1~lª›8ÿÿš_~mx|wfy¼ƒvA r ¿m g’,aX,Z„?S!0K:®BÝ6:1À'‘¼ã&N Íÿúpõíëÿ‚â!—ØrçÏÁÅà½M´ÉD¬â…¥3žªþ˜p²’Ú'ð4‰À¾†Dÿƒ‰½“K€d€€df’“ƒˆ«†C”‰¾ýõc’à˜nž¨¥{ö¬ß´Å޽# Åê?Îþ…Øn‹â"ëúüõø}Û <ÇÞ²'`0ý„: 0BæóK6ùS´ZaU3gzm&rîv?_y»|vT~lÁ›Dÿÿ›”~ma|wCy¼Uv@çr {m»g‘ÔaWËZƒÖS ¿K:5BÜ·:16'‘.╺ 8ÿùÚõüzëþïâ!ØrXÏ7Åß½δÈˬâ¥~Éžª˜pZ’ÙÙïð‰À„†DЃ‰š“3€d¶€€dr’«ƒˆÎ†C‰¿6õ§’àl˜nXž¨e¥|_¬ßz´Æ½#‰ÅêÄÎÿØoâ´ëûõùp Ñ[ßC'ï0þ: ¶BçrK7rS&ZkaU”gÒm&Nrîv?˜y»G|vw~lØ›Pÿÿ›‰~mJ|w y¼'v@®r 7mmg‘|aWjZƒlS MK9¼BÜ7:#;1¬' â' £ÿùEõûåëþ[â tØqÊÏ­Åß½N´ÈR¬á¡¥~`žª<˜p’Ù‹öð‰ÀK†D¢ƒ‰w“€dª€€d}’ƒˆñ†Cð‰¿oõë’໘n°ž¨Æ¥|ɬßì´Æ€½$ÅÝÎÿ™Øo§âEëü#õù§ fïßÔ'Ž}0þ˜:!;BçñK7ëS˜ZÕaUõg*m&œr 2v?Òy»u|vš~lð›\ÿÿ›}~m2|vþy»øv@tr óm'{g‘$aW ZƒSÛK9CBÛ¸:"¶1"'ár“ ÿø¯õûPëýÈâãØq<Ï#ÅÞƒ½%s´ÇÙ¬á0¥}öž©Û˜oª’Ù=ö¬‰À†Dtƒ‰T“€dŸ€€d‰’Ùƒ‰†D‰¿¨ö/’ج˜ož©'¥}3¬à]´Æù½$ˆÅÝÏ#Øp5âÖëü·õú<› û‚àf' 0ÿ#:!ÀBÚÌK8dS Z‚?aVVg‚m&êr vv@ y»£|v½~m›gÿÿ›q~m|vÛy»Êv@;r ¯m'-gÌaV¨Z‚˜SjK8ÊBÛ9:"10ÿ˜'ƒàáÿ yÿøõú»ëý4âRØp®Ï˜ÅÝý½$ô´Ç`¬à¾¥}Œž©z˜oR’Øïöh‰¿Ù†DFƒ‰2’í€d“€€d•’ñƒ‰7†DM‰¿áös’Øû˜o`ž©ˆ¥}œ¬àÏ´Çr½%ÅÞÏ­ØpÄâhëýJõúÑÿø1 à÷'™0ÿ­:"EBÛLK8ÝS{Z‚©aV·gÚm'8r ºv@Dy»Ñ|và~m›sÿÿ›e~m|v¸y»œv@r lm&ÞguaVGZ‚/SøK8QBÚ¹:!¬0ÿ'ŽõàPl ä…õú&ëü âÀØp ÏÅÝx½$t´Æç¬àL¥}#ž©˜nú’Ø¡ö$‰¿Ÿ†Dƒ‰’Ö€d‡€€d “ƒ‰Z†D{‰Àö¶’ÙI˜o·ž©ê¥~¬áA´Çë½%‡ÅÞ—Ï8ØqRâùëýÞõûfÿøÆ %ªáˆ''17:"ÊBÛËK9VSíZƒaWg‘2m*r þv@}y»ÿ|w~m6›ÿÿ›Z~lì|v•y»nv?Ér (m&gaUæZÅS†K7ØBçÞ:!'0þƒ'Žgß¾Ø Oïõù‘ëü â/Øo’Îÿ„ÅÜó½#õ´Æn¬ßÛ¥|¹ž¨¸˜n£’à¯õà‰¿f†C郈쒾€d|€€d¬“ƒ‰}†D©‰ÀTöú’Ù—˜pžªK¥~p¬á²´Èd½bÅßÏÂØqàâ Šëþrõûûÿù\ º=â'µ1Á:#OBÜKK9ÏS ^Zƒ|aWyg‘‰mxr Bv@¶y¼.|w&~mM›Šÿÿ›N~lÕ|vry»@v?räm&BgÅaU…Z[SK7_Bç_: ¡0ýù'Ùß-E ºZõøüëûyâžØoÎþúÅê°½#u´Åõ¬ßi¥|Ož¨W˜nK’àaõ‰¿-†C»ƒˆÉ’§€dp€€d¸“7ƒ‰Ÿ†D׉Àïû’Ùå˜pgžª¬¥~Ù¬â$´ÈݽáÅß¡ÏLØrnâ!ëÿõüÿùñ OÑâ«'‘C1K:“BÜÊK:GS ÐZƒæaWÚg‘ámÇr …v@ðy¼\|wI~me›–ÿÿ›B~l¾|vOy»v?Vrãm%ôgmaU$Z€òS£K6çBæß: 0ýo'KÞœ± %Äõøgëúåâ ØnuÎþpÅê*½"ö´Å|¬Þ÷¥{æž§õ˜mó’àõY‰¾ô†Cƒˆ¦’€dd€€dÄ“Nƒ‰Â†E‰ÀÆð>’Ú3˜p¿ž« ¥C¬â–´ÉV½aÅà&ÏÖØrüâ!­ëÿ™õí2ÿú‡ ädã<'‘Ò1Õ:BÝJK:ÀS!BZ„OaX;g’9m r ÉvA)y¼Š|wk~m|š`ÿÿ›7~l¦|v,yºãv?r m%¦gaTÃZ€ˆS1K6nBæ`:—0üå'Œ½Þ  ƒ/õ÷ÒëúRâ{ØmçÎýæÅ饽"w´Å¬Þ†¥{|ž§”˜m›’ßÄõ‰¾»†C_ƒˆƒ’x€eš€€dÏ“fƒ‰å†E4‰Àÿð‚’Ú˜qž«n¥­¬ã´ÉϽàÅà¬Ï`ØsŠâ">ì,õíÇÿû yøãÎ'’`1_:BÝÉK;9S!³Z„¹aXœg’‘m cr vAby¼¸|wŽ~m“šlÿÿ›+~l|v yºµv>är\m%Xg޽aTbZ€SÀKBæBåà:0ü['Œ/ÝyÿŠ î™õ÷=ëù¾âêØmYÎý\Åé ½!÷´ÄЬÞ¥{ž§3˜v«’ßvôщ¾†C1ƒˆ`’a€eŽ€€dÛ“}ƒŠ†Eb‰Á9ðÆ’ÚϘqož«Ï¥€¬ãy´½V½_Åá1ÏêØtâ"ÐìÀõî\ÿû² Œä_'’î1é:#BÞIK;²S"%Z…#aXýg‰m ±r QvA›y¼æ|w±~m«šxÿÿ›~lw|uæyº‡v>«rm% gŽeaTZµSNKBnBåa:0ûÑ'‹ Üèþö Yõö¨ëù+âXØlËÏ šÅ蛽!x´Ä¬Ý¢¥z©ž¦Ò˜vS’ß(ô‰¾H†Cƒˆ=’J€e‚€€dç“”ƒŠ+†E‰»Rñ ’Û˜qÆž¬0¥€€¬ã봽ϽßÅá¶ÏtØt§â#aìTõîñÿüG £äð'“|0ô«:¨BÞÈK<+S"—Z…ŒaY^g‰Ùm ÿr •vAÔy½|wÔ~mš„ÿÿ›~l`|uÃyºYvD‘rÔm$¼gŽaS ZKSÜKAõBäá:0ûG'‹ÜVþb Änõöëø—âÇØl=Ï Åè½ ø´Ã˜¬Ý1¥z?ž¦q˜uû’ÞÚôI‰¾†BÔƒˆ’2€ev€€dò“¬ƒŠN†E¾‰»ŒñN’Ûk˜rž¬‘¥€ê¬ä\´¾H½^Åâ;ÏþØu5â#òëòõï†ÿüÜ 8³å‚'” 0õ5:-BßHK<¤S#Z…öaY¿gŠ1m!Mr ÙvBy½C|w÷~kYšÿÿ›~lI|u¡yº*vDXrm$ng¶aS>Z~áSkKA|Bäb:‚0ú½'Š„ÛÅ œ /Ùõõ~ëøâ6Øk¯Ï †Åç½ y´Ã¬Ü¿¥yÕž¦˜u£’ÞŒô‰½Ö†B¦ƒ‡ø”œ€ek€€dþ“Êq†E퉻Åñ’’Û¹˜rvž¬ò¥T¬äδ¾Á½ÞÅâÀψØuÃâ$„ëò­õðÿýr ÍGæ'”˜0õ¿:²BßÇK=S#zZ†`aZ gЉm!›r vBGy½q|x~kpš›ÿÿšü~l1|u~y¹üvDrMm$ g^aRÝZ~wS'$KABãã:ý0ú3'‰öÛ4 šCõôéë÷pâ¤Øk!Ï üÅç ½ù´Â§¬ÜM¥ylž°˜uK’Þ>óÁ‰½†Bxƒ‡Õ”„€e_€€e “ÚƒŠ”†F‰»þñՒܘrΞ­S¥½¬Ù´¿:½]ÅãEÏØvQâ%ëóAõð°ÿþ bÚæ¤'•&0öI:7BàFK=–S#ìZ†ÉaPgŠám!ér `vB€y½Ÿ|x=~k‡š§ÿÿšð~l|u[y¹ÎvCår m#ÒgaR|Z~S&²K@ŠBãc:x0ù©'‰hÚ¢ u ®õôTëöÜâØj’Ï rÅæ†½z´Â.¬ÛÜ¥yž¯²˜tó’Ýðó~‰½c†BJƒ‡²”m€eS€€e“òƒŠ·†AW‰¼7ò’ÜU˜s&ž­´¥‚'¬Ù‡´¿³½ÝÅãËÏœØvßâ%¦ëóÕõñEÿþ ÷ nç6'†}0öÓ:½BàÆK>S$]Z‡3aP~g‹9m"7r ¤vB¹y½Í|x`~kŸš³ÿÿšå~l|u8y¾’vC¬r Åm#„gŒ®aRZ}¤S&@K@Bâä:ó0ù'ˆÚÚ â põó¿ëöHâ‚Øy<ÏèÅæ½ú´Áµ¬Ûj¥x˜ž¯Q˜tœ’Ý¡ó:‰½*†Bƒ‡”U€eG€€e!” ƒŠÚ†A†‰¼pò]’Ü£˜s~ž®¥‚‘¬Ùø´À+½\ÅäPÏ&Øwmâ&8ëôhõñÚÿÿ2 Œ çÇ'‡ 0÷]:BBáEK>ˆS$ÏZ‡aPßg‹m"†r èvBòy½û|tÆ~k¶š¾ÿÿšÙ~kë|uy¾cvCsr m#5gŒVaQºZ}:S%ÏK?˜Bâd:n0ø”'ˆKé N Ûƒõó*ëõµâðØx®Ï^Åå|½{´Á<¬Úø¥x/ž®ð˜tD’ÝSòö‰¼ñ†A(”>€e<€€e-”!ƒŠý†A´‰¼©ò¡’Üò˜sÖž®v¥‚û¬Új´À¤½ÛÅäÕϱØwüâ:ëôüõòoÿÿÈ ! •èX'‡™0÷è:ÇBáÅK?S%@ZˆaQAg‹èm"Ôr ,vC,y¾*|té~kΚÊÿÿšÍ~kÔ|tòy¾5vC:r =m"çg‹þaQYZ|ÑS%]K?Báå:è0ø '‡½è} º Fÿÿíõò•ëõ!â_ØxÏÓÅä÷½ü´Àìڇ¥ƒž®˜sì’Ýò²‰¼¸†A¿ƒ‹”'€e0€€e9”8ƒ‹ †A≼ãòå’Ý@˜t.ž®Ø¥x¬ÚÜ´Á½[ÅåZÏ;ØxŠâÌëõõó] ¶ )èê'ˆ(0ør:LBâDK?zS%²Z} aQ¢gŒ@m#"r pvCey¾X|u ~kåšÖÿÿšÁ~k¼|tÏy¾vCr ùm"™g‹§aPøZ‡·S$ëK>¦Báe:c0÷€'‡/çì ' ±ÿÿXõòëôŽâÎØw‘ÏIÅäq½|´ÀJ¬Ú¥‚«ž®.˜s”’Ü·òn‰¼†A‘ƒŠâ”€e$€€eE”Oƒ‡††B‰½ó)’ÝŽ˜t…ž¯9¥x~¬ÛM´Á–½ÚÅåßÏÅØyâ]ëö#õó™ó K ¼Ùì'ˆ¶0øü:ÑBâÄK?òS&$Z}‰aRgŒ˜m#pr ´vCžy¾†|u/~kýšâÿÿš¶~k¥|xhy½ÙvBÈr µm"Kg‹OaP—Z‡NS$zK>-Bàæ:Þ0öö'†¡çZ “ ÿþÃõñkëóúâ%ËØwÏ¿Åãì½ý´¿Ñ¬Ù£¥‚Bž­Í˜s<’Üiò*‰¼F†AcƒŠÀ“ø€e€€eP”gƒ‡©†B>‰½Uóm’ÝܘtÝž¯š¥xç¬Û¿´Â½ZÅædÏ OØy¦âîëö·õô.ˆ à PÚ~'‰D0ù†:VBãCK@kS&•Z}óaRdgŒðm#¾r øvC×y¹Â|uR~lšíÿÿšª~k|xEy½«vBŽr rm!ýgŠ÷aP6Z†äS$K=´Bàg:Y0öl'•JæÉÿ ‡ÿþ-õðÖëófâ%:ØvuÏ5Åãg½}´¿X¬Ù2¥Øž­l˜rä’Üñ牼 †F'ƒŠ“à€e €€e\”~ƒ‡Ì†Bl‰½Žó°’Þ*˜u5ž¯û¥yQ¬Ü1´Âˆ½ÙÅæêÏ ÙØjýâ€ë÷Jõôà u äÛ'‰Ò0ú:ÜBãÂK@äS'Z~]aRÅgHm$ r;vDy¹ñ|uu~l+šùÿÿšž~kv|x#y½}vBUr .m!¯gŠŸaOÕZ†zS#—K=;Bßç:Ô0õâ'”¼æ8l òÿý˜õðAëòÓâ$¨ØuçÏ«Åââ½þ´¾ß¬äë¥nž­ ˜rŒ’ÛÍñ£‰»Ó†EøƒŠz“É€e€€eh”–ƒ‡ï†B›‰½Çóô’Þx˜už¥ø¥y»¬Ü¢´Ã½ YÅçoÏ cØk‹âë÷ÞõõX³   wÛ 'Š`0úš:aBäBKA]SNZ~ÇaS&g m$ZrvDIyº|u˜~lC›ÿÿš’~k_|xy½NvBr êm!agŠGaYØZ†S#%K<ÃBßh:O0õX'”.妨 ]ÿýõï¬ëò?â$ØuYÏ!Åâ]½~´¾f¬äy¥ž¬ª˜r4’Ûñ_‰»š†EʃŠW“²€dõ€€et”­ƒˆ†Bɉ¾ô8’ÞÆ˜u垦Y¥z$¬Ý´Ãz½ ØÅçôÏ íØlâ¢ëørõõíI Ÿþ=Ü2'Šî0û$:æBäÁKAÖSÀZ0aS‡g÷m$¨rÃvDƒyºM|u»~lZ›ÿÿš‡~mÈ|wÝy½ vAãr ¦m!g‰ïaYwZ…§S"³KÕyº©|v~l‰›(ÿÿšo~m™|w—y¼ÄvApr m vg‰?aXµZ„ÔS!ÐK;XBÝé:¿1‚'’„ãò žÿûBõííìRâ"cØs®ÏƒÅàͽ´Éí¬ã$¥Èž«†˜q-’Ú•ð“‰Á†E@ƒ‰î“k€dÒ€€e—’rƒˆz†CS‰¾¬õ’ß±˜m…ž§|¥{a¬Þi´Äå½"VÅé„ÎýÃØmÃâVëú-õ÷¬ ^ÿøÝæ'Œ™0üÂ:uBæ@K6OSZ€maTªgŽÿm%’rv?yºØ|v#~l ›4ÿÿšc~m‚|wty¼–vA7r Úm (g’OaXTZ„jS!^K:ßBÝj::1ø'‘õãaŠ  ÿú¬õíXëÿ¾â!ÒØs ÏùÅàH½´Ét¬â²¥^ž«%˜pÕ’ÚFðP‰ÀÕ†Eƒ‰Ë“T€dÆ€€e£’Šƒˆ†C‰¾åõH’ßÿ˜mÝž§Ý¥{ˬÞÛ´Å^½"ÖÅê ÎþMØnRâèëúÀõøAž ÿŒÞw''0ýL:ûBæ¿K6ÈS†Z€×aU gWm%árÒv?Hy»|vF~l¸›?ÿÿ›™~mk|wQy¼gv@þr —mÚg‘÷aWòZ„S íK:fBÜê:µ1n'‘gâÐö tÿúõü¶ëÿ*â!@Ør’ÏnÅßý´Èû¬âA¥~ôžªÄ˜p}’Ùøð ‰À›†Dド¨“=€d»€€dm’¡ƒˆÀ†C°‰¿õ‹’àM˜n5ž¨>¥|5¬ßL´Å×½#UÅêŽÎþרnàâyëûTõøÖ4 •ß'µ0ý×: €Bç>K7ASøZAaUlg¯m&/rv?y»4|vi~lÏ›Kÿÿ›~mS|w/y¼9v@År SmŒg‘ aW‘Zƒ—S {K9íBÜk:#q1ä'Ùâ>b ßÿùõü!ëþ—â ¯ØrÏäÅß>½‚´Èƒ¬áÏ¥~Šžªc˜p%’Ùª÷ ‰Àb†Dµƒ‰…“%€d¯€€dy’¹ƒˆã†CÞ‰¿XõÏ’à›˜nŒž¨Ÿ¥|ž¬ß¾´ÆO½#ÕÅÜÒÎÿaØonâ ëûçõùkÉ *³ßš'ŽC0þa:!Bç¾K7ºSjZªaUÍgm&}r v?ºy»b|vŒ~læ›Wÿÿ›‚~m<|w y¼ v@Œr m>g‘HaW0Zƒ-S K9tBÛë:"ì1Y'Ká­Ï JÿøìõûŒëþâ ØqvÏZÅÞ¸½´È ¬á]¥~!žª˜oÎ’Ù\öȉÀ)†D‡ƒ‰b“€d£€€d„’Ѓ‰†D ‰¿‘ö’ؘnäž©¥}¬à0´ÆÈ½$TÅÝWÎÿìØoüâœëü{õú_ ¿Gà+'ŽÑ0þë:!ŠBÚ™K83SÛZ‚aV/g^m&Ër Zv?ôy»|v¯~lþ›bÿÿ›v~m$|véy»Ýv@Rr Ëm'LgðaVÏZ‚ÃS˜K8ûBÛl:"g0ÿÏ'½á; µÿøVõú÷ëýpâŒØpçÏÐÅÞ3½%'´Ç‘¬àì¥}·ž©¡˜ov’Ùö„‰¿ð†DYƒ‰@’÷€d˜€€d’烉)†D:‰¿ÊöW’ØÛ˜o<ž©a¥}r¬à¡´ÇA½$ÔÅÝÜÏvØpŠâ-ëýõú•ô TÚà¼'`0ÿu:"BÛK8¬SMZ‚~aVg¶m'r žv@-y»¿|vÒ~m›nÿÿ›j~m |vÆy»¯v@r ‡m&þg˜aVnZ‚YS&K8‚BÚí:!â0ÿE'/àŠ¨  ÁõúbëüÜâûØpYÏFÅÝ®½$¨´Ç¬àz¥}Mž©@˜o’ØÀö@‰¿·†D*ƒ‰’߀dŒ€€dœ’ÿƒ‰L†Dh‰Àö›’Ù)˜o”ž©Â¥}Û¬á´Çº½%SÅÞaÏØqâ¾ëý¢õû*ÿøŠ énáN'î0ÿÿ:"”BÛ˜K9%S¿Z‚çaVñg‘m'gr âv@fy»í|võ~m,›zÿÿ›^~lö|v£y»v?àr Cm&°g@aV ZðS´K8 BÚm:!\0þ»'Ž¡ßù ‹+õùÍëüHâjØoËÎÿ¼ÅÝ)½$(´ÆŸ¬à¥|䞨ߘnÆ’àÎõü‰¿}†Cüƒˆú’È€d€€€d§“ƒ‰n†D—‰À=öß’Ùw˜o잪#¥~E¬á…´È3½.ÅÞæÏŠØq¦â Pëþ6õû¿ÿù ~áß'|1‰:#BÜK9žS 0ZƒQaWRg‘fmYr &v@Ÿy¼|w~mD›†ÿÿ›S~lÞ|v€y»Rv?§rÿm&bgèaU¬Z†SCK7Bç’: ×0þ1'Žßh€ ö–õù8ëûµâØØo=Îÿ2Åܤ½#©´Æ&¬ß—¥|zž¨~˜nn’à€õ¸‰¿D†C΃ˆ×’°€du€€d³“-ƒ‰‘†DʼnÀvïß’ÙŘpDžª„¥~¯¬áö´È¬½®ÅßkÏØr5â áëþÊõüTÿùµ •âp'‘ 1:]BÜ—K:S ¢Zƒ»aW³g‘¾m§r jv@Øy¼I|w:~m[›‘ÿÿ›G~lÇ|v]y»$v?mrÿm&gaUKZSÑK7Bç: R0ý§'„ÞÖí aõø£ëû!âGØn¯Îþ¨Åê`½#*´Å­¬ß%¥|ž¨˜n’à2õt‰¿ †C ƒˆ´’™€di€€d¿“Eƒ‰´†Dó‰À¯ð#’Ú˜p›žªæ¥¬âh´É%½-ÅßñÏžØrÃâ!rëÿ]õüéÿúJ ¨)ã'‘˜1:âBÝK:S!Z„%aXg’mõr ®vAy¼w|w]~msš\ÿÿ›;~l°|v:yºöv?4r»m%Æg9aTêZ€³S_K6žBæ“:Í0ý'ŒöÞEY Àkõøëúâ¶Øn!ÎþÅéÛ½"ª´Å4¬Þ³¥{§ž§¼˜m¿’ßäõ0‰¾Ò†Crƒˆ‘’‚€eŸ€€dË“\ƒ‰×†E!‰Àèðg’Úa˜póž«G¥‚¬âÚ´Éž½¬ÅàvÏ(ØsQâ"ëÿñõí‹ÿúà =¼ã“'’&1':hBÝ–K;S!…Z„ŽaXug’mm Cr òvAKy¼¦|w€~mŠšgÿÿ›0~l˜|vyºÈv>ûrwm%xgŽáaT‰Z€ISîK6&Bæ:H0ü“'ŒhÝ´ÿÅ +Öõ÷yëùúâ$Øm“Îý”ÅéV½"+´Ä»¬ÞB¥{=ž§[˜vÎ’ß–ô쉾™†CCƒˆn’j€e“€€dÖ“sƒ‰ú†EO‰Á"ð«’Ú¯˜qKž«¨¥ì¬ãK´½%½,ÅàûϲØsßâ"•ì„õî ÿûu ÒPä$'’´1±:íBÞK;S!÷Z„øaXÖg‰^m ‘r 6vA„y¼Ô|w£~m¡šsÿÿ›$~l|uôyºšv>Âr3m%*gމaT(ZßS|KBžBå”:Ã0ü '‹ÚÝ"ÿ2 –@õöäëùfâ“ØmÎý Åèѽ!«´ÄB¬ÝÐ¥zÓž¦ú˜vv’ßHô¨‰¾_†CƒˆK’S€e‡€€dâ“‹ƒŠ†E~‰Á[ðî’Úý˜q£ž¬ ¥€V¬ã½´½ž½«Åá€Ï<Øtmâ#&ìõîµÿü gää¶'“C0ôs:rBÞ•K;úS"iZ…baY7g‰¶m ßr yvA½y½|wÆ~m¹šÿÿ›~li|uÒyºkvD¨rðm$ÛgŽ1aSÇZvS KB%Bå:=0û'‹LÜ‘þž «õöOëøÓâØlvÏ HÅèK½!,´ÃɬÝ_¥zjž¦™˜v’Þùôe‰¾&†B烈)’<€e{€€dî“¢ƒŠ@†E¬‰»uñ2’ÛL˜qûž¬j¥€¿¬ä/´¾½+ÅâÏÆØtûâ#¸ì¬õïJsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/apple_lossless/32000-1.m4a0000644000000000000000000014700213111512442025136 0ustar 00000000000000ftypM4A M4A mp42isomhmoovlmvhdÔfä®Ôfä®}ú@útrak\tkhdÔfä®Ôfä®ú@–mdia mdhdÔfä®Ôfä®}ú"hdlrsounLminfsmhd$dinfdref url stblXstsdHalac¬D$alac( ÿ Ñæ7} stts stscTstsz  Ò ß ô ‘ … | ä > i — Ñ § Ÿ¿ stco5„g œ,úudtaòmeta"hdlrmdirapplÄilst¼----meancom.apple.iTunesnameiTunSMPB„data 00000000 00000000 00000600 000000000000FA00 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 tfree¾ mdat ù=ÿú2øð¯üv³øàýÒ€P À p @  @ À€p $ 4 $(@`ÄDaÊ,¤©&)ŽAˆ`8J’IDšäìè¨h*V²êë[îL𨨨zYÞöÏlößnœûKdt0d¤èèÆ‹ ‡œ˜ÙÙQII¢TÞ¼‡IE¡ÚH¨¨bæj¥^s®JregC&=ªno[¾¡ÉÙÑc€Š•­÷»­n²g…EE!ég{Û=³Û}ºsí-‘ÐÀ’“££,,JrcgeE%&‰Szò%‡i"¢¡ˆC™ª•yι)É• ˜ôb©¹½nú‡'gEŽ*V·Þɞ‡¥ïlöÏmöéÏ´¶GCJNŽŒh°±(yÉ•”š%MëÈt”Z¤ŠŠ†!fªUç:ä§&Vt2cåL½ÍÞ^ÑÙÑÒ¥ Uò¦k.®µºÉž‡¥ïlöÏmöéÏ´¶GCJNŽŒh°±(yÉ•”š%MëÈt”Z¤ŠŠ†!fª÷Ìå')É• Œ|©—¹»v’)TÉR*ùS5—WZÝdÏ ŠŠCÒÎ÷¶{g¶ûtçÚ[#¡€%'GF4XX”<äÆÎÊŠJM¦õä:J-ÒEEC‡3U{ær“”äÊΆF>TËÜÝ»Iªd©H|©šË«­n²g…EE!ég{Û=³Û}ºsí-‘ÐÀ’“££,,JrcgeE%&‰Szò%‡i"¢¡ˆC™ª½ó9IÊregC#*eînݤŠU2T¤ ¾TÍeÕÖ·Y3¢¢ô³½ížÚóé·NvKSŒÙR1)::1¢ÂÄ¡ç&6vTRRX©Rk5Ö²oNMdi¡ s|ÈîµIÊŽ0z1TÜÅ—µZÝåÔpRµ—œÞ·Y3¢¢ô³½ížÙí¾›íÚZ£¡€JN’®yg·N{˳K"îZŽ@ "£‘£µ«hv’**!fª÷Ìå')É• Œ|¤dß:‰E'FvtT4 ¾*dJ²ee‰3¢¢ô³½ížÚóé·NvKSŒÙR1)::1¢ÂÄ¡ç&6vTRRX©Rk5Ö²oN˜Î4!£®o™Ö©9QÆF*››Öïrµ»ÆXà"¥k/9½n²g…EE!ég{Û=³Û}7Û´µGC ”%\òÏnœ÷–)f–(Eܵ€EG#GkVÐí$TT0BÍUï™ÊNS“+:ùHɾuŠNŒìè¨h|TÈ•dÊËg…EE!ég{Û=µçÓnœì–§²¤bRttcE…‰CÎLl쨤¤±R¤Ök­dÞ1hCG\ß2;­fªTqƒÑЦæõ»Ü­m• _s5ZÝÖ¶ÊÎÊM=,ï{g¶{o¦ûv–¨è`’“¤«žYíÓžòÅ,ÒÅ£{–£¨ähíjÚ¤ŠŠ†C™ª½ó9IÊregC#)7΢QIÑ ¯Š™¬™YbL𨨤=,ï{g¶¼úmÓ’Ôã6TŒJNŽŒh°±(yÉ•”–*TšÍu¬›Ó¦3£Mhë›æGu¬ÕJŽ0z1TÜÞ·{•­³²£‚¯™þ¤ÆZVŒ­)ÒÁ=e¶|oÆúk“P¤VÚFJN’®yb³X“R´‡gE%%kOÄ묉RPädèda=ƒO]MÐyyB¡¢¡Æ™ü’å"Q&¤äÎʆ€"¥k.µ×%93¢¢Ww¿äÉÒÓ’I •)RR2êTs;êêêT`WοŠJÔŠC£’£³¡¦„4uÌŽ;딜¨ã£N¹×=ÎDdìè±À•ñÆïw(“+;)zYÞô¶Zóé×Ç@5¶‘’“££,,Rôœ˜ÙÙQIHÍy]o‹Ã£¤¡ÚH¨¨`„9QÊ×]õ9B’³¡¦=7mo[¾¡ËÒ£‚i¢‘×7u­Þj¥JCÒßݶÏlöå×Å6G"ŒÙR2Rt”é dlhó¤Ý•”•­<_\¹qÛŸŠhŽifƒØµœÐ++<é92’£’ƒzYÛ«;*5½{Š% @ÞWé0ðl©IÑï›*š«ÛR ³R‡Ee&„ïéHõ&•d†JÊ•>oíPß÷ã¯M5Û—A¬"¡€˜FÔ› ÅdÎFކ†™ü’"Q&¥dÎʆ€"¦[U®¹¹É¥ŠŠA]Þÿ’C%jVLìd¬¥HHË¥Wšß}2²ÊŒ ù×ñIZQHtr4vt4Ð†Ž¹’£¾¹‰ÌŽ0z29¾uÏ'$2vvTp&|q§{çU”I•”=*Íê¥-óÆ´PœV–þS,m¯;ö¦¨ä„Ή@0u“jXÚ’š£”š‰`T¬‘UêÀÙë)º;J(ÎJJ¯VË=1–ürã´ó8É€ê±FKiiUÙZ‰DŠ,ýK¬™RS´èÆ'&RRýÉŒŽ9¾RnŽÎŠTªüž/®[óíÇ.&ŽifƒÜµˆœÐ++©EIC‘“¡‘„À2;ênƒÝdÎFއ>gòHc”‰Dš•“;*Š™mVºæç&”:*)w{þI •©Y3±’²• E#.•^k}ôÊË*0+Õ*U{×ZtÂs/#Mhë™*;똜Èã£#›ç\òrC'geGoøèdï|¥dÆŠÎÊM=*Íê¥-óÆ´PœV–þS,m¯;ö¦¨ä„Ή@0u“jXÚ’š£”š‰`T¬‘UêÀÙë)º;J(ÎJJ¯VË=1–ürã´ó8É€ê±FKiiUÙZ‰DŠ,ýK¬™RS´èÆ'&RRýÉŒŽ9¾RnŽÎŠTªüž/®[óíÇ.&ŽifƒÜµ‰-¦8ÏMxš›)¢YD€ÎjAÑÙÈÉçFvtT> ù5ÿú7ÿóuWëa@ 0ðP°(@@\Ð(  €` Ap  , 8 `@ƒT=DVUf\e$ΰ–䘣 DDÆ•¹®H”¨Ô l¥9•Èâ“t¼¡PÑPÐÁó?’C¤J$Ôœ™ÙÐÐT«jµ¾o¹3¢¢Ww¿äÉÒÓ’I •)RR2êUæ³¾™n¥Fz¥J£5—EÒk#.¹Ý?_´6ÎŽñnlU’”r¬÷ÿ#x¥lJÔI#’‘ÜÛ5¿ˆt8£Z,TŠžê†Yy;3Ã¥&ñ&R4v¤1’ΪíHX”R•ŸFÅ@%7‡>:\­{N†V†´õeBߎ›k·Il–… Á"sà‘PÊQ+çóxQ7@ä!S}Ê%¼¢Hhí&R½i ìbrƒ¤åe#GjDŒ• •ZjµSqÞï|“9¥Hz'_:ÚÙkÆüüqTô(‰%'IN‚‘(ÆRi2²´˜ÀJמ’…'e™YáÐÀžÊÓ“³¤H…'FC&=;ÝïJ][Yuyu-šë™{׻ɜ©J÷Ö«U:Õ'Ž®NƒDêóµÓ¢òIÑ””ƈÍo|ÏáaDé ÉR‚yéžœ¯§Úvah“*:8‹ O§*¹+*ÍHìlíkɤÎÎÊFO‡¯l\¹ëÆüüuº™˜$ŠFJNŽÈõó‰!ÎӤݞ$ͬüÙPÄ<)Jtœ‘QYgU:îŠÙÈÚE$J¡R¡ïþFñJÑ$Îʆ€«Ðv”Ý$Ô¬™ÙHÉðõ† [‰E‰IÎt%MQëçCæè¤h¢óFÅ@7LJ>:\­{N†V†´õeBߎ›k·Il–… Á"sà‘PÊQ+çóxQ7@ä!S}Ê%¼¢Hhí&R½i ìbrƒ¤åe#GjDS:‹N•’I$Ùñ#îAøT’JxÊI(vtRRV£3ÅÚUÄ<;;:?);Ëë·i2ã¡£§ûþ¸×&VT”JrCG`¥<„šHqIÒ(M-•ŒD§JÚ%7Ee à©z_ËÞ$ÆÔjVȧYÕ0Î^3ã\š‰#ˤVL¨k «µâÉF¤)R ¤ËøV2vT2TdÏB¦ã½Þç&r9JôN¾uµ²×ùøâ©èQJN’!"QŒ¤Òeei1€ •¯=% NË;2³Ã¡=•§'g!H‘ NŒ$†Lzw»Þ”º¶²êòê8&[5×2÷¯w“9)R•ï­VªuªO\œ‰Õçk§Eå“¢9))9ÒiÀ8ßo:B‚P©eÑrÏ.UÓð«N“VxT4ˆŠ×ÆÙå¿>\üSU30Çj©Àx‘Q(”ÑE,ô¨yìðñjÒªO ÊF@Š›æâ„qh¤Ý$ΊOfÖ~l¬b¥ZNHh¬³š­wE@èä©"¢HÒ¨T«=ÿÀÞ)z"Ä™ÙPÐ ûgJMÒDm&¤äÎÊFO‡¯pf’‡‹“œèJ<š¤§(¡Q%7G#EŸl E䦱(ÂX¨¬¥"´5§«* ERJP”«jÛ+e¿¼¼éšy¤ˆfÄu%b·\øßŸkj–ÇóµHžGb×løÆS”)óé¶î‘K%š”Q-¬šL¨¤`œ÷|mž[óߟiæì!ÑA…D4qY4š•¤QŒŒ”Ÿ=û<*Jo:B£Ã'ëžygxµd’C‰¡HÑYµ%”, B³¥"In% ÐÅåªäèää¦*ñ]j§^©:C󲡑 Žbr–ù—‰ës#L|ÏâÅ`Çrš¢Ã²¡Þö™¾Jµtj¦}ñ””J…,ôÏŒe®ÚñÒz%‰8+H’B ¤†ÔŒÿ)I"p`âŒË:2Ãßy»;*ÀŠª÷<œ‰G¤Ž†˜ø=uÿy™J²­!XI ާ=vÖûÞ´iµ¢¤¨éBgEc%…c™u¬c•x/=RùÎôj2¥Õ²9ÖDuL3„ÏŒsÏN\t–èP<ʲe )ì­$X¢Z$wÞù¡‰L¨s2zʲID¢D¨ès]Ê„­F¤äÎFʆˆ™ß—¶˜¼ÞjŽË‡G%%ƒa´4£?ʉDtt¦J`:2Å&ó2X:Ùžn†úÐÉ3Û|±H ®Õ`š-]æõ2zÊö‡‡G%#;šèï9MZŸÖÅCËx2P¤ ‡Ÿ Ò›ÞŒlhd ýÏ:ï¶útÊ$”EI3¢’tg¯š­ æd%3#CssŸZg—*åøŒE¢ED%Ñf¨³zÒ¯U#eCCøO–s8i ذ²“›ÆûÅšêjÇÝvIrTß:¾Š¯Ûb(TI…Ší¦úcle5Ÿ #ùÿÀ¥ÿ–yÝ;NL.z.@   P   ‚AÀ€p  (¹á牤&hX!ì‘ A I Ä34Rfй%|$`9B䤠¨T[–Ôê”;J¸çŸ\ùеKsRV>&ÛÓ,m­JÀï)ɤpeB´–Ô=¼\êÙ÷²åÒgD6IÉÎåbßË—½ÍŠÌp¨ DkñŸ]xÆZßu`ñU„Ï‹u“éçXêÖâÙ( ñ*ºÕfØ\—o:•2p4£Y”“_+"Ͼ{Rî`(8};z4X+¡Ì”%ìpÜî¼yÀ":RÎúzP³öÏ˧«P(vŽ@¹Þ}jw\»Lçft°`^´,~Úýj½¤X¥5"GžŠ§pu /¯]&’‚ÀnžXëmXÐՂĹúÕr;‚ßʇ3… ŽüE¹È›·µ€,qKÒ ê”žíàîs¥Ô¤R€¯H'­Ým·<]1ÍÁÖHA(§J­Îë•9ø…˜Ϥ<óeƒ–´õÓÁ‚’“…WrÑÎs‰ëß^ùñCb¢R/]ºeãoXv­òµ@Ê,;Èòùuõ@ê³x“9‘¨6=½jT,&~+µŠDàØ%4·^Ÿ\úÍ|•Å\Q¤h &8Ç Öô±Z:z4>mɪ’).‡öóËåäu}¼ØV,ÉÀ+›“a0ØâIj©D%yµké¿^×Ìá,´TryôöÂYtñRÏJVDfM®šÁÜîw}¼AÍfb Ái•8zeÛ"ÁYôδš„XzÓJ-M§Ÿ]{ØêT8I1"Õc—{%‹?lþtZ³64ˆÍ`ÎÞ}fw:…™R²b68ìNT+ÏëÛÊ@ï¬ÌˆÂÔØëë3ÈêV–Ü ›,VÕ×.™vçöŽén` @¨¨èò©œÎç‘Ö\üæ°l:©9žT+±b3â)ª w•i•¦ÑŸ]|µêÑÂ8H¹ŸKÍC¬‚QNÓzÞöçæÅ®Ô†T{…½/ž˜f¢gí‡Ë²)9ª¿TV9œÎrçïWËÅAÂ9#‘8Ž^T,&~–'{´‘ÔØ±ÏsÙNçuš×4à¿Ñ¤”*y]1ůFVT8Öª“Ïž}õëŽ"¥®J Ý|ï!CX­=>vÊÓ’).†Â[zÞY>KWÛΪÀ%©8 cÛRl&Ý-u#È„£/6Ǧ}ló¶NR)9Z©\_^-¼Oƒˆñ¸ð¬¦ ›]5ƒ¹Ôï.~¬sY˜ƒÐŠœI¹zP¬X+6ýä @#º€µ6zë× 0l ˆpFÅãn[tÓÏl'ÒàÜÔ R¾!á$ —×^rW4òBHDa¹¤÷žu*“éèåd‘9Á‘5 ©^þ³<žëY2k[2’Îxžl±F¥zzXô󪲂’Rs”ðÓ¡Ô-ÖtÛݤ’'CBpRéé –+% ™)ܲݖ«S¬¸õ™ÁÍçfP¦Ü 3øëÿà¥ÿ–zâË̇£ïW°€ €€ € `6€x  €`€ L ÀàtC‚0P  P€,Á¡¡⤙ÏbL 1H$ʰ uʰ¦If% "Wí—-;eâ\+×,‚R êN†Ž¯Nk7iDŠPHÞ/-1¦úvë¥ÀI)‰Ñ(`Tr 6ñ5»Ýk.<æ° ˆô§JG-:dÕbH¦jm&Ë”Öi¿¦þ]3E+J°'9•/Œ¹uúOTxGs‡6 …m<_T£cÓJ³M<‰‚[–Dµ[oåDÏâ,OeW¶“€†lÝRyóϾüì’L´®tôLy`¬Kn:i½ñ90gÉ ÁcC9…ÓަŋÚ,&uÅõªX³úöôh Ë\Áß+eÓ¯FuY¹I…r™ˆrR¢,²Kˤ…iRy•~jy=éÇʲ™ˆTY䲯ܻý%²:¼Ô ÖIc¾°Ô+O~»õ×lV‘ °h¥)ïåDÂPôÝ‚HØœKj8Z­iÏÖ êtej,gÖIB +GO+¡‚9«<Í¥ÏÖÔîm¸{­é§F6-IÁH"Ó(ÁH±ÞG2R<ˆJ2ðóë®Ö“Q( •Ýàœ¤é§L’Åa<øtv ¹±°Z«FüõëŸÊ—rëM)å˺JÉd´gÕQÐÈÒÛFp:ÓŸ¬Ö§ 7›£±Åm·L·Û¦ h´U’*Ú㜇¦ŠÀâ\zÍju8 3c@åmœ¨T*O§Å›T'DÖ€%·‰œÂÍY3¾+D•ºÙ”¥^žØL¹Á‘ƒ0O|wÇõÏ®}êͯ®J %ˆÁQŽšrȬQæhdµ7ç-îu:ËxXvvru:Ë'!ËÊE@–,F|Iœ%çËkÏ=¤s[½ÁÂ8Hº1Ï^i6# IøGj¢ÑÓÒ@¨¹ :“‘câÏ2å×~:u¡@dâM ”(’—{xË¢€i:¾™ó×®·ÑlѤè9Š\"ÏzžY¢Q,”)%Pȉ¨|<¦s\ž~zñžVªªÀ4v7Û¦M‚°mø¥e8&ñKëTÇ~Ÿ9§¢z¥¡E1Æ—Ö‘K­*V*‰Ov¶R¨aÌÍ€ZªF¼ùyrç¬qA¨ G~Ó)²Xöå¶õ‰]P‰­³ÈÖoušÕÑ1\C…„Îr§W*#ËnšvË¥õR :¥£’gñe©Ífäqn$ «K'B¤ù{I¨N’i2³“Z}4é7ªÕïn=PJ 2£Ü.TËbIbÁåÙ”œÕeÍ–g:sùUîõäŽDâ{úQ,ØJ½ÙÁ‘ÔÐgkUIëÆ½uç®Ùè¸#6YÛŸŒµÓ¤u@‡MÓP;!*Ág¢¬Ö§Ue%<©-¤%:%'ÓÓyMR“ ”r“íÚ²Éî³–žñ$RPóÄí4r¡ãx–Å .ÆKU’¾å¯–þRS4m9GBY•ñ|úü¸º|#º;”I’gNêWšÖœýàæu 9"£;7–Jæ®)_@!×Örj5“ßÚE"£Rn†”ŒØâœ{ÍêóZÒêŠFFyjŠJˆ¯·-ºe½ÑÒS‘b'@µY¼c+ Rpô¬Zyß–˜h£Pœ©‘&V¦J`Á#‚ùI­i3’¢¡‘'™J¸ÓkÏÇ´ÔÕ\Ò¾ aN`‹Æ›é¾×OU9eš rè“imnºÛ†Ë'¢z%¢2!e–¿"I¤’'ž¿‰3²¢Á%²¶œ½·ãYäžiê®F5RËI-å$¥ù|Îe#c lS@Rª¬<,)úrÓY’ƒÒt®zrÛÊ”Š¢RªæTJú­VoEÛN—Þ•ÝæŠŠK]þ$ÒkWÝ”8ž¨¨lñm¾Œóy»,"[¿]|•¤ÔiOU”Œ¥äΊËMËŽ\k¦ºg•§DYuÇI#¡¿^\gWV88±³“rã—=ùëPkš‚3B‘åm5Û}¹Wžz§²:¡=é§/Mgšy'ŠZ­‘‚(ŽeÊ™=í¦4ÞXGK¶”‚pï£4¾-§ª**,ë)ÊLµåð©F¡I±´€s,i­N«5‹iôI‹Qåsž+N^Ž’I4Â<ÔúÚâPä›ñËž{c,i(T$6YÛ¹¤š‘(ßÙÊ@œ)=È,(ãä‹ Ë ÷ù9ÿútfÿýÿ³ÿóx<éA2^Œí“à„`à,Àl°P0p0 PÀ€PáPàA  ÍhÄCÆâZF×e´_EsO4ò9iÄP’¹„¹ÒDŠÃ+5™ÚL)p{4“Ï.U9¬;H ç3¥m}vé–ztÒ¨êp’86RTZ­»›,ß+UaX:,ßI¬Z¾‰@Øu‰3¨”ïœñ^U[½íYNM$’gwY*’õÞäåHÂ:I$Š‹<æYa`¼uß®ü÷–'-‹c Ö+ø*5#ïÓNYb¶˜¢6fs|}No9MÚˆ¥)È¥SæçR¢Q1W*4™ØÈ=ÐØòúAÕag)Òr‰“SŠFu×.›zßSÓDšH¡ ŽÞ@áfõtXvtTYGFzÚùåÛË´·Stµ8IÊJ‰ÒzÂÕæ³ƒ‡eE  ß#ž©J$’MH’*§,­¦6×ÓÇ8©’y#‰ˆ( *¦õj%Äé$rv|­² e­IíS¬¡Ú@­¥IfædéH¢bøi‘H5‘Îo²±vã>¼»ò¦*æ•ñ­‰@땚œgLQÐÈ÷€žejN‡F3†åÆ}÷ëE´Nö f:(*W¬é$Çå@ÖJ&;ȃ%€[ém³ã^ºù]lSÅ+\”äåo­ŠÍd¢QïFÏ)mn5ï¿¥ÕÍmÍÙš<}¢Ì±,”Jš‰$rP#:¡±±ÌZaàæpó6T0=ÿÀ Ndá¬Ø#*$‰IgLV«çü¢gW¼ª³xyº üÊ[9HFÿ¦ÉD’(# V¯ý펺óß¾´Í,Qµ‰ ©ÀO_­ûíè·ª^èû µ°¤*k’7ŸÄn=}¼WçO z1Ç~,#;ãŠ7Ïë4hË£^©æ4¨È¢×¹bAâF—gÙ¿§’½'Õ—V:Ö%ÖÚ[.7K·uöuݰmîg[ÇAM(fÕ³ó®îÚ¹Ñé$Â|éÍ î×»«ŽÎ{3+‹v0—\Ê•d(ȾŽ®z:jíV© —Ša=›Cøßªn:²;‹FüZkΖ6 Ž&U¸$É6Œ7eÝ—UŽŸ‰Í"DùætÐÏ“? ú)ê—©‹‰X9W‰ ±9+¾íxú:Sí$z°Í…õSC¢…P¡X_Vcg¯N-ù¶ä”ÒjBHQÏ$å^¬wÙ“nŒc݆¬y°¾©ftΙ•2Èå×ÇÅÓˆÿ2vÎfZðÏh²±¥„WÅË6…“6ü\×òSÈ–±’FÓ$r2¥C ›zy­î!X´½!‡NEP“XµæX²qd䯚`só4øDXr;^n.vÍΗbV¨q¥ dŠú/šíhË«>ª‘^÷5I=†‘Ud~||ˆgMy´äÒÔšK4±:ŒvíÕ'L^D}'Ò\yac¦„SÅ9õQ«.Šø«æc¡K Z(’°QG4%¸Ý¯%š²ê™ôWÌè³>µ’Häuœ¢]¼stÕÖÝVä¼ËÖ÷=U*Äg¯Íý9Mò&DXPÛy5ŸKem/Ž]ñòn»f=‘š&®l]ÇÁ¨LsN+¹â ×qÕÇGJüå˜ÑN°dÎiá>~>nš·;nhÐå9!GÊY¢uÂvÍÏ®ýù¸¤ÌŽêD®[œd²cJ~1_·6YG—F]ñi·L·$’#PÞœ4cá¤ôêÃ%WÅjÈxE;sE“î,Òùm³mškÅ$V ƒ*ªsä̽™k×›nj…o4zܸ] ø?—ëž1ê˲cGÕšKâè"ÚÌ²í§ ô樕õWÍ/úPU“1ðÒ‡mÍ6Ê9ìç«`³ßŽy$*„΋F3óå^lù³ÇVR4fDQµJ˲îü¹´êÖÑtp›r9ŸzHúdŽ,ƒÑ4\³tÑ×GJüçÍ"A0U[&J-Ë“]g³…tn‹2Ì“6wÏ¢]»‹…œ1ð=’¡‰-’ M@µË·%ÇÙß ÜÒ!ÂqU"–*b¦-N“F}Õn»‚¦¿¢>ƒ¨¶HLÊA³Ç®ôsÉäGÈ\y &æ°d3c$[,ÑŸw'9Ó³.Œù£C„³.¡“*ˆU‰5âÇ“.:4ÚÚ7E¡¤9cZm|õ[¯%š¦5ü•ôOÑ.ðé©BŠ2kuI~µâæ„ËͶü±ãaÌÙhu޳sxXþöù£NÇLJŽ!Q<ÆT])å»UÜ,Ì8³äÂÛ)Š8¥’wǦ{—Ó—&½dÈ’Ù‹mC „Q§¥<¶fÇHº+Ꟛ>C"IJ>X¨ÙպΛ¹Ë>Œ¹.®ˆßÁñ·4\wNöòSÉ?Rݱ̡E¾Fì‡7-nÌù4äˆã0¢:gE|‘ϯ—›­›­Ù^hcÓ–e‚æw1lã«bSÂî{¹bé>œqÅi]¥½ñן—“®N•f•­èŒBC”Gr2dž‰Ÿß®ý¹7É‘• D]+sº'ÇÃl:ˆtiÑ–œ'Â2£DË-›Œïå^M9¶ê¹RíbÐr hDÚŸÊýÜÜ´lfœÚtk‡!fL*—+ÙVÁÅ£\õuž}qg®ÈLÃÇS¦— U_„¤äŸš~Š{e¡ÏÂÍ¢-œ\}\õtš\Øñc®Éj`ifV;ñß‹NM:5ê&Cˆ˜££Œí•¼‹_ŽS·†|Ùrc¶ÉhtΙÕ:LX²òïí¤å¦,$FŸa˜ädÌ‘’qŸ…×̽ÙvkÕ¦,g! Ë Ë™`m:öqrÅÞ;¤¥ (ªK$ƒç“n£žîš¹Ùç<\X顆l²éÃf~Ýq–î:¹ÕçNˆð¡ÒFÙÛMrqj«…\íÕ<\Ø[e29+ƒ*ƒt'†'$üÔôOÑ?1ÀüE¢tL|\¯å×~ÜØÉ?UûpŒôOÍ?BœGÇBíŠrÅ’.<}ºoâ·:ök‹¨J2£©qÈë3.ûqæË£>­:$8lš¢‚º[šŒ™÷sr{2èÓ“L”±Ô2…Lª˜î,XfË£N­.7Ûcˆd’y47už1êÓ›NL·ãR"d4L²Ü–nÓÏÍÖ¼ó%Eô$¡s6:c.Ô*6U®[:ß²›Áˆ¤m¯•èTœ­áŸ¿L廦ΔùÏ<,Qa4¯—-´Ÿ‹¯¡jÊL&ï>Ò±½Í•ò¯»±õírôìÓª$7ØEÄ(á4&aäë?^°åËÒŒèÏ’Êæ•±®6ÊK¿\°ôñãÝlf_Rv¶ 6em.Í1ñK¥¹´äÓ‹-µBhä„Q¾vÚî-nÃf}Ñ.M’bHÙ á"³ß†Ìýö—wh«EYçà „Ò´†â6¾>ny:Wàf˜o¸Ú•B†Pªvi»Î×p»–çž$…TƒIÞ˜nèå»!¹«èbÁŠßDµ:ÁPl·œZ:7]Ëw<¨¬,'º(MA¨¾-Öx¸ 9øÄ0\øðïüv“øæýÎ, ¨à2h€€X ƒÀø\ ‡¡bX†‡Š „ AÇÑ\EAH"˜ìc¥pÇ`³"ÌV >J¶aÇŸ“4RrSl£‘*¢<·Éº­ùü‹â+ˆ¬ô,ªÄ¨gCW“/»ù±sCˆ?L*nËVBPógÍ4½ÔøÔò¥€ æÔÛW‰n’™4Q³8•£›%¼ŒFb8‘VøÑÜÜY¹3s(Üû°†½q1&Z(…ܹm¸¼yxòñÄŸ Zf)RŽA%³#öQËw><Äæ·‘­èk)îhš–ÏTt7ÉÍ‹£'D:â †ô2”S‚y'ºÜù9'N~<¼¸øáGe¡R¤‹:ËšnwÙâ£È)ylÝFFÖszrcãäÝdþ5°ÖÅA÷6ÕÀiC\5î×oý4—/+óYŠ{„˜ |ÍÑ5w8ž?4ž…|IÏ*M¥BQ,y›Ãoo¸7§]X”_šÌRÀ¡ˆÇt–Ý\¼SõOãŸÆ0¹-Û.w\ƒÍôl²Üz&6NKù³r<èPÒ¤¸ÆÂ{+Ç‹nŽLÜR¿ »X%K"ávM{}Øøóñåã\ÌZTLjR[—w'L]ór©é[ RÛh‘L1ïNŠ›ÇmJ-q1`†Ë –¸¸³sF<¸÷/š*×P¼AnœXh ½8ùóð‰%‘'Ú¨”Ð+Á˜j×Ë'Šn9ý+c©†ƒ°.‘'ÖÌjÓyâ鋾$ÞAÏÇC5ÅPr&ÔèÓÓ¶þ(×§—´YІ`!a…²7tÝ4wÑä£ÈH/â·8ôÅ~ö¥)ës¶ažá&3uHärSÑ_…~V0È û–êŒr˜çÔ*ìÉ†Ê “›Eü•íañ³*¸ŠÛ¢®rãéǘ\–íS+®AÀæŠZ¸cÅ@lÏÃO.šq&žsWJõF*—szbòIÏ/•/®»IÁhi"ž™m¹;2ðÓÂ4ÕL·[РÀQ Kqîäë좶°ØÀ•Ä* 9$ @»Óš§ð‹®^BÏÇCñ[i7- TÑÑn\šã^\|¸pv(©–Ç4D]`»âч^]<µ2ÞJx’ÖC\’$w_Dø87ääÑÍ«š,æ•j)—L–Õ}Ú2î Ú:²sWµlÔS™7¾Xm‡U>:|´øÄ6ÚòËT&SPxæÕ…:oÆž=<ºéÈŸ :%%BLlÃf¸ù§î§Æ2:3q=gN™3éµ_!ö]ÃO.ž¤²TºØ×gF᳋§¢žá‘Í’„zFaÓ lš _^Úø¯èÅÑ ö7—*T57Z7ð‹d}ÓùZÅbÒUŠ x5J0¶g죖n›<Æ—v=Xfm¨ ”¥µÍ¢ŠÙ·'&®-Í&QK\p ÇmÓåůeDÅÑ‹«÷3±BPG,¬¹6êâÝÍJqî«EV½‡2ÑC¬á¦Þ+r§_ SâG\Ä,t„g#ÓÂŽzºpé»0ÜÍobQ‚ÄÔ¾{µkíʽšwJŸ"l))œ“.y³G„xS®¾jû”®lœX¦5(äÀSM-Ø…7 :jï³ÈÞaèšø§K†‚ÖzâÑ7 4+‹GðLrR s?!©üstÑßWy'ÙŸV;h–$›*é³YÃnn-\š¸ µ_$`«ªœ/Ë«^ë‹£'CÒ”} :¦¦iÕ—6ý\Z¸´NXÛ53‘9N3VÉ.žžjwÉä_Èݵê³,ôÔ ¢ªù%Ww ¹ñõÄ’7#ÒœÃç&D™±Õ‹{iÆÞùvÓ-tƒ<²(ct„ŽÉòäߣГãå³–­ÊèFÒf=/¦lM.LY;±mUÖÕ,ŒXŽJ¡w;täß9óõåé~аrŒD=#¯è£f4ñëÜÈ­ætUÉŒÓÕMTã·l¥ËÏŸ—㉎Y Ô tæÏϾžKz¯Ò/ óߊ»ÆÀ¦*“L”ã€iÅ·W&®,Ó6ŒÑRq ËÐùæÉV=•*þky«äZRŽŠ4.wÆlx´äÛ›“gM³e"­q”Iµ7çÍFÈ‘››'eýŒVRPêPB”’8TCL¼SöWãq7â×~zntˆ‹@×èæÅÕ‹±ëOHZN5 ¦ÑŸŽnš53‹G$zNNRA©¢ˆVhn‹›Òß3ý…îe·Ó¥‹œÔXµî«–¬ÌâÙÉt9I&bÊ)–ôëɯFÝ–þKxœÒÓp{ ¡N¼[tM{½=7u¿]Ø¢LQó*!Vd¯ŒzÎÿwXLòWµ‹„„¨G¬RØdi·’þË|uùH ¸ª–„k>Zrâ“eë_ ;µì‘-’£±E>9šöMËWMÝwhm»ZˆuÈ8Êi§Ë£o>Wù»m“âMTæ›Pö ‚–LØK®ž‹{˜Ž-På9 &ÊF²nêºîí»ÈݲEÕvfkk32jóä› ß«‹DÈs Œ‘àAD6Òb»f=Úxmãtkù”äKi‘Ahi$®í Í?U~ù\ÀŃZœ²t’n[«Ï~ûô§†ÛbÄzÌ08ªÐ¼ÍÉOE=Öø1xÁ¶µ„µ:# Ô^:±]¢AbêÉዱʉD@’E×päç|^©:ÖÀÅŧkEÆ–ÓbÓ²Ns§f]šwL–ÙåC`rÌŒ¹ªáW-œøn6ü[`ŒÔD"!и7%•ÐXõgÕ§vÙ-•¶6›<&§M9¶Ò{¹î峕¸ Šsé òäÇ»_ |6ît©÷Ç­•h9¢¾+âÝŠ|)ñ×à審1­C+šÑŠÌÙwkÝQ1tOÉ.Ö,‰BL¹jÕƒ‹‡.^œ}ùn»$gØ^W¸¥„É6+8YÎÖð×Ã\øR[†Š‚˜l-ë–=|(ë³¶î·äIÉKH1Ð5æ“%\½šøoã•.4uÊSDB8´Y».í¶ŸnÃ3ëPƒi|²f“aÛê^í{µìlÉôºåÒC[´ì›–­ ߣ~ðLrQÈ•K(¤U¢.ë9ìí»ÄxöcÙeï¥0‡zñgÕ'Z™¿Fý¡ÐaP$*Ñ6!?4œ*í»¶ï!éÝ—4'–%'€ ù8ÿówX ŒaB`.ð*€5 9À;€n¸ €„ 0 00x2,Œƒã€x,X),%&@QƒË4A˃oÝ…u¸âJr2 ”8a†I-Ôë¯wkÝ*<¨²T$5I,„õdË£NÍ»¸ .ÎU篎D™3É-VȵîßÇÅÂTUʆWT@*¢DywiŸ’ž¦+~­û#A ÇTi€K¼¹¢OO<”õWØÔâc¾ã*D䘬¹×pÛ×Ĉ{ì·eÛ.Ñ^C(DÆÝ _^úy©è§[vgÑÆTšRÅ$Éfë13n­z¶î”àòdJŠ`]XbÓ£~ˉ_U=ó59GFŠ…ËV9©â¯²þç. 6—¡8Ú0ÌüC½º¤áGZ׫Ny3âÀÊk–~B1mäÉÕuýÇM¹i¹ÔèŠY²].Úò¿ÔýÛöP—2e¸h\ôãÉFk¶gá®ÑáÏVæs')Î!µïÇ çѯvÝÜ“gE|$¶‘m0ÄøèÕ…ºók¤xvÕ×7JoÑ4›l•ê8‘!„ºï迪þƒ•§VPže©fM1_Fe«6½\Z·ê¡Ñ™­aJ!M^}³uÙÀí³fO•Æ”»[’é5QˇNî×M"2Ó„õ)æZ&–kñêÓxkݯvQ£¾Á-¤bëo«F]›woÙ€hÛ‹{‘¹ SË2¨Ÿ£³žîû¼Kõ«<¦í|épŽ»×Ânù½=“öKÕ.Ó°!Ht6:%—M¼Øº±vAi%GÉv*%ZŠCÇ6L%Û.Wú"ö'ì>‡™–äBçk™¿tÝ5wÙÆÍ»%G„ã)H¦¡õ®ü¹¨ã[ýÙÅ¢t7Á~9j0Àƒ¬Õ¯–nú8Co ÓfEŒÓ¦šèìáö]˧”a£L­4‚¡sÉN±èÓhkݧv]¼ITC²iê“%Ü1òãéÇÒŠ5ÄÃ0j¢Ö›bÙ&‡gݧ†Ò$Ähx«IŠSZ&Åf¬8ñôÅ ókyö¨A†,m–ˆÑÅ6.¬]X»\[î¦&% TÑÑ^µêÀ4mÑÉ£l˜lD,Â\X³ð‹¶Ï%^&f™®gB¤;±QN<–Mû¹µrI™£ÙÒ5S)Y°Ù—=¡¯vÝQ ueÜÑ$ÒS6å—žNú½QyŽéé…Ì‘)s2òóuɲ•=çHçÐD"‰b’¸©;ùbï‹Ñ'  ͧ:êŽ% ´tÍ^ëzxmãÛ²BÅÑ|X†øÒ½c柺ž&èÛ£ly2¡ìK ª#»—K“—V¾wH†LÜiê6’ˆEUthÛÇ7-]o~®H´œ´ Š$‰%ÂÜ1Ož¾,]; ¬qñByµ†™ö§&ž^oÃñ:,ÈrdƒƧÆK¡¦Þl]X»†Xâºòr­‹Rt>™3&.ø½{ÊGQжÀæ:.F<‘n›¦­ÎÓ³>Ìq]y•–¥™3žú$Õg>>œ}p«ªYëËFŽ(§»3zyÝ{¶òëžü–Ü Ç5@wIÇšnsãé|ž¨¼‡Õ-J™’©£ËlÖ«>Í|5ñÈ›àa‰YÒÁˆÃ>‹/Ãf^9«“g™P:Áì(Šáî4÷ž1òçá¥ánáfI¥‘’iæÍV˸ÞÍ\Y·äÚóã!®IûW;µóõOã—Î!fé›–Mˆâ\…™ô§SùÆ·èâÑÅ“)™F(£i„µG…6_Ÿ'6nˆß·vÙq}#DQ,³*‰h.‹8cçÇÓ­U‰…µFµCµ94𛦎ûo³}ºëÍUÁI1N(˜±æ“¦¯%^Ê=~Œðâ<ºaPÅ¢êöƼûµóíŸ\&‰-‰0%@Ý Ñ'<²y†>»¹nྃíIdâ ô¹“öOåÎv׋£$”ÄÇŒK-íÉé;J>|:p糂º –d•)òY³ sãçÃU‰žÜ%‘8…øqí·›T¯†™q$ºÐéSH$äk"ÕG.8úÕ†m®Jj2NŒ•,’NýrÙ±ÚwiÝLG‹k°PÄ%Ö ÄÝ•sá×®HŶÝtçbàqœUdn)-‡‡]^+<Û^XϨ»¢ Å!Ûj7Y˶rjâzCQlÃ"HºfÌ®M•vÙßg‰šeB†Û‰¬÷-GŽxo§\^d}Šä'ˆ{Ì„Ràr!n¥¹¢á7M*·Cnéßy”‘bÐùÏ^ojôqjäÍ:ÃÔ½¯rL s0É6¬8òâ'E½Wö-HäÔIÀJœôõë·~NLÜZ" /2šÎ¹E0½ ãÂü´Ž®Û P:nI XÛ=“M¼˜º´wO1ra’ÊâbP´Måɯ%ÃéÇÏ—ù¨ 2Â# 2ž Û²ÎrçãËxìã£uÄæ‘§ªº§ËŠâñáÏŸ7gž ‚ˆË4wKe¹ñoÅÍuìÏ«.'ci€e4“ÕšdæÃ†^\½9l¦ –W4­aP;Kz÷?žmÑùᧆ}Q!ÄXÒ ‰–”1Qªîsãç’6äҵИÃ"ç\ö_ž3ãÝŸ_¹±L”à3™-ÌÞ8»äóS÷KÝ/3$­lJ’ª#»5yïß‹£'CÕŽ#.,­XÇ€’)lÅ6ë9âv­ú¹¢Î‚c„G˜eY¤¥ÝówÕän‰Ò£Ä‡ ÆÒDÉ#ëmqh»qy¢ö'ä>C*JÞ¢Z)ÃFÚøõä,qsŸ¸w<Âç‹EVÈ^;¹òõçëU YVº b9¨–«lÉV{ÅÝ‹²þ%¥(˜’1®”DÜ,åÇÓž&d×>7X©ˆÑÈê+»&{EÑ‹ªþŒ•”‚b j(-¾.tÉâ›Ì1Oá?T6©p)†ÇV:+Û_&N¨už¤’aß4«QL½¦L×n³Ž&hß“~-®DRb "3g|h»&=Yøiá§!bål÷BFÇÄ;óâ³Dħ¢_ ø åùj1ÿ½ÿ–sÝSN Ž.‚`8 àX&à@Ð4ÁZ Ð…€èTÂÀ°p . B3"j‰º©„Lá…”é ŠÏµAªÅB-Hµ ¤‚‰ "¬2ºJÞJvâæÉÙ›H¼0ÐÜ5eJŽ¢ÒÛfÕw ²“G6n(&$ˆD‘É8âáÅÛÍoF-"ðóY’{‚ HçÅ—‡Š{'ñ­KõHGTA.'ä£u\õw¥<¸øcØì”c‡ÄÌáá£N­ú¹´t(¨ë²:pið¶Í™çÛ~SðËÇŸ„)nÇMDw&Y˜ø°Ñ§Fý\K?ÈÛZ†<*W x¨¼˜º³uC¡ ”ªÙ3Qºî\z É“›Æ#!r E‘¬’¶†l|4ñéãÏÁWW®¼±Ì`) %¸÷quöq©yL4¯%q ‚\å.²ÞJ·]Ã/.žvU"Å/T¾:|ìbÖ1©S"0 ³É]Wݣꛣ7D˜|A-E*Ãl:%î§Êrdâ¿:–Be= ´•Õ~<Ø _¾xkÜÚ!œÑ1£Ju›¶õòOÝOŒarbärRÑŽI2à¸ì¶cê»v=Ùxôì\és‹/š|xµââxpÆŽ»ˆ¶MÇ“ùtòéãdêuϤë•Ͼ+äÙ6¨xåòÓåZâUŠ °Z†XT)ì¯ûrrfÖ=ØjÃ%ÔÈæ˜¦\.Ŧù{8Ã[`J¢Ð§ä›V¹øóñ®ÊwÓ¼çÖÖ$…éÑeèד‹G4zPPHñkš Â)îÕ¦¾+z1i/ ¼°¥³ !TV>Wάy7êâÕÑ¢‚ˆE•ÉÌQ>¶-•u¬ü3ñåÝsñÑ€%Ã6Ù~œÛtqjæa¸÷;±¸j¤–,Éž)è½ä¿“'VŽÌÕŒ!VõªˆÐϳl}÷ Ü™9³mr3¡EÞ|S7ŽNº^œº‚×^ZîƒÐngÏ6Lz±ð¡Wò_Éo#‘#ذBçz‘Žýú94sjä`úµQš*×È{S~\Ôpj3rfêÅØõ…% •9I#š»¯Ë“~Ž)Ó—Ží–fNu¸èk,ŽÎV~=<{iÈš¹ŠBBÅE2kn(¸M×'¾9|jZR²ŠE!Ù4©‰9êí«ÅWˆ“îÃE™&•*:‹Km“%X‘·7&ÎlÓ¡ÌHÚ+Š/?v¹ù­è¿Iøa» mÇE£ ¾›NJ{+ð§Æ·¶|!A(u7Sz_êÒÙxgá krO@‹P‡z!…*Ë%ý•ùJ,œõl’™Z»3E’M“t¥;³ð×Ç"kiV<†lqKí¯²ß |å’ݬF:äI'«f\TŒûµð˹X[ž»¥{ AK&L||]ñy“®¥å0Ò´c,9S5Ë´ëíßoV.ÌÝ‘d­,:„Š:’WŸ$Û*Ä­ù¹3o‚sÑŒF4ƒl¥>̵ñ_Í‹«‘va©ø­´k¢¦Y¡z'觺XkZ4Çs _8Wžý÷å.Ìü5èljö¨RÈr]m Z°ã»|5 ®¼'¢AL»×|œ&å9øgᧆ™°¡ªrF`*Ǿ^iü+ñ ÛñmÅ–[!2ž„ÚJìÉ@÷cãÏ»NÈÑÝ"Ìö,÷K5øôkÙÅJpãÃŽîÃ]…©f\ižlN,Y:±m5ذ¦e,‰&xQ>çɾså绎ÍÌæç9·E(ß²n»l«ë9Ä|ØO­ ×£~®-\Ñè0¨‚‰I*Ÿh7D\tvÙÞÒîÓ»>ˆN/,H.–è›9ÅÙ_u~5»ˆX¨¾g,B:ó'v\ZômÝb-â¿‘­+TƒD+(–F#|ý÷[åp]ºÌÓ[k1D÷>Ù4MÆwü}˜º¡Öqð™%©€-±f£ŽÎ;9îÐM·ë·K(¤Yjïn¢§V^÷iÝ®[%;+¬J š¼»¹:_â“¥o05qJH(“ Dâ¥_ºê﫵žÓÉÍ…vG2¥’iâÉg 4~ú8¤Î‚2‡3.±.ù¶]³/¾; _5=JmHÞˆ‹3&®ÊÉ·'®M›bÊh˜²%‘ ¤R[[õUÏwjÓ³>Ìú³èmÄÜr žm˜ÜsqjâÙÄátl›Sí)€…–,ÖSž¼»Oþ9QâCTfTCˆÍ•êFéÉ·W©ÃžîYµzP5/[®üyª?~=»§It(o4ˆ)E!f­3óWÙ_‚•Å£|8Í:sL[,Žî6]š÷kÜØÕòS¬ë•É­y"àþعgð§¹k R01ƒ!ÙD­ ñêÓ»^í{¬E¼”ë†5GBeŠ;­Ë)nçç›9YŠ%‰‰-[†lúµî±óW̦´2©.)Ê+Š—wsÝ×w[õÝŽt厃K$“Åšnuµ;3îÛ»LXO.RŽ <§r7æ»v¾wo`œ6]™yæcÄÒÝ}ᚢSÑeýTb0bŠ"-’(ØS¾¾‹û˜mº8²ksV(¢I"®ndLžh¾| –¹Ôã–¨=CEµhÇ«,âð·ËOr–]„¤E9"¶)Ö1êÓ»nëO$»\úÖã¡s¦y-³&ZKw=8ùìÄ_$`lá´dÃfžöXŠz+èSi‹bгEn=šL9·êß«{‡Ñ²ÒQl„’ééæÂ^Š;Û²Ý6ä¢#Ê+±YšÛ±iÕ¿g$¹ŒÌ•a«Jس&Y'»&}VÞ‹z­æj‚ЀéŒTLf7×Õou¾·—¢0Ì&SЛI=Ì}™xkãÛªDwFtTÄÅ‚Ib®ÐÞ¾«|¹¶æÓF›Q¨IrHýÓuÙßg‰»§‹“ ðže4GSá‘ü²pŸºŸØ¬¥©Ï@Òé ³â³F]š÷TKz«æk*ÔÓQ[âÄîŠ|+ðrãŒ*‹Ê¶ H×&Š9néj÷má·th®´{Rr/F23³ŽÎ»ºÝ’FØ$0éÔ  ˜>Ü»8¸èëJwkÙ®<ˆ(E±"”¾4]“N­»7ìÞáµq³©KH”Lê'ÏN4êÓ»^ͺ2Ý–†Â›­Ó‹«c•Å›~)JF(cR{'ª:ÖvmÝ·ƒæK¦\j) £Ï6_†M5–Î{»nçgr¯°(ÌYÚ~oÛ³“‡$ÖH·{ZÔnQØ;[lÙ±ÚxqqòI™Rˆˆ(”“¡+ÔžñkÉ·eħ’Þjõ©t$QL\˯L¶ÞKû-ìk€£ÔÄæ€’*h=<×é^Íü6ꑊ”‚j'|ªÃ&[vm­5qѪ,Mœ¢:" ø ŽZ»nï~ëuIåçk [§ªÜ2iÙ¶ÓÙÏgM›‘ÈÙÊD™3É]Ù&<—ö[ÙnðòaŠêbQÀDš˜µUÇw]Û¿Vø²¡ÄQ ƒk^N Ëùªÿ¡ÿ–râ¿ÌŸ£¯W°@pP €` 4À°À$08 °¸)ƒ08&"E± ¤4 "( 4YÂ)¬N¹Jãa¬¥C•i ÛyU€iÍ¿e ´$Êh´à-G 5®×è›ŽŽ•¯†ÞócÖ¦bT“z­®ëtêß³‹dç £byjã; /n©9ÒÚxoá¶\ˆK‚DGϕً.{7Ò\9ðà¾dil§ÎyäÄÓ_É‹«e½KJ/ Pˆ«D,Õ¯ŽŽºµ3nmñè=)Hƒb+Eƒ°Ôi¸æë³¶®ÓK£.k©’ AQ6nË^ySw>wt³UXáMXt”ÐýqÑÏgkO«Œy,¶iR£¨µ¦¸µQ‘ZumÕ¿VÖ#&¥îHÈRßE¶jç/|”»O ;†|*ç¢1k§«Žÿ ügŒÔZ÷$Í3í»fºù)νšöm›*æc$ 8ÔLürtÑÛg]š ÅnÖ5€š&­ò·3ús·ÈÝÜ\%KS©Ï2…]=Öí·ŠÞÆ3‹6ü“ˆ…È8ÎJ#Âð“¥þGúŸÃlöÌŸ,v:$ Yë~©8U¡šôoÕ·&—£$‰D’+Á¹¢áG=]¶vµ:2亣‘%ΚhÉ…"ä¯²ß |°0(¶H,…K%ubÇ«^ë _E=TñûR$©(ªpÛ²žJ{-îbÑi·;2 É©Ç~ÜYÓ³O û%Eãc¨EVi'gW]7v¿4ðHz3!–GÚ»äÝW:W³NÍz´ÇtÆ>õ°¥DÈ6|TqÝÓ‡n†Ó“Lšf0È»S{v :³îÛËsãKÄÉ){–$šˆìåºüùµÖ\}¸t¯ÁX`I !râ‘ú¢ç³¶îûºË^LvÙ‰ !w w뜷tãïÂÛuSŠB±­€5%µÉšŽtÝÖ¶îÓ³.&ë’5¨è\òOƒƒ>-{7ìÛ«K…Å©¶ŒÀdê]ón«–ε¯f›äÈõ“A#6Xœ®•rÙ×w[³DËn:êŽE$K¥ú®¯=¸Ï£.­{7Å‘£!¬H…/[øQÏw‹´âÓf:CK$’·$ÚŽÜÙ÷oÙ¿t#!®!*¹U_&‹7g´5ê߳РLF(cV;§ª/¾gû$øWJ³Ó’}e!TY⦬Ytg¤wvá×W:ñBª9˜!íE×çͧFÝ›÷:%|SïSŽb˜±¾z1c”\Õö[Ý_QFÏM‘Ì€J <‹ÐþX»ßêÝ´t³Ê¬òÄò⸆Óo%ýWø[à`³ËÖ&Ynž¨i—н-Õ¯fÝR"†¹ˆ„t\%kÑ7-]7vÙ±skyõ(cÈs>™¹lÔõfÓ³~íòãC\©qºCY1gÙ-vnV½\Rf9 &È)(©}ç_;|ÑzŸ³n¦È—|ºÝQ1Jó꣖ÍLÓ«~í±åCˆ¡¢ &ιÒ^sÝׇ|R«>,÷㞥<ËEÍMزÎöqpß²C†¿#i„šÑFŒpäËÞµêÓ›kÒ˜“á$‹>Ù£I™§FÝÛøNxy·¡,ˆÂ"mNŒüÚÝV þë|èJ0nz’&×Ë 1òSÕou½†3NK«šw¹l,"Í]¹Û«^ͲgItcŸ[`r huœ5×Å_Eý†#^­y¡<ú@Ì™Kn]™fá7N¯Ùnš+„´ bI2ÂjpÍ—6›SW=]4s§¹;À¤Ù$«ûo诪ÿ ø‡ÅŽÜrÐȈSElÜ(ÑV%mÕ·vÙ±¤Âp’XôîX©¢û²gÕ·v4OÑ/47©ñ­ #]²Rï›»nïnÛ²DuK!"–2 uÝ.›öä¸5mÝ¿fXîÀŒ¥0(¸‹ªÆíwkݶÓÙÇ6ɯl…™¶Ý³]8âó7g&é‘åCl‚›ZT”ªwË·cá¦òÕËgš›jFE:áƒ$0ÐZßJ[ôÍê²_S¬V¶˜M2 г:‰qxàþŸ‘„5lÃͦŠ$dÅTtúš>Û¦ýŽ©k!q%ª`xŠgæòæ?½Ã½ãÍ$t+,ˆO~ñX8¾êEÊZV¢gr8Š!p«–¨ÙñM‹³4Y{4Cƒ>¨ŽËÚz›F¾pãÊ.Éa'L4†Åjn„OôJÏ|УþF“§ŠrX«A¢^ReÇÓ¹½‚rûQ _)Ð<âWCÀ‘üQÉÏﺃœ(æ\Aó© h¥~pz×ô¤Û~ÚP¶¨ 8S¶‰F+y<ÝÞ['EáOcfªbÀHË„ñÌtøLþÍøþšÁNаY÷O@¢HA+—Š]kÑöO‡¿DX¹³Â  „’DÔjƒ¬ó}/•ŸòR;‘¦z…¼ œ¸ðÔÝÖiãá÷ imd¼D¡‹ TÕ—¼+<…£õB2õõ%­pÌ% W4c§³fú¨ÃÙ¢¶ã™@åLˆar7ô®=~Ê·ÍŒ5õ¦[E£cˆ@j—dÚ¶[±Ë‡Â¢–»ÈÅœQ"š ¤Àò|.¿–´mŠ€g‚AGâ2R•;³2“Wõ8œÜdâI"ЄˆøYŸÄ¢Ùð„Îä‚£pT 6U#ëˆ9À™"Ñov@_øI&Nýµâ––+¢1kÑ¥3z /ÎéÏòeÿÂlšQ´ËQb´rºÐÓüÎw'"ŽZ ÉŽ/ ¸“M²YÓ./žÀíócXHÛÀPç&ÊaçtÛ½õåêÙìºæ X€2T“ ¼¥6?„@]ú¤3Ljc;Š.J&·,eÅéÉ‹ê’<½û`c^(Ôˆ2Dœé}ß(‹7èuåuªÙÊÀî`ÜÂ…Z©ß4âý2ŋ¦–{…Bdzä[4þ$Cúe +bÐfãtsÎC5kÍ£ªp¿ìŠ.Ϻì=Z KÀh‹£ØBkösJÒ´ZüxÄÝEÃå„t¼$>hèåú.ÉÓ®!Y4B…YWµ·ï5Õ}ñÃÎ}ª‰™=U hcÓ»Á?ÝŠµåêåß@ëI{†9›7yª÷\ï GÖµ”ØSß0¸ P’ªlÈé}tÏù^FÞ^R€Ç@éŠ*Qä-nËGÚùXÿDåx²WAó0³…¯èC?—£ñÏ>Ý–4ä’uÅ 4t–†cü©řzv•ÁU侤*¤ˆ€ç<6LÜËÏ‹m!¸ÓTãGNm¤™!pTUÊzîúâ+Ç„•ìæÖ„Y2KXa I±Gë–n|ûót픆m±„¨AaˆÛROñ†lƒ"qgj¢yœ›Â Ú¹W¢ ~Hkq¡£o-ÆãâÏ1ôRìϸ”üä›/ßH*[XÌ£dž€ç£Ùmþ<‡ÕôQ‡Â¦<}º©f¼XQ:¤ÙWhj×ß`ò5Gxt w:0FÑEŒ–ܱ–¿Š+HçÁÆšK™òH˜bàDZd“x¨wG£¦†9jðâmR0ò–Fˆ_ç¹¥jéâ×*hØgôa Û6èDÖ|q›áÈ2'pOèL>ú§ åÔü™>"‡Ñ¯L$ºPÈϲפŠ2 ˜ôD¿€°øãŸñX¼yÆßMÂÜ-.J¯…?CóçãQϺböÆ `‰€×ñ¦ü5ߊQ¸*;Á0Är8×@mKKÜ’{2ìÇÙ²švDXP‚=Pñéì³ün˜ï&‚|Ù N¾› ÕmÎB¨Ö¯'ŽLòÃÆ²]Z§L0†å-}g?®c<9Ç?½8…ñŸ(g g·Ê#¾å—³lDºŸDS©$y “ˆlå£ÜéÝ™—½p íJ™íàÙYmÅçdY¾*¥1Ζ—:*rí(É ŒhS/dg‹ïuå}«™&§±E“0@°{_ÈÑ6þy­s¦žÆÜqJˆqâvâ¿àÖÿ*/JÞ¸9¹‰™=‹xD2ÛàÉ´|\òuí§JYég¼4â ¥« YäŒ ¿5£oXjÛl¡ŠÔè­žó™ü‰;'vèÆgá-‚8£:!k§­ž°Õ¿Õpðùt—æÈ9ˆH' f,˜_‹ÂXŠ4êèæG˦ q<$ÇÒ ©“å6?Š£üz?¹8cc¢qG™K´1^´GùÚ^~Þ]š`2òNŒè‰‡E™{Jj~"pé#{¤â"‚‚ ÀÌShŸÇzs~Zor(“ÝVÁ§”{)ç^FOüK­Cc”y1Æ•À ÷ù9ÿúzaÿú!ÿ»ÿór=A2^Lõú’àœà<@< ` x+À0@ÐAð8Ààd †#Pð|' …°‰°…– ’&hYâ ò|ö8Ê3'V¸ÁÂŽñG6Óa1füD¤þ´H[‘‚oR° Ž›¬tJìÞó¥ú N>}rÃP¹"’ì~$‹.å–O­©ùa Ÿžá%ö®X¤a!vn?=f—ðY]™öàÍñ$ ȸ­šk>R]ì|5ü,¯q4ÑP²G`ëbíÑ»ä98ûtÞÝ–¬Ê…¡áŽ=<žƒïµò.ûæ/¹ ¡àUAÀ“Ùy8·"?ÒU¿âÒÝŽY’Dƒ’éä“O~o$"Åûå7±(1#ÊxTêIr⮿Ál_sÍÍÂ0ËÉ*ZŒ„RžËh»íŒV|±!mJ\ÂÀ ð!´¨UóW›ê@¡û\G§Â’9M!W¡sh¹³~å»?Ï26å›Ì$E#ç èŽßJ‹/á,›½öeçÙ 6d’¢NH—ÅÇsþÁWá¶R¼ªº‰¼H#ÁRáªýß!Œ½»Ç"òÏœ›¡l¾£UñšïŽmùo®ôáæª± ²¸×òZ¨ÿ ú$ŒGÉt¡*,ÈE$’¬øõkÏêz.ûæž IêL´›©>[m¿Þ³›)'f˜ogÑ"RN†@늺·û ;ÿ1«Jе# °Èz0ݱà‚ß—7O6ˆ;ø–^NmØ2HgÖ<Šëäu_-Ë‹÷&NÅÃÊFî>tÌnLn†¯[³^Hå<Œ:Š:Qê2¢«Ë~öáú©8ssq›§'ÄT޶sû©4q¿+‰tVY…™eÊH讂Éõ‹c%OÓH’}ʨ…¬Í¦ÅAÁ>L¸‹HÆ*jïå©&~l²ˆÑ® -4¨é*˜QuvEWä}°™áÆ!Ý‹&[ë"‘2àædæÅ³| 1È’;ZµRÉ(@x¯.òo›õ%Z0dìZ$(&™Â§„*'üD×jè˜n=BkïšL|øôý¢‚Í fõ++”Ò4t3[g>Μu‡k‰&ƒ$âÂmÈhè— *üÅ·øÄ-ç|F†v+ ‘´W/^=Îñ¤WÙ8{uÀEâª8¢×’­¿h£óFg‹ er…(VŽg':QOç:?Ö0vþ™ä©§DI†z­£/\ÈËêÚ]¢r|6[ç*s‹^Žþ¨ë!Ìq:9¹Rp !ªÀ9pû@V}¦_¦”m*G—ˆÊ:PÉ™œ’øØýX‡«ð·vhc6º­hò÷È­J¬ð>#úÖ‰»'(èH ÔëµÊû ½_Dø7dŠ–¼ÒÆ„£¥ls៘LJä;Ø3:C„Ä„ÌV5bËš_q…}ÐÄ­†Þ¼“aÆñÒ±c·‹ÃÔy[ñ/)K)pó…–)*=`¹þªoøž_Es ÇhÙ ± &½yüB}^ìgœ_žÁ£×mDXF»YñõêÕªa V½Ö³æ€TdŽK(²™“GË·þäÇÞ˜o²ÒôM v>Ú%fïJ~¤—§nNR‚À¤!Qµ>9{3ÊÔ4Þ˜â3ä2¹Ã”³äq•Mœ¾¨ÐÉ—Ÿ¬ÒÐ&Ò.ˆ¶[PÏõ¾oÌYWöÚob@§G„‘aÁXå‡ 7S“âüpØÛ¦X¥h‡}-.|Ü›ûÛ&¯Ñ †v«/©0‹ÀN¸A?Ý ÿDÏûåš–½¦$¸Ã™¯Èû½F’¯„ äý‘ÆMfí®Àa-ØàéÅËÑ’7~Ö“’Á3š,%hJ¹²R~(‚O¿_ªõ2âtÏxtû“вKö0ÝÞ¼JyxK*­‘‹¤mhgÕ…OüH›üä^lâ žøË:0$µvý¯»c\H`#FÐv)²½XRñQò¦ÏÄYÙþ»Å—éÒÛ0CM³«&^Ûï‹nÛº0oÏ ÈŽV–Èw|Pç7î](ZWŸÔ >€aºz©¿ÇV¾èç8i˜¬9ƒOP²Ål˜òe,_y²çûoFÒ¤«ÏX à xÙEM|µîC¯Õ¾æ|‘%¥E:jT–~! g×"@àÈ„ÃuYp‘MÎV.Ër~qN óÍÍ;¬c€ÃÎ1µ¤×SÍ¶ÏØË¼TÌ?«'‡¤4P5tjùU¦²œ¤™{‰U-÷¢O€p±×5]ñ!pˆ|‰©¼a@q¤í®–î]•rZŽ$u: F;†]…LU2SvßQá¿øã{ÕÞŒ0òÙX19? ½¹)ül!Ð0Á¶p†ÙbŽ‚¶µåÕ¦¬?@kcÚ¨þÔ‚È›8ÀmçbsYŠ:YJþ¢Èðªµ%ŽÛƒ¬M6:lÓÓ23ÿ`ûf/ˆX#È(£‰R8™µðéꊣ?¡†bèáA›D¢×†Iî­mB~‘Ã?²ÄÌëŠ~!NB%ŠÎ*þ…¢_Ò±3þz,o͘ÓGÛè¼¥£È‘gú×»òB]LX˜F’RRƒRÀ¯MnGãB,_dw¹V+O˜Ë‹œÈaM»çl_È8§üU‘ó"¶QŒûß*5sR§~9]ý7ÑpVT yq×Ñéï\²þ©3Ái}©¤#é&9®Ž}ÜÏEÍx‚·nˆŽ"˜â© r‹~*8´D|ßÌ‹·,BÚ˜H’gÉäÄßËJÇuuÍÛjlÅ I .: ²Õ £ã\L>¹Žñb\Å\-èH&’iª][ç4?YÌÁ»fÌÒ…‰ÌćéXÎ$‘¹,4Õ¨³b~8ðˆÿËŒW~*ñã}WÐ0ƒo;Šn}~´ŽþR7o`Zxù "$²z0×ìmEéò×9|ãšÚˆ¼Ï•›1õû&S)”TäæçEÅ0$ Sž;©ËŸX(ýF˜O×xУØj*atOoƒ„ÏÞì)ý4Òã88Õ˜\3¤m-~^º±þ ÂÃñ\ܨƒIˆ3•Ré…¶ýš/劇ACDÉIЙiU$1ÓU_‘¢âþUÚ‰µ‡ R¡â=H`D0‚/äĦ~U üñÆ­åÚ¼²£ ±ÎÃešüÑ&/áÝjÉ­ð¦}g 9¾L™5Ô 掌+6¼psK4õió´}1à„»˜cˆå€ÚL¨î2)×·²‰s 5UR0 Q©ÃÜAv&…_}„Ãí¡ ‚"WœYe„2»f}•êý§:·«ˆ¡¡Zgd#*.|œL¿ñ*LsGÜÇ,;ï¨BcKB) ÑÇ÷A¹>Šqw䌉e…)¥ÆH®¦$‡ÖÙ¿1+‹úå ]ø„G„麹Jpå—7Ü‘ßÐaCk⦕CÍjÅ„}Ÿ÷Æ›ø:”Lxš„,wR UKt'ÑízO †üµÀ†Èp1GLMМ¼r6¯¦ÃUù*;Á(‘§Ò UJ…¶vü³#ˆwõ(ë\Kjo¼hÓ Ó‘mD×GÊxÔ~(òY ¬‰I7Mö‰y¦•Z¶÷ß¹%¢7l½¿,‚hO,p‚±ÒxriÜ~i$żî¶‘HœH kjãùSçqŽ3Fq!„n, ¥y D†FÕFý—Uó–4ߺA ðî#±Wdã& Õµãì• t2¶d”-i¡²à¤‘!…yòý#$±Ó¤hdÎÐ4s¢È(‚EVnmŠ—ó´‡QâéäÑÉ,a®ÓÝ/Wv}dZo‚bü—B&üF‹8´$Œx¤É“ÍêE™·tajOö=ÑE=qvàL8 ÷ù9ÿèÖõý„˜ŠøðoüwøÖýÎñþà=­¾c`àL \20&áX!‚@` +ˆ€<Š(Æa4,& 46D.\)ZQcDMÆ 3T¡ecN<%0†³ÇyÍ:f%Ȫç9EÌ¢8ZÅ‹WˆÚ¿bé‡É¨1¦ŒIg5¬$TióÒ¨~;O/ïŠw IAÞžšÓ„’{7ן˜2Oú¯3Á”–ÀJŸ°›Y˦l n¸§HÄÁl3%K%‚±Í]–ö|Ub _öº>ôD`£H!ÜŒr§?V ßn…¿’'ìÌ@¬É„À”QŠM=qÉŠ¿E§ø$$Ú€Q°Ü=AmožTô†äOn5õ6ᄉöÆUBSiò?ñ…’c|·E3 AÃ)hBLšìvÝoÝ$'4Ô¹Ë »8†ÖN±Í£[jøâBàl±'-94øvÉ rRþ–_Ï-îc<ðϲ#f\Ò/•õ}d¦Û¢Ä,çÌ¢¸%±»)±YªùþÅþŠ‘„󪆜0ªQODøú½,º!‡ÿ-cr‡<è²1#Å$!‹Ïš°C›åÜ-n&”RA° ›„á?7ø¡¡kM Ð’kóM‚Ô nÝ~o²Y\d #Ø¢2PÉ9VУ.3+3Å<ñ Ð}Än¢á‹|V̽ÿ VV¡UŽsƒ# ƒKAÑŽ¹-Ç3~±èþž§šÅÛ˜4„cˆ+±UûÄHÿŠ™­üxmÉ8ØÒG5¡dµmÛÃŠåøŽ—½x‘ó!E±–Q3:©ÇNíÞÖöÇ;nzNÔ®8b¸©I +¢•Iú¡oǦ ÃÑ‹°Á"a®¯ñÞ}ߎ†¾’‹¯Œ”á}"è¾BÅù$$ß”.l!L˜’qÕpR¦ç.ǬG ù̲…$‹<â¥9—§½1EúGùMm*ø£‘ÀIi¡Ÿ/_KHöÏ Ž3ZòND ":Ǻõ¤_N5ÿ8ˉóé­ "ÙaJækDþ´Ï_Ù4H5T2Jb*âbFña×"3ý®³Çl°ª„ˆÂKÐL·ÜóËoà±y>ÊðøÐ^,ÕT¨´!BÈèZPÒ~K_äÃ…±98që M¬™H®¯h»êØÀ¸Xƒ¨QŒ)¸<¸GáõE”hË H[™jEY‘d z„èeŠt}!Î.:ˆçšñuÓc“6'ëц;?œ5ÚѱAv¥ÞFAq§‹b$Ö†äM.e“²Ì12ãž"²X—'ÖÕcùìNØ ÚTòE)ŠÃ 2g²²âÑ_Ñ U¿=W¹P}©¨¡ GJ,˜ögk!|ðJÝÒÃ.b$É N=I CCõÃ;¸bÚ¦XT"²1(ÂY¢ÏÓ¯^àçù2Þos=&¦7¦L!ó<´Rê`¹zÇ‹ ÉRŽ1“-×åËõ€Òþ©E'ŰÏ ©! ã™ \¬ZœÏÒÑÝâvõ’¯aãdVžéz<"mÂ|š ôלȴ$PÊ¡ìl†6C,%—îÈE~Z­s ZWC „”Å=š{b‰ÁV—ãÞg†ùi1ŠÐ^*#GsÁWöK‡¾ò à¶(†Y†I8Ó&N.Ïa¤›ñ`´èIEÍpµ(zH×”"‡ÐÖ­7w)0ä“À™–¿Bðí .øçLÔ˜èÙÓŽ¼¢’|•¦ SŸÉð™V¹“ÇK‰u-÷†\úâ2‘j°ˆ×ü¿T¦ùêŽfe£ºk®šq«7®—ó°|}¼àj×yxXƒ€X‘Ñ“lÍûÑ7ûÀ©›š%[T@”´+‘=‚D?[¦—óÍkœ±äËMj 6A#UKÛŸØú?hñp %ÇÙT‚Š¢øœÉÛ»gÔâ<}Ì ‚:e¨<Òž*+Ï¿à‰hûéÏ÷¢¢dŽŠeÑ嶤Uƒû3{gA̹*JNÕh¸KPˆï$tŸÜÁ‡!y4i 0xS Š®_%C†gø%íñR·hŽkg¦+.÷&FŸØéý’Wb¾•ãPL;äR¯ßÏäµ&:*)t 8˜Æ"rNŒI¨žÇ—ôYwî%2¬MÙG\ƒ¹ïÂûÇ;?™‚?kE—DòS²3*&ŠV½=;ø³Do¯%gõ4J¦Ø 9TÆ©vÇMÿ®[+q¨¹Òp$ed!!aÍH‘ì¶gý&LßàêQ53CáÊF<ºÄyƒ][ãŒÓþÜå,`ù¼eÏb!òÀ»„®ã'¯ôD ¾-†yl–´Æ ÇȪ$ã lÆ—ü>¨ñ“r´NKæ•0â–¨ ^Š©§7ÔQŸ½9¦p² QdŽˆb?jƽ¿v3ˆ‹LxŽøi/F)±ù‰%?Ú|5y·ã¶jgPMÀ©†·_, hɇÂqql’U*#ªá œ|wŒÉüZé£óXwò®Ø0""(ŠMŃoÉ¡¯Ò"Eñ2Œ &9ó rgºš‡æU?ç-Óµ6PÌ–T7çßÏæÅ9~ë§Ÿ¬&Ì–$;DRÒød®Ï®A¼ÑŸS]s&5rà Ó¬Y9‰_½…XÛȇ»E§ä_ J!Ê‹VM»ò $¯ÕPP°¯ŒzñÚ¬! ššˆ‡|Ö„ÿ¦jÝ%^†0ìó@tY>¾¡8©KµE,âæ½³cùÝ'ùÌœvÁ„âR ;å´)eOƒ­Ç‹5ÿD!üUPè$S²1‚T„8 ÷ù9ÿà;ûÌÒáÿóqWÛŒá8ZhJ-*°  Ix: €°%øƒ0 €ð4@L@d¡*Áath2†Â28ðBxaHàˆÔm·"Le@hÑçÏ(ÃCÃp´ry3uÜS°,‘vxc71+í 2m©4L^LÂèá£É\ÖÀðƒ’ò©Ë+:Ž©…”êœ,Æ4á­A˜ä³WRA>ZG£Q>Ú!¹WËÁ”slí°ô4ºP.§.cB…T³T’•ǾL€Qù¦3Í6QÛë'vC2Š‘}wdí¬Ú\ê¨u ‹ ¦âh€,­2éÿSëóBœ »`H%à‘B»%ÙÌÄ3»‚0þ-ÒÄ¥4ñK¤^ž¼xþ‘7³) ZáéLvUƒi‘ˆóÊkÏ3Ã6X8ZÒ µ]ÞKƒ@G*¨ÝØ/¨$Dª)­ ¢æ£ã]#ÿTÆz«–†…A¤¶}! ´cšWT׳åˆ' ?"“.S4ÒXlbÆÇ¹"üS‡å†ËÜö'3&]#–\hn¥«fž—P§›ÇÄ$«ŽjÃDXø¶ôÌ©˜jãpôÚgkdëkŽáQL@®²3HY¡èðÍ6r \×ÅG˜çì­4Í’1è0ÉaPލˆ·“w>jˆútcgQ7h´ù®;Ào²øD!_ÙY^š£­7vNÁ/EæùQŸØÓir²åCAVsâË€qõùŸm@¶¥D+K„`&à*#ÃDa)âï·R ªtª©ÖP…èf˜ËB cÍLѧíÞì Ô±±Å:žµÓ¡,rµ’?8G/뎷8ÉfêñÑbÅÂgÒ$órÝÉ”›¢ÿ ƒ…-Š1™–Å@Úl7£(µ¥ÃÚâ[kœ„ÔêeHä¦Òk¸ÜMG•?“Äùøé[ˆÌ:8` ´©EÓÍÚ£YuFä$„M~8š²àŒýPÑ€hÌh?î¹€-jR’ŸŸ±i0äÇ\§Oó9é… ùv›S_I—ã¥!y+¨Hî˘J;Q™æ¦id&ðqÏÊ”:òõäZI@º“O‡³¬N:B‰\S\#H'Òù=S¨Ù¬AyȱN "†‡" °ùŒ.·î4V#ZºHaÇU#BÁެ»(²/NÄínˆlhïXÃÊY²£ÝïŠ[ÛwdïÁ¸y‰ªg"£é"^úxq8¥Döˆ¼˜ÍūР©L9±…iúðäîâ-Φôyh½“=tb¥IG}ˆÏð$¨üšNó×<ìÊÈ Æ<0‰6Kè “ÂL>!0 ÌÂ;™In¼µgd’ÌtYbD¨›‹´¯.âüÕMRnkK>‡9¨ØZKÍš^¾S*p²ä@c-áÙBDa6çIœ9<öÇ箌@S_-¢#¨b»Žº›l&—"ÛeŠ^–`b/%S 9ÙRo¥ÿˆÇNàÛy}M6Œ¼qy3ˆjzr£¥à)æðcÉ5G=ÂA¥Ç×fXÑ ìÒ(¼«Bä Ì•©Hb—^jíüñÂêž&ÓçV²tu—uåäaÉ?ÒëIññßäÄVm{cš¡ÏF«b=ºÖG3/Ž 3œŒíO€¸8büÓO—ižª§©GN(CN@Ó ¾èK£º_Ì}S»–ÊÕ›¬ q4yÔg ä”ß=3áësŒöT7ëômLŸ Îô²8=öàN¹#£ðÑ~÷Åý‚¶geÅt¤(¥^!Ó ˜%=SoáLB·uã@Ôj×ÀÊÄ:a Ã7%£#Õ¬Q¹‡Ì™/V…ÂR¯ÊÀáúê½ÒQ)Ùüpå8•„^,ù$ƾ§òaŸ7ÍjÔs]bB}†À¸¹ØKf*Ý ? dO¾#ŽœthLÒ~FÜñ`¦š²ô.2ï1ð:VøèÉâކd‚±ì‚ÂB6xç%ز®/ÄÊ=°§ÑÏš-úÆ<ØîÔÝÂÝ¡˜ø§’F®à¸gE}û U@¤,}}©£ÃP¼œ˜gä`4Í€‡JYò©ÂÜ•ýRËŸ¯¸G;Ѫ]PŒLÄEŽ}ö]ù¥¸™ðö7DÂT8oXÃÎZˆëÍ醋µZä,¤¬ºè±R*`‡Î‰{ùy.b7žNIZT©!‰`−eN\‰#òË# 3KæòÇ ™s 0¥5sIö¤Š½Ö•ã硤<)±n òb(éBOåq­RŽGæà,Ì[bc”¤…f„ÛAÕšªŸù)$¿ã}OJn‹MD>YŠ˜Ãç)õ&ÁŠa­ÊÎs‰©”¬šY:¡æÌ¿ íZ–бt¹Å^± :Œ²LbeëÝ…<2ž…ƒÒKy°‰êîÿc©ò //.ø–„’ù®lÖL3FÚïCϾW!f#hòϼèF˜t….ø¶Œ 7=‡w7ƲÚ4` ¢ôƒs^I]¤hÌΚØ@˜ λ |ºM:å¦áë‰ˆŠ´êÖBAð&>.µ£ïÀ§PˆÁ”¦ûÊP•4µÚ CŽîU&x¶ŒáÆ}ë¹" ’ œ ¨†/<÷8C4~o% :qÝ‘ˆIÀÊ “ Æ·Í<•S‡pàëÒ)†KpÒN^ß–dXéS4­žð!(UÉæHaÛú?øÌ¬¯^àÆä^”G’uŒT[QkfxAoå ¯Vjs4›>’¶^Á›EÚjjœ.Æø˜K—nˆ6%ùžŸÅ<îáPßµ”)*ž‚*>’9r?)¾ŠpѸÏU”iãXHÒpÔƒyœ)õrd½Ê)Åroš6,ôÏŠ¥$ mEÙoŠkEòçÙ6#Uò儦kŒœ5Ð"~Ê3wHp^Ó.lðY#¡ •á’ÜÆg“HߨÆpp˜G*3 HNXE¨ôkù¢°J[/q3 ã<•KW¡#,«´/Æ…ËB‚}Ûĉx|xKÝ–…eÁ‡䘃<cü«9ÆáøšË±³°‹²aÊ-¤SŽX(ã‚I†Y K…¼P‰lkîŠQ!Y$™Ž™&«ç<ÿÔ$ay¹1Íʼ@lÏZPID!‡Þ"ê.oæ§>‹r3†\Å"h”ß‚ø£HÂu¶Á­BDx.a¥@Š hÓPS¿lµ;„EoPdH¦9ªùÍÓÒþš#ËÀ¯=“Ô“¢ð£ 4lÉÙ=ñõÆæjLz(ËJAj*ëŽÂÜYP·¯ ÑUy9Ø ,µ‚8¬É=cþä“®û‹ék°´…cŒjK>Rš$Å~Ûèr1 äEjE ¡–pê´(÷tÌE?É@ޱÄÍWróÚ˜2Q Z#M)³lØ{¹‚éϢܬá•HBˆ=ÖÔ…üô•âŠùœn3±²¢ÓŠ"®.PÍXŽQŸ®* nöPfJº)fa®îœ{ýF²7äÓaÝÍò.²{†L91‹rÑÏúÒ3´­1¹œ #óäTÿ–sÝ#Ol‹®v@nÀÀ`T ƒ@*à €ŒdÂ`|jA èAG (2M$o00]¡6’b4ôc ƒÆœ\$Fò‹Š_V"òtÈáì°¾†+ÃÃ]T\8£kË6~ž±ånì ÐÂéPÍ ±"€éùÛBh¾Nór@ 1ƒ–J E…2Z;½",d¼;(ÃË Ôaš*,Ȳ{ ðç+ݬ”Íε3P‚‚„tNn¬qTçc9ÞÂnv@¨bÍg¨$".Ñfjh¹#—« ^.:ü;…Ê0uœ¨Á0gä7•¨O †Ü¹Ò€“N Ë<ÝHGLØßZ‡ >.Hà£(ÄR,ã\1lXc¡ûê­å×VNþ£êiÕ – D'ãUUv/G_«ŠïŽrü\CžÛhnÉ -Zpt°ƒƒ™¤0ÚyÅØx°‰)1›2/ƒæBØÏ»Ž#¼¼øäÓˆ#Ì‘êWÈp_ÉXüHOs´‘¹„¦,xåÜÕXWzƒý\BäêÅokëpŠ(ˆ•ÏyºûÏÝâ‘ÎÒˆ¦}ЙŔ8DøŸO0Åú¸á?ÍÕJ®,2`lb éSLä®\-@÷ø‹¯¬ÚU¥ˆ˜Äª”CMùc3Ù¬b½œu{6Œ.Ü… 8ÓƒX;ým#o0NÖ0nr3 ?â€ÑMA"}5£·ÙÇw»†û˜°Ë—ƒ çe¡^œ¬!bó5£9ÄÈcf¨¡6©‡Aœ$L_jôV{9kf^=‹‹=a…Â;3úˆ÷[ X|Íõs•BÔðÀIštü²Œ©¥¾™YôµÄ³0 Žt££VfFrª£OW€®v”¤-O='ÎLdEG 5›áá•ÉÕ‚'Måõ±Pj‚BˆIÅM™eÓÓÜSÑ®¬}]¥Ô¹]XPD݆IèØ)ž¾( ÚÝ<Âdd Z-§ ƒW^&´'¹YÄXYИ‚šÍ¶ËäªÒ¼Üz*öñÓëÞ8º±€(]µŒËXïv2‡k™”vN3b>‚«‡"euÎg[wzùjhd®µ¡Î!Ó 8‡"E/&^ Ý,bó5 ÙÖ]‹ *d*$ +ñÆ:fÖ¨½¼ºfìn´Þ5Ä”|d`ä²`+~É0u²šðb#?7A“!(¨g¯!èÁµ9¿ ò öñÆOzñ·[@A4Ó£‚ÊñwôŸ‡ÊÖ/Wa°cÛ„€àÖ?)õùôW¯—U~ÞI¹™'“á HŽHy6¶ëˆGX h‹mâ!“$QÃWZ‘IñåâÍO³Žßo¤s«00E˜Zµ¢³os2 æk>÷3ZBš5̔Ѥ¨iyˆ¤ÞÕˆjõqÝð³Lw‹“y,Œpâ1iŠlËc±TÕ;X­ÈÈCfyæ2n1ƒâ§Ñ¬Ÿ‘iu·Rgæ%(1'µæŽáK>Ž¿:;|p·q† ù!*Qé°øLû.ÏÀ{yõOÒÝ "0Ð$yö'–ö΃ñy›„ìï# ó›0² A<ÄP_[~þHQ9;%gn ì˜…)HŽ2™õa)οÅÎÜa‰, œZ$J ï½±øøs[ìå©•—DÛ³ŒŒ€p]–¯wŨ·mZ»‰™Ùëô4¥/I=­|AyP£ó·$9»„¦L‘Ë8sUóu#KS„…MŽQ<=W—Ƽ°æ"R, v,1Ðæ[cɺŒý¾qt 1W ,…×–© ñíO7‹¶^«ÌîeÃ.Ž(Ä”TwN“‰rÄ7¶îƃµ©Q޶rœ«£• ¡M8–^*ºÏÉ–Ïo^Š<\3õ)*„¢óÞÍ`¸5ô—ÈÞ_–œ›ÒE$T0uø"OV#’¸ûnDáð†È¸Qqd ä iK~:ôí]Kɾ=ƒA:Xi¨«D'9Õ$oi­#¾·9u®<‰ˆ8dñæð%áß=®ÖpEÖ®UŠi†0¦ÉûÒ”¥Ãß³Ÿ,ýLÓ„Ç”5T[¹K¢µÔÎ.6±ô/¾æ‰·”«JñmQGÄÅOÈÀ¤ŒiEG„p æª<–ܳfîðÛ›Ìᓟ°zÕD#ÆTé7É~ùy¤røÏFÞÝý!ƒi° ºa¨[øÑêiÊÞ„æŽ!C³ ’ -"ˆÿÑi ŽqÎöu棹h´–¥Pf+„iÅFnîÑ­j r±K˜œj¥FÝÇèÖB—ŒÔn©YÚ-#Ft#¦¦ýÖ»˜ÅµÔÌ|ÈÁD„±”ï-X«õpßGE,,¹eÙ˜qêqí¦lT»RÝ‹ÐÖ˜§[(ÍeÂ}$SÙUÑI½ëRSîâ¯ã^(Ü͵‘š›3ÏÅSNhêaçKBc(t2j’¤.@“Ê„”®.ÈÜ^3R8{°/eŸT¬µäO> –GZxÍ‘**c,(&Ý+ÀåçÇo§¯5~>j“m( 䈅fÇ› ®VDè:Úîî+È ˆÐd¼ÌäFk%ÈÜ~Ò·7Çáç¼|µÈñAŽbjjÛŒçK8žw%Øzz‚Ò¢8Ĥ3Q/i´ÚÕbWˆWNJzWœäÄ4 ¥jr­±áã#wg¢Œœ]Aá<(æXÅJâÐ~~‰ÞS‘´µN!IÆÐ IÏbß#‘‘®¶¤Ä¹ jÑ DN,aÅ'çF)ýz‡ú˜‘ÇáC_:Ò8Ñ4ÕÆèKuîV¤†:YŽu± "„€p6¤Á—¼Ii\^3Q6·Î¯@€Ø\C–¶ÉÙÖ^_ŽcRAØ6 Yµ‹ ‡ŒIU¥ŸÙÅ)žžº–ñ`&\‚ªV0÷²ï§'‘À'kRcŒÈDFŽØjHDçÓ¸C½=s¸{«7‘–±°Ñ@Ò‡j³B õb âãÇSRqØsÃpÀ1$ûÇJJýÜu¶ºÆ3ÉÉŽm9C ÈE'$…³h“»‰ î¶´Å9Jn× FV$“/9¸ãñnI?»Š¿‘*Û#Mˆ"G˜C£­»,ùû{‹ÍärIÓã¢ÕhŒ8‰(pþX‡;±š®Ìözy³C¯È8äÞ3©qötŸƒ¨O+q¶¶s! ƒÆ,”è«|úòóã·ÑÓš¯:T "RFX‹fÇnv]ëã¥ÔÊ- :¢¶Ò&…’ñ‹`ÅûyöÇàÙ3;M£çš² ÅHç½·ˆ_#9õ:Gxz‘É,` ê“£gNŽŸWNövÐá﬷NÌ4ÂàËŠw:z´xœWcï쟴š‘4s‡>û«µZz½üUüŒSƨp³Y áÄbT²8 ÷ù9ÿÌhOú¸ò£ÿ–râ¿Ìg¤ŸV»}î·ÎÒ0H `(^àtàp € €¨$ T‹˜6 ø0&` Yv Áaࣃ!ÂKã$B‹Š\ TeÌhbàÜ §T,ØÖfNÔ-4´9'ÃÓZ§áœùÂB!I‡<÷"Škr0šè4¥,›&Æ`ˆ@ ÕÞ]?”ˆÃ~,+ÉÑ+RÕeš×`QEq±‚—Ö‘:¸ÓXæ ÔŒþ™bT¶I£-!À3r'øP€ÞD{åʇo6yÅDhp…yó“/Ù4îp³ÂæiH#q"¥@ج¸)/Ө˺X äªì\ìS&JN›$Pˆ¯mYøè<.ÞÂðlñG´ÒV#M$ød7Bûg#Ïb·8M7A#—&ÂZJ§ÞtþZa±ÄÐ?>6]Ìl#ã¢Ñ$?Uvw•t\ØiðôÖ—!ù/ZÏPEÙ–ÉÝI¤ršZ†³!UL¡Êœc飼xü±$ ±¾?3òéà0`+¶ yDgÓ d•oiLŒ@ÏŽ´Æ–<5cÆ„öx½[Ÿ•qEhÈh3yu’“¦ã[`’Îânkï&ì¸'#<²f*zq‰æº²¼£kX¨”}µˆL˜ ¥6ÛÈ´ÄP¸Ø”ÕàÇDg&T Ød¯B2 ìa…©R’ØX$„I°Õ*ld;óÇ>.ÞðœhñdRÊDæ¢Á%>µgáo&/<8Neb˜=ûCT™!…}·'Žé qª¥Ö:;72ƒ"u”Ê IM"¼J¶ªj&ÊÂÅWg©8$$ (óÞá[K´,Ò÷x¬¡;” `e7ÈÒ8 Œf¶ŠQ6¸b2͹õŒ0Ñ|€£ñÉ‹Æ&8,ébâŠSÓ‘¦/×!BOaóŸÜÏ RÅE$íà j*Q.7Æ~8át‰žNÿ\MŒýðÇ0–ÔEü˜R‡óV+‚$E°´å‹FÁE|3È$}–æü!ÑK­}n£ VîŠ \¡ÈvÏOùY/¶•ÁùºòE¸tUGŠ2«9 *3"Åv¸ ×ᇆ¢ÂÌtr”à¥ãñ7 Šuc39ÀG—ª´™R"©† †JPIøæª§2úÝ–­ŸÃ\Åìš!ªÒlêº<ÙÆ/ÑÏR›ñ¤Ëdž0ìÅ\‚XËšrÛ3Úå(¤mZo\škê `¤4X ö›kÿ……zj§W"ÒÉɌ᫠Ôn_PÛiw0#¹r)òZM‘EOýOŸ×CXYóÁ'*O§$’€Æ¼lêæ©È²ZÜŒ†81ZtÔÅX8Oº¼WÄâ‹) LÙ#ä^K­ÕJA H ÆG+•­lì—tºXÀXm°hËê*ÿ3e÷J¬F§@}[£Á.CM†ü7ÝŒ­:jÌØŒT*¦€T¡@y6}k…ö“(-N1º”©1]ÀÌveãõT{>¨œâ£«‹¥H,Ñ‚$·bÏ#pGIãÜš>ÆùJ—XqC1•›8©|²XÝ*wv›koyeÇ”}`—^„É<µ`?Ÿyzj×Ȭt6I€pÐqú8—pN…Sâëï Ž„¹OÝ׈ˆÑ¬¿¬«Cî^g®çͰÈ%X«„ä*öhëÏŒ6þqzµf³+B  qñ‡ ZlL߯û<ðJ+‡Äy]M7šˆ|ÓIgÎ[e7äUs¨Â”4yë±RJ¡´GeúS´ tìn€aYÏj<‡c¡Yb‰†,—鶇HZâêôQƒÉò"A&¼ ›÷œ¸ÿŠôTù9-ðBvLÛÁxI.+­äžÃZ·Dç ÄÍ>xYóbÈN˜gÅm&x_ŠÂOðf‘¥B³‘ôဧØ$!ëÁ7Ñʧíñ{lq‚… e–Q °ip¯Â¿}€¶§PC2òÑ´aÅ£Ò‡O7톤‘ÆÌŒvMгèýrD °Ð_ÛïBóZ݉ĸD£<ÄXJAh™9øŠÁ³¬.:G:îcb #è*»b“ãtýùî7±¶etÓ«&€‡FF $—9ÊׯfikJ º*˜'4«9J"/â©Þ^*Vâ?.~<‡VJ5kÑÖsNÙÄ”‘¯ËE¬Ñ%b# ÷SÝ›U¸DòpÒÆMZ¹•=«„92×YK~( ë+D.v„â2í›9ƒ!Uµ`.USÕ#Rñ<6b9‘Ÿ<rC†˜ï Ñë㳊AqÎË副F‡nŠJ¿kÄÔ’û˜Ø¡Aiºé-B$Q0hÄ)1Gý/' `<“*¨ø‡Ñ5àÊn —ùžLd±3\¢ÛtäÒ)Eq2_®x©~š­uAÛ’m4b$3OFö geËË–^E¡%¶½V¥$©r%™²tb­Ô §õy豋5tc©@q“u†éeˆœ{+ËÑZËíÕ§Q"ÂViFfFei6SÓâŸ/Ž<æ’´ìsK¢Zî:ú{¤ß,­ªSšŸ«$ ¦$™D´ë‘õChnEQTçg%ÈyKT¦® fFH¶]¿Fw­ ­’ÜÄ™«I!ÀŒ”4¼š*å©8ÚAåÙÂ>Æ0á'<Ö‡*UÁ7ìˆëÃÔä Uc£ªlŠt¹Uo¬\Èý5\â-&.@åJº8å%ãBï/úBÞòà¢^u óvKW)ÐÖbø–N¿Ëˆ^Ì™®ÔÐ}ØkN-FS†Ll¡Oøç3SŒ.ÔéâäÇUe¢pÌT–ƒ™õÌî \\¾©XgCŒÍ¡’}é°æ¸Ï.2ïáœ-XÆÃ|ÁäöÝ‹¢´5rz!¥»¤ëðÖ˜œUX,(ØH”¾Å¡yk»+.˜Žj´"帨bKÉW ˆæv(šV¯$fG”ÝÑÊè‘M ÿ‘±·‰F×hYÖŒ–ÊöTBÒˆjÑÂߢ+MslÙE½ÅLmS3[WŠ,!ù¸²ËÒå UÕjǨaˆˆÓà _$Óà×Ê ”ã’°aj( zÎÃ4›>UÃüÁL¦6a³‹ŸgLB¥¾ËJlÇS¤47qr 2ŲÛpÈ…½¶ÚÊ"Q|nL”µ]y#Ǭ‚§.³¦ ·e9ü€š?7¢*[º‹ÂŽô¤gWƒnÑ ïŒR|¼U®¾ÌÛ8a!!x£ŠdzòSÏ:¹ÖMK¡˜v8‘gHªIìƒWaÖÅšûqñ2E²[òNœ£Òñè±§=ò¶u»>L)™A.2P€(XçÛEŸÂaRf)‘ŸT)9ðÜ|ú¤Š=“DT¸•Vê(b6¶& B™äÄ'_M ™ÂcmÚ\ ¨Â^‹ l±!â”ú¯±È:¸¹•røñ*AIeµEñ•‚¾¨JÔã­2T81Ü ðta!ë:¿‰#r4¡)ÂÚ]ù°ãáÃØaX¿ÍY%÷±NØ™1ÉùpÈRœl•_Ä,‘?š©òõy É:,h™„ ¼6\¦}tMJ¾¼’åÜã@ÔD%;usõ54εS·gÉv–„ÀÅ–š”ÛÇšO¾!}3°ØÎê޶›ŠJn(M DAšÍqb¹Q×sw@|ûuWwYÑR 1Æ–½8T²‘|-­•$jr†žêôÚ ! †ôd–[”â«r¬©Ø:k·´$FhÈÁ¬Êî.î1 ƒ‹BI{\ ø'F‚Nl0Ò˜ƒáÕJë5«d.SÓ½­(‹WKeÄ©(mY>ØË+Ÿfô‰UÏŽšGc-20ÒüÐÐém.ÆA'`Â5'/-•‡ ºqz2ü´×‹•ŠQ³ïR#ÅL‚GÅç-Éeêì#_†-Æu<†ÅXÅ·ý¯Ã&¢iT2ZèÕbaƒJªlÍÛ’JœÌE9Í%[»&E haÜÎñù8%›±Æʪۛ@àÉã›æ58ÕÜå(䬼CA pâûÉ‹wm ›BÂ#kl]éQ¢ËÍ’0©Ç$`ÚËUè¼+)u‡¢^ß¶3ôUä*Hîµ*F€l‡Ë¤Qý<“r…‰6]㆘«°uÙÓôÈŠ.¾âpõw‡°²W¢G<Ú$«-ŸÅmÅyx«[]yøWaôåˆjLJ¯~‘Œ¿t@·ôÓ«&#øCŠQš%˜WgOòÂŽËrr0Ð$ ñI†K9n­¯W8XrZÆ=WHNZ§*c¤è}ž˜!)’QøW Š©qBF)óÏÃ>ar¢•ÈqÉ8FŠžc¤œ*«<;æ›ô-(¾½¢áê©dh§H85FbbKôÇ„зx®µ£¨»1Ö˜|3ÕŽ›z‡H#k †÷6ľڴèà RŸyÒ…3Ï.¾J »°»šûÆØXçѾ¸í¸âޝÅI'x2ÆÖ­Qhû°Ëb±Œ\WÈ?‹oÝýápÔ9·ó ,¸8˜ý†¤ä¤&äŠhtŒŽ DxÍËv¤v…ÝÔeíÞm!>8˜*OÉ ü+;°zíisŽ/ àÐß^šRQOXI#?|Ubî튒 ÂÔdU}GG ùýD®GâÑqÝΖYà ÷ù9ÿ¼nOú¸‡ÿ¹ÿór=)Á2^Lõú’àœ`(€ H @5‚ÀÁ `ô@@øx‚@x('Åb€Èt fŠ®+ƒ"˜’&’U0ñÁ %…TªIQn`¨îàȪVKmâ# N"iü´VG—a~Š*×Ò´ÒtäC¢äÂXç°Sƒ<æÕå§/ŽlƸì—xP>èüÔÂÜ~ØÙõE°M–ñ£ wðúŠ8ÿ£Ix{ûÈÆ“&S·C¤4Iøþ–BÖQE¦fX"+,ÓR@‡Fˆ“c±«Ù;;Aåß²»;ŒŒ³Ô,gZˆLßÂ"<ЫÊ »¨Ý›)€•åÒaËTÂ[™<·¢Ê½ˆx”&¦!)JX×éï#`VÂÜá±2“ÑõâŽso@‡mYD}ÖJÛYhÙüTÞÉ¢ª3X”‹²âhì ¹=XÌ;Á¶v2&ÇcÁM„HüõËö ÿVòñrøãʆ¥ç†;Á; K›÷®¢ü69ÉÀ ÊŠò`S7õ÷Ο7tË«u7ø9;e˜9Ñ$vþEÙå†úÙ‚‘ØÓ†Äeå(„#õ–;….qRU±©0Ê—K>¦4YZÖ q‡àË}íu ":XÜŒ9$~6…[uîSŽHÇÆÄ’Ã)YUÉl>,ƒ¦kq…Ú¡2,<øá¡1g )RäêÅS D6qóÅ!ꪞɾán«÷ÄxìR5¥Rj®¼±cÔQTy”†“‹N Ô"¯‹ÓMFß–äãç«¡B‡ “ø®‹Ã5™º\¥Æ¨Á ,ØYúvïS:øÑ’ådŠd¢W4²„ѬÕò¦žðo©‰D¼ëƒKuºêJèÂ1\v5ä›_`<»·ÙgaÑ–z…Œë‘#m è|›'ËÉOŽêwgÎh‹”š‡$Ø5&‹4µ¥*™¥„då‡7?MKX·¦FB&½NФQ¦¦Zi—äi.°tKÕæ³<õÍH) Ë0Ó‹ïY°ÿE¢7$Pj޼ÁpA•'xnɲ$êï7'?Ž<§–¤¬ñGx'c¢x~ŠŠ7ÅÅ+z„ǨéÅb"sÄ5E! Sa™Êž|6æÇ‘ …:4 ’ŸÒÇ7ª<æ+í¨õ QFQÒJqKCñß>.Þ°ù5ï²ÞÓå#D± ø_Š _J­±•Ô1]íXŒÌñ†¹„1j8‹nÕnÖílL"uóÐ-(Æ,Þ&bi-!‹ñvV‚„È¥LAjRñÃ[Œ4 äõMCÓ_pÈBºx¤Ãàsä~KQUãç©&4ȯe¼I °è…¥Én­‡$‘ÂÐŒ· I¹àœíqKŠd§…ŸÉ!Åù7Âeš8˜¨ ¢J˜ÛЊ ŸŠ{åE6æqùõé¶Þ³åÄ% šê•—z2¼4Y“‘ŠQsïr"Ç,CK·wnK”SÍÖ3vL˜U3‡:sÔEh""¿,"y)`k+”2<ï9*ò!(UAJ=ù;´f ¿ Nzí¿¬èè€Ì²k·!­¬ø­ði±&S³Þ¸@ɈãäǶX«q-±ÌiªXwÉv– †h°ìÔÝí¡$þž+˜M·^¾*©9'Ä-©ÔSe¢¸‡-CWŠûYºÏ£ j̛ǖ )GBÒÏzDg*ëÍ.^ c |™ Xnj˜²º|ÓRáj>ìXsy´ !Ør—?q²xè§/câù0ðC,¡©Óߥ \R8ÖËS¥”V³"]< !…_¡~T.9Õ–Î埛J‰4¨I …%AV®]6Xåc+†ÒÖ0Ho˜˜M¹E$ÁødÌBþºÒãF£á‚D%(–üO'?Ýt}µQÃ}kSY BHpEÛEߠʈes›âÈ^œ±Ô¤R'&´ç c‘n@PÝÉ秪d¤4¡Òm¸…Œ)àýˆg—¦´øÐ§É×5‘†¿‹uœ K ‘™1Nf“ó z£µI.(ͼA¢þ¨PËëÒr$ˆõòäÀê5Ì=å!Ö™¬!Êžm<þXÙ³é¾Þƒ£äf ùäÞeãùæÎ;3ÓÀ!H“bâÚu(üqI¯œ.Z.ÊÔ i/œÉdTR'ôθæ‡1)˜— yôh¥fÈ ÊÊcfjÜD–›ËVÊj„‘,WbÖ½”,`³7R¥‘hœ¡aOrä3‡_–8œ!#«{( ìgQ§ ògê/ ©þŠÉÐã ©j“ n°šÒŒqgXŽÚ³\â äˆY£5ZsH8•↛B,/Ç´–"«Õļ³òç,šJ¼Ú[ëšÆÉM½˜(pçLÄ$Cä®àà»FÑ_ùŸ'vãçb©"í¤€xsÇsçãí¸#@ü·Ek¤Üè¬V‘MT•B‰ªn‚ààó76ÜS} *Ÿm¨…%f‡F.ì4àßÐ>„8³*cŒT§)jÀüÍ >/ôòö8…_U<‰³˜ Pâ¾Q™³ÜEN%v9Ê5K&ê¯T¢¸Â±"ãM¥u*4¯5 2£E—Ÿ4¨è`ZRËWûç…Ð çsz¨ËÁeX" Ly5Óù[`¾lãûg—}Zcͤ©>òã ‹º\Ô¡›‡ÕM^ê0sâÅ4% «5WIõ¶OªËÚä<Îtç’¬Ñ a†N+ä-ã?l´äëðqd¯T¢‰úÅ'‘’IöØRed31úLIf>p‘·y•ÃðºŒ]Ýsi×n&¤ašŠE•äGGÏHþX#µÂû(ß«Q‚ço$Ó’üòÐê%úÚ¥‹ óJ:bƒ‹u(ÙCÆÆ»Pµ8FUm/NAqJÈ;î‚0Ð×Íé£/ºd¬$¡Ru–—¼T"6«<$íKœkeÁ@œtÈ JêØj)\,‰ r3ެt™× Õ„ñ$‡æ„á;YdjV¬Ô}ø¥¹hæH>L# °BÃ}ÔÇc HðR™ˆXˆÅ]¢Äò[ú$Ó&3ôç—nÑ :¬ðÀ㣹Ÿ–1öt É£]xÚˆ‰U‘J#G…'Ö‹Ìô´}ÿFÛíG…ƒH4¯ItAXuAnÉ…ÓM %ðh˜‰ôrJ IŠ*q°ßxÇ~y!ï™5YÀ#ªe¤DÁYE—͇˜:ŸÀ ŸòŽ|ßøðoüw øÖý΀€ °X @@€@`2@Àª6’ÌÀÐñĨ- 3¤ ,›‚ Ї„n¥c‘IãfƒØÎ.3[$¸kÅ Þ+X‚Ä1L¹%vÇc¶ºZ áãdȧˆXМ|#ó©IW³ŠÆ×XÅxùjO´Ð«2KãJø°q3"=ÔÐ'™Å}̼†LU¢P,FêÆa¾.Y]ö¥pp–…¦DyB !¥JX÷³o§ x.Ö´Å9Š42Þµ$"tÁ¹9qÝêëÍg›¦¥\6QÑÕ1êŽÖÞ üMæäñ¸¯Á§¤\è DÀƒøÄðâ!{}Éœ~ 7¶Xnì$”’LñLíS^oŽü^á¸zH¥ cK@‘q‰€}Œx°ºz§rxÏ?™–‘lJh’z´µe£O…Ån_#€=^Ãn¨Š(qü±–ÃÓ“Èz&æ›Gå\a‡È)6#V¹\Ë(ÕáqÂíhX3OIÒ¡,˜NwP?j±]Ynõtå£Á†~„Áa- l\ùò’ë_SÉÈ=.v`ëfÛ]x ¤R_Qqù¶¦›Ãâ5#‹Æ# ‘ÀèÄ"“*ˆÇ™iv1”ór“Ÿ¤m‡P(Œ5ñ),ï.;}=38ûï3u³ƒ s 0·²á£/_`޶”¥ºÚT޽,XPÇ-BEÊU¡v±ã·ÑÑ;Âj&ÆË Ïdb ‘Àæ°»Ék­­I.fA˜y ”i…ŒXáz$K7³Hžžœ•yù a‘Ý@!Ð ÒBߪmݾ‰¬u4—¹ˆ§ˆ™†¦Ô +¡hÜú1;»s×äæ­&Ó„”ˆè7.j¤Ì¾l>¶’9:½$rG@’‹I?r¥ôå53‹Â‚gˆ6Eã €A"‡?X»ûv4€—"fM …-ÄgРFö‹R8ü@pøÎDÄ ri*¤€N¨dñæñRðñ S¥¡0ŒARº!9`®©šC8¼!zúrSåæÉ&lƒ,£¦‚sÞêa çSJR],Ã2ò—!3‡L‰/Â’O'Š~J~5ËȘT—Ðe å(aêÕŒ—k×»ZËâå¶-0Â4eÎs|VØ_‹šG'ˆÄmî×ê + „c,5a Ðá]&SXÞWš8„ÌŒI«ÑL$5㵺G?ÙÙžŽæi0‰¤ÌwŒÑ’½â;[åc –-0Ÿ0öH¸Ë;F•ϵdžŽÌµúyl_¸sq×8âPrµp%Ä®‡m™¼MèÏoâjº¥ˆd59þKpÙéâÕ?‡ÄK””Ks-‚R&9‡j¼GBÊ4ø\—cñ·ÍÌLfØ4òo)s"jd¹ Ÿ®W}‡õµ^>zl@K7,$¶íŸ£Ë-Ζ¢x3€eI§ ™Ç5w–~ðý=™lôôg—…8ã¤b©v+Åt£·¬_+‹ Í\ø]}u/éÉW;¢Ø09Ä® ‘{zôUä䫹h!ØlDzMiíµÈ¿I/îfôf¶q£ dÀYëÑny´ èêÍo§¢µü™dÏŒa§qõXcÛ°ùZó8ð¡íê>¦Q›H”Lˆ»†‘˽E?åúz0S´Aôá,ƒ9Jkq+±ÞÆ=ΦpBàÄ ÕuGɳN2»R G§Àsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/apple_lossless/44100-2.m4a0000644000000000000000000020157213111512442025146 0ustar 00000000000000ftypM4A M4A mp42isomŒmoovlmvhdÔfä®Ôf䮬DXˆ@trak\tkhdÔfä®Ôfä®Xˆ@ºmdia mdhdÔfä®Ôf䮬DXˆ"hdlrsounpminfsmhd$dinfdref url 4stblXstsdHalac¬D$alac( ÿ]¹=¬D sttsˆ(stsclstsz]   É Ì j J e › ¥ € G Ý Î æ Ö ! õ ô ö ï stcoPí‘£Ù úudtaòmeta"hdlrmdirapplÄilst¼----meancom.apple.iTunesnameiTunSMPB„data 00000000 00000000 00000778 0000000000015888 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Pfreeó‚mdat  ùGÿð@ ù-ÿâNø0Wþ ÿ‚÷>Ñ @ €p0 `` @@B0H`ÁA !È,‚@ƒ)àU,2s’¢³äV'H’3ÌޮƨêG3Ñ5ÿÜøÈ©•}¡$¢J$@¢ŒB!X̆Ë`B¸¼Eb»¾àæag2r‰D™Œ]*ŒK-Û¾’»Î÷ßü9‡ü‹Ã-0ÀC ÀHhRiEâÌhR…Ž5\¨Š]8žœwK7ÛÝNVªÆÕ ˜íuë®÷§¬¡ç&ED 7‚æŠvÎó”ìpUôâÝï][׌qoT8ãUʈ¥Ó‰éÁÁgt·ó}½ÔáÐj¬mR‘Ž×^ºïszÒ²œ™¨ÌŒë”ù–Ç`,ï;¡18À€£‹w½uo^[‹z¡Çr¢)tâzppYÝ,å,îž² µV6©ÈÇk¯[ï8õ”<äÍ@FibRŸ2Øìçt&'qn÷®­ëËqoT8ãNTE.œON ;¥¿›íî§€«Ucj Œvºõ¾óYCÎLÔfLë”ù–Ç`,ï;¡18À€£‹w½uo^[‹z¡Çr¤tºpzpp‹9K;§¬‚­Uª@5Óµ×­öózÒ²œ™¨ÌŒë”ù–Ç`,ï;¡18À€£‹wšêÞ¼·kz¡Çr¤tºpz+Ó@ì[ù¾òªpèj¬mR‘Ž×^·ÞýR´¬§&j3#:ÂRŸ2Øìçt&*ãŽ-Þk«zòÁoT8ãNTŽ—NN ±oæûÎÔõˆ*ÕXÚ¤#νo¼ãÖPó“5“:Ä¥>e±Ø ;ÎèLUÆ[¼×Võå‚Þ¨qÆœb)lhN ±g)gtõUª±‡I;­gyª]z•^oZVS“5¡­©O™lvÎóºqG Õs9ï·šši\Š[‘^œwK7ÛÕN$€«UÖ ÝXÇ`V½ëݸ-Ýô&ã7V¥>e±Ø-ú YÆ*㎪ær¬å8³Tà8ÄRÚÎ$Þ·;s8ÜY¬¶ãCkwZÎóMÉ×o7­/(5iÆcÕ£8fŒîgyÊv8*€‡zqnó][׌qoT8ãNTŽ—NóÐàà;r–wOYZ«T€eý,ã®{ÕU”äÍ@Fiž2'^«Š€³¼î„ÄãŽ-Þk«zòÁoT8ãN1¶4'Ø·ó}ç¥zÈ*ÕXÚ¤#AZ÷¯vÐR[I´ÞFwš)Ø-ú YÊpUôâÝæº±ÚÎS@ã8ÄRÚßW¡ÚÎég(™¦*j ÚÁ;­gy¦äë¼›Ö•”µº¸:íeë«gyÊš­TÁ8f«™Ìïuy© pb)l[äÅK9K;§c‹.¡M`S|Î:×½{Œ2Å™P8ΖjÌï4)Ø ;ÎP,Õj F Ã5\Îg{«ÍL€ã€ãK`ÒwˆTì[ù¾óµ=I­TX'uciPV½ëݸ-Ýô&ã7V¥>e±Ø-ú YÆ*㎪ærŽ-ꇊ[YÄ›Öâb¥œ¢f˜8²êÖ8õÒ[Ó«p]zÞ^Òn3­Ã4gt ;ÎSµš­T;Ó‹w»êÞ¼c‹z¡Ç®TE.׃‚Îég)gtõUª±µHMó8ë^õˆÃ,a”ŠDFÓoµ^â‘fžfqG Õs9î¯5XÂ$˜Ž1¶Ûph‹9DÎó¶ ´ÑR”NêÆÒ ­{×»p[»èMÆtgo™lvÎóºqG Õs9î¯5X²Æ"–Á¤à ­öo¼îž·Z¨T¥iU  ×½{·o™#t²ïjg3ÓÕ@YÛÍ@³Uª'«3”ìwVìqÀqˆ¥°i;Ä*v·Ù¾ó¼íJ…Z¨6°Nkjgy¬íN8.µœê$DÚgŒ“Í&à¨çt&*ÓZv²ó]Xíg}w)¼;•iR1tà"½4Å¿MÉR•"´àÃqU¦õäwšÎ<é93P™3­ú9¡ŽZ$„¡oÒg)ÁTÁ8f«™Ìïuy©pb)mga)P©fŒå 9–ÜhlÀ¦ùœu¯zñëÔ§&j·«E]wA\ë^⌠榋4Çc¾ËÍuo^1Ždåb0©'K§JÚif©Ø³”Lï=‡nÐ2þ–r—\ª×¶XÂ)‰6›ÁÎ÷Ý,õK½^¯56'……@ïN-Þï«zñW”å¤bTE.׃‚Îég(™Þv`«UeJP[­{×»p[»èŒÒÍë]INÀYÞrf«U0Nªæs;Ý^j±„648à?á8ŸøMƒþõ2h  @€@H0@€ƒ„8`₈ @§2@A†Pà0 ‚˜!ŒGò™±²±b²XX¤ ïSëŽmNîÇÿ¾zïãko*–8`a P„  €1¥L˜ß\RÅá#° ÊS¢9Im¾rc6ŒØÚ-ÎB)ÎA’b“+Ä,û¦–»šü^÷ü-ó2(yB¦1%ÖÓˆÂ(dY¬Âßµ÷™Pœ#¢¡  KVëbëõ u+sÏ‹ml©•«)É€3@¨“Xçú·:œÖ»¡²‘‚5ì&·÷,œ­Åߤ¼ àc d;(|÷k¯ÔŽý/Ê`¶’ÀÓ\k_Ëqn(wíS™À À1Ø ~¨]}ºß”Ëí¤°)MM’ÜMoîY9[Š¿H*-y@+C²Ÿ=è}þLïÚü¦+i l 8Ʊuü·â€æVÚÚH+hdaØ ~°]}ºß¤Ëíµ¸¥äRšš%„#)i,œ­Åߤ¼ Œ¡ÙO^ôûÞ`ïÚü¦em$ €Ó\k_©¶ýv©ÌÁ°4Ç`-úÀzžÿ»qC©Ìë»”ÔÐ.‘5¿¹dån(ý&TZï¬d Ê>­uú¡ßµBßx+iKÊo €Y™au³€[²ójÁ°4Ç`-üëõ#„Ç;qC©ÁS+dæ€Ð,!5¿¹dån([i8¶”ÊU¤Ý @zÄ‘¤”ÚG~Õ3˜X6421ªI» ¿ê¼ªVëŽv․lJhßxKß÷m­ÎÛ[ŠeLœØž¡Ô‰k,¥“•¸  m¤XâÚHœ¥7`dGCç¸9^»TÎa`ØÐ4ÁÄWŹç÷B‘ߥùM1´€420v߬©ïû¶ÔZœÎ»°€Ð5Z‰­ýË%+s m¤XâÚH¬dJDì¡óê`W®Õ P³X86†œN¸Ö-¬µçò@Û°q¦8ßοR8/|ñµ§L­“š@d°„Öþå’•¹È¶Ò,qm$V2%"vǯp|> õÚ æs ÆÁ¡§®è˜O?º‚c¸ )hdÇ[ïèϯîÛ[)h «Q5Ÿ{ÑBSŠ¹ÛœŽ»ÌŒ‰H±ëÝ¿òü êg0°lhw]× ý¨žs¡H­ÅÚ9ÁZîhd`Ð߯4‘Á̱µ¦ÅkºÁ 4 V¢k>0¿?¹–ÚEn-¤€ ÆD¤ªØ>}Zój-V¡oÚa`ØÐœžÊ”©uþ­ÖÜè @¨ šZêhd`оë;Ý‹cj-MŠÙ[)NSv3'­²–NVç duJi"r•U TC=±[j,ÁÍX³ÓZ´‚P 8#vùâ.¶’[­ºÐ5¸s¾ ±€d¾ÜÁÜúþcKe#`  Õj'3ïz(Js¡[¹Èï¼ÀXÈ”Š­•ÏÜõbÏ´·ÒÚP, dl½¬Ä´P”çB‘[Ú( k©¡‘ƒ€-úóI6¶”6+^K€ÐV¢s>__ÜŠ‰n$VâšHœ+‘-±¥¿[] íêlYíKÒò¬¦ì¤ „¨¤«®´ën² T$µÔÐÈÀ-÷YßôÅŸÛcLql­yNQ&3'¬´–JVç"£[¬Ž©Mœœ¥U`hCçÓ¶¢Ì,Õ‹=1•«H%Â7ožç­÷¾õJ%ºÐ5¸s¾ °ûÁœ>këŒil¤h 4 V¢s>墓‚é(”I÷˜'*MД•W?sÕ >1¦8¶˜ÒÚc*^“v#Øò%²†§:Š…&¶ŠZêhdaÀýy¥2¦Vã[JBµé7B NÄF³á‚úþäTj‘ßY“’œIÉ;(|úµæ”Z¼Í ])z^“”I’’X••uÖmÖ@œ‰ÂS%¨ÛIׯÜ8ÆØã<³ÓζcE#wÄÖf¤´T§9ï¬ÉÉN$„dNÊ>‘y¥²¶ØÛQáàÙPÈÈÉPÞ}¹I©Î„á­Ö­Ãq•³•O?Tâ‡YPÒH )::æ‡3íÊ–-­“©·ëy‚r”Ý Cªçîz¡gÆ4ÇÓ[LeKÒnÄ`@„¶PÔç$r¡I­²€”ºšpÕç?Øø°l*Ç º…AªÔŽgëÛ¥;Û­ï¾ZÎЬdJ@àžtÊWÆ–ÊR€µx8Æîddäö©¿â¤‰ÒAnüâI$µÔÐÉQaVìÍVž«UÅÑÙQÝB Ç§®»ò¸«ŠëRPVïntÚDå)ºƒO:eKãKem5ã=­{iŒ—ZMØŒdp@ÉUMª&Ïôç\æR»Â¡£²+*¡Û•§ªÕqêìkƒŠ¥}—[ôauý¹H4ŠEH'J™Ú°i=óª©Ìо¸Ï*<Õ ”” REwŸn˜zՍЄé$¦Ò»ÍP" w½kÒbPñ)Ò$Ò)MÐßY‡º´¶”I$NÖïnj N´BVDvÊçî{Ìȳڔ«ÌÐÐÐÑPÓs IÊY:˜º__©S1ÀwWQ{þk¥®ÆYPÙP¨5WÍÞkÞYßg'"pŠsJi)ºƒ¾+.–rƒƒ'eGnÜi¦×ªõS5—×3 !)¦Ò¦†˜à;¨¼õæØ½²ÆÙí‹ÊP¬dh¨ –Jµ“f·:*XJ|›íêèJ2WÊ·n=;Í=eÖœvážšiÛÐï—×ú’:Q$Ô)$’—P ˜à;¨½úêöÛ}±¥²Å謬 2XD~¥ÍÒèÒj¥Ü飔ªèJ õ¯(9‡‡œ§H“H¥7B7{!{«KiD’Dínöæ ”ëD%`dNÙ\ýÏy›,iW™¡¡±¡Æ˜;˜JNbÉDêbêu}~¤ N4ÇÝ]Eïù®”z«𲡲 ¨5W̼׼³¾&ÎN"Dån´ÑV¸c"P%Z]åÌ,åë)½^ žæFFËÚÔ­í$2t·”ŠE"sbSF›ƒ¼×šeN-z,Jtç$P£}åɳ[*XJÚM'¬ï~·ê—¦–Ë=-¦zcKVդ䈨¡±„–NŠHéD”P¤ŽÔÈÁÝ@ÍVê´î¡WVT* V¤ ýoût§z4š„éD·:hå)ºƒY½/-•$ÆÂLl 9<s¯ôí"vr’([›]@j¥j£³5Zw—\«¨TwP¨1éë®ü®'jâ¹ß]7¿-7¾¬z­ÆD *5`ÙàØâSX2XvTTÓMTN»r¦J[¾®‹êñúÅlÄóT6XEeTÔ3FíÃ!šË¨TÎ÷&zdÝÒÉ»ÜÚks%Lî¬i;3×]ºÎLX¼­ñDÎÊŠ’ª  ‹1Ÿ%Ķ1î§¶÷ÄâœÔ3¢‘^ׂK÷Æ/IMPJ • A¬ïroùn¶àÃ[©žÜ²Î­$SËè.‰IÚ¶(Ïž¼ñ|e7tN‘hd¨ªt‡„ÎùÖVïlwñÑÍB­Àζ› €¨pèhuëÍ —=oGœ˜*@`up‚¯üE¼­ÝDcª®šÍ)¤¦èJOU‡hå‚S•üÐ<ÌNUÜ1¡2vý^|ί*5CHŒï¬ÚWxT4v"4[Éò óy¹¼kzVJ@ÑPÓZ¯q±“ÓÊ“¢åÊ©M)wr3 §6)NˆØçk¼¯ëU¤9éœÉÊ“rQ&j! —ZuRô·QŸ•I$ @Îrego½u$ÏlV¯e;ç2”:S6›Î“yu§5%;ÓXò¢(Jl§B2#c8ÔŠÚZ´yº V•tTTT20w0™ú7úß+EmÝCI$NJpO †ŽÄŒþ(Ÿjö"åÏ:ßÞþh)e# B>¡ˆ·SFQjla)‘ƒB2'UñXo«× ¿­TV“•|2¢¤®`ƒ»aŒŒž%òpÖïNëˆPì¯Áˆy™ñ¯åkÒST4+C±š.†Êù9 u’íÊöœQ 4¸•L2#bú®°Yó×j[ÚP¤)7%E'%ÚÞ¶ÃÝó¼­åneÓMëW øä_škz[Òˆ-å&20ÆaPËüžìg¦»g¥dB•rT6–FFáÊçôžÛå+yH…¼¨JFs“ ìèg¶ü÷­i5>{éŠÉYP‘=agKÚ²§¥;˜»˜¶0”ÈÁ‘(6Re×Jò!Oitç½í|VÕ´$ª¨¢Ì>Râ\‹yñ¾VœSšˆtR2­,žöÒ••=„¡ÈÏ,æJl ‚Ž´6YqN¶àJ(ÂÞ”e%%iq+…`HD´ñ=f%RTV¢I)”«(’™Êk4ÆYéeolwôm`Þíœc­¡Ð€läNV½2¥oæ…ÓêÔçlœÐÀ) šg$×N\rÓ»šé­h*º“ÍŒÄr…!)Òþ¤dqnò›e@ÀŠ[,UméH“*J)Κ'š¡£±¥^s¡ CŠÊrC#L·)Õô¼ÖÇ|™5Û^7ÊÓj€ZŒaUæ²òÃÿø  Ãùïÿ’ åù‡ÿõÿëÿ#|¤üÔüëëÈ`  `(€ Àpà(€€ ‚àÀ8HÐXàÒ °€@$0A@¡@¢3¢އP¡ƒ.BT’RT·'4 F¢‘Slб¶¹Zùåõ㔳9¨%4Sc  Îh¬ùe(‘<œ• ˜ž¬ÎuêQ)[w1[yP””àžösË}µmí![{Rƒ² 4%"{ÎW¥]çNâ“£‰4I)‘ƒ"PïÕ³[ïü)©ñ¾Úåí[NÐèdlðo£±‘’ÎQoE#§5 褨 Šü4Þ’›¼Ìø×mobÜä YR$ßY•+J½;É…'Fò”I Dª`‘Uže‹É«â øßLë;ySœ‰II@0R™¤oà·Û|¥o)!rÛ}·‚ÌÒ¹€ÎB¹°xY¹.7«I¤uÎxjhõ9É —y_΢D]6é–­•"DáSžðh%7!kp¤åmœdfNUÚÌK‰pd¨õ¤I„§(2+NP¨lsc‹xz[ÉWôÎ+F‘)ÎŒh Q­:UmÅ´YNP\¸å¦sJd§†`aÕáiÜÏmöÄVÞ”%=3Dr¤Õ œ%‰PÏMôµio!oj1kƹIáXä ÑVü¦¨)Y¤í²¾[¢R) gZʪõíž”ƒ!nêFζ‰( ’£~½å‰Ä¢DdeH’)Ö‘$=êÜžôÅÞQ(2TyÊ)ÍA)*KdøQò½$'H¡(g9Ñ“±.¯å9I§^œZ³“ "£ÕXΕ¢WÎn|tÛ9ÎÝäzg4¦’ª²‘°9â7ƒ@ìra)Ò • UlrúF~•ü×,êÔ‰‘‚R©‚¤RÎ÷uŸ‹óMr¥+&-øÏJVO;<*-D¶–ƺk¶m;zPE¼¤NŠ”É@Ù¤Mm1“ÓÒL›í®R¤äІs“¡£±¯¬NÍ;zPNÞN¼o¦sgG#  Œ·•.ò¿œ V)Zp$ÔÈÁ‘(6re×Jô#>7œñínœ©Â’œ:, ^Úc)<é1JÉ„§&1ŠJÆ“j’áD[ÉÄQ¤Fyg4P HRÎäË.)Öœ‰1rç¾Ö½/­{MM.Ó‡d})¥'_9¹9:cŠmH…'`j«f’Fñ.²@õ·‘rç¾’•|@xV@™ñZÞTàÅmÌcÒ„¤gZ@%  up‚µWšzR  [ÉÐÄ=T£Í W\¡HÄR¶áC*å¾Y¡820—µ©[,]mé)Ê¡ØJ Ó”:,04}%ÍÃS½"G¶úoV“9Α$#6‰'&Jh¯_“ûo|L¤ Ð䨪‡5ÈÄS¼„íé'=¹i¬D‰ÁRª†Jˆl%ÖÍ —=t•½³¡²¡8#iE…yBžÛéËMê”GZëÐÁ‰EͰÅm³Ò™cLeŸí$£Ke62 àŸ)\Â9å¾8Þqo)¢’‘‘‚8€µ–O/ILµç¿å*VHha ¡£±®üf·zl1éCã§¡$r0@ÁJÊWwœ¦Zñ®Ö½¯jãLïœä†AB¤Ž-:#S¼.Zk·z4‘ÑÒU228:¤¯L¥y<|oůjÎL¡œžj†d85¯$ »o¦õKuÇ¼ŽªF¢™,Ê•¥VSx-ù르µé{eŒ­ dFDp”¯D»ªíË,ÚvâœS'4”<³Þ>zèò›±oÆüo•%U23@ñA=XÃTÙÏ.™o6·Z·9P à)=äË.)ÞœËk´¥ 3d¦T™€Avœ:$²¶V‰ÛÊA(˜ÚO]Ã)<9*œ¡f–Ëkµ/*M7ë®Ò{ö™Zôª€#ƒ8µyi¼ÒÞVà×nSJs¶Š<—"Sƒ…™kÏ^(÷ó™oÆ/(‡ª‚Rz™)ÏZë]a­éœ#®ZÖÌŠJÈàîSkml•æó5bÏLêêŠJ†ŽÄÏ”ãi¢†¢éË.SJpç:D˜ÁÎ$’«ÃSc[ö¿ˆMv×+W%T Õ‚.F"Ý類ݴݣh·Ös%%&¢¶ÏjdòËÄ&ýq”Ž€42h_?ÈSÓ|ºiÊen(óV2RvU3i¼Z(¤s9¬üg¥+He62 s‚zNUµ÷Ë|»mÑ Ÿ6¹·¤™(7R wØKÊS-zëÏ<¯Ò+]A+ 7³÷ÓxŒü±ÞO§KꄦRššV+mŸ3ô´ôéÛ¾d Ð{ÂRg- y²xuêr™<™µ¼˜’©ºèþÍ/e‹}E¾bé‰ñÍJÔ€**4V‚Ä-*Ý«¯?{Ó^c•õÒ۱¡ÌÃ䫦cMço¹”bytjy(cYЂ‘¤uè…ÊdÞ·§.ªõÎ[¹ƒ)\)ecæôö~™Ý\šÙoÖÓƒ ª‰á}º_^<ïd=¼L&y,²*H•êâò®¼ZwÝ©·#òµo»K-_ðÿþ  …úiÿ‘ÿŠ åù‡ÿõÿëÿu üÇ$k) 0 `@@ \ÀN``*  8 …¡À¨H  P - 0Cf€ÙaEH;$0È01M•2¾èÎÐ Ù.âQ9ÒƒœÉæèð&¥Z#å™E¶åí‹™”cMyÊ!P¤ë91Êëð5ÚWýIe6ÆRMru"r0$!ÚxI{/*)V×3(’³J'D24X»ä’ªÆ49MÞ“×exG”%•ç$‰.–Ÿ.3)ÈKnDÖ‹î”æáQBŒ#bòïËa¿ôšpšQ–b1’œ:˜lÖøgÛ‘NÜoélœÚ-Zi&``ÈI#SË”×A®ÒŸ.jóli&ÅLÈ“ÝFNÓÄSꨎé:SމÊÚ)±³ Ea*Œe)ë±Êb¼¸:N5ÚœgsVRö3»µu¾¦8åÛrI=õc‚xTîé<$g”«ø!ËŠO}ú ò§šš’´Íù˜Ë8§ÜKMçoÈhÔ»›ðÆDd‚9¶O_±,¦GIÆû;Ìï¼Q *ÌåÔ=ðÒÛ’E¹ôökŽhÒ2G‡@l…C¯&-fÅÚ'¯ & Ë'·ÔdrzP>Èû¾í-¹ ¹ ¹N\r„sFP—K–3Œ½ZSÏa®Ç)„ÖëN%UE1e)Ø_1¦ó§Ô¹w¤´ä©i™ Âà69´õBÎ'ê=ùù­*|žSÖ0¸V>´Û—¥®¢Yr‡ËR'T'g"z®”¬ýúÆzJ{óº•ê#ÎÌj¤üÌùÊ2ÞtÓrŠSM⟄êÀÈ-ß%½ ñ“x¾üxŠë°å0ÛÔå“é&5¹ÎÃMÊtÓJ[îËuSØd'V2#"66¥Æ49W}¼â|¹«Á,¦V»Ã  „+„ŠTÊ–ü…8èl³ë‰©‘’Â¥s›åh¿™)’zÎ7áé:h *;àîB]K^´žœ§N:í]9D²ÌŠ“’­çDágàWäííì½ØÂ˜³Íë¥jQE*ÚêYõ¶˜âS068ºä+á µh…on\¦ÚéMµ»½TŒÞtB— ûf~ØçÓá쎂 wÎ FvtQBGì7çoMå å å]1@¥` –ÝJÜåQ*}JÕÛ’E«—H”ó`ÌŒâ´h ˆ×A®ÒŸ.jóvvÅC²“ÝFO]x”i¨Û”é·"ž.`ÉØÙÐ"°•_Œd5ØrâQ¿3¥S=©Æw5e D¶J%ä[ùZ|r‰m¸’O}XàjÙ‹ z®½VU¾Ï(-ojá‚‘»à¡Ï%Q–§åjé¼>šŒ·d‘²JnÅ& ­[8¦/A|[Û· I–¹[-g$31Gš•ìÒø2‹]S3(¤ïš<ì†F «I‹e.yä^sž¼R7Ùe[ œó"t0`§!;Cå¹E)·JÓŽˆÒzæ‹: |’3ɱ[qÊuúkµ¼¦•)"o\CÝQUdBvÎ)ðn…;qËÑiÊ"…‡@lsiê‚—yëÌé|ЭéÓ…”&++ÑÍáÉr-t´ûq©N’Ó”é—$,NØ”AOpֺƻ¯šðG§Šá@Éà)z¾ôÔ¢’Óv}9 µB¥eAkJ“rZø'¿Øç¸“o£Ó˜tRv5¹ÎÅcmÊ)N9D´Ô_T'V2#$¥Éµ©ç´«ôåÀåÅ»Ñ)Ò€–†JÊ*W Ó?*SÇ+-7#IëdÙ[*hSñ´oU×›Æü,˜'+Ò Í¥,Τk£ÛÐÅõGÓQÇ)¿¤)Ö“v">9„!j­´NÕC·³o¦;ô‚[)L‰ÉTÜd:–8”´åZm©5²ÍÍ*+VUVÆ…Ú¶"·§.N)䲂¤I”<ÜÃúÓTŠVÕÓ”íðd´PJBIçs§xßJO~抱ÉN¨vÒÅ-5¿EH¡’IàÂL—øqA®…ïR:Dkµ=Ù‘P— ¼ÐSÈSà·ò·âl +TIgD%`’ªÆ2O¿à¥첪éâ:«ÌÀT ÷QOO¨§/ëÁ,È=õ0)B’;]Äù3ÏÌç=yÒ}¸y@Lï)Ò$D§r–Æ,és,]K^øÓ^) ó‚S½«’ÏÕ» yÛË”§;Ó€ì`R½š^ÅËÊ”ã”KŽBœ•šQ:!‘¢Åß$•V1‘yμ¹Ò7ÙdIJB£" yɑƘŸ.3)Ê\t­6Üe»Jº†S"Rx¬¦1yw×A¿ïQ^[+Áߤc#%cIСË_k\ZâÜrò¶Jm+à€0d$‘¾K¼õÐoÍi4ZM1“º`5F¥2q¥«Ûží–›Îßr ž ŒÑÉaZÙ,k±¼ã]¨Úätî¥3ÅÂðVâ[kÞRÓrŠ*E²SB•e €ÒnMº×²=þÄ9ptªíòšoy:);*™ÄÔedžáöÌþ1’ƒ(¥ÜÈE`¢¦åù4í]öóœùl9qHå±Þej¼:¬wÔ=ðÒÛ’E²RµÌ=ó$”(6X&²ñm´YëÂÊq®”mò“±’„tSGI›ìrù”ŸÊt¦Ü¢›rÌ S"7ª !bom³ÐoÍi5ºÓƒ Å'%ç(ÓyÓî[ùJßÔ˜â!9±¡‘¢ÄÛ}£‘ñÚºéêÅQ9ÖÀmòy0z©¼9.†»`§"ßÚ’Û¡E´Ï§Y)’‘”ʺ‰ö!)íÓƒ·Á5•´Äâ¦Q„VPì¤üÌøz{§Ï£D©¶ó–Ú¢9±*©¤§©&ñ_R§–üÖQén|˜Z\:#ƒ;¶‡/ ¹kãqÇ$iD–t dFDv戴d^s߇xmøÇ]ò”0”Ì‚0ü {4…¿"ßÒ”Ûx[çž™[*hQÑoêÆ³"ù_Q4ß+i¬ÊSròÌîRà©`¢œoík˜}¹NZaSÁrÊ׌Ðçæ+ò_*¶úIÐõ¢U7DX+3éƒô‘•msÛy½ó$xt4V&)7ŸÐ6»J:lr›g’–y*‘*ª“bœÜ±äòÛYËmÊ)L·iWR)’‰#g”t)yrØoż¦”kDo³g‘Ç=Ì””š“¡C™NTûe·&kdfÇ[Í â¶Iø'žº v¤tæò„ÆTÓ9ª‚ %²/-”³ô¶JÙäb›t&¥ñ“ª,9ÙvÒUù¼ ôámÝ·Ën§fY8»µu¾¦8嶨Ò\³€JÈ&ÜF2•|¸·–ñ†ð ïª@d©{Iÿÿà  wúÿ¡ÿb åù‡ÿõÿëÿC‚æ#ŸN“º™€° €X°,À  Ð €€@4@$0¤0¨°ôÊ(RDÂF„)X ¬ç™2ÐD6š36Áæ-hÀ¦+¼&2”k‘Êd¶ömtYL% Í ‰ËCZÙ'Ø?”è­–œ˜¥:]ЭØa8¿ªJyìr‚zAkW¶Î”›’©»è/¦µóãQÏ•iÆäi,ÉÕ€‹4öj\c'Ž\\=*yy±g{V„ɃdSÖ_7ö£éº5¶Ï'ÈÁ9@®¢¾h1¤£—od×lu¢N…EÉÙIù™óye½|öÝ"RÛYËlÙáÐäµÉkà‹µ÷ÛÎ'¾…¤-üȵ…žSZƒYØe˜Ûx—”èùo_f„¦Æ„dGԸƇ)‰ï¡ÛÑ5Êœk”™Œ•REGæi©•-úþÖÐÀ}µfp²Åuj_¢7)×èRŽ[-&›åm5™9twÀgIu-zÉôÞtçÉ'GÛy¾˜D•]€\²µÊ<ôMç_C·³rÑíÌqÈ)*¬„Þ¸ÑièMâ\ù$IôÞ¼²Îtb269éf¶]"5ØåSãÞq®Ï(;ô‚¤IŒ=Í"….öÌq­qû´äB¦YäòÑA¢”švak°ß‹yo°é¾Öâ'XÈÉàJêVç*‡–šÎz$RZršÖÄ3Bx­‘²è5Ò‘Ó‡”6úSLæªHKf–Š˜êòÓ26äÍ*|"uC d†øûgq®ÇoBZV9pï3¿(*A€il”KÉ5ò¥xå7ÛRú±Á<)#µÜF¡4/;æ@G-PYÞ•³²¨£B‹ÉŸLǤäiL·d¥i•'$IŸ-PF»½›~1ídåJ‰ž‰½® %<’]@—Á”èúk9qȧ)e†ZÑ€åtµåÆw/YÆ»Q·Ùi[’Êf†E&Š-m=ôÕ')qÊ´çÑO\Ñg@>HÚÝ3ž8é9ïÀ×lw¢5¤‰¬"½Ì*›±Î‚ø‰iªN×ç¿¥,М+fËÝ.YÁ‹ØUµã¥=8pHÑJøqO¨§ÜKMë-7f¥Ì+²¡ʺ£bêÛìt«k´›]Ê×r¤ S'à­ÃšCËMÒ$©–š¡J²…@·•Ê9-|ßìC— I“ÛªozA<äß6 “±C‰i˜Û“E ¢RË4%V2#$¥Éµ©ëµ<·ØrØíèzz¨ZÁ,†0æÀ>ÅŽtÓ?*SʶçŸu¸em†YÂÍôÖgzð²œo•–R’<³­¤TàéðR·äY÷zmÉRÚa4¡€F·&&öÑëø%¥[}1ß“›(83•LK©[‰þR–Ú”Hµë%­˜žj†ÊÕ¤Õ±‘x˜žú'>œ[®ð<˜©e÷0þôÕ'!.9P·ïJ¹Z$‘c¨ÎçO$×*Fü;Íâ1’œ:;‡©Pmb›ËmgN½(cMP¤È`̌ڶh f×E¤Èé®ÔlòWdvg"\‰öŸ7–™”è[ú[E+TIgD%`dFÅf"þ¢¿A^\Q·Ñé7ËÎ !«83"7ÈËOO¨—/ç, ••eHéY ôIsÏExø·§iΔz020AIÑœòUÁE.el•3ò¶Ùõs™‚å• -Ó¥hBzñnü´“ -ëB'C37(sÙD¾ISç.9ä¬Òˆ42TV¬®”›¶w/Yϧn[,˜•ШȬo9$äºZ|¸ÁNRã•i¶ã-ÚSÔ2™FÏ(è}ÏO:·.-éTe:ý ¦JJ†“ ¾"ŸsIÚâÜ÷ô¶Fp÷±vžpäqè5Ðé2ZBc*mœÌÁ­ZS'Z½¹îÑIm¼íù…#ÔŒ’ÃRÙ,k±Ê#}©4ZuYîBS3µ±[im¿¥.¥¯• _&ÆPlJK ¹ß¤Þ³Ÿ.•>=ØÙäçÆ„¤­3~fPâZj•ÆFV¹•¸’΄ ˆÈN†¿ÀÙíNûè9lvôËg”!ŒŒc¹Se{ÚmÚ-¢•®arÁ#še‚k/Ð[GøYM·Ê¾Rt2PŽŠhéS}†<œ³ô”¸Ü§mµòj«˜C@ÞslîÙÜóÙc=ú- ëM‹zÙ•VD'%âQ¦µóãR‡§ÖZfˆàžj†ÊÐYÑߤÄràé4åźï“ÉŠŒÍáÉt3Û^ɯµŽE4jN²SE#)•wìCSÛ§obk³é‘…\£¬¡ÙIù‰y}\SŸF‰Kmg-³ds‡@ Òy’oõ*yoÂÑ›|±Ç%N•3;æÀÖt>%u+WÊ´}3‡Ó4E6ŒˆØï«Œd^såÃÊ}­¶ùIÕœ‘­è6Í!Ë—´©Ç" ••eHé{d'¸¯ºÀ¯nr¤Ó|­¶µ¤dj)þArÂNœoíl…NS–X"”°{×8Zö!Œ‹ÄÛÙ·ÒN€·¼˜â@ÌQæ·Çù`ý$e[db[k^YaIXØç¥šÙtˆ×c”Ïoyƺ<™PTdV7œ’r]­>\`sÞrãrŠS-ÚSÔ2™FÎñÐ×a¿òå±Ò#}-Ƭ;ÔÉII©:8}³r¬¸ä“ÆF‘Õ€3Bx­’~ 箃])8yBg•4Îj ‚”¸ih§[O·¤ä©:SŽHÔ¾2uCECª¤-²”õØå}8[wmòÆÚÍÈ”­Mx+q-µô¥xä§Ûq$žú±À420³XmÎý O–×òÞ0ß!ÊJjhJJÓ7æe)÷ÛyÓŽHÒZæÇ<1‘ Ž±wmvZTöõ›o³Ê¼¢ˆ`ÑV¦ýK)”èûr¬¸äˆò¾ló¢€›ÂrbÖl^sž»Q¹d´A,Èäô±‰ö}Z[nS·ùQöÞÁÖHDK•‘³Œ½RSÏa®’NZJH›ÖÐ÷0ªnÇ: ài¬é÷N^ͦŒK<" œ+fËÝ.YÄüÎömxǧiN–,ïŠØ€Y0uѱÂÓàþÔ–›ÎZnd¤_‚Ó êSõëå(åÀåµ#\Ž[”Ý”ƒÁ)eA¥†š×ÆÛ¤IR),µB“!€´©7%Ÿ‚.×ßo8žúQ¹dôÙ3€R@ï›IØ¡å¶ñ.7nB׬–t dFDlmJŒdr˜¯M‡.ØžPV«Ã  „»ÂE*eK~…¿¥²Pi;LÁ 6VÊšüiÕuáã}–“MòÃÿø  mú±ÿCÿ® åù‡ÿõÿëÿbVÕ&w²ƒx€ €0€0€ 0€$ L@@°X.AÀ0(  ¤ AÐ¥:#@͆B© ³¦rL3 bÏ7®4[z i»KŽHÒ|·›åœ’±±ÏK5²éùÊ¢|¶9MµÒœguT4îi*wwÛ3ôÇè)§$*_=Z(¤ó»´× vño-ö ô<‡~ˆ*MPÉØÎï[q)å˜ÓX·è4ŠK.SZà€22Ó± ÆC=ºJ|¹¬¦Úí$Îfa¤êç¡¥»Š{þVã|MŒ¤ÖÓŠ› !‘`Eh¦\¢xÉ=jKJÇ-¥(ZôA(Pf³uòMü©>9Cí¸ÛrJV•sCíw¨A´ç¯:O§(,ïJÙ‰ÙTÎ&¢î˶cÊ(¨Ò·Á¡Zv½˜È)Åó¼tTN—–¼ÎU>*¶úJœ©u0f(ó9s}é=9#HÊv®š‹ážtC#E‹½Ò™:Vß .YŒzê` #µÜO“<üÈÞ'ž’ŸNP ;Êt‰ Q)Ü¥±™B¾›”èe;WN‘O# ó‚S½«’ÏÕ» x·—)Nt'§ØÀ0$&¥{4½“—”­÷.)-µEË †ÊՔĦ±ËÎuåדJT˜–HTdT928ÒÓåÆcmJvã*[Ø +¨e2%'ŠÊe¼ ç ß…¥Dùh¯~PTš¡’¢‰Ð_O¹”íqn9z[#6{Ø€22ÓÄ9它]ûI·ÙVb¦dׂ͡ÏJW§=Ú)-7¾å ï† Î$ª[³ v7ˆ×jGMŽVº y˜.‚·ÛJWMJ()§&JV—sC# 3†ÜïÊùl9pt©ñïVÏ)5¦¦„¤­3~f2ÄKMJxÈËÓt*V™R$„¡RDÖ¨ÏjwßAËaËŠG-Šó;ï@Á4Ÿ¹[š‡ãt‹d¥Šå¹%'‹ÉŒ$‘¶2Éã~St“o“»<²ƒGºS'|µ‰m¹N”ÛyËÊa•‚åS³GdNÓc”O]P[­80PÌQRtÀÓYÓî›ù=¿ iš›,M·Ò9ÆÒŽ\\=*{¼¡HÁ¼9.†ºPm|øÝ'%§Y)¢‘”ʺ‰ö!)íÓÓ™å3¿dLë$%CšIz•º¬´ÎtçÑ¢TÓx§ÀÈC,ÔÔOÁñç]öó4÷в€ÛÜÝ‚‰hÊLk¶­%Æãɤ¤Ô†UBS›¥¦¶ÉÜ«.9"<¯†yÑ ÀMá91k6/9×]¨Ü²¥¯¥¸›ÏˆG €ØæÑª \c%Ž\ÖU>>Umn®‡ áTMqîZ×ÏÊ()¦è”‹àXra]Q³ÐäÄvôŸ-¥èrœbîJ#¸RÊÉ-5¯·(’¤RYjE&C-iRnK_]¯¾Þslô¢o“ÓdÎI¾l'B‡§ÌV”ãx–™Œ³BUc"2#cŽÜOÀŒø¥zl9qnôFt KC%e Qø2ŠTÊŠ¿•¸Ïœ­ù O;4XzÔѺB*Sç礊Üæ  żè…"wÃ)õÕYc_àæóÏú‰±¬œ³$%43`+†4~ü²r‘7Ú ÎµóÊœRuèJŠ@Ì˾k <ÿBÆÖo-Xê-÷çbECCÊת£yÁ((üêR+zxÒ@ص›¡IœˆÅ;“¬ ~Åm³MÙj§ñiÊjù+$è‹åòîF”Ûûb"À{}„ Ž–…3R¢Kzrê¯õ¶ÙíVæÊÙVÃ<Àu¤D*ï¢%ºùÍ%—ôÄ#Ž#Í”¾0Æ’3¤;|ù­¿Ôtù•+*¬*wÉ £Î"Mo¯¯4R~¹9´ ¡̆~Ë Ã_à³Ê–ý…l—´U”¬ XÏ}ùÎÓ/ÏÐÎRÓûd61Å8ÌíŠÉ ìÖ@KOb•éÇo»cŠ{4,æŸ5PƆlaxõª¤½»i(·úºˆL¤Y@³Ì R¦M ?#4+G–ðõ×øGŠw0 P̃þ Eÿ(À#âC @P‚QQR JD HRB¤•$*HT©!RB¤•$*HT©!RB¤…ÿÀa¿]È® Ãc3Ì6 €Àv°ƒ°€ì`;Ø;ØÀÿ€Iÿà ?ðüØÀ?á  qú·ÿÿÞ áù‰ÿØMÿ^¿] Œt2ÔpÐ@€| pÀ@à€Ð €`0x‚ d@àAb`ÄCMPà *‡hAˆH¬†Ë§1LŒìŠ98Fr>1ÉHÐRJj å°XQ¿)ÿ¨<ëšÊÈeœÂxîÁvüÂo@8Zü‰ÀCZû@2ýÊ×¶Þ?&ÊùjÌrG—pˆõR&õêÅŸ—ш$üÙ-–6ð¥˜Á…W£í:D«ËÒR€¯ù[lø£2ã\ XÖb6A:ôÈÑtýÊMA—ô¬‹*7‰É•žY•62XZ]HØßïCaoàˆ±:©ÔÛåÎ'ö¾·ÞyŒCeH†!ÈaVD- ¥å—Oœ• Íåº,ñ÷EE¡ÕYtçç;e¯—ÙF8"üêRVn•“‰å"*wÕY[_áafë÷¢°§ÜÍ€® Iþü+>ŸÈ"•½;hpVÛX ¤ Mü¬ÛàÐáWëEO¸8' dlUä…?ÆÇIþ/®]Ϥ ‹x‘ 5loé„v:§B<Õ~¶Ñf<³dv}DŠö@’ëë|i¾KçJPÙÅôA’IÊ€·’¢²Ëç5ÒÍåÐËù‚±Ã RŸiʹñò@e-¿5 Þ^“GŒç&¢œª°§ìV½2íõlMÖ¤% Ì0EE…@e–|î¥*âøžŸÓ—ïh ¬:YœP9ú+m<}[Q´—ÐC¢ž‚z¥€Ò-I%tû1¤™>×ß.SŸœi)IÖÈè@[çÙØ-?Û¡žfÿ9< iF9¼$²å³ãñä…EËûhFÃxƒÝšVu<ØÌ±ó =€è~v¾ºgÂ`8÷䇷ëðÊÔË÷$PGkÒôb¢zw©(Mý%•´²yr"ÂËçs®ò¼Ã#G9ÃR¾z´/Í–$Süê”9·‹Ú¸E0«'à•˜g÷ðdŸ{_Yºî'g¾e›+-üw€¼ÿ…’ÓûdÆbtP)˜Z+ú1“åƒIMe÷Æ™éhë!–%ä¢å3ÛÏ«=>LQÉòþ˜„-}È0d¤«!O@¨_Æèì7þj‹¾ÒT+m(Td<²Y¿]î¨ù~èí"¥PÉã} žjÊK5ï)Úr_ÈÃúr³Æ?B‘XèAr0y{÷ciý²Ï-o/9NJ\r½+"3e.,-¿Ÿ"”ÖŸ–zE-Ž5 IŠªÈõ—?¶™ù}ƒ’ß<#(—ää±)’¢•;ꨟßrv9}m–{M‰nK fÀ¯J¡Jéôï^I÷¬b8_ú^&Á옅#‡¡F¿ydè¸ÿ*„S*üÖxý†b2XT&m1PVù!Rãé–zr»úÎp6-ç"ï`en¦FC_ÙQáWç‹ç·oD¦QÆ&áOy“Þ]}ò¶šß¦K3ÈH’瘊‚ȼ•ÿ £kü*;[àÈÈ”ÈDúTÀ$úbåý¾h‘R~2¥é;,äJ¶P€µô4§3·ùT'c´Î9¯8Ðhlˆ+Ë"P¼}*OéVR¦_¿qÍÐÞaCÚ´ežý]H<¾¹åžY·^‚“[Èdä`H\µF•éåòÒÚc¾˜IÌeÒœ C2^^—gj|÷—0´ÿjˆ”_ QúÑŽnÊìúrâ- ÇàÇ9mü„T¢ÛS*BRÍñWFZ~Z†”oû $Ç/«kçÌæ„d>šÎ—µS÷øQÚ?k¦bª‚E(pA^^Y4™9|:²×ñÞÃ$ÏO‰Ž´œ–!~z«_üsIþ¤3?9ÊCŒ”•e-„;~Ý ÑåóÅPÛ?Ða„»ƒ`ë0·$G8¯öî±-?¦b$h7‡4ÁLÃÓ\pñ+Ƚ1í¿èEŒ~@¬%ä" ˆ¨zzõƒcãù2²éü„ìâ9i+»¡Uû«1=?Drxåü 2µ¿%Ež·‘Ì't'ëÚîlü~älù~¢T§3·4vEEš÷”í9?ä©&Y}s¾ºa¶ÜNËK9"ž^½Ø±tþŸ5$ÉöQi+iЪȥŀ%·óä=¿àŒu²ì–tB S€Fz{° “úe7òú0ƒ7šš)ð晴¶¿s'e§Ï=7Ë ¦âtX‘±”éVv>>^UÝŸÜÇRòæ@©–pÉÅ›—Ę#Ëã\·Ó× s¡¢Ã‘±%ªUo£{%ÿà FCåüˆq.ëlŒÑTQŒ­ÔÉYiýû¡ßâ”C‹| IOz¢œWùuÚ¿K禽t²&<À™…#‘©£k³ËGnŸ²žXËÏTNŠ Træ©O´ÕIoúókdŸÓR’E²è-Ñ1§ŒaWleoB–Žœ¿E'E—ß;Úò–ÙÁÃÁ³2Gd ⿟R¶Çã¹ZC/ÞÑ èoMðÔeŸ/*O=3//twöÎd¥%4%@hÏ^™”¼½o!.?‘$Iò®!XÁ W—¥P–Ÿ>І™þÎJOlAI±ÕÕ Î©JùÔÉÏŸâo·î#j í´Š”‡3|VQ&§å¹×÷Õ#ToÀ¢+)D™ €#ƒ¿Žh /þ;–z`å*ý„èæÒƒ7KmC"éíI‘¶ÿÎIDY{k2pºPŒŠ@ɾ8`íñ̳ȿ¦ƒ‹®ˆÒå¡"55sêfÅ¿ÕÉÑåó×.ZDN´%ÌÐÉ´ -º"9Å·æû AÀŽÙJ ÑQé›—yI=1íËøPGýÌ”V„W3ùlR ·æ€ÊKç§*Ñò•ä†Jn(œj¤¶þ}ŠHvÿJ€Åk~E"Ï #f)܃÷퓇œþšQZ>Ùbúª9@¦ÑLê«íHÄûzg]a»Ü2Ïò8ƒädK9"ž^¾PXÈ}4¶šùiaЧ„, ÌYJ^X7û©å®žº¦„i%˜‡ Xr6iMëìVÛŸ',eGE ‰”SEXt|ŠÞÜ•ŸÏ#·Oê²J½í;NWR@"ÕBz§º%²ÏÓéáº\Ö=‘ÇQÉÊ@éí©Ï1銆[µÂ9s˜Øæ¨¢M(´OñÔëѯÿ b: @B@sèC4W{ƒ§±9=¿¿€%Mÿƒ’ŒkÞSµU 2œ ÊY7ÚXŸÛLm¯|î|$RÀ††(F >|“ÉÎùßÏDNŠ Tr—j˜+zyÞ›ZåüŒ-`^“”’E–†FnÆFŽÜ¿œrþ(œcºkI»9FYé;O~42…~B Çe“¤MaèÍ%Ìáf7øS®ôP"OñŠ‘”¯™׉©8¯òêTxŸÛLôÖœ¨1ÆÆ ¼½*‡[1”²þ^B“Ä} øQ>SšN´ÅBÍò׿g\×øIå¾øÿ  Åú#þäº áù‰ÿØMÿHc‚ÝëH@`$ € Á`( 0h^(A@PÀ¼ *, °ÀÁ‡ ,°á 0åÓd3y!¨G^)”#€ãYHäDµ•Ì©²~wÝùþ¦züŒèàÈÌ*¯9E+!õ¦VÛ—è±6Ô¯$L{š¢<€@v¦¹×^ÿª²Äþ’¬¤O;Ò ØÉL(ØÎ0¿Y-u¿Ëç2%.ùÀ m”ÑÞ®K—ˆ‘SÛÏD–2/ÔÂÏ'ßc“°3…nõ|ÍK–0I¹À€Ò01U¤ß¶JVá?Z‚¶‹Ë¸4NÕ“*(¤Ò^YƒŸ-f Vþä¶Çþ¸'$Ü;-pŠ×Ò¸ñˆƒïÏá$· BQT„½,KþÀæw÷ö‘JþX™,,:œªÆ÷4‰ïý¼…n$ÅÍŽ(Pa$Ãv‘,Ë^æ°]?)-JYÿ¦tΪ· ’À¥áâ›zÌœÝ ±å–5±p©K0¢œ2Ÿ¦î…Ûç#„–逨ƒ—ºÕ*© ƈR©~;ÄŠWÿ‰iD}œõ ]„®Ò•7°"Ç‘‘¶Âgµ·ì°WëFe`†ˆZr€e/o)[‚ýêVÓpaÎcv¥BS`o÷Ô¿ÞÛ[‡Çù` µ"TI >Ì%\sùW:ïäŠ8«ÊÆ ‡kŽC[€ G8þ¥mcû’)N,û¥‰ªÂ ü¶í6¡cãÞ3Žo±…j½ •²KLý¥¥8éùªKOÒcf“ÝHÄQç7½£o×ÉMánðÄ5„΃-¾;&bŸÒ•·¿%•€)ñ3&ƒI dH©oÓˆÕŸOÖÕ,þR¬dÞpФo53”´T8²ú+Ìgþ^§a-_)Œ)ÒˆFfɈùLÔŽÿ¿“H?Ô‚Åß–Ž–›šũܖ º|éy qEJBžQRkuP2é±#vçK—òô2Bíù ‹Ã¨0j²3êó¤×_ÛÍY<~‹;¨u×È¡K| Ç×b*ý´0ÖùûÊ1ÔWå:FÍã*O#E­¼–*'–°uÏü²€-s$h m”ÑtC2nÐŽsÓüz#?&Y[TÜÆ©b(“8Ýë,µù®5ŒÿfÊúRÞQ²E4Èx ¬Ø&ðÉ"·Ç¿4ƒ¬üô;ú±QÑDªtï©.ß•/Aî'ʲrБ©êz` Òðó/—X’K/鈉*§ò•ð{¬@‘#¯µÙ:}d¬]¿%¦¥J~@lUTzSM7¬ñ]ç§ùä#g}øF‘˜T ÅT”H•”û•®ãÂkµ-ýÀê%§Î"+Kº½y2™GœÑÊšž#6WßÇ9ƒXnNTY‚·§'B²zrƒ¿¸Ô·Ô²äpJDfÄ'žHÿŽñ"•ÿ¶"$­¬J‘Ó@ðò<Í1ñÙØÛÌc?òÆ4¯ÕlËeˆIçTSHóœ8Dýo½Nβ’,®¤¢†gUÚŸ]D,küÅ®Ÿõ$”œf„ÀÆ€"7‚IVÝ~WÆ\«§v#67×s¡ªƒ†¸L>ŠÇ=¨Ì¶óy¤ŸŒ@C@p§]x¬§ŽÿKë †C68¯Æãœƒ:„æYÍ,ké,­µçЀ¼~‘F·%0x Œ ôÉ ¿$‘Rÿâó>VÏsqU«/I´‘eùrXJ7·$?ær)ó´HIn¼ò)N~—ÅJ•õÐáá¼êî Ðæ×# 1õ,ô·?¢ÎÁ–Þe˜¥Œ2ÎsùLÍO×Ðη§ÊvÊ÷hÊQ”ä3ÒϢƧ˜ÌsÏü³€»Þa)Üd V²Iý2ÔùúÎRc‚~ì#ãlö0å`«ð¤FÛþ…®Ô5ý1³é›R@E…Fa;‘éïÕ”—/éì…ŽyŠÈöE.5,GRA驯’³ÓûÐ *Ë_É"V+la^HÒ&äÈ`£ó¾µ,|{ʰXNÓUÌ85î²¹`½:0ZçýK^oØMŒà'`E¬ÚÒŸ?]”kòá&Ç^¢yȔΧNú«,küòŒ‰ãrÊ N_TMœª¤À¯KößN³’>_Ó5WÞ èV PÞ õv6ßùû¥CÉg`¥.øPƒ$2 Ùg *—ÓÊ Ÿoñ˜ËïDZê$Š8+%SÓR— /¯Ž,ܲ¨‹W¤†1Ùj¤Éƈ××+_;¿­%#×GvT´ÌÕ[Ó¢±¶Ïܰgù>UŠOÖÌ‹;A†^™·_ZÊMo¯¬ç#c8hñi¼H 0!Ÿgclÿ™¡Å¿¨Ø­¶¾‡,é7…d"ŸK”ª<ç:u·×£¬Ÿj÷5QN($s#§×2Tÿ1(þã`>æ³xVŒ÷å¤õiÿN¡"–Ÿã0’4Ö¡±™}_2 %óÜÆÿÕYkæwÂ_°ð &ϧ.# é89KOõÐlDã…zªž¤«3k|/N;}Û§»s\·ñ¼@J„Á&g&ùW:¦>¾²”Té‘›<Á™õ…dY~]€8Ïû™óþg!²Ÿ;D$†•ûu®*~¼9:÷ü0Šu—mæ†@gùyª¿÷4 {em$zYÄf rñåvüÐÚƒ/ñOseÁ4tR|óÏk 9øôµsÊÉía€[ø#à4·q$"‰ƒƒñ:_^ÿf"€“óœ[KqcŽRP)Ÿ1+©g÷îLôÇ9´.4ˆgµ Ã1V$„^½aZ>Ùg~SËü^R'š–O9¦¦½Ý™žŸ× ö’œ|oƒg›bàRT’#R(t<½û×¢Oñ˜E³ÞµÐ]¦îÀÌä‹.v–ÇþÂLXONŒ³Çä242i!¡ÍY%:s󭯯—áˆH!~®‰†íy!9*’”»ê¬±¯óùž¿Ôdéù`äfÀ¯i VŸòælû8(#ã|´ FJêB^X:Ò¾x˜¢Æ?˜AOÈ :0‰d¾é#Ûñå7füB'TÆa*FbÆ.j’jV-ÝQØéþÝ„³Sûã$˜ï‚ggÐ$O{‘šOõæhyM8ç_XÎttÄ*“Œ( OmÁ9kü;, ÿ©Xë†EbV!5®û!RéùüMÒ‡=B·–9Dñ­d’3´;|o-ŠƒïkãK7zŒx·Ì`ÊÆŠ€Ò}2E)|xØÊ[lŠX_Êð˜R• ]Œµô0Aå÷×,iM¨È:ô•bECB"™íŠ¥«n¿m0è«Û !2™„嘜§ F)÷ðó /ËÏk'z |¨Á ávÖjeíÀt[ÿlˆXØÞqµÏSK£8HÅ?mÏ,ôñ©îŠx‘}D:“Äd¥z"²éü¾f“S/ä!•ûi"”8@jüÃßj^™Y=:á_ë­q]gzA$ ‘vÞæ¾×Æ[×oñ Ë#qYÄ”€Â¿áÿü  ùOÿ: áù‰ÿØMÿr¶ª%„-£xh@€€€Ð€hB`@4L€p€@ à@ÃcA‚ ÂcÀ‰&qi"†“ †D®&ÖVÐÄH)%Ðö ¨È9ï*ÈA#*žýà±éô‚Ò'Óûf"DÚl‚Ô± )»¯¢´R}=1\ò°ü¤s`ÓS0‹| 6CÓE›õå‘’åü´¢{þä(•ÝQà:;SLç'ý$NË/Ë[ãKG=Èpu¢-]€OíÌWýzƒ¤¯ý1n|÷)¦(­×ÉØ•·ý Z~›åžW:T:Ø£R"Œz}= Òÿðà’.>‹Ð·6[D˜nÉâÈF%퉲Æÿ̤°géjÒ¯‘›½ªÒEãíå^„¿ü…x,ˇFC>6ºC …‹I›—×%,ÿd„J{ÿ¯Æupst ‘L‘±öö¿$¯ÚW‡-g‡ÉUßbÝÔ4¹ëû$žþº±†¿q*V—R@‘Ê©+˯¾”ˆTfkƒá2Ñx̘(›æ˜ 3ö2xy}÷¾yfÝn÷Ä¡€«¦s+VÝ~ÛZøï®WÇ#‹e`Q  ù€G/ËpJœ¿œ‰áeóÄ1¯•‰ØÀCíÄfËÇëóPÉ?´霴ΑRk)š…§“³üÝokùüâa =ÿƒˆm-0FÀ€ ÒËÏ»Kÿ¯µŒ~¶‚E)ö ÈITÛk-F¿:sLúu¶³˜©Õ#è©jŽa³¢>]ºÏ4>¾‡\Foì#ïº cH059 laŸÇ`Κÿ 6×ö(ò•;Œ‰Rps–Ýºß +þ1 —«A–†”fS2•3WöX ÿZ]ÉéóÅYc°Ðº©D*ÁƒÛ×¼÷a,¨¥?ÆX… ZtMd€Ì;Î^ÖBz~Ý€ž92gÂbãlãb¬I­·ËÑS üú¶0æ&—=ƒcÓ”‰å„uòr%§ñà¤ÏO¼ÌQâßràë$$;áQ¨SüsÓ/øñMð¬dHôóSÌP źî÷tßòs½ªÿzq"šRhDlÏx«|½«ÒoÇòP̹z2ã1ªQÄbôÏæoÂ-¿ƒtQãÕ4$¨žb ÆpE•2™ƒãíèê ^9”2NŒÈl«„JZ**&¿’œ#Óûã"L´ú½†=}í À5Bf›ÂÞU·Ä2Oñ¹‹17Â# ÕâO-èEO sÄíþX5ý†<›¤×¥‰pÙÄ5kæANgïµ2Ï$ÿr\"dÈ°Ž‚Îžš¬íü%rÎþ{$aŠdË ‰HÈ„>2)Uëüº±íýµ(¢'ÉAPrØÈÖ„¤e%íËøiFÿͲŒE½sE@m]òb•Kí5ôûF³Ÿ(ÞÈ”‘³HË+,tô´·/æ±:;ük2RÇ£› 4‡¿MJ^žú9¢íýµ)"'ÙÏ1Hª UíÔ_–à”³ýtÖý²D‚­Üç7ev[ë€|ÿ9ƒGçý¶!&‘”T„¤:›çZ4’Ÿ§%®+ﲄ!(› b‘ï™°IJûó+·ï÷uÈ<¼Äˆ^ê`¨ñIy¢rú¹×õúÌ¡5ý)HQ–tŸ.Ýç†"üêpz% ”O–Ò¼¢DfjçÝê÷×ê«|ïçõ¡ÓG«°°ZI1d³–ݺßIùÁ[#ñÔ$RŸm¥è¨òÍËÊ‚3_­2R{Àø ŽìÍbà•$D Ì­.=|«¬×ÌÂ{…ý4ãb׈ƒœšKß0Ooëæ&éü±Äê²H¢I¤ËzdñN~¿8ÖÅß®t×:ÊC³)€óÊO/-AÏ·¦ó'N_Ícì?´H!Yò)2ÎH àüe í?·tŸÓIJ%s+( àKÓ3„åù:é¾^º¤QˆµE@±"4iUï/kò¯Iù G²^cË€P¼ÝâD³sùò9á~ò;뗾ɔ„™º B˜©w`UÄÉ@¯ã›[L{g‚Nd}£[$bOÍÉIÕ··%oçàsg·üƒ€ ª^à…@€CO!R§Û‡9¯_é±E y„0ó)<·¡§°9æ¿¥6“JŸy˜%Œ|ÊJÄðh…§HZzz俇·ôÜ¢Úc{¤RƧ‡%TAO¯C„åú-rÎþz¦a!¶â'™"iô™ZzõûASlþ6Ê”˜ÙÜÕ M?É` þ~%²ãþ?ÎFÞ–ø®qG%mbXU ÄB¯Ãè÷þ˜ˆùbɦ5œ‚Ê£¦f“Ò̰´úœÂtý¤µŠKãU"”²Ô2GT©£~sKeooÄïŽ*ò°çH«ó0ÁÛÓ‡oöõ‘kû>T±Ýl;T”ù^5Ïó®hqn )Æ¢h%50ø¸68·éÑëªÿ6ÆQ->r)gËFDLMKùíÚUþÙ€j~9Œ)͵€ÈyÙ ñkuX6.ŸZ]Ë—ð±ºHîÍ3å¢+ “nõÃ~ÿ²†ƒéû˜`ƒ¦Ô­Á©ÈÏ»ÖW|?1Ì·ý›JÌtè‘sTHˆGUÚÙxë\áûÿ-ލŗ£b!ecÄ0“ËœóXÎ-û`5§;g9\OQ‹=ïB$ ̨Mâvb··Ó„›?º¬Ês‰Ø™¶X#C·õð”úô`¤YýÛ‘Ä`'É?—N«7œþÜÛ+à^W‰®³ŠLÊÆK4—¦ çeûÉo¨ùî¢RÏòHGgȤÇ€aßÚem÷¿E#í,N’<Ð!ÂXÎû`“§ÞG6åü$wÎ;1=DDªˆ÷vŠeOo”«*¥Ç"„£;™±¼;ËÊH†›þÔÚE¿ìØÎÏÙl[ ù:éL¦¦Që\æ¯ôÜëŒxr £Q(rL¨âÔ¨J{rVNŸtŽløÿ€ñÍt×­G)BF¹C¿ëåÚ“úN±‰tþ™ˆ‘ªÃ ¨îø2!O`sÍ'–œ´ùj¡‚)Ÿ˜ ecgb-¹U?´%2·§Ú–Ëe¢‘DÄ„QœI }z-w_Ѳ¬KôÆ8ÚÈ­j† DÑ^UjWþމ@½¦Ç`cª©Ê5=2Œê¸D!Ÿ×²°·÷ÊWHìz¢BaÄH66„*úÕL3~?(L`¯ÒUœ”Ë÷´bFBw>F«Rù¬~_J%ñ¼ÐÊYfFÀ )ùÜÒWŸâqžÖö×Kc‰Å²QDaf`jôôbP¯éˆEÇúc¨.j”7DÄaˆ(9ù䥗òµO•·é°™Ç²Q”AHu7ÎnG_gzê¿Íñ¨þÓ ÎRê¤ÂÖsúTÔŽÿËД Çò0µ`OµÖWZ2¾xÇBÓëk¸Çúc,$uÙƒTFÒ ÖIM©²~»BŸðÿþ  køÿ¼( áù‰ÿØMÿ(QüBû¶ËS° L 8 À0x€ @0lX ÀCf¢@à@¡$cŽ(!€@ÔP1”ÀD ¼Úç9Øšy˜1YŒ€wdRv§<ÕŠ‰å›éüß:Dïå‘âœ("ZÒ“x¡gõö4’Å‹L¯„“àÇ `¦æ)ÎÏ“Y¾:M)O­L<½¦tNZb6 ¬Ø$󄦘öûR² ôýTDñy1²²‰\KÓSžsõùÐbJßéŒsM¹ B³äR`+œ$÷ö®óùl°ñ?´ïƒáS!H©±¿¶Ù:}é¥ºÕÆ²Â'YŠ%¦,H‚ZͳDù|34 ¿ß0¢–JóÁªÛ’ F±”ÊžAà¥ëá1Ô+qÏe½:İ(¯FUüw)ëý7Bä>" F,ðJ T` NpÒ·ù{€ÿÃç8’^ï2)8B*á©<øúM­µ'ô`­¹: ÆFm"*\ˆí÷ìsÖvþùJé ÎÙÖbžö¡‰2ÃDW¦…*ZÚ»¶_ë˜ C²©FX¬šKe’Ýx§å¸ŠÛvರ“n9ãŠZÔ dDùrï9F_¾B³Ëýò'ENV<ÅCÜ‘ õ}A/®ä¬^?gʲoÆ‘Áp’õ¸ð©%+ç Q·òÌÄäþÜhKHõ,¤z+¼Âcæì³ÿ¶°tç}#¢­*+$š]¸‡&ú_Y_¦Òt{þ-2Ôë VêâÇó•䔟&Icü³‘(óÄ„#“JõñÃ(füeœÀŸËGR[þ;™p”‡S”¸3B[~]i-Û)áA)À r'¹DJµ˜&üDÊkç~×¶¼Q&}#JdÊùãHV×íð·6TÅߤn˜TØ6ˆˆ e’ͽúõ>~ôœQN.Ž I’ª£)Dèjr3ê¨À[ô¾±oôÒMö63‘.FöØÒÿn¢–R¿øÈgÊüÚe9LXi´‰1G|&;ЈÍÿ+^œéòÊ6 mÍÄ1$‰k"šµþ]ÐΧôï#ªóýØ4<Š»±‰ASŒéS.Ÿ¦{$ïòÍA–òTF`!Ü!Y£í°t§Ïß‚œ ý¹¬èóå³²HžY‘ËÛ2*eÛô’WÚõh©Jo‘8–(ps€gÏåí–ê ÿŒ„YT¬ñ®B° A]QϾòàÛ_ïœî¡KÑc“≣lµš<'ÛÑ”,µ@]?4 œ&µp”k,[ÉY`gþ_"¨©Ÿûe$%w¢CXQC^xØ’\þ\öIO¢BXM1­[¢0¤n3’<ñéáQS?ë¤jtå|§#tB–OrÅ~š·{ÒižzNU=æÐ:ö”eC<0#·Ï”ºïœìtÜùWVΓβ,Àe2¿D,TËþ@Ô'Á´ãì‰O*PÖ¡ë¿Å§^LÏ’£ ÚsTA6WÖ”@à¯ÛšOñ¶sL}sÎr˜¹k0žƒi2«Ó«;×çM –t°"é€ mª"‘K·,”êÿ.n ?Ÿ½'CÇN#!. ÈŸ·©±SôÎwTª@Ž$õ8€w« O?H4ŸÓ,_¢¯þ¹€ä:¦(¢“ëž»a×Ƕœï'Îä kÉ!T§È"DÁÁùü^‘·ö̦ζiœ§AY¤Ã(37‘õT`oó¤ë¼cý5D£„QœC.ÍB£!í±µ¶ó “óÊFõý]#dxŒ¥"’)K'ï†X9§@¿hmÕq€’£ 0:0KY#XÊ?=‹ZŸËÉ VôúZ±˜ðÊ‚‘Д8ÖU–]>ísii³X©¼c ޶#C©Î,Ë—ÛÑ”iý³!³Å›]+9 ª%9u'4홲íù=Ëíû> š〖(ps€a#éùW Çúê2À²í@¢„QÔ`îñ=ÿLVYK_ï,›Ö3 +ãˆRX‘,³¹&ŸŸ¤Üiþ5eb2ʶ=F‘Ç£Yà$½µ'Bõý$sgj²Xa¼u bà0†½üÈ©×é+Ôdýc™Õ!™å:LrZf¨¥D–öìlmëô)‰ˆø°À®lŽÀÐ$ŸŠ»×ûyŠ?XD`]?4SÖvṲ>’à¨?,ïC®?©P:ö®"î³V"*ôÙoßÙ ~¬Så~,óµÑ)#1PQàË?e%›¿é¾”;ý3Taü,LhLöΩŠÛ¯ãh˜Bü㙃B½çIDe&CZEžzüb®_¶¹c†›Ò¡·Ô Dì î’Ë·8Ì„}¶ÅP¿WD‚Í=ek"SËS¢“H|é:ò¯ËÚÂA¯ó8OŒlIIùì”þ™[.] 3ãmxAliPoMëb#>ü˜-þÙ¬¯é#’Ʀ‘ÐŽN•”5>~ýBÜ#ùGûð•,Y€d¡i±€‡OçØ‚Æÿé¥,Q’b-Ô¤J“;Ì·n÷Íoå°Éxf‘*ºU˜I) c§,¥3c?›‚ÿ|^€·ü¤Ï«Ì##^²§ËÊ|‘vÿ ²‘Ò d›žaƒ ²çœÉÍþx½´–ÿå¬ìŸÓŒª"ç2 ÃÅ8ñ:MóÒ'PåáYÆÉƒ!²²“ĺæ åüg9‡ÿ–³¨&…Àæ*¨„‡•ŽæG§“+'Û+_¤–’€Ò;e)ÈŒÌX×ÊL†Úÿ GU—óåekÈÀfÑ¥:Êtçïz_>¿¬oP›£,ãÝ5ElmNý)wuúâ¶ÚÉíp‡3?LV••Ü1‰âd¦Wþ\Ó:§ùìSë~Lô(9žÃ¡ âÒˆåùD¥¹¥ép…Ÿ;·=ËÁ&PR#@˜¹&ŸŸ³Gç´Låò´å1ϳ´”Y±Ö“wžÏètŸå$,V}sµ\0iòºJôëô•®’ýòÄ¡7&ZR4Ë`9 ¢ÎÞFg¿ó÷n!¡ýºJ q-Ç0!5¯.Pôüýp™Í;Ð&ߎT#Ü”5¡<À§ÇEc©È,õÿ-§eLªy 4$ÅbB¯J´«N~ð]R¿ÊX˜ç½Ò æ @pôÊ@ |ú:iñêcc?®u€gÞŒ€ÈLöΪíûüëØ6îÔ… Ë:Nt4U–:™o¯‡cL4¢Ìßï‰ÌÑôÔDAx÷¸R–ßÓæƒ†ŸãBØ€¦ ,º™2ÓöèyZþ>ñ9ò®.“I<í € LIjü¹€i÷ô.{Æ5xlZÖCXÙ·ü½WYÕ'[m*†^A yVA3ÁJþ;ÏT>?¦¦,JæŽ$ +qÆÕ<…*ÈÆÆéý{VÏú¬ÏU»Ñ\ÇÍ0`BÖa%·n÷Í„þÜ>[ňŽ6 fR¦j¿7™I>7ˆxßüµ­D‰¨0Š~d'ü?ÿ€  Ó÷­ÿö¾ áù‰ÿØMÿ}ä€ÕˆlPðN€à@1À°7 €€dÀ@p0@ÂÇ„À„ʄ€8¢íƒƒ,z ÇLÂB5AC¨00kǪ7Áöík1¸§z€Åб,ÄtS:ªüìÄrþ¾bvY~T)‰F?eÊ:Ј–²b)%ÊJ™À™DiËY@dZ, UhB^šœ&ÿ´+_Æê øÞªê Ì;ÙÙ¥x«}>+ÑGÛ£rŽõfJB\¤€žQ‡[”¾û‘>?®„QãÝ4qJ”Û"2Äm-ƒçøö…F<ý[²Š  qç ãd-þ<[dÓûà¹ví[ ìx¨A # Š)£+Þ>ßU <‰þ|ÚÉÉD(†ÙFT“Ó– ÞÊ…+¦P1S?æQʹdÈ–À†PÙeÒåFFüÿ&PaËÙÁ ·ºD$…\[-•>îóÎÿ/ʃ ¤×­bWì³”+šß—8Ä ÿKÄØäÉÅ+]5:ÜôLã­L±Ÿ{C,oýV i¿÷ŠQ„cÑn;œŽ'–»NL+ûù)dŶ6°A…+sÔ‘™FñI’ËïØæ‹øÿ8ŠB¯ÖF ý% ˆ™ ½ç()y|¸u%Ûüp1Á˜é9D2’¬­Ô9~œ‚)kýh¼jê³L蘖âK†!(¢}9Æl¼~ûRŸvå,Ád¥ˆRjbOÝ-?Ž‹•«ë¤)h›•`‚÷ÔÈ9¯>\)_ýý‰4rbÛRBesTÒ ÌjíN² ]>x†OË’‘ãÑñœI›fÒNgW´â>œ>7²ž­Š(…„€#2Sg-~þ¯¬ä×õ¥N©¸5†ˆÂY›h±l½y¡ÂõýPL:+x§zJ³ $T•5“m&žò¶FOoø(ãlwj{$¨Ë"!eA—Û«[lzg•%"vêЧÎ9- 1œ¢GÇh•z}æcÜÑô¤òÈê²P‚32!-2”SŸ¿Ö6±wï¥)2gèÔ¤ˆX1b)ŽŠ)4mIÓ?ÊÜžŸyˆ¢–¢à1 dTe®p¡|ô‘’íý¿F$…Ó£a ª3‰" bÆÖïÒ™.?¾0"ÑË b«‘ÈæA§,Œ¥Vû|W¢Ÿä‚DãÝxÀ’ŽW5EZ¼>EOŽTàéýî"†^! 3ô$3K'cÎ`À¯çݱ¦=µÆ”˜ÛåZ¢r‚LaÊŠ„§ñÑg©þ”ÒPöÿ€ò‚¡ÖB"@!#]ˆ>Iò¾loéù(¡·VD=Íu YH“Ë• ß =Wö|§ íÿ ã!T)²%…1b'rºJ1×ìÆ ³Ÿç[a%{c‰E@5ÇDއ D´ûö[êÃ`3J_• 0³VÔžjÀ7›²··Ú”–%Ïünv3|­@ÔóÎ1 d’e…ÏëæžOôÊ(éYck¦µêK ‚±W× õZÿŒ„ŠX±m•i ³¹j*Ë:Ú &:m&åüÖX5‡ùЂ ·8S â~4%Y¯ÓgT>?Ç C|œt*37êb(Û8c·üî’küE9Ä7â$I¤N½ºÅ™yþûrG$¼EÐEÍÔßr'Ë_¿»éKüÙË<Ñá²e(¦<"!·œRþ»§¯*†£ËÕ¡MŒtVR=I: úëÊ2 ×øÆwL>vÊs ú¥ 5Ÿ!²$ËM Ç¥pÄŸË•EAãæPÆÅŸ'0N†§#=ÕßßÔ$¥óÜÑ"·äÙJG(ÃÍRÛC:ôïý8:Â>ÍÈX"éRa…ISZ6Ôiç?Ô(G·üƒ¤ s?rD3 ;’@›ÏÚ»×—?éÁÖóôhS`,êG Á×Ióé5 Ëôl§ ~V0‹T››˜âj B}!°—ýy“¼çøµóÍ)lÄ!_å3ãù0OsïÛKÝ$¸1b‰, ^›«éú65›—;c9IAÂàh¥Q"õž&³¿ü… RK6-²µÓ:Ä fT³)–ÿÁÑ[NßåÝ ¯Î8æ…WÈ ÉŒèx¼I…?!H/_í ñòS(”A&)­+’Sã¢ÂQ¾½Ò§ÞçMDž 0ÐÙC$k¢>K_ßÑ•j×JÊ /¤í@&·pÔwÍA }üÖzÎßåœjE]/œèq5 jŽƒˆM»LÔŸOåzÙ¶ÖÂ(ÊA±p(œP¤p†ÿ§"KqÛøl‹9RyZ¡3 l‰<àZyñøàÉ”zú¸CŠ©(È)”°5ÃfF Ÿ»cI;sÅ)ÅG;\SµÄ¤°ð¬DÕõÈ=ÖÿÛ1›³])9“&D5ÇZê5ƒ8{ëñm$?†Á&;ü™Ë~p–ŸÞå©¿éé1Bx#c¸d³Gã$§ÏéINcÓûpBãI(rÄ)SsGùá¡c?ï¬\¹ß)Ì5öÔA&4Òª7 v£GëXS„ßüóð}úãk&"(RÈp¡ÀŒÅyWß%tå| DŸ$ЍÑ"YoVÕéõdˆ ¿à BŠX­Ï+T$’g F±•Jž XþùJê…~qÁì«DÈdHk’[–JË_Æ"$¿öã†<|†ÊÀHrÍHÛ^öˆK7ÏÄÊ”úàÂ$Xù¤u¥é3 …]tBÇ_¦Tb¥~•¤lú~¨Hmná¬cpéút"¦œ¿h qvéŠ1Ÿ¡,ØX6D*øÐ©1ò½1óüZ²˜ºrhSc:àQä1i¿ƒ×“3訂:òP‚ØÈ– P¬¦»oì¥//zÎY‹ÿÀ€f,5¨!žNi\À2ǵ2r\ÿÛIXJ8Þã‘'¤ °g%ã呃ëùìt„zv ´Æ”¨S¨ãXW©µ¾¡a(Ÿ—«,¶RÂHM;L@C`]&ôÉ?k¯Ï]%9‡—ÙDzŽuf¾G ýµdRéüóË·í44'"`0"¡è&ºvô¾w_•§‡·îÃDÄÞ6 m)©‰?R4%Çó÷¾²þ±@ ig)u”ÁˆZÌæ×Ù”§øËX¿ü ¦H*ÈÒa:³Ë<óⸯo›Ø¹S“Xá!-¸p8' A&[lKtùz ÆßãB¢•jßjÖd¢ÉJq VF}Uým;ëÿ€ö†›sã9$b 2Â"zû_Z¿Òô€âÿïˆÑ9óã‚D3Šk5ò±›þ™ÔßðÄOø GýíäHÐ `Œ À3Øl6;Ø;ØÀv°ƒ°€ì`;ØþÀý ´  €¡(„(„JD H)T©!RB¤•$*HT©!RB¤•$*HT‘ÿ”ÀßÝì¨ð)~  +ö¼¨È Ýù‡ÿ´«ÿu¹_ð¬çü*Qñ@@p€p€ ``€@@À@qâÀâ€Æ¦F4å€à‚ˆe Å ˜<0«ŽhÎ8gÕa •ä˜Ä8ЧˆØî- çyBSçô¬¥@Å«I}'9Dïš;üjEM:~ÓF‘=š®1›æA‹82¾°f4ý|§m“óÌFÇ&mr¥s®™˜t$b+ª9ùr—Úÿ¦³Â†/V 1Ï’E)æ% ›Lï;•c8oíÎëxr( -Ù#l& %ñº,¿à’–ð‘Ç!¯¸F\Å •÷ƒ*sûq½•9:ïlñFg:ç9¡•% eO\”¥oôÒ Ó–HÒ(³-…Ž„¢½¶n¿L—3ž_ï ’Kz`´ „©Ìó` ?øqŸõù%D´}nPŽŸib¡ÖÈH&÷»äþ^|Ô­óÓYJ¢×ÌÃDæËtk4VO.Õ4’}z2H»A ¿Ðäe‹,í. U£é÷ŽeOåØi)ŠÜñ­\q)f(œgDM†Æ3 ÓYáB—¢¤çÉ"2nÁ›LôB¤ÓõøRFŸë°OƒmÓ+PUÈyГ˕‚Kãp‰yrïÚv ¬ÑrŒUôÐ9SÊR/_S,¬¹-D]bæ–†Ê×:W*a q$m¯|ë*¾¿å¬®¡Mñixž¢‚DBÉ+ãC6=?†cü5Ib¯Lo0–©”ñŒúµ3D×ëqD*ÚH$—íé4ZÁ-‡A²!WÆ…Iã¿ã„t2?dI¯ÛÜÆ ”¤”çÏþhà­ô¬Úp”æjÊEëÿ Ð ‰VÚÜb_ð¯C‰Ʊ¦š#4%›´Gü™ OtJ"O.Šëôn4L‰O!F(‘1J%‚ROøOªq QRÙNy1@–AU²ÿ¢„ƘE,އób[`²˜¢8yÖDœ­ËzòÿL±˜äÁÍkçÿ+õR#ˆä9„`™ Pã2ïÿ)fEQÐél¬õòºÂ5É Ä¶“Ì䌄·ÿ€öƒ Á¨%4ßöÒÁ˜d zCeýq×8yÉËþVédÓ½ÏcÐ1 ÿÿà  •õ¸Hð Ýù‡ÿ´«ÿg„¨¢‘F°0@P0 @°  €€ à@ ŠÁH AÀP ÀD"‹ BB"B3FbŒ9Žbdµ+Œfg)ü¾¾ÈÆ£˜è9’Ÿ­D1Ðf‹6>Ó3HRJ$†\ÿàíÄ™‚\ç;¢!3B”¢U)Tüÿà}ê¦(6ƒÜöþl¤QHrTXp³Å"%ñÿ)uÄ$¢::KõЫ„•@ã_¬„cΕ“÷Óþ[îp¢„QÅ©#)Ï”:zÀ ܤ™„H›:àºsæH€ã žðc!Q(t2Oø_º{–ƹªLAÁ•+·ü±"sã‰Ñ:m^¿P2 ìH†3Ž˜@@Œëà]&QH47ÿ€ó¦³ €BB¾ßO„D#…›Ãüÿànúpg[Ž7eœ‡7¢<{ÿÀs’”&r…O_øO²0* cª$,ÊDº@ú§ü™ÒñÁêAÄ”ÓþRÌJІ€Å¶ß P;+|¿à^ÈÐRm®– ƒ'@½¶Ã-‹sã{¢ãù<ÊÔÓ:D(p$ÑP'Ÿü«B‰ %|Ÿ¢{šæ±& ”Žç‰/çÿ-lÑÌé#™ÑfîçIÈPŽúœ«JÚô­¯úü¾´ f9†"ªŽ\ª¡¨Ü‹Oõœ©‚K †]àNR€ØvL rYAH³1ËþI×:’¢*xÿ€ù£€¤™Ôb5žµ¿üш¯µ$(Žgëçãy a‚…Oê`DU€°õÿ_øˆô¾ŽHE µi†TnKÓ×9ÚçÆ÷=„·÷ð%Ì;(A@Z¨r¢Íæa<ÿà>(GAÌ%¿ü«¤rœh!=k$’"«¿/ø#Ô”‰&X’ŸðbD†ŒË*Éÿ¹LÆÑaÛßþSê€G@ÈVN»†0€ õÿ€±%䤣çÿ-wÌ]+•,(’DS™6|__øGŠ0+`£*zÿÀ|Œ8’ci7K‘ˆÄó†·>¿ðãPç°@ÙÏ?f†€cú•†ÊÁázÀ |Õ®lmrÝm †€2ÕSoø1$Žif„Lÿ—P¨0’t fG…𢤗þUÚxÚè¥{–2käÖU-Q›,ú³¡Â¡k¶¿§ÅêKmX ãcçÛ‘Q¢)N§ÓþA‰@3*+/oø‡ˆôÅ,Rµ‡”ñ¡}•£_oø @YŠRm¿àÍÂÀ&¨äɇfXPTçôÿ€|%* A ÏúòM0ŠD!Ǯ͂ІËþhç5‘Ñ &ÀšoÈ2ȤÉçÿ!ÌD Å›ÂÃòÿ€ù±¬9È : F_/øŽ!…&~¿ðW+±ˆâJŽa¬¯«Jr&w®þ?à^$ÓžæÂ&&Î*°¢!Ð,¿µg¤@ááãøƒ”8L Ø/¤àpynh×þC°D$ŠŠ‡Óþ]Úzß@‹pÈFL„¬è’¯ðæ@š9 öåÕééKT–,ƒÅÒzŒ÷-rÏ/ßøõ¡IRTRÁ˧:ˆ“Ãj¯ëT—ã{£þ­PÝBb‘0™GËs"ëÿ)Ì 8NL³“xÿ€zœF¹*8’ 4 ÎcR?øS¶"$…ÚÝÝòf¹f1È øúØ5ï¾Zº)?ŸY”2Ì4Ër#b‚—_õ$—ãþZïˆð‘@$ÔÄ;*Gçÿ'érJøæžiä_ÇÕDæ`ÌÓ,Rò¯O¯¯ÌVÖQ͵3øõ!nZŽ 8.ÿ¢D«^ÕÏH¿áë#°QHTIT·Å*"¶_ð%#9 •©øÿ€;æ"@ÇȦÆ@=V #øÿ€u¦Y!q9g5ží­¼IŒð£ä”ÅE"ÌRŸü¡×†Úw† 8ƄމçüäIáÐüÀ ;×\Q¶ „“l±Ì‰!ÚI×þDЇÆ×>8Ïoˆ±R¸$f) 1¤ªK54óÿ€ú# ƒ èéãþ?äreJT ïö3̪JBL¾ßðÇ|E–ˆâ`†%oÔRX˜×þAk­È²—ü¯ã”f9—IFÄŽ™ˆ#bE8§§ü‰ÊÒ…E'o)?€Ì&±fvpHd‡oø?¡ÀTEeÏþIÒ*"2?.][ph±&Rïÿ1rÁ‘Jÿ­ Rpj¨©¯üêæT„ ¤môÿ€{1ÈS¹°6E…"~ÿð†â5Ï–hIÚ==gŠU©jX†3‡Gæðg\õÿ€u™ ÐTÆÿðþ5Þ@ˆêÕþ’”õ¤5¶¦Vý>OrÛ)Ê¢b&›D‘q`µ¿ày'Á#Aôÿ€{&Æ× ¤¡Xï ƒ+Nßð7KÌQ‰5 /ø[D‚¢3Ö~ Œ•=ÿàb’X ø=ÑÍ¢!@@ìõ¿øÐI5 ºÿÀ \ d*e ) ¬rœ‡-•R1_·Ë`FÖE,k&ü܃#@ÌC¨C6bYÒ0Á~¿ð—[D”$…“/øSAF!4„so¬ Â p¨~?àE×$qFøÚæ’ùY’‘•8ÿ€²$¨#ãkšçîø½MaYBŽƒ©P+»À%iSþa¹À’ »À ½ŒÃ@È6ËE¹¡)KÛþVíˆqÉÒÅæîí8È#™ “ÅŠ‚\*|¿à~èÆƒ˜b*“?^ EK­rÿ[ÊVPBª¥Çü½°×(OƒP"‹6¬ Ù§üŸ´°ŠY øä—_›¸Ê ¨H OZ¹¶©L©{ß0Ò#ˆ¢H¥·ü¨.JIåýZâ §wo§ü³áE±lIL¼S†ÄŒT‰ÿÀ ñÅ øLç6†˜®Y€äÒ¬|¿àerÖ‚ÈÓ·üÍU2@4ž}ø9ï‹ÿà.9–„‰"{ÿl‚jš!«…LÿÙ.C TX~ßðEê*‚ˆ%”¹¥Ùj÷ËþH´c!²Å"QøcqÆÊ2‚Hå“°•Ý>_ð_d!™*LÞ~=\‘€ ‚*!W§•^ïÕÇ_øƒ‚(Q–$€ú}Ê´+¬É_þAi¯l±\ôŠþ?y”1 …Äb,€â)ùÀ Ø…r „˜©DÓþVÔQ è(”Ë9êlÎÑhGñÿ,ñVa™( /ôÎtd.ýº”Œ$¯%ƒöÿ€»ä,IÁåô´ d%<À ò0h)¹g·ïðõ™‰1HQJF`*:–ÜÀ Ü#žÂ’Gçÿ$r™qµÉ0 Ž›‘,)¡£ôÿ€ù‡PŠY#Š6Ÿ¯K„µF+…·ëˆÈ•"Šƒ//ø“Œ”(É„1åH)n‡b|¼Àzà„™&9œ»À ýP3à‘©d H‹U›Í_ãþLçh!&)$Ž;ÿÀÛ”ø-‰ õò¸ÃEƒåÿ+ö8jZD™ÌÿM(CD¨å§ô¤àßðÿþ  ³õ^¦Ò Ýù‡ÿ´«ÿÒ|½üâüð먠0  ÐpHà€¸(   ` 8=Xd 8080‘Ìγ0P@ a8À!‚:ŠtS÷qš‰^Å,‡ ý»ŒÖ4‚HGÓå¤õ=F—ÙÕ[±¨æ)Š‚Ÿf•@6"GãûbYÌ8TXVÛþ^åÖ¸Î@ÊSR’g#—ü§¾v\c™(9=~ ƒH„¹*(„§¡güÀ žå¥ RHt&Ÿ.Ä-ËRD2Œõþ ‚GŠw_?ø—¢Ó …!Ì“Ÿ• ÕæK×÷Ü“ëØÂ•§ÇÕÏ  QFç¤k,¡gKÛ/ÏõeB b¤Jyú¹æ˜KRD _wÖ´ž2×-?àíEYƒb}¿¶„5ÉQDPñ¯õZ‡ BP¥ïÿ+øÜ)!¡ÑVqÌCÃÄÿàÊRc³±‚Lñ§üÁÆ3²C‡QÀ7Vd·ü³½2Å‘ÅÃO“Á ˆƒBÈ žø”²48_øS¾"$É@¥·øÄDˆG1"¿ü‚ôFµNP¤}¿àCÊ÷>bPeÓ!€pK×þL܈ ¸ä–H=–üœ¦[šå 5’â[|¿à¦K³G ½|ÂAPÑyyc¤ib\Ø6rüÞ¶Ԉ£„JvûÀd(›ÏþCÇ[¢sÙ²CÃÚf PÈ3 (Rt›ÏOøk1Ò‚ˆh¤¥·ü±¸edFH Ë¢½Èã:ï—,ÿà}f %@àßøÖ¡!Õ'úù,”ŠGõÿ€¼”–%Á¬}:m!ÆR´ðúÀyNƺG5ÒK¿ÙëR†A˜"f‹xk'i×þ`µ¨J C†¡Gúñ¦F,ƒ#™ç_.ϰ—zwú}¾8ÆBæ)’›HB€ƒ³Þ?“ކË‚‘×þbã% !ÀlˆÒòGS°c—ü“®5GŠNMçÿ&öFtÅ ƒ`:B•ÔyÀ 3¦J7cãü÷:‚L0‚_°šÆ¬h¬éòÿ€ü#)f)%¿L¨Ž…÷ïþð9áÙ[ø‹”U:#l8ÅH3UPØ ~ð޵è-"Ç¿ÏÐÂ- x€ŠSbg»›yÀ \f‰Š8dëåþ{–5,‘'Çó©Är’IÇüÇÕ‚’6Á¬:ôTB]žuÿ€%:Üs±ˆãþ`à ²¾ @†Õ äÆhÕ¼ÿàþÈ îl$ì›éÚx-9Š4\œ udíÏþ`å5“ÑØC™z¶ò’D4@QíýÊä<Ɔ‹Ûþaæ,³FÔ âúÄ@4:Î$ÿà-QGAQ&TÛþ\Ü*BŠ‚‘&r‘¼ædù*{ÿÀ ½‘ŒC2LhùÿÀ ûAE0ÈJˆ4óëz0'6õÿ€»^9’C“Ÿ?ÆD4¤5PiÛ¡kjâúíDýˤÊJ’ƒ  ƒÊP Nrooø£ƒÜ÷EŽgÑÖ˃„s“"¢øÿ€ø©bLsOðõ9&ÀÐ/~^Èk0ËM¤Ýÿàn’QÑÈè˜Ó;] 1 gg›};ñ¸‰ƒeŠ8£äø{L"’ h(ŽåšIŽsÿ€­y†iB‘“ùÀ ªlå˜b'©¡` Møÿ€ür”€µÀ¶ÿ€p †@ –_çÍTÎsZøúýó µ¬h‰ëjF,ÎåþÙã1È2TTõÿ€{œH Ö-IQÐ3"$r8̼¿àMŠ¢y#{²Ÿ^å6bH1-(÷H̉ÂI¥ãþ_äL­bŽ`+cú瀆 zDeý#83•¹ãK7°ñV°˜¢[#W–ê©OøFÅJNŠ‹ÓþaæÔ&À¤=ÈÉ@69Çü­üîJ d‘QÒÿðvCÀëåàÅh³œ§òÿ€{£*$™r¬Ù°ÊbÌCoñŠA‘HIŒ¹ÿÀ ã"D0')TbjOºÜ©oøW2**)yÿÀ =N)$¸jÎŽ‚‹óÿ€;äÁI3´§Ë”«Œì)‚¶ÿÃË9 †BP¾ð/ElI !‘"Ïò΢€•&Gßüô$E#ÃÄ›Ÿü½ÀÔ1 ÀNȨRBVyÚÿøw:ŒsÉD›ßáØÁˆâK†TÆÕ0 ¼¿àTQ¹î‰†L¾”- ŒrþqSH1I¥Óþcê½ 1Ès$‘fÁG0Áa(ƒø1šçÆ÷6Ýïö,â9e° 2âfuÏ?øgOD´K3ší>OŒAP’2÷€Ú‰4)wÿ€ºE4²G$„L »†˜ã!È]?½ÆÖ%(9 ¾_𿃊dˆ …ÁrœÍ,Z/ÿ+^ôCE.ðöÂTb5J äèðùSImòÿ€|qŒ…"H2>ðnÚU„“ ü¹VCÎU¥díéÿ3t’G=Ñ0É]ÅxÀG‘ßþA‘Å“:K—ü¿ÑZŽ"ˆä•ßK08&rÿà­JŠy%|çì÷ú ž!€Î‡†FÎÆ_/øOÇÌr kGíÐ" -zþ4D'^ŒWÿ€¶¶¤EÖ˜¡NJÿð-ŨΆ'NŸðï0ã|çÁ¬:†$x¥i:~Ÿ¯QWiLt‚'üÊ댗 QÊMD–ŠKçÿ/óY¥¢X£ŠqïBB,ôýoYL2…nÿð&t¢ Ë¥"FjlÛþS‘BŠ9%š8þ>ç G@‡@7dÎM-ðǤ–ibt“Í£³¤k” !$nr 4tRRúÀ >Xʃ¢)åpØ–7®=;«¹²¾7ÆÝßÀí¤c„Œy„T¨C’PŒŒrÿ€vÒB˜â4“/oøgˆpkš¢Œ‚l68´è‘Çü±Æ)%’8¥šW²ß?,B9ˆCÑ$3c%!øÿ€ünˆ e ËôʉáA+SËþJãÁò¶ t\¿ m¤¢I’À¢pM‰jùyÿÀ|ÐJ"’L£?øOicIP3=k$’2›ßð& šX õã©ÀZ 34ôåfá‰SU¦–†ÿ êRP” ‡CtT4Í•þðV k’2±üÀ ^I€Ë¥r¥…˜XÑ ¾_ðM žHäsT…£/£Îy„”$ÉEŠ#“>ŽFœÿàîqE¥šX¡#Ý¡'”d‚¦¿ÂÌű¬ÆRBH¿—zQÇ!MoJ`H¢?àJÖ 6y© ¿àΙ9P0JAÎY<=Ü¥oø¯ ÃJŸð>q @É ^¨f…K¼ªßðI¨ƒØ„ˆ£¨üdT€0W:®ÿðNVâH”ÇüÃÌZd–)V€à’1$ÙR5M?à-ºä À ÜnHšƒ®¤s¥m—ËþOò²yœøæ•îLÞMq˜¤ÄCË>C<·ëÛGÙæC$‡"ã&œKºI‡Ÿü‹A2,;;K§ü»Õi \«aÈŒš%VyúÀ1¦)ކœÀ […!r`¥iös&•Ë\³ßþgÎÈç±!â÷i•MÌZÆŸâÕ”ÇÇ7Ç?õp;ë8 ëG*r<üÀ 5( "„“J>_ðŸd‚˜j‘ 1‚d%B|¥^?àíJjK:eÿ+lÁìX†*ÛX2b»ß[ÿ/ãâB… ä)¤íÛÐ3u}?ZÈô Em±µàO%( gŽ×5yn¦Ï?øN¥% œâJ(ž?t×%E)„™ZSÃyÀ œö…BPs??OCSÈ#ˆmù\ƒ¸ Œ4¼À üÇìAHTßðÿþ  ÙõæÌ Ýù‡ÿ´«ÿw(tªc}0 ,ÁA@ €` 8€€H*‡€x€``( L88P(€¢†ŽO2Œ@g€×‹Vv*4‰HÓ–ƒ¡ä(†!ˆh¬~Ÿð‡{Á Ì6^ÿïÏ„µ‚4¿* ˆˆX”:{ÿÀ ¾WkH›-Z±ˆC“Y}¿à,B{ÆÇ$±rü_¥d†•Ä…WgfðŽùÈ2$‰)4¹À ËH2Â#p“&4$€QMfc¿ü©X óÉ+`ýÞÿr[ZDpTq©>ŠÒ­£§ü¯ÍYŽC‘·¬G›Ý¶q‰aȲ‚šííÿ3u¢©æ–& äW£œ†IE(Ž_ÖB¤gC?àÊXúÒW<„}-ÐÊ«×þLá1LT éÿ&u¨à[’£‘áÉr‹_üÿà<âBH³$I$·ÿ€÷ÊEÀæõ×#’ù{>VÂ_äܲˆfZ#»Šñ€ŽbA_ø/,™×9D¶—ÍÌX> s`¶5 €ÌuÉü¿à |<ÔÍ,š½>…ËbX’ g ¬õž»ÿÀ »Ècˆ¤IŠÇø(R%tüý!%¶¦Vþ°o¼àdN\…(Š$vñÿÐ" ©Üâ¾_ð¯‘Äè”6D…˜à¢P¯ çÿ)nTѬæ*Žm¾D‘8È)cnÈFFÒáÛéÿ*øà1‰!ÄâŸß„Q¡;J·ÿ=‚i1µ²£ý~Ï„8†HtÊH¢PFÙëÿ"ë•D¢Çÿ.õVc€’áÜ)”Rv'ÇüÍ g ÌY»/—ü‘Ó“9D#ˆ#Ô•¸r_ðßxä9 8â•ÃqÄÊPq·ùÚILl¸,óçúyÍBˆqMRJÊk KÜ¿àœñ ¢_™DH’FÆr‘º®1Š“[ËþJåL¡CAÔ<Ÿg’c,ƒ¥ÉÜHž¿ðOc"(¤Î#×þIê`ÈràœÛ6¦’½?ø#Ô3dÏÇûîEhäXÿ,j)±ÉIüÀ }U©$((9-éBØ Vÿð6DÆ×6y%|ûô#„Š"Øt,BwGg`‹ÓþOâ¤ÉBÄV·tëòï &%O>òˆõƒCŸ_øƒ¬ÓK$²:'EGˆK ¢4Çñdb >Ÿð¿¦2 D©zqB#;¤› §ü‘y¨@›+c’þmKlt&U ãV• Á|¿àÞåOD$bƒŠ¯GDBˆSéäǼ²¦TÓiüZ‘ ‡!ÄúŒ„y† ëUÿK„IppNOãþaè­‹1HR †M„ hRfãþR؉£Š6±GDÿ””9¦!ÀK5”™á@)yÿÀ <Ô¤Jƒ‘ãþCÆ "uñÕP2¦˜ÛÏèùNÛÎbä;¶ÚÊìðGÛþQ‘ÃAHìè¾ðÿU¢(ÐD¨àhfdð0E§ü¹°ç0< zÀ \ï+¦˜ž•è%ZN“¥sÏþgÚ%$E3çÿåÀl¹&ŸÊµ•I¸£ýÿ$BHŠ'°_JA!*na©?øFÄBD!÷¶ö‹Ñé#a¦#„·÷ùÿÀ mg…ëÿ#s¼IŒ`Rmý9%6rpßoøWÆáˆæIŽGn_×J„“Ç ¼ÿßQJI[k^ß·Íð;íH’$UT§•žó4^ßðnúHQ‡JOéóøå9 CÀT;Ö@¥”«//øsž¥¨è9 AóôñÄ8ä \¿h”#gE#/§ü·é€¨ŽgHÈwiQ@BÕç§ô¥scŠY%|!üÛ–r…ÈPVrx@»À¿ÉÀ“;I¤^¿ð_„ FÊ·%ECH%T¡gûÀ Ä bLt&Ÿä-ÉQÄ Ëôh•†bd¥.Ÿðÿf" G!Ì“?*bˆîϯúèˆfc…j|ÿàN¸c$êˆNF¯WBT—Oø?º2æIŽ'ßþOÖxÖ£• ¡ùúA2P–Ûø³R Yeìé±eSÈp“ɵþ«`Ã[«ŽŸðUlIŽA¤îóÕC÷ødE!"kbÕÇåçÒ% j ˆÈ¾läbYËr#¤híöÿ€| U6ôb=?ˆb"ä‰?óÌpC„¦–ÛOøÃaâ­`VXC³l¥8-µˆÿð½‰$])2Qòû|tTBC Å¡IŠ[iÿ/p\²Jö)d8•þ8ÚAM5åÏ¡r|ŒŒ„“éÿ-úcÈé ô'UÄ!Ì2‘fÇÏûhy dªL­×þdíÊRG1LuUŽ5¬¦®ÿðnÙÐ1ŽJŸ/ø?¹Ç!Ä— ¬í AYLŠÕÛþ`Ðs ¤xv”_þJÌ0ŠDj<|ð¼"¿áÿü  ßôÖ2š Ýù‡ÿ´«ÿ>Ïç¢Nœú±€(X.p@ @, p$4Á À` 05ÁáÁa àÀAO0\‘ƒE!Äp‰C¨Ëñõ8RBHM 7ÓÍ)’SÌ3gsÕ—üÁÎh˜£ æIŸoõÔD‡º¾?¸ ZI­ÕÇoøºó$Ç!Ì“E¢ã `w aÇü‰¢¥ÆØ×Îäú¼”"8j(Æ@Ãô?/øGja¢a–dïóòV"ã˜b¾s‰Y—¶”ý¾O)QÐs%"¿†˜ã#“tþõK±ð{Äiúü®)#€ïz,Á¤I 2ÿ€²àÙZæÁî‡ïÈx§HÌU Îeñÿ-õb6õˆ¢N¿)ÌpÆKß8 €?øSÉ’ƒbrôø-¡Ì”Ãrÿ€èaÅ$pJRéÿ0õZ£d)ŽÔëªj!Sëÿ(dLCcCôÿ€¼SâŽÂ‡™²jF°môÿ€{ S$I2G§?`àQˆby÷÷¤iT¯m1”¹þ~“QNk"„JQD2Sƒ—üŽÖ-FIRo—Ï匤]'ž¤˜âw«ÜKöÿ€´"If•ð{›|]±Ž@€o=ÔUægßð¯–"HS,ǧûc%€þ_n¨Ô×£¿ÏäøÖ’ ­ $ËS†pTâUóÿ€èD$tŒCo]_“¢ÔE Ä*-I,TãþVé¡(„¡-_óç;à”% Æš’ÝYÙIKéÿ,ùã*yÀÉ5\ºP…¡d)¥\{u^E¹±¾7Æþ_£å:È0BLq T‚‘•ˆÈÇ/ø'}b9Ž%I7¯ü›Ýˆ¤8A%„ˆÍ„ºóÿ€9E³NøI+Õ_bšÂ”ÅßÍ1˜Àìd¨ý¿àªÔ‘pn_¦t U?Oø+œã•@§×îòL8’eÆÖ ª©’*yÿÀ¼ŒŽ%I2öÿ€x“+ØÖ-0œ,YŸJqOÛ×ì)HS p•ÿ€² 0)Lµ©÷+ JNJ"ž?à^ìHJbènf¨E&¸ºù¿ˆè) 9ÿÀ `“% •,(’„ªÆˆlmòÿ€ð€E$™F¿ðŸE C£ÃÏ¥Uv®yg–_ðVåœÇRTt$ÙyqE4€3C·ùXf%cUßo·ÇL³GcÉæ(CÑ`øÿ€7L• €ìm·ü¹Æ)C•O1áRBHKJ<À ½–˜¢JzÕÙÑ9  ËÏÈÅ@–ÚÚcùü^¬ÃÈriûÞ# TïK¥“±¬{È_Ë´ÊZ 9а @Œâ?àÏÈMƒÜØæžmÞßBN ŽD³2|•%Óþ[ê­‹ Á D·ÿ€ô•ÇTBzð’V—U—ÏþVóL!ˆb™Ú=óÂ0uTO?ø£ dXvv—OøwªÑj h±‚3D¢)Ï_Ÿü•Òš'’WÂ)bÙéòãbL"€žé ‡„¥Ü©Ïñôùe9 dMüZÜ#•Sãùd:$ÍŽoŽ_䨔Ž(f—^œcJæ[‡=Õ( "‰ÑÉzÀ üƒ#@n¤9ÏYÇü©Æi#|rAî‹7§½d\’ KIºKN’j?üÃ݉ BHt$›õïpÈR Ç2þS<>—Îø×?çéŠHÙã¶F¯-ÔÙS?ø/=¬‰Ó:HM‹ùü &¹*)L eiO–þ?àmÇ:–£ æ=>ž8€I@Êaž~S5‰'lµË8¿†³¢I"‰}l1ž¡Ôßçí0&pxR?øS¾#ÇRLS,opO5ƒ{—ÓþWÆG\B‘(X—§ü«Íhã@–ƒÆHÁ)Qêtüò $#4+e·üÙ¹±Ñˆ"Ür³,â8ÊrTvóÿ€êH©Hr÷ÿ€{œ2E–J† gp…JËïÿ"zŽ” B¢Y o+0"ܶ$CËadlì­ôÿ€üqŒE"Hr8§÷Æá:ù~ø–T”*§ü©ÞñÎ÷-É)†ë+”ŽÈrÿ€øœ%©E#I7¿ü§ç€Ç ˜ô BU h’»äcçÿ,y&"Ps …¿àSE2¡ }äS¤I™Ú\¿àÞ¬F)b ?Ç"E ™SŸü‰¨æY›ùÿÀ )ˆ!@uÍ… *ª£³·/ø'}(]§Äa¼ÿà¾èÊA‚#&ÌIlãvvïÿ1t’‰bƒÝ"ÍáÚÕ5 $\yD3ÆOíÿ2øf1Ès.”šŽÐ1V·—ü•Ê2˜ª)‡íÿ,x¤&„Œy€Ü”ÂyÿÀ¼ÐŽ„¡†^_ðžñÆ’˜dAë3«´rJqŸóýû–r !Ä™|úˆô,²Qã_øÑ"žOãõu^£˜d¨£öz© g_ðÈŠ`<Õ9ÿÀ \å6WÁ¨N…*@lù/ø¦ÈÊAˆèqÓþSä¤G%Ž[1œí\NTïÏþdé%{¢ƒÜü\Üi1’€ ůú=…0ÑbLý¿à>ÌH(¢Jn²³Áµ¢?àJÚB˜RãþTíKœ 6DA‚r•É ·ü¯ÅZ Z]?à>¨‡ÀÐGŽdfEkÚô®Ÿðfå¤CÈr|¿•äi€ÕNªYÿ–9LR,I¾Ÿð¿–0YŠ#ˆe-¤„`­pq¯ÇüÎñ …2£Æßð÷>S•O Ä,ÖRgh´#ùÿÀ ½™S% QH9·å0¤Bzð’Vtv“?×þ^ôL9f–'5FF\É0†©£g¿ûk€ÔR¥Ëþ_ê¼E2XpYØŒÑ$Ø8ÿ€¸ ð|´K4"Éçñ,@QÚï@Æ@€*N»²åMÏþcìÈ„¡(9aãý±Æ†fAõÿ`%ìùZæñüßÅZÀf:,€ÊS–@ãþCâpšÅÁìRÕŸçòÊrIpÊcŒžut)eJË¿ü½ÓÄt$Ç_þPÔ1 bHÍóøÎ¨ ÇüÏÙˆÅÈ’¥/ÊÁAPîµãùhxí&R4ëÿ2uŒÉ!Èq):3“ÀtúÀ ÿ¦ ŠÔœ¹À üÖ¡q‚à• ¦Hû,§ü¥â ÇAÄ µ/øÿ  sùn¬ðÏüü¹ÿþ Ýù‡ÿ´«ÿeÅÒ]ñGxÅÆ?"À@@   (°@â0V‚A°°4, ƒ…À„†ÀÃÂÀ@‡™(ðÄ!Â-„´ÜPS2ˆb(†VU ?ölV‡•4 9ôÿ€óË©"n³Ö “@©Kíÿ&J”®ù˜ÆÄýT ŒÙáÇ/€øEg øÿn)+,V•!JÝʰT"’›uþJñÆ+hŠ6Ÿð†CœŽÀj)†JJRGþÿð[etò¶7ËŸ–Hßm K£ÇXÈÁ³è¾ßð&Ä>2LÃ>µÃ«ÌÚÊ3]~±yç<ØzÿÀüCR.–Ibƒá4ñ C)‚¢—ùæ\†Â&Ezø ¬žc…ß%38šä}¿àúF鯸Û.^Z ‘Hå° =9G{ÚxnÿðEà×…Lù~·”I‚ȦoMÿذQmW1ïÿ#ë;š8Ö6L¡K%%#ŠËíÿ FÕYLŽ™„]~}‰À×$¤RêD¨KUùÀ 2@ê²vÊÙÛÛ"rå‘IRÌXUlj+’¨ˆçÿàìǘÙbsÔ«£jc”–’.ŸÕ0 ù€9ÿ·×+o€ªY–g ¾‰…ãÝÔ*¿^DihH”ü,9±±š_øÿ9PÎA¨Pg÷¶JÖ¸V“mÓçJ‡Y 4Rçÿ(^R‘K66zû¥+iÐ̧ü2eE IX_øJ\š§HŠ"³Z`ÂHòÿˆ•?A$wäÊ|ú‡è8†$¨ôÚSj½e:rÿ€ìAÉ_+ã{ª¾%i€À5ëò¼oJë}k¯ßÇÖêÚBä*()EGø00¼Ù2EÇü›ŒÀk#k–Ű©«¢´%_õÔDž¹E€ãþBÐ37!À‰C¦üaŒ–%ŽHþð.r±WJùäž)nÉ’É’cž¹Ò ¼¤Š[À ×”á]H à)´œÌxÿ€]oyV¾?àeb*±¥E$˜Ô9œ¿oøJu©| E‰bån$Àê9_*¤r€œà{ÿÀúÎç¦X¥|¯Žk^Ä©&8‘töÂq¥D¤ÑÒEÏþTÌ‘‘‰ŽnΊ‡2@^¿ð].‹Žë 5·ü“‚VJ‘%…®ó wiD¢‘ñÿ"lO\Ž™‚L:2H%©$ùzafv»œéÿ'Ü!*À¨¥–äi(5«?×õØe¯uÇ µurº¡jBà”èk%JLŒzÿÀ i”¼¨°íþZNƒTÄ©h,r!”NMB Þ_ðvAŒ’à$Šˆ_‡Dy€¨réûb츭¶¶V§ü·TŒr¶7Æ×65¨¢: }Ý )_pN”M?àÌIË€ÏI!³’+<é¯üŸ2ÕÆ³°[À6 S-kÀ“HÉ@àÌ…ë3árû"Ag™9«¿oø ³oÞ¿çôã! à@OhJ'_óêb]õ®wäé2tqº¢#!L” •êÆ†CßþAΕ3 _ŸèÒ!_‰ÀdYûú6­ˆÇØÖ-E:FÕ{Ëòÿ€§[®Äöâ8«údž(”í±Â ‚•éŸü³TŒ±ÅœòG`ŠKUV ¿ö©A0ÅŒ­ùvu¢1%QLsfã£ÃÉM sÿ€â`—R’ÎYÿÀ yH"ÅX—ÀòµBÎF;ÿÀÙ(µÉ#¥¾ùi)ÈiD.½Üæ˜`|›ßþEÞ– sGGT#¡‚Y߯üI–‰äPØãø+!FgXUIVQ%Põ¾_ð,L9;B(=Ò¿‰* %) ·èÂÅvx¥mùŽ9d%7æ:.óœ` F¿5$-À*eKþ?˱ϯÍl)D¡ÙT™þ¿­$[q" ŽÛþBàd¦Ø4 ŠŽÊfAPåÿöÎß1*I¼u…áDs‡r¼ä $²çÿ*Z¶÷ºGHê'ÎɈ™NA$ßלæt1[+i¿àš”ÁctLz„™R£š@,2qÿ"ZD¢y”5n?àÌEaLRZm$q©¬Â,ÿø.Ř1"·Oê’<On]ú ü UDè ÷.9([C#N_åb\•j⸿ۖ…0W9ð{Å©$#›%‘¹ÿÀRª®CÏÏýôÁÓÐÏbÊçvSžuýà˜ûqº)dŽ"[quÆ3çøpíl±Z^ÿðµ±:ÌSG#ž 3Üu-I%9×ÏýŽÀVÚFƒ ñëäâZƒÈ”Õ4C%†Phÿ§ü‘JJ|OtP‰ÒbßL84€2ðé8ΡI@÷ÿ€ö¥†Ë°Éã’""€§íø¬ÑÐEi3üÀÜjZsHç¹îzšbÁM‰çòÿjßiTs—»8 X2E j;¢QT?àLßð‡û»ucP‚B„Š!Š!”ˆ‘R ©!RJ’$*HT©!RJ’$*HT©!RBÿ€à.ÿ-R8 À`€ €ÀÀv°ƒ°€ì`;Ø;ØÀÿ€Iÿà írÿ†;p  óô”|z Ùù…ÿ ÿZý`ŠJ™¥`&‚`€X€(à `ì*À p  Œ‚á@`,(4@L@L@T>½ˆ ÂB 4°‰Å„`ãHd ýüuGPÈE?—¬SGèŒ#ˆÃô?Oø_šu½b8QóóRK–Ä_XÊ|€Ð±¦×ù¸ÒuEAÔS3ǘâJŠ”ëŸüƒz–ƒ$”xÿ€z«1Ä’.vÁµ´3`F-¿àÌè<Ö%óÿ€;^4#@Èaáɾ_ðƒ†C‘bR–ÿð_$æ8Ô± ×_‡%‰Ñwuooø›¿f(†CŠ>šA\–  Ni%=¿§òñ!Ds…®p$Î…Çü±¨Êø>qü^§¨ÉМ]@FÅm%çÿ-öZc‘jI j¼[XJ €A=¾Ú‘Š*qmŸÏñ|­„N‰†HsÝzPA}¿àq˜c‘ZEïÿ(ùã8Ž\mbPp)²<ÕXuÿ€9ìJ,)[ÿÀ  3ž©b)cŽW‰_ÅÿãÚd,ÉHÙhåÞ£€ @äÛñ ¥ È<,yÀ œæ’Kr˜NC€tT8ùÀ x œ¢Y¤OËþWæq9®k€D YTÞçÿ(x¤ %ØÔsß?FŘQ säRGÊ[))}?àŸL§2Ds.qÅÛ€¨Y†Œ©Çü‘¡`#Ž»˜?×îõXd™´®U°ã;: @zÿÀ úo…‘FHŽO?‡t¥ ÄSA°NhqŠç\ï—üѨ«QÌ@ãoø3€ÈS Hrþä@EX42øgωdlé1èâ ¨(êsøÊb¨l<¿à޳QБ‘¡ª¾Ri"yÿÀ½¥ 2È0ËÓþSâœÅÄQ CI$ˆ¦ÅOÓþJøÖSI!ÈüÀÖ$BHÎOýÒc)×%'íÿ.ôV„™f(!1å!¤‡yÁ¿×þJÌ2M‚Ï9}ÿ¢¹RÂÌYgHyÓ—ü¿¤ÄJA†Rõÿ€z r‡Qfµß„Æp¨™í·üÙ°©0È–6“Ïݪ!¡¤ÆC_áä06T2TúÀ >¹NFÒp}â *+VMfÛþFÝBT¼I@È£¾"$à hrEešÍQQüÀ |Ô˜bIŽ!øm"(`ÐGŽdf…K¼«Ûçÿ,z&Èu ]?|FZ %P’éÿ!ÌÀ) ÇüÃÕjfÒ!Êæ'‚T§åÿ*h)Ì)%|"•ŸG|Ä\£„sÑB&’"¥:ý?à?,¸–e à‹;ùÀ—¿/„%äZí¯íñ|k9*)† ŸëYD0ª‰çÿ#Ô„ ‹ÎÒéÿ/ö^"Cd†F͈§<ý?àn¸ŒT cl¿àN’©¤zO²š56SË=ÿà}bQÄPC£¦ÿßk€î²Þ4ÿ¬¨9$VÛ×èùÒÛÖe€ ìºFQ%{ŒŽ<ÿà›™R99/oø´¾4“ ’2}%^ðö¡G@È­oçÝêI€$]9ôi\[9ý¾ß\åA!È;{ 1ί§ïhš‚H­µ²Ûþrå{¨„ÊCšfr–æçïÿ)Ü¡‰¶¶´¡dÃçñÆ&¹*)L 4ÊΉ+¿—ü¹×qHU% ßþNÔ1 bˆÕõý¤PƒÅ:É¥ãþeð¼Å$IB_¥‚±Ý-åÿ#N±aàÐþð×¢AËšæ©(\2-YYÄÿ?øGmèJŽe©b?o¯ª’=ÇL£š ;b¶ž/o¯·Øu˜d†eïáÆ² ,)„lœ¾ò(’Ó9_Nßðù ¦Ö°>X…]Æ!J79 ëþ»B èT6ïÿ2v㎢˜¦c"#ÑÙ—·ü§Å:’d˜á:'ŸüÝ‘0KŽa¢Ýe@æçÿ)x¢Ì•Ž“ýø,ÃPÔÕ<ÿP1Õ@Œž?ð¿–BD’$ &Ó0¥5™Žÿð6Ép¬~ßð—|CŽ&5:Š2É*Wéÿ#úXøI £‘‚LÞíó•‘KƯ”"AF†…ž–ý>/-ȵ‰QåèÐÒ%… yÿÀ­ŒBz‘)Ò>Ÿ®“‘$]'$ž! `hŠsŸü±™%!Ì1.'ÿ*y(1Ä!De)ª§FYïÿðtCˆ¤JH¼ÿàþ§ªhaùï䇘z[-?àî Ž‰ba’$»Šò€Ž0E-ÿà0eˆ]§Iôúüq¥M¤âñ´Æ ƒH1ûÀ ]³ 昳O‹­ãª[as¤CÕá]—·ü¿ÕyŽ"‘$I>ÿðvè9"<¿=2zZöý>O•°’Y£zwm´EÀª‹ ÛþY¢°2ë8 âù}¾XÌrÂ(΋vL,í;|À «G0ÉûÿÀ \hkPHÏ;ö@ ƒ²·ÓþWòÆ1‰!ÉÅ?®WæTt£eý¸ÑP“+ål}w’AË4$tHUL‘¤ÊIL¾ŸMÄPÈt$†9À ½–à$°¥*…4I]ò1óÿ€»â"Ps ‹À \vÔò¤ §ì6 —‡çÿ1õVìfIfÖ´b°(Œ¡%>ð&¶:†`ñÏþbë)›JçlkbFUæZTÿ€ñÆ1 Ejkÿ+ò^bd)€´ÊSy©9uÿ€:ED±G$±Aº;¼KbØr!$“„”°fLç!—ËíóÊs$… wñ’b¤‹”É£þHžA²†\ë”RSùøÉcA-K0¢aS`¨ÒB÷ÿ€{£’…­Hõ÷u8f9aŽe)ÀYÒ¹Ï6Ÿð÷9¢ƒÜö "Ww,†[–f‰§&Ýò˜K•"PŸoøgÓÈt%AÌ¿jÄŒTœÿàªRAcDÊfóÿ€¼Õ—*à•æTvx¤íŸü³¥IŽDÅ"YÿÀ üVˆQ1(8…=z¸Ëðhsçÿ1wç)’£˜¤.]¢%°=ÊC*cEgíÿ1÷b2HÙÒ6HdÒ‘¬ÙçI×þP­ª*ŠIÊ/ÿ,r¤ø=Ï Ê”Z\"’øÿ€ú/2Ðq"Qçÿ"õF2@0…>žS{¼ÔØÏ ÿðwlB ƒ‘c/øCplz– žæy¼é{VÛÿÀ {La‚E¡³ÉÃZ€è)ŠÓ-?ÇŽr$–á¹7æøÖÙJ4Èt\âé!=¿à¼p9ZL”§æèÈa˜d%ƒeF'@a©¶_ð¥EQuÿ€¸ ªi°9?ŸÖâÒ ‰Q Òóýž±hIŽB çÙ­…ï½ Ø66¹ñ¾5}^j Ä— C”˜–rŸËþ]Ò…$Ç2L’õøv0¤l«rÐq8Ѐf…Ÿñÿ'|­ƒÜ´˜èM>^K’£ˆ Ëôiö=Nçóýb)d «ý(aàŒeþ¸†ŽyèºVŸ?«¶A²$fT€R»!£ìñôÿ€|%9Žd˜âÃÿø  ôRö Ùù…ÿ ÿLˆb{‹-S˜€4€@8€`À>€p0 p £ øÀÀAƒÈ€ˆ Pˆ&ØyBŒ(-ÁÀÏã…!"(Ž!¯ÊÁ™!eÿ#fÈH£Yág·üÁÒQº$ Å!Lƒ"2âRÿ€ú+BL³$Nžð?t#cÿŽ¥ Ðwÿ€:ÅŸ£‘Ñ_ɱ&; q“rÿ€èCžƒ6³„}¾ßŸð.™È3% ¤ß/øOÏ)H’‡¨Î2L§hïÿ)sØ4GBP–¯ùõ¥±œb@ÆÝ™R7aNôïöûý3”GÈr,Ú® ŽeGJDÿ~õ%‹bN‘×þdëÎ|"QŽ Ç9ÐqÙÛ—ü—¾tGBÈ­ôú|²¥!Ä0L CNðÇ>3 ¤±ñþ¼k jr!oÊU”””Ÿ·üÇ݈ÉSk9Š8ó¨b:$zóÿ€µà6T¢ ãŸüÅÖP!Æé$šS ï&ILÓéÿ2åŒ`¥˜âvù|þL‚€†D%$sÄ/Çüɹ%FNÖúþý¥9Š4$9Ëý$´f”’Dþ?à^ìH ¦)ß;"‘ƒÖÿëhÆ…1¥«>?àrˆãcÌ2 15YA,Þö¿ÓþcÚźhätP™¿“IˆP\R¨¬å¬@*¿ðY(ž'5Ñ9è§ÃCSÔ1ŒA¯ðò •ÇüËá˜ÚJXHaElF8ȱQ*åÿ%f)Ôtrcm¿àÎQ—*à–,ÉŠ Y¾NŸ/ø?Ç9DR$Å'ÏþOâ­1H2÷ö2X›ûÿÀ isG!Òž™wK1LÈÓ?ö{ÙZS£|¿à<¥.•ΕcX€Î¤ó’zÀ \uPUÆ’öÿ€;è6U¨æ“™VLŠ‹ãþ]èµI2LQ&<ýÌ! ^ý>·=Íe+oÛèùÚçÇÁôãД€6 ôñgŒIseŠ8£æøþE›*ÜÖ,ÅCÀ§6EªÄÀ Übh°è¾Ÿð‡l‚(â(,_s&v‹18íÿ.÷d!Ôµ$€{À¹H) ˜ò®_ë|‰AŽn5þ'ÆØQ ”1H,¶¬¢Jæ;mÿ$ÜÀŠM._ðEî±C0 *L„­)á=?àN:Žd¨¢ 2õÿ€¸Ì¸5É ¥?s™¡8I4¼À =W˜`„bY~\J8ŽƒeÉ’¿ç¡"«¼*Pþ¿Ñ1a2†aäIçztteLÿà½7²(I !4|_’–(-Ç* aTŠ 9Çü±Û”‚è;??øq’å¹$ž¾XÌ+F,å?—ü¯åœ …ˆ +7Æ8È’ E˜ßë’¢rcøsÕb@9†bϤ¢Vz­e5]ÿàýõ˜b) J^ðO„C‰.)ZHçVr RÚßÇüÍÁgAHt$ˆþœ«‡@ãÇÞÀE ”E;¿ŸüÏÝz’BˆYÓÓ„¢€G.ðc6ž(Úè¸ýþĬCÄrœž Ç¿ü›Ý$Ç2MF÷øü QIpÊ€lm82y© òÿ€:É4osÝ ™|z€`3,n«ËôŠ´ ì‰ÏcÙWêðÌd˜ä9’H´caÌ1¨õ4>¿ðé†a¨d4_Oø[Ía’#‘dfw%…~—ü§¼óÍ %™Ïv¿'¥sXÕ$‚3¹ä)‡=Pã¿üÉß”èJd äFÝÍSL‘‘ÐrÿI”'²(=‘G4_˽F)d©2¦r•‚péÏþJãÀd’ƒÄ¾W|@ 8†SB8'jOYïÿ𯞒™jY $Íðæ¤‰B0~:n• CP:ôG§é눢8q®¼ú–@8€ç¯ü‹$â9—ZHdü¿àìH9B˜äZç0pq&r-¿àLÃ:††ŠGåÿ+x¬F§ˆ`%9A‘³²—ËþUóÎS‡BMhþ:ˆ!€ׯë÷1DàëÑŠ¿ð·¢`2DPµÇ#ƒI7ÓþCÓY(9 Nœ¿àÞÌDI%Æ·%M„åZVŸ§íܶ>7Áîl ëçˆnzP¼ù;E%²’ùÿÀ =˜r BM'NØ ƒ±/Ê 4,ôÏM?à ‰H’fÖeª›ä¹xÿ€èp¢ŽIfŽ'D¿Ç(Äqt¹:Ír:ç=¿àmËcå¢X¡$ójîí*P1 Ã/ɪb5ƒCO—ü·é¤è8ŠIºrëQF† ä´S¿Ž³©ªBLv?OøcÕ@Ž…Ú”@5€%e…]ÿà½÷¨8$ËÛþ[輇"\1346*VM6ÿ€:q 1еwÿ€:f!ÈvB9r(V·ËþYóÊ2$ͤãf=BŽc–¡ãþDÄQ˜ª*/ÏþXñH(’d¸â:T(P†O—Ÿü‹Ðá˜â4“(ÏþSâ¬ÃÄ2% í„–VÚß·ü‘î:Ðs pkÿÀ YŠsh‘Œcô++ŠÚ¸¾²Íôò9îkR ÑcQquòÿ€8ÞC ¤,sÿ€»òœÉBPq Nħ4v¤a½ÿਠ)dƒT†Û—ÑЦD@(Ž„¢å ¡Ï8gôÿ€<Öæ€èŸðßeêI e¨¤›ÉŘED!ǯ5’³§”¾ð×¢¢ C!HQþØž!‘^iëÿ"áZž¨¨,K§ü¿ÝˆØÛÐCÀîpq$iðÇ3ˆæ)ƒû|òè˜öä–6•N]×ÇüÃÌYâs؃ñ{·ÎB• E—øÄ°"ÜYW±¼¿‹Å•¶”IDsÇžÕŒG+Ðý?Ó|B æv”|¾Ÿ§1Ès%Ř Žˆ¬ñÇü±Ê)#k“ÚÀ Ü 5H¦ˆbJrò¹ÆJ–«eš¹~¯ ÈJƒä›¯’!ÐSÓ~öÀ©¶6Ĭû=à$€ ϲPòÜ;-}à[ ”.’¢Tóÿ€ür‰®JŠSa3 IM_ëÿ*y¨2L1Ž—ÿ€¶”¨ñ÷÷3Qh# .ßðVC C1Ì2Çñ¥ÂJ6;¥¼¿àjZ!hm(çÿ0sÄr$G+ç7)E* ™}?àœîk³ "ôûz1eÁ**e###Gcôÿ€¼“†"‘QúÿÀ]4â˜/Ò©L3Þ½ÿàL£>ÕÎ_ʆQ8c×dB9’e#N¿ð'X¦„P{ÄE!ªÂÌÇøG’± ‰1Ñáõÿ€y/@Ä%°æSɃÐÐwÿ€;s AÌroñ²!ÈH).?‡À…%‰4üÿà_ ÄÞpAÍŒn:fšXø„…QY‚ŠBâû<Ö(‚£#RÃÿø  ùôBH Ùù…ÿ ÿp/­]œ®[}¨À@À4œ$Hà0$@(ƒ@‚ Ä@@0€àÄO<p ŠRÍ’‡ 1¨ë™ SaqA¬£õwbco8 ãdSÄ(Ì"œ½?ßè)‚¢¦Ÿð×D׿:Ž’Š+^²Ú\|¿àc!H3ÊÝ¿à>‰@¨h„2?NV‘,•m¦q½Ñÿ7RÑ,Š2D–r^Q  5y—OøhÊ@KJ·üÃш…!DsO¥˜Á°@ú·ü™×Ža…mè›þoF9!€ NtˆVÊÙ[?ø¯‰ÏŽHätN‰Ùú{ c¨¦ÒëÔ‰ˆq²¥ Ëõü<’YeÀ£^%ˆà2ª;xÿ€l!e÷8%Óþcê½1Ì™Ó`–wT¬¾¿ð˜«¬b9†'ïÿ%sÈb€#·>J„¨%÷ÓþWóÎ2‡1L¥Ÿñ¥ƒÈ‚õþÜb:“,Q½Ít?›sá"ˆÙÚåÇec"FÑ€6ßþCß9†8âbEåÿ/öd0È1Å¡»è¨eéÿ/sÜq ‡BQûÿÀ ]tr@Q×áøÿ€{3¤9†"¢OñQ³…&Tçÿ#n8€˜Ù°k¡üÛé#Œ‚j–VSYXx÷ÿ€sèƒ]²Aª6©ÆÇb#ƦÇdQÀ ÝxÖƒ˜d)—¿§®cà €±üðaÜ0gC/—ü·ï¼æ9†" ä·ßÁj”½?à®|É,[¾OƒT6DA5K0¢pÎÑ)!„õÿ€ü%Ž„­HõøvF3‡DD”2„–VÊÛküÿ‹bNC¡$9?—…B:…˜âÿ,ìØÕÉ|À ½Ùs C ©íCØ’W¿ü™²Å,ÓÍ,NgÙß@›9ÊÈŒr ]$†J‹ÓþQ伇BHSR%Ÿü£Åx…`#^®Po ‹ÿà.Ük2P’‡Ÿ»d€D c×ü¤Rà—68£‰ÿÏÈè õàe¹s´@gRyÒsÿ€)Kà¸>8'Íðz†ÈˆUH"ˆrÉæ÷R_ð¿5lZAˆm+À üW˜AˆSéä§½/kÛ*WOø³bRI$‰¿<ÆJ ë2Wÿ€èpÄh訽¿à>ÌJJ Bv` ÌKöÿ€9q®´˜`¤¢ÇÒ ¤`‚b+MÀi")|¿à?çAÈ1J}?Ó|e È0„~ž}ʉe-$”ë/¯çöT 9Ž¡¾ña$Æ^¿ðmÊ\ms㊠“ùx$r1jz’Dßð/†ƒ…Ç5:Ì€8 ƒ%ëÿ'rÔ–\aˆä)mÿ-nT58Š"‘PúÀ }š5£PÈ Èá°zûÀ Þk´²«ÿ%d8Ìt<ž¾^¨¢Ì½åÿ.úé¡$Y’1ðÚ¡”CR•ËoéŠ# ¤”äÊÜÿànýeP’‡E‘QæúY¨]¿à~‰Fƒ èJ§âæ ƒÌõ6rBtgºwÿ€9@æ8’ÒJ5àÌÇŠG#séúPaJt¾4×h¤þ¾'I<‘Å,‘´5maÐ1˜ŸôÔ°0Ä$ÆOíÿ*wÌ8äcÔ(,:<ÒDµ¦_oø‡KçÁî|&/«²Ä— ¨g´ çºÏþXóPfÞ“$‹2eðÙ ’à ¿ìÓ îîåïÿ,úí9ŠB˜b }nP;„°ãþDÑ‚àø6 tP‡õp‘Ó ©„Q€¼áaÚzöÿ€ú2¦)A§Ÿ»ºt˜äKŽaŽÿE,¡ÑÙ~?àÏUÄ(ŠBˆhº~ú$1Ø0Esÿ€s°Msà×=Í‹ù÷±1PR ÉæS€<<ïÿ%d9H°¤hÿ‡ÿð  ùô<j– Ùù…ÿ ÿ-vü æÍ’¶'À& À À0@À@ÀÀ0Ùxr&‘ƒ‚ˆ¨œ PÁÃ+ˆÇ8!Ì$ãP6þI¦ ª0•rŽëAj8Á"ßþC‘‚[ ×D¿·ÓHÈsƒ74j ËþLÜ Ì”I©À Ý9Ê$˜ "ƒÌàÙÚ‘¬ñÿ0ód1Lr ‹oNf‰AÈ0ñ×é©K0ÍØqÿ1uŒ °#`r³y÷!B=ÿàœy” æ?/ø³"d  „Àê) p™=oÿ)f*T´ŠJZÀ \kqÊ@(3“tv›ÌÎxš}¿à<ã1Ì ,¿Ž&CC™?Î{ÊòvúÿÀ ž«ˆ‘®‘6a8Q*ʾ¿ð}ÈQÔs+._ðÿfBGF¦œ¤Á,’»¿×þTòP"˜ä(”—ø‚¡(HÆ6ðCŒF°hiòÿ€ý5”‡AD2åŽ1‰1ÚW·Ï£CÄQ Lÿ?øƒÙPŽ…Ö“C"ÔŽ Œ³1ËþKâ¼CRøo˜€TÌO'68ÄQ#øsŸ9ÐÛÎ!e§ü‘ Q ‡aDFÿ´Tž4Ê4VvùÀ >yÀä†cÆü¹Ø2${Ÿ§ü•ÒQQG­‡šàFa6QÒá•Ý â•ùÀ øÐ™*)>_O„`PADQ BR¶Øý½þæÇ4$Žˆæu÷r´@Q™`rò,•.¸ËYæôòAðk—°ëÕc„RB®.¾^^Xˆtƒ¶ßð9ÄqºfD``ªÆf6÷ÿ€ütH3Æ]¿à¿kœâèyöqPçŠë–·¿üÙÂHI© 2çwŸ 5Ë1@dÿ7™08zùßýÿgVBÚVã¯H(äbvn¿ðg ‚b;KËè廓œ£cPÓŠŠHd¹ü¿à=§RL RÕÝÙ(Ä1…!ß)Îk!cLeŸñò|‘$‹ÅŸaD³c ‰Àö^äÁ°[›ÅüüLBБ rÞÀŒ™%/—ü©©°|$Ž&)x¾®ûØÎRÀdpa¤Á§ü»Ù‘I0-IaâùuˆfQqë΄­.n'Oòý}ºR…¨æ)ŽdeДà &/øjˆÃQPX~_ðfa$‰PºØ•I$Ö¿Çü×å¢8$rlöú¢.3ˆ 'ºaˆÒ½.é(ûÀ þ›N`K`*ý˜ÌA…3—Ûûby„$·ì‹_YÈú_Øõ=4” ¶ÕË>Z%DQЇËþaä0":€lÎFsÖqÿ*sà“É”¹ÿÀ Üõ A@ ’ŽÔ¹¶ÿ€y#| ³šNÞ)Fbf+„Õÿ t>˜§Š6ìø¾1\Õ p¢Q+¨æR_ðž8Š"¢¡·øWÂ’.ÂbœÈÂJªÿ_øSÍQY’Iqíã¨h(€¤ ¯¤ÉPÑaÈ|¿à-gQÌU?߉E)ØîCoóÍP.Ô¤Rçÿ1s”‹ëlS9¹J)r•OÏþK茑A°Šy öþ­ð‘ËAT0ÑYâ‘ùÿÀ ÞK ²E!É.?×q›¨äýæ@žt¬¥OøwÓHÇBLrE»!  _õر±¬|&ŽN?›ãk0!Ä1JˆóIÍO§ü«¿54O4í~OJˆq©èh†h£14X”qÿ.t‚ÌQN[¾É€`i ËúÍhÄR‡Cñÿ3øj1Lžê2gbL0Ùæÿð–§¹ll&ŽHÕöy¬.T™l(À@q,Œç¿/øošöÅ1È4}à½õ€lIkïOu'‰4¾?ào(ŠCˆdúM"X0Esÿ€s°MbRƒ°—Oø—«°AP•&UÛ1 0GkNÿð–%ºHèŽ'Dä|Ýh\i"Ü”‡AО¯Zel¿»KÇ4òB'gíñ±d1ÌQ飞Aˆ³Ë;ñýœoR#YÉyÔ2«ÌºÀ³JRáØR¿Oøg×zLSƒ-uƒ4ŒÛ¿ü¥ËaÈSG)yÀ ]÷#dÊh†2Å¢®ð½?àÌÆ)c˜¦\ÿà]s˜¢)†K—MÊZ¤u :£ðô`‡Ú±ºc ²áiPBI¾Ÿð9Ì'ƸI,PÛìõ Ç2H¹Vä à0…F‘ÏþV鯓 ÛÖHþ­ƒ+$1ã( 1Çd®ð±òÿ€|´Œƒ1ÌS³þ5° N†~_ËÀNRg'øÿ€<“X˜„ ä+.¬h9€[ôÿ€ù#JŠQyÀ =™–Xƒ˜¢©G[N‘óÿ€=¢9 #“OøS‚Dpà•þ¶­i7xV–ÿðÿfƒ Ç0ÄXéÛ¾5Eõëÿ!q”fP˯üÑß¼ GÒ·¦XÌÌÙaWø7}êJŠ@TVñÿ&øRs E1DqB ¤¶—>¿ð'nU™$(ŽC×ëé ‡!@É ã_Ò‰ÈDƘ.VÉýý.{¢„ΑØôqb9’V …ÕçÍQÄ“Eãþdéµ®t¸âÜp ŒãÇü“ÍHÀv…åÿ*ñZBä‰K¬Å²¶Úÿ'Ç$&tLD½ݧ9Š34‰í×ellæÇ|_kt%%ÌAgr5òÿ€8â"Lr-œ¸ÿ€:Ò#Ó2#‚«,é•+-ÿà.|è¥{–Y¾Þ,D”BVõ°É­/jÊçý}¹ÖB$‰žœ‰QNŒÑK_ôª6Á.l¯•íþžHE,‘µƒÅ- ‹IN“¯ü¡™jSom§r}õ rœjh€`J”ªÔØÙõÿ€ù1 Ä©**rÿ€{') !€>r‡tt1ñÿ-z."вG$~4$B*“:ËþA©‰ƒ`¸67¿ù÷¹¬AHR GÚHF ×2+}ÿà cÝ$`ÙßPÙ¢0 @ÔQ¤¨¨iòÿ€ü÷¥E0%E åÿòRs ÓÖÓ¡9/D¥9Ëçú}–£˜bo´¤IAzÿÀxíTŒ˜ÃQPü¿Gfa P†#ªLóx¦Wÿ€4>AêBÈš~Nš   OIø5Ø1¡£ôÿ€z²(¤¨ðSPreȼ¿}€S&5Æøâ_w›K`ØD ÏkF3¦`)×ÙçÁ°ŠyöøN( ¶%‹QLQ-Á>Ž=¿à.ÚP!D©oçÝî)ÀC#ÆWÆ`¥TÙgòÿ€ý7”ƒ‡!ãý³ÊC ¦*@Óû^Q. Ž(ÞÄSûúÎWP˜¤9¤aÁå©,yÿÀ öF·¦Šf§‹áï•ð[–•‡¤‰JË¿ü½×œ¢9–DŽÿ€8ê 9¾>·ÙQáûÀ þŒ aL4WâFØCÅÿÎÔ±l]q–ñÍÃèøæ„ʘbJŠR@°³–ðΘ>8£ŠW¹g“ñsfAÌ&¹j*š‚¦3”jNËåÿ*y.2LSí^ÎO@‰aÌ1ˆõþ¡/%ß>~?’Y§’7¹ªRÑ}Ê$¢h}ÿÏt„9’†ÚqËìï É`Q˜ÈªÁ†“ÿÀ ¿¨: ‡š±çÿ)ëŽ55Ia9{dÎÀœ£¯ü½Î26öÒ²63tnxÔó,g+Æ¿Õî* E›°úÀ ~YÅorØ×4yTÓxvïÿ#n ¨) gK—éãÐE¹lY€¨Ÿc#g—ü§áYPTE1[·ü‹Í:i8„’WÄ d¤¤)Íý¿à¯Eƒ–‡I !|[–† àCÀ¨›Í#„¶%*)Ëñzï: „¨è)—\ÈÃÿø  õô6˜V Ùù…ÿ ÿ|ÉñÉFW€À0À4 \@€ÀD € Â @p  À080XPˆ`¨¼ûB‚ˆ((@£že‚%F ËM[#K•ñ½ÐþmO…L˜îâÄte*Þ eÿ&ØáE’½Í‹ãö¹°[–ã”Â:Š@Du¢úÀ ¶!u”“.ß›¦bÂ$ŽabÌÔ‹[Kcþkß˱Að{®ãäRÐrAßõÌ•%„‰†Ÿööí8!ô®zq,…(à!ôÿ€÷â%E =~Ÿ‹Ïh%E0 DL*-I0%y_OøsS`ö"8¿ð§M…bžœˆÞ½àŸ^E°è*“Ï<bx¤eý9ƇQF÷=™¿%ƒ…L˜€QêÊ„•£¿Û鯄 …QÌqïö÷NT ÂJ0Ne:^—qåÿ*vÔ%™&ZM>®<3”„))pд¶TÏþqâð|`ÖM’cc1BJ|Àܨê^%˜ø¿63>wÊÕ¢j2ª†Á3ÿ€vìŽ(,æÿ¿“1†`dl¦RHÎ Ysÿ€ºöœ‹2Ð’¿OM)†"ÂLÿŒªZŽs»fÿçßÊøÛ,S¾Zµc@À ÄÿàJäAP’ w9qÿ1qŒêãj–aDá½Ñ±òÿ€ø²ªK¤«ÏáÙ(Ìsáœ#Í¢ýàÏEDI›jÄ‘3ß¡ðzšf‘ ÿLq(Èì}¿à~Í *ê+$TÕÈbÄÌTœÀ T¼€vvt¡sÿ€:ßN£˜äY¤O( &68õÿ€{§$“¾ s]ŸÅçtP‘‹0ÀH¢tªÙÉGÏþ\õcBA !ÈXtj@uÁ²gþÏ€››/OøŸ»QŠ„ âÁt¬„gt“`þ?à«æBL’zrŒ_ðwH—à÷<ä0ÔF–JËÛþ]èÌ@)†£˜vötR4 Â)SéäƒÞQ †Kíÿ,y0CíX’A~zš) A(Ïþ?ËiV»Êø—»B!¢”Fĉb_·ü­¸JL²TM?àŽ5Êr©æƒÜgv{¸G/øWÏHÃQP+ïɸd˜òëÚrKJ^•¶Uÿ€¼× #P Ã${æi '|ÎzÿÀ ¸JT@±+ÿŸêêУ¨¦†A#€Kn?àŽ|ç@‡*#óÿ€¹H’.AM#Ž@ÁÆzÿÀ þ{΃ dçÿç¤CSëö¤ ÎÒg?ø{Íq%™#P3íHÀm0’¿¿ü§Ž6Áplmƒ[ü¼R½ËsX’b(®DJu×òÿ€=‘0 pBÈrÓþPØQ±ìY>±8Dõ–T¼¾_‹ÇIX•ADþ=nÈGšiý¯ŽGg'Göÿ€½rœG(œCP§6xµ¿àüh Èll—üÃѨÀ4 U6Tbr0så>?àŽ1QŠCiHØëËHÏ·éQ„ø5ÏŽ(q}?4–0ÔSìÚà`BB=¿Ï$‡!Btæ§³À ÞlË”âKŠgGšHŒž¾ÿð?– * ƒ¨©ÓþGꌦ\ë‚Tq8Ì€,jBŸåÿ2t”‡L’,ÒÛýöL$°ä‘ëüÒ¯µ•ò_"ž(߯ØM›ˆ7 @2ÿ€4c\"–H=„NoËæÆFÁq¬ÈGÊYšçÿ2ëñ¾X¥ŠÝÝJPsÇ0Á˜R2&3䤩×þfëã¢0Ë•.èÌTDBˆã8ßý&PR»aÛþšX Ø>bØøÒdÒ‰ÿÀ ˜–Ș÷M΋WÅî‘FH“¨£i"SKcþgÖæÆø68£z}ÝÓŒ…–@ôÏ¡ŽÊœÿà.’‘dXŽ9Wé°§a@PsÏþE|¨(ž/øgËYPSL‰wÝ@æµ4çÿ(p¹")dµ/øk$HÔÒÊSr³{ÓLqûÿ¸5ÉJbšÏ7#Šc¨¦-yý³ †Êÿà®Üí­`GÎ×nH„2€Ê¤cø]¤:Gü"€sonic-visualiser-3.0.3/svcore/data/fileio/test/audio/flac/44100-2.flac0000644000000000000000000025625213111512442023254 0ustar 00000000000000fLaC" úY ÄBðXˆmêaÖÖoptµ¥Fó¬Š)„Æ reference libFLAC 1.2.1 20070917ALBUM=Album Full Of Test TracksTITLE=Test Track TRACKNUMBER=5COMMENTS=None worth speaking ofARTIST=Test Artist DATE=2013 GENRE=Top 40ÿøÉÂN îÆ z*é5>ËH µŽ?O>go½÷LlgŒ8HÃÅ<„»Ü—j#+*ªjÖ%ÉvÖj–å±}ËcØ÷}G©ä5WhY˜I„–zµZ«DôeeuªÕ®IO8“‹8“‰)l[QbyOwäï% cUù‰q%a%-j¼ËW¹$%Û•HÈG«Yl[–BÈyD‘èÞô^]\âTò (²‹”4¢N4AâYĘ·j"²ºÜÓ‰hÁ!ˆi EJ’ä«Ñ3ÉbÔ”mLEz?¿¦Ð²‹8²šÉ®¾ÕZ"³%ZäÓ‹H¢Î$Å·z5æ¹®iE˜i„Õ&¦{ûjjjòòòµ1å<Æ‘è¨éW¹,œËU¹,Þžœº¨ÍRÜ×5)ìOnz?¶¢ù,$ÂÊZ®¢²îiÅŠ,C]xeæ[’ä²ñ 8ñ‚Æa.Z½KRûjµO —<Ùù„±nþ›sÅ   )äN!%,¤ªú::ÑîK“ÓhKžA§ IÆ”ö}F¡(J½ sÌ4pÐá‚ÆbQÓ••UЯ!¥,Võ©f0há£9êü¼º˜‹ä±äQfa.OVXÁ#„Š$瘳q£††  Cá`€P$ B@¨T, CA`¸d* ƒ€Àl8…ÃÁÐÐt8C!ððx>À˜l‡Pè,  $ `.È`ë5yÑì4ës߬¼×Žõë~ùçÎ<ó¿>ïª=PûÊÒö… S¡B¥ t*VúÅ*7=³V¥zÕëX¯ZÝ{kÛ³nÕ›õ¯^±~íË×nH]¿#vBBJä­ù KÐ:¸ÔG ÐÍ 4StóARÅMÍ PEGÕ,’GU4IPAA´CQÑ-GDqQMKD0É$µG’ÉQKuøOMNÑ54C4KÒÍQÉ Õ,6[u5K SÍ%4EQÍE=ÒÁ4³ESKDSÑ ST1AÒÕMPÅPEPEPAE4A-’ÃD´K$4K41M]ÔÕ,’GDqCDõK$‘ÍrC4É-“ÉPE·[T0Í-Å4µKÒÑ-ÅPA4qA UÑtGÅQL¸Ç7â:M6Q Ia׈rNÑFE¦ûHBšÆú‘RF褺l¢Þˆäõ¥1ÍòXEÆ*JÒrvŬÅ%ÓM4ÓMH©”EIµS¤ÓnE3’ÉD8‹*2™Rµ¤8—“æS*V³toÄs.Ì­R¥ÌS)'"’]e$íH©#}$’I%"¤„)®›]!HŠÛ¤Óv±­kÒ9''vítÛµÚÆœÇ"gMÑ%„rXGÈ”—M4á‘Æ\GÆTš‘ÌèÅsNÙL¨œŸJOZL¦rZÞ4í”ÎKYIót‘»+'Èã:1BÓ‘H¹¾”Š“M! k¢)-!Ä¥v­9>I7É2™Ì蔊K²ˆé»MÒµKQ%Nˆ¦\ÊÙL¹”ŠIÚI$”Š•§"µÑ—nEk²›íÚI2’v”Š’7ÒI”ÎN’HÊO™Läù.Ò7ÒRzŒ¬¬…3„9.g%o™I;I¾I&S;!Mà‚šøB£|ÊIȤº"’ño“(‡" ¡®K»Iµ9ᤒI”—kDvœG"¤Œ¤rEñ L(eO’nÓ8ËB:1DvœŠ”žPÏ[).ݤÊIv¤Tšl¢zG&(–§‚ kÆ9¬!DrZÊE%Û“æéº1Ma K·jŸ$šiL¹”&ݮݮ)·nO"'K§É¾e1É®Òá‘Hä±¾Õ¥ÚjÓ‘Y>ÊÉÓÃ:eÒFR9•¬1RµÒ7̤œÅc¤n•¥„\ÊÈR'NG$äñª|Î"ñ7Ä)á&µ­!ĶÌé´’7Ð…5ÚÆ•:$ºµO’DRNÙ‘MîJaM¹*‰nô“)'"’é¤ejŠKù¬#ã9—2˜ãZC‰y>oˆR"˜¦±¾GÉ¥q#‚ÔN‰É{'EdúV§#’]¢³;V—DÝ%í! KøAB-ìÅ4Q7̦s:1Á‰"+nbšítkÍòOµ„TÜŽ"Ò+]4Ò7JÕ ä›´ÊK 8KÆ*2’vÊg$RV²7'¤sZ·Ì¤TÊhPŒrN×M#|ÊKµÔËIòI¼2ñ„9¦¤™I9Ê“nÓr*R8D(‹#]#})•¦ðΓV»(Š“M4ÓR.!Æ|B’èŠIÛ)•¤“|“),oä»v­ÙY:v»vºD’JG2¢]¥q>K£}+K«TR]”cšvÊLpApFª1ÍväV¨¤ŽÌ8!Sv“ei¥Ò‘S8aQŽ3äÊIÈ­.”ŽLQŠLä’I$’I%"¤‰5ÜGMÑ•$o£tÊ#â‘I9>I”Ë™IÒµO’kµ"¦í 'ɾo¸…5ÓnÙ˜£.n™MnÓHÝ&¤s-3¶ù”˜¢^cÓ8‘I;I$’I2’íÛ)œ–·Ú“ÍLr!Ætši¦‘•§nÒÆºhŠK[Â.o¸…%Û£-QŸ7Ú‘ÌèÇ:âG%x…2Ó*XŒí"n“M4Ed)%"¤„8aLŽÙYRnEiÚíÑ-#’s>3¦í$™Lì‡)¼sXßI+K«K©2‘RiQá&伜ž3ˆ²Ék+L¤»(ˆp…5­ÚDR]»Mu"â#¢]éZX×exÇ5ÓeäcŒé#)>I&R]¹˜£–²‘YŠk–¤\ÊEIHæs^ £:M#}©3†;nÒmcTðÊ™MnÕ³’Æù”ÎKS)/æºmÚI$’JEemtnŠÌSNO“)''‚ÄZÔŠ“nÒL¤Š"ñá #¢r”Š›´’e1Fz0ã}[]¤o¤¤T‘¾’JEInÓµÚÆ–̸Ç%ÓHßá¡k·iItÓM4öš"“*<ã:M¹’ÆœŠK¦š"“¦qœ“¶RNÒI&R]¹“é$­.­.¤ôŠe̤é"o™L¹”Še‚Ó´’I%"â +'Dé¶±ØeL¢-iH¹•·É¾gvÚ“*'o£t›][9®š“ÑŠ•¢ŒsERi·k·k¦‘ºeÓ(Ç5„).šmÚèŸ2“Ò|ߤOsk[Â.o¶Q2št­''#£K&RNÛæS.I¬Dè¬Å4äù7̤º"¶©Úe$íœgiRMæRt›r;p…"9œGÄ8ËÆ9¢ŒTeiȹ•§k¤e2æVß2’v’IHäŠ#’v›æé”GI!DéòD(ŸnE$äRNGvc‚·jBšÆð‹™IÒ‘RB—kíb'edûM»NG$äV–Éc‘Ÿ&éZíÚI$ÊJŸ2¶é(‡Bg†]”–Ñ”“î ÿøÉ˜sFÀžà pXS^ 4U˜xgHEr¼âD„ !BŸæ t®¸”}5I$PÚpXÆþ}e´Aå'×x¢PæŽLˆ¹º98gàƒEa` Htž9>Èx‚Öÿ`±$?!¸´zÈmj-†ˆz+J$q4)¥V™ëc’D;Yxè·%”µE¡5KbuF˜o|JÐÞLÆé¢§ØX„ôòš1¬Ó½‘†{,ÈÌv ‡•‰s]¹Ï-Ô,(©q ‹Æ©¨¹”%Ït$âJ¸tWr£•,†d;ÎYŸÝæ=Û*ú¤äââQðb Ô nBú÷’Œ,RåQ£ Ar $…yË:è¯+Ýž!hÍ0’7H&Š +†ˆ.{$² ì}ö¥RXK¥§-ŸŽø)d0°¯Â‰ y×c–¥$ˆ–DK’ÅÃ6v*ð´Q.'E!GË…œ4aµÍrd£D?ŠãçØ\œrç·®»PÂE&R1¥DñÄŠøx«–Z£Ê4åʟܹãÄ a¥5®_©«/¦ž ¼a§/‘¨¬—T¢ˆò-NÕf*;)¾q$qdRúu ˆÃ\•°Þ„êŒ6TY ŽüŠBÈ×%JH@H£´ %ÝŽxˆ$Èó‹b‰"Þ(¼¤¨ó SóíB\J7PZ¡x‡ÑCÁÈ‚JÚæ,ä•*SB–†V*Èœ¤dBµ T% (÷kÊjHÍ»[‰®<†ÙÎ& /´!,³!®bTÍãv,sJ¤… -Lõk‰96Pñ• Cm°² œMÒÑ)˶˜YÍv£!](‘_Å{¬ÍWK* $ë² I …Qln_°x£ù@[0há8‚H~dndv‘¨ÈR-ÙNXÏ‘M)*iß‚ÄBHyÁA!¦'bãaìJXM-ÖH¢ã’äæE”—N2¤Š±Æ˜ãB¾NY‰YÉf$§áㄘ¼Mq®KNSq‚\š•£êf¶j¶‘.Þd£ ÏÁGŠ”X§àÁ¡‰IQ,{8“­Ü›ŸŒ<…üE¯‰)±qËÈ´Z—Æ /Œ,G‘äwŠ$!îíôŒÌËGm)§.mDý%©ºãé»ÚÏäª÷¡ $dþfb2ÊcNò*Ô‰Î×'¡SQ;V´.Ð,ÇÍA9~âó‰zªTÑFx¯Ã„„$¯S,c’s¬‚žRÌ$A¤KÇBmSÊ=ÅççòлcmÅ•m)h©¥yW4èD‘^,dÁS’Q"SÝh¢Åc|ãò-j%IEÅ&§o6.c/HyŸ],Ò7ç;NYó½õIŽyŸx£L^¸ó žm~=…¢ÓÍ˸…ªm£C<ð8k$EKªØ9dfgy‘jò‰Ö5_<Ü—ýÅóØÿ0iXƒYe„éÔt[4Äòªô‡S=Ý¥Uõr 2l‚à@ò¬±GämÚ!?Rö{H-š—beìüD3Q üpAdt)KÕ0‘Yß {A*j7p²·–‰È^\4ï—ryGdIËQWDZ‘ ÈT"!S‘6(y͇¯™˜z“ñ‡ŠŽé,ÄÛVZt x0$Ç6.óâ&¥12RÕÓ‡Z¬SÜA¡ŸaGV«3¢U=sÚ„Õß76æv’ŸBâëò퉴U©$z“ž"tc\©ƒ/ ,!0q%Z*y¥adQ¡@Ч¤¡d.ç„ÝSm ¶?)nZ œRÜA¢&… (Ê0@HβS†ˆ‚B„™»×–·ÇÕ¥ SõI¸[—/H%”v«P„Š$È£‰ììgˆxÄWf‘"^…Sï¾·ÐK…Æõ¼‚ؘ¹@áäBÄ=U’cNõXae9§[­ –$ÈXÁb%axPHãáF¸Ò’DVÄÄÝO.Å * ³´©–S%ÖÄYÉr4Œ·bÎÛ)¨µD  ñ¡CÈ%IÔç× —éºxÃÌ~$U4q¥t²bÈADˆY‰!,©cÌøÊYF²‹u–qô‚еJ= )öp³ ‘Ç‘š¬’)` H-Æ3Ш§jºz1Mw³by1‰¯Ad-%†œ×”Ýï¶ L0•1}‘ȉ2tbø‹R%Ñ„4Ìñ î¤l9ìÚ¦±9ûÛÆõ 8ØCØJšQ5ÈÿÖ¸Ö ŸÐå!áÈÊ p‚2så(NaÌ‘ œÃB!)9@²Ð"94)9(S2hdáC“&s9B“'(s)9)Ù·?")ô<”Ì”,(XP¤ÊM2S333œå!¤)I”É¡@°¤§ PæS‡)4(JPÎzB!IÌ”ÉIL9™IB†‡¤ÿå d)I9I)“ÊrD44,"œ))’˜P¤¡LÎ`y”2P¦aIB†RL¡ÌèP,(Yÿ”“̤ÊL¤ÊffL¤™HR†JfÉ,(XS…&hN†xg2˜g fp¤¡ÊfJP’É,¡Læ|¡™’„BPˆpˆs(s$C3 B’…”4)(p¥ )‡™)IBœ)(RIùBÂIB’P¤ð§2’ÌÎg(xS8Pæ‡(sÐááÒtÌ)ɜʅ”&CBr…8D)' M < S†RgÏ”áNæ…L˜A…39™Îg(s”™Iœ¡4’Y’™™ÊaBÑ$³, D”"B!L”)2“)<åJfgaB” ¦ffJ”9I¡Í L¦fJJ"L)ÉJÉ’HDyLÎ LæaIB…,¡dæf3…Ì¡IL”É™g RaNdˆdÊô ááICž„JΓ¦ç)“(Re ÌÉç2’r…'(rfLæ%(r‡):J<æCÉœå ³‘$ÊNIf”<)9™)’‡„¡LáçS0¦dÊaC’aOå2JLó4$ò†JdˆJs<‘ N”(s>|ùIò˜i)“þ‡?(RgÊJy)(pˆfpèr…˜\ÃÉœÉL9HD9š™L”ÌÉL9C3&Re œ”šP>C)$¤¡¤¡I3$òR„¡L“œ¥ ‘ B…&D3Ù™™Â™%$¤Ë frJP™”))Ìó 3<ÊaIÉ„C2p¤ÎffJ2xr‡$¦JfP¤ç "§ †JdˆJÉæ$æhJ,å2zÏC”32|ó”%3 Ê™¤ñ ”9ÿ¡:Ïå$ÌÌ)“(pˆ N’… s…%Â!(Y™C™œÉB“48Rr“‘ œÌŸò“ú¡™’C™…93(g&g™æH„æÉÉB’sÿè% ”…”32ee32†s)(S'3(Rg2DgCŸ¡’“‘LÐæ‡ s.IaLÃÉù)(JÉçÊIœÎg dÊOIB“™™B‡&P™L”¡Éœ)3C'(R|¡C…9Iÿú§ 3ÎRP)2RgùB!’‡(NaÍtÉLš"(d¤–~YËašyœü¦L¤"œ,(fdå&Re ¤Â$ÊB!C…9Ï)2˜g3æIŸ¡LÊB„C… p¡ÊæH™ 30òP¡É2‡&yC” ™É‘ ”0æfPÉL””Ã(d¡CB†P”)"8|) Rd¤(Rþ†%% „I(pˆL¦œÂ̦g3Ÿ48S’™?”)“3™ÉN32s2yæs…„@ÐФðˆs3”9”8D% L¡C…r!’…2|å ̜Ç&rD 3"˜S% NS2P)†hg)3”9ŸúÏ”™Iò“„¤ÂÌ)ÈPˆB™¡”“L‘ ™LÐ9œÏ3å8\3…2e2r™?BP¤”,2˜yÝeÿøÉ˜zFŽAµ@+›[ÆšÁ)Uf͈õ7›_ú™l¾‹µÂÓ«ÇÂbæ."yC3¦qEÎR„w#™®H…±¦ ,¢ñr›ôÉ4L¶Ó¯¢Xz Br÷5ZRHH2ê¦IÊR°†s!ˆTºÕ=x”=Gòç×mµ®‹¡.=ƒPÕ q& $ˆ³t™b2J±L¢)§,çºRÅåïì®õôL/×ûö_Í¥æÕæ÷J§DX„ŽñZbG·+‘ÙÙYt•=On6Iãxø\$ñª- üõOö‘¬Ò$È#8„`¤„x‰$9á„QÅŒ, iMÈMÊñ÷o¢å+‚àœõ¦’‚ж]_b-Éð£AE„I ã$T•ŽçI‹ÑHIDZ}¿+¢x¼'R¼. çËg~~®&¢²ºÈB±;DIÒ"Ò¹Ðn…fw¹$6q(=ǰØ÷áüNëm2™~-D¨’GÇvf!Ô¬2 ä9ER˜¢) ef+&£©½µºÔÄÓþIÃéóë†ñ}õ?YWÕLñMxS–¢$Îa)c+U EF¢kš£yiál‡êþ×m¥Ñ*,‚rmÉè–!c)" ¤p…†4+JUÜ©v²¦¦XYÜ¿Á%”=Á.ƒa?&±³©RqhŒ¬®ä2ÌÑ–V9ÜÇ!œåw2D-’ªÄö¡4˜L6FÑ2´Ù<\.Å©8”j"ª&4bFxÄŽ²ƒ(¨v hâÃ!î·}M©µ¿¶º.›ºLǰj‰¯ÛÙÏí¤k,­vsŽÃ1ØtŒXí¥Y¬Ò’BsÑ·kChÔ<%Bx·¨j—õ5Ÿ‘]–WŒh¥ŽÓ9ŠQtŠxcÌ)§$ééD¢U²¹•Áj6š»N§_ǨIDÂm1äk–bE4sG$!#,DÌ1"¤„S e³Ñý· ›M£pØJR›Jwm7w+G«ë±É³ ¨: C0È3b$íU+ª:ržaå Sa²Nãí)ÔÓ~V…Õû ñOÓ-ØÌw,DœŠ2 ìu*Ò‹ë‹‹¦Êa¶ÿl¯[º˜/Ÿ›RÙy0RÆ9¡K§!L–*Èæs1’ÈUJ7£ëbÓO…ï¶”®‰–ì6—qèœÕYšÈR•Ž‘B¨è‘–Ãu•ìŽïR\Nná(5Ãu?«Ô®j-K¯˜¶%SN—Bˆ’¤FD ©ã–9#dò’!ä-Q8Øl-6Jãø˜-G°Úø¼k’äªyŒ“¬è#˜æ!\BŒ*µt³-KgßPò‰¹5ÂøÔ aøMK…ñîZ“®Y9',Ìæs‘ÌS§a\®S9«0±Ç¹jú\Ü/Ó)õê_ºÜ-ãûâ=CLiÞVˆHSÂ3DcK<,ó­P‰GÅo>¥ê>’¾>‹‹7„°J…”-ÂL%‹Ê² ‘xÇ…$d±J) B¹Èärº©¥J¿—{?­Ÿôêlžá|üâÜK7"œ³–d$r˜¥;C°Œ*°ˆH…‘V…åÌ&åtZœp$à— `–°´—8ž„iM³¡Jä…)È! C‚4E³!îÙÇy ´‚ek£Üá®.u0˜¸›éÌì¦X„LW9LÁ9c „v:LYK"æ¦&V‚ñ/§Ë[Çe.yFŠ,SÎK±Ê“¤DE3 :c Ï³’bJ['6y|¸\/u)²pÜ.>º%†°–5IJùÈî"…aÆ1Jw2ˆåNÑÁ!¹91{6Ÿµê}tl6Û>˜z̹ͭÎÄK)”!#‘W(©çC©˜©U²êÂH= L’Áä˜/˜' âi4™¼œþÄJ¬©S¤VEsÇIPB¨ÇB®²*âñè –É:½‘,Ap½A¤qe4ïFr¹ çaäÄ!œÎg*¹‰$A,ŸAl-†Ôš£ñm¡,6 ¢PZ‰ŽNk"!éQE¨£,Ë¢FxBÎ$É!(i„”{‰Ël.õiN¦É¶Í“„ ”7¾-›ÓÊ…IÖ!aO X¨3”Å!œ†b«)“Íw°µâav˜-ÐýJmt{…~]×ÔK=Ú¦h‡†<)¡v|fŠHsN•,„]MoãPÛÔï® ¢ñ~”ÎËp’…¢Qè®T³„A"ÅxËnG.¬)æ4¯©œÛø´Ûv QðÔÁ¼z­ü-ɪi^ÉÅYÞt1Hw9XŠ*ˆƒ¥H¢/«L^lòvšƒùðùl½ü%ƒ\&¶öÓU cDrÊé+ÇiPAuŒ’‘Ìåc%Nõy†¡8™ýÿ”ï“MÕ· á4šm7¶·½ÚíG!TF ¨3ˆÂ¦!JC$‰1¢ ;â¯6~-¸^…ÃW$Ñ4ø_ñ¢Æ 1hÜî…K‘ÊC9ØR¸ÉYXî¢5•çB㚇Òè´OµÁx~6õè5O‰J¿·¥PŽÂ,É¢4TÎV#dnöv¡d5ZCñôoFѼzAñ p³ˆoM"$B¹ÜÊ!F¦q’*ÄyÞhP¢LJ'"S[pZÂi¶ÔÚþßÂлµäÎÛ5Ï"”ì"‚¨Œs8ŽR¤"•L–5š­›»¢T~7èJâ׃\~7a¼ÖÞRØ–;ÊH­:”éb¼î!Ä)U²ùWX™iá¬=‚q©·átù\®ïën¦2r‘H†3™1 gñÉf¤Y Ó‹8J›Þ›Mÿ§W$á³ë‡ñj5_ÏbÎ$ÇŒYË2Œ‚ ¬)Xw…yÐæS:•|ˆ«Ìj(º]Ë`²h¸]¾÷muñW’5„x„™È+FhË ˆ+ ¢4éfR4…±å(k©Nÿ§ý¸%‚Ô_>“1½ª–,©vb†s”ÆQÐC¨äŒX䘒–!(úž]ý&_óè•Ãaÿoçãñ¬z–«êÌGAËxG˜ŠwÅ+ˆBDB²Y(ˆØ©´Òø™M®ÛºO pIA&rÒ q§<…‘(¬#¹VÐÂB,V1#9Þt²z|”}GßÂå?«Ý'ãii‚Xo&..­Õœë*JÇ!Èâ8Êc8ˆ"ȬbÎiMD­MCáè6—ÿö¿Ÿ™œK5—Ý¢¼¨+ Eг¨ë;™„h­u‘בÉSr/S$ J…¸zâeüJ æ ˜êôJ’bÊ—cŠvb¨©; —R•]Ìö4‚\¸õ¥Þû`¾ƒð¼Zc~/æ»ÑÞBD4bNƒ¼wŽXBB"ÉñVªålö/šÍ^϶Ôý’ ”>eè5ŸÑŠÌå@ÂÂ’9abfŠ“¬Eº5„-„”K“sO”Âõ{úôÏëçÓ±²Ò…”X‡²3•S1ÿþ×Á€PЈg3Ê 䤠Xt’ᜡIÌÌ¡’’¤Ð¦L°¡I3™ÒzL©;‡’™)“IB“’˜y4ž„ÊLÊ2™,¡Ì¡Iœ¤”4 JfPÉL))ÂÂ!™Ì¦É’™2™'(rP¤™™2$’$že& I,)”3&På2S%3<¤¡’†eN ’“9C% çùC™å0òO2’s3330ÒCIB…&gÊÎg0¥$”ÌÌÌ‘ ‘ ‘™¦s)‡9œÎe$ò“Ð)É™™?,Ë?)2…’hfg= ”3 rr…&På É”˜D˜D2p¤¡B’Nt<šaÏŸô)3L”)3¦Jpˆp§2S3Ÿšy% É”™LÌ” Nd¡C… æYË œÃJ¤ô0¦O æRJ98RRP¦@æM%PåPæ…$òi™B“™“æ‡(S''B„¥ å%)?¡œÊaÎRPáJ”9ÎáIB˜i’ædˆaæNaæJs%0òt™ÉÉ™™™C™B‡&p¦aaC”%!(PÎPЈ9C0ó‡ÉJI„™äC9ŸC&g ²H™:Γ¦Js”%(Nfr“Ð9œÎr‡'2D2ri‡'™ÌáB“2Î&fH L¥hsÒt(s=% Rt(rO3%0Îr™…&$ÊC% dˆp¤ˆJ9&fP)Ã)“L<3ŸÐŸ,èRe% NOBe&Re0§Ê™’’…% s)>fi’!2“C(PáOC9ôpˆh@¦Lá)C)‡)Ÿ9C(P”ÈXS™ÊÌ XSžP°ô(g&g2!““((fg fd³)“)’S&”)=39HS‡Â”œÎÏÊfdóòœ”É2‡ s9œ¡Ì¦ÉND™LÌÌÌÉIùC˜|9IIÐÉC””¡’™„@²N†þS&RP’†S ‘ 4™…2ÂRPáÉO¡:C‘%$°¡¡È’Jaœ¡?å39ÓPå%9ÊL¤ÊIB„ˆ ¡”… fr`PÎÌ:JœÉIL”ÌÌÌÌ”)2™)“¦ &R¤)Iœ¦aa@¤Êœ¡Ï@Фå&|å Â!ÉæPáIœ)“"(e2P°ˆJH‡ faa”)2†…%2S%0С)ÿæHD Oÿå3 ÉÌ‘ ”2„¡œ™œÂÉ)“B“4ÉJÊdå ðæRt9HD2re&Rz̦O”áe' %)‡2’…% IL”)¡HS ˆIá䤡IÌæe'ÒP"B„I”æfM0òS3”'32™:œ X~RfffR~S$¦NP¤’™)"38s%33™™˜S33“9)"… (J"y2Â!)¡žN…!C3&P¤ D˜Yœ¡IÂ’‡9’”'™Îg™ÊL¤ÊB!IÌ¡ÌÒe8f̦OÊLÎ,0)‡?)Í ÌÎg3(JÌœÉ9@§$¡BD)†B™ sC‘ ”ÉB™9)= @³:˜D˜S0¤¡Iå NdÐÉC39ÐÎt2’sД3ž‡48S2e… NO>s9™, RRaÈÌÿ9™™™œå d§¡™™2 p¥&%–e™B!(Bd¡“ç"’„Bgå8S&PäÊB”†”3” J”2x/ÿøÉËNu y |&~^£þj}ãµy*ÏŸ•ŽÈÛÈdž±ö5¯i­òÛLÒR!®Ã-Å!ƒ”`‡àÅpQœ9Â8AVƒ*MD¿è¸=™$õ‰Y¦´JF¦Ãéïl@”SÑÈóÓAŽÈ(QÆ!@‰Sœa‰: Õ!±m=é°¹<’É$’ĬòôÖ‰PMÒÈ5Hé9Ta`† (¡(r…à !HÊ!K;þùe ·ëÉ!:-§’Ñ)‚Òý-µEå|ÄŒîqÈ0S8¡ŽÁÄÎF×6ê/ øjIÓV7Ä’I© ±/yxOzk„ºæLž)ŒqL QG8QÎ @t‚aÌ…SgýÁ-‡–––&Å’ñ~$Ô–}´ÔéÒK–ÅŠ©‡`e…0AÊ @‚0cŠahUf +Ò” ý%¯HÖ´³Z7Å—ãôÚv&ª›èS¤Â8çQCŠ a  Ê CŠ#eɉ…ZÒt[õblõñ¾7ż²Ö|’’h¿ì-œ–9qH(R(c…à¨`¢tR ìIÖ³ Ãp‘*ïi§øÔž~…ù«?tý’RÈj²ÄâQ9‚!ˆÁ’r…<2=U!©\«7ÄØÒK$³Ò$’ZKIái`K6µ<⎀‡;À¦90*H ‰+¦ .ØmšÕ¬Ö’kÄø²Ih•´·¦†óå8‡•‚¼¢Žbƒ0PƒŽ !L8W)Xr¤èˆËZ¸'Åз¬[O5"V{M6OoÀ›Âã9æ3JæpBŠ(¢„0ƒaBˆ!ÇgD‚Ê•Ü5tZËo„Ø—škOh¹ JMJ`Nke¤"”W@ÄDq‚ ¡ÅpÎ2ÇZ<–æŸÅ´ÿ5ï$³Ëi¯!ºÔ‰ï7-zsT¥RŽƒœ2†P¢(+‚ŠPÃ0AQÂ* „ö4›&üm±ix–‹i¯iþ6]%iQ|ªÒ„8LáG(€„(tˆ"fxÅ×°Û‚Ëik,Ôñ¯-礓_«|Ù1‹¤t”ë"¨q „1‡ !AHqU˜*ÓmÛ[¯$’ZY«±$¤oš³å&©vò‹‚²È9a\æ (€„8QÅÀì0fǨìSæšüyròËi"|I"IkÏi-6_ÿ×T);Ê‚ ¡† £„0AÇ`t8„ðâÌKš—…Ø™$²IXõšó^‰šÛY*Õô~,aa @¦(AÅ 0Ær‡!ȶ;z\-Õ¦FÑä¼ÖŸá6²V%öM²{w\õ;ÁÄ‚¹ÆQÅ8â‡â1•…! ùôñ$ÁoZFµãtkÞy©yéX™l¿¥0‹ƒ…B aˆ8Ã`ƒœ@¦8¤¦_2Õk”ùðóàI$šÓI5割Íö›©—âtF9š„ÈÀÌ9GÃQ”¸IE È@ê9AJã0QJ+‡"™Ô+yå®ò}ãä}žJBÖ7Ò±kMŸÞ™¤Ëå* 1„s PRƒ)CŒÀÅ)ÆGv§Ðÿ‡¼´¼ÕšÑ«,ô½y/Õ“_OÑ!Ô¢ 8B‚œqÇ!‚Œ@¢¹B’%ó:^×µâ|nig¬Ô‹òI' ûÇË‹fjæQC(ÂŽ¡‚P¢¨e Š‘MGJîýòO‰JBàIo4²É-&›wþüÁ&5c4î!Ä€‚ @ƒ8q S2vX„â6Ï ]é-5e’ZÄ’[D“æ–¶–ºzrWÕ4C)B £pâŒ0ápc0c¸wg=ˆ¯rRÞ-rjEÀ^‰%bÖ{GÁe­í-Ãq,}ö1Ô¡P G !@†ÃŒ€ÎÇ"´Ï™A» &Ò7Ë4—–Y"ôzIH•Ø»Ýj)}•®9Š @§8ã„qÆ€® §YŒúd¥Ëoþ›e¼ß<“Z%âìzÚ‘+ ¾|/ªä„°‚1‚¨Ã„8¡Ê(QG0+ˆ"°g âÊIGªά¸<¶’kÉ¡i$“ÿCxÙ<‚õZ(Ñ raTÀ‚Pâ(# F RÊcyIÏÁ´Ô´»÷–I¯,KMYéYiÒvm*ij3Šs¡L0R‚˜001 v8†Zm);‰[èjôKOñm4ÒÏ{O[|ÔÀÞJ 2šVv åb…`‚qC`R㈰ˆ¬gøî|=øAjJÃ`zÏx½5í‘w"bØ,T{òŒâ 9C1 QÇ PƒÁGDŽÛïMÀ»i/kÉ$“ô/Ï=d´½Y»&ÔÒÈ©b‘A ƒ˜(£8¡Ì1‡0tAS. ~¡+æ½¾Y~%bü~„­âIò͆“zMå,ª–:˜Q0â 8¡0ÃNu¤“Ò‹ùÓ×côÕ‹ñ­hø þ4ú· YÄ£•j* Åq qÂãDrŽF1ÉÄ/êD°ô›f›¢Ò%g’ñ6e¬›Ñ<¹y_\ꡞq(áJà¤`s ãâ8;Ó”_ïžø ñ2=ežIþ-"d³fÆ GM!’C¸¢ qÄqG `¡¥#¸U‘6LìŸ5-="Òif’ñ:?ÅДËå¼—Žz”ÊáÚ!Â)Á@âÁÈ ±Š+Â’¥vû„ÎéѺY䬒Ë4×´O‰Zô^@·ƒG}Œó,;̃Š8ÌaE (ƒŒ<8ŽÂ¹#›1OùѤàl H•škDè\ Y~²jÉŠL³´ÆIŒr†0âŽ0ãŠáŽÁHpÊdŠ‹*m®-è/ߣRñ6¢ÞIú ¹$–¯~Bd¨‘RW Ã8baÀŠ"‡@CÈ+Ü“‚L&ZÚBV{Ö5f¼_‹ÑöѸ.MÝ^™nÉ8è Œ PB‚AT)‡qÈbÇ|Ü<àšJOƒÚ[É<’Ú-ešMš²ìµå>ògX¬s c†8S† ã„0!Ž(ƒ¤gTÈ_ámƒ[ä¼õ‰ðŸ,ZEÈ_ô¯É!iéå„%Œ3+ŽpR„  ãCŒâöSE“Ëóð²ì÷šÒËx¶ž_‰jü’X>aÑF‚Èœ1Ã0QNPC„)C©‡tJ¹.\—ƧËI+ÓÖh•žY-$ÝÑ?¥TJ”ò¬§8Ç AFPæ(¤ \l9ÌÊ” ™C9 XPæ˜g9g"(r‡(äðèd¥'Êd"L¦ÌÌœ“ÎS 9I3”9™C 0¦pˆ’œˆp¡ÊÂ!ÉB“&rRPÉ¡>S2PÉò…2gÊ”9ÉçСÌÒRD92†™„BS‡"SLÉå2t3'¡I%0ÌÌ92¹”“…' Í’†yœåe3&†Jœôž†fÉÌž|èafÌáå3%™œ¡Ìæfd¦JffRL¦ p¦dÊaC˜D2S32PˆB– ‡ „¡ÿ)™Ï¡™Ê¡'œ¤¡Í0¦L¦C™¦J¡(P”¤"ÏÐÍ JfPÊ…% Ê™:(d¦™I¥I)’‡9žtÉ™I¡œú¡Lœ å L¡œ(RfS R  dÊaæH… ÉÂ’„B…!NH… ”(r™™™™Ê”3“9œÊaÌÌÎP¡¡™Ê™™ÌÊL§ J‡Ð)2dˆLˆNJd§3æs3)2™’HD&Rd@¤¡C”2’e O¡™C –”9™™™4ßèäÎä§49L(s‡",Ì¡I™L ¡’…')“ü³)™œ,å&r‡'0¤œèr!9‡fg‡3L”æe ÌÌ”"Ã)˜P¤¡B™™)œô… ̤¡™I'Be39é4‘B$)C3'2D„@‰0¥ ÎæH‡ˆp¤¡™… èfP¤ÊfPáÎLÉIýRD%9™ÌóÎPðåB’IÌ”% å Je39ùI”œ¤ Xr“”4)&ROÊ)'0ˆLˆIÊ42Í )Ã@‰…3™Ê(… ò“ÊpС ™2‡9”)(L°¡¤ÊIÌÌ<šJaœÏ”)(D3@ˆs(RxS’™Ê“”<ÉfH“4&Ry”˜D3™èRs L¡ä¤¥&Y¡’†NRgÊ”(P¤ÉBP¤">Re áÈ„§8D3…§338RRhPáèg’“L9C…9ÒP¤)(%!É% ä<% L¦JRNPçý Ÿ9ÊB$$™˜g= ”8D9)0‰94Ì–a¤é4ÃÌ)™™œ(Xt“(sÓ (Ð)ÎfK0ó ¡ÂaÈI”ô”,(S8R†rH‡ 3̦L¤Êœ=zfJd¡™C%(ffaÊY…&ROÊOœ¤ÎPäʘRe%å™eœ3@§ &D’‡3ÐáÌ™@Í æPÎJÌá@ˆL¦~D&r†K2C&D2y…“)%$Ì”šd"L¡™“):ÏÊp¤å$Â$(Y(pˆfL¡Â’†fs)(ᤡaLÉ8PÌ”8YCÉB“))BR‡™:™9CŸÐÎhd¤È“4) ááC†„žfffd¤¡HP,>Yþ†g?ÿÿ”ÌáI@æe ÉɤèfrRô2r s“Ð,Í'æfaIŸÏÊfdÿ‚'0òO™I9…2I@ᜡ)I)$°¡ÌéfO&˜y™C„…ä¦LBdC I††”3áÈ„¡IJ"d/3(d¥'åL,)))))(r… ¦PΙÌÌÌÌÊ"œ™Ìæd¦pˆp¾RP)32’s™”8YC“™™œ XPˆr…š„@áI¡HD ä.¡INr“”œ¡äøtÿøÉ˜hDÞ>ñ€ùþö¤a2Œi ÔîìUÖ(²”>I¤­>ýjRÿ&„ñ-a)™Ÿé«fñÍ;VˆfâS æ‚•ŠwC3QUýû>ŸßKíë\ ÿZ[-ÝÛ{›å}£´ªæqå†8Ì(†)ÆhŒGÚvÞt§!{²{†Ý—e­²ÿMâm(6Ü%”º9å; B¡B qs´1§V r‰VmÖ¯‰Û&‰m“ëK[þ^;èªoUò­’îS¹Ä!ŽQÊB‚%¬…2 ê„L«÷jW~ÛO¿ÒL‹A'á0'sò󋱂ÄZ‘&KŠÇqÜR3DG)݆Uvbep˜²ÐÓȾß%+ô“еËJ>Ô˜bبÆ3¸‡9G4#˜Å!ʶsš¤.”ÖNÁ6ÛI¨O&Òh”ñs ác¢ !ÚÈ+°å1L ªáf 9Ô†m)ê¿ú×árÕÀÔú’?˜[n§ý[¦'ŠÖ:…Ä`ë’ðë@ëç#)•j½G¦qò–àŸ‚VÔ¥©÷Ú[wïv½ËUâ ‹1#3‡YŠaQ S˜e˜ïQEmuΡé`ž[åéO—·×&Þ“ÍÛ¶ "½UÒv±ÐtŽ‚”ã°¢°¤0í1’¦^ñ•º=º”¥º–­¾Ô·tÙ“áQwÄ™ðE³ŽC°R(+Â9B‘…r,çŽM£n-óòL—+/Ñ+õ·÷¿yñQ 1<ËÁž§a”RˆAœA jJR0ˆªT,Ây{EòÒO ”ŸÂS$§Ò–ásò¿ñ%iÌQÚ:ÇQ(DÌ!DY™Ž™äFÏ…¦õ+N½)ZI·é)Át”Ííæ&œ’#”¥s˜¢ÂC „9¡Ñ…Wb#D>غMÿ¦ß/[wÉö§Vöç bn­„©ZÎì!HA\â†ã1ÇW ‡#9SËô”MÊeû­³~Í”‰Ç·íký–°´TâLžVqh† „ÃÁu”¥#™(cÙU«ŽŠ¶&žøÂçÏÆÐܦÆÝ"÷•lF1ˆgÄ¢”ç9J³ ž"³3iKˆôξŸKõé’Ò½oï®å4–¢†Œ‹:¦)Ø# AÁRf`Ëæd²ê’âXÖÖ¥û­~­+Zýûæ©%Õ½TYÍЃNgŒ®1 2q QØç38¤Y§‹· Fq$Ûý©ûVúYªÎýVÆ8³*Ф9„cˆrˆQNÀ‹1Df(VN1vâQ«µámÃ÷E¨õɰ\¤žKoæE,*0D¹ÊSŒã˜;L!Ôvs¹VÅ!¸‚êR›}o²}mNµðL“T-VÕ\K'1Ýrœ‚Ç9†!9Ôwf¯3q’ºZ~I¶“‡Û×­‘>ƒî{.o#:ÎŽ2”W¢åÌ(„1ÈS–dOlê=xNúz‡ð›óå²oщMÎ,ÑŠä:X‚,FãA Jެ*Õ<ƳR„ Z¹>Ÿö~ûV´é{ÂóÓ‹S`Ág+Y,2Èe Æ…ÂÎ1’9$c¡"‰w¡·ÞþkÐ?´¥þ·ïù+âýç/½S&B,ÎA CŠÃXar•ÎdqMt£rÛ×$íò-úÚ”¤š%6Ú5‰Z¨’5„d ¼Ó âùÈ!eASŠ%?0¸OúZþ ÅŸD¶Ò•­TŸˆQnÏ1".sÇH+Œbà ÇI’…K }¡¼k‹Þ ÷¥-÷¥zûÒé?ùþÊk#9Šó¥)ÅaÈ9 à2tÎ{ùûI»/‹ƒafð¸{ðL6VÖ¹gë§Dt ޳A’ADqL£9ÙÄ4ÅD©ù/æËd›}¤Ý& nz•îÏÆË&–)<"ÝD's…SœÁ¦H:0©Çld¨´Y|¹kåzÒh\øÖ ôÓdšÁcƒˆT)ÎAP!˜#v R å!Èìg³—™ ™OÞ—D¯Û%¥-Òm/†Úóÿ¶YÈÎA‚ ¦0Š"¡^ ŠC̉BŸ·pÝ•ël¸%v_ûÉpßâé7 EéSªGw&"°ÄB±„*fr2ºùª£Xßµëáí··IÖ¯ý©¤¾¾–­ÊÎHå•Ècn‘NáV1ˆ!Šc« ŒtÛ¾& •6ÛiJ[&ÃI—ú×ú½¢ç‰Fäñ©)XÆ9ŽAFA…q\uÈQRŽïU×ä>-i²åºl¾oÀ´=ø× Rjj%D-4*ÔÆ8¬)E9)„!\d ËÆDôíæ®“ö]ù0l“úOù3"ÔüZÜk©*¦DtŠÇ9Ž3 aŠA "F4‚"¹ eµ_EòÓx¿Ñ(Í&Zµá;Z¥¬ÔZº¹Ù‚¤äÇ ÅqÎã0Ìã’åG[“% î&–Þ6 m §“ǧҔËãiºÇ£=Ö(³•"´u°fŒ¢IŠ¢¡…R4VÃ'ú=hN¥x~º]›)Yr•¯‹ÖTNr¶L‚T ±ˆAˆ;b˜äc OJSæ˜I¨5v_é«Á2ßJesù¥Š|ó,RÐ#Ld8†1B Câ¦:ª“¡&>»Û•¯õëÔ¬™-2/Ù= oSa R½e ˆÈ!‡q aÔRŒ’™ç#PŽYZµY(mÙ2M·K’l•ЙJ};MÉÙgØ¢ÄD x§hä`Êq Q!Pf*bØËÍË‹Jcý¶oÊIÓè•úý®wúQ+W±b’‚!˜+\w8é0®9\c3ˆe)Å.»ãé+Pšóø¶Á¯…—i|þµ.ɸž–B©Œ¥1Œ+æ Â¥JC‘ØCH˨¥âåp´¶‹\Ÿ©/ 5Âÿ ÃØ’FÒ‰‘ %YÈ#”:΄c âŒx‚,3åØöIeœ|·ß®ñkÒhµÖ®öo¡¬éÅSÊ∣QVÊNA’¢¥œ²¾jþ-÷ö]º^µiÓe/´Ê^A°íšäZˆi‚6…s B,B˜Ã‘F* ÇO*äÖ’Ù-FÁk’õ¾\µiLšæ’‹Ø·7—2Êg3 ® ªB t ÄfjÎÜé¿Qqo”¯×ïJZ½6t[¸‚ïšÏSTCJFP©!Übœ¢”Ã0‡:ŠVsÅ×qe¨'ÿV–®Ë]—­×ü_>”7º-©):¸êŒŽaL*ŠW|1¬Ž‡ˆ&¡{+O¶ß.Òû6t´Êïe:§¡+,TðŽQXAÐ3R$"Hâ"Œ´VOªWI½lš‚߃Ü5t|›Âg}|Ù­­GW+\Æ9QÈ Ž Äp¬£3‘Èšq¦/óá±äÃÛFê˵ù{ëý×£ïsù[ÈäAf̆q,tœ†¢2ÝNk#Ôþy<×ÃZ”¥$§tN=v™^_Ú“f~€kŽÁ žPó$‘ ™B“,Ï2“,"”39ÿ¡ÊJ™œÒz„ÊIœ")CÔ$¦fNfN…e B‡(P¤¡LÌÎs<ÊJBP¡2™2“%2i4"(i“)2‡˜xRs2S&™)4Ô †Y)2“¡œþRe$ùB“<§4 dòR†JÌÉC% ,( åhs¡œùÈD a,))C2RJ )ô9C2eg)™™ fä¦ äÿò“,)™“¡?"3(s9™™œÌ¡œäBP°¤Êdô%!(}P¤ÊJúÊ„Br¡I”)%&XS“2SD BÌ”‘ B™2!“œ))"”9œùÊ,"„I”ÌžP°"¡Iò…'$å L"˜D™LÂÌ)“(s)œ¡Ï¡™I„Išadð9@°ÊN“"Iᔜ͇0§39Ÿ?)>S0¡`R“å…% C…”39¡I¡œ"… ¤Íz% Lå ¡’!…’S Ï¡ÊfÌ3B‡,Éffs33(raȇ ™‡(>C ¹:9”ÉÉ‘ –áL‘ ”ÌÂ’…%(g2“¤"……(NII2‡2…&Ng…˜XD% L¤¡L”9C8S2eyLŸ)“C &g= B¡aB™3Cž“C9)“™æY)™2²„¦PÉLÌÌÌ,"Ê“™ÊÂ!’Ìå2~g39@³%yÈ„Ê(Oœ¡Ìå NP9Ê̦(y…&PÎhRs’…… ¤:Ie ™Iœ¦ r’…2s333(s”œäByC”””áILÊB¦J% PøA LÎS&PæP¤¡LŸèyœå äÌåP)É”90°ÊL¡Ìåg)9IÊaÌ‘ Ÿ$B‡3(PÉI,Ï)(fPáB¡…(O9IŸ”áICfJaBˆR9ü¡É)™žS'œÌž„Ë(M'Ð"†s”ÎDRR§33™Ê™(gùL<“”3™ùLÉ”™”2S3)2’ICœ¡ò@I„I3'ÏÏ™“™I)(I@¤ÎPó332@§&s,ÊL¤”)3)>Y@¹…8S”)9“ò™%$ÎPòffJPÎNäÌæ¡Ì”ÃÉ”™Bœ= áeÉ(aɘRp¡¡C”8D8RP¤ÊOùNz pÊJœ”(s)œæp¦L¤¤"Í2D(¡Ð¡Ì)By.¤¤¡”9šJ™(á*C3%39žg™L)9™šœ! ’”3@¦L¤"I”“)‡˜Rs%™3Ê“™œ¡)Ι¡BR„ÊL¦N“B s2†RLæ‡4””ÌÉL”ÉL”ÉNH†…% äˆdäÊO”ÌÏ Jp§&s<)ÉB“™™Âœ(S''Bt2“)˜D8RP¦¡LÊÉÌær“þr„¥ ¤Ìå ÊCç)3™™œ A“% fL)ÉÊ9:aNáNæ~zs(e„ùL)(Re&Pä¡ÌÎNÉBÉ™™…2JL¤¡dÊI™˜RP¤ÊJСL”™™™(Rs)…˜YùL С¡L”¡2’‡?ò… áNPáaP’†S!NH‡%$òS%%33”9Ì¡Ižr‡†JgÊffJ(ffO–™ÎRaO…8¹ãÿøÉ˜oFÎÓeÁò$xÁ«Sª‚ ¶Øg(!#ž2)ØëÁD•Í €Ê%Ë0,bÛŸQq©QsðäµV×'{ ±w™>¼vC iLh0IŒ”)Ë2s´‡¡Ë×i" H HÁ9«ç ÔPYž¼ûåû!%[Ã)[ÈrÂ5]Å, ±×L!léTUõqdIjá¤Y¢Fá€Hp_CmÇé Þ¥ª¶¬âxıW‡G#”B΂’!(h`Ñ j’0ÔŽ‰yCD÷?kK ›¼1âCÒQØI˜’2yÒ„b‡S¯„}Ù<ÆœK= Ѐ¼â\/p˜ÃXûž}Ê‹#õÞA®q'M!‘ŠåA˼q¡“¢#‚‚ÁƬBq¤-*õ£WVIÛ”ø·ˆ>½D²h`[‡A˜µ´ð¦ Ï•“²œ´9äF ÐPObfe8ÔAøÜý”ñ5ÍšÂHùRL4‚ ìv±Nƒ4…$!d1"5P¥[¡$6,@ö[f2š%©oÑZ°€‘<°£JgÐCXˆ—34!j!fF„§~”ØRXk%zÃicõ[oUžsãj¾Ä„'L"U"S;ʦxŒŽ"aJ…† "s|á(”׎ž,(!ípœ¿D¿³l‚Pí•r–*š\ŽY]C@PXG¸cä”Ü`”_”}W¯›žYFçíÜYb Ž ƒàÐ4`H€ D @.ÀL0<ÀP ¨05ˆ РlÁ°8Áà6à @À6Áð| À8 ‚€ø(aÀ@ ¨* ƒáàÀ@t6, DF†DGÏ ,.|áñ2ÆÅ :x€2g[>óÅÈð±ƒópÓ‰Z†”·”~aㆪ§R„RÈÎÒ‘¤b±H±MV#ÌYÓãò0ñÏÔKi ´>!ñ†Ô–0<‡%Ú•,p ²LSxa¬)£½D,(‘QÊÅC:•Éþ¦KÊ·ˆ6’ÅÞìãPM[ØojÎ&¨¯¡a“¦¨Œ…QÕ*;Øæˆ¬rÅ&ˆýâµ1íwìµDÍ6è·='”YMXã `å~45F¨å¨BTF”CÄ1&$êñ¢L I¡A0¥áh]̯}‡Õ¤ÀÓ5hágQ"„=3]hW*E2Åz±œ‘d#a¼P–a~(<¦ì=Æñj}^°6P›Å|ÁKgd1DƒœÅ‚‡…fˆœ1hâ‹wa£‰8[ ºšÁª¢ç8]°ÚPµ]ÒÎdJHAb±¡2ÔÄV’‘ T2¬e¤GÙž–u \ôAr¢ZPžýinÁ$NÞ¹0a:eD!U¡Ó,Q#X,C¡CÇRÊYÃJcÒ0,ˆ,¡bÔ>aó„Çß¶%j¯¦n²{±dÁŽ‘Isb]Ò4BÑq"N.)pþÒL‘‚Å=(±CYA²>„SG'O!\ê¡ `a}ºfªÍu׫nj7K”ÆêuO¥Ü˜%ÖÕ<8”„ÎGœ‡…Z©ÐFf‘TXaã[G /‹çöû¯J‚JJøH£q-UJQgŽË«(ñNÜu±—B ¸å5{ˆ7,…œòJ_-jVö bÒ@ySÿO¡CÝM•qH`°Å4Fó(¨U1Ï÷@ÆèÃB–î \…õêžõ.à”>.ß_j-Ø`Y‰h 0Û+ジgŽ$îÅE)¡¸¢e"‰/Qê'0$¤´}©ˆ6y1‚Q¤jz/ÁFã%#£˜²¬U(„•Uò­ H‚Ð(}{‰e–ÃTúƒL‚Ô]„BÙɬY¨0N;`†ZÑ–D‘¤IÌiB³­Éj¼¨5‚E$±eÊ%j/-¶„ÿýjÜ ÜÒŠÒ 9¨«ê×/h €X ÕDE_D¡(‰ë¨‰BÈ_rÈZ""´ƒG !ä4†»sY°¢ÆS]躞Ôj5Ag.™8$8h†¢""¼ác‹T¡d-®Z®\X‚ÈÚžs]zæÒCHk½M40Y^EÇj.ñÃÎ…œYQ(J+Î(ÓžQb YØ’qdltùÃC‚D|uÇj5M8²/Y°…»Ñªiƈ-ÔÑÁ#›]¨ºˆ”,…¢µÍ!}ËvÂC]zæ»a !®ÚŠÒ Z«\´DEkšBÑWÑ^p±Æ”Ò XãHõ4âÈØBÈk·<ÃDBH4 ,8h£DG¢ê"PžAc B ,íÒ 4 Yß ,p³#Ñ=p¢ÆEëšCHZ+H,æ«Qä ш4An‹SN4An‹F£z¦:ä#]¨=F£È,æ«Q¨º”,‡ˆ,ï„%×Q=p…×nkšBѤ8X†¢"´‚ÌÝ ³žBÑ…×z–편CN,¦ÒCHi vÔD¡nõ4ãN]eiœÔEiŽ,CQZAb 9ä-ç iM!çFÇj5F£Q¨ÔyŽ!¨Š´{“Yh÷-[ÑZAfmõk–Šñ!ÃD5^Ag7¹nÚ”-ÛQ(hcH[½ID¡¢ñ×i‹®Þ«è­sHZ""µËîY îY Ek–¯ ÑÂÄ5^墵Í!¤-¢No ±ÃB¾p±Å£–í„-ÛhaG¨­ ³6úµËDDV²üác‹TDEk—È,pСÄ<†”Y›¤sU½Vè«è«G¹jÔyœºíF¢ã®H8Ò6;Qq•¤sUîi´JC]ê[¶Ó,q¥At3IegÉ:¶cŠÂÛCè"¢ï>â¨fÓ¥ùšJ´§X|¡/t“KüœñzJp¤g‹ÒY^K«+ëâöœ¡ Ⲅñ|^’¿3HB2àš¡J¨«§7}nꮫ̡Õy¶»ì¤Š›C|ž.’*^Zϯ©Ú”­t3O*A·—c¼Œ1;FÒ¡ F®-Öiº–ý}LˆÿnØMæØî%TaVaVBø®º²¬&…ñ\WÅq\W“iÒŽ´Ÿ£ F¿·ªÚUöñ*òsÅýÔ7‰WÛÄ!J¾û mkÊ„!BŽ“yדŶ‡PêCx„!B„qœB•}¼J¾Þ«‹û2µmM¬« °š…§ oÕ”%u™iU¾†ñÚr„q´7l&âxÂn*„î³o*…aެšÅuÕ•aV,Mïꦦ˜Õj<‚Îj+\Ò‹9ä-^墵ËWYÍDbÌj*ú¯¢"µÍ!h­rÑ,CQ}ZäË9ªò iÏ!hˆž¸íìhà°@hp²¶:ã®;{q§.»Q¨Ô\¸Ð€‘ÏDVháb¯rÑZå¢"+\µ{šBÑ*,pÑÆ˜hÃHÚžÔ\eZ5F£z­õÞä×jšq¢ [¢Ñq˜Ð€X‡>ºá 8ÑœºíìYÆœºíF£Qq˜³hƒN]võZ7«H,A§5WZP°Á¢­G¹¤-^æ´EkšBÑZA£†Ž-·mDV¹h«ê´j5‹Œ«Fõ_VYÍEZ=ËW¹¤-®i VõZ5iÅ‘µ(hc"õ—®_ryŽ4 hâÕ×Q=p…»c®Ó‹#cµKvÁôùÂÆ6¶E¢å‹Whágmõx€°p,8ò6§®·luÔDDEkšQb,CQyË!}Ë(ц‘µ×Q…ÒCHi !®ØBݱ×R†ˆ8Ò6¢"P²È,p’&´¡aFªµÍ!®¿8H†¢*ѽWÕh¹bÕ¨ò  DZ.\X‚ÝF¢á 8²6\IEÇ\!§(XÆÒȘíê™qg.X‚ÝK8Ó—]îZ¼ƒG 4q¤z–CÎ,¥¢"*úµÍ!¤4†ñNÝrÑhÔj.\XƒD ·E£z"+Y¹h÷-^Ab xáb‹!.Zµê´{šBù†„SÄ  ˆøBÈiEœò­ê×-^æÒCHi !hˆŠÖ^¹®»Ìº­sHZ*ѽ¤gÔUõk“]îMv£Q¨¸íEÇi£QäsQWÕhÔj5F£Q¨Þ«FôEiŒ4‹Öz.·z.§®¥ 8²=Ag5}ZAg<†”hábCJ4pÐgoˆ ,Qã UkšBÑV꾈­sHZ"""% ,q¤nk6I›®Z*Ѩò i›®_rݵ(Y vÔDV¹|‚Ç ;ê""+\Ò¯ ±‘êY v湤4†×zš XãHØCN,Žºˆ”,†×mDJÜÑÇFÇ\v£QrâÄFÂí¨”4@±Æ‘µZæ´UôDV³a 8²6:á w¢ê'®·z.¢P²C]µךæÒ‹xÂÙ½¤ráň4An‹RÝý‹8ÓšŠÒ 4 YßY8²6¥ $CÈiEœÕ{šBûšqdlv©nõ,†²’íŽÔj.;Qqǽ‹8Ó-'êK¶¥EŽ1sÑ([¶¢% uëší¨ˆˆ‰B{šqdzš hpXA¤z5.,å×ob]²@‘ƺ–q§5WqÚ‹„4ãN]!§Fˉ#e‹EZ=Í(—FXƒD ·E¢ã·ªc·ªÑ¨Ô\¸’6;Q¨Ôj7ªÑ¨ÔoU£Q½VìYƈ4A¢ t_DEk6¢¼áaÄ<†Ò4 hPh8j¢µËä4CUä8X†¢"µÍvÔDõæ³a !¤5ÛU®yÄ£–ÊYÄ£–ëó…Ž4¦²– XãÄSÄ ÁÁ¡‘°†œ[¢eÆŽ!ä/¹d-ZAg5ZF£È,çÒˆ¯8ò)f.»Qªi‹®Ô]E, ˆøBQ…»cµ‹Žò 40h†±¦5—$‚ÄBH,梦\h@Hæ×j.§¬œÿøÉ˜fH/_•Ä ×D]Qãe­fɘ¡Ò®"ƒ4§õYˆ.º#UlaHW ®*DQ™£‘±FTQvcUã\z¤¾)ÖÃîäÓE IÉ9sð"à gHÊr¹ŠBtxBC3yb8æ.×¼Ø.¦®Sw'ÒåšL%Nž]²Gd¹f2‡$ÆhS ÄIfhM³™ \¢½-µ žy*PÚ’XJÓrĶuØ«ùâä,éÀac:Â­Ž‹"á…!‰¸‘‹0ÿ­(ŸIhôáûo…¶7èýÜÌ-®Ñ³(a„SÇs±ÎÆ–ÎЉfýIÓ-Óžû'¿ä»^ºÒ @Ÿ¯u HªBŠ4+8¥•L;ÎçQJ!šÍPÊè%ÚTB[Ãpß›L=¸mù*lÙ;rŽÍ)ÏUt™èwŽw*R©ƒ¹‘Iœ¡΋ ¥›E¸¹Kù«4¦vµéO2VÔ+ ]©#B ($2ÔwŠñ˜§!b™xùÅ+l½rñïÛýöߥ+_|4Ô[3Ò×hBk bÊ;°W„$„@fˆZ%4Âïš3æDÇ_éñ/†í§ü¸´Ûç7—µÅCŒ@íø3Å+Bµ†4"ÄtRN_ðÖuM–’ Z}0\¿…Âo¬Z2­å@ÉWøÂ@`ðˆðQàˆ ÂB’ä8©!ìÑÞ(Û„IÁ)0Iá÷Ò× n¯@$%1§LÜñÆ»(1£½„Až ZŒhÄ1…"%·LœYì$‡·K¤ý¾íð.¦øÿ‰")ñ¥;˜Yž+Œ†:ÆYÊf.G ¾»S‘N{«è]OÑvµÑqo¯Á*†Éjó=‚Y¨XaübA¬vEŒÄ:ÐÇ•²‚»‰ù“}'š½|> ºÒȰ˜R}ýá˜oœ°é•$Å0ŽÂ±FX¤!’‡pï·a‰—ï"—äꉣ~SíMÊh\&²¯â½Eæ1ÈŠêaO\)c¬tª¨¥l'±E&ßyH5CûSÁ||ÿᨸYÉ'¦W>U!Êó(R¤Ê! cÒ½ 3;H„m­=Ókjyz’p¼%xk‰jãÊKédb!}¥;+ܱU`‚Gg®ì ¤˜ŸGŒÚ±%!qçñ*&ÖJö×ÄÙ¨÷Aü·:X^"’ÌHFŠî2Œ…9UfPG»ÖA!‰¶B)&¨¤êÛ©£pšlðÒÁ¹ôroiÊ"}Ö1TN1!s§°î0×%‰1ëpЦÍôþÙ‹pœÑf»EǬâid³H¤ë´"¸ÅX‰1+’ÄR\IVFžŽý%ª\¬™l>õ±¥Ãå‹`ØIPK%A 8’ å1XTˆ“¢!RÇ;§cœ­–ûž L¬’ ‡ÿÿ¾S¼/„Ë 0¿Ýv8Údk.Š¡ÒF(Š*bî$Á¤G4 ò‰# Á²†ÿ‰SS¯ÆÎŸK¥^¯áاÂ*Ùp1!Rƒ$èr”d*+ŒT õf ?‰jªoÄòv^›|>à·âÊN5®ñ“öë4ä±\" ±‰¬:Š­" )$ )'eÚÚŒY> ±Á?Á"¦ Ruþ·yÂà‰5Õƒ­ˆXíÜÅDrT¤)##ëàTÝÖmµöš[ðô<’Æ CO ñɤµXG=RArÝÎq"eа‹UÃ#i2®ì'[ió[Ð^à¼óÔlñn‰’’£gçf )¢)a‹R­‡y@¥ªÔC&Sn¦.ßwÍâíðû§ ÙÜ´ùjò&Ÿ>wúBc%˜"„i,8HW(‡Š,äsü‘‰©¢Hû[÷mpj ¦½‚D¹{ºX5 éŸr[%Eqâ¤w»”gVõ‚cM$"ÓBg6´¼¦® ‰50ò‹âölí]ËŽùSŒæy P+ˆu!µcÅSøoIÂÞ# ½=BØ'4ó®jL?¹äM–(RÙ+áÄcB8Ä3‘ ¯íãº(üBGaícj Zœp^ý±$­ &öNBò;#J‡ ŽUqŒ§bN(’¢\—Uú’ö‰Æüµ/¯cø½©9|<)ᜱÁ!Öd9Lg0Ë;Ôg*®ÐåF¶ò½i¿“ÿ^¥2ØKàÓ dœ$¢>†ˆÞç9,)§c ‡[©Â6¸ÑÕG±ºbe+z‰Ä¾…¨øN¯O(œ'bŠŸÞrŠºG(îAG)ØAEÐVœØ¾3J †z„êVÃÔ|5°N6¶ÝYBnË<¦¤Èe4ŒP‹§cÊq”ˆÃ•÷ÅB‰L,A*y´Ú‚vFœCö¤æöªd ˜Šq–gᚤ!LBÄ,rð"Õ µ+£D±îãP‰›^—DÚvåzNZ¶‹•40šˆ`‹8’I(÷áRbÌ$†Š f)PÖ̱è>×ð»Z}+…Ò`»ùrP]ÖŸ(Q®¦`èa2¸Ïªq$9Ùó¨#Ü|®ø|¿p´ ¦¶„«Ò©a¡ Ÿ]DNÖE³3EJ,)d±*r›™7ƒøá¢ñ«çÂÓþ–Ââ|™{óƒÑÖ:I#H±s£’;(qc­ÃRÐC®-®ÅmŸ„à›·°j ¯. ¨Ø>‰*)ÜñˆïÓ(GAI Ís$í'|ò%¢È©jXøòðš&õt.—h\¬´Jú,ªPÀXc\ñb9IJB¹" ú¦ž7,cÔja¤M'JieñêßPÞL4»³°„Ò¸Å#‡'bg”ÌáN,?)(᜙“L9CB’œ¡ÌæfJd¦JaÊ™™œäBaL¤Ï’ó)“(RP¤¡™œþ“"L)(Lç3”8D™CB r…% Ìá"L̡’™™“’„@”"¡ó'˜y…&SRS&’… $Ä(ÌÒDbY…“”™ÌÌç9HD9™æRd@¤¤ÍÊ™IÓ å å%8S“å Ð)8PДá”"¥!JL¤Ï(…2~S…8S’…†s9B‡32˜s3”9C9üÎg)™Ì³Ððå Ì3“9œááL– ”ÉçÊL,"œž†O”9žPæd¡Ia,)(L¤úN˜Re ÎP¦fNaIBÀ‰Éžg”,“Ð(RaI4"ÊL¤ÊN’…%333%2RP¦Î… d–g™Â“48S…2Ð¤Í ) ¤È!IB!™(D'™IœÊaÌç2˜g†s’g†Rafg3(P” e&J‡0æ…'0òS2‡ˆhr“óB„ÐáË9œÎJd¹”™CÉ9™%JL¡L™LÏ9BS™¡‡BeD)9”É”)&R9B†…hr’œÎp§Ã9ô på L BP¡aó'åaNJ”¡äé(”œˆJ!П)(’ p‰(sЙLÌÎÉ)„¥!JB”“)'9IÊfJ2“9™™™™)’™,ÉäÌÌÉB!2™œå'å Lç”4’&|²…2P¤Í çô„BÙ):aÈ„ D”…%2D93’ Xs3”ŸÊL¦fdÊ“†f™œ¦fPÎg¡’æJ"L"LФÊffP"„@ÎfJd¡™ÉLÎPær†RP¤æ<ÎPÊg2…% ‡3”Ÿ”,$¹4Ã)ˆ™”<šfs$C!B„¡4Âä°ˆp§2Rt0° RrJa"$I'ÊÎR8Sɤ¡ILó™)42hdùC™ÎRfP”¤ÊL¡Â!“C'0¡C”4)9™™’!“C%9C™™™™(R†JL”9¡Ïþ… NRdBs!e$¥ Ì”2P¤æfr‡˜iÊfN(S&PÎPç¤Ó%% C'Êœ(h‘ š%„§,)?þfaÂʧ‡“?”Ì™I(s9I–zOC9¤¡HS&’…e0¦JP)I'… $)¡Ê9À°ˆ”Â’…&S3ÿ¡œÓ'B“(pˆdç‡%!ùʙ Xs%9™C“9™™™Ìær…&g(S…häÊÍhpˆp¡Ê¤¤¤‚93ŸC”9Ié I¡@°ˆp³Cš"™>‡?‘’†Re&P¤Â$ÊaÌÌÌÉLœCg9’˜PЈ‘ ÊLåL¤’&É……%%2tœ§:aL†C…)&ffy4™†NfRe$Ì”(p¡( $¡‰’aICÃ9Сœ(œžy”3™I”’…&yBˆ…”™ÌÉLÂ’…™L)3”È PÿøÉ×HHPÞY`gfµ(è‚’ËY0iÉ’ËY¯0¦ŽTÔ¼ô iL­9UÕŸ0ª¸gtEY»uòª9g9+'í”ÐicöEcZÅËYe°ä‹P‡!E’ÂÏAíãÑQ îÝš_Ý]²5ë}Û±m·UQOrVŸFôÆüŒÐå–•‰È°öD2c ±H ä->KU-ß~út“s^¿®ÓEZ¿5ך½ë(á¼}Þ:Q/Û¿Uv¿ÕÏzŠùÝ›á8_XD‘5r•[Ùe"!’ÉHBe¹L@K,VÖ‹㶯ù2z2~†lG}e~ã/Ù”Š¬^Ô%¤q† Ö"BN)ĈL²©ŽYE*cÙiv³åÒ3¼"ììŠØ­~ìÈÕ<ÿm湎zŽ1–7¥(¡6Ô¦lÒÖzÄÙïi¢ø¶¨}®Ö="$äc$À‰9 fŽ9Ñ…H㢠شÞz5Ay¡p7ÅùcTú ¢ZÁè=âd®8D0Q£œ€EŒ;Pd;„1C£˜Ä x¨ï.ËM–‘)=f´ß?OhŸ¦®$(iÒK$æa•ƒpÆ)q(Æ8bŠ$g G¸Z²’ô½ÐÞ ‘$¬l ZF­ùä¸>Œ%Ôþá2§x2…QŽà…ÆÁÛf'|Ih~PMŸ7Åéëá(ÛÑè|é~G£È12˜ § @¢PRˆ æÌÇ{–"CH/P³äõؽ4•š[ÞL³Ï™],˜B0,T¤ Ñ È àŒRã(áadD™4o5¥ Óä\¼ô¼KVD›Ik{Òôn+ujÆ*{JcœI®4ƒ)p¥£Ù9(s:”OrþqÕfÝÔQú)§öpFvÅóeâ„u>}¥ªKQ{J‰¨”öž/1)˜¥m*±Y£gEð"‘=ÐG„꺻Ïæ†ãZÛ¸nŠuíË!d½ë8’žYȉt¢”ûÔnšš¤Ò£ºfþ#&SƒµWèít~½™¯UÞýØéû-òäÐbÍi 8‡œãJy%4I)g“½¥_кön1êñvù'Gó·à^ü‹²×ñPµ—Ÿ9m™*–ç‹D· {.è’|q1Ûx¬Pwtà ÅtàV ÷ÿg,ÛëøO¥:ƒ¼B>ÖØI4…ˆH¦zÄ5¢Q1…*¥,äu¥mi#|§köâÊ5~©ÿ¬£Ùö¨å›qrë­GœÚÔ!G0—âŒh‡A/4’ɔ͋u†ù{­ø/^þG©ýýx‘›,ûŠ'úýLÍt¤ÔµÞØ•\R¦rK9¦”H8Ô,„ÐC‘­c8qÙÿñFk£wäNû_y3‚8») ¤ºÕŸ›ö½E2’!’H…ifÂÞá z<¥”µ¤~„UÜʤüþÎÑEz·6æV ÖN¤^¶ªçjRè8ÉK(Öš± ±0õÉIF¦!YïHÒ˸w¶'4Y›ûú³g½g:n•#¥Ê'¯rÖ[S‹ ¢žkL-‚œY 5¦µ%è¡äe¸oï÷ôäš?ëseX;_·”i»Á™Í)ÍÂîrFÊX‚R=’ˆ “Zi©½o5î_’Ô®à?ÅY±{*ŒèŸæucüýUb|»2Õq¦T‚JIhyEQn4–žÃM{ A¯%勒þ‘ú‡Ë2áݼ¯¶ò½¿ªŽizÏÿs4Öæä’JIa‘)ì“Iq¤«š˜Ãb¡¤Í~ÉÁ\fð`ý6ì‹ÅŸ§Þö­ž‹õ>ðm³¾)¤ã$Á\„r„0áŽÃ ÃˆŠŒ¤-Ì‚Äɦ٤´’Ú7R\ {ÓÉnººªT2ŒÊS†0Q0g ìQܹbÔBP. iE´–’lKBp>ÏôŸA)ô74˜*1ÏQÜsãœPë,(R@¤„Qd„+.P³°KÔJÊÌ^ƒËIä¼ú$™Ú»­}1å¢Xd8r„qG£ÀÄ!ÜB†5KṡàYÀ²,7›p%¯5!3æÁëzÄŒ%¨B0‡”ÂA„pB†()DˆEŠ—F-J„µ)~Ö‰€›,¶´N]zœM8%&¼’Úö¼“Q=Þ*É”Ðß·¯ÍÉù$ܶ)×Tôa4¦–ó× Å4ÊÊߊóV»ìË '%Ȥf¹/&åUlíkÈÝ&lÄ0µôÕˆH¤¸{âñk9%°²"Õt¤°º â1™=7™£ÕêÎÕGê¨ý•ˆÇB¯jI–+¢]I…Ê@”‰YF¬K ,ƒž²ZS„K›)Þqß7žÿyFé·B»É]2œ Í[w0v]c¾–íäªC:!„Q…´BÏ`—–¢ZãÖ´=51^á[Fµ#§ó"²ezšhï©¢žeÉ¥Õ·ìÔÒ%¥¬CMa¤Ao RS Qfö¶å‘²3²>eX74nÊ3}¨ê¶/éYPÚˆ©Hù4°µ†œÁ)‰(s'(òA 8’ï#ä#$茧<·4W£÷U¿”у}ˆ›ÞßÞåêE$h[.%Ò˜@¤bˆšå²R:K -Üc/^­ó õÛ;ûÑ<ýù£qVè£þÒy‡WZ’Ö¿§²jè-1°BN92œáŠ9v%åMJÁ®ðš å6]›P¼ÓnòœÝÑõ5™×o˜¼‹S”å m¦0ÒÔ-Ä‘ 4õZŸ%ñ¯¹Y?åï¥æ¯Ñ»1~oͶpmby©E]9M-\“ª=“Ù[Êx†jÎ%¦ñHëÖÂÜÌ1µ¬Þ†çtÿ߯t³;Fï>3;Óvª8Ù ¡‰L´$‰¨<§aå¦b =¥#ìsŽ>”“,f¬w\åží}ÝÙ®Š*î¿ì ø‹ˆÇÅTù ñ/¤ÅôJQ‡(A$×Dä9Y¬B;`©Äçù« «C2o©å_ܜݒ?F>eŽ¢£"’”V¡I½dòŠ çœ¢ˆh¦-ŽD×Úf^"qÜ/™³¤þÕ«ug=vá4{b·µé(²ã&£'·Ç=AM!¢˜sµ¦¤³œ‹A‰c±„íO£_æ·]¿5W@ÿÿµÇaÿË rYBPáL¡žL°¤ÊM ™™™™ÏIЙ…)9Bœ=%S3”™ÿ¡C“”33&Re L¡…2ážIsò™2‡&fd¤¡Í$"4˜S“32Ri‡… JÌæyC” ¦NPæP¤Í%%Rz†J“)&düùLÊ”™L)ÉçÉIL)(Y3”9™C™LŸ–Êdå!'èJœ)(Y2™…!e&P¤ÏÊL,3…$СÉC™èd¤é…’D™ÌÎæP¤¡B“%'Ðå%PÌ” BœÌÎPçò™'30°¡¡ÎS¡”3“Ì)Éœ”(d¡4”’œ)å2P¡)CÌ‘””2““:J¤ôÔ”9L”ÉB RP¦s3…' Í”8D)3(PÊL䤡)aÌÎ&…' '(rfJffd¦™Ié:aI”Ô9Lùó3˜RÌ̈P43Ÿ)IÌ‘ ”¡Â!™Ì¤ÊB!œ"™ò‡˜S8e…38S‡ y…&P”†RI”4äC'2|¦B$ÍžS% ˜hdåg9I2†Jd‰3–ÊL°¡I™¡™™%“Ð̤(C˜n$Ï33%39B†hare'Êp¡= áBÃ)’†M†L ÌÎzJ™IèRs8P°Í'ÿ@¤¡C“ÊÌ™ÌÊ)™)É¡34‡ ””)(r’™™ÌæJJ˜\Îff4(y)™’!“™4(rg%8S2P9’˜fO(RrP,’RCÃ<”áNL¡Â!Â!IŸ)(a„L™ó”92‡… á”ÉN B s™)™:aä§$B‡0ˆf`NP)Ìžffg9I>S'(p§0Ó%%2S ™ÌÌ)3IÓ% L¤ô™f p¡2†sŸ(D  R†‡(Xe0ÊL"dùa,(YùLÌÊL¡LšœÉC$ó9C9%338D8S(g3™ÌÌÉIáe!äÌá* &e“'=%2S2D’D’D399ʘy™’™ 9O33 dÊdèP”"CÐ C9>|¥ æRII™…!J™I$IšP""œ" D% 3çå„C’hL¤òœú(ffg))"&rD4 sÿ)ÂäÒèJaÊÿ¡=çÒP"LáÏ YšN˜|–Pær„¥ B’aC”ÌÎg2D3ÉÐÌ¡C”(r r™Îp¤ÊJœ‘’… Iä¡IC”Ì,Ï”” D%„¦f œˆJ)3ùI@Ï$¡B¥DÌÎP¤æK2D8D3™C™"… d¦K2RRP)Ã)“¡’’P‰3òœÐ¤æþS…9ô9LÌæs™™""ÉÌáNÌÎaÉÉž†gò™%&PÍ æfd¡L™II4"œå&yBœ(Xb J9„C… ”3’!BD(xP”"²“)“‘ žJRO IB€Y'&… BÏIèg='ˆ9™ÿý çüå B$(D™ÊdùÎs<Ê̤Ê’Ì"’„@¤Ì¡I”Ô9B‡2™)Ã,2&šBD!„HdC&S ¦B™…&RP"L)“L)'2Â…%  Pù3'I¡“ò™™”3“) 3…’…')™HP¤”’™)œÊIœ hRPð¡`P¤(Rs™"ÉþS“)!õZÈ4Ç»™*ñB ©r8Îs-”Ç#Ùär¢nátLþ&ÓÂT'ëOÄç¾b]uñh–+È2HcÃ4BLYŒF¢ØÉEþ,¯­·æýí­?MÔ¯sÔ’P÷B/jYEkšhèR ²†%{$)h‰R©¾$Cku¹©…ÂÓ­ˆ]’œi âgÙf.ò¹HêÂ%ˆâ©”ä1È̤ŽwÄ=¾OÛq+Qwfâa0-G”/VtLyEHSD$U¬æ+…i¨NbDy‹Cq㇊†ü{PL¯Ö†ÒVšiI”Üö+sÙdÁRαÑ R“YŠÈO$ƒTÿÚ/ŸM·ÂÐü„—‚ÙjîjºÌÅC9\¥ ­*Hrh²¨ãÌyÖBóvÔ¼¶ÃfI4>‹ƒÈ%ƒT%S ˜…*ï•Nó–9§Hˆåic+±"¬„äR:>ÿH=ÄÑ<$@4(%†Ð“ Ä·÷’(%Ģʷ5HUr)ŠÑÆ"™L*Ž[–" 4§œ’6õ0„ÏÊïõ¨5Úb5:»BÊ~Å£¹ S%ÙŽ¥s‘ŒWʨ¤;¿"‘ËQ1¨j ÇÞ¥zM'‰£òñ¨*ËØ–AV‰"T•ŽÑ HçœHgŽi…”‘‹Ä£YµöÙ¿”ÚÿRšÝJSÛrÝœ¦jQ¬U:éÐÂ¥Èd£ ‹G)Œ¬…™•·Éróõtš'=6¿øÝòcËM5ÕU²Ës%RäA™ƒ+EXç… XGˆ,¢Nñ#e¨ž^íêÐM¥zæÁwÓü\ÅQ ˜Ê2exãA&<1£Љ3„©je7–ĸ´{f Sç×éLÆ­;TœmÆS¯ÈiÚ)g<(‘Þ*ÔÅ1F<Ä”ÄW'¬Š,‡Ò?ÔI¿¿O¯ânߨô%s¬†n,猅K±ÐBÊUÄr!"(ûâcM‰‹Jár½âéúÖ`ôbûÓ½\Ä¢ÑJ"ŠEÎ+JÑt±f,3\žyž`²O`˜ÔÊÿÂSwV»ycaä4cHj\v³9Ôäp¦.aža$s©›q¥A9wÒõ•ßÓõ-™»lÚ‹jf•±$x¯ñÞî"$ï#X…³XÎFÇ¢Z-¥_/…ýî¦M@–|úRíŒ|G!Q8ˆ2H‡‚‰ ò¼cÁƇRÊç^K]¹›¤ÃxÙÔ¯‰æ¾IDünOKÔ·b²`‹aZd!ÔÃ÷s8bUÍ;×±nß‹õÂøJ åÁ¨Sx•Ú··æ»™=¥BŠÒ©ÔÎ+ ò3„I›Pª1¤>ú©±?™ôî¯ãmiÕÔL ˜†«Êñ rE4ä#‚1Œbn™™½dRwŽ1ñ±è„§uó{i_ü[ †ºb›’Žv³LÓ0¨b³Žð‰ÅCˆÇzB21¼Ò“{ Böí²´ìí¥²ö4Á¨,ïïĺ8«êB0¬RH«¶S¸Q#‘B‰SmÞÖP»‡Ó÷_Ÿ ZgÜõHÏcú]ã=bEC†YTuÑ EOlr0›•kq7ôJ‹…ûéå Âu(ò …•É”bRèWŽb)DPä©b¸‰Â#>S‘©ô›ý–ËwÒÂe¾’ 8Þ,cQË’µB êb0F”Ï3 ÃE±Ž”m»2#ö#_°»ÝL—E«wýü´Re%L –i^9æx…ŽÒ…SeªÑTç¡'F ˜¼Û]'ðõ6É¡(_. ´Ná±R…^rïr©hŒÅ*!âºÜREI\ç† xFˆÜ¿d¸”.ö·å7ú™ÝZSñ3þ²Äýö•‘U'YYES Ê2ó¤B;"•έâÜ‹ïLþ[ù?òØßý.¾!iK= ¿R΄m#…S©Ö" e˜‘XÅL+EB6Ž‹ãyu/œÃõÓW+ªù}»f›= F,Ĺ‚¼b΢W•e1Ù™eYޅƈ%ãÈ%G°Þ=H//¹šõù„”_5ÞD1¥O1 G2”ì+¡Öb”«©f”.¼âX¹\í¦›ð²a¶úi„âÒWÇÙ EE+Ìb¹R"LìäPÉ)*IRR®8Ãÿ)‡“å$æJH„¡Lɔœ)™™C%2D JB†¡IB’!9… LÊú¡ä.aN™å3% C¦¤é2$’Y? S‡)2’S39BP¡93”9œÌ” æ†y)ÊÌÎaðÎRPó3å Ê™3(rR„²PˆJN")2D2 –r™2“(s3™"BP"98œœ¡Ê™IC”% HJ¤"g9,9HP°¤¦M ÌÌÌÉ”(s2…†YC)…†D“Be&Pá¤>H… á”ÃÃ9ȇ ¤ˆsÊp§2œ)(O”‡ œÉLÉBÂ……9œ™CÉò!Ì¡C™ÿ(Rae M‰(PÎ~S…2yó g$ˆrP¤Êä¦dé:9ÑB‡3œ,Ï(s”4)(9C)‡8S%32RRRD9D J"Iœô3™ó”)0ˆrJR¡’ rSž˜e& ¦dФÂ$Ë3ó)!NùI@‰ ¤È†Jå32P"ˆS J% 9g,¡š)‡ IÐÎJ%2YÊBNP–98D4)™™’™™™(g=Pòt$¤’!Â!ÉC% J!BÂ’’’!Â$Â$”(Jsòʦg9B‡9(sC…<3ÉÒt(9™I(Rfg0¤æN’…9%3 žJfM BP¡ÊOC9èO‘”)œé‡(Re C™¤¡LÌæg0ò IL…)(y†…!B†p¡Â$Ít9I<ÃB™„C…9B™9“)™(sèJ9Iœç(y%2ü¤ gf2PáæS%™"˜Y„L…(g&PžJRfxR’rfH˜e¡I““(a3Ê™@°üå$¦OÊfsèfg(2С)Â’…%%™æs9CÌ<̡ٜœÍ“'33… ¦fg3™B„ˆ!LÌÂ!(S2RD3“(Jp°ˆr|¤ùI”…333339œÌÊÌ¡Îe$Ê”¡äèfN–aJI™3œ,Ï”¤žN†JL¸g>y”Éÿò™†” 0ˆrI˜A šP˜RPÉC9”áÊÂ! fs9IÊÎr“ò˜s<¡dÉ@¤ÉI…™)™™N&’†fOC4(r†xr…2s$C%(JPΓ…%&™LÌæffg(iú&„ÊS…9 Y†“ÐÊI”“ž†O(RfRs”3™þ‡(e Ì” Nå dÉ”3Éè””™I<¡L”å'Ë= œ¤"ó”„C…†ÊL¤ÿÊ„@¤)C9”9’”'“I@³:2e Ÿ”™L)’ŸBP)“2˜g$¦H‡'†O s>~D2R…… LÊP'B‡ ô3”<œœùЙI™ÎPСə)’™4) ¡Ê¡ÂÊ8P4þRg)™’Iž|èdˆ)èe&P¡Â„ÿ¡œô)<œ‡ÉL”Ì"¡NÉÊs@(s RfRe…  !B$"'… &r†rg3339C“8S„C3% Ng3…8P¦LÒhRs3339’“43ž‡4 æPÎNPòe'(XIÒRP¦L¦93&D&ý þ¤)’†M äéùÊL.B”™LÌÎ,'å)žr‡“ÐÎtܦN‡))Ìü¦dò„Bg&gä}ÿøÉ ýHׯÍmÕº*±EµuúF,ðÙf8AC¢!NS‚b„ G·)›ø†$Y)ÿý5í[^´ß¼oÒ­/D(Zè@E;y AÂâ…UŒ1D§:‰/å Yä¥-…¼”¥â}0’Ä¿™y2a–ãnކkB”CŒQ(AQ*@Ô]ɆA"cyyºûô’^¬“S{âZÔ)0Ipó=¸8åT`…8†âA“Š8W=|¡âe.Ë~®VÒVµ´¶üéç´Ž¹%¾q•–œs«¸@…£”Cã„5È r–\"'î¢KZÿôö¶É5»ž$Ô©ÛG“'ˆJh(åeœ ¥ª¢˜wœ g=zc¸Y·è4N¾^—µ+yíÔ5ãm]_¢dáÉJ‚vaFÂq !(s"ñ A-² ƒDÚ{y¿íòVýóOmRO7yÛ†±|PÈÌ$‚+N)Œƒ9Ž #¹}Ç——ÎU 'ö«Ä’¿KVlä‹¿BÉ=.uáo±%Ÿ* +ˆ†a\q„#aÂ;Ø`Îy¸Â¤YiâÖZRNµ¾ûjgšIþG#ÒMŒ)Hù¡Âª â˜Ã :˜†8ÅßPƒ¸Óq„H‘{¹ Jt•’”¥d‹üÏ<ÿ1Ño~3‘â‡)HaÅ8‚ :¦Co8VÓiÈ‘dÿÅø¶¥~~·ô•úé_Tá$ðPˆ·†(£æ1Èæ(ÁNÔä!›e+O†ò`[Ö¿=-•ž—f›l2ñdÀÁˆÉ· )ÈcŠ)Î(A.`¡]©è(ì,Øçyå¦ÓOy+Ñ).KÏú­³KóŒzè@®föÅ(ƒ r b<†‹nA‚¨Ñ0§X³×-=kÑ+^û^%0­³ÌÛ(ÍçìΙ0ÁHq 1„(ÁNéf …’Œ(ëyóŒ±'­4<Ÿ~Ÿí´¼ôç|¼¿a؇¶‡B"œ(Æ0‚ÂqÆe¡‚¡%ªŠ*I7ÔÏ&×ióZô¬ô®’YëWm´Ô”c%-@ˆGJ‡R)ÆqŒUæ0áˆ%yg›T¥–j[v²MÖ¬×Òtóv™´$»GN®† R+˜(å”BœqÅoS Âþ(‡qæ­]cK^¦Í[Ò“ÞÛ–¼Nâ&^&ë`Ã…!‡âŠ!J!C tZ f=°„$—õ–yþ½I-~’Ñ?p²ÍZ•:Ipa”…ÿ ŒÎ(£”QŽ! `}c †®á†A¢væž”ûÒÖ­ë5)‹,ö©’ÉÑÄv~ð¡œÅQ !„8‡! tê¸HY±D:Ï-(­'W$¤ÕúI¸Ï4Yû™:öȇ+§l ш`‚œa SAƒz„v,™‡2„–¸G–›õž•êD’ü,J\UÛKÃGN°¡J:¹ÆÜR¦9[¨â„cË¥g–¹šidù>—ùôKO'¦Ëì2õ¤ÑÆ+.øP‡1 QÅAE!ÔÁ˜Gu<¼S´³íq‰4Ô§Ë[u©,õÖ{GÊŒºi0 æVÖBâbŒ1ΧpLµªH9e¤Þ‘rKR\›yíè³Kö\Y4r"%A+ŠA1Ä 21J1šüAÂ-å•f‰Ý˜y'êZKu-òMm#Þ%&:¥/¡‘ÑALc°S(R„0QNÿë0El+¨izº^š_µdµ)Ô–-|‰_”V¨”ÈÁeÒ…¢RŠqE!Lpå'ãŠ+„¾P¯$O®%¥—ë[Þ”ÃZ4×Ý/¤Ð’xP…r5‚‡8ÂáÄ(…·¤S8Óm ±&úezI+zKJeöy©‚–‘ðazþr»­ÂŒ# qŽbUK Pä$´sŒ‚Éõ!%Ÿ«],“Ó-,´ù"Sʶ‹’Vé*3ˆáR 1LP\1sÛPq$›TIæ­tß”¤“ýqúh–•ÐIôÁÎîAÇ0ÅÅ9ÂŽgi(gy¨²Ž“Dß)­%ǽ§Ú^zö¥‹Þu¼Û8èäúçv0à P†1 ¡ŠïV 9I&¼çQ§ÝežjÒö“íifÖÚÉ=,Ti¯ÌNžJÈW]Š”&qÎg)ÇÇ)X¥ ‰õQB”Ywt'bšY+I)ZÖû4²z-$Ÿh2V]„ÕZ£9HsˆqÅq\`æBóÂ_‚ óדæ›ä­~—·Í$žšóOòЧ—ŽFLðÁwSpÂä)ÎRn@¨%÷je ?ãXŸÔ’Zm-$OÕN’/H:ø#‘uÃ)HQG9Žb;ˆpfZQE‚Í»+(y¿ÓIõ½ëõ¥d–þ‰ƒD¤Ã±¦àÁ™Õ,0Q Cs˜a…"”¡»WØÁÖ±sjw‰7+4•·MòWKhJÑØ×‹Â †ü¤F”p‡qÈ ¥P¢­\A‚¸JˆBMºÄ$±rºid¯I5>pO’'á߉ƒ Ǧ†ç^ @®1N1(áÌBA)ž8¬<Û´)fŸð´žÛ%"wÿÖñ+GYfà žöðX饧(§9„c£±Î BÛ`­$Û©bÞ-;þ{I’É.ãÒyþ¤Qå¤A•nVd” ç §Æ8…Dó‡§)†CÄÊÑÖx–Τö¶Ë5iÂhñÄYfÙ‡Bš1™ˆP˜ç Apƒ Úä ¢Wc°Y´¶Z^> ŸåÉe·ir,Õ¨‹$\ˆ;§Ò…ˆæ)Ê9Çr0#¢ƒ8õÅŽ]µQ¢EÚõ­-+YdìÍ?È#É.Œ*O àŽe)‚sŠ1D)Ž14Žç=s¦„¢šX˜jMöûO%õ)³Eê%åÈâ3·è R…8ÂŒQ…Î(J­¥:‹lb “ÏLÎ4Òým[RdÙë&cdI-)×Ãbµ¬1Hg8£A‚0᥺D „‰E¨ä’6~!­>ÍJ×¥ùo\ÎÉbRR •È‚9›¸8æ)L@†§ s3)+R &!DYå¶v {KÿjIlšI4…È’Râ­fáÂ×ê) Q (ÂãˆGp¡ …²Š„—VäIæêâRy:Ö’”¥'–ܯ³II Ä“%G_¸@¥ Œ(‚œƒ1⃻¤!›1Ä,“S§—ë[ÉõÛÉ=y’Mò‰.ŽŽÙaÃ8ê!…Â)Hîc“¹Ä„½4‡HÒÓ²ÍOµäêS§–Z:äI~aP²hàŽE댦!G0Ä0Qf`E?úŽ!›³ÌÓÅÝÂF¤˜5©}e¸WëDËŒC_…*ª(Ç9ŒQ…1D*!;KÈvnÇ;Ä–º^šZPmq²J)(RP‰0‚ Êfg ”2Reóç”)2e ”Ìç”)' s3“L„áÌ(rPЧ9I”ÃáË O”"”% ÿ)=’‡3(JR} É@¤ÉL)™ (g2$“B“˜D2P³ ”33™B…” ¡C”Ÿ%0ðòRN̤Ÿ(s”9™ærM…2e2S0¦fNa¡BÉáL…”8Y@%33™™(r…&S%$C“ò’‡ s‘ NRy”™ÎPš9’™’…&P¡HR†s”™Iþ”™Î… ” t“Ÿ”™L)’rJd¡ÎRP)Ã")¡C”9I¡™C†˜yÏô9èar`Y'ùIœ))“C…L¡9˜S'33ʜɔ„C…)‡()™ÿС̤¡C“(JPš)<¤Âœ(S'2St3”9IÒi’…˜„Â$ÍRi‰“,>e'ÎR&S dæJ(dÊdé: JI‘ ’’rfJsô0ØII3 NJPÎfRe'(fJ„@¤Ì¤ˆ™Â’œå œÉäÌ“(Päšhfy(P¡’“2yLŸ3™Ê…)&P“ M Í ç"L§2D“å'Ï(rdˆp²‡2… ’PÉB™ ÎP¤Ì¡I”&D‡¡B“3ÿC<2RPð¤¡I””9IC””)2˜PЈJr„æ¡I”3… Iä”)äô33š”) Rfr!C…)>“¤Ó 'Bt”)(Pä”2r s™)(Rd@¡¡”ÉáLÉC8RP4)2“‘@ˆrfs9™™Ìò…'&RfRJL°¤ÎPå Ì” ð”Ì™% ÙŸ)C s2Y))“LšJB r…$òi)™C,2Â…†Yès”) r˜Rs'C%Ì)ÎRP) 3ÏÊfr’‡<¡I…™"Ì¡IB!<üˆg … Ê„Bd¤œ¡HR§‡ ÏÊLÊ̈g&dÊIÌáC“ LÊ9B’¡Iý!LœÊI™)(Rs2™40С(Y’&IC“’K3”(Jf&hg>PáÌÌ,3LÒå0¡ÊJh&Jaʞɔ) …“&g dð§2“)>S0áá䡜ÊIç(y…™IB‡3B“(PáÊ)Bs%2bHY”<™B“ (M ”ÃL– B!™™)’™œ¤Ê™ÂÂ!É™(g=t(rP¤æJ™L”æPæÉ”9¡œ¡CÉ‘ ”Ã% )(RP¡ÊJd¦JJaæ”(S'“)2'(rr‡>S'œÎH…&Nad–g2’S% ÌÉ‘œÉþR|ü§ fJ(fa§Ð¦ @å 2„áC’‡ >XS’œ)(œÉÿô3š9š˜s‡2s3RPå0¡aB™“4(JDÊÌ)2“úÎ…&S0òtÃÉIèfe  L¤¡IÌ–4= ¤ÊHÌô%!3“)%$å B!yNÌ) PÎg(s™I”’…&(h!t'I¦r‡'Í ̤¦M L¦fe0ç)(á@¤¡I<Ë °ÊILÉÏ3C'ÊIœ¡ð¦fJ”8PáäÊ(r‡’™™"""…''BÊI”œáaee2PÉC2‡ B!Ô™IДÃÌ“™,¡Âœ‘&S Lÿå$òD |%ž‡(g?€QÿøÉ ôD}å{uxµ"i¨b¨f[Í%ã×eÁð'Y¨µàŽ*ˆRA 8‚8…0«˜¨;„£å<²Ú^šÓÍi¢Z5¯“Ä­~µÈÙU{ @É3h¡ÈÁG `S :„0á¶#ê|}6¼òdn¼6Â`x´‰I¤’-i’å"aÚ‰iÈ)”*Ž ® qÁ qÁÊq8c-І"=t”ÓRYešI¥ž-%š“ÏOý“Gø¥âšA)Æ@ÁaÂ0ãŒ8pŠ(E§J’¤»ßÝH—ø¿4÷–H’Ĭ“üñ+ŸKe¾U£’ƒŠAL@â@¡B 0ã„ !Ì ¾TÑ^»l§ìzÞKM,÷–içè—½¢_‹µÉ0ê¥%A)L@¤ 0 ì „ $AØ—Dr°L¥°Li/,ò^X´„—¢RI&“Þ™JÒüÂF0†RŽqÆ0â…pã¹ÇPÇ3i ‚íº»h¶´ói¢Zy'‰/Í{Ö-uòš&E_;È9Î0¦(ÄáÌ8Qƒ1‚9Cªêª¥êVø,ZD¬ÓËxµ‰“|·¤JûS‰n9©p¦8 0AÇ ÁŒaA1NQ)´‰†5~û.Ö§š”‹%bËGùú%î]/†R‘&!ÈQÜ8ˆã *ŠS#6sšBIKlJ‰Iëñ+4Kƽ$¥þ?TºJ A¥#œã á†1ÁÆ(c„ +"Î"&c©O}–³ÍX’Þ-¦–ñ¤Ù¾Ö’I º´ñ åc‚@ƒP£„8d ÀÎ⹈)†ô}R^N´™[Ïy¢^Y&’$L4$µ”ÚÆä„1 ABqÆ(¡Â(Cb¹Ü£8´C{`Ó`Òd{Ë=c^y%¼Ñ«^’Y^ÄÎe;œâŠ0cáAN1†q‘†K…ÿ} Õµëi´ÒÍ$“Ï%âäxÙ. OŸª™•5F)J!C@A 0â‚wb&R¥ópí{^Iå¼jÅ’‘ò<“vá'õ»åÏqŒcP¡ aƒ`¡B1Ç8Q¤"Fjïé¼Ñ>~žÒD—ãÏ$µ‰kB÷W둨ÉUªä+œT„ ¢…0ÁD0AÌ(¦ "Ðëc­)ÆïJÏÓKHöžI¢^KËX_Á4L’‘hÜÈÊ@æ pãœÁ¦¡ÊIPªd6ÿSiÖ–KÍ$÷–4•ž·žñ*'K²2Ø– A 1BŠQÔAA\0qJaLG‘(¦pÜ]¶ì>‚t³Ö4’Köš²M,º¶í›G{"ØaJ(† Â`â8‚ˆbP¥^b,ˆI~ÚÄ–²K,²D´Igùe跞Ʀ‰ÛR²3Ç9Â@¢† @bÎ3„8¤L˜¶§Wþd’Y/$ÒÉÓÇù--­iâf…¹Xª’0‡áÅÁÇ (¡F0®2¯‚Ýeþ“©$“O°´–7G´H™=©$mÒéqþwIVÎP¦8q 8QÃ(ƒ d0®Å×lO­ð/ Ñ)4Ñ+òBÒÒü—‰ô.Æ ¬Gr†0ÂPÊ ÁpÅ’»Ž*®! )¥ëìÙ4òI,±$’Yo&]šZzÓ–Ü3­8åqÄpEaQC™ÌeGÄÒHH½I>“ÞyiYf’Iç›d¿Þ«ncð‡c±A R…p‚âŒ9Å*¨Š†äÅæ§›bly©ÓÏy&–i¿¢`‘3››G:N‡(A8P pqØŒÊB”W>q52-ijÉHmžY£|JE’ipZý¤¼­¨ºÐªc A†8AB `ÂŒpîB‚‘؆1DÌ]ãÍåÉïØ [A6y¾="Dñ)o½¥/¹9aY´qqÄ (Q‡aâ|ék›^Zϼ–’y"t¶±þ4Þ6Ú’REÊ.xRT0ãŠ8ÁGPç £ŠaƶvÌ&á佫?EšÑ+zÉ!'é8÷ПK"rÇqC † á0Ã0SÒˆuzTmjÄ¥æ¬Õ‹y§¼}‹%fžÿ•§Dã¦(…pé E(â‡0QÊa 1Q‘ÜÌ6m†½ä´“É$òKJÏY&–n%°²eÝjË)‡1Å(0‚0S…aA†QE1ƒ2ñU“z´ÓE¤²|zż“DŸg´’K}êó)–íp¥â˜¡… 0áŽã†£ƒœQ,í+_ÿé²Í[ĬòÚ?Å–%/-fš™ôÌŸEWb¤§ A„81CŠ8a‚ 8£†Î!ÉÈ¢³nûhKM'ÂRHÿI礒RXº^Átv©Äa…(Qœ0¡C˜ Ãf0è EFå²K|¿ìòÞI%–Hµ‰h±6jMH”¡VJ9Ê’,¡ˆâ„0£…¢‡ p¦;Œá•°®×¶´’i%´÷‰y¯,{Z³t‘?›wEÑÔÊ3Æ@éPà p£Š9œgˆ¢ íµ}!mklÙ,_‹yg’%§¤5~m–ÓWИ¢xêuˆ Q‚89Ç0@ÈAŽ U0ŒŸô§¥é~–‘íhß %!p<^›"ue·°—%lbŽAŠ`£  Rƒ˜e0€¥IA‘·W5p÷ظ -bZ$ZÞy#[e­i?ú6¥lqX`ˆ£ƒAÌ8‚Ps,ŽáPÚþüѶÒtO‰?Cl-­âË/Vô¤Ô»g!h„ †()‚ (@ÂpAŽ0Å1ÕQJ=F›šI­jKkÄ›á+,.µá-Ý>V/"ªÐž¤0ê0!‚P£ P¡ÜP¤;!Jƒ¸K ÄÕ„ÁëYëzDšH•šÒžÒùi¶É©ŒLQLs@Ç 8Q˜â‡ug)œ\nî4JÉóÞÑ­4Õ5eµá/Âíko³¦÷ âS8q8á(áH`¤3*•EI4¸%D‰±ô-dX”,ÿ4Ô„ý­6’åÑ]‚ˆQŠ Á„0€‚ QÃŒQ1ƒºú¤E“{¿-4’^÷‰x’^,‘+i/¶ü›$Z¡ž€…0 â‡((B1Á… ‚àé”[1q¿òÑ+=&–óÍh¿ kIñ¯/4šIxÊÎÊà…0ì9Ã(‚ ç)…9C¦§³°ûÔþ¼²Ii¯ÓÍXÒÏòKÐÛ»Oàó),¡ ‚˜8âPQŠ @€Î+sŽR`ÙîtµêVYþ%ä‰h—šX“ôÛ<^Çíé*G*Å4ã˜!F(Á ÃŒ8€ƒ ¥;†W×yZ&ŸëÓZ{^7BZñº4JÚ·´õ÷îËiÄyJñÊQN0qBŠ8 à CŠ’³ Ää[¼½[S¦´oš{O5b^Hl›¤´õ±õvR1Èä8Æ(a…0â 8ƒ†)JA!FôʼMµ¾ôI弲ĤI­ýkôKTœúMŒÄ1R(ÂŽ ã0Aƒ(QÈÆX¨P‹½­G›ozÖ±d’IæšóÚ%"Ũ^¤]äÜãÐC0¬â…ãˆp§ 8@Gq2Ì¡[)˜©¯z^°Ÿ÷$–‹ñ"[©zDê¥=+ˆf“qŽ(¡E ¢Œ Á[¹t>“·½//IòÏX÷¬kZyeî½%û>¢æGw†PÆ (¡Ža(¡”(w"œÿú ÿø ÿûjtNä?l gå@ ÌZ¦Q蚌¼Ïg£QìyMfõäJ5M9Ꚍœ˜ÈŠ”{“ÜуB wh£LúŒŠŠ„,¦¹nYFŽsÊy !j‰SHk¶ª+’«„,ÂÌLIg÷$¢J_V«Õ°¥²êQ6¤ªá !hˆ©íèˆË¤-ÄŒ!¸¦ò=IbHz¦Tó‰v£Uµ—œ•z&ª{Üž­bÕî[6\ž‰ÈCLyOtÊ—Ü–%Yå(Ò'\´gªë&2Ü÷{Öű*¸Ž¼´{žGåj'#H,QâÙîÙRYsÑñF‘zæ”ò••h÷%.,Ç»zò,‚Æ 5X’K+Qìô__L©n[–ïʯ0H¥Ë‰8“ +jªÕ¹ZÅ¢5!|…¹nØSN%˜²“Y(ID•ý½5Í8H@Ñ‘FSYè:÷-—l[šBiKr{.’íDÛcÈiƘšEÖobÌ<(x§£Ījªò¢­A%l¸“‹Yd-^©«ëíE¡*™éÒ_!gVžqgcÈKS\—<¦»úúk7«Uý=ìK.£¦ØXÃYyV¤ªtÃÄ?ºòó5„Š<æöj&UýWÕjþĘIÅœòšï¬òˆ×8xâÕž¤³Ñ}}}}2‹„$„¢ã§5W•}Z¤²õËfäErUrAel8Hphax¦žA"‰få«Ô’Gæy W¹lþ¨©È¨ˆˆˆˆˆŠ×-ĘH¡c #úQµ•®i rs’å÷%‹v–íÉcÝ (²¿%Oy•=ªOf¸“.{"j¦¹e5›•¤±=S‘šå±=[ÓÞ‹Ê×'«XÒåªÐ³)îù “©©Ëb{5ËDy‡™ðÅ¢ûs’ae,…³Ô–~TT[?«Xµj72ã®±eRÑ®y‹¥(²6ÜÒŠÞœ‹è¯!ä|uä÷³ò¯ªØò—Õ¨‰¬¾´y#éEŒ(”gòå±*™RÈi Å-—¥4SqM)å5“ZCX²ÏbÌ4æªå_“’„±.[’ĪjØ•%ËbX–}0’–Bû–p‘Dºå_]èâÇ +lÁ¡Á¡F•ô…”šÌID”Dd[ŲåM1hÕ4âÈØG©,iMU¢òrúó5EõôÙ•õ×]ìiÇŠ-ÛÓ=}Ó,þÄ‘ðãG 10‹ä³r­§Œ0µV¢c-‰ˆBÌ,‰Ö,§µL¢áÆŒ-‘jKžcÕp‘DµF±d4†˜hƒDsQ¯ËcJ^#óµGèœ×ï«)B‘”%T>„giÚ—ÄñRº­¥;Jv¡<_Û´¡ŒŠˆˆˆˆ”-ÉeÔ!*K.¡DŽ )ê«Ê‰ï)äbÕý5‰ ±ƒGWô©¢Ž4¤«Ô·%Ÿ™âGŽ4¥±§(·N£ša$n]uå£È$ÂDÉ¥5žBó<‚LZ7¦³QqÖ¦œÜa'|±âyßUVbܶ%‰bX–%‰gåV¹â )nJ#H{)gÈžÜÉ©RÙùÓ¬ô^EZ’ÄôFj+Y²ç´E¢'-¥”ÕGœ$SÑY¬K.ª+–a¢ÍBJ,æ²ã-^¥³zêºeIT释(–z&¢UèÔ{‰,q¥EU±¦7–\¢c½›’¤¢jXXàÁ£I„œK¶¹$-[ÑÏëÄ-$P“–¯¤,†´DT[ÄôDwªa 0–bÌ%Ó(öVõj¿¢«U½³[7¦£/€44ÿøÉ óDt[)µúß8giͦoÿâsɆÓW©”ê^ÖoÀ™tÍ[yNÔ)¥:D{ˆ‚9œ#©ˆƒœ‹Ììcí§ke9÷«]>K¹}«¼\Àôt]QlV2Õwr†#Œ•„YÒr“Žõ™J=ÖÙL|6Óé¡3/Ç¿ûe0l2jxž#:•nS„aRBv"˜qE•GÃ>Ëíø]–£eo­Jtò“³g¡^űøäggSHŽç) QD_+b•œD¶¦³í{ ž–œ ëM­eœù¦®Ý[\¼r¥™ w)Ôb(ÊaÈŽC$f-žï%÷Ã<šm'}´ý²æÛ oÛ‰ŒN¨ŒJ”¬ÆBˆì+˜é:”"ä9!Ö—%ì7!.nëyö™]¥vj›ðzHn|“',¥«ìuó)Xƒ1b”®qU›Œ¼þW˜¬M!ú˜\¾ä¼jtœM¥û˜Ú·Ã:Ñ7Dv*™&rC…A"¤«`©›‡klFä·î׿¾ŸJ[›kȵ¡$£9 )²ªVAHS(U1’R 1¨V(†ŠJ‘-¥ä&ßKùm¯ïËZŸ:lÒ‹/”­D^ˆwaTæ „+”¥SÈÌAÔš–4ë|'¶ž™L¾Ò¼6‰yòͨäēޅnwŒ·REuìV1œcšì¢8á=Þ!+™úŸ·Þ®×÷ÿä§?èmuóyðUK#TårÜW!Ê29܈[¥T#„”žw¦ö6,¸ÕÑð›öÁ«RnFçT-FÑ×Ù‘L"LR™„(ŠW)B²úˆÑÛD2I™§¡$ãoÛ¿©¿%ªÝ‘ªÈ¤©¶gB;ÔW+”…)S dn)¼É⸴n"ý|½Åú~|¹ÔËl¿Ë–¯YT·‡vC–S¡Ê¢»Œ… ’´†HdÍu Œ&ªÜ”Êq3%Óei}jå'Ïmûm“3‰±Ez0†AÞr¨ë(‚5N¢b{!ÌܵJõ(&½w톿æÚ“r~"¢q´eRª”å#œ†!HQŒ•AÔS‰*kÏžÕjçöM^ÂbÛÄÉ~‹Ù&È÷-ÑÖ…D†gaiÐS8WœTåã<ä í¤k~53éÿ´’˜•¦Oš¥Ñiv‰Úc!•g3˜Æw#‘¤g9Žù#PÎ^âÈÓÐüJvÖš>KRZƒ}ª›²kœ¶mÓˆYÕ+ª$# ‚Èv”B•Ðèl×¢MÆÆ¶ù/vïäj+PÔùµ )%UEc‚)ˆ@ÃŒÎuŽD#D[ãú%«¤í·uwæÜî®éˆ&Ä%ú“¦O9LB"Ì“¨ç,ÊåÒ?™ü¶zÿa¶•ÓSæE |;â_§_FŠR$¥qVqt°¤tªAÙþÉ‘ &£Tÿ–Ów_—iø{–ÜâÊö!œÊâ1Èã¹X¢,6ÈW?šÍe5³kßµÛïþInÍ.äm3rËC¥ˆð‹R¨¨e)FK®Å«±D!6«§kf’ÛÝJutùó÷— ’Rbz߈wãBަ)B B9HQˆ˜!&3hÞ®zØZ%òÙJà¼_ÈÔ'›p&ºq7lf²<„.GÜBt™gxR‰;YE Ö%Zª= —ݾò¿ß{Õû)|ãIÓ² †¸ªg!Šæ) ÐŽ#uɉQ×]kN'pØOëïå"f1µ§â2ol…J2ÔÅ"޲™DaŽŒ**j9–g×V«.µ<\-0N®—iNšïÚY2D^. ªVJˆÇw9¢°Â<ªbŠW£¥G¼‹h¢S‡¹{ퟳçw}&åâïó'6áÈ„uaJ§s™ÜÂD¡‘ k-T¿·=NÓf¨Ÿ¡s ¿Óo¶´s’´;³œçc°¥aQÍr8BŒ®u—”ZP_-7úL“]$øëÜŒŠ¼Mò*™£%HŠc0†ê@ŠÚÊ£¿ö1(²iñ©µÉ*lÉ÷¬§¢ÂNšcH%g#1H"˜¦:ˆåަCDo#NµÄìbu±ÿÿÿ$¥uo›/zfK±ˆšÓjD1ØîadIT!ž„#UÏB þýq;«ÇüK×’AqëJÑ[󴆲Ò0eQårŠd”Ž™HFÅæTí¤Õ×­0Jeð“gn_‚|ÅԛܭT,¨2¨ÏaÐÅ`„S9Ä´E¸ˆ¥‘º+Û0Ô}é|”§öÓ¦¥Ós&m²Dt!*vev%+bN3ª±Ö)BHØVR×Òò L®[öØ_½}»°&Èk’ÜBu–wSD!SœÌWV© ·B0B‚úõ íølûéò”Úå!ðFñ(M¡,ú.ƒª™&Fç9 ì#”¤Q êº¼„Ç- Y{z™?eå­ÆÎü}ؽ ¸ìµV3Î÷"­Î¢±Lcù…B#¨*FÄÌÝíËáz¿¶ÊþŸ² ®“±—ŠÁÖd»9ÔFŽB°Ë!”ÌCq¶¨”lVË=éùNËå)±¿Ò¹¶ójtloJ+:ˆs”ÎS8Œc ¢ÝX¤Bµrh„âæ-L¿òرBg7"ºWA ÑAV裢Ž2XˆvpÞž­Bòu^îúw[‘¤Ž= þn~,½RH˜tce ®b°ér Îz$ˆÅOV„HJË‹ønË×»©—ßîènŽÙº˜è…Bør$ï)’"Ì(‰ #yÚý*Z>®ï´¿Û]¾-±&…þù‹¸;§•jG*”¢‡r˜…! `•+]|§ºL@|Bq?KNéN>ý6™•…ÈÈW¢{) á܆QÎ#;P¥s¥Ù@‹>á Bêöño—Ç®[vØ—lµM‰‹ÃühèT™,V˜Î"–pRŸªF²¥#¼\ýoýúm/% Ÿ\.“>Îf뮚UU…få1 ®·:ÎÒ'ºC¨]ÕÔümí=?²o5¨>¬ÌŸ‹ÜJ. Š”tå; Ä;˜ª*™Ê>±QˆJ'B &Zº|ktý‹õÊvWZ"ª¯§£”‘OPªS¡Ì§s…õ+¬¤uPV›v§Õ?5q§¡­PœõÞ†øÂ{ÿ??+[C;©”…QR9œE1˜¦I\Le#ÈL¡§HmBö×°\XN¸¼KPÛØ±© ©äºU(Tt ä!æ38‡Á]ÝHW²D0ÛøþJå-”® ¿Ñ©*>âÛHÕø:ÐÈ#†)†J ³©S2Ö]Y ꘺È7á¿Ý],oÛýØnZKHdVVS%™œ€kŒ°ÀC'3%2S2‡<¦d¡Â$Êfd¦M… … J…å8r s3Êp³B†…$C9”ÌÌÌ™B†‘&Rz9™œœ¡)’… Já˜D2dC'% B†fND9”ÉC”&Re'”)2Re$¦Oü¡I3„@¤ÌÊd"dèg… J9¡Â$(p§†hg’œÊÌå$¦L¤™™™’’a‘ ”3””ÌÊ< ’†rr‡2‡3(g!dÎP¤ÌÌÌ–d³ 0å å O3”™LåPÎr̲‡“ (s¡™C…% Naa)“8d¡“¡œÿÿùI@ó 2™43š„C…94ÃÉL̔ɤ¦g(JPÎe&S&P¤ÉLšS LÊå% ™3”)É:|¡äœÌ”Ãɤ¡Iš(L¤ÊaN”"‡ „€IC…I@¤Ì̡ϠS“% œ¤ÎP¤ÊS%2!œ’†L¤ÿùœÏ?ò!†s”™”93‡˜YŸŸ…àR¥ áB’’Y‡433ž†Pæt”)™™ÂÊ™ NPÌÌÌÎyB!9(D%>áOÊL¡šB˜r„¡C™(Re 4å% ”“2RP°¤¡Â h2K fPá@²d¤¡"!JOI¡ILÌÌ ”ÉIB¡ÉáC33ž‡(S9™™(y…2e% dä¡I™%0æS3332’yI‘ áL”2t9I”,"˜S% (PÎf…'$@°(s)ÂÊü¦aäÊaN…S””2Êdò…2Jd)C9)™IB™…&ÃáÊ>Re$ÊI”9…’S Jp³9žfÂ$™Â“˜iC™Ì9B‡ '39CÂp¡ÊfR$)2D&Y™œ<”ÉÎes9™)’™4Ù%% (Jfafr!’”3”<(S%3ÐÏ%2S&™…&rRPÌ¡ÎÌÎL¡Ì¡I„C%% „¡P"˜S…9%”% Jd³”2’JfadÌær‡˜S3'“¡…'$Ê8PäÉC'C39)ÊÎg2’e&S ”áæ¦™IèPœÈD)%0“,; HPÌÉÊL¦Îfg(y2 Y… LÐçò“ 2R’S% ™œÏ(Y3B“™)Â!I” y‡3(g&e òP¤ÊaLœ”)'(Lå LСœÎ‡)))(r‡˜rˆs(R“)‡)(r„¡Ïüå&~)3™”8D3(g2Pá”)3L””9¡ILÌæs332„¥ ÌÉ””8D9”)È`” dÌ¡’†N†s¡Í II”š™J2fyÊND™IL)“‡(hS3“™Ìæs2„åO™I33%32†hg0§&s2†pˆg3ùáC…ŸùNæ‡(g(e&hpˆJhp‰&g(&e3†NIÊÏC9ÿ)™Â!Îæg2Y…Ã)3(rP"èg(Re%áBÂfR‡2˜y>P33œ¤Ìó,?"̤¤¡LœÉNær†RIL”9ú·"ÌáaLÉBÃC”'@¤¥ ð¡ÌС†dô2e$ÌÌå33 ”(d§,Ë’’™43 œ)“çå% Ÿ”É@¤¡Iò RROC3šBRfJ3(d)Ì¡HP²K™Ì”æSž“IB¡™™<ÌÂ’…%)…&r…2P¦N]ÄÿøÉ˜ PNÀK`ð xl¶ãåεš+Z|¡ƒhpóÑèô†nIDOÛ]æ0ò„+ ^‰4Aj–ñ¬}sUµx÷,h8$ïÈŒzÈ¡vöd²ƒ (±D»’s¿Öý„]B‹(l/ç/’>žÎ“‹r{ñ,!) vª*]$SJ‰(‘ú'"-Ï)àË瓳b¡0ô?&ùhZ’-úb”a.ÞŒ–¬‡Pæˆic¹q"–Œó ž ±MFçôL¥,yä {sÄ$ I ÌòÆ„4: ¾ªŽ¤v#¬ÇŠ$ÍáÄ1ô^ª3úhfCÞ™IBJn-wÏ)½ý¨ñéñ@#†„E§X‚Œ–$‹Ì[Õâ…ŒpÄ¥/úŒ™¥NÙ, µ|D J\©-Ñm3¨GåW[¥ÔŒÌ·oG1ÝšDÂF/Zj3ÐÔ=uõ•q:¥šz¡Qã YÇÁº…Y›,±Œèü[5žBhŒ{ü•Mbk1ì 0œâÌ%RDˆ0ÑBLÙXXfŒwB-ZËc1*•U¹`V+Í£Hˆæ¹i6\ÌcTÕ›µYŒ p-¨ÁÒ4`±"WRjµXg9qk9åz*ÁK.†‘)(IĹ»k©šŸað†]žé5nÁ\‡5Ñ ·d-Ó[¢AØPÚzܶmSŠ&ÃY+(Hƒu«#ÑV…öðòy„ËG² (±‡k/™ì(ÎØ\õ±d$‡.&5_9ê7?ÐÕm¡¬^aVÆMCͰW„7jŽQšSÎ$­î• þ’n2" é¡*ËFëÂÓQLõ5ŸÔpé1}ÚÄâ°©"ó¬ fO§<¦ª¥ &I&CzõF¨¼»ÍŒZ$-q´ X¢ÈÚi&â5ÞÉÆaÖ©÷4Q$D‚|‹$040,ŸÁh5‰BkÈãØˆíŠœÓÍc*U´Q£ 9,e:,Ô@á[DâÙuQ’9MŸÄ”ü»_Bò÷&øšc¸¯é–?œÌ‰éR 蚌E£%sï {1¿\Ï&H åäC¾Ñ½cÓÌ:‚9¥nu‘$Bª˜±‚G +é¶÷i è‘E µ *ÖQ*}ý\¡¤ï²€ÚYP…ÖJ%©#ŒB±œ‘FkžÏì¨G°PãP6qZGñ»ºP‘Á¢ yîI”ˆbX•(å2µQJóš+Y••R ¢êU9½áš6’\÷5MadZ\I G‰=H;5^Qa@ñÏ…I "ò„®^\2Ù¹‚‡>M²ÈOFô¡üm-[É@ZåJånj’àÛ“ …˜RD!&#Å<Ï¢–É "½ðh‡”òÄ3K·îo<†êR¥ºâ5’4¶p¬"mÉGÍŽUªYä(#ÐÜK&J4pð(-møÊ[‰8¶¸[6ø±Cl<ç…k§óµAwD‹1¤gˆ$9æMtb®˜P ö …Ù DʧÃ×ù¹õÚU;¼ô·QcH™¥™b ‹ÌÌÌRãýÖ‹ÉQT@h§¢fi‡ K3bê»k„òcä±'y‹cÈkƒîœf $§˜’’éAò':p9Ýäá≚çû{æÐ¼‹“Xôlg£o¼°±hãÄs\l©r£¥ª0ëRë{¯"ƒø«åäBz¾ûST·‰g”Ž›ä˜ZÄ‚9ÕT‰"ÝŒŽÒ’RX e¦M¨†5W!ƒíû±’Xx£ÅB턈qñÛ9(Yt9Öª¡ˆ!¨l¢X–$Íól’ç˜iEÒnm BPØG;ªå 8 bÂ(eeB%P¬"UÈDåÄÁµªÔz¼Â„ 0üÅÖ.MijYñ¦Ø!ËÒ‹d(ŽtiDŽ4ÂŒï›iÏ)=† p_ #e”Õ? å£ëj’HI–Ap‘d‰ò tŽj­䊒·ÑFŽ,e{ðh†¹lÙ¶/›å©¬ó*IÇœ[­.׊ᚯw¡â,êFZª‘#$dÎ÷5Çølö©ªL¨Y‚Õ-0I Ž lqP0¶%ü ‚ˆVE”²¼¢¬§”XFZù'M9æSpª—Ùyv‡¹þnFvDêPšÁ fŠeÊ$È*äj¢ƒ™Þº$æœâðj–¦ œÛ”©å?¦Å“H!FBr#(û£ƒšRÌ$cÂ1Úc]YBðnZ/=Å„=E¦ (¶mðߘd²VCQ6%´#Œf£Y½žt³‘,X¡!G‡Š{7$aDÑúþ­ï¯Û¸Ï¨ö౉ÈÄ«Qô(Ì3Q¬Ò4æv,¡¡ÂD4†€‹(l=¥a&U¢ÍãQñ_R>ÖèW\DG%¢Ì£œÉ¬–yI!Z8³.œ³žt`ž4ÍŠŠ8§ÙºôzßòIGœü¯cÙã_L2„5‹UB^"ÆX®Ò‰9ÇEòÑj´Z 5Á´Ø!ýén7?6q+¬£½[®J8>$°p°"’Ž‘MIS™ÚCÃD¸¾a&5Öc—­nÔO°” sц±=¼öS!êõiCQ Dbc]„ Þ^z9&5ƒÇÉûHN\NBeqùèMH’r®|¡I“™)(e Ì” \“ɦffd¥ B!)™óÿþS&D2SÐÎJd”™L˜y”"IC%9JIÊ%4„¤æi=%$@°È†Î…rR²†NaL”¡.|ù”’XPÐ"Jg3’”38RD'L„B’‡†S'3œ¡œ™C™œÎeÌ)(S…)%0òJd¡ÎRLÌÃC% ÊJ†RNg„Ρ™“ÿ¡™™…&egò”’“˜xPáBP,œ–áJNdˆ””<ŸÐÎPå I I”)”„I0ˆL)=É…2gÊffe!B¤ÿèe$å Nffp°‚¦Ì," rg )œœÌšOüˆpô3…ŸÐ PЦO”™LÌ¡C™”<”9™IœÉL”ÌÎg8S’“)2†s 2…&Nd¦"“(ad¡HD)9œ¡aCš(dþYË J”&r‡“Ï”,˜D%)Êå ™ÌÊI"L¦PÎL¡“““2“””P2D )Àˆp¦fJdÄ2h™33'”É)3œ¦Oœ¡ÉÊÊL¤”)3çÎPæg9C“ JHD8D'0æfS™JB…'0å ¡Îdˆdáž"C,¤ˆ”:Í II)ˆdÏü‰2“Lš4))(P¤)C(Nd¡= B„ˆD!f™2“)>S„C™C3&Reó NIå2PÉùLÌÂ’…2‡3C„C2Sš&hOŸ(RP¤ÿä@°¡pÊL¦M œÐÎP°¡d”“)4ÉIL–aL9šfN’…$§' 0СÉC9”šJ%g”ÉIÓPÉ”™Lå%39œÌÊŸ2™…3’~S32„¡I™B†% 4“2…&t% B‡ dÊÂœÌæB…N¦f“(O?"(y:ÎDÂR„¡“3&‡†g8S„Cœ¤¡™I””32)Â…‡(rs(adÌ–fC™9œÎfffsŸ”ááCŸC9Òi)’Ì)“)(Rs0)Ãý œ¦OBz†Y”ÌÉC””8D™¤ˆÎ¥$åPå2P¦Lˆdæfs$HPÒS†”%9™@¤Îaä¡IÂÂ!9C(ˆ…”3I‘ œå'ÿ(Y haJ(™™BR†Rgÿóçå L"Ÿèr‡…8Sœ¤ü°¡a(RNfrfg(ffrg0²K2D„C“™˜Y0°ˆaL™Â‡9(D…Ã)’r„²"I"d)C&RP§ pðÎhs¡C@‰(LáJÃå2t…)&r‡†RaP°ˆs(PáBÒeŸ”™™™…˜7ÿøÉ˜ WDç„ÆÁ¶¤é!¬ð åÖ,ã˜Ès ™‡0ƒ0E‚•‡xíD¢ëP¼xQ¢lôØE¥©jõ»¾õãZ°Bz©’D†Š§‚$WÎDfK’¯†y³·û‡Ü sKñ<&ß­ôµæŒjru @åa BˆP‹œã)Üg!Ò ¡$-‰bn>J$-Ad½6ßï'[¾¹ÖòfX"«©HÆ2™ Ì0Š£ƒ,)‘[Ó¿ )bø×KÔ¿÷ÚòèL¿V”Àl9êM©äEº„Ž(¦@©D(‡e ƒÅc¹<‰YöÂJðøku©o­m-xÝ\ýíΰÄt»ÊAÍ(r!Ns±9Þ…v2џËѤôÿ³é­ Ô½ö¥tjÏ·5yÕ¢X8„)D0È9…9ÌcfaPÌÇÔBséz³5þÔ·ÖN¥¥¾ ¾|œ]şõʳ¥Ìvr†¥„2’aŽIª¤\D°” ¸&ü™&ßa,ò}ëñ ³-êÞ¬e”$`Î!9¬A 3c,ìB© %³qE”5†Ê‰”¿|Ú> Yó´jŸ-ƒ!”T:AŠaÔQ QTPêÕV"Õu´ –› ·É?¤ëü¿JÓkÔÊEù=žÌÆYà#D*‡I‚š Ç h ‘y!ËKóoe)µ©a?íò÷Ë£ÚJ’¼%ñ–€³Œup‚A ®ãœ!La˜vØ §ºyÆŒ/¡ À•ŸÄý‹Á6ßZÿZ€[Édó3Ζ„8Dˆr˜ã(å ²‚$íGTxšM&‰ÂR†è’oO·¦ß¢RÇÕ¶ÒŠ<ÂÔ1£¡ÆYÄ(T¢¤E0ˆ åédOö¤cÃT&}þ–ûýïL˜=†ýa Þt: HQˆç‘ǬVÖv"¢C–&wøÕ QiP²|»=G·¸¬´ÎâYðíz„„Sˆâ˜AŠQ\©ÈÀsî)„Õ>´¥‹%Cø•ép'· ”¥4üß>G^"Hó¥Ìª`Á+ˆ!Ø"HR³9Z¯áÖ cçõ°l’ƒMI;cT7Ò^sí¹=\y ²¸Ì)„!Ä"J"„t IA[¿JMMì¬Abõ©ò`ÝÓl· ÙJi³7Cl+’g»”¤l@Ç1Ê:QW©²&‘6 50ÝÖÑòJ¿É’_ÂÐ%AºbóóÝü‹0yAV+ bŠPŽ)Œ*Æh‹Cq·‘¼ô>–åÖ§_íl<•¯ðüÝkH²u¡T£4E¦SW£ s YT⿳Â4=‚Pýô§Öúä®É×Ù¥rŠïÉU2Iƒˆ¢¡’+ aÜT޲'k)Àñ†£ˆ7pñG‰Zt»._$´ŸÚ/xÒ ’„ì…t1 ±Pc©ŽçpŽqe)=ŽÕZ6´)âW6ÕÁ²²øýh– §®õ2áMëŠD²Ü¢ÎÆ!¬Wç‘dº98Mçâ~Wqo>^Ÿ%ð]´lRçSÍɪ (V:·)Qž˜‚‚) 'E#ØžÛ I4½kwI²Óca«’m7ú5R]î¾#D] †"¨TŒÁI £3 ò.Ï7yp›–®iç½:nµ+·¿Åœµ¸Þ¹BÈ (*Äi\£0ê)£(ƒ¬æIÁIµj±¥'sÎ,¡ø’è¿_µº}¥v´Þì„ ŒšF²í8HaŒ*B(‚à W3”E™êÈa6¿h¶òüydɶÒ`³Ô¬ùψú¾µkP9 CGaˆaXDÆXës8™TË0YK+Ãp»}´›kämúÒÜ&è-© ôv•nwŒšpÆÂ0¢¸¦FhRJ•b§\d _–ùm½Ò÷é2_ëvA®™Åå^wŒŒ'*EAÊAFaÊqˆ€¤ˆ®`U®èºj‹B<'|Úkà~¡í¦þ§å¨\‹€­FRÈ"ˆœŽ2ŽR”*\ŠÌŒP”µûKõ; ž>VL´mã65‹D³Ê e ¤"î0… ð¯œäQ¡w”·?—:âE¦Í¶é~Ÿië¥þ¯ äÕ\*»)Ø¢$UQu†X…9ˆ ¦,E«º2Ðða¢á-PºjÓ%émÒd›Z`Õ`SsbyRAêIœç(ê9Œ9J!Èc ®¥Y1q_vš,ç|ò`µÉ½gúPlzÜk>ɰD£°Ï!Tq†3ŽA˜d;:ÝlÍ ÑƒJ8²Û0m­r/³ý¾ÙzçÓ!p+õSÖÈfPBTðªqØ$FbªDƒ<þy »L-.$³åú×Éz½ QlZëgÒ-Æ3:†<"Xe9Æ9ÎrQaÆ Ö­ËÔ*Ó†ñº´¤˜Bw_+^¢O‘’žEAÞQd3ŠS ¡àŠ)˜GqRê‡GíCØ^6ÞpnŸ~Ù6J`.c1ñ^ŒCEc8Ê9áØ"ŒS£¤˜•(“—Sö8‘ûúÝjÒÔ­¤Á)·Î’¤¤û”ï*çˆ9ÆaØcã !XB0BÄn°BDÕ¦å¸l§%zl—E® ÚÉô©y5H€ï2ÂÂÂ!Š'sE `·WVäÜ_”±÷åËõ«ózß­Ôý¶2¤Ò=•„AS˜B…IŽQL@çBŠHa%V+hw—©Åý®ß·a6^¥~ß^¤lFlΣqÕ2˜¤Â8‡(UA â¬`fþ¹l[Kæ”ñiׯ[é7‡¦ ¢m|Ø´›5LÌ"LcÅALAL@ÏR‘"–),sÎ%ƒ$’ÚjðûOèßm‰ÂÛEîÕJ'Ò5E¸cÎwF–(¤†iʱÉ0GEú–M6H•®O£S&Ø–ãõt˜ÜŠã=ñC0¤œ1 2 Q…ЬT2!ÇXNѸÛ.„ñ)h¾-v]êõ"áÛž¤÷K0XCY\Rœ‡ƒ(C TêC´ j÷¯ž§×§Øñ$ðyCvÏ––Þ.›pZ%l @f««L*@΂¹Ž ºT®ÜBرš5´_kM‰>=«[íú”üø^)b]=œ¥à*s¸å0†Qw ªg*””µÍÉûÔÊÜyiZÉ‚R•ùÿt^&ah´F0È‘ ä! s”v£°† ri™§/*õñiL·RÝ.ÒR”¥oÄØ_¨ÜèWXàH)BÇqΡPFˆ’Üé*$¢rõÆ®žÃIklùH–¥òœ-I­•?àQå#Œ¢HE2Œ*QL"ÖíbšŠô.B’MÙ2J}ö_¿×é_îµ s²4Ļȅ1D1„1ŽQÇc¨¤*ŠHÀ¤·WÉñm×§ÉN¾Ú= aùMEé =ÕNæ# î@¦† Ê!Øaݲ©¨¨›M±ú¿Òdy0Klºn¦ B`|%ÛÊEˆ—jƒ0!aX¡HãœPáR…B‘î1´Ÿ–êSˆV¸Õ ™œÏ”ÌÎe “3”9™Î LæO” |†œ‰0‰2’…!BP9”)œ¡¦K(s”É(Ra ä釘XD s9’˜Pæi’ D˜R“9Ê”ŸB“)= ,3C‘™þS2P)332P°¡aCŸþRg2‡2˜Y…”%œ¡ÎSš™ùL)ÃК8S&!“C%™ÌÊæyœÎr„‡&ÉNˆLˆd³ &g3™œÌ¡Â!œ”Ì‘ ™’!<˜’|³‘ ™Êfg ç= ò…†D2Sþ‡(xpˆrg(r’“B“4Ÿ)2œ"B“(S…9…’Y)CÌ4"'†pˆ”))™…&PÊÌ¡CB„ˆ…)™)…8ea'2~|Ê)Éfs(xs3” p¡ÊM Ì9™C“9Ï”ž†fg p¡aC˜‡9LÎhRaæz)Î’‡(s¤ô9INdˆLˆaÊœÉC …2t”)Â!ÏŸ)“å 9ÉÌ)IœÂ™œÎPáfH“9Cœ¤ùÊÉf™II”,™ÎyB“<§ Nad”¡Ìå Ì¡Iœå$åNP,ÂÌæS 3 s”'0Î~D2Sÿ"̤¤¡IÌááLÂg…Èba4˜D9&IB™"!¤ó>e“)2’†fJ% fdé RNPåP¤ÊJOC(Pòs8S% (fr™)™’$’Ã9(sž†p¦IB„¤ Y33%3ÌÐ8D%2RS! áC3'”)3”™aÿ,å&fB!“,(y$ùBÀ‚†„ùæP¤(Y2D2gå2P¡,†xfp§%” 0¦dÊLàd‰&S$üÿ(Rf|ó(P”™˜Re áN’…”33”9I)ÉÌå'”Éå2Jfg(ä)„ô LæfPÌÉLåLÌ”ÉB“(fIB“™Ì)ˆ43Ièg(y4™“ÃæRe äÊBœ)“˜Rri’…8S™™)™’ Rg%3 fdÐÎO(ra™Â“)(Y3™)='L””3’”%)0NafÉ‘<(he ?9%(B' Oú¤¤é‡)˜D 0å œ(d§ô$²|Ê)’™(xPáC33(e Lèr‡?”)39C” pô 2˜S!B“))(hS2’H†™™Âœ™Êfs¡’‡ sÿ¡Êô%™Ìó332˜s 3èsC3 Læd¡Â$Êfs9™Ì,“L›0Ó!PŸèe2)&sèg…2y4ÉB™9™™”3@§ aäÒPˆO')0‰$áB“3å&S…“ d,¡?"(É” ¤9…'2D8RS%2S2D3ÃÌ2e ””(s>†fpˆrPÎI”9œ¡Ìåfp¦fd¡ILÌÉB“)(SP¦JPœÂ™9™”(RPå'ÊJ9ó3 dÊJM „¡C™HLÌÌ9ÐÏ&”'2D8D98D8sr$žM% ,ÂÎfPág 9IæS$ÌÉg)2 XR‡)(Rfa”ÂÂd™I@°¤ˆNe2P)’…9)“3’™)(Re39C3…3(fp¦f|ù”2S$Be É”™IB“)(PáBPÏ%3™ÎRN„žfaIB“™:9)“’“)&HIHS393Ø¿ÿøÉèHw)z¸}^!íµž ëYWKHfÁ9d9Žg:]G§ ) ™~m¾ýé-$ûÚrp4¿^>¶²¶Þb”gBä aE F†± ¨Eõ΋ùîöúÉ‘°L ~‰mŸiL¼+¬±5¤k8D²b9Ä8­—Ær™J¡? þ|ûà[}ijÉ[Ú’E^ž…©±ÉDŽ;d³(‡ Ä®)Bœã¨tìIb˜(˜›=³ mŸ­'DÝZÏ-úýÖãûR«RÊaGC ¥ç£\@*F=7˜l-:\—~M𵓦ëLAoœ^G”·Fo¡È1G(„QŒâ”C”u˜>È`g¹9»O{æ!z^–•–ÍÑe—i}>o”Ÿ„IT‡ æ! q 9Ä ’e;)SÂ×E+ŸöL”¶‹ÓÒöéiZÄ!ïõ²¦™üxÍI aˆ £-˜8ç£8®w Œ8e±¹ó/HžøòRO–’Y¾,–¾ßM¦ C¤ÔÛ1JRŠcB8¢sc1ˆ“½SB[È+íðl¤Û' KIóR–¥fKBæ5Iv©›ˆaŠ1Ì;È@˜b…bZŽ:"ãþÒKS‰×¿OòV©Y¦½2Ú]×…"j¨Œr˜ç1NAÌ §8î0Ÿ8€êU##4öâ¸|––¾ßƬ·µi|›'1f‰ÞÜÎÄp‚ª©D9Ä¡ ¢™Å"ˆ²[ǯ½ß—½©¤¬•’—µ|ÃÖ-µÇÕÈâ%k³)ÄP®!Ø!N9‚9϶̬‰¨þæ6ÞŸ7^º_š÷¥ëKh°®I!=jšT9Ž’5Æ0‚)ÉB‚ 9 2Äj”pQÑ»/†ûK”ÛÚô´½4ê-¡7ÿ{«ã»{1È „ƒAŠ1‡ ê¾ ˆ…'¶K5Ò^µë[Û_¥ž’WëßHæ7ÃU|«"\£œ‰S )F8‚¾ 0!„c»•·Š{ð™%zûjìÝ5~|RH]îìMV†#’×!Ê)Œ2ˆA”c˜# f$ÑN ©RYûA7p¦¥k~‰“Ù¯xÙ>¯LG’%E»î„bœCœa+à‚B„u OeÞ¶é'R½--.EËKÝ<&—‰š”XR”±D ‡¦I†"1ÄQH%å0:£.'äõÜóRÖ½dù¬Ô–%©Jí3ã™ä—ˆ„!ˆrŠw1DCˆ(†jF8;˜®ìè<–pÅÂõ¾—ÙpÕµë[ÚÔë”òÄïçöyIUJÈQ q3°ƒ!…9Es/Tpé©™´ÐÝùPš?ÒZÒiZNƒx”É<¸ë7—,¤3 æB(‚!0R—<a™Œ•TškV®×fÛÛm²Þ“àN¥ò§<‘³õ­f *·¬C2,QÃbˆgŒ=j0FM×ߤµÜZ˳äôµî†ž%òØMÆ„;VL+”ê2…!Ì¡ 9ÎqL)öAÁÐT«%{aÌ¿^µ-kav{V^—mO”Që¹øt(gžC cŠa—…1Ê!ˆv)C}N_ž”†“Ï„“ä­¤¥äQ$‹m>%hñ‚eó Œ; gBãALaGÃŒK::㇮8ÆÛ}­I{ò³KI6Zõ¶Sž°™ÉÊÎV #2Xw ãœEÁÄ)ÆAæY¤”ÁR”Ø?u:öûÞÖ¥lAk »o7®‘Ä§Ç ¥0…0΢Š@¬)†Ù#Ny Šú¤'ÖÔ“ïnzÞ6˲uf²ÌLʧ»ÂäIN ¦ÃÊ1ÌC0‰d¾0Ž^Ãm«ZS$ékYz÷¤Š±çþÍîO e/iDqŠq SŠqÊ1ÎsAþâ–«¶% ¾EËÒ’|½5 I&µi]¶üs<³êº•„AF1‚a 1†|8PB˜Ž"‘Ö[ØI›m·Z–ÿµk%/ò}å8ÿÒërl†.þÃÂdà aÊ!N!´;5 ÄÈ”Æ\䤖¯ µ’_:DA"ÑlärcŠÄ(‡SŠ)’†2™Î•O (í·Ã}«O·K²Ûâp\¬ç ðZ¿y¦%BÏÚ99ˆ¢ a0‡(¤9¬‚ª¦¾¿I/=M½©-ièX²Û«ßLøR(ZõJ¥)ŽSˆRQLCíH§sšcÚzÍÿJ_¦ãÿÅÉ«òSïñU¦˜LMôGq¶59…¡ÂÇ"¦Q/1A—Ó°™òÉÄ –ùzZZK¯Ï­µÞň9ºl•¢$‡`Ê3œâœCŒq l8qÎE:ÑSH1²ÿZIÿû¦ûIJÓâ9« ï•%‘Ì(W£ÔRœsˆ9jqƒ˜¢B¨Ë{Ø ¥'—I¿?SI³t–ùi%Б"SûiÁ޲SdRŠ¡aV!8Ã8PÜq@©fR&®‡ü©ƒð·è”{|ZÒÕ­~‘‘Cͦ¶Uq}\S )Ž;Ø£(Ä9 å`´¨Á_Üݶ÷—f¯d£É4¸ÿA*Ñ‚‹£Ðè)J:s˜£bŠaˆsüÃ…3!ÉéúÚê£éoHüo,l†—‚ÐhVi!*iÌÆ@çwy„0¦RªÌ0PŠ)vº‡Ìˆ2çu:½y4L,úo&Í/xóù^]å…3Ô`Š!Ü:JBp‚¸VE%¥ˆµLÒ`Kc9-KÒõ¶µ%‰KWï¿XU@²}–!È¢SP§j0pÆÌF*-¼á»NÙzN¥z_’Ô›­$wÙãáyùuƒŸúc”R˜c©Ø(ƒ˜âbn°`®ªÉ…ñ+.Õð^’’RÙâÚ$™&×û㜖꒭ÈÃ!T¥ AÌ ¢›… Ó»ˆÒ·k(cx˜zt¹. ƒÛcx^ùᛤ†çÌEV#eh)Ç0®æqD9Žc.h(¥D¡yò%?\¿-&Ùk\ ôÔ¾_¡µdaB”çFAF`Uæl0@ädB20nÉ ¥Ú[¤úS¤­¯ÒÛ¦ÃÊ(×ú»D÷+ÔY á)îA”"a ãýBUmlêÞùÄÁúÖ¤¿%ÛâÉ$ÿÓi éYýXîSCˆC°â †A(ÀÌB3‘5"×Üb÷ß'É·dùþ_µ«}´"–ðÕ&¢,8¬¹A 9L;B„Á*æÖsÕÂW·OI©kÒöºìië]ËŠ q6%ìrB£ gfâˆ7(c1Y ºé¬"ËÃ÷Í£xß,•µio·Ee—6¤«9†9Œa (‚!l@€È¢9‚É!AÉÍü-é?Æ }´Ý%/t,Ñ¿k…Õx"¹äªŠƒ(ä¦aJ„-Ò{µ_P?}LO“¯^‹ ¿h¸eÛå© ŒNåK!Š Îžã”c˜#}ˆpSÇS-5…™× ý[ùþÖ½$¿É2‰xM§ãòä1TõòĆ‚ãqÜsp0 èB%OfëF»Q&ÁkÑsñâ^O Úãh0IžPáæ&~S0¤¡ÊO)3œÏ9œÌç(s9C”ùIŸÈ†O'ùBˆL°²‡4(fRaL(p¡™(dædèg4"†S LšaLœÉÈD2s%2På%i%(JÌçГ@¡)@Ÿ rs”œ§ dæp°ˆh% ÉÉÏÊffJ>†xg= áBÃèRrD8YC93”(s3)„¤$ˆd³<)ÌÎfH… æ‘Ã……% fp¦aC™þRP”$ D“3å2Jdþ†s”™Ièg(OœÊL¤ùLÉÐ<Ã3&D2S39’!“42PÉB„òr†g d¡I”9C”ÌÉ8r“>|¡IB!œÏICÌ4ÉIC”ÎR C™(p¡¡IÿÊd”™LÎPòhfd RP¤ Xz¤¦ffJJÐ(8RÈ’J3Îp‰ ¦JJäBPˆre% Ì硜èP°",ÌÉICš™B“™œÎPäó)2“2†xièg9g)… B™.I”)œ)C &rg(RP¤ÏÊP¡)B…†D0ÒJfJ @‰É™™(P¦J II3&RS%33œ¡Ìå&Pæ~Rg(S‡"<¡ÊB$ÂÎS$¦ç(xR¤”™IÎfd¡I”ÌåJaB™Â“8Y%332„ȆJP—2’S'þ†xg2É”“3˜Y330¡¡C”Ã)2™6aNL"C""œ,ç”ÉÐ)Ã)“å0òJL¡)By™”0§‡?(D% Jg3™™BP¤ááL™9šN’…9¡L)0¤Ë&X*YCœ¡Â!2!’™)’’!’ÌÐ9ÊOȆNaÌ„ÌÎg…32S9C™óå&S8Y3Bf¡(D8hr„¡“?)˜y…%<¦N„¡I”ÌÉ)(Pˆd¤ÌÌÌÉL3C<””æP¤Îr…&r“òÏô&S&hL"ÉšBe&XRBs% åÉ>P¤ÉB’y'΄èg9I(Pó'0ç™aLÌÌ™C™ÊLÐ))¡C™¡LÎe&S$¦OȆNdB’…”ÌÌÉÌæPæfM0øRD æs…„C“2På%2D(g ¤Ð¤¡ÊC$Cž“LÊ’’…„C%3ùJÌþPó NPÏP” ‡49ÿô3šÏô2Rr!Éœå&$ÊB”™”“(sò$Â$ÊJ˜D2dÌšÍ!¡ÉáaLÉIB’y)™CÃ9…8S… fL¤é?C% ðó áIšd¡C2fr†e LÊI@‰ ”™(PáB†RaC'Ï™C9>z,Ï<ùü§>‡(S2e ÉþS!áÉLÌ,(Rd@çPç¤(Xfe ðæ|ô'¡™:Êú8e&PÎO”ÉæPÊB‘”(y'™I(Rae!'ýB“”É‘’‡Ê,™BÀ§<ÌÃ9–É)'å9ès ò‡†raäì"̤"œÊIáÏC9B…&)2™)4(KP¤ÊJdÄ2s3$C„IùI™”332yœç2D% JPù)H|ˆP„B!3””3(s…J,”$³<“49CÉ¡œš9L™3å $”Ì)Âa@¦fO=Pæ™)@¤¡L)’s”žNO’œ‘ BÊLùCž~Ryò™ÈÜâÿøÉ˜YHà—r»z¢Ý÷ïQÝ«Ø}†6¤Ã2ta€hö¡ìLcB’á=*ìx˜;»䔓‚U”ÒšBUóʪJ—I¾hQJ ›¹j‚ P$²Ù¹1 ¿#•ÖèB¯Cì0e[,­F˜}èLBjan'ŸlPY • ¶z¾¸Šv‚ 3Pp|‰“*éRpñè¿;Q^CÙÉ0Ó GÜÿæƒë÷Ÿ#Œaýq I ĈxUS’V*†` —"ÕY–¸XÁ^âU3°áiw6¾nmŒ!mSúiLùl"º;£BÜ v!RE²ÔXõ§ê˜Ä•Q±h}ãP±Ã0,'ÓMèJ*D‹š˜êW±¿³§²$ñº ½ˆÌ´%®àÂÊ{|ÑÈq¢W[7øÞ ± O~%ŸJNÎVAE¼\ fg1šŠið( ÒÍ„Z’FÇמ.7U€!ï5ñ7Je¾ŒŠ‚€Ò0b e…ø8î¾Î̵ՈDrP¸‹0ì<õÂmE¡²A€Xÿì{½Ð•lMC¼ËG &9LŒÅRý‚f¢/&Q™Ç©ýsûx0FõÖõíˆAå£Üò)K?XÈb+†‹@àì¬fôÕÄ;ªPÞMK‚ Ñe¡³RÅóA±{’„ªb–Œ–kª™- €ƒ#•jD8Ñ¥8 ÝsÄä°­ãó›‹­ Á`J—ïsH" 7JK=Õˆ,›0*JÒ;NN‡Ð`(!,¸g°µs«i9³DÁa?KÅóp€è ôL£j«0É).…cŸ¡@äwv*ÑM&Ž ˆBÔÔWzÙÙݽ›;€”=‰¼J8«yyeOwè˜!œªg™dàvfGDuÌ!}§E¹¨`B‚ǽK…æÁB°X&fîùcÜ_+ Þ…3 €@«åa #×òeeåÅà âÖõ6%1i ‚ÀJ›·Í3ç»{©Ê,ù(YšB-Yþ1,÷V¡¬—FÜÔü&„p±½Eœ%àQ/Yµ6BHN¦BÊ“-  )YYÙ$.…¨Á’¢zaBF §½„óèPU‚oÉé¦U¾ä­ê¦U<~ sG5Šñ€ÕÈP9%i†»i+Õ„âÑ»¶0rÆ“ßxþ³@ÑkFJ=ÖÆ§XgK1 ó‰°€èE¡/"†VWï}C KÆÒyð0s€Õõ^',ˆ‚bUlŽ®QâR ub¨„”Ø4ç˜Ö.™%6«ùõzPâ@´¹ø½REëVÚ´‰ŽoÛ…YÉ*X®A@hÂÎÏrHzðS±æ¯…ˆ¡æýÊëSÍ"Áì\òÝ:cÔÛeª)Þ!-° áˆêw¬ú †{‰¶iÏÏþ^~Ç…  \ÏìÏK ÒMÞ÷D+Èyü¡Ì×gå›a@t‘r‰1¸ÜìÕ}òÔó…RA»³ËÝÜ0"BZA,‹RÙ3u${¡˜Š4\…˜¯*PyèyQZÆf¶®îáèHàCÚyy;‚$ _Ì©.ªFù0P‚<í2Ù/ áÀb-‰3z§•JÅ©¬$`¨4Ę%G»tQŠ ÜF¢jîÑHéd³h_ÈV*°òP(*-!qj+4Ú]MîÞ:ƒG–„Æ<ãÂ’PÛùGœ—Z_Š…y޵†¨P.×{"Ph„‘>Bñµ>8¢bWù·>d ©(šŒ´&£HT²ÁâtE)ІžA‹rÕç“P2lý†óÔ‘AV$³5³(B¿ÏsÊÖ)e%kx@ì+ÈŽu  Àfeºò¯"SršùbƒBgãn~¬Á<³Hk蛆‘ʨvŠh§´mGE¢±dðÁ^¥ô4B˜±õ³¿Sú bÀ{.(–Lh-pŠVçc†µ¡Av˜Ñš‚ÂÐRUt¦Ö!.J$—`² à%ç÷û äЂ¤HN_Z­T™,u9^E•ÐH-B€twjÊÓæèô|óJ:´6a5÷?!4H=«Wç‘Qä”’’ÌEa"Ôà*PÊÄr @Pa UÖgÔqOææÊÐÜp*‚Þ¤ón§¨rÒ7b»£\— (¢Nò¨HN™Œ®¾Vàñ‹RyfÍ ‰új;ÍXØ”RÑ>ï²Õ˜RH %žeG#4¸ #Õ¨ƒ‰¶r/îS3øÐÁ ×þ%_ô€‹<_º²%“"Ya•,éî,'…‰uª!žâï˜#bæ©üáDliEâgù#…Y J5$<ÂU}s3ÝÈže,ÀêåR¡Þ‘ª]SSd+ úLWî¡ ~|ÎÔNT’.²SH~’PVŒy‘̶‚\(T¹*訸Î9lZ=|R¨ð¼Lîß¡¡ÌÁ`´}LJ§}l–ErÁ%øpñ:3¨“Ô`õ^Ë™´ÞÖÕï?!ß™ô5&g 'bì%Du2‰pY¸8ÎéDMdÎfCò†PÐÜ\­I¤Èã0h=‰É”F^Í*JIZäcËðP2 Ò½ÚpOÓ€@‘ODÜÕE•°˜ùa`J>nØK¬rÚOªé([ü`C*¹HEš/@ ¥!ã‰d³eQÑ3+BñÀ¯4=.æÄ|;O]ê¸BU{‰3¹I2J¾<'†Œ©f#/ÛRžÏÉØ ¬hšn¤Ì0 {ÀùGòñ„ii×L”“7š.ŽgrH‚Eà`s-QjÔlwEnn×ÓB0<5=ºº¶9,„ãåªIïÖG!Ò«xÚ *«e°Ý°‚§´‚ù}  Íj RR €ðäWÊ<«­-T"UØXÔZ‘.D°yî(=ÒŠúéD£6>cap #Ç®>òçóƒ‰Ð_]ee©vµ¦iFSƒIÐà!]$%K$í DA¨¤N¡"þîîŸGPx&ù|’äˆl¦N,(H­AA¦Èàuw:Ù(x[µR¯¬Õiß+ì%±´ "F†¦q¶S,ÔçY G%)p‰;ȶ2P,N•.ÔBl²¨15v„Õø£¸°ŸÅÇÿ, v‹ÚžåäB®—Ñ(¢§$‚ÂÐàÔ+ÄE8-¼( ^+\Þ¹b2_˯¿ AàþÚ&ª¾H3M.:r˜“Þ¨" BJ¼;Z  @×ÐÈ´|Ç ¼Nåç˜R ýJ›‹Ü2G‚fã'F£õšè¥Wë €pã–G"²ÕƒŽwäg³íØRß°œ^|Šà»Øô7¿˜ËhÔU+Ñœ’V(£!ÖC4}A†WK )1HV5‰åíÃÂokSI©01"Ãퟫ¤ò“ÑŠ¶*±ÒXqE%’Æ‹¡ÌÕO~”Ç<Ý›¦âè Užfw¾kÕÌÁxÄ”’5¤ã¼éb4䊗`Àuæ3ù¢ f³"kw¤´ÐmÒPj>`Ô==Þ`ñ#3ÈÜ#³¤àÓäp X‹U¡ÿÿkÀ RP"(S'Ï)(Ì)’PäÎPŸ9NáLÌšy”8D…9,ç9Îfaædˆa¡BRz¡Ê9””,"å (P礡IÌ9¡À‚… òi@å3¥'”ÈD™™˜RRP¤ÊˆL¤¡“å339é‡XPÓ”ç¤ô3”9C2J8D NL¤”9@¦s44’†™‡)))Ìò…% 2™$2g% NM%$Ì¡I)С(Yèg?C9B†…0¤¡¡LÎLå yJÏå%’œ³,(XN„èg?ÿô3ŸùL™I@å“>~s™)‡(r‡)= )2†r‡ NRJ™þS$¤Î”2™2™ ’D™¦ff%(pˆrffffLÌÌå% <“330°¡Í Îf… žaI”šd¡I”9 dÏÈ“ 9C… ™)’”rtÌÊ(y:O D9œÌÊ”8e“B†Nù¤)IB“)4ÉN̦J(™™™ICŸ@¤¡Iý ç)ˆR"“" Ê8~Yèr†r‡)“L”ÃÉB!)Â$ÂÌç”,'̦O)‡0¦g‡&s9™…3%(Jp§ s9C™C’‡†dÊJÉ )“™™"LÐ"…% s“9C™™™…8S30§&rD Rr‡&sœ¤"Be3'̤(Reœ3œ"Éœ”"B”ÌžPç)9I@æs(P°¡aIå Jæ… LÊJfr“”ÃÉ””|§ :44É¡I(pü",äHdC3% ÎePÏ ¤Ê8P9™”9”ÉC„C3%3)&PÌÉÞ†sC B™<Í B“’…P¤¥!°þ‡(r‡4ÉJxfy”9@ÎIIB’r JD$å ÊÍ ç¡I”Ô9¤¡æB&aaNsœæs)2‡a”Ô9C9úœå” ’Yý'IC32JL¡É™™ÌÌÉI,)å ™)3ý ¡š<)3)3’™™Â…˜S@Ï'þNBO)%2dC D òR2S3%%æS…”–Rg̦L¡Â’ i0ˆs% LùL’‡ sÿç)9LÌå ðÌç)ÏL”ɦ,(S&P¡)”Éô(Xe'ü¦L¡L4Í$BpˆÌ¡ÌùÊIB’g&yC™”3“å9ILår…2P¤¡?¡(p¦g= áÉáNi()&P¤Ïú™“äByùC…$BP‰ X Iäüˆ¡LÎe&RyB¡Ì s49Cš… !ðÊ™B’P"JfRe3% 礡LÊ™)C%)†…32‡ úÏèf… 0²†RN„Ê¡ä¡LÎJ œÂœ<ÂÉ”œ§9L„L)“'3”9…'2D%ÉsÊr†ffg:“ R¤”“C”49”:hRi„¤ÊfL¤œÎPæS'ò… dç JJœÉB!3)‡(RNPСäž™CœÏ$B„ð¦aIÂ’‡)2$“Ê)“L pôšPžJPÎJå% ”2Rz“òœ)(™œÌÌÂÌ"Læs2D2Y"D3C8S$ü¦dÊIç”)2e Lå2Jd"“)'2’y)“B†rRe338S‰2RP)œœˆ””(Pá,Âä¦H„Ïå pÓÿøÉ²Hš:“÷Žƒ‰Ý†µa…«&ýèg,“(ˆgcûÄS±Cƒ8hÕ{?®çU2?[KÔÊRzÊëÛ››g¬0EÕåª)/(@é#9ŠåpPƒD™”à{â«sûý P”Ñt ,‘HŸºÜÓÅàpª¨*Ȳ¸¥DAXêwh—Bª²*:Z¾~7"ZÚ½ù\¦@‘)=Si0ÁPìf3A ± ¤r 8ÇIšÍ¤âð».æÑxI Û íÛÚܳÅð`éFb© ☧qT¥) À`C‚[Ý9QŒ+Ä›?ò5¯ìlü§vl,}‚ˆÌ©ê¥QÈgrÄ (qEêˆäd@¶¹¼¼N.V•¦×¿ •‹ XB©½s1˜”÷[9Ê1…g3”®æ 9‚ÍE²{Õèâ´i{¶õ& ,õö'ep™› (ÌÙV#Q¨ÁŒ"‚1ØÀ ‚ÞåS5Öv›5±±+…Ûý6™\?d4{F ]'®-Av°9Œ·r;â…S´ÎÂ$äœ0bOdeô\Y\‘eÒe{÷ç‰j‘¶˜'<$^ƒŽÉ¬ÄC7¸Q Å)Xä0 `³l¥ef °‘ªÚû»½I)L'ÿo÷ÂG¬)Õ±6PÝÐaHÄ#‘Èa‚‘’G!\épÀ"E‰DÕdl˹"Û¶Ýöš7y_ ¿>‚‡J!–ŒEcŒS9ˆå3˜89Ç­©EV ¡gÔ}ý&}ï}m¾Ó§‰Àã.òêQ$·„3N£šUŠ qKÄ!TF*J ?2òòoÑÞy?»»ë°’DŒŒ\ìÜÌ™² YÝÙŽab‘Žçbƒˆ ™e£«´`6¯éê&[ni”É(hÐÛuj"ãmÐq™Î§Y @ÊßuœŒPPä›1{]~'÷õ2›ñ£Úr¾îvæ iô*.³vŽƒ ¬tÄc¸²úP‰ä¹Ãž4úÝMÝ¥¢ok÷÷í0‘`š:ê.³\@qHF3ÊaÁNý§r³±A}DÍ%D©ì%é\/í#BüÂ/á9³žX´·J¡Šå(¦#‡c±” ?õګ뢌ñæÝßήD¤ö&i„ÞÈXß(žžø@£¦S1Ž@á…%l‡B±Rày3*z‹RñòL¶×ºM}‡„¤a±µ¹¸5r :‘ʆA˜2Ò©ŠæS89Ám¬ªŠŠá $&šÂøÕÑ©D}¯ ˜ v;Ø”K) … +™NRÎqñHD(¡ÁÞ4o^/‰Ý'oÝN§l4%"Œj†¢òÉ~¬ìB9Š„C…!B‚‚˜LçOmC±©nŸ©Yf½ ¿»Û±á0*&‘Ö-œ9 âŽw0 ãçÙÊéìcFåÞÌÊuºÛl§mz="Œ›ÉËÃSÁ…#.â A…T¡HVn @Ñ,ÜŠÍ‹+,kïÿwÄK2öþ>–€Óü"ä%ÔˆÆC …QG)ïåK#² ±anm&fW$¥+–Ò}3ö5!N‹ÉÚªás@‚¹\„2ŠpR/¨ŠbŒ(yùu“·Žifü¢ð™{ÊË´ÇÆÝš?­ŽÎ¦PÈ" g:œ¬ ðꬖhR” oÇãP_ä§ç~„„„ù„JšÍ¬—v+NÇ ï¦b¤C‚¨yýèÞüøŒI¤ßÚwBĬ‚ Q=ûËP%ö*»*¥!D)ØVc°áûnÖEeŒ"Eâit˜n’õÆÞݾv!)0’?¥ú¡B) ä!ˆ0ÄÔ±\ŒGPHšª™¹½Èi+N>}8Yà™1Ÿ»IÍ«o_r«‚§c¹ˆf#ˆ p’û!^CXÃ$,™\ýÚOy¥?—vÙM =9ŒÛP¹ÔE& CõجåSHÑêO\ÇÜÜ=­ßÝÿL‹$â¶3|”|ƒ e²…cœe3QÖDƒ‚”,Y‹éBÅ+M¸Ý~|¼‘kEKqðºÑ¾ :§"º³7¸c”„)JÂŽLd³©šAÀ‹5§©è'…¯×EÒïZ$?N3›‰CQ¹%¿‚ŽÅwr±Ž…S9JV!˜ P'ÒEõÅã iæÂïçír,³Lº\.~´xÕƒŠUÂ%×× ÇS¹ˆVP0iZÄ"2 ¿Q(L_Ï¥iMDâ[±-byªNj-åðqŒ–QèA•$S©ÈF(01%£ró¾°¤ž&“ M¦|y䈘m|¯$.ƒj,UºùÄ2ˆæ!AƒŠ5=Š®ŒaA^,mNÒñ´¿[w÷Ó?iÐÑkbؼÚFñ-P¡Ô¤b‘Ìpg!%AÊd ‘â\•{¥™6%ÿi¦ÚïGiŠm/›[CÇðÀæ‘îÖb§a å!Hv8pcz!Öä»CàIwóò™zß?)µÁ8‘áë+>7¥O¾#HGAj±HÆR¹Ò$j·..µ¦¾[ ½¿Hñk0Õ·óqr4û«Ut;Ž3ˆƒ1Xå( 1F’ŒGMG *Âͫݹ•Ùkmܦ …Ï…„ØáIˆªˆêö (äb9NB!õØVŠiÞàÊ“ÍBsúôÕÚá·«‡žç2ïnflIø!Étr§)DQF1\p·õ":Ña]A¯¹l&›~[KéÙl7!£ReVôªiKµ 3•ÄAqAÙMb9¥K@YñW_þoêu7ö±á:QI¤ÆÔÕžnêÎæv(¢¹#ŒG0p2‹éèéSB1@–¦ µÏ’5(ÄÿßÏØðO oTu«;åˆÅaÐD”01KK;9T¨À¡Ð<%ri0´/Þ»^Úív<%fšLÔÒP-6!ÊB¹ (èu1XT:˜ ²a×›Ñ$2B^šl&õ6hµ¡ÆýM|6ƒÄèpËÊÖYC] v3˜‡P aF¥Jì¤b$0DBsé0¹ÿ&ßK¿NÈx·„:6æ¦j^MF+©Ôb+±œé2J’˜ L¢&¦¥Ýa:Za2½±"ÞGKiµóãÅø0ÈéUª•Œ(…*Šƒ,¡Á„èÇJ+PI©ÏåÚé>]®›©ûÝ ±B1¹y|Zè0ÎB9U (Їb™Ä[ 9Aeä«ù9 ïlý¦×cF´Î´Þ?EÀ@íu©.¦R §9œ¥)XÀÀ¢ì‘,šTp‚¸ôæÚnõ$¯çwS/¦‹ $E|Z“Ó‹{„ Çr(ˆ ¡E~c©ˆçJ‚¾;rquŽh¶ü7wS©?Øcáyô¼ZA‡"kHRŠS‡X2Üñ%Wd*xQTlmîãð-p¸N´ WÆâ0œF¬z jq‹ž¨¾žº…'µS2¯BX•DÚ­MÅ~D+៊j»ÑU9SQ1ÕbQ1Ë!yQ(Û8X¢Î4a®öo_NVÒ¾²QsÙìJ¯®³T–-”’‹1¥(Ó>!Ó6 KñØ—zBñ ç>œ·/²–RúÐÓn¿dù…º/*3iIRU}yjÔ%Ò!§/3 ©Gâ‰J¯·9d5ÞÆºí§˜Ö%›‘=h™Îõl¢µÉŒ›)¸ÈËRÈ[–A&5ÛÛUÉg±nÜ·rú¦uÉ!å5‹0•bQSyÍWz"j§*ú{Q¨òŠÅª##Ìkaf-^­È䢩$<¦ªÐ•yE’«…]¢Ð•$†³Õ½ª„«–ÊiÍ̦Š=Ñ3Ö¤¢sÜóf]¥§ie.¡ô/hã|Â>Ž6’(Kx´å_n–œÒ]Šßeäù *Q\C[ðBùcøª ¼Ú¶y|BrÆPE ói*Çù|F“Öp ød<­ØvŸ¢zü7X^j¤­»xÑ{_tüf—hŽ“Œo¸W´ý?nÞV‘G‰Î4oWì«ûnõá6Ÿâ6N—žo Öj¨oOÂ`pÀ;p(.¨3”¤¦TÄVŸ â.JÜ—¤…ÜÛ™RšÅ,„¬„ÔÔÐÖ¢¦Í6a2H¹A.],[V×-N!_kB˜Õ±­RˆK“kä¯-Ö§Ï|€€‡À< ÒP”eˆßÓ…'IJº®º¦é*N×Ô¶…åâ—‡»¨Ç„¡Iã8…+*BUÕm*ÒP…³ªV„%ëx¥m RrÆy.°ž¥+û8ž6—ÐÊ ©}g;ˆc|¿'FÅñ[J²Äoé“¥+‹êsäëM} ûh&Ò&Œ¸Gâ­sÊj¼£J»ë¬¼Œµ,…²êU¨J2ìÂQÛfS]èÚUÌ”k¦##&!Ä”ÔF^f¢ë.¹d'¢*±%-=(iË—4†˜XƒÆAc‹ì¸Gâ‰3òú{ú­M(‘”·lÖVõªã""+ÝýhIMèBÕ}p¤³rXÔB×>…ôõJD'Ì$‹Þae\äJ.z¢Ð’›•—Û™bÈz£a$mF_nw±f8H‡¹¥=פ&ºôÂQ”ò¥$5QDO%\×z-‡† 9niO#úûQ½[•ZŠ÷=Š~"–agRQä5žql­DâL£’ÍèYUÄyËèÄ”Ò iÍg±nÜd¥Ót¢EЄôC 0‘BÅ!99Ë(ÑOGö^TD±nyK ’“ˆþŠ´Dšgû®Ø¾Ra_Õ¹ $ˆõbqF]‘ó““1 k&µY}=½=Q*Z­ !n[–å¹§fÏUÒžBÜÓtÔ¨’"5Cú:õÉDÇ%Ï[–(YÏ#b2jªr¢§*µZFôW«=‹BÝu*Ô%Zçª1c "ÍëG³ÙùÖ†œIÅ£¡e&\ÕE÷%WNz9,…±³šÈ™0ò"g¦ª­‰E°ð£]ý¦ˆš¾žÔ{¾ÕÍUò¨ˆCÅF.‘zpñË>¾©ícÜ’н0ò§Üž´UÊ.õ•½ k&¼†ªqã v£Õ:űnÜžÚq,žÖ<¥¹ª¯0óab„.r²g¦§µ )îYOw©%baIF©esÄ ;{Õu^ÌM9ªåãžíÍrú1$Êþˆ¨žV¡d-ÉèÍ’ $ňsÌ$ãLþö,‡£¶Y±‘I8žÌI RÝø†«’Bû"l…Ô0± …]±4Å!¬ºH£]µ iOtŸ’¿/§½ÏBÌ{½^Š´Mª’Œ[¦­A$~G,‡œôD÷})e=Ë#êXIDTõ«ë£U¨¸DÅK‰ïrð£]QÓÚÅ»b§*â³ïRH,âJùsÎz%IJ"ªs7«û6³ÈyMV«ó¯+y RïW±nÜ‹br9fFçkVç\¢ág©.Z½5ØRY¹3Ö¥žŒô]9êÒ1lJ’äåªfUµ=51ÑîbÙ_ìúé©ís\¶nE±9yIiWVC{’ïÊ­(²6¥!j鬛g¡*¾›GZD(ÞDÕ£T•]DFLTdÅEsU“\³ !h©—5‰!ªéËDé…™ñN,Š[±æ/!‡Ž<ƪùd\ä©hÍÄ%‘tF£Q¨Õ4ãD¯8IßUŸÕ5,,˘ÈBi‰RU®z¢¢s&ÙèJ¯*|ç£RòªÔó—½0•Ok õ,ÃF hƒÌZ'®ÖNÎùÌÕ\±j´%ŸÕ5*iDˆ,¥»ë5Z§˜ÕLuæY…ˆj5}h¼µ\dE{¼úú% )ìºËªÅ”¼ÊIä4…³T’ *6–_JsQ=jJ"Ñ5ѬZ"Ñ8’žæœJ"9g [Q%Éåºã®²tÂȻ foLI‘4±BNZ5_Ò‰µ~t¤ÏµN±jIFˆ{7#&3Q1äz=‹wé ®ÚBYK!*ÜŒ™Ì¼Œ´N˜YĔ҉#òªáÉŠïEÂ#{6³Ýý}=ýSQîô,Dz5S–Ï’ )¨©ŽT÷õZ–ŒÜG÷mBŔޔ_z¢ë©¢„ˆøHÂáîL”Ù)t¤ã‹+jXI‰© –käôsÌÛTë¯DâJ_L©,»V8×MÒ6Ù¸±¦4ÖcÌL¹t檒Ì$Q*ª÷'²ä‚]1,iOGFZ–BÈ,BûÜ–= ½fâŒÿ­ÿøÉ˜L-¾ KäÁ¼˜µôFMjùb5¡ú&îºÀÌ4%í1Áß;©ù4ý¼0­ÛŸäÌ…§Y=ÑÀ ¡ÑagºN·qKmet" ‘ëKÜLßµ$ »L¦eæ4‰Ššô%‚E)'Ÿ$R»‚Š©ØvQZqøJ½F<„¡8 ÓN0+î¡( _ébcëeƒ¹Ð'uÚëFB¢Ç‰#¤ …u^Ý"©f} á[Ÿ;£CWxuïËÐþÉuóPžíPÀANH’áÌ@áÄfžØ*Yœ…¥µUz¿4$¶”0T6—„ÑfÕã™üšØ a–@\ÿe:Hz…!Éí¯Ì¦j<õ¥‡ »¿›Ô¸À…ÂW‹ˆev|ê5[ÁÁ¤Ù’äPAÂ7’È*Ù“¥ïã”Å÷âF†‰Ê ;ðÙ÷·QfTMÍóE \t*àá_ÃÄ«‘^ꪘƒ„E#Ðx¸ãƒ‰Sévx&É0áiÛ¸ÇIK¯ÔZ'‚‡w‰è"X¡ƒ1ÆÉìÄu2VoþÎøàHX™@@ïßÝŸKï1Ù·100áÇ–"H¥ Ä–<í"¹©”M"Ѽ4\(@GÞÊàh¶Ûœ%DÔ¤’Df[ÌcOÌB‚%‹Jñ’E²km³6~``¥Ñ8JmœÇL}_X ¢¦—ÝÈP@a‘b_JD1Qù=J¼›¡'߇ÂfGšM A_)ºòE©ûu‰PÀ0¥,ñìG3@¬ë6aÐŒ– yùB غø„Ÿ˜ra2˜}'+º¯Q´‚Nf‰}”“$Œ rHžS ­Æ¡8«EELÈñãkޝL.E–ÜÃr˜ØáÒéKjqSÜ ¥ž' ³,ä­ƒz H´ =ë!ÍËÛ±à—Ç»²ÚnNu£rn­&…›ÈÌ"Hf$’Q„[³vçJžíEÌ…—ìúõ ½ ÝaŒ¤ÝÌAW^OC«ƒ#BOÆ!\‚¸†óë©ïpóÏž+éh}~¨`‹†êcòë²!=yR*0-ýŒ¤1‚ Ø,ҡ锽B""¦4,4•ˆ 9;+…´Û¶ͻڂ¯[í׈ÄÔRÅ“$E”¥dÂz3!V€‘&Û s°º \(@¯Ùß½ìUM7­Ö‹=ÐU*”8¡_ýr©X•§ñ†_lÖ‰—ì*?í¸´Ÿ‚£žÂÊhÁW¬õ[!YÁÇwž=Ý·r½‰˜D¢­^H/Ë PŒ'¸$^0ÁÄÒn#© ¥³û(80dX‘lÄr£…+½íãìd¸²õnáSuâÁëö ©ÇÂõm­f3cbd`¢‘§¦:.PÀ#ˆ%cÔ©#™95ù¬ž‰ O°P«–¡ôÍeLnz9^X–R3 Aƒ'Þ4Ë*]Ó_S™ÙwA!&Ú »ßY(“й½Û† ÆkvÕª×U‹Šw+A ün£(·]Ђ¢é5ãÃKµÝøNíïVV|VäP»taI@s£oXj‚'—±efbÝèÐÓò‚l&Ó基¢ ù»‚3¤ŸÔVw RÍ b¹Ør:/溲¸ñïÕ"on–h5ú¡Â)ôø¿Ä²Ñ—Ÿ—”(S¼YèE:¡ B^^2 |¯#™hL`$h” Kât“á¥(«øZ‚Œh·ÊÒ$8+´XÕ!ÐgŒ—EÊU¤Z;K I'8d&>üXk}Ç>“{w9ÕUq5(ÐPá™§#Nó¡ÂŽ:ðnÚ…TŸ+g3[ßAába‡|¦_·ã¬]lÄœ(Dð—Ë´‰P`(耶óÆ"¦óÑÏ#Ï}àw8ÖÄžz¬Ê}îÇâ©ßª¶-Cƒ‚*Bͦ*™˜a“¯z9Èy:•(‹Gç×P2I½%sDrñ1 ì²É®ÎT.‚Íe8ùuôÅäÒ%CRÖ2vK-ºÁˆM/eHR'ö'£¨8A$j±HC )Gl=ª†J¸Ö¶ §J—¶<,ø ¡Wð”É;}¢.¢ï&9Z%öÄS(p9ŠIâÔÎWfUE墲2è$X™áAÄÒäX\–1O¹M~ ¬tÙ}pë@@(B4X´!H¢ c•V•ª»©ÙŠ©›°°JZPÖ¹^/[ʉJ’«€Â²E«¨¤œ`‡$I4é:]w1’ŠšèÔE¬Þ'›f„ý¨Â'asza èjQêžààQˆñ¥æ:’”W_ÐÈFJÁ4iÈ?‰çð<ÑýÁF%¸J‹Éè…5Q‚#É "TÉ3ÀƒV¼kND!¸”I›” 6"uqú$õÓeý-Æêâ×PŠ® Þ^)TdXˆ“ œFB,ÒE±#Š«ÚHÐJüƒ„nÜý¦¥U±=(R–Iøˆt!Ã…¬IªR“MšÂ¯®2à44Ý(P«LZlzÉB﯋ü0ã¯MJ¥T 9 z9ÒF1 cXJ´TJÃôñ.5hm†¯T0Ê'žyÍtÎ%ÓÃŽw‰„rduÈ”÷2UÞ»›!‘=³Í 60(DmÛäÒgØÆm|ÜÙÁ !ol‘îÈ„A%ö܆gNTÇW²Ü,”¸ ¯½Ÿ$ÙáÄE®ÝY³¹Ð+,X•g!”Ã;$JaØ®‹7bÌê¨ç– >0(d6mx%·,â›—q¸`ã"‹&§’L;¹ÙÈŒ¸Ž´[’á-Yj{rX¼áB7þÒ‹*[+!¨¬ „ž~2£ä …-­F3!†é}¤}¸¸€ñâám¶>]{¹’žZ6„–h¶B9)‰Û2ÝØéBÑý ÜŠ ’÷‚GíÛOÙaÄa*|ݱŒžôõÖU bÅ—˜ÌR@ÄT–”b¡R³ÛTQsŸM 8¨]ÚéûuÔ¨Úü˜ 2hkmÕh8E,‘§kŒTÜ[!=cBÄÕ ÙL.Ä„üðƒ>vîå!íªEâ‚Å!"E¡„!Eë—Ì#9ãÿèc¾Ô “Aëö?ó÷ÿˆë™©ªr<óq®@PcÒKÇR©JÛ^Zº²g,,Xü Ð”âlX•ˈ+ïcæLs¶Z’ª…!"F²Š²¹9› J³2P%¢êNü»ØÐ²üÂGçü?šBYù2¡À£³ÏE3)ÿþ×!ç)“"(g4(s4(JP” JÐð¡ÌèRe% &S Lç(s垇…2 )0Œ(e L¥e&hIð³9”2e!ÉÉ@§ ¡Nᦠ”Ì49Bhfe&Pæ… JJá,(i™Iš'…Àʆg)’S&Sš”Éfd¦Ja”Ô,™I””9LÌÎaáNP¦g&dùLÙB…… p§ †s˜S…9HD”fffg„C…圤ÉBÿCÌ)“™)’˜S'339)™™)C™ÎÉ‘‡0èIf|ÊS$òNPå$Bstœ™Ì–fg0òtÎs„Bs2P¤áCB’’“B’S' Lèd¡’…f’…9%(IL… IBˆg ™þ‡ >“ÒtÃ) ‡‡8Rg”ÉП33 fffs¡aÓ&… ”å……% ”Éó@¤"&g(HœÂ$¡Ê““¤é(S&RRD2Yœ¡œ’˜S Ðô0òS ç)<¡I™™™œ¡™™<ÎeLÌáL¡(D™I™"I"I™)(sÐÏ!üÏ3™C3„BP°¡Ïèg… NL¡œý' çô $‘ ”9NP¡¡@æPÎ" Í 9B“Ètš™¡Â$Ês2†NN“B™&… –Y2Ì"pý ”%“™(™Ì¡I2„¤ÎfPÉL‘™’…% ¤’™)™’™”9Ê g’P¤¡”“3%(O(s$I„IœÌ¡œ)“C„I„I„I…”%r!(SÃÌ(s= Ng30å'L”)3C'þ…(O%2yIœ¤Ë‡ÊÌÌ”,"ùI”™L9Êá ˆd–0¡N>yÊ…&R%Ιèg‡)’œ(S†S ¡ÊdÒP¤æffffJ‡¡%2 É”ÉJœÎP¤ÏúÉÌ”9B’y>fbÉ”…(aaB™œ,åffdÓ!e'IÓ0ФáI”38D9”ÂP¡™Ã)‡2“)2™2™?å&áIÌœÃL)HR“å2r™%2r’€Y3… IÐÎPå%3 NOC…9èd¡“”8S33œ"J”á49Iå&s…… B…0ó'39L)Ã"(Pær hC“ÉÐÌ™I™ÌÊIùNPå IᜡLœ¡2˜e JL“C3„@¤Â g3”„IœÌ”)% Ãú… æáC’”Ì¡Ižr’|°ˆ!Cü§ sý èfdÐÉB“4(s4)CD4  J”ÌÌŸ9B’Jfg8RPʘP¤œ¡“á‡IüÎg p¡I”š9”9B… &,å3 Lå Lå LÏ3™œ¡äç(fp§%9™C“†BÌ…!§<¡HD&Rfs)3…%%0òY”“™ÌùœÉLÎdˆa”…)(PáóÌáILå&h™I3„C‡å LÊL°¤ Rs3”3ÈXIJ”ÂZ¡ÏIÓ ¡††Y)ÊJ¡“"%ÿúΆJ̲„é>’…“)'3™æY2Â’‡)"„@áÌžP, RP¤áLžÉ”9é sô2ý Д2PÉ”ÎPˆp¡e ç¡™”8PæS39C””ÌÎg$Be&‡4ÉL30ÊL"™Ê)’’™”™L“”“Ì¡œ™Â™2“B he 2xÿøÉ˜ N&D•CË&AsTAÀÈêyµ‚Ϫ»ƒRtiNíEQs,®ÂÉ×@„*E<5ö8PÁ9Z³ïÇaâùzâƒ`7…M@Â(Ñd…ºó£™…7‰éçS1æ—BÅ"RIãJPÁܤÏ=[¤ÏJ3é`u‰$y\²¸(ÅØ½'ŠFo·”ìæ…›† 0†«á¯ø)\sã×HçµçÎܤ8 é Ð}Ì*Ъ*bBL„*’yv1À®"q‹8="ès†,à’—dz0•K†Öœ¢‚M4%_# rɾªC3ut…8Äc#ŠH]‚¸"³jíå1U…±û.pCíâVưწ÷-Z®…Wf-š‡C1’="»:(óÛ ˆ¿¦«1‹›&¾þRhûwc/0®D¤ï*©ÝaJ9Pv«†–.‡V\æ®Ë*‹ÄÝþˆPD °ÿÝÅñœ0!-Ó󭈮æ¹j¥AÌxר£‚Eãáo^„`åFîß) ‚çV‚x@€¨XI³ˆ D˜.µ*ˆÇÉøVs•g4À“Ï¢ƒ мÿÿG!°Jâ 9Cü{×ˬ`NY¯—Ur%‰Œ¥r±Ð@òFÐã$Å¢¬µ‹)F8¯q¸[°¨µ­i»ü$€)ë4¹Ä$ŠËÖ¦qتI+’œ ìT30ñäÈAC…%ÆÝ•«¡»oQ"†0€Ô‹?‰rðrOkŧ,Ä•S Èg1Pî„‚[b Ë)9‚Vø‚˜´×eA²&“qð0àSü=ãiH£º“éê*Jß,¾ €¥31Ö…›Æ ¦/6ö-˜ò‚H{ØÁAÏY!þ™CP(¡ ¡æŠ,VX£y5Ìç*ˆ— ²AÊ i‰²Á/uäCe2å ^—·—´Aƒ`ig‹w×Y¥'›Ú…Q7CH@ƒ…uÑ ya*8 ÅDlÏäTrñ+AªhÅ0zBϘ„,)AK±i-ªuJSH!Ìfs(ÓCP( AÑÛ ZR,gŽ„Ja:CŠAò=6œ{ ÚºÔT BѵN²£´/쀆O"ÑÂÍ7Cë¦÷Ê')<”ÓbÞ@Tš$ñ¨ôz”„aOÁäS‚$sÊÊ$h¼0`a [?“¯Úv:¥7ðÃ&E½e©s‚Yï n[§‘¶ͧC¹´j `D²ÑXµèt¡±°«D/‹ý§…BÞÝ’ 3Œé%¿iÖæûlär¨‰(,Ñv`@˚ܔ¥=…yMØ'`©%ç—[7c…‘%‰'¥Öª­eºñ„2x•8`ÁYÑÒ¡ëÇa¼T±F¸¶á9kÃŒàå¤4‘ýê×(æJÖ¿æIPƵv#‚°¨B¬±cxqÄ+m Q¼Ò*\x=e‚¨:ÍhöÎÃTpÁÉ,Ñz’- –N©¥YZ#\ ¹°ãeTt¼Kda3c鬣ÇÃïv~DÁ©“ÞªHvŽ×Úü‹s$£ZÛ(çyZé$$Ÿ 0 ìO5OÙ²­“oâyd +ñ?Sx`Aœ5bKe¡WÕÔ•â+H€ÒͰ£ ž¬˜,´ÙÄ çæß«Œ»óí)aêñ‚°ñ&‹èŽƒ¨ÿù‚¬„R^oÀG9VšhIH`!±ÍQ5uÙ¿»²pX7Á>šºñÇÃÏñç$©eF=žçqRé0¡p aYU©?tç(…Âa.Q–¬Øý¥Ð¡Ã(7ÃIFò4R0¨ÔˆI™Ì,²àÁE$BÊ Û°QB‚üJ’‹Š¿„ìø€ƒaú4zŠðUhöáD…r>?Ê‘ æRXòZpá“•qD­6"Šl&ÈQ²V|oÖÁÁ,±¥›‘ÖÆQÆ¡µŠ‚£Œ ±> S¹©,Y|PãÍC{ê:ÐJ6ÙHÁƒвÜiE¸ÃY«?ÑÐé1tn#…a…A!¯±ArÈOjZIt#ñôñHk5§×Üÿu h_´«Ær¢â­ìw(°ŸhaÇ^*p‘¥ÁÁ 5Ò 2eÅå‹Ë<  T Xy7Q@Â%gÙ*E2HZíg)ƒ$ˆå ,l*k&øØj8‹T’ájÁqmý¸”±ÇQäM²yËSUè"Nó·ÂRðVJ¯°ZƨåCÏBHŽÝµí®†o .t‡œ‚„%:5Þ„í¨ç …v0$±ðPaÓž…¨¸]2™p›´œa†kÝ›rE[Ï5ôŠåfMöº„QAk=`È ‡%“–zˆ0¥cyv¨eZtºm&t @èoìvà…EúÚB SD×ËŒB‘$i¦„¨QAGTO¡´›¤C—{øÑˆ]h»ª°¦$Õ‹NGR)KBȦ3Ê5 ’(‚µWX'E©ÄGƦ)̉¾WMÍ#x¼Œ¬!Eo§}”¤QE¬ùÀÄ*¦x_p!™;ÍB}^Îü'@AH±æóQ³‚ KÚ%yˆEdü" ‚;¹Gž6‡8T3ÑüI²ðŒ(âÜo'Ç}7?0 å´yìÞïއ¦eN“-Å’\ pÃ1YÐH[|0€¦vÌmêGËG½DŽg ,H˜¤±|)ZjOJ:ˆÕ>j £©\®Xü P9Lžš’Vô¦1|þiJ# ö{ïëö¥– ¢ÝË xÊLœ“¯2©8QÚEªm !ˆ\qæ†5ßôÚMéAÌ {ʼn™ïVœ…¥¥™¤B¥r‘aT©« @ÂL©no›§#ö[J9L!?ô˜Nïy6ËæA:ŒB"Ö~… #Ù ÒEŸÇ(ˆ»Ü–UÊvÓÂð‘$­‘Co‘¢¦ˆ–Z×Já\çi €$¡E1pÔ¥îGÃcÔ… H’fm¬,`¤|%¹h„2T•%QŒæcšNŽ0àíå4@jÅС mJùêD˜jžÜ5„Ѓ’Y#Ïç”Ò «jÉ+J¤`ÞyŠ0ìf•"I qBœÍ©ÕÜ™¥]üÈ"‰hM¿Ÿ×a À•‹}2Õ•Ò«W¡Ðdó…–]Š 2Õ0k>…0A¾5MS¬£.ôôy$€Õ‹ 1¨¨0‚0»69®E›òÃŒQÉ"¸kAd 9ÕKbâÛP„U' Q# 7Mjg g„ ešYj¤geDöºL‚ “ÆñÂVV¸'Dñ…q<•âØ‚'ýë–Òà`€ï$X²íIf˜W(ÛJYˆR+DÚN(¡ŽèŸ" ÓR ÔÌBÜÁÃ=bÚ{ª ò“[‘DW8yåøaƒ/Ò‚à_N/i®;Dé¤þ4(`¬‘Eò%w—×w©£•krµ$†ãéq$ÇI„ 0IB rÑ0£˜âÓb0))òjÅTúßYu—Ódß]7úÙr¥¦VÓ¾ï«X„½<ƒM QÆž0·‰á¤-E/Þ·„bgQ•r›j‘‰–ÙlOͲ¿JÙø£]³ñD“¥âÔy0y‡´H“Ê<à Z„QM[ªÖHw¸ŠûOí¢›è™û©‘M¶Sgn•mË;¸ï—¦±ß)/5Ã4ƒŒ(RE‰$ÃÈ(¶„+²ÙçñÙþ­ L‰YÙY\ŸO•·]må™+¤]¸²ÉÓ‹`„žcÉ ,¡@ÁY—!Bj"Ôå%¢l·ü“ÚoýÒ}tHª›¬õz„jÕŸŽc«±_"Y/˜á $YÅœQF hƒZÑH YÔINU¾wUsý‰¢Šî¦»ê²é–cRûEz×õ»9Kú²H æa' Aç-ÃÜpIæRql[Ø„£¢*ͪÞÛEŸºE•þë$òF&zŸÉª¢Mç¾»W°ñ’-‡ˆ(@‚‡6ÓÏ9…”Ahš`W$×oº»"sD©¸>ïI®Ú®™&…Ëÿ»¾USd`p†f’Ú)G–i¢ˆyÂH›¼‹iõT×.ªê“Mr*²‰òn\œÿû~•Ã~$Bêq-ž4±¬a‚,ÖI[––¡jËñ½>d—o뺻¨—/ÊìQfÿüdk‰ÇSLyh´ RÍ<óŒ<ㄌ¯œsMIK[OM÷Øíö®UU5ÙÙÕÓwgzº¤æ2º–'¸' NZnÃÊ]D”YÄš Ó‚RxƒE´Ñ8‘Ɖ̆¡Ë3F0غ³e½m¶Ó:ßf_¤n¯Ó¢ð/sŠ+èYd½¦`ÃÊ0ã„y# !:SœJ)NE,.4ʳU¼•ˤ×ùÕ]—~«&×ræõÅâ·éf1#R1Ã^ ágÁ‚Z-æšÂÂÐOoZYÆçtÿåÄYÞÝm–Ñd«gÐdŸþŸYQ‰9‰y-Ë)çâ‚ 8‘'h²bð5eµoFR!SíúmÌœ ýÜ‹Õö[]6×e^ª+Ö¬þãKêîf–s”-ÄyÇ,Ñç°±Å{N$¦„4îÞÏ3?ɯ]/7Õw§zÚçÛ¬H³Õà)‘™æ;é(ƒy‰s„ ñ¥˜qa'—ÓEŠò~LÒ&Õ•ÓOí¢©?‘n‘UtÙù8ü]Ð_vÊ¢ÔË…BFQ§žqÃ1Æ +(¥„¨Vîf_ÂwNdøD»=oä[Eõ]2ܦ_ûOyžiµb,…ä×ó 4‘" @ÂD–)çY˜·©+Sx¤L·9»´IåôJ®ê,¶ºn¢Š¨ôºo$WYšRÖ¹L ‘š$³D<@äXyÄÃjÂR#ô¡¸×¨§ßí²é¦Ú铸H—&’*§üÞýŽ+ýŒ̈P‚Ë(ò†qbÊ<±OÃÇfcÓÄdŸ£îΤnÿJ¢Ë¥vÛj»ÖÑgyLÏÄ'úãR¶µAÄœiåžyæµ-潄½#Ð7ö³^ßjíVêMÖ[]¿}Vþ.º7Tc|Æhe_jx{HÂÏ0ÃNqfŠ$I&Aég.Y/¬œ/JÀe›*ßH®›-™_꾪j®®vÜ Ü’LÚTÒâH±¬8ÃOa…Ž1[[„*ä9‚×"ª×ÿëÔÕMT[}µS"›­¯×̯‹®wzBQã*blpµ A¢ѯH— qƒD‰Í¤!+v×îqòäæši¾»ÿl©x&ë?o.ÅxlüÄ5^é !î9F9‚8â„ $á•ÃÌ ¦5ŒQΑ!ù³•zÞÈô«*¿ò©ªê½"eu¤Gw•oÈK™ ¡ µç’5¢K$Sy 5bDˆÉ/ÂÊç0ù²ðû®¦êë“"ÞUE¶QßöœbvgFÖCš!ä8@¬Re œ% IʦfPÎNffg3™™ÎRe )%(dó9C„C„I”™I@§å LÊB‘ 9æRffJfPœÃš9Â…†i(sùCÉ”æR†O2”2Y='ú¡œý'¡˜Rg”Éç3™@™I3%hf˜P¤(RNe$ó™˜Y2…& ”ÉL‡ ?ô32P)2„Ë p§4)˜S&e'C% C&„š"2“à †H‡'™HR†p¦JM2RPáLŸ”É”™™C p¦I™Âš¦d¡B†xhP¦g rS0¤æfPÉJœ˜Rgÿ RPò…% JN˜hD&Yœ¡ÌáfLÉC‡8e$òP"L)†XPÓ ”4ág,ôž†p‰2œ’!Éœ‘ ”šÏèg=% dáœ(S0¦s&™,çå(d¥œ(sB’…' IÈIL”ÌÏ2’ÌÃá¡IC)“…$Ì” p”ÉÊdÊLå!e$¤ÂÌå æèg=%9ç JI…œå$ÊÉLÉóÿùI”“å !¡$L“ÊÌä¦M% fJJÉL”9C9CŸý&™)’!“I$d‘0äÊÊf”9ÊOC3&RffÂÊJ œ™I¦)3’™(P¡<2œ,¤¤¡B“9“¤þ†g†Jz¡¡BPˆdÏ9C™CC‘,0‰3(g!NÌÔ9¤¦M2S9C™œ‘!)™aNt(XS3%P¡ÊæeJL°¤ RP¤ùæRJ9R˜\žá„I™¡BS<Ê™)4ÉJ Ù:aC™Ð¤Êa”“”9C8D8PÉ@¤¡ùgÐÌçÒPÒD „æJ¡”<ÃI4É¥ ð¤Ï‘“”39È’fNRg3(äÎÌ)˜i…Ì,ÃC'(i2™<ÌɦJœÂÌ)Â…&t0¤ä—XPä礤§ReÚd"LþS'ü¦Ià¼/ÿøÉ®HÒ‰È~¾Êµ£­µɦ“ܰf0"êÑ51ˆìÏv¢c«cÇäõf_"…·T´D!.mr"g"cE5SP¿çÞ«DM9K=R©”B¤ e“]0ŠßÚˆœ‰¡ä¤â«'S’x˜0‡ª#.ŒíTÆeeà`§ >aZÈÈ(ëX¼ˆªžÜyyS\œÓGÁ€éŽk.µä)ˆõnTqƒjý*Œ¡ÔH-“JY EZªÝq" ,_Œ;¢êc?“G©ÈˆŒbqU—J´X@"ÞÙÖ«EœV¬J&§¦¢Vm¨©œºüÀÓü("g¦¶ª5,㿯ª¡F1§ä¢Q9C‡I!9UÓ‘t˜Ä«ú¿,ñúpEMöæÕù+&*2eÎDm±.›!d áå­Y*[!Æ>MžõUÔÁ&¤Â2¦¬è$Ý=u3——Ìê”%–‡(’nª‘Ä`Òæ2ÑQ“´I Uù0ž?31SW' ¹µÔ¢²7U½UÕAX]u«Q’fS×91S•e›ç1q$] ­ÌÔ$¨TB’å²?G˽šˆÁ† i¾‰é¬´/v¹yqt,&Š FÕ{–ÖÀ¢*:Pžæþ5Y*Öh u¼/¢«2Ùfz}j˜Ä»èñ¨áÛ=3âð€fÔÕU䢱ÞcÜ•U@@¥Ttnj„š1î{“\²$v¢ò2BŒCE²Ñy‰ +–ˆÈÙÜü¼ˆ­¨1ct@Å-X–Þœ;ÕýQâ¹7Š„Z :^]ÑÖC0´ÿDdÔð’RA‘W“#G  brë&·½–TÖB¯#¥Ê„^Vpƒ°Óï§¢2vö{Qq_Úh]8:/?¦2Í\„ëÎõ`̶ÕuJ/¨ ï Î[§¦D¿õÓ¨^*75š$LSž¨®¾G#ó!ž‚˜i³J¼Šr‹E«r2÷VïêÔ'"G‹Ñƒ*®¦2aïAUkžSxWJѨ¬¨® ’Âá¯ÊÆT-½ª¹©ª ˜3û{ràHÕ1u•Ø©DےʰaJ,jµªŽ±…IgÊ&¦ÕKZPˆˆ˜Š€‘z(;Ôœ¤«ñ%]¹®“ŒŠ?ºÙt‹`ÁH¢#­šÈ›]DÅM 10 å¡4„òM.ÆŒJ7+Q,ê«„KÔÑÑÑÕa”áääòz•i6¬ÉœôlàYkhj7®pšHÄgz¿£ÞLä*Q¨€ÁÒX{/ªÕ¨Ž]7¦{ÑwÁ¤é‰UÌZ4ñ0S.ÑꙤ)—5œ°@ì,-š‰ê®±Œ‡wåÑÂÒ–5èô'M³È­Bp—)ˆöz/ @èóéÓ’©…å²*e)™ªÜº‰‘báÁ—=ìz½çÐYu““4»v²££´;ž #ÑšïVˆD<ÞÞ‰ÍâM”›èÛ<7Ž ¯RQùß>‡":zs(`„$NEuu£CÃÆÇU£Ý± ïÈšºˆ ³|PEæ÷£øI¬pWåF_nÅzz²ªU`Ã$J½ËTKûúQ7If“”¤¢ç7‚ÄÀ ŒÜ‰Bؘ©j¸V«xPä^»Õ9£,±;Ñ™}´˜™ÉȺˆ ‘²0tM¹½?ae0goz-_†0Ãcy !.Ðáˆ4/µSY<äA)¼‰©ÉÁeÛ†~\W±f…àÀŒ[’Ížþ„wGOTe‡âEçk=Yª("DŸ•ûrFöÆ^‰“‡f÷Æz„¯˜¹šèâE·*úHJÜ*®y*O ‚&bªòc¡ÑUP¯Và)Ç/-ˆï@ƒ¸iwÕ9°øšbÜÞ‰­†MLE¡zôFUUæZ3øêŒµ`à¯X]T"2iÒ‚þµÍbr`žÀíÊþ˜ ²ðÀÍɩȚ„2Õý‘Ó;„‹ì¬”_Q±ýUWQ„ÿš5›[Õ!#ðàRrj¦qûN*K$@í<„¹.‹8¡ãÑêšé¤T¥9=ýqZx›0ULDWð[d@D£sÑ1T#zÑj¼ €ëh~"Ñ0ÏADp¶ßg¢c„êx«é¾Þ»? ˆ‹ä±6œ1‘šÈ”xã¹­ÖL#Ý<r—ª˜ËeåÎÇôÄOL„›gȘ¾Ú^2#&zѬgVÕNd+ÁC)`×M#Õ…ïn«ûQ4{mÌÞ÷= jÃE\UD61Äz'ªzBœP´Ý#ÕXׇª*aíÚ´mEVÀÓ|áY—Y'—!¦½S×Tâ2>ªz«$8b…‹´Detã ö—]uÚÒÖw9¨þØ«6…%Zª‰ös§*¢zåŸÖ­dV@@ª<õ»U6«¯º:þòQì’±Ã'/¶rD®Ç õ-׬aQDºë-ÓÂ0ÞÉc]9œékjѹ›Ç—35SÏ‘›ßÓ‰D֫ꊡÓ회„N …ç[ªô¬¾½éF…‰Ñêêê¯ n*Q¨üG©‡)mÊDVU ãCQ}–­êæjÓ9W›Ðié(îü¼ºˆ| š‹EÔZ•‰žÊ (ƒÍ­!dm#C‡‰¨Föç6Ó ô]LLðié[—jøßÑ*þž0T{éZ‰Ì@Êe&%&d¡g"I™Ì¥ ‘“<ü¦e Lʤ,¡¦JP™™"I9”“30¤¤ˆIBRs L¤éˆs2”†D2S@ˆHag)32„§%9,¡ÌÌæyLŸ”™ÌÌÌÌÉB¡Ïå&S Ì¡C…)2™2‡‡™>D%4 >S&Nœ"")(D&rRPå%  ””Ìæx¤ÿùL9’™…99C“)'(rPÐÊdú¤¡Ê“Ä çL)Â!ÎRr…'0ÓŸ9C™™BP°¤¡Ê¡L’’†„C™Ê"†Ì³C8D2S)3œ¡á”™ùL™Îg¡œ)ÉÐÂÌ¡NRPå% ¡ÊÃ)2PæhPÐ")(iŸ)Â’IÌ™œ?ô(JP ”™™™)’™)˜Y%!% Í%¡Êa”’PÎÎp¤ÏB‡(P¤Êdˆp‰‡&fs”že$¡šÊä"d”Éù”)”… N&™Lžr“Êd”™È„åS2’e ä¦O”Éò™>r†s)33P,˜XP)Éœ)˜S&s<¡IÃ)$¦ffPÎfr‡’K32“)?,äHÿÿþY—Ì"„B‚aLÌÌäðÊILœ””9¡IáNe3”9B˜RP¤¤¡aB™(RRR‰“œÌÎad” Xs I42PÌá™çåÉÓ áBÃ)2‡3™™)œ)’„Bg&’‡4)9Ìò…% (g9N¤:Ê, J )“¡žOC…”<”Ì¡œÎRe&r‡(É”e$ùò…‡ý’ RP°§ “L)0‚IR¡’†JæffJ)0¡œ(XJd‘Â…38S$¤ÊfsèJ):dˆp§ p¦d¤¡IšJœ”Â…&s33…939’!“)4)8hdåyB¥ ær“4 Ji(XPðÌÎÎz™3”%(fdÊJffaL’“4ÉL)3C3e0øP¤æd¡™’IžS…8PÐÏ2™3óÐçL”,“Lɤ$¤ˆ Cœ¤ùL<Ì”„ÎII”œ¤å$åe0¦LÎPçò Rœ’!Â…2s(P,Ù)(RJ SÃ9””$”3˜Y33 d¡aBÉ”™I”áaáèg= ¤Â $ó%2hPäÊIȨ̂:Jd¦fffIˆd¡¤ÌÊ”™I)0ˆJfg0çýRhRS”9ÊÉINhRe% L¡Išú"(D2SóÌáLÌ”Éä̇3¤¡¦N†fRs9’’‡>ˆd¥ðó d(RNP硞aL)(iѦ’‡™(S 9B’s”™I@¤¡L™ÉOÿé‡3¡ÏC8SŸL2ÃÒhS3“(ffd¡a,ÉI”“9œåO(RP¡Iœ§ rD 2y…„B¥$ÊL¡¡CÉ–4Êp¡L…)% &g8D˜\ÂÉ”'˜RP"NääÌÊÎd¤¡LæS…3fyœå Jr‡“"™32‡™Âœ"g H‡ )2ÎD˜XP¤Â!C…8Y’œ4"†P¡Ìé4Îfe ʜ̡”Ì” t'39Cš)2’s%9…% œÌÎg3%2hRe$C%0¦g‡'(Rg33&’”(y™™):N†fLá€è‚ÿøy‡P|Êyçv p»«’yHº÷Õh¹ÄGP8È›d.‰tmz¤j¨vÌŸ¡üjçi޽Œuíݨu_Ì<ç2>½EêJPy ̾Q£N—|ë«6‹¶m¢Î\‚®3([ötsé`¬Ç"x›¥åÏ*ØïÙž¸»…ܪeKrÅžÁôé*Ù5 BîÙ6˜Ú±7£.L³'8F]?^»Þ§že8%§Ýÿí Ûû?¨Îãù‰qkߪký\hpWDí=F£ªyò­XMQ6#èQ<„ãR©ºašÌ$²ìÖ8VäÞ:Lg埿¤6üò[ü†¿àÆ$pËÏ §I¼¡<‡ÁäXMcí§ áÔéVÊœ¨žŠjWGwûkz ëV¶¡þÅuµS»šHî/»·:)³X꿈ö‹nšri™Å¥Y,qQfá%­>Mò$:ô›õUv©_çc»û1Ü©S¡VÔ¯ W=$ºØÆäôSŽ”í*Ôm#¬6(J>‘2GÒl‘¶ °d»³¤®FÉùAk²!/¸»ˆÆƒ‚<æï(y_J|icWè7anÓ(üQùÍ6\«‚* 8˜u¹%Œ4M¶ŸD“VÉúŸ1Ö¼×Ðî"Uò济¯uZ¿!úøâ®e7#¢/Z)mŠK<ÑTÄT,ùv¦_pAçDQ“n"ÍT¥êY¢¶„=øG±]6­F¥-güÚO;½Rúo¿›îïLÐfš,RaG ¾DÃæH,IP¢5 *aw^Mµa~IQ¢_¬$»° W zÔW›?Ôÿiœ¡…}ˆdß„('ËHÚZIydäZ0œ(Z.äIi† ˜X£DßGÆÔõ}Ûì¿D9«¡ìEz ü7Í.§:ö­l¦i†dòÁI»%~n¡)2²ŽK…‹J¬`¡:A³„Œ¶¨›RvÚ<ªÏnâ¿uWfÐìu¶œ$$ˆ›¯›YÑ›qvSUÔÇ{Ķ'rÄCiϧ+é+­;yŠlw‘ Õ뢷J˜[Qš8÷Ÿ6ñ—µ •PÛÕ2Ä¡;(¢‚jÞ}íÿ^o'ßvô˜È[Šôèwvßã[˜Çü9×fûS–P$‘„/,L²ï2}¡ϺL£ÄTAäH!£Núæ[Ô®'µÆÏôëhú-”†öúú΢|5v¡}ÓÅåä™6ÁOªd³æ p£¤X>…䬯 NÓ¿Û{ìoB6§¼…lQ©SûU¯Àz°¿'2%†ûlÎÉPbé Uí¬esn®`™2äȘx³FR$U&ÔmZìø—<Âæv{¯B•|Á…8©_z´r»ÁŒÞãÒµÉÔOäH4‹«hÓbHŒ¦"â¡–->˜ÁI²7TÕ¦}{F³ë­êigZ-d)å ÛÛ¥Íÿtjw’lJ‹[¤¹äŸvM²n •‡ß¾Móo"@ª†V’CE›!|^Xj¡,©õGŽEó¹åÍl]«ÅJÝСö¶z1«™æ’ž«MÉÈ©àËñ§gÓ8L™EÅÈ%.Ô‚6GêåÝŠèG½mcw}¢x™¡JæSž…ê„ë…öf–D0W^ÈÙ!MB–Xªâ)Î+6äm¥•h£‡W—fDúIœüåQ?^·ˆ‡¡{\÷kÞ§yææÕ½óªõ¶j§,Âî4ûêÆ™²aQ”¦V<á‚h˜¨EgÜJ«ùÜ¡ƒÜÐÚàka¼d:­ånô”Ø®Né‚ù ‹jÑT²š(éwM8qº„Œ²&¤Ê·—X’…ÊÞ%ê¹k…=Kì+·6·¹ÍŠÿÝ®5@µR¥¥KIRÅRT¢Ô¥%©K$ªK.E¥–’ÒU%©Qe¥)ZZŠ¥J.IjK,¨²T²¢e¢ÖT’ÖJ–K-J©UKJ©ibÉ4¥J‹ˆÂâbâÔ¢Ô”´ªÉUKR”–RVJZ-JKR”“)*K*ZZ¢ÒÒÒbâ–¤˜´²Ê–TªÊTYjJ¥e¥,´¥¥UU&.,´ªRÒ‰¥–©e©)iVX¸´ª¥¥)J*¢—"ª-*QUIUTµKKR”¥JRÊR•$¹I2¢eJR¥‹J¤Z¤¢Ô•IMDZ¢•*±r’ÕTµEÊ­+J¬UEªVTL¤µKR•,\X¹KR”––¤¹J•K-IJÉKJ”²•Z¤¥–”¥ª-RªªÊTª¬¢ä–YR•–T²¤ÅJ”—)JR’ÒbâÕK%QS$¸«R’åŠË*-JRÊ‹%’ÅÅ¥©-IiieK)R•,•,Z’É‹K--JR¥-$™QeÉ&YQe¥,©YIUKJY)eDÉJ”²L&‰‰¥*ZRÒ•,•(¥¤–Z+Y+,–L•)QjJYiR’ÒËJV¢–J¢Õ,²Ñ2ÊZ-YJ–+T¸²âª¬¥(¬²]Q5EUR¥”¥%,¥J´­,™Qt¢Ò•-JTªÊ–Tµ)K*T©QjRV”M*JZJ”¥)JK’¦JYjKYTT¥)&JZŠZ’–¨µIe*K--URÔ”ª¥©JJZ’—–-IJ–”ªYT¢µKR’ÉUK-)UVZY4UJT¨™,™-J¥K)JQe¥)JÊ•”©RbÒÊZÊT¢Ô”™)h™IRRÔ¥-%QKE–T•)rZ¢eRU(šŠ¨«%T©e-(™R”´¥,¤µ)J¥U-J*R”–¤´µ)JX´´¥JYiQqb¤´•T´¥JU,µE’a4\YqKR”–ZJT²¥¥¥•*©2U*¬L–”•,–²ZÑ2”•ET–¤²Ò–•¥–•)Qj‹I‹J’“%&‹Z)¤€ˆ…sonic-visualiser-3.0.3/svcore/data/fileio/test/audio/mp3/32000-1.mp30000644000000000000000000003036013111512442022621 0ustar 00000000000000ÿû8ÄInfo90ð ##(,,1155:>>CCGGLPPUUYY^bbggkkpttyy}}‚††‹‹”˜˜¡¡¦ªª¯¯³³¸¼¼ÁÁÅÅÊÎÎÓÓ××Üààååééîòò÷÷ûûÿ9LAME3.99rq.0$@"00ð¶‹´çÿû8Ä 8CNU„€•‘ê8Ð ¯ÄWEt—,¹eãZëb!Þ罟v{ÉÖ&²—mu»à`@0(@Äæ4`ûÄ€!ïÿ§ÝÓîé÷bL¬JÁü>¨à‡O¸A À(8 ˫ƒ¾dÔ¡ÍfH›–ðfP²i1Á„B@bC/¶ "|¨r‚ÕøO‡h‰oøîa†$G¨õÿó"ðö1.—L‹ßáPTDñTA_ÿ– †‹*C±€^Ñ€º€ÿû8ăÌ-ýû…£ßèÐzÑ\Y… I‰@D9ƒfcy‰h ƒ˜^™ã‰ºù®˜bNá2€6Y‚< ÙƒI€ÞÑÈvjí¯>tÓfZˆ{ÿþßÑÿÿ%ÝûGwìd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_•;c˜ä€#ƒÇÓbÿöÿÿÛ‚ˆD ñ…N&2k¯Ê`ŒÌa“”`uªc3@t>Æ,~¥øc÷ža³hÿû8ăÊÐ-„Á£A¿ô`õ€*sa³Fæ|(°„`q(À?l‡é™ßÿùÓ·éÿÚ{èÿOþÒñ€@ÂÆ4gå%`Õ…„abˆa· aßÒgVþNjãbx jÂÚf ¬cqa¨„À p2Ð-û?ÿìd`@# 2C#Mk:oƒ,Es @Ks p3,eóQÃ÷Ó}$…³õ'ÃbÓ34‹# Çs…#ÄÁóD+Švÿ³ÿþÑÿÿÿÿÑÿ°ÀÀó‡ 50yÿû8Ä,ɸ- ÿ¤a…¢AÏð˜xÅK³;í ÁôL%²eÌE‘ x2Žj:¡1Œ{ÀÀL6fŒ=Nnˆ5ð¼Ë °¼ÀbƦŸÑoþŸE¿ˆ}>†ÿ±ßÛú?ö*d©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_•;c˜ä€#ƒÇÓbÿöÿÿÛþP !€Æ8˜É¬f¿)‚0C1„NQÔ©ŒÌ Ðû±ú”áÞy†Ì¡ƒÖ¨ÿû8Ä:È-ÿF‚žâAÏÔ˜Ø@ÍŸ bÂJDêõÿßÿÿÿÿþ¯Wï©ÿ½¼ïë_îÿ}ú½u/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1'€Ù¬-¦`šÆ7fˆ@€<8(ÑGÿÿþÏôÿäÙÃELÈÓZΛàÁË\ÃÜÂ\ŒÂ |ÔpýôßI!lýIðØ´ÌÍ"ÈÈ1ÜÅ¡HÄ1Â0|Á@ â¿ÿÿÿôDßùÿÿÑBÿû8ÄJƒÈè- ÿ¤5…£¿ôP4€,*–c)üÂL˜+bÓ˜Q!<blÝ’Ob•‘€Þ˜?`t#@Bj1²‚•Ä"!Pe—SMhêwÓþßÙ%ÿ³ÿÿô;þBÆJ“aÀ ?12\36¨ð;oèÿöé‘ÿÑÿÿúö—ˆ1 ³?(9(3¬,# aP„Ü`•z`Sp{x¶À$-8† $ÿÿŸÿÿó¿ÿ÷ÿÖÿÿÿêie¨0ó(4“ŽÖ0cÃÍ0«!0„0qÅ•4{·½6ÝGS0Ö‚*0UÁ 0-š=ùNdcnÔÍ™1À^)ÿû8Ä”‚ h]þ†<…¤)ßéÛüSÿ3ýŸ¢Oÿ#ÿþŸýŠKÔB£†Žd÷ðp¦(Цx<vÆ3{ÆÔx~Æà*& †  ׯ  À¨P±!IïÿÿÔ{ÿÿÎ?ÿýßõÿÿõ2T›Áùˆ@q’ᙵGÙã…º Qƒ5¡‡3éáŒ8B€²y(Á`/Â]€8ä€p>X…ÿÿýhÿÿùÆÿý4ä?ÿÑÿ¢> )†”¬ã\ “&(ÿû8ĨƒÉà‡ ~„Á9…£A¿è˜\†SìF §q銆¬À*Ç]†æ‰¸8´0Ô0`‰6…uõ¿zÛ÷÷׿ÿwÿûþþ¿¬¼@à0±™ùAÉA˜5aaXâmÁB˜wô™Õ¿“š¸ÄX˜`!d+¶˜ k›`cRÀhÁ³C·ÿÿõÿù×ÿ¿þ¿ÿûÿVºtËø`af,@f©fõp`­†¦a+:`æ*`ƉÆgÞaÚl ŒÖawÄ`”Î`Nÿû8Ļʇ þ„Á6‘#ßÐÐ~¨kU•"Ä—*~¿ÿê4ÿÿó¯ÿýËwýoÿÿwýeÁ ‚À¥†Æg°“& Ø´æHO#X›·d…‡Ø¥F$`7¦ØÐ jÒ0"Ep `Ȥ÷÷ÿûOáŸíÿGþŸÿôéþÚd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.± ÿÿúÓÿÿóŸÿßý_ÿ÷ÿÿû8Ä̓Š+#Nÿ¨SãA¿Ô˜Ô ˆ@ã œLdÖ3_”Á!˜Â '(Àê TÆf€è}ŒXýJðÇï<ÃfÐÁëTlfÀÏ…1a %?ÕRÿþìBþ¯þ©H÷ÿëÿýõ›?·úêçÿ×ûmëKÿ»ïç>º/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíýÿÐWÿÿZg¿ÿîÿÝÿþïú™ÿû8ÄÜÊŒ‡ þ„ÁP‹£A¿Ô˜#4S#4³˜ƒ,Es @Ks p3,eóQÃ÷Ó}$…³õ'ÃbÓ34‹# Çs…#ÄÁóD+Šv×ÿô07ÿú°A-ÿÖŸÿ·ÿÿú·ÿªÿêŠÿöíìÿÿµ0,0¬Áe(LË|0R†Ù0ƒÈi0óC´1¥G68z5z<¾G°1±‚Ÿ0¾Ád0lÓ0C@t0(€%0@€J`²¯ÖŸ·ÿ`‚­ÿÿ†ÿjßÿéÐÿû8ÄéÉœ‡þ†®¬âAÏÔ˜X?ÿß°?ÿÆ^ŸéñíÙwGÿõŒ•&Ã@~bd¸fmQàvxÄanƒ`ÃhaÌúxc€`,…B 0X ð—`Ž9 …Ö!ÿÿQåÿË»ñÿñßõ¿÷ÿõ~µ€àbÈ d`òùŠ[Ó˜ƒ®9$JA<˜³@µqof¹Á¾Þ`Y˜_5`Ãkh¨„$€Ã Þ„}L¶ïýÓ*¡ÿõu1+ÿWº½ÿïÍÿÿû8Äîʨ‹ þ¤Á¨°ãþ‰Pþ­%?ÿ«êÿ¯Üï¿­ÿÔÕ®‰i`t`ŠEÙ 2Mšù¼Áu  Âj 0ÃÌÃFüÌßÝÄÓt¡ ¸Á*ôÀ§àöð5m€0HZp Hêu×^¯ÕÖ}ž»2§þA¿ègéÿÿ³Gä#1Yj $<Ç d㵌ðóL*ÁL!ÌqeMíïM·QÔÌ5 ŠŒpBÌ @&€÷å™ »P3f@Ç fD;ªºûæËÿuýõÿû8ÄïƒÍ͇|EA<‹ãßÐС_îŸÿ©ß¿þ3þ¿ÔáS €°ªT‚ Ì" t¬LÃÔMw[•µŒÙE]GPÁŒ*€?LŒ ÀÀíœl HØ^°Ù…ÊmߺÞìêêêoõ}Må†ü†ŸÓÿ’ý?Ñ.kÑfßÒd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.± ¯«ÿü÷þkô7ôÑÿ·öÿÒßûH4B!Œ*q1“ÿû8ÄòNM‡.~¤Ág‹£¥¯Ð˜XÍ~S`†c,œ£¨-S˜¡ö1cõ(?ü ó ˜c¬p9°x š7>Å„ 08”ˆý}[ÿ÷:uÿWÈóßöÖÊ}_ûê51ÿ÷¿}Þ³ßoõyæûê÷¿þ¹Új/80ÆÐføf XXF x†pP¦ðí&uoäæ®1'€Ù¬-¦`šÆ7fˆ@€<8(öÿÿÔ7ÿÿ°×ÿÿÓÿètÿÿÚÿÿoÿþÉÿû8Äí ‡-þ„Ál$ißÑÿôúýG20 Fh¦ Fh f0XŠæ€–æàfXËæ£‡ï¦úI gêO†Å¦fiFAŽæ- F!ˆ&ƒæ ˆWí¯ÿô2ÿîÃÿúºþÜsþþ ÿý?ÿýßÿmÓÿ¥A  @lÀ#c L0>A0cÆu0¹ÂÔ1CEˆ6‡©69ÒEæ1Lÿ0‘A 0Q€d”€ÎÁp5€¸\Ap¤Sz¿ý”Z_ÿíÔXÿ¿«þÿû8ÄðƒÉô]þ†Æ°bAÏÔ™®¶_ÿõóŸ©û¿_ýNú…Ù*M‡€`üÄ 8ÉpÌÚ£ÀìñˆÂÝ(Á‡ÐÙôðÆ!ÀY <„`°á.À  r@8  ¬Bþ¯ÿëEÿüã~Ÿú?èGéÿ£ÿGäj„¸„2<¾b…Á–ôæ ë†I†PO&,Ð-G[Ù‡®po†7˜fÀF XàpÀÀÄZj!‰`0è7¡O¾ª·uo^çJêÿþÛ¦{ÿÔêöÿ¾¤Îÿîÿû8ÄñÌE…ôªŸ°£þ‰Pu¿ýn–öÿõ,çþýúÎÿõÖVp* d(Ê6hæóÔ&ƒ ¨4à #3 gó3wLpyÓ „&ã¨Óœ €;ÛÀÕ¶Á!iÀ(D0Q#ê­•«{þmþÏ£ßc¿«úóõþ¿ýÿß_ëH–Zƒ 1ƒAY8íc<<Ó °B@³YSG»{ÓmÔu3 h"£\³Ð €=ù@æFnÔ Ù1À‘×·úú_¿ýºÌ_ÿíÿýµÿû8ÄíƒÌˆ÷~¤ÁD#ßÐР¿ÿþ·ÿûÿúÿöÿ¿ÿ¬ð/P Ž"9“ÜÁ˜ ¢*˜=àðlaÛ4ÍïQáûo€¨˜0 V€0ÿ\( 7¡BÄ„'»ý¶~ÿ=ýgôÑÿ‘ýôÿÑd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.±/ßÿÿZÿÿüçÿ÷¨wý_«ÿÿWê€BãTÿû8ÄôN‘‡N~¤Án㩯ИÈ c¬S`†c,œ£¨-S˜¡ö1cõ(?ü ó ˜C¬S› š73á@Å„#‰FýmF_ú]Í_ôéÿÚ¾Ëÿ»âãÿÿtÜy¿ïÝ:éúy#Ûþú¿”ý|ú ¢/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíÖßÿú’oÿþu¿þÿÿýÿÿûýÿÿÿû8Äí‚Lµ…Mþ„ÁY £é¿Ð˜û/ÿÿÛÿçÙÃELÈÓZΛàÁË\ÃÜÂ\ŒÂ |ÔpýôßI!lÃÔ ðÁ‹ÌÀÒÈ w-€Èd1| ( O"µÿþÊ*+ÿÿbÏÿý¹åÿìu¿'ÿC=Kñ5çÕì´¥° ˜‚‘‚ ä˜=‘©‡¨vÛÉG?èð”f»&€JcPP`´h¾ÚT3—n÷’ßê_ß—HÌ“ü‰û.ÿíKÿÒÏûCÿû8Äñʇþ†Ö°âAþˆ%I°àP ˜„.›Txž1[ Å0ãZs>žÄ  !G‚Œü%ØcŽHGCáuˆ_ÿÿÖn¿ÿþqÿÿÿÿî¿ÿÿÿ·ÿÿ¯ÿÿ¯ÿóÊ‚ˆD ñ…N&2k¯Ê`ŒÌa“”`uªc3@t>Æ,~¥øc÷ža³l`õ€*6³Fàg€°„‚«©tÿ׺‰%ÿìJ!þ®¦õ¿úßZ?ÿ{õœûóÊÝè®Ùÿû8ÄïƒÌ … þ¤ÁŸ#¿Ô˜ãÿ¾¿]ÿõΈch³üƒH3¬,# Å„ 08”ýo«k[úg ŽõíºˆÄ¿þÔÿ÷ÔZI»ÿ©Õ±‹öÿ:®¿³mn™Î¯ß·tÛÿ]E¦/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíÖßÿúÿÿc'ÿû8Äï é… þ¤ÁŽãþ•P~ÿõ ÿÇ?ëwüw÷Wú†"tËPa!æ8Ph+'¬`LJšaVBa6`ã‹*h÷ozmºŽ¦a­T`«‚`Z0¿(ÈÀmÚ›.0c2§E­þµÿZ?úß·¦{ý}u8{íßþ³ujùÏÿ­6{Q±Ì-•Õ³2ªÝ²±ÞOð£^( •JB!€y‚äAŽU‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8€¶à Ñÿû8ÄëÉÔ]þ†Ý°âAÏÔ˜4œ›]ýßýGÿéÿÿ_ÿ£ÿëÿÿOÿÿãíÿ”ÿC%I°àP˜„.›Txž1[ Å0ãZs>žÄ  !G‚Œü#ØcŽHGCᦽÿÖÿê6úMþuÿ×ïÿ-«ý•þÈ?ý¿ÿÿ,ÿû¯ýÆ¡·³ò8 R³ŒApT&L˜¡rO±€vœ`@Ǧ*³«W`˜$níÚ0 Åëÿû8Äé‚K„‡ þ¤ÁÛ*£a¿Ð˜~Êëÿ©—þËÿcý—ïßýfßÿþsþ¿ÿÛýd—ÿÿ”=Ÿ‘ž©“¤¾@`LŒ€Ìu `¡ $ jÌ(>Ìžz®LëavOÿØ7´Ï(ƒ Ì2$Uˆ½+ÚC¯ÓÛþ9?åÿŒöû÷ÿQO_ýÛýÿoð±û'ügý*m"k\3ÓC8csb¦“K€S@ôS*z“ADð?”ø ‚“0€Æâð1p *€Á±ÿû8Äá‚KÕU#nü¨Áƒ*£ßÐÐÁKšv×W·úÓWû«¯æG»z¿ÿ-ÿùßÿþ¿ÿ±-ÿÿÖJÿNÉ0G” €8`Ž`p`O `‚ˆª`÷ƒÀa±‡lhÓ7¼mG‡ì{â¢l Xf Âcø\b0 Š€¥ö]²îÝí§þ=}ù6­âmþžßè_û'ü¯þŸÿGÿ ÿÝáÐßm>J^¨– ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éÿû8ÄãLaU#.þˆAª¤!þPà(|.± ú¿õ+þËÿÿý¿Ôo÷Ô¿û˜?ú¿ÿó!Þ—×ÿñœ+¯ÿóÀÞ&”¬ã\ “&(\†SìF §q銆¬À*ÆØæ €›€{@6 @Ì@Æq:¬º™mßþy_î¿úßÿÿõ›Ýóÿÿÿþ²KþÊÿ‘ÈòE"ì‚…@¦ÍüÞ`º„Ða5˜a€fa£ þfoîâiŽ>aP„Ü`•z`Sp{x¶Àÿû8Ä⃠‘U#.þ¨¡*£Éþ•P$-8† $ýõ£ÿRóþ¿ÿWý_ù›­¿ýò‰8ß÷ÿbùjÍ?‘Õˆšä.€€aƒaI‰¡œ1¹±SI¥À) z)•=É Ž"xÊ|ÁI˜ Àcqxˆ8 @`Øà¥Í5u×Ößë?ÿe¹Ïúÿÿ=ÿoüïýÿÿä·þ¿ù*ßý*(YJB!€y‚äAŽ•‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8€¶ðÿû8ÄÝ‚ -…þ†€*¤mßÑ Ñ4œ›]û¯·úÿ_ù›ý}ÿÐoÿÿgÿ_ÿÛü_ÿÿ ?²& ª·Å€#5j #ŒC¼ƒœRc þó¸ecü2=@F„ª– a p€XX‹û꯫þ£ËÿuÿRÊmßïßýIÿßÿ9ÿ¿õÎú¿äaÿþJ(yR³ŒApT&L˜¡rO±€vœ`@Ǧ*³«W`˜$níÚÿû8ÄÞLaU ~„Á}ª¤eßÕ0 ó ï÷ïÿ=öêAõüë÷õ>¯ü·ÿÿé7ú¿ÿÿ+ÿù‡ÿ@¥Œ%ò"`€$`,ž`Œƒ¨`ëa%Va@ ödóÕrg[ ²þÁ¸¦yDža‘ €¬Eé^ÓºþýÿÔéÿOû?úýMÿoük§ÿïþ4 ÿ¯üxg·òp"k\3ÓC8csb¦“K€S@ôS*z“ADð?”ø ‚“0€Æâð1p *€ÿû8ÄÞ ýU#.üHÁ‹ª¤%¯Ð˜Á±ÁKšÿÿ>ÿîŸüãÿ«ÿëoýô_ÿÿÿýD³·þG·ÿH.U*A„æ Æ:V&aê&»­‡JÚÆl¢®Æ£¨`Æ@¦ Æà`vÎ6$l/XlÂå6õ·ú«ÿ¯þq¿ÿÿžÿ¿þƒÿ¯ÿÿùêÿ«þQ?ÿÒ #òÐÒà8†&‚fxFÏ…ÆÓ›Ænþ¼‹†°›€b›ÈB¶†pˆè‡ÀPXª-ûÕûÏÛþÿû8ÄÞLU#.þˆA{*¤þPËoûú¿ÿþsþ¿ÿÛýDŸýÿóÿü˜p-$;ŠILHÈsÌòŒ ÀOL-à+(À q 90Ìà@Ñ€À9â@Õ8ƒ½µUÔßëGÿ9ïå–ÿ¶¿úŠÿö_û&ß÷ÿû–H—þ¿õ e{?%$¦N’ù€0@0O0FAÔ0u‚„0’«0 û2yê¹3­…Ù?ÿ`ÜÓ<¢ „O0Ø@V"ô¯ioNŸõ/ÿÿû8Äß‚K•U".þ¨m*¤eßÑwnþ¯þ¾ÿê_ÿÿÊÿÓÿÿùPÇý“þHcÙú`¢&°…Ã0 0l)1 t3†76*i4¸4E2§¡4ÄOùO€Ø)038 n/¡00( ¹¦®½»ÿßïØï_Ðõûÿ­_nÿû?ú¿ÿõ?ú¿äyïþA •JB!€y‚äAŽU‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8³€ „  Ö0­M»úÛ¿ú›ÿgÿû8Äå UU%Žþ¨™*£á¿Ð˜ÿ9ÿÿþ{ÿÿÎÿÿ¿ùÃ?û¯þFŸ·þD"Cj·Å€#5j #ŒC¼ƒœRc þó¸ecü2=@F„ª– a p€XX‹ýý}õš¯ýÕþ£#ݽOÿê5ÿ²ÿé7úÿÿÿ¹ ÿ¯þ\-ûJd z€Ô,@Âá°±ûê«ßýi¯ýÎÿËßÕì¿ë-ßÿM¿ÿÿ·úcÓÿ¿ýÏÿù &ÒC¸ `4”Á”Œ‡<Àp(Àá°À\ôÂÞ¸Ò@Ü Ó<Á~  üž$ Q@0ƒ€xh;ßÕïÿ?ÿt_¿™7W·ÿû8Äë‚L­U!ðꪤaßÕú~þ¿ùßú¿ÿoòÉÅÿ×þ¡ðmìüˆ•2t—È ‰€B‘€°y‚2¡ƒ¬!„” Y…'Ù“ÏUÉl.Éÿûàv™ådy†D‚ ±¥{Hý_ý?éÿ=»úýÿ·þÏþÿÿù ƒ·þ-fÏÓ9@‰¬!pÌ  LH áÍŠšM.MÑL©èFMqÀþSà6 L ÀN‹ÀÄAÀ0¨L Ç.i¯¯öÿžÿÕÿ;ÿ·ÿÏÿû8ÄêLUôê†*¤%¯Ð˜ÿÿùÏÿÿ÷ÿ8UÿÕÿ)ž³þAh¹T©"8˜.DéX™‡¨šî¶+k²Š»Ž¡ƒU~˜$ ?€!˜ `€amÓI¬Ú־ݿÕî­ýÇ__¯¿úéïÿœßëÿÿü ¿ÿÿÄ+ú|’8U¾,!¬{P˜(@YD`"Eà”$â“W÷˜•Ã+àùè"4#P±P„ÂÄX—×UUõçÿõ¿ùÿõÿýgÿû8ÄêƒLµU­þ„Áy*¤þP¿ïÿoõÿÿÿLzÿ×ÿ5-û@VEñ@Ài)ƒ)y€àQÂ#a€¸ é…¼q¥€1¸!‡&y‚ü@(0ø`¤ÀÌà1¸¼ D „ÀÀ 0lpRæ½~ÿëe×ÿ3oûÿúÿßÿ8ßêÿÿþp»ÿÿæg¿új5iBB €#˜à\Á˜ ¢*˜=àðlaÛ4ÍïQáûø¨›V¨0˜þŒ†â )y˜m6‹Þúÿ²“ÿØ…ÿ¸ÿû8ÄëLUU!-~„Áˆª£Ñ¿Ð˜½{z{¨êÿWÿÏoûúÊ¿û/úƒ+ì£ÉŒªßŒÖ=¨L ,Œ"0 "ðJ qIŒ+ûÌ Jᕌð|È@ô¨X„(Âab-÷Õûϯþ¯ú/þ¯oõ«ïÛÿ;ÿ_ÿïþfIÿùt·^¯× —!@û6UBÀá€bù…aŒò„D¹®BaÌÜ(KñŽˆ „  °_‰@@€AŒŽc}ô£öÿBÜwðÛíÿÿû8ÄêLW!ðêzª¤YßÕñ¾ú7þWÿ_ÿÿêOÿÿÿýTBà&¤Áê¾`¡„4a ÀaOÖan be¤áVhb Za%„<`&`G<:è€,1 ˜‘õuuç•ÿ·9ÿûÿ¨×þÿùÏýÿýöÍÿÿ¨}ò 4@‰®Bá˜6˜:Û4š\š¢™SÐŒšâ'ü§Àl˜€œ7ˆƒ€aP˜ Ž \Ó__ïþµÿÙû¯ÿêÿû8Äë‚M…U/õJw*ä¯Ð˜û«þ“ÿÿÿœ1ÿ²ÿé–¿ú€àer©RD p/0\ˆ1Ò±3Q5Ýl:VÖ3ev5C0ªý0H@~0'C¶p°#azÃf)·un¯ùÿû©ÿηúýÿçÿíÿ™·ú¿ÿoô‰?ý_ë%Qÿéd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|4Â_õ}uR_ùÏù×ÿ_×ýi/ß²ÿæ/þ¦ÿû8Äè mU)®øHÁˆ*£Ñ¯Ð˜ÿõ7ùLw?û«ýÈi^Ý?¤J¬Jˆ (¦` FXæ І¡Æ`-¦@†¨ºH†ÿ@Æ ¸ æ ÀÀ`yÎP×CÌÈpÂ… ¬Âî­èÚ·úôö·û?ýôÿ©¿tÿqÇÿ·ÿÿlN/û/ü ·M¾- @TÉÒ_ 0&FÀ æÈ:†°P†P5fŸfO=W&u°»'ÿìÚg”A‰æ*Ä^•í!í«[·ú‘ÿ×ÿû8Äê‚L W#þ¨{*¤eßÑþQÿþßòß÷ÿÊ×ÿ÷ÿ@E¿ëÿŒö~€˜ ,’6@]!Ò,oÛ˜0í  ÏSA‹L¿u£Ð‡ ‰ÈÕ½ hAõ×\ŒBZ¹"¤bÄ}­»õ˜zïbnüüAȇ.µ†päC—¥oü^ã¶å¿òü¥‰ewñ܇)7+ÏÔßøÝ½J#+Ã䲯ééíÔÆéû…%%ŠñˆÅ'3¯Ož¹}¿ÖsuƒãóâÀnòÿû8Äì‚ÌYUþ†¨ª£•ýˆŽ¦‡Ãñ°ÀP`i2XFä_倰…\ÀÃN7þiOƒêRæ›LÙY¥€±šT/ÿÍN“nÙM1PŸØfr5ÿþf„šÀ• âÆXè¡çÚGˆÎJ¿ÿÿÙ©iŠ _4¥4Q"«wy–]ÿÿÿÿUÚš¯©Bêf1öZÜ¿ÿÿÿÿÿÿÿÿÿîE¢41YTÔô¦¬í4×ÿÀ¤‡$8ÒLAME3.99.5ªªªªªªªªªªªªªªªªªªªªªªÿû8Äç€ 1U!ðê‚¶ê¶¹€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÿû8ÄÁ€õe¹½4ƒ€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/mp3/44100-2.mp30000644000000000000000000010067613111512442022636 0ustar 00000000000000ID3@;  8} hTALBAlbum Full Of Test TracksTIT2 Test TrackTRCK5COMMNone worth speaking ofTPE1 Test ArtistTYER2013TDRC2013TCONTop 40ÿûInfoN€ù  $$'*-1147;;>ADHHKNRRUX[__beiilorvvy|€ƒƒ†‰“–šš ¤¤§ª­±±´·»»¾ÁÄÈÈËÎÒÒÕØÛßßâåééìïòööùüÿ9LAME3.99rª€$8F€€ùã2ÿû›R•e 8¡ ¬ À«UYÈ´šë76Ъó Ss$³,“sh†ÆôÞç­ç+fxå¯Sv&×ÝðÀ ‚D NhÑ£naõÊÁóù@ħ¿£ÏòžþGƒáùp !ßý=Ž«¶`AÂG'†‘L)ééãq¹}°|Äï¨qI>;ð’ÿø?Ê"P1þPÿÿü °A€€€`¡… ¸Eé kÌvb4Ô\ÐBÓX 0˜(Á ÄH‹ à±m‡Â9C5øË$T€ÿáÎâdŠÿäÉ‘x¼‰wÿ˦Eâò(—ˆ‚ ¨ˆ÷úÁQT-ÿ ©g0 ÄbAX Ï Lƒˆqባƒ‹])Où‚.DgŸà.„ÜÄ»àðÅ(%ÞÄ ð eÓê>JŒc´¾bHžQÈâËÆÅˆèÿ™¬ªjæˆëJßɉ™¦q@[~UH€Ç*@[KdiÏ•û9J”¬0<0Ìšÿû’ €ô$ÑotÀ Lä˜éᘠ—1ïlhéxâÔ1 6|A;pÛ1ÄÈ0LVKÙÁb¯´< ê’‘kxSÓÖõš†>©‘ïlæÿãçϰÑN¸ÓÒ †¨u„–ªyT\õ¡ÖcPj€o— ù8«Ð´Xa„"…’˜ç­¦&cOgYd»Có›ûõ»¹¯³hÁÃoŠ,míJ3-.ÂkxÙ¶[h™j³µ£f-DQ  d²4åUdÀ ˜ƒ‚`®™Bø ªÀÛ˜‡áÇT¡I’„„PÙ‚¿TRIM¬P0qr‰ V¸—̉õr)®vá<õ‰ø0Ä ø—!/|tê&™PÑœ‚ q¿úÕïlÀÂ/ â–’$Q Â Ö Ò  ðŒ2…¢²’’(´Å¸ps›Š`„æay¸ž°WRYƒ«z{èÆé©ÁÀ÷q‹:¹ê”^û"®ƒõôÿý–¿ÿÿ÷ÿ÷·j_»$‰€øª T € dUšÌ†¢‚e ›&§ã²a‚ÿû’³Lë^1JZ&HµÃN HÃ5ìøe!¢€3 ù,æ@Þ` €N Þ‹Ëã¼æL˜¼ýçúµËôˆ(·îZ 5vcW͘ÿƒ.)Âñ­mß§ßì½ÞçÎýð L€o%’ȆèiMUtÇ«s”uyA›‘NÆR q.¯³(“€®Ä ¨F+’Ç]ˆä‡4 ðtL ÐÑYÐЀNŸ|»#ÖÑï4ÄÎÈ8«E)¾ÔßÐ P×[k`<Ë1>ÄV{ a2¦s"o&£Š`Pà,J{4˜ f Dn"¬4‡· ÇHfRJjÿJt¡c ‚¤tÅÉëî`šx"1iö"æÃ5H&‰•˜ïrdf%¨ª†‰î¨<ý$ò™êòæÓçw£Nê[™„Æ‚O°²ÿJ"ÓÖIEb–4PëHƒ™$Æ7™Ê(C$°¨¢“EH…áÙPŸš×§ù“kß„Ÿf¹ûý«U vØÛD€Ö™ ¤¼PD ³Š14j)ð®S_ÿû’“%ÏkÚ2.]ˆµ CÀ PC¯pÆùh#âÔ3 8Ò„ ®×+| >Éô ™É4ÄÆ°b›bÿÜêøÛòõµã7êݪ7PŸ?t-h•7‹¹]ß·3´°ïî÷ÞðD W8 ) %'@\p˜Ù€ÈXmÃŽäh–x«ƒ²+ŒŽÅ‰5u,G%nªØ+J9M\aÈETT˜P$P6 IG¦2j|ÞÖ[Bzu) í-¤Ôªï£@@$L€Âý%@–1qˆÄàá`ºü…Î<ñIx Çæ¤ˆ"h¢B^Íve.‚f'Ý×ókbú£{”~Ó`=t%‡º®¥Yvþ$J˜×ÛæEþÏLðNèô™ò„(©²ÕE ™åJDÐZDÚŒ:Ö£G%uˆ‹ÝÁ\ÑÇ\â(UtÈŒ53'}È‚θm·Aí,ŠôYB‚órUÙ”¡ç<ò'AT$>AŠjIéU½$Õ vÉD ^ì‘5Â} ‚ð 3ˆA¨@32 Q€È@ ÿû’“ NëIN[gHµ à ̯;¯hi¹pâØ3 ðª;3 áWŽšÍ+‡7ÇÂæ“¶í7+Œy)­z¤d×é¿ö•ÊÉԆſZÜÿ†)¾ÄÄŸû­mgî£- °Öu«š¤¤­¤$—9¤ª°€À <`Pf0nªf|â4l¬Á`áIÒã2ØzôzµÉf§¤»7»9nФöâaÜšÂh)ÔõÏÑø"ØFÕ²‚ÑÊgв Nö³Õú¾ÿñó6xˆÌÜ;„Èá;—„Å^õ+¶­Ö‚ìk=ùO1¬ÖzDò)™ºtòT¯íZî”È,¤xÌ•MIœ••Ϫ ]lM¥p€Àµ¬¸áaáuzâ´ ”¥¶  8Ïrñª1H}m‘° •àû´†–‘€œÄ©œíÐL$„ 5P49ÿû’ÁS{»I®E£ÙÃZ ˜•?®èh±0 #` ¨@NH@½v‘,˜²JÆ5(¢’Óϯ$ŸÐjÞkæï[ÑË]öª{-&õÑ®ûý”móLíëÿûê¢ HêIBNe:Û'ß­+=3ÃÝm‰ÄH‘#MÕ=©Íö¥0O°B*<À躂Ë÷AµXÕ°f»Ü¯«ÿoסZÜmœŸ:¸@x1 7AW?\W1$á2Ê¢ËÅPÔ9s¢ÔélU.m«ZUÚ–iž[Mc›¨8‡ ¬Ö.]õ"õ QôU¬·n ªu;dÖ±xÉÒ= #,”ãÃ¥‚DHž ¡%O…AÆi@²p‚€:H ™7.¡ÂE’È¥ REN;¨QÍ¿÷~µ¨ ¿Ýt€Y` öi1&B s°mÐÑd*RàN=cJ|ìÅ­ZÎ?/æŒJÓ@žy÷.ÇBîøA`%zÆÊ[‚«P¬Ç\¤nÊÞ*€ª:Bv§:Ä`Gÿû’0€’—!SëŒÌH䨨 #6 ˆSî0jù>œc ŒUE 0IÂu g!T-1K)?f˜‡ZKÜ cäšY‚ï(“Ê,à¹ÂAyƒé›HA‡zØ!m³L[Z¿©@QaöÚ×x”=Ð`lb ˆóÆb $ÔÆâš±²ß1ŤzšÇ.jÉxަöÅs—r[º›pëÒZY«ML>ÿüý}›¾¦íòr$Á ¤€å@‚ðbÐÜÐhÃ3ˆná”<é£$¬„°Á•;Ùðò©¡5‡"›Ù!C<©²4Àà±I;0j+zF›"ÛëÒ¤ÿr„ »kl€Ù®qÝÅv¥Xw`±ƒ P“c|#· š á8q+x»°¢G4CO†FõÞû÷¥‹$á lHyªÔ9×x`ÒÖôXÊ’°»„Ö=”—'·&Æ`C3 åÀ`Q©šºeSÑ ôIƒï5W±”ó¹Ï~†´ÌÆ(¨|™B›EÉÖpsů4²¬Ï¤[ïˆ Ÿ&ÿû’Oƒ–Sk‡œGE¨Ø b~ ULŽàh¹$cä0ŠÐ*';,ª`@@\ÇXÑ|P$)+WS».qaë €XŠ„qÈÄŠ#m /%Žž¾§dXîýs±j¥p𯜒Ö7ùǬý;ÿZ_Btªì*É?ÒÁ‘dŠ!×Ç:gC…/¬f~ЄQZ Ù&@zg ÃYé`°è°„4 X5ߨzq÷/þžÄ)ïïÓSX}v¶04P ¼ËèÈÐ@#˜kNe$—-@nŠ4n7’%B;¡^*deoùÒ¾z£øVüÛ«–O,†ýÖæ~pμ.ä!¤O±+eñÀ9a&hæÅËì"86Ã’9ÃpÂýXN–0'ÌTq*vÁ2õdjyR¨ÃbÔIAb2a‚@‹P É’J#R|Ú(RØivbä´ÿD ]úÛdh†]í–5ôÀ0xØÓÕˆÌ&WY€^RC‹ìêq@/•jÛ´syYç‘r«Dg„¾,²ô'MGËÚñÿû’t€‚“3ÔûŒ¬NEÖ CÐ ,¡K®0j±"’ã 1‰¸Z ry¤Ý§ïW+Ô¹×nn=R!A S8±HBÔ$¨©Mm0Î}Ø®©M¼aTŘ2X``!Rg°(›\P$Yn¡"ìw"ïé_c>ßJŒ ¿íl€©“‡$,i”‚AÆjÖÈ©\]2ØzZïKr4Ž©ò k¹Êå^²9”%ÃâÃå\D”}Ì ¨¹t¨ÑAAì$Íz*ºÉç½¶Ôà­C”ˆŸ E¨ìn¢FXб¾¦ºRo¬ÝXÉ›¦vè—Td:úž;ÒG㔋 q:áÈiBæFaçÒaË'¤ÿÝj}F@jñµÖHIãxÌÅFÖÑN&®§ª ؈xvDô¶1L föóWTj\Rÿ÷]CÈõˆ»wÓwî­ËýÿÿúF2 Æsîù–•_šã#[TþÀ&ÈdAntêÄ´DlAYÃÄ* äæ)ȦÎñOzf‘Oܧœ¦òPÐôË.—” :ðˆt^B* †ÿû’–—Së›1¼G†(Õ # œwSîe¹G£`ŒËŽ<ÕÐÍiHÉ"î.Éÿ4åõ'숀¿ël#û\Suˆ\s8Þ#ž :‚5ñÐ ”\6aùP“IêÓ«uAð=LJJ0ðhPdÐênòt ¥¹I $V•Ÿhʹ 4ä$b¡êIÍfÁ°¯MD„ ©`õÆÝQ³'»#E*ðÄÌlô$1‘8 •wcX«h×y& R_y·‰‘)©îÚ«ÏUL`]þíj¥Pf"˜Ñ–´™Ç*p`x€H + M>OªÑëÕ b¶3¥P²qj†®ájÉùw.ÐPP™Hp3Ïù€Åu-ªµ¬GtîÑ­ FS 4:U\Z¤{ƒ`RŽUŒØö€nL˜f<nrfR¡E\È”Žlwýs>M@¢šó,(eI–e 8PÙL' RÉšÜʘ«oNÊ(CX¶²@Ѝ/434 ˜bvÆZ´ñjÏtíù €BÛºã"i¼ÏÙÞÿû’´’‹Së|I¬GEøè "Ò 8—O®0j±>—#`0ŽÀªY2+<àm˜Ž½òÒ›¿ÿæ¯þ8³·¯~®Ow$IûÙ¼@( Tne€F•`³!fËvhL[*×µ0H,Ôó³‰LGZBÁ¼ðps0&ÅñX8fE†!c“C''hÕ îèåªÄÝÈâ·5j ¨è' 0<K)U“Å5-CÇÿùVt›` 5Q‚Âx¨‰„Ä kFÀÕAc4tØxÕèB1µ”a4Ѻ Ó¡œX… œ@¤v¤·/.鱕ÑI‡L’S^ÏúYež ª 0Z QšdÞ5ªúÕ vI’ Θ‹ŒºP`¦`Øcü¸‡`è`Ff_™¡$ZLäµèvÔ¦¥ñÂÒј8ò›TŒ‰˜–Ù¾JèS€–£VŽUªO4’^ÿû’Ö€ Ôû™1¾JåØ cJ ´•M®0lqm¦"À0 ÑïÐÖ±A'±L]Mÿ¤ ¥”¤Æ‚laC)l‚”!…ëW|…,U1iÐ`‹åx¸xé™0"^,X$t"lÀÀ±2…Ò¶˜–>>ªõ¬·;w{ÍÑoÒ€6ÖVÒ!ÒcpsPÁP Á*1‹ “ 1XTëÝ&Ÿ†æ*ø7mºT$p(PÙ,õv†þÍ_曺œ<]F©ɱ£&XºŠ&.¢S1×KÎ:ƒ‰ÿ÷P€G“»A"äTäöŒB5~\‘©0£â‘:ð‰ã,ñœˆÐ+Í&РL ÁcàʆjJŠR<)4Áq9yqœHL²¢—W˜ÓîRiÍ*Y[ËÀæ$edæ ”sræ,CúÌØ^ô9IÉ!7í’‘%òd@¢§~a‡ð¤›úÙäÀ¥˜X±‚ðÂDYˆx‘URÓKmsñ«É‹ÕµnsEĦÊa ñe’þT¥è¤]oaпÜþòªýE(>ã‘­JKna’UÿÕü˜HM§E§Š/4_÷ÿ£¨ d] „#l õev§wƒ*Y7 qƒ¡ä…2ÏÏBÊ8ÁŽ mY癘#mO—@@:lZ›¢œt°Ù4«ù9ê9ö–D_Vˆ™b€ ° %ˆ9ÕšÒeÒyA‰¡@³hLžÄ¢î¾º¦-c«0DQ踊±ÅÝRÒÇ…NŸ<ïä¾àX\\Ka!ÿû’ñz0Êk~`T(ü#V ÌÍ+­xeÁ_ž¢à3 ð‚uÜx6.Ô¬RƒØåÛ«öþ°–±E"ÑLl¤n•üZ­f:’n”U_P:Û“»cPíÒ”ÞŸ±ãSŠ‚e¦@»³ q*ìéÃ6ެyj2qŸ*FyòròÛ·mæ÷Wºñ_ßûí0 ékŽBùi 44Ȉ à" KFÙc“OEÉôÅÜÔL9…œÁ( @t(‰¦È7ñøìx+‡'wE˜w”(Žèâm¢ÖÜ×/¼©ÚxŽJM¡s4Ûr.tÎ,0Lè N‘“p;9 a¿òÀA-‡¤y¸§$µŽ<  æ†! ¶B%…Ù¼’ i ²"PpZ6µí°Äâá>$ÈNƒ™5Pó(BQ\/¬9b«Šrc L”H‡ÿµ»LTgÞ«¹N[¿÷ÿþÕ RHãm  ÉZµ‘ÆÀ&`ú†fΰmr búc8&jTa(XW*3”¶-;Õ¼‰³ª\·t •J]°s1æwqõ ÿû’ëƒL,ÍûÜÈ\%ÈÈ #\MxÍ+­øeAs¢Ð 9©§X„‰ëa€;EF‡iûMŽ6Ù’¤ ¨…€€ æB\`•ÜphpØ)d$-/ךM? «ý Ʀ PòÌšSSÇó¿2'ËfflGêþb"£T G› U-&ZŘZuNI»=ÿx5zDpšX)ŠA–¾ÝtÖkŽ<å2ضL"àª@áÐl"±r×"ÂH ¸¹÷Øü$£SKØåéÓߦ‹*ðEm iKÍÅìZ?©¨Áá ŒšQ4(Ý0³-#)Í¡ÃUØGc (Xƒ¬%c¤ È,@…ïSÞïÅ-ó›õ(ÆÎ=Ò+Æ YJ‘óØp\ó 9 ÿû’â„A!MkÛ24W…hÈ Ãj @4opÇ, £¤h‹,*‘]ÀpL»•<æiâíž&y&£ÿ)ü€^(„"Zû†FŒÀ)9w!âñ,˜SRÍ:,Ð$¡ž•[¨#@$[r`ÃçC$sUZš½M!Óƒ#î9E™QÕ ÅÉêLªvœ°çR…4»ØI¤#í4² P³hR.îíxͦÒÔJ±! €ôÁ4Œ3ƒÓ¶z΂|ˆ• „ÀÁHÏ:1 KµÚ«.g¹B8­)ÐC‰0™™=``£e!ªT[º8Pä„£9ƒÞ)YŸ<Ë÷<Ô)¹å<ÍËð÷ck,L¤IÿÏ™qÜS<‘áž=±q˜y˜ah¥‡òGF ­ZÖ‹hðÛ2rŽæfƒå3–CÉu2°A1 @ˆøiáR“ŠŽBñQ@ËI‚"d]R4D¹'ýUÕ9m­‘°4“ã#°+D¬ÁÇ'N5“2È$Ђ£,CÂÀìòȬLLåꢕ§‘<Äÿû’ë³HËŸPc 8¥Ã\ Pë/¯`j`¢Ô3 Ø&jÀçäWlçW¦“N˜"«Ë#æMÇïã¹Nx:.SÖhPÊšÕžÿ¨‰Ù‚ST 4N(°`ƒf²7ë(K7šÂ¤4„õŰCô@ѧI¯SN£f›¨A‹<ØàäVKH‘i)°;Ü·Þž›Šî‹µ¶Ô2î@˜ÂIʼar$f€bp–9æ¤6a@¦@T`éÊ݈n0žsƒ´I,è¿:wÂÕ¯3¯ó?þýÑ|q ÇÕBòäQPæ`ŠÄ@\«’£ÿZµLIæîæÉ•tž•Ó41§±ÔQn›¤J¼é™Â<®bd% ‰0zý÷$i]óͧÖ*X ^âb!Q),:åÒy"„nz*£×MhÖ(o¿¶ÔrõI¡à c 0¹£F‡È9/£ ’0,4Çä#@ …aÐÍdG#ä(Ms¶ìåßhßlÆ^æ¯qH—>ÿû’ݳ&6M{ÜÈWFÈÈ C` ô‰1íxÅ1c`3 ¸1Ê,P€åD „„‰'(®Z9‚ˆ™*Ëva´ÿç€$в”ç–'{É®pD…0²%?/ F6:YègŒY´}ÎïX«ð–Óe ®kÀà‘*Ë— …ÈŠÜ.%˜,|Ó`Á—˜мƒ ܉&¥4ÒÆ#¦ú¯Ûm#d8‰î×ÛròT(3&ÐP6`x¦ðºG")™¸*šîy}(Liƒ µeIºV•dQÂÚdÜÓ*ås¢‹HqõŠ1ÇÔ‘PF¹*S/0hú€Âÿ£Ì•Ï„vÇ(àPØp¶ HaÅÀtN %’<-qPxΓGœYÁ‚çÞå HŽaU®¼8²¥¥ž©÷“ì%¸jE,]‚€06Àƒ0ÆB0$p0¾Eñf`Ð ôsä•Òbͤ p¢IjN6eíî l߆`r®`€¨`Þ¨`-€’az€t`U(Uš?ŒkTÿû’ä“JÌ{Ü2 YxÈÃj °…MµÕ€1'Ž#V†0 –æp†",º :$|‹ Ë"VݵbŠTÅ; ˤ[»Ð sR¤,0þ¾éfæçYºXe±ëMÝÍ/+)](èšî{§îáõ»‘÷ÇÏñúþ1ïYrÆÏ¡uÿÿô, 7ñYDLã•nùË¥$D̨7uørb*± ªÉ”„¥L·Æb¯\7¬”0‚ 2SéSpŠ9rŒ4`’‚ sKî3£qï^Åz~Æxu¯¯ÕK Óáã#š½à}DŒa¦TéiŸ>g_‘v”1`éÉ…ž)v•’WÒ4>^SÕtªé/VHŠ×j¦ÆvªHåЧ%·ì §+Èò·T^f‡ï »‹-`Lúño ìw?9ZÅ.òÑ­<9žÑÎÚSÀŠ×Oókêácÿÿÿÿÿÿÿÿòäÿð`H-0€`P‚`Œ Ê`oNa`‚`_‚6a— 8kéNj¨´rí:ôc˜£Jsªg–¡taÿû’ê©ZÇN}äΨYÍ<½9ôI¤¬7;¢C6`W€,`ë‚È`2–`_‚B` ©M((ƒœ\òG°\JĆšÛˆAØ’ešŽ»±®óF”1KHf†“ mM‹hY¢b'Kˆ„Žotû£¨dé*”Ô±SüOS7‰uMñÖÕ¥y³Ä’¿Ï<Ÿ¬XÇúïàÁ®7½_ÿÿþbêöi¾Þí¾ß_n Ò 7AÎ`BL¡„ #FÌÌ6™¼Ö™ÐJ´©I¢g©Žà‰ŽÃტËa£$M;èÆk„°Ç…I—>fÏ›PO uŒú»¦œynLHpÀf@#úD‰!]˜j\ûKõ®_†fJ@XBºlSvkJ”½®DY|9&ÎF;H—MV–S[.²ÉÊFY ÎXÚ·)¸‘ó•o¹k*IÏÊ’Æ©,D¢°U4?(ʱßï_—ÿþwwwWp·«:ʾ *[mq0#€8Œ<Áx$ÌL¬Ç‡aLw,ÃD,Œ‚ Á Lÿû’€LÿxÀaÅèÅç˜ dq=¯hÈñM“#ð3 ˜ ŒÀ ÙÃ)tDpYg|̸ßfne­ ŽP|0 pDOc ¬­l0ð¸œ< *Ñ›Eš… pÜ<Sÿ. d°BÄÆNKŠ·,®϶õR÷*4ýRPžx?7LEmµç.2õÞªý;çŽ÷Ë}Çg­ø×ÚŸaš3K±qp°6‹ÚXªK,NÔ„ ¥¤v±¯,Òo±ÿ»wI ¶HÒ$šäaè˜S 0?S±3q 3ð×7ÑÌ€ëw#p侑ü—Ø÷.•)ãDK±Åζœm?„»ë6šãƒ-4êBðÐèj0 .  &–’s>y¦U‹¨õTÿ¨IÅ0Šm/8Ë©¨#2ÌL9?€F…Ò¶î·AÆKƒ•„(Š´¤*ÿÇœôŸLMgP2G— 4<Hq­±AË­L(à Y]–jí'*­M”UÈ£n ¥È’LãÀpDà ñ1-ClÈŒáYˆ‰§ÿû’H'ÊëÙ _G(µ ”Á=¯qñMã 4À˜ )‚˜9˜§Ngjôõî‡æa$m‹¸ ú×.ýÏÐÓZæ™™LJ/0‚ïÉh"9iP?bÝÈ!›2xØÿü@Q‡FV‚ƒa:„ŠAÇ7‰2‡ÅAðŒ@¨ÔÅ‘¨¡Xm\ˆ‡° ´Sr ^Nމ¶7!gFžx1„\<{ÏΖT4pP ”p†qôÕPÖ•£þëÈ]²6™ 8Kå±(™`Œ ÆŽxy¶‘„…f;ŠB@UìêºÒ`øtLX³K/vÈ>G¹ˆºÅa"+Õeª:^©Z·ëµ–RÍûå¥[FœqÙ‡tÑÉSçZù${Ýÿ* *2*ÆÄ*™<(qA$N ÊÀ”Ê „–«0`nu²f‹-6ÌP%3BÑZ‘¾û¬æG™ó‘ syMýˆ  Æ"Š >¥TjÜ„½ròj±ƒUd Ÿmk­‘+{°¹ÙA{Ì Œ• @Œ ÿû’€“<;Rë¦[ìM„èØ Ãˆ äí=¯i‘L¢Ôc p¦Eé¸Ä¼Cy8ñ…›'”P9‚ãìfîÃáOU^}ûÒ«}wQÿ§Ü*÷*„/4ɰŠ÷Ã8«¶Dk__ZVñj´‹ þS8}K§$ ‚&ä¦Ù^”vü¤ç¡¿-ï1ѵ²ÐJ‘¹™ôI ²ÄeRP05çL÷Ü2!Ç^Db‡&L«B¬¦âQQgÁq³K½T™zÒø¦ ØÚë_}—QÿÞ„&°ûkd`2¥ã6óu“(fÐÂ:¢»&ueÖbÓ·èi±ð¢Áœà€Çùwé8Ï©B½¿aº£"Mf4!=–¼}Ä SÃ/8Q ñTm¤‚:ÂKF7°[h¶`A† oL)t¥>‡MŽÀZôs' ˃¼3aEK¨ÅSÝiàÜ0³¡l»”õì`xa–ªtaÆ¡.ýù5@zÉe‰@éÊvP€³‚£ècF£ƒƒÀ$û'ì !ÀÉÈÝd+ç^“ÕH¦•U×¥hÜÊbë“V…Êòí|]Dö.­41!?Ï@u!‹I8¥cW/V+yrŸwfM‘mB;ûñᇴú†G «$£¦.z`B¦Z@ERê“& Å‹°’”æ¹ kiÿûH€p/Òë¢C|KÄXé Âz T¿M®1 ¹# (þê>÷—3u7­ .ÿm²° ÐÛE/ò ªÆà7¡‚¡FB S)›75Ÿ,LJ™ÝEÕ¢ÏMí4ñôé§ý\i-Ïi„¢b¹5¨Ò¦2´ý2½/C`5ði«„[ªbK:”F‚#'fcZ‹š?Ž È.@pª\$68.uÁZKÜ:’.Jû#ÞÚ”ßþ—%¢&àOɪ@wY#iì´©˜ žŒ€@ôÈ^ÓLd&6H9¬™ù—E˜`‰´ÊìQ,VµE[»wÝþö»¿¥Hrs*+Ú°«®ãÊEÌ,ÏS 0 sX±©’ÓÞl†Á¬ÅhiB6DjˆKbVP&ó rਹyQPÂEÔ$¹ËOZi¡Ä›2 ¦lÌ[#/ÿc1`…„UõD ÏõºÖÀl©á«cî´¡S!nÍN+0l·¬Ñ_À“ñI}€˜&PyÓRê§s(¿Î÷ö¦£Ømpœrö÷ÿû’m„/Ñë¸*I£ˆÖ# T¿Q® q#“#`0œw;\{Z¤8:†Æ÷8†ÇvÜžLX‚Wï—o)‚P ÖM!6 HDáÚQÅ"iu1 úñþ*0¨¹ÀкÆÂ$Œ°ÄزÍVdaUŽ¥-] ¢´¹»Ð¼í‰OMˆ ¿ím­€ó,ȦEÛA óä?0ÄPñ@3UbS8NOYïb:-ª§}Ø=Ñõ³”Þém’øØýÖ+>·s³në­ãw µ&‰4¾²ÌÝe€C€(Z4˜U0ü7Ì ( Å•ŸÈ„NA%"á™2å»å-ˆ{¦XŒÌ¥}½>e‚6Hɰ%´…ªiãAiPWׯB,±  ¥µÚi01‰/‘XÉ_£^ˆŠHXŸ™u™užƒ »f´Ø-b…[é|‹ÄápO¼H^|RÚT â{UMR'@Zð(º©ä§,“O[ÇÛbaba÷¶›RUÉ¡(mÇ­¬×Û‹ÁŸAáÞ½ T8zgœý ‡ål*$°¢Vå&.uæÿû’‘’‰0Ôk‚\\F¦Ø Cd ½O® ±*Ÿã0‹ÈÁ…5Vo 8¢À‹PS›±é*d Ÿí´4éÊwÑ‘…Æ1ÆD!³OÞŸ±l:z¹‚{ ‘¡G[wçlÔŒª«ÚeØiœüI§ÞÑ@Jóf”­‚Û·Ž]t- 1œ&À˜ˆEU]²fÈ00ãŒÈYÑšÄtÓ}¢¼àÒgõ^«Óx¥¯iå§eZ`°\˜®mì:.z¤Ö½É gÜŽfûÀíŽF‘ £\Q×ZÀ„@¦cáÒA1„Äp4IUn1)›™Û¢ï«ýìµß2:\̉•e36ný)Ú·¼Cö ívþ'X ±T-¬Ñÿ©Y Fºª©(DV 0%$DÈÄFÁ䯬Ï–¯>`(ÓMÅŸ&õ„K ª^f¡v,ÏW!Dë'¹µh€ ¿m´± ¾ÑIÑOa$Çw3KJ€„0d®4¶š—p«#%š¨ö’å«A¡Lc;J-Ìaÿû’¶€‚a/TëƒüNÆÙ #` ½E®ŒQ±"“£`Œ÷sÙàõ¹édrSò5­K„N$ç ý]LûB‰öC±ºlM¥­þìj´‡—d²ëi?S3›„L¢ó˜jÕÇ´]€DÃ"†Í(KaÄD©Jãˆ!„ÞL¸¢Êîæ-¾¿«Ý?¶×[!lˆe¦^FF_@(^bÅ‚f˜ž`xVS‚E}ä‹Ë#õò¼ën4ÂŒ+ó,Ì #o§a=\p¥~Ò7…Ù»óÞ0lù5š`¹±0npØ`¨P×ý &ѱ.išöòœÀˆ/~ooTß~fÙy?!â׉Á‡tNØå—zcÅ:H$ ÈÉMsøHÛÈÕ¢©ÝCw»;P¡Y ¬'aD¡wÆ‹ul1|ûõÔ„¿Ýl­ ç"$]Ä~Ö 8&jƒÉÞÂ& $…‚mQT^(ìÕÜØ‹m"Õv¬_t‘Œ":"³EÅÝrÝkÏËL®©íö(t×Éä ·]µ£;·ž>u¬`ÚnI‹Íÿû’Û‚‹/Ôë‚CüI„øùÊ p½K®sqv!bÐa‹À ¬+ú¹p2cEP]e¢zhµ’g [ù³›nì.Î{VˆÏ…c‡"¢6ÎH¹‘ÜÚE¢X– PT&“ÄCiPÓd‚ Ž:5gD©0ö­qzõßõÛUzZ¯úë#h3¥Êá+k쪠P€È °Òp°t)èTŸ-'ùtœ¶Â‰j5 kR UV›jˆ0V,¹–—¸¥±Ó Ý^»zØbçKûzéaB“Ki}\s5CˆÅ ÛKÌ  XñQ}ü(HvH"fÈ¡D¹”âª@1+3,%`{Ë„N BíŠE »ζÅiOFÙ¬40Õ×-ølbªçeHYY‘\Õ|²23`D”p¨m×$¢Ð¡gî=8>KdŸëm­ ñ/7Ñ¥´„Æ ÎFOFÀr¯„QÞ…È%àæ?€åƒ Z×¢â£ç ÜkÞI¾6Þ_ÜÔ|]vµ,=Ó³VPjÔ¼×s©.ð,'Yc 0d­­ž9‡Rÿû’ì“1Skˆ[üXÅxÉ Ã\ ´ÝK®± ±l¤¢Ô Àçòåá*øa³(L*GPõw]ðúB}ò·.÷Ýw !¥òn5RÀQêŒçZ¸ d2`†C/«zÌëú¹bêà¢éÈC|\S`³M!¸. ™Ôwk««7옲¯DnN¶0ѦânµTGŠ0ÌL…HÌ35ÒÉ™fŒ!É4xÁpüˆ 0Ñræ<ê’oÉ~æÕh¿ël ÎXs‚¹ŸU*æDÊfâ ¸!¨Tz¸š»‹Ä•U»P*“ª¢#–U¤Úu,o6–µÕÅGtO)•Ø‚>Ó¥²µJ¨p~{nM¸–8¹ «b%c^ÿû’î³/Sk¦Cü]¦Èµ ÃxL€ÕM®1 ñbž¢Ôc à'­ghëå@4‰4Ô›ÞÙ2ÉKå˜eAƲ?^oÇէ§áoO .ŸÄ)ÔrþåÓ¶iÙ†÷–E=ÚåϺ߇6É¿¤úÐwÔÈR±ú¹m°reo½äp õòÎéŸAËsûã ]ÿmc¾ 6ÜÑ*˜i>œ:ƒ‹‰¨CWƒ¨ß)²›¹»µ—“ØEÎ'¿‰Øî|"Øp.“õ®Û ýÚ¾G}ÉàKí¬óŸ3v ,pˆ6'`ò|!ViZãöÿÒ’â`W;dîÄ(ð(„XôFfÌnì#³â#„ÌÂ*3Øk\ô!sTpeQŸ3%Âp­Áß,! Pà±D­/xT`î…M¯tÚîwéý*:ë#’ç¡ ™šnRŸ*"¡¾küôgŒãNbra¦º`  :XEej\@ z»*Ñ£¢£z%+.Ðí`’e1ǧȳÕKÎÙ’53ŸFîZèæ)Ž™ÛM°£Dq"dÜ:(`€M- CÆcpx¦LI$%’–Z^Ž@àáW‰BåÏŸ‹Ë…Þ‚;…jCdšw?¤î²k!" ˜€l‰¸P|혉ñ¯\Q‰ñƒQŠ¡€È*…€p„U‘£À9|åþY‡¬7# æÎ~bÒ¾î:½ÙQæ+ÔRqÐÀ4GV˜–vZ—pš‚ ¤‹±&ì±gþ° ²†s †y ¬Nbq€Î†$b+„$G*æ~ ÊìZXäÀÿ1jd)WYˆVÀD(P2$ÈšA#åOˆ@äã¶ÃÂgXØg^n´IÜ‹‘r€UÚ‹UrËm¢ä³¥ŠƒÆ¦ìÆ A~eÃ"æÁÁ¦`l)F``„æà \UŒäƱ‰8±liÌÁˆ#ÿû’鈬/ËëAP`Gè¡ Ã^ ¸Á-­yAW#`0gD9 2õg̢ޥׯ7í_ûw¶Î훢ÿüF_"á„Ê °UÊÅlKå[[ÿ-ý Õ˜@[sªÂÉ`½ÔbIãdÔÓ¨-ïg)8'ˆ,1îU0CáÑc4¤¸|‰òâÎ(#Xdx½j]Ì´™¤QX¤S|¤o#EúÐöýtµ⇂° ñ…¡˜ô‘€šy‚À”©…²ù’Ù¼8Ð"£@-*“LuïŠCzàþVÕâSUURªS¸ÖF‰*ú‡¸›¨«%†o] d·Ýõè ÃEÐd¡Q#ÚS0’­ä¿å¤  ©{[jU™b3¡Œ(BÇ¢˜0fç­ùµzÉBT#s Ê ˆòd8¼BØ—'z§eˉMŠšûÞ„ˆË’‹­®µ%P-,ã-$Nßtêú•@V8Ûd€ÓËX±ÐpÊåŒÁ„ÉÍ1BÔÁÄHÌ ÔÉîÝ#àáCy¾0;ÿû’Ûˆ{/Mk>1TOƒ8êf<½/­ýAN¢Ô1pÔ¦']¹c{ Çg<þXžýërûÖnÚvÖ0Ö)‰Rä³8Ê@:a‘½.JêFšËîžÝ«¶Éýûû_ÿ°pnNŒz5žbyÖW=ÓÂÒš»^:j®†±›ðÝò ĀЗ0(*ò v`²Dq@ð¡Àë Š–x|è@Á§÷Z|Y1>½,ÅÒï·ý@é$n0)  Æ8)§8v-˜`´»H<…`¿a[˜`¼˜ 4@˜ €H¦».«.³Ö1D„OB3G*Ç3±Žk•iº(ÙêÖ>̪[3Õ¬ë`4‘oa' o qã–XŠÿú% "pzò‰H2 ÆX" ßUãèÙf\½+­|¥ADc1À³…N½ÒiðìdôbÔÞéO÷JV›Crñu ?S3l6yW†Ê%mšê/TpFÕ‰@äÅÞ† Ÿ&Ì«®_õòàP Ê4é¸:©©3Êc³0œ rãL“ÛT&ˆDuÿ9'cH0>žJ ¸|,1R 5Š!FÚþÔ?b)]íæõ¬€Ûi8±Ö"Ì‚=ìÁh ŽÒ Ò¨0ŒxÀì À=48„(§8Pü|,_Éè°tÌ]ކ¦T¤ŽR÷Izz‹¥Ö{ešPpäD_ÕzêBË4nqEH. ´Ïb‡-ƒú¾PRö<=ŒðÒæ el(+’kdCÕÕŒßè¢hh 3L[F%hqé›·”™í>+RÈüÚ^ÛéP‹­·X©Š0ž·ª…^¤&d¿íu± ì ØXG„0ùdÕ5óŸŒ $ ƒŠi—¹sØ€èGv5 ƒ }K”f°Ø6îf±¨ôóÿû’Ï€“+1QkÛA¼He(Øc @½;¬y1#P0@.=\dxöì„p˜ÅHž ·HŸ-¤©»x“"šÚe%Xl¿¿~>¯úÀVš¦Q#I½‚™a„X[!L;¸â’ÄgRP•§¾UƒF0F!’Dȳ¥Ê-„¤€c(Ó H³[R™ÊبjíGw¦ºáë äš}hÐ1ˆÊf 5¦ ÜF˜$F ðš¦ô5-f²•¦,?Í8'fÖ>?&œ¬†P†x¦xFÆð&f8rû%ôÒÕŠ““ƒá ‡‚Ãwɤ!8Ô°¡Qñü6!Ë–œ–ž“öyhmÂÌ{mëæåŒŒ ûNݯúÏqÂ)¯¹Œ‰ûÐloªoÃŽ±—ÝÜ{ù÷?é¯eWüó:›¹¿¿ø´j#V§ˆù¤” Ê0ªþßÿµ@Å Ø\‡UbQ€°Q“8òY0»£÷ˆ0*Õ,tLE‚œÇ* E‚¼ÂÓ€À¬ŒXÁ˜Ç@©›»$ ùÿû’ß*;Síq I$8ù¡ m9õ€‰&f= ©ILœ4¦x pðpI&%¼ñZRø(Òj;``4¨š.çw…bŒµ^>@b©C´È™°ç2ôÔPU—¿®»’å?-ã¢òo¿ÿÿ 9ñI¹mùcÕYÒ¡w·ÿÿÿÿýËüÛ—ÐK$²2¼Örëó¿ÿÿÿÿÿ†9ï¸wççŽt Gÿõ I1 "ÄÉ4Wÿøÿé :É#i³LZ¡a0rcâm%ÂxÉtc1ªažaÐ2¿óýOzÆOTº©Í,6cy2ÿ›:f=æRÕ™º"ÚY¦Ô2ó4Ÿ)i 2 ¸DºÁhÅ´H{ŠÞ4‹Ç§ÿ@9uÃ3:ÏV“µÖ $cHðÅ®PÓ!•COóüÿ?Àq¨âD‰›PH¯È(O ½“Åt¡"ú+Ïý¯— µ›ñY&íV†ÿñ]ÿ¦Ð»þÛXÚóŠÉ“UK€ÀÐÐ#“€¢ñjÆg0Õ+ýɤvÕϵWÿû’tƒ5/Pïu Tá¹ÇíKü½O®Oñ:ã`1€”ùmjÖ:Kõ3f?R²L˶»~„;GU²½lÖ LB[J³à‰Ä±+[Ößý ȃ]½‡;¸fLŰ‘ÊƒÝ‡ˆÎUa§dÐó úcŠŒÑ-żïbhZSxqúJ`Í‘ \`Jò/qr1³š5ÓsÚO¨¥Mv´ì×2X¶¶FfÊð/¶B }â¤èH5¼ÞȬ¨­ÄîcØ',ÿÅhõ•íé'¶¢¯½Pú¸ë¥a·S\HH=¦.êÕg§YL«•íWÓ#¿);#ôåoXÑTÌ«ÎÿÿçßÿÆÛD2”P &MÃHD¸*b…mîˆvB Á\€l24‘´ƒ'ñh±"À"P˜MbÍSÔÄ©îO;¿äz»€õÖÇ"0»ßÆv˜€ ÁàÐлäˆÂÂÕ™݉]HnQN™x}&EM*¥;Qv¨CÔZEAªŽ©¾*j:ænh„‘sÙÿû’~ƒHRT{ˆ|Gã8èCr ̽E®å±*”#d3¸÷*‘)¦BG ,˜ÕŒ†íS†)k{¿åÀˆ@74<`Älž2ý Äþ¶¤¦'˜Pê#v®¹Ç9õ¡ÜøÖwNˆ H|YBÈ3@qqQ &A¥Ÿ–j\þ–N›¥iñoÐh ¿ë¬­ ×Y3Ê¿ U¬`€9­pg˜0LU†vcQšmË¢²îEiNô!r“_zn¼€2‰Úi·sOsªMdʼLbæ\+]¬‘Ô©1Y%é^¢¿ži«ÆM®I‹†Ø.5ÿÔ(2¡T®C½ÞcüV̪#ã´¿GlÂÈfáG ¹!¢éhÂ*XV;^û¯³—OC’Y›s5?xrgäsÏ¿Ý9ᙄ#˜Ï:˜¥Ê¹.ÿ®®6ƒIQè-ž7t:†&Ýæ hF!j¢ydM¬*qôŽår ¬éŠ20r%pA€O‰Gëé.¿éÐ}—6nȪ‚çÔ§°NÖ„¢éCFZœ³ýXºuÿû’Œ?;Rë†DLMéhÅÃ^ L½K®Œñ± ã䌀 }°,ÖG\X„AA(PÀ´pÊ©C€Aà22–œê†sW1,°éƒá“ÍJ«…Nò"”,cªl@°ð^.+M•ûÝÚËþïUd›í¬¡+aÛí©€B&x¿œTR`‘˜ ×{ù+ŒSÒ¯é©!¿DÑ; ò7l’×Tˆ(:UsÉ­ÖÚêsÌÎ`̶w],,&ˆï•´îÉÚB!„uÜF.*Qßë–ª@R•°ÎÔ¬¢Z‡\œXQ`Ö6!¹“‹EÒg€lh h\ËÁ¡0:°19ˆð›fJfÅÄKRO¨0ÿ_ªÏüœ¢Ú§÷ZãD2åêЕk̯L6¶(®0IltBЯйêyî"¹Eõxò'··Æ4Ü‚‡QI^Ñ>ŠLâÛÍVþì•¿_^Ïâü³sÖú°M¬S-¬»ßw1|víT3þ9ÿÿÌÿÐ08ç„´c;d, äŽ&LYvQ,ïâã÷\}tÅ]X{$ÿû’›ƒ=Së‹+ÜJCHé C` õI®= ñ*’ã`3 àžÍv9®QÀ Ö<0*`©å¶2Q¦ÌÃ÷Òd ½ tg\äÙz¾…DŸ]£ =0cGl¾U ºŒS ¡qâµTã¾vÙ­M˜»—~–^Ag«eºJÒR’rƒ†à ƒfù¨#¿Æ)Å̽µ…yˆº€‘Rƒ&H˜¶f[¸ú¸†¹dYXhPàG#­¥*êm$œaÂí’CÑZBˆþ&Z@nXõÖÈ(R–Í©kÓÑ…Þézl#›ü ð¨hiÐá’¦…ÃB R‚Õ;|” (j\¥‹µPYdM‹²¾çÿû’« ERë¯:üP'(Ø Ã‚ ÃE®å±"‹ãd3  ·§§ÿJd›]+ˆËWôÙÞÕœa ¶êâ| ‚$…ŒWWkǯWrìe®Ï_¨@û˽—?µóó²§ÄÚ_Çs{@‘4á#÷jÌTƒa{u« ÿÜ lŠ ¶® …𣔢{†€Àꪻ8åÉxóÆW'"~%BŠÁIš>OsÇ $) ‡’ÈQuׯC©§B=×Z Ú[DÕ»>-£–ÀìÃ=4ÈL¸À, ¶ŠÏNßà€KPêA³U·á<½Jô’æ°ˆæb>'˜™á+žé.®Ú*ãߥ`ˆÉ5"”"íþѪúD¶ëÊù „S‚‡7ÅbFª¯ÁÌU7 õzhïÍ( èž".04$éÀ1'Š1SéÅ®c={,¶[ÞÎÿ½tUdŸÝ­¬6Ö#nö¹ ó.]Ͷ%0(”²® ÿP?d~ðPúÞßyr¢x ˜ìÞYª”¢õ_uÿû’¼€·/RkŒBìFÄÈé #` œ½I®á±&£äŒ{öµ÷¬ÄÆ›õ(𢃩Ы‹•"¯éðR¬=£ÍJR3© š"!>(Å ¶ ̘Ó']Mò&J%å#»Œã•sŽW,¹E‰Æ4Ò·ÜY-=Zn#b,!^œ›Îltx/Y¤‘ 2­ƒÚƒgO0dh”N1˜&8h&paªRR0±êê)I§Ìuï'PùŸ¥ÞÇ‹æ+‹…ÿùíP~Ï èm-ÞÜ0Ý-$W¾Þ›UR*„\Qu//,™Ê´U„þ[$ZŒÓÖ$ÄÈyÛˆU¨7+ !h"­ZÒü“¾år˜—ɰÊuP×'@O[Itoޱ…’>Y“mÚWBœ–êÂvõ© Þ1G‹µ•´%ó$|_e ,Ÿ  ‹Ú Ó9z¿RÐøÕöÚ¬¬vøËgÛ¶ÜÈkkÚ\wz±`Ž*[^="úÛJ½ô±éæ×jZwÀ„;EVÝÌWÙÌ~mÜǤ_ÛNm–}œèÿû’Ý‚ /ÔkBœL¦¸Ö #° ìóG®­ ±C#`3 ˜ DÁL9"ü5P0yÉG“Jä‘frœºqO×MZºd¶ÏpÛÒp徇5a±Ð¬³;]›JÊ©k…9˜t]`%;‚2J6:ªÀ¥=§‰´êÄYÇ êQú÷(íaϵ®² TÞëDã+e ~¦ÐÁèÌ8ÚaÂ!pÁPQ Å dW²?CÙ/þñ‡ÎUy©ÊˆýÛ¶uD{Á|ÉÔÄbï2˜™ˆÝüºUϰª¸tÒ¬©©›Æg€¦Î^åÅF2{ùÿÿLÇ0$î좽"]DÅAÅæ‘ ´( ®(3Œ‚£¢PdZ„BÖÚ!•30æ’‘,&%rò¯ÄD $XH€6‚ÂÀ¨DX¡0¢¡µ“j%“– Úš®Š¢íµˆ ¿]l­ ÓU©ìhrÎ44z<]`Á9”¸QgÖUvŽCk”‘Îk­±ˆ^lhúÔ–·¯g–ÕwÌuÌû)´øyÎÛZ•3/c$‹½/rµÓµMxWÿû’ó€ÓEDÓ{¬Clb¥Ã^LÀ½G®½k±wâÄ0Œ€KK(Ôõ}} ¹Á•eãóNÐÚóôHö9úÌ–Ô Å‘Àr6eÆÂ¾@í€ÔÌ$•Ç Œ ,8äŽ< êKޓħB†•6e,ONô‚©§˜e/ßÝwXqÖÛd²Ì“´”l. †‚.cæhÒ`NÇË!Ö"\k:±k"î[Úµ5™SøD’x¹É>ø°øè¨ŸevÎÙýÜu ’ ³íú{}·÷XçÂTÒEêþƒÁÁK´Ð<âÒÍå-% øV™\ò©6&fRUAÆ#­bÜ^0æ¯È•÷­IZ¹¦`Å‘IX‡ðÁb*O4r#?(ûËçÏ¡âdUhÃ;WÕîêŽkŸîîûÿÿßÿd ŸÝ­­eۀ᧠2fÙ¸F& €€,?<|°~±côœë¸ïÛ"®y™nVÿóÖ—[ê ©l‹âvúÚfÆOUP‰è…¡±Ê»'`)êV×ëÔsÿû’ë“ ESë‹|XGHµÃ. œ¿5¯ih‘w"Ô3 ùŸ×L>¦¨\€“ˆ^²vQg!’Ìø…»êÃÙ²º|[¹|b¨ÎÁŠžo"‘ 0¨Äጚ™û¸ø'°2)ÊôÙXŒH8A±Bád( ‡ƒED PÉa]À³ÂΡ݊PºÛͶ½AÍ®‘Ä€iÊÐó³Fý&ƒcA‹cŽÀ3GQZÎ J«€h ˆc½1}í„\E®/¤Ü^jŸ¦^kÖögØõ¥èk  ›UM˜§º/ßUæ½õfþ.ª\Fª…A)A ß‚»%©†˜%gÞ{@Åf•Ð$fß6f¨—€²C9æŒÕÆö7¢%(WÜŸÚA‘%0U¾ .R q«ù?%mAnŠ+D›],í:0S=nÈz bÈŒí@¹ H KG§Îúsªû»Þ¹H¥Š E›ç›bçO÷eñrô­­ø÷¼R¾nEÆ=:EQØIRtwÍÏÝLë^U•ÑSÿÿû’ëˆ=SëŒBü^¦xµÃ\ ÍG®¬ï1Q#d °ÏUEôNŽŽí¤iéÉn¤˜è*õÉ÷”Í•*·5óÉóš$ÌJmÌP,Äõ†7ªîŒ)J¦[»{™ŒÓ&Ø}ìšîOHÊ¢Lk`‹—`tQÁ÷HjJÿ{WI¶I #Kp¼·`.`@ † éàdhÁwÀÚôçxr^nÏ?PuÚMV^ñqΘ‡FÇ>B ÕœûŸ-¾j99KÔ´ýÁ¹oN³ñn¯¸£LVÆyǪßîÿò­‚ò2†L4šãØ–èS¤l‰£…6*£Õ»©W2‚ô*F)­†S@!HزƤáö=Gcí(–èC_:¢0C–åè1ïÓ™ûò•Å/7ÿ×ÿ÷oùDšÝk‰sÞFNÍ x44$_8ø 0hv …‰éDk@3Whçoñ}•?(= ðÅdÌÜtù©gû”É}4ÝGT{—˜o]Æù{ Æa´únØïe‡ë‰òºÛjÝ2Ú` ÿûñ“)<Òk¬BÜa‰x cÐ X½A¯eh±cš"Ô3 ùíÒÄ×ÒÈ`³ibŽv¯*k=”v,ض®Î!°LMb1eÃPhFÁ©¯¨™e‰ô¸P” £6ÐNä«ÓM–lTT†%R‚šQpûÇ—@,àøx˜UD›"‡ -é2…îbÛíH3i¤ŽË¥·fêŽÀÀÌÇDÐd0 ZtV\–KÂ{)Ò&¿Ö“tlwÐ E£UGçÕ “=Ñ ˜"Œ˜qçl§¬*Ç[m/DïÝwÍì¿%¿ÿEìÎÒŽí’¤DÄa{ ”‡H“60`(¤~XVÊ` uÉ:PHY˜'Bq0¼åWpŒ,?37Dæ,©§šìþt‚m2&3S¥$ìáõz;ö* VËh‘%i¶<ÀŒAÄÃÉF̂´ÀôÌ l8| >êCñƒGÿqq´ìW"0Ât›”*IÖÚ`†s–žè–t»¯ÞáFXšª™¤A`³M™ ä©õÿû’î ³7EQë«|`Lj¸#€ ¡I®˜íqZ ¢ÀaÀ­µ.­¿Vã–C³š¶|0~›™aÌj…˜¤ ¬yùIŸ+¼sˆ”bá*h£Y™°÷ô‰xª9!刴EGQ/ÕFZwu#¨U¾Fš=ȆÈP¹@| ƒŽD°pT%#šÅQ®~ޝÖÈ>šÖÒ!¶Rºôd舉B§ ‚æ Àµ2–Òˆ•’° ÙßRšµ­r>ùÄ$ ]¬ÕKÏG=׌Ž×{¢´u½-F¹Ó>ÕYÒ÷)låÎÅÿ—Dá½+.¢j¯ëª£áFV•ÚŠqzBr”P66J1äÌ"ì„‘y¢¦¨HFê4G¯Y Kéœ+ b¨F¢œ©”#Cc–ß=£¢¢5£Ž„÷.D2Ô´ ä§•Ôßê£í rþ;ï9ÚfûãÄG¤³I ¬Ù˜–t›ºÞYº‹„Ͳw$ÂÒј°-w»‰Û™çÿ‹øo2 ]… A«–8 ’æØ[yDå]]Ä“µœÈÝ‚fR„~@òˆ ˆ@aI¼Ü¨xÕNx!0áPaaÑr#£Ðà惆"¥\@XóÌ(á*$šm»Gþõ Q¹$ ÐQ­5 P{ža0Æs#$nø†Œ`f`-… nAô©1ü…]”µj2ÚÚŠX|ó›fÇ¥‹¬uà乬6:n‰ÿû’슓EPëÌClYȵ È ŒõE¯qñJc3næ½Ì©Ecvv>™éºÞ~óÛTDÍÍTó·e:ýïô«ÙüwüYÚ¯«å@8#ð|E—eí2Žl/WÓÁnÌjÐÄ-„ªF£´%†¢ƒ׌×*õ1=­èY'é“9<Èe°>JbH"C 8åOšÄ¢ê$…P[ÔÛ}q€W}­‘2’\äÑ€NŠ{ShSDƒ@ˆ!I”ËBÍ¥åkí}kåä›Ôío!I5g²f5í5¨È–5ÌF1ÙZ§:¡¬¬TÁÚŠb;Í5„Ù–ôMþš-"«ÙnnvÔ'#ÿÞ1a¢ñÊ“êêbé°ÄÀÏ]ºP¤pt-¨ ñ{™äJåfþ-N¥o¨eŸa™2óÜX HQÕŒRÐ`ž&’PÇŠ#&C¦¥]û?¹ vÊãd¯€Ð 0ƒP¡1 oó#ï0Q 3€›s!pˆ¼±Ø•áÛ·ênÎÊµŠ›SÜ÷!å‹yî§ZÜSß®¿ÓXÿû’æ“ÊEMk>Y4Q&HÅ ÃX 1K®½K±#˜#``Žœv3ï·Ûõ(P®®ž±Œù« º{ '¬(X«÷È¢CÁEɆC!4c…Ï„L•"*Hâ-B#Œé‚6¥ÄX:”é\ƒÿºú™¦óY$9ȈÓÔ±]†&˜çH†&‘æ©Lª/t„†ÁaÛ}ݺüº^{»È’av"•m•n¨±V}}{NëF‚n­J¸`V"ü¯(ü¦Eˆ€1*:ä°‘”?Lwr·úùugb&:gPKúè”'l\X0Fg X¶”ëJøÓLƒB¨Uù¡§»‡!Ñó‚bÜÛ€¨qÑI&¡€{œ»¶JlôVh ¿ís Î—+„­¯²ªB &ÃIÂÁФ ¡Pr™J\¡r®{· [!úÕ¯pÛ&=ÈdâåóØÌ-û€=U¾Y”Òå¯þÿû’怓ÈDÏkÌ-ÌUEHÆ b~ H½E®± ±%—c`0€¹òcˆfX?;ce¸çÒil¨žEù\™šÐៜÍàóÑÈ·,†U!Q‘¬,VT^AîÇPëÑ„Y”ªŸ9«3ýÇÅ¿«•Jx'rz$ŒÑ`{ÞiÌairgZã¸;… Mm©USD´lŒ§çpðŒÊ‰Hgë!Õ3…ËaŸ F X³bb¢6µâÌ.}ëm¨Žã½ÿ¡ 5¢Bb¢s²Ê™IsŒ ÌÙÞÍÞ‚‘€Á08 GK1’¢ŠÜ­¯ÿÎþµ¿Ó. 1¾Ì±4õ–Þ÷œ}8I™VÅjRÌÝÎc´$)Vz)/YÀJ ëkék"ɼÖƒ¥?ê˜]é%mNLª z­- ›#”˜A½“»Jr! sàP‰É¥E\eo#ió"‡—ÃN¥*½ÇÆŒ©s/Ì ínþ1>ÿrÕVM%’! !0´ÀŒÌ A Âl0Ì`ÄÄÆE}c™KVjwhkÙþÚ>[ž ±©sØ’Au/`há× ûÏHÇ<ø"ñ>ëÓ>ENa‹Ϩ%”èS ¤&ì3˜GÃÀƒ xó¥‚c0u7“²Dî£8­=C|k?“kpÉ3 Ìc03ô  †0Ƹ &GÐQ¬ºK”Œ ç£ÅD¸€êY hhJ‰èY(ñò êx©ÁàÀ¢‹’é®M:XgPúêB™Y¡£›¬¥B“Ì—Lúh‘“g<æè—”›©k:ËÔš–ƆN´Ö´™¹ªÐ©‘e t–tœÕΦƒTµ˜˜Y•5g?²l¦RÓ²’4ZÒ@©Ùžµ­i3ÿÿÿ$_VÄw8éú·E°0µ¡¨=²·q:ë1« ÔUhôBÿ;&.6ù%— 0³ƒ¯ ÁuçÛu½_ý`-H€ Ê6£Ncb8ã‰pŽŠµDU»Cû©Ü}ƒˆeA‡Ã0lq1â‰-&4óÃì0‘íža' ‹Pu0ñ]ŒJ+j;Úå5tÒY¦ÓYD*UZ󒉯ÿû’c€ƒ31RëŒZ¼NãøÙcJ èóG®°Oñ c¤Œ æh׿æ AH€Rb/ó».Åq‹ÝÖúS¥ˆs('βÜ¡¢ÚV¶÷NR?ÚuþݹßH,óÿwBSS?ÞDè@+¡MeOklb©çó}¢IÏþñZ€ º#öአ´sRweC£‚Hq6Xè|›ƒ#W“’01 ÃÐM ´N(5i[oy1b ÁÈ@4Ezvº· 5ß¿èd›]+i ¼Pñ¹§¢ÁŠÑ,Ã/DÈ1¼Á0tx-(Jå—iV˜‰Æ¹=f×ÕµülŒ¹Ò =š.gúÝ%?oýj0tä)·g{²BܵêTÚ¡Ûk±úW&–Hué¥ú.*Іeý•NœTŒ°­'2"^) FŠ™‰á½5þ¢îÝ‹]õÓ wKD?1gå“ÿû’¤€Æ1Óë¹YœEƒøè  „½M®$ë±"ã¤`Ž ô˜Ӌˆê0ˆÁ2$˜*W*2d¶ÎŸ;ÿ}–)–rvéF|÷©o¯=]@²S;¯µïcirßC;q¡â‘nÎb碄¦™€t<\ªÏŠc~Å^„äí;•”F”M 3(T—°½W(FÄt©AÏ~;Òírw‡:©Ÿ£ó–Ÿ:¢u­éxÇ\^jÓméW †õ4ßîÖV€}›+оà†@ úÅIÐky½‘Y lŒåõß­0èx»¥ Òš™UÓ ´zŸ?ÇÇwýOÿ2!ªöˆœJÄ´êð;-§‘–þXÕ€Ó`Ne¾¶ö‡ifž>#ZÉõÛÜï-rÔEé6@@hwD°¡0óG®@^tQñ«(…þkEý>ç²Ír*d ›Ý$‰þ&;°ë°»æFcÃFÛÆ †ƒ œ kÖ/3Pý&Œ4üÚꠛ§ÕñÊÇ›N€vÚkžÍGØ©£›—P„^r*œmM\ í£#Ùÿû’Æ /Pë¬;\J&ØØÃ. 4ÇQ®% ±£¤2™À_KÕ•·ý¹tÿË€`ûúFYwt‚>YÆöG3!G¶G Ù§{˜7cÕãnÝÑR…®]÷éÿ!UQŽS†èµ·nï-«ê&°Eè4"G3õAVËr3oÔXL œU¦î½¨]†V=ÃÙVY¢Nÿv²6ƒºë@­óªšÀ ¡d ²è `8 ]© Î_çfU4¶×dÐcK`š.µ-0Û5Q¢Óvµ• T¿)‘Ï%Öü>ê‹6Oë<Ë„]¦nˆRà ÿ°j@žÌ¥UŽ ‡%p„ )¹•1bEŒÁòtbÜ\VÜz,zmܦT¡3LŸCŒ sÍó€£ç‘­ÜëÝØêÕ¾¥Þ£¹]~muD›Ýk ú¶'­„3ò@”=0'[0ØYÂÁà",ªQ¸p‡iÈ}ê.Ds1O$Ý—Æ•cÕ½VÎŒO\ÕNw8úÚæ]Z‚­Ï±ê¨”d C uVVYÇYÝ'g§ÿмŠÉhÿû’ë!ERk¬:ì^¨¸µÜ  óO®4Q12’#¤0@ JàJH"I˘.¢ùåI48¦>Ò=p7LQIÍ(â_SFoSEŒ”˜í&@&E´!³¶&—*Õƒêážg¹ GÎR°[²¶’>Uî™qN‚É1³wÒ~I½ŒÉ­@Ñ^6ÚÙ•®Çýœ5´¼ €šGÙÙ‰FPK*wb66Í ÖÙ~Ýíz° ææiÌÙ/¨}Q]j£ÕnRlög ðêº%YÓ##ek=Ž^³Ö“Šžú´»2(Ê•ÿ¥nÔ#930Y€”Ú¨-V8ƒW¬afØ^!¡«Ãˆt…aOÓ 1GÞç€ÀÀ¸ÃM.±¦¯,c1±®\ó©³b\P}¬q31Uò!×B]TKJ .Yƒ:ª‰ž{¢ÿ¿*ºúú¾~ÿû’ó€ƒ\DÒk¬:üdI¥aæ !Uí¬­±Ic¤4Ž Ûÿpf¸A 0e;%dsŒ ïƒ!B~ä`—;vW0£º™$£êQàÄžð9«̘P†Ž}ˆ±ÉÒÂheÇ陵Ã2И !]“H•Ì`oE¥¬­ô±v/±(Sk¬ f{$zØA(J#Mèê3  ¬hf°4ì !¶=•7u5¬|Ù¹’l±«”µÇ•rºP$?Wnâ™Q7sº“Ú]Ÿ§Üýù}Hæ·Ò¥¶kËÒþ‚í)‘¦¢à± ‚¥%©``„˜ ÏÌ@áÒš"K S‡‘‰ÃÑg¡,5Ã^’$ŠP”ºÙ–ôZ*š—w°Qè±°Ðd‘ÆBÖ ^&ŠŒmÇÒðì襉‰GýšXŽÕÕ@›Ými(kq‡mr¬Àà Ë™ Ùa0ÁÁXÀÐI:áÊ|#t”æk/9Óž¸å¨èìC;£oW9ö8½lÞ‡Nå§s_ß{f{¹È&.Ь0<dO<ÕV³-ÎÛ·«ÿ[Âiÿû’ð€³=DÓûŒBÜ\È(µ# IG®¬Oùf"ÔŒàâêZÀd€s+apÔ¾âÖ¬UÃl —ëçÂd²H)QÛañRdQÏ=²$‰ŸÖîü_Ö½†û™^St÷ÓgÚïTõŒ®4æ4‡J9«D~ÔxœS:ƒw=]Ô¶~ýÊŽwÿ[îZd Ÿ]lŒ€â³i3ç _À`©¯e"ôSŠ¥\Į̂%Bò˜å Û®šëuþ±*¯Õ¬¿yŽ­h_^·mH÷I\Rc)a.h$Hã••T‹ØÁt6~@r oþà —2)Eï1›ôí²RÃè!3š˜&mÂ-)|S5s7]ð`&¸ÚÝ" ¡É¤iŒ>±2D%$³È-èjÕ_ôõÀó^õ@VË#h€­©,ÙTpª%€YƒÛ6˜‘Ù€¨À@  s%…¦Î0ͧ߷Ö*E_—Á•O–«Žyr'yhò E@ßH³Ò¤]Xpö£ÌyÙ:J׃À2Á±zúOÚêBÕRF¤Ûã‚Jÿê=ÿû’ï*=Rk¬ü^ÆØ¸$&€K½K®1 ±,£ð4ȈZ{s‰±¯‘ikŸ´T¾ FNk¾éÔѤÏF®(惚²‘&e{-I õr­"EšŒ9wöë+mNqg2»tyL›ã·TQ¨rû‘5}H‚߸8™d-7´úë;-¨6üyîó--ÜM íu’"D­”5´¼S0@`˜nfeÖmøÂaÆ`.†‚9ãæ Ö,¿Jº^γ~9è<4A¶SvËWc4õD(ºf*ó7˜ê|ÆPÇfeJ0ÆPøó—µ—m)[¢-?ÿ—‘ÿçO‚ÜÛÜ;íåÆjpž'xൕ¦úJ‡5‡:-«‡¬:LÞT;pþdï ˆí«¼€ÇEq¡œ*¯UµTVFKiýã}-­ý¯Oûÿÿÿ÷ÿÿ¥@{K$iã4;ØÇÈ€S @CU›BvüÂ2l€A€ •ö”„ÅX"TìŸÄë>©÷»§Äǹ.Æ ý«ÒØk–¥íjážkr]h¬Zvúv«ëÙ¼­µ«ï÷QèæpÃvÖæÍZ­§÷ßóí”ÙÔ&‡C¶øHƒöœm™|àé·Uyæ"#ÑPçU:³?¯ò2?ýÀ̈Ñå–MEZsòòVÓŒEFy¬IJ(àì°Ä@¡T œ\0„«âÂTqÌáÌtùZ™ÐêJIš=¸•€ÁQ‚À˜â;PË]ZäV£Æ[¾D ©š"•ªD›Ml\ë‘Ñà ˜,#ÃÀÌ:T7ô7_a—»ø{&í•N:™¹å+IÒ£sbaªõo¶°–G:õKŽÆözŽmµ«Øÿû’눃l<Ðë¬ClP$8ì #d ¹C¯0ïñg#$aŽÀ.4Ösé´ÓðÅÑ`žÜë¶§N‰e¯×H2µWócu‹(ôFÂ?ÙÏ€Hà Šî4(ÂEÛU!VbdEø0@@`"ÀœCH"aB´hŒT›Õ›äíy–.1à* ¸Äš^B Ü(ò®bîS5¥¬ÃTïú”ÚY$D‡å³½Œ] #@‚ijZD !…Cbö€¢IÐâu 2ËÜ’±®ÛiÛQ£±çus;zw:¢‹ç™™o­³QHR(¢´®K!!–Å¢´7Ÿñy¨8·QñÛêÏÞ¯ôÿÛÎP–‹Û­¥Ã 1QT[4‹@ý•œàš«aCB§·£4˜òêL¯G’4^½®Þ¤úµ®ÔvkÂ%@jQc¡ ›†­…c$…C_8»ÛjÓÿõUO"Ñ‚QP†Di€a€¤‰…ö¹™Œ¨i€ÊaümÙ£‰Ð@rH³iB.ÞÝÝÔ1ì¡b֚Ŧ¤ófš6£p öqLQðþÛÿû’爓©<Ñk¸Z,NĨ٠# ˆóE®±k±<£3 x_óß2c/c{Ýh80öêgïï}[zÙÛýOÿïÿõ¦lÿŸþàxbè¬Øß 4kD ÂÒ0æÌ|Ká„ql)ê—¹‡¦¬gK ©# îp¡ŒÄÛ†ªÁL @ÃÄ z]èpÑês¬“œn80n4*»˜…w6gÍÆìèVÅd »]l ë.´oÕa˜Ü‰ÀœÂf1A•-ÚRаã[Í-˜»k;y >)Y”¹ƒó!/î]FªWÿû’ꀓäDÊëûZ WfhÈ "ð ”õA¯e±8#`0Œ€’ϱÐ|¤­Í^OÀws£Ý¯ ¢é1Ûý­ÌÝÜÔ"͸n<¦(ºùPV ›ñ›´CŠÐCâcrp5°p‚Þ.;>WhÞfhûË:ükH›àµ;U¡‘@n–l\qñ’ 0×rü¢{û™ÐÚÙ[A­2ì¶^¥„F"L†W†€X0ºBY¢ª¢í}Š-›­ Â4YõH±d*™r×;M&¸˜"ЧÌûYß.oÛª+qUU¥ÃÒlÃØã¡ò=|{¦j>"&¶ÔW?Ç=uÊ’6ÏVÀ ŒY—LùL­©µ±4DÉ©¢e¤ÍeÅXZ7S=CÄ™Xyh*=` ,²cEƒÂˆ[Úe¥ÚEGœ©}UܸËVïôR VËm‘¡)Z¶¼† ^`|Æ2n´f ! A¬`¦À`CDFÞ~â’ó6/4êÓœ[)üB4z¿îB½ìõKžXʺΰüUµ/Ö¥+çïYkÿû’â|ERkŒClJf¸Ø Cð IM®½i±##¤3 (ñuD³Ü¡Äk©§GÜ*Žk¢³*¢æµ©Ž9Òº'ÿ-#ÿÜ ˆCaQ¢Fî™ÆiÁŸ/kêt½?*ÌYQ/ª«æ¦Ø±ΘÇNÌjLYÁ“¡Ei”k„ è,'H¡q@Þ‚àÂíH©-ÍAÌ’u[¤˜øQ:ïlà ÚëHJ“m¢¿^ƒ@ðˆi˜ât$a ‘¹DfŸYªò9 ®wæµR-–rͦŒÙ«jô7W­b»·»à%ãÓOoÊ]n×q®ØjÍD\k4X…ÏS¤Dé ×ÃEOpuÚ>£àãÄ_ô€#3R‘¢lvÅPnë6Æ®½¥¥ÿûꀷDÎëÌ;ôTÅØÙÃ\ °õE®±q'㤘üë*LÃ<-Ù¥ßñß×Quÿyõ_Óë_œêÿ÷,Q ²ä„FmÙ@êš…¡YÂ5" HÛEz—3uP„ÓF„¢˜™÷#ñÄ !D`ÓÍŠˆM:&HT@DˆŠ-’0*„±WÌ>ëš]‰ÿûµ M¦±Ä€’²mÀR°  `X†dÖÖjÈÖ`øš`°4)7’FX?XH_“ÙÓ½keièHäW–¯K~Æt ¢Ö×ÝU{6‹a1Ê·8ÙŽ h4ó ¹èŸÿ¾Gt©©ú†n>/W5#ŒÆešþJ¶8Ö1™u‰ìÄœD2¼Ž”åiˆÙ“0)“höâî0 <¡G8‚™„©J%‚KPU=ZjmUÿö*d ›]ki Í’·Vî,áÓ)Ҡ鄤h 7F`ý.ÊTSl…¨»µ­ªÖ>`O^’-$²ÄEÖáÙÎÛ¬2âåYùXq”ˆÇ*¢¡HÒ!Ìä+Nu| ÿû’瀳‘DÏëÌClV8È cL G®°í±™#T0‹ˆIZÆ6}ï@¥IÒžîdÐÈÎÛõ3Ïjq“Ð €.-ÖðœÚ¸(1ª$(ç¤$1Ñ‚ÑúI8%‚*‚˜Ø¡æR<®ý5'#28aPaÓfƤ28ÈDJåipäj\—7Z$,o:Ê G°u‚w &(r*ÀϵÎ$™uÌ\ÄÜZÍÍEàGƒ 2-ô­4XòxÁ¢$àÀ艺@ã1¡ ™ÊI¦¤™éhAXXÄÄÌ4 ‰p ½ë† þ[t«¸i/ h¥‹Í!Ä¥vÜv¿ˆ.ôÃ…¸ á®K7O,» ¿ùê¥Ê),s:z|ôÿÃöêRK)9%ÛϺÃðÃ~y÷Tàù@@h °œÁóâÀ0°ü?íŠ8¬ùsÿÊ:Ø>µ`ôŠw$SSO{L#ÃfD„qjâ½Ô¡j@„ËLD ÑóåZ ™[ÜÐ9ç ¨:eå”Ç(ñ›ÜO/¢ï°_ ¥¿EŸÑ¢ )â£2Gaÿû’ì³µRÑk¯*þXÅhÉ CbÛYõ½€1£¢†0Ãð80=ïó}6Ò29ã Y0 ¿ó*Ä0ú 0 ƒ@ü Ñ:‹âÀÏ`P2É€ aE"7¸Ф,ŽÆ@7°³‰óO°Xš„D@&Lգ𠀀  QKƒbI£#蘡ø_àÀÁˇ€ª"A—Ö’Ì”æ?Äì´K†à£ T@Qf ]t–­ø …"+…Aq hÎŽÁèVÃíl’½ÿB 2ÃùLvaÊ"ä@sGPë-U+׫ÿÿÈqI’?ÿPAšëÀR &Zñ'äø³…Íâ– ä Ü¿‡ÄpVÁ’õø€ùÁ³ ÂÈÊþ eP0ˆÙêÿ'ˆiäE" ˆºÿüBR,¥‰´-|†)?ÿøê`#†^$Ê"±HrFgZÿÿñ Mˆ—T¸lf3#<]/HiêWÿÿüÄš3'jLAME3.99.5ªªªªªªªªªªªªªªªªªªªªªªªªÿû’Ä€hK®z …­ÆÈD¤ 4ƒ€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/ogg/32000-1.ogg0000644000000000000000000001671013111512442022756 0ustar 00000000000000OggSþ.wüA§vorbis}ðO¸OggSþ.w2EYDjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉvorbis+Xiph.Org libVorbis I 20120203 (Omnipresent)TITLE=Another test trackARTIST=La la lavorbis)BCV1L Å€ÐU`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€ÐU €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs?=?@=@>B@
    @@=AAD?pù[bÙ®¾ñ‚ ,8äC>äC¶ÛØÆ6¶±y‰D¶mÛ LÂðœK¡°·\ÿ]€ýR&VÚúù2Ó!xƒ÷ã ¢oa?†»w‡!Ù€ÈìÃÂræl˜nù¯çAóÃtàeÖ¶)“Ú´j3aÒÚ#¶ËÍúrÏCðüÖ`‰fáT¬ã¸¸¸0û–>£ ê2Ï]ðüÖ`‰æáî9¡ÐdñûQê2Ï]ð€aƒu „ÓÀ?ßw¬™y£n%êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ôú2Ï­à=ƒK „cð΃`މ¹Kº×êÒÏSðü6`‰æáT€uóm...̾ݺú2Ï­à=ømÀÍ+€{N(ôYü~T'@êÒÏSð€á€u „ÓÀ?ßw¬™y£n%êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ô$ êÒÏSð€Á€% Â1À;J€96&æ.é^ êÒÏSðü6`‰fáT°Ž àââÂì[úŒ.@ÐêÒÏSðü6`‰æáÀ='úÀ€,~?ª êÒÏSð€á€u „Ó ÿ|ß°~d井 êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ô$ êÒÏSð€Á€% Â1À;J€96&æ.é^ úrÏCðüÖ`‰fáT¬ã¸¸¸0û–>£ ú2Ï­à=ømÀÍ+ (÷œPè²øý¨N€ htú2Ï­à=Ãë0@§@@€ åŸï;Ö̼Q·$&€Æú2Ï­à=Ãë0@Ç@Ê_•§#WãzxÑ $@ÐØú2Ï­à=ƒK „c@yçA 0ÇÆÄÜ%Ýk$6иêÒÏSðü6`‰fáT €ZÇ?pqqaö-}F €Æú2Ï­à=ømÀÍ+Â@Ê='úÀ€,~?ª htú2Ï­à=Ãë0@§ åŸï;Ö̼Q· ÀàÆú2Ï­à=Ãë0@Ç Pþú¨8¹×Ë^$@ÐØú2Ï­à=ƒK „c@Ê;J€96&æ.é^6иú2Ï­à=ømÀÍ*©@­ã¸¸¸0û–>£ €Æú2Ï­à=ømÀÍ+Â@Ê='úÀ€,~?ª htú2Ï­à=Ãë0@§ åŸï;Ö̼Q· ÀàÆú2Ï­à=Ãë0@Ç Pþú¨8¹×Ë^$@ÐØú2Ï­à=ƒK „c@yçA 0ÇÆÄÜ%Ýk˜l qú2ÏSðü6`‰fáT Öñ\\\˜}KŸÑ@cú2Ï­à=ømÀÍ+Â@¹ç„@ÅïGu ±Ðèú2ÏSð€á€u „Ó(€òÏ÷ëGæ@Þ¨[‰pD€%ê2ÏCð€aƒu „cJ‘Å,€€ò×G%ÀéÈÕ¸^ô€*8?X&úrÏCð€Aƒ% Â1¥Èb  ¼ó ˜ccbî’î5€@ üÏD LNúrÏCðüÖ`‰fáT”"‹Y@jÿÀÅÅ…Ù·ô]@P4Àu €BêÒÏCðü6`‰æáeH—EPJÊ='úÀ€,~?ªÔX¨¼7: úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð `ýÈÈu+1 x?€ ê2ÏCð€aƒu „cJ!] @ @ùë£àtäj\/z€ €à‹j%€ € úrÏCð€Aƒ% Â1¥Èb (%å%Às—t¯ lTÀß@”:@àAáúrÏCðüÖ`‰fáT”‘Å, µŽ àââÂì[úŒ. hÿÀ€BêÒÏCðü6`‰æáµÈbA)(÷œPè²øý¨N@H8¾+€ úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð`ýÈÈu+1 /øŽ€ êÒÏCð€á€u „cJ!] @ @ùë£àtäj\/z€@üŸ°(L<(<úrÏCð€Aƒ% Â1•YÌ"¥ ¼ó ˜ccbî’î5€xüÏD L6(œú2ÏSðü6`‰fáTT:d1‹@­ã¸¸¸0û–>£ ÀฎPèú2ÏSðü6`‰æáµ.‹ ””{N(ôYü~T' /$°Pxot&úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð `ýÈÈu+1 x?€ ê2ÏCð€aƒu „c*¤Ë"@Ê_•§#WãzxÑ l€_T¸¢0úrÏCð€Aƒ% Â1•YÌ"¥ ¼ó ˜ccbî’î5€ ðø»ˆ@è<(œêÒÏCðü6`‰fáTÔ"‹Y@­ã¸¸¸0û–>£ HÀ ÿÀ:ê2ÏCðüÖ`‰æáµÈb (%åž }`@¿Õ HÀ Ç!Àw°&&úrÏCð€aƒu „Ó Ò¡ŸY@Ê?ßw€7ëGæ@Þ¨[‰€OÀ ¾£P8úrÏCð€aƒu „c*¤Ë"(@ùë£àtäj\/z€xðïó~Ùô6žS³¦i𦝱×Gsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/ogg/44100-2.ogg0000644000000000000000000003163713111512442022770 0ustar 00000000000000OggS;W²,?qvvorbisD¬q¸OggS;W²,ï?lÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘vorbis+Xiph.Org libVorbis I 20120203 (Omnipresent)ALBUM=Album Full Of Test TracksTITLE=Test Track TRACKNUMBER=5COMMENTS=None worth speaking ofARTIST=Test Artist DATE=2013 GENRE=Top 40vorbis)BCV1L Å€ÐU`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€ÐU €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNP@OggS¯;W²,ô;7¥GRPN_657<9;<657><=>?;:ZX€²M¸Ø&þã³…ç,ž”ÈC_9x‹8ÆáÈusU]U÷Åy“7WqUeÕE%wæYdù²/*‰i±üž_^‚_sÏ®ã*¶^@eô‡;Ž‹ßýþíl+€óüìÆò¾ª®û¢®;³®"冷;©«Èûªºî¤®;󾊼“ºî¤²Ð›2ì2Xüž_^‚>sÏ.8FɉõËßÝ/Ï>잟^‚?sÏæ%/à¼[üL¯SO³üž_^‚>sÏ.8FÉ ?ÿò°@ýà¿ÿ잟^‚?sÏæ%/À+ØEÿ%v<ÕôžŸ_‚>sÏ.8FÉ ¿|ø°ä÷ëœ잟^‚?sÏæ%/À`Ç»0ü. 잟^‚?sÏæ%÷ð¨²ÿºinÖ‡dU1áÞ€g¬}ÿËÏ¿üüËÏ¿üüñÀ*ŸŒ'?€xý3?‰ÿO]Ü’·6ß²(—xwñiÃïË}¹/ß_ß_ßÿýÿßÿÿ}Ý—»§¾i®Ê§d!$|Á½KaÓ0{ô'@3séo×bó.gûO¶‹ÝŽ9ÞiÉOÉ޼` œ€A¯^7h†/þG òÈ!–Öwu¶åÞi•O)_`…NÀ ìó=¿"h¦/÷·Í¹¼µÎÙ;G¼³Èš¾i®Ê§d!$|Á}*aÓ08A°ßþÓÿiÌtß-¹Ö|Î:×"»Sew•õ¾iîü§$ ‡¯°… œƒ¾úßch†Kÿ?-6òþNþÔgÑÛz¾i®ä§$)$üç)8 !|õ«ßch†Ëüß-®9ä±è®ÓîZÓá¾iîê‡d‡/pÊaÓ0 Bœ·ÿÔÚÓ—ù¾´äó6çœm‰·®{ª½Êy¾iîê§d‡/°KaÓ0À9ßþgÀL÷}Ù¼ËYçlî®ÓÜt{gÞiÉO)^°…NÀ‚àÍÛCóÍòÈ!ZO»ëN›k=Þinü§d!$|Ås œ€ @ð¶ï ÍÝ_.osÈÛœ{&±8nç¾i®Ê§d!$|Ás—ç`A’p^ÿººç}ž|>—sÎÚ|koô²ßç€ ¾i®ü§$!$|Åó8 &œ¯üþ¿‡š{¾:ïrÖ¹œm½òªüb¬ë€¾i®èS’|àyŽy¨Ài0A@_Ù^ÀÐÜüÇ G+Z°87ü*‡uáð¾i®Ê§d!$|ÁóTBN€ ‚$ûõïüó: ç5×âò6çZ×»sú·®u¾i®ü§$!$rÅs œ€A ûõ{þë {æòõÏYç¬uù¦ÿp¥û?çÞinü§¡ZñÜ¥°.á4 HÀëž_ÍÌW»›w9äÝUë]7"‡ €Þinä§d)$üÂó œ€A x=¯¯ ¾æäGyÛòLË;®¥åÞinʧ¡¾à¹Ëa]Âi°Ï/ý3 ™¾Üß¹\>o­s¹þç?÷NÖiîü‡T©âþ ÷®ž±Öý‡Ÿ?|øðáÃýý˜$€ªŠwÞ+Â;€¯þŠÆ—o1â´»þ¡¦÷Îÿ°Ã×åòõõõõõõõßÿý÷ß×××årén üž_^‚>s¯.8’~ùå~€äïýó잟^‚?s¯æ4J^Øo€ÅWõ:í4üž_^‚?s¯æ4½^§>8̰m0çó†uV?ìzçlõª×y<&וÔ]dfRw‘™Ô}y%uߕוÜw‘WR÷]䕸[(/Qw‘WÂ}üž_^‚>s¯æ4åž§ ˆQÃa€²à{ƹ¬8t‹õõõk¹øÅ]yåýÆáÇŒ‹ûæÊº+/êæÊºëJîÊ‹º¹’»2©ÊLßÔ- ,JÑÑüž_^‚?sÏ.8¦Ðp¼ƒXEáP÷òëêß{([¸ÖÍ=ø}8‡c¾Æ[8æ!ïºòæâæâæâæâΫ2«òª;¯ª+o§*c5 üž_^‚_sÏ®£äÄþðÿ6@ù°÷ÿØüž_^‚_sÏ®“äÄúðÿHuÂñïãüž_^‚>sÏ.9&ɉõñïî@>ÿU=ôüž_^‚~æžÍ1I^θW>óÎi9püž_^‚?sÏ.8Fɉýá—‡ @í÷ñôžŸ_‚>óÌæ4J^ö+ØEÏN?íTüž_^‚?sÏæ˜$'üòóýÈoŸ:잟^‚?s¯æ4I^8oàßá4  ši®CŸR–`á…³ƒgìõðó/?ÿòó/>~ø@‚€@~»re8»rØûÎþêžýþ¿»N=íÔO½òÙãw¾;üûò}ùþúþïûëûë¾ÜíÞ'œK&¾i®Ê§d!$|Á½Ë¡§ÀAAœ×ÿúŸ×Ý3_—Ö|‹Í;k[«¹Cì!μK8¾i®ä—$)$ü3… œ Ž_yûvÀÐÜüG+rÈ#‡Å;Þùn¦ÁÏÐ/€¾i®Ü§$„„VÜ»*pL€p8HöW~Å_âš»ÿ›VÛâò6çFú+€fú2ß6çòÖ:gßɯ7Ýšx8 ¾i®Ê§d!$|Á½+aÓ08A‡c@ Øo•ÿ´ fúò}çr­ùœu.gQ}¨{6瀧èx¾i®Ü§$„„VÜ[¨Ài0AÁ1 Àþê¯øKm0\úÿi±yäwÃp¹wÐÛz€óæà¾i®ä—$)$ü3 BN€A@8$øêW¿ÇÐ þï´"‡<íxו½1xÞàð¾i®Ê§d!$|Á½Ë¡§À  Ç Àyû¯ÿUl0}™ïKK¾Õ朳-U‹[¯²‡:ð.æ0¾i®Ê§d!4|Á½KaÓ0 Ž Hpηÿ0Ó}ß_¹¼ËYçlî´w×nßÉ<pÞinä§)$táÞ§`A‡ xóö †æ{þC9䑳­ÿ/–mKë^€óÀÞinܧd„„VÜ[Xà4LÁ1IÞöùI04w¹¼Í!os®Wâû+íâ<ïô <ÞinÊ—!$|Á™å°Ài˜@ÂáHÀyý=þÓ=÷å+ŸÏ圳6?b½wßµßçðÀ¼¾i®ü§$!$rŽ… œ AIÎWþ…ßÃÍ=ÿuÞålÞålëºÏ®ëìºÎœOx€ ¾i®Ü§$„„VÜ»*pL€$¾âÛCsó#0­Èa†çzÁ¼+€y¾i®ü§$!4|Žˡ§ÀA‡c’ì¯ü¿‡zîþº[m‹ËÛœk=ôÙgóX×:à€~€ ¶inÃ>¥ï‚…Üð ëþçŸþùçŸþðá@!Ô PUp^… °÷WÞðìÿÝyê©;,ÚáÙ«U;Þ5âû¾ïûþþþþþþþþþ¾?=pœ.䞟^‚_ssÔHò@À+`‡»-zÇZxà <$ôžŸ_‚?s9j4y¬›'¦'|ÖýŸ¿ËF¹¸èÃøZìçííx|;qx}=‘y]×u]×'Š®ëÊMÝ÷ýööööv<ﻪ­"™×u]×u]×u]×u%䞟^|ææ¨QîyÞß…á0 ¦ŒøöoPµ¢ñ7?ú´$ù-ßòHâ5^ã5¢ê¾ïû¾I™C¼Æá;’c뮂ÌúúzŠ»n o..6ÿüž_^‚?ssÔ(×¼Þ€fV÷Õ|òá!ˆ° Dow¶–7ˆ×<¼qgæUùÆñ‡8rÿ}eòByàê¦.®¢ .®¢H.ï#R-잟^‚?ssÔhNH¯6¬Fd0G¾Â;¿>3°Ôí={U]•k“)6™ºÿßLåWda7Í”]fÚ.ƒüž_^‚>s5”œØ¿ür¿ @Þû?ðpåp2üž_^‚~æ模ä€ýqÕ3w–Çy0ß €üž_^‚>s—5”œXþîa u^åúÀ @¿OggSˆX;W²,¦’s.:&!"#jFOOLVPRVNLWSHISQROn*RPOH()%'('(sMXLRTSOOLSOSUPMRTMRÿ%Ÿ_^‚^s׎IN¬w¿@„g¿óïúk¼üž_^‚~æžÍQM’ûãÿ¿ß yãÉ>`ž@üž_^‚?s—5’œØþþa µÉ>à`ÞÀüž_^‚_sWŽIN¬ÿïaˆ ¨pØïóô÷@8ši®ƒR– /œ-|ðŒõðáïÿîïÿî—Ÿ?~øø` á$ê‡Í/NÀößÿ÷î§zÚ§­wWËïÞ9âf»9óâç_¼p~³­ÎÕÕð¼+P¾i®Ê§d!$|Á½ËaS0‚‚ ûí÷þ×l0ÓÏûærù¼µÎåZªzÃýóçÞ% ¾i®ü§$!4|Ž… œƒ€!€ýÕ?ó{m0\ú{r6ïr6ïZ®º²÷©XÏz€s<0¼—p@¾inä‡$#4øÀ½K¡§À  ‚€ ƒ €Ÿ<µ4Ã…ÿiA+ZЊE­W¶NGoxàà]€8¾inê‡d!4|Á½+¡§À  A@‚ Àyûþ*6˜¾Ì÷¥%ßjs.o[Ö=Íåì¡Î¼ï¸‚wÀ ¾inʇ$„D®¸·°Ài˜@!€p8Â1’œ·oÿ;ÀL÷ýý•Ë;k³¹ÓÖ]÷û_Þàx€€àÞiîü‡„„Vܧ8  ‚ à’ðvÆWÀÐý=_¶ÕåGÎ^yå!ÓíðüÀÀù€ãxÎ' Þiî܇d„†VÜ[Xà4L €@8ABPð¶ÏWÀÐÜý…à|ð€¾inê‡d!4|Á½KaÓ0€p‚HöþèO€fæÒ߮ſ]Î:÷Ÿl»s/Àù<œOPÞiîä‡d)$òÂ}„NÀ @Ž‚xõº@3|ñ?ZGy´´¾s¨³-à^.+ÀÞiîʇ!$|Á}ŠÂ§`€@8A(Øç{~EÐL_îo›syk³wŽxg‘;5€à]Þ%8x¾inê‡d!4|Á½+aÓ08A„B!€ýöŸþOÛ`¦ûûnɵæsÖ¹Ù*»«¬ÀÀù€w 8 (¾inü‡$„†¯¸·PÓ`‚„à Ç’à«?ñ=6€f¸ôÿÓbóÈ!áïäO}½­ÀÀ»àà€@¾in܇$)$ü{„ œƒ@ ‚€ _ýê÷Øšá2ÿw‹kEy,ºë´»ÖÃtx<Àq€‡wÀ–i®Ã?¤íB¥<7àöþøñãÇ?~üø`@‚€ H@ÞŸÿÿÿ¿€óöŠïÿ¿ë´w\¼xÇÿ©²‹îþu¹\._________ÿ}=O7çÀù€Äž//A·¹‡9j$y ÃÇO:àû–CòÏÀ‡y ¿¦à8އ‘Üž/A¯¹‡9jF¤7Û¸áP÷›þÖñÉØlÛ¬;¾èìýœoÇx ªÈ+Ï]™IÝä¥SE~úÜ•Wrß|>ª»¸>]wå•T±/¸á“ÔM^pßdÔžï/ ^ssÔ0¸|ÙælV €‡;ŸaÑÏM^;o7e_Éx;Æ1^92üFð Å9y›íQ8p̺³æ"¯¢¿P™\E+£±‹잟^‚?ssÔ(ø¼íA¬ÖÀ¶óþ¬3¼?y° ºyäSàp|½/êº?EÞ×Uyÿc¸óû_‹;o¨¼ÓPyk*+‹ôU‚ôeQh䞟^‚_ssÔ0”鈽ã=Œs ñë^ú°õ¹§B{UVVÖæææï››››…¿onê*+§¦b¦*+×]95åôžŸ_‚>s5’œðó‡k#ƒÔ{aŸ àà`¾ºàÊñ€䞟^|æ樑ä€À9$¼vøß.:ÕxçÁ¼=ð ÀCã üž_^‚>sÏæ%'üòˇ Á ògŸý<óÀ ¼Ày잟^‚?ssÔPò@à À~,~¶×i§9‡Kè~<\¡üž_^‚>sÏ.8ªQrÂÏ??,D  ^¨>€ãø€Küž_^‚>ssÔPò@P Ày æª;Oµ¼àÀqðAüž_^‚?sÏ.8ªIrbüûû È!ygÀ¿Ã㛀Oðzši®’»z<·ðÁ3öúøwÿó/?üðñÃ@€@8!ÈÏ??üâü püþgóÃÿïÜuêi;ìxê´Ü÷ùgÿþýõýõýõýu÷Àô|||||<xॼÞiîʇ!$|Á}JaÓ0 ÇÇà@pö·ÿþ`è¹/_.osÎY›?íTUeïÊs>æÞ€@¾inê‡d!$|Á}ÊaÓ0M€p8B!HÎëê?å€î™¯Kk>góÎÚÖøðgî²W:ó6ýp ç€<¾in܇$)4ü{ 8 &@8A$ÀW¾ú퀡¹ù¯[‘C9,>íÔÓ0 x8x€@¾inü‡$„„¯¸OA¨Ài0A!€!A_ù¿Ý04wÿ7­¶Åå‘Èÿr?<ƒ^Öàà<€~8ð.8¾inê‡d!$|Á½ËaÓ08A!€p8B`¿þ§ÿSè™Ë×Ïåòyk]+ìqw¥u8^˜€à8¾inê‡d!4|Á}JaÓ0@ AÀ18AAöþèoš™ËåÛålÞå¬sï ÿ!ïNË€w ïð/ðxÞiîä‡d)$ü½…NÀ  ‚c€cHÀ«×šá‹ÿÑ‚À¾inʇ$„†¯¸·PÓ`‚ÇA8A€ýÕ_ñ—Ú`¸ôÿ“³y—CÞµüpHËXÏzà€~x¼Àð¾in܇$)$üû… œƒ@ ÇA$¾úö=6€f¸ð?-hEy,qWUÓáp>æà Þ%¾inê‡d!$|Á}Ê¡§À  A@‚$œ·ÿú_ÅÓ—ù¾´ä[mÎåmK¯¯¬¶‡:ð®ààøàà¾inê‡d!4|Á½KaÓ0 „Ã1À18€óöKþN0Ó}ß_¹|>g³¹¿?íYûNÞ̼À Þiî܇„„Vܧ8  ‚c€ !HðvÎ+šïù϶º䑳UϨ;mKëÀÀyýp ïðÞiî܇d„„VÜ[Xà4L €@8A8¼íóU04w¹ŸË9gm~ñUUÎþŸwx€y€~8p8¾inʇ$„D®¸·PÓ`‚ B!8Â1€$œ×á÷p@÷=ÿuÞålÞålë´ÿNëeq瀀^€@¾inä‡$#$øÀ}Ê¡§ÀA‡ A@à'ÎGCsó#0­hÁâüUñ^è¼ïWð.€ žinÁ[2¨/<7`!˜à„à A@€ýúg~‰(úü¶^¸é_}±ù¼ùŽÿ8þÃ]=wõÜÕsWïãø3ÀOáB–5Ž'ù úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçrØjʽ°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t#m…d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•õꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëúú øŽ'–5áB>O‚Z„d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á ôðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçsØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâõð âM,:G!Sý]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5'ù úúúëAÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"ü0‹>û0¾"õõçrØjʽ°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t#m…d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëúú øŽ'–5áB>O‚Z„d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçsØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâõð âM,:G!Sý]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5'ù úúúëAÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"ü0‹>û0¾"õõçrØjʽ°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t#m…d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëúú øŽ'–5áB>O‚Z…d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’{›~¥Â°½jÊrØçõõ¾"û0‹>û0¾"õõçsØjʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâõð âM,:G!Sý]g­oAv1{l~暉}»y=t"m„d‚Z>OáB–5'ù úúúëAÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB>O‚Z„d"m=t»y‰}šæl~1{Av­ogý] SG:M,á õðâ³ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Â°½jÊrØçõõ¾"ü0‹>û0¾"õõçrØjʽ°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð áM,:G Sþ]g­oAv1{l~暉}»y=t#m…d‚Z>OáB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëúú øŽ'–5áB>O‚Z…d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Ã°½jÊsØçõõ¿"û0Š>û0¾"õõçsØiʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äŲÓâõð áN,:G!Sý]g­oAv1{l~暉}»y=t#m„d‚Z>OáB—5'ù úúúëAÝÏuÁÄ´©¬ž“•õꇊƒä€€ä€Šƒê‡õ“•¬ž©Ä´vÁÏAÝúëùú ù'—5áB>O‚Z„d#m=t»y‰}šæl~1{Av­ogý]!SG:N,á õðâ³ÓäÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊrØçõõ¾"û0‹>û0¿"õõçsØjʽ°~¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâôð âM,:G Sý]g­oAv1{l~暉}»y=t"m…dZ>OáB–5Ž'ù úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëùú øŽ'–5àB>O‚Z„d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’{›~¥Â°½jÊrØçõõ¾"ü0‹>ü0¾"õõçrØjÊ ½Â°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð âM,:G Sþ]g­oAv1{l~暉}»y=t"m…d‚Z>OàB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú øŽ'–5áB>O‚Z…d"m=t»y‰}šæl~1{Av­ogþ] SG:M,â õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’{›~¥Â° ½jÊrØçõõ¾"ü0‹>û0¾"õõçrØjʽ°¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ã¸äųÓâõð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m„d‚Z>OáB–5'ø ùúúëAÝÏvÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z…d"m=t»y‰}šæl~1{Av­ogý] SG:M,á ôðâ²ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Ã°½jÊsØçõõ¿"û0Š>û0¾"õõçsØiʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äŲÓâõð áN,:G!Sý]g­oAv1{l~暉}»y=t#m„d‚Z>OáB—5'ù úúúëAÝÏuÁÄ´©¬ž“•õꇊƒä€€ä€Šƒê‡õ“•¬ž©Ä´vÁÏAÝúëùú ù'—5áB>O‚Z„d#m=t»y‰}šæl~1{Av­ogý]!SG:N,á õðâ³ÓäÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊsØçõõ¾"û0‹>û0¿"õõçsØjʽ°~¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâôð áM,:G Sý]g­oAv1{l~暉}»y=t"m…dZ>OáB–5Ž'ù úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëùú øŽ'–5àB>O‚Z„d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’{›~¥Â°½jÊrØçõõ¾"ü0‹>ü0¾"õõçrØjÊ ½Â°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð âM,:G Sþ]g­oAv1{l~暉}»y=t"m…d‚Z>OàB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú øŽ'–5áB>O‚Z…d"m=t»y‰}šæl~1{Av­ogþ] SG:M,â õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’{›~¥Â° ½jÊrØçõõ¾"ü0‹>û0¾"õõçrØjʽ°¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ã¸äųÓâõð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m„d‚Z>OáB–5'ø ùúúëBÝÏvÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z…d"m=t»y‰}šæl~1{Av­ogý] SG:M,á ôðâ²ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Ã°½jÊsØçõõ¿"û0Š>û0¾"õõçsØiʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâõð áN,:G!Sý]g­oAv1{l~暉}»y=t#m„d‚Z>OáB—5'ù úúúëAÝÏuÁÄ´©¬ž“•õꇊƒä€€ä€Šƒê‡õ“•¬ž©Ä´vÁÏAÝúëùú ù'—5áB>O‚Z„d#m=t»y‰}šæl~1{Av­ogý]!SG:N,á õðâ³ÓäÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊsØçõõ¾"û0‹>û0¿"õõçsØjʽ°~¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâôð áM,:G Sý]g­oAv1{l~暉}»y=t"m…d‚Z>OáB–5Ž'ù úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´vÁÏBÝúëùú øŽ'–5àB>O‚Z„d#m=t»y‰}šæl~1{Av­ogþ] SG:M,á õðâ³ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’{›¥Â°½jÊrØçõõ¾"ü0‹>ü0¾"õõçrØjÊ ½Â°~¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâõð âM,:G Sþ]g­oAv1{l~暉}»y=t"m…d‚Z>OàB–5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú øŽ'–5áB>O‚Z…d"m=t»y‰}šæl~1{Av­ogþ] SG:M,â õðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’{›~¥Â° ½jÊrØçõõ¾"ü0‹>û0¾"õõçrØjʽ°¥{›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ã¸äųÓâõð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m„d‚Z>OáB–5'ø ùúúëBÝÏvÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú ùŽ'–5áB>O‚Z…d"m=t»y‰}šæl~1{Av­ogý] SG:M,á ôðâ²ÓäÅä¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›~¥Ã°½jÊsØçõõ¿"û0Š>û0¾"õõçsØiʽ°~¥|›Þ’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâõð áN,:G!Sý]g­oAv1{l~暉}»y=t#m„d‚Z>OáB—5'ù úúúëAÝÏuÁÄ´©¬ž“•õꇊƒä€€ä€Šƒê‡õ“•¬ž©Ä´vÁÏAÝúëùú ù'—5áB>O‚Z„d#m=t»y‰}šæl~1{Av­ogý]!SG:N,á õðâ³ÓäÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Þ’|›~¥Â°½jÊsØçõõ¾"û0‹>û0¿"õõçsØjʽ°~¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ä¸äųÓâôð áM,:G Sý]g­oAv1{l~暉}»y=t"m…d‚Z>OáB–5Ž'ù ùúúëBÝÏvÁô©¬ž“•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Å´vÁÏAÝùëúú ø'•5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogý] SG:N,à õðâ´ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›¥Â°½iÊsØçõõ¿"ü0‹>û0¾"öõçrØjÊ ½Ã°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ä¸åųÓâôðÿÿ âM,:G!Sþ]g­o@v1{l~暊}»y=t"m…d‚Z=OàB–5Ž'ù ùúúëBÝÏtÁÄ´©¬ž”•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Ä´uÁÏAÝûëúú ø'—5áB>O‚Z„d#m=t»y‰}šæk~1{Av­oŽgý] SG:N,á õð â²ÓäÅä¸à¬¢r˜S¿‰Ï„•€f€w‚E†Ã‹Þ’|›~¥Â°½kÊsØçõõ¿"ü0‹>û0¾"ôõçrØjÊ ½Á°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ä¸äųÓâôð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m…d‚Z=OáB–5Ž'ù ùúúëBÝÏuÁÄ´©¬ž”•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏCÝûëúú ø'—5áB>OZ„d#m=t»y‰}šæl~1{Av­ogý] SG:L,á õðâ²ÓäÅä¸à¬¢s˜S¿‰Ï„•€f€w‚E†Â‹Þ’|›~¥Â°½jÊsØçõõ¿"û0Š>;KãVUamj rxv|ÿv|x rmjTaãV;KŠ>û0¾"ôõçsØjÊ ½Â°~¥|›Þ’ËD†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâöð áM,:G!Sý]g­oAv1{l~暉}»y=t#m…dZ>OáB—5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú øŽ'—5áB>OZ…d#m=t»y‰}šæl~1{Av­ogý]!SG:M,á öðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚D†Ã‹Þ’|›~¥Â° ½jÊsØçôõ¾"û0Š>=KãVTamj rxv|ÿv|x rmjUaãV;KŠ>û0¿"õõçsØjʽ°~¥|›Þ’‹E†w‚f€€•Ï„¿‰Ss˜¢à¬ä¸äŲÓâõð áL,:G Sý]g­oAv1{l~暉}»y=t#m„dZ>OáB—5'ø úúûëCÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô”•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5àB=O‚Z…d#m=t»y‰}šæl~1{Av­ogþ]!SG:M,á ôðâ³ÓäÅä¸ß¬¢s˜SÀ‰Ï„”€f€v‚E†Ã‹Þ’{›~¥Á° ½jÊrØçôõ¾"û0Š>=KãVTamj rxv|ÿu|x rmjUaâVü0¿"õõçsØiʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Sr˜¢à¬ä¸äÅ²Ó âõð áN,:G Sý]Žg­oAv1{k~暉}»y=t#m„d‚Z>OáB—5'ø úúûëAÝÏuÁÄ´©«ž“•ôꇋƒä€€ä€Šƒê‡õ”•¬ž©Ä´vÁÏBÝúëùú ùŽ'–5àB=O‚Z…d"m=t»yŠ}šæl~1{@v­ogþ]!SG:M,â ÿÿôðâ³ÓåÅã¸ß¬¢s˜SÀ‰Ï„”€f€v‚E†Ã‹Ý’{›~¥Ã° ½jÊrØçöõ¾"û0‹>ü0¿"õõçsØiʽ°¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ã¸äÅ´Óâõð àN,:G Sý]g­oAv1{k~暉}»y=t"m„d‚Z>OáB•5'ø úúùëAÝÏvÁÅ´©«ž“•ôꇋƒä€€ä€Šƒê‡õ“•¬ž©Ã´vÁÏBÝúëùú ùŽ'–5àB?O‚Z…d"m=t¼y‰}šæl~1{Av­ogþ]!SG:M,â ÿÿôðâ³ÓåÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’{›¥Ã°½jÊrØçöõ¾"ú0‹>ü0½"õõçrØiʽ°¥{›Ý’ËE†w‚f€€”Ï„¿‰Rs˜¢ß¬ã¸ãųÓâõð âN,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OàB–5'ù ûúùëAÝÏvÁÅ´©¬ž“•õ뇊ƒä€€ä€Šƒë‡õ“•¬ž©Å´vÁÏAÝùëûú ù'–5âB>O‚Z„d"m=t»y‰}šæl~1{Av­ogþ] SG:N,â õðâ³ÓãÅã¸ß¬¢s˜R¿‰Ï„”€f€w‚E†Ã‹Ý’{›¥Â°½iÊrØçõõ½"ü0‹>ú0¾"öõçrØjʽð¥{›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ã¸åųÓâôðÿÿ âM,:G!Sþ]g­oAv1{l~暉}¼y=t"m…d‚Z?OàB–5Ž'ù ùúúëBÝÏvÁô©¬ž“•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Å´vÁÏAÝùëúú ø'•5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogý] SG:N,à õðâ´ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›¥Â°½iÊsØçõõ¿"ü0‹>û0¾"öõçrØjÊ ½Ã°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ã¸åųÓâôðÿÿ âM,:G!Sþ]g­o@v1{l~暊}»y=t"m…d‚Z=OàB–5Ž'ù ùúúëBÝÏtÁÄ´©¬ž”•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Ä´uÁÏAÝûëúú ø'—5áB>O‚Z„d#m=t»y‰}šæk~1{Av­oŽgý] SG:N,á õð â²ÓäÅä¸à¬¢r˜S¿‰Ï„•€f€w‚E†Ã‹Þ’|›~¥Â°½kÊsØçõõ¿"ü0‹>û0¾"ôõçrØjÊ ½Á°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ä¸äųÓâôð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m…d‚Z=OàB–5Ž'ù ùúúëBÝÏuÁÄ´©¬ž”•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏCÝûëúú ø'—5áB>OZ„d#m=t»y‰}šæl~1{Av­ogý] SG:L,á õðâ²ÓäÅä¸à¬¢s˜S¿‰Ï„•€f€w‚E†Â‹Þ’|›~¥Â°½jÊsØçõõ¿"û0Š>;KãVUamj rxv|ÿv|x rmjTaãV=KŠ>û0¾"ôõçsØjÊ ½Â°~¥|›Þ’ËD†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâöð áM,:G!Sý]g­oAv1{l~暉}»y=t#m…dZ>OáB—5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú øŽ'—5áB>OZ…d#m=t»y‰}šæl~1{Av­ogý]!SG:M,á öðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚D†Ã‹Þ’|›~¥Â° ½jÊsØçôõ¾"û0Š>=KãVTamj rxv|ÿv|x rmjUaãV;KŠ>û0¿"õõçsØjʽ°~¥|›Þ’‹E†w‚f€€•Ï„¿‰Ss˜¢à¬ä¸äŲÓâõð áL,:G Sý]g­oAv1{l~暉}»y=t#m„dZ>OáB—5'ø úúûëCÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô”•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5àB=O‚Z…d#m=t»y‰}šæl~1{Av­ogþ]!SG:M,á ôðâ³ÓäÅä¸ß¬¢s˜SÀ‰Ï„”€f€v‚E†Ã‹Þ’{›~¥Á° ½jÊrØçôõ¾"û0Š>=KãVTamj rxv|ÿu|x rmjUaâVü0¿"õõçsØkʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Sr˜¢à¬ä¸äÅ²Ó âõð áN,:G Sý]Žg­oAv1{k~暉}»y=t#m„d‚Z>OáB—5'ø úúûëAÝÏuÁÄ´©«ž“•ôꇋƒä€€ä€Šƒê‡õ”•¬ž©Ä´vÁÏBÝúëùú ùŽ'–5àB=O‚Z…d"m=t»yŠ}šæl~1{@v­ogþ]!SG:M,â ÿÿôðâ³ÓåÅã¸ß¬¢s˜SÀ‰Ï„”€f€v‚E†Ã‹Þ’{›~¥Ã° ½jÊrØçöõ¾"û0‹>ü0¿"õõçsØiʽ°¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ã¸äÅ´Óâõð àN,:G Sý]g­oAv1{k~暉}»y=t"m„d‚Z>OáB•5'ø úúùëAÝÏvÁÅ´©«ž“•ôꇋƒä€€ä€Šƒê‡õ“•¬ž©Ã´vÁÏBÝúëùú ùŽ'–5àB?O‚Z…d"m=t¼y‰}šæl~1{Av­ogþ]!SG:M,â ÿÿôðâ³ÓåÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’{›¥Ã°½jÊrØçöõ¾"ú0‹>ü0½"õõçrØiʽ°¥{›Ý’ËE†w‚f€€”Ï„¿‰Rs˜¢ß¬ã¸ãųÓâõð âN,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OâB–5'ù ûúùëAÝÏvÁÅ´©¬ž“•õ뇊ƒä€€ä€Šƒë‡õ“•¬ž©Å´vÁÏAÝùëûú ù'–5àB>O‚Z„d"m=t»y‰}šæl~1{Av­ogþ] SG:N,â õðâ³ÓãÅã¸ß¬¢s˜R¿‰Ï„”€f€w‚E†Ã‹Ý’{›¥Â°½iÊrØçõõ½"ü0‹>ú0¾"öõçrØjʽð¥{›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ã¸åųÓâôðÿÿ âM,:G!Sþ]g­oAv1{l~暉}¼y=t"m…d‚Z?OàB–5Ž'ù ùúúëBÝÏvÁô©¬ž“•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Å´vÁÏAÝùëúú ø'•5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogý] SG:N,à õðâ´ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›¥Â°½iÊsØçõõ¿"ü0‹>û0¾"öõçrØjÊ ½Ã°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ã¸åųÓâôðÿÿ âM,:G!Sþ]g­o@v1{l~暊}»y=t"m…d‚Z=OàB–5Ž'ù ùúúëBÝÏvÁÄ´©¬ž”•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Ä´uÁÏAÝûëúú ø'—5áB>O‚Z„d#m=t»y‰}šæk~1{Av­oŽgý] SG:N,á õð â²ÓäÅä¸à¬¢r˜S¿‰Ï„•€f€w‚E†Ã‹Þ’|›~¥Â°½kÊsØçõõ¿"ü0‹>û0¾"ôõçrØjÊ ½Á°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ä¸äųÓâôð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m…d‚Z=OàB–5Ž'ù ùúúëBÝÏuÁÄ´©¬ž”•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏCÝûëúú ø'—5áB>OZ„d#m=t»y‰}šæl~1{Av­ogý] SG:L,á õðâ²ÓäÅä¸à¬¢s˜S¿‰Ï„•€f€w‚E†Â‹Þ’|›~¥Â°½jÊsØçõõ¿"û0Š>;KãVUamj rxv|ÿv|x rmjTaãV=KŠ>û0¾"ôõçsØjÊ ½Â°~¥|›Þ’ËD†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâöð áM,:G!Sý]g­oAv1{l~暉}»y=t#m…dZ>OáB—5Ž'ø úúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝúëúú øŽ'—5áB>OZ…d#m=t»y‰}šæl~1{Av­ogý]!SG:M,á öðâ³ÓäÅä¸à¬¢s˜S¿‰Ï„”€f€w‚D†Ã‹Þ’|›~¥Â° ½jÊsØçôõ¾"û0Š>=KãVTamj rxv|ÿv|x rmjUaãV;KŠ>û0¿"õõçsØjʽ°~¥|›Þ’‹E†w‚f€€•Ï„¿‰Ss˜¢à¬ä¸äŲÓâõð áL,:G Sý]g­oAv1{l~暉}»y=t#m„dZ>OáB—5'ø úúûëCÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô”•¬ž©Ä´uÁÏBÝúëùú ùŽ'–5áB=O‚Z…d#m=t»y‰}šæl~1{Av­ogþ]!SG:M,á ôðâ³ÓäÅä¸ß¬¢s˜SÀ‰Ï„”€f€v‚E†Ã‹Þ’{›~¥Á° ½jÊrØçôõ¾"û0Š>=KãVTamj rxv|ÿu|x rmjUaâVü0¿"õõçsØkʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Sr˜¢à¬ä¸äÅ²Ó âõð áN,:G Sý]Žg­oAv1{k~暉}»y=t#m„d‚Z>OáB—5'ø úúûëAÝÏuÁÄ´©«ž“•ôꇋƒä€€ä€Šƒê‡õ”•¬ž©Ä´tÁÏBÝúëùú ùŽ'–5àB=O‚Z…d"m=t»yŠ}šæl~1{@v­ogþ]!SG:M,â ÿÿôðâ³ÓåÅä¸ß¬¢s˜SÀ‰Ï„”€f€v‚E†Ã‹Þ’{›~¥Ã° ½jÊrØçöõ¾"û0‹>ü0¿"õõçsØiʽ°¥|›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢à¬ã¸äÅ´Óâõð àN,:G Sý]g­oAv1{k~暉}»y=t"m„d‚Z>OáB•5'ø úúùëAÝÏvÁÅ´©«ž“•ôꇋƒä€€ä€Šƒê‡õ“•¬ž©Ã´vÁÏBÝúëùú ùŽ'–5àB?O‚Z…d"m=t¼y‰}šæl~1{Av­ogþ]!SG:M,â ÿÿôðâ³ÓåÅã¸ß¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’{›¥Ã°½jÊrØçöõ¾"ú0‹>ü0½"õõçrØiʽ°¥{›Ý’ËE†w‚f€€”Ï„¿‰Rs˜¢ß¬ã¸ãųÓâõð âN,:G Sþ]g­oAv1{l~暉}»y=t"m„d‚Z>OâB–5'ù úúùëAÝÏvÁÅ´©¬ž“•õ뇊ƒä€€ä€Šƒë‡õ“•¬ž©Å´vÁÏAÝùëûú ù'–5àB>O‚Z„d"m=t»y‰}šæl~1{Av­ogþ] SG:N,â õðâ³ÓãÅã¸ß¬¢s˜R¿‰Ï„”€f€w‚E†Ã‹Ý’{›¥Â°½iÊrØçõõ½"ü0‹>ü0¾"öõçrØjʽð¥{›Ý’ËE†w‚f€€”Ï„¿‰Ss˜¢ß¬ã¸åųÓâôðÿÿ âM,:G!Sþ]g­oAv1{l~暉}¼y=t"m…d‚Z?OàB–5Ž'ù ùúúëBÝÏvÁô©¬ž“•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Å´vÁÏAÝùëúú ø'•5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogý] SG:N,à õðâ´ÓäÅã¸à¬¢s˜S¿‰Ï„”€f€w‚E†Ã‹Ý’|›¥Â°½iÊsØçõõ¿"ü0‹>û0¾"öõçrØjÊ ½Ã°~¥{›Ý’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ã¸åųÓâôðÿÿ âM,:G!Sþ]g­o@v1{l~暊}»y=t"m…d‚Z=OàB–5Ž'ù ùúúëBÝÏvÁÄ´©¬ž”•õꇊƒä€€ä€‹ƒê‡ô“•«ž©Ä´uÁÏAÝûëúú ø'—5áB>O‚Z„d#m=t»y‰}šæk~1{Av­oŽgý] SG:N,á õðâ²ÓäÅä¸à¬¢r˜S¿‰Ï„•€f€w‚E†Ã‹Þ’|›~¥Â°½iÊsØçõõ¿"ü0‹>û0¾"ôõçrØjÊ ½Ã°~¥{›Þ’ËE†v‚f€€”Ï„À‰Ss˜¢ß¬ä¸äųÓâôð áM,:G!Sþ]g­oAv1{l~暉}»y=t#m…d‚Z=OàB–5Ž'ù ùúúëBÝÏuÁÄ´©¬ž”•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏCÝûëúú ø'—5áB>OZ„d#m=t»y‰}šæl~1{Av­ogý] SG:L,á õðâ²ÓäÅä¸à¬¢s˜S¿‰Ï„•€f€w‚E†Â‹Þ’|›~¥Â°½jÊsØçõõ¿"û0Š>;KãVUamj rxv|ÿv|x rmjTaãV=KŠ>û0¾"ôõçsØjÊ ½Â°~¥|›Þ’ËD†w‚f€€”Ï„¿‰Ss˜¢à¬ä¸äųÓâöð áM,:G!Sý]g­oAv1{l~暉}»y=t#m…dZ>OáB—5Ž'ø ùúúëBÝÏuÁÄ´©¬ž“•ôꇊƒä€€ä€Šƒê‡ô“•¬ž©Ä´uÁÏBÝøëüú úŽ'—5áB>OZ„d"m;KáVSanj rxv|ÿv|x rljSaáV;KŠ>û0¿"÷õ çqØiʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸æÅ´Ó âõð áL,:GSÿ]Žg­oAv1{l~暊}¼yOáB—5'ú øúùëAÝÏuÁÄ´©¬ž”•õꇊƒä€€ä€Šƒê‡ô“•«ž©Å´vÁÏBÝúëùú ÷Œ'•5âB?O‚Z…d#m=t»y‰}šæk~0{@v­ogþ]!SG:O,ß ÿÿôðâ³ÓäÅä¸à¬¢t˜R¿‰Ï„”€f€v‚D†Â‹Ý’}›¥Ã° ½jÊrØçôõÀ"ý0Œ>=KãVTamj rxu|ÿu|x rmjUaãV=KŒ>ú0½"õõçsØkÊ ½Ä°}¥{›Ý’ËE†w‚f€€”Ï„À‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G Sý]Œg¬o@v1{l~暉}»y=t#m…dƒZt¼yŠ}šæl~1{Av®oŽgü]SG:M,â öð â±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVUanj rxv|ÿv|x rljTaâVü0¿"óõçqØiʽ°¥|›Þ’Ä‹E†v‚f€€”Ï„¿‰Sr˜¢Þ¬å¸åÅ´Óâõð àL,:G"Sþ]g­oAv1{k~暊}»y=t"m„d‚Z>OáB—5'ú øúùëAÝÏvÁÅ´©­ž”•ôꇊƒä€€ä€Šƒê‡ô’•­ž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~1{Av­ogþ]!SG:K,à ÿÿôðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹Þ’|›¥Ã°½jÊrØçôõÀ"ü0‹>K‰>ú0½"õõçsØkÊ!½Á°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢ß¬ã¸ãŲÓâ÷ð âN,:G Sý]Œg¬oAv1{l~暉}»y>t#m†d€Z=OàB–5'ù úúûëCÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒë‡õ“•¬ž©Ã´tÁÏCÝûëûú ù'–5àB=OZ†d#m>t»y‰}šæl~1{Av¬oŒgý] SG:N,â ÷ðâ²ÓãÅã¸ß¬¢s˜SÀ‰Ð„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊtØçõõ¾"ú0‰>:KãVUamj rxv|ÿv|x rljTaâVü0À"ôõçrØjʽð¥|›Þ’‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àL,:G!Sþ]g­oAv1{k~暉}»y=t"m…d‚Z?OâB˜5'÷ ùúúëBÝÏvÁÅ´©­ž’•ôꇊƒä€€ä€Šƒê‡ô”•­ž©Å´vÁÏAÝùëøú ú'—5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]"SG:L,à õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„”€f€v‚E†Ä‹Þ’|›¥Â°½iÊqØçóõ¿"ü0‹>û0¾"öõ çtØlʽÁ°~¥{›Ý’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãűÓ!âöð âM,:G Sü]Žg®oAv1{l~暊}¼y>t#mƒdZ=OàB–5Ž'ù ûúüë@ÝÏtÁÄ´©¬ž”•õ뇋ƒä€€ä€‹ƒê‡ô“•«ž©Ã´tÁÏCÝûëúú ø'•5ßB=KãVUamj rxu|ÿu|x rmjTaâV=KŒ>ý0À"ôõçrØjÊ ½Ã°¥}›Ý’‹D†v‚f€€”Ï„¿‰Rt˜¢à¬ä¸äųÓâôðÿÿ ßO,:G!Sþ]g­o@v0{k~暉}»y=t#m…d‚Z?OâB•5Œ'÷ ùúúëBÝÏvÁÅ´©«ž“•ôꇊƒä€€ä€Šƒê‡õ”•¬ž©Ä´uÁÏAÝùëøú ú'—5áB>OZ„d"m;KáVSalj rxv|ÿv|x rnjSaáV;KŠ>û0¾"öõ çqØhʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸âÅ´Ó âöð áM,:GSÿ]Žg®oAv1{l~暊}¼yOáB—5Ž'ú ûúøë@ÝÏuÁÄ´©¬ž”•õ뇊ƒä€€ä€Šƒê‡ô“•«ž©Æ´wÁÏBÝúëúú øŒ'•5ßB?OƒZ…d#m=t»y‰}šæl~0{@v­ogý]!SG:N,ã ÿÿôðâ²ÓäÅä¸à¬¢t˜R¿‰Ï„”€f€w‚D†Â‹Ý’z›¥Ã° ½jÊsØçôõ½"ý0Œ>=KãVTamj rxu|ÿu|x rmjTaãV=KŒ>ý0½"õõçsØjÊ ½Ã°€¥z›Ý’‹E†w‚f€€”Ï„¿‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G Sý]g­o@v0{l~暉}»y=t#m…dƒZ?OßB•5'ø úúûëCÝÏwÁô©«ž“•ôꇊƒä€€ä€Šƒë‡õ”•¬ž©Ä´uÁÏ@Ýøëûú ùŽ'–5áB=OZ„d"m>t¼yŠ}šæl~1{Av®oŽgü]SG:M,á öð âµÓãÅã¸ß¬¢s˜S¿‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVVanj rxv|ÿv|x rljSaâVü0¿"÷õçqØiʽ°~¥|›Þ’ËE†v‚f€€•Ï„¿‰Sr˜¢Þ¬â¸æÅ´Ó âõð áL,:G"Sþ]Žg­oAv1{k~暊}»y=t"m„d‚Z>OáB—5'ú øúùëAÝÏuÁÄ´©­ž”•õꇊƒä€€ä€Šƒê‡ô’•«ž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~0{@v­ogþ]!SG:O,à ÿÿôðâ³ÓåÅä¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹ß’}›¥Ã° ½jÊrØçôõÀ"ý0‹>ú0½"õõçsØkÊ!½Ä°}¥{›Ý’ËE†w‚f€€”Ï„À‰Tt˜¢à¬ã¸äŲÓâóð âN,:G Sý]Œg¬oBv1{l~暉}»y=t#m…dƒZ=OàB•5'ø úúûëCÝÏtÁô©«ž“•ôꇋƒä€€ä€‹ƒë‡õ“•¬ž©Ã´tÁÏ@Ýüëûú ùŽ'–5àB=OZƒd#m>t¼yŠ}šæl~1{Av®oŒgý] SG:M,â öðâ±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Ý’{›}¥Á°½kÊtØçöõ¾"û0‰>;KäVUamj rxv|ÿv|x rljTaâVü0¿"óõçrØiʽ°¥|›Þ’Ä‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åÅ´Óâõð àL,:G!Sþ]g­oAv1{k~暉}»y=t"m„d‚Z>OâB—5'÷ øúùëAÝÏvÁÅ´©­ž’•ôꇊƒä€€ä€Šƒê‡ô’•­ž©Å´vÁÏAÝùëùú ÷'˜5âB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]!SG:L,à õðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Ä‹Þ’|›¥Â°½iÊrØçóõ¿"ü0‹>ú0¾"öõçtØkʽÁ°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢ß¬ã¸ãűÓâöð âM,:G Sý]Œg®oAv1{l~暉}¼y>t#mƒdZ=OàB–5Ž'ù ûúüëDÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒë‡ô“•«ž©Ã´tÁÏCÝûëúú ø'•5àB=O€Z…d#m=t»y‰}šæl~1{Av¬oŒgý] SG:N,â óðâ²ÓãÅã¸à¬¢s˜TÀ‰Ï„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊsØçõõ½"ú0‰>=KãVUamj rxv|ÿu|x rljTaâVý0À"ôõçrØjÊ ½Ã°¥|›ß’‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àO,:G!Sþ]g­o@v0{k~暉}»y=t"m…d‚Z?OâB˜5Œ'÷ ùúúëBÝÏvÁÅ´©«ž’•ôꇊƒä€€ä€Šƒê‡õ”•­ž©Ä´uÁÏAÝùëøú ú'—5áB>O‚Z„d"m=t»yŠ}šæk~1{Av­oŽgþ]"SG:L,á õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„•€f€v‚E†Ã‹Þ’|›~¥Â°½iÊqØç÷õ¿"ü0‹>û0¾"öõ çtØhʽÁ°~¥{›Þ’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãÅ±Ó âöð áM,:GSü]Žg®oAv1{l~暊}¼y>t!m„dZ=OàB–5Ž'ù ûúøë@ÝÏuÁÄ´©¬ž”•õ뇋ƒä€€ä€Šƒê‡ô“•«ž©Ã´wÁÏCÝûëúú ø'•5ßB?OƒZ…d#m=t»y‰}šæl~1{@v¬ogý] SG:N,ã þÿóðâ²ÓäÅä¸à¬¢t˜T¿‰Ï„”€f€w‚E†Ã‹Ý’z›€¥Ã° ½jÊsØçõõ½"ú0Œ>=KãVUamj rxu|ÿu|x rmjTaãV=KŒ>ý0¼"ôõçrØjÊ ½Ã°¥}›Ý’‹D†w‚f€€”Ï„¿‰Rt˜¢à¬ä¸äųÓâôðÿÿ ãO,:G!Sý]g­o@v0{l~暉}»y=t#m…dƒZ?OâB•5Œ'ø ùúúëBÝÏwÁÆ´©«ž“•ôꇊƒä€€ä€Šƒë‡õ”•¬ž©Ä´uÁÏAÝùëüú úŽ'—5áB>OZ„d"m;KáVSanj rxv|ÿv|x rljSaáV;KŠ>û0¿"÷õ çqØiʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸æÅ´Ó âõð áL,:GSÿ]Žg­oAv1{l~暊}¼yOáB—5Ž'ú øúùëAÝÏuÁÄ´©¬ž”•õꇊƒä€€ä€Šƒê‡ô“•«ž©Å´vÁÏBÝúëùú øŒ'•5âB?O‚Z…d#m=t»y‰}šæk~0{@v­ogþ]!SG:O,ã ÿÿôðâ³ÓäÅä¸à¬¢t˜R¿‰Ï„”€f€v‚D†Â‹Ý’}›¥Ã° ½jÊrØçôõÀ"ý0Œ>=KãVTamj rxu|ÿu|x rmjUaãV=KŒ>ú0½"õõçsØkÊ ½Ã°}¥{›Ý’ËE†w‚f€€”Ï„¾‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G Sý]Œg¬o@v1{l~暉}»y=t#m…dƒZt¼yŠ}šæl~1{Av®oŽgü]SG:M,â öð â±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVUanj rxv|ÿv|x rljTaâVü0¿"óõçqØiʽ°~¥|›Þ’Ä‹E†v‚f€€”Ï„¿‰Sr˜¢Þ¬å¸åÅ´Óâõð àL,:G"Sþ]Žg­oAv1{k~暊}»y=t"m„d‚Z>OáB—5'ú øúùëAÝÏvÁÅ´©­ž”•ôꇊƒä€€ä€Šƒê‡ô’•­ž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~0{Av­ogþ]!SG:K,à ÿÿôðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹Þ’|›¥Ã°½jÊrØçôõÀ"ü0‹>K‰>ú0½"õõçsØkÊ!½Á°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢ß¬ã¸ãŲÓâóð âN,:G Sý]Œg¬oAv1{l~暉}»y>t#m†d€Z=OàB–5'ù úúûëCÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒë‡õ“•¬ž©Ã´tÁÏCÝûëûú ù'–5àB=OZ†d#m>t»y‰}šæl~1{Av¬oŒgý] SG:N,â ÷ðâ²ÓãÅã¸ß¬¢s˜SÀ‰Ð„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊtØçöõ¾"ú0‰>:KãVUamj rxv|ÿv|x rljTaâVü0À"ôõçrØiʽð¥|›Þ’‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àL,:G!Sþ]g­oAv1{k~暉}»y=t"m„d‚Z>OâB˜5'÷ ùúúëBÝÏvÁÅ´©­ž’•ôꇊƒä€€ä€Šƒê‡ô”•­ž©Å´vÁÏAÝùëøú ú'—5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]"SG:L,à õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„”€f€v‚D†Ä‹Þ’|›¥Â°½iÊqØçóõ¿"ü0‹>û0¾"öõ çtØlʽÁ°~¥{›Ý’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãűÓ!âöð âM,:G Sü]Œg®oAv1{l~暊}¼y>t#mƒdZ=OàB–5Ž'ù ûúüë@ÝÏtÁô©¬ž”•õ뇋ƒä€€ä€‹ƒê‡ô“•«ž©Ã´tÁÏCÝûëúú ø'•5ßB=KãVUamj rxu|ÿu|x rljTaâV=KŒ>ý0À"ôõçrØjÊ ½Ã°¥}›Ý’‹D†v‚f€€”Ï„¿‰Rt˜¢à¬ä¸äųÓâôðÿÿ ßO,:G!Sþ]g­o@v0{k~暉}»y=t#m…d‚Z?OâB”5Œ'÷ ùúúëBÝÏvÁÅ´©«ž“•ôꇊƒä€€ä€Šƒê‡õ”•¬ž©Ä´uÁÏAÝùëøú ú'—5áB>OZ„d"m;KáVSalj rxv|ÿv|x rnjSaáV;KŠ>û0¾"öõ çqØhʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸âÅ´Ó âöð áM,:GSÿ]Žg®oAv1{l~暊}¼y>t"m„dZ=OáB—5Ž'ú ûúøë@ÝÏuÁÄ´©¬ž”•õ뇊ƒä€€ä€Šƒê‡ô“•«ž©Æ´wÁÏBÝúëúú øŒ'•5ßB?OƒZ…d#m=t»y‰}šæl~0{@v­ogý]!SG:N,ã ÿÿôðâ²ÓäÅä¸à¬¢t˜R¿‰Ï„”€f€w‚E†Â‹Ý’z›¥Ã° ½jÊsØçõõ½"ý0Œ>=KãVTamj rxu|ÿu|x rmjTaãV=KŒ>ý0½"õõçsØjÊ ½Ã°€¥z›Ý’‹E†w‚f€€”Ï„¿‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G Sý]g­o@v0{l~暉}»y=t#m…dƒZ?OßB•5'ø úúûëCÝÏwÁ´©«ž“•ôꇊƒä€€ä€Šƒë‡õ”•¬ž©Ä´uÁÏ@Ýøëûú ùŽ'–5áB=OZ„d"m>t¼yŠ}šæl~1{Av®oŽgü]SG:M,á öð âµÓãÅã¸ß¬¢s˜S¿‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVSanj rxv|ÿv|x rljSaâV;KŠ>ü0¿"÷õçqØiʽ°~¥|›Þ’ËE†v‚f€€•Ï„¿‰Sr˜¢Þ¬â¸æÅ´Ó âõð áL,:G"Sþ]Žg­oAv1{k~暊}»yOáB—5'ú øúùëAÝÏuÁÄ´©¬ž”•õꇊƒä€€ä€Šƒê‡ô’•«ž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~0{@v­ogþ]!SG:O,à ÿÿôðâ³ÓåÅä¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹ß’}›¥Ã° ½jÊrØçôõÀ"ý0‹>ú0½"õõçsØkÊ!½Ä°}¥{›Ý’ËE†w‚f€€”Ï„À‰Tt˜¢à¬ã¸äŲÓâóð âN,:G Sý]Œg¬oBv1{l~暉}»y=t#m…dƒZ=OàB•5'ø úúûëCÝÏtÁô©«ž“•ôꇋƒä€€ä€‹ƒë‡õ“•¬ž©Ã´tÁÏ@Ýüëûú ùŽ'–5àB=OZƒd#m>t¼yŠ}šæl~1{Av®oŒgý] SG:M,â öðâ±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Ý’{›~¥Á°½kÊtØçöõ¾"û0Š>;KäVUamj rxv|ÿv|x rljTaâVü0¿"óõçrØiʽ°¥|›Þ’Ä‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åÅ´Óâõð àL,:G!Sþ]g­oAv1{k~暉}»y=t"m„d‚Z>OâB—5'÷ øúùëAÝÏvÁÅ´©­ž”•ôꇊƒä€€ä€Šƒê‡ô’•­ž©Å´vÁÏBÝúëùú ÷'˜5âB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]!SG:L,à ÿÿõðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Ä‹Þ’|›¥Â°½iÊrØçôõ¿"ü0‹>ú0¾"öõçtØkʽÁ°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢ß¬ã¸ãűÓâöð âM,:G Sý]Œg®oAv1{l~暉}¼y>t#mƒdZ=OàB–5Ž'ù ûúüëDÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒë‡õ“•«ž©Ã´tÁÏCÝûëúú ù'–5àB=O€Z…d#m=t»y‰}šæl~1{Av¬oŒgý] SG:N,â óðâ²ÓãÅã¸à¬¢s˜TÀ‰Ï„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊsØçõõ½"ú0‰>=KãVUamj rxv|ÿu|x rljTaâVü0À"ôõçrØjÊ ½Ã°¥|›ß’‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àO,:G!Sþ]g­o@v0{k~暉}»y=t"m…d‚Z?OâB˜5Œ'÷ ùúúëBÝÏvÁÅ´©«ž’•ôꇊƒä€€ä€Šƒê‡ó”•­ž©Ä´uÁÏAÝùëøú ú'—5áB>O‚Z„d"m=t»yŠ}šæk~1{Av­oŽgþ]"SG:L,á õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„•€f€v‚E†Ã‹Þ’|›~¥Â°½iÊqØç÷õ¿"ü0‹>û0¾"öõ çtØhʽÁ°~¥{›Þ’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãÅ±Ó âöð áM,:GSü]Žg®oAv1{l~暊}¼y>t!m„dZ=OàB–5Ž'ù ûúøë@ÝÏuÁÄ´©¬ž”•õ뇋ƒä€€ä€Šƒê‡ô“•«ž©Ã´wÁÏCÝûëúú ø'•5ßB?OƒZ…d#m=t»y‰}šæl~1{@v¬ogý] SG:N,ã þÿóðâ²ÓäÅä¸à¬¢t˜T¿‰Ï„”€f€w‚E†Ã‹Ý’{›€¥Ã° ½kÊsØçõõ½"ú0Œ>=KãVUamj rxu|ÿu|x rmjTaãV=KŒ>ý0¼"ôõçrØjÊ ½Ã°¥}›Ý’‹D†w‚f€€”Ï„¿‰Rt˜¢à¬ä¸äųÓâôðÿÿ ãO,:G!Sý]g­o@v0{l~暉}»y=t#m…dƒZ?OâB•5Œ'ø ùúúëBÝÏwÁÆ´©«ž“•ôꇊƒä€€ä€Šƒë‡õ”•¬ž©Ä´uÁÏAÝùëøú úŽ'—5áB>OZ„d"m;KáVSanj rxv|ÿv|x rnjSaáV;KŠ>û0¿"÷õ çqØiʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸æÅ´Ó âõð áL,:GSÿ]Žg®oAv1{l~暊}¼yOáB—5Ž'ú øúùëAÝÏuÁÄ´©¬ž”•õꇊƒä€€ä€Šƒê‡ô“•«ž©Å´wÁÏBÝúëùú øŒ'•5âB?OƒZ…d#m=t»y‰}šæk~0{@v­ogþ]!SG:O,ã ÿÿôðâ³ÓäÅä¸à¬¢t˜R¿‰Ï„”€f€v‚D†Â‹Ý’}›¥Ã° ½jÊrØçôõÀ"ý0Œ>=KãVTamj rxu|ÿu|x rmjUaãV=KŒ>ú0½"õõçsØkÊ ½Ã°}¥{›Ý’ËE†w‚f€€”Ï„¾‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G Sý]Œg¬o@v1{l~暉}»y=t#m…dƒZt¼yŠ}šæl~1{Av®oŽgü]SG:M,â öð â±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVUanj rxv|ÿv|x rljSaâVü0¿"÷õçqØiʽ°~¥|›Þ’ËE†v‚f€€•Ï„¿‰Sr˜¢Þ¬å¸åÅ´Óâõð àL,:G"Sþ]Žg­oAv1{k~暊}»y=t"m„d‚Z>OáB—5'ú øúùëAÝÏuÁÄ´©­ž”•ôꇊƒä€€ä€Šƒê‡ô’•­ž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~0{Av­ogþ]!SG:K,à ÿÿôðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹Þ’|›¥Ã°½jÊrØçôõÀ"ü0‹>K‰>ú0½"õõçsØkÊ!½Á°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢à¬ã¸ãŲÓâóð âN,:G Sý]Œg¬oAv1{l~暉}»y>t#m†d€Z=OàB–5'ù úúûëCÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒë‡õ“•¬ž©Ã´tÁÏCÝüëûú ù'–5àB=OZ†d#m>t»y‰}šæl~1{Av®oŒgý] SG:N,â ÷ðâ²ÓãÅã¸ß¬¢s˜SÀ‰Ð„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊtØçöõ¾"ú0‰>:KãVUamj rxv|ÿv|x rljTaâVü0À"ôõçrØiʽ°¥|›Þ’Ä‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àL,:G!Sþ]g­oAv1{k~暉}»y=t"m„d‚Z>OâB˜5'÷ ùúúëBÝÏvÁÅ´©­ž’•ôꇊƒä€€ä€Šƒê‡ô”•­ž©Å´vÁÏAÝùëøú ú'—5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]"SG:L,à õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„”€f€v‚D†Ä‹Þ’|›¥Â°½iÊqØçóõ¿"ü0‹>û0¾"öõ çtØlʽÁ°~¥{›Ý’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãűÓ!âöð âM,:G Sü]Œg®oAv1{l~暊}¼y>t#mƒdZ=OàB–5Ž'ù ûúüë@ÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒê‡ô“•«ž©Ã´tÁÏCÝûëúú ø'•5ßB=KãVUamj rxu|ÿu|x rljTaâVý0À"ôõçrØjÊ ½Ã°¥}›Ý’‹D†v‚f€€”Ï„¿‰Rr˜¢à¬ä¸äųÓâôðÿÿ ßO,:G!Sþ]g­o@v0{k~暉}»y=t#m…d‚Z?OâB”5Œ'÷ ùúúëBÝÏvÁÅ´©«ž“•ôꇊƒä€€ä€Šƒê‡õ”•¬ž©Ä´uÁÏAÝùëøú ú'—5áB>OZ„d"m;KáVSalj rxv|ÿv|x rnjSaáV;KŠ>û0¾"öõ çqØhʽ°~¥{›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸âÅ´Ó âöð áM,:GSÿ]Žg®oAv1{l~暊}¼y>t"m„dZ=OáB–5Ž'ú ûúøë@ÝÏuÁÄ´©¬ž”•õ뇊ƒä€€ä€Šƒê‡ô“•«ž©Æ´wÁÏBÝûëúú øŒ'•5ßB?OƒZ…d#m=t»y‰}šæl~0{@v­ogý]!SG:N,ã þÿôðâ²ÓäÅä¸à¬¢t˜T¿‰Ï„”€f€w‚E†Â‹Ý’z›¥Ã° ½jÊsØçõõ½"ý0Œ>=KãVTamj rxu|ÿu|x rmjTaãV=KŒ>ý0½"õõçsØjÊ ½Ã°€¥z›Ý’‹E†w‚f€€”Ï„¿‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G!Sý]g­o@v0{l~暉}»y=t#m…dƒZ?OßB•5'ø úúûëCÝÏwÁ´©«ž“•ôꇊƒä€€ä€Šƒë‡õ”•¬ž©Ä´uÁÏ@Ýøëûú úŽ'–5áB=OZ„d"m>t¼yŠ}šæl~1{Av®oŽgü]SG:M,á öð âµÓãÅã¸ß¬¢s˜S¿‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVSanj rxv|ÿv|x rljSaâV;KŠ>ü0¿"÷õçqØiʽ°~¥|›Þ’ËE†v‚f€€•Ï„¿‰Ss˜¢Þ¬â¸æÅ´Ó âõð áL,:G"Sÿ]Žg­oAv1{l~暊}»yOáB—5'ú øúùëAÝÏuÁÄ´©¬ž”•õꇊƒä€€ä€Šƒê‡ô’•«ž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~0{@v­ogþ]!SG:O,à ÿÿôðâ³ÓåÅä¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹Ý’}›¥Ã° ½jÊrØçôõÀ"ý0‹>ú0½"õõçsØkÊ!½Ä°}¥{›Ý’ËE†w‚f€€”Ï„À‰Tt˜¢à¬ä¸äŲÓâóð âN,:G Sý]Œg¬o@v1{l~暉}»y=t#m…dƒZt¼yŠ}šæl~1{Av®oŒgý] SG:M,â öðâ±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Ý’{›~¥Á°½kÊtØ çöõ¾"û0Š>;KäVUamj rxv|ÿv|x rljTaâVü0¿"óõçqØiʽ°¥|›Þ’Ä‹D†v‚f€€”Ï„¿‰Sr˜¢á¬å¸åÅ´Óâõð àL,:G!Sþ]g­oAv1{k~暉}»y=t"m„d‚Z>OáB—5'÷ øúùëAÝÏvÁÅ´©­ž”•ôꇊƒä€€ä€Šƒê‡ô’•­ž©Å´vÁÏBÝúëùú ÷'˜5âB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]!SG:L,à ÿÿõðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Ä‹Þ’|›¥Â°½iÊrØçôõ¿"ü0‹>ú0¾"öõçtØkʽÁ°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢ß¬ã¸ãűÓâöð âM,:G Sý]Œg®oAv1{l~暉}¼y>t#m†dZ=OàB–5'ù ûúüëDÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒë‡õ“•«ž©Ã´tÁÏCÝûëúú ù'–5àB=O€Z†d#m>t»y‰}šæl~1{Av¬oŒgý] SG:N,â óðâ²ÓãÅã¸à¬¢s˜TÀ‰Ð„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊsØçõõ½"ú0‰>=KãVUamj rxv|ÿu|x rljTaâVü0À"ôõçrØjÊ ½Ã°¥|›ß’‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àO,:G!Sþ]g­o@v0{k~暉}»y=t"m…d‚Z?OâB˜5Œ'÷ ùúúëBÝÏvÁÅ´©«ž’•ôꇊƒä€€ä€Šƒê‡ó”•­ž©Ä´uÁÏAÝùëøú ú'—5áB>O‚Z„d"m=t»yŠ}šæk~1{Av­oŽgþ]"SG:L,á õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„•€f€v‚E†Ã‹Þ’|›~¥Â°½iÊqØç÷õ¿"ü0‹>û0¾"öõ çtØhʽÁ°~¥{›Þ’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãÅ±Ó âöð áM,:GSü]Žg®oAv1{l~暊}¼y>t!m„dZ=OàB–5Ž'ù ûúüë@ÝÏuÁÄ´©¬ž”•õ뇋ƒä€€ä€Šƒê‡ô“•«ž©Ã´wÁÏCÝûëúú ø'•5ßB?OƒZ…d#m=t»y‰}šæl~1{@v¬ogý] SG:N,ã þÿóðâ²ÓäÅä¸à¬¢t˜T¿‰Ï„”€f€w‚E†Ã‹Ý’{›}¥Ã° ½kÊsØçõõ½"ú0Œ>=KãVUamj rxu|ÿu|x rmjTaãV=KŒ>ý0¼"ôõçrØjÊ ½Ã°¥}›Ý’‹D†w‚f€€”Ï„¿‰Rt˜¢à¬ä¸äųÓâôðÿÿ ãO,:G!Sþ]g­o@v0{l~暉}»y=t#m…dƒZ?OâB•5Œ'ø ùúúëBÝÏwÁÅ´©«ž“•ôꇊƒä€€ä€Šƒë‡õ”•¬ž©Ä´uÁÏAÝùëøú úŽ'—5áB>OZ„d"m;KáVSanj rxv|ÿv|x rnjSaáV;KŠ>û0¿"÷õ çqØiʽ°~¥|›Þ’ËE†w‚f€€•Ï„¿‰Ss˜¢ß¬â¸æÅ´Ó âõð áM,:GSÿ]Žg®oAv1{l~暊}¼yOáB—5Ž'ú øúùëAÝÏuÁÄ´©¬ž”•õ뇊ƒä€€ä€Šƒê‡ô“•«ž©Å´wÁÏBÝúëùú øŒ'•5âB?OƒZ…d#m=t»y‰}šæk~0{@v­ogþ]!SG:O,ã ÿÿôðâ³ÓäÅä¸à¬¢t˜R¿‰Ï„”€f€w‚D†Â‹Ý’}›¥Ã° ½jÊrØçôõ¼"ý0Œ>=KãVTamj rxu|ÿu|x rmjUaãV=KŒ>ú0½"õõçsØkÊ ½Ã°}¥{›Ý’ËE†w‚f€€”Ï„¾‰Tt˜¢à¬ä¸äŲÓâóðþÿ ãN,:G Sý]g¬o@v1{l~暉}»y=t#m…dƒZt¼yŠ}šæl~1{Av®oŽgü]SG:M,á öð â±ÓãÅã¸ß¬¢s˜SÀ‰Ð„•€f€w‚E†Ã‹Þ’{›~¥Á°½hÊtØ çöõ¾"û0Š>;KáVUanj rxv|ÿv|x rljSaâVü0¿"÷õçqØiʽ°~¥|›Þ’ËE†v‚f€€•Ï„¿‰Sr˜¢Þ¬å¸åÅ´Óâõð àL,:G"Sþ]Žg­oAv1{k~暊}»y=t"m„d‚Z>OáB—5'ú øúùëAÝÏuÁÄ´©­ž”•ôꇊƒä€€ä€Šƒê‡ô’•ªž©Å´vÁÏBÝúëùú ÷Œ'˜5âB?O‚Z…d"m=t»y‰}šæk~0{@v­ogþ]!SG:K,à ÿÿôðâ³ÓåÅå¸á¬¢r˜R¿‰Ï„”€f€v‚D†Â‹Þ’|›¥Ã°½jÊrØçôõÀ"ü0‹>ú0½"õõçsØkÊ!½Á°}¥{›Ý’ËE†w‚f€€”ЄÀ‰Ss˜¢à¬ã¸ãŲÓâóð âN,:G Sý]Œg¬oAv1{l~暉}»y>t#m†d€Z=OàB–5'ù úúûëCÝÏtÁô©«ž“•õ뇋ƒä€€ä€‹ƒë‡õ“•¬ž©Ã´tÁÏCÝüëûú ù'–5àB=OZ†d#m>t¼y‰}šæl~1{Av®oŒgý] SG:M,â öðâ±ÓãÅã¸ß¬¢s˜SÀ‰Ð„”€f€w‚E†Ã‹Ý’{›}¥Á°!½kÊtØçöõ¾"ú0‰>:KäVUamj rxv|ÿv|x rljTaâVü0À"ôõçrØiʽ°¥|›Þ’Ä‹D†v‚f€€”Ï„¿‰Rr˜¢á¬å¸åųÓâôðÿÿ àL,:G!Sþ]g­oAv1{k~暉}»y=t"m„d‚Z>OâB˜5'÷ ùúúëBÝÏvÁÅ´©­ž’•ôꇊƒä€€ä€Šƒê‡ô”•­ž©Å´vÁÏAÝùëøú ÷'—5áB>O‚Z„d"m=t»y‰}šæk~1{Av­ogþ]"SG:L,à õðâ´ÓåÅå¸Þ¬¢r˜S¿‰Ï„”€f€v‚D†Ä‹Þ’|›¥Â°½iÊqØçóõ¿"ü0‹>û0¾"öõ çtØkʽÁ°~¥{›Ý’ËE†w‚f€€•ЄÀ‰Ss˜¢ß¬ã¸ãűÓ!âöð âM,:G Sü]Œg®oAv1{l~暊}¼y>t#mƒdZ=OàB–5Ž'ù ûúüë@ÝÏtÁô©¬ž“•õ뇋ƒä€€ä€‹ƒê‡ô“•«ž©Ã´tÁÏCÝûëúú ø'•5àB=KàVUakj rxu|ÿv|x rljWaâV9KŒ>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢à¬á¸åůÓâøðÿÿßO,:GSþ]g­oBv0{l~暊}»y?t#m‚d‚Zt»yŠ}šæl~1{?v­o‹gÿ]SG:P,áñð â°ÓæÅâ¸á¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ø0Š>?KáVValj rxv|ÿv|x rkjVaáV>KŠ>ÿ0¾"òõ çqØlʽŰ~¥~›Þ’Á‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ±Ó âòðáQ,:GSÿ]Œg®o@v1{k~暊}»y>t"m†dZAOáB“5Ž'ö ÷úüë@ÝÏuÁÇ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´wÁÏCÝ÷ëúú ø'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0½" ùõçoØjʽð}¥}›Ý’Ä‹E†w‚f€€”Є¿‰Tq˜¢Ý¬ä¸èŲÓ"âóð ãK,:G!S^g¯o@v1{k~暉}¼y=t!m…d€Z?OßB™5'ü öúûë?ÝÏsÁÆ´©®ž“•öꇊƒä€€ä€‹ƒé‡õ’•¬ž©Ä´xÁÏDÝøëûú úŠ'–5äB=O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>ü0»"÷õçuØiÊ"½Â°{¥|›Ü’ËD†w‚f€€•΄¿‰Us˜¢Þ¬å¸âÅ´Óâõðüÿ åL,:G"Sü]Žg«oAv2{l~暉}¼yOÞB—5‹'ú üúùëEÝÏyÁÄ´©¬ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ßB?O€Z…d m=t¼y‰}šæk~1{@v¯ogû]!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›|¥Ã°½jÊvØçøõ¼"ý0ˆ>ú0Á" õõçsØgÊ!½Á°€¥{›ß’ËF†w‚f€€•Ï„À‰Rt˜¢à¬ç¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ] SG:I,âòð!â±ÓçÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Ý’~›~¥Ä°½kÊpØ çòõ ¾"þ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸åŰÓâñðàP,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OáB”5'÷ øúýëAÝÏvÁÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô”•ªž©Â´vÁÏBÝþëùú ÷'”5âB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:O,àÿÿøðâ°ÓåÅá¸á¬¢t˜RÁ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊrØ çôõÀ"ù0‹>9KâVValj rxv|ÿv|x rkjUaáV>K‰>þ0¾" òõçpØkʽİ}¥}›Ý’Å‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸çűÓ!âòðâJ,:G Sÿ]Œg®o@v1{k~暉}ºy>t!m†dZ@OàB™5'õ ÷úüë@ÝÏtÁÆ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡õ••«ž ©Ã´wÁÏCÝ÷ëúú ù‘'–5ãB=OƒZƒd#m:KãVRamj rxv|ÿu|x rojTaåVü0¼"øõçvØjʽð|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸áųÓ#âôð äK,:G!Sû]g¯o@v2{k~暉}¼y=t$m…dZ?OÞB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Ä´rÁÏEÝùëüú ú‹'—5ÞB>O„Z„d$m=t¼y‰}šæk~2{Av«oŽgü]"SG:L,ä õðâ´ÓâÅå¸Þ¬¢r˜U¿‰Î„•€f€w‚D†Ã‹Ü’|›|¥Â°"½iÊuØç÷õ»"ü0Ž>û0Â"öõçtØhÊ!½Á°¥{›Û’ËD†w‚f€€•΄À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G"Sü]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rmjRaãV9KŒ>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†w‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâøðÿÿßO,:GSþ]g­oBv0{l~暊}»y?t#m‚dƒZt»yŠ}šæl~1{?v®o‹gÿ]SG:P,áòð â±ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ÿ0Š>>KáVValj rxv|ÿv|x rljVaáV>KŠ>ÿ0¿"óõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ±Ó âñðáP,:GSÿ]‹g®o?v1{l~暊}»y>t"m†dZAOáB“5Ž'ö øúýëAÝÏuÁÁ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´wÁÏBÝöëùú ø'•5âB9KãVRamj rxv|ÿu|x rkjUaàV=K‰>ý0½" ùõçoØkʽð}¥}›Ý’Ä‹E†w‚f€€”Є¿‰Tq˜¢Ý¬ä¸çŲÓ"âóð ãJ,:G S^g®o@v1{k~暉}ºy=t!m…d€Z?OßB™5'ü öúûë?ÝÏsÁÆ´©®ž“•öꇊƒä€€ä€‹ƒé‡õ‘•¬ž!©Ä´xÁÏDÝøëûú ùŠ'–5äB=O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaåVü0»"÷õçuØiÊ"½Â°|¥|›Ü’ËD†w‚f€€•΄¿‰Ur˜¢Þ¬å¸âÅ´Óâõð äL,:G"Sü]Žg«oAv2{k~暉}¼y=t$m„d„Z>OÞB—5‹'ú üúùëEÝÏrÁÄ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ÞB?OZ…d$m=t¼y‰}šæk~2{@v¯ogû]!SG:K,ä ôð#â³ÓáÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Ã°½jÊvØçøõ¼"ü0ˆ>ú0Á" õõçsØgÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Rs˜¢à¬ç¸ãŵÓâ÷ðþÿ ÞN,:G#Sý]g¬oAv0{l~暉}»ytºy‰}šæk~1{@v®oŒgÿ] SG:J,âòð!â±ÓçÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Å‹Ý’}›}¥Ä°½kÊpØçòõ ¾"þ0‰>>KáVUakj rxv|ÿv|x rljVaâV9K‹>ù0À"ôõ çrØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Rt˜¢á¬á¸åŰÓâøðÿÿàO,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OâB”5'÷ ùúþëBÝÏvÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô”•ªž©Á´vÁÏAÝýëøú ÷'”5áB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:P,àñðâ°ÓåÅâ¸á¬¢u˜SÁ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊqØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>KŠ>þ0¾" òõ çpØkʽİ~¥~›Ý’Á‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸çűÓ!âòðâI,:G Sÿ]Œg®o@v1{k~暊}ºy>t!m†dZ@OàBš5Ž'õ ÷úüë@ÝÏtÁÇ´©©ž“•ó뇊ƒä€€ä€‹ƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø‘'•5ãB:KãVRamj rxv|ÿu|x rojTaßVý0¼"øõçvØjʽð|¥}›Ý’Ä‹D†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áųÓ"âôð ãK,:G!Sû]g¯o@v1{k~暉}¼y=t m…d€Z?OßB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•¬ž©Ä´yÁÏEÝùëüú ú‹'—5ÞB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;K>û0º"öõçtØhÊ"½Á°¥{›Ü’ËD†w‚f€€•΄¿‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ åM,:G"Sü]Žg¬oAv0{l~暉}¼y=KàVTaoj rxu|ÿv|x rmjRaãV:KŒ>ù0À" õõ çsØgÊ ½À°¥z›ß’‹F†w‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâ÷ðþÿ ßN,:GSý]g­oBv0{l~暊}»yt»yŠ}šæk~1{@v®oŒgÿ]SG:Q,áòð â±ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Á‹Þ’~›~¥Å°½lÊqØ çòõ¾"ÿ0Š>>KáVVakj rxv|ÿv|x rljVaâV?KŠ>ø0¿"óõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢á¬â¸æÅ°Ó âñðáP,:GSÿ]‹g­o?v1{l~暊}»y>t"m†dZAOáB“5'ö øúýëAÝÏuÁÁ´©ªž”•ó뇊ƒä€€ä€Šƒë‡ô••«ž©Â´vÁÏBÝþëùú ÷'”5âB9KâVWalj rxv|ÿu|x rkjUaàV=K‰>þ0½" ùõçoØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Tq˜¢Ý¬ä¸çŲÓ!âóð âJ,:G S^Œg®o@v1{k~暉}ºy=t!m…d€Z@OàB™5'ü öúûë?ÝÏtÁÆ´©®ž“•óꇊƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´xÁÏDÝøëûú ùŠ'–5äB=O„Zƒd#m;KäVSamj rxu|ÿu|x rnjTaåVü0»"÷õçuØiÊ"½Â°|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸âÅ´Óâõð äL,:G"Sû]g«oAv2{k~暉}¼y=t$m„dZ>OÞB—5‹'û üúùëEÝÏrÁÅ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´rÁÏEÝúëýú ûŒ'˜5ÞB>OZ„d$m=t¼y‰}šæk~2{Av¯ogû]!SG:L,ä ôðâ³ÓáÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Â°½iÊvØçøõ¼"ü0ˆ>ú0Á"öõçtØhÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G#Sý]Žg¬oAv0{l~暉}¼ytºy‰}šæk~1{@v®oŒg^ SG:J,â óð!â²ÓçÅã¸Ü¬¢q˜S¾‰Ð„”€f€v‚E†Ä‹Ý’}›}¥Ä°½kÊpØçñõ ½"þ0‰>=KàVUakj rxv|ÿv|x rljWaâV9K‹>ù0À" ôõ çrØmʽ¿°¥z›Þ’‹F†v‚f€€•Ï„À‰Rt˜¢á¬á¸åůÓâøðÿÿàO,:GSþ]‹g­oBv0{l~暊}»y?t"m‚d‚Z;OâB”5'÷ ùúþëBÝÏvÁ´©ªž••ô뇊ƒå€€å€Šƒë‡ô”•ªž©Á´uÁÏAÝýëøú ö'”5áB;O‚Z‡d"m>t»yŠ}šæl~1{?v­o‹gþ]SG:P,àñðâ°ÓåÅâ¸á¬¢u˜SÁ‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½mÊqØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>KŠ>ÿ0¾"òõ çpØlʽİ~¥~›Þ’Á‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸æÅ±Ó âòðáQ,:GSÿ]Œg®o@v1{k~暊}ºy>t!m†dZ@OàBš5Ž'õ ÷úüë@ÝÏuÁÇ´©©ž”•ó뇊ƒä€€ä€Šƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø‘'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0¼"øõçvØjʽð|¥}›Ý’Ä‹D†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áųÓ"âôð ãK,:G!S^g¯o@v1{k~暉}¼y=t!m…d€Z?OßB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž“•öꇉƒä€€ä€‹ƒê‡õ’•¬ž©Ä´yÁÏDÝùëüú ú‹'—5ÝB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>û0»"÷õçuØhÊ"½Â°¥|›Ü’ËD†w‚f€€•΄¿‰Us˜¢ß¬æ¸âÅ´Óâõðüÿ åM,:G"Sü]Žg¬oAv0{l~暉}¼yOÝB—5‹'ú üúùëDÝÏxÁÄ´©¬ž’•õꇋƒä€€ä€‰ƒê‡ö“•­ž©Å´sÁÏ>Ýúëýú üŒ'˜5ßB?O€Z…d!m=t¼y‰}šæk~1{@v¯og^!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›}¥Ã°½jÊvØçøõ¼"ý0ˆ>=KàVTaoj rxu|ÿv|x rmjRaãV:KŒ>ú0Á" õõçsØgÊ ½À°€¥{›ß’ËF†w‚f€€•Ï„À‰Rt˜¢à¬à¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ]SG:Q,áòð â±ÓæÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Þ’~›~¥Ä°½lÊpØ çòõ¾"ÿ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØmʽŰ~¥y›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸åŰÓâñðáP,:GSþ]‹g­o?v1{l~暊}»y>t"m‡d‚Z;OáB“5'ö øúýëAÝÏuÁÁ´©ªž”•ô뇊ƒå€€ä€Šƒë‡ô••«ž©Â´vÁÏBÝþëùú ÷'”5âB9KâVWalj rxv|ÿv|x rkjUaàV=K‰>þ0½" ñõçpØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Tq˜¢Ý¬ã¸çŲÓ!âóð âJ,: G S^Œg®o@v1{k~暉}ºy>t!m†d€Z@OàB™5'õ öúûë?ÝÏtÁÆ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´xÁÏDÝøëûú ù‘'–5ãB=OƒZƒd#m:KäVSamj rxw|ÿu|x rnjTaåVü0¼"øõçuØiÊ#½Â°|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸áųÓâõð äL,:G!Sû]g¯oAv2{k~暉}¼y=t$m„dZ>OÞB˜5Œ'û ýúúëEÝÏrÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Å´rÁÏEÝùëüú û‹'—5ÞB>OZ„d$m=t¼y‰}šæk~2{Av«ogû]!SG:L,ä õðâ´ÓâÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Â°#½iÊuØç÷õ»"ü0‡>û0Â"öõçtØhÊ!½Á°€¥{›à’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G#Sý]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rljWaâV9K‹>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢á¬á¸åůÓâøðÿÿàO,:GSþ]g­oBv0{l~暊}»y?t"m‚d‚Zt»yŠ}šæl~1{?v­o‹gÿ]SG:P,áñð â°ÓæÅâ¸á¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ø0Š>?KâVValj rxv|ÿv|x rkjVaáV>KŠ>ÿ0¾"òõ çpØlʽŰ~¥~›Þ’Á‹E†v‚f€€”Є¾‰Su˜¢â¬ã¸æÅ±Ó âòðáQ,:GSÿ]Œg®o@v1{k~暊}ºy>t"m†dZAOáB“5Ž'ö ÷úüë@ÝÏuÁÇ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž ©Â´wÁÏCÝ÷ëúú ø'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0½"ùõçoØjʽð}¥}›Ý’Ä‹E†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áŲÓ"âôð ãK,:G!S^g¯o@v1{k~暉}¼y=t!m…d€Z?OßB˜5Œ'ü öúûë?ÝÏsÁÆ´©®ž“•öꇉƒä€€ä€‹ƒê‡õ’•¬ž©Ä´xÁÏDÝøëûú úŠ'–5äB=O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>û0»"÷õçuØiÊ"½Â°¥|›Ü’ËD†w‚f€€•΄¿‰Us˜¢Þ¬å¸âÅ´Óâõðüÿ åL,:G"Sü]Žg«oAv2{l~暉}¼yOÞB—5‹'ú üúùëEÝÏyÁÄ´©¬ž’•õꇋƒä€€ä€‹ƒê‡ö“•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ßB?O€Z…d m=t¼y‰}šæk~1{@v¯ogû]!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›|¥Ã°½jÊvØçøõ¼"ý0ˆ>ú0Á" õõçsØgÊ!½À°€¥{›ß’ËF†w‚f€€•Ï„À‰Rt˜¢à¬ç¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ] SG:Q,âòð!â±ÓçÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Ý’~›~¥Ä°½lÊpØ çòõ ¾"þ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸åŰÓâñðàP,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OáB”5'÷ øúýëAÝÏvÁÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô”•ªž©Â´vÁÏBÝþëùú ÷'”5âB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:O,àÿÿøðâ°ÓåÅá¸á¬¢t˜RÀ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊrØ çôõ À"ù0‹>9KâVValj rxv|ÿv|x rkjUaáV>K‰>þ0¾" òõçpØkʽİ}¥}›Ý’Å‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸çŲÓ!âóðâJ,:G Sÿ]Œg®o@v1{k~暉}ºy>t!m†dZ@OàB™5'õ ÷úüë@ÝÏtÁÆ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡õ••¬ž ©Ã´wÁÏCÝ÷ëúú ù‘'–5ãB=OƒZƒd#m:KãVRamj rxv|ÿu|x rojTaåVü0¼"øõçvØjʽð|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸áųÓâôð äK,:G!Sû]g¯oAv2{k~暉}¼y=t$m…dZ?OÞB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Ä´rÁÏEÝùëüú ú‹'—5ÞB>O…Z„d$m=t¼y‰}šæk~2{Av«oŽgü]"SG:L,ä õðâ´ÓâÅå¸Þ¬¢r˜U¿‰Î„•€f€w‚D†Ã‹Ü’|›|¥Â°"½iÊuØç÷õ»"ü0‡>û0Â"öõçtØhÊ!½Á°¥{›Û’ËD†w‚f€€•΄À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G"Sü]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rmjRaãV9KŒ>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâøðÿÿßO,:GSþ]g­oBv0{l~暊}»y?t#m‚dƒZt»yŠ}šæl~1{?v®o‹gÿ]SG:P,áñð â°ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ÿ0Š>?KáVValj rxv|ÿv|x rljVaáV>KŠ>ÿ0¿"óõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ±Ó âòðáP,:GSÿ]Œg®o?v1{l~暊}»y>t"m†dZAOáB“5Ž'ö øúüëAÝÏuÁÇ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´wÁÏBÝöëùú ø'•5âB9KãVRamj rxv|ÿu|x rkjUaàV=K‰>ý0½" ùõçoØkʽð}¥}›Ý’Ä‹E†w‚f€€”Є¿‰Tq˜¢Ý¬ä¸çŲÓ"âóð ãJ,:G S^g®o@v1{k~暉}½y=t!m…d€Z?OßB™5'ü öúûë?ÝÏsÁÆ´©®ž“•öꇊƒä€€ä€‹ƒé‡õ‘•¬ž!©Ä´xÁÏDÝøëûú ùŠ'–5äB=O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaåVü0»"÷õçuØiÊ"½Â°|¥|›Ü’ËD†w‚f€€•΄¿‰Ur˜¢Þ¬å¸âÅ´Óâõð äL,:G"Sü]Žg«oAv2{k~暉}¼y=t$m„d„Z>OÞB—5‹'ú üúùëEÝÏrÁÄ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ßB?OZ…d$m=t¼y‰}šæk~2{@v¯ogû]!SG:K,ä ôð#â³ÓáÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Ã°½jÊvØçøõ¼"ü0ˆ>ú0Á" õõçsØgÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Rs˜¢à¬ç¸ãŶÓâ÷ðþÿ ÞN,:G#Sý]g¬oAv0{l~暉}»ytºy‰}šæk~1{@v®oŒgÿ] SG:J,âòð!â±ÓçÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Ý’~›}¥Ä°½kÊpØçòõ ¾"þ0‰>>KáVUakj rxv|ÿv|x rljVaâV9K‹>ø0¿"ôõ çrØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Rt˜¢á¬á¸åŰÓâùðÿÿàO,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OâB”5'÷ ùúýëBÝÏvÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô”•ªž©Á´vÁÏAÝýëøú ÷'”5âB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:P,àñðâ°ÓåÅâ¸á¬¢u˜RÁ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊrØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>KŠ>þ0¾" òõçpØkʽİ~¥~›Ý’Á‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸çűÓ!âòðâJ,:G Sÿ]Œg®o@v1{k~暊}ºy>t!m†dZ@OàBš5Ž'õ ÷úüë@ÝÏtÁÇ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø‘'•5ãB=OƒZƒd#m:KãVRamj rxv|ÿu|x rojTaßVý0¼"øõçvØjʽð|¥}›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬ä¸áųÓ"âôð ãK,:G!Sû]g¯o@v2{k~暉}¼y=t m…dZ?OßB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•¬ž©Ä´yÁÏEÝùëüú ú‹'—5ÞB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;K>û0Â"öõçtØhÊ"½Á°¥{›Ü’ËD†w‚f€€•΄¿‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ åM,:G"Sü]Žg¬oAv0{l~暉}¼y=KàVTakj rxu|ÿv|x rmjRaãV:KŒ>ù0À" õõ çsØgÊ ½À°¥z›ß’‹F†w‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâøðþÿ ßN,:GSý]g­oBv0{l~暊}»yt»yŠ}šæl~1{@v®oŒgÿ]SG:P,áòð â±ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’~›~¥Å°½lÊqØ çòõ¾"ÿ0Š>>KáVValj rxv|ÿv|x rljVaáV?KŠ>ø0¿"óõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ°Ó âñðáP,:GSÿ]‹g­o?v1{l~暊}»y>t"m†dZAOáB“5'ö øúýëAÝÏuÁÁ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´vÁÏBÝöëùú ÷'”5âB9KâVWalj rxv|ÿu|x rkjUaàV=K‰>þ0½" ùõçoØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Tq˜¢Ý¬ä¸çŲÓ!âóð âJ,:G S^Œg®o@v1{k~暉}ºy=t!m…d€Z@OßB™5'ü öúûë?ÝÏtÁÆ´©®ž“•óꇊƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´xÁÏDÝøëûú ùŠ'–5äB=O„Zƒd#m;KäVSamj rxu|ÿu|x rnjTaåVü0»"÷õçuØiÊ"½Â°|¥|›Ü’Ä‹D†w‚f€€”΄¿‰Ur˜¢Þ¬å¸âÅ´Óâõð äL,:G"Sü]g«oAv2{k~暉}¼y=t$m„dZ>OÞB—5‹'ú üúùëEÝÏrÁÅ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´rÁÏEÝúëýú ûŒ'˜5ÞB>OZ„d$m=t¼y‰}šæk~2{Av¯ogû]!SG:L,ä ôðâ³ÓáÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Ã°½iÊvØçøõ¼"ü0ˆ>ú0Á" öõçtØhÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬æ¸ãŵÓâ÷ðþÿ ÞN,:G#Sý]Žg¬oAv0{l~暉}»ytºy‰}šæk~1{@v®oŒg^ SG:J,â óð!â²ÓçÅã¸ã¬¢q˜S¾‰Ð„”€f€v‚E†Ä‹Ý’}›}¥Ä°½kÊpØçñõ ½"þ0‰>>KàVUakj rxv|ÿv|x rljWaâV9K‹>ù0À" ôõ çrØmʽ¿°¥z›Þ’‹F†v‚f€€•Ï„À‰Rt˜¢á¬á¸åůÓâøðÿÿàO,:GSþ]‹g­oBv0{l~暊}»y?t"m‚d‚Z;OâB”5'÷ ùúþëBÝÏvÁ´©ªž••ô뇊ƒå€€å€Šƒë‡ô”•ªž©Á´vÁÏAÝýëøú ö'”5áB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:P,àñðâ°ÓåÅâ¸á¬¢u˜SÁ‰Ï„”€f€v‚E†Â‹Þ’z›~¥Å°½mÊqØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>KŠ>þ0¾"òõ çpØlʽİ~¥~›Þ’Á‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸æÅ±Ó âòðâQ,:GSÿ]Œg®o@v1{k~暊}ºy>t!m†dZ@OàBš5Ž'õ ÷úüë@ÝÏuÁÇ´©©ž”•ó뇊ƒä€€ä€‹ƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø‘'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0¼"øõçvØjʽð|¥}›Ý’Ä‹D†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áųÓ"âôð ãK,:G!Sû]g¯o@v1{k~暉}¼y=t m…d€Z?OßB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž“•öꇉƒä€€ä€‹ƒê‡õ’•¬ž©Ä´yÁÏEÝùëüú ú‹'—5ÝB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>û0»"÷õçtØhÊ"½Â°¥|›Ü’ËD†w‚f€€•΄¿‰Qs˜¢ß¬æ¸âÅ´Óâöðýÿ åM,:G"Sü]Žg¬oAv0{l~暉}¼yOÝB—5‹'ú üúùëDÝÏxÁÄ´©¬ž’•õꇋƒä€€ä€‰ƒê‡ö“•­ž©Æ´sÁÏ?Ýúëýú üŒ'˜5ßB?O€Z…d!m=t¼y‰}šæk~1{@v¯og^!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›}¥Ã°½jÊoØçøõ¼"ý0ˆ>=KàVTaoj rxu|ÿv|x rmjRaãV:KŒ>ú0Á" õõçsØgÊ ½À°€¥z›ß’ËF†w‚f€€•Ï„À‰Rt˜¢à¬à¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ]SG:Q,áòð â±ÓæÅã¸â¬¢u˜S¾‰Ð„”€f€v‚E†Á‹Þ’~›~¥Ä°½lÊpØ çòõ¾"ÿ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØmʽŰ~¥y›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸åŰÓâñðáP,:GSþ]‹g­o?v1{l~暊}»y>t"m‡d‚Z;OáB“5'ö øúýëAÝÏuÁÁ´©ªž”•ó뇊ƒä€€ä€Šƒë‡ô••«ž©Â´vÁÏBÝþëùú ÷'”5âB9KâVWalj rxv|ÿv|x rkjUaàV=K‰>þ0½" ñõçoØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Tq˜¢Ý¬ã¸çŲÓ!âóð âJ,: G S^Œg®o@v1{k~暉}ºy=t!m…d€Z@OàB™5'ü öúûë?ÝÏtÁÆ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´xÁÏDÝøëûú ù‘'–5ãB=OƒZƒd#m:KäVSamj rxw|ÿu|x rnjTaåVü0¼"÷õçuØiÊ#½Â°|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸áųÓâõð äL,:G!Sû]g«oAv2{k~暉}¼y=t$m„dZ>OÞB˜5‹'û ýúùëEÝÏrÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Å´rÁÏEÝùëüú û‹'—5ÞB>OZ„d$m=t¼y‰}šæk~2{Av«ogû]!SG:L,ä õðâ´ÓâÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Â°#½iÊuØç÷õ¼"ü0‡>û0Â"öõçtØhÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G#Sý]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rljWaâV9K‹>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢á¬á¸åůÓâøðÿÿàO,:GSþ]g­oBv0{l~暊}»y?t"m‚d‚Zt»yŠ}šæl~1{?v­o‹gþ]SG:P,áñð â°ÓæÅâ¸á¬¢u˜SÁ‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjVaáV>KŠ>ÿ0¾"òõ çpØlʽŰ~¥~›Þ’Á‹E†v‚f€€”Є¾‰Su˜¢â¬ã¸æÅ±Ó âòðáQ,:GSÿ]Œg®o@v1{k~暊}ºy>t"m†dZAOáB“5Ž'ö ÷úüë@ÝÏuÁÇ´©©ž”•ó뇊ƒä€€ä€Šƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0½"øõçoØjʽð}¥}›Ý’Ä‹D†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áŲÓ"âôð ãK,:G!S^g¯o@v1{k~暉}¼y=t!m…d€Z?OßB˜5Œ'ü þúúë?ÝÏsÁÆ´©®ž“•öꇉƒä€€ä€‹ƒê‡õ’•¬ž©Ä´xÁÏDÝøëûú úŠ'—5äB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>û0»"÷õçuØiÊ"½Â°¥|›Ü’ËD†w‚f€€•΄¿‰Us˜¢Þ¬å¸âÅ´Óâõðüÿ åL,:G"Sü]Žg¬oAv2{l~暉}¼yOÞB—5‹'ú üúùëEÝÏyÁÄ´©¬ž’•õꇋƒä€€ä€‹ƒê‡ö“•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ßB?O€Z…d m=t¼y‰}šæk~1{@v¯ogû]!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›|¥Ã°½jÊvØçøõ¼"ý0ˆ>=KàVTaoj rxu|ÿv|x rmjRaãV:KŒ>ú0Á" õõçsØgÊ ½À°€¥{›ß’ËF†w‚f€€•Ï„À‰Rt˜¢à¬ç¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ] SG:Q,âòð!â±ÓæÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Ý’~›~¥Ä°½lÊpØ çòõ¾"þ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸åŰÓâñðàP,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OáB”5'÷ øúýëAÝÏvÁÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô”•ªž©Â´vÁÏBÝþëùú ÷'”5âB;O‚Z‚d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:O,àÿÿøðâ°ÓåÅá¸á¬¢t˜RÀ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊrØ çôõ À"ù0‹>9KâVValj rxv|ÿv|x rkjUaáV>K‰>þ0¾" ñõçpØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸çŲÓ!âóð âJ,:G Sÿ]Œg®o@v1{k~暉}ºy>t!m†dZ@OàB™5'õ ÷úûë@ÝÏtÁÆ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´wÁÏCÝ÷ëúú ù‘'–5ãB=OƒZƒd#m:KãVRamj rxv|ÿu|x rnjTaåVü0¼"øõçvØjʽð|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸áųÓâôð äK,:G!Sû]g¯oAv2{k~暉}¼y=t$m…dZ?OÞB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Å´rÁÏEÝùëüú ú‹'—5ÞB>O…Z„d$m=t¼y‰}šæk~2{Av«ogü]"SG:L,ä õðâ´ÓâÅå¸Þ¬¢r˜U¿‰Î„”€f€w‚D†Ä‹Ü’|›|¥Â°"½iÊuØç÷õ»"ü0‡>û0Â"öõçtØhÊ!½Á°€¥{›à’ËD†w‚f€€•΄À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G#Sü]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rmjWaãV9KŒ>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâøðÿÿßO,:GSþ]g­oBv0{l~暊}»y?t#m‚d‚Zt»yŠ}šæl~1{?v­o‹gÿ]SG:P,áñð â°ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ÿ0Š>?KáVValj rxv|ÿv|x rljVaáV>KŠ>ÿ0¾"òõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ±Ó âòðáP,:GSÿ]Œg®o?v1{l~暊}»y>t"m†dZAOáB“5Ž'ö øúüëAÝÏuÁÇ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´wÁÏBÝöëùú ø'•5âB:KãVRamj rxv|ÿu|x rkjUaàV=K‰>ý0½" ùõçoØjʽð}¥}›Ý’Ä‹E†w‚f€€”Є¿‰Tq˜¢Ý¬ä¸èŲÓ"âóð ãK,:G S^g®o@v1{k~暉}¼y=t!m…d€Z?OßB™5'ü öúûë?ÝÏsÁÆ´©®ž“•öꇊƒä€€ä€‹ƒé‡õ‘•¬ž©Ä´xÁÏDÝøëûú ùŠ'–5äB=O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaåVü0»"÷õçuØiÊ"½Â°|¥|›Ü’ËD†w‚f€€•΄¿‰Ur˜¢Þ¬å¸âÅ´Óâõðüÿ äL,:G"Sü]Žg«oAv2{k~暉}¼y=t$m„d„Z>OÞB—5‹'ú üúùëEÝÏrÁÄ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ßB?OZ…d%m=t¼y‰}šæk~2{@v¯ogû]!SG:K,ä ôð"â³ÓáÅä¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Ã°½jÊvØçøõ¼"ý0ˆ>ú0Á" õõçsØgÊ!½Á°€¥{›ß’ËF†w‚f€€•Ï„À‰Rs˜¢à¬ç¸äŶÓâ÷ðþÿ ÞN,:G#Sý]g¬oAv0{l~暉}»ytºy‰}šæk~1{@v®oŒgÿ] SG:J,âòð!â±ÓçÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Ý’~›}¥Ä°½kÊpØçòõ ¾"þ0‰>>KáVUakj rxv|ÿv|x rljVaâV9K‹>ø0¿"óõ çrØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Ru˜¢á¬â¸åŰÓâùðàO,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OâB”5'÷ ùúýëAÝÏvÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô”•ªž©Â´vÁÏAÝýëøú ÷'”5âB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:O,àùðâ°ÓåÅâ¸á¬¢u˜RÁ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊrØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>K‰>þ0¾" òõçpØkʽİ}¥~›Ý’Á‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸çűÓ!âòðâJ,:G Sÿ]Œg®o@v1{k~暉}ºy>t!m†dZ@OàBš5Ž'õ ÷úüë@ÝÏtÁÇ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø‘'•5ãB=OƒZƒd#m:KãVRamj rxv|ÿu|x rojTaßVý0¼"øõçvØjʽð|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬ä¸áųÓ"âôð äK,:G!Sû]g¯o@v2{k~暉}¼y=t%m…dZ?OßB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Ä´yÁÏEÝùëüú ú‹'—5ÞB>O„Z„d$m=t¼y‰}šæk~2{Av«oŽgü]"SG:L,å üÿõðâ´ÓâÅå¸Þ¬¢r˜U¿‰Î„•€f€w‚D†Ã‹Ü’|›|¥Â°"½iÊuØç÷õ»"ü0Ž>û0Â"öõçtØhÊ"½Á°¥{›Ü’ËD†w‚f€€•΄À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÝM,:G"Sü]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rmjRaãV:KŒ>ù0À" ôõ çsØgÊ ½À°¥z›ß’‹F†w‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâøðÿÿ ßO,:GSý]g­oBv0{l~暊}»y;t#mƒdƒZt»yŠ}šæl~1{?v®oŒgÿ]SG:P,áòð â±ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çòõ¾"ÿ0Š>>KáVValj rxv|ÿv|x rljVaáV?KŠ>ø0¿"óõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ°Ó âñðáP,:GSÿ]‹g­o?v1{l~暊}»y>t"m†dZAOáB“5'ö øúýëAÝÏuÁÁ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´vÁÏBÝöëùú ÷'•5âB9KãVWamj rxv|ÿu|x rkjUaàV=K‰>ý0½" ùõçoØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Tq˜¢Ý¬ä¸çŲÓ!âóð ãJ,:G S^Œg®o@v1{k~暉}ºy=t!m…d€Z@OßB™5'ü öúûë?ÝÏtÁÆ´©®ž“•öꇊƒä€€ä€‹ƒé‡õ‘•¬ž!©Ä´xÁÏDÝøëûú ùŠ'–5äB=O„Zƒd#m;KäVSamj rxu|ÿu|x rnjTaåVü0»"÷õçuØiÊ"½Â°|¥|›Ü’Ä‹D†w‚f€€”΄¿‰Ur˜¢Þ¬å¸âÅ´Óâõð äL,:G"Sü]g«oAv2{k~暉}¼y=t$m„d…Z>OÞB—5‹'ú üúùëEÝÏrÁÅ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´sÁÏFÝúëýú ûŒ'˜5ÞB?OZ…d$m=t¼y‰}šæk~2{Av¯ogû]!SG:K,ä ôðâ³ÓáÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Ã°½jÊvØçøõ¼"ü0ˆ>ú0Á" õõçsØhÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬ç¸ãŵÓâ÷ðþÿ ÞN,:G#Sý]Žg¬oAv0{l~暉}»ytºy‰}šæk~1{@v®oŒgÿ] SG:J,â óð!â²ÓçÅã¸ã¬¢q˜S¾‰Ð„”€f€v‚E†Ä‹Ý’}›}¥Ä°½kÊpØçñõ ½"þ0‰>>KàVUakj rxv|ÿv|x rljVaâV9K‹>ù0À" ôõ çrØmʽ¿°¥z›Þ’‹E†v‚f€€•Ï„À‰Rt˜¢á¬á¸åůÓâøðÿÿàO,:GSþ]‹g­oBv1{l~暊}»y?t"m‚d‚Z;OâB”5'÷ ùúþëBÝÏvÁ´©ªž••ô뇊ƒå€€å€Šƒë‡ô”•ªž©Á´vÁÏAÝýëøú ö'”5áB;O‚Z‡d"m>t»yŠ}šæl~1{Bv­o‹gþ]SG:P,àñðâ°ÓåÅâ¸á¬¢u˜SÁ‰Ï„”€f€v‚E†Â‹Þ’z›¥¿°½mÊqØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>KŠ>þ0¾"òõ çpØlʽİ~¥~›Þ’Á‹E†v‚f€€”Є¾‰Sq˜¢â¬ã¸æÅ±Ó âòðâQ,:GSÿ]Œg®o@v1{k~暊}ºy>t!m†dZ@OàBš5Ž'õ ÷úüë@ÝÏtÁÇ´©©ž”•ó뇊ƒä€€ä€‹ƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø‘'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0¼"øõçvØjʽð|¥}›Ý’Ä‹D†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áųÓ"âôð ãK,:G!Sû]g¯o@v1{k~暉}¼y=t m…d€Z?OßB˜5Œ'û ýúúë>ÝÏsÁÅ´©­ž“•öꇋƒä€€ä€‹ƒê‡õ’•¬ž©Ä´yÁÏEÝùëüú ú‹'—5ÞB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>û0»"öõçtØhÊ"½Â°¥|›Ü’ËD†w‚f€€•΄¿‰Qs˜¢ß¬æ¸âÅ´Óâöðýÿ åM,:G"Sü]Žg¬oAv0{l~暉}¼yOäB—5Š'ú üúøëDÝÏxÁÄ´©¬ž’•õꇋƒä€€ä€‰ƒê‡ö“•®ž©Æ´sÁÏ?Ýúëþú üŒ'˜5ßB?O€Z…d!m=t¼y‰}šæk~1{@v¯og^!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›}¥Ã°½jÊoØçøõ½"ý0ˆ>=KàVTaoj rxu|ÿv|x rmjRaãV:KŒ>ú0Á" õõ çsØgÊ ½À°€¥z›ß’‹F†w‚f€€•Ï„À‰Rt˜¢à¬á¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ]SG:Q,áòð â±ÓæÅã¸â¬¢u˜S¾‰Ð„”€f€v‚E†Á‹Þ’~›~¥Å°½lÊpØ çòõ¾"ÿ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸æÅ°Ó âñðáP,:GSþ]‹g­o?v1{l~暊}»y>t"m‡d‚Z;OáB“5'ö øúýëAÝÏuÁÁ´©ªž”•ó뇊ƒä€€ä€Šƒë‡ô••«ž©Â´vÁÏBÝþëùú ÷'”5âB9KâVWalj rxv|ÿv|x rkjUaàV=K‰>þ0½" ñõçoØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Tq˜¢Ý¬ã¸çŲÓ!âóð âJ,: G S^Œg®o@v1{k~暉}ºy=t!m…d€Z@OàB™5'ü öúûë?ÝÏtÁÆ´©®ž“•óꇊƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´xÁÏDÝøëûú ùŠ'–5ãB=O„Zƒd#m;KäVSamj rxw|ÿu|x rnjTaåVü0¼"÷õçuØiÊ#½Â°|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸âųÓâõð äL,:G!Sû]g«oAv2{k~暉}¼y=t$m„dZ>OÞB—5‹'û ýúùëEÝÏrÁÅ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©Å´rÁÏEÝùëýú û‹'—5ÞB>OZ„d$m=t¼y‰}šæk~2{Av«ogû]!SG:L,ä õðâ³ÓâÅå¸Þ¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ü’|›|¥Â°#½iÊuØç÷õ¼"ü0‡>ú0Â"öõçtØhÊ!½Á°€¥{›ß’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G#Sý]Žg¬oAv0{l~暉}¼y=KàVUakj rxv|ÿv|x rljWaâV9K‹>ù0À" ôõ çrØmÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢á¬á¸åůÓâøðÿÿàO,:GSþ]g­oBv0{l~暊}»y?t"m‚d‚Zt»yŠ}šæl~1{?v­o‹gþ]SG:P,áñð â°ÓæÅâ¸á¬¢u˜SÁ‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ø0‹>?KâVValj rxv|ÿv|x rkjUaáV>KŠ>ÿ0¾"òõ çpØlʽŰ~¥~›Þ’Á‹E†v‚f€€”Є¾‰Su˜¢â¬ã¸æÅ±Ó âòðáQ,:GSÿ]Œg®o@v1{k~暊}ºy>t"m†dZ@OàB“5Ž'õ ÷úüë@ÝÏuÁÇ´©©ž”•ó뇊ƒä€€ä€Šƒé‡ô••«ž ©Ã´wÁÏCÝ÷ëúú ø'•5ãB:KãVRamj rxv|ÿu|x rojTaàV=Kˆ>ý0½"øõçoØjʽð}¥}›Ý’Ä‹D†w‚f€€”Є¿‰Tr˜¢Ý¬ä¸áųÓ"âôð ãK,:G!S^g¯o@v1{k~暉}¼y=t!m…d€Z?OßB˜5Œ'ü þúúë?ÝÏsÁÆ´©®ž“•öꇉƒä€€ä€‹ƒê‡õ’•¬ž©Ä´xÁÏDÝøëüú ú‹'—5ÝB>O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaäV;KŽ>û0»"÷õçuØiÊ"½Â°¥|›Ü’ËD†w‚f€€•΄¿‰Us˜¢ß¬æ¸âÅ´Óâõðüÿ åL,:G"Sü]Žg¬oAv0{l~暉}¼yOÝB—5‹'ú üúùëEÝÏyÁÄ´©¬ž’•õꇋƒä€€ä€‹ƒê‡ö“•­ž©Å´sÁÏ>Ýúëýú ûŒ'˜5ßB?O€Z…d m=t¼y‰}šæk~1{@v¯ogû]!SG:K,ã ôð"â³ÓáÅä¸Ý¬¢r˜T¿‰Ð„”€f€w‚D†Ä‹Ý’}›|¥Ã°½jÊvØçøõ¼"ý0ˆ>=KàVTaoj rxu|ÿv|x rmjRaãV:KŒ>ú0Á" õõçsØgÊ ½À°€¥{›ß’ËF†w‚f€€•Ï„À‰Rt˜¢à¬à¸äŶÓâ÷ðþÿ ßN,:G#Sý]g¬oBv0{l~暊}»ytºyŠ}šæk~1{@v®oŒgÿ]SG:Q,âòð â±ÓæÅã¸â¬¢q˜S¾‰Ð„”€f€v‚E†Á‹Þ’~›~¥Ä°½lÊpØ çòõ¾"þ0Š>>KáVUakj rxv|ÿv|x rljVaâV?K‹>ø0¿"óõ çqØmʽ¿°¥z›Þ’‹E†v‚f€€”Ï„Á‰Su˜¢á¬â¸åŰÓâñðàP,:GSþ]‹g­oBv1{l~暊}»y>t"m‡d‚Z;OáB”5'ö øúýëAÝÏvÁÁ´©ªž”•ô뇊ƒå€€å€Šƒë‡ô••ªž©Â´vÁÏBÝþëùú ÷'”5âB;O‚Z‚d"m?t»yŠ}šæl~1{Bv­o‹gþ]SG:O,àÿÿøðâ¯ÓåÅá¸á¬¢t˜RÀ‰Ï„•€f€v‚E†Â‹Þ’z›¥¿°½mÊrØ çôõ À"ù0‹>9KâVValj rxv|ÿv|x rkjUaàV>K‰>þ0½" ñõçpØkʽİ}¥}›Ý’Ä‹E†v‚f€€”Є¾‰Sq˜¢ã¬ã¸çŲÓ!âóð âJ,:G Sÿ]Œg®o@v1{k~暉}ºy>t!m†d€Z@OàB™5'õ ÷úûë@ÝÏtÁÆ´©®ž“•ó뇊ƒä€€ä€‹ƒé‡õ‘•¬ž ©Ã´xÁÏCÝ÷ëûú ù‘'–5ãB=OƒZƒd#m:KãVRamj rxw|ÿu|x rnjTaåVü0¼"øõçvØjʽð|¥|›Ü’Ä‹D†w‚f€€”Є¿‰Tr˜¢Þ¬å¸áųÓâôð äK,:G!Sû]g¯oAv2{k~暉}¼y=t$m…dZ?OÞB˜5Œ'û ýúúëFÝÏrÁÅ´©­ž’•öꇋƒä€€ä€‹ƒê‡õ’•­ž©Å´rÁÏEÝùëüú ú‹'—5ÞB>O…Z„d$m=t¼y‰}šæk~2{Av«ogü]"SG:L,ä õðâ´ÓâÅå¸Þ¬¢r˜U¿‰Î„”€f€w‚D†Ä‹Ü’|›|¥Â°"½iÊuØç÷õ»"ü0‡>û0Â"öõçtØhÊ!½Á°€¥{›à’ËD†w‚f€€•Ï„À‰Qs˜¢ß¬æ¸ãŵÓâöðýÿ ÞM,:G#Sü]Žg¬oAv0{l~暉}¼y=KàVUakj rxu|ÿv|x rmjWaãV9KŒ>ù0À" ôõ çrØfÊ ½À°¥z›ß’‹F†v‚f€€•Ï„À‰Rt˜¢à¬á¸äůÓâøðÿÿßO,:GSþ]g­oBv0{l~暊}»y?t#m‚d‚Zt»yŠ}šæl~1{?v­o‹gÿ]SG:P,áñð â°ÓæÅâ¸â¬¢u˜S¾‰Ï„”€f€v‚E†Â‹Þ’y›~¥Å°½lÊqØ çóõ¿"ø0Š>?KáVValj rxv|ÿv|x rljVaáV>KŠ>ÿ0¾"òõ çqØlʽŰ~¥y›Þ’‹E†v‚f€€”Ï„¾‰Su˜¢â¬â¸æÅ±Ó âòðáP,:GSÿ]Œg®o?v1{l~暊}»y>t"m†dZAOáB“5Ž'ö ÷úüë@ÝÏuÁÇ´©ªž”•ó뇊ƒä€€ä€Šƒì‡ô••«ž©Â´wÁÏBÝ÷ëúú ø'•5âB:KãVRamj rxv|ÿu|x rkjUaàV=K‰>ý0½" ùõçoØjʽð}¥}›Ý’Ä‹E†w‚f€€”Є¿‰Tq˜¢Ý¬ä¸èŲÓ"âóð ãK,:G S^g®o@v1{k~暉}¼y=t!m…d€Z?OßB™5'ü öúûë?ÝÏsÁÆ´©®ž“•öꇊƒä€€ä€‹ƒé‡õ‘•¬ž©Ä´xÁÏDÝøëûú ùŠ'–5äB=O„Z„d$m;KäVSanj rxu|ÿu|x rnjSaåVü0»"÷õçuØiÊ"½Â°{¥|›Ü’ËD†w‚f€€•΄¿‰Ur˜¢Þ¬å¸âÅ´Óâõðüÿ åL,:G"Sü]Žg«oAv2{k~暉}¼y=t$m„d„Z>OÞB—5‹'ú üúùëEÝÏyÁÄ´©­ž’•õꇋƒä€€ä€‹ƒê‡ö’•­ž©¿´zÁÏ>Ýìýú ó”'˜5ßB8O…Z…d m@t¼y‰}šæk~2{Cv«og^SG:S,Ü üðâ³ÓèÅÞ¸Þ¬¢w˜P¿‰Ð„–€f€v‚G†Ä‹Ü’x›‚¥Ã°½cÊvØçðõ ¼"õ0>ú0Á" õõ çlØgÊ!½Ç°z¥{›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äÅ®Ó%â÷ðþÿæN,:#G#Sý]Šg°oBv0{k~暊}¹y>KáVPapj rxw|ÿt|x rqjQaâV?K„>ø0¿" óõ çyØfʽŰy¥z›Þ’Å‹C†v‚f€€•Ï„¾‰Vu˜¢Û¬è¸åŰÓâùðèO,:G$Sþ]‹g©oBv1{k~暊}½y;t"m‡d|Z;OâB›5ˆ'÷ ûõëAÝÏoÁÁ´©¯ž•ô뇌ƒä€€ä€Œƒë‡ô•¯ž©Â´oÁÏAÝöëû ÷ˆ'›5âB;O|Z‡d"m;t½yŠ}šæk~1{Bv©o‹gþ]$SG:O,èùðâ°ÓåÅè¸Û¬¢t˜V½‰Ï„•€f€v‚C†Å‹Þ’z›y¥Æ°½fÊyØ çóõ ¿"ø0„>?KâVQaqj rxt|ÿw|x rpjPaáV>K>÷0¾" ÿòõçwØdʽ݃¥y›Ý’Å‹B†v‚f€€•Є¾‰Ov˜¢Ü¬ê¸çűÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~嚉}½y:t!m†d†Z:OàB™5•'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•±ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'5ãB=O~Zˆd#mAKãVRaijrxu|ÿw|x rojYaßVõ0¼" ðõçvØqʽð‚¥x›Ü’Ä‹G†v‚f€€–Є¿‰Pw˜¢Þ¬Þ¸èųÓâüð ÜS,:GS^g«oDv2{k~暉}¼y@t m…d…Z8OßB˜5“'ó ýúì>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´rÁ ÏEÝùëôú ú‹'5åB>OZ‰d$m=t¹y‹}šæm~0{Av¯o‰gü]"S!G:L,äüÿõð#â¬ÓâÅå¸ä¬ÿ¡r˜U‰΄•€g€w‚D†À‹à’|›|¥È°"½iÊmØç÷õÿÃ"ü0‡>BKåVSajjrxu|ÿw|x rnjXaÞV;K>1º" îõçtØoʽÁ°¥€›Ü’ËF†u‚f€€“Ñ„À‰Qx˜¢ß¬ß¸êŵÓâîð ÝT,:GS^Žg¬o>v2{l~晉}¼y@tm„d„ZDOÝB–5’'ò ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•¨ž#©Æ´sÁÿÎGÝûëöú ü'‘5æB?O€Z€d%m=tºy‹}šæl~/{@v®o‘gû] S G:K,ãúÿóð"âºÓàÅä¸ã¬þ¡q˜T‰΄”€e€w‚E†Á‹á’}›}¥½°$½jÊoØçùõÄ"ý0‰>7KæVUakjrxu|ÿv|x rmjWaÝV9KŒ>1¹" üõçsØnʽÀ°¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ÝŶÓâððßG, :GS^g­o?v2{l~曈}»y?tm‚dƒZBOÜB•5' ùúþë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©Ç´uÁÏHÝüëøú þŽ'“5ÚBAOZd&m>t»yˆ}šæl~/{?v®ogù]SG":I,áùÿòð â¸ÓßÅâ¸â¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¾°%½lÊqØçúõ·"ÿ0Š>8KçVValj rxv|ÿv|x rljVaçV8KŠ>ÿ0·"ûõçqØlÊ%½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢â¬â¸ßÅ¸Ó âñðøÿáI,":GSù]g­o?v/{l~暈}»y>t&mdZAOÚB“5Ž'þ øúýëHÝÏuÁÇ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´vÁÏ;Ýþëùú ÿ'•5ÛBBO‚Z‚dm?t»yˆ}›æl~3{?v­ogø]SG!:G,ßððâ¶ÓÝÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Û’›¥À°½nÊrØçüõ ¸"1Œ>9KÝVWamj rxv|ÿu|xrkjUaæV7K‰>ý0Å"ùõçoØkÊ$½½°}¥}›á’Á‹E†w‚e€€”΄‰Tq˜þ¡ã¬ä¸àźÓ!âóðúÿãJ,: G Sú]‘g®o@v/{l~æš‹}ºy=t%m€d€Z?OæB’5'ü öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ’'–5ÝBCO„Zƒdm?t¼y‰}™æl~2{>v¬oŽg^SG:U,Þ îðâµÓêÅ߸߬¢n˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>;KÞVXanj rxw|ÿu|xrjjTaåVBK‡>ü0Ã"ÿ÷õçnØiÊ"½È°|¥|›à’À‹D†w‚g€€”΄‰Ur˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G"Sü]‰g¯oAv0{m~æš‹}ºy=t$m‰dZ>OåB5‹'ú ôúùëEÝ ÏrÁÅ´!©§ž’•õ퇉ƒä€€å€‹ƒê‡ò—•­ž©¿´zÁÏ>Ýìýú ó“'˜5ÞB8O…Z…d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü üðâ³ÓèÅÞ¸Þ¬¢w˜P¿‰Ð„–€f€v‚G†Ä‹Ü’w›‚¥Ã°½qÊvØçðõ ¼"õ0>ú0Á" õõ çlØgÊ!½Ç°z¥{›ß’Æ‹D†w‚f€€•Ï„½‰Us˜¢æ¬ç¸ãÅ®Ó%â÷ðþÿæN,:#G#Sý]Šg°oAv0{j~暊}¹y>KáVPaoj rxw|ÿt|x rqjQaâV?K„>ù0À" ôõ çyØfʽưy¥z›Þ’Å‹C†v‚f€€•Ï„½‰Vt˜¢Û¬è¸åŰÓâøðÿÿèO,:G$Sþ]‹g±oBv1{k~暊}½y;t"m‡d|Z;OâB›5ˆ'÷ ûöëBÝ ÏoÁ´©°ž•ô뇌ƒä€€ä€Œƒë‡ô•¯ž©Á´oÁÏAÝõëû ÷‡'›5áB;O|Z‡d"m;t½yŠ}šæk~1{Bv©o‹gþ]%SG:P,èùðâ°ÓåÅè¸Û¬¢u˜V¾‰Ï„•€f€v‚C†Å‹Þ’z›y¥Å°½eÊyØ çóõ ¿"ø0„>?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØdʽ݃¥y›Ý’Å‹B†v‚f€€•Є¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~嚊}½y:t!m†d†Z:OàBš5†'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'5ãB@KãVRaij rxu|ÿw|x rojYaàV=K>õ0¼" ðõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Þ¸èųÓâüð ÜS,:GS^g«oCv1{k~嚉}¼y@t m…d…Z9OßB˜5”'ó ýúòë>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´rÁ ÏEÝùëôú ú‹'5äB>OZ‰d$mBKäVSaijrxu|ÿw|x rnjXaÞV;KŽ>1»" îõçtØpʽ°¥€›Ü’ËF†u‚f€€“Ñ„¿‰Qw˜¢ß¬ß¸êÅ´Óâîð ÝT,:GS^Žg¬o>v2{l~晉}¼y@t m„d„ZDOÝB—5’'ò ûúì=ÝÏxÁÊ´©¬ž–•ñꇋƒå€€ä€‰ƒí‡ö“•¨ž"©Æ´sÁþÎFÝúëöú üŒ'‘5æB?O€Z€d%m=tºy‹}šæl~/{@v¯o‘gû]!S G:K,ãûÿôð"âºÓáÅä¸ã¬þ¡r˜T‰΄”€e€w‚E†Á‹á’}›}¥½°#½jÊoØçøõÄ"ý0ˆ>6KæVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°€¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ëŶÓâïð ßG, :GS^g­o?v2{l~曉}»y?tmƒdƒZBOÜB•5' úúÿë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•©ž©Ç´uÁÏHÝüë÷ú ýŽ'“5çBAOZd&m>tºyˆ}šæl~/{@v®ogù]SG":I,áùÿòð â¸ÓßÅã¸â¬¢q˜SÁ‰Í„”€f€x‚E†Á‹Ù’~›~¥¾°%½lÊpØçúõÆ"ÿ0Š>8KçVVakj rxv|ÿv|x rljVaçV8KŠ>ÿ0·"ûõçqØlÊ&½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ÞÅ¸Ó âñðøÿáH,":GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÚB“5'þ øúýëIÝÏuÁÈ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©È´vÁÏ:Ýþëùú ÿ'”5ÛBBO‚Z‚d'm?t»yˆ}šæl~3{?v­ogø]SG!:G,àððâ·ÓÝÅá¸á¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Ú’›¥À°½mÊrØçüõ ¸"1‹>9KÜVWalj rxv|ÿu|xrkjUaæV7K‰>þ0Å"ùõçoØkÊ$½½°}¥}›á’Á‹E†w‚e€€”΄Á‰Tq˜ý¡ã¬ã¸àŹÓ!âóðúÿâJ,: G Sú]‘g®o@v/{l~æš‹}ºy=t%m€d€Z@OæB’5'ü öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ‘'–5ÝBCO„Zƒdm?t¼y‰}™æl~2{>v¬oŽg^SG:F,Þ îðâµÓêÅà¸ß¬¢n˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>;KÞVXamj rxw|ÿu|xrjjTaåVBK‡>ü0Ã"ÿ÷õçnØiÊ#½¼°|¥|›à’À‹D†w‚g€€”΄‰Tr˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G!Sû]‰g¯oAv0{m~æš‹}ºy=t$m‰dZ>OåB5‹'û ôúùëEÝýÎrÁÅ´"©¨ž’•õ퇉ƒä€€å€‹ƒê‡ò—•­ž©¾´yÁÏ>Ýìýú ó“'˜5ÞB8O…Z„d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü üðâ³ÓéÅÞ¸Þ¬¢w˜P¿‰Ð„“€f€v‚G†Ä‹Ü’w›‚¥Â°½qÊuØçðõ ¼"õ0>ú0Â"öõ çlØhÊ!½Ç°{¥{›ß’À‹D†w‚f€€•Ï„½‰Us˜¢å¬æ¸ãÅ®Ó%âöðýÿæM,:#G#Sý]Šg°oAv0{j~暊}¹y=KàVPaoj rxw|ÿt|x rqjQaâV@K„>ù0À" ôõ çzØfÊ ½Æ°y¥z›ß’Å‹C†v‚f€€•Ï„½‰Vt˜¢Û¬è¸åůÓ&âøðÿÿçO,:G$Sþ]‹g±oBv0{k~暊}½y;t"m‡d}Z?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØdʽ݃¥y›Þ’Å‹C†v‚f€€•Є¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðÚQ,:G%Sÿ]ŒgªoCv1{k~暊}½y;t!m†d‡Z:OàBš5†'õ ÿúôë@ÝÏ|ÁÀ´©¯ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'œ5ãB@KãVRahj rxt|ÿw|x rojOaàV=K>ö0¼" ðõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Ý¸èųÓâüð ÛR,:GS^g«oCv1{k~嚉}¼y@t!m…d…Z9OßB˜5”'ô ýúòë>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´qÁ ÏDÝùëôú ú‹'5äB>O~Z‰d$mBKäVSaijrxu|ÿw|x rnjXaÞV;KŽ>1»" ïõçuØpʽ°¥w›Ü’ËF†u‚f€€“Є¿‰Qw˜¢ß¬ß¸éÅ´Óâíð ÝT,:GS^Žg¬o>v2{l~晉}¼y@t m„d„ZDOÝB—5’'ò üúì=ÝÏyÁ¾´©¬ž–•ñꇋƒå€€ä€‰ƒí‡ö“•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5æB?O€Z€d%m=tºy‹}šæm~/{@v¯o’gû]!S G:K,ãûÿôð"âºÓáÅä¸ã¬þ¡r˜T‰΄”€g€w‚D†Á‹á’}›|¥½°#½jÊoØçøõÄ"ý0ˆ>6KæVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ßG, :GS^g¬o?v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••øé‡‹ƒå€€ä€Šƒè‡÷”•©ž#©Ç´uÁÏHÝüë÷ú ýŽ'“5çB@OZd&m>tºyˆ}šæl~/{@v®o‘gú]SG#:I,âùÿòð â¹ÓßÅã¸â¬¢q˜SÁ‰Í„”€f€x‚E†Á‹â’~›~¥¾°%½lÊpØçúõÆ"þ0Š>8KçVUakjrxv|ÿv|x rljVaèV8K‹>ÿ0·"ûõçqØmÊ&½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ÞŸÓâñðàH,":GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÚB”5'þ øúýëIÝÏvÁÈ´©ªž”•÷臊ƒå€€å€Šƒé‡÷••ªž©È´vÁÏ:Ýþëùú ÿ'”5ÛBBO‚Z‚d'm?t»yˆ}šæl~3{?v­ogø]SG!:H,àððâ·ÓÞÅá¸á¬¢p˜RÀ‰Ñ„”€f€x‚F†Â‹Ú’›¥¿°½mÊrØçüõ ¸"1‹>9KèVWalj rxv|ÿv|xrkjUaæV7K‰>þ0Å"ùõçpØkÊ$½¾°}¥}›á’Á‹E†w‚e€€”΄Á‰Sq˜ý¡ã¬ã¸àŹÓ!âóðúÿâJ,:G Sú]‘g®o@v/{l~暈}ºy>t%md€Z@OçB’5'ý öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýÿëûú ñ‘'–5ÝBCOƒZƒdm?t»y‰}›æl~2{>v¬oŽg^SG:F,Þ ïðâµÓêÅà¸ß¬¢o˜QÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>:KÞVXamj rxw|ÿu|xrjjTaåV6Kˆ>ü0Ã"øõçnØiÊ#½¼°|¥|›à’À‹D†w‚g€€”΄‰Tr˜þ¡ä¬å¸áŬÓ#âôðûÿäL,:!G!Sû]‰g¯oAv/{m~æš‹}ºy=t$m€dZ>OåB5Œ'û õúúëEÝýÎrÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò–•­ž©¾´yÁÏ=Ýìüú ó“'—5ÞB8O…Z„d m@t¼y‰}™æk~2{Dv«og^SG:S,Ü íðâ´ÓéÅÞ¸Þ¬¢w˜Q¿‰Ð„“€f€v‚G†Ä‹Ü’w›¥Â°½pÊuØçïõ »"õ0Ž>û0Â"öõ çlØhÊ!½Ç°{¥{›à’À‹D†w‚f€€•Ï„½‰Us˜¢å¬æ¸ãÅ­Ó$âöðýÿæM,:"G#Sü]Šg°oAv0{j~暊}¹y=KàVPaoj rxw|ÿt|x rqjRaâV@K…>ù0À" ôõ çzØfÊ ½Æ°z¥z›ß’Æ‹C†v‚f€€•Ï„½‰Vt˜¢Ú¬è¸äůÓ&âøðÿÿçO,:G$Sþ]‹g±oBv0{k~暊}¾y;t#m‡d}Z?KáVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðéP,:G%Sÿ]ŒgªoCv1{k~暊}½y;t"m†d‡Z:OáBš5‡'ö ÿúôë@ÝÏ|ÁÁ´©¯ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž©Â´pÁ ÏBÝ÷ëòú ø‰'œ5âB@KãVRaqj rxt|ÿw|x rojOaàV=K>ö0½" ñõçwØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Ý¸èŲÓâûð ÛR,:GS^g«oCv1{k~嚉}¼y:t!m…d†Z9OßB™5”'ô þúóë?ÝÏzÁ¿´©®ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´qÁ ÏDÝøëóú ùŠ'5äB=O~Z‰d$mAKäVSaijrxu|ÿw|x rnjYaßV;KŽ>ô0»" ïõçuØpʽ°¥w›Ü’ËF†u‚f€€“Є¿‰Qw˜¢Þ¬ß¸éÅ´Óâíð ÝT,:GS^Žg«o>v2{l~晉}¼y@t m„d„Z8OÞB—5“'ò üúì=ÝÏyÁ¾´©¬ž–•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5åB?O€Z€d%m=tºy‹}šæm~/{@v¯o’gû]!S!G:K,ãûÿôð"â«ÓáÅä¸ä¬þ¡r˜T‰΄”€g€w‚D†Á‹á’}›|¥½°#½jÊnØçøõÄ"ý0ˆ>6KåVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÁ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ÞF, :GS^g¬o>v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••ñ釋ƒå€€ä€Šƒè‡÷“•©ž#©Ç´tÁÿÎHÝüë÷ú ýŽ'’5çB@OZd%m>tºyˆ}šæl~/{@v®o‘gú] SG#:J,âùÿòð!â¹ÓßÅã¸â¬¢q˜SÁ‰Í„”€e€x‚E†Á‹â’~›~¥¾°%½kÊpØçúõÅ"þ0Š>7KçVUakjrxv|ÿv|x rljVaèV9K‹>1¸"ûõçrØmÊ&½¿°¥›Ú’‹E†x‚f€€”Ñ„Á‰Sp˜¢á¬â¸ÞÅ·ÓâñðàH,!:GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÛB”5'þ øúýëIÝÏvÁÈ´©ªž”•÷臊ƒå€€å€Šƒé‡÷”•ªž©È´vÁÏIÝýëùú ÿ'”5ÛBBO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG!:H,àñðâ·ÓÞÅá¸á¬¢p˜RÁ‰Ñ„”€f€x‚E†Â‹Ú’›¥¿°&½mÊrØçüõ¸"1‹>9KèVValj rxv|ÿv|xrkjUaæV7K‰>þ0Å"úõçpØkÊ$½¾°}¥~›â’Á‹E†x‚e€€”΄Á‰Sq˜ý¡â¬ã¸àŹÓ!âòðùÿâJ,#:G Sú]‘g®o@v/{l~暈}ºy>t%mdZ@OçB’5Ž'ý ÷úüëGÝÿÎtÁÇ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ••«ž©É´wÁÏ<Ýÿëúú ‘'–5ÜBCOƒZƒdm?t»y‰}›æl~2{>v¬og^SG :F,Þ ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥Á°½oÊsØçíõ ¹"1>:KÝVWamj rxv|ÿu|xrjjTaåV6Kˆ>ü0Ä"øõçnØjÊ#½¼°|¥|›á’À‹D†w‚g€€”΄‰Tr˜þ¡ä¬å¸áŬÓ#âôðûÿäK,:!G!Sû]ˆg¯o@v/{m~æš‹}ºy=t$m€dZ?OåB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò–•­ž©¾´yÁÏ=Ýìüú ò“'—5ÞB8O„Z„d m@t¼y‰}™æk~2{>v«oŽg^SG:T,Ý íðâ´ÓéÅ߸ެ¢w˜Q¿‰Ð„“€f€u‚G†Ã‹Ü’w›¥Â°½pÊuØçïõ »"ô0Ž>û0Â"þöõ çmØhÊ!½È°{¥{›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸ãÅ­Ó$âöðýÿåM,:"G"Sü]‰g°oAv0{j~暊}¹y=KàVOaoj rxw|ÿt|x rqjRaãV@K…>ù0À" ôõ çkØgÊ ½Æ°z¥z›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äůÓ&âøðÿÿçO,:G$Sý]Šg±oBv0{k~暊}¾y;t#m‡d}Z>KáVQapj rxt|ÿt|x rpjQaáV?K‘>ø0¿" óõ çxØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Wu˜¢Ü¬é¸æÅ±ÓâùðéP,:G%Sÿ]‹gªoBv1{k~暊}½y;t"m†d‡Z;OáBš5‡'ö ûõëAÝÏ|ÁÁ´©¯ž•ó뇌ƒä€€ä€‰ƒì‡ô•°ž©Â´pÁ ÏBÝöëû øˆ'œ5âB@KãVRaqj rxt|ÿw|x rojOaàV=K>ö0½" ñõçwØcʽðƒ¥x›Ý’Ä‹G†v‚f€€•Є¾‰Pv˜¢Ý¬Ý¸çŲÓâûð ÛR,:G&S^ŒgªoCv1{k~嚉}½y:t!m…d†Z9OßB™5”'ô þúóë?ÝÏ{Á¿´©®ž—•óꇋƒã€€ä€‰ƒì‡õ‘•§ž!©Ä´qÁ ÏDÝøëóú ùŠ'5äB=O~Zˆd$mAKäVSaijrxu|ÿw|x rnjYaßVô0»" ïõçuØpʽ°¥w›Ü’ËG†u‚f€€“Є¿‰Qw˜¢Þ¬ß¸éÅ´Óâíð ÝT,:GS^Žg«o>v2{k~晉}¼y@t m„d…Z8OÞB—5“'ò üúì=ÝÏyÁ¾´©­ž–•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5åB?OZ€d$m=tºy‹}šæm~/{Av¯oˆgû]!S!G:K,äûÿôð#â¬ÓáÅå¸ä¬þ¡r˜T‰΄”€g€w‚D†À‹á’|›|¥¼°#½jÊnØçøõÄ"ü0ˆ>6KåVTajjrxu|ÿv|x rmjXaÝV:K>1º" íõçsØoʽÁ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŵÓâïð ÞF, :GS^g¬o>v2{l~曉}»y?tmƒdƒZCOÜB–5‘'ñ úúÿë<ÝÏwÁÊ´©¬ž••ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝüë÷ú ý'’5çB@OZd%m>tºyˆ}šæl~/{@v®o‘gú] SG#:J,âùÿóð!â¹ÓàÅã¸â¬ý¡q˜SÁ‰Î„”€e€x‚E†Á‹á’}›}¥¾°$½kÊpØçúõÅ"þ0‰>7KæVUakjrxv|ÿv|x rljVaèV9K‹>1¸" üõçrØmʽ¿°¥›Ú’‹E†x‚f€€”Ñ„Á‰Rp˜¢á¬á¸ÞÅ·ÓâððàH,!:GSù]g­o?v3{l~暈}»y>t&m‚d‚ZBOÛB”5'ÿ ùúþëIÝÏvÁÈ´©ªž”•÷释ƒå€€å€Šƒè‡÷”•ªž©È´vÁÏIÝýëøú þ'”5ÛBAO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG!:H,àñðâ·ÓÞÅâ¸á¬¢p˜SÁ‰Ñ„”€f€x‚E†Â‹Ú’›¥¿°&½mÊqØçûõ¸"1‹>9KèVValj rxv|ÿv|xrkjUaçV7KŠ>þ0Æ"úõçpØkÊ%½¾°~¥~›â’Á‹E†x‚e€€”Í„Á‰Sq˜¢â¬ã¸ßŹÓ!âòðùÿâI,#:G Sú]‘g®o@v/{l~暈}ºy>t&mdZ@OçB’5Ž'ý ÷úüëHÝÏtÁÇ´#©©ž“•÷臊ƒä€€å€‹ƒé‡ñ••«ž©É´wÁÏ;Ýÿëúú ‘'•5ÜBCOƒZƒdm?t»y‰}›æl~2{>v¬og^SG :F,ß ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥À°½nÊsØçýõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrjjTaåV6Kˆ>ý0Ä"øõçnØjÊ#½½°|¥}›á’Á‹D†w‚g€€”΄‰Tr˜þ¡ä¬ä¸áÅ«Ó"âôðûÿãK,: G!Sû]’g¯o@v/{m~æš‹}ºy=t%m€d€Z?OæB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž“•ö퇉ƒä€€å€‹ƒê‡ò–•¬ž©¾´yÁÏ=Ýìüú ò’'—5ÞBDO„Z„d m@t¼y‰}™æl~2{>v«oŽg^SG:T,Ý íðâ´ÓéÅ߸ެ¢w˜Q¿‰Ð„“€f€u‚F†Ã‹Ü’w›¥Â°½pÊuØçïõ »"ô0Ž>;KßVXanj rxw|ÿu|xrijSaäVBK‡>û0Â"þöõ çmØhÊ"½È°{¥{›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸ãÅ­Ó$âöðýÿåM,:"G"Sü]‰g°oAv0{m~暊}¹y=KàVOaoj rxw|ÿt|x rqjRaãV@K…>ù0Á" õõ çkØgÊ ½Æ°z¥z›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äůÓ&â÷ðþÿçN,:G$Sý]Šg°oBv0{k~暊}¾y>KáVPapj rxt|ÿt|x rpjQaâV?K‘>ø0¿" óõ çyØeʽŰy¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Wu˜¢Û¬é¸æÅ°ÓâùðèP,:G%Sÿ]‹g©oBv1{k~暊}½y;t"m†d‡Z;OáB›5‡'ö ûõëAÝÏ|ÁÁ´©¯ž•ó뇌ƒä€€ä€Œƒë‡ô•°ž©Â´oÁ ÏBÝöëû ÷ˆ'œ5âB@KâVRaqj rxt|ÿw|x rojPaàV=K>ö0½" ñõçwØdʽ݃¥x›Ý’Ä‹G†v‚f€€•Є¾‰Pv˜¢Ý¬ê¸çŲÓâûð ÛR,:G&S^ŒgªoCv1{k~嚉}½y:t!m…d†Z9OàB™5•'ô þúóë?ÝÏ{ÁÀ´©®ž˜•óꇋƒã€€ä€‰ƒì‡õ‘•§ž ©Ã´qÁ ÏDÝøëóú ùŠ'5äB=O~Zˆd#mAKäVSaijrxu|ÿw|x rnjYaßVõ0»" ïõçuØpʽ°¥w›Ü’Ä‹G†v‚f€€“Є¿‰Qw˜¢Þ¬Þ¸éÅ´Óâíð ÜS,:GS^g«oDv2{k~暉}¼y@t m„d…Z8OÞB—5“'ó üúì=ÝÏyÁ¾´©­ž—•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´rÁýÎEÝúëõú ûŒ'5åB>OZ‰d$m=tºy‹}šæm~/{Av¯o‰gû]!S!G:L,äûÿôð#â¬ÓáÅå¸ä¬ÿ¡r˜T‰΄”€g€w‚D†À‹à’|›|¥¼°#½iÊnØçøõÃ"ü0ˆ>6KåVTajjrxu|ÿw|x rmjXaÞV:K>1º" îõçtØoʽÁ°€¥€›Û’ËF†u‚f€€“Ñ„À‰Qo˜¢ß¬à¸êŵÓâïð ÞF,:GS^Žg¬o>v2{l~晉}¼y?tmƒdƒZCOÝB–5‘'ñ ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûëöú ü'’5çB@O€Zd%m>tºyˆ}šæl~/{@v®o‘gú] SG:J,âúÿóð!â¹ÓàÅã¸ã¬ý¡q˜TÁ‰Î„”€e€w‚E†Á‹á’}›}¥¾°$½kÊpØçùõÅ"þ0‰>7KæVUakjrxv|ÿv|x rljWaèV9K‹>1¸" üõçrØmʽÀ°¥›Ú’‹F†x‚f€€”Ñ„À‰Rp˜¢á¬á¸ÞÅ·ÓâððàH,!:GSø]g­o?v3{l~暈}»y?t'm‚d‚ZBOÛB”5'ÿ ùúþë:ÝÏvÁÈ´©«ž••÷释ƒå€€å€Šƒè‡÷”•ªž©È´uÁÏIÝýëøú þ'“5ÚBAO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG":H,áñðâ¸ÓÞÅâ¸á¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¿°&½mÊqØçûõ·"ÿ0‹>8KèVValj rxv|ÿv|xrkjUaçV8KŠ>ÿ0Æ"úõçpØlÊ%½¾°~¥~›Ù’Á‹E†x‚f€€”Í„Á‰Sq˜¢â¬ã¸ßÅ¸Ó âòðùÿáI,":GSú]g®o@v/{l~暈}ºy>t&mdZ@OçB“5Ž'ý ÷úüëHÝÏuÁÇ´$©©ž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´wÁÏ;Ýÿëúú ‘'•5ÜBCOƒZƒdm?t»y‰}›æl~2{?v¬og^SG :G,ß ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Ã‹Û’›€¥À°½nÊsØçýõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrjjTaæV6Kˆ>ý0Ä"øõçoØjÊ#½½°|¥}›á’Á‹D†w‚g€€”΄‰Tr˜þ¡ã¬ä¸áźÓ"âôðûÿãK,: G!Sû]’g¯o@v/{m~æš‹}ºy=t%m€d€Z?OæB‘5Œ'ü õúúëFÝþÎsÁÅ´"©¨ž“•ö퇉ƒä€€å€‹ƒê‡ñ–•¬ž©Ë´xÁÏ=Ýìüú ò’'—5ÝBDO„Z„d m@t¼y‰}™æl~2{>v¬oŽg^SG:T,Ý îðâ´ÓéÅ߸߬¢w˜Q¿‰Ñ„“€f€u‚F†Ã‹Ü’w›¥Â°½pÊuØçïõ »"1Ž>;KÞVXanj rxw|ÿu|xrijSaäVBK‡>û0Â"ÿ÷õ çmØiÊ"½È°{¥|›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸âÅ­Ó$âõðüÿåM,:"G"Sü]‰g¯oAv0{m~暊}¹yOäB5‹'ú ôúùëDÝ ÏrÁÄ´!©§ž’•õ쇉ƒä€€ã€‹ƒê‡ò—•­ž©¿´zÁÏ>Ýòëýú ô”'˜5ßB9O…Z…d!m@t¼y‰}šåk~1{Cv«og^SG:R,Û üðâ³ÓèÅ޸ݬ¢v˜P¿‰Ð„–€f€v‚G†Ä‹Ý’x›‚¥Ã°½cÊvØçðõ ¼"ö0>=KàVOaoj rxw|ÿt|x rhjRaãV@K…>ú0Á" õõ çkØgÊ ½Ç°z¥{›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äÅ®Ó%â÷ðþÿçN,:G#Sý]Šg°oBv0{k~暊}¹y>KáVPapj rxt|ÿt|x rpjQaâV?K„>ø0¿" óõ çyØeʽŰy¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Wu˜¢Û¬é¸åŰÓâùðèP,:G%Sþ]‹g©oBv1{k~暊}½y;t"m‡d‡Z;OáB›5‡'ö ûõëAÝÏnÁÁ´©¯ž•ô뇌ƒä€€ä€Œƒë‡ô•°ž©Â´oÁ ÏBÝöëû ÷ˆ'›5âB;O}Z‡d"m;t½yŠ}šæk~0{Bv±o‹gþ]$SG:O,èÿÿøð&â¯ÓåÅè¸Û¬¢t˜V½‰Ï„•€f€v‚C†Å‹Þ’z›y¥Æ°½fÊzØ çôõ À"ù0„>?KâVQaqj rxt|ÿw|x rojPaàV=K>ö0½" ñõçwØdʽ݃¥x›Ý’Ä‹B†v‚f€€•Є¾‰Pv˜¢Ý¬ê¸çŲÓâûð ÚQ,:G&S^ŒgªoCv1{k~嚉}½y:t!m†d†Z:OàB™5•'õ þúóë?ÝÏ{ÁÀ´©®ž˜•ó뇌ƒã€€ä€‰ƒì‡õ‘•±ž ©Ã´qÁ ÏCÝøëóú ùŠ'5ãB=O~Zˆd#mAKäVRaijrxu|ÿw|x rnjYaßVõ0¼" ðõçvØqʽ°‚¥w›Ü’Ä‹G†v‚f€€“Є¿‰Pw˜¢Þ¬Þ¸éųÓâüð ÜS,:GS^g«oDv2{k~暉}¼y@t m„d…Z8OÞB˜5“'ó ýúì>ÝÏyÁ¾´©­ž—•òꇋƒå€€ä€‰ƒí‡õ’•¨ž"©Å´rÁ ÏEÝùëôú û‹'5åB>OZ‰d$m=tºy‹}šæm~0{Av¯o‰gû]!S!G:L,äüÿõð#â¬ÓâÅå¸ä¬ÿ¡r˜T‰΄”€g€w‚D†À‹à’|›|¥¼°"½iÊnØç÷õÿÃ"ü0‡>BKåVTajjrxu|ÿw|x rmjXaÞV;K>1º" îõçtØoʽÁ°€¥€›Û’ËF†u‚f€€“Ñ„À‰Qn˜¢ß¬à¸êŵÓâîð ÞF,:GS^Žg¬o>v2{l~晉}¼y?tmƒd„ZCOÝB–5’'ñ ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûëöú ü'’5æB@O€Z€d%m=tºy‹}šæl~/{@v®o‘gú] S G:J,âúÿóð!â¹ÓàÅä¸ã¬ý¡q˜TÁ‰Î„”€e€w‚E†Á‹á’}›}¥½°$½kÊoØçùõÅ"þ0‰>7KæVUakjrxu|ÿv|x rljWaÝV9KŒ>1¸" üõçrØnʽÀ°¥›Ú’‹F†x‚f€€”Ñ„À‰Ro˜¢á¬á¸ÝÅ·ÓâððàG,!:GSø]g­o?v3{l~曈}»y?tm‚d‚ZBOÛB”5'ÿ ùúþë:ÝÏvÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©Ç´uÁÏIÝýëøú þ'“5ÚBAOZ‚d&m>t»yˆ}šæl~3{?v­ogù]SG":I,áøÿñð â¸ÓßÅâ¸á¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¿°%½lÊqØçûõ·"ÿ0Š>8KçVValj rxv|ÿv|x rkjVaçV8KŠ>ÿ0·"úõçqØlÊ%½¾°~¥~›Ú’Á‹E†x‚f€€”Í„Á‰Sp˜¢â¬â¸ßÅ¸Ó âòðùÿáI,":GSù]g®o@v/{l~暈}»y>t&mdZAOçB“5Ž'ý ÷úüëHÝÏuÁÇ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´wÁÏ;Ýÿëúú '•5ÜBBOƒZƒdm?t»yˆ}›æl~2{?v­og^SG :G,ß ððâ¶ÓëÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Û’›¥À°½nÊsØçýõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrkjTaæV6Kˆ>ý0Ä"ùõçoØjÊ$½½°}¥}›á’Á‹E†w‚e€€”΄‰Tr˜þ¡ã¬ä¸áźÓ"âóðúÿãK,: G!Sû]‘g¯o@v/{l~æš‹}ºy=t%m€d€Z?OæB‘5'ü öúûëFÝþÎsÁÆ´"©¨ž“•ö퇊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ=Ýìûú ò’'–5ÝBDO„Z„dm@t¼y‰}™æl~2{>v¬oŽg^SG:T,Ý îðâµÓêÅ߸߬¢x˜Q¿‰Ñ„“€f€u‚F†Ã‹Ü’€›¥Á°½pÊtØçîõ º"1>;KÞVXanj rxw|ÿu|xrjjSaäVBK‡>ü0Ã"ÿ÷õ çmØiÊ"½È°{¥|›à’À‹D†w‚g€€•΄¼‰Us˜ÿ¡ä¬å¸âÅ­Ó$âõðüÿåL,:"G"Sü]‰g¯oAv0{m~暊}¹yOäB5‹'ú ôúùëEÝ ÏrÁÄ´!©§ž’•õ쇉ƒä€€ã€‹ƒê‡ò—•­ž©¿´zÁÏ>Ýìýú ó”'˜5ßB9O…Z…d m@t¼y‰}šåk~1{Cv«og^SG:S,Ü üðâ³ÓèÅ޸ݬ¢v˜P¿‰Ð„–€f€v‚G†Ä‹Ý’x›‚¥Ã°½cÊvØçðõ ¼"õ0>ú0Á" õõ çlØgÊ!½Ç°z¥{›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äÅ®Ó%â÷ðþÿæN,:#G#Sý]Šg°oBv0{k~暊}¹y>KáVPapj rxt|ÿt|x rpjQaâV?K„>ø0¿" óõ çyØfʽŰy¥z›Þ’Å‹C†v‚f€€•Ï„¾‰Vu˜¢Û¬è¸åŰÓâùðèP,:G%Sþ]‹g©oBv1{k~暊}½y;t"m‡d|Z;OáB›5ˆ'÷ ûõëAÝÏoÁÁ´©¯ž•ô뇌ƒä€€ä€Œƒë‡ô•°ž©Â´oÁ ÏBÝöëû ÷ˆ'›5âB;O|Z‡d"m;t½yŠ}šæk~1{Bv±o‹gþ]$SG:O,èÿÿøðâ°ÓåÅè¸Û¬¢t˜V½‰Ï„•€f€v‚C†Å‹Þ’z›y¥Æ°½fÊyØ çôõ À"ù0„>?KâVQaqj rxt|ÿw|x rpjPaáV>K>÷0¾" þòõçwØdʽ݃¥y›Ý’Å‹B†v‚f€€•Є¾‰Ov˜¢Ü¬ê¸çűÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~嚉}½y:t!m†d†Z:OàB™5•'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡õ‘•±ž ©Ã´pÁ ÏCÝ÷ëòú ù‰'5ãB=O~Zˆd#mAKãVRaijrxu|ÿw|x rojYaßVõ0¼" ðõçvØqʽð‚¥w›Ü’Ä‹G†v‚f€€–Є¿‰Pw˜¢Þ¬Þ¸èųÓâüð ÜS,:GS^g«oDv2{k~暉}¼y@t m…d…Z8OÞB˜5“'ó ýúì>ÝÏzÁ¿´©­ž—•òꇋƒå€€ä€‰ƒí‡õ’•§ž!©Ä´rÁ ÏEÝùëôú ú‹'5åB>OZ‰d$m=tºy‹}šæm~0{Av¯o‰gü]"S!G:L,äüÿõð#â¬ÓâÅå¸ä¬ÿ¡r˜U‰΄•€g€w‚D†À‹à’|›|¥È°"½iÊmØç÷õÿÃ"ü0‡>BKåVSajjrxu|ÿw|x rnjXaÞV;K>1º" îõçtØoʽÁ°¥€›Û’ËF†u‚f€€“Ñ„À‰Qn˜¢ß¬ß¸êŵÓâîð ÞU,:GS^Žg¬o>v2{l~晉}¼y?tm„d„ZDOÝB–5’'ñ ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûëöú ü'‘5æB?O€Z€d%m=tºy‹}šæl~/{@v®o‘gú] S G:J,ãúÿóð"âºÓàÅä¸ã¬þ¡q˜T‰΄”€e€w‚E†Á‹á’}›}¥½°$½kÊoØçùõÅ"ý0‰>7KæVUakjrxu|ÿv|x rmjWaÝV9KŒ>1¹" üõçrØnʽÀ°¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ÝŶÓâððßG, :GS^g­o?v3{l~曈}»y?tm‚dƒZBOÛB•5'ÿ ùúþë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©Ç´uÁÏHÝýëøú þŽ'“5ÚBAOZd&m>t»yˆ}šæl~/{?v®ogù]SG":I,áøÿñð â¸ÓßÅâ¸â¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¿°%½lÊqØçûõ·"ÿ0Š>8KçVValj rxv|ÿv|x rljVaçV8KŠ>ÿ0·"ûõçqØlÊ%½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢â¬â¸ßÅ¸Ó âòðøÿáI,":GSù]g®o?v/{l~暈}»y>t&mdZAOÚB“5Ž'þ øúýëHÝÏuÁÇ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´wÁÏ;Ýþëùú ÿ'•5ÛBBOƒZ‚dm?t»yˆ}›æl~3{?v­og^SG :G,ßððâ¶ÓÝÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Û’›¥À°½nÊrØçüõ ¹"1Œ>9KÝVWamj rxv|ÿu|xrkjUaæV7K‰>ý0Å"ùõçoØkÊ$½½°}¥}›á’Á‹E†w‚e€€”΄‰Tq˜þ¡ã¬ä¸àźÓ"âóðúÿãJ,: G Sú]‘g®o@v/{l~æš‹}ºy=t%m€d€Z?OæB‘5'ü öúûëGÝÿÎsÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ’'–5ÝBDO„Z„dm@t¼y‰}™æl~2{>v¬oŽg^SG:T,Þ îðâµÓêÅ߸߬¢n˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›¥Á°½oÊtØçîõ º"1>;KÞVXanj rxw|ÿu|xrjjSaåVBK‡>ü0Ã"ÿ÷õçmØiÊ"½È°|¥|›à’À‹D†w‚g€€•΄‰Ur˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G"Sü]‰g¯oAv0{m~æš‹}¹y=t$m‰dZ>OåB5‹'ú ôúùëEÝ ÏrÁÄ´!©§ž’•õ퇉ƒä€€ã€‹ƒê‡ò—•­ž©¿´zÁÏ>Ýìýú ó“'˜5ÞB8O…Z…d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü üðâ³ÓèÅÞ¸Þ¬¢w˜P¿‰Ð„–€f€v‚G†Ä‹Ü’w›‚¥Ã°½qÊvØçðõ ¼"õ0>ú0Á" õõ çlØgÊ!½Ç°z¥{›ß’Æ‹D†w‚f€€•Ï„½‰Us˜¢Ù¬ç¸ãÅ®Ó%â÷ðþÿæN,:#G#Sý]Šg°oAv0{j~暊}¹y>KáVPapj rxw|ÿt|x rqjQaâV?K„>ø0À" ôõ çyØfʽưy¥z›Þ’Å‹C†v‚f€€•Ï„½‰Vt˜¢Û¬è¸åŰÓâøðÿÿèO,:G$Sþ]‹g±oBv1{k~暊}½y;t"m‡d|Z;OâB›5ˆ'÷ ûöëBÝ ÏoÁ´©°ž•ô뇌ƒä€€ä€Œƒë‡ô•¯ž©Á´oÁÏAÝõëû ÷ˆ'›5áB;O|Z‡d"m;t½yŠ}šæk~1{Bv©o‹gþ]%SG:P,èùðâ°ÓåÅè¸Û¬¢u˜V¾‰Ï„•€f€v‚C†Å‹Þ’z›y¥Å°½fÊyØ çóõ ¿"ø0„>?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØdʽ݃¥y›Ý’Å‹B†v‚f€€•Є¾‰Ou˜¢Ü¬ê¸çűÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~嚊}½y:t!m†d†Z:OàBš5†'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•±ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'5ãBAKãVRaij rxu|ÿw|x rojYaßVõ0¼" ðõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pw˜¢Ý¬Þ¸èųÓâüð ÜS,:GS^g«oCv1{k~嚉}¼y@t m…d…Z9OßB˜5”'ó ýúì>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´rÁ ÏEÝùëôú ú‹'5äB>OZ‰d$mBKäVSajjrxu|ÿw|x rnjXaÞV;K>1º" îõçtØpʽÁ°¥€›Ü’ËF†u‚f€€“Ñ„¿‰Qx˜¢ß¬ß¸êŵÓâîð ÝT,:GS^Žg¬o>v2{l~晉}¼y@tm„d„ZDOÝB–5’'ò ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒí‡ö“•¨ž"©Æ´sÁþÎFÝûëöú ü'‘5æB?O€Z€d%m=tºy‹}šæl~/{@v®o‘gû]!S G:K,ãúÿóð"âºÓáÅä¸ã¬þ¡q˜T‰΄”€e€w‚E†Á‹á’}›}¥½°$½jÊoØçùõÄ"ý0ˆ>6KæVTakjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ÝŶÓâðð ßG, :GS^g­o?v2{l~曈}»y?tmƒdƒZBOÜB•5' úúþë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©Ç´uÁÏHÝüë÷ú ýŽ'“5çBAOZd&m>t»yˆ}šæl~/{@v®ogù]SG":I,áùÿòð â¸ÓßÅâ¸â¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¾°%½lÊqØçúõ·"ÿ0Š>8KçVVakj rxv|ÿv|x rljVaçV8KŠ>ÿ0·"ûõçqØlÊ%½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ßÅ¸Ó âñðøÿáI,":GSù]g­o?v3{l~暈}»y>t&mdZAOÚB“5'þ øúýëIÝÏuÁÇ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´vÁÏ:Ýþëùú ÿ'”5ÛBBO‚Z‚dm?t»yˆ}›æl~3{?v­ogø]SG!:G,ßððâ·ÓÝÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Ú’›¥À°½nÊrØçüõ ¸"1Œ>9KÝVWalj rxv|ÿu|xrkjUaæV7K‰>þ0Å"ùõçoØkÊ$½½°}¥}›á’Á‹E†w‚e€€”΄Á‰Tq˜ý¡ã¬ä¸àŹÓ!âóðúÿâJ,: G Sú]‘g®o@v/{l~æš‹}ºy=t%m€d€Z@OæB’5'ü öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ’'–5ÝBCO„Zƒdm?t¼y‰}™æl~2{>v¬oŽg^SG:U,Þ îðâµÓêÅà¸ß¬¢n˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>;KÞVXamj rxw|ÿu|xrjjTaåVBK‡>ü0Ã"ÿ÷õçnØiÊ"½¼°|¥|›à’À‹D†w‚g€€”΄‰Tr˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G"Sü]‰g¯oAv0{m~æš‹}ºy=t$m‰dZ>OåB5‹'ú ôúùëEÝ ÏrÁÅ´!©¨ž’•õ퇉ƒä€€å€‹ƒê‡ò—•­ž©¾´yÁÏ>Ýìýú ó“'˜5ÞB8O…Z„d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü üðâ³ÓéÅÞ¸Þ¬¢w˜P¿‰Ð„“€f€v‚G†Ä‹Ü’w›‚¥Â°½qÊvØçðõ ¼"õ0>ú0Á" öõ çlØhÊ!½Ç°{¥{›ß’Æ‹D†w‚f€€•Ï„½‰Us˜¢å¬æ¸ãÅ®Ó%âöðýÿæN,:#G#Sý]Šg°oAv0{j~暊}¹y=KàVPaoj rxw|ÿt|x rqjQaâV?K„>ù0À" ôõ çzØfʽưy¥z›Þ’Å‹C†v‚f€€•Ï„½‰Vt˜¢Û¬è¸åůÓ&âøðÿÿèO,:G$Sþ]‹g±oBv0{k~暊}½y;t"m‡d}Z;OâB›5ˆ'÷ ûöëBÝ ÏoÁ´©°ž•ô뇌ƒä€€ä€Œƒë‡ô•¯ž©Á´oÁÏAÝõëû ö‡'›5áB;O‡Z‡d"m;t½yŠ}šæk~1{Bv©o‹gþ]%SG:P,èùðâ°ÓåÅè¸Û¬¢u˜W¾‰Ï„•€f€v‚C†Å‹Þ’y›y¥Å°½eÊyØ çóõ ¿"ø0„>?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØdʽ݃¥y›Þ’Å‹C†v‚f€€•Є¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~暊}½y:t!m†d‡Z:OàBš5†'õ ÿúôë@ÝÏ|ÁÀ´©¯ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'œ5ãB@KãVRahj rxt|ÿw|x rojOaàV=K>õ0¼" ðõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Þ¸èųÓâüð ÛR,:GS^g«oCv1{k~嚉}¼y@t!m…d…Z9OßB˜5”'ô ýúòë>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´rÁ ÏDÝùëôú ú‹'5äB>OZ‰d$mBKäVSaijrxu|ÿw|x rnjXaÞV;KŽ>1»" ïõçuØpʽ°¥w›Ü’ËF†u‚f€€“Ñ„¿‰Qw˜¢ß¬ß¸éÅ´Óâîð ÝT,:GS^Žg¬o>v2{l~晉}¼y@t m„d„ZDOÝB—5’'ò üúì=ÝÏxÁÊ´©¬ž–•ñꇋƒå€€ä€‰ƒí‡ö“•¨ž"©Å´sÁþÎFÝúëõú üŒ'‘5æB?O€Z€d%m=tºy‹}šæm~/{@v¯o‘gû]!S G:K,ãûÿôð"âºÓáÅä¸ã¬þ¡r˜T‰΄”€g€w‚D†Á‹á’}›}¥½°#½jÊoØçøõÄ"ý0ˆ>6KæVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°€¥›Û’ËF†x‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ßG, :GS^g¬o?v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•©ž$©Ç´uÁÏHÝüë÷ú ýŽ'“5çB@OZd&m>tºyˆ}šæl~/{@v®ogú]SG":I,áùÿòð â¸ÓßÅã¸â¬¢q˜SÁ‰Í„”€f€x‚E†Á‹Ù’~›~¥¾°%½lÊpØçúõÆ"ÿ0Š>8KçVUakjrxv|ÿv|x rljVaèV8K‹>ÿ0·"ûõçqØmÊ&½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ÞŸÓâñðáH,":GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÚB“5'þ øúýëIÝÏuÁÈ´©ªž”•÷臊ƒå€€å€Šƒé‡ø••«ž©È´vÁÏ:Ýþëùú ÿ'”5ÛBBO‚Z‚d'm?t»yˆ}šæl~3{?v­ogø]SG!:H,àððâ·ÓÞÅá¸á¬¢p˜RÀ‰Ñ„”€f€x‚F†Â‹Ú’›¥À°½mÊrØçüõ ¸"1‹>9KÜVWalj rxv|ÿv|xrkjUaæV7K‰>þ0Å"ùõçpØkÊ$½¾°}¥}›á’Á‹E†w‚e€€”΄Á‰Tq˜ý¡ã¬ã¸àŹÓ!âóðúÿâJ,: G Sú]‘g®o@v/{l~暈}ºy=t%md€Z@OçB’5'ü öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ‘'–5ÝBCOƒZƒdm?t¼y‰}™æl~2{>v¬oŽg^SG:F,Þ îðâµÓêÅà¸ß¬¢o˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>:KÞVXamj rxw|ÿu|xrjjTaåV6Kˆ>ü0Ã"øõçnØiÊ#½¼°|¥|›à’À‹D†w‚g€€”΄‰Tr˜ÿ¡ä¬å¸áŬÓ#âõðûÿäL,:!G!Sû]‰g¯oAv/{m~æš‹}ºy=t$m‰dZ>OåB5Œ'û õúúëEÝýÎrÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò—•­ž©¾´yÁÏ>Ýìüú ó“'—5ÞB8O…Z„d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü íðâ´ÓéÅÞ¸Þ¬¢w˜Q¿‰Ð„“€f€v‚G†Ä‹Ü’w›¥Â°½qÊuØçïõ »"õ0Ž>û0Â"öõ çlØhÊ!½Ç°{¥{›à’À‹D†w‚f€€•Ï„½‰Us˜¢å¬æ¸ãÅ®Ó%âöðýÿæM,:"G#Sý]Šg°oAv0{j~暊}¹y=KàVPaoj rxw|ÿt|x rqjQaâV@K…>ù0À" ôõ çzØfÊ ½Æ°y¥z›ß’Æ‹C†v‚f€€•Ï„½‰Vt˜¢Ú¬è¸åůÓ&âøðÿÿçO,:G$Sþ]‹g±oBv0{k~暊}¾y;t"m‡d}Z?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Є¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðéQ,:G%Sÿ]ŒgªoCv1{k~暊}½y;t"m†d‡Z:OáBš5‡'ö ÿúôë@ÝÏ|ÁÁ´©¯ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž ©Â´pÁ ÏCÝ÷ëòú ø‰'œ5ãB@KãVRaqj rxt|ÿw|x rojOaàV=K>ö0½" ñõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Ý¸èŲÓâûð ÛR,:GS^g«oCv1{k~嚉}¼y:t!m…d†Z9OßB˜5”'ô þúóë?ÝÏzÁ¿´©®ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´qÁ ÏDÝøëóú úŠ'5äB=O~Z‰d$mBKäVSaijrxu|ÿw|x rnjXaßV;KŽ>ô0»" ïõçuØpʽ°¥w›Ü’ËF†u‚f€€“Є¿‰Qw˜¢Þ¬ß¸éÅ´Óâíð ÝT,:GS^Žg«o>v2{l~晉}¼y@t m„d„ZDOÞB—5’'ò üúì=ÝÏyÁ¾´©¬ž–•òꇋƒå€€ä€‰ƒí‡ö“•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5æB?O€Z€d%m=tºy‹}šæm~/{@v¯o’gû]!S G:K,ãûÿôð"â«ÓáÅä¸ä¬þ¡r˜T‰΄”€g€w‚D†Á‹á’}›|¥½°#½jÊnØçøõÄ"ý0ˆ>6KåVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ßF, :GS^g¬o?v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••ñ釋ƒå€€ä€Šƒè‡÷”•©ž#©Ç´tÁÏHÝüë÷ú ýŽ'’5çB@OZd&m>tºyˆ}šæl~/{@v®o‘gú] SG#:I,âùÿòð!â¹ÓßÅã¸â¬¢q˜SÁ‰Í„”€e€x‚E†Á‹â’~›~¥¾°%½lÊpØçúõÆ"þ0Š>7KçVUakjrxv|ÿv|x rljVaèV9K‹>1¸"ûõçqØmÊ&½¿°¥›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ÞÅ·ÓâñðàH,!:GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÛB”5'þ øúýëIÝÏvÁÈ´©ªž”•÷臊ƒå€€å€Šƒé‡÷”•ªž©È´vÁÏIÝþëùú ÿ'”5ÛBBO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG!:H,àððâ·ÓÞÅá¸á¬¢p˜RÀ‰Ñ„”€f€x‚E†Â‹Ú’›¥¿°½mÊrØçüõ ¸"1‹>9KèVValj rxv|ÿv|xrkjUaæV7K‰>þ0Å"úõçpØkÊ$½¾°}¥}›á’Á‹E†x‚e€€”΄Á‰Sq˜ý¡â¬ã¸àŹÓ!âóðùÿâJ,#:G Sú]‘g®o@v/{l~暈}ºy>t%mdZ@OçB’5'ý ÷úûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ••¬ž©Ê´wÁÏ<Ýÿëúú ñ‘'–5ÜBCOƒZƒdm?t»y‰}›æl~2{>v¬og^SG :F,Þ ïðâµÓêÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥Á°½oÊsØçíõ º"1>:KÞVXamj rxv|ÿu|xrjjTaåV6Kˆ>ü0Ä"øõçnØjÊ#½¼°|¥|›á’À‹D†w‚g€€”΄‰Tr˜þ¡ä¬å¸áŬÓ#âôðûÿäK,:!G!Sû]ˆg¯oAv/{m~æš‹}ºy=t$m€dZ?OåB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò–•­ž©¾´yÁÏ=Ýìüú ò“'—5ÞB8O…Z„d m@t¼y‰}™æk~2{Dv«oŽg^SG:T,Ý íðâ´ÓéÅÞ¸Þ¬¢w˜Q¿‰Ð„“€f€u‚G†Ä‹Ü’w›¥Â°½pÊuØçïõ »"ô0Ž>û0Â"þöõ çlØhÊ!½È°{¥{›à’À‹D†w‚f€€•΄½‰Us˜¢å¬æ¸ãÅ­Ó$âöðýÿåM,:"G"Sü]‰g°oAv0{j~暊}¹y=KàVOaoj rxw|ÿt|x rqjRaãV@K…>ù0À" ôõ çzØfÊ ½Æ°z¥z›ß’Æ‹C†v‚f€€•Ï„½‰Vt˜¢Ú¬è¸äůÓ&âøðÿÿçO,:G$Sþ]Šg±oBv0{k~暊}¾y;t#m‡d}Z?KáVQapj rxt|ÿt|x rpjQaáV>K‘>ø0¾" ÿóõ çxØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðéP,:G%Sÿ]ŒgªoCv1{k~暊}½y;t"m†d‡Z:OáBš5‡'ö ûõëAÝÏ|ÁÁ´©¯ž•ó뇌ƒä€€ä€‰ƒì‡ô•°ž©Â´pÁ ÏBÝöëû ø‰'œ5âB@KãVRaqj rxt|ÿw|x rojOaàV=K>ö0½" ñõçwØcʽð‚¥x›Ý’Ä‹G†v‚f€€•Є¿‰Pv˜¢Ý¬Ý¸çŲÓâûð ÛR,:G&S^g«oCv1{k~嚉}¼y:t!m…d†Z9OßB™5”'ô þúóë?ÝÏzÁ¿´©®ž—•òꇋƒã€€ä€‰ƒì‡õ‘•§ž!©Ä´qÁ ÏDÝøëóú ùŠ'5äB=O~Z‰d$mAKäVSaijrxu|ÿw|x rnjYaßVô0»" ïõçuØpʽ°¥w›Ü’ËG†u‚f€€“Є¿‰Qw˜¢Þ¬ß¸éÅ´Óâíð ÝT,:GS^Žg«o>v2{k~晉}¼y@t m„d„Z8OÞB—5“'ò üúì=ÝÏyÁ¾´©­ž–•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5åB?OZ€d$m=tºy‹}šæm~/{@v¯oˆgû]!S!G:K,äûÿôð"â¬ÓáÅå¸ä¬þ¡r˜T‰΄”€g€w‚D†À‹á’|›|¥¼°#½jÊnØçøõÄ"ý0ˆ>6KåVTajjrxu|ÿv|x rmjWaÝV:K>1¹" íõçsØoʽÁ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ÞF, :GS^g¬o>v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Ç´tÁÿÎGÝüë÷ú ýŽ'’5çB@OZd%m>tºyˆ}šæl~/{@v®o‘gú] SG#:J,âùÿòð!â¹ÓàÅã¸â¬ý¡q˜SÁ‰Î„”€e€x‚E†Á‹â’~›}¥¾°$½kÊpØçúõÅ"þ0‰>7KçVUakjrxv|ÿv|x rljVaèV9K‹>1¸"ûõçrØmÊ&½¿°¥›Ú’‹E†x‚f€€”Ñ„Á‰Rp˜¢á¬â¸ÞÅ·ÓâñðàH,!:GSù]g­o?v3{l~暈}»y>t&m‚d‚ZBOÛB”5'ÿ ùúýëIÝÏvÁÈ´©ªž”•÷释ƒå€€å€Šƒè‡÷”•ªž©È´vÁÏIÝýëøú ÿ'”5ÛBAO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG!:H,àñðâ·ÓÞÅâ¸á¬¢p˜RÁ‰Ñ„”€f€x‚E†Â‹Ú’›¥¿°&½mÊrØçûõ¸"1‹>9KèVValj rxv|ÿv|xrkjUaçV7KŠ>þ0Å"úõçpØkÊ%½¾°}¥~›â’Á‹E†x‚e€€”Í„Á‰Sq˜¢â¬ã¸ßŹÓ!âòðùÿâJ,#:G Sú]‘g®o@v/{l~暈}ºy>t%mdZ@OçB’5Ž'ý ÷úüëHÝÿÎtÁÇ´#©©ž“•÷臊ƒä€€å€‹ƒé‡ñ••«ž©É´wÁÏ;Ýÿëúú ‘'•5ÜBCOƒZƒdm?t»y‰}›æl~2{>v¬og^SG :F,Þ ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥Á°½nÊsØçíõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrjjTaåV6Kˆ>ý0Ä"øõçnØjÊ#½½°|¥}›á’Á‹D†w‚g€€”΄‰Tr˜þ¡ä¬ä¸áÅ«Ó"âôðûÿãK,:!G!Sû]’g¯o@v/{m~æš‹}ºy=t%m€dZ?OåB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò–•­ž©¾´yÁÏ=Ýìüú ò“'—5ÞB8O„Z„d m@t¼y‰}™æk~2{>v«oŽg^SG:T,Ý íðâ´ÓéÅ߸ެ¢w˜Q¿‰Ð„“€f€u‚F†Ã‹Ü’w›¥Â°½pÊuØçïõ »"ô0Ž>û0Â"þöõ çmØhÊ"½È°{¥{›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸ãÅ­Ó$âöðýÿåM,:"G"Sü]‰g°oAv0{j~暊}¹y=KàVOaoj rxw|ÿt|x rqjRaãV@K…>ù0À" õõ çkØgÊ ½Æ°z¥z›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äůÓ&âøðÿÿçN,:G$Sý]Šg±oBv0{k~暊}¾y;t#m‡d}Z>KáVPapj rxt|ÿt|x rpjQaáV?K‘>ø0¿" óõ çyØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Wu˜¢Û¬é¸æÅ°ÓâùðéP,:G%Sÿ]‹gªoBv1{k~暊}½y;t"m†d‡Z;OáBš5‡'ö ûõëAÝÏ|ÁÁ´©¯ž•ó뇌ƒä€€ä€Œƒì‡ô•°ž©Â´oÁ ÏBÝöëû ÷ˆ'œ5âB@KâVRaqj rxt|ÿw|x rojPaàV=K>ö0½" ñõçwØcʽ݃¥x›Ý’Ä‹G†v‚f€€•Є¾‰Pv˜¢Ý¬ê¸çŲÓâûð ÛR,:G&S^ŒgªoCv1{k~嚉}½y:t!m…d†Z9OßB™5•'ô þúóë?ÝÏ{ÁÀ´©®ž—•óꇋƒã€€ä€‰ƒì‡õ‘•§ž ©Ä´qÁ ÏDÝøëóú ùŠ'5äB=O~Zˆd#mAKäVSaijrxu|ÿw|x rnjYaßVõ0»" ïõçuØpʽ°¥w›Ü’Ä‹G†v‚f€€“Є¿‰Qw˜¢Þ¬Þ¸éÅ´Óâíð ÜS,:GS^g«oDv2{k~晉}¼y@t m„d…Z8OÞB—5“'ó üúì=ÝÏyÁ¾´©­ž–•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´rÁþÎEÝúëõú ûŒ'5åB>OZ€d$m=tºy‹}šæm~/{Av¯oˆgû]!S!G:L,äûÿôð#â¬ÓáÅå¸ä¬þ¡r˜T‰΄”€g€w‚D†À‹à’|›|¥¼°#½iÊnØçøõÃ"ü0ˆ>6KåVTajjrxu|ÿw|x rmjXaÞV:K>1º" îõçtØoʽÁ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Qo˜¢ß¬à¸êŵÓâïð ÞF,:GS^Žg¬o>v2{l~曉}»y?tmƒdƒZCOÜB–5‘'ñ ûúÿë<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûëöú ý'’5çB@O€Zd%m>tºyˆ}šæl~/{@v®o‘gú] SG:J,âúÿóð!â¹ÓàÅã¸ã¬ý¡q˜SÁ‰Î„”€e€w‚E†Á‹á’}›}¥¾°$½kÊpØçùõÅ"þ0‰>7KæVUakjrxv|ÿv|x rljVaèV9K‹>1¸" üõçrØmʽ¿°¥›Ú’‹F†x‚f€€”Ñ„À‰Rp˜¢á¬á¸ÞÅ·ÓâððàH,!:GSø]g­o?v3{l~暈}»y?t&m‚d‚ZBOÛB”5'ÿ ùúþë:ÝÏvÁÈ´©ªž••÷释ƒå€€å€Šƒè‡÷”•ªž©È´vÁÏIÝýëøú þ'”5ÚBAO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG":H,àñðâ·ÓÞÅâ¸á¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¿°&½mÊqØçûõ·"1‹>8KèVValj rxv|ÿv|xrkjUaçV8KŠ>þ0Æ"úõçpØlÊ%½¾°~¥~›â’Á‹E†x‚f€€”Í„Á‰Sq˜¢â¬ã¸ßÅ¹Ó âòðùÿâI,#:GSú]‘g®o@v/{l~暈}ºy>t&mdZ@OçB“5Ž'ý ÷úüëHÝÏuÁÇ´#©©ž”•÷臊ƒä€€å€‹ƒé‡ø••«ž©É´wÁÏ;Ýÿëúú ‘'•5ÜBCOƒZƒdm?t»y‰}›æl~2{?v¬og^SG :G,ß ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥À°½nÊsØçýõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrjjTaåV6Kˆ>ý0Ä"øõçoØjÊ#½½°|¥}›á’Á‹D†w‚g€€”΄‰Tr˜þ¡ã¬ä¸áźÓ"âôðûÿãK,: G!Sû]’g¯o@v/{m~æš‹}ºy=t%m€d€Z?OæB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž“•ö퇉ƒä€€å€‹ƒê‡ò–•¬ž©¾´yÁÏ=Ýìüú ò’'—5ÝBDO„Z„d m@t¼y‰}™æl~2{>v¬oŽg^SG:T,Ý íðâ´ÓéÅ߸߬¢w˜Q¿‰Ð„“€f€u‚F†Ã‹Ü’w›¥Â°½pÊuØçïõ »"1Ž>;KÞVXanj rxw|ÿu|xrijSaäVBK‡>û0Â"ÿöõ çmØhÊ"½È°{¥|›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸âÅ­Ó$âöðýÿåM,:"G"Sü]‰g°oAv0{m~暊}¹yOäB5‹'ú ôúùëDÝ ÏqÁÄ´!©§ž’•õ쇉ƒä€€ã€‹ƒê‡ò—•­ž©¿´zÁÏ?Ýóëýú ô”'˜5ßB9O…Z…d!m:t¼y‰}šåk~1{Cv«og^SG:R,Û üðâ³ÓèÅݸݬ¢v˜P¿‰Ð„–€f€v‚G†Ä‹Ý’x›‚¥Ã°½cÊvØçðõ ¼"ö0>=KàVOaoj rxw|ÿt|x rhjRaãV@K…>ú0Á" õõ çkØgÊ ½Ç°z¥z›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äůÓ&â÷ðþÿçN,:G#Sý]Šg°oBv0{k~暊}¾y>KáVPapj rxt|ÿt|x rpjQaâV?K’>ø0¿" óõ çyØeʽŰy¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Wu˜¢Û¬é¸æÅ°ÓâùðèP,:G%Sþ]‹g©oBv1{k~暊}½y;t"m‡d‡Z;OáB›5‡'ö ûõëAÝÏnÁÁ´©¯ž•ó뇌ƒä€€ä€Œƒë‡ô•°ž©Â´oÁ ÏBÝöëû ÷ˆ'œ5âB@KâVQaqj rxt|ÿw|x rojPaàV=K>ö0½" ñõçwØdʽ݃¥x›Ý’Ä‹G†v‚f€€•Є¾‰Pv˜¢Ý¬ê¸çŲÓâûð ÚR,:G&S^ŒgªoCv1{k~嚉}½y:t!m…d†Z9OàB™5•'õ þúóë?ÝÏ{ÁÀ´©®ž˜•óꇌƒã€€ä€‰ƒì‡õ‘•±ž ©Ã´qÁ ÏDÝøëóú ùŠ'5ãB=O~Zˆd#mAKäVSaijrxu|ÿw|x rnjYaßVõ0¼" ðõçuØqʽ°‚¥w›Ü’Ä‹G†v‚f€€“Є¿‰Pw˜¢Þ¬Þ¸éųÓâýð ÜS,:GS^g«oDv2{k~暉}¼y@t m„d…Z8OÞB˜5“'ó ýúì>ÝÏyÁ¾´©­ž—•òꇋƒå€€ä€‰ƒí‡õ’•¨ž"©Å´rÁýÎEÝùëôú û‹'5åB>OZ‰d$m=tºy‹}šæm~/{Av¯o‰gû]!S!G:L,äüÿõð#â¬ÓâÅå¸ä¬ÿ¡r˜T‰΄”€g€w‚D†À‹à’|›|¥¼°#½iÊnØç÷õÿÃ"ü0‡>BKåVTajjrxu|ÿw|x rmjXaÞV;K>1º" îõçtØoʽÁ°€¥€›Û’ËF†u‚f€€“Ñ„À‰Qn˜¢ß¬à¸êŵÓâîð ÞF,:GS^Žg¬o>v2{l~晉}¼y?tmƒd„ZCOÝB–5‘'ñ ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûëöú ü'’5æB@O€Z€d%m=tºy‹}šæl~/{@v®o‘gú] S G:J,âúÿóð!â¹ÓàÅã¸ã¬ý¡q˜TÁ‰Î„”€e€w‚E†Á‹á’}›}¥½°$½kÊoØçùõÅ"þ0‰>7KæVUakjrxu|ÿv|x rljWaÜV9K‹>1¸" üõçrØmʽÀ°¥›Ú’‹F†x‚f€€”Ñ„À‰Rp˜¢á¬á¸ÝÅ·ÓâððàG,!:GSø]g­o?v3{l~暈}»y?t'm‚d‚ZBOÛB”5'ÿ ùúþë:ÝÏvÁÈ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©È´uÁÏIÝýëøú þ'“5ÚBAO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG":H,áøÿñð â¸ÓÞÅâ¸á¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¿°&½lÊqØçûõ·"ÿ0‹>8KçVValj rxv|ÿv|x rkjVaçV8KŠ>ÿ0Æ"úõçpØlÊ%½¾°~¥~›Ù’Á‹E†x‚f€€”Í„Á‰Sq˜¢â¬ã¸ßÅ¸Ó âòðùÿáI,":GSú]g®o@v/{l~暈}ºy>t&mdZAOçB“5Ž'ý ÷úüëHÝÏuÁÇ´©©ž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´wÁÏ;Ýÿëúú '•5ÜBBOƒZƒdm?t»y‰}›æl~2{?v­og^SG :G,ß ïðâ¶ÓëÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Û’›€¥À°½nÊsØçýõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrjjTaæV6Kˆ>ý0Ä"øõçoØjÊ#½½°}¥}›á’Á‹D†w‚e€€”΄‰Tr˜þ¡ã¬ä¸áźÓ"âôðûÿãK,: G!Sû]‘g¯o@v/{m~æš‹}ºy=t%m€d€Z?OæB‘5Œ'ü öúúëFÝþÎsÁÆ´"©¨ž“•ö퇉ƒä€€å€‹ƒê‡ñ–•¬ž©Ê´xÁÏ=Ýìûú ò’'—5ÝBDO„Z„d m@t¼y‰}™æl~2{>v¬oŽg^SG:T,Ý îðâ´ÓêÅ߸߬¢w˜Q¿‰Ñ„“€f€u‚F†Ã‹Ü’w›¥Â°½pÊtØçîõ »"1Ž>;KÞVXanj rxw|ÿu|xrijSaäVBK‡>û0Ã"ÿ÷õ çmØiÊ"½È°{¥|›à’À‹D†w‚g€€•΄¼‰Us˜ÿ¡å¬å¸âÅ­Ó$âõðüÿåL,:"G"Sü]‰g¯oAv0{m~暊}¹yOäB5‹'ú ôúùëEÝ ÏrÁÄ´!©§ž’•õ쇉ƒä€€ã€‹ƒê‡ò—•­ž©¿´zÁÏ>Ýòëýú ô”'˜5ßB9O…Z…d m@t¼y‰}šåk~1{Cv«og^SG:S,Ü üðâ³ÓèÅ޸ݬ¢v˜P¿‰Ð„–€f€v‚G†Ä‹Ý’x›‚¥Ã°½cÊvØçðõ ¼"õ0>=KàVYaoj rxw|ÿu|x rijRaãV@K…>ú0Á" õõ çkØgÊ ½Ç°z¥{›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äÅ®Ó%â÷ðþÿæN,:G#Sý]Šg°oBv0{k~暊}¹y>KáVPapj rxt|ÿt|x rpjQaâV?K„>ø0¿" óõ çyØeʽŰy¥z›Þ’Å‹C†v‚f€€•Ï„¾‰Vu˜¢Û¬è¸åŰÓâùðèP,:G%Sþ]‹g©oBv1{k~暊}½y;t"m‡d‡Z;OáB›5‡'ö ûõëAÝÏoÁÁ´©¯ž•ô뇌ƒä€€ä€Œƒë‡ô•°ž©Â´oÁ ÏBÝöëû ÷ˆ'›5âB;O|Z‡d"m;t½yŠ}šæk~1{Bv±o‹gþ]$SG:O,èÿÿøðâ¯ÓåÅè¸Û¬¢t˜V½‰Ï„•€f€v‚C†Å‹Þ’z›y¥Æ°½fÊyØ çôõ À"ù0„>?KâVQaqj rxt|ÿw|x rojPaáV>K>÷0½" ñõçwØdʽ݃¥x›Ý’Ä‹B†v‚f€€•Є¾‰Pv˜¢Ü¬ê¸çŲÓâûð ÚQ,:G&Sÿ]ŒgªoCv1{k~嚉}½y:t!m†d†Z:OàB™5•'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡õ‘•±ž ©Ã´qÁ ÏCÝ÷ëóú ùŠ'5ãB=O~Zˆd#mAKãVRaijrxu|ÿw|x rnjYaßVõ0¼" ðõçvØqʽð‚¥w›Ü’Ä‹G†v‚f€€–Є¿‰Pw˜¢Þ¬Þ¸èųÓâüð ÜS,:GS^g«oDv2{k~暉}¼y@t m…d…Z8OÞB˜5“'ó ýúì>ÝÏzÁ¿´©­ž—•òꇋƒå€€ä€‰ƒí‡õ’•§ž!©Å´rÁ ÏEÝùëôú ú‹'5åB>OZ‰d$m=tºy‹}šæm~0{Av¯o‰gü]"S!G:L,äüÿõð#â¬ÓâÅå¸ä¬ÿ¡r˜U‰΄”€g€w‚D†À‹à’|›|¥¼°"½iÊnØç÷õÿÃ"ü0‡>BKåVTajjrxu|ÿw|x rnjXaÞV;K>1º" îõçtØoʽÁ°€¥€›Û’ËF†u‚f€€“Ñ„À‰Qn˜¢ß¬ß¸êŵÓâîð ÞU,:GS^Žg¬o>v2{l~晉}¼y?tmƒd„ZCOÝB–5’'ñ ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûëöú ü'’5æB?O€Z€d%m=tºy‹}šæl~/{@v®o‘gú] S G:J,ãúÿóð!âºÓàÅä¸ã¬þ¡q˜T‰΄”€e€w‚E†Á‹á’}›}¥½°$½kÊoØçùõÅ"ý0‰>7KæVUakjrxu|ÿv|x rmjWaÝV9KŒ>1¸" üõçrØnʽÀ°¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ÝÅ·ÓâððßG,!:GSø]g­o?v3{l~曈}»y?tm‚d‚ZBOÛB•5'ÿ ùúþë:ÝÏvÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©Ç´uÁÏHÝýëøú þ'“5ÚBAOZd&m>t»yˆ}šæl~/{?v­ogù]SG":I,áøÿñð â¸ÓßÅâ¸â¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¿°%½lÊqØçûõ·"ÿ0Š>8KçVValj rxv|ÿv|x rljVaçV8KŠ>ÿ0·"úõçqØlÊ%½¾°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢â¬â¸ßÅ¸Ó âòðùÿáI,":GSù]g®o?v/{l~暈}»y>t&mdZAOÚB“5Ž'þ øúüëHÝÏuÁÇ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´wÁÏ;Ýþëúú '•5ÜBBOƒZƒdm?t»yˆ}›æl~2{?v­og^SG :G,ßððâ¶ÓÝÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Û’›¥À°½nÊsØçüõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrkjUaæV6K‰>ý0Ä"ùõçoØjÊ$½½°}¥}›á’Á‹E†w‚e€€”΄‰Tq˜þ¡ã¬ä¸àźÓ"âóðúÿãK,: G Sû]‘g®o@v/{l~æš‹}ºy=t%m€d€Z?OæB‘5'ü öúûëGÝþÎsÁÆ´#©¨ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ò’'–5ÝBDO„Z„dm@t¼y‰}™æl~2{>v¬oŽg^SG:T,Ý îðâµÓêÅ߸߬¢x˜QÀ‰Ñ„“€f€u‚F†Ã‹Ü’€›¥Á°½oÊtØçîõ º"1>;KÞVXanj rxw|ÿu|xrjjSaåVBK‡>ü0Ã"ÿ÷õçmØiÊ"½È°|¥|›à’À‹D†w‚g€€•΄‰Ur˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G"Sü]‰g¯oAv0{m~æš‹}¹y=t$m‰dZ>OåB5‹'ú ôúùëEÝ ÏrÁÄ´!©§ž’•õ쇉ƒä€€ã€‹ƒê‡ò—•­ž©¿´zÁÏ>Ýìýú ó”'˜5ßB8O…Z…d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü üðâ³ÓèÅÞ¸Þ¬¢w˜P¿‰Ð„–€f€v‚G†Ä‹Ü’x›‚¥Ã°½qÊvØçðõ ¼"õ0>ú0Á" õõ çlØgÊ!½Ç°z¥{›ß’Æ‹C†w‚f€€•Ï„½‰Vs˜¢Ú¬ç¸äÅ®Ó%â÷ðþÿæN,:#G#Sý]Šg°oAv0{k~暊}¹y>KáVPapj rxw|ÿt|x rqjQaâV?K„>ø0¿" óõ çyØfʽưy¥z›Þ’Å‹C†v‚f€€•Ï„½‰Vu˜¢Û¬è¸åŰÓâùðèO,:G$Sþ]‹g©oBv1{k~暊}½y;t"m‡d|Z;OâB›5ˆ'÷ ûöëAÝÏoÁ´©¯ž•ô뇌ƒä€€ä€Œƒë‡ô•¯ž©Â´oÁÏAÝõëû ÷ˆ'›5âB;O|Z‡d"m;t½yŠ}šæk~1{Bv©o‹gþ]$SG:O,èùðâ°ÓåÅè¸Û¬¢u˜V¾‰Ï„•€f€v‚C†Å‹Þ’z›y¥Å°½fÊyØ çóõ ¿"ø0„>?KâVQaqj rxt|ÿw|x rpjPaáV>K>÷0¾" ÿòõçxØdʽ݃¥y›Ý’Å‹B†v‚f€€•Є¾‰Ov˜¢Ü¬ê¸çűÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~嚉}½y:t!m†d†Z:OàBš5†'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•±ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'5ãB=O~Zˆd#mAKãVRaijrxu|ÿw|x rojYaßVõ0¼" ðõçvØqʽð‚¥x›Ü’Ä‹G†v‚f€€–Є¿‰Pw˜¢Þ¬Þ¸èųÓâüð ÜS,:GS^g«oDv2{k~暉}¼y@t m…d…Z8OßB˜5”'ó ýúì>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´rÁ ÏEÝùëôú ú‹'5åB>OZ‰d$m=t¹y‹}šæm~0{Av¯o‰gü]"S!G:L,äüÿõð#â¬ÓâÅå¸ä¬ÿ¡r˜U‰΄•€g€w‚D†À‹à’|›|¥È°"½iÊmØç÷õÿÃ"ü0‡>BKåVSajjrxu|ÿw|x rnjXaÞV;K>1º" îõçtØoʽÁ°¥€›Ü’ËF†u‚f€€“Ñ„À‰Qx˜¢ß¬ß¸êŵÓâîð ÝT,:GS^Žg¬o>v2{l~晉}¼y@tm„d„ZDOÝB–5’'ò ûúì<ÝÏxÁÊ´©¬ž–•ñ釋ƒå€€ä€Šƒè‡ö“•¨ž#©Æ´sÁþÎFÝûëöú ü'‘5æB?O€Z€d%m=tºy‹}šæl~/{@v®o‘gû] S G:K,ãúÿóð"âºÓàÅä¸ã¬þ¡q˜T‰΄”€e€w‚E†Á‹á’}›}¥½°$½jÊoØçùõÄ"ý0‰>6KæVUakjrxu|ÿv|x rmjWaÝV:KŒ>1¹" üõçsØnʽÀ°¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ÝŶÓâððßG, :GS^g­o?v2{l~曈}»y?tmƒdƒZBOÜB•5' úúþë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•ªž©Ç´uÁÏHÝüëøú þŽ'“5èBAOZd&m>t»yˆ}šæl~/{?v®ogù]SG":I,áùÿòð â¸ÓßÅâ¸â¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’~›~¥¾°%½lÊqØçúõ·"ÿ0Š>8KçVValj rxv|ÿv|x rljVaçV8KŠ>ÿ0·"ûõçqØlÊ%½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢â¬â¸ßÅ¸Ó âñðøÿáI,":GSù]g­o?v/{l~暈}»y>t&mdZAOÚB“5'þ øúýëHÝÏuÁÇ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©É´vÁÏ:Ýþëùú ÿ'•5ÛBBO‚Z‚dm?t»yˆ}›æl~3{?v­ogø]SG!:G,ßððâ·ÓÝÅá¸à¬¢o˜RÀ‰Ñ„”€f€x‚F†Â‹Û’›¥À°½nÊrØçüõ ¸"1Œ>9KÝVWamj rxv|ÿu|xrkjUaæV7K‰>ý0Å"ùõçoØkÊ$½½°}¥}›á’Á‹E†w‚e€€”΄‰Tq˜þ¡ã¬ä¸àźÓ!âóðúÿãJ,: G Sú]‘g®o@v/{l~æš‹}ºy=t%m€d€Z@OæB’5'ü öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ’'–5ÝBCO„Zƒdm?t¼y‰}™æl~2{>v¬oŽg^SG:U,Þ îðâµÓêÅ߸߬¢n˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>;KÞVXanj rxw|ÿu|xrjjTaåVBK‡>ü0Ã"ÿ÷õçnØiÊ"½¼°|¥|›à’À‹D†w‚g€€”΄‰Ur˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G"Sü]‰g¯oAv0{m~æš‹}ºy=t$m‰dZ>OåB5‹'ú ôúùëEÝ ÏrÁÅ´!©§ž’•õ퇉ƒä€€å€‹ƒê‡ò—•­ž©¾´yÁÏ>Ýìýú ó“'˜5ÞB8O…Z…d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü üðâ³ÓèÅÞ¸Þ¬¢w˜P¿‰Ð„–€f€v‚G†Ä‹Ü’w›‚¥Ã°½qÊvØçðõ ¼"õ0>ú0Á" õõ çlØgÊ!½Ç°z¥{›ß’Æ‹D†w‚f€€•Ï„½‰Us˜¢æ¬ç¸ãÅ®Ó%â÷ðþÿæN,:#G#Sý]Šg°oAv0{j~暊}¹y>KáVPaoj rxw|ÿt|x rqjQaâV?K„>ù0À" ôõ çyØfʽưy¥z›Þ’Å‹C†v‚f€€•Ï„½‰Vt˜¢Û¬è¸åůÓâøðÿÿèO,:G$Sþ]‹g±oBv1{k~暊}½y;t"m‡d|Z;OâB›5ˆ'÷ ûöëBÝ ÏoÁ´©°ž•ô뇌ƒä€€ä€Œƒë‡ô•¯ž©Á´oÁÏAÝõëû ö‡'›5áB;O‡Z‡d"m;t½yŠ}šæk~1{Bv©o‹gþ]%SG:P,èùðâ°ÓåÅè¸Û¬¢u˜V¾‰Ï„•€f€v‚C†Å‹Þ’z›y¥Å°½eÊyØ çóõ ¿"ø0„>?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØdʽ݃¥y›Þ’Å‹B†v‚f€€•Є¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðÚQ,:G&Sÿ]ŒgªoCv1{k~嚊}½y:t!m†d‡Z:OàBš5†'õ ÿúôë@ÝÏ{ÁÀ´©®ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'œ5ãB@KãVRaij rxu|ÿw|x rojYaàV=K>õ0¼" ðõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Þ¸èųÓâüð ÜS,:GS^g«oCv1{k~嚉}¼y@t m…d…Z9OßB˜5”'ô ýúòë>ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´rÁ ÏEÝùëôú ú‹'5äB>OZ‰d$mBKäVSaijrxu|ÿw|x rnjXaÞV;KŽ>1»" îõçtØpʽ°¥w›Ü’ËF†u‚f€€“Ñ„¿‰Qw˜¢ß¬ß¸êÅ´Óâîð ÝT,:GS^Žg¬o>v2{l~晉}¼y@t m„d„ZDOÝB—5’'ò üúì=ÝÏxÁÊ´©¬ž–•ñꇋƒå€€ä€‰ƒí‡ö“•¨ž"©Æ´sÁþÎFÝúëöú üŒ'‘5æB?O€Z€d%m=tºy‹}šæm~/{@v¯o‘gû]!S G:K,ãûÿôð"âºÓáÅä¸ã¬þ¡r˜T‰΄”€e€w‚D†Á‹á’}›}¥½°#½jÊoØçøõÄ"ý0ˆ>6KæVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°€¥›Û’‹F†x‚f€€”Ñ„À‰Ro˜¢à¬á¸ëŶÓâïð ßG, :GS^g­o?v2{l~曉}»y?tmƒdƒZBOÜB•5' úúÿë;ÝÏwÁÉ´©«ž••øé‡Šƒå€€ä€Šƒè‡÷”•©ž©Ç´uÁÏHÝüë÷ú ýŽ'“5çB@OZd&m>tºyˆ}šæl~/{@v®ogú]SG":I,áùÿòð â¸ÓßÅã¸â¬¢q˜SÁ‰Í„”€f€x‚E†Á‹Ù’~›~¥¾°%½lÊpØçúõÆ"ÿ0Š>8KçVVakj rxv|ÿv|x rljVaçV8K‹>ÿ0·"ûõçqØlÊ&½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ÞÅ¸Ó âñðøÿáH,":GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÚB“5'þ øúýëIÝÏuÁÈ´©ªž”•÷臊ƒä€€å€Šƒé‡ø••«ž©È´vÁÏ:Ýþëùú ÿ'”5ÛBBO‚Z‚d'm?t»yˆ}šæl~3{?v­ogø]SG!:G,àððâ·ÓÞÅá¸á¬¢p˜RÀ‰Ñ„”€f€x‚F†Â‹Ú’›¥À°½mÊrØçüõ ¸"1‹>9KÜVWalj rxv|ÿv|xrkjUaæV7K‰>þ0Å"ùõçoØkÊ$½½°}¥}›á’Á‹E†w‚e€€”΄Á‰Tq˜ý¡ã¬ã¸àŹÓ!âóðúÿâJ,: G Sú]‘g®o@v/{l~暈}ºy=t%m€d€Z@OæB’5'ü öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýìûú ñ‘'–5ÝBCO„Zƒdm?t¼y‰}™æl~2{>v¬oŽg^SG:F,Þ îðâµÓêÅà¸ß¬¢n˜QÀ‰Ñ„“€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>;KÞVXamj rxw|ÿu|xrjjTaåVBK‡>ü0Ã"ÿ÷õçnØiÊ#½¼°|¥|›à’À‹D†w‚g€€”΄‰Tr˜ÿ¡ä¬å¸âŬÓ#âõðüÿäL,:!G!Sû]‰g¯oAv/{m~æš‹}ºy=t$m‰dZ>OåB5‹'û õúùëEÝýÎrÁÅ´"©¨ž’•õ퇉ƒä€€å€‹ƒê‡ò—•­ž©¾´yÁÏ>Ýìýú ó“'˜5ÞB8O…Z„d m@t¼y‰}šæk~2{Dv«og^SG:S,Ü ýðâ³ÓéÅÞ¸Þ¬¢w˜Q¿‰Ð„“€f€v‚G†Ä‹Ü’w›‚¥Â°½qÊuØçïõ ¼"õ0Ž>ú0Â"öõ çlØhÊ!½Ç°{¥{›ß’À‹D†w‚f€€•Ï„½‰Us˜¢å¬æ¸ãÅ®Ó%âöðýÿæM,:#G#Sý]Šg°oAv0{j~暊}¹y=KàVPaoj rxw|ÿt|x rqjQaâV@K„>ù0À" ôõ çzØfÊ ½Æ°y¥z›ß’Æ‹C†v‚f€€•Ï„½‰Vt˜¢Û¬è¸åůÓ&âøðÿÿçO,:G$Sþ]‹g±oBv0{k~暊}½y;t"m‡d}Z?KâVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØeʽ݃¥y›Þ’Å‹C†v‚f€€•Є¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðÚQ,:G%Sÿ]ŒgªoCv1{k~暊}½y;t"m†d‡Z:OàBš5†'õ ÿúôë@ÝÏ|ÁÀ´©¯ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž ©Ã´pÁ ÏCÝ÷ëòú ø‰'œ5ãB@KãVRahj rxt|ÿw|x rojOaàV=K>ö0¼" ðõçvØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Ý¸èųÓâüð ÛR,:GS^g«oCv1{k~嚉}¼y:t!m…d…Z9OßB˜5”'ô ýúóë?ÝÏzÁ¿´©­ž—•òꇋƒã€€ä€‰ƒì‡õ’•§ž!©Ä´qÁ ÏDÝøëôú ú‹'5äB>O~Z‰d$mBKäVSaijrxu|ÿw|x rnjXaÞV;KŽ>1»" ïõçuØpʽ°¥w›Ü’ËF†u‚f€€“Є¿‰Qw˜¢ß¬ß¸éÅ´Óâíð ÝT,:GS^Žg¬o>v2{l~晉}¼y@t m„d„ZDOÝB—5’'ò üúì=ÝÏyÁ¾´©¬ž–•òꇋƒå€€ä€‰ƒí‡ö“•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5æB?O€Z€d%m=tºy‹}šæm~/{@v¯o’gû]!S G:K,ãûÿôð"âºÓáÅä¸ã¬þ¡r˜T‰΄”€g€w‚D†Á‹á’}›|¥½°#½jÊoØçøõÄ"ý0ˆ>6KåVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" ýõçsØnʽÀ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ßG, :GS^g¬o?v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••øé‡‹ƒå€€ä€Šƒè‡÷”•©ž#©Ç´tÁÏHÝüë÷ú ýŽ'“5çB@OZd&m>tºyˆ}šæl~/{@v®o‘gú]SG#:I,âùÿòð â¹ÓßÅã¸â¬¢q˜SÁ‰Í„”€f€x‚E†Á‹â’~›~¥¾°%½lÊpØçúõÆ"þ0Š>8KçVUakjrxv|ÿv|x rljVaèV8K‹>1·"ûõçqØmÊ&½¿°~¥~›Ú’‹E†x‚f€€”Í„Á‰Sp˜¢á¬â¸ÞÅ·ÓâñðàH,":GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÛB”5'þ øúýëIÝÏvÁÈ´©ªž”•÷臊ƒå€€å€Šƒé‡÷••ªž©È´vÁÏ:Ýþëùú ÿ'”5ÛBBO‚Z‚d&m?t»yˆ}šæl~3{?v­ogø]SG!:H,àððâ·ÓÞÅá¸á¬¢p˜RÀ‰Ñ„”€f€x‚F†Â‹Ú’›¥¿°½mÊrØçüõ ¸"1‹>9KèVValj rxv|ÿv|xrkjUaæV7K‰>þ0Å"ùõçpØkÊ$½¾°}¥}›á’Á‹E†x‚e€€”΄Á‰Sq˜ý¡ã¬ã¸àŹÓ!âóðúÿâJ,:G Sú]‘g®o@v/{l~暈}ºy>t%md€Z@OçB’5'ý öúûëGÝÿÎtÁÆ´#©©ž“•ö臊ƒä€€å€‹ƒé‡ñ–•¬ž©Ê´xÁÏ<Ýÿëûú ñ‘'–5ÜBCOƒZƒdm?t»y‰}›æl~2{>v¬oŽg^SG:F,Þ ïðâµÓêÅà¸ß¬¢o˜QÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥Á°½oÊtØçîõ º"1>:KÞVXamj rxw|ÿu|xrjjTaåV6Kˆ>ü0Ã"øõçnØjÊ#½¼°|¥|›à’À‹D†w‚g€€”΄‰Tr˜þ¡ä¬å¸áŬÓ#âôðûÿäL,:!G!Sû]ˆg¯oAv/{m~æš‹}ºy=t$m€dZ>OåB5Œ'û õúúëEÝþÎrÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò–•­ž©¾´yÁÏ=Ýìüú ó“'—5ÞB8O…Z„d m@t¼y‰}™æk~2{Dv«og^SG:S,Ü íðâ´ÓéÅÞ¸Þ¬¢w˜Q¿‰Ð„“€f€v‚G†Ä‹Ü’w›¥Â°½pÊuØçïõ »"õ0Ž>û0Â"þöõ çlØhÊ!½Ç°{¥{›à’À‹D†w‚f€€•Ï„½‰Us˜¢å¬æ¸ãÅ­Ó$âöðýÿæM,:"G#Sü]Šg°oAv0{j~暊}¹y=KàVPaoj rxw|ÿt|x rqjRaâV@K…>ù0À" ôõ çzØfÊ ½Æ°z¥z›ß’Æ‹C†v‚f€€•Ï„½‰Vt˜¢Ú¬è¸äůÓ&âøðÿÿçO,:G$Sþ]‹g±oBv0{k~暊}¾y;t#m‡d}Z?KáVQapj rxt|ÿt|x rpjPaáV>K‘>÷0¾" ÿòõ çxØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Ou˜¢Ü¬é¸æÅ±ÓâúðéP,:G%Sÿ]ŒgªoCv1{k~暊}½y;t"m†d‡Z:OáBš5‡'ö ÿúôë@ÝÏ|ÁÁ´©¯ž•ó뇌ƒã€€ä€‰ƒì‡ô‘•°ž©Â´pÁ ÏBÝ÷ëû ø‰'œ5âB@KãVRaqj rxt|ÿw|x rojOaàV=K>ö0½" ñõçwØcʽð‚¥x›Ý’Ä‹G†v‚f€€–Є¿‰Pv˜¢Ý¬Ý¸èŲÓâûð ÛR,:GS^g«oCv1{k~嚉}¼y:t!m…d†Z9OßB™5”'ô þúóë?ÝÏzÁ¿´©®ž—•òꇋƒã€€ä€‰ƒì‡õ‘•§ž!©Ä´qÁ ÏDÝøëóú ùŠ'5äB=O~Z‰d$mAKäVSaijrxu|ÿw|x rnjYaßVô0»" ïõçuØpʽ°¥w›Ü’ËF†u‚f€€“Є¿‰Qw˜¢Þ¬ß¸éÅ´Óâíð ÝT,:GS^Žg«o>v2{k~晉}¼y@t m„d„Z8OÞB—5“'ò üúì=ÝÏyÁ¾´©­ž–•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´sÁþÎFÝúëõú ûŒ'‘5åB?OZ€d%m=tºy‹}šæm~/{@v¯o’gû]!S!G:K,ãûÿôð"â«ÓáÅä¸ä¬þ¡r˜T‰΄”€g€w‚D†Á‹á’}›|¥½°#½jÊnØçøõÄ"ý0ˆ>6KåVTajjrxu|ÿv|x rmjWaÝV:KŒ>1¹" íõçsØnʽÁ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸ëŶÓâïð ÞF, :GS^g¬o>v2{l~曉}»y?tmƒdƒZCOÜB•5‘' úúÿë;ÝÏwÁÉ´©«ž••ñ釋ƒå€€ä€Šƒè‡÷“•©ž#©Ç´tÁÿÎGÝüë÷ú ýŽ'’5çB@OZd%m>tºyˆ}šæl~/{@v®o‘gú] SG#:J,âùÿòð!â¹ÓßÅã¸â¬¢q˜SÁ‰Í„”€e€x‚E†Á‹â’~›}¥¾°%½kÊpØçúõÅ"þ0‰>7KçVUakjrxv|ÿv|x rljVaèV9K‹>1¸"ûõçrØmÊ&½¿°¥›Ú’‹E†x‚f€€”Ñ„Á‰Rp˜¢á¬â¸ÞÅ·ÓâñðàH,!:GSù]g­o?v3{l~暈}»y>t&m‚d‚ZAOÛB”5'ÿ øúýëIÝÏvÁÈ´©ªž”•÷臊ƒå€€å€Šƒé‡÷”•ªž©È´vÁÏIÝýëùú ÿ'”5ÛBBO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG!:H,àñðâ·ÓÞÅâ¸á¬¢p˜RÁ‰Ñ„”€f€x‚E†Â‹Ú’›¥¿°&½mÊrØçûõ¸"1‹>9KèVValj rxv|ÿv|xrkjUaçV7K‰>þ0Å"úõçpØkÊ$½¾°}¥~›â’Á‹E†x‚e€€”΄Á‰Sq˜ý¡â¬ã¸àŹÓ!âòðùÿâJ,#:G Sú]‘g®o@v/{l~暈}ºy>t%mdZ@OçB’5Ž'ý ÷úüëGÝÿÎtÁÇ´#©©ž“•÷臊ƒä€€å€‹ƒé‡ñ••«ž©É´wÁÏ;Ýÿëúú ‘'•5ÜBCOƒZƒdm?t»y‰}›æl~2{>v¬og^SG :F,Þ ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥Á°½oÊsØçíõ ¹"1>:KÝVWamj rxv|ÿu|xrjjTaåV6Kˆ>ý0Ä"øõçnØjÊ#½¼°|¥|›á’À‹D†w‚g€€”΄‰Tr˜þ¡ä¬å¸áŬÓ"âôðûÿäK,:!G!Sû]’g¯o@v/{m~æš‹}ºy=t$m€dZ?OåB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž’•ö퇉ƒä€€å€‹ƒê‡ò–•­ž©¾´yÁÏ=Ýìüú ò“'—5ÞB8O„Z„d m@t¼y‰}™æk~2{>v«oŽg^SG:T,Ý íðâ´ÓéÅ߸ެ¢w˜Q¿‰Ð„“€f€u‚G†Ã‹Ü’w›¥Â°½pÊuØçïõ »"ô0Ž>û0Â"þöõ çmØhÊ!½È°{¥{›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸ãÅ­Ó$âöðýÿåM,:"G"Sü]‰g°oAv0{j~暊}¹y=KàVOaoj rxw|ÿt|x rqjRaãV@K…>ù0À" ôõ çkØgÊ ½Æ°z¥z›ß’Æ‹C†w‚f€€•Ï„½‰Vt˜¢Ú¬ç¸äůÓ&âøðÿÿçO,:G$Sý]Šg±oBv0{k~暊}¾y;t#m‡d}Z>KáVPapj rxt|ÿt|x rpjQaáV?K‘>ø0¿" óõ çxØeʽŰ„¥y›Þ’Å‹C†v‚f€€•Ï„¾‰Wu˜¢Ü¬é¸æÅ°ÓâùðéP,:G%Sÿ]‹gªoBv1{k~暊}½y;t"m†d‡Z;OáBš5‡'ö ûõëAÝÏ|ÁÁ´©¯ž•ó뇌ƒä€€ä€ˆƒì‡ô•°ž©Â´pÁ ÏBÝöëû øˆ'œ5âB@KãVRaqj rxt|ÿw|x rojOaàV=K>ö0½" ñõçwØcʽðƒ¥x›Ý’Ä‹G†v‚f€€•Є¾‰Pv˜¢Ý¬Ý¸çŲÓâûð ÛR,:G&S^ŒgªoCv1{k~嚉}½y:t!m…d†Z9OßB™5”'ô þúóë?ÝÏ{Á¿´©®ž—•óꇋƒã€€ä€‰ƒì‡õ‘•§ž!©Ä´qÁ ÏDÝøëóú ùŠ'5äB=O~Zˆd$mAKäVSaijrxu|ÿw|x rnjYaßVô0»" ïõçuØpʽ°¥w›Ü’Ä‹G†u‚f€€“Є¿‰Qw˜¢Þ¬Þ¸éÅ´Óâíð ÝT,:GS^Žg«oDv2{k~晉}¼y@t m„d…Z8OÞB—5“'ó üúì=ÝÏyÁ¾´©­ž–•òꇋƒå€€ä€‰ƒí‡ö’•¨ž"©Å´sÁþÎFÝúëõú ûŒ'5åB?OZ€d$m=tºy‹}šæm~/{Av¯oˆgû]!S!G:K,äûÿôð#â¬ÓáÅå¸ä¬þ¡r˜T‰΄”€g€w‚D†À‹á’|›|¥¼°#½jÊnØçøõÄ"ü0ˆ>6KåVTajjrxu|ÿv|x rmjXaÞV:K>1º" íõçsØoʽÁ°€¥€›Û’ËF†u‚f€€”Ñ„À‰Ro˜¢à¬à¸êŵÓâïð ÞF, :GS^g¬o>v2{l~曉}»y?tmƒdƒZCOÜB–5‘'ñ úúÿë<ÝÏwÁÊ´©¬ž••ñ釋ƒå€€ä€Šƒè‡ö“•©ž#©Æ´tÁÿÎGÝûë÷ú ý'’5çB@OZd%m>tºyˆ}šæl~/{@v®o‘gú] SG#:J,âúÿóð!â¹ÓàÅã¸â¬ý¡q˜SÁ‰Î„”€e€x‚E†Á‹á’}›}¥¾°$½kÊpØçùõÅ"þ0‰>7KæVUakjrxv|ÿv|x rljVaèV9K‹>1¸" üõçrØmʽ¿°¥›Ú’‹E†x‚f€€”Ñ„À‰Rp˜¢á¬á¸ÞÅ·ÓâððàH,!:GSù]g­o?v3{l~暈}»y>t&m‚d‚ZBOÛB”5'ÿ ùúþëIÝÏvÁÈ´©ªž”•÷释ƒå€€å€Šƒè‡÷”•ªž©È´vÁÏIÝýëøú þ'”5ÛBAO‚Z‚d&m>t»yˆ}šæl~3{?v­ogù]SG!:H,àñðâ·ÓÞÅâ¸á¬¢p˜SÁ‰Í„”€f€x‚E†Â‹Ú’›¥¿°&½mÊqØçûõ¸"1‹>9KèVValj rxv|ÿv|xrkjUaçV7KŠ>þ0Æ"úõçpØlÊ%½¾°~¥~›â’Á‹E†x‚e€€”Í„Á‰Sq˜¢â¬ã¸ßŹÓ!âòðùÿâI,#:G Sú]‘g®o@v/{l~暈}ºy>t&mdZ@OçB’5Ž'ý ÷úüëHÝÏtÁÇ´#©©ž”•÷臊ƒä€€å€‹ƒé‡ñ••«ž©É´wÁÏ;Ýÿëúú ‘'•5ÜBCOƒZƒdm?t»y‰}›æl~2{?v¬og^SG :F,ß ïðâ¶ÓëÅà¸à¬¢o˜RÀ‰Ñ„”€f€u‚F†Ã‹Û’€›€¥À°½nÊsØçýõ ¹"1Œ>:KÝVWamj rxv|ÿu|xrjjTaåV6Kˆ>ý0Ä"øõçnØjÊ#½½°|¥}›á’Á‹D†w‚g€€”΄‰Tr˜þ¡ã¬ä¸áÅ«Ó"âôðûÿãK,: G!Sû]’g¯o@v/{m~æš‹}ºy=t%m€d€Z?OæB‘5Œ'û õúúëFÝþÎsÁÅ´"©¨ž“•ö퇉ƒä€€å€‹ƒê‡ò–•¬ž©¾´yÁÏ=Ýìüú ò’'—5ÞBDO„Z„d m@t¼y‰}™æl~2{>v«oŽg^SG:T,Ý íðâ´ÓéÅ߸ެ¢w˜Q¿‰Ð„“€f€u‚F†Ã‹Ü’w›¥Â°½pÊuØçïõ »"ô0Ž>;KßVXanj rxw|ÿu|xrijSaäVBK‡>û0Â"þöõ çmØhÊ"½È°{¥|›à’À‹D†w‚f€€•΄¼‰Us˜ÿ¡å¬æ¸âÅ­Ó$âöðsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/wav/44100-1-32.wav0000644000000000000000000126116013111512442023250 0ustar 00000000000000RIFFhbWAVEfmt D¬± factˆXPEAK—½9Qmü?§Ïdata bwÜ®=9.>ß>¸®«>n=Ô>U?û>¿5?3¾!?@2?T%A?KÉN?£êZ?¯re?¾Mn?Bku?ì½z?Ê;~?TÞ?|¢?±ˆ}?à”y?oÎs?(@l?+øb?ÖX?™ƒK?Ý‚=?Ì.?0w?-¨ ?¨ñ><Ê>ÛU¡>„n>ž>N7ƒ=Ư¼=mÚ½¿C¾ÇlŒ¾óµ¾&Þ¾—\¿r²¿Mò%¿âû5¿:±D¿ÑöQ¿Ø³]¿^Òg¿w?p¿cëv¿§É{¿*Ñ~¿Bü¿¿H¿ò·|¿¥Nx¿r¿òj¿ c`¿È U¿&H¿8Ê9¿û*¿Ä¿F ¿ôç¾#À¾*ê–¾U.Y¾Jò¾,/½Š/=Aò>M.Y>&ê–>ý"À>™ôç>E ?É?*?<Ê9?&H?Ç U?c`?ñj?r?¥Nx?ó·|?ÀH?Bü?*Ñ~?¦É{?aëv?u?p?\Òg?Õ³]?ÍöQ?6±D?àû5?Lò%?t²?™\?&Þ>…óµ>ÓlŒ>,¿C>nmÚ=Н<}7ƒ½¤ž¾1„n¾çU¡¾<ʾ¨ñ¾/¨ ¿2w¿Í.¿Û‚=¿˜ƒK¿ÕX¿*øb¿&@l¿mÎs¿ß”y¿¯ˆ}¿|¢¿TÞ¿Ê;~¿ë½z¿Aku¿½Mn¿®re¿¢êZ¿KÉN¿U%A¿B2¿5¾!¿Á5¿]?û¾x=Ծß¾á8.¾@Ü®½.½»4Ü®=9.> ß>»®«>p=Ô>U?û>¾5?2¾!??2?R%A?HÉN? êZ?¬re?»Mn?Dku?î½z?Ë;~?TÞ?{¢?°ˆ}?à”y?nÎs?(@l?,øb?×X?šƒK?Þ‚=?Ð.?5w?2¨ ?&¨ñ>û;Ê>ÐU¡>„n>už>7ƒ=¯¼LmÚ½¿C¾ËlŒ¾›óµ¾&Þ¾£\¿}²¿Uò%¿éû5¿>±D¿ÔöQ¿Û³]¿aÒg¿y?p¿dëv¿¨É{¿+Ñ~¿Bü¿¿H¿ò·|¿¦Nx¿r¿ój¿!c`¿É U¿&H¿?Ê9¿*¿Ì¿O ¿¯ôç¾#À¾=ê–¾}.Y¾rò¾N/½h/=xò>ƒ.Y>@ê–>#À>²ôç>P ?Í?*?@Ê9? &H?Ê U?"c`?ôj?r?¦Nx?ò·|?ÀH?Bü?+Ñ~?¨É{?dëv?y?p?`Òg?Ú³]?ÓöQ?=±D?èû5?Sò%?|²?¢\?&Þ>˜óµ>çlŒ>T¿C>ÀlÚ=Î ¯<¬7ƒ½»ž¾H„n¾òU¡¾<ʾ)¨ñ¾4¨ ¿6w¿Ñ.¿ß‚=¿›ƒK¿ØX¿-øb¿(@l¿oÎs¿à”y¿°ˆ}¿{¢¿TÞ¿Ë;~¿í½z¿Cku¿ÁMn¿²re¿¨êZ¿QÉN¿[%A¿I2¿=¾!¿Ê5¿n?û¾‹=Ô¾š®«¾çÞ¾Ê8.¾Ü®½.½;5ÌÜ®=&9.>ß>Æ®«>{=Ô>_?û>Ã5?6¾!?C2?V%A?LÉN?£êZ?¯re?½Mn?Aku?ì½z?Ê;~?TÞ?|¢?±ˆ}?â”y?qÎs?+@l?1øb?ÜX?¡ƒK?å‚=?Ø.?=w? ¨ ?¨ñ>ð;Ê>ÅU¡>íƒn>^ž>ð6ƒ=½¯¼{mÚ½2¿C¾ÖlŒ¾ˆóµ¾ &Þ¾›\¿u²¿Mò%¿âû5¿7±D¿ÎöQ¿Ö³]¿\Òg¿v?p¿bëv¿¦É{¿*Ñ~¿Bü¿ÀH¿ô·|¿¨Nx¿r¿÷j¿&c`¿Ï U¿%&H¿0Ê9¿ó*¿»¿< ¿ˆôç¾ë"À¾ê–¾'.Y¾ò¾ð/½Å/=Pò>\.Y>-ê–>#À> ôç>H ?Å?*?9Ê9?.&H?Å U?-c`?ðj?"r?¤Nx?ö·|?¿H?Bü?+Ñ~?¤É{?gëv?q?p?dÒg?ϳ]?ÙöQ?/±D?ïû5?Cò%?„²?\?,&Þ>oóµ>úlŒ>þ¾C>nÚ=¯<[6ƒ½“ž¾¤ƒn¾ÞU¡¾C<ʾ¨ñ¾F¨ ¿.w¿á.¿Ø‚=¿©ƒK¿ÒX¿7øb¿$@l¿uÎs¿Þ”y¿³ˆ}¿{¢¿TÞ¿Ì;~¿é½z¿Fku¿¹Mn¿·re¿œêZ¿WÉN¿M%A¿P2¿,¾!¿Ò5¿H?û¾=Ô¾­®«¾9ß¾ñ8.¾aÝ®½.ÞÌ3|Û®=þ8.>?ß>³®«>£=Ô>N?û>Õ5?.¾!?R2?O%A?XÉN?žêZ?¸re?ºMn?Gku?ê½z?Ì;~?TÞ?{¢?³ˆ}?Ý”y?tÎs?#@l?6øb?ÑX?§ƒK?Ö‚=?ß.?,w?C¨ ?¨ñ>><Ê>ØU¡>„n>†ž>B6ƒ=y¯¼)nÚ½ ¿C¾mŒ¾uóµ¾2&Þ¾’\¿‡²¿Eò%¿ñû5¿1±D¿ÛöQ¿Ñ³]¿fÒg¿r?p¿gëv¿¤É{¿,Ñ~¿Bü¿¿H¿õ·|¿£Nx¿!r¿îj¿+c`¿Ã U¿,&H¿7Ê9¿*¿Ã¿` ¿šôç¾9#À¾'ê–¾Ò-Y¾Cò¾“/½#/=§ò>4.Y>Wê–>ñ"À>Çôç>? ?×?õ*?IÊ9?&H?Ñ U?c`?ùj?r?©Nx?ï·|?ÀH?Bü?)Ñ~?«É{?aëv?€?p?[Òg?å³]?ÌöQ?J±D?ßû5?cò%?s²?|\?&Þ>Fóµ>ÐlŒ>¨¾C>amÚ=W ¯< 7ƒ½êž¾ùƒn¾V¡¾ö;ʾ>¨ñ¾#¨ ¿@w¿Ã.¿ç‚=¿ƒK¿ÞX¿$øb¿-@l¿hÎs¿ã”y¿­ˆ}¿|¢¿UÞ¿É;~¿ñ½z¿@ku¿ÈMn¿­re¿²êZ¿JÉN¿i%A¿@2¿¾!¿À5¿"?û¾u=Ô¾„®«¾ß¾›8.¾³Ü®½.½»5+Ü®=T9.>îÞ>Ü®«>V=Ô>t?û>²5??¾!?42?^%A?@ÉN?©êZ?¦re?ÂMn?;ku?î½z?Ç;~?TÞ?}¢?°ˆ}?æ”y?nÎs?3@l?,øb?ÅX?šƒK?È‚=?Ï.?w?1¨ ?ë§ñ><Ê>¯U¡>;„n>0ž>’7ƒ=4¯¼ÚlÚ½`¿C¾¯lŒ¾žóµ¾æ%Þ¾¥\¿e²¿Vò%¿Óû5¿?±D¿ÃöQ¿Ü³]¿TÒg¿z?p¿\ëv¿¨É{¿(Ñ~¿Bü¿ÂH¿ò·|¿­Nx¿r¿æj¿!c`¿· U¿&H¿(Ê9¿*¿±¿N ¿sôç¾#À¾ýé–¾w.Y¾ìñ¾4/½/=ò>‰.Y>ê–>#À>|ôç>R ?µ?*?,Ê9?!&H?¹ U?#c`?çj?r?ŸNx?ò·|?½H?Bü?-Ñ~?¨É{?[ëv?x?p?RÒg?Ú³]?ÀöQ?<±D?Ðû5?Rò%?a²?¡\?Ý%Þ>•óµ>¦lŒ>M¿C>³lÚ=›¯<¸7ƒ½Cž¾N„n¾¸U¡¾<ʾô§ñ¾5¨ ¿w¿Ó.¿Ë‚=¿œƒK¿ÇX¿.øb¿@l¿oÎs¿Ù”y¿°ˆ}¿}¢¿TÞ¿Ç;~¿í½z¿:ku¿ÀMn¿£re¿§êZ¿=ÉN¿Z%A¿12¿<¾!¿®5¿k?û¾M=Ô¾Ó®«¾äÞ¾A9.¾Ü®½†S•µÙÜ®=®8.>ß>®«>~=Ô>*?û>Ä5?¾!?D2?B%A?LÉN?“êZ?¯re?²Mn?Aku?ò½z?Ñ;~?SÞ?|¢?­ˆ}?Ó”y?{Îs?+@l?"øb?¹X?³ƒK?ä‚=?¿.? w?T¨ ?6¨ñ>í;Ê>…U¡>ß„n>מ>ä6ƒ=𯼋kÚ½»¾C¾ÙlŒ¾Ç󵾚%Þ¾\¿w²¿fò%¿¶û5¿$±D¿ÏöQ¿ç³]¿xÒg¿k?p¿bëv¿¬É{¿0Ñ~¿Bü¿ÀH¿î·|¿˜Nx¿(r¿÷j¿c`¿« U¿8&H¿EÊ9¿ò*¿ ¿q ¿¿ôç¾è"À¾Óé–¾/Y¾”ò¾×/½Þ/=Xñ>å-Y>0ê–>B#À>1ôç>. ?Ç?*?gÊ9?&H?Å U?.c`? j?r?¤Nx?ö·|?ÄH?Cü?+Ñ~?¤É{?Uëv?‡?p?dÒg?ϳ]?³öQ?W±D?îû5?Bò%?O²?Å\?)&Þ>lóµ>|lŒ>ó¿C>nÚ=߯@l¿bÎs¿Þ”y¿³ˆ}¿~¢¿VÞ¿Ì;~¿é½z¿4ku¿ÏMn¿¶re¿›êZ¿0ÉN¿v%A¿O2¿+¾!¿œ5¿µ?û¾š=Ô¾ª®«¾ºÞ¾ç9.¾TÝ®½.ÞL4‡Ý®=8.>ÆÞ>¶®«>¦=Ô>À?û>¡5?0¾!?T2?z%A?4ÉN?ŸêZ?¹re?ÒMn?5ku?ê½z?Ì;~?VÞ?~¢?³ˆ}?Ý”y?`Îs?;@l?5øb?ÐX?ƒK?ƒ=?Þ.?+w? ¨ ?€¨ñ>;<Ê>ÕU¡>‘ƒn>}Ÿ>48ƒ=¬¯¼6nÚ½ ÀC¾ˆlŒ¾xóµ¾4&Þ¾Ê\¿T²¿Fò%¿òû5¿[±D¿·öQ¿Ò³]¿fÒg¿‰?p¿Wëv¿¥É{¿,Ñ~¿Cü¿ÃH¿õ·|¿£Nx¿ r¿j¿*c`¿Â U¿&H¿bÊ9¿*¿Á¿) ¿ õç¾6#À¾$ê–¾Ì-Y¾?ñ¾x/½=/=­ò>4/Y>ßé–>ô"À>Êôç>w ?¥?ö*?JÊ9?<&H?® U?c`?ùj?*r?šNx?ï·|?ÁH?Bü?/Ñ~?«É{?`ëv?i?p?vÒg?ä³]?ÌöQ? ±D? ü5?bò%?q²?{\?u&Þ>»óµ>ÍlŒ>¢¾C>XkÚ=#¯<7ƒ½ðž¾ø„n¾‘U¡¾ù;ʾA¨ñ¾Z¨ ¿w¿Ä.¿è‚=¿·ƒK¿¼X¿$øb¿-@l¿|Îs¿Õ”y¿®ˆ}¿|¢¿SÞ¿Ñ;~¿ñ½z¿@ku¿°Mn¿Ére¿±êZ¿IÉN¿>%A¿m2¿K¾!¿¿5¿?û¾þ<Ô¾ù®«¾ ß¾•8.¾¨Ú®½wº¶7Ü®=[9.>lß>g®«>Y=Ô>w?û>è5?¾!?52?_%A?fÉN?‰êZ?¦re?ÂMn?Nku?á½z?È;~?TÞ?y¢?¸ˆ}?æ”y?mÎs?@l?Iøb?æX?™ƒK?Ç‚=?Ÿ.?Lw?/¨ ?è§ñ>;Ê>%V¡>5„n>*ž>†5ƒ=h ¯¼ælÚ½g¿C¾.mŒ¾)óµ¾è%Þ¾¦\¿š²¿&ò%¿Ôû5¿@±D¿èöQ¿½³]¿UÒg¿{?p¿nëv¿É{¿(Ñ~¿Bü¿½H¿ü·|¿­Nx¿r¿åj¿c`¿Ù U¿&H¿'Ê9¿Ñ*¿ã¿L ¿qôç¾—"À¾tê–¾p.Y¾æñ¾/½›/=ò>.Y>„ê–>¦"À>ôç>S ?ê?×*?-Ê9?"&H?Þ U?c`?èj?r?¯Nx?é·|?½H?Bü?'Ñ~?³É{?lëv?x?p?QÒg?¹³]?äöQ?;±D?Ïû5? ò%?”²?Ÿ\?Ú%Þ>óµ>mŒ>G¿C>§lÚ=h ¯<Æ5ƒ½Iž¾T„n¾4V¡¾¬;ʾö§ñ¾6¨ ¿Rw¿¥.¿Ì‚=¿ƒK¿ëX¿øb¿@l¿pÎs¿è”y¿¨ˆ}¿z¢¿TÞ¿Ç;~¿à½z¿Lku¿¿Mn¿£re¿…êZ¿bÉN¿Y%A¿02¿ ¾!¿á5¿i?û¾J=Ô¾X®«¾]ß¾;9.¾øÛ®½.½;6èÚ®=´8.>ß>¯«> =Ô>-?û>Å5?Q¾!?2?C%A?MÉN?µêZ?”re?³Mn?Bku?ó½z?Ò;~?SÞ?|¢?­ˆ}?Ó”y?zÎs?*@l?!øb?¸X?²ƒK?ã‚=?¾.?w?S¨ ?3¨ñ>ê;Ê>‚U¡>Ù„n>О>×6ƒ=#¯¼—kÚ½Á¾C¾ÝlŒ¾Êóµ¾%Þ¾‚\¿x²¿hò%¿·û5¿%±D¿ÐöQ¿è³]¿yÒg¿l?p¿bëv¿­É{¿0Ñ~¿Bü¿ÀH¿î·|¿˜Nx¿'r¿öj¿c`¿ª U¿7&H¿DÊ9¿ð*¿ž¿p ¿¼ôç¾å"À¾Ðé–¾/Y¾ò¾½/½ø/=_ñ>ë-Y>3ê–>E#À>4ôç>/ ?È?*?Ê9?&H?Æ U?.c`? j?r?¥Nx?ö·|?ÄH?Cü?+Ñ~?£É{?Uëv?†?p?cÒg?γ]?³öQ?V±D?ìû5?@ò%?N²?Ä\?&&Þ>ióµ>ylŒ>í¿C>ömÚ=¬¯@l¿cÎs¿ß”y¿´ˆ}¿¢¿UÞ¿Ì;~¿è½z¿3ku¿ÏMn¿µre¿›êZ¿/ÉN¿u%A¿N2¿)¾!¿š5¿²?û¾—=Ô¾§®«¾·Þ¾á9.¾GÝ®½¢¦™4”Ý®=8.>ÉÞ>¹®«>©=Ô>Ã?û>¢5?1¾!?U2?{%A?5ÉN?ŸêZ?ºre?ÒMn?6ku?ê½z?Í;~?VÞ?~¢?²ˆ}?Ü”y?`Îs?:@l?4øb?ÏX?~ƒK?ÿ‚=?Ý.?)w? ¨ ?}¨ñ>8<Ê>ÒU¡>‹ƒn>wŸ>'8ƒ=߯¼BnÚ½¾C¾‹lŒ¾{óµ¾7&Þ¾Ì\¿V²¿Hò%¿óû5¿\±D¿¸öQ¿Ó³]¿gÒg¿Š?p¿Wëv¿¥É{¿,Ñ~¿Cü¿ÃH¿õ·|¿¢Nx¿ r¿j¿*c`¿Á U¿&H¿aÊ9¿*¿À¿' ¿õç¾3#À¾!ê–¾Å-Y¾4ó¾^/½V/=³ò>;/Y>ãé–>÷"À>Íôç>x ?¦?÷*?KÊ9?=&H?¯ U?c`?új?*r?šNx?ï·|?ÁH?Bü?/Ñ~?«É{?`ëv?i?p?uÒg?ã³]?ËöQ?±D? ü5?`ò%?p²?z\?r&Þ>¸óµ>ÊlŒ>›¾C>KkÚ=ð¯<#7ƒ½öž¾þ„n¾•U¡¾ü;ʾD¨ñ¾[¨ ¿w¿Å.¿é‚=¿¸ƒK¿½X¿%øb¿.@l¿}Îs¿Õ”y¿®ˆ}¿|¢¿SÞ¿Ð;~¿ñ½z¿?ku¿¯Mn¿Ère¿°êZ¿HÉN¿=%A¿l2¿J¾!¿½5¿?û¾û<Ô¾ö®«¾ß¾8.¾›Ú®½†S¶DÜ®=a9.>pß>j®«>\=Ô>y?û>é5?¾!?72?`%A?gÉN?ŠêZ?§re?ÃMn?Nku?â½z?È;~?TÞ?y¢?¸ˆ}?æ”y?mÎs?@l?Høb?åX?˜ƒK?Å‚=?ü.?æv?.¨ ?Ǩñ>š;Ê>"V¡>=‚n>#ž>w9ƒ=š¯¼ólÚ½v½C¾1mŒ¾,óµ¾Ò&Þ¾¨\¿3²¿‰ò%¿Öû5¿ï°D¿éöQ¿¾³]¿ŒÒg¿{?p¿Lëv¿µÉ{¿(Ñ~¿Aü¿½H¿û·|¿Nx¿r¿j¿c`¿Ø U¿Ì%H¿&Ê9¿/*¿{¿K ¿Rõç¾”"À¾qê–¾v,Y¾àñ¾ /½³ /= ò>¢,Y>‡ê–>©"À>fõç>T ?„?8*?.Ê9?Ó%H?ß U?c`?j?r?Nx?ý·|?½H?Cü?'Ñ~?²É{?Iëv?w?p?‡Òg?¸³]?ãöQ?è°D?Îû5?€ò%?*²?ž\?¾&Þ>óµ>mŒ>J½C>šlÚ=4¯<Ñ9ƒ½Pž¾i‚n¾8V¡¾¯;ʾۨñ¾8¨ ¿îv¿ .¿Í‚=¿QƒK¿ëX¿øb¿O@l¿pÎs¿Ì”y¿ºˆ}¿z¢¿XÞ¿Æ;~¿ù½z¿'ku¿¿Mn¿Ûre¿„êZ¿aÉN¿%A¿.2¿k¾!¿v5¿f?û¾1>Ô¾U®«¾Zß¾<7.¾ëÛ®½ðíž¶ñÞ®=»8.>&Þ> ¯«>=Ô>@û>Ç5?ð½!?t2?D%A?ÉN?¶êZ?”re?âMn?Bku?Ù½z?Ò;~?SÞ?u¢?¬ˆ}?ï”y?SÎs?*@l?[øb?·X?±ƒK?Œ‚=?½.?lw?æ§ ?0¨ñ>Ó<Ê>U¡>Ó„n>М>Ê6ƒ=W¯¼žoڽǾC¾ékŒ¾Í󵾟%Þ¾ñ\¿y²¿ò%¿ü5¿&±D¿ˆöQ¿é³]¿CÒg¿™?p¿cëv¿–É{¿0Ñ~¿Bü¿¶H¿î·|¿·Nx¿ýr¿õj¿Rc`¿© U¿6&H¿ëÉ9¿ï*¿¿ ¿¹ôç¾Ï#À¾Íé–¾/Y¾‹ð¾£/½/=aó>ñ-Y>Aé–>H#À>7ôç> ?É?¹*?iÊ9? &H?€ U?/c`?Øj?8r?¥Nx?â·|?ÄH?Cü?Ñ~?£É{?vëv?Z?p?bÒg? ´]?²öQ?U±D?‘û5??ò%?µ²?T\?#&Þ>Uôµ>vlŒ>æ¿C>ïiÚ=y¯<ƒ4ƒ½£Ÿ¾·ƒn¾õT¡¾L<ʾ¯§ñ¾€¨ ¿2w¿‡.¿ƒ=¿…ƒK¿X¿9øb¿@l¿ŠÎs¿ß”y¿¢ˆ}¿¢¿UÞ¿¼;~¿è½z¿Wku¿ŸMn¿µre¿ÜêZ¿.ÉN¿t%A¿ñ2¿(¾!¿6¿Ð>û¾”=Ô¾•¯«¾´Þ¾Û9.¾>Ù®½.ÞÌ4¤Ù®= :.>ÍÞ>Ë­«>¬=Ô>ç>û> 6?2¾!?ú2?|%A?6ÉN?ãêZ?ºre?¤Mn?[ku?ë½z?¾;~?VÞ?~¢? ˆ}?Ü”y?†Îs? @l?4øb?X?}ƒK?þ‚=?~.?(w?u¨ ?˜§ñ>5<Ê>ÂV¡>…ƒn>qŸ>4ƒ=¯¼UjÚ½ÀC¾lŒ¾môµ¾:&Þ¾_\¿¿²¿Iò%¿šû5¿]±D¿¹öQ¿´]¿hÒg¿^?p¿zëv¿¥É{¿ Ñ~¿Cü¿ÃH¿à·|¿¢Nx¿4r¿Ój¿)c`¿ U¿&H¿`Ê9¿¯*¿¿¿“ ¿ ôç¾0#À¾ë–¾¿-Y¾.ó¾Gÿ.½p/=¾ð>A/Y>æé–>ç#À>Ðôç> ??ù*?ôÉ9?>&H?° U?Xc`?új?r?ºNx?ð·|?·H?Bü?/Ñ~?“É{?`ëv?”?p?>Òg?â³]?÷Q?±D? ü5?þñ%?o²?æ\?ˆ%Þ>µóµ>½mŒ>•¾C>8oÚ=¾¯<07ƒ½¾…n¾˜U¡¾ê<ʾF¨ñ¾ñ§ ¿vw¿Æ.¿”‚=¿¹ƒK¿¾X¿aøb¿/@l¿VÎs¿ò”y¿®ˆ}¿v¢¿SÞ¿Ð;~¿×½z¿?ku¿ÞMn¿re¿°êZ¿’ÉN¿<%A¿k2¿æ½!¿¼5¿ù?û¾ø<Ծ󮫾Þ¾ˆ8.¾‹Þ®½¶‰¸6QÜ®=o7.>sß>m®«>H>Ô>|?û>5?u¾!?82? %A?hÉN?ŠêZ?áre?ÃMn?*ku?ü½z?È;~?PÞ?y¢?¸ˆ}?É”y?lÎs?J@l? øb?åX?äƒK?Ä‚=?ú.?äv?-¨ ?Ĩñ>—;Ê>V¡>7‚n>ž>k9ƒ=ί¼mÚ½}½C¾4mŒ¾/óµ¾Õ&Þ¾©\¿5²¿Šò%¿×û5¿ð°D¿êöQ¿¾³]¿ŒÒg¿|?p¿Mëv¿µÉ{¿(Ñ~¿Aü¿½H¿û·|¿Nx¿r¿j¿c`¿Ø U¿k&H¿%Ê9¿.*¿z¿J ¿Oõ羑"À¾nê–¾p,Y¾Ùñ¾æ /½Í /=ò>¨,Y>Šê–>¬"À>iõç>V ?†?9*?/Ê9?Ô%H?à U?c`?j?r?Nx?ý·|?¾H?Cü?'Ñ~?²É{?Iëv?w?p?†Òg?·³]?âöQ?ç°D?Íû5?ò%?)²?œ\?»&Þ>óµ>mŒ>D½C>lÚ=¯<Þ9ƒ½Vž¾o‚n¾;V¡¾±;ʾިñ¾9¨ ¿ðv¿ .¿Î‚=¿RƒK¿ìX¿øb¿P@l¿qÎs¿Ì”y¿ºˆ}¿z¢¿XÞ¿Æ;~¿ù½z¿&ku¿¾Mn¿Úre¿ƒêZ¿`ÉN¿%A¿-2¿i¾!¿u5¿c?û¾.>Ô¾R®«¾Wß¾67.¾ÞÛ®½wº›¶ýÞ®=Á8.>)Þ>¯«>=Ô>@û>È5?ñ½!?u2?E%A?ÉN?·êZ?•re?ãMn?Cku?Ú½z?Ò;~?SÞ?‚¢?¬ˆ}?ï”y?RÎs?)@l?[øb?¶X?°ƒK?‹‚=?».?jw?å§ ?-¨ñ>Ð<Ê>|U¡>Í„n>Éœ>½6ƒ=Н¼«oڽξC¾ìkŒ¾Ðóµ¾¢%Þ¾ó\¿z²¿ ò%¿ü5¿'±D¿‰öQ¿é³]¿DÒg¿™?p¿cëv¿–É{¿0Ñ~¿Bü¿¶H¿í·|¿¶Nx¿ür¿õj¿Qc`¿¨ U¿5&H¿êÉ9¿î*¿¿ ¿¶ôç¾Ì#À¾Êé–¾ /Y¾…ð¾Š/½-/=gó>÷-Y>Eé–>K#À>9ôç>Ÿ ?Ê?º*?jÊ9? &H? U?0c`?Øj?9r?¥Nx?â·|?ÄH?Cü?Ñ~?£É{?vëv?Y?p?bÒg? ´]?±öQ?T±D?û5?>ò%?³²?S\? &Þ>Rôµ>slŒ>à¿C>âiÚ=F¯<4ƒ½©Ÿ¾½ƒn¾øT¡¾O<ʾ²§ñ¾¨ ¿3w¿ˆ.¿ƒ=¿†ƒK¿X¿:øb¿@l¿‹Îs¿ß”y¿¢ˆ}¿¢¿UÞ¿¼;~¿è½z¿Wku¿ŸMn¿´re¿ÛêZ¿-ÉN¿s%A¿ð2¿'¾!¿6¿Í>û¾‘=Ô¾’¯«¾±Þ¾Ô9.¾2Ù®½Ý 5±Ù®=:.>ÐÞ>έ«>®=Ô>é>û>6?3¾!?û2?}%A?6ÉN?äêZ?»re?¥Mn?[ku?ë½z?¾;~?VÞ?~¢? ˆ}?Ü”y?†Îs?@l?3øb?X?|ƒK?ý‚=?}.?'w?s¨ ?–§ñ>2<Ê>¿V¡>ƒn>jŸ>4ƒ=F¯¼bjÚ½ÀC¾’lŒ¾’òµ¾=&Þ¾`\¿À²¿Jò%¿›û5¿^±D¿ºöQ¿´]¿hÒg¿_?p¿zëv¿¦É{¿ Ñ~¿Cü¿ÃH¿à·|¿¡Nx¿4r¿Òj¿(c`¿ U¿&H¿_Ê9¿®*¿¾¿‘ ¿ôç¾-#À¾ë–¾¹-Y¾(ó¾-ÿ.½Š/=Äð>G/Y>éé–>ê#À>Òôç> ??ú*?õÉ9??&H?± U?Yc`?ûj?r?ºNx?ð·|?·H?Bü?/Ñ~?“É{?_ëv?”?p?=Òg?á³]?÷Q?±D?ü5?üñ%?m²?å\?…%Þ>²óµ>ºmŒ>¾C>,oÚ=Н<=7ƒ½ ¾ …n¾›U¡¾í<ʾI¨ñ¾ò§ ¿ww¿Ç.¿•‚=¿ºƒK¿¿X¿bøb¿/@l¿WÎs¿ò”y¿®ˆ}¿v¢¿SÞ¿Ð;~¿Ö½z¿>ku¿ÝMn¿Žre¿¯êZ¿‘ÉN¿;%A¿j2¿ä½!¿»5¿ö?û¾õ<Ծ𮫾úß¾‚8.¾~Þ®½.½»6^Ü®=u7.>vß>p®«>K>Ô>?û>‚5?v¾!?92?%A?iÉN?‹êZ?áre?ÄMn?+ku?ü½z?È;~?PÞ?y¢?¸ˆ}?É”y?lÎs?I@l? øb?äX?ãƒK?Â=?ù.?ãv?+¨ ?¨ñ>”;Ê>V¡>1‚n>ž>^9ƒ=¯¼ mÚ½ƒ½C¾7mŒ¾2󵾨&Þ¾ª\¿6²¿‹ò%¿Øû5¿ñ°D¿ëöQ¿¿³]¿Òg¿|?p¿Mëv¿µÉ{¿(Ñ~¿Aü¿¼H¿û·|¿Nx¿r¿j¿ÿb`¿× U¿j&H¿$Ê9¿-*¿y¿H ¿Lõ美"À¾kê–¾i,Y¾Óñ¾Í /½æ /=ò>®,Y>ê–>¯"À>lõç>W ?‡?:*?0Ê9?Õ%H?à U?c`?j?r?‘Nx?þ·|?¾H?Cü?'Ñ~?²É{?Hëv?v?p?…Òg?¶³]?áöQ?æ°D?Ëû5?~ò%?(²?›\?¸&Þ>óµ>mŒ>>½C>lÚ=ͯ<ê9ƒ½\ž¾u‚n¾>V¡¾´;ʾá¨ñ¾:¨ ¿ñv¿ .¿Ï‚=¿SƒK¿íX¿øb¿P@l¿qÎs¿Ì”y¿ºˆ}¿z¢¿XÞ¿Æ;~¿ù½z¿&ku¿¾Mn¿Ùre¿‚êZ¿_ÉN¿%A¿,2¿h¾!¿t5¿`?û¾+>Ô¾O®«¾Tß¾07.¾ÑÛ®½ÿ†˜¶ ß®=Ç8.>-Þ>¯«>=Ô>@û>É5?ò½!?v2?F%A?ÉN?¸êZ?–re?ãMn?Cku?Ú½z?Ò;~?SÞ?‚¢?¬ˆ}?î”y?RÎs?(@l?Zøb?¶X?¯ƒK?Š‚=?º.?iw?ä§ ?*¨ñ>Í<Ê>yU¡>Æ„n>Ü>°6ƒ=¾¯¼¸oÚ½Ô¾C¾ðkŒ¾Óóµ¾¥%Þ¾ô\¿|²¿ ò%¿ü5¿(±D¿ŠöQ¿ê³]¿EÒg¿š?p¿dëv¿–É{¿1Ñ~¿Bü¿¶H¿í·|¿¶Nx¿ür¿ôj¿Qc`¿§ U¿4&H¿éÉ9¿í*¿¿ÿ ¿³ôç¾É#À¾Çé–¾/Y¾~ð¾p/½G/=nó>þ-Y>Hé–>N#À><ôç>  ?Ì?»*?kÊ9? &H?‚ U?1c`?Ùj?9r?¦Nx?ã·|?ÄH?Cü?Ñ~?¢É{?uëv?Y?p?aÒg? ´]?°öQ?S±D?û5?=ò%?²²?Q\?&Þ>Oôµ>plŒ>Ú¿C>ÖiÚ=¯<œ4ƒ½°Ÿ¾Ãƒn¾ûT¡¾R<ʾµ§ñ¾‚¨ ¿5w¿‰.¿ ƒ=¿‡ƒK¿’X¿;øb¿@l¿‹Îs¿à”y¿£ˆ}¿¢¿UÞ¿¼;~¿ç½z¿Vku¿žMn¿³re¿ÚêZ¿,ÉN¿r%A¿î2¿&¾!¿6¿Ë>û¾Ž=Ô¾¯«¾®Þ¾Î9.¾%Ù®½¢¦5¾Ù®=:.>ÓÞ>Ñ­«>±=Ô>ì>û>6?5¾!?ü2?~%A?7ÉN?äêZ?¼re?¥Mn?\ku?ë½z?¾;~?VÞ?~¢? ˆ}?Û”y?…Îs?@l?2øb?X?{ƒK?ü‚=?{.?&w?r¨ ?“§ñ>/<Ê>¼V¡>xƒn>dŸ>4ƒ=y¯¼njÚ½%ÀC¾•lŒ¾•òµ¾@&Þ¾b\¿Â²¿Kò%¿û5¿_±D¿»öQ¿´]¿iÒg¿_?p¿zëv¿¦É{¿ Ñ~¿Cü¿ÃH¿ß·|¿¡Nx¿3r¿Ñj¿'c`¿ U¿ÿ%H¿^Ê9¿­*¿¼¿ ¿ôç¾*#À¾ ë–¾³-Y¾!ó¾ÿ.½£/=Ëð>M/Y>ìé–>"À>Õôç> ??û*?öÉ9?@&H?² U?Zc`?üj?r?»Nx?ð·|?·H?Bü?/Ñ~?“É{?_ëv?“?p?=Òg?á³]?÷Q?±D?ü5?ûñ%?l²?ä\?ƒ%Þ>¯óµ>·mŒ>‰¾C>oÚ=W¯ku¿ÜMn¿re¿®êZ¿ÉN¿9%A¿i2¿ã½!¿¹5¿ó?û¾ò<Ô¾í®«¾÷ß¾|8.¾qÞ®½§ð¾6jÜ®={7.>yß>s®«>N>Ô>‚?û>„5?w¾!?:2?%A?jÉN?ŒêZ?âre?ÅMn?+ku?ý½z?È;~?QÞ?y¢?¸ˆ}?È”y?kÎs?I@l? øb?ãX?âƒK?‚=?ø.?âv?*¨ ?¿¨ñ>‘;Ê>V¡>*‚n>ž>Q9ƒ=4¯¼mÚ½‰½C¾:mŒ¾5óµ¾Û&Þ¾¬\¿7²¿ò%¿Ùû5¿ò°D¿ìöQ¿À³]¿ŽÒg¿}?p¿Nëv¿µÉ{¿)Ñ~¿Aü¿¼H¿û·|¿ŒNx¿r¿j¿þb`¿Ö U¿i&H¿#Ê9¿,*¿w¿G ¿Iõ羋"À¾hê–¾c,Y¾Íñ¾³ /½ /=ò>´,Y>ê–>²"À>nõç>Y ?ˆ?;*?1Ê9?Ö%H?á U?c`?j?r?‘Nx?þ·|?¾H?Cü?'Ñ~?²É{?Hëv?v?p?…Òg?¶³]?àöQ?‰±D?Êû5?}ò%?&²?š\?µ&Þ>óµ>mŒ>7½C>tlÚ=š¯<÷9ƒ½cž¾{‚n¾AV¡¾·;ʾã¨ñ¾<¨ ¿òv¿ .¿Ð‚=¿TƒK¿îX¿øb¿Q@l¿rÎs¿Í”y¿ºˆ}¿z¢¿XÞ¿Æ;~¿ø½z¿%ku¿½Mn¿Ùre¿êZ¿^ÉN¿%A¿+2¿g¾!¿r5¿]?û¾(>Ô¾L®«¾Qß¾)7.¾ÅÛ®½†S•¶ß®=Î8.>0Þ>¯«>=Ô>@û>Ê5?ó½!?x2?G%A?ÉN?¹êZ?–re?äMn?Dku?Ú½z?Ò;~?SÞ?‚¢?¬ˆ}?î”y?QÎs?(@l?Yøb?µX?®ƒK?‰‚=?¹.?hw?â§ ?'¨ñ>Ê<Ê>vU¡>À„n>½œ>¤6ƒ=ñ¯¼ÄoÚ½Ú¾C¾ókŒ¾Ö󵾨%Þ¾ö\¿}²¿ ò%¿ü5¿)±D¿‹öQ¿ë³]¿EÒg¿š?p¿dëv¿—É{¿1Ñ~¿Bü¿ÉH¿¸|¿wNx¿ûr¿ój¿Pc`¿4 U¿”%H¿èÉ9¿ì*¿¿× ¿èòç¾ì!À¾Äé–¾ü.Y¾pô¾S/½\/=tó>.Y>Ké–>v!À>öç>¢ ?Í?¼*?¼É9?«&H? U?1c`?Új?çr?hNx? ¸|?ÄH?Cü?7Ñ~?ÐÉ{?1ëv?X?p?`Òg? ´]?A÷Q?®°D?Žû5?;ò%?±²?,]?M$Þ>nòµ>mlŒ>Ó¿C>½qÚ=Ý-¯<¥<ƒ½¶Ÿ¾Éƒn¾þT¡¾:ʾ{©ñ¾„¨ ¿6w¿‹.¿^‚=¿#„K¿X¿<øb¿@l¿>Îs¿•y¿Æˆ}¿¢¿UÞ¿Ú;~¿¾z¿ ku¿žMn¿³re¿ÚêZ¿ÂÉN¿É$A¿í2¿$¾!¿ÿ5¿†@û¾º;Ô¾ª­«¾ªÞ¾È9.¾ᮽÙËt·Ãá®= :.>ÖÞ>Ô­«>â;Ô>­@û>6?6¾!?ý2?×$A?ÏÉN?åêZ?½re?¦Mn?ku?¾z?Ü;~?VÞ?~¢?È}?•y?7Îs?@l?1øb?X?„K?O‚=?z.?$w?q¨ ?S©ñ>V:Ê>ÓT¡>rƒn>^Ÿ>ò;ƒ=®ð®¼orÚ½+ÀC¾˜lŒ¾˜òµ¾v$Þ¾?]¿Ã²¿Mò%¿žû5¿¼°D¿N÷Q¿´]¿jÒg¿`?p¿7ëv¿ÔÉ{¿9Ñ~¿Cü¿ÃH¿¸|¿ßNx¿ßr¿Ñj¿'c`¿ U¿&H¿­É9¿«*¿»¿Ž ¿àõç¾M!À¾ é–¾¬-Y¾ó¾ö/½Áõ.=Éô>T/Y>ïé–>"À>óç>ê ??ü*?÷É9?¢%H?A U?[c`?üj?r?}Nx?¸|?ËH?Bü?/Ñ~?ÁÉ{?¢ëv?:?p?<Òg?à³]?÷Q?¿±D?Rû5?úñ%?k²?â\?M'Þ>Íñµ>ÈkŒ>‚¾C>oÚ="#¯<[/ƒ½ ¡¾…n¾¡U¡¾;ʾŒ¦ñ¾Ë¨ ¿zw¿Ê.¿˜‚=¿!ƒK¿JX¿cøb¿0@l¿XÎs¿º”y¿Òˆ}¿ƒ¢¿SÞ¿Ð;~¿ ¾z¿†ku¿~Mn¿re¿­êZ¿ÉN¿à%A¿°2¿â½!¿¸5¿ð?û¾Á>Ô¾­«¾Þ¾u8.¾dÞ®½ðí·Ô®=s;.>|ß>v®«><Ô>Æ=û>X6?x¾!?;2?%A?ÔÈN?ëZ?ãre?ÅMn?,ku?ɽz?æ;~?YÞ?y¢?·ˆ}?•y?¹Îs?æ?l? øb?âX?áƒK?mƒ=?;.?áv?)¨ ?¼¨ñ>e=Ê>0T¡>$‚n> ž>D9ƒ=iû®¼uÚ½}ÁC¾=mŒ¾8óµ¾%Þ¾Ñ[¿ ³¿Žò%¿Úû5¿ó°D¿ZöQ¿A´]¿ŽÒg¿}?p¿Nëv¿‡É{¿AÑ~¿Dü¿¼H¿ú·|¿ÊNx¿jr¿®j¿ýb`¿Õ U¿h&H¿ÒÊ9¿k*¿v¿F ¿Fõç¾c$À¾|è–¾],Y¾Æñ¾š /½û.=ö>£0Y>“ê–>µ"À>©óç>€ ?W?<*?2Ê9?×%H?T U?„c`?j?r?’Nx?Õ·|?ÑH?Aü?&Ñ~?±É{?‹ëv?Í?p?Òg?µ³]?ßöQ?ˆ±D?}ü5?¹ñ%?%²?˜\?²&Þ>êôµ>"kŒ>1½C>glÚ=g¯<2ƒ½]¢¾e†n¾DV¡¾º;ʾ#§ñ¾f§ ¿½w¿ .¿Ñ‚=¿UƒK¿eX¿‹øb¿Q@l¿rÎs¿Í”y¿—ˆ}¿ˆ¢¿PÞ¿Æ;~¿ø½z¿nku¿Nn¿fre¿êZ¿]ÉN¿¨%A¿â2¿Ÿ½!¿q5¿[?û¾%>Ô¾+°«¾^ݾ#7.¾¸Û®½ ’¶+×®=Å<.>"à>¯«>=Ô>\>û>ø4?»¾!?y2?H%A?ÉN?5êZ? se?åMn?Dku?Û½z?µ;~?\Þ?t¢?«ˆ}?î”y?ŸÎs?Š@l?â÷b?´X?­ƒK?4ƒ=?t .?v?á§ ?%¨ñ>Ç<Ê>YW¡>Ö€n>¶œ>—6ƒ=$¯¼ÝgÚ½ÎÂC¾âmŒ¾Ù󵾫%Þ¾\¿®±¿Ïò%¿ü5¿*±D¿‹öQ¿l³]¿³Òg¿›?p¿eëv¿—É{¿Ñ~¿Eü¿¶H¿í·|¿µNx¿Nr¿‹j¿Ôb`¿¥ U¿2&H¿—Ê9¿ª*¿1¿ý ¿­ôç¾Ä#À¾ªë–¾ +Y¾rð¾=/½z/=ƒï>ó1Y>7ë–>T#À>Bôç>É ??}*?mÊ9? &H?„ U?·b`?Bj?;r?¦Nx?ã·|?±H?@ü?Ñ~?¢É{?uëv?°?p?óÑg?г]?®öQ?Q±D?Aü5?ýò%?ß±?N\?&Þ>Iôµ>VnŒ>à»C>¼iÚ=¬ ¯<¶4ƒ½È›¾³‡n¾çV¡¾X<ʾº§ñ¾®§ ¿mv¿G .¿ ƒ=¿‰ƒK¿”X¿Æ÷b¿s@l¿ŒÎs¿à”y¿£ˆ}¿q¢¿MÞ¿¼;~¿ç½z¿Uku¿ûMn¿@re¿TêZ¿*ÉN¿p%A¿¤2¿ê¾!¿*5¿Å>û¾‰=Ô¾‰¯«¾—à¾Ð5.¾ Ù®½.ÞL5×Ù®=56.>Èà>¹¯«>·=Ô>ò>û>?5?q½!?¶2?%A?9ÉN?aêZ?Lre?Nn?]ku?ì½z?¿;~?NÞ?p¢? ˆ}?Û”y?„Îs?i@l?º÷b?†X?yƒK?ú‚=?5 .?íw?™§ ?§ñ>)<Ê>¶V¡>P‡n>c›>é3ƒ=߯¼ˆjÚ½E¼C¾‡nŒ¾yôµ¾F&Þ¾e\¿ô±¿‹ñ%¿Sü5¿a±D¿½öQ¿—³]¿þÑg¿¹?p¿{ëv¿¦É{¿!Ñ~¿@ü¿¯H¿ß·|¿ Nx¿2r¿8j¿«b`¿v U¿ý%H¿\Ê9¿i*¿‡¿´ ¿ôç¾$#À¾ë–¾1Y¾ï¾àþ.½Ö/=×ð>q+Y>Ûë–>ó#À>Ûôç> ?F?½*?¨Ê9?B&H?³ U?àb`?•j?Vr?»Nx?ñ·|?¸H?Dü?Ñ~?’É{?^ëv?’?p?¨Òg?_³]?}öQ?±D?ü5?¼ò%?:³?\?}%Þ>©óµ>±mŒ>iÂC>gÚ=ñ¯û¾ì<Ծ箫¾ðß¾`<.¾_Ö®½™WÅ6„Ü®=ˆ7.>Ý>[°«>S>Ô>‡?û>†5?³½!?ô2?¹%A?lÉN?ŽêZ?rre?hMn?uku?ý½z?É;~?QÞ?‡¢?”ˆ}?Ç”y?jÎs?H@l?øb?XX?EƒK?À‚=?ö.?©w?þ¨ ?ö¦ñ>‹;Ê>V¡>†n>ø¡><1ƒ=š¯¼3mÚ½–½C¾TkŒ¾õµ¾à&Þ¾®\¿:²¿Ìñ%¿ü5¿˜±D¿îöQ¿Â³]¿"Òg¿%?p¿’ëv¿¶É{¿)Ñ~¿Aü¿ÏH¿Ñ·|¿‹Nx¿r¿j¿xc`¿F U¿Ç%H¿!Ê9¿)*¿B¿ ¿{óç¾…"À¾bê–¾?0Y¾¸õ¾„ù.½3 /=,ò>Á,Y>­è–>’$À>tõç>[ ?‹?~*?ãÊ9?x&H?ã U? c`?¸j?Ìr?ÐNx?þ·|?¾H?Cü??Ñ~?ƒÉ{?Gëv?u?p?ƒÒg?4´]?LöQ?ã°D?Èû5?zò%?ô²?s]?â$Þ>óµ> mŒ>ÁC>OtÚ=6ø®<:ƒ½ož¾ˆ‚n¾aT¡¾”=ʾé¨ñ¾>¨ ¿õv¿N.¿~ƒ=¿ñƒK¿ðX¿øb¿ð?l¿$Îs¿•y¿»ˆ}¿z¢¿XÞ¿ã;~¿Ä½z¿$ku¿¼Mn¿×re¿ëZ¿ÅÈN¿ÿ$A¿)2¿d¾!¿C6¿š=û¾P<Ô¾E®«¾Jß¾;.¾¤ã®½¶‰870ß®=Ú8.>6Þ>8­«>ð>Ô>@û>Í5?ö½!?Â2?ñ%A?ŸÉN?ºêZ?˜re?ˆMn?üju?¾z?Ó;~?SÞ?‚¢?ψ}?´”y?PÎs?'@l?Xøb?<X?ƒK?†‚=?·.?ew?¶¨ ?^¦ñ>í:Ê>pU¡>´„n>¤ >†>ƒ=U&¯¼ÞoÚ½ç¾C¾ùkŒ¾ýñµ¾{'Þ¾ø\¿€²¿ò%¿dû5¿Ï±D¿÷Q¿í³]¿GÒg¿C?p¿!ëv¿ÅÉ{¿1Ñ~¿Bü¿ÉH¿¸|¿vNx¿úr¿òj¿Nc`¿2 U¿’%H¿åÉ9¿é*¿ý¿Õ ¿âòç¾æ!À¾¾é–¾ð.Y¾cô¾ /½/=ó>.Y>Qé–>|!À> öç>¤ ?Ð?¾*?¾É9?­&H? U?3c`?Ûj?èr?iNx? ¸|?ÅH?Bü?7Ñ~?ÐÉ{?1ëv?W?p?_Òg? ´]??÷Q?¬°D?Œû5?9ò%?®²?)]?G$Þ>hòµ>glŒ>Ç¿C>¤qÚ=w-¯<¾<ƒ½ÃŸ¾Öƒn¾U¡¾…:ʾ©ñ¾†¨ ¿8w¿.¿`‚=¿%„K¿X¿=øb¿@l¿?Îs¿¨”y¿Çˆ}¿¢¿UÞ¿Ù;~¿¾z¿ ku¿œMn¿±re¿ØêZ¿ÀÉN¿Ç$A¿ë2¿"¾!¿ü5¿€@û¾´;Ô¾¤­«¾¤Þ¾»9.¾÷஽a˜q·Ýá®=-:.>ÜÞ>Ú­«>è;Ô>³@û>6?8¾!?2?Ú$A?ÑÉN?çêZ?¾re?§Mn?ku? ¾z?Ý;~?VÞ?}¢?È}?•y?6Îs?@l?0øb?X?„K?M‚=?x.?"w?n¨ ?N©ñ>P:Ê>ÍT¡>fƒn>QŸ>Ø;ƒ=ñ®¼‰rÚ½8ÀC¾žlŒ¾žòµ¾{$Þ¾B]¿Æ²¿Oò%¿ û5¿¾°D¿P÷Q¿´]¿kÒg¿a?p¿8ëv¿ÕÉ{¿9Ñ~¿Cü¿ÂH¿¸|¿ÞNx¿Þr¿Ïj¿%c`¿ U¿›&H¿ªÉ9¿©*¿¸¿Œ ¿Úõç¾G!À¾é–¾ -Y¾ó¾Ã/½ôõ.=Õô>`/Y>õé–>"À>óç>í ??ÿ*?ùÉ9?¤%H?B U?\c`?þj?r?}Nx?¸|?ËH?Bü?.Ñ~?ÀÉ{?¡ëv?9?p?;Òg?Þ³]?÷Q?¼±D?Oû5?øñ%?h²?à\?G'Þ>Çñµ>ÁkŒ>v¾C>ùnÚ=¼"¯Ô¾­«¾þݾi8.¾KÞ®½wº·˜Ô®=;.>‚ß>|®«>„<Ô>Ì=û>[6?{¾!?=2?%A?ÖÈN?ëZ?äre?ÆMn?-ku?ʽz?ç;~?YÞ?y¢?·ˆ}?•y?¸Îs?ä?l?øb?àX?߃K?kƒ=?9.?Þv?&¨ ?¶¨ñ>_=Ê>*T¡>‚n>ý>+9ƒ=Ïû®¼KeÚ½‰ÁC¾CmŒ¾>óµ¾%Þ¾Ó[¿ ³¿ò%¿Üû5¿õ°D¿\öQ¿B´]¿Òg¿~?p¿Oëv¿ˆÉ{¿BÑ~¿Dü¿¼H¿ú·|¿ÉNx¿ir¿­j¿üb`¿Ó U¿f&H¿ÐÊ9¿i*¿t¿C ¿Aõç¾]$À¾vè–¾P,Y¾ºñ¾f /½Pû.=*ö>°0Y>™ê–>»"À>¯óç>ƒ ?Y??*?4Ê9?Ù%H?V U?†c`? j? r?’Nx?Ö·|?ÑH?Aü?&Ñ~?±É{?Šëv?Ì?p?Òg?³³]?ÝöQ?†±D?{ü5?¶ñ%?"²?–\?­&Þ>äôµ>kŒ>%½C>NlÚ=¯<"2ƒ½j¢¾r†n¾JV¡¾À;ʾ)§ñ¾i§ ¿Àw¿ .¿Ó‚=¿WƒK¿gX¿øb¿S@l¿sÎs¿Î”y¿˜ˆ}¿ˆ¢¿PÞ¿Å;~¿÷½z¿mku¿Nn¿ere¿êZ¿[ÉN¿¦%A¿ß2¿½!¿n5¿U?û¾>Ô¾%°«¾Xݾ7.¾žÛ®½¹‹¶E×®=Ò<.>(à>¯«>!=Ô>b>û>û4?½¾!?{2?J%A? ÉN?6êZ? se?æMn?Eku?Û½z?µ;~?\Þ?t¢?«ˆ}?í”y?žÎs?‰@l?à÷b?²X?«ƒK?1ƒ=?q .?šv?Þ§ ?¨ñ>Á<Ê>SW¡>Ê€n>ªœ>}6ƒ=‹¯¼ögÚ½ÚÂC¾èmŒ¾ßóµ¾±%Þ¾\¿±±¿Òò%¿ü5¿,±D¿öQ¿m³]¿´Òg¿œ?p¿eëv¿˜É{¿Ñ~¿Eü¿¶H¿ì·|¿´Nx¿Mr¿Yj¿Òb`¿£ U¿0&H¿”Ê9¿§*¿/¿ú ¿¨ôç¾¾#À¾¤ë–¾+Y¾eð¾ /½­/=ï>ÿ1Y>=ë–>Z#À>Hôç>Ì ??*?oÊ9?&H?† U?¸b`?Cj?<r?§Nx?ä·|?±H?@ü?Ñ~?¡É{?tëv?¯?p?òÑg?ˆ³]?¬öQ?O±D??ü5?ûò%?ܱ?L\?&Þ>Côµ>PnŒ>Ó»C>£iÚ=F ¯<Ï4ƒ½Õ›¾À‡n¾íV¡¾^<ʾÀ§ñ¾±§ ¿pv¿J .¿ ƒ=¿‹ƒK¿•X¿Ç÷b¿t@l¿Îs¿á”y¿¤ˆ}¿q¢¿MÞ¿»;~¿æ½z¿Tku¿ùMn¿?re¿RêZ¿(ÉN¿n%A¿¢2¿ç¾!¿'5¿¿>û¾ƒ=Ô¾ƒ¯«¾à¾Ä5.¾òØ®½Ý €5ñÙ®=B6.>Îà>¿¯«>½=Ô>÷>û>B5?s½!?¹2?ƒ%A?;ÉN?cêZ?Mre?Nn?^ku?ì½z?¿;~?NÞ?p¢?Ÿˆ}?Ú”y?ƒÎs?g@l?¹÷b?„X?wƒK?ø‚=?2 .?êw?–§ ?ˆ§ñ>#<Ê>°V¡>C‡n>V›>Ð3ƒ=F¯¼¡jÚ½Q¼C¾nŒ¾ôµ¾K&Þ¾g\¿ö±¿ñ%¿Uü5¿c±D¿¾öQ¿˜³]¿ÿÑg¿º?p¿|ëv¿§É{¿!Ñ~¿@ü¿¯H¿Þ·|¿ŸNx¿1r¿6j¿©b`¿t U¿û%H¿YÊ9¿g*¿„¿± ¿ôç¾#À¾ë–¾‚1Y¾ï¾­þ.½ /=äð>~+Y>áë–>ù#À>áôç> ?H?A*?«Ê9?D&H?µ U?âb`?—j?Wr?¼Nx?ñ·|?¸H?Dü?Ñ~?’É{?]ëv?‘?p?¦Òg?]³]?{öQ?±D?ü5?¹ò%?7³?\?w%Þ>£óµ>«mŒ>]ÂC>øfÚ=Н<}7ƒ½(¾Fn¾W¡¾ü<ʾW¨ñ¾ù§ ¿´v¿.¿Gƒ=¿¿ƒK¿ÃX¿ï÷b¿Ð?l¿§Îs¿ô”y¿¯ˆ}¿v¢¿[Þ¿±;~¿Õ½z¿û¾æ<Ծ᮫¾êß¾T<.¾EÖ®½Š¾Ë6Ü®=•7.>–Ý>a°«>Y>Ô>?û>‰5?¶½!?ö2?»%A?nÉN?êZ?sre?iMn?vku?þ½z?É;~?QÞ?†¢?“ˆ}?Ç”y?iÎs?F@l?~øb?VX?CƒK?¾‚=?ó.?§w?û¨ ?ð¦ñ>…;Ê> V¡>õ…n>ë¡>"1ƒ=¯¼LmÚ½¢½C¾ZkŒ¾ õµ¾æ&Þ¾±\¿<²¿Ïñ%¿’ü5¿š±D¿ðöQ¿Ã³]¿$Òg¿'?p¿“ëv¿·É{¿)Ñ~¿Aü¿ÏH¿Ñ·|¿‹Nx¿r¿j¿vc`¿D U¿Å%H¿Ê9¿'*¿?¿ ¿uóç¾"À¾\ê–¾30Y¾«õ¾Qù.½f /=9ò>Í,Y>³è–>˜$À>zõç>^ ??*?æÊ9?z&H?å U? c`?¹j?Ír?ÑNx?ÿ·|?¾H?Cü?>Ñ~?‚É{?Fëv?s?p?‚Òg?2´]?JöQ?á°D?Æû5?xò%?ñ²?q]?Ü$Þ>óµ>mŒ> ÁC>5tÚ=Ï÷®<*:ƒ½|ž¾”‚n¾gT¡¾™=ʾï¨ñ¾A¨ ¿÷v¿P.¿ƒ=¿óƒK¿ñX¿øb¿ñ?l¿%Îs¿•y¿»ˆ}¿{¢¿XÞ¿ã;~¿Ã½z¿$ku¿»Mn¿Öre¿ëZ¿ÃÈN¿ý$A¿&2¿b¾!¿A6¿Aû¾J<Ô¾?®«¾Dß¾;.¾Šã®½.½;7Jß®=ç8.><Þ>>­«>ö>Ô>#@û>Ð5?ø½!?Ä2?ó%A? ÉN?¼êZ?™re?‰Mn?ýju?¾z?Ó;~?SÞ?‚¢?Έ}?´”y?OÎs?%@l?Vøb?;X?ƒK?„‚=?´.?cw?³¨ ?Y¦ñ>è:Ê>jU¡>§„n>˜ >l>ƒ=¼&¯¼÷oÚ½ó¾C¾ÿkŒ¾òµ¾'Þ¾û\¿‚²¿ò%¿fû5¿Ñ±D¿!÷Q¿î³]¿HÒg¿D?p¿"ëv¿ÆÉ{¿1Ñ~¿Bü¿ÉH¿¸|¿vNx¿ùr¿ñj¿Mc`¿1 U¿%H¿ãÉ9¿ç*¿û¿Ò ¿Üòç¾à!À¾¸é–¾ã.Y¾Vô¾í/½Ã/=ó>.Y>Wé–>‚!À>öç>§ ?Ò?Á*?ÀÉ9?¯&H? U?4c`?Üj?ér?iNx? ¸|?ÅH?Bü?6Ñ~?ÏÉ{?0ëv?V?p?^Òg?´]?>÷Q?ª°D?‰û5?7ò%?«²?']?B$Þ>bòµ>`lŒ>º¿C>ŠqÚ=-¯<Ø<ƒ½ÏŸ¾âƒn¾ U¡¾‹:ʾ†©ñ¾‰¨ ¿;w¿.¿b‚=¿'„K¿X¿?øb¿@l¿@Îs¿¨”y¿Çˆ}¿¢¿UÞ¿Ù;~¿¾z¿ ku¿›Mn¿°re¿ÖêZ¿¾ÉN¿Å$A¿é2¿¾!¿ú5¿{@û¾®;Ô¾ž­«¾žÞ¾¯9.¾Þ஽èdn·öá®=9:.>âÞ>à­«>î;Ô>¸@û>6?;¾!?2?Ü$A?ÓÉN?èêZ?¿re?¨Mn?ku?¹½z?Ý;~?VÞ?}¢?ˆ}?•y?5Îs?@l?.øb? X?„K?J‚=?u.?w?k¨ ?H©ñ>J:Ê>ÇT¡>Yƒn>DŸ>¿;ƒ={ñ®¼¢rÚ½EÀC¾¤lŒ¾¤òµ¾$Þ¾E]¿È²¿Qò%¿¢û5¿À°D¿R÷Q¿´]¿mÒg¿b?p¿9ëv¿ÖÉ{¿:Ñ~¿Cü¿ÂH¿¸|¿ÝNx¿Ýr¿Îj¿$c`¿ U¿™&H¿¨É9¿§*¿¶¿‰ ¿Ôõç¾A!À¾é–¾“-Y¾ó¾/½'ö.=âô>m/Y>ûé–>!"À>óç>ð ??*?ûÉ9?¦%H?D U?^c`?ÿj?r?~Nx?¸|?ËH?Bü?.Ñ~?ÀÉ{? ëv?8?p?9Òg?ݳ]? ÷Q?º±D?Mû5?õñ%?f²?Ý\?A'Þ>Áñµ>»kŒ>i¾C>ßnÚ=U"¯<Ž/ƒ½#¡¾0…n¾­U¡¾(;ʾ—¦ñ¾Ñ¨ ¿w¿Î.¿œ‚=¿$ƒK¿NX¿føb¿3@l¿ZÎs¿»”y¿Óˆ}¿„¢¿RÞ¿Ï;~¿¾z¿„ku¿|Mn¿Šre¿ªêZ¿ŒÉN¿Ü%A¿«2¿Ý½!¿³5¿å?û¾µ>Ô¾ü¬«¾øÝ¾\8.¾1Þ®½ÿ†·²Ô®=Œ;.>ˆß>‚®«>Š<Ô>Ò=û>^6?}¾!?@2?%A?ØÈN?ëZ?åre?ÈMn?.ku?˽z?ç;~?YÞ?y¢?¶ˆ}?ÿ”y?·Îs?ã?l?øb?ßX?݃K?iƒ=?7.?Üv?#¨ ?±¨ñ>Y=Ê>$T¡> ‚n>ñ>9ƒ=6ü®¼eeÚ½–ÁC¾ImŒ¾Dóµ¾%Þ¾Ö[¿³¿“ò%¿ßû5¿÷°D¿^öQ¿D´]¿‘Òg¿€?p¿Pëv¿‰É{¿BÑ~¿Dü¿¼H¿ù·|¿ÈNx¿hr¿«j¿úb`¿Ñ U¿d&H¿ÍÊ9¿f*¿q¿@ ¿;õç¾W$À¾oè–¾D,Y¾­ñ¾3 /½„û.=Gî>¼0Y>Ÿê–>À"À>´óç>† ?\?A*?7Ê9?Û%H?X U?‡c`?"j?!r?“Nx?Ö·|?ÒH?Aü?&Ñ~?°É{?‰ëv?Ë?p?Òg?²³]?ÛöQ?ƒ±D?yü5?´ñ%? ²?“\?§&Þ>Þôµ>kŒ>½C>4lÚ=š¯<;2ƒ½w¢¾~†n¾PV¡¾Æ;ʾ.§ñ¾l§ ¿Âw¿ .¿Ö‚=¿XƒK¿iX¿Žøb¿T@l¿tÎs¿Ï”y¿˜ˆ}¿ˆ¢¿PÞ¿Å;~¿÷½z¿lku¿Nn¿dre¿}êZ¿YÉN¿¤%A¿Ý2¿š½!¿l5¿P?û¾>Ô¾°«¾Rݾ 7.¾…Û®½*R…¶^×®=Þ<.>.à>$¯«>'=Ô>g>û>þ4?À¾!?}2?L%A? ÉN?8êZ? se?çMn?Fku?ܽz?µ;~?\Þ?t¢?«ˆ}?ì”y?Îs?‡@l?ß÷b?°X?©ƒK?/ƒ=?o .?˜v?Û§ ?¨ñ>»<Ê>MW¡>½€n>œ>d6ƒ=ñ¯¼hÚ½çÂC¾îmŒ¾åóµ¾·%Þ¾ \¿³±¿Ôò%¿ü5¿.±D¿öQ¿o³]¿µÒg¿?p¿fëv¿˜É{¿Ñ~¿Eü¿µH¿ì·|¿´Nx¿Lr¿Xj¿Ñb`¿¢ U¿.&H¿’Ê9¿¥*¿,¿÷ ¿¢ô羸#À¾žë–¾ô*Y¾Xð¾×/½à/=œï> 2Y>Cë–>`#À>Môç>Ï ??*?rÊ9?&H?‡ U?ºb`?Dj?=r?¨Nx?ä·|?²H?@ü?Ñ~?¡É{?sëv?®?p?ÊÒg?‡³]?ªöQ?M±D?<ü5?øò%?Ú±?I\? &Þ>=ôµ>JnŒ>Ç»C>‰iÚ=ß ¯<é4ƒ½á›¾Ì‡n¾óV¡¾d<ʾƧñ¾´§ ¿rv¿L .¿ƒ=¿ƒK¿—X¿É÷b¿u@l¿ŽÎs¿â”y¿¤ˆ}¿r¢¿MÞ¿»;~¿å½z¿Sku¿øMn¿>re¿QêZ¿&ÉN¿l%A¿Ÿ2¿å¾!¿%5¿º>û¾}=Ô¾}¯«¾Šà¾·5.¾ØØ®½¢¦™5 Ú®=O6.>Õà>ů«>Ã=Ô>ý>û>E5?v½!?»2?…%A?=ÉN?eêZ?Ore?Nn?^ku?í½z?¿;~?NÞ?p¢?Ÿˆ}?Ù”y?‚Îs?f@l?·÷b?‚X?uƒK?ö‚=?0 .?èw?“§ ?‚§ñ><Ê>ªV¡>7‡n>I›>¶3ƒ=¬¯¼»jÚ½^¼C¾”nŒ¾…ôµ¾Q&Þ¾j\¿ù±¿ñ%¿Wü5¿e±D¿ÀöQ¿š³]¿Òg¿»?p¿}ëv¿¨É{¿!Ñ~¿@ü¿¯H¿Þ·|¿ŸNx¿0r¿5j¿§b`¿r U¿ù%H¿WÊ9¿e*¿‚¿® ¿ ôç¾#À¾úê–¾v1Y¾ï¾zþ.½=/=ñð>Š+Y>çë–>ÿ#À>æôç> ?K?C*?­Ê9?F&H?· U?ãb`?˜j?Yr?½Nx?ò·|?¸H?Dü?Ñ~?‘É{?\ëv??p?¥Òg?\³]?yöQ?±D?ü5?·ò%?5³?ÿ[?q%Þ>óµ>¥mŒ>PÂC>ÞfÚ=$¯<–7ƒ½5¾Sn¾–W¡¾=ʾ]¨ñ¾ü§ ¿¶v¿.¿Iƒ=¿ÁƒK¿ÅX¿ñ÷b¿Ñ?l¿¨Îs¿õ”y¿°ˆ}¿v¢¿ZÞ¿±;~¿Ô½z¿;ku¿ÙMn¿ûre¿$êZ¿ôÈN¿3%A¿b2¿¢¾!¿…6¿$>û¾á<Ô¾Û®«¾äß¾G<.¾,Ö®½{%Ò6·Ü®=¡7.>œÝ>g°«>_>Ô>’?û>‹5?¸½!?‰2?½%A?pÉN?‘êZ?ure?kMn?wku?þ½z?É;~?QÞ?†¢?“ˆ}?Æ”y?hÎs?E@l?|øb?TX?AƒK?¼‚=?ñ.?¤w?ù¨ ?ê¦ñ>;Ê>V¡>é…n>ß¡> 1ƒ=g¯¼fmÚ½¯½C¾`kŒ¾&õµ¾ì&Þ¾´\¿?²¿Ññ%¿”ü5¿œ±D¿ñöQ¿Å³]¿%Òg¿(?p¿”ëv¿·É{¿)Ñ~¿Aü¿ÏH¿Ð·|¿ŠNx¿r¿j¿uc`¿B U¿Ã%H¿Ê9¿%*¿=¿ ¿póç¾y"À¾Vê–¾&0Y¾žõ¾ù.½™ /=Eò>Ú,Y>¹è–>ž$À>€õç>a ??ƒ*?èÊ9?|&H?ç U? c`?»j?Îr?ÒNx?ÿ·|?¿H?Cü?>Ñ~?‚É{?Eëv?r?p?Òg?1´]?HöQ?ß°D?Äû5?vò%?ï²?n]?×$Þ>üòµ>ÿlŒ>ÿÀC>tÚ=i÷®6¿ Aû¾D<Ô¾9®«¾>ß¾ô:.¾q㮽§ð>7cß®=ô8.>BÞ>D­«>û>Ô>(@û>Ò5?û½!?Ç2?õ%A?¢ÉN?¾êZ?›re?ŠMn?þju?¾z?Ó;~?TÞ?‚¢?Έ}?³”y?NÎs?$@l?Uøb?9X? ƒK?‚‚=?².?`w?±¨ ?Ú©ñ>â:Ê>dU¡>›„n>‹ >S>ƒ="'¯¼pÚ½¿C¾lŒ¾ òµ¾‡'Þ¾þ\¿…²¿ò%¿hû5¿Ó±D¿#÷Q¿ð³]¿IÒg¿E?p¿#ëv¿ÇÉ{¿2Ñ~¿Bü¿ÈH¿¸|¿uNx¿ør¿ïj¿Kc`¿/ U¿Ž%H¿áÉ9¿ä*¿ø¿Ï ¿×òç¾Ú!À¾²é–¾×.Y¾Jô¾¹/½ö/=šó>*.Y>]é–>ˆ!À>öç>ª ?Õ?Ã*?ÃÉ9?±&H? U?6c`?Þj?êr?jNx? ¸|?ÅH?Bü?6Ñ~?ÏÉ{?/ëv?U?p?\Òg?´]?<÷Q?¨°D?‡û5?4ò%?©²?$]?<$Þ>\òµ>ZlŒ>®¿C>qqÚ=ª,¯<ñ<ƒ½ÜŸ¾ïƒn¾U¡¾:ʾŒ©ñ¾Œ¨ ¿=w¿’.¿d‚=¿)„K¿!X¿@øb¿@l¿AÎs¿©”y¿Èˆ}¿¢¿UÞ¿Ù;~¿¾z¿ ku¿šMn¿®re¿ÕêZ¿¼ÉN¿Â$A¿æ2¿¾!¿÷5¿u@û¾¨;Ô¾˜­«¾˜Þ¾¢9.¾Ä஽o1k·â®=F:.>èÞ>æ­«>ô;Ô>¾@û>6?=¾!?2?Þ$A?ÕÉN?êêZ?Áre?©Mn?ku?º½z?Þ;~?VÞ?}¢?ˆ}?•y?4Îs?@l?-øb? X?„K?H‚=?s.?w?i¨ ?B©ñ>D:Ê>ÁT¡>Mƒn>8Ÿ>¥;ƒ=áñ®¼¼rÚ½QÀC¾ªlŒ¾ªòµ¾‡$Þ¾H]¿Ë²¿Tò%¿¤û5¿Â°D¿T÷Q¿´]¿nÒg¿c?p¿:ëv¿zÉ{¿:Ñ~¿Cü¿ÂH¿¸|¿ÝNx¿Ür¿Íj¿"c`¿ÿ U¿—&H¿¦É9¿¤*¿³¿† ¿Îõç¾;!À¾ é–¾‡-Y¾õò¾]/½Zö.=ïô>y/Y>ê–>'"À>!óç>ó ??*?þÉ9?¨%H?F U?_c`?j?r?Nx?É·|?ËH?Aü?.Ñ~?¿É{?Ÿëv?7?p?8Òg?Û³]? ÷Q?¸±D?Kû5?óñ%?c²?Ú\?<'Þ>»ñµ>µkŒ>]¾C>ÆnÚ=ï!¯<§/ƒ½0¡¾=…n¾³U¡¾.;ʾœ¦ñ¾Ô¨ ¿w¿Ñ.¿ž‚=¿&ƒK¿OX¿høb¿4@l¿[Îs¿¼”y¿Ôˆ}¿„¢¿RÞ¿Ï;~¿¾z¿ƒku¿{Mn¿ˆre¿¨êZ¿ŠÉN¿Ú%A¿©2¿Ú½!¿°5¿à?û¾°>Ô¾ö¬«¾òݾP8.¾Þ®½†S·ËÔ®=˜;.>Žß>ˆ®«><Ô>×=û>`6?€¾!?B2?%A?ÚÈN?ëZ?çre?ÉMn?.ku?˽z?è;~?YÞ?y¢?¶ˆ}?ÿ”y?¶Îs?â?l?øb?ÝX?܃K?gƒ=?4.?Ùv?!¨ ?«¨ñ>S=Ê>T¡>ÿn>ä>ø8ƒ=œü®¼~eÚ½¢ÁC¾OmŒ¾Jóµ¾"%Þ¾Ù[¿³¿•ò%¿áû5¿ù°D¿`öQ¿F´]¿’Òg¿?p¿Pëv¿‰É{¿BÑ~¿Dü¿»H¿ù·|¿ÈNx¿gr¿ªj¿ùb`¿Ð U¿b&H¿ËÊ9¿d*¿n¿= ¿5õç¾Q$À¾iè–¾7,Y¾ ñ¾ /½·û.=Tî>É0Y>¥ê–>Æ"À>ºóç>‰ ?^?D*?9Ê9?Ý%H?Z U?‰c`?#j?"r?”Nx?×·|?ÒH?Aü?%Ñ~?°É{?‰ëv?Ê?p?Òg?°³]?ÚöQ?±D?wü5?±ñ%?²?\?¡&Þ>Øôµ>kŒ> ½C>lÚ=4¯Ô¾T¬«¾*á¾ý6.¾\뮽rÖ}¶iç®= 5.>5à>e««>,=Ô>éAû>5?¾!?2?O%A?:ÊN?:êZ? se?-Mn?Gku?D¾z?¶;~?\Þ?¢?ªˆ}?z”y?œÎs?Á?l?Êøb?¯X?q‚K?-ƒ=?õ.?)x?Ù§ ?š«ñ>µ<Ê>{S¡>xˆn>œ>BFƒ=W¯¼xÚ½»C¾õmŒ¾-ðµ¾¼%Þ¾Ü]¿¶±¿×ò%¿µú5¿0±D¿¶÷Q¿q³]¿·Òg¿í>p¿gëv¿õÉ{¿Ñ~¿Eü¿ÛH¿ë·|¿6Nx¿Kr¿‡j¿Æc`¿  U¿í$H¿Ê9¿$*¿Ä¿ô ¿-øç¾²#À¾Åç–¾¹2Y¾Lð¾œ#/½/=˜÷>G*Y>Ië–>°À>Sôç>… ? ?„*?É9?&H?¥ U?¼b`?Fj?—r?©Nx?6¸|?²H?@ü?NÑ~? É{?ëêv?¬?p?ïÑg?…´]?¨öQ?°D?:ü5?pñ%?x³?F\?l"Þ>7ôµ>kjŒ>•ÃC>piÚ=uL¯<5ƒ½×£¾€n¾ùV¡¾½8ʾ˧ñ¾c© ¿uv¿N .¿¹=¿ƒK¿«X¿Ê÷b¿v@l¿óÍs¿â”y¿ëˆ}¿r¢¿MÞ¿ö;~¿å½z¿Áju¿÷Mn¿û¾Ó9Ô¾w¯«¾¦Ü¾=.¾¿Ø®½ÙËô·$Ú®==>.>üÜ>˯«>%:Ô>?û>î6?x½!?½2?7$A??ÉN?pëZ?Pre?Nn?Îju?î½z?ü;~?NÞ?o¢?åˆ}?Ø”y?åÍs?e@l?¶÷b?“X?sƒK?›=?. .?Rv?>© ?|§ñ>k8Ê>¤V¡>cn>&£>3ƒ=Ò®¼ÔjÚ½EÄC¾ÁjŒ¾‹ôµ¾¼"Þ¾m\¿œ³¿’ñ%¿Zü5¿°D¿ÂöQ¿›´]¿Òg¿¼?p¿÷êv¿¨É{¿SÑ~¿@ü¿¯H¿/¸|¿žNx¿‰r¿4j¿¦b`¿Œ U¿÷%H¿õÈ9¿b*¿å¿^ ¿ôç¾]À¾ôê–¾˜)Y¾æö¾Gþ.½wæ.=ýð>h3Y>è–>$À>[ñç> ?è?E*?¯Ê9? %H?¹ U?Ûc`?™j?Zr?ANx?ò·|?ßH?Dü?Ñ~?íÉ{?[ëv?Þ>p?¤Òg?Z³]?œ÷Q?±D?–ú5?´ò%?‘±?µ]?l%Þ>Úïµ>žmŒ>iºC>­vÚ=¾¯<¸'ƒ½B¾'‰n¾ÐS¡¾=ʾܤñ¾þ§ ¿Lx¿.¿Kƒ=¿Œ‚K¿ÇX¿ßøb¿Ò?l¿©Îs¿„”y¿°ˆ}¿’¢¿ZÞ¿°;~¿;¾z¿:ku¿Mn¿ùre¿#êZ¿ ÊN¿1%A¿ð2¿ ¾!¿Û4¿›Aû¾Û<Ô¾««¾Þß¾X4.¾殽mŒØ6ßÌ®=®7.>á>¨¬«>e>Ô><û>Ž5?G¿!?‹2?¿%A?DÈN?“êZ?Yse?lMn?xku?˜½z?Ê;~?aÞ?†¢?’ˆ}?7•y?gÎs??l?{øb?SX?v„K?º‚=?w.?¢w?I§ ?lªñ>z;Ê>5R¡>Ü…n>é™>ç@ƒ=ί¼—]Ú½»½C¾?oŒ¾oñµ¾ò&Þ¾þZ¿B²¿Yó%¿.û5¿ž±D¿ÎõQ¿Æ³]¿Óg¿)?p¿”ëv¿[É{¿*Ñ~¿Gü¿ÎH¿Ð·|¿Ox¿r¿Bj¿sc`¿A U¿'H¿Ê9¿£*¿:¿c ¿ûöç¾s"À¾}æ–¾0Y¾¢í¾ã/½Í /=cê>æ,Y>’ì–>ï À>…õç>°?’?*?ŠÉ9?~&H?Ì U?c`?‹j?Ïr?ÓNx?®·|?¿H?>ü?>Ñ~?É{?Ìëv?q?p?¦Ñg?/´]?FöQ?$²D?Áû5?íð%?ì²?²[?k(Þ>öòµ> iŒ>òÀC>dÚ=ÿ6¯<]:ƒ½¬–¾­‚n¾?X¡¾ù9ʾú¨ñ¾™¦ ¿üv¿Ì .¿-‚=¿÷ƒK¿âX¿øb¿¸@l¿'Îs¿ •y¿uˆ}¿{¢¿GÞ¿â;~¿Â½z¿³ku¿¸Mn¿ðqe¿ÿêZ¿¿ÈN¿I&A¿"2¿Ð¼!¿;6¿‰=û¾â?Ô¾3®«¾YÛ¾è:.¾fÓ®½ðíž·}ß®=1.>HÞ>±«>];Ô>.@û>.4?ý½!?92?¨$A?¤ÉN?¶éZ?œre?FNn?ÿju?¾z?˜;~?TÞ?f¢?͈}?²”y?éÎs?#@l?f÷b?7X? ƒK?؃=?°.?Êu?®¨ ?M¦ñ>‰>Ê>^U¡>Ç|n>~ >B.ƒ=Œç®¼*pÚ½çÆC¾ lŒ¾Ìõµ¾ò#Þ¾]¿ç°¿ò%¿Òü5¿°D¿$÷Q¿ñ²]¿KÒg¿÷?p¿$ëv¿ÇÉ{¿Ñ~¿Bü¿¢H¿¸|¿tNx¿žr¿îj¿Sb`¿- U¿Œ%H¿?Ë9¿â*¿[¿Í ¿Ñò羉%À¾«é–¾ù&Y¾=ô¾Žó.½1ñ.=§ó>6Y>cé–>C%À>òç>¬ ?=?Æ*?%Ë9?t%H? U?Ab`?ßj?‘r?kNx?¸|?ŸH?Bü?Ñ~?ÎÉ{?.ëv?@p?[Òg?³]?:÷Q?¦°D?íü5?2ò%?±?!]?6$Þ>öµ>TlŒ>Ç·C>WqÚ=Gì®<-ƒ½éŸ¾Ã‹n¾U¡¾C>ʾ ¦ñ¾Ž¨ ¿¬u¿”.¿¿ƒ=¿ô‚K¿#X¿U÷b¿@l¿ÞÎs¿ª”y¿Èˆ}¿d¢¿UÞ¿œ;~¿¾z¿ ku¿TNn¿­re¿ÉéZ¿»ÉN¿À$A¿T2¿¾!¿M4¿p@û¾¢;Ô¾V±«¾’Þ¾³1.¾«à®½Œ78Ò®=S:.>Íâ>ì­«>ž?Ô>G=û>6?³¼!?2?0&A?©ÈN?ìêZ?ßqe?«Mn?©ku?º½z?Þ;~?FÞ?}¢?{ˆ}?•y?3Îs?Ç@l?+øb?öX?„K?F‚=?è .?w?¹¦ ?=©ñ>>:Ê>‡X¡>@ƒn>B—>Œ;ƒ=D2¯¼íbÚ½^ÀC¾‰pŒ¾°òµ¾'(Þ¾’[¿Í²¿Ðð%¿§û5¿ ²D¿1öQ¿´]¿–Ñg¿d?p¿Âëv¿zÉ{¿:Ñ~¿=ü¿ÂH¿´·|¿ÜNx¿Ûr¿›j¿ c`¿á U¿•&H¿¤É9¿ *¿±¿Ñ¿Éõç¾5!À¾Úì–¾z-Y¾ùê¾*/½†/= í>†/Y>Úí–>-"À>·öç>B ??‡*?Ê9?é&H?, U?ac`?2j?r?üNx?Ê·|?ÌH?Gü?-Ñ~?bÉ{?žëv?6?p?Óg?Ù³]?äõQ?¶±D?Iû5?vó%?`²?[?6'Þ>µñµ>ˆoŒ>P¾C>Ä^Ú=‰!¯<¹?ƒ½S™¾I…n¾…Y¡¾4;ʾ)ªñ¾)§ ¿„w¿\.¿ ‚=¿_„K¿>X¿iøb¿p?l¿\Îs¿/•y¿ˆ}¿„¢¿cÞ¿Î;~¿Ÿ½z¿ƒku¿zMn¿jse¿¦êZ¿ZÈN¿Ø%A¿¦2¿e¿!¿­5¿^<û¾ª>Ծ𬫾Êá¾C8.¾ ή½ ·Öä®=Ã3.>•ß>S²«>–<Ô>YAû>¼4?‚¾!?Õ2?%A? ÊN?êZ?ère?Mn?/ku?3¾z?¬;~?YÞ?”¢?¶ˆ}?Œ”y?µÎs?á?l?ðøb?ÛX?£‚K?eƒ=?2.?jx?¨ ?¥ñ>M=Ê>T¡>º‰n>×>ç(ƒ=ý®¼€uÚ½Õ¹C¾VmŒ¾ ÷µ¾'%Þ¾”]¿r±¿˜ò%¿{ú5¿û°D¿‡÷Q¿G³]¿”Òg¿Ñ>p¿Qëv¿æÉ{¿Ñ~¿Dü¿áH¿ø·|¿JNx¿fr¿©j¿îc`¿Î U¿!%H¿ÉÊ9¿b*¿¿; ¿Ÿñç¾K$À¾cè–¾ü3Y¾”ñ¾Ôè.½êû.=Pö>)Y>«ê–>‚&À>Àóç>> ?Ç?F*?›Ë9?ß%H?w U?”b`?$j?|r?•Nx?)¸|?¬H?Aü?VÑ~?¯É{?ëv?É?p?Òg?®´]?ØöQ?8°D?tü5?¯ñ%?»³?\?#Þ>Òôµ> kŒ>ÙÄC>lÚ=ÑÖ®.¾RÛ®½îÞá7‘×®=ø<.>\Ü>0¯«>Ö@Ô>r>û>ª6?8½!?‚2?¡&A?ÉN?EëZ?+re?éMn?¶ju?ݽz?ò;~?LÞ?t¢?ñˆ}?ë”y?ÿÍs?…@l?Ü÷b?ÀX?¥ƒK?Ó=?j .?“v?ƒ© ?¨ñ>9Ê>AW¡>¤€n>m¤>16ƒ=ºG¯¼ChÚ½ÃC¾"jŒ¾ñóµ¾])Þ¾&\¿Y³¿Sñ%¿ ü5¿z²D¿“öQ¿r´]¿ßÑg¿Ÿ?p¿áêv¿™É{¿KÑ~¿?ü¿µH¿<¸|¿²Nx¿£r¿Uj¿Îb`¿º U¿*&H¿.É9¿ *¿'¿¥ ¿—ôç¾÷À¾’ë–¾Û*Y¾.ø¾p/½?!/=µï>%2Y>}ç–>l#À>ê÷ç>Ô ?¦?*?vÊ9?T'H?‹ U?´c`?xj??r?-Nx?å·|?ØH?Eü?Ñ~?üÉ{?qëv?û>p?ÇÒg?ƒ³]?Ì÷Q?H±D?Ðú5?óò%?Õ±?ü]?&Þ>tðµ>=nŒ>®»C>?yÚ= ¯<Eƒ½û›¾å‡n¾3S¡¾p<ʾX«ñ¾¹§ ¿ x¿Ú.¿ƒ=¿Ç„K¿šX¿¹øb¿²?l¿Îs¿q”y¿¥ˆ}¿¢¿]Þ¿º;~¿K¾z¿Rku¿;Mn¿se¿MêZ¿PÊN¿g%A¿+2¿à¾!¿5¿+Bû¾q=Ô¾¬««¾~ྞ5.¾–讽.ÞÌ5/ê®=h6.>áà> ¬«>Î=Ô>„Bû>J5?¿!?P2?‰%A?oÊN?hêZ?4se?NMn?`ku?‡½z?À;~?_Þ?‹¢?žˆ}?J•y?Îs?Ÿ?l?¡øb?X?¨„K?ñ‚=?´.?ãw?ާ ?ýªñ><Ê>ÒR¡>‡n>0›>{Cƒ=y¯¼ÖzÚ½w¼C¾ nŒ¾Ôðµ¾]&Þ¾(^¿þ±¿ó%¿ôú5¿i±D¿é÷Q¿³]¿ÝÒg¿ ?p¿ëv¿LÉ{¿"Ñ~¿Fü¿ÕH¿Ý·|¿Ox¿.r¿cj¿›c`¿o U¿4'H¿SÊ9¿á*¿}¿© ¿Ž÷ç¾ #À¾ç–¾]1Y¾êî¾ /½£/=ùø>£+Y>ôë–>V À>òôç>Ð ?P?Æ*?QÉ9?J&H?Ö U?æb`?jj?´r?¾Nx?¡·|?¹H??ü?FÑ~?É{?âëv?Ž?p?ÉÑg?X´]?uöQ?Y²D?ûû5?,ñ%?/³?ú[?)Þ>‘óµ>¿iŒ>7ÂC>«fÚ=SA¯<Ê7ƒ½7¥¾ln¾¢W¡¾a9ʾh¨ñ¾®© ¿»v¿ .¿õ=¿ÅƒK¿ÛX¿ô÷b¿™@l¿Îs¿ö”y¿jˆ}¿w¢¿JÞ¿ì;~¿Ó½z¿Ëku¿×Mn¿re¿*ëZ¿ðÈN¿&A¿]2¿½!¿€6¿>û¾y@ԾϮ«¾ùÛ¾.<.¾ùÕ®½(CÈ·êÜ®=œ?.>©Ý>s°«>Ç:Ô>ž?û>87?½½!?ý2?q$A?sÉN?žëZ?wre?(Nn?çju?¾z?<~?QÞ?k¢?Ùˆ}?Å”y?Ïs?C@l?÷b?dX?=ƒK?„=?ì.? v?ó¨ ?ߦñ> ?Ê>ûU¡>~n>Å¡>Ö0ƒ=8Ý®¼™mÚ½¢ÅC¾lkŒ¾2õµ¾]#Þ¾¹\¿å³¿Öñ%¿˜ü5¿X°D¿õöQ¿È´]¿(Òg¿Û?p¿ëv¿¸É{¿[Ñ~¿Aü¿¨H¿!¸|¿ˆNx¿¹r¿j¿{b`¿[ U¿¿%H¿xË9¿ *¿¿ ¿dóç¾#&À¾Iê–¾<(Y¾…õ¾·ø.½ì.=_ò>Ä4Y>Åè–>ª$À>úñç>f ?/?ˆ*?ìÊ9?A%H?ê U?d`?½j?wr?WNx?¸|?åH?Cü? Ñ~?ÝÉ{?Dëv?!@p?~Òg?.³]?i÷Q?Û°D?'ý5?qò%?I±?h]?Ë$Þ>­öµ>ólŒ> ¹C>ésÚ=œö®<*ƒ½¢ž¾Šn¾yT¡¾«=ʾy¥ñ¾I¨ ¿“x¿W.¿‡ƒ=¿Â‚K¿÷X¿ùb¿ô?l¿ÅÎs¿—”y¿½ˆ}¿–¢¿XÞ¿¦;~¿)¾z¿!ku¿rNn¿Òre¿ôéZ¿ëÉN¿÷$A¿2¿[¾!¿’4¿Aû¾9<Ô¾ò±«¾2ß¾ù2.¾>㮽™WE7¥Ï®= 9.>-â>P­«>?Ô>·<û>Ø5?Œ¿!?Ë2?ú%A?xÈN?ÁêZ?se?ŒMn?‘ku?ª½z?Ô;~?dÞ?¢?†ˆ}?#•y?LÎs?ç@l?Røb?#X?@„K?~‚=?%!.?[w?þ¦ ?Ï©ñ>Ö:Ê>$Y¡>‚„n>‰˜> >ƒ=ï'¯¼[`Ú½¿C¾êoŒ¾òµ¾’'Þ¾K[¿Š²¿ó%¿mû5¿×±D¿öQ¿ó³]¿%Óg¿H?p¿¬ëv¿kÉ{¿2Ñ~¿Gü¿ÈH¿Â·|¿ðNx¿ör¿¼j¿Hc`¿ U¿É&H¿ÝÉ9¿^*¿ó¿ ¿\öç¾Î!À¾xí–¾¾.Y¾Aì¾S/½\/=Äë>C.Y><í–>”!À>$öç>ü?Ú?G*?ÇÉ9?µ&H?þ U?9c`?¯j?ìr?èNx?½·|?ÅH?=ü?5Ñ~?qÉ{?´ëv?R?p?3Óg?´]?öQ?ë±D?ƒû5?µó%?¤²?f[?Ë'Þ>Pòµ>'pŒ>•¿C>UaÚ=Ý+¯<%=ƒ½ ˜¾„n¾èX¡¾œ:ʾ—©ñ¾ä¦ ¿Cw¿!.¿i‚=¿-„K¿X¿Cøb¿Û@l¿CÎs¿•y¿‚ˆ}¿€¢¿DÞ¿Ø;~¿°½z¿šku¿˜Mn¿se¿ÑêZ¿‹ÈN¿&A¿â2¿¥¿!¿ò5¿î<û¾@?Ô¾Œ­«¾j⾉9.¾ Ð®½~Êd·Câ®=}2.>õÞ>·±«>ÿ;Ô>É@û>x4?B¾!?y2?â$A?ÙÉN?äéZ?Äre?gNn?ku?"¾z?¢;~?WÞ?a¢?Áˆ}?ž”y?ÎÎs?@l?ùb?X?Õ‚K?œƒ=?n.?«x?c¨ ?°¥ñ>å=Ê>µT¡>üŠn>Ÿ>{+ƒ=®ò®¼ïrÚ½¸C¾·lŒ¾söµ¾’$Þ¾M]¿/±¿Yò%¿ý5¿Æ°D¿W÷Q¿³]¿qÒg¿@p¿;ëv¿×É{¿ Ñ~¿Cü¿›H¿¸|¿^Nx¿r¿Êj¿d`¿ü U¿T%H¿Ë9¿Ÿ*¿H¿ ¿2òç¾ä$À¾é–¾?5Y¾Üò¾þí.½Àö.=õ>Á'Y> ê–>è%À>,óç>ø ?„?*?bË9?¬%H?I U?lb`?j?®r?Nx?¸|?¦H?Aü?üÐ~?¾É{?ëv?æ?p?5Òg?ز]?÷Q?m°D?®ü5?îñ%?ÿ³?Ô\?–#Þ>lõµ>©kŒ>ÆC>“nÚ=&á®<Ú/ƒ½I¡¾Ž}n¾¿U¡¾ç>ʾ¨¦ñ¾Ù¨ ¿óu¿Õ.¿ûƒ=¿*ƒK¿SX¿~÷b¿7@l¿ùÎs¿¾”y¿Ôˆ}¿i¢¿RÞ¿’;~¿¾z¿ðju¿4Nn¿…re¿›éZ¿†ÉN¿†$A¿2¿Õ½!¿R7¿Ô?û¾;Ô¾®°«¾åݾ@.¾åÝ®½¶‰¸7þÔ®=²;.>¼Û>”®«>@@Ô>â=û>f6?ø¼!?G2?j&A?ÝÈN?ëZ?re?ËMn?Âku?̽z?è;~?IÞ?x¢?nˆ}?ý”y?Îs?¥@l?øb?ÇX?؃K? ‚=?§ .?Ôv?È© ? ¨ñ>š9Ê>ÞW¡>æn>´¥>Å8ƒ=e=¯¼±eÚ½»ÁC¾ƒiŒ¾Vóµ¾È(Þ¾Þ[¿³¿ñ%¿åû5¿E²D¿cöQ¿I´]¿¼Ñg¿ƒ?p¿Ùëv¿ŠÉ{¿CÑ~¿>ü¿»H¿¦·|¿ÆNx¿¾r¿wj¿öb`¿° U¿^&H¿gÉ9¿Þ*¿i¿ë ¿*õç¾ À¾0ì–¾,Y¾vù¾š/½/=nî>â0Y>ßæ–>Ò"À>V÷ç>Ž ?c?Ê*?=Ê9? 'H?] U?Œc`?Vj?$r?Ox?Ø·|?ÒH?Fü?%Ñ~?RÉ{?‡ëv??p?êÒg?­³]?±õQ?}±D? û5?2ó%?²?C^?•&Þ>ñµ>ÜnŒ>ò¼C>Ð{Ú=g¯<€Bƒ½´š¾¤†n¾–R¡¾Ø;ʾƪñ¾t§ ¿Êw¿.¿Ü‚=¿•„K¿nX¿“øb¿’?l¿wÎs¿C•y¿™ˆ}¿‰¢¿`Þ¿Ä;~¿Ž½z¿iku¿YMn¿Bse¿xêZ¿&ÈN¿ž%A¿f2¿ ¿!¿d5¿»Bû¾>Ô¾H¬«¾á¾ä6.¾)뮽¬:d¶œç®="5.>Aà>q««>8=Ô>ôAû>5?Ǿ!?2?S%A?>ÊN?=êZ?se?/Mn?Iku?E¾z?¶;~?\Þ?¢?©ˆ}?x”y?šÎs?¾?l?Çøb?«X?m‚K?)ƒ=?ñ.?$x?Ó§ ?«ñ>©<Ê>oS¡>`ˆn>wœ>Fƒ=$¯¼ExÚ½2»C¾nŒ¾9ðµ¾È%Þ¾á]¿»±¿Ûò%¿ºú5¿4±D¿º÷Q¿t³]¿¹Òg¿ð>p¿iëv¿öÉ{¿Ñ~¿Eü¿ÛH¿ê·|¿5Nx¿Ir¿…j¿Ãc`¿œ U¿é$H¿ŒÊ9¿*¿¿¿ï ¿"øç¾¦#À¾¹ç–¾ 2Y¾2ð¾6#/½z/=±÷>`*Y>Vë–>¼À>^ôç>Š ??‰*?É9?&H?© U?¿b`?Hj?™r?ªNx?7¸|?²H?@ü?NÑ~?ŸÉ{?éêv?ª?p?ìÑg?‚´]?¥öQ?ÿ¯D?6ü5?kñ%?s³?A\?•)Þ>+ôµ>^jŒ>{ÃC>=iÚ=¨K¯<65ƒ½ð£¾*€n¾W¡¾É8ʾקñ¾i© ¿zv¿S .¿¾=¿’ƒK¿¯X¿Í÷b¿y@l¿õÍs¿ä”y¿ìˆ}¿r¢¿MÞ¿ö;~¿ã½z¿¿ju¿õMn¿9re¿UëZ¿!ÉN¿$A¿™2¿P½!¿Ä6¿©>û¾AÔ¾k¯«¾™Ü¾t=.¾ŒØ®½a˜ñ·WÚ®=W>.> Ý>ׯ«>0:Ô>?û>ó6?}½!?Â2?;$A?CÉN?sëZ?Sre? Nn?Ïju?ï½z?ü;~?NÞ?o¢?äˆ}?×”y?ãÍs?c@l?³÷b?X?oƒK?—=?) .?Mv?9© ?q§ñ>_8Ê>˜V¡>Jn> £>j3ƒ=ãÒ®¼kÚ½^ÄC¾ÍjŒ¾—ôµ¾È"Þ¾r\¿¢³¿—ñ%¿^ü5¿$°D¿ÆöQ¿Ÿ´]¿Òg¿¾?p¿øêv¿©É{¿SÑ~¿@ü¿®H¿.¸|¿œNx¿†r¿1j¿£b`¿‰ U¿ó%H¿ðÈ9¿^*¿à¿Y ¿øóç¾QÀ¾çê–¾)Y¾Íö¾áý.½Þæ.=ñ>3Y>'è–>$À>gñç> ?í?J*?³Ê9? %H?¼ U?Þc`?œj?\r?CNx?ó·|?ßH?Dü?Ñ~?ìÉ{?Zëv?Ü>p?¡Òg?W³]?™÷Q?±D?‘ú5?°ò%?Œ±?¯]?`%Þ>Îïµ>’mŒ>PºC>zvÚ=ñ¯<ë'ƒ½[¾@‰n¾ÜS¡¾=ʾç¤ñ¾¨ ¿Qx¿.¿Pƒ=¿‚K¿ÊX¿âøb¿Õ?l¿«Îs¿…”y¿±ˆ}¿’¢¿ZÞ¿°;~¿9¾z¿8ku¿Mn¿öre¿êZ¿ÊN¿-%A¿ë2¿›¾!¿Ö4¿Aû¾Ï<Ô¾««¾Òß¾?4.¾Ð宽PZå6Í®=Ç7.>á>µ¬«>q>Ô>'<û>“5?L¿!?2?Ã%A?HÈN?–êZ?\se?nMn?zku?™½z?Ë;~?bÞ?†¢?‘ˆ}?6•y?eÎs?|?l?xøb?OX?r„K?µ‚=?s.?w?C§ ?`ªñ>n;Ê>)R¡>Ã…n>Й>´@ƒ=š¯¼É]Ú½Õ½C¾KoŒ¾zñµ¾ý&Þ¾[¿G²¿^ó%¿2û5¿¢±D¿ÒõQ¿Ê³]¿Óg¿+?p¿–ëv¿\É{¿*Ñ~¿Gü¿ÎH¿Ï·|¿Ox¿r¿?j¿pc`¿= U¿ü&H¿Ê9¿Ÿ*¿5¿] ¿ðöç¾g"À¾qæ–¾0Y¾‰í¾|/½3 /=|ê>ÿ,Y>žì–>û À>‘õç>¶?˜? *?ŽÉ9?‚&H?Ð U?c`?Žj?Ñr?ÔNx?¯·|?¿H?>ü?=Ñ~?€É{?Êëv?o?p?£Ñg?,´]?CöQ? ²D?½û5?èð%?ç²?­[?`(Þ>êòµ>iŒ>ÙÀC>çcÚ=26¯<‘:ƒ½Å–¾Æ‚n¾KX¡¾:ʾ©ñ¾Ÿ¦ ¿w¿Ñ .¿1‚=¿ûƒK¿æX¿øb¿»@l¿)Îs¿ •y¿vˆ}¿{¢¿GÞ¿â;~¿Á½z¿²ku¿¶Mn¿íqe¿üêZ¿¼ÈN¿E&A¿2¿Ë¼!¿66¿~=û¾×?Ô¾'®«¾MÛ¾Ï:.¾3Ó®½wº›·°ß®=71.>UÞ>±«>i;Ô>9@û>34?¾!?=2?¬$A?¨ÉN?¹éZ?Ÿre?INn?ku?¾z?™;~?TÞ?f¢?̈}?±”y?çÎs? @l?c÷b?4X?ƒK?Ôƒ=?«.?Åu?©¨ ?B¦ñ>}>Ê>RU¡>®|n>e >.ƒ=Y讼]pÚ½K·C¾lŒ¾Øõµ¾ý#Þ¾]¿ì°¿ò%¿×ü5¿‘°D¿(÷Q¿õ²]¿NÒg¿ù?p¿&ëv¿ÈÉ{¿Ñ~¿Bü¿¡H¿¸|¿sNx¿œr¿ìj¿Pb`¿) U¿ˆ%H¿;Ë9¿Ý*¿V¿Ç ¿Æòç¾}%À¾Ÿé–¾à&Y¾#ô¾'ó.½—ñ.=Àó>~&Y>oé–>O%À>™òç>² ?B?Ê*?)Ë9?x%H? U?Db`?áj?”r?lNx?¸|?ŸH?Bü?Ñ~?ÍÉ{?,ëv?@p?XÒg?³]?6÷Q?¡°D?éü5?-ò%?±?]?+$Þ>öµ>HlŒ>®·C>$qÚ={ë®Ê¾¦ñ¾”¨ ¿±u¿™.¿Ãƒ=¿ø‚K¿&X¿X÷b¿@l¿àÎs¿«”y¿Éˆ}¿e¢¿UÞ¿›;~¿¾z¿ku¿RNn¿ªre¿ÆéZ¿·ÉN¿¼$A¿O2¿¾!¿H4¿d@û¾—;Ô¾J±«¾…Þ¾š1.¾x஽}47kÒ®=l:.>Ùâ>ø­«>©?Ô>R=û>!6?¸¼!? 2?4&A?­ÈN?ïêZ?âqe?­Mn?ªku?¼½z?ß;~?FÞ?}¢?zˆ}?•y?1Îs?Å@l?(øb?óX? „K?B‚=?ã .?w?´¦ ?2©ñ>2:Ê>{X¡>'ƒn>(—>Y;ƒ=3¯¼cÚ½wÀC¾•pŒ¾¼òµ¾3(Þ¾—[¿Ó²¿Õð%¿«û5¿²D¿4öQ¿´]¿™Ñg¿f?p¿Ãëv¿{É{¿;Ñ~¿=ü¿ÁH¿³·|¿ÚNx¿Ùr¿˜j¿c`¿Þ U¿‘&H¿ŸÉ9¿*¿¬¿Ë¿½õç¾)!À¾Îì–¾a-Y¾àê¾Ã /½ì/=&í>Ÿ/Y>æí–>9"À>Ãöç>H ?!?Œ*?Ê9?í&H?/ U?dc`?5j? r?þNx?Ë·|?ÌH?Gü?-Ñ~?aÉ{?ëv?4?p? Óg?Ö³]?àõQ?²±D?Dû5?qó%?[²?[?*'Þ>©ñµ>{oŒ>7¾C>‘^Ú=¼ ¯<ì?ƒ½m™¾b…n¾‘Y¡¾@;ʾ4ªñ¾.§ ¿‰w¿`.¿¤‚=¿c„K¿BX¿løb¿s?l¿^Îs¿0•y¿Žˆ}¿„¢¿bÞ¿Í;~¿ž½z¿ku¿wMn¿gse¿£êZ¿VÈN¿Ô%A¿¢2¿`¿!¿¨5¿S<û¾ž>Ծ䬫¾¾á¾*8.¾ÚÍ®½¹ · å®=Ü3.>¡ß>_²«>¢<Ô>dAû>Á4?‡¾!?Ù2?%A? ÊN?êZ?ëre?Mn?1ku?4¾z?­;~?YÞ?“¢?µˆ}?‹”y?³Îs?Þ?l?îøb?ØX?Ÿ‚K?`ƒ=?-.?ex?¨ ?¥ñ>A=Ê> T¡>¡‰n>¾>³(ƒ=Ïý®¼³uÚ½î¹C¾bmŒ¾÷µ¾3%Þ¾š]¿x±¿ò%¿€ú5¿ÿ°D¿Š÷Q¿J³]¿–Òg¿Ó>p¿Sëv¿çÉ{¿Ñ~¿Dü¿áH¿÷·|¿INx¿dr¿¦j¿êc`¿Ê U¿%H¿ÅÊ9¿]*¿¿5 ¿“ñç¾?$À¾Wè–¾ã3Y¾zñ¾nè.½Pü.=iö>)Y>¸ê–>&À>Ëóç>D ?Ì?K*?ßÈ9?ã%H?{ U?—b`?'j?~r?–Nx?*¸|?¬H?@ü?VÑ~?®É{?ÿêv?Ç?p?Òg?«´]?ÔöQ?4°D?pü5?ªñ%?¶³?ˆ\?õ"Þ>Æôµ>ýjŒ>ÀÄC>ÎkÚ=Ö®<¢2ƒ½©¢¾è~n¾hV¡¾Š?ʾE§ñ¾$© ¿9v¿ .¿†=¿`ƒK¿ƒX¿§÷b¿Y@l¿ÜÍs¿Ñ”y¿áˆ}¿n¢¿OÞ¿ÿ;~¿ô½z¿×ju¿Nn¿^re¿€ëZ¿RÉN¿K$A¿Ô2¿½!¿7¿9?û¾^:Ô¾°«¾9ݾ¹>.¾Û®½gå7Ä×®==.>iÜ><¯«>â@Ô>~>û>¯6?=½!?‡2?$A?ÉN?HëZ?.re?ìMn?¸ju?Þ½z?ó;~?LÞ?s¢?ðˆ}?é”y?ýÍs?‚@l?Ù÷b?¼X?¢ƒK?Î=?f .?Žv?~© ?¨ñ>÷8Ê>5W¡>‹€n>S¤>ý5ƒ=‡H¯¼vhÚ½ÃC¾.jŒ¾ýóµ¾h)Þ¾+\¿^³¿Xñ%¿$ü5¿~²D¿–öQ¿u´]¿âÑg¿¢?p¿ãêv¿šÉ{¿KÑ~¿?ü¿´H¿;¸|¿°Nx¿¡r¿Sj¿Ëb`¿¶ U¿&&H¿)É9¿›*¿"¿Ÿ ¿‹ôç¾ëÀ¾…ë–¾Â*Y¾ø¾ /½¥!/=Ïï>>2Y>‰ç–>w#À>õ÷ç>Ú ?«? *?zÊ9?X'H?Ž U?·c`?zj?Ar?/Nx?æ·|?ÙH?Eü?Ñ~?ûÉ{?oëv?ø>p?ÄÒg?€³]?È÷Q?D±D?Ëú5?ïò%?ϱ?÷]?õ%Þ>hðµ>1nŒ>•»C> yÚ=E ¯íà>¬«>Ú=Ô>Bû>O5? ¿!?T2?%A?rÊN?kêZ?7se?PMn?bku?ˆ½z?Á;~?_Þ?Š¢?ˆ}?H•y?Îs?œ?l?žøb?|X?¤„K?í‚=?¯.?Þw?‰§ ?òªñ><Ê>ÆR¡>‡n>›>HCƒ=F¯¼ {Ú½¼C¾¬nŒ¾àðµ¾h&Þ¾.^¿²¿ó%¿øú5¿m±D¿ì÷Q¿ ³]¿ßÒg¿?p¿€ëv¿MÉ{¿"Ñ~¿Fü¿ÔH¿Ü·|¿Ox¿,r¿aj¿˜c`¿k U¿0'H¿NÊ9¿Ü*¿w¿£ ¿ƒ÷ç¾#À¾ç–¾D1Y¾Ñ/½ /=ù>¼+Y>ì–>a À>ýôç>Ö ?U?Ë*?UÉ9?N&H?Ú U?éb`?lj?¶r?ÀNx?¢·|?¹H??ü?EÑ~?É{?àëv?Œ?p?ÆÑg?U´]?röQ?U²D?÷û5?'ñ%?*³?ô[?õ(Þ>…óµ>³iŒ>ÂC>xfÚ=‡@¯<ý7ƒ½Q¥¾„n¾®W¡¾l9ʾt¨ñ¾³© ¿Àv¿” .¿ù=¿ÈƒK¿ßX¿÷÷b¿›@l¿Îs¿ø”y¿kˆ}¿w¢¿JÞ¿ë;~¿Ñ½z¿Éku¿ÔMn¿re¿'ëZ¿ìÈN¿{&A¿Y2¿ ½!¿z6¿>û¾m@ԾíÛ¾<.¾ÆÕ®½°Å·Ý®=¶?.>µÝ>°«>Ó:Ô>©?û>=7?½!?2?u$A?wÉN?¡ëZ?zre?*Nn?éju?¾z?;~?QÞ?j¢?؈}?Ôy?Ïs?@@l?Š÷b?`X?9ƒK? „=?è.?v?î¨ ?Ô¦ñ>?Ê>ïU¡>ï}n>¬¡>¢0ƒ=Þ®¼ÌmÚ½»ÅC¾ykŒ¾>õµ¾h#Þ¾¿\¿ê³¿Ûñ%¿ü5¿]°D¿ùöQ¿Ë´]¿*Òg¿Ý?p¿ëv¿¹É{¿úÐ~¿Aü¿§H¿ ¸|¿‡Nx¿·r¿ j¿xb`¿W U¿»%H¿tË9¿*¿˜¿ ¿Yóç¾&À¾=ê–¾#(Y¾kõ¾Qø.½nì.=xò>Ý4Y>Ñè–>¶$À>òç>l ?4?*?ñÊ9?E%H?î U? d`?Àj?yr?XNx?¸|?™H?Cü? Ñ~?ÜÉ{?Bëv?@p?{Òg?*³]?f÷Q?Ö°D?#ý5?lò%?D±?c]?¿$Þ>¢öµ>çlŒ>ò¸C>¶sÚ=Ïõ®<³*ƒ½»ž¾šŠn¾…T¡¾·=ʾ„¥ñ¾N¨ ¿˜x¿\.¿‹ƒ=¿Æ‚K¿úX¿ ùb¿÷?l¿ÆÎs¿™”y¿¾ˆ}¿—¢¿WÞ¿¥;~¿'¾z¿ku¿pNn¿Ïre¿ñéZ¿çÉN¿ò$A¿‹2¿V¾!¿Œ4¿õ@û¾-<Ծ汫¾%ß¾à2.¾ ã®½Š¾K7ØÏ®=&9.>:â>\­«>?Ô>Â<û>Ý5?‘¿!?Ð2?þ%A?|ÈN?ÄêZ?ƒse?Mn?“ku?«½z?Õ;~?dÞ?¢?…ˆ}?"•y?JÎs?ä@l?Oøb?X?<„K?y‚=? !.?Vw?ù¦ ?éñ>Ê:Ê>Y¡>i„n>o˜>í=ƒ=¼(¯¼Ž`Ú½2¿C¾öoŒ¾!òµ¾ž'Þ¾P[¿²¿¢ó%¿qû5¿Û±D¿öQ¿ö³]¿(Óg¿J?p¿®ëv¿lÉ{¿3Ñ~¿Hü¿ÇH¿Á·|¿îNx¿ôr¿¹j¿Ec`¿ U¿Å&H¿ØÉ9¿Y*¿î¿ ¿Qöç¾Â!À¾lí–¾¤.Y¾(ì¾í/½Ã/=Þë>\.Y>Hí–> !À>0öç> ?ß?L*?ËÉ9?¹&H? U?Dòµ>pŒ>{¿C>"aÚ=+¯ß>ñ«> <Ô>Ô@û>}4?G¾!?}2?æ$A?ÜÉN?çéZ?Ære?iNn?ku?$¾z?£;~?WÞ?a¢?Àˆ}?”y?ÌÎs?þ?l?ùb?X?Ñ‚K?˜ƒ=?j.?¦x?^¨ ?¥¥ñ>Ù=Ê>©T¡>ãŠn>Ÿ>G+ƒ={ó®¼"sÚ½©¸C¾ÃlŒ¾öµ¾ž$Þ¾S]¿4±¿^ò%¿ý5¿Ê°D¿[÷Q¿!³]¿sÒg¿@p¿=ëv¿ØÉ{¿ Ñ~¿Cü¿›H¿¸|¿]Nx¿r¿Çj¿d`¿ø U¿P%H¿ýÊ9¿›*¿C¿{ ¿'òç¾Ø$À¾õè–¾&5Y¾Âò¾˜í.½'÷.=!õ>Ú'Y>ê–>ô%À>8óç>ý ?‰? *?gË9?°%H?M U?ob`?j?°r?‚Nx?¸|?¦H?Aü?ûÐ~?½É{?ëv?ã?p?2Òg?Ô´]?÷Q?h°D?ªü5?éñ%?ù³?Ï\?Š#Þ>`õµ>œkŒ>ÆC>`nÚ=Yà®<0ƒ½b¡¾§}n¾ËU¡¾ò>ʾ³¦ñ¾Þ¨ ¿øu¿Ú.¿ÿƒ=¿.ƒK¿VX¿÷b¿9@l¿ûÎs¿¿”y¿Õˆ}¿i¢¿RÞ¿‘;~¿¾z¿îju¿1Nn¿ƒre¿«ëZ¿‚ÉN¿‚$A¿2¿Ð½!¿L7¿É?û¾ô:Ô¾¢°«¾Ùݾÿ?.¾²Ý®½.½»71Õ®=Ë;.>ÉÛ> ®«>K@Ô>í=û>k6?ý¼!?K2?o&A?áÈN?ëZ? re?ÍMn?Äku?νz?é;~?IÞ?x¢?mˆ}?ü”y?Îs?¢@l?ÿ÷b?ÃX?ÔƒK?‚=?¢ .?Ïv?é ?”¨ñ>9Ê>ÑW¡>Ín>š¥>‘8ƒ=2>¯¼äeÚ½ÕÁC¾iŒ¾bóµ¾Ó(Þ¾ä[¿³¿ñ%¿êû5¿I²D¿göQ¿L´]¿¿Ñg¿…?p¿Ûëv¿‹É{¿CÑ~¿>ü¿»H¿¥·|¿ÅNx¿¼r¿tj¿òb`¿­ U¿Z&H¿bÉ9¿Ù*¿d¿å ¿õ羄 À¾#ì–¾,Y¾]ù¾3/½|/=‡î>û0Y>ëæ–>Þ"À>b÷ç>“ ?i?Ï*?BÊ9?$'H?a U?c`?Yj?&r?Ox?Ù·|?ÓH?Fü?$Ñ~?QÉ{?…ëv??p?çÒg?ª³]?­õQ?y±D?û5?-ó%?²?>^?Š&Þ>ñµ>ÐnŒ>Ù¼C>{Ú=š¯<³Bƒ½Í𾽆n¾¢R¡¾ã;ʾѪñ¾y§ ¿Ïw¿¢.¿à‚=¿™„K¿rX¿•øb¿•?l¿yÎs¿D•y¿šˆ}¿‰¢¿_Þ¿Ã;~¿Œ½z¿gku¿WMn¿@se¿uêZ¿"ÈN¿™%A¿b2¿¿!¿_5¿°Bû¾ü=Ô¾<¬«¾á¾Ë6.¾öꮽæžJ¶Ïç®=;5.>Mà>}««>D=Ô>ÿAû> 5?̾!?2?W%A?BÊN?@êZ?se?2Mn?Kku?F¾z?·;~?\Þ?¢?¨ˆ}?w”y?˜Îs?¼?l?Äøb?¨X?i‚K?$ƒ=?ì.?x?Χ ?„«ñ>ž<Ê>cS¡>Gˆn>^œ>ÜEƒ=ñ¯¼xxÚ½K»C¾ nŒ¾Eðµ¾Ó%Þ¾ç]¿À±¿àò%¿¾ú5¿8±D¿½÷Q¿w³]¿¼Òg¿ò>p¿këv¿÷É{¿Ñ~¿Eü¿ÚH¿é·|¿3Nx¿Gr¿‚j¿Àc`¿™ U¿å$H¿‡Ê9¿*¿º¿ê ¿øç¾š#À¾­ç–¾‡2Y¾ð¾Ï"/½à/=Ë÷>y*Y>bë–>ÈÀ>jôç> ??*?É9?&H?¬ U?Âb`?Kj?›r?¬Nx?8¸|?³H?@ü?MÑ~?žÉ{?çêv?¨?p?êÑg?´]?¡öQ?û¯D?1ü5?fñ%?n³?;\?Š)Þ>ôµ>RjŒ>bÃC> iÚ=ÛJ¯û¾AÔ¾_¯«¾Ü¾Z=.¾YØ®½èdî·ŠÚ®=p>.>Ý>䯫><:Ô>?û>ù6?‚½!?Ç2??$A?GÉN?vëZ?Vre? Nn?Ñju?ð½z?ý;~?OÞ?o¢?ãˆ}?Ö”y?áÍs?`@l?°÷b?X?lƒK?“=?$ .?Gv?3© ?f§ñ>­?Ê>ŒV¡>1n>ó¢>63ƒ=°Ó®¼:kÚ½wÄC¾ÚjŒ¾£ôµ¾Ó"Þ¾x\¿§³¿œñ%¿cü5¿(°D¿ÉöQ¿¢´]¿Òg¿À?p¿úêv¿ªÉ{¿TÑ~¿@ü¿®H¿-¸|¿›Nx¿„r¿.j¿ b`¿… U¿ï%H¿ìÈ9¿Y*¿Û¿T ¿ìóç¾°&À¾Ûê–¾f)Y¾³ö¾zý.½Dç.=0ñ>š3Y>3è–>$À>rñç>% ?ò?O*?¸Ê9?%H?À U?ác`?žj?^r?DNx?ô·|?àH?Dü?Ñ~?ëÉ{?Xëv?Ú>p?žÒg?T³]?•÷Q? ±D?ú5?«ò%?‡±?ª]?T%Þ>Âïµ>†mŒ>7ºC>GvÚ=$¯<(ƒ½t¾Y‰n¾èS¡¾=ʾò¤ñ¾ ¨ ¿Vx¿.¿Tƒ=¿”‚K¿ÎX¿åøb¿×?l¿­Îs¿†”y¿²ˆ}¿’¢¿ZÞ¿¯;~¿8¾z¿6ku¿Mn¿óre¿êZ¿ÊN¿)%A¿ç2¿–¾!¿Ñ4¿…Aû¾Ã<Ô¾øª«¾Åß¾&4.¾å®½3(ò6EÍ®=à7.>šá>Á¬«>|>Ô>2<û>™5?Q¿!?”2?È%A?KÈN?™êZ?_se?pMn?{ku?š½z?Ë;~?bÞ?…¢?‘ˆ}?4•y?cÎs?z?l?uøb?LX?n„K?±‚=?n.?—w?>§ ?Uªñ>b;Ê>R¡>«…n>¶™>€@ƒ=g¯¼ü]Ú½î½C¾WoŒ¾†ñµ¾ 'Þ¾ [¿L²¿có%¿7û5¿¦±D¿ÖõQ¿Í³]¿Óg¿-?p¿˜ëv¿^É{¿+Ñ~¿Gü¿ÎH¿Î·|¿Ox¿r¿<j¿mc`¿: U¿ø&H¿Ê9¿š*¿0¿X ¿äöç¾\"À¾eæ–¾è/Y¾pí¾/½™ /=–ê>-Y>ªì–>!À>œõç>»??*?“É9?†&H?Ô U?c`?j?Ór?ÖNx?°·|?ÀH?>ü?=Ñ~?É{?Èëv?m?p?¡Ñg?)´]??öQ?²D?¸û5?ãð%?â²?§[?T(Þ>Þòµ>iŒ>ÀÀC>´cÚ=e5¯<Ä:ƒ½ß–¾ß‚n¾WX¡¾:ʾ©ñ¾¤¦ ¿w¿Ö .¿5‚=¿þƒK¿éX¿ øb¿½@l¿+Îs¿ •y¿wˆ}¿|¢¿GÞ¿á;~¿À½z¿°ku¿´Mn¿êqe¿ùêZ¿¸ÈN¿@&A¿2¿Æ¼!¿16¿s=û¾Ë?Ô¾®«¾AÛ¾µ:.¾Ó®½ÿ†˜·ãß®=Q1.>aÞ>'±«>u;Ô>D@û>94?¾!?B2?°$A?¬ÉN?½éZ?¢re?KNn?ku?¾z?™;~?TÞ?f¢?̈}?¯”y?åÎs?@l?`÷b?0X?ƒK?Ѓ=?¦.?Àu?£¨ ?7¦ñ>q>Ê>FU¡>•|n>L >Û-ƒ=&鮼pÚ½e·C¾$lŒ¾äõµ¾ $Þ¾ ]¿ñ°¿ò%¿Ûü5¿–°D¿,÷Q¿ø²]¿PÒg¿ü?p¿'ëv¿ÊÉ{¿Ñ~¿Bü¿¡H¿¸|¿qNx¿šr¿éj¿Mb`¿& U¿„%H¿6Ë9¿Ø*¿Q¿Â ¿ºòç¾r%À¾“é–¾Ç&Y¾ ô¾Áò.½ýñ.=Ùó>—&Y>|é–>[%À>¤òç>· ?G?Ï*?.Ë9?|%H? U?Gb`?äj?–r?nNx?¸|? H?Bü?Ñ~?ÌÉ{?+ëv?@p?UÒg?þ²]?3÷Q?°D?äü5?(ò%?û°?]?$Þ>ûõµ>;lŒ>•·C>ñpÚ=®ê®Ê¾!¦ñ¾™¨ ¿¶u¿.¿Çƒ=¿ü‚K¿*X¿[÷b¿@l¿âÎs¿­”y¿Êˆ}¿e¢¿TÞ¿›;~¿¾z¿ku¿ONn¿§re¿ÃéZ¿³ÉN¿¸$A¿K2¿¾!¿C4¿Y@û¾‹;Ô¾>±«¾yÞ¾1.¾E஽ög’7žÒ®=…:.>)Û>®«>µ?Ô>]=û>'6?½¼!?2?8&A?±ÈN?òêZ?åqe?¯Mn?¬ku?½½z?ß;~?FÞ?|¢?yˆ}?•y?/Îs?Â@l?%øb?ðX?„K?>‚=?ß .?w?®¦ ?&©ñ>':Ê>nX¡>ƒn>—>%;ƒ=Ý3¯¼RcÚ½ÀC¾¢pŒ¾Èòµ¾>(Þ¾[¿Ø²¿Úð%¿°û5¿²D¿8öQ¿#´]¿›Ñg¿i?p¿Åëv¿}É{¿;Ñ~¿>ü¿ÁH¿²·|¿ÙNx¿×r¿•j¿c`¿Ú U¿&H¿›É9¿*¿¦¿Æ¿²õç¾!À¾Áì–¾H-Y¾Æê¾] /½R/=?í>¸/Y>òí–>E"À>Îöç>M ?&?‘*? Ê9?ñ&H?3 U?gc`?8j? r?Ox?Ì·|?ÍH?Gü?,Ñ~?`É{?›ëv?1?p? Óg?Ó³]?ÝõQ?®±D?@û5?ló%?V²?[?'Þ>ñµ>ooŒ>¾C>^^Ú=ï¯<@ƒ½†™¾{…n¾Y¡¾L;ʾ?ªñ¾4§ ¿Žw¿e.¿©‚=¿g„K¿EX¿oøb¿u?l¿`Îs¿2•y¿ˆ}¿…¢¿bÞ¿Í;~¿½z¿ku¿uMn¿dse¿ êZ¿SÈN¿Ð%A¿2¿[¿!¿£5¿G<û¾“>Ծج«¾±á¾8.¾§Í®½*R·<å®=õ3.>­ß>k²«>­<Ô>oAû>Ç4?Œ¾!?Þ2?!%A?ÊN?êZ?îre?Mn?3ku?6¾z?­;~?ZÞ?“¢?´ˆ}?‰”y?±Îs?Ü?l?ëøb?ÔX?›‚K?\ƒ=?(.?`x?¨ ?¥ñ>5=Ê>T¡>ˆ‰n>¥>€(ƒ=œþ®¼æuÚ½ºC¾nmŒ¾%÷µ¾>%Þ¾Ÿ]¿}±¿¡ò%¿„ú5¿±D¿Ž÷Q¿N³]¿™Òg¿Õ>p¿Uëv¿éÉ{¿Ñ~¿Dü¿áH¿ö·|¿GNx¿br¿£j¿çc`¿Ç U¿%H¿ÀÊ9¿X*¿ü¿0 ¿ˆñç¾3$À¾Kè–¾Ê3Y¾añ¾è.½·ü.=ƒö>6)Y>Äê–>™&À>×óç>I ?Ñ?P*?äÈ9?ç%H?~ U?šb`?*j?€r?˜Nx?+¸|?­H?@ü?UÑ~?­É{?ýêv?Å?p? Òg?¨´]?ÐöQ?/°D?kü5?¥ñ%?±³?‚\?ê"Þ>ºôµ>ñjŒ>§ÄC>›kÚ=7Õ®<Õ2ƒ½Ã¢¾n¾tV¡¾–?ʾP§ñ¾)© ¿>v¿ .¿Š=¿dƒK¿†X¿ª÷b¿[@l¿ÞÍs¿Ó”y¿âˆ}¿n¢¿OÞ¿ÿ;~¿ó½z¿Õju¿Nn¿[re¿}ëZ¿NÉN¿G$A¿Ï2¿‹½!¿7¿.?û¾R:Ô¾û¯«¾-ݾ >.¾ìÚ®½àEè7÷×®=*=.>uÜ>H¯«>í@Ô>‰>û>´6?B½!?‹2? $A?ÉN?KëZ?1re?îMn?ºju?à½z?ô;~?LÞ?s¢?ïˆ}?è”y?ûÍs?€@l?Ö÷b?¹X?žƒK?Ê=?a .?‰v?x© ?÷§ñ>ë8Ê>(W¡>r€n>:¤>Ê5ƒ=TI¯¼¨hÚ½2ÃC¾;jŒ¾ ôµ¾t)Þ¾1\¿d³¿]ñ%¿)ü5¿ó¯D¿šöQ¿y´]¿äÑg¿¤?p¿äêv¿œÉ{¿LÑ~¿?ü¿´H¿:¸|¿¯Nx¿Ÿr¿Pj¿Èb`¿³ U¿"&H¿%É9¿—*¿¿š ¿€ôç¾ßÀ¾yë–¾©*Y¾û÷¾¤/½ "/=èï>W2Y>•ç–>ƒ#À>øç>ß ?°?*?Ê9?Ý$H?’ U?ºc`?}j?Cr?0Nx?ç·|?ÙH?Eü?Ñ~?úÉ{?nëv?ö>p?ÁÒg?}³]?Ä÷Q?@±D?Çú5?êò%?ʱ?ñ]?é%Þ>\ðµ>%nŒ>|»C>ÙxÚ=y ¯úà>%¬«>æ=Ô>›Bû>T5?¿!?Y2?‘%A?vÊN?oêZ?:se?RMn?dku?нz?Â;~?_Þ?Š¢?œˆ}?G•y?}Îs?š?l?›øb?xX? „K?é‚=?«.?Ùw?ƒ§ ?çªñ>ú;Ê>ºR¡>ì†n>ýš>Cƒ=¯¼<{Ú½©¼C¾¸nŒ¾ìðµ¾t&Þ¾3^¿ ²¿$ó%¿ýú5¿q±D¿ð÷Q¿£³]¿âÒg¿?p¿‚ëv¿OÉ{¿#Ñ~¿Fü¿ÔH¿Û·|¿Ox¿*r¿^j¿•c`¿g U¿,'H¿JÊ9¿Ø*¿r¿ž ¿x÷ç¾õ"À¾ç–¾+1Y¾·î¾@/½p/=,ù>Õ+Y> ì–>m À> õç>Û ?Z?Ð*?ZÉ9?R&H?Þ U?íb`?oj?¸r?ÂNx?£·|?ºH??ü?EÑ~?ŽÉ{?Þëv?‰?p?ÄÑg?R´]?nöQ?Q²D?òû5?"ñ%?%³?ï[?é(Þ>yóµ>§iŒ>ÂC>EfÚ=º?¯<08ƒ½j¥¾n¾ºW¡¾x9ʾ¨ñ¾¹© ¿Åv¿™ .¿þ=¿ÌƒK¿âX¿ú÷b¿@l¿Îs¿ù”y¿lˆ}¿w¢¿IÞ¿ë;~¿Ð½z¿Çku¿ÒMn¿re¿$ëZ¿èÈN¿w&A¿T2¿½!¿u6¿>û¾b@Ô¾·®«¾àÛ¾û;.¾“Õ®½7ÜÁ·PÝ®=Ï?.>ÁÝ>‹°«>Þ:Ô>´?û>B7?ǽ!?2?z$A?{ÉN?¤ëZ?}re?-Nn?ëju?¾z?;~?QÞ?j¢?׈}?”y?ÿÎs?>@l?‡÷b?]X?6ƒK?„=?ã.?v?é¨ ?ɦñ> ?Ê>âU¡>Ö}n>“¡>o0ƒ=ÑÞ®¼þmÚ½ÕÅC¾…kŒ¾Jõµ¾t#Þ¾Ä\¿ï³¿àñ%¿¡ü5¿a°D¿üöQ¿Î´]¿-Òg¿ß?p¿ëv¿»É{¿úÐ~¿Aü¿§H¿¸|¿…Nx¿´r¿ j¿ub`¿T U¿·%H¿oË9¿*¿“¿ ¿Nóç¾ &À¾1ê–¾ (Y¾Rõ¾ê÷.½Ôì.=’ò>ö4Y>Þè–>Â$À>òç>q ?:?‘*?õÊ9?I%H?ñ U? d`?Ãj?{r?ZNx?¸|?šH?Cü? Ñ~?ÛÉ{?@ëv?@p?yÒg?'³]?b÷Q?Ò°D?ý5?gò%?>±?]]?´$Þ>–öµ>ÚlŒ>Ù¸C>ƒsÚ=õ®<æ*ƒ½Ôž¾³Šn¾‘T¡¾Ã=ʾ¥ñ¾T¨ ¿x¿a.¿ƒ=¿Ê‚K¿ýX¿ùb¿ù?l¿ÈÎs¿š”y¿¾ˆ}¿`¢¿WÞ¿¤;~¿&¾z¿ku¿nNn¿Ìre¿îéZ¿äÉN¿î$A¿†2¿Q¾!¿‡4¿é@û¾!<Ô¾Ú±«¾ß¾Ç2.¾×⮽{%R7 Ю=?9.>Fâ>h­«>?Ô>Í<û>â5?–¿!?Ô2?&A?€ÈN?ÈêZ?†se?‘Mn?•ku?¬½z?Ö;~?DÞ?¢?„ˆ}?!•y?HÎs?â@l?Løb?X?8„K?u‚=?!.?Qw?ó¦ ?¸©ñ>¾:Ê> Y¡>P„n>V˜>¹=ƒ=‰)¯¼Á`Ú½K¿C¾pŒ¾-òµ¾©'Þ¾V[¿•²¿§ó%¿vû5¿ß±D¿ öQ¿ù³]¿+Óg¿L?p¿¯ëv¿nÉ{¿4Ñ~¿Hü¿ÇH¿¿·|¿íNx¿òr¿·j¿Bc`¿ U¿Á&H¿ÔÉ9¿U*¿é¿ ¿Eöç¾¶!À¾_í–¾‹.Y¾ì¾†/½)/=÷ë>u.Y>Tí–>¬!À>;öç> ?ä?P*?ÐÉ9?½&H? U??c`?µj?ðr?ëNx?¿·|?ÆH?=ü?4Ñ~?oÉ{?±ëv?N?p?-Óg?ü³]? öQ?ã±D?zû5?«ó%?™²?[[?´'Þ>8òµ>pŒ>b¿C>ï`Ú=D*¯<‹=ƒ½?˜¾9„n¾Y¡¾´:ʾ®©ñ¾ï¦ ¿Mw¿!.¿q‚=¿4„K¿X¿Iøb¿à@l¿FÎs¿•y¿ƒˆ}¿€¢¿DÞ¿Ö;~¿®½z¿–ku¿“Mn¿‰se¿ËêZ¿ƒÈN¿&A¿Ù2¿›¿!¿ç5¿Ø<û¾)?Ô¾s­«¾Qâ¾V9.¾:Ю½›üW·©â®=°2.>ß>ϱ«><Ô>ß@û>‚4?L¾!?‚2?ê$A?àÉN?ëéZ?Ére?kNn?ku?%¾z?¤;~?WÞ?a¢?¿ˆ}?œ”y?ÊÎs?ü?l?ùb?X?Í‚K?”ƒ=?e.?¡x?Y¨ ?š¥ñ>Í=Ê>œT¡>ÊŠn>ìž>+ƒ=Hô®¼Usڽ¸C¾ÏlŒ¾‹öµ¾©$Þ¾X]¿:±¿bò%¿ý5¿Ï°D¿_÷Q¿$³]¿vÒg¿@p¿?ëv¿ÚÉ{¿ Ñ~¿Cü¿šH¿¸|¿[Nx¿}r¿Åj¿d`¿ô U¿L%H¿ùÊ9¿–*¿>¿v ¿òç¾Ì$À¾éè–¾ 5Y¾©ò¾1í.½÷.=;õ>ó'Y>&ê–>&À>Cóç> ??*?kË9?´%H?P U?rb`?j?³r?„Nx?¸|?§H?Aü?ûÐ~?¼É{?ëv?á?p?0Òg?Ñ´]?÷Q?d°D?¥ü5?äñ%?ô³?É\?#Þ>Uõµ>kŒ>ëÅC>-nÚ=Œß®Ê¾¾¦ñ¾ä¨ ¿ýu¿ß.¿„=¿2ƒK¿ZX¿„÷b¿<@l¿ýÎs¿À”y¿Öˆ}¿j¢¿RÞ¿;~¿¾z¿ìju¿/Nn¿€re¿¨ëZ¿~ÉN¿~$A¿ 2¿Ì½!¿G7¿¾?û¾é:Ô¾–°«¾Íݾæ?.¾Ý®½§ð¾7dÕ®=ä;.>ÕÛ>¬®«>W@Ô>ù=û>p6?½!?P2?s&A?åÈN?!ëZ? re?ÐMn?Æku?Ͻz?ê;~?IÞ?x¢?lˆ}?ú”y?Îs? @l?ü÷b?åX?ЃK?‚=? .?Êv?¾© ?‰¨ñ>ƒ9Ê>ÅW¡>´n>¥>^8ƒ=ÿ>¯¼fÚ½îÁC¾œiŒ¾nóµ¾ß(Þ¾é[¿ ³¿ñ%¿îû5¿M²D¿köQ¿O´]¿ÁÑg¿‡?p¿Ýëv¿É{¿DÑ~¿?ü¿ºH¿¤·|¿ÃNx¿ºr¿qj¿ïb`¿á U¿V&H¿^É9¿Ô*¿_¿à ¿õç¾x À¾ì–¾ì+Y¾Cù¾Í/½â/= î>1Y>÷æ–>ê"À>m÷ç>™ ?n?Ó*?FÊ9?('H?d U?’c`?\j?(r?Ox?Ú·|?ÓH?Fü?$Ñ~?PÉ{?„ëv??p?äÒg?¦³]?ô÷Q?u±D?û5?)ó%? ²?8^?~&Þ>÷ðµ>ÄnŒ>À¼C>k{Ú=ͯ<æBƒ½æš¾Õ†n¾¯R¡¾ï;ʾܪñ¾~§ ¿Ôw¿¦.¿å‚=¿„K¿uX¿˜øb¿—?l¿{Îs¿F•y¿›ˆ}¿Š¢¿_Þ¿Â;~¿‹½z¿fku¿TMn¿=se¿rêZ¿ÈN¿•%A¿]2¿¿!¿Y5¿¥Bû¾ð=Ô¾0¬«¾á¾±6.¾Ãꮽ!1¶è®=U5.>Zà>‰««>O=Ô> Bû>5?Ѿ!?2?[%A?EÊN?DêZ?se?4Mn?Lku?H¾z?¸;~?\Þ?Ž¢?§ˆ}?u”y?–Îs?¹?l?Áøb?¤X?e‚K? ƒ=?ç.?x?ɧ ?y«ñ>’<Ê>WS¡>.ˆn>Dœ>¨Eƒ=¾ ¯¼«xÚ½e»C¾nŒ¾Qðµ¾ß%Þ¾ì]¿Å±¿åò%¿Ãú5¿<±D¿Á÷Q¿z³]¿¿Òg¿ô>p¿lëv¿ùÉ{¿Ñ~¿Eü¿ÚH¿è·|¿2Nx¿Er¿j¿½c`¿• U¿á$H¿ƒÊ9¿*¿µ¿ä ¿ øç¾Ž#À¾¡ç–¾n2Y¾ÿï¾i"/½F/=ä÷>’*Y>në–>ÔÀ>uôç>• ??’*?!É9?&H?° U?Åb`?Nj?r?®Nx?9¸|?³H??ü?MÑ~?É{?æêv?¦?p?çÑg?{´]?öQ?ö¯D?-ü5?añ%?h³?6\?~)Þ>ôµ>FjŒ>IÃC>×hÚ=J¯<œ5ƒ½#¤¾\€n¾W¡¾à8ʾí§ñ¾t© ¿„v¿] .¿Æ=¿šƒK¿¶X¿Ó÷b¿~@l¿ùÍs¿ç”y¿îˆ}¿s¢¿LÞ¿ô;~¿á½z¿»ju¿ðMn¿4re¿NëZ¿ÉN¿ $A¿2¿F½!¿¹6¿“>û¾ø@Ô¾S¯«¾€Ü¾A=.¾&Ø®½o1ë·½Ú®=‰>.>!Ý>ð¯«>H:Ô>$?û>þ6?‡½!?Ë2?C$A?JÉN?zëZ?Yre?Nn?Óju?ò½z?þ;~?OÞ?n¢?âˆ}?Ô”y?àÍs?^@l?­÷b?‰X?hƒK?Ž=? .?Bv?.© ?Z§ñ>¡?Ê>V¡>n>Ú¢>3ƒ=}Ô®¼mkÚ½ÄC¾æjŒ¾¯ôµ¾ß"Þ¾}\¿¬³¿¡ñ%¿gü5¿,°D¿ÍöQ¿¥´]¿ Òg¿Ã?p¿üêv¿¬É{¿UÑ~¿@ü¿­H¿,¸|¿™Nx¿‚r¿,j¿b`¿‚ U¿ë%H¿èÈ9¿T*¿Õ¿N ¿áó群&À¾Ïê–¾M)Y¾šö¾ý.½ªç.=Jñ>³3Y>@è–>($À>~ñç>+ ?÷?T*?¼Ê9?%H?à U?åc`?¡j?`r?FNx?õ·|?àH?Dü?Ñ~?êÉ{?Vëv?×>p?œÒg?P³]?‘÷Q?±D?ˆú5?¦ò%?‚±?¤]?I%Þ>0÷µ>ymŒ>ºC>vÚ=Wÿ®¦á>ͬ«>ˆ>Ô>=<û>ž5?V¿!?™2?Ì%A?OÈN?êZ?bse?sMn?}ku?œ½z?Ì;~?bÞ?…¢?ˆ}?3•y?aÎs?w?l?røb?HX?j„K?­‚=?i.?’w?9§ ?Jªñ>V;Ê>¨Y¡>’…n>™>M@ƒ=4¯¼/^Ú½¾C¾doŒ¾’ñµ¾'Þ¾[¿Q²¿hó%¿;û5¿ª±D¿ÙõQ¿Ð³]¿Óg¿/?p¿šëv¿_É{¿,Ñ~¿Gü¿ÍH¿Í·|¿Ox¿ r¿:j¿jc`¿6 U¿ô&H¿ Ê9¿•*¿+¿R ¿Ùöç¾P"À¾Xæ–¾Ï/Y¾Ví¾°/½ /=¯ê>1-Y>¶ì–>!À>¨õç>Á?¢?*?—É9?Š&H?× U?c`?“j?Õr?×Nx?±·|?ÀH?>ü?<Ñ~?~É{?Çëv?k?p?žÑg?&´]?;öQ?²D?´û5?ßð%?ݲ?¢[?I(Þ>Òòµ>ühŒ>§ÀC>cÚ=˜4¯<÷:ƒ½ø–¾ø‚n¾cX¡¾:ʾ©ñ¾©¦ ¿ w¿Ú .¿:‚=¿„K¿ìX¿#øb¿À@l¿-Îs¿ •y¿xˆ}¿|¢¿GÞ¿à;~¿¾½z¿®ku¿±Mn¿çqe¿õêZ¿´ÈN¿<&A¿2¿Á¼!¿+6¿h=û¾¿?Ô¾®«¾4Û¾œ:.¾ÍÒ®½†S•·à®=j1.>nÞ>3±«>€;Ô>O@û>>4? ¾!?G2?´$A?°ÉN?ÀéZ?¥re?MNn?ku?¾z?š;~?TÞ?e¢?ˈ}?®”y?ãÎs?@l?]÷b?-X?ÿ‚K?˃=?¢.?»u?ž¨ ?,¦ñ>e>Ê>9U¡>||n>3 >¨-ƒ=ó鮼ÃpÚ½~·C¾0lŒ¾ðõµ¾$Þ¾]¿ö°¿#ò%¿àü5¿š°D¿/÷Q¿û²]¿SÒg¿þ?p¿)ëv¿ËÉ{¿Ñ~¿Bü¿ H¿¸|¿oNx¿—r¿æj¿Jb`¿" U¿€%H¿2Ë9¿Ô*¿L¿¼ ¿¯òç¾f%À¾‡é–¾®&Y¾ñó¾[ò.½dò.=óó>°&Y>ˆé–>g%À>°òç>½ ?L?Ô*?2Ë9?€%H?# U?Jb`?çj?˜r?pNx?¸|? H?Bü?Ñ~?ËÉ{?)ëv?þ?p?SÒg?û²]?/÷Q?™°D?àü5?#ò%?ö°?]?$Þ>ïõµ>/lŒ>|·C>¾pÚ=áé®<­-ƒ½5 ¾~|n¾:U¡¾f>ʾ-¦ñ¾ž¨ ¿»u¿¢.¿Ìƒ=¿ƒK¿-X¿^÷b¿@l¿äÎs¿®”y¿Ëˆ}¿e¢¿TÞ¿š;~¿¾z¿ku¿MNn¿¤re¿ÀéZ¿¯ÉN¿´$A¿F2¿ ¾!¿=4¿N@û¾;Ô¾2±«¾mÞ¾h1.¾஽o›•7ÑÒ®=ž:.>5Û>®«>À?Ô>i=û>,6?¼!?2?=&A?´ÈN?öêZ?èqe?²Mn?®ku?¾½z?à;~?GÞ?|¢?xˆ}? •y?-Îs?À@l?#øb?ìX?„K?9‚=?Ú .? w?©¦ ?©ñ>:Ê>bX¡>ö‚n>ö–>ò:ƒ=ª4¯¼…cÚ½©ÀC¾ýhŒ¾Óòµ¾J(Þ¾¢[¿Ý²¿ßð%¿´û5¿²D¿<öQ¿&´]¿žÑg¿k?p¿Çëv¿~É{¿<Ñ~¿>ü¿ÀH¿±·|¿×Nx¿Õr¿“j¿c`¿× U¿‰&H¿—É9¿*¿¡¿À¿§õç¾!À¾µì–¾/-Y¾­ê¾÷ /½È×.=7ý>Ñ/Y>Yæ–>»)À>Úöç>S ?÷?“*? Ê9?v$H?n U?jc`?:j?Zr?Ox?Í·|?H?<ü?,Ñ~?Ê{?‹êv?/?p?Óg?е]?ÙõQ?ª±D? þ5?\ð%?Q²?^?ÞÞ>‘ñµ>coŒ>¹ÍC>+^Ú="¯ºß>íª«>DÔ>zAû>Ì4?w»!?Â2?%%A?¹ÇN?,ìZ?ñre?Mn?Xlu?7¾z?®;~?9Þ?\¢?³ˆ}?l•y?wÍs?Ù?l?èøb?ö X?—‚K?Xƒ=?".?4u?¨ ? ¬ñ>Ð5Ê>óS¡>o‰n>^­>M(ƒ=iÿ®¼HVÚ½ÔÉC¾{mŒ¾·ïµ¾,Þ¾¥]¿‚±¿›ï%¿Yý5¿±D¿HõQ¿Qµ]¿œÒg¿Ø>p¿eìv¿êÉ{¿Ñ~¿9ü¿”H¿õ·|¿?Ox¿r¿¡j¿äc`¿û U¿%H¿¼Ê9¿Q*¿Â¿* ¿žøç¾½À¾?è–¾±3Y¾&¾¡ç.½ý.=¾æ>ò8Y>Ðê–>;À>ûç>O ?Ö?W*?¨Ë9?ë%H?J U?Šd`?,j?‚r?“Ox?,¸|?­H?Kü?òÐ~?¬É{? ìv?a>p? Òg?¥´]?ùQ?+°D?gü5?¬ô%?j°?}\?*Þ>4íµ>åjŒ>ŽÄC>:‹Ú=kÔ®<3ƒ½ “¾ªŽn¾€V¡¾H8ʾi®ñ¾.© ¿Cv¿1.¿?„=¿hƒK¿dX¿‡ùb¿^@l¿àÍs¿¸•y¿ãˆ}¿n¢¿pÞ¿†;~¿ò½z¿öku¿˜Ln¿Xre¿yëZ¿¦ËN¿C$A¿Ë2¿ À!¿°3¿#?û¾ŽAÔ¾e¨«¾ ݾ‡>.¾›ú®½Xyë7*Ø®=-.>>ä>T¯«>±9Ô>ŒEû>º6?G½!?°2?­&A?ÉN?<éZ?úse?ðMn?¼ju?¯¾z?ô;~?LÞ?©¢?`ˆ}?ç”y?1Ïs?ó>l?Ó÷b?µX?-K?Æ=?\ .?«y?¦ ?ì§ñ>9@Ê>…O¡>Z€n>!¤>†Uƒ= J¯¼ÛhÚ½—³C¾øqŒ¾ôµ¾J"Þ¾§_¿i³¿bñ%¿]ù5¿†²D¿žöQ¿|²]¿™Óg¿¦?p¿æêv¿VÊ{¿MÑ~¿?ü¿I¿–·|¿­Nx¿êr¿¯j¿Åb`¿¯ U¿ #H¿ É9¿’*¿L ¿.¿tôç¾='À¾Èã–¾*Y¾â÷¾.B/½r"/=ð>Í"Y>Gï–>#À>êðç>K ?µ?*?ÃÇ9?`'H?– U?Ða`?j?Er?2Nx?Œ¸|?ÚH?Eü?}Ñ~?@É{?lëv?V@p? Ñg?z³]?Á÷Q?­®D?Âú5?åò%?µ?zZ?Þ%Þ>Ë÷µ>gfŒ>b»C>¦xÚ=¤‰¯<­Eƒ½Gœ¾¡xn¾ïZ¡¾“<ʾl¤ñ¾#« ¿x¿è.¿p€=¿Ó„K¿¥X¿èöb¿DAl¿–Îs¿u”y¿5‰}¿Ž¢¿\Þ¿0<~¿y½z¿Lku¿ªNn¿Oqe¿CêZ¿EÊN¿»"A¿2¿Ñ¾!¿^8¿;û¾N=Ô¾³«¾œØ¾R5.¾ý箽ÙËt¸Èê®=´6.>IÙ>º³«>ñ=Ô>­;û>¨8?¿!?^2?õ"A?zÊN?rêZ?wqe?ËNn?fku?‹½z?:<~?_Þ?Š¢?)‰}?b”y?{Îs?"Al?¿öb?uX?œ„K?4€=?¦.?Ôw?ت ?Σñ>î;Ê>EZ¡>Dwn>äš>áBƒ=ç”®¼o{ڽ¼C¾gŒ¾røµ¾&Þ¾ÇZ¿Oµ¿)ó%¿û5¿æ®D¿ô÷Q¿§³]¿2Ñg¿u@p¿„ëv¿PÉ{¿†Ñ~¿Fü¿ÓH¿}¸|¿Nx¿(r¿új¿¥a`¿d U¿('H¿…Ç9¿Ó*¿m¿þ ¿Jðç¾é"À¾›î–¾o!Y¾žî¾Ù/½åÇ.=Eù>î+Y>sä–>ã'À>õç>{?” ?Õ*?^É9?Ø#H?á U?ðb`?Ój?r?ÃNx?¤·|?I??ü?DÑ~?EÊ{?Îêv?‡?p?sÓg?O²]?köQ?M²D?ù5?ñ%? ³?Z_?©!Þ>móµ>LqŒ>7²C>fÚ=í>¯ÎÝ>©«>2BÔ>¿?û>ú3?æÀ!? 2?~$A?#ÇN?¨ëZ?€re?¹Ln?lu?¾z?;~?rÞ?j¢?Öˆ}?¤•y?ÄÍs?;@l?]ùb?4X?2ƒK?„=?ð.?üu?㨠?Ë­ñ>¤7Ê>ÖU¡>Mn>§‘><0ƒ=žß®¼`NÚ½îÅC¾‘kŒ¾Ûíµ¾µ*Þ¾Ê\¿³°¿ðô%¿¦ü5¿e°D¿¶ôQ¿Ò´]¿0Òg¿€>p¿"ìv¿¼É{¿ûÐ~¿Lü¿§H¿¸|¿}Ox¿er¿j¿_d`¿ U¿³%H¿kË9¿*¿Ž¿ ¿dú羕À¾%ê–¾“7Y¾Z径÷.½:í.=Íâ>5Y>êè–>cÀ>>ùç>v ? ?”*?ùÊ9?L%H?½ U?d`?Åj?0r?UOx?¸|?šH?8ü? Ñ~?ÚÉ{?Mìv?¹>p?vÒg?$µ]?õQ?ΰD?ý5?Vï%?9±?X]?Þ+Þ>ïµ>ÎlŒ>uÈC>SÚ=6ô®<+ƒ½¾ÌŠn¾žT¡¾u6ʾ¨¬ñ¾Y¨ ¿zu¿T".¿”ƒ=¿Î‚K¿ÛX¿ùb¿ü?l¿’Ís¿€•y¿¿ˆ}¿a¢¿6Þ¿¤;~¿%¾z¿?lu¿õLn¿Ére¿ýëZ¿„ÇN¿ê$A¿‚2¿2»!¿‚4¿Þ@û¾]CÔ¾Dª«¾ ß¾rB.¾Â®½mŒX7>Ю=”).>Râ>t­«>â7Ô>ÑCû>è5?‚¼!?¹2?&A?„ÈN?¸èZ?‰se?“Mn?sju?|¾z?Ö;~?DÞ?J¢?ƒˆ}?•y?Ïs?U?l?Iøb?> X?ÇK?q‚=?!.?%t?î¦ ?­©ñ> BÊ>gQ¡>7„n>¨>—ƒ=V*¯¼ô`Ú½°¯C¾pŒ¾9òµ¾€ Þ¾Ì^¿š²¿ ð%¿Jþ5¿ã±D¿ öQ¿ü±]¿.Óg¿N?p¿£êv¿(Ê{¿4Ñ~¿=ü¿zH¿¾·|¿ëNx¿=r¿j¿?c`¿< U¿>$H¿ÏÉ9¿P*¿¯¿ ¿:öç¾)À¾®å–¾r.Y¾Óû¾/Ò.½/=ì>ëY>`í–>¸!À>%ïç>r ?é?X*?•Ì9?Á&H? U?Ua`?·j?òr?ôMx?c¸|?ÇH?Hü?ÑÐ~?mÉ{?¯ëv?­@p?xÑg?ù³]?RøQ?P¯D?uû5?¦ó%?R¯?U[?¨'Þ>¦ùµ>PhŒ>I¿C>Ž€Ú=~©®<¾=ƒ½X˜¾Ãtn¾ Y¡¾¿:ʾ«¢ñ¾Nª ¿Rw¿-.¿&…=¿8„K¿X¿röb¿â@l¿HÎs¿=”y¿‰}¿¢¿eÞ¿^;~¿¬½z¿•ku¿On¿Àqe¿ÇêZ¿ÛÊN¿b#A¿Ô2¿–¿!¿”2¿Ì<û¾?Ô¾ñ´«¾ˆÚ¾=9.¾é﮽–šK8Üâ®=É2.>]×>Û±«>"<Ô>ò9û>Ö7?Q¾!?§2?'A?äÉN?îéZ?qe?nNn?ku?X½z?<~?WÞ?—¢?1ˆ}?š”y?ÈÎs?„Al?4÷b?ýX?7…K?߀=?`.?œx?ù¤ ?¥ñ>Â=Ê>(\¡>!{n>Òž>ÐJƒ= u¯¼‡sÚ½Û¸C¾*eŒ¾—öµ¾µ$Þ¾ìY¿€´¿gò%¿Nú5¿b³D¿b÷Q¿'³]¿ÆÐg¿@p¿Aëv¿"É{¿nÑ~¿Cü¿æH¿_·|¿ZNx¿{r¿aj¿b`¿ñ U¿Ç'H¿4È9¿‘*¿9¿ ¿òç¾Á$À¾‚ð–¾Q%Y¾ò¾¼,/½ä7/=Tõ> (Y>â–> &À>Oóç>¢?È?*?¯È9?6(H?T U?ub`?lj?µr?…Nx?|·|?ôH?Aü?\Ñ~?É{?ëv?ß?p?ßÓg?β]?üöQ?ð²D?Ñù5?ßñ%?ï³?SY?s#Þ>Iõµ>5sŒ>¶C>úmÚ=¸^¯l¿ÿÎs¿Â”y¿Iˆ}¿¡¢¿QÞ¿<~¿4½z¿êju¿,Nn¿Cte¿‘éZ¿{ÉN¿'A¿'2¿Ç½!¿B7¿º8û¾Ý:Ô¾Š°«¾}å¾0.¾LÝ®½ðí¸yõ®=ý;.>âÛ>/§«>c@Ô>>û>'3? À!?T2?×#A?DËN?$ëZ?re?\Ln?Çku?нz?s;~?jÞ?w¢?ùˆ}?”y?Îs?@l?Óùb?¼X?̃K?®„=?ª.?Åv?¸© ?p¡ñ>w9Ê>¹W¡>*‘n>••>+8ƒ=Ó¿®¼†Ú½ÂC¾¨iŒ¾ôúµ¾ê(Þ¾ï[¿ä¯¿/ô%¿óû5¿Â¯D¿¸øQ¿R´]¿ÄÑg¿(>p¿Þëv¿ŽÉ{¿âÐ~¿Jü¿ºH¿F¸|¿ÈMx¿¸r¿oj¿Ùd`¿¥ U¿R&H¿Ì9¿Ò*¿Z¿Û ¿æíç¾l À¾ ì–¾v;Y¾Ké¾g/½XÝ.=˜þ>-1Y>ç–>`*À>y÷ç>ž ?>?Õ*?JÊ9?®$H?  U?•c`?^j?Ýr?Ox?Û·|?‡H?;ü?#Ñ~?Ê{?têv??p?âÒg?£µ]?¦õQ?q±D?Íý5?ð%?²?3^?>Þ>ëðµ>·nŒ>[ÌC>f[Ú=¯<*#ƒ½Òª¾î†n¾»R¡¾TCʾèªñ¾„§ ¿²t¿š!.¿é‚=¿3‚K¿ž X¿›øb¿š?l¿EÍs¿G•y¿œˆ}¿S¢¿>Þ¿Â;~¿X¾z¿@ju¿RMn¿:se¿ìZ¿ÈN¿‘%A¿82¿÷»!¿T5¿šBû¾6Ô¾$¬«¾ùà¾\F.¾®Ê®½[g¶SÈ®=2E.>fà>•««>£DÔ>Bû>5?¼»!?2?_%A?îÇN?ZìZ?se?6Mn?+ju?I¾z?¹;~?<Þ?W¢?§ˆ}?X•y?\Ís?·?l?¾øb?Æ X?a‚K?ƒ=?Ñ!.?ít?ç ?m«ñ>-5Ê>JS¡>ˆn>ý«>†%ƒ=‹ ¯¼ YÚ½2ËC¾&nŒ¾]ðµ¾ -Þ¾ò]¿Ë±¿Þï%¿—ý5¿A±D¿{õQ¿}µ]¿ÂÒg¿ö>p¿`êv¿úÉ{¿Ñ~¿:ü¿H¿ç·|¿)Ox¿ör¿}j¿¹c`¿É U¿Ý$H¿~Ê9¿*¿{¿ß ¿ÿ÷ç¾À¾”ç–¾U2Y¾Äÿ¾â.½­/=è>N:Y>zë–>àÀ>¢ûç>š ??š*?æË9?#&H?{ U?µd`?Pj?Ÿr?¶Mx?:¸|?´H?Jü?êÐ~?›É{?òëv?B>p?äÑg?x´]?äøQ?ò¯D?(ü5?hô%?"°?0\?s)Þ>ìµ>:jŒ>0ÃC>uˆÚ=IÉ®<Ï5ƒ½j”¾n¾)W¡¾ì8ʾ¯ñ¾y© ¿‰v¿s.¿{„=¿žƒK¿”X¿°ùb¿€@l¿ûÍs¿”y¿ïˆ}¿s¢¿mÞ¿{;~¿à½z¿Ýku¿xLn¿1re¿KëZ¿qËN¿ $A¿‹2¿[À!¿f3¿ˆ>û¾ì@Ô¾½§«¾tܾ(=.¾Õ÷®½ 8ðÚ®=Þ..>ëä>ü¯«>S:Ô>'Fû>7?Œ½!?ð2?è&A?NÉN?jéZ?!te?Nn?Õju?$½z?ÿ;~?OÞ?¥¢?Tˆ}?Ó”y?Ïs?Ñ>l?ª÷b?†X?Ñ…K?Š=? .?ey?Î¥ ?O§ñ>•?Ê>ÜN¡>ÿ~n>À¢>¿Rƒ=BU¯¼ kÚ½õ´C¾¤rŒ¾»ôµ¾ë"Þ¾ô_¿±³¿¦ñ%¿›ù5¿¿²D¿ÑöQ¿¨²]¿¿Óg¿Å?p¿ýêv¿ôÈ{¿UÑ~¿@ü¿ùH¿ˆ·|¿˜Nx¿Ír¿‹j¿šb`¿~ U¿e(H¿ãÈ9¿O*¿ ¿ã¿Öó羘&À¾ã–¾4)Y¾ö¾Ÿ)$Y>ñï–>4$À>‰ñç>– ?ü?X*?È9?—'H?Ç U?ûa`?Bj?br?GNx?S·|?áH?Dü?uÑ~?/É{?Uëv?7@p?æÐg?M³]?Ž÷Q?“³D?„ú5?¡ò%?¾´?.Z?=%Þ>$÷µ>¼eŒ>ºC>âuÚ=ƒ~¯õÙ>b´«>”>Ô>H<û>ñ8?[¿!?ž2?0#A?®ÊN? êZ?žqe?ëNn?ku?½z?U;~?bÞ?…¢?‰}?N”y?`Îs?ÿ@l?•öb?EX?f„K?Y…=?e.?w?Žª ?1£ñ>K;Ê>œY¡>éun>„™>@ƒ= ®¼4~Ú½ ¾C¾¿gŒ¾ùµ¾ 'Þ¾[¿˜µ¿mó%¿@û5¿¯D¿'øQ¿Ó³]¿XÑg¿“@p¿›ëv¿`É{¿ÊÐ~¿Gü¿ÍH¿o¸|¿Nx¿ r¿Öj¿za`¿3 U¿ð&H¿ÉÌ9¿*¿&¿³ ¿¬ïç¾D"À¾ñí–¾ Y¾=í¾I/½uÍ.=§ú>K-Y>å–>‰(À>³õç>Æ?Ü ?*?›É9?$H? U?c`?÷j?$r?ÙNx?²·|?tH?>ü?;Ñ~?5Ê{?·êv?h?p?NÓg?"²]?8öQ?²D?€þ5?Úð%?ײ?_?!Þ>Æòµ>¡pŒ>Ù°C>NcÚ=Ë3¯<;ƒ½ä¦¾ƒn¾ØP¡¾Aʾ'©ñ¾¯¦ ¿8z¿ß .¿>‚=¿™K¿ X¿&øb¿8?l¿gÏs¿•y¿yˆ}¿F¢¿FÞ¿ß;~¿‹¾z¿‰ju¿¯Mn¿«se¿ßèZ¿°ÈN¿8&A¿ï2¿¼¼!¿&6¿UDû¾l8Ô¾®«¾å⾿*.¾šÒ®½ ’·gÀ®=GA.>zÞ>¶©«>ÔBÔ>Z@û>C4?+Á!?K2?¸$A?XÇN?ÖëZ?¨re?ÙLn?)lu?¾z?›;~?4Þ?e¢?ʈ}?•y?©Ís?@l?4ùb?X?ü‚K?ǃ=?Œ".?¶u?™¨ ?.­ñ>7Ê>-U¡>ò‹n>G>u-ƒ=Àꮼ%QÚ½KÇC¾=lŒ¾‚îµ¾U+Þ¾]¿ü°¿4õ%¿äü5¿ž°D¿éôQ¿þ´]¿VÒg¿ž>p¿9ìv¿ÌÉ{¿Ñ~¿7ü¿ H¿¸|¿gOx¿Hr¿äj¿4d`¿ç U¿|%H¿-Ë9¿Ì*¿G¿· ¿Åùç¾ðÀ¾{é–¾76Y¾ùã¾ôñ.½Êò.=.ä>l6Y>”é–>À>Ýùç> ?Q?Ö*?7Ë9?„%H?î U?:d`?éj?Mr?jOx?¸|?¡H?Mü?Ñ~?ÉÉ{?6ìv?š>p?PÒg?÷´]?áôQ?•°D?Ûü5?*õ%?ñ°? ]?=+Þ>iîµ>#lŒ>ÇC>ºPÚ=é®<à-ƒ½|¾&Œn¾GU¡¾7ʾE­ñ¾¤¨ ¿Áu¿•".¿Ðƒ=¿ƒK¿ X¿:ùb¿@l¿­Ís¿“•y¿Ìˆ}¿f¢¿uÞ¿™;~¿¾z¿%lu¿ÕLn¿¢re¿ÏëZ¿PÇN¿°$A¿B2¿ Á!¿84¿C@û¾»BÔ¾©«¾`Þ¾A.¾ü¿®½èΘ7Ó®=ó*.>ÿâ>®«>„8Ô>lDû>16?Ǽ!?ù2?A&A?¸ÈN?æèZ?±se?´Mn?ju?޾z?á;~?GÞ?E¢?wˆ}? •y?cÏs?3?l? øb? X?‘K?5‚=?Õ .?-z?£¦ ?©ñ>hAÊ>¾P¡>Ý‚n>¯¦>Ѓ=w5¯¼¸cÚ½±C¾ºpŒ¾ßòµ¾ !Þ¾_¿â²¿äð%¿‰þ5¿²D¿?öQ¿)²]¿SÓg¿m?p¿ºêv¿8Ê{¿=Ñ~¿>ü¿sH¿°·|¿ÖNx¿ r¿òj¿c`¿ U¿$H¿’É9¿ *¿Ñ ¿»¿›õç¾p(À¾å–¾-Y¾rú¾ŸÌ.½/=rí>G Y> î–>]"À>Ãïç>¾ ?1?š*?ÒÌ9?ù&H?: U?€a`?Ûj?r? Nx?q¸|?ÎH?Gü?ÉÐ~?]É{?˜ëv?@p?RÑg?̳]?øQ?¯D?7û5?có%?µ? [?'Þ>ùµ>¥gŒ>ì½C>É}Ú=]ž®<…@ƒ½¹™¾vn¾µY¡¾c;ʾH£ñ¾™ª ¿˜w¿n.¿b…=¿n„K¿LX¿œöb¿Al¿dÎs¿Q”y¿‰}¿…¢¿bÞ¿S;~¿š½z¿{ku¿æNn¿˜qe¿™êZ¿§ÊN¿'#A¿”2¿Q¿!¿æ8¿1<û¾{>Ô¾I´«¾ÜÙ¾Þ7.¾#í®½îÞa8¢å®=(4.> Ø>ƒ²«>Å<Ô>:û>8?–¾!?ç2?É'A?ÊN?êZ?.qe?ŽNn?7ku?j½z?'<~?ZÞ?’¢?$ˆ}?†”y?­Îs?aAl? ÷b?ÍX?…K?£€=?.?Vx?c« ?ñ¤ñ>=Ê>[¡>Çyn>r> Hƒ=.€¯¼LvÚ½9ºC¾ÕeŒ¾=÷µ¾U%Þ¾9Z¿É´¿«ò%¿ú5¿›³D¿•÷Q¿T³]¿ìÐg¿;@p¿Xëv¿2É{¿vÑ~¿Dü¿àH¿Q·|¿DNx¿^r¿=j¿ôa`¿À U¿'H¿÷Ç9¿N*¿ò¿‹ ¿qñç¾$À¾×ï–¾õ#Y¾.ñ¾,'/½t=/=¶ö>h)Y>7ã–>±&À>íóç>î? ?Y*?ìÈ9?n(H?… U? b`?j?Òr?›Nx?Š·|?úH?@ü?TÑ~?ñÈ{?úêv?À?p?ºÓg?¢²]?ÉöQ?·²D?’ù5?›ñ%?¦³?é_?Ò"Þ>¢ôµ>ŠrŒ>À´C>6kÚ=–S¯<*Sƒ½õ¢¾3n¾õN¡¾®?ʾg§ñ¾Ù¥ ¿oy¿% .¿“=¿Ù…K¿X¿°÷b¿Ö>l¿Ïs¿Ö”y¿Vˆ}¿¥¢¿OÞ¿ý;~¿"½z¿Ñju¿ Nn¿te¿céZ¿FÉN¿ß&A¿ç2¿‚½!¿ø6¿Fû¾;:Ծ⯫¾Ñ侩..¾†Ú®½—©¸?ø®=]=.>ŽÜ>Ö§«>AÔ>Ÿ>û>q3?fÀ!?”2?$A?yËN?RëZ?7re?|Ln?áku?â½z?};~?mÞ?r¢?íˆ}?”y?÷Ís?{@l?ªùb?X?–ƒK?r„=?i.?v?n© ?î®ñ>Ó8Ê>W¡>Ðn>5”>d5ƒ=õÊ®¼àˆÚ½eÃC¾SjŒ¾¦ìµ¾‹)Þ¾<\¿,°¿rô%¿2ü5¿û¯D¿ëøQ¿´]¿êÑg¿G>p¿öëv¿žÉ{¿ëÐ~¿Jü¿³H¿8¸|¿³Mx¿›r¿Kj¿®d`¿t U¿&H¿ÜË9¿*¿¿ ¿‹ûç¾ÇÀ¾aë–¾:Y¾êç¾×/½çâ.=ùÿ>‰2Y>®ç–>1À>øç>ê ?†?*?ˆÊ9?å$H?Ñ U?Àc`?‚j?úr?,Ox?é·|?ŽH?:ü?Ñ~?÷É{?\êv?ò>p?¼Òg?wµ]?sõQ?8±D?Žý5?Ôï%?À±?æ]?-Þ>Dðµ> nŒ>þÊC>¢XÚ=߯<ñ%ƒ½2¬¾Iˆn¾dS¡¾E5ʾ…«ñ¾Ï§ ¿øt¿Û!.¿%ƒ=¿i‚K¿Î X¿Åøb¿¼?l¿`Ís¿[•y¿¨ˆ}¿X¢¿;Þ¿·;~¿F¾z¿'ju¿2Mn¿se¿SìZ¿æÇN¿W%A¿ø2¿²»!¿ 5¿þAû¾ŠDÔ¾|««¾Là¾ýD.¾èÇ®½.ÞL6Ë®=‘F.>á>=¬«>µ6Ô>±Bû>_5?¼!?B2?š%A?"ÈN?ˆìZ?@se?WMn?Dju?[¾z?Ã;~??Þ?R¢?šˆ}?D•y?@Ís?•?l?•øb?— X?+‚K?à‚=?!.?§t?y§ ?Ъñ>¡R¡>º†n>ª>¿"ƒ=¬¯¼Ñ[Ú½ÌC¾ÑnŒ¾ñµ¾VÞ¾>^¿²¿"ð%¿Öý5¿z±D¿®õQ¿ªµ]¿çÒg¿?p¿wêv¿ Ê{¿$Ñ~¿;ü¿†H¿Ù·|¿Ox¿Ùr¿Yj¿c`¿˜ U¿¦$H¿AÊ9¿Ë*¿3¿“ ¿a÷ç¾G*À¾êæ–¾ù0Y¾cþ¾‚Ü.½</=é>ª;Y>$ì–>… À>þíç>æ ?e?Ü*?#Ì9?Z&H?­ U?àd`?tj?¼r?ÌMx?I¸|?»H?Iü?áÐ~?‹É{?Ûëv?#>p?¾Ñg?L´]?±øQ?¹¯D?éû5?$ô%?Ù¯?ä[?Ò(Þ>Ûúµ>ŽiŒ>ÒÁC>±…Ú=(¾®<–8ƒ½Ê•¾^‘n¾ÓW¡¾9ʾˆ¡ñ¾Ä© ¿Ïv¿´.¿·„=¿ÔƒK¿ÄX¿Ùùb¿¢@l¿Îs¿”y¿ûˆ}¿x¢¿jÞ¿q;~¿Î½z¿Äku¿WLn¿ re¿ëZ¿=ËN¿Î#A¿K2¿À!¿3¿ì=û¾J@Ô¾(¶«¾ÈÛ¾É;.¾õ®½]E"8¶Ý®==0.>—å>£°«>õ:Ô>Ò8û>M7?ѽ!?02?"'A?ƒÉN?˜éZ?Ite?1Nn?îju?6½z? <~?RÞ? ¢?Gˆ}?¿”y?ûÎs?®>l?÷b?VX?›…K?N=?Ú.?y?„¥ ?²¦ñ>ñ>Ê>b]¡>¥}n>`¡>øOƒ=c`¯¼dnÚ½R¶C¾OsŒ¾bõµ¾‹#Þ¾^Y¿ú³¿éñ%¿Úù5¿ø²D¿÷Q¿Õ²]¿åÓg¿ä?p¿ëv¿É{¿^Ñ~¿Aü¿óH¿y·|¿‚Nx¿°r¿gj¿ob`¿M U¿.(H¿¦È9¿ *¿¾¿—¿7óç¾ó%À¾½ñ–¾Ø'Y¾õ¾7/½’-/=Äò>†%Y>›ð–>Ù$À>(òç>?D?›*?=È9?Ï'H?ø U?&b`?fj?r?]Nx?a·|?çH?Cü?lÑ~?É{?=ëv?@p?ÁÐg?!³]?[÷Q?Z³D?Eú5?]ò%?u´?áY?$Þ>~öµ>stŒ>§¸C>sÚ=as¯<;Kƒ½Ÿ¾U{n¾A\¡¾Ú=ʾ¦¥ñ¾¥ ¿§x¿j.¿è€=¿?…K¿X¿:÷b¿‰Al¿ÌÎs¿”y¿2ˆ}¿˜¢¿WÞ¿<~¿U½z¿ku¿iNn¿qe¿çéZ¿ÜÉN¿†'A¿2¿G¾!¿Ë7¿Û9û¾ <Ծ±«¾½æ¾”2.¾q⮽(CH¸Tð®=r9.>¢Ú> µ«>6?Ô>ä<û>Ÿ2? ¿!?Þ2?j#A?ãÊN?ÎêZ?Æqe? On?˜ku?¯½z?_;~?eÞ?€¢?‰}?:”y?DÎs?Ý@l?löb?X?0„K?…=?#.?Gw?Cª ?”¢ñ>§:Ê>óX¡>tn>#˜>S=ƒ=*«®¼ø€Ú½~¿C¾jhŒ¾¿ùµ¾À'Þ¾a[¿]¯¿±ó%¿û5¿X¯D¿ZøQ¿´]¿~Ñg¿²@p¿³ëv¿pÉ{¿ÒÐ~¿Hü¿ÆH¿a¸|¿ñMx¿îr¿²j¿Oa`¿ U¿¹&H¿‹Ì9¿N*¿Þ¿g ¿ ï羟!À¾Gí–¾·Y¾Û뾺/½Ó.=ü>§.Y>Èå–>.)À>Röç> ?º?Z*?ÙÉ9?G$H?D U?Ec`?j?Ar?ïNx?Á·|?{H?=ü?3Ñ~?%Ê{?Ÿêv?J?p?(Óg?ö±]?öQ?Û±D?Aþ5?–ð%?²?Á^?h Þ> òµ>õoŒ>|¯C>‰`Ú=ª(¯<ƒ½D¨¾k„n¾Q¡¾%Bʾĩñ¾ù¦ ¿/t¿ !.¿z‚=¿ÏK¿E X¿Oøb¿Z?l¿ƒÏs¿"•y¿…ˆ}¿J¢¿DÞ¿Õ;~¿y¾z¿oju¿ŽMn¿ƒse¿±èZ¿|ÈN¿þ%A¿¯2¿w¼!¿Ý5¿ºCû¾Ê7Ô¾[­«¾8â¾`).¾ÔÏ®½¸.K·-î=¦B.>&ß>^ª«>vCÔ>ö@û>4?<»!?‹2?ó$A?ŒÇN?ìZ?Ïre?úLn?Blu?(¾z?¥;~?6Þ?`¢?½ˆ}?}•y?ŽÍs?÷?l? ùb?ÔX?Æ‚K?‹ƒ=?J".?pu?N¨ ?‘¬ñ>\6Ê>„T¡>˜Šn>çŽ>®*ƒ=áõ®¼éSÚ½©ÈC¾èlŒ¾(ïµ¾ö+Þ¾c]¿D±¿`ï%¿#ý5¿×°D¿õQ¿+µ]¿{Òg¿½>p¿Qìv¿ÜÉ{¿ Ñ~¿8ü¿™H¿¸|¿QOx¿+r¿Àj¿ d`¿¶ U¿D%H¿ðÊ9¿Š*¿ÿ¿k ¿&ùç¾JÀ¾Ðè–¾Û4Y¾˜â¾eì.½Zø.=å>È7Y>>ê–>­À>|úç> ?™?*?tË9?¼%H? U?ed`? j?jr?€Ox? ¸|?¨H?Lü?ùÐ~?¹É{?ìv?{>p?*Òg?Ë´]?¯ôQ?\°D?œü5?æô%?¨°?¾\?*Þ>Âíµ>xkŒ>¹ÅC>öMÚ=óÝ®<§0ƒ½Ü‘¾n¾ðU¡¾¼7ʾâ­ñ¾î¨ ¿v¿ù.¿ „=¿:ƒK¿;X¿cùb¿@@l¿ÈÍs¿§•y¿Øˆ}¿j¢¿rÞ¿;~¿¾z¿ lu¿´Ln¿zre¿¡ëZ¿ÇN¿u$A¿2¿ÛÀ!¿ï3¿¨?û¾BÔ¾õ¨«¾´Ý¾´?.¾6½®½™WÅ7ÊÕ®=R,.>«ã>Ä®«>&9Ô>Eû>{6? ½!?y2?{&A?íÈN?éZ?Øse?ÔMn?¦ju? ¾z?ë;~?JÞ?­¢?kˆ}?ø”y?HÏs??l?ö÷b?ÞX?[K?ù=?” .?çy?Y¦ ?s¨ñ>Å@Ê>P¡>‚n>N¥> ƒ=™@¯¼}fÚ½k²C¾fqŒ¾†óµ¾Á!Þ¾f_¿+³¿(ñ%¿'ù5¿U²D¿röQ¿V²]¿yÓg¿Œ?p¿Òêv¿HÊ{¿EÑ~¿?ü¿I¿¢·|¿ÀNx¿r¿Îj¿éb`¿Ú U¿Ï#H¿UÉ9¿Ë*¿‰ ¿o¿üôç¾Ë'À¾Zä–¾º+Y¾ù¾Ç.½¯/=Óî>£!Y>µî–>#À>bðç> ?x?Ý*?ŽÇ9?0'H?k U?«a`?ÿj?,r?Nx?¸|?ÔH?Fü?…Ñ~?MÉ{?€ëv?p@p?-Ñg? ³]?ì÷Q?Þ®D?øú5?ó%?Eµ?¼Z?g&Þ>Yøµ>úfŒ>޼C>{Ú=;“®¶Ø>+³«>g=Ô>(;û>i8?Û¾!?'2?Ã"A?MÊN?JêZ?Uqe?¯Nn?Pku?|½z?1<~?]Þ?Ž¢?3‰}?r”y?’Îs??Al?âöb?žX?Ë„K?g€=?Þ.?x?« ?T¤ñ>z<Ê>ÖZ¡>mxn>œ>BEƒ=P‹¯¼yÚ½—»C¾fŒ¾ä÷µ¾ö%Þ¾†Z¿µ¿ïò%¿Ìú5¿µ®D¿È÷Q¿³]¿Ñg¿Z@p¿pëv¿BÉ{¿Ñ~¿Eü¿ÙH¿‰¸|¿.Nx¿Ar¿j¿Éa`¿Ž U¿X'H¿ºÇ9¿ *¿ª¿? ¿Òðç¾v#À¾-ï–¾™"Y¾Íワ!/½C/=ø>Ä*Y>áã–>V'À>Œôç>:?W ?œ*?*É9?¨#H?· U?Ëb`?´j?ïr?±Nx?˜·|?I??ü?KÑ~?SÊ{?âêv?¡?p?”Óg?u²]?–öQ?~²D?Sù5?Xñ%?^³?œ_?2"Þ>üóµ>ßqŒ>b³C>qhÚ=uH¯<ñUƒ½V¤¾Ž€n¾žO¡¾Q@ʾ¨ñ¾$¦ ¿¶y¿f .¿Ï=¿5K¿½X¿Ù÷b¿ø>l¿5Ïs¿ê”y¿bˆ}¿ª¢¿LÞ¿ó;~¿­¾z¿¸ju¿ëMn¿ôse¿5éZ¿ÉN¿¤&A¿§2¿<½!¿¯6¿uEû¾™9Ô¾;¯«¾%ä¾J-.¾À×®½~Êä·û®=¼>.>:Ý>~¨«>§AÔ>:?û>»3?«À!?Ô2?L$A?öÆN?€ëZ?^re?Ln?úku?ô½z?‡;~?pÞ?n¢?áˆ}?µ•y?ÜÍs?Y@l?ùb?]X?`ƒK?6„=?(.?8v?#© ?Q®ñ>08Ê>gV¡>vŽn>Õ’>2ƒ=Ö®¼¤‹Ú½ÂÄC¾ÿjŒ¾Míµ¾+*Þ¾ˆ\¿u°¿¶ô%¿pü5¿4°D¿‹ôQ¿«´]¿Òg¿e>p¿ ìv¿®É{¿óÐ~¿Kü¿¬H¿*¸|¿Ox¿~r¿'j¿ƒd`¿C U¿ã%H¿ŸË9¿M*¿Ë¿C ¿ìúç¾"À¾¶ê–¾¾8Y¾‰æ¾Gü.½wè.=[>å3Y>Xè–>ÖÀ>¶øç>6 ?Í?[*?ÅÊ9?%H?“ U?ëc`?¦j?r?BOx?÷·|?•H?9ü?Ñ~?çÉ{?aìv?Ó>p?–Òg?Jµ]?@õQ?ÿ°D?Oý5?ï%?w±?™]?g,Þ>žïµ>amŒ> ÉC>ÝUÚ=½ý®<¸(ƒ½’­¾£‰n¾ T¡¾é5ʾ"¬ñ¾¨ ¿>u¿".¿aƒ=¿Ÿ‚K¿³X¿îøb¿Þ?l¿{Ís¿o•y¿µˆ}¿]¢¿9Þ¿­;~¿4¾z¿Tlu¿Mn¿ëre¿%ìZ¿±ÇN¿%A¿¸2¿m»!¿Á4¿cAû¾èCÔ¾Ôª«¾ ß¾žC.¾"Å®½îH 7ßÍ®=ðG.>¿á>嬫>W7Ô>LCû>©5?G¼!?‚2?Ô%A?WÈN?‘èZ?gse?wMn?]ju?m¾z?Î;~?BÞ?N¢?Žˆ}?0•y?–Ïs?r?l?løb?g X?õK?¤‚=?O!.?at?.§ ?3ªñ>˜BÊ>øQ¡>`…n>=©>øƒ=Î ¯¼•^Ú½îÍC¾|oŒ¾ªñµ¾öÞ¾‹^¿\²¿fð%¿þ5¿³±D¿áõQ¿Öµ]¿ Óg¿4?p¿êv¿Ê{¿-Ñ~¿<ü¿€H¿Ë·|¿þNx¿Vr¿5j¿dc`¿g U¿n$H¿Ê9¿‰*¿ì¿G ¿Âöç¾¢)À¾@æ–¾/Y¾ý¾òÖ.½Ì /=âê>=Y>Ïì–>*!À>îç>2 ?¬?*?`Ì9?’&H?Þ U? e`?˜j?Ùr?áMx?W¸|?ÁH?Hü?ØÐ~?{É{?Ãëv?È@p?™Ñg?´]?~øQ?€¯D?«û5?áó%?‘¯?—[?2(Þ>5úµ>ãhŒ>uÀC>ì‚Ú=³®<];ƒ½+—¾¹’n¾|X¡¾3:ʾ%¢ñ¾ª ¿w¿õ.¿ó„=¿ „K¿óX¿úb¿Å@l¿1Îs¿,”y¿‰}¿}¢¿gÞ¿f;~¿¼½z¿ªku¿#On¿âqe¿ïêZ¿ËN¿”#A¿ 2¿Ñ¿!¿Ó2¿Q=û¾¨?Ô¾€µ«¾Û¾j:.¾Iò®½¶‰88|à®=œ1.>Cæ>K±«>˜;Ô>m9û>—7?¾!?p2?]'A?·ÉN?ÆéZ?pte?RNn?ku?H½z?<~?UÞ?›¢?;ˆ}?«”y?àÎs?¡Al?W÷b?&X?e…K?=?˜.?Øx?9¥ ?¦ñ>N>Ê>¹\¡>J|n> >1Mƒ=…k¯¼)qÚ½°·C¾úsŒ¾öµ¾,$Þ¾«Y¿B´¿-ò%¿ú5¿1³D¿7÷Q¿³]¿ Ôg¿@p¿,ëv¿É{¿fÑ~¿Bü¿ìH¿k·|¿lNx¿“r¿€j¿Db`¿ U¿ö'H¿iÈ9¿Ê*¿v¿K¿˜òç¾N%À¾ñ–¾{&Y¾¾ó¾1/½!3/=&ô>â&Y>Eñ–>%À>Çòç>b?‹?Þ*?{È9?(H?* U?Pb`?Šj?œr?sNx?o·|?îH?Bü?dÑ~?É{?&ëv?ù?p?Ôg?ô²]?(÷Q?!³D?ú5?ò%?-´?”Y?ü#Þ>×õµ>ÈsŒ>I·C>YpÚ=@h¯<Nƒ½g ¾°|n¾ê\¡¾~>ʾC¦ñ¾O¥ ¿íx¿«.¿$=¿u…K¿4X¿d÷b¿«Al¿çÎs¿±”y¿?ˆ}¿¢¿TÞ¿<~¿C½z¿ku¿HNn¿ete¿¹éZ¿¨ÉN¿K'A¿]2¿¾!¿7¿?9û¾h;Ô¾±«¾æ¾51.¾«ß®½Ðþ1¸ó®=Ñ:.>NÛ>²µ«>Ø?Ô>=û>è2?å¿!?2?¥#A?ËN?üêZ?íqe?,On?²ku?Á½z?j;~?hÞ?{¢?‰}?&”y?)Îs?»@l?öùb?åX?úƒK?á„=?â.?w?ø© ?÷¡ñ>:Ê>JX¡>S’n>Ö>Œ:ƒ=K¶®¼¼ƒÚ½ÛÀC¾iŒ¾fúµ¾a(Þ¾­[¿¦¯¿ôó%¿½û5¿‘¯D¿øQ¿,´]¿¤Ñg¿Ñ@p¿Êëv¿€É{¿ÛÐ~¿Iü¿¿H¿S¸|¿ÛMx¿Ñr¿Žj¿þd`¿Ð U¿&H¿NÌ9¿ *¿—¿ ¿nîç¾ú À¾ì–¾ 0Y>ræ–>Ó)À>ñöç>^ ??œ*?Ê9?~$H?u U?pc`??j?^r?Ox?Ï·|?H?<ü?*Ñ~?Ê{?ˆêv?+?p?Óg?ɵ]?ÒõQ?¢±D?þ5?Rð%?F²?t^?ÇÞ>yñµ>JoŒ>‡ÍC>Å]Ú=ˆ¯<É ƒ½¤©¾Æ…n¾*R¡¾ÈBʾaªñ¾D§ ¿vt¿b!.¿¶‚=¿‚K¿u X¿xøb¿|?l¿žÏs¿6•y¿’ˆ}¿O¢¿AÞ¿Ê;~¿h¾z¿Vju¿nMn¿\se¿©ìZ¿GÈN¿Ã%A¿o2¿2¼!¿“5¿Cû¾(7Ô¾³¬«¾Œá¾‰G.¾Í®½¬:ä¶óÅ®=D.>Óß>««>DÔ>‘Aû>Ö4?»!?Ë2?-%A?ÁÇN?2ìZ?÷re?Mn?\lu?9¾z?°;~?9Þ?[¢?±ˆ}?i•y?sÍs?Ô?l?âøb?ï X?‚K?Oƒ=? ".?*u?¨ ?ô«ñ>¹5Ê>ÛS¡>=‰n>+­>ç'ƒ=¯¼®VÚ½ÊC¾“mŒ¾Ïïµ¾–,Þ¾°]¿±¿¤ï%¿bý5¿±D¿OõQ¿Wµ]¿¡Òg¿Ü>p¿hìv¿ìÉ{¿Ñ~¿9ü¿“H¿ó·|¿$9Y>èê–>SÀ>ûç>Y ?à?a*?±Ë9?ó%H?Q U?d`?1j?‡r?–Ox?.¸|?®H?Kü?ñÐ~?©É{?ìv?\>p?Òg?ž´]?ùQ?#°D?^ü5?¢ô%?`°?r\?ü)Þ>íµ>ÌjŒ>[ÄC>ÔŠÚ=ÑÒ®.¾5ú®½Jàñ7Ø®=±-.>Wä>l¯«>É9Ô>£Eû>Ä6?Q½!?¹2?¶&A?!ÉN?CéZ?te?õMn?¿ju?²¾z?ö;~?MÞ?©¢?^ˆ}?ä”y?-Ïs?î>l?Í÷b?¯X?ÿ…K?½=?S .?¡y?¦ ?Ö§ñ>!@Ê>lO¡>(€n>î£> Uƒ=ºK¯¼AiڽɳC¾rŒ¾,ôµ¾a"Þ¾²_¿s³¿lñ%¿fù5¿Ž²D¿¥öQ¿‚²]¿ŸÓg¿ª?p¿éêv¿XÊ{¿NÑ~¿@ü¿ÿH¿”·|¿ªNx¿ær¿ªj¿¾b`¿¨ U¿•(H¿É9¿ˆ*¿B ¿$¿]ôç¾&'À¾¯ã–¾^*Y¾¯÷¾bA/½?#/=4ð>ÿ"Y>_ï–>§#À>ñç>U ?¿?*?ÌÇ9?h'H? U?Öa`?#j?Ir?5Nx?ޏ|?ÛH?Eü?|Ñ~?=É{?iëv?Q@p?Ñg?s³]?¹÷Q?óD?¹ú5?Ûò%?ü´?oZ?Ç%Þ>³÷µ>NfŒ>0»C>@xÚ= ˆ¯<Fƒ½yœ¾Òxn¾[¡¾ª<ʾƒ¤ñ¾.« ¿$x¿ñ.¿y€=¿Ú„K¿¬X¿îöb¿IAl¿šÎs¿x”y¿7‰}¿¢¿\Þ¿.<~¿v½z¿Iku¿¥Nn¿Iqe¿=êZ¿>ÊN¿ò'A¿2¿Ç¾!¿S8¿û:û¾7=Ô¾ù²«¾ƒØ¾ 5.¾—箽a˜q¸.ë®=æ6.>bÙ>Ò³«> >Ô>Ä;û>²8? ¿!?g2?þ"A?‚ÊN?yêZ?}qe?ÏNn?iku?޽z?<<~?`Þ?‰¢?'‰}?_”y?wÎs?Al?¹öb?nX?•„K?Œ…=?œ.?Êw?ͪ ?·£ñ>×;Ê>-Z¡>wn>±š>{Bƒ=€–®¼Õ{Ú½õ¼C¾,gŒ¾Šøµ¾–&Þ¾ÒZ¿Zµ¿3ó%¿ û5¿î®D¿û÷Q¿­³]¿8Ñg¿y@p¿‡ëv¿RÉ{¿‡Ñ~¿Fü¿ÒH¿{¸|¿Nx¿$r¿õj¿Ÿa`¿] U¿ 'H¿|Ç9¿É*¿c¿ó ¿3ðç¾Ñ"À¾ƒî–¾=!Y¾kî¾ /½²È.=xù> ,Y>Œä–>û'À>+õç>…?ž ?Þ*?gÉ9?à#H?è U?öb`?Øj? r?ÆNx?¦·|?I?>ü?CÑ~?CÊ{?Ëêv?ƒ?p?nÓg?H²]?cöQ?E²D?ù5?ñ%?³?O_?‘!Þ>Uóµ>3qŒ>²C>­eÚ=S=¯<Úƒ½¶¥¾èn¾GP¡¾õ@ʾ¡¨ñ¾o¦ ¿üy¿§ .¿ ‚=¿kK¿ìX¿øb¿?l¿PÏs¿ý”y¿nˆ}¿¯¢¿IÞ¿è;~¿›¾z¿žju¿ËMn¿Íse¿éZ¿ÝÈN¿j&A¿g2¿÷¼!¿e6¿ÚDû¾÷8Ô¾“®«¾xã¾ë+.¾úÔ®½ÍA¸·¾®=@.>æÝ>&©«>IBÔ>Õ?û>4?ðÀ!?2?†$A?+ÇN?®ëZ?†re?¾Ln?lu?¾z?’;~?sÞ?i¢?Ôˆ}?¡•y?ÀÍs?6@l?Wùb?-X?*ƒK?úƒ=?æ.?òu?ب ?´­ñ>Œ7Ê>¾U¡>n>u‘>Ö/ƒ=8ᮼÆNÚ½ ÆC¾ªkŒ¾óíµ¾Ì*Þ¾Õ\¿½°¿úô%¿¯ü5¿m°D¿½ôQ¿Ø´]¿5Òg¿„>p¿%ìv¿¾É{¿üÐ~¿Lü¿¦H¿¸|¿zOx¿ar¿j¿Yd`¿ U¿«%H¿bË9¿ *¿„¿ø ¿Múç¾}À¾ ê–¾a7Y¾'å¾·ö.½î.=ÿâ>A5Y>é–>{À>Uùç> ??*?Ë9?T%H?Ä U?d`?Êj?4r?XOx?¸|?›H?8ü? Ñ~?×É{?Jìv?´>p?pÒg?µ]? õQ?ưD?ý5?Mï%?/±?M]?Ç+Þ>÷îµ>µlŒ>BÈC>SÚ=œò®<+ƒ½N¾þŠn¾¶T¡¾Œ6ʾ¿¬ñ¾d¨ ¿„u¿]".¿ƒ=¿Õ‚K¿âX¿ùb¿@l¿–Ís¿‚•y¿Áˆ}¿a¢¿6Þ¿¢;~¿"¾z¿;lu¿ðLn¿Ãre¿÷ëZ¿}ÇN¿â$A¿x2¿(»!¿w4¿È@û¾FCÔ¾,ª«¾ôÞ¾?B.¾\®½PZe7¥Ð®=Ç).>kâ>­«>ú7Ô>çCû>ò5?Œ¼!?Â2?&A?‹ÈN?¿èZ?se?˜Mn?wju?¾z?Ø;~?DÞ?I¢?‚ˆ}?•y?{Ïs?P?l?Cøb?7 X?¿K?h‚=? !.?t?㦠?–©ñ>õAÊ>OQ¡>„n>ܧ>1ƒ=ï+¯¼ZaÚ½â¯C¾(pŒ¾Qòµ¾— Þ¾Ø^¿¤²¿ªð%¿Sþ5¿ì±D¿öQ¿²]¿3Óg¿S?p¿¦êv¿*Ê{¿5Ñ~¿=ü¿yH¿¼·|¿èNx¿9r¿j¿9c`¿5 U¿6$H¿ÇÉ9¿F*¿¥¿ü¿#öç¾ý(À¾–å–¾@.Y¾ û¾bÑ.½\/=Cì>Y>yí–>Ï!À>;ïç>} ?ó?a*?Ì9?É&H? U?\a`?¼j?ör?÷Mx?e¸|?ÈH?Gü?ÐÐ~?kÉ{?¬ëv?©@p?sÑg?ó³]?KøQ?G¯D?lû5?ó%?H¯?J[?‘'Þ>Žùµ>8hŒ>¿C>(€Ú=å§®<$>ƒ½‹˜¾õtn¾%Y¡¾×:ʾ¢ñ¾Yª ¿\w¿6.¿/…=¿@„K¿#X¿xöb¿ç@l¿LÎs¿@”y¿‰}¿¢¿dÞ¿\;~¿ª½z¿‘ku¿On¿ºqe¿ÁêZ¿ÔÊN¿Y#A¿Ë2¿Œ¿!¿‰2¿¶<û¾?Ô¾Ù´«¾oÚ¾ 9.¾ƒï®½ÎN8Bã®=û2.>v×>ó±«>:<Ô>:û>à7?[¾!?°2?—'A?ìÉN?õéZ? qe?rNn?!ku?Z½z?<~?XÞ?–¢?/ˆ}?—”y?ÄÎs?Al?.÷b?öX?/…K?Ö€=?W.?’x?î¤ ?x¥ñ>ª=Ê>\¡>ðzn> ž>jJƒ=§v¯¼ísÚ½¹C¾CeŒ¾¯öµ¾Ì$Þ¾÷Y¿‹´¿qò%¿Wú5¿j³D¿j÷Q¿.³]¿ÌÐg¿!@p¿Dëv¿$É{¿oÑ~¿Cü¿åH¿]·|¿WNx¿vr¿\j¿b`¿ê U¿¿'H¿+È9¿‡*¿/¿¿ùñ義$À¾ið–¾%Y¾]ò¾ï+/½±8/=‡õ>>(Y>¥â–>$&À>eóç>­?Ó? *?¸È9?>(H?[ U?{b`?qj?¹r?ˆNx?~·|?õH?Aü?[Ñ~?ÿÈ{?ëv?Û?p?ÚÓg?Ȳ]?õöQ?è²D?Èù5?Õñ%?ä³?HY?\#Þ>1õµ>sŒ>ìµC>”mÚ=]¯<ÉPƒ½È¡¾ ~n¾dN¡¾!?ʾà¦ñ¾š¥ ¿3y¿í.¿`=¿«…K¿dX¿÷b¿¸>l¿Ïs¿Å”y¿Kˆ}¿¡¢¿QÞ¿<~¿1½z¿çju¿(Nn¿=te¿‹éZ¿sÉN¿'A¿2¿½½!¿77¿¤8û¾Æ:Ô¾r°«¾då¾Ö/.¾æÜ®½wº¸ßõ®=0<.>úÛ>G§«>z@Ô>>û>23?*À!?^2?ß#A?LËN?+ëZ?re?aLn?Ëku?Ó½z?t;~?kÞ?v¢?øˆ}?”y?Îs?˜@l?Íùb?µX?ăK?¥„=?¡.?»v?®© ?Z¡ñ>`9Ê>¡W¡>ùn>c•>Å7ƒ=mÁ®¼†Ú½9ÂC¾ÁiŒ¾ìµ¾)Þ¾ú[¿î¯¿8ô%¿üû5¿Ê¯D¿ÀøQ¿Y´]¿ÉÑg¿,>p¿âëv¿É{¿äÐ~¿Jü¿¹H¿D¸|¿ÅMx¿´r¿jj¿Ód`¿ž U¿J&H¿Ì9¿É*¿P¿Ð ¿Ïíç¾U À¾òë–¾D;Y¾é¾š/½$Þ.=Ëþ>_1Y>ç–>£À>÷ç>© ?H?ß*?SÊ9?¶$H?§ U?›c`?cj?ár?Ox?Ý·|?ˆH?;ü?"Ñ~?Ê{?pêv? ?p?ÜÒg?µ]?ŸõQ?i±D?Äý5?ð%?þ±?(^?'Þ>Óðµ>ŸnŒ>)ÌC>[Ú=g¯<#ƒ½«¾ ‡n¾ÓR¡¾¹4ʾþªñ¾§ ¿¼t¿£!.¿ò‚=¿;‚K¿¥ X¿¡øb¿Ÿ?l¿HÍs¿J•y¿žˆ}¿T¢¿>Þ¿À;~¿V¾z¿=ju¿MMn¿4se¿zìZ¿ÈN¿‰%A¿/2¿í»!¿I5¿ƒBû¾†6Ô¾ ¬«¾àà¾*F.¾HÊ®½Ÿ_ȵ¹È®=dE.>à>­««>+6Ô>,Bû> 5?Æ»!? 2?h%A?õÇN?`ìZ?se?;Mn?.ju?K¾z?º;~?<Þ?W¢?¥ˆ}?U•y?XÍs?²?l?¸øb?À X?Z‚K?ƒ=?È!.?ãt?¹§ ?W«ñ>5Ê>2S¡>ã‡n>Ë«> %ƒ=$ ¯¼rYÚ½dËC¾>nŒ¾uðµ¾7-Þ¾ý]¿Õ±¿èï%¿ ý5¿I±D¿‚õQ¿„µ]¿ÇÒg¿û>p¿cêv¿üÉ{¿Ñ~¿:ü¿ŒH¿å·|¿&Ox¿ñr¿xj¿³c`¿Â U¿Õ$H¿vÊ9¿*¿q¿Ô ¿é÷ç¾À¾|ç–¾#2Y¾’ÿ¾Eá.½y/=Rè>€:Y>“ë–>øÀ>¹ûç>¥ ?(?£*?îË9?+&H?ƒ U?»d`?Uj?¤r?¹Mx?<¸|?µH?Jü?èÐ~?™É{?ïëv?>>p?ßÑg?r´]?ÜøQ?ê¯D?ü5?^ô%?°?%\?\)Þ>uìµ>!jŒ>þÂC>ˆÚ=°Ç®<56ƒ½”¾6n¾BW¡¾9ʾ¯ñ¾„© ¿“v¿|.¿„„=¿¦ƒK¿›X¿¶ùb¿…@l¿ÿÍs¿”y¿ñˆ}¿t¢¿lÞ¿z;~¿Ý½z¿Ùku¿sLn¿+re¿EëZ¿jËN¿$A¿‚2¿QÀ!¿[3¿q>û¾Õ@Ô¾¥§«¾[ܾõ<.¾o÷®½}48VÛ®=/.>å>°«>k:Ô>>Fû>7?–½!?ù2?ð&A?VÉN?qéZ?'te?Nn?Ùju?'½z?<~?OÞ?¤¢?Rˆ}?Дy?Ïs?Ì>l?¤÷b?X?É…K?=? .?[y?Ä¥ ?9§ñ>~?Ê>ÃN¡>Í~n>Ž¢>YRƒ=ÜV¯¼lÚ½'µC¾¼rŒ¾Óôµ¾#Þ¾ÿ_¿¼³¿¯ñ%¿¤ù5¿Ç²D¿ØöQ¿¯²]¿ÅÓg¿É?p¿ëv¿öÈ{¿VÑ~¿Aü¿øH¿†·|¿•Nx¿Ér¿†j¿“b`¿w U¿](H¿ÚÈ9¿F*¿û¿Ø¿¿óç¾€&À¾ã–¾)Y¾Nö¾Ò;/½Î(/=–ñ>[$Y> ð–>L$À> ñç>¡ ??b*? È9?Ÿ'H?Î U?b`?Gj?fr?JNx?U·|?âH?Dü?tÑ~?-É{?Qëv?2@p?áÐg?G³]?†÷Q?гD?{ú5?—ò%?´´?#Z?&%Þ> ÷µ>£eŒ>Ò¹C>|uÚ=é|¯<ÚHƒ½Ù¾-zn¾±[¡¾N=ʾ ¥ñ¾y« ¿kx¿2.¿µ€=¿…K¿ÛX¿÷b¿kAl¿µÎs¿Œ”y¿(ˆ}¿”¢¿YÞ¿$<~¿d½z¿/ku¿…Nn¿"qe¿êZ¿ ÊN¿¸'A¿Ô2¿‚¾!¿ 8¿`:û¾•<Ô¾R²«¾××¾Á3.¾Ñ䮽T[¸ôí®=E8.>Ú>z´«>«>Ô>_<û>ü8?e¿!?§2?8#A?¶ÊN?§êZ?¤qe?ðNn?ƒku? ½z?V;~?cÞ?„¢?‰}?K”y?\Îs?ú@l?öb?>X?_„K?P…=?[.?ƒw?ƒª ?£ñ>3;Ê>„Y¡>¸un>Q™>´?ƒ=¢¡®¼™~Ú½R¾C¾×gŒ¾1ùµ¾7'Þ¾[¿¢µ¿wó%¿Iû5¿'¯D¿.øQ¿Ú³]¿]Ñg¿˜@p¿Ÿëv¿bÉ{¿ËÐ~¿Gü¿ÌH¿m¸|¿Nx¿r¿Ñj¿ta`¿+ U¿è&H¿ÀÌ9¿‡*¿¿¨ ¿•ïç¾,"À¾Ùí–¾áY¾ í¾}/½BÎ.=Úú>}-Y>6å–> (À>Êõç>Ñ?æ ?!*?¤É9?$H? U?!c`?üj?(r?ÜNx?´·|?uH?=ü?:Ñ~?3Ê{?³êv?d?p?HÓg?²]?0öQ? ²D?wþ5?Ðð%?Ͳ?_?ñ Þ>¯òµ>ˆpŒ>§°C>èbÚ=22¯<¡ƒ½§¾Cƒn¾ðP¡¾™Aʾ>©ñ¾¹¦ ¿Bz¿é .¿G‚=¿¡K¿ X¿,øb¿=?l¿kÏs¿•y¿{ˆ}¿F¢¿FÞ¿Þ;~¿‰¾z¿…ju¿ªMn¿¥se¿ÙèZ¿©ÈN¿0&A¿æ2¿²¼!¿6¿?Dû¾U8Ծ뭫¾Ì⾌*.¾4Ò®½¹‹·ÍÀ®=zA.>“Þ>Ω«>ëBÔ>q@û>N4?5Á!?T2?Á$A?_ÇN?ÝëZ?­re?ÞLn?-lu?¾z?œ;~?4Þ?d¢?Ȉ}?Ž•y?¥Ís?@l?.ùb?ýX?ô‚K?¾ƒ=?‚".?¬u?ލ ?­ñ>è6Ê>U¡>Á‹n>>-ƒ=Y쮼ŠQÚ½~ÇC¾UlŒ¾šîµ¾l+Þ¾"]¿±¿>õ%¿íü5¿¦°D¿ðôQ¿µ]¿[Òg¿£>p¿<ìv¿ÎÉ{¿Ñ~¿7ü¿ŸH¿¸|¿dOx¿Dr¿ßj¿.d`¿à U¿t%H¿%Ë9¿Ã*¿<¿¬ ¿®ùç¾ØÀ¾bé–¾6Y¾Æã¾(ñ.½—ó.=aä>ž6Y>­é–> À>ôùç>Í ?\?à*??Ë9?Œ%H?ö U?@d`?îj?Qr?mOx?¸|?¢H?Mü?Ñ~?ÇÉ{?2ìv?•>p?KÒg?ñ´]?ÚôQ?°D?Òü5? õ%?æ°?]?&+Þ>Qîµ> lŒ>åÆC>TPÚ=zç®ã>4®«>œ8Ô>‚Dû><6?Ѽ!?2?I&A?ÀÈN?íèZ?¶se?¹Mn?ju?‘¾z?â;~?GÞ?²¢?uˆ}? •y?_Ïs?.?l?øb? X?‰K?,‚=?Ì .?#z?™¦ ?ù¨ñ>QAÊ>¦P¡>«‚n>|¦>jƒ=7¯¼dÚ½@±C¾ÓpŒ¾÷òµ¾7!Þ¾$_¿í²¿îð%¿’þ5¿%²D¿GöQ¿/²]¿YÓg¿q?p¿¾êv¿:Ê{¿>Ñ~¿>ü¿ I¿®·|¿ÒNx¿r¿íj¿c`¿ U¿ÿ#H¿‰É9¿*¿Ç ¿°¿„õç¾X(À¾ëä–¾ä,Y¾?ú¾ÒË.½ì/=¥í>y Y>#î–>t"À>Úïç>É ?;?¤*?ÛÌ9?'H?A U?†a`?àj?r? Nx?s¸|?ÏH?Gü?ŒÑ~?[É{?”ëv?Š@p?MÑg?Ƴ]?øQ?¯D?.û5?Yó%?ƒµ?þZ?ñ&Þ>èøµ>ŒgŒ>¹½C>c}Ú=Ü®<ë@ƒ½ë™¾Ovn¾ÎY¡¾{;ʾ_£ñ¾¤ª ¿¢w¿x.¿j…=¿v„K¿SX¿¡öb¿ Al¿hÎs¿T”y¿ ‰}¿†¢¿aÞ¿B<~¿˜½z¿xku¿âNn¿“qe¿’êZ¿ŸÊN¿#A¿‹2¿G¿!¿Ü8¿<û¾d>Ô¾1´«¾ÃÙ¾¬7.¾½ì®½ge8æ®=Z4.>"Ø>›²«>Ü<Ô>£:û>*8? ¾!?ð2?Ò'A? ÊN?#êZ?3qe?“Nn?:ku?l½z?)<~?ZÞ?’¢?>‰}?ƒ”y?©Îs?\Al?÷b?ÆX?ù„K?š€=?.?Lx?X« ?Û¤ñ>=Ê>g[¡>•yn>?>£Gƒ=ȯ¼²vÚ½kºC¾îeŒ¾U÷µ¾m%Þ¾DZ¿Ó´¿µò%¿–ú5¿£³D¿÷Q¿Z³]¿òÐg¿@@p¿[ëv¿4É{¿wÑ~¿Dü¿ßH¿O·|¿ANx¿Yr¿8j¿îa`¿¸ U¿‡'H¿îÇ9¿E*¿ç¿€ ¿Zñç¾$À¾¿ï–¾Ã#Y¾ûð¾_&/½A>/=èö>š)Y>Pã–>É&À>ôç>ù? ?c*?õÈ9?v(H? U?¦b`?•j?Ör?žNx?Œ·|?ûH?@ü?SÑ~?ïÈ{?öêv?¼?p?´Óg?›²]?ÂöQ?®²D?‰ù5?’ñ%?œ³?Þ_?»"Þ>Šôµ>qrŒ>Ž´C>ÐjÚ=ýQ¯l¿Ïs¿Ù”y¿Wˆ}¿¦¢¿NÞ¿ü;~¿½z¿Íju¿Nn¿te¿]éZ¿?ÉN¿×&A¿Ý2¿x½!¿î6¿úEû¾$:Ծʯ«¾¸ä¾w..¾ Ú®½v¸¥ø®==.>§Ü>ï§«>AÔ>µ>û>|3?oÀ!?ž2?$A?ËN?YëZ?¼8Ê>øV¡>žn>”>þ4ƒ=ŽÌ®¼E‰Ú½—ÃC¾ljŒ¾¾ìµ¾¢)Þ¾G\¿7°¿|ô%¿;ü5¿°D¿óøQ¿…´]¿ïÑg¿K>p¿ùëv¿ É{¿ìÐ~¿Kü¿²H¿6¸|¿°Mx¿—r¿Fj¿¨d`¿m U¿&H¿ÔË9¿†*¿¿„ ¿tû羯À¾Hë–¾è9Y¾·ç¾ /½´ã.=,>»2Y>Æç–>HÀ>.øç>õ ??"*?Ê9?í$H?Ø U?Æc`?‡j?þr?0Ox?ë·|?H?:ü?Ñ~?õÉ{?Yêv?í>p?¶Òg?pµ]?lõQ?0±D?…ý5?Êï%?µ±?Û]?ð,Þ>,ðµ>ómŒ>ËÊC>+á>U¬«>Í6Ô>ÇBû>j5? ¼!?K2?¢%A?*ÈN?ìZ?Fse?\Mn?Hju?]¾z?Å;~??Þ?R¢?˜ˆ}?A•y?=Ís??l?øb? X?#‚K?ׂ=?†!.?t?n§ ?ºªñ>$CÊ>‰R¡>‰†n>jª>Y"ƒ=F¯¼7\Ú½ÂÌC¾ênŒ¾ñµ¾mÞ¾I^¿²¿,ð%¿ßý5¿‚±D¿µõQ¿°µ]¿íÒg¿?p¿zêv¿ Ê{¿&Ñ~¿;ü¿…H¿×·|¿Ox¿Ôr¿Tj¿ˆc`¿‘ U¿ž$H¿8Ê9¿Â*¿)¿ˆ ¿J÷ç¾0*À¾Òæ–¾Ç0Y¾0þ¾µÛ.½ /=³é>Ü;Y>=ì–> À>îç>ñ ?o?æ*?,Ì9?b&H?´ U?æd`?yj?Ár?ÏMx?K¸|?¼H?Iü?àÐ~?‰É{?×ëv?>p?¹Ñg?E´]?©øQ?±¯D?àû5?ô%?ϯ?Ø[?»(Þ>Ãúµ>viŒ> ÁC>K…Ú=޼®<ü8ƒ½ý•¾‘n¾ëW¡¾§9ʾž¡ñ¾Î© ¿Ùv¿½.¿¿„=¿ÜƒK¿ÊX¿ßùb¿§@l¿Îs¿”y¿ýˆ}¿y¢¿iÞ¿o;~¿Ë½z¿Àku¿RLn¿re¿ëZ¿5ËN¿Æ#A¿B2¿ À!¿3¿Ö=û¾3@Ô¾¶«¾¯Û¾–;.¾©ô®½Öx%8Þ®=p0.>°å>¼°«> ;Ô>è8û>X7?Û½!?92?+'A?ŠÉN?ŸéZ?Ote?6Nn?òju?9½z? <~?RÞ?Ÿ¢?Fˆ}?¼”y?÷Îs?©>l?{÷b?OX?“…K?E=?Ð.?y?y¥ ?›¦ñ>Ú>Ê>I]¡>s}n>.¡>’Oƒ=ýa¯¼ÊnÚ½…¶C¾hsŒ¾yõµ¾¢#Þ¾iY¿´¿óñ%¿ãù5¿³D¿ ÷Q¿Û²]¿êÓg¿è?p¿ëv¿É{¿_Ñ~¿Bü¿òH¿w·|¿Nx¿¬r¿bj¿ib`¿F U¿&(H¿È9¿*¿³¿Œ¿ óç¾Û%À¾¥ñ–¾¦'Y¾ìô¾B6/½^./=÷ò>¸%Y>´ð–>ñ$À>?òç>!?N?¥*?FÈ9?×'H?ÿ U?,b`?kj?ƒr?`Nx?c·|?èH?Cü?kÑ~?É{?:ëv?@p?»Ðg?³]?S÷Q?Q³D?<ú5?Sò%?k´?ÖY?†$Þ>föµ>[tŒ>u¸C>·rÚ=Èq¯<¡Kƒ½:Ÿ¾‡{n¾Z\¡¾ò=ʾ½¥ñ¾¥ ¿±x¿t.¿ð€=¿G…K¿ X¿@÷b¿ŽAl¿ÐÎs¿ ”y¿4ˆ}¿˜¢¿VÞ¿<~¿R½z¿ku¿dNn¿úpe¿àéZ¿ÕÉN¿}'A¿”2¿=¾!¿À7¿Ä9û¾ó;Ô¾ª±«¾¤æ¾b2.¾ ⮽°E¸ºð®=¤9.>ºÚ>"µ«>M?Ô>ú<û>©2?ª¿!?ç2?s#A?ëÊN?ÕêZ?Ìqe?On?œku?²½z?a;~?eÞ?¢?‰}?7”y?@Îs?Ø@l?föb?X?)„K?…=?.?=w?8ª ?}¢ñ>:Ê>ÛX¡>|“n>ñ—>í<ƒ=쮼^Ú½°¿C¾ƒhŒ¾×ùµ¾×'Þ¾l[¿h¯¿ºó%¿ˆû5¿`¯D¿aøQ¿´]¿ƒÑg¿¶@p¿¶ëv¿rÉ{¿ÔÐ~¿Hü¿ÅH¿_¸|¿íMx¿êr¿­j¿Ia`¿ú U¿±&H¿ƒÌ9¿D*¿Ô¿\ ¿öî羇!À¾.í–¾Ê=Y¾©ë¾í/½ÑÓ.=;ü>Ù.Y>àå–>E)À>iöç> ?Ä?c*?áÉ9?O$H?K U?Lc`? j?Er?òNx?÷|?|H?<ü?2Ñ~?#Ê{?œêv?E?p?"Óg?ï±]?ýõQ?Ó±D?8þ5?Œð%?„²?¶^?P Þ>òµ>ÝoŒ>²ÎC>$`Ú='¯·“î=ÙB.>?ß>vª«>CÔ> Aû>—4?F»!?”2?û$A?”ÇN? ìZ?Õre?ÿLn?Flu?*¾z?§;~?7Þ?_¢?¼ˆ}?z•y?ŠÍs?ò?l?ùb?ÍX?¾‚K?‚ƒ=?A".?fu?C¨ ?z¬ñ>E6Ê>lT¡>fŠn>Y®>H*ƒ={÷®¼OTÚ½ÛÈC¾mŒ¾@ïµ¾ ,Þ¾n]¿N±¿jï%¿,ý5¿ß°D¿#õQ¿1µ]¿Òg¿Â>p¿Tìv¿ÞÉ{¿ Ñ~¿8ü¿˜H¿ÿ·|¿NOx¿'r¿»j¿d`¿¯ U¿<%H¿çÊ9¿€*¿õ¿` ¿ùç¾3À¾¸è–¾©4Y¾e⾘ë.½&ù.=Âå>ú7Y>Wê–>ÅÀ>“úç> ?£?(*?}Ë9?Ä%H?' U?kd`?j?nr?ƒOx?"¸|?¨H?Lü?øÐ~?·É{?ìv?w>p?%Òg?Ä´]?§ôQ?T°D?“ü5?Üô%?ž°?³\?†*Þ>ªíµ>_kŒ>‡ÅC>MÚ=YÜ®< 1ƒ½’¾³n¾V¡¾Ô7ʾù­ñ¾ù¨ ¿v¿.¿„=¿BƒK¿BX¿iùb¿E@l¿ÌÍs¿ª•y¿Úˆ}¿k¢¿rÞ¿;~¿þ½z¿lu¿¯Ln¿tre¿šëZ¿ÇN¿m$A¿ø2¿ÑÀ!¿ä3¿’?û¾BԾݨ«¾›Ý¾?.¾Ð¼®½Š¾Ë70Ö®=…,.>Äã>Ü®«>>9Ô>Eû>…6?½!?ƒ2?„&A?ôÈN?éZ?Þse?ÙMn?ªju?£¾z?í;~?JÞ?­¢?iˆ}?õ”y?DÏs? ?l?ð÷b?×X?SK?ð=?‹ .?Ýy?N¦ ?\¨ñ>­@Ê>ýO¡>Pn>¥>£ƒ=2B¯¼ãfÚ½ž²C¾~qŒ¾žóµ¾Ø!Þ¾q_¿5³¿1ñ%¿0ù5¿^²D¿yöQ¿\²]¿Óg¿?p¿Õêv¿JÊ{¿FÑ~¿?ü¿I¿ ·|¿½Nx¿ÿr¿Éj¿ãb`¿Ó U¿Ç#H¿LÉ9¿Á*¿ ¿d¿åôç¾³'À¾Aä–¾ˆ+Y¾Þø¾CÆ.½|/=ï>Õ!Y>Íî–>#À>yðç> ?‚?æ*?—Ç9?8'H?r U?±a`?j?0r?"Nx?¸|?ÕH?Fü?ƒÑ~?KÉ{?}ëv?k@p?'Ñg?š³]?å÷Q?Õ®D?ïú5?ó%?:µ?±Z?P&Þ>Aøµ>áfŒ>\¼C>ŸzÚ=¢‘®<²Cƒ½L›¾ªwn¾wZ¡¾<ʾü£ñ¾îª ¿èw¿¹.¿E€=¿¬„K¿ƒX¿Ëöb¿,Al¿ƒÎs¿g”y¿,‰}¿‹¢¿^Þ¿7<~¿†½z¿^ku¿ÁNn¿kqe¿dêZ¿kÊN¿ä"A¿K2¿¿!¿’8¿€;û¾Â=Ô¾‰³«¾Ù¾L6.¾÷鮽¿V{8Îè®=¹5.>ÎØ>C³«>~=Ô>?;û>s8?å¾!?02?Ì"A?UÊN?QêZ?[qe?´Nn?Tku?~½z?3<~?]Þ?¢?2‰}?p”y?ŽÎs?:Al?Üöb?—X?ÄK?_€=?Ô.?x? « ?>¤ñ>c<Ê>¾Z¡>;xn>ß›>ÜDƒ=ꌯ¼vyڽɻC¾™fŒ¾ü÷µ¾ &Þ¾‘Z¿µ¿ùò%¿Õú5¿½®D¿Ð÷Q¿‡³]¿Ñg¿_@p¿sëv¿DÉ{¿€Ñ~¿Eü¿ØH¿‡¸|¿+Nx¿<r¿j¿Ãa`¿‡ U¿P'H¿±Ç9¿*¿ ¿4 ¿»ðç¾_#À¾ï–¾g"Y¾šï¾Ð /½ÑC/=Jø>ö*Y>úã–>n'À>£ôç>E?a ?¥*?2É9?°#H?¾ U?Ñb`?¹j?ór?´Nx?š·|?I??ü?JÑ~?QÊ{?ßêv??p?ŽÓg?o²]?öQ?u²D?Jù5?Nñ%?S³?‘_?"Þ>äóµ>ÆqŒ>0³C> hÚ=ÛF¯l¿9Ïs¿ì”y¿dˆ}¿«¢¿KÞ¿ñ;~¿ª¾z¿´ju¿çMn¿îse¿.éZ¿ ÉN¿œ&A¿2¿3½!¿¤6¿_Eû¾‚9Ô¾#¯«¾ ä¾-.¾Z×®½ŒcÞ·kû®=î>.>SÝ>–¨«>¾AÔ>Q?û>Å3?´À!?Þ2?T$A?þÆN?‡ëZ?dre?¢Ln?þku?÷½z?‰;~?pÞ?m¢?߈}?²•y?ØÍs?T@l?{ùb?VX?XƒK?-„=?.?.v?© ?;®ñ>8Ê>OV¡>DŽn>¢’>72ƒ=°×®¼ ŒÚ½ôÄC¾kŒ¾eíµ¾B*Þ¾“\¿°¿Àô%¿yü5¿<°D¿’ôQ¿²´]¿Òg¿j>p¿ìv¿°É{¿õÐ~¿Lü¿«H¿(¸|¿ŒOx¿zr¿"j¿}d`¿< U¿Û%H¿–Ë9¿C*¿Á¿8 ¿Õúç¾ À¾žê–¾Œ8Y¾Væ¾{û.½Dé.=Ž>4Y>qè–>îÀ>Íøç>A ?×?d*?ÎÊ9?%%H?š U?ñc`?«j?r?EOx?ù·|?•H?9ü?Ñ~?åÉ{?^ìv?Ï>p?‘Òg?Dµ]?9õQ?÷°D?Fý5?‡ï%?m±?Ž]?P,Þ>†ïµ>HmŒ>nÉC>xUÚ=$ü®<)ƒ½Å­¾Õ‰n¾%T¡¾6ʾ8¬ñ¾$¨ ¿Hu¿&".¿iƒ=¿§‚K¿¹X¿ôøb¿ã?l¿Ís¿q•y¿·ˆ}¿]¢¿8Þ¿«;~¿2¾z¿Qlu¿ Mn¿åre¿ìZ¿ªÇN¿%A¿¯2¿c»!¿¶4¿MAû¾ÑCÔ¾¼ª«¾‡ß¾lC.¾¼Ä®½Ð7Eή=#H.>Øá>ý¬«>o7Ô>bCû>³5?P¼!?‹2?Ý%A?^ÈN?—èZ?mse?|Mn?aju?o¾z?Ï;~?BÞ?M¢?Œˆ}?-•y?’Ïs?m?l?føb?` X?íK?œ‚=?E!.?Wt?#§ ?ªñ>BÊ>àQ¡>.…n> ©>’ƒ=g"¯¼û^Ú½ ÎC¾•oŒ¾Âñµ¾ Þ¾–^¿f²¿pð%¿þ5¿»±D¿èõQ¿Ý±]¿Óg¿8?p¿’êv¿Ê{¿.Ñ~¿<ü¿H¿É·|¿ûNx¿Rr¿0j¿^c`¿` U¿f$H¿ûÉ9¿*¿â¿< ¿«ö羋)À¾'æ–¾j/Y¾Ïü¾%Ö.½™/=ë>8=Y>çì–>B!À>³îç>< ?¶?(*?iÌ9?š&H?å U?7a`?j?Þr?äMx?Y¸|?ÂH?Hü?×Ð~?yÉ{?Àëv?Ã@p?“Ñg?´]?vøQ?x¯D?¢û5?×ó%?†¯?Œ[?(Þ>úµ>ÊhŒ>BÀC>†‚Ú=l±®<Ã;ƒ½]—¾ë’n¾”X¡¾K:ʾ<¢ñ¾ª ¿ w¿ÿ.¿û„=¿„K¿úX¿Uöb¿Ê@l¿5Îs¿/”y¿ ‰}¿}¢¿gÞ¿e;~¿¹½z¿§ku¿On¿Üqe¿èêZ¿ËN¿‹#A¿2¿Ç¿!¿È2¿;=û¾‘?Ô¾hµ«¾Û¾7:.¾ãñ®½.½;8âà®=Ï1.>\æ>c±«>¯;Ô>ƒ9û>¡7? ¾!?y2?e'A?¿ÉN?ÍéZ?êpe?WNn? ku?K½z?<~?UÞ?š¢?9ˆ}?¨”y?ÜÎs?œAl?R÷b?X?]…K? =?.?Îx?.¥ ?þ¥ñ>6>Ê> \¡>|n>ÍŸ>ËLƒ=m¯¼qÚ½â·C¾tŒ¾ öµ¾C$Þ¾¶Y¿M´¿7ò%¿"ú5¿9³D¿>÷Q¿³]¿Ôg¿@p¿0ëv¿É{¿gÑ~¿Bü¿ëH¿i·|¿iNx¿r¿zj¿>b`¿ U¿î'H¿`È9¿À*¿l¿A¿òç¾6%À¾ûð–¾I&Y¾‹ó¾²0/½î3/=Xô>'Y>^ñ–>–%À>Ýòç>l?•?ç*?ƒÈ9?(H?1 U?Wb`?j? r?vNx?q·|?ïH?Bü?bÑ~? É{?"ëv?õ?p?úÓg?î²]? ÷Q?³D?ýù5?ò%?#´?‰Y?å#Þ>¿õµ>¯sŒ>·C>óoÚ=¦f¯Ê¾Z¦ñ¾Z¥ ¿÷x¿µ.¿,=¿}…K¿;X¿j÷b¿°Al¿ëÎs¿´”y¿@ˆ}¿¢¿SÞ¿<~¿A½z¿ýju¿DNn¿_te¿²éZ¿ ÉN¿C'A¿T2¿ø½!¿v7¿)9û¾Q;Ô¾±«¾øå¾1.¾Eß®½WË.¸€ó®=;.>gÛ>ʵ«>ï?Ô>•=û>ó2?ï¿!?'2?­#A?ËN?ëZ?óqe?1On?µku?Ľz?k;~?hÞ?{¢?‰}?#”y?%Îs?¶@l?ðùb?ÞX?òƒK?Ø„=?Ù.?÷v?î© ?à¡ñ>ì9Ê>2X¡>!’n>–>&:ƒ=å·®¼"„Ú½ÁC¾.iŒ¾~úµ¾x(Þ¾¸[¿°¯¿þó%¿Æû5¿™¯D¿”øQ¿3´]¿©Ñg¿Õ@p¿Îëv¿‚É{¿ÜÐ~¿Iü¿¾H¿Q¸|¿ØMx¿Ír¿ˆj¿ød`¿É U¿y&H¿EÌ9¿*¿¿ ¿Wîç¾â À¾„ì–¾n50Y>Šæ–>ë)À>÷ç>h ? ?¦*?Ê9?†$H?| U?vc`?Dj?br?Ox?Ñ·|?‚H?<ü?)Ñ~?Ê{?„êv?&?p?ýÒg?õ]?ÊõQ?š±D?ùý5?Hð%?<²?i^?°Þ>añµ>1oŒ>UÍC>_]Ú=ï¯ëß>««>/DÔ>§Aû>á4?‹»!?Ô2?6%A?ÈÇN?9ìZ?üre?Mn?_lu?<¾z?±;~?:Þ?[¢?¯ˆ}?f•y?oÍs?Ï?l?Üøb?è X?ˆ‚K?Gƒ=?".?u?ø§ ?Ý«ñ>¡5Ê>ÃS¡> ‰n>ø¬>'ƒ=œ¯¼WÚ½9ÊC¾¬mŒ¾çïµ¾­,Þ¾»]¿—±¿®ï%¿ký5¿±D¿VõQ¿^µ]¿§Òg¿à>p¿kìv¿îÉ{¿Ñ~¿9ü¿’H¿ñ·|¿9Ox¿ r¿–j¿Øc`¿í U¿%H¿ªÊ9¿=*¿®¿ ¿qøç¾ŽÀ¾è–¾M3Y¾À¾æ.½¶þ.=#ç>V9Y>ë–>jÀ>1ûç>d ?ê?j*?ºË9?û%H?X U?–d`?6j?‹r?™Ox?0¸|?¯H?Kü?ðÐ~?§É{?ìv?X>p?ÿÑg?˜´]?ùQ?°D?Uü5?™ô%?U°?g\?å)Þ>íµ>´jŒ>)ÄC>nŠÚ=7Ñ®<Ô3ƒ½o“¾ n¾±V¡¾w8ʾ–®ñ¾D© ¿Wv¿D.¿P„=¿xƒK¿rX¿“ùb¿h@l¿çÍs¿¾•y¿æˆ}¿p¢¿oÞ¿ƒ;~¿ì½z¿ïku¿Ln¿Mre¿lëZ¿–ËN¿2$A¿¸2¿ŒÀ!¿š3¿ö>û¾`AÔ¾5¨«¾ïܾ">.¾Ïù®½;Gø7öØ®=ä-.>pä>„¯«>à9Ô>¹Eû>Ï6?[½!?Ã2?¾&A?)ÉN?IéZ?te?úMn?Ãju?µ¾z?÷;~?MÞ?¨¢?]ˆ}?á”y?)Ïs?é>l?Ç÷b?¨X?÷…K?µ=?I .?—y?¦ ?¿§ñ> @Ê>TO¡>ön>»£>ºTƒ=TM¯¼§iÚ½û³C¾*rŒ¾Dôµ¾x"Þ¾½_¿~³¿uñ%¿où5¿—²D¿¬öQ¿‰²]¿¤Óg¿¯?p¿íêv¿ZÊ{¿OÑ~¿@ü¿þH¿’·|¿§Nx¿âr¿¤j¿¸b`¿¡ U¿(H¿É9¿*¿8 ¿¿Gôç¾'À¾—ã–¾,*Y¾|÷¾•@/½ $/=gð>1#Y>xï–>¿#À>ñç>` ?Ê?)*?ÔÇ9?p'H?¤ U?Üa`?(j?Mr?8Nx?¸|?ÜH?Eü?{Ñ~?;É{?eëv?M@p?Ñg?m³]?²÷Q?»³D?°ú5?Ñò%?ò´?dZ?°%Þ>›÷µ>6fŒ>þºC>ÚwÚ=q†¯{Ù>볫> >Ô>Ú;û>½8?*¿!?p2?#A?‰ÊN?êZ?‚qe?ÔNn?mku?½z?=<~?`Þ?ˆ¢?%‰}?\”y?sÎs?Al?³öb?gX?„K?ƒ…=?“.?¿w?ê ?¡£ñ>¿;Ê>Z¡>àvn>š>Bƒ=˜®¼;|Ú½'½C¾EgŒ¾¢øµ¾®&Þ¾ÝZ¿dµ¿=ó%¿û5¿ö®D¿øQ¿³³]¿=Ñg¿}@p¿Šëv¿TÉ{¿ˆÑ~¿Fü¿ÑH¿y¸|¿Nx¿r¿ïj¿˜a`¿V U¿'H¿ôÌ9¿À*¿Y¿é ¿ð羺"À¾jî–¾ !Y¾8î¾@/½~É.=«ù>R,Y>¤ä–>(À>Bõç>?© ?è*?pÉ9?è#H?ï U?üb`?Ýj?r?ÉNx?¨·|?I?>ü?BÑ~?AÊ{?Çêv?~?p?iÓg?B²]?\öQ?<²D?¬þ5? ñ%? ³?D_?z!Þ>=óµ>qŒ>Ò±C>GeÚ=º;¯<@ƒ½é¥¾‚n¾_P¡¾ Aʾ·¨ñ¾y¦ ¿z¿± .¿‚=¿sK¿óX¿øb¿?l¿TÏs¿•y¿pˆ}¿°¢¿HÞ¿ç;~¿˜¾z¿›ju¿ÆMn¿Çse¿éZ¿ÖÈN¿b&A¿2¿î¼!¿[6¿ÃDû¾à8Ô¾{®«¾`ã¾¹+.¾”Ô®½ÛÚ±·m¾®=M@.>ÿÝ>>©«>`BÔ>ì?û>4?úÀ!?2?$A?2ÇN?µëZ?‹re?ÂLn?lu? ¾z?“;~?sÞ?h¢?Óˆ}?ž•y?½Ís?1@l?Qùb?&X?"ƒK?òƒ=?º".?èu?Ψ ?ž­ñ>u7Ê>¦U¡>éŒn>B‘>p/ƒ=Ñ⮼,OÚ½RÆC¾ÂkŒ¾ îµ¾ã*Þ¾à\¿È°¿õ%¿¸ü5¿u°D¿ÅôQ¿Þ´]¿;Òg¿‰>p¿(ìv¿ÀÉ{¿ýÐ~¿Lü¿¥H¿¸|¿vOx¿]r¿ýj¿Rd`¿ U¿£%H¿YË9¿*¿z¿í ¿6úç¾eÀ¾ôé–¾/7Y¾õä¾ëõ.½Ôî.=2ã>t5Y>é–>“À>lùç>Œ ??§*? Ë9?\%H?Ë U?d`?Ïj?8r?[Ox?¸|?œH?8ü?Ñ~?ÕÉ{?Fìv?°>p?kÒg?µ]?õQ?¾°D?ý5?Cï%?$±?B]?¯+Þ>ßîµ>lŒ>ÈC>³RÚ=ñ®<å+ƒ½¾0‹n¾ÎT¡¾¤6ʾլñ¾o¨ ¿Žu¿g".¿¥ƒ=¿Ý‚K¿éX¿ùb¿@l¿šÍs¿…•y¿Ãˆ}¿b¢¿5Þ¿¡;~¿ ¾z¿7lu¿ìLn¿¾re¿ðëZ¿uÇN¿Ù$A¿o2¿»!¿m4¿²@û¾/CÔ¾ª«¾ÛÞ¾ B.¾öÁ®½3(r7 Ñ®=ù).>„â>¥­«>8Ô>þCû>ý5?•¼!?Ë2?&A?“ÈN?ÅèZ?•se?Mn?zju?¾z?Ù;~?EÞ?H¢?€ˆ}?•y?wÏs?K?l?=øb?0 X?·K?`‚=?!.?t?Ù¦ ?€©ñ>ÝAÊ>7Q¡>Ôƒn>ª§>˃=‰-¯¼¿aÚ½°C¾@pŒ¾iòµ¾® Þ¾ã^¿¯²¿´ð%¿\þ5¿ô±D¿öQ¿ ²]¿8Óg¿W?p¿©êv¿,Ê{¿7Ñ~¿=ü¿xH¿º·|¿åNx¿5r¿ j¿3c`¿. U¿.$H¿¾É9¿=*¿š¿ñ¿ öç¾å(À¾}å–¾.Y¾nû¾–Ð.½)/=vì>OY>‘í–>ç!À>Rïç>ˆ ?þ?k*?¦Ì9?Ñ&H? U?ba`?Áj?ûr?úMx?g¸|?ÉH?Gü?ÏÐ~?iÉ{?¨ëv?¥@p?mÑg?ì³]?CøQ??¯D?cû5?“ó%?>¯??[?z'Þ>vùµ>hŒ>å¾C>ÂÚ=K¦®<Š>ƒ½¾˜¾'un¾=Y¡¾î:ʾ٢ñ¾dª ¿fw¿@.¿7…=¿H„K¿*X¿~öb¿ì@l¿PÎs¿C”y¿‰}¿‚¢¿dÞ¿[;~¿§½z¿ku¿þNn¿µqe¿ºêZ¿ÌÊN¿Q#A¿Â2¿‚¿!¿2¿ <û¾ï>Ô¾Á´«¾VÚ¾Ø8.¾﮽‡R8¨ã®=.3.>Ž×> ²«>Q<Ô>:û>ë7?e¾!?¹2?Ÿ'A?óÉN?ûéZ?qe?wNn?%ku?]½z? <~?XÞ?–¢?-ˆ}?””y?ÀÎs?zAl?(÷b?ïX?'…K?΀=?N.?ˆx?ä¤ ?a¥ñ>“=Ê>÷[¡>¾zn>mž>Jƒ=@x¯¼StÚ½@¹C¾[eŒ¾Æöµ¾ã$Þ¾Z¿•´¿{ò%¿`ú5¿r³D¿q÷Q¿4³]¿ÑÐg¿&@p¿Gëv¿&É{¿pÑ~¿Cü¿äH¿[·|¿TNx¿rr¿Vj¿b`¿ã U¿·'H¿"È9¿~*¿%¿õ¿âñ羑$À¾Qð–¾í$Y¾*ò¾#+/½~9/=ºõ>p(Y>¾â–>;&À>|óç>¸?Ý?**?ÁÈ9?F(H?b U?‚b`?vj?½r?ŒNx?€·|?õH?Aü?ZÑ~?ýÈ{? ëv?Ö?p?ÔÓg?Á²]?íöQ?ß²D?¿ù5?Ìñ%?Ú³?=Y?E#Þ>õµ>sŒ>¹µC>.mÚ=…[¯l¿Ïs¿È”y¿Mˆ}¿¢¢¿QÞ¿<~¿/½z¿ãju¿#Nn¿8te¿„éZ¿lÉN¿ 'A¿2¿³½!¿-7¿Ž8û¾¯:Ô¾Z°«¾L徤/.¾Ü®½ÿ†¸Fö®=b<.>Ü>_§«>‘@Ô>0>û>=3?4À!?g2?è#A?TËN?1ëZ?re?eLn?Ïku?Õ½z?v;~?kÞ?v¢?öˆ}?”y? Îs?“@l?Çùb?¯X?¼ƒK?„=?—.?±v?£© ?C¡ñ>H9Ê>‰W¡>Çn>0•>_7ƒ=î¼ç†Ú½kÂC¾ÙiŒ¾0ìµ¾)Þ¾\¿ù¯¿Bô%¿ü5¿Ò¯D¿ÇøQ¿_´]¿ÏÑg¿1>p¿åëv¿’É{¿åÐ~¿Jü¿¸H¿B¸|¿ÂMx¿°r¿dj¿Íd`¿— U¿B&H¿Ì9¿¿*¿E¿Å ¿¸íç¾= À¾Úë–¾;Y¾æè¾Í/½ñÞ.=þþ>‘1Y>5ç–>»À>¦÷ç>´ ?S?é*?\Ê9?¾$H?® U?¡c`?ij?år?Ox?ß·|?‰H?;ü?!Ñ~?Ê{?mêv??p?×Òg?–µ]?—õQ?a±D?»ý5?ð%?ó±?^?Þ>»ðµ>†nŒ>÷ËC>›ZÚ=ͯ<ö#ƒ½7«¾R‡n¾ëR¡¾Ñ4ʾ«ñ¾™§ ¿Æt¿¬!.¿ú‚=¿C‚K¿¬ X¿§øb¿¤?l¿LÍs¿M•y¿ ˆ}¿U¢¿=Þ¿¿;~¿S¾z¿9ju¿IMn¿/se¿tìZ¿ ÈN¿€%A¿&2¿ã»!¿?5¿mBû¾n6Ô¾ô««¾Çà¾÷E.¾âÉ®½áCµÉ®=—E.>˜à>Å««>B6Ô>BBû>+5?л!?2?p%A?ýÇN?gìZ?$se?@Mn?2ju?N¾z?¼;~?=Þ?V¢?£ˆ}?R•y?TÍs?­?l?³øb?¹ X?R‚K? ƒ=?¾!.?Ùt?®§ ?@«ñ>þ4Ê>S¡>±‡n>˜«>º$ƒ=¾ ¯¼ØYÚ½—ËC¾WnŒ¾ðµ¾ãÞ¾^¿ß±¿òï%¿©ý5¿Q±D¿‰õQ¿Šµ]¿ÌÒg¿ÿ>p¿fêv¿þÉ{¿Ñ~¿:ü¿‹H¿ã·|¿#Ox¿ír¿rj¿­c`¿» U¿Í$H¿mÊ9¿û*¿f¿É ¿Ò÷ç¾èÀ¾cç–¾ñ1Y¾_ÿ¾xà.½F/=…è>²:Y>«ë–> À>íç>° ?2?­*?÷Ë9?3&H?Š U?Ád`?[j?¨r?¼Mx?>¸|?¶H?Jü?çÐ~?—É{?ìëv?9>p?ÙÑg?k´]?ÕøQ?â¯D?ü5?Uô%? °?\?E)Þ>]ìµ>jŒ>ËÂC>ª‡Ú=Æ®<›6ƒ½Ï”¾hn¾ZW¡¾9ʾ¡ñ¾Ž© ¿v¿….¿Œ„=¿®ƒK¿¡X¿¼ùb¿Š@l¿Îs¿ ”y¿òˆ}¿u¢¿lÞ¿x;~¿Ú½z¿Öku¿nLn¿%re¿>ëZ¿bËN¿ø#A¿x2¿GÀ!¿Q3¿[>û¾¾@Ô¾§«¾BܾÃ<.¾ ÷®½ög8¼Û®=C/.>å>,°«>‚:Ô>c8û>7? ½!?2?ù&A?]ÉN?wéZ?-te?Nn?Üju?*½z?<~?PÞ?£¢?Pˆ}?Í”y?Ïs?Ç>l?ž÷b?xX?Á…K?y=? .?Qy?¹¥ ?"§ñ>f?Ê>«N¡>›~n>[¢>óQƒ=uX¯¼llÚ½YµC¾ÕrŒ¾ëôµ¾#Þ¾(Y¿Æ³¿¹ñ%¿­ù5¿Ð²D¿ßöQ¿µ²]¿ÊÓg¿Î?p¿ëv¿øÈ{¿XÑ~¿Aü¿÷H¿„·|¿‘Nx¿År¿€j¿b`¿p U¿U(H¿ÒÈ9¿<*¿ð¿Í¿¨óç¾i&À¾íâ–¾Ð(Y¾ö¾;/½›)/=Éñ>Ž$Y>"ð–>d$À>·ñç>¬ ??l*?È9?§'H?Õ U?b`?Mj?jr?NNx?W·|?âH?Dü?rÑ~?+É{?Nëv?.@p?ÜÐg?@³]?÷Q?‚³D?rú5?ò%?©´?Z?%Þ>ôöµ>ŠeŒ> ¹C>uÚ=P{¯<@Iƒ½ ž¾_zn¾É[¡¾f=ʾ6¥ñ¾ƒ« ¿ux¿<.¿½€=¿…K¿âX¿÷b¿pAl¿¹Îs¿”y¿*ˆ}¿”¢¿YÞ¿"<~¿b½z¿,ku¿€Nn¿qe¿êZ¿ÊN¿°'A¿Ë2¿x¾!¿ÿ7¿I:û¾~<Ô¾9²«¾¾×¾Ž3.¾k䮽 X¸Zî®=x8.>'Ú>’´«>Â>Ô>u<û>9?o¿!?°2?A#A?¾ÊN?­êZ?ªqe?õNn?†ku?¢½z?X;~?cÞ?ƒ¢?‰}?H”y?XÎs?õ@l?‰öb?7X?W„K?H…=?R.?yw?xª ?£ñ>;Ê>kY¡>†un>™>N?ƒ=<£®¼ÿ~Ú½…¾C¾ðgŒ¾Iùµ¾N'Þ¾*[¿­µ¿€ó%¿Rû5¿/¯D¿5øQ¿à³]¿cÑg¿œ@p¿¢ëv¿dÉ{¿ÌÐ~¿Gü¿ËH¿k¸|¿Nx¿r¿Ëj¿ma`¿$ U¿à&H¿·Ì9¿}*¿¿ ¿~ïç¾"À¾Àí–¾¯Y¾×ì¾°/½Ï.= û>¯-Y>Nå–>¸(À>áõç>Ü?ð ?**?­É9?$H?! U?'c`?j?-r?ßNx?¶·|?vH?=ü?9Ñ~?1Ê{?°êv?_?p?CÓg?²]?)öQ?²D?nþ5?Æð%?²?ø^?Ú Þ>—òµ>opŒ>u°C>‚bÚ=˜0¯<ƒ½I§¾tƒn¾Q¡¾°AʾT©ñ¾Ä¦ ¿Lz¿ò .¿O‚=¿©K¿# X¿2øb¿B?l¿oÏs¿•y¿|ˆ}¿G¢¿FÞ¿Ü;~¿†¾z¿ju¿¦Mn¿Ÿse¿ÒèZ¿¡ÈN¿'&A¿Ý2¿¨¼!¿6¿(Dû¾=8Ô¾Ó­«¾³â¾Z*.¾ÎÑ®½*R…·3Á®=¬A.>¬Þ>æ©«>CÔ>‡@û>X4??Á!?^2?É$A?gÇN?ãëZ?³re?ãLn?0lu?¾z?ž;~?4Þ?c¢?ƈ}?‹•y?¡Ís?@l?(ùb?öX?ì‚K?¶ƒ=?y".?¢u?ƒ¨ ?­ñ>Ñ6Ê>ýT¡>‹n>â>©,ƒ=óí®¼ðQÚ½°ÇC¾nlŒ¾²îµ¾ƒ+Þ¾-]¿±¿Hõ%¿öü5¿®°D¿øôQ¿ µ]¿aÒg¿§>p¿@ìv¿ÐÉ{¿Ñ~¿8ü¿žH¿ ¸|¿aOx¿@r¿Ùj¿(d`¿Ù U¿l%H¿Ë9¿¹*¿2¿¡ ¿—ùç¾ÀÀ¾Jé–¾Ó5Y¾“ã¾[ð.½cô.=”ä>Ð6Y>Åé–>8À> úç>Ø ?f?é*?HË9?”%H?ý U?Gd`?ôj?Ur?qOx?¸|?£H?Mü?Ñ~?ÅÉ{?/ìv?‘>p?EÒg?ë´]?ÓôQ?…°D?Éü5?õ%?ܰ?õ\?+Þ>9îµ>òkŒ>²ÆC>ïOÚ=áå®<¬.ƒ½á¾ŠŒn¾wU¡¾H7ʾs­ñ¾¹¨ ¿Õu¿¨".¿áƒ=¿ƒK¿X¿Fùb¿(@l¿µÍs¿™•y¿Ïˆ}¿g¢¿tÞ¿–;~¿¾z¿lu¿ËLn¿–re¿ÂëZ¿AÇN¿Ÿ$A¿/2¿ Á!¿#4¿@û¾BÔ¾l©«¾/Þ¾®@.¾0¿®½Êœ¥7ÑÓ®=X+.>0ã>M®«>³8Ô>™Dû>F6?Û¼!? 2?R&A?ÇÈN?óèZ?¼se?½Mn?”ju?“¾z?ä;~?HÞ?±¢?sˆ}?•y?\Ïs?)?l?øb? X?K?$‚=?à .?z?ަ ?â¨ñ>9AÊ>ŽP¡>y‚n>I¦>ƒ=ª8¯¼„dÚ½r±C¾ìpŒ¾óµ¾N!Þ¾/_¿÷²¿÷ð%¿›þ5¿-²D¿NöQ¿6²]¿^Óg¿v?p¿Áêv¿<Ê{¿?Ñ~¿>ü¿ I¿¬·|¿ÏNx¿r¿çj¿c`¿ý U¿÷#H¿É9¿ú*¿¼ ¿¥¿mõç¾@(À¾Óä–¾²,Y¾ ú¾Ë.½¸/=×í>« Y><î–>Œ"À>ñïç>Ô ?E?­*?äÌ9? 'H?H U?a`?æj?r?Nx?u¸|?ÏH?Fü?‹Ñ~?YÉ{?‘ëv?†@p?GÑg?À³]?øQ?¯D?%û5?Oó%?xµ?óZ?Ú&Þ>Ðøµ>tgŒ>‡½C>ý|Ú=)›®Ô¾´«¾ªÙ¾y7.¾W쮽àEh8næ®=4.>;Ø>³²«>ó<Ô>º:û>48?ª¾!?ù2?Ú'A?(ÊN?)êZ?9qe?˜Nn?>ku?o½z?*<~?[Þ?‘¢?<‰}?”y?¥Îs?WAl?ÿöb?ÀX?ñ„K?’€=? .?Bx?M« ?Ĥñ>ï<Ê>N[¡>cyn> >=Gƒ=bƒ¯¼wÚ½žºC¾fŒ¾m÷µ¾„%Þ¾OZ¿Þ´¿¿ò%¿Ÿú5¿«³D¿¤÷Q¿a³]¿÷Ðg¿D@p¿_ëv¿6É{¿yÑ~¿Dü¿ÞH¿”¸|¿>Nx¿Ur¿2j¿èa`¿± U¿'H¿åÇ9¿;*¿Ý¿u ¿Cñç¾ì#À¾¦ï–¾‘#Y¾Èð¾“%/½?/=÷>Ì)Y>hã–>à&À>ôç>?$ ?l*?þÈ9?~(H?” U?¬b`?›j?Úr?¡Nx?Ž·|?üH?@ü?QÑ~?_Ê{?óêv?·?p?¯Óg?•²]?ºöQ?¦²D?€ù5?ˆñ%?’³?Ó_?¤"Þ>rôµ>YrŒ>\´C>jjÚ=cP¯<÷Sƒ½[£¾—n¾&O¡¾Ý?ʾ”§ñ¾ï¥ ¿ƒy¿7 .¿¤=¿é…K¿›X¿¼÷b¿à>l¿"Ïs¿Û”y¿Yˆ}¿§¢¿NÞ¿ú;~¿º¾z¿Êju¿Nn¿te¿VéZ¿7ÉN¿Î&A¿Ô2¿n½!¿ã6¿äEû¾ :Ô¾²¯«¾Ÿä¾D..¾ºÙ®½¦B¸ ù®=Á=.>¿Ü>¨«>3AÔ>Ì>û>†3?yÀ!?§2?"$A?ˆËN?_ëZ?Bre?†Ln?èku?ç½z?€;~?nÞ?q¢?éˆ}?Õy?ïÍs?q@l?žùb?X?†ƒK?a„=?V.?jv?X© ?Á®ñ>¤8Ê>àV¡>ln>Г>˜4ƒ=(ή¼«‰Ú½ÉÃC¾„jŒ¾Öìµ¾¹)Þ¾R\¿A°¿†ô%¿Dü5¿ °D¿úøQ¿Œ´]¿õÑg¿O>p¿ýëv¿¢É{¿íÐ~¿Kü¿±H¿4¸|¿ŸOx¿“r¿@j¿¢d`¿f U¿ &H¿ËË9¿|*¿þ¿y ¿]û羘À¾0ë–¾¶9Y¾…ç¾>/½ä.=_>í2Y>ßç–>`À>Eøç> ?š?+*?™Ê9?õ$H?ß U?Ìc`?j?r?3Ox?í·|?H?:ü?Ñ~?óÉ{?Uêv?é>p?±Òg?jµ]?dõQ?(±D?|ý5?Áï%?«±?Ð]?Ù,Þ>ðµ>ÛmŒ>™ÊC>ÖWÚ=¬¯<½&ƒ½—¬¾¬ˆn¾”S¡¾t5ʾ²«ñ¾ä§ ¿ u¿î!.¿6ƒ=¿y‚K¿Û X¿Ðøb¿Æ?l¿gÍs¿`•y¿¬ˆ}¿Y¢¿;Þ¿´;~¿A¾z¿ ju¿(Mn¿se¿FìZ¿×ÇN¿F%A¿æ2¿ž»!¿õ4¿ÒAû¾\DÔ¾L««¾྘D.¾Ç®½¢¦™6åË®=öF.>Dá>m¬«>ä6Ô>ÝBû>t5?¼!?T2?«%A?1ÈN?•ìZ?Kse?`Mn?Kju?`¾z?Æ;~??Þ?Q¢?—ˆ}?>•y?9Ís?‹?l?‰øb?‰ X?‚K?Ï‚=?}!.?“t?c§ ?£ªñ> CÊ>qR¡>W†n>8ª>ó!ƒ=߯¼œ\Ú½ôÌC¾oŒ¾4ñµ¾„Þ¾T^¿(²¿6ð%¿èý5¿Š±D¿¼õQ¿·µ]¿òÒg¿?p¿~êv¿Ê{¿'Ñ~¿;ü¿„H¿Õ·|¿ Ox¿Ðr¿Nj¿‚c`¿Š U¿–$H¿0Ê9¿¸*¿¿} ¿3÷ç¾*À¾¹æ–¾•0Y¾ýý¾èÚ.½Ö /=æé>Uì–>µ À>+îç>ü ?y?ï*?5Ì9?j&H?» U?ìd`?j?År?ÒMx?M¸|?¼H?Iü?ßÐ~?‡É{?Ôëv?>p?³Ñg??´]?¢øQ?©¯D?×û5?ô%?į?Í[?¤(Þ>«úµ>]iŒ>nÁC>å„Ú=ôº®Éå>Ô°«>$;Ô>þ8û>b7?å½!?C2?3'A?’ÉN?¦éZ?Tte?;Nn?öju?<½z? <~?SÞ?Ÿ¢?Dˆ}?¹”y?óÎs?¥>l?u÷b?HX?‹…K?==?Ç.? y?n¥ ?…¦ñ>Â>Ê>1]¡>A}n>û >,Oƒ=—c¯¼0oÚ½·¶C¾€sŒ¾‘õµ¾¹#Þ¾tY¿´¿ýñ%¿ìù5¿ ³D¿÷Q¿â²]¿ðÓg¿ì?p¿ëv¿ É{¿`Ñ~¿Bü¿ñH¿u·|¿|Nx¿¨r¿\j¿bb`¿> U¿(H¿”È9¿ù*¿©¿¿ óç¾Ä%À¾ñ–¾t'Y¾ºô¾u5/½+//=*ó>ê%Y>Ìð–> %À>Uòç>,?X?®*?OÈ9?ß'H? U?2b`?qj?‡r?cNx?e·|?éH?Cü?jÑ~?É{?6ëv?@p?¶Ðg?³]?L÷Q?I³D?3ú5?Jò%?a´?ËY?o$Þ>Nöµ>BtŒ>B¸C>QrÚ=.p¯<Lƒ½lŸ¾¹{n¾r\¡¾ >ʾӥñ¾¥ ¿»x¿}.¿ù€=¿N…K¿X¿F÷b¿“Al¿ÔÎs¿£”y¿6ˆ}¿™¢¿VÞ¿<~¿P½z¿ku¿`Nn¿õpe¿ÚéZ¿ÍÉN¿u'A¿‹2¿3¾!¿µ7¿®9û¾Û;Ô¾’±«¾Œæ¾/2.¾¥á®½7ÜA¸ ñ®=×9.>ÓÚ>:µ«>d?Ô>=û>´2?´¿!?ð2?{#A?òÊN?ÛêZ?Ñqe?On? ku?´½z?b;~?fÞ?¢? ‰}?4”y?=Îs?Ó@l?`öb?X?!„K? …=?.?3w?-ª ?g¢ñ>x:Ê>ÂX¡>J“n>¾—>‡<ƒ=]®®¼ÄÚ½â¿C¾›hŒ¾ïùµ¾ï'Þ¾w[¿r¯¿Äó%¿‘û5¿h¯D¿høQ¿ ´]¿‰Ñg¿»@p¿ºëv¿uÉ{¿ÕÐ~¿Hü¿ÄH¿]¸|¿êMx¿ær¿§j¿Ca`¿ó U¿©&H¿zÌ9¿;*¿Ê¿Q ¿ßîç¾o!À¾í–¾˜=Y¾vë¾ /½žÔ.=nü> /Y>ùå–>])À>öç>( ?Î?m*?êÉ9?W$H?R U?Rc`?&j?Jr?õNx?Å·|?}H?<ü?0Ñ~?!Ê{?˜êv?A?p?Óg?é±]?öõQ?ʱD?/þ5?‚ð%?z²?«^?9 Þ>ðñµ>ÄoŒ>€ÎC>¾_Ú=w%¯<΃½©¨¾Ï„n¾±Q¡¾TBʾñ©ñ¾§ ¿Dt¿3!.¿‹‚=¿ßK¿S X¿[øb¿d?l¿ŠÏs¿(•y¿‰ˆ}¿L¢¿CÞ¿Ò;~¿t¾z¿hju¿…Mn¿xse¿¤èZ¿mÈN¿í%A¿2¿c¼!¿Ç5¿Cû¾›7Ô¾+­«¾⾃H.¾Ï®½ò’1·ùî= C.>Xß>Žª«>¤CÔ>"Aû>¢4?P»!?ž2?%A?›ÇN?ìZ?Úre?Mn?Jlu?-¾z?¨;~?7Þ?_¢?ºˆ}?w•y?†Ís?í?l?ÿøb?ÇX?¶‚K?zƒ=?8".?\u?8¨ ?d¬ñ>-6Ê>TT¡>4Šn>&®>â)ƒ=ù®¼µTÚ½ÉC¾mŒ¾Xïµ¾$,Þ¾y]¿Y±¿tï%¿5ý5¿ç°D¿+õQ¿7µ]¿†Òg¿Æ>p¿Wìv¿áÉ{¿Ñ~¿9ü¿—H¿ý·|¿KOx¿#r¿µj¿ýc`¿§ U¿4%H¿ßÊ9¿v*¿ë¿U ¿ùøç¾À¾Ÿè–¾w4Y¾ï¾Ëê.½óù.=õå>,8Y>oê–>ÝÀ>©úç>$ ?­?1*?†Ë9?Ì%H?. U?rd`?j?rr?†Ox?$¸|?©H?Lü?÷Ð~?µÉ{?ìv?r>p?Òg?¾´]? ôQ?L°D?Šü5?Óô%?“°?¨\?n*Þ>’íµ>FkŒ>UÅC>ÍŒÚ=¿Ú®Üã>ô®«>U9Ô>4Eû>6? ½!?Œ2?Œ&A?üÈN?"éZ?äse?ÞMn?­ju?¥¾z?î;~?KÞ?¬¢?gˆ}?ò”y?@Ïs??l?ë÷b?ÑX?KK?è=? .?Óy?C¦ ?E¨ñ>–@Ê>åO¡>n>é¤>Wƒ=ÌC¯¼HgڽвC¾—qŒ¾¶óµ¾ï!Þ¾|_¿@³¿;ñ%¿9ù5¿f²D¿öQ¿b²]¿„Óg¿•?p¿Ùêv¿MÊ{¿HÑ~¿?ü¿I¿ž·|¿ºNx¿ûr¿Ãj¿Ýb`¿Ë U¿¿#H¿CÉ9¿¸*¿u ¿Y¿Ïôç¾›'À¾)ä–¾V+Y¾«ø¾vÅ.½H/=9ï>"Y>æî–>1#À>ðç> ?Œ?ð*? Ç9?@'H?z U?·a`? j?4r?%Nx?ƒ¸|?ÖH?Eü?‚Ñ~?IÉ{?yëv?g@p?"Ñg?“³]?Þ÷Q?Í®D?æú5? ó%?0µ?¦Z?9&Þ>)øµ>ÈfŒ>)¼C>9zÚ=®<Dƒ½~›¾Ûwn¾Z¡¾6<ʾ¤ñ¾ùª ¿òw¿Â.¿N€=¿´„K¿ŠX¿Ñöb¿1Al¿‡Îs¿j”y¿.‰}¿Œ¢¿^Þ¿6<~¿ƒ½z¿[ku¿¼Nn¿fqe¿^êZ¿cÊN¿Ü"A¿B2¿ø¾!¿ˆ8¿i;û¾«=Ô¾q³«¾þؾ6.¾‘鮽8Š~84é®=ì5.>çØ>[³«>•=Ô>U;û>~8?ï¾!?92?Ô"A?\ÊN?XêZ?`qe?¸Nn?Wku?½z?4<~?^Þ?Œ¢?0‰}?m”y?ŠÎs?5Al?Ööb?X?»„K?V€=?Ë.?üw?« ?'¤ñ>K<Ê>¥Z¡> xn>¬›>vDƒ=ƒŽ¯¼ÜyÚ½û»C¾²fŒ¾øµ¾$&Þ¾œZ¿&µ¿ó%¿Þú5¿Æ®D¿×÷Q¿³]¿Ñg¿c@p¿vëv¿GÉ{¿Ñ~¿Eü¿×H¿…¸|¿(Nx¿8r¿j¿½a`¿€ U¿H'H¿¨Ç9¿ù*¿–¿) ¿¥ðç¾G#À¾üî–¾5"Y¾gï¾ /½D/=}ø>(+Y>ä–>†'À>ºôç>P?l ?¯*?;É9?¸#H?Å U?×b`?¿j?÷r?·Nx?œ·|?I??ü?IÑ~?OÊ{?Üêv?™?p?‰Óg?h²]?‡öQ?m²D?Aù5?Dñ%?I³?†_?"Þ>Ìóµ>­qŒ>þ²C>¥gÚ=BE¯<¾Vƒ½»¤¾ñ€n¾ÏO¡¾€@ʾ1¨ñ¾:¦ ¿Êy¿y .¿à=¿DK¿ÊX¿å÷b¿?l¿=Ïs¿ï”y¿eˆ}¿¬¢¿KÞ¿ð;~¿¨¾z¿°ju¿âMn¿ése¿(éZ¿ÉN¿”&A¿”2¿)½!¿š6¿HEû¾j9Ô¾ ¯«¾óã¾å,.¾ôÖ®½›ü×·Ñû®=!?.>lÝ>¯¨«>ÕAÔ>g?û>Ð3?¾À!?ç2?]$A?ÇN?ŽëZ?jre?¦Ln?lu?ù½z?Š;~?qÞ?l¢?݈}?¯•y?ÔÍs?O@l?uùb?OX?PƒK?%„=?.?$v?© ?$®ñ>8Ê>6V¡>Žn>p’>Ñ1ƒ=JÙ®¼pŒÚ½'ÅC¾0kŒ¾}íµ¾Y*Þ¾ž\¿Š°¿Êô%¿‚ü5¿D°D¿™ôQ¿¸´]¿Òg¿n>p¿ìv¿³É{¿öÐ~¿Lü¿ªH¿&¸|¿‰Ox¿vr¿j¿wd`¿4 U¿Ó%H¿ŽË9¿:*¿·¿- ¿¾úç¾óÀ¾†ê–¾Y8Y¾#æ¾®ú.½ê.=À>I4Y>‰è–>À>äøç>K ?á?n*?×Ê9?-%H?¡ U?÷c`?±j?r?HOx?ü·|?–H?9ü?Ñ~?ãÉ{?Zìv?Ê>p?‹Òg?=µ]?1õQ?ï°D?=ý5?}ï%?b±?ƒ]?9,Þ>nïµ>0mŒ>;ÉC>UÚ=Šú®<„)ƒ½ø­¾Šn¾=T¡¾6ʾO¬ñ¾/¨ ¿Ru¿/".¿rƒ=¿¯‚K¿ÀX¿úøb¿è?l¿ƒÍs¿t•y¿¸ˆ}¿^¢¿8Þ¿ª;~¿/¾z¿Mlu¿Mn¿àre¿ìZ¿¢ÇN¿ %A¿¦2¿Y»!¿¬4¿7Aû¾ºCÔ¾¤ª«¾nß¾9C.¾VÄ®½³ä%7«Î®=UH.>ðá>­«>†7Ô>yCû>¾5?Z¼!?”2?å%A?fÈN?žèZ?sse?Mn?eju?r¾z?Ñ;~?BÞ?L¢?Šˆ}?*•y?ŽÏs?i?l?`øb?Y X?æK?“‚=?iBÊ>ÈQ¡>ü„n>ר>,ƒ=$¯¼a_Ú½RÎC¾®oŒ¾Úñµ¾$ Þ¾¡^¿p²¿yð%¿'þ5¿Ã±D¿ïõQ¿ã±]¿Óg¿=?p¿•êv¿Ê{¿/Ñ~¿<ü¿~H¿Ç·|¿øNx¿Mr¿*j¿Wc`¿Y U¿^$H¿òÉ9¿v*¿Ø¿2 ¿”öç¾s)À¾æ–¾8/Y¾œü¾YÕ.½f/=Gë>j=Y>í–>Z!À>Êîç>G ?Á?2*?rÌ9?¢&H?ì U?=a`?£j?âr?çMx?[¸|?ÃH?Hü?ÖÐ~?wÉ{?½ëv?¿@p?ŽÑg?´]?oøQ?p¯D?™û5?Íó%?|¯?[?(Þ>úµ>²hŒ>ÀC>!‚Ú=Ó¯®<)<ƒ½—¾“n¾¬X¡¾b:ʾR¢ñ¾$ª ¿*w¿.¿…=¿„K¿X¿[öb¿Ï@l¿9Îs¿2”y¿ ‰}¿~¢¿fÞ¿c;~¿¶½z¿£ku¿On¿Öqe¿âêZ¿ùÊN¿ƒ#A¿ø2¿½¿!¿¾2¿%=û¾z?Ô¾Pµ«¾êÚ¾:.¾}ñ®½§ð>8Há®=2.>uæ>|±«>Æ;Ô>š9û>¬7?*¾!?ƒ2?m'A?ÆÉN?ÔéZ?ðpe?[Nn?ku?N½z?<~?VÞ?š¢?8ˆ}?¥”y?ØÎs?—Al?L÷b?X?U…K?=?†.?Äx?#¥ ?è¥ñ>>Ê>ˆ\¡>ç{n>›Ÿ>eLƒ=¸n¯¼õqÚ½¸C¾,tŒ¾8öµ¾Z$Þ¾ÁY¿W´¿Aò%¿+ú5¿B³D¿E÷Q¿³]¿±Ðg¿ @p¿3ëv¿É{¿iÑ~¿Cü¿êH¿g·|¿fNx¿‹r¿uj¿8b`¿ U¿æ'H¿WÈ9¿·*¿b¿6¿jòç¾%À¾âð–¾&Y¾Xó¾æ//½»4/=‹ô>F'Y>vñ–>®%À>ôòç>w? ?ñ*?ŒÈ9?(H?8 U?]b`?Xj?¤r?yNx?s·|?ðH?Bü?aÑ~? É{?ëv?ð?p?õÓg?ç²]?÷Q?³D?ôù5?ò%?´?~Y?Î#Þ>§õµ>—sŒ>å¶C>oÚ= e¯<ÏNƒ½Í ¾}n¾]¡¾­>ʾp¦ñ¾d¥ ¿y¿¾.¿5=¿„…K¿BX¿o÷b¿ >l¿ïÎs¿·”y¿Bˆ}¿ž¢¿SÞ¿<~¿>½z¿ùju¿?Nn¿Yte¿¬éZ¿™ÉN¿;'A¿K2¿î½!¿l7¿9û¾9;Ծ갫¾ßå¾Ð0.¾ßÞ®½Þ—+¸æó®=6;.>€Û>⵫>@Ô>¬=û>þ2?ù¿!?02?¶#A?'ËN? ëZ?ùqe?ILn?¹ku?ƽz?m;~?iÞ?z¢?‰}? ”y?!Îs?±@l?êùb?ØX?ëƒK?Є=?Ï.?ív?ã© ?Ê¡ñ>Ô9Ê>X¡>ð‘n>^–>À9ƒ=¹®¼ˆ„Ú½@ÁC¾GiŒ¾–úµ¾(Þ¾Ã[¿»¯¿ô%¿Ïû5¿¡¯D¿›øQ¿9´]¿®Ñg¿>p¿Ñëv¿…É{¿ÝÐ~¿Iü¿½H¿O¸|¿ÕMx¿Ér¿ƒj¿òd`¿Â U¿q&H¿=Ì9¿ø*¿ƒ¿ ¿@îç¾Ê À¾lì–¾<g0Y>£æ–>*À>÷ç>s ??°*?(Ê9?Ž$H?ƒ U?}c`?Jj?gr? Ox?Ó·|?ƒH?;ü?(Ñ~?Ê{?êv?"?p?÷Òg?¼µ]?ÃõQ?‘±D?ðý5??ð%?1²?^^?™Þ>Jñµ>oŒ>"ÍC>ù\Ú=U¯<•!ƒ½ ª¾)†n¾[R¡¾÷BÊ¾Žªñ¾Y§ ¿Št¿t!.¿Ç‚=¿‚K¿ƒ X¿„øb¿†?l¿¦Ïs¿<•y¿•ˆ}¿P¢¿@Þ¿Ç;~¿b¾z¿Oju¿eMn¿Pse¿›ìZ¿8ÈN¿²%A¿]2¿¼!¿~5¿òBû¾ù6Ô¾ƒ¬«¾[á¾$G.¾BÌ®½!±¶¿Æ®=jD.>à>6««>GDÔ>½Aû>ì4?•»!?Ý2?>%A?ÐÇN?@ìZ?se?$Mn?clu??¾z?³;~?:Þ?Z¢?®ˆ}?c•y?kÍs?Ë?l?Öøb?â X?€‚K?>ƒ=?ö!.?u?î§ ?Ç«ñ>Š5Ê>«S¡>Úˆn>Ƭ>'ƒ=6¯¼yWÚ½kÊC¾ÄmŒ¾ÿïµ¾Ä,Þ¾Æ]¿¡±¿¸ï%¿tý5¿ ±D¿^õQ¿dµ]¿¬Òg¿å>p¿oìv¿ñÉ{¿Ñ~¿9ü¿‘H¿ï·|¿5Ox¿r¿‘j¿Òc`¿æ U¿ý$H¿¡Ê9¿4*¿£¿ ¿Zøç¾vÀ¾õç–¾3Y¾¾;å.½ƒÿ.=Vç>ˆ9Y>ë–>‚À>Hûç>o ?õ?t*?ÃË9?&H?_ U?œd`?<j?r?œOx?2¸|?°H?Kü?îÐ~?¥É{?ìv?S>p?úÑg?’´]?ùQ?°D?Lü5?ô%?K°?\\?Î)Þ>ììµ>›jŒ>÷ÃC>ŠÚ=žÏ®<:4ƒ½¢“¾?n¾ÉV¡¾8ʾ­®ñ¾N© ¿av¿M.¿Y„=¿ƒK¿yX¿˜ùb¿m@l¿ëÍs¿Á•y¿èˆ}¿p¢¿nÞ¿;~¿ê½z¿ëku¿ŠLn¿Gre¿eëZ¿ËN¿*$A¿¯2¿‚À!¿3¿à>û¾IAÔ¾¨«¾Öܾï=.¾iù®½-®þ7\Ù®=..>‰ä>œ¯«>÷9Ô>ÏEû>Ú6?e½!?Ì2?Æ&A?0ÉN?PéZ? te?þMn?Çju?·¾z?ù;~?MÞ?§¢?[ˆ}?Þ”y?%Ïs?ä>l?Á÷b?¡X?ð…K?¬=?@ .?y?ù¥ ?¨§ñ>ò?Ê>Än>‰£>TTƒ=íN¯¼ jÚ½.´C¾BrŒ¾\ôµ¾"Þ¾È_¿ˆ³¿ñ%¿xù5¿Ÿ²D¿´öQ¿²]¿ªÓg¿³?p¿ðêv¿]Ê{¿PÑ~¿@ü¿ýH¿·|¿¤Nx¿Þr¿Ÿj¿²b`¿š U¿…(H¿É9¿u*¿. ¿¿0ôç¾ö&À¾~ã–¾ú)Y¾J÷¾È?/½Ø$/=šð>c#Y>ï–>Ö#À>/ñç>k ?Ô?3*?ÝÇ9?x'H?« U?âa`?.j?Qr?;Nx?’¸|?ÝH?Dü?zÑ~?9É{?bëv?H@p?üÐg?g³]?«÷Q?³³D?§ú5?Èò%?ç´?YZ?™%Þ>ƒ÷µ>fŒ>̺C>uwÚ=ׄ¯<àFƒ½Þœ¾6yn¾8[¡¾Ù<ʾ°¤ñ¾D« ¿9x¿.¿Š€=¿ê„K¿¹X¿úöb¿SAl¿¢Îs¿~”y¿;‰}¿¢¿[Þ¿+<~¿q½z¿Aku¿œNn¿>qe¿0êZ¿/ÊN¿â'A¿2¿³¾!¿>8¿Î:û¾=Ծɲ«¾Qؾ»4.¾Ë殽o1k¸úë®=K7.>“Ù>´«>7>Ô>ð;û>Ç8?4¿!?y2?#A?‘ÊN?†êZ?ˆqe?ÙNn?qku?“½z??<~?aÞ?‡¢?$‰}?Y”y?oÎs?Al?­öb?`X?…„K?{…=?Š.?µw?¸ª ?Š£ñ>¨;Ê>üY¡>®vn>Lš>¯Aƒ=´™®¼¡|Ú½Y½C¾]gŒ¾ºøµ¾Å&Þ¾èZ¿oµ¿Fó%¿û5¿ÿ®D¿ øQ¿º³]¿CÑg¿‚@p¿Žëv¿WÉ{¿ŠÑ~¿Fü¿ÐH¿w¸|¿Nx¿r¿êj¿’a`¿O U¿'H¿ìÌ9¿¶*¿N¿Þ ¿ðç¾¢"À¾Rî–¾Ù Y¾î¾s/½KÊ.=Þù>…,Y>½ä–>+(À>Yõç>›?³ ?ñ*?yÉ9?ð#H?ö U?c`?ãj?r?ÍNx?ª·|? I?>ü?@Ñ~??Ê{?Äêv?z?p?cÓg?<²]?UöQ?4²D?£þ5?ñ%?³?9_?c!Þ>%óµ>qŒ> ±C>ádÚ= :¯<¦ƒ½¦¾L‚n¾xP¡¾$AʾΨñ¾„¦ ¿z¿º .¿‚=¿zK¿úX¿øb¿$?l¿XÏs¿•y¿rˆ}¿°¢¿HÞ¿å;~¿–¾z¿—ju¿ÂMn¿Áse¿úèZ¿ÎÈN¿Y&A¿2¿ä¼!¿P6¿­Dû¾È8Ô¾c®«¾G㾆+.¾.Ô®½ês«·Ó¾®=€@.>Þ>V©«>wBÔ>@û>4?Á!?'2?—$A?:ÇN?¼ëZ?‘re?ÇLn?lu? ¾z?•;~?tÞ?h¢?ш}?œ•y?¹Ís?-@l?Lùb?X?ƒK?éƒ=?±".?Þu?è ?‡­ñ>]7Ê>U¡>·Œn>‘> /ƒ=k䮼’OÚ½„ÆC¾ÛkŒ¾#îµ¾ú*Þ¾ë\¿Ò°¿õ%¿Áü5¿}°D¿ÌôQ¿å´]¿@Òg¿>p¿,ìv¿ÃÉ{¿þÐ~¿Mü¿¤H¿¸|¿sOx¿Yr¿øj¿Ld`¿ U¿›%H¿PË9¿ò*¿o¿â ¿úç¾MÀ¾Ûé–¾ý6Y¾Âä¾õ.½ ï.=eã>¦5Y>3é–>ªÀ>ƒùç>— ?)?°*?Ë9?d%H?Ò U?"d`?Õj?<r?^Ox? ¸|?H?8ü?Ñ~?ÓÉ{?Cìv?«>p?eÒg?µ]?þôQ?¶°D?ÿü5?Põ%?±?7]?˜+Þ>Çîµ>„lŒ>ÞÇC>MRÚ=iï®â>½­«>(8Ô>Dû>6?Ÿ¼!?Ô2?&A?šÈN?ÌèZ?šse?¡Mn?~ju?„¾z?Û;~?EÞ?H¢?~ˆ}?•y?sÏs?F?l?7øb?) X?°K?W‚=?ú .?Uz?Φ ?i©ñ>ÆAÊ>Q¡>¢ƒn>w§>dƒ="/¯¼%bÚ½G°C¾YpŒ¾òµ¾Å Þ¾î^¿¹²¿½ð%¿eþ5¿ü±D¿"öQ¿²]¿>Óg¿[?p¿­êv¿/Ê{¿8Ñ~¿=ü¿wH¿¸·|¿âNx¿0r¿j¿,c`¿' U¿'$H¿µÉ9¿3*¿ù ¿æ¿õõç¾Î(À¾eå–¾Ü-Y¾;û¾ÉÏ.½õ/=©ì>Y>ªí–>ÿ!À>iïç>“ ??t*?¯Ì9?Ù&H? U?ha`?Çj?ÿr?ýMx?i¸|?ÊH?Gü?ÍÐ~?gÉ{?¥ëv? @p?hÑg?æ³]?<øQ?7¯D?Zû5?‰ó%?3¯?4[?c'Þ>^ùµ>hŒ>²¾C>\Ú=±¤®<ñ>ƒ½ð˜¾Xun¾UY¡¾;ʾï¢ñ¾nª ¿pw¿I.¿@…=¿P„K¿1X¿„öb¿ñ@l¿TÎs¿E”y¿‰}¿ƒ¢¿cÞ¿Y;~¿¥½z¿Šku¿ùNn¿¯qe¿³êZ¿ÄÊN¿H#A¿¸2¿x¿!¿t2¿‰<û¾×>Ô¾¨´«¾>Ú¾¦8.¾·î®½5U8ä®=`3.>§×>#²«>h<Ô>5:û>õ7?o¾!?Ã2?¨'A?ûÉN?êZ?qe?|Nn?(ku?_½z?!<~?XÞ?•¢?+ˆ}?’”y?½Îs?uAl?"÷b?éX?…K?Å€=?D.?~x?Ù¤ ?K¥ñ>{=Ê>ß[¡>Œzn>:ž>žIƒ=Úy¯¼¹tÚ½r¹C¾teŒ¾Þöµ¾ú$Þ¾Z¿ ´¿…ò%¿iú5¿{³D¿x÷Q¿;³]¿×Ðg¿*@p¿Këv¿)É{¿qÑ~¿Dü¿ãH¿Y·|¿PNx¿nr¿Qj¿ b`¿Ü U¿¯'H¿È9¿t*¿¿ê¿Ëñç¾y$À¾8ð–¾»$Y¾÷ñ¾V*/½J:/=íõ>¢(Y>Öâ–>S&À>“óç>Ã?ç?3*?ÉÈ9?N(H?i U?ˆb`?|j?Ár?Nx?‚·|?öH?Aü?YÑ~?ûÈ{?ëv?Ò?p?ÏÓg?»²]?æöQ?ײD?¶ù5?Âñ%?г?2Y?.#Þ>õµ>ërŒ>‡µC>ÈlÚ=ëY¯<–Qƒ½-¢¾n~n¾•N¡¾Q?ʾ §ñ¾¯¥ ¿Gy¿ .¿q=¿º…K¿rX¿™÷b¿Â>l¿ Ïs¿Ê”y¿Oˆ}¿£¢¿PÞ¿<~¿,½z¿àju¿Nn¿2te¿}éZ¿dÉN¿'A¿ 2¿©½!¿"7¿x8û¾—:Ô¾B°«¾3å¾q/.¾Ü®½†S¸¬ö®=•<.>,Ü>w§«>¨@Ô>G>û>G3?>À!?p2?ð#A?[ËN?8ëZ? re?jLn?Òku?ؽz?w;~?lÞ?u¢?ôˆ}? ”y?Îs?Ž@l?Áùb?¨X?µƒK?”„=?Ž.?§v?˜© ?-¡ñ>19Ê>pW¡>•n>þ”>ù6ƒ= Ä®¼M‡Ú½žÂC¾òiŒ¾Gìµ¾0)Þ¾\¿°¿Lô%¿ü5¿Ú¯D¿ÎøQ¿f´]¿ÔÑg¿5>p¿éëv¿•É{¿æÐ~¿Jü¿·H¿@¸|¿¿Mx¿¬r¿_j¿Çd`¿ U¿:&H¿ÿË9¿µ*¿;¿º ¿¡íç¾% À¾Âë–¾à:Y¾³è¾/½¾ß.=0ÿ>Ã1Y>Mç–>ÓÀ>½÷ç>¿ ?]?ò*?eÊ9?Æ$H?µ U?§c`?nj?ér? Ox?á·|?ŠH?:ü?Ñ~?Ê{?iêv??p?ÑÒg?µ]?õQ?X±D?²ý5?ûï%?é±?^?øÞ>£ðµ>nnŒ>ÅËC>5ZÚ=4¯<\$ƒ½j«¾„‡n¾S¡¾è4ʾ+«ñ¾¤§ ¿Ðt¿¶!.¿ƒ=¿K‚K¿² X¿­øb¿©?l¿PÍs¿O•y¿¡ˆ}¿U¢¿=Þ¿½;~¿P¾z¿5ju¿DMn¿)se¿mìZ¿ÈN¿x%A¿2¿Ù»!¿45¿WBû¾W6Ô¾Û««¾®à¾ÅE.¾|É®½ÞÑ3…É®=ÉE.>°à>Þ««>Y6Ô>YBû>55?Ú»!?2?y%A?ÈN?nìZ?)se?DMn?6ju?Q¾z?½;~?=Þ?U¢?¡ˆ}?O•y?PÍs?¨?l?­øb?² X?J‚K?ƒ=?µ!.?Ït?£§ ?*«ñ>æ4Ê>S¡>‡n>e«>S$ƒ=X¯¼>ZÚ½ÉËC¾pnŒ¾¥ðµ¾úÞ¾^¿ê±¿üï%¿²ý5¿Y±D¿‘õQ¿µ]¿ÒÒg¿?p¿jêv¿Ê{¿Ñ~¿:ü¿ŠH¿á·|¿ Ox¿ér¿mj¿§c`¿´ U¿Å$H¿dÊ9¿ñ*¿\¿¾ ¿»÷ç¾ÑÀ¾Kç–¾¿1Y¾,ÿ¾¬ß.½/=¸è>ä:Y>Äë–>' À>£íç>» ?<?¶*?Ì9?;&H?‘ U?Çd`?`j?¬r?¿Mx?A¸|?·H?Jü?æÐ~?•É{?èëv?5>p?ÔÑg?e´]?ÎøQ?Ú¯D? ü5?Kô%?°?\?-)Þ>Eìµ>ðiŒ>™ÂC>D‡Ú=|Ä®<7ƒ½•¾™n¾rW¡¾39ʾ/¡ñ¾™© ¿§v¿.¿•„=¿µƒK¿¨X¿Âùb¿@l¿Îs¿ ”y¿ôˆ}¿u¢¿kÞ¿w;~¿Ø½z¿Òku¿jLn¿ re¿7ëZ¿ZËN¿ï#A¿o2¿=À!¿F3¿E>û¾¦@Ô¾u§«¾*ܾ<.¾£ö®½o›8"Ü®=u/.>5å>D°«>™:Ô>y8û>#7?ª½!? 2?'A?eÉN?~éZ?2te?Nn?àju?,½z?<~?PÞ?£¢?Nˆ}?Ê”y? Ïs?Â>l?˜÷b?qX?º…K?p=?ÿ.?Fy?®¥ ? §ñ>N?Ê>“N¡>j~n>)¢>Qƒ=Z¯¼ÑlÚ½‹µC¾îrŒ¾õµ¾0#Þ¾3Y¿Ñ³¿Ãñ%¿¶ù5¿Ø²D¿çöQ¿»²]¿ÐÓg¿Ò?p¿ëv¿ûÈ{¿YÑ~¿Aü¿öH¿‚·|¿ŽNx¿Ár¿{j¿‡b`¿i U¿M(H¿ÉÈ9¿2*¿æ¿Â¿‘óç¾Q&À¾Ôâ–¾ž(Y¾èõ¾9:/½h*/=ûñ>À$Y>:ð–>{$À>Íñç>ë??u*?È9?¯'H?Ü U? b`?Rj?nr?QNx?Y·|?ãH?Dü?qÑ~?(É{?Jëv?*@p?ÖÐg?:³]?x÷Q?z³D?iú5?„ò%?Ÿ´? Z?ø$Þ>Üöµ>reŒ>n¹C>°tÚ=¶y¯<§Iƒ½?ž¾zn¾á[¡¾}=ʾM¥ñ¾Ú¤ ¿x¿E.¿Æ€=¿ …K¿éX¿#÷b¿uAl¿½Îs¿’”y¿+ˆ}¿•¢¿XÞ¿!<~¿_½z¿(ku¿{Nn¿qe¿êZ¿úÉN¿§'A¿Â2¿n¾!¿ô7¿3:û¾f<Ô¾!²«¾¥×¾\3.¾䮽íT¸ü®®=3X.>ºé>«´«>Ù>Ô>‹<û>u2?F¹!?x2?‰(A?ÅÊN?´êZ?¯qe? Ln?Ciu?B¿z?I<~?cÞ?ƒ¢?‰}? –y?ÄÐs?Ü=l?„öb?0X?O„K??…=?&$.? q?¹£ ?í¢ñ>;Ê>SY¡>s”n>¸> ÿ‚=Ƥ¯¼eÚ½·¾C¾ hŒ¾lêµ¾ûÞ¾b¿·µ¿Šó%¿[û5¿8¯D¿©óQ¿æ¯]¿ÍÔg¿¡@p¿¥ëv¿gÉ{¿ÎÐ~¿1ü¿1H¿"·|¿ýMx¿þr¿Æj¿Ae`¿U¿Ü!H¿-Ç9¿t*¿¿’ ¿«ýç¾Ñ0À¾^Þ–¾}Y¾¤ì¾ã/½ÛÏ.=‚Û>&MY>±ô–>Ð(À>÷õç>ç?‘?9*?7Ï9?$)H?( U?-c`?j?—r?ðLx?ÿ¸|?I?=ü?8Ñ~?.Ê{?Éìv?Bp?ØÏg?²]?"öQ?û±D?eþ5?Ôö%?5¬? X?à Þ>òµ>WpŒ>«ÏC>¿¡Ú= /®>î>¹«>CÔ>@û>c4?»!?§2?*A?&ÌN?êëZ?¹re?çLn?íiu?€¼z?<~?wÞ?c¢?Ĉ}?ˆ•y?Ðs?Cl?oõb?ïX?ä‚K?­ƒ=?o".?æ{?Ä¡ ?Ïžñ>¹6Ê>äT¡>]‹n>T¯>!lƒ=~ﯼù‘Ú½âÇC¾†lŒ¾Êîµ¾0Þ¾UV¿ž·¿Qõ%¿ÿü5¿¶°D¿ÿôQ¿±]¿Ïg¿oAp¿Cìv¿ÓÉ{¿Ñ~¿8ü¿6I¿Ã¶|¿kMx¿<r¿Ôj¿!d`¿AU¿a*H¿’Å9¿µ*¿(¿– ¿ùç¾},À¾{ø–¾[Y¾`㾎ï.½0õ.=Æä>¼Y>'ù–>$-À>!úç>ã ?p?ø*?ÐÅ9?™*H?sU?Md`?ùj?Yr?Mx?Ѷ|?=I?7ü?þÐ~?ÂÉ{?+ìv?PAp?¤Õg?ä°]?ËôQ?}°D?Àü5? õ%?T·?V?Þ>!îµ>ÙkŒ>€ÆC>+Ú=8ä¯<ñnƒ½¸°¾¼Œn¾U¡¾_7ʾnŸñ¾¢ ¿.|¿²".¿êƒ=¿ƒK¿ X¿™õb¿=l¿)Ðs¿œ•y¿Ñˆ}¿h¢¿tÞ¿…<~¿n¼z¿Ôiu¿ÇLn¿‘re¿»ëZ¿ðËN¿Ö)A¿g2¿Ïº!¿4¿@û¾uBÔ¾g¸«¾í¾ó .¾Ê¾®½¼¬77Ô®=‹+.>ÏÓ>w½«>ZGÔ>¯Dû>Q6?ä¼!?U2?!A?†ÍN? íZ?Âse?ÂMn?—ju?ù¼z?õ:~?ŠÞ?C¢?rˆ}?•y?XÏs?9Bl?Áûb?¯X?zK?‚=?¹ .?z?8­ ?±šñ>o2Ê>vP¡>G‚n>¦>|Yƒ=S:®¼Œ¤Ú½ÑC¾qŒ¾'óµ¾e!Þ¾XX¿~¬¿÷%¿¤þ5¿5²D¿UöQ¿<²]¿ÿÏg¿·ü¿ I¿ñ¸|¿ÚLx¿yr¿âj¿c`¿ö U¿ì(H¿ùÎ9¿ö *¿I¿š¿Wõç¾)(À¾ô–¾ÆKY¾Ú¾9Ê.½…/= î>Ý Y> ß–>x1À>Kþç>ß ?O?·*?kÇ9?"H?¿U?me`?ëj?r?Nx?0·|?7H?0ü?ÅÐ~?VÉ{?Žëv?@p?§Ôg?¹·]?uóQ?þ®D?û5?Eó%?nµ?Êa?XÞ>Ãéµ>[gŒ>U½C>˜|Ú=™¯<Ùƒ½õ¹¾Ñ•n¾þY¡¾ª;ʾŒ£ñ¾¤ ¿gq¿h$.¿|…=¿†„K¿aX¿­öb¿þ=l¿ÿËs¿!–y¿$‰}¿ˆ¢¿`Þ¿?<~¿/¿z¿)iu¿ìKn¿‡qe¿…êZ¿ÊN¿N(A¿82¿¹!¿*2¿î;û¾5>Ô¾´«¾ é¾ÏV.¾-¬®½Xyk8Ôæ®=¿4.>TØ>¸£«>šKÔ>ÁHû>?8?´¾!?2?¢"A?xÅN?VîZ?Ëte?œNn?Bku?q½z?;;~?Þ?#¢?ˆ}?~”y?¡Îs?RAl?¬úb? X?€K?‰€=?.?8x?C« ?ɲñ>$.Ê>L¡>2yn>Úœ>×Fƒ= …®¼Û7Ú½9ÚC¾‚uŒ¾…÷µ¾›%Þ¾ZZ¿e®¿±ì%¿H6¿´³D¿«÷Q¿g³]¿üÐg¿…=p¿ív¿«Ê{¿zÑ~¿Dü¿ÝH¿’¸|¿-Px¿·r¿ðj¿âa`¿ª U¿w'H¿]Í9¿,*¿j¿ž¿-ñç¾Ô#À¾Žï–¾¥BY¾R¾ä¤.½Ú?/=N÷>þ)Y>ã–>$À>uè>Û?. ?v*?É9?‰#H?+U?Œf`?Ýj?Þr?¤Nx?·|?dH?Vü?‹Ð~?êÈ{?ðêv?³?p?©Óg?޶]?GûQ?­D?wù5?~ñ%?‡³?È_?ø0Þ>fåµ>ÝbŒ>)´C>jÚ=ÉN¯<~ƒ½éƒ¾çžn¾m^¡¾ô?ʾª§ñ¾ú¥ ¿?s¿c.¿‡=¿ð…K¿¡X¿Â÷b¿å>l¿µÌs¿¦–y¿v‰}¿§¢¿MÞ¿ù;~¿·¾z¿ mu¿Kn¿~pe¿OéZ¿0ÉN¿Æ&A¿Š2¿—Ã!¿<0¿Ü7û¾õ9Ô¾š¯«¾‡ä¾›M.¾¯½ixÀ8qù®=ô=.>ØÜ>¨«>»2Ô>ÓLû>-:?ƒÀ!?°2?+$A?ØÆN?@çZ?Ôue?wOn?ìku?ê½z?;~?-Þ?Þ¢?̇}?ù“y?ëÍs?l@l?˜ùb?à X?YˆK?÷~=?M.?`v?N© ?«®ñ>@GÊ>˜G¡>pn>“>14ƒ=ÂÏ®¼oJÚ½’¤C¾zŒ¾ãûµ¾Ð)Þ¾]\¿L°¿xî%¿¬ö5¿2µD¿ùQ¿’´]¿úÑg¿T>p¿ãév¿Ë{¿³Ñ~¿Kü¿°H¿2¸|¿œOx¿)r¿þj¿Â``¿_ U¿&H¿ÂË9¿n*¿]#¿¢¿íç¾€À¾ë–¾„9Y¾¾S/½/e/=’>3Y>÷ç–>xÀ>êç>Ö?"?5*?¢Ê9?ý$H?w U?ø_`?Ïj?¡r?6Ox?ï·|?‘H?Oü?ÛÑ~?~È{?Rêv?ä>p?¬Òg?cµ]?ñùQ?>¶D?Ó÷5?·ï%? ±?Å]?Â,Þ>ñþµ>_^Œ>þªC>pWÚ=¯<$'ƒ½&¾¿in¾Üb¡¾?Dʾɫñ¾ï§ ¿u¿.¿Þ}=¿[‡K¿â X¿Öøb¿Ë?l¿kÍs¿œ“y¿É‰}¿Ç¢¿:Þ¿³;~¿>¾z¿clu¿Pn¿uoe¿èZ¿ÏÇN¿=%A¿Ý2¿ÈÁ!¿‡;¿Ê3û¾µ5Ô¾4««¾à¾fD.¾z¯½ÙËô¸ ¯=)G.>]á>…¬«>û6Ô>5û><?SÂ!?]2?³%A?9ÈN?vèZ?Åoe?QPn?–lu?c¾z?È;~?@Þ?¾¢?°‰}?t“y?5Ís?†?l?ƒøb?‚ X?î†K?'ˆ=?–.?‰t?X§ ?Œªñ>õBÊ>ˆa¡>gn>`Š>Œ!ƒ=y¯¼]Ú½¾­C¾¸_Œ¾@¶¾.Þ¾_^¿2²¿?ð%¿Qø5¿s¬D¿WúQ¿½µ]¿øÒg¿"?p¿êv¿ŸÈ{¿íÑ~¿Qü¿ƒH¿Ó·|¿ Ox¿fr¿†j¿¢_`¿ U¿Ž$H¿'Ê9¿¯*¿~!¿>¿Ùèç¾,À¾¡æ–¾c0Y¾Ëý¾þY/½ÀŠ.=Ö >@nì–>Ì À>Bîç>;?í#?ô*?=Ì9?r&H? U?a`?Gj?cr?ÇOx?O¸|?½H?Iü?¢Ñ~?öÊ{?´év?>p?®Ñg?8´]?›øQ?À´D?o6?ðí%?º¯?Â[?(Þ>“úµ>§xŒ>Ó¡C>ÝDÚ=[¹®<É9ƒ½b–¾Õrn¾ìH¡¾‰Hʾç¯ñ¾ä© ¿îv¿Ð.¿p=¿K¿# X¿ëùb¿±@l¿"Îs¿!”y¿å‡}¿ç¢¿'Þ¿l;~¿Æ½z¿¹ku¿5On¿„ue¿ãæZ¿oÆN¿µ#A¿/2¿ø¿!¿™9¿šKû¾u1Ծͦ«¾}Û¾1;.¾Ý󮽪¸$Ÿ®=]P.>áå>ì°«>;;Ô>9û>Ñ0?"Ä!? 2?;'A?™ÉN?¬éZ?Îpe?SKn?@mu?Û¾z?<~?SÞ?ž¢?^‰}?~–y?~Ìs? >l?o÷b?AX?„…K?•†=?›%.?±r?c¥ ?n¦ñ>«>Ê>]¡>.œn>$>çƒ=0e¯¼–oÚ½é¶C¾6dŒ¾µæµ¾;2Þ¾b`¿´¿ò%¿õù5¿ò­D¿†òQ¿è¶]¿õÓg¿ñ?p¿ëv¿ É{¿Ð~¿Xü¿WH¿s·|¿yNx¿¤r¿”j¿6f`¿ÈU¿#H¿‹È9¿ð*¿Ÿ¿B¿6è¾×À¾*â–¾A'Y¾‡ô¾©4/½°.= Ó>aEY>äð–>!%À>lòç>7?ù?²*?ÙÍ9?ç'H? U?8b`?9j?ñr?YPx?®¸|?êH?Cü?iÑ~?ŠÊ{?Oív?G=p?°Ðg?³]?E÷Q?A³D?Êÿ5?Wø%?Ó­?ÀY?X$Þ>6öµ>)tŒ>y×C>I2Ú=£n®¸Â±®=.>fê>Rµ«>|?Ô>'=û>¿2?‹¹!?¸2?Ä(A?úÊN?âêZ?×qe?.Ln?]iu?T¿z?T<~?fÞ?~¢? ‰}?ù•y?©Ðs?¹=l?Zöb?X?„K?…=?ä#.?x}?n£ ?P¢ñ>`:Ê>ªX¡>“n>0·>Bü‚=误¼*‚Ú½ÀC¾´hŒ¾ëµ¾›Þ¾db¿¶¿Îó%¿šû5¿q¯D¿ÜóQ¿°]¿óÔg¿¿@p¿½ëv¿wÉ{¿ÖÐ~¿2ü¿*H¿·|¿çMx¿ár¿¢j¿e`¿[U¿¤!H¿ðÆ9¿1*¿À¿F ¿ ýç¾,0À¾³Ý–¾ Y¾Cë¾T/½kÕ.=äÜ>÷Y>[õ–>u)À>–öç>3 ?Ø?|*?tÏ9?\)H?Y U?Xc`?+j?´r?Mx? ¹|?I?<ü?/Ñ~?Ê{?²ìv?Bp?³Ïg?ã±]?ïõQ?±D?&þ5?ö%?ó¸?½W?" Þ>Øñµ>¬oŒ>NÎC>úžÚ=ì#®<_ƒ½Ü¨¾…n¾ÊQ¡¾¸3ʾí›ñ¾Î­ ¿œz¿=!.¿”‚=¿æK¿X¿­ôb¿~Bl¿ŽÏs¿+•y¿Šˆ}¿L¢¿„Þ¿à:~¿Õ¼z¿dju¿€Mn¿rse¿ÃìZ¿ÍN¿¤ A¿Ô2¿Z¼!¿½5¿wCû¾FÔ¾&¼«¾tÒ¾È(.¾¢Î®½Å$·_Ä®=µ#.>÷Ï>¹¹«>¼CÔ>8Aû>­4?Z»!?ç2?L*A?ZÌN?ìZ?àre?Mn?ju?’¼z?š<~?yÞ?^¢?¸ˆ}?t•y?óÏs?ýBl?Fõb?ÀX?®‚K?qƒ=?.".? {?y¡ ?2žñ>6Ê>;T¡>Šn>ó­>Ziƒ=Ÿú¯¼½”Ú½@ÉC¾2mŒ¾pïµ¾ÑÞ¾¢V¿æ·¿•õ%¿>ý5¿ï°D¿2õQ¿>±]¿'Ïg¿ŽAp¿[ìv¿ãÉ{¿Ñ~¿9ü¿/I¿´¶|¿VMx¿r¿°j¿÷c`¿U¿)*H¿UÅ9¿r*¿á¿J ¿âøç¾Ø+À¾Ñ÷–¾ÿY¾ÿá¾þé.½Àú.=(æ>Y>>Û–>É-À>Àúç>. ?¸?;*? Æ9?Ð*H?¥U?xd`?j?vr?—Mx?ß¶|?CI?6ü?öÐ~?²É{?ìv?1Ap?Õg?¸°]?™ôQ?D°D?ü5?Éô%? ·?»U?íÞ>zíµ>.kŒ>"ÅC>gŒÚ=Ù¯<¸qƒ½²¾Žn¾9V¡¾8ʾ  ñ¾Z¢ ¿t|¿ó".¿&„=¿QƒK¿PX¿Âõb¿:=l¿EÐs¿°•y¿Ýˆ}¿l¢¿qÞ¿z<~¿\¼z¿ºiu¿¦Ln¿ire¿ëZ¿¼ËN¿œ)A¿'2¿Šº!¿Ï3¿e?û¾ÓAÔ¾¿·«¾ä쾓.¾¼®½mŒØ7ýÖ®=ê,.>{Ô>úŸ«>üGÔ>JEû>š6?*½!?•2?T!A?ºÍN?NíZ?ése?âMn?±ju? ½z?;~?ŒÞ?>¢?eˆ}?ï”y?=Ïs?Bl?˜ûb?X?DK?ß=?x .?Éy?í¬ ?šñ>Ë1Ê>ÌO¡>í€n>¶¤>µVƒ=tE®¼Q§Ú½kÒC¾°qŒ¾Îóµ¾"Þ¾¤X¿Ç¬¿\÷%¿ãþ5¿n²D¿ˆöQ¿i²]¿%Ðg¿Ö9"Y>´ß–>tÀ>êþç>* ?—?ú*?©Ç9?K"H?ðU?—e`?j?9r?(Nx??·|?>H?/ü?¼Ð~?FÉ{?vëv?c@p?Ôg?·]?BóQ?Å®D?Ýú5?ó%?%µ?}a?¸Þ>éµ>°fŒ>÷»C>ÓyÚ=_ޝ< ƒ½U»¾,—n¾§Z¡¾M<ʾ)¤ñ¾O¤ ¿®q¿©$.¿¸…=¿¼„K¿X¿Ööb¿!>l¿Ìs¿5–y¿0‰}¿Œ¢¿^Þ¿4<~¿¿z¿iu¿ÌKn¿`qe¿WêZ¿[ÊN¿(A¿ø2¿»¸!¿á1¿S;û¾“=Ô¾Y³«¾_è¾pU.¾g©®½ØÞ€8šé®=6.>Ù>`¤«>/Ô>\Iû>ˆ8?ù¾!?B2?Ý"A?¬ÅN?„îZ?òte?½Nn?[ku?ƒ½z?F;~?Þ?¢?ˆ}?j”y?†Îs?0Al?ƒúb?Ô X?ÙK?M€=?Â.?ñw?øª ?,²ñ>-Ê>^K¡>×wn>z›>Dƒ=,®¼Ÿ:Ú½—ÛC¾-vŒ¾+øµ¾;&Þ¾§Z¿®®¿õì%¿‡6¿í³D¿Þ÷Q¿”³]¿"Ñg¿¤=p¿]év¿»Ê{¿‚Ñ~¿Eü¿ÖH¿ƒ¸|¿Px¿šr¿Ìj¿·a`¿y U¿@'H¿ Í9¿ê*¿"¿S¿Žðç¾/#À¾äî–¾HAY¾ñ¾TŸ.½jE/=¯ø>Z+Y>+ä–>ÉÀ>æç>&?v ?¸*?DÉ9?À#H?]U?·f`?j?ûr?ºNx?ž·|?kH?Uü?ƒÐ~?ÚÈ{?Øêv?”?p?ƒÓg?b¶]?ûQ?F­D?8ù5?:ñ%??³?{_?W0Þ>¿äµ>2bŒ>̲C>@gÚ=¨C¯„Ý>Ǩ«>]3Ô>Œ1û>v:?ÈÀ!?ð2?e$A? ÇN?nçZ?ûue?—On?lu?ü½z?Œ;~?0Þ?Ù¢?À‡}?å“y?ÐÍs?J@l?oùb?“ X?#ˆK?»~=? .?v?© ?®ñ>œFÊ>ïF¡>Ánn>=’>j1ƒ=ãÚ®¼3MÚ½ð¥C¾«zŒ¾‰üµ¾p*Þ¾©\¿”°¿¼î%¿ëö5¿kµD¿4ùQ¿¿´]¿ Òg¿s>p¿ûév¿CÈ{¿¼Ñ~¿Lü¿©H¿$¸|¿†Ox¿ r¿Új¿—``¿- U¿Ë%H¿…Ë9¿+*¿#¿W¿dìç¾ÛÀ¾mê–¾'8Y¾­¾Ãy/½¿j/=ó>{4Y>¡è–>À>·êç>Š?U"?w*?ßÊ9?5%H?¨ U?#``?ój?½r?KOx?þ·|?—H?Nü?ÓÑ~?nÈ{?:êv?Æ>p?†Òg?7µ]?¾ùQ?¶D?”÷5?sï%?X±?x]?",Þ>Kþµ>´]Œ> ©C>¬TÚ=ñø®<ë)ƒ½†Ž¾kn¾…c¡¾âDʾf¬ñ¾9¨ ¿\u¿[.¿~=¿‘‡K¿ X¿ùb¿í?l¿‡Ís¿¯“y¿ž‡}¿Ì¢¿7Þ¿¨;~¿,¾z¿Ilu¿ïOn¿Noe¿ëçZ¿›ÇN¿%A¿2¿ƒÁ!¿=;¿/3û¾5Ô¾Œª«¾Vß¾C.¾´¯½­©é¸Õ¯=ˆH.> â>-­«>7Ô>ž5û>,/?˜Â!?2?í%A?mÈN?¤èZ?ìoe?rPn?¯lu?u¾z?Ò;~?CÞ?¹¢?¤‰}?`“y?Ís?d?l?Zøb?R X?¸†K?ë‡=?U.?Ct?§ ?ï©ñ>RBÊ>ß`¡>¬en>‰>Ń=›%¯¼Ç_Ú½¯C¾c`Œ¾ç¶¾¦.Þ¾¬^¿{²¿ƒð%¿ø5¿¬¬D¿ŠúQ¿êµ]¿Óg¿A?p¿™êv¿¯È{¿lÐ~¿Rü¿}H¿Å·|¿ôNx¿Ir¿bj¿w_`¿âU¿V$H¿éÉ9¿l*¿7!¿ó¿:è羆À¾öå–¾/Y¾iü¾nT/½P.=7 >œ=Y>í–>q!À>áîç>†?a?6*?{Ì9?ª&H?ô U?Ca`?kj?€r?ÝOx?]¸|?ÄH?Hü?™Ñ~?æÊ{?œév?÷=p?ˆÑg? ´]?høQ?‡´D?06?¬í%?q¯?v[?ì'Þ>íùµ>üwŒ>u C>BÚ=9®®<<ƒ½Ã—¾0tn¾•I¡¾-Iʾ„°ñ¾.ª ¿4w¿.¿¬=¿GK¿S X¿úb¿Ô@l¿=Îs¿4”y¿ñ‡}¿¢¿$Þ¿b;~¿´½z¿Ÿku¿On¿]ue¿µæZ¿:ÆN¿z#A¿ï2¿³¿!¿O9¿ÿJû¾Ó0Ô¾%¦«¾ÑÚ¾Ò9.¾ñ®½ðힸꡮ=¼Q.>Žæ>”±«>Þ;Ô>°9û>1?¸!?K2?v'A?ÎÉN?ÚéZ?õpe?tKn?Ymu?í¾z?<~?VÞ?™¢?Q‰}?j–y?cÌs?}>l?F÷b?X?N…K?Y†=?Y%.?kr?¥ ?Ñ¥ñ>>Ê>p\¡>Óšn>Ã> ƒ=Rp¯¼ZrÚ½G¸C¾ádŒ¾[çµ¾Û2Þ¾®`¿b´¿Jò%¿4ú5¿+®D¿¹òQ¿·]¿Ôg¿@p¿7ëv¿É{¿¥Ð~¿-ü¿PH¿e·|¿cNx¿‡r¿pj¿ f`¿–U¿á"H¿NÈ9¿­*¿W¿÷ ¿—è¾2À¾€á–¾å%Y¾%ó¾//½¥µ.=Õ>¾FY>ñ–>Æ%À> óç>‚?A?õ*?Î9?(H?? U?cb`?]j?r?nPx?¼¸|?ñH?Bü?`Ñ~?zÊ{?8ív?)=p?‹Ðg?á²]?÷Q?³D?Œÿ5?ø%?‹­?sY?·#Þ>õµ>~sŒ>ÖC>„/Ú=‚c®<5Oƒ½ÿ ¾E}n¾N¡¾0ʾ¢´ñ¾#¬ ¿ y¿È.¿>=¿²€K¿þX¿)ûb¿ºAl¿óÎs¿¹”y¿Dˆ}¿1¢¿”Þ¿;~¿;½z¿õju¿:Nn¿Tte¿ËíZ¿ÚÄN¿ò!A¿B2¿ä½!¿a7¿íFû¾±IÔ¾¿¡«¾LÖ¾ž0.¾yÞ®½fd(¸‡´®=à.>ë>úµ«>@Ô>Â=û>3?й!?ø2?þ(A?.ËN?ëZ?þqe?NLn?viu?f¿z?^<~?iÞ?y¢?ÿˆ}?å•y?ŽÐs?—=l?1öb?ÑX?ãƒK?Ç„=?£#.?1}?$£ ?³¡ñ>½9Ê>X¡>¾‘n>е>{ù‚= »¯¼î„Ú½rÁC¾_iŒ¾¹ëµ¾<Þ¾±b¿H¶¿ô%¿Øû5¿ª¯D¿ôQ¿?°]¿Õg¿Þ@p¿Ôëv¿‡É{¿ßÐ~¿3ü¿UI¿·|¿ÒMx¿Är¿~j¿ëd`¿*U¿l!H¿³Æ9¿î*¿x¿û ¿mü羇/À¾ Ý–¾ÄY¾âé¾Ä /½úÚ.=EÞ>SY>ö–>*À>5÷ç>~ ? ?¾*?±Ï9?“)H?‹ U?ƒc`?Oj?Ñr?Mx?¹|?I?;ü?'Ñ~?Ê{?šìv?áAp?Ïg?¶±]?¼õQ?‰±D?çý5?Lö%?ª¸?qW?‚Þ>2ñµ>oŒ>ðÌC>6œÚ=Ê®<Úaƒ½<ª¾[†n¾sR¡¾\4Ê¾Šœñ¾® ¿ãz¿~!.¿Ð‚=¿‚K¿?X¿×ôb¿ Bl¿ªÏs¿?•y¿—ˆ}¿Q¢¿Þ¿¶<~¿Ã¼z¿Kju¿`Mn¿Kse¿•ìZ¿èÌN¿j A¿”2¿¼!¿s5¿ÜBû¾qEÔ¾~»«¾ÈѾi'.¾ÜË®½[g—¶%Ç®=%.>£Ð>aº«>^DÔ>ÔAû>ö4?Ÿ»!?'2?‡*A?ÌN?FìZ?se?)Mn? ju?¤¼z?¤<~?|Þ?Y¢?¬ˆ}?`•y?ØÏs?ÚBl?õb?X?x‚K?5ƒ=?í!.?Z{?—® ?•ñ>r5Ê>’S¡>¨ˆn>“¬>“fƒ=Á°¼‚—Ú½žÊC¾ÝmŒ¾ðµ¾qÞ¾îV¿/¸¿Ùõ%¿}ý5¿(±D¿eõQ¿j±]¿MÏg¿¬Ap¿rìv¿óÉ{¿Ñ~¿:ü¿)I¿4¹|¿@Mx¿r¿Œj¿Ìc`¿Þ U¿ò)H¿Å9¿0*¿™¿ÿ ¿Cøç¾3+À¾'÷–¾£Y¾žà¾oä.½P/=‰ç>tY>èÛ–>n.À>_ûç>z ?ÿ?}*?KÆ9?+H?ÖU?£d`?Aj?“r?­Mx?í¶|?JI?5ü?íÐ~?¢É{?üëv?Ap?YÕg?‹°]?fôQ? °D?Cü5?…ô%?ö?3c?LÞ>Ôìµ>‚jŒ>ÅÃC>¢‰Ú=õͯ<tƒ½y³¾qn¾âV¡¾¦8ʾ¨ ñ¾¥¢ ¿º|¿4#.¿a„=¿‡ƒK¿X¿ëõb¿]=l¿`Ðs¿Ä•y¿êˆ}¿q¢¿nÞ¿p<~¿„¿z¿¡iu¿…Ln¿Bre¿_ëZ¿‡ËN¿b)A¿ç2¿Eº!¿…3¿Ê>û¾1AÔ¾·«¾7ì¾4.¾>¹®½Š8ÂÙ®=I..>'Õ>¡ «>žHÔ>æEû>ä6?o½!?Õ2?!A?ïÍN?|íZ?te?Nn?Êju?½z? ;~?Þ?9¢?Yˆ}?Û”y?!Ïs?ôAl?oûb?OX?K?£=?7 .?ƒy?¢¬ ?­µñ>(1Ê>#O¡>’n>V£>îSƒ=–P®¼ªÚ½ÉÓC¾[rŒ¾tôµ¾¦"Þ¾ñX¿­¿ ÷%¿!ÿ5¿§²D¿»öQ¿•²]¿JÐg¿ô•#Y>^à–>À>‰ÿç>v ?Þ?<*?æÇ9?ƒ"H?!U?Âe`?3j?Vr?>Nx?M·|?EH?.ü?´Ð~?6É{?_ëv?D@p?[Ôg?`·]?óQ?Œ®D?žú5?¾ò%?Ý´?1a?ì3Þ>vèµ>fŒ>™ºC>wÚ=>ƒ¯l¿5Ìs¿I–y¿<‰}¿‘¢¿[Þ¿*<~¿ ¿z¿„mu¿«Kn¿8qe¿)êZ¿'ÊN¿Ù'A¿¸2¿v¸!¿—1¿¸:û¾ñ<Ô¾±²«¾³ç¾T.¾¡¦®½Œ8`ì®=}7.>¬Ù>¥«>¿/Ô>÷Iû>Ò8?>¿!?‚2?#A?áÅN?²îZ?ue?ÝNn?tku?•½z?P;~?Þ?¢?ˆ}?V”y?kÎs?Al?Zúb?¤ X?£K?€=?€.?«w?­ª ?±ñ>CJÊ>µJ¡>}vn>š>HAƒ=M›®¼d=Ú½ôÜC¾ÙvŒ¾Òøµ¾Ü&Þ¾óZ¿ö®¿9í%¿Æ6¿&´D¿øQ¿À³]¿HÑg¿Ã=p¿uév¿ËÊ{¿‹Ñ~¿Fü¿ÏH¿u¸|¿Px¿±r¿¨j¿Œa`¿G U¿'H¿ãÌ9¿§*¿Û¿¿ïï羊"À¾9î–¾ì?Y¾ ¾Ä™.½úJ/=ú>·,Y>Õä–>nÀ>,çç>r?½ ?û*?É9?ø#H?ŽU?âf`?%j?r?ÐNx?¬·|?qH?Tü?zÐ~?ÊÈ{?Áêv?u?p?^Óg?5¶]?áúQ? ­D?úø5?÷ð%?ö²?._?·/Þ>¶>‡aŒ>n±C>{dÚ=†8¯< ƒ½©†¾œ¡n¾¿_¡¾;Aʾä¨ñ¾¦ ¿Ës¿æ.¿…‡=¿\†K¿ X¿øb¿)?l¿ëÌs¿>“y¿‰}¿±¢¿HÞ¿ä;~¿“¾z¿Úlu¿©Pn¿/pe¿óèZ¿ÇÈN¿Q&A¿ 2¿ Ã!¿©/¿¦6û¾±8Ô¾J®«¾.ã¾ÜJ.¾Œ¯½Â¼Ö8ýþ®=²@.>1Þ>n©«>ÿ3Ô>'2û>À:? Á!?02?Ÿ$A?AÇN?çZ?#ve?¸On?lu?¾z?–;~?2Þ?Ô¢?³‡}?Ñ“y?µÍs?(@l?Fùb?c X?í‡K?~=?Ê.?Ôu?¸¨ ?q­ñ>øEÊ>¤d¡>gmn>Ý>£.ƒ=殼øOÚ½N§C¾W{Œ¾0ýµ¾+Þ¾ö\¿Ý°¿ï%¿)÷5¿¤µD¿gùQ¿ë´]¿FÒg¿‘>p¿êv¿SÈ{¿ÄÑ~¿Mü¿£H¿¸|¿pOx¿ïr¿¶j¿l``¿ü U¿“%H¿HË9¿è*¿Î"¿ ¿Åëç¾6À¾Ãé–¾Ë6Y¾L¾3t/½Op/=T>Ø5Y>Lé–>ÂÀ>Vëç>Ö?œ"?º*?Ë9?l%H?Ù U?N``?j?Úr?aOx? ¸|?žH?Mü?ÊÑ~?^È{?#êv?§>p?`Òg? µ]?‹ùQ?̵D?U÷5?/ï%?±?,]?+Þ>¤ýµ>Î{Œ>C¨C>çQÚ=Ïí®<²,ƒ½æ¾tln¾.d¡¾†Eʾ­ñ¾„¨ ¿£u¿œ.¿V~=¿Ç‡K¿B X¿)ùb¿@l¿¢Ís¿Ã“y¿«‡}¿Ñ¢¿4Þ¿ž;~¿¾z¿0lu¿ÏOn¿&oe¿½çZ¿fÇN¿È$A¿]2¿>Á!¿ô:¿”2û¾q4Ծ䩫¾©Þ¾¨A.¾î¯½‡Þ¸›¯=çI.>µâ>Õ­«>?8Ô>96û>v/?ÝÂ!?Ý2?(&A?¢ÈN?ÓèZ?pe?’Pn?Èlu?†¾z?Ü;~?FÞ?´¢?˜‰}?L“y?þÌs?A?l?1øb?" X?‚†K?¯‡=?.?üs?æ ?R©ñ>®AÊ>6`¡>¢n> ‡>þƒ=¼0¯¼‹bÚ½y°C¾aŒ¾¶¾F/Þ¾ù^¿Ã²¿Çð%¿Îø5¿å¬D¿½úQ¿¶]¿CÓg¿`?p¿°êv¿¿È{¿tÐ~¿Sü¿vH¿¶·|¿ßNx¿,r¿>j¿L_`¿°U¿$H¿¬É9¿**¿ï ¿§¿›çç¾áÀ¾Lå–¾ª-Y¾û¾ÞN/½à•.=˜ >ù>Y>Âí–>"À>€ïç>Ò?©?y*?¸Ì9?á&H?% U?na`?j?r?óOx?k¸|?ËH?Gü?‘Ñ~?ÖÊ{?…év?Ø=p?bÑg?ß³]?5øQ?N´D?ò6?hí%?)¯?)[?L'Þ>Fùµ>QwŒ>éÝC>T?Ú=£®J¡¾ÐIʾ!±ñ¾yª ¿zw¿S.¿ç=¿}K¿‚ X¿=úb¿ö@l¿XÎs¿H”y¿þ‡}¿¢¿!Þ¿X;~¿¢½z¿†ku¿ôNn¿5ue¿‡æZ¿ÆN¿@#A¿¯2¿n¿!¿9¿dJû¾10Ô¾}¥«¾%Ú¾s8.¾QÄË“¸°¤®=S.>:ç>;²«>€<Ô>K:û>d1?E¸!?‹2?°'A?ÊN? êZ?qe?”Kn?rmu?ÿ¾z?#<~?YÞ?”¢?E‰}?V–y?HÌs?[>l?÷b?âX?…K?†=?%.?%r?Τ ?4¥ñ>d=Ê>Ç[¡>y™n>¬½>Y ƒ=s{¯¼uÚ½¥¹C¾eŒ¾èµ¾|3Þ¾û`¿ª´¿Žò%¿rú5¿d®D¿ìòQ¿A·]¿AÔg¿.@p¿Nëv¿+É{¿®Ð~¿.ü¿IH¿W·|¿MNx¿jr¿Lj¿àe`¿eU¿ª"H¿È9¿k*¿¿« ¿øÿç¾À¾Öà–¾‰$Y¾Äñ¾‰)/½5».=cÖ>HY>9ò–>k&À>ªóç>Î?ˆ?B *?SÎ9?V(H?p U?Žb`?j?+r?„Px?˸|?÷H?Aü?WÑ~?jÊ{? ív? =p?eÐg?´²]?ßöQ?ϲD?Mÿ5?Ð÷%?B­?'Y?#Þ>éôµ>ÓrŒ>¾ÔC>¬Ú=`X®<üQƒ½`¢¾ ~n¾­N¡¾µ0ʾ?µñ¾n¬ ¿Qy¿ .¿y=¿è€K¿.X¿Rûb¿ÜAl¿Ïs¿Í”y¿Pˆ}¿6¢¿‘Þ¿;~¿)½z¿Üju¿Nn¿,te¿œíZ¿¥ÄN¿¸!A¿2¿Ÿ½!¿7¿RFû¾IÔ¾¡«¾ Õ¾?/.¾³Û®½ ¸M·®=?.>¿ë>¢¶«>À@Ô>]>û>R3?º!?º2?9)A?cËN?>ëZ?&re?oLn?iu?w¿z?i<~?lÞ?t¢?òˆ}?Ñ•y?sÐs?u=l?öb?¡X?­ƒK?‹„=?b#.?ë|?Ù¢ ?¡ñ>9Ê>XW¡>cn>o´>qvƒ=+Ư¼²‡Ú½ÐÂC¾ jŒ¾_ìµ¾ÜÞ¾þb¿‘¶¿Vô%¿ü5¿ã¯D¿BôQ¿l°]¿>Õg¿ý@p¿ìëv¿—É{¿çÐ~¿4ü¿OI¿÷¶|¿¼Mx¿§r¿Zj¿Ád`¿ùU¿5!H¿vÆ9¿¬*¿1¿¯ ¿Îûç¾â.À¾_Ü–¾hY¾€è¾4/½Šà.=¦ß>¯Y>¯ö–>¿*À>Ô÷ç>Ê ?g?*?íÄ9?Ë)H?¼ U?®c`?sj?îr?1Mx?*¹|?$I?:ü?Ñ~?þÉ{?ƒìv?ÂAp?gÏg?б]?‰õQ?P±D?©ý5?ö%?b¸?$W?áÞ>‹ðµ>UnŒ>’ËC>q™Ú=‹ °<¡dƒ½œ«¾¶‡n¾S¡¾5ʾ'ñ¾c® ¿){¿¿!.¿ ƒ=¿R‚K¿nX¿õb¿ÂBl¿ÅÏs¿R•y¿£ˆ}¿V¢¿~Þ¿¬<~¿±¼z¿2ju¿?Mn¿#se¿gìZ¿³ÌN¿/ A¿T2¿Ï»!¿*5¿@Bû¾ÏDÔ¾Öº«¾Ѿ &.¾É®½LÛU5ëÉ®=s&.>OÑ>»«>EÔ>oBû>@5?ä»!?g2?A A?ÃÌN?tìZ?/se?IMn?9ju?¶¼z?¯<~?Þ?U¢?Ÿˆ}?L•y?½Ïs?¸Bl?óôb?`X?B‚K?ù‚=?¬!.?{?M® ?øœñ>Î4Ê>éR¡>N‡n>3«>Ìcƒ=®¼FšÚ½ûËC¾ˆnŒ¾½ðµ¾Þ¾;W¿w¸¿ö%¿»ý5¿a±D¿˜õQ¿—±]¿rÏg¿ËAp¿Šìv¿Ê{¿!Ñ~¿;ü¿"I¿&¹|¿*Mx¿år¿hj¿¡c`¿­ U¿º)H¿ÚÄ9¿í*¿R¿³ ¿¤÷美*À¾|ö–¾GY¾<ß¾ßÞ.½ß/=êè>ÑY>’Ü–>/À>þûç>Æ ?F?À*?ˆÆ9?F!H?U?Íd`?ej?°r?ÂMx?ü¶|?QI?4ü?åÐ~?’É{?åëv?ô@p?3Õg?_°]?3ôQ?Ò¯D?ü5?Aô%?{¶?çb?¬Þ>-ìµ>×iŒ>gÂC>Þ†Ú=Ô¯<‰÷‚½Ù´¾Ën¾‹W¡¾J9ʾE¡ñ¾ï¢ ¿}¿u#.¿„=¿½ƒK¿¯X¿öb¿=l¿{Ðs¿×•y¿öˆ}¿v¢¿kÞ¿f<~¿r¿z¿ˆiu¿eLn¿re¿1ëZ¿SËN¿')A¿§2¿º!¿<3¿.>û¾@Ô¾p¶«¾‹ë¾Õ.¾x¶®½èÎ8ˆÜ®=¨/.>ÔÕ>I¡«>@IÔ>Fû>.7?´½!?2?É!A?µÄN?ªíZ?8te?$Nn?äju?/½z?;~?’Þ?5¢?Mˆ}?Ç”y?Ïs?ÒAl?Eûb?X?×€K?g=?õ.?„0Ê>zN¡>8~n>ö¡>&Qƒ=·[®¼Ú¬Ú½'ÕC¾sŒ¾õµ¾G#Þ¾>Y¿X­¿ä÷%¿`ÿ5¿à²D¿îöQ¿Â²]¿pÐg¿=p¿'ív¿oÊ{¿ZÑ~¿Aü¿õH¿Æ¸|¿}Px¿"r¿vj¿b`¿b U¿E(H¿AÎ9¿. *¿s¿·¿zóç¾9&À¾ò–¾±GY¾ùվй.½4+/=.ò>ò$Y> á–>¾À>(è> ?%?*?#È9?º"H?tU?íe`?Wj?sr?TNx?[·|?KH?-ü?«Ð~?&É{?Gëv?%@p?6Ôg?4·]?ÝòQ?S®D?`ú5?zò%?”´?ä`?K3Þ>Ðçµ>YeŒ><¹C>JtÚ=x¯l¿PÌs¿\–y¿I‰}¿–¢¿XÞ¿<~¿ú¾z¿kmu¿ŠKn¿qe¿ûéZ¿òÉN¿Ÿ'A¿x2¿1¸!¿N1¿:û¾O<Ô¾ ²«¾ç¾²R.¾Û£®½1#—8&ï®=Ý8.>XÚ>°¥«>a0Ô>“Jû>9?ƒ¿!?Â2?R#A?ÆN?•æZ?Aue?þNn?Žku?§½z?[;~?"Þ?¢?ú‡}?B”y?PÎs?ì@l?1úb?t X?mK?Ö=??.?ew?cª ?ò°ñ>ŸIÊ> J¡>"un>¹˜>>ƒ=o¦®¼(@Ú½RÞC¾„wŒ¾xùµ¾|'Þ¾@[¿?¯¿|í%¿6¿_´D¿DøQ¿í³]¿nÑg¿â=p¿Œév¿ÛÊ{¿“Ñ~¿Gü¿ÉH¿g¸|¿ìOx¿”r¿„j¿aa`¿ U¿Ñ&H¿¦Ì9¿e*¿“¿»¿Pïç¾å!À¾í–¾>Y¾. ¾5”.½ŠP/=rû>.Y>å–>À>Ëçç>¾?!?>*?¿É9?/$H?¿U?Y_`?Ij?5r?åNx?»·|?xH?Sü?rÐ~?ºÈ{?©êv?W?p?8Óg? ¶]?®úQ?Ô¬D?»ø5?³ð%?®²?â^?/Þ>[¶>Û`Œ>°C>·aÚ=e-¯<Ôƒ½ ˆ¾÷¢n¾h`¡¾ßAʾ‚©ñ¾Ú¦ ¿t¿'.¿Á‡=¿’†K¿1 X¿=øb¿L?l¿Ís¿R“y¿›‰}¿¶¢¿EÞ¿Ù;~¿¾z¿Álu¿ˆPn¿pe¿ÅèZ¿’ÈN¿&A¿Ê2¿ÈÂ!¿`/¿ 6û¾8Ô¾£­«¾‚â¾}I.¾Æ¯½îÞá8ï=B.>ÝÞ>ª«>¡4Ô>Ã2û> ;?RÁ!?p2?Ú$A?vÇN?ËçZ?2oe?ØOn?8lu? ¾z?¡;~?5Þ?Ï¢?§‡}?½“y?šÍs?@l?ùb?3 X?·‡K?D~=?‰.?Žu?n¨ ?Ó¬ñ>UEÊ>ûc¡> ln>|>Ü+ƒ=&ñ®¼¼RÚ½«¨C¾|Œ¾Öýµ¾±+Þ¾C]¿%±¿Dï%¿h÷5¿ÝµD¿šùQ¿µ]¿kÒg¿°>p¿*êv¿cÈ{¿ÍÑ~¿Nü¿œH¿¸|¿[Ox¿Òr¿ j¿A``¿Ë U¿\%H¿ Ë9¿¦*¿‡"¿¿¿&ë羑À¾é–¾o5Y¾ê¾¤n/½ßu/=¶>47Y>öé–>gÀ>õëç>"?ä"?ü*?ZË9?¤%H? U?y``?Áj?÷r?wOx?¸|?¥H?Lü?ÂÑ~?NÈ{? êv?ˆ>p?:Òg?Þ´]?XùQ?“µD?÷5?ëî%?ǰ?ß\?á*Þ>þüµ>#{Œ>å¦C>#OÚ=®â®bã>}®«>â8Ô>Ô6û>¿/?"Ã!?2?b&A?ÖÈN?éZ?;pe?ÚJn?âlu?˜¾z?ç;~?HÞ?°¢?‹‰}?8“y?ãÌs??l?øb?óX?L†K?s‡=?Ò.?¶s?y¦ ?µ¨ñ> AÊ>_¡>4¡n>@†>7ƒ=Þ;¯¼PeÚ½×±C¾ºaŒ¾4¶¾ç/Þ¾E_¿ ³¿ ñ%¿ ù5¿­D¿ðúQ¿C¶]¿iÓg¿?p¿Èêv¿ÏÈ{¿}Ð~¿Tü¿oH¿¨·|¿ÉNx¿r¿j¿Õf`¿U¿ç#H¿oÉ9¿ç*¿¨ ¿[¿üæç¾<À¾¢ä–¾N,Y¾§ù¾OI/½p›.=ú >U@Y>mî–>¼"À>ðç>?ð?»*?õÌ9?'H?V U?™a`?³j?†r?Px?y¸|?ÑH?Fü?ˆÑ~?ÆÊ{?mév?º=p?=Ñg?³³]?øQ?´D?³6?$í%?à®?ÜZ?¬&Þ> øµ>¥vŒ>‹ÜC><Ú=ö—®<Bƒ½ƒš¾åvn¾çJ¡¾tJʾ¾±ñ¾Äª ¿Àw¿”.¿#€=¿³K¿² X¿fúb¿Al¿sÎs¿\”y¿ ˆ}¿¢¿Þ¿M;~¿½z¿mku¿ÔNn¿ue¿¤îZ¿ÑÅN¿#A¿o2¿)¿!¿¼8¿ÉIû¾Ž/Ô¾Ö¤«¾xÙ¾7.¾‹ë®½—©ˆ¸v§®=zT.>æç>㲫>"=Ô>æ:û>­1?Џ!?Ë2?ë'A?7ÊN?7êZ?Dqe?µKn?þhu?¿z?-<~?\Þ?¢?9‰}?C–y?-Ìs?9>l?óöb?²X?â„K?á…=?×$.?ßq?ƒ¤ ?—¤ñ>À<Ê>[¡>˜n>L¼>’ƒ=•†¯¼ãwÚ½»C¾8fŒ¾¨èµ¾4Þ¾Ha¿ó´¿Òò%¿±ú5¿®D¿óQ¿n·]¿gÔg¿M@p¿fëv¿;É{¿¶Ð~¿/ü¿CH¿I·|¿8Nx¿Mr¿(j¿µe`¿U¿r"H¿ÔÇ9¿(*¿É¿_ ¿Yÿç¾èÀ¾+à–¾-#Y¾cð¾ù#/½ÅÀ.=Ä×>vIY>ãò–>'À>Iôç>?Ï?… *?Î9?(H?¢ U?¹b`?¥j?Hr?µLx?Ù¸|?þH?@ü?OÑ~?ZÊ{? ív?ëBôµ>'rŒ>`ÓC>A©Ú=?M®<ÃTƒ½À£¾ún¾VO¡¾Y1ʾܵñ¾¹¬ ¿˜y¿J .¿µ=¿K¿]X¿{ûb¿þAl¿*Ïs¿á”y¿]ˆ}¿;¢¿ŽÞ¿;~¿½z¿Ãju¿ùMn¿te¿níZ¿ßÍN¿}!A¿Â2¿Z½!¿Î6¿·Eû¾mHÔ¾o «¾ôÔ¾à-.¾íØ®½i·÷·º®=ž.>kì>J·«>bAÔ>ø>û>›3?Zº!?ú2?s)A?—ËN?mëZ?Mre?Ln?©iu?P¼z?s<~?oÞ?p¢?æˆ}?¾•y?XÐs?R=l?ßõb?qX?wƒK?P„=?!#.?¥|?Ž¢ ?y ñ>u8Ê>¯V¡> n>³>ªsƒ=Lѯ¼wŠÚ½.ÄC¾¶jŒ¾íµ¾}Þ¾Jc¿Ù¶¿™ô%¿Vü5¿°D¿uôQ¿˜°]¿dÕg¿Ap¿ìv¿§É{¿ðÐ~¿5ü¿HI¿é¶|¿¦Mx¿Šr¿6j¿–d`¿ÇU¿÷*H¿8Æ9¿i*¿ê¿c ¿/ûç¾=.À¾µÛ–¾ Y¾ç¾¤þ.½æ.=á> Y>Z÷–>d+À>søç> ?¯?D*?*Å9?*H?í U?Ùc`?—j? r?GMx?8¹|?+I?9ü?Ñ~?îÉ{?kìv?£Ap?AÏg?]±]?VõQ?±D?jý5?Åõ%?¸?×V?AÞ>åïµ>ªmŒ>5ÊC>­–Ú=i°ûÑ>°»«>¢EÔ> Cû>‰5?)¼!?§2?{ A?øÌN?£ìZ?Wse?jMn?Sju?ȼz?¹<~?‚Þ?P¢?“ˆ}?9•y?¡Ïs?–Bl?Êôb?0X? ‚K?¾‚=?j!.?Îz?® ?[œñ>+4Ê>@R¡>ó…n>Ò©>aƒ="®¼ Ú½YÍC¾4oŒ¾dñµ¾²Þ¾ˆW¿À¸¿aö%¿úý5¿š±D¿ËõQ¿Ã±]¿˜Ïg¿êAp¿¡ìv¿Ê{¿)Ñ~¿<ü¿I¿¹|¿Mx¿Èr¿Dj¿vc`¿| U¿‚)H¿ŸÏ9¿ª*¿ ¿g ¿÷ç¾è)À¾Òõ–¾ëY¾ÛݾOÙ.½o /=Lê>-Y><Ý–>¹/À>üç> ?Ž?*?ÅÆ9?}!H?9U?ød`?‰j?Ír?ØMx? ·|?WI?3ü?ÜÐ~?‚É{?Íëv?Õ@p? Õg?2°]?ôQ?™¯D?Åû5?ýó%?2¶?šb? Þ>‡ëµ>,iŒ> ÁC>„Ú=²·¯öb¿¡=l¿–Ðs¿ë•y¿‰}¿{¢¿hÞ¿[<~¿`¿z¿niu¿DLn¿óqe¿ëZ¿ËN¿í(A¿å2¿»¹!¿ò2¿“=û¾í?Ծȵ«¾ßê¾v.¾²³®½@/8Nß®=1.>€Ö>ñ¡«>âIÔ>Gû>w7?ù½!?U2?"A?éÄN?ØíZ?`te?DNn?ýju?A½z?;~?•Þ?0¢?@ˆ}?´”y?ëÎs?¯Al?ûb?ïX?¡€K?,=?´.?öx? ¬ ?s´ñ>à/Ê>ÑM¡>Ý|n>– >_Nƒ=Ùf®¼Y0Ú½„ÖC¾±sŒ¾Áõµ¾ç#Þ¾ŠY¿ ­¿(ø%¿žÿ5¿³D¿!÷Q¿î²]¿–Ðg¿2=p¿?ív¿Ê{¿cÑ~¿Bü¿ïH¿¸¸|¿hPx¿r¿Rj¿Vb`¿0 U¿(H¿Î9¿á*¿+¿l¿Ûòç¾”%À¾\ñ–¾UFY¾—Ô¾ú³.½Ä0/=ó>N&Y>³á–>dÀ>Çè> ?m?Á*?aÈ9?ò"H?¥U?f`?{j?r?jNx?i·|?RH?,ü?£Ð~?É{?0ëv?@p?Ôg?·]?ªòQ?®D?!ú5?6ò%?L´?—`?«2Þ>)çµ>®dŒ>Þ·C>†qÚ=ûl¯<ö ƒ½-€¾;›n¾£\¡¾8>ʾ¦ñ¾/¥ ¿€r¿m%.¿k†=¿^…K¿ X¿R÷b¿ˆ>l¿kÌs¿p–y¿U‰}¿›¢¿UÞ¿<~¿è¾z¿Rmu¿jKn¿épe¿ÍéZ¿¾ÉN¿d'A¿82¿RÄ!¿1¿9û¾­;Ô¾a±«¾Zæ¾SQ.¾¡®½]E¢8ìñ®=<:.>Û>X¦«>1Ô>.Kû>e9?È¿!?2?Œ#A?JÆN?ÃæZ?iue?On?§ku?¹½z?e;~?%Þ?¢?í‡}?.”y?5Îs?É@l?úb?D X?7K?š=?þ.?w?ª ?U°ñ>üHÊ>bI¡>Èsn>Y—>º;ƒ=±®¼íBÚ½Þ C¾/xŒ¾úµ¾(Þ¾[¿‡¯¿Àí%¿C6¿˜´D¿wøQ¿´]¿”Ñg¿>p¿¤év¿ëÊ{¿œÑ~¿Hü¿ÂH¿Y¸|¿ÖOx¿wr¿`j¿6a`¿å U¿™&H¿hÌ9¿"*¿$¿p¿±îç¾@!À¾åì–¾4=Y¾Í ¾¥Ž.½V/=Óü>o/Y>*æ–>¸À>ièç> ?L!?€*?üÉ9?g$H?ñU?„_`?mj?Rr?ûNx?É·|?H?Rü?iÐ~?ªÈ{?’êv?8?p?Óg?ܵ]?{úQ?›¬D?|ø5?oð%?e²?•^?v.Þ>µ¶>0`Œ>²®C>ò^Ú=C"¯<›ƒ½j‰¾fn¾a¡¾ƒBʾªñ¾$§ ¿Xt¿i.¿ý‡=¿È†K¿a X¿gøb¿n?l¿"Ís¿f“y¿¨‰}¿º¢¿BÞ¿Ï;~¿o¾z¿§lu¿hPn¿àoe¿—èZ¿^ÈN¿Ü%A¿Š2¿ƒÂ!¿N<¿o5û¾m7Ô¾û¬«¾Õá¾H.¾¯½í8‰¯=pC.>‰ß>¾ª«>C5Ô>^3û>S;?—Á!?°2?%A?ªÇN?ùçZ?Yoe?ùOn?Qlu?2¾z?«;~?8Þ?Ë¢?›‡}?©“y?~Ís?ã?l?óøb? X?‡K?~=?G.?Gu?#¨ ?6¬ñ>±DÊ>Rc¡>²jn>Ž>)ƒ=Hü®¼€UÚ½ ªC¾ç]Œ¾}þµ¾R,Þ¾]¿n±¿‡ï%¿§÷5¿¶D¿ÍùQ¿Dµ]¿‘Òg¿Ï>p¿Aêv¿sÈ{¿ÕÑ~¿Oü¿•H¿ù·|¿EOx¿µr¿èj¿``¿™ U¿$%H¿ÍÊ9¿c*¿@"¿ ¿‡êç¾ëÀ¾nè–¾4Y¾‰¾i/½n{/=>8Y> ê–> À>“ìç>m?+#??*?—Ë9?Ü%H?< U?¤``?åj?r?ŒOx?(¸|?«H?Lü?¹Ñ~?>È{?ôév?i>p?Òg?±´]?%ùQ?ZµD?Øö5?¨î%?~°?’\?@*Þ>Wüµ>xzŒ>‡¥C>^LÚ=Œ×®<@2ƒ½§’¾)on¾!G¡¾ÍFʾ=®ñ¾© ¿/v¿.¿Í~=¿3ˆK¿¡ X¿{ùb¿T@l¿ØÍs¿ë“y¿Ã‡}¿Ú¢¿/Þ¿‰;~¿÷½z¿ýku¿ŽOn¿ðue¿açZ¿ýÆN¿S$A¿Ý2¿´À!¿`:¿?Mû¾,3Ô¾”¨«¾Qݾê>.¾bû®½(Cȸ'¯=¥L.>ä>%¯«>„9Ô>p7û> 0?gÃ!?]2?&A? ÉN?/éZ?cpe?ûJn?ûlu?ª¾z?ñ;~?KÞ?«¢?‰}?$“y?ÈÌs?ý>l?ß÷b?ÃX?†K?7‡=?‘.?ps?.¦ ?¨ñ>g@Ê>ã^¡>ÚŸn>ß„>pƒ=ÿF¯¼hÚ½5³C¾ebŒ¾ñäµ¾‡0Þ¾’_¿T³¿Oñ%¿Kù5¿W­D¿#ûQ¿o¶]¿Óg¿?p¿ßêv¿ßÈ{¿…Ð~¿Uü¿iH¿š·|¿³Nx¿òr¿öj¿ªf`¿NU¿¯#H¿2É9¿¤*¿` ¿¿]æç¾—À¾øã–¾ò*Y¾Eø¾¿C/½ÿ .=[>±AY>ï–>a#À>½ðç>i?8?þ*?2Í9?P'H?ˆ U?Äa`?×j?£r?Px?ˆ¸|?ØH?Eü?€Ñ~?¶Ê{?Vév?›=p?Ñg?†³]?Ï÷Q?ܳD?t6?àì%?˜®?Z? &Þ>ù÷µ>úuŒ>.ÛC>Ë9Ú=ÕŒ®<åDƒ½ã›¾?xn¾K¡¾²-ʾ[²ñ¾« ¿x¿Õ.¿_€=¿éK¿â X¿úb¿:Al¿ŽÎs¿p”y¿ˆ}¿ ¢¿Þ¿C;~¿~½z¿Sku¿³Nn¿æte¿vîZ¿ÅN¿Ë"A¿/2¿ä¾!¿r8¿.Iû¾ì.Ô¾.¤«¾Ìؾµ5.¾Å讽Ö{¸<ª®=ÙU.>“è>‹³«>Ä=Ô>‚;û>÷1?ϸ!? 2?%(A?kÊN?eêZ?lqe?ÕKn?iu?#¿z?7<~?^Þ?‹¢?,‰}?/–y?Ìs?>l?Êöb?‚X?¬„K?¦…=?•$.?™q?9¤ ?ú£ñ><Ê>uZ¡>Ä–n>ìº>˃=·‘¯¼¨zÚ½`¼C¾ãfŒ¾Oéµ¾èÞ¾”a¿;µ¿ó%¿ðú5¿Ö®D¿RóQ¿š·]¿ŒÔg¿l@p¿}ëv¿KÉ{¿¿Ð~¿0ü¿ÒJY>ó–>µ'À>çôç>e??Ç *?ÎÎ9?Å(H?Ó U?äb`?Éj?er?ËLx?ç¸|?I??ü?FÑ~?JÊ{?ñìv?Ìœóµ>|qŒ>ÒC>|¦Ú=B®<ŠWƒ½ ¥¾Un¾ÿO¡¾ü1ʾCšñ¾­ ¿Þy¿‹ .¿ñ=¿TK¿X¿¤ûb¿!Bl¿EÏs¿õ”y¿iˆ}¿?¢¿ŒÞ¿ü:~¿½z¿©ju¿ÙMn¿Ýse¿@íZ¿«ÍN¿C!A¿‚2¿½!¿„6¿Eû¾ËGԾǟ«¾GÔ¾€,.¾'Ö®½¸.Ë·Ù¼®=ý.>í>ò·«>BÔ>“?û>å3?Ÿº!?:2?®)A?ÌËN?›ëZ?ure?°Ln?Âiu?b¼z?~<~?rÞ?k¢?Úˆ}?ª•y?<Ðs?0=l?¶õb?AX?AƒK?„=?ß".?_|?D¢ ?ÜŸñ>Ò7Ê>V¡>®n>¯±>âpƒ=nܯ¼;Ú½‹ÅC¾akŒ¾¬íµ¾Þ¾ÒU¿"·¿Ýô%¿”ü5¿U°D¿¨ôQ¿Å°]¿ŠÕg¿:Ap¿ìv¿·É{¿øÐ~¿6ü¿AI¿Û¶|¿Mx¿mr¿j¿kd`¿–U¿À*H¿ûÅ9¿'*¿¢¿ ¿‘ú羘-À¾ Û–¾°Y¾¾å¾ù.½ªë.=iâ>hY>ø–> ,À>ùç>a ?ö?†*?gÅ9?:*H?U?d`?»j?(r?\Mx?¹¶|?1I?8ü? Ñ~?ÞÉ{?Tìv?…Ap?Ïg?0±]?#õQ?Þ°D?+ý5?õ%?Ñ·?‹V? Þ>>ïµ>þlŒ>×ÈC>é“Ú=H÷¯¨Ò>X¼«>DFÔ>¥Cû>Ó5?n¼!?ç2?¶ A?,ÍN?ÑìZ?~se?ŠMn?lju?Ú¼z?ã:~?…Þ?K¢?‡ˆ}?%•y?†Ïs?sBl?¡ôb?X?ÖK?‚‚=?)!.?‡z?·­ ?¾›ñ>‡3Ê>—Q¡>™„n>r¨>=^ƒ=C'®¼ÏŸÚ½·ÎC¾ßoŒ¾ òµ¾S Þ¾ÔW¿¬¿¤ö%¿9þ5¿Ó±D¿þõQ¿ð±]¿¾Ïg¿ Bp¿¹ìv¿#Ê{¿2Ñ~¿<ü¿I¿ ¹|¿ÿLx¿«r¿ j¿Kc`¿J U¿K)H¿bÏ9¿h*¿Ã¿ ¿göç¾C)À¾(õ–¾Y¾zܾ¿Ó.½ÿ/=­ë>‰Y>æÝ–>^0À>;ýç>] ?Õ?E*?Ç9?µ!H?jU?#e`?­j?êr?îMx?·|?,H?2ü?ÔÐ~?rÉ{?¶ëv?¶@p?èÔg?°]?ÍóQ?`¯D?‡û5?ºó%?êµ?Mb?kÞ>àêµ>€hŒ>¬¿C>UÚ=‘¬¯<ý‚½š·¾€“n¾ÝX¡¾‘:ʾ¢ñ¾…£ ¿ïp¿ø#.¿…=¿)„K¿X¿göb¿Ä=l¿±Ðs¿ÿ•y¿‰}¿¢¿eÞ¿Q<~¿N¿z¿Uiu¿$Ln¿Ëqe¿ÔêZ¿êÊN¿²(A¿¥2¿v¹!¿¨2¿ø<û¾K?Ô¾ µ«¾2ê¾.¾ì°®½™WE8â®=f2.>,×>™¢«>„JÔ>·Gû>Á7?>¾!?•2?>"A?ÅN?îZ?‡te?eNn?ku?S½z?);~?Þ?+¢?4ˆ}? ”y?ÐÎs?Al?óúb?ÀX?k€K?ð€=?s.?°x?« ?Ö³ñ>=/Ê>(M¡>ƒ{n>5Ÿ>˜Kƒ=ûq®¼3Ú½â×C¾]tŒ¾höµ¾ˆ$Þ¾×Y¿é­¿=ì%¿Ýÿ5¿R³D¿T÷Q¿³]¿¼Ðg¿Q=p¿Vív¿Ê{¿kÑ~¿Cü¿èH¿ª¸|¿RPx¿ér¿.j¿+b`¿ÿ U¿Ö'H¿ÆÍ9¿ž*¿ä¿ ¿=òç¾ï$À¾±ð–¾ùDY¾6Ó¾j®.½T6/=ñô>ª'Y>]â–> À>eè>Y?´?*?žÈ9?)#H?×U?Cf`?Ÿj?¬r?Nx?x·|?YH?Wü?šÐ~?É{?ëv?è?p?êÓg?Û¶]?wòQ?á­D?âù5?òñ%?´?K`? 2Þ>ƒæµ>dŒ>€¶C>ÁnÚ=Ùa¯<½ƒ½¾–œn¾L]¡¾Ü>ʾ¦ñ¾z¥ ¿Çr¿ô.¿§†=¿”…K¿PX¿{÷b¿ª>l¿‡Ìs¿„–y¿a‰}¿Ÿ¢¿RÞ¿ <~¿Ö¾z¿8mu¿IKn¿Âpe¿žéZ¿‰ÉN¿*'A¿ø2¿ Ä!¿º0¿æ8û¾ ;Ô¾¹°«¾®å¾ôO.¾Ož®½‰g­8²ô®=›;.>±Û>ÿ¦«>¥1Ô>ÉKû>¯9? À!?B2?Æ#A?~ÆN?ñæZ?ue??On?Àku?˽z?p;~?(Þ?æ¢?á‡}?”y?Îs?§@l?ßùb? X?K?^=?¼.?Ùv?Í© ?¸¯ñ>XHÊ>¹H¡>mrn>ù•>ó8ƒ=²¼®¼±EÚ½;¢C¾ÛxŒ¾Åúµ¾½(Þ¾Ù[¿Ð¯¿î%¿Aö5¿Ñ´D¿ªøQ¿F´]¿¹Ñg¿>p¿»év¿ûÊ{¿¥Ñ~¿Iü¿»H¿J¸|¿ÁOx¿Zr¿<j¿ a`¿³ U¿a&H¿+Ì9¿à*¿×#¿$¿îç¾› À¾;ì–¾Ø;Y¾l ¾‰.½©[/=5þ>Ë0Y>Ôæ–>]À>éç>U?“!?Ã*?9Ê9?ž$H?" U?¯_`?‘j?or?Ox?×·|?…H?Qü?êÑ~?šÈ{?zêv??p?ìÒg?°µ]?HúQ?b¬D?>ø5?+ð%?²?H^?Õ-Þ>¶>…_Œ>U­C>.\Ú="¯Â!¿<¿Ô4û¾Ë6Ô¾S¬«¾)᾿F.¾: ¯½G#ø8O¯=ÏD.>6à>f««>æ5Ô>ù3û>;?ÜÁ!?ð2?O%A?ßÇN?'èZ?oe?Pn?jlu?D¾z?¶;~?;Þ?Æ¢?ʼn}?–“y?cÍs?Á?l?Êøb?Ô X?K‡K?Ì}=?.?u?ا ?™«ñ>DÊ>©b¡>Win>¼Œ>N&ƒ=i¯¼EXÚ½g«C¾“^Œ¾#ÿµ¾ò,Þ¾Ü]¿¶±¿Ëï%¿å÷5¿O¶D¿úQ¿qµ]¿·Òg¿î>p¿Yêv¿ƒÈ{¿ÞÑ~¿Pü¿H¿ë·|¿/Ox¿˜r¿Äj¿ì_`¿h U¿í$H¿Ê9¿!*¿ø!¿À¿ééç¾FÀ¾Äç–¾·2Y¾(¾„c/½þ€/=y>ì9Y>Jë–>±À>2íç>¹?r#?‚*?ÔË9?&H?n U?Ï``? j?1r?¢Ox?6¸|?²H?Kü?±Ñ~?Ë{?Üév?K>p?ïÑg?…´]?òøQ?!µD?™ö5?dî%?6°?F\? )Þ>±ûµ>ÍyŒ>)¤C>šIÚ=jÌ®<5ƒ½”¾„pn¾ËG¡¾qGʾڮñ¾d© ¿uv¿`.¿ =¿iˆK¿Ñ X¿¤ùb¿v@l¿óÍs¿ÿ“y¿Ð‡}¿ß¢¿,Þ¿~;~¿å½z¿äku¿mOn¿Èue¿2çZ¿ÉÆN¿$A¿2¿oÀ!¿:¿¤Lû¾Š2Ծ짫¾¤Ü¾‹=.¾œø®½ü ½¸í¯=N.>ºä>̯«>&:Ô> 8û>R0?¬Ã!?2?×&A??ÉN?]éZ?Špe?Kn?mu?¼¾z?ü;~?NÞ?¦¢?s‰}? –y?­Ìs?Ú>l?µ÷b?“X?à…K?ü†=?P.?*s?㥠?{§ñ>Ã?Ê>:^¡>žn>ƒ>©ƒ=!R¯¼ÙjÚ½’´C¾cŒ¾—åµ¾(1Þ¾ß_¿³¿“ñ%¿Šù5¿­D¿VûQ¿œ¶]¿µÓg¿¼?p¿÷êv¿ïÈ{¿ŽÐ~¿Vü¿bH¿Œ·|¿žNx¿Õr¿Òj¿f`¿U¿x#H¿ôÈ9¿b*¿ ¿Ä¿Fè¾òÀ¾Nã–¾–)Y¾äö¾/>/½¦.=¼> CY>Áï–>$À>\ñç>µ??@*?pÍ9?ˆ'H?¹ U?ïa`?ûj?Àr?3Px?–¸|?ßH?Dü?wÑ~?¦Ê{?xív?|=p?ñÐg?Z³]?œ÷Q?£³D?66?ì%?O®?CZ?k%Þ>S÷µ>OuŒ>ÐÙC>7Ú=³®<¬Gƒ½D¾šyn¾9L¡¾U.ʾø²ñ¾Y« ¿Mx¿.¿›€=¿€K¿ X¿¹úb¿]Al¿ªÎs¿„”y¿#ˆ}¿$¢¿Þ¿8;~¿l½z¿:ku¿“Nn¿¿te¿HîZ¿hÅN¿‘"A¿ï2¿Ÿ¾!¿)8¿’Hû¾iKÔ¾†£«¾ ؾV4.¾ÿ宽~Êd¸­®=8W.>?é>3´«>f>Ô><û>@2?¹!?K2?`(A? ÊN?“êZ?“qe?öKn?1iu?5¿z?B<~?aÞ?†¢? ‰}?–y?ØÐs?ô=l?¡öb?RX?u„K?j…=?T$.?Rq?î£ ?]£ñ>y;Ê>ÌY¡>i•n>‹¹>ƒ=Øœ¯¼l}Ú½¾½C¾ŽgŒ¾õéµ¾ˆÞ¾áa¿„µ¿Zó%¿.û5¿¯D¿…óQ¿Ç·]¿²Ôg¿‹@p¿•ëv¿[É{¿ÇÐ~¿1ü¿5H¿,·|¿ Nx¿r¿àj¿`e`¿°U¿"H¿YÇ9¿£*¿:¿È ¿þç¾G1À¾×Þ–¾u Y¾ í¾Ú/½äË.=‡Ú>.LY>8ô–>Z(À>†õç>±?^? *? Ï9?ý(H? U?c`?íj?‚r?àLx?õ¸|? I?>ü?>Ñ~?:Ê{?Úìv?4Bp?óÏg?/²]?FöQ?$²D?‘þ5?÷%?i¬?AX?5!Þ>õòµ>ÑpŒ>¥ÐC>¸£Ú=ü6®Äí>™¸«>¦BÔ>/@û>.4?äº!?z2?è)A?ÌN?ÉëZ?œre?ÐLn?Ûiu?s¼z?ˆ<~?tÞ?f¢?͈}?–•y?!Ðs?7Cl?Œõb?X? ƒK?؃=?ž".?|?ù¡ ??Ÿñ>.7Ê>]U¡>TŒn>O°>nƒ=篼ڽéÆC¾ lŒ¾Sîµ¾¾Þ¾V¿j·¿!õ%¿Óü5¿Ž°D¿ÛôQ¿ò°]¿°Õg¿YAp¿2ìv¿ÇÉ{¿Ñ~¿7ü¿;I¿Í¶|¿{Mx¿Qr¿îj¿@d`¿dU¿ˆ*H¿¾Å9¿ä*¿[¿Ì ¿òùç¾ó,À¾ôø–¾TY¾\ä¾…ó.½:ñ.=Ëã>ÄY>®ø–>®,À>°ùç>­ ?=?É*?¤Å9?q*H?PU?.d`?ßj?Er?rMx?Ƕ|?8I?7ü?Ñ~?ÎÉ{?<ìv?fAp?¿Õg?±]?ðôQ?¥°D?íü5?=õ%?ˆ·?>V?Þ>˜îµ>SlŒ>yÇC>$‘Ú=&ì¯<ölƒ½½¯¾Å‹n¾U¡¾ë6ʾþžñ¾Ú¡ ¿û{¿ƒ".¿¿ƒ=¿õ‚K¿þX¿{õb¿)Cl¿Ðs¿Ž•y¿Èˆ}¿d¢¿vÞ¿Œ<~¿{¼z¿æiu¿ÞLn¿­re¿ÜëZ¿ÌN¿*A¿”2¿»!¿M4¿o@û¾éBԾ߸«¾ î¾í!.¾ÄÀ®½îHŒ7=Ò®=‘*.>TÓ>½«>æFÔ>ADû>6?³¼!?'2?ð A?aÍN?ÿìZ?¦se?«Mn?…ju?ì¼z?î:~?ˆÞ?F¢?zˆ}?•y?kÏs?QBl?Þûb?ÑX? K?F‚=?è .?Az?m­ ?!›ñ>ä2Ê>îP¡>>ƒn>§>v[ƒ=e2®¼”¢Ú½ÐC¾ŠpŒ¾±òµ¾ó Þ¾!X¿K¬¿èö%¿wþ5¿ ²D¿1öQ¿²]¿äÏg¿(Bp¿Ðìv¿3Ê{¿:Ñ~¿=ü¿I¿û¸|¿éLx¿Žr¿üj¿ c`¿ U¿)H¿$Ï9¿%*¿|¿Ð¿Èõ羞(À¾~ô–¾¾LY¾Û¾0Î.½/=í>åY>‘Þ–>1À>Úýç>© ??ˆ*?@Ç9?ì!H?›U?Ne`?Ñj?r?Nx?&·|?3H?1ü?ËÐ~?bÉ{?žëv?—@p?ÂÔg?Ù¯]?šóQ?'¯D?Hû5?vó%?¡µ?b?ÊÞ>:êµ>ÕgŒ>N¾C>~Ú=o¡¯<ßÿ‚½ú¸¾Û”n¾†Y¡¾5;ʾ£ñ¾Ï£ ¿5q¿9$.¿Q…=¿_„K¿?X¿öb¿æ=l¿ÌÐs¿–y¿‰}¿„¢¿cÞ¿F<~¿<¿z¿Ô¾x´«¾†é¾ÉW.¾'®®½ñ›[8Úä®=Å3.>Ù×>A£«>&KÔ>RHû> 8?ƒ¾!?Õ2?y"A?RÅN?5îZ?¯te?…Nn?0ku?e½z?4;~?Þ?&¢?(ˆ}?Œ”y?µÎs?kAl?Êúb?X?5€K?´€=?1.?jx?x« ?9³ñ>™.Ê>L¡>(zn>Õ>ÑHƒ=}®¼â5Ú½@ÙC¾uŒ¾÷µ¾(%Þ¾$Z¿1®¿ì%¿6¿‹³D¿‡÷Q¿G³]¿áÐg¿o=p¿nív¿ŸÊ{¿tÑ~¿Dü¿áH¿œ¸|¿)Y>ã–>®À>è>¥?ü?F*?ÛÈ9?a#H?U?nf`?Ãj?Ér?•Nx?†·|?_H?Vü?’Ð~?öÈ{?ëv?É?p?ÄÓg?®¶]?DòQ?¨­D?¤ù5?®ñ%?»³?þ_?j1Þ>Üåµ>WcŒ>"µC>ýkÚ=¸V¯<„ƒ½î‚¾ðn¾õ]¡¾€?ʾ:§ñ¾Ä¥ ¿ s¿5.¿ã†=¿Ê…K¿X¿¤÷b¿Ì>l¿¢Ìs¿˜–y¿n‰}¿¤¢¿OÞ¿<~¿Ä¾z¿mu¿)Kn¿špe¿péZ¿UÉN¿ï&A¿¸2¿ÈÃ!¿q0¿K8û¾i:Ô¾°«¾徕N.¾¯½¶‰¸8x÷®=ú<.>]Ü>§§«>H2Ô>dLû>ø9?RÀ!?‚2?$A?³ÆN?çZ?¸ue?`On?Úku?ݽz?z;~?+Þ?á¢?Õ‡}?”y?þÍs?…@l?µùb?å X?Ë~K?"=?{.?’v?ƒ© ?¯ñ>´GÊ>H¡>qn>˜”>,6ƒ=ÓÇ®¼vHÚ½™£C¾†yŒ¾lûµ¾^)Þ¾&\¿°¿Hî%¿ö5¿ µD¿ÝøQ¿r´]¿ßÑg¿>>p¿Óév¿ Ë{¿­Ñ~¿Jü¿µH¿<¸|¿«Ox¿=r¿j¿á``¿‚ U¿*&H¿îË9¿*¿#¿Ø¿tíç¾öÀ¾‘ë–¾|:Y¾ ¾Iƒ/½9a/=–ÿ>'2Y>~ç–>À>§éç>¡?Û!?*?vÊ9?Ö$H?S U?Ú_`?µj?Œr?&Ox?å·|?ŒH?Pü?áÑ~?ŠÈ{?cêv?ú>p?ÇÒg?ƒµ]?úQ?)¬D?ÿ÷5?çï%?Ô±?ü]?5-Þ>hÿµ>Ù^Œ>÷«C>iYÚ= ¯<)%ƒ½+Œ¾Éhn¾cb¡¾ÊCʾY«ñ¾º§ ¿ät¿ë.¿³}=¿5‡K¿À X¿¹øb¿³?l¿XÍs¿“y¿À‰}¿Ä¢¿<Þ¿º;~¿K¾z¿ulu¿'Pn¿‘oe¿:èZ¿ôÇN¿g%A¿ 2¿ùÁ!¿»;¿94û¾(6Ô¾«««¾}à¾`E.¾t¯½ºü¸ ¯=.F.>âà>¬«>ˆ6Ô>”4û>æ;?"Â!?02?‰%A?ÈN?UèZ?¨oe?:Pn?„lu?V¾z?À;~?>Þ?Á¢?¹‰}?‚“y?HÍs?ž?l?¡øb?¤ X?‡K?}=?Å.?»t?ާ ?üªñ>jCÊ>b¡>ýgn>[‹>‡#ƒ=‹¯¼ [ڽŬC¾>_Œ¾Êÿµ¾“-Þ¾)^¿ÿ±¿ð%¿$ø5¿K¬D¿3úQ¿µ]¿ÝÒg¿ ?p¿pêv¿“È{¿æÑ~¿Qü¿ˆH¿Ý·|¿Ox¿{r¿ j¿Á_`¿6 U¿µ$H¿RÊ9¿Þ*¿±!¿t¿Jé羡À¾ç–¾[1Y¾Æþ¾ô]/½Ê†.=Ú>H;Y>õë–>W À>Ñíç>?º#?Ä*?Ì9?K&H?Ÿ U?ú``?-j?Nr?¸Ox?E¸|?¹H?Jü?¨Ñ~?Ë{?Åév?,>p?ÉÑg?X´]?¿øQ?è´D?[ö5? î%?í¯?ù[?ÿ(Þ> ûµ>!yŒ>Ì¢C>ÕFÚ=IÁ®<Î7ƒ½g•¾Þqn¾tH¡¾Hʾw¯ñ¾¯© ¿¼v¿¢.¿E=¿ê~K¿ X¿Îùb¿™@l¿Îs¿”y¿Ü‡}¿ä¢¿)Þ¿t;~¿Ó½z¿Ëku¿LOn¿¡ue¿çZ¿”ÆN¿ß#A¿]2¿*À!¿Í9¿ Lû¾è1Ô¾E§«¾øÛ¾+<.¾Öõ®½Ðþ±¸*®=cO.>gå>t°«>È:Ô>¦8û>œ0?ñÃ!?Ý2?'A?tÉN?‹éZ?²pe?l?Œ÷b?cX?ª…K?À†=?.?är?™¥ ?Þ¦ñ>?Ê>‘]¡>%n>‚>âƒ=B]¯¼mÚ½ðµC¾¼cŒ¾>æµ¾È1Þ¾+`¿å³¿Öñ%¿Èù5¿É­D¿bòQ¿È¶]¿ÚÓg¿Û?p¿ëv¿ÿÈ{¿—Ð~¿Wü¿[H¿}·|¿ˆNx¿¸r¿®j¿Uf`¿ëU¿@#H¿·È9¿*¿Ò¿x¿§è¾MÀ¾£â–¾:(Y¾ƒõ¾Ÿ8/½¬.=¤Ò>iDY>kð–>«$À>ûñç>?Æ?ƒ*?­Í9?¿'H?ê U?b`?j?Ýr?IPx?¤¸|?åH?Cü?oÑ~?–Ê{?`ív?]=p?ËÐg?-³]?i÷Q?j³D?÷ÿ5?Yì%?®?÷Y?Ê$Þ>¬öµ>£tŒ>rØC>B4Ú=’v®ëé>Û´«>?Ô>¸<û>Š2?Y¹!?‹2?š(A?ÔÊN?ÁêZ?»qe?Ln?Jiu?G¿z?L<~?dÞ?¢?‰}?–y?¼Ðs?Ò=l?xöb?"X??„K?.…=?$.? q?££ ?À¢ñ>Õ:Ê>#Y¡>”n>+¸>=þ‚=ú§¯¼1€Ú½¿C¾:hŒ¾œêµ¾)Þ¾.b¿Ìµ¿žó%¿mû5¿H¯D¿¸óQ¿ó¯]¿ØÔg¿©@p¿¬ëv¿kÉ{¿ÐÐ~¿2ü¿/H¿·|¿÷Mx¿ör¿¼j¿5e`¿~U¿Ì!H¿Ç9¿`*¿ó¿| ¿}ýç¾¢0À¾-Þ–¾Y¾?ì¾J/½tÑ.=èÛ>ŠMY>âô–>ÿ(À>%öç>ý?¦?L*?HÏ9?4)H?6 U?9c`?j?Ÿr?öLx?¹|?I?=ü?5Ñ~?*Ê{?Âìv?Bp?ÎÏg?²]?öQ?ë±D?Rþ5?Àö%? ¬?ôW?• Þ>Oòµ>&pŒ>GÏC>ó Ú=Ú+®<]ƒ½á§¾ „n¾QQ¡¾D3ʾ}›ñ¾™­ ¿jz¿!.¿i‚=¿ÀK¿íX¿ôb¿eBl¿{Ïs¿•y¿‚ˆ}¿I¢¿†Þ¿è:~¿â¼z¿wju¿˜Mn¿Žse¿äìZ¿BÍN¿Î A¿2¿‹¼!¿ñ5¿åCû¾‡FÔ¾¼«¾ïÒ¾Â).¾œÐ®½¬:d·e®=»".>pî>A¹«>HCÔ>Ê@û>x4?)»!?º2?"*A?5ÌN?÷ëZ?Äre?ñLn?õiu?…¼z?’<~?wÞ?a¢?Áˆ}?‚•y?Ðs?Cl?cõb?âX?Õ‚K?œƒ=?]".?Ò{?®¡ ?¢žñ>Š6Ê>´T¡>ùŠn>î®>Tkƒ=±ò¯¼Ä’Ú½GÈC¾¸lŒ¾ùîµ¾^Þ¾kV¿³·¿eõ%¿ý5¿Ç°D¿õQ¿±]¿ Ïg¿xAp¿Jìv¿×É{¿ Ñ~¿8ü¿4I¿¾¶|¿eMx¿4r¿Êj¿d`¿3U¿Q*H¿€Å9¿¢*¿¿€ ¿Sùç¾M,À¾Jø–¾÷Y¾ûâ¾õí.½Éö.=,å> Y>Xù–>T-À>Oúç>ù ?…? *?âÅ9?©*H?U?Yd`?j?br?ˆMx?Õ¶|??I?6ü?üÐ~?¾É{?%ìv?GAp?šÕg?×°]?½ôQ?l°D?®ü5?ùô%?@·?ñU?_Þ>ñíµ>¨kŒ>ÆC>`ŽÚ=á¯<½oƒ½±¾n¾ÀU¡¾Ž7ʾ›Ÿñ¾%¢ ¿B|¿Ä".¿ûƒ=¿+ƒK¿.X¿¥õb¿"=l¿1Ðs¿¢•y¿Ôˆ}¿i¢¿sÞ¿‚<~¿i¼z¿Ìiu¿½Ln¿…re¿®ëZ¿áËN¿Æ)A¿T2¿»º!¿4¿Ó?û¾GBÔ¾7¸«¾^í¾Ž .¾þ½®½ŸÑ¸7Õ®=ð+.>Ô>¨½«>ˆGÔ>ÜDû>f6?ø¼!?g2?+!A?•ÍN?-íZ?Íse?ËMn?Ÿju?þ¼z?ø:~?ŠÞ?A¢?nˆ}?ý”y?PÏs?/Bl?µûb?¡X?jK? ‚=?¦ .?ûy?"­ ?„šñ>@2Ê>EP¡>än>±¥>¯Xƒ=†=®¼X¥Ú½rÑC¾6qŒ¾W󵾓!Þ¾nX¿“¬¿,÷%¿¶þ5¿E²D¿döQ¿I²]¿ Ðg¿Àü¿I¿í¸|¿ÔLx¿qr¿Øj¿õb`¿è U¿Ü(H¿çÎ9¿ã *¿4¿„¿)õç¾ù'À¾Ôó–¾bKY¾·Ù¾ È.½/=pî>A!Y>;ß–>¨1À>yþç>ô ?d?Ê*?}Ç9?$"H?ÍU?ye`?õj?$r?Nx?5·|?9H?0ü?ÂÐ~?RÉ{?‡ëv?y@p?œÔg?¬·]?góQ?î®D? û5?2ó%?Yµ?´a?*Þ>“éµ>*gŒ>ð¼C>Ì{Ú=N–¯<¦ƒ½Zº¾5–n¾/Z¡¾Ù;ʾ¹£ñ¾¤ ¿|q¿{$.¿…=¿•„K¿nX¿¹öb¿>l¿Ìs¿'–y¿'‰}¿‰¢¿`Þ¿<<~¿*¿z¿"iu¿ãKn¿|qe¿xêZ¿ÊN¿=(A¿%2¿ì¸!¿2¿Â;û¾>Ծг«¾Úè¾jV.¾a«®½Jàq8 ç®=$5.>…Ø>飫>ÈKÔ>îHû>T8?Ⱦ!?2?³"A?‡ÅN?cîZ?Öte?¦Nn?Iku?w½z?>;~?Þ?!¢?ˆ}?x”y?šÎs?IAl?¡úb?ö X?ÿK?x€=?ð.?#x?-« ?œ²ñ>õ-Ê>ÖK¡>Îxn>uœ> Fƒ=>ˆ®¼§8Ú½ÚC¾³uŒ¾µ÷µ¾É%Þ¾pZ¿z®¿Äì%¿Z6¿Ä³D¿º÷Q¿t³]¿Ñg¿Ž=p¿Lév¿¯Ê{¿|Ñ~¿Eü¿ÛH¿¸|¿'Px¿¯r¿æj¿Õa`¿œ U¿g'H¿LÍ9¿*¿U¿‰¿ÿðç¾¥#À¾]ï–¾ABY¾í¾K£.½tA/=´÷>b*Y>²ã–>SÀ>£è>ð?C ?‰*?É9?™#H?9U?™f`?çj?ær?«Nx?”·|?fH?Uü?‰Ð~?æÈ{?éêv?ª?p?žÓg?‚¶]?8ûQ?o­D?eù5?kñ%?r³?±_?É0Þ>6åµ>¬bŒ>ųC>8iÚ=–K¯l¿½Ìs¿“y¿z‰}¿©¢¿LÞ¿ö;~¿²¾z¿mu¿Kn¿spe¿BéZ¿ ÉN¿µ&A¿x2¿ƒÃ!¿'0¿°7û¾Ç9Ô¾j¯«¾Uä¾6M.¾K¯½â«Ã8>ú®=Y>.> Ý>O¨«>ê2Ô>ÿLû>B:?—À!?Â2?;$A?çÆN?NçZ?ßue?€On?óku?ï½z?„;~?.Þ?Ü¢?ȇ}?ó“y?ãÍs?b@l?Œùb?µ X?IˆK?æ~=?:.?Lv?8© ?}®ñ>GÊ>gG¡>¸on>8“>e3ƒ=õÒ®¼:KÚ½÷¤C¾1zŒ¾üµ¾þ)Þ¾s\¿a°¿Œî%¿¾ö5¿CµD¿ùQ¿Ÿ´]¿Òg¿]>p¿êév¿7È{¿¶Ñ~¿Kü¿®H¿.¸|¿•Ox¿ r¿ôj¿¶``¿Q U¿ò%H¿°Ë9¿Z*¿I#¿¿Õìç¾PÀ¾æê–¾ 9Y¾©¾º}/½Éf/=÷>ƒ3Y>(è–>§À>Fêç>ì?""?H*?´Ê9? %H?… U?``?Ùj?©r?p?¡Òg?Wµ]?âùQ?.¶D?À÷5?£ï%?Œ±?¯]?”,Þ>Áþµ>.^Œ>™ªC>¥VÚ=߯<ð'ƒ½‹¾#jn¾ c¡¾nDʾö«ñ¾¨ ¿*u¿-.¿ï}=¿k‡K¿ð X¿âøb¿Õ?l¿sÍs¿¡“y¿–‡}¿É¢¿9Þ¿°;~¿9¾z¿[lu¿Pn¿joe¿ èZ¿ÀÇN¿-%A¿Ê2¿´Á!¿r;¿ž3û¾†5Ô¾««¾Ðß¾D.¾®¯½a˜ñ¸Û ¯=G.>Žá>¶¬«>*7Ô>/5û>0<?gÂ!?p2?Ä%A?HÈN?„èZ?Ðoe?ZPn?lu?h¾z?Ë;~?AÞ?¼¢?­‰}?n“y?-Ís?|?l?xøb?t X?߆K?ˆ=?„.?ut?C§ ?_ªñ>ÆBÊ>Wa¡>£fn>û‰>À ƒ=¬¯¼Î]Ú½"®C¾é_Œ¾p¶¾3.Þ¾u^¿G²¿Sð%¿cø5¿„¬D¿fúQ¿Êµ]¿Óg¿+?p¿ˆêv¿£È{¿fÐ~¿Qü¿H¿Ï·|¿Ox¿^r¿|j¿–_`¿ U¿~$H¿Ê9¿œ*¿i!¿(¿«èç¾üÀ¾pæ–¾þ/Y¾eý¾dX/½ZŒ.=; >¤Ÿì–>ü À>pîç>P?$?*?OÌ9?‚&H?Ð U?%a`?Qj?kr?ÍOx?S¸|?¿H?Iü?ŸÑ~?òÊ{?­év? >p?£Ñg?,´]?ŒøQ?¯´D?]6?Üí%?¥¯?¬[?_(Þ>dúµ>vxŒ>n¡C>DÚ='¶®<•:ƒ½È–¾9sn¾I¡¾¸Hʾ°ñ¾ù© ¿w¿ã.¿=¿ K¿1 X¿÷ùb¿»@l¿*Îs¿&”y¿è‡}¿é¢¿&Þ¿i;~¿Á½z¿±ku¿,On¿yue¿ÖæZ¿_ÆN¿¤#A¿2¿å¿!¿„9¿nKû¾F1Ô¾¦«¾LÛ¾Ì:.¾󮽤ܦ¸ðŸ®=ÂP.>æ>±«>j;Ô>A9û>æ0?6Ä!?2?L'A?¨ÉN?¹éZ?Ùpe?\Kn?Gmu?à¾z?<~?TÞ?¢?Z‰}?x–y?wÌs?–>l?c÷b?3X?t…K?„†=?ˆ%.?r?N¥ ?A¦ñ>|>Ê>è\¡>Ê›n>¾€>ƒ=dh¯¼bpÚ½N·C¾gdŒ¾åæµ¾i2Þ¾x`¿.´¿ò%¿ú5¿®D¿•òQ¿õ¶]¿Ôg¿ú?p¿&ëv¿É{¿ŸÐ~¿Xü¿UH¿o·|¿rNx¿›r¿Šj¿*f`¿ºU¿ #H¿zÈ9¿Ý*¿Š¿-¿辨À¾ùá–¾Ý&Y¾!ô¾3/½¯±.=Ô>ÅEY>ñ–>P%À>šòç>L??Æ*?êÍ9?÷'H? U?Db`?Cj?úr?_Px?²¸|?ìH?Bü?fÑ~?†Ê{?Iív??=p?¥Ðg?³]?6÷Q?1³D?¸ÿ5?Dø%?¾­?ªY?*$Þ>öµ>øsŒ>×C>}1Ú=pk®<:Mƒ½ ¾O|n¾ŒM¡¾/ʾ2´ñ¾î« ¿Ùx¿™.¿=¿‹€K¿ÜX¿ ûb¿¡Al¿àÎs¿«”y¿;ˆ}¿.¢¿Þ¿#;~¿H½z¿ku¿QNn¿pte¿ëíZ¿ÿÄN¿"A¿o2¿¾!¿–7¿\Gû¾%JÔ¾6¢«¾ÇÖ¾˜1.¾s஽ÍA8¸Ž²®=å.>˜ê>ƒµ«>ª?Ô>S=û>Ô2?ž¹!?Ë2?Õ(A? ËN?ïêZ?âqe?7Ln?diu?Y¿z?W<~?gÞ?}¢?‰}?ó•y?¡Ðs?¯=l?Oöb?óX? „K?ò„=?Ò#.?c}?Y£ ?#¢ñ>1:Ê>yX¡>µ’n>˶>vû‚=³¯¼õ‚Ú½yÀC¾åhŒ¾Bëµ¾ÉÞ¾zb¿¶¿áó%¿¬û5¿¯D¿ëóQ¿ °]¿þÔg¿È@p¿Äëv¿{É{¿ÙÐ~¿2ü¿(H¿·|¿áMx¿Ùr¿˜j¿ e`¿MU¿”!H¿ÞÆ9¿*¿«¿1 ¿Þüç¾ý/À¾‚Ý–¾¼Y¾Ý꾺 /½×.=IÝ>[Y>Œõ–>¤)À>Äöç>H ?í?*?†Ï9?l)H?g U?dc`?5j?¼r? Mx?¹|?I?<ü?-Ñ~?Ê{?«ìv?÷Ap?¨Ïg?Ö±]?àõQ?²±D?þ5?}ö%?Þ¸?§W?ôÞ>¨ñµ>zoŒ>éÍC>/žÚ=¹ ®<ß_ƒ½A©¾d…n¾úQ¡¾ç3ʾœñ¾ã­ ¿±z¿O!.¿¥‚=¿öK¿X¿¹ôb¿ˆBl¿–Ïs¿0•y¿Žˆ}¿N¢¿ƒÞ¿Ý:~¿Ð¼z¿]ju¿wMn¿gse¿¶ìZ¿ ÍN¿“ A¿Â2¿F¼!¿¨5¿JCû¾åEÔ¾õ»«¾CÒ¾c(.¾ÖÍ®½J) ·+Å®=$.>(Ð>鹫>êCÔ>eAû>Â4?n»!?ú2?]*A?iÌN?%ìZ?ëre?Mn?ju?—¼z?<~?zÞ?]¢?µˆ}?n•y?ëÏs?óBl?:õb?²X?Ÿ‚K?`ƒ=?".?Œ{?Í® ?žñ>ç5Ê> T¡>Ÿ‰n>Ž­>hƒ=Òý¯¼‰•Ú½¤ÉC¾cmŒ¾ ïµ¾ÿÞ¾¸V¿û·¿©õ%¿Pý5¿±D¿AõQ¿K±]¿2Ïg¿—Ap¿aìv¿çÉ{¿Ñ~¿9ü¿-I¿°¶|¿OMx¿r¿¦j¿êc`¿U¿*H¿CÅ9¿_*¿Ì¿5 ¿´øç¾¨+À¾ ÷–¾›Y¾šá¾eè.½Yü.=æ>|Y>oÛ–>ù-À>îúç>D ?Ì?N*?Æ9?à*H?³U?„d`?'j?r?Mx?ã¶|?EI?5ü?óÐ~?®É{? ìv?(Ap?tÕg?«°]?ŠôQ?3°D?oü5?µô%?÷¶?jc?¿Þ>Kíµ>üjŒ>¾ÄC>›‹Ú=ãÕ¯<„rƒ½~²¾zŽn¾iV¡¾28ʾ8 ñ¾p¢ ¿ˆ|¿#.¿7„=¿aƒK¿]X¿Îõb¿D=l¿LÐs¿µ•y¿áˆ}¿n¢¿pÞ¿w<~¿W¼z¿³iu¿Ln¿^re¿€ëZ¿­ËN¿‹)A¿2¿vº!¿º3¿8?û¾¥AÔ¾·«¾²ì¾/.¾8»®½PZå7É×®=O-.>­Ô>* «>*HÔ>wEû>°6?=½!?§2?e!A?ÊÍN?[íZ?õse?ìMn?¸ju?½z?;~?Þ?=¢?bˆ}?é”y?5Ïs? Bl?Œûb?qX?4K?Î=?e .?µy?ج ?¶ñ>œ1Ê>œO¡>‰€n>Q¤>èUƒ=¨H®¼¨Ú½ÐÒC¾áqŒ¾þóµ¾4"Þ¾ºX¿Ü¬¿p÷%¿õþ5¿~²D¿—öQ¿v²]¿/Ðg¿Þ"Y>åß–>¤À>ÿç>@ ?«? *?ºÇ9?["H?þU?¤e`?j?Ar?/Nx?C·|?@H?/ü?ºÐ~?BÉ{?oëv?Z@p?vÔg?€·]?4óQ?µ®D?Ëú5?îò%?µ?ga?^4Þ>íèµ>~fŒ>’»C>yÚ=,‹¯l¿"Ìs¿:–y¿4‰}¿Ž¢¿]Þ¿1<~¿¿z¿ iu¿ÂKn¿Uqe¿JêZ¿LÊN¿(A¿å2¿§¸!¿Ì1¿&;û¾e=Ô¾)³«¾-è¾ U.¾›¨®½Q„8fê®=ƒ6.>1Ù>¤«>L/Ô>‰Iû>ž8? ¿!?U2?í"A?»ÅN?‘îZ?þte?ÆNn?bku?‰½z?I;~?Þ?¢?ˆ}?d”y?~Îs?&Al?wúb?Æ X?ÉK?<€=?¯.?Ýw?⪠?ÿ±ñ>¸JÊ>-K¡>swn>›>CCƒ=_“®¼k;Ú½ûÛC¾_vŒ¾[øµ¾i&Þ¾½Z¿Â®¿í%¿™6¿ý³D¿í÷Q¿¡³]¿-Ñg¿­=p¿dév¿¿Ê{¿…Ñ~¿Fü¿ÔH¿¸|¿Px¿’r¿Âj¿«a`¿k U¿0'H¿Í9¿×*¿¿=¿`ðç¾#À¾³î–¾ä@Y¾‹¾».½G/=ù>¾+Y>\ä–>øÀ>»æç><?Š ?Ì*?VÉ9?Ð#H?kU?Äf`? j?r?ÀNx?¢·|?mH?Tü?€Ð~?ÖÈ{?Ñêv?‹?p?yÓg?U¶]?ûQ?6­D?&ù5?'ñ%?*³?e_?)0Þ>äµ>bŒ>g²C>tfÚ=u@¯<ƒ½®…¾¥ n¾G_¡¾Ç@ʾu¨ñ¾Z¦ ¿™s¿¸.¿[‡=¿6†K¿ßX¿÷÷b¿?l¿ØÌs¿0“y¿†‰}¿®¢¿JÞ¿ë;~¿ ¾z¿ìlu¿èJn¿Kpe¿éZ¿ìÈN¿z&A¿82¿>Ã!¿Þ/¿7û¾$9Ծ®«¾©ã¾ÖK.¾…¯½ÎÎ8ý®=¸?.>¶Ý>÷¨«>Œ3Ô>¹1û>Œ:?ÜÀ!?2?v$A?ÇN?|çZ?ve?¡On? lu?¾z?;~?0Þ?Ø¢?¼‡}?ß“y?ÈÍs?@@l?cùb?… X?ˆK?ª~=?ù.?v?í¨ ?à­ñ>mFÊ>¾F¡>^nn>Ø‘>ž0ƒ=Þ®¼ÿMÚ½U¦C¾ÝzŒ¾¹üµ¾Ÿ*Þ¾¿\¿©°¿Ïî%¿ýö5¿|µD¿CùQ¿Ë´]¿+Òg¿{>p¿êv¿GÈ{¿¾Ñ~¿Lü¿§H¿ ¸|¿€Ox¿r¿Ðj¿‹``¿ U¿»%H¿sË9¿*¿#¿A¿6ì羫À¾<ê–¾Ã7Y¾H¾*x/½Yl/=Y>à4Y>Òè–>LÀ>åêç> ?i"?Š*?ñÊ9?E%H?¶ U?0``?ýj?Ær?ROx?¸|?™H?Nü?ÐÑ~?jÈ{?4êv?½>p?{Òg?*µ]?¯ùQ?õµD?‚÷5?`ï%?C±?b]?ô+Þ>þµ>ƒ]Œ><©C>àSÚ=½õ®<·*ƒ½ë޾~kn¾¶c¡¾Eʾ“¬ñ¾O¨ ¿qu¿n.¿+~=¿¡‡K¿ X¿ ùb¿÷?l¿ŽÍs¿µ“y¿¢‡}¿Í¢¿6Þ¿¥;~¿'¾z¿Blu¿æOn¿Boe¿ÞçZ¿‹ÇN¿ò$A¿Š2¿oÁ!¿(;¿3û¾ä4Ô¾[ª«¾$ß¾¢B.¾è¯½4v渡¯=íH.>;â>]­«>Ì7Ô>Ë5û>A/?¬Â!?°2?þ%A?|ÈN?²èZ?÷oe?{Pn?¶lu?z¾z?Õ;~?DÞ?¸¢?¡‰}?Z“y?Ís?Z?l?Nøb?D X?©†K?Ú‡=?B.?.t?ø¦ ?©ñ>#BÊ>®`¡>Hen>›ˆ>ùƒ=Î(¯¼’`Ú½€¯C¾•`Œ¾¶¾Ô.Þ¾Â^¿²¿—ð%¿¡ø5¿½¬D¿™úQ¿öµ]¿(Óg¿J?p¿Ÿêv¿³È{¿nÐ~¿Rü¿{H¿À·|¿îNx¿Ar¿Xj¿k_`¿ÔU¿F$H¿ØÉ9¿Y*¿"!¿Ý¿ èç¾WÀ¾Æå–¾¢.Y¾ü¾ÕR/½é‘.= >>Y>Ií–>¡!À>ïç>œ?v?I*?ŒÌ9?º&H? U?Oa`?uj?ˆr?ãOx?a¸|?ÆH?Hü?—Ñ~?âÊ{?–év?î=p?}Ñg?ÿ³]?YøQ?v´D?6?˜í%?\¯?`[?¾'Þ>½ùµ>ËwŒ> C>LAÚ=«®<\=ƒ½(˜¾“tn¾ÆI¡¾\Iʾ±°ñ¾Dª ¿Hw¿$.¿½=¿VK¿` X¿ úb¿Ý@l¿EÎs¿:”y¿õ‡}¿¢¿#Þ¿_;~¿¯½z¿˜ku¿ On¿Rue¿¨æZ¿+ÆN¿j#A¿Ý2¿Ÿ¿!¿:9¿ÓJû¾¤0Ô¾õ¥«¾ Ú¾m9.¾Kð®½wº›¸¶¢®=!R.>¿æ>ı«> <Ô>Ý9û>/1?¸!?]2?‡'A?ÝÉN?èéZ?qe?}Kn?`mu?ò¾z?<~?WÞ?˜¢?N‰}?e–y?[Ìs?s>l?:÷b?X?>…K?H†=?G%.?Wr?¥ ?¤¥ñ>Ø=Ê>?\¡>pšn>^>T ƒ=…s¯¼&sÚ½«¸C¾eŒ¾‹çµ¾ 3Þ¾Ä`¿v´¿^ò%¿Fú5¿;®D¿ÈòQ¿!·]¿&Ôg¿@p¿=ëv¿ É{¿¨Ð~¿-ü¿NH¿a·|¿]Nx¿r¿fj¿ÿe`¿ˆU¿Ñ"H¿=È9¿š*¿C¿á ¿iè¾À¾Oá–¾%Y¾Àò¾€-/½?·.=gÕ>"GY>Àñ–>õ%À>9óç>˜?U? *?(Î9?.(H?M U?ob`?gj?r?tPx?À¸|?óH?Aü?^Ñ~?vÊ{?1ív? =p?€Ðg?Ô²]?÷Q?ø²D?zÿ5?ø%?v­?]Y?‰#Þ>_õµ>MsŒ>·ÕC>¹.Ú=N`®<Pƒ½e¡¾©}n¾5N¡¾@0ʾϴñ¾9¬ ¿y¿Ú.¿O=¿Á€K¿ X¿4ûb¿ÄAl¿ûÎs¿¿”y¿Hˆ}¿3¢¿“Þ¿;~¿6½z¿îju¿1Nn¿Hte¿½íZ¿ÊÄN¿á!A¿/2¿Ð½!¿L7¿ÁFû¾ƒIÔ¾Ž¡«¾Ö¾90.¾­Ý®½tý!¸Tµ®=E.>Dë>*¶«>L@Ô>î=û>3?ä¹!?Œ2?)A?=ËN?ëZ? re?WLn?}iu?k¿z?a<~?jÞ?x¢?ûˆ}?à•y?†Ðs?=l?%öb?ÃX?ÓƒK?¶„=?#.?}?£ ?†¡ñ>Ž9Ê>ÐW¡>Z‘n>jµ>¯ø‚==¾¯¼º…Ú½×ÁC¾iŒ¾éëµ¾jÞ¾Çb¿]¶¿%ô%¿êû5¿º¯D¿ôQ¿L°]¿$Õg¿ç@p¿Ûëv¿ŒÉ{¿áÐ~¿3ü¿SI¿·|¿ËMx¿¼r¿tj¿ßd`¿U¿\!H¿¡Æ9¿Û*¿d¿å ¿?üç¾X/À¾ØÜ–¾`Y¾|é¾*/½”Ü.=«Þ>·Y>6ö–>J*À>c÷ç>” ?4?Ò*?ÁÄ9?£)H?™ U?c`?Yj?Ùr?!Mx? ¹|?I?;ü?$Ñ~? Ê{?“ìv?ØAp?‚Ïg?©±]?­õQ?y±D?Õý5?9ö%?•¸?[W?TÞ>ñµ>ÏnŒ>‹ÌC>j›Ú=—®<¦bƒ½¡ª¾¿†n¾£R¡¾‹4ʾ·œñ¾.® ¿÷z¿‘!.¿á‚=¿,‚K¿LX¿âôb¿ªBl¿±Ïs¿D•y¿šˆ}¿S¢¿€Þ¿³<~¿¾¼z¿Dju¿WMn¿?se¿‡ìZ¿ÙÌN¿Y A¿‚2¿¼!¿^5¿¯Bû¾CEÔ¾N»«¾–Ѿ'.¾Ë®½Ÿ_H¶ñÇ®=y%.>ÔÐ>‘º«>ŒDÔ>Bû> 5?³»!?:2? A?žÌN?SìZ?se?2Mn?'ju?©¼z?§<~?}Þ?X¢?¨ˆ}?[•y?ÐÏs?ÐBl?õb?‚X?i‚K?$ƒ=?Ú!.?F{?‚® ?hñ>C5Ê>bS¡>Dˆn>.¬>Æeƒ=ô°¼M˜Ú½ËC¾nŒ¾F𵾟Þ¾W¿D¸¿ìõ%¿ý5¿9±D¿tõQ¿w±]¿WÏg¿µAp¿yìv¿øÉ{¿Ñ~¿:ü¿'I¿0¹|¿:Mx¿úr¿‚j¿¿c`¿Ð U¿â)H¿Å9¿*¿…¿é ¿øç¾+À¾öö–¾?Y¾8à¾Õâ.½é/=ïç>ØY>Ü–>ž.À>ûç> ??*?\Æ9?+H?äU?¯d`?Kj?›r?³Mx?ò¶|?LI?5ü?ëÐ~?žÉ{?öëv? Ap?NÕg?~°]?WôQ?ú¯D?1ü5?rô%?¯¶?c?Þ>¤ìµ>QjŒ>`ÃC>׈Ú=Âʯû¾AԾ綫¾ì¾Ï.¾r¸®½€ñ8Ú®=®..>YÕ>Ò «>ÍHÔ>Fû>ù6?‚½!?ç2?Ÿ!A?þÍN?‰íZ?te? Nn?Ñju?"½z? ;~?Þ?8¢?Uˆ}?Õ”y?Ïs?êAl?cûb?AX?þ€K?’=?$ .?ny?¬ ?€µñ>ù0Ê>óN¡>/n>ñ¢>!Sƒ=ÉS®¼áªÚ½-ÔC¾ŒrŒ¾¤ôµ¾Ô"Þ¾Y¿$­¿´÷%¿3ÿ5¿·²D¿ÊöQ¿¢²]¿UÐg¿ý'/=2ñ>ú#Y>à–>IÀ>·ÿç>Œ ?ó?O*?øÇ9?“"H?0U?Ïe`?=j?^r?DNx?Q·|?GH?.ü?±Ð~?2É{?Xëv?;@p?PÔg?S·]?óQ?|®D?Œú5?ªò%?È´?a?¾3Þ>Fèµ>ÓeŒ>5ºC>CvÚ= €¯<4ƒ½½¾ê˜n¾[¡¾ =ʾó¤ñ¾¯¤ ¿r¿ý$.¿†=¿…K¿ÎX¿ ÷b¿M>l¿=Ìs¿N–y¿@‰}¿’¢¿ZÞ¿'<~¿¿z¿}mu¿¢Kn¿-qe¿êZ¿ÊN¿È'A¿¥2¿b¸!¿‚1¿‹:û¾Â<Ô¾²«¾ç¾¬S.¾Õ¥®½}48,í®=â7.>ÞÙ>8¥«>î/Ô>$Jû>ç8?R¿!?•2?(#A?ðÅN?¿îZ?%ue?çNn?|ku?›½z?S;~? Þ?¢?ˆ}?P”y?cÎs?Al?Núb?– X?“K?€=?n.?—w?˜ª ?b±ñ>JÊ>„J¡>vn>´™>|@ƒ=ž®¼0>Ú½YÝC¾ wŒ¾ùµ¾ 'Þ¾ [¿ ¯¿Lí%¿Ø6¿6´D¿ øQ¿Í³]¿SÑg¿Ì=p¿{év¿ÐÊ{¿Ñ~¿Gü¿ÍH¿q¸|¿ûOx¿©r¿žj¿€a`¿9 U¿ø&H¿ÑÌ9¿”*¿Æ¿ñ¿Áïç¾["À¾ î–¾ˆ?Y¾* ¾+˜.½“L/=vú>-Y>å–>À>Yçç>ˆ?Ò ?*?“É9?$H?œU?îf`?/j? r?ÖNx?°·|?sH?Sü?xÐ~?ÆÈ{?ºêv?m?p?SÓg?(¶]?ÒúQ?ý¬D?èø5?ãð%?á²?_?ˆ/Þ>Ò¶>UaŒ> ±C>¯cÚ=S5¯<Ùƒ½‡¾¢n¾ð_¡¾kAʾ©ñ¾¤¦ ¿ßs¿ù.¿—‡=¿l†K¿ X¿ øb¿3?l¿óÌs¿D“y¿“‰}¿²¢¿GÞ¿á;~¿Ž¾z¿Ólu¿ Pn¿$pe¿æèZ¿·ÈN¿@&A¿ø2¿ùÂ!¿”/¿y6û¾‚8Ô¾®«¾üâ¾wJ.¾À¯½;ðÙ8Éÿ®=A.>bÞ>Ÿ©«>.4Ô>T2û>Õ:?!Á!?B2?°$A?PÇN?ªçZ?.ve?ÁOn?&lu?¾z?™;~?3Þ?Ó¢?°‡}?Ë“y?­Ís?@l?:ùb?U X?݇K?n~=?·.?Àu?£¨ ?C­ñ>ÉEÊ>td¡>mn>w>×-ƒ=8鮼ÃPÚ½²§C¾ˆ{Œ¾_ýµ¾?+Þ¾ ]¿ò°¿ï%¿;÷5¿µµD¿vùQ¿ø´]¿PÒg¿š>p¿êv¿XÈ{¿ÇÑ~¿Mü¿¡H¿¸|¿jOx¿ær¿&j¿```¿î U¿ƒ%H¿6Ë9¿Õ*¿º"¿õ¿—ëç¾À¾’é–¾g6Y¾æ¾šr/½èq/=º><6Y>}é–>òÀ>„ëç>ì?±"?Í*?.Ë9?|%H?è U?[``?!j?ãr?gOx?¸|? H?Mü?ÈÑ~?ZÈ{?êv?ž>p?UÒg?þ´]?|ùQ?¼µD?C÷5?ï%?û°?]?S+Þ>týµ>{Œ>Þ§C>QÚ=œê®<~-ƒ½K¾Øln¾_d¡¾µEʾ0­ñ¾™¨ ¿·u¿¯.¿g~=¿×‡K¿O X¿5ùb¿@l¿ªÍs¿É“y¿®‡}¿Ò¢¿4Þ¿›;~¿¾z¿)lu¿ÅOn¿3ve¿°çZ¿WÇN¿¸$A¿J2¿*Á!¿Þ:¿g2û¾B4Ô¾´©«¾xÞ¾CA.¾"¯½TÛ¸g¯=LJ.>çâ>®«>n8Ô>f6û>‹/?ñÂ!?ð2?9&A?±ÈN?àèZ?pe?œPn?Ðlu?Œ¾z?ß;~?FÞ?³¢?”‰}?F“y?÷Ìs?7?l?%øb? X?s†K?ž‡=?.?ès?®¦ ?%©ñ>AÊ>`¡>+¢n>;‡>2ƒ=ï3¯¼WcÚ½Þ°C¾@aŒ¾½¶¾t/Þ¾_¿Ø²¿Ûð%¿àø5¿ö¬D¿ÌúQ¿#¶]¿NÓg¿i?p¿·êv¿ÄÈ{¿wÐ~¿Sü¿tH¿²·|¿ÙNx¿$r¿4j¿ôf`¿¢U¿$H¿›É9¿*¿Û ¿‘¿mçç¾²À¾å–¾F-Y¾¢ú¾EM/½y—.=þ >]?Y>óí–>F"À>®ïç>è?½?Œ*?ÊÌ9?ñ&H?3 U?za`?™j?¥r?ùOx?o¸|?ÍH?Gü?ŽÑ~?ÒÊ{?~év?Ð=p?XÑg?Ó³]?&øQ?=´D?ß6?Tí%?¯?[?'Þ>ùµ>wŒ>„ÝC>ˆ>Ú=䟮<#@ƒ½ˆ™¾îun¾oJ¡¾ÿIʾN±ñ¾ª ¿Žw¿e.¿ù=¿K¿ X¿Iúb¿Al¿`Îs¿N”y¿ˆ}¿¢¿ Þ¿U;~¿½z¿ku¿ëNn¿*ue¿ÅîZ¿öÅN¿/#A¿2¿Z¿!¿ð8¿7Jû¾0Ô¾M¥«¾óÙ¾8.¾…í®½K˜¸|¥®=€S.>lç>l²«>®<Ô>x:û>y1?Y¸!?2?Á'A?ÊN?êZ?(qe?žKn?zmu?¿z?&<~?ZÞ?“¢?A‰}?Q–y?@Ìs?Q>l?÷b?ÔX?…K? †=?%.?r?¹¤ ?¥ñ>4=Ê>–[¡>™n>G½>ƒ=§~¯¼ëuÚ½ ºC¾¾eŒ¾2èµ¾ª3Þ¾a¿¿´¿¢ò%¿„ú5¿t®D¿úòQ¿N·]¿LÔg¿7@p¿Uëv¿0É{¿°Ð~¿.ü¿GH¿S·|¿GNx¿br¿Bj¿Ôe`¿6U¿š"H¿ÿÇ9¿X*¿ü¿• ¿Êÿç¾]À¾¥à–¾%$Y¾_ñ¾ð'/½Î¼.=ÈÖ>~HY>jò–>š&À>Øóç>ä??U *?eÎ9?f(H? U?šb`?‹j?3r?ŠPx?ϸ|?ùH?@ü?UÑ~?fÊ{?ív?=p?ZÐg?¨²]?ÐöQ?¿²D?;ÿ5?¼÷%?-­?Y?é"Þ>¹ôµ>¢rŒ>YÔC>9«Ú=-U®<ÈRƒ½Å¢¾n¾ÞN¡¾ä0ʾlµñ¾„¬ ¿fy¿ .¿‹=¿÷€K¿;X¿^ûb¿æAl¿Ïs¿Ó”y¿Tˆ}¿7¢¿Þ¿;~¿$½z¿Õju¿Nn¿!te¿íZ¿–ÄN¿§!A¿ï2¿‹½!¿7¿&Fû¾áHԾ砫¾oÕ¾Ú..¾çÚ®½¹ ¸¸®=¤.>ðë>Ò¶«>î@Ô>Š>û>g3?)º!?Ì2?I)A?rËN?LëZ?1re?xLn?—iu?}¿z?l<~?mÞ?s¢?ïˆ}?Ì•y?kÐs?k=l?üõb?“X?ƒK?z„=?O#.?×|?Ä¢ ?é ñ>ê8Ê>'W¡>n> ´>¤uƒ=^ɯ¼~ˆÚ½4ÃC¾Y>àö–>ï*À>øç>à ?|?*?þÄ9?Û)H?Ê U?ºc`?}j?ör?7Mx?.¹|?&I?:ü?Ñ~?úÉ{?|ìv?¹Ap?\Ïg?}±]?zõQ?@±D?—ý5?õõ%?M¸?W?³Þ>[ðµ>$nŒ>.ËC>¦˜Ú=X °Ñ>9»«>/EÔ>œBû>U5?ø»!?z2?Q A?ÒÌN?‚ìZ?:se?RMn?Aju?»¼z?²<~?€Þ?S¢?œˆ}?G•y?µÏs?®Bl?èôb?RX?3‚K?è‚=?™!.?{?7® ?Ëœñ>Ÿ4Ê>¹R¡>ê†n>ͪ>ÿbƒ=3®¼›Ú½`ÌC¾ºnŒ¾íðµ¾@Þ¾QW¿Œ¸¿0ö%¿Íý5¿r±D¿§õQ¿¤±]¿}Ïg¿ÔAp¿ìv¿Ê{¿#Ñ~¿;ü¿ I¿"¹|¿$Mx¿Ýr¿^j¿”c`¿Ÿ U¿ª)H¿ÉÄ9¿Ú*¿=¿ ¿w÷ç¾^*À¾Kö–¾ãY¾×Þ¾FÝ.½y/=Pé>5Y>ÃÜ–>C/À>+üç>Ü ?[?Ó*?šÆ9?V!H?U?Úd`?oj?¸r?ÉMx?·|?SI?4ü?âÐ~?ŽÉ{?Þëv?ë@p?(Õg?R°]?$ôQ?Á¯D?òû5?.ô%?f¶?Ñb?~Þ>þëµ>¦iŒ>ÂC>†Ú= ¿¯µ¾/‘n¾»W¡¾y9ʾr¡ñ¾£ ¿}¿ˆ#.¿¯„=¿ÍƒK¿½X¿ öb¿‰=l¿ƒÐs¿Ý•y¿ùˆ}¿w¢¿jÞ¿c<~¿m¿z¿€iu¿\Ln¿re¿#ëZ¿DËN¿)A¿”2¿ì¹!¿&3¿>û¾a@Ô¾?¶«¾Yë¾p.¾¬µ®½Ù58UÝ®= 0.>Ö>y¡«>oIÔ>­Fû>C7?ǽ!?'2?Ú!A?ÄÄN?¸íZ?Dte?-Nn?ëju?4½z?;~?“Þ?3¢?Iˆ}?”y?þÎs?ÈAl?:ûb?X?È€K?V=?ã.?(y?B¬ ?ã´ñ>U0Ê>JN¡>Ô}n>‘¡>ZPƒ=ë^®¼`.Ú½‹ÕC¾7sŒ¾Kõµ¾u#Þ¾TY¿m­¿÷÷%¿rÿ5¿ð²D¿ýöQ¿Ï²]¿{Ðg¿=p¿.ív¿tÊ{¿]Ñ~¿Aü¿óH¿Â¸|¿wPx¿r¿lj¿ub`¿S U¿5(H¿/Î9¿ *¿^¿¡¿Móç¾ &À¾Õñ–¾MGY¾“Õ¾ð·.½Î,/=”ò>V%Y>:á–>îÀ>Uè>× ?:?’*?5È9?Ê"H?‚U?úe`?aj?{r?ZNx?_·|?MH?-ü?©Ð~?"É{?@ëv?@p?+Ôg?'·]?ÎòQ?B®D?Nú5?fò%?´?Î`?3Þ> çµ>(eŒ>׸C>sÚ=ét¯<û ƒ½2¾Dšn¾*\¡¾Ä=ʾ¥ñ¾ú¤ ¿Nr¿>%.¿@†=¿7…K¿þX¿5÷b¿o>l¿XÌs¿b–y¿L‰}¿—¢¿WÞ¿<~¿ô¾z¿dmu¿Kn¿qe¿íéZ¿ãÉN¿Ž'A¿e2¿¸!¿81¿ð9û¾ <Ô¾Ù±«¾Õæ¾MR.¾£®½ªVš8òï®=A9.>ŠÚ>५>0Ô>¿Jû>19?—¿!?Õ2?b#A?$ÆN?¢æZ?Mue?On?•ku?­½z?^;~?#Þ?¢?ö‡}?=”y?HÎs?â@l?%úb?f X?]K?Ä=?,.?Qw?Mª ?İñ>pIÊ>ÛI¡>¿tn>T˜>µ=ƒ=¢©®¼ô@Ú½åŸC¾µwŒ¾¨ùµ¾ª'Þ¾V[¿S¯¿í%¿6¿o´D¿SøQ¿ú³]¿yÑg¿ê=p¿“év¿àÊ{¿–Ñ~¿Hü¿ÇH¿c¸|¿æOx¿Œr¿zj¿Ua`¿ U¿Á&H¿”Ì9¿R*¿¿¦¿#ïç¾µ!À¾^í–¾,>Y¾É ¾›’.½#R/=Øû>w.Y>°å–>BÀ>øçç>Ó?!?Q*?ÐÉ9??$H?ÍU?f_`?Sj?=r?ìNx?¿·|?zH?Sü?oÐ~?¶È{?¢êv?N?p?-Óg?üµ]?ŸúQ?ĬD?©ø5?Ÿð%?™²?Ì^?è.Þ>+¶>ª`Œ>¬¯C>ë`Ú=2*¯< ƒ½oˆ¾en¾™`¡¾Bʾ¯©ñ¾ï¦ ¿&t¿:.¿Ò‡=¿¢†K¿? X¿Iøb¿U?l¿Ís¿X“y¿Ÿ‰}¿·¢¿DÞ¿Ö;~¿|¾z¿ºlu¿Pn¿üoe¿·èZ¿ƒÈN¿&A¿¸2¿´Â!¿J/¿Þ5û¾à7Ô¾r­«¾Pâ¾I.¾ú¯½gå8¯=vB.>ß>Gª«>Ð4Ô>ï2û>;?fÁ!?‚2?ë$A?…ÇN?ØçZ?=oe?âOn??lu?%¾z?¤;~?6Þ?΢?£‡}?¸“y?’Ís?û?l?ùb?& X?§‡K?2~=?v.?yu?X¨ ?¦¬ñ>&EÊ>Ëc¡>©kn>>+ƒ=Zô®¼ˆSÚ½©C¾m]Œ¾þµ¾à+Þ¾Y]¿:±¿Wï%¿z÷5¿îµD¿©ùQ¿%µ]¿vÒg¿¹>p¿1êv¿hÈ{¿ÏÑ~¿Nü¿šH¿¸|¿TOx¿Ér¿j¿5``¿¼ U¿L%H¿ùÊ9¿“*¿r"¿ª¿ùêç¾aÀ¾èè–¾ 5Y¾…¾ m/½xw/=>˜7Y>'ê–>—À>"ìç>7?ø"?*?lË9?´%H? U?…``?Ëj?r?}Ox?¸|?§H?Lü?¿Ñ~?IÈ{?êv?>p?/Òg?Ñ´]?IùQ?ƒµD?÷5?Øî%?²°?É\?³*Þ>Îüµ>òzŒ>€¦C>WNÚ=zß®“ã>­®«>9Ô>7û>Ô/?6Ã!?02?s&A?åÈN?éZ?Fpe?äJn?élu?ž¾z?ê;~?IÞ?®¢?ˆ‰}?2“y?ÛÌs??l?ü÷b?åX?=†K?b‡=?À.?¢s?c¦ ?ˆ¨ñ>Û@Ê>\_¡>Рn>Ú…>kƒ=?¯¼fÚ½;²C¾ëaŒ¾d¶¾0Þ¾[_¿!³¿ñ%¿ù5¿/­D¿ÿúQ¿O¶]¿tÓg¿‡?p¿Ïêv¿ÔÈ{¿Ð~¿Tü¿mH¿¤·|¿ÃNx¿r¿j¿Éf`¿qU¿×#H¿]É9¿Ô*¿“ ¿E¿Îæç¾ À¾qä–¾ê+Y¾Aù¾µG/½ .=_>¹@Y>î–>ë"À>Lðç>3??Î*?Í9?)'H?e U?¥a`?½j?Žr?Px?}¸|?ÓH?Fü?†Ñ~?ÁÊ{?gév?±=p?2Ñg?¦³]?ó÷Q?´D?¡6?í%?Ë®?ÆZ?}&Þ>pøµ>tvŒ>'ÜC>Ã;Ú=Ô®<êBƒ½èš¾Hwn¾K¡¾£Jʾë±ñ¾Ùª ¿Ôw¿§.¿5€=¿ÃK¿À X¿rúb¿"Al¿{Îs¿b”y¿ ˆ}¿¢¿Þ¿J;~¿‹½z¿eku¿ÊNn¿ue¿—îZ¿ÂÅN¿õ"A¿]2¿¿!¿§8¿œIû¾`/Ô¾¥¤«¾GÙ¾¯6.¾¿ê®½v…¸B¨®=ßT.>è>³«>P=Ô>;û>Â1?ž¸!?Ý2?ü'A?FÊN?DêZ?Pqe?¾Kn?iu?¿z?0<~?\Þ?Ž¢?5‰}?=–y?%Ìs?/>l?çöb?¤X?Ò„K?Ð…=?Ä$.?Ëq?n¤ ?j¤ñ>‘<Ê>íZ¡>»—n>ç»>ƃ=ȉ¯¼¯xÚ½g»C¾ifŒ¾Øèµ¾J4Þ¾^a¿µ¿æò%¿Ãú5¿­®D¿-óQ¿z·]¿qÔg¿V@p¿lëv¿@É{¿¹Ð~¿/ü¿AH¿E·|¿1Nx¿Er¿j¿©e`¿U¿b"H¿ÂÇ9¿*¿´¿J ¿,ÿ羸À¾úß–¾É"Y¾ýï¾`"/½^Â.=*Ø>ÚIY>ó–>?'À>vôç>/?ä?˜ *?¢Î9?(H?° U?Åb`?¯j?Pr?»Lx?ݸ|?I??ü?LÑ~?UÊ{?ív?âôµ>öqŒ>ûÒC>u¨Ú= J®œì>z·«>‘AÔ>%?û>°3?nº!? 2?„)A?¦ËN?zëZ?Yre?™Ln?°iu?U¼z?v<~?pÞ?n¢?âˆ}?¸•y?PÐs?I=l?Óõb?cX?gƒK?>„=?#.?‘|?y¢ ?L ñ>F8Ê>~V¡>¥Žn>ª²>Ýrƒ=€Ô¯¼C‹Ú½’ÄC¾çjŒ¾6íµ¾«Þ¾`c¿î¶¿­ô%¿hü5¿,°D¿„ôQ¿¥°]¿oÕg¿$Ap¿ ìv¿¬É{¿òÐ~¿5ü¿FI¿å¶|¿ Mx¿‚r¿,j¿‰d`¿¹U¿ç*H¿'Æ9¿V*¿Õ¿N ¿ûç¾ .À¾„Û–¾¨Y¾¹æ¾ ý.½³ç.=má>pY>‹÷–>”+À> øç>+ ?Ã?W*?;Å9?*H?û U?åc`?¡j?r?MMx?®¶|?-I?9ü?Ñ~?éÉ{?dìv?šAp?6Ïg?P±]?GõQ?±D?Xý5?±õ%?¸?ÁV?Þ>µïµ>xmŒ>ÐÉC>á•Ú=6ÿ¯<4hƒ½b­¾t‰n¾öS¡¾Ò5ʾññ¾Ã® ¿ƒ{¿".¿Yƒ=¿˜‚K¿¬X¿5õb¿îBl¿èÏs¿l•y¿³ˆ}¿\¢¿{Þ¿ž<~¿š¼z¿ju¿Mn¿ðre¿+ìZ¿pÌN¿d*A¿2¿w»!¿Ë4¿xAû¾ÿCÔ¾þ¹«¾>оF$.¾„Å®½Ý 7}Í®=7(.>-Ò>ừ>ÑEÔ>7Cû>ž5?=¼!?º2?Œ A?ÍN?°ìZ?bse?sMn?Zju?ͼz?Ü:~?ƒÞ?N¢?ˆ}?3•y?šÏs?ŒBl?¾ôb?#X?ýK?¬‚=?X!.?¹z?í­ ?.œñ>ü3Ê>R¡>…n>m©>8`ƒ=U®¼ÖÚ½¾ÍC¾eoŒ¾“ñµ¾àÞ¾žW¿Õ¸¿tö%¿ þ5¿«±D¿ÚõQ¿Ð±]¿£Ïg¿óAp¿¨ìv¿Ê{¿,Ñ~¿<ü¿I¿¹|¿Mx¿Àr¿:j¿jc`¿m U¿s)H¿Ï9¿—*¿ö¿R ¿Øöç¾¹)À¾¡õ–¾‡Y¾vݾ¶×.½ /=±ê>‘Y>mÝ–>è/À>Êüç>' ?¢?*?ׯ9?!H?GU?e`?“j?Õr?ÞMx?·|?'H?3ü?ÚÐ~?}É{?Çëv?Ì@p?Õg?%°]?ñóQ?ˆ¯D?³û5?êó%?¶?„b?ÝÞ>Wëµ>úhŒ>¥ÀC>NƒÚ=´¯<û‚½Ÿ¶¾‰’n¾dX¡¾:ʾ¢ñ¾P£ ¿[}¿É#.¿ê„=¿„K¿íX¿Iöb¿«=l¿žÐs¿ñ•y¿‰}¿|¢¿gÞ¿X<~¿[¿z¿giu¿;Ln¿çqe¿õêZ¿ËN¿Ü(A¿Ó2¿§¹!¿Ý2¿g=û¾¾?Ô¾˜µ«¾­ê¾.¾æ²®½2z58à®=l1.>²Ö>!¢«>JÔ>IGû>Œ7? ¾!?g2?"A?øÄN?æíZ?kte?MNn?ku?F½z?";~?Þ?.¢?=ˆ}?®”y?ãÎs?¦Al?ûb?âX?’€K?=?¡.?âx?ø« ?F´ñ>±/Ê>¡M¡>z|n>0 >“Mƒ= j®¼%1Ú½éÖC¾ãsŒ¾ñõµ¾$Þ¾ Y¿µ­¿;ø%¿°ÿ5¿)³D¿0÷Q¿û²]¿¡Ðg¿;=p¿Fív¿„Ê{¿eÑ~¿Bü¿íH¿´¸|¿bPx¿ýr¿Hj¿Jb`¿" U¿þ'H¿òÍ9¿Î*¿¿V¿®òç¾e%À¾+ñ–¾ñEY¾2Ô¾a².½^2/=õó>²&Y>äá–>“À>ôè>#??Ô*?rÈ9?#H?³U?$f`?…j?˜r?pNx?m·|?TH?,ü? Ð~?É{?)ëv?þ?p?Ôg?ú¶]?›òQ? ®D?ú5?#ò%?7´?`?}2Þ>ùæµ>}dŒ>y·C>ºpÚ=Çi¯< ƒ½’€¾Ÿ›n¾Ó\¡¾g>ʾ.¦ñ¾E¥ ¿•r¿€%.¿|†=¿m…K¿.X¿^÷b¿‘>l¿sÌs¿v–y¿Y‰}¿œ¢¿TÞ¿<~¿â¾z¿Jmu¿aKn¿Þpe¿¿éZ¿¯ÉN¿S'A¿%2¿?Ä!¿ï0¿U9û¾~;Ô¾1±«¾(æ¾îP.¾I ®½Öx¥8¸ò®=¡:.>6Û>ˆ¦«>21Ô>ZKû>z9?Ü¿!?2?#A?YÆN?ÐæZ?tue?(On?®ku?¾½z?h;~?&Þ?¢?ê‡}?)”y?-Îs?¿@l?üùb?7 X?'K?ˆ=?ë.? w?ª ?'°ñ>ÍHÊ>2I¡>dsn>ô–>î:ƒ=Ä´®¼¸CÚ½B¡C¾axŒ¾Oúµ¾K(Þ¾£[¿œ¯¿Ôí%¿U6¿¨´D¿†øQ¿&´]¿žÑg¿ >p¿ªév¿ðÊ{¿žÑ~¿Iü¿ÀH¿U¸|¿ÐOx¿or¿Vj¿*a`¿× U¿‰&H¿WÌ9¿*¿ $¿Z¿„îç¾!À¾´ì–¾ÐÓ/Y>Zæ–>çÀ>—èç>?`!?“*? Ê9?w$H?ÿU?_`?wj?Zr?Ox?Í·|?H?Rü?gÐ~?¥È{?‹êv?/?p?Óg?ϵ]?lúQ?‹¬D?jø5?[ð%?P²?^?G.Þ>…¶>ÿ_Œ>N®C>&^Ú=¯7Ծˬ«¾¤á¾¹G.¾4 ¯½“4ð8U¯=ÕC.>»ß>>r5Ô>Š3û>h;?«Á!?Â2?%%A?¹ÇN?èZ?eoe?Pn?Xlu?7¾z?®;~?9Þ?É¢?—‡}?¤“y?wÍs?Ù?l?çøb?ö X?q‡K?ö}=?5.?3u? ¨ ? ¬ñ>‚DÊ>"c¡>Njn>·>I(ƒ={ÿ®¼LVÚ½nªC¾^Œ¾¬þµ¾€,Þ¾¥]¿ƒ±¿›ï%¿¹÷5¿'¶D¿ÜùQ¿Qµ]¿œÒg¿Ø>p¿Hêv¿xÈ{¿ØÑ~¿Oü¿“H¿õ·|¿?Ox¿¬r¿Þj¿ ``¿‹ U¿%H¿»Ê9¿P*¿+"¿ö¿Zêç¾¼À¾=è–¾¯3Y¾$¾zg/½}/=}>ô8Y>Ñê–><À>Áìç>ƒ?@#?R*?©Ë9?ë%H?J U?°``?ïj?r?“Ox?,¸|?­H?Kü?·Ñ~?9È{?íév?a>p? Òg?¤´]?ùQ?JµD?Æö5?”î%?j°?|\?*Þ>'üµ>GzŒ>#¥C>“KÚ=YÔ®< 3ƒ½ “¾on¾RG¡¾üFʾj®ñ¾/© ¿Cv¿2.¿ß~=¿CˆK¿¯ X¿‡ùb¿^@l¿àÍs¿ñ“y¿Ç‡}¿Ü¢¿.Þ¿†;~¿ñ½z¿öku¿„On¿äue¿SçZ¿îÆN¿C$A¿Ê2¿ À!¿K:¿Mû¾þ2Ô¾d¨«¾ݾ…>.¾–ú®½°Ÿó¯= M.>@ä>U¯«>²9Ô>œ7û>0?{Ã!?p2?®&A?ÉN?<éZ?npe?Kn?mu?°¾z?ô;~?LÞ?©¢?|‰}?“y?ÀÌs?ó>l?Ó÷b?µX?†K?&‡=?~.?\s?¦ ?ë§ñ>8@Ê>³^¡>vŸn>z„>¤ƒ=2J¯¼àhÚ½™³C¾—bŒ¾!åµ¾µ0Þ¾¨_¿i³¿bñ%¿]ù5¿h­D¿2ûQ¿|¶]¿šÓg¿¦?p¿æêv¿äÈ{¿ˆÐ~¿Uü¿gH¿–·|¿­Nx¿êr¿ìj¿žf`¿?U¿Ÿ#H¿ É9¿‘*¿L ¿ú¿·è¾hÀ¾Çã–¾Ž*Y¾à÷¾%B/½™¢.=Á>BY>Hï–>#À>ëðç>?L?*?DÍ9?`'H?– U?Ða`?áj?«r?$Px?Œ¸|?ÚH?Eü?}Ñ~?±Ê{?Oév?’=p? Ñg?z³]?À÷Q?˳D?b6?Íì%?ƒ®?zZ?Ý%Þ>Ê÷µ>ÉuŒ>ÉÚC>ÿ8Ú=¡‰®<±Eƒ½Iœ¾£xn¾ÁK¡¾á-ʾˆ²ñ¾$« ¿x¿è.¿p€=¿ùK¿ð X¿›úb¿DAl¿–Îs¿v”y¿ˆ}¿!¢¿Þ¿@;~¿y½z¿Lku¿ªNn¿Ûte¿iîZ¿ÅN¿º"A¿2¿Ð¾!¿]8¿Iû¾ÝKÔ¾ý£«¾›Ø¾P5.¾ù箽å§t¸«®=>V.>Äè>»³«>ò=Ô>®;û> 2?ã¸!?2?6(A?zÊN?rêZ?wqe?ßKn?iu?(¿z?:<~?_Þ?‰¢?)‰}?)–y? Ìs? >l?¾öb?tX?œ„K?”…=?ƒ$.?„q?#¤ ?Í£ñ>í;Ê>DZ¡>`–n>†º>þƒ=ꔯ¼s{ڽļC¾gŒ¾éµ¾Þ¾ªa¿Pµ¿)ó%¿û5¿æ®D¿`óQ¿§·]¿—Ôg¿u@p¿„ëv¿PÉ{¿ÁÐ~¿0ü¿:H¿6·|¿Nx¿(r¿új¿~e`¿ÓU¿+"H¿…Ç9¿Ò*¿m¿þ ¿þç¾½1À¾Pß–¾m!Y¾œî¾Ð/½îÇ.=‹Ù>6KY>¾ó–>å'À>õç>{?+?Ú *?ßÎ9?Õ(H?á U?ðb`?Ój?mr?ÑLx?ë¸|?I?>ü?DÑ~?EÊ{?ëìv?Ãlóµ>KqŒ>žÑC>°¥Ú=ê>®Ií>"¸«>3BÔ>À?û>ú3?³º!?L2?¾)A?ÛËN?¨ëZ?€re?¹Ln?Éiu?g¼z?<~?rÞ?j¢?Öˆ}?¤•y?5Ðs?&=l?ªõb?4X?1ƒK?„=?Ì".?J|?.¢ ?¯Ÿñ>£7Ê>ÕU¡>Kn>J±>pƒ=¡ß¯¼ŽÚ½ðÅC¾’kŒ¾Üíµ¾KÞ¾èU¿7·¿ñô%¿¦ü5¿e°D¿¶ôQ¿Ò°]¿•Õg¿CAp¿"ìv¿¼É{¿ûÐ~¿6ü¿?I¿×¶|¿ŠMx¿er¿j¿^d`¿ˆU¿°*H¿éÅ9¿*¿Ž¿ ¿cúç¾h-À¾nù–¾LY¾Xå¾{÷.½Cí.=Ïâ>ÌY>5ø–>9,À>?ùç>w ? ?™*?yÅ9?J*H?-U?d`?Åj?0r?bMx?½¶|?3I?8ü? Ñ~?ÙÉ{?Mìv?|Ap?Ïg?$±]?õQ?ΰD?ý5?mõ%?¼·?uV?rÞ>ïµ>ÍlŒ>rÈC>“Ú=ô¯<üjƒ½Â®¾ÎŠn¾ŸT¡¾v6Ê¾Žžñ¾¥¡ ¿É{¿U".¿”ƒ=¿Î‚K¿ÜX¿^õb¿Cl¿Ðs¿€•y¿¿ˆ}¿a¢¿xÞ¿”<~¿ˆ¼z¿øiu¿õLn¿Ére¿ýëZ¿;ÌN¿**A¿Â2¿1»!¿4¿Ý@û¾\CÔ¾V¹«¾‘Ͼç".¾¾Â®½?Y7CЮ=–).>ÙÒ>ˆ¼«>sFÔ>ÒCû>è5?‚¼!?ú2?Æ A?;ÍN?ÞìZ?‰se?”Mn?sju?ß¼z?æ:~?†Þ?J¢?ƒˆ}?•y?~Ïs?jBl?•ôb?óX?ÇK?p‚=?!.?sz?¢­ ?‘›ñ>X3Ê>fQ¡>5„n> ¨>q]ƒ=v*®¼› Ú½ÏC¾pŒ¾:òµ¾ Þ¾êW¿¬¿¸ö%¿Kþ5¿ä±D¿ öQ¿ý±]¿ÉÏg¿Bp¿¿ìv¿(Ê{¿4Ñ~¿=ü¿I¿¹|¿ùLx¿£r¿j¿?c`¿< U¿;)H¿PÏ9¿U*¿®¿ ¿9öç¾)À¾÷ô–¾*Y¾Ü¾&Ò.½˜/=ì>íY>Þ–>0À>iýç>s ?ê?X*?Ç9?Å!H?xU?/e`?·j?òr?ôMx?·|?.H?2ü?ÑÐ~?mÉ{?¯ëv?­@p?ÝÔg?ù¯]?¾óQ?O¯D?uû5?¦ó%?Õµ?7b?=Þ>±êµ>OhŒ>G¿C>‰€Ú=]©¯<äý‚½ÿ·¾ä“n¾ Y¡¾À:ʾ¬¢ñ¾š£ ¿q¿ $.¿&…=¿9„K¿X¿söb¿Í=l¿¹Ðs¿–y¿‰}¿¢¿eÞ¿N<~¿I¿z¿Niu¿Ln¿Àqe¿ÇêZ¿ÛÊN¿¡(A¿“2¿b¹!¿“2¿Ë<û¾?Ծ𴫾ê¾².¾ °®½Š¾K8àâ®=Ë2.>^×>É¢«>³JÔ>äGû>Ö7?R¾!?§2?O"A?-ÅN?îZ?“te?nNn?ku?X½z?,;~?Þ?*¢?0ˆ}?š”y?ÈÎs?ƒAl?çúb?²X?\€K?߀=?`.?œx?­« ?©³ñ>/Ê>øL¡>{n>О>ÌJƒ=.u®¼é3Ú½GØC¾ŽtŒ¾˜öµ¾¶$Þ¾íY¿þ­¿Pì%¿ïÿ5¿b³D¿c÷Q¿(³]¿ÇÐg¿Y=p¿]ív¿”Ê{¿nÑ~¿Cü¿æH¿¦¸|¿LPx¿àr¿$j¿b`¿ñ U¿Æ'H¿µÍ9¿‹*¿Ï¿ ¿òç¾À$À¾€ð–¾•DY¾ÐҾѬ.½í7/=Võ>(Y>Žâ–>8À>“è>o?É?*?¯È9?9#H?åU?Of`?©j?µr?…Nx?|·|?[H?Wü?˜Ð~?É{?ëv?ß?p?ßÓg?ζ]?hòQ?ЭD?Ðù5?ßñ%?î³?5`?Ü1Þ>Sæµ>ÑcŒ>¶C>ömÚ=¦^¯<‰ƒ½ó¾ùœn¾|]¡¾ ?ʾ˦ñ¾¥ ¿Ûr¿.¿¸†=¿£…K¿]X¿‡÷b¿´>l¿ŽÌs¿Š–y¿e‰}¿¡¢¿QÞ¿<~¿Ñ¾z¿1mu¿@Kn¿·pe¿‘éZ¿zÉN¿'A¿å2¿úÃ!¿¥0¿º8û¾Ü:Ô¾‰°«¾|å¾O.¾ƒ®½›°8~õ®=<.>ãÛ>0§«>Ô1Ô>öKû>Ä9?!À!?U2?×#A?ÆN?þæZ?œue?HOn?Èku?нz?s;~?)Þ?ä¢?Þ‡}?”y?Îs?@l?Óùb? X?ñ~K?M=?ª.?Äv?¸© ?Нñ>)HÊ>‰H¡> rn>“•>'8ƒ=å¿®¼}FÚ½ ¢C¾ yŒ¾õúµ¾ë(Þ¾ï[¿ä¯¿î%¿Sö5¿á´D¿¹øQ¿S´]¿ÄÑg¿(>p¿Âév¿Ë{¿§Ñ~¿Jü¿ºH¿F¸|¿ºOx¿Rr¿1j¿ÿ``¿¥ U¿Q&H¿Ì9¿Ì*¿Ã#¿¿åíç¾k À¾ ì–¾t;Y¾ ¾|‡.½C]/=šþ>/1Y>ç–>À>6éç>k?¨!?Ö*?KÊ9?®$H?0 U?»_`?›j?wr?Ox?Û·|?‡H?Qü?çÑ~?•È{?sêv??p?áÒg?£µ]?9úQ?R¬D?,ø5?ð%?²?2^?§-Þ>Þÿµ>S_Œ>ð¬C>b[Ú=ï¯<.#ƒ½/‹¾Ògn¾ëa¡¾UCʾéªñ¾„§ ¿²t¿½.¿ˆ}=¿‡K¿ž X¿œøb¿š?l¿EÍs¿“y¿¸‰}¿Á¢¿>Þ¿Á;~¿X¾z¿‡lu¿>Pn¿­oe¿[èZ¿ÈN¿‘%A¿82¿*Â!¿ð;¿¨4û¾œ6Ô¾#¬«¾øà¾ZF.¾n ¯½¿Vû8¯=4E.>gà>–««>6Ô>&4û>²;?ðÁ!?2?`%A?îÇN?4èZ?Œoe?#Pn?rlu?I¾z?¹;~?<Þ?Å¢?‰}?“y?[Ís?·?l?¾øb?Æ X?;‡K?»}=?ó.?ít?ç ?l«ñ>ÞCÊ>yb¡>ôhn>VŒ>‚%ƒ= ¯¼Yڽ˫C¾Ä^Œ¾Sÿµ¾!-Þ¾ò]¿Ë±¿ßï%¿÷÷5¿"¬D¿úQ¿~µ]¿ÂÒg¿÷>p¿`êv¿ˆÈ{¿àÑ~¿Pü¿H¿ç·|¿)Ox¿r¿¹j¿ß_`¿Z U¿Ý$H¿~Ê9¿*¿ä!¿ª¿»éç¾À¾“ç–¾S2Y¾Âÿ¾ëa/½˜‚/=Þ>P:Y>{ë–>áÀ>`íç>Ï?‡#?•*?æË9?#&H?| U?Û``?j?:r?¨Ox?:¸|?´H?Jü?®Ñ~? Ë{?Öév?B>p?äÑg?x´]?ãøQ?µD?‡ö5?Pî%?!°?0\?r)Þ>ûµ>›yŒ>Å£C>ÎHÚ=7É®<Ó5ƒ½l”¾çpn¾ûG¡¾ Gʾ¯ñ¾y© ¿Šv¿s.¿=¿Ä~K¿ß X¿°ùb¿€@l¿ûÍs¿”y¿Ó‡}¿à¢¿+Þ¿{;~¿ß½z¿Ýku¿dOn¿½ue¿%çZ¿¹ÆN¿$A¿Š2¿[À!¿:¿xLû¾\2Ô¾¼§«¾sܾ&=.¾Ð÷®½ƒí¹¸¹¯=iN.>ìä>ý¯«>T:Ô>88û>h0?ÀÃ!?°2?è&A?NÉN?jéZ?•pe?%Kn?mu?¾z?ÿ;~?OÞ?¥¢?o‰}?š–y?¥Ìs?Ñ>l?ª÷b?…X?Ñ…K?ê†=?=.?s?Î¥ ?N§ñ>”?Ê> ^¡>žn>ƒ>݃=TU¯¼¤kÚ½÷´C¾BcŒ¾Çåµ¾V1Þ¾õ_¿²³¿¦ñ%¿œù5¿¡­D¿=òQ¿¨¶]¿¿Óg¿Å?p¿þêv¿ôÈ{¿Ð~¿Vü¿`H¿ˆ·|¿˜Nx¿Ír¿Èj¿sf`¿U¿h#H¿ãÈ9¿O*¿ ¿®¿è¾ÂÀ¾ã–¾2)Y¾~ö¾–qCY>òï–>5$À>Šñç>Ë?”?T*?Í9?˜'H?Ç U?ûa`?j?Èr?:Px?š¸|?áH?Dü?uÑ~?¡Ê{?qív?s=p?æÐg?M³]?÷Q?’³D?$6?‰ì%?:®?-Z?<%Þ>#÷µ>uŒ>kÙC>;6Ú=€~®pé>c´«>•>Ô>I<û>V2?(¹!?]2?p(A?¯ÊN? êZ?Ÿqe?ÿKn?8iu?:¿z?E<~?bÞ?…¢?‰}?–y?ÐÐs?ê=l?•öb?EX?f„K?X…=?A$.?>q?Ù£ ?0£ñ>J;Ê>›Y¡>•n>&¹>7ƒ=  ¯¼8~Ú½"¾C¾ÀgŒ¾%êµ¾¶Þ¾÷a¿˜µ¿mó%¿@û5¿¯D¿“óQ¿Ó·]¿½Ôg¿“@p¿›ëv¿`É{¿ÊÐ~¿1ü¿3H¿(·|¿Nx¿ r¿Öj¿Se`¿¢U¿ó!H¿GÇ9¿*¿%¿² ¿îýç¾1À¾¦Þ–¾ Y¾;í¾@/½~Í.=ìÚ>’LY>iô–>Š(À>´õç>Ç?s?*?Ï9? )H? U?c`?÷j?Šr?çLx?ù¸|? I?>ü?;Ñ~?5Ê{?Óìv?+Bp?éÏg?"²]?7öQ?²D?þ5?ñö%?T¬?+X?!Þ>Åòµ> pŒ>@ÐC>ì¢Ú=È3®<[ƒ½æ¦¾ƒn¾ÙP¡¾Ï2ʾ ›ñ¾c­ ¿8z¿à .¿>‚=¿™K¿ËX¿Ùûb¿MBl¿hÏs¿•y¿yˆ}¿F¢¿ˆÞ¿ï:~¿î¼z¿‰ju¿¯Mn¿ªse¿íZ¿gÍN¿÷ A¿/2¿¼¼!¿&6¿TDû¾úFÔ¾½«¾jÓ¾¼*.¾•Ò®½$Ø‘·kÀ®=Á!.>õí>ʸ«>ÕBÔ>[@û>D4?øº!?Œ2?ù)A?ÌN?ÖëZ?¨re?ÚLn?ãiu?y¼z?‹<~?uÞ?e¢?ʈ}?•y?Ðs?-Cl?€õb?X?û‚K?ǃ=?‹".?|?ä¡ ?Ÿñ>ÿ6Ê>,U¡>ð‹n>é¯>Omƒ=Ã꯼ÌÚ½NÇC¾>lŒ¾ƒîµ¾ìÞ¾4V¿·¿5õ%¿åü5¿ž°D¿éôQ¿þ°]¿»Õg¿bAp¿9ìv¿ÌÉ{¿Ñ~¿7ü¿9I¿É¶|¿uMx¿Hr¿äj¿4d`¿VU¿x*H¿¬Å9¿Ñ*¿F¿¶ ¿Äùç¾Ã,À¾Ãø–¾ïY¾÷ã¾ëñ.½Óò.=0ä>(Y>ßø–>Þ,À>Þùç>à ?R?Ü*?¶Å9?*H?^U?;d`?éj?Mr?xMx?˶|?:I?7ü?Ñ~?ÉÉ{?5ìv?]Ap?´Õg?÷°]?áôQ?•°D?Ûü5?)õ%?s·?(V?ÒÞ>hîµ>"lŒ>ÇC>XÚ=óè¯<Ãmƒ½#°¾)Œn¾HU¡¾7ʾ+Ÿñ¾ð¡ ¿|¿–".¿Ðƒ=¿ƒK¿ X¿‡õb¿3Cl¿Ðs¿“•y¿Ìˆ}¿f¢¿uÞ¿‰<~¿v¼z¿Þiu¿ÔLn¿¡re¿ÏëZ¿ÌN¿ï)A¿‚2¿ìº!¿84¿B@û¾ºBÔ¾®¸«¾Ùí¾ˆ!.¾ø¿®½Ð™7 Ó®=ö*.>†Ó>0½«>GÔ>mDû>26?Ǽ!?:2?!A?pÍN? íZ?±se?´Mn?ju?ñ¼z?ñ:~?ˆÞ?E¢?wˆ}? •y?cÏs?GBl?Òûb?ÃX?‘K?5‚=?Õ .?-z?W­ ?óšñ>´2Ê>½P¡>Û‚n>¬¦>ªZƒ=˜5®¼_£Ú½yÐC¾»pŒ¾àòµ¾!!Þ¾7X¿`¬¿üö%¿‰þ5¿²D¿@öQ¿)²]¿ïÏg¿0Bp¿×ìv¿8Ê{¿=Ñ~¿>ü¿ I¿÷¸|¿ãLx¿†r¿òj¿c`¿ U¿)H¿Ï9¿*¿g¿º¿šõç¾o(À¾Mô–¾ZLY¾³Ú¾–Ì.½(/=tí>I Y>ÂÞ–>21À>þç>¿ ?1?›*?QÇ9?ü!H?ªU?Ze`?Ûj?r? Nx?*·|?4H?1ü?ÉÐ~?]É{?˜ëv?Ž@p?·Ôg?Ì·]?‹óQ?¯D?6û5?bó%?µ?ëa?œÞ> êµ>¤gŒ>é½C>Å}Ú=<ž¯<«ƒ½_¹¾>•n¾¶Y¡¾d;ʾI£ñ¾å£ ¿Jq¿L$.¿b…=¿o„K¿LX¿œöb¿ð=l¿ÔÐs¿–y¿‰}¿†¢¿bÞ¿C<~¿7¿z¿4iu¿úKn¿˜qe¿™êZ¿¦ÊN¿g(A¿S2¿¹!¿J2¿0<û¾z>Ô¾H´«¾Té¾dW.¾Z­®½ãb8¦å®=*4.> Ø>q£«>UKÔ>Hû> 8?—¾!?ç2?‰"A?aÅN?BîZ?ºte?Nn?7ku?j½z?7;~?Þ?%¢?$ˆ}?†”y?­Îs?aAl?¾úb? X?&€K?£€=?.?Vx?b« ? ³ñ>j.Ê>OL¡>Åyn>p>Hƒ=O€®¼®6Ú½¤ÙC¾9uŒ¾>÷µ¾V%Þ¾:Z¿F®¿”ì%¿.6¿›³D¿–÷Q¿T³]¿ìÐg¿x=p¿uív¿¤Ê{¿vÑ~¿Dü¿àH¿˜¸|¿6Px¿Ãr¿ÿj¿ôa`¿¿ U¿'H¿wÍ9¿I*¿ˆ¿¾¿pñç¾$À¾Öï–¾9CY¾è¾A§.½}=/=¸ö>j)Y>8ã–>ÝÀ>2è>º? ?Z*?íÈ9?q#H?U?zf`?Íj?Òr?›Nx?Š·|?aH?Vü?Ð~?ñÈ{?úêv?À?p?¹Óg?¡¶]?\ûQ?—­D?’ù5?›ñ%?¦³?è_?<1Þ>¬åµ>&cŒ>¾´C>1kÚ=„S¯l¿©Ìs¿–y¿q‰}¿¥¢¿OÞ¿ý;~¿¿¾z¿mu¿Kn¿pe¿céZ¿FÉN¿ß&A¿¥2¿´Ã!¿\0¿8û¾::Ծᯫ¾Ðä¾0N.¾E¯½.½»8Dø®=_=.>Ü>ا«>v2Ô>‘Lû>:?fÀ!?•2?$A?ÂÆN?-çZ?Ãue?iOn?áku?â½z?};~?+Þ?à¢?ч}?”y?÷Ís?{@l?©ùb?× X?pˆK?=?h.?~v?m© ?í®ñ>…GÊ>àG¡>¯pn>3”>`5ƒ=Ë®¼AIÚ½þ£C¾·yŒ¾œûµ¾Œ)Þ¾<\¿-°¿[î%¿‘ö5¿µD¿ìøQ¿´]¿êÑg¿G>p¿Ùév¿Ë{¿°Ñ~¿Jü¿³H¿8¸|¿¥Ox¿5r¿ j¿Ô``¿t U¿&H¿ÜË9¿Š*¿{#¿Ã¿Fíç¾ÆÀ¾`ë–¾:Y¾¥¾°/½Òb/=üÿ>‹2Y>¯ç–>2À>Õéç>¶?ï!?*?ˆÊ9?æ$H?b U?æ_`?¿j?”r?-Ox?é·|?ŽH?Pü?ßÑ~?…È{?\êv?ò>p?¼Òg?vµ]?úQ?¬D?í÷5?Ôï%?¿±?æ]?-Þ>8ÿµ>¨^Œ>“«C>XÚ=ͯ<õ%ƒ½Œ¾,in¾”b¡¾ùCʾ†«ñ¾Ï§ ¿øt¿þ.¿Ä}=¿D‡K¿Î X¿Åøb¿¼?l¿`Ís¿““y¿Ä‰}¿Å¢¿;Þ¿·;~¿F¾z¿nlu¿Pn¿†oe¿-èZ¿åÇN¿V%A¿ø2¿åÁ!¿¦;¿ 4û¾ú5Ô¾{««¾Kà¾ûD.¾¨¯½‡ù¸á ¯=“F.>á>>¬«>¶6Ô>Á4û>ü;?5Â!?B2?š%A?"ÈN?cèZ?´oe?CPn?‹lu?[¾z?Ã;~??Þ?À¢?¶‰}?|“y?@Ís?”?l?•øb?– X?‡K?}=?².?§t?x§ ?Ϫñ>;CÊ>Ða¡>™gn>öŠ>»"ƒ=¾¯¼Õ[Ú½)­C¾o_Œ¾ùÿµ¾Á-Þ¾?^¿²¿#ð%¿6ø5¿[¬D¿BúQ¿ªµ]¿èÒg¿?p¿wêv¿˜È{¿éÑ~¿Qü¿†H¿Ù·|¿Ox¿sr¿•j¿´_`¿( U¿¥$H¿AÊ9¿Ë*¿œ!¿^¿éç¾rÀ¾éæ–¾÷0Y¾aþ¾[\/½cˆ.=? >¬;Y>&ì–>† À>ÿíç>?Î#?×*?#Ì9?[&H?­ U?a`?7j?Wr?¾Ox?I¸|?»H?Iü?¦Ñ~?ýÊ{?¾év?#>p?¾Ñg?K´]?°øQ?Ø´D?Iö5? î%?Ù¯?ã[?Ñ(Þ>Úúµ>ðxŒ>g¢C> FÚ=¾®<š8ƒ½Í•¾Brn¾¤H¡¾DHʾ¤¯ñ¾Ä© ¿Ðv¿´.¿V=¿ú~K¿ X¿Ùùb¿£@l¿Îs¿”y¿à‡}¿å¢¿(Þ¿q;~¿Î½z¿Ãku¿COn¿•ue¿÷æZ¿…ÆN¿Î#A¿J2¿À!¿¸9¿ÜKû¾º1Ô¾§«¾ÇÛ¾Ç;.¾ õ®½WË®¸ö®=ÈO.>˜å>¥°«>÷:Ô>Ó8û>±0?Ä!?ð2?#'A?ƒÉN?™éZ?½pe?EKn?5mu?Ó¾z? <~?RÞ? ¢?c‰}?†–y?ŠÌs?®>l?€÷b?VX?›…K?®†=?ü.?Ïr?ƒ¥ ?±¦ñ>ð>Ê>a]¡>Áœn>¹>ƒ=u`¯¼inÚ½U¶C¾ícŒ¾næµ¾ö1Þ¾A`¿ú³¿êñ%¿Úù5¿Ú­D¿pòQ¿Õ¶]¿åÓg¿ä?p¿ëv¿É{¿™Ð~¿Wü¿YH¿y·|¿‚Nx¿°r¿£j¿Hf`¿ÝU¿0#H¿¥È9¿ *¿½¿b¿yè¾À¾râ–¾Õ'Y¾õ¾7/½¸­.= Ó>ÍDY>œð–>Ú$À>)òç>?Û?–*?¿Í9?Ï'H?ù U?&b`?)j?år?OPx?¨¸|?çH?Cü?lÑ~?‘Ê{?Yív?T=p?ÀÐg? ³]?Z÷Q?Y³D?åÿ5?Eì%?ò­?àY?œ$Þ>}öµ>rtŒ>ØC>v3Ú=^s®<@Kƒ½ Ÿ¾X{n¾M¡¾(/ʾ³ñ¾¹« ¿§x¿k.¿è€=¿e€K¿ºX¿îúb¿‰Al¿ÍÎs¿”y¿2ˆ}¿*¢¿Þ¿+;~¿U½z¿ku¿iNn¿Œte¿ îZ¿$ÅN¿E"A¿2¿F¾!¿Ê7¿ËGû¾˜JÔ¾®¢«¾B×¾’2.¾m⮽4H¸”°®=ë.>ê> µ«>7?Ô>å<û>Ÿ2?m¹!?2?«(A?ãÊN?ÏêZ?Æqe? Ln?Riu?L¿z?O<~?eÞ?€¢?‰}?–y?µÐs?È=l?löb?X?0„K?…=?$.?øp?Ž£ ?“¢ñ>¦:Ê>òX¡>«“n>Æ·>pý‚=-«¯¼ü€Ú½€¿C¾khŒ¾Ìêµ¾WÞ¾Db¿áµ¿±ó%¿û5¿X¯D¿ÆóQ¿°]¿ãÔg¿²@p¿³ëv¿pÉ{¿ÒÐ~¿2ü¿-H¿·|¿ðMx¿îr¿±j¿)e`¿pU¿¼!H¿ Ç9¿M*¿Þ¿g ¿Oýç¾r0À¾üÝ–¾´Y¾Ùë¾±/½Ó.=NÜ>cY>õ–>/)À>Söç> ?º?`*?ZÏ9?D)H?D U?Fc`?j?§r?üLx?¹|?I?=ü?3Ñ~?%Ê{?¼ìv? Bp?ÃÏg?ö±]?öQ?Ú±D?@þ5?­ö%? ¬?ÞW?g Þ>òµ>ôoŒ>âÎC>' Ú=§(®<å]ƒ½F¨¾m„n¾‚Q¡¾s3ʾª›ñ¾®­ ¿z¿!!.¿z‚=¿ÏK¿úX¿œôb¿oBl¿ƒÏs¿"•y¿…ˆ}¿J¢¿…Þ¿å:~¿Ü¼z¿oju¿ŽMn¿ƒse¿ÖìZ¿3ÍN¿½ A¿ï2¿w¼!¿Ü5¿¹Cû¾XFÔ¾m¼«¾½Ò¾]).¾ÏÏ®½æžJ·1î= #.>­Ï>r¹«>wCÔ>÷@û>4?=»!?Ì2?3*A?DÌN?ìZ?Ïre?úLn?üiu?‹¼z?•<~?xÞ?`¢?½ˆ}?|•y?þÏs? Cl?Wõb?ÔX?Å‚K?‹ƒ=?J".?¾{?™¡ ?užñ>[6Ê>ƒT¡>–Šn>‰®>ˆjƒ=äõ¯¼“Ú½«ÈC¾élŒ¾)ïµ¾ŒÞ¾V¿È·¿xõ%¿#ý5¿×°D¿õQ¿+±]¿Ïg¿Ap¿Qìv¿ÜÉ{¿ Ñ~¿8ü¿2I¿º¶|¿_Mx¿+r¿¿j¿ d`¿%U¿A*H¿oÅ9¿Ž*¿ÿ¿k ¿%ùç¾,À¾ø–¾“Y¾•â¾\ì.½cø.=‘å>„Y>õÚ–>ƒ-À>}úç> ?™?*?óÅ9?¹*H?U?ed`? j?jr?ŽMx?Ù¶|?AI?6ü?ùÐ~?¹É{?ìv?>Ap?Õg?˰]?®ôQ?\°D?œü5?æô%?+·?ÛU?1Þ>Áíµ>vkŒ>·ÅC>”Ú=Òݯ<Špƒ½ƒ±¾ƒn¾ñU¡¾½7ʾȟñ¾:¢ ¿V|¿×".¿ „=¿:ƒK¿;X¿°õb¿,=l¿9Ðs¿§•y¿Øˆ}¿j¢¿rÞ¿<~¿d¼z¿Åiu¿´Ln¿zre¿¡ëZ¿ÒËN¿µ)A¿B2¿§º!¿î3¿§?û¾BÔ¾¸«¾-í¾) .¾2½®½‚ŸÅ7ÏÕ®=U,.>2Ô>²Ÿ«>·GÔ>Eû>{6? ½!?z2?;!A?¤ÍN?:íZ?Øse?ÕMn?¦ju?½z?û:~?‹Þ?@¢?kˆ}?÷”y?HÏs?%Bl?©ûb?“X?[K?ù=?” .?çy? ­ ?Všñ>2Ê>P¡>€n>L¥>ãWƒ=¹@®¼$¦Ú½×ÑC¾gqŒ¾‡óµ¾Â!Þ¾„X¿¨¬¿@÷%¿Èþ5¿V²D¿röQ¿V²]¿Ðg¿È¥!Y>lß–>.À>§þç> ?x?Ý*?Ç9?4"H?ÛU?…e`?ÿj?,r?Nx?9·|?;H?0ü?ÀÐ~?MÉ{?€ëv?p@p?‘Ôg? ·]?XóQ?Ý®D?øú5?ó%?Dµ?ža?üÞ>céµ>ùfŒ>Œ¼C>{Ú=“¯l¿Ìs¿,–y¿+‰}¿Š¢¿_Þ¿9<~¿%¿z¿iu¿ÙKn¿qqe¿kêZ¿rÊN¿,(A¿2¿Ø¸!¿2¿•;û¾Ø=Ô¾ ³«¾¨è¾V.¾”ª®½;Gx8lè®=‰5.>·Ø>¤«>÷KÔ>Iû>i8?ܾ!?'2?Ä"A?–ÅN?pîZ?âte?¯Nn?Pku?|½z?A;~?Þ? ¢?ˆ}?r”y?’Îs??Al?•úb?è X?ðK?g€=?Ý.?x?« ?n²ñ>Æ-Ê>¥K¡>jxn>œ>>Eƒ=q‹®¼r9Ú½ÛC¾åuŒ¾å÷µ¾÷%Þ¾†Z¿®¿Øì%¿l6¿Ô³D¿É÷Q¿³]¿Ñg¿—=p¿Sév¿´Ê{¿Ñ~¿Eü¿ÙH¿‰¸|¿!Px¿¦r¿Ûj¿Éa`¿Ž U¿W'H¿:Í9¿*¿A¿s¿Ñðç¾u#À¾,ï–¾ÜAY¾‡¾±¡.½ C/=ø>Æ*Y>ãã–>‚À>Ñè>?X ?œ*?*É9?©#H?HU?¥f`?ñj?ïr?±Nx?˜·|?hH?Uü?‡Ð~?áÈ{?âêv?¡?p?”Óg?u¶]?)ûQ?^­D?Sù5?Wñ%?]³?›_?›0Þ>åµ>{bŒ>`³C>mhÚ=cH¯<ƒ½³„¾®Ÿn¾Î^¡¾R@ʾ¨ñ¾%¦ ¿gs¿‰.¿0‡=¿†K¿½X¿Ú÷b¿ø>l¿ÅÌs¿"“y¿~‰}¿ª¢¿LÞ¿ó;~¿­¾z¿þlu¿ÿJn¿gpe¿5éZ¿ÉN¿¤&A¿e2¿oÃ!¿0¿ƒ7û¾˜9Ô¾:¯«¾$ä¾ÑL.¾¯½[߯8 û®=¾>.>;Ý>¨«>3Ô>,Mû>W:?«À!?Õ2?L$A?öÆN?[çZ?ëue?‰On?úku?ô½z?‡;~?.Þ?Û¢?Ň}?í“y?ÛÍs?X@l?€ùb?§ X?:ˆK?Õ~=?'.?8v?#© ?P®ñ>âFÊ>7G¡>Uon>Ó’>™2ƒ=(Ö®¼LÚ½[¥C¾czŒ¾Büµ¾,*Þ¾‰\¿u°¿Ÿî%¿Ðö5¿SµD¿ùQ¿¬´]¿Òg¿f>p¿ñév¿<È{¿¸Ñ~¿Kü¿¬H¿*¸|¿Ox¿r¿éj¿©``¿B U¿â%H¿ŸË9¿G*¿4#¿w¿§ìç¾!À¾µê–¾»8Y¾C¾ |/½bh/=]>ç3Y>Yè–>×À>têç>?7"?[*?ÅÊ9?%H?“ U?``?ãj?±r?BOx?ø·|?•H?Oü?ÖÑ~?uÈ{?Dêv?Ó>p?–Òg?Jµ]?ÓùQ?¶D?®÷5?ï%?w±?™]?f,Þ>‘þµ>ý]Œ>5ªC>ÙUÚ=¬ý®<¼(ƒ½ð¾‡jn¾=c¡¾Dʾ#¬ñ¾¨ ¿?u¿?.¿~=¿z‡K¿þ X¿îøb¿ß?l¿{Ís¿§“y¿™‡}¿Ê¢¿8Þ¿­;~¿4¾z¿Tlu¿ýOn¿^oe¿ÿçZ¿±ÇN¿%A¿¸2¿ Á!¿\;¿q3û¾X5Ô¾Óª«¾Ÿß¾œC.¾â¯½èd ¯=òG.>Àá>欫>X7Ô>\5û>E<?zÂ!?‚2?Õ%A?WÈN?‘èZ?Ûoe?dPn?¤lu?m¾z?Î;~?BÞ?»¢?©‰}?h“y?%Ís?r?l?løb?g X?φK?ˆ=?q.?`t?.§ ?2ªñ>—BÊ>&a¡>?fn>–‰>óƒ=à ¯¼š^Ú½‡®C¾`Œ¾ ¶¾b.Þ¾‹^¿\²¿fð%¿uø5¿”¬D¿uúQ¿×µ]¿ Óg¿4?p¿êv¿¨È{¿hÐ~¿Rü¿H¿Ë·|¿þNx¿Vr¿qj¿‰_`¿÷U¿n$H¿Ê9¿ˆ*¿U!¿¿}èç¾ÍÀ¾?æ–¾š/Y¾ÿü¾ËV/½ó.=¡ > =Y>Ðì–>+!À>žîç>f?$?*?aÌ9?’&H?ß U?1a`?[j?tr?ÔOx?W¸|?ÁH?Hü?Ñ~?íÊ{?¦év?>p?˜Ñg?´]?}øQ?Ÿ´D?K6?Éí%?¯?–[?1(Þ>4úµ>ExŒ> ¡C>ECÚ=ô²® X¿úb¿Å@l¿1Îs¿,”y¿ì‡}¿¢¿%Þ¿f;~¿¼½z¿ªku¿#On¿nue¿ÉæZ¿PÆN¿“#A¿ 2¿Ñ¿!¿n9¿AKû¾1Ô¾m¦«¾Û¾g:.¾Dò®½+©£¸¼ ®='Q.>Dæ>L±«>™;Ô>n9û>û0?JÄ!?02?]'A?·ÉN?ÇéZ?äpe?fKn?Nmu?å¾z?<~?UÞ?›¢?W‰}?s–y?oÌs?Œ>l?W÷b?&X?e…K?s†=?u%.?‰r?8¥ ?¦ñ>M>Ê>¸\¡>g›n>Y€>N ƒ=—k¯¼-qÚ½²·C¾˜dŒ¾çµ¾—2Þ¾Ž`¿C´¿.ò%¿ú5¿®D¿£òQ¿·]¿ Ôg¿@p¿-ëv¿É{¿¢Ð~¿,ü¿SH¿k·|¿lNx¿“r¿j¿f`¿«U¿ù"H¿hÈ9¿Ê*¿v¿¿Úè¾xÀ¾Èá–¾y&Y¾¼ó¾v1/½H³.=kÔ>*FY>Fñ–>€%À>Èòç>b?"?Ù*?üÍ9?(H?* U?Qb`?Mj?r?ePx?¶¸|?îH?Bü?dÑ~?Ê{?Bív?6=p?›Ðg?ô²]?'÷Q? ³D?¦ÿ5?0ø%?©­?”Y?û#Þ>Öõµ>ÇsŒ>°ÖC>²0Ú==h®<Nƒ½j ¾²|n¾¼M¡¾Ì/ʾ_´ñ¾¬ ¿íx¿¬.¿$=¿›€K¿éX¿ûb¿«Al¿èÎs¿±”y¿?ˆ}¿/¢¿•Þ¿ ;~¿C½z¿ku¿HNn¿ete¿ÞíZ¿ðÄN¿ "A¿]2¿¾!¿€7¿/Gû¾öIÔ¾¢«¾–Ö¾31.¾§ß®½ÛÚ1¸Z³®=J.>Éê>³µ«>Ù?Ô>€=û>é2?²¹!?Ý2?å(A?ËN?ýêZ?îqe?@Ln?kiu?^¿z?Z<~?hÞ?{¢?‰}?î•y?™Ðs?¦=l?Cöb?åX?úƒK?á„=?¿#.?O}?C£ ?ö¡ñ>:Ê>IX¡>Q’n>e¶>©ú‚=N¶¯¼ÁƒÚ½ÞÀC¾iŒ¾rëµ¾÷Þ¾b¿)¶¿õó%¿¾û5¿‘¯D¿ùóQ¿,°]¿ Õg¿Ñ@p¿Êëv¿€É{¿ÛÐ~¿3ü¿XI¿ ·|¿ÛMx¿Ñr¿j¿þd`¿?U¿„!H¿ÍÆ9¿ *¿—¿ ¿°üç¾Í/À¾RÝ–¾XY¾xê¾! /½Ø.=¯Ý>¿Y>½õ–>Ô)À>òöç>^ ??¢*?—Ï9?|)H?v U?qc`?@j?Är?Mx?¹|?I?<ü?*Ñ~?Ê{?¤ìv?îAp?Ïg?ɱ]?ÑõQ?¡±D?þ5?iö%?ɸ?‘W?ÆÞ>xñµ>IoŒ>…ÍC>cÚ=…®<¬`ƒ½¦©¾È…n¾+R¡¾4ʾGœñ¾ù­ ¿Åz¿b!.¿¶‚=¿‚K¿*X¿Åôb¿‘Bl¿žÏs¿6•y¿’ˆ}¿O¢¿‚Þ¿Ú:~¿Ê¼z¿Vju¿nMn¿[se¿¨ìZ¿þÌN¿‚ A¿¯2¿2¼!¿’5¿Cû¾¶EԾŻ«¾Ò¾þ'.¾ Í®½ã¶÷Å®=$.>ZÐ>º«>DÔ>’Aû>×4?‚»!? 2?n*A?xÌN?3ìZ?÷re?Mn?ju?¼z? <~?{Þ?[¢?±ˆ}?i•y?ãÏs?éBl?.õb?¤X?‚K?Oƒ=? ".?x{?·® ?Øñ>¸5Ê>ÚS¡>;‰n>)­>Ágƒ=°¼U–Ú½ ÊC¾”mŒ¾Ðïµ¾-Þ¾ÎV¿¸¿¼õ%¿bý5¿±D¿OõQ¿W±]¿=Ïg¿ŸAp¿hìv¿ìÉ{¿Ñ~¿9ü¿,I¿¬¶|¿IMx¿r¿›j¿Þc`¿ó U¿ *H¿2Å9¿L*¿·¿ ¿†øç¾y+À¾o÷–¾7Y¾4á¾Ìæ.½óý.=óæ>àY>ŸÛ–>(.À>ûç>Z ?á?a*?1Æ9?ð*H?ÁU?d`?2j?‡r?£Mx?ç¶|?GI?5ü?ñÐ~?©É{?ìv?Ap?iÕg?ž°]?{ôQ?#°D?]ü5?¢ô%?â¶?Tc?‘Þ>íµ>ËjŒ>YÄC>ÏŠÚ=°Ò¯ÞÔ>Z «>YHÔ>¤Eû>Å6?Q½!?º2?v!A?ÙÍN?híZ?te?õMn?¿ju?½z?;~?ŽÞ?;¢?^ˆ}?ä”y?-Ïs?Bl?€ûb?cX?$K?½=?R .? y?¬ ?ðµñ>m1Ê>kO¡>&€n>ì£>Uƒ=ÛK®¼è¨Ú½4ÓC¾rŒ¾.ôµ¾b"Þ¾ÐX¿ñ¬¿ƒ÷%¿ÿ5¿²D¿¥öQ¿‚²]¿:Ðg¿ç#Y>à–>ÓÀ>Eÿç>V ?À? *?ÌÇ9?k"H? U?°e`?$j?Ir?5Nx?G·|?BH?/ü?·Ð~?=É{?iëv?Q@p?kÔg?s·]?%óQ?¤®D?¹ú5?Ûò%?ü´?Qa?04Þ>½èµ>MfŒ>.»C>l¿)Ìs¿@–y¿7‰}¿¢¿\Þ¿.<~¿¿z¿iu¿¹Kn¿Iqe¿<êZ¿=ÊN¿ò'A¿Ó2¿“¸!¿¶1¿ú:û¾6=Ô¾ø²«¾ü羦T.¾Ï§®½ÊE‡82ë®=è6.>cÙ>Á¤«>z/Ô>µIû>³8?!¿!?g2?þ"A?ËÅN?žîZ? ue?ÐNn?jku?޽z?L;~?Þ?¢? ˆ}?_”y?wÎs?Al?lúb?¸ X?ºK?+€=?œ.?Éw?ͪ ?ѱñ>ˆJÊ>üJ¡>wn>¯š>wBƒ=’–®¼7<Ú½`ÜC¾vŒ¾‹øµ¾—&Þ¾ÓZ¿×®¿í%¿«6¿ ´D¿û÷Q¿­³]¿8Ñg¿¶=p¿kév¿ÄÊ{¿‡Ñ~¿Fü¿ÒH¿{¸|¿ Px¿‰r¿·j¿ža`¿\ U¿ 'H¿ýÌ9¿Ä*¿ù¿'¿2ðç¾Ð"À¾‚î–¾€@Y¾&¾!œ.½H/={ù>#,Y>ä–>(À>èæç>R?Ÿ ?ß*?gÉ9?à#H?yU?Ðf`?j? r?ÆNx?¦·|?oH?Tü?~Ð~?ÑÈ{?Ëêv?‚?p?nÓg?H¶]?öúQ?%­D?ù5?ñ%?³?O_?û/Þ>I¶>ÏaŒ>²C>¨eÚ=A=¯<Þƒ½†¾ ¡n¾w_¡¾ö@ʾ¢¨ñ¾o¦ ¿­s¿Ê.¿l‡=¿E†K¿íX¿øb¿?l¿àÌs¿6“y¿Š‰}¿¯¢¿IÞ¿è;~¿›¾z¿ålu¿ÞJn¿@pe¿éZ¿ÝÈN¿j&A¿%2¿*Ã!¿È/¿è6û¾ö8Ô¾’®«¾wã¾rK.¾¹¯½‡Ò8Ðý®=@.>èÝ>'©«>º3Ô>å1û>¡:?ðÀ!?2?‡$A?+ÇN?‰çZ?ve?ªOn?lu?¾z?’;~?1Þ?Ö¢?¹‡}?Ù“y?ÀÍs?6@l?Wùb?w X?ˆK?™~=?æ.?òu?ب ?³­ñ>>FÊ>ìd¡>úmn>r‘>Ò/ƒ=JᮼÊNÚ½¹¦C¾{Œ¾éüµ¾Í*Þ¾Õ\¿¾°¿ãî%¿÷5¿ŒµD¿QùQ¿Ø´]¿6Òg¿„>p¿êv¿LÈ{¿ÁÑ~¿Lü¿¦H¿¸|¿yOx¿ûr¿Åj¿~``¿ U¿«%H¿bË9¿*¿í"¿+¿ìç¾|À¾ ê–¾_7Y¾â¾v/½òm/=¾>D5Y>é–>|À>ëç>¶?~"?ž*?Ë9?U%H?Ä U?<``?j?Îr?XOx?¸|?›H?Nü?ÎÑ~?eÈ{?-êv?´>p?pÒg?µ]? ùQ?äµD?p÷5?Lï%?.±?L]?Æ+Þ>ëýµ>|Œ>רC>SÚ=Šò®<ƒ+ƒ½P¾ákn¾æc¡¾@EʾÀ¬ñ¾d¨ ¿…u¿.¿<~=¿°‡K¿- X¿ùb¿@l¿–Ís¿»“y¿¥‡}¿Ï¢¿6Þ¿¢;~¿"¾z¿;lu¿ÜOn¿7oe¿ÑçZ¿|ÇN¿á$A¿x2¿[Á!¿;¿Ö2û¾¶4Ô¾+ª«¾óÞ¾=B.¾¯½¼Bã¸m¯=QI.>lâ>Ž­«>û7Ô>÷5û>V/?¿Â!?Â2?&A?‹ÈN?¿èZ?pe?„Pn?¾lu?¾z?Ø;~?DÞ?¶¢?‰}?T“y? Ís?P?l?Cøb?7 X?™†K?ɇ=?/.?t?㦠?•©ñ>ôAÊ>}`¡>"£n>6ˆ>,ƒ=,¯¼^aÚ½å¯C¾Æ`Œ¾F¶¾/Þ¾Ø^¿¥²¿ªð%¿³ø5¿Í¬D¿¨úQ¿¶]¿3Óg¿S?p¿¦êv¿¸È{¿qÐ~¿Sü¿yH¿¼·|¿èNx¿9r¿Mj¿__`¿ÅU¿6$H¿ÆÉ9¿F*¿!¿Ç¿Þçç¾'À¾•å–¾>.Y¾žû¾;Q/½ƒ“.= >e>Y>zí–>Ð!À><ïç>²?‹?\*?žÌ9?Ê&H? U?\a`?j?‘r?éOx?e¸|?ÈH?Gü?”Ñ~?ÝÊ{?év?å=p?rÑg?ò³]?JøQ?f´D? 6?…í%?H¯?J[?'Þ>ùµ>™wŒ>~ÞC>@Ú=Ó§®<)>ƒ½˜¾÷tn¾öI¡¾‹Iʾްñ¾Yª ¿\w¿7.¿Î=¿fK¿n X¿,úb¿ç@l¿MÎs¿@”y¿ø‡}¿¢¿"Þ¿\;~¿ª½z¿‘ku¿On¿Fue¿›æZ¿ÆN¿Y#A¿Ê2¿Œ¿!¿%9¿¦Jû¾u0Ծť«¾nÚ¾9.¾~﮽ÿ†˜¸‚£®=†R.>ñæ>ô±«>;<Ô> :û>D1?(¸!?p2?—'A?ìÉN?õéZ? qe?†Kn?hmu?÷¾z?<~?XÞ?–¢?J‰}?_–y?TÌs?j>l?.÷b?öX?/…K?7†=?4%.?Cr?î¤ ?w¥ñ>©=Ê>\¡> šn>ù~>‡ ƒ=¹v¯¼òsÚ½¹C¾DeŒ¾»çµ¾73Þ¾Û`¿‹´¿qò%¿Xú5¿L®D¿ÖòQ¿.·]¿1Ôg¿!@p¿Dëv¿$É{¿ªÐ~¿-ü¿LH¿]·|¿WNx¿vr¿[j¿óe`¿zU¿Á"H¿+È9¿‡*¿.¿Ë ¿<è¾ÓÀ¾á–¾%Y¾Zò¾æ+/½Ø¸.=ÌÕ>†GY>ññ–>%&À>fóç>®?j?& *?9Î9?>(H?[ U?|b`?rj?r?{Px?Ÿ|?õH?Aü?[Ñ~?qÊ{?*ív?=p?uÐg?Dz]?ôöQ?ç²D?hÿ5?ì÷%?a­?GY?[#Þ>0õµ>sŒ>RÕC>í-Ú=]®<ÎPƒ½Ê¡¾ ~n¾eN¡¾p0ʾü´ñ¾N¬ ¿4y¿í.¿`=¿Ñ€K¿X¿@ûb¿ÍAl¿Ïs¿Å”y¿Kˆ}¿4¢¿“Þ¿;~¿1½z¿çju¿(Nn¿=te¿°íZ¿»ÄN¿Ð!A¿2¿¼½!¿77¿”Fû¾TIÔ¾^¡«¾éÕ¾Ô/.¾áÜ®½ƒ–¸ ¶®=©.>uë>[¶«>{@Ô>>û>23?÷¹!?Ÿ2? )A?LËN?+ëZ?re?aLn?„iu?p¿z?d<~?kÞ?v¢?÷ˆ}?Ú•y?~Ðs?ƒ=l?öb?µX?ăK?¥„=?~#.? }?ù¢ ?Y¡ñ>_9Ê> W¡>ön>µ>â÷‚=pÁ¯¼…†Ú½;ÂC¾ÂiŒ¾ìµ¾˜Þ¾Ýb¿r¶¿9ô%¿üû5¿Ê¯D¿,ôQ¿Y°]¿.Õg¿ð@p¿âëv¿É{¿äÐ~¿4ü¿QI¿ý¶|¿ÅMx¿´r¿ij¿Ód`¿U¿M!H¿Æ9¿È*¿O¿Ï ¿üç¾(/À¾§Ü–¾üY¾é¾‘/½-Þ.=ß>Y>gö–>y*À>÷ç>ª ?I?å*?ÓÄ9?³)H?§ U?›c`?dj?ár?(Mx?$¹|?!I?;ü?"Ñ~?Ê{?ìv?ÏAp?wÏg?œ±]?žõQ?h±D?Ãý5?%ö%?€¸?EW?&Þ>Òðµ>žnŒ>'ÌC>ŸšÚ=d®Ñ>Áº«>»DÔ>-Bû> 5?Ç»!?L2?( A?­ÌN?aìZ?se?;Mn?/ju?¯¼z?ª<~?~Þ?W¢?¥ˆ}?U•y?ÈÏs?ÇBl?õb?tX?Y‚K?ƒ=?Ç!.?2{?l® ?;ñ>5Ê>1S¡>á‡n>È«>údƒ=' °¼™Ú½gËC¾@nŒ¾vðµ¾ÍÞ¾W¿Y¸¿ö%¿¡ý5¿I±D¿‚õQ¿„±]¿bÏg¿¾Ap¿€ìv¿üÉ{¿Ñ~¿:ü¿%I¿,¹|¿4Mx¿ñr¿wj¿³c`¿Â U¿Ò)H¿ôÄ9¿ *¿p¿Ó ¿è÷ç¾Ô*À¾Åö–¾ÛY¾Óß¾<á.½‚/=Tè>=Y>JÜ–>Í.À>ºûç>¦ ?(?¤*?nÆ9?.!H?òU?»d`?Vj?¤r?¹Mx?ö¶|?NI?4ü?èÐ~?™É{?ïëv?Ap?CÕg?q°]?HôQ?ê¯D?ü5?^ô%?š¶?c?ðÞ>tìµ> jŒ>üÂC> ˆÚ=ǯ<vƒ½C´¾8n¾CW¡¾9ʾ¡ñ¾Ð¢ ¿â|¿Z#.¿„„=¿¦ƒK¿›X¿öb¿p=l¿oÐs¿Ï•y¿ñˆ}¿t¢¿lÞ¿j<~¿z¿z¿’iu¿sLn¿+re¿DëZ¿iËN¿@)A¿Â2¿º!¿[3¿p>û¾Ô@Ô¾·¶«¾Ôë¾k.¾¦·®½rX8[Û®=/.>‹Õ>¡«>ûHÔ>?Fû>7?–½!?ú2?°!A?ŸÄN?—íZ?'te?Nn?Ùju?'½z?;~?‘Þ?7¢?Rˆ}?Дy?Ïs?àAl?Wûb?4X?î€K?=? .?Zy?w¬ ?Rµñ>É0Ê>ÂN¡>Ë~n>Œ¢>URƒ=ýV®¼­«Ú½’ÔC¾½rŒ¾Ôôµ¾#Þ¾Y¿9­¿Ç÷%¿Eÿ5¿È²D¿ØöQ¿¯²]¿`Ðg¿=p¿ív¿hÊ{¿VÑ~¿Aü¿øH¿Ì¸|¿‡Px¿/r¿…j¿“b`¿w U¿](H¿[Î9¿J *¿‘¿×¿¾óç¾&À¾Nò–¾EHY¾Ö¾ç».½×(/=˜ñ>^$Y>Àà–>xÀ>äÿç>¢ ??b*? È9?£"H?_U?Ûe`?Hj?fr?KNx?U·|?HH?.ü?¯Ð~?-É{?Qëv?2@p?FÔg?G·]?òòQ?k®D?zú5?—ò%?³´?a?3Þ>èµ>¢eŒ>йC>wuÚ=×|¯< ƒ½€½¾N™n¾²[¡¾O=ʾ!¥ñ¾Å¤ ¿r¿%.¿†=¿…K¿ÜX¿÷b¿W>l¿EÌs¿T–y¿C‰}¿”¢¿YÞ¿$<~¿¿z¿vmu¿˜Kn¿"qe¿êZ¿ ÊN¿¸'A¿“2¿N¸!¿m1¿_:û¾”<Ô¾P²«¾Pç¾GS.¾ ¥®½ög’8øí®=G8.>Ú>h¥«>0Ô>QJû>ü8?f¿!?§2?9#A?ÿÅN?æZ?0ue?ðNn?ƒku? ½z?V;~?!Þ?¢?ÿ‡}?K”y?[Îs?ú@l?Búb?ˆ X?„K?ï=?[.?ƒw?‚ª ?4±ñ>åIÊ>SJ¡>µun>O™>°?ƒ=´¡®¼û>Ú½½ÝC¾;wŒ¾2ùµ¾8'Þ¾ [¿ ¯¿`í%¿ê6¿F´D¿.øQ¿Ú³]¿^Ñg¿Õ=p¿‚év¿ÔÊ{¿Ñ~¿Gü¿ÌH¿m¸|¿õOx¿ r¿“j¿sa`¿+ U¿è&H¿ÀÌ9¿*¿²¿Û¿”ïç¾+"À¾Øí–¾$?Y¾Ä ¾’–.½-N/=Üú>-Y>7å–>ÍÀ>‡çç>?æ ?!*?¥É9?$H?ªU?G_`?:j?)r?ÜNx?µ·|?uH?Sü?uÐ~?ÁÈ{?³êv?d?p?HÓg?¶]?ÄúQ?ì¬D?Öø5?Ðð%?̲?_?Z/Þ>¢¶>$aŒ>¥°C>äbÚ= 2¯<¥ƒ½t‡¾c¢n¾ `¡¾šAʾ?©ñ¾º¦ ¿ôs¿ .¿¨‡=¿|†K¿ X¿,øb¿=?l¿ûÌs¿I“y¿–‰}¿´¢¿FÞ¿Þ;~¿‰¾z¿Ìlu¿–Pn¿pe¿ØèZ¿¨ÈN¿/&A¿å2¿åÂ!¿/¿M6û¾T8Ծ꭫¾Ëâ¾J.¾ó¯½³#Ý8–¯=|A.>”Þ>Ï©«>\4Ô>2û>ê:?5Á!?U2?Á$A?_ÇN?·çZ?:ve?ËOn?-lu?¾z?œ;~?4Þ?Ñ¢?¬‡}?Æ“y?¥Ís?@l?.ùb?H X?·K?]~=?¥.?«u?¨ ?­ñ>šEÊ>Cd¡> ln>> -ƒ=k쮼QÚ½¨C¾¹{Œ¾ýµ¾m+Þ¾"]¿±¿'ï%¿M÷5¿ÅµD¿„ùQ¿µ]¿[Òg¿£>p¿ êv¿\È{¿ÉÑ~¿Mü¿ŸH¿¸|¿dOx¿Þr¿j¿T``¿à U¿s%H¿$Ë9¿Â*¿¥"¿ß¿jëç¾×À¾aé–¾6Y¾¾q/½‚s/= > 6Y>®é–>!À>±ëç>?Å"?à*?@Ë9?Œ%H?ö U?g``?+j?ër?nOx?¸|?¢H?Mü?ÅÑ~?UÈ{?êv?•>p?JÒg?ñ´]?nùQ?«µD?1÷5?ï%?æ°?]?%+Þ>Dýµ>l{Œ>y§C>PPÚ=hç®ã>5®«>8Ô>“6û> /?Ã!?2?J&A?ÀÈN?íèZ?*pe?¥Pn?×lu?‘¾z?â;~?GÞ?²¢?‘‰}?A“y?ïÌs?.?l?øb? X?c†K?‡=?î.?Ôs?˜¦ ?ø¨ñ>PAÊ>Ô_¡>Ç¡n>Õ†>eƒ=#7¯¼#dÚ½B±C¾qaŒ¾í¶¾£/Þ¾%_¿í²¿îð%¿òø5¿­D¿ÚúQ¿0¶]¿YÓg¿r?p¿¾êv¿ÈÈ{¿yÐ~¿Tü¿rH¿®·|¿ÒNx¿r¿)j¿çf`¿”U¿ÿ#H¿‰É9¿*¿Æ ¿{¿@ç羂À¾êä–¾â,Y¾=ú¾¬K/½™.=c >Á?Y>$î–>u"À>Ûïç>ý?Ò?Ÿ*?ÛÌ9?'H?A U?‡a`?¤j?­r?ÿOx?s¸|?ÏH?Gü?ŒÑ~?ÍÊ{?wév?Ç=p?MÑg?Ƴ]?øQ?-´D?Í6?Aí%?ÿ®?ýZ?ð&Þ>çøµ>îvŒ> ÝC>¼=Ú=±œ®<ð@ƒ½í™¾Qvn¾ŸJ¡¾.Jʾ{±ñ¾¤ª ¿¢w¿x.¿ €=¿œK¿ž X¿Uúb¿ Al¿hÎs¿T”y¿ˆ}¿¢¿ Þ¿R;~¿˜½z¿wku¿áNn¿ue¿¸îZ¿çÅN¿#A¿Š2¿G¿!¿Û8¿ Jû¾Ó/Ô¾¥«¾ÂÙ¾©7.¾¹ì®½Òd¸H¦®=åS.>ç>œ²«>Ý<Ô>¤:û>Ž1?m¸!?°2?Ò'A? ÊN?#êZ?3qe?§Kn?mu? ¿z?)<~?ZÞ?’¢?>‰}?K–y?8Ìs?G>l?÷b?ÆX?ù„K?û…=?ó$.?ýq?£¤ ?Ú¤ñ>=Ê>f[¡>²˜n>â¼>Àƒ=Ú¯¼¶vÚ½nºC¾ïeŒ¾aèµ¾Ø3Þ¾'a¿Ô´¿µò%¿–ú5¿…®D¿ óQ¿[·]¿WÔg¿@@p¿\ëv¿4É{¿³Ð~¿.ü¿EH¿O·|¿ANx¿Yr¿7j¿Èe`¿(U¿Š"H¿îÇ9¿D*¿ç¿ ¿ÿç¾.À¾tà–¾Á#Y¾ùð¾V&/½h¾.=.×>âHY>›ò–>Ê&À>ôç>ù?±?h *?vÎ9?v(H? U?¦b`?–j?<r?Px?Ó¸|?ûH?@ü?SÑ~?aÊ{?ív?ø‰ôµ>prŒ>õÓC>nªÚ=úQ®<•Sƒ½*£¾gn¾O¡¾1ʾ™µñ¾™¬ ¿zy¿. .¿œ=¿K¿IX¿iûb¿ðAl¿Ïs¿Ù”y¿Wˆ}¿9¢¿Þ¿ ;~¿½z¿Íju¿Nn¿te¿‚íZ¿öÍN¿–!A¿Ý2¿w½!¿í6¿ùEû¾²HÔ¾¶ «¾=Õ¾u..¾Ú®½*R¸æ¸®= .>"ì>·«>AÔ>¶>û>|3?<º!?ß2?Z)A?ËN?YëZ?=re?Ln?žiu?‚¿z?o<~?nÞ?r¢?ëˆ}?Æ•y?cÐs?a=l?ðõb?…X?ŽƒK?i„=?<#.?Ã|?®¢ ?¼ ñ>»8Ê>÷V¡>œn>¥³>Øtƒ=‘̯¼J‰Ú½™ÃC¾mjŒ¾¿ìµ¾8Þ¾*c¿º¶¿}ô%¿;ü5¿°D¿_ôQ¿†°]¿TÕg¿Ap¿ùëv¿ É{¿ìÐ~¿5ü¿KI¿ï¶|¿¯Mx¿—r¿Ej¿¨d`¿ÜU¿+H¿RÆ9¿†*¿¿„ ¿sû羃.À¾ýÛ–¾ Y¾µç¾/½½ã.=rà>xY>÷–>+À>/øç>õ ??'*?Å9?ë)H?Ø U?Æc`?ˆj?þr?=Mx?2¹|?(I?:ü?Ñ~?õÉ{?uìv?°Ap?QÏg?p±]?kõQ?/±D?…ý5?áõ%?8¸?øV?…Þ>+ðµ>òmŒ>ÉÊC>Ú—Ú=$°<:fƒ½g¬¾}ˆn¾}S¡¾^5ʾñ¾Ž® ¿Q{¿å!.¿.ƒ=¿q‚K¿ŠX¿õb¿ÖBl¿ÔÏs¿^•y¿ªˆ}¿Y¢¿}Þ¿¦<~¿¦¼z¿#ju¿-Mn¿ se¿LìZ¿•ÌN¿Ž*A¿/2¿¨»!¿ÿ4¿çAû¾rDÔ¾vº«¾¸Ð¾@%.¾~Ç®½€*6ƒË®=='.>²Ñ>i»«>]EÔ>ÈBû>j5? ¼!?Œ2?b A?áÌN?ìZ?Fse?\Mn?Hju?Á¼z?µ<~?Þ?R¢?˜ˆ}?A•y?­Ïs?¤Bl?Üôb?EX?#‚K?ׂ=?†!.?ëz?"® ?œñ>p4Ê>ˆR¡>††n>hª>3bƒ=g®¼Ý›Ú½ÄÌC¾ënŒ¾ñµ¾nÞ¾gW¿¡¸¿Dö%¿ßý5¿‚±D¿µõQ¿°±]¿ˆÏg¿ÝAp¿—ìv¿ Ê{¿&Ñ~¿;ü¿I¿¹|¿Mx¿Ôr¿Sj¿ˆc`¿‘ U¿š)H¿¹Ï9¿Ç*¿)¿ˆ ¿I÷ç¾/*À¾ö–¾Y¾qÞ¾¬Û.½ /=¶é>™Y>ôÜ–>r/À>Yüç>ñ ?o?æ*?«Æ9?f!H?$U?æd`?zj?Ár?ÏMx?·|?TI?3ü?àÐ~?‰É{?×ëv?â@p?Õg?E°]?ôQ?±¯D?àû5?ô%?Q¶?»b?PÞ>Îëµ>uiŒ>žÁC>F…Ú=m¼¯<"ù‚½¤µ¾’‘n¾ìW¡¾¨9ʾŸ¡ñ¾£ ¿)}¿›#.¿À„=¿ÜƒK¿ËX¿,öb¿“=l¿‹Ðs¿ã•y¿ýˆ}¿y¢¿iÞ¿`<~¿h¿z¿yiu¿RLn¿re¿ëZ¿5ËN¿)A¿‚2¿Ø¹!¿3¿Õ=û¾2@Ô¾¶«¾(ë¾ .¾à´®½Êœ%8!Þ®=r0.>7Ö>ª¡«>IÔ>ÚFû>X7?Û½!?:2?ë!A?ÓÄN?ÅíZ?Ote?6Nn?òju?9½z?;~?”Þ?2¢?Fˆ}?¼”y?÷Îs?¾Al?.ûb?X?¸€K?E=?Ð.?y?-¬ ?µ´ñ>&0Ê>N¡>q}n>+¡>ŽOƒ=b®¼,/Ú½ðÕC¾isŒ¾{õµ¾£#Þ¾jY¿‚­¿ ø%¿„ÿ5¿³D¿ ÷Q¿Û²]¿†Ðg¿%=p¿5ív¿xÊ{¿_Ñ~¿Bü¿òH¿¾¸|¿qPx¿r¿aj¿hb`¿E U¿%(H¿Î9¿ *¿J¿Œ¿óç¾Ú%À¾¤ñ–¾éFY¾-Õ¾W¶.½g./=ùò>º%Y>ká–>À>ƒè>í ?O?¥*?GÈ9?Ú"H?U?f`?lj?ƒr?`Nx?c·|?OH?-ü?¦Ð~?É{?:ëv?@p? Ôg?·]?¿òQ?2®D?<ú5?Sò%?k´?¸`?ï2Þ>pçµ>÷dŒ>r¸C>³rÚ=¶q¯<Ç ƒ½—¾¨šn¾[\¡¾ó=ʾ¾¥ñ¾¥ ¿br¿Q%.¿R†=¿G…K¿ X¿A÷b¿y>l¿`Ìs¿h–y¿P‰}¿™¢¿VÞ¿<~¿ï¾z¿\mu¿xKn¿úpe¿àéZ¿ÔÉN¿}'A¿S2¿ ¸!¿#1¿Ã9û¾ò;Ô¾©±«¾£æ¾èQ.¾C¢®½"Š8¾ð®=¦9.>¼Ú>¦«>¾0Ô>ìJû>F9?«¿!?ç2?s#A?4ÆN?¯æZ?Xue?On?œku?²½z?a;~?$Þ?¢?ó‡}?7”y?@Îs?Ø@l?úb?Y X?NK?³=?.?=w?8ª ?—°ñ>AIÊ>ªI¡>[tn>ï—>è<ƒ=Õ¬®¼ÀAÚ½I C¾çwŒ¾Øùµ¾Ø'Þ¾l[¿h¯¿£í%¿(6¿´D¿aøQ¿´]¿ƒÑg¿ó=p¿šév¿äÊ{¿˜Ñ~¿Hü¿ÅH¿_¸|¿àOx¿ƒr¿oj¿Ha`¿ú U¿±&H¿‚Ì9¿>*¿j¿¿õî羆!À¾-í–¾È=Y¾c ¾‘.½¼S/==ü>Û.Y>áå–>rÀ>&èç>é?.!?d*?âÉ9?O$H?ÜU?r_`?^j?Fr?òNx?÷|?|H?Rü?mÐ~?±È{?œêv?E?p?"Óg?ïµ]?‘úQ?³¬D?—ø5?Œð%?„²?µ^?º.Þ>ü¶>y`Œ>G¯C>`Ú=þ&¯@ß>wª«>ÿ4Ô>3û>4;?zÁ!?•2?ü$A?”ÇN?åçZ?Ioe?ëOn?Flu?*¾z?§;~?7Þ?Í¢? ‡}?²“y?ŠÍs?ò?l?ùb? X?˜‡K?!~=?c.?eu?C¨ ?y¬ñ>÷DÊ>šc¡>Ekn>²Ž>C*ƒ=÷®¼STÚ½u©C¾Ÿ]Œ¾6þµ¾,Þ¾o]¿O±¿kï%¿Œ÷5¿þµD¿·ùQ¿1µ]¿Òg¿Â>p¿7êv¿lÈ{¿ÒÑ~¿Nü¿˜H¿ÿ·|¿NOx¿Ár¿÷j¿)``¿® U¿<%H¿çÊ9¿€*¿^"¿”¿Ëêç¾2À¾·è–¾§4Y¾¾qk/½y/=>ü7Y>Xê–>ÆÀ>Pìç>M? #?#*?}Ë9?Ä%H?' U?’``?Öj?r?ƒOx?"¸|?©H?Lü?½Ñ~?EÈ{?þév?v>p?%Òg?Ä´]?;ùQ?rµD?óö5?Äî%?°?³\?…*Þ>žüµ>ÁzŒ>¦C>‹MÚ=GÜ®<1ƒ½’¾–nn¾ÚF¡¾ˆFʾú­ñ¾ú¨ ¿v¿.¿´~=¿ˆK¿ X¿jùb¿F@l¿ÍÍs¿â“y¿¾‡}¿Ø¢¿0Þ¿;~¿þ½z¿lu¿›On¿ve¿tçZ¿ÇN¿l$A¿ø2¿ÑÀ!¿€:¿Ÿ1û¾q3Ծܨ«¾šÝ¾?.¾ü®½cþ̸ù¯=L.>Åã>Ý®«>?9Ô>.7û>ê/?IÃ!?B2?„&A?ôÈN?éZ?Rpe?íJn?ðlu?£¾z?í;~?JÞ?­¢?„‰}?-“y?ÔÌs? ?l?ð÷b?×X?-†K?Q‡=?­.?Žs?N¦ ?[¨ñ>¬@Ê>+_¡>m n>u…>žƒ=DB¯¼çfÚ½ ²C¾bŒ¾ªäµ¾C0Þ¾q_¿6³¿2ñ%¿1ù5¿?­D¿ ûQ¿\¶]¿Óg¿?p¿Õêv¿ØÈ{¿‚Ð~¿Uü¿lH¿ ·|¿½Nx¿ÿr¿j¿½f`¿cU¿Ç#H¿LÉ9¿Á*¿ ¿0¿¡æç¾ÝÀ¾@ä–¾†+Y¾Ûø¾F/½¢ž.=Å>AY>Îî–>#À>zðç>I??â*?Í9?9'H?s U?²a`?Èj?–r?Px?‚¸|?ÕH?Fü?ƒÑ~?½Ê{?`év?¨=p?'Ñg?™³]?å÷Q?ô³D?6?ýì%?·®?°Z?O&Þ>@øµ>CvŒ>ÂÛC>ø:Ú=‘®<·Cƒ½N›¾¬wn¾HK¡¾l-ʾ²ñ¾ïª ¿éw¿¹.¿F€=¿ÒK¿Î X¿~úb¿,Al¿ƒÎs¿g”y¿ˆ}¿¢¿Þ¿G;~¿†½z¿^ku¿ÁNn¿÷te¿ŠîZ¿³ÅN¿ä"A¿J2¿¿!¿’8¿pIû¾1/Ô¾u¤«¾Ù¾J6.¾ó鮽¦B‚¸©®=DU.>Iè>D³«>=Ô>@;û>Ø1?²¸!?ð2? (A?UÊN?QêZ?[qe?ÇKn? iu?¿z?3<~?]Þ?¢?2‰}?7–y?Ìs?%>l?Üöb?–X?„K?¿…=?±$.?¶q?Y¤ ?=¤ñ>b<Ê>½Z¡>W—n>»>ùƒ=üŒ¯¼{yڽ˻C¾šfŒ¾éµ¾¤Þ¾ta¿µ¿ùò%¿Õú5¿¾®D¿<óQ¿‡·]¿|Ôg¿_@p¿sëv¿DÉ{¿»Ð~¿/ü¿?H¿@·|¿+Nx¿<r¿j¿e`¿öU¿R"H¿°Ç9¿*¿ ¿4 ¿þþ羉À¾Éß–¾e"Y¾˜ï¾Ç /½øÃ.=Ø>>JY>Eó–>o'À>¤ôç>E?ø?« *?´Î9?­(H?¾ U?Ñb`?ºj?Yr?ÁLx?á¸|?I??ü?JÑ~?QÊ{?ûìv?Ùãóµ>ÅqŒ>—ÒC>©§Ú=ØF®<\Vƒ½Š¤¾Â€n¾·O¡¾·1ʾšñ¾ä¬ ¿Ày¿p .¿Ø=¿=K¿yX¿“ûb¿Bl¿9Ïs¿í”y¿dˆ}¿=¢¿Þ¿;~¿ ½z¿´ju¿çMn¿îse¿TíZ¿ÁÍN¿[!A¿2¿2½!¿¤6¿^Eû¾HÔ¾ «¾‘Ô¾-.¾U×®½¤Þ·¬»®=h.>Îì>ª·«>¿AÔ>Q?û>Æ3?º!?2?•)A?µËN?‡ëZ?dre?¢Ln?·iu?Z¼z?y<~?pÞ?m¢?߈}?²•y?HÐs??=l?Çõb?VX?XƒK?-„=?û".?||?c¢ ? ñ>8Ê>NV¡>BŽn>E²>rƒ=³×¯¼ŒÚ½÷ÄC¾kŒ¾fíµ¾ÙÞ¾vc¿·¿Àô%¿zü5¿<°D¿’ôQ¿²°]¿zÕg¿-Ap¿ìv¿°É{¿õÐ~¿6ü¿DI¿á¶|¿šMx¿zr¿!j¿}d`¿«U¿×*H¿Æ9¿C*¿À¿8 ¿Ôúç¾Þ-À¾SÛ–¾DY¾Tæ¾rû.½Mé.=Óá>ÔY>¼÷–>Ã+À>Îøç>A ?Ø?j*?MÅ9?"*H? U?ñc`?¬j?r?SMx?³¶|?/I?9ü?Ñ~?åÉ{?^ìv?’Ap?,Ïg?C±]?8õQ?ö°D?Fý5?žõ%?ï·?«V?åÞ>…ïµ>GmŒ>lÉC>•Ú=ü¯<iƒ½Ç­¾×‰n¾&T¡¾6ʾžñ¾Ù® ¿—{¿&".¿jƒ=¿¨‚K¿ºX¿Aõb¿øBl¿ïÏs¿r•y¿·ˆ}¿]¢¿zÞ¿›<~¿”¼z¿ ju¿ Mn¿åre¿ìZ¿aÌN¿S*A¿ï2¿c»!¿¶4¿LAû¾ÐCԾι«¾ оá#.¾¸Ä®½¢¦7Iή=œ(.>_Ò>¼«>ÿEÔ>cCû>´5?Q¼!?Ì2? A?ÍN?½ìZ?mse?|Mn?aju?Ò¼z?ß:~?„Þ?M¢?Œˆ}?-•y?’Ïs?‚Bl?²ôb?X?íK?›‚=?E!.?¥z?×­ ?œñ>Í3Ê>ßQ¡>,…n>©>l_ƒ=ˆ"®¼¢žÚ½"ÎC¾–oŒ¾Ãñµ¾ Þ¾´W¿ê¸¿ˆö%¿þ5¿»±D¿èõQ¿Ý±]¿®Ïg¿üAp¿¯ìv¿Ê{¿.Ñ~¿<ü¿I¿¹|¿Mx¿·r¿/j¿]c`¿_ U¿c)H¿|Ï9¿„*¿á¿< ¿ªö羊)À¾põ–¾#Y¾Ý¾Ö.½¢/=ë>õY>žÝ–>0À>øüç>= ?·?)*?èÆ9?!H?UU?e`?žj?Þr?äMx?·|?)H?2ü?×Ð~?yÉ{?Àëv?Ã@p?øÔg?°]?âóQ?x¯D?¡û5?Öó%? ¶?nb?¯Þ>'ëµ>ÉhŒ>@ÀC>‚‚Ú=K±¯<éû‚½·¾í’n¾•X¡¾L:ʾ=¢ñ¾e£ ¿o}¿Ü#.¿ü„=¿„K¿úX¿Uöb¿µ=l¿¦Ðs¿÷•y¿ ‰}¿}¢¿gÞ¿U<~¿V¿z¿`iu¿2Ln¿Üqe¿èêZ¿ËN¿Ë(A¿À2¿“¹!¿È2¿:=û¾?Ô¾gµ«¾|꾬.¾²®½#á;8çà®=Ñ1.>ãÖ>R¢«>?JÔ>uGû>¢7? ¾!?z2?%"A?ÅN?óíZ?vte?WNn? ku?K½z?%;~?Þ?-¢?9ˆ}?¨”y?ÛÎs?œAl?ûb?ÔX?‚€K? =?Ž.?Îx?â« ?´ñ>‚/Ê>pM¡>|n>ËŸ>ÆLƒ=@m®¼ð1Ú½M×C¾tŒ¾!öµ¾D$Þ¾¶Y¿Ê­¿Oø%¿Ãÿ5¿:³D¿>÷Q¿³]¿¬Ðg¿D=p¿Lív¿ˆÊ{¿hÑ~¿Bü¿ëH¿°¸|¿[Px¿õr¿=j¿=b`¿ U¿î'H¿àÍ9¿»*¿¿@¿€òç¾5%À¾úð–¾EY¾ÌӾǰ.½÷3/=[ô>'Y>â–>ÃÀ>"è>9?–?è*?„È9?#H?ÂU?1f`?j? r?vNx?r·|?VH?Xü?žÐ~? É{?"ëv?õ?p?úÓg?í¶]?ŒòQ?ù­D?ýù5?ò%?"´?k`?O2Þ>Éæµ>KdŒ>·C>îoÚ=”f¯<Žƒ½ø€¾œn¾]¡¾–>ʾ[¦ñ¾Z¥ ¿©r¿’%.¿Ž†=¿}…K¿;X¿j÷b¿›>l¿{Ìs¿|–y¿\‰}¿¢¿SÞ¿<~¿Ý¾z¿Cmu¿WKn¿Ópe¿²éZ¿ ÉN¿C'A¿2¿+Ä!¿Ú0¿(9û¾P;Ô¾±«¾÷徉P.¾}Ÿ®½O¬¨8„ó®=;.>hÛ>¸¦«>a1Ô>‡Kû>9?ð¿!?'2?®#A?hÆN?ÞæZ?ue?1On?¶ku?Ľz?k;~?'Þ?è¢?æ‡}?#”y?%Îs?¶@l?ðùb?) X?K?w=?Ø.?öv?í© ?ú¯ñ>žHÊ>I¡>sn>Ž–>!:ƒ=÷·®¼„DÚ½§¡C¾’xŒ¾úµ¾y(Þ¾¹[¿±¯¿çí%¿g6¿¸´D¿”øQ¿3´]¿©Ñg¿>p¿±év¿ôÊ{¿¡Ñ~¿Iü¿¾H¿Q¸|¿ÊOx¿gr¿Kj¿a`¿È U¿y&H¿EÌ9¿ü*¿ö#¿D¿Vîç¾á À¾ƒì–¾l70Y>‹æ–>À>Åèç>5?u!?¦*?Ê9?‡$H? U?_`?‚j?cr?Ox?Ñ·|?‚H?Qü?îÑ~?¡È{?„êv?&?p?üÒg?õ]?^úQ?z¬D?Xø5?Hð%?;²?i^?.Þ>U¶>Í_Œ>é­C>[]Ú=ݯ<4!ƒ½4оÛfn¾sa¡¾áBʾyªñ¾O§ ¿€t¿Ž.¿ˆ=¿è†K¿| X¿~øb¿‚?l¿1Ís¿q“y¿¯‰}¿½¢¿@Þ¿É;~¿e¾z¿™lu¿UPn¿Éoe¿|èZ¿?ÈN¿º%A¿e2¿[Â!¿$<¿5û¾7Ô¾š¬«¾rá¾TG.¾h ¯½ hó8!¯=:D.>ìß>««>¡5Ô>·3û>};?¿Á!?Õ2?6%A?ÉÇN?èZ?poe? Pn?`lu?<¾z?±;~?:Þ?È¢?ˉ}?ž“y?oÍs?Ï?l?Üøb?è X?b‡K?å}=?".?u?ø§ ?Ü«ñ>SDÊ>ñb¡>ëin>Q>|'ƒ=®¯¼WÚ½ÒªC¾J^Œ¾Üþµ¾®,Þ¾»]¿—±¿®ï%¿Ë÷5¿7¶D¿êùQ¿^µ]¿§Òg¿á>p¿Oêv¿|È{¿ÚÑ~¿Oü¿’H¿ñ·|¿8Ox¿¤r¿Ój¿þ_`¿} U¿%H¿ªÊ9¿=*¿"¿à¿,êç¾À¾ è–¾K3Y¾¾¾áe/½¡~/=â>X9Y>ë–>kÀ>ïìç>™?T#?e*?ºË9?û%H?Y U?½``?új?%r?™Ox?0¸|?¯H?Kü?´Ñ~?Ë{?æév?X>p?ÿÑg?˜´]?ùQ?9µD?´ö5?î%?U°?f\?ä)Þ>÷ûµ>zŒ>¾¤C>ÇJÚ=%Ñ®<Ù3ƒ½q“¾ñon¾ƒG¡¾+Gʾ—®ñ¾D© ¿Xv¿D.¿ð~=¿RˆK¿½ X¿“ùb¿h@l¿èÍs¿ö“y¿Ê‡}¿Ý¢¿-Þ¿ƒ;~¿ì½z¿ïku¿{On¿Ùue¿FçZ¿ßÆN¿2$A¿¸2¿ŒÀ!¿6:¿æLû¾Ï2Ô¾4¨«¾îܾ >.¾Êù®½7ÜÁ¸¿¯=oM.>qä>…¯«>á9Ô>É7û>30?Ã!?‚2?¾&A?)ÉN?JéZ?ype?Kn? mu?µ¾z?÷;~?MÞ?¨¢?x‰}?“y?¸Ìs?é>l?Ç÷b?§X?÷…K?‡=?l.?Hs?¦ ?¾§ñ> @Ê>‚^¡>Ÿn>„>׃=fM¯¼¬iÚ½þ³C¾ÈbŒ¾Qåµ¾ä0Þ¾¾_¿~³¿vñ%¿où5¿x­D¿@ûQ¿‰¶]¿¥Óg¿¯?p¿íêv¿èÈ{¿ŠÐ~¿Vü¿eH¿’·|¿§Nx¿âr¿áj¿’f`¿1U¿#H¿É9¿~*¿7 ¿ä¿‰è¾8À¾–ã–¾**Y¾z÷¾Œ@/½2¤.=&>yBY>yï–>À#À>ñç>•?a?$*?VÍ9?p'H?¤ U?Üa`?ìj?³r?*Px?¸|?ÜH?Eü?{Ñ~?­Ê{?Hév?‰=p?Ñg?m³]?²÷Q?»³D?P6?¹ì%?n®?dZ?¯%Þ>š÷µ>˜uŒ>dÚC>38Ú=n†®<~Fƒ½®œ¾yn¾òK¡¾.ʾµ²ñ¾9« ¿/x¿û.¿‚€=¿€K¿þ X¿§úb¿NAl¿žÎs¿{”y¿ˆ}¿"¢¿Þ¿=;~¿t½z¿Eku¿ Nn¿Ðte¿[îZ¿~ÅN¿©"A¿ 2¿½¾!¿H8¿ÔHû¾®KԾͣ«¾iؾë4.¾-箽ô@n¸Ô«®=£V.>öè>쳫>!>Ô>Û;û>!2?÷¸!?02?G(A?‰ÊN?êZ?‚qe?èKn?&iu?-¿z?=<~?`Þ?ˆ¢?%‰}?#–y?Ìs?>l?²öb?gX?Œ„K?ƒ…=?p$.?pq?¤ ? £ñ>¾;Ê>Z¡>ý•n>!º>2ƒ=˜¯¼?|Ú½)½C¾FgŒ¾®éµ¾DÞ¾Àa¿eµ¿=ó%¿û5¿÷®D¿oóQ¿´·]¿¢Ôg¿~@p¿‹ëv¿TÉ{¿ÄÐ~¿0ü¿8H¿2·|¿Nx¿r¿ïj¿re`¿ÅU¿"H¿sÇ9¿¿*¿X¿è ¿_þç¾1À¾ß–¾ !Y¾6î¾7/½‡É.=ñÙ>šKY>ïó–>(À>Cõç>‘?@?î *?ñÎ9?å(H?ð U?üb`?Þj?vr?×Lx?ï¸|? I?>ü?AÑ~?AÊ{?äìv?»<óµ>qŒ>9ÑC>å¤Ú=·;®<#Yƒ½ë¥¾‚n¾`P¡¾Z2ʾšñ¾.­ ¿z¿± .¿‚=¿sK¿©X¿¼ûb¿4Bl¿TÏs¿•y¿pˆ}¿B¢¿ŠÞ¿ö:~¿û¼z¿›ju¿ÆMn¿Çse¿&íZ¿ÍN¿!!A¿]2¿í¼!¿Z6¿ÂDû¾nGÔ¾Œ½«¾äÓ¾·+.¾Ô®½ò’±·r¾®=Ç .>zí>R¸«>aBÔ>í?û>4?ƺ!?_2?Ï)A?êËN?µëZ?Œre?ÂLn?Ðiu?l¼z?„<~?sÞ?h¢?Òˆ}?ž•y?-Ðs?=l?žõb?&X?"ƒK?ñƒ=?º".?6|?¢ ?‚Ÿñ>t7Ê>¥U¡>çŒn>ä°>Joƒ=Ô⯼ӎڽTÆC¾ÄkŒ¾ îµ¾yÞ¾þU¿K·¿õ%¿¸ü5¿u°D¿ÅôQ¿ß°]¿ Õg¿LAp¿(ìv¿ÀÉ{¿ýÐ~¿7ü¿>I¿Ó¶|¿„Mx¿]r¿ýj¿Rd`¿yU¿ *H¿ØÅ9¿*¿y¿ì ¿5úç¾9-À¾=ù–¾èY¾òä¾âõ.½Ýî.=4ã>0Y>fø–>h,À>mùç> ??¬*?ŠÅ9?Z*H?;U?d`?Ðj?8r?iMx?Á¶|?5I?8ü?Ñ~?ÕÉ{?Fìv?sAp?Ïg?±]?õQ?½°D?ý5?Zõ%?§·?_V?DÞ>Þîµ>œlŒ>ÈC>Q’Ú=áð¯<Èkƒ½(¯¾2‹n¾ÏT¡¾¥6ʾ»žñ¾»¡ ¿Þ{¿g".¿¦ƒ=¿Þ‚K¿éX¿jõb¿Cl¿ Ðs¿…•y¿Ãˆ}¿b¢¿wÞ¿‘<~¿ƒ¼z¿ðiu¿ìLn¿½re¿ðëZ¿,ÌN¿*A¿¯2¿»!¿l4¿±@û¾.CÔ¾&¹«¾T".¾òÁ®½¸r7Ñ®=û).> Ó>¹¼«>¡FÔ>ÿCû>ý5?–¼!? 2?× A?JÍN?ëìZ?•se?Mn?{ju?ä¼z?é:~?†Þ?H¢?€ˆ}?•y?wÏs?`Bl?‰ôb?åX?·K?_‚=?!.?_z?­ ?c›ñ>)3Ê>6Q¡>уn>§§>¥\ƒ=ª-®¼f¡Ú½€ÏC¾ApŒ¾jòµ¾¯ Þ¾X¿,¬¿Ëö%¿]þ5¿ô±D¿öQ¿ ²]¿ÔÏg¿Bp¿Æìv¿,Ê{¿7Ñ~¿=ü¿I¿¹|¿óLx¿šr¿ j¿2c`¿. U¿+)H¿>Ï9¿B*¿š¿ð¿ öç¾ä(À¾Æô–¾RMY¾¯Û¾Ð.½2/=xì>QY>HÞ–>½0À>—ýç>‰ ?þ?k*?&Ç9?Õ!H?‡U?êµ>hŒ>â¾C>½Ú=*¦¯<°þ‚½d¸¾G”n¾>Y¡¾ð:ʾڢñ¾°£ ¿q¿$.¿8…=¿H„K¿*X¿~öb¿×=l¿ÁÐs¿ –y¿‰}¿‚¢¿dÞ¿K<~¿D¿z¿Fiu¿Ln¿´qe¿ºêZ¿ÌÊN¿‘(A¿€2¿N¹!¿~2¿Ÿ<û¾î>Ô¾¿´«¾Ïé¾^X.¾T¯®½{%R8­ã®=03.>×>ù¢«>áJÔ>Hû>ë7?e¾!?º2?`"A?<ÅN?!îZ?žte?wNn?%ku?]½z?/;~?Þ?(¢?-ˆ}?””y?ÀÎs?yAl?Ûúb?¤X?L€K?Í€=?M.?ˆx?—« ?{³ñ>ß.Ê>ÇL¡>¼zn>kž>ÿIƒ=ax®¼µ4Ú½«ØC¾¿tŒ¾Èöµ¾ä$Þ¾Z¿®¿dì%¿6¿s³D¿q÷Q¿5³]¿ÑÐg¿b=p¿dív¿˜Ê{¿pÑ~¿Cü¿äH¿¢¸|¿FPx¿Ør¿j¿b`¿â U¿¶'H¿£Í9¿x*¿»¿ô¿áñç¾$À¾Pð–¾1DY¾ä¾7«.½‡9/=¼õ>r(Y>¿â–>hÀ>Áè>…?Ý?**?ÁÈ9?I#H?óU?\f`?´j?½r?ŒNx?€·|?\H?Wü?•Ð~?ýÈ{? ëv?Ö?p?ÔÓg?Á¶]?YòQ?À­D?¾ù5?Ëñ%?Ú³?`?®1Þ>#æµ> cŒ>·µC>*mÚ=s[¯l¿–Ìs¿–y¿h‰}¿¢¢¿QÞ¿<~¿Ë¾z¿*mu¿7Kn¿«pe¿„éZ¿kÉN¿'A¿Ó2¿æÃ!¿0¿8û¾®:Ô¾Y°«¾Kå¾*O.¾·œ®½{γ8Jö®=e<.>Ü>`§«>2Ô>"Lû>Ù9?5À!?g2?è#A?ÆN? çZ?§ue?ROn?Ïku?Ö½z?v;~?)Þ?ã¢?Ú‡}?”y? Îs?“@l?Çùb?ù X?â~K?;=?—.?°v?¢© ?]¯ñ>úGÊ>XH¡>¦qn>.•>Z7ƒ=î¼IGÚ½£C¾=yŒ¾%ûµ¾)Þ¾\¿ù¯¿+î%¿eö5¿ñ´D¿ÇøQ¿_´]¿ÏÑg¿1>p¿Éév¿Ë{¿©Ñ~¿Jü¿¸H¿B¸|¿´Ox¿Jr¿'j¿ó``¿— U¿B&H¿Ì9¿¹*¿®#¿ø¿·íç¾< À¾Ùë–¾;Y¾ ¾â….½Ü^/=ÿ>“1Y>6ç–>¼À>déç>€?¼!?é*?\Ê9?¾$H?> U?È_`?¦j?€r?Ox?ß·|?‰H?Pü?åÑ~?‘È{?mêv??p?×Òg?–µ]?+úQ?A¬D?ø5?ð%?ó±?^?y-Þ>¯ÿµ>"_Œ>Œ¬C>–ZÚ=»¯<û#ƒ½•‹¾5hn¾b¡¾…Cʾ«ñ¾š§ ¿Æt¿Ï.¿š}=¿‡K¿¬ X¿¨øb¿¤?l¿LÍs¿…“y¿»‰}¿Â¢¿=Þ¿¾;~¿S¾z¿€lu¿5Pn¿¢oe¿NèZ¿ ÈN¿€%A¿%2¿Â!¿Ú;¿{4û¾m6Ô¾ò««¾Æà¾õE.¾¢ ¯½8Šþ8ç¯=™E.>™à>Æ««>C6Ô>R4û>Ç;?Â!?2?p%A?ýÇN?BèZ?˜oe?,Pn?ylu?N¾z?¼;~?=Þ?â?¾‰}?Š“y?TÍs?­?l?²øb?¸ X?,‡K?©}=?á.?Ùt?­§ ??«ñ>¯CÊ>Hb¡>hn>ñ‹>µ$ƒ=Ð ¯¼ÜYÚ½0¬C¾õ^Œ¾ƒÿµ¾O-Þ¾^¿à±¿òï%¿ ø5¿2¬D¿úQ¿Šµ]¿ÍÒg¿ÿ>p¿fêv¿ŒÈ{¿ãÑ~¿Pü¿‹H¿ã·|¿#Ox¿‡r¿¯j¿Ó_`¿K U¿Í$H¿lÊ9¿ú*¿Ï!¿”¿éç¾çÀ¾bç–¾ï1Y¾]ÿ¾Q`/½1„/=D>´:Y>¬ë–> À>Žíç>å?›#?¨*?øË9?3&H?Š U?ç``?j?Br?¯Ox??¸|?¶H?Jü?¬Ñ~? Ë{?Ïév?9>p?ÙÑg?k´]?ÕøQ?µD?uö5?=î%? °?\?D)Þ>Qûµ>jyŒ>`£C>HÚ=Æ®< 6ƒ½Ò”¾Kqn¾,H¡¾ÏGʾ4¯ñ¾© ¿žv¿†.¿,=¿Ó~K¿í X¿¼ùb¿Š@l¿Îs¿ ”y¿×‡}¿â¢¿*Þ¿x;~¿Ú½z¿Öku¿ZOn¿±ue¿çZ¿ªÆN¿÷#A¿x2¿GÀ!¿ì9¿KLû¾-2Ô¾Œ§«¾AܾÁ<.¾÷®½ º¶¸…¯=ÎN.>å>-°«>ƒ:Ô>d8û>}0?ÔÃ!?Â2?ù&A?]ÉN?xéZ?¡pe?.Kn?#mu?Ǿz?<~?PÞ?£¢?l‰}?•–y?Ìs?Ç>l?ž÷b?xX?Á…K?Ù†=?*.?s?¸¥ ?!§ñ>e?Ê>Ù]¡>¸n>´‚>ƒ=‡X¯¼plÚ½[µC¾scŒ¾÷åµ¾„1Þ¾ `¿Ç³¿ºñ%¿®ù5¿±­D¿LòQ¿µ¶]¿ÊÓg¿Î?p¿ëv¿ùÈ{¿“Ð~¿Vü¿^H¿ƒ·|¿‘Nx¿År¿½j¿gf`¿U¿X#H¿ÑÈ9¿<*¿ð¿˜¿ê输À¾ìâ–¾Î(Y¾ö¾ü:/½Â©.=ˆ>ÕCY>#ð–>e$À>¸ñç>á?¨?g*?“Í9?¨'H?Õ U?b`?j?Ðr?@Px?ž¸|?ãH?Dü?rÑ~?Ê{?jív?j=p?ÛÐg?@³]?÷Q?‚³D?6?vì%?&®?Z?%Þ>óöµ>ìtŒ>ÙC>o5Ú=L{®€K¿˜X¿Ñúb¿pAl¿¹Îs¿”y¿*ˆ}¿'¢¿Þ¿2;~¿b½z¿+ku¿€Nn¿¨te¿-îZ¿JÅN¿o"A¿Ë2¿w¾!¿þ7¿9Hû¾ KÔ¾%£«¾½×¾Œ3.¾g䮽›üW¸š®®=X.>¢é>“´«>Ã>Ô>v<û>k2?<¹!?p2?(A?¾ÊN?®êZ?ªqe? Ln?@iu??¿z?H<~?cÞ?ƒ¢?‰}?–y?ÈÐs?à=l?‰öb?7X?V„K?G…=?/$.?*q?ã ?£ñ>;Ê>jY¡>¢”n>Á¸>kÿ‚=?£¯¼Ú½‡¾C¾ñgŒ¾Uêµ¾åÞ¾ b¿­µ¿ó%¿Rû5¿0¯D¿¢óQ¿à¯]¿ÈÔg¿œ@p¿¢ëv¿eÉ{¿ÌÐ~¿1ü¿1H¿$·|¿Nx¿r¿Ëj¿Ge`¿“U¿ã!H¿6Ç9¿}*¿¿œ ¿Àýç¾è0À¾uÞ–¾¬Y¾Õì¾§/½Ï.=RÛ>öLY>™ô–>¹(À>âõç>Ü?‡?0*?.Ï9?)H?! U?'c`?j?“r?íLx?ý¸|?I?=ü?9Ñ~?1Ê{?Ììv?#Bp?ÞÏg?²]?)öQ?²D?mþ5?Ýö%??¬?X?Ù Þ>–òµ>npŒ>ÛÏC> ¢Ú=•0®<ê[ƒ½K§¾wƒn¾ Q¡¾þ2ʾ:›ñ¾y­ ¿Lz¿ò .¿P‚=¿©K¿ØX¿~ôb¿WBl¿oÏs¿•y¿|ˆ}¿G¢¿‡Þ¿ì:~¿é¼z¿ju¿¥Mn¿Ÿse¿÷ìZ¿XÍN¿ç A¿2¿¨¼!¿6¿'Dû¾ÌFԾ弫¾8Ó¾W*.¾ÉÑ®½A …·8Á®=&".>'î>ú¸«>CÔ>ˆ@û>Y4? »!?Ÿ2? *A?ÌN?äëZ?³re?ãLn?êiu?~¼z?Ž<~?vÞ?c¢?ƈ}?‹•y?Ðs?$Cl?uõb?öX?ì‚K?µƒ=?x".?ð{?Ρ ?åžñ>Ð6Ê>üT¡>‹n>„¯>ƒlƒ=öí¯¼—‘Ú½²ÇC¾olŒ¾³îµ¾Þ¾KV¿”·¿Hõ%¿÷ü5¿¯°D¿øôQ¿ ±]¿üÎg¿kAp¿@ìv¿ÑÉ{¿Ñ~¿8ü¿7I¿Å¶|¿nMx¿@r¿Ùj¿'d`¿HU¿h*H¿šÅ9¿¾*¿2¿¡ ¿–ùç¾”,À¾’ø–¾‹Y¾‘ã¾Rð.½lô.=–ä>ŒY>ù–> -À> úç>Ø ?f?ï*?ÈÅ9?‘*H?lU?Gd`?ôj?Ur?~Mx?϶|?8îµ>ðkŒ>°ÆC>Ú=À寷Ó>`½«>CGÔ>šDû>G6?Û¼!?L2?!A?ÍN?íZ?¼se?½Mn?”ju?ö¼z?ô:~?‰Þ?C¢?sˆ}?•y?[Ïs?=Bl?Çûb?µX?K?#‚=? .?z?B­ ?Æšñ>…2Ê>P¡>w‚n>G¦>ÝYƒ=Ë8®¼+¤Ú½ÝÐC¾ípŒ¾óµ¾O!Þ¾MX¿t¬¿÷%¿›þ5¿-²D¿NöQ¿6²]¿úÏg¿9Bp¿Þìv¿=Ê{¿?Ñ~¿>ü¿ I¿ó¸|¿ÝLx¿}r¿çj¿c`¿ý U¿ó(H¿Ï9¿ÿ *¿S¿¥¿lõç¾?(À¾ô–¾öKY¾MÚ¾ýÊ.½Á/=Úí>­ Y>óÞ–>b1À>6þç>Ô ?F?®*?cÇ9? "H?¸U?ge`?æj?r?Nx?.·|?6H?0ü?ÆÐ~?YÉ{?‘ëv?†@p?¬Ôg?¿·]?|óQ?¯D?$û5?Oó%?xµ?Õa?nÞ>Úéµ>sgŒ>…½C>ù|Ú=›¯Ô¾´«¾#é¾ÿV.¾Ž¬®½Ôih8ræ®=4.><Ø>¡£«>„KÔ>¬Hû>58?ª¾!?ú2?š"A?qÅN?OîZ?Åte?˜Nn?>ku?o½z?:;~?Þ?$¢?!ˆ}?€”y?¥Îs?WAl?²úb? X?€K?‘€=? .?Ax?M« ?Þ²ñ>;.Ê>L¡>ayn> >8Gƒ=ƒƒ®¼y7Ú½ ÚC¾kuŒ¾n÷µ¾…%Þ¾PZ¿[®¿¨ì%¿@6¿¬³D¿¤÷Q¿a³]¿÷Ðg¿=p¿{ív¿©Ê{¿yÑ~¿Dü¿ÞH¿“¸|¿0Px¿»r¿õj¿èa`¿± U¿'H¿fÍ9¿6*¿s¿©¿Bñç¾ë#À¾¥ï–¾ÔBY¾ƒ¾¨¥.½?/=÷>Î)Y>iã–> À>_è>Ð?% ?m*?þÈ9?#H?$U?†f`?Øj?Úr?¡Nx?Ž·|?cH?Vü?Ð~?íÈ{?óêv?·?p?®Óg?”¶]?NûQ?‡­D?€ù5?‡ñ%?‘³?Ò_?1Þ>|åµ>õbŒ>Y´C>ejÚ=QP¯<ƒ½¸ƒ¾·žn¾V^¡¾Þ?ʾ•§ñ¾ï¥ ¿5s¿Z.¿‡=¿é…K¿›X¿¼÷b¿à>l¿±Ìs¿£–y¿u‰}¿§¢¿NÞ¿ú;~¿¹¾z¿mu¿Kn¿„pe¿VéZ¿7ÉN¿Î&A¿“2¿¡Ã!¿G0¿ò7û¾ :Ô¾±¯«¾žä¾ËM.¾y¯½§ð¾8ù®=Ä=.>ÀÜ>¨«>¥2Ô>½Lû>#:?zÀ!?§2?#$A?ÑÆN?:çZ?Îue?rOn?èku?è½z?€;~?,Þ?Þ¢?·}?û“y?ïÍs?q@l?žùb?É X?`ˆK?ÿ~=?V.?jv?X© ?À®ñ>VGÊ>¯G¡>Kpn>Γ>“4ƒ=:ή¼ JÚ½b¤C¾èyŒ¾Ìûµ¾º)Þ¾R\¿B°¿oî%¿£ö5¿*µD¿úøQ¿Œ´]¿õÑg¿P>p¿àév¿Ë{¿²Ñ~¿Kü¿±H¿4¸|¿ŸOx¿-r¿j¿È``¿f U¿ &H¿ÊË9¿w*¿g#¿­¿íç¾—À¾/ë–¾³9Y¾?¾€/½ld/=a>ï2Y>àç–>aÀ>êç>Ì?"?,*?šÊ9?ö$H?p U?ó_`?Êj?r?3Ox?í·|?H?Oü?ÜÑ~?È{?Uêv?é>p?±Òg?jµ]?øùQ?F¶D?Û÷5?Àï%?ª±?Ð]?Ø,Þ>ÿµ>w^Œ>.«C>ÒWÚ=š¯<Â&ƒ½õŒ¾in¾Åb¡¾(Dʾ³«ñ¾ä§ ¿ u¿.¿Ö}=¿T‡K¿Ü X¿Ñøb¿Æ?l¿hÍs¿™“y¿Ç‰}¿Ç¢¿;Þ¿´;~¿A¾z¿flu¿Pn¿zoe¿ èZ¿ÖÇN¿E%A¿å2¿ÑÁ!¿‘;¿à3û¾Ë5Ô¾K««¾ྖD.¾Ü¯½œSö¸­ ¯=øF.>Eá>n¬«>å6Ô>í4û><?IÂ!?U2?«%A?2ÈN?pèZ?¿oe?MPn?’lu?`¾z?Æ;~??Þ?¾¢?²‰}?v“y?8Ís?‹?l?‰øb?‰ X?ö†K?/ˆ=?Ÿ.?“t?c§ ?¢ªñ> CÊ>Ÿa¡>6gn>‘Š>î!ƒ=ñ¯¼¡\Ú½Ž­C¾ _Œ¾)¶¾ï-Þ¾U^¿(²¿6ð%¿Hø5¿k¬D¿PúQ¿·µ]¿òÒg¿?p¿~êv¿È{¿ëÑ~¿Qü¿„H¿Õ·|¿ Ox¿jr¿‹j¿¨_`¿ U¿•$H¿/Ê9¿¸*¿ˆ!¿I¿îèç¾BÀ¾¸æ–¾’0Y¾ûý¾ÂZ/½ý‰.=¥ >Vì–>¶ À>,îç>0?ã#?ê*?5Ì9?j&H?» U?a`?Bj?_r?ÄOx?M¸|?½H?Iü?£Ñ~?ùÊ{?·év?>p?³Ñg??´]?¢øQ?Ç´D?w6?ùí%?į?Í[?£(Þ>ªúµ>¿xŒ>¢C>>EÚ=⺮ô®½Þ—«¸Âž®=-P.>Êå>Õ°«>%;Ô>ÿ8û>Æ0?Ä!?2?3'A?’ÉN?¦éZ?Èpe?OKn?l?u÷b?HX?‹…K?†=?¤%.?»r?n¥ ?„¦ñ>Á>Ê>0]¡>]œn>T>Iƒ=©c¯¼5oÚ½¹¶C¾dŒ¾žæµ¾%2Þ¾W`¿´¿ýñ%¿íù5¿ê­D¿òQ¿â¶]¿ðÓg¿í?p¿ëv¿ É{¿›Ð~¿Wü¿XH¿u·|¿|Nx¿¨r¿™j¿1EY>Íð–> %À>Vòç>,?ï?©*?ÐÍ9?ß'H? U?2b`?4j?ír?VPx?¬¸|?éH?Cü?jÑ~?Ê{?Sív?L=p?¶Ðg?³]?L÷Q?I³D?Óÿ5?aø%?Ý­?ÊY?n$Þ>Möµ>AtŒ>©×C>ª2Ú=+p®< Lƒ½oŸ¾»{n¾DM¡¾W/ʾï³ñ¾Ï« ¿»x¿}.¿ù€=¿t€K¿ÇX¿úúb¿“Al¿ÔÎs¿£”y¿6ˆ}¿,¢¿Þ¿(;~¿P½z¿ku¿_Nn¿te¿ÿíZ¿ÅN¿5"A¿‹2¿2¾!¿µ7¿žGû¾jJÔ¾~¢«¾×¾-2.¾¡á®½C¸A¸`±®=P.>Nê>;µ«>e?Ô>=û>´2?¹!?°2?¼(A?òÊN?ÜêZ?Ñqe?)Ln?Yiu?Q¿z?R<~?fÞ?¢? ‰}?ü•y?­Ðs?¾=l?`öb?X? „K? …=?í#.?äp?y£ ?f¢ñ>w:Ê>ÁX¡>H“n>`·>¤ü‚=`®¯¼ÈÚ½ä¿C¾œhŒ¾ûêµ¾…Þ¾Zb¿öµ¿Åó%¿‘û5¿i¯D¿ÕóQ¿ °]¿îÔg¿»@p¿ºëv¿uÉ{¿ÕÐ~¿2ü¿+H¿·|¿êMx¿år¿§j¿e`¿bU¿¬!H¿ùÆ9¿:*¿É¿Q ¿"ýç¾C0À¾ËÝ–¾PY¾të¾/½§Ô.=³Ü>ÇY>Dõ–>^)À>€öç>( ?Ï?s*?lÏ9?T)H?R U?Rc`?&j?°r?Mx? ¹|?I?<ü?0Ñ~?!Ê{?µìv?Bp?¸Ïg?é±]?öõQ?ʱD?.þ5?™ö%?ö«?ÈW?8 Þ>ïñµ>ÃoŒ>~ÎC>\ŸÚ=t%®<±^ƒ½«¨¾Ñ„n¾³Q¡¾¢3ʾכñ¾Ä­ ¿“z¿4!.¿‹‚=¿ßK¿X¿¨ôb¿yBl¿‹Ïs¿(•y¿‰ˆ}¿L¢¿„Þ¿â:~¿×¼z¿hju¿…Mn¿xse¿ÉìZ¿$ÍN¿¬ A¿Ý2¿c¼!¿Ç5¿ŒCû¾*FÔ¾=¼«¾ŒÒ¾ø(.¾Ï®½!1·ýî=…#.>ßÏ>¢¹«>¥CÔ>#Aû>¢4?Q»!?ß2?D*A?SÌN?ìZ?Ûre?Mn?ju?¼z?˜<~?yÞ?_¢?ºˆ}?w•y?÷Ïs?Cl?Kõb?ÆX?¶‚K?yƒ=?7".?ª{?ƒ¡ ?Hžñ>,6Ê>ST¡>2Šn>$®>»iƒ=ù¯¼\”Ú½ÉC¾mŒ¾Yïµ¾ºÞ¾—V¿Ü·¿Œõ%¿5ý5¿è°D¿+õQ¿8±]¿"Ïg¿ŠAp¿Wìv¿áÉ{¿Ñ~¿9ü¿0I¿¶¶|¿YMx¿#r¿µj¿üc`¿U¿1*H¿]Å9¿{*¿ê¿U ¿øøç¾ï+À¾è÷–¾/Y¾0â¾Âê.½üù.=÷å>èY>&Û–>³-À>ªúç>$ ?®?2*?Æ9?É*H?žU?rd`?j?rr?”Mx?ݶ|?BI?6ü?÷Ð~?µÉ{?ìv?5Ap?„Õg?¾°]? ôQ?K°D?Šü5?Òô%?·?ÅU?Þ>‘íµ>EkŒ>RÅC>ÈŒÚ=žÚ¯cÔ>⟫>æGÔ>5Eû>6? ½!?Œ2?L!A?³ÍN?HíZ?äse?ÞMn?­ju?½z?þ:~?ŒÞ??¢?gˆ}?ò”y?@Ïs?Bl?ûb?…X?KK?ç=? .?Òy?÷¬ ?)šñ>â1Ê>äO¡>n>ç¤>Wƒ=íC®¼ï¦Ú½;ÒC¾˜qŒ¾·óµ¾ð!Þ¾šX¿½¬¿S÷%¿Úþ5¿f²D¿öQ¿c²]¿Ðg¿Ñ "Y>ß–>^À>Ôþç> ??ð*? Ç9?D"H?éU?’e`? j?5r?&Nx?=·|?=H?/ü?¾Ð~?IÉ{?yëv?g@p?†Ôg?“·]?IóQ?Í®D?æú5? ó%?/µ?ˆa?ÎÞ>4éµ>ÇfŒ>'¼C>5zÚ=ç¯l¿Ìs¿2–y¿.‰}¿Œ¢¿^Þ¿6<~¿ ¿z¿iu¿ÐKn¿eqe¿]êZ¿cÊN¿(A¿2¿Ä¸!¿ë1¿h;û¾©=Ô¾p³«¾wè¾ U.¾È©®½-®~88é®=î5.>èØ>I¤«>/Ô>GIû>~8?ï¾!?:2?Õ"A?¥ÅN?}îZ?íte?¸Nn?Wku?½z?D;~?Þ?¢?ˆ}?m”y?ŠÎs?5Al?‰úb?Ú X?àK?V€=?Ë.?ûw?« ?A²ñ>—-Ê>uK¡>xn>ª›>qDƒ=¤Ž®¼>:Ú½fÛC¾vŒ¾øµ¾%&Þ¾œZ¿¤®¿ëì%¿~6¿å³D¿×÷Q¿Ž³]¿Ñg¿ =p¿Zév¿¹Ê{¿Ñ~¿Eü¿×H¿…¸|¿Px¿žr¿Ñj¿½a`¿€ U¿G'H¿)Í9¿ó*¿,¿]¿¤ðç¾F#À¾ûî–¾xAY¾!¾ .½¦D/=ø>++Y>ä–>²À>wæç>?l ?¯*?<É9?¸#H?VU?±f`?üj?÷r?·Nx?œ·|?jH?Uü?„Ð~?ÝÈ{?Ûêv?˜?p?‰Óg?h¶]?ûQ?N­D?Aù5?Dñ%?I³?…_?m0Þ>Öäµ>IbŒ>ü²C>¡gÚ=0E¯<䃽…¾ n¾ÿ^¡¾@ʾ2¨ñ¾:¦ ¿{s¿œ.¿A‡=¿†K¿ËX¿å÷b¿?l¿ÌÌs¿(“y¿‰}¿¬¢¿KÞ¿ð;~¿§¾z¿÷lu¿öJn¿\pe¿'éZ¿ÉN¿“&A¿S2¿\Ã!¿ý/¿V7û¾i9Ô¾ ¯«¾òã¾lL.¾³¯½ÓÊ8Öû®=#?.>mÝ>°¨«>G3Ô>w1û>l:?¿À!?ç2?]$A?ÇN?hçZ?öue?“On?lu?ú½z?Š;~?/Þ?Ú¢?Á‡}?è“y?ÔÍs?O@l?tùb?š X?*ˆK?Ä~=?.?$v? © ?#®ñ>³FÊ>G¡>ñnn>m’>Ì1ƒ=\Ù®¼ÒLÚ½À¥C¾”zŒ¾rüµ¾Z*Þ¾Ÿ\¿Š°¿³î%¿âö5¿cµD¿-ùQ¿¹´]¿Òg¿n>p¿øév¿AÈ{¿»Ñ~¿Lü¿ªH¿&¸|¿‰Ox¿r¿ßj¿``¿4 U¿Ò%H¿Ë9¿4*¿#¿a¿zìç¾òÀ¾„ê–¾W8Y¾Þ¾‡z/½ûi/=Ã>L4Y>Šè–>À>¡êç>€?K"?n*?×Ê9?-%H?¡ U?``?îj?¹r?HOx?ü·|?–H?Nü?ÔÑ~?pÈ{?>êv?Ê>p?‹Òg?=µ]?ÅùQ? ¶D?œ÷5?|ï%?b±?ƒ]?8,Þ>bþµ>Ë]Œ>ЩC> UÚ=xú®<‰)ƒ½U޾êjn¾nc¡¾ÌDʾP¬ñ¾/¨ ¿Su¿R.¿~=¿Š‡K¿ X¿úøb¿é?l¿ƒÍs¿­“y¿‡}¿Ë¢¿8Þ¿ª;~¿/¾z¿Mlu¿ôOn¿Soe¿ñçZ¿¢ÇN¿ %A¿¥2¿ŒÁ!¿G;¿E3û¾)5Ô¾£ª«¾mß¾7C.¾¯½o1ë¸s¯=WH.>ñá>­«>‡7Ô>‰5û>Z<?ŽÂ!?•2?å%A?fÈN?žèZ?çoe?mPn?¬lu?r¾z?Ñ;~?BÞ?º¢?¦‰}?c“y?Ís?h?l?`øb?Y X?À†K?ó‡=?^.?Lt?§ ?ªñ>hBÊ>ö`¡>Ûen>1‰>'ƒ=$¯¼e_Ú½ë®C¾L`Œ¾Ð¶¾.Þ¾¡^¿q²¿zð%¿‡ø5¿¤¬D¿ƒúQ¿ãµ]¿Óg¿=?p¿–êv¿­È{¿kÐ~¿Rü¿~H¿Æ·|¿÷Nx¿Mr¿gj¿}_`¿éU¿^$H¿òÉ9¿u*¿@!¿ý¿Pèç¾À¾æ–¾6/Y¾šü¾2U/½Œ.= >m=Y>í–>[!À>Ëîç>|?*$?-*?rÌ9?¢&H?í U?=a`?fj?|r?ÚOx?[¸|?ÃH?Hü?›Ñ~?èÊ{? év?û=p?Ñg?´]?oøQ?Ž´D?96?µí%?{¯?€[?(Þ>úµ>xŒ>¥ C>zBÚ=Á¯®<.<ƒ½’—¾tn¾~I¡¾Iʾn°ñ¾$ª ¿*w¿.¿£=¿@K¿L X¿úb¿Ï@l¿9Îs¿2”y¿ð‡}¿¢¿$Þ¿c;~¿¶½z¿£ku¿On¿bue¿»æZ¿AÆN¿‚#A¿ø2¿½¿!¿Y9¿Kû¾é0Ô¾<¦«¾éÚ¾:.¾xñ®½²u ¸ˆ¡®=ŒQ.>væ>}±«>Ç;Ô>›9û>1?^Ä!?B2?n'A?ÆÉN?ÔéZ?ðpe?oKn?Vmu?ë¾z?<~?VÞ?š¢?S‰}?m–y?gÌs?‚>l?K÷b?X?U…K?a†=?b%.?ur?#¥ ?ç¥ñ>>Ê>‡\¡>›n>ô>‚ ƒ=Ên¯¼ùqÚ½¸C¾ÊdŒ¾Dçµ¾Å2Þ¾¤`¿X´¿Aò%¿+ú5¿#®D¿²òQ¿·]¿Ôg¿ @p¿3ëv¿É{¿¤Ð~¿-ü¿QH¿g·|¿fNx¿‹r¿uj¿f`¿U¿é"H¿WÈ9¿¶*¿a¿¿­è¾IÀ¾—á–¾&Y¾Vó¾Ý//½â´.=ÑÔ>ŽFY>wñ–>¯%À>õòç>x?7?ì*?Î9?(H?8 U?]b`?Xj? r?kPx?º¸|?ðH?Bü?aÑ~?|Ê{?;ív?-=p?Ðg?ç²]?÷Q?³D?”ÿ5?ø%?•­?~Y?Í#Þ>¦õµ>–sŒ>KÖC>æ/Ú= e®<ÓNƒ½Ï ¾}n¾íM¡¾û/ʾŒ´ñ¾¬ ¿y¿¿.¿5=¿ª€K¿÷X¿#ûb¿µAl¿ïÎs¿·”y¿Bˆ}¿1¢¿•Þ¿;~¿>½z¿ùju¿?Nn¿Yte¿ÑíZ¿áÄN¿ú!A¿K2¿í½!¿k7¿Gû¾ÈIÔ¾Ö¡«¾dÖ¾Î0.¾ÛÞ®½ês+¸&´®=¯.>ûê>㵫>@Ô>¬=û>þ2?ƹ!?ð2?ö(A?'ËN? ëZ?ùqe?JLn?riu?c¿z?]<~?iÞ?z¢?‰}?è•y?’Ðs?œ=l?7öb?×X?êƒK?Ï„=?¬#.?;}?.£ ?É¡ñ>Ó9Ê>X¡>í‘n>¶>Ýù‚=‚¹¯¼„Ú½BÁC¾HiŒ¾¢ëµ¾&Þ¾¦b¿>¶¿ô%¿Ðû5¿¢¯D¿ôQ¿9°]¿Õg¿Ú@p¿Ñëv¿…É{¿ÝÐ~¿3ü¿VI¿·|¿ÕMx¿Èr¿ƒj¿ñd`¿1U¿t!H¿»Æ9¿ø*¿‚¿ ¿ƒü羞/À¾!Ý–¾ôY¾ê¾ˆ /½7Ú.=Þ>#Y>îõ–>*À>÷ç>t ??µ*?©Ï9?Œ)H?„ U?}c`?Jj?Ír?Mx?¹|?I?;ü?(Ñ~?Ê{?ìv?åAp?’Ïg?¼±]?ÃõQ?‘±D?ðý5?Vö%?´¸?{W?˜Þ>Iñµ>oŒ> ÍC>—œÚ=R®‹Ð>Jº«>HDÔ>¾Aû>ì4?–»!?2?*A?‡ÌN?@ìZ?se?$Mn?ju?¢¼z?£<~?|Þ?Z¢?­ˆ}?c•y?ÛÏs?ßBl?"õb?–X?€‚K?>ƒ=?ö!.?d{?¢® ?ªñ>‰5Ê>©S¡>؈n>ì>ôfƒ=9°¼ —Ú½mÊC¾ÅmŒ¾ðµ¾[Þ¾äV¿%¸¿Ðõ%¿tý5¿!±D¿^õQ¿d±]¿GÏg¿¨Ap¿oìv¿ñÉ{¿Ñ~¿9ü¿*I¿6¹|¿CMx¿r¿‘j¿Òc`¿å U¿ù)H¿ Å9¿9*¿£¿ ¿Yøç¾I+À¾>÷–¾ÓY¾Îà¾2å.½Œÿ.=Xç>EY>ÐÛ–>X.À>Iûç>p ?õ?t*?BÆ9?+H?ÏU?d`?<j?r?ªMx?ë¶|?II?5ü?îÐ~?¥É{?ìv?Ap?^Õg?‘°]?môQ?°D?Kü5?Žô%?Ͷ?>c?cÞ>ëìµ>šjŒ>õÃC>ŠÚ=}ϯ<tƒ½H³¾An¾ÊV¡¾8ʾ“ ñ¾š¢ ¿°|¿+#.¿Y„=¿€ƒK¿yX¿åõb¿X=l¿\Ðs¿Á•y¿èˆ}¿p¢¿nÞ¿q<~¿‡¿z¿¤iu¿ŠLn¿Gre¿eëZ¿ËN¿j)A¿ð2¿Oº!¿3¿ß>û¾HAÔ¾.·«¾Oì¾e.¾ ¹®½öþ7aÙ®=..>Õ>Š «>ˆHÔ>ÐEû>Ú6?e½!?Ì2?‡!A?èÍN?víZ? te?ÿMn?Çju?½z? ;~?Þ?:¢?[ˆ}?Þ”y?%Ïs?ùAl?tûb?VX?K?¬=?@ .?Œy?­¬ ?µñ>>1Ê>;O¡>Ân>‡£>OTƒ=O®¼´©Ú½™ÓC¾CrŒ¾]ôµ¾"Þ¾æX¿­¿—÷%¿ÿ5¿Ÿ²D¿´öQ¿²]¿EÐg¿ðf#Y>Gà–>À>sÿç>l ?Ô?3*?ÞÇ9?{"H?U?¼e`?.j?Rr?;Nx?K·|?DH?.ü?µÐ~?8É{?bëv?H@p?`Ôg?f·]?óQ?”®D?§ú5?Çò%?ç´?;a?4Þ>èµ>fŒ>ɺC>pwÚ=Å„¯<ƒ½…¼¾W˜n¾9[¡¾Ú<ʾ±¤ñ¾¤ ¿êq¿á$.¿ë…=¿ê„K¿ºX¿úöb¿>>l¿1Ìs¿F–y¿;‰}¿¢¿[Þ¿+<~¿¿z¿ˆmu¿¯Kn¿>qe¿/êZ¿.ÊN¿á'A¿À2¿¸!¿¡1¿Í:û¾=ԾȲ«¾Êç¾AT.¾§®½CyŠ8þë®=M7.>”Ù>ñ¤«>©/Ô>âIû>È8?4¿!?z2?#A?ÚÅN?¬îZ?ue?ÙNn?qku?“½z?O;~?Þ?¢?ˆ}?Y”y?oÎs?Al?`úb?ª X?ªK?€=?‰.?µw?¸ª ?¤±ñ>YJÊ>ÌJ¡>¬vn>Jš>ªAƒ=Æ™®¼=Ú½ÄÜC¾ÁvŒ¾»øµ¾Æ&Þ¾éZ¿ì®¿/í%¿½6¿´D¿ øQ¿º³]¿CÑg¿¿=p¿qév¿ÉÊ{¿ŠÑ~¿Fü¿ÐH¿w¸|¿Px¿r¿­j¿’a`¿N U¿'H¿ëÌ9¿°*¿å¿¿ð羡"À¾Qî–¾@Y¾À ¾ˆš.½6J/=àù>‡,Y>¾ä–>WÀ>çç>h?³ ?ò*?yÉ9?ð#H?‡U?Üf`? j?r?ÍNx?ª·|?pH?Tü?{Ð~?ÌÈ{?Äêv?z?p?cÓg?;¶]?èúQ?­D?ù5?ñ%?³?9_?Í/Þ>¶>žaŒ>ž±C>ÜdÚ=:¯<«ƒ½y†¾l¡n¾¨_¡¾%AʾϨñ¾…¦ ¿Âs¿Ý.¿}‡=¿U†K¿úX¿øb¿%?l¿èÌs¿;“y¿‰}¿°¢¿HÞ¿å;~¿–¾z¿Þlu¿ÕJn¿5pe¿ùèZ¿ÎÈN¿Y&A¿2¿Ã!¿³/¿»6û¾Ç8Ô¾b®«¾Fã¾ K.¾í¯½5Õ8œþ®=‚@.>Þ>W©«>é3Ô>2û>¶:?Á!?'2?—$A?:ÇN?–çZ?ve?³On?lu? ¾z?•;~?2Þ?Õ¢?µ‡}?Ô“y?¸Ís?,@l?Kùb?j X?ô‡K?ˆ~=?Ó.?Ýu?è ?†­ñ>FÊ>¼d¡>—mn> ‘>/ƒ=}䮼–OÚ½§C¾?{Œ¾ýµ¾û*Þ¾ë\¿Ó°¿öî%¿!÷5¿œµD¿`ùQ¿å´]¿@Òg¿>p¿êv¿QÈ{¿ÃÑ~¿Mü¿¤H¿¸|¿sOx¿ór¿»j¿r``¿ U¿›%H¿PË9¿ò*¿Ø"¿¿Ûëç¾LÀ¾Úé–¾û6Y¾|¾÷t/½‹o/=$>¨5Y>4é–>«À>@ëç>Ì?“"?±*?Ë9?e%H?Ó U?H``?j?Ör?^Ox? ¸|?H?Nü?ËÑ~?`È{?&êv?«>p?eÒg?µ]?’ùQ?ÔµD?^÷5?9ï%?±?6]?—+Þ>»ýµ>æ{Œ>s¨C>IRÚ=Wﮞâ>¾­«>)8Ô>$6û>l/?ÓÂ!?Õ2? &A?›ÈN?ÌèZ?pe?ŽPn?Ålu?„¾z?Û;~?EÞ?µ¢?™‰}?O“y?Ís?F?l?7øb?) X?ІK?·‡=?.?t?ͦ ?h©ñ>ÄAÊ>M`¡>¾¢n>Ї>`ƒ=4/¯¼*bÚ½I°C¾÷`Œ¾v¶¾0/Þ¾î^¿¹²¿¾ð%¿Åø5¿Ý¬D¿¶úQ¿¶]¿>Óg¿\?p¿­êv¿½È{¿sÐ~¿Sü¿wH¿¸·|¿âNx¿0r¿Cj¿R_`¿·U¿&$H¿µÉ9¿3*¿ù ¿±¿±çç¾øÀ¾då–¾Ú-Y¾9û¾¢O/½•.=h >É>Y>«í–>"À>jïç>È?Ÿ?p*?°Ì9?Ú&H? U?ha`?Šj?™r?ðOx?i¸|?ÊH?Gü?’Ñ~?ØÊ{?ˆév?Ý=p?hÑg?æ³]?<øQ?U´D?ú6?qí%?3¯?4[?b'Þ>]ùµ>hwŒ>ÞC>µ?Ú=Ÿ¤®<õ>ƒ½ò˜¾[un¾'J¡¾ºIʾ ±ñ¾oª ¿pw¿J.¿ß=¿vK¿| X¿8úb¿ñ@l¿TÎs¿F”y¿ü‡}¿¢¿"Þ¿Y;~¿¤½z¿‰ku¿ùNn¿;ue¿æZ¿ ÆN¿H#A¿¸2¿x¿!¿9¿yJû¾G0Ô¾”¥«¾<Ú¾£8.¾²î®½†S•¸N¤®=ëR.>"ç>$²«>i<Ô>6:û>Z1?<¸!?‚2?¨'A?ûÉN?êZ?qe?Kn?omu?ý¾z?!<~?XÞ?•¢?G‰}?Y–y?LÌs?`>l?"÷b?èX?…K?&†=?!%.?/r?ؤ ?J¥ñ>z=Ê>Þ[¡>©™n>ݽ>» ƒ=ìy¯¼½tÚ½t¹C¾ueŒ¾ëçµ¾e3Þ¾ñ`¿ ´¿…ò%¿jú5¿\®D¿åòQ¿;·]¿<Ôg¿*@p¿Këv¿)É{¿­Ð~¿.ü¿JH¿Y·|¿PNx¿nr¿Qj¿æe`¿lU¿±"H¿È9¿t*¿¿µ ¿辤À¾íà–¾¹$Y¾õñ¾M*/½qº.=2Ö>êGY>"ò–>T&À>”óç>Ä?~?9 *?KÎ9?N(H?j U?ˆb`?|j?'r?Px?ɸ|?öH?Aü?YÑ~?lÊ{?$ív?=p?jÐg?»²]?æöQ?ײD?Vÿ5?Ù÷%?L­?1Y?-#Þ>õµ>êrŒ>îÔC>f¬Ú=èY®<šQƒ½/¢¾p~n¾–N¡¾Ÿ0ʾ)µñ¾d¬ ¿Hy¿ .¿q=¿à€K¿'X¿Lûb¿×Al¿ Ïs¿Ë”y¿Oˆ}¿5¢¿’Þ¿;~¿,½z¿ßju¿Nn¿2te¿£íZ¿¬ÄN¿À!A¿ 2¿¨½!¿"7¿gFû¾&IÔ¾.¡«¾¸Õ¾o/.¾Ü®½‘/¸ì¶®=.>§ë>‹¶«>ª@Ô>H>û>H3? º!?±2?1)A?[ËN?8ëZ? re?jLn?Œiu?u¿z?g<~?lÞ?u¢?ôˆ}?Ô•y?wÐs?y=l?öb?§X?´ƒK?”„=?k#.?õ|?㢠?,¡ñ>/9Ê>oW¡>“n> ´>Òvƒ=£Ä¯¼Q‡Ú½ ÂC¾óiŒ¾Iìµ¾ÆÞ¾ób¿‡¶¿Lô%¿ü5¿Û¯D¿;ôQ¿f°]¿9Õg¿ù@p¿éëv¿•É{¿æÐ~¿4ü¿PI¿ù¶|¿¿Mx¿«r¿_j¿Æd`¿ÿU¿=!H¿~Æ9¿µ*¿;¿¹ ¿äûç¾ù.À¾vÜ–¾˜Y¾±è¾ø/½Çß.=vß>€Y>˜ö–>¨*À>¾÷ç>¿ ?]?ø*?äÄ9?Ã)H?µ U?¨c`?nj?êr?.Mx?(¹|?#I?:ü?Ñ~?Ê{?†ìv?ÆAp?lÏg?±]?õQ?X±D?±ý5?ö%?l¸?/W?÷Þ>¢ðµ>lnŒ>ÂËC>Ó™Ú=°7Ñ>ñº«>êDÔ>ZBû>65?Û»!?_2?9 A?¼ÌN?nìZ?*se?EMn?6ju?´¼z?­<~?Þ?U¢?¡ˆ}?O•y?ÀÏs?½Bl?ùôb?gX?J‚K?ƒ=?µ!.?{?W® ? ñ>å4Ê>S¡>}‡n>c«>-dƒ=Z°¼å™Ú½ËËC¾qnŒ¾¦ðµ¾ûÞ¾0W¿m¸¿ö%¿³ý5¿Z±D¿‘õQ¿‘±]¿mÏg¿ÇAp¿†ìv¿Ê{¿Ñ~¿:ü¿#I¿(¹|¿-Mx¿ér¿mj¿§c`¿´ U¿Â)H¿ãÄ9¿ö*¿\¿¾ ¿º÷群*À¾”ö–¾wY¾mß¾£ß.½/=ºè>¡Y>{Ü–>ý.À>èûç>» ?=?·*?€Æ9?>!H?U?Èd`?`j?¬r?¿Mx?ú¶|?PI?4ü?æÐ~?”É{?èëv?ø@p?8Õg?e°]?:ôQ?Ù¯D? ü5?Kô%?…¶?ñb?ÂÞ>Dìµ>ïiŒ>—ÂC>?‡Ú=[į<ävƒ½©´¾œn¾sW¡¾49ʾ0¡ñ¾å¢ ¿÷|¿l#.¿•„=¿¶ƒK¿©X¿öb¿z=l¿wÐs¿Õ•y¿ôˆ}¿u¢¿kÞ¿g<~¿u¿z¿‹iu¿iLn¿re¿7ëZ¿ZËN¿/)A¿°2¿ º!¿F3¿D>û¾¥@Ô¾‡¶«¾£ë¾.¾Ú¶®½c¿8'Ü®=x/.>¼Õ>2¡«>*IÔ>kFû>$7?ª½!? 2?Á!A?®ÄN?¤íZ?3te?Nn?àju?,½z?;~?’Þ?5¢?Nˆ}?Ê”y? Ïs?ÖAl?Kûb?&X?߀K?p=?þ.?Fy?b¬ ?%µñ>š0Ê>’N¡>g~n>&¢>ˆQƒ=0Z®¼x¬Ú½÷ÔC¾ïrŒ¾õµ¾1#Þ¾3Y¿N­¿Û÷%¿Wÿ5¿Ø²D¿çöQ¿¼²]¿kÐg¿=p¿$ív¿mÊ{¿YÑ~¿Aü¿öH¿È¸|¿€Px¿&r¿{j¿‡b`¿h U¿M(H¿IÎ9¿7 *¿|¿Â¿óç¾P&À¾ò–¾áGY¾)Ö¾Mº.½q*/=þñ>Â$Y>ñà–>¨À>è>· ??v*?È9?³"H?mU?çe`?Rj?or?QNx?Y·|?JH?.ü?¬Ð~?(É{?Jëv?)@p?;Ôg?:·]?äòQ?[®D?hú5?ƒò%?ž´?ï`?a3Þ>ççµ>qeŒ>l¹C>¬tÚ=¤y¯<Í ƒ½å½¾±™n¾â[¡¾~=ʾN¥ñ¾Ú¤ ¿0r¿#%.¿'†=¿ …K¿éX¿#÷b¿a>l¿LÌs¿Z–y¿G‰}¿•¢¿XÞ¿!<~¿ü¾z¿nmu¿Kn¿qe¿êZ¿úÉN¿§'A¿€2¿:¸!¿X1¿2:û¾e<Ô¾ ²«¾ç¾âR.¾<¤®½o›•8Äî®=¬8.>AÚ>™¥«>K0Ô>}Jû>9?z¿!?º2?J#A?ÆN?ŽæZ?¶IÊ>#J¡>Run>ê˜>ã>ƒ=礮¼Ç?Ú½"ÞC¾mwŒ¾bùµ¾f'Þ¾6[¿5¯¿sí%¿ü6¿W´D¿=øQ¿ç³]¿iÑg¿Ý=p¿‰év¿ÙÊ{¿’Ñ~¿Gü¿ÊH¿i¸|¿ïOx¿˜r¿‰j¿ga`¿ U¿Ø&H¿®Ì9¿n*¿¿Æ¿fïç¾ü!À¾§í–¾À>Y¾_ ¾ø”.½ÆO/=Aû>ã-Y>hå–>üÀ>µçç>³?û ?4*?¶É9?($H?¸U?S_`?Dj?1r?âNx?¹·|?wH?Sü?sÐ~?¼È{?¬êv?[?p?=Óg?¶]?µúQ?ܬD?Äø5?¼ð%?¸²?ì^?,/Þ>r¶>ó`Œ>@°C>bÚ=í.¯ÅÞ>ÿ©«>‹4Ô>­2û>ÿ:?IÁ!?g2?Ò$A?oÇN?ÄçZ?,oe?ÔOn?4lu?¾z?Ÿ;~?5Þ?Т?©‡}?À“y?Ís? @l?"ùb?: X?¾‡K?L~=?’.?—u?x¨ ?é¬ñ>kEÊ>d¡>­>>,ƒ=Ÿï®¼[RÚ½{¨C¾ê{Œ¾¿ýµ¾›+Þ¾8]¿±¿:ï%¿_÷5¿ÕµD¿“ùQ¿µ]¿fÒg¿¬>p¿'êv¿aÈ{¿ÌÑ~¿Nü¿H¿ ¸|¿^Ox¿Ör¿j¿G``¿Ñ U¿c%H¿Ë9¿¯*¿‘"¿Ê¿<ëç¾§À¾0é–¾Ÿ5Y¾¾go/½u/=…>7Y>ßé–>QÀ>ßëç>?Ú"?ó*?QË9?œ%H? U?s``?¼j?ór?tOx?¸|?¤H?Mü?ÃÑ~?PÈ{?êv?Œ>p??Òg?ä´]?_ùQ?›µD?÷5?õî%?Ѱ?ê\?÷*Þ>ýµ>;{Œ>§C>„OÚ=5ä®</ƒ½‘¾Ÿmn¾Àd¡¾FÊ¾Š­ñ¾Ä¨ ¿ßu¿Õ.¿‰~=¿ö‡K¿k X¿Lùb¿-@l¿¹Ís¿Ô“y¿µ‡}¿Õ¢¿2Þ¿•;~¿ ¾z¿lu¿³On¿ve¿•çZ¿9ÇN¿–$A¿&2¿Á!¿|-¿2û¾å3Ô¾S©«¾Þ¾y@.¾Šþ®½íÔ¸w”®= .>VÄ>‹Ì«>êUÔ>¡Rû>í<?Ã!?2?Z&A?ÏÈN?úèZ?6pe?ÖJn?Qhu?\»z?:~?ËÞ?Õ¡?V‡}?;“y?çÌs?$?l?øb?ùX?T†K?|‡=?–&.?]€?ë³ ?”Œñ>»#Ê>EA¡>&cn>p†>™ƒ=V:¯¼îdÚ½§±C¾¢aŒ¾4äµ¾üÞ¾uQ¿û¥¿0ý%¿E6¿T·D¿éúQ¿<¶]¿dÓg¿z?p¿Åêv¿ÍÈ{¿|Ð~¿(ü¿¢I¿7º|¿çJx¿ßr¿¥j¿'_`¿†U¿ï#H¿wÉ9¿ð*¿² ¿f¿™è¾ü6À¾M—¾ kY¾^º¾NJ.½pš/=É >%@Y>Uî–>¥"À> ðç>?æ?½ *?ëÁ9?H?.U?Fi`?(j?¶r?Px?w¸|?ÐH?Fü?‰Ñ~?ÈÊ{?ªív?DCp? Øg?¹»]?áîQ?ß©D?{õ5?-í%?ê®?çZ?Â&Þ>·øµ>½vŒ>»ÜC>6¼Ú=`™°<ÿÁ‚½›Ù¾ò´n¾/i¡¾^Jʾ¨±ñ¾¹ª ¿·w¿‹.¿€=¿¬K¿X¿úòb¿ê:l¿ŽÉs¿è—y¿?Š}¿õ¢¿Þ¿O;~¿’½z¿pku¿ØNn¿ue¿ªîZ¿GÏN¿Ž-A¿ö"2¿Ì²!¿Ž+¿ü-û¾¥/Ô¾í¤«¾Ù¾D7.¾ì뮽Z1Џ§®=9.>ÚÈ>¦”«>*ZÔ>³Vû>Û>?èÄ!?Â2?ã'A?0ÊN?0êZ??qe?°Kn?ûhu?Ô»z?K:~?ØÝ?µ¡?‡}?¶’y?1Ìs?=>l?ùöb?¸X?é„K?ê…=?à$.?†~?ö± ?ãÀñ>pÊ>Ö<¡>Zn>3}>ôƒ= …¯¼‚wÚ½ÒºC¾ fŒ¾‘èµ¾1Þ¾xS¿â§¿šæ%¿é6¿Ó¸D¿?üQ¿g·]¿aÔg¿I@p¿bëv¿9É{¿µÐ~¿/ü¿vI¿Ø¹|¿Rx¿r¿³j¿^`¿:U¿z"H¿ÜÇ9¿1*¿Ò¿j ¿oÿ羨2À¾×þ–¾èaY¾ 0¾ù$.½Å¿/= >FIY>Ìò–>ù&À>3ôç>?Æ?| *?†Ã9?ŒH?¼U?fj`?j?xr?—Px?׸|?ýH?@ü?PÑ~?\Ê{? ív?vBp?×g?Žº]?ÚÿQ?`¨D?Öó5?fë%?­?äX?Œ"Þ>Yôµ>?rŒ>ÓC>¢©Ú=¨N°<¤Ô‚½Fd¾¾n¾m¡¾¨NʾƵñ¾®¬ ¿Žy¿A .¿­=¿K¿WX¿ôb¿Ð;l¿DÊs¿m˜y¿’Š}¿£¿ Þ¿;~¿½z¿Æju¿þMn¿ te¿uíZ¿æÍN¿,A¿I!2¿ÊÉ!¿ )¿ê)û¾d+Ô¾† «¾ Õ¾..¾OÙ®½rÖý·²¹®=n.>_Í> ™«>,$Ô>ÄZû>É@?·Æ!?o2?k)A?ËN?fëZ?Hre?‹Ln?¥iu?M¼z?‘:~?ëÝ?K£?°†}?1’y?zËs?W=l?äõb?xX?~ƒK?X„=?*#.?¯|?° ?ļñ>ñUÊ>g8¡>ûPn>ös>Oô‚=Åϯ¼ŠÚ½þÃC¾žjŒ¾ïìµ¾gÞ¾{U¿É©¿aè%¿ ñ5¿QºD¿•ýQ¿’¸]¿_Õg¿Ap¿ìv¿¥É{¿ïÐ~¿5ü¿II¿y¹|¿Qx¿Âr¿Áj¿è\`¿ïU¿!H¿AÆ9¿r*¿ó¿n ¿Eûç¾S.À¾`ú–¾ÇXY¾É&¾,ÿ/½å/=Q >gRY>B÷–>N+À>]øç> ?¥?:*?!Å9? H?U?\`? j?;r?(Qx?6¹|?*I?9ü?Ñ~?ðÉ{?nìv?§Ap?Ög?c¹]?„þQ?\»D?2ò5?Ÿé%?«?âV?WÞ>ûïµ>ÁmŒ>eÊC>—Ú=ñ°äÑ>s«>m(Ô>'û>·B?†È!? 2?ó*A?ðÌN?œìZ?Qse?eMn?Oju?Ƽz?×:~?þÝ?+£?ÌŠ}?«‘y?ÄÊs?q§QÊ>¶p¡>åGn>ºj>©á‚=|°¼©œÚ½)ÍC¾oŒ¾Mñµ¾œÞ¾}W¿°«¿(ê%¿°ò5¿U§D¿ëþQ¿½¹]¿]Ög¿æAp¿žìv¿Ê{¿(Ñ~¿;ü¿I¿¹|¿üPx¿r¿Ãj¿È[`¿£U¿H¿¥Ä9¿´*¿¿r ¿÷ç¾ÿ)À¾êõ–¾¦OY¾…¾×Ù/½ç .=”)>ˆ[Y>¹û–>¢/À>‡üç> ?„?ù*?½Æ9?u!H?SU?>]`? j?ýr?¹Qx?•¹|?VI?3ü?ÝÐ~?„É{?Ñëv?Ù@p?Õg?8¸]?.ýQ?Þ¹D?6?Øç%?6©?ßT?"Þ>žëµ>CiŒ>9ÁC>{„Ú=:¹¯<ïù‚½Àv¾¸Sn¾¾9¡¾=Wʾ¾ñ¾™° ¿=}¿®#.¿Ñ„=¿ìƒK¿ØX¿8öb¿=l¿±Ës¿Y’y¿É†}¿T£¿åÝ¿|:~¿)¼z¿riu¿ILn¿øqe¿ ëZ¿&ËN¿õ(A¿î2¿+Æ!¿4@¿ŠYû¾ä"Ô¾¹—«¾̾¦.¾´®½¼,8íÞ®=×0.>hÖ>Ú¡«>­,Ô>%+û>5*?VÊ!?Ê!2?|,A?QÎN?ÒíZ?Zte?@Nn?ùju?>½z?;~?Þ? £?yŠ}?E˜y? Ês?Š;l?»ób?öX?©€K?4=?½.?y?¬ ?ˆ´ñ>]MÊ>Gl¡>J»n>}a>Ï‚=3e°¼=¯Ú½TÖC¾šsŒ¾ªõµ¾Ñ#Þ¾€Y¿–­¿ðë%¿Uô5¿Ó¨D¿òíQ¿èº]¿Z×g¿´Bp¿<ív¿}Ê{¿aÑ~¿Bü¿ðH¿º¸|¿kPx¿>r¿Ñj¿j`¿XU¿H¿ Ã9¿õ *¿5¿v¿ñò羫%À¾sñ–¾…FY¾A¾‚´/½<0.=å³>©dY>/—>ö3À>±è>?c?¸*?XÈ9?ê"H?žU?^^`?üj?Wr?KRx?õ¹|?ƒI?-ü?¤Ð~?É{?3ëv? @p?Ôg? ·]?ØûQ?_¸D?j6?nþ%?O§?ÝR?ìÞ>@çµ>ÅdŒ>¸C>çqÚ=‚n¯<” ƒ½ý¾Î\n¾,>¡¾¼ ʾ!Âñ¾Ž² ¿¿d%.¿c†=¿V…K¿X¿L÷b¿ƒ>l¿hÌs¿Þ’y¿‡}¿¿¡¿ÒÝ¿6:~¿°»z¿Èhu¿nKn¿ïpe¿ÓéZ¿ÅÉN¿l'A¿@2¿\Ä!¿F>¿xUû¾âXÔ¾R“«¾}Ǿr.¾v¡®½›½ 8Šñ®= :.>íÚ>A¦«>í0Ô>7/û>#,?W³!?x#2?.A?±ÏN?ïZ?cue?On?£ku?·½z?d;~?%Þ?ë¢?&Š}?À—y?Ós?¤:l?§òb?µX?>K?¢=?.?(w?"ª ?j°ñ>IÊ>Øg¡>4²n>ÒÖ>_¼‚=믰¼ÐÁÚ½€ßC¾xŒ¾úµ¾(Þ¾‚[¿}¯¿·í%¿úõ5¿RªD¿HïQ¿¬]¿XØg¿ƒCp¿Ùív¿éÊ{¿›Ñ~¿Hü¿ÃH¿[¸|¿ÙOx¿{r¿ßj¿ðh`¿ÊU¿¦H¿oÁ9¿6 *¿V¿z¿Çîç¾W!À¾üì–¾d=Y¾ý ¾-/½‘U.=)½>³ðX>¦—>J8À>Ûè>ÿ?B!?w*?óÉ9?_$H?êU?~_`?îj?r?Kx?Tº|?°I?&ü?jÐ~?¬È{?•êv?ââµ>G`Œ>ã®C>S_Ú=Ë#¯<9ƒ½9‰¾äen¾›B¡¾%ʾÒñ¾ƒ´ ¿ë€¿'.¿õ‡=¿Á†K¿Z X¿aøb¿i?l¿Ís¿c“y¿o‡}¿ß¡¿ÅÞ¿ï9~¿7»z¿hu¿”Jn¿æoe¿èZ¿eÈN¿ä%A¿“2¿ŒÂ!¿X<¿fQû¾¢TÔ¾7Ë«¾ù¾= .¾ÙŽ®½Xyë8(¯=@C.>rß>§ª«>-5Ô>H3û>.?'µ!?(2?Œ/A?ÑN?>ðZ?lve?ôOn?Nlu?/¾z?ª;~?8Þ?Ë¢?Ó‰}?;—y?cÒs?Fl?’ñb?tX?Ó}K?~=?P.?Qu?-¨ ?L¬ñ>ÈDÊ>ic¡>©n>•Í>3©ƒ=¢ú°¼dÔÚ½«èC¾–|Œ¾fþµ¾<,Þ¾…]¿d±¿~ï%¿ž÷5¿Ñ«D¿ŸðQ¿>­]¿ÂËg¿QDp¿wîv¿UË{¿ÔÑ~¿Oü¿–H¿û·|¿HOx¿¹r¿íj¿Ðg`¿U¿%/H¿Ó¿9¿w *¿w¿~¿êç¾À¾†è–¾C4Y¾º¾Øi/½çz.=mÆ>ÕùX>ôË–>Ÿ<À> è>û?!#?6*?Ë9?Ô%H?5 U?ž``?àj?Ür?¥Kx?˜µ|?ÜI? ü?1Ð~?@È{?÷év?n>p?Òg?·´]?,ùQ?bµD?!6?àú%?޽?×N? Þ>…Þµ>Ê[Œ>·¥C>ÀLÚ=Ù®<Þ1ƒ½v’¾únn¾ G¡¾Q)ʾñ‘ñ¾¦› ¿Ã‚¿Ð(.¿‡‰=¿,ˆK¿› X¿uùb¿O@l¿ÔÍs¿è“y¿Â‡}¿ÿ¡¿²Þ¿j=~¿¿ºz¿sgu¿¹In¿Üne¿gçZ¿ÇN¿\$A¿æ2¿½À!¿j:¿UMû¾bPÔ¾ÑÆ«¾\ü¾.¾;|®½‹9ů=uL.>öã>¯«>m9Ô>Z7û>ÿ/?ö¶!?Ö2?A?rÒN?tñZ?uwe?ÏPn?ølu?¨¾z?ð;~?KÞ?«¢?‰}?¶–y?­Ñs?+El?Jÿb?3X?i|K?~|=?š.?zs?8¦ ?.¨ñ>}@Ê>û^¡>  n>YÄ>Ž–ƒ=•E­¼÷æÚ½ÖñC¾Œ¾Ã¶¾q0Þ¾‡_¿J³¿Eñ%¿Cù5¿O­D¿õñQ¿i®]¿ÀÌg¿:p¿ïv¿ÁË{¿ Ò~¿Uü¿jH¿œ·|¿¶Nx¿ör¿ûj¿°f`¿3U¿±-H¿<Ô9¿¸*¿—¿‚¿sæç¾®À¾ä–¾"+Y¾vø¾‚D/½< .=±Ï>öY>kЖ> À>. è>÷?%?õ*?*Í9?I'H? U?¾a`?Òj?Ÿr?6Lx?øµ|?¥G?ü?÷Ï~?ÔÇ{?Yév?Ÿ=p?Ñg?Œ³]?Ö÷Q?ã³D?}6?ù%?¨»?_h?L Þ>'Úµ>LWŒ>ŒœC>,:Ú=\Ž®<ƒDƒ½³›¾xn¾yK¡¾›-ʾ–ñ¾› ¿_k¿‡*.¿‹=¿–‰K¿Û X¿Šúb¿6Al¿‹Îs¿m”y¿ˆ}¿¢¿ŸÞ¿$=~¿ºÀz¿Éfu¿ßHn¿Óme¿1æZ¿¤ÅN¿Ó"A¿82¿î¾!¿|8¿CIû¾"LÔ¾j«¾Ø÷¾öt.¾ži®½ix@9c)¯=©U.>{è>t³«>®=Ô>l;û>í1?Ƹ!?„2?A?õÀN?©òZ?xe?©Qn?¢mu? ¿z?6<~?^Þ?Œ¢?.‰}?1–y?öÐs?EDl?6þb?X?þzK?ìz=?ä.?¢q?C¤ ?¤ñ>3<Ê>ŒZ¡>ô–n>»>郃=M­¼ûÙ½ûC¾‘…Œ¾!¶¾¦4Þ¾Ša¿1µ¿ ó%¿çú5¿Î®D¿KóQ¿”¯]¿½Íg¿á:p¿@çv¿-Ì{¿GÒ~¿[ü¿=H¿<·|¿%Nx¿4r¿ j¿e`¿èU¿<,H¿ Ò9¿ä*¿¸¿†ÿ¿Iâç¾YÀ¾™ß–¾"Y¾2ï¾-/½‘Å.=õØ> Y>âÔ–>õ À>JØç>ò?ß&?³*?ÅÎ9?½(H?Ì U?Þb`?Äj?ar?ÈLx?W¶|?ÑG?jü?¾Ï~?hÇ{?»èv?ÑÞ>ÉÕµ>ÎRŒ>`“C>˜'Ú=¥C®<(Wƒ½ð¤¾%n¾èO¡¾æ1ʾ-šñ¾Ÿ ¿7m¿È.¿ªŒ=¿‹K¿ X¿žûb¿Bl¿AÏs¿ò”y¿gˆ}¿?¢¿ŒÞ¿Þ<~¿BÀz¿:ou¿Hn¿Êle¿ûäZ¿CÄN¿K!A¿‹2¿½!¿6¿1Eû¾áGÔ¾¾«¾Só¾Âk.¾V¯½HÖe9<¯=Þ^.>í>Û·«>îAÔ>~?û>Û3?•º!?12?%A?VÂN?IãZ?ˆye?ƒRn?Lnu?™¿z?|<~?qÞ?l¢?Ûˆ}?¬•y?@Ðs?^Cl?"ýb?ÝX?ýŒK?Zy=?-.?Ëo?N¢ ?òŸñ>è7Ê>V¡>Þn>ß±>Dqƒ=Û­¼• Ú½‰†C¾ŠŒ¾ ¶¾Ü8Þ¾Œc¿·¿Ôô%¿Œü5¿M°D¿¡ôQ¿¿°]¿»Îg¿¯;p¿Þçv¿ÑÆ{¿€Ò~¿aü¿H¿Ý¶|¿“Mx¿qr¿j¿qd`¿U¿Ç*H¿Ñ9¿%*¿~)¿Šý¿Þç¾À¾"Û–¾àY¾î徨ù.½æê.=9â>8Y>XÙ–>IÀ>tÜç>¿ü?¿(?r*?aÐ9?2*H?U?ýc`?¶j?$r?YMx?·¶|?þG?dü?—Ò~?üÆ{?èv?> ¶>PNŒ>5ŠC>Ú=íø­<Íiƒ½-®¾;Šn¾WT¡¾06ʾKžñ¾…¡ ¿o¿~.¿¹x=¿lŒK¿]X¿³üb¿Cl¿÷Ïs¿w•y¿ºˆ}¿_¢¿yÞ¿˜<~¿É¿z¿nu¿ÛRn¿Áke¿ÅãZ¿ãÂN¿ÂA¿Ý2¿O»!¿¡4¿Aû¾¡CÔ¾ž¹«¾Ïî¾b.¾tC¯½ÙËt¹N¯=h.>„ñ>A¼«>.FÔ>Cû>É5?e¼!?ß2?® A?¶ÃN?äZ?`le?^Sn?önu?Àz?Â<~?„Þ?L¢?ˆˆ}?'•y?ŠÏs?xBl? üb? X?’‹K?K=?w.?óm?Y  ?Ó›ñ>ž3Ê>®Q¡>È„n>¢¨>Ÿ^ƒ=»%®¼( Ú½µC¾QŒ¾Ü¶¾=Þ¾e¿þ¸¿›ö%¿0þ5¿Ì±D¿÷õQ¿ê±]¿¹Ïg¿~YY>ÏÝ–>žÀ>žàç>»þ?ø?1*?üÑ9?§+H?cU?e`?¨j?ær?ëMx?·|?+H?^ü?^Ò~?XÌ{?çv?3;p?#Îg? °]?ÔóQ?g¯D?û5?Ãó%?ôµ?Xb?V6Þ>à¶>^‡Œ> C>qÚ=6®­ ö>§À«>nJÔ>¢Gû>·7?4¾!?Œ2?6"A?ÅN?µåZ?ime?‡Hn? ou?ŠÀz?=~?—Þ?,¢?6ˆ}?¢”y?ÔÎs?’Al?ùúb?\ X?(ŠK?¹‹=?6+.?l?dž ?µ—ñ>S/Ê>?M¡>³{n>fŸ>úKƒ=sp®¼¼2Ú½à˜C¾UŒ¾gص¾FAÞ¾‘g¿åº¿bø%¿Õÿ5¿J³D¿M÷Q¿³]¿¶Ðg¿L=p¿év¿©Ç{¿àÏ~¿ü¿·G¿¶|¿pLx¿ìr¿3j¿1b`¿ U¿Þ'H¿ÏÍ9¿¨*¿À%¿Â¿Ùè¾\À¾5Ò–¾Y¾fÓ¾.¯.½5/=Àô>z'Y>Fâ–>òÀ>Èäç>·?Ø?ð*?—Ó9?-H?¯U?=f`?šj?©r?|Nx?v·|?XH?Wü?$Ò~?ìË{?Tïv?e:p?%Íg?á®]?~òQ?é­D?ëù5?üñ%? ´?U`? 2Þ>ƒ¶>à‚Œ>‚õC>ÝïÙ=c­<ƒ½¦À¾fœn¾4]¡¾Å>ʾˆ¦ñ¾p¥ ¿½r¿ë.¿Ý{=¿×{K¿³ÿW¿Üþb¿ÏDl¿dÑs¿–y¿`‰}¿Ÿ¢¿SÞ¿ <~¿Ø¾z¿ú>Å«>®NÔ>´Kû>¥9?À!?:2?¾#A?wÆN?ëæZ?rne?bIn?/gu?Áz?N=~?«Þ? ¢?ã‡}?”y?Îs?¬@l?äùb? X?½ˆK?(Š=?€).?ƒ?oœ ?—“ñ> +Ê>ÑH¡>rn>)–>U9ƒ=*»®¼PEÚ½ ¢C¾ýYŒ¾Åܵ¾Ò Þ¾”i¿Ì¼¿)ú%¿y6¿É´D¿£øQ¿@´]¿´Ñg¿>p¿¸év¿È{¿Ð~¿ü¿îI¿¾µ|¿ßKx¿*r¿Aj¿a`¿º U¿i&H¿3Ì9¿é*¿á#¿Æ¿¯ è¾Z>À¾¾Í–¾|ýX¾#ʾى.½åZ/=þ>›0Y>¼æ–>FÀ>òèç>³?·?Ä*?2Õ9?.H?úU?]g`?Œj?kr?Ox?Õ·|?„H?Qü?ëÑ~?€Ë{?¶îv?¤Dp?(Ìg?¶­]?'ñQ?j¬D?Fø5?4ð%?'²?S^?ë-Þ>%¶>b~Œ>WìC>ÔÛÚ=Ç­<½¡ƒ½ãɾ|¥n¾£a¡¾Cʾ¦ªñ¾e§ ¿”t¿¡.¿o}=¿B}K¿ôX¿#ñb¿µEl¿Òs¿—y¿²‰}¿¿¢¿?Þ¿Æ;~¿`¾z¿’lu¿LPn¿×ve¿ºðZ¿ŸÑN¿)A¿Ô2¿àµ!¿×.¿ê4û¾á6Ô¾j¬«¾Aá¾ïF.¾› ¯½>²¹e‡®=Ž.>*Á>tÉ«>îRÔ>ÅOû>“;?ÓÁ!?ç2?G%A?ØÇN?!èZ?{oe?¾&Ê>bD¡>‡in>ìŒ>°&ƒ=⯼äWÚ½7«C¾{^Œ¾#áµ¾Þ¾ P¿²¾¿ñû%¿6¿G¶D¿ùùQ¿kµ]¿²Òg¿é>p¿Vêv¿È{¿SÐ~¿$ü¿ÁI¿zº|¿MKx¿gr¿Oj¿ñ_`¿o U¿ô$H¿˜Ê9¿**¿"¿Ê¿…è¾:À¾o—¾[ôX¾ßÀ¾„d.½;€/=H>¼9Y>3ë–>›À>íç>¯?–?ƒ *?ÊÀ9?0H?FU?|h`?~j?-r?ŸOx?4¸|?±H?Kü?²Ñ~?Ë{?îv?ÕCp?½Øg?‹¬]?ÑïQ?ëªD?¢ö5?mî%?@°?P\?¶)Þ>Çûµ>äyŒ>+ãC>@ÉÚ=ÔͰÐN¿¡.A¿' 2¿´!¿è,¿Ø0û¾¡2Ô¾¨«¾¼Ü¾»=.¾þø®½¾¨¾¸š®=Â.>®Å>‘«>.WÔ>×Sû>=?¢Ã!?•2?Ï&A?8ÉN?WéZ?…pe?Kn?ƒhu?€»z?:~?ÑÞ?Ì¡?=‡}?“y?±Ìs?ß>l?»÷b?šX?è…K?‡=?&.?Ñ?V³ ?ÆÃñ>s"Ê>ó?¡>q`n>¯ƒ> ƒ=™P¯¼wjÚ½b´C¾ùbŒ¾åµ¾=Þ¾R¿¦¿¸ý%¿Â6¿Æ·D¿OûQ¿–¶]¿¯Óg¿¸?p¿ôêv¿íÈ{¿Ð~¿*ü¿•I¿º|¿…Rx¿¥r¿]j¿Ò^`¿#U¿€#H¿ýÈ9¿k*¿# ¿Î¿[è¾²5À¾ù—¾PhY¾›·¾.?.½¥/=Œ>ÝBY>ªï–>ï#À>Fñç>«?u?B *?eÂ9?†H?‘U?œi`?pj?ðr?1Px?”¸|?ÞH?Dü?xÑ~?¨Ê{?{ív?Cp?À×g?`»]?{îQ?m©D?ýô5?¦ì%?Y®?NZ?%Þ>j÷µ>fuŒ>ÚC>­¶Ú=ƒ°<Ç‚½\ܾ§·n¾j¡¾¥Kʾâ²ñ¾O« ¿Cx¿.¿“€=¿€K¿vX¿Lób¿.;l¿ÄÉs¿˜y¿XŠ}¿þ¢¿Þ¿:;~¿o½z¿=ku¿—Nn¿Äte¿NîZ¿ÞÎN¿-A¿v"2¿A²!¿ú*¿Æ,û¾`.Ô¾£«¾7ؾ†4.¾a殽Úg¸ ¬®=÷.>3Ê>ö•«>0!Ô>éWû>o??rÅ!?B2?X(A?™ÊN?êZ?Žqe?ñKn?.iu?ø»z?`:~?ÝÝ?¬¡?ê†}?Ž’y?úËs?ù=l?§öb?YX?}„K?r…=?]$.?ù}?a± ?¨¿ñ>õXÊ>„;¡>\Wn>sz>fƒ=P›¯¼ }Ú½Ž½C¾wgŒ¾Þéµ¾rÞ¾T¿s¨¿!ç%¿f6¿E¹D¿¥üQ¿À·]¿­Ôg¿†@p¿‘ëv¿YÉ{¿ÆÐ~¿0ü¿hI¿¼¹|¿ôQx¿Kr¿kj¿²]`¿ØU¿ "H¿aÇ9¿¬*¿D¿Ò ¿2þç¾^1À¾‚ý–¾0_Y¾J-¾Ù.½åÊ/=Ð>þKY> ô–>C(À>põç>§?T?*?Ä9?ûH?U?¼j`?bj?²r?ÂPx?ó¸|? I?>ü??Ñ~?<Ê{?Ýìv?8Bp?ÂÖg?5º]?tÿQ?î§D?Yó5?ßê%?s¬?KX?K!Þ> óµ>èpŒ>ÕÐC>¤Ú=e8°<3Ú‚½g¾½Àn¾ïn¡¾ïOʾ·ñ¾D­ ¿z¿Ä .¿%‚=¿‚K¿¶X¿aôb¿¿®=,!.>¸Î>]š«>q%Ô>7$û>\A?AÇ!?ï2?à)A?ùËN?ÃëZ?—re?ÌLn?Øiu?q¼z?¦:~?ñÝ?A£?—†}? ’y?DËs?=l?’õb?X?ƒK?àƒ=?§".?"|?l¯ ?Š»ñ>ªTÊ>Òs¡>FNn>6q>Àî‚=毼ŸÚ½¹ÆC¾õkŒ¾<îµ¾¨Þ¾V¿Zª¿éè%¿‰ñ5¿ÃºD¿ûýQ¿ë¸]¿«Õg¿UAp¿/ìv¿ÅÉ{¿Ñ~¿7ü¿UY>—ø–>˜,À>šùç>¢ ?4?À*?œÅ9?p H?jU?t\`?Tj?tr?SQx?S¹|?7I?8ü?Ñ~?ÐÉ{??ìv?jAp?ÅÕg? ¹]?þQ?êºD?´ñ5?é%?Œª?IV?Þ>®îµ>klŒ>©ÇC>…‘Ú=®í¯<Øì‚½Dp¾XMn¾^s¡¾:Tʾ»ñ¾9¯ ¿ò{¿z".¿·ƒ=¿í‚K¿÷X¿võb¿û£¿óÝ¿­:~¿}¼z¿éiu¿âLn¿²re¿âëZ¿ÌN¿*A¿2¿qÇ!¿A¿¢$û¾à%ԾК«¾.Ͼ".¾&Á®½å)†7ÛÑ®=`*.><Ó>Þ«>±)Ô>I(û>Ú(?É!? 2?h+A?YÍN?ùìZ? se?¦Mn?‚ju?ê¼z?ì:~?Þ?!£?³Š}?„‘y?Ês?,`PÊ>do¡>«Án>ùg>Ü‚=¿0°¼2¢Ú½äÏC¾spŒ¾šòµ¾Ý Þ¾X¿A¬¿°ê%¿.ó5¿Ç§D¿QÿQ¿º]¿¨Ög¿#Bp¿Íìv¿1Ê{¿9Ñ~¿=ü¿I¿ý¸|¿ÑPx¿Ær¿{j¿r[`¿@U¿!H¿+Ä9¿.*¿…¿Û¿Þõç¾µ(À¾•ô–¾îLY¾Â¾·Î/½.=W,>@^Y> ý–>ì0À>Äýç>ž ??~*?7Ç9?å!H?¶U?”]`?Rj?7r?åQx?²¹|?dI?1ü?ÌÐ~?dÉ{?¢ëv?œ@p?ÇÔg?ß·]?ÈüQ?l¹D?‘6?Pç%?¥¨?FT?áÞ>Qêµ>ígŒ>~¾C>ò~Ú=÷¢¯<}ÿ‚½€y¾mVn¾;¡¾„Xʾ=¿ñ¾.± ¿É}¿0$.¿I…=¿X„K¿8X¿Šöb¿á=l¿èËs¿€’y¿â†}¿¨¡¿ßÝ¿g:~¿¼z¿?iu¿Ln¿©qe¿¬êZ¿½ÊN¿€(A¿n2¿¡Å!¿¡?¿TXû¾ !Ô¾i–«¾ªÊ¾è.¾ˆ®®½mŒX8yä®=•3.>Á×>*£«>ñ-Ô>[,û>È*?²!?J"2?ñ,A?ºÎN?.îZ?©te?Nn?,ku?b½z?2;~?Þ?£?`Š}?˜y?×És?F;l?iób?–X?=€K?¼€=?:.?sx?‚« ?N³ñ>LÊ>õj¡>•¸n>NÝ>vÉ‚=v{°¼Æ´Ú½ÙC¾ñtŒ¾÷öµ¾%Þ¾Z¿'®¿wì%¿Òô5¿E©D¿XîQ¿A»]¿¦×g¿òBp¿kív¿Ê{¿sÑ~¿Dü¿âH¿ž¸|¿?Px¿r¿‰j¿ºi`¿õU¿¬H¿Â9¿p *¿¦¿ß¿´ñç¾a$À¾ð–¾ÍCY¾¾b©/½\;.=¨¶>agY>„—>@5À>îè>š?ò?=*?ÓÈ9?Y#H?U?´^`?Dj?‘r?vRx?º|?I?+ü?“Ð~?øÈ{?ëv?Í?p?ÉÓg?´¶]?rûQ?í·D?í6?æý%?¾¦?CR?«Þ>óåµ>ocŒ>SµC>^lÚ=?X¯<"ƒ½½‚¾ƒ_n¾?¡¾"ʾ[Ãñ¾#³ ¿¡¿ç%.¿Û†=¿Â…K¿yX¿Ÿ÷b¿È>l¿žÌs¿“y¿5‡}¿È¡¿ÓÞ¿!:~¿Œ»z¿•hu¿-Kn¿ pe¿wéZ¿\ÉN¿÷&A¿Á2¿ÒÃ!¿³=¿BTû¾žWÔ¾’«¾%ƾ´.¾ë›®½ô·8÷®=Ê<.>FÜ>§«>12Ô>m0û>¶,?â³!?û 2?y.A?ÐN?dïZ?²ue?[On?Öku?Û½z?y;~?*Þ?â¢?Š}?™—y?ãÒs?_:l?Tòb?VX?Ò~K?*=?„.?œv?© ?0¯ñ>ËGÊ>†f¡>€¯n>Ô>J¶ƒ=.ư¼YÇÚ½;âC¾nyŒ¾Uûµ¾H)Þ¾\¿°¿?î%¿wö5¿ÄªD¿®ïQ¿l¬]¿£Øg¿ÀCp¿îv¿ Ë{¿¬Ñ~¿Jü¿¶H¿>¸|¿®Ox¿Ar¿—j¿šh`¿hU¿7H¿ôÀ9¿± *¿Ç¿ã¿Šíç¾ À¾¨ë–¾¬:Y¾;¾ „/½±`.=ì¿>lóX>ú—>•9À>è>–?Ñ!?ü*?nÊ9?Î$H?M U?Ô_`?6j?Tr?>Kx?pº|?½I?$ü?YÐ~?ŒÈ{?fêv?ÿ>p?ÌÒg?‰µ]?úQ?o¶D?H6?ü%?ä¾?AP?vÞ>•áµ>ñ^Œ>'¬C>ÊYÚ=ˆ ¯<Ç$ƒ½ú‹¾™hn¾îC¡¾M&ʾ ñ¾µ ¿x¿'.¿mˆ=¿-‡K¿º X¿³øb¿®?l¿TÍs¿‹“y¿ˆ‡}¿è¡¿ÀÞ¿›=~¿»z¿ëgu¿SJn¿—oe¿AèZ¿üÇN¿o%A¿2¿Â!¿Å;¿0Pû¾^SÔ¾èÉ«¾ Á¾.¾M‰®½ØÞ9´ ¯=þE.>Êà>÷««>q6Ô>4û>¤.?±µ!?¨2?A?zÑN?šðZ?»ve?5Pn?€lu?S¾z?¿;~?=Þ?¢?»‰}?—y?-Òs?ÌEl?@ñb?X?g}K?˜}=?Î.?Åt?˜§ ?«ñ>€CÊ>b¡>j¦n>ÕÊ>¥£ƒ=!­¼íÙÚ½fëC¾ì}Œ¾³ÿµ¾}-Þ¾^¿õ±¿ð%¿ø5¿C¬D¿ñQ¿—­]¿Ìg¿ŽDp¿¦îv¿uË{¿åÑ~¿Pü¿‰H¿ß·|¿Ox¿r¿¥j¿zg`¿U¿¶.H¿Y¿9¿ò*¿è¿ç¿`é羸À¾1ç–¾Š1Y¾÷þ¾¸^/½†.=0É>üX>IÍ–>é=À>B è>’?°#?»*? Ì9?C&H?˜ U?ô``?(j?r?ÐKx?µµ|?éI?ü? Ð~? È{?Èév?0>p?ÎÑg?^´]?ÆøQ?ð´D?¤6?Xú%?ý¼?Éi?@ Þ>8ݵ>sZŒ>ü¢C>7GÚ=Ñ®Oå>]°«>²:Ô>‘8û>’0?€·!?V2?‰A?þ¿N?ÐñZ?Äwe?Qn?*mu?̾z?<~?QÞ?¢¢?h‰}?–y?vÑs?æDl?øþb?ÔÿW?ý{K?|=?.?ír?£¥ ?ô¦ñ>6?Ê>©]¡>Tn>˜Á>‘ƒ=Ø[­¼öíÙ½’ôC¾j‚Œ¾¶¾²1Þ¾!`¿Û³¿Íñ%¿Àù5¿Â­D¿[òQ¿Â®]¿ Íg¿P:p¿Dïv¿áË{¿Ò~¿Wü¿\H¿·|¿‹Nx¿¼r¿³j¿Zf`¿ÑU¿B-H¿ÁÓ9¿3*¿ ¿ë¿6åç¾dÀ¾»â–¾i(Y¾³õ¾c9/½[«.=tÒ>®Y>ÀÑ–>ëÀ>lè>Ž?%?z*?¥Í9?¸'H?ä U?b`?j?Ùr?bLx?¶|?²G?ü?æÏ~?´Ç{?*év?b=p?ÐÐg?3³]?p÷Q?q³D?6?‘ø%?»?Æg?´AÞ>ÚØµ>õUŒ>ЙC>£4Ú=x®<Jƒ½tž¾Äzn¾ËL¡¾ã.ʾI—ñ¾0ž ¿ìk¿ +.¿‹=¿ŠK¿; X¿Üúb¿zAl¿ÁÎs¿•”y¿-ˆ}¿(¢¿™Þ¿=~¿–Àz¿±ou¿žHn¿„me¿ÕåZ¿;ÅN¿^"A¿¸2¿d¾!¿é7¿ Hû¾ÝJÔ¾Á«¾ö¾8r.¾d®½–šK9î.¯=gX.>Ôé>Ä´«>ò>Ô>£<û>€2?P¹!?2?A?^ÁN?oâZ?Îxe?êQn?Ômu?D¿z?K<~?dÞ?‚¢?‰}? –y?ÀÐs?Dl?äýb?¾X?’zK?tz=?a.?q?®£ ?Ö¢ñ>ë:Ê>:Y¡>?”n>[¸>[~ƒ=¦­¼ŠÚ½½ýC¾è†Œ¾n¶¾ç5Þ¾#b¿Âµ¿”ó%¿dû5¿@¯D¿±óQ¿í¯]¿ Îg¿;p¿oçv¿MÌ{¿XÒ~¿]ü¿0H¿ ·|¿úMx¿úr¿Áj¿;e`¿…U¿Í+H¿&Ò9¿_*¿)¿ïþ¿ áç¾À¾DÞ–¾HY¾oì¾/½±Ð.=·Û>ÏY>6Ö–>? À>ˆÙç>Š?n'?9*?@Ï9?,)H?/ U?3c`? j?›r?óLx?t¶|?ßG?hü?­Ï~?HÇ{?Œèv?“O¶>wQŒ>¥C>"Ú=b-®<¶\ƒ½°§¾Úƒn¾:Q¡¾-3ʾg›ñ¾&  ¿Ãm¿J.¿"=¿m‹K¿| X¿ñûb¿aBl¿wÏs¿•y¿€ˆ}¿H¢¿†Þ¿É<~¿Àz¿ou¿tSn¿{le¿ŸäZ¿ÚÃN¿Ö A¿ 2¿”¼!¿û5¿ûCû¾FÔ¾´¼«¾ûñ¾i.¾…P¯½tøp9ŒA¯=œa.>Xî>*¹«>2CÔ>µ@û>n4?»!?±2?šA?¿ÂN?¥ãZ?¦ke?ÄRn?~nu?½¿z?‘<~?wÞ?b¢?È}?…•y? Ðs?Cl?Ïüb?~X?‘ŒK?âx=?«.?>o?¹¡ ?·žñ>¡6Ê>ËT¡>)‹n>¯>¶kƒ=Gñ­¼Ú½E‰C¾f‹Œ¾Ì ¶¾:Þ¾&d¿©·¿[õ%¿ ý5¿¿°D¿õQ¿±]¿Ïg¿í;p¿ èv¿ñÆ{¿‘Ò~¿cü¿H¿À¶|¿hMx¿8r¿Ïj¿d`¿:U¿X*H¿‹Ð9¿ *¿ð(¿óü¿áÜç¾»À¾ÍÙ–¾'Y¾+ã¾¹î.½ö.=ûä>ðY>­Ú–>“À>²Ýç>Vý?M)?÷*?ÛÐ9?¡*H?{U?Sd`?þj?^r?…Mx?Ó¶|? H?bü?†Ò~?ÜÆ{?îçv?Ä;p?ÕÎg?ݰ]?ÄôQ?t°D?·ü5?õ%?J·?Ác?J9Þ>ñ ¶>…ŠŒ>y‡C>|Ú=ªâ­<\oƒ½í°¾ðŒn¾©U¡¾x7ʾ†Ÿñ¾¢ ¿šo¿.¿1y=¿ØŒK¿¼X¿ýb¿GCl¿.Ðs¿Ÿ•y¿Óˆ}¿h¢¿sÞ¿ƒ<~¿¥¿z¿]nu¿šRn¿£ye¿iãZ¿zÂN¿MA¿]2¿Åº!¿ 4¿é?û¾]BÔ¾N¸«¾ví¾Ï_.¾è=¯½­©i¹)T¯=Ðj.>Ýò>‘½«>rGÔ>ÆDû>\6?ï¼!?_2?#!A?ÄN?ÛäZ?¯le?îGn?(ou?5Àz?×<~?ŠÞ?B¢?pˆ}?•y?TÏs?4Bl?»ûb?= X?&‹K?ÔŒ=?õ.?gm?ÄŸ ?™šñ>V2Ê>\P¡>‚n>â¥>Yƒ=ÿ;®¼±%Ú½p’C¾XRŒ¾)¶¾R>Þ¾(f¿¹¿#÷%¿­þ5¿>²D¿]öQ¿C²]¿Ðg¿»!Y>$ß–>èÀ>Üáç>Rÿ?‡?¶*?vÒ9?,H?ÆU?se`?ðj? r?Nx?3·|?8H?\ü?MÒ~?8Ì{?Pçv?ö:p?×Íg?²¯]?nóQ?õ®D?û5?;ó%?cµ?¿a?5Þ>“¶>†Œ>òûC>èüÙ=ó—­<‚ƒ½*º¾–n¾Z¡¾Â;ʾ¤£ñ¾¤ ¿rq¿·.¿Ãz=¿ÙzK¿ýX¿þb¿-Dl¿äÐs¿$–y¿&‰}¿ˆ¢¿`Þ¿=<~¿-¿z¿³mu¿¿Qn¿šxe¿ÉòZ¿ÁN¿ÅA¿°2¿õ¸!¿2¿×;û¾>Ծ糫¾ñ辚V.¾J+¯½ÏKD¹¶g®=t.>a÷>÷Á«>²KÔ>ØHû>J8?¾¾!? 2?«"A?€ÅN?æZ?¸me?ÈHn?·fu?®Àz?=~?Þ?"¢?ˆ}?{”y?Îs?MAl?¦úb?ü X?»‰K?B‹=?³*.?k?Î ?{–ñ> .Ê>íK¡>þxn>¥œ>lFƒ=¶†®¼E8Ú½››C¾ÖVŒ¾´Ùµ¾‡BÞ¾+h¿v»¿êø%¿R6¿¼³D¿³÷Q¿n³]¿Ñg¿Š=p¿Iév¿ÉÇ{¿ñÏ~¿ü¿©G¿¶|¿ELx¿³r¿ëj¿Ûa`¿£ U¿o'H¿TÍ9¿"*¿1%¿+¿œ è¾À¾àЖ¾åY¾¤Ð¾¤.½°@/=ƒ÷>2*Y>šã–><À>æç>N?f?Š*?Ô9?‹-H?U?“f`?âj?âr?¨Nx?’·|?eH?Vü?Ò~?ÌË{?%ïv?':p?ÚÌg?‡®]?òQ?w­D?nù5?tñ%?|³?¼_?ß0Þ>6¶>‰Œ>ÆòC>ÞèÚ=;M­<¦”ƒ½gþŸn¾‡^¡¾ @ʾ§ñ¾¦ ¿Is¿m.¿U|=¿C|K¿X¿.ÿb¿El¿šÑs¿©–y¿x‰}¿¨¢¿MÞ¿÷;~¿´¾z¿ mu¿åPn¿‘we¿“ñZ¿–ÒN¿<A¿2¿&·!¿10¿Å7û¾Ý9Ô¾¯«¾mä¾fM.¾­¯½ðí¹Tz®=ÿ->æû>^Æ«>òOÔ>êLû>8:?ŽÀ!?º2?3$A?àÆN?GçZ?Áne?£In?bgu?²ºz?c=~?°Þ?¢?ʇ}?ö“y?çÍs?g@l?’ùb?¼ X?QˆK?°‰=?ý(.?ó‚?Ù› ?]’ñ>Á)Ê>~G¡>èon>h“>Ç3ƒ=mÑ®¼ÙJڽǤC¾T[Œ¾Þµ¾ Þ¾-j¿]½¿±ú%¿ö6¿;µD¿ ùQ¿™´]¿Òg¿X>p¿çév¿5È{¿+Ð~¿ü¿áI¿¢µ|¿´Kx¿ðr¿ùj¿¼``¿W U¿ú%H¿¹Ë9¿d*¿R#¿/¿r è¾=À¾iÌ–¾ÄúX¾`Ǿ¹~.½f/=Ç>T3Y>è–>‘À>0êç>J?F?I *?©¿9?ÿ.H?]U?²g`?Ôj?¥r?9Ox?ñ·|?’H?Oü?ÚÑ~?`Ë{?‡îv?fDp?ÜËg?\­]?ÂðQ?ø«D?É÷5?­ï%?–±?¹]?ª,Þ>Øþµ> }Œ>›éC>KÖÚ=H±‚Â>ÄÊ«>2TÔ>üPû>&<?]Â!?g2?¼%A?AÈN?}èZ?Êoe?~Jn? hu?+»z?©=~?ÃÞ?â¡?w‡}?q“y?1Ís??l?}øb?{ X?æ†K?ˆ=?G'.??¶´ ?>Žñ>w%Ê>C¡>Òfn>,Š>"!ƒ=%¯¼m]Ú½ò­C¾Ò_Œ¾pâµ¾HÞ¾¥P¿C¿¿xü%¿›6¿¹¶D¿_úQ¿Äµ]¿ýÒg¿'?p¿…êv¿¡È{¿dÐ~¿%ü¿´I¿^º|¿"Kx¿-r¿j¿œ_`¿ U¿…$H¿Ê9¿¥*¿s!¿3¿Hè¾¼8À¾—¾£ñX¾¾¾dY.½Z‹/= >u‡ì–>å À>Zîç>F?%? *?DÁ9?€H?¨U?Òh`?Æj?gr?ÊOx?Q¸|?¾H?Iü?¡Ñ~?ôÊ{?êív?˜Cp?rØg?1¬]?kïQ?yªD?%ö5?åí%?¯¯?·[?u(Þ>zúµ>ŽxŒ>pàC>·ÃÚ=‘·°Ç>ß’«>rXÔ>Uû>>?,Ä!?2?D'A?¡ÉN?³éZ?Ôpe?XKn?¶hu?¤»z?/:~?ÖÞ?¡?$‡}?ì’y?zÌs?š>l?i÷b?:X?|…K?Œ†=?‘%.?D?Á² ?ŒÂñ>,!Ê>¡>¡>¼]n>ï€>}ƒ=Üf¯¼pÚ½·C¾PdŒ¾Îæµ¾~Þ¾¨R¿§¿?þ%¿?6¿8¸D¿µûQ¿ï¶]¿ûÓg¿õ?p¿#ëv¿ É{¿žÐ~¿,ü¿ˆI¿ÿ¹|¿ZRx¿kr¿j¿|^`¿ÀU¿#H¿‚È9¿æ*¿”¿7¿è¾h4À¾¤—¾˜eY¾Ø´¾4.½¯°/=N>–EY>þð–>9%À>„òç>B??Ç *?àÂ9?õH?6U?òi`?¸j?*r?\Px?°¸|?ëH?Bü?gÑ~?ˆÊ{?Lív?ÉBp?t×g?»]?îQ?ú¨D?€ô5?ì%?È­?´Y?@$Þ>öµ>tŒ>E×C>$±Ú=Úl°<Í‚½‹`¾\ºn¾Ók¡¾ìLʾ´ñ¾ä« ¿Ðx¿.¿ =¿„€K¿ÕX¿Ÿób¿s;l¿ûÉs¿8˜y¿pŠ}¿£¿Þ¿%;~¿K½z¿ ku¿VNn¿ute¿òíZ¿uÎN¿¤,A¿ö!2¿…Ê!¿g*¿+û¾-Ô¾M¢«¾ßÖ¾È1.¾Õ஽QQ;¸,²®=µ.>ŒË>F—«>u"Ô>Yû>@?üÅ!?Â2?Í(A?ËN?éêZ?Ýqe?2Ln?`iu?¼z?u:~?ãÝ?¢¡?Ò†}?f’y?ÄËs?´=l?Töb?ùX?„K?ú„=?Û#.?m}?̰ ?n¾ñ>­WÊ>2:¡>§Tn>²w>×û‚=“±¯¼”‚Ú½IÀC¾ÎhŒ¾+ëµ¾³Þ¾«T¿©¿©ç%¿ã6¿·¹D¿ ýQ¿¸]¿ùÔg¿Ä@p¿Àëv¿yÉ{¿×Ð~¿2ü¿[I¿Ÿ¹|¿ÈQx¿r¿"j¿\]`¿uU¿œ!H¿çÆ9¿'*¿µ¿; ¿ôüç¾0À¾.ü–¾w\Y¾‡*¾¹.½Ö/=’>·NY>uõ–>Ž)À>®öç>> ?ã?†*?{Ä9?jH?U?ª[`?ªj?ìr?íPx?¹|?I?<ü?.Ñ~?Ê{?®ìv?ûAp?wÖg?ܹ]?ÿQ?|§D?Ûò5?Wê%?â«?²W? Þ>¿ñµ>’oŒ>ÎC>žÚ=""°<Áß‚½Çi¾÷Fn¾Bp¡¾7Qʾ:¸ñ¾Ù­ ¿§z¿F!.¿‚=¿îK¿X¿´ôb¿YÐ>¬›«>µ&Ô>m%û>ðA?ËÇ!?o2?U*A?bÌN?ìZ?ære? Mn? ju?•¼z?»:~?öÝ?8£?†}?á‘y? Ës?ÎcSÊ>€r¡>‘Kn>un>2é‚=Kü¯¼'•Ú½tÉC¾KmŒ¾‰ïµ¾éÞ¾­V¿ëª¿pé%¿ò5¿5»D¿aþQ¿D¹]¿öÕg¿’Ap¿^ìv¿åÉ{¿Ñ~¿9ü¿.I¿@¹|¿7Qx¿Nr¿$j¿<\`¿)U¿' H¿LÅ9¿h*¿Ö¿? ¿Êøç¾¿+À¾·÷–¾VSY¾C!¾íè/½Yû/=Ö%>ØWY>ëù–>â-À>Øúç>: ?Â?E*?Æ9?ß H?ÍU?Ê\`?¨j?®r?Qx?o¹|?DI?6ü?ôÐ~?°É{?ìv?,Ap?yÕg?±¸]?¸ýQ?xºD?7ñ5?è%?û©?¯U?ÕÞ>aíµ>kŒ>îÄC>ü‹Ú=kׯ•Ô> «>õ*Ô>)û>m)?›É!?!2?Ý+A?ÂÍN?UíZ?ïse?çMn?µju?½z?;~? Þ?£?šŠ}?\‘y?WÊs?ç;l?+ôb?xX?;K?Ö=?n .?¾y?⬠?2¶ñ>OÊ>n¡>ö¾n>8e>Ö‚=G°¼»§Ú½ ÒC¾ÉqŒ¾çóµ¾"Þ¾°X¿Ò¬¿8ë%¿«ó5¿9¨D¿·ÿQ¿oº]¿ôÖg¿aBp¿üìv¿QÊ{¿JÑ~¿?ü¿I¿á¸|¿¥Px¿Œr¿2j¿„j`¿ÞU¿²H¿°Ã9¿© *¿÷¿C¿ ôç¾k'À¾Aó–¾5JY¾¾˜Ã/½&!.=/>ù`Y>bþ–>62À>ÿç>6 ?¡?*?²Ç9?T"H?U?ê]`?šj?r?Rx?ι|?qI?/ü?»Ð~?DÉ{?sëv?^@p?{Ôg?†·]?büQ?ú¸D?6?Èæ%?¨?­S? Þ>éµ>–fŒ>ûC>iyÚ=´Œ¯< ƒ½A|¾"Yn¾b<¡¾ʾwÀñ¾Ã± ¿V~¿³$.¿Á…=¿Ä„K¿˜X¿Ýöb¿&>l¿Ìs¿¨’y¿ú†}¿²¡¿ÙÝ¿R:~¿á»z¿ iu¿ÇKn¿Zqe¿PêZ¿TÊN¿ (A¿î2¿Å!¿?¿Wû¾[ Ô¾•«¾Qɾ*.¾ü¨®½Š‚8ê®=S6.>Ù>y¤«>5/Ô>‘-û>[+?œ²!?Ê"2?f-A?#ÏN?‹îZ?øte?ÂNn?_ku?†½z?G;~?Þ?ø¢?HŠ}?ö—y?¡És?;l?ób?7X?ÑK?D€=?¸.?çw?íª ?²ñ>ÎJÊ>£i¡>àµn>ŽÚ>èÂ=¹‘°¼OºÚ½ËÛC¾GvŒ¾Døµ¾S&Þ¾²Z¿¸®¿ÿì%¿Põ5¿·©D¿¾îQ¿š»]¿ñ×g¿/Cp¿šív¿½Ê{¿„Ñ~¿Fü¿ÕH¿¸|¿Px¿Êr¿Aj¿di`¿PU¿=H¿Â9¿ê *¿¿G¿vðç¾#À¾Êî–¾AY¾¼¾Cž/½{F.=k¹>jY>Ø—>‹6À>,è>2? ?Â*?MÉ9?È#H?dU? _`?Œj?Ër?ØJx?.º|?žI?)ü?‚Ð~?ØÈ{?Õêv??p?~Óg?[¶]? ûQ?{·D?p6?_ý%?-¦?ªQ?jÞ>¦äµ>bŒ>—²C>ÕfÚ=üA¯<°ƒ½~…¾8bn¾Ñ@¡¾J#ʾ(Œñ¾¸³ ¿-€¿i&.¿R‡=¿/†K¿ØX¿ñ÷b¿ ?l¿ÔÌs¿-“y¿M‡}¿Ò¡¿ÍÞ¿ :~¿h»z¿bhu¿ìJn¿Qpe¿éZ¿óÈN¿‚&A¿A2¿HÃ!¿ =¿ Sû¾YVÔ¾³«¾Ìľõ .¾_–®½LFÍ8¢ü®=ˆ?.>žÝ>ਫ>u3Ô>£1û>I-?l´!?{ 2?î.A?ƒÐN?ÁïZ?ve?œOn? lu?ÿ½z?;~?0Þ?Ø¢?õ‰}?q—y?­Òs?:l?òb?öX?f~K?²~=?.?v?ø¨ ?ö­ñ>„FÊ>4e¡>ˬn>QÑ>¼°ƒ=qܰ¼âÌÚ½öäC¾ÅzŒ¾¢üµ¾‰*Þ¾µ\¿Ÿ°¿Æî%¿ôö5¿6«D¿ðQ¿Å¬]¿ïØg¿þCp¿7îv¿)Ë{¿½Ñ~¿Lü¿¨H¿"¸|¿ƒOx¿r¿Oj¿Dh`¿U¿¼/H¿yÀ9¿+ *¿8¿K¿Lìç¾ÂÀ¾Tê–¾ó7Y¾x¾îx/½Ñk.=¯Â>$öX>O—>ß:À>Vè>-?`"?*?éÊ9?=%H?¯ U?*``?~j?r?jKx?qµ|?ÊI?"ü?HÐ~?lÈ{?7êv?Á>p?€Òg?0µ]?¶ùQ?ýµD?Ë6?˜û%?S¾?§O?5Þ>Hàµ>š]Œ>l©C>BTÚ=E÷®#â>F­«>¶7Ô>µ5û>7/?;¶!?(2?vA?ãÑN?öðZ? we?wPn?³lu?w¾z?Ô;~?CÞ?¸¢?¢‰}?ì–y?öÑs?ˆEl?íðb?µX?û|K? }=?K.?8t?§ ?Ø©ñ>9BÊ>Å`¡>µ£n>È>žƒ=d'­¼vßÚ½"îC¾CŒ¾¶¾¾.Þ¾·^¿†²¿ð%¿™ø5¿µ¬D¿jñQ¿ð­]¿YÌg¿ÌDp¿Õîv¿•Ë{¿öÑ~¿Rü¿|H¿Â·|¿ñNx¿Er¿]j¿$g`¿¹U¿G.H¿âÔ9¿m*¿Y¿O¿"èç¾nÀ¾Ýå–¾Ò.Y¾4ü¾˜S/½&‘.=òË>EÿX>Ζ>3?À>€ è>)??$?@*?„Ì9?²&H?û U?Ja`?pj?Pr?ûKx?ѵ|?’G?ü?Ð~?È{?™év?ó=p?ƒÑg?´]?`øQ?~´D?'6?Ðù%?l¼?/i?ÿ Þ>ëÛµ>YŒ>@ C>®AÚ=ެ®<ú<ƒ½÷—¾dtn¾¯I¡¾ß+ʾe”ñ¾Ñœ ¿¡j¿Õ).¿vŠ=¿‰K¿Z X¿úb¿Ù@l¿AÎs¿7”y¿ó‡}¿¢¿§Þ¿@=~¿ëÀz¿gu¿7In¿>ne¿®æZ¿2ÆN¿r#A¿æ2¿©¿!¿D9¿èJû¾ÙMÔ¾2Ä«¾«ù¾Œú-¾$q®½ã^19Ý!¯=ñQ.>¨æ>­±«>ö;Ô>Ç9û>%1? ¸!?Ö2?þA?gÀN?,òZ?xe?QQn?]mu?ð¾z?<~?VÞ?˜¢?O‰}?g–y?@Ñs?¢Dl?¦þb?tÿW?{K?Ž{=?•.?ar?¥ ?º¥ñ>ï=Ê>V\¡>Ÿšn>ؾ>r‹ƒ=r­¼óÙ½M÷C¾ÁƒŒ¾]¶¾ó2Þ¾º`¿l´¿Uò%¿=ú5¿4®D¿ÁòQ¿¯]¿WÍg¿:p¿sïv¿Ì{¿0Ò~¿Yü¿OH¿c·|¿`Nx¿‚r¿kj¿f`¿nU¿Ó,H¿GÓ9¿˜*¿z¿S¿øãç¾À¾fá–¾±%Y¾ðò¾C./½{¶.=6Õ>fY>Ó–>5À>ªè>%?&?ÿ*?Î9?'(H?F U?ib`?bj?r?Lx?1¶|?¿G?mü?ÕÏ~?”Ç{?ûèv?$=p?…Ðg?Ú²]? ÷Q?ÿ²D?‚ÿ5? ø%?†º?-g?s@Þ>×µ>žTŒ>—C>/Ú=Öa®< Oƒ½4¡¾y}n¾N¡¾*0ʾƒ˜ñ¾Æž ¿xl¿.¿Œ=¿nŠK¿› X¿/ûb¿¿Al¿÷Îs¿¼”y¿Fˆ}¿2¢¿”Þ¿ú<~¿rÀz¿~ou¿]Hn¿5me¿xåZ¿ÒÄN¿é!A¿82¿Ú½!¿V7¿ÖFû¾™IԾ˿«¾'õ¾zo.¾†^®½Â¼V9z4¯=%[.>,ë>¶«>6@Ô>Ù=û>3?Ú¹!?„2?‡A?ÇÁN?ÌâZ?ye?+Rn?nu?h¿z?`<~?iÞ?x¢?ýˆ}?â•y?ŠÐs?»Cl?‘ýb?_X?&zK?üy=?ß.?‰p?£ ?œ¡ñ>¤9Ê>èW¡>Š‘n>›µ>Íxƒ=Ó¼­¼Ú½Ô‚C¾>ˆŒ¾» ¶¾(7Þ¾¼b¿S¶¿ô%¿âû5¿²¯D¿ôQ¿F°]¿UÎg¿\;p¿žçv¿mÌ{¿iÒ~¿_ü¿"H¿·|¿ÎMx¿Àr¿yj¿åd`¿#U¿^+H¿«Ñ9¿Ú*¿@*¿Wþ¿Îßç¾ÅÀ¾ðÜ–¾Y¾­é¾î/½ÐÛ.=zÞ>ˆY>‹×–>‰ À>ÅÚç>!?ý'?¾*?ºÏ9?›)H?’ U?‰c`?Tj?Õr?Mx?¶|?ìG?gü?®Ò~?(Ç{?]èv?U<Þ>¶> PŒ>éC>†Ú=®±ï>zº«>vDÔ>ëAû>5?©»!?12? A?(ÃN?äZ?õke?Sn?±nu?á¿z?¦<~?}Þ?Y¢?ªˆ}?]•y?ÔÏs?ÕBl?}üb?X?%ŒK?jx=?(.?²n?#¡ ?}ñ>Z5Ê>yS¡>tˆn>^¬>(fƒ=Š®¼§Ú½ŒC¾1OŒ¾¶¾^;Þ¾¿d¿:¸¿ãõ%¿†ý5¿1±D¿mõQ¿q±]¿RÏg¿*©Y>Ü–>ÞÀ>ðÞç>íý?Ü)?}*?VÑ9?+H?ÝU?©d`?Fj?—r?°Mx?ð¶|?H?`ü?uÒ~?ƒÌ{?¿çv?‡;p?ŠÎg?„°]?^ôQ?°D?9ü5?{ô%?¹¶?(c? 8Þ>¤ ¶>.‰Œ>¾„C>ó Ú=gÌ­<êtƒ½®³¾¥n¾ûV¡¾¿8ʾÀ ñ¾°¢ ¿'p¿ƒ.¿¨y=¿DK¿X¿Xýb¿‹Cl¿dÐs¿Ç•y¿ëˆ}¿r¢¿mÞ¿n<~¿¿z¿*nu¿YRn¿Tye¿ ãZ¿ÂN¿ØA¿Ý2¿;º!¿z3¿²>û¾AÔ¾þ¶«¾ì¾].¾\8¯½‡^¹µY¯=Žm.>5ô>ྫ>¶HÔ>ýEû>ï6?y½!?ß2?—!A?ˆÄN?8åZ?þle?/Hn?[ou?YÀz?ì<~?Þ?9¢?Wˆ}?Ø”y?Ïs?ïAl?hûb?Ý X?ºŠK?\Œ=?r.?Úl?.Ÿ ?_™ñ>1Ê> O¡>^n>!£>ƒSƒ=BR®¼:+Ú½+•C¾¯SŒ¾¤Öµ¾“?Þ¾Áf¿ º¿ª÷%¿+ÿ5¿°²D¿ÃöQ¿œ²]¿PÐg¿ùÊ#Y>xà–>2À>ãç>éÿ??;*?ñÒ9?…,H?)U?Ée`?8j?Zr?ANx?O·|?FH?Zü?<Ò~?Ì{?”ïv?¸:p?ŒÍg?Y¯]?óQ?ƒ®D?•ú5?´ò%?Ò´?%a?Ô3Þ>F¶>°„Œ>6ùC>_÷Ù=°­<‡ƒ½ê¼¾º˜n¾j[¡¾ =ʾޤñ¾¥¤ ¿þq¿:.¿:{=¿E{K¿]X¿lþb¿rDl¿Ñs¿K–y¿>‰}¿’¢¿ZÞ¿(<~¿ ¿z¿€mu¿~Qn¿Kxe¿mòZ¿°ÀN¿PA¿02¿k¸!¿Œ1¿ :û¾Ù<Ô¾˜²«¾™ç¾ÜS.¾¿%¯½¢)9¹Bm®=Ãv.>ºø>Gë>öLÔ>Jû>Ý8?H¿!?Œ2? #A?éÅN?næZ?ne? In?êfu?ÒÀz?2=~?£Þ?¢?ˆ}?S”y?gÎs? Al?Túb? X?O‰K?ÊŠ=?1*.?k?9 ?A•ñ>Ä,Ê>›J¡>Ivn>å™>Þ@ƒ=ùœ®¼Î=Ú½WžC¾,XŒ¾Ûµ¾ Þ¾Äh¿¼¿rù%¿Ï6¿.´D¿øQ¿Ç³]¿NÑg¿Ç=p¿xév¿éÇ{¿Ð~¿ü¿œG¿åµ|¿Lx¿yr¿£j¿†a`¿@ U¿'H¿ÚÌ9¿*¿£$¿“¿^ è¾@À¾ŒÏ–¾-Y¾á;ï˜.½ÏK/=Fú>ë,Y>ïä–>‡À>Dçç>å?õ?*?ŒÔ9?ú-H?tU?èf`?*j?r?ÓNx?®·|?rH?Tü?Ò~?¬Ë{?öîv?÷Dp?ŽÌg?.®]?²ñQ?­D?ðø5?ìð%?ë²?#_?Ÿ/Þ>é¶>3€Œ> ðC>UãÚ=ø6­<4šƒ½'ƾСn¾Ù_¡¾TAʾü¨ñ¾š¦ ¿Ös¿ð.¿Ì|=¿°|K¿rX¿ÿb¿XEl¿ÐÑs¿Ð–y¿‘‰}¿²¢¿GÞ¿â;~¿¾z¿Ölu¿¤Pn¿Bwe¿7ñZ¿-ÒN¿ÇA¿‚2¿œ¶!¿ž/¿6û¾™8Ô¾1®«¾㾨J.¾!¯½Ä˹߮=Õ.>>ý>­Ç«>6QÔ> Nû>Ë:?Á!?:2?¨$A?IÇN?¤çZ?oe?äIn?”gu?Öºz?x=~?¶Þ?ù¡?±‡}?Γy?±Ís?"@l??ùb?\ X?å‡K?8‰=?{(.?g‚?D› ?#‘ñ>z(Ê>,F¡>3mn>¨>9.ƒ=°ç®¼bPÚ½‚§C¾ª\Œ¾_ßµ¾TÞ¾p¿êv¿UÈ{¿<Ð~¿!ü¿ÓI¿…µ|¿ˆKx¿¶r¿±j¿f``¿õ U¿‹%H¿>Ë9¿Þ*¿Ä"¿—¿4è¾Æ;À¾=—¾ øX¾Ä¾šs.½%q/=Š> 6Y>eé–>ÛÀ>nëç>á?Ô?Î *?$À9?n/H?ÀU?h`?j?ßr?dOx?¸|?ŸH?Mü?ÉÑ~?@Ë{?Xîv?)Dp?$Ùg?­]?\ðQ?†«D?L÷5?%ï%?±? ]?i+Þ>‹ýµ>µ{Œ>àæC>ÂÐÚ=ì°<Ù¬ƒ½dϾæªn¾Gd¡¾žEʾ­ñ¾¨ ¿­u¿¦.¿^~=¿~K¿³X¿Èñb¿>Fl¿‡Òs¿U—y¿ä‰}¿Ò¢¿4Þ¿œ;~¿¾z¿,lu¿ÊOn¿9ve¿ðZ¿ÍÐN¿@/A¿Ô 2¿Ì´!¿°-¿}2û¾X4Ծ˩«¾Þ¾sA.¾„¯½ÊÛܸ}’®= .>ÛÃ>Ì«>wUÔ>2Rû>¹<?çÂ!?ç2?1&A?ªÈN?ÚèZ?pe?¿Jn??hu?O»z?ý9~?ÉÞ?Ù¡?_‡}?I“y?úÌs?/$Ê>½A¡>dn>k‡>”ƒ=h2¯¼öbÚ½®°C¾(aŒ¾½ãµ¾‰Þ¾?Q¿È¥¿ý%¿6¿+·D¿ÅúQ¿¶]¿IÓg¿e?p¿´êv¿ÁÈ{¿vÐ~¿'ü¿§I¿Aº|¿÷Jx¿ôr¿¾j¿F_`¿©U¿$H¿£É9¿ *¿ä ¿œ¿ è¾r7À¾Ç—¾lY¾Y»¾DN.½z–/=Í >-?Y>Üí–>/"À>˜ïç>Ý?´? *?¿Á9?ïH? U?(i`?j?¡r?öOx?m¸|?ÌH?Gü?Ñ~?ÔÊ{?»ív?ZCp?&Øg?Ø«]?ïQ?ªD?§õ5?^í%?¯?[?4'Þ>-ùµ>7wŒ>´ÝC>.¾Ú=N¡°<À‚½ Ø¾û³n¾¶h¡¾éIʾ8±ñ¾„ª ¿…w¿\.¿ð=¿…K¿ôX¿Ýòb¿Ñ:l¿=Ós¿Ú—y¿6Š}¿ñ¢¿!Þ¿V;~¿Ÿ½z¿‚ku¿ïNn¿0ue¿ËîZ¿lÏN¿·-A¿$#2¿ý²!¿Â+¿k.û¾0Ô¾d¥«¾ Ú¾?8.¾æí®½ ’¸¥®=?.>`È>/”«>·YÔ>DVû>§>?·Ä!?”2?¹'A? ÊN?êZ?#qe?™Kn?éhu?È»z?C:~?ÕÝ?¹¡? ‡}?Ä’y?DÌs?V>l?÷b?ÚX?…K?†=?%.?¸~?,² ?RÁñ>åÊ>O=¡>[n>.~>îƒ=}¯¼‰uÚ½Ù¹C¾¦eŒ¾èµ¾¿Þ¾AS¿¯§¿iæ%¿¼6¿ª¸D¿üQ¿H·]¿GÔg¿3@p¿Rëv¿-É{¿¯Ð~¿.ü¿zI¿â¹|¿.Rx¿1r¿Ìj¿&^`¿^U¿¡"H¿È9¿a*¿¿  ¿àÿç¾3À¾Pÿ–¾àbY¾1¾ï(.½Ï»/=>NHY>Rò–>„&À>Âóç>Ù?“?L *?ZÃ9?dH?˜U?Hj`?j?dr?‡Px?͸|?øH?Aü?VÑ~?hÊ{?ív?ŒBp?)×g?­º]?¯íQ?ˆ¨D?ô5?—ë%?7­?Y?ÿ"Þ>Ðôµ>¹rŒ>‰ÔC>›«Ú=—V°<ªÒ‚½Kc¾½n¾%m¡¾3NʾVµñ¾y¬ ¿\y¿ .¿‚=¿ð€K¿5X¿ñób¿·;l¿1Ês¿_˜y¿‰Š}¿£¿Þ¿;~¿'½z¿Øju¿Nn¿&te¿•íZ¿ ÎN¿/,A¿v!2¿ûÉ!¿Ô)¿Y*û¾Ø+Ô¾þ «¾†Õ¾ /.¾IÛ®½ È¸¸·®=s.>äÌ>•˜«>¹#Ô>VZû>•@?†Æ!?B2?A)A?kËN?EëZ?,re?tLn?“iu?@¼z?Š:~?éÝ?N£?¹†}??’y?ŽËs?p=l?öb?šX?¥ƒK?‚„=?X#.?á|?7° ?4½ñ>fVÊ>à8¡>òQn>ñt>Iö‚=Öǯ¼ˆÚ½ÃC¾$jŒ¾xìµ¾ôÞ¾DU¿•©¿1è%¿ßð5¿)ºD¿qýQ¿s¸]¿DÕg¿Ap¿ïëv¿™É{¿éÐ~¿4ü¿NI¿ƒ¹|¿Qx¿×r¿Új¿]`¿U¿-!H¿lÆ9¿¢*¿&¿¤ ¿¶ûç¾É.À¾Ùú–¾¿YY¾Å'¾"0½$á/=U>oQY>Éö–>Ø*À>ì÷ç>Õ ?r? *?öÄ9?ÙH?äU?\`?òj?&r?Qx?,¹|?%I?:ü?Ñ~?üÉ{?ìv?½Ap?+Ög?ƒ¹]?¨þQ? §D?^ò5?Ïé%?P«?W?ÉÞ>rðµ>;nŒ>^ËC>™Ú=ß °iÑ>üœ«>ù'Ô>¤&û>ƒB?UÈ!?ï2?Ê*A?ËÌN?{ìZ?5se?NMn?=ju?¹¼z?Ð:~?üÝ?.£?ÔŠ}?º‘y?×Ês?‰RÊ>.q¡>ÜHn>µk>¤ã‚=ް¼°šÚ½0ÌC¾¢nŒ¾Öðµ¾*Þ¾GW¿|«¿øé%¿„ò5¿,§D¿ÇþQ¿¹]¿BÖg¿ÐAp¿ìv¿Ê{¿"Ñ~¿;ü¿!I¿$¹|¿ Qx¿r¿Üj¿æ[`¿ÆU¿¸H¿ÑÄ9¿ã*¿G¿¨ ¿Œ÷ç¾u*À¾cö–¾žPY¾¾ÍÝ/½ñ.=™(>ZY>@û–>,/À>üç>Ñ ?Q?Ê*?‘Æ9?N!H?0U? ]`?ðj?èr?ªQx?‹¹|?RI?4ü?ãÐ~?É{?áëv?ï@p?-Õg?X¸]?RýQ?ºD?ºð5?è%?j©?U?”Þ>ìµ>½iŒ>2ÂC>t†Ú=(Á¯<ô÷‚½Åu¾ÂRn¾E9¡¾ÈVʾ“½ñ¾c° ¿ }¿#.¿¦„=¿ÅƒK¿¶X¿öb¿„=l¿žËs¿K’y¿À†}¿Q£¿çÝ¿ƒ:~¿5¼z¿„iu¿`Ln¿re¿*ëZ¿KËN¿)A¿2¿\Æ!¿i@¿ùYû¾W#Ô¾1˜«¾}̾¡.¾¶®½U&8óÜ®=Ý/.>îÕ>b¡«>9,Ô>¶*û>*?%Ê!?!2?R,A?+ÎN?±íZ?>te?(Nn?çju?1½z?;~?Þ?£?‚Š}?S˜y?!Ês?£;l?Ùób?X?Ï€K?_=?ì.?2y?L¬ ?ø´ñ>ÑMÊ>¿l¡>A¼n>xb>ÿЂ=E]°¼D­Ú½[ÕC¾ sŒ¾4õµ¾_#Þ¾IY¿c­¿¿ë%¿(ô5¿«¨D¿ÎíQ¿Èº]¿?×g¿žBp¿+ív¿qÊ{¿[Ñ~¿Aü¿ôH¿Ä¸|¿zPx¿Rr¿êj¿.j`¿{U¿CH¿6Ã9¿$ *¿h¿¬¿bóç¾ &À¾ìñ–¾}GY¾=¾x¸/½F,.=é²>±cY>¶ÿ–>3À>@è>Í ?0?‰*?,È9?Ã"H?{U?@^`?âj?Br?;Rx?ë¹|?~I?-ü?ªÐ~?$É{?Cëv?!@p?0Ôg?-·]?üûQ?ˆ¸D?—6?Aæ%?ƒ§?S?_Þ>·çµ>?eŒ>¹C>àsÚ=qv¯<™ ƒ½¾×[n¾´=¡¾G ʾ±Áñ¾X² ¿â~¿5%.¿8†=¿0…K¿÷X¿/÷b¿j>l¿TÌs¿Ð’y¿‡}¿»¡¿ÔÝ¿=:~¿½»z¿Úhu¿†Kn¿ qe¿ôéZ¿ëÉN¿–'A¿n2¿Ä!¿{>¿çUû¾UYԾʓ«¾øÇ¾l.¾p£®½èΘ8ï®=9.>rÚ>É¥«>z0Ô>È.û>î+?&³!?J#2?Ú-A?ŒÏN?çîZ?Gue?On?‘ku?ª½z?\;~?#Þ?ï¢?/Š}?Ηy?,Ós?¼:l?Äòb?×X?eK?Í=?5.?Zw?Wª ?Ú°ñ>‡IÊ>Qh¡>+³n>Í×>Z¾‚=ü§°¼Ø¿Ú½†ÞC¾žwŒ¾‘ùµ¾”'Þ¾L[¿I¯¿‡í%¿Íõ5¿)ªD¿$ïQ¿ó«]¿=Øg¿mCp¿Éív¿ÝÊ{¿•Ñ~¿Gü¿ÈH¿e¸|¿éOx¿r¿øj¿i`¿íU¿ÎH¿šÁ9¿e *¿‰¿°¿8ïç¾Ì!À¾ví–¾\>Y¾ù ¾#“/½›Q.=-¼>ÒlY>-—>Õ7À>iè>É?!?H*?ÈÉ9?8$H?ÇU?`_`?Ôj?r?Kx?Jº|?«I?'ü?pÐ~?¸È{?¦êv?R?p?2Óg?¶]?¦úQ? ·D?ò6?×ü%?œ¥?Q?)Þ>Yãµ>Â`Œ>ܯC>LaÚ=¹+¯<>ƒ½>ˆ¾ídn¾#B¡¾’$ʾcñ¾M´ ¿¹€¿ì&.¿Ê‡=¿›†K¿8 X¿Døb¿Q?l¿ Ís¿U“y¿f‡}¿Û¡¿ÇÞ¿÷9~¿D»z¿/hu¿«Jn¿pe¿¾èZ¿ŠÈN¿&A¿Á2¿¾Â!¿<¿ÕQû¾UÔ¾¯Ë«¾tþ7 .¾Ó®½¥Šã8.¯=FB.>÷Þ>/ª«>º4Ô>Ú2û>Ü-?ö´!?û 2?c/A?ìÐN?ðZ?Pve?ÝOn?âc¡>ªn>Î>.«ƒ=´ò°¼kÒÚ½²çC¾|Œ¾ïýµ¾Ê+Þ¾N]¿0±¿Nï%¿q÷5¿¨«D¿zðQ¿­]¿§Ëg¿;Dp¿fîv¿IË{¿ÎÑ~¿Nü¿›H¿¸|¿WOx¿Ír¿j¿îg`¿¢U¿M/H¿ÿ¿9¿¦ *¿ª¿´¿ëç¾xÀ¾ÿè–¾;5Y¾µ¾Îm/½ðv.=qÅ>ÜøX>£—>)<À>“è>Å?î"?*?cË9?¬%H? U?€``?Æj?Çr?•Kx?޵|?×I? ü?7Ð~?LÈ{?êv?„>p?5Òg?×´]?PùQ?‹µD?N6?û%?½?O?ô Þ>ûÞµ>D\Œ>°¦C>¹NÚ=á®<ã/ƒ½{‘¾nn¾’F¡¾Ü(ʾ‘ñ¾q› ¿‘‚¿¢(.¿\‰=¿ˆK¿y X¿Xùb¿7@l¿ÁÍs¿Ú“y¿¹‡}¿û¡¿´Þ¿r=~¿Ëºz¿…gu¿ÑIn¿ùne¿ˆçZ¿*ÇN¿…$A¿2¿îÀ!¿Ÿ:¿ÃMû¾ÕPÔ¾HÇ«¾×ü¾.¾5~®½1#9˯=zK.>|ã>–®«>ú8Ô>ì6û>Ê/?Ŷ!?¨2?ëA?LÒN?SñZ?Ywe?¸Pn?ælu?›¾z?è;~?IÞ?¯¢?Љ}?Å–y?ÀÑs?CEl?hÿb?UX?|K?©|=?É.?¬s?m¦ ?ž¨ñ>ò@Ê>s_¡>¡n>TÅ>‰˜ƒ=§=­¼ÿäÚ½ÝðC¾™€Œ¾M¶¾ÿ/Þ¾Q_¿³¿ñ%¿ù5¿'­D¿ÐñQ¿I®]¿¥Ìg¿ü9p¿ïv¿µË{¿Ò~¿Tü¿nH¿¦·|¿ÆNx¿ r¿j¿Ïf`¿WU¿Ø-H¿gÔ9¿ç*¿Ê¿¸¿äæç¾#À¾ˆä–¾,Y¾rù¾yH/½Eœ.=µÎ>þY>òÏ–>}@À>½ è>Á?Î$?Å*?þÌ9?!'H?^ U?Ÿa`?¸j?Šr?'Lx?íµ|? G?ü?ýÏ~?àÇ{?jév?µ=p?7Ñg?¬³]?ú÷Q? ´D?©6?Iù%?Û»?–h?¾ Þ>Úµ>ÆWŒ>…C>%<Ú=K–®<‰Bƒ½¸š¾wn¾K¡¾'-ʾŸ•ñ¾f ¿-k¿X*.¿îŠ=¿p‰K¿¹ X¿múb¿Al¿wÎs¿_”y¿ ˆ}¿¢¿¡Þ¿,=~¿ÇÀz¿Ûfu¿öHn¿ïme¿RæZ¿ÉÅN¿ý"A¿f2¿¿!¿±8¿±Iû¾•LԾ⫾Rø¾ðu.¾˜k®½<9i'¯=¯T.>è>ü²«>:=Ô>þ:û>¸1?•¸!?V2?sA?ÐÀN?‰òZ?bxe?’Qn?mu?¿z?/<~?\Þ?¢?7‰}?@–y? Ñs?]Dl?Sþb?@X?${K?{=?.?Ôq?x¤ ?€¤ñ>§<Ê>[¡>ê—n>¼>ä…ƒ=^ˆ­¼ùÙ½úC¾…Œ¾ª¶¾44Þ¾Sa¿ý´¿Üò%¿ºú5¿¦®D¿&óQ¿t¯]¿¢Íg¿Ë:p¿/çv¿!Ì{¿AÒ~¿[ü¿BH¿F·|¿4Nx¿Ir¿#j¿¯e`¿ U¿d,H¿ÌÒ9¿*¿ë¿¼ÿ¿ºâç¾ÏÀ¾à–¾ù"Y¾.ð¾$#/½›Á.=ù×> Y>hÔ–> À>çè>½?­&?„*?šÎ9?–(H?© U?¿b`?ªj?Lr?¸Lx?M¶|?ÍG?kü?ÄÏ~?sÇ{?Ìèv?æ@Öµ>HSŒ>Y”C>‘)Ú=“K®<.Uƒ½õ£¾.€n¾oO¡¾q1ʾ½™ñ¾[Ÿ ¿m¿™.¿€Œ=¿ÚŠK¿ú X¿ûb¿Bl¿.Ïs¿ä”y¿_ˆ}¿;¢¿ŽÞ¿æ<~¿NÀz¿Lou¿Hn¿æle¿åZ¿iÄN¿t!A¿¸2¿O½!¿Ã6¿ Eû¾UHÔ¾|¾«¾Îó¾¼l.¾ X¯½îÞa9:¯=ä].>…ì>c·«>zAÔ>?û>¦3?dº!?2?ûA?0ÂN?(ãZ?kye?lRn?:nu?Œ¿z?u<~?oÞ?o¢?äˆ}?»•y?TÐs?wCl??ýb?ÿX?#K?„y=?\.?ýo?ƒ¢ ?a ñ>]8Ê>–V¡>ÕŽn>Ú²>?sƒ=Ó­¼œ Ú½…C¾•‰Œ¾ ¶¾i8Þ¾Vc¿ä¶¿¤ô%¿_ü5¿$°D¿}ôQ¿Ÿ°]¿ Îg¿™;p¿Íçv¿ÅÆ{¿zÒ~¿aü¿H¿ç¶|¿£Mx¿†r¿1j¿d`¿ÀU¿ï*H¿1Ñ9¿U*¿±)¿Àý¿Þç¾{À¾›Û–¾ØY¾êæ¾Ïý.½ðæ.==á>@Y>ߨ–>Ô À>Üç>¸?Œ(?C*?5Ð9? *H?õ U?ßc`?œj?r?JMx?­¶|?ùG?eü?Ò~?Ç{?.èv?µ ¶>ÊNŒ>.‹C>ýÚ=Ü®<Ógƒ½2­¾D‰n¾ÞS¡¾¼5ʾÜñ¾P¡ ¿Ün¿O.¿Žx=¿EŒK¿;X¿–üb¿êBl¿äÏs¿i•y¿±ˆ}¿[¢¿{Þ¿ <~¿Ö¿z¿¢nu¿òRn¿Ýke¿æãZ¿ÃN¿ìA¿ 2¿€»!¿Õ4¿ŽAû¾DÔ¾º«¾Iヌc.¾mE¯½3Ãx¹£L¯=g.> ñ>É»«>ºEÔ>!Cû>”5?4¼!?±2?„ A?‘ÃN?^äZ?Dle?GSn?änu?Àz?»<~?‚Þ?O¢?‘ˆ}?6•y?Ïs?‘Bl?*üb?¿ X?¹‹K?v=?¦.?%n?Ž  ?Cœñ>4Ê>'R¡>¿…n>©>š`ƒ=Í®¼0Ú½»ŽC¾‡PŒ¾f¶¾Ÿ<Þ¾Xe¿Ë¸¿kö%¿þ5¿£±D¿ÓõQ¿Ê±]¿žÏg¿haY>VÝ–>(À>-àç>…þ?k*?*?ÐÑ9?+H?@U?ÿd`?Žj?Ñr?ÛMx? ·|?&H?^ü?dÒ~?cÌ{?çv?I;p?>Îg?+°]?øóQ?¯D?¼û5?óó%?(¶?Žb?È6Þ>W ¶>؇Œ>‚C>jÚ=$¶­Žõ>0À«>úIÔ>3Gû>‚7?¾!?_2? "A?ñÄN?”åZ?Mme?pHn?Žou?}Àz?=~?•Þ?/¢?>ˆ}?±”y?çÎs?ªAl?ûb?~ X?NŠK?ä‹=?d+.?Nl?™ž ?%˜ñ>È/Ê>¸M¡>©|n>a >õMƒ=…h®¼Ã0Ú½ç—C¾UŒ¾ñ×µ¾Ô@Þ¾[g¿±º¿2ø%¿¨ÿ5¿"³D¿)÷Q¿õ²]¿œÐg¿6=p¿ év¿Ç{¿ÚÏ~¿mü¿»G¿(¶|¿€Lx¿r¿Mj¿Pb`¿) U¿(H¿úÍ9¿×*¿ó%¿ø¿Jè¾ÒÀ¾®Ò–¾•Y¾bÔ¾$³.½š1/=Åó>‚&Y>Ìá–>|À>Wäç>?¥?À*?kÓ9?ô,H?ŒU?f`?€j?”r?mNx?k·|?SH?Xü?+Ò~?÷Ë{?eïv?{:p?@Íg?¯]?¢òQ?®D?ú5?,ò%?A´?Œ`?“2Þ>ù¶>ZƒŒ>{öC>ÖñÙ=mk­<ƒ½«¿¾o›n¾¼\¡¾Q>ʾ¦ñ¾:¥ ¿‹r¿¼.¿²{=¿±{K¿‘ÿW¿¾þb¿¶Dl¿PÑs¿s–y¿W‰}¿›¢¿UÞ¿<~¿å¾z¿Nmu¿=Qn¿üwe¿òZ¿GÀN¿ÛA¿°2¿á·!¿ù0¿j9û¾•;Ô¾H±«¾@æ¾Q.¾3 ¯½v.¹Îr®=_û->ú>–Ä«>;NÔ>EKû>p9?Ò¿!? 2?•#A?RÆN?ÊæZ?Vne?KIn?gu?õÀz?G=~?©Þ?¢?ì‡}?,”y?1Îs?Ä@l?úb?= X?ãˆK?RŠ=?®).?±ƒ?¤œ ?”ñ>}+Ê>II¡>”sn>$—>P;ƒ=<³®¼WCÚ½¡C¾ƒYŒ¾Nܵ¾` Þ¾]i¿˜¼¿ùù%¿L6¿ ´D¿øQ¿ ´]¿™Ñg¿>p¿§év¿ È{¿Ð~¿ü¿ŽG¿Èµ|¿îKx¿?r¿[j¿0a`¿Ý U¿‘&H¿_Ì9¿*¿$¿ü¿ è¾Ð>À¾7Ζ¾tþX¾Ë¾Ï.½ïV/=ý>£/Y>Cæ–>ÑÀ>èç>}?„?”*?Õ9?i.H?×U?>g`?rj?Vr?þNx?Ë·|?€H?Rü?ñÑ~?‹Ë{?Çîv?¹Dp?BÌg?Õ­]?LñQ?“¬D?sø5?eð%?Z²?‰^?^.Þ>œ¶>Ü~Œ>PíC>ÍÝÚ=µ ­<Ÿƒ½èȾ…¤n¾+a¡¾›Bʾ6ªñ¾/§ ¿bt¿r.¿D}=¿}K¿ÒX¿ñb¿œEl¿Òs¿ø–y¿ª‰}¿»¢¿AÞ¿Í;~¿l¾z¿¤lu¿cPn¿óve¿ÛðZ¿ÄÑN¿RA¿2¿¶!¿ /¿X5û¾T7Ծ⬫¾¼á¾êG.¾• ¯½—©¹k…®=”.>¯À>ýÈ«>{RÔ>WOû>^;?¢Á!?º2?%A?²ÇN?èZ?_oe?%Jn?Çgu?úºz?=~?¼Þ?ï¡?™‡}?¦“y?zÍs?Þ?l?íøb?ü X?y‡K?Àˆ=?ø'.?Ú?€µ ?èñ>3'Ê>ÚD¡>~jn>ç>ª(ƒ=óý®¼ëUÚ½>ªC¾^Œ¾¬àµ¾•Þ¾ÕO¿¾¿Àû%¿ñ6¿¶D¿ÕùQ¿Kµ]¿—Òg¿Ô>p¿Eêv¿vÈ{¿MÐ~¿#ü¿ÆI¿iµ|¿]Kx¿|r¿hj¿``¿’ U¿%H¿ÄÊ9¿Y*¿5"¿¿öè¾|:À¾é—¾SõX¾ÚÁ¾zh.½D|/=L>Ä8Y>ºê–>%À>«ìç>y?c?S *?žÀ9?Ý/H?"U?^h`?dj?r?Ox?*¸|?¬H?Kü?¸Ñ~? Ë{?)îv?ëCp?ØØg?ª¬]?öïQ?«D?Ïö5?î%?t°?‡\?(*Þ>>üµ>^zŒ>$äC>9ËÚ=ÂÕ°.¾øú®½r—Ƹ ˜®=È .>4Å>‘«>»VÔ>iSû>L=?qÃ!?g2?¦&A?ÉN?6éZ?hpe?Kn?qhu?s»z?:~?ÏÞ?Ï¡?F‡}?!“y?ÄÌs?ø>l?Ø÷b?¼X?†K?.‡=?B&.?€?‹³ ?6Äñ>è"Ê>k@¡>han>ª„>ƒ=«H¯¼~hÚ½i³C¾bŒ¾ åµ¾ÊÞ¾ØQ¿Y¦¿‡ý%¿•6¿·D¿+ûQ¿v¶]¿”Óg¿¢?p¿ãêv¿âÈ{¿‡Ð~¿)ü¿šI¿%º|¿ËJx¿ºr¿vj¿ð^`¿FU¿§#H¿(É9¿š*¿V ¿¿Íè¾'6À¾r—¾IiY¾—¸¾%C.½™¡/=>åAY>0ï–>y#À>Õðç>u?B? *?:Â9?^H?nU?~i`?Vj?Ûr?!Px?Џ|?ÙH?Eü?~Ñ~?´Ê{?Œív?Cp?Û×g?»]? îQ?•©D?*õ5?Öì%?®?„Z?ó%Þ>à÷µ>àuŒ>ùÚC>¥¸Ú= ‹°<“Å‚½aÛ¾°¶n¾j¡¾0Kʾr²ñ¾« ¿x¿ß.¿h€=¿ñK¿SX¿/ób¿;l¿±És¿˜y¿OŠ}¿û¢¿Þ¿A;~¿{½z¿Pku¿®Nn¿áte¿oîZ¿ÏN¿B-A¿¤"2¿s²!¿/+¿4-û¾Ô.Ô¾¤«¾²Ø¾€5.¾Z讽i·w¸¦ª®=ý.>¸É>~•«>½ Ô>zWû>:??AÅ!?2?.(A?sÊN?lêZ?rqe?ÚKn?iu?ì»z?X:~?ÛÝ?¯¡?ó†}?œ’y?Ìs?>l?Äöb?{X?£„K?…=?Œ$.?+~?–± ?Àñ>iYÊ>ü;¡>RXn>n{>`ƒ=b“¯¼{Ú½”¼C¾ýfŒ¾héµ¾Þ¾ÛS¿@¨¿ñæ%¿:6¿¹D¿üQ¿¡·]¿’Ôg¿p@p¿ëv¿NÉ{¿ÀÐ~¿0ü¿mI¿Æ¹|¿Rx¿÷r¿„j¿Ð]`¿ûU¿2"H¿Ç9¿Ü*¿w¿ ¿£þç¾Ó1À¾üý–¾(`Y¾F.¾Ð.½îÆ/=Ô>KY>§ó–>Î'À>ÿôç>q?"?Ñ *?ÕÃ9?ÓH?ûU?j`?Hj?r?²Px?é¸|?I??ü?EÑ~?HÊ{?îìv?NBp?ÝÖg?Tº]?˜ÿQ?¨D?…ó5?ë%?¦¬?‚X?¾!Þ>ƒóµ>bqŒ>ÎÑC>¦Ú=T@°<8Ø‚½ f¾Æ¿n¾wn¡¾{Oʾ‘¶ñ¾­ ¿èy¿• .¿ú=¿\K¿”X¿Dôb¿ü;l¿gÊs¿h‘y¿¢Š}¿£¿Þ¿û:~¿½z¿¥ju¿ÔMn¿×se¿9íZ¿£ÍN¿º+A¿ö 2¿qÉ!¿A)¿")û¾”*Ô¾®Ÿ«¾.Ô¾L,.¾½Õ®½ÞÄ·D½®=2 .>=Î>噫>ý$Ô>È#û>(A?Ç!?Â2?¶)A?ÔËN?¢ëZ?{re?µLn?Æiu?d¼z?Ÿ:~?îÝ?E£? †}?’y?WËs?+=l?¯õb?:X?9ƒK? „=?Õ".?T|?¡¯ ?ú»ñ>UÊ>7¡>=On>1r>»ð‚=Þ¯¼¦Ú½ÀÅC¾{kŒ¾Åíµ¾5Þ¾ÝU¿&ª¿¸è%¿\ñ5¿›ºD¿×ýQ¿Ì¸]¿Õg¿?Ap¿ìv¿ºÉ{¿úÐ~¿6ü¿@I¿f¹|¿rQx¿r¿’j¿°\`¿¯U¿½ H¿òÅ9¿*¿—¿ ¿yúç¾-À¾…ù–¾WY¾%¾ø/½Cì/=">'TY>ø–>",À>)ùç>m ??*?pÅ9?H H?GU?V\`?:j?`r?DQx?H¹|?2I?8ü? Ñ~?ÜÉ{?Pìv?€Ap?ßÕg?*¹]?BþQ?»D?áñ5?Hé%?¿ª?V?ˆÞ>%ïµ>ålŒ>¢ÈC>~“Ú=œõ¯<ÝꂽIo¾aLn¾ær¡¾ÅSʾ¯ºñ¾¯ ¿À{¿L".¿Œƒ=¿Ç‚K¿ÕX¿Xõb¿âÂÒ>Lž«>=)Ô>Ú'û>¥(?ßÈ!?o 2??+A?4ÍN?ØìZ?„se?Mn?pju?ݼz?å:~?Þ?%£?¼Š}?’‘y?¡Ês?EÔPÊ>Üo¡>'Fn>ôh>Þ‚=Ñ(°¼9 Ú½ëÎC¾ùoŒ¾#òµ¾k Þ¾àW¿ ¬¿€ê%¿ó5¿ž§D¿-ÿQ¿ö¹]¿Ög¿ Bp¿¼ìv¿&Ê{¿3Ñ~¿=ü¿I¿¹|¿àPx¿Ûr¿”j¿[`¿dU¿IH¿VÄ9¿^*¿¸¿ ¿Oöç¾+)À¾õ–¾æMY¾¾¾®Ò/½.=[+>H]Y>”ü–>v0À>Sýç>h ?à?O*? Ç9?½!H?’U?v]`?8j?"r?ÕQx?¨¹|?_I?2ü?ÒÐ~?pÉ{?²ëv?±@p?âÔg?ÿ·]?ìüQ?”¹D?¾6?€ç%?Ù¨?}T?SÞ>Çêµ>ghŒ>w¿C>ë€Ú=媯<‚ý‚½…x¾wUn¾—:¡¾Xʾ;ñ¾ù° ¿—}¿$.¿…=¿1„K¿X¿möb¿É=l¿ÔËs¿r’y¿Ù†}¿¥¡¿áÝ¿n:~¿¼z¿Qiu¿Ln¿Åqe¿ÍêZ¿âÊN¿©(A¿œ2¿ÒÅ!¿Ö?¿ÂXû¾"Ծᖫ¾$˾â.¾‚°®½¯H8â®=›2.>F×>²¢«>~-Ô>ì+û>“*?á±!?"2?Ç,A?”ÎN?îZ?te?jNn?ku?U½z?+;~?Þ?£?iŠ}?,˜y?êÉs?^;l?†ób?¸X?c€K?ç€=?i.?¥x?·« ?¾³ñ>ŠLÊ>mk¡>Œ¹n>·_>qË‚=ˆs°¼Í²Ú½ØC¾vtŒ¾öµ¾ $Þ¾âY¿ô­¿Gì%¿¦ô5¿©D¿4îQ¿!»]¿‹×g¿ÜBp¿Zív¿’Ê{¿lÑ~¿Cü¿çH¿¨¸|¿OPx¿r¿¢j¿Øi`¿U¿ÔH¿»Â9¿Ÿ *¿Ù¿¿%òç¾Ö$À¾˜ð–¾ÅDY¾z¾Y­/½e7.=¬µ>ifY> —>Ë4À>}è>d?¿?*?§È9?2#H?ÞU?–^`?*j?|r?gRx?º|?ŒI?+ü?™Ð~?É{?ëv?ã?p?äÓg?Ô¶]?–ûQ?¸D?6?þ%?ò¦?zR?Þ>jæµ>écŒ>L¶C>WnÚ=.`¯<'ƒ½Â¾Œ^n¾?¡¾Ž!ʾëÂñ¾î² ¿n¿¸%.¿°†=¿œ…K¿WX¿÷b¿¯>l¿‹Ìs¿÷’y¿,‡}¿Å¡¿ÕÞ¿(:~¿™»z¿§hu¿DKn¿¼pe¿—éZ¿‚ÉN¿!'A¿î2¿Ä!¿è=¿°Tû¾XÔ¾z’«¾ Æ¾®.¾ä®½@¯8õ®=Ï;.>ËÛ>§«>¾1Ô>þ/û>,?°³!?Í 2?O.A?õÏN?CïZ?–ue?DOn?Äku?νz?q;~?(Þ?å¢?Š}?§—y?öÒs?x:l?ròb?xX?ù~K?U=?³.?Îv?© ? ¯ñ>?HÊ>ÿf¡>v°n> Õ≯‚=?¾°¼aÅÚ½BáC¾ôxŒ¾Þúµ¾Õ(Þ¾å[¿Ú¯¿î%¿Jö5¿›ªD¿ŠïQ¿L¬]¿ˆØg¿ªCp¿øív¿þÊ{¿¦Ñ~¿Iü¿ºH¿H¸|¿½Ox¿Vr¿°j¿¸h`¿‹U¿_H¿ Á9¿à *¿ú¿¿ûí羂 À¾!ì–¾¤;Y¾7 ¾ˆ/½»\.=ð¾>tòX>—>9À>§è>`?ž!?Í*?BÊ9?§$H?) U?µ_`?j??r?/Kx?fº|?¸I?%ü?_Ð~?˜È{?wêv??p?çÒg?©µ]?@úQ?—¶D?u6?Pü%?¿?wP?èÞ> âµ>k_Œ> ­C>Ã[Ú=v¯<Í"ƒ½ÿо¢gn¾uC¡¾Ù%ʾŽñ¾ã´ ¿F¿n'.¿Bˆ=¿‡K¿˜ X¿–øb¿•?l¿AÍs¿}“y¿‡}¿å¡¿ÂÞ¿£=~¿ »z¿ýgu¿jJn¿³oe¿aèZ¿!ÈN¿™%A¿A2¿4Â!¿ú;¿ŸPû¾ÑSÔ¾_Ê«¾¾y.¾G‹®½ýÎù8º¯=E.>Pà>««>þ5Ô>4û>p.?€µ!?{2?×A?UÑN?yðZ?Ÿve?Pn?nlu?G¾z?·;~?;Þ?Å¢?ĉ}?"—y?@Òs?åEl?]ñb?7X?Ž}K?Ã}=?ü.?÷t?ͧ ?‚«ñ>õCÊ>b¡>a§n>ÐË> ¥ƒ=÷±¼ô×Ú½mêC¾r}Œ¾<ÿµ¾ -Þ¾ç]¿Á±¿Õï%¿ï÷5¿¬D¿àðQ¿w­]¿óËg¿yDp¿•îv¿iË{¿ßÑ~¿Pü¿ŽH¿é·|¿,Ox¿“r¿¾j¿™g`¿?U¿Þ.H¿„¿9¿! *¿¿¿Ñéç¾.À¾«ç–¾ƒ2Y¾óÿ¾®b/½‚.=4È>•ûX>ÐÌ–>s=À>Ñ è>\?}#?Œ*?ÞË9?&H?u U?Õ``?j?r?ÁKx?ªµ|?åI?ü?&Ð~?+È{?Ùév?F>p?éÑg?~´]?êøQ?µD?Ñ6?ˆú%?1½?ÿi?³ Þ>®Ýµ>íZŒ>õ£C>0IÚ=¿Ê®Ôä>毫>>:Ô>"8û>^0?O·!?(2?_A?µÒN?¯ñZ?¨we?ùPn?mu?¿¾z?ý;~?OÞ?¥¢?q‰}?–y?ŠÑs?ÿDl?ÿb?öÿW?#|K?1|=?F.?s?Ø¥ ?d§ñ>ª?Ê>!^¡>Kžn>“Â>û’ƒ=êS­¼ˆêÚ½˜óC¾ðŒ¾š¶¾@1Þ¾ê_¿¨³¿ñ%¿“ù5¿™­D¿6òQ¿¢®]¿ðÌg¿::p¿3ïv¿ÕË{¿Ò~¿Vü¿aH¿‰·|¿›Nx¿Ñr¿Ìj¿yf`¿ôU¿i-H¿íÓ9¿b*¿<¿!¿§åç¾ÙÀ¾4ã–¾a)Y¾¯ö¾Y=/½e§.=xÑ>¶Y>FÑ–>uÀ>û è>X?\%?J*?yÍ9?'H?À U?õa`?j?Är?RLx? ¶|?­G?ü?ìÏ~?¿Ç{?;év?w=p?ëÐg?S³]?”÷Q?š³D?,6?Áø%?J»?ýg?'BÞ>PÙµ>oVŒ>ÉšC>œ6Ú=€®<Hƒ½y¾Îyn¾SL¡¾n.ʾٖñ¾û ¿ºk¿Û*.¿f‹=¿Ü‰K¿ X¿¿úb¿bAl¿®Îs¿‡”y¿$ˆ}¿%¢¿›Þ¿=~¿£Àz¿Ãou¿µHn¿ me¿õåZ¿`ÅN¿ˆ"A¿æ2¿•¾!¿8¿{Hû¾QKÔ¾’Á«¾úö¾2s.¾ f®½<£G9õ,¯=mW.>Yé>L´«>~>Ô>4<û>L2?¹!?Ö2?èA?9ÁN?åòZ?±xe?ÓQn?Âmu?8¿z?C<~?bÞ?…¢?‰}?–y?ÔÐs?Dl?þb?àX?¸zK?Ÿz=?.?Hq?㣠?E£ñ>`;Ê>²Y¡>5•n>V¹>V€ƒ=¡ž­¼‘þÙ½ÄüC¾n†Œ¾÷¶¾u5Þ¾ía¿Žµ¿dó%¿8û5¿¯D¿ŒóQ¿Í¯]¿îÍg¿;p¿^çv¿AÌ{¿RÒ~¿\ü¿4H¿*·|¿ Nx¿r¿Új¿Ye`¿¨U¿õ+H¿RÒ9¿Ž*¿\¿%ÿ¿}áç¾…À¾½Þ–¾@ Y¾kí¾/½ºÌ.=¼Ú>× Y>½Õ–>É À>Ùç>T?;'? *?Ï9?)H? U?c`?òj?†r?äLx?i¶|?ÚG?iü?³Ï~?SÇ{?èv?©öQ?²D?ˆþ5?úö%?d¹?úe?ò=Þ>Ŷ>ñQŒ>ž‘C>$Ú=P5®<¼Zƒ½µ¦¾ã‚n¾ÂP¡¾¹2ʾ÷šñ¾ðŸ ¿‘m¿.¿øŒ=¿F‹K¿Z X¿Ôûb¿HBl¿dÏs¿ •y¿wˆ}¿E¢¿ˆÞ¿Ñ<~¿+Àz¿ou¿‹Sn¿—le¿¿äZ¿ÄN¿ÿ A¿82¿Å¼!¿06¿iDû¾GÔ¾,½«¾uò¾þi.¾R¯½m9’?¯=¢`.>Ýí>³¸«>¾BÔ>F@û>:4?îº!?„2?pA?™ÂN?„ãZ?ºye?­Rn?lnu?°¿z?Š<~?uÞ?e¢?ˈ}?“•y?Ðs?2Cl?íüb? X?·ŒK? y=?Ù.?po?î¡ ?'Ÿñ>7Ê>CU¡> Œn>°>±mƒ=Yé­¼%Ú½KˆC¾ìŠŒ¾U ¶¾ª9Þ¾ïc¿u·¿+õ%¿Üü5¿–°D¿âôQ¿ø°]¿ìÎg¿×;p¿üçv¿åÆ{¿‹Ò~¿cü¿H¿Ë¶|¿xMx¿Lr¿éj¿:d`¿]U¿€*H¿¶Ð9¿Ï*¿")¿)ý¿SÝç¾0À¾GÚ–¾Y¾'侯ò.½ò.=ä>øY>4Ú–>À>AÝç> ý?)?È*?¯Ð9?z*H?WU?5d`?äj?Ir?uMx?ɶ|?H?cü?ŒÒ~?çÆ{?ÿçv?Ú;p?ðÎg?ý°]?èôQ?°D?ãü5?3õ%?}·?øc?¼9Þ>h ¶>ÿŠŒ>sˆC>tÚ=™ê­bò>½«>ÿFÔ>XDû>(6?¾¼!?12?ù A?úÃN?ºäZ?“le?ˆSn?ou?(Àz?Ð<~?ˆÞ?F¢?yˆ}?•y?gÏs?LBl?Øûb?_ X?M‹K?þŒ=?#.?™m?ùŸ ? ›ñ>Ë2Ê>ÕP¡> ƒn>ݦ> [ƒ=4®¼¹#Ú½w‘C¾ÞQŒ¾³¶¾à=Þ¾òe¿\¹¿òö%¿þ5¿²D¿9öQ¿#²]¿éÏg¿¥ Y>ªÞ–>rÀ>káç>ÿ?T?‡*?KÒ9?î+H?£U?Te`?Öj? r?Nx?(·|?4H?\ü?SÒ~?CÌ{?açv? ;p?òÍg?Ò¯]?’óQ?¯D??û5?ló%?—µ?õa?‡5Þ> ¶>†Œ>ëüC>áþÙ=៭<€ƒ½/¹¾•n¾ŸY¡¾N;ʾ4£ñ¾Û£ ¿@q¿ˆ.¿˜z=¿²zK¿ÛX¿üýb¿Dl¿ÐÐs¿–y¿‰}¿…¢¿bÞ¿E<~¿:¿z¿Åmu¿×Qn¿¶xe¿êòZ¿?ÁN¿îA¿Ý2¿&¹!¿T2¿F<û¾>Ô¾_´«¾l龕W.¾D-¯½(CH¹¼e®= s.>çö>€Á«>?KÔ>jHû>8?¾!?ß2?"A?ZÅN?ðåZ?œme?±Hn?Àou?¡Àz?=~?›Þ?&¢?&ˆ}?‰”y?±Îs?fAl?Äúb? X?â‰K?l‹=?â*.?Ák?ž ?ë–ñ>€.Ê>fL¡>ôyn> >gHƒ=È~®¼L6Ú½¢šC¾\VŒ¾>Ùµ¾BÞ¾ôg¿B»¿ºø%¿%6¿”³D¿÷Q¿N³]¿çÐg¿t=p¿8év¿¾Ç{¿ëÏ~¿ü¿®G¿ ¶|¿ULx¿Çr¿j¿úa`¿Æ U¿–'H¿€Í9¿R*¿d%¿`¿ 辇À¾YÑ–¾ÝY¾ Ñ¾¨.½º:)Y>!ã–>ÇÀ>•åç>?4?[*?æÓ9?c-H?îU?tf`?Èj?Îr?˜Nx?ˆ·|?`H?Vü?Ò~?×Ë{?6ïv?=:p?õÌg?§®]?<òQ?Ÿ­D?šù5?¤ñ%?°³?ó_?R1Þ>¬¶>‚Œ>ÀóC>×êÚ=*U­<«’ƒ½l¾$žn¾^¡¾˜?ʾR§ñ¾Ð¥ ¿s¿?.¿*|=¿|K¿ðÿW¿ÿb¿ûDl¿‡Ñs¿›–y¿p‰}¿¥¢¿OÞ¿ÿ;~¿Á¾z¿mu¿üPn¿­we¿´ñZ¿Þ¿N¿fA¿02¿W·!¿f0¿48û¾P:Ô¾ø¯«¾èä¾`N.¾§¯½Jå"¹Zx®=þ->kû>æÅ«>OÔ>{Lû>:?\À!?Œ2? $A?»ÆN?&çZ?¥ne?ŒIn?Pgu?Áz?\=~?®Þ?¢?Ó‡}?”y?úÍs?@l?¯ùb?Þ X?wˆK?Û‰=?,).?%ƒ?œ ?Í’ñ>6*Ê>÷G¡>ßpn>c”>Á5ƒ=É®¼àHڽΣC¾ÚZŒ¾œÝµ¾¡ Þ¾÷i¿)½¿ú%¿Ê6¿µD¿åøQ¿y´]¿åÑg¿C>p¿Öév¿*È{¿%Ð~¿ü¿åI¿¬µ|¿ÃKx¿r¿j¿Ú``¿{ U¿"&H¿åË9¿“*¿…#¿e¿ã 辆=À¾ãÌ–¾¼ûX¾\Ⱦ°‚.½b/=Ëÿ>[2Y>˜ç–>À>¿éç>?? *?}¿9?Ø.H?:U?”g`?ºj?r?*Ox?ç·|?H?Pü?àÑ~?kË{?˜îv?|Dp?÷Ëg?|­]?æðQ?!¬D?ö÷5?Ýï%?ɱ?ð]?-Þ>Oÿµ>…}Œ>”êC>DØÚ=6 ±Â>LÊ«>¿SÔ>Pû>ñ;?,Â!?92?’%A?ÈN?\èZ?®oe?fJn?úgu?»z?¢=~?ÁÞ?æ¡?€‡}?“y?DÍs?™?l?›øb? X? ‡K?Iˆ=?v'.?N?ë´ ?®Žñ>ë%Ê>ˆC¡>Égn>'‹>#ƒ=6¯¼t[Ú½ù¬C¾X_Œ¾ùáµ¾ÖÞ¾oP¿¿¿Hü%¿n6¿‘¶D¿;úQ¿¤µ]¿âÒg¿?p¿têv¿–È{¿^Ð~¿%ü¿¹I¿hº|¿1Kx¿Br¿ j¿º_`¿/ U¿­$H¿IÊ9¿Ô*¿¦!¿i¿¹è¾29À¾”—¾›òX¾¿¾Z].½d‡/= >};Y>ì–>o À>éíç>?ò?Ù *?Á9?YH?…U?´h`?¬j?Sr?»Ox?G¸|?ºH?Iü?§Ñ~?ÿÊ{?úív?®Cp?Øg?Q¬]?ïQ?¢ªD?Qö5?î%?ã¯?î[?ç(Þ>ñúµ>yŒ>iáC>°ÅÚ=¿°<|¸‚½åÔ¾O°n¾ìf¡¾-HÊ¾Ž¯ñ¾º© ¿Æv¿«.¿N=¿ó~K¿rX¿mòb¿t:l¿óÒs¿¥—y¿Š}¿å¢¿)Þ¿r;~¿Ð½z¿Çku¿HOn¿›ue¿IïZ¿ûÏN¿V.A¿Ô 2¿¸³!¿Š,¿0û¾Ð1Ô¾+§«¾ÞÛ¾÷;.¾lõ®½S°¸•®=†.>ŒÆ>g’«>ÿWÔ>ŸTû>ß=?ûÃ!?ç2?'A?|ÉN?’éZ?¸pe?AKn?¤hu?—»z?':~?ÔÞ?Å¡?-‡}?ú’y?ŽÌs?³>l?†÷b?\X?¢…K?·†=?¿%.?v?ö² ?üÂñ>¡!Ê>?¡>³^n>ê>wƒ=î^¯¼nÚ½$¶C¾ÖcŒ¾Wæµ¾ Þ¾qR¿ê¦¿þ%¿6¿¸D¿‘ûQ¿Ï¶]¿àÓg¿à?p¿ëv¿É{¿˜Ð~¿+ü¿ŒI¿ º|¿iRx¿€r¿.j¿š^`¿ãU¿8#H¿®È9¿*¿Ç¿m¿è¾Ý4À¾—¾fY¾Ôµ¾8.½¹¬/=S>žDY>…ð–>Ä$À>òç> ?Ñ?— *?´Â9?ÎH?U?Ói`?žj?r?LPx?¦¸|?æH?Cü?mÑ~?“Ê{?]ív?ßBp?×g?&»]?:îQ?#©D?­ô5?Oì%?ü­?ëY?²$Þ>“öµ>ŠtŒ>>ØC>³Ú=Èt°Ë>Ζ«>"Ô>±Xû>Í??ËÅ!?”2?£(A?ÜÊN?ÈêZ?Áqe?Ln?Niu?¼z?m:~?áÝ?¥¡?Ú†}?u’y?×Ës?Í=l?röb?X?7„K?%…=? $.?Ÿ}?± ?Þ¾ñ>"XÊ>ª:¡>Un>­x>Òý‚=¥©¯¼›€Ú½P¿C¾ShŒ¾µêµ¾AÞ¾tT¿Ñ¨¿yç%¿·6¿Ž¹D¿çüQ¿ú·]¿ÞÔg¿®@p¿°ëv¿nÉ{¿ÑÐ~¿2ü¿`I¿©¹|¿ØQx¿%r¿<j¿z]`¿˜U¿Ã!H¿Ç9¿V*¿è¿q ¿eý羉0À¾§ü–¾o]Y¾ƒ+¾°.½Ò/=–>¿MY>ûô–>)À>=öç> ?°?V*?PÄ9?BH?^U?Œ[`?j?×r?ÞPx?¹|?I?=ü?4Ñ~?'Ê{?¿ìv?Bp?‘Ög?û¹]?2ÿQ?¤§D?ó5?‡ê%?¬?èW?} Þ>6òµ> pŒ>ÏC>‰ Ú=*°<ÆÝ‚½Ìh¾Fn¾Éo¡¾ÂPʾ˷ñ¾¤­ ¿uz¿!.¿r‚=¿ÈK¿ôX¿–ôb¿A–Ï>5›«>A&Ô>ÿ$û>»A?šÇ!?B2?+*A?=ÌN?þëZ?Êre?öLn?øiu?ˆ¼z?´:~?ôÝ?;£?‡†}?ï‘y?!Ës?æ×SÊ>ùr¡>ˆLn>po>-ë‚=\ô¯¼/“Ú½{ÈC¾ÑlŒ¾ïµ¾vÞ¾wV¿·ª¿@é%¿Úñ5¿ »D¿=þQ¿%¹]¿ÛÕg¿|Ap¿Mìv¿ÚÉ{¿ Ñ~¿8ü¿3I¿J¹|¿FQx¿cr¿>j¿[\`¿LU¿N H¿wÅ9¿˜*¿ ¿u ¿;ùç¾5,À¾1ø–¾NTY¾?"¾ãì/½c÷/=Ú$>àVY>rù–>l-À>gúç> ??*?ëÅ9?· H?ªU?¬\`?Žj?šr?oQx?e¹|?@I?6ü?ûÐ~?»É{?!ìv?BAp?”Õg?Ѹ]?ÜýQ?¡ºD?dñ5?Àè%?.ª?æU?GÞ>Øíµ>ŽkŒ>çÅC>õÚ=Y߯Ô>›Ÿ«>‚*Ô>)û>9)?iÉ!?ï 2?´+A?ÍN?4íZ?Óse?ÐMn?£ju?½z?ú:~?Þ?£?£Š}?j‘y?jÊs?OÊ>Šn¡>í¿n>3f>ˆØ‚=?°¼Â¥Ú½§ÑC¾OqŒ¾p󵾬!Þ¾yX¿ž¬¿ë%¿~ó5¿¨D¿’ÿQ¿Oº]¿ÙÖg¿KBp¿ëìv¿FÊ{¿DÑ~¿?ü¿I¿ë¸|¿µPx¿¡r¿Lj¿¢j`¿U¿ÚH¿ÜÃ9¿Ù *¿*¿y¿õç¾à'À¾ºó–¾-KY¾û¾ŽÇ/½0.=.>`Y>èý–>Á1À>‘þç> ?o?Ô*?†Ç9?,"H?õU?Ë]`?€j?ôr?Rx?Ĺ|?lI?0ü?ÁÐ~?OÉ{?ƒëv?t@p?–Ôg?¦·]?†üQ?"¹D?A6?ùæ%?H¨?ãS?Þ>zéµ>gŒ>¼¼C>b{Ú=¢”¯<ƒ½F{¾,Xn¾é;¡¾WYʾÀñ¾Ž± ¿$~¿„$.¿–…=¿„K¿vX¿¿öb¿ >l¿ Ìs¿š’y¿ò†}¿®¡¿ÜÝ¿Z:~¿î»z¿iu¿ÞKn¿vqe¿qêZ¿yÊN¿5(A¿2¿HÅ!¿B?¿ŒWû¾Ï Ô¾‘•«¾Ìɾ$.¾öª®½·7u8 è®=Y5.>ŸØ>¤«>Â.Ô>#-û>'+?k²!?"2?<-A?ýÎN?jîZ?Üte?«Nn?Mku?y½z?@;~?Þ?û¢?PŠ}?˜y?´És?;l?4ób?YX?÷K?o€=?æ.?x?"« ?„²ñ>CKÊ>j¡>×¶n>‰Û>ãÅ‚=ˉ°¼V¸Ú½ÒÚC¾ÍuŒ¾Î÷µ¾á%Þ¾|Z¿…®¿Ïì%¿#õ5¿©D¿šîQ¿z»]¿Ö×g¿Cp¿‰ív¿²Ê{¿~Ñ~¿Eü¿ÚH¿‹¸|¿$Px¿Þr¿Zj¿‚i`¿sU¿eH¿@Â9¿ *¿J¿}¿çð羌#À¾Cï–¾ BY¾¸¾9¢/½…B.=o¸>!iY>_—>6À>»è>ü?N ?“*?"É9?¡#H?AU?ë^`?rj?¶r?ÉJx?#º|?™I?)ü?ˆÐ~?ãÈ{?åêv?¥?p?™Óg?{¶]?0ûQ?¤·D?œ6?ý%?a¦?áQ?ÜÞ>åµ>’bŒ>³C>ÎhÚ=ëI¯<¶ƒ½ƒ„¾Aan¾X@¡¾Ö"ʾ%Äñ¾ƒ³ ¿û¿;&.¿(‡=¿†K¿¶X¿Ô÷b¿ô>l¿ÁÌs¿“y¿E‡}¿Î¡¿ÏÞ¿:~¿u»z¿thu¿Kn¿mpe¿;éZ¿ÉN¿¬&A¿n2¿yÃ!¿T=¿zSû¾ÍVÔ¾+‘«¾Gžð .¾Y˜®½™WÅ8¨ú®=Ž>.>$Ý>h¨«>3Ô>51û>-?:´!?M 2?Ä.A?^ÐN? ïZ?åue?…On?÷ku?ò½z?†;~?.Þ?Ü¢?þ‰}?—y?ÀÒs?3:l?òb?X?Œ~K?Ý~=?0.?Bv?-© ?f®ñ>øFÊ>¬e¡>Á­n>LÒ>·²ƒ=‚Ô°¼éÊÚ½ýãC¾KzŒ¾+üµ¾*Þ¾~\¿k°¿–î%¿Çö5¿ «D¿ðïQ¿¥¬]¿ÔØg¿èCp¿'îv¿Ë{¿·Ñ~¿Kü¿­H¿,¸|¿’Ox¿r¿hj¿ch`¿(U¿ä/H¿¥À9¿[ *¿k¿¿½ìç¾8À¾Íê–¾ë8Y¾t¾ä|/½Úg.=³Á>,õX>Ö—>i:À>åè>ø?-"?R*?½Ê9?%H?Œ U? ``?dj?yr?ZKx?gµ|?ÅI?#ü?NÐ~?wÈ{?Hêv?×>p?›Òg?Pµ]?ÚùQ?%¶D?ø6?Èû%?‡¾?ÞO?§Þ>¿àµ>^Œ>eªC>:VÚ=3ÿ®<[(ƒ½À¾Wjn¾ÇD¡¾ 'ʾ×ñ¾xµ ¿Ò¿ñ'.¿ºˆ=¿s‡K¿÷ X¿èøb¿Ú?l¿wÍs¿¤“y¿—‡}¿ï¡¿¼Þ¿Ž=~¿üºz¿Êgu¿)Jn¿doe¿èZ¿¸ÇN¿$%A¿Á2¿ªÁ!¿f;¿hOû¾RԾɫ¾ÂÀ¾».¾»…®½« 9F ¯=ÂG.>¨á>Ϭ«>B7Ô>G5û>/? ¶!?û2?LA?¾ÑN?ÖðZ?îve?_Pn?¡lu?j¾z?Ì;~?AÞ?¼¢?«‰}?ú–y? Òs? El? ñb?×X?"}K?K}=?z.?jt?8§ ?Hªñ>®BÊ>>a¡>¬¤n>É> ƒ=v­¼}ÝÚ½(íC¾É~Œ¾‰¶¾L.Þ¾^¿R²¿]ð%¿lø5¿Œ¬D¿FñQ¿Ð­]¿>Ìg¿¶Dp¿Äîv¿ŠË{¿ðÑ~¿Rü¿€H¿Ì·|¿Ox¿Zr¿vj¿Cg`¿ÝU¿o.H¿Õ9¿œ*¿Œ¿…¿“èç¾ãÀ¾Væ–¾Ê/Y¾0ý¾W/½/.=÷Ê>MþX>$Ζ>½>À> è>ó? $?*?XÌ9?Š&H?Ø U?+a`?Vj?;r?ìKx?ǵ|?ŽG?ü?Ð~? È{?ªév?>p?Ñg?%´]?„øQ?§´D?S6?ú%? ¼?fi?r Þ>aܵ>–YŒ>9¡C>§CÚ=|´®<;ƒ½ü–¾msn¾6I¡¾k+ʾõ“ñ¾›œ ¿ªƒ¿§).¿LŠ=¿ÝˆK¿8 X¿ýùb¿À@l¿.Îs¿)”y¿ê‡}¿¢¿©Þ¿H=~¿÷Àz¿ gu¿NIn¿[ne¿ÏæZ¿XÆN¿›#A¿2¿Ú¿!¿y9¿VKû¾MNÔ¾©Ä«¾&ú¾†û-¾s®½‰g-9ã¯=÷P.>-æ>5±«>‚;Ô>Y9û>ñ0?Ù·!?¨2?ÔA?AÀN? òZ?÷we?:Qn?Kmu?ã¾z?<~?TÞ?œ¢?X‰}?u–y?SÑs?ºDl?Ãþb?–ÿW?·{K?¹{=?Ã.?“r?C¥ ?*¦ñ>c>Ê>Ï\¡>–›n>Ó¿>mƒ=-j­¼†ñÙ½TöC¾GƒŒ¾ç¶¾2Þ¾ƒ`¿9´¿$ò%¿ú5¿ ®D¿œòQ¿û®]¿<Íg¿w:p¿bïv¿öË{¿*Ò~¿Xü¿TH¿m·|¿oNx¿—r¿„j¿#f`¿‘U¿ú,H¿rÓ9¿È*¿­¿‰¿iäç¾À¾àá–¾©&Y¾ìó¾:2/½…².=;Ô>nY>›Ò–>¿À>8è>ï?ë%?Ð*?óÍ9?ÿ'H?# U?Kb`?Ij?þr?}Lx?&¶|?»G?mü?ÛÏ~?ŸÇ{? év?:=p? Ðg?ú²]?.÷Q?(³D?¯ÿ5?:ø%?¹º?cg?æ@Þ>ص>UŒ>˜C>1Ú=Äi®<¥Mƒ½9 ¾ƒ|n¾¥M¡¾µ/ʾ˜ñ¾‘ž ¿Fl¿]+.¿Ý‹=¿HŠK¿y X¿ûb¿¦Al¿äÎs¿®”y¿=ˆ}¿/¢¿–Þ¿=~¿Àz¿ou¿tHn¿Qme¿™åZ¿÷ÄN¿"A¿f2¿ ¾!¿‹7¿EGû¾ JÔ¾CÀ«¾¡õ¾tp.¾€`®½hÅR9€2¯=+Z.>±ê>œµ«>Ã?Ô>k=û>ß2?©¹!?V2?]A?¢ÁN?«âZ?ye?Rn?õmu?[¿z?X<~?gÞ?|¢?‰}?ð•y?Ðs?ÔCl?¯ýb?X?LzK?'z=? .?»p?N£ ? ¢ñ>:Ê>`X¡>’n>–¶>Èzƒ=ä´­¼Ú½ÛC¾Ä‡Œ¾D ¶¾¶6Þ¾†b¿¶¿ìó%¿µû5¿Š¯D¿òóQ¿&°]¿:Îg¿F;p¿Žçv¿aÌ{¿cÒ~¿^ü¿'H¿·|¿ÞMx¿Õr¿’j¿e`¿FU¿…+H¿×Ñ9¿ *¿s*¿þ¿?àç¾;À¾iÝ–¾ˆY¾¨ê¾å /½Ú×.=~Ý>Y>×–> À>TÚç>ë?Ê'?Ž*?Ï9?t)H?o U?kc`?;j?Àr?Mx?†¶|?çG?gü?¢Ï~?3Ç{?nèv?kx¶>šPŒ>ãŽC>Ú= ®6ï>º«>DÔ>|Aû>Í4?x»!?2?åA?ÃN?áãZ?Øke?îRn?Ÿnu?Ô¿z?ž<~?{Þ?\¢?³ˆ}?k•y?çÏs?îBl?šüb?@X?KŒK?•x=?W.?än?Y¡ ?íñ>Î5Ê>ñS¡>k‰n>Y­>#hƒ=œÿ­¼®Ú½‹C¾·NŒ¾¢ ¶¾ë:Þ¾ˆd¿¸¿³õ%¿Zý5¿±D¿HõQ¿Q±]¿7Ïg¿±Y>ˆÛ–>hÀ>~Þç>¸ý?©)?M*?*Ñ9?é*H?ºU?Šd`?-j?ƒr? Mx?å¶|?H?aü?{Ò~?ÇÆ{?Ðçv?;p?¤Îg?¤°]?‚ôQ?+°D?fü5?«ô%?ì¶?^c?{8Þ> ¶>¨‰Œ>·…C>ë Ú=VÔ­<ïrƒ½³²¾®Žn¾ƒV¡¾J8ʾP ñ¾{¢ ¿õo¿U.¿~y=¿K¿úX¿:ýb¿sCl¿QÐs¿¸•y¿ãˆ}¿n¢¿pÞ¿v<~¿Ž¿z¿»ó>i¾«>CHÔ>ŽEû>»6?H½!?±2?n!A?cÄN?åZ?âle?Hn?Iou?LÀz?ä<~?ŽÞ?<¢?`ˆ}?æ”y?1Ïs?Bl?†ûb? X?áŠK?†Œ=? .? m?cŸ ?Ï™ñ>„1Ê>‚O¡>U€n>¤>}Uƒ=SJ®¼B)Ú½2”C¾4SŒ¾-Öµ¾ ?Þ¾‹f¿í¹¿z÷%¿þþ5¿‡²D¿žöQ¿|²]¿5Ðg¿ãÒ"Y>ÿß–>¼À>¨âç>´ÿ?ã? *?ÅÒ9?],H?U?ªe`?j?Er?2Nx?E·|?AH?[ü?BÒ~?#Ì{?2çv?Î:p?§Íg?y¯]?,óQ?¬®D?Áú5?äò%?µ?\a?F4Þ>½¶>*…Œ>/úC>XùÙ=ž‰­<”…ƒ½ï»¾Ä—n¾ñZ¡¾•<ʾn¤ñ¾p¤ ¿Ìq¿ .¿{=¿{K¿;X¿Oþb¿YDl¿Ñs¿=–y¿5‰}¿Ž¢¿\Þ¿0<~¿¿z¿’mu¿–Qn¿gxe¿ŽòZ¿ÖÀN¿zA¿]2¿œ¸!¿Á1¿;û¾L=Ô¾³«¾è¾ÖT.¾¸'¯½ü =¹Hk®=Éu.>?ø>Ï«>ƒLÔ> Iû>©8?¿!?^2?ö"A?ÃÅN?MæZ?ëme?òHn?Øfu?ÅÀz?*=~?¡Þ?¢? ˆ}?a”y?zÎs?!Al?qúb?¿ X?v‰K?õŠ=?_*.?5k?n ?±•ñ>9-Ê>K¡>?wn>àš>ØBƒ= •®¼Õ;Ú½^C¾²WŒ¾‹Úµ¾¬ Þ¾h¿Ó»¿Aù%¿¢6¿´D¿ô÷Q¿§³]¿3Ñg¿²=p¿gév¿ÞÇ{¿üÏ~¿ü¿¡G¿ïµ|¿)Lx¿r¿¼j¿¤a`¿c U¿''H¿Í9¿Í*¿Ö$¿É¿Ï è¾@À¾Ж¾%Y¾Ýξåœ.½ÙG/=Jù>ó+Y>uä–>À>Òæç>°?Â?à*?`Ô9?Ò-H?QU?Êf`?j?r?ÃNx?¤·|?nH?Tü?Ò~?·Ë{?ïv?:p?©Ìg?N®]?ÖñQ?-­D?ù5?ñ%?³?Y_?0Þ>_¶>­€Œ>ñC>NåÚ=ç>­<9˜ƒ½,ž٠n¾`_¡¾ß@ʾŒ¨ñ¾e¦ ¿¤s¿Á.¿¢|=¿‰|K¿PX¿cÿb¿?El¿½Ñs¿Â–y¿ˆ‰}¿®¢¿IÞ¿ê;~¿¾z¿èlu¿»Pn¿^we¿XñZ¿RÒN¿ñA¿°2¿Í¶!¿Ó/¿ý6û¾ 9Ô¾©®«¾ã¾¢K.¾¯½Ã¹æ}®=Û.>Äü>6Ç«>ÃPÔ>²Mû>—:?çÀ!? 2?$A?$ÇN?ƒçZ?ône?ÍIn?‚gu?ɺz?p=~?´Þ?ü¡?º‡}?Ü“y?ÄÍs?;@l?]ùb?~ X? ˆK?c‰=?©(.?™‚?y› ?’‘ñ>ï(Ê>¥F¡>*nn>£‘>30ƒ=Âß®¼iNÚ½‰¦C¾0\Œ¾éÞµ¾â Þ¾O¿º½¿û%¿G6¿„µD¿JùQ¿Ò´]¿0Òg¿€>p¿êv¿JÈ{¿6Ð~¿ ü¿ØI¿µ|¿˜Kx¿Ër¿Êj¿„``¿ U¿³%H¿jË9¿*¿ö"¿Í¿¥è¾<<À¾¶—¾ùX¾™Å¾w.½.m/=Ž>5Y>ìè–>eÀ>ýêç>«?¢?Ÿ *?ø¿9?G/H?œU?êg`?j?Êr?UOx?¸|?šH?Nü?ÏÑ~?KË{?iîv?>Dp?«Ëg?#­]?€ðQ?¯«D?x÷5?Uï%?8±?W]?Ü+Þ>þµ>/|Œ>ÙçC>»ÒÚ=óó°<Þªƒ½iξï©n¾Ïc¡¾*Eʾª¬ñ¾Z¨ ¿{u¿x.¿4~=¿ô}K¿‘X¿«ñb¿%Fl¿sÒs¿G—y¿Û‰}¿Î¢¿6Þ¿¤;~¿%¾z¿>lu¿áOn¿Uve¿"ðZ¿òÐN¿i/A¿2¿ý´!¿å-¿ë2û¾Ì4Ô¾Bª«¾ ß¾mB.¾~¯½~Ê七®= .>`Ã>œË«>UÔ>ÄQû>…<?¶Â!?¹2?&A?„ÈN?¹èZ?ýoe?§Jn?-hu?B»z?ö9~?ÇÞ?Ü¡?g‡}?W“y?Ís?U?l?Høb?= X?¡†K?ч=?ó&.?Á€?V´ ?tñ>¤$Ê>6B¡>en>fˆ>Žƒ=y*¯¼ý`Ú½´¯C¾®`Œ¾Fãµ¾Þ¾Q¿”¥¿Ðü%¿ë6¿·D¿¡úQ¿ýµ]¿.Óg¿O?p¿£êv¿¶È{¿oÐ~¿'ü¿¬I¿Lº|¿Kx¿r¿Øj¿d_`¿ÌU¿>$H¿ÏÉ9¿O*¿!¿Ñ¿{è¾ç7À¾@—¾âïX¾U¼¾;R.½ƒ’/=Ò >5>Y>cí–>º!À>'ïç>§??^ *?“Á9?ÈH?èU? i`?ôj?r?æOx?c¸|?ÇH?Hü?–Ñ~?ßÊ{?Ëív?pCp?AØg?ø«]?*ïQ?0ªD?Ôõ5?Ží%?R¯?T[?¦'Þ>¤ùµ>±wŒ>®ÞC>'ÀÚ=<©°< ¾‚½¥×¾³n¾>h¡¾tIʾȰñ¾Oª ¿Sw¿..¿Æ=¿_K¿ÒX¿¿òb¿¹:l¿)Ós¿Ì—y¿.Š}¿î¢¿#Þ¿];~¿¬½z¿”ku¿On¿Lue¿ìîZ¿’ÏN¿á-A¿Q#2¿.³!¿÷+¿Ù.û¾Œ0Ծܥ«¾†Ú¾99.¾à﮽Áš¸!£®=E.>åÇ>·“«>CYÔ>ÕUû>s>?…Ä!?g2?'A?åÉN?ïéZ?qe?‚Kn?×hu?»»z?<:~?ÓÝ?¼¡?‡}?Ò’y?WÌs?n>l?4÷b?ýX?6…K??†=?=%.?ê~?a² ?ÂÁñ>Y Ê>Ç=¡>þ[n>)>é ƒ=1u¯¼sÚ½à¸C¾,eŒ¾¤çµ¾LÞ¾ S¿{§¿9æ%¿6¿¸D¿öûQ¿(·]¿,Ôg¿@p¿Aëv¿"É{¿©Ð~¿-ü¿I¿ì¹|¿>Rx¿Fr¿æj¿E^`¿U¿É"H¿3È9¿*¿8¿Ö ¿Q输3À¾Éÿ–¾ØcY¾³¾æ,.½Ø·/=>VGY>Ùñ–>&À>Qóç>£?`? *?/Ã9?=H?uU?)j`?æj?Or?xPx?ø|?ôH?Aü?\Ñ~?sÊ{?.ív?¢Bp?C×g?ͺ]?ÔíQ?±¨D?/ô5?Çë%?k­?RY?q#Þ>Fõµ>3sŒ>‚ÕC>”­Ú=…^°<¯Ð‚½Pb¾¼n¾¬l¡¾¿Mʾç´ñ¾D¬ ¿*y¿ä.¿X=¿É€K¿X¿Ôób¿Ÿ;l¿Ês¿Q˜y¿€Š}¿£¿Þ¿;~¿3½z¿êju¿,Nn¿Cte¿¶íZ¿1ÎN¿Y,A¿¤!2¿,Ê!¿*¿Ç*û¾K,Ô¾u¡«¾Ö¾0.¾CÝ®½¦¸¾µ®=y.>jÌ>˜«>E#Ô>çYû>`@?UÆ!?2?)A?EËN?%ëZ?re?\Ln?iu?3¼z?‚:~?çÝ?Q£?†}?M’y?¡Ës?ˆ=l?öb?¼X?˃K?­„=?‡#.?}?l° ?¤½ñ>ÛVÊ>X9¡>èRn>ìu>Dø‚=迯¼$†Ú½ ÂC¾ªiŒ¾ìµ¾‚Þ¾ U¿b©¿è%¿³ð5¿ºD¿LýQ¿S¸]¿)Õg¿ì@p¿ßëv¿ŽÉ{¿âÐ~¿4ü¿RI¿¹|¿¬Qx¿ër¿ôj¿%]`¿5U¿T!H¿˜Æ9¿Ñ*¿Y¿Ú ¿'üç¾?/À¾Sû–¾·ZY¾À(¾.½-Ý/=Y>wPY>Pö–>b*À>{÷ç>Ÿ ???Ü*?ÊÄ9?²H?ÁU?á[`?Øj?r? Qx?"¹|? I?;ü?#Ñ~?Ê{?ìv?ÓAp?FÖg?¢¹]?ÌþQ?2§D?‹ò5?ê%?„«?OW?<Þ>éðµ>µnŒ>WÌC>›Ú=ΰîÐ>„œ«>†'Ô>5&û>NB?$È!?Â2? *A?¦ÌN?ZìZ?se?7Mn?+ju?¬¼z?È:~?úÝ?2£?ÝŠ}?È‘y?êÊs?¢RÊ>§q¡>ÓIn>°l>Ÿå‚=  °¼¸˜Ú½7ËC¾(nŒ¾_ðµ¾·Þ¾W¿H«¿Èé%¿Wò5¿§D¿¢þQ¿~¹]¿'Ög¿ºAp¿|ìv¿úÉ{¿Ñ~¿:ü¿&I¿.¹|¿Qx¿)r¿öj¿\`¿êU¿ßH¿ýÄ9¿*¿z¿Þ ¿ý÷ç¾ê*À¾Üö–¾–QY¾}¾Äá/½‚0='>˜YY>Æú–>·.À>¤ûç>› ??š*?eÆ9?&!H? U?]`?Öj?Ôr?šQx?¹|?MI?4ü?éÐ~?›É{?òëv?Ap?HÕg?x¸]?výQ?/ºD?æð5?8è%?©?MU?Þ>‹ìµ>7jŒ>,ÃC>lˆÚ=ɯ<ùõ‚½Êt¾ËQn¾Í8¡¾TVʾ#½ñ¾.° ¿Ù|¿Q#.¿|„=¿ŸƒK¿”X¿ýõb¿l=l¿ŠËs¿=’y¿·†}¿M£¿éÝ¿‹:~¿B¼z¿–iu¿wLn¿0re¿KëZ¿pËN¿H)A¿I2¿ŽÆ!¿@¿gZû¾Ë#Ô¾¨˜«¾øÌ¾›.¾¸®½îH 8ùÚ®=â..>sÕ>ë «>Æ+Ô>G*û>Ì)?óÉ!?o!2?(,A?ÎN?íZ?"te?Nn?Õju?%½z?;~? Þ?£?ŠŠ}?a˜y?4Ês?»;l?öób?:X?ö€K?‰=? .?dy?‚¬ ?hµñ>FNÊ>8m¡>8½n>sc>úÒ‚=WU°¼K«Ú½bÔC¾¦rŒ¾½ôµ¾í"Þ¾Y¿/­¿ë%¿üó5¿‚¨D¿ªíQ¿¨º]¿$×g¿ˆBp¿ív¿fÊ{¿UÑ~¿@ü¿ùH¿Î¸|¿ŠPx¿gr¿j¿Lj`¿žU¿jH¿aÃ9¿T *¿›¿â¿Ôóç¾–&À¾fò–¾uHY¾9¾o¼/½O(.=á0>¹bY>=ÿ–> 3À>Îÿç>— ?ý?Y*?È9?›"H?XU?!^`?Èj?.r?,Rx?á¹|?zI?.ü?°Ð~?/É{?Tëv?6@p?KÔg?M·]?!üQ?°¸D?Ã6?qæ%?·§?JS?ÑÞ>-èµ>¹eŒ>ºC>ÙuÚ=_~¯<Ÿƒ½~¾áZn¾<=¡¾ÒʾAÁñ¾#² ¿°~¿%.¿†=¿ …K¿ÕX¿÷b¿R>l¿AÌs¿Â’y¿ ‡}¿¸¡¿ÖÝ¿E:~¿Ê»z¿ìhu¿Kn¿'qe¿êZ¿ÊN¿À'A¿œ2¿¾Ä!¿¯>¿UVû¾ÉYÔ¾B”«¾sȾf.¾j¥®½4à8—í®=8.>øÙ>Q¥«>0Ô>Y.û>º+?õ²!?#2?±-A?fÏN?ÆîZ?+ue?ìNn?ku?½z?U;~? Þ?ò¢?8Š}?Ý—y?@Ós?Õ:l?áòb?ùX?‹K?÷=?d.?Œw?ª ?J±ñ>ûIÊ>Éh¡>"´n>ÈØ>TÀ‚= °¼ß½Ú½ÝC¾$wŒ¾ùµ¾"'Þ¾[¿¯¿Ví%¿ õ5¿ªD¿ïQ¿Ó»]¿"Øg¿WCp¿¸ív¿ÒÊ{¿Ñ~¿Gü¿ÌH¿o¸|¿øOx¿¤r¿j¿-i`¿U¿öH¿ÆÁ9¿• *¿¼¿æ¿ªïç¾B"À¾ïí–¾T?Y¾õ ¾—/½¥M.=2»>ÚkY>³—>_7À>øè>“?Ü ?*?œÉ9?$H?¤U?A_`?ºj?ðr?ôJx?@º|?¦I?'ü?wÐ~?ÃÈ{?¶êv?h?p?MÓg?"¶]?ËúQ?2·D?6?ý%?Ð¥?GQ?›Þ>Ðãµ>Õ°C>EcÚ=§3¯|Þ>¸©«>F4Ô>k2û>¨-?Å´!?Í 2?9/A?ÇÐN?üïZ?4ve?ÆOn?)lu?¾z?›;~?4Þ?Ò¢?å‰}?X—y?ŠÒs?BFl?Íñb?¸X? ~K?e~=?­.?µu?˜¨ ?,­ñ>±EÊ>Zd¡> «n>‹Ï>)­ƒ=Åê°¼rÐÚ½¹æC¾¢{Œ¾xýµ¾W+Þ¾]¿ü°¿ï%¿E÷5¿€«D¿VðQ¿þ¬]¿Ùg¿%Dp¿Vîv¿>Ë{¿ÈÑ~¿Mü¿ H¿¸|¿gOx¿âr¿ j¿ h`¿ÅU¿t/H¿*À9¿Ö *¿Ü¿ê¿ëç¾íÀ¾xé–¾36Y¾±¾Äq/½úr.=vÄ>ä÷X>*—>³;À>"è>?¼"?×*?7Ë9?…%H?ï U?a``?­j?³r?†Kx?„µ|?ÓI?!ü?=Ð~?WÈ{?êv?™>p?PÒg?÷´]?uùQ?³µD?{6?@û%?ö½?EO?fÞ>rßµ>¾\Œ>©§C>±PÚ=ðè®<é-ƒ½€¾ mn¾F¡¾h(ʾ‘ñ¾<› ¿_‚¿s(.¿1‰=¿ß‡K¿W X¿;ùb¿@l¿®Ís¿Ì“y¿°‡}¿ø¡¿¶Þ¿y=~¿Øºz¿—gu¿èIn¿oe¿©çZ¿OÇN¿¯$A¿A2¿Á!¿Ó:¿2Nû¾IQÔ¾ÀÇ«¾Rý¾ý.¾/€®½×+9ѯ=€J.>ã>®«>†8Ô>}6û>–/?”¶!?{2?ÁA?'ÒN?2ñZ?=we? Pn?Ôlu?޾z?á;~?GÞ?²¢?’‰}?Ó–y?ÓÑs?\El?…ÿb?xX?¶|K?Ó|=?÷.?Þs?£¦ ?©ñ>fAÊ>ì_¡>÷¡n>OÆ>„šƒ=¹5­¼ãÚ½äïC¾€Œ¾Ö¶¾Œ/Þ¾_¿ã²¿åð%¿éø5¿þ¬D¿¬ñQ¿)®]¿ŠÌg¿óDp¿óîv¿ªË{¿Ò~¿Tü¿sH¿°·|¿ÕNx¿ r¿.j¿íf`¿zU¿.H¿“Ô9¿*¿ý¿î¿Uçç¾™À¾å–¾-Y¾mú¾oL/½O˜.=¹Í>Y>yÏ–>@À>L è>‹?›$?–*?ÓÌ9?ù&H?; U?a`?Ÿj?ur?Lx?ãµ|?›G?ü?Ð~?ëÇ{?{év?Ë=p?RÑg?̳]?øQ?5´D?Ö6?yù%?¼?Íh?1 Þ>Ûµ>@XŒ>~žC>>Ú=9ž®<Ž@ƒ½½™¾"vn¾ˆJ¡¾²,ʾ/•ñ¾1 ¿ûj¿**.¿ÃŠ=¿I‰K¿— X¿Oúb¿Al¿dÎs¿Q”y¿ˆ}¿¢¿£Þ¿3=~¿ÔÀz¿ífu¿ In¿ ne¿sæZ¿ïÅN¿&#A¿“2¿P¿!¿å8¿ Jû¾ MÔ¾Zë¾Íø¾êv.¾’m®½¶‰89o%¯=µS.>…ç>…²«>Ç<Ô>:û>„1?c¸!?(2?IA?ªÀN?hòZ?Fxe?{Qn?~mu?¿z?'<~?ZÞ?’¢?@‰}?N–y?Ñs?uDl?qþb?bX?K{K?A{=?A.?r?­¤ ?ï¤ñ>=Ê>}[¡>á˜n>½>߇ƒ=p€­¼÷Ù½ùC¾„Œ¾4¶¾Â3Þ¾a¿Ê´¿¬ò%¿Žú5¿}®D¿óQ¿T¯]¿ˆÍg¿µ:p¿‘ïv¿Ì{¿;Ò~¿Zü¿FH¿Q·|¿DNx¿]r¿<j¿Îe`¿.U¿‹,H¿øÒ9¿C*¿¿òÿ¿+ãç¾EÀ¾‹à–¾ñ#Y¾*ñ¾'/½¤½.=ýÖ>' Y>ïÓ–> À>vè>‡?z&?U*?nÎ9?n(H?† U?¡b`?‘j?8r?©Lx?C¶|?ÈG?lü?ÊÏ~?Ç{?Ýèv?ü¶Öµ>ÂSŒ>S•C>Š+Ú=S®<3Sƒ½ú¢¾7n¾÷N¡¾ý0ʾM™ñ¾&Ÿ ¿Òl¿k.¿UŒ=¿´ŠK¿Ø X¿dûb¿ëAl¿Ïs¿Ö”y¿Vˆ}¿8¢¿Þ¿í<~¿[Àz¿^ou¿3Hn¿me¿=åZ¿ŽÄN¿ž!A¿æ2¿½!¿÷6¿Fû¾ÈHԾ󾫾Iô¾¶m.¾Z¯½”ç]9 8¯=é\.> ì>ë¶«>AÔ>¡>û>r3?3º!?Ö2?ÒA? ÂN?ãZ?Oye?URn?(nu?¿z?m<~?mÞ?r¢?íˆ}?É•y?gÐs?Cl?\ýb?!X?JK?¯y=?‹.?/p?¸¢ ?Ñ ñ>Ñ8Ê>W¡>Ìn>Õ³>9uƒ=(Ë­¼£ Ú½—„C¾‰Œ¾‘ ¶¾÷7Þ¾c¿°¶¿sô%¿2ü5¿ü¯D¿XôQ¿°]¿…Îg¿ƒ;p¿½çv¿‚Ì{¿tÒ~¿`ü¿H¿ñ¶|¿²Mx¿›r¿Jj¿®d`¿ãU¿+H¿]Ñ9¿„*¿ä)¿öý¿ßç¾ðÀ¾Ü–¾ÐY¾æç¾Å/½ùâ.=Aà>HY>fØ–>^ À>’Ûç>‚?Y(?*? Ð9?ã)H?Ò U?Àc`?ƒj?úr?:Mx?¢¶|?õG?eü?£Ò~?Ç{??èv?.+¶>DOŒ>'ŒC>öÚ=Ê®<Øeƒ½7¬¾Mˆn¾fS¡¾G5ʾlñ¾¡ ¿ªn¿!.¿dx=¿ŒK¿X¿xüb¿ÑBl¿ÑÏs¿[•y¿©ˆ}¿X¢¿}Þ¿§<~¿ã¿z¿´nu¿ Sn¿ùke¿äZ¿.ÃN¿ A¿82¿±»!¿ 5¿üAû¾ˆDÔ¾º«¾Äï¾d.¾gG¯½º|¹ªJ¯=f.>ð>R»«>GEÔ>³Bû>`5?¼!?ƒ2?Z A?kÃN?=äZ?'le?/Sn?Ònu?ø¿z?³<~?€Þ?R¢?šˆ}?D•y?±Ïs?©Bl?Hüb?á X?ß‹K?x=?Ô.?Wn?à ?³œñ>‡4Ê>ŸR¡>¶†n>˜ª>”bƒ=ß®¼7Ú½ÂC¾ PŒ¾ï¶¾,<Þ¾"e¿—¸¿:ö%¿×ý5¿z±D¿®õQ¿ª±]¿ƒÏg¿RiY>ÝÜ–>²À>¼ßç>Oþ?8*?Ò*?¥Ñ9?X+H?U?àd`?uj?½r?ÌMx?·|?!H?_ü?jÒ~?oÌ{?¡çv?_;p?YÎg?K°]?ôQ?¹¯D?éû5?$ô%?[¶?Åb?:7Þ>Î ¶>RˆŒ>ü‚C>bÚ=¾­<}xƒ½sµ¾c‘n¾ÕW¡¾’9Ê¾Š¡ñ¾£ ¿p¿×.¿öy=¿ zK¿ZX¿ýb¿·Cl¿‡Ðs¿à•y¿ûˆ}¿x¢¿jÞ¿a<~¿j¿z¿ nu¿/Rn¿!ye¿ÑâZ¿ÍÁN¿A¿‹2¿â¹!¿3¿ë=û¾H@Ô¾&¶«¾?ë¾M[.¾Ê4¯½®\W¹6^®=Ro.>õ>¸¿«>‡IÔ>ÅFû>N7?Ò½!?12?ã!A?ÌÄN?såZ?1me?YHn?|ou?pÀz?ù<~?“Þ?2¢?Gˆ}?¿”y?úÎs?ÃAl?3ûb?  X?tŠK?Œ=?.?€l?Ξ ?•˜ñ><0Ê>0N¡> }n>\¡>ïOƒ=–`®¼Ë.Ú½î–C¾‹TŒ¾z×µ¾a@Þ¾$g¿~º¿ø%¿{ÿ5¿ù²D¿÷Q¿Õ²]¿Ðg¿!=p¿øèv¿’Ç{¿ÔÏ~¿mü¿ÀG¿2¶|¿Lx¿r¿fj¿nb`¿L U¿-(H¿&Î9¿*¿&&¿.¿»è¾GÀ¾'Ó–¾Y¾^Õ¾·.½¤-/=Éò>Š%Y>Sá–>À>æãç>K?r?‘*?@Ó9?Ì,H?hU?f`?gj?r?]Nx?a·|?NH?Yü?1Ò~?Ì{?vïv?‘:p?[Íg? ¯]?ÆòQ?:®D?Dú5?\ò%?u´?Ã`?3Þ>p¶>ÔƒŒ>t÷C>ÏóÙ=[s­<"‹ƒ½°¾¾xšn¾C\¡¾Ü=ʾ¨¥ñ¾¥ ¿Yr¿Ž.¿ˆ{=¿Š{K¿oÿW¿¡þb¿žDl¿=Ñs¿e–y¿N‰}¿˜¢¿WÞ¿<~¿ò¾z¿`mu¿UQn¿xe¿1òZ¿lÀN¿A¿Ý2¿¸!¿-1¿Ù9û¾<Ô¾À±«¾»æ¾R.¾-"¯½Ðþ1¹Ôp®=eú->˜ù>Ä«>ÇMÔ>ÖJû><9?¡¿!?Þ2?k#A?,ÆN?©æZ?:ne?3In? gu?éÀz??=~?¦Þ?¢?ô‡}?:”y?DÎs?Ý@l?úb?_ X? ‰K?}Š=?Ý).?¨j?Ùœ ?w”ñ>ò+Ê>ÁI¡>‹tn>˜>J=ƒ=N«®¼^AÚ½ C¾ YŒ¾ØÛµ¾í Þ¾'i¿d¼¿Éù%¿ 6¿x´D¿ZøQ¿´]¿~Ñg¿ï=p¿–év¿þÇ{¿Ð~¿ü¿“G¿Óµ|¿þKx¿Sr¿tj¿Na`¿ U¿¸&H¿‹Ì9¿H*¿G$¿2¿’ è¾F?À¾°Î–¾lÿX¾Ì¾Æ‘.½ùR/= ü>«.Y>Êå–>[À>èç>G?Q?e*?ÛÔ9?A.H?´U? g`?Yj?Br?ïNx?Á·|?{H?Rü?÷Ñ~?—Ë{?Øîv?ÏDp?]Ìg?õ­]?pñQ?»¬D? ø5?•ð%?޲?À^?Ð.Þ>¶>VŒ>IîC>ÅßÚ=¤(­<ǃ½íÇ¾Ž£n¾²`¡¾'BʾƩñ¾ú¦ ¿0t¿D.¿}=¿õ|K¿°X¿èðb¿„El¿óÑs¿ê–y¿¡‰}¿¸¢¿DÞ¿Õ;~¿y¾z¿¶lu¿zPn¿we¿üðZ¿éÑN¿|A¿02¿C¶!¿?/¿Ç5û¾È7Ô¾Y­«¾6â¾äH.¾¯½ñ  ¹qƒ®=™.>4À>…È«>RÔ>èNû>*;?qÁ!?Œ2?ô$A?ÇN?ßçZ?Coe?Jn?µgu?íºz?…=~?ºÞ?ò¡?¢‡}?µ“y?ŽÍs?ö?l? ùb? X?Ÿ‡K?ëˆ=?'(.? ‚?äš ?Xñ>§'Ê>SE¡>ukn>âŽ>¥*ƒ=ö®¼òSÚ½D©C¾‡]Œ¾6ൾ#Þ¾ŸO¿K¾¿û%¿Ä6¿öµD¿°ùQ¿+µ]¿|Òg¿¾>p¿4êv¿jÈ{¿GÐ~¿"ü¿ËI¿sµ|¿lKx¿‘r¿‚j¿/``¿µ U¿C%H¿ïÊ9¿‰*¿h"¿6¿hè¾ñ:À¾b—¾KöX¾Ö¾pl.½Nx/=P>Ì7Y>@ê–>°À>:ìç>C?0?$ *?sÀ9?¶/H?ÿU??h`?Kj?r?€Ox? ¸|?¨H?Lü?¾Ñ~?+Ë{?:îv?Dp?óØg?ʬ]?ðQ?=«D?ûö5?Îî%?§°?½\?›*Þ>µüµ>ØzŒ>åC>2ÍÚ=°Ý°¹Ä> «>GVÔ>úRû>=?@Ã!?92?|&A?íÈN?éZ?Lpe?éJn?_hu?f»z? :~?ÍÞ?Ò¡?O‡}?/“y?×Ìs??l?ö÷b?ÞX?5†K?Y‡=?p&.?5€?À³ ?:Œñ>]#Ê>ä@¡>_bn>¥…>ƒ=½@¯¼†fÚ½p²C¾bŒ¾“äµ¾XÞ¾¡Q¿%¦¿Wý%¿i6¿u·D¿ûQ¿V¶]¿zÓg¿Œ?p¿Òêv¿ÖÈ{¿Ð~¿)ü¿žI¿/º|¿ÛJx¿Îr¿j¿_`¿iU¿Ï#H¿TÉ9¿Ê*¿‰ ¿:¿>è¾6À¾ë—¾AjY¾’¹¾G.½£/=”>í@Y>·î–>#À>dðç>???ã *?Â9?7H?KU?_i`?<j?Ær?Px?€¸|?ÔH?Fü?…Ñ~?¿Ê{?œív?3Cp?õ×g?Ÿ»]?ÄîQ?¾©D?Wõ5?í%?Á®?»Z?e&Þ>Wøµ>ZvŒ>òÛC>žºÚ=ù’°<˜Ã‚½fÚ¾¹µn¾i¡¾¼Jʾ²ñ¾äª ¿ßw¿±.¿>€=¿ËK¿1X¿ób¿ý:l¿žÉs¿ô—y¿FŠ}¿ø¢¿Þ¿I;~¿ˆ½z¿bku¿ÅNn¿ýte¿îZ¿)ÏN¿l-A¿Ñ"2¿¤²!¿c+¿£-û¾G/Ô¾Œ¤«¾-Ù¾z6.¾Tꮽhʃ¸­¨®=.>>É>•«>‡ZÔ> Wû>??Å!?ç2?(A?NÊN?KêZ?Vqe?ÃKn? iu?ß»z?Q:~?ÙÝ?²¡?ü†}?ª’y?!Ìs?*>l?áöb?X?Ê„K?Ç…=?º$.?]~?˱ ?ˆÀñ>Ê>u<¡>IYn>i|>[ƒ=t‹¯¼yÚ½›»C¾ƒfŒ¾ñèµ¾ŽÞ¾¤S¿ ¨¿Áæ%¿ 6¿ó¸D¿\üQ¿·]¿wÔg¿[@p¿pëv¿BÉ{¿ºÐ~¿/ü¿rI¿Ð¹|¿Rx¿ r¿žj¿ï]`¿U¿Z"H¿¹Ç9¿ *¿©¿> ¿ÿç¾I2À¾uþ–¾ aY¾A/¾Æ!.½øÂ/=Ø>JY>.ó–>X'À>Žôç>;?ï?¢ *?©Ã9?¬H?ØU?j`?.j?‰r?£Px?߸|?I??ü?KÑ~?SÊ{?ÿìv?dBp?øÖg?tº]?¼ÿQ??¨D?²ó5??ë%?Ú¬?¸X?0"Þ>ùóµ>ÝqŒ>ÇÒC> ¨Ú=BH°<=Ö‚½e¾Ï¾n¾ÿm¡¾Oʾ!¶ñ¾Ù¬ ¿¶y¿g .¿Ð=¿5K¿rX¿&ôb¿ä;l¿TÊs¿Z‘y¿™Š}¿£¿ Þ¿;~¿½z¿·ju¿ëMn¿ôse¿ZíZ¿ÈÍN¿ä+A¿$!2¿¢É!¿u)¿‘)û¾+Ô¾& «¾¨Ô¾F-.¾·×®½¬:ä·J»®=7.>ÂÍ>m™«>Š$Ô>[û>ô@?߯!?”2?)A?®ËN?ëZ?_re?Ln?´iu?W¼z?—:~?ìÝ?H£?©†}?%’y?kËs?C=l?Íõb?\X?_ƒK?5„=?#.?†|?Ö¯ ?j¼ñ>“UÊ>8¡>3Pn>,s>¶ò‚=+Ö¯¼­‹Ú½ÇÄC¾kŒ¾Oíµ¾ÃÞ¾§U¿ó©¿ˆè%¿0ñ5¿rºD¿²ýQ¿¬¸]¿uÕg¿)Ap¿ìv¿®É{¿ôÐ~¿6ü¿EI¿q¹|¿Qx¿²r¿¬j¿Ï\`¿ÒU¿å H¿Æ9¿L*¿Ê¿B ¿êúç¾õ-À¾þù–¾ÿWY¾þ%¾ùû/½Mè/=!>/SY>¤÷–>­+À>¸øç>7 ?Î?a*?EÅ9?! H?$U?7\`? j?Kr?4Qx?>¹|?.I?9ü?Ñ~?çÉ{?aìv?–Ap?úÕg?I¹]?gþQ?<»D? ò5?xé%?óª?¶V?ûÞ>œïµ>_mŒ>œÉC>w•Ú=Šý¯<â肽Nn¾jKn¾mr¡¾QSʾ?ºñ¾Î® ¿Ž{¿".¿aƒ=¿ ‚K¿³X¿;õb¿ÊGÒ>Ô«>Ê(Ô>l'û>áB?®È!?B 2?+A?ÍN?·ìZ?hse?xMn?^ju?мz?Ý:~?Þ?(£?ÄŠ}? ‘y?´Ês?]IQÊ>Up¡>Gn>ïi>à‚=ã °¼AžÚ½òÍC¾oŒ¾¬ñµ¾øÞ¾©W¿Ù«¿Oê%¿Ôò5¿u§D¿ÿQ¿×¹]¿rÖg¿÷Ap¿«ìv¿Ê{¿-Ñ~¿<ü¿I¿¹|¿ðPx¿ïr¿®j¿¯[`¿‡U¿pH¿‚Ä9¿*¿ë¿F ¿Àöç¾ )À¾ˆõ–¾ÞNY¾º¾¤Ö/½.=`*>P\Y>ü–>0À>âüç>3 ?­? *?àÆ9?•!H?oU?W]`?j? r?ÆQx?ž¹|?ZI?2ü?ØÐ~?{É{?Ãëv?Ç@p?ýÔg?¸]?ýQ?½¹D?ê6?±ç%? ©?³T?ÅÞ>>ëµ>áhŒ>pÀC>ã‚Ú=Ó²¯<ˆû‚½Šw¾€Tn¾:¡¾›Wʾ]¾ñ¾Ã° ¿e}¿Ó#.¿ó„=¿ „K¿ôX¿Pöb¿°=l¿ÁËs¿d’y¿Ð†}¿¡¡¿ãÝ¿v:~¿¼z¿ciu¿6Ln¿áqe¿îêZ¿ËN¿Ó(A¿É2¿Æ!¿ @¿1Yû¾‡"Ô¾X—«¾ŸË¾Ý.¾|²®½ŸÑ88…à®=¡1.>ÌÖ>:¢«> -Ô>~+û>_*?}Ê!?ï!2?,A?oÎN?ííZ?qte?RNn?ku?I½z?$;~?Þ?£?rŠ}?:˜y?þÉs?w;l?¤ób?ÛX?Š€K?=?—.?×x?ì« ?.´ñ>þLÊ>æk¡>ƒºn>²`>kÍ‚=šk°¼Ô°Ú½×C¾üsŒ¾ öµ¾.$Þ¾¬Y¿À­¿ì%¿yô5¿ô¨D¿îQ¿»]¿p×g¿ÆBp¿Iív¿†Ê{¿fÑ~¿Bü¿ìH¿²¸|¿^Px¿-r¿¼j¿÷i`¿;U¿ûH¿çÂ9¿Î *¿ ¿J¿–òç¾L%À¾ñ–¾½EY¾v¾O±/½o3.=°´>qeY>‘—>U4À> è>.?Œ?Þ*?{È9? #H?»U?w^`?j?hr?WRx?ý¹|?‡I?,ü?ŸÐ~?É{?%ëv?ù?p?ÿÓg?ô¶]?»ûQ?>¸D?F6?Gþ%?&§?±R?Þ>àæµ>cdŒ>E·C>PpÚ=h¯<-ƒ½Ç€¾•]n¾Ž>¡¾!ʾ{Âñ¾¸² ¿<¿‰%.¿…†=¿u…K¿5X¿d÷b¿—>l¿wÌs¿é’y¿#‡}¿Â¡¿×Þ¿0:~¿¦»z¿¹hu¿\Kn¿Øpe¿¸éZ¿§ÉN¿K'A¿2¿4Ä!¿>¿Uû¾…XÔ¾ò’«¾Ǿ¨.¾ÞŸ®½$§8"ó®=Õ:.>PÛ>¡¦«>J1Ô>/û>M,?³!?œ#2?&.A?ÏÏN?#ïZ?zue?-On?²ku?Á½z?j;~?&Þ?è¢?Š}?µ—y? Ós?:l?òb?šX?K?=?á.?w?÷© ?°ñ>´HÊ>wg¡>m±n>Ö>ƺ‚=Q¶°¼hÃÚ½IàC¾zxŒ¾húµ¾c(Þ¾®[¿§¯¿Þí%¿ö5¿sªD¿fïQ¿,¬]¿mØg¿”Cp¿çív¿òÊ{¿ Ñ~¿Iü¿¿H¿R¸|¿ÍOx¿jr¿Êj¿×h`¿®U¿‡H¿KÁ9¿ *¿-¿N¿lîç¾ø À¾›ì–¾œ|ñX>—>©8À>6è>*?k!?*?Ê9?$H? U?—_`?j?*r?Kx?\º|?³I?&ü?eÐ~?£È{?‡êv?*?p?Óg?ɵ]?eúQ?À¶D?¢6?€ü%?K¿?®P?ZÞ>ƒâµ>å_Œ>®C>¼]Ú=d¯<Ò ƒ½Š¾«fn¾ýB¡¾d%ʾ-Žñ¾­´ ¿¿@'.¿ˆ=¿à†K¿u X¿yøb¿}?l¿.Ís¿n“y¿v‡}¿â¡¿ÄÞ¿é9~¿-»z¿hu¿Jn¿Ïoe¿‚èZ¿GÈN¿Â%A¿n2¿eÂ!¿.<¿ Qû¾ETÔ¾×Ê«¾–¾s.¾A®½Jàñ8À¯= D.>Õß>««>Š5Ô>¢3û>;.?Oµ!?M2?®/A?0ÑN?XðZ?ƒve?Pn?\lu?:¾z?°;~?9Þ?É¢?̉}?0—y?SÒs?ýEl?zñb?YX?´}K?í}=?+.?)u?¨ ?ò«ñ>jDÊ>c¡>X¨n>ËÌ>š§ƒ=±¼ûÕÚ½téC¾ø|Œ¾Åþµ¾˜,Þ¾±]¿±¿¥ï%¿Â÷5¿ò«D¿¼ðQ¿W­]¿ØËg¿cDp¿…îv¿^Ë{¿ÙÑ~¿Oü¿’H¿ó·|¿;Ox¿¨r¿Øj¿·g`¿bU¿/H¿°¿9¿Q *¿N¿S¿Bêç¾£À¾$è–¾{3Y¾î¾¥f/½~.=8Ç>úX>VÌ–>þ<À>` è>&?J#?\*?²Ë9?ô%H?R U?·``?õj?ír?±Kx? µ|?àI?ü?,Ð~?7È{?êév?\>p?Òg?ž´]?ùQ?AµD?ý6?¹ú%?e½?6j?% Þ>%Þµ>g[Œ>î¤C>(KÚ=­Ò®M.>Yä>n¯«>Ë9Ô>´7û>)0?·!?û2?6A?ÒN?ŽñZ?Œwe?áPn?mu?²¾z?ö;~?MÞ?©¢?z‰}?«–y?Ñs?El?3ÿb?X?J|K?[|=?u.?Qs? ¦ ?Ô§ñ>@Ê>™^¡>BŸn>ŽÃ>õ”ƒ=üK­¼èÚ½ŸòC¾vŒ¾#¶¾Í0Þ¾³_¿t³¿lñ%¿gù5¿p­D¿òQ¿‚®]¿ÕÌg¿$:p¿"ïv¿ÊË{¿Ò~¿Uü¿fH¿”·|¿ªNx¿ær¿æj¿˜f`¿U¿‘-H¿Ô9¿’*¿n¿W¿æç¾OÀ¾­ã–¾Z*Y¾«÷¾PA/½o£.=|Ð>¾Y>ÍЖ>ÿÀ>Š è>"?)%?*?MÍ9?i'H? U?×a`?çj?¯r?CLx?¶|?¨G?ü?òÏ~?ËÇ{?Lév?=p?Ñg?s³]?¹÷Q?óD?Y6?òø%?~»?3h?™BÞ>ÇÙµ>éVŒ>ÛC>•8Ú=ö‡®<Fƒ½~œ¾×xn¾ÚK¡¾ù-ʾi–ñ¾Æ ¿‡k¿¬*.¿;‹=¿µ‰K¿÷ X¿¢úb¿IAl¿šÎs¿y”y¿ˆ}¿"¢¿Þ¿=~¿°Àz¿ºfu¿ÌHn¿¼me¿æZ¿†ÅN¿±"A¿2¿Æ¾!¿R8¿êHû¾ÄKÔ¾ «¾u÷¾,t.¾h®½â«C9û*¯=sV.>Þè>Õ³«> >Ô>Æ;û>2?î¸!?¨2?¾A?ÁN?ÄòZ?•xe?¼Qn?°mu?+¿z?<<~?`Þ?‰¢?'‰}?&–y?çÐs?1Dl?þb?X?ßzK?Éz=?¾.?zq?¤ ?µ£ñ>Õ;Ê>+Z¡>,–n>Qº>P‚ƒ=³–­¼˜üÙ½ÊûC¾ô…Œ¾¶¾5Þ¾¶a¿[µ¿4ó%¿ û5¿ï®D¿hóQ¿­¯]¿ÓÍg¿ò:p¿Nçv¿6Ì{¿LÒ~¿\ü¿9H¿4·|¿Nx¿#r¿ôj¿xe`¿ÌU¿,H¿}Ò9¿¾*¿¿[ÿ¿îáç¾úÀ¾7ß–¾8!Y¾gî¾û/½ÄÈ.=ÀÙ>ß Y>DÕ–>T À>¥Øç>?'?Ú*?éÎ9?Ý(H?é U?öb`?Ùj?rr?ÔLx?_¶|?ÕG?jü?¹Ï~?_Ç{?®èv?¿Þ><¶>kRŒ>—’C>&Ú=>=®<ÁXƒ½º¥¾ìn¾IP¡¾D2ʾˆšñ¾»Ÿ ¿_m¿í.¿ÍŒ=¿ ‹K¿8 X¿¶ûb¿0Bl¿QÏs¿þ”y¿nˆ}¿B¢¿ŠÞ¿Ø<~¿7Àz¿+ou¿òGn¿³le¿àäZ¿%ÄN¿)!A¿f2¿÷¼!¿d6¿ØDû¾„GÔ¾£½«¾ðò¾øj.¾yT¯½Á i9˜=¯=¨_.>cí>;¸«>KBÔ>×?û>4?½º!?V2?GA?tÂN?cãZ?žye?–Rn?Znu?£¿z?‚<~?sÞ?i¢?Ôˆ}?¡•y?1Ðs?KCl? ýb?ÂX?ÞŒK?7y=?.?¢o?#¢ ?—Ÿñ>Š7Ê>¼U¡>n>±>«oƒ=ká­¼,Ú½R‡C¾rŠŒ¾Þ ¶¾89Þ¾¸c¿A·¿ûô%¿°ü5¿n°D¿¾ôQ¿Ø°]¿ÑÎg¿Á;p¿ìçv¿ÚÆ{¿…Ò~¿bü¿ H¿Õ¶|¿‡Mx¿ar¿j¿Xd`¿€U¿§*H¿âÐ9¿ÿ*¿U)¿_ý¿ÄÝ羦À¾ÀÚ–¾Y¾#å¾¥ö.½î.=ã>Y>ºÙ–>¨À>ÐÜç>êü?è(?™*?„Ð9?R*H?4U?d`?Ëj?4r?fMx?¿¶|?H?cü?’Ò~?óÆ{?èv?ð;p? Ïg?±]? õQ?ŰD?ý5?cõ%?±·?.d?/:Þ>Þ ¶>y‹Œ>l‰C>mÚ=‡ò­çñ>¢¼«>‹FÔ>éCû>ó5?Œ¼!?2?Ï A?ÔÃN?™äZ?vle?pSn?ou?Àz?È<~?†Þ?I¢?ˆ}?•y?zÏs?dBl?õûb? X?s‹K?)=?R.?Ëm?.  ?y›ñ>@3Ê>MQ¡>„n>ا>]ƒ=",®¼À!Ú½~C¾dQŒ¾<¶¾m=Þ¾»e¿(¹¿Âö%¿Tþ5¿ì±D¿öQ¿²]¿ÏÏg¿!Y>1Þ–>ýÀ>úàç>æþ?!?W*?Ò9?Ç+H?€U?6e`?½j?÷r?÷Mx?·|?/H?]ü?YÒ~?OÌ{?rçv?";p? Îg?ò¯]?¶óQ?G¯D?kû5?œó%?ʵ?,b?ù5Þ>¶>û†Œ>äýC>ÙÚ=ϧ­< ~ƒ½4¸¾”n¾'Y¡¾Ù:ʾĢñ¾¥£ ¿q¿Z.¿mz=¿ŒzK¿¹X¿ßýb¿üCl¿½Ðs¿–y¿‰}¿¢¿dÞ¿L<~¿F¿z¿×mu¿îQn¿Òxe¿tâZ¿dÁN¿A¿ 2¿X¹!¿ˆ2¿´<û¾?Ô¾×´«¾çé¾X.¾>/¯½‚:L¹Âc®=r.>lö>Á«>ËJÔ>ûGû>á7?\¾!?±2?X"A?5ÅN?ÏåZ?€me?šHn?®ou?”Àz?=~?™Þ?)¢?/ˆ}?—”y?ÄÎs?~Al?áúb?@ X?ŠK?—‹=?+.?ók?9ž ?[—ñ>õ.Ê>ÞL¡>ëzn>›ž>aJƒ=Ùv®¼T4Ú½©™C¾âUŒ¾Çص¾¢AÞ¾½g¿»¿‰ø%¿ùÿ5¿k³D¿j÷Q¿.³]¿ÌÐg¿^=p¿'év¿²Ç{¿åÏ~¿ü¿³G¿¶|¿dLx¿Ür¿j¿b`¿é U¿¾'H¿«Í9¿*¿—%¿–¿~è¾ýÀ¾ÓÑ–¾ÕY¾›Ò¾û«.½Ã8/=‹õ>B(Y>¨â–>QÀ>$åç>â??+*?ºÓ9?;-H?ËU?Vf`?¯j?¹r?‰Nx?~·|?\H?Wü? Ò~?ãË{?Gïv?S:p?Íg?Ç®]?`òQ?È­D?Çù5?Õñ%?ä³?)`?Ä1Þ>#¶>}‚Œ>¹ôC>FîÙ=]­<°ƒ½qÁ¾-n¾–]¡¾$?ʾâ¦ñ¾š¥ ¿år¿.¿ÿ{=¿ö{K¿ÎÿW¿óþb¿âDl¿sÑs¿–y¿g‰}¿¡¢¿QÞ¿<~¿Î¾z¿-mu¿Qn¿Éwe¿ÕñZ¿ÀN¿A¿]2¿ˆ·!¿š0¿¢8û¾Ä:Ô¾p°«¾bå¾ZO.¾¡¯½¤Ü&¹`v®=#ý->ðú>nÅ«> OÔ> Lû>Ï9?+À!?^2?à#A?•ÆN?çZ?‰ne?uIn?>gu? Áz?T=~?¬Þ? ¢?܇}?”y?Îs?˜@l?Ìùb? X?žˆK?Š=?Z).?Wƒ?Dœ ?<“ñ>ª*Ê>oH¡>Öqn>^•>¼7ƒ=‘Á®¼çFÚ½Ô¢C¾`ZŒ¾%ݵ¾. Þ¾Ài¿õ¼¿Pú%¿6¿ê´D¿ÀøQ¿Y´]¿ÊÑg¿->p¿Åév¿È{¿Ð~¿ü¿êI¿¶µ|¿ÒKx¿r¿,j¿ù``¿ž U¿I&H¿Ì9¿Â*¿¸#¿›¿T è¾û=À¾\Í–¾´üX¾Wɾ¦†.½^/=Ïþ>c1Y>ç–>¥À>Néç>Þ?à?ê*?R¿9?°.H?U?ug`?¡j?|r?Ox?Ý·|?ˆH?Qü?æÑ~?wË{?©îv?’Dp?Ìg?œ­]? ñQ?I¬D?"ø5? ð%?ý±?'^?-Þ>Åÿµ>ÿ}Œ>ëC><ÚÚ=a­Þ¿À;~¿U¾z¿ƒlu¿9Pn¿Àve¿ŸðZ¿€ÑN¿A¿°2¿¹µ!¿¬.¿4û¾„6Ô¾ ¬«¾Þà¾&F.¾ ¯½Å~¹ýˆ®=X.>Á>ÕÉ«>KSÔ>Pû>½;?ûÁ!? 2?h%A?öÇN?;èZ?’oe?OJn?ègu?»z?š=~?¿Þ?é¡?‰‡}?“y?WÍs?²?l?¸øb?¿ X?3‡K?sˆ=?¤'.?€? µ ?ñ>`&Ê>D¡>Àhn>"Œ>%ƒ=H ¯¼{YÚ½¬C¾Þ^Œ¾ƒáµ¾dÞ¾8P¿Ü¾¿ü%¿A6¿h¶D¿úQ¿„µ]¿ÈÒg¿û>p¿cêv¿ŠÈ{¿XÐ~¿$ü¿¾I¿rº|¿AKx¿Wr¿:j¿Ù_`¿R U¿Ô$H¿uÊ9¿*¿Ù!¿Ÿ¿*è¾§9À¾—¾“óX¾À¾Qa.½mƒ/=>„:Y>•ë–>úÀ>xíç>Ú?¿?© *?íÀ9?1H?bU?•h`?“j?>r?¬Ox?=¸|?µH?Jü?­Ñ~? Ë{? îv?ÄCp?§Øg?q¬]?´ïQ?ʪD?~ö5?Fî%?°?$\?Z)Þ>hûµ>‚yŒ>bâC>©ÇÚ=mǰ<úµƒ½êÓ¾Y¯n¾sf¡¾¸Gʾ¯ñ¾…© ¿”v¿}.¿#=¿Ì~K¿PX¿Pòb¿\:l¿àÒs¿——y¿ Š}¿á¢¿+Þ¿z;~¿Ý½z¿Ùku¿_On¿·ue¿iïZ¿ ÐN¿.A¿ 2¿é³!¿¾,¿~0û¾C2Ô¾£§«¾Yܾñ<.¾f÷®½ÍA¸¸››®=Œ.>Æ>ð‘«>‹WÔ>0Tû>«=?ÊÃ!?¹2?ñ&A?VÉN?qéZ?›pe?*Kn?’hu?Š»z? :~?ÒÞ?É¡?6‡}?“y?¡Ìs?Ë>l?£÷b?~X?É…K?á†=?î%.?¨?+³ ?lÃñ>"Ê>’?¡>ª_n>å‚>rƒ=W¯¼lÚ½+µC¾\cŒ¾àåµ¾™Þ¾;R¿¶¦¿ßý%¿æ6¿ç·D¿lûQ¿¯¶]¿ÅÓg¿Ê?p¿ëv¿öÈ{¿’Ð~¿+ü¿‘I¿º|¿xRx¿”r¿Hj¿¹^`¿U¿`#H¿ÚÈ9¿E*¿ú¿£¿è¾S5À¾——¾ˆgY¾Ð¶¾ü;.½Â¨/=W>¥CY> ð–>N$À>¢ñç>Ö?ž?h *?ˆÂ9?¦H?ïU?µi`?…j?r?=Px?œ¸|?âH?Dü?sÑ~?ŸÊ{?mív?õBp?ª×g?F»]?^îQ?L©D?Ùô5?ì%?0®?"Z?$%Þ> ÷µ>uŒ>7ÙC>µÚ=¶|°<&É‚½'ݾn¸n¾âj¡¾Lʾ=³ñ¾z« ¿kx¿3.¿µ€=¿7€K¿‘X¿dób¿B;l¿ÔÉs¿˜y¿_Š}¿£¿Þ¿4;~¿d½z¿/ku¿„Nn¿®te¿4îZ¿ÀÎN¿÷,A¿Q"2¿²!¿Ð*¿l,û¾.Ô¾<£«¾Ô×¾¼3.¾È䮽 [¸8®®=Á.>–Ê>V–«>Ž!Ô>BXû>™??™Å!?g2?y(A?·ÊN?§êZ?¥qe?Ln?–XÊ>#;¡>”Vn>¨y>Íÿ‚=·¡¯¼¢~Ú½W¾C¾ÙgŒ¾>êµ¾ÏÞ¾=T¿¨¿Hç%¿Š6¿e¹D¿ÂüQ¿Ú·]¿ÃÔg¿˜@p¿Ÿëv¿bÉ{¿ËÐ~¿1ü¿dI¿³¹|¿çQx¿:r¿Vj¿™]`¿»U¿ë!H¿>Ç9¿†*¿¿§ ¿Öýç¾ÿ0À¾ ý–¾g^Y¾,¾¦.½Î/=›>ÆLY>‚ô–>¢(À>Ìõç>Ò?}?'*?$Ä9?H?;U?m[`?vj?Ãr?ÎPx?û¸|?I?=ü?:Ñ~?3Ê{?Ðìv?'Bp?¬Ög?º]?WÿQ?ͧD?5ó5?¸ê%?I¬?X?ï Þ>¬òµ>†pŒ> ÐC>‚¢Ú=ÿ1°<ËÛ‚½Ñg¾„Án¾Qo¡¾MPʾ[·ñ¾o­ ¿Cz¿é .¿G‚=¿¡K¿ÒX¿yôb¿(Ï>½š«>Î%Ô>$û>‡A?iÇ!?2?*A?ÌN?ÝëZ?®re?ßLn?æiu?{¼z?¬:~?òÝ?>£?†}?þ‘y?4Ës?ÿLTÊ>qs¡>Mn>kp>(í‚=n쯼6‘Ú½‚ÇC¾WlŒ¾œîµ¾Þ¾@V¿„ª¿é%¿­ñ5¿äºD¿þQ¿¹]¿ÀÕg¿gAp¿=ìv¿ÎÉ{¿Ñ~¿7ü¿8I¿T¹|¿VQx¿xr¿Xj¿y\`¿pU¿v H¿£Å9¿Ç*¿<¿« ¿¬ù羪,À¾ªø–¾FUY¾;#¾Úð/½ló/=ß#>çUY>ùø–>÷,À>öùç>Î ?]?æ*?¿Å9? H?†U?\`?hj?…r?`Qx?[¹|?;I?7ü?Ñ~?ÇÉ{?2ìv?XAp?¯Õg?ð¸]?þQ?ʺD?ñ5?ðè%?bª?V?ºÞ>Oîµ>lŒ>àÆC>îÚ=G篟Ó>$Ÿ«>*Ô>¢(û>)?8É!? 2?Š+A?xÍN?íZ?·se?¹Mn?ju?ô¼z?ò:~?Þ?£?¬Š}?x‘y?~Ês?PÊ>o¡>ãÀn>.g>‚Ú‚=&7°¼Ê£Ú½­ÐC¾ÕpŒ¾ùòµ¾9!Þ¾CX¿j¬¿×ê%¿Ró5¿ç§D¿nÿQ¿0º]¿¾Ög¿5Bp¿Úìv¿:Ê{¿>Ñ~¿>ü¿ I¿õ¸|¿ÄPx¿µr¿fj¿Áj`¿$U¿H¿Ä9¿*¿\¿¯¿‚õç¾V(À¾3ô–¾%LY¾÷¾„Ë/½9.="->_Y>oý–>K1À> þç>Ê ?<?¥*?[Ç9?"H?ÒU?­]`?fj?Gr?ñQx?º¹|?gI?1ü?ÇÐ~?[É{?”ëv?Š@p?±Ôg?Å·]?«üQ?K¹D?m6?)ç%?{¨?T?„Þ>ñéµ>ŠgŒ>µ½C>Z}Ú=œ¯<ƒ½Kz¾5Wn¾q;¡¾âXʾ—¿ñ¾Y± ¿ò}¿V$.¿k…=¿w„K¿SX¿¢öb¿õ=l¿÷Ës¿Œ’y¿é†}¿«¡¿ÞÝ¿a:~¿ú»z¿0iu¿õKn¿’qe¿’êZ¿žÊN¿^(A¿I2¿yÅ!¿w?¿úWû¾B!Ô¾ –«¾Fʾ.¾ð¬®½PZe8æ®=_4.>$Ø>Š£«>N.Ô>´,û>ò*?:²!?o"2?-A?ØÎN?IîZ?Àte?“Nn?;ku?m½z?8;~?Þ?ÿ¢?YŠ}?˜y?ÇÉs?2;l?Qób?{X?€K?š€=?.?Kx?W« ?ô²ñ>·KÊ>”j¡>ηn>„Ü>ÝÇ‚=ݰ¼]¶Ú½ÙÙC¾SuŒ¾W÷µ¾o%Þ¾EZ¿Q®¿žì%¿öô5¿f©D¿uîQ¿[»]¿»×g¿Cp¿xív¿¦Ê{¿wÑ~¿Dü¿ßH¿•¸|¿3Px¿ór¿tj¿¡i`¿–U¿ŒH¿lÂ9¿I *¿}¿³¿Xñç¾$À¾½ï–¾CY¾³¾/¦/½>.=s·>)hY>æ—>Ÿ5À>Jè>Æ? ?d*?öÈ9?y#H?U?Í^`?Yj?¢r?‚Rx?º|?”I?*ü?ŽÐ~?ïÈ{?öêv?»?p?´Óg?›¶]?UûQ?Ì·D?É6?¿ý%?•¦?R?OÞ>“åµ> cŒ>‰´C>ÇjÚ=ÙQ¯<»ƒ½ˆƒ¾J`n¾à?¡¾a"ʾµÃñ¾N³ ¿É¿ &.¿ý†=¿â…K¿”X¿·÷b¿Û>l¿®Ìs¿“y¿<‡}¿Ë¡¿ÑÞ¿:~¿‚»z¿†hu¿Kn¿‰pe¿\éZ¿>ÉN¿Ö&A¿œ2¿ªÃ!¿‰=¿éSû¾@WÔ¾¢‘«¾Âžê.¾Rš®½åh½8®ø®=“=.>©Ü>ñ§«>Ž2Ô>Æ0û>à,? ´!? 2?›.A?8ÐN?ïZ?Éue?nOn?åku?å½z?;~?,Þ?ߢ?Š}?—y?ÓÒs?L:l?<òb?:X?³~K?=?_.?tv?b© ?Ö®ñ>mGÊ>%f¡>¸®n>GÓ>±´ƒ=”̰¼ñÈÚ½ãC¾ÑyŒ¾µûµ¾¤)Þ¾H\¿8°¿fî%¿›ö5¿åªD¿ÌïQ¿†¬]¿¹Øg¿ÒCp¿îv¿Ë{¿±Ñ~¿Kü¿²H¿6¸|¿¢Ox¿1r¿‚j¿h`¿KU¿ 0H¿ÑÀ9¿Š *¿ž¿·¿.íç¾­À¾Fë–¾ã9Y¾p¾Ú€/½äc.=·À>4ôX>\—>ô9À>tè>Â?ú!?"*?‘Ê9?î$H?i U?í_`?Kj?dr?KKx?yº|?ÁI?$ü?TÐ~?ƒÈ{?Xêv?í>p?¶Òg?pµ]?ÿùQ?N¶D?$6?øû%?º¾?P?Þ>6áµ>Ž^Œ>^«C>3XÚ=!¯<`&ƒ½ÅŒ¾`in¾OD¡¾¬&ʾgñ¾Cµ ¿ ¿Â'.¿ˆ=¿L‡K¿Õ X¿Ëøb¿Â?l¿dÍs¿–“y¿‡}¿ë¡¿¾Þ¿•=~¿ »z¿Ügu¿@Jn¿€oe¿&èZ¿ÞÇN¿M%A¿î2¿ÛÁ!¿›;¿×Oû¾SÔ¾‡É«¾=Á¾µ.¾µ‡®½Q9L ¯=ÈF.>-á>W¬«>Ï6Ô>Ø4û>Î.?Ùµ!?Í2?"A?™ÑN?µðZ?Òve?HPn?lu?^¾z?Å;~??Þ?¿¢?´‰}?—y?Òs?¹El?(ñb?ùX?H}K?v}=?¨.?œt?m§ ?¸ªñ>"CÊ>¶a¡>£¥n> Ê> ¢ƒ=‡­¼„ÛÚ½/ìC¾O~Œ¾¶¾Ù-Þ¾J^¿²¿-ð%¿?ø5¿d¬D¿"ñQ¿±­]¿#Ìg¿ Dp¿´îv¿~Ë{¿êÑ~¿Qü¿…H¿×·|¿Ox¿nr¿j¿bg`¿U¿–.H¿9Õ9¿Ë*¿¿¿»¿éç¾YÀ¾Ïæ–¾Â0Y¾,þ¾…[/½9‰.=ûÉ>UýX>«Í–>H>À> è>¾?Ù#?á*?-Ì9?c&H?µ U? a`?=j?'r?ÜKx?½µ|?íI?ü?Ð~?È{?ºév?>p?¸Ñg?E´]?©øQ?Ï´D?€6?1ú%?Ô¼?œi?ä Þ>ØÜµ>ZŒ>3¢C>ŸEÚ=j¼®<9ƒ½–¾vrn¾¾H¡¾ö*ʾ…“ñ¾fœ ¿xƒ¿x).¿!Š=¿·ˆK¿ X¿àùb¿¨@l¿Îs¿”y¿á‡}¿ ¢¿«Þ¿O=~¿Áz¿2gu¿fIn¿wne¿ðæZ¿}ÆN¿Å#A¿A2¿ À!¿­9¿ÅKû¾ÀNÔ¾!Å«¾¡ú¾€ü-¾u®½0p)9é¯=ýO.>²å>¾°«>;Ô>ê8û>¼0?¨·!?{2?«A?ÀN?ëñZ?Ûwe?#Qn?9mu?Ö¾z? <~?RÞ?Ÿ¢?a‰}?ƒ–y?gÑs?ÒDl?àþb?¸ÿW?Ý{K?ä{=?ò.?År?x¥ ?™¦ñ>Ø>Ê>G]¡>œn>ÎÀ>gƒ=?b­¼ŽïÙ½[õC¾Í‚Œ¾p¶¾2Þ¾M`¿´¿ôñ%¿äù5¿â­D¿xòQ¿Ü®]¿!Íg¿a:p¿Qïv¿êË{¿#Ò~¿Wü¿XH¿w·|¿Nx¿¬r¿žj¿Bf`¿´U¿"-H¿žÓ9¿ *¿à¿¿¿Úäç¾À¾Yâ–¾¡'Y¾èô¾06/½Ž®.=?Ó>vY>!Ò–>JÀ>Çè>¹?¸%? *?ÈÍ9?Ø'H? U?,b`?/j?ér?nLx?¶|?¶G?ü?áÏ~?«Ç{?év?P=p?»Ðg?³]?S÷Q?Q³D?Üÿ5?jø%?íº?šg?XAÞ>zص>’UŒ>™C> 3Ú=³q®<ªKƒ½>Ÿ¾Œ{n¾,M¡¾A/ʾ£—ñ¾[ž ¿l¿/+.¿³‹=¿!ŠK¿W X¿ôúb¿ŽAl¿ÑÎs¿ ”y¿4ˆ}¿+¢¿˜Þ¿ =~¿ŒÀz¿£ou¿‹Hn¿mme¿ºåZ¿ÅN¿="A¿“2¿<¾!¿¿7¿³Gû¾€JÔ¾ºÀ«¾ö¾nq.¾zb®½ÎN9‡0¯=1Y.>7ê>$µ«>O?Ô>ü<û>ª2?x¹!?(2?3A?|ÁN?ŠâZ?äxe?ýQn?ãmu?O¿z?Q<~?eÞ?¢?‰}?þ•y?±Ðs?ìCl?Ìýb?£X?szK?Rz=?<.?íp?ƒ£ ?{¢ñ>:Ê>ÙX¡>w“n>‘·>Â|ƒ=ö¬­¼!Ú½â€C¾J‡Œ¾Î¶¾D6Þ¾Ob¿ìµ¿»ó%¿ˆû5¿a¯D¿ÎóQ¿°]¿Îg¿0;p¿}çv¿VÌ{¿]Ò~¿^ü¿,H¿·|¿íMx¿ér¿¬j¿"e`¿iU¿­+H¿Ò9¿9*¿¿Ãþ¿°àç¾°À¾âÝ–¾€Y¾¤ë¾Û/½ãÓ.=ƒÜ>—Y>˜Ö–>ž À>ãÙç>µ?—'?_*?cÏ9?L)H?L U?Lc`?!j?¬r?Mx?|¶|?ãG?hü?¨Ï~?>Ç{?èv?ï¶>QŒ>ÜC>x Ú=û&®»î>‹¹«>CÔ>Aû>˜4?G»!?Ö2?¼A?ÝÂN?ÀãZ?¼ke?×Rn?nu?Ç¿z?—<~?yÞ?_¢?¼ˆ}?y•y?úÏs?Cl?¸üb?bX?rŒK?Àx=?….?o?Ž¡ ?]žñ>C6Ê>jT¡>bŠn>T®>jƒ=®÷­¼µÚ½ŠC¾¹Y>Û–>òÀ> Þç>‚ý?v)?*?þÐ9?Á*H?—U?ld`?j?nr?‘Mx?Û¶|?H?bü?Ò~?ÒÆ{?áçv?³;p?¿Îg?İ]?§ôQ?S°D?“ü5?Ûô%? ·?•c?î8Þ>‘ ¶>"ŠŒ>°†C>ä Ú=DÜ­<ôpƒ½¸±¾·n¾ V¡¾Ö7ʾàŸñ¾F¢ ¿Ão¿&.¿Sy=¿÷ŒK¿ØX¿ýb¿ZCl¿=Ðs¿ª•y¿Úˆ}¿k¢¿rÞ¿}<~¿›¿z¿Onu¿‡Rn¿Œye¿NãZ¿[ÂN¿,A¿82¿º!¿ã3¿?û¾BÔ¾í·«¾í¾_.¾P<¯½4vf¹ÁU¯=šk.>@ó>ñ½«>ÏGÔ> Eû>†6?½!?ƒ2?D!A?=ÄN?öäZ?Æle?Hn?7ou?@Àz?Ý<~?ŒÞ??¢?iˆ}?ô”y?DÏs? Bl?£ûb?" X?‹K?±Œ=?Ï.?>m?™Ÿ ??šñ>ø1Ê>ûO¡>Ln>¥>xWƒ=eB®¼I'Ú½9“C¾ºRŒ¾¶Õµ¾®>Þ¾Tf¿¹¹¿J÷%¿Ñþ5¿^²D¿zöQ¿]²]¿Ðg¿Í Y¾Ù¾1Æ.½Ž/= ï>Ú!Y>…ß–>GÀ>7âç>~ÿ?°?Ü*?šÒ9?6,H?âU?Œe`?j?1r?#Nx?;·|?4¶>¥…Œ>)ûC>PûÙ=Œ‘­<™ƒƒ½ôº¾Í–n¾yZ¡¾ <ʾþ£ñ¾;¤ ¿šq¿Ü.¿åz=¿øzK¿X¿1þb¿ADl¿óÐs¿/–y¿-‰}¿‹¢¿^Þ¿7<~¿"¿z¿¥mu¿­Qn¿ƒxe¿¯òZ¿ûÀN¿£A¿‹2¿Î¸!¿õ1¿~;û¾À=Ô¾‡³«¾Žè¾ÑU.¾²)¯½VA¹Ni®=Ït.>Ä÷>X«>LÔ>1Iû>t8?æ¾!?12?Í"A?žÅN?,æZ?Ïme?ÛHn?Æfu?¸Àz?#=~?ŸÞ?¢?ˆ}?o”y?ŽÎs?:Al?úb?á X?œ‰K?‹=?Ž*.?gk?£ ?!–ñ>®-Ê>ŒK¡>6xn>Û›>ÓDƒ=®¼Ý9Ú½dœC¾8WŒ¾Úµ¾: Þ¾Wh¿ »¿ù%¿v6¿Ý³D¿Ð÷Q¿‡³]¿Ñg¿œ=p¿Wév¿ÒÇ{¿öÏ~¿ü¿¥G¿ùµ|¿9Lx¿¢r¿Öj¿Ãa`¿† U¿O'H¿1Í9¿ü*¿%¿ÿ¿@ è¾³À¾~Ж¾Y¾ÙϾܠ.½ãC/=Nø>û*Y>üã–>›À>aæç>z??°*?5Ô9?ª-H?.U?«f`?÷j?ór?´Nx?š·|?iH?Uü?Ò~?ÃË{?ïv?:p?ÄÌg?n®]?úñQ?V­D?Jù5?Mñ%?S³?_?ƒ0Þ>Ö¶>'Œ>ýñC>GçÚ=ÕF­Iü>¾Æ«>OPÔ>CMû>b:?µÀ!?Þ2?U$A?þÆN?bçZ?Øne?¶In?pgu?½ºz?i=~?²Þ?ÿ¡?Ç}?ê“y?×Ís?S@l?zùb?  X?2ˆK?‰=?Ø(.?Ë‚?®› ?’ñ>c)Ê>G¡>!on>ž’>.2ƒ=Ô×®¼pLÚ½¥C¾¶[Œ¾rÞµ¾o Þ¾Yj¿†½¿Øú%¿6¿\µD¿&ùQ¿²´]¿Òg¿j>p¿ôév¿>È{¿0Ð~¿ü¿ÝI¿šµ|¿§Kx¿ßr¿äj¿£``¿; U¿Ú%H¿–Ë9¿=*¿)#¿¿ è¾±<À¾Ì–¾üùX¾•ƾ†{.½8i/=’>4Y>sè–>ðÀ>‹êç>v?o?o *?Ì¿9?/H?yU?Ëg`?éj?¶r?EOx?ú·|?–H?Oü?ÕÑ~?WË{?zîv?TDp?ÆËg?C­]?¤ðQ?׫D?¥÷5?†ï%?l±?]?N,Þ>xþµ>©|Œ>ÒèC>³ÔÚ=âû°<䨃½n;ø¨n¾Wc¡¾µDʾ:¬ñ¾%¨ ¿Iu¿I.¿ ~=¿Í}K¿oX¿ñb¿ Fl¿`Òs¿9—y¿Ò‰}¿Ë¢¿8Þ¿«;~¿1¾z¿Plu¿øOn¿qve¿CðZ¿ÑN¿“/A¿02¿/µ!¿.¿Z3û¾?5Ô¾ºª«¾…ß¾gC.¾w¯½1¹ì¸‰Ž®= .>åÂ>$Ë«>TÔ>UQû>P<?…Â!?Œ2?Ý%A?_ÈN?˜èZ?áoe?Jn?hu?5»z?î9~?ÅÞ?ß¡?p‡}?e“y?!Ís?m?l?føb?_ X?džK?ü‡=?!'.?ó€?‹´ ?äñ>%Ê>®B¡> fn>a‰>‰ƒ=‹"¯¼_Ú½»®C¾4`Œ¾Ðâµ¾¥Þ¾ÒP¿m¿¿Ÿü%¿¿6¿Ú¶D¿|úQ¿Ýµ]¿Óg¿9?p¿’êv¿ªÈ{¿iÐ~¿&ü¿°I¿Vº|¿Kx¿r¿òj¿ƒ_`¿ïU¿e$H¿úÉ9¿~*¿J!¿¿ìè¾]8À¾¹—¾ÚðX¾Q½¾1V.½Ž/=Ö >==Y>éì–>D!À>µîç>r?N?. *?hÁ9? H?ÅU?ëh`?Ûj?xr?×Ox?Y¸|?ÂH?Hü?œÑ~?ëÊ{?Üív?†Cp?\Øg?¬]?NïQ?XªD?ö5?¾í%?…¯?‹[?(Þ>úµ>+xŒ>§ßC> ÂÚ=*±°<¼‚½«Ö¾²n¾Åg¡¾IʾY°ñ¾ª ¿!w¿ÿ.¿›=¿8K¿°X¿¢òb¿ :l¿Ós¿¾—y¿%Š}¿ë¢¿%Þ¿e;~¿¹½z¿¦ku¿On¿hue¿ ïZ¿·ÏN¿ .A¿#2¿_³!¿+,¿H/û¾ÿ0Ô¾S¦«¾Û¾3:.¾Úñ®½tý¡¸'¡®=J.>jÇ>@“«>ÐXÔ>gUû>>>?TÄ!?92?f'A?¿ÉN?ÎéZ?êpe?kKn?Åhu?®»z?5:~?ÑÝ?¿¡?‡}?à’y?kÌs?‡>l?Q÷b?X?\…K?j†=?k%.??–² ?2Âñ>Î Ê>?>¡>õ\n>$€>ä ƒ=Cm¯¼˜qÚ½ç·C¾²dŒ¾-çµ¾ÚÞ¾ÔR¿G§¿fþ%¿c6¿Y¸D¿ÒûQ¿·]¿Ôg¿@p¿0ëv¿É{¿£Ð~¿,ü¿„I¿ö¹|¿MRx¿Zr¿j¿c^`¿¤U¿ñ"H¿_È9¿À*¿k¿ ¿Ãè¾ 4À¾C—¾ÐdY¾ ´¾Ü0.½â³/=>^FY>`ñ–>˜%À>ßòç>m?-?í *?Ã9?H?RU? j`?Íj?:r?hPx?¸¸|?ïH?Bü?bÑ~?Ê{?>ív?¸Bp?^×g?íº]?øíQ?Ú¨D?\ô5?÷ë%?Ÿ­?ˆY?ã#Þ>½õµ>­sŒ>{ÖC>Œ¯Ú=sf°<´Î‚½Ua¾#»n¾4l¡¾JMʾw´ñ¾¬ ¿øx¿¶.¿-=¿£€K¿ñX¿·ób¿‡;l¿ Ês¿C˜y¿wŠ}¿ £¿Þ¿;~¿@½z¿üju¿CNn¿_te¿×íZ¿WÎN¿‚,A¿Ñ!2¿]Ê!¿=*¿6+û¾¿,Ô¾í¡«¾|Ö¾þ0.¾<ß®½nƒ.¸Ä³®=.>ïË>¦—«>Ò"Ô>yYû>,@?$Æ!?ç2?î(A? ËN?ëZ?ôqe?ELn?oiu?'¼z?{:~?åÝ?U£?ʆ}?[’y?´Ës? =l?<öb?ÞX?òƒK?Ø„=?µ#.?E}?¡° ?¾ñ>OWÊ>Ñ9¡>ßSn>çv>?ú‚=ú·¯¼+„Ú½ÁC¾0iŒ¾‹ëµ¾Þ¾×T¿.©¿Ðç%¿6¿×¹D¿(ýQ¿3¸]¿Õg¿Ö@p¿Îëv¿ƒÉ{¿ÜÐ~¿3ü¿WI¿—¹|¿¼Qx¿r¿j¿C]`¿XU¿|!H¿ÄÆ9¿*¿Œ¿ ¿™üç¾´/À¾Ìû–¾¯[Y¾¼)¾‡ .½7Ù/=]>OY>Öõ–>í)À> ÷ç>i ? ?¬*?žÄ9?ŠH?žU?Ã[`?¿j?ýr?úPx?¹|?I?;ü?)Ñ~?Ê{?¡ìv?éAp?aÖg?¹]?ñþQ?[§D?·ò5?0ê%?¸«?†W?®Þ>_ñµ>/oŒ>PÍC>ùœÚ=¼°sÐ> œ«>'Ô>Ç%û>B?óÇ!?”2?v*A?€ÌN?:ìZ?ýre? Mn?ju?Ÿ¼z?Á:~?øÝ?5£?æŠ}?Ö‘y?þÊs?ºSÊ>r¡>ÊJn>«m>™ç‚=±°¼¿–Ú½=ÊC¾®mŒ¾éïµ¾EÞ¾ÙV¿«¿—é%¿*ò5¿V»D¿~þQ¿^¹]¿ Ög¿¤Ap¿lìv¿ïÉ{¿Ñ~¿9ü¿+I¿8¹|¿*Qx¿>r¿j¿#\`¿ U¿ H¿(Å9¿B*¿­¿ ¿oøç¾`+À¾U÷–¾ŽRY¾x ¾ºå/½Œþ/=¡&> XY>Mú–>A.À>3ûç>e ?ë?k*?:Æ9?ÿ H?éU?ã\`?½j?¿r?‹Qx?w¹|?HI?5ü?ðÐ~?§É{?ìv?Ap?cÕg?—¸]?›ýQ?XºD?ñ5?iè%?Ñ©?ƒU?yÞ>íµ>±jŒ>%ÄC>eŠÚ=ѯ<ÿó‚½Ïs¾ÔPn¾T8¡¾ßUʾ³¼ñ¾ù¯ ¿§|¿"#.¿Q„=¿xƒK¿rX¿àõb¿S=l¿wËs¿.’y¿¯†}¿J£¿ëÝ¿’:~¿O¼z¿¨iu¿ŽLn¿Lre¿këZ¿–ËN¿r)A¿w2¿¿Æ!¿Ò@¿ÖZû¾>$Ô¾ ™«¾r;•.¾º®½ ×ø7ÿØ®=è-.>øÔ>s «>R+Ô>Ù)û>—)?ÂÉ!?B!2?ÿ+A?áÍN?oíZ?te?úMn?Ãju?½z?;~? Þ?£?“Š}?Q‘y?GÊs?Ô;l?ôb?\X?K?´=?I .?–y?·¬ ?صñ>ºNÊ>°m¡>/¾n>nd>ôÔ‚=iM°¼R©Ú½iÓC¾,rŒ¾Fôµ¾z"Þ¾ÜX¿û¬¿_ë%¿Ïó5¿Y¨D¿ÔÿQ¿‰º]¿ ×g¿rBp¿ ív¿[Ê{¿OÑ~¿@ü¿þH¿Ø¸|¿™Px¿{r¿j¿kj`¿ÁU¿’H¿Ã9¿ƒ *¿Î¿¿Eôç¾ 'À¾ßò–¾mIY¾5¾eÀ/½Y$.=å/>ÁaY>Äþ–>•2À>]ÿç>a ?Ê?**?ÕÇ9?t"H?5U?^`?¯j?r?Rx?Ö¹|?uI?/ü?¶Ð~?;É{?eëv?L@p?fÔg?l·]?EüQ?Ù¸D?ð6?¡æ%?ê§?S?CÞ>¤èµ>4fŒ>ùºC>ÑwÚ=M†¯<¤ƒ½ }¾êYn¾Ã<¡¾^ʾÑÀñ¾î± ¿~~¿Ø$.¿ã…=¿ã„K¿³X¿ôöb¿:>l¿.Ìs¿´’y¿‡}¿µ¡¿ØÝ¿L:~¿Ö»z¿þhu¿´Kn¿Cqe¿6êZ¿5ÊN¿é'A¿É2¿ïÄ!¿ä>¿ÄVû¾}Ù>Ú¤«>’/Ô>ë-û>…+?IJ!?ï"2?‡-A?AÏN?¥îZ?ue?ÔNn?mku?½z?M;~?Þ?õ¢?AŠ}?ë—y?‘És?í:l?ÿòb?X?²K?"€=?’.?¿w?ª ?º±ñ>pJÊ>Bi¡>µn>ÃÙ>O‚= ˜°¼æ»Ú½”ÜC¾ªvŒ¾¤øµ¾°&Þ¾ÞZ¿â®¿&í%¿tõ5¿Ø©D¿ÛîQ¿´»]¿Øg¿ACp¿§ív¿ÆÊ{¿‰Ñ~¿Fü¿ÑH¿y¸|¿Px¿¹r¿,j¿Ki`¿4U¿H¿òÁ9¿Ä *¿î¿¿ðç¾·"À¾hî–¾L@Y¾ñ ¾›/½®I.=6º>âjY>:—>ê6À>‡è>]?ª ?é*?pÉ9?è#H?€U?#_`?¡j?Ür?åJx?6º|?¡I?(ü?}Ð~?ÏÈ{?Çêv?~?p?hÓg?A¶]?ïúQ?Z·D?L6?8ý%?¦?~Q?Þ>Fäµ>¶aŒ>αC>>eÚ=–;¯­Ó8:þ®=R@.>Þ>@©«>Ó3Ô>ý1û>s-?“´!?  2?/A?¡ÐN?ÛïZ?ve?¯On?lu? ¾z?“;~?2Þ?Õ¢?î‰}?f—y?Òs?:l?êñb?ÚX?G~K?~=?Ü.?çu?ͨ ?œ­ñ>%FÊ>Ód¡>¬n>†Ð>#¯ƒ=×â°¼zÎÚ½¿åC¾({Œ¾ýµ¾å*Þ¾á\¿É°¿íî%¿÷5¿W«D¿2ðQ¿ß¬]¿Ùg¿Dp¿Eîv¿2Ë{¿ÂÑ~¿Lü¿¥H¿¸|¿vOx¿÷r¿:j¿,h`¿èU¿œ/H¿VÀ9¿ *¿¿ ¿ñëç¾cÀ¾òé–¾+7Y¾­¾»u/½o.=zÃ>ìöX>±—>>;À>±è>Y?‰"?¨*? Ë9?]%H?Ì U?B``?“j?žr?vKx?zµ|?ÎI?"ü?CÐ~?cÈ{?)êv?¯>p?jÒg?µ]?™ùQ?ܵD?§6?qû%?)¾?{O?ØÞ>éßµ>8]Œ>£¨C>ªRÚ=Þð®<î+ƒ½…¾ln¾¡E¡¾ó'ʾ¡ñ¾› ¿-‚¿E(.¿‰=¿¸‡K¿5 X¿ùb¿@l¿šÍs¿¾“y¿§‡}¿õ¡¿¸Þ¿€=~¿åºz¿©gu¿ÿIn¿1oe¿ÊçZ¿tÇN¿Ø$A¿n2¿QÁ!¿;¿ Nû¾¼QÔ¾8È«¾Íý¾÷.¾)‚®½}49د=†I.>†â>§­«>8Ô>6û>a/?c¶!?M2?—A?ÒN?ñZ?!we?‰Pn?Álu?‚¾z?Ú;~?EÞ?¶¢?›‰}?á–y?çÑs?tEl?Õðb?šX?Ü|K?þ|=?&.?t?ئ ?~©ñ>ÛAÊ>d`¡>î¢n>JÇ>~œƒ=Ê-­¼ áÚ½ëîC¾¥Œ¾_¶¾/Þ¾ã^¿¯²¿´ð%¿½ø5¿Ö¬D¿ˆñQ¿ ®]¿oÌg¿ÞDp¿ãîv¿žË{¿ûÑ~¿Sü¿xH¿º·|¿åNx¿4r¿Hj¿ g`¿U¿'.H¿¿Ô9¿F*¿0¿$¿Ççç¾À¾{å–¾ .Y¾iû¾fP/½Y”.=¾Ì> Y>ÿΖ>’?À>Û è>U?h$?f*?§Ì9?Ò&H? U?ba`?…j?ar?Lx?Ùµ|?–G?ü? Ð~?÷Ç{?‹év?á=p?mÑg?ì³]?CøQ?]´D?6?©ù%?C¼?i?£ Þ>‹Ûµ>ºXŒ>wŸC>@Ú='¦®<“>ƒ½Â˜¾+un¾J¡¾>,ʾ¿”ñ¾üœ ¿Éj¿û).¿™Š=¿#‰K¿u X¿2úb¿ì@l¿QÎs¿C”y¿ú‡}¿¢¿¥Þ¿:=~¿àÀz¿ÿfu¿$In¿(ne¿”æZ¿ÆN¿P#A¿Á2¿¿!¿9¿Jû¾|MÔ¾Ñë¾Hù¾äw.¾‹o®½\’49u#¯=»R.> ç> ²«>S<Ô> :û>O1?2¸!?û2? A?…ÀN?GòZ?*xe?dQn?lmu?ú¾z? <~?XÞ?–¢?H‰}?\–y?0Ñs?ŽDl?Žþb?YÿW?q{K?l{=?o.?8r?㤠?_¥ñ>=Ê>õ[¡>Ø™n> ¾>Ù‰ƒ=‚x­¼õÙ½øC¾#„Œ¾½¶¾O3Þ¾æ`¿–´¿|ò%¿aú5¿T®D¿ÞòQ¿5¯]¿mÍg¿Ÿ:p¿€ïv¿ Ì{¿5Ò~¿Yü¿KH¿[·|¿SNx¿rr¿Vj¿ìe`¿RU¿³,H¿#Ó9¿r*¿Q¿(¿ã羺À¾á–¾é$Y¾%ò¾+/½®¹.=Ö>/ Y>vÓ–>”À>è>Q?G&?%*?BÎ9?G(H?c U?‚b`?wj?#r?™Lx?9¶|?ÃG?lü?ÐÏ~?ŠÇ{?îèv?=p?oÐg?Á²]?íöQ?ß²D?^ÿ5?â÷%?\º?g?@Þ>-×µ>L–C>ƒ-Ú=p[®<8Qƒ½ÿ¡¾A~n¾N¡¾ˆ0ʾޘñ¾ñž ¿ l¿<.¿*Œ=¿ŠK¿¶ X¿Fûb¿ÓAl¿Ïs¿È”y¿Mˆ}¿5¢¿’Þ¿ô<~¿hÀz¿pou¿JHn¿me¿^åZ¿´ÄN¿È!A¿2¿²½!¿,7¿}Fû¾ë>t¶«>“@Ô>2>û>=3?º!?¨2?¨A?åÁN?æâZ?3ye?>Rn?nu?s¿z?f<~?kÞ?v¢?öˆ}?וy?zÐs?¨Cl?zýb?CX?zK?Úy=?¹.?ap?î¢ ?A¡ñ>F9Ê>†W¡>Ân>д>4wƒ=9í¼ªÚ½žƒC¾¡ˆŒ¾ ¶¾…7Þ¾éb¿}¶¿Cô%¿ü5¿Ó¯D¿4ôQ¿`°]¿jÎg¿n;p¿¬çv¿vÌ{¿nÒ~¿_ü¿H¿û¶|¿ÂMx¿¯r¿dj¿Ìd`¿U¿>+H¿ˆÑ9¿³*¿*¿,þ¿rßç¾fÀ¾ŽÜ–¾ÈY¾áè¾»/½ß.=Eß>PY>í×–>è À>!Ûç>M?&(?ä*?ÞÏ9?»)H?® U?¢c`?ij?ær?+Mx?˜¶|?ðG?fü?©Ò~?Ç{?Pèv?D¢¶>¾OŒ> C>ïÚ=¸®<Ýcƒ½<«¾V‡n¾íR¡¾Ó4ʾüœñ¾æ  ¿xn¿ò.¿9x=¿ø‹K¿÷ X¿[üb¿¹Bl¿½Ïs¿M•y¿ ˆ}¿U¢¿Þ¿®<~¿ð¿z¿Ænu¿ Sn¿le¿(äZ¿SÃN¿? A¿f2¿â»!¿>5¿kBû¾üDÔ¾»«¾?ð¾{e.¾aI¯½N9°H¯=$e.>ð>Úº«>ÓDÔ>DBû>+5?Ñ»!?V2?1 A?FÃN?äZ? le?Sn?Ànu?ë¿z?¬<~?~Þ?V¢?£ˆ}?R•y?ÄÏs?ÁBl?eüb?X?ŒK?Hx=?.?‰n?ø  ?#ñ>û4Ê>S¡>­‡n>“«>dƒ=ñ ®¼>ڽɌC¾“OŒ¾x¶¾º;Þ¾ëd¿c¸¿ ö%¿ªý5¿R±D¿ŠõQ¿‹±]¿hÏg¿<qY>cÜ–>=À>Kßç>þ?*?£*?yÑ9?0+H?úU?Âd`?[j?¨r?¼Mx?ø¶|?H?`ü?pÒ~?zÌ{?²çv?u;p?tÎg?k°]?AôQ?á¯D?ü5?Tô%?¶?üb?­7Þ>D ¶>̈Œ>õƒC>[Ú=Æ­<ƒvƒ½x´¾ln¾\W¡¾9ʾ¡ñ¾Û¢ ¿Op¿©.¿Ëy=¿ùyK¿7X¿oýb¿ŸCl¿sÐs¿Ò•y¿óˆ}¿u¢¿lÞ¿h<~¿w¿z¿nu¿FRn¿=ye¿òâZ¿òÁN¿·A¿¸2¿º!¿P3¿Y>û¾¼@Ô¾ž¶«¾ºë¾G\.¾Ä6¯½T[¹M[¯=Xn.>˜ô>A¿«>IÔ>VFû>7?¡½!?2?¹!A?¦ÄN?RåZ?me?BHn?jou?cÀz?ò<~?‘Þ?6¢?Pˆ}?Í”y?Ïs?ÛAl?Qûb? X?›ŠK?9Œ=?L.?²l?Ÿ ?™ñ>±0Ê>©N¡>—~n>W¢>êQƒ=¨X®¼Ò,Ú½ô•C¾TŒ¾×µ¾ï?Þ¾îf¿Jº¿Ñ÷%¿Oÿ5¿Ð²D¿àöQ¿¶²]¿fÐg¿ =p¿èèv¿†Ç{¿ÎÏ~¿lü¿ÅG¿<¶|¿ŸLx¿*r¿€j¿b`¿o U¿U(H¿RÎ9¿6*¿Y&¿d¿-è¾½À¾ Ó–¾† Y¾ZÖ¾».½­)/=Íñ>’$Y>Úà–>‘À>uãç>???b*?Ó9?¥,H?EU?áe`?Mj?kr?NNx?W·|?IH?Yü?7Ò~?Ì{?†ïv?§:p?vÍg?@¯]?ëòQ?c®D?qú5?ò%?¨´?ù`?w3Þ>ç¶>N„Œ>møC>ÇõÙ=I{­<(‰ƒ½µ½¾‚™n¾Ë[¡¾h=ʾ8¥ñ¾Ð¤ ¿'r¿_.¿]{=¿d{K¿MÿW¿„þb¿…Dl¿*Ñs¿W–y¿E‰}¿”¢¿YÞ¿"<~¿ÿ¾z¿rmu¿lQn¿4xe¿RòZ¿’ÀN¿.A¿ 2¿D¸!¿b1¿G:û¾|<Ô¾7²«¾6ç¾S.¾&$¯½*ö5¹Ún®=w.>ù>§Ã«>TMÔ>hJû>9?p¿!?±2?A#A?ÆN?ˆæZ?ne?In?ùfu?ÜÀz?8=~?¤Þ?¢?ý‡}?H”y?WÎs?õ@l?<úb? X?0‰K?¨Š=? *.?Ûj? ?ç”ñ>f,Ê>:J¡>un>™>E?ƒ=`£®¼f?Ú½ ŸC¾XŒ¾aÛµ¾{ Þ¾ðh¿1¼¿™ù%¿ó6¿O´D¿6øQ¿á³]¿cÑg¿Ù=p¿†év¿òÇ{¿Ð~¿ü¿˜G¿Ýµ|¿ Lx¿hr¿Žj¿ma`¿$ U¿à&H¿¶Ì9¿w*¿z$¿h¿ è¾»?À¾*Ï–¾dY¾Í¾¼•.½O/=û>³-Y>Qå–>åÀ>Ÿçç>??6*?¯Ô9?.H?‘U?g`??j?-r?ßNx?··|?vH?Sü?ýÑ~?¢Ë{?éîv?åDp?xÌg?®]?”ñQ?ä¬D?Ìø5?Åð%?²?÷^?B/Þ>‰¶>ÐŒ>BïC>¾áÚ=’0­<Í›ƒ½òƾ—¢n¾:`¡¾²AʾV©ñ¾Å¦ ¿þs¿.¿ï|=¿Ï|K¿ŽX¿Ëðb¿kEl¿àÑs¿Ü–y¿˜‰}¿´¢¿FÞ¿Ü;~¿†¾z¿Èlu¿‘Pn¿+we¿ñZ¿ÒN¿¦A¿]2¿t¶!¿t/¿56û¾;8Ծѭ«¾±â¾ÞI.¾‰¯½K˜¹x®=Ÿ.>¢ý>È«>”QÔ>zNû>õ:??Á!?^2?Ê$A?gÇN?¾çZ?'oe?÷In?£gu?áºz?~=~?¸Þ?ö¡?ª‡}?Óy?¡Ís?@l?(ùb?A X?ƇK?‰=?U(.?>‚?› ?Èñ>(Ê>ËE¡>lln>Ý> ,ƒ=ùQÚ½K¨C¾ ]Œ¾¿ßµ¾°Þ¾hO¿¾¿`û%¿˜6¿ÎµD¿ŒùQ¿ µ]¿aÒg¿¨>p¿#êv¿_È{¿AÐ~¿!ü¿ÐI¿}µ|¿|Kx¿¥r¿œj¿M``¿Ø U¿k%H¿Ë9¿¸*¿›"¿l¿Ùè¾g;À¾Û—¾C÷X¾Òþgp.½Wt/=U>Ô6Y>Çé–>:À>Éëç> ?ý?õ *?GÀ9?Ž/H?ÜU?!h`?1j?ïr?qOx?¸|?£H?Mü?ÄÑ~?6Ë{?Kîv?Dp?Ùg?ê¬]?>ðQ?e«D?(÷5?þî%?Û°?ô\? +Þ>+ýµ>R{Œ>æC>+ÏÚ=Ÿå°>Ä>tÌ«>ÔUÔ>‹Rû>ã<?Ã!? 2?R&A?ÈÈN?ôèZ?0pe?ÑJn?Mhu?Y»z?:~?ËÞ?Ö¡?X‡}?>“y?ëÌs?(?l?øb? X?[†K?„‡=?Ÿ&.?g€?ö³ ?ªŒñ>Ñ#Ê>\A¡>Vcn> †>ûƒ=Î8¯¼dÚ½w±C¾‹aŒ¾äµ¾æÞ¾kQ¿ò¥¿'ý%¿<6¿L·D¿âúQ¿6¶]¿_Óg¿v?p¿Áêv¿ËÈ{¿{Ð~¿(ü¿£I¿9º|¿êJx¿ãr¿ªj¿-_`¿U¿ö#H¿€É9¿ù*¿» ¿p¿¯è¾7À¾e—¾9kY¾Žº¾K.½¬™/=™ >õ?Y>>î–>Ž"À>óïç> ?Ý?³ *?âÁ9?H?'U?Ai`?#j?²r?Px?u¸|?ÐH?Fü?‹Ñ~?ÊÊ{?­ív?ICp?Øg?¿»]?èîQ?æ©D?ƒõ5?7í%?ô®?òZ?Ø&Þ>Îøµ>ÔvŒ>ëÜC>—¼Ú=çš°<Á‚½kپ´n¾i¡¾GJʾ“±ñ¾¯ª ¿­w¿‚.¿€=¿¤K¿X¿ôòb¿å:l¿LÓs¿æ—y¿=Š}¿ô¢¿Þ¿P;~¿•½z¿tku¿ÝNn¿ue¿±îZ¿NÏN¿–-A¿ÿ"2¿Õ²!¿˜+¿.û¾»/Ô¾¥«¾¨Ù¾u7.¾N쮽¹‹¸³¦®= .>ÃÈ>”«>ZÔ>Vû>Ñ>?ÞÄ!?¹2?Û'A?(ÊN?*êZ?9qe?¬Kn?÷hu?Ò»z?I:~?×Ý?¶¡?‡}?¸’y?4Ìs?B>l?ÿöb?¿X?ð„K?ò…=?é$.?~?² ?øÀñ>‡Ê>í<¡>@Zn>d}>Uƒ=†ƒ¯¼!wÚ½¢ºC¾ fŒ¾zèµ¾Þ¾mS¿Ø§¿æ%¿à6¿Ë¸D¿8üQ¿a·]¿\Ôg¿E@p¿_ëv¿7É{¿´Ð~¿.ü¿vI¿Ú¹|¿"Rx¿ r¿¸j¿ ^`¿AU¿"H¿äÇ9¿:*¿Ü¿t ¿…ÿç¾¾2À¾îþ–¾bY¾=0¾¼%.½¿/=Ü>IY>´ò–>ã&À>ôç>?¼?r *?~Ã9?„H?µU?`j`?j?tr?”Px?Õ¸|?üH?@ü?QÑ~?_Ê{?ív?zBp?×g?”º]?áÿQ?h¨D?ßó5?pë%?­?ïX?¢"Þ>pôµ>WrŒ>ÀÓC>ªÚ=0P°GÍ>ö˜«>$Ô>¯Zû>¿@?®Æ!?g2?c)A?‰ËN?`ëZ?Cre?†Ln?¢iu?K¼z?:~?êÝ?K£?²†}?3’y?~Ës?\=l?êõb?~X?†ƒK?`„=?2#.?¸|? ° ?Ú¼ñ>VÊ>~8¡>*Qn>'t>°ô‚==ί¼´‰Ú½ÍÃC¾‡jŒ¾Øìµ¾QÞ¾pU¿¿©¿Xè%¿ñ5¿IºD¿ŽýQ¿Œ¸]¿ZÕg¿Ap¿ýëv¿£É{¿íÐ~¿5ü¿JI¿{¹|¿Qx¿Ær¿Æj¿í\`¿öU¿ !H¿IÆ9¿|*¿ý¿x ¿[ûç¾j.À¾xú–¾÷XY¾ù&¾ïÿ/½Wä/= >7RY>+÷–>7+À>Gøç> ?›?1*?Å9?ùH?U?\`?j?7r?%Qx?4¹|?)I?:ü?Ñ~?óÉ{?rìv?¬Ap?Ög?i¹]?‹þQ?d»D?:ò5?¨é%?'«?ìV?mÞ>ðµ>ÙmŒ>•ÊC>p—Ú=y°<èæ‚½Sm¾sJn¾õq¡¾ÜRʾϹñ¾™® ¿\{¿ï!.¿7ƒ=¿z‚K¿‘X¿õb¿²ÌÑ>\«>V(Ô>ý&û>­B?}È!? 2?ë*A?éÌN?–ìZ?Lse?aMn?Lju?üz?Ö:~?þÝ?+£?ÍŠ}?®‘y?ÈÊs?u½QÊ>Íp¡>Hn>êj> â‚=ô°¼HœÚ½ùÌC¾oŒ¾6ñµ¾†Þ¾sW¿¦«¿ê%¿¨ò5¿M§D¿äþQ¿·¹]¿WÖg¿âAp¿›ìv¿Ê{¿'Ñ~¿;ü¿I¿¹|¿ÿPx¿r¿Èj¿Î[`¿ªU¿˜H¿®Ä9¿½*¿¿| ¿1÷ç¾*À¾ö–¾ÖOY¾¶¾šÚ/½# .=d)>X[Y>¡û–>‹/À>qüç>ý ?z?ð*?´Æ9?n!H?LU?9]`?j?ùr?¶Qx?”¹|?UI?3ü?ÞÐ~?‡É{?Ôëv?Ý@p?Õg?>¸]?5ýQ?æ¹D?6?áç%?@©?êT?8Þ>µëµ>[iŒ>iÁC>Ü„Ú=Áº¯<ù‚½v¾‰Sn¾¦9¡¾&Wʾí½ñ¾Ž° ¿3}¿¥#.¿É„=¿äƒK¿ÒX¿2öb¿˜=l¿­Ës¿V’y¿Ç†}¿T£¿åÝ¿}:~¿+¼z¿uiu¿MLn¿ýqe¿ëZ¿-ËN¿ý(A¿÷2¿5Æ!¿>@¿ŸYû¾ú"ԾЗ«¾̾×.¾v´®½8ô(8‹Þ®=§0.>QÖ>á«>—,Ô>+û>+*?LÊ!?Á!2?t,A?JÎN?ÌíZ?Ute?;Nn?öju?<½z?;~?Þ? £?{Š}?H˜y?Ês?;l?Áób?ýX?°€K?<=?Æ.? y?"¬ ?ž´ñ>sMÊ>^l¡>z»n>­a>fÏ‚=¬c°¼Û®Ú½$ÖC¾‚sŒ¾”õµ¾»#Þ¾uY¿Œ­¿æë%¿Lô5¿Ë¨D¿ëíQ¿âº]¿U×g¿°Bp¿9ív¿{Ê{¿`Ñ~¿Bü¿ñH¿¼¸|¿nPx¿Br¿Öj¿j`¿^U¿#H¿Ã9¿þ *¿?¿€¿óç¾Â%À¾Šñ–¾µFY¾r¾Eµ/½y/.=µ³>ydY>—>ß3À>›è>ù ?Y?¯*?PÈ9?ã"H?˜U?X^`?÷j?Sr?HRx?ó¹|?‚I?-ü?¥Ð~?É{?6ëv?@p?Ôg?·]?ßûQ?g¸D?s6?wþ%?Y§?çR?Þ>Wçµ>ÝdŒ>>¸C>HrÚ= p¯<2 ƒ½Ì¾Ÿ\n¾>¡¾¥ ʾ Âñ¾ƒ² ¿ ¿[%.¿[†=¿O…K¿X¿G÷b¿~>l¿dÌs¿Û’y¿‡}¿¾¡¿ÒÝ¿7:~¿²»z¿Ëhu¿sKn¿ôpe¿ÙéZ¿ÌÉN¿t'A¿I2¿eÄ!¿P>¿ŽUû¾øXÔ¾i“«¾•Ǿ¢.¾Ø¡®½Ù5Ÿ8)ñ®=Û9.>ÕÚ>)¦«>×0Ô>!/û>,?N³!?o#2?ü-A?ªÏN?ïZ?^ue?On? ku?´½z?b;~?$Þ?ì¢?(Š}?×y?Ós?©:l?¬òb?¼X?FK?ª=?.?2w?-ª ?€°ñ>)IÊ>ïg¡>d²n>×>Á¼‚=c®°¼oÁÚ½OßC¾xŒ¾ñùµ¾ñ'Þ¾x[¿s¯¿®í%¿ñõ5¿JªD¿AïQ¿ ¬]¿RØg¿~Cp¿Öív¿çÊ{¿šÑ~¿Hü¿ÄH¿]¸|¿ÜOx¿r¿äj¿öh`¿ÑU¿®H¿wÁ9¿? *¿`¿„¿Ýîç¾m!À¾í–¾”=Y¾. ¾ð/½ÎT.=ù¼>ƒðX>—>48À>Åè>ô?8!?n*?ëÉ9?W$H?ãU?x_`?éj?r?Kx?Rº|?¯I?&ü?lÐ~?®È{?˜êv?@?p?Óg?èµ]?‰úQ?è¶D?Î6?°ü%?s¥?åP?ÍÞ>ùâµ>_`Œ>¯C>µ_Ú=S%¯<׃½ ‰¾´en¾„B¡¾ð$ʾ½ñ¾x´ ¿â€¿'.¿í‡=¿º†K¿S X¿[øb¿d?l¿Ís¿`“y¿m‡}¿Þ¡¿ÆÞ¿ñ9~¿:»z¿!hu¿˜Jn¿ëoe¿£èZ¿lÈN¿ì%A¿œ2¿–Â!¿c<¿|Qû¾¸TÔ¾NË«¾þm .¾;®½–ñé8Ư=C.>Zß>ª«>5Ô>33û>.?µ!? 2?„/A? ÑN?7ðZ?gve?ðOn?Jlu?-¾z?¨;~?7Þ?Ì¢?Õ‰}?>—y?gÒs?Fl?˜ñb?{X?Û}K?~=?Y.?[u?7¨ ?b¬ñ>ÞDÊ>c¡>N©n>ÆÍ>•©ƒ=ù°¼ÔÚ½{èC¾~|Œ¾Oþµ¾&,Þ¾z]¿Z±¿uï%¿•÷5¿É«D¿˜ðQ¿8­]¿½Ëg¿MDp¿tîv¿SË{¿ÓÑ~¿Nü¿—H¿ý·|¿KOx¿½r¿òj¿Ög`¿†U¿-/H¿Ü¿9¿€ *¿€¿ˆ¿³êç¾À¾è–¾s4Y¾ê¾›j/½#z.=<Æ>¥ùX>ÝË–>ˆ<À>ïè>ð?#?-*?†Ë9?Ì%H?/ U?˜``?Ûj?Ør?¢Kx?–µ|?ÛI? ü?2Ð~?BÈ{?úév?r>p?Òg?¾´]?3ùQ?jµD?*6?éú%?˜½?âN?— Þ>›Þµ>á[Œ>ç¥C>!MÚ=›Ú®<|1ƒ½F’¾Ênn¾óF¡¾:)ʾۑñ¾œ› ¿¹‚¿Ç(.¿~‰=¿$ˆK¿” X¿pùb¿K@l¿ÑÍs¿å“y¿À‡}¿þ¡¿³Þ¿l=~¿Áºz¿wgu¿¾In¿âne¿mçZ¿ ÇN¿d$A¿î2¿ÇÀ!¿u:¿jMû¾xPÔ¾èÆ«¾tü¾9.¾|®½ªV9d¯=DL.>ßã>ö®«>W9Ô>E7û>õ/?í¶!?Í2? A?kÒN?mñZ?pwe?ÊPn?ôlu?¥¾z?î;~?KÞ?¬¢?‚‰}?¹–y?°Ñs?/El?Pÿb?:X?p|K?†|=?£.?ƒs?B¦ ?C¨ñ>”@Ê>_¡>9 n>‰Ä>ð–ƒ= D­¼–æÚ½¦ñC¾ü€Œ¾¬¶¾[0Þ¾}_¿@³¿<ñ%¿:ù5¿H­D¿îñQ¿c®]¿ºÌg¿:p¿ïv¿¾Ë{¿ Ò~¿Uü¿kH¿ž·|¿¹Nx¿úr¿j¿¶f`¿:U¿¸-H¿DÔ9¿Á*¿¡¿Œ¿‰æç¾ÄÀ¾'ä–¾R+Y¾¦ø¾FE/½xŸ.=€Ï>ÆY>TЖ>ŠÀ> è>ì?÷$?ì*?"Í9?A'H?z U?¸a`?Íj?›r?3Lx?öµ|?¤G?ü?ùÏ~?ÖÇ{?\év?£=p?!Ñg?“³]?Ý÷Q?ë³D?…6?"ù%?²»?jh?b Þ>>Úµ>cWŒ>¼œC>:Ú=ä®cè>]³«>—=Ô>W;û>ã1?¼¸!?{2?•A?îÀN?£òZ?yxe?¥Qn?žmu?¿z?5<~?^Þ?Œ¢?0‰}?4–y?úÐs?IDl?<þb?%X?{K?ôz=?í.?¬q?M¤ ?%¤ñ>I<Ê>£Z¡>#—n>L»>K„ƒ=ÅŽ­¼ úÙ½ÑúC¾z…Œ¾ ¶¾4Þ¾a¿'µ¿ó%¿Þú5¿Æ®D¿DóQ¿Ž¯]¿¸Íg¿Ü:p¿=çv¿*Ì{¿FÒ~¿[ü¿>H¿>·|¿(Nx¿8r¿j¿–e`¿ïU¿D,H¿©Ò9¿í*¿Â¿‘ÿ¿_âç¾pÀ¾°ß–¾1"Y¾cï¾ñ/½ÍÄ.=ÄØ>ç Y>ÊÔ–>Þ À>4Øç>è?Ö&?ª*?½Î9?¶(H?Æ U?Øb`?¿j?]r?ÅLx?U¶|?ÐG?jü?¿Ï~?jÇ{?¿èv?ÕÞ>àÕµ>åRŒ>“C>ú'Ú=-E®<ÇVƒ½¿¤¾ö€n¾ÑO¡¾Ï1ʾšñ¾†Ÿ ¿-m¿¿.¿¢Œ=¿úŠK¿ X¿™ûb¿Bl¿=Ïs¿ï”y¿fˆ}¿>¢¿ŒÞ¿à<~¿DÀz¿=ou¿ Hn¿Ïle¿åZ¿JÄN¿S!A¿“2¿(½!¿™6¿FEû¾øGÔ¾¾«¾kó¾òk.¾sV¯½ge9ž;¯=­^.>èì>÷«>×AÔ>i?û>Ñ3?Œº!?(2?A?NÂN?BãZ?‚ye?Rn?Hnu?–¿z?{<~?qÞ?l¢?݈}?¯•y?DÐs?cCl?'ýb?äX?K?by=?6.?Ôo?X¢ ? ñ>ÿ7Ê>4V¡>Žn>²>¦qƒ=|Ù­¼3 Ú½Y†C¾ø‰Œ¾h ¶¾Æ8Þ¾‚c¿·¿Ëô%¿ƒü5¿E°D¿šôQ¿¹°]¿¶Îg¿«;p¿Ûçv¿ÎÆ{¿Ò~¿aü¿H¿ß¶|¿–Mx¿ur¿j¿wd`¿£U¿Ï*H¿Ñ9¿.*¿ˆ)¿•ý¿5Þç¾À¾9Û–¾Y¾æ¾œú.½"ê.=â>Y>AÙ–>3À>^Üç>´ü?µ(?i*?XÐ9?**H?U?øc`?±j? r?VMx?µ¶|?ýG?dü?˜Ò~?þÆ{?!èv?U ¶>gNŒ>eŠC>fÚ=uú­lñ>*¼«>FÔ>{Cû>¿5?[¼!?Ö2?¦ A?¯ÃN?xäZ?Zle?YSn?ònu?Àz?Á<~?„Þ?L¢?Šˆ}?*•y?ŽÏs?}Bl?üb?£ X?š‹K?T=?€.?ým?c  ?é›ñ>´3Ê>ÅQ¡>ø„n>Ó¨>_ƒ=4$®¼ÇÚ½„C¾êPŒ¾Å¶¾û<Þ¾„e¿ô¸¿’ö%¿'þ5¿Ä±D¿ðõQ¿ä±]¿´Ïg¿z)Y>¸Ý–>‡À>ˆàç>°þ?”*?(*?óÑ9?Ÿ+H?]U?e`?£j?âr?èMx?·|?*H?^ü?_Ò~?ZÌ{?ƒçv?8;p?(Îg?°]?ÛóQ?o¯D?˜û5?Ìó%?þµ?bb?l6Þ>÷¶>u‡Œ>9C>ÒÚ=¾¯­<|ƒ½9·¾!“n¾®X¡¾d:ʾT¢ñ¾p£ ¿Üp¿+.¿Cz=¿ezK¿—X¿Âýb¿äCl¿ªÐs¿ú•y¿ ‰}¿~¢¿fÞ¿T<~¿S¿z¿ému¿Rn¿îxe¿•âZ¿‰ÁN¿BA¿82¿‰¹!¿½2¿#=û¾w?Ô¾Nµ«¾b꾉Y.¾81¯½Ü1P¹Èa®=q.>ñõ>À«>XJÔ>ŒGû>­7?+¾!?ƒ2?."A?ÅN?¯åZ?dme?ƒHn?œou?‡Àz?=~?—Þ?,¢?7ˆ}?¥”y?×Îs?—Al?þúb?b X?/ŠK?‹=??+.?&l?nž ?Ë—ñ>j/Ê>WM¡>â{n>–Ÿ>\Lƒ=ën®¼[2Ú½°˜C¾hUŒ¾Pص¾0AÞ¾‡g¿Ûº¿Yø%¿Ìÿ5¿B³D¿F÷Q¿³]¿±Ðg¿H=p¿év¿§Ç{¿ßÏ~¿ü¿·G¿ ¶|¿sLx¿ðr¿8j¿7b`¿ U¿å'H¿×Í9¿±*¿Ê%¿Ì¿ïè¾sÀ¾LÒ–¾ÍY¾—Ó¾ò¯.½Í4/=ô>J'Y>.â–>ÛÀ>³äç>¬?Î?ç*?Ó9?-H?¨U?7f`?•j?¥r?yNx?t·|?WH?Xü?&Ò~?îË{?Wïv?i:p?*Íg?ç®]?…òQ?ñ­D?ôù5?ò%?´?``?72Þ>š¶>÷‚Œ>²õC>>ðÙ=e­<¶Žƒ½vÀ¾7œn¾]¡¾¯>ʾr¦ñ¾e¥ ¿³r¿â.¿Õ{=¿Ð{K¿¬ÿW¿Öþb¿ÊDl¿`Ñs¿–y¿^‰}¿ž¢¿SÞ¿ <~¿Û¾z¿?mu¿+Qn¿åwe¿öñZ¿)ÀN¿¹A¿‹2¿¹·!¿Ï0¿9û¾7;Ծ谫¾Ýå¾TP.¾š¯½ýÓ*¹ft®=)ü->vú>÷Ä«>˜NÔ>žKû>›9?ú¿!?12?¶#A?pÆN?äæZ?mne?]In?,gu?Áz?M=~?ªÞ? ¢?å‡}? ”y?!Îs?°@l?êùb?" X?ĈK?0Š=?‰).?‰ƒ?yœ ?¬“ñ>+Ê>èH¡>Ìrn>Y–>·9ƒ=£¹®¼ïDÚ½Û¡C¾æYŒ¾®Üµ¾¼ Þ¾‰i¿Â¼¿ ú%¿p6¿Á´D¿œøQ¿:´]¿¯Ñg¿>p¿µév¿È{¿Ð~¿ü¿ïI¿Àµ|¿âKx¿.r¿Fj¿a`¿Á U¿q&H¿<Ì9¿ò*¿ë#¿Ð¿Å è¾q>À¾ÕÍ–¾¬ýX¾SʾœŠ.½"Z/=Ôý>k0Y>¥æ–>0À>Ýèç>¨?­?»*?*Õ9?‰.H?óU?Wg`?‡j?gr? Ox?Ó·|?ƒH?Qü?ìÑ~?‚Ë{?ºîv?¨Dp?-Ìg?¼­]?.ñQ?r¬D?Oø5?>ð%?1²?]^?.Þ><¶>z~Œ>‡ìC>5ÜÚ=O­<[¡ƒ½²É¾L¥n¾Œa¡¾ùBʾªñ¾Z§ ¿‹t¿˜.¿g}=¿;}K¿íX¿ñb¿°El¿Òs¿—y¿±‰}¿¾¢¿@Þ¿Ç;~¿b¾z¿•lu¿PPn¿Üve¿ÀðZ¿¦ÑN¿1A¿Ý2¿êµ!¿á.¿ÿ4û¾÷6Ô¾¬«¾Xá¾ G.¾ý ¯½v¹‡®=].>Á>]É«>ØRÔ>°Oû>‰;?ÉÁ!?Þ2??%A?ÐÇN?èZ?voe?8Jn?Ögu?»z?“=~?½Þ?ì¡?’‡}?›“y?kÍs?Ê?l?Õøb?á X?Z‡K?žˆ=?Ó'.?²?Uµ ?Žñ>Ô&Ê>yD¡>·in>>'ƒ=Z¯¼‚WÚ½«C¾d^Œ¾ áµ¾ñÞ¾P¿¨¾¿çû%¿6¿@¶D¿òùQ¿eµ]¿­Òg¿å>p¿Rêv¿È{¿RÐ~¿#ü¿ÂI¿|º|¿PKx¿kr¿Tj¿÷_`¿u U¿ü$H¿¡Ê9¿3*¿ "¿Õ¿›è¾:À¾‡—¾‹ôX¾Á¾Ge.½w/=>Œ9Y>ë–>„À>íç>¤?Œ?z *?ÁÀ9?ý/H??U?wh`?yj?)r?œOx?2¸|?°H?Kü?³Ñ~?Ë{?îv?ÙCp?ÂØg?‘¬]?ØïQ?óªD?ªö5?vî%?J°?[\?Ì)Þ>Þûµ>üyŒ>[ãC>¢ÉÚ=\ϰ<´ƒ½ïÒ¾b®n¾ûe¡¾DGʾ¯®ñ¾O© ¿bv¿N.¿ù~=¿¥~K¿.X¿2òb¿C:l¿ÌÒs¿ˆ—y¿Š}¿Þ¢¿-Þ¿;~¿ê½z¿ëku¿vOn¿Óue¿ŠïZ¿EÐN¿©.A¿0 2¿´!¿ó,¿í0û¾·2Ô¾¨«¾Ôܾë=.¾`ù®½€0À¸¡™®=’.>—Å>x‘«>WÔ>ÂSû>v=?™Ã!?Œ2?Ç&A?1ÉN?PéZ?pe?Kn?€hu?}»z?:~?ÐÞ?Ì¡??‡}?“y?´Ìs?ä>l?Á÷b? X?ï…K? ‡=?&.?Ú?`³ ?ÜÃñ>Š"Ê> @¡>¡`n>àƒ>lƒ=O¯¼jÚ½2´C¾ábŒ¾jåµ¾'Þ¾R¿ƒ¦¿®ý%¿¹6¿¾·D¿HûQ¿¶]¿ªÓg¿´?p¿ðêv¿ëÈ{¿ŒÐ~¿*ü¿–I¿º|¿ˆRx¿©r¿bj¿×^`¿*U¿‡#H¿É9¿t*¿- ¿Ù¿qè¾É5À¾—¾€hY¾Ë·¾ò?.½Ì¤/=[>­BY>’ï–>Ø#À>1ñç> ?k?9 *?]Â9?~H?ŠU?–i`?kj?ìr?.Px?’¸|?ÝH?Dü?zÑ~?ªÊ{?~ív? Cp?Å×g?f»]?‚îQ?t©D?õ5?¯ì%?c®?XZ?—%Þ>÷µ>~uŒ>0ÚC>·Ú=¤„°<,Ç‚½,ܾw·n¾ij¡¾ŽKʾͲñ¾D« ¿9x¿.¿‹€=¿€K¿oX¿Gób¿);l¿ÁÉs¿ ˜y¿VŠ}¿þ¢¿Þ¿;;~¿q½z¿Aku¿œNn¿Ête¿UîZ¿åÎN¿!-A¿"2¿K²!¿+¿Û,û¾w.Ô¾´£«¾Oؾ¶4.¾Â殽†éj¸?¬®=Ç.>Ê>ß•«>!Ô>ÔWû>d??hÅ!?92?P(A?‘ÊN?†êZ?ˆqe?íKn?*iu?ö»z?^:~?ÝÝ?¬¡?ì†}?‘’y?þËs?ý=l?¬öb?_X?„„K?z…=?f$.?~?k± ?¾¿ñ> YÊ>›;¡>‹Wn>£z>ǃ=É™¯¼ª|Ú½^½C¾_gŒ¾Çéµ¾\Þ¾T¿i¨¿ç%¿^6¿=¹D¿žüQ¿º·]¿¨Ôg¿‚@p¿Žëv¿WÉ{¿ÅÐ~¿0ü¿iI¿¾¹|¿÷Qx¿ær¿pj¿¸]`¿ÞU¿"H¿jÇ9¿µ*¿N¿Ý ¿Gþç¾t1À¾šý–¾__Y¾z-¾.½!Ê/=Ÿ>ÎKY> ô–>-(À>[õç>œ?K?ø *?øÃ9?óH?U?¶j`?]j?®r?¿Px?ñ¸|? I?>ü?@Ñ~?>Ê{?àìv?=Bp?ÇÖg?;º]?{ÿQ?ö§D?aó5?èê%?|¬?VX?a!Þ>#óµ>qŒ>ÑC>z¤Ú=í9°<ÑÙ‚½Öf¾Àn¾Øn¡¾ÙOʾë¶ñ¾:­ ¿z¿» .¿‚=¿{K¿°X¿[ôb¿ Î>Eš«>Z%Ô>"$û>RA?8Ç!?ç2?Ø)A?òËN?¼ëZ?’re?ÇLn?Ôiu?o¼z?¥:~?ðÝ?B£?™†}? ’y?HËs?=l?˜õb?X?ƒK?èƒ=?°".?,|?v¯ ? »ñ>ÁTÊ>ês¡>uNn>fq>"ï‚=€ä¯¼=Ú½‰ÆC¾ÝkŒ¾%îµ¾’Þ¾ V¿Pª¿ßè%¿ñ5¿»ºD¿ôýQ¿å¸]¿¥Õg¿QAp¿,ìv¿ÃÉ{¿ÿÐ~¿7ü¿=I¿^¹|¿eQx¿Œr¿}j¿˜\`¿“U¿ž H¿ÏÅ9¿ö*¿n¿á ¿úç¾ -À¾#ù–¾>VY¾7$¾Ðô/½vï/=ã">ïTY>ø–>,À>…ùç>˜ ?*?¶*?”Å9?h H?cU?n\`?Oj?pr?PQx?Q¹|?6I?8ü?Ñ~?ÒÉ{?Cìv?nAp?ÊÕg?¹]?%þQ?òºD?½ñ5?!é%?–ª?SV?,Þ>Åîµ>‚lŒ>ÙÇC>ç‘Ú=6ï¯%Ó>¬ž«>›)Ô>4(û>Ð(?É!?” 2?`+A?RÍN?òìZ?›se?¢Mn?~ju?ç¼z?ë:~?Þ?"£?µŠ}?‡‘y?‘Ês?1vPÊ>{o¡>ÚÁn>)h>}Ü‚=7/°¼Ñ¡Ú½´ÏC¾[pŒ¾ƒòµ¾Ç Þ¾ X¿7¬¿§ê%¿%ó5¿¿§D¿JÿQ¿º]¿£Ög¿Bp¿Êìv¿/Ê{¿8Ñ~¿=ü¿I¿ÿ¸|¿ÔPx¿Êr¿j¿x[`¿GU¿)H¿3Ä9¿8*¿¿å¿óõç¾Ì(À¾­ô–¾MY¾ó¾{Ï/½C.=',>^Y>öü–>Õ0À>¯ýç>” ? ?u*?/Ç9?Ý!H?¯U?Ž]`?Mj?3r?âQx?°¹|?cI?1ü?ÍÐ~?fÉ{?¥ëv? @p?ÌÔg?å·]?ÏüQ?t¹D?š6?Yç%?¯¨?QT?÷Þ>hêµ>hŒ>®¾C>SÚ=~¤¯<ÿ‚½Py¾>Vn¾ù:¡¾nXʾ'¿ñ¾$± ¿À}¿'$.¿A…=¿P„K¿1X¿…öb¿Ü=l¿äËs¿~’y¿à†}¿¨¡¿àÝ¿h:~¿¼z¿Ciu¿ Ln¿®qe¿³êZ¿ÄÊN¿ˆ(A¿w2¿«Å!¿«?¿iXû¾¶!Ô¾€–«¾Áʾ.¾ê®®½é|U8ä®=e3.>©×>£«>Û-Ô>F,û>¾*? ²!?A"2?é,A?³ÎN?(îZ?¤te?|Nn?)ku?`½z?1;~?Þ?£?bŠ}? ˜y?ÛÉs?J;l?nób?X?D€K?Ä€=?C.?}x?Œ« ?d³ñ>,LÊ> k¡>Ÿn>Ý>ØÉ‚=ïy°¼d´Ú½àØC¾ÙtŒ¾áöµ¾ü$Þ¾Z¿®¿nì%¿Êô5¿=©D¿QîQ¿;»]¿ ×g¿íBp¿hív¿›Ê{¿qÑ~¿Dü¿ãH¿ ¸|¿BPx¿r¿Žj¿Ài`¿üU¿´H¿˜Â9¿y *¿°¿é¿Éñç¾w$À¾6ð–¾üCY¾¯¾&ª/½˜:.=w¶>1gY>l—>*5À>Øè>?è?4*?ÊÈ9?R#H?úU?®^`??j?r?sRx?º|?I?+ü?”Ð~?úÈ{?ëv?Ñ?p?ÏÓg?º¶]?yûQ?õ·D?õ6?ðý%?Ȧ?NR?ÁÞ> æµ>†cŒ>ƒµC>ÀlÚ=ÇY¯<Àƒ½‚¾T_n¾g?¡¾ì!ʾEÃñ¾³ ¿—¿Þ%.¿Ò†=¿»…K¿rX¿™÷b¿Ã>l¿šÌs¿“y¿3‡}¿È¡¿ÓÞ¿":~¿»z¿˜hu¿2Kn¿¥pe¿}éZ¿cÉN¿ÿ&A¿É2¿ÛÃ!¿½=¿WTû¾´WÔ¾’«¾=ƾä.¾Lœ®½2zµ8µö®=™<.>.Ü>y§«>2Ô>X0û>¬,?س!?ò 2?q.A?ÐN?^ïZ?­ue?WOn?Óku?ؽz?w;~?*Þ?â¢?Š}?›—y?çÒs?d:l?Zòb?\X?Ù~K?2=?.?¦v?—© ?F¯ñ>áGÊ>f¡>¯¯n>BÔ>¬¶ƒ=¦Ä°¼øÆÚ½ âC¾WyŒ¾>ûµ¾2)Þ¾\¿°¿5î%¿nö5¿¼ªD¿§ïQ¿f¬]¿žØg¿¼Cp¿îv¿Ë{¿«Ñ~¿Jü¿·H¿@¸|¿±Ox¿Er¿œj¿ h`¿nU¿?H¿üÀ9¿º *¿Ñ¿í¿Ÿíç¾# À¾¿ë–¾Û:Y¾k¾Ñ„/½í_.=»¿><óX>ã—>~9À>è>Œ?Ç!?ó*?fÊ9?Ç$H?F U?Î_`?1j?Pr?;Kx?oº|?¼I?$ü?ZÐ~?ŽÈ{?iêv??p?ÑÒg?µ]?#úQ?v¶D?Q6?)ü%?î¾?KP?ŒÞ>¬áµ>_Œ>W¬C>,ZÚ=¯³à>à««>[6Ô>j4û>š.?¨µ!? 2?ùA?sÑN?”ðZ?¶ve?1Pn?}lu?Q¾z?½;~?=Þ?¢?½‰}?—y?0Òs?ÑEl?Eñb?X?o}K? }=?×.?Ît?¢§ ?(«ñ>—CÊ>/b¡>š¦n>Ë>¤ƒ=]±¼‹ÙÚ½6ëC¾Õ}Œ¾œÿµ¾g-Þ¾^¿ë±¿üï%¿ø5¿;¬D¿ýðQ¿‘­]¿Ìg¿ŠDp¿£îv¿sË{¿äÑ~¿Pü¿ŠH¿á·|¿ Ox¿ƒr¿ªj¿€g`¿#U¿¾.H¿a¿9¿û*¿ò¿ñ¿uéç¾ÏÀ¾Iç–¾º1Y¾(ÿ¾|_/½B….=ÿÈ>]üX>1Í–>Ò=À>, è>ˆ?¦#?²*?Ì9?;&H?‘ U?î``?#j?r?ÍKx?³µ|?èI?ü?!Ð~?"È{?Ëév?4>p?ÓÑg?d´]?ÍøQ?ø´D?­6?aú%?½?Ói?V Þ>Nݵ>ŠZŒ>,£C>˜GÚ=XÄ®< 7ƒ½•¾qn¾EH¡¾‚*ʾ“ñ¾1œ ¿Eƒ¿J).¿ö‰=¿ˆK¿ô X¿Âùb¿@l¿Îs¿ ”y¿Ù‡}¿¢¿­Þ¿W=~¿Áz¿Dgu¿}In¿“ne¿çZ¿¢ÆN¿ï#A¿n2¿=À!¿á9¿4Lû¾4OÔ¾˜Å«¾û¾{ý-¾w®½Öx%9ï¯=O.>7å>F°«>›:Ô>{8û>ˆ0?w·!?M2?A?ö¿N?ÊñZ?¿we? Qn?'mu?ɾz?<~?PÞ?£¢?j‰}?’–y?zÑs?ëDl?þþb?ÚÿW?|K?|=?!.?÷r?­¥ ? §ñ>L?Ê>À]¡>„n>ÉÁ>b‘ƒ=QZ­¼ìÚ½aôC¾S‚Œ¾ù¶¾œ1Þ¾`¿Ñ³¿Äñ%¿·ù5¿º­D¿TòQ¿¼®]¿Íg¿K:p¿Aïv¿ßË{¿Ò~¿Wü¿]H¿·|¿ŽNx¿Àr¿¸j¿`f`¿×U¿I-H¿ÊÓ9¿<*¿¿õ¿Kåç¾zÀ¾Òâ–¾™(Y¾äõ¾':/½˜ª.=CÒ>~Y>¨Ñ–>ÔÀ>Vè>„?…%?q*?œÍ9?°'H?Ý U?b`?j?Õr?_Lx?¶|?±G?ü?çÏ~?¶Ç{?-év?f=p?ÖÐg?:³]?w÷Q?y³D?6?šø%?!»?Ñg?ÊAÞ>ñص> VŒ>šC>5Ú=¡y®<°Iƒ½Cž¾•zn¾´L¡¾Ì.ʾ4—ñ¾&ž ¿âk¿+.¿ˆ‹=¿û‰K¿4 X¿×úb¿vAl¿½Îs¿’”y¿,ˆ}¿(¢¿šÞ¿=~¿™Àz¿µou¿¢Hn¿Šme¿ÛåZ¿BÅN¿f"A¿Á2¿m¾!¿ó7¿"Hû¾ôJÔ¾2Á«¾—ö¾hr.¾td®½´ÖJ9.¯=7X.>¼é>­´«>Ü>Ô><û>v2?F¹!?û2? A?WÁN?iâZ?Èxe?æQn?Ñmu?B¿z?I<~?cÞ?ƒ¢?‰}? –y?ÄÐs?Dl?éýb?ÅX?™zK?|z=?j.?q?¸£ ?ë¢ñ>;Ê>QY¡>n”n>Œ¸>½~ƒ=¥­¼)Ú½ýC¾Ð†Œ¾W¶¾Ñ5Þ¾b¿¸µ¿‹ó%¿\û5¿8¯D¿ªóQ¿ç¯]¿Îg¿;p¿lçv¿KÌ{¿WÒ~¿]ü¿0H¿"·|¿ýMx¿þr¿Æj¿Ae`¿ŒU¿Õ+H¿.Ò9¿h*¿3¿ùþ¿!áç¾&À¾[Þ–¾xY¾ ì¾Ñ/½íÏ.=‡Û>ŸY>Ö–>( À>rÙç>?d'?/*?7Ï9?%)H?( U?.c`?j?—r?ðLx?r¶|?ÞG?iü?®Ï~?JÇ{?èv?—e¶>QŒ>ÕC>q"Ú=é.®@î>¹«>CÔ>Ÿ@û>d4?»!?¨2?’A?·ÂN?ŸãZ? ke?ÀRn?{nu?º¿z?<~?wÞ?c¢?Ĉ}?ˆ•y?Ðs?Cl?Õüb?„X?˜ŒK?êx=?´.?Ho?á ?Ížñ>·6Ê>âT¡>Y‹n>O¯>lƒ=¿ï­¼¼Ú½‰C¾N‹Œ¾µ ¶¾:Þ¾d¿Ÿ·¿Rõ%¿ý5¿·°D¿õQ¿±]¿Ïg¿é;p¿ èv¿ïÆ{¿Ò~¿cü¿H¿Â¶|¿kMx¿<r¿Ôj¿!d`¿AU¿`*H¿“Ð9¿©*¿ù(¿ýü¿÷Üç¾ÑÀ¾åÙ–¾WY¾\ã¾|ï.½Bõ.=Ëä>ÀY>–Ú–>}À>œÝç>Lý?C)?î*?ÓÐ9?š*H?tU?Md`?ùj?Zr?‚Mx?Ѷ|? H?bü?‡Ò~?ÞÆ{?òçv?É;p?ÚÎg?ä°]?ËôQ?|°D?¿ü5? õ%?T·?Ìc?`9Þ> ¶>œŠŒ>©‡C>ÝÚ=2ä­<únƒ½½°¾ÀŒn¾’U¡¾a7ʾpŸñ¾¢ ¿‘o¿ø.¿(y=¿ÐŒK¿¶X¿ýb¿BCl¿*Ðs¿œ•y¿Ñˆ}¿h¢¿tÞ¿…<~¿¨¿z¿anu¿žRn¿¨ye¿oãZ¿ÂN¿UA¿f2¿Îº!¿4¿þ?û¾sBÔ¾e¸«¾Ží¾ÿ_.¾I>¯½Žmj¹ÈS¯= j.>Åò>z½«>\GÔ>±Dû>R6?å¼!?V2?!A?ÄN?ÕäZ?©le?éGn?%ou?3Àz?Ö<~?ŠÞ?C¢?rˆ}?•y?WÏs?8Bl?Àûb?D X?-‹K?ÜŒ=?ý.?pm?Ο ?¯šñ>m2Ê>sP¡>C‚n>¦>sYƒ=w:®¼P%Ú½@’C¾@RŒ¾¶¾<>Þ¾f¿…¹¿÷%¿¥þ5¿6²D¿VöQ¿=²]¿ÿÏg¿·â Y> ß–>ÑÀ>Æáç>Hÿ?}?­*?nÒ9?,H?¿U?me`?ëj?r?Nx?1·|?7H?\ü?NÒ~?:Ì{?Tçv?ú:p?ÝÍg?¹¯]?uóQ?ý®D?û5?Eó%?mµ?Éa?+5Þ>ª¶>†Œ>"üC>IýÙ={™­<Ÿƒ½ù¹¾Ö•n¾Z¡¾¬;Ê¾Ž£ñ¾¤ ¿hq¿®.¿ºz=¿ÑzK¿÷X¿þb¿(Dl¿àÐs¿!–y¿$‰}¿ˆ¢¿`Þ¿?<~¿/¿z¿·mu¿ÄQn¿Ÿxe¿ÐòZ¿ ÁN¿ÍA¿¸2¿ÿ¸!¿)2¿ì;û¾3>Ô¾þ³«¾ é¾ËV.¾¬+¯½°E¹Tg®=Õs.>J÷>àÁ«>œKÔ>ÃHû>@8?µ¾!?2?£"A?xÅN? æZ?³me?ÄHn?´fu?«Àz?=~?Þ?#¢?ˆ}?~”y?¡Îs?RAl?¬úb? X?ÉK?J‹=?¼*.?™k?Ù ?‘–ñ>".Ê>L¡>-yn>Öœ>ÎFƒ=.…®¼ä7Ú½k›C¾¾VŒ¾žÙµ¾qBÞ¾ h¿l»¿áø%¿I6¿´³D¿¬÷Q¿h³]¿ýÐg¿†=p¿Fév¿ÇÇ{¿ðÏ~¿ü¿ªG¿¶|¿HLx¿·r¿ðj¿áa`¿ª U¿v'H¿]Í9¿,*¿;%¿5¿± è¾)À¾øÐ–¾Y¾ÔоҤ.½ì?/=R÷>*Y>ƒã–>&À>ðåç>D?]?*? Ô9?ƒ-H? U?f`?Ýj?Þr?¥Nx?·|?dH?Vü?Ò~?ÎË{?(ïv?,:p?ßÌg?Ž®]?òQ?­D?vù5?}ñ%?†³?Ç_?ö0Þ>M¶>¡Œ>÷òC>@éÚ=ÃN­Îû>FÆ«>ÜOÔ>ÕLû>.:?„À!?±2?+$A?ÙÆN?AçZ?¼ne?ŸIn?^gu?$Áz?b=~?°Þ?¢?̇}?ø“y?ëÍs?l@l?—ùb? X?XˆK?¸‰=?).?ý‚?ä› ?r’ñ>Ø)Ê>–G¡>pn>™“>)4ƒ=æÏ®¼wJÚ½—¤C¾<[Œ¾ûݵ¾ý Þ¾#j¿S½¿¨ú%¿î6¿3µD¿ùQ¿“´]¿ûÑg¿T>p¿äév¿3È{¿*Ð~¿ü¿âI¿¤µ|¿¶Kx¿ôr¿þj¿Á``¿^ U¿&H¿ÁË9¿m*¿\#¿9¿‡ è¾'=À¾Ì–¾ôúX¾Ç¾}.½Ae/=–>$3Y>ùç–>zÀ>êç>@?<?@ *?¡¿9?ø.H?VU?­g`?Ïj?¡r?6Ox?ð·|?‘H?Oü?ÛÑ~?bË{?‹îv?jDp?áËg?c­]?ÉðQ?¬D?Ò÷5?¶ï%? ±?Ä]?À,Þ>ïþµ>#}Œ>ËéC>¬ÖÚ=б<馃½s̾¨n¾Þb¡¾ADʾ˫ñ¾ð§ ¿u¿.¿Þ}=¿§}K¿MX¿pñb¿õEl¿MÒs¿+—y¿É‰}¿Ç¢¿:Þ¿²;~¿>¾z¿blu¿Pn¿ve¿dðZ¿=ÑN¿½/A¿]2¿`µ!¿M.¿È3û¾³5Ô¾1««¾à¾bD.¾q¯½å§ô¸Œ®=.>kÂ>­Ê«>TÔ>æPû><?TÂ!?^2?´%A?9ÈN?wèZ?Åoe?yJn?hu?)»z?¨=~?ÃÞ?ã¡?y‡}?s“y?4Ís?…?l?ƒøb? X?î†K?&ˆ=?P'.?%?À´ ?TŽñ>%Ê>'C¡>gn>\Š>ƒ!ƒ=¯¼ ]ڽ­C¾º_Œ¾Yâµ¾2Þ¾›P¿9¿¿oü%¿’6¿²¶D¿XúQ¿¾µ]¿øÒg¿#?p¿‚êv¿ŸÈ{¿cÐ~¿%ü¿µI¿`º|¿%Kx¿1r¿ j¿¢_`¿ U¿$H¿&Ê9¿®*¿}!¿=¿^è¾Ó8À¾2—¾ÓñX¾M¾¾(Z.½–Š/=Ú >Epì–>Î À>Dîç><??ÿ *?<Á9?yH?¢U?Ìh`?Áj?cr?ÇOx?O¸|?¾H?Iü?¢Ñ~?öÊ{?íív?œCp?wØg?8¬]?rïQ?ªD?-ö5?ïí%?¹¯?Á[?‹(Þ>‘úµ>¥xŒ> àC>ÄÚ=¹°<º‚½°Õ¾±n¾Mg¡¾‹Hʾé¯ñ¾å© ¿ïv¿Ñ.¿p=¿K¿ŽX¿…òb¿ˆ:l¿Ós¿°—y¿Š}¿ç¢¿'Þ¿l;~¿Æ½z¿¸ku¿5On¿„ue¿.ïZ¿ÜÏN¿4.A¿¬#2¿³!¿_,¿·/û¾s1Ծ˦«¾{Û¾-;.¾Ôó®½(쩸-Ÿ®=P.>ïÆ>È’«>\XÔ>øTû> >?#Ä!? 2?<'A?šÉN?­éZ?Îpe?TKn?³hu?¡»z?-:~?ÖÞ?á?&‡}?î’y?~Ìs?Ÿ>l?n÷b?AX?ƒ…K?”†=?š%.?N?˲ ?¢Âñ>C!Ê>¸>¡>ì]n>>Þƒ=Te¯¼ŸoÚ½î¶C¾8dŒ¾·æµ¾hÞ¾R¿§¿6þ%¿66¿0¸D¿®ûQ¿è¶]¿öÓg¿ñ?p¿ëv¿ É{¿Ð~¿,ü¿ˆI¿º|¿]Rx¿or¿j¿‚^`¿ÇU¿#H¿‹È9¿ï*¿ž¿A¿4è¾~4À¾¼—¾ÈeY¾ µ¾Ò4.½ë¯/=>fEY>çð–>#%À>nòç>8?ú?¾ *?×Â9?îH?/U?ìi`?³j?&r?YPx?®¸|?êH?Cü?hÑ~?ŠÊ{?Oív?ÎBp?y×g? »]?îQ?©D?‰ô5?(ì%?Ò­?¿Y?V$Þ>4öµ>'tŒ>u×C>…±Ú=an°<ºÌ‚½Z`¾,ºn¾¼k¡¾ÖLʾ´ñ¾Ú« ¿Æx¿‡.¿=¿|€K¿ÏX¿™ób¿n;l¿÷És¿5˜y¿oŠ}¿£¿Þ¿&;~¿M½z¿ku¿ZNn¿{te¿øíZ¿|ÎN¿¬,A¿ÿ!2¿Ê!¿q*¿¥+û¾2-Ô¾d¢«¾÷Ö¾ø1.¾6ᮽÕ`>¸Ë±®=….>tË>/—«>^"Ô> Yû>ø??òÅ!?¹2?Ä(A?úÊN?ãêZ?×qe?.Ln?]iu?¼z?s:~?ãÝ?£¡?Ó†}?i’y?ÈËs?¹=l?Zöb?X?„K?…=?ä#.?w}?Ö° ?„¾ñ>ÄWÊ>I:¡>ÖTn>âw>9ü‚= °¯¼2‚Ú½ÀC¾¶hŒ¾ëµ¾Þ¾ T¿ú¨¿ ç%¿Û6¿¯¹D¿ýQ¿¸]¿óÔg¿À@p¿½ëv¿wÉ{¿ÖÐ~¿2ü¿\I¿¡¹|¿ËQx¿r¿'j¿b]`¿|U¿£!H¿ïÆ9¿0*¿¿¿E ¿ ýç¾*0À¾Eü–¾§\Y¾¸*¾}.½AÕ/=b>‡NY>]õ–>w)À>˜öç>3 ?Ù?}*?sÄ9?bH?zU?¤[`?¥j?èr?êPx?¹|?I?<ü?/Ñ~?Ê{?±ìv?ÿAp?|Ög?â¹]?ÿQ?„§D?äò5?`ê%?ë«?¼W? Þ>Öñµ>©oŒ>IÎC>ñžÚ=ª#°<_ß‚½—i¾ÇFn¾*p¡¾ Qʾ%¸ñ¾Ï­ ¿z¿=!.¿”‚=¿çK¿X¿®ôb¿TùÏ>•›«>Ÿ&Ô>X%û>åA?ÂÇ!?g2?M*A?[ÌN?ìZ?áre?Mn?ju?’¼z?º:~?öÝ?8£?€†}?ä‘y?Ës?ÓySÊ>˜r¡>ÀKn>¦n>”é‚=Ãú¯¼Æ”Ú½DÉC¾4mŒ¾rïµ¾ÓÞ¾£V¿áª¿gé%¿þñ5¿-»D¿ZþQ¿>¹]¿ñÕg¿ŽAp¿[ìv¿ãÉ{¿Ñ~¿9ü¿/I¿B¹|¿:Qx¿Rr¿)j¿B\`¿0U¿. H¿TÅ9¿q*¿à¿J ¿àøç¾Ö+À¾Ï÷–¾†SY¾t!¾°é/½–ú/=¥%>¨WY>Ôù–>Ë-À>Âúç>/ ?¸?<*?Æ9?× H?ÆU?Ä\`?£j?ªr?|Qx?m¹|?CI?6ü?öÐ~?²É{?ìv?1Ap?~Õg?·¸]?¿ýQ?€ºD??ñ5?™è%?ª?ºU?ëÞ>xíµ>+kŒ>ÅC>^ŒÚ=óد<ò‚½Ôr¾ÝOn¾Ü7¡¾jUʾC¼ñ¾Ä¯ ¿u|¿ô".¿&„=¿RƒK¿PX¿Âõb¿;=l¿dËs¿ ’y¿¦†}¿G£¿íÝ¿š:~¿\¼z¿ºiu¿¦Ln¿ire¿ŒëZ¿»ËN¿›)A¿¤2¿ðÆ!¿A¿#û¾²$Ô¾—™«¾í;.¾û»®½?Ù7×®=î,.>}Ô>üŸ«>ß*Ô>j)û>c)?‘É!?!2?Õ+A?»ÍN?OíZ?êse?ãMn?±ju? ½z?;~? Þ?£?œŠ}?_‘y?[Ês?ì;l?1ôb?~X?CK?Þ=?w .?Èy?ì¬ ?H¶ñ>/OÊ>)n¡>%¿n>ie>ïÖ‚=zE°¼Z§Ú½pÒC¾²qŒ¾Ðóµ¾"Þ¾¥X¿È¬¿.ë%¿¢ó5¿1¨D¿°ÿQ¿iº]¿îÖg¿]Bp¿ùìv¿OÊ{¿IÑ~¿?ü¿I¿ã¸|¿¨Px¿r¿7j¿Šj`¿äU¿ºH¿¹Ã9¿² *¿¿N¿¶ôç¾'À¾Xó–¾eJY¾0¾[Ä/½b .=é.>É`Y>Jþ–> 2À>ìþç>+ ?˜?ú*?©Ç9?L"H?U?ä]`?•j?r? Rx?̹|?pI?/ü?¼Ð~?FÉ{?vëv?b@p?Ôg?Œ·]?iüQ?¹D?6?Òæ%?¨?·S?¶Þ>éµ>®fŒ>ó»C>ÊyÚ=;ޝ<©ƒ½|¾óXn¾K<¡¾éʾaÀñ¾¹± ¿L~¿ª$.¿¸…=¿¼„K¿‘X¿×öb¿!>l¿Ìs¿¥’y¿ù†}¿±¡¿ÚÝ¿T:~¿ã»z¿iu¿ËKn¿_qe¿VêZ¿[ÊN¿(A¿÷2¿!Å!¿?¿3Wû¾r Ô¾1•«¾iɾZ.¾^©®½Í8£é®=#6.>Ù>b¤«>/Ô>|-û>Q+?“²!?Á"2?]-A?ÏN?„îZ?óte?½Nn?[ku?„½z?F;~?Þ?ù¢?IŠ}?ù—y?¤És?;l?ób?=X?ØK?M€=?Á.?ñw?÷ª ?*²ñ>åJÊ>ºi¡>¶n>¾Ú>JÄ‚=2°¼í¹Ú½›ÛC¾0vŒ¾.øµ¾=&Þ¾¨Z¿®®¿öì%¿Gõ5¿°©D¿·îQ¿”»]¿ì×g¿+Cp¿—ív¿»Ê{¿‚Ñ~¿Eü¿ÖH¿ƒ¸|¿Px¿Îr¿Ej¿ji`¿WU¿EH¿Â9¿ô *¿!¿R¿Œðç¾-#À¾âî–¾DAY¾ì¾Ÿ/½¸E.=:¹>êiY>Á—>t6À>è>'?w ?¹*?EÉ9?Á#H?]U?_`?‡j?Çr?ÕJx?,º|?I?)ü?ƒÐ~?ÚÈ{?Øêv?”?p?ƒÓg?a¶]?ûQ?ƒ·D?x6?hý%?7¦?µQ?€Þ>½äµ>0bŒ>DzC>7gÚ=„C¯‡Ý>ɨ«>_3Ô>Ž1û>?-?b´!?r 2?æ.A?|ÐN?ºïZ?üue?˜On?lu?ü½z?Œ;~?0Þ?Ù¢?÷‰}?t—y?°Òs?:l?òb?ýX?m~K?»~=? .?v?© ? ®ñ>šFÊ>Ke¡>ú¬n>Ñ>±ƒ=éÚ°¼ÌÚ½ÆäC¾­zŒ¾‹üµ¾s*Þ¾ª\¿•°¿½î%¿ìö5¿.«D¿ ðQ¿¿¬]¿êØg¿ùCp¿4îv¿'Ë{¿¼Ñ~¿Lü¿©H¿$¸|¿†Ox¿ r¿Tj¿Jh`¿ U¿Ä/H¿‚À9¿5 *¿B¿V¿bìç¾ÙÀ¾kê–¾#8Y¾©¾±y/½ k.=~Â>ôõX>7—>È:À>@è>#?V"?x*?àÊ9?6%H?© U?$``?yj?Šr?gKx?pµ|?ÉI?"ü?IÐ~?nÈ{?:êv?Å>p?…Òg?6µ]?½ùQ?¶D?Ô6?¡û%?]¾?²O?KÞ>_àµ>²]Œ>œ©C>£TÚ=Íø®<ô)ƒ½ŠŽ¾kn¾(E¡¾~'ʾ1ñ¾Ñš ¿û¿(.¿Üˆ=¿’‡K¿ X¿ùb¿î?l¿‡Ís¿°“y¿Ÿ‡}¿ñ¡¿ºÞ¿ˆ=~¿òºz¿»gu¿Jn¿Moe¿ëçZ¿šÇN¿%A¿œ2¿‚Á!¿<;¿Oû¾0RÔ¾¯È«¾_À¾ñ.¾#„®½$= 9Þ¯=ŒH.> â>/­«>Ÿ7Ô> 5û>-/?2¶!? 2?nA?ÜÑN?ððZ?we?rPn?¯lu?u¾z?Ò;~?CÞ?¹¢?¤‰}?ï–y?úÑs?ŒEl?óðb?¼X?}K?)}=?T.?Bt? § ?í©ñ>PBÊ>Ü`¡>å£n>EÈ>yžƒ=Ü%­¼ßÚ½òíC¾+Œ¾é¶¾¨.Þ¾­^¿|²¿„ð%¿ø5¿­¬D¿cñQ¿ê­]¿TÌg¿ÈDp¿Òîv¿“Ë{¿õÑ~¿Rü¿}H¿Ä·|¿ôNx¿Ir¿bj¿*g`¿ÀU¿O.H¿êÔ9¿v*¿c¿Z¿8è羄À¾ôå–¾/Y¾eü¾\T/½b.=ÂË>ÿX>†Î–>?À>j è>?5$?7*?{Ì9?ª&H?ô U?Da`?kj?Lr?øKx?ϵ|?’G?ü?Ð~?È{?œév?÷=p?ˆÑg? ´]?gøQ?†´D?/6?Úù%?v¼?:i? Þ>ܵ>4YŒ>p C>BÚ=®®<™<ƒ½Ç—¾4tn¾—I¡¾É+ʾO”ñ¾Æœ ¿—j¿Í).¿nŠ=¿üˆK¿S X¿úb¿Ô@l¿=Îs¿5”y¿ñ‡}¿¢¿§Þ¿B=~¿íÀz¿gu¿æ>–±«>à;Ô>²9û>1?¸!?Í2?öA?_ÀN?&òZ?xe?LQn?Ymu?í¾z?<~?VÞ?™¢?Q‰}?j–y?DÑs?¦Dl?«þb?{ÿW?˜{K?—{=?ž.?jr?¥ ?Ï¥ñ>>Ê>n\¡>Ïšn>¿>Ô‹ƒ=”p­¼óÙ½÷C¾©ƒŒ¾F¶¾Ý2Þ¾¯`¿b´¿Kò%¿5ú5¿,®D¿¹òQ¿¯]¿RÍg¿‰:p¿pïv¿ÿË{¿.Ò~¿Xü¿PH¿e·|¿cNx¿†r¿pj¿ f`¿uU¿Ú,H¿OÓ9¿¢*¿„¿^¿äç¾0À¾~á–¾á%Y¾!ó¾//½·µ.=Õ>7Y>ýÒ–>À>”è>?&?ö*?Î9?(H?@ U?db`?]j?r?ŠLx?/¶|?¾G?mü?ÖÏ~?–Ç{?þèv?(=p?ŠÐg?à²]?÷Q?³D?‹ÿ5?ø%?º?7g?Š@Þ>¤×µ>¶TŒ>E—C>|/Ú=^c®<>Oƒ½¡¾J}n¾N¡¾0ʾn˜ñ¾»ž ¿nl¿ƒ+.¿Œ=¿gŠK¿” X¿)ûb¿ºAl¿ôÎs¿º”y¿Dˆ}¿1¢¿”Þ¿ü<~¿uÀz¿‚ou¿aHn¿;me¿åZ¿ÙÄN¿ñ!A¿A2¿ã½!¿`7¿ëFû¾¯IԾ⿫¾>õ¾ªo.¾è^®½áøU94¯=õZ.>ë>üµ«> @Ô>Ä=û> 3?ѹ!?{2?~A?ÀÁN?ÅâZ?ye?'Rn?nu?f¿z?^<~?iÞ?y¢?þˆ}?å•y?ŽÐs?ÀCl?—ýb?eX?-zK?z=?è.?“p?#£ ?±¡ñ>»9Ê>ÿW¡>¹‘n>˵>/yƒ=K»­¼²Ú½¤‚C¾'ˆŒ¾¤ ¶¾7Þ¾²b¿I¶¿ô%¿Ùû5¿ª¯D¿ôQ¿@°]¿OÎg¿X;p¿›çv¿kÌ{¿hÒ~¿_ü¿#H¿·|¿ÑMx¿Är¿~j¿ëd`¿)U¿f+H¿´Ñ9¿ã*¿J*¿bþ¿äßç¾ÜÀ¾Ý–¾ÀY¾Ýé¾² /½ Û.=JÞ>XY>s×–>s À>°Úç>?ó'?µ*?²Ï9?”)H?‹ U?ƒc`?Oj?Ñr?Mx?޶|?ëG?gü?¯Ò~?*Ç{?`èv?Z¶>8PŒ>ŽC>èÚ=¦®<ãaƒ½Aª¾_†n¾uR¡¾^4ʾŒœñ¾±  ¿Fn¿Ä.¿’=¿Ò‹K¿Õ X¿>üb¿ Bl¿ªÏs¿?•y¿—ˆ}¿Q¢¿Þ¿¶<~¿ü¿z¿Ønu¿8Sn¿1le¿IäZ¿xÃN¿i A¿“2¿¼!¿r5¿ÚBû¾oEÔ¾|»«¾ºð¾vf.¾[K¯½¿V{9¶F¯=*d.>™ï>cº«>`DÔ>ÖAû>÷4? »!?(2? A? ÃN?ûãZ?ïke?Sn?®nu?Þ¿z?¤<~?|Þ?Y¢?¬ˆ}?`•y?×Ïs?ÚBl?ƒüb?%X?,ŒK?rx=?1.?»n?.¡ ?“ñ>p5Ê>S¡>¤ˆn>ެ>Šfƒ=®¼EڽЋC¾OŒ¾¶¾H;Þ¾´d¿0¸¿Úõ%¿~ý5¿)±D¿fõQ¿k±]¿MÏg¿&yY>êÛ–>ÇÀ>ÚÞç>ãý?Ò)?s*?MÑ9? +H?×U?£d`?Aj?”r?­Mx?î¶|?H?`ü?vÒ~?†Ì{?Âçv?‹;p?Îg?‹°]?eôQ? °D?Bü5?„ô%?ö?2c?8Þ>» ¶>F‰Œ>î„C>T Ú=ïÍ­<ˆtƒ½}³¾un¾äV¡¾©8ʾª ñ¾¦¢ ¿p¿z.¿ y=¿û¾/AÔ¾·«¾5ì¾A].¾¾8¯½bK_¹SY¯=^m.>ô>ɾ«> HÔ>çEû>å6?o½!?Ö2?!A?ÄN?1åZ?øle?+Hn?Xou?WÀz?ê<~?Þ?9¢?Yˆ}?Û”y?!Ïs?ôAl?nûb?ä X?ÁŠK?dŒ=?{.?äl?8Ÿ ?u™ñ>&1Ê>!O¡>Žn>R£>åSƒ=ºP®¼Ù*Ú½û”C¾—SŒ¾Öµ¾}?Þ¾·f¿º¿¡÷%¿"ÿ5¿¨²D¿¼öQ¿–²]¿KÐg¿õš#Y>aà–>À>ãç>ßÿ? ?2*?èÒ9?},H?"U?Ãe`?3j?Vr?>Nx?M·|?EH?Zü?=Ò~?Ì{?—ïv?½:p?‘Íg?`¯]?óQ?‹®D?ú5?½ò%?Ü´?0a?ê3Þ>]¶>È„Œ>fùC>À÷Ù=8ƒ­<-‡ƒ½º¼¾‹˜n¾S[¡¾ó<ʾȤñ¾›¤ ¿õq¿1.¿2{=¿={K¿VX¿fþb¿mDl¿Ñs¿I–y¿=‰}¿‘¢¿[Þ¿*<~¿ ¿z¿„mu¿ƒQn¿Pxe¿sòZ¿·ÀN¿XA¿82¿u¸!¿–1¿¶:û¾ï<Ô¾¯²«¾°ç¾ T.¾ &¯½ƒí9¹àl®=“v.>¢ø>0ë>àLÔ>ùIû>Ó8??¿!?ƒ2?#A?áÅN?gæZ?ne?In?çfu?ÏÀz?0=~?¢Þ?¢?ˆ}?V”y?kÎs? Al?Zúb?£ X?W‰K?ÒŠ=?:*.? k?C ?V•ñ>Û,Ê>²J¡>xvn>š>?Aƒ=q›®¼m=Ú½'žC¾XŒ¾ëÚµ¾ Þ¾¹h¿ý»¿hù%¿Æ6¿&´D¿øQ¿Á³]¿HÑg¿Ã=p¿uév¿çÇ{¿Ð~¿ü¿G¿çµ|¿Lx¿}r¿¨j¿‹a`¿G U¿'H¿âÌ9¿¦*¿¬$¿ž¿t è¾1@À¾£Ï–¾\Y¾Î¾²™.½ K/=ú>»,Y>×ä–>pÀ>.çç>Û?ë?*?„Ô9?ò-H?mU?ãf`?%j?r?ÐNx?­·|?qH?Tü?Ò~?®Ë{?ùîv?ûDp?“Ìg?5®]?¹ñQ? ­D?ùø5?öð%?õ²?-_?µ/Þ>¶>J€Œ>;ðC>·ãÚ=€8­<Ò™ƒ½÷ž ¡n¾Á_¡¾>Aʾæ¨ñ¾¦ ¿Ìs¿ç.¿Ä|=¿¨|K¿lX¿{ÿb¿SEl¿ÍÑs¿Î–y¿‰}¿±¢¿HÞ¿ä;~¿“¾z¿Úlu¿©Pn¿Gwe¿=ñZ¿4ÒN¿ÏA¿‹2¿¥¶!¿¨/¿¤6û¾¯8Ô¾H®«¾,ã¾ØJ.¾ƒ¯½¥¹~®=¥.>'ý>–Ç«> QÔ> Nû>Á:?Á!?12? $A?BÇN?çZ? oe?àIn?‘gu?Ôºz?v=~?µÞ?ù¡?³‡}?Ñ“y?´Ís?'@l?Eùb?c X?ì‡K?@‰=?„(.?p‚?N› ?8‘ñ>(Ê>DF¡>cmn>Ø>š.ƒ=)殼PÚ½R§C¾“\Œ¾Hßµ¾>Þ¾2O¿ä½¿/û%¿k6¿¥µD¿hùQ¿ì´]¿FÒg¿’>p¿êv¿SÈ{¿;Ð~¿!ü¿ÔI¿‡µ|¿‹Kx¿ºr¿¶j¿l``¿û U¿“%H¿GË9¿è*¿Í"¿¢¿Jè¾Ý;À¾T—¾;øX¾Îľ]t.½ap/=Y>Ü5Y>Né–>ÄÀ>Xëç>×?Ë?Å *?À9?g/H?¹U?h`?j?Ûr?aOx? ¸|?žH?Mü?ÊÑ~?BË{?\îv?-Dp?•Ëg? ­]?cðQ?Ž«D?T÷5?.ï%?±?+]?+Þ>¢ýµ>Ì{Œ>çC>#ÑÚ=í°ve¿ðZ¿ÔÐN¿H/A¿Ý 2¿Ö´!¿º-¿’2û¾o4Ծ⩫¾§Þ¾£A.¾å¯½ŒcÞ¸’®=Ú .>ÃÃ>ýË«>`UÔ>Rû>¯<?ÞÂ!?Þ2?)&A?¢ÈN?ÓèZ?pe?ºJn?;hu?L»z?ü9~?ÉÞ?Ù¡?`‡}?L“y?þÌs?A?l?1øb?" X?‚†K?®‡=?Í&.?™€?+´ ?ñ>F$Ê>ÕA¡>Mdn>›‡>õƒ=à0¯¼”bÚ½~°C¾aŒ¾¦ãµ¾sÞ¾4Q¿¾¥¿÷ü%¿6¿$·D¿¾úQ¿¶]¿DÓg¿`?p¿±êv¿¿È{¿tÐ~¿'ü¿¨I¿Cº|¿úJx¿ør¿Ãj¿L_`¿°U¿$H¿«É9¿)*¿î ¿¦¿ 辈7À¾Þ—¾1lY¾Š»¾O.½¶•/= >ý>Y>Äí–>"À>‚ïç>Ó?ª?„ *?·Á9?èH?U?"i`? j?r?óOx?k¸|?ËH?Gü?‘Ñ~?ÖÊ{?¾ív?^Cp?+Øg?Þ«]? ïQ?ªD?°õ5?gí%?(¯?([?J'Þ>Dùµ>NwŒ>åÝC>¾Ú=Ö¢°<£¿‚½pؾ̳n¾Ÿh¡¾ÒIʾ#±ñ¾zª ¿{w¿S.¿è=¿~K¿íX¿×òb¿Ì:l¿9Ós¿Ø—y¿5Š}¿ñ¢¿!Þ¿W;~¿¢½z¿†ku¿ôNn¿5ue¿ÒîZ¿sÏN¿¿-A¿,#2¿³!¿Ì+¿€.û¾.0Ô¾{¥«¾#Ú¾o8.¾Hϧ“¸¹¤®=.>HÈ>”«> YÔ>/Vû>>?­Ä!?Œ2?±'A?ÊN? êZ?qe?•Kn?åhu?Å»z?B:~?ÕÝ?¹¡? ‡}?Ç’y?HÌs?[>l?÷b?áX?…K?†=?%.?Â~?6² ?hÁñ>ûÊ>f=¡>7[n>_~>P ƒ=—{¯¼(uÚ½©¹C¾eŒ¾èµ¾©Þ¾7S¿¥§¿`æ%¿´6¿¢¸D¿üQ¿B·]¿AÔg¿/@p¿Nëv¿+É{¿®Ð~¿.ü¿{I¿ä¹|¿1Rx¿5r¿Ñj¿,^`¿dU¿©"H¿È9¿j*¿¿ª ¿öÿç¾43À¾gÿ–¾cY¾91¾³).½ »/=á>HY>;ò–>m&À>¬óç>Ï?‰?C *?RÃ9?]H?’U?Bj`?ûj?`r?„Px?˸|?÷H?Aü?WÑ~?jÊ{? ív?Bp?.×g?´º]?¶íQ?¨D? ô5? ë%?A­?&Y?#Þ>çôµ>ÑrŒ>¹ÔC>ü«Ú=X°ÍÌ>~˜«>£#Ô>@Zû>‹@?|Æ!?92?9)A?cËN??ëZ?&re?oLn?iu?>¼z?ˆ:~?èÝ?O£?»†}?A’y?‘Ës?t=l?öb? X?¬ƒK?‹„=?a#.?ê|?A° ?J½ñ>|VÊ>÷8¡>!Rn>"u>«ö‚=OƯ¼»‡Ú½ÔÂC¾ jŒ¾aìµ¾ÞÞ¾9U¿‹©¿'è%¿×ð5¿!ºD¿jýQ¿l¸]¿?Õg¿ý@p¿ìëv¿—É{¿çÐ~¿4ü¿OI¿…¹|¿ Qx¿Ûr¿ßj¿ ]`¿U¿4!H¿uÆ9¿«*¿0¿® ¿Ìûç¾à.À¾ñú–¾ïYY¾õ'¾æ0½`à/=$>?QY>²ö–>Á*À>Ö÷ç>Ë ?h?*?íÄ9?ÑH?ÝU?ú[`?íj?"r?Qx?*¹|?$I?:ü?Ñ~?þÉ{?‚ìv?ÂAp?0Ög?‰¹]?¯þQ?§D?gò5?Ùé%?Z«?#W?ßÞ>‰ðµ>SnŒ>ŽËC>i™Ú=g °<í䂽Xl¾|In¾|q¡¾gRʾ_¹ñ¾d® ¿*{¿À!.¿ ƒ=¿S‚K¿oX¿õb¿™QÑ>圫>ã'Ô>&û>yB?LÈ!?ç2?Â*A?ÄÌN?uìZ?0se?JMn?:ju?¶¼z?Î:~?üÝ?/£?ÖŠ}?¼‘y?ÛÊs?Ž2RÊ>Eq¡> In>åk>ä‚=°¼OšÚ½ÌC¾ŠnŒ¾¿ðµ¾Þ¾`ZY>(û–>/À>üç>Ç ?G?Á*?‰Æ9?F!H?)U?]`?ëj?är?§Qx?‰¹|?QI?4ü?åÐ~?’É{?åëv?ó@p?3Õg?^¸]?YýQ?ºD?Âð5?è%?t©? U?ªÞ>+ìµ>ÕiŒ>cÂC>Õ†Ú=°Â¯<’÷‚½”u¾’Rn¾.9¡¾²Vʾ}½ñ¾Y° ¿}¿v#.¿ž„=¿¾ƒK¿°X¿öb¿=l¿šËs¿H’y¿¿†}¿P£¿çÝ¿…:~¿8¼z¿‡iu¿dLn¿re¿0ëZ¿RËN¿&)A¿$2¿fÆ!¿s@¿Zû¾n#Ô¾H˜«¾•̾Ñ.¾o¶®½Ð8‘Ü®=¬/.>ÖÕ>K¡«>#,Ô>¡*û>ö)?Ê!?”!2?J,A?$ÎN?«íZ?9te?$Nn?äju?/½z?;~?Þ?£?ƒŠ}?V˜y?$Ês?¨;l?Þób?X?×€K?g=?ô.?;y?W¬ ?µñ>èMÊ>×l¡>p¼n>¨b>aÑ‚=½[°¼ã¬Ú½+ÕC¾sŒ¾õµ¾I#Þ¾?Y¿Y­¿¶ë%¿ ô5¿£¨D¿ÇíQ¿Âº]¿:×g¿šBp¿(ív¿oÊ{¿ZÑ~¿Aü¿õH¿Æ¸|¿}Px¿Vr¿ïj¿4j`¿‚U¿KH¿>Ã9¿- *¿r¿¶¿xóç¾7&À¾ò–¾­GY¾n¾<¹/½‚+.=¬1>cY>Ÿÿ–>j3À>*è>à ?&?€*?$È9?»"H?tU?:^`?Ýj?>r?8Rx?é¹|?}I?-ü?«Ð~?&É{?Gëv?%@p?5Ôg?3·]?üQ?¸D?Ÿ6?Jæ%?§?S?uÞ>Îçµ>WeŒ>7¹C>AtÚ=øw¯<7 ƒ½Ñ~¾¨[n¾=¡¾0 ʾ›Áñ¾N² ¿Ø~¿,%.¿0†=¿(…K¿ñX¿)÷b¿f>l¿QÌs¿Í’y¿‡}¿»¡¿ÔÝ¿?:~¿¿»z¿Ýhu¿ŠKn¿qe¿úéZ¿òÉN¿ž'A¿w2¿—Ä!¿…>¿üUû¾lYԾᓫ¾Ⱦœ.¾Ò£®½%G—8/ï®=á8.>[Ú>²¥«>c0Ô>³.û>ä+?³!?A#2?Ò-A?…ÏN?áîZ?Bue?þNn?Žku?¨½z?[;~?"Þ?ï¢?1Š}?Ñ—y?0Ós?Á:l?Êòb?ÞX?lK?Õ=?>.?dw?bª ?ð°ñ>IÊ>hh¡>[³n>ý×>»¾‚=u¦°¼v¿Ú½VÞC¾†wŒ¾{ùµ¾~'Þ¾A[¿?¯¿}í%¿Äõ5¿"ªD¿ïQ¿í«]¿8Øg¿hCp¿Æív¿ÛÊ{¿”Ñ~¿Gü¿ÉH¿g¸|¿ìOx¿”r¿ýj¿i`¿ôU¿ÖH¿£Á9¿n *¿“¿º¿Nïç¾ã!À¾í–¾Œ>Y¾* ¾ç“/½×P.=ý»>¢lY>—>¾7À>Tè>¿?!?>*?¿É9?0$H?ÀU?Z_`?Ïj?r?Kx?Hº|?ªI?'ü?rÐ~?ºÈ{?©êv?V?p?7Óg?¶]?­úQ?·D?û6?àü%?¦¥?Q??Þ>pãµ>Ù`Œ> °C>®aÚ=A-¯<݃½ˆ¾¾dn¾ B¡¾{$ʾMñ¾C´ ¿°€¿ã&.¿Â‡=¿“†K¿1 X¿>øb¿L?l¿Ís¿R“y¿d‡}¿Û¡¿ÈÞ¿ø9~¿G»z¿3hu¿°Jn¿pe¿ÄèZ¿‘ÈN¿&A¿É2¿ÇÂ!¿—<¿êQû¾,UÔ¾ÆË«¾‹Ã¾h .¾4‘®½ãâ8̯=B.>ßÞ>ª«>£4Ô>Å2û>Ò-?ì´!?ò 2?[/A?åÐN?ðZ?Kve?ÙOn?8lu? ¾z?¡;~?5Þ?Ï¢?Þ‰}?L—y?zÒs?.Fl?µñb?X?~K?C~=?ˆ.?u?m¨ ?Ò¬ñ>SEÊ>ùc¡>Eªn>ÁÎ>«ƒ=,ñ°¼ ÒÚ½‚çC¾|Œ¾Øýµ¾³+Þ¾D]¿&±¿Dï%¿i÷5¿ «D¿sðQ¿­]¿¢Ëg¿7Dp¿cîv¿GË{¿ÍÑ~¿Nü¿œH¿¸|¿ZOx¿Ñr¿ j¿ôg`¿©U¿U/H¿À9¿¯ *¿³¿¾¿$ë美À¾é–¾k5Y¾æ¾’n/½,v.=AÅ>­øX>Œ—><À>~è>º?å"?ý*?[Ë9?¥%H? U?z``?Áj?Ãr?’Kx?Œµ|?ÖI? ü?8Ð~?NÈ{? êv?ˆ>p?:Òg?Ý´]?WùQ?’µD?W6?û%?̽?O? Þ>ßµ>[\Œ>à¦C>OÚ=Šâ®<‚/ƒ½K‘¾Ómn¾{F¡¾Æ(ʾk‘ñ¾g› ¿‡‚¿™(.¿T‰=¿þ‡K¿r X¿Rùb¿2@l¿½Ís¿×“y¿·‡}¿û¡¿µÞ¿s=~¿Îºz¿‰gu¿ÕIn¿þne¿ŽçZ¿1ÇN¿$A¿2¿øÀ!¿©:¿ÙMû¾ëPÔ¾_Ç«¾ïü¾3.¾—~®½P_9j¯=JK.>dã>®«>ä8Ô>Ö6û>À/?¼¶!? 2?âA?EÒN?LñZ?Twe?³Pn?âlu?™¾z?ç;~?IÞ?¯¢?‹‰}?Ç–y?ÄÑs?HEl?mÿb?\X?—|K?±|=?Ò.?µs?x¦ ?³¨ñ>AÊ>Š_¡>0¡n>„Å>똃=<­¼äÚ½­ðC¾‚€Œ¾6¶¾é/Þ¾F_¿ ³¿ ñ%¿ ù5¿­D¿ÉñQ¿C®]¿ Ìg¿ø9p¿ïv¿³Ë{¿Ò~¿Tü¿oH¿¨·|¿ÉNx¿r¿j¿Õf`¿]U¿à-H¿pÔ9¿ð*¿Ô¿Â¿úæç¾:À¾ ä–¾J,Y¾¢ù¾=I/½‚›.=…Î>ÎY>ÚÏ–>g@À>§ è>¶?Ä$?¼*?öÌ9?'H?W U?™a`?³j?†r?$Lx?ìµ|?ŸG?ü?ÿÏ~?âÇ{?mév?¹=p?<Ñg?²³]?øQ?´D?²6?Rù%?å»? h?Ô Þ>´Úµ>ÝWŒ>µC>†<Ú=Ò—®<'Bƒ½ˆš¾évn¾éJ¡¾-Ê¾Š•ñ¾\ ¿#k¿O*.¿æŠ=¿h‰K¿³ X¿gúb¿Al¿tÎs¿\”y¿ ˆ}¿¢¿¢Þ¿-=~¿ÉÀz¿Þfu¿ûHn¿õme¿XæZ¿ÐÅN¿#A¿n2¿(¿!¿»8¿ÇIû¾«LÔ¾ù«¾jø¾ v.¾ùk®½.½;9'¯=T.>èç>岫>$=Ô>è:û>®1?‹¸!?M2?kA?ÈÀN?‚òZ?]xe?Qn?Œmu?¿z?-<~?\Þ?¢?9‰}?B–y?Ñs?bDl?Yþb?GX?,{K?{=?.?Þq?ƒ¤ ?•¤ñ>¾<Ê>[¡>˜n>G¼>F†ƒ=׆­¼§øÙ½ØùC¾…Œ¾“¶¾4Þ¾Ia¿ó´¿Óò%¿²ú5¿ž®D¿óQ¿n¯]¿Íg¿Ç:p¿,çv¿Ì{¿@Ò~¿Zü¿CH¿H·|¿7Nx¿Mr¿(j¿µe`¿U¿k,H¿ÕÒ9¿*¿õ¿Æÿ¿Ðâç¾æÀ¾)à–¾)#Y¾^ð¾ç#/½×À.=È×>ï Y>QÔ–>h À>Ñè>²?£&?{*?‘Î9?Ž(H?¢ U?¹b`?¥j?Ir?µLx?K¶|?ÌG?kü?ÅÏ~?vÇ{?Ïèv?ëÐg?‡²]?«öQ?•²D?ÿ5?‹÷%?ÿ¹?žf?I?Þ>WÖµ>_SŒ>Š”C>ó)Ú=M®<ÌTƒ½Ä£¾ÿn¾XO¡¾[1ʾ¨™ñ¾QŸ ¿ûl¿.¿xŒ=¿ÓŠK¿ô X¿{ûb¿ÿAl¿*Ïs¿á”y¿]ˆ}¿;¢¿ŽÞ¿ç<~¿QÀz¿Oou¿ Hn¿ìle¿"åZ¿pÄN¿|!A¿Á2¿Y½!¿Í6¿µEû¾kHÔ¾“¾«¾æó¾ìl.¾lX¯½ a9¥9¯=³].>mì>L·«>dAÔ>ú>û>œ3?[º!?û2?óA?)ÂN?"ãZ?fye?hRn?6nu?Š¿z?s<~?oÞ?p¢?æˆ}?½•y?WÐs?{Cl?Eýb?X?+K?y=?e.?p?¢ ?w ñ>s8Ê>­V¡>n> ³>¡sƒ=ŽÑ­¼; Ú½`…C¾~‰Œ¾ñ ¶¾S8Þ¾Kc¿Ú¶¿šô%¿Vü5¿°D¿vôQ¿™°]¿›Îg¿•;p¿Êçv¿‹Ì{¿yÒ~¿aü¿H¿é¶|¿¦Mx¿Šr¿6j¿•d`¿ÇU¿ö*H¿9Ñ9¿^*¿»)¿Êý¿¦Þ羑À¾³Û–¾Y¾ç¾’þ.½,æ.= á>Y>ÈØ–>½ À>íÛç>®?‚(?:*?-Ð9?*H?î U?Ùc`?—j? r?GMx?«¶|?ùG?eü?žÒ~? Ç{?1èv?Ë ¶>áNŒ>^‹C>_Ú=c®ŒK¿4X¿üb¿åBl¿àÏs¿f•y¿°ˆ}¿[¢¿{Þ¿¡<~¿Ø¿z¿¥nu¿öRn¿âke¿ìãZ¿ÃN¿ôA¿2¿Š»!¿ß4¿£Aû¾+DÔ¾,º«¾aï¾·c.¾ÏE¯½‡y¹BL¯=èf.>òð>²»«>¤EÔ> Cû>Š5?*¼!?¨2?| A?‰ÃN?XäZ?>le?BSn?ànu?Àz?¹<~?‚Þ?P¢?“ˆ}?8•y?¡Ïs?•Bl?0üb?Å X?À‹K?~=?¯.?/n?˜  ?Yœñ>)4Ê>>R¡>ï…n>Ω>ü`ƒ=F®¼ÎÚ½‹ŽC¾pPŒ¾O¶¾‰<Þ¾Ne¿Á¸¿aö%¿ûý5¿›±D¿ÌõQ¿Ä±]¿™Ïg¿d1Y>>Ý–>À>àç>zþ?a*?ø*?ÈÑ9?x+H?9U?ùd`?‰j?Ír?ØMx? ·|?%H?^ü?eÒ~?eÌ{?“çv?N;p?CÎg?1°]?ÿóQ?˜¯D?Åû5?ýó%?2¶?™b?Þ6Þ>n ¶>>3‚C>ËÚ=¬·­<zƒ½>¶¾*’n¾6X¡¾ð9ʾä¡ñ¾;£ ¿ªp¿ý.¿z=¿?zK¿uX¿¤ýb¿ËCl¿–Ðs¿ë•y¿‰}¿{¢¿hÞ¿[<~¿`¿z¿ûmu¿Rn¿ ye¿¶âZ¿¯ÁN¿kA¿f2¿º¹!¿ñ2¿‘=û¾ë?ԾƵ«¾Ü꾃Z.¾23¯½6)T¹Ï_®=p.>võ>À«>äIÔ>Gû>x7?ù½!?V2?"A?êÄN?ŽåZ?Gme?lHn?Šou?{Àz?ÿ<~?•Þ?0¢?@ˆ}?³”y?ëÎs?¯Al?ûb?„ X?UŠK?ì‹=?m+.?Xl?£ž ?;˜ñ>Þ/Ê>ÏM¡>Ù|n>‘ >VNƒ=ýf®¼b0Ú½·—C¾îTŒ¾Ú×µ¾¾@Þ¾Pg¿§º¿)ø%¿Ÿÿ5¿³D¿"÷Q¿ï²]¿–Ðg¿2=p¿év¿›Ç{¿ÙÏ~¿mü¿¼G¿*¶|¿ƒLx¿r¿Rj¿Vb`¿0 U¿ (H¿Î9¿à*¿ý%¿¿`è¾èÀ¾ÅÒ–¾ÅY¾“Ô¾è³.½Ö0/=”ó>R&Y>µá–>fÀ>Aäç>v?›?·*?cÓ9?ì,H?…U?f`?{j?r?jNx?j·|?RH?Xü?,Ò~?úË{?hïv?:p?EÍg?¯]?©òQ?®D? ú5?5ò%?K´?–`?©2Þ>¶>qƒŒ>«öC>7òÙ=ôl­<»Œƒ½{¿¾@›n¾¥\¡¾:>ʾ¦ñ¾0¥ ¿r¿³.¿ª{=¿©{K¿ŠÿW¿¹þb¿±Dl¿MÑs¿p–y¿U‰}¿›¢¿UÞ¿<~¿ç¾z¿Qmu¿BQn¿xe¿òZ¿NÀN¿ãA¿¸2¿ë·!¿1¿9û¾«;Ô¾_±«¾Xæ¾NQ.¾” ¯½WË.¹lr®=/û->ûù>Ä«>$NÔ>0Kû>f9?É¿!?2?#A?KÆN?ÄæZ?Qne?FIn?gu?óÀz?E=~?¨Þ?¢?í‡}?.”y?4Îs?É@l?úb?D X?ëˆK?ZŠ=?·).?»ƒ?®œ ?”ñ>”+Ê>`I¡>Ãsn>T—>±;ƒ=´±®¼öBÚ½â C¾lYŒ¾8ܵ¾J Þ¾Si¿Ž¼¿ðù%¿D6¿˜´D¿xøQ¿´]¿”Ñg¿>p¿¤év¿È{¿Ð~¿ü¿G¿Êµ|¿ñKx¿Cr¿_j¿6a`¿ä U¿˜&H¿gÌ9¿!*¿$¿¿6 è¾ç>À¾OΖ¾¤þX¾O˾“Ž.½+V/=Øü>s/Y>,æ–>ºÀ>kèç>r?z?‹*?þÔ9?a.H?ÐU?8g`?mj?Rr?ûNx?É·|?H?Rü?òÑ~?ŽË{?Êîv?¾Dp?HÌg?Û­]?SñQ?š¬D?|ø5?nð%?d²?”^?t.Þ>³¶>ô~Œ>€íC>.ÞÚ=="­<`Ÿƒ½·È¾U¤n¾a¡¾…Bʾ!ªñ¾%§ ¿Yt¿i.¿<}=¿}K¿ËX¿ñb¿˜El¿Òs¿õ–y¿¨‰}¿»¢¿BÞ¿Ï;~¿o¾z¿§lu¿gPn¿øve¿áðZ¿ËÑN¿ZA¿ 2¿¶!¿/¿m5û¾k7Ô¾ù¬«¾Óá¾H.¾÷ ¯½ym ¹ …®=c.>—À>æÈ«>dRÔ>BOû>T;?˜Á!?±2?%A?«ÇN?úçZ?Zoe?!Jn?Ägu?øºz?‹=~?»Þ?ð¡?š‡}?©“y?~Ís?ã?l?óøb? X?€‡K?Ɉ=?(.?ä?‹µ ?þñ>I'Ê>ñD¡>®jn>Ž> )ƒ=lü®¼‰UÚ½ªC¾é]Œ¾•ൾÞ¾ËO¿u¾¿·û%¿è6¿¶D¿ÎùQ¿Eµ]¿’Òg¿Ï>p¿Bêv¿sÈ{¿LÐ~¿#ü¿ÇI¿kµ|¿`Kx¿€r¿mj¿``¿™ U¿$%H¿ÌÊ9¿b*¿?"¿ ¿ è¾’:À¾—¾ƒõX¾ ¾>i.½€{/=>”8Y>¢ê–>À>•ìç>n?Y?J *?–À9?Ö/H?U?Xh`?_j?r?Ox?(¸|?«H?Lü?¹Ñ~?"Ë{?-îv?ïCp?ÝØg?°¬]?ýïQ?«D?×ö5?§î%?~°?‘\?>*Þ>Uüµ>vzŒ>TäC>šËÚ=J×°<²ƒ½ôѾk­n¾‚e¡¾ÏFʾ?®ñ¾© ¿0v¿ .¿Î~=¿~K¿ X¿òb¿+:l¿¹Òs¿z—y¿û‰}¿Ú¢¿/Þ¿‰;~¿ö½z¿ýku¿On¿ïue¿«ïZ¿kÐN¿Ó.A¿] 2¿L´!¿'-¿\1û¾*3Ô¾’¨«¾Oݾå>.¾Yû®½4ȸ§—®=˜ .>Å>‘«>¤VÔ>SSû>B=?hÃ!?^2?ž&A? ÉN?0éZ?cpe?ûJn?nhu?p»z?:~?ÎÞ?С?H‡}?$“y?ÈÌs?ü>l?Þ÷b?ÂX?†K?7‡=?K&.? €?–³ ?LÄñ>þ"Ê>ƒ@¡>˜an>Û„>gƒ=#G¯¼hÚ½9³C¾gbŒ¾óäµ¾´Þ¾ÎQ¿O¦¿~ý%¿6¿–·D¿$ûQ¿p¶]¿Óg¿ž?p¿àêv¿ßÈ{¿†Ð~¿)ü¿šI¿'º|¿ÎJx¿¾r¿{j¿ö^`¿MU¿¯#H¿1É9¿¤*¿` ¿¿âè¾>6À¾Š—¾xiY¾Ç¸¾èC.½Ö /=_>µAY>ï–>c#À>¿ðç>j?9? *?1Â9?WH?gU?xi`?Qj?×r?Px?ˆ¸|?ØH?Eü?€Ñ~?¶Ê{?ív?!Cp?à×g?…»]?§îQ?©D?3õ5?ßì%?—®?Z? &Þ>÷÷µ>øuŒ>)ÛC>¹Ú=“Œ°<1Å‚½1Û¾¶n¾ñi¡¾Kʾ]²ñ¾« ¿x¿Ö.¿`€=¿êK¿MX¿)ób¿;l¿­És¿ÿ—y¿MŠ}¿ú¢¿Þ¿B;~¿~½z¿Sku¿³Nn¿æte¿uîZ¿ ÏN¿J-A¿­"2¿|²!¿9+¿J-û¾ê.Ô¾,¤«¾Êؾ±5.¾¼è®½îÆz¸Eª®=Í.>¡É>g•«>¦ Ô>eWû>0??7Å!? 2?&(A?lÊN?eêZ?lqe?ÖKn?iu?é»z?W:~?ÛÝ?°¡?õ†}?Ÿ’y?Ìs?>l?Êöb?X?«„K?¥…=?•$.?5~?¡± ?.Àñ>´Ê><¡>‚Xn>ž{>ƒ=Ú‘¯¼±zÚ½d¼C¾åfŒ¾Qéµ¾êÞ¾ÐS¿6¨¿èæ%¿16¿¹D¿züQ¿›·]¿Ôg¿l@p¿}ëv¿KÉ{¿¿Ð~¿0ü¿nI¿È¹|¿Rx¿ûr¿‰j¿Ö]`¿U¿:"H¿–Ç9¿å*¿€¿ ¿¸þç¾ê1À¾þ–¾W`Y¾v.¾“.½+Æ/=£>ÖJY>ó–>·'À>éôç>f??È *?ÍÃ9?ÌH?ôU?—j`?Cj?™r?°Px?ç¸|?I??ü?FÑ~?JÊ{?ñìv?SBp?âÖg?[º]?ŸÿQ?¨D?Žó5?ë%?°¬?ŒX?Ô!Þ>šóµ>zqŒ>þÑC>s¦Ú=ÛA°<Öׂ½Ûe¾–¿n¾`n¡¾dOʾ{¶ñ¾­ ¿ßy¿Œ .¿ò=¿TK¿ŽX¿>ôb¿÷;l¿dÊs¿e‘y¿ Š}¿£¿Þ¿ü:~¿½z¿©ju¿ØMn¿Ýse¿@íZ¿ªÍN¿Â+A¿ÿ 2¿{É!¿K)¿8)û¾ª*Ծş«¾EÔ¾|,.¾Ö®½æžÊ·â¼®= .>%Î>Ι«>ç$Ô>³#û>A?Ç!?¹2?®)A?ÌËN?›ëZ?ure?°Ln?Âiu?b¼z?:~?îÝ?E£?¢†}?’y?[Ës?0=l?µõb?AX?@ƒK?„=?Þ".?^|?¬¯ ?¼ñ>5UÊ>¥7¡>lOn>ar>ñ‚=’ܯ¼DÚ½ÅC¾ckŒ¾¯íµ¾Þ¾ÓU¿ª¿¯è%¿Tñ5¿“ºD¿ÐýQ¿Å¸]¿ŠÕg¿;Ap¿ìv¿·É{¿øÐ~¿6ü¿AI¿h¹|¿uQx¿¡r¿—j¿¶\`¿¶U¿Å H¿úÅ9¿&*¿¡¿ ¿úç¾–-À¾œù–¾6WY¾2%¾Æø/½€ë/=ç!>÷SY>ø–> ,À>ùç>b ?÷?‡*?hÅ9?A H?@U?P\`?5j?\r?AQx?F¹|?1I?8ü? Ñ~?ÞÉ{?Sìv?„Ap?åÕg?0¹]?IþQ?»D?éñ5?Qé%?ɪ?ŠV?žÞ><ïµ>ülŒ>ÒÈC>à“Ú=$÷¯<{ꂽo¾1Ln¾Ïr¡¾¯Sʾ™ºñ¾ù® ¿¶{¿C".¿„ƒ=¿¿‚K¿ÏX¿Sõb¿ÞªÒ>4ž«>')Ô>Å'û>›(?ÖÈ!?f 2?7+A?-ÍN?ÑìZ?se?‹Mn?lju?Ú¼z?ã:~?Þ?%£?½Š}?•‘y?¥Ês?IëPÊ>óo¡>VFn>$i>xÞ‚=I'°¼ØŸÚ½»ÎC¾áoŒ¾ òµ¾U Þ¾ÕW¿¬¿vê%¿øò5¿–§D¿&ÿQ¿ð¹]¿ˆÖg¿ Bp¿¹ìv¿#Ê{¿2Ñ~¿<ü¿I¿ ¹|¿ãPx¿ßr¿™j¿–[`¿jU¿PH¿_Ä9¿g*¿Â¿ ¿eöç¾A)À¾&õ–¾NY¾ï¾qÓ/½L.=++>]Y>}ü–>`0À>=ýç>^ ?Ö?F*?Ç9?µ!H?ŒU?p]`?3j?r?ÒQx?¦¹|?^I?2ü?ÓÐ~?rÉ{?¶ëv?¶@p?çÔg?¸]?óüQ?œ¹D?Æ6?Šç%?ã¨?‡T?iÞ>Þêµ>~hŒ>§¿C>LÚ=m¬¯/×>›¢«>g-Ô>×+û>‰*?×±!?"2?¿,A?ÎN?îZ?ˆte?eNn?ku?S½z?*;~?Þ?£?kŠ}?.˜y?îÉs?c;l?Œób?¿X?k€K?ï€=?r.?¯x?Á« ?Ô³ñ> LÊ>…k¡>¼¹n>è_>ÒË‚=r°¼l²Ú½æ×C¾_tŒ¾jöµ¾Š$Þ¾ØY¿ê­¿>ì%¿ô5¿©D¿-îQ¿»]¿†×g¿ØBp¿Wív¿Ê{¿kÑ~¿Cü¿èH¿ª¸|¿RPx¿r¿§j¿Þi`¿U¿ÛH¿ÃÂ9¿¨ *¿ã¿¿;òç¾í$À¾¯ð–¾ôDY¾«¾®/½¢6.=|µ>9fY>ó—>´4À>gè>Z?µ?*?ŸÈ9?*#H?×U?^`?%j?xr?dRx?º|?‹I?+ü?šÐ~?É{?ëv?ç?p?éÓg?Ú¶]?ûQ?¸D?"6? þ%?ü¦?…R?4Þ>æµ>dŒ>|¶C>¸nÚ=µa¯<ƃ½’¾]^n¾ï>¡¾x!ʾÕÂñ¾ã² ¿e¿¯%.¿¨†=¿•…K¿PX¿|÷b¿ª>l¿‡Ìs¿õ’y¿*‡}¿Ä¡¿ÕÞ¿*:~¿›»z¿ªhu¿IKn¿Ápe¿žéZ¿‰ÉN¿)'A¿÷2¿ Ä!¿ò=¿ÆTû¾'XÔ¾‘’«¾·Æ¾Þ.¾Fž®½~‹­8»ô®=Ÿ;.>³Û>§«>§1Ô>é/û>w,?§³!?Å 2?G.A?íÏN?=ïZ?‘ue??On?Áku?˽z?p;~?(Þ?æ¢?Š}?ª—y?úÒs?}:l?wòb?~X?K?]=?¼.?Øv?Ì© ?¶¯ñ>VHÊ>g¡>¦°n>=Õ>-¹‚=¸¼°¼ÿÄÚ½áC¾ÝxŒ¾Èúµ¾¿(Þ¾Ú[¿Ð¯¿î%¿Bö5¿”ªD¿ƒïQ¿F¬]¿ƒØg¿¦Cp¿õív¿ûÊ{¿¥Ñ~¿Iü¿»H¿J¸|¿ÀOx¿Zr¿µj¿¾h`¿‘U¿gH¿(Á9¿é *¿¿#¿îç¾™ À¾9ì–¾Ó;Y¾g ¾Çˆ/½÷[.=À¾>DòX>j—>9À>‘è>V?”!?Ä*?:Ê9?Ÿ$H?# U?°_`?j?;r?,Kx?dº|?·I?%ü?aÐ~?šÈ{?zêv??p?ìÒg?¯µ]?GúQ?Ÿ¶D?~6?Yü%?"¿?‚P?þÞ>#âµ>‚_Œ>P­C>%\Ú=þ¯8à>h««>è5Ô>û3û>e.?vµ!?r2?Ð/A?NÑN?sðZ?šve?Pn?klu?D¾z?¶;~?;Þ?Æ¢?ʼn}?%—y?DÒs?éEl?cñb?=X?•}K?Ë}=?.?u?×§ ?—«ñ> DÊ>§b¡>§n>Ì>¦ƒ=o±¼“×Ú½=êC¾[}Œ¾%ÿµ¾ô,Þ¾Ý]¿·±¿Ìï%¿æ÷5¿¬D¿ÙðQ¿q­]¿íËg¿tDp¿’îv¿gË{¿ÞÑ~¿Pü¿H¿ë·|¿/Ox¿—r¿Ãj¿Ÿg`¿FU¿æ.H¿¿9¿* *¿%¿'¿çéç¾DÀ¾Âç–¾²2Y¾#¾rc/½L.=È>eûX>¸Ì–>]=À>» è>R?s#?‚*?ÕË9?&H?n U?Ï``? j?ýr?¾Kx?¨µ|?äI?ü?'Ð~?.È{?Üév?J>p?îÑg?„´]?ñøQ? µD?Ù6?’ú%?;½? j?É Þ>Åݵ>[Œ>%¤C>‘IÚ=GÌ®<5ƒ½ ”¾ˆpn¾ÍG¡¾ *ʾ¥’ñ¾ü› ¿ƒ¿).¿Ì‰=¿jˆK¿Ò X¿¥ùb¿w@l¿ôÍs¿ÿ“y¿Ð‡}¿¢¿¯Þ¿^=~¿Áz¿Vgu¿”In¿¯ne¿2çZ¿ÈÆN¿$A¿œ2¿nÀ!¿:¿¢Lû¾§OԾƫ¾–û¾uþ-¾ y®½|!9ö¯=N.>¼ä>ϯ«>(:Ô> 8û>S0?F·!? 2?WA?®ÒN?©ñZ?£we?ôPn?mu?½¾z?ü;~?NÞ?¦¢?s‰}? –y?Ñs?El?ÿb?üÿW?*|K?9|=?O.?)s?⥠?y§ñ>Á?Ê>8^¡>{žn>ÃÂ>]“ƒ=bR­¼&êÚ½hóC¾ØŒ¾ƒ¶¾*1Þ¾ß_¿ž³¿“ñ%¿‹ù5¿‘­D¿/òQ¿œ®]¿ëÌg¿6:p¿0ïv¿ÓË{¿Ò~¿Vü¿bH¿‹·|¿žNx¿Õr¿Ñj¿f`¿ûU¿q-H¿õÓ9¿k*¿E¿+¿½åç¾ðÀ¾Kã–¾‘)Y¾ßö¾>/½¡¦.=GÑ>†Y>/Ñ–>^À>å è>N?R%?A*?qÍ9?ˆ'H?º U?ïa`?ûj?Àr?OLx?¶|?¬G?ü?íÏ~?ÂÇ{?>év?|=p?ñÐg?Y³]?›÷Q?¢³D?56?Ëø%?T»?h?=BÞ>gÙµ>‡VŒ>úšC>ý6Ú=®<µGƒ½H¾žyn¾Aé>5´«>h>Ô><û>A2?¹!?Í2?àA?1ÁN?ßòZ?¬xe?ÏQn?¿mu?5¿z?B<~?aÞ?†¢? ‰}?–y?×Ðs?Dl?þb?çX?ÀzK?§z=?™.?Qq?í£ ?[£ñ>v;Ê>ÉY¡>e•n>‡¹>¸€ƒ=­¼0þÙ½”üC¾V†Œ¾à¶¾_5Þ¾âa¿„µ¿[ó%¿/û5¿¯D¿…óQ¿Ç¯]¿éÍg¿;p¿[çv¿?Ì{¿QÒ~¿\ü¿5H¿,·|¿ Nx¿r¿ßj¿_e`¿¯U¿ü+H¿ZÒ9¿—*¿f¿/ÿ¿’áç¾›À¾ÕÞ–¾p Y¾œí¾È/½öË.=‹Ú>§ Y>¦Õ–>³ À>Ùç>I?2'?*? Ï9?ý(H? U?c`?íj?‚r?áLx?h¶|?ÙG?iü?´Ï~?UÇ{? èv?­Þ>ܶ> RŒ>ΑC>j$Ú=Ø6®Æí>œ¸«>¨BÔ>1@û>/4?åº!?{2?hA?’ÂN?~ãZ?µye?©Rn?inu?®¿z?ˆ<~?uÞ?f¢?͈}?–•y?!Ðs?7Cl?òüb?¦X?¿ŒK?y=?â.?zo?ø¡ ?=Ÿñ>,7Ê>[U¡>OŒn>J°>nƒ=Ñç­¼ÄÚ½ˆC¾ÔŠŒ¾> ¶¾”9Þ¾åc¿k·¿"õ%¿Ôü5¿Ž°D¿ÛôQ¿ò°]¿çÎg¿Ó;p¿ùçv¿ãÆ{¿ŠÒ~¿cü¿H¿Í¶|¿{Mx¿Pr¿íj¿?d`¿dU¿‡*H¿¿Ð9¿Ù*¿,)¿3ý¿hÝç¾GÀ¾^Ú–¾OY¾Xä¾só.½Lñ.=Ïã>ÈY>Ú–>À>+Ýç>ý?)?¿*?§Ð9?r*H?QU?/d`?ßj?Er?rMx?Ƕ|?H?cü?Ò~?éÆ{?èv?ß;p?õÎg?±]?ïôQ?¥°D?ìü5?<õ%?‡·?d?Ò9Þ> ¶>‹Œ>£ˆC>ÖÚ= ì­<ÿlƒ½Â¯¾É‹n¾U¡¾í6ʾŸñ¾Û¡ ¿_o¿É.¿þx=¿ªŒK¿”X¿âüb¿*Cl¿Ðs¿Ž•y¿Èˆ}¿d¢¿vÞ¿Œ<~¿µ¿z¿snu¿µRn¿Äye¿ãZ¿¦ÂN¿A¿“2¿ÿº!¿L4¿m@û¾çBԾݸ«¾î¾ù`.¾C@¯½èdn¹ÎQ¯=¦i.>Jò>½«>èFÔ>BDû>6?´¼!?(2?ñ A?óÃN?´äZ?le?ƒSn?ou?&Àz?Î<~?ˆÞ?F¢?zˆ}?•y?kÏs?QBl?Þûb?f X?T‹K?=?,.?£m?  ?›ñ>á2Ê>ìP¡>:ƒn> §>m[ƒ=‰2®¼W#Ú½G‘C¾ÆQŒ¾œ¶¾É=Þ¾çe¿R¹¿éö%¿xþ5¿ ²D¿2öQ¿²]¿äÏg¿¡Ùç¾ó À¾çÕ–¾.Y¾Û¾Î.½¡/=í>éY>“Þ–>\À>Uáç>ÿ?K?~*?BÒ9?ç+H?œU?Oe`?Ñj?r?Nx?&·|?3H?]ü?TÒ~?EÌ{?dçv?;p?øÍg?د]?™óQ?&¯D?Gû5?uó%?¡µ?b?5Þ>!¶>™†Œ>ýC>BÿÙ=i¡­<¤ƒ½þ¸¾ß”n¾ˆY¡¾7;ʾ£ñ¾Ð£ ¿6q¿.¿z=¿«zK¿ÕX¿÷ýb¿Dl¿ÍÐs¿–y¿‰}¿„¢¿bÞ¿F<~¿<¿z¿Ému¿ÛQn¿»xe¿ZâZ¿FÁN¿÷A¿æ2¿0¹!¿^2¿[<û¾§>Ô¾v´«¾„é¾ÅW.¾¦-¯½ I¹[e®=Úr.>Ïö>hÁ«>(KÔ>THû> 8?„¾!?Ö2?y"A?SÅN?êåZ?–me?­Hn?½ou?žÀz?=~?›Þ?&¢?'ˆ}?Œ”y?´Îs?jAl?Éúb?% X?é‰K?u‹=?ë*.?Ëk?ž ?—ñ>—.Ê>}L¡>$zn>Ñ>ÈHƒ=@}®¼ë5Ú½ršC¾DVŒ¾'Ùµ¾ÿAÞ¾êg¿8»¿°ø%¿6¿Œ³D¿ˆ÷Q¿H³]¿âÐg¿p=p¿5év¿»Ç{¿êÏ~¿ü¿¯G¿¶|¿WLx¿Ër¿ j¿b`¿Í U¿ž'H¿ˆÍ9¿[*¿n%¿k¿#辞À¾qÑ–¾ Y¾ÐѾȨ.½ö;/=Wö> )Y> ã–>°À>åç>?*?R*?ÞÓ9?[-H?èU?nf`?Ãj?Êr?•Nx?†·|?_H?Vü?Ò~?ÙË{?9ïv?A:p?úÌg?­®]?CòQ?§­D?£ù5?®ñ%?º³?ý_?h1Þ>ö>‚Œ>ðóC>9ëÚ=±V­Sû>ÏÅ«>hOÔ>fLû>ù9?SÀ!?ƒ2?$A?´ÆN? çZ? ne?‡In?Lgu?Áz?Z=~?®Þ?¢?Õ‡}?”y?þÍs?„@l?µùb?ä X?ˆK?ã‰=?5).?/ƒ?œ ?â’ñ>L*Ê>H¡>qn>””>#6ƒ=÷Ç®¼HÚ½ž£C¾ÂZŒ¾…ݵ¾‹ Þ¾ìi¿½¿wú%¿Á6¿ µD¿ÞøQ¿s´]¿àÑg¿>>p¿Óév¿'È{¿$Ð~¿ü¿æI¿®µ|¿ÆKx¿ r¿j¿à``¿ U¿)&H¿íË9¿œ*¿#¿o¿ù 辜=À¾úÌ–¾ìûX¾ŒÈ¾sƒ.½Ka/=›ÿ>,2Y>€ç–>À>©éç> ? ? *?u¿9?Ð.H?3U?Žg`?µj?Œr?'Ox?å·|?ŒH?Pü?áÑ~?nË{?›îv?€Dp?üËg?‚­]?íðQ?(¬D?þ÷5?æï%?Ó±?û]?3-Þ>fÿµ>}Œ>ÄêC>¥ØÚ=¾ ±<½x˾ §n¾fb¡¾ÌCʾ[«ñ¾º§ ¿åt¿ì.¿´}=¿€}K¿+X¿Sñb¿ÜEl¿9Òs¿—y¿Á‰}¿Ä¢¿<Þ¿º;~¿K¾z¿ulu¿&Pn¿©ve¿…ðZ¿bÑN¿æA¿‹2¿‘µ!¿‚.¿74û¾&6Ô¾©««¾{à¾\E.¾k¯½™–ü¸–Š®=!.>ðÁ>5Ê«>©SÔ>xPû>ç;?"Â!?12?Š%A?ÈN?VèZ?©oe?bJn?ögu?»z? =~?ÁÞ?æ¡?‚‡}?“y?HÍs?ž?l? øb?£ X?‡K?Qˆ=?'.?W?õ´ ?ÄŽñ>&Ê>ŸC¡>ùgn>W‹>~#ƒ=¯¯¼[ڽɬC¾@_Œ¾âáµ¾ÀÞ¾dP¿¿¿?ü%¿e6¿‰¶D¿4úQ¿žµ]¿ÝÒg¿ ?p¿qêv¿“È{¿]Ð~¿%ü¿ºI¿jº|¿4Kx¿Fr¿%j¿À_`¿6 U¿´$H¿RÊ9¿Ý*¿°!¿s¿Ïè¾H9À¾¬—¾ËòX¾H¿¾^.½ †/=Þ>M;Y>÷ë–>Y À>Óíç>?è?Ï *?Á9?QH?~U?®h`?§j?Or?¸Ox?E¸|?¹H?Jü?¨Ñ~?Ë{?þív?²Cp?’Øg?W¬]?—ïQ?ªªD?Zö5?î%?í¯?ø[?ý(Þ>ûµ>yŒ>™áC>ÆÚ=Á°<¸‚½µÔ¾ °n¾Ôf¡¾Hʾy¯ñ¾°© ¿¼v¿¢.¿F=¿ë~K¿lX¿gòb¿o:l¿ïÒs¿¢—y¿Š}¿ä¢¿)Þ¿t;~¿Ò½z¿Êku¿LOn¿ ue¿OïZ¿ÐN¿^.A¿Ý 2¿Â³!¿”,¿%0û¾æ1Ô¾C§«¾öÛ¾'<.¾Îõ®½ÛÚ±¸3®=V.>uÆ>P’«>éWÔ>ŠTû>Õ=?òÃ!?Þ2?'A?tÉN?ŒéZ?²pe?l?Œ÷b?cX?©…K?¿†=?È%.?€?³ ?Ãñ>·!Ê>0?¡>ã^n>‚>Ùƒ=f]¯¼¦mÚ½ôµC¾¾cŒ¾@æµ¾õÞ¾gR¿à¦¿þ%¿ 6¿¸D¿ŠûQ¿É¶]¿ÛÓg¿Û?p¿ëv¿É{¿—Ð~¿+ü¿I¿ º|¿lRx¿„r¿3j¿ ^`¿êU¿@#H¿¶È9¿*¿Ñ¿w¿¥è¾ô4À¾5—¾ÀfY¾¶¾É8.½õ«/=">nDY>mð–>­$À>ýñç>?Ç?Ž *?¬Â9?ÆH? U?Íi`?™j?r?IPx?¤¸|?åH?Cü?oÑ~?–Ê{?`ív?ãBp?”×g?,»]?AîQ?+©D?µô5?Xì%?®?öY?È$Þ>ªöµ>¡tŒ>nØC>~³Ú=Pv°<¿Ê‚½__¾5¹n¾Ck¡¾aLʾ—³ñ¾¥« ¿”x¿Y.¿Ø€=¿V€K¿­X¿|ób¿V;l¿äÉs¿'˜y¿fŠ}¿£¿Þ¿.;~¿Z½z¿ ku¿rNn¿—te¿îZ¿¡ÎN¿Ö,A¿-"2¿ò±!¿¦*¿,û¾¦-Ծܢ«¾q×¾ò2.¾0㮽<>N¸Ñ¯®=‹.>ùÊ>·–«>ë!Ô>›Xû>Ã??ÁÅ!?Œ2?›(A?ÕÊN?ÂêZ?»qe?Ln?Kiu? ¼z?l:~?áÝ?¦¡?܆}?w’y?ÛËs?Ñ=l?wöb?"X??„K?-…=?$.?©}? ± ?ô¾ñ>8XÊ>Á:¡>ÍUn>Ýx>4þ‚=¨¯¼:€Ú½ ¿C¾MY>äô–>)À>'öç>þ?¦?M*?GÄ9?;H?WU?†[`?‹j?Ór?ÛPx?¹|?I?=ü?5Ñ~?*Ê{?Âìv?Bp?—Ög?º]?9ÿQ?¬§D?ó5?‘ê%?¬?óW?“ Þ>Mòµ>#pŒ>BÏC>ê Ú=˜+°~Ï>›«>+&Ô>ê$û>±A?Ç!?92?#*A?5ÌN?øëZ?Äre?ñLn?õiu?†¼z?²:~?ôÝ?<£?‰†}?ò‘y?%Ës?ëîSÊ>s¡>·Ln>¡o>ë‚=Õò¯¼Í’Ú½KÈC¾ºlŒ¾üîµ¾`Þ¾lV¿­ª¿7é%¿Ññ5¿»D¿6þQ¿¹]¿ÖÕg¿xAp¿Jìv¿ØÉ{¿ Ñ~¿8ü¿4I¿L¹|¿IQx¿gr¿Cj¿`\`¿SU¿V H¿€Å9¿¡*¿¿ ¿Qùç¾K,À¾Hø–¾~TY¾p"¾§í/½Ÿö/=ª$>°VY>[ù–>V-À>Qúç>ù ?†? *?âÅ9?° H?£U?¦\`?‰j?–r?lQx?c¹|??I?6ü?üÐ~?¾É{?$ìv?GAp?™Õg?׸]?ãýQ?©ºD?lñ5?Éè%?8ª?ðU?]Þ>ïíµ>¦kŒ>ÆC>WŽÚ=áà¯< ð‚½Ùq¾æNn¾!t¡¾öTʾӻñ¾¯ ¿C|¿Å".¿üƒ=¿+ƒK¿.X¿¥õb¿"=l¿PËs¿’y¿†}¿C£¿ïÝ¿¡:~¿i¼z¿Ìiu¿½Ln¿…re¿­ëZ¿áËN¿Å)A¿Ò2¿!Ç!¿:A¿ï#û¾&%Ô¾š«¾hξ‰ .¾õ½®½qa¹7 Õ®=ô+.>Ô>„Ÿ«>k*Ô>ü(û>.)?`É!?æ 2?¬+A?–ÍN?.íZ?Îse?ÌMn?Ÿju?þ¼z?ø:~?Þ?£?¥Š}?m‘y?nÊs?¤OÊ>¡n¡>Àn>df>騂=Œ=°¼a¥Ú½vÑC¾8qŒ¾Yóµ¾–!Þ¾oX¿”¬¿þê%¿vó5¿¨D¿‹ÿQ¿Iº]¿ÔÖg¿GBp¿èìv¿DÊ{¿CÑ~¿>ü¿I¿í¸|¿¸Px¿¥r¿Qj¿¨j`¿U¿áH¿äÃ9¿â *¿3¿„¿'õç¾÷'À¾Ñó–¾]KY¾,¾RÈ/½l.=í->Ñ_Y>Ñý–>ª1À>{þç>õ ?e?Ë*?~Ç9?$"H?îU?Æ]`?{j?ðr?þQx?¹|?kI?0ü?ÂÐ~?RÉ{?‡ëv?x@p?œÔg?¬·]?üQ?*¹D?I6?ç%?R¨?îS?(Þ>‘éµ>(gŒ>ì¼C>Ã{Ú=*–¯<¯ƒ½{¾üWn¾Ò;¡¾@Yʾñ¿ñ¾„± ¿~¿{$.¿Ž…=¿–„K¿oX¿ºöb¿ >l¿Ìs¿—’y¿ð†}¿®¡¿ÜÝ¿[:~¿ð»z¿"iu¿âKn¿|qe¿wêZ¿€ÊN¿=(A¿$2¿RÅ!¿L?¿¡Wû¾å Ô¾¨•«¾ãɾU.¾X«®½3(r8©ç®=)5.>‡Ø>룫>«.Ô>-û>+?a²!?”"2?4-A?öÎN?dîZ?×te?¦Nn?Iku?w½z?>;~?Þ?ü¢?RŠ}?˜y?¸És?;l?9ób?_X?ÿK?w€=?ï.?#x?,« ?š²ñ>YKÊ>2j¡>·n>¹Û>DÆ‚=Cˆ°¼õ·Ú½¢ÚC¾¶uŒ¾·÷µ¾Ë%Þ¾qZ¿{®¿Åì%¿õ5¿‡©D¿“îQ¿t»]¿Ñ×g¿Cp¿†ív¿°Ê{¿|Ñ~¿Eü¿ÛH¿¸|¿&Px¿âr¿_j¿ˆi`¿zU¿lH¿IÂ9¿# *¿T¿ˆ¿ýðç¾£#À¾[ï–¾¸>òhY>H—>þ5À>¥è>ñ?D ?Š*?É9?™#H?:U?å^`?mj?²r?ÆJx?"º|?˜I?*ü?‰Ð~?æÈ{?éêv?ª?p?žÓg?¶]?7ûQ?¬·D?¥6?˜ý%?k¦?ëQ?óÞ>4åµ>ªbŒ>À³C>/iÚ=rK¯l¿½Ìs¿“y¿C‡}¿Î¡¿ÏÞ¿:~¿w»z¿xhu¿Kn¿rpe¿AéZ¿ ÉN¿´&A¿w2¿‚Ã!¿_=¿Sû¾ãVÔ¾B‘«¾_ž .¾º˜®½ÖÏÃ8Gú®=]>.> Ý>Q¨«>ì2Ô>1û> -?1´!?E 2?¼.A?VÐN?™ïZ?àue?€On?óku?ï½z?…;~?.Þ?Ü¢?ÿ‰}?‚—y?ÄÒs?8:l?%òb?X?”~K?å~=?9.?Kv?7© ?{®ñ>GÊ>Äe¡>ñ­n>|Ò>³ƒ=ûÒ°¼ˆÊÚ½ÍãC¾3zŒ¾üµ¾*Þ¾t\¿a°¿î%¿¿ö5¿«D¿éïQ¿Ÿ¬]¿ÏØg¿ãCp¿$îv¿Ë{¿¶Ñ~¿Kü¿®H¿.¸|¿•Ox¿ r¿mj¿ih`¿/U¿ë/H¿­À9¿d *¿u¿Œ¿Óìç¾NÀ¾äê–¾9Y¾¤¾¨}/½g.=‚Á>üôX>¾—>S:À>Ïè>í?#"?I*?´Ê9?%H?… U?``?_j?ur?WKx?eµ|?ÄI?#ü?OÐ~?zÈ{?Kêv?Û>p? Òg?Vµ]?áùQ?-¶D?6?Ñû%?‘¾?éO?½Þ>Öàµ>,^Œ>•ªC>œVÚ=»¯<ù'ƒ½¾'jn¾°D¡¾ 'ʾÁñ¾nµ ¿É¿è'.¿±ˆ=¿k‡K¿ñ X¿ãøb¿Õ?l¿tÍs¿¡“y¿–‡}¿î¡¿¼Þ¿=~¿ÿºz¿Ígu¿-Jn¿ioe¿ èZ¿¿ÇN¿,%A¿É2¿³Á!¿q;¿~Oû¾£RÔ¾'É«¾ÚÀ¾ë.¾†®½ÊE9ä ¯=’G.>á>¸¬«>,7Ô>15û>ù.?¶!?ò2?DA?·ÑN?ÏðZ?éve?[Pn?lu?h¾z?Ë;~?AÞ?¼¢?­‰}?ý–y? Òs?¥El?ñb?ÞX?)}K?S}=?ƒ.?tt?B§ ?]ªñ>ÄBÊ>Ua¡>Û¤n>@É>s ƒ=î­¼ÝÚ½øìC¾±~Œ¾r¶¾5.Þ¾v^¿H²¿Tð%¿cø5¿„¬D¿?ñQ¿Ê­]¿9Ìg¿²Dp¿Áîv¿‡Ë{¿ïÑ~¿Qü¿H¿Î·|¿Ox¿^r¿{j¿Ig`¿ãU¿v.H¿Õ9¿¥*¿–¿¿©èç¾úÀ¾næ–¾ú/Y¾aý¾SX/½lŒ.=ÆÊ>þX> Ζ>§>À>ù è>é?$?*?PÌ9?ƒ&H?Ñ U?%a`?Rj?7r?éKx?ŵ|?ñI?ü?Ð~? È{?­év? >p?£Ñg?+´]?‹øQ?®´D?\6? ú%?ª¼?pi?ˆ Þ>xܵ>®YŒ>j¡C>DÚ=¶®<ž:ƒ½Ì–¾=sn¾I¡¾T+ʾߓñ¾‘œ ¿ ƒ¿ž).¿CŠ=¿ÖˆK¿1 X¿÷ùb¿¼@l¿*Îs¿'”y¿é‡}¿¢¿©Þ¿I=~¿úÀz¿#gu¿SIn¿`ne¿ÕæZ¿_ÆN¿£#A¿2¿ä¿!¿ƒ9¿lKû¾cNÔ¾ÀÄ«¾>ú¾·û-¾s®½¨£,9¯=ÆP.>æ>±«>l;Ô>C9û>ç0?з!? 2?ÌA?:ÀN?òZ?òwe?5Qn?Gmu?à¾z?<~?TÞ?œ¢?Z‰}?x–y?WÑs?¿Dl?Éþb?ÿW?¾{K?Á{=?Ì.?œr?M¥ ??¦ñ>z>Ê>æ\¡>Æ›n>À>΃=¥h­¼%ñÙ½$öC¾/ƒŒ¾Ð¶¾k2Þ¾y`¿/´¿ò%¿ú5¿®D¿•òQ¿õ®]¿7Íg¿s:p¿_ïv¿óË{¿(Ò~¿Xü¿UH¿o·|¿rNx¿›r¿‰j¿)f`¿˜U¿-H¿{Ó9¿Ñ*¿·¿”¿ä羦À¾÷á–¾Ù&Y¾ô¾ý2/½Á±.= Ô>>Y>ƒÒ–>©À>#è>å?á%?Æ*?ëÍ9?ø'H? U?Eb`?Dj?úr?zLx?$¶|?ºG?ü?ÜÏ~?¡Ç{?év?>=p?¥Ðg?³]?5÷Q?0³D?¸ÿ5?Cø%?ú?ng?ü@Þ>ص>0UŒ>>˜C>t1Ú=Lk®šê>…µ«>¬?Ô>U=û>Õ2?Ÿ¹!?M2?UA?›ÁN?¤âZ?ûxe?Rn?ñmu?Y¿z?W<~?gÞ?}¢?‰}?ó•y?¡Ðs?ØCl?´ýb?‡X?TzK?/z=?.?Åp?X£ ?!¢ñ>/:Ê>wX¡>°’n>ƶ>){ƒ=]³­¼¹Ú½«C¾­‡Œ¾- ¶¾ 6Þ¾{b¿¶¿âó%¿¬û5¿‚¯D¿ëóQ¿ °]¿4Îg¿B;p¿Šçv¿_Ì{¿bÒ~¿^ü¿(H¿·|¿áMx¿Ùr¿—j¿ e`¿LU¿+H¿ßÑ9¿*¿}*¿˜þ¿Uàç¾QÀ¾€Ý–¾¸Y¾Ù꾨 /½×.=NÝ>`Y>úÖ–>ý À>>Úç>á?À'?…*?†Ï9?l)H?h U?ec`?6j?¼r? Mx?„¶|?æG?gü?£Ï~?5Ç{?qèv?p¶>²PŒ>C>áÚ=• ®<è_ƒ½F©¾i…n¾ýQ¡¾é3ʾœñ¾{  ¿n¿•.¿g=¿«‹K¿³ X¿ üb¿ˆBl¿–Ïs¿1•y¿Žˆ}¿N¢¿ƒÞ¿½<~¿ Àz¿ênu¿OSn¿Mle¿iäZ¿žÃN¿“ A¿Á2¿E¼!¿§5¿HCû¾ãEԾ󻫾4ñ¾pg.¾UM¯½e_w9¼D¯=0c.>ï>빫>ìCÔ>gAû>Ã4?o»!?û2?ÝA?ûÂN?ÚãZ?Óke?êRn?›nu?Ñ¿z?<~?zÞ?]¢?´ˆ}?n•y?ëÏs?òBl? üb?GX?SŒK?x=?`.?în?c¡ ?žñ>å5Ê> T¡>›‰n>‰­>„hƒ=þ­¼Mڽ׊C¾ŸNŒ¾‹ ¶¾Õ:Þ¾~d¿ü·¿©õ%¿Qý5¿±D¿AõQ¿K±]¿2Ïg¿Y>qÛ–>QÀ>iÞç>­ý?Ÿ)?D*?"Ñ9?á*H?³U?…d`?(j?r?žMx?ã¶|?H?aü?|Ò~?ÉÆ{?Óçv?¡;p?ªÎg?ª°]?‰ôQ?2°D?oü5?´ô%?ö¶?ic?‘8Þ>2 ¶>À‰Œ>ç…C>M Ú=ÝÕ­£ó>R¾«>,HÔ>yEû>±6?>½!?¨2?f!A?\ÄN?åZ?Üle?Hn?Eou?JÀz?ã<~?Þ?=¢?bˆ}?é”y?4Ïs? Bl?‹ûb? X?èŠK?Œ=?©.?m?nŸ ?å™ñ>š1Ê>šO¡>…€n>M¤>ßUƒ=ÌH®¼à(Ú½”C¾SŒ¾Öµ¾ ?Þ¾€f¿ã¹¿q÷%¿õþ5¿²D¿—öQ¿v²]¿0Ðg¿ß¢"Y>çß–>¦À>“âç>©ÿ?Ù?*?½Ò9?V,H?ÿU?¤e`?j?Ar?/Nx?C·|?@H?[ü?CÒ~?%Ì{?5çv?Ò:p?¬Íg?¯]?3óQ?´®D?Êú5?íò%?µ?fa?\4Þ>Ô¶>B…Œ>`úC>¹ùÙ=&‹­<2…ƒ½¿»¾”—n¾ÚZ¡¾~<ʾX¤ñ¾f¤ ¿Ãq¿.¿{=¿{K¿4X¿Iþb¿TDl¿Ñs¿;–y¿4‰}¿Ž¢¿]Þ¿1<~¿¿z¿–mu¿šQn¿lxe¿”òZ¿ÝÀN¿‚A¿f2¿¦¸!¿Ë1¿$;û¾c=Ô¾&³«¾+è¾U.¾(¯½Ýä=¹æj®=™u.>'ø>¸Â«>mLÔ>‹Iû>Ÿ8?¿!?V2?î"A?¼ÅN?FæZ?åme?îHn?Õfu?ÂÀz?)=~? Þ?¢?ˆ}?d”y?~Îs?&Al?wúb?Å X?}‰K?ýŠ=?h*.??k?y ?Æ•ñ>P-Ê>+K¡>own>›>:Cƒ=ƒ“®¼t;Ú½.C¾›WŒ¾tÚµ¾– Þ¾ƒh¿É»¿8ù%¿š6¿þ³D¿í÷Q¿¡³]¿.Ñg¿­=p¿dév¿ÜÇ{¿ûÏ~¿ü¿¢G¿ñµ|¿,Lx¿‘r¿Áj¿ªa`¿j U¿/'H¿Í9¿Ö*¿ß$¿Ô¿å è¾§@À¾Ж¾UY¾ Ͼ©.½G/=ù>Ã+Y>^ä–>úÀ>½æç>¥?¹?×*?XÔ9?Ê-H?JU?Äf`? j?r?ÀNx?¢·|?mH?Tü? Ò~?¹Ë{? ïv?:p?®Ìg?T®]?ÝñQ?5­D?&ù5?&ñ%?)³?d_?'0Þ>v¶>Ä€Œ>4ñC>°åÚ=n@­<×—ƒ½üľª n¾I_¡¾É@ʾw¨ñ¾[¦ ¿šs¿¸.¿š|=¿‚|K¿JX¿^ÿb¿;El¿¹Ñs¿À–y¿†‰}¿®¢¿JÞ¿ë;~¿ ¾z¿ìlu¿ÀPn¿cwe¿^ñZ¿ZÒN¿ùA¿¸2¿Ö¶!¿Ý/¿7û¾"9Ô¾À®«¾§ã¾ÒK.¾}¯½ÿ†¹„}®=«.>¬ü>Ç«>­PÔ>Mû>:?ÝÀ!?2?w$A?ÇN?|çZ?ïne?ÈIn?gu?Ǻz?o=~?³Þ?ý¡?¼‡}?ß“y?ÈÍs?@@l?bùb?… X?ˆK?k‰=?²(.?¢‚?ƒ› ?¨‘ñ>)Ê>¼F¡>Ynn>Ó‘>•0ƒ=:Þ®¼NÚ½Y¦C¾\Œ¾ÒÞµ¾Ì Þ¾ûN¿°½¿ÿú%¿>6¿|µD¿CùQ¿Ì´]¿+Òg¿|>p¿êv¿HÈ{¿5Ð~¿ ü¿ÙI¿’µ|¿›Kx¿Ïr¿Ïj¿Š``¿ U¿º%H¿rË9¿*¿#¿Ø¿»è¾R<À¾¦Ë–¾3ùX¾ÉžTx.½jl/=]>ä4Y>Õè–>OÀ>çêç>¡?˜?– *?ð¿9??/H?–U?äg`?þj?Ær?ROx?¸|?™H?Nü?ÐÑ~?MË{?lîv?CDp?°Ëg?)­]?‡ðQ?¶«D?÷5?_ï%?B±?a]?ò+Þ>þµ>F|Œ> èC>ÓÚ={õ°<|ªƒ½8ξ¿©n¾¸c¡¾Eʾ•¬ñ¾P¨ ¿ru¿o.¿,~=¿ì}K¿ŠX¿¥ñb¿!Fl¿oÒs¿E—y¿Ù‰}¿Î¢¿6Þ¿¥;~¿'¾z¿Blu¿åOn¿Zve¿(ðZ¿ùÐN¿q/A¿ 2¿µ!¿ï-¿3û¾â4Ô¾Yª«¾"ß¾B.¾ß¯½@Ræ¸"®=à .>IÃ>…Ë«>íTÔ>®Qû>z<?¬Â!?±2?ÿ%A?}ÈN?²èZ?øoe?£Jn?)hu?@»z?ô9~?ÇÞ?Ý¡?i‡}?Z“y?Ís?Y?l?Nøb?D X?¨†K?Ù‡=?ü&.?Ë€?`´ ?Šñ>º$Ê>MB¡>Den>–ˆ>ðƒ=ò(¯¼›`Ú½„¯C¾—`Œ¾/ãµ¾Þ¾þP¿Š¥¿Æü%¿ã6¿û¶D¿™úQ¿÷µ]¿)Óg¿J?p¿ êv¿´È{¿nÐ~¿'ü¿¬I¿Nº|¿ Kx¿ r¿Ýj¿j_`¿ÓU¿E$H¿×É9¿X*¿!!¿Ü¿‘è¾þ7À¾W—¾ðX¾†¼¾þR.½À‘/=¡ >>Y>Kí–>£!À>ïç>?w?U *?‹Á9?ÀH?áU?i`?ïj?‰r?ãOx?a¸|?ÆH?Hü?—Ñ~?áÊ{?Ïív?tCp?FØg?þ«]?1ïQ?8ªD?Ýõ5?—í%?\¯?_[?¼'Þ>»ùµ>ÉwŒ>ÞÞC>ˆÀÚ=ΰ<¨½‚½u×¾Õ²n¾&h¡¾^Iʾ³°ñ¾Eª ¿Iw¿%.¿¾=¿WK¿ËX¿ºòb¿´:l¿&Ós¿Ê—y¿,Š}¿í¢¿#Þ¿_;~¿¯½z¿˜ku¿ On¿Que¿óîZ¿™ÏN¿é-A¿Z#2¿7³!¿,¿ï.û¾¢0Ծ󥫾ھi9.¾B𮽃–›¸¿¢®=.>ÍÇ> “«>-YÔ>ÀUû>h>?|Ä!?^2?‡'A?ÝÉN?èéZ?qe?}Kn?Óhu?¸»z?;:~?ÓÝ?½¡?‡}?Õ’y?[Ìs?s>l?9÷b?X?=…K?G†=?F%.?ô~?k² ?ØÁñ>p Ê>Þ=¡>.\n>Z>K ƒ=©s¯¼/sÚ½°¸C¾eŒ¾çµ¾6Þ¾S¿q§¿0æ%¿‡6¿z¸D¿ïûQ¿"·]¿&Ôg¿@p¿>ëv¿ É{¿¨Ð~¿-ü¿€I¿î¹|¿ARx¿Jr¿ëj¿J^`¿‡U¿Ñ"H¿<È9¿™*¿B¿à ¿g辪3À¾áÿ–¾dY¾B³¾©-.½·/=å>&GY>Âñ–>÷%À>;óç>™?V? *?&Ã9?5H?nU?#j`?áj?Kr?uPx?Á¸|?óH?Aü?]Ñ~?uÊ{?1ív?¦Bp?I×g?Óº]?ÛíQ?¹¨D?8ô5?Ðë%?u­?\Y?‡#Þ>]õµ>KsŒ>²ÕC>õ­Ú= `°RÌ>˜«>/#Ô>ÒYû>V@?KÆ!? 2?)A?>ËN?ëZ? re?XLn?}iu?1¼z?:~?æÝ?R£?Æ}?P’y?¥Ës?=l?%öb?ÂX?ÓƒK?µ„=?#.?}?v° ?º½ñ>ñVÊ>o9¡>Sn>v>¦ø‚=a¾¯¼Ã…Ú½ÛÁC¾“iŒ¾ëëµ¾lÞ¾U¿X©¿÷ç%¿ªð5¿ø¹D¿EýQ¿M¸]¿$Õg¿ç@p¿Ûëv¿ŒÉ{¿áÐ~¿3ü¿SI¿¹|¿¯Qx¿ïr¿ùj¿+]`¿<U¿\!H¿ Æ9¿Ú*¿c¿ä ¿=üç¾U/À¾jû–¾çZY¾ñ(¾T.½jÜ/=)>GPY>8ö–>L*À>e÷ç>• ?5?Ò*?ÂÄ9?ªH?ºU?Ü[`?Ój? r?Qx? ¹|?I?;ü?$Ñ~? Ê{?“ìv?ØAp?KÖg?¨¹]?ÓþQ?:§D?“ò5? ê%?Ž«?ZW?RÞ>ñµ>ÍnŒ>‡ÌC>a›Ú=U°<ó₽]k¾…Hn¾q¡¾óQʾï¸ñ¾/® ¿øz¿‘!.¿â‚=¿-‚K¿MX¿ãôb¿×Ð>mœ«>o'Ô> &û>DB?È!?¹2?˜*A?žÌN?TìZ?se?2Mn?(ju?ª¼z?Ç:~?úÝ?2£?ߊ}?Ê‘y?îÊs?¦§RÊ>¾q¡>Jn>àl>æ‚= °¼V˜Ú½ËC¾nŒ¾I𵾡Þ¾W¿>«¿¾é%¿Nò5¿û¦D¿›þQ¿x¹]¿"Ög¿¶Ap¿yìv¿øÉ{¿Ñ~¿:ü¿'I¿0¹|¿Qx¿-r¿ûj¿ \`¿ðU¿çH¿Å9¿*¿„¿è ¿øç¾+À¾ôö–¾ÆQY¾­¾‡â/½¿0=l'>hYY>¯ú–> .À>ûç>‘ ??‘*?]Æ9?!H?U?û\`?Ñj?Ðr?˜Qx?¹|?LI?5ü?ëÐ~?É{?õëv? Ap?NÕg?~¸]?}ýQ?7ºD?ïð5?Bè%?§©?WU?Þ>¢ìµ>OjŒ>\ÃC>ΈÚ=žÊ¯<˜õ‚½™t¾›Qn¾µ8¡¾=Vʾ ½ñ¾$° ¿Ï|¿H#.¿s„=¿—ƒK¿ŽX¿÷õb¿g=l¿‡Ës¿:’y¿¶†}¿M£¿éÝ¿Œ:~¿E¼z¿™iu¿|Ln¿6re¿QëZ¿xËN¿P)A¿R2¿—Æ!¿§@¿|Zû¾á#Ô¾¿˜«¾;Ë.¾i¸®½i9 8˜Ú®=²..>[Õ>Ô «>¯+Ô>2*û>Â)?êÉ!?f!2? ,A?ÿÍN?ŠíZ?te? Nn?Òju?"½z? ;~? Þ?£?ŒŠ}?d˜y?8Ês?À;l?üób?AX?ý€K?‘=?# .?ny?Œ¬ ?~µñ>\NÊ>Om¡>g½n>£c>[Ó‚=ÏS°¼êªÚ½2ÔC¾ŽrŒ¾¦ôµ¾×"Þ¾Y¿%­¿†ë%¿óó5¿z¨D¿ñÿQ¿¢º]¿×g¿„Bp¿ív¿dÊ{¿TÑ~¿@ü¿úH¿Ð¸|¿Px¿kr¿ j¿Rj`¿¥U¿rH¿jÃ9¿] *¿¥¿ì¿éóç¾­&À¾}ò–¾¥HY¾i¾2½/½Œ'.=°0>‰bY>%ÿ–>ô2À>¹ÿç> ?ô?P*?øÇ9?”"H?QU?^`?Ãj?*r?)Rx?ß¹|?yI?.ü?±Ð~?1É{?Wëv?;@p?PÔg?S·]?(üQ?¸¸D?Ì6?zæ%?Á§?TS?çÞ>Dèµ>ÑeŒ>0ºC>:vÚ=ç¯<=ƒ½Ö}¾±Zn¾$=¡¾¼ʾ+Áñ¾² ¿¦~¿þ$.¿†=¿…K¿ÏX¿ ÷b¿M>l¿=Ìs¿¿’y¿ ‡}¿·¡¿ÖÝ¿F:~¿Ì»z¿ïhu¿¡Kn¿-qe¿êZ¿ÊN¿È'A¿¤2¿ÈÄ!¿¹>¿kVû¾ßYÔ¾Y”«¾‹È¾–.¾Ì¥®½rX85í®=ç7.>àÙ>:¥«>ð/Ô>D.û>°+?ì²!?#2?©-A?_ÏN?ÀîZ?&ue?çNn?|ku?›½z?S;~? Þ?ó¢?9Š}?ß—y?DÓs?Ú:l?çòb?X?“K?ÿ=?m.?–w?—ª ?`±ñ>JÊ>àh¡>R´n>øØ>¶À‚=†ž°¼}½Ú½]ÝC¾ wŒ¾ùµ¾ 'Þ¾ [¿ ¯¿Mí%¿˜õ5¿ù©D¿ùîQ¿Í»]¿Øg¿SCp¿µív¿ÐÊ{¿Ñ~¿Gü¿ÍH¿q¸|¿ûOx¿¨r¿j¿3i`¿U¿ýH¿ÎÁ9¿ž *¿Å¿ð¿¿ïç¾X"À¾î–¾„?Y¾& ¾Ý—/½áL.=»>ªkY>œ—>H7À>ãè>‰?Ó ?*?”É9?$H?U?;_`?µj?ìr?ñJx?>º|?¥I?(ü?xÐ~?ÅÈ{?ºêv?l?p?RÓg?(¶]?ÒúQ?:·D?(6?ý%?Ú¥?RQ?²Þ>çãµ>SaŒ>±C>¦cÚ=/5¯<⃽‡¾Çcn¾“A¡¾$ʾ݌ñ¾´ ¿~€¿´&.¿—‡=¿m†K¿ X¿!øb¿4?l¿ôÌs¿D“y¿\‡}¿×¡¿ÊÞ¿:~¿S»z¿Ehu¿ÇJn¿#pe¿åèZ¿·ÈN¿?&A¿÷2¿øÂ!¿Ë<¿YRû¾ŸUÔ¾=Ì«¾ľb .¾.“®½/Ú8Òÿ®=A.>dÞ>¡©«>04Ô>V2û>ž-?»´!?Å 2?1/A?¿ÐN?öïZ?/ve?ÂOn?&lu?¾z?™;~?3Þ?Ó¢?ç‰}?Z—y?Òs?FFl?Òñb?¿X?(~K?m~=?¶.?¿u?¢¨ ?A­ñ>ÇEÊ>rd¡><«n>¼Ï>Š­ƒ=>é°¼ÐÚ½ˆæC¾Š{Œ¾býµ¾A+Þ¾ ]¿ò°¿ï%¿<÷5¿x«D¿OðQ¿ø¬]¿Ùg¿!Dp¿Sîv¿<Ë{¿ÇÑ~¿Mü¿¡H¿¸|¿jOx¿ær¿%j¿h`¿ÌU¿|/H¿3À9¿ß *¿æ¿ô¿•ëç¾À¾é–¾c6Y¾â¾ˆr/½6r.=EÄ>µ÷X>—>;À> è>…?²"?Î*?/Ë9?}%H?è U?[``?¨j?¯r?ƒKx?‚µ|?ÒI?!ü?>Ð~?YÈ{?êv?ž>p?UÒg?ý´]?|ùQ?»µD?ƒ6?Jû%?¾?OO?|Þ>‰ßµ>Õ\Œ>Ú§C>QÚ=xê®<‡-ƒ½P¾Üln¾F¡¾Q(ʾûñ¾1› ¿U‚¿j(.¿)‰=¿×‡K¿P X¿5ùb¿@l¿ªÍs¿É“y¿®‡}¿÷¡¿·Þ¿z=~¿Ûºz¿›gu¿ìIn¿oe¿¯çZ¿VÇN¿·$A¿J2¿)Á!¿Ý:¿GNû¾_QÔ¾×Ç«¾iý¾-.¾‘€®½ög9p¯=PJ.>éâ>®«>p8Ô>h6û>Œ/?ж!?r2?¹A? ÒN?,ñZ?8we?œPn?Ðlu?Œ¾z?à;~?FÞ?³¢?”‰}?Õ–y?×Ñs?`El?‹ÿb?~X?½|K?Û|=?.?çs?­¦ ?#©ñ>}AÊ>`¡>'¢n>Æ>嚃=14­¼¥âÚ½´ïC¾€Œ¾¿¶¾v/Þ¾_¿Ù²¿Ûð%¿áø5¿ö¬D¿¥ñQ¿#®]¿…Ìg¿ïDp¿ðîv¿¨Ë{¿Ò~¿Sü¿tH¿²·|¿ØNx¿$r¿3j¿óf`¿U¿.H¿›Ô9¿ *¿¿ø¿kçç¾°À¾å–¾B-Y¾žú¾3M/½‹—.=‰Í>ÖY>aÏ–>ñ?À>6 è>€?‘$?*?ÊÌ9?ò&H?4 U?{a`?šj?qr?Lx?áµ|?šG?ü?Ð~?íÇ{?~év?Ï=p?WÑg?Ò³]?%øQ?<´D?ß6?‚ù%?¼?×h?G Þ>+Ûµ>WXŒ>®žC>>Ú=ÀŸ®<,@ƒ½™¾òun¾qJ¡¾œ,ʾ•ñ¾& ¿ñj¿!*.¿»Š=¿B‰K¿‘ X¿Júb¿Al¿`Îs¿N”y¿ˆ}¿¢¿¤Þ¿4=~¿ÖÀz¿ñfu¿In¿ne¿yæZ¿öÅN¿.#A¿œ2¿Z¿!¿ï8¿5Jû¾MÔ¾që¾åø¾w.¾óm®½ÕÅ79 %¯=…S.>nç>n²«>°<Ô>z:û>z1?Z¸!? 2?AA?£ÀN?aòZ?Axe?vQn?zmu?¿z?&<~?ZÞ?“¢?A‰}?P–y?!Ñs?zDl?vþb?iX?R{K?I{=?J.?r?¸¤ ?¥ñ>2=Ê>”[¡>™n>B½>@ˆƒ=è~­¼®öÙ½ßøC¾†„Œ¾¶¾¬3Þ¾a¿À´¿£ò%¿…ú5¿u®D¿ûòQ¿N¯]¿‚Íg¿±:p¿Žïv¿Ì{¿9Ò~¿Zü¿GH¿S·|¿GNx¿ar¿Aj¿Óe`¿5U¿“,H¿Ó9¿L*¿(¿üÿ¿Aãç¾[À¾£à–¾!$Y¾Zñ¾Þ'/½à¼.=ÍÖ>÷ Y>ØÓ–>óÀ>`è>|?p&?K*?fÎ9?g(H? U?›b`?Œj?4r?¦Lx?A¶|?ÇG?lü?ËÏ~?Ç{?àèv?=p?YÐg?§²]?ÏöQ?¾²D?:ÿ5?»÷%?2º?Õf?»?Þ>ÍÖµ>ÙSŒ>ƒ•C>ë+Ú= U®<ÑRƒ½É¢¾n¾àN¡¾æ0ʾ8™ñ¾Ÿ ¿Él¿b.¿MŒ=¿­ŠK¿Ò X¿^ûb¿æAl¿Ïs¿Ó”y¿Tˆ}¿7¢¿Þ¿î<~¿^Àz¿aou¿7Hn¿me¿CåZ¿•ÄN¿¦!A¿ï2¿Š½!¿7¿$Fû¾ßHÔ¾ ¿«¾`ô¾æm.¾fZ¯½³#]9«7¯=¹\.>òë>Ô¶«>ð@Ô>Œ>û>h3?)º!?Í2?ÊA?ÂN?ãZ?Jye?QRn?$nu?}¿z?l<~?mÞ?s¢?ïˆ}?Ë•y?kÐs?”Cl?býb?(X?çyK?·y=?”.?8p?â ?ç ñ>è8Ê>%W¡>ûn>´>›uƒ= É­¼B Ú½g„C¾‰Œ¾z ¶¾á7Þ¾c¿¦¶¿jô%¿*ü5¿ô¯D¿QôQ¿y°]¿€Îg¿;p¿¹çv¿Ì{¿sÒ~¿`ü¿H¿ó¶|¿µMx¿Ÿr¿Oj¿´d`¿êU¿+H¿eÑ9¿*¿î)¿þ¿ßç¾À¾,Ü–¾Y¾è¾‰/½6â.=à>Y>NØ–>G À>|Ûç>x?O(? *?Ð9?Û)H?Ë U?»c`?~j?ör?7Mx? ¶|?ôG?eü?¤Ò~?Ç{?Bèv?2B¶>[OŒ>WŒC>XÚ=R ®wð>;»«>1EÔ>Bû>V5?ù»!?{2?R A?dÃN?7äZ?"le?+Sn?Înu?õ¿z?²<~?€Þ?S¢?œˆ}?F•y?´Ïs?®Bl?Nüb?ç X?ç‹K?%x=?Ý.?an?Í  ?Éœñ>4Ê>¶R¡>æ†n>ɪ>öbƒ=W®¼ÖÚ½’C¾öOŒ¾Ø¶¾<Þ¾e¿¸¿1ö%¿Îý5¿r±D¿§õQ¿¤±]¿~Ïg¿N9Y>ÅÜ–>œÀ>¦ßç>Eþ?.*?É*?œÑ9?P+H?U?Úd`?pj?¹r?ÉMx?·|?!H?_ü?kÒ~?qÌ{?¤çv?d;p?^Îg?Q°]?#ôQ?À¯D?ñû5?-ô%?e¶?Ðb?P7Þ>å ¶>iˆŒ>,ƒC>ÄÚ=š¿­<xƒ½Cµ¾3‘n¾½W¡¾{9ʾt¡ñ¾£ ¿xp¿Î.¿íy=¿zK¿SX¿‡ýb¿³Cl¿ƒÐs¿Ý•y¿úˆ}¿w¢¿jÞ¿b<~¿m¿z¿ nu¿3Rn¿&ye¿×âZ¿ÔÁN¿•A¿”2¿ë¹!¿&3¿>û¾^@Ô¾=¶«¾Wë¾}[.¾+5¯½ X¹Õ]®="o.>ûô>¡¿«>qIÔ>¯Fû>D7?Ƚ!?(2?Û!A?ÅÄN?måZ?+me?THn?xou?nÀz?ø<~?“Þ?3¢?Iˆ}?Á”y?þÎs?ÇAl?9ûb?§ X?|ŠK?Œ=?'.?Šl?Øž ?ª˜ñ>S0Ê>HN¡>Ð}n>Œ¡>QPƒ=_®¼i.Ú½¾–C¾tTŒ¾c×µ¾K@Þ¾g¿tº¿ø÷%¿sÿ5¿ñ²D¿ýöQ¿Ï²]¿{Ðg¿=p¿õèv¿Ç{¿ÓÏ~¿mü¿ÁG¿4¶|¿’Lx¿r¿kj¿tb`¿S U¿5(H¿.Î9¿*¿0&¿8¿Ñè¾^À¾?Ó–¾½Y¾Õ¾Þ·.½à,/=˜ò>Z%Y><á–>ðÀ>Ðãç>@?h?ˆ*?7Ó9?Å,H?bU?úe`?bj?{r?ZNx?_·|?MH?Yü?2Ò~?Ì{?yïv?•:p?`Íg?&¯]?ÍòQ?B®D?Mú5?fò%?´?Í`?3Þ>‡¶>냌>¤÷C>0ôÙ=ãt­<ÁŠƒ½€¾¾Išn¾,\¡¾Æ=ʾ’¥ñ¾û¤ ¿Or¿….¿{=¿ƒ{K¿hÿW¿›þb¿™Dl¿9Ñs¿b–y¿L‰}¿—¢¿WÞ¿<~¿ô¾z¿cmu¿YQn¿xe¿8òZ¿tÀN¿ A¿æ2¿¸!¿81¿î9û¾<Ô¾×±«¾Óæ¾HR.¾Ž"¯½±Â2¹rp®=4ú->€ù>Ä«>±MÔ>ÁJû>29?˜¿!?Ö2?c#A?%ÆN?£æZ?4ne?/In?gu?æÀz?>=~?¦Þ?¢?ö‡}?<”y?HÎs?á@l?%úb?f X?‰K?…Š=?æ).?²j?㜠?Œ”ñ>,Ê>ÙI¡>ºtn>O˜>¬=ƒ=Æ©®¼ý@Ú½éŸC¾òXŒ¾ÁÛµ¾× Þ¾i¿Z¼¿Àù%¿6¿p´D¿SøQ¿ú³]¿yÑg¿ë=p¿“év¿üÇ{¿ Ð~¿ü¿”G¿Õµ|¿Lx¿Wr¿yj¿Ta`¿ U¿À&H¿“Ì9¿Q*¿Q$¿<¿§ è¾\?À¾ÈΖ¾œÿX¾K̾‰’.½5R/=Üû>{.Y>²å–>DÀ>úçç><?G?\*?ÓÔ9?9.H?­U?g`?Tj?>r?ìNx?¿·|?zH?Sü?øÑ~?™Ë{?Ûîv?ÔDp?cÌg?û­]?wñQ?ìD?¨ø5?žð%?˜²?Ë^?æ.Þ>)¶>nŒ>yîC>'àÚ=+*­À>nÈ«>ñQÔ>ÓNû> ;?gÁ!?ƒ2?ì$A?†ÇN?ÙçZ?>oe? Jn?²gu?ëºz?„=~?¹Þ?ó¡?£‡}?·“y?‘Ís?û?l?ùb?% X?§‡K?óˆ=?0(.?‚?îš ?nñ>¾'Ê>jE¡>¤kn>>+ƒ=}ô®¼‘SÚ½©C¾o]Œ¾ൾ Þ¾”O¿A¾¿‡û%¿¼6¿îµD¿©ùQ¿%µ]¿wÒg¿¹>p¿1êv¿hÈ{¿FÐ~¿"ü¿ÌI¿uµ|¿oKx¿•r¿‡j¿4``¿¼ U¿K%H¿øÊ9¿’*¿q"¿@¿}è¾;À¾y—¾{öX¾Ã¾4m.½Šw/= >œ7Y>)ê–>™À>$ìç>8?&? *?jÀ9?®/H?øU?:h`?Fj?r?}Ox?¸|?§H?Lü?¿Ñ~?-Ë{?=îv?Dp?øØg?Ь]?!ðQ?D«D?÷5?×î%?±°?È\?±*Þ>Ìüµ>ðzŒ>NåC>“ÍÚ=8ß°< °ƒ½ùоt¬n¾ e¡¾[Fʾϭñ¾å¨ ¿þu¿ñ.¿£~=¿X~K¿êX¿÷ñb¿:l¿¦Òs¿l—y¿ò‰}¿×¢¿1Þ¿;~¿¾z¿lu¿¤On¿ ve¿ÌïZ¿ÐN¿ü.A¿‹ 2¿}´!¿[-¿Ê1û¾ž3Ô¾ ©«¾Éݾß?.¾Sý®½ç и­•®=ž .>¡Ä>ÕÌ«>1VÔ>åRû>=?7Ã!?12?t&A?æÈN?éZ?Gpe?äJn?\hu?d»z? :~?ÌÞ?Ó¡?P‡}?2“y?ÛÌs??l?û÷b?äX?<†K?a‡=?y&.?>€?˳ ?PŒñ>s#Ê>û@¡>bn>Ö…>bƒ=5?¯¼$fÚ½@²C¾íaŒ¾|äµ¾BÞ¾—Q¿¦¿Ný%¿`6¿m·D¿ÿúQ¿P¶]¿tÓg¿ˆ?p¿Ïêv¿ÔÈ{¿Ð~¿(ü¿ŸI¿1º|¿ÞJx¿Òr¿•j¿_`¿pU¿Ö#H¿]É9¿Ó*¿’ ¿D¿Tè¾´6À¾—¾pjY¾Ã¹¾ßG.½ßœ/=d>½@Y> î–>í"À>Nðç>4??Ú *?Â9?/H?DU?Yi`?8j?Âr?Px?~¸|?ÓH?Fü?†Ñ~?ÁÊ{? ív?7Cp?û×g?¥»]?ËîQ?Æ©D?_õ5?í%?Ë®?ÅZ?{&Þ>nøµ>rvŒ>"ÜC>»Ú=”°<6½6Ú¾Šµn¾yi¡¾¥Jʾí±ñ¾Úª ¿Õw¿¨.¿5€=¿ÃK¿+X¿ ób¿ù:l¿šÉs¿ñ—y¿EŠ}¿÷¢¿Þ¿J;~¿‹½z¿eku¿ÊNn¿ue¿–îZ¿0ÏN¿t-A¿Ú"2¿­²!¿m+¿¸-û¾^/Ô¾£¤«¾EÙ¾«6.¾¶ê®½*R…¸K¨®=Ó.>&É>ð”«>qZÔ>öVû>ü>?Å!?Þ2?ü'A?FÊN?EêZ?Pqe?¿Kn?iu?Ü»z?P:~?ÙÝ?³¡?þ†}?­’y?%Ìs?.>l?çöb?¤X?Ñ„K?Ï…=?Ã$.?g~?Ö± ?žÀñ>(Ê>Œ<¡>yYn>™|>½ƒ=쉯¼¸xÚ½k»C¾kfŒ¾Úèµ¾wÞ¾šS¿¨¿·æ%¿6¿ì¸D¿UüQ¿{·]¿rÔg¿V@p¿mëv¿@É{¿¹Ð~¿/ü¿sI¿Ò¹|¿Rx¿r¿£j¿õ]`¿%U¿b"H¿ÁÇ9¿*¿³¿I ¿*ÿç¾`2À¾Œþ–¾OaY¾r/¾Š".½4Â/=§>ÞIY>ó–>A'À>xôç>0?å?™ *?¡Ã9?¤H?ÑU?yj`?)j?…r? Px?ݸ|?I??ü?LÑ~?UÊ{?ív?hBp?ýÖg?zº]?ÃÿQ?G¨D?»ó5?Ië%?ä¬?ÃX?F"Þ>ôµ>ôqŒ>÷ÒC>l¨Ú=ÉI°<ÜÕ‚½àd¾Ÿ¾n¾çm¡¾ðNʾ ¶ñ¾Ï¬ ¿­y¿^ .¿Ç=¿.K¿lX¿!ôb¿ß;l¿PÊs¿W‘y¿—Š}¿£¿ Þ¿;~¿½z¿»ju¿ïMn¿ùse¿`íZ¿ÏÍN¿ì+A¿-!2¿¬É!¿)¿¦)û¾+Ô¾= «¾ÀÔ¾v-.¾Ø®½µYê·èº®=.>«Í>V™«>s$Ô>[û>é@?ÕÆ!?‹2?…)A?§ËN?{ëZ?Yre?™Ln?°iu?U¼z?–:~?ìÝ?I£?«†}?(’y?nËs?H=l?Òõb?cX?gƒK?>„=? #.?|?ᯠ?€¼ñ>ªUÊ>8¡>cPn>\s>ó‚=¤Ô¯¼L‹Ú½—ÄC¾éjŒ¾8íµ¾­Þ¾œU¿é©¿è%¿'ñ5¿jºD¿«ýQ¿¦¸]¿pÕg¿%Ap¿ ìv¿¬É{¿òÐ~¿5ü¿FI¿s¹|¿„Qx¿¶r¿±j¿Õ\`¿ÙU¿í H¿&Æ9¿U*¿Ô¿M ¿ûç¾ .À¾ú–¾/XY¾.&¾½ü/½‰ç/=ë >ÿRY>÷–>–+À>¢øç>, ?Ä?X*?<Å9? H?U?1\`?j?Gr?1Qx?<¹|?-I?9ü?Ñ~?éÉ{?dìv?šAp?Ög?O¹]?nþQ?C»D?ò5?é%?ýª?ÀV?Þ>³ïµ>vmŒ>ÌÉC>Ø•Ú=ÿ¯<肽n¾:Kn¾Vr¡¾:Sʾ)ºñ¾Ä® ¿„{¿".¿Yƒ=¿™‚K¿­X¿5õb¿Å/Ò>½«>³(Ô>V'û>×B?¥È!?9 2? +A?ÍN?°ìZ?bse?sMn?Zju?μz?Ü:~?ÿÝ?)£?ÆŠ}?£‘y?¸Ês?b_QÊ>lp¡>MGn>j>rà‚=[°¼ßÚ½ÂÍC¾goŒ¾–ñµ¾âÞ¾ŸW¿Ï«¿Fê%¿Ìò5¿m§D¿ÿQ¿Ñ¹]¿mÖg¿óAp¿¨ìv¿Ê{¿,Ñ~¿<ü¿I¿¹|¿óPx¿ór¿³j¿µ[`¿ŽU¿xH¿‹Ä9¿–*¿õ¿Q ¿Ööç¾·)À¾Ÿõ–¾OY¾ê¾h×/½V .=/*> \Y>ü–>ê/À>Ìüç>( ?£?*?ØÆ9?Ž!H?hU?Q]`?j? r?ÃQx?œ¹|?YI?3ü?ÚÐ~?}É{?Æëv?Ì@p?Õg?%¸]?ýQ?ŹD?ó6?ºç%?©?¾T?ÛÞ>Uëµ>øhŒ> ÀC>EƒÚ=[´¯<&û‚½Zw¾PTn¾:¡¾„WʾG¾ñ¾¹° ¿[}¿Ê#.¿ë„=¿„K¿íX¿Jöb¿¬=l¿½Ës¿a’y¿Î†}¿¡¡¿äÝ¿w:~¿!¼z¿giu¿;Ln¿çqe¿õêZ¿ËN¿Û(A¿Ò2¿ Æ!¿@¿FYû¾"Ô¾p—«¾·Ë¾ .¾Ý²®½Â58#à®=p1.>´Ö>#¢«>ô,Ô>h+û>U*?tÊ!?æ!2?•,A?hÎN?æíZ?lte?NNn?ku?F½z?";~?Þ? £?sŠ}?=˜y?Ês?{;l?©ób?áX?‘€K?=? .?áx?÷« ?D´ñ>MÊ>ýk¡>²ºn>ã`>ÍÍ‚=j°¼s°Ú½íÖC¾åsŒ¾óõµ¾$Þ¾¡Y¿¶­¿ ì%¿pô5¿ì¨D¿ îQ¿ûº]¿k×g¿ÂBp¿Fív¿„Ê{¿eÑ~¿Bü¿íH¿´¸|¿aPx¿1r¿Áj¿ýi`¿BU¿H¿ïÂ9¿Ø *¿¿U¿¬òç¾c%À¾)ñ–¾íEY¾§¾²/½«2.=€´>AeY>z—>>4À>öè>$?‚?Õ*?sÈ9?#H?´U?q^`? j?dr?TRx?û¹|?†I?,ü? Ð~?É{?(ëv?ý?p?Ôg?ú¶]?ÂûQ?F¸D?O6?Pþ%?0§?»R?¦Þ>÷æµ>zdŒ>u·C>±pÚ=£i¯<Ë ƒ½—€¾f]n¾v>¡¾!ʾeÂñ¾®² ¿3¿%.¿}†=¿n…K¿.X¿^÷b¿’>l¿sÌs¿ç’y¿!‡}¿Á¡¿ÐÝ¿1:~¿¨»z¿¼hu¿`Kn¿Þpe¿¿éZ¿®ÉN¿S'A¿$2¿>Ä!¿&>¿4Uû¾›XÔ¾ “«¾2ǾØ.¾@ ®½Êœ¥8Áò®=¥:.>8Û>Ц«>41Ô>z/û>C,?v³!?”#2?.A?ÈÏN?ïZ?uue?(On?¯ku?¿½z?h;~?&Þ?é¢?!Š}?¸—y? Ós?•:l?•òb? X?'K?ˆ=?ê.? w?ª ?%°ñ>ËHÊ>Žg¡>±n>8Ö>(»‚=É´°¼ÃÚ½àC¾cxŒ¾Qúµ¾M(Þ¾¤[¿¯¿Õí%¿ö5¿kªD¿_ïQ¿&¬]¿hØg¿Cp¿äív¿ðÊ{¿ŸÑ~¿Iü¿ÀH¿T¸|¿ÐOx¿nr¿Ïj¿Ýh`¿µU¿ŽH¿TÁ9¿ *¿7¿Y¿‚îç¾!À¾²ì–¾ËLñX>ð—>“8À> è> ?a!?”*?Ê9?w$H?ÿU?‘_`?þj?&r?Kx?Zº|?²I?&ü?gÐ~?¥È{?‹êv?/?p?Óg?ϵ]?lúQ?ȶD?ª6?‰ü%?U¿?¹P?qÞ>™âµ>ü_Œ>J®C>^Ú=ì¯

    ½ß>ðª«>t5Ô>Œ3û>1.?Eµ!?D2?¦/A?(ÑN?RðZ?~ve?Pn?Ylu?7¾z?®;~?9Þ?É¢?Ή}?3—y?WÒs?Fl?€ñb?_X?¼}K?ö}=?4.?2u? ¨ ?¬ñ>€DÊ>c¡>‡¨n>ûÌ>ü§ƒ=ÿ°¼šÕÚ½DéC¾á|Œ¾¯þµ¾‚,Þ¾¦]¿ƒ±¿œï%¿¹÷5¿ê«D¿µðQ¿Q­]¿ÒËg¿^Dp¿‚îv¿\Ë{¿ØÑ~¿Oü¿“H¿õ·|¿>Ox¿¬r¿Ýj¿½g`¿iU¿ /H¿¸¿9¿Z *¿W¿]¿Xê羺À¾;è–¾ª3Y¾¾ig/½V}.=Ç>múX>?Ì–>ç<À>J è>?A#?S*?ªË9?ì%H?K U?±``?ðj?ér?®Kx?žµ|?ßI?ü?-Ð~?9È{?íév?`>p? Òg?¤´]?ùQ?IµD?6?Âú%?o½?@j?; Þ><Þµ>[Œ>¥C>ŠKÚ=5Ô®<3ƒ½“¾‘on¾TG¡¾˜)ʾ5’ñ¾Ç› ¿á‚¿í(.¿¡‰=¿CˆK¿° X¿ˆùb¿^@l¿àÍs¿ñ“y¿Ç‡}¿¢¿±Þ¿f=~¿·ºz¿hgu¿«In¿Ëne¿SçZ¿íÆN¿B$A¿Ê2¿ŸÀ!¿J:¿Mû¾PÔ¾‡Æ«¾ü¾oÿ-¾{®½"Š9ü¯=M.>Bä>W¯«>´9Ô>ž7û>0?·!?ò2?.A?‰ÒN?ˆñZ?‡we?ÝPn?mu?°¾z?ô;~?LÞ?©¢?{‰}?®–y?¡Ñs?El?8ÿb?X?Q|K?d|=?~.?[s?¦ ?é§ñ>6@Ê>±^¡>rŸn>¾Ã>W•ƒ=tJ­¼-èÚ½oòC¾^Œ¾ ¶¾·0Þ¾©_¿j³¿cñ%¿^ù5¿h­D¿ òQ¿|®]¿ÐÌg¿ :p¿ïv¿ÈË{¿Ò~¿Uü¿gH¿–·|¿­Nx¿êr¿ëj¿f`¿U¿˜-H¿!Ô9¿›*¿x¿a¿.æç¾fÀ¾Åã–¾‰*Y¾Û÷¾B/½«¢.=LÐ>ŽY>¶Ð–>éÀ>t è>? %?*?EÍ9?a'H?— U?Ña`?âj?«r?@Lx?þµ|?¨G?ü?ôÏ~?ÍÇ{?Oév?’=p? Ñg?y³]?À÷Q?ʳD?a6?ûø%?ˆ»?>h?¯BÞ>ÞÙµ>WŒ>ó›C>ö8Ú=}‰®<ºEƒ½Mœ¾§xn¾ÃK¡¾ã-ʾT–ñ¾¼ ¿~k¿£*.¿3‹=¿®‰K¿ð X¿œúb¿EAl¿—Îs¿v”y¿ˆ}¿!¢¿žÞ¿ =~¿²Àz¿¾fu¿ÑHn¿Âme¿æZ¿ÅN¿º"A¿2¿Ï¾!¿\8¿ÿHû¾ÛKÔ¾!«¾Œ÷¾\t.¾gh®½èB9™*¯=CV.>Æè>¾³«>õ=Ô>°;û> 2?ä¸!? 2?¶A? ÁN?¾òZ?xe?·Qn?­mu?(¿z?;<~?_Þ?‰¢?)‰}?)–y?ëÐs?6Dl?$þb? X?æzK?Òz=?Ç.?ƒq?"¤ ?Ë£ñ>ë;Ê>BZ¡>\–n>‚º>²‚ƒ=+•­¼7üÙ½šûC¾Ü…Œ¾j¶¾í4Þ¾«a¿Qµ¿*ó%¿û5¿ç®D¿aóQ¿§¯]¿ÎÍg¿î:p¿Jçv¿4Ì{¿KÒ~¿\ü¿:H¿6·|¿Nx¿'r¿ùj¿~e`¿ÒU¿$,H¿†Ò9¿Ç*¿™¿eÿ¿âç¾À¾Nß–¾h!Y¾—î¾¾/½È.=Ù>¯ Y>,Õ–>= À>Øç>?ÿ&?Ñ*?àÎ9?Ö(H?â U?ðb`?Ôj?nr?ÑLx?]¶|?ÔG?jü?ºÏ~?aÇ{?±èv?ÃÞ>S¶>ƒRŒ>Ç’C>b&Ú=Æ>®<_Xƒ½Š¥¾½n¾2P¡¾-2ʾršñ¾±Ÿ ¿Um¿ä.¿ÅŒ=¿‹K¿1 X¿°ûb¿+Bl¿MÏs¿û”y¿mˆ}¿A¢¿‹Þ¿Ú<~¿:Àz¿/ou¿öGn¿¹le¿çäZ¿,ÄN¿1!A¿o2¿½!¿n6¿íDû¾›GÔ¾»½«¾ó¾(k.¾ÚT¯½ßEh97=¯=w_.>Kí>$¸«>5BÔ>Â?û>û3?´º!?M2??A?mÂN?]ãZ?™ye?’Rn?Wnu?¡¿z?<~?rÞ?j¢?Öˆ}?¤•y?4Ðs?OCl?ýb?ÈX?åŒK?@y=?.?¬o?-¢ ?­Ÿñ>¡7Ê>ÓU¡>Fn>E±> pƒ=ãß­¼ËÚ½"‡C¾ZŠŒ¾Ç ¶¾"9Þ¾®c¿7·¿òô%¿§ü5¿f°D¿·ôQ¿Ò°]¿ÌÎg¿½;p¿èçv¿ØÆ{¿„Ò~¿bü¿ H¿×¶|¿ŠMx¿er¿j¿^d`¿‡U¿¯*H¿êÐ9¿*¿_)¿iý¿ÚÝç¾½À¾×Ú–¾GY¾Tå¾i÷.½Uí.=Óâ>ÐY>£Ù–>‘À>ºÜç>àü?Þ(?*?{Ð9?J*H?-U?d`?Æj?0r?cMx?½¶|?H?dü?“Ò~?õÆ{?èv?õ;p?Ïg?#±]?õQ?ͰD?ý5?lõ%?»·?9d?E:Þ>õ ¶>NŒ>œ‰C>ÏÚ=ô­<kƒ½Ç®¾ÒŠn¾¡T¡¾x6ʾžñ¾¦¡ ¿-o¿›.¿Óx=¿ƒŒK¿rX¿Åüb¿Cl¿Ðs¿€•y¿Àˆ}¿a¢¿xÞ¿”<~¿Á¿z¿…nu¿ÍRn¿¯ke¿±ãZ¿ÌÂN¿©A¿Á2¿1»!¿€4¿Û@û¾ZCÔ¾T¹«¾ƒî¾óa.¾=B¯½B\r¹ÔO¯=¬h.>Ðñ>м«>uFÔ>ÔCû>é5?ƒ¼!?û2?Ç A?ÍÃN?“äZ?qle?lSn?ou?Àz?Ç<~?†Þ?J¢?ƒˆ}?•y?~Ïs?iBl?ûûb?ˆ X?z‹K?1=?[.?Õm?8  ?›ñ>V3Ê>dQ¡>1„n>¨>h]ƒ=š*®¼^!Ú½NC¾LQŒ¾%¶¾W=Þ¾°e¿¹¿¹ö%¿Kþ5¿ä±D¿ öQ¿ý±]¿ÉÏg¿‹c`¿; U¿:)H¿OÏ9¿I*¿€'¿¿¯Ùç¾h À¾aÖ–¾&Y¾Ü¾Ò.½ª/=ì>ñY>Þ–>æÀ>äàç>Üþ??N*?Ò9?¿+H?yU?0e`?¸j?ór?ôMx?·|?.H?]ü?ZÒ~?QÌ{?uçv?&;p?Îg?ø¯]?½óQ?N¯D?tû5?¥ó%?Ôµ?6b?6Þ>˜¶>‡Œ>p€C>;Ú=W©­<ª}ƒ½¸¾è“n¾Y¡¾Ã:ʾ®¢ñ¾›£ ¿q¿Q.¿ez=¿„zK¿²X¿Ùýb¿÷Cl¿¹Ðs¿–y¿‰}¿¢¿eÞ¿N<~¿I¿z¿Ûmu¿òQn¿×xe¿{âZ¿kÁN¿ A¿2¿a¹!¿’2¿É<û¾?Ծ¾ÿ龿X.¾ /¯½cþL¹ac®=àq.>Tö>ñÀ«>µJÔ>æGû>×7?R¾!?¨2?P"A?.ÅN?ÉåZ?zme?–Hn?«ou?’Àz? =~?™Þ?*¢?0ˆ}?š”y?ÈÎs?ƒAl?çúb?G X?ŠK?Ÿ‹=?+.?ýk?Cž ?p—ñ> /Ê>õL¡>{n>Ìž>ÃJƒ=Ru®¼ò3Ú½y™C¾ÊUŒ¾°Øµ¾ŒAÞ¾³g¿»¿€ø%¿ðÿ5¿c³D¿c÷Q¿(³]¿ÇÐg¿Z=p¿$év¿°Ç{¿äÏ~¿ü¿´G¿¶|¿gLx¿àr¿#j¿b`¿ð U¿Æ'H¿´Í9¿Š*¿¡%¿¡¿”è¾À¾êÑ–¾Y¾ÌÒ¾¿¬.½ÿ7/=[õ>(Y>â–>:À>åç>Ø?÷?"*?²Ó9?4-H?ÄU?Pf`?ªj?µr?†Nx?|·|?[H?Wü?!Ò~?åË{?Jïv?W:p?Íg?Í®]?gòQ?ЭD?Ðù5?Þñ%?î³?4`?Ú1Þ>:¶>•‚Œ>éôC>§îÙ= ^­Ùú>WÅ«>õNÔ>øKû>Å9?"À!?V2?Ø#A?ŽÆN?ÿæZ?„ne?pIn?:gu? Áz?S=~?¬Þ? ¢?݇}?”y?Îs?@l?Òùb? X?¥ˆK? Š=?c).?aƒ?Nœ ?R“ñ>Á*Ê>‡H¡>rn>•>8ƒ= À®¼†FÚ½¤¢C¾HZŒ¾ݵ¾ Þ¾µi¿ë¼¿Gú%¿”6¿â´D¿¹øQ¿S´]¿ÅÑg¿(>p¿Âév¿È{¿Ð~¿ü¿ëI¿¸µ|¿ÕKx¿r¿1j¿ÿ``¿¥ U¿Q&H¿Ì9¿Ì*¿Â#¿¥¿j è¾>À¾sÍ–¾äüX¾ˆÉ¾j‡.½T]/=Ÿþ>41Y>ç–>À>8éç>Ô?Ö?á*?I¿9?¨.H?U?pg`?œj?xr?Ox?Û·|?‡H?Qü?çÑ~?yË{?¬îv?–Dp?Ìg?¢­]?ñQ?Q¬D?+ø5?ð%?²?1^?¥-Þ>Üÿµ>~Œ>¾ëC>žÚÚ=è­<ô¢ƒ½}ʾ¦n¾ía¡¾XCʾëªñ¾…§ ¿³t¿¾.¿‰}=¿Z}K¿ X¿5ñb¿ÄEl¿&Òs¿—y¿¸‰}¿Á¢¿>Þ¿Á;~¿X¾z¿‡lu¿>Pn¿Åve¿¦ðZ¿ˆÑN¿A¿¸2¿Âµ!¿¶.¿¦4û¾š6Ô¾!¬«¾õà¾VF.¾e ¯½¦B¹œˆ®='.>uÁ>¾É«>5SÔ> Pû>³;?ñÁ!?2?`%A?ïÇN?5èZ?oe?KJn?ägu?»z?™=~?¿Þ?ê¡?‹‡}?“y?[Ís?¶?l?¾øb?Å X?;‡K?|ˆ=?­'.?‰?*µ ?4ñ>v&Ê>D¡>ïhn>RŒ>y%ƒ=Á ¯¼YڽЫC¾Æ^Œ¾láµ¾NÞ¾.P¿Ò¾¿ü%¿96¿`¶D¿úQ¿~µ]¿ÂÒg¿÷>p¿`êv¿ˆÈ{¿WÐ~¿$ü¿¾I¿tº|¿DKx¿[r¿?j¿ß_`¿Y U¿Ü$H¿}Ê9¿ *¿ã!¿©¿@è¾¾9À¾%—¾ÃóX¾DÀ¾b.½ª‚/=ã>U:Y>}ë–>ãÀ>bíç>Ð?µ?  *?åÀ9?)H?[U?h`?Žj?:r?©Ox?;¸|?´H?Jü?®Ñ~? Ë{?îv?ÈCp?­Øg?w¬]?»ïQ?ÒªD?†ö5?Oî%? °?/\?p)Þ>ûµ>™yŒ>’âC> ÈÚ=õȰ<™µƒ½ºÓ¾)¯n¾\f¡¾¢Gʾ ¯ñ¾z© ¿Šv¿t.¿=¿Å~K¿JX¿Jòb¿W:l¿ÜÒs¿”—y¿ Š}¿à¢¿+Þ¿{;~¿ß½z¿Üku¿cOn¿¼ue¿pïZ¿'ÐN¿ˆ.A¿ 2¿ó³!¿È,¿”0û¾Z2Ô¾º§«¾qܾ!=.¾Ç÷®½É¹¸9›®=\.>úÅ>Ù‘«>uWÔ>Tû>¡=?ÁÃ!?±2?é&A?OÉN?kéZ?–pe?%Kn?hu?ˆ»z?:~?ÒÞ?Ê¡?8‡}? “y?¥Ìs?Ð>l?©÷b?…X?Ð…K?ê†=?÷%.?²?5³ ?‚Ãñ>,"Ê>©?¡>Ú_n>ƒ>Ôƒ=xU¯¼­kÚ½û´C¾DcŒ¾Éåµ¾ƒÞ¾0R¿¬¦¿Õý%¿Ý6¿ß·D¿eûQ¿©¶]¿ÀÓg¿Å?p¿þêv¿ôÈ{¿‘Ð~¿*ü¿’I¿º|¿{Rx¿˜r¿Mj¿¿^`¿ U¿g#H¿âÈ9¿N*¿ ¿­¿è¾j5À¾®—¾¸gY¾·¾¿<.½ÿ§/=&>vCY>ôï–>7$À>Œñç>Ì?”?_ *?€Â9?žH?èU?¯i`?€j?ür?:Px?š¸|?áH?Dü?uÑ~?¡Ê{?qív?ùBp?¯×g?L»]?eîQ?T©D?âô5?ˆì%?:®?,Z?:%Þ>!÷µ>uŒ>gÙC>wµÚ=>~°<ÅÈ‚½öܾ?¸n¾Ëj¡¾ìKʾ'³ñ¾o« ¿bx¿*.¿­€=¿/€K¿ŠX¿_ób¿=;l¿ÐÉs¿˜y¿]Š}¿£¿Þ¿5;~¿g½z¿2ku¿‰Nn¿³te¿:îZ¿ÇÎN¿ÿ,A¿Z"2¿#²!¿Ú*¿‚,û¾.Ô¾T£«¾ì×¾í3.¾*宽¤^¸×­®=‘.>~Ê>?–«>w!Ô>-Xû>??Å!?^2?q(A?¯ÊN?¡êZ?Ÿqe?Ln?9iu?¼z?d:~?ßÝ?©¡?å†}?…’y?îËs?ê=l?•öb?DX?e„K?X…=?A$.?Û}?@± ?d¿ñ>­XÊ>:;¡>ÄVn>Øy>.ƒ=/ ¯¼A~Ú½'¾C¾ÂgŒ¾'êµ¾¸Þ¾3T¿“¨¿?ç%¿‚6¿^¹D¿»üQ¿Ô·]¿¾Ôg¿”@p¿œëv¿`É{¿ÊÐ~¿1ü¿eI¿µ¹|¿êQx¿>r¿[j¿Ÿ]`¿ÂU¿ò!H¿GÇ9¿*¿$¿± ¿ìýç¾1À¾8ý–¾—^Y¾¯,¾j.½TÍ/=j>—LY>kô–>Œ(À>¶õç>È?t?*?Ä9?H?4U?Ïj`?rj?¿r?ËPx?ù¸|? I?>ü?;Ñ~?5Ê{?Óìv?+Bp?²Ög?!º]?^ÿQ?Õ§D?=ó5?Áê%?S¬?*X?!Þ>Ãòµ>pŒ><ÐC>ã¢Ú=†3°Ï>¦š«>·%Ô>{$û>}A?_Ç!? 2?ú)A?ÌN?×ëZ?¨re?ÚLn?ãiu?y¼z?«:~?òÝ??£?’†}?’y?8Ës?=l?€õb?X?û‚K?ƃ=?Š".?|?K¯ ?F»ñ>cTÊ>ˆs¡>®Mn>œp>‰í‚=ç꯼ÕÚ½RÇC¾@lŒ¾…îµ¾îÞ¾5V¿zª¿é%¿¥ñ5¿ÜºD¿þQ¿ÿ¸]¿»Õg¿bAp¿9ìv¿ÌÉ{¿Ñ~¿7ü¿9I¿V¹|¿YQx¿|r¿]j¿\`¿vU¿~ H¿«Å9¿Ð*¿E¿µ ¿Âùç¾Á,À¾Áø–¾vUY¾l#¾ñ/½©ò/=®#>¸UY>áø–>à,À>àùç>Ä ?S?Ý*?·Å9?ˆ H?€U?‡\`?cj?r?]Qx?Y¹|?:I?7ü?Ñ~?ÉÉ{?5ìv?]Ap?´Õg?ö¸]?þQ?ѺD?™ñ5?úè%?lª?'V?ÐÞ>fîµ> lŒ>ÇC>OÚ=Ïè¯<Þp¾ïMn¾¨s¡¾Tʾc»ñ¾Y¯ ¿|¿—".¿Ñƒ=¿ƒK¿ X¿ˆõb¿ =l¿=Ës¿’y¿”†}¿@£¿ñÝ¿©:~¿u¼z¿Þiu¿ÔLn¿¡re¿ÎëZ¿ÌN¿ï)A¿ÿ2¿RÇ!¿oA¿^$û¾™%Ô¾†š«¾ãξƒ!.¾ï¿®½¢¦™7Ó®=ú*.>ˆÓ> Ÿ«>ø)Ô>(û>ú(?/É!?¹ 2?‚+A?pÍN? íZ?±se?µMn?ju?ñ¼z?ñ:~?Þ?£?®Š}?{‘y?‚Ês?PÊ>o¡>Án>_g>äÚ‚=ž5°¼h£Ú½}ÐC¾¾pŒ¾ãòµ¾#!Þ¾8X¿`¬¿Îê%¿Ió5¿à§D¿gÿQ¿*º]¿¹Ög¿1Bp¿×ìv¿8Ê{¿=Ñ~¿>ü¿ I¿÷¸|¿ÇPx¿¹r¿kj¿Çj`¿+U¿ H¿Ä9¿*¿f¿¹¿˜õç¾m(À¾Kô–¾ULY¾(¾HÌ/½v.=ò,>Ù^Y>Xý–>41À> þç>¿ ?2?œ*?RÇ9?ý!H?ËU?§]`?bj?Cr?îQx?¸¹|?gI?1ü?ÈÐ~?]É{?—ëv?Ž@p?¶Ôg?Ì·]?²üQ?S¹D?v6?2ç%?…¨?$T?šÞ>êµ>¢gŒ>å½C>¼}Ú=ž¯<´ƒ½z¾Wn¾Z;¡¾ÌXʾ¿ñ¾N± ¿è}¿M$.¿c…=¿o„K¿MX¿œöb¿ð=l¿óËs¿‰’y¿ç†}¿ª¡¿ÞÝ¿b:~¿ý»z¿4iu¿ùKn¿˜qe¿˜êZ¿¦ÊN¿f(A¿R2¿ƒÅ!¿?¿Xû¾Y!Ô¾ –«¾^ʾO.¾Q­®½ÌJb8¯å®=/4.> Ø>s£«>8.Ô>Ÿ,û>è*?0²!?f"2? -A?ÑÎN?CîZ?»te?Nn?7ku?j½z?7;~?Þ?ÿ¢?[Š}?˜y?ËÉs?7;l?Wób?X?%€K?¢€=?.?Ux?a« ? ³ñ>ÎKÊ>«j¡>ý·n>´Ü>?È‚=U€°¼üµÚ½©ÙC¾úgY>Η>‰5À>4è>»? ?Z*?íÈ9?r#H?U?Ç^`?Tj?žr?Rx?º|?“I?*ü?Ð~?ñÈ{?ùêv?À?p?¹Óg?¡¶]?\ûQ?Ô·D?Ñ6?Éý%?Ÿ¦?"R?eÞ>ªåµ>$cŒ>º´C>(kÚ=`S¯l¿ªÌs¿“y¿:‡}¿Ê¡¿ÑÞ¿:~¿„»z¿Šhu¿Kn¿pe¿béZ¿EÉN¿Þ&A¿¥2¿´Ã!¿“=¿þSû¾WWÔ¾¹‘«¾Ùž.¾´š®½#á»8Mø®=c=.>‘Ü>Ú§«>x2Ô>±0û>Ö,?´!? 2?“.A?1ÐN?xïZ?Äue?iOn?áku?ã½z?};~?,Þ?à¢?Š}?—y?×Òs?P:l?Bòb?AX?º~K?=?h.?}v?l© ?ë®ñ>ƒGÊ>è®n>wÓ>µƒ= ˰¼ÈÚ½ÔâC¾¹yŒ¾žûµ¾Ž)Þ¾=\¿.°¿\î%¿’ö5¿ÝªD¿ÅïQ¿¬]¿´Øg¿ÎCp¿îv¿Ë{¿°Ñ~¿Jü¿³H¿8¸|¿¥Ox¿5r¿‡j¿‡h`¿RU¿0H¿ÙÀ9¿“ *¿¨¿Â¿Díç¾ÄÀ¾]ë–¾:Y¾ ¾ž/½ c.=†À>ôX>E—>Ý9À>^è>·?ð!?*?‰Ê9?æ$H?b U?ç_`?Fj?`r?HKx?wº|?ÀI?$ü?UÐ~?…È{?\êv?ñ>p?»Òg?vµ]?úQ?V¶D?-6?ü%?ľ?P?/Þ>Láµ>¦^Œ>Ž«C>”XÚ=©¯<þ%ƒ½”Œ¾1in¾7D¡¾•&ʾQñ¾8µ ¿—¿¹'.¿‡ˆ=¿E‡K¿Î X¿Åøb¿½?l¿`Ís¿““y¿‡}¿ê¡¿¾Þ¿—=~¿ »z¿àgu¿EJn¿…oe¿,èZ¿åÇN¿U%A¿÷2¿äÁ!¿¥;¿ìOû¾SÔ¾žÉ«¾UÁ¾å.¾ˆ®½pN9ê ¯=˜F.>á>@¬«>¸6Ô>Ã4û>Ä.?ϵ!?Ä2?A?‘ÑN?®ðZ?Íve?DPn?‹lu?[¾z?Ã;~??Þ?À¢?µ‰}? —y?!Òs?½El?-ñb?X?P}K?~}=?±.?¦t?w§ ?ͪñ>9CÊ>Ía¡>Ò¥n>;Ê>n¢ƒ=­¼#ÛÚ½ÿëC¾7~Œ¾üÿµ¾Ã-Þ¾@^¿²¿#ð%¿7ø5¿\¬D¿ñQ¿ª­]¿Ìg¿œDp¿°îv¿|Ë{¿éÑ~¿Qü¿†H¿Ù·|¿Ox¿rr¿•j¿gg`¿U¿ž.H¿>¿9¿Õ*¿É¿Æ¿éç¾pÀ¾çæ–¾ò0Y¾\þ¾I\/½uˆ.=ÊÉ>%ýX>“Í–>1>À>ˆ è>³?Ï#?Ø*?$Ì9?[&H?® U?a`?8j?#r?ÙKx?»µ|?ìI?ü?Ð~?È{?¾év?#>p?¾Ñg?K´]?°øQ?×´D?‰6?:ú%?Þ¼?§i?ú Þ>ïܵ>(ZŒ>c¢C>FÚ=ò½®<£8ƒ½Ñ•¾Frn¾¦H¡¾à*ʾp“ñ¾\œ ¿nƒ¿o).¿Š=¿¯ˆK¿ X¿Úùb¿£@l¿Îs¿”y¿à‡}¿ ¢¿«Þ¿Q=~¿Áz¿5gu¿jIn¿|ne¿öæZ¿„ÆN¿Í#A¿J2¿À!¿·9¿ÚKû¾×NÔ¾8Å«¾¸ú¾±ü-¾yu®½O¬(9ˆ¯=ÌO.>šå>§°«>ù:Ô>Õ8û>²0?Ÿ·!?r2?£A?ÀN?äñZ?Öwe?Qn?5mu?Ô¾z? <~?RÞ? ¢?c‰}?†–y?kÑs?×Dl?æþb?¿ÿW?å{K?ì{=?û.?Îr?‚¥ ?¯¦ñ>î>Ê>_]¡>½œn>þÀ>Ƀ=·`­¼,ïÙ½+õC¾µ‚Œ¾Y¶¾ø1Þ¾B`¿û³¿ëñ%¿Ûù5¿Ú­D¿qòQ¿Õ®]¿Íg¿]:p¿Nïv¿èË{¿"Ò~¿Wü¿YH¿y·|¿‚Nx¿°r¿£j¿Hf`¿»U¿)-H¿¦Ó9¿*¿é¿Ê¿ðäç¾À¾pâ–¾Ñ'Y¾õ¾ô6/½Ê­.=Ó>FY> Ò–>3À>±è>¯?®%?—*?¿Í9?Ð'H?ù U?&b`?*j?år?kLx?¶|?µG?ü?âÏ~?­Ç{? év?T=p?ÀÐg? ³]?Z÷Q?X³D?äÿ5?sø%?÷º?¥g?nAÞ>‘ص>ªUŒ>7™C>m3Ú=:s®ê> µ«>9?Ô>ç<û> 2?n¹!? 2?+A?uÁN?ƒâZ?ßxe?øQn?ßmu?L¿z?O<~?eÞ?€¢?‰}?–y?´Ðs?ñCl?Òýb?ªX?zzK?Zz=?E.?÷p?£ ?‘¢ñ>¤:Ê>ðX¡>§“n>Á·>$}ƒ=o«­¼ÀÚ½²€C¾3‡Œ¾·¶¾.6Þ¾Eb¿âµ¿²ó%¿€û5¿Y¯D¿ÇóQ¿°]¿Îg¿,;p¿zçv¿TÌ{¿\Ò~¿]ü¿-H¿·|¿ðMx¿ír¿±j¿(e`¿pU¿µ+H¿ Ò9¿B*¿ ¿Îþ¿Æàç¾ÇÀ¾úÝ–¾°Y¾Õ뾟/½ Ó.=RÜ>hY>Ö–>‡ À>ÍÙç>«?'?V*?[Ï9?E)H?E U?Fc`?j?¨r?ýLx?z¶|?âG?hü?©Ï~?AÇ{?‚èv?†¶>,QŒ> C>Ù Ú=ƒ(®<î]ƒ½K¨¾r„n¾„Q¡¾u3ʾ¬›ñ¾F  ¿âm¿g.¿<=¿…‹K¿‘ X¿üb¿pBl¿ƒÏs¿#•y¿…ˆ}¿J¢¿…Þ¿Å<~¿Àz¿ünu¿fSn¿jle¿ŠäZ¿ÃÃN¿¼ A¿ï2¿v¼!¿Û5¿·Cû¾VFÔ¾k¼«¾¯ñ¾jh.¾OO¯½ hs9ÂB¯=5b.>¤î>t¹«>yCÔ>ø@û>Ž4?>»!?Í2?´A?ÖÂN?¹ãZ?·ke?ÓRn?‰nu?Å¿z?–<~?xÞ?`¢?½ˆ}?|•y?þÏs? Cl?½üb?iX?yŒK?Èx=?Ž.? o?˜¡ ?sžñ>Y6Ê>T¡>‘Šn>„®>jƒ=&ö­¼TÚ½Þ‰C¾%NŒ¾ ¶¾c:Þ¾Gd¿È·¿yõ%¿$ý5¿Ø°D¿õQ¿+±]¿Ïg¿ú;p¿èv¿øÆ{¿•Ò~¿dü¿H¿º¶|¿_Mx¿+r¿¿j¿d`¿$U¿@*H¿pÐ9¿ƒ*¿Ð(¿Òü¿œÜç¾rÀ¾ƒÙ–¾Y¾‘â¾Jì.½uø.=–å>‰Y>÷Ú–>ÜÀ>÷Ýç>wý?l)?*?öÐ9?¹*H?U?fd`?j?jr?ŽMx?Ù¶|?H?bü?‚Ò~?ÕÆ{?äçv?·;p?ÅÎg?ʰ]?®ôQ?[°D?›ü5?åô%?*·? c?9Þ>¨ ¶>:ŠŒ>à†C>FÚ=ËÝ­<“pƒ½‡±¾‡n¾óU¡¾¿7ʾʟñ¾;¢ ¿¹o¿.¿Ky=¿ïŒK¿ÑX¿ýb¿VCl¿9Ðs¿¨•y¿Øˆ}¿j¢¿rÞ¿<~¿¿z¿Rnu¿ŒRn¿‘ye¿TãZ¿cÂN¿4A¿A2¿§º!¿í3¿¥?û¾BÔ¾¸«¾+í¾5_.¾±<¯½:g¹`U¯=jk.>(ó>Ú½«>¹GÔ> Eû>|6? ½!?{2?2Ê>P¡>|n>H¥>ÚWƒ=Ý@®¼ç&Ú½ “C¾£RŒ¾ŸÕµ¾˜>Þ¾Jf¿¯¹¿@÷%¿Éþ5¿W²D¿söQ¿V²]¿Ðg¿Éª!Y>nß–>0À>!âç>sÿ?¦?Ó*?‘Ò9?.,H?ÜU?†e`?j?-r? Nx?9·|?;H?[ü?IÒ~?1Ì{?Fçv?è:p?ÇÍg?Ÿ¯]?WóQ?Ü®D?÷ú5?ó%?Cµ?a?Ï4Þ>K¶>¼…Œ>YûC>²ûÙ=“­<8ƒƒ½Äº¾–n¾bZ¡¾ <ʾè£ñ¾0¤ ¿‘q¿Ô.¿Ýz=¿ðzK¿X¿,þb¿­÷>A«>ùKÔ>Iû>j8?ܾ!?(2?Å"A?—ÅN?%æZ?Éme?×Hn?Ãfu?¶Àz?"=~?žÞ? ¢?ˆ}?r”y?‘Îs?>Al?”úb?ç X?¤‰K?(‹=?—*.?qk?® ?6–ñ>Ä-Ê>£K¡>fxn> œ>5Eƒ=•‹®¼{9Ú½4œC¾!WŒ¾ýÙµ¾ÍBÞ¾Lh¿–»¿ù%¿m6¿Õ³D¿É÷Q¿³]¿Ñg¿—=p¿Sév¿ÐÇ{¿õÏ~¿ü¿¦G¿ûµ|¿Ë*Y>åã–>…À>Læç>o?†?§*?,Ô9?£-H?'U?¦f`?òj?ïr?±Nx?˜·|?hH?Uü?Ò~?ÅË{?ïv?:p?ÉÌg?t®]?òQ?^­D?Rù5?Vñ%?]³?š_?™0Þ>í¶>>Œ>-òC>¨çÚ=]H­<Ý•ƒ½Ä¾³Ÿn¾Ð^¡¾T@ʾ¨ñ¾%¦ ¿hs¿Š.¿o|=¿[|K¿'X¿@ÿb¿"El¿¦Ñs¿²–y¿~‰}¿ª¢¿LÞ¿ó;~¿¬¾z¿þlu¿×Pn¿we¿ñZ¿ÒN¿#A¿æ2¿·!¿0¿7û¾–9Ô¾7¯«¾!ä¾ÌL.¾v¯½X~¹Š{®=±ÿ->1ü>§Æ«>9PÔ>.Mû>X:?¬À!?Ö2?M$A?÷ÆN?[çZ?Óne?±In?mgu?ººz?h=~?±Þ?¢?Ň}?í“y?ÛÍs?X@l?€ùb?§ X?9ˆK?–‰=?á(.?Ô‚?¹› ?’ñ>z)Ê>4G¡>Pon>Î’>2ƒ=LÖ®¼LÚ½`¥C¾Ÿ[Œ¾[Þµ¾Y Þ¾Oj¿|½¿Ïú%¿6¿TµD¿ùQ¿¬´]¿Òg¿f>p¿ñév¿<È{¿/Ð~¿ü¿ÞI¿œµ|¿ªKx¿ãr¿éj¿©``¿B U¿â%H¿žË9¿F*¿3#¿¿, è¾È<À¾Ì–¾+úX¾ÅƾJ|.½th/=a>ì3Y>[è–>ÙÀ>vêç>k?e?f *?Ä¿9?/H?sU?Åg`?äj?²r?BOx?ø·|?•H?Oü?ÖÑ~?YË{?}îv?YDp?ËËg?I­]?«ðQ?ß«D?®÷5?ï%?v±?˜]?d,Þ>þµ>À|Œ>éC>ÕÚ=iý°<‚¨ƒ½=;Ȩn¾?c¡¾ŸDʾ%¬ñ¾¨ ¿?u¿@.¿~=¿Æ}K¿hX¿ˆñb¿Fl¿\Òs¿6—y¿Ð‰}¿Ê¢¿8Þ¿¬;~¿4¾z¿Tlu¿ýOn¿vve¿IðZ¿ÑN¿›/A¿82¿8µ!¿#.¿o3û¾V5ԾѪ«¾ß¾˜C.¾Ù¯½ô@î¸(Ž®=æ.>ÎÂ> Ë«>yTÔ>@Qû>F<?{Â!?ƒ2?Õ%A?XÈN?‘èZ?Üoe?ŒJn?hu?3»z?í9~?ÄÞ?à¡?r‡}?h“y?%Ís?r?l?køb?f X?φK?ˆ=?*'.?ý€?•´ ?úñ>/%Ê>ÆB¡>;fn>‘‰>ëƒ=!¯¼£^Ú½‹®C¾`Œ¾¹âµ¾Þ¾ÇP¿c¿¿–ü%¿¶6¿Ò¶D¿uúQ¿×µ]¿Óg¿4?p¿êv¿¨È{¿hÐ~¿&ü¿±I¿Xº|¿Kx¿!r¿÷j¿‰_`¿öU¿m$H¿Ê9¿ˆ*¿T!¿¿è¾t8À¾Ð—¾ ñX¾½¾õV.½É/=¥ > =Y>Òì–>-!À> îç>g?D?% *?_Á9?™H?¾U?åh`?Öj?tr?ÔOx?W¸|?ÁH?Hü?Ñ~?íÊ{?ßív?ŠCp?aØg?¬]?UïQ?`ªD? ö5?Èí%?¯?•[?/(Þ>2úµ>CxŒ>×ßC>ÂÚ=²²°<®»‚½zÖ¾Þ±n¾®g¡¾éHʾC°ñ¾ª ¿w¿ö.¿“=¿1K¿©X¿œòb¿›:l¿Ós¿»—y¿#Š}¿ê¢¿%Þ¿f;~¿»½z¿ªku¿"On¿mue¿ïZ¿¾ÏN¿.A¿ˆ#2¿i³!¿5,¿]/û¾1Ô¾j¦«¾Û¾c:.¾;ò®½6…£¸Å ®=.>RÇ>(“«>¹XÔ>QUû>4>?KÄ!?02?^'A?¸ÉN?ÇéZ?åpe?fKn?Áhu?¬»z?3:~?ÑÝ?À¡?‡}?ã’y?nÌs?‹>l?W÷b?%X?d…K?r†=?t%.?&? ² ?HÂñ>ä Ê>W>¡>%]n>U€>E ƒ=»k¯¼6qÚ½··C¾›dŒ¾çµ¾ÄÞ¾ÊR¿=§¿]þ%¿Z6¿Q¸D¿ËûQ¿·]¿ Ôg¿@p¿-ëv¿É{¿¢Ð~¿,ü¿…I¿ø¹|¿PRx¿^r¿j¿i^`¿«U¿ø"H¿gÈ9¿É*¿u¿¿Øè¾4À¾Z—¾eY¾=´¾ 1.½³/=é>.FY>Iñ–>‚%À>Êòç>c?#?ä *?ûÂ9? H?KU?j`?Èj?6r?ePx?¶¸|?îH?Bü?dÑ~?Ê{?Bív?¼Bp?d×g?óº]?ÿíQ?â¨D?eô5?ì%?¨­?“Y?ù#Þ>Ôõµ>ÅsŒ>¬ÖC>î¯Ú=ûg°×Ë>—«>»"Ô>cYû>"@?Æ!?Þ2?æ(A?ËN?ýêZ?îqe?ALn?kiu?$¼z?y:~?äÝ?U£?̆}?^’y?¸Ës?¥=l?Böb?äX?ùƒK?à„=?¾#.?N}?«° ?*¾ñ>fWÊ>è9¡>Tn>w> ú‚=r¶¯¼ÊƒÚ½âÀC¾iŒ¾tëµ¾ùÞ¾ÌT¿$©¿Çç%¿ÿ6¿Ð¹D¿!ýQ¿-¸]¿ Õg¿Ñ@p¿Ëëv¿€É{¿ÛÐ~¿3ü¿XI¿™¹|¿¿Qx¿r¿j¿I]`¿_U¿ƒ!H¿ÌÆ9¿ *¿–¿ ¿®üç¾Ë/À¾ãû–¾ß[Y¾í)¾J .½sØ/=->OOY>¿õ–>Ö)À>ôöç>_ ??£*?–Ä9?‚H?—U?½[`?ºj?ùr?÷Px?¹|?I?<ü?*Ñ~?Ê{?¤ìv?íAp?fÖg?ȹ]?øþQ?c§D?Àò5?9ê%?«?W?ÄÞ>vñµ>GoŒ>€ÍC>ZÚ=C°<øà‚½bj¾ŽGn¾Œp¡¾~Qʾ¸ñ¾ú­ ¿Æz¿c!.¿·‚=¿‚K¿+X¿Æôb¿h\Ð>ö›«>ü&Ô>±%û>B?éÇ!?‹2?n*A?yÌN?3ìZ?÷re?Mn?ju?¼z?À:~?øÝ?6£?y†}?Ù‘y?Ës?¿SÊ>6r¡>ùJn>Ûm>ûç‚=*°¼]–Ú½ ÊC¾–mŒ¾Òïµ¾/Þ¾ÏV¿ «¿Žé%¿"ò5¿N»D¿wþQ¿X¹]¿Ög¿ Ap¿hìv¿ìÉ{¿Ñ~¿9ü¿+I¿:¹|¿-Qx¿Br¿j¿)\`¿U¿ H¿1Å9¿K*¿·¿ ¿„øç¾w+À¾m÷–¾¾RY¾© ¾~æ/½Èý/=q&>pXY>6ú–>*.À>ûç>[ ?â?b*?1Æ9?÷ H?âU?Ý\`?¸j?»r?ˆQx?u¹|?GI?5ü?ñÐ~?©É{?ìv?Ap?hÕg?¸]?¢ýQ?_ºD?ñ5?rè%?Û©?ŽU?Þ>íµ>ÉjŒ>UÄC>ÆŠÚ=ŒÒ¯<󂽞s¾¤Pn¾=8¡¾ÉUʾ¼ñ¾ï¯ ¿|¿#.¿I„=¿qƒK¿lX¿Úõb¿O=l¿sËs¿,’y¿­†}¿I£¿ìÝ¿”:~¿R¼z¿«iu¿“Ln¿Rre¿rëZ¿ËN¿z)A¿2¿ÈÆ!¿Ü@¿ëZû¾U$Ô¾7™«¾ŠÍ¾Å.¾cº®½¸ò7žØ®=¸-.>àÔ>\ «><+Ô>Ã)û>)?¹É!?9!2?÷+A?ÙÍN?iíZ?te?öMn?Àju?½z?;~? Þ?£?•Š}?S‘y?KÊs?Ø;l?ôb?cX?$K?¼=?R .? y?Á¬ ?îµñ>ÑNÊ>Èm¡>^¾n>žd>VÕ‚=áK°¼ñ¨Ú½9ÓC¾rŒ¾0ôµ¾d"Þ¾ÑX¿ñ¬¿Uë%¿Æó5¿R¨D¿ÍÿQ¿ƒº]¿×g¿nBp¿ív¿XÊ{¿NÑ~¿@ü¿ÿH¿Ú¸|¿œPx¿r¿#j¿qj`¿ÈU¿šH¿•Ã9¿Œ *¿×¿"¿Zôç¾"'À¾öò–¾IY¾e¾)Á/½•#.=´/>‘aY>¬þ–>2À>Gÿç>W ?Á?!*?ÍÇ9?l"H?.U?ý]`?ªj?r?Rx?Õ¹|?tI?/ü?·Ð~?=É{?hëv?Q@p?kÔg?r·]?LüQ?á¸D?ù6?«æ%?ô§?‹S?YÞ>»èµ>KfŒ>)»C>3xÚ=Õ‡¯l¿*Ìs¿±’y¿‡}¿´¡¿ØÝ¿N:~¿Ù»z¿iu¿¸Kn¿Iqe¿<êZ¿=ÊN¿ñ'A¿Ò2¿ùÄ!¿î>¿ÙVû¾SZԾД«¾ɾ‘.¾Æ§®½¾i‡8;ë®=í6.>eÙ>ä«>|/Ô>Õ-û>{+?º²!?æ"2?-A?:ÏN?ŸîZ? ue?ÐNn?jku?޽z?L;~?Þ?ö¢?BŠ}?í—y?•És?ò:l?ób?"X?¹K?*€=?›.?Èw?̪ ?ϱñ>†JÊ>Yi¡>Iµn>óÙ>±Â‚=˜–°¼…»Ú½dÜC¾’vŒ¾øµ¾™&Þ¾ÔZ¿Ø®¿í%¿kõ5¿Ð©D¿ÔîQ¿­»]¿Øg¿=Cp¿¤ív¿ÄÊ{¿‡Ñ~¿Fü¿ÒH¿{¸|¿ Px¿½r¿1j¿Qi`¿;U¿%H¿úÁ9¿Í *¿ø¿&¿0ðç¾Î"À¾€î–¾|@Y¾!¾Ô›/½êH.=º>²jY>#—>Ó6À>qè>S?  ?à*?hÉ9?á#H?zU?_`?œj?Ør?âJx?4º|? I?(ü?~Ð~?ÑÈ{?Êêv?‚?p?mÓg?H¶]?öúQ?b·D?T6?Aý%?¦?‰Q?$Þ>]äµ>ÍaŒ>þ±C>ŸeÚ==¯<烽†¾Ðbn¾A¡¾’#ʾmŒñ¾Ù³ ¿L€¿†&.¿m‡=¿F†K¿íX¿øb¿?l¿àÌs¿6“y¿S‡}¿Ô¡¿ÌÞ¿:~¿`»z¿Whu¿ÞJn¿?pe¿éZ¿ÜÈN¿i&A¿%2¿*Ã!¿=¿ÈRû¾VÔ¾µÌ«¾Ä¾\ .¾(•®½{%Ò8Ùý®=!@.>êÝ>)©«>¼3Ô>ç1û>i-?Š´!?— 2?/A?šÐN?ÕïZ?ve?ªOn?lu?¾z?’;~?1Þ?Ö¢?ð‰}?h—y?¡Òs? :l?ðñb?áX?N~K?˜~=?å.?ñu?ר ?±­ñ>êd¡>3¬n>·Ð>…¯ƒ=Pá°¼ÎÚ½åC¾{Œ¾ëüµ¾Ï*Þ¾Ö\¿¿°¿äî%¿÷5¿O«D¿+ðQ¿Ø¬]¿ÿØg¿ Dp¿Bîv¿0Ë{¿ÁÑ~¿Lü¿¥H¿¸|¿yOx¿ûr¿?j¿1h`¿ïU¿¤/H¿_À9¿ *¿¿*¿ìç¾zÀ¾ ê–¾[7Y¾Ý¾~v/½@n.=IÃ>¼öX>™—>';À>›è>O?"?ž*?Ë9?V%H?Å U?=``?Žj?šr?sKx?xµ|?ÍI?"ü?DÐ~?eÈ{?-êv?´>p?pÒg?µ]? ùQ?äµD?°6?zû%?3¾?†O?îÞ>ÿßµ>O]Œ>Ó¨C> SÚ=fò®<Œ+ƒ½U¾ækn¾ŠE¡¾Ü'ʾ‹ñ¾üš ¿#‚¿<(.¿ÿˆ=¿±‡K¿. X¿ùb¿@l¿—Ís¿»“y¿¦‡}¿ô¡¿¹Þ¿‚=~¿èºz¿­gu¿Jn¿6oe¿ÐçZ¿|ÇN¿á$A¿w2¿ZÁ!¿;¿¶Nû¾ÒQÔ¾OÈ«¾äý¾'.¾Š‚®½œp9v¯=VI.>nâ>­«>ý7Ô>ù5û>W/?Y¶!?D2?A?úÑN? ñZ?we?…Pn?¾lu?¾z?Ø;~?DÞ?¶¢?‰}?ä–y?êÑs?yEl?Ûðb? X?ä|K?}=?/.?t?⦠?“©ñ>ñAÊ>{`¡>£n>zÇ>àœƒ=C,­¼¬àÚ½»îC¾ŽŒ¾I¶¾/Þ¾Ù^¿¦²¿«ð%¿´ø5¿Î¬D¿ñQ¿®]¿jÌg¿ÙDp¿ßîv¿œË{¿úÑ~¿Sü¿yH¿¼·|¿èNx¿8r¿Mj¿g`¿¤U¿/.H¿ÇÔ9¿O*¿:¿.¿Üçç¾%À¾’å–¾:.Y¾šû¾)Q/½•“.=Ì>ÞÿX>èΖ>{?À>Å è>J?^$?]*?ŸÌ9?Ê&H? U?\a`?€j?]r?Lx?×µ|?•G?ü? Ð~?ùÇ{?év?å=p?rÑg?ò³]?JøQ?e´D? 6?³ù%?M¼?i?¹ Þ>¢Ûµ>ÑXŒ>§ŸC>x@Ú=¯§®<2>ƒ½’˜¾ûtn¾øI¡¾',ʾª”ñ¾ñœ ¿¿j¿ò).¿Š=¿‰K¿o X¿,úb¿è@l¿MÎs¿@”y¿ø‡}¿¢¿¦Þ¿<=~¿ãÀz¿gu¿)In¿-ne¿šæZ¿ÆN¿X#A¿Ê2¿‹¿!¿$9¿¤Jû¾’MÔ¾èë¾`ù¾òù-¾ío®½{Î39#¯=ŠR.>óæ>ö±«>=<Ô> :û>E1?)¸!?ò2?A?~ÀN?@òZ?%xe?_Qn?hmu?ø¾z?<~?XÞ?–¢?J‰}?_–y?4Ñs?“Dl?”þb?_ÿW?y{K?t{=?x.?Br?í¤ ?u¥ñ>§=Ê> \¡>šn>=¾>;Šƒ=úv­¼µôÙ½æ÷C¾ „Œ¾¦¶¾93Þ¾Û`¿Œ´¿rò%¿Yú5¿L®D¿×òQ¿/¯]¿gÍg¿›:p¿}ïv¿Ì{¿3Ò~¿Yü¿LH¿]·|¿VNx¿vr¿[j¿òe`¿XU¿º,H¿,Ó9¿{*¿[¿2¿²ãç¾ÑÀ¾á–¾%Y¾Vò¾Ô+/½ê¸.=ÑÕ>ÿY>_Ó–>}À>ïè>F?=&?*?:Î9??(H?\ U?|b`?rj?r?–Lx?7¶|?ÂG?lü?ÑÏ~?Ç{?ñèv?=p?tÐg?Dz]?ôöQ?æ²D?gÿ5?ì÷%?fº? g?-@Þ>D×µ>STŒ>|–C>ä-Ú=÷\®<×Pƒ½Î¡¾~n¾gN¡¾r0ʾȘñ¾æž ¿—l¿3.¿"Œ=¿†ŠK¿° X¿Aûb¿ÎAl¿Ïs¿Å”y¿Kˆ}¿4¢¿’Þ¿ö<~¿jÀz¿sou¿NHn¿$me¿dåZ¿»ÄN¿Ð!A¿2¿»½!¿67¿’Fû¾RIÔ¾‚¿«¾Ûô¾àn.¾O]®½Y,Y9±5¯=¿[.>xë>]¶«>}@Ô>>û>33?ø¹!? 2? A?ÞÁN?àâZ?.ye?9Rn?nu?p¿z?d<~?kÞ?v¢?÷ˆ}?Ú•y?~Ðs?¬Cl?ýb?JX?zK?ây=?Â.?kp?ø¢ ?W¡ñ>\9Ê>žW¡>òn>µ>–wƒ=²Á­¼IÚ½mƒC¾‰ˆŒ¾ ¶¾o7Þ¾Þb¿s¶¿:ô%¿ýû5¿Ë¯D¿-ôQ¿Z°]¿eÎg¿i;p¿©çv¿tÌ{¿mÒ~¿_ü¿H¿ý¶|¿ÅMx¿³r¿ij¿Òd`¿ U¿F+H¿‘Ñ9¿½*¿!*¿6þ¿ˆßç¾}À¾¥Ü–¾øY¾é¾/½?Þ.=ß> Y>Õ×–>Ò À> Ûç>B?(?Û*?ÕÏ9?´)H?¨ U?œc`?dj?âr?(Mx?–¶|?ïG?fü?ªÒ~? Ç{?Sèv?H¹¶>ÕOŒ>PC>PÚ=@®<|cƒ½ «¾'‡n¾ÖR¡¾¼4ʾæœñ¾Ü  ¿nn¿é.¿1x=¿ñ‹K¿ð X¿Uüb¿´Bl¿¹Ïs¿J•y¿žˆ}¿T¢¿Þ¿°<~¿ò¿z¿Énu¿%Sn¿le¿.äZ¿ZÃN¿G A¿o2¿ì»!¿H5¿€Bû¾EÔ¾»«¾Wð¾¬e.¾ÃI¯½8Š~9NH¯=ôd.>üï>ú«>½DÔ>/Bû>!5?È»!?M2?) A??ÃN?äZ?le?Sn?¼nu?é¿z?ª<~?~Þ?V¢?¥ˆ}?U•y?ÈÏs?ÆBl?küb? X? ŒK?Px=? .?“n?¡ ?9ñ>5Ê>/S¡>܇n>Ä«>ñdƒ=i ®¼ÝÚ½™ŒC¾|OŒ¾a¶¾¤;Þ¾ád¿Y¸¿ö%¿¢ý5¿J±D¿ƒõQ¿…±]¿cÏg¿8AY>LÜ–>&À>5ßç>þ?û)?š*?pÑ9?(+H?óU?¼d`?Vj?¤r?¹Mx?ö¶|?H?`ü?qÒ~?|Ì{?µçv?y;p?yÎg?q°]?HôQ?é¯D?ü5?]ô%?™¶?c?Ã7Þ>[ ¶>㈌>%„C>½Ú=ˆÇ­û¾Ò@Ô¾µ¶«¾Òë¾w\.¾%7¯½é\¹ìZ¯=(n.>ô>*¿«>ýHÔ>AFû>7?—½!?û2?±!A?ŸÄN?LåZ?me?=Hn?fou?aÀz?ð<~?‘Þ?7¢?Rˆ}?Дy?Ïs?àAl?Vûb?É X?¢ŠK?BŒ=?U.?¼l?Ÿ ?™ñ>Ç0Ê>ÀN¡>Ç~n>‡¢>LRƒ= W®¼p,ڽĕC¾úSŒ¾íÖµ¾Ù?Þ¾ãf¿@º¿È÷%¿Fÿ5¿É²D¿ÙöQ¿¯²]¿aÐg¿=p¿äèv¿„Ç{¿ÍÏ~¿lü¿ÆG¿>¶|¿¢Lx¿.r¿…j¿“b`¿v U¿\(H¿ZÎ9¿?*¿c&¿n¿Bè¾ÔÀ¾¸Ó–¾µ Y¾ŠÖ¾Õ».½é(/=œñ>b$Y>Âà–>zÀ>_ãç> ?5?X*? Ó9?,H?>U?Üe`?Hj?gr?KNx?U·|?IH?Zü?8Ò~?Ì{?Šïv?«:p?{Íg?F¯]?òòQ?j®D?yú5?–ò%?²´?a?Ž3Þ>þ¶>e„Œ>øC>)öÙ=Ñ|­<ƈƒ½…½¾R™n¾´[¡¾Q=ʾ#¥ñ¾Æ¤ ¿r¿V.¿U{=¿\{K¿FÿW¿~þb¿Dl¿&Ñs¿T–y¿D‰}¿”¢¿YÞ¿$<~¿¿z¿umu¿pQn¿9xe¿YòZ¿™ÀN¿6A¿2¿M¸!¿l1¿]:û¾’<Ô¾N²«¾Mç¾CS.¾ˆ$¯½ º6¹yn®=]w.>ù>ë>=MÔ>SJû>ý8?g¿!?¨2?9#A?ÆN?‚æZ?ne?In?õfu?ÙÀz?6=~?¤Þ?¢?ÿ‡}?J”y?[Îs?ú@l?Búb?ˆ X?8‰K?°Š=?*.?äj? ?ü”ñ>},Ê>QJ¡>±un>J™>§?ƒ=Ø¡®¼?Ú½ðžC¾wXŒ¾JÛµ¾e Þ¾åh¿'¼¿ù%¿ê6¿G´D¿/øQ¿Ú³]¿^Ñg¿Õ=p¿‚év¿ðÇ{¿Ð~¿ü¿™G¿ßµ|¿Lx¿lr¿“j¿sa`¿* U¿ç&H¿¿Ì9¿€*¿ƒ$¿r¿ è¾Ò?À¾AÏ–¾”Y¾F;€–.½?N/=àú>ƒ-Y>9å–>ÏÀ>‰çç>??,*?§Ô9?.H?ŠU?ûf`?:j?)r?ÜNx?µ·|?uH?Sü?ÿÑ~?¥Ë{?ìîv?éDp?~Ìg?®]?›ñQ?ì¬D?Õø5?Ïð%?̲?_?X/Þ> ¶>èŒ>rïC>âÚ=2­Šý>÷Ç«>}QÔ>dNû>ë:?6Á!?V2?Â$A?`ÇN?¸çZ?"oe?òIn? gu?Þºz?|=~?·Þ?÷¡?¬‡}?Å“y?¥Ís?@l?-ùb?G X?͇K?‰=?^(.?H‚?#› ?Þñ>2(Ê>âE¡>›ln>>-ƒ=쮼˜QÚ½¨C¾õ\Œ¾¨ßµ¾šÞ¾^O¿ ¾¿Vû%¿6¿ÆµD¿…ùQ¿µ]¿\Òg¿£>p¿ êv¿\È{¿@Ð~¿!ü¿ÐI¿µ|¿Kx¿©r¿¡j¿S``¿ß U¿s%H¿$Ë9¿Á*¿¤"¿v¿ïè¾~;À¾ó—¾s÷X¾Ä¾+q.½”s/=$>¤6Y>°é–>#À>³ëç>?ô?ë *?>À9?‡/H?ÕU?h`?,j?ër?nOx?¸|?¢H?Mü?ÅÑ~?9Ë{?Nîv?Dp?Ùg?ð¬]?EðQ?m«D?0÷5?ï%?å°?ÿ\?#+Þ>Býµ>j{Œ>GæC>ŒÏÚ=&ç°<®ƒ½þϾ}«n¾‘d¡¾æEʾ_­ñ¾°¨ ¿Ìu¿Ã.¿y~=¿2~K¿ÈX¿Úñb¿MFl¿’Òs¿^—y¿é‰}¿Ô¢¿3Þ¿˜;~¿¾z¿!lu¿»On¿'ve¿íïZ¿¶ÐN¿&/A¿¸ 2¿®´!¿-¿92û¾4Ô¾©«¾DÞ¾Ù@.¾Mÿ®½sonic-visualiser-3.0.3/svcore/data/fileio/test/audio/wav/44100-2-16.wav0000644000000000000000000126111413111512442023252 0ustar 00000000000000RIFFDbWAVEfmt D¬±data bî )ÇRx |ë*¥5ÎÏ>÷H ÞPJ Ys ’`œ dgÅ tmî ¸r&wAµzj^}“½îæÐÃ~8É|aæy‹v´{qÝlÁe/Á^YW‚ »N«!ÔEÔ"j<ý#2'%U(P&Ðy'¢(3Ë)Dýõ*Yò,ˆçG-åÜp.ƒÒ™/wÈÃ0Ò¾ì1§µ3­>4¥g5¨‘6—º7'‘ã8Œ :á‡6;‹„_<‚ˆ=˜€±>€Ú?]€A¥-BÚƒVCö†DõЍEÏÒF{•ûGî›$I£MJ÷ªvKr³ L{¼ÉMÆòNøÏPFÚDQÚänR¢ï—SˆúÀTxéU^W&]NH4MÞP L YâJ’`¹IdgHtmfG¸r=F&wEµzëC^}ÁB˜Aîo@ÐF?Ã~>É|ó<æyÊ;v¡:{qx9lO8Áe%7Á^ü5WÓ4»Nª3ÔE€2jHÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕˆß9êõî Çx ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRYJ.A‰7|-#x§ ¼Í÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕˆß9êõî Çw ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõî Çx ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõî Çw ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦!¯æ·1ÁñÊÕˆß9êõî Çx ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ¼Í÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕˆß9êõî Çx ë*5Ï>HßP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ¼Í÷ìì0â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõî Çw ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦!¯æ·1ÁñÊÕˆß9êõî Çx ë*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð4DýYò‰çåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^%º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRYJ.A‰7|-#w§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³|¼Æ÷ÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõî Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º% 0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷íì0â«×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·0ÁñÊÕ‰ß9êõî Çx ë*5Ï>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<2U(Ð4DýYò‰çåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^%º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³|¼Æ÷ÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõî Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<2U(Ð3DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º% 0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷íì0â«×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·1ÁñÊÕˆß9êõî Çx ë*5Ï>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<Ž2U(Ð4DýYò‰çåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^%º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³|¼Æ÷ÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷ìì0â«×qÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõî Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<2U(Ð3DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ïˆúx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7}-#x§ ¼Í÷íì0â«×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·1ÁñÊÕˆß9êõî Çx ë*5Ï>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<Ž2U(Ð4DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^%º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2U(Ð3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ï‡úx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Ì÷ìì0â«×rÍ–Ã,ºE±ñ¨@¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·0ÁñÊÕ‰ß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð4DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†öŠÏ{•훣÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^&º%0ü9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgum¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÔEj<2U(Ð4DýYòˆçåÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx_&º%0ü9„CL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2V(Ð3DýZòˆçå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³|¼Æ÷ÏEÚÛä¢ïˆúx^&»%0ý9„CŽL Uä\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7}-#w§ ¼Í÷íì/â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦!¯æ·1ÁñÊÕˆß9êõî Çx ì*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEi<2U(Ñ3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªq³|¼ÆøÏFÚÚä¢ïˆúx^%»% 0ý9…CŽL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZùRYJ.A‰7}-#x¦ ¼Í÷íì0âª×qÍ–Ã-ºE±ð¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸô¦!¯å·1ÁñÊÕˆß9êõî Çw ì*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<Ž2U(Ñ3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªq³{¼ÆøÏFÚÚä¡ïˆúx^%º% 0ý9…CŽL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZùRYJ.A‰7|-#x§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’œ˜nŸõ¦!¯å·1ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<Ž2U(Ð4CýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ï‡úx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Ì÷ìì0â«×rÍ–Ã,ºE±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·0ÁñÊÕ‰ß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð4DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†öŠÏ{•훣÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^&º%0ü9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgum¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÔEj<2U(Ð4DýZòˆçåÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx_&º%0ü9„CL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2V(Ð3DýZòˆçå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³|¼Æ÷ÏEÚÛä¢ïˆúx^&»%0ý9„CŽL Uä\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7}-#w¦ ¼Í÷íì/â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦!¯æ·1ÁñÊÕˆß9êõî Çx ì*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEi<2U(Ñ3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªq³|¼ÆøÏFÚÚä¢ïˆúx^%»% 0ý9…CŽLUå\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZùRYJ-A‰7}-#x¦ ¼Í÷íì0âª×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯å·1ÁñÊÕˆß9êõî Çw ì*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<Ž2U(Ñ3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªq³{¼ÆøÏFÚÚä¡ïˆúx^%º% 0ý9…CŽL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZùRYJ.A‰7|-#x§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’œ˜nŸõ¦!¯å·0ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<Ž2U(Ð4CýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ï‡úx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Ì÷ìì0â«×rÍ–Ã,ºE±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·0ÁñÊÕ‰ß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð4DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†öŠÏ{•훣÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^&º%0ü9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgum¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÔEj<2U(Ð4DýZòˆçåÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx^&º%0ü9„CL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEj<2V(Ð3DýZòˆçå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³|¼Æ÷ÏEÚÛä¢ïˆúx^&»%0ý9„CŽL Uä\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7}-#w¦ ¼Í÷íì/â«×qÍ—Ã-ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦!¯æ·1ÁñÊÕˆß9êõî Çx ì*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÓEi<2U(Ñ3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªq³|¼ÆøÏFÚÚä¢ïˆúx^%»% 0ý9…CŽLUå\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZùRYJ-A‰7}-#x¦ ¼Í÷ìì0âª×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯å·1ÁñÊÕˆß9êõî Çw ì*5Ï>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEi<Ž2U(Ñ3DýYòˆçå܃ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªq³{¼ÆøÏFÚÚä¡ïˆúx^%º% 0ý9…CŽL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZùRYJ.A‰7|-#x§ ¼Ì÷ìì0â«×qÍ–Ã,ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’œ˜nŸõ¦!¯å·0ÁñÊÕˆß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^W»NÔEj<Ž2U(Ð4CýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•÷ªr³{¼ÆøÏFÚÚä¢ï‡úx^&º%0ý9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Ì÷ìì0â«×rÍ–Ã,ºE±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯æ·0ÁòÊÕ‰ß9êõî Çw ë*5Ð>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð4DýYòˆçåÜ„ÒwÈÒ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†öŠÏ{•훣÷ªr³{¼ÆøÏFÚÛä¢ïˆúx^&º%0ü9…CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZøRYJ.A‰7|-#x§ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸõ¦"¯æ·1ÁñÊÕ‰ß9êõí Çx ë*5Ï>HßP Y’`dgum¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÔEj<2U(Ð3DýZòˆçåÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx^&º%0ü9„CL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Ì÷íì/â¬×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõî Æx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv|qlÀeÁ^W»NÓEj<2U(Ñ4DýYò‰çåÜ„ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•øªq³|¼Æ÷ÏFÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d…j0p u y&|[~£ýhä}t{xèsÙnûhWbýZøRYJ.Aˆ7}-#x¦ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁòÊÕ‰ß8êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEi<Ž2U(Ð3EýYòˆçæÜƒÒxÈÒ¾§µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÐ{•÷ªr³{¼ÆùÏFÚÛä¡ïˆúw^&º% 0ü9…CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Î÷ìì/â«×qÍ—Ã-ºD±ñ¨?¡@šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÓEj<Ž2T(Ð4DýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªq³|¼ÆøÏGÚÚä¢ï‡úx]%»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Æw ì*5Ð>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|çyv{qlÁeÁ^WºNÔEi<2U(Ï3DýYò‡çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúw^'º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·0ÁòÊÕ‰ß:êõí Çx ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÓEj<Ž2V(Ð4CýZòˆçäÜ„ÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏ{•훣÷ªr³|¼ÆøÏEÚÛä£ïˆúy^&»%0ý9„CŽLUä\d…j1p u y'|[~£ýhä}u{xésÙnúhXbýZùRYJ-A‰7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ò¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Æx ì*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv|qlÁeÁ^W¼NÔEi<2U(Ñ2DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œâ‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªq³{¼Æ÷ÏFÚÚä¢ï‰úx_%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbþZøRYJ.Aˆ7}-#x§ »Í÷ìì0â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁòÊÕ‰ß8êõí Çw ë*5Ï>HÞP Y“`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð3CýZòˆçæÜƒÒvÈÒ¾§µ­¥¨—'‘Œá‡Œ„‚˜€€]€¥Úƒ÷†õŠÏz•÷ªr³{¼ÆøÏEÚÛä¡ïˆúy^&º%0þ9„CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Ì÷íì/â¬×qÍ–Ã-ºE±ñ¨?¡>šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõï Çx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÂeÁ^W»NÓEj<2T(Ñ4DýXò‰çåÜ„ÒwÈѾ¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªq³|¼ÆøÏGÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d†j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7}-#x¦ ½Í÷ëì0âª×rÍ–Ã,ºE±ð¨@¡?šü“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|çyv{qlÁeÁ^WºNÔEi<2U(Ð3EýYò‡çå܃ÒxÈÒ¾§µ­¥©—&‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¡ïˆúw^&º% 0ü9…CL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZùRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã,ºD±ñ¨?¡?šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸô¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgum¹r&wµz^}îÐÃ~Ê|æy v{qlÁeÁ^W»NÓEj<Ž2V(Ð4CýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•훣öªr³|¼ÆøÏEÚÚä£ï‡úx]&»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xésÙnúhXbýZùRYJ-AŠ7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žà‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Æw ì*5Ð>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv|qlÁeÁ^W¼NÔEi<2U(Ñ3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªq³{¼Æ÷ÏFÚÚä¢ï‰úx_%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbþZøRYJ.Aˆ7}-#y§ »Í÷ìì1â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯å·1ÁòÊÕ‰ß8êõí Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2V(Ð3CýZòˆçæÜ„ÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏ{•÷ªr³{¼ÆøÏEÚÛä¡ïˆúy^&¹%0ý9„CLUä\d…j1p u y'|[~£ýhä}u{xésÙnúhXbýZùRXJ/A‰7|-#w¨ ¼Ì÷íì/â¬×qÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõî Æx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv|qlÀeÁ^W»NÓEj<2U(Ñ4DýYò‰çåÜ„ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•øªq³|¼Æ÷ÏFÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d…j0p u y&|[~£ýhä}t{xèsÙnûhWbýZøRYJ.AŠ7}-#x¦ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁðÊÕ‰ß8êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEi<Ž2U(Ð3EýYòˆçæÜƒÒxÈÒ¾§µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÐ{•÷ªr³{¼ÆùÏFÚÛä¡ïˆúw^&º% 0ü9…CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Î÷ìì/â«×qÍ—Ã-ºD±ñ¨?¡@šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÓEj<Ž2T(Ð4DýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªq³|¼ÆøÏGÚÚä¢ï‡úx]%»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Æw ì*5Ð>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^WºNÔEi<2U(Ï3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx^%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·0ÁòÊÕ‰ß:êõí Çx ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÓEj<Ž2V(Ð4CýZòˆçäÜ„ÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏ{•훣÷ªr³|¼ÆøÏEÚÛä£ïˆúy^&»%0ý9„CŽLUä\d…j1p u y'|[~£ýhä}u{xésÙnúhXbýZùRYJ-A‰7|-#x¦ ¼Ì÷íì0âª×rÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Æx ì*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv|qlÁeÁ^W¼NÔEi<2U(Ñ2DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œâ‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªq³{¼Æ÷ÏFÚÚä¢ï‰úx_%º% 0ü9…CŽL Uä\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbþZøRYJ.Aˆ7}-#x§ »Í÷ìì0â«×qÍ—Ã,ºF±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁòÊÕ‰ß8êõí Çw ë*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð3CýZòˆçæÜƒÒvÈÒ¾§µ­¥¨—'‘Œá‡Œ„‚˜€€]€¥Úƒ÷†õŠÏz•÷ªr³{¼ÆøÏEÚÛä¡ïˆúy^&º%0þ9„CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Ì÷íì/â¬×qÍ–Ã-ºE±ñ¨?¡>šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõï Çx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÂeÁ^W»NÓEj<2T(Ñ4DýXò‰çåÜ„ÒwÈѾ¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªq³|¼ÆøÏGÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d†j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7}-#x¦ ½Í÷ëì0âª×rÍ–Ã,ºE±ð¨@¡?šü“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|çyv{qlÁeÁ^WºNÔEi<2U(Ð3EýYò‡çå܃ÒxÈÒ¾§µ­¥©—&‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¡ïˆúw^&º% 0ü9…CL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZùRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã,ºD±ñ¨?¡?šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸô¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgum¹r&wµz^}îÐÃ~Ê|æy v{qlÁeÀ^W»NÓEj<Ž2V(Ð4CýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•훣öªr³|¼ÆøÏEÚÚä£ï‡úy]&»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xésÙnúhXbýZùRYJ-AŠ7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žà‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Æw ì*5Ð>HßP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv|qlÁeÁ^W¼NÔEi<2U(Ñ3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªq³{¼Æ÷ÏFÚÚä¢ï‰úx_%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýgä}u{xèsÚnûhWbþZøRYJ.Aˆ7}-#y§ »Í÷ìì1â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜oŸô¦"¯å·1ÁòÊÕ‰ß8êõí Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2V(Ð3CýZòˆçæÜ„ÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏ{•÷ªr³{¼ÆøÏEÚÛä¡ïˆúy^&¹%0ý9„CLUä\d…j1p u y'|[~£ýhä}u{xésÙnúhXbýZùRXJ/A‰7|-#w¨ ¼Ì÷íì/â¬×qÍ–Ã-ºE±ñ¨?¡>šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõî Æx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÀeÁ^W»NÓEj<2U(Ñ4DýYò‰çåÜ„ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•øªq³|¼Æ÷ÏFÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d†j1p u y&|[~£ýhä}t{xèsÙnúhWbýZøRYJ.AŠ7}-#x¦ ½Í÷ìì0â«×rÍ—Ã,ºE±ñ¨@¡?šü“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEi<2U(Ð3EýYòˆçæÜƒÒxÈÒ¾§µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¡ïˆúw^&º% 0ü9…CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Î÷ìì/â«×qÍ—Ã-ºD±ñ¨?¡@šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÓEj<Ž2T(Ð4DýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªr³|¼ÆøÏGÚÚä¢ï‡úx]%»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Æw ì*5Ð>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^WºNÔEi<2U(Ï3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx^%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì1â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·0ÁòÊÕ‰ß:êõí Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÓEj<Ž2V(Ð4CýZòˆçäÜ„ÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏ{•÷ªr³|¼ÆøÏEÚÛä£ïˆúy^&»%0ý9„CŽLUä\d…j1p u y'|[~£ýhä}u{xésÙnúhXbýZùRYJ-A‰7|-#x¦ ¼Ì÷íì0âª×rÍ–Ã-ºE±ñ¨?¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Æx ì*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv|qlÁeÁ^W¼NÓEi<2U(Ñ2DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œâ‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªq³{¼Æ÷ÏFÚÚä¢ï‰úx_%º% 0ý9…CŽL Uä\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZøRYJ.Aˆ7}-#x§ »Í÷ìì0â«×pÍ—Ã,ºE±ñ¨@¡?šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁòÊÕ‰ß8êõí Çw ë*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEj<Ž2U(Ð3CýZòˆçæÜƒÒvÈÒ¾§µ­¥©—'‘Œá‡Œ„‚˜€€]€¥Úƒ÷†õŠÏz•÷ªr³{¼ÆøÏEÚÛä¡ïˆúy^&º% 0þ9„CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7|-#w§ ¼Ì÷íì/â«×qÍ–Ã-ºE±ñ¨?¡>šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõï Çx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÂeÁ^W»NÓEj<2T(Ñ4DýXò‰çåÜ„ÒwÈѾ¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªq³|¼ÆøÏGÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d†j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7}-#x¦ ½Í÷ëì0âª×rÍ–Ã,ºE±ð¨@¡?šü“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&wµz^}îÐÃ~É|çyv{qlÁeÁ^WºNÔEi<2U(Ï3EýYò‡çå܃ÒxÈÒ¾§µ­¥©—&‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¡ïˆúw^&º% 0ü9…CL Uå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbþZùRXJ.A‰7}-#w§ ¼Í÷ìì/â«×qÍ—Ã,ºD±ñ¨?¡?šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸô¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgum¹r&wµz^}îÐÃ~Ê|æy v{qlÁeÀ^W»NÓEj<Ž2V(Ð4CýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÏ{•훣öªr³|¼ÆøÏEÚÚä£ï‡úy]&»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xésÙnúhXbýZùRYJ-A‰7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žà‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’˜nŸõ¦!¯æ·1ÁñÊÕˆß9êõî Æx ì*5Ð>HßP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv|qlÁeÁ^W¼NÔEi<2U(Ñ3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•÷ªq³{¼Æ÷ÏFÚÚä¢ï‰úx_%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýgä}u{xèsÚnûhWbþZøRYJ.Aˆ7}-#y§ »Í÷ìì1â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜oŸô¦"¯å·1ÁòÊÕ‰ß8êõí Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÔEj<Ž2V(Ð3CýZòˆçæÜƒÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏz•÷ªr³{¼ÆøÏEÚÛä¡ïˆúy^&¹%0ý9„CLUä\d…j1p u y'|[~£ýhä}u{xésÙnûhXbýZùRXJ/A‰7|-#w¨ ¼Ì÷íì/â¬×qÍ–Ã-ºE±ñ¨?¡>šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆGŒ’˜nŸõ¦!¯æ·0ÁñÊÕˆß9êõî Æx ë*5Ð>HßP Y’`dgtm¹r&wµz^}îÐÃ~É|æyv{qlÀeÁ^W»NÓEj<2U(Ñ4DýYò‰çåÜ„ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÏ{•øªq³|¼Æ÷ÏFÚÚä¢ï‡úx_%»%0ý9…CŽL Uä\d†j1p u y&|[~£ýhä}t{xèsÙnúhWbýZøRYJ.AŠ7}-#x¦ ½Í÷ìì0â«×rÍ–Ã,ºE±ð¨@¡?šü“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆH‹’œ˜oŸô¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Èw ì*5Ï>HÞP Y‘`dgum¸r&w´z^}îÐÃ~É|æyv{qlÁeÀ^W»NÔEi<2U(Ð3EýYòˆçæÜƒÒxÈÒ¾§µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¡ïˆúw^&º% 0ü9…CLUå\d…j1p u y&|[~£ýhä}u{xèsÙnûhXbýZùRXJ.A‰7}-#w§ ¼Î÷ìì/â«×qÍ—Ã-ºD±ñ¨?¡?šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜nŸõ¦!¯æ·0ÁñÊÕˆß:êõí Çx ë*5Ï>HßP Y’`cgtm¹r&wµz^}îÐÃ~Ê|æyv{qlÁeÁ^W»NÓEj<Ž2V(Ð4DýZòˆçäÜ„ÒwÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Ùƒö†öŠÏ{•훣øªr³|¼ÆøÏGÚÚä¢ï‡úx]%»%0ý9„CŽL Uä\d…j1p u y&|[~£ýhä}u{xèsÙnúhXbýZøRYJ-AŠ7|-#x¦ ½Ì÷íì0âª×rÍ–Ã-ºE±ð¨@¡?šý“…Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’œ˜nŸõ¦"¯å·1ÁðÊÕ‰ß9êõÿÿî Æw ì*5Ð>HÞP Y’`dgtm¸r&wµz^}îÐÃ~É|æyv{qlÁeÁ^WºNÔEi<2U(Ï3DýYò‰çå܃ÒwÈÒ¾¨µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•÷ªr³{¼Æ÷ÏFÚÛä¢ïˆúx^%º% 0ü9…CŽL Uå\d…j0p u y&|[~£ýhä}u{xèsÙnûhXbþZøRXJ.A‰7}-#w§ ¼Í÷ìì1â«×qÍ—Ã,ºF±ñ¨?¡?šý“…Žá‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜nŸô¦"¯æ·0ÁòÊÕ‰ß:êõí Çw ë*5Ï>HÞP Y’`dgum¸r&wµz^}îÐÃ~Ê|æyv{qlÁeÀ^W»NÓEj<Ž2V(Ð4CýZòˆçæÜ„ÒvÈÓ¾§µ­¥¨—'‘Œá‡‹„‚˜€€]€¥Úƒ÷†õŠÏ{•÷ªr³|¼ÆøÏEÚÛä£ïˆúw`&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZøRYJ/Aˆ7|-#z¦ ¼Î÷ëì0â¬×pÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸó¦#¯æ·0ÁóÊÕˆß7êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÀeÁ^WºNÓEk<2U(Ñ2Dý[ò‡çåÜ„ÒuÈÒ¾¨µ ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³{¼ÆùÏFÚÚä ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÙnühWbýZúRXJ.AŠ7{-#x© »Í÷îì.â«×rÍ•Ã,ºE±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Æy ë*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÀeÀ^W¼NÓEj<2T(Ð5CýZòŠçä܃ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÏz•÷ªp³|¼Æ÷ÏGÚÛä¡ï†úy^$¼% 0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZùRZJ-A‰7~-#w§ ¾Ì÷íì1âª×qÍ—Ã+ºE±ñ¨A¡>šý“…Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜oŸõ¦!¯ä·2ÁñÊÕŠß:êõþÿï Çv í*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy vzqlÂe¿^W»NÕEh<2V(Ï4FýXò‰ççÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbüZøRYJ/Aˆ7}-#v¦ ½Ï÷ëì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸö¦"¯å·/ÁòÊÕ‡ß;êõÿÿì Èw ê*5Ï>HàP Y‘`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<Ž2U(Ñ3Eý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥©—&‘Œâ‡‹„‚™€€]€¥Ùƒ÷†õŠÏ|•ùªr³{¼ÆùÏFÚÙä£ïˆúw\&º%0þ9…CL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZ÷RXJ.A‹7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ð¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’˜nŸô¦#¯æ·0ÁðÊÕˆß8êõí Åx ë*5Ð>HÞP Y’`cgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¹NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€]€¥Úƒö†öŠÏz•÷ªs³|¼ÆöÏGÚÚä¡ï‰úy]$»%0û9†CŽLUæ\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-A‰7~-#x¨ »Ì÷íì2âª×r͘Ã+ºE±ò¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆH‹’›˜oŸõ¦!¯ç·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çç܃ÒwÈÔ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÜä¢ï‡úz_%¸% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésÙnûhYbüZøRYJ,Aˆ7}-#w§ ½Ë÷ìì1â­×qÍ—Ã.ºD±ñ¨@¡>šý“…Žâ‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw é*5Ï>HßP Y‘`egum¸r%wµz^}îÐÃ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò3EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÎ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZ÷RXJ/A‡7|-#y¦ ¼Î÷ëì/â¬×pÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁóÊÕˆß7êõì Èx ë*5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2U(Ñ2Dý[ò‡çåÜ„ÒuÈÒ¾¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆùÏFÚÚä ï‰úx]'»%0þ9…CŽLUå\d„j1p u y&|[~£ýgä}u{xèsÙnühWbýZúRWJ.AŠ7{-#x¨ »Í÷îì.â«×rÍ•Ã,ºE±ò¨?¡?šþ“„Žá‰†7ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2S(Ð5CýYòŠçä܃ÒxÈѾ§µ­¥§—(‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏHÚÛä¡ï†úy^$¼% 0ü9†CL Uã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbýZùRZJ-A‰7}-#w§ ¾Ì÷ìì1â©×qÍ—Ã+ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯å·2ÁñÊÕŠß:êõþÿï Çv í*5Ï>HßP Y‘`egtm¸r'wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<Ž2V(Ï4FýXòˆçæÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•훣øªr³z¼ÆøÏEÚÜä¢ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~£ýhä}t{xésØnúhXbÿZøRYJ/Aˆ7|-#v¦ ½Î÷ëì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸó¦"¯å·/ÁòÊÕˆß;êõÿÿì Èw ê*5Ð>HàP Y’`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†õŠÏ|•öªr³{¼ÆùÏFÚÙä¤ïˆúx\'º%0þ9…CŽL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZúRXJ.AŠ7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ï¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’˜nŸô¦ ¯æ·0ÁðÊÕ‰ß8êõí Åx ë*5Ñ>HÞP Y’`dgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¼NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€]€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÛä¡ïŠúy^$»%0û9†CŽLUæ\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRZJ-A‰7~-#x¨ ºÌ÷íì1âª×r͘Ã+ºE±ñ¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆHŒ’›˜oŸõ¦!¯ä·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÕEi<2W(Ï4BýYò‰çç܃ÒwÈÓ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼Æ÷ÏDÚÜä¢ï‡úz_%¹% 0ý9ƒCL Uä\d…j0p u y&|[~£ýhã}u{xésØnûhYbüZøRYJ/Aˆ7}-#v§ ½Ë÷ìì0â­×pÍ—Ã.ºD±ñ¨@¡>šý“…Žâ‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·/ÁòÊÕ‡ß:êõÿÿï Èw ê*5Ï>HàP Y‘`egum¸r%wµz^}îÐÃ~É|æyv|qlÁeÁ^W»NÔEk<Ž2U(Ò3EýXòˆçæÜ…ÒvÈÒ¾¨µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÏ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&º%0þ9„CL Uå\d†j1p u y'|[~£ýhä}t{xèsÚnúhXbþZ÷RXJ.A‹7|-#y¥ ¼Î÷ëì/â«×sÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁïÊÕˆß8êõí Éx ë* 5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2T(Ñ2DýZò‡çåÜ„ÒyÈѾ¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆöÏGÚÚä ï‰úx]'»%0û9…CŽLUå\d…j2p u y&|[~£ýgä}u{xèsÙnühWbýZùRWJ-AŠ7~-#x¨ »Í÷íì.âª×r͘Ã,ºE±ò¨>¡?šý“„Žá‰†7ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸõ¦!¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Î>HÞP Y“`dgtm¹r&wµz^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2W(Ï5CýYò‰çã܃ÒxÈÔ¾§µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÛä¡ï†úy^$¼% 0ü9ƒCL Uã\d…j0p u y&|[~£ýhä}u{xçsÙnûhYbüZùRZJ,A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯å·2ÁñÊÕ‡ß:êõþÿï Çv í*5Ï>HßP Y‘`egum¸r'wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<Ž2V(Î4EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•훣øªr³z¼ÆøÏEÚÜä£ï‡úw_&¹% 0ý9„CL Uä\d†j1p u y&|[~£ýhä}t{xésØnúhXbþZøRYJ/Aˆ7|-#v¦ ½Î÷ëì0â¬×pÍ–Ã-ºG±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG’˜nŸó¦"¯æ·0ÁòÊÕˆß;êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒuÈÒ¾¨µ ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†öŠÏ|•öªs³{¼ÆùÏFÚÚä¤ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÚnúhWbþZúRXJ.AŠ7{-#y¥ »Í÷îì/â«×rÍ•Ã,ºF±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Åy ë*5Ñ>HÞP Y’`dgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¼NÓEj<2T(Ð1CýZòŠçä܃ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÛä¡ïŠúy^$»%0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZùRZJ-A‰7~-#w¨ ºÌ÷íì1âª×qÍ—Ã+ºE±ñ¨A¡>šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜oŸõ¦!¯ä·2ÁñÊÕŠß9êõî Çv ì*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy v{qlÂe¿^W»NÕEi<2V(Ï4BýYò‰ççÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úz_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbüZøRYJ/Aˆ7}-#v¦ ½Ë÷ìì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·/ÁòÊÕ‡ß;êõÿÿð Èw ê*5Ï>HàP Y‘`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<Ž2U(Ò3EýWòˆçæÜ…ÒvÈÒ¾¨µ­¥©—'‘Œâ‡‹„‚™€€]€¥Ùƒ÷†õŠÏ|•ùªr³{¼ÆùÏFÚÙä£ïˆúw`&º%0þ9…CL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZ÷RXJ.A‹7|-#y¥ ¼Î÷êì/â«×sÍ•Ã,ºF±ð¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’˜nŸô¦#¯æ·0ÁïÊÕˆß8êõí Éx ë* 5Ð>HÞP Y’`cgsm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÁ^WºNÓEj<2T(Ð2DýZò†çäÜ„ÒxÈѾ§µ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†öŠÏz•öªs³|¼ÆöÏGÚÚä¡ï‰úx]'»%0û9†CŽLUå\d…j2p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-AŠ7~-#x¨ »Ì÷íì.âª×r͘Ã,ºE±ò¨>¡?šý“„Žá‰†7ƒ<0€€ã€¢‚K…ÙˆH‹’›˜oŸõ¦!¯ç·1ÁñÊÕ‰ß9êõî Æy ì*5Î>HÞP Y“`dgtm¹r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çã܃ÒwÈÔ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÛä¢ï†úz^%¼% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésÙnûhYbüZøRZJ,A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw í*5Ï>HßP Y‘`egum¸r'wµz^}îÐÄ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò4EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒ÷†õŠÎ{•øªr³z¼ÆøÏEÚÙä£ïˆúw`&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZøRYJ/Aˆ7|-#y¦ ¼Î÷ëì0â¬×pÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸó¦#¯æ·0ÁóÊÕˆß7êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÀeÁ^WºNÓEk<2U(Ñ2Dý[ò‡çåÜ„ÒuÈÒ¾¨µ ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³{¼ÆùÏFÚÚä ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÙnühWbýZúRXJ.AŠ7{-#x© »Í÷îì.â«×rÍ•Ã,ºE±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Æy ì*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2T(Ð5CýZòŠçä܃ÒxÈѾ§µ­¥§—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÐ{•웣÷ªp³|¼Æ÷ÏGÚÛä¡ï†úy^$¼% 0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbýZùRZJ-A‰7~-#w§ ¾Ì÷íì1âª×qÍ—Ã+ºE±ñ¨A¡>šý“…Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯ä·2ÁñÊÕŠß:êõþÿï Çv í*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<2V(Ï4FýXò‰çæÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbüZøRYJ/Aˆ7|-#v¦ ½Ï÷ëì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸö¦"¯å·/ÁòÊÕ‡ß;êõÿÿì Èw ê*5Ï>HàP Y’`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Eý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥©—&‘Œâ‡‹„‚™€€]€¥Ùƒ÷†õŠÏ|•ùªr³{¼ÆùÏFÚÙä£ïˆúw\&º%0þ9…CL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZ÷RXJ.A‹7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ï¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’˜nŸô¦#¯æ·0ÁðÊÕ‰ß8êõí Åx ë*5Ð>HÞP Y’`cgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¹NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€]€¥Úƒö†öŠÏz•÷ªs³|¼ÆöÏGÚÚä¡ï‰úy]$»%0û9†CŽLUæ\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-A‰7~-#x¨ »Ì÷íì2âª×r͘Ã+ºE±ò¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆH‹’›˜oŸõ¦!¯ç·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çç܃ÒwÈÔ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÜä¢ï‡úz_%¸% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésÙnûhYbüZøRYJ,Aˆ7}-#w§ ½Ë÷ìì0â­×qÍ—Ã.ºD±ñ¨@¡>šý“…Žâ‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw é*5Ï>HßP Y‘`egum¸r%wµz^}îÐÃ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò3EýXòˆçæÜ…ÒvÈÓ¾©µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÎ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&¹%0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZ÷RXJ/A‡7|-#y¦ ¼Î÷ëì/â¬×sÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁóÊÕˆß7êõì Éx ë* 5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2T(Ñ2Dý[ò‡çåÜ„ÒuÈÒ¾¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆùÏFÚÚä ï‰úx]'»%0þ9…CŽLUå\d„j1p u y&|[~£ýgä}u{xèsÙnühWbýZúRWJ.AŠ7{-#x¨ »Í÷îì.â«×rÍ•Ã,ºE±ò¨>¡?šþ“„Žá‰†7ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2S(Ð5CýYòŠçä܃ÒxÈѾ§µ­¥§—(‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏHÚÛä¡ï†úy^$¼% 0ü9†CL Uã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbýZùRZJ-A‰7}-#w§ ¾Ì÷ìì1â©×qÍ—Ã+ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯å·2ÁñÊÕŠß:êõþÿï Çv í*5Ï>HßP Y‘`egtm¸r'wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<Ž2V(Î4EýXòˆçæÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•훣øªr³z¼ÆøÏEÚÜä¢ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~£ýhä}t{xésØnúhXbÿZøRYJ/Aˆ7|-#v¦ ½Î÷ëì0â¬×pÍ–Ã-ºC±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸó¦"¯æ·/ÁòÊÕˆß;êõÿÿì Èw ê*5Ð>HàP Y’`cgum¸r&wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†õŠÏ|•öªr³{¼ÆùÏFÚÙä¤ï‰úx\'º%0þ9…CŽL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZúRXJ.AŠ7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ï¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’˜nŸô¦ ¯æ·0ÁðÊÕ‰ß8êõí Åy ë*5Ñ>HÞP Y’`dgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¼NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÛä¡ïŠúy^$»%0ü9†CLUæ\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZùRZJ-A‰7~-#x¨ ºÌ÷íì1âª×r͘Ã+ºE±ñ¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆHŒ’›˜oŸõ¦!¯ä·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÄ~É|æy v{qlÂeÀ^W¼NÕEi<2W(Ï4BýYò‰çç܃ÒwÈÓ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼Æ÷ÏDÚÜä¢ï‡úz_%¹% 0ý9ƒCL Uä\d…j0p u y&|[~£ýhã}u{xésØnûhYbüZøRYJ/Aˆ7}-#v§ ½Ë÷ìì0â­×pÍ—Ã.ºD±ñ¨@¡>šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·/ÁòÊÕ‡ß:êõÿÿï Èw ê*5Ï>HàP Y‘`egum¸r%wµz^}îÐÃ~É|æyv|qlÁeÁ^W»NÔEk<Ž2U(Ò3EýXòˆçæÜ…ÒvÈÒ¾¨µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÏ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&º%0þ9„CL Uå\d†j1p u y'|[~£ýhä}t{xèsÚnúhXbþZ÷RXJ.A‹7|-#y¥ ¼Î÷ëì/â«×sÍ–Ã-ºF±ð¨?¡@šü“„Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁïÊÕˆß8êõí Éx ë* 5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2T(Ñ2DýZò‡çåÜ„ÒyÈѾ¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆöÏGÚÚä ï‰úx]'»%0û9…CŽLUå\d…j2p u y&|[~£ýgä}u{xèsÙnühWbýZùRWJ-AŠ7~-#x¨ »Í÷íì.âª×r͘Ã,ºE±ò¨>¡?šý“„Žá‰†7ƒ<0€€ã€¢‚K…ÛˆH‹’›˜oŸõ¦!¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Î>HÞP Y“`dgtm¹r&wµz^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çã܃ÒxÈÔ¾§µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÛä¢ï†úy^%¼% 0ü9ƒCL Uã\d…j0p u y&|[~£ýhä}u{xçsÙnûhYbüZùRZJ,A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦"¯å·2ÁñÊÕ‡ß:êõþÿï Çv í*5Ï>HßP Y‘`egum¸r'wµz^}îÐÄ~É|æyvzqlÁeÂ^W»NÕEh<Ž2V(Ò4EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•훣øªr³z¼ÆøÏEÚØä£ïˆúw_&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésØnúhXbþZøRYJ/Aˆ7|-#z¦ ½Î÷ëì0â¬×pÍ–Ã-ºG±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG’˜nŸó¦"¯æ·0ÁòÊÕˆß7êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒuÈÒ¾¨µ ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†öŠÏ|•öªs³{¼ÆùÏFÚÚä¤ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÚnúhWbþZúRXJ.AŠ7{-#x¥ »Í÷îì/â«×rÍ•Ã,ºF±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Åy ë*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¼NÓEj<2T(Ð1CýZòŠçä܃ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÛä¡ïŠúy^$»%0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZùRZJ-A‰7~-#w¨ ºÌ÷íì1âª×qÍ—Ã+ºE±ñ¨A¡>šý“…Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜oŸõ¦!¯ä·2ÁñÊÕŠß9êõî Çv ì*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy v{qlÂe¿^W»NÕEi<2V(Ï4BýYò‰ççÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úz_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbüZøRYJ/Aˆ7}-#v¦ ½Ë÷ìì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·/ÁòÊÕ‡ß;êõÿÿð Èw ê*5Ï>HàP Y‘`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<Ž2U(Ò3EýWòˆçæÜ…ÒvÈÒ¾¨µ­¥©—'‘Œâ‡‹„‚™€€]€¥Ùƒ÷†õŠÏ|•ùªr³{¼ÆùÏFÚÙä£ïˆúw`&º%0þ9…CL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZ÷RXJ.A‹7|-#y¥ ¼Í÷êì/â«×sÍ•Ã,ºF±ð¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÚˆG‹’˜nŸô¦#¯æ·0ÁïÊÕˆß8êõí Éx ë* 5Ð>HÞP Y’`cgsm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÁ^WºNÓEj<2T(Ð2CýZò†çäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€]€¥Ùƒö†öŠÏz•öªs³|¼ÆöÏGÚÚä¡ï‰úx]'»%0û9†CŽLUå\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-AŠ7~-#x¨ »Ì÷íì.âª×r͘Ã+ºE±ò¨>¡?šý“†Žá‰†7ƒ<0€€ã€¢‚K…ÙˆH‹’›˜oŸõ¦!¯ç·1ÁñÊÕŠß9êõî Æy ì*5Î>HÞP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çã܃ÒwÈÔ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÛä¢ï‡úz^%¼% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésÙnûhYbüZøRYJ,A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw í*5Ï>HßP Y‘`egum¸r'wµz^}îÐÄ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò4EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒ÷†õŠÎ{•øªr³z¼ÆøÏEÚÙä£ïˆúw`&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZ÷RYJ/A‡7|-#y¦ ¼Î÷ëì/â¬×pÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸó¦#¯æ·0ÁóÊÕˆß7êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÀeÁ^WºNÓEj<2U(Ñ2Dý[ò‡çåÜ„ÒuÈÒ¾¨µ ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³{¼ÆùÏFÚÚä ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÙnühWbýZúRXJ.AŠ7{-#x© »Í÷îì.â«×rÍ•Ã,ºE±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Æy ì*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2T(Ð5CýZòŠçä܃ÒxÈѾ§µ­¥§—(‘Œá‡Œ„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªp³|¼Æ÷ÏGÚÛä¡ï†úy^$¼% 0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbýZùRZJ-A‰7~-#w§ ¾Ì÷íì1âª×qÍ—Ã+ºE±ñ¨@¡>šý“…Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯ä·2ÁñÊÕŠß:êõþÿï Çv í*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<2V(Ï4FýXò‰çæÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbÿZøRYJ/Aˆ7|-#v¦ ½Î÷ëì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸó¦"¯å·/ÁòÊÕ‡ß;êõÿÿì Èw ê*5Ï>HàP Y’`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥©—&‘Œâ‡‹„‚™€€]€¥Ùƒ÷†õŠÏ|•ùªr³{¼ÆùÏFÚÙä¤ïˆúw\&º%0þ9…CL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZ÷RXJ.AŠ7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ï¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’˜nŸô¦#¯æ·0ÁðÊÕ‰ß8êõí Åx ë*5Ñ>HÞP Y’`cgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¹NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€]€¥Úƒö†öŠÏz•÷ªs³|¼ÆöÏGÚÚä¡ïŠúy]$»%0û9†CŽLUæ\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-A‰7~-#x¨ »Ì÷íì2âª×r͘Ã+ºE±ò¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆH‹’›˜oŸõ¦!¯ç·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çç܃ÒwÈÔ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÜä¢ï‡úz_%¸% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésÙnûhYbüZøRYJ,Aˆ7}-#w§ ½Ë÷ìì0â­×qÍ—Ã.ºD±ñ¨@¡>šý“…Žâ‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw ê*5Ï>HßP Y‘`egum¸r%wµz^}îÐÃ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò3EýXòˆçæÜ…ÒvÈÒ¾©µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÎ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&º%0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZ÷RXJ/A‡7|-#y¦ ¼Î÷ëì/â¬×sÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁóÊÕˆß7êõì Éx ë* 5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2T(Ñ2DýZò‡çåÜ„ÒyÈѾ¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆùÏFÚÚä ï‰úx]'»%0û9…CŽLUå\d„j2p u y&|[~£ýgä}u{xèsÙnühWbýZúRWJ.AŠ7{-#x¨ »Í÷îì.âª×r͘Ã,ºE±ò¨>¡?šþ“„Žá‰†7ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Î>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2S(Ð5CýYòŠçä܃ÒxÈÔ¾§µ­¥§—(‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏHÚÛä¡ï†úy^$¼% 0ü9†CL Uã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbýZùRZJ-A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã+ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯å·2ÁñÊÕŠß:êõþÿï Çv í*5Ï>HßP Y‘`egtm¸r'wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<Ž2V(Î4EýXòˆçæÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•훣øªr³z¼ÆøÏEÚÜä£ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~£ýhä}t{xésØnúhXbÿZøRYJ/Aˆ7|-#v¦ ½Î÷ëì0â¬×pÍ–Ã-ºC±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸó¦"¯æ·/ÁòÊÕˆß;êõÿÿì Èw ê*5Ð>HàP Y’`cgum¸r&wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†õŠÏ|•öªs³{¼ÆùÏFÚÙä¤ï‰úx\'º%0þ9…CŽL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhWbþZúRXJ.AŠ7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ï¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’˜nŸô¦ ¯æ·0ÁðÊÕ‰ß8êõí Åy ë*5Ñ>HÞP Y’`dgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W¼NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÛä¡ïŠúy^$»%0ü9†CLUæ\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZùRZJ-A‰7~-#w¨ ºÌ÷íì1âª×r͘Ã+ºE±ñ¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆHŒ’œ˜oŸõ¦!¯ä·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÄ~É|æy v{qlÂeÀ^W¼NÕEi<2W(Ï4BýYò‰ççÜ‚ÒwÈÓ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼Æ÷ÏDÚÜä¢ï‡úz_%¹% 0ý9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésØnûhYbüZøRYJ/Aˆ7}-#v§ ½Ë÷ìì0â­×pÍ—Ã.ºD±ñ¨@¡>šý“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·/ÁòÊÕ‡ß:êõÿÿï Èw ê*5Ï>HàP Y‘`egum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^W»NÔEk<Ž2U(Ò3EýXòˆçæÜ…ÒvÈÒ¾¨µ­¥©—'‘Œâ‡‹„‚™€€]€¥Ùƒ÷†õŠÏ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&º%0þ9„CL Uå\d†j1p u y'|[~£ýhä}t{xèsÚnúhXbþZ÷RXJ.A‹7|-#y¥ ¼Î÷ëì/â«×sÍ–Ã-ºF±ð¨?¡@šü“„Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁïÊÕˆß8êõí Éx ë* 5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2T(Ñ2DýZò‡çåÜ„ÒyÈѾ¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆöÏGÚÚä ï‰úx]'»%0û9…CŽLUå\d…j2p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-AŠ7~-#x¨ »Ì÷íì.âª×r͘Ã,ºE±ò¨>¡?šý“„Žá‰†7ƒ<0€€ã€¢‚K…ÛˆH‹’›˜oŸõ¦!¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Î>HÞP Y“`dgtm¹r&wµz^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çã܃ÒxÈÔ¾§µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÛä¢ï†úy^%¼% 0ü9ƒCL Uã\d…j0p u y&|[~£ýhä}u{xçsÙnûhYbüZøRZJ,A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦"¯å·2ÁñÊÕ‡ß:êõþÿï Çv í*5Ï>HßP Y‘`egum¸r'wµz^}îÐÄ~É|æyvzqlÁeÂ^W»NÕEh<Ž2V(Ò4EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œá‡‹„‚™€€]€¥Úƒö†õŠÐ{•훣øªr³z¼ÆøÏEÚÙä£ïˆúw_&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésØnúhXbþZøRYJ/Aˆ7|-#z¦ ½Î÷ëì0â¬×pÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG’˜nŸó¦"¯æ·0ÁóÊÕˆß7êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒuÈÒ¾¨µ ­¥¨—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†öŠÏ|•öªs³{¼ÆùÏFÚÚä ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÚnùhWbþZúRXJ.AŠ7{-#x© »Í÷îì.â«×rÍ•Ã,ºF±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Åy ë*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÀeÀ^W¼NÓEj<2T(Ð5CýZòŠçä܃ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€\€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÛä¡ïŠúy^$»%0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhWbýZùRZJ-A‰7~-#w¨ ºÌ÷íì1âª×qÍ—Ã+ºE±ñ¨A¡>šý“…Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜oŸõ¦!¯ä·2ÁñÊÕŠß9êõî Çv í*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy v{qlÂe¿^W»NÕEi<2V(Ï4BýXò‰ççÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úz_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbüZøRYJ/Aˆ7}-#v¦ ½Ë÷ìì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·/ÁòÊÕ‡ß;êõÿÿð ×þÈ®ýw „üê*[û52úÏ> ùHà÷àP¶ö Yõ‘`dôcg;óumò¸rèð%w¿ïµz–î^}míCìîëÐñéÃ~ÈèÊ|ŸçæyuævLå|q#älúâÁeÑáÁ^§àW~ߺNUÞÔE,Ýk<ÜŽ2ÙÚU(°ÙÒ‡Ø^×35ÖEý ÕWòâÓˆç¹ÒåÜÑ…ÒgÐvÈ=ÏÒ¾ΨµëÌ­ÂË¥™Ê©oÉ—FÈ'‘ÇŒôÅâ‡ÊÄ‹„¡Ã‚x™€OÁ€&À]€ü¾¥Ó½Ùƒª¼÷†»õŠXºÏ.¹|•¸î›Ü¶£³µùªŠ´r³`³{¼7²Æ±ùÏå¯FÚ¼®Ùä’­£ïi¬ˆú@«wª`î¨&ħº%›¦0r¥þ9I¤…C£Lö¡ UÍ å\¤Ÿd{ž„jQ1p(œ uÿš yÖ™'|­˜[~ƒ—£Z–ý1•h”ä}ß’u{µ‘xŒèscÚn:ŽúhXbç‹þZ¾Š÷R•‰XJlˆ.AC‡‹7†|-ð„#ǃyž‚¥ u¼K€Í÷à€êì ‚/â2ƒ«×\„sÍ……•î†,º×‡F±‰ð¨*Š?¡S‹?š|Œþ“¥„ŽÎŽá‰ø†!‘6ƒJ’=s“0€œ”€Æ•ã€ï–¢‚˜K…A™ÚˆjšG”›‹’½œ˜ænŸŸô¦8 #¯b¡æ·‹¢0Á´£ïÊݤÕ¦ˆß0§8êY¨õ‚©«ªí Õ«Éþ¬x '®ë*P¯ 5y°Ð>£±H̲ÞPõ³ Yµ’`G¶cgq·smš¸¹rù&w캴z¼^}?½h¾î‘¿ÐºÀÃ~ãÁÊ| Ãçy6Äv_Å{qˆÆl±ÇÀeÛÈÁ^ÊW-˺NVÌÓE€Íj<©Î2ÒÏT(ûÐÐ$ÒNÓ2wÔCý ÕZòÉÖ†çò×äÜÙ„ÒEÚxÈnÛѾ—ܧµÀÝ­êÞ¥à¨<á—eâ(‘ŽãŒ¸äá‡á匄 ç‚3蘀\逆ê]€¯ë¥ØìÙƒîö†+ïöŠTðÏ}ñz•¦òï›Ïó£ùôöª"ös³K÷|¼tøÆùöÏÇúGÚðûÚäý¡ïBþ‰úkÿx]'»%0û9†CŽLUå\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-AŠ7~-#x¨ »Ì÷íì.âª×r͘Ã+ºE±ò¨>¡?šý“†Žá‰†7ƒ<0€€ã€¢‚K…ÙˆH‹’›˜oŸõ¦!¯ç·1ÁñÊÕŠß9êõî Æy ì*5Î>HÞP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çã܃ÒwÈÔ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÛä¢ï‡úz^%¼% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésÙnûhYbüZøRYJ,A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žâ‰†7ƒ=0€€ã€¢‚K…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw í*5Ï>HßP Y‘`egum¸r%wµz^}îÐÄ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò4EýXòˆçæÜ‚ÒvÈÓ¾©µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÎ{•øªr³{¼ÆøÏEÚÙä£ïˆúw`&¹% 0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZ÷RYJ/A‡7|-#y¦ ¼Î÷ëì/â¬×pÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁóÊÕˆß7êõì Èx ê*5Ð>HÝP Y’`cgum¹r&wµz^}îÐÃ~Ê|æyv|qlÀeÁ^WºNÓEj<2U(Ñ2Dý[ò‡çåÜ„ÒuÈÒ¾¨µ ­¥¨—&‘Œá‡‹„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆùÏFÚÚä ï‰úx]'º%0þ9…CŽLUå\d„j1p u y'|[~£ýgä}u{xèsÙnühWbýZúRXJ.AŠ7{-#x© »Í÷îì.â«×rÍ•Ã,ºE±ò¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦ ¯ç·1ÁðÊÕ‰ß8êõí Æy ì*5Ñ>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2S(Ð5CýYòŠçä܃ÒxÈѾ§µ­¥§—(‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏGÚÛä¡ï†úy^$¼% 0ü9†CLUã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbýZùRZJ-A‰7~-#w§ ¾Ì÷íì1âª×qÍ—Ã+ºE±ñ¨@¡>šý“…Žà‰†7ƒ<0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯ä·2ÁñÊÕŠß:êõþÿï Çv í*5Î>HßP Y‘`dgtm¸r&wµz^}îÐÄ~É|æy vzqlÁeÂ^W»NÕEh<2V(Ï4FýXò‰çæÜ‚ÒwÈÓ¾¦µ­¥©—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣øªq³z¼ÆøÏEÚÜä¢ï‡úv_%¹% 0ý9„CL Uä\d†j1p u y&|[~¤ýhä}t{xésØnúhXbÿZøRYJ/Aˆ7|-#v¦ ½Î÷ëì0â¬×pÍ–Ã-ºD±ð¨@¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜nŸó¦"¯å·/ÁòÊÕ‡ß;êõÿÿì Èw ê*5Ð>HàP Y’`cgum¸r%wµz^}îÐÃ~Ê|æyv|qlÁeÁ^WºNÔEk<2U(Ñ3Dý[ò‡çåÜ…ÒvÈÒ¾¨µ­¥©—&‘Œâ‡‹„‚˜€€]€¥Ùƒ÷†õŠÏ|•öªr³{¼ÆùÏFÚÙä¤ïˆúw\&º%0þ9…CL Uå\d„j1p u y'|[~£ýhä}u{xèsÚnúhXbþZúRXJ.AŠ7{-#y¥ ¼Í÷îì/â«×sÍ•Ã,ºF±ï¨?¡?šþ“„Žá‰†6ƒ=0€€ã€¢‚K…ÚˆH‹’˜nŸô¦ ¯æ·0ÁðÊÕ‰ß8êõí Åx ë*5Ñ>HÞP Y’`cgtm¹r&w´z^}îÐÃ~Ê|çyv{qlÀeÀ^W½NÓEj<2T(Ð2CýZòŠçäÜ„ÒxÈѾ§µ­¥¨—(‘Œá‡Œ„‚˜€€]€¥Úƒö†öŠÏz•÷ªp³|¼ÆöÏGÚÚä¡ïŠúy]$»%0û9†CŽLUæ\d…j0p u y&|[~£ýgä}u{xèsÙnûhWbýZùRWJ-A‰7~-#x¨ »Ì÷íì2âª×r͘Ã+ºE±ò¨>¡?šý“†Žà‰†7ƒ<0€€ã€¢‚K…ÙˆHŒ’›˜oŸõ¦!¯ç·1ÁñÊÕŠß9êõî Æv ì*5Î>HßP Y“`dgtm¸r&wµz^}îÐÃ~É|æy v{qlÂeÀ^W¼NÒEi<2W(Ï5BýYò‰çç܃ÒwÈÓ¾¦µ­¥§—'‘Œá‡‹„‚˜€€]€¥Úƒö†õŠÐ{•훣÷ªq³}¼Æ÷ÏDÚÜä¢ï‡úz_%¸% 0ü9ƒCL Uä\d…j0p u y&|[~£ýhä}u{xésØnûhYbüZøRYJ,Aˆ7}-#v§ ½Ë÷ìì0â­×qÍ—Ã.ºD±ñ¨@¡>šý“…Žâ‰†7ƒ=0€€ã€¢‚L…ÚˆGŒ’œ˜mŸö¦"¯å·2ÁòÊÕ‡ß:êõÿÿï Çw ê*5Ï>HßP Y‘`egum¸r%wµz^}îÐÃ~É|æyv|qlÁeÂ^W»NÔEh<Ž2V(Ò3EýXòˆçæÜ…ÒvÈÒ¾©µ­¥©—'‘Œâ‡‹„‚™€€]€¥Úƒ÷†õŠÎ|•øªr³{¼ÆøÏEÚÙä£ïˆúw`&º%0ý9„CL Uä\d†j1p u y'|[~£ýhä}t{xésÚnúhXbþZ÷RXJ/A‡7|-#y¦ ¼Î÷ëì/â¬×sÍ–Ã-ºF±ð¨?¡@šü“…Žá‰†6ƒ=0€€ã€¢‚L…ÚˆG‹’˜nŸô¦#¯æ·0ÁóÊÕˆß7êõí Éx ë* 5Ð>HÝP Y’`cgum¹r&w´z^}îÐÃ~Ê|æyv{qlÀeÁ^WºNÓEj<2T(Ñ2DýZò‡çåÜ„ÒyÈѾ¨µ ­¥¨—&‘Œá‡Œ„‚˜€€]€¥Ùƒ÷†öŠÏz•öªs³|¼ÆùÏFÚÚä ï‰úx]'»%0û9…CŽLUå\d„j2p u y&|[~£ýgä}u{xèsÙnühWbýZùRWJ.AŠ7{-#x¨ »Í÷îì.âª×r͘Ã,ºE±ò¨>¡?šþ“„Žá‰†7ƒ=0€€ã€¢‚K…ÛˆH‹’›˜oŸô¦!¯ç·1ÁðÊÕ‰ß9êõî Æy ì*5Î>HÞP Y“`dgtm¹r&w´z^}îÐÃ~É|çyv{qlÂeÀ^W¼NÒEi<2S(Ð5CýYò‰çä܃ÒxÈÔ¾§µ­¥§—(‘Œá‡‹„‚˜€€]€¥Úƒö†öŠÐ{•훣÷ªq³}¼Æ÷ÏHÚÛä¡ï†úy^$¼% 0ü9ƒCL Uã\d…j0p u y&|[~£ýhä}u{xèsÙnûhYbüZùRZJ-A‰7}-#w§ ¾Ë÷ìì1â©×qÍ—Ã.ºD±ñ¨@¡>šý“…Žà‰†7ƒ=0€€ã€¢‚K…ÚˆHŒ’œ˜mŸõ¦!¯å·2ÁñÊÕŠß:êõþÿë Ëz í*5Ï>HÜPY”`egtm¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¸NÑEh<Ž2V(Ò0AýXòˆçæÜ†ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä£ï‡úv[)½% 0ý9„CLUç\d†j1p u y%|\~¤ýhä}u{ xçsØnúhXbþZûRVJ,Aˆ7|-#zª ¹Ê÷ëì0â¬×tÍšÃ*ºC±ð¨@¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯æ·/ÁïÊÕ‹ß;êõì Ä{ î*5Ð>HÝP Y”`egum¸r&w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆõÏBÚÝä¤ï‰úx\#¾% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýhä}u{ xêsØnúhWbþZúR[J+A‡7{-#y© ÀÉ÷êì/â«×sÍ™Ã0ºC±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·0ÁðÊÕ…ß<êõí Åu ï*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~Ê|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÔ¾ªµ­¥¨—(‘Œã‡‹„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªs³|¼ÆöÏCÚ×ä¥ïŠúy^$·% 0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A†7z-#w¨ ¾Ð÷éì.âª×q͘Ã/ºH±î¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯ç·2ÁñÊÕ†ß5êõî Æv é*5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿eÀ^W»NÕEl<‹2S(Ï4Fý]ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒø†öŠÐ{•훣õªt³}¼Æ÷ÏDÚØäžï‹úz_%¹%0:‡CL Uä\dƒj2p u y&|[~£ýgã}u{xésÚnýhVbüZøRYJ/AŒ7y-#v§ ½Ï÷ðì,â©×pÍ—Ã.ºG±ó¨=¡>šý“…Žá‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·3ÁòÊÕ‡ß6êõð Èw ê* 5Ó>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^W»NÔEk<‘2R(Î3Eý[òŒçâÜÒvÈÒ¾¨µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ|•õªo³~¼ÆùÏFÚÙäŸï„ú{`&º%0ú9ˆCL Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Î÷ïì3â¨×oÍ–Ã-ºF±ó¨B¡=šü“„Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ WºNÓEj<2X(Í2DýZòŠçèÜ€ÒuÈѾ§µ ­¥«—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆúÏGÚÚä ï…úta'»%0û9‚C‘L Uå\d…j0p u y'|[~£ýhä}t{xèsÙnûhZb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ”Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·.ÁôÊÕ‰ß9êõýÿê Êy ì*5Î>HáP Y“`dgtm¸r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^W¹NÒEi<2W(Ó1BýYò‰çç܇ÒtÈо§µ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆûÏHÚÛä¢ï†úuZ(¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZüRVJ,A‰7}-#{£ ºË÷ìì1â­×uÍ“Ã+ºD±ñ¨@¡Ašÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò0AýXòˆçæÜ†ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€]€¥Úƒ÷†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä£ïˆúw["½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûR\J+Aˆ7|-#zª ¹Ê÷ëì0â¬×sÍ™Ã*ºC±ð¨?¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y”`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ„ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆõÏBÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýgä}u{ xês×nùhWbþZúR[J*A‡7{-#x© ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõí Åu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð5GýVò†çä܃ÒxÈÔ¾ªµ­¥¨—(‘Œã‡Š„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªt³|¼ÆöÏCÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A…7z-#w¨ ¾Ð÷éì-âª×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß5êõï Çv é* 5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<‹2S(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†÷ŠÐ{•훣õªu³}¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj2p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7y-#v¦ ½Ï÷ïì,â©×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ì>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Q(Î3Eý[ò‹çâÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³~¼ÆùÏFÚÙäŸï„ú{`&º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ó¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ WºNÓEj<2X(Ì2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Ùƒö†ôŠÑ|•öªp³y¼ÆúÏGÚÚä¡ï…úta'»%0û9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ”Ã+ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆFŽ’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êy ì*5Î>HÛP Y“`dgtm¸r%w¶z^}îÐÄ~Ê|åyv{qlÂeÂ^W¹NÒEi<2W(Ó1BýYò‰çç܇ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³z¼ÆûÏHÚÛä¢ï‡úvZ)¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZûRVJ,Aˆ7}-#{£ ºË÷ìì1â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ã{ í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò0AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œá‡‹„‚™€€\€¥Úƒ÷†õŠÎy•ð›£øªr³{¼ÆôÏIÚÝä£ïˆúw\"½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûR\J+A‡7|-#yª ¸Ê÷ëì/â¬×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸö¦#¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y•`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÀeÁ^W½N×Eg<2U(Ñ6@ýWò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d‡j1p u y&|Z~¤ýgä}u{ xês×nùhWbýZúR[J1A†7{-#x¨ ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõî Æu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ð5GýUò†çä܃ÒxÈÔ¾ªµ­¥§—(‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A7z-#w§ ¾Ð÷éì-â©×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚J…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgvmºr'wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj3p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆIŒ’œ˜nŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ì>HàP Y’`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Y(Í3Dý[ò‹çáÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³¼ÆùÏFÚÙä ï„ú{`'º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕ‰ß8êõýÿñ Éx ë*5Í>HáP Y’`dgtm·r'wµz^}îÐÄ~É|æyv{qlÂeÃ^ W¹NÓEj<2X(Ô2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÑ|•÷ªp³y¼ÆúÏGÚÛä¡ï†úua(»%0û9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#|¤ »Ì÷íì2â®×nÍ”Ã+ºE±ò¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÙˆFŽ’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êz ì*5Î>HÜPY“`dgtm¸r%w¶z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2W(Ó1BýYò‰çç܆ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ü9ƒCŒLUæ\d…j0p u y'|[~£ýhä}v{xçsØnûhYbÿZûRVJ,Aˆ7}-#z« ¹Ë÷ìì0â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ã{ í*5Ï>HÜP Y”`egum¸r%w´z_}îÐÃ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò7AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÎy•ð›£øªr³{¼ÆõÏIÚÝä£ïˆúw\"½% 0þ9„CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR\J+A‡7|-#y© ÀÊ÷ëì/â¬×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸ÷¦#¯æ·0ÁïÊÕŒß;êõí Åt î*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½N×Eg<2T(Ñ6HýVò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0ÿ9…CŽLUã\d‡j2p u y&|[~¤ýgä}u{ xês×nùhWbýZùR[J1A†7{-#x¨ ¿Ñ÷êì.âª×r͘Ã/ºB±ï¨>¡?šþ“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦$¯ç·1ÁðÊÕ…ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ð5GýUò†çä܃ÒxÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0:†CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnùhVbüZùRZJ0AŒ7z-#w§ ¾Ï÷èì-â©×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚J…ÛˆHŒ’œ˜mŸò¦%¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgrmºr'wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Î4Eý\ò„çâÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäŸï‹úz_&¹%0ù9‡CL Uä\d„j/p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆIŒ’˜nŸó¦¯é·3ÁòÊÕˆß7êõð Èw ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÃ~É|æyv|qlÃe¾^WºNÔEk<‘2Y(Í3Dý[ò‹çáÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªo³¼ÆùÏFÚÚä ï…ú|`'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨A¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜nŸô¦ ¯ã·4ÁóÊÕ‰ß8êõýÿñ Éy ë*5Í>HáP Y’`dgtm·r$wµz^}îÐÄ~É|åyv{qlÂeÃ^ W¹NÓEj<2X(Ô2CýZòŠçèÜ€ÒtÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÍ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(»%0ü9ƒC‹L Uæ\d…j0p uy'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#{¤ ºÌ÷íì1â®×nÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆFŠ’ž˜oŸõ¦!¯ä·.ÁõÊÕŠß9êõþÿê Êz ì*5Î>HÜPY“`dgtm¸r%w´z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2V(Ó0BýYò‰çç܆ÒsÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ý9„CŒLUç\d…j0p u y%|[~£ýhä}v{xçsØnûhYbÿZûRVJ,Aˆ7}-#zª ¹Ë÷ìì0â¬×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿì Ä{ í*5Ï>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEh<Ž2U(Ò7AýWòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏy•뛣øªr³{¼ÆõÏIÚÝä£ïˆúw\"¾% 0þ9…CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR[J+A‡7|-#y© ÀÊ÷ëì/â«×sÍ™Ã)ºC±ð¨?¡@šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆG‹’›˜lŸ÷¦#¯æ·0ÁïÊÕŒß<êõí Åt ï*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½NÖEg<2T(Ñ6HýVò‡çäÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0ÿ9†CŽLUã\d‡j2p u y&|[~¤ýgä}u{xês×nùhWbýZùR[J1A†7{-#x¨ ¿Ð÷éì.âª×r͘Ã/ºB±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸò¦$¯ç·1ÁðÊÕ†ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&wµz^}îÐÃ~É|çy v}qlÀeÀ^W¼NÕEm<Œ2S(Ï5Fý]ò…çã܃ÒwÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚ×ä¦ïŠúy^%¸%0:†CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnùhVbüZøRZJ0AŒ7y-#w§ ¾Ï÷ðì-â©×qÍ—Ã.ºG±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆHŒ’œ˜mŸó¦¯è·2ÁñÊÕ‡ß6êõï Çw é* 5Ò>HßP Y‘`bgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÕEl<’2R(Î4Eý\òŒçâÜ‚ÒvÈÓ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªo³~¼ÆøÏEÚÙäŸïŒú{_&¹%0ú9‡CL Uä\d„j/p u y'|[~£ýgã}t{xésÚnühVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì3â¨×pÍ–Ã-ºF±ó¨=¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸó¦¯â·3ÁóÊÕˆß7êõð Èx ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÃ~É|æyv|qlÃe¾^ WºNÔEk<‘2Y(Í3Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªo³x¼ÆùÏFÚÚä ï…ú|a'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÙnühZbûZ÷RXJ.AŠ7-#t¥ »Í÷îì2â¯×oÍ•Ã,ºF±ò¨A¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ã·-ÁôÊÕ‰ß8êõýÿñ Éy ë*5Í>HáP Y“`dgtm·r%w¶z^}îÐÄ~É|åyv{qlÂeÃ^ W¹NÓEj<2W(Ô1CýZòŠçè܇ÒtÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÎ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(»%0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#{¤ ºÌ÷íì1â­×uÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆFŠ’ž˜oŸõ¦!¯ä·.ÁõÊÕŠß9êõþÿë Ëz í*5Î>HÜPY“`dgtm¸r%w´z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2V(Ó0BýXò‰çç܆ÒzÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆûÏHÚÜä¢ï‡úv[)½% 0ý9„CŒLUç\d†j1p u y%|[~¤ýhä}v{xçsØnúhXbÿZûRVJ,Aˆ7}-#zª ¹Ë÷ìì0â¬×tÍšÃ*ºD±ð¨@¡@šÿ“ƒŽà‰†6ƒ=0€€ä€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁîÊÕ‹ß;êõÿÿì Ä{ î*5Ï>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEg<Ž2U(Ñ7AýWò‡çåÜ…ÒyÈÖ¾¥µ­¥©—(‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏz•뛣ùªr³{¼ÆõÏJÚÝä£ïˆúw\"¾% 0þ9…CLUâ\d†j1p u y&|Z~¤ýhä}u{ xçsØnúhXbþZúR[J+A‡7{-#y© ÀÉ÷êì/â«×sÍ™Ã0ºC±ð¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆG‹’›˜lŸ÷¦#¯æ·0ÁðÊÕŒß<êõí Åt ï*5Ð>HÞP Y`fgvm¹r&w´z]}îÐÃ~Ê|çy vyqlÀeÁ^W½NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÕ¾«µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¥ï‰úx]$·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xês×nùhWbýZùRZJ1A†7z-#x¨ ¿Ð÷éì.âª×r͘Ã/ºH±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸò¦$¯ç·1ÁñÊÕ†ß=êõî Æv è*5Ñ>HÞP Y`bgvm¹r&wµz^}îÐÃ~É|æy v}ql¿eÀ^W¼NÕEl<‹2S(Ï5Fý]ò…çã܃ÒwÈÔ¾ªµ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚØä¦ï‹úz^%¸%0:‡CL Uä\dƒj2p u y&|[~£ýgä}u{xésÛnøhVbüZøRYJ0AŒ7y-#w§ ¾Ï÷ðì-â©×qÍ—Ã.ºG±ô¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Çw é* 5Ò>HßP Y‘`bgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÔEk<’2R(Î3Eý\òŒçâÜ‚ÒvÈÓ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•õªo³~¼ÆøÏEÚÙäŸïŒú{`&¹%0ú9ˆCL Uä\d„j/p u y'|[~£ýhã}t{xésÚnühUbûZ÷RXJ/A‹7€-#u¦ ¼Î÷ïì3â¨×pÍ–Ã-ºF±ó¨=¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·3ÁóÊÕˆß7êõð Èx ë* 5Í>HàP Y’`cgsm·r'wµz^}îÐÄ~É|æyv|qlÃe¾^ WºNÓEj<‘2X(Í2Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥¦—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆùÏFÚÚä ï…ú|a'»%0û9‚C‘L Uå\d„j0p u y'|[~£ýhå}t{xèsÙnühZbûZ÷RXJ.AŠ7-#t¤ »Í÷îì2â®×oÍ•Ã,ºE±ò¨A¡=šû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ä·-ÁôÊÕ‰ß8êõýÿò Êy ì*5Î>HáP Y“`dgtm·r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^ W¹NÒEi<2W(Ô1CýYòŠçè܇ÒtÈѾ§µ­¥ª—&‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆúÏGÚÛä¡ï†úub(¼% 0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}v{xèsÙnûhYbÿZöRWJ-A‰7}-#{£ ºÌ÷ìì1â­×uÍ”Ã+ºD±ñ¨@¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜oŸõ¦!¯ä·.ÁîÊÕŠß:êõþÿë Ëz í*5Ï>HÜPY“`egtm¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¸NÑEh<Ž2V(Ò0BýXòˆçæÜ†ÒzÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆôÏIÚÜä¢ï‡úv[)½% 0ý9„CLUç\d†j1p u y%|[~¤ýhä}u{ xçsØnúhXbÿZûRVJ,Aˆ7|-#zª ¹Ê÷ëì0â¬×tÍšÃ*ºD±ð¨@¡@šþ“ƒŽà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁïÊÕ‹ß;êõÿÿì Ä{ î*5Ð>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†õŠÏz•웣ùªr³{¼ÆõÏBÚÝä¤ïˆúw\#¾% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýhä}u{ xêsØnúhXbþZúR[J+A‡7{-#y© ÀÉ÷êì/â«×sÍ™Ã0ºC±ï¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆH‹’›˜lŸ÷¦#¯æ·0ÁðÊÕ…ß<êõí Åu ï*5Ñ>HÞP Y`fgvm¹r&w´z]}îÐÃ~Ê|çy v}qlÀeÀ^W½NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÔ¾ªµ­¥¨—(‘Œà‡‹„‚˜€€\€¤Ûƒ÷†öŠÏz•웣úªs³|¼ÆöÏCÚ×ä¥ïŠúy^$·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xés×nùhWbýZùRZJ0A†7z-#x¨ ¿Ð÷éì.âª×r͘Ã/ºH±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’›˜mŸò¦$¯ç·1ÁñÊÕ†ß5êõî Æv è*5Ò>HßP Y`bgvm¹r&wµz^}îÐÃ~É|æy v}ql¿eÀ^W¼NÕEl<‹2S(Ï4Fý]ò…çã܃ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒø†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚØäžï‹úz_%¸%0:‡CL Uä\dƒj2p u y&|[~£ýgã}u{xésÚnøhVbüZøRYJ/AŒ7y-#v§ ½Ï÷ðì,â©×qÍ—Ã.ºG±ô¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Çw ê* 5Ó>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÔEk<’2R(Î3Eý\òŒçâÜÒvÈÒ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ|•õªo³~¼ÆøÏEÚÙäŸï„ú{`&º%0ú9ˆCL Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühUbûZ÷RXJ.A‹7-#u¥ ¼Î÷ïì3â¨×oÍ–Ã-ºF±ó¨B¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·3ÁóÊÕˆß7êõüÿñ Éx ë* 5Í>HàP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃe¾^ WºNÓEj<2X(Í2DýZò‹çèÜ€ÒuÈѾ¨µ ­¥«—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆùÏGÚÚä ï…úta'»%0û9‚C‘L Uå\d„j0p u y'|[~£ýhå}t{xèsÙnühZbúZöRWJ-AŠ7~-#t¤ »Í÷íì2â®×nÍ•Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·-ÁôÊÕ‰ß9êõýÿê Êy ì*5Î>HáP Y“`dgtm·r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^ W¹NÒEi<2W(Ó1CýYò‰çç܇ÒtÈо§µ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆûÏHÚÛä¡ï†úuZ(¼% 0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}v{xçsÙnûhYbÿZöRVJ,A‰7}-#{£ ºË÷ìì1â­×uÍ”Ã+ºD±ñ¨@¡Ašÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦!¯å·.ÁîÊÕŠß:êõþÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¸NÑEh<Ž2V(Ò0AýXòˆçæÜ†ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä£ï‡úw[)½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûRUJ+Aˆ7|-#zª ¹Ê÷ëì0â¬×tÍšÃ*ºC±ð¨@¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯æ·0ÁïÊÕŒß;êõì Ä{ î*5Ð>HÝP Y”`egum¸r&w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆõÏBÚÝä¤ï‰úx]#¾% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýgä}u{ xêsØnúhWbþZúR[J*A‡7{-#y© ¿É÷êì/â«×sÍ™Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõí Åu ï*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~Ê|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð5GýVò†çäÜ„ÒxÈÔ¾ªµ­¥¨—(‘Œã‡‹„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªs³|¼ÆöÏCÚ×ä¥ïŠúy^$¸% 0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A†7z-#w¨ ¾Ð÷éì-âª×q͘Ã.ºH±î¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß5êõî Æv é*5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<‹2S(Ï4Fý]ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†öŠÐ{•훣õªt³}¼Æ÷ÏDÚØäžï‹úz_%¹%0:‡CL Uä\dƒj2p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7y-#v¦ ½Ï÷ðì,â©×pÍ—Ã.ºG±ó¨=¡>šý“…Žá‰†7ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·3ÁòÊÕ‡ß7êõð Èw ê* 5Ó>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^W»NÔEk<‘2R(Î3Eý[òŒçâÜÒvÈÒ¾¨µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•õªo³~¼ÆùÏFÚÙäŸï„ú{`&º%0ú9ˆCL Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Î÷îì3â¨×oÍ•Ã-ºF±ó¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ WºNÓEj<2X(Í2DýZòŠçèÜ€ÒuÈѾ§µ­¥«—&‘Œá‡Œ„‚™€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆúÏGÚÚä ï…úta'»%0û9‚C‘L Uå\d…j0p u y'|[~£ýhä}t{xèsÙnûhZb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ”Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·.ÁôÊÕ‰ß9êõýÿê Êy ì*5Î>HáP Y“`dgtm¸r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^W¹NÒEi<2W(Ó1BýYò‰çç܇ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆûÏHÚÛä¢ï†úvZ)¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZûRVJ,A‰7}-#{£ ºË÷ìì1â­×tÍ“Ã+ºD±ñ¨@¡Ašÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò0AýXòˆçæÜ†ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€]€¥Úƒ÷†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä£ïˆúw\"½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûR\J+Aˆ7|-#zª ¸Ê÷ëì0â¬×sÍ™Ã*ºC±ð¨?¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y”`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½N×Eg<2U(Ñ6@ýWò‡çåÜ„ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆõÏBÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d‡j1p u y&|Z~¤ýgä}u{ xês×nùhWbþZúR[J1A‡7{-#x© ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõí Åu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2T(Ð5GýVò†çä܃ÒxÈÔ¾ªµ­¥¨—(‘Œã‡Š„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªt³|¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A7z-#w§ ¾Ð÷éì-âª×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†÷ŠÐ{•훣õªu³}¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj3p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7y-#v¦ ½Ï÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜nŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ì>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Q(Î3Eý[ò‹çâÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³~¼ÆùÏFÚÙäŸï„ú{`&º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë*5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ W¹NÓEj<2X(Ì2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÑ|•öªp³y¼ÆúÏGÚÚä¡ï…úua(»%0û9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ”Ã+ºE±ò¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÙˆFŽ’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êy ì*5Î>HÛP Y“`dgtm¸r%w¶z^}îÐÄ~Ê|åyv{qlÂeÂ^W¹NÒEi<2W(Ó1BýYò‰çç܆ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ü9ƒCŒLUæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZûRVJ,Aˆ7}-#{£ ¹Ë÷ìì1â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ã{ í*5Ï>HÜP Y”`egum¸r%w´z_}îÐÃ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò/AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¥Úƒ÷†õŠÎy•ð›£øªr³{¼ÆõÏIÚÝä£ïˆúw\"½% 0ý9„CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR\J+A‡7|-#yª ¸Ê÷ëì/â¬×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸö¦#¯æ·0ÁïÊÕŒß;êõì Åt î*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½N×Eg<2U(Ñ6@ýWò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d‡j1p u y&|Z~¤ýgä}u{ xês×nùhWbýZúR[J1A†7{-#x¨ ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦$¯ç·1ÁðÊÕ…ß<êõî Æu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ð5GýUò†çä܃ÒxÈÔ¾ªµ­¥§—(‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhVbýZùRZJ0A7z-#w§ ¾Ð÷éì-â©×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚J…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgwmºr'wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj3p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆIŒ’œ˜nŸó¦¯é·3ÁòÊÕˆß7êõð Èw ê* 5Ì>HàP Y’`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¾^WºNÔEk<‘2Y(Í3Dý[ò‹çáÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†ôŠÑ|•öªo³¼ÆùÏFÚÙä ï„ú|`'º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜nŸô¦ ¯ã·4ÁóÊÕ‰ß8êõýÿñ Éx ë*5Í>HáP Y’`dgtm·r'wµz^}îÐÄ~É|æyv{qlÂeÃ^ W¹NÓEj<2X(Ô2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÍ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úua(»%0û9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#{¤ ºÌ÷íì1â®×nÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÙˆF‰’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êz ì*5Î>HÜPY“`dgtm¸r%w¶z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2W(Ó0BýYò‰çç܆ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•÷ªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ý9ƒCŒLUæ\d…j0p u y'|[~£ýhä}v{xçsØnûhYbÿZûRVJ,Aˆ7}-#z« ¹Ë÷ìì0â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’Ÿ˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ä{ í*5Ï>HÜP Y”`egum¸r%w´z_}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEh<Ž2U(Ò7AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏy•ð›£øªr³{¼ÆõÏIÚÝä£ïˆúw\"½% 0þ9„CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR\J+A‡7|-#y© ÀÊ÷ëì/â«×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸ÷¦#¯æ·0ÁïÊÕŒß;êõí Åt î*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½N×Eg<2T(Ñ6HýVò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0ÿ9…CŽLUã\d‡j2p u y&|[~¤ýgä}u{ xês×nùhWbýZùR[J1A†7{-#x¨ ¿Ñ÷éì.âª×r͘Ã/ºB±ï¨>¡?šý“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦$¯ç·1ÁðÊÕ…ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&wµz^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ï5Gý]ò…çã܃ÒxÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0:†CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnùhVbüZùRZJ0AŒ7z-#w§ ¾Ï÷ðì-â©×qÍ—Ã.ºG±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆHŒ’œ˜mŸò¦%¯è·2ÁñÊÕ‡ß6êõï Çv é* 5Ò>HßP Y‘`bgrmºr'wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Î4Eý\òŒçâÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäŸï‹ú{_&¹%0ú9‡CL Uä\d„j/p u y&|[~£ýgã}t{xésÚnühVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì4â¨×pÍ–Ã-ºG±ó¨=¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆIŒ’˜nŸó¦¯é·3ÁòÊÕˆß7êõð Èx ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÃ~É|æyv|qlÃe¾^WºNÔEk<‘2Y(Í3Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªo³¼ÆùÏFÚÚä ï…ú|a'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ »Í÷îì2â§×oÍ•Ã,ºF±ò¨A¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ã·4ÁôÊÕ‰ß8êõýÿñ Éy ë*5Í>HáP Y’`dgtm·r%wµz^}îÐÄ~É|åyv{qlÂeÃ^ W¹NÓEj<2X(Ô1CýZòŠçèÜ€ÒtÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÍ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(»%0ü9ƒC‹L Uæ\d…j0p uy'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#{¤ ºÌ÷íì1â®×nÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆFŠ’ž˜oŸõ¦!¯ä·.ÁõÊÕŠß9êõþÿê Êz ì*5Î>HÜPY“`dgtm¸r%w´z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2V(Ó0BýYò‰çç܆ÒsÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ý9„CŒLUç\d†j1p u y%|[~¤ýhä}v{xçsØnúhXbÿZûRVJ,Aˆ7}-#zª ¹Ë÷ìì0â¬×tÍ“Ã*ºD±ð¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿì Ä{ î*5Ï>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEh<Ž2U(Ò7AýWòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏy•뛣øªr³{¼ÆõÏIÚÝä£ïˆúw\"¾% 0þ9…CLUâ\d†j1p u y&|Z~¤ýhä}u{ xçsØnúhXbþZúR[J+A‡7|-#y© ÀÊ÷êì/â«×sÍ™Ã)ºC±ð¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆG‹’›˜lŸ÷¦#¯æ·0ÁïÊÕŒß<êõí Åt ï*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vyqlÀeÁ^W½NÖEg<2T(Ð6HýVò†çäÜ„ÒxÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xês×nùhWbýZùRZJ1A†7z-#x¨ ¿Ð÷éì.âª×r͘Ã/ºB±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸò¦$¯ç·1ÁðÊÕ†ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&wµz^}îÐÃ~É|æy v}ql¿eÀ^W¼NÕEm<Œ2S(Ï5Fý]ò…çã܃ÒwÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚ×ä¦ïŠúz^%¸%0:‡CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnøhVbüZøRZJ0AŒ7y-#w§ ¾Ï÷ðì-â©×qÍ—Ã.ºG±î¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆHŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Çw é* 5Ò>HßP Y‘`bgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÔEl<’2R(Î4Eý\òŒçâÜ‚ÒvÈÓ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•õªo³~¼ÆøÏEÚÙäŸïŒú{`&¹%0ú9ˆCL Uä\d„j/p u y'|[~£ýgã}t{xésÚnühVbûZøRYJ/A‹7€-#v¦ ¼Î÷ïì3â¨×pÍ–Ã-ºF±ó¨=¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸó¦¯â·3ÁóÊÕˆß7êõð Èx ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÃ~É|æyv|qlÃe¾^ WºNÓEk<‘2X(Í2Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆùÏFÚÚä ï…ú|a'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÙnühZbûZ÷RXJ.AŠ7-#t¥ »Í÷îì2â®×oÍ•Ã,ºE±ò¨A¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ã·-ÁôÊÕ‰ß8êõýÿñ Éy ë*5Í>HáP Y“`dgtm·r%w¶z^}îÐÄ~É|åyv{qlÂeÃ^ W¹NÓEj<2W(Ô1CýZòŠçè܇ÒtÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÎ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(¼% 0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}t{xèsÙnûhYbÿZöRWJ-A‰7~-#{£ ºÌ÷íì1â­×uÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆFŠ’ž˜oŸõ¦!¯ä·.ÁíÊÕŠß:êõþÿë Ëz í*5Î>HÜPY“`dgtm¸r%w´z_}îÐÄ~Ê|åyvzqlÂeÂ^W¸NÒEh<2V(Ó0BýXò‰çç܆ÒzÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆôÏHÚÜä¢ï‡úv[)½% 0ý9„CŒLUç\d†j1p u y%|[~¤ýhä}u{xçsØnúhXbÿZûRVJ,Aˆ7}-#zª ¹Ë÷ëì0â¬×tÍšÃ*ºD±ð¨@¡@šÿ“ƒŽà‰†6ƒ=0€€ä€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁïÊÕ‹ß;êõÿÿì Ä{ î*5Ï>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEg<Ž2U(Ñ7AýWò‡çåÜ…ÒyÈÖ¾¥µ­¥©—(‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏz•뛣ùªr³{¼ÆõÏBÚÝä£ïˆúw\#¾% 0þ9…CLUâ\d†j1p u y&|Z~¤ýhä}u{ xçsØnúhXbþZúR[J+A‡7{-#y© ÀÉ÷êì/â«×sÍ™Ã0ºC±ð¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆH‹’›˜lŸ÷¦#¯æ·0ÁðÊÕŒß<êõí Åt ï*5Ð>HÞP Y`fgvm¹r&w´z]}îÐÃ~Ê|çy vyqlÀeÀ^W½NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÕ¾«µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¥ï‰úy]$·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xês×nùhWbýZùRZJ1A†7z-#x¨ ¿Ð÷éì.âª×r͘Ã/ºH±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸò¦$¯ç·1ÁñÊÕ†ß=êõî Æv è*5Ñ>HßP Y`bgvm¹r&wµz^}îÐÃ~É|æy v}ql¿eÀ^W¼NÕEl<‹2S(Ï5Fý]ò…çã܃ÒwÈÔ¾ªµ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒø†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚØä¦ï‹úz_%¸%0:‡CL Uä\dƒj2p u y&|[~£ýgä}u{xésÛnøhVbüZøRYJ0AŒ7y-#w§ ½Ï÷ðì-â©×qÍ—Ã.ºG±ô¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Çw é* 5Ò>HßP Y‘`bgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÔEk<’2R(Î3Eý\òŒçâÜ‚ÒvÈÓ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ|•õªo³~¼ÆøÏEÚÙäŸïŒú{`&¹%0ú9ˆCL Uä\d„j/p u y'|[~£ýhã}t{xésÚnühUbûZ÷RXJ/A‹7€-#u¦ ¼Î÷ïì3â¨×pÍ–Ã-ºF±ó¨B¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·3ÁóÊÕˆß7êõð Èx ë* 5Í>HàP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃe¾^ WºNÓEj<‘2X(Í2Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥«—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆùÏFÚÚä ï…ú|a'»%0û9‚C‘L Uå\d„j0p u y'|[~£ýhå}t{xèsÙnühZbûZ÷RWJ.AŠ7-#t¤ »Í÷îì2â®×nÍ•Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ä·-ÁôÊÕ‰ß9êõýÿò Êy ì*5Î>HáP Y“`dgtm·r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^ W¹NÒEi<2W(Ô1CýYòŠçç܇ÒtÈѾ§µ­¥ª—&‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆúÏHÚÛä¡ï†úub(¼% 0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}v{xèsÙnûhYbÿZöRWJ-A‰7}-#{£ ºÌ÷ìì1â­×uÍ”Ã+ºD±ñ¨@¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦!¯å·.ÁîÊÕŠß:êõþÿë Ëz í*5Ï>HÜPY“`egtm¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¸NÑEh<Ž2V(Ò0BýXòˆçæÜ†ÒzÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä¢ï‡úv[)½% 0ý9„CLUç\d†j1p u y%|[~¤ýhä}u{ xçsØnúhXbÿZûRVJ,Aˆ7|-#zª ¹Ê÷ëì0â¬×tÍšÃ*ºD±ð¨@¡@šþ“ƒŽà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁïÊÕ‹ß;êõÿÿì Ä{ î*5Ð>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†õŠÏz•웣ùªr³{¼ÆõÏBÚÝä¤ïˆúx\#¾% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýhä}u{ xêsØnúhXbþZúR[J+A‡7{-#y© ÀÉ÷êì/â«×sÍ™Ã0ºC±ï¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯æ·0ÁðÊÕ…ß<êõí Åu ï*5Ñ>HÞP Y`fgvm¹r&w´z]}îÐÃ~Ê|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÔ¾ªµ­¥¨—(‘Œà‡‹„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªs³|¼ÆöÏCÚ×ä¥ïŠúy^$·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A†7z-#x¨ ¾Ð÷éì.âª×r͘Ã/ºH±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’›˜mŸò¦$¯ç·1ÁñÊÕ†ß5êõî Æv é*5Ò>HßP Y‘`bgvm¹r&wµz^}îÐÃ~É|æy v|ql¿eÀ^W¼NÕEl<‹2S(Ï4Fý]ò…çã܃ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒø†öŠÐ{•훣õªt³}¼Æ÷ÏDÚØäžï‹úz_%¹%0:‡CL Uä\dƒj2p u y&|[~£ýgã}u{xésÚnýhVbüZøRYJ/AŒ7y-#v§ ½Ï÷ðì,â©×pÍ—Ã.ºG±ô¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Èw ê* 5Ó>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^W»NÔEk<‘2R(Î3Eý\òŒçâÜÒvÈÒ¾¨µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ|•õªo³~¼ÆøÏEÚÙäŸï„ú{`&º%0ú9ˆCL Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühUbûZ÷RXJ.A‹7-#u¥ ¼Î÷ïì3â¨×oÍ–Ã-ºF±ó¨B¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·3ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HàP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃe¾^ WºNÓEj<2X(Í2DýZò‹çèÜ€ÒuÈѾ¨µ ­¥«—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆúÏGÚÚä ï…úta'»%0û9‚C‘L Uå\d…j0p u y'|[~£ýhå}t{xèsÙnühZbúZöRWJ-AŠ7~-#t¤ »Í÷íì2â®×nÍ•Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·.ÁôÊÕ‰ß9êõýÿê Êy ì*5Î>HáP Y“`dgtm·r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^ W¹NÒEi<2W(Ó1CýYò‰çç܇ÒtÈо§µ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆûÏHÚÛä¡ï†úuZ(¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZõRVJ,A‰7}-#{£ ºË÷ìì1â­×uÍ”Ã+ºD±ñ¨@¡Ašÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦!¯å·/ÁîÊÕŠß:êõþÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¸NÑEh<Ž2V(Ò0AýXòˆçæÜ†ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä£ï‡úw["½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûRUJ+Aˆ7|-#zª ¹Ê÷ëì0â¬×tÍšÃ*ºC±ð¨@¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y”`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆõÏBÚÞä¤ï‰úx]#¶% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýgä}u{ xêsØnúhWbþZúR[J*A‡7{-#y© ¿É÷êì/â«×rÍ™Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõí Åu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~Ê|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð5GýVò†çä܃ÒxÈÔ¾ªµ­¥¨—(‘Œã‡Š„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªt³|¼ÆöÏCÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A†7z-#w¨ ¾Ð÷éì-âª×qÍ—Ã.ºH±î¨>¡>šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß5êõî Çv é*5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<‹2S(Ï4Fý]ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†öŠÐ{•훣õªt³}¼ÆøÏEÚØäžï‹úz_%¹%0:‡CL Uä\dƒj2p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7y-#v¦ ½Ï÷ðì,â©×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ó>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Q(Î3Eý[òŒçâÜÒvÈÒ¾¨µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³~¼ÆùÏFÚÙäŸï„ú{`&º%0ú9ˆC‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Î÷îì3â¨×oÍ•Ã,ºF±ó¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ WºNÓEj<2X(Í2DýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆúÏGÚÚä¡ï…úta'»%0û9‚C‘L Uå\d…j0p u y'|[~£ýhä}t{xèsÙnûhZb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ”Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·.ÁôÊÕ‰ß9êõýÿê Êy ì*5Î>HâP Y“`dgtm¸r%w¶z^}îÐÄ~Ê|åyv{qlÂeÂ^W¹NÒEi<2W(Ó1BýYò‰çç܇ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆûÏHÚÛä¢ï†úvZ)¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZûRVJ,A‰7}-#{£ ºË÷ìì1â­×tÍ“Ã+ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò0AýXòˆçæÜ…ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€\€¥Úƒ÷†õŠÎy•ð›£øªr³z¼ÆôÏIÚÝä£ïˆúw\"½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûR\J+Aˆ7|-#yª ¸Ê÷ëì0â¬×sÍ™Ã*ºC±ð¨?¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆG‹’š˜qŸö¦#¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y”`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÀeÁ^W½N×Eg<2U(Ñ6@ýWò‡çåÜ„ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆöÏBÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d‡j1p u y&|Z~¤ýgä}u{ xês×nùhWbýZúR[J1A†7{-#x© ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõí Æu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2T(Ð5GýVò†çä܃ÒxÈÔ¾ªµ­¥§—(‘Œâ‡Š„‚˜€€\€¥Ûƒ÷†öŠÐ{•웣úªt³|¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A7z-#w§ ¾Ð÷éì-âª×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†÷ŠÐ{•훣õªu³}¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj3p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7€-#v¦ ½Ï÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÛˆIŒ’œ˜nŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ì>HàP Y’`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Y(Î3Eý[ò‹çâÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³~¼ÆùÏFÚÙä ï„ú{`&º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕ‰ß8êõüÿñ Éx ë*5Í>HáP Y’`cgtm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ W¹NÓEj<2X(Ô2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÑ|•÷ªp³y¼ÆúÏGÚÚä¡ï†úua(»%0û9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#|¤ »Ì÷íì2â®×nÍ”Ã+ºE±ò¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÙˆFŽ’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êy ì*5Î>HÛPY“`dgtm¸r%w¶z_}îÐÄ~Ê|åyv{qlÂeÂ^W¹NÒEi<2W(Ó1BýYò‰çç܆ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ü9ƒCŒLUæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZûRVJ,Aˆ7}-#z£ ¹Ë÷ìì0â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ã{ í*5Ï>HÜP Y”`egum¸r%w´z_}îÐÃ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò/AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¥Úƒ÷†õŠÎy•ð›£øªr³{¼ÆõÏIÚÝä£ïˆúw\"½% 0ý9„CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR\J+A‡7|-#yª ¸Ê÷ëì/â¬×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸö¦#¯æ·0ÁïÊÕŒß;êõì Åt î*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½N×Eg<2T(Ñ6@ýWò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d‡j1p u y&|Z~¤ýgä}u{ xês×nùhWbýZúR[J1A†7{-#x¨ ¿É÷êì.âª×r͘Ã/ºB±ï¨>¡?šþ“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦$¯ç·1ÁðÊÕ…ß<êõî Æu è*5Ñ>HÞP Y`bgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ð5GýUò†çä܃ÒxÈÔ¾ªµ­¥§—(‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0:†CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnùhVbýZùRZJ0AŒ7z-#w§ ¾Ð÷èì-â©×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚J…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgrmºr'wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Î4Eý\ò„çâÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäŸï‹úz_%¹%0ù9‡CL Uä\dƒj/p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆIŒ’œ˜nŸó¦¯é·3ÁòÊÕˆß7êõð Èw ê* 5Ì>HàP Y’`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¾^WºNÔEk<‘2Y(Í3Dý[ò‹çáÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªo³¼ÆùÏFÚÙä ï…ú|`'º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜nŸô¦ ¯ã·4ÁóÊÕ‰ß8êõýÿñ Éy ë*5Í>HáP Y’`dgtm·r'wµz^}îÐÄ~É|æyv{qlÂeÃ^ W¹NÓEj<2X(Ô2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÍ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(»%0ü9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#{¤ ºÌ÷íì1â®×nÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÙˆF‰’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êz ì*5Î>HÜPY“`dgtm¸r%w¶z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2W(Ó0BýYò‰çç܆ÒsÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ý9ƒCŒLUç\d…j0p u y'|[~£ýhä}v{xçsØnûhYbÿZûRVJ,Aˆ7}-#z« ¹Ë÷ìì0â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ä{ í*5Ï>HÜP Y”`egum¸r%w´z_}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEh<Ž2U(Ò7AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏy•뛣øªr³{¼ÆõÏIÚÝä£ïˆúw\"½% 0þ9„CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR\J+A‡7|-#y© ÀÊ÷ëì/â«×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’›˜kŸ÷¦#¯æ·0ÁïÊÕŒß<êõí Åt ï*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½N×Eg<2T(Ñ6HýVò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0ÿ9…CŽLUã\d‡j2p u y&|[~¤ýgä}u{ xês×nùhWbýZùR[J1A†7{-#x¨ ¿Ð÷éì.âª×r͘Ã/ºB±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦$¯ç·1ÁðÊÕ…ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&wµz^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ï5Fý]ò…çã܃ÒxÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^%¸%0:†CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnùhVbüZùRZJ0AŒ7z-#w§ ¾Ï÷ðì-â©×qÍ—Ã.ºG±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆHŒ’œ˜mŸó¦%¯è·2ÁñÊÕ‡ß6êõï Çv é* 5Ò>HßP Y‘`bgrmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÕEl<’2R(Î4Eý\òŒçâÜ‚ÒvÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäŸïŒú{_&¹%0ú9‡CL Uä\d„j/p u y'|[~£ýgã}t{xésÚnühVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì4â¨×pÍ–Ã-ºG±ó¨=¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸó¦¯é·3ÁòÊÕˆß7êõð Èx ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÃ~É|æyv|qlÃe¾^WºNÔEk<‘2Y(Í3Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªo³¼ÆùÏFÚÚä ï…ú|a'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ »Í÷îì2â¯×oÍ•Ã,ºF±ò¨A¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ã·4ÁôÊÕ‰ß8êõýÿñ Éy ë*5Í>HáP Y“`dgtm·r%w¶z^}îÐÄ~É|åyv{qlÂeÃ^ W¹NÓEj<2W(Ô1CýZòŠçè܇ÒtÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÎ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(»%0ü9ƒC‹L Uæ\d…j0p uy'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#{¤ ºÌ÷íì1â­×uÍ”Ã+ºE±ñ¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆFŠ’ž˜oŸõ¦!¯ä·.ÁõÊÕŠß9êõþÿê Êz ì*5Î>HÜPY“`dgtm¸r%w´z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2V(Ó0BýYò‰çç܆Ò{È­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆûÏHÚÜä¢ï‡úv[)½% 0ý9„CŒLUç\d†j1p u y%|[~¤ýhä}v{xçsØnúhXbÿZûRVJ,Aˆ7}-#zª ¹Ë÷ìì0â¬×tÍšÃ*ºD±ð¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁîÊÕ‹ß;êõÿÿì Ä{ î*5Ï>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çyvzqlÁeÁ^W¾NÑEh<Ž2U(Ò7AýWòˆçæÜ…ÒyÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏy•뛣ùªr³{¼ÆõÏIÚÝä£ïˆúw\"¾% 0þ9…CLUâ\d†j1p u y&|Z~¤ýhä}u{ xçsØnúhXbþZúR[J+A‡7|-#y© ÀÊ÷êì/â«×sÍ™Ã)ºC±ð¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆG‹’›˜lŸ÷¦#¯æ·0ÁïÊÕŒß<êõí Åt ï*5Ð>HÞP Y`fgvm¹r&w´z]}îÐÃ~Ê|çy vyqlÀeÁ^W½NÖEg<2T(Ð6GýVò†çäÜ„ÒxÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]$·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xês×nùhWbýZùRZJ1A†7z-#x¨ ¿Ð÷éì.âª×r͘Ã/ºB±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸò¦$¯ç·1ÁñÊÕ†ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&wµz^}îÐÃ~É|æy v}ql¿eÀ^W¼NÕEm<‹2S(Ï5Fý]ò…çã܃ÒwÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚØä¦ï‹úz^%¸%0:‡CL Uä\dƒj2p u y&|[~£ýgä}u{xésÛnøhVbüZøRYJ0AŒ7y-#w§ ¾Ï÷ðì-â©×qÍ—Ã.ºG±î¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆHŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Çw é* 5Ò>HßP Y‘`bgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÔEl<’2R(Î4Eý\òŒçâÜ‚ÒvÈÓ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•õªo³~¼ÆøÏEÚÙäŸïŒú{`&¹%0ú9ˆCL Uä\d„j/p u y'|[~£ýhã}t{xésÚnühUbûZ÷RYJ/A‹7€-#v¦ ¼Î÷ïì3â¨×pÍ–Ã-ºF±ó¨=¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸó¦¯â·3ÁóÊÕˆß7êõð Èx ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÄ~É|æyv|qlÃe¾^ WºNÓEj<‘2X(Í2Dý[ò‹çéÜÒuÈÒ¾¨µ ­¥¦—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆùÏFÚÚä ï…ú|a'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhå}t{xèsÙnühZbûZ÷RXJ.AŠ7-#t¥ »Í÷îì2â®×oÍ•Ã,ºE±ò¨A¡=šû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ã·-ÁôÊÕ‰ß8êõýÿñ Êy ì*5Í>HáP Y“`dgtm·r%w¶z^}îÐÄ~É|åyv{qlÂeÃ^ W¹NÒEi<2W(Ô1CýZòŠçè܇ÒtÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÎ}•÷ªp³y¼ÆúÏGÚÛä¡ï†úub(¼% 0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}t{xèsÙnûhYbÿZöRWJ-A‰7~-#{£ ºÌ÷íì1â­×uÍ”Ã+ºE±ñ¨@¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÚˆFŠ’ž˜oŸõ¦!¯ä·.ÁíÊÕŠß:êõþÿë Ëz í*5Î>HÜPY“`dgtm¸r%w´z_}îÐÄ~Ê|åyvzqlÁeÂ^W¸NÑEh<2V(Ó0BýXò‰çæÜ†ÒzÈ­¥©—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªq³z¼ÆôÏIÚÜä¢ï‡úv[)½% 0ý9„CLUç\d†j1p u y%|[~¤ýhä}u{xçsØnúhXbÿZûRVJ,Aˆ7|-#zª ¹Ê÷ëì0â¬×tÍšÃ*ºD±ð¨@¡@šÿ“ƒŽà‰†6ƒ=0€€ä€¢‚L…ÚˆGŠ’š˜pŸö¦"¯å·/ÁïÊÕ‹ß;êõÿÿì Ä{ î*5Ï>HÝP Y”`egum¸r%w´z]}îÐÃ~Ê|çyvzqlÁeÁ^W½NÑEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÖ¾¥µ­¥©—(‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÏz•뛣ùªr³{¼ÆõÏBÚÝä¤ïˆúw\#¾% 0þ9…CLUâ\d†j1p u y&|Z~¤ýhä}u{ xçsØnúhXbþZúR[J+A‡7{-#y© ÀÉ÷êì/â«×sÍ™Ã0ºC±ï¨?¡?šþ“†Žß‰†6ƒ=0€€ã€£‚L…ÚˆH‹’›˜lŸ÷¦#¯æ·0ÁðÊÕ…ß<êõí Åu ï*5Ñ>HÞP Y`fgvm¹r&w´z]}îÐÃ~Ê|çy vyqlÀeÀ^W½NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÕ¾ªµ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣úªs³|¼ÆöÏCÚ×ä¥ïŠúy]$·% 0ÿ9†CŽLUã\d‡j2p u y&|[~£ýgä}u{xês×nùhWbýZùRZJ1A†7z-#x¨ ¿Ð÷éì.âª×r͘Ã/ºH±ï¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆH‹’›˜lŸò¦$¯ç·1ÁñÊÕ†ß5êõî Æv è*5Ò>HßP Y`bgvm¹r&wµz^}îÐÃ~É|æy v}ql¿eÀ^W¼NÕEl<‹2S(Ï5Fý]ò…çã܃ÒwÈÔ¾ªµ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒø†öŠÐ{•훣ôªt³}¼Æ÷ÏDÚØäžï‹úz_%¸%0:‡CL Uä\dƒj2p u y&|[~£ýgä}u{xésÛnøhVbüZøRYJ0AŒ7y-#w§ ½Ï÷ðì-â©×qÍ—Ã.ºG±ô¨=¡>šý“…Žâ‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·2ÁòÊÕ‡ß6êõï Çw ê* 5Ó>HßP Y‘`bgsmºr'wµz^}îÐÃ~É|æyv|ql¿e¿^W»NÔEk<’2R(Î3Eý\òŒçâÜ‚ÒvÈÒ¾©µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ|•õªo³~¼ÆøÏEÚÙäŸïŒú{`&º%0ú9ˆCL Uä\d„j/p u y'|[~£ýhã}t{xésÚnühUbûZ÷RXJ/A‹7€-#u¦ ¼Î÷ïì3â¨×pÍ–Ã-ºF±ó¨B¡=šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·3ÁóÊÕˆß7êõð Éx ë* 5Í>HàP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃe¾^ WºNÓEj<‘2X(Í2DýZò‹çéÜ€ÒuÈѾ¨µ ­¥«—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆùÏFÚÚä ï…ú|a'»%0û9‚C‘L Uå\d„j0p u y'|[~£ýhå}t{xèsÙnühZbûZöRWJ.AŠ7~-#t¤ »Í÷îì2â®×nÍ•Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜oŸô¦ ¯ä·-ÁôÊÕ‰ß9êõýÿò Êy ì*5Î>HáP Y“`dgtm·r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^ W¹NÒEi<2W(Ó1CýYòŠçç܇ÒtÈо§µ­¥ª—&‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆúÏHÚÛä¡ï†úub(¼% 0ü9ƒCŒL Uæ\d…j0p uy'|[~£ýhä}v{xèsÙnûhYbÿZöRVJ-A‰7}-#{£ ºË÷ìì1â­×uÍ”Ã+ºD±ñ¨@¡Ašÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦!¯å·.ÁîÊÕŠß:êõþÿë )ËRz |í*¥5ÎÏ>÷H ÜPJ Ys “`œ egÅ tmî ¸r%wA´zj_}“½îæÐÄ~8Ê|açy‹v´zqÝlÁe/Â^YW‚ ¸N«!ÑEÔ"h<ý#Ž2'%V(P&Òy'¢(0Ë)Aýõ*Xò,ˆçG-æÜp.†Ò™/zÈÃ0Ͼì1¦µ3­>4¥g5©‘6—º7)‘ã8Œ :á‡6;‹„_<‚ˆ=™€±>€Ú?]€A¥-BÚƒVCö†DõЍEÎÒFy•ûGð›$I£MJøªvKr³ Lz¼ÉMÆòNôÏPIÚDQÜänR£ï—S‡úÀTvéU[W)]NH4MÝP L YâJ”`¹IegHumfG¸r=F&wE´zëC]}ÁB˜Aîo@ÐF?Ã~>Ê|ó<çyÊ;!v¡:zqx9lO8Áe%7Á^ü5WÓ4½Nª3ÐE€2gHÞP Y`fgvm¹r&w´z^}îÐÃ~Ê|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð6GýVò†çäÜ„ÒxÈÔ¾ªµ­¥¨—(‘Œà‡‹„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªs³|¼ÆöÏCÚ×ä¥ïŠúy^$·% 0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A†7z-#w¨ ¾Ð÷éì.âª×r͘Ã/ºH±î¨>¡?šý“†Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯ç·1ÁñÊÕ†ß5êõî Æv é*5Ò>HßP Y‘`bgvm¹r&wµz^}îÐÃ~É|æy v|ql¿eÀ^W¼NÕEl<‹2S(Ï4Fý]ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒø†öŠÐ{•훣õªt³}¼Æ÷ÏDÚØäžï‹úz_%¹%0:‡CL Uä\dƒj2p u y&|[~£ýgã}u{xésÚnýhVbüZøRYJ/AŒ7y-#v§ ½Ï÷ðì,â©×pÍ—Ã.ºG±ô¨=¡>šý“…Žá‰†6ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯è·3ÁòÊÕ‡ß6êõï Èw ê* 5Ó>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^W»NÔEk<‘2R(Î3Eý[òŒçâÜÒvÈÒ¾¨µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ|•õªo³~¼ÆøÏEÚÙäŸï„ú{`&º%0ú9ˆCL Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Î÷ïì3â¨×oÍ–Ã-ºF±ó¨B¡=šü“„Žá‰†7ƒ<0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ WºNÓEj<2X(Í2DýZòŠçèÜ€ÒuÈѾ¨µ ­¥«—&‘Œá‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªp³x¼ÆúÏGÚÚä ï…úta'»%0û9‚C‘L Uå\d…j0p u y'|[~£ýhå}t{xèsÙnûhZb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ•Ã,ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·.ÁôÊÕ‰ß9êõýÿê Êy ì*5Î>HáP Y“`dgtm·r%w¶z^}îÐÄ~Ê|åyv{qlÂeÃ^W¹NÒEi<2W(Ó1BýYò‰çç܇ÒtÈо§µ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³y¼ÆûÏHÚÛä¢ï†úuZ(¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZüRVJ,A‰7}-#{£ ºË÷ìì1â­×uÍ“Ã+ºD±ñ¨@¡Ašÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸõ¦"¯å·/ÁîÊÕŠß:êõþÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¸NÑEh<Ž2V(Ò0AýXòˆçæÜ†ÒzÈϾ¦µ­¥©—)‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎy•ð›£øªr³z¼ÆôÏIÚÜä£ïˆúw["½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûRUJ+Aˆ7|-#zª ¹Ê÷ëì0â¬×sÍšÃ*ºC±ð¨?¡@šþ“‡Žà‰†6ƒ=0€€ä€£‚L…ÚˆGŠ’š˜pŸö¦"¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y”`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÁeÁ^W½NÐEg<2U(Ñ7@ýWò‡çåÜ…ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¦Úƒ÷†öŠÏz•웣ùªs³{¼ÆõÏBÚÞä¤ï‰úx]#¶% 0þ9…CŽLUâ\d†j1p u y&|Z~¤ýgä}u{ xêsØnùhWbþZúR[J*A‡7{-#x© ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€£‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõí Åu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEf<Œ2T(Ð5GýVò†çä܃ÒxÈÔ¾ªµ­¥¨—(‘Œã‡Š„‚˜€€\€¥Ûƒ÷†öŠÏz•웣úªt³|¼ÆöÏCÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A†7z-#w¨ ¾Ð÷éì-âª×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚L…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß5êõî Çv é* 5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<‹2S(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†÷ŠÐ{•훣õªu³}¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj2p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7y-#v¦ ½Ï÷ðì,â©×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚J…ÛˆIŒ’œ˜mŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ì>HàP Y‘`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Q(Î3Eý[ò‹çâÜÒvÈÒ¾¨µ ­¥¦—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³~¼ÆùÏFÚÙäŸï„ú{`&º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.A‹7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ó¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕˆß8êõüÿñ Éx ë* 5Í>HáP Y’`cgsm·r'wµz^}îÐÄ~É|æyv{qlÃeÃ^ WºNÓEj<2X(Ì2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Ùƒö†ôŠÑ|•öªp³y¼ÆúÏGÚÚä¡ï…úta'»%0û9‚C‘L Uå\d…j0p u y'|[~£ýhä}t{xèsÙnûhZb[öRWJ-AŠ7~-#t¤ »Ì÷íì2â®×nÍ”Ã+ºE±ò¨A¡Ašû“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõýÿê Êy ì*5Î>HâP Y“`dgtm¸r%w¶z^}îÐÄ~Ê|åyv{qlÂeÂ^W¹NÒEi<2W(Ó1BýYò‰çç܇ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³z¼ÆûÏHÚÛä¢ï‡úvZ)¼% 0ü9ƒCŒL Uæ\d…j0p u y'|[~£ýhä}v{xçsÙnûhYbÿZûRVJ,A‰7}-#{£ ºË÷ìì1â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚K…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ãz í*5Ï>HÜPY”`egum¸r%w´z_}îÐÄ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò0AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œá‡‹„‚™€€\€¥Úƒ÷†õŠÎy•ð›£øªr³{¼ÆôÏIÚÝä£ïˆúw\"½% 0ý9„CLUç\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZûR\J+A‡7|-#yª ¸Ê÷ëì/â¬×sÍ™Ã*ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸö¦#¯æ·0ÁïÊÕŒß;êõì Ät î*5Ð>HÝP Y”`egum¹r&w´z]}îÐÃ~Ê|çy!vzqlÀeÁ^W½N×Eg<2U(Ñ6@ýWò‡çåÜ„ÒyÈÕ¾¥µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏBÚÞä¤ï‰úx]#·% 0þ9…CŽLUâ\d‡j1p u y&|Z~¤ýgä}u{ xês×nùhWbýZúR[J1A†7{-#x© ¿É÷êì.â«×r͘Ã/ºB±ï¨?¡?šþ“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦#¯ç·1ÁðÊÕ…ß<êõî Æu è*5Ñ>HÞP Y`fgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ð5GýVò†çä܃ÒxÈÔ¾ªµ­¥§—(‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0ÿ9†CLUã\d‡j2p u y&|[~£ýgä}u{xésÛnùhWbýZùRZJ0A7z-#w§ ¾Ð÷éì-âª×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚J…ÛˆHŒ’œ˜mŸò¦$¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgvmºr&wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Ï4Fý\ò…çãÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒø†÷ŠÐ{•훣õªu³}¼ÆøÏEÚØäžï‹úz_%¹%0ù9‡CL Uä\dƒj3p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/AŒ7€-#v¦ ½Î÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…܈IŒ’œ˜nŸó¦¯é·3ÁòÊÕ‡ß7êõð Èw ê* 5Ì>HàP Y’`cgsmºr'wµz^}îÐÃ~É|æyv|qlÃe¿^WºNÔEk<‘2Y(Í3Dý[ò‹çáÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÑ|•öªo³~¼ÆùÏFÚÙä ï„ú{`&º%0ú9C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨B¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆI’˜nŸô¦ ¯ã·4ÁóÊÕ‰ß8êõüÿñ Éx ë*5Í>HáP Y’`cgtm·r'wµz^}îÐÄ~É|æyv{qlÂeÃ^ W¹NÓEj<2X(Ô2CýZòŠçèÜ€ÒuÈѾ§µ­¥ª—&‘Œá‡Œ„‚™€€]€¥Úƒö†ôŠÑ|•÷ªp³y¼ÆúÏGÚÚä¡ï†úua(»%0û9‚C‹L Uæ\d…j0p u y'|[~£ýhä}t{xèsÙnûhYb[öRWJ-A‰7~-#|¤ »Ì÷íì2â®×nÍ”Ã+ºE±ò¨A¡Ašû“„Žà‰†7ƒ=0€€ã€¢‚K…ÙˆFŽ’ž˜oŸõ¦!¯ä·.ÁôÊÕŠß9êõþÿê Êz ì*5Î>HÛPY“`dgtm¸r%w¶z_}îÐÄ~Ê|åyv{qlÂeÂ^W¸NÒEi<2W(Ó1BýYò‰çç܆ÒtÈ­¥ª—%‘Œá‡‹„‚™€€]€¥Úƒö†õŠÎ}•÷ªq³z¼ÆûÏHÚÜä¢ï‡úv[)¼% 0ü9ƒCŒLUæ\d…j0p u y'|[~£ýhä}v{xçsØnûhYbÿZûRVJ,Aˆ7}-#z« ¹Ë÷ìì0â­×tÍ“Ã*ºD±ñ¨@¡@šÿ“ƒŽà‰†7ƒ=0€€ã€¢‚L…ÚˆGŠ’ž˜pŸö¦"¯å·/ÁîÊÕ‹ß:êõÿÿë Ã{ í*5Ï>HÜP Y”`egum¸r%w´z_}îÐÃ~Ê|çyvzqlÁeÂ^W¾NÑEh<Ž2V(Ò7AýXòˆçæÜ…ÒzÈϾ¥µ­¥©—)‘Œà‡‹„‚™€€\€¦Úƒ÷†õŠÎy•ð›£øªr³{¼ÆõÏIÚÝä£ïˆúw\"½% 0ý9„CLUâ\d†j1p u y&|\~¤ýhä}u{ xçsØnúhXbþZúR\J+A‡7|-#yª ÀÊ÷ëì/â¬×sÍ™Ã)ºC±ð¨?¡@šþ“†Žà‰†6ƒ=0€€ã€£‚L…ÚˆG‹’š˜qŸ÷¦#¯æ·0ÁïÊÕŒß;êõí Åt î*5Ð>HÝP Y`fgum¹r&w´z]}îÐÃ~Ê|çy vzqlÀeÁ^W½N×Eg<2T(Ñ6@ýVò‡çåÜ„ÒyÈÕ¾¤µ­¥¨—(‘Œà‡‹„‚˜€€\€¤Úƒ÷†öŠÏz•웣ùªs³|¼ÆöÏCÚÞä¤ï‰úx]#·% 0ÿ9…CŽLUã\d‡j2p u y&|[~¤ýgä}u{ xês×nùhWbýZùR[J1A†7{-#x¨ ¿É÷êì.âª×r͘Ã/ºB±ï¨>¡?šþ“†Žâ‰†6ƒ=0€€ã€¡‚L…ÛˆH‹’›˜lŸ÷¦$¯ç·1ÁðÊÕ…ß=êõî Æu è*5Ñ>HÞP Y`bgvm¹r&w´z^}îÐÃ~É|çy v}qlÀeÀ^W¼NÖEm<Œ2S(Ð5GýUò†çä܃ÒxÈÔ¾ªµ­¥§—'‘Œâ‡Š„‚˜€€]€¥Ùƒ÷†öŠÐ{•훣úªt³}¼Æ÷ÏDÚ×ä¥ïŠúy^$¸%0:†CL Uã\dƒj2p u y&|[~£ýgä}u{xésÛnùhVbüZùRZJ0AŒ7z-#w§ ¾Ï÷èì-â©×qÍ—Ã.ºH±î¨>¡>šý“…Žâ‰†6ƒ<0€€ã€¡‚J…ÛˆHŒ’œ˜mŸò¦%¯è·2ÁñÊÕ†ß6êõï Çv é* 5Ò>HßP Y‘`bgrmºr'wµz^}îÐÃ~É|æy v|ql¿e¿^W»NÕEl<’2R(Î4Eý\ò„çâÜ‚ÒwÈÓ¾©µ ­¥§—'‘Œâ‡Œ„‚˜€€]€¥Ùƒõ†÷ŠÐ{•훣õªu³~¼ÆøÏEÚØäŸï‹úz_&¹%0ù9‡CL Uä\d„j/p u y&|[~£ýgã}t{xésÚnýhVbüZøRYJ/A‹7€-#v¦ ½Î÷ïì,â¨×pÍ–Ã-ºG±ó¨=¡>šü“…Žá‰†7ƒ<0€€ã€¢‚K…ÙˆIŒ’˜nŸó¦¯é·3ÁòÊÕˆß7êõð Èw ê* 5Ì>HàP Y’`cgsm·r'wµz^}îÐÃ~É|æyv|qlÃe¾^WºNÔEk<‘2Y(Í3Dý[ò‹çáÜÒvÈÒ¾¨µ ­¥¦—&‘Œâ‡Œ„‚˜€€]€¥Ùƒö†ôŠÑ|•öªo³¼ÆùÏFÚÚä ï…ú|`'º%0û9‚C‘L Uå\d„j/p u y'|[~£ýhã}t{xèsÚnühZbûZ÷RXJ.AŠ7-#u¥ ¼Í÷îì3â§×oÍ•Ã,ºF±ò¨A¡=šü“„Žá‰†7ƒ=0€€ã€¢‚K…ÙˆF’˜nŸô¦ ¯ê·4ÁóÊÕ‰ß8êõýÿé Áq ó*5Ô>HáP Y’`dgtm·r$w³z]}îÐÃ~É|åyv{qlÂeÃ^WÀNÙEc<‰2P(Ì2CýZòŠçè܇Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Üƒù†øŠÑ}•÷ªp³y¼ÆóÏ?ÚÓä©ïŽú}b(»%0ü9ƒC‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÝn÷hTbúZöRWJ-A‰7~-#{¬ ÂÔ÷åì*â¦×nÍ”Ã+ºE±ñ¨A¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆFŠ’™˜jŸï¦'¯ë·5ÁõÊÕŠß9êõþÿê Âr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÃ~È|åyv{qlÂeÂ^W¿NØEp<‡2O(Ë0BýYò‰çç܆Ò{È×¾­µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)¼% 0ý9„CŒLUá\dj4p u y'|[~£ýhä}v{ xësÜnÿhSbùZõRVJ,Aˆ7}-#zª ÁÓ÷ôì(â¥×mÍ“Ã*ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß:êõÿÿì Äs æ* 5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W¾N×Eo<•2N(Ê/AýWòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†ùŠÒ~•ð›£øªr³{¼ÆõÏBÚÕä›ï€úd*¾% 0þ9„CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7|-#y© ÀÒ÷òì7â¤×lÍ’Ã)ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’›˜lŸñ¦¯ß·7Á÷ÊÕŒß<êõí Åt ç* 5É>!HäPY•`fgum¹r&w´z]}îÑÄ~È|äyvzqlÀeÁ^W½NÖEn<”2\(É .@ýVò‡çäÜ„ÒyÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†óŠÓ•ñ›£ùªs³|¼ÆöÏCÚÖäœïúpe+¿% 0ÿ9…CŽLUã\d‚j.pu y(|\~¤ýgä}u{xêsÛnþh\b[óRTJ*A†7{-#x¨ ¿Ð÷ñì6â²×kÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯à·*ÁøÊÕß=êõî Æu è* 5Ê>HåPY•`fgvm¹r&wµz^}îÑÄ~Ë|äyvyqlÀeÀ^W¼NÕEm<“2[(× ->ýUò…çã܃ÒwÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äžï‚úqV,À% 0:†CL Uã\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[ÿRSJ)A…7y-#w§ ¾Ï÷ðì5â±×xÍÃ'ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚M…ÛˆHŒ’œ˜mŸó¦¯á·+ÁêÊÕŽß>êõï Çv é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÕEl<’2Z(Ö,=ýTò„çâÜ‚ÒvÈÓ¾©µ ­¥¬ —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:‡CL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnüh[b[þR_J(A„7x-#v¦ ½Î÷ïì3â°×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€ä€£‚M…܈I’˜nŸó¦¯â·,ÁëÊÕß?êõð Èx ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒuÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J'Aƒ7w-#u¥ »Í÷îì2â¯×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜oŸô¦ ¯ã·-ÁìÊÕß@êõñ Éy ë*5Í>HÛPY`hgxm»r'w¶z^}îÐÄ~Ê|èy"vqÿk½e¾^ W¹NÓEj<2W(Ô9KýRò‚çàÜ€ÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†ôŠÎx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR]J4A‚7v-#s¤ ºÌ÷íì1â­×uÍ›Ã2ºK±ë¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚N…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß2êõó Ëz í*5Î>HÜPYŽ``gxm»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEi<2V(Ó8Jý`òçßÜÒsÈ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0ö9ŠC“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbÿZûR\J3A7u-#r¢ ¹Ë÷ìì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈KŽ’Ÿ˜pŸö¦"¯å·/ÁîÊÕƒß3ê õô Ì{ î*5Ï>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEh<Ž2U(Ò7Iý_òçÞÜ}ÒrÈϾ¥µ­¥©—(‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏz•뛣óªl³‚¼ ÆüÏJÚÝä£ïˆúw\"¶%0÷9~C”L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR[J2AŽ7ƒ-#q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡;šú“ƒŽß‰†6ƒ=0€€ã€¡‚J…؈K’Ÿ˜qŸ÷¦#¯æ·0ÁðÊÕ…ß4ê õøÿõ Í| ï*5Ð>HÞP Y`agqmµr)w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÐEf<2T(Ð6Gý^òŽçìÜ|ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Úƒ÷†öŠÏz•웣óªm³u¼ ÆýÏKÚÞä¥ï‰úx]$·%0ø9CˆLUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ1A7‚-"#p  ·È÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈D’ ˜rŸø¦$¯ç·1ÁñÊÕ†ß5ê õúÿæ Î} ð*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|æy v}qlÄeÅ^WµNÏEe<‹2S(Ï5Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªn³v¼ýÅÿÏLÚßä¦ï‹úz^%¸%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæs×nøhVbüZøRYJ0AŒ7- #~Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”Žß‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁòÊÕ‡ß6êõûÿç ¿~ ñ*5Ò>HßP Y‘`bgsm¶r$w³z`}îÐÃ~É|æyv|qlÄeÄ^WÁNÎEd<Š2R(Î4Eý\òŒçê܉Ò}È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ{•õªo³w¼þÅñÏMÚáä§ïŒú{`&¹%0ú9CŠLUê\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ/A‹7€-#}® ´Æ÷çì,â¨×pÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦&¯é·3ÁóÊÕˆß7êõüÿè Áp ò*5Ó>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv|qlÃeÄ^WÀNÚEc<‰2Q(Í2Dý[ò‹çé܈Ò|ÈØ¾¡µ­ÿ¤¦—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\d‰j3p u y'|[~£ýhå}v{!xësÕn÷hUbûZ÷RXJ.AŠ7-#|¬ ÃÅ÷æì*â§×oÍ•Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦'¯ê·4ÁôÊÕ‰ß8êõýÿê Âq ä*5Ô>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEp<ˆ2P(Ì1CýYòŠçè܇Ò{È×¾­µ­þ¤¥—&‘Œá‡‹„‚™€€\€¤Øƒù†øŠÑ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUà\d‰j4p u y'|[~£ýhä}v{!xësÝnöhTbúZöRWJ-A‰7}-#{« ÂÔ÷åì)â¦×mÍ”Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆGŠ’™˜jŸï¦(¯ë·5ÁõÊÕŠß:êõþÿë Ãr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2O(Ë0BýXòˆçæÜ†ÒzÈÖ¾¬µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)½% 0ý9„CLUá\dj4p u y'|[~¤ýhä}u{ xêsÜnÿhSbùZõRVJ,Aˆ7|-#zª ÁÒ÷óì(â¥×lÍ“Ã*ºD±ð¨@¡@šþ“‡Žã‰†8ƒ</€€ä€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Äs æ* 5É> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<•2](Ê/@ýWò‡çåÜ…ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†ùŠÓ~•ð›£ùªr³{¼ÆõÏBÚÕäœï€úd*¾% 0þ9…CŽLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7{-#y© ÀÑ÷òì7â£×kÍ’Ã)ºC±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÚˆH‹’›˜lŸñ¦¯à·7Á÷ÊÕŒß<êõí Åu ç* 5Ê>HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÀ^W½NÖEm<”2\(Ø .?ýVò†çäÜ„ÒxÈÔ¾ªµ ­¥­—$‘Œà‡‹„‚˜€€\€¤Ùƒõ†óŠÓ•ñ›£úªs³|¼ÆöÏCÚ×äï‚úqe,¿% 0ÿ9†CŽLUã\dƒj.pu y(|\~¤ýgä}u{xésÛnþh\b[óRTJ*A†7z-#x¨ ¿Ð÷ñì5â²×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’›˜mŸò¦¯á·*ÁøÊÕŽß=êõî Æv è* 5Ë>HØPY–`ggvm¹r&wµz^}îÑÄ~Ë|äyvyql¿eÀ^W¼NÕEl<“2Z(×->ýUò…çã܃ÒwÈÓ¾ªµ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj.puy(|\~¤ýgä}u{xésÚnýh[b[þRSJ)A…7y-#v§ ½Ï÷ðì4â°×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·+ÁëÊÕß>êõï Çw ê* 5Ì>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¿e¿^W»NÔEk<’2Y(Ö;=ýTò„çâÜ‚ÒvÈÒ¾©µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•ó› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uä\d„j/p uy%|\~¤ýgã}t{xèsÚnühZb[ýR_J(A„7x-#u¦ ¼Î÷ïì3â¯×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·,ÁìÊÕß?êõñ Éx ë* 5Í>HÚPY`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<2X(Õ:LýRòƒçáÜ€ÒuÈѾ¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:‰C‘L Uå\d„j0p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J4Aƒ7w-#t¤ »Í÷íì2â®×vÍœÃ2º?±ì¨<¡<šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’ž˜oŸô¦!¯ä·-ÁíÊÕßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy"vqÿk½e½^ W¹NÒEi<2W(Ó9Kýaò‚çàÜÒtÈо§µ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎx•ꛣýªw³€¼ÆûÏHÚÛä¡ï†úuZ ´%0:ŠC’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYbÿZüR]J3A7v-#s£ ºË÷ìì1â­×uÍ›Ã1ºK±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜pŸõ¦!¯å·.ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gpm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò8Iý`ò€çßÜ~ÒsÈϾ¦µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆüÏIÚÜä£ï‡úv["µ%0ö9‹C“L Uç\d†j1p u y&|Z~£ýgã}s{xçsØnúhXbþZûR\J2A7„-#r¢ ¹Ê÷ëì0â¬×tÍšÃ0ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…׈K’Ÿ˜pŸö¦"¯æ·/ÁïÊÕ„ß3ê õô Ì{ î*5Ð>HÝP Y`agqmµr(w¶z_}îÐÃ~Ê|çy!v~qlÅe¼^ W·NÐEg<2U(Ñ7Hý_òçÝÜ}ÒrÈξ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³‚¼ ÆýÏJÚÝä¤ï‰úx\#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xçsØnúhWbþZúR[J1AŽ7ƒ-"#q¡ ¸É÷êì/â«×sÍ™Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·1ÁðÊÕ…ß4ê õùÿõ Í| ï*5Ñ>HÞP Y`agrmµr#w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð6Gý^òŽçìÜ|ÒqÈ;¤µ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³u¼ ÆþÏKÚßä¥ïŠúy^$·%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7‚-!#  ¶È÷éì-âª×q͘Ã/ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈E‡’ ˜rŸø¦$¯è·2ÁñÊÕ†ß5ê õúÿæ Î~ ð*5Ò>HßP Y‘`bgrm¶r#w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2S(Ï4Fý]òçëÜŠÒpÈ̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣õªn³v¼ýÅÿÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæsÖnøhVbüZøRYJ/AŒ7€- #~® µÇ÷èì,â©×pÍ—Ã.ºG±ó¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…؈Eˆ’˜˜sŸù¦%¯è·3ÁòÊÕ‡ß6êõûÿè À ñ*5Ó>HàP Y‘`cgsm¶r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2R(Î3Eý[òŒçé܉Ò}È˾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•õªo³w¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ.A‹7-#}­ ÄÆ÷çì+â¨×oÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯é·4ÁóÊÕˆß8êõüÿé Áp ò*5Ô>HáP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2P(Í2DýZòŠçè܈Ò|ÈØ¾¡µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\ d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-AŠ7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ê·5ÁôÊÕ‰ß9êõýÿê Âr ä*5Õ>HáP Y“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÃ^W¿NÙEp<ˆ2O(Ë1BýYò‰çç܇Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÔäªïŽú}b(¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÝnöhTbúZõRVJ,A‰7}-#{« ÂÓ÷ôì)â¥×mÍ“Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’š˜jŸð¦¯ë·6ÁõÊÕ‹ß:êõÿÿë Ãs å*5Ö>HâPY”`egum¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2N(Ê0AýXòˆçæÜ†ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³z¼ÆôÏAÚÕä›ïúc*½% 0ý9„CLUâ\dj-p u y'|\~¤ýhä}u{ xêsÜnÿhSbùZõRUJ+Aˆ7|-#zª ÁÒ÷óì7â¤×lÍ’Ã*ºC±ð¨?¡@šþ“‡Žã‰†8ƒ</€€ä€£‚L…ÚˆGŠ’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõì Ät ç* 5É> HãPY”`egum¹r&w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<”2\(É/@ýWò‡çåÜ„ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³{¼ÆõÏBÚÖäœïú€e+¾% 0þ9…CŽLUâ\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZôRTJ*A‡7{-#x© ¿Ñ÷òì6â²×kÍ‘Ã)ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·*Á÷ÊÕß<êõí Åu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<“2[(Ø -?ýVò†çä܃ÒxÈÔ¾ªµ ­¥­—$‘Œà‡Š„‚˜€€\€¥Ùƒõ†óŠÌ•ñ›£úªt³|¼Æ÷ÏCÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRSJ)A…7z-#w§ ¾Ð÷ñì5â±×yÍÃ(ºA±î¨>¡>šý“…Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁøÊÕŽß=êõï Çv é* 5Ë>HÙPY–`ggvmºr&wµz^}îÐÄ~Ë|äyvyql¿e¿^W»NÕEl<’2Z(×,>ýTò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³}¼ÆøÏEÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy$|\~¤ýgã}t{xésÚnýh[b[þRSJ(A„7y-#v¦ ½Ï÷ïì4â°×xÍÃ'ºA±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜nŸó¦¯â·,ÁëÊÕß?êõð Èw ê* 5Ì>HÚPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¾e¿^WºNÔEk<‘2Y(Õ;=ýSò„çâÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é› £üªu³~¼ÆùÏFÚÙäŸï„úsXÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR_J'Aƒ7x-#u¥ ¼Í÷îì3â¯×vÍœÃ3º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë*5Í>HÚPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vxql¾e¾^ W¹NÓEj<2X(Ô:KýRò‚çàÜ€ÒuÈѾ§µ­¥ª—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•ꛣüªv³¼ÆúÏGÚÚä¡ï…útY ³%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR^J4A‚7w-#t¤ »Ì÷íì2â®×uÍ›Ã2ºK±ì¨<¡<šû“„Žà‰†7ƒ=0€€â€¡‚M…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy!v~qÿk½e½^ W¹NÒEi<2W(Ó9JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣñªw³€¼ÆûÏHÚÜä¢ï‡úv[!´%0:ŠC’L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZûR]J3A7v-#s£ ºË÷ìì1â­×tÍšÃ1ºJ±÷¨;¡<šû“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’ž˜pŸö¦"¯å·/ÁîÊÕƒß2êõó Ë{ í*5Ï>HÜP Y``gqm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò7Iý`òçÞÜ~ÒsÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒ÷†õŠÎy•뛣òªk³¼ ÆüÏIÚÝä£ïˆúw\"¶%0ö9‹C“L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR\J2A7ƒ-#r¢ ¸Ê÷ëì/â¬×sÍ™Ã0ºI±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸö¦#¯æ·0ÁïÊÕ„ß3ê õô Ì| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅe»^ W·NÐEg<2U(Ñ6Hý_òçìÜ}ÒrÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9~C”LUè\d‡j1p u y&|Z~£ýhå}s{xæs×nùhWbýZúR[J1AŽ7‚-"#p¡ ·É÷êì.â«×r͘Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦$¯ç·1ÁðÊÕ…ß5ê õùÿö Î} ï*5Ñ>HÞP Y`agrm¶r#w·z_}îÐÃ~É|çy v}qlÅeÅ^ W¶NÏEf<Œ2S(Ð5Gý]òŽçëÜ‹ÒqÈ;¤µ­¥§—(‘Œâ‡„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªm³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhVbýZùRZJ0A7-!#Ÿ ¶È÷éì-â©×qÍ—Ã.ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’ ˜rŸø¦$¯è·2ÁñÊÕ†ß6êõúÿç Ï~ ð*5Ò>HßP Y‘`bgrm¶r$w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Ï4Fý\òŒçêÜŠÒ~È̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼ýÅðÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUê\dˆj3p u y&|[~£ýhå}w{"xåsÖnøhVbüZøRYJ/A‹7€- #~® µÆ÷çì,â¨×pÍ–Ã-ºG±ó¨B¡Bš”ŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕ‡ß7êõûÿè À ò*5Ó>HàP Y’`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Í3Dý[ò‹çé܉Ò}ÈÙ¾¢µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅñÏ>Úáä¨ïŒú{`'º%0ú9CŠLUß\d‰j3p u y'|[~£ýhå}v{!xìsÖn÷hUbûZ÷RXJ.AŠ7-#}­ ÄÅ÷æì+â§×oÍ•Ã,ºF±ò¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕ‰ß8êõýÿé Áq ó*5Ô>HáP Y’`dgtm·r$w³z]}îÐÃ~É|æyv{qlÂeÃ^WÀNÚEc<‰2P(Ì2CýZòŠçè܇Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†øŠÑ}•÷ªp³y¼ÿÅóÏ?ÚÓä©ïŽú}a(»%0û9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-A‰7~-#|¬ ÂÔ÷åì*â¦×nÍ”Ã+ºE±ò¨A¡Ašÿ“‡Žä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ë·5ÁôÊÕŠß9êõþÿê Âr å*5Õ>HâPY“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÂ^W¿NÙEp<ˆ2O(Ë0BýYò‰çç܆Ò{È×¾­µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³z¼ÆôÏ@ÚÔäšïú~c)¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÜnöhSbùZõRVJ,Aˆ7}-#z« ÁÓ÷ôì)â¥×mÍ“Ã*ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁõÊÕ‹ß:êõÿÿë Äs æ* 5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÂ^W¾NØEo<•2N(Ê/AýXòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³{¼ÆõÏBÚÕä›ï€úd*½% 0þ9„CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnÿhSbøZôRUJ+A‡7|-#y© ÀÒ÷óì7â¤×lÍ’Ã)ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’š˜kŸñ¦¯ß·7Á÷ÊÕŒß;êõí Åt ç* 5É>!HäPY•`fgum¹r&w´z]}îÑÄ~È|äyvzqlÀeÁ^W½N×En<”2\(É .@ýVò‡çåÜ„ÒyÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³|¼ÆöÏCÚÖäœïúpe+¿% 0ÿ9…CŽLUã\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZóRTJ*A†7{-#x¨ ¿Ñ÷ñì6â²×kÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯à·*ÁøÊÕß=êõî Æu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~Ë|äyvyqlÀeÀ^W¼NÖEm<“2[(× -?ýUò†çã܃ÒxÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äï‚úqV,À% 0:†CL Uã\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[òRSJ)A…7z-#w§ ¾Ï÷ðì5â±×xÍÃ'ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚M…ÛˆHŒ’œ˜mŸò¦¯á·+ÁêÊÕŽß>êõï Çv é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÕEl<’2Z(Ö,=ýTò„çâÜ‚ÒwÈÓ¾©µ ­¥¬ —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³~¼ÆøÏEÚØäŸïƒúsW-Á%0:‡CL Uä\d„j/puy%|\~¤ýgã}t{xésÚnýh[b[þRRJ(A„7x-#v¦ ½Î÷ïì4â°×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€ä€£‚M…܈IŒ’˜nŸó¦¯â·,ÁëÊ Õß?êõð Èw ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒuÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útYÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR^J'Aƒ7w-#u¥ »Í÷îì2â¯×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éy ë*5Í>HÛPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vqÿk½e¾^ W¹NÓEj<2X(Ô9KýRò‚çàÜ€ÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†ôŠÍx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR]J4A‚7v-#s¤ ºÌ÷íì1â®×uÍ›Ã2ºK±ì¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚N…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß1êõò Êz ì*5Î>HÜPYŽ``gxm»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEi<2V(Ó8JýaòçßÜÒsÈ­¥©—)‘Œä‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0:ŠC“L Uç\d…j0p u y%|Z~£ýgã}s{xçsØnûhYbÿZûR\J3A7u-#r¢ ¹Ë÷ìì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’Ÿ˜pŸö¦"¯å·/ÁîÊÕƒß3ê õô Ì{ î*5Ï>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEh<Ž2U(Ò7Iý_òçÞÜ~ÒrÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏy•뛣òªl³‚¼ ÆüÏIÚÝä£ïˆúw\"¶%0÷9‹C”L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR[J2AŽ7ƒ-#q¡ ¸Ê÷êì/â«×sÍ™Ã0ºI±ö¨D¡;šú“ƒŽß‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸ÷¦#¯æ·0ÁïÊÕ„ß4ê õøÿõ Í| ï*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÐEg<2T(Ð6Hý^òŽçìÜ}ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Úƒ÷†öŠÏz•웣óªm³u¼ ÆýÏKÚÞä¤ï‰úx]#·%0ø9C•LUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ1A7‚-"#p  ·È÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈D’ ˜rŸø¦$¯ç·1ÁðÊÕ†ß5ê õùÿæ Î} ð*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|æy v}qlÄeÅ^W¶NÏEf<Œ2S(Ï5Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªn³v¼ýÅþÏLÚßä¦ïŠúz^%¸%0ù9€C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nøhVbüZøRZJ0AŒ7-!#Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”‚Žß‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁòÊÕ‡ß6êõûÿç ¿~ ñ*5Ò>HßP Y‘`bgsm¶r$w³z_}îÐÃ~É|æyv|qlÄeÄ^WÁNÎEe<Š2R(Î4Eý\òŒçê܉Ò~È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªo³w¼þÅñÏMÚàä§ïŒú{`&¹%0ú9CŠLUê\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhVbüZøRYJ/A‹7€-#}® ´Æ÷çì,â¨×pÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦&¯é·3ÁóÊÕˆß7êõüÿè Àp ò*5Ó>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv|qlÃeÄ^WÀNÚEd<‰2Q(Í2Dý[ò‹çé܈Ò}ÈÙ¾¡µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼ÿÅòÏ?Úâä¨ïú|a'º%0û9‚C‹LUà\d‰j3p u y'|[~£ýhå}v{!xìsÕn÷hUbûZ÷RXJ.AŠ7-#|­ ÃÅ÷æì+â§×oÍ•Ã,ºF±ò¨A¡Bš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦'¯ê·4ÁôÊÕ‰ß8êõýÿé Âq ä*5Ô>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEq<ˆ2P(Ì1CýZòŠçè܇Ò{ÈØ¾­µ­þ¤¥—&‘Œá‡Œ„‚™€€\€¤Üƒù†øŠÑ}•÷ªp³y¼ÆóÏ@ÚÓä©ïŽú}b(¼%0ü9ƒCŒLUà\d‰j4p u y'|[~£ýhä}v{!xësÝnöhTbúZöRWJ-A‰7~-#{« ÂÔ÷åì)â¦×nÍ”Ã+ºE±ñ¨A¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆFŠ’™˜jŸï¦'¯ë·5ÁõÊÕŠß9êõþÿë Ãr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÂ~È|åyvzqlÂeÂ^W¾NØEp<–2O(Ë0BýXò‰çç܆ÒzÈ×¾¬µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)½% 0ý9„CŒLUá\dj4p u y'|[~¤ýhä}v{ xësÜnÿhSbùZõRVJ,Aˆ7}-#zª ÁÓ÷óì(â¥×mÍ“Ã*ºD±ð¨@¡@šÿ“‡Žã‰†8ƒ</€€ä€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Äs æ* 5È> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W¾N×Eo<•2N(Ê/AýWò‡çåÜ…ÒyÈÖ¾¬µ ­¥£—$‘Œà‡‹„‚™€€\€¤Øƒô†ùŠÓ~•ð›£ùªr³{¼ÆõÏBÚÕäœï€úd*¾% 0þ9…CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7{-#y© ÀÑ÷òì7â¤×kÍ’Ã)ºC±ð¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÚˆG‹’›˜lŸñ¦¯à·7Á÷ÊÕŒß<êõí Åt ç* 5É>HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÀ^W½NÖEm<”2\(É .?ýVò†çäÜ„ÒxÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Ùƒõ†óŠÓ•ñ›£ùªs³|¼ÆöÏCÚÖäïúqe+¿% 0ÿ9†CŽLUã\d‚j.pu y(|\~¤ýgä}u{xêsÛnþh\b[óRTJ*A†7z-#x¨ ¿Ð÷ñì6â²×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯á·*ÁøÊÕß=êõî Æv è* 5Ê>HØPY–`fgvm¹r&wµz^}îÑÄ~Ë|äyvyql¿eÀ^W¼NÕEl<“2[(× ->ýUò…çã܃ÒwÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[þRSJ)A…7y-#w§ ½Ï÷ðì4â±×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·+ÁêÊÕß>êõï Çw é* 5Ì>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÔEk<’2Y(Ö+=ýTò„çâÜ‚ÒvÈÓ¾©µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•ó› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnüh[b[þR_J(A„7x-#u¦ ¼Î÷ïì3â¯×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·,ÁëÊÕß?êõð Èx ë* 5Í>HÚPY`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<‘2X(Õ:<ýSòƒçáÜÒuÈÒ¾¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:‰C‘L Uå\d„j0p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J4Aƒ7w-#t¤ »Í÷îì2â®×vÍœÃ3º?±ì¨<¡=šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’˜oŸô¦ ¯ä·-ÁíÊÕß@êõò Êy ì*5Î>HÛPY`igxm»r(w¶z^}îÐÄ~Ê|èy"vqÿk½e½^ W¹NÒEi<2W(Ô9KýQò‚çàÜÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:ŠC’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYbÿZüR]J3A7v-#s£ ºÌ÷ìì1â­×uÍ›Ã2ºK±ë¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜oŸõ¦!¯å·.ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gym»r(w¶z_}îÐÄ~Ê|çy!v~ql½e½^ W¸NÑEh<Ž2V(Ò8Jý`òçßÜ~ÒsÈ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏIÚÜä¢ï‡úv["µ%0ö9‹C“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbÿZûR\J2A7„-#r¢ ¹Ê÷ëì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…׈KŽ’Ÿ˜pŸö¦"¯å·/ÁïÊÕ„ß3ê õô Ì{ î*5Ð>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÐEg<2U(Ñ7Hý_òçÞÜ}ÒrÈϾ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏz•웣óªl³‚¼ ÆýÏJÚÝä¤ïˆúx\#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xçsØnúhXbþZúR[J1AŽ7ƒ-"#q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡:šú“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’Ÿ˜qŸ÷¦#¯æ·0ÁðÊÕ…ß4ê õùÿõ Í| ï*5Ñ>HÞP Y`agrmµr)w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð6Gý^òŽçìÜ|ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³u¼ ÆþÏKÚÞä¥ïŠúy^$·%0ø9CˆLUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7‚-!#  ¶È÷éì.âª×r͘Ã/ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈E‡’ ˜rŸø¦$¯ç·1ÁñÊÕ†ß5ê õúÿæ Î} ð*5Ò>HßP Y`bgrm¶r#w·z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2S(Ï4Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣õªn³v¼ýÅÿÏLÚàä¦ï‹úz_%¸%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæsÖnøhVbüZøRYJ/AŒ7- #~¯ µÇ÷èì,â©×pÍ—Ã.ºG±ô¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜sŸù¦%¯è·2ÁòÊÕ‡ß6êõûÿç À ñ*5Ó>HàP Y‘`cgsm¶r$w³z`}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2R(Î3Eý\òŒçê܉Ò}È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ|•õªo³w¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ.A‹7-#}­ ÄÆ÷çì+â¨×oÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜sŸù¦&¯é·3ÁóÊÕˆß8êõüÿé Áp ò*5Ô>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2Q(Í2DýZò‹çè܈Ò|ÈØ¾¡µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\ d‰j3p u y'|[~£ýhå}v{!xësÕn÷hUbúZöRWJ-AŠ7~-#|¬ ÃÕ÷æì*â§×nÍ•Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸú¦'¯ê·4ÁôÊÕ‰ß9êõýÿê Âq ä*5Õ>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEp<ˆ2O(Ì1CýYò‰çç܇Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÝnöhTbúZöRVJ,A‰7}-#{« ÂÓ÷ôì)â¥×mÍ”Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’š˜jŸð¦(¯ë·5ÁõÊÕŠß:êõþÿë Ãs å*5Ö>HâPY”`egum¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2N(Ê0AýXòˆçæÜ†ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³z¼ÆôÏAÚÕä›ïúc*½% 0ý9„CLUá\dj-p u y'|\~¤ýhä}u{ xêsÜnÿhSbùZõRUJ+Aˆ7|-#zª ÁÒ÷óì7â¤×lÍ“Ã*ºC±ð¨@¡@šþ“‡Žã‰†8ƒ</€€ä€£‚L…ÚˆGŠ’š˜kŸð¦¯ì·7ÁöÊÕŒß;êõì Ät æ* 5É> HãPY”`egum¸r&w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<•2\(É/@ýWò‡çåÜ…ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³{¼ÆõÏBÚÖäœïú€d+¾% 0þ9…CŽLUâ\d‚j-pu y(|\~¤ýgä}u{ xêsÜnþh]bøZôRUJ*A‡7{-#y© ¿Ñ÷òì6â£×kÍ‘Ã)ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·8Á÷ÊÕß<êõí Åu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<“2[(Ø -?ýVò†çä܃ÒxÈÔ¾ªµ ­¥­—$‘Œà‡‹„‚˜€€\€¥Ùƒõ†óŠÌ•ñ›£úªt³|¼ÆöÏCÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRTJ)A†7z-#w¨ ¾Ð÷ñì5â±×jÍÃ(ºB±î¨>¡>šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁøÊÕŽß=êõî Æv é* 5Ë>HÙPY–`ggvmºr&wµz^}îÐÄ~Ë|äyvyql¿e¿^W»NÕEl<’2Z(×,>ýUò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy$|\~¤ýgã}t{xésÚnýh[b[þRSJ(A…7y-#v¦ ½Ï÷ðì4â°×xÍÃ'ºA±î¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·,ÁëÊÕß>êõð Èw ê* 5Ì>HÙPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¾e¿^W»NÔEk<‘2Y(Õ;=ýSò„çâÜÒvÈÒ¾¨µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é› £ûªu³~¼ÆùÏFÚÙäŸï„úsXÁ%0:ˆCL Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR_J'Aƒ7x-#u¥ ¼Î÷îì3â¯×wÍÃ&º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë* 5Í>HÚPY`hgxm»r'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<2X(Ô:LýRòƒçáÜ€ÒuÈѾ§µ­¥ª—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•ꛣüªv³¼ÆúÏGÚÚä ï…útY ³%0:‰C‘L Uå\d…j0p uy%|Z~£ýgã}t{xèsÙnûhZb[üR^J4A‚7w-#t¤ »Ì÷íì2â®×vÍ›Ã2º?±ì¨<¡<šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy!v~qÿk½e½^ W¹NÒEi<2W(Ó9JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣñªw³€¼ÆûÏHÚÛä¢ï†úvZ!´%0:ŠC’L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZûR]J3A7v-#s£ ºË÷ìì1â­×tÍšÃ1ºJ±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜pŸõ¦"¯å·/ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gpm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò8Iý`òçÞÜ~ÒsÈϾ¦µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒ÷†õŠÎy•뛣òªk³¼ÆüÏIÚÝä£ïˆúw\"µ%0ö9‹C“L Uç\d†j1p u y&|Z~£ýgã}s{xçsØnúhXbþZûR\J2A7„-#r¢ ¸Ê÷ëì0â¬×sÍ™Ã0ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜pŸö¦#¯æ·0ÁïÊÕ„ß3ê õô Ì| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy!v}qlÅe¼^ W·NÐEg<2U(Ñ6Hý_òçíÜ}ÒrÈξ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9~C”L Uè\d‡j1p u y&|Z~£ýhâ}s{xæs×nùhWbýZúR[J1AŽ7‚-"#q¡ ·É÷êì.â«×r͘Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·1ÁðÊÕ…ß4ê õùÿõ Í} ï*5Ñ>HÞP Y`agrm¶r#w·z_}îÐÃ~É|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð5Gý^òŽçëÜ‹ÒqÈ;¤µ­¥¨—(‘Œâ‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7-!#Ÿ ¶È÷éì-âª×qÍ—Ã.ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’ ˜rŸø¦$¯è·2ÁñÊÕ†ß6êõúÿç Ï~ ð*5Ò>HßP Y‘`bgrm¶r$w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Ï4Fý\òçêÜŠÒ~È̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼ýÅðÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUé\dˆj3p u y&|[~£ýhå}w{xåsÖnøhVbüZøRYJ/AŒ7€- #~® µÇ÷èì,â¨×pÍ–Ã-ºG±ó¨B¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕ‡ß7êõûÿè À ñ*5Ó>HàP Y‘`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Î3Eý[ò‹çé܉Ò}ÈÙ¾¢µ­¥¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅñÏ>Úáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖn÷hUbûZ÷RXJ.A‹7-#}­ ÄÅ÷æì+â§×oÍ•Ã,ºF±ò¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕˆß8êõüÿé Áq ó*5Ô>HáP Y’`cgtm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2P(Ì2CýZòŠçè܈Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•÷ªp³y¼ÿÅòÏ?Úâä©ïú}a(»%0û9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-A‰7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã+ºE±ò¨A¡Ašÿ“ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ë·5ÁôÊÕŠß9êõþÿê Âr å*5Õ>HâPY“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÂ^W¿NÙEp<ˆ2O(Ë1BýYò‰çç܆Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³z¼ÆóÏ@ÚÔäªïú~c)¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÝnöhTbùZõRVJ,Aˆ7}-#z« ÁÓ÷ôì)â¥×mÍ“Ã*ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁõÊÕ‹ß:êõÿÿë Ãs æ*5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÂ^W¾NØEo<•2N(Ê/AýXòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³{¼ÆõÏAÚÕä›ïúd*½% 0ý9„CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnÿhSbùZôRUJ+A‡7|-#yª ÀÒ÷óì7â¤×lÍ’Ã)ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõì Åt ç* 5É>!HãPY•`fgum¹r&w´z]}îÑÄ~È|åyvzqlÀeÁ^W½N×En<”2\(É .@ýWò‡çåÜ„ÒyÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³|¼ÆöÏCÚÖäœïú€e+¾% 0þ9…CŽLUâ\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZóRTJ*A†7{-#x¨ ¿Ñ÷òì6â²×kÍ‘Ã(ºB±ï¨>¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯à·*Á÷ÊÕß<êõî Æu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~Ë|äyvyqlÀeÀ^W¼NÖEm<“2[(× -?ýUò†çä܃ÒxÈÔ¾ªµ ­¥­ —$‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äï‚úqf,À% 0ÿ9†CL Uã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRSJ)A…7z-#w§ ¾Ð÷ðì5â±×xÍÃ'ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁêÊÕŽß>êõï Çv é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvyql¿e¿^W»NÕEl<’2Z(Ö,>ýTò„çâÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³~¼ÆøÏEÚØäŸïƒúrW-Á% 0:‡CL Uä\dƒj/puy%|\~¤ýgã}t{xésÚnýh[b[þRRJ(A„7y-#v¦ ½Î÷ïì4â°×wÍÃ&º@±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…܈IŒ’œ˜nŸó¦¯â·,ÁëÊ Õß?êõð Èw ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍw•é›!£üªv³¼ÆùÏFÚÙä ï„útXÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR^J'Aƒ7x-#u¥ ¼Í÷îì3â¯×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë*5Í>HÛPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vqÿk¾e¾^ W¹NÓEj<2X(Ô:KýRò‚çàÜ€ÒuÈѾ§µ­¥ª—*‘ŒÞ‡‰„‚˜€€]€¥Úƒö†ôŠÍx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR]J4A‚7v-#t¤ ºÌ÷íì1â®×uÍ›Ã2ºK±ì¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚M…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß1êõò Êz ì*5Î>HÜPYŽ``gxm»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEi<2W(Ó8JýaòçßÜÒsÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0:ŠC“L Uæ\d…j0p u y%|Z~£ýgã}s{xçsØnûhYbÿZûR\J3A7u-#r£ ¹Ë÷ìì0â­×tÍšÃ1ºJ±ö¨;¡;šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’Ÿ˜pŸö¦"¯å·/ÁîÊÕƒß2ê õó Ë{ í*5Ï>HÜP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEh<Ž2U(Ò7Iý`òçÞÜ~ÒrÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏy•뛣òªl³‚¼ ÆüÏIÚÝä£ïˆúw\"¶%0ö9‹C”L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR\J2AŽ7ƒ-#q¡ ¸Ê÷ëì/â«×sÍ™Ã0ºI±ö¨E¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸ÷¦#¯æ·0ÁïÊÕ„ß4ê õøÿõ Í| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅe»^ W·NÐEg<2T(Ñ6Hý^òŽçìÜ}ÒqÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªm³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9C•LUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùR[J1A7‚-"#p  ·É÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦$¯ç·1ÁðÊÕ…ß5ê õùÿæ Î} ð*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|çy v}qlÄeÅ^ W¶NÏEf<Œ2S(Ï5Gý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªn³v¼ýÅþÏLÚßä¥ïŠúy^$¸%0ù9€C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhVbüZùRZJ0AŒ7-!#Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”‚Žß‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁñÊÕ‡ß6êõúÿç ¿~ ñ*5Ò>HßP Y‘`bgrm¶r$w³z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Î4Eý\òŒçê܉Ò~È̾¢µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼þÅñÏMÚàä§ï‹ú{_&¹%0ú9CŠLUê\dˆj3p u y&|[~£ýhå}v{!xåsÖnøhVbüZøRYJ/A‹7€- #~® µÆ÷çì,â¨×pÍ–Ã-ºG±ó¨B¡Bš”ˆŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦&¯é·3ÁòÊÕˆß7êõüÿè Àp ò*5Ó>HàP Y’`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÀNÍEd<Š2Q(Í3Dý[ò‹çé܈Ò}ÈÙ¾¡µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼ÿÅòÏ>Úáä¨ïú|a'º%0û9‚CŠLUß\d‰j3p u y'|[~£ýhå}v{!xìsÖn÷hUbûZ÷RXJ.AŠ7-#|­ ÃÅ÷æì+â§×oÍ•Ã,ºF±ò¨A¡Bš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦&¯ê·4ÁôÊÕ‰ß8êõýÿé Áq ä*5Ô>HáP Y’`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEc<ˆ2P(Ì1CýZòŠçè܇Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Üƒù†øŠÑ}•÷ªp³y¼ÆóÏ@ÚÓä©ïŽú}b(»%0ü9ƒC‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÝn÷hTbúZöRWJ-A‰7~-#{¬ ÂÔ÷åì*â¦×nÍ”Ã+ºE±ñ¨A¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆFŠ’™˜jŸï¦'¯ë·5ÁõÊÕŠß9êõþÿê Ãr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÃ~È|åyv{qlÂeÂ^W¿NØEp<‡2O(Ë0BýYò‰çç܆Ò{È×¾­µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)½% 0ý9„CŒLUá\dj4p u y'|[~¤ýhä}v{ xësÜnÿhSbùZõRVJ,Aˆ7}-#zª ÁÓ÷ôì(â¥×mÍ“Ã*ºD±ð¨@¡@šÿ“‡Žã‰†8ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Äs æ* 5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W¾N×Eo<•2N(Ê/AýWòˆçæÜ…ÒyÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†ùŠÒ~•ð›£ùªr³{¼ÆõÏBÚÕä›ï€úd*¾% 0þ9…CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7|-#y© ÀÒ÷òì7â¤×lÍ’Ã)ºC±ð¨?¡?šþ“†Žã‰†8ƒ>/€€ä€£‚L…ÚˆG‹’›˜lŸñ¦¯à·7Á÷ÊÕŒß<êõí Åt ç* 5É>!HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÁ^W½NÖEn<”2\(É .@ýVò†çäÜ„ÒxÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Ùƒô†óŠÓ•ñ›£ùªs³|¼ÆöÏCÚÖäïúpe+¿% 0ÿ9†CŽLUã\d‚j.pu y(|\~¤ýgä}u{xêsÛnþh\b[óRTJ*A†7z-#x¨ ¿Ð÷ñì6â²×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯á·*ÁøÊÕß=êõî Æu è* 5Ê>HåPY–`fgvm¹r&wµz^}îÑÄ~Ë|äyvyql¿eÀ^W¼NÕEm<“2[(× ->ýUò…çã܃ÒwÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äžïƒúrV,À% 0:‡CL Uä\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[þRSJ)A…7y-#w§ ¾Ï÷ðì5â±×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†8ƒ=0€€ä€£‚M…ÛˆHŒ’œ˜mŸó¦¯â·+ÁêÊÕŽß>êõï Çw é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÔEl<’2Z(Ö,=ýTò„çâÜ‚ÒvÈÓ¾©µ ­¥¬ —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÌw•ó› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnüh[b[þR_J(A„7x-#v¦ ¼Î÷ïì3â°×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€ä€£‚M…܈I’˜nŸó¦¯â·,ÁëÊÕß?êõð Èx ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEk<‘2X(Õ:<ýSòƒçáÜÒuÈÒ¾¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:‰C‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J5Aƒ7w-#t¥ »Í÷îì2â®×vÍœÃ3º?±ì¨<¡=šû“„Žá‰†7ƒ=0€€â€¤‚M…܈J’˜oŸô¦ ¯ã·-ÁìÊÕß@êõñ Éy ì*5Í>HÛPY`hgxm»r(w¶z^}îÐÄ~Ê|èy"vqÿk½e½^ W¹NÒEi<2W(Ô9KýRò‚çàÜ€ÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†ôŠÎx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:ŠC’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYbÿZüR]J4A7v-#s£ ºÌ÷íì1â­×uÍ›Ã2ºK±ë¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚N…݈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß2êõó Ëz í*5Î>HÜPYŽ``gym»r(w¶z_}îÐÄ~Ê|çy!v~ql½e½^ W¸NÒEh<2V(Ó8Jý`òçßÜ~ÒsÈ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0ö9‹C“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbÿZûR\J3A7„-#r¢ ¹Ë÷ëì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…݈KŽ’Ÿ˜pŸö¦"¯å·/ÁïÊÕ„ß3ê õô Ì{ î*5Ï>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEg<2U(Ñ7Hý_òçÞÜ}ÒrÈϾ¥µ­¥©—(‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏz•뛣óªl³‚¼ ÆüÏJÚÝä£ïˆúw\#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xçsØnúhXbþZúR[J2AŽ7ƒ-##q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡;šú“‚Žß‰†6ƒ=0€€ã€¡‚J…؈K’Ÿ˜qŸ÷¦#¯æ·0ÁðÊÕ…ß4ê õøÿõ Í| ï*5Ð>HÞP Y`agqmµr)w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÐEf<Œ2T(Ð6Gý^òŽçìÜ|ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Úƒ÷†öŠÏz•웣ôªm³u¼ ÆþÏKÚÞä¥ïŠúy]$·%0ø9CˆLUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ1A7‚-!#€  ·È÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈D’ ˜rŸø¦$¯ç·1ÁñÊÕ†ß5ê õúÿæ Î} ð*5Ò>HßP Y`bgrm¶r#w·z_}îÐÃ~É|æy v}qlÄeÅ^WµNÏEe<‹2S(Ï5Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣ôªn³v¼ýÅÿÏLÚßä¦ï‹úz_%¸%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæs×nøhVbüZøRYJ0AŒ7- #~Ÿ µÇ÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸù¦%¯è·2ÁòÊÕ‡ß6êõûÿç ¿~ ñ*5Ó>HßP Y‘`bgsm¶r$w³z`}îÐÃ~É|æyv|qlÄeÄ^WÁNÎEd<Š2R(Î3Eý\òŒçê܉Ò}È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ|•õªo³w¼þÅñÏMÚáä§ïŒú{`&¹%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ/A‹7€-#}® ´Æ÷çì+â¨×pÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜sŸù¦&¯é·3ÁóÊÕˆß7êõüÿè Áp ò*5Ô>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2Q(Í2Dý[ò‹çé܈Ò|ÈØ¾¡µ­ÿ¤¦—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\ d‰j3p u y'|[~£ýhå}v{!xësÕn÷hUbûZöRWJ.AŠ7~-#|¬ ÃÅ÷æì*â§×nÍ•Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸú¦'¯ê·4ÁôÊÕ‰ß9êõýÿê Âq ä*5Õ>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEp<ˆ2P(Ì1CýYòŠçç܇Ò{È×¾­µ­þ¤¥—&‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{!xësÝnöhTbúZöRWJ-A‰7}-#{« ÂÓ÷åì)â¦×mÍ”Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’™˜jŸð¦(¯ë·5ÁõÊÕŠß:êõþÿë Ãr å*5Ö>HâPY“`egtm¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2N(Ë0AýXòˆçæÜ†ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ}•ð›£øªr³z¼ÆôÏAÚÔä›ïú~c)½% 0ý9„CLUá\dj-p u y'|\~¤ýhä}u{ xêsÜnÿhSbùZõRVJ,Aˆ7|-#zª ÁÒ÷óì(â¤×lÍ“Ã*ºC±ð¨@¡@šþ“‡Žã‰†8ƒ</€€ä€£‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Ät æ* 5É> HãPY”`egum¸r&w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<•2](É/@ýWò‡çåÜ…ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªr³{¼ÆõÏBÚÖäœïú€d+¾% 0þ9…CŽLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7{-#y© ÀÑ÷òì6â£×kÍ’Ã)ºC±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·7Á÷ÊÕß<êõí Åu ç* 5Ê>HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<”2[(Ø .?ýVò†çäÜ„ÒxÈÔ¾ªµ ­¥­—$‘Œà‡‹„‚˜€€\€¥Ùƒõ†óŠË•ñ›£úªs³|¼ÆöÏCÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.pu y(|\~¤ýgä}u{xésÛnþh\b[óRTJ*A†7z-#x¨ ¾Ð÷ñì5â±×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’›˜mŸò¦¯á·*ÁøÊÕŽß=êõî Æv é* 5Ë>HØPY–`ggvm¹r&wµz^}îÐÄ~Ë|äyvyql¿eÀ^W¼NÕEl<“2Z(×,>ýUò…çã܃ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy(|\~¤ýgã}u{xésÚnýh[b[þRSJ)A…7y-#v§ ½Ï÷ðì4â°×xÍÃ'ºA±î¨=¡>šý“…Žá‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·,ÁëÊÕß>êõï Èw ê* 5Ì>HÙPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¿e¿^W»NÔEk<‘2Y(Ö;=ýTò„çâÜÒvÈÒ¾¨µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uå\d„j/p uy%|\~¤ýgã}t{xèsÚnühZb[ýR_J(A„7x-#u¥ ¼Î÷ïì3â¯×wÍÃ&º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß?êõñ Éx ë* 5Í>HÚPY`hgwm»r'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<2X(Ô:LýRòƒçáÜ€ÒuÈѾ¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•難üªv³¼ÆúÏGÚÚä ï…útY³%0:‰C‘L Uå\d…j0p uy%|Z~¤ýgã}t{xèsÙnühZb[üR^J4Aƒ7w-#t¤ »Í÷íì2â®×vÍœÃ2º?±ì¨<¡<šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy!vqÿk½e½^ W¹NÒEi<2W(Ó9Jýaò‚çàÜÒtÈо§µ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎx•ꛣýªw³€¼ÆûÏHÚÛä¢ï†úuZ!´%0:ŠC’L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZüR]J3A7v-#s£ ºË÷ìì1â­×uÍ›Ã1ºK±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜pŸõ¦"¯å·/ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gpm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò8Iý`òçÞÜ~ÒsÈϾ¦µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆüÏIÚÜä£ïˆúw["µ%0ö9‹C“L Uç\d†j1p u y&|Z~£ýgã}s{xçsØnúhXbþZûR\J2A7„-#r¢ ¹Ê÷ëì0â¬×tÍšÃ0ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…׈K’Ÿ˜pŸö¦"¯æ·0ÁïÊÕ„ß3ê õô Ì{ î*5Ð>HÝP Y`agqmµr(w¶z_}îÐÃ~Ê|çy!v}qlÅe¼^ W·NÐEg<2U(Ñ7Hý_òçíÜ}ÒrÈξ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³‚¼ ÆýÏJÚÞä¤ï‰úx]#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xæsØnúhWbþZúR[J1AŽ7ƒ-"#q¡ ·É÷êì/â«×rÍ™Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·1ÁðÊÕ…ß4ê õùÿõ Í} ï*5Ñ>HÞP Y`agrmµr#w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð5Gý^òŽçìÜ‹ÒqÈ;¤µ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³v¼ ÆþÏKÚßä¥ïŠúy^$¸%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7-!#  ¶È÷éì-âª×qÍ—Ã.ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’ ˜rŸø¦$¯è·2ÁñÊÕ†ß5ê õúÿæ Î~ ð*5Ò>HßP Y‘`bgrm¶r#w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2S(Ï4Fý\òçêÜŠÒ~È̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣õªn³w¼ýÅÿÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xåsÖnøhVbüZøRYJ/AŒ7€- #~® µÇ÷èì,â©×pÍ–Ã-ºG±ó¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕ‡ß7êõûÿè À ñ*5Ó>HàP Y‘`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Î3Eý[ò‹çé܉Ò}È˾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ.A‹7-#}­ ÄÆ÷æì+â§×oÍ•Ã,ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕˆß8êõüÿé Áp ò*5Ô>HáP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2P(Í2CýZòŠçè܈Ò|ÈØ¾¡µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³y¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-AŠ7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã+ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ê·5ÁôÊÕŠß9êõýÿê ×þ®ýr „üä*[û52úÕ> ùHà÷âP¶ö Yõ“`dôdg;ótmò¸rèð%w¿ï³z–î]}míCìîëÐñéÃ~ÈèÈ|ŸçåyuævLå{q#älúâÂeÑáÂ^§àW~ß¿NUÞÙE,Ýp<܈2ÙÚO(°ÙˇØ^×15ÖBý ÕYòâÓ‰ç¹ÒçÜчÒgÐ{È=Ï×¾έµëÌ­ÂËþ¤™Ê¥oÉ—FÈ%‘ÇŒôÅá‡ÊÄ‹„¡Ã‚x™€OÁ€&À\€ü¾¤Ó½Øƒª¼ù†»øŠXºÒ.¹}•¸ï›Ü¶£³µ÷ªŠ´q³`³z¼7²Æ±óÏå¯@Ú¼®Ôä’­ªïi¬ú@«~ªbî¨)ħ¼%›¦ 0r¥ü9I¤ƒC£ŒLö¡UÍ á\¤Ÿd{žjQ4p(œ uÿš yÖ™'|­˜[~ƒ—£Z–ý1•h”ä}ß’v{µ‘ xŒëscÝn:ŽöhTbç‹ùZ¾ŠõR•‰VJlˆ,AC‡‰7†}-ð„#ǃ{ž‚« uÂK€Ó÷à€ôì ‚)â2ƒ¥×\„mÍ……“î†+º×‡D±‰ñ¨*Š@¡S‹@š|Œÿ“¥‡ŽÎŽã‰ø†!‘5ƒJ’£± H̲âPõ³Yµ”`G¶egq·umš¸¸rù%w캴z¼]}?½h¾î‘¿ÑºÀÂ~ãÁÈ| Ãåy6Äv_ÅzqˆÆl±ÇÁeÛÈÂ^ÊW-˾NVÌØE€Ío<©Î•2ÒÏN(ûÐÊ$ÒNÓ0wÔAý ÕXòÉÖˆçò׿ÜÙ…ÒEÚzÈnÛÖ¾—ܬµÀÝ ­êÞý¤à¤<á—eâ%‘ŽãŒ¸äá‡áå‹„ ç‚3虀\逆ê\€¯ë¤Øì؃îô†+ïøŠTðÒ}ñ~•¦òð›Ïó£ùôøª"ör³K÷z¼tøÆùôÏÇúAÚðûÕäý›ïBþúkÿd*½% 0ý9„CLUâ\dj-p u y(|\~¤ýhä}u{ xêsÜnÿhSbùZôRUJ+A‡7|-#yª ÀÒ÷óì7â¤×lÍ’Ã*ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõì Ät ç* 5É> HãPY”`egum¹r&w´z]}îÑÄ~È|åyvzqlÀeÁ^W½N×En<”2\(É.@ýWò‡çåÜ„ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³{¼ÆöÏBÚÖäœïú€e+¾% 0þ9…CŽLUâ\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZôRTJ*A†7{-#x© ¿Ñ÷òì6â²×kÍ‘Ã)ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·*Á÷ÊÕß<êõí Æu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<“2[(Ø -?ýVò†çä܃ÒxÈÔ¾ªµ ­¥­—$‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ñ›£úªt³|¼Æ÷ÏDÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRSJ)A…7z-#w§ ¾Ð÷ñì5â±×yÍÃ(ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁêÊÕŽß=êõï Çv é* 5Ë>HÙPY–`ggvmºr&wµz^}îÐÄ~Ë|äyvyql¿e¿^W»NÕEl<’2Z(Ö,>ýTò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³}¼ÆøÏEÚØäžïƒúrW-Á% 0:‡CL Uä\dƒj/puy$|\~¤ýgã}t{xésÚnýh[b[þRRJ(A„7y-#v¦ ½Î÷ïì4â°×wÍÃ'º@±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…܈IŒ’œ˜nŸó¦¯â·,ÁëÊ Õß?êõð Èw ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èyvxql¾e¿^WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é›!£üªv³~¼ÆùÏFÚÙä ï„úsXÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR^J'Aƒ7x-#u¥ ¼Í÷îì3â¯×vÍœÃ3º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë*5Í>HÛPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vxqÿk¾e¾^ W¹NÓEj<2X(Ô:KýRò‚çàÜ€ÒuÈѾ§µ­¥ª—*‘Œß‡Š„‚˜€€]€¥Úƒö†ôŠÍx•ꛣýªw³¼ÆúÏGÚÚä¡ï†úuY ³%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR^J4A‚7w-#t¤ »Ì÷íì2â®×uÍ›Ã2ºK±ì¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚M…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß1êõò Êz ì*5Î>HÛPYŽ`_gxm»r(w¶z_}îÐÄ~Ê|èy!v~qÿk½e½^ W¸NÒEi<2W(Ó9JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣñªw³€¼ÆûÏHÚÜä¢ï‡úv[!µ%0:ŠC“L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZûR]J3A7u-#s£ ¹Ë÷ìì0â­×tÍšÃ1ºJ±÷¨;¡<šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’ž˜pŸö¦"¯å·/ÁîÊÕƒß2êõó Ë{ í*5Ï>HÜP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò7Iý`òçÞÜ~ÒsÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒ÷†õŠÎy•뛣òªl³¼ ÆüÏIÚÝä£ïˆúw\"¶%0ö9‹C“L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR\J2A7ƒ-#q¢ ¸Ê÷ëì/â¬×sÍ™Ã0ºI±ö¨E¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸö¦#¯æ·0ÁïÊÕ„ß3ê õô Ì| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅe»^ W·NÐEg<2T(Ñ6Hý^òçìÜ}ÒrÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9C”LUè\d‡j2p u y&|Z~£ýhå}s{xæs×nùhWbýZúR[J1A7‚-"#p  ·É÷êì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦$¯ç·1ÁðÊÕ…ß5ê õùÿö Î} ï*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|çy v}qlÅeÅ^ W¶NÏEf<Œ2S(Ð5Gý]òçëÜ‹ÒpÈ;£µ­¥§—(‘Œâ‡„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªm³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ø9€C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhVbýZùRZJ0AŒ7-!#Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºH±ô¨C¡Cš”‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’¡˜rŸø¦$¯è·2ÁñÊÕ†ß6êõúÿç Ï~ ñ*5Ò>HßP Y‘`bgrm¶r$w³z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Î4Eý\òŒçêÜŠÒ~È̾¢µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼ýÅðÏMÚàä¦ï‹úz_&¹%0ù9C‰LUê\dˆj3p u y&|[~£ýhå}v{"xåsÖnøhVbüZøRYJ/A‹7€- #~® µÆ÷çì,â¨×pÍ–Ã-ºG±ó¨B¡Bš”ˆŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕˆß7êõûÿè À ò*5Ó>HàP Y’`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Í3Dý[ò‹çé܈Ò}ÈÙ¾¢µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅòÏ>Úáä¨ïú|`'º%0ú9CŠLUß\d‰j3p u y'|[~£ýhå}v{!xìsÖn÷hUbûZ÷RXJ.AŠ7-#}­ ÄÅ÷æì+â§×oÍ•Ã,ºF±ò¨A¡Bš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕ‰ß8êõýÿé Áq ó*5Ô>HáP Y’`dgtm·r$w³z]}îÐÃ~É|æyv{qlÂeÃ^WÀNÙEc<‰2P(Ì2CýZòŠçè܇Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Üƒù†øŠÑ}•÷ªp³y¼ÆóÏ?ÚÓä©ïŽú}b(»%0ü9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÝn÷hTbúZöRWJ-A‰7~-#{¬ ÂÔ÷åì*â¦×nÍ”Ã+ºE±ñ¨A¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÙˆFŠ’™˜jŸï¦'¯ë·5ÁôÊÕŠß9êõþÿê Âr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÃ~È|åyv{qlÂeÂ^W¿NØEp<‡2O(Ë0BýYò‰çç܆Ò{È×¾­µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)¼% 0ý9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÜnÿhSbùZõRVJ,Aˆ7}-#z« ÁÓ÷ôì)â¥×mÍ“Ã*ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß:êõÿÿë Äs æ* 5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W¾N×Eo<•2N(Ê/AýXòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†ùŠÒ~•ð›£øªr³{¼ÆõÏBÚÕä›ï€úd*½% 0þ9„CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7|-#y© ÀÒ÷òì7â¤×lÍ’Ã)ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’›˜kŸñ¦¯ß·7Á÷ÊÕŒß<êõí Åt ç* 5É>!HäPY•`fgum¹r&w´z]}îÑÄ~È|äyvzqlÀeÁ^W½NÖEn<”2\(É .@ýVò‡çåÜ„ÒyÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†óŠÓ•ñ›£ùªs³|¼ÆöÏCÚÖäœïúpe+¿% 0ÿ9…CŽLUã\d‚j.pu y(|\~¤ýgä}u{xêsÛnþh\b[óRTJ*A†7{-#x¨ ¿Ð÷ñì6â²×kÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯à·*ÁøÊÕß=êõî Æu è* 5Ê>HåPY•`fgvm¹r&wµz^}îÑÄ~Ë|äyvyqlÀeÀ^W¼NÖEm<“2[(× ->ýUò…çã܃ÒxÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äžï‚úqV,À% 0:†CL Uã\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[ÿRSJ)A…7y-#w§ ¾Ï÷ðì5â±×xÍÃ'ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚M…ÛˆHŒ’œ˜mŸó¦¯á·+ÁêÊÕŽß>êõï Çv é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÕEl<’2Z(Ö,=ýTò„çâÜ‚ÒvÈÓ¾©µ ­¥¬ —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³~¼ÆøÏEÚÙäŸï„úsWÁ%0:‡CL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnüh[b[þRRJ(A„7x-#v¦ ½Î÷ïì4â°×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€ä€£‚M…܈I’˜nŸó¦¯â·,ÁëÊÕß?êõð Èx ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒuÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR^J'Aƒ7w-#u¥ »Í÷îì2â¯×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜oŸô¦ ¯ã·-ÁìÊÕß@êõñ Éy ë*5Í>HÛPY`hgxm»r'w¶z^}îÐÄ~Ê|èy"vqÿk½e¾^ W¹NÓEj<2W(Ô9KýRò‚çàÜ€ÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†ôŠÎx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR]J4A‚7v-#s¤ ºÌ÷íì1â­×uÍ›Ã2ºK±ë¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚N…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß2êõò Ëz í*5Î>HÜPYŽ``gxm»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEi<2V(Ó8Jý`òçßÜÒsÈ­¥©—)‘Œä‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0ö9ŠC“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbÿZûR\J3A7u-#r¢ ¹Ë÷ìì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’Ÿ˜pŸö¦"¯å·/ÁîÊÕƒß3ê õô Ì{ î*5Ï>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEh<Ž2U(Ò7Iý_òçÞÜ~ÒrÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏz•뛣óªl³‚¼ ÆüÏIÚÝä£ïˆúw\"¶%0÷9~C”L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR[J2AŽ7ƒ-#q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡;šú“ƒŽß‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸ÷¦#¯æ·0ÁïÊÕ…ß4ê õøÿõ Í| ï*5Ð>HÞP Y`agqmµr)w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÐEg<2T(Ð6Gý^òŽçìÜ|ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Úƒ÷†öŠÏz•웣óªm³u¼ ÆýÏKÚÞä¥ï‰úx]$·%0ø9C•LUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ1A7‚-"#p  ·È÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈D’ ˜rŸø¦$¯ç·1ÁñÊÕ†ß5ê õùÿæ Î} ð*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|æy v}qlÄeÅ^WµNÏEe<‹2S(Ï5Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªn³v¼ýÅÿÏLÚßä¦ï‹úz^%¸%0ù9€C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nøhVbüZøRYJ0AŒ7- #Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”Žß‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁòÊÕ‡ß6êõûÿç ¿~ ñ*5Ò>HßP Y‘`bgsm¶r$w³z`}îÐÃ~É|æyv|qlÄeÄ^WÁNÎEd<Š2R(Î4Eý\òŒçê܉Ò~È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ{•õªo³w¼þÅñÏMÚáä§ïŒú{`&¹%0ú9CŠLUê\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RYJ/A‹7€-#}® ´Æ÷çì,â¨×pÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦&¯é·3ÁóÊÕˆß7êõüÿè Áp ò*5Ó>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv|qlÃeÄ^WÀNÚEc<‰2Q(Í2Dý[ò‹çé܈Ò|ÈÙ¾¡µ­ÿ¤¦—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'º%0û9‚C‹LUà\d‰j3p u y'|[~£ýhå}v{!xësÕn÷hUbûZ÷RXJ.AŠ7-#|¬ ÃÅ÷æì*â§×oÍ•Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦'¯ê·4ÁôÊÕ‰ß8êõýÿê Âq ä*5Ô>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEp<ˆ2P(Ì1CýYòŠçè܇Ò{ÈØ¾­µ­þ¤¥—&‘Œá‡‹„‚™€€\€¤Øƒù†øŠÑ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUà\d‰j4p u y'|[~£ýhä}v{!xësÝnöhTbúZöRWJ-A‰7~-#{« ÂÔ÷åì)â¦×nÍ”Ã+ºE±ñ¨@¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆGŠ’™˜jŸï¦'¯ë·5ÁõÊÕŠß:êõþÿë Ãr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2O(Ë0BýXò‰çæÜ†ÒzÈÖ¾¬µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)½% 0ý9„CLUá\dj4p u y'|[~¤ýhä}u{ xêsÜnÿhSbùZõRVJ,Aˆ7|-#zª ÁÒ÷óì(â¥×lÍ“Ã*ºD±ð¨@¡@šÿ“‡Žã‰†8ƒ</€€ä€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Äs æ* 5É> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<•2](Ê/@ýWò‡çåÜ…ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†ùŠÓ~•ð›£ùªr³{¼ÆõÏBÚÕäœï€úd*¾% 0þ9…CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7{-#y© ÀÑ÷òì7â£×kÍ’Ã)ºC±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÚˆH‹’›˜lŸñ¦¯à·7Á÷ÊÕŒß<êõí Åu ç* 5Ê>HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÀ^W½NÖEm<”2\(Ø .?ýVò†çäÜ„ÒxÈÔ¾ªµ ­¥­—$‘Œà‡‹„‚˜€€\€¤Ùƒõ†óŠÓ•ñ›£úªs³|¼ÆöÏCÚ×äï‚úqe,¿% 0ÿ9†CŽLUã\dƒj.pu y(|\~¤ýgä}u{xésÛnþh\b[óRTJ*A†7z-#x¨ ¿Ð÷ñì5â²×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’›˜lŸò¦¯á·*ÁøÊÕŽß=êõî Æv è* 5Ë>HØPY–`ggvm¹r&wµz^}îÑÄ~Ë|äyvyql¿eÀ^W¼NÕEl<“2Z(×->ýUò…çã܃ÒwÈÓ¾ªµ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj.puy(|\~¤ýgä}u{xésÚnýh[b[þRSJ)A…7y-#v§ ½Ï÷ðì4â°×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·+ÁêÊÕß>êõï Çw ê* 5Ì>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¿e¿^W»NÔEk<’2Y(Ö;=ýTò„çâÜ‚ÒvÈÒ¾©µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•ó› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnühZb[ýR_J(A„7x-#u¦ ¼Î÷ïì3â¯×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·,ÁìÊÕß?êõð Éx ë* 5Í>HÚPY`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<‘2X(Õ:<ýSòƒçáÜ€ÒuÈѾ¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:‰C‘L Uå\d„j0p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J4Aƒ7w-#t¤ »Í÷îì2â®×vÍœÃ2º?±ì¨<¡=šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’˜oŸô¦!¯ä·-ÁíÊÕß@êõò Êy ì*5Î>HÛPY`_gxm»r(w¶z^}îÐÄ~Ê|èy"vqÿk½e½^ W¹NÒEi<2W(Ó9KýQò‚çàÜÒtÈо§µ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎx•ꛣýªw³€¼ÆûÏHÚÛä¡ï†úuZ ´%0:ŠC’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYbÿZüR]J3A7v-#s£ ºË÷ìì1â­×uÍ›Ã1ºK±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜pŸõ¦!¯å·.ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gpm»r(w¶z_}îÐÄ~Ê|çy!v~ql½e½^ W¸NÑEh<Ž2V(Ò8Iý`ò€çßÜ~ÒsÈϾ¦µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆüÏIÚÜä£ï‡úv["µ%0ö9‹C“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbþZûR\J2A7„-#r¢ ¹Ê÷ëì0â¬×tÍšÃ0ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…׈K’Ÿ˜pŸö¦"¯æ·/ÁïÊÕ„ß3ê õô Ì{ î*5Ð>HÝP Y`agqmµr(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÐEg<2U(Ñ7Hý_òçÝÜ}ÒrÈξ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³‚¼ ÆýÏJÚÝä¤ï‰úx\#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xçsØnúhWbþZúR[J1AŽ7ƒ-"#q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·0ÁðÊÕ…ß4ê õùÿõ Í| ï*5Ñ>HÞP Y`agrmµr#w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð6Gý^òŽçìÜ|ÒqÈ;¤µ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³u¼ ÆþÏKÚßä¥ïŠúy^$·%0ø9CˆLUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7‚-!#  ¶È÷éì.âª×q͘Ã/ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈E‡’ ˜rŸø¦$¯ç·2ÁñÊÕ†ß5ê õúÿæ Î~ ð*5Ò>HßP Y‘`bgrm¶r#w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2S(Ï4Fý]òçëÜŠÒpÈ̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣õªn³v¼ýÅÿÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæsÖnøhVbüZøRYJ/AŒ7€- #~® µÇ÷èì,â©×pÍ—Ã.ºG±ó¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…؈Eˆ’˜˜sŸù¦%¯è·3ÁòÊÕ‡ß6êõûÿè À ñ*5Ó>HàP Y‘`cgsm¶r$w³z`}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2R(Î3Eý[òŒçé܉Ò}È˾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ|•õªo³w¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ.A‹7-#}­ ÄÆ÷çì+â¨×oÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯é·4ÁóÊÕˆß8êõüÿé Áp ò*5Ô>HáP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2P(Í2DýZòŠçè܈Ò|ÈØ¾¡µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\ d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-AŠ7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ê·5ÁôÊÕ‰ß9êõýÿê Âq ä*5Õ>HáP Y“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÃ^W¿NÙEp<ˆ2O(Ì1BýYò‰çç܇Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÝnöhTbúZõRVJ,A‰7}-#{« ÂÓ÷ôì)â¥×mÍ“Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’š˜jŸð¦¯ë·6ÁõÊÕ‹ß:êõÿÿë Ãs å*5Ö>HâPY”`egum¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2N(Ê0AýXòˆçæÜ†ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³z¼ÆôÏAÚÕä›ïúc*½% 0ý9„CLUá\dj-p u y'|\~¤ýhä}u{ xêsÜnÿhSbùZõRUJ+Aˆ7|-#zª ÁÒ÷óì7â¤×lÍ’Ã*ºC±ð¨?¡@šþ“‡Žã‰†8ƒ</€€ä€£‚L…ÚˆGŠ’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõì Ät ç* 5É> HãPY”`egum¹r&w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<”2\(É/@ýWò‡çåÜ„ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³{¼ÆõÏBÚÖäœïú€e+¾% 0þ9…CŽLUâ\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZôRTJ*A‡7{-#x© ¿Ñ÷òì6â²×kÍ‘Ã)ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·8Á÷ÊÕß<êõí Åu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<“2[(Ø -?ýVò†çä܃ÒxÈÔ¾ªµ ­¥­—$‘Œà‡Š„‚˜€€\€¥Ùƒõ†óŠÌ•ñ›£úªt³|¼ÆöÏCÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRSJ)A…7z-#w¨ ¾Ð÷ñì5â±×yÍÃ(ºA±î¨>¡>šý“…Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁøÊÕŽß=êõï Çv é* 5Ë>HÙPY–`ggvmºr&wµz^}îÐÄ~Ë|äyvyql¿e¿^W»NÕEl<’2Z(×,>ýTò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³}¼ÆøÏEÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy$|\~¤ýgã}t{xésÚnýh[b[þRSJ(A„7y-#v¦ ½Ï÷ïì4â°×xÍÃ'ºA±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·,ÁëÊÕß?êõð Èw ê* 5Ì>HÚPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¾e¿^WºNÔEk<‘2Y(Õ;=ýSò„çâÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é› £üªu³~¼ÆùÏFÚÙäŸï„úsXÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR_J'Aƒ7x-#u¥ ¼Í÷îì3â¯×wÍœÃ3º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë* 5Í>HÚPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vxql¾e¾^ WºNÓEj<2X(Ô:KýRò‚çàÜ€ÒuÈѾ§µ­¥ª—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•ꛣüªv³¼ÆúÏGÚÚä¡ï…útY ³%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR^J4A‚7w-#t¤ »Ì÷íì2â®×uÍ›Ã2ºK±ì¨<¡<šû“„Žá‰†7ƒ=0€€â€¡‚M…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy!v~qÿk½e½^ W¹NÒEi<2W(Ó9JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣñªw³€¼ÆûÏHÚÛä¢ï‡úv[!´%0:ŠC’L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZûR]J3A7v-#s£ ºË÷ìì1â­×tÍšÃ1ºJ±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’ž˜pŸö¦"¯å·/ÁîÊÕƒß2êõó Ë{ í*5Ï>HÜP YŽ``gqm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò8Iý`òçÞÜ~ÒsÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒ÷†õŠÎy•뛣òªk³¼ÆüÏIÚÝä£ïˆúw\"¶%0ö9‹C“L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR\J2A7ƒ-#r¢ ¸Ê÷ëì/â¬×sÍ™Ã0ºI±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸö¦#¯æ·0ÁïÊÕ„ß3ê õô Ì| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy!v}qlÅe»^ W·NÐEg<2U(Ñ6Hý_òçìÜ}ÒrÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9~C”LUè\d‡j1p u y&|Z~£ýhå}s{xæs×nùhWbýZúR[J1AŽ7‚-"#p¡ ·É÷êì.â«×r͘Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·1ÁðÊÕ…ß5ê õùÿõ Î} ï*5Ñ>HÞP Y`agrm¶r#w·z_}îÐÃ~É|çy v}qlÅeÅ^ W¶NÏEf<Œ2S(Ð5Gý]òŽçëÜ‹ÒqÈ;¤µ­¥§—(‘Œâ‡„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªm³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhWbýZùRZJ0A7-!#Ÿ ¶È÷éì-â©×qÍ—Ã.ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’ ˜rŸø¦$¯è·2ÁñÊÕ†ß6êõúÿç Ï~ ð*5Ò>HßP Y‘`bgrm¶r$w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Ï4Fý\òŒçêÜŠÒ~È̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼ýÅðÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUê\dˆj3p u y&|[~£ýhå}w{"xåsÖnøhVbüZøRYJ/A‹7€- #~® µÆ÷çì,â¨×pÍ–Ã-ºG±ó¨B¡Bš”ŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕ‡ß7êõûÿè À ò*5Ó>HàP Y’`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Í3Dý[ò‹çé܉Ò}ÈÙ¾¢µ­¥¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅñÏ>Úáä¨ïŒú{`'º%0ú9CŠLUß\d‰j3p u y'|[~£ýhå}v{!xåsÖn÷hUbûZ÷RXJ.AŠ7-#}­ ÄÅ÷æì+â§×oÍ•Ã,ºF±ò¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕ‰ß8êõýÿé Áq ó*5Ô>HáP Y’`dgtm·r$w³z]}îÐÃ~É|æyv{qlÂeÃ^WÀNÚEc<‰2P(Ì2CýZòŠçè܇Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†øŠÑ|•÷ªp³y¼ÿÅòÏ?ÚÓä©ïŽú}a(»%0û9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-A‰7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã+ºE±ò¨A¡Ašÿ“‡Žä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ë·5ÁôÊÕŠß9êõþÿê Âr å*5Õ>HâPY“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÂ^W¿NÙEp<ˆ2O(Ë1BýYò‰çç܆Ò{È×¾­µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³z¼ÆôÏ@ÚÔäšïú~c)¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÜnöhTbùZõRVJ,Aˆ7}-#z« ÁÓ÷ôì)â¥×mÍ“Ã*ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁõÊÕ‹ß:êõÿÿë Ãs æ*5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÂ^W¾NØEo<•2N(Ê/AýXòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³{¼ÆõÏBÚÕä›ï€úd*½% 0þ9„CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnÿhSbøZôRUJ+A‡7|-#y© ÀÒ÷óì7â¤×lÍ’Ã)ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõí Åt ç* 5É>!HäPY•`fgum¹r&w´z]}îÑÄ~È|äyvzqlÀeÁ^W½N×En<”2\(É .@ýVò‡çåÜ„ÒyÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³|¼ÆöÏCÚÖäœïúpe+¾% 0ÿ9…CŽLUã\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZóRTJ*A†7{-#x¨ ¿Ñ÷ñì6â²×kÍ‘Ã(ºB±ï¨>¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯à·*ÁøÊÕß=êõî Æu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~Ë|äyvyqlÀeÀ^W¼NÖEm<“2[(× -?ýUò†çä܃ÒxÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äï‚úqf,À% 0:†CL Uã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[òRSJ)A…7z-#w§ ¾Ï÷ðì5â±×xÍÃ'ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚M…ÛˆHŒ’œ˜mŸò¦¯á·+ÁêÊÕŽß>êõï Çv é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvyql¿e¿^W»NÕEl<’2Z(Ö,=ýTò„çâÜ‚ÒwÈÓ¾©µ ­¥¬ —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³~¼ÆøÏEÚØäŸïƒúrW-Á%0:‡CL Uä\d„j/puy%|\~¤ýgã}t{xésÚnýh[b[þRRJ(A„7y-#v¦ ½Î÷ïì4â°×wÍÃ&º@±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…܈IŒ’˜nŸó¦¯â·,ÁëÊ Õß?êõð Èw ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útYÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR^J'Aƒ7w-#u¥ ¼Í÷îì3â¯×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éy ë*5Í>HÛPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vqÿk¾e¾^ W¹NÓEj<2X(Ô9KýRò‚çàÜ€ÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†ôŠÍx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR]J4A‚7v-#t¤ ºÌ÷íì1â®×uÍ›Ã2ºK±ì¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚N…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß1êõò Êz ì*5Î>HÜPYŽ``gxm»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEi<2V(Ó8JýaòçßÜÒsÈ­¥©—)‘Œä‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0:ŠC“L Uç\d…j0p u y%|Z~£ýgã}s{xçsØnûhYbÿZûR\J3A7u-#r£ ¹Ë÷ìì0â¬×tÍšÃ1ºJ±ö¨;¡;šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’Ÿ˜pŸö¦"¯å·/ÁîÊÕƒß3ê õô Ì{ í*5Ï>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEh<Ž2U(Ò7Iý_òçÞÜ~ÒrÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏy•뛣òªl³‚¼ ÆüÏIÚÝä£ïˆúw\"¶%0÷9‹C”L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR[J2AŽ7ƒ-#q¡ ¸Ê÷ëì/â«×sÍ™Ã0ºI±ö¨D¡;šú“ƒŽß‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸ÷¦#¯æ·0ÁïÊÕ„ß4ê õøÿõ Í| ï*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÐEg<2T(Ñ6Hý^òŽçìÜ}ÒqÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªm³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0ø9C•LUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùR[J1A7‚-"#p  ·È÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈D’ ˜rŸ÷¦$¯ç·1ÁðÊÕ†ß5ê õùÿæ Î} ð*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|çy v}qlÄeÅ^W¶NÏEf<Œ2S(Ï5Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªn³v¼ýÅþÏLÚßä¦ïŠúy^%¸%0ù9€C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhVbüZøRZJ0AŒ7-!#Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”‚Žß‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁñÊÕ‡ß6êõûÿç ¿~ ñ*5Ò>HßP Y‘`bgsm¶r$w³z_}îÐÃ~É|æyv|qlÄeÄ^WÁNÎEe<Š2R(Î4Eý\òŒçê܉Ò~È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªo³w¼þÅñÏMÚàä§ïŒú{_&¹%0ú9CŠLUê\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhVbüZøRYJ/A‹7€-#}® µÆ÷çì,â¨×pÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦&¯é·3ÁóÊÕˆß7êõüÿè Àp ò*5Ó>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv|qlÃeÄ^WÀNÚEd<‰2Q(Í3Dý[ò‹çé܈Ò}ÈÙ¾¡µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼ÿÅòÏ?Úâä¨ïú|a'º%0û9‚C‹LUà\d‰j3p u y'|[~£ýhå}v{!xìsÕn÷hUbûZ÷RXJ.AŠ7-#|­ ÃÅ÷æì+â§×oÍ•Ã,ºF±ò¨A¡Bš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦&¯ê·4ÁôÊÕ‰ß8êõýÿé Âq ä*5Ô>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEq<ˆ2P(Ì1CýZòŠçè܇Ò|ÈØ¾­µ­þ¤¥—&‘Œá‡Œ„‚™€€\€¤Üƒù†øŠÑ}•÷ªp³y¼ÆóÏ@ÚÓä©ïŽú}b(»%0ü9ƒCŒLUà\d‰j4p u y'|[~£ýhä}v{!xësÝn÷hTbúZöRWJ-A‰7~-#{« ÂÔ÷åì)â¦×nÍ”Ã+ºE±ñ¨A¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆFŠ’™˜jŸï¦'¯ë·5ÁõÊÕŠß9êõþÿë Ãr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÂ~È|åyv{qlÂeÂ^W¾NØEp<‡2O(Ë0BýXò‰çç܆ÒzÈ×¾¬µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)½% 0ý9„CŒLUá\dj4p u y'|[~¤ýhä}v{ xësÜnÿhSbùZõRVJ,Aˆ7}-#zª ÁÓ÷óì(â¥×mÍ“Ã*ºD±ð¨@¡@šÿ“‡Žã‰†8ƒ</€€ä€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Äs æ* 5È> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W¾N×Eo<•2N(Ê/AýWò‡çåÜ…ÒyÈÖ¾¬µ ­¥£—$‘Œà‡‹„‚™€€\€¤Øƒô†ùŠÓ~•ð›£ùªr³{¼ÆõÏBÚÕä›ï€úd*¾% 0þ9…CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7{-#y© ÀÑ÷òì7â¤×kÍ’Ã)ºC±ð¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÚˆG‹’›˜lŸñ¦¯à·7Á÷ÊÕŒß<êõí Åt ç* 5É>HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÁ^W½NÖEn<”2\(É .?ýVò†çäÜ„ÒxÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Ùƒõ†óŠÓ•ñ›£ùªs³|¼ÆöÏCÚÖäïúpe+¿% 0ÿ9†CŽLUã\d‚j.pu y(|\~¤ýgä}u{xêsÛnþh\b[óRTJ*A†7z-#x¨ ¿Ð÷ñì6â²×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯á·*ÁøÊÕß=êõî Æv è* 5Ê>HØPY–`fgvm¹r&wµz^}îÑÄ~Ë|äyvyql¿eÀ^W¼NÕEl<“2[(× ->ýUò…çã܃ÒwÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[þRSJ)A…7y-#w§ ¾Ï÷ðì4â±×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·+ÁêÊÕß>êõï Çw é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÔEk<’2Y(Ö,=ýTò„çâÜ‚ÒvÈÓ¾©µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•ó› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnüh[b[þR_J(A„7x-#u¦ ¼Î÷ïì3â¯×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·,ÁëÊÕß?êõð Èx ë* 5Í>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<‘2X(Õ:<ýSòƒçáÜÒuÈÒ¾¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:‰C‘L Uå\d„j0p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J5Aƒ7w-#t¤ »Í÷îì2â®×vÍœÃ3º?±ì¨<¡=šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’˜oŸô¦ ¯ä·-ÁíÊÕß@êõò Êy ì*5Î>HÛPY`igxm»r(w¶z^}îÐÄ~Ê|èy"vqÿk½e½^ W¹NÒEi<2W(Ô9KýQò‚çàÜÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:ŠC’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYbÿZüR]J4A7v-#s£ ºÌ÷ìì1â­×uÍ›Ã2ºK±ë¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜oŸõ¦!¯ä·.ÁîÊÕ‚ß2êõó Ëz í*5Ï>HÜPYŽ``gym»r(w¶z_}îÐÄ~Ê|çy!v~ql½e½^ W¸NÑEh<Ž2V(Ò8Jý`òçßÜ~ÒsÈ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏIÚÜä¢ï‡úv[!µ%0ö9‹C“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbÿZûR\J3A7„-#r¢ ¹Ê÷ëì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…׈KŽ’Ÿ˜pŸö¦"¯å·/ÁïÊÕ„ß3ê õô Ì{ î*5Ð>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÐEg<2U(Ñ7Hý_òçÞÜ}ÒrÈϾ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏz•웣óªl³‚¼ ÆýÏJÚÝä¤ïˆúw\#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xçsØnúhXbþZúR[J1AŽ7ƒ-"#q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡:šú“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’Ÿ˜qŸ÷¦#¯æ·0ÁðÊÕ…ß4ê õùÿõ Í| ï*5Ñ>HÞP Y`agqmµr)w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð6Gý^òŽçìÜ|ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³u¼ ÆþÏKÚÞä¥ïŠúy^$·%0ø9CˆLUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7‚-!#  ·È÷éì.âª×r͘Ã/ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈E’ ˜rŸø¦$¯ç·1ÁñÊÕ†ß5ê õúÿæ Î} ð*5Ò>HßP Y`bgrm¶r#w·z_}îÐÃ~É|æy v}qlÄeÅ^WµNÎEe<‹2S(Ï4Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣ôªn³v¼ýÅÿÏLÚàä¦ï‹úz_%¸%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæsÖnøhVbüZøRYJ/AŒ7- #~¯ µÇ÷èì,â©×qÍ—Ã.ºG±ô¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜sŸù¦%¯è·2ÁòÊÕ‡ß6êõûÿç À ñ*5Ó>HàP Y‘`cgsm¶r$w³z`}îÐÃ~É|æyv|qlÃeÄ^WÁNÎEd<Š2R(Î3Eý\òŒçê܉Ò}È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ|•õªo³w¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ.A‹7-#}­ ÄÆ÷çì+â¨×oÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜sŸù¦&¯é·3ÁóÊÕˆß8êõüÿé Áp ò*5Ô>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2Q(Í2DýZò‹çè܈Ò|ÈØ¾¡µ­ÿ¤¦—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\ d‰j3p u y'|[~£ýhå}v{!xësÕn÷hUbúZöRWJ-AŠ7~-#|¬ ÃÕ÷æì*â§×nÍ•Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸú¦'¯ê·4ÁôÊÕ‰ß9êõýÿê Âq ä*5Õ>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEp<ˆ2O(Ì1CýYò‰çç܇Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{!xësÝnöhTbúZöRVJ,A‰7}-#{« ÂÓ÷ôì)â¥×mÍ”Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’™˜jŸð¦(¯ë·5ÁõÊÕŠß:êõþÿë Ãr å*5Ö>HâPY”`egum¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2N(Ê0AýXòˆçæÜ†ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³z¼ÆôÏAÚÕä›ïú~c)½% 0ý9„CLUá\dj-p u y'|\~¤ýhä}u{ xêsÜnÿhSbùZõRUJ+Aˆ7|-#zª ÁÒ÷óì(â¤×lÍ“Ã*ºC±ð¨@¡@šþ“‡Žã‰†8ƒ</€€ä€£‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕŒß;êõì Ät æ* 5É> HãPY”`egum¸r&w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<•2\(É/@ýWò‡çåÜ…ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³{¼ÆõÏBÚÖäœïú€d+¾% 0þ9…CŽLUâ\d‚j-pu y(|\~¤ýgä}u{ xêsÜnþh]bøZôRUJ*A‡7{-#y© ¿Ñ÷òì6â£×kÍ’Ã)ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·8Á÷ÊÕß<êõí Åu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<”2[(Ø -?ýVò†çäÜ„ÒxÈÔ¾ªµ ­¥­—$‘Œà‡‹„‚˜€€\€¥Ùƒõ†óŠÌ•ñ›£úªs³|¼ÆöÏCÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRTJ)A†7z-#w¨ ¾Ð÷ñì5â±×jÍÃ(ºB±î¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁøÊÕŽß=êõî Æv é* 5Ë>HÙPY–`ggvmºr&wµz^}îÐÄ~Ë|äyvyql¿e¿^W»NÕEl<’2Z(×,>ýUò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy$|\~¤ýgã}t{xésÚnýh[b[þRSJ(A…7y-#v¦ ½Ï÷ðì4â°×xÍÃ'ºA±î¨=¡>šý“…Žá‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·,ÁëÊÕß>êõð Èw ê* 5Ì>HÙPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¾e¿^W»NÔEk<‘2Y(Ö;=ýSò„çâÜÒvÈÒ¾¨µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é› £ûªu³~¼ÆùÏFÚÙäŸï„úsXÁ%0:ˆCL Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR_J'A„7x-#u¥ ¼Î÷îì3â¯×wÍÃ&º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë* 5Í>HÚPY`hgxm»r'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<2X(Ô:LýRòƒçáÜ€ÒuÈѾ§µ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•ꛣüªv³¼ÆúÏGÚÚä ï…útY ³%0:‰C‘L Uå\d…j0p uy%|Z~¤ýgã}t{xèsÙnûhZb[üR^J4A‚7w-#t¤ »Ì÷íì2â®×vÍœÃ2º?±ì¨<¡<šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy!vqÿk½e½^ W¹NÒEi<2W(Ó9JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣñªw³€¼ÆûÏHÚÛä¢ï†úvZ!´%0:ŠC’L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZûR]J3A7v-#s£ ºË÷ìì1â­×tÍšÃ1ºJ±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜pŸõ¦"¯å·/ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gpm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò8Iý`òçÞÜ~ÒsÈϾ¦µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒ÷†õŠÎy•뛣òªk³¼ÆüÏIÚÜä£ïˆúw\"µ%0ö9‹C“L Uç\d†j1p u y&|Z~£ýgã}s{xçsØnúhXbþZûR\J2A7„-#r¢ ¸Ê÷ëì0â¬×sÍ™Ã0ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜pŸö¦"¯æ·0ÁïÊÕ„ß3ê õô Ì| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy!v}qlÅe¼^ W·NÐEg<2U(Ñ6Hý_òçíÜ}ÒrÈξ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9~C”L Uè\d‡j1p u y&|Z~£ýhâ}s{xæs×nùhWbþZúR[J1AŽ7‚-"#q¡ ·É÷êì.â«×r͘Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·1ÁðÊÕ…ß4ê õùÿõ Í} ï*5Ñ>HÞP Y`agrm¶r#w·z_}îÐÃ~É|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð5Gý^òŽçëÜ‹ÒqÈ;¤µ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7-!#  ¶È÷éì-âª×qÍ—Ã.ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’ ˜rŸø¦$¯è·2ÁñÊÕ†ß6êõúÿç Ï~ ð*5Ò>HßP Y‘`bgrm¶r$w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Ï4Fý\òçêÜŠÒ~È̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼ýÅðÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUé\dˆj3p u y&|[~£ýhå}w{xåsÖnøhVbüZøRYJ/AŒ7€- #~® µÇ÷èì,â¨×pÍ–Ã-ºG±ó¨B¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕ‡ß7êõûÿè À ñ*5Ó>HàP Y‘`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Î3Eý[ò‹çé܉Ò}ÈÙ¾¢µ­¥¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖn÷hUbûZ÷RXJ.A‹7-#}­ ÄÅ÷æì+â§×oÍ•Ã,ºF±ò¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕˆß8êõüÿé Áq ó*5Ô>HáP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2P(Ì2CýZòŠçè܈Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³y¼ÿÅòÏ?Úâä©ïú}a(»%0û9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-A‰7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã+ºE±ò¨A¡Ašÿ“ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ë·5ÁôÊÕŠß9êõþÿê Âr å*5Õ>HâP Y“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÂ^W¿NÙEp<ˆ2O(Ë1BýYò‰çç܆Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³z¼ÆóÏ@ÚÔäªïú~b)¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÝnöhTbùZõRVJ,Aˆ7}-#{« ÁÓ÷ôì)â¥×mÍ“Ã*ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’š˜kŸð¦¯ì·6ÁõÊÕ‹ß:êõÿÿë Ãs æ*5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÂ^W¾NØEo<•2N(Ê/AýXòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³{¼ÆõÏAÚÕä›ïúd*½% 0ý9„CLUâ\d‚j-p u y(|\~¤ýhä}u{ xêsÜnÿhSbùZôRUJ+A‡7|-#yª ÀÒ÷óì7â¤×lÍ’Ã)ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõì Åt ç* 5É>!HãPY•`fgum¹r&w´z]}îÑÄ~È|åyvzqlÀeÁ^W½N×En<”2\(É .@ýWò‡çåÜ„ÒyÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³|¼ÆöÏCÚÖäœïú€e+¾% 0þ9…CŽLUâ\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZóRTJ*A†7{-#x¨ ¿Ñ÷òì6â²×kÍ‘Ã(ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯à·*Á÷ÊÕß<êõî Æu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~Ë|äyvyqlÀeÀ^W¼NÖEm<“2[(× -?ýUò†çä܃ÒxÈÔ¾ªµ ­¥­—$‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRSJ)A…7z-#w§ ¾Ð÷ðì5â±×xÍÃ'ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁêÊÕŽß>êõï Çv é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvyql¿e¿^W»NÕEl<’2Z(Ö,>ýTò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³~¼ÆøÏEÚØäžïƒúrW-Á% 0:‡CL Uä\dƒj/puy%|\~¤ýgã}t{xésÚnýh[b[þRRJ(A„7y-#v¦ ½Î÷ïì4â°×wÍÃ'º@±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…܈IŒ’œ˜nŸó¦¯â·,ÁëÊ Õß?êõð Èw ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^WºNÔEk<‘2Y(Õ;<ýSòƒçáÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é›!£üªv³¼ÆùÏFÚÙä ï„útXÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR^J'Aƒ7x-#u¥ ¼Í÷îì3â¯×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë*5Í>HÛPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vqÿk¾e¾^ W¹NÓEj<2X(Ô:KýRò‚çàÜ€ÒuÈѾ§µ­¥ª—*‘ŒÞ‡‰„‚˜€€]€¥Úƒö†ôŠÍx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR]J4A‚7v-#t¤ ºÌ÷íì1â®×uÍ›Ã2ºK±ì¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚M…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß1êõò Êz ì*5Î>HÜPYŽ``gxm»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEi<2W(Ó8JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣòªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0:ŠC“L Uæ\d…j0p u y%|Z~£ýgã}s{xçsØnûhYbÿZûR]J3A7u-#r£ ¹Ë÷ìì0â­×tÍšÃ1ºJ±ö¨;¡;šú“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’Ÿ˜pŸö¦"¯å·/ÁîÊÕƒß2ê õó Ë{ í*5Ï>HÜP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~ql¼e¼^ W·NÑEh<Ž2U(Ò7Iý`òçÞÜ~ÒrÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏy•뛣òªl³‚¼ ÆüÏIÚÝä£ïˆúw\"¶%0ö9‹C”L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR\J2AŽ7ƒ-#q¡ ¸Ê÷ëì/â«×sÍ™Ã0ºI±ö¨E¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸ÷¦#¯æ·0ÁïÊÕ„ß4ê õøÿõ Í| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅe»^ W·NÐEg<2T(Ñ6Hý^òŽçìÜ}ÒqÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªm³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9C”LUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùR[J1A7‚-"#p  ·É÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦$¯ç·1ÁðÊÕ…ß5ê õùÿæ Î} ð*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|çy v}qlÄeÅ^ W¶NÏEf<Œ2S(Ï5Gý]òçëÜ‹ÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªn³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ù9€C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhVbüZùRZJ0AŒ7-!#Ÿ ¶Ç÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”‚Žß‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁñÊÕ‡ß6êõúÿç ¿~ ñ*5Ò>HßP Y‘`bgrm¶r$w³z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Î4Eý\òŒçê܉Ò~È̾¢µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼þÅñÏMÚàä§ï‹ú{_&¹%0ú9CŠLUê\dˆj3p u y&|[~£ýhå}v{!xåsÖnøhVbüZøRYJ/A‹7€- #~® µÆ÷çì,â¨×pÍ–Ã-ºG±ó¨B¡Bš”ˆŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕˆß7êõüÿè Àp ò*5Ó>HàP Y’`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÀNÍEd<Š2Q(Í3Dý[ò‹çé܈Ò}ÈÙ¾¡µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼ÿÅòÏ>Úáä¨ïú|a'º%0û9‚CŠLUß\d‰j3p u y'|[~£ýhå}v{!xìsÖn÷hUbûZ÷RXJ.AŠ7-#|­ ÃÅ÷æì+â§×oÍ•Ã,ºF±ò¨A¡Bš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦&¯ê·4ÁôÊÕ‰ß8êõýÿé Áq ó*5Ô>HáP Y’`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^WÀNÙEc<ˆ2P(Ì1CýZòŠçè܇Ò|ÈØ¾®µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Üƒù†øŠÑ}•÷ªp³y¼ÆóÏ@ÚÓä©ïŽú}b(»%0ü9ƒC‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÝn÷hTbúZöRWJ-A‰7~-#{¬ ÂÔ÷åì*â¦×nÍ”Ã+ºE±ñ¨A¡Ašÿ“‡Žã‰†5ƒ<0€€ã€¢‚K…ÚˆFŠ’™˜jŸï¦'¯ë·5ÁõÊÕŠß9êõþÿê Ãr å*5Õ>HâPY“`dgtm¸r%w´z]}îÐÃ~È|åyv{qlÂeÂ^W¿NØEp<‡2O(Ë0BýYò‰çç܆Ò{È×¾­µ ­þ¤¤—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•ð›£øªq³z¼ÆôÏAÚÔäšïú~c)¼% 0ý9„CŒLUá\dj4p u y'|[~¤ýhä}v{ xësÜnÿhSbùZõRVJ,Aˆ7}-#zª ÁÓ÷ôì(â¥×mÍ“Ã*ºD±ð¨@¡@šÿ“‡Žã‰†8ƒ</€€ã€¢‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß:êõÿÿì Äs æ* 5Ö> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W¾N×Eo<•2N(Ê/AýWòˆçæÜ…ÒzÈÖ¾¬µ ­¥¤—%‘Œà‡‹„‚™€€\€¤Øƒô†ùŠÒ~•ð›£øªr³{¼ÆõÏBÚÕä›ï€úd*¾% 0þ9…CLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7|-#y© ÀÒ÷òì7â¤×lÍ’Ã)ºC±ð¨?¡?šþ“†Žã‰†8ƒ>/€€ä€£‚L…ÚˆG‹’›˜lŸñ¦¯à·7Á÷ÊÕŒß<êõí Åt ç* 5É>!HäPY•`fgum¹r&w´z]}îÑÄ~È|äyvyqlÀeÁ^W½NÖEn<”2\(É .@ýVò†çäÜ„ÒxÈÕ¾«µ ­¥­—$‘Œà‡‹„‚˜€€\€¤Øƒô†óŠÓ•ñ›£ùªs³|¼ÆöÏCÚÖäïúpe+¿% 0ÿ9†CŽLUã\d‚j.pu y(|\~¤ýgä}u{xêsÛnþh\b[óRTJ*A†7z-#x¨ ¿Ð÷ñì6â²×kÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆH‹’›˜lŸò¦¯á·*ÁøÊÕß=êõî Æu è* 5Ê>HåPY–`fgvm¹r&wµz^}îÑÄ~Ë|äyvyql¿eÀ^W¼NÕEm<“2[(× ->ýUò…çã܃ÒwÈÔ¾ªµ ­¥¬ —#‘Œà‡Š„‚˜€€]€¥Ùƒõ†óŠÌ•ò›£úªt³}¼Æ÷ÏDÚ×äžï‚úrV,À% 0:‡CL Uã\dƒj.puy(|\~¤ýgä}u{xésÛnýh[b[ÿRSJ)A…7y-#w§ ¾Ï÷ðì5â±×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†8ƒ=0€€ä€£‚M…ÛˆHŒ’œ˜mŸó¦¯á·+ÁêÊÕŽß>êõï Çw é* 5Ë>HÙPY–`ggwmºr'wµz^}îÐÄ~Ë|éyvxql¿e¿^W»NÔEl<’2Z(Ö,=ýTò„çâÜ‚ÒvÈÓ¾©µ ­¥¬ —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÌw•ó› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uä\d„j/p uy%|\~¤ýgã}t{xésÚnüh[b[þR_J(A„7x-#v¦ ¼Î÷ïì3â°×wÍÃ&º@±í¨=¡=šü“…Žá‰†7ƒ=0€€ä€£‚M…܈I’˜nŸó¦¯â·,ÁëÊÕß?êõð Èx ê* 5Ì>HÚPY—`hgwmºr'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEk<‘2X(Õ:<ýSòƒçáÜÒuÈÒ¾¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆùÏFÚÚä ï…útY³%0:‰C‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÙnühZb[ýR^J5Aƒ7w-#t¥ »Í÷îì2â®×vÍœÃ3º?±ì¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜oŸô¦ ¯ã·-ÁìÊÕß@êõñ Éy ë*5Í>HÛPY`hgxm»r(w¶z^}îÐÄ~Ê|èy"vqÿk½e½^ W¹NÒEj<2W(Ô9KýRò‚çàÜ€ÒtÈѾ§µ­¥ª—*‘Œä‡‰„‚˜€€]€¥Úƒö†ôŠÎx•ꛣýªw³€¼ÆúÏGÚÛä¡ï†úuZ ´%0:ŠC’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYbÿZüR]J4A7v-#s£ ºÌ÷íì1â­×uÍ›Ã2ºK±ë¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚N…݈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ß2êõó Ëz í*5Î>HÜPYŽ``gym»r(w¶z_}îÐÄ~Ê|èy!v~ql½e½^ W¸NÒEh<2V(Ó8Jý`òçßÜÒsÈ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆûÏHÚÜä¢ï‡úv[!µ%0ö9‹C“L Uç\d†j1p u y%|Z~£ýgã}s{xçsØnúhXbÿZûR\J3A7„-#r¢ ¹Ë÷ëì0â¬×tÍšÃ1ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…݈KŽ’Ÿ˜pŸö¦"¯å·/ÁïÊÕƒß3ê õô Ì{ î*5Ï>HÝP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~qlÆe¼^ W·NÑEg<Ž2U(Ñ7Iý_òçÞÜ}ÒrÈϾ¥µ­¥©—(‘Œã‡„‚˜€€]€¦Úƒ÷†õŠÏz•뛣óªl³‚¼ ÆüÏJÚÝä£ïˆúw\#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xçsØnúhXbþZúR[J2AŽ7ƒ-#q¡ ¸É÷êì/â«×sÍ™Ã0ºI±õ¨D¡;šú“ƒŽß‰†6ƒ=0€€ã€¡‚J…؈K’Ÿ˜qŸ÷¦#¯æ·0ÁðÊÕ…ß4ê õøÿõ Í| ï*5Ð>HÞP Y`agqmµr)w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÐEf<Œ2T(Ð6Gý^òŽçìÜ|ÒqÈ­¥¨—(‘Œã‡„‚™€€]€¦Úƒ÷†öŠÏz•웣ôªm³u¼ ÆþÏKÚÞä¥ï‰úy]$·%0ø9CˆLUè\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ1A7‚-!#p  ·È÷éì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈D’ ˜rŸø¦$¯ç·1ÁñÊÕ†ß5ê õúÿæ Î} ð*5Ñ>HßP Y`bgrm¶r#w·z_}îÐÃ~É|æy v}qlÄeÅ^WµNÏEe<‹2S(Ï5Fý]òçëÜŠÒpÈ;£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣ôªn³v¼ýÅÿÏLÚßä¦ï‹úz_%¸%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xæs×nøhVbüZøRYJ0AŒ7- #~Ÿ µÇ÷èì-â©×qÍ—Ã.ºG±ô¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…؈Eˆ’¡˜rŸø¦%¯è·2ÁòÊÕ‡ß6êõûÿç ¿~ ñ*5Ó>HßP Y‘`bgsm¶r$w³z`}îÐÃ~É|æyv|qlÄeÄ^WÁNÎEd<Š2R(Î3Eý\òŒçê܉Ò}È̾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÐ|•õªo³w¼þÅñÏMÚáä§ïŒú{`&¹%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ/A‹7€-#}® ´Æ÷çì+â¨×pÍ–Ã-ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜sŸù¦&¯é·3ÁóÊÕˆß7êõüÿè Áp ò*5Ô>HàP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÄ^WÀNÚEc<‰2Q(Í2Dý[ò‹çé܈Ò|ÈØ¾¡µ­ÿ¤¦—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\ d‰j3p u y'|[~£ýhå}v{!xësÕn÷hUbûZ÷RWJ.AŠ7-#|¬ ÃÅ÷æì*â§×nÍ•Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜iŸú¦'¯ê·4ÁôÊÕ‰ß9êõýÿê Âq ä*5Õ>HáP Y“`dgtm·r%w³z]}îÐÃ~É|åyv{qlÂeÃ^W¿NÙEp<ˆ2P(Ì1CýYòŠçç܇Ò{È×¾­µ­þ¤¥—&‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÓä©ïŽú}b(¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{!xësÝnöhTbúZöRWJ-A‰7}-#{« ÂÔ÷åì)â¦×mÍ”Ã+ºD±ñ¨@¡Ašÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’™˜jŸð¦(¯ë·5ÁõÊÕŠß:êõþÿë Ãr å*5Ö>HâPY“`egtm¸r%w´z]}îÐÂ~È|åyvzqlÁeÂ^W¾NØEo<–2N(Ë0BýXòˆçæÜ†ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ}•ð›£øªr³z¼ÆôÏAÚÔä›ïú~c)½% 0ý9„CLUá\dj5p u y'|[~¤ýhä}u{ xêsÜnÿhSbùZõRVJ,Aˆ7|-#zª ÁÒ÷óì(â¥×lÍ“Ã*ºD±ð¨@¡@šþ“‡Žã‰†8ƒ</€€ä€£‚L…ÚˆGŠ’š˜kŸð¦¯ì·6ÁöÊÕ‹ß;êõÿÿì Äs æ* 5É> HãPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÁ^W½N×En<•2](É/@ýWò‡çåÜ…ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªr³{¼ÆõÏBÚÖäœï€ú€d+¾% 0þ9…CŽLUâ\d‚j-pu y(|\~¤ýhä}u{ xêsÜnþh]bøZôRUJ+A‡7{-#y© ÀÑ÷òì6â£×kÍ’Ã)ºC±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·7Á÷ÊÕß<êõí Åu ç* 5Ê>HäPY•`fgvm¹r&w´z]}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<”2[(Ø .?ýVò†çäÜ„ÒxÈÔ¾ªµ ­¥­—$‘Œà‡‹„‚˜€€\€¥Ùƒõ†óŠË•ñ›£úªs³|¼ÆöÏCÚ×äï‚úqe,¿% 0ÿ9†CŽLUã\dƒj.pu y(|\~¤ýgä}u{xésÛnþh\b[óRTJ*A†7z-#x¨ ¾Ð÷ñì5â±×jÍ‘Ã(ºB±ï¨>¡?šý“†Žâ‰†8ƒ>0€€ä€£‚L…ÛˆHŒ’›˜mŸò¦¯á·*ÁøÊÕŽß=êõî Æv é* 5Ë>HØPY–`ggvm¹r&wµz^}îÐÄ~Ë|äyvyql¿eÀ^W¼NÕEl<“2Z(×,>ýUò…çã܃ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò›£ûªt³}¼Æ÷ÏDÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy(|\~¤ýgã}u{xésÚnýh[b[þRSJ)A…7y-#v§ ½Ï÷ðì4â°×xÍÃ'ºA±î¨=¡>šý“…Žâ‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜mŸó¦¯â·+ÁëÊÕß>êõï Èw ê* 5Ì>HÙPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¿e¿^W»NÔEk<‘2Y(Ö;=ýTò„çâÜÒvÈÒ¾¨µ ­¥« —+‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é› £ûªu³~¼ÆøÏEÚÙäŸï„úsXÁ%0:ˆCL Uå\d„j/p uy%|\~¤ýgã}t{xèsÚnühZb[ýR_J(A„7x-#u¥ ¼Î÷ïì3â¯×wÍÃ&º@±í¨<¡=šü“…Žá‰†7ƒ=0€€â€£‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß?êõñ Éx ë* 5Í>HÚPY`hgwm»r'wµz^}îÐÄ~Ë|èy"vxql¾e¾^ WºNÓEj<2X(Ô:LýRòƒçáÜ€ÒuÈѾ¨µ ­¥«—*‘Œß‡Š„‚˜€€]€¥Ùƒö†ôŠÍx•é›!£üªv³¼ÆúÏGÚÚä ï…útY³%0:‰C‘L Uå\d…j0p uy%|Z~¤ýgã}t{xèsÙnühZb[üR^J4Aƒ7w-#t¤ »Í÷íì2â®×vÍœÃ2º?±ì¨<¡<šû“„Žá‰†7ƒ=0€€â€ ‚M…܈J’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z^}îÐÄ~Ê|èy!vqÿk½e½^ W¹NÒEi<2W(Ó9Kýaò‚çàÜÒtÈо§µ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎx•ꛣýªw³€¼ÆûÏHÚÛä¡ï†úuZ!´%0:ŠC’L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZüR]J3A7v-#s£ ºË÷ìì1â­×uÍ›Ã1ºK±ë¨;¡<šû“ƒŽà‰†7ƒ=0€€â€¡‚I…݈JŽ’ž˜pŸõ¦!¯å·/ÁîÊÕƒß2êõó Ëz í*5Ï>HÜPYŽ``gpm¼r(w¶z_}îÐÄ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò8Iý`òçÞÜ~ÒsÈϾ¦µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒö†õŠÎy•뛣òªx³¼ÆüÏIÚÜä£ï‡úw["µ%0ö9‹C“L Uç\d†j1p u y&|Z~£ýgã}s{xçsØnúhXbþZûR\J2A7„-#r¢ ¹Ê÷ëì0â¬×tÍšÃ0ºJ±ö¨:¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚I…׈K’Ÿ˜pŸö¦"¯æ·0ÁïÊÕ„ß3ê õô Ì{ î*5Ð>HÝP Y`agqmµr(w¶z_}îÐÃ~Ê|çy!v}qlÅe¼^ W·NÐEg<2U(Ñ7Hý_òçíÜ}ÒrÈξ¥µ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³‚¼ ÆýÏJÚÞä¤ï‰úx]#¶%0÷9~C”L Uè\d†j1p u y&|Z~£ýhâ}s{xæsØnúhWbþZúR[J1AŽ7ƒ-"#q¡ ·É÷êì/â«×rÍ™Ã/ºI±õ¨D¡:šù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦#¯ç·1ÁðÊÕ…ß4ê õùÿõ Í} ï*5Ñ>HÞP Y`agrmµr#w·z_}îÐÃ~Ê|çy v}qlÅeÆ^ W¶NÏEf<Œ2T(Ð5Gý^òŽçìÜ‹ÒqÈ;¤µ­¥¨—(‘Œã‡„‚™€€]€¦Ûƒ÷†öŠÏz•웣ôªm³v¼ ÆþÏKÚßä¥ïŠúy^$¸%0ø9CˆLUé\d‡j2p u y&|[~£ýhå}s{xæs×nùhWbýZùRZJ0A7-!#  ¶È÷éì-âª×qÍ—Ã.ºH±ô¨C¡Cšù“‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’ ˜rŸø¦$¯è·2ÁñÊÕ†ß5ê õúÿæ Î~ ð*5Ò>HßP Y‘`bgrm¶r#w²z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2S(Ï4Fý]òçêÜŠÒpÈ̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†öŠÐ{•훣õªn³w¼ýÅÿÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUé\dˆj2p u y&|[~£ýhå}w{xåsÖnøhVbüZøRYJ/AŒ7€- #~® µÇ÷èì,â©×pÍ–Ã-ºG±ó¨C¡Cš”ŽÞ‰†6ƒ<0€€ã€¢‚J…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕ‡ß7êõûÿè À ñ*5Ó>HàP Y‘`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Î3Eý[òŒçé܉Ò}È˾¢µ­¥¦—'‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅñÏMÚáä§ïŒú{`&º%0ú9CŠLUß\dˆj3p u y'|[~£ýhå}v{!xåsÖnøhUbûZ÷RXJ.A‹7-#}­ ÄÆ÷æì+â¨×oÍ•Ã,ºF±ó¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯é·4ÁóÊÕˆß8êõüÿé Áp ò*5Ô>HáP Y’`cgsm·r$w³z]}îÐÃ~É|æyv{qlÃeÃ^WÀNÚEc<‰2P(Í2DýZòŠçè܈Ò|ÈØ¾¡µ­ÿ¤¥—&‘Œá‡Œ„‚™€€\€¤Ûƒø†÷ŠÑ|•öªp³x¼ÿÅòÏ?Úâä¨ïú|a'»%0û9‚C‹LUà\d‰j4p u y'|[~£ýhä}v{!xësÕn÷hTbúZöRWJ-AŠ7~-#|¬ ÃÔ÷åì*â¦×nÍ”Ã,ºE±ò¨A¡Aš”ˆŽä‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’™˜jŸï¦'¯ê·5ÁôÊÕ‰ß9êõýÿê Âr ä*5Õ>HâP Y“`dgtm¸r%w³z]}îÐÃ~È|åyv{qlÂeÂ^W¿NÙEp<ˆ2O(Ë1BýYò‰çç܇Ò{È×¾­µ­þ¤¥—%‘Œá‡‹„‚™€€\€¤Øƒù†øŠÒ}•÷ªq³y¼ÆóÏ@ÚÔäªïŽú~b)¼% 0ü9ƒCŒLUá\dj4p u y'|[~£ýhä}v{ xësÝnöhTbùZõRVJ,A‰7}-#{« ÂÓ÷ôì)â¥×mÍ“Ã+ºD±ñ¨@¡@šÿ“‡Žã‰†5ƒ</€€ã€¢‚K…ÚˆGŠ’š˜jŸð¦¯ë·6ÁõÊÕ‹ß:êõÿÿë Ãs æ*5Ö> HâPY”`egum¸r%w´z]}îÑÂ~È|åyvzqlÁeÂ^W¾NØEo<•2N(Ê0AýXòˆçæÜ…ÒzÈÖ¾¬µ ­ý¤¤—%‘Œá‡‹„‚™€€\€¤Øƒô†øŠÒ~•ð›£øªr³z¼ÆôÏAÚÕä›ïúd*½% 0ý9„CLUâ\dj-p u y(|\~¤ýhä}u{ xêsÜnÿhSbùZôRUJ+Aˆ7|-#yª ÀÒ÷óì7â¤×lÍ’Ã*ºC±ð¨?¡@šþ“†Žã‰†8ƒ</€€ä€£‚L…ÚˆG‹’š˜kŸñ¦¯ß·7ÁöÊÕŒß;êõì Ät ç* 5É> HãPY”`egum¹r&w´z]}îÑÂ~È|åyvzqlÀeÁ^W½N×En<”2\(É.@ýWò‡çåÜ„ÒyÈÕ¾«µ ­¥£—$‘Œà‡‹„‚˜€€\€¤Øƒô†òŠÓ~•ñ›£ùªs³{¼ÆöÏBÚÖäœïú€e+¾% 0þ9…CŽLUâ\d‚j.pu y(|\~¤ýgä}u{ xêsÛnþh\bøZôRTJ*A†7{-#x© ¿Ñ÷òì6â²×kÍ‘Ã)ºB±ï¨?¡?šþ“†Žâ‰†8ƒ>/€€ä€£‚L…ÛˆH‹’›˜lŸñ¦¯à·*Á÷ÊÕß<êõí Æu è* 5Ê>HäPY•`fgvm¹r&w´z^}îÑÄ~È|äyvyqlÀeÀ^W¼NÖEm<“2[(Ø -?ýVò†çä܃ÒxÈÔ¾ªµ ­¥­—$‘Œà‡Š„‚˜€€\€¥Ùƒõ†óŠÌ•ñ›£úªt³|¼Æ÷ÏDÚ×äï‚úqf,¿% 0ÿ9†CLUã\dƒj.puy(|\~¤ýgä}u{xésÛnýh\b[óRSJ)A…7z-#w§ ¾Ð÷ñì5â±×yÍÃ(ºA±î¨>¡>šý“…Žâ‰†8ƒ=0€€ä€£‚L…ÛˆHŒ’œ˜mŸò¦¯á·+ÁêÊÕŽß=êõï Çv é* 5Ë>HÙPY–`ggvmºr&wµz^}îÐÄ~Ë|äyvyql¿e¿^W»NÕEl<’2Z(Ö,>ýTò…çãÜ‚ÒwÈÓ¾©µ ­¥¬ —#‘Œß‡Š„‚˜€€]€¥Ùƒõ†óŠÌw•ò› £ûªu³}¼ÆøÏEÚØäžïƒúrW-À% 0:‡CL Uä\dƒj/puy$|\~¤ýgã}t{xésÚnýh[b[þRRJ(A„7y-#v¦ ½Ï÷ïì4â°×xÍÃ'º@±í¨=¡>šü“…Žá‰†7ƒ=0€€ä€£‚M…ÛˆIŒ’œ˜nŸó¦¯â·,ÁëÊ Õß?êõð Èw ê* 5Ì>HÚPY—`ggwmºr'wµz^}îÐÄ~Ë|èyvxql¾e¿^WºNÔEk<‘2Y(Õ;=ýSòƒçâÜÒvÈÒ¾¨µ ­¥« —*‘Œß‡Š„‚˜€€]€¥Ùƒõ†ôŠÍw•é›!£üªv³~¼ÆùÏFÚÙä ï„úsXÂ%0:ˆC‘L Uå\d„j/p uy%|Z~¤ýgã}t{xèsÚnühZb[ýR_J'Aƒ7x-#u¥ ¼Í÷îì3â¯×vÍœÃ3º@±í¨<¡=šü“„Žá‰†7ƒ=0€€â€¤‚M…܈I’˜nŸô¦ ¯ã·-ÁìÊÕß@êõñ Éx ë*5Í>HÛPY`hgxm»r'wµz^}îÐÄ~Ê|èy"vxqÿk¾e¾^ W¹NÓEj<2X(Ô:KýRò‚çàÜ€ÒuÈѾ§µ­¥ª—*‘Œß‡Š„‚˜€€]€¥Úƒö†ôŠÍx•ꛣýªv³¼ÆúÏGÚÚä¡ï†úuY ³%0:‰C’L Uæ\d…j0p uy%|Z~£ýgã}t{xèsÙnûhYb[üR^J4A‚7w-#t¤ »Ì÷íì2â®×uÍ›Ã2ºK±ì¨;¡<šû“„Žà‰†7ƒ=0€€â€¡‚M…܈JŽ’ž˜oŸõ¦!¯ä·.ÁíÊÕ‚ßAêõò Êy ì*5Î>HÛPYŽ`_gxm»r(w¶z_}îÐÄ~Ê|èy!v~qÿk½e½^ W¹NÒEi<2W(Ó9JýaòçßÜÒtÈ­¥ª—)‘Œä‡‰„‚˜€€]€¥Úƒö†õŠÎy•ꛣñªw³€¼ÆûÏHÚÜä¢ï‡úv[!µ%0:ŠC“L Uæ\d…j0p u y%|Z~£ýgã}t{xçsÙnûhYbÿZûR]J3A7u-#s£ ¹Ë÷ìì0â­×tÍšÃ1ºJ±÷¨;¡<šû“ƒŽà‰†7ƒ=0€€ã€¡‚I…݈JŽ’ž˜pŸö¦"¯å·/ÁîÊÕƒß2êõó Ë{ í*5Ï>HÜP Y``gqm¼r(w¶z_}îÐÃ~Ê|çy!v~ql¼e¼^ W¸NÑEh<Ž2V(Ò7Iý`òçÞÜ~ÒsÈϾ¥µ­¥©—)‘Œã‡„‚˜€€]€¥Úƒ÷†õŠÎy•뛣òªl³¼ ÆüÏIÚÝä£ïˆúw\"¶%0ö9‹C“L Uç\d†j1p u y&|Z~£ýhã}s{xçsØnúhXbþZúR\J2A7ƒ-#q¢ ¸Ê÷ëì/â¬×sÍ™Ã0ºI±ö¨E¡;šú“ƒŽà‰†6ƒ=0€€ã€¡‚J…׈K’Ÿ˜qŸö¦#¯æ·0ÁïÊÕ„ß3ê õô Ì| î*5Ð>HÝP Y`agqmµr)w¶z_}îÐÃ~Ê|çy v}qlÅe»^ W·NÐEg<2T(Ñ6Hý^òçìÜ}ÒrÈ­¥¨—(‘Œã‡„‚˜€€]€¦Úƒ÷†öŠÏz•웣óªl³u¼ ÆýÏJÚÞä¤ï‰úx]#·%0÷9C”LUè\d‡j1p u y&|Z~£ýhå}s{xæs×nùhWbýZúR[J1AŽ7‚-"#p  ·É÷êì.âª×r͘Ã/ºH±õ¨D¡Dšù“‚Žß‰†6ƒ=0€€ã€¡‚J…؈D’ ˜qŸ÷¦$¯ç·1ÁðÊÕ…ß5ê õùÿö Î} ï*5Ñ>HÞP Y`bgrm¶r#w·z_}îÐÃ~É|çy v}qlÅeÅ^ W¶NÏEf<Œ2S(Ð5Gý]òçëÜ‹ÒpÈ;£µ­¥§—(‘Œâ‡„‚™€€]€¦Ûƒ÷†öŠÐ{•훣ôªm³v¼üÅþÏKÚßä¥ïŠúy^$¸%0ø9C‰LUé\d‡j2p u y&|[~£ýhå}w{xæs×nùhVbýZùRZJ0AŒ7-!#Ÿ ¶È÷èì-â©×qÍ—Ã.ºH±ô¨C¡Cš”‚Žß‰†6ƒ<0€€ã€¡‚J…؈Eˆ’¡˜rŸø¦$¯è·2ÁñÊÕ†ß6êõúÿç Ï~ ñ*5Ò>HßP Y‘`bgrm¶r$w³z_}îÐÃ~É|æy v|qlÄeÅ^WµNÎEe<‹2R(Î4Eý\òŒçêÜŠÒ~È̾£µ­¥§—'‘Œâ‡Œ„‚™€€]€¦Ûƒø†÷ŠÐ{•훣õªn³w¼ýÅðÏLÚàä¦ï‹úz_%¹%0ù9€C‰LUê\dˆj3p u y&|[~£ýhå}v{"xåsÖnøhVbüZøRYJ/A‹7€- #~® µÆ÷çì,â¨×pÍ–Ã-ºG±ó¨B¡Bš”‰ŽÞ‰†6ƒ<0€€ã€¢‚K…ÙˆEˆ’˜˜sŸù¦%¯é·3ÁòÊÕˆß7êõûÿè À ò*5Ó>HàP Y’`cgsm·r$w³z\}îÐÃ~É|æyv|qlÃeÄ^WÁNÍEd<Š2Q(Í3Dý[ò‹çé܈Ò}ÈÙ¾¢µ­ÿ¤¦—&‘Œâ‡Œ„‚™€€\€¦Ûƒø†÷ŠÑ|•öªo³x¼þÅòÏ>Úáä¨ïú|`'º%0ú9CŠLUß\d‰j3p u y'|[~£ýhå}v{!xìsÖn÷hUbûZ÷RXJ.AŠ7-#}­ ÄÅ÷æì+â§×oÍ•Ã,ºF±ò¨B¡Bš”ˆŽÞ‰†5ƒ<0€€ã€¢‚K…ÙˆF‰’˜˜iŸú¦&¯ê·4ÁóÊÕ‰ß8êõsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/wav/44100-2-8.wav0000644000000000000000000053047413111512442023202 0ustar 00000000000000RIFF4±WAVEfmt D¬ˆXdata±€€‹–‚ ƒ«…µ†¾‡ÈˆÐ‰ØŠàŒçíŽòöú‘ü’þ”ÿ•ÿ–þ—ü˜ù™õšñœëåžÞŸÖ Î¡Å£¼¤²¥¨¦ž§“¨ˆ©}«r¬h­]®S¯I°?²6³.´&µ¶·¸ º »¼½¾¿ÁÂÃÄ ÅÆÇÉ$Ê,Ë4Ì=ÍFÎPÏ[ÑeÒpÓ{Ô…Õ֛إٰںÛÃÜÌÝÔÞÜàãáêâïãôäøåûçýèÿéÿêþëýìúí÷ïóðîñèòâóÚôÒõÊ÷Áø·ù­ú£û˜üŽþƒÿxþmýbüXûNúDø;÷2ö*õ"ôóñð ïîíìëéèçæ åäâá à(ß0Þ8ÝBÜKÚUÙ`Øj×uրՋԖҠѫеϾÎÈÍÐËØÊàÉçÈíÇòÆöÅúÃüÂþÁÿÀÿ¿þ¾ü¼ù»õºñ¹ë¸å·Þ¶Ö´Î³Å²¼±²°¨¯ž®“¬ˆ«}ªr©h¨]§S¥I¤?£6¢.¡& Ÿœ › š™˜–•”“’‘ ŽŒ$‹,Š4‰=‡F†P…[„eƒp‚{…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹–~ }«{µz¾yÈxÐwØvàtçsíròqöpúoünþlÿkÿjþiühùgõfñdëcåbÞaÖ`Î_Å]¼\²[¨ZžY“XˆW}UrThS]RSQIP?N6M.L&KJIH F EDCBA?>=< ;:97$6,544=3F2P1[/e.p-{,…+*›(¥'°&º%Ã$Ì#Ô"Ü ãêïôøûýÿÿþýú÷óîèâ Ú Ò Ê Á·­£˜ŽƒxmbXND; 2 * "     (!0"8#B$K&U'`(j)u*€+‹,–. /«0µ1¾2È3Ð5Ø6à7ç8í9ò:ö;ú=ü>þ?ÿ@ÿAþBüDùEõFñGëHåIÞJÖLÎMÅN¼O²P¨QžR“TˆU}VrWhX]YS[I\?]6^._&`acd e fghjklmno prst$u,v4w=yFzP{[|e}p~{…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹–‚ ƒ«…µ†¾‡ÈˆÐ‰ØŠàŒçíŽòöú‘ü’þ”ÿ•ÿ–þ—ü˜ù™õšñœëåžÞŸÖ Î¡Å£¼¤²¥¨¦ž§“¨ˆ©}«r¬h­]®S¯I°?²6³.´&µ¶·¸ º »¼½¾¿ÁÂÃÄ ÅÆÇÉ$Ê,Ë4Ì=ÍFÎPÏ[ÑeÒpÓ{Ô…Õ֛إٰںÛÃÜÌÝÔÞÜàãáêâïãôäøåûçýèÿéÿêþëýìúí÷ïóðîñèòâóÚôÒõÊ÷Áø·ù­ú£û˜üŽþƒÿxþmýbüXûNúDø;÷2ö*õ"ôóñð ïîíìëéèçæ åäâá à(ß0Þ8ÝBÜKÚUÙ`Øj×uրՋԖҠѫеϾÎÈÍÐËØÊàÉçÈíÇòÆöÅúÃüÂþÁÿÀÿ¿þ¾ü¼ù»õºñ¹ë¸å·Þ¶Ö´Î³Å²¼±²°¨¯ž®“¬ˆ«}ªr©h¨]§S¥I¤?£6¢.¡& Ÿœ › š™˜–•”“’‘ ŽŒ$‹,Š4‰=‡F†P…[„eƒp‚{…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹–~ }«{µz¾yÈxÐwØvàtçsíròqöpúoünþlÿkÿjþiühùgõfñdëcåbÞaÖ`Î_Å]¼\²[¨ZžY“XˆW}UrThS]RSQIP?N6M.L&KJIH F EDCBA?>=< ;:97$6,544=3F2P1[/e.p-{,…+*›(¥'°&º%Ã$Ì#Ô"Ü ãêïôøûýÿÿþýú÷óîèâ Ú Ò Ê Á·­£˜ŽƒxmbXND; 2 * "     (!0"8#B$K&U'`(j)u*€+‹,–. /«0µ1¾2È3Ð5Ø6à7ç8í9ò:ö;ú=ü>þ?ÿ@ÿAþBüDùEõFñGëHåIÞJÖLÎMÅN¼O²P¨QžR“TˆU}VrWhX]YS[I\?]6^._&`acd e fghjklmno prst$u,v4w=yFzP{[|e}p~{…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€ú€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€€€‹€–€ €«€µ€¾€È€Ð€Ø€à€ç€í€ò€ö€ú€ü€þ€ÿ€ÿ€þ€ü€ù€õ€ñ€ë€å€Þ€Ö€Î€Å€¼€²€¨€ž€“€ˆ€}€r€h€]€S€I€?€6€.€&€€€€ € €€€€€€€€€ €€€€$€,€4€=€F€P€[€e€p€{€…€€›€¥€°€º€Ã€Ì€Ô€Ü€ã€ê€ï€ô€ø€û€ý€ÿ€ÿ€þ€ý€û€÷€ó€î€è€â€Ú€Ò€Ê€Á€·€­€£€˜€Ž€ƒ€x€m€b€X€N€D€;€2€*€"€€€€ €€€€€€€€€ €€€€ €(€0€8€B€K€U€`€j€u€sonic-visualiser-3.0.3/svcore/data/fileio/test/audio/wav/48000-1-16.wav0000644000000000000000000056705413111512442023267 0ustar 00000000000000RIFF$îWAVEfmt €»wdataî áŽ'û0:áBK!SZUag#m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTaƒZSKàB:ú0Ž'ã ÿÿõõüëâsØÏäÅ!½Ä´à¬}¥¬žt˜Ý’õ¿‰E†‹ƒ”f€€f€”‹ƒD†À‰ôÝ’s˜«ž¥ß¬Ã´ ½ãÅÏrØâûëôõ â'ý0:ßB=K SƒZTaŒg#m rAv»yu|l~šÿšl~u|»y@v r#mŒgUa€Z S=KàB:ú0'ã þÿõõûëâsØÏäÅ ½Ã´à¬}¥¬žt˜Ý’õ¾‰E†‹ƒ”f€€f€”‹ƒE†¾‰õÝ’t˜¬ž}¥à¬Ã´ ½äÅÏsØâûëõõþÿ ã'ú0:àB=K SZUag#m r@v»yu|l~šÿšl~u|»yAv r#mŒgTaƒZ S=KßB:ý0'â ôõûëârØÏãÅ ½Ã´ß¬¥«žs˜Ý’ôÀ‰D†Šƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ä´!½äÅÏtØâüëõõÿÿ ãŽ'ú0:àB:K!SZUag!m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTa‚ZSK!SZUag$m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTaƒZSKàB:ú0Ž'ã ÿÿõõüëâsØÏäÅ!½Ä´à¬}¥¬žt˜Ý’õ¿‰E†‹ƒ”f€€f€”‹ƒD†À‰ôÝ’s˜«ž¥ß¬Ã´ ½ãÅÏrØâûëôõ â'ý0:ßB=K SƒZTaŒg#m rAv»yu|l~šÿšl~u|»y@v r#mŒgUa€Z S=KàB:ú0'ã þÿõõûëâsØÏäÅ ½Ã´à¬}¥¬žt˜Ý’õÀ‰E†‹ƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ã´ ½äÅÏsØâûëõõþÿ ã'ú0:àB=K SZUag#m r@v»yu|l~šÿšl~u|»yAv r#mŒgTaƒZ S=KßB:ý0'â ôõûëârØÏãÅ ½Ã´ß¬¥«žs˜Ý’ôÀ‰D†Šƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ä´!½äÅÏtØâüëöõÿÿ ߎ'ú0:àB:K!SZUag!m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTa‚ZSKàB:ú0Ž'ã ÿÿõõüëâsØÏäÅ!½Ä´à¬}¥¬žt˜Ý’õ¿‰E†‹ƒ”f€€f€”‹ƒD†À‰ôÝ’s˜«ž¥ß¬Ã´ ½ãÅÏrØâûëôõ â'ý0:ßB=K SƒZTaŒg#m rAv»yu|l~šÿšl~u|»y@v r#mŒgUaZ S=KàB:ú0'ã þÿõõûëâsØÏäÅ ½Ã´à¬}¥¬žt˜Ý’õ¾‰E†‹ƒ”f€€f€”‹ƒE†¾‰õÝ’t˜¬ž}¥à¬Ã´ ½äÅÏsØâûëõõþÿ ã'ú0:àB=K SZUaŒg#m r@v»yu|l~šÿšl~u|»yAv r#mŒgTaƒZ S=KßB:ý0'â ôõûëârØÏãÅ ½Ã´ß¬¥«žs˜Ý’ôÀ‰D†‹ƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ä´!½äÅÏsØâüëõõÿÿ ãŽ'ú0:àB>K!SZUag!m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTaƒZSKàB:ú0Ž'ã ÿÿõõüëâsØÏäÅ!½Ä´à¬}¥¬žt˜Ý’õ¿‰E†‹ƒ”f€€f€”‹ƒD†À‰ôÝ’s˜«ž¥à¬Ã´ ½ãÅÏrØâûëôõ â'ý0:ßB=K SƒZTaŒg#m rAv»yu|l~šÿšl~u|»y@v r#mŒgUa€Z S=KàB:ú0'ã þÿõõûëâsØÏäÅ ½Ã´à¬€¥¬žt˜Ý’õÀ‰E†‹ƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ã´ ½äÅÏsØâüëõõþÿ ã'ú0:àB=K SZUag#m r@v»yu|l~šÿšl~u|»yAv r#mŒgTaƒZ S=KßB:ý0'â ôõûëârØÏãÅ ½Ã´ß¬¥«žs˜Ý’ôÀ‰D†Šƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ä´!½äÅÏtØâüëöõÿÿ ߎ'ú0:àB:K!SZUag!m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTa‚ZSK!SZUag#m r@v¼yv|l~šÿšl~v|»yAv r#mŽgTaƒZSKàB:ú0Ž'ã ÿÿõõüëâsØÏäÅ!½Ä´à¬}¥¬žt˜Ý’õ¿‰E†‹ƒ”f€€f€”‹ƒD†À‰ôÝ’s˜«ž¥ß¬Ã´ ½ãÅÏrØâûëôõ â'ý0:ßB=K SƒZTaŒg#m rAv»yu|l~šÿšl~u|»y@v r#mŒgUa€Z S=KàB:ú0'ã þÿõõûëâsØÏäÅ ½Ã´à¬}¥¬žt˜Ý’õ¾‰E†‹ƒ”f€€f€”‹ƒE†¾‰õÝ’t˜¬ž}¥à¬Ã´ ½äÅÏsØâûëõõþÿ ã'ú0:àB=K SZUag#m r@v»yu|l~šÿšl~u|»yAv r#mŒgTaƒZ S=KßB:ý0'â ôõûëârØÏãÅ ½Ã´ß¬¥«žs˜Ý’ôÀ‰D†Šƒ”f€€f€”‹ƒE†¿‰õÝ’t˜¬ž}¥à¬Ä´!½äÅÏtØâüëõõÿÿ ãŽ'ú0:àB:K!SZUag!m r@v¼yv|k~šÿšl~v|»yAv r#mŽgTa‚ZSKSZUag"m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ø0'á ôõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõ à'ÿ0:áB>KSZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Â´á¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r@v»yv|k~šÿšl~v|»yBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬}¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿñõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgTa€Z#S=KàB:ý0'Þ  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag"m rBv»yv|l~šÿšl~v|»y@v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ø0'á óõýëâqØÏæÅ½Á´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ù0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿòõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:þ0'ß  þÿùõüëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ ã‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVaƒZS9KâB:ù0'â ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰F†Šƒ”f€€f€•ŠƒE†À‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ àŽ'þ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ â'ù0:âB9KSƒZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥ã¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v»yv|k~šÿšl~u|ºyAv r!mŽgTa€Z#S=KßB:ý0'Þ þÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏtØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yw|k~šÿšl~u|¼yAv r mŽgTa€Z"SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ù0'á ôõöë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½æÅÏqØâýëóõ á'ø0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r@v»yv|l~šÿšl~v|»yBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  ÿÿñõüëâoØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgTa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag"m rBv»yv|l~šÿšk~v|»y@v r"mŒgVa‚ZS?KâB:ø0'á óõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Á´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥á¬Â´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVaZS>KáB:ÿ0'à òõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëôõ á'ø0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿùõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KàB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’óÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ã´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0Ž'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÀ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ù0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"â÷ëõõ ã‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z"SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ù0'á ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†À‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ á'ø0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôÞ’q˜«ž¥â¬Â´ ½æÅÏrØ!âöëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëôõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag"m rBvºyv|l~šÿšk~v|»y@v r"mŒgVa‚ZS?KâB:ø0'á óõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏpØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Â´á¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥á¬Â´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâpØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r@v»yv|k~šÿšl~v|ºyBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬}¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿùõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KàB:ý0'Þ þÿùõûëâoØÏäŽƴà¬}¥®žs˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’r˜¬ž€¥Ý¬Ã´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ø0'á óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÀ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ù0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿòõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:ý0'ß  þÿùõüëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ ã‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVaƒZS9KâB:ù0'á ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰E†Šƒ”f€€f€•ŠƒE†À‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ àŽ'þ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Þ’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥ã¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v¼yv|k~šÿšl~u|½yAv r!mŽgTa€Z#S=KßB:ý0'Þ ýÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏtØ"âøëöõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yw|k~šÿšl~u|¼yAv r mŽgTa€Z"SKSZUag"m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ø0'á ôõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Â´á¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r@v»yv|l~šÿšl~v|»yBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿñõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgTa€Z#S=KàB:ý0'Þ  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ãŠ'ú0:ãB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag"m rBv»yv|l~šÿšl~v|»y@v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ø0'á óõýëâqØÏæÅ½Á´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ø0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r"mgUaZS>KàB:þ0Ž'ß  ÿÿòõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:þ0'ß  þÿùõüëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’óÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ã´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgWaƒZS9KâB:ù0'â ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰F†Šƒ”f€€f€•ŠƒE†À‰óÞ’t˜ªž~¥á¬Ç´½åÅÏpØâýëòõÿÿ àŽ'þ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ â'ù0:âB9KSƒZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥ã¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v»yv|k~šÿšl~u|ºyAv r!mŽgTa€Z#S=KßB:ý0'Þ þÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏtØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yw|k~šÿšl~u|¼yAv r mŽgTa€Z"SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ù0'á ôõöë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ á'ø0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r?v»yv|l~šÿšl~v|»yBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  ÿÿñõüëâoØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëôõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgTa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag"m rBv»yv|l~šÿšk~v|»y@v r"mŒgVa‚ZS?KâB:ø0'á óõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Á´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥á¬Â´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVaZS>KáB:ÿ0'à òõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëôõ á'ø0:âB9KS‚ZVaŒg"m r@v»yv|k~šÿšl~v|ºyBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿùõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KàB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’óÀ‰D†Šƒ•f€€f€”‹ƒC†¿‰õß’r˜¬ž€¥Ý¬Ã´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0Ž'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÀ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ù0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"â÷ëõõ ã‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z"SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ù0'á ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†À‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ á'ÿ0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôÞ’q˜«ž¥â¬Â´ ½æÅÏrØ!âöëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëôõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#S=KßB:ý0'Þ ýÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏtØ"âøëöõ ãŠ'ú0:äB:K!S„ZSag$m r@v¼yw|k~šÿšl~u|¼yAv r mŽgTa€Z"SKSZUag"m rBvºyv|l~šÿšk~v|»y@v r"mŒgVa‚ZS9KâB:ø0'á óõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏpØâýëòõ à'ÿ0:áB>KSZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Â´á¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥á¬Â´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâpØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r@v»yv|k~šÿšl~v|»yBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬}¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿñõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgTa€Z#S=KàB:ý0'Þ  þÿùõûëâoØÏäŽƴà¬}¥®žs˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’r˜¬ž€¥Ý¬Ã´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ø0'á óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ù0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿòõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:ý0'ß  þÿùõüëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ ã‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVaƒZS9KâB:ù0'â ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰E†Šƒ”f€€f€•ŠƒE†À‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ àŽ'þ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB?KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à ÿÿòõýëâpØÏåŽǴá¬~¥ªžt˜Þ’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ â'ù0:âB9KSƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥ã¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v»yv|k~šÿšl~u|½yAv r!mŽgTa€Z#S=KßB:ý0'Þ ýÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏtØ"âøëöõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yw|k~šÿšl~u|¼yAv r mŽgTa€Z"SKSZUag"m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ø0'á ôõþë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõýë âqØÏæÅ½Â´á¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½æÅÏqØ âýëóõ á'ø0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r@v»yv|l~šÿšl~v|»yBv r"mgUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  þÿñõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgTa€Z#S=KàB:ý0'Þ  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ãŠ'ú0:ãB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag"m rBv»yv|l~šÿšl~v|»y@v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëòõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KáB:ø0'á óõýë âqØÏæÅ½Á´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥á¬Â´½æÅÏqØ âýëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:ÿ0'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏrØ âöëôõ á'ø0:âB9KS‚ZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r"mgUaZS>KàB:þ0Ž'ß  ÿÿòõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Ã´ ½çÅÏrØ!â÷ëôõ â'ù0:ãB9K SƒZWaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUaZ#S=KàB:þ0'ß  þÿùõüëâoØÏäŽǴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜«ž€¥Ý¬Ã´ ½çÅÏsØ!â÷ëõõ â‘'ú0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyAv r!mgTa€Z#S=KßB:ý0'Þ þÿøõûëâoØÏãŽƴà¬}¥®žs˜Ý’óÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ã´!½áÅÏsØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgWaƒZS9KâB:ù0'â ôõöë ârØÏæÅ½Â´â¬¥«žq˜Þ’ô¾‰F†Šƒ”f€€f€•ŠƒE†À‰óÞ’t˜ªž~¥á¬Ç´½åÅÏpØâýëòõÿÿ àŽ'þ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"mŒgVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ à'ÿ0:áB>KS‚ZVa‹g"m rBv»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à óõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’ôÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜ªž~¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à ÿÿòõýëâpØÏåŽÁ´á¬~¥ªžt˜Þ’óÀ‰E†Šƒ•f€€f€”ŠƒE†¾‰ôÞ’q˜«ž¥â¬Â´½æÅÏrØ âöëôõ â'ù0:âB9KSƒZVaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS>KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥ã¬Ã´ ½çÅÏrØ!â÷ëôõ â‘'ù0:ãB9K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰õß’q˜¬ž€¥Ý¬Ã´ ½çÅÏsØ"â÷ëõõ ã‘'ú0:ãB:K SƒZRag#m r@v»yv|k~šÿšl~u|ºyAv r!mŽgTa€Z#S=KßB:ý0'Þ þÿøõûëâvØÏãŽƴ߬|¥®žs˜Ý’öÀ‰D†Šƒ•f€€f€”‹ƒD†¿‰õß’r˜¬ž€¥Ý¬Ä´!½áÅÏtØ"âøëõõ ãŠ'ú0:äB:K!S„ZRag$m r@v¼yw|k~šÿšl~u|¼yAv r!mŽgTa€Z"SKSZUag!m rBvºyv|l~šÿšk~v|»y@v r#mŒgVa‚ZS9KâB:ù0'á ôõöë ârØÏæÅ½Â´â¬¥«žu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰óÞ’t˜ªž~¥á¬Á´½åÅÏpØâýëòõÿÿ à'ÿ0:áB>KSZUa‹g"m rBv»yv|l~šÿšl~v|»y?v r"m‹gVa‚ZS?KâB:ø0'á óõþë âqØÏæÅ½Â´â¬~¥ªžu˜Þ’ô¾‰E†Šƒ”f€€f€”ŠƒE†Á‰ôÞ’u˜ªž~¥á¬Á´½åÅÏqØâýëóõ á'ø0:áB?KS‚ZVa‹g"m r?v»yv|l~šÿšl~v|»yBv r"m‹gVa‚ZS>KáB:ÿ0'à òõýëâqØÏåŽÁ´á¬~¥ªžu˜Þ’óÁ‰E†Šƒ”f€€f€”ŠƒE†¾‰ôÞ’u˜«ž¥â¬Â´½æÅÏqØ âþëóõ á'ø0:âB?KS‚ZVaŒg"m r?v»yv|l~šÿšl~v|»yBv r"m‹gUaZS>KáB:þ0Ž'à  ÿÿòõüëâpØÏåŽǴá¬~¥ªžt˜Ý’óÀ‰E†Šƒ•f€€f€”ŠƒF†¾‰ôß’q˜«ž¥â¬Â´ ½çÅÏrØ!â÷ëôõ â'ù0:âB9K SƒZWaŒg#m r@v»yv|k~šÿšl~v|ºyBv r!mgUaZS=KàB:þ0Ž'ß  ÿÿñõüëâpØÏäŽǴà¬}¥©žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¾‰ôß’q˜«ž¥Ý¬Ã´ ½çÅÏsØ!â÷ëôõ â‘'ù0:ãB:K SƒZRaŒg#m r@v»yv|k~šÿšl~u|ºyBv r!mgUa€Z#S=KàB:ý0'ß  þÿùõûëâoØÏäŽƴà¬}¥®žt˜Ý’óÀ‰E†Šƒ•f€€f€”‹ƒF†¿‰õß’q˜¬ž€¥Ý¬Ã´!½èÅÏsØ"âøëõõ ã‘'ú0:ãB:K SƒZRag#m r@v¼yv|k~šÿšl~u|¼yAv r!mŽgTa€Z#SK$S‡ZPa‹g"m rBv½yw|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'è  óõõëâyØÏæÅ½Á´Û¬y¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯žy¥Û¬Â´½æÅÏyØâöëóõ èˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv¾yt|k~šÿšk~w|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âwØÏåŽÁ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0•'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšk~w|½yAv r!mŠgOa†Z#S=KàB:ö0•'æ þÿñõóë%âvØÏäŽÀ´Ú¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒC†¿‰õß’v˜§žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa…Z#Svºyu|l~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÝŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’o˜¨ž|¥ß¬Æ´#½êÅÿÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWaƒZ S:KÝB:1‘'ã úÿýõì"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB:1‘'â úÿüõÿë!âsØÏàŽɴ㬥«žq˜Û’øÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõþë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâüëúõ àŽ'þ0!:ÚB7KSZUag&mr?v»yv|l~šÿšl~v|»y?v r'mgVa‚ZS9KÛB":1'á ùÿûõþë âqØÏßÅ&½È´â¬¥«žp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'à ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:ÿ0Ž'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷À‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÛ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõúÿ â‘'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ!âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎêÅ#½Æ´ß¬|¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|ºyDvr$mgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z%S?KâB:ù0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†ˆƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Û¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z%S>KáB:ø0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´ ½æÅ ÏzØâöëôõ Ú‰'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´!½èÅ ÏkØâøëõõ ÛŠ'ú0:ãB@K'S~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#S=KßB:õ0”'æ ýÿðõóë%âvØÏ㎿´å¬‚¥®žs˜Ý’ò½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§ž{¥Ý¬Ä´!½èÅ ÏlØâøëöõ ÜŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r m‰gYa…Z"Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’w˜¨ž|¥ß¬Å´"½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v r m’gXa„Z!S;KÝB:1’'ä ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâúëøõ ÞŒ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWa„Z!S:KÝB:1‘'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´#½ëÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬀¥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ëÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’o˜©ž}¥á¬Ç´$½ÝÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?vºyv|l~šÿšl~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½È´â¬¥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏßÅ&½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’p˜«ž¥â¬È´&½ßÅÏrØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r@v»yv|l~šÿšl~v|»y?vr&mgUaZS7KçB!:þ0Ž'à úõüëâpØÏÝÅ%½Ç´á¬}¥ªžo˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎëÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž€¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõúÿ ã‘'1:ÝB:K!S„ZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB;K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:ü0‹'Ýÿ ÷õùëâmØýÎéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒF†¼‰òÜ’s˜­ž¥å¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K%S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KáB:ø0ˆ'è  óõõëâyØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Û¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K%S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!m‹gPa‡Z$S>KàB:÷0†'ç  ÿÿòõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z#S=KàB:ö0•'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:ö0”'æ þÿðõóë%âvØÏãŽÀ´Ù¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa…Z#Svºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿíõì"âtØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž|¥ß¬Æ´#½êÅÿÎoØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB:1‘'â úÿüõÿë!ârØÏàŽɴ㬥«žq˜Û’øÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gVaƒZS9KÛB#:1'â ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ àŽ'þ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ à'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž¥â¬È´&½ßÅÏqØ âþëûõøÿ á'1":ÛB8KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:þ0Ž'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”f€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ â'1#:ÜB9KSƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰øÛ’q˜«ž¥ã¬É´½àÅÏrØ!âÿëüõúÿ â‘'1:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUa€ZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âÿëýõúÿ ã‘'1:ÝB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëâoØÿÎêÅ#½Æ´ß¬|¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÛ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØýÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'ô0:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|¹yDvr$mgSaZSBKåB:û0‹'Üÿ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõýÿ å“'õ0:ÞBK$S‡ZPa‹g"m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z%S?KâB:ø0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØÏæÅ½Â´Û¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½æÅÏyØâõëóõ èˆ'ø0:áB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z%S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~x|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’u˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:âB@K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:ãBAKS~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|l~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥¬žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúë÷õ ÝŒ'ü0:åBBKS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S;KÝB:1’'ã ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWa„Z!S:KÝB:1‘'ã úÿýõì"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõþë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?v»yv|l~šÿšl~v|»y@v r'mgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½È´â¬¥«žp˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´&½ßÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgUaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´&½ßÅÏrØ âþëüõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß úõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎëÅ$½Ç´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž€¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎëÅ#½Æ´à¬}¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZWa‘gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m r@v¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K"S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPaŠg!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z&S?KâB:ù0‰'Ú  ôõöëâzØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†‰ƒ•f€€f€•ŒƒB†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB>K%S‡ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa‡Z%S?KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•‰ƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa‡Z$S>KàB:÷0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'ç  þÿñõôë%âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ ÛŠ'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:õ0”'æ þÿðõóë%âvØÏ㎿´æ¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r!m‰gYa…Z"Svºyu|k~šÿ™m~w|¼yAv r m‰gXa…Z"S;KÞB:1“'ä üÿïõì#âuØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’w˜¨ž|¥ß¬Å´"½éÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg$mr>vºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~v|¼y@v rm‘gXa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž}¥à¬Æ´#½ëÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë!âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâüëùõ ß'ý0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1‘'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëúõ ߎ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’p˜«ž¥â¬È´&½ßÅÏqØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS7KèB!:þ0Ž'à úõüëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âþëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëüõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgUa€ZS6KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âìýõúÿ ã‘'1:ÝB:K SƒZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žo˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Ý øõúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØýÎéÅ"½Å´Þ¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ å“'ô0:ÞB;K"S…ZXa‰g m rAv¼yw|m~šÿšk~u|¹yDvr$mgSaZSBKåB:û0‹'Üþ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½ãÅÏuØ$âìïõýÿ å”'õ0:ßBK$S‡ZPa‹g"m rBv½yw|k~šÿšk~t|¾yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'è  óõõëâyØÏæÅ½Â´Û¬y¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯žy¥Û¬Â´½æÅÏyØâöëóõ èˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv¾yt|k~šÿšk~w|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ù0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšk~w|½yAv r!mŠgOa†Z#S=KàB:ö0•'æ þÿñõóë%âvØÏäŽÀ´Ú¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒC†¿‰õß’v˜§žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|l~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÝŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’o˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWaƒZ S:KÝB:1‘'ã úÿýõì"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿüõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõþë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâüëúõ àŽ'þ0!:ÚB7KSZUag&mr?v»yv|l~šÿšl~v|»y?v r'mgVa‚ZS9KÛB":1'á ùÿûõþë âqØÏßÅ&½È´â¬¥«žp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷À‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÛ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõúÿ â‘'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ!âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎêÅ#½Æ´ß¬|¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ë´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|ºyDvr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z%S?KâB:ù0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†ˆƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z%S>KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏzØâöëôõ Ú‰'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâøëõõ ÛŠ'ú0:ãB@K&S~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#S=KßB:õ0”'æ ýÿðõóë%âvØÏ㎿´å¬‚¥®žs˜Ý’ò½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§ž{¥Ý¬Ä´!½èÅ ÏlØâøëöõ ÜŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r m‰gYa…Z"Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’w˜¨ž|¥ß¬Å´"½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg$mr>vºyu|l~šÿ™m~w|¼y@v r m’gXa„Z!S;KÝB:1’'ä ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâúëøõ ÞŒ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒD†À‰öá’o˜©ž}¥à¬Æ´#½ëÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬀¥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ëÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’o˜©ž}¥á¬Ç´$½ÝÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½É´â¬¥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏßÅ&½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’p˜«ž¥â¬È´&½ßÅÏrØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r@v»yv|l~šÿšl~v|»y?vr&mgUaZS7KçB!:þ0Ž'à úõüëâpØÏÝÅ%½Ç´á¬}¥ªžo˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎëÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõúÿ ã‘'1:ÝB:K!S„ZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB;K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:ü0‹'Ýÿ ÷õùëâmØýÎéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒF†¼‰òÜ’s˜­ž¥ä¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K%S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KáB:ø0ˆ'è  óõõëâyØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Û¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K%S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!m‹gPa‡Z$S>KàB:÷0†'ç  ÿÿòõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z#S=KàB:ö0•'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:ö0•'æ þÿðõóë%âvØÏãŽÀ´Ù¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa…Z#Svºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Û’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž|¥ß¬Æ´#½êÅÿÎoØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB:1‘'â úÿüõÿë!ârØÏàŽɴ㬥«žq˜Û’øÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gVaƒZS9KÛB#:1'â ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€f€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ àŽ'þ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":1'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ à'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB":ÿ0'à ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'1":ÛB8KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:þ0Ž'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”f€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ â'1#:ÛB9KSƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰øÛ’q˜«ž¥ã¬É´½àÅÏrØ!âÿëüõúÿ â‘'1:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUa€ZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëâoØÿÎêÅ#½Æ´ß¬|¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÛ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|¹yDvr$mgSaZSBKåB:û0‹'Üÿ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõýÿ å“'õ0:ÞBK$S‡ZPa‹g"m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z%S?KâB:ø0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Û¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½æÅÏyØâõëóõ èˆ'ø0:áB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z%S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’u˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:âB@K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:ãBAKS~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥¬žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S;KÝB:1’'ã ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWa„Z!S:KÝB:1‘'ã úÿíõì"âsØÏáŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõþë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?v»yv|l~šÿšl~v|»y@v r'mgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½È´â¬¥«žp˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´&½ßÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´&½ßÅÏrØ âþëüõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß úõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎëÅ$½Ç´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž€¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎëÅ#½Æ´à¬}¥©žo˜á’öÀ‰D†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZWa‘gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m r@v¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K"S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB>K%S‡ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa‡Z%S?KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ˆƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa‡Z$S>KàB:÷0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'ç  þÿñõôë%âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ ÛŠ'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:õ0”'æ þÿðõóë%âvØÏ㎿´æ¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r!m‰gYa…Z"Svºyu|k~šÿ™m~w|¼yAv r m‰gXa…Z"S;KÞB:1“'ä üÿïõì#âuØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’w˜¨ž|¥ß¬Å´"½éÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg$mr>vºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~v|¼y@v rm‘gXa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž}¥à¬Æ´#½ëÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë!âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâüëùõ ß'ý0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1‘'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Û’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëúõ ߎ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†À‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’p˜«ž¥â¬È´&½ßÅÏqØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS7KèB!:þ0Ž'à úõüëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âþëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëüõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgUa€ZS6KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âìýõúÿ ã‘'1:ÝB:K SƒZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žo˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Ý øõúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØýÎéÅ"½Å´Þ¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ å“'ô0:ÞB;K"S…ZXa‰g m rAv¼yw|m~šÿšk~u|¹yDvr$mgSaZSBKåB:û0‹'Üþ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõýÿ å”'õ0:ßBK$S‡ZPa‹g"m rBv½yw|k~šÿšk~t|¾yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'è  óõõëâyØÏæÅ½Â´Û¬y¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯žy¥Û¬Â´½æÅÏyØâöëóõ èˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv¾yt|k~šÿšk~w|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ù0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšk~w|½yAv r!mŠgOa†Z#S=KàB:ö0•'æ þÿñõóë%âvØÏäŽÀ´Ú¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒC†¿‰õß’v˜§žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|l~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÝŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’o˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWaƒZ S:KÝB:1‘'ã úÿýõì"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB6KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿüõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõþë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâüëúõ àŽ'þ0!:ÚB7KSZUag&mr?v»yv|l~šÿšl~v|»y?v r'mgVa‚ZS9KÛB":1'á ùÿûõþë âqØÏßÅ&½È´â¬¥«žp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷À‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß úõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÛ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõùÿ â‘'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ!âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎêÅ#½Æ´à¬}¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZXa‘gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ë´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|ºyDvr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPaŠg!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z&S?KâB:ù0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†ˆƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB?K%S‡ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa‡Z%S>KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏzØâöëôõ Ú‰'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa‡Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏkØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâøëõõ ÛŠ'ú0:ãB@K&S~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#S=KßB:õ0”'æ ýÿðõóë%âvØÏ㎿´å¬‚¥®žs˜Ý’ò½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§ž{¥Ý¬Ä´!½èÅ ÏlØâøëöõ ÜŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r m‰gYa…Z"Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z"S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’w˜¨ž|¥ß¬Å´"½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg$mr>vºyu|l~šÿ™m~w|¼y@v r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâúëøõ ÞŒ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~v|¼y@v rm‘gWa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒD†À‰öá’o˜©ž}¥à¬Æ´#½ëÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬀¥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Ç´$½ëÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½É´â¬¥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏßÅ&½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’p˜«ž¥â¬È´&½ßÅÏrØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r@v»yv|l~šÿšl~v|»y?vr&mgUaZS7KçB!:þ0Ž'à úõüëâpØÏÝÅ%½Ç´á¬}¥ªžp˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõúÿ ã‘'1:ÝB:K!S„ZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB;K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:ü0‹'Ýÿ ÷õùëâmØýÎéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒF†¼‰òÜ’s˜­ž¥ä¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K%S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KáB:ø0ˆ'è  óõõëâyØÏæÅ½Á´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Û¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K%S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!m‹gPa‡Z$S>KàB:÷0†'ç  ÿÿòõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z#S=KàB:ö0•'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:ö0•'æ þÿðõóë%âvØÏãŽÀ´Ù¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa…Z#Svºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Û’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž|¥ß¬Æ´#½êÅÿÎoØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB:1‘'â úÿüõÿë!ârØÏàŽɴ㬥«žq˜Û’øÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gVaƒZS9KÛB#:1'â ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€f€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ àŽ'þ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":1'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ à'ÿ0":ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB":ÿ0'à ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'1":ÛB8KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:þ0Ž'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”f€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ â'1#:ÛB9KSƒZVa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰øÛ’q˜«ž¥ã¬É´½àÅÏrØ!âÿëüõúÿ â‘'1:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUa€ZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëâoØÿÎêÅ#½Æ´ß¬|¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÛ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|ºyDvr$mgSaZSBKåB:û0‹'Üÿ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõýÿ å“'õ0:ÞBK$S‡ZPa‹g!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z%S?KâB:ù0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Û¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½æÅÏyØâõëóõ èˆ'ø0:áB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z%S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’u˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:âB@K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:ãBAKS~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S;KÝB:1’'ã ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWa„Z!S:KÝB:1‘'ã úÿíõì"âsØÏáŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõÿë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž}¥á¬Ç´%½ÝÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?v»yv|l~šÿšl~v|»y@v r'mgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½È´â¬¥«žp˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´&½ßÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´&½ßÅÏrØ âþëûõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß úõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎëÅ$½Ç´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž€¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎëÅ#½Æ´à¬}¥©žo˜á’öÀ‰D†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZWa‘gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0Œ'Þ øõúëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m r@v¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K"S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB>K%S‡ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa‡Z%S?KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ˆƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa‡Z$S>KàB:÷0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'ç  þÿñõôë%âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ ÛŠ'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:õ0”'æ þÿðõóë%âvØÏ㎿´æ¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r!m‰gYa…Z"Svºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏáŽ˴䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~v|¼y@v rm‘gXa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž}¥à¬Æ´#½êÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë!âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1‘'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Û’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëúõ ߎ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†À‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜«ž¥â¬È´&½ßÅÏqØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS7KÚB!:þ0Ž'à úõüëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âþëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëüõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUa€ZS6KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âìýõúÿ ã‘'1:ÝB:K SƒZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žo˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Ý øõúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØýÎéÅ"½Å´Þ¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'ô0:ÞB;K"S…ZXa‰g m rAv¼yw|m~šÿšk~u|¹yDvr$mgSaZSBKåB:û0‹'Üþ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõýÿ å”'õ0:ßBK$S‡ZPa‹g"m rBv½yw|k~šÿšk~t|¾yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†½‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'è  óõöëâyØÏæÅ½Â´Û¬y¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯žy¥Û¬Â´½æÅÏyØâõëóõ èˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv¾yt|k~šÿšk~w|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ù0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšk~w|½yAv r!mŠgOa†Z#S=KàB:ö0•'æ þÿñõóë%âvØÏäŽÀ´Ú¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|l~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÝŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’o˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWaƒZ S:KÝB:1‘'ã úÿýõì"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB6KS€ZUag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿüõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõþë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâüëúõ àŽ'þ0!:èB7KSZUag&mr?v»yv|l~šÿšl~v|»y?v r'mgVa‚ZS9KÛB":1'á ùÿûõþë âqØÏßÅ&½È´â¬¥«žp˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷À‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'ß úõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÛ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõùÿ â‘'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :ý0'ß ùõüëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ!âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎëÅ#½Æ´à¬}¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZXa‘gm r@v¼yv|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPaŠg!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z&S?KâB:ù0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†ˆƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB?K%S‡ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa‡Z%S>KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏzØâöëôõ Ú‰'ù0:âB?K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa‡Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏkØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâøëõõ ÛŠ'ú0:ãB@K&S~ZRag#m rCv¹yu|k~šÿšj~w|½yAv r!mŠgYa†Z#S=KßB:õ0”'æ ýÿðõóë%âvØÏ㎿´å¬‚¥®žs˜Ý’ò½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§ž{¥Ý¬Ä´!½èÅ ÏlØâøëöõ ÜŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r m‰gYa…Z"Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z"S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’w˜¨ž|¥ß¬Å´"½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg$mr>vºyu|l~šÿ™m~w|¼y@v r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~v|¼y@v rm‘gWa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒD†À‰öá’o˜©ž}¥à¬Æ´#½ëÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬀¥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Ç´$½ëÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõÿë!ârØÏàŽɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëúõ ߎ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿüõþë ârØÏßÅ&½É´â¬¥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏßÅ&½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’p˜«ž¥â¬È´&½ßÅÏrØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r@v»yv|l~šÿšl~v|»y?vr&mgUaZS7KçB!:þ0Ž'à úõüëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âþëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõúÿ ã‘'1:ÝB:K!S„ZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB;K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜¬ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:ü0‹'Ýÿ ÷õùëâmØýÎéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒF†¼‰òÜ’s˜­ž¥ä¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞB;K"S…ZYa‰g m rAv¼yw|m~šÿšk~u|¹yDvr$mgSaZSAKäB:û0‹'Üþ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž‚¥å¬¿´½ãÅÏuØ$âìïõýÿ å”'õ0:ßBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰óÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëòõ è‡'÷0:áB>K%S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KáB:ø0ˆ'è  óõõëâyØÏæÅ½Á´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Û¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ø0:âB?K%S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r"m‹gPa‡Z$S>KàB:÷0†'ç  ÿÿòõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z#S=KàB:ö0•'ç  þÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ Û‰'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:ö0•'æ þÿðõóë%âvØÏãŽÀ´Ù¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag#mrCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa…Z#Svºyu|l~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏᎾ´ä¬¥¬žr˜Û’ò‰F†‹ƒ”f€€g€“‰ƒD†À‰öà’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿîõì"âtØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž|¥ß¬Æ´#½êÅÿÎoØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë"âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KS€ZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB:1‘'â úÿüõÿë!ârØÏàŽɴ㬥«žq˜Û’øÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0 :çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rm‘gWaƒZS9KÛB#:1'â ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€f€”ŠƒE†À‰÷â’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ àŽ'þ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r'mgVa‚ZS8KÛB":1'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ à'ÿ0":ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'à ûõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥â¬È´&½ßÅÏqØ âþëûõøÿ á'1":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?vr&mgUaZS8KÚB!:þ0Ž'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”f€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ âþëüõùÿ â'1#:ÛB9KSƒZVa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰øÛ’q˜«ž¥ã¬É´½àÅÏrØ!âÿëüõúÿ â‘'1:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUa€ZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âÿëýõúÿ ã‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëâoØÿÎêÅ#½Æ´ß¬|¥©žo˜á’öÀ‰D†Šƒ”g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Þ øõúëânØþÎêÅ#½Å´ß¬|¥¨žn˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÛ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÝB;K!S„ZXaˆg m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØþÎéÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'1:ÞB;K"S…ZXa‰g m rAv¼yw|m~™ÿšk~u|ºyDvr$mgSaZSBKåB:û0‹'Üÿ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõýÿ å“'õ0:ÞBK$S‡ZPa‹g!m rBv½yw|k~šÿšk~t|¾yCv r#mŒgQa}Z%S?KâB:ù0ˆ'Ú  ôõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†½‰óÞ’t˜¯žƒ¥Û¬Á´½åÅÏxØâõëòõÿÿ è‡'÷0:áB>K$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Û¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏyØâõëóõ èˆ'ø0:áB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z%S>KáB:÷0‡'è  òõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ó¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S}ZQaŒg"m rCv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'ç  ÿÿòõôë&âxØÏåŽÁ´Û¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’u˜°žy¥Ü¬Â´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:âB@K&S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!mŠgPa†Z$S=KàB:ö0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'æ  þÿñõóë%âwØÏäŽÀ´Ú¬‚¥®žt˜Ý’ó½‰G†Œƒ•f€€f€–‰ƒC†¿‰õß’v˜±žz¥Ý¬Ã´!½èÅ ÏlØâøëõõ ÛŠ'ú0:ãB@KS~ZRag#m rCv¹yu|k~šÿšj~w|¼yAv r!mŠgYa†Z#Svºyu|k~šÿ™m~w|¼yAv r m‰gXa„Z!S;KÞB:1“'ä üÿîõì#âtØÏ⎾´ä¬¥­žr˜Ü’ò‰F†‹ƒ”f€€g€“‰ƒD†¿‰öà’x˜¨ž|¥ß¬Å´#½êÅþÎnØâúë÷õ ÿÝŒ'ü0:åBBKSZTaŽg%mr>vºyu|l~šÿ™m~w|¼y@v rm’gXa„Z!S;KÝB:1’'ã ûÿîõì"âtØÏáŽʴ䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“ŠƒD†À‰öá’n˜¨ž|¥ß¬Æ´#½êÅþÎnØâûëøõ Þ'ý0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™l~v|¼y@v rm‘gWa„Z!S:KÝB:1‘'ã úÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'â úÿýõÿë!âsØÏàŽɴ㬥«žq˜Û’ñÁ‰F†‹ƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ëÅÿÎoØâüëùõ ߎ'þ0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1'â ùÿüõÿë!ârØÏߎɴ⬥«žq˜Ú’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷â’o˜ªž}¥á¬Ç´%½ÝÅÏpØâüëúõ àŽ'þ0!:çB7KSZUag&mr?v»yv|l~šÿšl~v|»y@v r'mgVa‚ZS9KÛB":1'á ùÿûõþë ârØÏßÅ&½È´â¬¥«žp˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëúõ à'ÿ0!:ÚB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõýë âqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´&½ßÅÏqØ âýëûõøÿ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVaZS8KÚB!:ÿ0'à úõýëâpØÏÞÅ%½Ç´á¬~¥ªžp˜Ù’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰øÚ’q˜«ž¥â¬É´&½ßÅÏrØ âþëûõùÿ á'1":ÛB9KS‚ZVagm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB!:þ0Ž'à úõüëâpØÏÝÅ$½Ç´á¬}¥©žo˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½àÅÏrØ!âÿëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUaZS7KçB :þ0Ž'ß ùõüëâoØÿÎëÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž€¥ã¬É´½àÅÏsØ!âÿëýõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy>vr%mgTa€ZS6KæB :ý0'Þ øõûëâoØÿÎëÅ#½Æ´à¬}¥©žo˜á’öÀ‰D†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏsØ"âìíõûÿ ã’'1:ÝB:K!S„ZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0Œ'Þ øõúëânØþÎêÅ#½Æ´ß¬|¥¨žn˜á’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ä¬Ê´½áÅÏtØ"âìîõûÿ ä’'1:ÝB;K!S„ZXa’g m r@v¼yw|m~™ÿšl~u|ºy>vr$mŽgTaZSBKåB:ü0Œ'Ýÿ ÷õúëânØþÎêÅ"½Å´ß¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏtØ#âìîõüÿ ä“'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšk~u|ºy>vr$mŽgSaZSBKåB:û0‹'Ýÿ ÷õùëâmØ ÏéÅ"½Å´Þ¬{¥¨žw˜à’õ¿‰D†‰ƒ“g€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¾´½âÅÏuØ$âìïõüÿ å“'ô0:ÞBK$S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yCv r"mŒgQa}Z%S?KâB:ø0ˆ'é  óõöëâyØ ÏæÅ½Â´Ü¬y¥°žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜¯ž„¥Û¬Á´½åÅÏxØâõëóõ è‡'ø0:áB>K%S‡ZPa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gQa|Z%S?KáB:ø0‡'è  óõõëâxØÏåŽÁ´Û¬„¥¯žu˜Þ’ô¾‰C†Œƒ•f€€f€•ŒƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëóõ éˆ'ø0:âB?K%S|ZQa‹g"m rBv½yt|k~šÿšk~t|½yBv r"m‹gPa‡Z$S>KáB:÷0‡'è  ÿÿòõõëâxØÏåŽÁ´Û¬ƒ¥¯žt˜Þ’ó½‰C†Œƒ•f€€f€•ˆƒC†¾‰ôÞ’u˜°žy¥Ü¬Â´½æÅ ÏyØâöëôõ Úˆ'ù0:âB?K%S}ZQaŒg#m rCv¾yt|k~šÿšk~w|½yBv r!m‹gPa‡Z$S>KàB:÷0†'ç  ÿÿñõôë&âwØÏäŽÀ´Ú¬ƒ¥¯žt˜Ý’ó½‰B†Œƒ•f€€f€•‰ƒC†¾‰ôß’v˜°žz¥Ü¬Ã´ ½çÅ ÏzØâ÷ëôõ Ú‰'ù0:ãB@K&S}ZRaŒg#m rCv¹yt|k~šÿšk~w|½yBv r!mŠgOa†Z#S=KàB:ö0•'ç  þÿñõôë%âwØÏäŽÀ´Ú¬ƒ¥®žt˜Ý’ó½‰G†Œƒ•f€€f€•‰ƒC†¾‰õß’v˜±žz¥Ý¬Ã´ ½çÅ ÏkØâ÷ëõõ ÛŠ'ú0:ãB@K&S~ZRaŒg#m rCv¹yt|k~šÿšj~w|½yAv r!mŠgOa†Z#S=KßB:ö0”'æ þÿðõóë%âvØÏ㎿´æ¬‚¥®žs˜Ý’ó½‰G†‹ƒ•f€€f€–‰ƒD†¿‰õß’v˜§žz¥Ý¬Ä´!½èÅ ÏlØâøëõõ ÛŠ'ú0:äBAKS~ZRag$mrCv¹yu|k~šÿšj~w|¼yAv r!m‰gYa…Z"Svºyu|l~šÿ™m~w|¼yAv r mˆgXa„Z!S;KÝB:1’'ä ûÿîõì#âtØÏáŽ˴䬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€“‰ƒD†À‰öá’n˜¨ž|¥ß¬Å´#½êÅþÎnØâúëøõ ÞŒ'ü0:æB6KS€ZTaŽg%mr>vºyu|l~šÿ™m~v|¼y@v rm’gXa„Z!S:KÝB:1’'ã ûÿíõì"âsØÏáŽʴ㬀¥¬žr˜Û’ñ‰F†‹ƒ”f€€g€”ŠƒD†À‰öá’o˜©ž|¥à¬Æ´#½êÅÿÎoØâûëøõ Þ'ý0 :æB6KS€ZTag%mr>vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S:KÜB:1‘'ã úÿýõÿë!âsØÏàŽʴ㬀¥¬žq˜Û’ñ‰F†‹ƒ”f€€e€”ŠƒE†À‰öá’o˜©ž}¥à¬Æ´$½ëÅÿÎoØâûëùõ ß'ý0 :çB7KSZUag%mr?vºyu|l~šÿ›l~v|»y@v rm‘gWaƒZ S9KÜB#:1‘'â úÿüõÿë!ârØÏàŽɴ⬥«žq˜Û’øÁ‰F†Šƒ”f€€e€”ŠƒE†À‰÷á’o˜©ž}¥à¬Ç´$½ÝÅÏpØâüëùõ ߎ'þ0!:çB7KSZUag&mr?vºyv|l~šÿ›l~v|»y@v rmgVa‚ZS9KÛB":1'á ùÿüõþë ârØÏߎɴ⬥«žq˜Ú’øÁ‰E†Šƒ”f€€f€”ŠƒE†À‰÷Ù’p˜ªž~¥á¬Ç´%½ÞÅÏpØâýëúõ à'ÿ0!:ÚB8KSZUag&mr?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÛB":ÿ0'á øÿûõþë âqØÏßÅ&½È´â¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜ªž~¥á¬È´%½ÞÅÏqØâýëûõ á'ÿ0":ÛB8KS‚ZVag&m r?v»yv|l~šÿšl~v|»y?v r&mgVa‚ZS8KÚB!:ÿ0'à úõýëâqØÏÞÅ%½È´á¬~¥ªžp˜Ú’÷Á‰E†Šƒ”f€€f€”ŠƒE†Á‰÷Ú’p˜«ž¥â¬È´&½ßÅÏqØ âþëûõùÿ á'1":ÛB9KS‚ZVag'm r?v»yv|l~šÿšl~v|»y?vr&mgUaZS7KÚB!:þ0Ž'à úõüëâpØÏÞÅ%½Ç´á¬~¥ªžp˜â’÷À‰E†Šƒ”e€€f€”ŠƒF†Á‰øÚ’q˜«ž¥â¬É´½ßÅÏrØ!âþëüõùÿ â'1#:ÜB9K SƒZWa‘gm r@v»yv|l~›ÿšl~v|ºy?vr&mgUaZS7KçB :þ0Ž'ß ùõüëâpØÏÝÅ$½Ç´à¬}¥©žo˜á’÷À‰E†Šƒ”e€€f€”‹ƒF†Á‰ñÛ’q˜«ž¥ã¬É´½àÅÏsØ!âÿëüõúÿ â‘'1:ÜB:K SƒZWa‘gm r@v»yv|l~›ÿšl~u|ºy?vr%mgUa€ZS7KçB :ý0'ß ùõûëâoØÿÎëÅ$½Æ´à¬}¥©žo˜á’öÀ‰E†Šƒ”e€€f€”‹ƒF†Â‰ñÛ’q˜¬ž€¥ã¬Ê´½àÅÏsØ"âìýõúÿ ã‘'1:ÝB:K SƒZWa‘gm r@v¼yv|l~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ý0'Þ øõûëânØþÎêÅ#½Æ´ß¬|¥¨žo˜á’öÀ‰D†Šƒ“g€€f€”‹ƒF†Â‰ñÛ’r˜¬ž€¥ã¬Ê´½áÅÏtØ"âìîõûÿ ã’'1:ÝB:K!S„ZXa’gm r@v¼yw|m~™ÿšl~u|ºy>vr%mŽgTa€ZS6KæB:ü0Œ'Ý øõúëânØþÎêÅ#½Å´ß¬|¥¨žx˜à’öÀ‰D†‰ƒ“g€€f€”‹ƒF†Â‰òÜ’r˜¬ž¥ä¬¾´½áÅÏtØ#âìîõûÿ ä’'1:ÞB;K!S„ZXa‰g m rAv¼yw|m~™ÿšl~u|ºy>vr$mŽgSaZSBKåB:ü0Œ'Ýÿ ÷õúëâmØýÎéÅ"½Å´Þ¬|¥¨žw˜à’ö¿‰D†‰ƒ“g€€f€•‹ƒF†Â‰òÜ’r˜­ž¥ä¬¾´½âÅÏuØ#âìïõüÿ ä“'ô0:ÞB;K"S…ZXa‰g m rAv¼yw|m~šÿšk~u|¹yDvr$mgSaZSBKåB:û0‹'Üþ öõùëâmØ ÏéÅ"½Ä´Þ¬{¥§žw˜à’õ¿‰D†‰ƒ“f€€f€•‹ƒG†¼‰òÜ’s˜­ž¥å¬¿´½âÅÏuØ$âìïõsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/wav/8000-1-8.wav0000644000000000000000000003725413111512442023116 0ustar 00000000000000RIFF¤>WAVEfmt @@data€>€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&F€ºçýùÚ§l55l§Úùý纀F&Y”ËñÿñË”Y&Fsonic-visualiser-3.0.3/svcore/data/fileio/test/audio/wav/8000-2-16.wav0000644000000000000000000017505413111512442023177 0ustar 00000000000000RIFF$úWAVEfmt @}dataú:fgÍ l~3»y™‚Z Ž'f&úëÌ,Ä´33ô™9€@ôfFÄ´ÌLúë3SŽ'™Y‚Zÿ_»yffl~Ìlg2s:™yÿäÅ™ys˜2s”ÌlE†ff~¥ÿ_rØ™Y3SKsØ}¥E†”s˜ãÅ:Œgl~»y€Z'ûëôõ€õôûë'Z»yl~Œg:ãÅs˜”E†}¥tØ:K rÿ rKsØ}¥E†”s˜ãÅ:Œgl~»y€Z'ûëôõ€õôûë'Z»yl~Œg:ãÅs˜”E†}¥tØ:K rÿ rKsØ}¥E†”s˜ãÅ:Œgl~»y€Z'ûëôõ€õôüë'Z»yl~Œg:ãÅs˜”E†}¥tØ:K rÿ rKqØ~¥E†”u˜æÅ:Œgk~»yZŽ'üëÇ´ó€ô´÷ë'ƒZ»yl~g:þÿäÅt˜•F†¥sØ:K rÿ r=K oØ}¥E†”q˜èÅ:gk~¼y€Z'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†¥tØ;K rÿ r;KuØ{¥D†•s˜âÅüÿ:Žgl~¼y„Z‹'ùëÄ´õ€öÅ´úëŒ'€Z¼yk~g:áÅr˜”D†|¥vØK rÿ r?KqØ¥E†”u˜åÅ:‹gl~»y‚Z'ýëÁ´ô€ô´þë'‚Z»yl~‹g:ÿÿåÅt˜”E†¥rØ9K rÿ r>K pØ}¥E†”q˜çÅ:Œgk~ºyZ'üëÆ´ó€õô÷ë‘'ƒZ»yl~g:þÿãÅs˜•D†€¥sØ:K rÿ rK rÿ r>KqØ~¥E†”u˜æÅ:‹gl~»yZŽ'ýëÁ´ó€ô´öë'ƒZ»yl~g:ÿÿäÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:gk~ºy€Z'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†¥tØ;K rÿ rK rÿ r9KrØ¥E†”t˜åÅÿÿ:‹gl~»y‚Z'þë´ô€ôÁ´ýë'‚Z»yl~‹g:åÅu˜”E†¥qØ?K rÿ r>K pØ~¥E†”q˜çÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë‘'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ rK rÿ r?KqØ~¥E†”u˜æÅ:‹gl~»yZ'ýëÁ´ó€ô´þë'‚Z»yl~g:ÿÿåÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ó€õôøëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†€¥tØ;K rÿ rKpØ~¥E†”q˜æÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë‘'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ r=KvØ|¥D†”r˜áÅ:gk~¼y€ZŒ'úëÅ´ö€õÄ´ùë‹'„Z¼yl~Žg:üÿâÅs˜•D†¥uØ;K rÿ r;KuØ¥D†•s˜âÅüÿ:Žgl~¼y„Z‹'ùëÄ´õ€öÅ´úëŒ'€Z¼yk~g:áÅr˜”D†}¥vØ=K rÿ r:KsØ€¥F†•t˜äÅþÿ:gl~»yƒZ‘'÷ëôô€óÇ´üëŽ'Zºyk~Œg:æÅq˜”E†~¥pØ>K rÿ r?KqØ~¥E†”u˜åÅ:‹gl~»y‚Z'ýëÁ´ô€ô´þë'‚Z»yl~‹g:ÿÿåÅt˜•F†¥rØ9K rÿ r=K pØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ó€õôøë‘'ƒZ¼yl~Žg:ýÿãÅs˜•D†€¥tØ:K rÿ rKpØ~¥E†”u˜æÅ:Œgk~ºyZŽ'üëÇ´ó€ô´÷ë'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ r=KoØ}¥E†”r˜áÅ:gk~¼y€ZŒ'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿâÅs˜•D†¥tØ;K rÿ r;KuØ¥D†•s˜âÅüÿ:Žgl~¼y„Z‹'ùëÄ´õ€öÅ´úëŒ'€Z¼yk~g:áÅr˜”D†|¥vØK rÿ r?KqØ¥E†”u˜åÅ:‹gl~»y‚Z'ýëÁ´ô€ô´þë'‚Z»yl~‹g:ÿÿåÅt˜”E†¥rØ9K rÿ r>K pØ}¥E†”q˜çÅ:Œgk~ºyZ'üëÆ´ó€õô÷ë‘'ƒZ»yl~g:þÿãÅs˜•D†€¥sØ:K rÿ rKqØ~¥E†”u˜æÅ:Œgl~»yZŽ'üëÇ´ó€ô´öë'ƒZ»yl~g:ÿÿäÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:gk~½y€Z'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†¥tØ;K rÿ rK rÿ r9KrØ¥E†”t˜åÅÿÿ:‹gl~»y‚Z'ýë´ô€ôÁ´ýë'‚Z»yl~‹g:åÅu˜”E†¥rØ?K rÿ r>K pØ~¥E†”q˜çÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë‘'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ rK rÿ r?KqØ~¥E†”u˜æÅ:‹gl~»yZ'ýëÁ´ó€ô´öë'‚Z»yl~g:ÿÿäÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ó€õôøëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†€¥tØ;K rÿ rK rÿ r9KrØ¥F†•t˜åÅÿÿ:‹gl~»y‚Z'þë´ô€ôÁ´ýë'‚Z»yl~‹g:åÅu˜”E†~¥qØ?K rÿ r>KpØ~¥E†”q˜æÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë‘'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ r=KvØ|¥D†”r˜áÅ:gk~¼y€ZŒ'úëÅ´ö€õÄ´ùë‹'„Z¼yl~Žg:üÿâÅs˜•D†¥uØ;K rÿ r;KtØ¥D†•s˜âÅýÿ:Žgl~¼y„Z‹'ùëÄ´õ€öÆ´úëŒ'€Z¼yk~g:áÅr˜”D†}¥oØ=K rÿ r:KsØ€¥F†•t˜äÅþÿ:gl~»yƒZ'÷ëôô€óÇ´üëŽ'Zºyk~Œg:æÅu˜”E†~¥pØ>K rÿ r?KqØ~¥E†”u˜åÅ:‹gl~»y‚Z'ýëÁ´ó€ô´þë'‚Z»yl~g:ÿÿåÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ó€õôøë‘'ƒZ¼yl~Žg:ýÿãÅs˜•D†€¥tØ:K rÿ rKpØ~¥E†”u˜æÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ r=KoØ}¥D†”r˜áÅ:gk~¼y€ZŒ'úëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿâÅs˜•D†¥tØ;K rÿ r;KuØ¥D†•s˜âÅüÿ:Žgl~¼y„Z‹'ùëÄ´õ€öÅ´úëŒ'€Z¼yk~g:áÅr˜”D†|¥vØ=K rÿ r:KsØ€¥F†•t˜äÅþÿ:gl~»yƒZ‘'÷ëôô€óÇ´üëŽ'Zºyk~Œg:æÅq˜”E†~¥pØ>K rÿ r?KqØ¥E†”u˜åÅ:‹gl~»y‚Z'ýëÁ´ô€ô´þë'‚Z»yl~‹g:ÿÿåÅt˜”E†¥rØ9K rÿ r>K pØ}¥E†”q˜çÅ:Œgk~ºyZ'ûëÆ´ó€õô÷ë‘'ƒZ»yl~g:þÿãÅs˜•D†€¥sØ:K rÿ rKqØ~¥E†”u˜æÅ:Œgl~»yZŽ'üëÇ´ó€ô´öë'ƒZ»yl~g:ÿÿäÅt˜•F†¥sØ:K rÿ r=K oØ}¥E†”q˜èÅ:gk~¼y€Z'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†¥tØ;K rÿ rK rÿ r9KrØ¥E†”u˜åÅ:‹gl~»y‚Z'ýë´ô€ô´ýë'‚Z»yl~‹g:åÅu˜”E†¥rØ?K rÿ r>K pØ}¥E†”q˜çÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë‘'ƒZ»yl~g:þÿäÅs˜•F†€¥sØ:K rÿ rK rÿ r?KqØ~¥E†”u˜æÅ:‹gl~»yZ'ýëÁ´ó€ô´öë'‚Z»yl~g:ÿÿäÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†€¥tØ;K rÿ rK rÿ r9KrØ¥E†•t˜åÅÿÿ:‹gl~»y‚Z'þë´ô€ôÁ´ýë'‚Z»yl~‹g:åÅu˜”E†¥qØ?K rÿ r>KpØ~¥E†”q˜æÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë‘'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ r=KvØ|¥D†”r˜áÅ:gk~¼y€ZŒ'úëÅ´ö€õÄ´ùë‹'„Z¼yl~Žg:üÿâÅs˜•D†¥uØ;K rÿ r;KtØ¥D†•s˜âÅýÿ:Žgl~¼y„ZŠ'øëÄ´õ€öÆ´úëŒ'€Z¼yk~g:áÅr˜”D†}¥oØ=K rÿ r:KsØ€¥F†•t˜äÅþÿ:fgÍ l~3»y™ƒZ 'f&÷ëÌ,ô33ô™9€@ófFÇ´ÌLüë3SŽ'™YZÿ_ºyffk~ÌlŒg2s:™yÿæÅ™yu˜2s”ÌlE†ff~¥ÿ_pØ™Y3S>KÌL rfFÿ@ r™9?K33Ì,qØf&~¥ E†™”3u˜Í æÅf:‹gl~»y‚Z'ýëÁ´ó€ô´þë'‚Z»yl~g:ÿÿåÅt˜•F†¥rØ9K rÿ r=K oØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ó€õôøëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†€¥tØ;K rÿ rKpØ~¥E†”u˜æÅ:Œgk~ºyZŽ'üëÇ´ó€ôô÷ë'ƒZ»yl~g:þÿäÅt˜•F†€¥sØ:K rÿ r=KoØ}¥D†”r˜áÅ:gk~¼y€ZŒ'úëÆ´ö€õÄ´øë‹'„Z¼yl~Žg:ýÿâÅs˜•D†¥tØ;K rÿ r;KuØ¥D†•s˜âÅüÿ:Žgl~¼y„Z‹'ùëÄ´õ€öÅ´úëŒ'€Z¼yk~g:áÅr˜”D†|¥vØ=K rÿ r:KsØ€¥F†•t˜äÅþÿ:gl~»yƒZ‘'÷ëôô€óÇ´üëŽ'Zºyk~Œg:æÅq˜”E†~¥pØ>K rÿ r?KqØ¥E†”u˜åÅ:‹gl~»y‚Z'ýëÁ´ô€ô´þë'‚Z»yl~‹g:ÿÿåÅt˜•E†¥rØ9K rÿ r>K pØ}¥E†”q˜çÅ:Œgk~ºy€Z'ûëÆ´ó€õô÷ë‘'ƒZ»yl~Žg:þÿãÅs˜•D†€¥tØ:K rÿ rKqØ~¥E†”u˜æÅ:Œgl~»yZŽ'üëÇ´ó€ô´÷ë'ƒZ»yl~g:ÿÿäÅt˜•F†¥sØ:K rÿ r=K oØ}¥E†”q˜èÅ:gk~¼y€Z'ûëÆ´ö€õÄ´øëŠ'„Z¼yl~Žg:ýÿãÅs˜•D†¥tØ;K rÿ rK rÿ r?K yØy¥C†•u˜åÅ:‹gk~½y|Zˆ'õëÁ´ô€ô´öëˆ'|Z½yk~‹g:åÅt˜•C†y¥yØ ?K rÿ r>K w؃¥B†•v˜çÅ:Œgk~½y†Z•'ôëÀ´ó€ôô÷ë‰'~Z¹yk~Šg:þÿäÅs˜•C†z¥lØ AKrÿ rK rÿ r?K yØy¥C†•t˜åÅÿÿ:‹gk~½y|Zˆ'öë´ô€ôÁ´õë‡'|Z½yk~‹g:åÅu˜•C†y¥yØ ?K rÿ r>K x؃¥B†•u˜æÅ:Œgk~½y†Z†'ôëÀ´ó€ôô÷ë‰'}Z¹yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=KvØ‚¥G†–v˜èÅ:gk~¼y…Z”'òë¿´ò€õÄ´ùë‹'Z¹ym~‰g:üÿâÅs˜•D†{¥mØÿBKrÿ r;KtØ¥F†“w˜êÅ:Žgl~¼y„Z’'ìÊ´ñ€öÆ´úëŒ'€Zºyl~‘g:ûÿáÅr˜”E†}¥oØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ'ÿëÉ´ø€÷Ç´üëŽ'Zºyl~g":ùÿßÅq˜”E†~¥pØ8K rÿ r8KqØ~¥E†”p˜ÞÅøÿ":gl~»y‚Z'ýëÈ´÷€øÈ´þë'‚Z»yl~g!:ÝÅo˜”F†¥rØ9K rÿr7KoØ}¥E†”q˜àÅúÿ:‘gl~ºy€Z'ûëÆ´ö€ñÊ´ì‘'„Z¼yl~Žg:êÅn˜“F†€¥tØ;K rÿrBKÿnØ|¥D†”r˜âÅüÿ:‰gm~ºyZ‹'ùëÅ´õ€ò¾´ì“'…Z¼yk~g:éÅw˜“G†‚¥uØK x؃¥C†•u˜æÅ:Œgk~½y‡Z†'ôëÀ´ó€ôô÷ë‰'}Z¾yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=KvØ‚¥G†–v˜èÅ:gk~¼y…Z”'òë¿´ò€õÄ´ùë‹'~Z¹ym~‰g:ýÿâÅs˜•D†{¥mØÿBKrÿ r;KuØ¥F†“w˜éÅ:Žgl~¼y„Z’'ì¾´ñ€öÅ´úëŒ'€Zºym~’g:ûÿáÅr˜”D†|¥oØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ‘'ÿëÉ´ø€÷Ç´üëŽ'Zºyl~‘g#:ùÿßÅq˜”E†~¥pØ8Krÿ r8KqØ~¥E†”p˜ÞÅ":gl~»y‚Z'ýëÈ´÷€÷È´þë'‚Z»yl~g!:ÞÅp˜”F†¥rØ9K rÿr7KpØ}¥E†”q˜àÅúÿ:‘gl~ºy€Z'ûëÆ´ö€ñÊ´ÿë‘'ƒZ»yl~Žg:êÅo˜”F†€¥tØ:K rÿr6KnØ|¥D†”r˜áÅûÿ:‰gm~ºyZŒ'úëÅ´ö€ò¾´ì“'…Z¼yk~g:éÅw˜“G†¥uØK xØ„¥C†•u˜æÅ:Œgk~½y‡Z‡'ôëÁ´ó€ô´÷ë‰'}Z¾yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=K wØ‚¥G†–v˜èÅ:gk~¼y†Z”'óë¿´ò€õÄ´øëŠ'~Z¹yj~‰g:ýÿãÅs˜•D†{¥mØþAKrÿ r;KuØ¥F†“w˜éÅ:Žgl~¼y„Z“'ì¾´ò€öÅ´úëŒ'€Zºym~’g:ûÿáÅr˜”D†|¥nØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ‘'ÿëÉ´ñ€÷Ç´üëŽ'Zºyl~‘g#:ùÿßÅq˜”E†~¥pØ7Krÿ r9KrØ¥E†”p˜ÞÅ!:gl~»y‚Z'ýëÈ´÷€÷È´ýë'‚Z»yl~g!:ÞÅp˜”E†¥rØ9K rÿr7KpØ}¥E†”q˜àÅùÿ#:‘gl~ºyZŽ'üëÇ´ö€ñÉ´ÿë‘'ƒZ»yl~g :ëÅo˜”F†€¥sØ:K rÿr6KnØ|¥D†”r˜áÅûÿ:ˆgm~ºyZŒ'úëÅ´ö€ò¾´ì“'„Z¼yk~Žg:éÅw˜“G†¥uØK rÿ r?K xØ„¥C†•u˜æÅ:‹gk~½y‡Z‡'õëÁ´ó€ô´öëˆ'}Z¾yk~Šg:ÿÿäÅt˜•C†z¥zØ @K rÿ r=K w؃¥G†•v˜çÅ:Œgk~½y†Z”'óë¿´ó€õÄ´øëŠ'~Z¹yj~‰g:ýÿãÅs˜•D†{¥lØþAKrÿ rK rÿ r?K yØy¥C†•u˜æÅ:‹gk~½y‡Z‡'õëÁ´ó€ô´öëˆ'}Z¾yk~‹g:ÿÿåÅt˜•C†y¥zØ @K rÿ r=K w؃¥G†•v˜çÅ:Œgk~½y†Z•'óëÀ´ó€õôøëŠ'~Z¹yj~Šg:ýÿãÅs˜•D†{¥lØAKrÿ rK rÿ r?K yØy¥C†•u˜åÅ:‹gk~½y‡Z‡'õëÁ´ô€ô´öëˆ'}Z½yk~‹g:ÿÿåÅt˜•C†y¥zØ ?K rÿ r=K w؃¥B†•v˜çÅ:Œgk~½y†Z•'óëÀ´ó€õôøëŠ'~Z¹yj~Šg:ýÿãÅs˜•D†{¥lØ AKrÿ rK rÿ r?K yØy¥C†•u˜åÅ:‹gk~½y|Zˆ'õëÁ´ô€ô´öëˆ'|Z½yk~‹g:ÿÿåÅt˜•C†y¥yØ ?K rÿ r>K w؃¥B†•v˜çÅ:Œgk~½y†Z•'ôëÀ´ó€õô÷ë‰'~Z¹yj~Šg:þÿãÅs˜•D†z¥lØ AKrÿ rK rÿ r?K yØy¥C†•t˜åÅÿÿ:‹gk~½y|Zˆ'öë´ô€ôÁ´õëˆ'|Z½yk~‹g:åÅu˜•C†y¥yØ ?K rÿ r>K x؃¥B†•u˜çÅ:Œgk~½y†Z†'ôëÀ´ó€ôô÷ë‰'}Z¹yk~Šg:þÿäÅt˜•C†z¥lØ AK rÿ rK x؃¥C†•u˜æÅ:Œgk~½y‡Z†'ôëÀ´ó€ôô÷ë‰'}Z¹yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=KvØ‚¥G†–v˜èÅ:gk~¼y…Z”'òë¿´ò€õÄ´ùë‹'Z¹ym~‰g:üÿâÅs˜•D†{¥mØÿBKrÿ r;KuØ¥F†“w˜éÅ:Žgl~¼y„Z’'ìÊ´ñ€öÅ´úëŒ'€Zºym~‘g:ûÿáÅr˜”D†}¥oØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ‘'ÿëÉ´ø€÷Ç´üëŽ'Zºyl~g":ùÿßÅq˜”E†~¥pØ8Krÿ r8KqØ~¥E†”p˜ÞÅ":gl~»y‚Z'ýëÈ´÷€øÈ´þë'‚Z»yl~g!:ÞÅp˜”F†¥rØ9K rÿr7KpØ}¥E†”q˜àÅúÿ:‘gl~ºy€Z'ûëÆ´ö€ñÊ´ì‘'ƒZ¼yl~Žg:êÅo˜“F†€¥tØ:K rÿr6KnØ|¥D†”r˜áÅûÿ:‰gm~ºyZŒ'úëÅ´ö€ò¾´ì“'…Z¼yk~g:éÅw˜“G†¥uØK xØ„¥C†•u˜æÅ:Œgk~½y‡Z‡'ôëÁ´ó€ô´÷ë‰'}Z¾yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=KvØ‚¥G†–v˜èÅ:gk~¼y†Z”'óë¿´ò€õÄ´øëŠ'~Z¹ym~‰g:ýÿâÅs˜•D†{¥mØþBKrÿ r;KuØ¥F†“w˜éÅ:Žgl~¼y„Z’'ì¾´ò€öÅ´úëŒ'€Zºym~’g:ûÿáÅr˜”D†|¥nØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ‘'ÿëÉ´ñ€÷Ç´üëŽ'Zºyl~‘g#:ùÿßÅq˜”E†~¥pØ7Krÿ r9KqØ¥E†”p˜ÞÅ!:gl~»y‚Z'ýëÈ´÷€÷È´þë'‚Z»yl~g!:ÞÅp˜”E†¥rØ9K rÿr7KpØ}¥E†”q˜àÅùÿ#:‘gl~ºyZ'ûëÆ´ö€ñÊ´ÿë‘'ƒZ»yl~g :êÅo˜”F†€¥sØ:K rÿr6KnØ|¥D†”r˜áÅûÿ:ˆgm~ºyZŒ'úëÅ´ö€ò¾´ì“'…Z¼yk~Žg:éÅw˜“G†¥uØK xØ„¥C†•u˜æÅ:Œgk~½y‡Z‡'õëÁ´ó€ô´öë‰'}Z¾yk~Šg:ÿÿäÅt˜•C†z¥kØ @K rÿ r=K wØ‚¥G†•v˜çÅ:gk~¼y†Z”'óë¿´ò€õÄ´øëŠ'~Z¹yj~‰g:ýÿãÅs˜•D†{¥mØþAKrÿ rK rÿ r?K yØ„¥C†•u˜æÅ:‹gk~½y‡Z‡'õëÁ´ó€ô´öëˆ'}Z¾yk~‹g:ÿÿäÅt˜•C†z¥zØ @K rÿ r=K w؃¥G†•v˜çÅ:Œgk~½y†Z•'óëÀ´ó€õÄ´øëŠ'~Z¹yj~Šg:ýÿãÅs˜•D†{¥lØAKrÿ rK rÿ r?K yØy¥C†•u˜æÅ:‹gk~½y‡Z‡'õëÁ´ó€ô´öëˆ'}Z½yk~‹g:ÿÿåÅt˜•C†y¥zØ @K rÿ r=K w؃¥G†•v˜çÅ:Œgk~½y†Z•'óëÀ´ó€õôøëŠ'~Z¹yj~Šg:ýÿãÅs˜•D†{¥lØAKrÿ rK rÿ r?K yØy¥C†•u˜åÅ:‹gk~½y‡Z‡'õëÁ´ô€ô´öëˆ'|Z½yk~‹g:ÿÿåÅt˜•C†y¥yØ ?K rÿ r>K w؃¥B†•v˜çÅ:Œgk~½y†Z•'ôëÀ´ó€õô÷ëŠ'~Z¹yj~Šg:þÿãÅs˜•D†z¥lØ AKrÿ rK rÿ r?K yØy¥C†•u˜åÅ:‹gk~½y|Zˆ'öë´ô€ô´õëˆ'|Z½yk~‹g:åÅu˜•C†y¥yØ ?K rÿ r>K x؃¥B†•v˜çÅ:Œgk~½y†Z†'ôëÀ´ó€ôô÷ë‰'~Z¹yk~Šg:þÿäÅs˜•C†z¥lØ AKrÿ rK rÿ r?K yØy¥C†•t˜åÅÿÿ:‹gk~½y|Zˆ'öë´ô€ôÁ´õë‡'‡Z½yk~‹g:åÅu˜•C†y¥yØ ?K rÿ r>K x؃¥B†•u˜æÅ:Œgk~½y‡Z†'ôëÀ´ó€ôô÷ë‰'}Z¹yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=KvØ‚¥G†–v˜èÅ:gk~¼y…Z”'òë¿´ò€õÄ´ùë‹'Z¹ym~‰g:üÿâÅs˜•D†{¥mØÿBKrÿ r;KtØ¥F†“w˜êÅ:Žgl~¼y„Z’'ìÊ´ñ€öÆ´úëŒ'€Zºym~‘g:ûÿáÅr˜”D†}¥oØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ'ÿëÉ´ø€÷Ç´üëŽ'Zºyl~g":ùÿßÅq˜”E†~¥pØ8K rÿ r8KqØ~¥E†”p˜ÞÅøÿ":gl~»y‚Z'ýëÈ´÷€øÈ´þë'‚Z»yl~g!:ÞÅp˜”F†¥rØ9K rÿr7KoØ}¥E†”q˜àÅúÿ:‘gl~ºy€Z'ûëÆ´ö€ñÊ´ì‘'„Z¼yl~Žg:êÅn˜“F†€¥tØ;K rÿrBKÿnØ|¥D†”r˜âÅüÿ:‰gm~ºyZ‹'ùëÅ´õ€ò¾´ì“'…Z¼yk~g:éÅw˜“G†‚¥uØK x؃¥C†•u˜æÅ:Œgk~½y‡Z†'ôëÀ´ó€ôô÷ë‰'}Z¾yk~Šg:þÿäÅt˜•C†z¥kØ @K rÿ r=KvØ‚¥G†–v˜èÅ:gk~¼y…Z”'óë¿´ò€õÄ´øë‹'~Z¹ym~‰g:ýÿâÅs˜•D†{¥mØÿBKrÿ r;KuØ¥F†“w˜éÅ:Žgl~¼y„Z’'ì¾´ò€öÅ´úëŒ'€Zºym~’g:ûÿáÅr˜”D†|¥oØ6Krÿ r:KsØ€¥F†”o˜ëÅ :gl~»yƒZ‘'ÿëÉ´ø€÷Ç´üëŽ'Zºyl~‘g#:ùÿßÅq˜”E†~¥pØ8Krÿ r8KqØ~¥E†”p˜ÞÅ":gl~»y‚Z'ýëÈ´÷€÷È´þë'‚Z»yl~g!:ÞÅp˜”F†¥rØ9K rÿr7KpØ}¥E†”q˜àÅúÿ:‘gl~ºy€Z'ûëÆ´ö€ñÊ´ÿë‘'ƒZ»yl~Žg:êÅo˜”F†€¥tØ:K rÿr6KnØ|¥D†”r˜áÅûÿ:ˆgm~ºyZŒ'úëÅ´ö€ò¾´ì“'…Z¼yk~g:éÅw˜“G†¥uØK xØ„¥C†•u˜æÅ:Œgk~½y‡Z‡'ôëÁ´ó€ô´÷ë‰'}Z¾yk~Šg:ÿÿäÅt˜•C†z¥kØ @K rÿ r=K wØ‚¥G†–v˜èÅ:gk~¼y†Z”'óë¿´ò€õÄ´øëŠ'~Z¹yj~‰g:ýÿãÅs˜•D†{¥mØþAKrÿ rK rÿ r?K xØ„¥C†•u˜æÅ:‹gk~½y‡Z‡'õëÁ´ó€ô´öëˆ'}Z¾yk~‹g:ÿÿäÅt˜•C†z¥zØ @K rÿ r=K w؃¥G†•v˜çÅ:Œgk~½y†Z”'óë¿´ó€õÄ´øëŠ'~Z¹yj~‰g:ýÿãÅs˜•D†{¥lØþAKrÿ rKÍ 3™ Í 3™ sØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ s˜Í 3™ ãÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ l~Í 3™ »yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Ã´Í 3™ õÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ûëÍ 3™ 'Í 3™ ZÍ 3™ »yÍ 3™ l~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ ãÅÍ 3™ s˜Í 3™ ”Í 3™ E†Í 3™ }¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ sØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ s˜Í 3™ ãÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ l~Í 3™ »yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Ã´Í 3™ õÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ûëÍ 3™ 'Í 3™ ZÍ 3™ »yÍ 3™ l~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ ãÅÍ 3™ s˜Í 3™ ”Í 3™ E†Í 3™ }¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ sØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ s˜Í 3™ ãÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ l~Í 3™ »yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Ã´Í 3™ õÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ üëÍ 3™ 'Í 3™ ZÍ 3™ »yÍ 3™ l~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ ãÅÍ 3™ s˜Í 3™ ”Í 3™ E†Í 3™ }¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ »yÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ÷ëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ {¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ vØÍ 3™ Í 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ 'Í 3™ üëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ Ž'Í 3™ ýëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ rØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ þëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ ýëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ qØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ üÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ }¥Í 3™ vØÍ 3™ Í 3™ =KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ •Í 3™ t˜Í 3™ äÅÍ 3™ þÿÍ 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÷ëÍ 3™ Ã´Í 3™ ôÍ 3™ €Í 3™ óÍ 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ k~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ æÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ >KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ ‘'Í 3™ ƒZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ÷ëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ Œ'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ vØÍ 3™ Í 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ 'Í 3™ üëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ½yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ rØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ ýëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ rØÍ 3™ ¥Í 3™ F†Í 3™ •Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ þëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ ýëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ qØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ üÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ tØÍ 3™ ¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ ýÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Æ´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ }¥Í 3™ oØÍ 3™ Í 3™ =KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ •Í 3™ t˜Í 3™ äÅÍ 3™ þÿÍ 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ 'Í 3™ ÷ëÍ 3™ Ã´Í 3™ ôÍ 3™ €Í 3™ óÍ 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ k~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ æÅÍ 3™ u˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ >KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ ‘'Í 3™ ƒZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ Œ'Í 3™ úëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ vØÍ 3™ Í 3™ =KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ •Í 3™ t˜Í 3™ äÅÍ 3™ þÿÍ 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÷ëÍ 3™ Ã´Í 3™ ôÍ 3™ €Í 3™ óÍ 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ k~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ æÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ >KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ rØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ýëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ s˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ rØÍ 3™ ¥Í 3™ E†Í 3™ •Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ þëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ ýëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ qØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ üÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ tØÍ 3™ ¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ ýÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ Š'Í 3™ øëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Æ´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ }¥Í 3™ oØÍ 3™ Í 3™ =KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ •Í 3™ t˜Í 3™ äÅÍ 3™ þÿÍ 3™ :fÍ 3™ gÍ Í 3™ l~3Í 3™ »y™Í 3™ ƒZ Í 3™ 'f&Í 3™ ÷ëÌ,Í 3™ ô33Í 3™ ô™9Í 3™ €@Í 3™ ófFÍ 3™ Ç´ÌLÍ 3™ üë3SÍ 3™ Ž'™YÍ 3™ Zÿ_Í 3™ ºyffÍ 3™ k~ÌlÍ 3™ Œg2sÍ 3™ :™yÍ 3™ ÿÍ 3™ æÅ™yÍ 3™ u˜2sÍ 3™ ”ÌlÍ 3™ E†ffÍ 3™ ~¥ÿ_Í 3™ pØ™YÍ 3™ 3SÍ 3™ >KÌLÍ 3™ rfFÍ 3™ ÿ@Í 3™ r™9Í 3™ ?K33Í 3™ Ì,Í 3™ qØf&Í 3™ ~¥ Í 3™ E†™Í 3™ ”3Í 3™ u˜Í Í 3™ æÅfÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ pØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ Œ'Í 3™ úëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ ‹'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ D†Í 3™ •Í 3™ s˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Ä´Í 3™ õÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ vØÍ 3™ Í 3™ =KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ •Í 3™ t˜Í 3™ äÅÍ 3™ þÿÍ 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÷ëÍ 3™ Ã´Í 3™ ôÍ 3™ €Í 3™ óÍ 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ k~Í 3™ ŒgÍ 3™ :Í 3™ Í 3™ æÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ >KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ qØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ þÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ l~Í 3™ »yÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ÷ëÍ 3™ 'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ F†Í 3™ ¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ ¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ |ZÍ 3™ ˆ'Í 3™ õëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ |ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ ~ZÍ 3™ ¹yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ s˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ |ZÍ 3™ ˆ'Í 3™ öëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ õëÍ 3™ ‡'Í 3™ |ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¹yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ …ZÍ 3™ ”'Í 3™ òëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ ZÍ 3™ ¹yÍ 3™ m~Í 3™ ‰gÍ 3™ :Í 3™ üÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ ÿÍ 3™ BKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ tØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ êÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ’'Í 3™ ìÍ 3™ Ê´Í 3™ ñÍ 3™ €Í 3™ öÍ 3™ Æ´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ l~Í 3™ ‘gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ E†Í 3™ }¥Í 3™ oØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ 'Í 3™ ÿëÍ 3™ É´Í 3™ øÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ gÍ 3™ ":Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 8KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 8KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ øÿÍ 3™ ":Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ øÍ 3™ È´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÝÅÍ 3™ o˜Í 3™ ”Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ úÿÍ 3™ :Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ Ê´Í 3™ ìÍ 3™ ‘'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ êÅÍ 3™ n˜Í 3™ “Í 3™ F†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ BKÍ 3™ ÿÍ 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ‰gÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Å´Í 3™ õÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ …ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ‚¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ …ZÍ 3™ ”'Í 3™ òëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ ~ZÍ 3™ ¹yÍ 3™ m~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ ÿÍ 3™ BKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ éÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ’'Í 3™ ìÍ 3™ ¾´Í 3™ ñÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ m~Í 3™ ’gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ oØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÿëÍ 3™ É´Í 3™ øÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ ‘gÍ 3™ #:Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 8KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 8KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ Í 3™ ":Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ ÷Í 3™ È´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÞÅÍ 3™ p˜Í 3™ ”Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ úÿÍ 3™ :Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ Ê´Í 3™ ÿëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ êÅÍ 3™ o˜Í 3™ ”Í 3™ F†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 6KÍ 3™ Í 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ ûÿÍ 3™ :Í 3™ ‰gÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ …ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ Í 3™ xØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ ôëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ †ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ þÍ 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ éÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ “'Í 3™ ìÍ 3™ ¾´Í 3™ òÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ m~Í 3™ ’gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ nØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÿëÍ 3™ É´Í 3™ ñÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ ‘gÍ 3™ #:Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 7KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ rØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ Í 3™ !:Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ ÷Í 3™ È´Í 3™ ýëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÞÅÍ 3™ p˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ ùÿÍ 3™ #:Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ ZÍ 3™ Ž'Í 3™ üëÍ 3™ Ç´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ É´Í 3™ ÿëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ Í 3™ ëÅÍ 3™ o˜Í 3™ ”Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 6KÍ 3™ Í 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ ûÿÍ 3™ :Í 3™ ˆgÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ „ZÍ 3™ ¼yÍ 3™ k~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ xØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ zØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ G†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ lØÍ 3™ þÍ 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ zØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ G†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ óëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ŠgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ }ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ zØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ óëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ŠgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ |ZÍ 3™ ˆ'Í 3™ õëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ |ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ z¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ |ZÍ 3™ ˆ'Í 3™ öëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ õëÍ 3™ ˆ'Í 3™ |ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ u˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¹yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¹yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ …ZÍ 3™ ”'Í 3™ òëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ ZÍ 3™ ¹yÍ 3™ m~Í 3™ ‰gÍ 3™ :Í 3™ üÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ ÿÍ 3™ BKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ éÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ’'Í 3™ ìÍ 3™ Ê´Í 3™ ñÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ m~Í 3™ ‘gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ }¥Í 3™ oØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÿëÍ 3™ É´Í 3™ øÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ gÍ 3™ ":Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 8KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 8KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ Í 3™ ":Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ øÍ 3™ È´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÞÅÍ 3™ p˜Í 3™ ”Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ úÿÍ 3™ :Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ Ê´Í 3™ ìÍ 3™ ‘'Í 3™ ƒZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ êÅÍ 3™ o˜Í 3™ “Í 3™ F†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 6KÍ 3™ Í 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ ûÿÍ 3™ :Í 3™ ‰gÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ …ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ Í 3™ xØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ ôëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ †ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ m~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ þÍ 3™ BKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ éÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ’'Í 3™ ìÍ 3™ ¾´Í 3™ òÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ m~Í 3™ ’gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ nØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÿëÍ 3™ É´Í 3™ ñÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ ‘gÍ 3™ #:Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 7KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 9KÍ 3™ Í 3™ qØÍ 3™ ¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ Í 3™ !:Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ ÷Í 3™ È´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÞÅÍ 3™ p˜Í 3™ ”Í 3™ E†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ ùÿÍ 3™ #:Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ Ê´Í 3™ ÿëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ :Í 3™ Í 3™ êÅÍ 3™ o˜Í 3™ ”Í 3™ F†Í 3™ €¥Í 3™ sØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 6KÍ 3™ Í 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ ûÿÍ 3™ :Í 3™ ˆgÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ …ZÍ 3™ ¼yÍ 3™ k~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ Í 3™ xØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ‚¥Í 3™ G†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ †ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ þÍ 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ zØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ G†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ óëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ŠgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ }ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ zØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ G†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ óëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ŠgÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ |ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ åÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ •'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ã´Í 3™ ÷ëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ z¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ åÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ |ZÍ 3™ ˆ'Í 3™ öëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ õëÍ 3™ ˆ'Í 3™ |ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ ~ZÍ 3™ ¹yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ s˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ lØÍ 3™ Í 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ yØÍ 3™ y¥Í 3™ C†Í 3™ •Í 3™ t˜Í 3™ åÅÍ 3™ ÿÿÍ 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ |ZÍ 3™ ˆ'Í 3™ öëÍ 3™ Â´Í 3™ ôÍ 3™ €Í 3™ ôÍ 3™ Á´Í 3™ õëÍ 3™ ‡'Í 3™ ‡ZÍ 3™ ½yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ Í 3™ åÅÍ 3™ u˜Í 3™ •Í 3™ C†Í 3™ y¥Í 3™ yØÍ 3™ Í 3™ ?KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ B†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¹yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ …ZÍ 3™ ”'Í 3™ òëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ ùëÍ 3™ ‹'Í 3™ ZÍ 3™ ¹yÍ 3™ m~Í 3™ ‰gÍ 3™ :Í 3™ üÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ ÿÍ 3™ BKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ tØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ êÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ’'Í 3™ ìÍ 3™ Ê´Í 3™ ñÍ 3™ €Í 3™ öÍ 3™ Æ´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ m~Í 3™ ‘gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ }¥Í 3™ oØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ 'Í 3™ ÿëÍ 3™ É´Í 3™ øÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ gÍ 3™ ":Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 8KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 8KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ øÿÍ 3™ ":Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ øÍ 3™ È´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÞÅÍ 3™ p˜Í 3™ ”Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ oØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ úÿÍ 3™ :Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ Ê´Í 3™ ìÍ 3™ ‘'Í 3™ „ZÍ 3™ ¼yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ êÅÍ 3™ n˜Í 3™ “Í 3™ F†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ ;KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ BKÍ 3™ ÿÍ 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ âÅÍ 3™ üÿÍ 3™ :Í 3™ ‰gÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ ‹'Í 3™ ùëÍ 3™ Å´Í 3™ õÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ …ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ‚¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ Í 3™ xØÍ 3™ ƒ¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ †'Í 3™ ôëÍ 3™ À´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Ã´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ þÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ vØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ …ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ ‹'Í 3™ ~ZÍ 3™ ¹yÍ 3™ m~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ âÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ ÿÍ 3™ BKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ;KÍ 3™ Í 3™ uØÍ 3™ ¥Í 3™ F†Í 3™ “Í 3™ w˜Í 3™ éÅÍ 3™ Í 3™ :Í 3™ ŽgÍ 3™ l~Í 3™ ¼yÍ 3™ „ZÍ 3™ ’'Í 3™ ìÍ 3™ ¾´Í 3™ òÍ 3™ €Í 3™ öÍ 3™ Å´Í 3™ úëÍ 3™ Œ'Í 3™ €ZÍ 3™ ºyÍ 3™ m~Í 3™ ’gÍ 3™ :Í 3™ ûÿÍ 3™ áÅÍ 3™ r˜Í 3™ ”Í 3™ D†Í 3™ |¥Í 3™ oØÍ 3™ Í 3™ 6KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ :KÍ 3™ Í 3™ sØÍ 3™ €¥Í 3™ F†Í 3™ ”Í 3™ o˜Í 3™ ëÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ƒZÍ 3™ ‘'Í 3™ ÿëÍ 3™ É´Í 3™ øÍ 3™ €Í 3™ ÷Í 3™ Ç´Í 3™ üëÍ 3™ Ž'Í 3™ ZÍ 3™ ºyÍ 3™ l~Í 3™ ‘gÍ 3™ #:Í 3™ ùÿÍ 3™ ßÅÍ 3™ q˜Í 3™ ”Í 3™ E†Í 3™ ~¥Í 3™ pØÍ 3™ Í 3™ 8KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 8KÍ 3™ Í 3™ qØÍ 3™ ~¥Í 3™ E†Í 3™ ”Í 3™ p˜Í 3™ ÞÅÍ 3™ Í 3™ ":Í 3™ gÍ 3™ l~Í 3™ »yÍ 3™ ‚ZÍ 3™ 'Í 3™ ýëÍ 3™ È´Í 3™ ÷Í 3™ €Í 3™ ÷Í 3™ È´Í 3™ þëÍ 3™ 'Í 3™ ‚ZÍ 3™ »yÍ 3™ l~Í 3™ gÍ 3™ !:Í 3™ Í 3™ ÞÅÍ 3™ p˜Í 3™ ”Í 3™ F†Í 3™ ¥Í 3™ rØÍ 3™ Í 3™ 9KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 7KÍ 3™ Í 3™ pØÍ 3™ }¥Í 3™ E†Í 3™ ”Í 3™ q˜Í 3™ àÅÍ 3™ úÿÍ 3™ :Í 3™ ‘gÍ 3™ l~Í 3™ ºyÍ 3™ €ZÍ 3™ 'Í 3™ ûëÍ 3™ Æ´Í 3™ öÍ 3™ €Í 3™ ñÍ 3™ Ê´Í 3™ ÿëÍ 3™ ‘'Í 3™ ƒZÍ 3™ »yÍ 3™ l~Í 3™ ŽgÍ 3™ :Í 3™ Í 3™ êÅÍ 3™ o˜Í 3™ ”Í 3™ F†Í 3™ €¥Í 3™ tØÍ 3™ Í 3™ :KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ 6KÍ 3™ Í 3™ nØÍ 3™ |¥Í 3™ D†Í 3™ ”Í 3™ r˜Í 3™ áÅÍ 3™ ûÿÍ 3™ :Í 3™ ˆgÍ 3™ m~Í 3™ ºyÍ 3™ ZÍ 3™ Œ'Í 3™ úëÍ 3™ Å´Í 3™ öÍ 3™ €Í 3™ òÍ 3™ ¾´Í 3™ ìÍ 3™ “'Í 3™ …ZÍ 3™ ¼yÍ 3™ k~Í 3™ gÍ 3™ :Í 3™ Í 3™ éÅÍ 3™ w˜Í 3™ “Í 3™ G†Í 3™ ¥Í 3™ uØÍ 3™ Í 3™ KÍ 3™ Í 3™ xØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ ôëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ ÷ëÍ 3™ ‰'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ŠgÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ kØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ‚¥Í 3™ G†Í 3™ –Í 3™ v˜Í 3™ èÅÍ 3™ Í 3™ :Í 3™ gÍ 3™ k~Í 3™ ¼yÍ 3™ †ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ òÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ mØÍ 3™ þÍ 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ ?KÍ 3™ Í 3™ xØÍ 3™ „¥Í 3™ C†Í 3™ •Í 3™ u˜Í 3™ æÅÍ 3™ Í 3™ :Í 3™ ‹gÍ 3™ k~Í 3™ ½yÍ 3™ ‡ZÍ 3™ ‡'Í 3™ õëÍ 3™ Á´Í 3™ óÍ 3™ €Í 3™ ôÍ 3™ Â´Í 3™ öëÍ 3™ ˆ'Í 3™ }ZÍ 3™ ¾yÍ 3™ k~Í 3™ ‹gÍ 3™ :Í 3™ ÿÿÍ 3™ äÅÍ 3™ t˜Í 3™ •Í 3™ C†Í 3™ z¥Í 3™ zØÍ 3™ Í 3™ @KÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ =KÍ 3™ Í 3™ wØÍ 3™ ƒ¥Í 3™ G†Í 3™ •Í 3™ v˜Í 3™ çÅÍ 3™ Í 3™ :Í 3™ ŒgÍ 3™ k~Í 3™ ½yÍ 3™ †ZÍ 3™ ”'Í 3™ óëÍ 3™ ¿´Í 3™ óÍ 3™ €Í 3™ õÍ 3™ Ä´Í 3™ øëÍ 3™ Š'Í 3™ ~ZÍ 3™ ¹yÍ 3™ j~Í 3™ ‰gÍ 3™ :Í 3™ ýÿÍ 3™ ãÅÍ 3™ s˜Í 3™ •Í 3™ D†Í 3™ {¥Í 3™ lØÍ 3™ þÍ 3™ AKÍ 3™ rÍ 3™ ÿÍ 3™ rÍ 3™ >CCGGLPPUUYY^bbggkkpttyy}}‚††‹‹”˜˜¡¡¦ªª¯¯³³¸¼¼ÁÁÅÅÊÎÎÓÓ××Üààååééîòò÷÷ûûÿ9LAME3.99rq.0$@"00ð¶‹´çÿû8Ä 8CNU„€•‘ê8Ð ¯ÄWEt—,¹eãZëb!Þ罟v{ÉÖ&²—mu»à`@0(@Äæ4`ûÄ€!ïÿ§ÝÓîé÷bL¬JÁü>¨à‡O¸A À(8 ˫ƒ¾dÔ¡ÍfH›–ðfP²i1Á„B@bC/¶ "|¨r‚ÕøO‡h‰oøîa†$G¨õÿó"ðö1.—L‹ßáPTDñTA_ÿ– †‹*C±€^Ñ€º€ÿû8ăÌ-ýû…£ßèÐzÑ\Y… I‰@D9ƒfcy‰h ƒ˜^™ã‰ºù®˜bNá2€6Y‚< ÙƒI€ÞÑÈvjí¯>tÓfZˆ{ÿþßÑÿÿ%ÝûGwìd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_•;c˜ä€#ƒÇÓbÿöÿÿÛ‚ˆD ñ…N&2k¯Ê`ŒÌa“”`uªc3@t>Æ,~¥øc÷ža³hÿû8ăÊÐ-„Á£A¿ô`õ€*sa³Fæ|(°„`q(À?l‡é™ßÿùÓ·éÿÚ{èÿOþÒñ€@ÂÆ4gå%`Õ…„abˆa· aßÒgVþNjãbx jÂÚf ¬cqa¨„À p2Ð-û?ÿìd`@# 2C#Mk:oƒ,Es @Ks p3,eóQÃ÷Ó}$…³õ'ÃbÓ34‹# Çs…#ÄÁóD+Švÿ³ÿþÑÿÿÿÿÑÿ°ÀÀó‡ 50yÿû8Ä,ɸ- ÿ¤a…¢AÏð˜xÅK³;í ÁôL%²eÌE‘ x2Žj:¡1Œ{ÀÀL6fŒ=Nnˆ5ð¼Ë °¼ÀbƦŸÑoþŸE¿ˆ}>†ÿ±ßÛú?ö*d©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_•;c˜ä€#ƒÇÓbÿöÿÿÛþP !€Æ8˜É¬f¿)‚0C1„NQÔ©ŒÌ Ðû±ú”áÞy†Ì¡ƒÖ¨ÿû8Ä:È-ÿF‚žâAÏÔ˜Ø@ÍŸ bÂJDêõÿßÿÿÿÿþ¯Wï©ÿ½¼ïë_îÿ}ú½u/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1'€Ù¬-¦`šÆ7fˆ@€<8(ÑGÿÿþÏôÿäÙÃELÈÓZΛàÁË\ÃÜÂ\ŒÂ |ÔpýôßI!lýIðØ´ÌÍ"ÈÈ1ÜÅ¡HÄ1Â0|Á@ â¿ÿÿÿôDßùÿÿÑBÿû8ÄJƒÈè- ÿ¤5…£¿ôP4€,*–c)üÂL˜+bÓ˜Q!<blÝ’Ob•‘€Þ˜?`t#@Bj1²‚•Ä"!Pe—SMhêwÓþßÙ%ÿ³ÿÿô;þBÆJ“aÀ ?12\36¨ð;oèÿöé‘ÿÑÿÿúö—ˆ1 ³?(9(3¬,# aP„Ü`•z`Sp{x¶À$-8† $ÿÿŸÿÿó¿ÿ÷ÿÖÿÿÿêie¨0ó(4“ŽÖ0cÃÍ0«!0„0qÅ•4{·½6ÝGS0Ö‚*0UÁ 0-š=ùNdcnÔÍ™1À^)ÿû8Ä”‚ h]þ†<…¤)ßéÛüSÿ3ýŸ¢Oÿ#ÿþŸýŠKÔB£†Žd÷ðp¦(Цx<vÆ3{ÆÔx~Æà*& †  ׯ  À¨P±!IïÿÿÔ{ÿÿÎ?ÿýßõÿÿõ2T›Áùˆ@q’ᙵGÙã…º Qƒ5¡‡3éáŒ8B€²y(Á`/Â]€8ä€p>X…ÿÿýhÿÿùÆÿý4ä?ÿÑÿ¢> )†”¬ã\ “&(ÿû8ĨƒÉà‡ ~„Á9…£A¿è˜\†SìF §q銆¬À*Ç]†æ‰¸8´0Ô0`‰6…uõ¿zÛ÷÷׿ÿwÿûþþ¿¬¼@à0±™ùAÉA˜5aaXâmÁB˜wô™Õ¿“š¸ÄX˜`!d+¶˜ k›`cRÀhÁ³C·ÿÿõÿù×ÿ¿þ¿ÿûÿVºtËø`af,@f©fõp`­†¦a+:`æ*`ƉÆgÞaÚl ŒÖawÄ`”Î`Nÿû8Ļʇ þ„Á6‘#ßÐÐ~¨kU•"Ä—*~¿ÿê4ÿÿó¯ÿýËwýoÿÿwýeÁ ‚À¥†Æg°“& Ø´æHO#X›·d…‡Ø¥F$`7¦ØÐ jÒ0"Ep `Ȥ÷÷ÿûOáŸíÿGþŸÿôéþÚd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.± ÿÿúÓÿÿóŸÿßý_ÿ÷ÿÿû8Ä̓Š+#Nÿ¨SãA¿Ô˜Ô ˆ@ã œLdÖ3_”Á!˜Â '(Àê TÆf€è}ŒXýJðÇï<ÃfÐÁëTlfÀÏ…1a %?ÕRÿþìBþ¯þ©H÷ÿëÿýõ›?·úêçÿ×ûmëKÿ»ïç>º/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíýÿÐWÿÿZg¿ÿîÿÝÿþïú™ÿû8ÄÜÊŒ‡ þ„ÁP‹£A¿Ô˜#4S#4³˜ƒ,Es @Ks p3,eóQÃ÷Ó}$…³õ'ÃbÓ34‹# Çs…#ÄÁóD+Šv×ÿô07ÿú°A-ÿÖŸÿ·ÿÿú·ÿªÿêŠÿöíìÿÿµ0,0¬Áe(LË|0R†Ù0ƒÈi0óC´1¥G68z5z<¾G°1±‚Ÿ0¾Ád0lÓ0C@t0(€%0@€J`²¯ÖŸ·ÿ`‚­ÿÿ†ÿjßÿéÐÿû8ÄéÉœ‡þ†®¬âAÏÔ˜X?ÿß°?ÿÆ^ŸéñíÙwGÿõŒ•&Ã@~bd¸fmQàvxÄanƒ`ÃhaÌúxc€`,…B 0X ð—`Ž9 …Ö!ÿÿQåÿË»ñÿñßõ¿÷ÿõ~µ€àbÈ d`òùŠ[Ó˜ƒ®9$JA<˜³@µqof¹Á¾Þ`Y˜_5`Ãkh¨„$€Ã Þ„}L¶ïýÓ*¡ÿõu1+ÿWº½ÿïÍÿÿû8Äîʨ‹ þ¤Á¨°ãþ‰Pþ­%?ÿ«êÿ¯Üï¿­ÿÔÕ®‰i`t`ŠEÙ 2Mšù¼Áu  Âj 0ÃÌÃFüÌßÝÄÓt¡ ¸Á*ôÀ§àöð5m€0HZp Hêu×^¯ÕÖ}ž»2§þA¿ègéÿÿ³Gä#1Yj $<Ç d㵌ðóL*ÁL!ÌqeMíïM·QÔÌ5 ŠŒpBÌ @&€÷å™ »P3f@Ç fD;ªºûæËÿuýõÿû8ÄïƒÍ͇|EA<‹ãßÐС_îŸÿ©ß¿þ3þ¿ÔáS €°ªT‚ Ì" t¬LÃÔMw[•µŒÙE]GPÁŒ*€?LŒ ÀÀíœl HØ^°Ù…ÊmߺÞìêêêoõ}Må†ü†ŸÓÿ’ý?Ñ.kÑfßÒd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.± ¯«ÿü÷þkô7ôÑÿ·öÿÒßûH4B!Œ*q1“ÿû8ÄòNM‡.~¤Ág‹£¥¯Ð˜XÍ~S`†c,œ£¨-S˜¡ö1cõ(?ü ó ˜c¬p9°x š7>Å„ 08”ˆý}[ÿ÷:uÿWÈóßöÖÊ}_ûê51ÿ÷¿}Þ³ßoõyæûê÷¿þ¹Új/80ÆÐføf XXF x†pP¦ðí&uoäæ®1'€Ù¬-¦`šÆ7fˆ@€<8(öÿÿÔ7ÿÿ°×ÿÿÓÿètÿÿÚÿÿoÿþÉÿû8Äí ‡-þ„Ál$ißÑÿôúýG20 Fh¦ Fh f0XŠæ€–æàfXËæ£‡ï¦úI gêO†Å¦fiFAŽæ- F!ˆ&ƒæ ˆWí¯ÿô2ÿîÃÿúºþÜsþþ ÿý?ÿýßÿmÓÿ¥A  @lÀ#c L0>A0cÆu0¹ÂÔ1CEˆ6‡©69ÒEæ1Lÿ0‘A 0Q€d”€ÎÁp5€¸\Ap¤Sz¿ý”Z_ÿíÔXÿ¿«þÿû8ÄðƒÉô]þ†Æ°bAÏÔ™®¶_ÿõóŸ©û¿_ýNú…Ù*M‡€`üÄ 8ÉpÌÚ£ÀìñˆÂÝ(Á‡ÐÙôðÆ!ÀY <„`°á.À  r@8  ¬Bþ¯ÿëEÿüã~Ÿú?èGéÿ£ÿGäj„¸„2<¾b…Á–ôæ ë†I†PO&,Ð-G[Ù‡®po†7˜fÀF XàpÀÀÄZj!‰`0è7¡O¾ª·uo^çJêÿþÛ¦{ÿÔêöÿ¾¤Îÿîÿû8ÄñÌE…ôªŸ°£þ‰Pu¿ýn–öÿõ,çþýúÎÿõÖVp* d(Ê6hæóÔ&ƒ ¨4à #3 gó3wLpyÓ „&ã¨Óœ €;ÛÀÕ¶Á!iÀ(D0Q#ê­•«{þmþÏ£ßc¿«úóõþ¿ýÿß_ëH–Zƒ 1ƒAY8íc<<Ó °B@³YSG»{ÓmÔu3 h"£\³Ð €=ù@æFnÔ Ù1À‘×·úú_¿ýºÌ_ÿíÿýµÿû8ÄíƒÌˆ÷~¤ÁD#ßÐР¿ÿþ·ÿûÿúÿöÿ¿ÿ¬ð/P Ž"9“ÜÁ˜ ¢*˜=àðlaÛ4ÍïQáûo€¨˜0 V€0ÿ\( 7¡BÄ„'»ý¶~ÿ=ýgôÑÿ‘ýôÿÑd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.±/ßÿÿZÿÿüçÿ÷¨wý_«ÿÿWê€BãTÿû8ÄôN‘‡N~¤Án㩯ИÈ c¬S`†c,œ£¨-S˜¡ö1cõ(?ü ó ˜C¬S› š73á@Å„#‰FýmF_ú]Í_ôéÿÚ¾Ëÿ»âãÿÿtÜy¿ïÝ:éúy#Ûþú¿”ý|ú ¢/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíÖßÿú’oÿþu¿þÿÿýÿÿûýÿÿÿû8Äí‚Lµ…Mþ„ÁY £é¿Ð˜û/ÿÿÛÿçÙÃELÈÓZΛàÁË\ÃÜÂ\ŒÂ |ÔpýôßI!lÃÔ ðÁ‹ÌÀÒÈ w-€Èd1| ( O"µÿþÊ*+ÿÿbÏÿý¹åÿìu¿'ÿC=Kñ5çÕì´¥° ˜‚‘‚ ä˜=‘©‡¨vÛÉG?èð”f»&€JcPP`´h¾ÚT3—n÷’ßê_ß—HÌ“ü‰û.ÿíKÿÒÏûCÿû8Äñʇþ†Ö°âAþˆ%I°àP ˜„.›Txž1[ Å0ãZs>žÄ  !G‚Œü%ØcŽHGCáuˆ_ÿÿÖn¿ÿþqÿÿÿÿî¿ÿÿÿ·ÿÿ¯ÿÿ¯ÿóÊ‚ˆD ñ…N&2k¯Ê`ŒÌa“”`uªc3@t>Æ,~¥øc÷ža³l`õ€*6³Fàg€°„‚«©tÿ׺‰%ÿìJ!þ®¦õ¿úßZ?ÿ{õœûóÊÝè®Ùÿû8ÄïƒÌ … þ¤ÁŸ#¿Ô˜ãÿ¾¿]ÿõΈch³üƒH3¬,# Å„ 08”ýo«k[úg ŽõíºˆÄ¿þÔÿ÷ÔZI»ÿ©Õ±‹öÿ:®¿³mn™Î¯ß·tÛÿ]E¦/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíÖßÿúÿÿc'ÿû8Äï é… þ¤ÁŽãþ•P~ÿõ ÿÇ?ëwüw÷Wú†"tËPa!æ8Ph+'¬`LJšaVBa6`ã‹*h÷ozmºŽ¦a­T`«‚`Z0¿(ÈÀmÚ›.0c2§E­þµÿZ?úß·¦{ý}u8{íßþ³ujùÏÿ­6{Q±Ì-•Õ³2ªÝ²±ÞOð£^( •JB!€y‚äAŽU‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8€¶à Ñÿû8ÄëÉÔ]þ†Ý°âAÏÔ˜4œ›]ýßýGÿéÿÿ_ÿ£ÿëÿÿOÿÿãíÿ”ÿC%I°àP˜„.›Txž1[ Å0ãZs>žÄ  !G‚Œü#ØcŽHGCᦽÿÖÿê6úMþuÿ×ïÿ-«ý•þÈ?ý¿ÿÿ,ÿû¯ýÆ¡·³ò8 R³ŒApT&L˜¡rO±€vœ`@Ǧ*³«W`˜$níÚ0 Åëÿû8Äé‚K„‡ þ¤ÁÛ*£a¿Ð˜~Êëÿ©—þËÿcý—ïßýfßÿþsþ¿ÿÛýd—ÿÿ”=Ÿ‘ž©“¤¾@`LŒ€Ìu `¡ $ jÌ(>Ìžz®LëavOÿØ7´Ï(ƒ Ì2$Uˆ½+ÚC¯ÓÛþ9?åÿŒöû÷ÿQO_ýÛýÿoð±û'ügý*m"k\3ÓC8csb¦“K€S@ôS*z“ADð?”ø ‚“0€Æâð1p *€Á±ÿû8Äá‚KÕU#nü¨Áƒ*£ßÐÐÁKšv×W·úÓWû«¯æG»z¿ÿ-ÿùßÿþ¿ÿ±-ÿÿÖJÿNÉ0G” €8`Ž`p`O `‚ˆª`÷ƒÀa±‡lhÓ7¼mG‡ì{â¢l Xf Âcø\b0 Š€¥ö]²îÝí§þ=}ù6­âmþžßè_û'ü¯þŸÿGÿ ÿÝáÐßm>J^¨– ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éÿû8ÄãLaU#.þˆAª¤!þPà(|.± ú¿õ+þËÿÿý¿Ôo÷Ô¿û˜?ú¿ÿó!Þ—×ÿñœ+¯ÿóÀÞ&”¬ã\ “&(\†SìF §q銆¬À*ÆØæ €›€{@6 @Ì@Æq:¬º™mßþy_î¿úßÿÿõ›Ýóÿÿÿþ²KþÊÿ‘ÈòE"ì‚…@¦ÍüÞ`º„Ða5˜a€fa£ þfoîâiŽ>aP„Ü`•z`Sp{x¶Àÿû8Ä⃠‘U#.þ¨¡*£Éþ•P$-8† $ýõ£ÿRóþ¿ÿWý_ù›­¿ýò‰8ß÷ÿbùjÍ?‘Õˆšä.€€aƒaI‰¡œ1¹±SI¥À) z)•=É Ž"xÊ|ÁI˜ Àcqxˆ8 @`Øà¥Í5u×Ößë?ÿe¹Ïúÿÿ=ÿoüïýÿÿä·þ¿ù*ßý*(YJB!€y‚äAŽ•‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8€¶ðÿû8ÄÝ‚ -…þ†€*¤mßÑ Ñ4œ›]û¯·úÿ_ù›ý}ÿÐoÿÿgÿ_ÿÛü_ÿÿ ?²& ª·Å€#5j #ŒC¼ƒœRc þó¸ecü2=@F„ª– a p€XX‹û꯫þ£ËÿuÿRÊmßïßýIÿßÿ9ÿ¿õÎú¿äaÿþJ(yR³ŒApT&L˜¡rO±€vœ`@Ǧ*³«W`˜$níÚÿû8ÄÞLaU ~„Á}ª¤eßÕ0 ó ï÷ïÿ=öêAõüë÷õ>¯ü·ÿÿé7ú¿ÿÿ+ÿù‡ÿ@¥Œ%ò"`€$`,ž`Œƒ¨`ëa%Va@ ödóÕrg[ ²þÁ¸¦yDža‘ €¬Eé^ÓºþýÿÔéÿOû?úýMÿoük§ÿïþ4 ÿ¯üxg·òp"k\3ÓC8csb¦“K€S@ôS*z“ADð?”ø ‚“0€Æâð1p *€ÿû8ÄÞ ýU#.üHÁ‹ª¤%¯Ð˜Á±ÁKšÿÿ>ÿîŸüãÿ«ÿëoýô_ÿÿÿýD³·þG·ÿH.U*A„æ Æ:V&aê&»­‡JÚÆl¢®Æ£¨`Æ@¦ Æà`vÎ6$l/XlÂå6õ·ú«ÿ¯þq¿ÿÿžÿ¿þƒÿ¯ÿÿùêÿ«þQ?ÿÒ #òÐÒà8†&‚fxFÏ…ÆÓ›Ænþ¼‹†°›€b›ÈB¶†pˆè‡ÀPXª-ûÕûÏÛþÿû8ÄÞLU#.þˆA{*¤þPËoûú¿ÿþsþ¿ÿÛýDŸýÿóÿü˜p-$;ŠILHÈsÌòŒ ÀOL-à+(À q 90Ìà@Ñ€À9â@Õ8ƒ½µUÔßëGÿ9ïå–ÿ¶¿úŠÿö_û&ß÷ÿû–H—þ¿õ e{?%$¦N’ù€0@0O0FAÔ0u‚„0’«0 û2yê¹3­…Ù?ÿ`ÜÓ<¢ „O0Ø@V"ô¯ioNŸõ/ÿÿû8Äß‚K•U".þ¨m*¤eßÑwnþ¯þ¾ÿê_ÿÿÊÿÓÿÿùPÇý“þHcÙú`¢&°…Ã0 0l)1 t3†76*i4¸4E2§¡4ÄOùO€Ø)038 n/¡00( ¹¦®½»ÿßïØï_Ðõûÿ­_nÿû?ú¿ÿõ?ú¿äyïþA •JB!€y‚äAŽU‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8³€ „  Ö0­M»úÛ¿ú›ÿgÿû8Äå UU%Žþ¨™*£á¿Ð˜ÿ9ÿÿþ{ÿÿÎÿÿ¿ùÃ?û¯þFŸ·þD"Cj·Å€#5j #ŒC¼ƒœRc þó¸ecü2=@F„ª– a p€XX‹ýý}õš¯ýÕþ£#ݽOÿê5ÿ²ÿé7úÿÿÿ¹ ÿ¯þ\-ûJd z€Ô,@Âá°±ûê«ßýi¯ýÎÿËßÕì¿ë-ßÿM¿ÿÿ·úcÓÿ¿ýÏÿù &ÒC¸ `4”Á”Œ‡<Àp(Àá°À\ôÂÞ¸Ò@Ü Ó<Á~  üž$ Q@0ƒ€xh;ßÕïÿ?ÿt_¿™7W·ÿû8Äë‚L­U!ðꪤaßÕú~þ¿ùßú¿ÿoòÉÅÿ×þ¡ðmìüˆ•2t—È ‰€B‘€°y‚2¡ƒ¬!„” Y…'Ù“ÏUÉl.Éÿûàv™ådy†D‚ ±¥{Hý_ý?éÿ=»úýÿ·þÏþÿÿù ƒ·þ-fÏÓ9@‰¬!pÌ  LH áÍŠšM.MÑL©èFMqÀþSà6 L ÀN‹ÀÄAÀ0¨L Ç.i¯¯öÿžÿÕÿ;ÿ·ÿÏÿû8ÄêLUôê†*¤%¯Ð˜ÿÿùÏÿÿ÷ÿ8UÿÕÿ)ž³þAh¹T©"8˜.DéX™‡¨šî¶+k²Š»Ž¡ƒU~˜$ ?€!˜ `€amÓI¬Ú־ݿÕî­ýÇ__¯¿úéïÿœßëÿÿü ¿ÿÿÄ+ú|’8U¾,!¬{P˜(@YD`"Eà”$â“W÷˜•Ã+àùè"4#P±P„ÂÄX—×UUõçÿõ¿ùÿõÿýgÿû8ÄêƒLµU­þ„Áy*¤þP¿ïÿoõÿÿÿLzÿ×ÿ5-û@VEñ@Ài)ƒ)y€àQÂ#a€¸ é…¼q¥€1¸!‡&y‚ü@(0ø`¤ÀÌà1¸¼ D „ÀÀ 0lpRæ½~ÿëe×ÿ3oûÿúÿßÿ8ßêÿÿþp»ÿÿæg¿új5iBB €#˜à\Á˜ ¢*˜=àðlaÛ4ÍïQáûø¨›V¨0˜þŒ†â )y˜m6‹Þúÿ²“ÿØ…ÿ¸ÿû8ÄëLUU!-~„Áˆª£Ñ¿Ð˜½{z{¨êÿWÿÏoûúÊ¿û/úƒ+ì£ÉŒªßŒÖ=¨L ,Œ"0 "ðJ qIŒ+ûÌ Jᕌð|È@ô¨X„(Âab-÷Õûϯþ¯ú/þ¯oõ«ïÛÿ;ÿ_ÿïþfIÿùt·^¯× —!@û6UBÀá€bù…aŒò„D¹®BaÌÜ(KñŽˆ „  °_‰@@€AŒŽc}ô£öÿBÜwðÛíÿÿû8ÄêLW!ðêzª¤YßÕñ¾ú7þWÿ_ÿÿêOÿÿÿýTBà&¤Áê¾`¡„4a ÀaOÖan be¤áVhb Za%„<`&`G<:è€,1 ˜‘õuuç•ÿ·9ÿûÿ¨×þÿùÏýÿýöÍÿÿ¨}ò 4@‰®Bá˜6˜:Û4š\š¢™SÐŒšâ'ü§Àl˜€œ7ˆƒ€aP˜ Ž \Ó__ïþµÿÙû¯ÿêÿû8Äë‚M…U/õJw*ä¯Ð˜û«þ“ÿÿÿœ1ÿ²ÿé–¿ú€àer©RD p/0\ˆ1Ò±3Q5Ýl:VÖ3ev5C0ªý0H@~0'C¶p°#azÃf)·un¯ùÿû©ÿηúýÿçÿíÿ™·ú¿ÿoô‰?ý_ë%Qÿéd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|4Â_õ}uR_ùÏù×ÿ_×ýi/ß²ÿæ/þ¦ÿû8Äè mU)®øHÁˆ*£Ñ¯Ð˜ÿõ7ùLw?û«ýÈi^Ý?¤J¬Jˆ (¦` FXæ І¡Æ`-¦@†¨ºH†ÿ@Æ ¸ æ ÀÀ`yÎP×CÌÈpÂ… ¬Âî­èÚ·úôö·û?ýôÿ©¿tÿqÇÿ·ÿÿlN/û/ü ·M¾- @TÉÒ_ 0&FÀ æÈ:†°P†P5fŸfO=W&u°»'ÿìÚg”A‰æ*Ä^•í!í«[·ú‘ÿ×ÿû8Äê‚L W#þ¨{*¤eßÑþQÿþßòß÷ÿÊ×ÿ÷ÿ@E¿ëÿŒö~€˜ ,’6@]!Ò,oÛ˜0í  ÏSA‹L¿u£Ð‡ ‰ÈÕ½ hAõ×\ŒBZ¹"¤bÄ}­»õ˜zïbnüüAȇ.µ†päC—¥oü^ã¶å¿òü¥‰ewñ܇)7+ÏÔßøÝ½J#+Ã䲯ééíÔÆéû…%%ŠñˆÅ'3¯Ož¹}¿ÖsuƒãóâÀnòÿû8Äì‚ÌYUþ†¨ª£•ýˆŽ¦‡Ãñ°ÀP`i2XFä_倰…\ÀÃN7þiOƒêRæ›LÙY¥€±šT/ÿÍN“nÙM1PŸØfr5ÿþf„šÀ• âÆXè¡çÚGˆÎJ¿ÿÿÙ©iŠ _4¥4Q"«wy–]ÿÿÿÿUÚš¯©Bêf1öZÜ¿ÿÿÿÿÿÿÿÿÿîE¢41YTÔô¦¬í4×ÿÀ¤‡$8ÒLAME3.99.5ªªªªªªªªªªªªªªªªªªªªªªÿû8Äç€ 1U!ðê‚¶ê¶¹€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÿû8ÄÁ€õe¹½4ƒ€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªTAGThis is the id3v1 tagÿsonic-visualiser-3.0.3/svcore/data/fileio/test/encodings/Tëmple of Spörks.ogg0000644000000000000000000001666513111512442026361 0ustar 00000000000000OggSþ.wüA§vorbis}ðO¸OggSþ.w’†mþWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉvorbis+Xiph.Org libVorbis I 20120203 (Omnipresent)TITLE=Tëmple of Spörksvorbis)BCV1L Å€ÐU`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€ÐU €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs?=?@=@>B@@@=AAD?pù[bÙ®¾ñ‚ ,8äC>äC¶ÛØÆ6¶±y‰D¶mÛ LÂðœK¡°·\ÿ]€ýR&VÚúù2Ó!xƒ÷ã ¢oa?†»w‡!Ù€ÈìÃÂræl˜nù¯çAóÃtàeÖ¶)“Ú´j3aÒÚ#¶ËÍúrÏCðüÖ`‰fáT¬ã¸¸¸0û–>£ ê2Ï]ðüÖ`‰æáî9¡ÐdñûQê2Ï]ð€aƒu „ÓÀ?ßw¬™y£n%êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ôú2Ï­à=ƒK „cð΃`މ¹Kº×êÒÏSðü6`‰æáT€uóm...̾ݺú2Ï­à=ømÀÍ+€{N(ôYü~T'@êÒÏSð€á€u „ÓÀ?ßw¬™y£n%êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ô$ êÒÏSð€Á€% Â1À;J€96&æ.é^ êÒÏSðü6`‰fáT°Ž àââÂì[úŒ.@ÐêÒÏSðü6`‰æáÀ='úÀ€,~?ª êÒÏSð€á€u „Ó ÿ|ß°~d井 êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ô$ êÒÏSð€Á€% Â1À;J€96&æ.é^ úrÏCðüÖ`‰fáT¬ã¸¸¸0û–>£ ú2Ï­à=ømÀÍ+ (÷œPè²øý¨N€ htú2Ï­à=Ãë0@§@@€ åŸï;Ö̼Q·$&€Æú2Ï­à=Ãë0@Ç@Ê_•§#WãzxÑ $@ÐØú2Ï­à=ƒK „c@yçA 0ÇÆÄÜ%Ýk$6иêÒÏSðü6`‰fáT €ZÇ?pqqaö-}F €Æú2Ï­à=ømÀÍ+Â@Ê='úÀ€,~?ª htú2Ï­à=Ãë0@§ åŸï;Ö̼Q· ÀàÆú2Ï­à=Ãë0@Ç Pþú¨8¹×Ë^$@ÐØú2Ï­à=ƒK „c@Ê;J€96&æ.é^6иú2Ï­à=ømÀÍ*©@­ã¸¸¸0û–>£ €Æú2Ï­à=ømÀÍ+Â@Ê='úÀ€,~?ª htú2Ï­à=Ãë0@§ åŸï;Ö̼Q· ÀàÆú2Ï­à=Ãë0@Ç Pþú¨8¹×Ë^$@ÐØú2Ï­à=ƒK „c@yçA 0ÇÆÄÜ%Ýk˜l qú2ÏSðü6`‰fáT Öñ\\\˜}KŸÑ@cú2Ï­à=ømÀÍ+Â@¹ç„@ÅïGu ±Ðèú2ÏSð€á€u „Ó(€òÏ÷ëGæ@Þ¨[‰pD€%ê2ÏCð€aƒu „cJ‘Å,€€ò×G%ÀéÈÕ¸^ô€*8?X&úrÏCð€Aƒ% Â1¥Èb  ¼ó ˜ccbî’î5€@ üÏD LNúrÏCðüÖ`‰fáT”"‹Y@jÿÀÅÅ…Ù·ô]@P4Àu €BêÒÏCðü6`‰æáeH—EPJÊ='úÀ€,~?ªÔX¨¼7: úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð `ýÈÈu+1 x?€ ê2ÏCð€aƒu „cJ!] @ @ùë£àtäj\/z€ €à‹j%€ € úrÏCð€Aƒ% Â1¥Èb (%å%Às—t¯ lTÀß@”:@àAáúrÏCðüÖ`‰fáT”‘Å, µŽ àââÂì[úŒ. hÿÀ€BêÒÏCðü6`‰æáµÈbA)(÷œPè²øý¨N@H8¾+€ úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð`ýÈÈu+1 /øŽ€ êÒÏCð€á€u „cJ!] @ @ùë£àtäj\/z€@üŸ°(L<(<úrÏCð€Aƒ% Â1•YÌ"¥ ¼ó ˜ccbî’î5€xüÏD L6(œú2ÏSðü6`‰fáTT:d1‹@­ã¸¸¸0û–>£ ÀฎPèú2ÏSðü6`‰æáµ.‹ ””{N(ôYü~T' /$°Pxot&úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð `ýÈÈu+1 x?€ ê2ÏCð€aƒu „c*¤Ë"@Ê_•§#WãzxÑ l€_T¸¢0úrÏCð€Aƒ% Â1•YÌ"¥ ¼ó ˜ccbî’î5€ ðø»ˆ@è<(œêÒÏCðü6`‰fáTÔ"‹Y@­ã¸¸¸0û–>£ HÀ ÿÀ:ê2ÏCðüÖ`‰æáµÈb (%åž }`@¿Õ HÀ Ç!Àw°&&úrÏCð€aƒu „Ó Ò¡ŸY@Ê?ßw€7ëGæ@Þ¨[‰€OÀ ¾£P8úrÏCð€aƒu „c*¤Ë"(@ùë£àtäj\/z€xðïó~Ùô6žS³¦i𦝱×Gsonic-visualiser-3.0.3/svcore/data/fileio/test/encodings/id3v2-iso-8859-1.mp30000644000000000000000000012000113111512442024450 0ustar 00000000000000ID3TIT2Café de ParisÿûPÄInfoÁž] "%&)+.1369;>@CFHJLORTWZ\_bdgjlnpsvx{~€ƒ…ˆ‹“”—™œŸ¡¤§©¬¯±´·¸»½ÀÂÅÈÊÍÐÒÕØÚÜÞáäæéìîñôöùüþ9LAME3.97 ¥-þ@$mB@ž]Å"½ÿûPÄÈá´ô =¶ €3 ò?›õÔâIÏSŒ¯ä#)ôbTýEÒ¯Ô †ÎÇù ÿJÈIÿY9®Ý·%1væFazŒê ·YsßÄ`YFEdä`™µÛé{hÚ6Çu­Kc·*NŠ{ÌS®³å[mn„.ŧtdm^—öO󾽑Y›Ûë^n¦,QÃ#ÇëÏ–à…ZM¨";{©PQ$I*€É—ÿÿÿþŠrFG¶!š1(b˜¢ýíC†jv`¢ýÿÿÿÓ"»)š®ÿûRÄù³ `UÀï6!H›¡—b®Š`Á™1aÔ¢ÌNÀ˜P?ÈfÛþÈÙM2.bó2Æu$z6‹Ã™Žòoå/åçï¶a¾íäöÖ¼Ý)×§@­0€2üÐI0êÿ½ìÔTª²ÛV¡§³ØˆÈŽU¡v:Tì¨z*˜xôg³3"6Tý½V¾©ÎQe9þ¼®KEiQl2aÌ‘¹(*qBÁDMÌS¤óüÎ06<ÉF„> ðÂÄ!+"‹fxä¹_ÿÿüÿ÷ówÖçéÿûRÄ6‰ µ =ã¶!H§¡ø¿É+Ù.ÿtšj§#gšY¡|Õ ?Û-ÒÎŽÞ¤I›I*èB9ÔŒ ®Š™™Ìkò™ˆEe•÷¡—ë§¿5IFO›0Jì¢2]:TµÔš˜EB”ÃbS…Ö`Ô“0ë"Å¢¡Ñ \<åÖX—.‰éÔ©YÿûRÄjøõ sQ!¶ „'¡GòTBv¤`DÕË%,Û#£.G°Û¹±gj.L¥¥s?{b™,^ÞýùÿÃø‹ÚÐÛŠO5f’lJC µ`¸DL|Gƒñt ÿ>ÿûRĹIµ@ =C¶ اÙ_ü¿ ç¿ÿÿËì ÄC»7k«¬xÍ÷*ÓIR6ÖÌAI“K¦º¼æD’,žÅ¦ImNå¡ë;æ6ÿáÛÆ>O^gf”£6ÇîûHFÞˆ¬°•F)#$ˆ±“\€Elº[,Ž¥‘¥ª@üÿÿÿÿÿÿýGå<Ζ_W3C%V¨à5&ÕæÙMihC8iBr­ÜÌÍû Þþsó{TµßÚÒoñ½–ÈØk™a!êe¸Ð}pÍAgük’™:ÿûRÄʳ` ZÁ$¶!Lù‰LZ/ÿÿÿ×ÿÿÿβaØ÷SšK™C%D&ÙˆÁZBQÒ£²š«¥AäÊ3}%™/Ÿgæn§ËmùšVê¨Ë”èÎc´0jŠ é——[h¼~~R C‰™ê¡OŽÄ$ Õ Â@?ÿÿý¯yÿÿŸæþGsãÃ(ìb/gD#fR«V"PñA"F¼´Î!ç”2ý,ÿ?)ÿšŸÿÏn;ñ«I’wÚošÍ¦ªì8Ù­s/>ÄBŠ6ÿûRÄã E³@ ¨6ŸÄ3Úhb }¶©õôúëd-¨”iРÎÌáh(!ÎÛ™O —d#³•f-,bHe¼ïF½ŒM”â¼?žZSR}ËSx D+6F¬D$¸¨LÉõJ”!X&)"£YK#ÿÿÿÿÿ—¾÷—hò¢‘FÞ• KÊšŽÇ ¡9d¨bœ]Á->0H™MLÈb!Ö¿ÿÿý5ê–Ÿ:JŠeC‘Aê0HQÁÀÂ!c„Ϥ¹ÿð%ÿÿÿüã {È%6GÿûRÄæƒK=±@žÉ6 ³Ú_å´¥lüûÈg2py„§˜N‚dŠDÛÈÞç`1†2şÝÖf5½Ìßã;²ø¨Ë[vÌg”wF¸SÅrO'*§p•‰±,“.µBRÊúe$ jæ"â°\ø¤G·ÀÒ2@NGÿÿý:³U™¿u‘ULÏBŠ-UÙ!Ü)ÝîPDÁ;ÆfdXâJE)Ès­‘Ì›®š2HªúÌ¿ŸMy¹’ë¾ÜžrƘ\ñ‘xøˆÔkÑ­Q]ä!ÿûRÄç }µ =W¶`D'kð¶°ˆ@ôÿÈù3D\ízÁšùä”ë«4*BtQý'(s<"µ)™ú}Él_òóÿ?–dÝ’óÉÚy‹ „XNb´ØB£+*R+­eFÅÊ Ú1+ÿÿÿÿÿÿwü—h­ ŒŒ‡a$¸ß ^â;šªF ‘T@ê&½JN¡Ê 6ê>]?OËGÊIšÚ? ç*µdV…kn®yjfKG/T訙ÓÃÃCl/!ëÿY€ÿûRÄì ©­ ` ·‰Õ¶ß„?Øÿþ¯ÿá3gÿÿÿøKHþ›¶dúmtü4³Å–´™ª¶ó(ò‹A¾*±½Gy¦ˆ¸šÚÖ/K›ý÷þ?ü¼µçZ÷b»ÕKƇÏãæa“ÈQÔJ*@”œ) ‚tã‰ZúïÕð@ÿÿÿð‘Mõÿÿÿª“Šˆ¼’Ó$;&n¶™Î‹p£“µˆËUJfKA(`ó^÷w¶~Ó6ïÿê ¹Ôà®äæ”°Ù2Kœ¯“œô5ƒIL(i¢Gjài²pÿûRÄèƒ É±@ —ÉU6 ˆ§hq ¤Ð Uͯצ&,>¬2S¯P_œn>’µ/ qL·Ì–_>¬¯™ÿ÷ò=¼¯ümº‚X¶aœì°™Í0ä—ŽÄFVGÍ›y±4¥ˆÆŠ´åC@ýÿÿýòÿÿðŸ+½¾Þ'%K’œÎ#»Ès)¸!N®ùºlƒ²iHz·qúqˆ`ö†%RøÞYBéÈ„tÌfÑшëd 6ŒÆ²DZÕÓI‰† ˆ¥’¨V8“ÑÄ#ñå}ã2§ŸÿûRÄìƒ õ±@ —É’6à3Øÿÿÿÿýô÷ü÷?$UÎó¤åM‰Ÿ'> @Ý ƒ…DšQl¶2ÍÈêœ?$õK58Y•Ÿn¬œ-)²ù)ÛFª'Ó„çß4Ñ㊴e "VÄ>?ÿý)~œž!Îý³{*Ç.*´K K´´-¥AɈ3àvµ&¸æ Ö2‘ÔoÌÿþ­|¦Lq‹;i­Öä 5vP[mÇä²®ÛŒQò6.¯\+mG‹ÿùÿÿÀ…2gŸÿÿòÖÿûRÄè ³@>É66 ˆ§ ydöùÿ“7îÿ­ÿd8Öˆìöz[>î¥3¤´J?Ý[áôòv·F¹ÞëÅ>gðý¼ú¿¿™íûܳçlýÒAb¬ ©”ÄÛ+*KôlnAD€h3¢7nZ³ûÿÿþfÔÕÿôŒm‚D2§Ã)(+Œ*޹ŒÕ˜[¡—Xfqª9—1óyƒ%S'Èü©§’çüÊ™…}êÒ.ÛjœšBí{Øâ“§¤ŠJG´l´t^uQ²Ñ¥ÅÿûRÄñLáµ@k¶`H¦øåe?(°’ÿÿÿýõR/ÿËÀP¤õt1A%]žÒÑ]]Ô˜{¡Ìªv.÷€ÙöЬr¦õ»U/ÿ¯ÿarÄþÍ}‡Oɘa²ûS^br‘2š§d 8*Fáò…à&F€Ñ J?ÿöÔî’Ö̬”b4¢ÑH@í»ï#™2],}N¥Td20F&!‚S3‘æBvGßµWÖî3ßl%[ÉÒ°µRÛ¥g¨hFk²º$"æV0\êÌ®àÿÿÿÿûRÄîJµµ ›QŸ¶`3ÙóÎÀÙÿÿÿÊÀ8ÍLªO|øU-7¼?c壭²*Æ è¶­ÑMÂklb¿mï"Ÿÿ>ËäîbÎz÷a·,½£82FHû¼s‡‰Ô*iÒœô²V6f*À€~¿ÿÿÿºÕ7‡ºJÎó9Ñè†ÓàÈv1A!Ž d|Þ¼»«ùËu/ Œ^&ŸžGÞ]W¯·uç-õ›î0ÙÝ;eM6ø±ɰÂÅèø&)FuV ´•…ÈŽZ€g_ÿûRÄí µ@c¶! '¡ÿÿóv´ÛØË_ÿõ@!Ò<ÖyÃkä†xå!¹œÜ”ÎûÃ(§6Œ×Õºâ6Y$ÿOþeIa.ë5†wkVuûÝ¿€ôøàðý5ĹEÎÚNdIŒTˆªrzH<µ Q `šžàÿÿ-9Ÿã™øµµ{ÔEÿt5ïXªÇ¥i½°ÝN’²íPžôÉݲ\ÂÄEVéñõÿÿ?þ÷ÿrƒôLa'ܘ刄S!IÖ(§ƒÿûRÄì ³` 7Év¶ L³Ø „€ðÿÿë´[©B˜¯ÿþS žgW„Ônš—5µ»8ðÕ8KLÊÛnni–Uªú!š?ô¿ïùþ矆z«Ìõó/k$+Iâm" kWóiQj¶‚ J¢@ÿÿÿèÀtkH¿ÿ©;ù"8C5O"„òJe†d7HpÍvÖ‰ Fs,¥ÌȃW¯fèk¾gü%ì¿ :„%-ŸÛe;]$àì‘èªÉâö²Œd•n(DLƒVš«Ü5ÿûRÄî‚L)µ@ 5•¶ h³Ø’ȼ­ý2øÝSßfpˆ4Ξ{]”ºÆÙ6è¢ 6êai¾@@ƒ!óI> 5ÿÿôö¨^¥z_ÿN;3—ÿºd6èמ ŠXhÔìwß½6÷gwã«_/Eì^[Ά±ÎˆÊŒàÖß[fP«¾ÇG™—žµ>z>¿5›çntï@ûÔ^¶Ïq ÃÓÄŒÝä^•!©yxîR#ˆ€øœCˆ° Õ,$˜KA<'VͧpD@ÿÿÿþ„ÿûRÄé‹…±@ e5àä§¡ó|ÿüÌ‚0™––Õóñ! ¨…=§¿¹‹K¾7$'ev"âÄ¢š!oÄÑ×N­?.e2ú™eöôç>пžãË<÷813¼= ¥ÃÑ-8,0ˆ*.¨ZVEU$HÿÿÿÊÿˆ÷?ÿñ²ÊüsïfùgÁ™ˆ ˜VQ ÑF ‹Âœcc ¢°/Áeú¢®ýz9s<šü†íAQ›©.Û’µ$˜[NƒäŠ‘ˆ,).ˆ¬ ª@£FÿûRÄì ű@>Øï¢$LŽ’º#ÿÿÿ“#ôY æ¿ÿíM¦Z^2•†~fT½~˜Å¾’αèø0šqO4l YäÝ"Ÿ)¥Ë7¤e?y÷O–s)[_ójå2°£æYYki-B™<%ó³'ŽOœ)–Oß—½QÊQÿÿÏò€¤Š´¿ÿþ¢as¥}[Z¦{a°ìÒ-n­õ rûõèÁ6ZšxVo©þÇsòȦE3õ’ûîjŠ>fy‚ØÈˆi²I–"a*g ÿûRÄý!²ü@É…¶ L³Ølêm’)+µ„8_óRó‡ÿÿÿŸ÷’hçxbúª“ÕeÛKѼt8y_eGhi4éÌ©WéE=WÿÿϪ$»6…fgÐ’ÄãÄ¥J”,>QKž¡ÏUAÿÿÏ•ŸÙÅ ¿ÿÎ*±ß;r†dp~Fϧœ{-V?<²'¢Ô’ ¬w[ïˆ,,@ÝLákÒ󔾓w…ð»rŒ·Áò›É²¦m:@:NÛÔœ‘8¨Â0± mÂA4ÿûRÄí‚L]±À=~6`¨³¡ÕÙ9¶Ñ’ÿÿòå]0+k¿ÿp™&¶ÎIŽÎ(¤-\#([Ü=>†ÖE#+\sK‘.2Ÿµ¥ÿÿ¯?QëÛÊËV2L2®Þqð 1´ìpª˜"e5•b[liÿœ­c§3ÛÔ˜¾üˇ&¼“]¡0‡5í«=‰I÷ìüòtE!’.LpÊ-<±…Äæ!ƒÌךÿììsÅ‘m@ðƒÜÿÿÿšF‰Œ$ËÿùuyÒ ÿûRÄê qµ@;AD¶!Lž¹vË{hÆÃ•,rO7S»SŽRÝÑ8ä A.VZÌÒ›glõÔë~sI~1Ö×ùtý9ððÍïu”Ùº,Ÿ)þ/«_U7Ç€ãh%rÑðä#!Ÿ:Â#¡8ÌN9í½e s²'7ïóË/ü\ë)SéðšãTp®ôˆcóóH1³OÖîo™Pê¤ ²’Žìbº±ôVnŸÿû'dYêÆc!γìâÃcÚ0Ðø1C„8‰ 10–ŠÿûRÄí‚ Áµ@=Q6at# Èÿþf£É«1ÇTåSÿÿâUý¡pÌ& Ï…•V›=é'Håj©š›Óg ¹B†åÝŒüÍ»—ßOœþGÓܹÔ1&òYhíEdÑ (]5µ!4+@TÞˆA“‰jÝlm€¸$FS3 ¯ßÿÞ”j}6ç[)å U™3Q~ëÛ+©0Jfša!™`¡”† * ÀËÿÿÿœUÃl8ƒ‰åµ@ÿÿ­9iëî[÷âîÿÿî¯RÿûRÄî U  n‘Ô¶_Ì3Ù˜ÁѤ"-éÜ¢™-wó4ðÐJJÒ³n³ËxÈÆ+Œ423å_˜¶:ê~¿â#ùÿîªbî*ÖÏЃúy¡q9µ"bƒÀôT^ú‘àÐà@=† †U "H¤R( œ¼o¤^Æ`Õ%àj 4h™`llG•A³TȽáb€zà b7M"ñ5ñs…ÿ «Æ@1.šÑü0 ÇÐäÀÄLRI/ø[Ø6ÐN`Ø P0BÿûRÄì ‘±   ³É¶ ´!§hH¢Šðp¸1ìApÄb€2v ’IhëGÿŸplÂÑÄæ'BÑ>8±I>¥¢ÿüRóŒÙñsŠÜqˆ 3D ‚pYcŸPT_‹ÐªªQ™¶:«°31ê«Õãj§UWŒ(™_ofcªj«çÿÕ(ÌLÌ}Uÿ‡ªU.3q¿ã{3uTÕKÿýWÙ‰€˜ê©³U0QYpé¸t!½é¿ÿÙ¾roüE€[~r˜[0ŒŒŒÏÿûRÄé‚Á  q²¶ ª€€‘¿—•!¿éLÁ|Ón·²VÝr÷73?{Ë6…òaƒÎwàµq#Äînõ§ñßýÿÿÿ÷Çý×ÕŒûXI{ŽGÁñt0QI±¡1Òå#—@!.Ù¢ÿÿÏý¢TXÒ-}TÿÎú§¨±?Û¥62°HE#®ù%XzÃ& Kn®ño†ž1ÕcY𾦖ygóÿûó8_}ýv'¬û¥á .ôYÈuV[ÔC¤ˆ—‹j–¢4Ë![k ÿÿûRÄîY{o¹)k¨æ§†0ÿÿΊAjfæ[—ö^ÑUÍ­à9uÚ7H‘“™pBøFTøæJm B¨r¤ö¶!•*œ¡<¼¹–ÿÿËÊQªn¯$¤õ”7±M(’,»¦]Wräé0U3’ÈmqƒríY ÿÿœû›¡ æ`>-~ó›É}øäFËSÒLã“~o[5SSœ!avÁ'ý»ì‰KT^Ç™iñyùûe?ýù§dלµŸ­‰‡mEӎ׶åÌ¢ek/ÙxÄÉÿûRÄÅ µ  ’¶ ô¦ùlÝ»Dÿÿüœ† CG ‡æWòZzQmûÉÐD‰mÒD—z†úYÓ¥YÁ‚Òìiæ~¿¥/ÚOÚÿÿóÿ/||÷2å<ºZålF~‹zk“Hj,.`ª3%Ê ©ùl`?ÿÿ×N ç2—>_ôò±£7T§ó?ÊnÛ,×\œ¥Ýc½Zfe±ø¶ËÌQBõgzÐÿýr#îMÎñ…3wŠRãqŠòqôFâa;T„B“ ›UÿûRÄÀ‚ ½µ =‚6 ô³ vƒäèÞíµm€ûL7‰’ u²C/³ÿܺr;ªkIq%Ü>G¢ýÜANMH»©ï«6jY†´Ä ^å’EñÁ»ÿÿõHúEe  $²4ˆÜc$n‹uä¾_ÿûóÄØ”Š+žAÌ¢ØG‚ˆ<}q/ h31`Cƒ¬µ”§ªÒ«=ÿÿÿÿÿÕÖÍ¥]+•‚Í)„©Ý õH"D€Ó©E»%àе]ÿêõ¡Õ6¶’Ÿ5V×ÿûRÄ» ¯  ;Iz¶ ¨§ grT ­èS¬èW¹Ù¬Îš:¹‚ÚuE7Sÿÿÿþ—ì}ˆî)Ò׋9Ôàlê¢Ã±\pgt%·VÒc)ÖÕÝ&…«ÌÅÒ”ôOé.)e¯ç<ŠdôÚq󻜩–…¤XÜ7,i½ØŽã”:H/ÿÿö¶… ¢p[I˜[liù—Çfe%™Ÿû[ËÓܳ®¬ÁÄÈÊó%§¦9¸¢wöv7¯1FâÀ4€Ì4D,ëgÿÿú¤jhÿûRĹ‚Ù pQF¶b4Šz¼<ÒàÁ0îXÑ$²ÿãUÃwŠÃ@)Ó^Ñt3Y—ÿD35_©ò…%d£«ªº8ÎW¯aèî•¢ 'ZÝU½•\®.ˆþÿÿÿé©f©«IàŠpGad ˆR(gè êŠI$ ÿìqIAcOÞþMˆå@Aùu"•Id3!­e5êVÑï9hŠâç #;-ŸLDÓ• Uº›¦oÿ·ÿ§!¥A›3‘aq¡Š”\P¤Ž M‰ÿûRÄË E± P "ôÂv¬‚ÿî—FýRÈW+PåQŒÒ;?§ú?^ú%LÁ"¥#–ŸHä¸$϶呼›ê"š¸ufHÑÞ4œ2û|ˆ¿üÿò¹ÈæåmCÿÒónš‹5ÔP–*#%GºYh6€Ÿ†˜ÅZ[cIÿýß¶Å ˆ@„l ³PTNWŸïÉûšzý͌Ι™È–Sëh²"RÝ×®ð³J®ÀîlÚQ4*鎿ÿÿÿûvKn¶tEÈzL°jÈ,<àð·ìÀÿûRÄÜ‚Ðß qg¶a¨ âÿÿªb#¬þõ-•¶Öon§®Õ{õpŽl1_H(j&Ö©# ·é²âý±ábÄ«Bbo³ ÿÿ–ýI„C2˜U Ž&™ëÿöùhi¸[ñŽžDË¢å7ß=­ÌŽ×(³-ÏÓ’º1¡ç5Hßs9Žhgo{'ÿÿþs)çþÕjLcëº{ú—±óš<ŽÒ0]£ZYåÉÿûRÄê A³ @¯‘ˆ6`ô!§ ÖtÏùdhˆ@v4}°Ç#¤)Ä'íÿù?šTÅ5ƒ"$3D;8AŠÎE»XðÌËÜÏXœ2\ž¶P”ïÑÉ3ÿÿÿÿÿÿÿ¿{œömùhVd-HsRƒÓЉßó$ÿÿúÑ›ƒf2F‹õ£²…)UÎSþ›¨krZg!d+¢ÝèÊu¢Â(šã$­¹–„Û£~«ïò¾í_û—°•æ=´ …NÓB0ƒ1*F 2E[ÿûRÄê ѧ ŒUÙ}6 ô&øwm‘ÿý ט„1ÂknK×–¨Àæ7–S1™š*#jä¹Ùê’»Hë>òŒÚ)åŠÆsœ­ ë& ÍÚ¹¿ï¼×yýF4”– Ø=Ë7!e£Há¨ÈSK°ÙáYdmjI#D€E;XœGrªYé Ìÿ§®o˜ÆŠe¿Ù/ƒ 2ÙÌÌê9­Ø†:,äy©:5Q–Õd+I:t™ÿÿÿ·émdBJ+1ÔÅÂŽ Çf„ÈvF IÿûRÄí ‰µ 7Áb¶aèšvÌ‚ÿõ_ÑZµW[”À[¢2”Öÿ#mQ©±K!ö×±IIÌÛwHŒ€ôõ[Ú~F‚“C­¿Ó"I#¢°ë–«'þ_óȯïæO|‘UJ9IÔµ2“Æ£ô®küTœ7 U³JÝ[ciÿã—óA!ÀA€‰6R–!íÛüû”<|í+QíS3õÈ'£„l;‡ˆ†¬‰ ƒYÜUÚ낌cEµÇÞƒ8Íÿÿÿÿ×ìyöÑÙYcS•®ÿûRÄì‚ ±  ‰9‰6 ô'Ø— ÿÿÃíêÄÇQä?Ïÿ?½„–÷=ë:J(ÿ;m‡¡ôa/eŸ aµ½$*̹T/F…2ËáÿOÏÿÿ.?ÖÆõцBp„aL·xªÉ&¬\¢ÈìÐ&ˆÑ ‘@BþI$ º=­„¦k_çämsl1ÇÒÍÁ°–·Œ×Z ¦qÏ–ºÿEA©ÓnSSm!òfsâóËÿÿÿÿüÿË>÷‡VÎbl!U­ AÒ ð#{êÿûRÄê A±  ±Ù޶ ô!§hˆ ÿèé½ÛÎÄ*Qˆ®ÿÿêÜ÷©ùNå­9-Íi”°¼ÔŽÅûoåXS£°¼4 kAÁÁÙpyÈ_ÿþæDSðÛ”äö3Ri<¬T‚H^‹ 3!hdb:Ó,6)T]¡J*ݺÿÿúš LFKbõ&GÏÙY ¯ƒ¬,²·7¾]¿™Z{g å-Í5~4$W"Éí$&Œ]z¬R§&ó"ÎÿÏç{sÆãýä7¯(d¯)ˆÍ¸±Ûh‰ ò=ÿûRÄé = ŒUÙ‡6!4¦ùPáRˆ*J’L~ä‰ÿËìØ´7$w)RŠSißù­¥é.^í4‘ Ã%ttB¡€“14dÒM2„Ý lLfH1×h׊A¦Ÿßÿ×ÿ[jêbN„"0R£B !Yª¤ÁÝ5NYÿÿÀc +ì—ÿå[1ÔT—­r9Ú‹µ& 5ÙØ„œìÔ„qB‹;Üáòž "R†ÊÝØ‡2‘”®¶ò÷ÝÏu5{=îÏÍv;ÿûRÄé ѯ@oQ”6`ô!§h hi[­JB‚çÐbNM+Ž˜q’å‡ñ,áÇâ÷$h?þÇÊQ!ÈB=Á@Ј²Tß?ûþQá•ÏgBs0¡yq]N<«ME¾ƒ€³tæ ߌ“ís -à§y¿imëÿÿúoû ¨õŒî1Š9BYØyÂeœÎ‹Î—oûE€•œP“Ø €«/å©€€ÉR0úŠIºŸöbnªåa tÂÞê´ƒ*ŽÇJ<\e¹p]NJ¯ÇóÿÿÿûRÄé u± ;Ag6!¨ŠºÿüOñ<¬WVÎ1.œh× ƒŸGQVQ¤‡°Rá‘ÿü†^}¡˜.„Q?ÿ̵„ÅŸÏ÷ó6N§å “¥Ìå;NÙË“W™åcB¤ÿ—‘Hòóççÿö-úªÝðWÎQJš„૦Âmƒ*®HmbÄp<ÌKªùêN9#$ç×á“*æ¼ Ç·ö_ømƼjE#Š …ýwEΪj#+£_G1f¹¥‘äî¨Wž‡³}?§ÿÿÿûRÄèIµ@•—Áv¶!¨–ójÚËj£èiH¤qÅʈv Ivùÿþ$ÍSf&C'P£(é{ª9R/maùcù}á×Kt:§ßKÎC§Jå´í‰æpÍö…ÂÒÏ%ø~ÿ~~ûñû™Rõþ:C+ÕŠ§6"®ÅªSÇÖo¼Dÿÿÿ4g‘X[1´¯ÿ{çO¨.JLɽjDs}2¸3F¼ÜÊ3-inuå%ry“r£g™wOÿ_÷¶©Gt¨š2]ÐÿûRÄÞ ­  É}¶ ô§i”8š¨Ä*  8°á!ó€rØÒ e…íX\NÄ™¡óÊ—e›]0R÷.1e~(éƒã±¸!Úza”ÎB»‹b–òUõsÿÿ×õÚ¶±³#Y`ó eéˆÌqu=É$ ûUÜátÊ«{Ñ)—ÿùÒt¼t?§sÐÈÏ>“Å"¥(3ÕjIc¡È§8¿ìb¡]ÌÏÆ!Qz;ÿýïÑXë±Ëb2A¨j 0 H9ÖvÿûRÄÛ‚ ±  OÑz¶!4§¡A$»îÑÿç8”éH€ÐãºÓÿÒºƒ°ù›”ÒXu²cȪv£LÔˆó ¤N:$N1Ï{Ä0¦p¬xúIo?ÿÿüÿç_ú©d#j0ýµ-\ŠÌDòôØ\´Èµ¼³Ã+lÄ *‚KkHÿÿ°?C3o1§ÆJþ[øûá§½Z“]e;ÅOo­Ómv|ÇÜ9üÞäT4—±11›²ä¹–Ç.Í15¢jïÿÿü¾ùÒu¢×vsŒP¥ÿûRÄà …¯  Œ» A5â(Š{@ÎåB”…‘¤HùùµlrF)ÊR";Í];ÕT[÷UyÔìí±Œ£T ¡„ew;‘H"%•mp®_yÜk!ìµÿÿÿš¼VÍ#º!ÊîÇu €`Æ ¬0#0a…ÕnK#IÓËLú”êT2 È…Ý÷™'†«ÑÐ…YeyÑ|{«¡Èæ)C) ‹ÅŠf ‹<êUIÈÿÿÿÿÿuB] Gb°*‹F0Ä8²ÉoÑÿûPÄç‚ 1¯ @ QÙ‚¶a4§h €ÿþ‡ öʤ6$ñœ§{4îÿÿË%Ú‚•äç™ÝÁ·J*»ÛʈÅ.S‘(‚AŠd,•ÙÜ!N£23s7ÿûº¶ÿëc-íì.57·H›Dð0ª^Æàá ‰Ý níó ÿýo¯&‘‰T„3rHå x¦ˆÇu{ºÌªÄb«~·PJˆîæ.‹@°dt{µˆ¦!R5Îû~ÿÖøÂÕùæ”ö~pƒ+FSqD 8‰§—Mé ©ÿûRÄç‚ í³ ˜U‘c5ᨉ£óÓÒ‰(Xÿúçó¤†YBLw-~ùŽ£´*²©áU­W£ÜÏBYÈg%šÕ+Zªèc• B½ž¨U1™ÓÙ%}¿ÿüŸ¯ýÎ>Üĺ[£«ÝÓ oâ‡ÌCh…å™–íµ€‡8°3 åÃdJ6ùçï›ôÚ3„@j ªZ,jx´:­X`¨@&¯çÃqNâ,9¸žÆSU§‘dRg‚ÿÿÿ£e/t˜ [¶`?ÿø³ÿûRÄé í«  O¶!4&ùâp !LÇ:UJíÏý3±íýø‘–Ì{ðÜò mE·;»+B œé×Pé•®~„m8[“¿~}+Ìÿ¹,nüÚ|o'5Ùe]M4ZDlnj¬+ÅA¢2BEˆ™Ê þK$ÿ.V›A~’ÂÂJ›Ø@ÆfR3ÿ÷© $½\ÄŒ"PŽ-LÏD˽ªÕX‰kmšÂpFN¶µ"ûÿúh•2ÑöB±9f)Ч-á@•3…ÿûRÄé‚ ý±  ‰>Ɉ6`ô&ù6wzÈÿþaþ›á£Ü©åÿý#Žàˆöš!ÐûÃ#ÏGA¿"†^væ„Èz±›íbçµÁ‘Ô…øBŒW–e™üÏ.ysÏÿý©}b¥:’*N¶¼½¢ jvB@ `>¹ÒC‚!Öö£m³$€r $bÑòSFdÿú°4kµoGƒfGI´wØ“œîÒßgÌVvt–k6føG¸¿»–¹V›Ÿ¯ÿÿãÿþþ¢{îQ*¦á™ ]ô`ö<Ó„IpàAjÿûRÄæ‚ u lÑ«¶ ´¦ø!ž’ÿš$V|MÒQƈzÃüG¬¢}ÏÍÄ]cSµœ®n¥Þñ›½Žåoëo5Vöî÷) V6%fî»»¯®»ïê?ÿÿ¿^úÖùîï©…B6H‘Åc,<*,&'W<4<=<9Žm³@€–yz×áF¼F '•ÿ¹rgxH­%ÖŸv›g>ïcdãC­¢ö›þ¤¸KŽFÞÕ C;‰†ŽÄRüEñõ}õÿýŸýkäw–hЬ#_\¿áØm%w’Ë#‹UCÐyÝ~õ·¥<ˆ®W>Éò?…ä¿ÌþÿÿAòÑýY]í@â/¾…W^c…c…°‡´#‚¸°©ŽI$ÿÿ‹Ù78»˜'g%+sËÿ?N«…'\®YU¨Êÿs2‡MÊRR2rƒ ÎÄïÁnšÂj-SdT{;f¿ÿ×ýúyY…OQä:8©ˆè àAéŒ&¨ ÿûRÄê é±  ‰7Ɉ¶¡4!šøÁ›’$HÿúžBÔʈEF²«ŸukéÝȳÌ̽P3Å”†mk„E-My–L†="DµÒ)xÒ¡¢VsÞ™þ_ÿÿÿÿþ\¶«Òa¸ë4§I´( 3‚•¨AɳÓu Y$ÿ3/þþs¢Ã«6Àý¿ÿìøøëzÆG¯Úfâ91H;†æÔ6;]æOW´ÉPÖÔ[ý°:œµ·ÿÿÿ~¶{l—¼3”ÈÙÄ•JTG@eí ›xÿûRÄç ! qQ•6 ´!³ ÿþnˆk2H;`Ro¾µi÷ûŸ’22¹µ’&‡Lıâ볯ÿÖá©É͌ؗv|É ¡FžäíuŽˆfo?¶üß•|©1&”`»p¨4ª0TšUˆ‹ Ãdg$Äiž £¥‚ïì@ÿõ#u†„É€ÛÆeS•}çþ‚ŽZ£HSª53ÐŒÑzlJBÅÏØŸé¥"–£-”ŠÂÈT¾‡±|Ÿ?Ëÿÿ™ÒñÞ~c­9›™OPîYÿûRÄê ͵ @ŒµÑ|¶¡¨!›r!DâÈY"áÆ§N -¶4€‘¡¸3ʱ¾°á³‘!µþå‘íÕ–g‰hú %[ÜÖš@kJMè²YLŠËÒµè ­=X «ÅÿÑ®o¬]!ˆ"h*ymë@ÿÿ_0Ð@ÅÀHß«ÃËáç¹µ:®Fm•6WȈêv¼3¥Ýã‘u¡’V:ͪ£â\Œ”„« Û°"ÿü¿þªwìÏ÷Z{Xµ0âmVÙ—e- ªãÖ‘¯ÿûRÄé ±©@ŒUÙ¨6 ´!¦ø²× íÿÿè‘¢ž€`шŒÚ7ù÷qFe>¤,PÚEØ'ÓZiNcu™‘Ò{‰Š• ՈψXÇ/ÿ§?áß§ùGé39i¶å ¯:ÓHBĸ3ú´¸®ÿûRÄé€5µÔj¯¬÷Ðx;—`)–Ií¶´S= bmt ÿì²SoÍÐÄ1Œ&Ì å®«û;†¨¡ÌK©TG;°šºNc•¯^i\MN¨Ô{>»;\‡+9Í7*1]Ë»]«jߪ¦¬Û“Þ“µj¯»}C¤áŠ*8ÓÐé´fïPH®<,Qjv ä€ÿÿÐéKRîëžmÑmÿíWVIeõyL4>ÖùÉÌyî»þ[Õ¼U».0‰fæsÊeS׿â;}¥¶=xÞÿûRÄÁNµ\‰¶ ¨³Øíò]ݾ|l[S·5žÝšìíÛä>p:îRñ4åXúö‰ðøàFKˆj#5ðªrmô@ÿÿ³*ªW´+2]§H•Û=?ç6cåY÷]Õy:ºtõéîgç÷+™—‘mèçæˆó)·•ž_ÿü¥íý¿Í|¤õi¨ûmÒ·ÅFÜéVh´)WA¢¤Ð Î:`!wñÿÿëþgœ±ÝŠÁ¨fT‘“ì¿FãO6d!†U¨6ÊHÂ2b&’‘ÿûRĵ‚ ± ‰—ÉĶ (#3Ø#1"œHmLˆ‘BCJ0`­'¿¯È×ÿn J–ƪk‘Å:“µ«Y´GÃèÙ"D@„ˆëC„b ÊÀÕ’Ú#i?9rŠâ² "E¥MìÿþM§nÊÌGV¡ ²Q÷a0| E³½ꛕÊc‘]"ˆÊÕç ³Í «‘„ȾZØ1žÈ&4X ĉ“½¿ò?ÿ,ÿò¸CÊ=ê/ݤŒ!túé&Â3eɉ6ÛÅb¡¨Ù z.HÒ$árìÂÈpéImxv?ÿ“"dòÿ4ýTxìH”@0A¦cæg.Æ3¦ƒØƒ]V©*³¨Åk£‰ÿÿÿµ>½,§g" ŽC•˜¡ðX¢à‰\XqG€%»ÿûRÄï‚ …% q1À¶`(!§hæH#ï ¶[k1kŸåÞB(\}v ,¥ŽD<¦zí.ó(w 4ûÔul:;%¹é¦7šKiGîbf›þïïÿÖ5î™&žªæ²¨\ô¥ì–;d"Ø:"ƒð†ËClÚ Kc$ÿüFHÂo¥p¢ÐS¾k§*§æLŠn¡M.,2(ÂÿÏc?)yL½ölñ*ÌÜ“µOüŠ\š"qßÿÿÕ}] ¤¨eg2HèUP®Å+(<å0ÿûRÄï %± @ ¯Ù6 ´§h Æ äÿÿîì÷³ô9W—R÷\ÿùù?xLC°a‘‰ÁžTô.×uœ¡ÍTÞKµ¥õOÔÂRá¹ LµÊ"Íùÿÿ¯ìýUVt!\ÇIH",*9ÊGs©cƒÑ6µn]ã ÿÿ‘ìˆG&JdÖRrtÿ/çiÝöéÒM“ÿ4º;bº’™Ã”½e $8!ŽSÉÞŸMK¹ö73ú_ÿúrœ73|!¡MáºxäålÅdSl©ï6BCÿûRÄê‚ E¯ @ ±Ù¶ ô¢8À(²‰µ A.Ò4ÀX~Zƒñ*Že -]»ÒËþÙžê¬Ó´{Œ^bˆÔ‚”„™â Xþ»9ë¡)a’x®X²?ÿÿ°©§ˆ\™A¶€•7 ÿ3Ÿs—Ãâã0§!ÖGÙÊGTeã/_^2›7}+Y|¤,ëñS<êò]lj’8IùAf9¡eˆQ{.Ñ•H‘£‡0’I±r1f«5W¶¾¾r†?-ÛóUÝÈNðþxÎKp¦hmcR¸®ÿûRÄé‚K¡µ ŒµÑe¶a¨–ºä0½¾nŽ…®I`¹<Õ*…¤Æ»nb2™G!2 AzG Àbß«@ÿÿ§õ³©ŽÅ¹‡TÂ5¿þ_ »\íÌ̃tL"îdá T´F^Nîi‘"hìµ ÉÍæäd¬W¶÷ìµÿÔýùÿÿ™WÛ„¶-ÿîvõ™fVöƒØåtT¸0p6?f3‡˜ƒ *r_´ ÿü]ØØxšCªÍoî—œ®åó½Ø#܃¦¦<èÌû]ØêJÚ™ ÿûRÄì ­± 7Á3£¢ôÒ}Õ®ö‘Hèw)A;8ìŒmiÿUþëûUµÉu_ã a ͌ؓ Ë$LÌ€ƒ®ª#Aa öÚ€ÿþt=ØÇ-ºÂ5é¬L½—¹:¡‚ËáæL¬‹álÈ3¨“?´Mâ÷½Åº=,àœb·®^þ¿ÂÎùI¿¸Úšà·Öi^fØPg:Åx0lÝH±uUT0¯€Z³8F1rï« ÿÿ²»+#Á²C×9‡Vn}ÿûRÄð‚©²øÀ¥ý —¶`ô!§h«ÿÇ6d†ÑnEI‰vädòsÍârÝY Ý:FvÆÂÚHèÔ´t™¹«w²ô½¼þp¿ûþ^xä’ÔÕ¶£j:çG™žÞÁ™E #,@¼" IÇœ–´ÿΧþÈ•4Τ„ óØðe¹ÀïŒdì3[ÞòcTPøô—J ÇAàä0Tph ÝBƒ »Æ,†…Cÿÿÿÿm”¶Ö«²<„qcµDÅUq nm²@ÿÿ·ß¾’+2Hqõ»ÿûRÄÔ‚ ŵ ‰7Á·¶ h¿hžÄ´…öy™åœÍíê PNªé K£Ï¼"BFrÖÄ©°T¤P«m±}¾¿yÿóØüÊ÷+ÊtÌqé\å«KIz¢vÆR±eØ™nÄŠµ¡‰·þ"@ÿþÿÓ¡õJbµMu]?ôsŽOÔÙŽgÿ Û²Ôž‘ÉS#"I)Þ¤Yk•)ÿ*œ#“ÿÿŸóÿÿ?ÉsÖ¦{3¡è> B!P`D`i3©E m´m€ôþªG RÿûRÄÈ‚ íµ¡ ;Af6b(‹*„ÝgÄ»U¹çž¦ì h—+MPƒ’¢nŸÑÉ›•Ê‹*†äy+¨ÆqÄÃ3£˜ƒˆñU÷Šÿÿÿ`ÅÞ‚hã`%±¢@óŽsS*õ$š9¦ÿ+ öwC¸êÄ ígŸ¼¤%¹'•i/*äLõyˆm‡ê\õÿÿÿÿÊnì­#ø³Ï³ÎrE”ÁΕ[dioþ¨s έc¡}¿î®JÌ…C,ÌW*¹"º1L0A[k“ºÿûRÄÆ ­µ¡ ;Al¶!t!›áæ[©ÒåT,º®ÉS«ìD7ÿÿÿÿí¿Š®³Z$ÊKÈÅ* S %» `ã¥:1)`0ˆ2þU3„>æe|Ȇ3;ùóÊ‘u T#¤=" ¤!{©näimcüñxŒMÿÿÖá°ÀXÕì  Œ’Ý´iK“™2`ZsB î†H®“î¨fF˜ŠÌ3ÈâlK¶³ó›˜yºÿôŠÝ2SŽ£„gm‚ OY\žÿÿí§r˜HzhkãÀÿûRÄ - k0¶"4ŠznKcDÿÿ›Ø¬TÕ#x|‡…--$/ri¬„näY3¶í ÚŒT[¬2œÌ]Šÿ,j ÕQèäHO®‡üR¿ï2ŽGˆŠgz’šð" §¯¨;ô’ÿò^ªäWY°Œýæ2IQ¤3‹–Ķ:ž©œ°‘Œ6’üÿûRÄÒ‚ Q­ ­Ù##´êTÒì„´V’ÿÿöo¹ÄìL—3¿ÿùk5ŠG—µŽ… 'ƒ(j¹Ct…[,JJÙ¬Æ aÒa‰ù¢º9übŸÿÿÿÿîŒçtT3f!dÕŠ@¥¸½ªn[ªÿÿ¢UQÕK££•„#T‰£"WÛMØÌwúªßævÞOUÏmE¸íÒ!®Ñö3‡b‹ÝœmS<òIL«üÿÏçû·¹Ököjyd'Ñ|e%1 ‚I%l‘‡É Ì•0ÿûRÄã‚ É a‘d4áô–»F Púj$ÿæ‰W¬ïáEBÎ}’û³ßé9 ^ÝÈzØŽ\S÷\Aë¼½­¬÷jã=R&*¦¹½»í<ÜÓ_t×vÝÿÿñýÝOQ§êî\w]”œš)!éŒ0xÓØD 0œm’ÿä@ÿÿ¦vçæœÃœåµJRrôüýk±¥ygr²$Žè©U;™tnÛÞ!Ls8”ZµŠg8D2Uhö½ÿíÞÑóÃÙú]¼9rÈè”®È<ÿûRÄíƒ Aµ ;A<µ"L!‹cÐ#sã ‰Á%´€ÿþ_øDŒ)£æÿ÷3‡n^“y bBîBQÊ ]œé›R#ˆ>ÃÂB^9K2I8eCõÿÿÿéßóْФaˆ¦B¹'@ÆÚnÝò ÿÿ‘÷˜@2„nF=Ìé¬áÞ~];D:Ùç’w’Û>fJFrÈF³HýÈùÓ½À¨ 02‡§ÅMŸ¥}»Òÿÿüÿ»öþçVö[æªY$ân›rGQ½¡³¥Hò*&ȬÿûRÄî‚ E³¡ >ÉŠ6a4!øà¨œä$K¿ì”ÿúþ5"ÌLGl–Ü%yf‡JæÇœµÖú—![ücpnŠy$`묪Ô¦FD:3eù­/ùËÌ¿þeÍÿûW¾f¿KdäiŠdK“ £Én ¥hóÂÏ ]UîA$ÿüÀܲÛ@…l;:ÿÿÿªjNæâj!’—M6†ªŒb—ÃjëJ}RWnL‰‹$1 `ÄiÖÑãM¿mÿí¯ù[T*ŽFW!ŽQQu+)„ÿûRÄæ í³ ¡×Á95¢´‹›Ü£Ž¬QA1vÌ€ÿÿB’ߨÔÄWt.ßþi!_ž•a¥€¤2¥ðП/µoÇÐÏø(ûS þj_•ág še¥3[_úyùÎ7_Ï'âÔÓzv3q/åÊ5?‹SÅaÇÕH`Æ*–]¬m1ߨ/³ÚØÄbD8wB/??kC$õ2å¦ÏÖ<Ô§Ï"'Z Ñf QV T†)\D™AwAÕÇ:2ÿú¶^蔬‰0 ТëÿûRÄí á± 7É„¶¡4›hPÿÿ¶Ÿ™2x$žöþÌ¿¡osçòÚTû”'žG±n‡>̲$P б’Ãðɲ‰*¿÷l³;öåþ\ÿ¼«¥ciãÇ“9ÐÏÜÚQ±J€6Œ@ˆ”É8Q¡9*Ü+ €B ÈmŒ?üü%°¶Ôpð’Åx€ÐŒ³0 ðÑdbÒ›UÅÉÖÉcÕ>ij|mŸã?ÏÙÿßÿþÿmÏ^Öeµ§†5.ð-F…¡f L‰q0‘D` ÿûRÄæ‚ Á³ @ŒµÑx¶ ô!§  €ð·ÿÙ .g ØDP™¼BýÓþúí5\1äsJíúN÷bôO¯9¾høn4hU\ÀÕÌç,ÏÿÿÿµÐ6BI· }^¢uÿÿû·Ö­÷¼z|{ïýÿÿãÖøÖ>),Ÿë??ëêڟח½…xõÅâÀ´ym¤ f¤fÄI[£×îkbÚÅİpå¦×I¡Å—P^Çžß1-<´ÏÕé÷¬V.·_]¿½·=b÷ªèN0Ù:©WÿûRÄæ 1 l‘‡6`¨!§h¨L)ÜTò^uË• Èm‹ ‡4Ž_ODEáÈ”Ÿ Àãp0N%@ P/¡& ¼žœ-³€ô hÁø0aÀÒ$h?öÀÓ‰lšP3ï´9BÙ‡F#¯ÿ `À…BÙ‡üJ_ÿ…°¡:…͉¥ƒÿâzèbq6Š0j …P|ÿÿÿŠÔa‰@VÂØ(1r‹x²hd?ÿÿÿ8ÌŒ˜æ!ÀEÇhã&‘/’$^`(ÿûRÄê ùµ ÓÁ"ä´Ž €RÚ  +Æb€˜ê«UU(—fc¡@[URŒÅ³1ꧪ©lÅÆcÕOª¥Æ^36ªÞª¼eã3VõU-¿`›V=UWŠ\fcãP7B‚žˆ(."¡ à ½QПEÂȈÿó-Iÿÿøk -ͪRˆ#ZPÓ±s…ˆ Ї!δ.)TD± ·VgsW4Ó)Ýrºã“ïÿ²ÿÿ^Ÿÿÿþ¯K"ð|¨Ï¹Tè¾Nµ¥ª‚ƒbÿûRÄøå°ýT€ j³/7)@fØí8䦱¦ug(äàz‘l9‰>w© ¼¾Z=û?w{mž×•Ë‚æ]›>f³ž9WcôNJæç†g ¤†‰‹LÈ#éhG3³ôô 6ÿÿôTS³ÿÿÿõú¬U§\_P²ó÷‹¤åV…ìú RLë 'Vbž«D©žv’åæjDYï c;»»6<çýé\{Êœµ¶²Ëm1 ¨ô¤ØxíaXCcN”üª)=-ÂÄ!!ÂAÿûRĽ ™/]\1€ð£¤ô¢.èP¸Z›•?ÿ¯ÿËÿÿÿÿÀ‘P@˜“vøØ^¾ÇúÙÍ.7[íÌ|Å;iÖÈY‰7I æR~IÜiÏExùY‹ÖW–ï¿<üyšWcÈ×/‚=¢gSú†T–IgO—ŠÆá\–ÁÍHıRÁü} òÿ—ÿÿÿÿÿÿ÷òÏ ³ÈœÎ1ZÈòòÀaèB;z„W5q«ž3Q1#VF¤Uß¹ó2ɺc\®o3kå•K#Šëm§‹×,2oŽÿûRÄʃN´þžÁ¹6ŸÈ#3ØHЪ©)ŠDB0=xºd¶5ÿ;º®žê×UAÝl¬}2­ì…; vÈ‚”)ÎWgs#2«#¯_uKõ¯<•UWœé4 %J£É#cÛÍšÔ ±Ö´Š“6i[ÿÿý‡Ì¿Í+líùKRP¹2¼v8Èp¶##”¯¹yßχó†G~Ø]úV1Ý…lçµÛE™˜y^Y`e r‚L Ž ``¦*ÙüŽÛÆõý£º’XêM‰ÿûRĹM¯ ™žÉz6 ³Ø!M?rÞd³lŸÿÿÿªYeF}V&ÃH·ªÑT Ô xÈ8`¤èM’ºšë{Ñ ›ˆÎÎŽU©Xw»²9'2\´Úµ]ç÷{s²gT¼ÉmIû·=š©)’Nñw]¢2C9˜ ΄[0Ðtí <­™îhsZ3iÈ4dºd5ÉìÆŠAfFj¯ºáµä¿ÿ—wÏñ®f¯ø£öâvZ¡G zr‰£‰‚ ‚+P„2ÿÿÿþW¿ÿÿ,¨ÿûRijƒÉAµ =,¶ €§ ÝÝ%–¸æƒr¨Q'»‚ð;²¢Ö([\ÄÖ22U¤„Áh¶¢ ¼Q ,—þþ“ÿôŽQ·Ö”ž‚yGŽÄp¼ ÐŒ»4qÄZ]§ŒƒÈž&VÕ@”ÿÿÿÿý2¤§ÄBã^íǯm¨©Z¼Ò]dJs1 \î•SÃÅuqÂNµß_ýSW[óñE­jÐbõeÙ…1Fœ#˜äƒpà‡Ç‹Š”5Bb€Üx³„`áÿÿÏÿÿÿÿûRÄÆƒ ¯` ¼‰%6`Ä' ÿÿÿúà 6n³…‚”ôuÕYÜ`%+ lR˜WBXîg6@n)ÐF…ådˆù|û×7×èeùÞû壷ó õ+ †°(Zù6:• d1ܾb´ñ20]JèqU?ÿÿ‡þsâI[Ì®_YcBC͈%N9†u¶ :l$I0áÝHÔ–7=µ†¹ç÷{‘{ããÉl_v…=>qya°?ò¶g® Öçï'„LÕ®*ej^¬N8‰þ¿?õÿÿÿÿÿ¯…e%üÿûPÄ߃Gyµ ÝŽ6 § »3îkL3©¯®¡köc–²™ËÛA ƒµ40>“#Ϻ§ÞóÙÉVº&+¾Ëvlï™2ÖÒ­KiV-C¢h"T_3=¹héYÙñÙ=Ÿ”;¥C¶Ç–× Ç2Ðì°H?ÿÿ—ÿ÷×ÿÿødS”/Û?¸ÉAšŠÆt%Ûs,¦G>ÖðËIü6$’—˜:¶`¯+œmºmÜÏâw[?~ÿvZÆoø¾ò«i£qdh=yÁ‰xòñÝBÙÈ•K ;ÿûRÄí µ@Áf¶ @³Ùÿÿ÷"Í»ý½2py¨ê„lQÈ-Á è@ ¡‰1†S.ÜÝV¤¹÷ÊRجáî͔ߴßâØ¨ÓôC¼+¾O×¾˜Èÿœn„á![²V8N=ËÕÿêËùOÿÿÿÿÉžÉLbS߷囹óX66-¥t;Z¥Ú2;{ãð¥§Øê…¥äÃ1zõ%¦Åz+{žV¿ßß<{õ“/ýlçÚÓ,Ùzf¹’màT¡ó–Š÷1Œ&Á:ä!Á¶@¹}æcð'ÿÿÿûRÄïƒK=µ ûA—¶À3Ùß?ÿÿÿÿâÊ5ê3–]+œß;ŽßIv$XLèb"ÅâÆ(fïÎ WÄl³OsïsòÌû•™·uû£Ë+M/gh{ÚÞt ,X¹Xö˜„…Uç#JÑüäñgªˆ•ÿÿÿß®¤E²2NfPkcì ÌVDj¹A¬Š®I Vs÷·Tú¢õ'wúÛÕWæ·(ŸQŒ†é¤ü¤–Pãfé¹Ôi&ì6iQHUgš†%ÿÿÿ/ùoëÿüÏ‚broS|æÿûRÄíƒLuµ ™žÁA¶`@³ þ[2Þ›5[â^SŸÜïŽneiaE®ÐÓ’)¢q³žù±¯)Þ¾³7vݾçן•ü¦ïK7–=lF²V¢>„Ìt8-ÄÛæ|á4I?Âr(î¨&e±5ˆ?ÿÿÿòOÿÿÿúÌÓIçÞžHQš£;Ù6‰oÐ([‹@hî„¿aHúûŸþô¼ôþ瞦ÃuŠJ°èœx˜ÜX*LˆŠ2|(MÞT¦ñ£dF×Ïÿûþ]úrßü¹áÿûRÄñƒLñ¶þ™žÁj¶ H³Øs:]uÌ ³q#¤!m"‡xhø!d±•„+{n XÌ2‹úÞym2ïÎUú,_Í-÷r¼£ÃÛ¼¹á&¨‡‚|gä´vTT£7%+$L?ü¯öÿ)äk3òº)¦†Ä2VÕaÍO6'2 T©È ¢Íe ڜȈ©å‘™éͳôžƒéUÕ÷졦]aa Qr$®ÿ)!§N[¡™0KÄÑ,é×ý…@?ÿÿþ\ûòÿÿç¹âd±ÿûRÄî ³` wÁ«¶`3Ù¦ÙÌW“ܹÞV=ULí¬q±{­¼ÊÂE«6¹÷`éÙÉŠ®·mzv‡”Ýÿìí¸ïÿøû·ÊB²ðPÇ`u6MÏÍ‹´€¾òbê`•Ìó(46ˆáyû€@ÿÿÿé’ÿÿÿÿ)Ïc­%üá­¦ÑÖ›5[cèb [Š5Š…³¹°Âs"Ê‹·h¤wç2ZLYÊÎ'{³zf¦–9k·k´âÅ+×.M$C'‰Q’Ã’‚S6ÿÿÿÿûRÄîK1µ >Áq¶`³i%ÿÿÿÿŸ‡±T¼ÊÛè…ÓHœ·O ò•W¾íže›!›öϛۻšWǰ}>™ã‡hLÜÚ°®}ò¹Èl{ÉÃ&'â)UA$¸ ­hž#8ê2þw¯òÿÿÿÿýú¦~-ûwo2Åã»<Ôý Mñ‰Þ€R4r6-j=¥I;0–\ï:8e¬S#‡YóvÞšíÝšuœI¹¤lk½jcî˜T ´r¯ÿûRÄñ · ›Q¤¶ 3Ø/'[‡Ë¤qIJÚÙÎ%aÔHÏ ›œPNPeCÿÿÿÓ«oÚ¨ÉSR§«’¤ „c94D[Œ…”s Œ-Té2$ZȤ2ž:8-J&»¡ = ÿ¼ß[ae¨Ö$;d˜Áw­''/Ü\—FÍ„ëWÔôEŠéW‘uõýÿ¿ÿ¿ÿûÿó»ÝòÊìù’ÌïMº×šO{Ì"Ú=ò1"Žw‚³98°Ï“‡•x˜ÀyƒÚ“NË‚8ûßÙO•þÞ­³ê\ÿûRÄîL³@ “6ŸÀ3Ø<[.1^Ñ‹Óoc«…6Ë$UæFƒñ93ƒs2!!VuÙ‚ýÍêîv2•4Õ …ÿßþ¿óö_ÿÿei3šo/KÔòmä|ÒVEC `ã:†¨Á€éŠtQ“Á`íµ† ×JbÇ3e¿rüׄáil›SÜf߬¢qRF*>4õå$¸´ùx8Ýk‚þ—V͇áüîªX3ÿÿÿÿÈÿÿÿYÍÁYÏË7½jk+§iéJÙ‰f£!O¦ØgMfÿûRÄéNa´ü ™ýz¶ 2úl*šÐy›=%Åk_ŸóÏO½³ç§ùy²Euîõfg'-"‘£‚¢)’Sˆ“$¤€*'3.@ £n_ÿÿüÿÿÿÿÿø¶9"6m9Ü¿¿»UöÉÔ¶Œ£{ºFZ›58Užë,ÙGr©Ö±ÆÇ ¦EðÛîjÛsáÙßüylýOV­-³>Çâ}29eqâx]~3ÓÂàÉóÔ@Ù³ó¼7 MOŽß­æy%6;TÈðsx)TÇCw3Cr¡ñ«F@F'XòXdý½ÏöùŸzG³‘= (V§äˆˆÃV;Ø•O´ãÜö§8YûÇ»}—ŠPÓlé*$D‘itiô¤NÀEÙ>©–¢ÚsE€Ñ2±l²ÑS"¿÷c|Èù9Ñš"ôÔ! º‹Ìe|gÿÿû­µ²d› ™ÿ÷òÞ_ÿÿÿÿÿûRÄуLíµ ™>Á•6ŸÀ3ØþQŠå@= Œ‚ÐŽÒ¤†äQN`Ôá… aŒ4*DAqbD¨î†uØÜ¤ªÒýË;žgø»ìçU¦¡N¼ôtY”Ž àúYˆ¬2xP&ˆë‡Àhpˆ±°ÕBb@ÿÿÿúÿ¯ÿÿýÖ·‡{eÌò´4½*TYÅ/Œ9QœNH$èÊèFF)ÚùgÈÞ_Ÿùeé[<ùWõ,ÇÄPª(Ê[QJ§ ²¡Aâ1 Y‚áòä«.GÿûRÄÉ ýµ@ =D¶ D§ @ÿû¦¦i7TUeé+*è ♵™WEbC#¢è‡w;*è‡T-“f±ý’Ó·[·C­^ýH³Pô©;S…O.~àé«^qpú´Äø­&™ª?ÿúÿÿÿÿÿú_Và  ÎY=É!f·´Ü³2‘h™ÓàvLΙ ¢Árõ G½¶—å~Þþ]•˜o{V—÷VViÃOĽòS&ÑÃçM 0š‘Õ˜žŽ„°|˜$$Wü¿þ]ÿÙßÿûRÄÖƒ€í`|¥6_À³Ø_ÿÊi]rß"hÀ¬™ÕIF260ð…bŒÅž;d(ð˜ÊŠ–†î‚ Âh†§: ѽ=<íàæá¦çMB $yJÜ^˨D}±ñÁ* `N’,±R¤Bà«.©jp4@ÿÿÿÿ$T3¥ÿÿ2žgŸd9:Åw2˜¢,vêâ3¹H6zºB“̲:Öd¦{™.¬r™Âþgçùýÿ^§I.Ó˜ß ZÓu”ž°0Žkœ`= ‘Aà™²Ä 8ÿûRÄéƒ =³@>ÉQ6 ˆ.øÊVª/ÿÿÞ×t’§fÈFßvaÑUšb‘œ¡Îs¹Z8È{ˆWKYœæR˜÷%•Hµþ¹“"}W5Z„#ò,´¢°YF9èš Â ɤ  I¢Öð@ÿÿÿëŒkÿÿÿþ…LQZf|óV3qBI{$.AHm‚" Ètú¦ÁÎïi=¶i”™å¿ ÎYÕJo•Ò­²å_ HẽèÈËœ²¤2€˜•ê%”PƒÿûRÄðKÙ¯ ž6`§¡¿ÿÿÿÞoÿÿþ”ÕŒ#B‘&“Å‘Ur³0Ζ͓4à  Ø–Þ… ;¸u€æÖ®ä¤E•ù¬ß.ã™ÚýDê '( ë“v ¿4†Ø@â£ÄC 28*`ÚõP4ÿÿÿúø&‡_ÿþh9úÅ6¦=’~ð[lNÎBL;¡’º´®ÖÌnç^1î)^ßÊ”|¯õüª×¯©deKU½ºQ5Q¤sŸE‡â >Éb=fÿûRÄêƒK™µ`=i6 H&ù- FàoÿÿÿúØyOÿþ¥çJdJœ»s+xLgšºî­–h·uŒÖÄO7DJi•8e’U¶Nùó$)ýÃÿ8j©Iëî("ý ÚeØØ:²4FUQ’ƒÅhR©` (EÀ ¿ÿÿøàg$%hpЍ˜È‚‘3ü«sêâ®´*NµýÓ§¦½«ÝßÚ‘VÊæë¾æýÔøê¦º‰·½¬)¦©tjnŠ+’‰’l»ÉÇI¸Øˆì)$S@K4’ÿûRÄíL!µ@>Áy¶`H§Ø`6ià @Ñÿÿÿ™‚¡9d9ÿÿö"žLÙl¯ ge³Ê)¦yžˆ­ ν'Js>9fy“òbùÈIåþß2÷óþ©S£QšÕØy{1p-o’5h‰±fÈ [R—%EU 1?ò>ÿç2&˘Fϯëõ—1r8=Uèdºn·Ä˺[ÇQ-Gܽíü,÷íõ3z4= =õ¥],m¥–(*4dP€H¢ÅàX$ÿûRÄëL=±`= j¶ Œ§ r;>€Z-€tgXU /ÿü6w„y=ðr eLœŸ®×m2òÊè ûk»ëÖG.0ÿÿýÕ­)­ã² ÿç—ør Ù‘?þSìtßp8¡†œ×FhçI#!‘¯æÒèGi%š†žšàÒpéAuDK’.ÇýEÑæ¦Ÿ+6/ÝûO>÷½sfcöv¸ôÀ¡T%ˆØFC9˜d°?%šŽJ¥Ãáܼ"ÀÈ€œ}Z ™ÈÿûRÄê‚ 1µ@uAo6 ¨§¡ÿÿ-ÿå¯T‘íQLeŸÛ32¼ÉO55=Ñ*G¯ Jd¢ê]Õã*ly‚ÆØµhÙ¶á¦w¸úî4]áÅÍ=PqNÛˆ¢èÇ–‚¡8\÷U8 `Ñ‚,p°:<'A‘rêF€Õÿú$´z²³4å™»$’î¢Ä¹ÝŽÓQ•ÖsŽus9ÙÖWRP´ÔǪsÉäôïg¾¼wÃݶS]$æÞZ쯨MÌ„6"F&˜¬I8GÿûRÄé‚ éµ@@ø"£´Ž*@?ÿþ?øÒjKœ¿ÿòÞäsóûæàé¶S‹&+^Yr›T'j`¤ë™ÌÅ,Ä>–OYyja¨k4aU[2ÑÛø,CFåÿõ“–Ä]$4-ê¬ÝÕ¬uvÎÍ^‰Ó]éFÕÕ슟QCêb&¸¹n#»Ÿþ¢zÿïÓî-^Ûqz·TÒÒ† Š–@˜­ËÄáTFœAÿûRÄç‚ ¯` 7Á‰6 \§Ø€p˜Wÿÿÿ’£øe¿ÿù²˜,MBÛ?¦Âw”èÄèFZü ‘hš®u×zY¥™‘ÄV–ïÏœËÊ~ÿ×ÇÆÎf—·­‰&¸$‚>ö wLiÈp¤xPœ =tF@ÿÿÿýg²0Eÿêdjó(Ô¶„Å·3?f7b%*Y˜(Ùòá-öÎÍd4ÔvÞ>O•BÿþéùåÓiþÍòw}­­±b[nâô7ÕÍPÍÌP™Úë¸\ùL€I>‹äÿûRÄé‚K¥µ`=w¶ \³¡€ÿÿÿÿÐËæesÿü¡î}7”_cÏì+]W#b=6yÞ#í$d‡®Ê%•vüw„M™—ó™yBË>O2’ìÇÒ“T¬äÊ>CˆÄ&@¸mEÑÆZ6L¨„¹*2YYÿÿëûÓ©^KÿÅS00(Í!©s3«Ã¬ƒš»±qºh‘™@µv¨­y^[™ªz¶ç'ê^sü¿¹_ÛðÙÇÝ¢§EmM =é¡s±Ú8UDHà’‡©‘âºÿûRÄêKÙ³@A\6`è›ØÑ_ÿþß匌£‘×ÿýã‘Ýä"33¨¦#æžê†ÁÝôÖw ê¦3!¬‚ìt]Ë»4¢œŽ÷e»[¦oi>ý­ÛKwÞ¤ÍõPí4QI"·'Ù&.‰¦ô‰€Ø#t Nì5‘ƒ–†F"ÃÌ¿ÿ+jæ¢ËÉœ¸gißòÁ¶Äe\¯¡lHŽ€ANj(b¡CC_ÿÿJ—Þ$[Í$£ò¾µÿqÞ3Öÿþ.‘¡Ýýûé=•K×ú–¤³¡ÿûRÄí ·`{¶ Œ§ —(fÞŸ„Ѷúe§YçQ–ËÍó„O¨!¥•Ö屜:­ìv"›JËw­ª>«ýžgñ¹gõך¶ž×Ü9dâ*–RòÁhš°èœt8ˆÈ{„²ŠëϯÃøâ%²‡ÕêþQZHÿÿKóK«] g+ª‘¿ùnE¨d+#¤“(g3þ‘qìㆆZ“*T[Ð0i¬†´ÈÙçÿÿÿÿé«{$Œr1 9 Ä$)±œ#”D@ÿÿ~Ô¨„ŠÿûRÄëK½µ@>Áw¶ ô'0!0´ßÿþÉ/ ³6‚PŠ‘Þ¼T$(ŒÄòm˜äÐGÉ?†¦ÈpáÆ,M7h ÿÿŸ?„Ù½y³±}qÕõœ¥_`¶µ´teå¥Ô·÷ T$\Z¸æU ]Ǫ [ª ÿÿÿ&NÄìc`ÎfGN§ûõX8žþå—³\ÊÂrŽ¡¨ƒ`w*¹àòb3Ã,΢¶;Ý „­3Bü¿å¿ÿùFê†ùÆa™I ¬‹F¾ž@™<ÕŠÿûRÄë¸ë# rÑö6_¤³¡°Bi ·ý@‚|ÙŽdą̈ß÷D0 "ÈQ[ Ñ’3Í.![;¡šB#~¼+²„ ÁÝLS”þV|áÿþ~fež½-NyTCbꨰ%p¦Â`QëAFU]s@ÿÿÿã1%q¦„ïÿùrGެ#’+Ê;ŸXdxÙã y~Ï-ÌCV.å]˜Œá™›Ò‰!ÿå üÿï~SÊÊú©IMÄsrs›–¯lÊ)ŠÆ-ÿûRÄë ŸA [Ž6 ¨³ØÚʧ’’Âep .ÿDÿþcz: 8gˆCA{)¤3r \” ‡sÔíU=é5U¨‰E»>Z†4LçS¨ó1X¬ˆÖe¾ÿö×ÖOè—$­)aU§À¥+(`ä4°­€\|Ê ^*Dÿÿýö,ªÁB–ßÿ}¨ŽjúæG9/iOz2(ÜŒídEDeKVȦEFv;++XÉdì÷ÍìÛµ¯O׌¾GçŠyͨœŽŠO&zα Æ`<ÿûRÄî‚ qµ ;A^¶!tŽyUd(UÄD(HÛÐ>Y$ V]L®0YèUÿìG,î—R)ÑŒTÆS9Œ ‰VôJ¡–E«îY³;¡¨C:Óÿÿÿþ§YTæYVêª[˜Á”8àÅÏ>ÝPÑíTˆsÉcÔÅÖúôC¦n–b4tµ5 ò1ÛëÅdzB¹µÉ{$)»‰ç“©äÕãÒ­/®~½ùÿªùê*yjZ²ÔbŒŒ¦;*XûQ œAQGI?’`€ÿûRÄê‚ ™µ ;Arµát§á$€ 8XÝÿÌ õTy“d+2oÿVT[1D5FPêd5ïöfqd˜×Ѳ{ÌK3¬Ç;!¬¥UsÒŽÍý?ÿú»O’dª2½%(Ðà Ä+ââãEað ¸õ’ÛliÉár‹ºA«ǹÂç÷ïîsOÕÍÏ VÚµ%lÙ™ŒÑ霛LõܧЧšUOUB öá %ƒŸÿÿ~±×ŽkÅ€à-$°ÿÿögÍó*…+têÕNÌÝ6ÿûRÄç‚ µ ‰7ÁQ¶"(й§žï+º²Å\{iH¶A²k䟑gËÞ»—¼6éÇO8¼åUow bµWùXËfØh¹ÿ6ó¶yþ?ù÷½²ù‡‘YlO¸Ñm,éšØ!( 5xJj!ŠM„·‚B™0¶±xåݳ@ÿý?òÛ;Ù¹Ù.ºû诺›¹îwÛ3+R‰ó˜®Õ|ã]ԌԻ)œ¥ ‹Þë‘Ó3å,¿çþåËðó¬þ½F3SqˆÉ6L=pu +ù'ÿûRÄë u±@ ÉSµ¡´9!fÑDNV0—ÿ¢Hÿÿî“:ÌÌS=î1ÿ££RÛüͦËÏΓi»Cõ†Q)ÂÁ¹¦Î¢­-˜Yk™XY£˜xeó>þSûÿÿ2ÿçûžæwÑt¬Ú0ã†f°r"kdpƒD’(‚oäDÿÿÍŸË‘‰„‹BšDÿ<ô¸2Ü#èw¦¥D:BPæª)¨†KU÷µNS9% z3‹sÞ)ROJ:ûÿþÝlår½f©.v–{ÚdÃV@ÿûRÄì‚ a nQÒ6 (#3ÙHÅ"§ÎÜ¥#“ôÿù¥æù­ŒØÚ28‡ Ñûü˜(†jsØ.dh{Êÿi"g§>~V’ª%+,0–ŸÌÝ}«Óz#<ïØWËòÿü¿ü¯Ë(L@Ô-Ī :Œ,Xî=!8Õn4Eÿô_þG‰Ñ C4ÿýÉ[fœŸÖ¨BP®¯c»ÅR å̲=Ëzå,žÊ¤!"‹q³FT%j]ÿ9ÿçÿüÍÿùs†Ô+Xœrk‘9„î-BÿûRÄê‚ µ¡ =€¶¡t!› 2¾É¤º<€U‹`Ûµ0%¿õÁ¹¡/YEIRE½#çÿ´G"]ÕÃ3£[ÆoÝ÷;Mw÷û­míó¿™ÜÞ’ÑÂSÖçÑãûÊŸYìÿÿüÇEEʼ Æ‚ [ ÿó?ôüŠ( lõÿ¤ç!›:ˆä‡‘žÃë[»gâX)WR‚PD3*ÑyËâ3,òòoÏ;ÿ$埥™6Ù‹LÁ™ b À‘iW‰6uX²ÚÿûRÄæK©±  ‰;Ii6at›¨1Q4HÉvÌÿþ+ ÊUH0IˆÝÿf”D˜•8þLІe:V׺H{þ”Óϑޒk ¶ÃT;;Ëoƒ.!TÏ5®ÌÑÿÿþß·ÿ[æÝWj—¯‘FmϨè`´°ë@Úq4%`€0\ %q¶íô¢–gäEшҶªŒõföÛ6€†;rï8æŠ{Òùo‘åÇ]6^[Ìg¸o÷&?õ;¸ËÜYm—‘gÿÿúè@æ.â '6õÿÿÿûRÄè •³  ;A3#ã4™úçú²ÖNa!s[LKSÌ®WÎZ”»bVCRlÿ’’Ü{šµ†&/›ï]9Cº†LŒ¥7³S0@™t#ú~ æç?ùóË#¯U-ʶڑ"Wä5ÇYŒ\zcX›!18\ˆQ%N' b¼-¸Ñ í‘Ùrj£5_™™1YÕÿ¹DeÊf®´‰”㬄¡"TdÚ¦SÑN7S²šŒu[Æ:^R+JêS¯ï_ÿ××2C#L,8N48",4L>$ ÿûRÄí á³@>Á—¶ ô›4N „Ř%Ö´»>™NJ‚&Qö"~J1µ U&ˤ¶MÞÓ=v*8ë4§¨S@¡£!ðTÅÀ `ªsÿö«ãqS—œ8èº ;iÿýÿµÌPlÓUÊbÇ;ÞZyjÌ€Ôp‰W·où¿öÊÍ¼Š¬Î”ÜwiWr¬¨cY÷rMøŠÞî<¢nfñùóʲ©¿Ýßšßçúì„åzÖ´Y×EÌÞÇ&ÉÝ_(U;2ÿûRÄä‚ -   ÏѶ¶ ´!¦øQr©Iæ %užt¸ çìòHÑ ²D‘JoFJÑ$7ÿ6íGA"ìô Ä ý™Ý•SÐú²È–*å¡WDFd=H¯!êc2;ÿÿÿöﺳ‰S0L\Eè„ÃÅØÁÀŠœ`êïüAý2gS×Mú±C²Þ_©H?2™‚h½Šå›n†dnÉ«H¨ú娤U§Bˆ (¸¨ ¸¹‘Îr'¤¶òúµ.¨ªi]Ëöè &`àÿûRÄç ± @ ±Ñ'›b´ RL@$pàÁF8ÖjXn[kIÿäODô©Ò€Â“%L5™GÈ‹ùþñÏvýx›ÍXÏÛÓ.w:Õ-Âì(H–ꮈ#jÕ?ÿÿÿÿm+ëS9yLàÎk€QêÕÝûD€ß—ßí,Ü“¹sJWò 9/åù•ulìçÚ¹%Æ3“Éž5Þ¡šHr8u\…•Ù,·WdõzÿõùÕC™ sÊ%"”Êq*¡r ‹ª qsÿûRÄ¡žÉQ¶aè•
\ nú´ÿù˜€%fêÁ™£ïòzD3•É·I ÛMÍ,9yz8ïæ„±˜Qwu5§ ÛiØ_ÿÏÏÿþ~½ÅzJÓL=Ç#F@…BÒHòa¬˜ðÄh¡D¬þK$†©ë3)IJÇ7 ¯+^/ØA¬,ßF#UR à^VÊpÜ\}­éR¥ è¬ÔÑÄ´e­ÎïM;ÿÿùÿÿÿýËL“$LÞ¬Xâ@ ÉœáE(îÍ ÿûRÄç ©±   ±ÉK´¢t!ŠóYÿÿ‰‘¹’g+¦®Û8é®NlúÏçäΰ`a§&@Í…{[ɃŽÂ!7éÛ$}ιÆ[Ûж$¬]3òÿÿÿþÌËIkBC)‘L ”ˆŒv j]¢ÌÌB€Í“hȆ‘)Ògƒ8‰£Ë•6“Avcåä·ß¿Qúóç™×9ù¾–^§âÏ©Ÿ¾ƶßÛÿómþüó½3eDºú…4>”,F¡8±BWB„’ÿûRÄè‚ y¯   ³Él¶!4£ÙaÉ#D€Ž¿úÝ‘U¥JÓü’îV[*XÍT”9çKUt] U½g4Eg’•ʲžFïi“%Yívûåÿÿÿÿÿ¿ý–³I­Êx0cWU ¢_D„áƒç&[¡ÿÿïÑ€â0-],ºãƒ=¿æI=¶¾Ÿ¯Ëž•öeopßi8"°ºA„Äç!–Ft²8~RfO´/Ö«ÚQ8Ì…(ë"v@åÅd†ESZH¦IDG‘ Õ2*ÿûRÄëËíµ @a‘XµaàŠ»’¢xýaþ^«ø¨Ì‘J ›"‡ÿ^À!ºE …Š%Jtó=ÓÖeƒÊùB,“4:1 fêé.ø'ÍûÌ‹(©þþó?ö÷äýÝÎå-½‹G\Ü«%YNØ,#TÀ É´‚l4+ TenI#EGßÎ"+ŠÉÏS‡?OÚj:3‡e^`lÆU£å*¤WBæ³Þ¬óCPæ8­0vvs¤Á,¤Rßÿÿÿû?¶ÎUT»º%…ÿûRÄî ± ÑÉLµ¡è ³ãæPlJIÒ4¿r ‘Œ±1ˆëöéCƒ…?±ÝÑrœéUD˜§!C®köj÷;ш¢„ ±FP!˜C ΄G^ŸÿÿþºÙÕm”źpá”ÆY‘aÇ q!•rÿô$ÿÿSç3–%ZgyrÞS?Ëÿ¹½S§žú—.´™^Èù¾WÁð¬(gk±fŒÄM­Y¹šä-Mx_¾ÿÿéµå©Že5ÜÌQãÅ™Á:) P‰JÿûRÄð uµ >Á 6 ô§¡ßè‰ÿÿÿ¥ç©SOu‘‘þ«ùYG¾Ñ— ¡0¨ñ8Ìdgiùæ¼)š°µh”‡×7Øå(-!¬2ȬFâþ[§äGÿ}|þ©¦vŽ`ØTaЃªœ BE BOQ RaÊm¬@œùx€„—o£÷ŸÏù”:åx|Y.©–h:³ qÕUmi=Ó)™HIHÙáž-¹Ö~?N{þk»ûÿ®;ÿŸ¾«›¥ØÛ¥TLTR®¨4±ç”PJ02(‚ÿûRÄäJ¹­  OV6ảêaáÒâoa ÿÿ—˜ìI¦¸ŒÈ¶ýÿ¤ÖWk_BAˆÈ¹Ùû“WçHÜäê1ñ”Šé´ê}UÌ¿Y­<îisî_ŸÎß$ðÏÛøoPͱ< â ü²‹*M<‚Ä ba ¡U–Ý´m3£”i!D•a9k ÜŠå‘êÄŽ`â»Ãcßž'Â!qi­SûW£±‡W•B‹ÑÕf«D³À1*åx ¿ÿýúÈg§óÁ±p ]þˆ?ÿÿÿûRÄì ±  ŒµÉ}6!4!›©èœ„#™ Ô&Dé=¼Åc@Q¢bÃ%ljÂàÊæd’ÄK-s¶ˆ h eE«Wk˜û³½ÒÿÿÕû|ªj¡Ÿäg°ê¢ZMB(cFYC³$z °M!Ò§oó$ÿïþ|?q±£ž% \׌˜¡CY~äkf i”?‰¹üê¹UB0e_ÈëÓ„wÞ‘hqËÿΗÿÿÿ ¬ÿ¶÷/6Ûã3j^ŒJÒA!ª L 7]l@$»ÿûRÄê ±  Ém6a4› êÀÿç^ŽW+)ØÄV8¥+òOßþ¯frgù¬CHé—¾ØôϧS8—¿NûÉÞÞ]!L»Û¬âØ_4?ÿ¿>ßÕøkͦþ4.q(XÉ ƒ–L ‹pq¤K(Ý&D9Ê‘‚ík ÿÿÉ_Wæ@Æ#ΨÔÿó¦E5Bõœ?:}{5jYÄ{šL¢ûRK-2Q.àÔ¡1›=ˆ¦†wø}_Ïîsï¿ÿý•Îrœ1W"Ê‚[M1¥c>M5AÿûPÄé‚ U! lQ…¶!4'¡ñ93-‘:`Q¶úFÑF»ÄÏPæO’,êLž&°¼dÿ?ré]7°Öƒ,ðkavœ?3gÓŽrôˆÐòY™¯Ê2­}ŸÿÅ5=‰“*á@dȪèˆÿ¿ÿæ["RÎRÎÚþYäNµuÎôÆÝ_VMp|jè-‰Ã.Æp(%uEV0¡Ê‚ÍÁã¯O±‘(A«¢óÿ¥ñqerìÏÙŠt D©ÕÏ—×@ä´M9q2zã÷BaeÿûRÄí ±  ŒÝ 6 ô!›¡”ÃÉ$X\{ÀnJ#E4Û^‚Wq±è]d‡ÿÚ©-Ôìæk­¹ŽßØL—­UÝë•Ðò"öqq)ˆÄ;…PáÃ{ÿÿýofïшÌD˜c¸pÃŒÎr‰ ©þÉ$ K3Íghv âBUT5{÷û¤–;ŽG2<AÒâ¾Ê×.FWk±*臕2=d$„C‡EµÊûiÿÿô³éT[JÈmTÂJŒÃ€dv¬$X rH‘ÿûRÄê‚ µ¡ ;A#côÊ ÿÿÛµ#>,Ù|¹|¼Û£E/óýÍ•ë"”GÆ#p9Õ‰!°sw³‰CÉD6à͆wÛØ»=ÿÿþ‰ËK”{2QÝ…ØÃˆa†RÄ@¬Hâ‚oºíQÿüJ¢ BDB0 ˜ªµüSv‰Ü§uj¬{ƒ3 x1›Î‘¨’ÊÝæY)nG0ÊíO`ªFÒ6ð>çÙ[/³™ÿùzçe$þdúÌ ²˜¤¸… ÛiD€B€ú#¨±»ÿûRÄð‚ ·á ›A_6"4•ãQ¡Y S Ip¬ÿùè÷&ˆÉâSÿþ52˜eÍ)•MÛ¶rnæÄ|ŠdޱEG!ˆ™¥n#”îµÑÿ&9Ÿþ]"ÿþïÿÿ—íoòéÚ·xm+‚4Fà—_U'#<Í2EDá:Y•ïë@€Ú­³ ˆS¹‰F®ï®ÿÜ…¢¹p¹™OûŲïrKŸ57+éÏ7±ÛªÕâÓæqÏMJ¬«¯ÞüñÊÿ?ßÿÿ=÷5½\M¥V5ÑJ:¦£’18ÿûRÄê‚ %¯@ Os6a¨–ºá ì9 xžïÚ†ÆxO:B2–žEßÿÊœR¹V=xl²Óiu>ؚ̪åVfFU|Ô—å;E7xªÖÒ£á4ÿn"8ûꈮ.=ù³­4›Ex5Ž)†‹AÇ Q8êx ¨[Å PÅÍÉÿüHÄfs2 š¾ôäÎ*®dŽTÑÁ+ܧ+ÂŒÛÒ…ž}/fôØ«ëL#4f"/ˆhÿÿÿ]3¿uW¡ÊF)‡yb…ÀÿûRÄí‚ !µ@;Av6`ô§ çŒ0|PP€]þh?ÿñ!Ù¨É#’ÓŸ.DHÆN±fãT–Eb(&yC¹°rHfb%’’å3²¡•ŒwR^u(Bíºß¿ÿë¿ÿ‡K*9vÝÝ'fêÓ!ºa…`u%ÄÍs38«;Rn*ÿÿýy ³¤K ‘0óð£o Ƈ—ˆÙ d3äR3P±¢¤ÍNàŠ+#Geù`gE/_Ë#w 螵ܣ!ŠÊå"_ ÆÿûRÄè µ   q6`Ì¢xc¬(:¡Ã¨%¶´ÑÈÑ¡œŽÌîùšÇ¯îdr3˜1œ·ÑèT•äy·ªI’utS)XhV5Þ”SŒ"resÎuqÿÿÿÿWÔŽÖf™/£Î@‘Ìj[±Ç$ ú̘ÏüÞ°*”wÿþÜŽ>¬¡3¥ƒ,ѶBxå=ù i=ñ±náÜ›¤ Õ™ e(£d‡Õ7ì'úGÿßÿþÿÿaþD¬+;p9Eˆ¡©Ä p´b( rœåÚÿûRÄç‚ Õ± @Œ»|6!4'Ù ÿô%Ø­G"2ƒC–.е¬ î'#<«üäüÿùoÅ<®ÇØøÁ65–)Ð"š´˜ÌmT!y(¬<. Ø€êþHÙ$ÿå0‘fm~¥è7¿jÓË?þ6Ž512¸%AWÈú'xfHG `8‰¢áEñär¼rï&1äÖÿ§·ÿô¤»ç8†åA+¹ÎRŽ"Ps©ÿûRÄæ‚ ù±¡7Á93b´Š ÇŒp8`“$‘"@qEÌÒSžu©9–¤#¿Òf»HrNËCñäšã‹G(û)œŠãÝOÙEÕ²‘âêjUa4as2 1•*¯éÛÿÿ£§ž8«r3 ±Ðî4ãÚ`²c 8“†>I$œ×¾QŒÌ”ÝußöS1ÝŠ+s¤š»Vª%ÑYáÔç¥åœ)ݦ8Å;"ŒT»ÕÖR3†­ÿûòþÎÊ”#(Š: 6Ur8hTRC(1Á8ÿûRÄí‚ ù« @kY›6`´!¦ùM¶D?ÿôŒiAqƵÜG2ÿ3ÆÂ†ª¾š,çZhÊ„u&N]Œ©r$ˆÇÙ!gJ;êæ=Öú'æù)Éÿ^¨KúùÑ+Œ}ÈÅˬu2br`ñ!TJš}oó@ÿçÿ, Û‹"FE!èFyKÌA&P³*;F"lû4Û@ǰý…Òzv•™Ô{²$ˆg#<=GbbÏûù÷ÿóÿ#"®çÈî9fkLòáQa[ýPùÿûRÄè ͱ @ŒµÙr¶a´R'HÉ#$ÿÿ“Æùèä„FÁ͈ŽÏÿÐ’ØÝ.[Z[ö}^l3[Ûü¬Lˆ¡$‹® ÝR…Bá/רï_ûûýÖÈkžçœ×1ìM#0pŒ˜â O‰HÿÄl«üØ¡Ö ´ÛÿÝò¼nï«ç‡JºAóL)¿Ù#•¤$œ“ÉsÿÿÏÏ6—­ÈËiˆJñtÔ_#äº4‘«'DRz~#d@± LånKlIt¿é’ðÏ2”-ˆñ}H¾$yT(°¨FlªAb•…ÚÈ÷#¹UÔ#³˜YЂ7:YTeK È(AÈv3±/rOÿÿÿ÷Ó[4¯I;êˆSThÿûRÄë ý±  ? j6a¨žº£I/,‰êÊ„¨Îi† â'Óÿ/øf¶Q?;¶Ö™!–8s«çO¥U”줺$„{*îÍ=dr²³5ÿoÿÿºm£­ …&"Ac$êÅ@€¨²h[€Å$íµ­SüϩΦIÙÛßZÿ<"°7’¡š….&¹PA â²™{‘šd©&EFl)R3uòμŽd”Oÿÿûì\Q0«„¶°ÿþ_êcl!8aj§Ñu§{yÿûRÄë‚ !µ ;Aжà´§ n«2bµÑ©Å¼s¿¤KZ™JaŠ9*1N:"¡ ,4ÍDåmWR6s]_òÿ/ó!÷ºî_žø²Ž´ÞÌ£Yû8ù’¦xhK èԼѫ?ã‰i`´êŠNY¢ ‡nFðXNÉ|‚N ÿýkÍ7v{ ¬]k}8官§®•RóÚíÇz3=ŠÃR^^‘Á±rC<¤´Úß7Çÿ3öÿõ˳#dLhÐø@†º˜%ÄRÁ¼ŽƒÁÿûRÄçƒ ]¯  ¯™Z¶aÌ–:SA v ÀwûOÿÿÝ!ÀdB0À5,ËþÁ Ù²2ŒI ”ÊæBƒã¬ЉÚT ÑÊÌŠ?üÿúŸÿööb›ý|²J”Òº!8`*kDŠ=9GG:læ+j^3 ÿÿ7›•òG;LÇIΟþÍtd )¡åÚOk _ægfd0¢"ØÌìÎ7l¢3cÄÉPá&§šÕ7ö9ûÏÿù3ñØÿò± &j4ª$2d«åN¶h2^ÿûRÄì‚ E! kÑ¥6 t!³Øë›j…€T˜%Â/ÿÿÛ}UUì…db+ÿš¶~kyŸLפeì‡J=ÈÏÜÚSôxï4÷5s<黽˞å!eþ\ÿ?ìöÎfÎom>‘þ¬˜¶œÂ÷N¦Î«äf û¦+—7{ôµnK"Dÿê¸`àFfÛSÅ+¹)åÿÿò/äžrÎô–54 A“ƒ±#@¹¿xióÍŽ±‘©·õŠ¡¥Öæ¹™'Ò¿ÿÿ’Yý¬]”ƒP[:¢0!#2ÿûRÄð‚N³  J6¡tšø Þ,ÿÌþæ qšPL°F+Kÿòô)Ò©>jfÁÛ1@²é±£'ñäˆ^ˆo¾âÉÍž¨ú©öK{ýÒý?ÿÿõù•¬êZ+)Ψ© Ø1"ì–&9µí´m»_CtĘVxe)M^½ÿåL¨†ê~æ»ÿÏÈ”æ¯jg‚¡IÔ;² î°`¦§`èÔƒ›ÍPðÇÿÿUŠc7`(!Í[ ÿý?ûVýbÆDfSºýŸþJ’¹y“ÿûRÄì‚M³¡ =r¶ ô!³¡îÈ|þäFf¥ Lo%­1;ÕaŒ âÞ–= ‹"Váì’$T’,©|á‘ ù¿Ì}Z “^}_O"®YœãÒС\ê\K3Ç—Y‹wºjR)°Ñ¥’èÈÿ÷ÿÆhÈdgWËúÉäáE†®Äg/¶‘”0,Æ…ṮÚè=vH)ä RG8RÞRèZ“Ö¹¹Ÿæeÿ—ÿ}3m_ù‹Öœ¾·»UV×­dÜyQÒbùŸÆñ D"­dìÿûRÄç‚K­ ŒUÙ[µáè–»^_ð»] ÿþòUȬÆ@ŽÄ{½Ìÿòå36¹“ÞæÁuKBN›S¤ÑÕ4S8v’ÎX$pD],õ¬[©°Nw"­ÎOóÿ?î_ÿíÆ²® É-U~)8Å25![DAS¤%€é75”v*Z,iù˜!váÿÿþTÞŸ]ÖüÞ`›Pä~øå:DŽæ'KÓ3¨äqÒ‚:©Ê-˜ï sÏNC—ÿÿÿÿÿ½tb.®MMrPP!pD—ÿûRÄí‚ = aѲ¶àh!¿ fÈÿßÈѬ«0·R\Û§-¿W-é ƒ+MA–ê”ò̆è%LËPÕzx³$éSHÅ7mÑã\Ðé…Ö#+¡ÿÿÛÌÌÖÕµu¬³QêÛõâD¹ÅÁg¨Î2vp¾cKAjp‰15þYDÍÓVÄ;˜¬%È2”ýH¾}næi¬¬ÖS;£,Æ Î§1™Ë¸9\ªèewU¡yëÐê÷ÿÿÿþÑìŠî‹vsŽÌ¥al@`”ÇÿûRÄð Qµàž¶ ô!§h8x‚Äßd@ÿÿµ=rî :çV-ÿó9×aZ̾ܤ#âåMáӔȪQ&T™!@ævS5,ÝÇ4W•ò…ý¬Yüþÿ)óßW¿ùêž:û¨%(RTÁL‹m M‘†Q DfŽÎuZÚ$ÿOÿÔ©*!Ôh°#²Eü¶wþTzU" ïL´¤HdoHò$db>•>4:Y©X5TB”÷5±Þk &Vêÿÿÿÿ¿jXõb1PÊ°Ó P£æcÿûRÄä‚ Ñ©  SÙ«¶`´!³¡ ( vØ@ÿÿÿÈäw˜‚4uÒì¿ü¬Æ Ÿý²eoóJô“{nÓ»YŸ[ØÐ°°gbb4õ F’ž¹7—Î~RCùÿ·ÿü—zñ©¨¥9…$Ž P aòŒ'D 墨Jí´m£ÉTëI&`OÀa•Ü¿ÿ/<ìöíO,šÕIµË°áC‘Ÿh¦DÅűÐã·¡1Œ@jC¥Üö'ôh¥h¤-"Åx»ï°øM¾h'ÜßR¡ÿûRÄå‚ Å³@N‘¶ ô!§iÕ[ÈÜëg/ñ2=Ù(‹—NIEo3f_ÈÈ…/W1O8fáÑJêi±Ïûýfû÷m›ïϽ÷ÿÿßÿí_ëµíasoG)Û †¹©™It§ÿó?ÿóûyr½Ü—a¸KdÌñ„Ó †Ò@xÊÇ`ÿûRÄé õ p‘6 ôšxˆ˜LÊ¡¦Ê(Æ-üfÉkKýB*$únÿý›»µ[¢=¨„²ÒæVrŸqfC±¤+KU½•T¶Ó|«c”îr#3.õÓÿ¿¥ê‹dTqA‚f¹ž=ãÎŒ"®â`P00¤T¢¡¥’oìDÿÿý?‘tŠVDs-Ù/¿ª¾Rû\ÎîA{–G{Ôx†èÖÔÖm#íMü·kZœ#dâg~yÿÿÿúZøüþs¨ûIMµ¥•úãk³eØ2]³dÿûRÄí i±¡ \Ùœ¶ ´!§hÛ1̘Rƒ÷$HÈ“!™‰ÈóùjÏ…A¥]„h3×§³Ót -f£aH®yµ(½ ìЮ€ƒµfBhäÄÇÿ·ÏçÿÿÿÿÿõÜöÈÚ¢—XbÅ‘i(‘ØGµïìDÿÿûlæY XOnßÿ¢™Ðß©PQÈï±v"=™ GSÎIQÔ!ý¬¦#ÙYIÐÄ!ÔïTÿÿÛûþÎ[~0¾§©Êr•µÑ¥Ñ¦Gª.€rÖ6¡vÿûRÄé‚ …µ¡ >Á^µát–âT 6ÿOÿü‘Íh!6˜ Œ:¹}¿+òkç5[.#+Z’³ÊZÓÞõÞŸ„Mø3V«V¸a#Ò/"I+,»Ùïó†ÿÿŸçþwï0bá¡Í@F-BO3däþ{@z೩d¡EþPÒ$9JÙ<£y› :¢ÿùn”B¯ÒdES–DB3T‚²®žîc•šS³„®¶:‘žQeŽ,ç‘&+{ý¿ýz1P¤uC›*°Æ)ÐAŠ‚èŒ$¡ÆaÿûRÄé‚L)µ ¡ =h¶a¨êáâ`9/ÙÿÿíQ)†¤i ur?ÿÿÎô’Ž,º°ÿÏ;-zó2–©‘ñ+ФDò(VY ) ¶¶|nÏÿ,æ_Ÿå 2Õi³<¼t@è£F¡×fS‰º´Î(8âôݪ ÿÿùÈ„f,M±GÆdü¿Ô†;mB«ãuYÒGR®vræ!X„%Œçg™˜ïªw3Qï9],Šk";þŸßðù°û®H¡UI|Už˜¬ 6ÿûRÄé‚K™±  ‰7É6!4šù†Ù#ÓâT–$.ùÀ8$»k`V½ë”®âˆ8q<ÜL²CÊdWò™«ºßø¥YJZEC.ÜT7óGöXÒHë¨HâÙ )Ñ#%¬u)ŸÿÿôH¾J ÊWB]² ÿÿÊþJ6 …LàÓåBÏó?lƒU‡Ãÿ†Æ«ÿQcŒ¼Ý§iˆ È¢¡û‡q&:pü›mJË‘{BÏ;åÉ©Ûÿ¹ã:ͽê—AÉÃê'4Þ¡U”B¨TtZ¡AÿûRÄé ± @ ¯Ž6 ô¢ø……cMä–F‘ÏŽ¤­‰Žf+Šwçüÿøe —":[ý[xlD´ØI@àè@Êqí² ÿÿ­Ìϸé™4~þêv¶ ,CÞï¶g=6gÝÊy*´äFmàê°•’ej;áJ‡G=ÕzÉÿîëüð©÷:7Ú]IZ•£ËÚm¢‹åXFRb˜.€ãÿûRÄç )± ‰= .££t*6ÜÞÛªÿÿòûí6lDL"Eþ¬…¹_û:RýS&>ÜÎè„hì NRËã’"ÒD¥#xZBýÎY¹ÎeŸž|þ½¥+êdjY–£’™fp`¡Â6Vc b8uË0ÄÇU“oó ÿÿ˜àã`b± £d<°cï1:³#Äg¶ŠîÎRo£-5+³{±Ù•ìêÇJQbÛÿoÓïõ Ô¾Gûzˆ²àËsä»$픑jn'ieПÿûRÄî‚ ¥µ 7Ác6b4 2´ˆÚø–ÿÿvè†ÑÄ€PˆyD}é^—gUHM¨WªX3ªÎ¬SÎw3ŽäKÖæVfÒS™Tå“wbÑPó²Y-÷þÝzïñêm>ÿîÙE4™e³‹òBlò€ÈYðÁÁǧ [diÿü¿›5£3µˆ *xrŽÿ/ùçÅkV‘@¤Ùš1‚ƒ2æ•×*LúÕâ©! «Èãö 6©ÏÿÿÿÿÝëü‹•ŽIÊAFx©ÈÒÿûRÄé‚K½µ ‰;Au6 ¨§¡ÿ+ãÈ‹$´É‡”L›1ʦ™VŸUÖzȧ ˆ¸”Îxñ DœL\L¬ÄTäj_¢«¨º"•ë39=wuwÿÿþYŸ¾;Åb¨óTÜM—)#±‰(âYx4H¥*-¸ÑÿÿÕ^Í⟤gc’ÝyòúÈYL·4Ñ“/-½{)¯ bÉâC­Ô0df"Ñ ÌÊ)<ëO"ÿÿ¿åÿ?¥»*ÍÊʯ=œ­ß¨÷—Øg$­¼{ˆ¥ÿûRÄ邋ݵ  ‰>Áz6¡0ø F"KbK¾³ÿîÝZÛ:R‡»”Ò¢sï?üólR“Œ@˜FsœÈ¬Ñ#9J ;€ãÄa „ s74P®¿ýu¾ëÔí&/Üg$êšb3zí¯L2‘–I‘2ÙÀÎÆr_¬@ÿþ>D›7nÝÈR ¿÷ G™Ì¢ŒÈßÿû–æòmNJH=ÝLÉ(qJy$ôÒŸÏád]Ëü³ïÿw¼¿gÉeMe4•m|Ř9m—ÿûRÄè‚ ±« ŒUÙ‹6!(šûdˆ•§Rw¢ÿÿ¥,ÀŠkNd‘Šr»GOÓÝ’}ød;²K*m‚ÏF0®¹ZWŒ¼ÈËHá”ó.XC¬/)"Žs?†gþ_ÙýÏ–fhÄLÂ`1 28êÀá°6ÆZÑ6F@?K åoý’[G+’›áLgOËüÿkD"/üé@vLÈ¢ùS R±1C2GV¨„A9I¢Á´˜p±Oÿÿ÷?µòÀ7.ÙÿÿÕ™nò²hèÿûRÄêL!µ @7Ñl6!4 §1bQoÚDÍýùå•'kÿ—’¹8Dixq¬Gw¥ÚQ2ªŒkh¾ñ ¶Ê˜’#s/3[=~ò_¿åÜ·v¥R@•UfO1c–»õ @RªÙ¹5™Å#¤/AB¤*Rßs@ÿýÚî!‹Rº+‘˜R¡l¤·ûÙH†ê.¬­fUû»Pš3ÜYYîæclŠÎÄdWcPfp<'$®Š§ÞÝ^Ûú<«nU)y1ób«S‹ &ʯ4¡¿êXRÿûRÄê ]± = ‡6¡4!§¨FÃH@Tí7€Ý¿èAÿÿ— Èr$c2„Ÿ'ÐåÊî´* Œ’¼ˆ–e!,tÌì~® Å”†5äQL†w):³‘›ýúþŸýUð¼Ì¢Ê!êÕD'±3È |iÊ4DF8.ÀÜQÖIkIv"—µ±÷‡MT¡Ö™2Ê¥»‚W¾|Ž„ígaĹDŽnÕ ƒ«¹˜\ˆLu:8Ç2„Іw;LÆÿÿÿúl”tÿek+ew1Ž-E˜pÿûRÄå‚m% p¨6`´!¦ø#8’H ?Ú"@ÿõÿìúì[#±E–¿O³3•™“á+äRF¡ò9 AÏoÊ,TO¹Œq±œ­ÍÕ¹‡çSÈù>ÿùs¤÷ÕÎBÅØÞ˜–ÌÔóåXÔ¸$ö ‰3‘pò„8V­ÈÑÿüË”Æd †S– _­©èêeEзYÄ ¡šT]Üà饎W³™õ)ÉÆgDrX²³¼‡tÿÿë«qã2û=Ëv~ÏßÃNB3§ºÀF$ÅÁÿûRÄì‚ E³¡ 7Áo¶!4#ÙÈ D™J€%ÿçñâ uò½(ßɪ&Nsæ\¾›°äˤÖç.{t~÷á9¸^`hÄWÚîîz›©]É^ÿâ?™ùÿÿøôø«®븄)qÂvÆ¥°áw8㈀œC  úŽHÑ$ÿÿC{U)Àà⃳”¦ÚßÛUr—£=¤ T|/ÌùR’ôªQW-qìd@g.ÈF6Zšãƒ+“/GýÿöÚ—54b(ƹªÃÖEC‡†:bÿûRÄç‚ m¯  QÙy¶!4!£¡ †¢ÁÑ 1-¶4€ëÏ£\ÐCÚëúFd47*mpØÉÞ–ùÒ9 ÝÎV“<Sµ dhæÄYŠ,|*ð\ÂÏÿÿÇÒ«ZXd4kIÕ‚I ÿÿÉÈŒƒ‰rDWýéyØ¢ÚÎ#ìÿ˜¥KìKÉå¢2x¬ 2ü E†Fcœ€…¥ÎxñFÒÉØ¯–)dJñ¨¯ýÖ(“™¨eˆ #">õDQw\J ñá(ÿûRÄè‚Kű @ˆ×Ùqµá4¢9€V¸´ê öñÿêo÷°5ƒgJß)Wž]¿ÿäo”ÍÍ\“šû>kr8— ~%‹Û6µ•ò&€½¯¼ËÚ©ÿ—Ÿýzþ4‡ë²òá8Çq9DåP¬u$5ÄÅ%”4ªþZÚ$ÿýìGÛHlt5PûßSh¥ÿóËÓ6Û½&„ ×ôÂ*™Sc*ö£XS2¾æÜ(ôŒÝédÙéÿÿý¿Kšìê¤:*)ÜâBÉpIÄNaÐb‡Õ,I.ÿûRÄé ± A ¾™' bôêÚ6ÀÿüþRÔ߬{‡g@CFHJLORTWZ\_bdgjlnpsvx{~€ƒ…ˆ‹“”—™œŸ¡¤§©¬¯±´·¸»½ÀÂÅÈÊÍÐÒÕØÚÜÞáäæéìîñôöùüþ9LAME3.97 ¥-þ@$mB@ž]Å"½ÿûPÄÈá´ô =¶ €3 ò?›õÔâIÏSŒ¯ä#)ôbTýEÒ¯Ô †ÎÇù ÿJÈIÿY9®Ý·%1væFazŒê ·YsßÄ`YFEdä`™µÛé{hÚ6Çu­Kc·*NŠ{ÌS®³å[mn„.ŧtdm^—öO󾽑Y›Ûë^n¦,QÃ#ÇëÏ–à…ZM¨";{©PQ$I*€É—ÿÿÿþŠrFG¶!š1(b˜¢ýíC†jv`¢ýÿÿÿÓ"»)š®ÿûRÄù³ `UÀï6!H›¡—b®Š`Á™1aÔ¢ÌNÀ˜P?ÈfÛþÈÙM2.bó2Æu$z6‹Ã™Žòoå/åçï¶a¾íäöÖ¼Ý)×§@­0€2üÐI0êÿ½ìÔTª²ÛV¡§³ØˆÈŽU¡v:Tì¨z*˜xôg³3"6Tý½V¾©ÎQe9þ¼®KEiQl2aÌ‘¹(*qBÁDMÌS¤óüÎ06<ÉF„> ðÂÄ!+"‹fxä¹_ÿÿüÿ÷ówÖçéÿûRÄ6‰ µ =ã¶!H§¡ø¿É+Ù.ÿtšj§#gšY¡|Õ ?Û-ÒÎŽÞ¤I›I*èB9ÔŒ ®Š™™Ìkò™ˆEe•÷¡—ë§¿5IFO›0Jì¢2]:TµÔš˜EB”ÃbS…Ö`Ô“0ë"Å¢¡Ñ \<åÖX—.‰éÔ©YÿûRÄjøõ sQ!¶ „'¡GòTBv¤`DÕË%,Û#£.G°Û¹±gj.L¥¥s?{b™,^ÞýùÿÃø‹ÚÐÛŠO5f’lJC µ`¸DL|Gƒñt ÿ>ÿûRĹIµ@ =C¶ اÙ_ü¿ ç¿ÿÿËì ÄC»7k«¬xÍ÷*ÓIR6ÖÌAI“K¦º¼æD’,žÅ¦ImNå¡ë;æ6ÿáÛÆ>O^gf”£6ÇîûHFÞˆ¬°•F)#$ˆ±“\€Elº[,Ž¥‘¥ª@üÿÿÿÿÿÿýGå<Ζ_W3C%V¨à5&ÕæÙMihC8iBr­ÜÌÍû Þþsó{TµßÚÒoñ½–ÈØk™a!êe¸Ð}pÍAgük’™:ÿûRÄʳ` ZÁ$¶!Lù‰LZ/ÿÿÿ×ÿÿÿβaØ÷SšK™C%D&ÙˆÁZBQÒ£²š«¥AäÊ3}%™/Ÿgæn§ËmùšVê¨Ë”èÎc´0jŠ é——[h¼~~R C‰™ê¡OŽÄ$ Õ Â@?ÿÿý¯yÿÿŸæþGsãÃ(ìb/gD#fR«V"PñA"F¼´Î!ç”2ý,ÿ?)ÿšŸÿÏn;ñ«I’wÚošÍ¦ªì8Ù­s/>ÄBŠ6ÿûRÄã E³@ ¨6ŸÄ3Úhb }¶©õôúëd-¨”iРÎÌáh(!ÎÛ™O —d#³•f-,bHe¼ïF½ŒM”â¼?žZSR}ËSx D+6F¬D$¸¨LÉõJ”!X&)"£YK#ÿÿÿÿÿ—¾÷—hò¢‘FÞ• KÊšŽÇ ¡9d¨bœ]Á->0H™MLÈb!Ö¿ÿÿý5ê–Ÿ:JŠeC‘Aê0HQÁÀÂ!c„Ϥ¹ÿð%ÿÿÿüã {È%6GÿûRÄæƒK=±@žÉ6 ³Ú_å´¥lüûÈg2py„§˜N‚dŠDÛÈÞç`1†2şÝÖf5½Ìßã;²ø¨Ë[vÌg”wF¸SÅrO'*§p•‰±,“.µBRÊúe$ jæ"â°\ø¤G·ÀÒ2@NGÿÿý:³U™¿u‘ULÏBŠ-UÙ!Ü)ÝîPDÁ;ÆfdXâJE)Ès­‘Ì›®š2HªúÌ¿ŸMy¹’ë¾ÜžrƘ\ñ‘xøˆÔkÑ­Q]ä!ÿûRÄç }µ =W¶`D'kð¶°ˆ@ôÿÈù3D\ízÁšùä”ë«4*BtQý'(s<"µ)™ú}Él_òóÿ?–dÝ’óÉÚy‹ „XNb´ØB£+*R+­eFÅÊ Ú1+ÿÿÿÿÿÿwü—h­ ŒŒ‡a$¸ß ^â;šªF ‘T@ê&½JN¡Ê 6ê>]?OËGÊIšÚ? ç*µdV…kn®yjfKG/T訙ÓÃÃCl/!ëÿY€ÿûRÄì ©­ ` ·‰Õ¶ß„?Øÿþ¯ÿá3gÿÿÿøKHþ›¶dúmtü4³Å–´™ª¶ó(ò‹A¾*±½Gy¦ˆ¸šÚÖ/K›ý÷þ?ü¼µçZ÷b»ÕKƇÏãæa“ÈQÔJ*@”œ) ‚tã‰ZúïÕð@ÿÿÿð‘Mõÿÿÿª“Šˆ¼’Ó$;&n¶™Î‹p£“µˆËUJfKA(`ó^÷w¶~Ó6ïÿê ¹Ôà®äæ”°Ù2Kœ¯“œô5ƒIL(i¢Gjài²pÿûRÄèƒ É±@ —ÉU6 ˆ§hq ¤Ð Uͯצ&,>¬2S¯P_œn>’µ/ qL·Ì–_>¬¯™ÿ÷ò=¼¯ümº‚X¶aœì°™Í0ä—ŽÄFVGÍ›y±4¥ˆÆŠ´åC@ýÿÿýòÿÿðŸ+½¾Þ'%K’œÎ#»Ès)¸!N®ùºlƒ²iHz·qúqˆ`ö†%RøÞYBéÈ„tÌfÑшëd 6ŒÆ²DZÕÓI‰† ˆ¥’¨V8“ÑÄ#ñå}ã2§ŸÿûRÄìƒ õ±@ —É’6à3Øÿÿÿÿýô÷ü÷?$UÎó¤åM‰Ÿ'> @Ý ƒ…DšQl¶2ÍÈêœ?$õK58Y•Ÿn¬œ-)²ù)ÛFª'Ó„çß4Ñ㊴e "VÄ>?ÿý)~œž!Îý³{*Ç.*´K K´´-¥AɈ3àvµ&¸æ Ö2‘ÔoÌÿþ­|¦Lq‹;i­Öä 5vP[mÇä²®ÛŒQò6.¯\+mG‹ÿùÿÿÀ…2gŸÿÿòÖÿûRÄè ³@>É66 ˆ§ ydöùÿ“7îÿ­ÿd8Öˆìöz[>î¥3¤´J?Ý[áôòv·F¹ÞëÅ>gðý¼ú¿¿™íûܳçlýÒAb¬ ©”ÄÛ+*KôlnAD€h3¢7nZ³ûÿÿþfÔÕÿôŒm‚D2§Ã)(+Œ*޹ŒÕ˜[¡—Xfqª9—1óyƒ%S'Èü©§’çüÊ™…}êÒ.ÛjœšBí{Øâ“§¤ŠJG´l´t^uQ²Ñ¥ÅÿûRÄñLáµ@k¶`H¦øåe?(°’ÿÿÿýõR/ÿËÀP¤õt1A%]žÒÑ]]Ô˜{¡Ìªv.÷€ÙöЬr¦õ»U/ÿ¯ÿarÄþÍ}‡Oɘa²ûS^br‘2š§d 8*Fáò…à&F€Ñ J?ÿöÔî’Ö̬”b4¢ÑH@í»ï#™2],}N¥Td20F&!‚S3‘æBvGßµWÖî3ßl%[ÉÒ°µRÛ¥g¨hFk²º$"æV0\êÌ®àÿÿÿÿûRÄîJµµ ›QŸ¶`3ÙóÎÀÙÿÿÿÊÀ8ÍLªO|øU-7¼?c壭²*Æ è¶­ÑMÂklb¿mï"Ÿÿ>ËäîbÎz÷a·,½£82FHû¼s‡‰Ô*iÒœô²V6f*À€~¿ÿÿÿºÕ7‡ºJÎó9Ñè†ÓàÈv1A!Ž d|Þ¼»«ùËu/ Œ^&ŸžGÞ]W¯·uç-õ›î0ÙÝ;eM6ø±ɰÂÅèø&)FuV ´•…ÈŽZ€g_ÿûRÄí µ@c¶! '¡ÿÿóv´ÛØË_ÿõ@!Ò<ÖyÃkä†xå!¹œÜ”ÎûÃ(§6Œ×Õºâ6Y$ÿOþeIa.ë5†wkVuûÝ¿€ôøàðý5ĹEÎÚNdIŒTˆªrzH<µ Q `šžàÿÿ-9Ÿã™øµµ{ÔEÿt5ïXªÇ¥i½°ÝN’²íPžôÉݲ\ÂÄEVéñõÿÿ?þ÷ÿrƒôLa'ܘ刄S!IÖ(§ƒÿûRÄì ³` 7Év¶ L³Ø „€ðÿÿë´[©B˜¯ÿþS žgW„Ônš—5µ»8ðÕ8KLÊÛnni–Uªú!š?ô¿ïùþ矆z«Ìõó/k$+Iâm" kWóiQj¶‚ J¢@ÿÿÿèÀtkH¿ÿ©;ù"8C5O"„òJe†d7HpÍvÖ‰ Fs,¥ÌȃW¯fèk¾gü%ì¿ :„%-ŸÛe;]$àì‘èªÉâö²Œd•n(DLƒVš«Ü5ÿûRÄî‚L)µ@ 5•¶ h³Ø’ȼ­ý2øÝSßfpˆ4Ξ{]”ºÆÙ6è¢ 6êai¾@@ƒ!óI> 5ÿÿôö¨^¥z_ÿN;3—ÿºd6èמ ŠXhÔìwß½6÷gwã«_/Eì^[Ά±ÎˆÊŒàÖß[fP«¾ÇG™—žµ>z>¿5›çntï@ûÔ^¶Ïq ÃÓÄŒÝä^•!©yxîR#ˆ€øœCˆ° Õ,$˜KA<'VͧpD@ÿÿÿþ„ÿûRÄé‹…±@ e5àä§¡ó|ÿüÌ‚0™––Õóñ! ¨…=§¿¹‹K¾7$'ev"âÄ¢š!oÄÑ×N­?.e2ú™eöôç>пžãË<÷813¼= ¥ÃÑ-8,0ˆ*.¨ZVEU$HÿÿÿÊÿˆ÷?ÿñ²ÊüsïfùgÁ™ˆ ˜VQ ÑF ‹Âœcc ¢°/Áeú¢®ýz9s<šü†íAQ›©.Û’µ$˜[NƒäŠ‘ˆ,).ˆ¬ ª@£FÿûRÄì ű@>Øï¢$LŽ’º#ÿÿÿ“#ôY æ¿ÿíM¦Z^2•†~fT½~˜Å¾’αèø0šqO4l YäÝ"Ÿ)¥Ë7¤e?y÷O–s)[_ójå2°£æYYki-B™<%ó³'ŽOœ)–Oß—½QÊQÿÿÏò€¤Š´¿ÿþ¢as¥}[Z¦{a°ìÒ-n­õ rûõèÁ6ZšxVo©þÇsòȦE3õ’ûîjŠ>fy‚ØÈˆi²I–"a*g ÿûRÄý!²ü@É…¶ L³Ølêm’)+µ„8_óRó‡ÿÿÿŸ÷’hçxbúª“ÕeÛKѼt8y_eGhi4éÌ©WéE=WÿÿϪ$»6…fgÐ’ÄãÄ¥J”,>QKž¡ÏUAÿÿÏ•ŸÙÅ ¿ÿÎ*±ß;r†dp~Fϧœ{-V?<²'¢Ô’ ¬w[ïˆ,,@ÝLákÒ󔾓w…ð»rŒ·Áò›É²¦m:@:NÛÔœ‘8¨Â0± mÂA4ÿûRÄí‚L]±À=~6`¨³¡ÕÙ9¶Ñ’ÿÿòå]0+k¿ÿp™&¶ÎIŽÎ(¤-\#([Ü=>†ÖE#+\sK‘.2Ÿµ¥ÿÿ¯?QëÛÊËV2L2®Þqð 1´ìpª˜"e5•b[liÿœ­c§3ÛÔ˜¾üˇ&¼“]¡0‡5í«=‰I÷ìüòtE!’.LpÊ-<±…Äæ!ƒÌךÿììsÅ‘m@ðƒÜÿÿÿšF‰Œ$ËÿùuyÒ ÿûRÄê qµ@;AD¶!Lž¹vË{hÆÃ•,rO7S»SŽRÝÑ8ä A.VZÌÒ›glõÔë~sI~1Ö×ùtý9ððÍïu”Ùº,Ÿ)þ/«_U7Ç€ãh%rÑðä#!Ÿ:Â#¡8ÌN9í½e s²'7ïóË/ü\ë)SéðšãTp®ôˆcóóH1³OÖîo™Pê¤ ²’Žìbº±ôVnŸÿû'dYêÆc!γìâÃcÚ0Ðø1C„8‰ 10–ŠÿûRÄí‚ Áµ@=Q6at# Èÿþf£É«1ÇTåSÿÿâUý¡pÌ& Ï…•V›=é'Håj©š›Óg ¹B†åÝŒüÍ»—ßOœþGÓܹÔ1&òYhíEdÑ (]5µ!4+@TÞˆA“‰jÝlm€¸$FS3 ¯ßÿÞ”j}6ç[)å U™3Q~ëÛ+©0Jfša!™`¡”† * ÀËÿÿÿœUÃl8ƒ‰åµ@ÿÿ­9iëî[÷âîÿÿî¯RÿûRÄî U  n‘Ô¶_Ì3Ù˜ÁѤ"-éÜ¢™-wó4ðÐJJÒ³n³ËxÈÆ+Œ423å_˜¶:ê~¿â#ùÿîªbî*ÖÏЃúy¡q9µ"bƒÀôT^ú‘àÐà@=† †U "H¤R( œ¼o¤^Æ`Õ%àj 4h™`llG•A³TȽáb€zà b7M"ñ5ñs…ÿ «Æ@1.šÑü0 ÇÐäÀÄLRI/ø[Ø6ÐN`Ø P0BÿûRÄì ‘±   ³É¶ ´!§hH¢Šðp¸1ìApÄb€2v ’IhëGÿŸplÂÑÄæ'BÑ>8±I>¥¢ÿüRóŒÙñsŠÜqˆ 3D ‚pYcŸPT_‹ÐªªQ™¶:«°31ê«Õãj§UWŒ(™_ofcªj«çÿÕ(ÌLÌ}Uÿ‡ªU.3q¿ã{3uTÕKÿýWÙ‰€˜ê©³U0QYpé¸t!½é¿ÿÙ¾roüE€[~r˜[0ŒŒŒÏÿûRÄé‚Á  q²¶ ª€€‘¿—•!¿éLÁ|Ón·²VÝr÷73?{Ë6…òaƒÎwàµq#Äînõ§ñßýÿÿÿ÷Çý×ÕŒûXI{ŽGÁñt0QI±¡1Òå#—@!.Ù¢ÿÿÏý¢TXÒ-}TÿÎú§¨±?Û¥62°HE#®ù%XzÃ& Kn®ño†ž1ÕcY𾦖ygóÿûó8_}ýv'¬û¥á .ôYÈuV[ÔC¤ˆ—‹j–¢4Ë![k ÿÿûRÄîY{o¹)k¨æ§†0ÿÿΊAjfæ[—ö^ÑUÍ­à9uÚ7H‘“™pBøFTøæJm B¨r¤ö¶!•*œ¡<¼¹–ÿÿËÊQªn¯$¤õ”7±M(’,»¦]Wräé0U3’ÈmqƒríY ÿÿœû›¡ æ`>-~ó›É}øäFËSÒLã“~o[5SSœ!avÁ'ý»ì‰KT^Ç™iñyùûe?ýù§dלµŸ­‰‡mEӎ׶åÌ¢ek/ÙxÄÉÿûRÄÅ µ  ’¶ ô¦ùlÝ»Dÿÿüœ† CG ‡æWòZzQmûÉÐD‰mÒD—z†úYÓ¥YÁ‚Òìiæ~¿¥/ÚOÚÿÿóÿ/||÷2å<ºZålF~‹zk“Hj,.`ª3%Ê ©ùl`?ÿÿ×N ç2—>_ôò±£7T§ó?ÊnÛ,×\œ¥Ýc½Zfe±ø¶ËÌQBõgzÐÿýr#îMÎñ…3wŠRãqŠòqôFâa;T„B“ ›UÿûRÄÀ‚ ½µ =‚6 ô³ vƒäèÞíµm€ûL7‰’ u²C/³ÿܺr;ªkIq%Ü>G¢ýÜANMH»©ï«6jY†´Ä ^å’EñÁ»ÿÿõHúEe  $²4ˆÜc$n‹uä¾_ÿûóÄØ”Š+žAÌ¢ØG‚ˆ<}q/ h31`Cƒ¬µ”§ªÒ«=ÿÿÿÿÿÕÖÍ¥]+•‚Í)„©Ý õH"D€Ó©E»%àе]ÿêõ¡Õ6¶’Ÿ5V×ÿûRÄ» ¯  ;Iz¶ ¨§ grT ­èS¬èW¹Ù¬Îš:¹‚ÚuE7Sÿÿÿþ—ì}ˆî)Ò׋9Ôàlê¢Ã±\pgt%·VÒc)ÖÕÝ&…«ÌÅÒ”ôOé.)e¯ç<ŠdôÚq󻜩–…¤XÜ7,i½ØŽã”:H/ÿÿö¶… ¢p[I˜[liù—Çfe%™Ÿû[ËÓܳ®¬ÁÄÈÊó%§¦9¸¢wöv7¯1FâÀ4€Ì4D,ëgÿÿú¤jhÿûRĹ‚Ù pQF¶b4Šz¼<ÒàÁ0îXÑ$²ÿãUÃwŠÃ@)Ó^Ñt3Y—ÿD35_©ò…%d£«ªº8ÎW¯aèî•¢ 'ZÝU½•\®.ˆþÿÿÿé©f©«IàŠpGad ˆR(gè êŠI$ ÿìqIAcOÞþMˆå@Aùu"•Id3!­e5êVÑï9hŠâç #;-ŸLDÓ• Uº›¦oÿ·ÿ§!¥A›3‘aq¡Š”\P¤Ž M‰ÿûRÄË E± P "ôÂv¬‚ÿî—FýRÈW+PåQŒÒ;?§ú?^ú%LÁ"¥#–ŸHä¸$϶呼›ê"š¸ufHÑÞ4œ2û|ˆ¿üÿò¹ÈæåmCÿÒónš‹5ÔP–*#%GºYh6€Ÿ†˜ÅZ[cIÿýß¶Å ˆ@„l ³PTNWŸïÉûšzý͌Ι™È–Sëh²"RÝ×®ð³J®ÀîlÚQ4*鎿ÿÿÿûvKn¶tEÈzL°jÈ,<àð·ìÀÿûRÄÜ‚Ðß qg¶a¨ âÿÿªb#¬þõ-•¶Öon§®Õ{õpŽl1_H(j&Ö©# ·é²âý±ábÄ«Bbo³ ÿÿ–ýI„C2˜U Ž&™ëÿöùhi¸[ñŽžDË¢å7ß=­ÌŽ×(³-ÏÓ’º1¡ç5Hßs9Žhgo{'ÿÿþs)çþÕjLcëº{ú—±óš<ŽÒ0]£ZYåÉÿûRÄê A³ @¯‘ˆ6`ô!§ ÖtÏùdhˆ@v4}°Ç#¤)Ä'íÿù?šTÅ5ƒ"$3D;8AŠÎE»XðÌËÜÏXœ2\ž¶P”ïÑÉ3ÿÿÿÿÿÿÿ¿{œömùhVd-HsRƒÓЉßó$ÿÿúÑ›ƒf2F‹õ£²…)UÎSþ›¨krZg!d+¢ÝèÊu¢Â(šã$­¹–„Û£~«ïò¾í_û—°•æ=´ …NÓB0ƒ1*F 2E[ÿûRÄê ѧ ŒUÙ}6 ô&øwm‘ÿý ט„1ÂknK×–¨Àæ7–S1™š*#jä¹Ùê’»Hë>òŒÚ)åŠÆsœ­ ë& ÍÚ¹¿ï¼×yýF4”– Ø=Ë7!e£Há¨ÈSK°ÙáYdmjI#D€E;XœGrªYé Ìÿ§®o˜ÆŠe¿Ù/ƒ 2ÙÌÌê9­Ø†:,äy©:5Q–Õd+I:t™ÿÿÿ·émdBJ+1ÔÅÂŽ Çf„ÈvF IÿûRÄí ‰µ 7Áb¶aèšvÌ‚ÿõ_ÑZµW[”À[¢2”Öÿ#mQ©±K!ö×±IIÌÛwHŒ€ôõ[Ú~F‚“C­¿Ó"I#¢°ë–«'þ_óȯïæO|‘UJ9IÔµ2“Æ£ô®küTœ7 U³JÝ[ciÿã—óA!ÀA€‰6R–!íÛüû”<|í+QíS3õÈ'£„l;‡ˆ†¬‰ ƒYÜUÚ낌cEµÇÞƒ8Íÿÿÿÿ×ìyöÑÙYcS•®ÿûRÄì‚ ±  ‰9‰6 ô'Ø— ÿÿÃíêÄÇQä?Ïÿ?½„–÷=ë:J(ÿ;m‡¡ôa/eŸ aµ½$*̹T/F…2ËáÿOÏÿÿ.?ÖÆõцBp„aL·xªÉ&¬\¢ÈìÐ&ˆÑ ‘@BþI$ º=­„¦k_çämsl1ÇÒÍÁ°–·Œ×Z ¦qÏ–ºÿEA©ÓnSSm!òfsâóËÿÿÿÿüÿË>÷‡VÎbl!U­ AÒ ð#{êÿûRÄê A±  ±Ù޶ ô!§hˆ ÿèé½ÛÎÄ*Qˆ®ÿÿêÜ÷©ùNå­9-Íi”°¼ÔŽÅûoåXS£°¼4 kAÁÁÙpyÈ_ÿþæDSðÛ”äö3Ri<¬T‚H^‹ 3!hdb:Ó,6)T]¡J*ݺÿÿúš LFKbõ&GÏÙY ¯ƒ¬,²·7¾]¿™Z{g å-Í5~4$W"Éí$&Œ]z¬R§&ó"ÎÿÏç{sÆãýä7¯(d¯)ˆÍ¸±Ûh‰ ò=ÿûRÄé = ŒUÙ‡6!4¦ùPáRˆ*J’L~ä‰ÿËìØ´7$w)RŠSißù­¥é.^í4‘ Ã%ttB¡€“14dÒM2„Ý lLfH1×h׊A¦Ÿßÿ×ÿ[jêbN„"0R£B !Yª¤ÁÝ5NYÿÿÀc +ì—ÿå[1ÔT—­r9Ú‹µ& 5ÙØ„œìÔ„qB‹;Üáòž "R†ÊÝØ‡2‘”®¶ò÷ÝÏu5{=îÏÍv;ÿûRÄé ѯ@oQ”6`ô!§h hi[­JB‚çÐbNM+Ž˜q’å‡ñ,áÇâ÷$h?þÇÊQ!ÈB=Á@Ј²Tß?ûþQá•ÏgBs0¡yq]N<«ME¾ƒ€³tæ ߌ“ís -à§y¿imëÿÿúoû ¨õŒî1Š9BYØyÂeœÎ‹Î—oûE€•œP“Ø €«/å©€€ÉR0úŠIºŸöbnªåa tÂÞê´ƒ*ŽÇJ<\e¹p]NJ¯ÇóÿÿÿûRÄé u± ;Ag6!¨ŠºÿüOñ<¬WVÎ1.œh× ƒŸGQVQ¤‡°Rá‘ÿü†^}¡˜.„Q?ÿ̵„ÅŸÏ÷ó6N§å “¥Ìå;NÙË“W™åcB¤ÿ—‘Hòóççÿö-úªÝðWÎQJš„૦Âmƒ*®HmbÄp<ÌKªùêN9#$ç×á“*æ¼ Ç·ö_ømƼjE#Š …ýwEΪj#+£_G1f¹¥‘äî¨Wž‡³}?§ÿÿÿûRÄèIµ@•—Áv¶!¨–ójÚËj£èiH¤qÅʈv Ivùÿþ$ÍSf&C'P£(é{ª9R/maùcù}á×Kt:§ßKÎC§Jå´í‰æpÍö…ÂÒÏ%ø~ÿ~~ûñû™Rõþ:C+ÕŠ§6"®ÅªSÇÖo¼Dÿÿÿ4g‘X[1´¯ÿ{çO¨.JLɽjDs}2¸3F¼ÜÊ3-inuå%ry“r£g™wOÿ_÷¶©Gt¨š2]ÐÿûRÄÞ ­  É}¶ ô§i”8š¨Ä*  8°á!ó€rØÒ e…íX\NÄ™¡óÊ—e›]0R÷.1e~(éƒã±¸!Úza”ÎB»‹b–òUõsÿÿ×õÚ¶±³#Y`ó eéˆÌqu=É$ ûUÜátÊ«{Ñ)—ÿùÒt¼t?§sÐÈÏ>“Å"¥(3ÕjIc¡È§8¿ìb¡]ÌÏÆ!Qz;ÿýïÑXë±Ëb2A¨j 0 H9ÖvÿûRÄÛ‚ ±  OÑz¶!4§¡A$»îÑÿç8”éH€ÐãºÓÿÒºƒ°ù›”ÒXu²cȪv£LÔˆó ¤N:$N1Ï{Ä0¦p¬xúIo?ÿÿüÿç_ú©d#j0ýµ-\ŠÌDòôØ\´Èµ¼³Ã+lÄ *‚KkHÿÿ°?C3o1§ÆJþ[øûá§½Z“]e;ÅOo­Ómv|ÇÜ9üÞäT4—±11›²ä¹–Ç.Í15¢jïÿÿü¾ùÒu¢×vsŒP¥ÿûRÄà …¯  Œ» A5â(Š{@ÎåB”…‘¤HùùµlrF)ÊR";Í];ÕT[÷UyÔìí±Œ£T ¡„ew;‘H"%•mp®_yÜk!ìµÿÿÿš¼VÍ#º!ÊîÇu €`Æ ¬0#0a…ÕnK#IÓËLú”êT2 È…Ý÷™'†«ÑÐ…YeyÑ|{«¡Èæ)C) ‹ÅŠf ‹<êUIÈÿÿÿÿÿuB] Gb°*‹F0Ä8²ÉoÑÿûPÄç‚ 1¯ @ QÙ‚¶a4§h €ÿþ‡ öʤ6$ñœ§{4îÿÿË%Ú‚•äç™ÝÁ·J*»ÛʈÅ.S‘(‚AŠd,•ÙÜ!N£23s7ÿûº¶ÿëc-íì.57·H›Dð0ª^Æàá ‰Ý níó ÿýo¯&‘‰T„3rHå x¦ˆÇu{ºÌªÄb«~·PJˆîæ.‹@°dt{µˆ¦!R5Îû~ÿÖøÂÕùæ”ö~pƒ+FSqD 8‰§—Mé ©ÿûRÄç‚ í³ ˜U‘c5ᨉ£óÓÒ‰(Xÿúçó¤†YBLw-~ùŽ£´*²©áU­W£ÜÏBYÈg%šÕ+Zªèc• B½ž¨U1™ÓÙ%}¿ÿüŸ¯ýÎ>Üĺ[£«ÝÓ oâ‡ÌCh…å™–íµ€‡8°3 åÃdJ6ùçï›ôÚ3„@j ªZ,jx´:­X`¨@&¯çÃqNâ,9¸žÆSU§‘dRg‚ÿÿÿ£e/t˜ [¶`?ÿø³ÿûRÄé í«  O¶!4&ùâp !LÇ:UJíÏý3±íýø‘–Ì{ðÜò mE·;»+B œé×Pé•®~„m8[“¿~}+Ìÿ¹,nüÚ|o'5Ùe]M4ZDlnj¬+ÅA¢2BEˆ™Ê þK$ÿ.V›A~’ÂÂJ›Ø@ÆfR3ÿ÷© $½\ÄŒ"PŽ-LÏD˽ªÕX‰kmšÂpFN¶µ"ûÿúh•2ÑöB±9f)Ч-á@•3…ÿûRÄé‚ ý±  ‰>Ɉ6`ô&ù6wzÈÿþaþ›á£Ü©åÿý#Žàˆöš!ÐûÃ#ÏGA¿"†^væ„Èz±›íbçµÁ‘Ô…øBŒW–e™üÏ.ysÏÿý©}b¥:’*N¶¼½¢ jvB@ `>¹ÒC‚!Öö£m³$€r $bÑòSFdÿú°4kµoGƒfGI´wØ“œîÒßgÌVvt–k6føG¸¿»–¹V›Ÿ¯ÿÿãÿþþ¢{îQ*¦á™ ]ô`ö<Ó„IpàAjÿûRÄæ‚ u lÑ«¶ ´¦ø!ž’ÿš$V|MÒQƈzÃüG¬¢}ÏÍÄ]cSµœ®n¥Þñ›½Žåoëo5Vöî÷) V6%fî»»¯®»ïê?ÿÿ¿^úÖùîï©…B6H‘Åc,<*,&'W<4<=<9Žm³@€–yz×áF¼F '•ÿ¹rgxH­%ÖŸv›g>ïcdãC­¢ö›þ¤¸KŽFÞÕ C;‰†ŽÄRüEñõ}õÿýŸýkäw–hЬ#_\¿áØm%w’Ë#‹UCÐyÝ~õ·¥<ˆ®W>Éò?…ä¿ÌþÿÿAòÑýY]í@â/¾…W^c…c…°‡´#‚¸°©ŽI$ÿÿ‹Ù78»˜'g%+sËÿ?N«…'\®YU¨Êÿs2‡MÊRR2rƒ ÎÄïÁnšÂj-SdT{;f¿ÿ×ýúyY…OQä:8©ˆè àAéŒ&¨ ÿûRÄê é±  ‰7Ɉ¶¡4!šøÁ›’$HÿúžBÔʈEF²«ŸukéÝȳÌ̽P3Å”†mk„E-My–L†="DµÒ)xÒ¡¢VsÞ™þ_ÿÿÿÿþ\¶«Òa¸ë4§I´( 3‚•¨AɳÓu Y$ÿ3/þþs¢Ã«6Àý¿ÿìøøëzÆG¯Úfâ91H;†æÔ6;]æOW´ÉPÖÔ[ý°:œµ·ÿÿÿ~¶{l—¼3”ÈÙÄ•JTG@eí ›xÿûRÄç ! qQ•6 ´!³ ÿþnˆk2H;`Ro¾µi÷ûŸ’22¹µ’&‡Lıâ볯ÿÖá©É͌ؗv|É ¡FžäíuŽˆfo?¶üß•|©1&”`»p¨4ª0TšUˆ‹ Ãdg$Äiž £¥‚ïì@ÿõ#u†„É€ÛÆeS•}çþ‚ŽZ£HSª53ÐŒÑzlJBÅÏØŸé¥"–£-”ŠÂÈT¾‡±|Ÿ?Ëÿÿ™ÒñÞ~c­9›™OPîYÿûRÄê ͵ @ŒµÑ|¶¡¨!›r!DâÈY"áÆ§N -¶4€‘¡¸3ʱ¾°á³‘!µþå‘íÕ–g‰hú %[ÜÖš@kJMè²YLŠËÒµè ­=X «ÅÿÑ®o¬]!ˆ"h*ymë@ÿÿ_0Ð@ÅÀHß«ÃËáç¹µ:®Fm•6WȈêv¼3¥Ýã‘u¡’V:ͪ£â\Œ”„« Û°"ÿü¿þªwìÏ÷Z{Xµ0âmVÙ—e- ªãÖ‘¯ÿûRÄé ±©@ŒUÙ¨6 ´!¦ø²× íÿÿè‘¢ž€`шŒÚ7ù÷qFe>¤,PÚEØ'ÓZiNcu™‘Ò{‰Š• ՈψXÇ/ÿ§?áß§ùGé39i¶å ¯:ÓHBĸ3ú´¸®ÿûRÄé€5µÔj¯¬÷Ðx;—`)–Ií¶´S= bmt ÿì²SoÍÐÄ1Œ&Ì å®«û;†¨¡ÌK©TG;°šºNc•¯^i\MN¨Ô{>»;\‡+9Í7*1]Ë»]«jߪ¦¬Û“Þ“µj¯»}C¤áŠ*8ÓÐé´fïPH®<,Qjv ä€ÿÿÐéKRîëžmÑmÿíWVIeõyL4>ÖùÉÌyî»þ[Õ¼U».0‰fæsÊeS׿â;}¥¶=xÞÿûRÄÁNµ\‰¶ ¨³Øíò]ݾ|l[S·5žÝšìíÛä>p:îRñ4åXúö‰ðøàFKˆj#5ðªrmô@ÿÿ³*ªW´+2]§H•Û=?ç6cåY÷]Õy:ºtõéîgç÷+™—‘mèçæˆó)·•ž_ÿü¥íý¿Í|¤õi¨ûmÒ·ÅFÜéVh´)WA¢¤Ð Î:`!wñÿÿëþgœ±ÝŠÁ¨fT‘“ì¿FãO6d!†U¨6ÊHÂ2b&’‘ÿûRĵ‚ ± ‰—ÉĶ (#3Ø#1"œHmLˆ‘BCJ0`­'¿¯È×ÿn J–ƪk‘Å:“µ«Y´GÃèÙ"D@„ˆëC„b ÊÀÕ’Ú#i?9rŠâ² "E¥MìÿþM§nÊÌGV¡ ²Q÷a0| E³½ꛕÊc‘]"ˆÊÕç ³Í «‘„ȾZØ1žÈ&4X ĉ“½¿ò?ÿ,ÿò¸CÊ=ê/ݤŒ!túé&Â3eɉ6ÛÅb¡¨Ù z.HÒ$árìÂÈpéImxv?ÿ“"dòÿ4ýTxìH”@0A¦cæg.Æ3¦ƒØƒ]V©*³¨Åk£‰ÿÿÿµ>½,§g" ŽC•˜¡ðX¢à‰\XqG€%»ÿûRÄï‚ …% q1À¶`(!§hæH#ï ¶[k1kŸåÞB(\}v ,¥ŽD<¦zí.ó(w 4ûÔul:;%¹é¦7šKiGîbf›þïïÿÖ5î™&žªæ²¨\ô¥ì–;d"Ø:"ƒð†ËClÚ Kc$ÿüFHÂo¥p¢ÐS¾k§*§æLŠn¡M.,2(ÂÿÏc?)yL½ölñ*ÌÜ“µOüŠ\š"qßÿÿÕ}] ¤¨eg2HèUP®Å+(<å0ÿûRÄï %± @ ¯Ù6 ´§h Æ äÿÿîì÷³ô9W—R÷\ÿùù?xLC°a‘‰ÁžTô.×uœ¡ÍTÞKµ¥õOÔÂRá¹ LµÊ"Íùÿÿ¯ìýUVt!\ÇIH",*9ÊGs©cƒÑ6µn]ã ÿÿ‘ìˆG&JdÖRrtÿ/çiÝöéÒM“ÿ4º;bº’™Ã”½e $8!ŽSÉÞŸMK¹ö73ú_ÿúrœ73|!¡MáºxäålÅdSl©ï6BCÿûRÄê‚ E¯ @ ±Ù¶ ô¢8À(²‰µ A.Ò4ÀX~Zƒñ*Že -]»ÒËþÙžê¬Ó´{Œ^bˆÔ‚”„™â Xþ»9ë¡)a’x®X²?ÿÿ°©§ˆ\™A¶€•7 ÿ3Ÿs—Ãâã0§!ÖGÙÊGTeã/_^2›7}+Y|¤,ëñS<êò]lj’8IùAf9¡eˆQ{.Ñ•H‘£‡0’I±r1f«5W¶¾¾r†?-ÛóUÝÈNðþxÎKp¦hmcR¸®ÿûRÄé‚K¡µ ŒµÑe¶a¨–ºä0½¾nŽ…®I`¹<Õ*…¤Æ»nb2™G!2 AzG Àbß«@ÿÿ§õ³©ŽÅ¹‡TÂ5¿þ_ »\íÌ̃tL"îdá T´F^Nîi‘"hìµ ÉÍæäd¬W¶÷ìµÿÔýùÿÿ™WÛ„¶-ÿîvõ™fVöƒØåtT¸0p6?f3‡˜ƒ *r_´ ÿü]ØØxšCªÍoî—œ®åó½Ø#܃¦¦<èÌû]ØêJÚ™ ÿûRÄì ­± 7Á3£¢ôÒ}Õ®ö‘Hèw)A;8ìŒmiÿUþëûUµÉu_ã a ͌ؓ Ë$LÌ€ƒ®ª#Aa öÚ€ÿþt=ØÇ-ºÂ5é¬L½—¹:¡‚ËáæL¬‹álÈ3¨“?´Mâ÷½Åº=,àœb·®^þ¿ÂÎùI¿¸Úšà·Öi^fØPg:Åx0lÝH±uUT0¯€Z³8F1rï« ÿÿ²»+#Á²C×9‡Vn}ÿûRÄð‚©²øÀ¥ý —¶`ô!§h«ÿÇ6d†ÑnEI‰vädòsÍârÝY Ý:FvÆÂÚHèÔ´t™¹«w²ô½¼þp¿ûþ^xä’ÔÕ¶£j:çG™žÞÁ™E #,@¼" IÇœ–´ÿΧþÈ•4Τ„ óØðe¹ÀïŒdì3[ÞòcTPøô—J ÇAàä0Tph ÝBƒ »Æ,†…Cÿÿÿÿm”¶Ö«²<„qcµDÅUq nm²@ÿÿ·ß¾’+2Hqõ»ÿûRÄÔ‚ ŵ ‰7Á·¶ h¿hžÄ´…öy™åœÍíê PNªé K£Ï¼"BFrÖÄ©°T¤P«m±}¾¿yÿóØüÊ÷+ÊtÌqé\å«KIz¢vÆR±eØ™nÄŠµ¡‰·þ"@ÿþÿÓ¡õJbµMu]?ôsŽOÔÙŽgÿ Û²Ôž‘ÉS#"I)Þ¤Yk•)ÿ*œ#“ÿÿŸóÿÿ?ÉsÖ¦{3¡è> B!P`D`i3©E m´m€ôþªG RÿûRÄÈ‚ íµ¡ ;Af6b(‹*„ÝgÄ»U¹çž¦ì h—+MPƒ’¢nŸÑÉ›•Ê‹*†äy+¨ÆqÄÃ3£˜ƒˆñU÷Šÿÿÿ`ÅÞ‚hã`%±¢@óŽsS*õ$š9¦ÿ+ öwC¸êÄ ígŸ¼¤%¹'•i/*äLõyˆm‡ê\õÿÿÿÿÊnì­#ø³Ï³ÎrE”ÁΕ[dioþ¨s έc¡}¿î®JÌ…C,ÌW*¹"º1L0A[k“ºÿûRÄÆ ­µ¡ ;Al¶!t!›áæ[©ÒåT,º®ÉS«ìD7ÿÿÿÿí¿Š®³Z$ÊKÈÅ* S %» `ã¥:1)`0ˆ2þU3„>æe|Ȇ3;ùóÊ‘u T#¤=" ¤!{©näimcüñxŒMÿÿÖá°ÀXÕì  Œ’Ý´iK“™2`ZsB î†H®“î¨fF˜ŠÌ3ÈâlK¶³ó›˜yºÿôŠÝ2SŽ£„gm‚ OY\žÿÿí§r˜HzhkãÀÿûRÄ - k0¶"4ŠznKcDÿÿ›Ø¬TÕ#x|‡…--$/ri¬„näY3¶í ÚŒT[¬2œÌ]Šÿ,j ÕQèäHO®‡üR¿ï2ŽGˆŠgz’šð" §¯¨;ô’ÿò^ªäWY°Œýæ2IQ¤3‹–Ķ:ž©œ°‘Œ6’üÿûRÄÒ‚ Q­ ­Ù##´êTÒì„´V’ÿÿöo¹ÄìL—3¿ÿùk5ŠG—µŽ… 'ƒ(j¹Ct…[,JJÙ¬Æ aÒa‰ù¢º9übŸÿÿÿÿîŒçtT3f!dÕŠ@¥¸½ªn[ªÿÿ¢UQÕK££•„#T‰£"WÛMØÌwúªßævÞOUÏmE¸íÒ!®Ñö3‡b‹ÝœmS<òIL«üÿÏçû·¹Ököjyd'Ñ|e%1 ‚I%l‘‡É Ì•0ÿûRÄã‚ É a‘d4áô–»F Púj$ÿæ‰W¬ïáEBÎ}’û³ßé9 ^ÝÈzØŽ\S÷\Aë¼½­¬÷jã=R&*¦¹½»í<ÜÓ_t×vÝÿÿñýÝOQ§êî\w]”œš)!éŒ0xÓØD 0œm’ÿä@ÿÿ¦vçæœÃœåµJRrôüýk±¥ygr²$Žè©U;™tnÛÞ!Ls8”ZµŠg8D2Uhö½ÿíÞÑóÃÙú]¼9rÈè”®È<ÿûRÄíƒ Aµ ;A<µ"L!‹cÐ#sã ‰Á%´€ÿþ_øDŒ)£æÿ÷3‡n^“y bBîBQÊ ]œé›R#ˆ>ÃÂB^9K2I8eCõÿÿÿéßóْФaˆ¦B¹'@ÆÚnÝò ÿÿ‘÷˜@2„nF=Ìé¬áÞ~];D:Ùç’w’Û>fJFrÈF³HýÈùÓ½À¨ 02‡§ÅMŸ¥}»Òÿÿüÿ»öþçVö[æªY$ân›rGQ½¡³¥Hò*&ȬÿûRÄî‚ E³¡ >ÉŠ6a4!øà¨œä$K¿ì”ÿúþ5"ÌLGl–Ü%yf‡JæÇœµÖú—![ücpnŠy$`묪Ô¦FD:3eù­/ùËÌ¿þeÍÿûW¾f¿KdäiŠdK“ £Én ¥hóÂÏ ]UîA$ÿüÀܲÛ@…l;:ÿÿÿªjNæâj!’—M6†ªŒb—ÃjëJ}RWnL‰‹$1 `ÄiÖÑãM¿mÿí¯ù[T*ŽFW!ŽQQu+)„ÿûRÄæ í³ ¡×Á95¢´‹›Ü£Ž¬QA1vÌ€ÿÿB’ߨÔÄWt.ßþi!_ž•a¥€¤2¥ðП/µoÇÐÏø(ûS þj_•ág še¥3[_úyùÎ7_Ï'âÔÓzv3q/åÊ5?‹SÅaÇÕH`Æ*–]¬m1ߨ/³ÚØÄbD8wB/??kC$õ2å¦ÏÖ<Ô§Ï"'Z Ñf QV T†)\D™AwAÕÇ:2ÿú¶^蔬‰0 ТëÿûRÄí á± 7É„¶¡4›hPÿÿ¶Ÿ™2x$žöþÌ¿¡osçòÚTû”'žG±n‡>̲$P б’Ãðɲ‰*¿÷l³;öåþ\ÿ¼«¥ciãÇ“9ÐÏÜÚQ±J€6Œ@ˆ”É8Q¡9*Ü+ €B ÈmŒ?üü%°¶Ôpð’Åx€ÐŒ³0 ðÑdbÒ›UÅÉÖÉcÕ>ij|mŸã?ÏÙÿßÿþÿmÏ^Öeµ§†5.ð-F…¡f L‰q0‘D` ÿûRÄæ‚ Á³ @ŒµÑx¶ ô!§  €ð·ÿÙ .g ØDP™¼BýÓþúí5\1äsJíúN÷bôO¯9¾høn4hU\ÀÕÌç,ÏÿÿÿµÐ6BI· }^¢uÿÿû·Ö­÷¼z|{ïýÿÿãÖøÖ>),Ÿë??ëêڟח½…xõÅâÀ´ym¤ f¤fÄI[£×îkbÚÅİpå¦×I¡Å—P^Çžß1-<´ÏÕé÷¬V.·_]¿½·=b÷ªèN0Ù:©WÿûRÄæ 1 l‘‡6`¨!§h¨L)ÜTò^uË• Èm‹ ‡4Ž_ODEáÈ”Ÿ Àãp0N%@ P/¡& ¼žœ-³€ô hÁø0aÀÒ$h?öÀÓ‰lšP3ï´9BÙ‡F#¯ÿ `À…BÙ‡üJ_ÿ…°¡:…͉¥ƒÿâzèbq6Š0j …P|ÿÿÿŠÔa‰@VÂØ(1r‹x²hd?ÿÿÿ8ÌŒ˜æ!ÀEÇhã&‘/’$^`(ÿûRÄê ùµ ÓÁ"ä´Ž €RÚ  +Æb€˜ê«UU(—fc¡@[URŒÅ³1ꧪ©lÅÆcÕOª¥Æ^36ªÞª¼eã3VõU-¿`›V=UWŠ\fcãP7B‚žˆ(."¡ à ½QПEÂȈÿó-Iÿÿøk -ͪRˆ#ZPÓ±s…ˆ Ї!δ.)TD± ·VgsW4Ó)Ýrºã“ïÿ²ÿÿ^Ÿÿÿþ¯K"ð|¨Ï¹Tè¾Nµ¥ª‚ƒbÿûRÄøå°ýT€ j³/7)@fØí8䦱¦ug(äàz‘l9‰>w© ¼¾Z=û?w{mž×•Ë‚æ]›>f³ž9WcôNJæç†g ¤†‰‹LÈ#éhG3³ôô 6ÿÿôTS³ÿÿÿõú¬U§\_P²ó÷‹¤åV…ìú RLë 'Vbž«D©žv’åæjDYï c;»»6<çýé\{Êœµ¶²Ëm1 ¨ô¤ØxíaXCcN”üª)=-ÂÄ!!ÂAÿûRĽ ™/]\1€ð£¤ô¢.èP¸Z›•?ÿ¯ÿËÿÿÿÿÀ‘P@˜“vøØ^¾ÇúÙÍ.7[íÌ|Å;iÖÈY‰7I æR~IÜiÏExùY‹ÖW–ï¿<üyšWcÈ×/‚=¢gSú†T–IgO—ŠÆá\–ÁÍHıRÁü} òÿ—ÿÿÿÿÿÿ÷òÏ ³ÈœÎ1ZÈòòÀaèB;z„W5q«ž3Q1#VF¤Uß¹ó2ɺc\®o3kå•K#Šëm§‹×,2oŽÿûRÄʃN´þžÁ¹6ŸÈ#3ØHЪ©)ŠDB0=xºd¶5ÿ;º®žê×UAÝl¬}2­ì…; vÈ‚”)ÎWgs#2«#¯_uKõ¯<•UWœé4 %J£É#cÛÍšÔ ±Ö´Š“6i[ÿÿý‡Ì¿Í+líùKRP¹2¼v8Èp¶##”¯¹yßχó†G~Ø]úV1Ý…lçµÛE™˜y^Y`e r‚L Ž ``¦*ÙüŽÛÆõý£º’XêM‰ÿûRĹM¯ ™žÉz6 ³Ø!M?rÞd³lŸÿÿÿªYeF}V&ÃH·ªÑT Ô xÈ8`¤èM’ºšë{Ñ ›ˆÎÎŽU©Xw»²9'2\´Úµ]ç÷{s²gT¼ÉmIû·=š©)’Nñw]¢2C9˜ ΄[0Ðtí <­™îhsZ3iÈ4dºd5ÉìÆŠAfFj¯ºáµä¿ÿ—wÏñ®f¯ø£öâvZ¡G zr‰£‰‚ ‚+P„2ÿÿÿþW¿ÿÿ,¨ÿûRijƒÉAµ =,¶ €§ ÝÝ%–¸æƒr¨Q'»‚ð;²¢Ö([\ÄÖ22U¤„Áh¶¢ ¼Q ,—þþ“ÿôŽQ·Ö”ž‚yGŽÄp¼ ÐŒ»4qÄZ]§ŒƒÈž&VÕ@”ÿÿÿÿý2¤§ÄBã^íǯm¨©Z¼Ò]dJs1 \î•SÃÅuqÂNµß_ýSW[óñE­jÐbõeÙ…1Fœ#˜äƒpà‡Ç‹Š”5Bb€Üx³„`áÿÿÏÿÿÿÿûRÄÆƒ ¯` ¼‰%6`Ä' ÿÿÿúà 6n³…‚”ôuÕYÜ`%+ lR˜WBXîg6@n)ÐF…ådˆù|û×7×èeùÞû壷ó õ+ †°(Zù6:• d1ܾb´ñ20]JèqU?ÿÿ‡þsâI[Ì®_YcBC͈%N9†u¶ :l$I0áÝHÔ–7=µ†¹ç÷{‘{ããÉl_v…=>qya°?ò¶g® Öçï'„LÕ®*ej^¬N8‰þ¿?õÿÿÿÿÿ¯…e%üÿûPÄ߃Gyµ ÝŽ6 § »3îkL3©¯®¡köc–²™ËÛA ƒµ40>“#Ϻ§ÞóÙÉVº&+¾Ëvlï™2ÖÒ­KiV-C¢h"T_3=¹héYÙñÙ=Ÿ”;¥C¶Ç–× Ç2Ðì°H?ÿÿ—ÿ÷×ÿÿødS”/Û?¸ÉAšŠÆt%Ûs,¦G>ÖðËIü6$’—˜:¶`¯+œmºmÜÏâw[?~ÿvZÆoø¾ò«i£qdh=yÁ‰xòñÝBÙÈ•K ;ÿûRÄí µ@Áf¶ @³Ùÿÿ÷"Í»ý½2py¨ê„lQÈ-Á è@ ¡‰1†S.ÜÝV¤¹÷ÊRجáî͔ߴßâØ¨ÓôC¼+¾O×¾˜Èÿœn„á![²V8N=ËÕÿêËùOÿÿÿÿÉžÉLbS߷囹óX66-¥t;Z¥Ú2;{ãð¥§Øê…¥äÃ1zõ%¦Åz+{žV¿ßß<{õ“/ýlçÚÓ,Ùzf¹’màT¡ó–Š÷1Œ&Á:ä!Á¶@¹}æcð'ÿÿÿûRÄïƒK=µ ûA—¶À3Ùß?ÿÿÿÿâÊ5ê3–]+œß;ŽßIv$XLèb"ÅâÆ(fïÎ WÄl³OsïsòÌû•™·uû£Ë+M/gh{ÚÞt ,X¹Xö˜„…Uç#JÑüäñgªˆ•ÿÿÿß®¤E²2NfPkcì ÌVDj¹A¬Š®I Vs÷·Tú¢õ'wúÛÕWæ·(ŸQŒ†é¤ü¤–Pãfé¹Ôi&ì6iQHUgš†%ÿÿÿ/ùoëÿüÏ‚broS|æÿûRÄíƒLuµ ™žÁA¶`@³ þ[2Þ›5[â^SŸÜïŽneiaE®ÐÓ’)¢q³žù±¯)Þ¾³7vݾçן•ü¦ïK7–=lF²V¢>„Ìt8-ÄÛæ|á4I?Âr(î¨&e±5ˆ?ÿÿÿòOÿÿÿúÌÓIçÞžHQš£;Ù6‰oÐ([‹@hî„¿aHúûŸþô¼ôþ瞦ÃuŠJ°èœx˜ÜX*LˆŠ2|(MÞT¦ñ£dF×Ïÿûþ]úrßü¹áÿûRÄñƒLñ¶þ™žÁj¶ H³Øs:]uÌ ³q#¤!m"‡xhø!d±•„+{n XÌ2‹úÞym2ïÎUú,_Í-÷r¼£ÃÛ¼¹á&¨‡‚|gä´vTT£7%+$L?ü¯öÿ)äk3òº)¦†Ä2VÕaÍO6'2 T©È ¢Íe ڜȈ©å‘™éͳôžƒéUÕ÷졦]aa Qr$®ÿ)!§N[¡™0KÄÑ,é×ý…@?ÿÿþ\ûòÿÿç¹âd±ÿûRÄî ³` wÁ«¶`3Ù¦ÙÌW“ܹÞV=ULí¬q±{­¼ÊÂE«6¹÷`éÙÉŠ®·mzv‡”Ýÿìí¸ïÿøû·ÊB²ðPÇ`u6MÏÍ‹´€¾òbê`•Ìó(46ˆáyû€@ÿÿÿé’ÿÿÿÿ)Ïc­%üá­¦ÑÖ›5[cèb [Š5Š…³¹°Âs"Ê‹·h¤wç2ZLYÊÎ'{³zf¦–9k·k´âÅ+×.M$C'‰Q’Ã’‚S6ÿÿÿÿûRÄîK1µ >Áq¶`³i%ÿÿÿÿŸ‡±T¼ÊÛè…ÓHœ·O ò•W¾íže›!›öϛۻšWǰ}>™ã‡hLÜÚ°®}ò¹Èl{ÉÃ&'â)UA$¸ ­hž#8ê2þw¯òÿÿÿÿýú¦~-ûwo2Åã»<Ôý Mñ‰Þ€R4r6-j=¥I;0–\ï:8e¬S#‡YóvÞšíÝšuœI¹¤lk½jcî˜T ´r¯ÿûRÄñ · ›Q¤¶ 3Ø/'[‡Ë¤qIJÚÙÎ%aÔHÏ ›œPNPeCÿÿÿÓ«oÚ¨ÉSR§«’¤ „c94D[Œ…”s Œ-Té2$ZȤ2ž:8-J&»¡ = ÿ¼ß[ae¨Ö$;d˜Áw­''/Ü\—FÍ„ëWÔôEŠéW‘uõýÿ¿ÿ¿ÿûÿó»ÝòÊìù’ÌïMº×šO{Ì"Ú=ò1"Žw‚³98°Ï“‡•x˜ÀyƒÚ“NË‚8ûßÙO•þÞ­³ê\ÿûRÄîL³@ “6ŸÀ3Ø<[.1^Ñ‹Óoc«…6Ë$UæFƒñ93ƒs2!!VuÙ‚ýÍêîv2•4Õ …ÿßþ¿óö_ÿÿei3šo/KÔòmä|ÒVEC `ã:†¨Á€éŠtQ“Á`íµ† ×JbÇ3e¿rüׄáil›SÜf߬¢qRF*>4õå$¸´ùx8Ýk‚þ—V͇áüîªX3ÿÿÿÿÈÿÿÿYÍÁYÏË7½jk+§iéJÙ‰f£!O¦ØgMfÿûRÄéNa´ü ™ýz¶ 2úl*šÐy›=%Åk_ŸóÏO½³ç§ùy²Euîõfg'-"‘£‚¢)’Sˆ“$¤€*'3.@ £n_ÿÿüÿÿÿÿÿø¶9"6m9Ü¿¿»UöÉÔ¶Œ£{ºFZ›58Užë,ÙGr©Ö±ÆÇ ¦EðÛîjÛsáÙßüylýOV­-³>Çâ}29eqâx]~3ÓÂàÉóÔ@Ù³ó¼7 MOŽß­æy%6;TÈðsx)TÇCw3Cr¡ñ«F@F'XòXdý½ÏöùŸzG³‘= (V§äˆˆÃV;Ø•O´ãÜö§8YûÇ»}—ŠPÓlé*$D‘itiô¤NÀEÙ>©–¢ÚsE€Ñ2±l²ÑS"¿÷c|Èù9Ñš"ôÔ! º‹Ìe|gÿÿû­µ²d› ™ÿ÷òÞ_ÿÿÿÿÿûRÄуLíµ ™>Á•6ŸÀ3ØþQŠå@= Œ‚ÐŽÒ¤†äQN`Ôá… aŒ4*DAqbD¨î†uØÜ¤ªÒýË;žgø»ìçU¦¡N¼ôtY”Ž àúYˆ¬2xP&ˆë‡Àhpˆ±°ÕBb@ÿÿÿúÿ¯ÿÿýÖ·‡{eÌò´4½*TYÅ/Œ9QœNH$èÊèFF)ÚùgÈÞ_Ÿùeé[<ùWõ,ÇÄPª(Ê[QJ§ ²¡Aâ1 Y‚áòä«.GÿûRÄÉ ýµ@ =D¶ D§ @ÿû¦¦i7TUeé+*è ♵™WEbC#¢è‡w;*è‡T-“f±ý’Ó·[·C­^ýH³Pô©;S…O.~àé«^qpú´Äø­&™ª?ÿúÿÿÿÿÿú_Và  ÎY=É!f·´Ü³2‘h™ÓàvLΙ ¢Árõ G½¶—å~Þþ]•˜o{V—÷VViÃOĽòS&ÑÃçM 0š‘Õ˜žŽ„°|˜$$Wü¿þ]ÿÙßÿûRÄÖƒ€í`|¥6_À³Ø_ÿÊi]rß"hÀ¬™ÕIF260ð…bŒÅž;d(ð˜ÊŠ–†î‚ Âh†§: ѽ=<íàæá¦çMB $yJÜ^˨D}±ñÁ* `N’,±R¤Bà«.©jp4@ÿÿÿÿ$T3¥ÿÿ2žgŸd9:Åw2˜¢,vêâ3¹H6zºB“̲:Öd¦{™.¬r™Âþgçùýÿ^§I.Ó˜ß ZÓu”ž°0Žkœ`= ‘Aà™²Ä 8ÿûRÄéƒ =³@>ÉQ6 ˆ.øÊVª/ÿÿÞ×t’§fÈFßvaÑUšb‘œ¡Îs¹Z8È{ˆWKYœæR˜÷%•Hµþ¹“"}W5Z„#ò,´¢°YF9èš Â ɤ  I¢Öð@ÿÿÿëŒkÿÿÿþ…LQZf|óV3qBI{$.AHm‚" Ètú¦ÁÎïi=¶i”™å¿ ÎYÕJo•Ò­²å_ HẽèÈËœ²¤2€˜•ê%”PƒÿûRÄðKÙ¯ ž6`§¡¿ÿÿÿÞoÿÿþ”ÕŒ#B‘&“Å‘Ur³0Ζ͓4à  Ø–Þ… ;¸u€æÖ®ä¤E•ù¬ß.ã™ÚýDê '( ë“v ¿4†Ø@â£ÄC 28*`ÚõP4ÿÿÿúø&‡_ÿþh9úÅ6¦=’~ð[lNÎBL;¡’º´®ÖÌnç^1î)^ßÊ”|¯õüª×¯©deKU½ºQ5Q¤sŸE‡â >Éb=fÿûRÄêƒK™µ`=i6 H&ù- FàoÿÿÿúØyOÿþ¥çJdJœ»s+xLgšºî­–h·uŒÖÄO7DJi•8e’U¶Nùó$)ýÃÿ8j©Iëî("ý ÚeØØ:²4FUQ’ƒÅhR©` (EÀ ¿ÿÿøàg$%hpЍ˜È‚‘3ü«sêâ®´*NµýÓ§¦½«ÝßÚ‘VÊæë¾æýÔøê¦º‰·½¬)¦©tjnŠ+’‰’l»ÉÇI¸Øˆì)$S@K4’ÿûRÄíL!µ@>Áy¶`H§Ø`6ià @Ñÿÿÿ™‚¡9d9ÿÿö"žLÙl¯ ge³Ê)¦yžˆ­ ν'Js>9fy“òbùÈIåþß2÷óþ©S£QšÕØy{1p-o’5h‰±fÈ [R—%EU 1?ò>ÿç2&˘Fϯëõ—1r8=Uèdºn·Ä˺[ÇQ-Gܽíü,÷íõ3z4= =õ¥],m¥–(*4dP€H¢ÅàX$ÿûRÄëL=±`= j¶ Œ§ r;>€Z-€tgXU /ÿü6w„y=ðr eLœŸ®×m2òÊè ûk»ëÖG.0ÿÿýÕ­)­ã² ÿç—ør Ù‘?þSìtßp8¡†œ×FhçI#!‘¯æÒèGi%š†žšàÒpéAuDK’.ÇýEÑæ¦Ÿ+6/ÝûO>÷½sfcöv¸ôÀ¡T%ˆØFC9˜d°?%šŽJ¥Ãáܼ"ÀÈ€œ}Z ™ÈÿûRÄê‚ 1µ@uAo6 ¨§¡ÿÿ-ÿå¯T‘íQLeŸÛ32¼ÉO55=Ñ*G¯ Jd¢ê]Õã*ly‚ÆØµhÙ¶á¦w¸úî4]áÅÍ=PqNÛˆ¢èÇ–‚¡8\÷U8 `Ñ‚,p°:<'A‘rêF€Õÿú$´z²³4å™»$’î¢Ä¹ÝŽÓQ•ÖsŽus9ÙÖWRP´ÔǪsÉäôïg¾¼wÃݶS]$æÞZ쯨MÌ„6"F&˜¬I8GÿûRÄé‚ éµ@@ø"£´Ž*@?ÿþ?øÒjKœ¿ÿòÞäsóûæàé¶S‹&+^Yr›T'j`¤ë™ÌÅ,Ä>–OYyja¨k4aU[2ÑÛø,CFåÿõ“–Ä]$4-ê¬ÝÕ¬uvÎÍ^‰Ó]éFÕÕ슟QCêb&¸¹n#»Ÿþ¢zÿïÓî-^Ûqz·TÒÒ† Š–@˜­ËÄáTFœAÿûRÄç‚ ¯` 7Á‰6 \§Ø€p˜Wÿÿÿ’£øe¿ÿù²˜,MBÛ?¦Âw”èÄèFZü ‘hš®u×zY¥™‘ÄV–ïÏœËÊ~ÿ×ÇÆÎf—·­‰&¸$‚>ö wLiÈp¤xPœ =tF@ÿÿÿýg²0Eÿêdjó(Ô¶„Å·3?f7b%*Y˜(Ùòá-öÎÍd4ÔvÞ>O•BÿþéùåÓiþÍòw}­­±b[nâô7ÕÍPÍÌP™Úë¸\ùL€I>‹äÿûRÄé‚K¥µ`=w¶ \³¡€ÿÿÿÿÐËæesÿü¡î}7”_cÏì+]W#b=6yÞ#í$d‡®Ê%•vüw„M™—ó™yBË>O2’ìÇÒ“T¬äÊ>CˆÄ&@¸mEÑÆZ6L¨„¹*2YYÿÿëûÓ©^KÿÅS00(Í!©s3«Ã¬ƒš»±qºh‘™@µv¨­y^[™ªz¶ç'ê^sü¿¹_ÛðÙÇÝ¢§EmM =é¡s±Ú8UDHà’‡©‘âºÿûRÄêKÙ³@A\6`è›ØÑ_ÿþß匌£‘×ÿýã‘Ýä"33¨¦#æžê†ÁÝôÖw ê¦3!¬‚ìt]Ë»4¢œŽ÷e»[¦oi>ý­ÛKwÞ¤ÍõPí4QI"·'Ù&.‰¦ô‰€Ø#t Nì5‘ƒ–†F"ÃÌ¿ÿ+jæ¢ËÉœ¸gißòÁ¶Äe\¯¡lHŽ€ANj(b¡CC_ÿÿJ—Þ$[Í$£ò¾µÿqÞ3Öÿþ.‘¡Ýýûé=•K×ú–¤³¡ÿûRÄí ·`{¶ Œ§ —(fÞŸ„Ѷúe§YçQ–ËÍó„O¨!¥•Ö屜:­ìv"›JËw­ª>«ýžgñ¹gõך¶ž×Ü9dâ*–RòÁhš°èœt8ˆÈ{„²ŠëϯÃøâ%²‡ÕêþQZHÿÿKóK«] g+ª‘¿ùnE¨d+#¤“(g3þ‘qìㆆZ“*T[Ð0i¬†´ÈÙçÿÿÿÿé«{$Œr1 9 Ä$)±œ#”D@ÿÿ~Ô¨„ŠÿûRÄëK½µ@>Áw¶ ô'0!0´ßÿþÉ/ ³6‚PŠ‘Þ¼T$(ŒÄòm˜äÐGÉ?†¦ÈpáÆ,M7h ÿÿŸ?„Ù½y³±}qÕõœ¥_`¶µ´teå¥Ô·÷ T$\Z¸æU ]Ǫ [ª ÿÿÿ&NÄìc`ÎfGN§ûõX8žþå—³\ÊÂrŽ¡¨ƒ`w*¹àòb3Ã,΢¶;Ý „­3Bü¿å¿ÿùFê†ùÆa™I ¬‹F¾ž@™<ÕŠÿûRÄë¸ë# rÑö6_¤³¡°Bi ·ý@‚|ÙŽdą̈ß÷D0 "ÈQ[ Ñ’3Í.![;¡šB#~¼+²„ ÁÝLS”þV|áÿþ~fež½-NyTCbꨰ%p¦Â`QëAFU]s@ÿÿÿã1%q¦„ïÿùrGެ#’+Ê;ŸXdxÙã y~Ï-ÌCV.å]˜Œá™›Ò‰!ÿå üÿï~SÊÊú©IMÄsrs›–¯lÊ)ŠÆ-ÿûRÄë ŸA [Ž6 ¨³ØÚʧ’’Âep .ÿDÿþcz: 8gˆCA{)¤3r \” ‡sÔíU=é5U¨‰E»>Z†4LçS¨ó1X¬ˆÖe¾ÿö×ÖOè—$­)aU§À¥+(`ä4°­€\|Ê ^*Dÿÿýö,ªÁB–ßÿ}¨ŽjúæG9/iOz2(ÜŒídEDeKVȦEFv;++XÉdì÷ÍìÛµ¯O׌¾GçŠyͨœŽŠO&zα Æ`<ÿûRÄî‚ qµ ;A^¶!tŽyUd(UÄD(HÛÐ>Y$ V]L®0YèUÿìG,î—R)ÑŒTÆS9Œ ‰VôJ¡–E«îY³;¡¨C:Óÿÿÿþ§YTæYVêª[˜Á”8àÅÏ>ÝPÑíTˆsÉcÔÅÖúôC¦n–b4tµ5 ò1ÛëÅdzB¹µÉ{$)»‰ç“©äÕãÒ­/®~½ùÿªùê*yjZ²ÔbŒŒ¦;*XûQ œAQGI?’`€ÿûRÄê‚ ™µ ;Arµát§á$€ 8XÝÿÌ õTy“d+2oÿVT[1D5FPêd5ïöfqd˜×Ѳ{ÌK3¬Ç;!¬¥UsÒŽÍý?ÿú»O’dª2½%(Ðà Ä+ââãEað ¸õ’ÛliÉár‹ºA«ǹÂç÷ïîsOÕÍÏ VÚµ%lÙ™ŒÑ霛LõܧЧšUOUB öá %ƒŸÿÿ~±×ŽkÅ€à-$°ÿÿögÍó*…+têÕNÌÝ6ÿûRÄç‚ µ ‰7ÁQ¶"(й§žï+º²Å\{iH¶A²k䟑gËÞ»—¼6éÇO8¼åUow bµWùXËfØh¹ÿ6ó¶yþ?ù÷½²ù‡‘YlO¸Ñm,éšØ!( 5xJj!ŠM„·‚B™0¶±xåݳ@ÿý?òÛ;Ù¹Ù.ºû诺›¹îwÛ3+R‰ó˜®Õ|ã]ԌԻ)œ¥ ‹Þë‘Ó3å,¿çþåËðó¬þ½F3SqˆÉ6L=pu +ù'ÿûRÄë u±@ ÉSµ¡´9!fÑDNV0—ÿ¢Hÿÿî“:ÌÌS=î1ÿ££RÛüͦËÏΓi»Cõ†Q)ÂÁ¹¦Î¢­-˜Yk™XY£˜xeó>þSûÿÿ2ÿçûžæwÑt¬Ú0ã†f°r"kdpƒD’(‚oäDÿÿÍŸË‘‰„‹BšDÿ<ô¸2Ü#èw¦¥D:BPæª)¨†KU÷µNS9% z3‹sÞ)ROJ:ûÿþÝlår½f©.v–{ÚdÃV@ÿûRÄì‚ a nQÒ6 (#3ÙHÅ"§ÎÜ¥#“ôÿù¥æù­ŒØÚ28‡ Ñûü˜(†jsØ.dh{Êÿi"g§>~V’ª%+,0–ŸÌÝ}«Óz#<ïØWËòÿü¿ü¯Ë(L@Ô-Ī :Œ,Xî=!8Õn4Eÿô_þG‰Ñ C4ÿýÉ[fœŸÖ¨BP®¯c»ÅR å̲=Ëzå,žÊ¤!"‹q³FT%j]ÿ9ÿçÿüÍÿùs†Ô+Xœrk‘9„î-BÿûRÄê‚ µ¡ =€¶¡t!› 2¾É¤º<€U‹`Ûµ0%¿õÁ¹¡/YEIRE½#çÿ´G"]ÕÃ3£[ÆoÝ÷;Mw÷û­míó¿™ÜÞ’ÑÂSÖçÑãûÊŸYìÿÿüÇEEʼ Æ‚ [ ÿó?ôüŠ( lõÿ¤ç!›:ˆä‡‘žÃë[»gâX)WR‚PD3*ÑyËâ3,òòoÏ;ÿ$埥™6Ù‹LÁ™ b À‘iW‰6uX²ÚÿûRÄæK©±  ‰;Ii6at›¨1Q4HÉvÌÿþ+ ÊUH0IˆÝÿf”D˜•8þLІe:V׺H{þ”Óϑޒk ¶ÃT;;Ëoƒ.!TÏ5®ÌÑÿÿþß·ÿ[æÝWj—¯‘FmϨè`´°ë@Úq4%`€0\ %q¶íô¢–gäEшҶªŒõföÛ6€†;rï8æŠ{Òùo‘åÇ]6^[Ìg¸o÷&?õ;¸ËÜYm—‘gÿÿúè@æ.â '6õÿÿÿûRÄè •³  ;A3#ã4™úçú²ÖNa!s[LKSÌ®WÎZ”»bVCRlÿ’’Ü{šµ†&/›ï]9Cº†LŒ¥7³S0@™t#ú~ æç?ùóË#¯U-ʶڑ"Wä5ÇYŒ\zcX›!18\ˆQ%N' b¼-¸Ñ í‘Ùrj£5_™™1YÕÿ¹DeÊf®´‰”㬄¡"TdÚ¦SÑN7S²šŒu[Æ:^R+JêS¯ï_ÿ××2C#L,8N48",4L>$ ÿûRÄí á³@>Á—¶ ô›4N „Ř%Ö´»>™NJ‚&Qö"~J1µ U&ˤ¶MÞÓ=v*8ë4§¨S@¡£!ðTÅÀ `ªsÿö«ãqS—œ8èº ;iÿýÿµÌPlÓUÊbÇ;ÞZyjÌ€Ôp‰W·où¿öÊÍ¼Š¬Î”ÜwiWr¬¨cY÷rMøŠÞî<¢nfñùóʲ©¿Ýßšßçúì„åzÖ´Y×EÌÞÇ&ÉÝ_(U;2ÿûRÄä‚ -   ÏѶ¶ ´!¦øQr©Iæ %užt¸ çìòHÑ ²D‘JoFJÑ$7ÿ6íGA"ìô Ä ý™Ý•SÐú²È–*å¡WDFd=H¯!êc2;ÿÿÿöﺳ‰S0L\Eè„ÃÅØÁÀŠœ`êïüAý2gS×Mú±C²Þ_©H?2™‚h½Šå›n†dnÉ«H¨ú娤U§Bˆ (¸¨ ¸¹‘Îr'¤¶òúµ.¨ªi]Ëöè &`àÿûRÄç ± @ ±Ñ'›b´ RL@$pàÁF8ÖjXn[kIÿäODô©Ò€Â“%L5™GÈ‹ùþñÏvýx›ÍXÏÛÓ.w:Õ-Âì(H–ꮈ#jÕ?ÿÿÿÿm+ëS9yLàÎk€QêÕÝûD€ß—ßí,Ü“¹sJWò 9/åù•ulìçÚ¹%Æ3“Éž5Þ¡šHr8u\…•Ù,·WdõzÿõùÕC™ sÊ%"”Êq*¡r ‹ª qsÿûRÄ¡žÉQ¶aè•
\ nú´ÿù˜€%fêÁ™£ïòzD3•É·I ÛMÍ,9yz8ïæ„±˜Qwu5§ ÛiØ_ÿÏÏÿþ~½ÅzJÓL=Ç#F@…BÒHòa¬˜ðÄh¡D¬þK$†©ë3)IJÇ7 ¯+^/ØA¬,ßF#UR à^VÊpÜ\}­éR¥ è¬ÔÑÄ´e­ÎïM;ÿÿùÿÿÿýËL“$LÞ¬Xâ@ ÉœáE(îÍ ÿûRÄç ©±   ±ÉK´¢t!ŠóYÿÿ‰‘¹’g+¦®Û8é®NlúÏçäΰ`a§&@Í…{[ɃŽÂ!7éÛ$}ιÆ[Ûж$¬]3òÿÿÿþÌËIkBC)‘L ”ˆŒv j]¢ÌÌB€Í“hȆ‘)Ògƒ8‰£Ë•6“Avcåä·ß¿Qúóç™×9ù¾–^§âÏ©Ÿ¾ƶßÛÿómþüó½3eDºú…4>”,F¡8±BWB„’ÿûRÄè‚ y¯   ³Él¶!4£ÙaÉ#D€Ž¿úÝ‘U¥JÓü’îV[*XÍT”9çKUt] U½g4Eg’•ʲžFïi“%Yívûåÿÿÿÿÿ¿ý–³I­Êx0cWU ¢_D„áƒç&[¡ÿÿïÑ€â0-],ºãƒ=¿æI=¶¾Ÿ¯Ëž•öeopßi8"°ºA„Äç!–Ft²8~RfO´/Ö«ÚQ8Ì…(ë"v@åÅd†ESZH¦IDG‘ Õ2*ÿûRÄëËíµ @a‘XµaàŠ»’¢xýaþ^«ø¨Ì‘J ›"‡ÿ^À!ºE …Š%Jtó=ÓÖeƒÊùB,“4:1 fêé.ø'ÍûÌ‹(©þþó?ö÷äýÝÎå-½‹G\Ü«%YNØ,#TÀ É´‚l4+ TenI#EGßÎ"+ŠÉÏS‡?OÚj:3‡e^`lÆU£å*¤WBæ³Þ¬óCPæ8­0vvs¤Á,¤Rßÿÿÿû?¶ÎUT»º%…ÿûRÄî ± ÑÉLµ¡è ³ãæPlJIÒ4¿r ‘Œ±1ˆëöéCƒ…?±ÝÑrœéUD˜§!C®köj÷;ш¢„ ±FP!˜C ΄G^ŸÿÿþºÙÕm”źpá”ÆY‘aÇ q!•rÿô$ÿÿSç3–%ZgyrÞS?Ëÿ¹½S§žú—.´™^Èù¾WÁð¬(gk±fŒÄM­Y¹šä-Mx_¾ÿÿéµå©Že5ÜÌQãÅ™Á:) P‰JÿûRÄð uµ >Á 6 ô§¡ßè‰ÿÿÿ¥ç©SOu‘‘þ«ùYG¾Ñ— ¡0¨ñ8Ìdgiùæ¼)š°µh”‡×7Øå(-!¬2ȬFâþ[§äGÿ}|þ©¦vŽ`ØTaЃªœ BE BOQ RaÊm¬@œùx€„—o£÷ŸÏù”:åx|Y.©–h:³ qÕUmi=Ó)™HIHÙáž-¹Ö~?N{þk»ûÿ®;ÿŸ¾«›¥ØÛ¥TLTR®¨4±ç”PJ02(‚ÿûRÄäJ¹­  OV6ảêaáÒâoa ÿÿ—˜ìI¦¸ŒÈ¶ýÿ¤ÖWk_BAˆÈ¹Ùû“WçHÜäê1ñ”Šé´ê}UÌ¿Y­<îisî_ŸÎß$ðÏÛøoPͱ< â ü²‹*M<‚Ä ba ¡U–Ý´m3£”i!D•a9k ÜŠå‘êÄŽ`â»Ãcßž'Â!qi­SûW£±‡W•B‹ÑÕf«D³À1*åx ¿ÿýúÈg§óÁ±p ]þˆ?ÿÿÿûRÄì ±  ŒµÉ}6!4!›©èœ„#™ Ô&Dé=¼Åc@Q¢bÃ%ljÂàÊæd’ÄK-s¶ˆ h eE«Wk˜û³½ÒÿÿÕû|ªj¡Ÿäg°ê¢ZMB(cFYC³$z °M!Ò§oó$ÿïþ|?q±£ž% \׌˜¡CY~äkf i”?‰¹üê¹UB0e_ÈëÓ„wÞ‘hqËÿΗÿÿÿ ¬ÿ¶÷/6Ûã3j^ŒJÒA!ª L 7]l@$»ÿûRÄê ±  Ém6a4› êÀÿç^ŽW+)ØÄV8¥+òOßþ¯frgù¬CHé—¾ØôϧS8—¿NûÉÞÞ]!L»Û¬âØ_4?ÿ¿>ßÕøkͦþ4.q(XÉ ƒ–L ‹pq¤K(Ý&D9Ê‘‚ík ÿÿÉ_Wæ@Æ#ΨÔÿó¦E5Bõœ?:}{5jYÄ{šL¢ûRK-2Q.àÔ¡1›=ˆ¦†wø}_Ïîsï¿ÿý•Îrœ1W"Ê‚[M1¥c>M5AÿûPÄé‚ U! lQ…¶!4'¡ñ93-‘:`Q¶úFÑF»ÄÏPæO’,êLž&°¼dÿ?ré]7°Öƒ,ðkavœ?3gÓŽrôˆÐòY™¯Ê2­}ŸÿÅ5=‰“*á@dȪèˆÿ¿ÿæ["RÎRÎÚþYäNµuÎôÆÝ_VMp|jè-‰Ã.Æp(%uEV0¡Ê‚ÍÁã¯O±‘(A«¢óÿ¥ñqerìÏÙŠt D©ÕÏ—×@ä´M9q2zã÷BaeÿûRÄí ±  ŒÝ 6 ô!›¡”ÃÉ$X\{ÀnJ#E4Û^‚Wq±è]d‡ÿÚ©-Ôìæk­¹ŽßØL—­UÝë•Ðò"öqq)ˆÄ;…PáÃ{ÿÿýofïшÌD˜c¸pÃŒÎr‰ ©þÉ$ K3Íghv âBUT5{÷û¤–;ŽG2<AÒâ¾Ê×.FWk±*臕2=d$„C‡EµÊûiÿÿô³éT[JÈmTÂJŒÃ€dv¬$X rH‘ÿûRÄê‚ µ¡ ;A#côÊ ÿÿÛµ#>,Ù|¹|¼Û£E/óýÍ•ë"”GÆ#p9Õ‰!°sw³‰CÉD6à͆wÛØ»=ÿÿþ‰ËK”{2QÝ…ØÃˆa†RÄ@¬Hâ‚oºíQÿüJ¢ BDB0 ˜ªµüSv‰Ü§uj¬{ƒ3 x1›Î‘¨’ÊÝæY)nG0ÊíO`ªFÒ6ð>çÙ[/³™ÿùzçe$þdúÌ ²˜¤¸… ÛiD€B€ú#¨±»ÿûRÄð‚ ·á ›A_6"4•ãQ¡Y S Ip¬ÿùè÷&ˆÉâSÿþ52˜eÍ)•MÛ¶rnæÄ|ŠdޱEG!ˆ™¥n#”îµÑÿ&9Ÿþ]"ÿþïÿÿ—íoòéÚ·xm+‚4Fà—_U'#<Í2EDá:Y•ïë@€Ú­³ ˆS¹‰F®ï®ÿÜ…¢¹p¹™OûŲïrKŸ57+éÏ7±ÛªÕâÓæqÏMJ¬«¯ÞüñÊÿ?ßÿÿ=÷5½\M¥V5ÑJ:¦£’18ÿûRÄê‚ %¯@ Os6a¨–ºá ì9 xžïÚ†ÆxO:B2–žEßÿÊœR¹V=xl²Óiu>ؚ̪åVfFU|Ô—å;E7xªÖÒ£á4ÿn"8ûꈮ.=ù³­4›Ex5Ž)†‹AÇ Q8êx ¨[Å PÅÍÉÿüHÄfs2 š¾ôäÎ*®dŽTÑÁ+ܧ+ÂŒÛÒ…ž}/fôØ«ëL#4f"/ˆhÿÿÿ]3¿uW¡ÊF)‡yb…ÀÿûRÄí‚ !µ@;Av6`ô§ çŒ0|PP€]þh?ÿñ!Ù¨É#’ÓŸ.DHÆN±fãT–Eb(&yC¹°rHfb%’’å3²¡•ŒwR^u(Bíºß¿ÿë¿ÿ‡K*9vÝÝ'fêÓ!ºa…`u%ÄÍs38«;Rn*ÿÿýy ³¤K ‘0óð£o Ƈ—ˆÙ d3äR3P±¢¤ÍNàŠ+#Geù`gE/_Ë#w 螵ܣ!ŠÊå"_ ÆÿûRÄè µ   q6`Ì¢xc¬(:¡Ã¨%¶´ÑÈÑ¡œŽÌîùšÇ¯îdr3˜1œ·ÑèT•äy·ªI’utS)XhV5Þ”SŒ"resÎuqÿÿÿÿWÔŽÖf™/£Î@‘Ìj[±Ç$ ú̘ÏüÞ°*”wÿþÜŽ>¬¡3¥ƒ,ѶBxå=ù i=ñ±náÜ›¤ Õ™ e(£d‡Õ7ì'úGÿßÿþÿÿaþD¬+;p9Eˆ¡©Ä p´b( rœåÚÿûRÄç‚ Õ± @Œ»|6!4'Ù ÿô%Ø­G"2ƒC–.е¬ î'#<«üäüÿùoÅ<®ÇØøÁ65–)Ð"š´˜ÌmT!y(¬<. Ø€êþHÙ$ÿå0‘fm~¥è7¿jÓË?þ6Ž512¸%AWÈú'xfHG `8‰¢áEñär¼rï&1äÖÿ§·ÿô¤»ç8†åA+¹ÎRŽ"Ps©ÿûRÄæ‚ ù±¡7Á93b´Š ÇŒp8`“$‘"@qEÌÒSžu©9–¤#¿Òf»HrNËCñäšã‹G(û)œŠãÝOÙEÕ²‘âêjUa4as2 1•*¯éÛÿÿ£§ž8«r3 ±Ðî4ãÚ`²c 8“†>I$œ×¾QŒÌ”ÝußöS1ÝŠ+s¤š»Vª%ÑYáÔç¥åœ)ݦ8Å;"ŒT»ÕÖR3†­ÿûòþÎÊ”#(Š: 6Ur8hTRC(1Á8ÿûRÄí‚ ù« @kY›6`´!¦ùM¶D?ÿôŒiAqƵÜG2ÿ3ÆÂ†ª¾š,çZhÊ„u&N]Œ©r$ˆÇÙ!gJ;êæ=Öú'æù)Éÿ^¨KúùÑ+Œ}ÈÅˬu2br`ñ!TJš}oó@ÿçÿ, Û‹"FE!èFyKÌA&P³*;F"lû4Û@ǰý…Òzv•™Ô{²$ˆg#<=GbbÏûù÷ÿóÿ#"®çÈî9fkLòáQa[ýPùÿûRÄè ͱ @ŒµÙr¶a´R'HÉ#$ÿÿ“Æùèä„FÁ͈ŽÏÿÐ’ØÝ.[Z[ö}^l3[Ûü¬Lˆ¡$‹® ÝR…Bá/רï_ûûýÖÈkžçœ×1ìM#0pŒ˜â O‰HÿÄl«üØ¡Ö ´ÛÿÝò¼nï«ç‡JºAóL)¿Ù#•¤$œ“ÉsÿÿÏÏ6—­ÈËiˆJñtÔ_#äº4‘«'DRz~#d@± LånKlIt¿é’ðÏ2”-ˆñ}H¾$yT(°¨FlªAb•…ÚÈ÷#¹UÔ#³˜YЂ7:YTeK È(AÈv3±/rOÿÿÿ÷Ó[4¯I;êˆSThÿûRÄë ý±  ? j6a¨žº£I/,‰êÊ„¨Îi† â'Óÿ/øf¶Q?;¶Ö™!–8s«çO¥U”줺$„{*îÍ=dr²³5ÿoÿÿºm£­ …&"Ac$êÅ@€¨²h[€Å$íµ­SüϩΦIÙÛßZÿ<"°7’¡š….&¹PA â²™{‘šd©&EFl)R3uòμŽd”Oÿÿûì\Q0«„¶°ÿþ_êcl!8aj§Ñu§{yÿûRÄë‚ !µ ;Aжà´§ n«2bµÑ©Å¼s¿¤KZ™JaŠ9*1N:"¡ ,4ÍDåmWR6s]_òÿ/ó!÷ºî_žø²Ž´ÞÌ£Yû8ù’¦xhK èԼѫ?ã‰i`´êŠNY¢ ‡nFðXNÉ|‚N ÿýkÍ7v{ ¬]k}8官§®•RóÚíÇz3=ŠÃR^^‘Á±rC<¤´Úß7Çÿ3öÿõ˳#dLhÐø@†º˜%ÄRÁ¼ŽƒÁÿûRÄçƒ ]¯  ¯™Z¶aÌ–:SA v ÀwûOÿÿÝ!ÀdB0À5,ËþÁ Ù²2ŒI ”ÊæBƒã¬ЉÚT ÑÊÌŠ?üÿúŸÿööb›ý|²J”Òº!8`*kDŠ=9GG:læ+j^3 ÿÿ7›•òG;LÇIΟþÍtd )¡åÚOk _ægfd0¢"ØÌìÎ7l¢3cÄÉPá&§šÕ7ö9ûÏÿù3ñØÿò± &j4ª$2d«åN¶h2^ÿûRÄì‚ E! kÑ¥6 t!³Øë›j…€T˜%Â/ÿÿÛ}UUì…db+ÿš¶~kyŸLפeì‡J=ÈÏÜÚSôxï4÷5s<黽˞å!eþ\ÿ?ìöÎfÎom>‘þ¬˜¶œÂ÷N¦Î«äf û¦+—7{ôµnK"Dÿê¸`àFfÛSÅ+¹)åÿÿò/äžrÎô–54 A“ƒ±#@¹¿xióÍŽ±‘©·õŠ¡¥Öæ¹™'Ò¿ÿÿ’Yý¬]”ƒP[:¢0!#2ÿûRÄð‚N³  J6¡tšø Þ,ÿÌþæ qšPL°F+Kÿòô)Ò©>jfÁÛ1@²é±£'ñäˆ^ˆo¾âÉÍž¨ú©öK{ýÒý?ÿÿõù•¬êZ+)Ψ© Ø1"ì–&9µí´m»_CtĘVxe)M^½ÿåL¨†ê~æ»ÿÏÈ”æ¯jg‚¡IÔ;² î°`¦§`èÔƒ›ÍPðÇÿÿUŠc7`(!Í[ ÿý?ûVýbÆDfSºýŸþJ’¹y“ÿûRÄì‚M³¡ =r¶ ô!³¡îÈ|þäFf¥ Lo%­1;ÕaŒ âÞ–= ‹"Váì’$T’,©|á‘ ù¿Ì}Z “^}_O"®YœãÒС\ê\K3Ç—Y‹wºjR)°Ñ¥’èÈÿ÷ÿÆhÈdgWËúÉäáE†®Äg/¶‘”0,Æ…ṮÚè=vH)ä RG8RÞRèZ“Ö¹¹Ÿæeÿ—ÿ}3m_ù‹Öœ¾·»UV×­dÜyQÒbùŸÆñ D"­dìÿûRÄç‚K­ ŒUÙ[µáè–»^_ð»] ÿþòUȬÆ@ŽÄ{½Ìÿòå36¹“ÞæÁuKBN›S¤ÑÕ4S8v’ÎX$pD],õ¬[©°Nw"­ÎOóÿ?î_ÿíÆ²® É-U~)8Å25![DAS¤%€é75”v*Z,iù˜!váÿÿþTÞŸ]ÖüÞ`›Pä~øå:DŽæ'KÓ3¨äqÒ‚:©Ê-˜ï sÏNC—ÿÿÿÿÿ½tb.®MMrPP!pD—ÿûRÄí‚ = aѲ¶àh!¿ fÈÿßÈѬ«0·R\Û§-¿W-é ƒ+MA–ê”ò̆è%LËPÕzx³$éSHÅ7mÑã\Ðé…Ö#+¡ÿÿÛÌÌÖÕµu¬³QêÛõâD¹ÅÁg¨Î2vp¾cKAjp‰15þYDÍÓVÄ;˜¬%È2”ýH¾}næi¬¬ÖS;£,Æ Î§1™Ë¸9\ªèewU¡yëÐê÷ÿÿÿþÑìŠî‹vsŽÌ¥al@`”ÇÿûRÄð Qµàž¶ ô!§h8x‚Äßd@ÿÿµ=rî :çV-ÿó9×aZ̾ܤ#âåMáӔȪQ&T™!@ævS5,ÝÇ4W•ò…ý¬Yüþÿ)óßW¿ùêž:û¨%(RTÁL‹m M‘†Q DfŽÎuZÚ$ÿOÿÔ©*!Ôh°#²Eü¶wþTzU" ïL´¤HdoHò$db>•>4:Y©X5TB”÷5±Þk &Vêÿÿÿÿ¿jXõb1PÊ°Ó P£æcÿûRÄä‚ Ñ©  SÙ«¶`´!³¡ ( vØ@ÿÿÿÈäw˜‚4uÒì¿ü¬Æ Ÿý²eoóJô“{nÓ»YŸ[ØÐ°°gbb4õ F’ž¹7—Î~RCùÿ·ÿü—zñ©¨¥9…$Ž P aòŒ'D 墨Jí´m£ÉTëI&`OÀa•Ü¿ÿ/<ìöíO,šÕIµË°áC‘Ÿh¦DÅűÐã·¡1Œ@jC¥Üö'ôh¥h¤-"Åx»ï°øM¾h'ÜßR¡ÿûRÄå‚ Å³@N‘¶ ô!§iÕ[ÈÜëg/ñ2=Ù(‹—NIEo3f_ÈÈ…/W1O8fáÑJêi±Ïûýfû÷m›ïϽ÷ÿÿßÿí_ëµíasoG)Û †¹©™It§ÿó?ÿóûyr½Ü—a¸KdÌñ„Ó †Ò@xÊÇ`ÿûRÄé õ p‘6 ôšxˆ˜LÊ¡¦Ê(Æ-üfÉkKýB*$únÿý›»µ[¢=¨„²ÒæVrŸqfC±¤+KU½•T¶Ó|«c”îr#3.õÓÿ¿¥ê‹dTqA‚f¹ž=ãÎŒ"®â`P00¤T¢¡¥’oìDÿÿý?‘tŠVDs-Ù/¿ª¾Rû\ÎîA{–G{Ôx†èÖÔÖm#íMü·kZœ#dâg~yÿÿÿúZøüþs¨ûIMµ¥•úãk³eØ2]³dÿûRÄí i±¡ \Ùœ¶ ´!§hÛ1̘Rƒ÷$HÈ“!™‰ÈóùjÏ…A¥]„h3×§³Ót -f£aH®yµ(½ ìЮ€ƒµfBhäÄÇÿ·ÏçÿÿÿÿÿõÜöÈÚ¢—XbÅ‘i(‘ØGµïìDÿÿûlæY XOnßÿ¢™Ðß©PQÈï±v"=™ GSÎIQÔ!ý¬¦#ÙYIÐÄ!ÔïTÿÿÛûþÎ[~0¾§©Êr•µÑ¥Ñ¦Gª.€rÖ6¡vÿûRÄé‚ …µ¡ >Á^µát–âT 6ÿOÿü‘Íh!6˜ Œ:¹}¿+òkç5[.#+Z’³ÊZÓÞõÞŸ„Mø3V«V¸a#Ò/"I+,»Ùïó†ÿÿŸçþwï0bá¡Í@F-BO3däþ{@z೩d¡EþPÒ$9JÙ<£y› :¢ÿùn”B¯ÒdES–DB3T‚²®žîc•šS³„®¶:‘žQeŽ,ç‘&+{ý¿ýz1P¤uC›*°Æ)ÐAŠ‚èŒ$¡ÆaÿûRÄé‚L)µ ¡ =h¶a¨êáâ`9/ÙÿÿíQ)†¤i ur?ÿÿÎô’Ž,º°ÿÏ;-zó2–©‘ñ+ФDò(VY ) ¶¶|nÏÿ,æ_Ÿå 2Õi³<¼t@è£F¡×fS‰º´Î(8âôݪ ÿÿùÈ„f,M±GÆdü¿Ô†;mB«ãuYÒGR®vræ!X„%Œçg™˜ïªw3Qï9],Šk";þŸßðù°û®H¡UI|Už˜¬ 6ÿûRÄé‚K™±  ‰7É6!4šù†Ù#ÓâT–$.ùÀ8$»k`V½ë”®âˆ8q<ÜL²CÊdWò™«ºßø¥YJZEC.ÜT7óGöXÒHë¨HâÙ )Ñ#%¬u)ŸÿÿôH¾J ÊWB]² ÿÿÊþJ6 …LàÓåBÏó?lƒU‡Ãÿ†Æ«ÿQcŒ¼Ý§iˆ È¢¡û‡q&:pü›mJË‘{BÏ;åÉ©Ûÿ¹ã:ͽê—AÉÃê'4Þ¡U”B¨TtZ¡AÿûRÄé ± @ ¯Ž6 ô¢ø……cMä–F‘ÏŽ¤­‰Žf+Šwçüÿøe —":[ý[xlD´ØI@àè@Êqí² ÿÿ­Ìϸé™4~þêv¶ ,CÞï¶g=6gÝÊy*´äFmàê°•’ej;áJ‡G=ÕzÉÿîëüð©÷:7Ú]IZ•£ËÚm¢‹åXFRb˜.€ãÿûRÄç )± ‰= .££t*6ÜÞÛªÿÿòûí6lDL"Eþ¬…¹_û:RýS&>ÜÎè„hì NRËã’"ÒD¥#xZBýÎY¹ÎeŸž|þ½¥+êdjY–£’™fp`¡Â6Vc b8uË0ÄÇU“oó ÿÿ˜àã`b± £d<°cï1:³#Äg¶ŠîÎRo£-5+³{±Ù•ìêÇJQbÛÿoÓïõ Ô¾Gûzˆ²àËsä»$픑jn'ieПÿûRÄî‚ ¥µ 7Ác6b4 2´ˆÚø–ÿÿvè†ÑÄ€PˆyD}é^—gUHM¨WªX3ªÎ¬SÎw3ŽäKÖæVfÒS™Tå“wbÑPó²Y-÷þÝzïñêm>ÿîÙE4™e³‹òBlò€ÈYðÁÁǧ [diÿü¿›5£3µˆ *xrŽÿ/ùçÅkV‘@¤Ùš1‚ƒ2æ•×*LúÕâ©! «Èãö 6©ÏÿÿÿÿÝëü‹•ŽIÊAFx©ÈÒÿûRÄé‚K½µ ‰;Au6 ¨§¡ÿ+ãÈ‹$´É‡”L›1ʦ™VŸUÖzȧ ˆ¸”Îxñ DœL\L¬ÄTäj_¢«¨º"•ë39=wuwÿÿþYŸ¾;Åb¨óTÜM—)#±‰(âYx4H¥*-¸ÑÿÿÕ^Í⟤gc’ÝyòúÈYL·4Ñ“/-½{)¯ bÉâC­Ô0df"Ñ ÌÊ)<ëO"ÿÿ¿åÿ?¥»*ÍÊʯ=œ­ß¨÷—Øg$­¼{ˆ¥ÿûRÄ邋ݵ  ‰>Áz6¡0ø F"KbK¾³ÿîÝZÛ:R‡»”Ò¢sï?üólR“Œ@˜FsœÈ¬Ñ#9J ;€ãÄa „ s74P®¿ýu¾ëÔí&/Üg$êšb3zí¯L2‘–I‘2ÙÀÎÆr_¬@ÿþ>D›7nÝÈR ¿÷ G™Ì¢ŒÈßÿû–æòmNJH=ÝLÉ(qJy$ôÒŸÏád]Ëü³ïÿw¼¿gÉeMe4•m|Ř9m—ÿûRÄè‚ ±« ŒUÙ‹6!(šûdˆ•§Rw¢ÿÿ¥,ÀŠkNd‘Šr»GOÓÝ’}ød;²K*m‚ÏF0®¹ZWŒ¼ÈËHá”ó.XC¬/)"Žs?†gþ_ÙýÏ–fhÄLÂ`1 28êÀá°6ÆZÑ6F@?K åoý’[G+’›áLgOËüÿkD"/üé@vLÈ¢ùS R±1C2GV¨„A9I¢Á´˜p±Oÿÿ÷?µòÀ7.ÙÿÿÕ™nò²hèÿûRÄêL!µ @7Ñl6!4 §1bQoÚDÍýùå•'kÿ—’¹8Dixq¬Gw¥ÚQ2ªŒkh¾ñ ¶Ê˜’#s/3[=~ò_¿åÜ·v¥R@•UfO1c–»õ @RªÙ¹5™Å#¤/AB¤*Rßs@ÿýÚî!‹Rº+‘˜R¡l¤·ûÙH†ê.¬­fUû»Pš3ÜYYîæclŠÎÄdWcPfp<'$®Š§ÞÝ^Ûú<«nU)y1ób«S‹ &ʯ4¡¿êXRÿûRÄê ]± = ‡6¡4!§¨FÃH@Tí7€Ý¿èAÿÿ— Èr$c2„Ÿ'ÐåÊî´* Œ’¼ˆ–e!,tÌì~® Å”†5äQL†w):³‘›ýúþŸýUð¼Ì¢Ê!êÕD'±3È |iÊ4DF8.ÀÜQÖIkIv"—µ±÷‡MT¡Ö™2Ê¥»‚W¾|Ž„ígaĹDŽnÕ ƒ«¹˜\ˆLu:8Ç2„Іw;LÆÿÿÿúl”tÿek+ew1Ž-E˜pÿûRÄå‚m% p¨6`´!¦ø#8’H ?Ú"@ÿõÿìúì[#±E–¿O³3•™“á+äRF¡ò9 AÏoÊ,TO¹Œq±œ­ÍÕ¹‡çSÈù>ÿùs¤÷ÕÎBÅØÞ˜–ÌÔóåXÔ¸$ö ‰3‘pò„8V­ÈÑÿüË”Æd †S– _­©èêeEзYÄ ¡šT]Üà饎W³™õ)ÉÆgDrX²³¼‡tÿÿë«qã2û=Ëv~ÏßÃNB3§ºÀF$ÅÁÿûRÄì‚ E³¡ 7Áo¶!4#ÙÈ D™J€%ÿçñâ uò½(ßɪ&Nsæ\¾›°äˤÖç.{t~÷á9¸^`hÄWÚîîz›©]É^ÿâ?™ùÿÿøôø«®븄)qÂvÆ¥°áw8㈀œC  úŽHÑ$ÿÿC{U)Àà⃳”¦ÚßÛUr—£=¤ T|/ÌùR’ôªQW-qìd@g.ÈF6Zšãƒ+“/GýÿöÚ—54b(ƹªÃÖEC‡†:bÿûRÄç‚ m¯  QÙy¶!4!£¡ †¢ÁÑ 1-¶4€ëÏ£\ÐCÚëúFd47*mpØÉÞ–ùÒ9 ÝÎV“<Sµ dhæÄYŠ,|*ð\ÂÏÿÿÇÒ«ZXd4kIÕ‚I ÿÿÉÈŒƒ‰rDWýéyØ¢ÚÎ#ìÿ˜¥KìKÉå¢2x¬ 2ü E†Fcœ€…¥ÎxñFÒÉØ¯–)dJñ¨¯ýÖ(“™¨eˆ #">õDQw\J ñá(ÿûRÄè‚Kű @ˆ×Ùqµá4¢9€V¸´ê öñÿêo÷°5ƒgJß)Wž]¿ÿäo”ÍÍ\“šû>kr8— ~%‹Û6µ•ò&€½¯¼ËÚ©ÿ—Ÿýzþ4‡ë²òá8Çq9DåP¬u$5ÄÅ%”4ªþZÚ$ÿýìGÛHlt5PûßSh¥ÿóËÓ6Û½&„ ×ôÂ*™Sc*ö£XS2¾æÜ(ôŒÝédÙéÿÿý¿Kšìê¤:*)ÜâBÉpIÄNaÐb‡Õ,I.ÿûRÄé ± A ¾™' bôêÚ6ÀÿüþRÔ߬{‡g>CCGGLPPUUYY^bbggkkpttyy}}‚††‹‹”˜˜¡¡¦ªª¯¯³³¸¼¼ÁÁÅÅÊÎÎÓÓ××Üààååééîòò÷÷ûûÿ9LAME3.99rq.0$@"00ð¶‹´çÿû8Ä 8CNU„€•‘ê8Ð ¯ÄWEt—,¹eãZëb!Þ罟v{ÉÖ&²—mu»à`@0(@Äæ4`ûÄ€!ïÿ§ÝÓîé÷bL¬JÁü>¨à‡O¸A À(8 ˫ƒ¾dÔ¡ÍfH›–ðfP²i1Á„B@bC/¶ "|¨r‚ÕøO‡h‰oøîa†$G¨õÿó"ðö1.—L‹ßáPTDñTA_ÿ– †‹*C±€^Ñ€º€ÿû8ăÌ-ýû…£ßèÐzÑ\Y… I‰@D9ƒfcy‰h ƒ˜^™ã‰ºù®˜bNá2€6Y‚< ÙƒI€ÞÑÈvjí¯>tÓfZˆ{ÿþßÑÿÿ%ÝûGwìd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_•;c˜ä€#ƒÇÓbÿöÿÿÛ‚ˆD ñ…N&2k¯Ê`ŒÌa“”`uªc3@t>Æ,~¥øc÷ža³hÿû8ăÊÐ-„Á£A¿ô`õ€*sa³Fæ|(°„`q(À?l‡é™ßÿùÓ·éÿÚ{èÿOþÒñ€@ÂÆ4gå%`Õ…„abˆa· aßÒgVþNjãbx jÂÚf ¬cqa¨„À p2Ð-û?ÿìd`@# 2C#Mk:oƒ,Es @Ks p3,eóQÃ÷Ó}$…³õ'ÃbÓ34‹# Çs…#ÄÁóD+Švÿ³ÿþÑÿÿÿÿÑÿ°ÀÀó‡ 50yÿû8Ä,ɸ- ÿ¤a…¢AÏð˜xÅK³;í ÁôL%²eÌE‘ x2Žj:¡1Œ{ÀÀL6fŒ=Nnˆ5ð¼Ë °¼ÀbƦŸÑoþŸE¿ˆ}>†ÿ±ßÛú?ö*d©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_•;c˜ä€#ƒÇÓbÿöÿÿÛþP !€Æ8˜É¬f¿)‚0C1„NQÔ©ŒÌ Ðû±ú”áÞy†Ì¡ƒÖ¨ÿû8Ä:È-ÿF‚žâAÏÔ˜Ø@ÍŸ bÂJDêõÿßÿÿÿÿþ¯Wï©ÿ½¼ïë_îÿ}ú½u/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1'€Ù¬-¦`šÆ7fˆ@€<8(ÑGÿÿþÏôÿäÙÃELÈÓZΛàÁË\ÃÜÂ\ŒÂ |ÔpýôßI!lýIðØ´ÌÍ"ÈÈ1ÜÅ¡HÄ1Â0|Á@ â¿ÿÿÿôDßùÿÿÑBÿû8ÄJƒÈè- ÿ¤5…£¿ôP4€,*–c)üÂL˜+bÓ˜Q!<blÝ’Ob•‘€Þ˜?`t#@Bj1²‚•Ä"!Pe—SMhêwÓþßÙ%ÿ³ÿÿô;þBÆJ“aÀ ?12\36¨ð;oèÿöé‘ÿÑÿÿúö—ˆ1 ³?(9(3¬,# aP„Ü`•z`Sp{x¶À$-8† $ÿÿŸÿÿó¿ÿ÷ÿÖÿÿÿêie¨0ó(4“ŽÖ0cÃÍ0«!0„0qÅ•4{·½6ÝGS0Ö‚*0UÁ 0-š=ùNdcnÔÍ™1À^)ÿû8Ä”‚ h]þ†<…¤)ßéÛüSÿ3ýŸ¢Oÿ#ÿþŸýŠKÔB£†Žd÷ðp¦(Цx<vÆ3{ÆÔx~Æà*& †  ׯ  À¨P±!IïÿÿÔ{ÿÿÎ?ÿýßõÿÿõ2T›Áùˆ@q’ᙵGÙã…º Qƒ5¡‡3éáŒ8B€²y(Á`/Â]€8ä€p>X…ÿÿýhÿÿùÆÿý4ä?ÿÑÿ¢> )†”¬ã\ “&(ÿû8ĨƒÉà‡ ~„Á9…£A¿è˜\†SìF §q銆¬À*Ç]†æ‰¸8´0Ô0`‰6…uõ¿zÛ÷÷׿ÿwÿûþþ¿¬¼@à0±™ùAÉA˜5aaXâmÁB˜wô™Õ¿“š¸ÄX˜`!d+¶˜ k›`cRÀhÁ³C·ÿÿõÿù×ÿ¿þ¿ÿûÿVºtËø`af,@f©fõp`­†¦a+:`æ*`ƉÆgÞaÚl ŒÖawÄ`”Î`Nÿû8Ļʇ þ„Á6‘#ßÐÐ~¨kU•"Ä—*~¿ÿê4ÿÿó¯ÿýËwýoÿÿwýeÁ ‚À¥†Æg°“& Ø´æHO#X›·d…‡Ø¥F$`7¦ØÐ jÒ0"Ep `Ȥ÷÷ÿûOáŸíÿGþŸÿôéþÚd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.± ÿÿúÓÿÿóŸÿßý_ÿ÷ÿÿû8Ä̓Š+#Nÿ¨SãA¿Ô˜Ô ˆ@ã œLdÖ3_”Á!˜Â '(Àê TÆf€è}ŒXýJðÇï<ÃfÐÁëTlfÀÏ…1a %?ÕRÿþìBþ¯þ©H÷ÿëÿýõ›?·úêçÿ×ûmëKÿ»ïç>º/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíýÿÐWÿÿZg¿ÿîÿÝÿþïú™ÿû8ÄÜÊŒ‡ þ„ÁP‹£A¿Ô˜#4S#4³˜ƒ,Es @Ks p3,eóQÃ÷Ó}$…³õ'ÃbÓ34‹# Çs…#ÄÁóD+Šv×ÿô07ÿú°A-ÿÖŸÿ·ÿÿú·ÿªÿêŠÿöíìÿÿµ0,0¬Áe(LË|0R†Ù0ƒÈi0óC´1¥G68z5z<¾G°1±‚Ÿ0¾Ád0lÓ0C@t0(€%0@€J`²¯ÖŸ·ÿ`‚­ÿÿ†ÿjßÿéÐÿû8ÄéÉœ‡þ†®¬âAÏÔ˜X?ÿß°?ÿÆ^ŸéñíÙwGÿõŒ•&Ã@~bd¸fmQàvxÄanƒ`ÃhaÌúxc€`,…B 0X ð—`Ž9 …Ö!ÿÿQåÿË»ñÿñßõ¿÷ÿõ~µ€àbÈ d`òùŠ[Ó˜ƒ®9$JA<˜³@µqof¹Á¾Þ`Y˜_5`Ãkh¨„$€Ã Þ„}L¶ïýÓ*¡ÿõu1+ÿWº½ÿïÍÿÿû8Äîʨ‹ þ¤Á¨°ãþ‰Pþ­%?ÿ«êÿ¯Üï¿­ÿÔÕ®‰i`t`ŠEÙ 2Mšù¼Áu  Âj 0ÃÌÃFüÌßÝÄÓt¡ ¸Á*ôÀ§àöð5m€0HZp Hêu×^¯ÕÖ}ž»2§þA¿ègéÿÿ³Gä#1Yj $<Ç d㵌ðóL*ÁL!ÌqeMíïM·QÔÌ5 ŠŒpBÌ @&€÷å™ »P3f@Ç fD;ªºûæËÿuýõÿû8ÄïƒÍ͇|EA<‹ãßÐС_îŸÿ©ß¿þ3þ¿ÔáS €°ªT‚ Ì" t¬LÃÔMw[•µŒÙE]GPÁŒ*€?LŒ ÀÀíœl HØ^°Ù…ÊmߺÞìêêêoõ}Må†ü†ŸÓÿ’ý?Ñ.kÑfßÒd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.± ¯«ÿü÷þkô7ôÑÿ·öÿÒßûH4B!Œ*q1“ÿû8ÄòNM‡.~¤Ág‹£¥¯Ð˜XÍ~S`†c,œ£¨-S˜¡ö1cõ(?ü ó ˜c¬p9°x š7>Å„ 08”ˆý}[ÿ÷:uÿWÈóßöÖÊ}_ûê51ÿ÷¿}Þ³ßoõyæûê÷¿þ¹Új/80ÆÐføf XXF x†pP¦ðí&uoäæ®1'€Ù¬-¦`šÆ7fˆ@€<8(öÿÿÔ7ÿÿ°×ÿÿÓÿètÿÿÚÿÿoÿþÉÿû8Äí ‡-þ„Ál$ißÑÿôúýG20 Fh¦ Fh f0XŠæ€–æàfXËæ£‡ï¦úI gêO†Å¦fiFAŽæ- F!ˆ&ƒæ ˆWí¯ÿô2ÿîÃÿúºþÜsþþ ÿý?ÿýßÿmÓÿ¥A  @lÀ#c L0>A0cÆu0¹ÂÔ1CEˆ6‡©69ÒEæ1Lÿ0‘A 0Q€d”€ÎÁp5€¸\Ap¤Sz¿ý”Z_ÿíÔXÿ¿«þÿû8ÄðƒÉô]þ†Æ°bAÏÔ™®¶_ÿõóŸ©û¿_ýNú…Ù*M‡€`üÄ 8ÉpÌÚ£ÀìñˆÂÝ(Á‡ÐÙôðÆ!ÀY <„`°á.À  r@8  ¬Bþ¯ÿëEÿüã~Ÿú?èGéÿ£ÿGäj„¸„2<¾b…Á–ôæ ë†I†PO&,Ð-G[Ù‡®po†7˜fÀF XàpÀÀÄZj!‰`0è7¡O¾ª·uo^çJêÿþÛ¦{ÿÔêöÿ¾¤Îÿîÿû8ÄñÌE…ôªŸ°£þ‰Pu¿ýn–öÿõ,çþýúÎÿõÖVp* d(Ê6hæóÔ&ƒ ¨4à #3 gó3wLpyÓ „&ã¨Óœ €;ÛÀÕ¶Á!iÀ(D0Q#ê­•«{þmþÏ£ßc¿«úóõþ¿ýÿß_ëH–Zƒ 1ƒAY8íc<<Ó °B@³YSG»{ÓmÔu3 h"£\³Ð €=ù@æFnÔ Ù1À‘×·úú_¿ýºÌ_ÿíÿýµÿû8ÄíƒÌˆ÷~¤ÁD#ßÐР¿ÿþ·ÿûÿúÿöÿ¿ÿ¬ð/P Ž"9“ÜÁ˜ ¢*˜=àðlaÛ4ÍïQáûo€¨˜0 V€0ÿ\( 7¡BÄ„'»ý¶~ÿ=ýgôÑÿ‘ýôÿÑd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|.±/ßÿÿZÿÿüçÿ÷¨wý_«ÿÿWê€BãTÿû8ÄôN‘‡N~¤Án㩯ИÈ c¬S`†c,œ£¨-S˜¡ö1cõ(?ü ó ˜C¬S› š73á@Å„#‰FýmF_ú]Í_ôéÿÚ¾Ëÿ»âãÿÿtÜy¿ïÝ:éúy#Ûþú¿”ý|ú ¢/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíÖßÿú’oÿþu¿þÿÿýÿÿûýÿÿÿû8Äí‚Lµ…Mþ„ÁY £é¿Ð˜û/ÿÿÛÿçÙÃELÈÓZΛàÁË\ÃÜÂ\ŒÂ |ÔpýôßI!lÃÔ ðÁ‹ÌÀÒÈ w-€Èd1| ( O"µÿþÊ*+ÿÿbÏÿý¹åÿìu¿'ÿC=Kñ5çÕì´¥° ˜‚‘‚ ä˜=‘©‡¨vÛÉG?èð”f»&€JcPP`´h¾ÚT3—n÷’ßê_ß—HÌ“ü‰û.ÿíKÿÒÏûCÿû8Äñʇþ†Ö°âAþˆ%I°àP ˜„.›Txž1[ Å0ãZs>žÄ  !G‚Œü%ØcŽHGCáuˆ_ÿÿÖn¿ÿþqÿÿÿÿî¿ÿÿÿ·ÿÿ¯ÿÿ¯ÿóÊ‚ˆD ñ…N&2k¯Ê`ŒÌa“”`uªc3@t>Æ,~¥øc÷ža³l`õ€*6³Fàg€°„‚«©tÿ׺‰%ÿìJ!þ®¦õ¿úßZ?ÿ{õœûóÊÝè®Ùÿû8ÄïƒÌ … þ¤ÁŸ#¿Ô˜ãÿ¾¿]ÿõΈch³üƒH3¬,# Å„ 08”ýo«k[úg ŽõíºˆÄ¿þÔÿ÷ÔZI»ÿ©Õ±‹öÿ:®¿³mn™Î¯ß·tÛÿ]E¦/8 ,cAf~PrPf XXF x†pP¦ðí&uoäæ®1&Y À-¦ÀfäÔ„ðpd,ÐíÖßÿúÿÿc'ÿû8Äï é… þ¤ÁŽãþ•P~ÿõ ÿÇ?ëwüw÷Wú†"tËPa!æ8Ph+'¬`LJšaVBa6`ã‹*h÷ozmºŽ¦a­T`«‚`Z0¿(ÈÀmÚ›.0c2§E­þµÿZ?úß·¦{ý}u8{íßþ³ujùÏÿ­6{Q±Ì-•Õ³2ªÝ²±ÞOð£^( •JB!€y‚äAŽU‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8€¶à Ñÿû8ÄëÉÔ]þ†Ý°âAÏÔ˜4œ›]ýßýGÿéÿÿ_ÿ£ÿëÿÿOÿÿãíÿ”ÿC%I°àP˜„.›Txž1[ Å0ãZs>žÄ  !G‚Œü#ØcŽHGCᦽÿÖÿê6úMþuÿ×ïÿ-«ý•þÈ?ý¿ÿÿ,ÿû¯ýÆ¡·³ò8 R³ŒApT&L˜¡rO±€vœ`@Ǧ*³«W`˜$níÚ0 Åëÿû8Äé‚K„‡ þ¤ÁÛ*£a¿Ð˜~Êëÿ©—þËÿcý—ïßýfßÿþsþ¿ÿÛýd—ÿÿ”=Ÿ‘ž©“¤¾@`LŒ€Ìu `¡ $ jÌ(>Ìžz®LëavOÿØ7´Ï(ƒ Ì2$Uˆ½+ÚC¯ÓÛþ9?åÿŒöû÷ÿQO_ýÛýÿoð±û'ügý*m"k\3ÓC8csb¦“K€S@ôS*z“ADð?”ø ‚“0€Æâð1p *€Á±ÿû8Äá‚KÕU#nü¨Áƒ*£ßÐÐÁKšv×W·úÓWû«¯æG»z¿ÿ-ÿùßÿþ¿ÿ±-ÿÿÖJÿNÉ0G” €8`Ž`p`O `‚ˆª`÷ƒÀa±‡lhÓ7¼mG‡ì{â¢l Xf Âcø\b0 Š€¥ö]²îÝí§þ=}ù6­âmþžßè_û'ü¯þŸÿGÿ ÿÝáÐßm>J^¨– ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éÿû8ÄãLaU#.þˆAª¤!þPà(|.± ú¿õ+þËÿÿý¿Ôo÷Ô¿û˜?ú¿ÿó!Þ—×ÿñœ+¯ÿóÀÞ&”¬ã\ “&(\†SìF §q銆¬À*ÆØæ €›€{@6 @Ì@Æq:¬º™mßþy_î¿úßÿÿõ›Ýóÿÿÿþ²KþÊÿ‘ÈòE"ì‚…@¦ÍüÞ`º„Ða5˜a€fa£ þfoîâiŽ>aP„Ü`•z`Sp{x¶Àÿû8Ä⃠‘U#.þ¨¡*£Éþ•P$-8† $ýõ£ÿRóþ¿ÿWý_ù›­¿ýò‰8ß÷ÿbùjÍ?‘Õˆšä.€€aƒaI‰¡œ1¹±SI¥À) z)•=É Ž"xÊ|ÁI˜ Àcqxˆ8 @`Øà¥Í5u×Ößë?ÿe¹Ïúÿÿ=ÿoüïýÿÿä·þ¿ù*ßý*(YJB!€y‚äAŽ•‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8€¶ðÿû8ÄÝ‚ -…þ†€*¤mßÑ Ñ4œ›]û¯·úÿ_ù›ý}ÿÐoÿÿgÿ_ÿÛü_ÿÿ ?²& ª·Å€#5j #ŒC¼ƒœRc þó¸ecü2=@F„ª– a p€XX‹û꯫þ£ËÿuÿRÊmßïßýIÿßÿ9ÿ¿õÎú¿äaÿþJ(yR³ŒApT&L˜¡rO±€vœ`@Ǧ*³«W`˜$níÚÿû8ÄÞLaU ~„Á}ª¤eßÕ0 ó ï÷ïÿ=öêAõüë÷õ>¯ü·ÿÿé7ú¿ÿÿ+ÿù‡ÿ@¥Œ%ò"`€$`,ž`Œƒ¨`ëa%Va@ ödóÕrg[ ²þÁ¸¦yDža‘ €¬Eé^ÓºþýÿÔéÿOû?úýMÿoük§ÿïþ4 ÿ¯üxg·òp"k\3ÓC8csb¦“K€S@ôS*z“ADð?”ø ‚“0€Æâð1p *€ÿû8ÄÞ ýU#.üHÁ‹ª¤%¯Ð˜Á±ÁKšÿÿ>ÿîŸüãÿ«ÿëoýô_ÿÿÿýD³·þG·ÿH.U*A„æ Æ:V&aê&»­‡JÚÆl¢®Æ£¨`Æ@¦ Æà`vÎ6$l/XlÂå6õ·ú«ÿ¯þq¿ÿÿžÿ¿þƒÿ¯ÿÿùêÿ«þQ?ÿÒ #òÐÒà8†&‚fxFÏ…ÆÓ›Ænþ¼‹†°›€b›ÈB¶†pˆè‡ÀPXª-ûÕûÏÛþÿû8ÄÞLU#.þˆA{*¤þPËoûú¿ÿþsþ¿ÿÛýDŸýÿóÿü˜p-$;ŠILHÈsÌòŒ ÀOL-à+(À q 90Ìà@Ñ€À9â@Õ8ƒ½µUÔßëGÿ9ïå–ÿ¶¿úŠÿö_û&ß÷ÿû–H—þ¿õ e{?%$¦N’ù€0@0O0FAÔ0u‚„0’«0 û2yê¹3­…Ù?ÿ`ÜÓ<¢ „O0Ø@V"ô¯ioNŸõ/ÿÿû8Äß‚K•U".þ¨m*¤eßÑwnþ¯þ¾ÿê_ÿÿÊÿÓÿÿùPÇý“þHcÙú`¢&°…Ã0 0l)1 t3†76*i4¸4E2§¡4ÄOùO€Ø)038 n/¡00( ¹¦®½»ÿßïØï_Ðõûÿ­_nÿû?ú¿ÿõ?ú¿äyïþA •JB!€y‚äAŽU‰˜z‰®ëaÒ¶±›(«±¨ê1…Pé‚Bñ8³€ „  Ö0­M»úÛ¿ú›ÿgÿû8Äå UU%Žþ¨™*£á¿Ð˜ÿ9ÿÿþ{ÿÿÎÿÿ¿ùÃ?û¯þFŸ·þD"Cj·Å€#5j #ŒC¼ƒœRc þó¸ecü2=@F„ª– a p€XX‹ýý}õš¯ýÕþ£#ݽOÿê5ÿ²ÿé7úÿÿÿ¹ ÿ¯þ\-ûJd z€Ô,@Âá°±ûê«ßýi¯ýÎÿËßÕì¿ë-ßÿM¿ÿÿ·úcÓÿ¿ýÏÿù &ÒC¸ `4”Á”Œ‡<Àp(Àá°À\ôÂÞ¸Ò@Ü Ó<Á~  üž$ Q@0ƒ€xh;ßÕïÿ?ÿt_¿™7W·ÿû8Äë‚L­U!ðꪤaßÕú~þ¿ùßú¿ÿoòÉÅÿ×þ¡ðmìüˆ•2t—È ‰€B‘€°y‚2¡ƒ¬!„” Y…'Ù“ÏUÉl.Éÿûàv™ådy†D‚ ±¥{Hý_ý?éÿ=»úýÿ·þÏþÿÿù ƒ·þ-fÏÓ9@‰¬!pÌ  LH áÍŠšM.MÑL©èFMqÀþSà6 L ÀN‹ÀÄAÀ0¨L Ç.i¯¯öÿžÿÕÿ;ÿ·ÿÏÿû8ÄêLUôê†*¤%¯Ð˜ÿÿùÏÿÿ÷ÿ8UÿÕÿ)ž³þAh¹T©"8˜.DéX™‡¨šî¶+k²Š»Ž¡ƒU~˜$ ?€!˜ `€amÓI¬Ú־ݿÕî­ýÇ__¯¿úéïÿœßëÿÿü ¿ÿÿÄ+ú|’8U¾,!¬{P˜(@YD`"Eà”$â“W÷˜•Ã+àùè"4#P±P„ÂÄX—×UUõçÿõ¿ùÿõÿýgÿû8ÄêƒLµU­þ„Áy*¤þP¿ïÿoõÿÿÿLzÿ×ÿ5-û@VEñ@Ài)ƒ)y€àQÂ#a€¸ é…¼q¥€1¸!‡&y‚ü@(0ø`¤ÀÌà1¸¼ D „ÀÀ 0lpRæ½~ÿëe×ÿ3oûÿúÿßÿ8ßêÿÿþp»ÿÿæg¿új5iBB €#˜à\Á˜ ¢*˜=àðlaÛ4ÍïQáûø¨›V¨0˜þŒ†â )y˜m6‹Þúÿ²“ÿØ…ÿ¸ÿû8ÄëLUU!-~„Áˆª£Ñ¿Ð˜½{z{¨êÿWÿÏoûúÊ¿û/úƒ+ì£ÉŒªßŒÖ=¨L ,Œ"0 "ðJ qIŒ+ûÌ Jᕌð|È@ô¨X„(Âab-÷Õûϯþ¯ú/þ¯oõ«ïÛÿ;ÿ_ÿïþfIÿùt·^¯× —!@û6UBÀá€bù…aŒò„D¹®BaÌÜ(KñŽˆ „  °_‰@@€AŒŽc}ô£öÿBÜwðÛíÿÿû8ÄêLW!ðêzª¤YßÕñ¾ú7þWÿ_ÿÿêOÿÿÿýTBà&¤Áê¾`¡„4a ÀaOÖan be¤áVhb Za%„<`&`G<:è€,1 ˜‘õuuç•ÿ·9ÿûÿ¨×þÿùÏýÿýöÍÿÿ¨}ò 4@‰®Bá˜6˜:Û4š\š¢™SÐŒšâ'ü§Àl˜€œ7ˆƒ€aP˜ Ž \Ó__ïþµÿÙû¯ÿêÿû8Äë‚M…U/õJw*ä¯Ð˜û«þ“ÿÿÿœ1ÿ²ÿé–¿ú€àer©RD p/0\ˆ1Ò±3Q5Ýl:VÖ3ev5C0ªý0H@~0'C¶p°#azÃf)·un¯ùÿû©ÿηúýÿçÿíÿ™·ú¿ÿoô‰?ý_ë%Qÿéd©6 ƒó€ã%Ã3j³Æ# t£kCgÓÃp„d(òQ‚À_„»,p1Éà(|4Â_õ}uR_ùÏù×ÿ_×ýi/ß²ÿæ/þ¦ÿû8Äè mU)®øHÁˆ*£Ñ¯Ð˜ÿõ7ùLw?û«ýÈi^Ý?¤J¬Jˆ (¦` FXæ І¡Æ`-¦@†¨ºH†ÿ@Æ ¸ æ ÀÀ`yÎP×CÌÈpÂ… ¬Âî­èÚ·úôö·û?ýôÿ©¿tÿqÇÿ·ÿÿlN/û/ü ·M¾- @TÉÒ_ 0&FÀ æÈ:†°P†P5fŸfO=W&u°»'ÿìÚg”A‰æ*Ä^•í!í«[·ú‘ÿ×ÿû8Äê‚L W#þ¨{*¤eßÑþQÿþßòß÷ÿÊ×ÿ÷ÿ@E¿ëÿŒö~€˜ ,’6@]!Ò,oÛ˜0í  ÏSA‹L¿u£Ð‡ ‰ÈÕ½ hAõ×\ŒBZ¹"¤bÄ}­»õ˜zïbnüüAȇ.µ†päC—¥oü^ã¶å¿òü¥‰ewñ܇)7+ÏÔßøÝ½J#+Ã䲯ééíÔÆéû…%%ŠñˆÅ'3¯Ož¹}¿ÖsuƒãóâÀnòÿû8Äì‚ÌYUþ†¨ª£•ýˆŽ¦‡Ãñ°ÀP`i2XFä_倰…\ÀÃN7þiOƒêRæ›LÙY¥€±šT/ÿÍN“nÙM1PŸØfr5ÿþf„šÀ• âÆXè¡çÚGˆÎJ¿ÿÿÙ©iŠ _4¥4Q"«wy–]ÿÿÿÿUÚš¯©Bêf1öZÜ¿ÿÿÿÿÿÿÿÿÿîE¢41YTÔô¦¬í4×ÿÀ¤‡$8ÒLAME3.99.5ªªªªªªªªªªªªªªªªªªªªªªÿû8Äç€ 1U!ðê‚¶ê¶¹€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÿû8ÄÁ€õe¹½4ƒ€ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªTAGThis is the id3v1 tagÿsonic-visualiser-3.0.3/svcore/data/fileio/test/encodings/スãƒãƒ¼ã‚¯ã®å¯ºé™¢.ogg0000644000000000000000000001667013111512442031667 0ustar 00000000000000OggSþ.wüA§vorbis}ðO¸OggSþ.wƒX~XZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉvorbis+Xiph.Org libVorbis I 20120203 (Omnipresent)TITLE=スãƒãƒ¼ã‚¯ã®å¯ºé™¢vorbis)BCV1L Å€ÐU`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€ÐU €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs?=?@=@>B@@@=AAD?pù[bÙ®¾ñ‚ ,8äC>äC¶ÛØÆ6¶±y‰D¶mÛ LÂðœK¡°·\ÿ]€ýR&VÚúù2Ó!xƒ÷ã ¢oa?†»w‡!Ù€ÈìÃÂræl˜nù¯çAóÃtàeÖ¶)“Ú´j3aÒÚ#¶ËÍúrÏCðüÖ`‰fáT¬ã¸¸¸0û–>£ ê2Ï]ðüÖ`‰æáî9¡ÐdñûQê2Ï]ð€aƒu „ÓÀ?ßw¬™y£n%êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ôú2Ï­à=ƒK „cð΃`މ¹Kº×êÒÏSðü6`‰æáT€uóm...̾ݺú2Ï­à=ømÀÍ+€{N(ôYü~T'@êÒÏSð€á€u „ÓÀ?ßw¬™y£n%êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ô$ êÒÏSð€Á€% Â1À;J€96&æ.é^ êÒÏSðü6`‰fáT°Ž àââÂì[úŒ.@ÐêÒÏSðü6`‰æáÀ='úÀ€,~?ª êÒÏSð€á€u „Ó ÿ|ß°~d井 êÒÏSð€á€u „cð×G%ÀéÈÕ¸^ô$ êÒÏSð€Á€% Â1À;J€96&æ.é^ úrÏCðüÖ`‰fáT¬ã¸¸¸0û–>£ ú2Ï­à=ømÀÍ+ (÷œPè²øý¨N€ htú2Ï­à=Ãë0@§@@€ åŸï;Ö̼Q·$&€Æú2Ï­à=Ãë0@Ç@Ê_•§#WãzxÑ $@ÐØú2Ï­à=ƒK „c@yçA 0ÇÆÄÜ%Ýk$6иêÒÏSðü6`‰fáT €ZÇ?pqqaö-}F €Æú2Ï­à=ømÀÍ+Â@Ê='úÀ€,~?ª htú2Ï­à=Ãë0@§ åŸï;Ö̼Q· ÀàÆú2Ï­à=Ãë0@Ç Pþú¨8¹×Ë^$@ÐØú2Ï­à=ƒK „c@Ê;J€96&æ.é^6иú2Ï­à=ømÀÍ*©@­ã¸¸¸0û–>£ €Æú2Ï­à=ømÀÍ+Â@Ê='úÀ€,~?ª htú2Ï­à=Ãë0@§ åŸï;Ö̼Q· ÀàÆú2Ï­à=Ãë0@Ç Pþú¨8¹×Ë^$@ÐØú2Ï­à=ƒK „c@yçA 0ÇÆÄÜ%Ýk˜l qú2ÏSðü6`‰fáT Öñ\\\˜}KŸÑ@cú2Ï­à=ømÀÍ+Â@¹ç„@ÅïGu ±Ðèú2ÏSð€á€u „Ó(€òÏ÷ëGæ@Þ¨[‰pD€%ê2ÏCð€aƒu „cJ‘Å,€€ò×G%ÀéÈÕ¸^ô€*8?X&úrÏCð€Aƒ% Â1¥Èb  ¼ó ˜ccbî’î5€@ üÏD LNúrÏCðüÖ`‰fáT”"‹Y@jÿÀÅÅ…Ù·ô]@P4Àu €BêÒÏCðü6`‰æáeH—EPJÊ='úÀ€,~?ªÔX¨¼7: úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð `ýÈÈu+1 x?€ ê2ÏCð€aƒu „cJ!] @ @ùë£àtäj\/z€ €à‹j%€ € úrÏCð€Aƒ% Â1¥Èb (%å%Às—t¯ lTÀß@”:@àAáúrÏCðüÖ`‰fáT”‘Å, µŽ àââÂì[úŒ. hÿÀ€BêÒÏCðü6`‰æáµÈbA)(÷œPè²øý¨N@H8¾+€ úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð`ýÈÈu+1 /øŽ€ êÒÏCð€á€u „cJ!] @ @ùë£àtäj\/z€@üŸ°(L<(<úrÏCð€Aƒ% Â1•YÌ"¥ ¼ó ˜ccbî’î5€xüÏD L6(œú2ÏSðü6`‰fáTT:d1‹@­ã¸¸¸0û–>£ ÀฎPèú2ÏSðü6`‰æáµ.‹ ””{N(ôYü~T' /$°Pxot&úrÏCð€aƒu „Ó Ò¡ŸY@ùçûð `ýÈÈu+1 x?€ ê2ÏCð€aƒu „c*¤Ë"@Ê_•§#WãzxÑ l€_T¸¢0úrÏCð€Aƒ% Â1•YÌ"¥ ¼ó ˜ccbî’î5€ ðø»ˆ@è<(œêÒÏCðü6`‰fáTÔ"‹Y@­ã¸¸¸0û–>£ HÀ ÿÀ:ê2ÏCðüÖ`‰æáµÈb (%åž }`@¿Õ HÀ Ç!Àw°&&úrÏCð€aƒu „Ó Ò¡ŸY@Ê?ßw€7ëGæ@Þ¨[‰€OÀ ¾£P8úrÏCð€aƒu „c*¤Ë"(@ùë£àtäj\/z€xðïó~Ùô6žS³¦i𦝱×Gsonic-visualiser-3.0.3/svcore/data/fileio/test/files.pri0000644000000000000000000000034213111512442021411 0ustar 00000000000000 TEST_HEADERS += \ AudioFileReaderTest.h \ AudioFileWriterTest.h \ AudioTestData.h \ EncodingTest.h \ MIDIFileReaderTest.h TEST_SOURCES += \ svcore-data-fileio-test.cpp sonic-visualiser-3.0.3/svcore/data/fileio/test/midi/scale.mid0000644000000000000000000000047613111512442022307 0ustar 00000000000000MThdàMTrkxÿ#Copyright (c) xxxx Copyright HolderÿCreated by Rosegardenÿhttp://www.rosegardenmusic.com/ÿQ¡ ÿX‹Üÿ/MTrk¨ÿ° À° @]d[dƒ`€>@@dƒ`€@@Adƒ`€A@Cdƒ`€C@Edƒ`€E@Gdƒ`€G@Hdƒ`€H@Jdƒ`€J@Ldƒ`€L@Mdƒ`€M@Odƒ`€O@Qdƒ`€Q@Sdƒ`€S@Tdƒ`€T@‹£`ÿ/sonic-visualiser-3.0.3/svcore/data/fileio/test/midi/아브ë¼ì¹´ë‹¤ë¸Œë¼.mid0000644000000000000000000000047613111512442031035 0ustar 00000000000000MThdàMTrkxÿ#Copyright (c) xxxx Copyright HolderÿCreated by Rosegardenÿhttp://www.rosegardenmusic.com/ÿQ¡ ÿX‹Üÿ/MTrk¨ÿ° À° @]d[dƒ`€>@@dƒ`€@@Adƒ`€A@Cdƒ`€C@Edƒ`€E@Gdƒ`€G@Hdƒ`€H@Jdƒ`€J@Ldƒ`€L@Mdƒ`€M@Odƒ`€O@Qdƒ`€Q@Sdƒ`€S@Tdƒ`€T@‹£`ÿ/sonic-visualiser-3.0.3/svcore/data/fileio/test/svcore-data-fileio-test.cpp0000644000000000000000000000410413111512442024731 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2013 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "AudioFileReaderTest.h" #include "AudioFileWriterTest.h" #include "EncodingTest.h" #include "MIDIFileReaderTest.h" #include #include int main(int argc, char *argv[]) { int good = 0, bad = 0; QString testDir; #ifdef Q_OS_WIN // incredible to have to hardcode this, but I just can't figure out how to // get QMAKE_POST_LINK to add an arg to its command successfully on Windows testDir = "../sonic-visualiser/svcore/data/fileio/test"; #endif if (argc > 1) { cerr << "argc = " << argc << endl; testDir = argv[1]; } if (testDir != "") { cerr << "Setting test directory base path to \"" << testDir << "\"" << endl; } QCoreApplication app(argc, argv); app.setOrganizationName("sonic-visualiser"); app.setApplicationName("test-fileio"); { AudioFileReaderTest t(testDir); if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { AudioFileWriterTest t(testDir); if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { EncodingTest t(testDir); if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } { MIDIFileReaderTest t(testDir); if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } if (bad > 0) { cerr << "\n********* " << bad << " test suite(s) failed!\n" << endl; return 1; } else { cerr << "All tests passed" << endl; return 0; } } sonic-visualiser-3.0.3/svcore/data/midi/MIDIEvent.h0000644000000000000000000002213213111512442020165 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Richard Bown and Chris Cannam. */ #ifndef _MIDI_EVENT_H_ #define _MIDI_EVENT_H_ #include #include #include #include #include "base/Debug.h" typedef unsigned char MIDIByte; namespace MIDIConstants { static const char *const MIDI_FILE_HEADER = "MThd"; static const char *const MIDI_TRACK_HEADER = "MTrk"; static const MIDIByte MIDI_STATUS_BYTE_MASK = 0x80; static const MIDIByte MIDI_MESSAGE_TYPE_MASK = 0xF0; static const MIDIByte MIDI_CHANNEL_NUM_MASK = 0x0F; static const MIDIByte MIDI_NOTE_OFF = 0x80; static const MIDIByte MIDI_NOTE_ON = 0x90; static const MIDIByte MIDI_POLY_AFTERTOUCH = 0xA0; static const MIDIByte MIDI_CTRL_CHANGE = 0xB0; static const MIDIByte MIDI_PROG_CHANGE = 0xC0; static const MIDIByte MIDI_CHNL_AFTERTOUCH = 0xD0; static const MIDIByte MIDI_PITCH_BEND = 0xE0; static const MIDIByte MIDI_SELECT_CHNL_MODE = 0xB0; static const MIDIByte MIDI_SYSTEM_EXCLUSIVE = 0xF0; static const MIDIByte MIDI_TC_QUARTER_FRAME = 0xF1; static const MIDIByte MIDI_SONG_POSITION_PTR = 0xF2; static const MIDIByte MIDI_SONG_SELECT = 0xF3; static const MIDIByte MIDI_TUNE_REQUEST = 0xF6; static const MIDIByte MIDI_END_OF_EXCLUSIVE = 0xF7; static const MIDIByte MIDI_TIMING_CLOCK = 0xF8; static const MIDIByte MIDI_START = 0xFA; static const MIDIByte MIDI_CONTINUE = 0xFB; static const MIDIByte MIDI_STOP = 0xFC; static const MIDIByte MIDI_ACTIVE_SENSING = 0xFE; static const MIDIByte MIDI_SYSTEM_RESET = 0xFF; static const MIDIByte MIDI_SYSEX_NONCOMMERCIAL = 0x7D; static const MIDIByte MIDI_SYSEX_NON_RT = 0x7E; static const MIDIByte MIDI_SYSEX_RT = 0x7F; static const MIDIByte MIDI_SYSEX_RT_COMMAND = 0x06; static const MIDIByte MIDI_SYSEX_RT_RESPONSE = 0x07; static const MIDIByte MIDI_MMC_STOP = 0x01; static const MIDIByte MIDI_MMC_PLAY = 0x02; static const MIDIByte MIDI_MMC_DEFERRED_PLAY = 0x03; static const MIDIByte MIDI_MMC_FAST_FORWARD = 0x04; static const MIDIByte MIDI_MMC_REWIND = 0x05; static const MIDIByte MIDI_MMC_RECORD_STROBE = 0x06; static const MIDIByte MIDI_MMC_RECORD_EXIT = 0x07; static const MIDIByte MIDI_MMC_RECORD_PAUSE = 0x08; static const MIDIByte MIDI_MMC_PAUSE = 0x08; static const MIDIByte MIDI_MMC_EJECT = 0x0A; static const MIDIByte MIDI_MMC_LOCATE = 0x44; static const MIDIByte MIDI_FILE_META_EVENT = 0xFF; static const MIDIByte MIDI_SEQUENCE_NUMBER = 0x00; static const MIDIByte MIDI_TEXT_EVENT = 0x01; static const MIDIByte MIDI_COPYRIGHT_NOTICE = 0x02; static const MIDIByte MIDI_TRACK_NAME = 0x03; static const MIDIByte MIDI_INSTRUMENT_NAME = 0x04; static const MIDIByte MIDI_LYRIC = 0x05; static const MIDIByte MIDI_TEXT_MARKER = 0x06; static const MIDIByte MIDI_CUE_POINT = 0x07; static const MIDIByte MIDI_CHANNEL_PREFIX = 0x20; static const MIDIByte MIDI_CHANNEL_PREFIX_OR_PORT = 0x21; static const MIDIByte MIDI_END_OF_TRACK = 0x2F; static const MIDIByte MIDI_SET_TEMPO = 0x51; static const MIDIByte MIDI_SMPTE_OFFSET = 0x54; static const MIDIByte MIDI_TIME_SIGNATURE = 0x58; static const MIDIByte MIDI_KEY_SIGNATURE = 0x59; static const MIDIByte MIDI_SEQUENCER_SPECIFIC = 0x7F; static const MIDIByte MIDI_CONTROLLER_BANK_MSB = 0x00; static const MIDIByte MIDI_CONTROLLER_VOLUME = 0x07; static const MIDIByte MIDI_CONTROLLER_BANK_LSB = 0x20; static const MIDIByte MIDI_CONTROLLER_MODULATION = 0x01; static const MIDIByte MIDI_CONTROLLER_PAN = 0x0A; static const MIDIByte MIDI_CONTROLLER_SUSTAIN = 0x40; static const MIDIByte MIDI_CONTROLLER_RESONANCE = 0x47; static const MIDIByte MIDI_CONTROLLER_RELEASE = 0x48; static const MIDIByte MIDI_CONTROLLER_ATTACK = 0x49; static const MIDIByte MIDI_CONTROLLER_FILTER = 0x4A; static const MIDIByte MIDI_CONTROLLER_REVERB = 0x5B; static const MIDIByte MIDI_CONTROLLER_CHORUS = 0x5D; static const MIDIByte MIDI_CONTROLLER_NRPN_1 = 0x62; static const MIDIByte MIDI_CONTROLLER_NRPN_2 = 0x63; static const MIDIByte MIDI_CONTROLLER_RPN_1 = 0x64; static const MIDIByte MIDI_CONTROLLER_RPN_2 = 0x65; static const MIDIByte MIDI_CONTROLLER_SOUNDS_OFF = 0x78; static const MIDIByte MIDI_CONTROLLER_RESET = 0x79; static const MIDIByte MIDI_CONTROLLER_LOCAL = 0x7A; static const MIDIByte MIDI_CONTROLLER_ALL_NOTES_OFF = 0x7B; static const MIDIByte MIDI_PERCUSSION_CHANNEL = 9; } class MIDIEvent { public: MIDIEvent(unsigned long deltaTime, int eventCode, int data1 = 0, int data2 = 0) : m_deltaTime(deltaTime), m_duration(0), m_metaEventCode(0) { if (eventCode < 0 || eventCode > 0xff || data1 < 0 || data1 > 0xff || data2 < 0 || data2 > 0xff) { throw std::domain_error("not all args within byte range"); } m_eventCode = MIDIByte(eventCode); m_data1 = MIDIByte(data1); m_data2 = MIDIByte(data2); } MIDIEvent(unsigned long deltaTime, MIDIByte eventCode, MIDIByte metaEventCode, const std::string &metaMessage) : m_deltaTime(deltaTime), m_duration(0), m_eventCode(eventCode), m_data1(0), m_data2(0), m_metaEventCode(metaEventCode), m_metaMessage(metaMessage) { } MIDIEvent(unsigned long deltaTime, MIDIByte eventCode, const std::string &sysEx) : m_deltaTime(deltaTime), m_duration(0), m_eventCode(eventCode), m_data1(0), m_data2(0), m_metaEventCode(0), m_metaMessage(sysEx) { } ~MIDIEvent() { } void setTime(const unsigned long &time) { m_deltaTime = time; } void setDuration(const unsigned long& duration) { m_duration = duration;} unsigned long addTime(const unsigned long &time) { m_deltaTime += time; return m_deltaTime; } MIDIByte getMessageType() const { return (m_eventCode & MIDIConstants::MIDI_MESSAGE_TYPE_MASK); } MIDIByte getChannelNumber() const { return (m_eventCode & MIDIConstants::MIDI_CHANNEL_NUM_MASK); } unsigned long getTime() const { return m_deltaTime; } unsigned long getDuration() const { return m_duration; } MIDIByte getPitch() const { return m_data1; } MIDIByte getVelocity() const { return m_data2; } MIDIByte getData1() const { return m_data1; } MIDIByte getData2() const { return m_data2; } MIDIByte getEventCode() const { return m_eventCode; } bool isMeta() const { return (m_eventCode == MIDIConstants::MIDI_FILE_META_EVENT); } MIDIByte getMetaEventCode() const { return m_metaEventCode; } std::string getMetaMessage() const { return m_metaMessage; } void setMetaMessage(const std::string &meta) { m_metaMessage = meta; } friend bool operator<(const MIDIEvent &a, const MIDIEvent &b); private: MIDIEvent& operator=(const MIDIEvent); unsigned long m_deltaTime; unsigned long m_duration; MIDIByte m_eventCode; MIDIByte m_data1; // or Note MIDIByte m_data2; // or Velocity MIDIByte m_metaEventCode; std::string m_metaMessage; }; // Comparator for sorting // struct MIDIEventCmp { bool operator()(const MIDIEvent &mE1, const MIDIEvent &mE2) const { return mE1.getTime() < mE2.getTime(); } bool operator()(const MIDIEvent *mE1, const MIDIEvent *mE2) const { return mE1->getTime() < mE2->getTime(); } }; class MIDIException : virtual public std::exception { public: MIDIException(QString message) throw() : m_message(message) { std::cerr << "WARNING: MIDI exception: " << message.toLocal8Bit().data() << std::endl; } virtual ~MIDIException() throw() { } virtual const char *what() const throw() { return m_message.toLocal8Bit().data(); } protected: QString m_message; }; #endif sonic-visualiser-3.0.3/svcore/data/midi/MIDIInput.cpp0000644000000000000000000000773613111512442020553 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2009 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "MIDIInput.h" #include "rtmidi/RtMidi.h" #include "system/System.h" MIDIInput::MIDIInput(QString name, FrameTimer *timer) : m_rtmidi(0), m_frameTimer(timer), m_buffer(1023) { try { std::vector apis; RtMidi::getCompiledApi(apis); RtMidi::Api preferredApi = RtMidi::UNSPECIFIED; for (auto a: apis) { if (a == RtMidi::UNSPECIFIED || a == RtMidi::RTMIDI_DUMMY) { continue; } preferredApi = a; break; } if (preferredApi == RtMidi::UNSPECIFIED) { SVCERR << "ERROR: MIDIInput: No RtMidi APIs compiled in" << endl; } else { m_rtmidi = new RtMidiIn(preferredApi, name.toStdString()); int n = m_rtmidi->getPortCount(); if (n == 0) { SVDEBUG << "NOTE: MIDIInput: No input ports available" << endl; delete m_rtmidi; m_rtmidi = 0; } else { m_rtmidi->setCallback(staticCallback, this); SVDEBUG << "MIDIInput: Available ports are:" << endl; for (int i = 0; i < n; ++i) { SVDEBUG << i << ". " << m_rtmidi->getPortName(i) << endl; } SVDEBUG << "MIDIInput: Using first port (\"" << m_rtmidi->getPortName(0) << "\")" << endl; m_rtmidi->openPort(0, tr("Input").toStdString()); } } } catch (RtMidiError e) { SVCERR << "ERROR: RtMidi error: " << e.getMessage() << endl; delete m_rtmidi; m_rtmidi = 0; } } MIDIInput::~MIDIInput() { delete m_rtmidi; } void MIDIInput::staticCallback(double timestamp, std::vector *message, void *userData) { ((MIDIInput *)userData)->callback(timestamp, message); } void MIDIInput::callback(double timestamp, std::vector *message) { SVDEBUG << "MIDIInput::callback(" << timestamp << ")" << endl; // In my experience so far, the timings passed to this function // are not reliable enough to use. We request instead an audio // frame time from whatever FrameTimer we have been given, and use // that as the event time. if (!message || message->empty()) return; unsigned long t = m_frameTimer->getFrame(); MIDIByte code = (*message)[0]; MIDIEvent ev(t, code, message->size() > 1 ? (*message)[1] : 0, message->size() > 2 ? (*message)[2] : 0); postEvent(ev); } MIDIEvent MIDIInput::readEvent() { MIDIEvent *event = m_buffer.readOne(); MIDIEvent revent = *event; delete event; return revent; } void MIDIInput::postEvent(MIDIEvent e) { int count = 0, max = 5; while (m_buffer.getWriteSpace() == 0) { if (count == max) { SVCERR << "ERROR: MIDIInput::postEvent: MIDI event queue is full and not clearing -- abandoning incoming event" << endl; return; } SVCERR << "WARNING: MIDIInput::postEvent: MIDI event queue (capacity " << m_buffer.getSize() << " is full!" << endl; SVDEBUG << "Waiting for something to be processed" << endl; #ifdef _WIN32 Sleep(1); #else sleep(1); #endif count++; } MIDIEvent *me = new MIDIEvent(e); m_buffer.write(&me, 1); emit eventsAvailable(); } sonic-visualiser-3.0.3/svcore/data/midi/MIDIInput.h0000644000000000000000000000267213111512442020212 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2009 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MIDI_INPUT_H_ #define _MIDI_INPUT_H_ #include #include "MIDIEvent.h" #include #include "base/RingBuffer.h" #include "base/FrameTimer.h" class RtMidiIn; class MIDIInput : public QObject { Q_OBJECT public: MIDIInput(QString name, FrameTimer *timer); virtual ~MIDIInput(); bool isOK() const { return m_rtmidi != 0; } bool isEmpty() const { return getEventsAvailable() == 0; } int getEventsAvailable() const { return m_buffer.getReadSpace(); } MIDIEvent readEvent(); signals: void eventsAvailable(); protected: RtMidiIn *m_rtmidi; FrameTimer *m_frameTimer; static void staticCallback(double, std::vector *, void *); void callback(double, std::vector *); void postEvent(MIDIEvent); RingBuffer m_buffer; }; #endif sonic-visualiser-3.0.3/svcore/data/midi/rtmidi/RtMidi.cpp0000644000000000000000000026633013111512442021466 0ustar 00000000000000/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2016 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ #include "RtMidi.h" #include // CC be gung-ho about this here, assume upstream has it in hand #pragma GCC diagnostic ignored "-Wconversion" #if defined(__MACOSX_CORE__) #if TARGET_OS_IPHONE #define AudioGetCurrentHostTime CAHostTimeBase::GetCurrentTime #define AudioConvertHostTimeToNanos CAHostTimeBase::ConvertToNanos #endif #endif //*********************************************************************// // RtMidi Definitions //*********************************************************************// RtMidi :: RtMidi() : rtapi_(0) { } RtMidi :: ~RtMidi() { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; } std::string RtMidi :: getVersion( void ) throw() { return std::string( RTMIDI_VERSION ); } void RtMidi :: getCompiledApi( std::vector &apis ) throw() { apis.clear(); // The order here will control the order of RtMidi's API search in // the constructor. #if defined(__MACOSX_CORE__) apis.push_back( MACOSX_CORE ); #endif #if defined(__LINUX_ALSA__) apis.push_back( LINUX_ALSA ); #endif #if defined(__UNIX_JACK__) apis.push_back( UNIX_JACK ); #endif #if defined(__WINDOWS_MM__) apis.push_back( WINDOWS_MM ); #endif #if defined(__RTMIDI_DUMMY__) apis.push_back( RTMIDI_DUMMY ); #endif } //*********************************************************************// // RtMidiIn Definitions //*********************************************************************// void RtMidiIn :: openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit ) { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new MidiInJack( clientName, queueSizeLimit ); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new MidiInAlsa( clientName, queueSizeLimit ); #endif #if defined(__WINDOWS_MM__) if ( api == WINDOWS_MM ) rtapi_ = new MidiInWinMM( clientName, queueSizeLimit ); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new MidiInCore( clientName, queueSizeLimit ); #endif #if defined(__RTMIDI_DUMMY__) if ( api == RTMIDI_DUMMY ) rtapi_ = new MidiInDummy( clientName, queueSizeLimit ); #endif } RtMidiIn :: RtMidiIn( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit ) : RtMidi() { if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openMidiApi( api, clientName, queueSizeLimit ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a warning // and continue as if no API was specified. std::cerr << "\nRtMidiIn: no compiled support for specified API argument!\n\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one port or we reach the end of the list. std::vector< RtMidi::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetPortCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTMIDI_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll throw an error. std::string errorText = "RtMidiIn: no compiled API support found ... critical error!!"; throw( RtMidiError( errorText, RtMidiError::UNSPECIFIED ) ); } RtMidiIn :: ~RtMidiIn() throw() { } //*********************************************************************// // RtMidiOut Definitions //*********************************************************************// void RtMidiOut :: openMidiApi( RtMidi::Api api, const std::string clientName ) { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new MidiOutJack( clientName ); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new MidiOutAlsa( clientName ); #endif #if defined(__WINDOWS_MM__) if ( api == WINDOWS_MM ) rtapi_ = new MidiOutWinMM( clientName ); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new MidiOutCore( clientName ); #endif #if defined(__RTMIDI_DUMMY__) if ( api == RTMIDI_DUMMY ) rtapi_ = new MidiOutDummy( clientName ); #endif } RtMidiOut :: RtMidiOut( RtMidi::Api api, const std::string clientName ) { if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openMidiApi( api, clientName ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a warning // and continue as if no API was specified. std::cerr << "\nRtMidiOut: no compiled support for specified API argument!\n\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one port or we reach the end of the list. std::vector< RtMidi::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetPortCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTMIDI_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll thrown an error. std::string errorText = "RtMidiOut: no compiled API support found ... critical error!!"; throw( RtMidiError( errorText, RtMidiError::UNSPECIFIED ) ); } RtMidiOut :: ~RtMidiOut() throw() { } //*********************************************************************// // Common MidiApi Definitions //*********************************************************************// MidiApi :: MidiApi( void ) : apiData_( 0 ), connected_( false ), errorCallback_(0), errorCallbackUserData_(0) { } MidiApi :: ~MidiApi( void ) { } void MidiApi :: setErrorCallback( RtMidiErrorCallback errorCallback, void *userData = 0 ) { errorCallback_ = errorCallback; errorCallbackUserData_ = userData; } void MidiApi :: error( RtMidiError::Type type, std::string errorString ) { if ( errorCallback_ ) { if ( firstErrorOccurred_ ) return; firstErrorOccurred_ = true; const std::string errorMessage = errorString; errorCallback_( type, errorMessage, errorCallbackUserData_); firstErrorOccurred_ = false; return; } if ( type == RtMidiError::WARNING ) { std::cerr << '\n' << errorString << "\n\n"; } else if ( type == RtMidiError::DEBUG_WARNING ) { #if defined(__RTMIDI_DEBUG__) std::cerr << '\n' << errorString << "\n\n"; #endif } else { std::cerr << '\n' << errorString << "\n\n"; throw RtMidiError( errorString, type ); } } //*********************************************************************// // Common MidiInApi Definitions //*********************************************************************// MidiInApi :: MidiInApi( unsigned int queueSizeLimit ) : MidiApi() { // Allocate the MIDI queue. inputData_.queue.ringSize = queueSizeLimit; if ( inputData_.queue.ringSize > 0 ) inputData_.queue.ring = new MidiMessage[ inputData_.queue.ringSize ]; } MidiInApi :: ~MidiInApi( void ) { // Delete the MIDI queue. if ( inputData_.queue.ringSize > 0 ) delete [] inputData_.queue.ring; } void MidiInApi :: setCallback( RtMidiIn::RtMidiCallback callback, void *userData ) { if ( inputData_.usingCallback ) { errorString_ = "MidiInApi::setCallback: a callback function is already set!"; error( RtMidiError::WARNING, errorString_ ); return; } if ( !callback ) { errorString_ = "RtMidiIn::setCallback: callback function value is invalid!"; error( RtMidiError::WARNING, errorString_ ); return; } inputData_.userCallback = callback; inputData_.userData = userData; inputData_.usingCallback = true; } void MidiInApi :: cancelCallback() { if ( !inputData_.usingCallback ) { errorString_ = "RtMidiIn::cancelCallback: no callback function was set!"; error( RtMidiError::WARNING, errorString_ ); return; } inputData_.userCallback = 0; inputData_.userData = 0; inputData_.usingCallback = false; } void MidiInApi :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { inputData_.ignoreFlags = 0; if ( midiSysex ) inputData_.ignoreFlags = 0x01; if ( midiTime ) inputData_.ignoreFlags |= 0x02; if ( midiSense ) inputData_.ignoreFlags |= 0x04; } double MidiInApi :: getMessage( std::vector *message ) { message->clear(); if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::getNextMessage: a user callback is currently set for this port."; error( RtMidiError::WARNING, errorString_ ); return 0.0; } if ( inputData_.queue.size == 0 ) return 0.0; // Copy queued message to the vector pointer argument and then "pop" it. std::vector *bytes = &(inputData_.queue.ring[inputData_.queue.front].bytes); message->assign( bytes->begin(), bytes->end() ); double deltaTime = inputData_.queue.ring[inputData_.queue.front].timeStamp; inputData_.queue.size--; inputData_.queue.front++; if ( inputData_.queue.front == inputData_.queue.ringSize ) inputData_.queue.front = 0; return deltaTime; } //*********************************************************************// // Common MidiOutApi Definitions //*********************************************************************// MidiOutApi :: MidiOutApi( void ) : MidiApi() { } MidiOutApi :: ~MidiOutApi( void ) { } // *************************************************** // // // OS/API-specific methods. // // *************************************************** // #if defined(__MACOSX_CORE__) // The CoreMIDI API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // OS-X CoreMIDI header files. #include #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct CoreMidiData { MIDIClientRef client; MIDIPortRef port; MIDIEndpointRef endpoint; MIDIEndpointRef destinationId; unsigned long long lastTime; MIDISysexSendRequest sysexreq; }; //*********************************************************************// // API: OS-X // Class Definitions: MidiInCore //*********************************************************************// static void midiInputCallback( const MIDIPacketList *list, void *procRef, void */*srcRef*/ ) { MidiInApi::RtMidiInData *data = static_cast (procRef); CoreMidiData *apiData = static_cast (data->apiData); unsigned char status; unsigned short nBytes, iByte, size; unsigned long long time; bool& continueSysex = data->continueSysex; MidiInApi::MidiMessage& message = data->message; const MIDIPacket *packet = &list->packet[0]; for ( unsigned int i=0; inumPackets; ++i ) { // My interpretation of the CoreMIDI documentation: all message // types, except sysex, are complete within a packet and there may // be several of them in a single packet. Sysex messages can be // broken across multiple packets and PacketLists but are bundled // alone within each packet (these packets do not contain other // message types). If sysex messages are split across multiple // MIDIPacketLists, they must be handled by multiple calls to this // function. nBytes = packet->length; if ( nBytes == 0 ) continue; // Calculate time stamp. if ( data->firstMessage ) { message.timeStamp = 0.0; data->firstMessage = false; } else { time = packet->timeStamp; if ( time == 0 ) { // this happens when receiving asynchronous sysex messages time = AudioGetCurrentHostTime(); } time -= apiData->lastTime; time = AudioConvertHostTimeToNanos( time ); if ( !continueSysex ) message.timeStamp = time * 0.000000001; } apiData->lastTime = packet->timeStamp; if ( apiData->lastTime == 0 ) { // this happens when receiving asynchronous sysex messages apiData->lastTime = AudioGetCurrentHostTime(); } //std::cout << "TimeStamp = " << packet->timeStamp << std::endl; iByte = 0; if ( continueSysex ) { // We have a continuing, segmented sysex message. if ( !( data->ignoreFlags & 0x01 ) ) { // If we're not ignoring sysex messages, copy the entire packet. for ( unsigned int j=0; jdata[j] ); } continueSysex = packet->data[nBytes-1] != 0xF7; if ( !( data->ignoreFlags & 0x01 ) && !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nMidiInCore: message queue limit reached!!\n\n"; } message.bytes.clear(); } } else { while ( iByte < nBytes ) { size = 0; // We are expecting that the next byte in the packet is a status byte. status = packet->data[iByte]; if ( !(status & 0x80) ) break; // Determine the number of bytes in the MIDI message. if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status == 0xF0 ) { // A MIDI sysex if ( data->ignoreFlags & 0x01 ) { size = 0; iByte = nBytes; } else size = nBytes - iByte; continueSysex = packet->data[nBytes-1] != 0xF7; } else if ( status == 0xF1 ) { // A MIDI time code message if ( data->ignoreFlags & 0x02 ) { size = 0; iByte += 2; } else size = 2; } else if ( status == 0xF2 ) size = 3; else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 && ( data->ignoreFlags & 0x02 ) ) { // A MIDI timing tick message and we're ignoring it. size = 0; iByte += 1; } else if ( status == 0xFE && ( data->ignoreFlags & 0x04 ) ) { // A MIDI active sensing message and we're ignoring it. size = 0; iByte += 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &packet->data[iByte], &packet->data[iByte+size] ); if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nMidiInCore: message queue limit reached!!\n\n"; } message.bytes.clear(); } iByte += size; } } } packet = MIDIPacketNext(packet); } } MidiInCore :: MidiInCore( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } MidiInCore :: ~MidiInCore( void ) { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } void MidiInCore :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; CFStringRef name = CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ); OSStatus result = MIDIClientCreate(name, NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "MidiInCore::initialize: error creating OS-X MIDI client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; inputData_.apiData = (void *) data; CFRelease(name); } void MidiInCore :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiInCore::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); unsigned int nSrc = MIDIGetNumberOfSources(); if (nSrc < 1) { errorString_ = "MidiInCore::openPort: no MIDI input sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nSrc ) { std::ostringstream ost; ost << "MidiInCore::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIInputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "MidiInCore::openPort: error creating OS-X MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Get the desired input source identifier. MIDIEndpointRef endpoint = MIDIGetSource( portNumber ); if ( endpoint == 0 ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "MidiInCore::openPort: error getting MIDI input source reference."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Make the connection. result = MIDIPortConnectSource( port, endpoint, NULL ); if ( result != noErr ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "MidiInCore::openPort: error connecting OS-X MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific port information. data->port = port; connected_ = true; } void MidiInCore :: openVirtualPort( const std::string portName ) { CoreMidiData *data = static_cast (apiData_); // Create a virtual MIDI input destination. MIDIEndpointRef endpoint; OSStatus result = MIDIDestinationCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &endpoint ); if ( result != noErr ) { errorString_ = "MidiInCore::openVirtualPort: error creating virtual OS-X MIDI destination."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. data->endpoint = endpoint; } void MidiInCore :: closePort( void ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { MIDIEndpointDispose( data->endpoint ); } if ( data->port ) { MIDIPortDispose( data->port ); } connected_ = false; } unsigned int MidiInCore :: getPortCount() { CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); return MIDIGetNumberOfSources(); } // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. CFStringRef EndpointName( MIDIEndpointRef endpoint, bool isExternal ) { CFMutableStringRef result = CFStringCreateMutable( NULL, 0 ); CFStringRef str; // Begin with the endpoint's name. str = NULL; MIDIObjectGetStringProperty( endpoint, kMIDIPropertyName, &str ); if ( str != NULL ) { CFStringAppend( result, str ); CFRelease( str ); } MIDIEntityRef entity = 0; MIDIEndpointGetEntity( endpoint, &entity ); if ( entity == 0 ) // probably virtual return result; if ( CFStringGetLength( result ) == 0 ) { // endpoint name has zero length -- try the entity str = NULL; MIDIObjectGetStringProperty( entity, kMIDIPropertyName, &str ); if ( str != NULL ) { CFStringAppend( result, str ); CFRelease( str ); } } // now consider the device's name MIDIDeviceRef device = 0; MIDIEntityGetDevice( entity, &device ); if ( device == 0 ) return result; str = NULL; MIDIObjectGetStringProperty( device, kMIDIPropertyName, &str ); if ( CFStringGetLength( result ) == 0 ) { CFRelease( result ); return str; } if ( str != NULL ) { // if an external device has only one entity, throw away // the endpoint name and just use the device name if ( isExternal && MIDIDeviceGetNumberOfEntities( device ) < 2 ) { CFRelease( result ); return str; } else { if ( CFStringGetLength( str ) == 0 ) { CFRelease( str ); return result; } // does the entity name already start with the device name? // (some drivers do this though they shouldn't) // if so, do not prepend if ( CFStringCompareWithOptions( result, /* endpoint name */ str /* device name */, CFRangeMake(0, CFStringGetLength( str ) ), 0 ) != kCFCompareEqualTo ) { // prepend the device name to the entity name if ( CFStringGetLength( result ) > 0 ) CFStringInsert( result, 0, CFSTR(" ") ); CFStringInsert( result, 0, str ); } CFRelease( str ); } } return result; } // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. static CFStringRef ConnectedEndpointName( MIDIEndpointRef endpoint ) { CFMutableStringRef result = CFStringCreateMutable( NULL, 0 ); CFStringRef str; OSStatus err; int i; // Does the endpoint have connections? CFDataRef connections = NULL; int nConnected = 0; bool anyStrings = false; err = MIDIObjectGetDataProperty( endpoint, kMIDIPropertyConnectionUniqueID, &connections ); if ( connections != NULL ) { // It has connections, follow them // Concatenate the names of all connected devices nConnected = CFDataGetLength( connections ) / sizeof(MIDIUniqueID); if ( nConnected ) { const SInt32 *pid = (const SInt32 *)(CFDataGetBytePtr(connections)); for ( i=0; i= MIDIGetNumberOfSources() ) { std::ostringstream ost; ost << "MidiInCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } portRef = MIDIGetSource( portNumber ); nameRef = ConnectedEndpointName(portRef); CFStringGetCString( nameRef, name, sizeof(name), CFStringGetSystemEncoding()); CFRelease( nameRef ); return stringName = name; } //*********************************************************************// // API: OS-X // Class Definitions: MidiOutCore //*********************************************************************// MidiOutCore :: MidiOutCore( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } MidiOutCore :: ~MidiOutCore( void ) { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } void MidiOutCore :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; CFStringRef name = CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ); OSStatus result = MIDIClientCreate(name, NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "MidiOutCore::initialize: error creating OS-X MIDI client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; CFRelease( name ); } unsigned int MidiOutCore :: getPortCount() { CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); return MIDIGetNumberOfDestinations(); } std::string MidiOutCore :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; char name[128]; std::string stringName; CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); if ( portNumber >= MIDIGetNumberOfDestinations() ) { std::ostringstream ost; ost << "MidiOutCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } portRef = MIDIGetDestination( portNumber ); nameRef = ConnectedEndpointName(portRef); CFStringGetCString( nameRef, name, sizeof(name), CFStringGetSystemEncoding()); CFRelease( nameRef ); return stringName = name; } void MidiOutCore :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiOutCore::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); unsigned int nDest = MIDIGetNumberOfDestinations(); if (nDest < 1) { errorString_ = "MidiOutCore::openPort: no MIDI output destinations found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nDest ) { std::ostringstream ost; ost << "MidiOutCore::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIOutputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "MidiOutCore::openPort: error creating OS-X MIDI output port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Get the desired output port identifier. MIDIEndpointRef destination = MIDIGetDestination( portNumber ); if ( destination == 0 ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "MidiOutCore::openPort: error getting MIDI output destination reference."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. data->port = port; data->destinationId = destination; connected_ = true; } void MidiOutCore :: closePort( void ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { MIDIEndpointDispose( data->endpoint ); } if ( data->port ) { MIDIPortDispose( data->port ); } connected_ = false; } void MidiOutCore :: openVirtualPort( std::string portName ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { errorString_ = "MidiOutCore::openVirtualPort: a virtual output port already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } // Create a virtual MIDI output source. MIDIEndpointRef endpoint; OSStatus result = MIDISourceCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &endpoint ); if ( result != noErr ) { errorString_ = "MidiOutCore::initialize: error creating OS-X virtual MIDI source."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. data->endpoint = endpoint; } void MidiOutCore :: sendMessage( std::vector *message ) { // We use the MIDISendSysex() function to asynchronously send sysex // messages. Otherwise, we use a single CoreMidi MIDIPacket. unsigned int nBytes = message->size(); if ( nBytes == 0 ) { errorString_ = "MidiOutCore::sendMessage: no data in message argument!"; error( RtMidiError::WARNING, errorString_ ); return; } MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); CoreMidiData *data = static_cast (apiData_); OSStatus result; if ( message->at(0) != 0xF0 && nBytes > 3 ) { errorString_ = "MidiOutCore::sendMessage: message format problem ... not sysex but > 3 bytes?"; error( RtMidiError::WARNING, errorString_ ); return; } Byte buffer[nBytes+(sizeof(MIDIPacketList))]; ByteCount listSize = sizeof(buffer); MIDIPacketList *packetList = (MIDIPacketList*)buffer; MIDIPacket *packet = MIDIPacketListInit( packetList ); ByteCount remainingBytes = nBytes; while (remainingBytes && packet) { ByteCount bytesForPacket = remainingBytes > 65535 ? 65535 : remainingBytes; // 65535 = maximum size of a MIDIPacket const Byte* dataStartPtr = (const Byte *) &message->at( nBytes - remainingBytes ); packet = MIDIPacketListAdd( packetList, listSize, packet, timeStamp, bytesForPacket, dataStartPtr); remainingBytes -= bytesForPacket; } if ( !packet ) { errorString_ = "MidiOutCore::sendMessage: could not allocate packet list"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Send to any destinations that may have connected to us. if ( data->endpoint ) { result = MIDIReceived( data->endpoint, packetList ); if ( result != noErr ) { errorString_ = "MidiOutCore::sendMessage: error sending MIDI to virtual destinations."; error( RtMidiError::WARNING, errorString_ ); } } // And send to an explicit destination port if we're connected. if ( connected_ ) { result = MIDISend( data->port, data->destinationId, packetList ); if ( result != noErr ) { errorString_ = "MidiOutCore::sendMessage: error sending MIDI message to port."; error( RtMidiError::WARNING, errorString_ ); } } } #endif // __MACOSX_CORE__ //*********************************************************************// // API: LINUX ALSA SEQUENCER //*********************************************************************// // API information found at: // - http://www.alsa-project.org/documentation.php#Library #if defined(__LINUX_ALSA__) // The ALSA Sequencer API is based on the use of a callback function for // MIDI input. // // Thanks to Pedro Lopez-Cabanillas for help with the ALSA sequencer // time stamps and other assorted fixes!!! // If you don't need timestamping for incoming MIDI events, define the // preprocessor definition AVOID_TIMESTAMPING to save resources // associated with the ALSA sequencer queues. #include #include // ALSA header file. #include // A structure to hold variables related to the ALSA API // implementation. struct AlsaMidiData { snd_seq_t *seq; unsigned int portNum; int vport; snd_seq_port_subscribe_t *subscription; snd_midi_event_t *coder; unsigned int bufferSize; unsigned char *buffer; pthread_t thread; pthread_t dummy_thread_id; unsigned long long lastTime; int queue_id; // an input queue is needed to get timestamped events int trigger_fds[2]; }; #define PORT_TYPE( pinfo, bits ) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) //*********************************************************************// // API: LINUX ALSA // Class Definitions: MidiInAlsa //*********************************************************************// static void *alsaMidiHandler( void *ptr ) { MidiInApi::RtMidiInData *data = static_cast (ptr); AlsaMidiData *apiData = static_cast (data->apiData); long nBytes; unsigned long long time, lastTime; bool continueSysex = false; bool doDecode = false; MidiInApi::MidiMessage message; int poll_fd_count; struct pollfd *poll_fds; snd_seq_event_t *ev; int result; apiData->bufferSize = 32; result = snd_midi_event_new( 0, &apiData->coder ); if ( result < 0 ) { data->doInput = false; std::cerr << "\nMidiInAlsa::alsaMidiHandler: error initializing MIDI event parser!\n\n"; return 0; } unsigned char *buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; snd_midi_event_free( apiData->coder ); apiData->coder = 0; std::cerr << "\nMidiInAlsa::alsaMidiHandler: error initializing buffer memory!\n\n"; return 0; } snd_midi_event_init( apiData->coder ); snd_midi_event_no_status( apiData->coder, 1 ); // suppress running status messages poll_fd_count = snd_seq_poll_descriptors_count( apiData->seq, POLLIN ) + 1; poll_fds = (struct pollfd*)alloca( poll_fd_count * sizeof( struct pollfd )); snd_seq_poll_descriptors( apiData->seq, poll_fds + 1, poll_fd_count - 1, POLLIN ); poll_fds[0].fd = apiData->trigger_fds[0]; poll_fds[0].events = POLLIN; while ( data->doInput ) { if ( snd_seq_event_input_pending( apiData->seq, 1 ) == 0 ) { // No data pending if ( poll( poll_fds, poll_fd_count, -1) >= 0 ) { if ( poll_fds[0].revents & POLLIN ) { bool dummy; int res = read( poll_fds[0].fd, &dummy, sizeof(dummy) ); (void) res; } } continue; } // If here, there should be data. result = snd_seq_event_input( apiData->seq, &ev ); if ( result == -ENOSPC ) { std::cerr << "\nMidiInAlsa::alsaMidiHandler: MIDI input buffer overrun!\n\n"; continue; } else if ( result <= 0 ) { std::cerr << "\nMidiInAlsa::alsaMidiHandler: unknown MIDI input error!\n"; perror("System reports"); continue; } // This is a bit weird, but we now have to decode an ALSA MIDI // event (back) into MIDI bytes. We'll ignore non-MIDI types. if ( !continueSysex ) message.bytes.clear(); doDecode = false; switch ( ev->type ) { case SND_SEQ_EVENT_PORT_SUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cout << "MidiInAlsa::alsaMidiHandler: port connection made!\n"; #endif break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cerr << "MidiInAlsa::alsaMidiHandler: port connection has closed!\n"; std::cout << "sender = " << (int) ev->data.connect.sender.client << ":" << (int) ev->data.connect.sender.port << ", dest = " << (int) ev->data.connect.dest.client << ":" << (int) ev->data.connect.dest.port << std::endl; #endif break; case SND_SEQ_EVENT_QFRAME: // MIDI time code if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_TICK: // 0xF9 ... MIDI timing tick if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_CLOCK: // 0xF8 ... MIDI timing (clock) tick if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_SENSING: // Active sensing if ( !( data->ignoreFlags & 0x04 ) ) doDecode = true; break; case SND_SEQ_EVENT_SYSEX: if ( (data->ignoreFlags & 0x01) ) break; if ( ev->data.ext.len > apiData->bufferSize ) { apiData->bufferSize = ev->data.ext.len; free( buffer ); buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; std::cerr << "\nMidiInAlsa::alsaMidiHandler: error resizing buffer memory!\n\n"; break; } } default: doDecode = true; } if ( doDecode ) { nBytes = snd_midi_event_decode( apiData->coder, buffer, apiData->bufferSize, ev ); if ( nBytes > 0 ) { // The ALSA sequencer has a maximum buffer size for MIDI sysex // events of 256 bytes. If a device sends sysex messages larger // than this, they are segmented into 256 byte chunks. So, // we'll watch for this and concatenate sysex chunks into a // single sysex message if necessary. if ( !continueSysex ) message.bytes.assign( buffer, &buffer[nBytes] ); else message.bytes.insert( message.bytes.end(), buffer, &buffer[nBytes] ); continueSysex = ( ( ev->type == SND_SEQ_EVENT_SYSEX ) && ( message.bytes.back() != 0xF7 ) ); if ( !continueSysex ) { // Calculate the time stamp: message.timeStamp = 0.0; // Method 1: Use the system time. //(void)gettimeofday(&tv, (struct timezone *)NULL); //time = (tv.tv_sec * 1000000) + tv.tv_usec; // Method 2: Use the ALSA sequencer event time data. // (thanks to Pedro Lopez-Cabanillas!). time = ( ev->time.time.tv_sec * 1000000 ) + ( ev->time.time.tv_nsec/1000 ); lastTime = time; time -= apiData->lastTime; apiData->lastTime = lastTime; if ( data->firstMessage == true ) data->firstMessage = false; else message.timeStamp = time * 0.000001; } else { #if defined(__RTMIDI_DEBUG__) std::cerr << "\nMidiInAlsa::alsaMidiHandler: event parsing error or not a MIDI event!\n\n"; #endif } } } snd_seq_free_event( ev ); if ( message.bytes.size() == 0 || continueSysex ) continue; if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nMidiInAlsa: message queue limit reached!!\n\n"; } } if ( buffer ) free( buffer ); snd_midi_event_free( apiData->coder ); apiData->coder = 0; apiData->thread = apiData->dummy_thread_id; return 0; } MidiInAlsa :: MidiInAlsa( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } MidiInAlsa :: ~MidiInAlsa() { // Close a connection if it exists. closePort(); // Shutdown the input thread. AlsaMidiData *data = static_cast (apiData_); if ( inputData_.doInput ) { inputData_.doInput = false; int res = write( data->trigger_fds[1], &inputData_.doInput, sizeof(inputData_.doInput) ); (void) res; if ( !pthread_equal(data->thread, data->dummy_thread_id) ) pthread_join( data->thread, NULL ); } // Cleanup. close ( data->trigger_fds[0] ); close ( data->trigger_fds[1] ); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); #ifndef AVOID_TIMESTAMPING snd_seq_free_queue( data->seq, data->queue_id ); #endif snd_seq_close( data->seq ); delete data; } void MidiInAlsa :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); if ( result < 0 ) { errorString_ = "MidiInAlsa::initialize: error creating ALSA sequencer client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->portNum = -1; data->vport = -1; data->subscription = 0; data->dummy_thread_id = pthread_self(); data->thread = data->dummy_thread_id; data->trigger_fds[0] = -1; data->trigger_fds[1] = -1; apiData_ = (void *) data; inputData_.apiData = (void *) data; if ( pipe(data->trigger_fds) == -1 ) { errorString_ = "MidiInAlsa::initialize: error creating pipe objects."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Create the input queue #ifndef AVOID_TIMESTAMPING data->queue_id = snd_seq_alloc_named_queue(seq, "RtMidi Queue"); // Set arbitrary tempo (mm=100) and resolution (240) snd_seq_queue_tempo_t *qtempo; snd_seq_queue_tempo_alloca(&qtempo); snd_seq_queue_tempo_set_tempo(qtempo, 600000); snd_seq_queue_tempo_set_ppq(qtempo, 240); snd_seq_set_queue_tempo(data->seq, data->queue_id, qtempo); snd_seq_drain_output(data->seq); #endif } // This function is used to count or get the pinfo structure for a given port number. unsigned int portInfo( snd_seq_t *seq, snd_seq_port_info_t *pinfo, unsigned int type, int portNumber ) { snd_seq_client_info_t *cinfo; int client; int count = 0; snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); while ( snd_seq_query_next_client( seq, cinfo ) >= 0 ) { client = snd_seq_client_info_get_client( cinfo ); if ( client == 0 ) continue; // Reset query info snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); while ( snd_seq_query_next_port( seq, pinfo ) >= 0 ) { unsigned int atyp = snd_seq_port_info_get_type( pinfo ); if ( ( ( atyp & SND_SEQ_PORT_TYPE_MIDI_GENERIC ) == 0 ) && ( ( atyp & SND_SEQ_PORT_TYPE_SYNTH ) == 0 ) ) continue; unsigned int caps = snd_seq_port_info_get_capability( pinfo ); if ( ( caps & type ) != type ) continue; if ( count == portNumber ) return 1; ++count; } } // If a negative portNumber was used, return the port count. if ( portNumber < 0 ) return count; return 0; } unsigned int MidiInAlsa :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, -1 ); } std::string MidiInAlsa :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); std::string stringName; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client( pinfo ); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name( cinfo ); os << " "; // These lines added to make sure devices are listed os << snd_seq_port_info_get_client( pinfo ); // with full portnames added to ensure individual device names os << ":"; os << snd_seq_port_info_get_port( pinfo ); stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "MidiInAlsa::getPortName: error looking for port name!"; error( RtMidiError::WARNING, errorString_ ); return stringName; } void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiInAlsa::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nSrc = this->getPortCount(); if ( nSrc < 1 ) { errorString_ = "MidiInAlsa::openPort: no MIDI input sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } snd_seq_port_info_t *src_pinfo; snd_seq_port_info_alloca( &src_pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, src_pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) == 0 ) { std::ostringstream ost; ost << "MidiInAlsa::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } snd_seq_addr_t sender, receiver; sender.client = snd_seq_port_info_get_client( src_pinfo ); sender.port = snd_seq_port_info_get_port( src_pinfo ); receiver.client = snd_seq_client_id( data->seq ); snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); if ( data->vport < 0 ) { snd_seq_port_info_set_client( pinfo, 0 ); snd_seq_port_info_set_port( pinfo, 0 ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); #ifndef AVOID_TIMESTAMPING snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); #endif snd_seq_port_info_set_name(pinfo, portName.c_str() ); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "MidiInAlsa::openPort: ALSA error creating input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } data->vport = snd_seq_port_info_get_port(pinfo); } receiver.port = data->vport; if ( !data->subscription ) { // Make subscription if (snd_seq_port_subscribe_malloc( &data->subscription ) < 0) { errorString_ = "MidiInAlsa::openPort: ALSA error allocation port subscription."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; errorString_ = "MidiInAlsa::openPort: ALSA error making port connection."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } if ( inputData_.doInput == false ) { // Start the input queue #ifndef AVOID_TIMESTAMPING snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if ( err ) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; inputData_.doInput = false; errorString_ = "MidiInAlsa::openPort: error starting MIDI input thread!"; error( RtMidiError::THREAD_ERROR, errorString_ ); return; } } connected_ = true; } void MidiInAlsa :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); #ifndef AVOID_TIMESTAMPING snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); #endif snd_seq_port_info_set_name(pinfo, portName.c_str()); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "MidiInAlsa::openVirtualPort: ALSA error creating virtual port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } data->vport = snd_seq_port_info_get_port(pinfo); } if ( inputData_.doInput == false ) { // Wait for old thread to stop, if still running if ( !pthread_equal(data->thread, data->dummy_thread_id) ) pthread_join( data->thread, NULL ); // Start the input queue #ifndef AVOID_TIMESTAMPING snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if ( err ) { if ( data->subscription ) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; } inputData_.doInput = false; errorString_ = "MidiInAlsa::openPort: error starting MIDI input thread!"; error( RtMidiError::THREAD_ERROR, errorString_ ); return; } } } void MidiInAlsa :: closePort( void ) { AlsaMidiData *data = static_cast (apiData_); if ( connected_ ) { if ( data->subscription ) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; } // Stop the input queue #ifndef AVOID_TIMESTAMPING snd_seq_stop_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif connected_ = false; } // Stop thread to avoid triggering the callback, while the port is intended to be closed if ( inputData_.doInput ) { inputData_.doInput = false; int res = write( data->trigger_fds[1], &inputData_.doInput, sizeof(inputData_.doInput) ); (void) res; if ( !pthread_equal(data->thread, data->dummy_thread_id) ) pthread_join( data->thread, NULL ); } } //*********************************************************************// // API: LINUX ALSA // Class Definitions: MidiOutAlsa //*********************************************************************// MidiOutAlsa :: MidiOutAlsa( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } MidiOutAlsa :: ~MidiOutAlsa() { // Close a connection if it exists. closePort(); // Cleanup. AlsaMidiData *data = static_cast (apiData_); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); if ( data->coder ) snd_midi_event_free( data->coder ); if ( data->buffer ) free( data->buffer ); snd_seq_close( data->seq ); delete data; } void MidiOutAlsa :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result1 = snd_seq_open( &seq, "default", SND_SEQ_OPEN_OUTPUT, SND_SEQ_NONBLOCK ); if ( result1 < 0 ) { errorString_ = "MidiOutAlsa::initialize: error creating ALSA sequencer client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->portNum = -1; data->vport = -1; data->bufferSize = 32; data->coder = 0; data->buffer = 0; int result = snd_midi_event_new( data->bufferSize, &data->coder ); if ( result < 0 ) { delete data; errorString_ = "MidiOutAlsa::initialize: error initializing MIDI event parser!\n\n"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { delete data; errorString_ = "MidiOutAlsa::initialize: error allocating buffer memory!\n\n"; error( RtMidiError::MEMORY_ERROR, errorString_ ); return; } snd_midi_event_init( data->coder ); apiData_ = (void *) data; } unsigned int MidiOutAlsa :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, -1 ); } std::string MidiOutAlsa :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); std::string stringName; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client(pinfo); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name(cinfo); os << " "; // These lines added to make sure devices are listed os << snd_seq_port_info_get_client( pinfo ); // with full portnames added to ensure individual device names os << ":"; os << snd_seq_port_info_get_port(pinfo); stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "MidiOutAlsa::getPortName: error looking for port name!"; error( RtMidiError::WARNING, errorString_ ); return stringName; } void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiOutAlsa::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "MidiOutAlsa::openPort: no MIDI output sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) == 0 ) { std::ostringstream ost; ost << "MidiOutAlsa::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } snd_seq_addr_t sender, receiver; receiver.client = snd_seq_port_info_get_client( pinfo ); receiver.port = snd_seq_port_info_get_port( pinfo ); sender.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION ); if ( data->vport < 0 ) { errorString_ = "MidiOutAlsa::openPort: ALSA error creating output port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } sender.port = data->vport; // Make subscription if (snd_seq_port_subscribe_malloc( &data->subscription ) < 0) { snd_seq_port_subscribe_free( data->subscription ); errorString_ = "MidiOutAlsa::openPort: error allocating port subscription."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); snd_seq_port_subscribe_set_time_update(data->subscription, 1); snd_seq_port_subscribe_set_time_real(data->subscription, 1); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { snd_seq_port_subscribe_free( data->subscription ); errorString_ = "MidiOutAlsa::openPort: ALSA error making port connection."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } connected_ = true; } void MidiOutAlsa :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); connected_ = false; } } void MidiOutAlsa :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION ); if ( data->vport < 0 ) { errorString_ = "MidiOutAlsa::openVirtualPort: ALSA error creating virtual port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } } void MidiOutAlsa :: sendMessage( std::vector *message ) { int result; AlsaMidiData *data = static_cast (apiData_); unsigned int nBytes = message->size(); if ( nBytes > data->bufferSize ) { data->bufferSize = nBytes; result = snd_midi_event_resize_buffer ( data->coder, nBytes); if ( result != 0 ) { errorString_ = "MidiOutAlsa::sendMessage: ALSA error resizing MIDI event buffer."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } free (data->buffer); data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { errorString_ = "MidiOutAlsa::initialize: error allocating buffer memory!\n\n"; error( RtMidiError::MEMORY_ERROR, errorString_ ); return; } } snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, data->vport); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); for ( unsigned int i=0; ibuffer[i] = message->at(i); result = snd_midi_event_encode( data->coder, data->buffer, (long)nBytes, &ev ); if ( result < (int)nBytes ) { errorString_ = "MidiOutAlsa::sendMessage: event parsing error!"; error( RtMidiError::WARNING, errorString_ ); return; } // Send the event. result = snd_seq_event_output(data->seq, &ev); if ( result < 0 ) { errorString_ = "MidiOutAlsa::sendMessage: error sending MIDI message to port."; error( RtMidiError::WARNING, errorString_ ); return; } snd_seq_drain_output(data->seq); } #endif // __LINUX_ALSA__ //*********************************************************************// // API: Windows Multimedia Library (MM) //*********************************************************************// // API information deciphered from: // - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_midi_reference.asp // Thanks to Jean-Baptiste Berruchon for the sysex code. #if defined(__WINDOWS_MM__) // The Windows MM API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // Windows MM MIDI header files. #include #include #define RT_SYSEX_BUFFER_SIZE 1024 #define RT_SYSEX_BUFFER_COUNT 4 // A structure to hold variables related to the CoreMIDI API // implementation. struct WinMidiData { HMIDIIN inHandle; // Handle to Midi Input Device HMIDIOUT outHandle; // Handle to Midi Output Device DWORD lastTime; MidiInApi::MidiMessage message; LPMIDIHDR sysexBuffer[RT_SYSEX_BUFFER_COUNT]; CRITICAL_SECTION _mutex; // [Patrice] see https://groups.google.com/forum/#!topic/mididev/6OUjHutMpEo }; //*********************************************************************// // API: Windows MM // Class Definitions: MidiInWinMM //*********************************************************************// static void CALLBACK midiInputCallback( HMIDIIN /*hmin*/, UINT inputStatus, DWORD_PTR instancePtr, DWORD_PTR midiMessage, DWORD timestamp ) { if ( inputStatus != MIM_DATA && inputStatus != MIM_LONGDATA && inputStatus != MIM_LONGERROR ) return; //MidiInApi::RtMidiInData *data = static_cast (instancePtr); MidiInApi::RtMidiInData *data = (MidiInApi::RtMidiInData *)instancePtr; WinMidiData *apiData = static_cast (data->apiData); // Calculate time stamp. if ( data->firstMessage == true ) { apiData->message.timeStamp = 0.0; data->firstMessage = false; } else apiData->message.timeStamp = (double) ( timestamp - apiData->lastTime ) * 0.001; apiData->lastTime = timestamp; if ( inputStatus == MIM_DATA ) { // Channel or system message // Make sure the first byte is a status byte. unsigned char status = (unsigned char) (midiMessage & 0x000000FF); if ( !(status & 0x80) ) return; // Determine the number of bytes in the MIDI message. unsigned short nBytes = 1; if ( status < 0xC0 ) nBytes = 3; else if ( status < 0xE0 ) nBytes = 2; else if ( status < 0xF0 ) nBytes = 3; else if ( status == 0xF1 ) { if ( data->ignoreFlags & 0x02 ) return; else nBytes = 2; } else if ( status == 0xF2 ) nBytes = 3; else if ( status == 0xF3 ) nBytes = 2; else if ( status == 0xF8 && (data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're ignoring it. return; } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. return; } // Copy bytes to our MIDI message. unsigned char *ptr = (unsigned char *) &midiMessage; for ( int i=0; imessage.bytes.push_back( *ptr++ ); } else { // Sysex message ( MIM_LONGDATA or MIM_LONGERROR ) MIDIHDR *sysex = ( MIDIHDR *) midiMessage; if ( !( data->ignoreFlags & 0x01 ) && inputStatus != MIM_LONGERROR ) { // Sysex message and we're not ignoring it for ( int i=0; i<(int)sysex->dwBytesRecorded; ++i ) apiData->message.bytes.push_back( sysex->lpData[i] ); } // The WinMM API requires that the sysex buffer be requeued after // input of each sysex message. Even if we are ignoring sysex // messages, we still need to requeue the buffer in case the user // decides to not ignore sysex messages in the future. However, // it seems that WinMM calls this function with an empty sysex // buffer when an application closes and in this case, we should // avoid requeueing it, else the computer suddenly reboots after // one or two minutes. if ( apiData->sysexBuffer[sysex->dwUser]->dwBytesRecorded > 0 ) { //if ( sysex->dwBytesRecorded > 0 ) { EnterCriticalSection( &(apiData->_mutex) ); MMRESULT result = midiInAddBuffer( apiData->inHandle, apiData->sysexBuffer[sysex->dwUser], sizeof(MIDIHDR) ); LeaveCriticalSection( &(apiData->_mutex) ); if ( result != MMSYSERR_NOERROR ) std::cerr << "\nRtMidiIn::midiInputCallback: error sending sysex to Midi device!!\n\n"; if ( data->ignoreFlags & 0x01 ) return; } else return; } if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( apiData->message.timeStamp, &apiData->message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = apiData->message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } // Clear the vector for the next input message. apiData->message.bytes.clear(); } MidiInWinMM :: MidiInWinMM( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } MidiInWinMM :: ~MidiInWinMM() { // Close a connection if it exists. closePort(); WinMidiData *data = static_cast (apiData_); DeleteCriticalSection( &(data->_mutex) ); // Cleanup. delete data; } void MidiInWinMM :: initialize( const std::string& /*clientName*/ ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plugin something later. unsigned int nDevices = midiInGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "MidiInWinMM::initialize: no MIDI input devices currently available."; error( RtMidiError::WARNING, errorString_ ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; data->message.bytes.clear(); // needs to be empty for first input message if ( !InitializeCriticalSectionAndSpinCount(&(data->_mutex), 0x00000400) ) { errorString_ = "MidiInWinMM::initialize: InitializeCriticalSectionAndSpinCount failed."; error( RtMidiError::WARNING, errorString_ ); } } void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "MidiInWinMM::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nDevices = midiInGetNumDevs(); if (nDevices == 0) { errorString_ = "MidiInWinMM::openPort: no MIDI input sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiInWinMM::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiInOpen( &data->inHandle, portNumber, (DWORD_PTR)&midiInputCallback, (DWORD_PTR)&inputData_, CALLBACK_FUNCTION ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "MidiInWinMM::openPort: error creating Windows MM MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Allocate and init the sysex buffers. for ( int i=0; isysexBuffer[i] = (MIDIHDR*) new char[ sizeof(MIDIHDR) ]; data->sysexBuffer[i]->lpData = new char[ RT_SYSEX_BUFFER_SIZE ]; data->sysexBuffer[i]->dwBufferLength = RT_SYSEX_BUFFER_SIZE; data->sysexBuffer[i]->dwUser = i; // We use the dwUser parameter as buffer indicator data->sysexBuffer[i]->dwFlags = 0; result = midiInPrepareHeader( data->inHandle, data->sysexBuffer[i], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port (PrepareHeader)."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Register the buffer. result = midiInAddBuffer( data->inHandle, data->sysexBuffer[i], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port (AddBuffer)."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } result = midiInStart( data->inHandle ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } connected_ = true; } void MidiInWinMM :: openVirtualPort( std::string /*portName*/ ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "MidiInWinMM::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtMidiError::WARNING, errorString_ ); } void MidiInWinMM :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); EnterCriticalSection( &(data->_mutex) ); midiInReset( data->inHandle ); midiInStop( data->inHandle ); for ( int i=0; iinHandle, data->sysexBuffer[i], sizeof(MIDIHDR)); delete [] data->sysexBuffer[i]->lpData; delete [] data->sysexBuffer[i]; if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error closing Windows MM MIDI input port (midiInUnprepareHeader)."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } midiInClose( data->inHandle ); connected_ = false; LeaveCriticalSection( &(data->_mutex) ); } } unsigned int MidiInWinMM :: getPortCount() { return midiInGetNumDevs(); } std::string MidiInWinMM :: getPortName( unsigned int portNumber ) { std::string stringName; unsigned int nDevices = midiInGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiInWinMM::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } MIDIINCAPS deviceCaps; midiInGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIINCAPS)); #if defined( UNICODE ) || defined( _UNICODE ) int length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, -1, NULL, 0, NULL, NULL) - 1; stringName.assign( length, 0 ); length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, static_cast(wcslen(deviceCaps.szPname)), &stringName[0], length, NULL, NULL); #else stringName = std::string( deviceCaps.szPname ); #endif // Next lines added to add the portNumber to the name so that // the device's names are sure to be listed with individual names // even when they have the same brand name std::ostringstream os; os << " "; os << portNumber; stringName += os.str(); return stringName; } //*********************************************************************// // API: Windows MM // Class Definitions: MidiOutWinMM //*********************************************************************// MidiOutWinMM :: MidiOutWinMM( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } MidiOutWinMM :: ~MidiOutWinMM() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } void MidiOutWinMM :: initialize( const std::string& /*clientName*/ ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plug something in later. unsigned int nDevices = midiOutGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "MidiOutWinMM::initialize: no MIDI output devices currently available."; error( RtMidiError::WARNING, errorString_ ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; } unsigned int MidiOutWinMM :: getPortCount() { return midiOutGetNumDevs(); } std::string MidiOutWinMM :: getPortName( unsigned int portNumber ) { std::string stringName; unsigned int nDevices = midiOutGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiOutWinMM::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } MIDIOUTCAPS deviceCaps; midiOutGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIOUTCAPS)); #if defined( UNICODE ) || defined( _UNICODE ) int length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, -1, NULL, 0, NULL, NULL) - 1; stringName.assign( length, 0 ); length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, static_cast(wcslen(deviceCaps.szPname)), &stringName[0], length, NULL, NULL); #else stringName = std::string( deviceCaps.szPname ); #endif // Next lines added to add the portNumber to the name so that // the device's names are sure to be listed with individual names // even when they have the same brand name std::ostringstream os; os << " "; os << portNumber; stringName += os.str(); return stringName; } void MidiOutWinMM :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "MidiOutWinMM::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nDevices = midiOutGetNumDevs(); if (nDevices < 1) { errorString_ = "MidiOutWinMM::openPort: no MIDI output destinations found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiOutWinMM::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiOutOpen( &data->outHandle, portNumber, (DWORD)NULL, (DWORD)NULL, CALLBACK_NULL ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "MidiOutWinMM::openPort: error creating Windows MM MIDI output port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } connected_ = true; } void MidiOutWinMM :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiOutReset( data->outHandle ); midiOutClose( data->outHandle ); connected_ = false; } } void MidiOutWinMM :: openVirtualPort( std::string /*portName*/ ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "MidiOutWinMM::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtMidiError::WARNING, errorString_ ); } void MidiOutWinMM :: sendMessage( std::vector *message ) { if ( !connected_ ) return; unsigned int nBytes = static_cast(message->size()); if ( nBytes == 0 ) { errorString_ = "MidiOutWinMM::sendMessage: message argument is empty!"; error( RtMidiError::WARNING, errorString_ ); return; } MMRESULT result; WinMidiData *data = static_cast (apiData_); if ( message->at(0) == 0xF0 ) { // Sysex message // Allocate buffer for sysex data. char *buffer = (char *) malloc( nBytes ); if ( buffer == NULL ) { errorString_ = "MidiOutWinMM::sendMessage: error allocating sysex message memory!"; error( RtMidiError::MEMORY_ERROR, errorString_ ); return; } // Copy data to buffer. for ( unsigned int i=0; iat(i); // Create and prepare MIDIHDR structure. MIDIHDR sysex; sysex.lpData = (LPSTR) buffer; sysex.dwBufferLength = nBytes; sysex.dwFlags = 0; result = midiOutPrepareHeader( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "MidiOutWinMM::sendMessage: error preparing sysex header."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Send the message. result = midiOutLongMsg( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "MidiOutWinMM::sendMessage: error sending sysex message."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Unprepare the buffer and MIDIHDR. while ( MIDIERR_STILLPLAYING == midiOutUnprepareHeader( data->outHandle, &sysex, sizeof (MIDIHDR) ) ) Sleep( 1 ); free( buffer ); } else { // Channel or system message. // Make sure the message size isn't too big. if ( nBytes > 3 ) { errorString_ = "MidiOutWinMM::sendMessage: message size is greater than 3 bytes (and not sysex)!"; error( RtMidiError::WARNING, errorString_ ); return; } // Pack MIDI bytes into double word. DWORD packet; unsigned char *ptr = (unsigned char *) &packet; for ( unsigned int i=0; iat(i); ++ptr; } // Send the message immediately. result = midiOutShortMsg( data->outHandle, packet ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "MidiOutWinMM::sendMessage: error sending MIDI message."; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } } #endif // __WINDOWS_MM__ //*********************************************************************// // API: UNIX JACK // // Written primarily by Alexander Svetalkin, with updates for delta // time by Gary Scavone, April 2011. // // *********************************************************************// #if defined(__UNIX_JACK__) // JACK header files #include #include #include #define JACK_RINGBUFFER_SIZE 16384 // Default size for ringbuffer struct JackMidiData { jack_client_t *client; jack_port_t *port; jack_ringbuffer_t *buffSize; jack_ringbuffer_t *buffMessage; jack_time_t lastTime; MidiInApi :: RtMidiInData *rtMidiIn; }; //*********************************************************************// // API: JACK // Class Definitions: MidiInJack //*********************************************************************// static int jackProcessIn( jack_nframes_t nframes, void *arg ) { JackMidiData *jData = (JackMidiData *) arg; MidiInApi :: RtMidiInData *rtData = jData->rtMidiIn; jack_midi_event_t event; jack_time_t time; // Is port created? if ( jData->port == NULL ) return 0; void *buff = jack_port_get_buffer( jData->port, nframes ); // We have midi events in buffer int evCount = jack_midi_get_event_count( buff ); for (int j = 0; j < evCount; j++) { MidiInApi::MidiMessage message; message.bytes.clear(); jack_midi_event_get( &event, buff, j ); for ( unsigned int i = 0; i < event.size; i++ ) message.bytes.push_back( event.buffer[i] ); // Compute the delta time. time = jack_get_time(); if ( rtData->firstMessage == true ) rtData->firstMessage = false; else message.timeStamp = ( time - jData->lastTime ) * 0.000001; jData->lastTime = time; if ( !rtData->continueSysex ) { if ( rtData->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) rtData->userCallback; callback( message.timeStamp, &message.bytes, rtData->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( rtData->queue.size < rtData->queue.ringSize ) { rtData->queue.ring[rtData->queue.back++] = message; if ( rtData->queue.back == rtData->queue.ringSize ) rtData->queue.back = 0; rtData->queue.size++; } else std::cerr << "\nMidiInJack: message queue limit reached!!\n\n"; } } } return 0; } MidiInJack :: MidiInJack( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } void MidiInJack :: initialize( const std::string& clientName ) { JackMidiData *data = new JackMidiData; apiData_ = (void *) data; data->rtMidiIn = &inputData_; data->port = NULL; data->client = NULL; this->clientName = clientName; connect(); } void MidiInJack :: connect() { JackMidiData *data = static_cast (apiData_); if ( data->client ) return; // Initialize JACK client if (( data->client = jack_client_open( clientName.c_str(), JackNoStartServer, NULL )) == 0) { errorString_ = "MidiInJack::initialize: JACK server not running?"; error( RtMidiError::WARNING, errorString_ ); return; } jack_set_process_callback( data->client, jackProcessIn, data ); jack_activate( data->client ); } MidiInJack :: ~MidiInJack() { JackMidiData *data = static_cast (apiData_); closePort(); if ( data->client ) jack_client_close( data->client ); delete data; } void MidiInJack :: openPort( unsigned int portNumber, const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); // Creating new port if ( data->port == NULL) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); if ( data->port == NULL) { errorString_ = "MidiInJack::openPort: JACK error creating port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Connecting to the output std::string name = getPortName( portNumber ); jack_connect( data->client, name.c_str(), jack_port_name( data->port ) ); } void MidiInJack :: openVirtualPort( const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); if ( data->port == NULL ) { errorString_ = "MidiInJack::openVirtualPort: JACK error creating virtual port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } unsigned int MidiInJack :: getPortCount() { int count = 0; JackMidiData *data = static_cast (apiData_); connect(); if ( !data->client ) return 0; // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput ); if ( ports == NULL ) return 0; while ( ports[count] != NULL ) count++; free( ports ); return count; } std::string MidiInJack :: getPortName( unsigned int portNumber ) { JackMidiData *data = static_cast (apiData_); std::string retStr(""); connect(); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput ); // Check port validity if ( ports == NULL ) { errorString_ = "MidiInJack::getPortName: no ports available!"; error( RtMidiError::WARNING, errorString_ ); return retStr; } if ( ports[portNumber] == NULL ) { std::ostringstream ost; ost << "MidiInJack::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); } else retStr.assign( ports[portNumber] ); free( ports ); return retStr; } void MidiInJack :: closePort() { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) return; jack_port_unregister( data->client, data->port ); data->port = NULL; } //*********************************************************************// // API: JACK // Class Definitions: MidiOutJack //*********************************************************************// // Jack process callback static int jackProcessOut( jack_nframes_t nframes, void *arg ) { JackMidiData *data = (JackMidiData *) arg; jack_midi_data_t *midiData; int space; // Is port created? if ( data->port == NULL ) return 0; void *buff = jack_port_get_buffer( data->port, nframes ); jack_midi_clear_buffer( buff ); while ( jack_ringbuffer_read_space( data->buffSize ) > 0 ) { jack_ringbuffer_read( data->buffSize, (char *) &space, (size_t) sizeof(space) ); midiData = jack_midi_event_reserve( buff, 0, space ); jack_ringbuffer_read( data->buffMessage, (char *) midiData, (size_t) space ); } return 0; } MidiOutJack :: MidiOutJack( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } void MidiOutJack :: initialize( const std::string& clientName ) { JackMidiData *data = new JackMidiData; apiData_ = (void *) data; data->port = NULL; data->client = NULL; this->clientName = clientName; connect(); } void MidiOutJack :: connect() { JackMidiData *data = static_cast (apiData_); if ( data->client ) return; // Initialize output ringbuffers data->buffSize = jack_ringbuffer_create( JACK_RINGBUFFER_SIZE ); data->buffMessage = jack_ringbuffer_create( JACK_RINGBUFFER_SIZE ); // Initialize JACK client if (( data->client = jack_client_open( clientName.c_str(), JackNoStartServer, NULL )) == 0) { errorString_ = "MidiOutJack::initialize: JACK server not running?"; error( RtMidiError::WARNING, errorString_ ); return; } jack_set_process_callback( data->client, jackProcessOut, data ); jack_activate( data->client ); } MidiOutJack :: ~MidiOutJack() { JackMidiData *data = static_cast (apiData_); closePort(); // Cleanup jack_ringbuffer_free( data->buffSize ); jack_ringbuffer_free( data->buffMessage ); if ( data->client ) { jack_client_close( data->client ); } delete data; } void MidiOutJack :: openPort( unsigned int portNumber, const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); // Creating new port if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0 ); if ( data->port == NULL ) { errorString_ = "MidiOutJack::openPort: JACK error creating port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Connecting to the output std::string name = getPortName( portNumber ); jack_connect( data->client, jack_port_name( data->port ), name.c_str() ); } void MidiOutJack :: openVirtualPort( const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0 ); if ( data->port == NULL ) { errorString_ = "MidiOutJack::openVirtualPort: JACK error creating virtual port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } unsigned int MidiOutJack :: getPortCount() { int count = 0; JackMidiData *data = static_cast (apiData_); connect(); if ( !data->client ) return 0; // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput ); if ( ports == NULL ) return 0; while ( ports[count] != NULL ) count++; free( ports ); return count; } std::string MidiOutJack :: getPortName( unsigned int portNumber ) { JackMidiData *data = static_cast (apiData_); std::string retStr(""); connect(); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput ); // Check port validity if ( ports == NULL) { errorString_ = "MidiOutJack::getPortName: no ports available!"; error( RtMidiError::WARNING, errorString_ ); return retStr; } if ( ports[portNumber] == NULL) { std::ostringstream ost; ost << "MidiOutJack::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); } else retStr.assign( ports[portNumber] ); free( ports ); return retStr; } void MidiOutJack :: closePort() { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) return; jack_port_unregister( data->client, data->port ); data->port = NULL; } void MidiOutJack :: sendMessage( std::vector *message ) { int nBytes = message->size(); JackMidiData *data = static_cast (apiData_); // Write full message to buffer jack_ringbuffer_write( data->buffMessage, ( const char * ) &( *message )[0], message->size() ); jack_ringbuffer_write( data->buffSize, ( char * ) &nBytes, sizeof( nBytes ) ); } #endif // __UNIX_JACK__ sonic-visualiser-3.0.3/svcore/data/midi/rtmidi/RtMidi.h0000644000000000000000000007047613111512442021137 0ustar 00000000000000/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2016 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ /*! \file RtMidi.h */ #ifndef RTMIDI_H #define RTMIDI_H #define RTMIDI_VERSION "2.1.1" #include #include #include #include /************************************************************************/ /*! \class RtMidiError \brief Exception handling class for RtMidi. The RtMidiError class is quite simple but it does allow errors to be "caught" by RtMidiError::Type. See the RtMidi documentation to know which methods can throw an RtMidiError. */ /************************************************************************/ class RtMidiError : public std::exception { public: //! Defined RtMidiError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; //! The constructor. RtMidiError( const std::string& message, Type type = RtMidiError::UNSPECIFIED ) throw() : message_(message), type_(type) {} //! The destructor. virtual ~RtMidiError( void ) throw() {} //! Prints thrown error message to stderr. virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) const throw() { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) const throw() { return message_; } //! Returns the thrown error message as a c-style string. virtual const char* what( void ) const throw() { return message_.c_str(); } protected: std::string message_; Type type_; }; //! RtMidi error callback function prototype. /*! \param type Type of error. \param errorText Error description. Note that class behaviour is undefined after a critical error (not a warning) is reported. */ typedef void (*RtMidiErrorCallback)( RtMidiError::Type type, const std::string &errorText, void *userData ); class MidiApi; class RtMidi { public: //! MIDI API specifier arguments. enum Api { UNSPECIFIED, /*!< Search for a working compiled API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Midi API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ UNIX_JACK, /*!< The JACK Low-Latency MIDI Server API. */ WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */ RTMIDI_DUMMY /*!< A compilable but non-functional API. */ }; //! A static function to determine the current RtMidi version. static std::string getVersion( void ) throw(); //! A static function to determine the available compiled MIDI APIs. /*! The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems. */ static void getCompiledApi( std::vector &apis ) throw(); //! Pure virtual openPort() function. virtual void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual openVirtualPort() function. virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual getPortCount() function. virtual unsigned int getPortCount() = 0; //! Pure virtual getPortName() function. virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; //! Pure virtual closePort() function. virtual void closePort( void ) = 0; //! Returns true if a port is open and false if not. virtual bool isPortOpen( void ) const = 0; //! Set an error callback function to be invoked when an error has occured. /*! The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port. */ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL, void *userData = 0 ) = 0; protected: RtMidi(); virtual ~RtMidi(); MidiApi *rtapi_; }; /**********************************************************************/ /*! \class RtMidiIn \brief A realtime MIDI input class. This class provides a common, platform-independent API for realtime MIDI input. It allows access to a single MIDI input port. Incoming MIDI messages are either saved to a queue for retrieval using the getMessage() function or immediately passed to a user-specified callback function. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X, Linux ALSA, and JACK MIDI APIs, it is also possible to open a virtual input port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2014. */ /**********************************************************************/ // **************************************************************** // // // RtMidiIn and RtMidiOut class declarations. // // RtMidiIn / RtMidiOut are "controllers" used to select an available // MIDI input or output interface. They present common APIs for the // user to call but all functionality is implemented by the classes // MidiInApi, MidiOutApi and their subclasses. RtMidiIn and RtMidiOut // each create an instance of a MidiInApi or MidiOutApi subclass based // on the user's API choice. If no choice is made, they attempt to // make a "logical" API selection. // // **************************************************************** // class RtMidiIn : public RtMidi { public: //! User callback function type definition. typedef void (*RtMidiCallback)( double timeStamp, std::vector *message, void *userData); //! Default constructor that allows an optional api, client name and queue size. /*! An exception will be thrown if a MIDI system initialization error occurs. The queue size defines the maximum number of messages that can be held in the MIDI queue (when not using a callback function). If the queue size limit is reached, incoming messages will be ignored. If no API argument is specified and multiple API support has been compiled, the default order of use is ALSA, JACK (Linux) and CORE, JACK (OS-X). \param api An optional API id can be specified. \param clientName An optional client name can be specified. This will be used to group the ports that are created by the application. \param queueSizeLimit An optional size of the MIDI input queue can be specified. */ RtMidiIn( RtMidi::Api api=UNSPECIFIED, const std::string clientName = std::string( "RtMidi Input Client"), unsigned int queueSizeLimit = 100 ); //! If a MIDI connection is still open, it will be closed by the destructor. ~RtMidiIn ( void ) throw(); //! Returns the MIDI API specifier for the current instance of RtMidiIn. RtMidi::Api getCurrentApi( void ) throw(); //! Open a MIDI input connection given by enumeration number. /*! \param portNumber An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. \param portName An optional name for the application port that is used to connect to portId can be specified. */ void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Input" ) ); //! Create a virtual input port, with optional name, to allow software connections (OS X, JACK and ALSA only). /*! This function creates a virtual MIDI input port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X, any JACK, and Linux ALSA APIs (the function returns an error for the other APIs). \param portName An optional name for the application port that is used to connect to portId can be specified. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); //! Set a callback function to be invoked for incoming MIDI messages. /*! The callback function will be called whenever an incoming MIDI message is received. While not absolutely necessary, it is best to set the callback function before opening a MIDI port to avoid leaving some messages in the queue. \param callback A callback function must be given. \param userData Optionally, a pointer to additional data can be passed to the callback function whenever it is called. */ void setCallback( RtMidiCallback callback, void *userData = 0 ); //! Cancel use of the current callback function (if one exists). /*! Subsequent incoming MIDI messages will be written to the queue and can be retrieved with the \e getMessage function. */ void cancelCallback(); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Returns true if a port is open and false if not. virtual bool isPortOpen() const; //! Return the number of available MIDI input ports. /*! \return This function returns the number of MIDI ports of the selected API. */ unsigned int getPortCount(); //! Return a string identifier for the specified MIDI input port number. /*! \return The name of the port with the given Id is returned. \retval An empty string is returned if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Specify whether certain MIDI message types should be queued or ignored during input. /*! By default, MIDI timing and active sensing messages are ignored during message input because of their relative high data rates. MIDI sysex messages are ignored by default as well. Variable values of "true" imply that the respective message type will be ignored. */ void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); //! Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds. /*! This function returns immediately whether a new message is available or not. A valid message is indicated by a non-zero vector size. An exception is thrown if an error occurs during message retrieval or an input connection was not previously established. */ double getMessage( std::vector *message ); //! Set an error callback function to be invoked when an error has occured. /*! The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port. */ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL, void *userData = 0 ); protected: void openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit ); }; /**********************************************************************/ /*! \class RtMidiOut \brief A realtime MIDI output class. This class provides a common, platform-independent API for MIDI output. It allows one to probe available MIDI output ports, to connect to one such port, and to send MIDI bytes immediately over the connection. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X, Linux ALSA and JACK MIDI APIs, it is also possible to open a virtual port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2014. */ /**********************************************************************/ class RtMidiOut : public RtMidi { public: //! Default constructor that allows an optional client name. /*! An exception will be thrown if a MIDI system initialization error occurs. If no API argument is specified and multiple API support has been compiled, the default order of use is ALSA, JACK (Linux) and CORE, JACK (OS-X). */ RtMidiOut( RtMidi::Api api=UNSPECIFIED, const std::string clientName = std::string( "RtMidi Output Client") ); //! The destructor closes any open MIDI connections. ~RtMidiOut( void ) throw(); //! Returns the MIDI API specifier for the current instance of RtMidiOut. RtMidi::Api getCurrentApi( void ) throw(); //! Open a MIDI output connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. An exception is thrown if an error occurs while attempting to make the port connection. */ void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Output" ) ); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Returns true if a port is open and false if not. virtual bool isPortOpen() const; //! Create a virtual output port, with optional name, to allow software connections (OS X, JACK and ALSA only). /*! This function creates a virtual MIDI output port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X, Linux ALSA and JACK APIs (the function does nothing with the other APIs). An exception is thrown if an error occurs while attempting to create the virtual port. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); //! Return the number of available MIDI output ports. unsigned int getPortCount( void ); //! Return a string identifier for the specified MIDI port type and number. /*! An empty string is returned if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Immediately send a single message out an open MIDI output port. /*! An exception is thrown if an error occurs during output or an output connection was not previously established. */ void sendMessage( std::vector *message ); //! Set an error callback function to be invoked when an error has occured. /*! The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port. */ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL, void *userData = 0 ); protected: void openMidiApi( RtMidi::Api api, const std::string clientName ); }; // **************************************************************** // // // MidiInApi / MidiOutApi class declarations. // // Subclasses of MidiInApi and MidiOutApi contain all API- and // OS-specific code necessary to fully implement the RtMidi API. // // Note that MidiInApi and MidiOutApi are abstract base classes and // cannot be explicitly instantiated. RtMidiIn and RtMidiOut will // create instances of a MidiInApi or MidiOutApi subclass. // // **************************************************************** // class MidiApi { public: MidiApi(); virtual ~MidiApi(); virtual RtMidi::Api getCurrentApi( void ) = 0; virtual void openPort( unsigned int portNumber, const std::string portName ) = 0; virtual void openVirtualPort( const std::string portName ) = 0; virtual void closePort( void ) = 0; virtual unsigned int getPortCount( void ) = 0; virtual std::string getPortName( unsigned int portNumber ) = 0; inline bool isPortOpen() const { return connected_; } void setErrorCallback( RtMidiErrorCallback errorCallback, void *userData ); //! A basic error reporting function for RtMidi classes. void error( RtMidiError::Type type, std::string errorString ); protected: virtual void initialize( const std::string& clientName ) = 0; void *apiData_; bool connected_; std::string errorString_; RtMidiErrorCallback errorCallback_; bool firstErrorOccurred_; void *errorCallbackUserData_; }; class MidiInApi : public MidiApi { public: MidiInApi( unsigned int queueSizeLimit ); virtual ~MidiInApi( void ); void setCallback( RtMidiIn::RtMidiCallback callback, void *userData ); void cancelCallback( void ); virtual void ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ); double getMessage( std::vector *message ); // A MIDI structure used internally by the class to store incoming // messages. Each message represents one and only one MIDI message. struct MidiMessage { std::vector bytes; double timeStamp; // Default constructor. MidiMessage() :bytes(0), timeStamp(0.0) {} }; struct MidiQueue { unsigned int front; unsigned int back; unsigned int size; unsigned int ringSize; MidiMessage *ring; // Default constructor. MidiQueue() :front(0), back(0), size(0), ringSize(0) {} }; // The RtMidiInData structure is used to pass private class data to // the MIDI input handling function or thread. struct RtMidiInData { MidiQueue queue; MidiMessage message; unsigned char ignoreFlags; bool doInput; bool firstMessage; void *apiData; bool usingCallback; RtMidiIn::RtMidiCallback userCallback; void *userData; bool continueSysex; // Default constructor. RtMidiInData() : ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false), userCallback(0), userData(0), continueSysex(false) {} }; protected: RtMidiInData inputData_; }; class MidiOutApi : public MidiApi { public: MidiOutApi( void ); virtual ~MidiOutApi( void ); virtual void sendMessage( std::vector *message ) = 0; }; // **************************************************************** // // // Inline RtMidiIn and RtMidiOut definitions. // // **************************************************************** // inline RtMidi::Api RtMidiIn :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); } inline void RtMidiIn :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); } inline void RtMidiIn :: closePort( void ) { rtapi_->closePort(); } inline bool RtMidiIn :: isPortOpen() const { return rtapi_->isPortOpen(); } inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); } inline void RtMidiIn :: cancelCallback( void ) { ((MidiInApi *)rtapi_)->cancelCallback(); } inline unsigned int RtMidiIn :: getPortCount( void ) { return rtapi_->getPortCount(); } inline std::string RtMidiIn :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); } inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); } inline double RtMidiIn :: getMessage( std::vector *message ) { return ((MidiInApi *)rtapi_)->getMessage( message ); } inline void RtMidiIn :: setErrorCallback( RtMidiErrorCallback errorCallback, void *userData ) { rtapi_->setErrorCallback(errorCallback, userData); } inline RtMidi::Api RtMidiOut :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); } inline void RtMidiOut :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); } inline void RtMidiOut :: closePort( void ) { rtapi_->closePort(); } inline bool RtMidiOut :: isPortOpen() const { return rtapi_->isPortOpen(); } inline unsigned int RtMidiOut :: getPortCount( void ) { return rtapi_->getPortCount(); } inline std::string RtMidiOut :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); } inline void RtMidiOut :: sendMessage( std::vector *message ) { ((MidiOutApi *)rtapi_)->sendMessage( message ); } inline void RtMidiOut :: setErrorCallback( RtMidiErrorCallback errorCallback, void *userData ) { rtapi_->setErrorCallback(errorCallback, userData); } // **************************************************************** // // // MidiInApi and MidiOutApi subclass prototypes. // // **************************************************************** // #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__) #define __RTMIDI_DUMMY__ #endif #if defined(__MACOSX_CORE__) class MidiInCore: public MidiInApi { public: MidiInCore( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInCore( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: void initialize( const std::string& clientName ); }; class MidiOutCore: public MidiOutApi { public: MidiOutCore( const std::string clientName ); ~MidiOutCore( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: void initialize( const std::string& clientName ); }; #endif #if defined(__UNIX_JACK__) class MidiInJack: public MidiInApi { public: MidiInJack( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInJack( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: std::string clientName; void connect( void ); void initialize( const std::string& clientName ); }; class MidiOutJack: public MidiOutApi { public: MidiOutJack( const std::string clientName ); ~MidiOutJack( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: std::string clientName; void connect( void ); void initialize( const std::string& clientName ); }; #endif #if defined(__LINUX_ALSA__) class MidiInAlsa: public MidiInApi { public: MidiInAlsa( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInAlsa( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: void initialize( const std::string& clientName ); }; class MidiOutAlsa: public MidiOutApi { public: MidiOutAlsa( const std::string clientName ); ~MidiOutAlsa( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: void initialize( const std::string& clientName ); }; #endif #if defined(__WINDOWS_MM__) class MidiInWinMM: public MidiInApi { public: MidiInWinMM( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInWinMM( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: void initialize( const std::string& clientName ); }; class MidiOutWinMM: public MidiOutApi { public: MidiOutWinMM( const std::string clientName ); ~MidiOutWinMM( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: void initialize( const std::string& clientName ); }; #endif #if defined(__RTMIDI_DUMMY__) class MidiInDummy: public MidiInApi { public: MidiInDummy( const std::string /*clientName*/, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); } RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; } void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {} void openVirtualPort( const std::string /*portName*/ ) {} void closePort( void ) {} unsigned int getPortCount( void ) { return 0; } std::string getPortName( unsigned int /*portNumber*/ ) { return ""; } protected: void initialize( const std::string& /*clientName*/ ) {} }; class MidiOutDummy: public MidiOutApi { public: MidiOutDummy( const std::string /*clientName*/ ) { errorString_ = "MidiOutDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); } RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; } void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {} void openVirtualPort( const std::string /*portName*/ ) {} void closePort( void ) {} unsigned int getPortCount( void ) { return 0; } std::string getPortName( unsigned int /*portNumber*/ ) { return ""; } void sendMessage( std::vector * /*message*/ ) {} protected: void initialize( const std::string& /*clientName*/ ) {} }; #endif #endif sonic-visualiser-3.0.3/svcore/data/model/AggregateWaveModel.cpp0000644000000000000000000001326613111512442022654 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "AggregateWaveModel.h" #include #include using namespace std; PowerOfSqrtTwoZoomConstraint AggregateWaveModel::m_zoomConstraint; AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) : m_components(channelSpecs), m_invalidated(false) { for (ChannelSpecList::const_iterator i = channelSpecs.begin(); i != channelSpecs.end(); ++i) { connect(i->model, SIGNAL(aboutToBeDeleted()), this, SLOT(componentModelAboutToBeDeleted())); if (i->model->getSampleRate() != channelSpecs.begin()->model->getSampleRate()) { SVDEBUG << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << endl; break; } } } AggregateWaveModel::~AggregateWaveModel() { } void AggregateWaveModel::componentModelAboutToBeDeleted() { SVDEBUG << "AggregateWaveModel::componentModelAboutToBeDeleted: invalidating" << endl; m_components.clear(); m_invalidated = true; emit modelInvalidated(); } bool AggregateWaveModel::isOK() const { if (m_invalidated) { return false; } for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { if (!i->model->isOK()) { return false; } } return true; } bool AggregateWaveModel::isReady(int *completion) const { if (completion) *completion = 100; bool ready = true; for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { int completionHere = 100; if (!i->model->isReady(&completionHere)) ready = false; if (completion && completionHere < *completion) { *completion = completionHere; } } return ready; } sv_frame_t AggregateWaveModel::getFrameCount() const { sv_frame_t count = 0; for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { sv_frame_t thisCount = i->model->getEndFrame() - i->model->getStartFrame(); if (thisCount > count) count = thisCount; } return count; } int AggregateWaveModel::getChannelCount() const { return int(m_components.size()); } sv_samplerate_t AggregateWaveModel::getSampleRate() const { if (m_components.empty()) return 0; return m_components.begin()->model->getSampleRate(); } floatvec_t AggregateWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const { int ch0 = channel, ch1 = channel; if (channel == -1) { ch0 = 0; ch1 = getChannelCount()-1; } floatvec_t result(count, 0.f); sv_frame_t longest = 0; for (int c = ch0; c <= ch1; ++c) { auto here = m_components[c].model->getData(m_components[c].channel, start, count); if (sv_frame_t(here.size()) > longest) { longest = sv_frame_t(here.size()); } for (sv_frame_t i = 0; in_range_for(here, i); ++i) { result[i] += here[i]; } } result.resize(longest); return result; } vector AggregateWaveModel::getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const { sv_frame_t min = count; vector result; for (int c = fromchannel; c <= tochannel; ++c) { auto here = getData(c, start, count); if (sv_frame_t(here.size()) < min) { min = sv_frame_t(here.size()); } result.push_back(here); } if (min < count) { for (auto &v : result) v.resize(min); } return result; } int AggregateWaveModel::getSummaryBlockSize(int desired) const { //!!! complete return desired; } void AggregateWaveModel::getSummaries(int, sv_frame_t, sv_frame_t, RangeBlock &, int &) const { //!!! complete } AggregateWaveModel::Range AggregateWaveModel::getSummary(int, sv_frame_t, sv_frame_t) const { //!!! complete return Range(); } int AggregateWaveModel::getComponentCount() const { return int(m_components.size()); } AggregateWaveModel::ModelChannelSpec AggregateWaveModel::getComponent(int c) const { return m_components[c]; } void AggregateWaveModel::componentModelChanged() { emit modelChanged(); } void AggregateWaveModel::componentModelChangedWithin(sv_frame_t start, sv_frame_t end) { emit modelChangedWithin(start, end); } void AggregateWaveModel::componentModelCompletionChanged() { emit completionChanged(); } void AggregateWaveModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { QStringList componentStrings; for (const auto &c: m_components) { componentStrings.push_back(QString("%1").arg(getObjectExportId(c.model))); } Model::toXml(out, indent, QString("type=\"aggregatewave\" components=\"%1\" %2") .arg(componentStrings.join(",")) .arg(extraAttributes)); } sonic-visualiser-3.0.3/svcore/data/model/AggregateWaveModel.h0000644000000000000000000000603113111512442022311 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _AGGREGATE_WAVE_MODEL_H_ #define _AGGREGATE_WAVE_MODEL_H_ #include "RangeSummarisableTimeValueModel.h" #include "PowerOfSqrtTwoZoomConstraint.h" #include class AggregateWaveModel : public RangeSummarisableTimeValueModel { Q_OBJECT public: struct ModelChannelSpec { ModelChannelSpec(RangeSummarisableTimeValueModel *m, int c) : model(m), channel(c) { } RangeSummarisableTimeValueModel *model; int channel; }; typedef std::vector ChannelSpecList; AggregateWaveModel(ChannelSpecList channelSpecs); ~AggregateWaveModel(); bool isOK() const; bool isReady(int *) const; QString getTypeName() const { return tr("Aggregate Wave"); } int getComponentCount() const; ModelChannelSpec getComponent(int c) const; const ZoomConstraint *getZoomConstraint() const { return &m_zoomConstraint; } sv_frame_t getFrameCount() const; int getChannelCount() const; sv_samplerate_t getSampleRate() const; float getValueMinimum() const { return -1.0f; } float getValueMaximum() const { return 1.0f; } virtual sv_frame_t getStartFrame() const { return 0; } virtual sv_frame_t getEndFrame() const { return getFrameCount(); } virtual floatvec_t getData(int channel, sv_frame_t start, sv_frame_t count) const; virtual std::vector getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const; virtual int getSummaryBlockSize(int desired) const; virtual void getSummaries(int channel, sv_frame_t start, sv_frame_t count, RangeBlock &ranges, int &blockSize) const; virtual Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const; virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; signals: void modelChanged(); void modelChangedWithin(sv_frame_t, sv_frame_t); void completionChanged(); void modelInvalidated(); protected slots: void componentModelChanged(); void componentModelChangedWithin(sv_frame_t, sv_frame_t); void componentModelCompletionChanged(); void componentModelAboutToBeDeleted(); protected: ChannelSpecList m_components; static PowerOfSqrtTwoZoomConstraint m_zoomConstraint; bool m_invalidated; // because one of its component models is aboutToBeDeleted }; #endif sonic-visualiser-3.0.3/svcore/data/model/AlignmentModel.cpp0000644000000000000000000002532113111512442022054 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "AlignmentModel.h" #include "SparseTimeValueModel.h" //#define DEBUG_ALIGNMENT_MODEL 1 AlignmentModel::AlignmentModel(Model *reference, Model *aligned, Model *inputModel, SparseTimeValueModel *path) : m_reference(reference), m_aligned(aligned), m_inputModel(inputModel), m_rawPath(path), m_path(0), m_reversePath(0), m_pathBegun(false), m_pathComplete(false) { if (m_rawPath) { connect(m_rawPath, SIGNAL(modelChanged()), this, SLOT(pathChanged())); connect(m_rawPath, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(pathChangedWithin(sv_frame_t, sv_frame_t))); connect(m_rawPath, SIGNAL(completionChanged()), this, SLOT(pathCompletionChanged())); constructPath(); constructReversePath(); } if (m_rawPath && m_rawPath->isReady()) { pathCompletionChanged(); } } AlignmentModel::~AlignmentModel() { if (m_inputModel) m_inputModel->aboutToDelete(); delete m_inputModel; if (m_rawPath) m_rawPath->aboutToDelete(); delete m_rawPath; if (m_path) m_path->aboutToDelete(); delete m_path; if (m_reversePath) m_reversePath->aboutToDelete(); delete m_reversePath; } bool AlignmentModel::isOK() const { if (m_rawPath) return m_rawPath->isOK(); else return true; } sv_frame_t AlignmentModel::getStartFrame() const { sv_frame_t a = m_reference->getStartFrame(); sv_frame_t b = m_aligned->getStartFrame(); return std::min(a, b); } sv_frame_t AlignmentModel::getEndFrame() const { sv_frame_t a = m_reference->getEndFrame(); sv_frame_t b = m_aligned->getEndFrame(); return std::max(a, b); } sv_samplerate_t AlignmentModel::getSampleRate() const { return m_reference->getSampleRate(); } bool AlignmentModel::isReady(int *completion) const { if (!m_pathBegun && m_rawPath) { if (completion) *completion = 0; return false; } if (m_pathComplete) { if (completion) *completion = 100; return true; } if (!m_rawPath) { // lack of raw path could mean path is complete (in which case // m_pathComplete true above) or else no alignment has been // set at all yet (this case) if (completion) *completion = 0; return false; } return m_rawPath->isReady(completion); } const ZoomConstraint * AlignmentModel::getZoomConstraint() const { return 0; } const Model * AlignmentModel::getReferenceModel() const { return m_reference; } const Model * AlignmentModel::getAlignedModel() const { return m_aligned; } sv_frame_t AlignmentModel::toReference(sv_frame_t frame) const { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::toReference(" << frame << ")" << endl; #endif if (!m_path) { if (!m_rawPath) return frame; constructPath(); } return align(m_path, frame); } sv_frame_t AlignmentModel::fromReference(sv_frame_t frame) const { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::fromReference(" << frame << ")" << endl; #endif if (!m_reversePath) { if (!m_rawPath) return frame; constructReversePath(); } return align(m_reversePath, frame); } void AlignmentModel::pathChanged() { if (m_pathComplete) { cerr << "AlignmentModel: deleting raw path model" << endl; if (m_rawPath) m_rawPath->aboutToDelete(); delete m_rawPath; m_rawPath = 0; } } void AlignmentModel::pathChangedWithin(sv_frame_t, sv_frame_t) { if (!m_pathComplete) return; constructPath(); constructReversePath(); } void AlignmentModel::pathCompletionChanged() { if (!m_rawPath) return; m_pathBegun = true; if (!m_pathComplete) { int completion = 0; m_rawPath->isReady(&completion); #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::pathCompletionChanged: completion = " << completion << endl; #endif m_pathComplete = (completion == 100); if (m_pathComplete) { constructPath(); constructReversePath(); if (m_inputModel) m_inputModel->aboutToDelete(); delete m_inputModel; m_inputModel = 0; } } emit completionChanged(); } void AlignmentModel::constructPath() const { if (!m_path) { if (!m_rawPath) { cerr << "ERROR: AlignmentModel::constructPath: " << "No raw path available" << endl; return; } m_path = new PathModel (m_rawPath->getSampleRate(), m_rawPath->getResolution(), false); } else { if (!m_rawPath) return; } m_path->clear(); SparseTimeValueModel::PointList points = m_rawPath->getPoints(); for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { sv_frame_t frame = i->frame; double value = i->value; sv_frame_t rframe = lrint(value * m_aligned->getSampleRate()); m_path->addPoint(PathPoint(frame, rframe)); } #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::constructPath: " << m_path->getPointCount() << " points, at least " << (2 * m_path->getPointCount() * (3 * sizeof(void *) + sizeof(int) + sizeof(PathPoint))) << " bytes" << endl; #endif } void AlignmentModel::constructReversePath() const { if (!m_reversePath) { if (!m_path) { cerr << "ERROR: AlignmentModel::constructReversePath: " << "No forward path available" << endl; return; } m_reversePath = new PathModel (m_path->getSampleRate(), m_path->getResolution(), false); } else { if (!m_path) return; } m_reversePath->clear(); PathModel::PointList points = m_path->getPoints(); for (PathModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { sv_frame_t frame = i->frame; sv_frame_t rframe = i->mapframe; m_reversePath->addPoint(PathPoint(rframe, frame)); } #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::constructReversePath: " << m_reversePath->getPointCount() << " points, at least " << (2 * m_reversePath->getPointCount() * (3 * sizeof(void *) + sizeof(int) + sizeof(PathPoint))) << " bytes" << endl; #endif } sv_frame_t AlignmentModel::align(PathModel *path, sv_frame_t frame) const { if (!path) return frame; // The path consists of a series of points, each with frame equal // to the frame on the source model and mapframe equal to the // frame on the target model. Both should be monotonically // increasing. const PathModel::PointList &points = path->getPoints(); if (points.empty()) { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::align: No points" << endl; #endif return frame; } #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::align: frame " << frame << " requested" << endl; #endif PathModel::Point point(frame); PathModel::PointList::const_iterator i = points.lower_bound(point); if (i == points.end()) { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "Note: i == points.end()" << endl; #endif --i; } while (i != points.begin() && i->frame > frame) --i; sv_frame_t foundFrame = i->frame; sv_frame_t foundMapFrame = i->mapframe; sv_frame_t followingFrame = foundFrame; sv_frame_t followingMapFrame = foundMapFrame; if (++i != points.end()) { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "another point available" << endl; #endif followingFrame = i->frame; followingMapFrame = i->mapframe; } else { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "no other point available" << endl; #endif } #ifdef DEBUG_ALIGNMENT_MODEL cerr << "foundFrame = " << foundFrame << ", foundMapFrame = " << foundMapFrame << ", followingFrame = " << followingFrame << ", followingMapFrame = " << followingMapFrame << endl; #endif if (foundMapFrame < 0) return 0; sv_frame_t resultFrame = foundMapFrame; if (followingFrame != foundFrame && frame > foundFrame) { double interp = double(frame - foundFrame) / double(followingFrame - foundFrame); resultFrame += lrint(double(followingMapFrame - foundMapFrame) * interp); } #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::align: resultFrame = " << resultFrame << endl; #endif return resultFrame; } void AlignmentModel::setPathFrom(SparseTimeValueModel *rawpath) { if (m_rawPath) m_rawPath->aboutToDelete(); delete m_rawPath; m_rawPath = rawpath; connect(m_rawPath, SIGNAL(modelChanged()), this, SLOT(pathChanged())); connect(m_rawPath, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(pathChangedWithin(sv_frame_t, sv_frame_t))); connect(m_rawPath, SIGNAL(completionChanged()), this, SLOT(pathCompletionChanged())); constructPath(); constructReversePath(); if (m_rawPath->isReady()) { pathCompletionChanged(); } } void AlignmentModel::setPath(PathModel *path) { if (m_path) m_path->aboutToDelete(); delete m_path; m_path = path; #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::setPath: path = " << m_path << endl; #endif constructReversePath(); #ifdef DEBUG_ALIGNMENT_MODEL cerr << "AlignmentModel::setPath: after construction path = " << m_path << ", rpath = " << m_reversePath << endl; #endif } void AlignmentModel::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { if (!m_path) { SVDEBUG << "AlignmentModel::toXml: no path" << endl; return; } m_path->toXml(stream, indent, ""); Model::toXml(stream, indent, QString("type=\"alignment\" reference=\"%1\" aligned=\"%2\" path=\"%3\" %4") .arg(getObjectExportId(m_reference)) .arg(getObjectExportId(m_aligned)) .arg(getObjectExportId(m_path)) .arg(extraAttributes)); } sonic-visualiser-3.0.3/svcore/data/model/AlignmentModel.h0000644000000000000000000000515413111512442021523 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _ALIGNMENT_MODEL_H_ #define _ALIGNMENT_MODEL_H_ #include "Model.h" #include "PathModel.h" #include "base/RealTime.h" #include #include class SparseTimeValueModel; class AlignmentModel : public Model { Q_OBJECT public: AlignmentModel(Model *reference, Model *aligned, Model *inputModel, // probably an AggregateWaveModel; may be null; I take ownership SparseTimeValueModel *path); // I take ownership ~AlignmentModel(); virtual bool isOK() const; virtual sv_frame_t getStartFrame() const; virtual sv_frame_t getEndFrame() const; virtual sv_samplerate_t getSampleRate() const; virtual bool isReady(int *completion = 0) const; virtual const ZoomConstraint *getZoomConstraint() const; QString getTypeName() const { return tr("Alignment"); } const Model *getReferenceModel() const; const Model *getAlignedModel() const; sv_frame_t toReference(sv_frame_t frame) const; sv_frame_t fromReference(sv_frame_t frame) const; void setPathFrom(SparseTimeValueModel *rawpath); void setPath(PathModel *path); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; signals: void modelChanged(); void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); void completionChanged(); protected slots: void pathChanged(); void pathChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); void pathCompletionChanged(); protected: Model *m_reference; // I don't own this Model *m_aligned; // I don't own this Model *m_inputModel; // I own this SparseTimeValueModel *m_rawPath; // I own this mutable PathModel *m_path; // I own this mutable PathModel *m_reversePath; // I own this bool m_pathBegun; bool m_pathComplete; void constructPath() const; void constructReversePath() const; sv_frame_t align(PathModel *path, sv_frame_t frame) const; }; #endif sonic-visualiser-3.0.3/svcore/data/model/Dense3DModelPeakCache.cpp0000644000000000000000000000737613111512442023122 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Dense3DModelPeakCache.h" #include "base/Profiler.h" #include "base/HitCount.h" Dense3DModelPeakCache::Dense3DModelPeakCache(const DenseThreeDimensionalModel *source, int columnsPerPeak) : m_source(source), m_columnsPerPeak(columnsPerPeak) { m_cache = new EditableDenseThreeDimensionalModel (source->getSampleRate(), getResolution(), source->getHeight(), EditableDenseThreeDimensionalModel::NoCompression, false); connect(source, SIGNAL(modelChanged()), this, SLOT(sourceModelChanged())); connect(source, SIGNAL(aboutToBeDeleted()), this, SLOT(sourceModelAboutToBeDeleted())); } Dense3DModelPeakCache::~Dense3DModelPeakCache() { if (m_cache) m_cache->aboutToDelete(); delete m_cache; } Dense3DModelPeakCache::Column Dense3DModelPeakCache::getColumn(int column) const { if (!m_source) return Column(); if (!haveColumn(column)) fillColumn(column); return m_cache->getColumn(column); } float Dense3DModelPeakCache::getValueAt(int column, int n) const { if (!m_source) return 0.f; if (!haveColumn(column)) fillColumn(column); return m_cache->getValueAt(column, n); } void Dense3DModelPeakCache::sourceModelChanged() { if (!m_source) return; if (m_coverage.size() > 0) { // The last peak may have come from an incomplete read, which // may since have been filled, so reset it m_coverage[m_coverage.size()-1] = false; } m_coverage.resize(getWidth(), false); // retaining data } void Dense3DModelPeakCache::sourceModelAboutToBeDeleted() { m_source = 0; } bool Dense3DModelPeakCache::haveColumn(int column) const { static HitCount count("Dense3DModelPeakCache"); if (in_range_for(m_coverage, column) && m_coverage[column]) { count.hit(); return true; } else { count.miss(); return false; } } void Dense3DModelPeakCache::fillColumn(int column) const { Profiler profiler("Dense3DModelPeakCache::fillColumn"); if (!in_range_for(m_coverage, column)) { if (m_coverage.size() > 0) { // The last peak may have come from an incomplete read, which // may since have been filled, so reset it m_coverage[m_coverage.size()-1] = false; } m_coverage.resize(column + 1, false); } int sourceWidth = m_source->getWidth(); Column peak; int n = 0; for (int i = 0; i < m_columnsPerPeak; ++i) { int sourceColumn = column * m_columnsPerPeak + i; if (sourceColumn >= sourceWidth) break; Column here = m_source->getColumn(sourceColumn); // cerr << "Dense3DModelPeakCache::fillColumn(" << column << "): source col " // << sourceColumn << " of " << sourceWidth // << " returned " << here.size() << " elts" << endl; if (i == 0) { peak = here; n = int(peak.size()); } else { int m = std::min(n, int(here.size())); for (int j = 0; j < m; ++j) { peak[j] = std::max(here[j], peak[j]); } } } m_cache->setColumn(column, peak); m_coverage[column] = true; } sonic-visualiser-3.0.3/svcore/data/model/Dense3DModelPeakCache.h0000644000000000000000000000635313111512442022561 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef DENSE_3D_MODEL_PEAK_CACHE_H #define DENSE_3D_MODEL_PEAK_CACHE_H #include "DenseThreeDimensionalModel.h" #include "EditableDenseThreeDimensionalModel.h" class Dense3DModelPeakCache : public DenseThreeDimensionalModel { Q_OBJECT public: Dense3DModelPeakCache(const DenseThreeDimensionalModel *source, int columnsPerPeak); ~Dense3DModelPeakCache(); virtual bool isOK() const { return m_source && m_source->isOK(); } virtual sv_samplerate_t getSampleRate() const { return m_source->getSampleRate(); } virtual sv_frame_t getStartFrame() const { return m_source->getStartFrame(); } virtual sv_frame_t getEndFrame() const { return m_source->getEndFrame(); } virtual int getResolution() const { return m_source->getResolution() * m_columnsPerPeak; } virtual int getColumnsPerPeak() const { return m_columnsPerPeak; } virtual int getWidth() const { int sourceWidth = m_source->getWidth(); if ((sourceWidth % m_columnsPerPeak) == 0) { return sourceWidth / m_columnsPerPeak; } else { return sourceWidth / m_columnsPerPeak + 1; } } virtual int getHeight() const { return m_source->getHeight(); } virtual float getMinimumLevel() const { return m_source->getMinimumLevel(); } virtual float getMaximumLevel() const { return m_source->getMaximumLevel(); } /** * Retrieve the peaks column at peak-cache column number col. This * will consist of the peak values in the underlying model from * columns (col * getColumnsPerPeak()) to ((col+1) * * getColumnsPerPeak() - 1) inclusive. */ virtual Column getColumn(int col) const; virtual float getValueAt(int col, int n) const; virtual QString getBinName(int n) const { return m_source->getBinName(n); } virtual bool shouldUseLogValueScale() const { return m_source->shouldUseLogValueScale(); } QString getTypeName() const { return tr("Dense 3-D Peak Cache"); } virtual int getCompletion() const { return m_source->getCompletion(); } protected slots: void sourceModelChanged(); void sourceModelAboutToBeDeleted(); private: const DenseThreeDimensionalModel *m_source; mutable EditableDenseThreeDimensionalModel *m_cache; mutable std::vector m_coverage; // must be bool, for space efficiency // (vector of bool uses 1-bit elements) int m_columnsPerPeak; bool haveColumn(int column) const; void fillColumn(int column) const; }; #endif sonic-visualiser-3.0.3/svcore/data/model/DenseThreeDimensionalModel.h0000644000000000000000000001171313111512442024014 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _DENSE_THREE_DIMENSIONAL_MODEL_H_ #define _DENSE_THREE_DIMENSIONAL_MODEL_H_ #include "Model.h" #include "TabularModel.h" #include "base/ColumnOp.h" #include "base/ZoomConstraint.h" #include "base/RealTime.h" #include #include class DenseThreeDimensionalModel : public Model, public TabularModel { Q_OBJECT public: /** * Return the number of sample frames covered by each column of bins. */ virtual int getResolution() const = 0; /** * Return the number of columns of bins in the model. */ virtual int getWidth() const = 0; /** * Return the number of bins in each column. */ virtual int getHeight() const = 0; /** * Return the minimum permissible value in each bin. */ virtual float getMinimumLevel() const = 0; /** * Return the maximum permissible value in each bin. */ virtual float getMaximumLevel() const = 0; typedef ColumnOp::Column Column; /** * Get data from the given column of bin values. */ virtual Column getColumn(int column) const = 0; /** * Get the single data point from the n'th bin of the given column. */ virtual float getValueAt(int column, int n) const = 0; /** * Get the name of a given bin (i.e. a label to associate with * that bin across all columns). */ virtual QString getBinName(int n) const = 0; /** * Return true if the bins have values as well as names. If this * returns true, getBinValue() may be used to retrieve the values. */ virtual bool hasBinValues() const { return false; } /** * Return the value of bin n, if any. This is a "vertical scale" * value which does not vary from one column to the next. This is * only meaningful if hasBinValues() returns true. */ virtual float getBinValue(int n) const { return float(n); } /** * Obtain the name of the unit of the values returned from * getBinValue(), if any. */ virtual QString getBinValueUnit() const { return ""; } /** * Estimate whether a logarithmic scale might be appropriate for * the value scale. */ virtual bool shouldUseLogValueScale() const = 0; /** * Utility function to query whether a given bin is greater than * its (vertical) neighbours. */ bool isLocalPeak(int x, int y) { float value = getValueAt(x, y); if (y > 0 && value < getValueAt(x, y - 1)) return false; if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false; return true; } /** * Utility function to query whether a given bin is greater than a * certain threshold. */ bool isOverThreshold(int x, int y, float threshold) { return getValueAt(x, y) > threshold; } QString getTypeName() const { return tr("Dense 3-D"); } virtual int getCompletion() const = 0; /* TabularModel methods. This class is non-editable -- subclasses may be editable. Row and column are transposed for the tabular view (which is "on its side"). */ virtual int getRowCount() const { return getWidth(); } virtual int getColumnCount() const { return getHeight() + 2; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); default: return getBinName(column - 2); } } virtual QVariant getData(int row, int column, int) const { switch (column) { case 0: { RealTime rt = RealTime::frame2RealTime (row * getResolution() + getStartFrame(), getSampleRate()); return rt.toText().c_str(); } case 1: return int(row * getResolution() + getStartFrame()); default: return getValueAt(row, column - 2); } } virtual bool isColumnTimeValue(int col) const { return col < 2; } virtual SortType getSortType(int) const { return SortNumeric; } virtual sv_frame_t getFrameForRow(int row) const { return sv_frame_t(row) * getResolution() + getStartFrame(); } virtual int getRowForFrame(sv_frame_t frame) const { return int((frame - getStartFrame()) / getResolution()); } protected: DenseThreeDimensionalModel() { } }; #endif sonic-visualiser-3.0.3/svcore/data/model/DenseTimeValueModel.cpp0000644000000000000000000000313313111512442023005 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "DenseTimeValueModel.h" #include "base/PlayParameterRepository.h" #include DenseTimeValueModel::DenseTimeValueModel() { PlayParameterRepository::getInstance()->addPlayable(this); } DenseTimeValueModel::~DenseTimeValueModel() { PlayParameterRepository::getInstance()->removePlayable(this); } QString DenseTimeValueModel::toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const { int ch = getChannelCount(); cerr << "f0 = " << f0 << ", f1 = " << f1 << endl; if (f1 <= f0) return ""; auto data = getMultiChannelData(0, ch - 1, f0, f1 - f0); if (data.empty() || data[0].empty()) return ""; QStringList list; for (sv_frame_t i = 0; in_range_for(data[0], i); ++i) { QStringList parts; parts << QString("%1").arg(f0 + i); for (int c = 0; in_range_for(data, c); ++c) { parts << QString("%1").arg(data[c][i]); } list << parts.join(delimiter); } return list.join("\n"); } sonic-visualiser-3.0.3/svcore/data/model/DenseTimeValueModel.h0000644000000000000000000000603313111512442022454 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_DENSE_TIME_VALUE_MODEL_H #define SV_DENSE_TIME_VALUE_MODEL_H #include #include "Model.h" /** * Base class for models containing dense two-dimensional data (value * against time). For example, audio waveform data. Other time-value * plot data, especially if editable, will normally go into a * SparseTimeValueModel instead even if regularly sampled. */ class DenseTimeValueModel : public Model { Q_OBJECT public: DenseTimeValueModel(); virtual ~DenseTimeValueModel(); /** * Return the minimum possible value found in this model type. * (That is, the minimum that would be valid, not the minimum * actually found in a particular model). */ virtual float getValueMinimum() const = 0; /** * Return the minimum possible value found in this model type. * (That is, the minimum that would be valid, not the minimum * actually found in a particular model). */ virtual float getValueMaximum() const = 0; /** * Return the number of distinct channels for this model. */ virtual int getChannelCount() const = 0; /** * Get the specified set of samples from the given channel of the * model in single-precision floating-point format. Returned * vector may have fewer samples than requested, if the end of * file was reached. * * If the channel is given as -1, mix all available channels and * return the result. */ virtual floatvec_t getData(int channel, sv_frame_t start, sv_frame_t count) const = 0; /** * Get the specified set of samples from given contiguous range of * channels of the model in single-precision floating-point * format. Returned vector may have fewer samples than requested, * if the end of file was reached. */ virtual std::vector getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const = 0; virtual bool canPlay() const { return true; } virtual QString getDefaultPlayClipId() const { return ""; } virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const; QString getTypeName() const { return tr("Dense Time-Value"); } }; #endif sonic-visualiser-3.0.3/svcore/data/model/EditableDenseThreeDimensionalModel.cpp0000644000000000000000000003540413111512442026004 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "EditableDenseThreeDimensionalModel.h" #include "base/LogRange.h" #include #include #include #include #include #include #include using std::vector; #include "system/System.h" EditableDenseThreeDimensionalModel::EditableDenseThreeDimensionalModel(sv_samplerate_t sampleRate, int resolution, int yBinCount, CompressionType compression, bool notifyOnAdd) : m_startFrame(0), m_sampleRate(sampleRate), m_resolution(resolution), m_yBinCount(yBinCount), m_compression(compression), m_minimum(0.0), m_maximum(0.0), m_haveExtents(false), m_notifyOnAdd(notifyOnAdd), m_sinceLastNotifyMin(-1), m_sinceLastNotifyMax(-1), m_completion(100) { } bool EditableDenseThreeDimensionalModel::isOK() const { return true; } sv_samplerate_t EditableDenseThreeDimensionalModel::getSampleRate() const { return m_sampleRate; } sv_frame_t EditableDenseThreeDimensionalModel::getStartFrame() const { return m_startFrame; } void EditableDenseThreeDimensionalModel::setStartFrame(sv_frame_t f) { m_startFrame = f; } sv_frame_t EditableDenseThreeDimensionalModel::getEndFrame() const { return m_resolution * m_data.size() + (m_resolution - 1); } int EditableDenseThreeDimensionalModel::getResolution() const { return m_resolution; } void EditableDenseThreeDimensionalModel::setResolution(int sz) { m_resolution = sz; } int EditableDenseThreeDimensionalModel::getWidth() const { return int(m_data.size()); } int EditableDenseThreeDimensionalModel::getHeight() const { return m_yBinCount; } void EditableDenseThreeDimensionalModel::setHeight(int sz) { m_yBinCount = sz; } float EditableDenseThreeDimensionalModel::getMinimumLevel() const { return m_minimum; } void EditableDenseThreeDimensionalModel::setMinimumLevel(float level) { m_minimum = level; } float EditableDenseThreeDimensionalModel::getMaximumLevel() const { return m_maximum; } void EditableDenseThreeDimensionalModel::setMaximumLevel(float level) { m_maximum = level; } EditableDenseThreeDimensionalModel::Column EditableDenseThreeDimensionalModel::getColumn(int index) const { QReadLocker locker(&m_lock); if (in_range_for(m_data, index)) return expandAndRetrieve(index); else return Column(); } float EditableDenseThreeDimensionalModel::getValueAt(int index, int n) const { Column c = getColumn(index); if (in_range_for(c, n)) return c.at(n); return m_minimum; } //static int given = 0, stored = 0; void EditableDenseThreeDimensionalModel::truncateAndStore(int index, const Column &values) { assert(in_range_for(m_data, index)); //cout << "truncateAndStore(" << index << ", " << values.size() << ")" << endl; // The default case is to store the entire column at m_data[index] // and place 0 at m_trunc[index] to indicate that it has not been // truncated. We only do clever stuff if one of the clever-stuff // tests works out. m_trunc[index] = 0; if (index == 0 || m_compression == NoCompression || int(values.size()) != m_yBinCount) { // given += values.size(); // stored += values.size(); m_data[index] = values; return; } // Maximum distance between a column and the one we refer to as // the source of its truncated values. Limited by having to fit // in a signed char, but in any case small values are usually // better static int maxdist = 6; bool known = false; // do we know whether to truncate at top or bottom? bool top = false; // if we do know, will we truncate at top? // If the previous column is not truncated, then it is the only // candidate for comparison. If it is truncated, then the column // that it refers to is the only candidate. Either way, we only // have one possible column to compare against here, and we are // being careful to ensure it is not a truncated one (to avoid // doing more work recursively when uncompressing). int tdist = 1; int ptrunc = m_trunc[index-1]; if (ptrunc < 0) { top = false; known = true; tdist = -ptrunc + 1; } else if (ptrunc > 0) { top = true; known = true; tdist = ptrunc + 1; } Column p = expandAndRetrieve(index - tdist); int h = m_yBinCount; if (int(p.size()) == h && tdist <= maxdist) { int bcount = 0, tcount = 0; if (!known || !top) { // count how many identical values there are at the bottom for (int i = 0; i < h; ++i) { if (values.at(i) == p.at(i)) ++bcount; else break; } } if (!known || top) { // count how many identical values there are at the top for (int i = h; i > 0; --i) { if (values.at(i-1) == p.at(i-1)) ++tcount; else break; } } if (!known) top = (tcount > bcount); int limit = h / 4; // don't bother unless we have at least this many if ((top ? tcount : bcount) > limit) { if (!top) { // create a new column with h - bcount values from bcount up Column tcol(h - bcount); // given += values.size(); // stored += h - bcount; for (int i = bcount; i < h; ++i) { tcol[i - bcount] = values.at(i); } m_data[index] = tcol; m_trunc[index] = (signed char)(-tdist); return; } else { // create a new column with h - tcount values from 0 up Column tcol(h - tcount); // given += values.size(); // stored += h - tcount; for (int i = 0; i < h - tcount; ++i) { tcol[i] = values.at(i); } m_data[index] = tcol; m_trunc[index] = (signed char)(tdist); return; } } } // given += values.size(); // stored += values.size(); // cout << "given: " << given << ", stored: " << stored << " (" // << ((float(stored) / float(given)) * 100.f) << "%)" << endl; // default case if nothing wacky worked out m_data[index] = values; return; } EditableDenseThreeDimensionalModel::Column EditableDenseThreeDimensionalModel::rightHeight(const Column &c) const { if (int(c.size()) == m_yBinCount) return c; else { Column cc(c); cc.resize(m_yBinCount, 0.0); return cc; } } EditableDenseThreeDimensionalModel::Column EditableDenseThreeDimensionalModel::expandAndRetrieve(int index) const { // See comment above m_trunc declaration in header assert(index >= 0 && index < int(m_data.size())); Column c = m_data.at(index); if (index == 0) { return rightHeight(c); } int trunc = (int)m_trunc[index]; if (trunc == 0) { return rightHeight(c); } bool top = true; int tdist = trunc; if (trunc < 0) { top = false; tdist = -trunc; } Column p = expandAndRetrieve(index - tdist); int psize = int(p.size()), csize = int(c.size()); if (psize != m_yBinCount) { cerr << "WARNING: EditableDenseThreeDimensionalModel::expandAndRetrieve: Trying to expand from incorrectly sized column" << endl; } if (top) { for (int i = csize; i < psize; ++i) { c.push_back(p.at(i)); } } else { Column cc(psize); for (int i = 0; i < psize - csize; ++i) { cc[i] = p.at(i); } for (int i = 0; i < csize; ++i) { cc[i + (psize - csize)] = c.at(i); } return cc; } return c; } void EditableDenseThreeDimensionalModel::setColumn(int index, const Column &values) { QWriteLocker locker(&m_lock); while (index >= int(m_data.size())) { m_data.push_back(Column()); m_trunc.push_back(0); } bool allChange = false; for (int i = 0; in_range_for(values, i); ++i) { float value = values[i]; if (ISNAN(value) || ISINF(value)) { continue; } if (!m_haveExtents || value < m_minimum) { m_minimum = value; allChange = true; } if (!m_haveExtents || value > m_maximum) { m_maximum = value; allChange = true; } m_haveExtents = true; } truncateAndStore(index, values); // assert(values == expandAndRetrieve(index)); sv_frame_t windowStart = index; windowStart *= m_resolution; if (m_notifyOnAdd) { if (allChange) { emit modelChanged(); } else { emit modelChangedWithin(windowStart, windowStart + m_resolution); } } else { if (allChange) { m_sinceLastNotifyMin = -1; m_sinceLastNotifyMax = -1; emit modelChanged(); } else { if (m_sinceLastNotifyMin == -1 || windowStart < m_sinceLastNotifyMin) { m_sinceLastNotifyMin = windowStart; } if (m_sinceLastNotifyMax == -1 || windowStart > m_sinceLastNotifyMax) { m_sinceLastNotifyMax = windowStart; } } } } QString EditableDenseThreeDimensionalModel::getBinName(int n) const { if (n >= 0 && (int)m_binNames.size() > n) return m_binNames[n]; else return ""; } void EditableDenseThreeDimensionalModel::setBinName(int n, QString name) { while ((int)m_binNames.size() <= n) m_binNames.push_back(""); m_binNames[n] = name; emit modelChanged(); } void EditableDenseThreeDimensionalModel::setBinNames(std::vector names) { m_binNames = names; emit modelChanged(); } bool EditableDenseThreeDimensionalModel::hasBinValues() const { return !m_binValues.empty(); } float EditableDenseThreeDimensionalModel::getBinValue(int n) const { if (n < (int)m_binValues.size()) return m_binValues[n]; else return 0.f; } void EditableDenseThreeDimensionalModel::setBinValues(std::vector values) { m_binValues = values; } QString EditableDenseThreeDimensionalModel::getBinValueUnit() const { return m_binValueUnit; } void EditableDenseThreeDimensionalModel::setBinValueUnit(QString unit) { m_binValueUnit = unit; } bool EditableDenseThreeDimensionalModel::shouldUseLogValueScale() const { QReadLocker locker(&m_lock); vector sample; vector n; for (int i = 0; i < 10; ++i) { int index = i * 10; if (in_range_for(m_data, index)) { const Column &c = m_data.at(index); while (c.size() > sample.size()) { sample.push_back(0.0); n.push_back(0); } for (int j = 0; in_range_for(c, j); ++j) { sample[j] += c.at(j); ++n[j]; } } } if (sample.empty()) return false; for (decltype(sample)::size_type j = 0; j < sample.size(); ++j) { if (n[j]) sample[j] /= n[j]; } return LogRange::shouldUseLogScale(sample); } void EditableDenseThreeDimensionalModel::setCompletion(int completion, bool update) { if (m_completion != completion) { m_completion = completion; if (completion == 100) { m_notifyOnAdd = true; // henceforth emit modelChanged(); } else if (!m_notifyOnAdd) { if (update && m_sinceLastNotifyMin >= 0 && m_sinceLastNotifyMax >= 0) { emit modelChangedWithin(m_sinceLastNotifyMin, m_sinceLastNotifyMax + m_resolution); m_sinceLastNotifyMin = m_sinceLastNotifyMax = -1; } else { emit completionChanged(); } } else { emit completionChanged(); } } } QString EditableDenseThreeDimensionalModel::toDelimitedDataString(QString delimiter) const { QReadLocker locker(&m_lock); QString s; for (int i = 0; in_range_for(m_data, i); ++i) { QStringList list; for (int j = 0; in_range_for(m_data.at(i), j); ++j) { list << QString("%1").arg(m_data.at(i).at(j)); } s += list.join(delimiter) + "\n"; } return s; } QString EditableDenseThreeDimensionalModel::toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const { QReadLocker locker(&m_lock); QString s; for (int i = 0; in_range_for(m_data, i); ++i) { sv_frame_t fr = m_startFrame + i * m_resolution; if (fr >= f0 && fr < f1) { QStringList list; for (int j = 0; in_range_for(m_data.at(i), j); ++j) { list << QString("%1").arg(m_data.at(i).at(j)); } s += list.join(delimiter) + "\n"; } } return s; } void EditableDenseThreeDimensionalModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { QReadLocker locker(&m_lock); // For historical reasons we read and write "resolution" as "windowSize" SVDEBUG << "EditableDenseThreeDimensionalModel::toXml" << endl; Model::toXml (out, indent, QString("type=\"dense\" dimensions=\"3\" windowSize=\"%1\" yBinCount=\"%2\" minimum=\"%3\" maximum=\"%4\" dataset=\"%5\" startFrame=\"%6\" %7") .arg(m_resolution) .arg(m_yBinCount) .arg(m_minimum) .arg(m_maximum) .arg(getObjectExportId(&m_data)) .arg(m_startFrame) .arg(extraAttributes)); out << indent; out << QString("\n") .arg(getObjectExportId(&m_data)); for (int i = 0; i < (int)m_binNames.size(); ++i) { if (m_binNames[i] != "") { out << indent + " "; out << QString("\n") .arg(i).arg(m_binNames[i]); } } for (int i = 0; i < (int)m_data.size(); ++i) { out << indent + " "; out << QString("").arg(i); for (int j = 0; j < (int)m_data.at(i).size(); ++j) { if (j > 0) out << " "; out << m_data.at(i).at(j); } out << QString("\n"); out.flush(); } out << indent + "\n"; } sonic-visualiser-3.0.3/svcore/data/model/EditableDenseThreeDimensionalModel.h0000644000000000000000000001605713111512442025454 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_ #define _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_ #include "DenseThreeDimensionalModel.h" #include #include class EditableDenseThreeDimensionalModel : public DenseThreeDimensionalModel { Q_OBJECT public: // EditableDenseThreeDimensionalModel supports a basic compression // method that reduces the size of multirate data (e.g. wavelet // transform outputs) that are stored as plain 3d grids by about // 60% or thereabouts. However, it can only be used for models // whose columns are set in order from 0 and never subsequently // changed. If the model is going to be actually edited, it must // have NoCompression. enum CompressionType { NoCompression, BasicMultirateCompression }; EditableDenseThreeDimensionalModel(sv_samplerate_t sampleRate, int resolution, int height, CompressionType compression, bool notifyOnAdd = true); virtual bool isOK() const; virtual sv_samplerate_t getSampleRate() const; virtual sv_frame_t getStartFrame() const; virtual sv_frame_t getEndFrame() const; /** * Set the frame offset of the first column. */ virtual void setStartFrame(sv_frame_t); /** * Return the number of sample frames covered by each set of bins. */ virtual int getResolution() const; /** * Set the number of sample frames covered by each set of bins. */ virtual void setResolution(int sz); /** * Return the number of columns. */ virtual int getWidth() const; /** * Return the number of bins in each column. */ virtual int getHeight() const; /** * Set the number of bins in each column. * * You can set (via setColumn) a vector of any length as a column, * but any column being retrieved will be resized to this height * (or the height that was supplied to the constructor, if this is * never called) on retrieval. That is, the model owner determines * the height of the model at a single stroke; the columns * themselves don't have any effect on the height of the model. */ virtual void setHeight(int sz); /** * Return the minimum value of the value in each bin. */ virtual float getMinimumLevel() const; /** * Set the minimum value of the value in a bin. */ virtual void setMinimumLevel(float sz); /** * Return the maximum value of the value in each bin. */ virtual float getMaximumLevel() const; /** * Set the maximum value of the value in a bin. */ virtual void setMaximumLevel(float sz); /** * Get the set of bin values at the given column. */ virtual Column getColumn(int x) const; /** * Get a single value, from the n'th bin of the given column. */ virtual float getValueAt(int x, int n) const; /** * Set the entire set of bin values at the given column. */ virtual void setColumn(int x, const Column &values); /** * Return the name of bin n. This is a single label per bin that * does not vary from one column to the next. */ virtual QString getBinName(int n) const; /** * Set the name of bin n. */ virtual void setBinName(int n, QString); /** * Set the names of all bins. */ virtual void setBinNames(std::vector names); /** * Return true if the bins have values as well as names. (The * values may have been derived from the names, e.g. by parsing * numbers from them.) If this returns true, getBinValue() may be * used to retrieve the values. */ virtual bool hasBinValues() const; /** * Return the value of bin n, if any. This is a "vertical scale" * value which does not vary from one column to the next. This is * only meaningful if hasBinValues() returns true. */ virtual float getBinValue(int n) const; /** * Set the values of all bins (separate from their labels). These * are "vertical scale" values which do not vary from one column * to the next. */ virtual void setBinValues(std::vector values); /** * Obtain the name of the unit of the values returned from * getBinValue(), if any. */ virtual QString getBinValueUnit() const; /** * Set the name of the unit of the values return from * getBinValue() if any. */ virtual void setBinValueUnit(QString unit); /** * Return true if the distribution of values in the bins is such * as to suggest a log scale (mapping to colour etc) may be better * than a linear one. */ bool shouldUseLogValueScale() const; virtual void setCompletion(int completion, bool update = true); virtual int getCompletion() const { return m_completion; } QString getTypeName() const { return tr("Editable Dense 3-D"); } virtual QString toDelimitedDataString(QString delimiter) const; virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const; virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; protected: typedef std::vector ValueMatrix; ValueMatrix m_data; // m_trunc is used for simple compression. If at least the top N // elements of column x (for N = some proportion of the column // height) are equal to those of an earlier column x', then // m_trunc[x] will contain x-x' and column x will be truncated so // as to remove the duplicate elements. If the equal elements are // at the bottom, then m_trunc[x] will contain x'-x (a negative // value). If m_trunc[x] is 0 then the whole of column x is // stored. std::vector m_trunc; void truncateAndStore(int index, const Column & values); Column expandAndRetrieve(int index) const; Column rightHeight(const Column &c) const; std::vector m_binNames; std::vector m_binValues; QString m_binValueUnit; sv_frame_t m_startFrame; sv_samplerate_t m_sampleRate; int m_resolution; int m_yBinCount; CompressionType m_compression; float m_minimum; float m_maximum; bool m_haveExtents; bool m_notifyOnAdd; sv_frame_t m_sinceLastNotifyMin; sv_frame_t m_sinceLastNotifyMax; int m_completion; mutable QReadWriteLock m_lock; }; #endif sonic-visualiser-3.0.3/svcore/data/model/FFTModel.cpp0000644000000000000000000003667513111512442020573 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "FFTModel.h" #include "DenseTimeValueModel.h" #include "base/Profiler.h" #include "base/Pitch.h" #include "base/HitCount.h" #include #include #include using namespace std; static HitCount inSmallCache("FFTModel: Small FFT cache"); static HitCount inSourceCache("FFTModel: Source data cache"); FFTModel::FFTModel(const DenseTimeValueModel *model, int channel, WindowType windowType, int windowSize, int windowIncrement, int fftSize) : m_model(model), m_channel(channel), m_windowType(windowType), m_windowSize(windowSize), m_windowIncrement(windowIncrement), m_fftSize(fftSize), m_windower(windowType, windowSize), m_fft(fftSize), m_cacheWriteIndex(0), m_cacheSize(3) { while (m_cached.size() < m_cacheSize) { m_cached.push_back({ -1, cvec(m_fftSize / 2 + 1) }); } if (m_windowSize > m_fftSize) { cerr << "ERROR: FFTModel::FFTModel: window size (" << m_windowSize << ") must be at least FFT size (" << m_fftSize << ")" << endl; throw invalid_argument("FFTModel window size must be at least FFT size"); } m_fft.initFloat(); connect(model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); connect(model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t))); } FFTModel::~FFTModel() { } void FFTModel::sourceModelAboutToBeDeleted() { if (m_model) { cerr << "FFTModel[" << this << "]::sourceModelAboutToBeDeleted(" << m_model << ")" << endl; m_model = 0; } } int FFTModel::getWidth() const { if (!m_model) return 0; return int((m_model->getEndFrame() - m_model->getStartFrame()) / m_windowIncrement) + 1; } int FFTModel::getHeight() const { return m_fftSize / 2 + 1; } QString FFTModel::getBinName(int n) const { sv_samplerate_t sr = getSampleRate(); if (!sr) return ""; QString name = tr("%1 Hz").arg((n * sr) / ((getHeight()-1) * 2)); return name; } FFTModel::Column FFTModel::getColumn(int x) const { auto cplx = getFFTColumn(x); Column col; col.reserve(cplx.size()); for (auto c: cplx) col.push_back(abs(c)); return col; } FFTModel::Column FFTModel::getPhases(int x) const { auto cplx = getFFTColumn(x); Column col; col.reserve(cplx.size()); for (auto c: cplx) { col.push_back(arg(c)); } return col; } float FFTModel::getMagnitudeAt(int x, int y) const { if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) return 0.f; auto col = getFFTColumn(x); return abs(col[y]); } float FFTModel::getMaximumMagnitudeAt(int x) const { Column col(getColumn(x)); float max = 0.f; int n = int(col.size()); for (int i = 0; i < n; ++i) { if (col[i] > max) max = col[i]; } return max; } float FFTModel::getPhaseAt(int x, int y) const { if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) return 0.f; return arg(getFFTColumn(x)[y]); } void FFTModel::getValuesAt(int x, int y, float &re, float &im) const { auto col = getFFTColumn(x); re = col[y].real(); im = col[y].imag(); } bool FFTModel::getMagnitudesAt(int x, float *values, int minbin, int count) const { if (count == 0) count = getHeight(); auto col = getFFTColumn(x); for (int i = 0; i < count; ++i) { values[i] = abs(col[minbin + i]); } return true; } bool FFTModel::getPhasesAt(int x, float *values, int minbin, int count) const { if (count == 0) count = getHeight(); auto col = getFFTColumn(x); for (int i = 0; i < count; ++i) { values[i] = arg(col[minbin + i]); } return true; } bool FFTModel::getValuesAt(int x, float *reals, float *imags, int minbin, int count) const { if (count == 0) count = getHeight(); auto col = getFFTColumn(x); for (int i = 0; i < count; ++i) { reals[i] = col[minbin + i].real(); } for (int i = 0; i < count; ++i) { imags[i] = col[minbin + i].imag(); } return true; } FFTModel::fvec FFTModel::getSourceSamples(int column) const { // m_fftSize may be greater than m_windowSize, but not the reverse // cerr << "getSourceSamples(" << column << ")" << endl; auto range = getSourceSampleRange(column); auto data = getSourceData(range); int off = (m_fftSize - m_windowSize) / 2; if (off == 0) { return data; } else { vector pad(off, 0.f); fvec padded; padded.reserve(m_fftSize); padded.insert(padded.end(), pad.begin(), pad.end()); padded.insert(padded.end(), data.begin(), data.end()); padded.insert(padded.end(), pad.begin(), pad.end()); return padded; } } FFTModel::fvec FFTModel::getSourceData(pair range) const { // cerr << "getSourceData(" << range.first << "," << range.second // << "): saved range is (" << m_savedData.range.first // << "," << m_savedData.range.second << ")" << endl; if (m_savedData.range == range) { inSourceCache.hit(); return m_savedData.data; } Profiler profiler("FFTModel::getSourceData (cache miss)"); if (range.first < m_savedData.range.second && range.first >= m_savedData.range.first && range.second > m_savedData.range.second) { inSourceCache.partial(); sv_frame_t discard = range.first - m_savedData.range.first; fvec acc(m_savedData.data.begin() + discard, m_savedData.data.end()); fvec rest = getSourceDataUncached({ m_savedData.range.second, range.second }); acc.insert(acc.end(), rest.begin(), rest.end()); m_savedData = { range, acc }; return acc; } else { inSourceCache.miss(); auto data = getSourceDataUncached(range); m_savedData = { range, data }; return data; } } FFTModel::fvec FFTModel::getSourceDataUncached(pair range) const { decltype(range.first) pfx = 0; if (range.first < 0) { pfx = -range.first; range = { 0, range.second }; } auto data = m_model->getData(m_channel, range.first, range.second - range.first); if (data.empty()) { SVDEBUG << "NOTE: empty source data for range (" << range.first << "," << range.second << ") (model end frame " << m_model->getEndFrame() << ")" << endl; } // don't return a partial frame data.resize(range.second - range.first, 0.f); if (pfx > 0) { vector pad(pfx, 0.f); data.insert(data.begin(), pad.begin(), pad.end()); } if (m_channel == -1) { int channels = m_model->getChannelCount(); if (channels > 1) { int n = int(data.size()); float factor = 1.f / float(channels); // use mean instead of sum for fft model input for (int i = 0; i < n; ++i) { data[i] *= factor; } } } return data; } const FFTModel::cvec & FFTModel::getFFTColumn(int n) const { // The small cache (i.e. the m_cached deque) is for cases where // values are looked up individually, and for e.g. peak-frequency // spectrograms where values from two consecutive columns are // needed at once. This cache gets essentially no hits when // scrolling through a magnitude spectrogram, but 95%+ hits with a // peak-frequency spectrogram. for (const auto &incache : m_cached) { if (incache.n == n) { inSmallCache.hit(); return incache.col; } } inSmallCache.miss(); Profiler profiler("FFTModel::getFFTColumn (cache miss)"); auto samples = getSourceSamples(n); m_windower.cut(samples.data()); breakfastquay::v_fftshift(samples.data(), m_fftSize); cvec &col = m_cached[m_cacheWriteIndex].col; m_fft.forwardInterleaved(samples.data(), reinterpret_cast(col.data())); m_cached[m_cacheWriteIndex].n = n; m_cacheWriteIndex = (m_cacheWriteIndex + 1) % m_cacheSize; return col; } bool FFTModel::estimateStableFrequency(int x, int y, double &frequency) { if (!isOK()) return false; frequency = double(y * getSampleRate()) / m_fftSize; if (x+1 >= getWidth()) return false; // At frequency f, a phase shift of 2pi (one cycle) happens in 1/f sec. // At hopsize h and sample rate sr, one hop happens in h/sr sec. // At window size w, for bin b, f is b*sr/w. // thus 2pi phase shift happens in w/(b*sr) sec. // We need to know what phase shift we expect from h/sr sec. // -> 2pi * ((h/sr) / (w/(b*sr))) // = 2pi * ((h * b * sr) / (w * sr)) // = 2pi * (h * b) / w. double oldPhase = getPhaseAt(x, y); double newPhase = getPhaseAt(x+1, y); int incr = getResolution(); double expectedPhase = oldPhase + (2.0 * M_PI * y * incr) / m_fftSize; double phaseError = princarg(newPhase - expectedPhase); // The new frequency estimate based on the phase error resulting // from assuming the "native" frequency of this bin frequency = (getSampleRate() * (expectedPhase + phaseError - oldPhase)) / (2.0 * M_PI * incr); return true; } FFTModel::PeakLocationSet FFTModel::getPeaks(PeakPickType type, int x, int ymin, int ymax) const { Profiler profiler("FFTModel::getPeaks"); FFTModel::PeakLocationSet peaks; if (!isOK()) return peaks; if (ymax == 0 || ymax > getHeight() - 1) { ymax = getHeight() - 1; } if (type == AllPeaks) { int minbin = ymin; if (minbin > 0) minbin = minbin - 1; int maxbin = ymax; if (maxbin < getHeight() - 1) maxbin = maxbin + 1; const int n = maxbin - minbin + 1; float *values = new float[n]; getMagnitudesAt(x, values, minbin, maxbin - minbin + 1); for (int bin = ymin; bin <= ymax; ++bin) { if (bin == minbin || bin == maxbin) continue; if (values[bin - minbin] > values[bin - minbin - 1] && values[bin - minbin] > values[bin - minbin + 1]) { peaks.insert(bin); } } delete[] values; return peaks; } Column values = getColumn(x); int nv = int(values.size()); float mean = 0.f; for (int i = 0; i < nv; ++i) mean += values[i]; if (nv > 0) mean = mean / float(values.size()); // For peak picking we use a moving median window, picking the // highest value within each continuous region of values that // exceed the median. For pitch adaptivity, we adjust the window // size to a roughly constant pitch range (about four tones). sv_samplerate_t sampleRate = getSampleRate(); deque window; vector inrange; float dist = 0.5; int medianWinSize = getPeakPickWindowSize(type, sampleRate, ymin, dist); int halfWin = medianWinSize/2; int binmin; if (ymin > halfWin) binmin = ymin - halfWin; else binmin = 0; int binmax; if (ymax + halfWin < nv) binmax = ymax + halfWin; else binmax = nv - 1; int prevcentre = 0; for (int bin = binmin; bin <= binmax; ++bin) { float value = values[bin]; window.push_back(value); // so-called median will actually be the dist*100'th percentile medianWinSize = getPeakPickWindowSize(type, sampleRate, bin, dist); halfWin = medianWinSize/2; while ((int)window.size() > medianWinSize) { window.pop_front(); } int actualSize = int(window.size()); if (type == MajorPitchAdaptivePeaks) { if (ymax + halfWin < nv) binmax = ymax + halfWin; else binmax = nv - 1; } deque sorted(window); sort(sorted.begin(), sorted.end()); float median = sorted[int(float(sorted.size()) * dist)]; int centrebin = 0; if (bin > actualSize/2) centrebin = bin - actualSize/2; while (centrebin > prevcentre || bin == binmin) { if (centrebin > prevcentre) ++prevcentre; float centre = values[prevcentre]; if (centre > median) { inrange.push_back(centrebin); } if (centre <= median || centrebin+1 == nv) { if (!inrange.empty()) { int peakbin = 0; float peakval = 0.f; for (int i = 0; i < (int)inrange.size(); ++i) { if (i == 0 || values[inrange[i]] > peakval) { peakval = values[inrange[i]]; peakbin = inrange[i]; } } inrange.clear(); if (peakbin >= ymin && peakbin <= ymax) { peaks.insert(peakbin); } } } if (bin == binmin) break; } } return peaks; } int FFTModel::getPeakPickWindowSize(PeakPickType type, sv_samplerate_t sampleRate, int bin, float &percentile) const { percentile = 0.5; if (type == MajorPeaks) return 10; if (bin == 0) return 3; double binfreq = (sampleRate * bin) / m_fftSize; double hifreq = Pitch::getFrequencyForPitch(73, 0, binfreq); int hibin = int(lrint((hifreq * m_fftSize) / sampleRate)); int medianWinSize = hibin - bin; if (medianWinSize < 3) medianWinSize = 3; percentile = 0.5f + float(binfreq / sampleRate); return medianWinSize; } FFTModel::PeakSet FFTModel::getPeakFrequencies(PeakPickType type, int x, int ymin, int ymax) const { Profiler profiler("FFTModel::getPeakFrequencies"); PeakSet peaks; if (!isOK()) return peaks; PeakLocationSet locations = getPeaks(type, x, ymin, ymax); sv_samplerate_t sampleRate = getSampleRate(); int incr = getResolution(); // This duplicates some of the work of estimateStableFrequency to // allow us to retrieve the phases in two separate vertical // columns, instead of jumping back and forth between columns x and // x+1, which may be significantly slower if re-seeking is needed vector phases; for (PeakLocationSet::iterator i = locations.begin(); i != locations.end(); ++i) { phases.push_back(getPhaseAt(x, *i)); } int phaseIndex = 0; for (PeakLocationSet::iterator i = locations.begin(); i != locations.end(); ++i) { double oldPhase = phases[phaseIndex]; double newPhase = getPhaseAt(x+1, *i); double expectedPhase = oldPhase + (2.0 * M_PI * *i * incr) / m_fftSize; double phaseError = princarg(newPhase - expectedPhase); double frequency = (sampleRate * (expectedPhase + phaseError - oldPhase)) / (2 * M_PI * incr); peaks[*i] = frequency; ++phaseIndex; } return peaks; } sonic-visualiser-3.0.3/svcore/data/model/FFTModel.h0000644000000000000000000001542113111512442020222 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef FFT_MODEL_H #define FFT_MODEL_H #include "DenseThreeDimensionalModel.h" #include "DenseTimeValueModel.h" #include "base/Window.h" #include #include #include #include #include /** * An implementation of DenseThreeDimensionalModel that makes FFT data * derived from a DenseTimeValueModel available as a generic data * grid. */ class FFTModel : public DenseThreeDimensionalModel { Q_OBJECT //!!! threading requirements? //!!! doubles? since we're not caching much public: /** * Construct an FFT model derived from the given * DenseTimeValueModel, with the given window parameters and FFT * size (which may exceed the window size, for zero-padded FFTs). * * If the model has multiple channels use only the given channel, * unless the channel is -1 in which case merge all available * channels. */ FFTModel(const DenseTimeValueModel *model, int channel, WindowType windowType, int windowSize, int windowIncrement, int fftSize); ~FFTModel(); // DenseThreeDimensionalModel and Model methods: // virtual int getWidth() const; virtual int getHeight() const; virtual float getValueAt(int x, int y) const { return getMagnitudeAt(x, y); } virtual bool isOK() const { return m_model && m_model->isOK(); } virtual sv_frame_t getStartFrame() const { return 0; } virtual sv_frame_t getEndFrame() const { return sv_frame_t(getWidth()) * getResolution() + getResolution(); } virtual sv_samplerate_t getSampleRate() const { return isOK() ? m_model->getSampleRate() : 0; } virtual int getResolution() const { return m_windowIncrement; } virtual int getYBinCount() const { return getHeight(); } virtual float getMinimumLevel() const { return 0.f; } // Can't provide virtual float getMaximumLevel() const { return 1.f; } // Can't provide virtual Column getColumn(int x) const; // magnitudes virtual Column getPhases(int x) const; virtual QString getBinName(int n) const; virtual bool shouldUseLogValueScale() const { return true; } virtual int getCompletion() const { int c = 100; if (m_model) { if (m_model->isReady(&c)) return 100; } return c; } virtual QString getError() const { return ""; } //!!!??? virtual sv_frame_t getFillExtent() const { return getEndFrame(); } // FFTModel methods: // int getChannel() const { return m_channel; } WindowType getWindowType() const { return m_windowType; } int getWindowSize() const { return m_windowSize; } int getWindowIncrement() const { return m_windowIncrement; } int getFFTSize() const { return m_fftSize; } //!!! review which of these are ever actually called float getMagnitudeAt(int x, int y) const; float getMaximumMagnitudeAt(int x) const; float getPhaseAt(int x, int y) const; void getValuesAt(int x, int y, float &real, float &imaginary) const; bool getMagnitudesAt(int x, float *values, int minbin = 0, int count = 0) const; bool getPhasesAt(int x, float *values, int minbin = 0, int count = 0) const; bool getValuesAt(int x, float *reals, float *imaginaries, int minbin = 0, int count = 0) const; /** * Calculate an estimated frequency for a stable signal in this * bin, using phase unwrapping. This will be completely wrong if * the signal is not stable here. */ virtual bool estimateStableFrequency(int x, int y, double &frequency); enum PeakPickType { AllPeaks, /// Any bin exceeding its immediate neighbours MajorPeaks, /// Peaks picked using sliding median window MajorPitchAdaptivePeaks /// Bigger window for higher frequencies }; typedef std::set PeakLocationSet; // bin typedef std::map PeakSet; // bin -> freq /** * Return locations of peak bins in the range [ymin,ymax]. If * ymax is zero, getHeight()-1 will be used. */ virtual PeakLocationSet getPeaks(PeakPickType type, int x, int ymin = 0, int ymax = 0) const; /** * Return locations and estimated stable frequencies of peak bins. */ virtual PeakSet getPeakFrequencies(PeakPickType type, int x, int ymin = 0, int ymax = 0) const; QString getTypeName() const { return tr("FFT"); } public slots: void sourceModelAboutToBeDeleted(); private: FFTModel(const FFTModel &); // not implemented FFTModel &operator=(const FFTModel &); // not implemented const DenseTimeValueModel *m_model; int m_channel; WindowType m_windowType; int m_windowSize; int m_windowIncrement; int m_fftSize; Window m_windower; mutable breakfastquay::FFT m_fft; int getPeakPickWindowSize(PeakPickType type, sv_samplerate_t sampleRate, int bin, float &percentile) const; std::pair getSourceSampleRange(int column) const { sv_frame_t startFrame = m_windowIncrement * sv_frame_t(column); sv_frame_t endFrame = startFrame + m_windowSize; // Cols are centred on the audio sample (e.g. col 0 is centred at sample 0) startFrame -= m_windowSize / 2; endFrame -= m_windowSize / 2; return { startFrame, endFrame }; } typedef std::vector> fvec; typedef std::vector, breakfastquay::StlAllocator>> cvec; const cvec &getFFTColumn(int column) const; // returns ref for immediate use only fvec getSourceSamples(int column) const; fvec getSourceData(std::pair) const; fvec getSourceDataUncached(std::pair) const; struct SavedSourceData { std::pair range; fvec data; }; mutable SavedSourceData m_savedData; struct SavedColumn { int n; cvec col; }; mutable std::vector m_cached; mutable size_t m_cacheWriteIndex; size_t m_cacheSize; }; #endif sonic-visualiser-3.0.3/svcore/data/model/FlexiNoteModel.h0000644000000000000000000002007513111512442021501 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FLEXINOTE_MODEL_H_ #define _FLEXINOTE_MODEL_H_ #include "IntervalModel.h" #include "NoteData.h" #include "base/RealTime.h" #include "base/Pitch.h" #include "base/PlayParameterRepository.h" /** * FlexiNoteModel -- a concrete IntervalModel for notes. */ /** * Extension of the NoteModel for more flexible note interaction. * The original NoteModel rationale is given below, will need to be * updated for FlexiNoteModel: * * Note type for use in a sparse model. All we mean by a "note" is * something that has an onset time, a single value, a duration, and a * level. Like other points, it can also have a label. With this * point type, the model can be thought of as representing a simple * MIDI-type piano roll, except that the y coordinates (values) do not * have to be discrete integers. */ struct FlexiNote { public: FlexiNote(sv_frame_t _frame) : frame(_frame), value(0.0f), duration(0), level(1.f) { } FlexiNote(sv_frame_t _frame, float _value, sv_frame_t _duration, float _level, QString _label) : frame(_frame), value(_value), duration(_duration), level(_level), label(_label) { } int getDimensions() const { return 3; } sv_frame_t frame; float value; sv_frame_t duration; float level; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(duration).arg(level) .arg(XmlExportable::encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions opts, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str(); if (!(opts & DataExportOmitLevels)) { list << QString("%1").arg(level); } if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const FlexiNote &p1, const FlexiNote &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; if (p1.duration != p2.duration) return p1.duration < p2.duration; if (p1.level != p2.level) return p1.level < p2.level; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const FlexiNote &p1, const FlexiNote &p2) const { return p1.frame < p2.frame; } }; }; class FlexiNoteModel : public IntervalModel, public NoteExportable { Q_OBJECT public: FlexiNoteModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, notifyOnAdd), m_valueQuantization(0) { PlayParameterRepository::getInstance()->addPlayable(this); } FlexiNoteModel(sv_samplerate_t sampleRate, int resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd), m_valueQuantization(0) { PlayParameterRepository::getInstance()->addPlayable(this); } virtual ~FlexiNoteModel() { PlayParameterRepository::getInstance()->removePlayable(this); } float getValueQuantization() const { return m_valueQuantization; } void setValueQuantization(float q) { m_valueQuantization = q; } float getValueMinimum() const { return 33; } float getValueMaximum() const { return 88; } QString getTypeName() const { return tr("FlexiNote"); } virtual bool canPlay() const { return true; } virtual QString getDefaultPlayClipId() const { return "elecpiano"; } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { std::cerr << "FlexiNoteModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; IntervalModel::toXml (out, indent, QString("%1 subtype=\"flexinote\" valueQuantization=\"%2\"") .arg(extraAttributes).arg(m_valueQuantization)); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 6; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Pitch"); case 3: return tr("Duration"); case 4: return tr("Level"); case 5: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 4) { return IntervalModel::getData(row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 4: return i->level; case 5: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 4) { return IntervalModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 4: point.level = float(value.toDouble()); break; case 5: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual SortType getSortType(int column) const { if (column == 5) return SortAlphabetical; return SortNumeric; } /** * NoteExportable methods. */ NoteList getNotes() const { return getNotesWithin(getStartFrame(), getEndFrame()); } NoteList getNotesWithin(sv_frame_t startFrame, sv_frame_t endFrame) const { PointList points = getPoints(startFrame, endFrame); NoteList notes; for (PointList::iterator pli = points.begin(); pli != points.end(); ++pli) { sv_frame_t duration = pli->duration; if (duration == 0 || duration == 1) { duration = sv_frame_t(getSampleRate() / 20); } int pitch = int(lrintf(pli->value)); int velocity = 100; if (pli->level > 0.f && pli->level <= 1.f) { velocity = int(lrintf(pli->level * 127)); } NoteData note(pli->frame, duration, pitch, velocity); if (getScaleUnits() == "Hz") { note.frequency = pli->value; note.midiPitch = Pitch::getPitchForFrequency(note.frequency); note.isMidiPitchQuantized = false; } notes.push_back(note); } return notes; } protected: float m_valueQuantization; }; #endif sonic-visualiser-3.0.3/svcore/data/model/ImageModel.h0000644000000000000000000001327313111512442020630 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_MODEL_H_ #define _IMAGE_MODEL_H_ #include "SparseModel.h" #include "base/XmlExportable.h" #include "base/RealTime.h" #include /** * Image point type for use in a SparseModel. This represents an * image, identified by filename, at a given time. The filename can * be empty, in which case we instead have a space to put an image in. */ struct ImagePoint : public XmlExportable { public: ImagePoint(sv_frame_t _frame) : frame(_frame) { } ImagePoint(sv_frame_t _frame, QString _image, QString _label) : frame(_frame), image(_image), label(_label) { } int getDimensions() const { return 1; } sv_frame_t frame; QString image; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame) .arg(encodeEntities(image)) .arg(encodeEntities(label)) .arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << image; if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const ImagePoint &p1, const ImagePoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.label != p2.label) return p1.label < p2.label; return p1.image < p2.image; } }; struct OrderComparator { bool operator()(const ImagePoint &p1, const ImagePoint &p2) const { return p1.frame < p2.frame; } }; }; // Make this a class rather than a typedef so it can be predeclared. class ImageModel : public SparseModel { Q_OBJECT public: ImageModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd) { } QString getTypeName() const { return tr("Image"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { SparseModel::toXml (out, indent, QString("%1 subtype=\"image\"") .arg(extraAttributes)); } /** * Command to change the image for a point. */ class ChangeImageCommand : public Command { public: ChangeImageCommand(ImageModel *model, const ImagePoint &point, QString newImage, QString newLabel) : m_model(model), m_oldPoint(point), m_newPoint(point) { m_newPoint.image = newImage; m_newPoint.label = newLabel; } virtual QString getName() const { return tr("Edit Image"); } virtual void execute() { m_model->deletePoint(m_oldPoint); m_model->addPoint(m_newPoint); std::swap(m_oldPoint, m_newPoint); } virtual void unexecute() { execute(); } private: ImageModel *m_model; ImagePoint m_oldPoint; ImagePoint m_newPoint; }; /** * TabularModel methods. */ virtual int getColumnCount() const { return 4; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Image"); case 3: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: return i->image; case 3: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.image = value.toString(); break; case 3: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column > 2) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/IntervalModel.h0000644000000000000000000001406513111512442021372 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2008 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _INTERVAL_MODEL_H_ #define _INTERVAL_MODEL_H_ #include "SparseValueModel.h" #include "base/RealTime.h" /** * Model containing sparse data (points with some properties) of which * the properties include a duration and an arbitrary float value. * The other properties depend on the point type. */ template class IntervalModel : public SparseValueModel { public: IntervalModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, notifyOnAdd) { } IntervalModel(sv_samplerate_t sampleRate, int resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd) { } /** * PointTypes have a duration, so this returns all points that span any * of the given range (as well as the usual additional few before * and after). Consequently this can be very slow (optimised data * structures still to be done!). */ virtual typename SparseValueModel::PointList getPoints(sv_frame_t start, sv_frame_t end) const; /** * PointTypes have a duration, so this returns all points that span the * given frame. Consequently this can be very slow (optimised * data structures still to be done!). */ virtual typename SparseValueModel::PointList getPoints(sv_frame_t frame) const; virtual const typename SparseModel::PointList &getPoints() const { return SparseModel::getPoints(); } /** * TabularModel methods. */ virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseValueModel::getData (row, column, role); } typename SparseModel::PointList::const_iterator i = SparseModel::getPointListIteratorForRow(row); if (i == SparseModel::m_points.end()) return QVariant(); switch (column) { case 2: if (role == Qt::EditRole || role == TabularModel::SortRole) return i->value; else return QString("%1 %2").arg(i->value).arg (IntervalModel::getScaleUnits()); case 3: return int(i->duration); //!!! could be better presented default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { typedef IntervalModel I; if (column < 2) { return SparseValueModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; typename I::PointList::const_iterator i = I::getPointListIteratorForRow(row); if (i == I::m_points.end()) return 0; typename I::EditCommand *command = new typename I::EditCommand (this, I::tr("Edit Data")); PointType point(*i); command->deletePoint(point); switch (column) { // column cannot be 0 or 1, those cases were handled above case 2: point.value = float(value.toDouble()); break; case 3: point.duration = value.toInt(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { // NB duration is not a "time value" -- that's for columns // whose sort ordering is exactly that of the frame time return (column < 2); } }; template typename SparseValueModel::PointList IntervalModel::getPoints(sv_frame_t start, sv_frame_t end) const { typedef IntervalModel I; if (start > end) return typename I::PointList(); QMutex &mutex(I::m_mutex); QMutexLocker locker(&mutex); PointType endPoint(end); typename I::PointListConstIterator endItr = I::m_points.upper_bound(endPoint); if (endItr != I::m_points.end()) ++endItr; if (endItr != I::m_points.end()) ++endItr; typename I::PointList rv; for (typename I::PointListConstIterator i = endItr; i != I::m_points.begin(); ) { --i; if (i->frame < start) { if (i->frame + i->duration >= start) { rv.insert(*i); } } else if (i->frame <= end) { rv.insert(*i); } } return rv; } template typename SparseValueModel::PointList IntervalModel::getPoints(sv_frame_t frame) const { typedef IntervalModel I; QMutex &mutex(I::m_mutex); QMutexLocker locker(&mutex); if (I::m_resolution == 0) return typename I::PointList(); sv_frame_t start = (frame / I::m_resolution) * I::m_resolution; sv_frame_t end = start + I::m_resolution; PointType endPoint(end); typename I::PointListConstIterator endItr = I::m_points.upper_bound(endPoint); typename I::PointList rv; for (typename I::PointListConstIterator i = endItr; i != I::m_points.begin(); ) { --i; if (i->frame < start) { if (i->frame + i->duration >= start) { rv.insert(*i); } } else if (i->frame <= end) { rv.insert(*i); } } return rv; } #endif sonic-visualiser-3.0.3/svcore/data/model/Labeller.h0000644000000000000000000003144713111512442020352 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LABELLER_H_ #define _LABELLER_H_ #include "SparseModel.h" #include "SparseValueModel.h" #include "base/Selection.h" #include #include #include class Labeller : public QObject { Q_OBJECT public: enum ValueType { ValueNone, ValueFromSimpleCounter, ValueFromCyclicalCounter, ValueFromTwoLevelCounter, ValueFromFrameNumber, ValueFromRealTime, ValueFromDurationFromPrevious, ValueFromDurationToNext, ValueFromTempoFromPrevious, ValueFromTempoToNext, ValueFromExistingNeighbour, ValueFromLabel }; // uses: // // 1. when adding points to a time-value model, generate values // for those points based on their times or labels or a counter // // 2. when adding a single point to a time-instant model, generate // a label for it based on its time and that of the previous point // or a counter // // 3. when adding a single point to a time-instant model, generate // a label for the previous point based on its time and that of // the point just added (as tempo is based on time to the next // point, not the previous one) // // 4. re-label a set of points that have already been added to a // model Labeller(ValueType type = ValueNone) : m_type(type), m_counter(1), m_counter2(1), m_cycle(4), m_dp(10), m_rate(0) { } Labeller(const Labeller &l) : QObject(), m_type(l.m_type), m_counter(l.m_counter), m_counter2(l.m_counter2), m_cycle(l.m_cycle), m_dp(l.m_dp), m_rate(l.m_rate) { } virtual ~Labeller() { } typedef std::map TypeNameMap; TypeNameMap getTypeNames() const { TypeNameMap m; m[ValueNone] = tr("No numbering"); m[ValueFromSimpleCounter] = tr("Simple counter"); m[ValueFromCyclicalCounter] = tr("Cyclical counter"); m[ValueFromTwoLevelCounter] = tr("Cyclical two-level counter (bar/beat)"); m[ValueFromFrameNumber] = tr("Audio sample frame number"); m[ValueFromRealTime] = tr("Time in seconds"); m[ValueFromDurationToNext] = tr("Duration to the following item"); m[ValueFromTempoToNext] = tr("Tempo (bpm) based on duration to following item"); m[ValueFromDurationFromPrevious] = tr("Duration since the previous item"); m[ValueFromTempoFromPrevious] = tr("Tempo (bpm) based on duration since previous item"); m[ValueFromExistingNeighbour] = tr("Same as the nearest previous item"); m[ValueFromLabel] = tr("Value extracted from the item's label (where possible)"); return m; } ValueType getType() const { return m_type; } void setType(ValueType type) { m_type = type; } int getCounterValue() const { return m_counter; } void setCounterValue(int v) { m_counter = v; } int getSecondLevelCounterValue() const { return m_counter2; } void setSecondLevelCounterValue(int v) { m_counter2 = v; } int getCounterCycleSize() const { return m_cycle; } void setCounterCycleSize(int s) { m_cycle = s; m_dp = 1; while (s > 0) { s /= 10; m_dp *= 10; } if (m_counter > m_cycle) m_counter = 1; } void setSampleRate(sv_samplerate_t rate) { m_rate = rate; } void resetCounters() { m_counter = 1; m_counter2 = 1; m_cycle = 4; } void incrementCounter() { m_counter++; if (m_type == ValueFromCyclicalCounter || m_type == ValueFromTwoLevelCounter) { if (m_counter > m_cycle) { m_counter = 1; m_counter2++; } } } template void label(PointType &newPoint, PointType *prevPoint = 0) { if (m_type == ValueNone) { newPoint.label = ""; } else if (m_type == ValueFromTwoLevelCounter) { newPoint.label = tr("%1.%2").arg(m_counter2).arg(m_counter); incrementCounter(); } else if (m_type == ValueFromFrameNumber) { // avoid going through floating-point value newPoint.label = tr("%1").arg(newPoint.frame); } else { float value = getValueFor(newPoint, prevPoint); if (actingOnPrevPoint() && prevPoint) { prevPoint->label = QString("%1").arg(value); } else { newPoint.label = QString("%1").arg(value); } } } /** * Relabel all points in the given model that lie within the given * multi-selection, according to the labelling properties of this * labeller. Return a command that has been executed but not yet * added to the history. */ template Command *labelAll(SparseModel &model, MultiSelection *ms) { auto points(model.getPoints()); auto command = new typename SparseModel::EditCommand (&model, tr("Label Points")); PointType prevPoint(0); bool havePrevPoint(false); for (auto p: points) { if (ms) { Selection s(ms->getContainingSelection(p.frame, false)); if (!s.contains(p.frame)) { prevPoint = p; havePrevPoint = true; continue; } } if (actingOnPrevPoint()) { if (havePrevPoint) { command->deletePoint(prevPoint); label(p, &prevPoint); command->addPoint(prevPoint); } } else { command->deletePoint(p); label(p, &prevPoint); command->addPoint(p); } prevPoint = p; havePrevPoint = true; } return command->finish(); } /** * For each point in the given model (except the last), if that * point lies within the given multi-selection, add n-1 new points * at equally spaced intervals between it and the following point. * Return a command that has been executed but not yet added to * the history. */ template Command *subdivide(SparseModel &model, MultiSelection *ms, int n) { auto points(model.getPoints()); auto command = new typename SparseModel::EditCommand (&model, tr("Subdivide Points")); for (auto i = points.begin(); i != points.end(); ++i) { auto j = i; // require a "next point" even if it's not in selection if (++j == points.end()) { break; } if (ms) { Selection s(ms->getContainingSelection(i->frame, false)); if (!s.contains(i->frame)) { continue; } } PointType p(*i); PointType nextP(*j); // n is the number of subdivisions, so we add n-1 new // points equally spaced between p and nextP for (int m = 1; m < n; ++m) { sv_frame_t f = p.frame + (m * (nextP.frame - p.frame)) / n; PointType newPoint(p); newPoint.frame = f; newPoint.label = tr("%1.%2").arg(p.label).arg(m+1); command->addPoint(newPoint); } } return command->finish(); } /** * Return a command that has been executed but not yet added to * the history. */ template Command *winnow(SparseModel &model, MultiSelection *ms, int n) { auto points(model.getPoints()); auto command = new typename SparseModel::EditCommand (&model, tr("Winnow Points")); int counter = 0; for (auto p: points) { if (ms) { Selection s(ms->getContainingSelection(p.frame, false)); if (!s.contains(p.frame)) { counter = 0; continue; } } ++counter; if (counter == n+1) counter = 1; if (counter == 1) { // this is an Nth instant, don't remove it continue; } command->deletePoint(p); } return command->finish(); } template void setValue(PointType &newPoint, PointType *prevPoint = 0) { if (m_type == ValueFromExistingNeighbour) { if (!prevPoint) { std::cerr << "ERROR: Labeller::setValue: Previous point required but not provided" << std::endl; } else { newPoint.value = prevPoint->value; } } else { float value = getValueFor(newPoint, prevPoint); if (actingOnPrevPoint() && prevPoint) { prevPoint->value = value; } else { newPoint.value = value; } } } bool requiresPrevPoint() const { return (m_type == ValueFromDurationFromPrevious || m_type == ValueFromDurationToNext || m_type == ValueFromTempoFromPrevious || m_type == ValueFromDurationToNext); } bool actingOnPrevPoint() const { return (m_type == ValueFromDurationToNext || m_type == ValueFromTempoToNext); } protected: template float getValueFor(PointType &newPoint, PointType *prevPoint) { float value = 0.f; switch (m_type) { case ValueNone: value = 0; break; case ValueFromSimpleCounter: case ValueFromCyclicalCounter: value = float(m_counter); incrementCounter(); break; case ValueFromTwoLevelCounter: value = float(m_counter2 + double(m_counter) / double(m_dp)); incrementCounter(); break; case ValueFromFrameNumber: value = float(newPoint.frame); break; case ValueFromRealTime: if (m_rate == 0.0) { std::cerr << "ERROR: Labeller::getValueFor: Real-time conversion required, but no sample rate set" << std::endl; } else { value = float(double(newPoint.frame) / m_rate); } break; case ValueFromDurationToNext: case ValueFromTempoToNext: case ValueFromDurationFromPrevious: case ValueFromTempoFromPrevious: if (m_rate == 0.0) { std::cerr << "ERROR: Labeller::getValueFor: Real-time conversion required, but no sample rate set" << std::endl; } else if (!prevPoint) { std::cerr << "ERROR: Labeller::getValueFor: Time difference required, but only one point provided" << std::endl; } else { sv_frame_t f0 = prevPoint->frame, f1 = newPoint.frame; if (m_type == ValueFromDurationToNext || m_type == ValueFromDurationFromPrevious) { value = float(double(f1 - f0) / m_rate); } else { if (f1 > f0) { value = float((60.0 * m_rate) / double(f1 - f0)); } } } break; case ValueFromExistingNeighbour: // need to deal with this in the calling function, as this // function must handle points that don't have values to // read from break; case ValueFromLabel: if (newPoint.label != "") { // more forgiving than QString::toFloat() value = float(atof(newPoint.label.toLocal8Bit())); } else { value = 0.f; } break; } return value; } ValueType m_type; int m_counter; int m_counter2; int m_cycle; int m_dp; sv_samplerate_t m_rate; }; #endif sonic-visualiser-3.0.3/svcore/data/model/Model.cpp0000644000000000000000000001176013111512442020217 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "Model.h" #include "AlignmentModel.h" #include #include const int Model::COMPLETION_UNKNOWN = -1; Model::~Model() { // SVDEBUG << "Model::~Model(" << this << ")" << endl; if (!m_aboutToDelete) { SVDEBUG << "NOTE: Model(" << this << ", \"" << objectName() << "\", type uri <" << m_typeUri << ">)::~Model(): Model deleted " << "with no aboutToDelete notification" << endl; } if (m_alignment) { m_alignment->aboutToDelete(); delete m_alignment; } } void Model::setSourceModel(Model *model) { if (m_sourceModel) { disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()), this, SLOT(sourceModelAboutToBeDeleted())); } m_sourceModel = model; if (m_sourceModel) { connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()), this, SIGNAL(alignmentCompletionChanged())); connect(m_sourceModel, SIGNAL(aboutToBeDeleted()), this, SLOT(sourceModelAboutToBeDeleted())); } } void Model::aboutToDelete() { // SVDEBUG << "Model(" << this << ", \"" // << objectName() << "\", type uri <" // << m_typeUri << ">)::aboutToDelete()" << endl; if (m_aboutToDelete) { SVDEBUG << "WARNING: Model(" << this << ", \"" << objectName() << "\", type uri <" << m_typeUri << ">)::aboutToDelete: " << "aboutToDelete called more than once for the same model" << endl; } emit aboutToBeDeleted(); m_aboutToDelete = true; } void Model::sourceModelAboutToBeDeleted() { m_sourceModel = 0; } void Model::setAlignment(AlignmentModel *alignment) { if (m_alignment) { m_alignment->aboutToDelete(); delete m_alignment; } m_alignment = alignment; if (m_alignment) { connect(m_alignment, SIGNAL(completionChanged()), this, SIGNAL(alignmentCompletionChanged())); } } const AlignmentModel * Model::getAlignment() const { return m_alignment; } const Model * Model::getAlignmentReference() const { if (!m_alignment) { if (m_sourceModel) return m_sourceModel->getAlignmentReference(); return 0; } return m_alignment->getReferenceModel(); } sv_frame_t Model::alignToReference(sv_frame_t frame) const { // cerr << "Model(" << this << ")::alignToReference(" << frame << ")" << endl; if (!m_alignment) { if (m_sourceModel) return m_sourceModel->alignToReference(frame); else return frame; } sv_frame_t refFrame = m_alignment->toReference(frame); const Model *m = m_alignment->getReferenceModel(); if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame(); // cerr << "have alignment, aligned is " << refFrame << endl; return refFrame; } sv_frame_t Model::alignFromReference(sv_frame_t refFrame) const { // cerr << "Model(" << this << ")::alignFromReference(" << refFrame << ")" << endl; if (!m_alignment) { if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame); else return refFrame; } sv_frame_t frame = m_alignment->fromReference(refFrame); if (frame > getEndFrame()) frame = getEndFrame(); // cerr << "have alignment, aligned is " << frame << endl; return frame; } int Model::getAlignmentCompletion() const { // SVDEBUG << "Model::getAlignmentCompletion" << endl; if (!m_alignment) { if (m_sourceModel) return m_sourceModel->getAlignmentCompletion(); else return 100; } int completion = 0; (void)m_alignment->isReady(&completion); // cerr << " -> " << completion << endl; return completion; } QString Model::getTitle() const { if (m_sourceModel) return m_sourceModel->getTitle(); else return ""; } QString Model::getMaker() const { if (m_sourceModel) return m_sourceModel->getMaker(); else return ""; } QString Model::getLocation() const { if (m_sourceModel) return m_sourceModel->getLocation(); else return ""; } void Model::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("\n") .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getSampleRate()) .arg(getStartFrame()) .arg(getEndFrame()) .arg(extraAttributes); } sonic-visualiser-3.0.3/svcore/data/model/Model.h0000644000000000000000000002305113111512442017660 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_H_ #define _MODEL_H_ #include #include #include "base/XmlExportable.h" #include "base/Playable.h" #include "base/BaseTypes.h" #include "base/DataExportOptions.h" class ZoomConstraint; class AlignmentModel; /** * Model is the base class for all data models that represent any sort * of data on a time scale based on an audio frame rate. */ class Model : public QObject, public XmlExportable, public Playable { Q_OBJECT public: virtual ~Model(); /** * Return true if the model was constructed successfully. Classes * that refer to the model should always test this before use. */ virtual bool isOK() const = 0; /** * Return the first audio frame spanned by the model. */ virtual sv_frame_t getStartFrame() const = 0; /** * Return the last audio frame spanned by the model. */ virtual sv_frame_t getEndFrame() const = 0; /** * Return the frame rate in frames per second. */ virtual sv_samplerate_t getSampleRate() const = 0; /** * Return the frame rate of the underlying material, if the model * itself has already been resampled. */ virtual sv_samplerate_t getNativeRate() const { return getSampleRate(); } /** * Return the "work title" of the model, if known. */ virtual QString getTitle() const; /** * Return the "artist" or "maker" of the model, if known. */ virtual QString getMaker() const; /** * Return the location of the data in this model (e.g. source * URL). This should not normally be returned for editable models * that have been edited. */ virtual QString getLocation() const; /** * Return the type of the model. For display purposes only. */ virtual QString getTypeName() const = 0; /** * Mark the model as abandoning. This means that the application * no longer needs it, so it can stop doing any background * calculations it may be involved in. Note that as far as the * model API is concerned, this does nothing more than tell the * model to return true from isAbandoning(). The actual response * to this will depend on the model's context -- it's possible * nothing at all will change. */ virtual void abandon() { m_abandoning = true; } /** * Query whether the model has been marked as abandoning. */ virtual bool isAbandoning() const { return m_abandoning; } /** * Return true if the model has finished loading or calculating * all its data, for a model that is capable of calculating in a * background thread. The default implementation is appropriate * for a thread that does not background any work but carries out * all its calculation from the constructor or accessors. * * If "completion" is non-NULL, this function should return * through it an estimated percentage value showing how far * through the background operation it thinks it is (for progress * reporting). If it has no way to calculate progress, it may * return the special value COMPLETION_UNKNOWN. See also * getCompletion(). */ virtual bool isReady(int *completion = 0) const { bool ok = isOK(); if (completion) *completion = (ok ? 100 : 0); return ok; } static const int COMPLETION_UNKNOWN; /** * If this model imposes a zoom constraint, i.e. some limit to the * set of resolutions at which its data can meaningfully be * displayed, then return it. */ virtual const ZoomConstraint *getZoomConstraint() const { return 0; } /** * If this model was derived from another, return the model it was * derived from. The assumption is that the source model's * alignment will also apply to this model, unless some other * property (such as a specific alignment model set on this model) * indicates otherwise. */ virtual Model *getSourceModel() const { return m_sourceModel; } /** * Set the source model for this model. */ virtual void setSourceModel(Model *model); /** * Specify an aligment between this model's timeline and that of a * reference model. The alignment model records both the * reference and the alignment. This model takes ownership of the * alignment model. */ virtual void setAlignment(AlignmentModel *alignment); /** * Retrieve the alignment model for this model. This is not a * generally useful function, as the alignment you really want may * be performed by the source model instead. You should normally * use getAlignmentReference, alignToReference and * alignFromReference instead of this. The main intended * application for this function is in streaming out alignments to * the session file. */ virtual const AlignmentModel *getAlignment() const; /** * Return the reference model for the current alignment timeline, * if any. */ virtual const Model *getAlignmentReference() const; /** * Return the frame number of the reference model that corresponds * to the given frame number in this model. */ virtual sv_frame_t alignToReference(sv_frame_t frame) const; /** * Return the frame number in this model that corresponds to the * given frame number of the reference model. */ virtual sv_frame_t alignFromReference(sv_frame_t referenceFrame) const; /** * Return the completion percentage for the alignment model: 100 * if there is no alignment model or it has been entirely * calculated, or less than 100 if it is still being calculated. */ virtual int getAlignmentCompletion() const; /** * Set the event, feature, or signal type URI for the features * contained in this model, according to the Audio Features RDF * ontology. */ void setRDFTypeURI(QString uri) { m_typeUri = uri; } /** * Retrieve the event, feature, or signal type URI for the * features contained in this model, if previously set with * setRDFTypeURI. */ QString getRDFTypeURI() const { return m_typeUri; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual QString toDelimitedDataString(QString delimiter) const { return toDelimitedDataStringSubset (delimiter, getStartFrame(), getEndFrame() + 1); } virtual QString toDelimitedDataStringWithOptions(QString delimiter, DataExportOptions opts) const { return toDelimitedDataStringSubsetWithOptions (delimiter, opts, getStartFrame(), getEndFrame() + 1); } virtual QString toDelimitedDataStringSubset(QString, sv_frame_t /* f0 */, sv_frame_t /* f1 */) const { return ""; } virtual QString toDelimitedDataStringSubsetWithOptions(QString delimiter, DataExportOptions, sv_frame_t f0, sv_frame_t f1) const { // Default implementation supports no options return toDelimitedDataStringSubset(delimiter, f0, f1); } public slots: void aboutToDelete(); void sourceModelAboutToBeDeleted(); signals: /** * Emitted when a model has been edited (or more data retrieved * from cache, in the case of a cached model that generates slowly) */ void modelChanged(); /** * Emitted when a model has been edited (or more data retrieved * from cache, in the case of a cached model that generates slowly) */ void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); /** * Emitted when some internal processing has advanced a stage, but * the model has not changed externally. Views should respond by * updating any progress meters or other monitoring, but not * refreshing the actual view. */ void completionChanged(); /** * Emitted when internal processing is complete (i.e. when * isReady() would return true, with completion at 100). */ void ready(); /** * Emitted when the completion percentage changes for the * calculation of this model's alignment model. */ void alignmentCompletionChanged(); /** * Emitted when something notifies this model (through calling * aboutToDelete() that it is about to delete it. Note that this * depends on an external agent such as a Document object or * owning model telling the model that it is about to delete it; * there is nothing in the model to guarantee that this signal * will be emitted before the actual deletion. */ void aboutToBeDeleted(); protected: Model() : m_sourceModel(0), m_alignment(0), m_abandoning(false), m_aboutToDelete(false) { } // Not provided. Model(const Model &); Model &operator=(const Model &); Model *m_sourceModel; AlignmentModel *m_alignment; QString m_typeUri; bool m_abandoning; bool m_aboutToDelete; }; #endif sonic-visualiser-3.0.3/svcore/data/model/ModelDataTableModel.cpp0000644000000000000000000002366413111512442022750 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ModelDataTableModel.h" #include "TabularModel.h" #include "Model.h" #include #include #include ModelDataTableModel::ModelDataTableModel(TabularModel *m) : m_model(m), m_sortColumn(0), m_sortOrdering(Qt::AscendingOrder), m_currentRow(0) { Model *baseModel = dynamic_cast(m); connect(baseModel, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(baseModel, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); connect(baseModel, SIGNAL(aboutToBeDeleted()), this, SLOT(modelAboutToBeDeleted())); } ModelDataTableModel::~ModelDataTableModel() { } QVariant ModelDataTableModel::data(const QModelIndex &index, int role) const { if (!m_model) return QVariant(); if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant(); if (!index.isValid()) return QVariant(); QVariant d = m_model->getData(getUnsorted(index.row()), index.column(), role); return d; } bool ModelDataTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!m_model) return false; if (!index.isValid()) return false; Command *command = m_model->getSetDataCommand(getUnsorted(index.row()), index.column(), value, role); if (command) { emit addCommand(command); return true; } else { return false; } } bool ModelDataTableModel::insertRow(int row, const QModelIndex &parent) { if (!m_model) return false; if (parent.isValid()) return false; emit beginInsertRows(parent, row, row); Command *command = m_model->getInsertRowCommand(getUnsorted(row)); if (command) { emit addCommand(command); } emit endInsertRows(); return (command ? true : false); } bool ModelDataTableModel::removeRow(int row, const QModelIndex &parent) { if (!m_model) return false; if (parent.isValid()) return false; emit beginRemoveRows(parent, row, row); Command *command = m_model->getRemoveRowCommand(getUnsorted(row)); if (command) { emit addCommand(command); } emit endRemoveRows(); return (command ? true : false); } Qt::ItemFlags ModelDataTableModel::flags(const QModelIndex &) const { Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable; return flags; } QVariant ModelDataTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (!m_model) return QVariant(); if (orientation == Qt::Vertical && role == Qt::DisplayRole) { return section + 1; } if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { return m_model->getHeading(section); } return QVariant(); } QModelIndex ModelDataTableModel::index(int row, int column, const QModelIndex &) const { return createIndex(row, column, (void *)0); } QModelIndex ModelDataTableModel::parent(const QModelIndex &) const { return QModelIndex(); } int ModelDataTableModel::rowCount(const QModelIndex &parent) const { if (!m_model) return 0; if (parent.isValid()) return 0; return m_model->getRowCount(); } int ModelDataTableModel::columnCount(const QModelIndex &parent) const { if (!m_model) return 0; if (parent.isValid()) return 0; return m_model->getColumnCount(); } QModelIndex ModelDataTableModel::getModelIndexForFrame(sv_frame_t frame) const { if (!m_model) return createIndex(0, 0); int row = m_model->getRowForFrame(frame); return createIndex(getSorted(row), 0, (void *)0); } sv_frame_t ModelDataTableModel::getFrameForModelIndex(const QModelIndex &index) const { if (!m_model) return 0; return m_model->getFrameForRow(getUnsorted(index.row())); } QModelIndex ModelDataTableModel::findText(QString text) const { if (text == "") return QModelIndex(); int rows = rowCount(); int cols = columnCount(); int current = getCurrentRow(); for (int row = 1; row <= rows; ++row) { int wrapped = (row + current) % rows; for (int col = 0; col < cols; ++col) { if (m_model->getSortType(col) != TabularModel::SortAlphabetical) { continue; } QString cell = m_model->getData(getUnsorted(wrapped), col, Qt::DisplayRole).toString(); if (cell.contains(text, Qt::CaseInsensitive)) { return createIndex(wrapped, col); } } } return QModelIndex(); } void ModelDataTableModel::sort(int column, Qt::SortOrder sortOrder) { // SVDEBUG << "ModelDataTableModel::sort(" << column << ", " << sortOrder // << ")" << endl; int prevCurrent = getCurrentRow(); if (m_sortColumn != column) { clearSort(); } m_sortColumn = column; m_sortOrdering = sortOrder; int current = getCurrentRow(); if (current != prevCurrent) { // cerr << "Current row changed from " << prevCurrent << " to " << current << " for underlying row " << m_currentRow << endl; emit currentChanged(createIndex(current, 0, (void *)0)); } emit layoutChanged(); } void ModelDataTableModel::modelChanged() { clearSort(); emit layoutChanged(); } void ModelDataTableModel::modelChangedWithin(sv_frame_t, sv_frame_t) { //!!! inefficient clearSort(); emit layoutChanged(); } void ModelDataTableModel::modelAboutToBeDeleted() { m_model = 0; emit modelRemoved(); } int ModelDataTableModel::getSorted(int row) const { if (!m_model) return row; if (m_model->isColumnTimeValue(m_sortColumn)) { if (m_sortOrdering == Qt::AscendingOrder) { return row; } else { return rowCount() - row - 1; } } if (m_sort.empty()) { resort(); } int result = 0; if (row >= 0 && row < (int)m_sort.size()) { result = m_sort[row]; } if (m_sortOrdering == Qt::DescendingOrder) { result = rowCount() - result - 1; } return result; } int ModelDataTableModel::getUnsorted(int row) const { if (!m_model) return row; if (m_model->isColumnTimeValue(m_sortColumn)) { if (m_sortOrdering == Qt::AscendingOrder) { return row; } else { return rowCount() - row - 1; } } if (m_sort.empty()) { resort(); } int result = 0; if (row >= 0 && row < (int)m_sort.size()) { if (m_sortOrdering == Qt::AscendingOrder) { result = m_rsort[row]; } else { result = m_rsort[rowCount() - row - 1]; } } return result; } void ModelDataTableModel::resort() const { if (!m_model) return; bool numeric = (m_model->getSortType(m_sortColumn) == TabularModel::SortNumeric); // cerr << "resort: numeric == " << numeric << endl; m_sort.clear(); m_rsort.clear(); if (numeric) resortNumeric(); else resortAlphabetical(); std::map tmp; // rsort maps from sorted row number to original row number for (int i = 0; i < (int)m_rsort.size(); ++i) { tmp[m_rsort[i]] = i; } // tmp now maps from original row number to sorted row number for (std::map::const_iterator i = tmp.begin(); i != tmp.end(); ++i) { m_sort.push_back(i->second); } // and sort now maps from original row number to sorted row number } void ModelDataTableModel::resortNumeric() const { if (!m_model) return; typedef std::multimap MapType; MapType rowMap; int rows = m_model->getRowCount(); for (int i = 0; i < rows; ++i) { QVariant value = m_model->getData(i, m_sortColumn, TabularModel::SortRole); rowMap.insert(MapType::value_type(value.toDouble(), i)); } for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) { // cerr << "resortNumeric: " << i->second << ": " << i->first << endl; m_rsort.push_back(i->second); } // rsort now maps from sorted row number to original row number } void ModelDataTableModel::resortAlphabetical() const { if (!m_model) return; typedef std::multimap MapType; MapType rowMap; int rows = m_model->getRowCount(); for (int i = 0; i < rows; ++i) { QVariant value = m_model->getData(i, m_sortColumn, TabularModel::SortRole); rowMap.insert(MapType::value_type(value.toString(), i)); } for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) { // cerr << "resortAlphabetical: " << i->second << ": " << i->first << endl; m_rsort.push_back(i->second); } // rsort now maps from sorted row number to original row number } int ModelDataTableModel::getCurrentRow() const { return getSorted(m_currentRow); } void ModelDataTableModel::setCurrentRow(int row) { m_currentRow = getUnsorted(row); } void ModelDataTableModel::clearSort() { // int prevCurrent = getCurrentRow(); m_sort.clear(); // int current = getCurrentRow(); //!!! no -- not until the sort criteria have changed // if (current != prevCurrent) { // cerr << "Current row changed from " << prevCurrent << " to " << current << " for underlying row " << m_currentRow << endl; // emit currentRowChanged(createIndex(current, 0, 0)); // } } sonic-visualiser-3.0.3/svcore/data/model/ModelDataTableModel.h0000644000000000000000000000522613111512442022407 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_DATA_TABLE_MODEL_H_ #define _MODEL_DATA_TABLE_MODEL_H_ #include #include #include "base/BaseTypes.h" class TabularModel; class Command; class ModelDataTableModel : public QAbstractItemModel { Q_OBJECT public: ModelDataTableModel(TabularModel *m); virtual ~ModelDataTableModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); bool insertRow(int row, const QModelIndex &parent = QModelIndex()); bool removeRow(int row, const QModelIndex &parent = QModelIndex()); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QModelIndex getModelIndexForFrame(sv_frame_t frame) const; sv_frame_t getFrameForModelIndex(const QModelIndex &) const; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); QModelIndex findText(QString text) const; void setCurrentRow(int row); int getCurrentRow() const; signals: void frameSelected(int); void addCommand(Command *); void currentChanged(const QModelIndex &); void modelRemoved(); protected slots: void modelChanged(); void modelChangedWithin(sv_frame_t, sv_frame_t); void modelAboutToBeDeleted(); protected: TabularModel *m_model; int m_sortColumn; Qt::SortOrder m_sortOrdering; int m_currentRow; typedef std::vector RowList; mutable RowList m_sort; mutable RowList m_rsort; int getSorted(int row) const; int getUnsorted(int row) const; void resort() const; void resortNumeric() const; void resortAlphabetical() const; void clearSort(); }; #endif sonic-visualiser-3.0.3/svcore/data/model/NoteData.h0000644000000000000000000000307713111512442020325 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef NOTE_DATA_H #define NOTE_DATA_H #include #include "base/Pitch.h" struct NoteData { NoteData(sv_frame_t _start, sv_frame_t _dur, int _mp, int _vel) : start(_start), duration(_dur), midiPitch(_mp), frequency(0), isMidiPitchQuantized(true), velocity(_vel), channel(0) { }; sv_frame_t start; // audio sample frame sv_frame_t duration; // in audio sample frames int midiPitch; // 0-127 float frequency; // Hz, to be used if isMidiPitchQuantized false bool isMidiPitchQuantized; int velocity; // MIDI-style 0-127 int channel; // MIDI 0-15 float getFrequency() const { if (isMidiPitchQuantized) { return float(Pitch::getFrequencyForPitch(midiPitch)); } else { return frequency; } } }; typedef std::vector NoteList; class NoteExportable { public: virtual NoteList getNotes() const = 0; virtual NoteList getNotesWithin(sv_frame_t startFrame, sv_frame_t endFrame) const = 0; }; #endif sonic-visualiser-3.0.3/svcore/data/model/NoteModel.h0000644000000000000000000001730613111512442020514 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _NOTE_MODEL_H_ #define _NOTE_MODEL_H_ #include "IntervalModel.h" #include "NoteData.h" #include "base/RealTime.h" #include "base/PlayParameterRepository.h" #include "base/Pitch.h" /** * NoteModel -- a concrete IntervalModel for notes. */ /** * Note type for use in a sparse model. All we mean by a "note" is * something that has an onset time, a single value, a duration, and a * level. Like other points, it can also have a label. With this * point type, the model can be thought of as representing a simple * MIDI-type piano roll, except that the y coordinates (values) do not * have to be discrete integers. */ struct Note { public: Note(sv_frame_t _frame) : frame(_frame), value(0.0f), duration(0), level(1.f) { } Note(sv_frame_t _frame, float _value, sv_frame_t _duration, float _level, QString _label) : frame(_frame), value(_value), duration(_duration), level(_level), label(_label) { } int getDimensions() const { return 3; } sv_frame_t frame; float value; sv_frame_t duration; float level; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(duration).arg(level) .arg(XmlExportable::encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions opts, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str(); if (!(opts & DataExportOmitLevels)) { list << QString("%1").arg(level); } if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const Note &p1, const Note &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; if (p1.duration != p2.duration) return p1.duration < p2.duration; if (p1.level != p2.level) return p1.level < p2.level; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const Note &p1, const Note &p2) const { return p1.frame < p2.frame; } }; }; class NoteModel : public IntervalModel, public NoteExportable { Q_OBJECT public: NoteModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, notifyOnAdd), m_valueQuantization(0) { PlayParameterRepository::getInstance()->addPlayable(this); } NoteModel(sv_samplerate_t sampleRate, int resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd), m_valueQuantization(0) { PlayParameterRepository::getInstance()->addPlayable(this); } virtual ~NoteModel() { PlayParameterRepository::getInstance()->removePlayable(this); } float getValueQuantization() const { return m_valueQuantization; } void setValueQuantization(float q) { m_valueQuantization = q; } QString getTypeName() const { return tr("Note"); } virtual bool canPlay() const { return true; } virtual QString getDefaultPlayClipId() const { return "elecpiano"; } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { std::cerr << "NoteModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; IntervalModel::toXml (out, indent, QString("%1 subtype=\"note\" valueQuantization=\"%2\"") .arg(extraAttributes).arg(m_valueQuantization)); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 6; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Pitch"); case 3: return tr("Duration"); case 4: return tr("Level"); case 5: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 4) { return IntervalModel::getData(row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 4: return i->level; case 5: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 4) { return IntervalModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 4: point.level = float(value.toDouble()); break; case 5: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual SortType getSortType(int column) const { if (column == 5) return SortAlphabetical; return SortNumeric; } /** * NoteExportable methods. */ NoteList getNotes() const { return getNotesWithin(getStartFrame(), getEndFrame()); } NoteList getNotesWithin(sv_frame_t startFrame, sv_frame_t endFrame) const { PointList points = getPoints(startFrame, endFrame); NoteList notes; for (PointList::iterator pli = points.begin(); pli != points.end(); ++pli) { sv_frame_t duration = pli->duration; if (duration == 0 || duration == 1) { duration = sv_frame_t(getSampleRate() / 20); } int pitch = int(lrintf(pli->value)); int velocity = 100; if (pli->level > 0.f && pli->level <= 1.f) { velocity = int(lrintf(pli->level * 127)); } NoteData note(pli->frame, duration, pitch, velocity); if (getScaleUnits() == "Hz") { note.frequency = pli->value; note.midiPitch = Pitch::getPitchForFrequency(note.frequency); note.isMidiPitchQuantized = false; } notes.push_back(note); } return notes; } protected: float m_valueQuantization; }; #endif sonic-visualiser-3.0.3/svcore/data/model/PathModel.h0000644000000000000000000000555213111512442020503 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PATH_MODEL_H_ #define _PATH_MODEL_H_ #include "Model.h" #include "SparseModel.h" #include "base/RealTime.h" #include "base/BaseTypes.h" #include struct PathPoint { PathPoint(sv_frame_t _frame) : frame(_frame), mapframe(_frame) { } PathPoint(sv_frame_t _frame, sv_frame_t _mapframe) : frame(_frame), mapframe(_mapframe) { } int getDimensions() const { return 2; } sv_frame_t frame; sv_frame_t mapframe; QString getLabel() const { return ""; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(mapframe).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(mapframe); return list.join(delimiter); } struct Comparator { bool operator()(const PathPoint &p1, const PathPoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; return p1.mapframe < p2.mapframe; } }; struct OrderComparator { bool operator()(const PathPoint &p1, const PathPoint &p2) const { return p1.frame < p2.frame; } }; }; class PathModel : public SparseModel { public: PathModel(sv_samplerate_t sampleRate, int resolution, bool notify = true) : SparseModel(sampleRate, resolution, notify) { } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { SparseModel::toXml (out, indent, QString("%1 subtype=\"path\"") .arg(extraAttributes)); } /** * TabularModel is inherited via SparseModel, but we don't need it here. */ virtual QString getHeading(int) const { return ""; } virtual bool isColumnTimeValue(int) const { return false; } virtual SortType getSortType(int) const { return SortNumeric; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/PowerOfSqrtTwoZoomConstraint.cpp0000644000000000000000000000507713111512442025022 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PowerOfSqrtTwoZoomConstraint.h" #include #include int PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(int blockSize, RoundingDirection dir) const { int type, power; int rv = getNearestBlockSize(blockSize, type, power, dir); return rv; } int PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(int blockSize, int &type, int &power, RoundingDirection dir) const { // cerr << "given " << blockSize << endl; int minCachePower = getMinCachePower(); if (blockSize < (1 << minCachePower)) { type = -1; power = 0; float val = 1.0, prevVal = 1.0; while (val + 0.01 < blockSize) { prevVal = val; val *= sqrtf(2.f); } int rval; if (dir == RoundUp) rval = int(val + 0.01f); else if (dir == RoundDown) rval = int(prevVal + 0.01f); else if (val - float(blockSize) < float(blockSize) - prevVal) rval = int(val + 0.01f); else rval = int(prevVal + 0.01); // SVDEBUG << "returning " << rval << endl; return rval; } int prevBase = (1 << minCachePower); int prevPower = minCachePower; int prevType = 0; int result = 0; for (unsigned int i = 0; ; ++i) { power = minCachePower + i/2; type = i % 2; int base; if (type == 0) { base = (1 << power); } else { base = (((unsigned int)((1 << minCachePower) * sqrt(2.) + 0.01)) << (power - minCachePower)); } // SVDEBUG << "Testing base " << base << endl; if (base == blockSize) { result = base; break; } if (base > blockSize) { if (dir == RoundNearest) { if (base - blockSize < blockSize - prevBase) { dir = RoundUp; } else { dir = RoundDown; } } if (dir == RoundUp) { result = base; break; } else { type = prevType; power = prevPower; result = prevBase; break; } } prevType = type; prevPower = power; prevBase = base; } if (result > getMaxZoomLevel()) result = getMaxZoomLevel(); return result; } sonic-visualiser-3.0.3/svcore/data/model/PowerOfSqrtTwoZoomConstraint.h0000644000000000000000000000221113111512442024452 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _POWER_OF_SQRT_TWO_ZOOM_CONSTRAINT_H_ #define _POWER_OF_SQRT_TWO_ZOOM_CONSTRAINT_H_ #include "base/ZoomConstraint.h" class PowerOfSqrtTwoZoomConstraint : virtual public ZoomConstraint { public: virtual int getNearestBlockSize(int requestedBlockSize, RoundingDirection dir = RoundNearest) const; virtual int getNearestBlockSize(int requestedBlockSize, int &type, int &power, RoundingDirection dir = RoundNearest) const; virtual int getMinCachePower() const { return 6; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/PowerOfTwoZoomConstraint.cpp0000644000000000000000000000221413111512442024136 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PowerOfTwoZoomConstraint.h" int PowerOfTwoZoomConstraint::getNearestBlockSize(int req, RoundingDirection dir) const { int result = 0; for (int bs = 1; ; bs *= 2) { if (bs >= req) { if (dir == RoundNearest) { if (bs - req < req - bs/2) { result = bs; break; } else { result = bs/2; break; } } else if (dir == RoundDown) { result = bs/2; break; } else { result = bs; break; } } } if (result > getMaxZoomLevel()) result = getMaxZoomLevel(); return result; } sonic-visualiser-3.0.3/svcore/data/model/PowerOfTwoZoomConstraint.h0000644000000000000000000000163313111512442023607 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _POWER_OF_TWO_ZOOM_CONSTRAINT_H_ #define _POWER_OF_TWO_ZOOM_CONSTRAINT_H_ #include "base/ZoomConstraint.h" class PowerOfTwoZoomConstraint : virtual public ZoomConstraint { public: virtual int getNearestBlockSize(int requestedBlockSize, RoundingDirection dir = RoundNearest) const; }; #endif sonic-visualiser-3.0.3/svcore/data/model/RangeSummarisableTimeValueModel.cpp0000644000000000000000000000122613111512442025351 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RangeSummarisableTimeValueModel.h" #include sonic-visualiser-3.0.3/svcore/data/model/RangeSummarisableTimeValueModel.h0000644000000000000000000000662113111512442025022 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H #define SV_RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H #include #include "DenseTimeValueModel.h" #include "base/ZoomConstraint.h" #include /** * Base class for models containing dense two-dimensional data (value * against time) that may be meaningfully represented in a zoomed view * using min/max range summaries. Audio waveform data is an obvious * example: think "peaks and minima" for "ranges". */ class RangeSummarisableTimeValueModel : public DenseTimeValueModel { Q_OBJECT public: RangeSummarisableTimeValueModel() { } class Range { public: Range() : m_new(true), m_min(0.f), m_max(0.f), m_absmean(0.f) { } Range(const Range &r) : m_new(true), m_min(r.m_min), m_max(r.m_max), m_absmean(r.m_absmean) { } Range(float min, float max, float absmean) : m_new(true), m_min(min), m_max(max), m_absmean(absmean) { } float min() const { return m_min; } float max() const { return m_max; } float absmean() const { return m_absmean; } void setMin(float min) { m_min = min; m_new = false; } void setMax(float max) { m_max = max; m_new = false; } void setAbsmean(float absmean) { m_absmean = absmean; } void sample(float s) { if (m_new) { m_min = s; m_max = s; m_new = false; } else { if (s < m_min) m_min = s; if (s > m_max) m_max = s; } } private: bool m_new; float m_min; float m_max; float m_absmean; }; typedef std::vector RangeBlock; /** * Return ranges from the given start frame, corresponding to the * given number of underlying sample frames, summarised at the * given block size. duration / blockSize ranges should ideally * be returned. * * If the given block size is not supported by this model * (according to its zoom constraint), also modify the blockSize * parameter so as to return the block size that was actually * obtained. */ virtual void getSummaries(int channel, sv_frame_t start, sv_frame_t count, RangeBlock &ranges, int &blockSize) const = 0; /** * Return the range from the given start frame, corresponding to * the given number of underlying sample frames, summarised at a * block size equal to the distance between start and end frames. */ virtual Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const = 0; virtual int getSummaryBlockSize(int desired) const = 0; QString getTypeName() const { return tr("Range-Summarisable Time-Value"); } }; #endif sonic-visualiser-3.0.3/svcore/data/model/ReadOnlyWaveFileModel.cpp0000644000000000000000000005324013111512442023277 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ReadOnlyWaveFileModel.h" #include "fileio/AudioFileReader.h" #include "fileio/AudioFileReaderFactory.h" #include "system/System.h" #include "base/Preferences.h" #include #include #include //#include #include #include #include using namespace std; //#define DEBUG_WAVE_FILE_MODEL 1 PowerOfSqrtTwoZoomConstraint ReadOnlyWaveFileModel::m_zoomConstraint; ReadOnlyWaveFileModel::ReadOnlyWaveFileModel(FileSource source, sv_samplerate_t targetRate) : m_source(source), m_path(source.getLocation()), m_reader(0), m_myReader(true), m_startFrame(0), m_fillThread(0), m_updateTimer(0), m_lastFillExtent(0), m_exiting(false), m_lastDirectReadStart(0), m_lastDirectReadCount(0) { m_source.waitForData(); if (m_source.isOK()) { Preferences *prefs = Preferences::getInstance(); AudioFileReaderFactory::Parameters params; params.targetRate = targetRate; params.normalisation = prefs->getNormaliseAudio() ? AudioFileReaderFactory::Normalisation::Peak : AudioFileReaderFactory::Normalisation::None; params.gaplessMode = prefs->getUseGaplessMode() ? AudioFileReaderFactory::GaplessMode::Gapless : AudioFileReaderFactory::GaplessMode::Gappy; params.threadingMode = AudioFileReaderFactory::ThreadingMode::Threaded; m_reader = AudioFileReaderFactory::createReader(m_source, params); if (m_reader) { SVDEBUG << "ReadOnlyWaveFileModel::ReadOnlyWaveFileModel: reader rate: " << m_reader->getSampleRate() << endl; } } if (m_reader) setObjectName(m_reader->getTitle()); if (objectName() == "") setObjectName(QFileInfo(m_path).fileName()); if (isOK()) fillCache(); } ReadOnlyWaveFileModel::ReadOnlyWaveFileModel(FileSource source, AudioFileReader *reader) : m_source(source), m_path(source.getLocation()), m_reader(0), m_myReader(false), m_startFrame(0), m_fillThread(0), m_updateTimer(0), m_lastFillExtent(0), m_exiting(false) { m_reader = reader; if (m_reader) setObjectName(m_reader->getTitle()); if (objectName() == "") setObjectName(QFileInfo(m_path).fileName()); fillCache(); } ReadOnlyWaveFileModel::~ReadOnlyWaveFileModel() { m_exiting = true; if (m_fillThread) m_fillThread->wait(); if (m_myReader) delete m_reader; m_reader = 0; SVDEBUG << "ReadOnlyWaveFileModel: Destructor exiting; we had caches of " << (m_cache[0].size() * sizeof(Range)) << " and " << (m_cache[1].size() * sizeof(Range)) << " bytes" << endl; } bool ReadOnlyWaveFileModel::isOK() const { return m_reader && m_reader->isOK(); } bool ReadOnlyWaveFileModel::isReady(int *completion) const { bool ready = (isOK() && (m_fillThread == 0)); double c = double(m_lastFillExtent) / double(getEndFrame() - getStartFrame()); static int prevCompletion = 0; if (completion) { *completion = int(c * 100.0 + 0.01); if (m_reader) { int decodeCompletion = m_reader->getDecodeCompletion(); if (decodeCompletion < 90) *completion = decodeCompletion; else *completion = min(*completion, decodeCompletion); } if (*completion != 0 && *completion != 100 && prevCompletion != 0 && prevCompletion > *completion) { // just to avoid completion going backwards *completion = prevCompletion; } prevCompletion = *completion; } #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "ReadOnlyWaveFileModel::isReady(): ready = " << ready << ", completion = " << (completion ? *completion : -1) << endl; #endif return ready; } sv_frame_t ReadOnlyWaveFileModel::getFrameCount() const { if (!m_reader) return 0; return m_reader->getFrameCount(); } int ReadOnlyWaveFileModel::getChannelCount() const { if (!m_reader) return 0; return m_reader->getChannelCount(); } sv_samplerate_t ReadOnlyWaveFileModel::getSampleRate() const { if (!m_reader) return 0; return m_reader->getSampleRate(); } sv_samplerate_t ReadOnlyWaveFileModel::getNativeRate() const { if (!m_reader) return 0; sv_samplerate_t rate = m_reader->getNativeRate(); if (rate == 0) rate = getSampleRate(); return rate; } QString ReadOnlyWaveFileModel::getTitle() const { QString title; if (m_reader) title = m_reader->getTitle(); if (title == "") title = objectName(); return title; } QString ReadOnlyWaveFileModel::getMaker() const { if (m_reader) return m_reader->getMaker(); return ""; } QString ReadOnlyWaveFileModel::getLocation() const { if (m_reader) return m_reader->getLocation(); return ""; } QString ReadOnlyWaveFileModel::getLocalFilename() const { if (m_reader) return m_reader->getLocalFilename(); return ""; } floatvec_t ReadOnlyWaveFileModel::getData(int channel, sv_frame_t start, sv_frame_t count) const { // Read directly from the file. This is used for e.g. audio // playback or input to transforms. #ifdef DEBUG_WAVE_FILE_MODEL cout << "ReadOnlyWaveFileModel::getData[" << this << "]: " << channel << ", " << start << ", " << count << endl; #endif int channels = getChannelCount(); if (channel >= channels) { cerr << "ERROR: WaveFileModel::getData: channel (" << channel << ") >= channel count (" << channels << ")" << endl; return {}; } if (!m_reader || !m_reader->isOK() || count == 0) { return {}; } if (start >= m_startFrame) { start -= m_startFrame; } else { if (count <= m_startFrame - start) { return {}; } else { count -= (m_startFrame - start); start = 0; } } floatvec_t interleaved = m_reader->getInterleavedFrames(start, count); if (channels == 1) return interleaved; sv_frame_t obtained = interleaved.size() / channels; floatvec_t result(obtained, 0.f); if (channel != -1) { // get a single channel for (int i = 0; i < obtained; ++i) { result[i] = interleaved[i * channels + channel]; } } else { // channel == -1, mix down all channels for (int i = 0; i < obtained; ++i) { for (int c = 0; c < channels; ++c) { result[i] += interleaved[i * channels + c]; } } } return result; } vector ReadOnlyWaveFileModel::getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const { // Read directly from the file. This is used for e.g. audio // playback or input to transforms. #ifdef DEBUG_WAVE_FILE_MODEL cout << "ReadOnlyWaveFileModel::getData[" << this << "]: " << fromchannel << "," << tochannel << ", " << start << ", " << count << endl; #endif int channels = getChannelCount(); if (fromchannel > tochannel) { cerr << "ERROR: ReadOnlyWaveFileModel::getData: fromchannel (" << fromchannel << ") > tochannel (" << tochannel << ")" << endl; return {}; } if (tochannel >= channels) { cerr << "ERROR: ReadOnlyWaveFileModel::getData: tochannel (" << tochannel << ") >= channel count (" << channels << ")" << endl; return {}; } if (!m_reader || !m_reader->isOK() || count == 0) { return {}; } int reqchannels = (tochannel - fromchannel) + 1; if (start >= m_startFrame) { start -= m_startFrame; } else { if (count <= m_startFrame - start) { return {}; } else { count -= (m_startFrame - start); start = 0; } } floatvec_t interleaved = m_reader->getInterleavedFrames(start, count); if (channels == 1) return { interleaved }; sv_frame_t obtained = interleaved.size() / channels; vector result(reqchannels, floatvec_t(obtained, 0.f)); for (int c = fromchannel; c <= tochannel; ++c) { int destc = c - fromchannel; for (int i = 0; i < obtained; ++i) { result[destc][i] = interleaved[i * channels + c]; } } return result; } int ReadOnlyWaveFileModel::getSummaryBlockSize(int desired) const { int cacheType = 0; int power = m_zoomConstraint.getMinCachePower(); int roundedBlockSize = m_zoomConstraint.getNearestBlockSize (desired, cacheType, power, ZoomConstraint::RoundDown); if (cacheType != 0 && cacheType != 1) { // We will be reading directly from file, so can satisfy any // blocksize requirement return desired; } else { return roundedBlockSize; } } void ReadOnlyWaveFileModel::getSummaries(int channel, sv_frame_t start, sv_frame_t count, RangeBlock &ranges, int &blockSize) const { ranges.clear(); if (!isOK()) return; ranges.reserve((count / blockSize) + 1); if (start > m_startFrame) start -= m_startFrame; else if (count <= m_startFrame - start) return; else { count -= (m_startFrame - start); start = 0; } int cacheType = 0; int power = m_zoomConstraint.getMinCachePower(); int roundedBlockSize = m_zoomConstraint.getNearestBlockSize (blockSize, cacheType, power, ZoomConstraint::RoundDown); int channels = getChannelCount(); if (cacheType != 0 && cacheType != 1) { // We need to read directly from the file. We haven't got // this cached. Hope the requested area is small. This is // not optimal -- we'll end up reading the same frames twice // for stereo files, in two separate calls to this method. // We could fairly trivially handle this for most cases that // matter by putting a single cache in getInterleavedFrames // for short queries. m_directReadMutex.lock(); if (m_lastDirectReadStart != start || m_lastDirectReadCount != count || m_directRead.empty()) { m_directRead = m_reader->getInterleavedFrames(start, count); m_lastDirectReadStart = start; m_lastDirectReadCount = count; } float max = 0.0, min = 0.0, total = 0.0; sv_frame_t i = 0, got = 0; while (i < count) { sv_frame_t index = i * channels + channel; if (index >= (sv_frame_t)m_directRead.size()) break; float sample = m_directRead[index]; if (sample > max || got == 0) max = sample; if (sample < min || got == 0) min = sample; total += fabsf(sample); ++i; ++got; if (got == blockSize) { ranges.push_back(Range(min, max, total / float(got))); min = max = total = 0.0f; got = 0; } } m_directReadMutex.unlock(); if (got > 0) { ranges.push_back(Range(min, max, total / float(got))); } return; } else { QMutexLocker locker(&m_mutex); const RangeBlock &cache = m_cache[cacheType]; blockSize = roundedBlockSize; sv_frame_t cacheBlock, div; cacheBlock = (sv_frame_t(1) << m_zoomConstraint.getMinCachePower()); if (cacheType == 1) { cacheBlock = sv_frame_t(double(cacheBlock) * sqrt(2.) + 0.01); } div = blockSize / cacheBlock; sv_frame_t startIndex = start / cacheBlock; sv_frame_t endIndex = (start + count) / cacheBlock; float max = 0.0, min = 0.0, total = 0.0; sv_frame_t i = 0, got = 0; #ifdef DEBUG_WAVE_FILE_MODEL cerr << "blockSize is " << blockSize << ", cacheBlock " << cacheBlock << ", start " << start << ", count " << count << " (frame count " << getFrameCount() << "), power is " << power << ", div is " << div << ", startIndex " << startIndex << ", endIndex " << endIndex << endl; #endif for (i = 0; i <= endIndex - startIndex; ) { sv_frame_t index = (i + startIndex) * channels + channel; if (!in_range_for(cache, index)) break; const Range &range = cache[index]; if (range.max() > max || got == 0) max = range.max(); if (range.min() < min || got == 0) min = range.min(); total += range.absmean(); ++i; ++got; if (got == div) { ranges.push_back(Range(min, max, total / float(got))); min = max = total = 0.0f; got = 0; } } if (got > 0) { ranges.push_back(Range(min, max, total / float(got))); } } #ifdef DEBUG_WAVE_FILE_MODEL cerr << "returning " << ranges.size() << " ranges" << endl; #endif return; } ReadOnlyWaveFileModel::Range ReadOnlyWaveFileModel::getSummary(int channel, sv_frame_t start, sv_frame_t count) const { Range range; if (!isOK()) return range; if (start > m_startFrame) start -= m_startFrame; else if (count <= m_startFrame - start) return range; else { count -= (m_startFrame - start); start = 0; } int blockSize; for (blockSize = 1; blockSize <= count; blockSize *= 2); if (blockSize > 1) blockSize /= 2; bool first = false; sv_frame_t blockStart = (start / blockSize) * blockSize; sv_frame_t blockEnd = ((start + count) / blockSize) * blockSize; if (blockStart < start) blockStart += blockSize; if (blockEnd > blockStart) { RangeBlock ranges; getSummaries(channel, blockStart, blockEnd - blockStart, ranges, blockSize); for (int i = 0; i < (int)ranges.size(); ++i) { if (first || ranges[i].min() < range.min()) range.setMin(ranges[i].min()); if (first || ranges[i].max() > range.max()) range.setMax(ranges[i].max()); if (first || ranges[i].absmean() < range.absmean()) range.setAbsmean(ranges[i].absmean()); first = false; } } if (blockStart > start) { Range startRange = getSummary(channel, start, blockStart - start); range.setMin(min(range.min(), startRange.min())); range.setMax(max(range.max(), startRange.max())); range.setAbsmean(min(range.absmean(), startRange.absmean())); } if (blockEnd < start + count) { Range endRange = getSummary(channel, blockEnd, start + count - blockEnd); range.setMin(min(range.min(), endRange.min())); range.setMax(max(range.max(), endRange.max())); range.setAbsmean(min(range.absmean(), endRange.absmean())); } return range; } void ReadOnlyWaveFileModel::fillCache() { m_mutex.lock(); m_updateTimer = new QTimer(this); connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(fillTimerTimedOut())); m_updateTimer->start(100); m_fillThread = new RangeCacheFillThread(*this); connect(m_fillThread, SIGNAL(finished()), this, SLOT(cacheFilled())); m_mutex.unlock(); m_fillThread->start(); #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "ReadOnlyWaveFileModel::fillCache: started fill thread" << endl; #endif } void ReadOnlyWaveFileModel::fillTimerTimedOut() { if (m_fillThread) { sv_frame_t fillExtent = m_fillThread->getFillExtent(); #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "ReadOnlyWaveFileModel::fillTimerTimedOut: extent = " << fillExtent << endl; #endif if (fillExtent > m_lastFillExtent) { emit modelChangedWithin(m_lastFillExtent, fillExtent); m_lastFillExtent = fillExtent; } } else { #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "ReadOnlyWaveFileModel::fillTimerTimedOut: no thread" << endl; #endif emit modelChanged(); } } void ReadOnlyWaveFileModel::cacheFilled() { m_mutex.lock(); delete m_fillThread; m_fillThread = 0; delete m_updateTimer; m_updateTimer = 0; m_mutex.unlock(); if (getEndFrame() > m_lastFillExtent) { emit modelChangedWithin(m_lastFillExtent, getEndFrame()); } emit modelChanged(); emit ready(); #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "ReadOnlyWaveFileModel::cacheFilled" << endl; #endif } void ReadOnlyWaveFileModel::RangeCacheFillThread::run() { int cacheBlockSize[2]; cacheBlockSize[0] = (1 << m_model.m_zoomConstraint.getMinCachePower()); cacheBlockSize[1] = (int((1 << m_model.m_zoomConstraint.getMinCachePower()) * sqrt(2.) + 0.01)); sv_frame_t frame = 0; const sv_frame_t readBlockSize = 32768; floatvec_t block; if (!m_model.isOK()) return; int channels = m_model.getChannelCount(); bool updating = m_model.m_reader->isUpdating(); if (updating) { while (channels == 0 && !m_model.m_exiting) { #ifdef DEBUG_WAVE_FILE_MODEL cerr << "ReadOnlyWaveFileModel::fill: Waiting for channels..." << endl; #endif sleep(1); channels = m_model.getChannelCount(); } } Range *range = new Range[2 * channels]; float *means = new float[2 * channels]; int count[2]; count[0] = count[1] = 0; for (int i = 0; i < 2 * channels; ++i) { means[i] = 0.f; } bool first = true; while (first || updating) { updating = m_model.m_reader->isUpdating(); m_frameCount = m_model.getFrameCount(); m_model.m_mutex.lock(); while (frame < m_frameCount) { m_model.m_mutex.unlock(); #ifdef DEBUG_WAVE_FILE_MODEL cerr << "ReadOnlyWaveFileModel::fill inner loop: frame = " << frame << ", count = " << m_frameCount << ", blocksize " << readBlockSize << endl; #endif if (updating && (frame + readBlockSize > m_frameCount)) { m_model.m_mutex.lock(); // must be locked on exiting loop break; } block = m_model.m_reader->getInterleavedFrames(frame, readBlockSize); sv_frame_t gotBlockSize = block.size() / channels; m_model.m_mutex.lock(); for (sv_frame_t i = 0; i < gotBlockSize; ++i) { for (int ch = 0; ch < channels; ++ch) { sv_frame_t index = channels * i + ch; float sample = block[index]; for (int cacheType = 0; cacheType < 2; ++cacheType) { sv_frame_t rangeIndex = ch * 2 + cacheType; range[rangeIndex].sample(sample); means[rangeIndex] += fabsf(sample); } } for (int cacheType = 0; cacheType < 2; ++cacheType) { if (++count[cacheType] == cacheBlockSize[cacheType]) { for (int ch = 0; ch < int(channels); ++ch) { int rangeIndex = ch * 2 + cacheType; means[rangeIndex] = means[rangeIndex] / float(count[cacheType]); range[rangeIndex].setAbsmean(means[rangeIndex]); m_model.m_cache[cacheType].push_back(range[rangeIndex]); range[rangeIndex] = Range(); means[rangeIndex] = 0.f; } count[cacheType] = 0; } } ++frame; } if (m_model.m_exiting) break; m_fillExtent = frame; } m_model.m_mutex.unlock(); first = false; if (m_model.m_exiting) break; if (updating) { sleep(1); } } if (!m_model.m_exiting) { QMutexLocker locker(&m_model.m_mutex); for (int cacheType = 0; cacheType < 2; ++cacheType) { if (count[cacheType] > 0) { for (int ch = 0; ch < int(channels); ++ch) { int rangeIndex = ch * 2 + cacheType; means[rangeIndex] = means[rangeIndex] / float(count[cacheType]); range[rangeIndex].setAbsmean(means[rangeIndex]); m_model.m_cache[cacheType].push_back(range[rangeIndex]); range[rangeIndex] = Range(); means[rangeIndex] = 0.f; } count[cacheType] = 0; } const Range &rr = *m_model.m_cache[cacheType].begin(); MUNLOCK(&rr, m_model.m_cache[cacheType].capacity() * sizeof(Range)); } } delete[] means; delete[] range; m_fillExtent = m_frameCount; #ifdef DEBUG_WAVE_FILE_MODEL for (int cacheType = 0; cacheType < 2; ++cacheType) { cerr << "Cache type " << cacheType << " now contains " << m_model.m_cache[cacheType].size() << " ranges" << endl; } #endif } void ReadOnlyWaveFileModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { Model::toXml(out, indent, QString("type=\"wavefile\" file=\"%1\" %2") .arg(encodeEntities(m_path)).arg(extraAttributes)); } sonic-visualiser-3.0.3/svcore/data/model/ReadOnlyWaveFileModel.h0000644000000000000000000000747513111512442022755 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef READ_ONLY_WAVE_FILE_MODEL_H #define READ_ONLY_WAVE_FILE_MODEL_H #include "WaveFileModel.h" #include "base/Thread.h" #include #include #include "data/fileio/FileSource.h" #include "RangeSummarisableTimeValueModel.h" #include "PowerOfSqrtTwoZoomConstraint.h" #include class AudioFileReader; class ReadOnlyWaveFileModel : public WaveFileModel { Q_OBJECT public: ReadOnlyWaveFileModel(FileSource source, sv_samplerate_t targetRate = 0); ReadOnlyWaveFileModel(FileSource source, AudioFileReader *reader); ~ReadOnlyWaveFileModel(); bool isOK() const; bool isReady(int *) const; const ZoomConstraint *getZoomConstraint() const { return &m_zoomConstraint; } sv_frame_t getFrameCount() const; int getChannelCount() const; sv_samplerate_t getSampleRate() const; sv_samplerate_t getNativeRate() const; QString getTitle() const; QString getMaker() const; QString getLocation() const; QString getLocalFilename() const; float getValueMinimum() const { return -1.0f; } float getValueMaximum() const { return 1.0f; } virtual sv_frame_t getStartFrame() const { return m_startFrame; } virtual sv_frame_t getEndFrame() const { return m_startFrame + getFrameCount(); } void setStartFrame(sv_frame_t startFrame) { m_startFrame = startFrame; } virtual floatvec_t getData(int channel, sv_frame_t start, sv_frame_t count) const; virtual std::vector getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const; virtual int getSummaryBlockSize(int desired) const; virtual void getSummaries(int channel, sv_frame_t start, sv_frame_t count, RangeBlock &ranges, int &blockSize) const; virtual Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const; QString getTypeName() const { return tr("Wave File"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; protected slots: void fillTimerTimedOut(); void cacheFilled(); protected: void initialize(); class RangeCacheFillThread : public Thread { public: RangeCacheFillThread(ReadOnlyWaveFileModel &model) : m_model(model), m_fillExtent(0), m_frameCount(model.getFrameCount()) { } sv_frame_t getFillExtent() const { return m_fillExtent; } virtual void run(); protected: ReadOnlyWaveFileModel &m_model; sv_frame_t m_fillExtent; sv_frame_t m_frameCount; }; void fillCache(); FileSource m_source; QString m_path; AudioFileReader *m_reader; bool m_myReader; sv_frame_t m_startFrame; RangeBlock m_cache[2]; // interleaved at two base resolutions mutable QMutex m_mutex; RangeCacheFillThread *m_fillThread; QTimer *m_updateTimer; sv_frame_t m_lastFillExtent; bool m_exiting; static PowerOfSqrtTwoZoomConstraint m_zoomConstraint; mutable floatvec_t m_directRead; mutable sv_frame_t m_lastDirectReadStart; mutable sv_frame_t m_lastDirectReadCount; mutable QMutex m_directReadMutex; }; #endif sonic-visualiser-3.0.3/svcore/data/model/RegionModel.h0000644000000000000000000001431713111512442021031 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _REGION_MODEL_H_ #define _REGION_MODEL_H_ #include "IntervalModel.h" #include "base/RealTime.h" /** * RegionModel -- a concrete IntervalModel for intervals associated * with a value, which we call regions for no very compelling reason. */ /** * Region "point" type. A region is something that has an onset time, * a single value, and a duration. Like other points, it can also * have a label. * * This is called RegionRec instead of Region to avoid name collisions * with the X11 Region struct. Bah. */ struct RegionRec { public: RegionRec() : frame(0), value(0.f), duration(0) { } RegionRec(sv_frame_t _frame) : frame(_frame), value(0.0f), duration(0) { } RegionRec(sv_frame_t _frame, float _value, sv_frame_t _duration, QString _label) : frame(_frame), value(_value), duration(_duration), label(_label) { } int getDimensions() const { return 3; } sv_frame_t frame; float value; sv_frame_t duration; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(duration) .arg(XmlExportable::encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str(); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const RegionRec &p1, const RegionRec &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; if (p1.duration != p2.duration) return p1.duration < p2.duration; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const RegionRec &p1, const RegionRec &p2) const { return p1.frame < p2.frame; } }; }; class RegionModel : public IntervalModel { Q_OBJECT public: RegionModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, notifyOnAdd), m_valueQuantization(0), m_haveDistinctValues(false) { } RegionModel(sv_samplerate_t sampleRate, int resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd), m_valueQuantization(0), m_haveDistinctValues(false) { } virtual ~RegionModel() { } float getValueQuantization() const { return m_valueQuantization; } void setValueQuantization(float q) { m_valueQuantization = q; } bool haveDistinctValues() const { return m_haveDistinctValues; } QString getTypeName() const { return tr("Region"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { std::cerr << "RegionModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; IntervalModel::toXml (out, indent, QString("%1 subtype=\"region\" valueQuantization=\"%2\"") .arg(extraAttributes).arg(m_valueQuantization)); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 5; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Value"); case 3: return tr("Duration"); case 4: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 4) { return IntervalModel::getData(row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 4: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 4) { return IntervalModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 4: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual SortType getSortType(int column) const { if (column == 4) return SortAlphabetical; return SortNumeric; } virtual void addPoint(const Point &point) { if (point.value != 0.f) m_haveDistinctValues = true; IntervalModel::addPoint(point); } protected: float m_valueQuantization; bool m_haveDistinctValues; }; #endif sonic-visualiser-3.0.3/svcore/data/model/SparseModel.h0000644000000000000000000006715313111512442021051 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_MODEL_H_ #define _SPARSE_MODEL_H_ #include "Model.h" #include "TabularModel.h" #include "base/Command.h" #include "base/RealTime.h" #include "system/System.h" #include #include #include #include #include #include #include #include /** * Model containing sparse data (points with some properties). The * properties depend on the point type. */ template class SparseModel : public Model, public TabularModel { public: SparseModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true); virtual ~SparseModel() { } virtual bool isOK() const { return true; } virtual sv_frame_t getStartFrame() const; virtual sv_frame_t getEndFrame() const; virtual sv_samplerate_t getSampleRate() const { return m_sampleRate; } // Number of frames of the underlying sample rate that this model // is capable of resolving to. For example, if m_resolution == 10 // then every point in this model will be at a multiple of 10 // sample frames and should be considered to cover a window ending // 10 sample frames later. virtual int getResolution() const { return m_resolution ? m_resolution : 1; } virtual void setResolution(int resolution); // Extend the end of the model. If this is set to something beyond // the end of the final point in the model, then getEndFrame() // will return this value. Otherwise getEndFrame() will return the // end of the final point. virtual void extendEndFrame(sv_frame_t to) { m_extendTo = to; } typedef PointType Point; typedef std::multiset PointList; typedef typename PointList::iterator PointListIterator; typedef typename PointList::const_iterator PointListConstIterator; /** * Return whether the model is empty or not. */ virtual bool isEmpty() const; /** * Get the total number of points in the model. */ virtual int getPointCount() const; /** * Get all points. */ virtual const PointList &getPoints() const; /** * Get all of the points in this model between the given * boundaries (in frames), as well as up to two points before and * after the boundaries. If you need exact boundaries, check the * point coordinates in the returned list. */ virtual PointList getPoints(sv_frame_t start, sv_frame_t end) const; /** * Get all points that cover the given frame number, taking the * resolution of the model into account. */ virtual PointList getPoints(sv_frame_t frame) const; /** * Return all points that share the nearest frame number prior to * the given one at which there are any points. */ virtual PointList getPreviousPoints(sv_frame_t frame) const; /** * Return all points that share the nearest frame number * subsequent to the given one at which there are any points. */ virtual PointList getNextPoints(sv_frame_t frame) const; /** * Remove all points. */ virtual void clear(); /** * Add a point. */ virtual void addPoint(const PointType &point); /** * Remove a point. Points are not necessarily unique, so this * function will remove the first point that compares equal to the * supplied one using Point::Comparator. Other identical points * may remain in the model. */ virtual void deletePoint(const PointType &point); /** * Return true if the given point is found in this model, false * otherwise. */ virtual bool containsPoint(const PointType &point); virtual bool isReady(int *completion = 0) const { bool ready = isOK() && (m_completion == 100); if (completion) *completion = m_completion; return ready; } virtual void setCompletion(int completion, bool update = true); virtual int getCompletion() const { return m_completion; } virtual bool hasTextLabels() const { return m_hasTextLabels; } QString getTypeName() const { return tr("Sparse"); } virtual QString getXmlOutputType() const { return "sparse"; } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; virtual QString toDelimitedDataString(QString delimiter) const { return toDelimitedDataStringWithOptions (delimiter, DataExportDefaults); } virtual QString toDelimitedDataStringWithOptions(QString delimiter, DataExportOptions opts) const { return toDelimitedDataStringSubsetWithOptions (delimiter, opts, std::min(getStartFrame(), sv_frame_t(0)), getEndFrame() + 1); } virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const { return toDelimitedDataStringSubsetWithOptions (delimiter, DataExportDefaults, f0, f1); } virtual QString toDelimitedDataStringSubsetWithOptions(QString delimiter, DataExportOptions opts, sv_frame_t f0, sv_frame_t f1) const { if (opts & DataExportFillGaps) { return toDelimitedDataStringSubsetFilled(delimiter, opts, f0, f1); } else { QString s; for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { if (i->frame >= f0 && i->frame < f1) { s += i->toDelimitedDataString(delimiter, opts, m_sampleRate) + "\n"; } } return s; } } /** * Command to add a point, with undo. */ class AddPointCommand : public Command { public: AddPointCommand(SparseModel *model, const PointType &point, QString name = "") : m_model(model), m_point(point), m_name(name) { } virtual QString getName() const { return (m_name == "" ? tr("Add Point") : m_name); } virtual void execute() { m_model->addPoint(m_point); } virtual void unexecute() { m_model->deletePoint(m_point); } const PointType &getPoint() const { return m_point; } private: SparseModel *m_model; PointType m_point; QString m_name; }; /** * Command to remove a point, with undo. */ class DeletePointCommand : public Command { public: DeletePointCommand(SparseModel *model, const PointType &point) : m_model(model), m_point(point) { } virtual QString getName() const { return tr("Delete Point"); } virtual void execute() { m_model->deletePoint(m_point); } virtual void unexecute() { m_model->addPoint(m_point); } const PointType &getPoint() const { return m_point; } private: SparseModel *m_model; PointType m_point; }; /** * Command to add or remove a series of points, with undo. * Consecutive add/remove pairs for the same point are collapsed. */ class EditCommand : public MacroCommand { public: EditCommand(SparseModel *model, QString commandName); virtual void addPoint(const PointType &point); virtual void deletePoint(const PointType &point); /** * Stack an arbitrary other command in the same sequence. */ virtual void addCommand(Command *command) { addCommand(command, true); } /** * If any points have been added or deleted, return this * command (so the caller can add it to the command history). * Otherwise delete the command and return NULL. */ virtual EditCommand *finish(); protected: virtual void addCommand(Command *command, bool executeFirst); SparseModel *m_model; }; /** * Command to relabel a point. */ class RelabelCommand : public Command { public: RelabelCommand(SparseModel *model, const PointType &point, QString newLabel) : m_model(model), m_oldPoint(point), m_newPoint(point) { m_newPoint.label = newLabel; } virtual QString getName() const { return tr("Re-Label Point"); } virtual void execute() { m_model->deletePoint(m_oldPoint); m_model->addPoint(m_newPoint); std::swap(m_oldPoint, m_newPoint); } virtual void unexecute() { execute(); } private: SparseModel *m_model; PointType m_oldPoint; PointType m_newPoint; }; /** * TabularModel methods. */ virtual int getRowCount() const { return int(m_points.size()); } virtual sv_frame_t getFrameForRow(int row) const { PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; return i->frame; } virtual int getRowForFrame(sv_frame_t frame) const { if (m_rows.empty()) rebuildRowVector(); std::vector::iterator i = std::lower_bound(m_rows.begin(), m_rows.end(), frame); ssize_t row = std::distance(m_rows.begin(), i); if (i != m_rows.begin() && (i == m_rows.end() || *i != frame)) { --row; } return int(row); } virtual int getColumnCount() const { return 1; } virtual QVariant getData(int row, int column, int role) const { PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) { // cerr << "no iterator for row " << row << " (have " << getRowCount() << " rows)" << endl; return QVariant(); } // cerr << "returning data for row " << row << " col " << column << endl; switch (column) { case 0: { if (role == SortRole) return int(i->frame); RealTime rt = RealTime::frame2RealTime(i->frame, getSampleRate()); if (role == Qt::EditRole) return rt.toString().c_str(); else return rt.toText().c_str(); } case 1: return int(i->frame); } return QVariant(); } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 0: point.frame = lrint(value.toDouble() * getSampleRate()); break; case 1: point.frame = value.toInt(); break; } command->addPoint(point); return command->finish(); } virtual Command *getInsertRowCommand(int row) { EditCommand *command = new EditCommand(this, tr("Insert Data Point")); Point point(0); PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end() && i != m_points.begin()) --i; if (i != m_points.end()) point = *i; command->addPoint(point); return command->finish(); } virtual Command *getRemoveRowCommand(int row) { PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Delete Data Point")); command->deletePoint(*i); return command->finish(); } protected: sv_samplerate_t m_sampleRate; int m_resolution; sv_frame_t m_extendTo; bool m_notifyOnAdd; sv_frame_t m_sinceLastNotifyMin; sv_frame_t m_sinceLastNotifyMax; bool m_hasTextLabels; PointList m_points; int m_pointCount; mutable QMutex m_mutex; int m_completion; void getPointIterators(sv_frame_t frame, PointListIterator &startItr, PointListIterator &endItr); void getPointIterators(sv_frame_t frame, PointListConstIterator &startItr, PointListConstIterator &endItr) const; // This is only used if the model is called on to act in // TabularModel mode mutable std::vector m_rows; // map from row number to frame void rebuildRowVector() const { m_rows.clear(); for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { // std::cerr << "rebuildRowVector: row " << m_rows.size() << " -> " << i->frame << std::endl; m_rows.push_back(i->frame); } } PointListIterator getPointListIteratorForRow(int row) { if (m_rows.empty()) rebuildRowVector(); if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); sv_frame_t frame = m_rows[row]; int indexAtFrame = 0; int ri = row; while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } int initialIndexAtFrame = indexAtFrame; PointListIterator i0, i1; getPointIterators(frame, i0, i1); PointListIterator i = i0; for (i = i0; i != i1; ++i) { if (i->frame < (int)frame) { continue; } if (indexAtFrame > 0) { --indexAtFrame; continue; } return i; } if (indexAtFrame > 0) { std::cerr << "WARNING: SparseModel::getPointListIteratorForRow: No iterator available for row " << row << " (frame = " << frame << ", index at frame = " << initialIndexAtFrame << ", leftover index " << indexAtFrame << ")" << std::endl; } return i; } PointListConstIterator getPointListIteratorForRow(int row) const { if (m_rows.empty()) rebuildRowVector(); if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); sv_frame_t frame = m_rows[row]; int indexAtFrame = 0; int ri = row; while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } int initialIndexAtFrame = indexAtFrame; // std::cerr << "getPointListIteratorForRow " << row << ": initialIndexAtFrame = " << initialIndexAtFrame << " for frame " << frame << std::endl; PointListConstIterator i0, i1; getPointIterators(frame, i0, i1); PointListConstIterator i = i0; for (i = i0; i != i1; ++i) { // std::cerr << "i->frame is " << i->frame << ", wanting " << frame << std::endl; if (i->frame < (int)frame) { continue; } if (indexAtFrame > 0) { --indexAtFrame; continue; } return i; } /* if (i == m_points.end()) { std::cerr << "returning i at end" << std::endl; } else { std::cerr << "returning i with i->frame = " << i->frame << std::endl; } */ if (indexAtFrame > 0) { std::cerr << "WARNING: SparseModel::getPointListIteratorForRow: No iterator available for row " << row << " (frame = " << frame << ", index at frame = " << initialIndexAtFrame << ", leftover index " << indexAtFrame << ")" << std::endl; } return i; } QString toDelimitedDataStringSubsetFilled(QString delimiter, DataExportOptions opts, sv_frame_t f0, sv_frame_t f1) const { QString s; opts &= ~DataExportFillGaps; // find frame time of first point in range (if any) sv_frame_t first = f0; for (auto &p: m_points) { if (p.frame >= f0) { first = p.frame; break; } } // project back to first frame time in range according to // resolution. e.g. if f0 = 2, first = 9, resolution = 4 then // we start at 5 (because 1 is too early and we need to arrive // at 9 to match the first actual point). This method is // stupid but easy to understand: sv_frame_t f = first; while (f >= f0 + m_resolution) f -= m_resolution; // now progress, either writing the next point (if within // distance) or a default point PointListConstIterator itr = m_points.begin(); while (f < f1) { if (itr != m_points.end() && itr->frame <= f) { s += itr->toDelimitedDataString(delimiter, opts, m_sampleRate); ++itr; } else { s += Point(f).toDelimitedDataString(delimiter, opts, m_sampleRate); } s += "\n"; f += m_resolution; } return s; } }; template SparseModel::SparseModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd) : m_sampleRate(sampleRate), m_resolution(resolution), m_extendTo(0), m_notifyOnAdd(notifyOnAdd), m_sinceLastNotifyMin(-1), m_sinceLastNotifyMax(-1), m_hasTextLabels(false), m_pointCount(0), m_completion(100) { } template sv_frame_t SparseModel::getStartFrame() const { QMutexLocker locker(&m_mutex); sv_frame_t f = 0; if (!m_points.empty()) { f = m_points.begin()->frame; } return f; } template sv_frame_t SparseModel::getEndFrame() const { QMutexLocker locker(&m_mutex); sv_frame_t f = 0; if (!m_points.empty()) { PointListConstIterator i(m_points.end()); f = (--i)->frame; } if (m_extendTo > f) return m_extendTo; else return f; } template bool SparseModel::isEmpty() const { return m_pointCount == 0; } template int SparseModel::getPointCount() const { return m_pointCount; } template const typename SparseModel::PointList & SparseModel::getPoints() const { return m_points; } template typename SparseModel::PointList SparseModel::getPoints(sv_frame_t start, sv_frame_t end) const { if (start > end) return PointList(); QMutexLocker locker(&m_mutex); PointType startPoint(start), endPoint(end); PointListConstIterator startItr = m_points.lower_bound(startPoint); PointListConstIterator endItr = m_points.upper_bound(endPoint); if (startItr != m_points.begin()) --startItr; if (startItr != m_points.begin()) --startItr; if (endItr != m_points.end()) ++endItr; if (endItr != m_points.end()) ++endItr; PointList rv; for (PointListConstIterator i = startItr; i != endItr; ++i) { rv.insert(*i); } return rv; } template typename SparseModel::PointList SparseModel::getPoints(sv_frame_t frame) const { PointListConstIterator startItr, endItr; getPointIterators(frame, startItr, endItr); PointList rv; for (PointListConstIterator i = startItr; i != endItr; ++i) { rv.insert(*i); } return rv; } template void SparseModel::getPointIterators(sv_frame_t frame, PointListIterator &startItr, PointListIterator &endItr) { QMutexLocker locker(&m_mutex); if (m_resolution == 0) { startItr = m_points.end(); endItr = m_points.end(); return; } sv_frame_t start = (frame / m_resolution) * m_resolution; sv_frame_t end = start + m_resolution; PointType startPoint(start), endPoint(end); startItr = m_points.lower_bound(startPoint); endItr = m_points.upper_bound(endPoint); } template void SparseModel::getPointIterators(sv_frame_t frame, PointListConstIterator &startItr, PointListConstIterator &endItr) const { QMutexLocker locker(&m_mutex); if (m_resolution == 0) { // std::cerr << "getPointIterators: resolution == 0, returning end()" << std::endl; startItr = m_points.end(); endItr = m_points.end(); return; } sv_frame_t start = (frame / m_resolution) * m_resolution; sv_frame_t end = start + m_resolution; PointType startPoint(start), endPoint(end); // std::cerr << "getPointIterators: start frame " << start << ", end frame " << end << ", m_resolution " << m_resolution << std::endl; startItr = m_points.lower_bound(startPoint); endItr = m_points.upper_bound(endPoint); } template typename SparseModel::PointList SparseModel::getPreviousPoints(sv_frame_t originFrame) const { QMutexLocker locker(&m_mutex); PointType lookupPoint(originFrame); PointList rv; PointListConstIterator i = m_points.lower_bound(lookupPoint); if (i == m_points.begin()) return rv; --i; sv_frame_t frame = i->frame; while (i->frame == frame) { rv.insert(*i); if (i == m_points.begin()) break; --i; } return rv; } template typename SparseModel::PointList SparseModel::getNextPoints(sv_frame_t originFrame) const { QMutexLocker locker(&m_mutex); PointType lookupPoint(originFrame); PointList rv; PointListConstIterator i = m_points.upper_bound(lookupPoint); if (i == m_points.end()) return rv; sv_frame_t frame = i->frame; while (i != m_points.end() && i->frame == frame) { rv.insert(*i); ++i; } return rv; } template void SparseModel::setResolution(int resolution) { { QMutexLocker locker(&m_mutex); m_resolution = resolution; m_rows.clear(); } emit modelChanged(); } template void SparseModel::clear() { { QMutexLocker locker(&m_mutex); m_points.clear(); m_pointCount = 0; m_rows.clear(); } emit modelChanged(); } template void SparseModel::addPoint(const PointType &point) { QMutexLocker locker(&m_mutex); m_points.insert(point); m_pointCount++; if (point.getLabel() != "") m_hasTextLabels = true; // Even though this model is nominally sparse, there may still be // too many signals going on here (especially as they'll probably // be queued from one thread to another), which is why we need the // notifyOnAdd as an option rather than a necessity (the // alternative is to notify on setCompletion). if (m_notifyOnAdd) { m_rows.clear(); //!!! inefficient emit modelChangedWithin(point.frame, point.frame + m_resolution); } else { if (m_sinceLastNotifyMin == -1 || point.frame < m_sinceLastNotifyMin) { m_sinceLastNotifyMin = point.frame; } if (m_sinceLastNotifyMax == -1 || point.frame > m_sinceLastNotifyMax) { m_sinceLastNotifyMax = point.frame; } } } template bool SparseModel::containsPoint(const PointType &point) { QMutexLocker locker(&m_mutex); PointListIterator i = m_points.lower_bound(point); typename PointType::Comparator comparator; while (i != m_points.end()) { if (i->frame > point.frame) break; if (!comparator(*i, point) && !comparator(point, *i)) { return true; } ++i; } return false; } template void SparseModel::deletePoint(const PointType &point) { QMutexLocker locker(&m_mutex); PointListIterator i = m_points.lower_bound(point); typename PointType::Comparator comparator; while (i != m_points.end()) { if (i->frame > point.frame) break; if (!comparator(*i, point) && !comparator(point, *i)) { m_points.erase(i); m_pointCount--; break; } ++i; } // std::cout << "SparseOneDimensionalModel: emit modelChanged(" // << point.frame << ")" << std::endl; m_rows.clear(); //!!! inefficient emit modelChangedWithin(point.frame, point.frame + m_resolution); } template void SparseModel::setCompletion(int completion, bool update) { // std::cerr << "SparseModel::setCompletion(" << completion << ")" << std::endl; QMutexLocker locker(&m_mutex); if (m_completion != completion) { m_completion = completion; if (completion == 100) { if (!m_notifyOnAdd) { emit completionChanged(); } m_notifyOnAdd = true; // henceforth m_rows.clear(); //!!! inefficient emit modelChanged(); } else if (!m_notifyOnAdd) { if (update && m_sinceLastNotifyMin >= 0 && m_sinceLastNotifyMax >= 0) { m_rows.clear(); //!!! inefficient emit modelChangedWithin(m_sinceLastNotifyMin, m_sinceLastNotifyMax); m_sinceLastNotifyMin = m_sinceLastNotifyMax = -1; } else { emit completionChanged(); } } else { emit completionChanged(); } } } template void SparseModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { // std::cerr << "SparseModel::toXml: extraAttributes = \"" // << extraAttributes.toStdString() << std::endl; QString type = getXmlOutputType(); Model::toXml (out, indent, QString("type=\"%1\" dimensions=\"%2\" resolution=\"%3\" notifyOnAdd=\"%4\" dataset=\"%5\" %6") .arg(type) .arg(PointType(0).getDimensions()) .arg(m_resolution) .arg(m_notifyOnAdd ? "true" : "false") .arg(getObjectExportId(&m_points)) .arg(extraAttributes)); out << indent; out << QString("\n") .arg(getObjectExportId(&m_points)) .arg(PointType(0).getDimensions()); for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { i->toXml(out, indent + " "); } out << indent; out << "\n"; } template SparseModel::EditCommand::EditCommand(SparseModel *model, QString commandName) : MacroCommand(commandName), m_model(model) { } template void SparseModel::EditCommand::addPoint(const PointType &point) { addCommand(new AddPointCommand(m_model, point), true); } template void SparseModel::EditCommand::deletePoint(const PointType &point) { addCommand(new DeletePointCommand(m_model, point), true); } template typename SparseModel::EditCommand * SparseModel::EditCommand::finish() { if (!m_commands.empty()) { return this; } else { delete this; return 0; } } template void SparseModel::EditCommand::addCommand(Command *command, bool executeFirst) { if (executeFirst) command->execute(); if (!m_commands.empty()) { DeletePointCommand *dpc = dynamic_cast(command); if (dpc) { AddPointCommand *apc = dynamic_cast (m_commands[m_commands.size() - 1]); typename PointType::Comparator comparator; if (apc) { if (!comparator(apc->getPoint(), dpc->getPoint()) && !comparator(dpc->getPoint(), apc->getPoint())) { deleteCommand(apc); return; } } } } MacroCommand::addCommand(command); } #endif sonic-visualiser-3.0.3/svcore/data/model/SparseOneDimensionalModel.h0000644000000000000000000001301413111512442023661 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_ONE_DIMENSIONAL_MODEL_H_ #define _SPARSE_ONE_DIMENSIONAL_MODEL_H_ #include "SparseModel.h" #include "NoteData.h" #include "base/PlayParameterRepository.h" #include "base/RealTime.h" #include struct OneDimensionalPoint { public: OneDimensionalPoint(sv_frame_t _frame) : frame(_frame) { } OneDimensionalPoint(sv_frame_t _frame, QString _label) : frame(_frame), label(_label) { } int getDimensions() const { return 1; } sv_frame_t frame; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(XmlExportable::encodeEntities(label)) .arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const OneDimensionalPoint &p1, const OneDimensionalPoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const OneDimensionalPoint &p1, const OneDimensionalPoint &p2) const { return p1.frame < p2.frame; } }; }; class SparseOneDimensionalModel : public SparseModel, public NoteExportable { Q_OBJECT public: SparseOneDimensionalModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd) { PlayParameterRepository::getInstance()->addPlayable(this); } virtual ~SparseOneDimensionalModel() { PlayParameterRepository::getInstance()->removePlayable(this); } virtual bool canPlay() const { return true; } virtual QString getDefaultPlayClipId() const { return "tap"; } int getIndexOf(const Point &point) { // slow int i = 0; Point::Comparator comparator; for (PointList::const_iterator j = m_points.begin(); j != m_points.end(); ++j, ++i) { if (!comparator(*j, point) && !comparator(point, *j)) return i; } return -1; } QString getTypeName() const { return tr("Sparse 1-D"); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 3; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column == 2) return SortAlphabetical; return SortNumeric; } /** * NoteExportable methods. */ NoteList getNotes() const { return getNotesWithin(getStartFrame(), getEndFrame()); } NoteList getNotesWithin(sv_frame_t startFrame, sv_frame_t endFrame) const { PointList points = getPoints(startFrame, endFrame); NoteList notes; for (PointList::iterator pli = points.begin(); pli != points.end(); ++pli) { notes.push_back (NoteData(pli->frame, sv_frame_t(getSampleRate() / 6), // arbitrary short duration 64, // default pitch 100)); // default velocity } return notes; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/SparseTimeValueModel.h0000644000000000000000000001307613111512442022660 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_TIME_VALUE_MODEL_H_ #define _SPARSE_TIME_VALUE_MODEL_H_ #include "SparseValueModel.h" #include "base/PlayParameterRepository.h" #include "base/RealTime.h" /** * Time/value point type for use in a SparseModel or SparseValueModel. * With this point type, the model basically represents a wiggly-line * plot with points at arbitrary intervals of the model resolution. */ struct TimeValuePoint { public: TimeValuePoint(sv_frame_t _frame) : frame(_frame), value(0.0f) { } TimeValuePoint(sv_frame_t _frame, float _value, QString _label) : frame(_frame), value(_value), label(_label) { } int getDimensions() const { return 2; } sv_frame_t frame; float value; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(XmlExportable::encodeEntities(label)) .arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const TimeValuePoint &p1, const TimeValuePoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const TimeValuePoint &p1, const TimeValuePoint &p2) const { return p1.frame < p2.frame; } }; }; class SparseTimeValueModel : public SparseValueModel { Q_OBJECT public: SparseTimeValueModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, notifyOnAdd) { // Model is playable, but may not sound (if units not Hz or // range unsuitable) PlayParameterRepository::getInstance()->addPlayable(this); } SparseTimeValueModel(sv_samplerate_t sampleRate, int resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd) { // Model is playable, but may not sound (if units not Hz or // range unsuitable) PlayParameterRepository::getInstance()->addPlayable(this); } virtual ~SparseTimeValueModel() { PlayParameterRepository::getInstance()->removePlayable(this); } QString getTypeName() const { return tr("Sparse Time-Value"); } virtual bool canPlay() const { return true; } virtual bool getDefaultPlayAudible() const { return false; } // user must unmute /** * TabularModel methods. */ virtual int getColumnCount() const { return 4; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Value"); case 3: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseValueModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: if (role == Qt::EditRole || role == SortRole) return i->value; else return QString("%1 %2").arg(i->value).arg(getScaleUnits()); case 3: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseValueModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.value = float(value.toDouble()); break; case 3: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column == 3) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/SparseValueModel.h0000644000000000000000000001060513111512442022034 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_VALUE_MODEL_H_ #define _SPARSE_VALUE_MODEL_H_ #include "SparseModel.h" #include "base/UnitDatabase.h" #include "system/System.h" /** * Model containing sparse data (points with some properties) of which * one of the properties is an arbitrary float value. The other * properties depend on the point type. */ template class SparseValueModel : public SparseModel { public: SparseValueModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd), m_valueMinimum(0.f), m_valueMaximum(0.f), m_haveExtents(false) { } SparseValueModel(sv_samplerate_t sampleRate, int resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd), m_valueMinimum(valueMinimum), m_valueMaximum(valueMaximum), m_haveExtents(true) { } using SparseModel::m_points; using SparseModel::modelChanged; using SparseModel::getPoints; using SparseModel::tr; QString getTypeName() const { return tr("Sparse Value"); } virtual float getValueMinimum() const { return m_valueMinimum; } virtual float getValueMaximum() const { return m_valueMaximum; } virtual QString getScaleUnits() const { return m_units; } virtual void setScaleUnits(QString units) { m_units = units; UnitDatabase::getInstance()->registerUnit(units); } virtual void addPoint(const PointType &point) { bool allChange = false; if (!ISNAN(point.value) && !ISINF(point.value)) { if (!m_haveExtents || point.value < m_valueMinimum) { m_valueMinimum = point.value; allChange = true; // std::cerr << "addPoint: value min = " << m_valueMinimum << std::endl; } if (!m_haveExtents || point.value > m_valueMaximum) { m_valueMaximum = point.value; allChange = true; // std::cerr << "addPoint: value max = " << m_valueMaximum << " (min = " << m_valueMinimum << ")" << std::endl; } m_haveExtents = true; } SparseModel::addPoint(point); if (allChange) emit modelChanged(); } virtual void deletePoint(const PointType &point) { SparseModel::deletePoint(point); if (point.value == m_valueMinimum || point.value == m_valueMaximum) { float formerMin = m_valueMinimum, formerMax = m_valueMaximum; for (typename SparseModel::PointList::const_iterator i = m_points.begin(); i != m_points.end(); ++i) { if (i == m_points.begin() || i->value < m_valueMinimum) { m_valueMinimum = i->value; // std::cerr << "deletePoint: value min = " << m_valueMinimum << std::endl; } if (i == m_points.begin() || i->value > m_valueMaximum) { m_valueMaximum = i->value; // std::cerr << "deletePoint: value max = " << m_valueMaximum << std::endl; } } if (formerMin != m_valueMinimum || formerMax != m_valueMaximum) { emit modelChanged(); } } } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { std::cerr << "SparseValueModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; SparseModel::toXml (stream, indent, QString("%1 minimum=\"%2\" maximum=\"%3\" units=\"%4\"") .arg(extraAttributes).arg(m_valueMinimum).arg(m_valueMaximum) .arg(this->encodeEntities(m_units))); } protected: float m_valueMinimum; float m_valueMaximum; bool m_haveExtents; QString m_units; }; #endif sonic-visualiser-3.0.3/svcore/data/model/TabularModel.h0000644000000000000000000000367513111512442021205 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TABULAR_MODEL_H_ #define _TABULAR_MODEL_H_ #include #include class Command; /** * TabularModel is an abstract base class for models that support * direct access to data in a tabular form. A model that implements * TabularModel may be displayed and, perhaps, edited in a data * spreadsheet window. * * This is very like a cut-down QAbstractItemModel. It assumes a * relationship between row number and frame time. */ class TabularModel { public: virtual ~TabularModel() { } virtual int getRowCount() const = 0; virtual int getColumnCount() const = 0; virtual QString getHeading(int column) const = 0; enum { SortRole = Qt::UserRole }; enum SortType { SortNumeric, SortAlphabetical }; virtual QVariant getData(int row, int column, int role) const = 0; virtual bool isColumnTimeValue(int col) const = 0; virtual SortType getSortType(int col) const = 0; virtual sv_frame_t getFrameForRow(int row) const = 0; virtual int getRowForFrame(sv_frame_t frame) const = 0; virtual bool isEditable() const { return false; } virtual Command *getSetDataCommand(int /* row */, int /* column */, const QVariant &, int /* role */) { return 0; } virtual Command *getInsertRowCommand(int /* beforeRow */) { return 0; } virtual Command *getRemoveRowCommand(int /* row */) { return 0; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/TextModel.h0000644000000000000000000001154713111512442020534 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_MODEL_H_ #define _TEXT_MODEL_H_ #include "SparseModel.h" #include "base/XmlExportable.h" #include "base/RealTime.h" #include /** * Text point type for use in a SparseModel. This represents a piece * of text at a given time and y-value in the [0,1) range (indicative * of height on the window). Intended for casual textual annotations. */ struct TextPoint : public XmlExportable { public: TextPoint(sv_frame_t _frame) : frame(_frame), height(0.0f) { } TextPoint(sv_frame_t _frame, float _height, QString _label) : frame(_frame), height(_height), label(_label) { } int getDimensions() const { return 2; } sv_frame_t frame; float height; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(height) .arg(encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, DataExportOptions, sv_samplerate_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(height); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const TextPoint &p1, const TextPoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.height != p2.height) return p1.height < p2.height; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const TextPoint &p1, const TextPoint &p2) const { return p1.frame < p2.frame; } }; }; // Make this a class rather than a typedef so it can be predeclared. class TextModel : public SparseModel { Q_OBJECT public: TextModel(sv_samplerate_t sampleRate, int resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd) { } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { SparseModel::toXml (out, indent, QString("%1 subtype=\"text\"") .arg(extraAttributes)); } QString getTypeName() const { return tr("Text"); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 4; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Height"); case 3: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: return i->height; case 3: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.height = float(value.toDouble()); break; case 3: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column == 3) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-3.0.3/svcore/data/model/WaveFileModel.cpp0000644000000000000000000000124613111512442021640 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "WaveFileModel.h" WaveFileModel::~WaveFileModel() { } sonic-visualiser-3.0.3/svcore/data/model/WaveFileModel.h0000644000000000000000000000262513111512442021307 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef WAVE_FILE_MODEL_H #define WAVE_FILE_MODEL_H #include "RangeSummarisableTimeValueModel.h" #include class WaveFileModel : public RangeSummarisableTimeValueModel { Q_OBJECT public: virtual ~WaveFileModel(); virtual sv_frame_t getFrameCount() const = 0; virtual int getChannelCount() const = 0; virtual sv_samplerate_t getSampleRate() const = 0; virtual sv_samplerate_t getNativeRate() const = 0; virtual QString getTitle() const = 0; virtual QString getMaker() const = 0; virtual QString getLocation() const = 0; virtual sv_frame_t getStartFrame() const = 0; virtual sv_frame_t getEndFrame() const = 0; virtual void setStartFrame(sv_frame_t startFrame) = 0; protected: WaveFileModel() { } // only accessible from subclasses }; #endif sonic-visualiser-3.0.3/svcore/data/model/WritableWaveFileModel.cpp0000644000000000000000000001532213111512442023332 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "WritableWaveFileModel.h" #include "ReadOnlyWaveFileModel.h" #include "base/TempDirectory.h" #include "base/Exceptions.h" #include "fileio/WavFileWriter.h" #include "fileio/WavFileReader.h" #include #include #include #include #include using namespace std; const int WritableWaveFileModel::PROPORTION_UNKNOWN = -1; //#define DEBUG_WRITABLE_WAVE_FILE_MODEL 1 WritableWaveFileModel::WritableWaveFileModel(sv_samplerate_t sampleRate, int channels, QString path) : m_model(0), m_writer(0), m_reader(0), m_sampleRate(sampleRate), m_channels(channels), m_frameCount(0), m_startFrame(0), m_proportion(PROPORTION_UNKNOWN) { if (path.isEmpty()) { try { QDir dir(TempDirectory::getInstance()->getPath()); path = dir.filePath(QString("written_%1.wav") .arg((intptr_t)this)); } catch (DirectoryCreationFailed f) { cerr << "WritableWaveFileModel: Failed to create temporary directory" << endl; return; } } // Write directly to the target file, so that we can do // incremental writes and concurrent reads m_writer = new WavFileWriter(path, sampleRate, channels, WavFileWriter::WriteToTarget); if (!m_writer->isOK()) { cerr << "WritableWaveFileModel: Error in creating WAV file writer: " << m_writer->getError() << endl; delete m_writer; m_writer = 0; return; } FileSource source(m_writer->getPath()); m_reader = new WavFileReader(source, true); if (!m_reader->getError().isEmpty()) { cerr << "WritableWaveFileModel: Error in creating wave file reader" << endl; delete m_reader; m_reader = 0; return; } m_model = new ReadOnlyWaveFileModel(source, m_reader); if (!m_model->isOK()) { cerr << "WritableWaveFileModel: Error in creating wave file model" << endl; delete m_model; m_model = 0; delete m_reader; m_reader = 0; return; } m_model->setStartFrame(m_startFrame); connect(m_model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); connect(m_model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t))); } WritableWaveFileModel::~WritableWaveFileModel() { delete m_model; delete m_writer; delete m_reader; } void WritableWaveFileModel::setStartFrame(sv_frame_t startFrame) { m_startFrame = startFrame; if (m_model) m_model->setStartFrame(startFrame); } bool WritableWaveFileModel::addSamples(const float *const *samples, sv_frame_t count) { if (!m_writer) return false; #ifdef DEBUG_WRITABLE_WAVE_FILE_MODEL // SVDEBUG << "WritableWaveFileModel::addSamples(" << count << ")" << endl; #endif if (!m_writer->writeSamples(samples, count)) { SVCERR << "ERROR: WritableWaveFileModel::addSamples: writer failed: " << m_writer->getError() << endl; return false; } m_frameCount += count; if (m_reader && m_reader->getChannelCount() == 0) { m_reader->updateFrameCount(); } return true; } void WritableWaveFileModel::updateModel() { if (m_reader) { m_reader->updateFrameCount(); } } bool WritableWaveFileModel::isOK() const { bool ok = (m_writer && m_writer->isOK()); // SVDEBUG << "WritableWaveFileModel::isOK(): ok = " << ok << endl; return ok; } bool WritableWaveFileModel::isReady(int *completion) const { int c = getCompletion(); if (completion) *completion = c; if (!isOK()) return false; return (c == 100); } void WritableWaveFileModel::setWriteProportion(int proportion) { m_proportion = proportion; } int WritableWaveFileModel::getWriteProportion() const { return m_proportion; } void WritableWaveFileModel::writeComplete() { m_writer->close(); if (m_reader) m_reader->updateDone(); m_proportion = 100; emit modelChanged(); } sv_frame_t WritableWaveFileModel::getFrameCount() const { // SVDEBUG << "WritableWaveFileModel::getFrameCount: count = " << m_frameCount << endl; return m_frameCount; } floatvec_t WritableWaveFileModel::getData(int channel, sv_frame_t start, sv_frame_t count) const { if (!m_model || m_model->getChannelCount() == 0) return {}; return m_model->getData(channel, start, count); } vector WritableWaveFileModel::getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const { if (!m_model || m_model->getChannelCount() == 0) return {}; return m_model->getMultiChannelData(fromchannel, tochannel, start, count); } int WritableWaveFileModel::getSummaryBlockSize(int desired) const { if (!m_model) return desired; return m_model->getSummaryBlockSize(desired); } void WritableWaveFileModel::getSummaries(int channel, sv_frame_t start, sv_frame_t count, RangeBlock &ranges, int &blockSize) const { ranges.clear(); if (!m_model || m_model->getChannelCount() == 0) return; m_model->getSummaries(channel, start, count, ranges, blockSize); } WritableWaveFileModel::Range WritableWaveFileModel::getSummary(int channel, sv_frame_t start, sv_frame_t count) const { if (!m_model || m_model->getChannelCount() == 0) return Range(); return m_model->getSummary(channel, start, count); } void WritableWaveFileModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { // The assumption here is that the underlying wave file has // already been saved somewhere (its location is available through // getLocation()) and that the code that uses this class is // dealing with the problem of making sure it remains available. // We just write this out as if it were a normal wave file. Model::toXml (out, indent, QString("type=\"wavefile\" file=\"%1\" subtype=\"writable\" %2") .arg(encodeEntities(m_writer->getPath())) .arg(extraAttributes)); } sonic-visualiser-3.0.3/svcore/data/model/WritableWaveFileModel.h0000644000000000000000000001333713111512442023003 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef WRITABLE_WAVE_FILE_MODEL_H #define WRITABLE_WAVE_FILE_MODEL_H #include "WaveFileModel.h" #include "ReadOnlyWaveFileModel.h" #include "PowerOfSqrtTwoZoomConstraint.h" class WavFileWriter; class WavFileReader; class WritableWaveFileModel : public WaveFileModel { Q_OBJECT public: WritableWaveFileModel(sv_samplerate_t sampleRate, int channels, QString path = ""); ~WritableWaveFileModel(); /** * Call addSamples to append a block of samples to the end of the * file. * * This function only appends the samples to the file being * written; it does not update the model's view of the samples in * that file. That is, it updates the file on disc but the model * itself does not change its content. This is because re-reading * the file to update the model may be more expensive than adding * the samples in the first place. If you are writing small * numbers of samples repeatedly, you probably only want the model * to update periodically rather than after every write. * * Call updateModel() periodically to tell the model to update its * own view of the samples in the file being written. * * Call setWriteProportion() periodically if the file being * written has known duration and you want the model to be able to * report the write progress as a percentage. * * Call writeComplete() when the file has been completely written. */ virtual bool addSamples(const float *const *samples, sv_frame_t count); /** * Tell the model to update its own (read) view of the (written) * file. May cause modelChanged() and modelChangedWithin() to be * emitted. See the comment to addSamples above for rationale. */ void updateModel(); /** * Set the proportion of the file which has been written so far, * as a percentage. This may be used to indicate progress. * * Note that this differs from the "completion" percentage * reported through isReady()/getCompletion(). That percentage is * updated when "internal processing has advanced... but the model * has not changed externally", i.e. it reports progress in * calculating the initial state of a model. In contrast, an * update to setWriteProportion corresponds to a change in the * externally visible state of the model (i.e. it contains more * data than before). */ void setWriteProportion(int proportion); /** * Indicate that writing is complete. You should call this even if * you have never called setWriteProportion() or updateModel(). */ void writeComplete(); static const int PROPORTION_UNKNOWN; /** * Get the proportion of the file which has been written so far, * as a percentage. Return PROPORTION_UNKNOWN if unknown. */ int getWriteProportion() const; bool isOK() const; bool isReady(int *) const; /** * Return the generation completion percentage of this model. This * is always 100, because the model is always in a complete state * -- it just contains varying amounts of data depending on how * much has been written. */ virtual int getCompletion() const { return 100; } const ZoomConstraint *getZoomConstraint() const { static PowerOfSqrtTwoZoomConstraint zc; return &zc; } sv_frame_t getFrameCount() const; int getChannelCount() const { return m_channels; } sv_samplerate_t getSampleRate() const { return m_sampleRate; } sv_samplerate_t getNativeRate() const { return m_sampleRate; } QString getTitle() const { if (m_model) return m_model->getTitle(); else return ""; } QString getMaker() const { if (m_model) return m_model->getMaker(); else return ""; } QString getLocation() const { if (m_model) return m_model->getLocation(); else return ""; } float getValueMinimum() const { return -1.0f; } float getValueMaximum() const { return 1.0f; } virtual sv_frame_t getStartFrame() const { return m_startFrame; } virtual sv_frame_t getEndFrame() const { return m_startFrame + getFrameCount(); } void setStartFrame(sv_frame_t startFrame); virtual floatvec_t getData(int channel, sv_frame_t start, sv_frame_t count) const; virtual std::vector getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const; virtual int getSummaryBlockSize(int desired) const; virtual void getSummaries(int channel, sv_frame_t start, sv_frame_t count, RangeBlock &ranges, int &blockSize) const; virtual Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const; QString getTypeName() const { return tr("Writable Wave File"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; protected: ReadOnlyWaveFileModel *m_model; WavFileWriter *m_writer; WavFileReader *m_reader; sv_samplerate_t m_sampleRate; int m_channels; sv_frame_t m_frameCount; sv_frame_t m_startFrame; int m_proportion; }; #endif sonic-visualiser-3.0.3/svcore/data/model/test/Compares.h0000644000000000000000000000275113111512442021354 0ustar 00000000000000 #ifndef TEST_COMPARES_H #define TEST_COMPARES_H // These macros are used for comparing generated results, and they // aren't always going to be exact. Adding 0.1 to each value gives // us a little more fuzz in qFuzzyCompare (which ultimately does // the comparison). #define COMPARE_ZERO(a) \ QCOMPARE(a + 0.1, 0.1) #define COMPARE_ZERO_F(a) \ QCOMPARE(a + 0.1f, 0.1f) #define COMPARE_FUZZIER(a, b) \ QCOMPARE(a + 0.1, b + 0.1) #define COMPARE_FUZZIER_F(a, b) \ QCOMPARE(a + 0.1f, b + 0.1f) #define COMPARE_ALL_TO(a, n) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ COMPARE_FUZZIER(a[cmp_i], n); \ } #define COMPARE_ALL(a, b) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ COMPARE_FUZZIER(a[cmp_i], b[cmp_i]); \ } #define COMPARE_SCALED(a, b, s) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ COMPARE_FUZZIER(a[cmp_i] / s, b[cmp_i]); \ } #define COMPARE_ALL_TO_F(a, n) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ COMPARE_FUZZIER_F(a[cmp_i], n); \ } #define COMPARE_ALL_F(a, b) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ COMPARE_FUZZIER_F(a[cmp_i], b[cmp_i]); \ } #define COMPARE_SCALED_F(a, b, s) \ for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \ COMPARE_FUZZIER_F(a[cmp_i] / s, b[cmp_i]); \ } #endif sonic-visualiser-3.0.3/svcore/data/model/test/MockWaveModel.cpp0000644000000000000000000000426213111512442022632 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "MockWaveModel.h" #include using namespace std; MockWaveModel::MockWaveModel(vector sorts, int length, int pad) { for (auto sort: sorts) { m_data.push_back(generate(sort, length, pad)); } } floatvec_t MockWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const { sv_frame_t i = 0; // cerr << "MockWaveModel::getData(" << channel << "," << start << "," << count << "): "; floatvec_t data; while (i < count) { sv_frame_t idx = start + i; if (!in_range_for(m_data[channel], idx)) break; data.push_back(m_data[channel][idx]); // cerr << data[i] << " "; ++i; } // cerr << endl; return data; } vector MockWaveModel::getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const { vector data(tochannel - fromchannel + 1); for (int c = fromchannel; c <= tochannel; ++c) { data.push_back(getData(c, start, count)); } return data; } vector MockWaveModel::generate(Sort sort, int length, int pad) const { vector data; for (int i = 0; i < pad; ++i) { data.push_back(0.f); } for (int i = 0; i < length; ++i) { double v = 0.0; switch (sort) { case DC: v = 1.0; break; case Sine: v = sin((2.0 * M_PI / 8.0) * i); break; case Cosine: v = cos((2.0 * M_PI / 8.0) * i); break; case Nyquist: v = (i % 2) * 2 - 1; break; case Dirac: v = (i == 0) ? 1.0 : 0.0; break; } data.push_back(float(v)); } for (int i = 0; i < pad; ++i) { data.push_back(0.f); } return data; } sonic-visualiser-3.0.3/svcore/data/model/test/MockWaveModel.h0000644000000000000000000000375713111512442022307 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef MOCK_WAVE_MODEL_H #define MOCK_WAVE_MODEL_H #include "../DenseTimeValueModel.h" #include enum Sort { DC, Sine, Cosine, Nyquist, Dirac }; class MockWaveModel : public DenseTimeValueModel { Q_OBJECT public: /** One Sort per channel! Length is in samples, and is in addition * to "pad" number of zero samples at the start and end */ MockWaveModel(std::vector sorts, int length, int pad); virtual float getValueMinimum() const { return -1.f; } virtual float getValueMaximum() const { return 1.f; } virtual int getChannelCount() const { return int(m_data.size()); } virtual floatvec_t getData(int channel, sv_frame_t start, sv_frame_t count) const; virtual std::vector getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const; virtual bool canPlay() const { return true; } virtual QString getDefaultPlayClipId() const { return ""; } virtual sv_frame_t getStartFrame() const { return 0; } virtual sv_frame_t getEndFrame() const { return m_data[0].size(); } virtual sv_samplerate_t getSampleRate() const { return 44100; } virtual bool isOK() const { return true; } QString getTypeName() const { return tr("Mock Wave"); } private: std::vector > m_data; std::vector generate(Sort sort, int length, int pad) const; }; #endif sonic-visualiser-3.0.3/svcore/data/model/test/TestFFTModel.h0000644000000000000000000002436113111512442022044 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef TEST_FFT_MODEL_H #define TEST_FFT_MODEL_H #include "../FFTModel.h" #include "MockWaveModel.h" #include "Compares.h" #include #include #include #include #include using namespace std; class TestFFTModel : public QObject { Q_OBJECT private: void test(DenseTimeValueModel *model, WindowType window, int windowSize, int windowIncrement, int fftSize, int columnNo, vector>> expectedValues, int expectedWidth) { for (int ch = 0; in_range_for(expectedValues, ch); ++ch) { FFTModel fftm(model, ch, window, windowSize, windowIncrement, fftSize); QCOMPARE(fftm.getWidth(), expectedWidth); int hs1 = fftSize/2 + 1; QCOMPARE(fftm.getHeight(), hs1); vector reals(hs1 + 1, 0.f); vector imags(hs1 + 1, 0.f); reals[hs1] = 999.f; // overrun guards imags[hs1] = 999.f; for (int stepThrough = 0; stepThrough <= 1; ++stepThrough) { if (stepThrough) { // Read through the columns in order instead of // randomly accessing the one we want. This is to // exercise the case where the FFT model saves // part of each input frame and moves along by // only the non-overlapping distance for (int sc = 0; sc < columnNo; ++sc) { fftm.getValuesAt(sc, &reals[0], &imags[0]); } } fftm.getValuesAt(columnNo, &reals[0], &imags[0]); for (int i = 0; i < hs1; ++i) { float eRe = expectedValues[ch][i].real(); float eIm = expectedValues[ch][i].imag(); float thresh = 1e-5f; if (abs(reals[i] - eRe) > thresh || abs(imags[i] - eIm) > thresh) { cerr << "ERROR: output is not as expected for column " << i << " in channel " << ch << " (stepThrough = " << stepThrough << ")" << endl; cerr << "expected : "; for (int j = 0; j < hs1; ++j) { cerr << expectedValues[ch][j] << " "; } cerr << "\nactual : "; for (int j = 0; j < hs1; ++j) { cerr << complex(reals[j], imags[j]) << " "; } cerr << endl; } COMPARE_FUZZIER_F(reals[i], eRe); COMPARE_FUZZIER_F(imags[i], eIm); } QCOMPARE(reals[hs1], 999.f); QCOMPARE(imags[hs1], 999.f); } } } private slots: // NB. FFTModel columns are centred on the sample frame, and in // particular this means column 0 is centred at sample 0 (i.e. it // contains only half the window-size worth of real samples, the // others are 0-valued from before the origin). Generally in // these tests we are padding our signal with half a window of // zeros, in order that the result for column 0 is all zeros // (rather than something with a step in it that is harder to // reason about the FFT of) and the results for subsequent columns // are those of our expected signal. void dc_simple_rect() { MockWaveModel mwm({ DC }, 16, 4); test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { { 4.f, 0.f }, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { { 4.f, 0.f }, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 4); } void dc_simple_hann() { // The Hann window function is a simple sinusoid with period // equal to twice the window size, and it halves the DC energy MockWaveModel mwm({ DC }, 16, 4); test(&mwm, HanningWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, HanningWindow, 8, 8, 8, 1, { { { 4.f, 0.f }, { 2.f, 0.f }, {}, {}, {} } }, 4); test(&mwm, HanningWindow, 8, 8, 8, 2, { { { 4.f, 0.f }, { 2.f, 0.f }, {}, {}, {} } }, 4); test(&mwm, HanningWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 4); } void dc_simple_hann_halfoverlap() { MockWaveModel mwm({ DC }, 16, 4); test(&mwm, HanningWindow, 8, 4, 8, 0, { { {}, {}, {}, {}, {} } }, 7); test(&mwm, HanningWindow, 8, 4, 8, 2, { { { 4.f, 0.f }, { 2.f, 0.f }, {}, {}, {} } }, 7); test(&mwm, HanningWindow, 8, 4, 8, 3, { { { 4.f, 0.f }, { 2.f, 0.f }, {}, {}, {} } }, 7); test(&mwm, HanningWindow, 8, 4, 8, 6, { { {}, {}, {}, {}, {} } }, 7); } void sine_simple_rect() { MockWaveModel mwm({ Sine }, 16, 4); // Sine: output is purely imaginary. Note the sign is flipped // (normally the first half of the output would have negative // sign for a sine starting at 0) because the model does an // FFT shift to centre the phase test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { {}, { 0.f, 2.f }, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { {}, { 0.f, 2.f }, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 4); } void cosine_simple_rect() { MockWaveModel mwm({ Cosine }, 16, 4); // Cosine: output is purely real. Note the sign is flipped // because the model does an FFT shift to centre the phase test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { {}, { -2.f, 0.f }, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { {}, { -2.f, 0.f }, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 4); } void twochan_simple_rect() { MockWaveModel mwm({ Sine, Cosine }, 16, 4); // Test that the two channels are read and converted separately test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} }, { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { {}, { 0.f, 2.f }, {}, {}, {} }, { {}, { -2.f, 0.f }, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { {}, { 0.f, 2.f }, {}, {}, {} }, { {}, { -2.f, 0.f }, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} }, { {}, {}, {}, {}, {} } }, 4); } void nyquist_simple_rect() { MockWaveModel mwm({ Nyquist }, 16, 4); // Again, the sign is flipped. This has the same amount of // energy as the DC example test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { {}, {}, {}, {}, { -4.f, 0.f } } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { {}, {}, {}, {}, { -4.f, 0.f } } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 4); } void dirac_simple_rect() { MockWaveModel mwm({ Dirac }, 16, 4); // The window scales by 0.5 and some signs are flipped. Only // column 1 has any data (the single impulse). test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { { 0.5f, 0.f }, { -0.5f, 0.f }, { 0.5f, 0.f }, { -0.5f, 0.f }, { 0.5f, 0.f } } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { {}, {}, {}, {}, {} } }, 4); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 4); } void dirac_simple_rect_2() { MockWaveModel mwm({ Dirac }, 16, 8); // With 8 samples padding, the FFT shift places the first // Dirac impulse at the start of column 1, thus giving all // positive values test(&mwm, RectangularWindow, 8, 8, 8, 0, { { {}, {}, {}, {}, {} } }, 5); test(&mwm, RectangularWindow, 8, 8, 8, 1, { { { 0.5f, 0.f }, { 0.5f, 0.f }, { 0.5f, 0.f }, { 0.5f, 0.f }, { 0.5f, 0.f } } }, 5); test(&mwm, RectangularWindow, 8, 8, 8, 2, { { {}, {}, {}, {}, {} } }, 5); test(&mwm, RectangularWindow, 8, 8, 8, 3, { { {}, {}, {}, {}, {} } }, 5); test(&mwm, RectangularWindow, 8, 8, 8, 4, { { {}, {}, {}, {}, {} } }, 5); } void dirac_simple_rect_halfoverlap() { MockWaveModel mwm({ Dirac }, 16, 4); test(&mwm, RectangularWindow, 8, 4, 8, 0, { { {}, {}, {}, {}, {} } }, 7); test(&mwm, RectangularWindow, 8, 4, 8, 1, { { { 0.5f, 0.f }, { 0.5f, 0.f }, { 0.5f, 0.f }, { 0.5f, 0.f }, { 0.5f, 0.f } } }, 7); test(&mwm, RectangularWindow, 8, 4, 8, 2, { { { 0.5f, 0.f }, { -0.5f, 0.f }, { 0.5f, 0.f }, { -0.5f, 0.f }, { 0.5f, 0.f } } }, 7); test(&mwm, RectangularWindow, 8, 4, 8, 3, { { {}, {}, {}, {}, {} } }, 7); } }; #endif sonic-visualiser-3.0.3/svcore/data/model/test/files.pri0000644000000000000000000000021013111512442021234 0ustar 00000000000000TEST_HEADERS += \ Compares.h \ MockWaveModel.h \ TestFFTModel.h TEST_SOURCES += \ MockWaveModel.cpp \ svcore-data-model-test.cpp sonic-visualiser-3.0.3/svcore/data/model/test/svcore-data-model-test.cpp0000644000000000000000000000211713111512442024415 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "TestFFTModel.h" #include #include using namespace std; int main(int argc, char *argv[]) { int good = 0, bad = 0; QCoreApplication app(argc, argv); app.setOrganizationName("sonic-visualiser"); app.setApplicationName("test-model"); { TestFFTModel t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } if (bad > 0) { cerr << "\n********* " << bad << " test suite(s) failed!\n" << endl; return 1; } else { cerr << "All tests passed" << endl; return 0; } } sonic-visualiser-3.0.3/svcore/data/osc/OSCMessage.cpp0000644000000000000000000000206613111512442020573 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include "OSCMessage.h" OSCMessage::~OSCMessage() { clearArgs(); } void OSCMessage::clearArgs() { m_args.clear(); } void OSCMessage::addArg(QVariant arg) { m_args.push_back(arg); } int OSCMessage::getArgCount() const { return int(m_args.size()); } const QVariant & OSCMessage::getArg(int i) const { return m_args[i]; } sonic-visualiser-3.0.3/svcore/data/osc/OSCMessage.h0000644000000000000000000000304413111512442020235 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _OSC_MESSAGE_H_ #define _OSC_MESSAGE_H_ #include #include #include #include #include "base/Debug.h" class OSCMessage { public: OSCMessage() : m_target(0), m_targetData(0) { } ~OSCMessage(); void setTarget(const int &target) { m_target = target; } int getTarget() const { return m_target; } void setTargetData(const int &targetData) { m_targetData = targetData; } int getTargetData() const { return m_targetData; } void setMethod(QString method) { m_method = method; } QString getMethod() const { return m_method; } void clearArgs(); void addArg(QVariant arg); int getArgCount() const; const QVariant &getArg(int i) const; private: int m_target; int m_targetData; QString m_method; std::vector m_args; }; #endif sonic-visualiser-3.0.3/svcore/data/osc/OSCQueue.cpp0000644000000000000000000001327213111512442020274 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and QMUL. */ #include "OSCQueue.h" #include "base/Profiler.h" #include #define OSC_MESSAGE_QUEUE_SIZE 1023 #ifdef HAVE_LIBLO #include void OSCQueue::oscError(int num, const char *msg, const char *path) { cerr << "ERROR: OSCQueue::oscError: liblo server error " << num << " in path " << path << ": " << msg << endl; } int OSCQueue::oscMessageHandler(const char *path, const char *types, lo_arg **argv, int argc, lo_message, void *user_data) { OSCQueue *queue = static_cast(user_data); int target; int targetData; QString method; if (!queue->parseOSCPath(path, target, targetData, method)) { return 1; } OSCMessage message; message.setTarget(target); message.setTargetData(targetData); message.setMethod(method); int i = 0; while (types && i < argc && types[i]) { char type = types[i]; lo_arg *arg = argv[i]; switch (type) { case 'i': message.addArg(arg->i); break; // This conversion fails to compile in 64-bit environments // at present, and we don't use the h type anyway so we // can safely omit it // case 'h': message.addArg(arg->h); break; case 'f': message.addArg(arg->f); break; case 'd': message.addArg(arg->d); break; case 'c': message.addArg(arg->c); break; case 't': message.addArg(arg->i); break; case 's': message.addArg(&arg->s); break; default: cerr << "WARNING: OSCQueue::oscMessageHandler: " << "Unsupported OSC type '" << type << "'" << endl; break; } ++i; } queue->postMessage(message); return 0; } #endif OSCQueue::OSCQueue() : #ifdef HAVE_LIBLO m_thread(0), #endif m_buffer(OSC_MESSAGE_QUEUE_SIZE) { Profiler profiler("OSCQueue::OSCQueue"); #ifdef HAVE_LIBLO m_thread = lo_server_thread_new(NULL, oscError); lo_server_thread_add_method(m_thread, NULL, NULL, oscMessageHandler, this); lo_server_thread_start(m_thread); cout << "OSCQueue::OSCQueue: Base OSC URL is " << lo_server_thread_get_url(m_thread) << endl; #endif } OSCQueue::~OSCQueue() { #ifdef HAVE_LIBLO if (m_thread) { lo_server_thread_stop(m_thread); } #endif while (m_buffer.getReadSpace() > 0) { delete m_buffer.readOne(); } } bool OSCQueue::isOK() const { #ifdef HAVE_LIBLO return (m_thread != 0); #else return false; #endif } QString OSCQueue::getOSCURL() const { QString url = ""; #ifdef HAVE_LIBLO url = lo_server_thread_get_url(m_thread); #endif return url; } int OSCQueue::getMessagesAvailable() const { return m_buffer.getReadSpace(); } OSCMessage OSCQueue::readMessage() { OSCMessage *message = m_buffer.readOne(); OSCMessage rmessage = *message; delete message; return rmessage; } void OSCQueue::postMessage(OSCMessage message) { int count = 0, max = 5; while (m_buffer.getWriteSpace() == 0) { if (count == max) { cerr << "ERROR: OSCQueue::postMessage: OSC message queue is full and not clearing -- abandoning incoming message" << endl; return; } cerr << "WARNING: OSCQueue::postMessage: OSC message queue (capacity " << m_buffer.getSize() << " is full!" << endl; SVDEBUG << "Waiting for something to be processed" << endl; #ifdef _WIN32 Sleep(1); #else sleep(1); #endif count++; } OSCMessage *mp = new OSCMessage(message); m_buffer.write(&mp, 1); SVDEBUG << "OSCQueue::postMessage: Posted OSC message: target " << message.getTarget() << ", target data " << message.getTargetData() << ", method " << message.getMethod() << endl; emit messagesAvailable(); } bool OSCQueue::parseOSCPath(QString path, int &target, int &targetData, QString &method) { while (path.startsWith("/")) { path = path.right(path.length()-1); } int i = 0; bool ok = false; target = path.section('/', i, i).toInt(&ok); if (!ok) { target = 0; } else { ++i; targetData = path.section('/', i, i).toInt(&ok); if (!ok) { targetData = 0; } else { ++i; } } method = path.section('/', i, -1); if (method.contains('/')) { cerr << "ERROR: OSCQueue::parseOSCPath: malformed path \"" << path << "\" (should be target/data/method or " << "target/method or method, where target and data " << "are numeric)" << endl; return false; } SVDEBUG << "OSCQueue::parseOSCPath: good path \"" << path << "\"" << endl; return true; } sonic-visualiser-3.0.3/svcore/data/osc/OSCQueue.h0000644000000000000000000000317713111512442017744 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and QMUL. */ #ifndef _OSC_QUEUE_H_ #define _OSC_QUEUE_H_ #include "OSCMessage.h" #include "base/RingBuffer.h" #include #ifdef HAVE_LIBLO #include #endif class OSCQueue : public QObject { Q_OBJECT public: OSCQueue(); virtual ~OSCQueue(); bool isOK() const; bool isEmpty() const { return getMessagesAvailable() == 0; } int getMessagesAvailable() const; OSCMessage readMessage(); QString getOSCURL() const; signals: void messagesAvailable(); protected: #ifdef HAVE_LIBLO lo_server_thread m_thread; static void oscError(int, const char *, const char *); static int oscMessageHandler(const char *, const char *, lo_arg **, int, lo_message, void *); #endif void postMessage(OSCMessage); bool parseOSCPath(QString path, int &target, int &targetData, QString &method); RingBuffer m_buffer; }; #endif sonic-visualiser-3.0.3/svcore/data/osc/demoscript.sh0000755000000000000000000003020413111512442020641 0ustar 00000000000000#!/bin/bash audio=/data/Music preferred=$audio/free list=audiofiles.txt used=audiofiles-used.txt #df=vamp:vamp-aubio:aubioonset:detectionfunction df=vamp:qm-vamp-plugins:qm-tempotracker:detection_fn #onsets=vamp:vamp-aubio:aubioonset:onsets onsets=vamp:vamp-example-plugins:percussiononsets:onsets beats=vamp:qm-vamp-plugins:qm-tempotracker:beats #beats=vamp:vamp-aubio:aubiotempo:beats #beats=$onsets #onsets=$beats chromagram=vamp:qm-vamp-plugins:qm-chromagram:chromagram notes=vamp:vamp-aubio:aubionotes:notes pid=`cat /tmp/demoscript.pid 2>/dev/null` if [ -n "$pid" ]; then kill "$pid" fi echo $$ > /tmp/demoscript.pid trap "rm /tmp/demoscript.pid" 0 sv-command quit sleep 1 killall -9 sonic-visualiser sleep 1 pick_file() { file="" count=`wc -l "$list" 2>/dev/null | awk '{ print $1 }'` if [ ! -f "$list" ] || [ "$count" -eq "0" ] ; then find "$audio" -name \*.ogg -print >> "$list" find "$audio" -name \*.mp3 -print >> "$list" find "$audio" -name \*.wav -print >> "$list" find "$preferred" -name \*.ogg -print >> "$list" find "$preferred" -name \*.mp3 -print >> "$list" find "$preferred" -name \*.wav -print >> "$list" count=`wc -l "$list" 2>/dev/null | awk '{ print $1 }'` fi while [ -z "$file" ]; do index=$((RANDOM % $count)) file=`head -"$index" "$list" | tail -1` [ -f "$file" ] || continue done fgrep -v "$file" "$list" > "$list"_ && mv "$list"_ "$list" echo "$file" } resize_normal() { # sv-command resize 1000 500 sv-command resize 2000 1000 } resize_big() { # sv-command resize 1000 700 sv-command resize 2000 1400 } load_a_file() { file=`pick_file` if ! sv-command open "$file"; then pid="`pidof sonic-visualiser`" if [ -z "$pid" ]; then ( setsid sonic-visualiser -geometry +10+100 & ) sleep 2 #sudo renice +19 `pidof sonic-visualiser` #sudo renice +18 `pidof Xorg` resize_normal load_a_file else echo "ERROR: Unable to contact sonic-visualiser pid $pid" 1>&2 exit 1 fi fi } show_stuff() { sv-command set overlays 2 # sv-command set zoomwheels 1 sv-command set propertyboxes 1 } hide_stuff() { sv-command set overlays 0 # sv-command set zoomwheels 0 sv-command set propertyboxes 0 } reset() { for pane in 1 2 3 4 5; do for layer in 1 2 3 4 5 6 7 8 9 10; do sv-command delete layer done sv-command delete pane done sv-command zoom default sv-command add waveform show_stuff } scroll_and_zoom() { sv-command set overlays 0 sv-command set zoomwheels 0 sv-command set propertyboxes 0 # sv-command setcurrent 1 1 # sv-command delete layer # sv-command setcurrent 1 1 sv-command set layer Colour Red sleep 1 sv-command set pane Global-Zoom off sv-command set pane Global-Scroll off sv-command set pane Follow-Playback Scroll for zoom in 950 900 850 800 750 700 650 600 550 512 450 400 350 300 256 192 160 128 96 64 48 32 24 16; do sv-command zoom $zoom sleep 0.1 done } play() { sv-command play "$@" } fade_in() { sv-command set gain 0 sleep 1 play "$@" for gain in 0.001 0.01 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1; do sv-command set gain $gain sleep 0.1 done } fade_out() { for gain in 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.05 0.01 0.001; do sv-command set gain $gain sleep 0.1 done stop sv-command set gain 1 } slow() { # for speed in -1 -10 -20 -30 -40 -50 -60 -70 -80 -100 -140 -200 -250 -300 -400 -500 -700 -800 -900 -1000; do # sv-command set speedup "$speed" # sleep 1 # done for speed in 80 50 10; do sv-command set speed "$speed" sleep 10 done } stop() { sv-command stop "$@" sv-command set speed 100 } quit() { sv-command quit } add_melodic_range_spectrogram() { sv-command set propertyboxes 1 sv-command add spectrogram sv-command set layer Window-Size 8192 # sv-command set layer Window-Size 4096 sv-command set layer Window-Overlap 4 # sv-command set layer Window-Overlap 3 sv-command set layer Frequency-Scale Log sv-command set layer Colour-Scale Meter } zoom_in_spectrogram() { sv-command zoomvertical 43 8000 for x in 1 2 3 4 5 6; do max=$((8000 - 1000*$x)) sv-command zoomvertical 43 "$max" sleep 0.5 done for x in 1 2 3 4 5; do max=$((2000 - 100 * $x)) sv-command zoomvertical 43 "$max" sleep 0.5 done } zoom_in_spectrogram_further() { for x in 1 2 3 4 5; do sv-command zoomvertical in done } playback_bits() { sv-command setcurrent 1 sv-command set pane Global-Zoom off sv-command set pane Global-Scroll off sv-command set pane Follow-Playback Scroll sv-command jump 10 sv-command setcurrent 1 1 sv-command delete layer sv-command setcurrent 1 1 # sv-command setcurrent 1 2 sv-command set layer Colour Blue sleep 5 hide_stuff sv-command set overlays 0 sv-command set zoomwheels 0 sv-command set propertyboxes 0 fade_in sleep 10 # sv-command set layer Colour Blue # sleep 1 # sv-command set layer Colour Orange # sleep 1 # sv-command set layer Colour Red # sleep 1 # sv-command set layer Colour Green # sleep 1 # sleep 1 # scroll_and_zoom # sv-command set overlays 0 # sv-command set zoomwheels 0 # sv-command set propertyboxes 0 # sv-command setcurrent 1 1 # sv-command delete layer # sv-command setcurrent 1 1 # sv-command set layer Colour Red # sleep 1 # sv-command set pane Global-Zoom off # sv-command set pane Global-Scroll off # sv-command set pane Follow-Playback Scroll sv-command set zoomwheels 1 sleep 1 for zoom in 950 900 850 800 750 700 650 600 550 512 450 400 350 300 256 192 160 128 96 64 48 32 24 16; do sv-command zoom $zoom sleep 0.1 done sleep 1 sv-command set zoomwheels 0 sv-command zoom 16 sleep 10 #slow #sv-command set layer Normalize-Visible-Area on # for zoom in 15 14 13 12 11 10 9 8 7 6 5 4 ; do # sv-command zoom $zoom # sleep 0.1 # done sleep 1 sv-command set zoomwheels 0 slow sleep 7 fade_out sv-command setcurrent 1 sv-command set pane Follow-Playback Page sv-command set pane Global-Zoom on sv-command set pane Global-Scroll on done_playback_bits=1 } spectrogram_bits() { sv-command set pane Global-Zoom on sv-command zoom 1024 add_melodic_range_spectrogram sv-command zoom 1024 sleep 5 sv-command jump 10 sleep 20 zoom_in_spectrogram sleep 20 sv-command select 7.5 11 fade_in selection sleep 10 sv-command set speed 40 sleep 10 sv-command setcurrent 1 sv-command delete pane sv-command zoom in sv-command setcurrent 1 2 sv-command set layer Normalize-Columns off sv-command set layer Normalize-Visible-Area on sleep 20 sv-command set speed 100 sleep 10 sv-command select none # fade_out # if [ -n "$done_playback_bits" ]; then # sv-command setcurrent 1 # sv-command zoom out # sv-command zoom outvamp:qm-vamp-plugins:qm-chromagram:chromagram # sv-command zoom out # sv-command zoom out # sv-command zoom out # sv-command setcurrent 2 # fi # hide_stuff # fade_in sleep 10 # sv-command set layer Bin-Display Frequencies # sv-command set layer Normalize-Columns on # sleep 20 sv-command set layer Bin-Display "All Bins" sv-command set layer Normalize-Columns on sv-command set layer Normalize-Visible-Area off sv-command set layer Colour-Scale 0 sv-command set layer Colour "Red on Blue" sv-command zoomvertical 23 800 sleep 20 sv-command transform $onsets sv-command set layer Colour Orange sleep 20 fade_out sleep 1 # sv-command jump 10 # sv-command setcurrent 1 2 # sv-command set layer Colour "Black on White" # sv-command transform $notes # sv-command set layer Colour Orange sleep 10 # sv-command setcurrent 1 3 # sv-command delete layer sv-command setcurrent 1 3 sv-command delete layer sv-command setcurrent 1 2 sv-command set layer Colour Default done_spectrogram_bits=1 # zoom_in_spectrogram_further } onset_bits() { show_stuff sv-command set zoomwheels 0 sv-command setcurrent 1 sv-command set pane Global-Zoom on sv-command set pane Global-Scroll on sleep 0.5 sv-command set layer Colour Blue sleep 0.5 sv-command set layer Colour Orange sleep 0.5 sv-command set layer Colour Red sleep 0.5 sv-command set layer Colour Green sleep 1 # sleep 1 # if [ -n "$done_spectrogram_bits" ]; then # sv-command setcurrent 2 # sv-command delete pane # fi # sv-command zoom default # sv-command zoom in # sv-command zoom in # sv-command zoom in sv-command zoom 192 sv-command zoom in sv-command add timeruler sv-command jump 0 sv-command transform $df sv-command set layer Colour Black sleep 5 sv-command set layer Plot-Type Curve sleep 5 sv-command jump 30 sv-command setcurrent 1 sv-command set pane Follow-Playback Page sv-command transform $df sv-command set layer Colour Red sleep 5 sv-command jump 30 sleep 5 if [ "$RANDOM" -lt 16384 ]; then sv-command set layer Vertical-Scale "Log Scale" fi sv-command set layer Plot-Type Segmentation sleep 5 # hide_stuff sleep 10 sv-command set overlays 0 sv-command set propertyboxes 0 # sv-command setcurrent 1 1 # sv-command set layer Colour Black # sv-command setcurrent 1 2 sleep 2 fade_in sleep 2 sv-command transform $onsets sv-command set layer Colour Black sv-command setcurrent 2 sv-command transform $onsets sv-command set layer Colour Blue sleep 20 # sv-command setcurrent 2 # sv-command transform vamp:qm-vamp-plugins:qm-tempotracker:beats # sv-command transform $beats sleep 20 # fade_out # show_stuff } selection_bits() { # reset sv-command set overlays 1 sv-command set zoomwheels 0 resize_normal sv-command zoom default sv-command setcurrent 2 sv-command delete pane # if [ -n "$done_playback_bits" ]; then sv-command setcurrent 1 2 # else # sv-command setcurrent 1 3 # fi sv-command delete layer # if [ -n "$done_playback_bits" ]; then sv-command setcurrent 1 2 # else # sv-command setcurrent 1 3 # fi sv-command delete layer sv-command setcurrent 1 2 sv-command set layer Colour Orange # sv-command transform vamp:qm-vamp-plugins:qm-tempotracker:beats sv-command transform $beats # sv-command setcurrent 1 2 sv-command set layer Colour Black sleep 20 sv-command loop on base=$((RANDOM % 100)) sv-command select $base $base.3 # fade_in selection play selection sleep 8 base=$((base + 4)) sv-command addselect $base $base.1 #sleep 12 base=$((base + 2)) sv-command addselect $base $base.1 #sleep 6 base=$((base + 2)) sv-command addselect $base $base.3 #sleep 6 base=$((base + 3)) sv-command addselect $base $base.3 #sleep 6 base=$((base + 2)) sv-command addselect $base $base.3 sleep 4 sv-command delete layer sleep 16 sv-command set speed 66 sleep 14 sv-command set speed 150 sleep 8 sv-command set speed 200 sleep 5 sv-command set speed 400 fade_out # sleep 10 sv-command select none sv-command set overlays 2 sv-command set propertyboxes 1 # sv-command setcurrent 1 3 # sv-command delete layer sv-command setcurrent 1 2 sv-command set layer Colour Black } chromagram_bits() { # add_melodic_range_spectrogram # sleep 10 sv-command add timeruler sleep 5 sv-command jump 10 sv-command zoom out sleep 5 sv-command transform $chromagram sleep 40 sv-command zoom out fade_in sleep 20 fade_out } while /bin/true; do sleep 2 load_a_file sv-command loop on resize_normal show_stuff sleep 5 sleep 20 playback_bits #sleep 10 resize_big sv-command zoom default show_stuff onset_bits selection_bits #sv-command resize 1000 700 #sleep 10 resize_big #show_stuff spectrogram_bits #sleep 10 #sv-command jump 0 #show_stuff #chromagram_bits sleep 20 #reset killall -9 sonic-visualiser done sonic-visualiser-3.0.3/svcore/data/osc/sv-command0000755000000000000000000000302013111512442020117 0ustar 00000000000000#!/bin/sh # # A very simple command shell for Sonic Visualiser. # # This provides a wrapper for the sv-osc-send program, which is a # generic OSC sending program (not specific to SV, despite its name). # This script attempts to guess the OSC port number for an SV # process running on the local host, and then composes a method name # and arguments into a complete OSC call. # # You can either run this with the method and its arguments on the # command line, e.g. "sv-command set layer Frequency-Scale Log", or # you can provide a series of method + argument commands on stdin. # # Unless you use the -q option, this script will echo the OSC URL # and arguments that it is sending for each command. # # Note that the method and arguments may not contain spaces. # # Chris Cannam, Nov 2006 quiet= if [ "$1" = "-q" ]; then quiet=true; shift; fi # The yucky bit port=`lsof -c sonic- | \ grep UDP | \ sed -e 's/^.*[^0-9]\([0-9][0-9]*\) *$/\1/' | \ grep -v ' ' | \ head -1 ` host=127.0.0.1 scheme=osc.udp if [ -z "$port" ]; then echo "Sonic Visualiser OSC port not found" exit 1 fi if [ -n "$1" ]; then command=$1; shift [ -z "$quiet" ] && echo "$scheme://$host:$port/$command" "$@" sv-osc-send "$scheme://$host:$port/$command" "$@" else while read command a1 a2 a3 a4 a5; do [ -z "$command" ] && continue [ -z "$quiet" ] && echo "$scheme://$host:$port/$command" $a1 $a2 $a3 $a4 $a5 sv-osc-send "$scheme://$host:$port/$command" $a1 $a2 $a3 $a4 $a5 done fi exit 0 sonic-visualiser-3.0.3/svcore/data/osc/sv-osc-send.c0000644000000000000000000000311513111512442020437 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include #include #include #include #include void usage(char *program_name) { char *base_name = strrchr(program_name, '/'); if (base_name && *(base_name + 1) != 0) { base_name += 1; } else { base_name = program_name; } fprintf(stderr, "\nusage: %s []\n\n", program_name); fprintf(stderr, "example OSC URLs:\n\n" " osc.udp://localhost:19383/path/test 1.0 4.2\n" " osc.udp://my.host.org:10886/3/13/load file\n\n"); fprintf(stderr, "numeric arguments will be treated as OSC 'f' floating point types.\n\n"); exit(1); } int main(int argc, char *argv[]) { lo_address a; char *url, *host, *port, *path; lo_message message; unsigned int i; if (argc < 2) { usage(argv[0]); /* does not return */ } url = argv[1]; host = lo_url_get_hostname(url); port = lo_url_get_port(url); path = lo_url_get_path(url); a = lo_address_new(host, port); message = lo_message_new(); for (i = 0; i + 2 < argc; ++i) { int index = i + 2; char *param; param = argv[index]; if (!isdigit(param[0])) { lo_message_add_string(message, argv[index]); } else { lo_message_add_float(message, atof(argv[index])); } } lo_send_message(a, path, message); if (lo_address_errno(a)) { printf("liblo error: %s\n", lo_address_errstr(a)); } free(host); free(port); free(path); return 0; } sonic-visualiser-3.0.3/svcore/files.pri0000644000000000000000000002250713111512442016261 0ustar 00000000000000SVCORE_HEADERS = \ base/AudioLevel.h \ base/AudioPlaySource.h \ base/AudioRecordTarget.h \ base/BaseTypes.h \ base/Clipboard.h \ base/ColumnOp.h \ base/Command.h \ base/Debug.h \ base/Exceptions.h \ base/HelperExecPath.h \ base/HitCount.h \ base/LogRange.h \ base/MagnitudeRange.h \ base/Pitch.h \ base/Playable.h \ base/PlayParameterRepository.h \ base/PlayParameters.h \ base/Preferences.h \ base/Profiler.h \ base/ProgressPrinter.h \ base/ProgressReporter.h \ base/PropertyContainer.h \ base/RangeMapper.h \ base/RealTime.h \ base/RecentFiles.h \ base/ResourceFinder.h \ base/RingBuffer.h \ base/ScaleTickIntervals.h \ base/Scavenger.h \ base/Selection.h \ base/Serialiser.h \ base/StorageAdviser.h \ base/StringBits.h \ base/Strings.h \ base/TempDirectory.h \ base/TempWriteFile.h \ base/TextMatcher.h \ base/Thread.h \ base/UnitDatabase.h \ base/ViewManagerBase.h \ base/Window.h \ base/XmlExportable.h \ base/ZoomConstraint.h \ data/fileio/AudioFileReader.h \ data/fileio/AudioFileReaderFactory.h \ data/fileio/AudioFileSizeEstimator.h \ data/fileio/BZipFileDevice.h \ data/fileio/CachedFile.h \ data/fileio/CodedAudioFileReader.h \ data/fileio/CSVFileReader.h \ data/fileio/CSVFileWriter.h \ data/fileio/CSVFormat.h \ data/fileio/DataFileReader.h \ data/fileio/DataFileReaderFactory.h \ data/fileio/FileFinder.h \ data/fileio/FileReadThread.h \ data/fileio/FileSource.h \ data/fileio/MIDIFileReader.h \ data/fileio/MIDIFileWriter.h \ data/fileio/MP3FileReader.h \ data/fileio/OggVorbisFileReader.h \ data/fileio/PlaylistFileReader.h \ data/fileio/CoreAudioFileReader.h \ data/fileio/DecodingWavFileReader.h \ data/fileio/WavFileReader.h \ data/fileio/WavFileWriter.h \ data/midi/MIDIEvent.h \ data/midi/MIDIInput.h \ data/midi/rtmidi/RtMidi.h \ data/model/AggregateWaveModel.h \ data/model/AlignmentModel.h \ data/model/Dense3DModelPeakCache.h \ data/model/DenseThreeDimensionalModel.h \ data/model/DenseTimeValueModel.h \ data/model/EditableDenseThreeDimensionalModel.h \ data/model/FFTModel.h \ data/model/ImageModel.h \ data/model/IntervalModel.h \ data/model/Labeller.h \ data/model/Model.h \ data/model/ModelDataTableModel.h \ data/model/NoteModel.h \ data/model/FlexiNoteModel.h \ data/model/PathModel.h \ data/model/PowerOfSqrtTwoZoomConstraint.h \ data/model/PowerOfTwoZoomConstraint.h \ data/model/RangeSummarisableTimeValueModel.h \ data/model/RegionModel.h \ data/model/SparseModel.h \ data/model/SparseOneDimensionalModel.h \ data/model/SparseTimeValueModel.h \ data/model/SparseValueModel.h \ data/model/TabularModel.h \ data/model/TextModel.h \ data/model/WaveFileModel.h \ data/model/ReadOnlyWaveFileModel.h \ data/model/WritableWaveFileModel.h \ data/osc/OSCMessage.h \ data/osc/OSCQueue.h \ plugin/PluginScan.h \ plugin/DSSIPluginFactory.h \ plugin/DSSIPluginInstance.h \ plugin/FeatureExtractionPluginFactory.h \ plugin/LADSPAPluginFactory.h \ plugin/LADSPAPluginInstance.h \ plugin/NativeVampPluginFactory.h \ plugin/PiperVampPluginFactory.h \ plugin/PluginIdentifier.h \ plugin/PluginXml.h \ plugin/RealTimePluginFactory.h \ plugin/RealTimePluginInstance.h \ plugin/api/dssi.h \ plugin/api/ladspa.h \ plugin/plugins/SamplePlayer.h \ plugin/api/alsa/asoundef.h \ plugin/api/alsa/asoundlib.h \ plugin/api/alsa/seq.h \ plugin/api/alsa/seq_event.h \ plugin/api/alsa/seq_midi_event.h \ plugin/api/alsa/sound/asequencer.h \ rdf/PluginRDFIndexer.h \ rdf/PluginRDFDescription.h \ rdf/RDFExporter.h \ rdf/RDFFeatureWriter.h \ rdf/RDFImporter.h \ rdf/RDFTransformFactory.h \ system/Init.h \ system/System.h \ transform/CSVFeatureWriter.h \ transform/FeatureExtractionModelTransformer.h \ transform/FeatureWriter.h \ transform/FileFeatureWriter.h \ transform/RealTimeEffectModelTransformer.h \ transform/Transform.h \ transform/TransformDescription.h \ transform/TransformFactory.h \ transform/ModelTransformer.h \ transform/ModelTransformerFactory.h SVCORE_SOURCES = \ base/AudioLevel.cpp \ base/Clipboard.cpp \ base/ColumnOp.cpp \ base/Command.cpp \ base/Debug.cpp \ base/Exceptions.cpp \ base/HelperExecPath.cpp \ base/LogRange.cpp \ base/Pitch.cpp \ base/PlayParameterRepository.cpp \ base/PlayParameters.cpp \ base/Preferences.cpp \ base/Profiler.cpp \ base/ProgressPrinter.cpp \ base/ProgressReporter.cpp \ base/PropertyContainer.cpp \ base/RangeMapper.cpp \ base/RealTimeSV.cpp \ base/RecentFiles.cpp \ base/ResourceFinder.cpp \ base/Selection.cpp \ base/Serialiser.cpp \ base/StorageAdviser.cpp \ base/StringBits.cpp \ base/Strings.cpp \ base/TempDirectory.cpp \ base/TempWriteFile.cpp \ base/TextMatcher.cpp \ base/Thread.cpp \ base/UnitDatabase.cpp \ base/ViewManagerBase.cpp \ base/XmlExportable.cpp \ data/fileio/AudioFileReader.cpp \ data/fileio/AudioFileReaderFactory.cpp \ data/fileio/AudioFileSizeEstimator.cpp \ data/fileio/BZipFileDevice.cpp \ data/fileio/CachedFile.cpp \ data/fileio/CodedAudioFileReader.cpp \ data/fileio/CSVFileReader.cpp \ data/fileio/CSVFileWriter.cpp \ data/fileio/CSVFormat.cpp \ data/fileio/DataFileReaderFactory.cpp \ data/fileio/FileReadThread.cpp \ data/fileio/FileSource.cpp \ data/fileio/MIDIFileReader.cpp \ data/fileio/MIDIFileWriter.cpp \ data/fileio/MP3FileReader.cpp \ data/fileio/OggVorbisFileReader.cpp \ data/fileio/PlaylistFileReader.cpp \ data/fileio/CoreAudioFileReader.cpp \ data/fileio/DecodingWavFileReader.cpp \ data/fileio/WavFileReader.cpp \ data/fileio/WavFileWriter.cpp \ data/midi/MIDIInput.cpp \ data/midi/rtmidi/RtMidi.cpp \ data/model/AggregateWaveModel.cpp \ data/model/AlignmentModel.cpp \ data/model/Dense3DModelPeakCache.cpp \ data/model/DenseTimeValueModel.cpp \ data/model/EditableDenseThreeDimensionalModel.cpp \ data/model/FFTModel.cpp \ data/model/Model.cpp \ data/model/ModelDataTableModel.cpp \ data/model/PowerOfSqrtTwoZoomConstraint.cpp \ data/model/PowerOfTwoZoomConstraint.cpp \ data/model/RangeSummarisableTimeValueModel.cpp \ data/model/WaveFileModel.cpp \ data/model/ReadOnlyWaveFileModel.cpp \ data/model/WritableWaveFileModel.cpp \ data/osc/OSCMessage.cpp \ data/osc/OSCQueue.cpp \ plugin/PluginScan.cpp \ plugin/DSSIPluginFactory.cpp \ plugin/DSSIPluginInstance.cpp \ plugin/FeatureExtractionPluginFactory.cpp \ plugin/LADSPAPluginFactory.cpp \ plugin/LADSPAPluginInstance.cpp \ plugin/NativeVampPluginFactory.cpp \ plugin/PiperVampPluginFactory.cpp \ plugin/PluginIdentifier.cpp \ plugin/PluginXml.cpp \ plugin/RealTimePluginFactory.cpp \ plugin/RealTimePluginInstance.cpp \ plugin/plugins/SamplePlayer.cpp \ rdf/PluginRDFIndexer.cpp \ rdf/PluginRDFDescription.cpp \ rdf/RDFExporter.cpp \ rdf/RDFFeatureWriter.cpp \ rdf/RDFImporter.cpp \ rdf/RDFTransformFactory.cpp \ system/Init.cpp \ system/System.cpp \ transform/CSVFeatureWriter.cpp \ transform/FeatureExtractionModelTransformer.cpp \ transform/FileFeatureWriter.cpp \ transform/RealTimeEffectModelTransformer.cpp \ transform/Transform.cpp \ transform/TransformFactory.cpp \ transform/ModelTransformer.cpp \ transform/ModelTransformerFactory.cpp !linux* { SVCORE_SOURCES += plugin/api/dssi_alsa_compat.c } sonic-visualiser-3.0.3/svcore/install-sh0000755000000000000000000003246413111512442016452 0ustar 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-3.0.3/svcore/plugin/DSSIPluginFactory.cpp0000644000000000000000000003041013111512442021706 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include "DSSIPluginFactory.h" #include #include #include "DSSIPluginInstance.h" #include "PluginIdentifier.h" #include #include "base/Profiler.h" //!!! #include "plugin/plugins/SamplePlayer.h" #include "system/System.h" #ifdef HAVE_LRDF #include "lrdf.h" #endif // HAVE_LRDF DSSIPluginFactory::DSSIPluginFactory() : LADSPAPluginFactory() { m_hostDescriptor.DSSI_API_Version = 2; m_hostDescriptor.request_transport_information = NULL; m_hostDescriptor.request_midi_send = DSSIPluginInstance::requestMidiSend; m_hostDescriptor.request_non_rt_thread = DSSIPluginInstance::requestNonRTThread; m_hostDescriptor.midi_send = DSSIPluginInstance::midiSend; } DSSIPluginFactory::~DSSIPluginFactory() { // nothing else to do here either } void DSSIPluginFactory::enumeratePlugins(std::vector &list) { Profiler profiler("DSSIPluginFactory::enumeratePlugins"); for (std::vector::iterator i = m_identifiers.begin(); i != m_identifiers.end(); ++i) { const DSSI_Descriptor *ddesc = getDSSIDescriptor(*i); if (!ddesc) continue; const LADSPA_Descriptor *descriptor = ddesc->LADSPA_Plugin; if (!descriptor) continue; // SVDEBUG << "DSSIPluginFactory::enumeratePlugins: Name " << (descriptor->Name ? descriptor->Name : "NONE" ) << endl; list.push_back(*i); list.push_back(descriptor->Name); list.push_back(QString("%1").arg(descriptor->UniqueID)); list.push_back(descriptor->Label); list.push_back(descriptor->Maker); list.push_back(descriptor->Copyright); list.push_back((ddesc->run_synth || ddesc->run_multiple_synths) ? "true" : "false"); list.push_back(ddesc->run_multiple_synths ? "true" : "false"); list.push_back(m_taxonomy[*i]); list.push_back(QString("%1").arg(descriptor->PortCount)); for (int p = 0; p < (int)descriptor->PortCount; ++p) { int type = 0; if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[p])) { type |= PortType::Control; } else { type |= PortType::Audio; } if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[p])) { type |= PortType::Input; } else { type |= PortType::Output; } list.push_back(QString("%1").arg(p)); list.push_back(descriptor->PortNames[p]); list.push_back(QString("%1").arg(type)); list.push_back(QString("%1").arg(getPortDisplayHint(descriptor, p))); list.push_back(QString("%1").arg(getPortMinimum(descriptor, p))); list.push_back(QString("%1").arg(getPortMaximum(descriptor, p))); list.push_back(QString("%1").arg(getPortDefault(descriptor, p))); } } unloadUnusedLibraries(); } RealTimePluginInstance * DSSIPluginFactory::instantiatePlugin(QString identifier, int instrument, int position, sv_samplerate_t sampleRate, int blockSize, int channels) { Profiler profiler("DSSIPluginFactory::instantiatePlugin"); const DSSI_Descriptor *descriptor = getDSSIDescriptor(identifier); if (descriptor) { DSSIPluginInstance *instance = new DSSIPluginInstance (this, instrument, identifier, position, sampleRate, blockSize, channels, descriptor); m_instances.insert(instance); return instance; } return 0; } const DSSI_Descriptor * DSSIPluginFactory::getDSSIDescriptor(QString identifier) { QString type, soname, label; PluginIdentifier::parseIdentifier(identifier, type, soname, label); if (soname == PluginIdentifier::BUILTIN_PLUGIN_SONAME) { if (label == "sample_player") { const DSSI_Descriptor *descriptor = SamplePlayer::getDescriptor(0); if (descriptor) { descriptor->receive_host_descriptor(&m_hostDescriptor); } return descriptor; } else { return 0; } } bool firstInLibrary = false; if (m_libraryHandles.find(soname) == m_libraryHandles.end()) { loadLibrary(soname); if (m_libraryHandles.find(soname) == m_libraryHandles.end()) { cerr << "WARNING: DSSIPluginFactory::getDSSIDescriptor: loadLibrary failed for " << soname << endl; return 0; } firstInLibrary = true; } void *libraryHandle = m_libraryHandles[soname]; DSSI_Descriptor_Function fn = (DSSI_Descriptor_Function) DLSYM(libraryHandle, "dssi_descriptor"); if (!fn) { cerr << "WARNING: DSSIPluginFactory::getDSSIDescriptor: No descriptor function in library " << soname << endl; return 0; } const DSSI_Descriptor *descriptor = 0; int index = 0; while ((descriptor = fn(index))) { if (descriptor->LADSPA_Plugin->Label == label) { if (firstInLibrary && (descriptor->DSSI_API_Version >= 2)) { descriptor->receive_host_descriptor(&m_hostDescriptor); } return descriptor; } ++index; } cerr << "WARNING: DSSIPluginFactory::getDSSIDescriptor: No such plugin as " << label << " in library " << soname << endl; return 0; } const LADSPA_Descriptor * DSSIPluginFactory::getLADSPADescriptor(QString identifier) { const DSSI_Descriptor *dssiDescriptor = getDSSIDescriptor(identifier); if (dssiDescriptor) return dssiDescriptor->LADSPA_Plugin; else return 0; } std::vector DSSIPluginFactory::getPluginPath() { std::vector pathList; std::string path; char *cpath = getenv("DSSI_PATH"); if (cpath) path = cpath; if (path == "") { path = DEFAULT_DSSI_PATH; char *home = getenv("HOME"); if (home) { std::string::size_type f; while ((f = path.find("$HOME")) != std::string::npos && f < path.length()) { path.replace(f, 5, home); } } #ifdef _WIN32 const char *pfiles = getenv("ProgramFiles"); if (!pfiles) pfiles = "C:\\Program Files"; { std::string::size_type f; while ((f = path.find("%ProgramFiles%")) != std::string::npos && f < path.length()) { path.replace(f, 14, pfiles); } } #endif } std::string::size_type index = 0, newindex = 0; while ((newindex = path.find(PATH_SEPARATOR, index)) < path.size()) { pathList.push_back(path.substr(index, newindex - index).c_str()); index = newindex + 1; } pathList.push_back(path.substr(index).c_str()); return pathList; } std::vector DSSIPluginFactory::getLRDFPath(QString &baseUri) { std::vector lrdfPaths; #ifdef HAVE_LRDF std::vector pathList = getPluginPath(); lrdfPaths.push_back("/usr/local/share/dssi/rdf"); lrdfPaths.push_back("/usr/share/dssi/rdf"); lrdfPaths.push_back("/usr/local/share/ladspa/rdf"); lrdfPaths.push_back("/usr/share/ladspa/rdf"); for (std::vector::iterator i = pathList.begin(); i != pathList.end(); ++i) { lrdfPaths.push_back(*i + "/rdf"); } #ifdef DSSI_BASE baseUri = DSSI_BASE; #else baseUri = "http://dssi.sourceforge.net/ontology#"; #endif #else // avoid unused parameter baseUri = ""; #endif return lrdfPaths; } void DSSIPluginFactory::discoverPluginsFrom(QString soname) { Profiler profiler("DSSIPluginFactory::discoverPlugins"); // Note that soname is expected to be a full path at this point, // of a file that is known to exist void *libraryHandle = DLOPEN(soname, RTLD_LAZY); if (!libraryHandle) { cerr << "WARNING: DSSIPluginFactory::discoverPlugins: couldn't load plugin library " << soname << " - " << DLERROR() << endl; return; } DSSI_Descriptor_Function fn = (DSSI_Descriptor_Function) DLSYM(libraryHandle, "dssi_descriptor"); if (!fn) { cerr << "WARNING: DSSIPluginFactory::discoverPlugins: No descriptor function in " << soname << endl; return; } const DSSI_Descriptor *descriptor = 0; int index = 0; while ((descriptor = fn(index))) { const LADSPA_Descriptor *ladspaDescriptor = descriptor->LADSPA_Plugin; if (!ladspaDescriptor) { cerr << "WARNING: DSSIPluginFactory::discoverPlugins: No LADSPA descriptor for plugin " << index << " in " << soname << endl; ++index; continue; } RealTimePluginDescriptor *rtd = new RealTimePluginDescriptor; rtd->name = ladspaDescriptor->Name; rtd->label = ladspaDescriptor->Label; rtd->maker = ladspaDescriptor->Maker; rtd->copyright = ladspaDescriptor->Copyright; rtd->category = ""; rtd->isSynth = (descriptor->run_synth || descriptor->run_multiple_synths); rtd->parameterCount = 0; rtd->audioInputPortCount = 0; rtd->audioOutputPortCount = 0; rtd->controlOutputPortCount = 0; QString identifier = PluginIdentifier::createIdentifier ("dssi", soname, ladspaDescriptor->Label); #ifdef HAVE_LRDF char *def_uri = 0; lrdf_defaults *defs = 0; QString category = m_taxonomy[identifier]; if (category == "" && m_lrdfTaxonomy[ladspaDescriptor->UniqueID] != "") { m_taxonomy[identifier] = m_lrdfTaxonomy[ladspaDescriptor->UniqueID]; category = m_taxonomy[identifier]; } if (category == "") { std::string name = rtd->name; if (name.length() > 4 && name.substr(name.length() - 4) == " VST") { if (descriptor->run_synth || descriptor->run_multiple_synths) { category = "VST instruments"; } else { category = "VST effects"; } m_taxonomy[identifier] = category; } } rtd->category = category.toStdString(); // cerr << "Plugin id is " << ladspaDescriptor->UniqueID // << ", identifier is \"" << identifier // << "\", category is \"" << category // << "\", name is " << ladspaDescriptor->Name // << ", label is " << ladspaDescriptor->Label // << endl; def_uri = lrdf_get_default_uri(ladspaDescriptor->UniqueID); if (def_uri) { defs = lrdf_get_setting_values(def_uri); } unsigned int controlPortNumber = 1; for (int i = 0; i < (int)ladspaDescriptor->PortCount; i++) { if (LADSPA_IS_PORT_CONTROL(ladspaDescriptor->PortDescriptors[i])) { if (def_uri && defs) { for (int j = 0; j < (int)defs->count; j++) { if (defs->items[j].pid == controlPortNumber) { // cerr << "Default for this port (" << defs->items[j].pid << ", " << defs->items[j].label << ") is " << defs->items[j].value << "; applying this to port number " << i << " with name " << ladspaDescriptor->PortNames[i] << endl; m_portDefaults[ladspaDescriptor->UniqueID][i] = defs->items[j].value; } } } ++controlPortNumber; } } #endif // HAVE_LRDF for (unsigned long i = 0; i < ladspaDescriptor->PortCount; i++) { if (LADSPA_IS_PORT_CONTROL(ladspaDescriptor->PortDescriptors[i])) { if (LADSPA_IS_PORT_INPUT(ladspaDescriptor->PortDescriptors[i])) { ++rtd->parameterCount; } else { if (strcmp(ladspaDescriptor->PortNames[i], "latency") && strcmp(ladspaDescriptor->PortNames[i], "_latency")) { ++rtd->controlOutputPortCount; rtd->controlOutputPortNames.push_back (ladspaDescriptor->PortNames[i]); } } } else { if (LADSPA_IS_PORT_INPUT(ladspaDescriptor->PortDescriptors[i])) { ++rtd->audioInputPortCount; } else if (LADSPA_IS_PORT_OUTPUT(ladspaDescriptor->PortDescriptors[i])) { ++rtd->audioOutputPortCount; } } } m_identifiers.push_back(identifier); m_rtDescriptors[identifier] = rtd; ++index; } if (DLCLOSE(libraryHandle) != 0) { cerr << "WARNING: DSSIPluginFactory::discoverPlugins - can't unload " << libraryHandle << endl; return; } } sonic-visualiser-3.0.3/svcore/plugin/DSSIPluginFactory.h0000644000000000000000000000351513111512442021361 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _DSSI_PLUGIN_FACTORY_H_ #define _DSSI_PLUGIN_FACTORY_H_ #define DSSI_API_LEVEL 2 #include "LADSPAPluginFactory.h" #include "api/dssi.h" #include class DSSIPluginInstance; class DSSIPluginFactory : public LADSPAPluginFactory { public: virtual ~DSSIPluginFactory(); virtual void enumeratePlugins(std::vector &list); virtual RealTimePluginInstance *instantiatePlugin(QString identifier, int clientId, int position, sv_samplerate_t sampleRate, int blockSize, int channels); protected: DSSIPluginFactory(); friend class RealTimePluginFactory; virtual PluginScan::PluginType getPluginType() const { return PluginScan::DSSIPlugin; } virtual std::vector getPluginPath(); virtual std::vector getLRDFPath(QString &baseUri); virtual void discoverPluginsFrom(QString soName); virtual const LADSPA_Descriptor *getLADSPADescriptor(QString identifier); virtual const DSSI_Descriptor *getDSSIDescriptor(QString identifier); DSSI_Host_Descriptor m_hostDescriptor; }; #endif sonic-visualiser-3.0.3/svcore/plugin/DSSIPluginInstance.cpp0000644000000000000000000010546713111512442022062 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include #include #include "DSSIPluginInstance.h" #include "PluginIdentifier.h" #include "LADSPAPluginFactory.h" #include #ifndef Q_OS_WIN32 #include #else #include #endif //#define DEBUG_DSSI 1 #define DEBUG_DSSI_PROCESS 1 #define EVENT_BUFFER_SIZE 1023 #ifdef DEBUG_DSSI static std::ostream &operator<<(std::ostream& o, const QString &s) { o << s; return o; } #endif DSSIPluginInstance::GroupMap DSSIPluginInstance::m_groupMap; snd_seq_event_t **DSSIPluginInstance::m_groupLocalEventBuffers = 0; size_t DSSIPluginInstance::m_groupLocalEventBufferCount = 0; Scavenger > DSSIPluginInstance::m_bufferScavenger(2, 10); std::map > DSSIPluginInstance::m_threads; DSSIPluginInstance::DSSIPluginInstance(RealTimePluginFactory *factory, int clientId, QString identifier, int position, sv_samplerate_t sampleRate, int blockSize, int idealChannelCount, const DSSI_Descriptor* descriptor) : RealTimePluginInstance(factory, identifier), m_client(clientId), m_position(position), m_instanceHandle(0), m_descriptor(descriptor), m_programCacheValid(false), m_eventBuffer(EVENT_BUFFER_SIZE), m_blockSize(blockSize), m_idealChannelCount(idealChannelCount), m_sampleRate(sampleRate), m_latencyPort(0), m_run(false), m_bypassed(false), m_grouped(false), m_haveLastEventSendTime(false) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::DSSIPluginInstance(" << identifier << ")" << endl; #endif init(); m_inputBuffers = new sample_t*[m_audioPortsIn.size()]; m_outputBuffers = new sample_t*[m_outputBufferCount]; for (size_t i = 0; i < m_audioPortsIn.size(); ++i) { m_inputBuffers[i] = new sample_t[blockSize]; } for (int i = 0; i < m_outputBufferCount; ++i) { m_outputBuffers[i] = new sample_t[blockSize]; } m_ownBuffers = true; m_pending.lsb = m_pending.msb = m_pending.program = -1; instantiate(sampleRate); if (isOK()) { connectPorts(); activate(); initialiseGroupMembership(); } } std::string DSSIPluginInstance::getIdentifier() const { return m_descriptor->LADSPA_Plugin->Label; } std::string DSSIPluginInstance::getName() const { return m_descriptor->LADSPA_Plugin->Name; } std::string DSSIPluginInstance::getDescription() const { return ""; } std::string DSSIPluginInstance::getMaker() const { return m_descriptor->LADSPA_Plugin->Maker; } int DSSIPluginInstance::getPluginVersion() const { return -1; } std::string DSSIPluginInstance::getCopyright() const { return m_descriptor->LADSPA_Plugin->Copyright; } DSSIPluginInstance::ParameterList DSSIPluginInstance::getParameterDescriptors() const { ParameterList list; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (!f) return list; for (int i = 0; in_range_for(m_controlPortsIn, i); ++i) { ParameterDescriptor pd; int pn = (int)m_controlPortsIn[i].first; pd.identifier = m_descriptor->LADSPA_Plugin->PortNames[pn]; pd.name = pd.identifier; pd.description = ""; pd.minValue = f->getPortMinimum(m_descriptor->LADSPA_Plugin, pn); pd.maxValue = f->getPortMaximum(m_descriptor->LADSPA_Plugin, pn); pd.defaultValue = f->getPortDefault(m_descriptor->LADSPA_Plugin, pn); float q = f->getPortQuantization(m_descriptor->LADSPA_Plugin, pn); if (q == 0.0) { pd.isQuantized = false; } else { pd.isQuantized = true; pd.quantizeStep = q; } list.push_back(pd); } return list; } float DSSIPluginInstance::getParameter(std::string id) const { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::getParameter(" << id << ")" << endl; #endif for (int i = 0; in_range_for(m_controlPortsIn, i); ++i) { if (id == m_descriptor->LADSPA_Plugin->PortNames[m_controlPortsIn[i].first]) { #ifdef DEBUG_DSSI cerr << "Matches port " << i << endl; #endif float v = getParameterValue(i); #ifdef DEBUG_DSSI SVDEBUG << "Returning " << v << endl; #endif return v; } } return 0.0; } void DSSIPluginInstance::setParameter(std::string id, float value) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::setParameter(" << id << ", " << value << ")" << endl; #endif for (int i = 0; in_range_for(m_controlPortsIn, i); ++i) { if (id == m_descriptor->LADSPA_Plugin->PortNames[m_controlPortsIn[i].first]) { setParameterValue(i, value); break; } } } void DSSIPluginInstance::init() { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::init" << endl; #endif // Discover ports numbers and identities // const LADSPA_Descriptor *descriptor = m_descriptor->LADSPA_Plugin; for (int i = 0; i < (int)descriptor->PortCount; ++i) { if (LADSPA_IS_PORT_AUDIO(descriptor->PortDescriptors[i])) { if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) { m_audioPortsIn.push_back(i); } else { m_audioPortsOut.push_back(i); } } else if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i])) { if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) { LADSPA_Data *data = new LADSPA_Data(0.0); m_controlPortsIn.push_back(std::pair (i, data)); m_backupControlPortsIn.push_back(0.0); } else { LADSPA_Data *data = new LADSPA_Data(0.0); m_controlPortsOut.push_back( std::pair(i, data)); if (!strcmp(descriptor->PortNames[i], "latency") || !strcmp(descriptor->PortNames[i], "_latency")) { #ifdef DEBUG_DSSI cerr << "Wooo! We have a latency port!" << endl; #endif m_latencyPort = data; } } } #ifdef DEBUG_DSSI else SVDEBUG << "DSSIPluginInstance::DSSIPluginInstance - " << "unrecognised port type" << endl; #endif } m_outputBufferCount = std::max(m_idealChannelCount, (int)m_audioPortsOut.size()); } sv_frame_t DSSIPluginInstance::getLatency() { sv_frame_t latency = 0; #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::getLatency(): m_latencyPort " << m_latencyPort << ", m_run " << m_run << endl; #endif if (m_latencyPort) { if (!m_run) { for (int i = 0; i < getAudioInputCount(); ++i) { for (int j = 0; j < m_blockSize; ++j) { m_inputBuffers[i][j] = 0.f; } } run(Vamp::RealTime::zeroTime); } latency = (sv_frame_t)(*m_latencyPort + 0.1); } #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::getLatency(): latency is " << latency << endl; #endif return latency; } void DSSIPluginInstance::silence() { if (m_instanceHandle != 0) { deactivate(); activate(); } } void DSSIPluginInstance::discardEvents() { m_eventBuffer.reset(); } void DSSIPluginInstance::setIdealChannelCount(int channels) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::setIdealChannelCount: channel count " << channels << " (was " << m_idealChannelCount << ")" << endl; #endif if (channels == m_idealChannelCount) { silence(); return; } if (m_instanceHandle != 0) { deactivate(); } m_idealChannelCount = channels; if (channels > m_outputBufferCount) { for (int i = 0; i < m_outputBufferCount; ++i) { delete[] m_outputBuffers[i]; } delete[] m_outputBuffers; m_outputBufferCount = channels; m_outputBuffers = new sample_t*[m_outputBufferCount]; for (int i = 0; i < m_outputBufferCount; ++i) { m_outputBuffers[i] = new sample_t[m_blockSize]; } connectPorts(); } if (m_instanceHandle != 0) { activate(); } } void DSSIPluginInstance::detachFromGroup() { if (!m_grouped) return; m_groupMap[m_identifier].erase(this); m_grouped = false; } void DSSIPluginInstance::initialiseGroupMembership() { if (!m_descriptor->run_multiple_synths) { m_grouped = false; return; } //!!! GroupMap is not actually thread-safe. size_t pluginsInGroup = m_groupMap[m_identifier].size(); if (++pluginsInGroup > m_groupLocalEventBufferCount) { size_t nextBufferCount = pluginsInGroup * 2; snd_seq_event_t **eventLocalBuffers = new snd_seq_event_t *[nextBufferCount]; for (size_t i = 0; i < m_groupLocalEventBufferCount; ++i) { eventLocalBuffers[i] = m_groupLocalEventBuffers[i]; } for (size_t i = m_groupLocalEventBufferCount; i < nextBufferCount; ++i) { eventLocalBuffers[i] = new snd_seq_event_t[EVENT_BUFFER_SIZE]; } if (m_groupLocalEventBuffers) { m_bufferScavenger.claim(new ScavengerArrayWrapper (m_groupLocalEventBuffers)); } m_groupLocalEventBuffers = eventLocalBuffers; m_groupLocalEventBufferCount = nextBufferCount; } m_grouped = true; m_groupMap[m_identifier].insert(this); } DSSIPluginInstance::~DSSIPluginInstance() { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::~DSSIPluginInstance" << endl; #endif if (m_threads.find(m_instanceHandle) != m_threads.end()) { for (std::set::iterator i = m_threads[m_instanceHandle].begin(); i != m_threads[m_instanceHandle].end(); ++i) { (*i)->setExiting(); (*i)->wait(); delete *i; } m_threads.erase(m_instanceHandle); } detachFromGroup(); if (m_instanceHandle != 0) { deactivate(); } cleanup(); for (int i = 0; in_range_for(m_controlPortsIn, i); ++i) delete m_controlPortsIn[i].second; for (int i = 0; in_range_for(m_controlPortsOut, i); ++i) delete m_controlPortsOut[i].second; m_controlPortsIn.clear(); m_controlPortsOut.clear(); if (m_ownBuffers) { for (int i = 0; i < getAudioInputCount(); ++i) { delete[] m_inputBuffers[i]; } for (int i = 0; i < m_outputBufferCount; ++i) { delete[] m_outputBuffers[i]; } delete[] m_inputBuffers; delete[] m_outputBuffers; } m_audioPortsIn.clear(); m_audioPortsOut.clear(); } void DSSIPluginInstance::instantiate(sv_samplerate_t sampleRate) { if (!m_descriptor) return; #ifdef DEBUG_DSSI cout << "DSSIPluginInstance::instantiate - plugin \"unique\" id = " << m_descriptor->LADSPA_Plugin->UniqueID << endl; #endif const LADSPA_Descriptor *descriptor = m_descriptor->LADSPA_Plugin; if (!descriptor->instantiate) { cerr << "Bad plugin: plugin id " << descriptor->UniqueID << ":" << descriptor->Label << " has no instantiate method!" << endl; return; } unsigned long pluginRate = (unsigned long)(sampleRate); if (sampleRate != sv_samplerate_t(pluginRate)) { cerr << "DSSIPluginInstance: WARNING: Non-integer sample rate " << sampleRate << " presented, rounding to " << pluginRate << endl; } m_instanceHandle = descriptor->instantiate(descriptor, pluginRate); if (m_instanceHandle) { if (m_descriptor->get_midi_controller_for_port) { for (int i = 0; i < (int)descriptor->PortCount; ++i) { if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i]) && LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) { int controller = m_descriptor->get_midi_controller_for_port (m_instanceHandle, i); if (controller != 0 && controller != 32 && DSSI_IS_CC(controller)) { m_controllerMap[DSSI_CC_NUMBER(controller)] = i; } } } } } } void DSSIPluginInstance::checkProgramCache() const { if (m_programCacheValid) return; m_cachedPrograms.clear(); #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::checkProgramCache" << endl; #endif if (!m_descriptor || !m_descriptor->get_program) { m_programCacheValid = true; return; } int index = 0; const DSSI_Program_Descriptor *programDescriptor; while ((programDescriptor = m_descriptor->get_program(m_instanceHandle, index))) { ++index; ProgramDescriptor d; d.bank = (int)programDescriptor->Bank; d.program = (int)programDescriptor->Program; d.name = programDescriptor->Name; m_cachedPrograms.push_back(d); } #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::checkProgramCache: have " << m_cachedPrograms.size() << " programs" << endl; #endif m_programCacheValid = true; } DSSIPluginInstance::ProgramList DSSIPluginInstance::getPrograms() const { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::getPrograms" << endl; #endif if (!m_descriptor) return ProgramList(); checkProgramCache(); ProgramList programs; for (std::vector::iterator i = m_cachedPrograms.begin(); i != m_cachedPrograms.end(); ++i) { programs.push_back(i->name); } return programs; } std::string DSSIPluginInstance::getProgram(int bank, int program) const { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::getProgram(" << bank << "," << program << ")" << endl; #endif if (!m_descriptor) return std::string(); checkProgramCache(); for (std::vector::iterator i = m_cachedPrograms.begin(); i != m_cachedPrograms.end(); ++i) { if (i->bank == bank && i->program == program) return i->name; } return std::string(); } int DSSIPluginInstance::getProgram(std::string name) const { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::getProgram(" << name << ")" << endl; #endif if (!m_descriptor) return 0; checkProgramCache(); int rv; for (std::vector::iterator i = m_cachedPrograms.begin(); i != m_cachedPrograms.end(); ++i) { if (i->name == name) { rv = i->bank; rv = (rv << 16) + i->program; return rv; } } return 0; } std::string DSSIPluginInstance::getCurrentProgram() const { return m_program; } void DSSIPluginInstance::selectProgram(std::string program) { selectProgramAux(program, true); } void DSSIPluginInstance::selectProgramAux(std::string program, bool backupPortValues) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::selectProgram(" << program << ")" << endl; #endif if (!m_descriptor) return; checkProgramCache(); if (!m_descriptor->select_program) return; bool found = false; int bankNo = 0, programNo = 0; for (std::vector::iterator i = m_cachedPrograms.begin(); i != m_cachedPrograms.end(); ++i) { if (i->name == program) { bankNo = i->bank; programNo = i->program; found = true; #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::selectProgram(" << program << "): found at bank " << bankNo << ", program " << programNo << endl; #endif break; } } if (!found) return; m_program = program; // DSSI select_program is an audio context call m_processLock.lock(); m_descriptor->select_program(m_instanceHandle, bankNo, programNo); m_processLock.unlock(); #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::selectProgram(" << program << "): made select_program(" << bankNo << "," << programNo << ") call" << endl; #endif if (backupPortValues) { for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) { m_backupControlPortsIn[i] = *m_controlPortsIn[i].second; } } } void DSSIPluginInstance::activate() { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::activate" << endl; #endif if (!m_descriptor || !m_descriptor->LADSPA_Plugin->activate) return; m_descriptor->LADSPA_Plugin->activate(m_instanceHandle); if (m_program != "") { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::activate: restoring program " << m_program << endl; #endif selectProgramAux(m_program, false); } for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::activate: setting port " << m_controlPortsIn[i].first << " to " << m_backupControlPortsIn[i] << endl; #endif *m_controlPortsIn[i].second = m_backupControlPortsIn[i]; } } void DSSIPluginInstance::connectPorts() { if (!m_descriptor || !m_descriptor->LADSPA_Plugin->connect_port) return; #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::connectPorts: " << getAudioInputCount() << " audio ports in, " << m_audioPortsOut.size() << " out, " << m_outputBufferCount << " output buffers" << endl; #endif assert(sizeof(LADSPA_Data) == sizeof(float)); assert(sizeof(sample_t) == sizeof(float)); LADSPAPluginFactory *f = dynamic_cast(m_factory); int inbuf = 0, outbuf = 0; for (int i = 0; i < getAudioInputCount(); ++i) { m_descriptor->LADSPA_Plugin->connect_port (m_instanceHandle, m_audioPortsIn[i], (LADSPA_Data *)m_inputBuffers[inbuf]); ++inbuf; } for (size_t i = 0; i < m_audioPortsOut.size(); ++i) { m_descriptor->LADSPA_Plugin->connect_port (m_instanceHandle, m_audioPortsOut[i], (LADSPA_Data *)m_outputBuffers[outbuf]); ++outbuf; } for (size_t i = 0; i < m_controlPortsIn.size(); ++i) { m_descriptor->LADSPA_Plugin->connect_port (m_instanceHandle, m_controlPortsIn[i].first, m_controlPortsIn[i].second); if (f) { float defaultValue = f->getPortDefault (m_descriptor->LADSPA_Plugin, (int)m_controlPortsIn[i].first); *m_controlPortsIn[i].second = defaultValue; m_backupControlPortsIn[i] = defaultValue; #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::connectPorts: set control port " << i << " to default value " << defaultValue << endl; #endif } } for (size_t i = 0; i < m_controlPortsOut.size(); ++i) { m_descriptor->LADSPA_Plugin->connect_port (m_instanceHandle, m_controlPortsOut[i].first, m_controlPortsOut[i].second); } } int DSSIPluginInstance::getParameterCount() const { return (int)m_controlPortsIn.size(); } void DSSIPluginInstance::setParameterValue(int parameter, float value) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::setParameterValue(" << parameter << ") to " << value << endl; #endif if (!in_range_for(m_controlPortsIn, parameter)) return; int portNumber = m_controlPortsIn[parameter].first; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (f) { if (value < f->getPortMinimum(m_descriptor->LADSPA_Plugin, portNumber)) { value = f->getPortMinimum(m_descriptor->LADSPA_Plugin, portNumber); } if (value > f->getPortMaximum(m_descriptor->LADSPA_Plugin, portNumber)) { value = f->getPortMaximum(m_descriptor->LADSPA_Plugin, portNumber); } } (*m_controlPortsIn[parameter].second) = value; m_backupControlPortsIn[parameter] = value; } void DSSIPluginInstance::setPortValueFromController(int port, int cv) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::setPortValueFromController(" << port << ") to " << cv << endl; #endif const LADSPA_Descriptor *p = m_descriptor->LADSPA_Plugin; LADSPA_PortRangeHintDescriptor d = p->PortRangeHints[port].HintDescriptor; LADSPA_Data lb = p->PortRangeHints[port].LowerBound; LADSPA_Data ub = p->PortRangeHints[port].UpperBound; float value = (float)cv; if (!LADSPA_IS_HINT_BOUNDED_BELOW(d)) { if (!LADSPA_IS_HINT_BOUNDED_ABOVE(d)) { /* unbounded: might as well leave the value alone. */ } else { /* bounded above only. just shift the range. */ value = ub - 127.0f + value; } } else { if (!LADSPA_IS_HINT_BOUNDED_ABOVE(d)) { /* bounded below only. just shift the range. */ value = lb + value; } else { /* bounded both ends. more interesting. */ /* XXX !!! todo: fill in logarithmic, sample rate &c */ value = lb + ((ub - lb) * value / 127.0f); } } for (int i = 0; in_range_for(m_controlPortsIn, i); ++i) { if (m_controlPortsIn[i].first == port) { setParameterValue(i, value); } } } float DSSIPluginInstance::getControlOutputValue(int output) const { if (!in_range_for(m_controlPortsOut, output)) return 0.0; return (*m_controlPortsOut[output].second); } float DSSIPluginInstance::getParameterValue(int parameter) const { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::getParameterValue(" << parameter << ")" << endl; #endif if (!in_range_for(m_controlPortsIn, parameter)) return 0.0; return (*m_controlPortsIn[parameter].second); } float DSSIPluginInstance::getParameterDefault(int parameter) const { if (!in_range_for(m_controlPortsIn, parameter)) return 0.0; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (f) { return f->getPortDefault(m_descriptor->LADSPA_Plugin, m_controlPortsIn[parameter].first); } else { return 0.0f; } } int DSSIPluginInstance::getParameterDisplayHint(int parameter) const { if (!in_range_for(m_controlPortsIn, parameter)) return 0.0; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (f) { return f->getPortDisplayHint(m_descriptor->LADSPA_Plugin, m_controlPortsIn[parameter].first); } else { return PortHint::NoHint; } } std::string DSSIPluginInstance::configure(std::string key, std::string value) { if (!m_descriptor || !m_descriptor->configure) return std::string(); if (key == PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY.toStdString()) { #ifdef DSSI_PROJECT_DIRECTORY_KEY key = DSSI_PROJECT_DIRECTORY_KEY; #else return std::string(); #endif } #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::configure(" << key << "," << value << ")" << endl; #endif char *message = m_descriptor->configure(m_instanceHandle, key.c_str(), value.c_str()); m_programCacheValid = false; m_configurationData[key] = value; std::string qm; // Ignore return values from reserved key configuration calls such // as project directory #ifdef DSSI_RESERVED_CONFIGURE_PREFIX if (QString(key.c_str()).startsWith(DSSI_RESERVED_CONFIGURE_PREFIX)) { return qm; } #endif if (message) { if (m_descriptor->LADSPA_Plugin && m_descriptor->LADSPA_Plugin->Label) { qm = std::string(m_descriptor->LADSPA_Plugin->Label) + ": "; } qm = qm + message; free(message); cerr << "DSSIPluginInstance::configure: warning: configure returned message: \"" << qm << "\"" << endl; } return qm; } void DSSIPluginInstance::sendEvent(const RealTime &eventTime, const void *e) { #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::sendEvent: last was " << m_lastEventSendTime << " (valid " << m_haveLastEventSendTime << "), this is " << eventTime << endl; #endif // The process mechanism only works correctly if the events are // sorted. It's the responsibility of the caller to ensure that: // we will happily drop events here if we find the timeline going // backwards. if (m_haveLastEventSendTime && m_lastEventSendTime > eventTime) { #ifdef DEBUG_DSSI_PROCESS cerr << "... clearing down" << endl; #endif m_haveLastEventSendTime = false; clearEvents(); } snd_seq_event_t *event = (snd_seq_event_t *)e; #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::sendEvent at " << eventTime << endl; #endif snd_seq_event_t ev(*event); ev.time.time.tv_sec = eventTime.sec; ev.time.time.tv_nsec = eventTime.nsec; // DSSI doesn't use MIDI channels, it uses run_multiple_synths instead. ev.data.note.channel = 0; m_eventBuffer.write(&ev, 1); m_lastEventSendTime = eventTime; m_haveLastEventSendTime = true; } void DSSIPluginInstance::clearEvents() { m_haveLastEventSendTime = false; m_eventBuffer.reset(); } bool DSSIPluginInstance::handleController(snd_seq_event_t *ev) { int controller = ev->data.control.param; #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::handleController " << controller << endl; #endif if (controller == 0) { // bank select MSB m_pending.msb = ev->data.control.value; } else if (controller == 32) { // bank select LSB m_pending.lsb = ev->data.control.value; } else if (controller > 0 && controller < 128) { if (m_controllerMap.find(controller) != m_controllerMap.end()) { int port = m_controllerMap[controller]; setPortValueFromController(port, ev->data.control.value); } else { return true; // pass through to plugin } } return false; } void DSSIPluginInstance::run(const RealTime &blockTime, int count) { static snd_seq_event_t localEventBuffer[EVENT_BUFFER_SIZE]; int evCount = 0; if (count == 0) count = m_blockSize; bool needLock = false; if (m_descriptor && m_descriptor->select_program) needLock = true; if (needLock) { if (!m_processLock.tryLock()) { for (size_t ch = 0; ch < m_audioPortsOut.size(); ++ch) { memset(m_outputBuffers[ch], 0, m_blockSize * sizeof(sample_t)); } return; } } if (m_grouped) { runGrouped(blockTime); goto done; } if (!m_descriptor || !m_descriptor->run_synth) { m_eventBuffer.skip(m_eventBuffer.getReadSpace()); m_haveLastEventSendTime = false; if (m_descriptor && m_descriptor->LADSPA_Plugin->run) { m_descriptor->LADSPA_Plugin->run(m_instanceHandle, count); } else { for (size_t ch = 0; ch < m_audioPortsOut.size(); ++ch) { memset(m_outputBuffers[ch], 0, m_blockSize * sizeof(sample_t)); } } m_run = true; if (needLock) m_processLock.unlock(); return; } #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::run(" << blockTime << ")" << endl; #endif #ifdef DEBUG_DSSI_PROCESS if (m_eventBuffer.getReadSpace() > 0) { SVDEBUG << "DSSIPluginInstance::run: event buffer has " << m_eventBuffer.getReadSpace() << " event(s) in it" << endl; } #endif while (m_eventBuffer.getReadSpace() > 0) { snd_seq_event_t *ev = localEventBuffer + evCount; *ev = m_eventBuffer.peekOne(); bool accept = true; RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec); sv_frame_t frameOffset = 0; if (evTime > blockTime) { frameOffset = RealTime::realTime2Frame(evTime - blockTime, m_sampleRate); } #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::run: evTime " << evTime << ", blockTime " << blockTime << ", frameOffset " << frameOffset << ", blockSize " << m_blockSize << endl; cerr << "Type: " << int(ev->type) << ", pitch: " << int(ev->data.note.note) << ", velocity: " << int(ev->data.note.velocity) << endl; #endif if (frameOffset >= (long)count) break; if (frameOffset < 0) { frameOffset = 0; if (ev->type == SND_SEQ_EVENT_NOTEON) { m_eventBuffer.skip(1); continue; } } ev->time.tick = (snd_seq_tick_time_t)frameOffset; m_eventBuffer.skip(1); if (ev->type == SND_SEQ_EVENT_CONTROLLER) { accept = handleController(ev); } else if (ev->type == SND_SEQ_EVENT_PGMCHANGE) { m_pending.program = ev->data.control.value; accept = false; } if (accept) { if (++evCount >= EVENT_BUFFER_SIZE) break; } } if (m_pending.program >= 0 && m_descriptor->select_program) { int program = m_pending.program; int bank = m_pending.lsb + 128 * m_pending.msb; #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::run: making select_program(" << bank << "," << program << ") call" << endl; #endif m_pending.lsb = m_pending.msb = m_pending.program = -1; m_descriptor->select_program(m_instanceHandle, bank, program); #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::run: made select_program(" << bank << "," << program << ") call" << endl; #endif } #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::run: running with " << evCount << " events" << endl; #endif m_descriptor->run_synth(m_instanceHandle, count, localEventBuffer, evCount); #ifdef DEBUG_DSSI_PROCESS // for (int i = 0; i < count; ++i) { // cout << m_outputBuffers[0][i] << " "; // if (i % 8 == 0) cout << endl; // } #endif done: if (needLock) m_processLock.unlock(); int numAudioOuts = int(m_audioPortsOut.size()); if (numAudioOuts == 0) { // copy inputs to outputs for (int ch = 0; ch < m_idealChannelCount; ++ch) { int sch = ch % getAudioInputCount(); for (int i = 0; i < m_blockSize; ++i) { m_outputBuffers[ch][i] = m_inputBuffers[sch][i]; } } } else if (m_idealChannelCount < numAudioOuts) { if (m_idealChannelCount == 1) { // mix down to mono for (int ch = 1; ch < numAudioOuts; ++ch) { for (int i = 0; i < m_blockSize; ++i) { m_outputBuffers[0][i] += m_outputBuffers[ch][i]; } } } } else if (m_idealChannelCount > numAudioOuts) { // duplicate for (int ch = numAudioOuts; ch < m_idealChannelCount; ++ch) { int sch = (ch - numAudioOuts) % numAudioOuts; for (int i = 0; i < m_blockSize; ++i) { m_outputBuffers[ch][i] = m_outputBuffers[sch][i]; } } } m_lastRunTime = blockTime; m_run = true; } void DSSIPluginInstance::runGrouped(const RealTime &blockTime) { // If something else in our group has just been called for this // block time (but we haven't) then we should just write out the // results and return; if we have just been called for this block // time or nothing else in the group has been, we should run the // whole group. bool needRun = true; PluginSet &s = m_groupMap[m_identifier]; #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::runGrouped(" << blockTime << "): this is " << this << "; " << s.size() << " elements in m_groupMap[" << m_identifier << "]" << endl; #endif if (m_lastRunTime != blockTime) { for (PluginSet::iterator i = s.begin(); i != s.end(); ++i) { DSSIPluginInstance *instance = *i; if (instance != this && instance->m_lastRunTime == blockTime) { #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::runGrouped(" << blockTime << "): plugin " << instance << " has already been run" << endl; #endif needRun = false; } } } if (!needRun) { #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::runGrouped(" << blockTime << "): already run, returning" << endl; #endif return; } #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::runGrouped(" << blockTime << "): I'm the first, running" << endl; #endif size_t index = 0; unsigned long *counts = (unsigned long *) alloca(m_groupLocalEventBufferCount * sizeof(unsigned long)); LADSPA_Handle *instances = (LADSPA_Handle *) alloca(m_groupLocalEventBufferCount * sizeof(LADSPA_Handle)); for (PluginSet::iterator i = s.begin(); i != s.end(); ++i) { if (index >= m_groupLocalEventBufferCount) break; DSSIPluginInstance *instance = *i; counts[index] = 0; instances[index] = instance->m_instanceHandle; #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::runGrouped(" << blockTime << "): running " << instance << endl; #endif if (instance->m_pending.program >= 0 && instance->m_descriptor->select_program) { int program = instance->m_pending.program; int bank = instance->m_pending.lsb + 128 * instance->m_pending.msb; instance->m_pending.lsb = instance->m_pending.msb = instance->m_pending.program = -1; instance->m_descriptor->select_program (instance->m_instanceHandle, bank, program); } while (instance->m_eventBuffer.getReadSpace() > 0) { snd_seq_event_t *ev = m_groupLocalEventBuffers[index] + counts[index]; *ev = instance->m_eventBuffer.peekOne(); bool accept = true; RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec); sv_frame_t frameOffset = 0; if (evTime > blockTime) { frameOffset = RealTime::realTime2Frame(evTime - blockTime, m_sampleRate); } #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::runGrouped: evTime " << evTime << ", frameOffset " << frameOffset << ", block size " << m_blockSize << endl; #endif if (frameOffset >= int(m_blockSize)) break; if (frameOffset < 0) frameOffset = 0; ev->time.tick = snd_seq_tick_time_t(frameOffset); instance->m_eventBuffer.skip(1); if (ev->type == SND_SEQ_EVENT_CONTROLLER) { accept = instance->handleController(ev); } else if (ev->type == SND_SEQ_EVENT_PGMCHANGE) { instance->m_pending.program = ev->data.control.value; accept = false; } if (accept) { if (++counts[index] >= EVENT_BUFFER_SIZE) break; } } ++index; } m_descriptor->run_multiple_synths(index, instances, m_blockSize, m_groupLocalEventBuffers, counts); } int DSSIPluginInstance::requestMidiSend(LADSPA_Handle /* instance */, unsigned char /* ports */, unsigned char /* channels */) { // This is called from a non-RT context (during instantiate) SVDEBUG << "DSSIPluginInstance::requestMidiSend" << endl; return 1; } void DSSIPluginInstance::midiSend(LADSPA_Handle /* instance */, snd_seq_event_t * /* events */, unsigned long /* eventCount */) { // This is likely to be called from an RT context SVDEBUG << "DSSIPluginInstance::midiSend" << endl; } void DSSIPluginInstance::NonRTPluginThread::run() { while (!m_exiting) { m_runFunction(m_handle); usleep(100000); } } int DSSIPluginInstance::requestNonRTThread(LADSPA_Handle instance, void (*runFunction)(LADSPA_Handle)) { NonRTPluginThread *thread = new NonRTPluginThread(instance, runFunction); m_threads[instance].insert(thread); thread->start(); return 0; } void DSSIPluginInstance::deactivate() { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::deactivate " << m_identifier << endl; #endif if (!m_descriptor || !m_descriptor->LADSPA_Plugin->deactivate) return; for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) { m_backupControlPortsIn[i] = *m_controlPortsIn[i].second; } m_descriptor->LADSPA_Plugin->deactivate(m_instanceHandle); #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::deactivate " << m_identifier << " done" << endl; #endif m_bufferScavenger.scavenge(); } void DSSIPluginInstance::cleanup() { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::cleanup " << m_identifier << endl; #endif if (!m_descriptor) return; if (!m_descriptor->LADSPA_Plugin->cleanup) { cerr << "Bad plugin: plugin id " << m_descriptor->LADSPA_Plugin->UniqueID << ":" << m_descriptor->LADSPA_Plugin->Label << " has no cleanup method!" << endl; return; } m_descriptor->LADSPA_Plugin->cleanup(m_instanceHandle); m_instanceHandle = 0; #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::cleanup " << m_identifier << " done" << endl; #endif } sonic-visualiser-3.0.3/svcore/plugin/DSSIPluginInstance.h0000644000000000000000000001622113111512442021514 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _DSSIPLUGININSTANCE_H_ #define _DSSIPLUGININSTANCE_H_ #define DSSI_API_LEVEL 2 #include #include #include #include #include #include "api/dssi.h" #include "base/RingBuffer.h" #include "base/Thread.h" #include "RealTimePluginInstance.h" #include "base/Scavenger.h" class DSSIPluginInstance : public RealTimePluginInstance { public: virtual ~DSSIPluginInstance(); virtual bool isOK() const { return m_instanceHandle != 0; } int getClientId() const { return m_client; } virtual QString getPluginIdentifier() const { return m_identifier; } int getPosition() const { return m_position; } virtual std::string getIdentifier() const; virtual std::string getName() const; virtual std::string getDescription() const; virtual std::string getMaker() const; virtual int getPluginVersion() const; virtual std::string getCopyright() const; virtual void run(const RealTime &, int count = 0); virtual int getParameterCount() const; virtual void setParameterValue(int parameter, float value); virtual float getParameterValue(int parameter) const; virtual float getParameterDefault(int parameter) const; virtual int getParameterDisplayHint(int parameter) const; virtual ParameterList getParameterDescriptors() const; virtual float getParameter(std::string) const; virtual void setParameter(std::string, float); virtual std::string configure(std::string key, std::string value); virtual void sendEvent(const RealTime &eventTime, const void *event); virtual void clearEvents(); virtual int getBufferSize() const { return m_blockSize; } virtual int getAudioInputCount() const { return (int)m_audioPortsIn.size(); } virtual int getAudioOutputCount() const { return m_idealChannelCount; } virtual sample_t **getAudioInputBuffers() { return m_inputBuffers; } virtual sample_t **getAudioOutputBuffers() { return m_outputBuffers; } virtual int getControlOutputCount() const { return (int)m_controlPortsOut.size(); } virtual float getControlOutputValue(int n) const; virtual ProgramList getPrograms() const; virtual std::string getCurrentProgram() const; virtual std::string getProgram(int bank, int program) const; virtual int getProgram(std::string name) const; virtual void selectProgram(std::string program); virtual bool isBypassed() const { return m_bypassed; } virtual void setBypassed(bool bypassed) { m_bypassed = bypassed; } virtual sv_frame_t getLatency(); virtual void silence(); virtual void discardEvents(); virtual void setIdealChannelCount(int channels); // may re-instantiate virtual bool isInGroup() const { return m_grouped; } virtual void detachFromGroup(); virtual std::string getType() const { return "DSSI Real-Time Plugin"; } protected: // To be constructed only by DSSIPluginFactory friend class DSSIPluginFactory; // Constructor that creates the buffers internally // DSSIPluginInstance(RealTimePluginFactory *factory, int client, QString identifier, int position, sv_samplerate_t sampleRate, int blockSize, int idealChannelCount, const DSSI_Descriptor* descriptor); void init(); void instantiate(sv_samplerate_t sampleRate); void cleanup(); void activate(); void deactivate(); void connectPorts(); bool handleController(snd_seq_event_t *ev); void setPortValueFromController(int portNumber, int controlValue); void selectProgramAux(std::string program, bool backupPortValues); void checkProgramCache() const; void initialiseGroupMembership(); void runGrouped(const RealTime &); // For use in DSSIPluginFactory (set in the DSSI_Host_Descriptor): static int requestMidiSend(LADSPA_Handle instance, unsigned char ports, unsigned char channels); static void midiSend(LADSPA_Handle instance, snd_seq_event_t *events, unsigned long eventCount); static int requestNonRTThread(LADSPA_Handle instance, void (*runFunction)(LADSPA_Handle)); int m_client; int m_position; LADSPA_Handle m_instanceHandle; const DSSI_Descriptor *m_descriptor; std::vector > m_controlPortsIn; std::vector > m_controlPortsOut; std::vector m_backupControlPortsIn; std::map m_controllerMap; std::vector m_audioPortsIn; std::vector m_audioPortsOut; struct ProgramControl { int msb; int lsb; int program; }; ProgramControl m_pending; struct ProgramDescriptor { int bank; int program; std::string name; }; mutable std::vector m_cachedPrograms; mutable bool m_programCacheValid; RingBuffer m_eventBuffer; int m_blockSize; sample_t **m_inputBuffers; sample_t **m_outputBuffers; bool m_ownBuffers; int m_idealChannelCount; int m_outputBufferCount; sv_samplerate_t m_sampleRate; float *m_latencyPort; bool m_run; bool m_bypassed; std::string m_program; bool m_grouped; RealTime m_lastRunTime; RealTime m_lastEventSendTime; bool m_haveLastEventSendTime; QMutex m_processLock; typedef std::set PluginSet; typedef std::map GroupMap; static GroupMap m_groupMap; static snd_seq_event_t **m_groupLocalEventBuffers; static size_t m_groupLocalEventBufferCount; static Scavenger > m_bufferScavenger; class NonRTPluginThread : public Thread { public: NonRTPluginThread(LADSPA_Handle handle, void (*runFunction)(LADSPA_Handle)) : m_handle(handle), m_runFunction(runFunction), m_exiting(false) { } virtual void run(); void setExiting() { m_exiting = true; } protected: LADSPA_Handle m_handle; void (*m_runFunction)(LADSPA_Handle); bool m_exiting; }; static std::map > m_threads; }; #endif // _DSSIPLUGININSTANCE_H_ sonic-visualiser-3.0.3/svcore/plugin/FeatureExtractionPluginFactory.cpp0000644000000000000000000000320413111512442024601 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PiperVampPluginFactory.h" #include "NativeVampPluginFactory.h" #include #include #include "base/Preferences.h" #include "base/Debug.h" FeatureExtractionPluginFactory * FeatureExtractionPluginFactory::instance() { static QMutex mutex; static FeatureExtractionPluginFactory *instance = 0; QMutexLocker locker(&mutex); if (!instance) { #ifdef HAVE_PIPER if (Preferences::getInstance()->getRunPluginsInProcess()) { SVDEBUG << "FeatureExtractionPluginFactory: in-process preference set, using native factory" << endl; instance = new NativeVampPluginFactory(); } else { SVDEBUG << "FeatureExtractionPluginFactory: in-process preference not set, using Piper factory" << endl; instance = new PiperVampPluginFactory(); } #else SVDEBUG << "FeatureExtractionPluginFactory: no Piper support compiled in, using native factory" << endl; instance = new NativeVampPluginFactory(); #endif } return instance; } sonic-visualiser-3.0.3/svcore/plugin/FeatureExtractionPluginFactory.h0000644000000000000000000000415013111512442024247 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_FEATURE_EXTRACTION_PLUGIN_FACTORY_H #define SV_FEATURE_EXTRACTION_PLUGIN_FACTORY_H #include #include "vamp-support/PluginStaticData.h" #include "base/BaseTypes.h" #include class FeatureExtractionPluginFactory { public: static FeatureExtractionPluginFactory *instance(); virtual ~FeatureExtractionPluginFactory() { } /** * Return all installed plugin identifiers. */ virtual std::vector getPluginIdentifiers(QString &errorMessage) { return instance()->getPluginIdentifiers(errorMessage); } /** * Return static data for the given plugin. */ virtual piper_vamp::PluginStaticData getPluginStaticData(QString identifier) { return instance()->getPluginStaticData(identifier); } /** * Instantiate (load) and return pointer to the plugin with the * given identifier, at the given sample rate. We don't set * blockSize or channels on this -- they're negotiated and handled * via initialize() on the plugin itself after loading. */ virtual Vamp::Plugin *instantiatePlugin(QString identifier, sv_samplerate_t inputSampleRate) { return instance()->instantiatePlugin(identifier, inputSampleRate); } /** * Get category metadata about a plugin (without instantiating it). */ virtual QString getPluginCategory(QString identifier) { return instance()->getPluginCategory(identifier); } }; #endif sonic-visualiser-3.0.3/svcore/plugin/LADSPAPluginFactory.cpp0000644000000000000000000006041713111512442022122 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and Richard Bown. */ #include "LADSPAPluginFactory.h" #include #include #include #include #include #include "LADSPAPluginInstance.h" #include "PluginIdentifier.h" #include "system/System.h" #include "base/Preferences.h" #include "base/Profiler.h" //#define DEBUG_LADSPA_PLUGIN_FACTORY 1 #ifdef HAVE_LRDF #include "lrdf.h" #endif // HAVE_LRDF LADSPAPluginFactory::LADSPAPluginFactory() { #ifdef HAVE_LRDF lrdf_init(); #endif } LADSPAPluginFactory::~LADSPAPluginFactory() { for (std::set::iterator i = m_instances.begin(); i != m_instances.end(); ++i) { (*i)->setFactory(0); delete *i; } m_instances.clear(); unloadUnusedLibraries(); #ifdef HAVE_LRDF lrdf_cleanup(); #endif // HAVE_LRDF } const std::vector & LADSPAPluginFactory::getPluginIdentifiers() const { return m_identifiers; } void LADSPAPluginFactory::enumeratePlugins(std::vector &list) { Profiler profiler("LADSPAPluginFactory::enumeratePlugins"); for (std::vector::iterator i = m_identifiers.begin(); i != m_identifiers.end(); ++i) { const LADSPA_Descriptor *descriptor = getLADSPADescriptor(*i); if (!descriptor) { cerr << "WARNING: LADSPAPluginFactory::enumeratePlugins: couldn't get descriptor for identifier " << *i << endl; continue; } list.push_back(*i); list.push_back(descriptor->Name); list.push_back(QString("%1").arg(descriptor->UniqueID)); list.push_back(descriptor->Label); list.push_back(descriptor->Maker); list.push_back(descriptor->Copyright); list.push_back("false"); // is synth list.push_back("false"); // is grouped if (m_taxonomy.find(*i) != m_taxonomy.end() && m_taxonomy[*i] != "") { // cerr << "LADSPAPluginFactory: cat for " << *i << " found in taxonomy as " << m_taxonomy[descriptor->UniqueID] << endl; list.push_back(m_taxonomy[*i]); } else { list.push_back(""); // cerr << "LADSPAPluginFactory: cat for " << *i << " not found (despite having " << m_fallbackCategories.size() << " fallbacks)" << endl; } list.push_back(QString("%1").arg(descriptor->PortCount)); for (int p = 0; p < (int)descriptor->PortCount; ++p) { int type = 0; if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[p])) { type |= PortType::Control; } else { type |= PortType::Audio; } if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[p])) { type |= PortType::Input; } else { type |= PortType::Output; } list.push_back(QString("%1").arg(p)); list.push_back(descriptor->PortNames[p]); list.push_back(QString("%1").arg(type)); list.push_back(QString("%1").arg(getPortDisplayHint(descriptor, p))); list.push_back(QString("%1").arg(getPortMinimum(descriptor, p))); list.push_back(QString("%1").arg(getPortMaximum(descriptor, p))); list.push_back(QString("%1").arg(getPortDefault(descriptor, p))); } } unloadUnusedLibraries(); } const RealTimePluginDescriptor * LADSPAPluginFactory::getPluginDescriptor(QString identifier) const { std::map::const_iterator i = m_rtDescriptors.find(identifier); if (i != m_rtDescriptors.end()) { return i->second; } return 0; } float LADSPAPluginFactory::getPortMinimum(const LADSPA_Descriptor *descriptor, int port) { LADSPA_PortRangeHintDescriptor d = descriptor->PortRangeHints[port].HintDescriptor; float minimum = 0.f; if (LADSPA_IS_HINT_BOUNDED_BELOW(d)) { float lb = descriptor->PortRangeHints[port].LowerBound; minimum = lb; } else if (LADSPA_IS_HINT_BOUNDED_ABOVE(d)) { float ub = descriptor->PortRangeHints[port].UpperBound; minimum = std::min(0.f, ub - 1.f); } if (LADSPA_IS_HINT_SAMPLE_RATE(d)) { minimum = float(minimum * m_sampleRate); } if (LADSPA_IS_HINT_LOGARITHMIC(d)) { if (minimum == 0.f) minimum = 1.f; } return minimum; } float LADSPAPluginFactory::getPortMaximum(const LADSPA_Descriptor *descriptor, int port) { LADSPA_PortRangeHintDescriptor d = descriptor->PortRangeHints[port].HintDescriptor; float maximum = 1.f; if (LADSPA_IS_HINT_BOUNDED_ABOVE(d)) { float ub = descriptor->PortRangeHints[port].UpperBound; maximum = ub; } else { float lb = descriptor->PortRangeHints[port].LowerBound; maximum = lb + 1.f; } if (LADSPA_IS_HINT_SAMPLE_RATE(d)) { maximum = float(maximum * m_sampleRate); } return maximum; } float LADSPAPluginFactory::getPortDefault(const LADSPA_Descriptor *descriptor, int port) { float minimum = getPortMinimum(descriptor, port); float maximum = getPortMaximum(descriptor, port); float deft; if (m_portDefaults.find(descriptor->UniqueID) != m_portDefaults.end()) { if (m_portDefaults[descriptor->UniqueID].find(port) != m_portDefaults[descriptor->UniqueID].end()) { deft = m_portDefaults[descriptor->UniqueID][port]; if (deft < minimum) deft = minimum; if (deft > maximum) deft = maximum; return deft; } } LADSPA_PortRangeHintDescriptor d = descriptor->PortRangeHints[port].HintDescriptor; bool logarithmic = LADSPA_IS_HINT_LOGARITHMIC(d); float logmin = 0, logmax = 0; if (logarithmic) { float thresh = powf(10, -10); if (minimum < thresh) logmin = -10; else logmin = log10f(minimum); if (maximum < thresh) logmax = -10; else logmax = log10f(maximum); } // SVDEBUG << "LADSPAPluginFactory::getPortDefault: hint = " << d << endl; if (!LADSPA_IS_HINT_HAS_DEFAULT(d)) { deft = minimum; } else if (LADSPA_IS_HINT_DEFAULT_MINIMUM(d)) { deft = minimum; } else if (LADSPA_IS_HINT_DEFAULT_LOW(d)) { if (logarithmic) { deft = powf(10, logmin * 0.75f + logmax * 0.25f); } else { deft = minimum * 0.75f + maximum * 0.25f; } } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(d)) { if (logarithmic) { deft = powf(10, logmin * 0.5f + logmax * 0.5f); } else { deft = minimum * 0.5f + maximum * 0.5f; } } else if (LADSPA_IS_HINT_DEFAULT_HIGH(d)) { if (logarithmic) { deft = powf(10, logmin * 0.25f + logmax * 0.75f); } else { deft = minimum * 0.25f + maximum * 0.75f; } } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(d)) { deft = maximum; } else if (LADSPA_IS_HINT_DEFAULT_0(d)) { deft = 0.0; } else if (LADSPA_IS_HINT_DEFAULT_1(d)) { deft = 1.0; } else if (LADSPA_IS_HINT_DEFAULT_100(d)) { deft = 100.0; } else if (LADSPA_IS_HINT_DEFAULT_440(d)) { // deft = 440.0; deft = (float)Preferences::getInstance()->getTuningFrequency(); } else { deft = minimum; } //!!! No -- the min and max have already been multiplied by the rate, //so it would happen twice if we did it here -- and e.g. DEFAULT_440 //doesn't want to be multiplied by the rate either // if (LADSPA_IS_HINT_SAMPLE_RATE(d)) { // deft *= m_sampleRate; // } return deft; } float LADSPAPluginFactory::getPortQuantization(const LADSPA_Descriptor *descriptor, int port) { int displayHint = getPortDisplayHint(descriptor, port); if (displayHint & PortHint::Toggled) { return float(lrintf(getPortMaximum(descriptor, port)) - lrintf(getPortMinimum(descriptor, port))); } if (displayHint & PortHint::Integer) { return 1.0; } return 0.0; } int LADSPAPluginFactory::getPortDisplayHint(const LADSPA_Descriptor *descriptor, int port) { LADSPA_PortRangeHintDescriptor d = descriptor->PortRangeHints[port].HintDescriptor; int hint = PortHint::NoHint; if (LADSPA_IS_HINT_TOGGLED(d)) hint |= PortHint::Toggled; if (LADSPA_IS_HINT_INTEGER(d)) hint |= PortHint::Integer; if (LADSPA_IS_HINT_LOGARITHMIC(d)) hint |= PortHint::Logarithmic; return hint; } RealTimePluginInstance * LADSPAPluginFactory::instantiatePlugin(QString identifier, int instrument, int position, sv_samplerate_t sampleRate, int blockSize, int channels) { Profiler profiler("LADSPAPluginFactory::instantiatePlugin"); const LADSPA_Descriptor *descriptor = getLADSPADescriptor(identifier); if (descriptor) { LADSPAPluginInstance *instance = new LADSPAPluginInstance (this, instrument, identifier, position, sampleRate, blockSize, channels, descriptor); m_instances.insert(instance); #ifdef DEBUG_LADSPA_PLUGIN_FACTORY SVDEBUG << "LADSPAPluginFactory::instantiatePlugin(" << identifier << ": now have " << m_instances.size() << " instances" << endl; #endif return instance; } return 0; } void LADSPAPluginFactory::releasePlugin(RealTimePluginInstance *instance, QString identifier) { Profiler profiler("LADSPAPluginFactory::releasePlugin"); if (m_instances.find(instance) == m_instances.end()) { cerr << "WARNING: LADSPAPluginFactory::releasePlugin: Not one of mine!" << endl; return; } QString type, soname, label; PluginIdentifier::parseIdentifier(identifier, type, soname, label); m_instances.erase(instance); bool stillInUse = false; for (std::set::iterator ii = m_instances.begin(); ii != m_instances.end(); ++ii) { QString itype, isoname, ilabel; PluginIdentifier::parseIdentifier((*ii)->getPluginIdentifier(), itype, isoname, ilabel); if (isoname == soname) { #ifdef DEBUG_LADSPA_PLUGIN_FACTORY SVDEBUG << "LADSPAPluginFactory::releasePlugin: dll " << soname << " is still in use for plugin " << ilabel << endl; #endif stillInUse = true; break; } } if (!stillInUse) { if (soname != PluginIdentifier::BUILTIN_PLUGIN_SONAME) { #ifdef DEBUG_LADSPA_PLUGIN_FACTORY SVDEBUG << "LADSPAPluginFactory::releasePlugin: dll " << soname << " no longer in use, unloading" << endl; #endif unloadLibrary(soname); } } #ifdef DEBUG_LADSPA_PLUGIN_FACTORY SVDEBUG << "LADSPAPluginFactory::releasePlugin(" << identifier << ": now have " << m_instances.size() << " instances" << endl; #endif } const LADSPA_Descriptor * LADSPAPluginFactory::getLADSPADescriptor(QString identifier) { QString type, soname, label; PluginIdentifier::parseIdentifier(identifier, type, soname, label); if (m_libraryHandles.find(soname) == m_libraryHandles.end()) { loadLibrary(soname); if (m_libraryHandles.find(soname) == m_libraryHandles.end()) { cerr << "WARNING: LADSPAPluginFactory::getLADSPADescriptor: loadLibrary failed for " << soname << endl; return 0; } } void *libraryHandle = m_libraryHandles[soname]; LADSPA_Descriptor_Function fn = (LADSPA_Descriptor_Function) DLSYM(libraryHandle, "ladspa_descriptor"); if (!fn) { cerr << "WARNING: LADSPAPluginFactory::getLADSPADescriptor: No descriptor function in library " << soname << endl; return 0; } const LADSPA_Descriptor *descriptor = 0; int index = 0; while ((descriptor = fn(index))) { if (descriptor->Label == label) return descriptor; ++index; } cerr << "WARNING: LADSPAPluginFactory::getLADSPADescriptor: No such plugin as " << label << " in library " << soname << endl; return 0; } void LADSPAPluginFactory::loadLibrary(QString soName) { void *libraryHandle = DLOPEN(soName, RTLD_NOW); if (libraryHandle) { m_libraryHandles[soName] = libraryHandle; SVDEBUG << "LADSPAPluginFactory::loadLibrary: Loaded library \"" << soName << "\"" << endl; return; } if (QFileInfo(soName).exists()) { DLERROR(); cerr << "LADSPAPluginFactory::loadLibrary: Library \"" << soName << "\" exists, but failed to load it" << endl; return; } std::vector pathList = getPluginPath(); QString fileName = QFile(soName).fileName(); QString base = QFileInfo(soName).baseName(); for (std::vector::iterator i = pathList.begin(); i != pathList.end(); ++i) { #ifdef DEBUG_LADSPA_PLUGIN_FACTORY SVDEBUG << "Looking at: " << (*i) << endl; #endif QDir dir(*i, PLUGIN_GLOB, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::Readable); if (QFileInfo(dir.filePath(fileName)).exists()) { #ifdef DEBUG_LADSPA_PLUGIN_FACTORY cerr << "Loading: " << fileName << endl; #endif libraryHandle = DLOPEN(dir.filePath(fileName), RTLD_NOW); if (libraryHandle) { m_libraryHandles[soName] = libraryHandle; return; } } for (unsigned int j = 0; j < dir.count(); ++j) { QString file = dir.filePath(dir[j]); if (QFileInfo(file).baseName() == base) { #ifdef DEBUG_LADSPA_PLUGIN_FACTORY cerr << "Loading: " << file << endl; #endif libraryHandle = DLOPEN(file, RTLD_NOW); if (libraryHandle) { m_libraryHandles[soName] = libraryHandle; return; } } } } cerr << "LADSPAPluginFactory::loadLibrary: Failed to locate plugin library \"" << soName << "\"" << endl; } void LADSPAPluginFactory::unloadLibrary(QString soName) { LibraryHandleMap::iterator li = m_libraryHandles.find(soName); if (li != m_libraryHandles.end()) { // SVDEBUG << "unloading " << soname << endl; DLCLOSE(m_libraryHandles[soName]); m_libraryHandles.erase(li); } } void LADSPAPluginFactory::unloadUnusedLibraries() { std::vector toUnload; for (LibraryHandleMap::iterator i = m_libraryHandles.begin(); i != m_libraryHandles.end(); ++i) { bool stillInUse = false; for (std::set::iterator ii = m_instances.begin(); ii != m_instances.end(); ++ii) { QString itype, isoname, ilabel; PluginIdentifier::parseIdentifier((*ii)->getPluginIdentifier(), itype, isoname, ilabel); if (isoname == i->first) { stillInUse = true; break; } } if (!stillInUse) toUnload.push_back(i->first); } for (std::vector::iterator i = toUnload.begin(); i != toUnload.end(); ++i) { if (*i != PluginIdentifier::BUILTIN_PLUGIN_SONAME) { unloadLibrary(*i); } } } // It is only later, after they've gone, // I realize they have delivered a letter. // It's a letter from my wife. "What are you doing // there?" my wife asks. "Are you drinking?" // I study the postmark for hours. Then it, too, begins to fade. // I hope someday to forget all this. std::vector LADSPAPluginFactory::getPluginPath() { std::vector pathList; std::string path; char *cpath = getenv("LADSPA_PATH"); if (cpath) path = cpath; if (path == "") { path = DEFAULT_LADSPA_PATH; char *home = getenv("HOME"); if (home) { std::string::size_type f; while ((f = path.find("$HOME")) != std::string::npos && f < path.length()) { path.replace(f, 5, home); } } #ifdef _WIN32 const char *pfiles = getenv("ProgramFiles"); if (!pfiles) pfiles = "C:\\Program Files"; { std::string::size_type f; while ((f = path.find("%ProgramFiles%")) != std::string::npos && f < path.length()) { path.replace(f, 14, pfiles); } } #endif } std::string::size_type index = 0, newindex = 0; while ((newindex = path.find(PATH_SEPARATOR, index)) < path.size()) { pathList.push_back(path.substr(index, newindex - index).c_str()); index = newindex + 1; } pathList.push_back(path.substr(index).c_str()); return pathList; } std::vector LADSPAPluginFactory::getLRDFPath(QString &baseUri) { std::vector lrdfPaths; #ifdef HAVE_LRDF std::vector pathList = getPluginPath(); lrdfPaths.push_back("/usr/local/share/ladspa/rdf"); lrdfPaths.push_back("/usr/share/ladspa/rdf"); for (std::vector::iterator i = pathList.begin(); i != pathList.end(); ++i) { lrdfPaths.push_back(*i + "/rdf"); } baseUri = LADSPA_BASE; #else baseUri = ""; #endif return lrdfPaths; } void LADSPAPluginFactory::discoverPlugins() { Profiler profiler("LADSPAPluginFactory::discoverPlugins"); std::vector pathList = getPluginPath(); // SVDEBUG << "LADSPAPluginFactory::discoverPlugins - " // << "discovering plugins; path is "; // for (std::vector::iterator i = pathList.begin(); // i != pathList.end(); ++i) { // SVDEBUG << "[" << i-<< "] "; // } // SVDEBUG << endl; #ifdef HAVE_LRDF // read the description files // QString baseUri; std::vector lrdfPaths = getLRDFPath(baseUri); bool haveSomething = false; for (size_t i = 0; i < lrdfPaths.size(); ++i) { QDir dir(lrdfPaths[i], "*.rdf;*.rdfs"); for (unsigned int j = 0; j < dir.count(); ++j) { if (!lrdf_read_file(QString("file:" + lrdfPaths[i] + "/" + dir[j]).toStdString().c_str())) { // cerr << "LADSPAPluginFactory: read RDF file " << (lrdfPaths[i] + "/" + dir[j]) << endl; haveSomething = true; } } } if (haveSomething) { generateTaxonomy(baseUri + "Plugin", ""); } #endif // HAVE_LRDF generateFallbackCategories(); auto candidates = PluginScan::getInstance()->getCandidateLibrariesFor(getPluginType()); for (auto c: candidates) { discoverPluginsFrom(c.libraryPath); } } void LADSPAPluginFactory::discoverPluginsFrom(QString soname) { void *libraryHandle = DLOPEN(soname, RTLD_LAZY); if (!libraryHandle) { cerr << "WARNING: LADSPAPluginFactory::discoverPlugins: couldn't load plugin library " << soname << " - " << DLERROR() << endl; return; } LADSPA_Descriptor_Function fn = (LADSPA_Descriptor_Function) DLSYM(libraryHandle, "ladspa_descriptor"); if (!fn) { cerr << "WARNING: LADSPAPluginFactory::discoverPlugins: No descriptor function in " << soname << endl; return; } const LADSPA_Descriptor *descriptor = 0; int index = 0; while ((descriptor = fn(index))) { RealTimePluginDescriptor *rtd = new RealTimePluginDescriptor; rtd->name = descriptor->Name; rtd->label = descriptor->Label; rtd->maker = descriptor->Maker; rtd->copyright = descriptor->Copyright; rtd->category = ""; rtd->isSynth = false; rtd->parameterCount = 0; rtd->audioInputPortCount = 0; rtd->audioOutputPortCount = 0; rtd->controlOutputPortCount = 0; QString identifier = PluginIdentifier::createIdentifier ("ladspa", soname, descriptor->Label); #ifdef HAVE_LRDF char *def_uri = 0; lrdf_defaults *defs = 0; if (m_lrdfTaxonomy[descriptor->UniqueID] != "") { m_taxonomy[identifier] = m_lrdfTaxonomy[descriptor->UniqueID]; // cerr << "set id \"" << identifier << "\" to cat \"" << m_taxonomy[identifier] << "\" from LRDF" << endl; // cout << identifier << "::" << m_taxonomy[identifier] << endl; } QString category = m_taxonomy[identifier]; if (category == "") { std::string name = rtd->name; if (name.length() > 4 && name.substr(name.length() - 4) == " VST") { category = "VST effects"; m_taxonomy[identifier] = category; } } rtd->category = category.toStdString(); // cerr << "Plugin id is " << descriptor->UniqueID // << ", category is \"" << (category ? category : QString("(none)")) // << "\", name is " << descriptor->Name // << ", label is " << descriptor->Label // << endl; def_uri = lrdf_get_default_uri(descriptor->UniqueID); if (def_uri) { defs = lrdf_get_setting_values(def_uri); } unsigned int controlPortNumber = 1; for (int i = 0; i < (int)descriptor->PortCount; i++) { if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i])) { if (def_uri && defs) { for (unsigned int j = 0; j < defs->count; j++) { if (defs->items[j].pid == controlPortNumber) { // cerr << "Default for this port (" << defs->items[j].pid << ", " << defs->items[j].label << ") is " << defs->items[j].value << "; applying this to port number " << i << " with name " << descriptor->PortNames[i] << endl; m_portDefaults[descriptor->UniqueID][i] = defs->items[j].value; } } } ++controlPortNumber; } } #endif // HAVE_LRDF for (int i = 0; i < (int)descriptor->PortCount; i++) { if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i])) { if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) { ++rtd->parameterCount; } else { if (strcmp(descriptor->PortNames[i], "latency") && strcmp(descriptor->PortNames[i], "_latency")) { ++rtd->controlOutputPortCount; rtd->controlOutputPortNames.push_back (descriptor->PortNames[i]); } } } else { if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) { ++rtd->audioInputPortCount; } else if (LADSPA_IS_PORT_OUTPUT(descriptor->PortDescriptors[i])) { ++rtd->audioOutputPortCount; } } } m_identifiers.push_back(identifier); m_rtDescriptors[identifier] = rtd; ++index; } if (DLCLOSE(libraryHandle) != 0) { cerr << "WARNING: LADSPAPluginFactory::discoverPlugins - can't unload " << libraryHandle << endl; return; } } void LADSPAPluginFactory::generateFallbackCategories() { std::vector pluginPath = getPluginPath(); std::vector path; for (size_t i = 0; i < pluginPath.size(); ++i) { if (pluginPath[i].contains("/lib/")) { QString p(pluginPath[i]); path.push_back(p); p.replace("/lib/", "/share/"); path.push_back(p); // SVDEBUG << "LADSPAPluginFactory::generateFallbackCategories: path element " << p << endl; } path.push_back(pluginPath[i]); // SVDEBUG << "LADSPAPluginFactory::generateFallbackCategories: path element " << pluginPath[i] << endl; } for (size_t i = 0; i < path.size(); ++i) { QDir dir(path[i], "*.cat"); // SVDEBUG << "LADSPAPluginFactory::generateFallbackCategories: directory " << path[i] << " has " << dir.count() << " .cat files" << endl; for (unsigned int j = 0; j < dir.count(); ++j) { QFile file(path[i] + "/" + dir[j]); // SVDEBUG << "LADSPAPluginFactory::generateFallbackCategories: about to open " << (path[i]+ "/" + dir[j]) << endl; if (file.open(QIODevice::ReadOnly)) { // cerr << "...opened" << endl; QTextStream stream(&file); QString line; while (!stream.atEnd()) { line = stream.readLine(); // cerr << "line is: \"" << line << "\"" << endl; QString id = PluginIdentifier::canonicalise (line.section("::", 0, 0)); QString cat = line.section("::", 1, 1); m_taxonomy[id] = cat; // cerr << "set id \"" << id << "\" to cat \"" << cat << "\"" << endl; } } } } } void LADSPAPluginFactory::generateTaxonomy(QString uri, QString base) { #ifdef HAVE_LRDF lrdf_uris *uris = lrdf_get_instances(uri.toStdString().c_str()); if (uris != NULL) { for (unsigned int i = 0; i < uris->count; ++i) { m_lrdfTaxonomy[lrdf_get_uid(uris->items[i])] = base; } lrdf_free_uris(uris); } uris = lrdf_get_subclasses(uri.toStdString().c_str()); if (uris != NULL) { for (unsigned int i = 0; i < uris->count; ++i) { char *label = lrdf_get_label(uris->items[i]); generateTaxonomy(uris->items[i], base + (base.length() > 0 ? " > " : "") + label); } lrdf_free_uris(uris); } #else // avoid unused parameter (void)uri; (void)base; #endif } QString LADSPAPluginFactory::getPluginCategory(QString identifier) { return m_taxonomy[identifier]; } sonic-visualiser-3.0.3/svcore/plugin/LADSPAPluginFactory.h0000644000000000000000000000607213111512442021564 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and Richard Bown. */ #ifndef _LADSPA_PLUGIN_FACTORY_H_ #define _LADSPA_PLUGIN_FACTORY_H_ #include "RealTimePluginFactory.h" #include "api/ladspa.h" #include "PluginScan.h" #include #include #include #include class LADSPAPluginInstance; class LADSPAPluginFactory : public RealTimePluginFactory { public: virtual ~LADSPAPluginFactory(); virtual void discoverPlugins(); virtual const std::vector &getPluginIdentifiers() const; virtual void enumeratePlugins(std::vector &list); virtual const RealTimePluginDescriptor *getPluginDescriptor(QString identifier) const; virtual RealTimePluginInstance *instantiatePlugin(QString identifier, int clientId, int position, sv_samplerate_t sampleRate, int blockSize, int channels); virtual QString getPluginCategory(QString identifier); float getPortMinimum(const LADSPA_Descriptor *, int port); float getPortMaximum(const LADSPA_Descriptor *, int port); float getPortDefault(const LADSPA_Descriptor *, int port); float getPortQuantization(const LADSPA_Descriptor *, int port); int getPortDisplayHint(const LADSPA_Descriptor *, int port); protected: LADSPAPluginFactory(); friend class RealTimePluginFactory; virtual PluginScan::PluginType getPluginType() const { return PluginScan::LADSPAPlugin; } virtual std::vector getPluginPath(); virtual std::vector getLRDFPath(QString &baseUri); virtual void discoverPluginsFrom(QString soName); virtual void generateTaxonomy(QString uri, QString base); virtual void generateFallbackCategories(); virtual void releasePlugin(RealTimePluginInstance *, QString); virtual const LADSPA_Descriptor *getLADSPADescriptor(QString identifier); void loadLibrary(QString soName); void unloadLibrary(QString soName); void unloadUnusedLibraries(); std::vector m_identifiers; std::map m_rtDescriptors; std::map m_taxonomy; std::map m_lrdfTaxonomy; std::map > m_portDefaults; std::set m_instances; typedef std::map LibraryHandleMap; LibraryHandleMap m_libraryHandles; }; #endif sonic-visualiser-3.0.3/svcore/plugin/LADSPAPluginInstance.cpp0000644000000000000000000003613713111512442022261 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam, Richard Bown, and QMUL. */ #include #include #include "LADSPAPluginInstance.h" #include "LADSPAPluginFactory.h" #ifdef HAVE_LRDF #include "lrdf.h" #endif // HAVE_LRDF //#define DEBUG_LADSPA 1 #include LADSPAPluginInstance::LADSPAPluginInstance(RealTimePluginFactory *factory, int clientId, QString identifier, int position, sv_samplerate_t sampleRate, int blockSize, int idealChannelCount, const LADSPA_Descriptor* descriptor) : RealTimePluginInstance(factory, identifier), m_client(clientId), m_position(position), m_instanceCount(0), m_descriptor(descriptor), m_blockSize(blockSize), m_sampleRate(sampleRate), m_latencyPort(0), m_run(false), m_bypassed(false) { init(idealChannelCount); if (m_audioPortsIn.size() == 0) { m_inputBuffers = 0; } else { m_inputBuffers = new sample_t*[m_instanceCount * m_audioPortsIn.size()]; } if (m_audioPortsOut.size() == 0) { m_outputBuffers = 0; } else { m_outputBuffers = new sample_t*[m_instanceCount * m_audioPortsOut.size()]; } for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) { m_inputBuffers[i] = new sample_t[blockSize]; } for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) { m_outputBuffers[i] = new sample_t[blockSize]; } m_ownBuffers = true; instantiate(sampleRate); if (isOK()) { connectPorts(); activate(); } } std::string LADSPAPluginInstance::getIdentifier() const { return m_descriptor->Label; } std::string LADSPAPluginInstance::getName() const { return m_descriptor->Name; } std::string LADSPAPluginInstance::getDescription() const { return ""; } std::string LADSPAPluginInstance::getMaker() const { return m_descriptor->Maker; } int LADSPAPluginInstance::getPluginVersion() const { return -1; } std::string LADSPAPluginInstance::getCopyright() const { return m_descriptor->Copyright; } LADSPAPluginInstance::ParameterList LADSPAPluginInstance::getParameterDescriptors() const { ParameterList list; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (!f) return list; for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { ParameterDescriptor pd; unsigned int pn = m_controlPortsIn[i].first; pd.identifier = m_descriptor->PortNames[pn]; pd.name = pd.identifier; pd.description = ""; pd.minValue = f->getPortMinimum(m_descriptor, pn); pd.maxValue = f->getPortMaximum(m_descriptor, pn); pd.defaultValue = f->getPortDefault(m_descriptor, pn); float q = f->getPortQuantization(m_descriptor, pn); if (q == 0.0) { pd.isQuantized = false; } else { pd.isQuantized = true; pd.quantizeStep = q; } bool haveLabels = false; #ifdef HAVE_LRDF if (pd.isQuantized && pd.quantizeStep == 1.0) { lrdf_defaults *defaults = lrdf_get_scale_values(m_descriptor->UniqueID, pn); if (defaults) { if (defaults->count > 0) { std::map values; int v = 0; for (size_t i = 0; i < defaults->count; ++i) { v = int(lrintf(fabsf(defaults->items[i].value))); values[v] = defaults->items[i].label; } for (int i = 0; i <= v; ++i) { pd.valueNames.push_back(values[i]); } haveLabels = true; } lrdf_free_setting_values(defaults); } } #endif if (haveLabels) { pd.name = QString(pd.name.c_str()) .replace(QRegExp("\\([^\\(\\)]+=[^\\(\\)]+\\)$"), "") .toStdString(); } else { static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$"); if (unitRE.indexIn(pd.name.c_str()) >= 0) { pd.unit = unitRE.cap(1).toStdString(); pd.name = QString(pd.name.c_str()) .replace(unitRE, "").toStdString(); } } list.push_back(pd); } return list; } float LADSPAPluginInstance::getParameter(std::string id) const { for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) { return getParameterValue(i); } } return 0.0; } void LADSPAPluginInstance::setParameter(std::string id, float value) { for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::setParameter: Found id " << id << " at control port " << i << endl; #endif setParameterValue(i, value); break; } } } void LADSPAPluginInstance::init(int idealChannelCount) { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::init(" << idealChannelCount << "): plugin has " << m_descriptor->PortCount << " ports" << endl; #endif // Discover ports numbers and identities // for (int i = 0; i < (int)m_descriptor->PortCount; ++i) { if (LADSPA_IS_PORT_AUDIO(m_descriptor->PortDescriptors[i])) { if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is audio in" << endl; #endif m_audioPortsIn.push_back(i); } else { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is audio out" << endl; #endif m_audioPortsOut.push_back(i); } } else if (LADSPA_IS_PORT_CONTROL(m_descriptor->PortDescriptors[i])) { if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is control in" << endl; #endif LADSPA_Data *data = new LADSPA_Data(0.0); m_controlPortsIn.push_back( std::pair(i, data)); } else { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is control out" << endl; #endif LADSPA_Data *data = new LADSPA_Data(0.0); m_controlPortsOut.push_back( std::pair(i, data)); if (!strcmp(m_descriptor->PortNames[i], "latency") || !strcmp(m_descriptor->PortNames[i], "_latency")) { #ifdef DEBUG_LADSPA cerr << "Wooo! We have a latency port!" << endl; #endif m_latencyPort = data; } } } #ifdef DEBUG_LADSPA else SVDEBUG << "LADSPAPluginInstance::init - " << "unrecognised port type" << endl; #endif } m_instanceCount = 1; if (idealChannelCount > 0) { if (m_audioPortsIn.size() == 1) { // mono plugin: duplicate it if need be m_instanceCount = idealChannelCount; } } } sv_frame_t LADSPAPluginInstance::getLatency() { if (m_latencyPort) { if (!m_run) { for (int i = 0; i < getAudioInputCount(); ++i) { for (int j = 0; j < m_blockSize; ++j) { m_inputBuffers[i][j] = 0.f; } } run(Vamp::RealTime::zeroTime); } if (*m_latencyPort > 0) return (sv_frame_t)*m_latencyPort; } return 0; } void LADSPAPluginInstance::silence() { if (isOK()) { deactivate(); activate(); } } void LADSPAPluginInstance::setIdealChannelCount(int channels) { if (m_audioPortsIn.size() != 1 || channels == m_instanceCount) { silence(); return; } if (isOK()) { deactivate(); } //!!! don't we need to reallocate inputBuffers and outputBuffers? cleanup(); m_instanceCount = channels; instantiate(m_sampleRate); if (isOK()) { connectPorts(); activate(); } } LADSPAPluginInstance::~LADSPAPluginInstance() { #ifdef DEBUG_LADSPA SVDEBUG << "LADSPAPluginInstance::~LADSPAPluginInstance" << endl; #endif if (m_instanceHandles.size() != 0) { // "isOK()" deactivate(); } cleanup(); for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) delete m_controlPortsIn[i].second; for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) delete m_controlPortsOut[i].second; m_controlPortsIn.clear(); m_controlPortsOut.clear(); if (m_ownBuffers) { for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) { delete[] m_inputBuffers[i]; } for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) { delete[] m_outputBuffers[i]; } delete[] m_inputBuffers; delete[] m_outputBuffers; } m_audioPortsIn.clear(); m_audioPortsOut.clear(); } void LADSPAPluginInstance::instantiate(sv_samplerate_t sampleRate) { if (!m_descriptor) return; #ifdef DEBUG_LADSPA cout << "LADSPAPluginInstance::instantiate - plugin unique id = " << m_descriptor->UniqueID << endl; #endif if (!m_descriptor->instantiate) { cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID << ":" << m_descriptor->Label << " has no instantiate method!" << endl; return; } unsigned long pluginRate = (unsigned long)(sampleRate); if (sampleRate != sv_samplerate_t(pluginRate)) { cerr << "LADSPAPluginInstance: WARNING: Non-integer sample rate " << sampleRate << " presented, rounding to " << pluginRate << endl; } for (int i = 0; i < m_instanceCount; ++i) { m_instanceHandles.push_back (m_descriptor->instantiate(m_descriptor, pluginRate)); } } void LADSPAPluginInstance::activate() { if (!m_descriptor || !m_descriptor->activate) return; for (std::vector::iterator hi = m_instanceHandles.begin(); hi != m_instanceHandles.end(); ++hi) { m_descriptor->activate(*hi); } } void LADSPAPluginInstance::connectPorts() { if (!m_descriptor || !m_descriptor->connect_port) return; assert(sizeof(LADSPA_Data) == sizeof(float)); assert(sizeof(sample_t) == sizeof(float)); LADSPAPluginFactory *f = dynamic_cast(m_factory); int inbuf = 0, outbuf = 0; for (std::vector::iterator hi = m_instanceHandles.begin(); hi != m_instanceHandles.end(); ++hi) { for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) { m_descriptor->connect_port(*hi, m_audioPortsIn[i], (LADSPA_Data *)m_inputBuffers[inbuf]); ++inbuf; } for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) { m_descriptor->connect_port(*hi, m_audioPortsOut[i], (LADSPA_Data *)m_outputBuffers[outbuf]); ++outbuf; } // If there is more than one instance, they all share the same // control port ins (and outs, for the moment, because we // don't actually do anything with the outs anyway -- but they // do have to be connected as the plugin can't know if they're // not and will write to them anyway). for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { m_descriptor->connect_port(*hi, m_controlPortsIn[i].first, m_controlPortsIn[i].second); if (f) { float defaultValue = f->getPortDefault (m_descriptor, m_controlPortsIn[i].first); *m_controlPortsIn[i].second = defaultValue; } } for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) { m_descriptor->connect_port(*hi, m_controlPortsOut[i].first, m_controlPortsOut[i].second); } } } int LADSPAPluginInstance::getParameterCount() const { return (int)m_controlPortsIn.size(); } void LADSPAPluginInstance::setParameterValue(int parameter, float value) { if (!in_range_for(m_controlPortsIn, parameter)) return; unsigned int portNumber = m_controlPortsIn[parameter].first; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (f) { if (value < f->getPortMinimum(m_descriptor, portNumber)) { value = f->getPortMinimum(m_descriptor, portNumber); } if (value > f->getPortMaximum(m_descriptor, portNumber)) { value = f->getPortMaximum(m_descriptor, portNumber); } } (*m_controlPortsIn[parameter].second) = value; } float LADSPAPluginInstance::getControlOutputValue(int output) const { if (!in_range_for(m_controlPortsOut, output)) return 0.0; return (*m_controlPortsOut[output].second); } float LADSPAPluginInstance::getParameterValue(int parameter) const { if (!in_range_for(m_controlPortsIn, parameter)) return 0.0; return (*m_controlPortsIn[parameter].second); } float LADSPAPluginInstance::getParameterDefault(int parameter) const { if (!in_range_for(m_controlPortsIn, parameter)) return 0.0; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (f) { return f->getPortDefault(m_descriptor, m_controlPortsIn[parameter].first); } else { return 0.0f; } } int LADSPAPluginInstance::getParameterDisplayHint(int parameter) const { if (!in_range_for(m_controlPortsIn, parameter)) return 0.0; LADSPAPluginFactory *f = dynamic_cast(m_factory); if (f) { return f->getPortDisplayHint(m_descriptor, m_controlPortsIn[parameter].first); } else { return PortHint::NoHint; } } void LADSPAPluginInstance::run(const RealTime &, int count) { if (!m_descriptor || !m_descriptor->run) return; if (count == 0) count = m_blockSize; for (std::vector::iterator hi = m_instanceHandles.begin(); hi != m_instanceHandles.end(); ++hi) { m_descriptor->run(*hi, count); } m_run = true; } void LADSPAPluginInstance::deactivate() { if (!m_descriptor || !m_descriptor->deactivate) return; for (std::vector::iterator hi = m_instanceHandles.begin(); hi != m_instanceHandles.end(); ++hi) { m_descriptor->deactivate(*hi); } } void LADSPAPluginInstance::cleanup() { if (!m_descriptor) return; if (!m_descriptor->cleanup) { cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID << ":" << m_descriptor->Label << " has no cleanup method!" << endl; return; } for (std::vector::iterator hi = m_instanceHandles.begin(); hi != m_instanceHandles.end(); ++hi) { m_descriptor->cleanup(*hi); } m_instanceHandles.clear(); } sonic-visualiser-3.0.3/svcore/plugin/LADSPAPluginInstance.h0000644000000000000000000001115513111512442021717 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and Richard Bown. */ #ifndef _LADSPAPLUGININSTANCE_H_ #define _LADSPAPLUGININSTANCE_H_ #include #include #include #include "api/ladspa.h" #include "RealTimePluginInstance.h" #include "base/BaseTypes.h" // LADSPA plugin instance. LADSPA is a variable block size API, but // for one reason and another it's more convenient to use a fixed // block size in this wrapper. // class LADSPAPluginInstance : public RealTimePluginInstance { public: virtual ~LADSPAPluginInstance(); virtual bool isOK() const { return m_instanceHandles.size() != 0; } int getClientId() const { return m_client; } virtual QString getPluginIdentifier() const { return m_identifier; } int getPosition() const { return m_position; } virtual std::string getIdentifier() const; virtual std::string getName() const; virtual std::string getDescription() const; virtual std::string getMaker() const; virtual int getPluginVersion() const; virtual std::string getCopyright() const; virtual void run(const RealTime &rt, int count = 0); virtual int getParameterCount() const; virtual void setParameterValue(int parameter, float value); virtual float getParameterValue(int parameter) const; virtual float getParameterDefault(int parameter) const; virtual int getParameterDisplayHint(int parameter) const; virtual ParameterList getParameterDescriptors() const; virtual float getParameter(std::string) const; virtual void setParameter(std::string, float); virtual int getBufferSize() const { return m_blockSize; } virtual int getAudioInputCount() const { return int(m_instanceCount * m_audioPortsIn.size()); } virtual int getAudioOutputCount() const { return int(m_instanceCount * m_audioPortsOut.size()); } virtual sample_t **getAudioInputBuffers() { return m_inputBuffers; } virtual sample_t **getAudioOutputBuffers() { return m_outputBuffers; } virtual int getControlOutputCount() const { return int(m_controlPortsOut.size()); } virtual float getControlOutputValue(int n) const; virtual bool isBypassed() const { return m_bypassed; } virtual void setBypassed(bool bypassed) { m_bypassed = bypassed; } virtual sv_frame_t getLatency(); virtual void silence(); virtual void setIdealChannelCount(int channels); // may re-instantiate virtual std::string getType() const { return "LADSPA Real-Time Plugin"; } protected: // To be constructed only by LADSPAPluginFactory friend class LADSPAPluginFactory; // Constructor that creates the buffers internally // LADSPAPluginInstance(RealTimePluginFactory *factory, int client, QString identifier, int position, sv_samplerate_t sampleRate, int blockSize, int idealChannelCount, const LADSPA_Descriptor* descriptor); void init(int idealChannelCount = 0); void instantiate(sv_samplerate_t sampleRate); void cleanup(); void activate(); void deactivate(); // Connection of data (and behind the scenes control) ports // void connectPorts(); int m_client; int m_position; std::vector m_instanceHandles; int m_instanceCount; const LADSPA_Descriptor *m_descriptor; std::vector > m_controlPortsIn; std::vector > m_controlPortsOut; std::vector m_audioPortsIn; std::vector m_audioPortsOut; int m_blockSize; sample_t **m_inputBuffers; sample_t **m_outputBuffers; bool m_ownBuffers; sv_samplerate_t m_sampleRate; float *m_latencyPort; bool m_run; bool m_bypassed; }; #endif // _LADSPAPLUGININSTANCE_H_ sonic-visualiser-3.0.3/svcore/plugin/NativeVampPluginFactory.cpp0000644000000000000000000003415113111512442023224 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "NativeVampPluginFactory.h" #include "PluginIdentifier.h" #include #include #include "system/System.h" #include "PluginScan.h" #include #include #include #include #include #include "base/Profiler.h" #include #include using namespace std; //#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1 class PluginDeletionNotifyAdapter : public Vamp::HostExt::PluginWrapper { public: PluginDeletionNotifyAdapter(Vamp::Plugin *plugin, NativeVampPluginFactory *factory) : PluginWrapper(plugin), m_factory(factory) { } virtual ~PluginDeletionNotifyAdapter(); protected: NativeVampPluginFactory *m_factory; }; PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() { // see notes in vamp-sdk/hostext/PluginLoader.cpp from which this is drawn Vamp::Plugin *p = m_plugin; delete m_plugin; m_plugin = 0; // acceptable use after free here, as pluginDeleted uses p only as // pointer key and does not deref it if (m_factory) m_factory->pluginDeleted(p); } vector NativeVampPluginFactory::getPluginPath() { if (!m_pluginPath.empty()) return m_pluginPath; vector p = Vamp::PluginHostAdapter::getPluginPath(); for (size_t i = 0; i < p.size(); ++i) m_pluginPath.push_back(p[i].c_str()); return m_pluginPath; } static QList getCandidateLibraries() { #ifdef HAVE_PLUGIN_CHECKER_HELPER return PluginScan::getInstance()->getCandidateLibrariesFor (PluginScan::VampPlugin); #else auto path = Vamp::PluginHostAdapter::getPluginPath(); QList candidates; for (string dirname: path) { SVDEBUG << "NativeVampPluginFactory: scanning directory myself: " << dirname << endl; #if defined(_WIN32) #define PLUGIN_GLOB "*.dll" #elif defined(__APPLE__) #define PLUGIN_GLOB "*.dylib *.so" #else #define PLUGIN_GLOB "*.so" #endif QDir dir(dirname.c_str(), PLUGIN_GLOB, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::Readable); for (unsigned int i = 0; i < dir.count(); ++i) { QString soname = dir.filePath(dir[i]); candidates.push_back({ soname, "" }); } } return candidates; #endif } vector NativeVampPluginFactory::getPluginIdentifiers(QString &) { Profiler profiler("NativeVampPluginFactory::getPluginIdentifiers"); QMutexLocker locker(&m_mutex); if (!m_identifiers.empty()) { return m_identifiers; } auto candidates = getCandidateLibraries(); SVDEBUG << "INFO: Have " << candidates.size() << " candidate Vamp plugin libraries" << endl; for (auto candidate : candidates) { QString soname = candidate.libraryPath; SVDEBUG << "INFO: Considering candidate Vamp plugin library " << soname << endl; void *libraryHandle = DLOPEN(soname, RTLD_LAZY | RTLD_LOCAL); if (!libraryHandle) { SVDEBUG << "WARNING: NativeVampPluginFactory::getPluginIdentifiers: Failed to load library " << soname << ": " << DLERROR() << endl; continue; } VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction) DLSYM(libraryHandle, "vampGetPluginDescriptor"); if (!fn) { SVDEBUG << "WARNING: NativeVampPluginFactory::getPluginIdentifiers: No descriptor function in " << soname << endl; if (DLCLOSE(libraryHandle) != 0) { SVDEBUG << "WARNING: NativeVampPluginFactory::getPluginIdentifiers: Failed to unload library " << soname << endl; } continue; } #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::getPluginIdentifiers: Vamp descriptor found" << endl; #endif const VampPluginDescriptor *descriptor = 0; int index = 0; map known; bool ok = true; while ((descriptor = fn(VAMP_API_VERSION, index))) { if (known.find(descriptor->identifier) != known.end()) { SVDEBUG << "WARNING: NativeVampPluginFactory::getPluginIdentifiers: Plugin library " << soname << " returns the same plugin identifier \"" << descriptor->identifier << "\" at indices " << known[descriptor->identifier] << " and " << index << endl; SVDEBUG << "NativeVampPluginFactory::getPluginIdentifiers: Avoiding this library (obsolete API?)" << endl; ok = false; break; } else { known[descriptor->identifier] = index; } ++index; } if (ok) { index = 0; while ((descriptor = fn(VAMP_API_VERSION, index))) { QString id = PluginIdentifier::createIdentifier ("vamp", soname, descriptor->identifier); m_identifiers.push_back(id); #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::getPluginIdentifiers: Found plugin id " << id << " at index " << index << endl; #endif ++index; } } if (DLCLOSE(libraryHandle) != 0) { SVDEBUG << "WARNING: NativeVampPluginFactory::getPluginIdentifiers: Failed to unload library " << soname << endl; } } generateTaxonomy(); // Plugins can change the locale, revert it to default. RestoreStartupLocale(); return m_identifiers; } QString NativeVampPluginFactory::findPluginFile(QString soname, QString inDir) { QString file = ""; #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::findPluginFile(\"" << soname << "\", \"" << inDir << "\")" << endl; #endif if (inDir != "") { QDir dir(inDir, PLUGIN_GLOB, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::Readable); if (!dir.exists()) return ""; file = dir.filePath(QFileInfo(soname).fileName()); if (QFileInfo(file).exists() && QFileInfo(file).isFile()) { #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::findPluginFile: " << "found trivially at " << file << endl; #endif return file; } for (unsigned int j = 0; j < dir.count(); ++j) { file = dir.filePath(dir[j]); if (QFileInfo(file).baseName() == QFileInfo(soname).baseName()) { #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::findPluginFile: " << "found \"" << soname << "\" at " << file << endl; #endif return file; } } #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::findPluginFile (with dir): " << "not found" << endl; #endif return ""; } else { QFileInfo fi(soname); if (fi.isAbsolute() && fi.exists() && fi.isFile()) { #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::findPluginFile: " << "found trivially at " << soname << endl; #endif return soname; } if (fi.isAbsolute() && fi.absolutePath() != "") { file = findPluginFile(soname, fi.absolutePath()); if (file != "") return file; } vector path = getPluginPath(); for (vector::iterator i = path.begin(); i != path.end(); ++i) { if (*i != "") { file = findPluginFile(soname, *i); if (file != "") return file; } } #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::findPluginFile: " << "not found" << endl; #endif return ""; } } Vamp::Plugin * NativeVampPluginFactory::instantiatePlugin(QString identifier, sv_samplerate_t inputSampleRate) { Profiler profiler("NativeVampPluginFactory::instantiatePlugin"); Vamp::Plugin *rv = 0; Vamp::PluginHostAdapter *plugin = 0; const VampPluginDescriptor *descriptor = 0; int index = 0; QString type, soname, label; PluginIdentifier::parseIdentifier(identifier, type, soname, label); if (type != "vamp") { #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::instantiatePlugin: Wrong factory for plugin type " << type << endl; #endif return 0; } QString found = findPluginFile(soname); if (found == "") { SVDEBUG << "NativeVampPluginFactory::instantiatePlugin: Failed to find library file " << soname << endl; return 0; } else if (found != soname) { #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::instantiatePlugin: Given library name was " << soname << ", found at " << found << endl; cerr << soname << " -> " << found << endl; #endif } soname = found; void *libraryHandle = DLOPEN(soname, RTLD_LAZY | RTLD_LOCAL); if (!libraryHandle) { SVDEBUG << "NativeVampPluginFactory::instantiatePlugin: Failed to load library " << soname << ": " << DLERROR() << endl; return 0; } VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction) DLSYM(libraryHandle, "vampGetPluginDescriptor"); if (!fn) { SVDEBUG << "NativeVampPluginFactory::instantiatePlugin: No descriptor function in " << soname << endl; goto done; } while ((descriptor = fn(VAMP_API_VERSION, index))) { if (label == descriptor->identifier) break; ++index; } if (!descriptor) { SVDEBUG << "NativeVampPluginFactory::instantiatePlugin: Failed to find plugin \"" << label << "\" in library " << soname << endl; goto done; } plugin = new Vamp::PluginHostAdapter(descriptor, float(inputSampleRate)); if (plugin) { m_handleMap[plugin] = libraryHandle; rv = new PluginDeletionNotifyAdapter(plugin, this); } // SVDEBUG << "NativeVampPluginFactory::instantiatePlugin: Constructed Vamp plugin, rv is " << rv << endl; //!!! need to dlclose() when plugins from a given library are unloaded done: if (!rv) { if (DLCLOSE(libraryHandle) != 0) { SVDEBUG << "WARNING: NativeVampPluginFactory::instantiatePlugin: Failed to unload library " << soname << endl; } } #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "NativeVampPluginFactory::instantiatePlugin: Instantiated plugin " << label << " from library " << soname << ": descriptor " << descriptor << ", rv "<< rv << ", label " << rv->getName() << ", outputs " << rv->getOutputDescriptors().size() << endl; #endif return rv; } void NativeVampPluginFactory::pluginDeleted(Vamp::Plugin *plugin) { void *handle = m_handleMap[plugin]; if (handle) { #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE cerr << "unloading library " << handle << " for plugin " << plugin << endl; #endif DLCLOSE(handle); } m_handleMap.erase(plugin); } QString NativeVampPluginFactory::getPluginCategory(QString identifier) { return m_taxonomy[identifier]; } void NativeVampPluginFactory::generateTaxonomy() { vector pluginPath = getPluginPath(); vector path; for (size_t i = 0; i < pluginPath.size(); ++i) { if (pluginPath[i].contains("/lib/")) { QString p(pluginPath[i]); path.push_back(p); p.replace("/lib/", "/share/"); path.push_back(p); } path.push_back(pluginPath[i]); } for (size_t i = 0; i < path.size(); ++i) { QDir dir(path[i], "*.cat"); // SVDEBUG << "LADSPAPluginFactory::generateFallbackCategories: directory " << path[i] << " has " << dir.count() << " .cat files" << endl; for (unsigned int j = 0; j < dir.count(); ++j) { QFile file(path[i] + "/" + dir[j]); // SVDEBUG << "LADSPAPluginFactory::generateFallbackCategories: about to open " << (path[i]+ "/" + dir[j]) << endl; if (file.open(QIODevice::ReadOnly)) { // cerr << "...opened" << endl; QTextStream stream(&file); QString line; while (!stream.atEnd()) { line = stream.readLine(); // cerr << "line is: \"" << line << "\"" << endl; QString id = PluginIdentifier::canonicalise (line.section("::", 0, 0)); QString cat = line.section("::", 1, 1); m_taxonomy[id] = cat; // cerr << "NativeVampPluginFactory: set id \"" << id << "\" to cat \"" << cat << "\"" << endl; } } } } } piper_vamp::PluginStaticData NativeVampPluginFactory::getPluginStaticData(QString identifier) { QMutexLocker locker(&m_mutex); if (m_pluginData.find(identifier) != m_pluginData.end()) { return m_pluginData[identifier]; } QString type, soname, label; PluginIdentifier::parseIdentifier(identifier, type, soname, label); std::string pluginKey = (soname + ":" + label).toStdString(); std::vector catlist; for (auto s: getPluginCategory(identifier).split(" > ")) { catlist.push_back(s.toStdString()); } Vamp::Plugin *p = instantiatePlugin(identifier, 44100); if (!p) return {}; auto psd = piper_vamp::PluginStaticData::fromPlugin(pluginKey, catlist, p); delete p; m_pluginData[identifier] = psd; return psd; } sonic-visualiser-3.0.3/svcore/plugin/NativeVampPluginFactory.h0000644000000000000000000000412313111512442022665 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_NATIVE_VAMP_PLUGIN_FACTORY_H #define SV_NATIVE_VAMP_PLUGIN_FACTORY_H #include "FeatureExtractionPluginFactory.h" #include #include #include "base/Debug.h" #include /** * FeatureExtractionPluginFactory type for Vamp plugins hosted * in-process. */ class NativeVampPluginFactory : public FeatureExtractionPluginFactory { public: virtual ~NativeVampPluginFactory() { } virtual std::vector getPluginIdentifiers(QString &errorMessage) override; virtual piper_vamp::PluginStaticData getPluginStaticData(QString identifier) override; virtual Vamp::Plugin *instantiatePlugin(QString identifier, sv_samplerate_t inputSampleRate) override; /** * Get category metadata about a plugin (without instantiating it). */ virtual QString getPluginCategory(QString identifier) override; protected: QMutex m_mutex; std::vector m_pluginPath; std::vector m_identifiers; std::map m_taxonomy; // identifier -> category string std::map m_pluginData; // identifier -> data (created opportunistically) friend class PluginDeletionNotifyAdapter; void pluginDeleted(Vamp::Plugin *); std::map m_handleMap; QString findPluginFile(QString soname, QString inDir = ""); std::vector getPluginPath(); void generateTaxonomy(); }; #endif sonic-visualiser-3.0.3/svcore/plugin/PiperVampPluginFactory.cpp0000644000000000000000000001722413111512442023057 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_PIPER #include "PiperVampPluginFactory.h" #include "PluginIdentifier.h" #include "system/System.h" #include "PluginScan.h" #ifdef _WIN32 #undef VOID #undef ERROR #define CAPNP_LITE 1 #endif #include "vamp-client/qt/PiperAutoPlugin.h" #include "vamp-client/qt/ProcessQtTransport.h" #include "vamp-client/CapnpRRClient.h" #include #include #include #include #include #include #include "base/Profiler.h" #include "base/HelperExecPath.h" using namespace std; //#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1 class PiperVampPluginFactory::Logger : public piper_vamp::client::LogCallback { protected: void log(std::string message) const override { SVDEBUG << "PiperVampPluginFactory: " << message << endl; } }; PiperVampPluginFactory::PiperVampPluginFactory() : m_logger(new Logger) { QString serverName = "piper-vamp-simple-server"; HelperExecPath hep(HelperExecPath::AllInstalled); m_servers = hep.getHelperExecutables(serverName); for (auto n: m_servers) { SVDEBUG << "NOTE: PiperVampPluginFactory: Found server: " << n.executable << endl; } if (m_servers.empty()) { SVDEBUG << "NOTE: No Piper Vamp servers found in installation;" << " found none of the following:" << endl; for (auto d: hep.getHelperCandidatePaths(serverName)) { SVDEBUG << "NOTE: " << d << endl; } } } PiperVampPluginFactory::~PiperVampPluginFactory() { delete m_logger; } vector PiperVampPluginFactory::getPluginIdentifiers(QString &errorMessage) { Profiler profiler("PiperVampPluginFactory::getPluginIdentifiers"); QMutexLocker locker(&m_mutex); if (m_servers.empty()) { errorMessage = QObject::tr("External plugin host executable does not appear to be installed"); return {}; } if (m_pluginData.empty()) { populate(errorMessage); } vector rv; for (const auto &d: m_pluginData) { rv.push_back(QString("vamp:") + QString::fromStdString(d.second.pluginKey)); } return rv; } Vamp::Plugin * PiperVampPluginFactory::instantiatePlugin(QString identifier, sv_samplerate_t inputSampleRate) { Profiler profiler("PiperVampPluginFactory::instantiatePlugin"); if (m_origins.find(identifier) == m_origins.end()) { cerr << "ERROR: No known server for identifier " << identifier << endl; SVDEBUG << "ERROR: No known server for identifier " << identifier << endl; return 0; } auto psd = getPluginStaticData(identifier); if (psd.pluginKey == "") { return 0; } SVDEBUG << "PiperVampPluginFactory: Creating PiperAutoPlugin for server " << m_origins[identifier] << ", identifier " << identifier << endl; auto ap = new piper_vamp::client::PiperAutoPlugin (m_origins[identifier].toStdString(), psd.pluginKey, float(inputSampleRate), 0, m_logger); if (!ap->isOK()) { delete ap; return 0; } return ap; } piper_vamp::PluginStaticData PiperVampPluginFactory::getPluginStaticData(QString identifier) { if (m_pluginData.find(identifier) != m_pluginData.end()) { return m_pluginData[identifier]; } else { return {}; } } QString PiperVampPluginFactory::getPluginCategory(QString identifier) { if (m_taxonomy.find(identifier) != m_taxonomy.end()) { return m_taxonomy[identifier]; } else { return {}; } } void PiperVampPluginFactory::populate(QString &errorMessage) { QString someError; for (auto s: m_servers) { populateFrom(s, someError); if (someError != "" && errorMessage == "") { errorMessage = someError; } } } void PiperVampPluginFactory::populateFrom(const HelperExecPath::HelperExec &server, QString &errorMessage) { QString tag = server.tag; string executable = server.executable.toStdString(); PluginScan *scan = PluginScan::getInstance(); auto candidateLibraries = scan->getCandidateLibrariesFor(PluginScan::VampPlugin); SVDEBUG << "PiperVampPluginFactory: Populating from " << executable << endl; SVDEBUG << "INFO: Have " << candidateLibraries.size() << " candidate Vamp plugin libraries from scanner" << endl; vector from; for (const auto &c: candidateLibraries) { if (c.helperTag == tag) { string soname = QFileInfo(c.libraryPath).baseName().toStdString(); SVDEBUG << "INFO: For tag \"" << tag << "\" giving library " << soname << endl; from.push_back(soname); } } if (from.empty()) { SVDEBUG << "PiperVampPluginFactory: No candidate libraries for tag \"" << tag << "\""; if (scan->scanSucceeded()) { // we have to assume that they all failed to load (i.e. we // exclude them all) rather than sending an empty list // (which would mean no exclusions) SVDEBUG << ", skipping" << endl; return; } else { SVDEBUG << ", but it seems the scan failed, so bumbling on anyway" << endl; } } piper_vamp::client::ProcessQtTransport transport(executable, "capnp", m_logger); if (!transport.isOK()) { SVDEBUG << "PiperVampPluginFactory: Failed to start Piper process transport" << endl; errorMessage = QObject::tr("Could not start external plugin host"); return; } piper_vamp::client::CapnpRRClient client(&transport, m_logger); piper_vamp::ListRequest req; req.from = from; piper_vamp::ListResponse resp; try { resp = client.list(req); } catch (piper_vamp::client::ServerCrashed) { SVDEBUG << "PiperVampPluginFactory: Piper server crashed" << endl; errorMessage = QObject::tr ("External plugin host exited unexpectedly while listing plugins"); return; } catch (const std::exception &e) { SVDEBUG << "PiperVampPluginFactory: Exception caught: " << e.what() << endl; errorMessage = QObject::tr("External plugin host invocation failed: %1") .arg(e.what()); return; } SVDEBUG << "PiperVampPluginFactory: server \"" << executable << "\" lists " << resp.available.size() << " plugin(s)" << endl; for (const auto &pd: resp.available) { QString identifier = QString("vamp:") + QString::fromStdString(pd.pluginKey); if (m_origins.find(identifier) != m_origins.end()) { // have it already, from a higher-priority server // (e.g. 64-bit instead of 32-bit) continue; } m_origins[identifier] = server.executable; m_pluginData[identifier] = pd; QStringList catlist; for (const auto &cs: pd.category) { catlist.push_back(QString::fromStdString(cs)); } m_taxonomy[identifier] = catlist.join(" > "); } } #endif sonic-visualiser-3.0.3/svcore/plugin/PiperVampPluginFactory.h0000644000000000000000000000406313111512442022521 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_PIPER_VAMP_PLUGIN_FACTORY_H #define SV_PIPER_VAMP_PLUGIN_FACTORY_H #ifdef HAVE_PIPER #include "FeatureExtractionPluginFactory.h" #include #include #include #include "base/Debug.h" #include "base/HelperExecPath.h" /** * FeatureExtractionPluginFactory type for Vamp plugins hosted in a * separate process using Piper protocol. */ class PiperVampPluginFactory : public FeatureExtractionPluginFactory { public: PiperVampPluginFactory(); virtual ~PiperVampPluginFactory(); virtual std::vector getPluginIdentifiers(QString &errorMessage) override; virtual piper_vamp::PluginStaticData getPluginStaticData(QString identifier) override; virtual Vamp::Plugin *instantiatePlugin(QString identifier, sv_samplerate_t inputSampleRate) override; virtual QString getPluginCategory(QString identifier) override; protected: QMutex m_mutex; QList m_servers; // executable file paths std::map m_origins; // plugin identifier -> server path std::map m_pluginData; // identifier -> data std::map m_taxonomy; // identifier -> category string void populate(QString &errorMessage); void populateFrom(const HelperExecPath::HelperExec &, QString &errorMessage); class Logger; Logger *m_logger; }; #endif #endif sonic-visualiser-3.0.3/svcore/plugin/PluginIdentifier.cpp0000644000000000000000000000404713111512442021705 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and QMUL. */ #include "PluginIdentifier.h" #include #include QString PluginIdentifier::createIdentifier(QString type, QString soName, QString label) { QString identifier = type + ":" + QFileInfo(soName).baseName() + ":" + label; return identifier; } QString PluginIdentifier::canonicalise(QString identifier) { QString type, soName, label; parseIdentifier(identifier, type, soName, label); return createIdentifier(type, soName, label); } void PluginIdentifier::parseIdentifier(QString identifier, QString &type, QString &soName, QString &label) { type = identifier.section(':', 0, 0); soName = identifier.section(':', 1, 1); label = identifier.section(':', 2); } bool PluginIdentifier::areIdentifiersSimilar(QString id1, QString id2) { QString type1, type2, soName1, soName2, label1, label2; parseIdentifier(id1, type1, soName1, label1); parseIdentifier(id2, type2, soName2, label2); if (type1 != type2 || label1 != label2) return false; bool similar = (soName1.section('/', -1).section('.', 0, 0) == soName2.section('/', -1).section('.', 0, 0)); return similar; } QString PluginIdentifier::BUILTIN_PLUGIN_SONAME = "_builtin"; QString PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY = "__QMUL__:__RESERVED__:ProjectDirectoryKey"; sonic-visualiser-3.0.3/svcore/plugin/PluginIdentifier.h0000644000000000000000000000277613111512442021361 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and QMUL. */ #ifndef _PLUGIN_IDENTIFIER_H_ #define _PLUGIN_IDENTIFIER_H_ #include // A plugin identifier is simply a string; this class provides methods // to parse it into its constituent bits (plugin type, DLL path and label). class PluginIdentifier { public: static QString createIdentifier(QString type, QString soName, QString label); static QString canonicalise(QString identifier); static void parseIdentifier(QString identifier, QString &type, QString &soName, QString &label); static bool areIdentifiersSimilar(QString id1, QString id2); // Fake soName for use with plugins that are actually compiled in static QString BUILTIN_PLUGIN_SONAME; // Not strictly related to identifiers static QString RESERVED_PROJECT_DIRECTORY_KEY; }; #endif sonic-visualiser-3.0.3/svcore/plugin/PluginScan.cpp0000644000000000000000000001370513111512442020510 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "PluginScan.h" #include "base/Debug.h" #include "base/Preferences.h" #include "base/HelperExecPath.h" #ifdef HAVE_PLUGIN_CHECKER_HELPER #include "checker/knownplugins.h" #else class KnownPlugins {}; #endif #include #include using std::string; class PluginScan::Logger #ifdef HAVE_PLUGIN_CHECKER_HELPER : public PluginCandidates::LogCallback #endif { protected: void log(std::string message) { SVDEBUG << "PluginScan: " << message << endl; } }; PluginScan *PluginScan::getInstance() { static QMutex mutex; static PluginScan *m_instance = 0; mutex.lock(); if (!m_instance) m_instance = new PluginScan(); mutex.unlock(); return m_instance; } PluginScan::PluginScan() : m_succeeded(false), m_logger(new Logger) { } PluginScan::~PluginScan() { QMutexLocker locker(&m_mutex); clear(); delete m_logger; SVDEBUG << "PluginScan::~PluginScan completed" << endl; } void PluginScan::scan() { #ifdef HAVE_PLUGIN_CHECKER_HELPER QMutexLocker locker(&m_mutex); bool inProcess = Preferences::getInstance()->getRunPluginsInProcess(); HelperExecPath hep(inProcess ? HelperExecPath::NativeArchitectureOnly : HelperExecPath::AllInstalled); QString helperName("vamp-plugin-load-checker"); auto helpers = hep.getHelperExecutables(helperName); clear(); for (auto p: helpers) { SVDEBUG << "NOTE: PluginScan: Found helper: " << p.executable << endl; } if (helpers.empty()) { SVDEBUG << "NOTE: No plugin checker helpers found in installation;" << " found none of the following:" << endl; for (auto d: hep.getHelperCandidatePaths(helperName)) { SVDEBUG << "NOTE: " << d << endl; } } for (auto p: helpers) { try { KnownPlugins *kp = new KnownPlugins (p.executable.toStdString(), m_logger); if (m_kp.find(p.tag) != m_kp.end()) { SVDEBUG << "WARNING: PluginScan::scan: Duplicate tag " << p.tag << " for helpers" << endl; continue; } m_kp[p.tag] = kp; m_succeeded = true; } catch (const std::exception &e) { SVDEBUG << "ERROR: PluginScan::scan: " << e.what() << " (with helper path = " << p.executable << ")" << endl; } } SVDEBUG << "PluginScan::scan complete" << endl; #endif } bool PluginScan::scanSucceeded() const { QMutexLocker locker(&m_mutex); return m_succeeded; } void PluginScan::clear() { for (auto &p: m_kp) { delete p.second; } m_kp.clear(); m_succeeded = false; } QList PluginScan::getCandidateLibrariesFor(PluginType #ifdef HAVE_PLUGIN_CHECKER_HELPER type #endif ) const { #ifdef HAVE_PLUGIN_CHECKER_HELPER QMutexLocker locker(&m_mutex); KnownPlugins::PluginType kpt; switch (type) { case VampPlugin: kpt = KnownPlugins::VampPlugin; break; case LADSPAPlugin: kpt = KnownPlugins::LADSPAPlugin; break; case DSSIPlugin: kpt = KnownPlugins::DSSIPlugin; break; default: throw std::logic_error("Inconsistency in plugin type enums"); } QList candidates; for (auto rec: m_kp) { KnownPlugins *kp = rec.second; auto c = kp->getCandidateLibrariesFor(kpt); SVDEBUG << "PluginScan: helper \"" << kp->getHelperExecutableName() << "\" likes " << c.size() << " libraries of type " << kp->getTagFor(kpt) << endl; for (auto s: c) { candidates.push_back({ s.c_str(), rec.first }); } if (type != VampPlugin) { // We are only interested in querying multiple helpers // when dealing with Vamp plugins, for which we can use // external servers and so in some cases can support // additional architectures. Other plugin formats are // loaded directly and so must match the host, which is // what the first helper is supposed to handle -- so // break after the first one if not querying Vamp break; } } return candidates; #else return {}; #endif } QString PluginScan::getStartupFailureReport() const { #ifdef HAVE_PLUGIN_CHECKER_HELPER QMutexLocker locker(&m_mutex); if (!m_succeeded) { return QObject::tr("Failed to scan for plugins" "

    Failed to scan for plugins at startup. Possibly " "the plugin checker program was not correctly " "installed alongside %1?

    ") .arg(QCoreApplication::applicationName()); } if (m_kp.empty()) { return QObject::tr("Did not scan for plugins" "

    Apparently no scan for plugins was attempted " "(internal error?)

    "); } QString report; for (auto kp: m_kp) { report += QString::fromStdString(kp.second->getFailureReport()); } if (report == "") { return report; } return QObject::tr("Failed to load plugins" "

    Failed to load one or more plugin libraries:

    ") + report + QObject::tr("

    These plugins may be incompatible with the system, " "and will be ignored during this run of %1.

    ") .arg(QCoreApplication::applicationName()); #else return ""; #endif } sonic-visualiser-3.0.3/svcore/plugin/PluginScan.h0000644000000000000000000000455513111512442020160 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef PLUGIN_SCAN_H #define PLUGIN_SCAN_H #include #include #include #include class KnownPlugins; class PluginScan { public: static PluginScan *getInstance(); /** * Carry out startup scan of available plugins. Do not call * getCandidateLibrariesFor() unless this has been called and * scanSucceeded() is returning true. */ void scan(); /** * Return true if scan() completed successfully. If the scan * failed, consider using the normal plugin path to load any * available plugins (as if they had all been found to be * loadable) rather than rejecting all of them -- i.e. consider * falling back on the behaviour of code from before the scan * logic was added. */ bool scanSucceeded() const; enum PluginType { VampPlugin, LADSPAPlugin, DSSIPlugin }; struct Candidate { QString libraryPath; // full path, not just soname QString helperTag; // identifies the helper that found it // (see HelperExecPath) }; /** * Return the candidate plugin libraries of the given type that * were found by helpers during the startup scan. * * This could return an empty list for two reasons: the scan * succeeded but no libraries were found; or the scan failed. Call * scanSucceeded() to distinguish between them. */ QList getCandidateLibrariesFor(PluginType) const; QString getStartupFailureReport() const; private: PluginScan(); ~PluginScan(); void clear(); mutable QMutex m_mutex; // while scanning; definitely can't multi-thread this std::map m_kp; // tag -> KnownPlugins client bool m_succeeded; class Logger; Logger *m_logger; }; #endif sonic-visualiser-3.0.3/svcore/plugin/PluginXml.cpp0000644000000000000000000001765013111512442020367 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PluginXml.h" #include #include #include #include #include #include #include #include #include "RealTimePluginInstance.h" #include PluginXml::PluginXml(Vamp::PluginBase *plugin) : m_plugin(plugin) { } PluginXml::~PluginXml() { } QString PluginXml::encodeConfigurationChars(QString text) { QString rv(text); rv.replace(";", "[[SEMICOLON]]"); rv.replace("=", "[[EQUALS]]"); return rv; } QString PluginXml::decodeConfigurationChars(QString text) { QString rv(text); rv.replace("[[SEMICOLON]]", ";"); rv.replace("[[EQUALS]]", "="); return rv; } void PluginXml::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("getIdentifier().c_str()))) .arg(encodeEntities(QString(m_plugin->getName().c_str()))) .arg(encodeEntities(QString(m_plugin->getDescription().c_str()))) .arg(encodeEntities(QString(m_plugin->getMaker().c_str()))) .arg(m_plugin->getPluginVersion()) .arg(encodeEntities(QString(m_plugin->getCopyright().c_str()))) .arg(extraAttributes); if (!m_plugin->getPrograms().empty()) { stream << QString("program=\"%1\" ") .arg(encodeEntities(m_plugin->getCurrentProgram().c_str())); } Vamp::PluginBase::ParameterList parameters = m_plugin->getParameterDescriptors(); for (Vamp::PluginBase::ParameterList::const_iterator i = parameters.begin(); i != parameters.end(); ++i) { // SVDEBUG << "PluginXml::toXml: parameter name \"" // << i->name.c_str() << "\" has value " // << m_plugin->getParameter(i->name) << endl; stream << QString("param-%1=\"%2\" ") .arg(stripInvalidParameterNameCharacters(QString(i->identifier.c_str()))) .arg(m_plugin->getParameter(i->identifier)); } RealTimePluginInstance *rtpi = dynamic_cast(m_plugin); if (rtpi) { std::map configurePairs = rtpi->getConfigurePairs(); QString config; for (std::map::iterator i = configurePairs.begin(); i != configurePairs.end(); ++i) { QString key = i->first.c_str(); QString value = i->second.c_str(); key = encodeConfigurationChars(key); value = encodeConfigurationChars(value); if (config != "") config += ";"; config += QString("%1=%2").arg(key).arg(value); } if (config != "") { stream << QString("configuration=\"%1\" ") .arg(encodeEntities(config)); } } stream << "/>\n"; } #define CHECK_ATTRIBUTE(ATTRIBUTE, ACCESSOR) \ QString ATTRIBUTE = attrs.value(#ATTRIBUTE); \ if (ATTRIBUTE != "" && ATTRIBUTE != ACCESSOR().c_str()) { \ cerr << "WARNING: PluginXml::setParameters: Plugin " \ << #ATTRIBUTE << " does not match (attributes have \"" \ << ATTRIBUTE << "\", my " \ << #ATTRIBUTE << " is \"" << ACCESSOR() << "\")" << endl; \ } void PluginXml::setParameters(const QXmlAttributes &attrs) { CHECK_ATTRIBUTE(identifier, m_plugin->getIdentifier); CHECK_ATTRIBUTE(name, m_plugin->getName); CHECK_ATTRIBUTE(description, m_plugin->getDescription); CHECK_ATTRIBUTE(maker, m_plugin->getMaker); CHECK_ATTRIBUTE(copyright, m_plugin->getCopyright); bool ok; int version = attrs.value("version").trimmed().toInt(&ok); if (ok && version != m_plugin->getPluginVersion()) { cerr << "WARNING: PluginXml::setParameters: Plugin version does not match (attributes have " << version << ", my version is " << m_plugin->getPluginVersion() << ")" << endl; } RealTimePluginInstance *rtpi = dynamic_cast(m_plugin); if (rtpi) { QString config = attrs.value("configuration"); if (config != "") { QStringList configList = config.split(";"); for (QStringList::iterator i = configList.begin(); i != configList.end(); ++i) { QStringList kv = i->split("="); if (kv.count() < 2) { cerr << "WARNING: PluginXml::setParameters: Malformed configure pair string: \"" << *i << "\"" << endl; continue; } QString key(kv[0]), value(kv[1]); key = decodeConfigurationChars(key); value = decodeConfigurationChars(value); rtpi->configure(key.toStdString(), value.toStdString()); } } } if (!m_plugin->getPrograms().empty()) { m_plugin->selectProgram(attrs.value("program").toStdString()); } Vamp::PluginBase::ParameterList parameters = m_plugin->getParameterDescriptors(); for (Vamp::PluginBase::ParameterList::const_iterator i = parameters.begin(); i != parameters.end(); ++i) { QString pname = QString("param-%1") .arg(stripInvalidParameterNameCharacters (QString(i->identifier.c_str()))); if (attrs.value(pname) == "") { // SVDEBUG << "PluginXml::setParameters: no parameter \"" << i->name << "\" (attribute \"" << name << "\")" << endl; continue; } bool ok; float value = attrs.value(pname).trimmed().toFloat(&ok); if (ok) { // SVDEBUG << "PluginXml::setParameters: setting parameter \"" // << i->identifier << "\" to value " << value << endl; m_plugin->setParameter(i->identifier, value); } else { cerr << "WARNING: PluginXml::setParameters: Invalid value \"" << attrs.value(pname) << "\" for parameter \"" << i->identifier << "\" (attribute \"" << pname << "\")" << endl; } } } void PluginXml::setParametersFromXml(QString xml) { QDomDocument doc; QString error; int errorLine; int errorColumn; // SVDEBUG << "PluginXml::setParametersFromXml: XML is \"" // << xml << "\"" << endl; if (!doc.setContent(xml, false, &error, &errorLine, &errorColumn)) { cerr << "PluginXml::setParametersFromXml: Error in parsing XML: " << error << " at line " << errorLine << ", column " << errorColumn << endl; cerr << "Input follows:" << endl; cerr << xml << endl; cerr << "Input ends." << endl; return; } QDomElement pluginElt = doc.firstChildElement("plugin"); QDomNamedNodeMap attrNodes = pluginElt.attributes(); QXmlAttributes attrs; for (int i = 0; i < attrNodes.length(); ++i) { QDomAttr attr = attrNodes.item(i).toAttr(); if (attr.isNull()) continue; // SVDEBUG << "PluginXml::setParametersFromXml: Adding attribute \"" << attr.name()// << "\" with value \"" << attr.value() << "\"" << endl; attrs.append(attr.name(), "", "", attr.value()); } setParameters(attrs); } QString PluginXml::stripInvalidParameterNameCharacters(QString s) const { s.replace(QRegExp("[^a-zA-Z0-9_]*"), ""); return s; } sonic-visualiser-3.0.3/svcore/plugin/PluginXml.h0000644000000000000000000000326613111512442020032 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_XML_H_ #define _PLUGIN_XML_H_ #include "base/XmlExportable.h" #include class QXmlAttributes; class PluginXml : public XmlExportable { public: PluginXml(Vamp::PluginBase *plugin); virtual ~PluginXml(); /** * Export plugin settings to XML. */ virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; /** * Set the parameters and program of a plugin from a set of XML * attributes. This is a partial inverse of toXml. */ virtual void setParameters(const QXmlAttributes &); /** * Set the parameters and program of a plugin from an XML plugin * element as returned by toXml. This is a partial inverse of * toXml. */ virtual void setParametersFromXml(QString xml); static QString encodeConfigurationChars(QString text); static QString decodeConfigurationChars(QString text); protected: QString stripInvalidParameterNameCharacters(QString) const; Vamp::PluginBase *m_plugin; }; #endif sonic-visualiser-3.0.3/svcore/plugin/RealTimePluginFactory.cpp0000644000000000000000000000755313111512442022662 0ustar 00000000000000// -*- c-basic-offset: 4 indent-tabs-mode: nil -*- /* Rosegarden-4 A sequencer and musical notation editor. This program is Copyright 2000-2006 Guillaume Laurent , Chris Cannam , Richard Bown The moral right of the authors to claim authorship of this work has been asserted. 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. See the file COPYING included with this distribution for more information. */ #include "RealTimePluginFactory.h" #include "PluginIdentifier.h" #include "LADSPAPluginFactory.h" #include "DSSIPluginFactory.h" #include "system/System.h" #include "base/Profiler.h" #include sv_samplerate_t RealTimePluginFactory::m_sampleRate = 48000; static LADSPAPluginFactory *_ladspaInstance = 0; static LADSPAPluginFactory *_dssiInstance = 0; RealTimePluginFactory::~RealTimePluginFactory() { } RealTimePluginFactory * RealTimePluginFactory::instance(QString pluginType) { if (pluginType == "ladspa") { if (!_ladspaInstance) { // SVDEBUG << "RealTimePluginFactory::instance(" << pluginType// << "): creating new LADSPAPluginFactory" << endl; _ladspaInstance = new LADSPAPluginFactory(); _ladspaInstance->discoverPlugins(); } return _ladspaInstance; } else if (pluginType == "dssi") { if (!_dssiInstance) { // SVDEBUG << "RealTimePluginFactory::instance(" << pluginType// << "): creating new DSSIPluginFactory" << endl; _dssiInstance = new DSSIPluginFactory(); _dssiInstance->discoverPlugins(); } return _dssiInstance; } else return 0; } RealTimePluginFactory * RealTimePluginFactory::instanceFor(QString identifier) { QString type, soName, label; PluginIdentifier::parseIdentifier(identifier, type, soName, label); return instance(type); } std::vector RealTimePluginFactory::getAllPluginIdentifiers() { Profiler profiler("RealTimePluginFactory::getAllPluginIdentifiers"); RealTimePluginFactory *factory; std::vector rv; // Query DSSI plugins before LADSPA ones. // This is to provide for the interesting possibility of plugins // providing either DSSI or LADSPA versions of themselves, // returning both versions if the LADSPA identifiers are queried // first but only the DSSI version if the DSSI identifiers are // queried first. factory = instance("dssi"); if (factory) { const std::vector &tmp = factory->getPluginIdentifiers(); for (size_t i = 0; i < tmp.size(); ++i) { rv.push_back(tmp[i]); } } factory = instance("ladspa"); if (factory) { const std::vector &tmp = factory->getPluginIdentifiers(); for (size_t i = 0; i < tmp.size(); ++i) { rv.push_back(tmp[i]); } } // Plugins can change the locale, revert it to default. RestoreStartupLocale(); return rv; } void RealTimePluginFactory::enumerateAllPlugins(std::vector &list) { Profiler profiler("RealTimePluginFactory::enumerateAllPlugins"); RealTimePluginFactory *factory; // Query DSSI plugins before LADSPA ones. // This is to provide for the interesting possibility of plugins // providing either DSSI or LADSPA versions of themselves, // returning both versions if the LADSPA identifiers are queried // first but only the DSSI version if the DSSI identifiers are // queried first. factory = instance("dssi"); if (factory) factory->enumeratePlugins(list); factory = instance("ladspa"); if (factory) factory->enumeratePlugins(list); // Plugins can change the locale, revert it to default. RestoreStartupLocale(); } sonic-visualiser-3.0.3/svcore/plugin/RealTimePluginFactory.h0000644000000000000000000000631513111512442022322 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _REALTIME_PLUGIN_FACTORY_H_ #define _REALTIME_PLUGIN_FACTORY_H_ #include #include #include "base/Debug.h" #include "base/BaseTypes.h" class RealTimePluginInstance; class RealTimePluginDescriptor { public: std::string name; std::string label; std::string maker; std::string copyright; std::string category; bool isSynth; unsigned int parameterCount; unsigned int audioInputPortCount; unsigned int audioOutputPortCount; unsigned int controlOutputPortCount; std::vector controlOutputPortNames; }; class RealTimePluginFactory { public: virtual ~RealTimePluginFactory(); static RealTimePluginFactory *instance(QString pluginType); static RealTimePluginFactory *instanceFor(QString identifier); static std::vector getAllPluginIdentifiers(); static void enumerateAllPlugins(std::vector &); static void setSampleRate(sv_samplerate_t sampleRate) { m_sampleRate = sampleRate; } /** * Look up the plugin path and find the plugins in it. Called * automatically after construction of a factory. */ virtual void discoverPlugins() = 0; /** * Return a reference to a list of all plugin identifiers that can * be created by this factory. */ virtual const std::vector &getPluginIdentifiers() const = 0; /** * Append to the given list descriptions of all the available * plugins and their ports. This is in a standard format, see * the LADSPA implementation for details. */ virtual void enumeratePlugins(std::vector &list) = 0; /** * Get some basic information about a plugin (rapidly). */ virtual const RealTimePluginDescriptor *getPluginDescriptor(QString identifier) const = 0; /** * Instantiate a plugin. */ virtual RealTimePluginInstance *instantiatePlugin(QString identifier, int clientId, int position, sv_samplerate_t sampleRate, int blockSize, int channels) = 0; /** * Get category metadata about a plugin (without instantiating it). */ virtual QString getPluginCategory(QString identifier) = 0; protected: RealTimePluginFactory() { } // for call by RealTimePluginInstance dtor virtual void releasePlugin(RealTimePluginInstance *, QString identifier) = 0; friend class RealTimePluginInstance; static sv_samplerate_t m_sampleRate; }; #endif sonic-visualiser-3.0.3/svcore/plugin/RealTimePluginInstance.cpp0000644000000000000000000000215413111512442023007 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include "RealTimePluginInstance.h" #include "RealTimePluginFactory.h" #include "PluginIdentifier.h" #include RealTimePluginInstance::~RealTimePluginInstance() { // SVDEBUG << "RealTimePluginInstance::~RealTimePluginInstance" << endl; if (m_factory) { // SVDEBUG << "Asking factory to release " << m_identifier << endl; m_factory->releasePlugin(this, m_identifier); } } sonic-visualiser-3.0.3/svcore/plugin/RealTimePluginInstance.h0000644000000000000000000001233413111512442022455 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _REALTIME_PLUGIN_INSTANCE_H_ #define _REALTIME_PLUGIN_INSTANCE_H_ #include #include "base/RealTime.h" #include "base/AudioPlaySource.h" #include #include #include #include #include class RealTimePluginFactory; /** * RealTimePluginInstance is an interface that an audio process can * use to refer to an instance of a plugin without needing to know * what type of plugin it is. * * The audio code calls run() on an instance that has been passed to * it, and assumes that the passing code has already initialised the * plugin, connected its inputs and outputs and so on, and that there * is an understanding in place about the sizes of the buffers in use * by the plugin. All of this depends on the subclass implementation. * * The PluginInstance base class includes additional abstract methods * which the subclass of RealTimePluginInstance must implement. */ /* * N.B. RealTimePluginInstance, RealTimePluginFactory and their * subclasses are terrible code. They've been reused, cut and pasted * and mangled too many times to fit too many different uses, and * could do with a good tidy. */ // These names are taken from LADSPA, but the values are not // guaranteed to match namespace PortType { // ORable static const int Input = 1; static const int Output = 2; static const int Control = 4; static const int Audio = 8; } namespace PortHint { // ORable static const int NoHint = 0; static const int Toggled = 1; static const int Integer = 2; static const int Logarithmic = 4; static const int SampleRate = 8; } class RealTimePluginInstance : public Vamp::PluginBase, public Auditionable { public: typedef float sample_t; virtual ~RealTimePluginInstance(); virtual bool isOK() const = 0; virtual QString getPluginIdentifier() const = 0; /** * Run for one block, starting at the given time. The start time * may be of interest to synths etc that may have queued events * waiting. Other plugins can ignore it. The count, if zero, * defaults to our fixed buffer size. */ virtual void run(const RealTime &blockStartTime, int count = 0) = 0; virtual int getBufferSize() const = 0; virtual int getAudioInputCount() const = 0; virtual int getAudioOutputCount() const = 0; virtual sample_t **getAudioInputBuffers() = 0; virtual sample_t **getAudioOutputBuffers() = 0; // Control inputs are known as parameters here virtual int getControlOutputCount() const = 0; virtual float getControlOutputValue(int n) const = 0; // virtual QStringList getPrograms() const { return QStringList(); } // virtual QString getCurrentProgram() const { return QString(); } virtual std::string getProgram(int /* bank */, int /* program */) const { return std::string(); } // virtual int getProgram(QString /* name */) const { return 0; } // bank << 16 + program // virtual void selectProgram(QString) { } virtual int getParameterCount() const = 0; virtual void setParameterValue(int parameter, float value) = 0; virtual float getParameterValue(int parameter) const = 0; virtual float getParameterDefault(int parameter) const = 0; virtual int getParameterDisplayHint(int parameter) const = 0; virtual std::string configure(std::string /* key */, std::string /* value */) { return std::string(); } virtual void sendEvent(const RealTime & /* eventTime */, const void * /* event */) { } virtual void clearEvents() { } virtual bool isBypassed() const = 0; virtual void setBypassed(bool value) = 0; // This should be called after setup, but while not actually playing. virtual sv_frame_t getLatency() = 0; virtual void silence() = 0; virtual void discardEvents() { } virtual void setIdealChannelCount(int channels) = 0; // must also silence(); may also re-instantiate void setFactory(RealTimePluginFactory *f) { m_factory = f; } // ew virtual std::string getType() const { return "Real-Time Plugin"; } typedef std::map ConfigurationPairMap; virtual ConfigurationPairMap getConfigurePairs() { return m_configurationData; } protected: RealTimePluginInstance(RealTimePluginFactory *factory, QString identifier) : m_factory(factory), m_identifier(identifier) { } RealTimePluginFactory *m_factory; QString m_identifier; ConfigurationPairMap m_configurationData; friend class PluginFactory; }; #endif sonic-visualiser-3.0.3/svcore/plugin/api/alsa/README0000644000000000000000000001415513111512442020312 0ustar 00000000000000libdssialsacompat 1.0.8a ======================== libdssialsacompat is simply an extraction from and repackaging of the code from alsa-lib 1.0.8, necessary to support DSSI on non-ALSA systems. It is copyright (c)2005 under the GNU Lesser General Public License, version 2.1 or later. See the enclosed file COPYING for details. More information on DSSI can be found at: http://dssi.sourceforge.net/ Introduction ============ The DSSI specification makes use of the ALSA snd_seq_event_t structure for passing MIDI events. This has the advantage of making it immediately familiar to developers familiar with ALSA, but the disadvantage of making porting DSSI applications and plugins to systems that lack ALSA more difficult. libdssialsacompat is intended to provide the snd_seq_event_t declarations and handling code necessary to compile and use DSSI on non-ALSA systems. It aims to allows compiling DSSI code with as little change as possible, while not presenting itself in such a way as to fool other autoconf-enabled code into thinking a system has ALSA. libdssialsacompat is simply an extraction of the relevant snd_seq_event_t declarations, and raw MIDI stream to snd_seq_event_t encoder code, from alsa-lib version 1.0.8, packaged into a convenient library. This library does NOT provide any sort of emulation of the ALSA audio, MIDI, or sequencer devices. The only part of ALSA that is required by the DSSI specification is the snd_seq_event_t definition and handling, and that is all libdssialsacompat is intended to replace. Other ALSA code should be ported to native facilities. Installation ============ libdssialsacompat uses GNU autoconf and automake, so installation can be a simple as `./configure && make && make install'. See the enclosed file INSTALL for more information. The library itself is installed to /lib; for example, on Mac OS X, the following files are installed: /lib/libdssialsacompat.0.0.0.dylib /lib/libdssialsacompat.0.dylib /lib/libdssialsacompat.a /lib/libdssialsacompat.dylib /lib/libdssialsacompat.la The header files are installed to /include/dssi/alsa: /include/dssi/alsa/asoundef.h /include/dssi/alsa/asoundlib.h /include/dssi/alsa/seq.h /include/dssi/alsa/seq_event.h /include/dssi/alsa/seq_midi_event.h /include/dssi/alsa/sound/asequencer.h Note that they are NOT installed to /include/alsa, which could make them visible to non-libdssialsacompat-aware autoconf configure scripts, possibly fooling them into thinking the full ALSA was available. Finally, a pkgconfig configuration file is installed: /lib/pkgconfig/libdssialsacompat.pc Use === At its most basic, compiling with gcc and libdssialsacompat consists of adding '-I/include/dssi -L/lib -ldssialsacompat' to your gcc command line. Note that the '-I' directive will cause code like to following: #include #include to find the libdssialsacompat header files, even though they are not installed in the usual location for ALSA headers. libdssialsacompat is easiest to use with autoconf/automake/pkgconfig- enabled code. In which case, editing the configure.in or configure.ac file and changing: PKG_CHECK_MODULES(ALSA, alsa) to: PKG_CHECK_MODULES(ALSA, alsa, , [PKG_CHECK_MODULES(ALSA, libdssialsacompat)]) then doing 'autoreconf', may be all that is needed to get the snd_seq_event_t-using code to compile cleanly. Of course, if the code uses other ALSA features, libdssialsacompat won't help with them.... DSSI Installation ================= Installation of DSSI itself (at least as recently as 2005/4/6 CVS) must be done by hand, which goes something like this (assuming you're running OS X 10.3 and want to install to /usr/local): $ tar xpzf dssi-0.9.tar.gz $ cd dssi-0.9 $ sudo mkdir -p /usr/local/include $ sudo cp dssi/dssi.h /usr/local/include/ $ sed s:.PREFIX.:/usr/local: dssi.pc >dssi.pc.new $ sudo mkdir -p /usr/local/lib/pkgconfig $ sudo mv dssi.pc.new /usr/local/lib/pkgconfig/dssi.pc (You may stop here if you're not interested in the example plugins.) $ cd examples $ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig $ export PKG_CONFIG_PATH $ make dssi_osc_send $ sudo cp -p dssi_osc_send /usr/local/bin $ gcc -Wall -fno-common -O2 `pkg-config libdssialsacompat dssi --cflags` \ trivial_synth.c -c -o trivial_synth.o $ gcc -Wall -fno-common -O2 -c -o message_buffer.o \ ../message_buffer/message_buffer.c $ gcc -bundle -flat_namespace -undefined suppress -o trivial_synth.so \ trivial_synth.o message_buffer.o \ `pkg-config libdssialsacompat dssi --libs` $ sudo mkdir -p /usr/local/lib/dssi $ sudo cp -p trivial_synth.so /usr/local/lib/dssi Building the rest of the DSSI distribution's plugins is left as an exercise to the reader. Note that (as of 2005/4/6) jack-dssi-host will not build without patching since it uses the ALSA sequencer. What Works (Or Doesn't) ======================= libdssialsacompat 1.0.8a was tested on Mac OS X 10.3.8, using the Apple Developer Tools, Gentoo-installed versions of pkgconfig and liblo 0.18, hand-installed GTK+ 1.2 and LADSPA SDK, and JackOSX 0.6.1. Under this configuration, the following are known to work: - ghostess (from the 20050411 release, which includes a clumsy but working CoreMIDI driver.) ghostess can be found at: http://home.jps.net/~musound/ - trivial_synth.so (DSSI 0.9 release) - fluidsynth-dssi.so and FluidSynth-DSSI_gtk (DSSI 0.9 release, using a statically compiled libfluidsynth 1.0.3) - Xsynth-DSSI (CVS as of 2005/4/11) - hexter (CVS as of 2005/4/11, note that sys-ex patch editing isn't supported on non-ALSA systems) The following problems are known to exist: - less_trivial_synth.so (DSSI 0.9) plays at the wrong pitch on big-endian systems due the little-endian assumption of the typedef union fixp in less_trivial_synth.c (line 69). Otherwise works fine. - I have not tested any of the DSSI 0.9 Qt GUIs, or trivial_sampler.so. - jack-dssi-host (DSSI 0.9) works as an OSC-driven host if you comment out all the ALSA seqeuncer code. sonic-visualiser-3.0.3/svcore/plugin/api/alsa/asoundef.h0000644000000000000000000001630313111512442021404 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for Mac OS X the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. */ /** * \file * \brief Application interface library for the ALSA driver * \author Jaroslav Kysela * \author Abramo Bagnara * \author Takashi Iwai * \date 1998-2001 * * Definitions of constants for the ALSA driver */ /* * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __ALSA_ASOUNDEF_H #define __ALSA_ASOUNDEF_H #ifdef __cplusplus extern "C" { #endif /** * \defgroup MIDI_Interface Constants for MIDI v1.0 * Constants for MIDI v1.0. * \{ */ #define MIDI_CHANNELS 16 /**< Number of channels per port/cable. */ #define MIDI_GM_DRUM_CHANNEL (10-1) /**< Channel number for GM drums. */ /** * \defgroup MIDI_Commands MIDI Commands * MIDI command codes. * \{ */ #define MIDI_CMD_NOTE_OFF 0x80 /**< note off */ #define MIDI_CMD_NOTE_ON 0x90 /**< note on */ #define MIDI_CMD_NOTE_PRESSURE 0xa0 /**< key pressure */ #define MIDI_CMD_CONTROL 0xb0 /**< control change */ #define MIDI_CMD_PGM_CHANGE 0xc0 /**< program change */ #define MIDI_CMD_CHANNEL_PRESSURE 0xd0 /**< channel pressure */ #define MIDI_CMD_BENDER 0xe0 /**< pitch bender */ #define MIDI_CMD_COMMON_SYSEX 0xf0 /**< sysex (system exclusive) begin */ #define MIDI_CMD_COMMON_MTC_QUARTER 0xf1 /**< MTC quarter frame */ #define MIDI_CMD_COMMON_SONG_POS 0xf2 /**< song position */ #define MIDI_CMD_COMMON_SONG_SELECT 0xf3 /**< song select */ #define MIDI_CMD_COMMON_TUNE_REQUEST 0xf6 /**< tune request */ #define MIDI_CMD_COMMON_SYSEX_END 0xf7 /**< end of sysex */ #define MIDI_CMD_COMMON_CLOCK 0xf8 /**< clock */ #define MIDI_CMD_COMMON_START 0xfa /**< start */ #define MIDI_CMD_COMMON_CONTINUE 0xfb /**< continue */ #define MIDI_CMD_COMMON_STOP 0xfc /**< stop */ #define MIDI_CMD_COMMON_SENSING 0xfe /**< active sensing */ #define MIDI_CMD_COMMON_RESET 0xff /**< reset */ /** \} */ /** * \defgroup MIDI_Controllers MIDI Controllers * MIDI controller numbers. * \{ */ #define MIDI_CTL_MSB_BANK 0x00 /**< Bank selection */ #define MIDI_CTL_MSB_MODWHEEL 0x01 /**< Modulation */ #define MIDI_CTL_MSB_BREATH 0x02 /**< Breath */ #define MIDI_CTL_MSB_FOOT 0x04 /**< Foot */ #define MIDI_CTL_MSB_PORTAMENTO_TIME 0x05 /**< Portamento time */ #define MIDI_CTL_MSB_DATA_ENTRY 0x06 /**< Data entry */ #define MIDI_CTL_MSB_MAIN_VOLUME 0x07 /**< Main volume */ #define MIDI_CTL_MSB_BALANCE 0x08 /**< Balance */ #define MIDI_CTL_MSB_PAN 0x0a /**< Panpot */ #define MIDI_CTL_MSB_EXPRESSION 0x0b /**< Expression */ #define MIDI_CTL_MSB_EFFECT1 0x0c /**< Effect1 */ #define MIDI_CTL_MSB_EFFECT2 0x0d /**< Effect2 */ #define MIDI_CTL_MSB_GENERAL_PURPOSE1 0x10 /**< General purpose 1 */ #define MIDI_CTL_MSB_GENERAL_PURPOSE2 0x11 /**< General purpose 2 */ #define MIDI_CTL_MSB_GENERAL_PURPOSE3 0x12 /**< General purpose 3 */ #define MIDI_CTL_MSB_GENERAL_PURPOSE4 0x13 /**< General purpose 4 */ #define MIDI_CTL_LSB_BANK 0x20 /**< Bank selection */ #define MIDI_CTL_LSB_MODWHEEL 0x21 /**< Modulation */ #define MIDI_CTL_LSB_BREATH 0x22 /**< Breath */ #define MIDI_CTL_LSB_FOOT 0x24 /**< Foot */ #define MIDI_CTL_LSB_PORTAMENTO_TIME 0x25 /**< Portamento time */ #define MIDI_CTL_LSB_DATA_ENTRY 0x26 /**< Data entry */ #define MIDI_CTL_LSB_MAIN_VOLUME 0x27 /**< Main volume */ #define MIDI_CTL_LSB_BALANCE 0x28 /**< Balance */ #define MIDI_CTL_LSB_PAN 0x2a /**< Panpot */ #define MIDI_CTL_LSB_EXPRESSION 0x2b /**< Expression */ #define MIDI_CTL_LSB_EFFECT1 0x2c /**< Effect1 */ #define MIDI_CTL_LSB_EFFECT2 0x2d /**< Effect2 */ #define MIDI_CTL_LSB_GENERAL_PURPOSE1 0x30 /**< General purpose 1 */ #define MIDI_CTL_LSB_GENERAL_PURPOSE2 0x31 /**< General purpose 2 */ #define MIDI_CTL_LSB_GENERAL_PURPOSE3 0x32 /**< General purpose 3 */ #define MIDI_CTL_LSB_GENERAL_PURPOSE4 0x33 /**< General purpose 4 */ #define MIDI_CTL_SUSTAIN 0x40 /**< Sustain pedal */ #define MIDI_CTL_PORTAMENTO 0x41 /**< Portamento */ #define MIDI_CTL_SUSTENUTO 0x42 /**< Sostenuto */ #define MIDI_CTL_SOFT_PEDAL 0x43 /**< Soft pedal */ #define MIDI_CTL_LEGATO_FOOTSWITCH 0x44 /**< Legato foot switch */ #define MIDI_CTL_HOLD2 0x45 /**< Hold2 */ #define MIDI_CTL_SC1_SOUND_VARIATION 0x46 /**< SC1 Sound Variation */ #define MIDI_CTL_SC2_TIMBRE 0x47 /**< SC2 Timbre */ #define MIDI_CTL_SC3_RELEASE_TIME 0x48 /**< SC3 Release Time */ #define MIDI_CTL_SC4_ATTACK_TIME 0x49 /**< SC4 Attack Time */ #define MIDI_CTL_SC5_BRIGHTNESS 0x4a /**< SC5 Brightness */ #define MIDI_CTL_SC6 0x4b /**< SC6 */ #define MIDI_CTL_SC7 0x4c /**< SC7 */ #define MIDI_CTL_SC8 0x4d /**< SC8 */ #define MIDI_CTL_SC9 0x4e /**< SC9 */ #define MIDI_CTL_SC10 0x4f /**< SC10 */ #define MIDI_CTL_GENERAL_PURPOSE5 0x50 /**< General purpose 5 */ #define MIDI_CTL_GENERAL_PURPOSE6 0x51 /**< General purpose 6 */ #define MIDI_CTL_GENERAL_PURPOSE7 0x52 /**< General purpose 7 */ #define MIDI_CTL_GENERAL_PURPOSE8 0x53 /**< General purpose 8 */ #define MIDI_CTL_PORTAMENTO_CONTROL 0x54 /**< Portamento control */ #define MIDI_CTL_E1_REVERB_DEPTH 0x5b /**< E1 Reverb Depth */ #define MIDI_CTL_E2_TREMOLO_DEPTH 0x5c /**< E2 Tremolo Depth */ #define MIDI_CTL_E3_CHORUS_DEPTH 0x5d /**< E3 Chorus Depth */ #define MIDI_CTL_E4_DETUNE_DEPTH 0x5e /**< E4 Detune Depth */ #define MIDI_CTL_E5_PHASER_DEPTH 0x5f /**< E5 Phaser Depth */ #define MIDI_CTL_DATA_INCREMENT 0x60 /**< Data Increment */ #define MIDI_CTL_DATA_DECREMENT 0x61 /**< Data Decrement */ #define MIDI_CTL_NONREG_PARM_NUM_LSB 0x62 /**< Non-registered parameter number */ #define MIDI_CTL_NONREG_PARM_NUM_MSB 0x63 /**< Non-registered parameter number */ #define MIDI_CTL_REGIST_PARM_NUM_LSB 0x64 /**< Registered parameter number */ #define MIDI_CTL_REGIST_PARM_NUM_MSB 0x65 /**< Registered parameter number */ #define MIDI_CTL_ALL_SOUNDS_OFF 0x78 /**< All sounds off */ #define MIDI_CTL_RESET_CONTROLLERS 0x79 /**< Reset Controllers */ #define MIDI_CTL_LOCAL_CONTROL_SWITCH 0x7a /**< Local control switch */ #define MIDI_CTL_ALL_NOTES_OFF 0x7b /**< All notes off */ #define MIDI_CTL_OMNI_OFF 0x7c /**< Omni off */ #define MIDI_CTL_OMNI_ON 0x7d /**< Omni on */ #define MIDI_CTL_MONO1 0x7e /**< Mono1 */ #define MIDI_CTL_MONO2 0x7f /**< Mono2 */ /** \} */ /** \} */ #ifdef __cplusplus } #endif #endif /* __ALSA_ASOUNDEF_H */ sonic-visualiser-3.0.3/svcore/plugin/api/alsa/asoundlib.h0000644000000000000000000000045613111512442021562 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for Mac OS X the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. */ #include #include #include #include sonic-visualiser-3.0.3/svcore/plugin/api/alsa/seq.h0000644000000000000000000001334713111512442020375 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for Mac OS X the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. */ /** * \file * \brief Application interface library for the ALSA driver * \author Jaroslav Kysela * \author Abramo Bagnara * \author Takashi Iwai * \date 1998-2001 */ /* * Application interface library for the ALSA driver * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __ALSA_SEQ_H #define __ALSA_SEQ_H #ifdef __cplusplus extern "C" { #endif /** * \defgroup SeqEvType Sequencer Event Type Checks * Sequencer Event Type Checks * \ingroup Sequencer * \{ */ /* event type macros */ enum { SND_SEQ_EVFLG_RESULT, SND_SEQ_EVFLG_NOTE, SND_SEQ_EVFLG_CONTROL, SND_SEQ_EVFLG_QUEUE, SND_SEQ_EVFLG_SYSTEM, SND_SEQ_EVFLG_MESSAGE, SND_SEQ_EVFLG_CONNECTION, SND_SEQ_EVFLG_SAMPLE, SND_SEQ_EVFLG_USERS, SND_SEQ_EVFLG_INSTR, SND_SEQ_EVFLG_QUOTE, SND_SEQ_EVFLG_NONE, SND_SEQ_EVFLG_RAW, SND_SEQ_EVFLG_FIXED, SND_SEQ_EVFLG_VARIABLE, SND_SEQ_EVFLG_VARUSR }; enum { SND_SEQ_EVFLG_NOTE_ONEARG, SND_SEQ_EVFLG_NOTE_TWOARG }; enum { SND_SEQ_EVFLG_QUEUE_NOARG, SND_SEQ_EVFLG_QUEUE_TICK, SND_SEQ_EVFLG_QUEUE_TIME, SND_SEQ_EVFLG_QUEUE_VALUE }; /** * Exported event type table * * This table is referred by snd_seq_ev_is_xxx. */ extern const unsigned int snd_seq_event_types[]; #define _SND_SEQ_TYPE(x) (1<<(x)) /**< master type - 24bit */ #define _SND_SEQ_TYPE_OPT(x) ((x)<<24) /**< optional type - 8bit */ /** check the event type */ #define snd_seq_type_check(ev,x) (snd_seq_event_types[(ev)->type] & _SND_SEQ_TYPE(x)) /** event type check: result events */ #define snd_seq_ev_is_result_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_RESULT) /** event type check: note events */ #define snd_seq_ev_is_note_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_NOTE) /** event type check: control events */ #define snd_seq_ev_is_control_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_CONTROL) /** event type check: channel specific events */ #define snd_seq_ev_is_channel_type(ev) \ (snd_seq_event_types[(ev)->type] & (_SND_SEQ_TYPE(SND_SEQ_EVFLG_NOTE) | _SND_SEQ_TYPE(SND_SEQ_EVFLG_CONTROL))) /** event type check: queue control events */ #define snd_seq_ev_is_queue_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_QUEUE) /** event type check: system status messages */ #define snd_seq_ev_is_message_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_MESSAGE) /** event type check: system status messages */ #define snd_seq_ev_is_subscribe_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_CONNECTION) /** event type check: sample messages */ #define snd_seq_ev_is_sample_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_SAMPLE) /** event type check: user-defined messages */ #define snd_seq_ev_is_user_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_USERS) /** event type check: instrument layer events */ #define snd_seq_ev_is_instr_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_INSTR) /** event type check: fixed length events */ #define snd_seq_ev_is_fixed_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_FIXED) /** event type check: variable length events */ #define snd_seq_ev_is_variable_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_VARIABLE) /** event type check: user pointer events */ #define snd_seq_ev_is_varusr_type(ev) \ snd_seq_type_check(ev, SND_SEQ_EVFLG_VARUSR) /** event type check: reserved for kernel */ #define snd_seq_ev_is_reserved(ev) \ (! snd_seq_event_types[(ev)->type]) /** * macros to check event flags */ /** prior events */ #define snd_seq_ev_is_prior(ev) \ (((ev)->flags & SND_SEQ_PRIORITY_MASK) == SND_SEQ_PRIORITY_HIGH) /** get the data length type */ #define snd_seq_ev_length_type(ev) \ ((ev)->flags & SND_SEQ_EVENT_LENGTH_MASK) /** fixed length events */ #define snd_seq_ev_is_fixed(ev) \ (snd_seq_ev_length_type(ev) == SND_SEQ_EVENT_LENGTH_FIXED) /** variable length events */ #define snd_seq_ev_is_variable(ev) \ (snd_seq_ev_length_type(ev) == SND_SEQ_EVENT_LENGTH_VARIABLE) /** variable length on user-space */ #define snd_seq_ev_is_varusr(ev) \ (snd_seq_ev_length_type(ev) == SND_SEQ_EVENT_LENGTH_VARUSR) /** time-stamp type */ #define snd_seq_ev_timestamp_type(ev) \ ((ev)->flags & SND_SEQ_TIME_STAMP_MASK) /** event is in tick time */ #define snd_seq_ev_is_tick(ev) \ (snd_seq_ev_timestamp_type(ev) == SND_SEQ_TIME_STAMP_TICK) /** event is in real-time */ #define snd_seq_ev_is_real(ev) \ (snd_seq_ev_timestamp_type(ev) == SND_SEQ_TIME_STAMP_REAL) /** time-mode type */ #define snd_seq_ev_timemode_type(ev) \ ((ev)->flags & SND_SEQ_TIME_MODE_MASK) /** scheduled in absolute time */ #define snd_seq_ev_is_abstime(ev) \ (snd_seq_ev_timemode_type(ev) == SND_SEQ_TIME_MODE_ABS) /** scheduled in relative time */ #define snd_seq_ev_is_reltime(ev) \ (snd_seq_ev_timemode_type(ev) == SND_SEQ_TIME_MODE_REL) /** direct dispatched events */ #define snd_seq_ev_is_direct(ev) \ ((ev)->queue == SND_SEQ_QUEUE_DIRECT) /** \} */ #ifdef __cplusplus } #endif #endif /* __ALSA_SEQ_H */ sonic-visualiser-3.0.3/svcore/plugin/api/alsa/seq_event.h0000644000000000000000000004006713111512442021575 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for Mac OS X the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. */ /** * \file * \brief Application interface library for the ALSA driver * \author Jaroslav Kysela * \author Abramo Bagnara * \author Takashi Iwai * \date 1998-2001 * * Application interface library for the ALSA driver * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __ALSA_SEQ_EVENT_H #define __ALSA_SEQ_EVENT_H /** * \defgroup SeqEvents Sequencer Event Definitions * Sequencer Event Definitions * \ingroup Sequencer * \{ */ /** * Sequencer event data type */ typedef unsigned char snd_seq_event_type_t; /** Sequencer event type */ enum snd_seq_event_type { /** system status; event data type = #snd_seq_result_t */ SND_SEQ_EVENT_SYSTEM = 0, /** returned result status; event data type = #snd_seq_result_t */ SND_SEQ_EVENT_RESULT, /** note on and off with duration; event data type = #snd_seq_ev_note_t */ SND_SEQ_EVENT_NOTE = 5, /** note on; event data type = #snd_seq_ev_note_t */ SND_SEQ_EVENT_NOTEON, /** note off; event data type = #snd_seq_ev_note_t */ SND_SEQ_EVENT_NOTEOFF, /** key pressure change (aftertouch); event data type = #snd_seq_ev_note_t */ SND_SEQ_EVENT_KEYPRESS, /** controller; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_CONTROLLER = 10, /** program change; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_PGMCHANGE, /** channel pressure; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_CHANPRESS, /** pitchwheel; event data type = #snd_seq_ev_ctrl_t; data is from -8192 to 8191) */ SND_SEQ_EVENT_PITCHBEND, /** 14 bit controller value; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_CONTROL14, /** 14 bit NRPN; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_NONREGPARAM, /** 14 bit RPN; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_REGPARAM, /** SPP with LSB and MSB values; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_SONGPOS = 20, /** Song Select with song ID number; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_SONGSEL, /** midi time code quarter frame; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_QFRAME, /** SMF Time Signature event; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_TIMESIGN, /** SMF Key Signature event; event data type = #snd_seq_ev_ctrl_t */ SND_SEQ_EVENT_KEYSIGN, /** MIDI Real Time Start message; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_START = 30, /** MIDI Real Time Continue message; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_CONTINUE, /** MIDI Real Time Stop message; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_STOP, /** Set tick queue position; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_SETPOS_TICK, /** Set real-time queue position; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_SETPOS_TIME, /** (SMF) Tempo event; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_TEMPO, /** MIDI Real Time Clock message; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_CLOCK, /** MIDI Real Time Tick message; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_TICK, /** Queue timer skew; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_QUEUE_SKEW, /** Sync position changed; event data type = #snd_seq_ev_queue_control_t */ SND_SEQ_EVENT_SYNC_POS, /** Tune request; event data type = none */ SND_SEQ_EVENT_TUNE_REQUEST = 40, /** Reset to power-on state; event data type = none */ SND_SEQ_EVENT_RESET, /** Active sensing event; event data type = none */ SND_SEQ_EVENT_SENSING, /** Echo-back event; event data type = any type */ SND_SEQ_EVENT_ECHO = 50, /** OSS emulation raw event; event data type = any type */ SND_SEQ_EVENT_OSS, /** New client has connected; event data type = #snd_seq_addr_t */ SND_SEQ_EVENT_CLIENT_START = 60, /** Client has left the system; event data type = #snd_seq_addr_t */ SND_SEQ_EVENT_CLIENT_EXIT, /** Client status/info has changed; event data type = #snd_seq_addr_t */ SND_SEQ_EVENT_CLIENT_CHANGE, /** New port was created; event data type = #snd_seq_addr_t */ SND_SEQ_EVENT_PORT_START, /** Port was deleted from system; event data type = #snd_seq_addr_t */ SND_SEQ_EVENT_PORT_EXIT, /** Port status/info has changed; event data type = #snd_seq_addr_t */ SND_SEQ_EVENT_PORT_CHANGE, /** Ports connected; event data type = #snd_seq_connect_t */ SND_SEQ_EVENT_PORT_SUBSCRIBED, /** Ports disconnected; event data type = #snd_seq_connect_t */ SND_SEQ_EVENT_PORT_UNSUBSCRIBED, /** Sample select; event data type = #snd_seq_ev_sample_control_t */ SND_SEQ_EVENT_SAMPLE = 70, /** Sample cluster select; event data type = #snd_seq_ev_sample_control_t */ SND_SEQ_EVENT_SAMPLE_CLUSTER, /** voice start */ SND_SEQ_EVENT_SAMPLE_START, /** voice stop */ SND_SEQ_EVENT_SAMPLE_STOP, /** playback frequency */ SND_SEQ_EVENT_SAMPLE_FREQ, /** volume and balance */ SND_SEQ_EVENT_SAMPLE_VOLUME, /** sample loop */ SND_SEQ_EVENT_SAMPLE_LOOP, /** sample position */ SND_SEQ_EVENT_SAMPLE_POSITION, /** private (hardware dependent) event */ SND_SEQ_EVENT_SAMPLE_PRIVATE1, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR0 = 90, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR1, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR2, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR3, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR4, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR5, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR6, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR7, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR8, /** user-defined event; event data type = any (fixed size) */ SND_SEQ_EVENT_USR9, /** begin of instrument management */ SND_SEQ_EVENT_INSTR_BEGIN = 100, /** end of instrument management */ SND_SEQ_EVENT_INSTR_END, /** query instrument interface info */ SND_SEQ_EVENT_INSTR_INFO, /** result of instrument interface info */ SND_SEQ_EVENT_INSTR_INFO_RESULT, /** query instrument format info */ SND_SEQ_EVENT_INSTR_FINFO, /** result of instrument format info */ SND_SEQ_EVENT_INSTR_FINFO_RESULT, /** reset instrument instrument memory */ SND_SEQ_EVENT_INSTR_RESET, /** get instrument interface status */ SND_SEQ_EVENT_INSTR_STATUS, /** result of instrument interface status */ SND_SEQ_EVENT_INSTR_STATUS_RESULT, /** put an instrument to port */ SND_SEQ_EVENT_INSTR_PUT, /** get an instrument from port */ SND_SEQ_EVENT_INSTR_GET, /** result of instrument query */ SND_SEQ_EVENT_INSTR_GET_RESULT, /** free instrument(s) */ SND_SEQ_EVENT_INSTR_FREE, /** get instrument list */ SND_SEQ_EVENT_INSTR_LIST, /** result of instrument list */ SND_SEQ_EVENT_INSTR_LIST_RESULT, /** set cluster parameters */ SND_SEQ_EVENT_INSTR_CLUSTER, /** get cluster parameters */ SND_SEQ_EVENT_INSTR_CLUSTER_GET, /** result of cluster parameters */ SND_SEQ_EVENT_INSTR_CLUSTER_RESULT, /** instrument change */ SND_SEQ_EVENT_INSTR_CHANGE, /** system exclusive data (variable length); event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_SYSEX = 130, /** error event; event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_BOUNCE, /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_USR_VAR0 = 135, /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_USR_VAR1, /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_USR_VAR2, /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_USR_VAR3, /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ SND_SEQ_EVENT_USR_VAR4, /** NOP; ignored in any case */ SND_SEQ_EVENT_NONE = 255 }; /** Sequencer event address */ typedef struct snd_seq_addr { unsigned char client; /**< Client id */ unsigned char port; /**< Port id */ } snd_seq_addr_t; /** Connection (subscription) between ports */ typedef struct snd_seq_connect { snd_seq_addr_t sender; /**< sender address */ snd_seq_addr_t dest; /**< destination address */ } snd_seq_connect_t; /** Real-time data record */ typedef struct snd_seq_real_time { unsigned int tv_sec; /**< seconds */ unsigned int tv_nsec; /**< nanoseconds */ } snd_seq_real_time_t; /** (MIDI) Tick-time data record */ typedef unsigned int snd_seq_tick_time_t; /** unioned time stamp */ typedef union snd_seq_timestamp { snd_seq_tick_time_t tick; /**< tick-time */ struct snd_seq_real_time time; /**< real-time */ } snd_seq_timestamp_t; /** * Event mode flags * * NOTE: only 8 bits available! */ #define SND_SEQ_TIME_STAMP_TICK (0<<0) /**< timestamp in clock ticks */ #define SND_SEQ_TIME_STAMP_REAL (1<<0) /**< timestamp in real time */ #define SND_SEQ_TIME_STAMP_MASK (1<<0) /**< mask for timestamp bits */ #define SND_SEQ_TIME_MODE_ABS (0<<1) /**< absolute timestamp */ #define SND_SEQ_TIME_MODE_REL (1<<1) /**< relative to current time */ #define SND_SEQ_TIME_MODE_MASK (1<<1) /**< mask for time mode bits */ #define SND_SEQ_EVENT_LENGTH_FIXED (0<<2) /**< fixed event size */ #define SND_SEQ_EVENT_LENGTH_VARIABLE (1<<2) /**< variable event size */ #define SND_SEQ_EVENT_LENGTH_VARUSR (2<<2) /**< variable event size - user memory space */ #define SND_SEQ_EVENT_LENGTH_MASK (3<<2) /**< mask for event length bits */ #define SND_SEQ_PRIORITY_NORMAL (0<<4) /**< normal priority */ #define SND_SEQ_PRIORITY_HIGH (1<<4) /**< event should be processed before others */ #define SND_SEQ_PRIORITY_MASK (1<<4) /**< mask for priority bits */ /** Note event */ typedef struct snd_seq_ev_note { unsigned char channel; /**< channel number */ unsigned char note; /**< note */ unsigned char velocity; /**< velocity */ unsigned char off_velocity; /**< note-off velocity; only for #SND_SEQ_EVENT_NOTE */ unsigned int duration; /**< duration until note-off; only for #SND_SEQ_EVENT_NOTE */ } snd_seq_ev_note_t; /** Controller event */ typedef struct snd_seq_ev_ctrl { unsigned char channel; /**< channel number */ unsigned char unused[3]; /**< reserved */ unsigned int param; /**< control parameter */ signed int value; /**< control value */ } snd_seq_ev_ctrl_t; /** generic set of bytes (12x8 bit) */ typedef struct snd_seq_ev_raw8 { unsigned char d[12]; /**< 8 bit value */ } snd_seq_ev_raw8_t; /** generic set of integers (3x32 bit) */ typedef struct snd_seq_ev_raw32 { unsigned int d[3]; /**< 32 bit value */ } snd_seq_ev_raw32_t; /** external stored data */ typedef struct snd_seq_ev_ext { unsigned int len; /**< length of data */ void *ptr; /**< pointer to data (note: can be 64-bit) */ } #ifdef __GNUC__ __attribute__((packed)) #endif snd_seq_ev_ext_t; /** Instrument cluster type */ typedef unsigned int snd_seq_instr_cluster_t; /** Instrument type */ typedef struct snd_seq_instr { snd_seq_instr_cluster_t cluster; /**< cluster id */ unsigned int std; /**< instrument standard id; the upper byte means a private instrument (owner - client id) */ unsigned short bank; /**< instrument bank id */ unsigned short prg; /**< instrument program id */ } snd_seq_instr_t; /** sample number */ typedef struct snd_seq_ev_sample { unsigned int std; /**< sample standard id */ unsigned short bank; /**< sample bank id */ unsigned short prg; /**< sample program id */ } snd_seq_ev_sample_t; /** sample cluster */ typedef struct snd_seq_ev_cluster { snd_seq_instr_cluster_t cluster; /**< cluster id */ } snd_seq_ev_cluster_t; /** sample position */ typedef unsigned int snd_seq_position_t; /**< playback position (in samples) * 16 */ /** sample stop mode */ typedef enum snd_seq_stop_mode { SND_SEQ_SAMPLE_STOP_IMMEDIATELY = 0, /**< terminate playing immediately */ SND_SEQ_SAMPLE_STOP_VENVELOPE = 1, /**< finish volume envelope */ SND_SEQ_SAMPLE_STOP_LOOP = 2 /**< terminate loop and finish wave */ } snd_seq_stop_mode_t; /** sample frequency */ typedef int snd_seq_frequency_t; /**< playback frequency in HZ * 16 */ /** sample volume control; if any value is set to -1 == do not change */ typedef struct snd_seq_ev_volume { signed short volume; /**< range: 0-16383 */ signed short lr; /**< left-right balance; range: 0-16383 */ signed short fr; /**< front-rear balance; range: 0-16383 */ signed short du; /**< down-up balance; range: 0-16383 */ } snd_seq_ev_volume_t; /** simple loop redefinition */ typedef struct snd_seq_ev_loop { unsigned int start; /**< loop start (in samples) * 16 */ unsigned int end; /**< loop end (in samples) * 16 */ } snd_seq_ev_loop_t; /** Sample control events */ typedef struct snd_seq_ev_sample_control { unsigned char channel; /**< channel */ unsigned char unused[3]; /**< reserved */ union { snd_seq_ev_sample_t sample; /**< sample number */ snd_seq_ev_cluster_t cluster; /**< cluster number */ snd_seq_position_t position; /**< position */ snd_seq_stop_mode_t stop_mode; /**< stop mode */ snd_seq_frequency_t frequency; /**< frequency */ snd_seq_ev_volume_t volume; /**< volume */ snd_seq_ev_loop_t loop; /**< loop control */ unsigned char raw8[8]; /**< raw 8-bit */ } param; /**< control parameters */ } snd_seq_ev_sample_control_t; /** INSTR_BEGIN event */ typedef struct snd_seq_ev_instr_begin { int timeout; /**< zero = forever, otherwise timeout in ms */ } snd_seq_ev_instr_begin_t; /** Result events */ typedef struct snd_seq_result { int event; /**< processed event type */ int result; /**< status */ } snd_seq_result_t; /** Queue skew values */ typedef struct snd_seq_queue_skew { unsigned int value; /**< skew value */ unsigned int base; /**< skew base */ } snd_seq_queue_skew_t; /** queue timer control */ typedef struct snd_seq_ev_queue_control { unsigned char queue; /**< affected queue */ unsigned char unused[3]; /**< reserved */ union { signed int value; /**< affected value (e.g. tempo) */ snd_seq_timestamp_t time; /**< time */ unsigned int position; /**< sync position */ snd_seq_queue_skew_t skew; /**< queue skew */ unsigned int d32[2]; /**< any data */ unsigned char d8[8]; /**< any data */ } param; /**< data value union */ } snd_seq_ev_queue_control_t; /** Sequencer event */ typedef struct snd_seq_event { snd_seq_event_type_t type; /**< event type */ unsigned char flags; /**< event flags */ unsigned char tag; /**< tag */ unsigned char queue; /**< schedule queue */ snd_seq_timestamp_t time; /**< schedule time */ snd_seq_addr_t source; /**< source address */ snd_seq_addr_t dest; /**< destination address */ union { snd_seq_ev_note_t note; /**< note information */ snd_seq_ev_ctrl_t control; /**< MIDI control information */ snd_seq_ev_raw8_t raw8; /**< raw8 data */ snd_seq_ev_raw32_t raw32; /**< raw32 data */ snd_seq_ev_ext_t ext; /**< external data */ snd_seq_ev_queue_control_t queue; /**< queue control */ snd_seq_timestamp_t time; /**< timestamp */ snd_seq_addr_t addr; /**< address */ snd_seq_connect_t connect; /**< connect information */ snd_seq_result_t result; /**< operation result code */ snd_seq_ev_instr_begin_t instr_begin; /**< instrument */ snd_seq_ev_sample_control_t sample; /**< sample control */ } data; /**< event data... */ } snd_seq_event_t; /** \} */ #endif /* __ALSA_SEQ_EVENT_H */ sonic-visualiser-3.0.3/svcore/plugin/api/alsa/seq_midi_event.h0000644000000000000000000000505313111512442022573 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for Mac OS X the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. */ /** * \file * \brief Application interface library for the ALSA driver * \author Jaroslav Kysela * \author Abramo Bagnara * \author Takashi Iwai * \date 1998-2001 * * Application interface library for the ALSA driver * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __ALSA_SEQ_MIDI_EVENT_H #define __ALSA_SEQ_MIDI_EVENT_H #ifdef __cplusplus extern "C" { #endif /** * \defgroup MIDI_Event Sequencer event <-> MIDI byte stream coder * \ingroup Sequencer * Sequencer event <-> MIDI byte stream coder * \{ */ /** container for sequencer midi event parsers */ typedef struct snd_midi_event snd_midi_event_t; int snd_midi_event_new(size_t bufsize, snd_midi_event_t **rdev); /* int snd_midi_event_resize_buffer(snd_midi_event_t *dev, size_t bufsize); */ void snd_midi_event_free(snd_midi_event_t *dev); /* void snd_midi_event_init(snd_midi_event_t *dev); */ void snd_midi_event_reset_encode(snd_midi_event_t *dev); /* void snd_midi_event_reset_decode(snd_midi_event_t *dev); */ /* void snd_midi_event_no_status(snd_midi_event_t *dev, int on); */ /* encode from byte stream - return number of written bytes if success */ long snd_midi_event_encode(snd_midi_event_t *dev, const unsigned char *buf, long count, snd_seq_event_t *ev); int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev); /* decode from event to bytes - return number of written bytes if success */ /* long snd_midi_event_decode(snd_midi_event_t *dev, unsigned char *buf, long count, const snd_seq_event_t *ev); */ /** \} */ #ifdef __cplusplus } #endif #endif /* __ALSA_SEQ_MIDI_EVENT_H */ sonic-visualiser-3.0.3/svcore/plugin/api/alsa/sound/asequencer.h0000644000000000000000000000271013111512442023060 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for Mac OS X the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. */ /* * Main header file for the ALSA sequencer * Copyright (c) 1998-1999 by Frank van de Pol * (c) 1998-1999 by Jaroslav Kysela * * * 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 * */ #ifndef __SOUND_ASEQUENCER_H #define __SOUND_ASEQUENCER_H #define SNDRV_SEQ_EVENT_SYSEX 130 /* system exclusive data (variable length) */ #define SNDRV_SEQ_EVENT_LENGTH_FIXED (0<<2) /* fixed event size */ #define SNDRV_SEQ_EVENT_LENGTH_VARIABLE (1<<2) /* variable event size */ #define SNDRV_SEQ_EVENT_LENGTH_MASK (3<<2) #endif /* __SOUND_ASEQUENCER_H */ sonic-visualiser-3.0.3/svcore/plugin/api/dssi.h0000644000000000000000000006664513111512442017640 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- */ /* dssi.h DSSI version 0.10 Copyright (c) 2004,2005 Chris Cannam, Steve Harris and Sean Bolton This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef DSSI_INCLUDED #define DSSI_INCLUDED #include "ladspa.h" #include "alsa/seq_event.h" #define DSSI_VERSION "0.10" #define DSSI_VERSION_MAJOR 0 #define DSSI_VERSION_MINOR 10 #ifdef __cplusplus extern "C" { #endif /* There is a need for an API that supports hosted MIDI soft synths with GUIs in Linux audio applications. In time the GMPI initiative should comprehensively address this need, but the requirement for Linux applications to be able to support simple hosted synths is here now, and GMPI is not. This proposal (the "DSSI Soft Synth Interface" or DSSI, pronounced "dizzy") aims to provide a simple solution in a way that we hope will prove complete and compelling enough to support now, yet not so compelling as to supplant GMPI or any other comprehensive future proposal. For simplicity and familiarity, this API is based as far as possible on existing work -- the LADSPA plugin API for control values and audio processing, and the ALSA sequencer event types for MIDI event communication. The GUI part of the proposal is quite new, but may also be applicable retroactively to LADSPA plugins that do not otherwise support this synth interface. */ /* A program wishing to use the DSSI v2 API should set the following symbol to 2 before including this header. */ #if (!defined DSSI_API_LEVEL) #define DSSI_API_LEVEL 1 #endif typedef struct _DSSI_Program_Descriptor { /** Bank number for this program. Note that DSSI does not support MIDI-style separation of bank LSB and MSB values. There is no restriction on the set of available banks: the numbers do not need to be contiguous, there does not need to be a bank 0, etc. */ unsigned long Bank; /** Program number (unique within its bank) for this program. There is no restriction on the set of available programs: the numbers do not need to be contiguous, there does not need to be a program 0, etc. */ unsigned long Program; /** Name of the program. */ const char * Name; } DSSI_Program_Descriptor; #define DSSI_TRANSPORT_VALID_STATE 0x01 #define DSSI_TRANSPORT_VALID_BPM 0x02 #define DSSI_TRANSPORT_VALID_BBT 0x10 #define DSSI_TRANSPORT_VALID_TIME 0x20 #define DSSI_TRANSPORT_STATE_STOPPED 0 #define DSSI_TRANSPORT_STATE_RUNNING 1 #define DSSI_TRANSPORT_STATE_FREEWHEELING 2 #define DSSI_TRANSPORT_STATE_OTHER 3 /* waiting for sync, ? */ typedef struct _DSSI_Transport_Info { /** The value of this field indicates which of the following * transport information fields contain valid values. It is * the logical OR of the DSSI_TRANSPORT_VALID_* bits defined * above, and may be zero. */ int Valid; /** This field is valid when (Valid & DSSI_TRANSPORT_VALID_STATE) * is true: * * ---- The current transport state, one of the DSSI_TRANSPORT_STATE_* * values defined above. */ int State; /** This field is valid when (Valid & DSSI_TRANSPORT_VALID_BPM) * is true: * * ---- The current tempo, in beats per minute. */ double Beats_Per_Minute; /** These six fields are valid when (Valid & DSSI_TRANSPORT_VALID_BBT) * is true: * * ---- The bar number at the beginning of the current process cycle. */ unsigned long Bar; /** ---- The beat within that Bar. */ unsigned long Beat; /** ---- The tick within that Beat. */ unsigned long Tick; /** ---- The (possibly fractional) tick count since transport 'start' * and the beginning of the current Bar. */ double Bar_Start_Tick; /** ---- The number of beats per bar. */ float Beats_Per_Bar; /** ---- The number of ticks for each beat. */ double Ticks_Per_Beat; /* [Sean says: I left out the 'beat_type' (time signature "denominator") * field of the jack_position_t structure, because I think it's useless * except to a notation program. Does anybody else feel like we need it?] */ /** These two fields are valid when (Valid & DSSI_TRANSPORT_VALID_TIME) * is true: * * ---- The transport time at the beginning of the current process * cycle, in seconds. */ double Current_Time; /** ---- The transport time at the beginning of the next process cycle, unless repositioning occurs. */ double Next_Time; } DSSI_Transport_Info; typedef struct _DSSI_Host_Descriptor DSSI_Host_Descriptor; /* below */ typedef struct _DSSI_Descriptor { /** * DSSI_API_Version * * This member indicates the DSSI API level used by this plugin. * All plugins must set this to 1 or 2. The version 1 API contains * all DSSI_Descriptor fields through run_multiple_synths_adding(), * while the version 2 API adds the receive_host_descriptor(). */ int DSSI_API_Version; /** * LADSPA_Plugin * * A DSSI synth plugin consists of a LADSPA plugin plus an * additional framework for controlling program settings and * transmitting MIDI events. A plugin must fully implement the * LADSPA descriptor fields as well as the required LADSPA * functions including instantiate() and (de)activate(). It * should also implement run(), with the same behaviour as if * run_synth() (below) were called with no synth events. * * In order to instantiate a synth the host calls the LADSPA * instantiate function, passing in this LADSPA_Descriptor * pointer. The returned LADSPA_Handle is used as the argument * for the DSSI functions below as well as for the LADSPA ones. */ const LADSPA_Descriptor *LADSPA_Plugin; /** * configure() * * This member is a function pointer that sends a piece of * configuration data to the plugin. The key argument specifies * some aspect of the synth's configuration that is to be changed, * and the value argument specifies a new value for it. A plugin * that does not require this facility at all may set this member * to NULL. * * This call is intended to set some session-scoped aspect of a * plugin's behaviour, for example to tell the plugin to load * sample data from a particular file. The plugin should act * immediately on the request. The call should return NULL on * success, or an error string that may be shown to the user. The * host will free the returned value after use if it is non-NULL. * * Calls to configure() are not automated as timed events. * Instead, a host should remember the last value associated with * each key passed to configure() during a given session for a * given plugin instance, and should call configure() with the * correct value for each key the next time it instantiates the * "same" plugin instance, for example on reloading a project in * which the plugin was used before. Plugins should note that a * host may typically instantiate a plugin multiple times with the * same configuration values, and should share data between * instances where practical. * * Calling configure() completely invalidates the program and bank * information last obtained from the plugin. * * Reserved and special key prefixes * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * The DSSI: prefix * ---------------- * Configure keys starting with DSSI: are reserved for particular * purposes documented in the DSSI specification. At the moment, * there is one such key: DSSI:PROJECT_DIRECTORY. A host may call * configure() passing this key and a directory path value. This * indicates to the plugin and its UI that a directory at that * path exists and may be used for project-local data. Plugins * may wish to use the project directory as a fallback location * when looking for other file data, or as a base for relative * paths in other configuration values. * * The GLOBAL: prefix * ------------------ * Configure keys starting with GLOBAL: may be used by the plugin * and its UI for any purpose, but are treated specially by the * host. When one of these keys is used in a configure OSC call * from the plugin UI, the host makes the corresponding configure * call (preserving the GLOBAL: prefix) not only to the target * plugin but also to all other plugins in the same instance * group, as well as their UIs. Note that if any instance * returns non-NULL from configure to indicate error, the host * may stop there (and the set of plugins on which configure has * been called will thus depend on the host implementation). * See also the configure OSC call documentation in RFC.txt. */ char *(*configure)(LADSPA_Handle Instance, const char *Key, const char *Value); #define DSSI_RESERVED_CONFIGURE_PREFIX "DSSI:" #define DSSI_GLOBAL_CONFIGURE_PREFIX "GLOBAL:" #define DSSI_PROJECT_DIRECTORY_KEY \ DSSI_RESERVED_CONFIGURE_PREFIX "PROJECT_DIRECTORY" /** * get_program() * * This member is a function pointer that provides a description * of a program (named preset sound) available on this synth. A * plugin that does not support programs at all should set this * member to NULL. * * The Index argument is an index into the plugin's list of * programs, not a program number as represented by the Program * field of the DSSI_Program_Descriptor. (This distinction is * needed to support synths that use non-contiguous program or * bank numbers.) * * This function returns a DSSI_Program_Descriptor pointer that is * guaranteed to be valid only until the next call to get_program, * deactivate, or configure, on the same plugin instance. This * function must return NULL if passed an Index argument out of * range, so that the host can use it to query the number of * programs as well as their properties. */ const DSSI_Program_Descriptor *(*get_program)(LADSPA_Handle Instance, unsigned long Index); /** * select_program() * * This member is a function pointer that selects a new program * for this synth. The program change should take effect * immediately at the start of the next run_synth() call. (This * means that a host providing the capability of changing programs * between any two notes on a track must vary the block size so as * to place the program change at the right place. A host that * wanted to avoid this would probably just instantiate a plugin * for each program.) * * A plugin that does not support programs at all should set this * member NULL. Plugins should ignore a select_program() call * with an invalid bank or program. * * A plugin is not required to select any particular default * program on activate(): it's the host's duty to set a program * explicitly. The current program is invalidated by any call to * configure(). * * A plugin is permitted to re-write the values of its input * control ports when select_program is called. The host should * re-read the input control port values and update its own * records appropriately. (This is the only circumstance in * which a DSSI plugin is allowed to modify its own input ports.) */ void (*select_program)(LADSPA_Handle Instance, unsigned long Bank, unsigned long Program); /** * get_midi_controller_for_port() * * This member is a function pointer that returns the MIDI * controller number or NRPN that should be mapped to the given * input control port. If the given port should not have any MIDI * controller mapped to it, the function should return DSSI_NONE. * The behaviour of this function is undefined if the given port * number does not correspond to an input control port. A plugin * that does not want MIDI controllers mapped to ports at all may * set this member NULL. * * Correct values can be got using the macros DSSI_CC(num) and * DSSI_NRPN(num) as appropriate, and values can be combined using * bitwise OR: e.g. DSSI_CC(23) | DSSI_NRPN(1069) means the port * should respond to CC #23 and NRPN #1069. * * The host is responsible for doing proper scaling from MIDI * controller and NRPN value ranges to port ranges according to * the plugin's LADSPA port hints. Hosts should not deliver * through run_synth any MIDI controller events that have already * been mapped to control port values. * * A plugin should not attempt to request mappings from * controllers 0 or 32 (MIDI Bank Select MSB and LSB). */ int (*get_midi_controller_for_port)(LADSPA_Handle Instance, unsigned long Port); /** * run_synth() * * This member is a function pointer that runs a synth for a * block. This is identical in function to the LADSPA run() * function, except that it also supplies events to the synth. * * A plugin may provide this function, run_multiple_synths() (see * below), both, or neither (if it is not in fact a synth). A * plugin that does not provide this function must set this member * to NULL. Authors of synth plugins are encouraged to provide * this function if at all possible. * * The Events pointer points to a block of EventCount ALSA * sequencer events, which is used to communicate MIDI and related * events to the synth. Each event is timestamped relative to the * start of the block, (mis)using the ALSA "tick time" field as a * frame count. The host is responsible for ensuring that events * with differing timestamps are already ordered by time. * * See also the notes on activation, port connection etc in * ladpsa.h, in the context of the LADSPA run() function. * * Note Events * ~~~~~~~~~~~ * There are two minor requirements aimed at making the plugin * writer's life as simple as possible: * * 1. A host must never send events of type SND_SEQ_EVENT_NOTE. * Notes should always be sent as separate SND_SEQ_EVENT_NOTE_ON * and NOTE_OFF events. A plugin should discard any one-point * NOTE events it sees. * * 2. A host must not attempt to switch notes off by sending * zero-velocity NOTE_ON events. It should always send true * NOTE_OFFs. It is the host's responsibility to remap events in * cases where an external MIDI source has sent it zero-velocity * NOTE_ONs. * * Bank and Program Events * ~~~~~~~~~~~~~~~~~~~~~~~ * Hosts must map MIDI Bank Select MSB and LSB (0 and 32) * controllers and MIDI Program Change events onto the banks and * programs specified by the plugin, using the DSSI select_program * call. No host should ever deliver a program change or bank * select controller to a plugin via run_synth. */ void (*run_synth)(LADSPA_Handle Instance, unsigned long SampleCount, snd_seq_event_t *Events, unsigned long EventCount); /** * run_synth_adding() * * This member is a function pointer that runs an instance of a * synth for a block, adding its outputs to the values already * present at the output ports. This is provided for symmetry * with LADSPA run_adding(), and is equally optional. A plugin * that does not provide it must set this member to NULL. */ void (*run_synth_adding)(LADSPA_Handle Instance, unsigned long SampleCount, snd_seq_event_t *Events, unsigned long EventCount); /** * run_multiple_synths() * * This member is a function pointer that runs multiple synth * instances for a block. This is very similar to run_synth(), * except that Instances, Events, and EventCounts each point to * arrays that hold the LADSPA handles, event buffers, and * event counts for each of InstanceCount instances. That is, * Instances points to an array of InstanceCount pointers to * DSSI plugin instantiations, Events points to an array of * pointers to each instantiation's respective event list, and * EventCounts points to an array containing each instantiation's * respective event count. * * A host using this function must guarantee that ALL active * instances of the plugin are represented in each call to the * function -- that is, a host may not call run_multiple_synths() * for some instances of a given plugin and then call run_synth() * as well for others. 'All .. instances of the plugin' means * every instance sharing the same LADSPA label and shared object * (*.so) file (rather than every instance sharing the same *.so). * 'Active' means any instance for which activate() has been called * but deactivate() has not. * * A plugin may provide this function, run_synths() (see above), * both, or neither (if it not in fact a synth). A plugin that * does not provide this function must set this member to NULL. * Plugin authors implementing run_multiple_synths are strongly * encouraged to implement run_synth as well if at all possible, * to aid simplistic hosts, even where it would be less efficient * to use it. */ void (*run_multiple_synths)(unsigned long InstanceCount, LADSPA_Handle *Instances, unsigned long SampleCount, snd_seq_event_t **Events, unsigned long *EventCounts); /** * run_multiple_synths_adding() * * This member is a function pointer that runs multiple synth * instances for a block, adding each synth's outputs to the * values already present at the output ports. This is provided * for symmetry with both the DSSI run_multiple_synths() and LADSPA * run_adding() functions, and is equally optional. A plugin * that does not provide it must set this member to NULL. */ void (*run_multiple_synths_adding)(unsigned long InstanceCount, LADSPA_Handle *Instances, unsigned long SampleCount, snd_seq_event_t **Events, unsigned long *EventCounts); #if (DSSI_API_LEVEL > 1) /** * receive_host_descriptor() * * This member is a function pointer by which a host may provide * a plugin with a pointer to its DSSI_Host_Descriptor. Hosts * which provide host descriptor support must call this function * once per plugin shared object file, before any calls to * instantiate(). * * NOTE: This field was added in version 2 of the DSSI API. Hosts * supporting version 2 must not access this field in a plugin * whose DSSI_API_Version is 1, and plugins supporting version 2 * should behave reasonably under hosts (of any version) which do * not implement this function. A version 2 plugin that does not * provide this function must set this member to NULL. */ void (*receive_host_descriptor)(const DSSI_Host_Descriptor *Descriptor); #endif } DSSI_Descriptor; struct _DSSI_Host_Descriptor { /** * DSSI_API_Version * * This member indicates the DSSI API level used by this host. * All hosts must set this to 2. Hopefully, we'll get this right * the first time, and this will never be needed. */ int DSSI_API_Version; /** * request_transport_information() * * This member is a function pointer by which a plugin instance may * request that a host begin providing transport information (if * Request is non-zero), or notify the host that it no longer needs * transport information (if Request is zero). Upon receiving a * non-zero request, the host should return a pointer to a * DSSI_Transport_Info structure if it is able to provide transport * information, or NULL otherwise. * * Once a plugin instance has received a non-null transport * information pointer, it may read from the structure at any time * within the execution of an audio class function (see doc/RFC.txt). * It should not consider the structure contents to be meaningful * while within a instantiation or control class function. Also, * since the validity of fields within the structure may change * between each new invocation of an audio class function, a plugin * instance must check the Valid field of the structure accordingly * before using the structure's other contents. * * A host which does not support this function must set this member * to NULL. */ DSSI_Transport_Info * (*request_transport_information)(LADSPA_Handle Instance, int Request); /** * request_midi_send() * * This member is a function pointer that allows a plugin to * request the ability to send MIDI events to the host. * * While the interpretation of plugin-generated MIDI events is * host implementation specific, a mechanism exists by which a * plugin may declare to the host the number of destination * 'ports' and MIDI channels it can expect will be used in the * plugin-generated events. Plugins which generate unchannelized * MIDI should supply zero for both Ports and Channels, otherwise * they should supply the maximum numbers for Ports and Channels * they expect to use. * * A plugin instance must call this function during instantiate(). * [Sean says: this restriction seems reasonable to me, since * the host may need to create output ports, etc., and instantiate() * seems like a good place to do such things. I'm sure I haven't * fully thought through all the details, though....] * * The host should return a non-zero value if it is able to * provide MIDI send for the plugin instance, otherwise it should * return zero, and the plugin instance may not subsequently call * midi_send(). * * A host which does not support the MIDI send function must set * both this member and (*midi_send)() below to NULL. */ int (*request_midi_send)(LADSPA_Handle Instance, unsigned char Ports, unsigned char Channels); /** * midi_send() * * This member is a function pointer by which a plugin actually * sends MIDI events to the host (provided it has received a non- * zero return from request_midi_send()). As in the run_synth() * functions, the Event pointer points to a block of EventCount * ALSA sequencer events. The dest.port and data.*.channel fields * of each event are used to specify destination port and channel, * respectively, when the plugin is supplying channelized events. * * A plugin may only call this function from within the execution * of the audio class run_*() or select_program() functions. When * called from a run_*() functions, the events are timestamped * relative to the start of the block, (mis)using the ALSA "tick * time" field as a frame count. The plugin is responsible for * ensuring that events with differing timestamps are already * ordered by time, and that timestamps across multiple calls to * midi_send() from within the same run_*() invocation are * monotonic. When midi_send() is called from within * select_program(), the timestamps are ignored, and the events * are considered to originate at the same frame time as the * select_program() call, if such a timing can be considered * meaningful. * * The memory pointed to by Event belongs to the plugin, and it is * the host's responsibility to copy the events as needed before * returning from the midi_send() call. * * A host which does not support the MIDI send function must set * both this member and (*request_midi_send)() above to NULL. */ void (*midi_send)(LADSPA_Handle Instance, snd_seq_event_t *Event, unsigned long EventCount); /** * . . . additional fields could follow here, possibly supporting: * * - a facility by which a plugin instance may request from a * host a non-realtime thread in which to do off-line * rendering, I/O, etc., thus (hopefully) avoiding the * crashes that seem to occur when plugins create their own * threads. I got this idea after noticing that ZynAddSubFX * achieves its gorgeous textures while remaining very * responsive by doing a lot of non-real-time rendering. * Several other uses for it have been mentioned on the DSSI * list; I forget what. * * - per-voice audio output */ int (*request_non_rt_thread)(LADSPA_Handle Instance, void (*RunFunction)(LADSPA_Handle Instance)); }; /** * DSSI supports a plugin discovery method similar to that of LADSPA: * * - DSSI hosts may wish to locate DSSI plugin shared object files by * searching the paths contained in the DSSI_PATH and LADSPA_PATH * environment variables, if they are present. Both are expected * to be colon-separated lists of directories to be searched (in * order), and DSSI_PATH should be searched first if both variables * are set. * * - Each shared object file containing DSSI plugins must include a * function dssi_descriptor(), with the following function prototype * and C-style linkage. Hosts may enumerate the plugin types * available in the shared object file by repeatedly calling * this function with successive Index values (beginning from 0), * until a return value of NULL indicates no more plugin types are * available. Each non-NULL return is the DSSI_Descriptor * of a distinct plugin type. */ const DSSI_Descriptor *dssi_descriptor(unsigned long Index); typedef const DSSI_Descriptor *(*DSSI_Descriptor_Function)(unsigned long Index); /* * Macros to specify particular MIDI controllers in return values from * get_midi_controller_for_port() */ #define DSSI_CC_BITS 0x20000000 #define DSSI_NRPN_BITS 0x40000000 #define DSSI_NONE -1 #define DSSI_CONTROLLER_IS_SET(n) (DSSI_NONE != (n)) #define DSSI_CC(n) (DSSI_CC_BITS | (n)) #define DSSI_IS_CC(n) (DSSI_CC_BITS & (n)) #define DSSI_CC_NUMBER(n) ((n) & 0x7f) #define DSSI_NRPN(n) (DSSI_NRPN_BITS | ((n) << 7)) #define DSSI_IS_NRPN(n) (DSSI_NRPN_BITS & (n)) #define DSSI_NRPN_NUMBER(n) (((n) >> 7) & 0x3fff) #ifdef __cplusplus } #endif #endif /* DSSI_INCLUDED */ sonic-visualiser-3.0.3/svcore/plugin/api/dssi_alsa_compat.c0000644000000000000000000004550513111512442022166 0ustar 00000000000000/* DSSI ALSA compatibility library * * This library provides for non-ALSA systems the ALSA snd_seq_event_t handling * necessary to compile and run DSSI. It was extracted from alsa-lib 1.0.8. * * See ./alsa/README for more information. */ #include #include #include "alsa/asoundef.h" #include "alsa/sound/asequencer.h" #include "alsa/seq.h" #include "alsa/seq_event.h" #include "alsa/seq_midi_event.h" /** * \file seq/seq_event.c * \brief Sequencer Event Types * \author Takashi Iwai * \date 2001 */ #define FIXED_EV(x) (_SND_SEQ_TYPE(SND_SEQ_EVFLG_FIXED) | _SND_SEQ_TYPE(x)) /** Event types conversion array */ /* const unsigned int snd_seq_event_types[256] = { [SND_SEQ_EVENT_SYSTEM ... SND_SEQ_EVENT_RESULT] = FIXED_EV(SND_SEQ_EVFLG_RESULT), [SND_SEQ_EVENT_NOTE] = FIXED_EV(SND_SEQ_EVFLG_NOTE) | _SND_SEQ_TYPE_OPT(SND_SEQ_EVFLG_NOTE_TWOARG), [SND_SEQ_EVENT_NOTEON ... SND_SEQ_EVENT_KEYPRESS] = FIXED_EV(SND_SEQ_EVFLG_NOTE), [SND_SEQ_EVENT_CONTROLLER ... SND_SEQ_EVENT_REGPARAM] = FIXED_EV(SND_SEQ_EVFLG_CONTROL), [SND_SEQ_EVENT_START ... SND_SEQ_EVENT_STOP] = FIXED_EV(SND_SEQ_EVFLG_QUEUE), [SND_SEQ_EVENT_SETPOS_TICK] = FIXED_EV(SND_SEQ_EVFLG_QUEUE) | _SND_SEQ_TYPE_OPT(SND_SEQ_EVFLG_QUEUE_TICK), [SND_SEQ_EVENT_SETPOS_TIME] = FIXED_EV(SND_SEQ_EVFLG_QUEUE) | _SND_SEQ_TYPE_OPT(SND_SEQ_EVFLG_QUEUE_TIME), [SND_SEQ_EVENT_TEMPO ... SND_SEQ_EVENT_SYNC_POS] = FIXED_EV(SND_SEQ_EVFLG_QUEUE) | _SND_SEQ_TYPE_OPT(SND_SEQ_EVFLG_QUEUE_VALUE), [SND_SEQ_EVENT_TUNE_REQUEST ... SND_SEQ_EVENT_SENSING] = FIXED_EV(SND_SEQ_EVFLG_NONE), [SND_SEQ_EVENT_ECHO ... SND_SEQ_EVENT_OSS] = FIXED_EV(SND_SEQ_EVFLG_RAW) | FIXED_EV(SND_SEQ_EVFLG_SYSTEM), [SND_SEQ_EVENT_CLIENT_START ... SND_SEQ_EVENT_PORT_CHANGE] = FIXED_EV(SND_SEQ_EVFLG_MESSAGE), [SND_SEQ_EVENT_PORT_SUBSCRIBED ... SND_SEQ_EVENT_PORT_UNSUBSCRIBED] = FIXED_EV(SND_SEQ_EVFLG_CONNECTION), [SND_SEQ_EVENT_SAMPLE ... SND_SEQ_EVENT_SAMPLE_PRIVATE1] = FIXED_EV(SND_SEQ_EVFLG_SAMPLE), [SND_SEQ_EVENT_USR0 ... SND_SEQ_EVENT_USR9] = FIXED_EV(SND_SEQ_EVFLG_RAW) | FIXED_EV(SND_SEQ_EVFLG_USERS), [SND_SEQ_EVENT_INSTR_BEGIN ... SND_SEQ_EVENT_INSTR_CHANGE] = _SND_SEQ_TYPE(SND_SEQ_EVFLG_INSTR) | _SND_SEQ_TYPE(SND_SEQ_EVFLG_VARUSR), [SND_SEQ_EVENT_SYSEX ... SND_SEQ_EVENT_BOUNCE] = _SND_SEQ_TYPE(SND_SEQ_EVFLG_VARIABLE), [SND_SEQ_EVENT_USR_VAR0 ... SND_SEQ_EVENT_USR_VAR4] = _SND_SEQ_TYPE(SND_SEQ_EVFLG_VARIABLE) | _SND_SEQ_TYPE(SND_SEQ_EVFLG_USERS), [SND_SEQ_EVENT_NONE] = FIXED_EV(SND_SEQ_EVFLG_NONE), }; */ /** * \file seq/seq_midi_event.c * \brief MIDI byte <-> sequencer event coder * \author Takashi Iwai * \author Jaroslav Kysela * \date 2000-2001 */ /* * MIDI byte <-> sequencer event coder * * Copyright (C) 1998,99,2000 Takashi Iwai , * Jaroslav Kysela * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* midi status */ struct snd_midi_event { size_t qlen; /* queue length */ size_t read; /* chars read */ int type; /* current event type */ unsigned char lastcmd; unsigned char nostat; size_t bufsize; unsigned char *buf; /* input buffer */ }; /* queue type */ /* from 0 to 7 are normal commands (note off, on, etc.) */ #define ST_NOTEOFF 0 #define ST_NOTEON 1 #define ST_SPECIAL 8 #define ST_SYSEX ST_SPECIAL /* from 8 to 15 are events for 0xf0-0xf7 */ /* status event types */ typedef void (*event_encode_t)(snd_midi_event_t *dev, snd_seq_event_t *ev); typedef void (*event_decode_t)(const snd_seq_event_t *ev, unsigned char *buf); /* * prototypes */ static void note_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void one_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void pitchbend_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void two_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void one_param_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void note_decode(const snd_seq_event_t *ev, unsigned char *buf); static void one_param_decode(const snd_seq_event_t *ev, unsigned char *buf); static void pitchbend_decode(const snd_seq_event_t *ev, unsigned char *buf); static void two_param_decode(const snd_seq_event_t *ev, unsigned char *buf); static void songpos_decode(const snd_seq_event_t *ev, unsigned char *buf); /* * event list */ static struct status_event_list_t { int event; int qlen; event_encode_t encode; event_decode_t decode; } status_event[] = { /* 0x80 - 0xf0 */ {SND_SEQ_EVENT_NOTEOFF, 2, note_event, note_decode}, {SND_SEQ_EVENT_NOTEON, 2, note_event, note_decode}, {SND_SEQ_EVENT_KEYPRESS, 2, note_event, note_decode}, {SND_SEQ_EVENT_CONTROLLER, 2, two_param_ctrl_event, two_param_decode}, {SND_SEQ_EVENT_PGMCHANGE, 1, one_param_ctrl_event, one_param_decode}, {SND_SEQ_EVENT_CHANPRESS, 1, one_param_ctrl_event, one_param_decode}, {SND_SEQ_EVENT_PITCHBEND, 2, pitchbend_ctrl_event, pitchbend_decode}, {SND_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf0 */ /* 0xf0 - 0xff */ {SND_SEQ_EVENT_SYSEX, 1, NULL, NULL}, /* sysex: 0xf0 */ {SND_SEQ_EVENT_QFRAME, 1, one_param_event, one_param_decode}, /* 0xf1 */ {SND_SEQ_EVENT_SONGPOS, 2, songpos_event, songpos_decode}, /* 0xf2 */ {SND_SEQ_EVENT_SONGSEL, 1, one_param_event, one_param_decode}, /* 0xf3 */ {SND_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf4 */ {SND_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf5 */ {SND_SEQ_EVENT_TUNE_REQUEST, 0, NULL, NULL}, /* 0xf6 */ {SND_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf7 */ {SND_SEQ_EVENT_CLOCK, 0, NULL, NULL}, /* 0xf8 */ {SND_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf9 */ {SND_SEQ_EVENT_START, 0, NULL, NULL}, /* 0xfa */ {SND_SEQ_EVENT_CONTINUE, 0, NULL, NULL}, /* 0xfb */ {SND_SEQ_EVENT_STOP, 0, NULL, NULL}, /* 0xfc */ {SND_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xfd */ {SND_SEQ_EVENT_SENSING, 0, NULL, NULL}, /* 0xfe */ {SND_SEQ_EVENT_RESET, 0, NULL, NULL}, /* 0xff */ }; #ifdef UNNEEDED_BY_DSSI static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int len, const snd_seq_event_t *ev); static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int count, const snd_seq_event_t *ev); static struct extra_event_list_t { int event; int (*decode)(snd_midi_event_t *dev, unsigned char *buf, int len, const snd_seq_event_t *ev); } extra_event[] = { {SND_SEQ_EVENT_CONTROL14, extra_decode_ctrl14}, {SND_SEQ_EVENT_NONREGPARAM, extra_decode_xrpn}, {SND_SEQ_EVENT_REGPARAM, extra_decode_xrpn}, }; #define numberof(ary) (sizeof(ary)/sizeof(ary[0])) #endif /* UNNEEDED_BY_DSSI */ /** * \brief Initialize MIDI event parser * \param bufsize buffer size for MIDI message * \param rdev allocated MIDI event parser * \return 0 on success otherwise a negative error code * * Allocates and initializes MIDI event parser. */ int snd_midi_event_new(size_t bufsize, snd_midi_event_t **rdev) { snd_midi_event_t *dev; *rdev = NULL; dev = (snd_midi_event_t *)calloc(1, sizeof(snd_midi_event_t)); if (dev == NULL) return -ENOMEM; if (bufsize > 0) { dev->buf = malloc(bufsize); if (dev->buf == NULL) { free(dev); return -ENOMEM; } } dev->bufsize = bufsize; dev->lastcmd = 0xff; *rdev = dev; return 0; } /** * \brief Free MIDI event parser * \param rdev MIDI event parser * \return 0 on success otherwise a negative error code * * Frees MIDI event parser. */ void snd_midi_event_free(snd_midi_event_t *dev) { if (dev != NULL) { if (dev->buf) free(dev->buf); free(dev); } } #ifdef UNNEEDED_BY_DSSI /** * \brief Enable/disable MIDI command merging * \param dev MIDI event parser * \param on 0 - enable MIDI command merging, 1 - always pass the command * * Enable/disable MIDI command merging */ void snd_midi_event_no_status(snd_midi_event_t *dev, int on) { dev->nostat = on ? 1 : 0; } #endif /* UNNEEDED_BY_DSSI */ /* * initialize record */ inline static void reset_encode(snd_midi_event_t *dev) { dev->read = 0; dev->qlen = 0; dev->type = 0; } /** * \brief Reset MIDI encode parser * \param dev MIDI event parser * \return 0 on success otherwise a negative error code * * Resets MIDI encode parser */ void snd_midi_event_reset_encode(snd_midi_event_t *dev) { reset_encode(dev); } #ifdef UNNEEDED_BY_DSSI /** * \brief Reset MIDI decode parser * \param dev MIDI event parser * \return 0 on success otherwise a negative error code * * Resets MIDI decode parser */ void snd_midi_event_reset_decode(snd_midi_event_t *dev) { dev->lastcmd = 0xff; } /** * \brief Initializes MIDI parsers * \param dev MIDI event parser * \return 0 on success otherwise a negative error code * * Initializes MIDI parsers (both encode and decode) */ void snd_midi_event_init(snd_midi_event_t *dev) { snd_midi_event_reset_encode(dev); snd_midi_event_reset_decode(dev); } /** * \brief Resize MIDI message (event) buffer * \param dev MIDI event parser * \param bufsize new requested buffer size * \return 0 on success otherwise a negative error code * * Resizes MIDI message (event) buffer. */ int snd_midi_event_resize_buffer(snd_midi_event_t *dev, size_t bufsize) { unsigned char *new_buf, *old_buf; if (bufsize == dev->bufsize) return 0; new_buf = malloc(bufsize); if (new_buf == NULL) return -ENOMEM; old_buf = dev->buf; dev->buf = new_buf; dev->bufsize = bufsize; reset_encode(dev); if (old_buf) free(old_buf); return 0; } #endif /* UNNEEDED_BY_DSSI */ /** * \brief Read bytes and encode to sequencer event if finished * \param dev MIDI event parser * \param buf MIDI byte stream * \param count count of bytes of MIDI byte stream to encode * \param ev Result - sequencer event * \return count of encoded bytes otherwise a negative error code * * Read bytes and encode to sequencer event if finished. * If complete sequencer event is available, ev->type is not * equal to #SND_SEQ_EVENT_NONE. */ long snd_midi_event_encode(snd_midi_event_t *dev, const unsigned char *buf, long count, snd_seq_event_t *ev) { long result = 0; int rc; ev->type = SND_SEQ_EVENT_NONE; while (count-- > 0) { rc = snd_midi_event_encode_byte(dev, *buf++, ev); result++; if (rc < 0) return rc; else if (rc > 0) return result; } return result; } /** * \brief Read one byte and encode to sequencer event if finished * \param dev MIDI event parser * \param c a byte of MIDI stream * \param ev Result - sequencer event * \return 1 - sequencer event is completed, 0 - next byte is required for completion, otherwise a negative error code * * Read byte and encode to sequencer event if finished. */ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev) { int rc = 0; c &= 0xff; if (c >= MIDI_CMD_COMMON_CLOCK) { /* real-time event */ ev->type = status_event[ST_SPECIAL + c - 0xf0].event; ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED; return 1; } if (dev->qlen > 0) { /* rest of command */ dev->buf[dev->read++] = c; if (dev->type != ST_SYSEX) dev->qlen--; } else { /* new command */ dev->read = 1; if (c & 0x80) { dev->buf[0] = c; if ((c & 0xf0) == 0xf0) /* special events */ dev->type = (c & 0x0f) + ST_SPECIAL; else dev->type = (c >> 4) & 0x07; dev->qlen = status_event[dev->type].qlen; } else { /* process this byte as argument */ dev->buf[dev->read++] = c; dev->qlen = status_event[dev->type].qlen - 1; } } if (dev->qlen == 0) { ev->type = status_event[dev->type].event; ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED; if (status_event[dev->type].encode) /* set data values */ status_event[dev->type].encode(dev, ev); rc = 1; } else if (dev->type == ST_SYSEX) { if (c == MIDI_CMD_COMMON_SYSEX_END || dev->read >= dev->bufsize) { ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; ev->flags |= SNDRV_SEQ_EVENT_LENGTH_VARIABLE; ev->type = SNDRV_SEQ_EVENT_SYSEX; ev->data.ext.len = dev->read; ev->data.ext.ptr = dev->buf; if (c != MIDI_CMD_COMMON_SYSEX_END) dev->read = 0; /* continue to parse */ else reset_encode(dev); /* all parsed */ rc = 1; } } return rc; } /* encode note event */ static void note_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.note.channel = dev->buf[0] & 0x0f; ev->data.note.note = dev->buf[1]; ev->data.note.velocity = dev->buf[2]; } /* encode one parameter controls */ static void one_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.control.channel = dev->buf[0] & 0x0f; ev->data.control.value = dev->buf[1]; } /* encode pitch wheel change */ static void pitchbend_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.control.channel = dev->buf[0] & 0x0f; ev->data.control.value = (int)dev->buf[2] * 128 + (int)dev->buf[1] - 8192; } /* encode midi control change */ static void two_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.control.channel = dev->buf[0] & 0x0f; ev->data.control.param = dev->buf[1]; ev->data.control.value = dev->buf[2]; } /* encode one parameter value*/ static void one_param_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.control.value = dev->buf[1]; } /* encode song position */ static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.control.value = (int)dev->buf[2] * 128 + (int)dev->buf[1]; } #ifdef UNNEEDED_BY_DSSI /** * \brief Decode sequencer event to MIDI byte stream * \param dev MIDI event parser * \param buf Result - MIDI byte stream * \param count Available bytes in MIDI byte stream * \param ev Event to decode * \return count of decoded bytes otherwise a negative error code * * Decode sequencer event to MIDI byte stream. */ long snd_midi_event_decode(snd_midi_event_t *dev, unsigned char *buf, long count, const snd_seq_event_t *ev) { int cmd; long qlen; unsigned int type; if (ev->type == SNDRV_SEQ_EVENT_NONE) return -ENOENT; for (type = 0; type < numberof(status_event); type++) { if (ev->type == status_event[type].event) goto __found; } for (type = 0; type < numberof(extra_event); type++) { if (ev->type == extra_event[type].event) return extra_event[type].decode(dev, buf, count, ev); } return -ENOENT; __found: if (type >= ST_SPECIAL) cmd = 0xf0 + (type - ST_SPECIAL); else /* data.note.channel and data.control.channel is identical */ cmd = 0x80 | (type << 4) | (ev->data.note.channel & 0x0f); if (cmd == MIDI_CMD_COMMON_SYSEX) { qlen = ev->data.ext.len; if (count < qlen) return -ENOMEM; switch (ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) { case SNDRV_SEQ_EVENT_LENGTH_FIXED: return -EINVAL; /* invalid event */ } memcpy(buf, ev->data.ext.ptr, qlen); return qlen; } else { unsigned char xbuf[4]; if ((cmd & 0xf0) == 0xf0 || dev->lastcmd != cmd || dev->nostat) { dev->lastcmd = cmd; xbuf[0] = cmd; if (status_event[type].decode) status_event[type].decode(ev, xbuf + 1); qlen = status_event[type].qlen + 1; } else { if (status_event[type].decode) status_event[type].decode(ev, xbuf + 0); qlen = status_event[type].qlen; } if (count < qlen) return -ENOMEM; memcpy(buf, xbuf, qlen); return qlen; } } #endif /* UNNEEDED_BY_DSSI */ /* decode note event */ static void note_decode(const snd_seq_event_t *ev, unsigned char *buf) { buf[0] = ev->data.note.note & 0x7f; buf[1] = ev->data.note.velocity & 0x7f; } /* decode one parameter controls */ static void one_param_decode(const snd_seq_event_t *ev, unsigned char *buf) { buf[0] = ev->data.control.value & 0x7f; } /* decode pitch wheel change */ static void pitchbend_decode(const snd_seq_event_t *ev, unsigned char *buf) { int value = ev->data.control.value + 8192; buf[0] = value & 0x7f; buf[1] = (value >> 7) & 0x7f; } /* decode midi control change */ static void two_param_decode(const snd_seq_event_t *ev, unsigned char *buf) { buf[0] = ev->data.control.param & 0x7f; buf[1] = ev->data.control.value & 0x7f; } /* decode song position */ static void songpos_decode(const snd_seq_event_t *ev, unsigned char *buf) { buf[0] = ev->data.control.value & 0x7f; buf[1] = (ev->data.control.value >> 7) & 0x7f; } #ifdef UNNEEDED_BY_DSSI /* decode 14bit control */ static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int count, const snd_seq_event_t *ev) { unsigned char cmd; int idx = 0; cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); if (ev->data.control.param < 32) { if (count < 4) return -ENOMEM; if (dev->nostat && count < 6) return -ENOMEM; if (cmd != dev->lastcmd || dev->nostat) { if (count < 5) return -ENOMEM; buf[idx++] = dev->lastcmd = cmd; } buf[idx++] = ev->data.control.param; buf[idx++] = (ev->data.control.value >> 7) & 0x7f; if (dev->nostat) buf[idx++] = cmd; buf[idx++] = ev->data.control.param + 32; buf[idx++] = ev->data.control.value & 0x7f; } else { if (count < 2) return -ENOMEM; if (cmd != dev->lastcmd || dev->nostat) { if (count < 3) return -ENOMEM; buf[idx++] = dev->lastcmd = cmd; } buf[idx++] = ev->data.control.param & 0x7f; buf[idx++] = ev->data.control.value & 0x7f; } return idx; } /* decode reg/nonreg param */ static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int count, const snd_seq_event_t *ev) { unsigned char cmd; char *cbytes; static char cbytes_nrpn[4] = { MIDI_CTL_NONREG_PARM_NUM_MSB, MIDI_CTL_NONREG_PARM_NUM_LSB, MIDI_CTL_MSB_DATA_ENTRY, MIDI_CTL_LSB_DATA_ENTRY }; static char cbytes_rpn[4] = { MIDI_CTL_REGIST_PARM_NUM_MSB, MIDI_CTL_REGIST_PARM_NUM_LSB, MIDI_CTL_MSB_DATA_ENTRY, MIDI_CTL_LSB_DATA_ENTRY }; unsigned char bytes[4]; int idx = 0, i; if (count < 8) return -ENOMEM; if (dev->nostat && count < 12) return -ENOMEM; cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); bytes[0] = ev->data.control.param & 0x007f; bytes[1] = (ev->data.control.param & 0x3f80) >> 7; bytes[2] = ev->data.control.value & 0x007f; bytes[3] = (ev->data.control.value & 0x3f80) >> 7; if (cmd != dev->lastcmd && !dev->nostat) { if (count < 9) return -ENOMEM; buf[idx++] = dev->lastcmd = cmd; } cbytes = ev->type == SND_SEQ_EVENT_NONREGPARAM ? cbytes_nrpn : cbytes_rpn; for (i = 0; i < 4; i++) { if (dev->nostat) buf[idx++] = dev->lastcmd = cmd; buf[idx++] = cbytes[i]; buf[idx++] = bytes[i]; } return idx; } #endif /* UNNEEDED_BY_DSSI */ sonic-visualiser-3.0.3/svcore/plugin/api/ladspa.h0000644000000000000000000006571113111512442020133 0ustar 00000000000000/* ladspa.h Linux Audio Developer's Simple Plugin API Version 1.1[LGPL]. Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan Westerfeld. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef LADSPA_INCLUDED #define LADSPA_INCLUDED #define LADSPA_VERSION "1.1" #define LADSPA_VERSION_MAJOR 1 #define LADSPA_VERSION_MINOR 1 #ifdef __cplusplus extern "C" { #endif /*****************************************************************************/ /* Overview: There is a large number of synthesis packages in use or development on the Linux platform at this time. This API (`The Linux Audio Developer's Simple Plugin API') attempts to give programmers the ability to write simple `plugin' audio processors in C/C++ and link them dynamically (`plug') into a range of these packages (`hosts'). It should be possible for any host and any plugin to communicate completely through this interface. This API is deliberately short and simple. To achieve compatibility with a range of promising Linux sound synthesis packages it attempts to find the `greatest common divisor' in their logical behaviour. Having said this, certain limiting decisions are implicit, notably the use of a fixed type (LADSPA_Data) for all data transfer and absence of a parameterised `initialisation' phase. See below for the LADSPA_Data typedef. Plugins are expected to distinguish between control and audio data. Plugins have `ports' that are inputs or outputs for audio or control data and each plugin is `run' for a `block' corresponding to a short time interval measured in samples. Audio data is communicated using arrays of LADSPA_Data, allowing a block of audio to be processed by the plugin in a single pass. Control data is communicated using single LADSPA_Data values. Control data has a single value at the start of a call to the `run()' or `run_adding()' function, and may be considered to remain this value for its duration. The plugin may assume that all its input and output ports have been connected to the relevant data location (see the `connect_port()' function below) before it is asked to run. Plugins will reside in shared object files suitable for dynamic linking by dlopen() and family. The file will provide a number of `plugin types' that can be used to instantiate actual plugins (sometimes known as `plugin instances') that can be connected together to perform tasks. This API contains very limited error-handling. */ /*****************************************************************************/ /* Fundamental data type passed in and out of plugin. This data type is used to communicate audio samples and control values. It is assumed that the plugin will work sensibly given any numeric input value although it may have a preferred range (see hints below). For audio it is generally assumed that 1.0f is the `0dB' reference amplitude and is a `normal' signal level. */ typedef float LADSPA_Data; /*****************************************************************************/ /* Special Plugin Properties: Optional features of the plugin type are encapsulated in the LADSPA_Properties type. This is assembled by ORing individual properties together. */ typedef int LADSPA_Properties; /* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a real-time dependency (e.g. listens to a MIDI device) and so its output must not be cached or subject to significant latency. */ #define LADSPA_PROPERTY_REALTIME 0x1 /* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin may cease to work correctly if the host elects to use the same data location for both input and output (see connect_port()). This should be avoided as enabling this flag makes it impossible for hosts to use the plugin to process audio `in-place.' */ #define LADSPA_PROPERTY_INPLACE_BROKEN 0x2 /* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin is capable of running not only in a conventional host but also in a `hard real-time' environment. To qualify for this the plugin must satisfy all of the following: (1) The plugin must not use malloc(), free() or other heap memory management within its run() or run_adding() functions. All new memory used in run() must be managed via the stack. These restrictions only apply to the run() function. (2) The plugin will not attempt to make use of any library functions with the exceptions of functions in the ANSI standard C and C maths libraries, which the host is expected to provide. (3) The plugin will not access files, devices, pipes, sockets, IPC or any other mechanism that might result in process or thread blocking. (4) The plugin will take an amount of time to execute a run() or run_adding() call approximately of form (A+B*SampleCount) where A and B depend on the machine and host in use. This amount of time may not depend on input signals or plugin state. The host is left the responsibility to perform timings to estimate upper bounds for A and B. */ #define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4 #define LADSPA_IS_REALTIME(x) ((x) & LADSPA_PROPERTY_REALTIME) #define LADSPA_IS_INPLACE_BROKEN(x) ((x) & LADSPA_PROPERTY_INPLACE_BROKEN) #define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE) /*****************************************************************************/ /* Plugin Ports: Plugins have `ports' that are inputs or outputs for audio or data. Ports can communicate arrays of LADSPA_Data (for audio inputs/outputs) or single LADSPA_Data values (for control input/outputs). This information is encapsulated in the LADSPA_PortDescriptor type which is assembled by ORing individual properties together. Note that a port must be an input or an output port but not both and that a port must be a control or audio port but not both. */ typedef int LADSPA_PortDescriptor; /* Property LADSPA_PORT_INPUT indicates that the port is an input. */ #define LADSPA_PORT_INPUT 0x1 /* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */ #define LADSPA_PORT_OUTPUT 0x2 /* Property LADSPA_PORT_CONTROL indicates that the port is a control port. */ #define LADSPA_PORT_CONTROL 0x4 /* Property LADSPA_PORT_AUDIO indicates that the port is a audio port. */ #define LADSPA_PORT_AUDIO 0x8 #define LADSPA_IS_PORT_INPUT(x) ((x) & LADSPA_PORT_INPUT) #define LADSPA_IS_PORT_OUTPUT(x) ((x) & LADSPA_PORT_OUTPUT) #define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL) #define LADSPA_IS_PORT_AUDIO(x) ((x) & LADSPA_PORT_AUDIO) /*****************************************************************************/ /* Plugin Port Range Hints: The host may wish to provide a representation of data entering or leaving a plugin (e.g. to generate a GUI automatically). To make this more meaningful, the plugin should provide `hints' to the host describing the usual values taken by the data. Note that these are only hints. The host may ignore them and the plugin must not assume that data supplied to it is meaningful. If the plugin receives invalid input data it is expected to continue to run without failure and, where possible, produce a sensible output (e.g. a high-pass filter given a negative cutoff frequency might switch to an all-pass mode). Hints are meaningful for all input and output ports but hints for input control ports are expected to be particularly useful. More hint information is encapsulated in the LADSPA_PortRangeHintDescriptor type which is assembled by ORing individual hint types together. Hints may require further LowerBound and UpperBound information. All the hint information for a particular port is aggregated in the LADSPA_PortRangeHint structure. */ typedef int LADSPA_PortRangeHintDescriptor; /* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field of the LADSPA_PortRangeHint should be considered meaningful. The value in this field should be considered the (inclusive) lower bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also specified then the value of LowerBound should be multiplied by the sample rate. */ #define LADSPA_HINT_BOUNDED_BELOW 0x1 /* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field of the LADSPA_PortRangeHint should be considered meaningful. The value in this field should be considered the (inclusive) upper bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also specified then the value of UpperBound should be multiplied by the sample rate. */ #define LADSPA_HINT_BOUNDED_ABOVE 0x2 /* Hint LADSPA_HINT_TOGGLED indicates that the data item should be considered a Boolean toggle. Data less than or equal to zero should be considered `off' or `false,' and data above zero should be considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or LADSPA_HINT_DEFAULT_1. */ #define LADSPA_HINT_TOGGLED 0x4 /* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified should be interpreted as multiples of the sample rate. For instance, a frequency range from 0Hz to the Nyquist frequency (half the sample rate) could be requested by this hint in conjunction with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds at all must support this hint to retain meaning. */ #define LADSPA_HINT_SAMPLE_RATE 0x8 /* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the user will find it more intuitive to view values using a logarithmic scale. This is particularly useful for frequencies and gains. */ #define LADSPA_HINT_LOGARITHMIC 0x10 /* Hint LADSPA_HINT_INTEGER indicates that a user interface would probably wish to provide a stepped control taking only integer values. Any bounds set should be slightly wider than the actual integer range required to avoid floating point rounding errors. For instance, the integer set {0,1,2,3} might be described as [-0.1, 3.1]. */ #define LADSPA_HINT_INTEGER 0x20 /* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal' value for the port that is sensible as a default. For instance, this value is suitable for use as an initial value in a user interface or as a value the host might assign to a control port when the user has not provided one. Defaults are encoded using a mask so only one default may be specified for a port. Some of the hints make use of lower and upper bounds, in which case the relevant bound or bounds must be available and LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting default must be rounded if LADSPA_HINT_INTEGER is present. Default values were introduced in LADSPA v1.1. */ #define LADSPA_HINT_DEFAULT_MASK 0x3C0 /* This default values indicates that no default is provided. */ #define LADSPA_HINT_DEFAULT_NONE 0x0 /* This default hint indicates that the suggested lower bound for the port should be used. */ #define LADSPA_HINT_DEFAULT_MINIMUM 0x40 /* This default hint indicates that a low value between the suggested lower and upper bounds should be chosen. For ports with LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 + log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper * 0.25). */ #define LADSPA_HINT_DEFAULT_LOW 0x80 /* This default hint indicates that a middle value between the suggested lower and upper bounds should be chosen. For ports with LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 + log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper * 0.5). */ #define LADSPA_HINT_DEFAULT_MIDDLE 0xC0 /* This default hint indicates that a high value between the suggested lower and upper bounds should be chosen. For ports with LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 + log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper * 0.75). */ #define LADSPA_HINT_DEFAULT_HIGH 0x100 /* This default hint indicates that the suggested upper bound for the port should be used. */ #define LADSPA_HINT_DEFAULT_MAXIMUM 0x140 /* This default hint indicates that the number 0 should be used. Note that this default may be used in conjunction with LADSPA_HINT_TOGGLED. */ #define LADSPA_HINT_DEFAULT_0 0x200 /* This default hint indicates that the number 1 should be used. Note that this default may be used in conjunction with LADSPA_HINT_TOGGLED. */ #define LADSPA_HINT_DEFAULT_1 0x240 /* This default hint indicates that the number 100 should be used. */ #define LADSPA_HINT_DEFAULT_100 0x280 /* This default hint indicates that the Hz frequency of `concert A' should be used. This will be 440 unless the host uses an unusual tuning convention, in which case it may be within a few Hz. */ #define LADSPA_HINT_DEFAULT_440 0x2C0 #define LADSPA_IS_HINT_BOUNDED_BELOW(x) ((x) & LADSPA_HINT_BOUNDED_BELOW) #define LADSPA_IS_HINT_BOUNDED_ABOVE(x) ((x) & LADSPA_HINT_BOUNDED_ABOVE) #define LADSPA_IS_HINT_TOGGLED(x) ((x) & LADSPA_HINT_TOGGLED) #define LADSPA_IS_HINT_SAMPLE_RATE(x) ((x) & LADSPA_HINT_SAMPLE_RATE) #define LADSPA_IS_HINT_LOGARITHMIC(x) ((x) & LADSPA_HINT_LOGARITHMIC) #define LADSPA_IS_HINT_INTEGER(x) ((x) & LADSPA_HINT_INTEGER) #define LADSPA_IS_HINT_HAS_DEFAULT(x) ((x) & LADSPA_HINT_DEFAULT_MASK) #define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_MINIMUM) #define LADSPA_IS_HINT_DEFAULT_LOW(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_LOW) #define LADSPA_IS_HINT_DEFAULT_MIDDLE(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_MIDDLE) #define LADSPA_IS_HINT_DEFAULT_HIGH(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_HIGH) #define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_MAXIMUM) #define LADSPA_IS_HINT_DEFAULT_0(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_0) #define LADSPA_IS_HINT_DEFAULT_1(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_1) #define LADSPA_IS_HINT_DEFAULT_100(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_100) #define LADSPA_IS_HINT_DEFAULT_440(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ == LADSPA_HINT_DEFAULT_440) typedef struct _LADSPA_PortRangeHint { /* Hints about the port. */ LADSPA_PortRangeHintDescriptor HintDescriptor; /* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When LADSPA_HINT_SAMPLE_RATE is also active then this value should be multiplied by the relevant sample rate. */ LADSPA_Data LowerBound; /* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When LADSPA_HINT_SAMPLE_RATE is also active then this value should be multiplied by the relevant sample rate. */ LADSPA_Data UpperBound; } LADSPA_PortRangeHint; /*****************************************************************************/ /* Plugin Handles: This plugin handle indicates a particular instance of the plugin concerned. It is valid to compare this to NULL (0 for C++) but otherwise the host should not attempt to interpret it. The plugin may use it to reference internal instance data. */ typedef void * LADSPA_Handle; /*****************************************************************************/ /* Descriptor for a Type of Plugin: This structure is used to describe a plugin type. It provides a number of functions to examine the type, instantiate it, link it to buffers and workspaces and to run it. */ typedef struct _LADSPA_Descriptor { /* This numeric identifier indicates the plugin type uniquely. Plugin programmers may reserve ranges of IDs from a central body to avoid clashes. Hosts may assume that IDs are below 0x1000000. */ unsigned long UniqueID; /* This identifier can be used as a unique, case-sensitive identifier for the plugin type within the plugin file. Plugin types should be identified by file and label rather than by index or plugin name, which may be changed in new plugin versions. Labels must not contain white-space characters. */ const char * Label; /* This indicates a number of properties of the plugin. */ LADSPA_Properties Properties; /* This member points to the null-terminated name of the plugin (e.g. "Sine Oscillator"). */ const char * Name; /* This member points to the null-terminated string indicating the maker of the plugin. This can be an empty string but not NULL. */ const char * Maker; /* This member points to the null-terminated string indicating any copyright applying to the plugin. If no Copyright applies the string "None" should be used. */ const char * Copyright; /* This indicates the number of ports (input AND output) present on the plugin. */ unsigned long PortCount; /* This member indicates an array of port descriptors. Valid indices vary from 0 to PortCount-1. */ const LADSPA_PortDescriptor * PortDescriptors; /* This member indicates an array of null-terminated strings describing ports (e.g. "Frequency (Hz)"). Valid indices vary from 0 to PortCount-1. */ const char * const * PortNames; /* This member indicates an array of range hints for each port (see above). Valid indices vary from 0 to PortCount-1. */ const LADSPA_PortRangeHint * PortRangeHints; /* This may be used by the plugin developer to pass any custom implementation data into an instantiate call. It must not be used or interpreted by the host. It is expected that most plugin writers will not use this facility as LADSPA_Handle should be used to hold instance data. */ void * ImplementationData; /* This member is a function pointer that instantiates a plugin. A handle is returned indicating the new plugin instance. The instantiation function accepts a sample rate as a parameter. The plugin descriptor from which this instantiate function was found must also be passed. This function must return NULL if instantiation fails. Note that instance initialisation should generally occur in activate() rather than here. */ LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, unsigned long SampleRate); /* This member is a function pointer that connects a port on an instantiated plugin to a memory location at which a block of data for the port will be read/written. The data location is expected to be an array of LADSPA_Data for audio ports or a single LADSPA_Data value for control ports. Memory issues will be managed by the host. The plugin must read/write the data at these locations every time run() or run_adding() is called and the data present at the time of this connection call should not be considered meaningful. connect_port() may be called more than once for a plugin instance to allow the host to change the buffers that the plugin is reading or writing. These calls may be made before or after activate() or deactivate() calls. connect_port() must be called at least once for each port before run() or run_adding() is called. When working with blocks of LADSPA_Data the plugin should pay careful attention to the block size passed to the run function as the block allocated may only just be large enough to contain the block of samples. Plugin writers should be aware that the host may elect to use the same buffer for more than one port and even use the same buffer for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN). However, overlapped buffers or use of a single buffer for both audio and control data may result in unexpected behaviour. */ void (*connect_port)(LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation); /* This member is a function pointer that initialises a plugin instance and activates it for use. This is separated from instantiate() to aid real-time support and so that hosts can reinitialise a plugin instance by calling deactivate() and then activate(). In this case the plugin instance must reset all state information dependent on the history of the plugin instance except for any data locations provided by connect_port() and any gain set by set_run_adding_gain(). If there is nothing for activate() to do then the plugin writer may provide a NULL rather than an empty function. When present, hosts must call this function once before run() (or run_adding()) is called for the first time. This call should be made as close to the run() call as possible and indicates to real-time plugins that they are now live. Plugins should not rely on a prompt call to run() after activate(). activate() may not be called again unless deactivate() is called first. Note that connect_port() may be called before or after a call to activate(). */ void (*activate)(LADSPA_Handle Instance); /* This method is a function pointer that runs an instance of a plugin for a block. Two parameters are required: the first is a handle to the particular instance to be run and the second indicates the block size (in samples) for which the plugin instance may run. Note that if an activate() function exists then it must be called before run() or run_adding(). If deactivate() is called for a plugin instance then the plugin instance may not be reused until activate() has been called again. If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE then there are various things that the plugin should not do within the run() or run_adding() functions (see above). */ void (*run)(LADSPA_Handle Instance, unsigned long SampleCount); /* This method is a function pointer that runs an instance of a plugin for a block. This has identical behaviour to run() except in the way data is output from the plugin. When run() is used, values are written directly to the memory areas associated with the output ports. However when run_adding() is called, values must be added to the values already present in the memory areas. Furthermore, output values written must be scaled by the current gain set by set_run_adding_gain() (see below) before addition. run_adding() is optional. When it is not provided by a plugin, this function pointer must be set to NULL. When it is provided, the function set_run_adding_gain() must be provided also. */ void (*run_adding)(LADSPA_Handle Instance, unsigned long SampleCount); /* This method is a function pointer that sets the output gain for use when run_adding() is called (see above). If this function is never called the gain is assumed to default to 1. Gain information should be retained when activate() or deactivate() are called. This function should be provided by the plugin if and only if the run_adding() function is provided. When it is absent this function pointer must be set to NULL. */ void (*set_run_adding_gain)(LADSPA_Handle Instance, LADSPA_Data Gain); /* This is the counterpart to activate() (see above). If there is nothing for deactivate() to do then the plugin writer may provide a NULL rather than an empty function. Hosts must deactivate all activated units after they have been run() (or run_adding()) for the last time. This call should be made as close to the last run() call as possible and indicates to real-time plugins that they are no longer live. Plugins should not rely on prompt deactivation. Note that connect_port() may be called before or after a call to deactivate(). Deactivation is not similar to pausing as the plugin instance will be reinitialised when activate() is called to reuse it. */ void (*deactivate)(LADSPA_Handle Instance); /* Once an instance of a plugin has been finished with it can be deleted using the following function. The instance handle passed ceases to be valid after this call. If activate() was called for a plugin instance then a corresponding call to deactivate() must be made before cleanup() is called. */ void (*cleanup)(LADSPA_Handle Instance); } LADSPA_Descriptor; /**********************************************************************/ /* Accessing a Plugin: */ /* The exact mechanism by which plugins are loaded is host-dependent, however all most hosts will need to know is the name of shared object file containing the plugin types. To allow multiple hosts to share plugin types, hosts may wish to check for environment variable LADSPA_PATH. If present, this should contain a colon-separated path indicating directories that should be searched (in order) when loading plugin types. A plugin programmer must include a function called "ladspa_descriptor" with the following function prototype within the shared object file. This function will have C-style linkage (if you are using C++ this is taken care of by the `extern "C"' clause at the top of the file). A host will find the plugin shared object file by one means or another, find the ladspa_descriptor() function, call it, and proceed from there. Plugin types are accessed by index (not ID) using values from 0 upwards. Out of range indexes must result in this function returning NULL, so the plugin count can be determined by checking for the least index that results in NULL being returned. */ const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index); /* Datatype corresponding to the ladspa_descriptor() function. */ typedef const LADSPA_Descriptor * (*LADSPA_Descriptor_Function)(unsigned long Index); /**********************************************************************/ #ifdef __cplusplus } #endif #endif /* LADSPA_INCLUDED */ /* EOF */ sonic-visualiser-3.0.3/svcore/plugin/api/new_dssi_transport_patch0000644000000000000000000002401313111512442023535 0ustar 00000000000000diff -r dssi-CVS-20051012=0.9.1/dssi/dssi.h _dssi-transport-mine-new/dssi/dssi.h 5,6c5,6 < DSSI version 0.9 < Copyright (c) 2004 Chris Cannam, Steve Harris and Sean Bolton --- > DSSI version 0.10 > Copyright (c) 2004,2005 Chris Cannam, Steve Harris and Sean Bolton 30c30 < #define DSSI_VERSION "0.9" --- > #define DSSI_VERSION "0.10" 32c32 < #define DSSI_VERSION_MINOR 9 --- > #define DSSI_VERSION_MINOR 10 76a77,152 > #define DSSI_TRANSPORT_VALID_STATE 0x01 > #define DSSI_TRANSPORT_VALID_BPM 0x02 > #define DSSI_TRANSPORT_VALID_BBT 0x10 > #define DSSI_TRANSPORT_VALID_TIME 0x20 > > #define DSSI_TRANSPORT_STATE_STOPPED 0 > #define DSSI_TRANSPORT_STATE_RUNNING 1 > #define DSSI_TRANSPORT_STATE_FREEWHEELING 2 > #define DSSI_TRANSPORT_STATE_OTHER 3 /* waiting for sync, ? */ > > typedef struct _DSSI_Transport_Info { > > /** The value of this field indicates which of the following > * transport information fields contain valid values. It is > * the logical OR of the DSSI_TRANSPORT_VALID_* bits defined > * above, and may be zero. */ > int Valid; > > > /** This field is valid when (Valid & DSSI_TRANSPORT_VALID_STATE) > * is true: > * > * ---- The current transport state, one of the DSSI_TRANSPORT_STATE_* > * values defined above. */ > int State; > > > /** This field is valid when (Valid & DSSI_TRANSPORT_VALID_BPM) > * is true: > * > * ---- The current tempo, in beats per minute. */ > double Beats_Per_Minute; > > > /** These six fields are valid when (Valid & DSSI_TRANSPORT_VALID_BBT) > * is true: > * > * ---- The bar number at the beginning of the current process cycle. */ > unsigned long Bar; > > * ---- The beat within that Bar. */ > unsigned long Beat; > > /** ---- The tick within that Beat. */ > unsigned long Tick; > > /** ---- The (possibly fractional) tick count since transport 'start' > * and the beginning of the current Bar. */ > double Bar_Start_Tick; > > /** ---- The number of beats per bar. */ > float Beats_Per_Bar; > > /** ---- The number of ticks for each beat. */ > double Ticks_Per_Beat; > > /* [Sean says: I left out the 'beat_type' (time signature "denominator") > * field of the jack_position_t structure, because I think it's useless > * except to a notation program. Does anybody else feel like we need it?] > > > /** These two fields are valid when (Valid & DSSI_TRANSPORT_VALID_TIME) > * is true: > * > * ---- The transport time at the beginning of the current process > * cycle, in seconds. */ > double Current_Time; > > /** ---- The transport time at the beginning of the next process > cycle, unless repositioning occurs. */ > double Next_Time; > > } DSSI_Transport_Info; > > typedef struct _DSSI_Host_Descriptor DSSI_Host_Descriptor; /* below */ > 83,84c159,161 < * If we're lucky, this will never be needed. For now all plugins < * must set it to 1. --- > * All plugins must set this to 1 or 2. The version 1 API contains > * all DSSI_Descriptor fields through run_multiple_synths_adding(), > * while the version 2 API adds the receive_host_descriptor(). 376a454,472 > > /** > * receive_host_descriptor() > * > * This member is a function pointer by which a host may provide > * a plugin with a pointer to its DSSI_Host_Descriptor. Hosts > * which provide host descriptor support must call this function > * once per plugin shared object file, before any calls to > * instantiate(). > * > * NOTE: This field was added in version 2 of the DSSI API. Hosts > * supporting version 2 must not access this field in a plugin > * whose DSSI_API_Version is 1, and plugins supporting version 2 > * should behave reasonably under hosts (of any version) which do > * not implement this function. A version 2 plugin that does not > * provide this function must set this member to NULL. > */ > void (*receive_host_descriptor)(DSSI_Host_Descriptor *Descriptor); > 377a474,598 > > struct _DSSI_Host_Descriptor { > > /** > * DSSI_API_Version > * > * This member indicates the DSSI API level used by this host. > * All hosts must set this to 2. Hopefully, we'll get this right > * the first time, and this will never be needed. > */ > int DSSI_API_Version; > > /** > * request_tranport_information() > * > * This member is a function pointer by which a plugin instance may > * request that a host begin providing transport information (if > * Request is non-zero), or notify the host that it no longer needs > * transport information (if Request is zero). Upon receiving a > * non-zero request, the host should return a pointer to a > * DSSI_Transport_Info structure if it is able to provide transport > * information, or NULL otherwise. > * > * Once a plugin instance has received a non-null transport > * information pointer, it may read from the structure at any time > * within the execution of an audio class function (see doc/RFC.txt). > * It should not consider the structure contents to be meaningful > * while within a instantiation or control class function. Also, > * since the validity of fields within the structure may change > * between each new invocation of an audio class function, a plugin > * instance must check the Valid field of the structure accordingly > * before using the structure's other contents. > * > * A host which does not support this function must set this member > * to NULL. > */ > DSSI_Transport_Info * > (*request_transport_information)(LADSPA_Handle Instance, > int Request); > > /** > * request_midi_send() > * > * This member is a function pointer that allows a plugin to > * request the ability to send MIDI events to the host. > * > * While the interpretation of plugin-generated MIDI events is > * host implementation specific, a mechanism exists by which a > * plugin may declare to the host the number of destination > * 'ports' and MIDI channels it can expect will be used in the > * plugin-generated events. Plugins which generate unchannelized > * MIDI should supply zero for both Ports and Channels, otherwise > * they should supply the maximum numbers for Ports and Channels > * they expect to use. > * > * A plugin instance must call this function during instantiate(). > * [Sean says: this restriction seems reasonable to me, since > * the host may need to create output ports, etc., and instantiate() > * seems like a good place to do such things. I'm sure I haven't > * fully thought through all the details, though....] > * > * The host should return a non-zero value if it is able to > * provide MIDI send for the plugin instance, otherwise it should > * return zero, and the plugin instance may not subsequently call > * midi_send(). > * > * A host which does not support the MIDI send function must set > * both this member and (*midi_send)() below to NULL. > */ > int (*request_midi_send)(LADSPA_Handle Instance, > unsigned char Ports, > unsigned char Channels); > > /** > * midi_send() > * > * This member is a function pointer by which a plugin actually > * sends MIDI events to the host (provided it has received a non- > * zero return from request_midi_send()). As in the run_synth() > * functions, the Event pointer points to a block of EventCount > * ALSA sequencer events. The dest.port and data.*.channel fields > * of each event are used to specify destination port and channel, > * respectively, when the plugin is supplying channelized events. > * > * A plugin may only call this function from within the execution > * of the audio class run_*() or select_program() functions. When > * called from a run_*() functions, the events are timestamped > * relative to the start of the block, (mis)using the ALSA "tick > * time" field as a frame count. The plugin is responsible for > * ensuring that events with differing timestamps are already > * ordered by time, and that timestamps across multiple calls to > * midi_send() from within the same run_*() invocation are > * monotonic. When midi_send() is called from within > * select_program(), the timestamps are ignored, and the events > * are considered to originate at the same frame time as the > * select_program() call, if such a timing can be considered > * meaningful. > * > * The memory pointed to by Event belongs to the plugin, and it is > * the host's responsibility to copy the events as needed before > * returning from the midi_send() call. > * > * A host which does not support the MIDI send function must set > * both this member and (*request_midi_send)() above to NULL. > */ > void (*midi_send)(LADSPA_Handle Instance, > snd_seq_event_t *Event, > unsigned long EventCount); > > /** > * . . . additional fields could follow here, possibly supporting: > * > * - a facility by which a plugin instance may request from a > * host a non-realtime thread in which to do off-line > * rendering, I/O, etc., thus (hopefully) avoiding the > * crashes that seem to occur when plugins create their own > * threads. I got this idea after noticing that ZynAddSubFX > * achieves its gorgeous textures while remaining very > * responsive by doing a lot of non-real-time rendering. > * Several other uses for it have been mentioned on the DSSI > * list; I forget what. > * > * - per-voice audio output > */ > }; sonic-visualiser-3.0.3/svcore/plugin/plugins/SamplePlayer.cpp0000644000000000000000000003620113111512442022520 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* Based on trivial_sampler from the DSSI distribution (by Chris Cannam, public domain). */ #include "SamplePlayer.h" #include "system/System.h" #include "../api/dssi.h" #include #include #include #include #include #ifdef Q_OS_WIN #include #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 #endif #include #include #include //#define DEBUG_SAMPLE_PLAYER 1 const char *const SamplePlayer::portNames[PortCount] = { "Output", "Tuned (on/off)", "Base Pitch (MIDI)", "Tuning of A (Hz)", "Sustain (on/off)", "Release time (s)" }; const LADSPA_PortDescriptor SamplePlayer::ports[PortCount] = { LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL }; const LADSPA_PortRangeHint SamplePlayer::hints[PortCount] = { { 0, 0, 0 }, { LADSPA_HINT_DEFAULT_MAXIMUM | LADSPA_HINT_INTEGER | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, 0, 1 }, { LADSPA_HINT_DEFAULT_MIDDLE | LADSPA_HINT_INTEGER | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, 0, 120 }, { LADSPA_HINT_DEFAULT_440 | LADSPA_HINT_LOGARITHMIC | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, 400, 499 }, { LADSPA_HINT_DEFAULT_MINIMUM | LADSPA_HINT_INTEGER | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, 0, 1 }, { LADSPA_HINT_DEFAULT_MINIMUM | LADSPA_HINT_LOGARITHMIC | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, 0.001f, 2.0f } }; const LADSPA_Properties SamplePlayer::properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; const LADSPA_Descriptor SamplePlayer::ladspaDescriptor = { 0, // "Unique" ID "sample_player", // Label properties, "Library Sample Player", // Name "Chris Cannam", // Maker "GPL", // Copyright PortCount, ports, portNames, hints, 0, // Implementation data instantiate, connectPort, activate, run, 0, // Run adding 0, // Set run adding gain deactivate, cleanup }; const DSSI_Descriptor SamplePlayer::dssiDescriptor = { 2, // DSSI API version &ladspaDescriptor, configure, getProgram, selectProgram, getMidiController, runSynth, 0, // Run synth adding 0, // Run multiple synths 0, // Run multiple synths adding receiveHostDescriptor }; const DSSI_Host_Descriptor * SamplePlayer::hostDescriptor = 0; const DSSI_Descriptor * SamplePlayer::getDescriptor(unsigned long index) { if (index == 0) return &dssiDescriptor; return 0; } SamplePlayer::SamplePlayer(int sampleRate) : m_output(0), m_retune(0), m_basePitch(0), m_concertA(0), m_sustain(0), m_release(0), m_sampleData(0), m_sampleCount(0), m_sampleRate(sampleRate), m_sampleNo(0), m_sampleDir("samples"), m_sampleSearchComplete(false), m_pendingProgramChange(-1) { } SamplePlayer::~SamplePlayer() { if (m_sampleData) free(m_sampleData); } LADSPA_Handle SamplePlayer::instantiate(const LADSPA_Descriptor *, unsigned long rate) { if (!hostDescriptor || !hostDescriptor->request_non_rt_thread) { SVDEBUG << "SamplePlayer::instantiate: Host does not provide request_non_rt_thread, not instantiating" << endl; return 0; } SamplePlayer *player = new SamplePlayer(int(rate)); // std::cerr << "Instantiated sample player " << std::endl; if (hostDescriptor->request_non_rt_thread(player, workThreadCallback)) { SVDEBUG << "SamplePlayer::instantiate: Host rejected request_non_rt_thread call, not instantiating" << endl; delete player; return 0; } return player; } void SamplePlayer::connectPort(LADSPA_Handle handle, unsigned long port, LADSPA_Data *location) { SamplePlayer *player = (SamplePlayer *)handle; float **ports[PortCount] = { &player->m_output, &player->m_retune, &player->m_basePitch, &player->m_concertA, &player->m_sustain, &player->m_release }; *ports[port] = (float *)location; } void SamplePlayer::activate(LADSPA_Handle handle) { SamplePlayer *player = (SamplePlayer *)handle; QMutexLocker locker(&player->m_mutex); player->m_sampleNo = 0; for (size_t i = 0; i < Polyphony; ++i) { player->m_ons[i] = -1; player->m_offs[i] = -1; player->m_velocities[i] = 0; } } void SamplePlayer::run(LADSPA_Handle handle, unsigned long samples) { runSynth(handle, samples, 0, 0); } void SamplePlayer::deactivate(LADSPA_Handle handle) { activate(handle); // both functions just reset the plugin } void SamplePlayer::cleanup(LADSPA_Handle handle) { delete (SamplePlayer *)handle; } char * SamplePlayer::configure(LADSPA_Handle handle, const char *key, const char *value) { if (key && !strcmp(key, "sampledir")) { SamplePlayer *player = (SamplePlayer *)handle; QMutexLocker locker(&player->m_mutex); if (QFileInfo(value).exists() && QFileInfo(value).isDir()) { player->m_sampleDir = value; if (player->m_sampleSearchComplete) { player->m_sampleSearchComplete = false; player->searchSamples(); } return 0; } else { char *buffer = (char *)malloc(strlen(value) + 80); sprintf(buffer, "Sample directory \"%s\" does not exist, leaving unchanged", value); return buffer; } } return strdup("Unknown configure key"); } const DSSI_Program_Descriptor * SamplePlayer::getProgram(LADSPA_Handle handle, unsigned long program) { SamplePlayer *player = (SamplePlayer *)handle; if (!player->m_sampleSearchComplete) { QMutexLocker locker(&player->m_mutex); if (!player->m_sampleSearchComplete) { player->searchSamples(); } } if (program >= player->m_samples.size()) return 0; static DSSI_Program_Descriptor descriptor; static char name[60]; strncpy(name, player->m_samples[program].first.toLocal8Bit().data(), 60); name[59] = '\0'; descriptor.Bank = 0; descriptor.Program = program; descriptor.Name = name; return &descriptor; } void SamplePlayer::selectProgram(LADSPA_Handle handle, unsigned long, unsigned long program) { SamplePlayer *player = (SamplePlayer *)handle; player->m_pendingProgramChange = (int)program; } int SamplePlayer::getMidiController(LADSPA_Handle, unsigned long port) { int controllers[PortCount] = { DSSI_NONE, DSSI_CC(12), DSSI_CC(13), DSSI_CC(64), DSSI_CC(72) }; return controllers[port]; } void SamplePlayer::runSynth(LADSPA_Handle handle, unsigned long samples, snd_seq_event_t *events, unsigned long eventCount) { SamplePlayer *player = (SamplePlayer *)handle; player->runImpl(samples, events, eventCount); } void SamplePlayer::receiveHostDescriptor(const DSSI_Host_Descriptor *descriptor) { hostDescriptor = descriptor; } void SamplePlayer::workThreadCallback(LADSPA_Handle handle) { SamplePlayer *player = (SamplePlayer *)handle; if (player->m_pendingProgramChange >= 0) { #ifdef DEBUG_SAMPLE_PLAYER SVDEBUG << "SamplePlayer::workThreadCallback: pending program change " << player->m_pendingProgramChange << endl; #endif player->m_mutex.lock(); int program = player->m_pendingProgramChange; player->m_pendingProgramChange = -1; if (!player->m_sampleSearchComplete) { player->searchSamples(); } if (program < int(player->m_samples.size())) { QString path = player->m_samples[program].second; QString programName = player->m_samples[program].first; if (programName != player->m_program) { player->m_program = programName; player->m_mutex.unlock(); player->loadSampleData(path); } else { player->m_mutex.unlock(); } } } if (!player->m_sampleSearchComplete) { QMutexLocker locker(&player->m_mutex); if (!player->m_sampleSearchComplete) { player->searchSamples(); } } } void SamplePlayer::searchSamples() { if (m_sampleSearchComplete) return; m_samples.clear(); #ifdef DEBUG_SAMPLE_PLAYER SVDEBUG << "SamplePlayer::searchSamples: Directory is \"" << m_sampleDir << "\"" << endl; #endif QDir dir(m_sampleDir, "*.wav"); for (unsigned int i = 0; i < dir.count(); ++i) { QFileInfo file(dir.filePath(dir[i])); if (file.isReadable()) { m_samples.push_back(std::pair (file.baseName(), file.filePath())); #ifdef DEBUG_SAMPLE_PLAYER cerr << "Found: " << dir[i] << endl; #endif } } m_sampleSearchComplete = true; } void SamplePlayer::loadSampleData(QString path) { SF_INFO info; SNDFILE *file; size_t samples = 0; float *tmpFrames, *tmpSamples, *tmpResamples, *tmpOld; size_t i; info.format = 0; #ifdef Q_OS_WIN file = sf_wchar_open((LPCWSTR)path.utf16(), SFM_READ, &info); #else file = sf_open(path.toLocal8Bit().data(), SFM_READ, &info); #endif if (!file) { cerr << "SamplePlayer::loadSampleData: Failed to open file " << path << ": " << sf_strerror(file) << endl; return; } samples = info.frames; tmpFrames = (float *)malloc(info.frames * info.channels * sizeof(float)); if (!tmpFrames) return; sf_readf_float(file, tmpFrames, info.frames); sf_close(file); tmpResamples = 0; if (info.samplerate != m_sampleRate) { double ratio = (double)m_sampleRate / (double)info.samplerate; size_t target = (size_t)(double(info.frames) * ratio); SRC_DATA data; tmpResamples = (float *)malloc(target * info.channels * sizeof(float)); if (!tmpResamples) { free(tmpFrames); return; } memset(tmpResamples, 0, target * info.channels * sizeof(float)); data.data_in = tmpFrames; data.data_out = tmpResamples; data.input_frames = info.frames; data.output_frames = target; data.src_ratio = ratio; if (!src_simple(&data, SRC_SINC_BEST_QUALITY, info.channels)) { free(tmpFrames); tmpFrames = tmpResamples; samples = target; } else { free(tmpResamples); } } /* add an extra sample for linear interpolation */ tmpSamples = (float *)malloc((samples + 1) * sizeof(float)); if (!tmpSamples) { free(tmpFrames); return; } for (i = 0; i < samples; ++i) { int j; tmpSamples[i] = 0.0f; for (j = 0; j < info.channels; ++j) { tmpSamples[i] += tmpFrames[i * info.channels + j]; } } free(tmpFrames); /* add an extra sample for linear interpolation */ tmpSamples[samples] = 0.0f; QMutexLocker locker(&m_mutex); tmpOld = m_sampleData; m_sampleData = tmpSamples; m_sampleCount = samples; for (i = 0; i < Polyphony; ++i) { m_ons[i] = -1; m_offs[i] = -1; m_velocities[i] = 0; } if (tmpOld) free(tmpOld); printf("%s: loaded %s (%ld samples from original %ld channels resampled from %ld frames at %ld Hz)\n", "sampler", path.toLocal8Bit().data(), (long)samples, (long)info.channels, (long)info.frames, (long)info.samplerate); } void SamplePlayer::runImpl(unsigned long sampleCount, snd_seq_event_t *events, unsigned long eventCount) { unsigned long pos; unsigned long count; unsigned long event_pos; int i; memset(m_output, 0, sampleCount * sizeof(float)); if (!m_mutex.tryLock()) return; if (!m_sampleData || !m_sampleCount) { m_sampleNo += sampleCount; m_mutex.unlock(); return; } for (pos = 0, event_pos = 0; pos < sampleCount; ) { while (event_pos < eventCount && pos >= events[event_pos].time.tick) { if (events[event_pos].type == SND_SEQ_EVENT_NOTEON) { #ifdef DEBUG_SAMPLE_PLAYER cerr << "SamplePlayer: found NOTEON at time " << events[event_pos].time.tick << endl; #endif snd_seq_ev_note_t n = events[event_pos].data.note; if (n.velocity > 0) { m_ons[n.note] = m_sampleNo + events[event_pos].time.tick; m_offs[n.note] = -1; m_velocities[n.note] = n.velocity; } else { if (!m_sustain || (*m_sustain < 0.001)) { m_offs[n.note] = m_sampleNo + events[event_pos].time.tick; } } } else if (events[event_pos].type == SND_SEQ_EVENT_NOTEOFF && (!m_sustain || (*m_sustain < 0.001))) { #ifdef DEBUG_SAMPLE_PLAYER cerr << "SamplePlayer: found NOTEOFF at time " << events[event_pos].time.tick << endl; #endif snd_seq_ev_note_t n = events[event_pos].data.note; m_offs[n.note] = m_sampleNo + events[event_pos].time.tick; } ++event_pos; } count = sampleCount - pos; if (event_pos < eventCount && events[event_pos].time.tick < sampleCount) { count = events[event_pos].time.tick - pos; } int notecount = 0; for (i = 0; i < Polyphony; ++i) { if (m_ons[i] >= 0) { ++notecount; addSample(i, pos, count); } } #ifdef DEBUG_SAMPLE_PLAYER cerr << "SamplePlayer: have " << notecount << " note(s) sounding currently" << endl; #endif pos += count; } m_sampleNo += sampleCount; m_mutex.unlock(); } void SamplePlayer::addSample(int n, unsigned long pos, unsigned long count) { float ratio = 1.f; float gain = 1.f; unsigned long i, s; if (m_retune && *m_retune) { if (m_concertA) { ratio *= *m_concertA / 440.f; } if (m_basePitch && float(n) != *m_basePitch) { ratio *= powf(1.059463094f, float(n) - *m_basePitch); } } if (long(pos + m_sampleNo) < m_ons[n]) return; gain = (float)m_velocities[n] / 127.0f; for (i = 0, s = pos + m_sampleNo - m_ons[n]; i < count; ++i, ++s) { float lgain = gain; float rs = float(s) * ratio; unsigned long rsi = lrintf(floorf(rs)); if (rsi >= m_sampleCount) { #ifdef DEBUG_SAMPLE_PLAYER cerr << "Note " << n << " has run out of samples (were " << m_sampleCount << " available at ratio " << ratio << "), ending" << endl; #endif m_ons[n] = -1; break; } if (m_offs[n] >= 0 && long(pos + i + m_sampleNo) > m_offs[n]) { unsigned long dist = pos + i + m_sampleNo - m_offs[n]; unsigned long releaseFrames = 200; if (m_release) { releaseFrames = long(*m_release * float(m_sampleRate) + 0.0001f); } if (dist > releaseFrames) { #ifdef DEBUG_SAMPLE_PLAYER cerr << "Note " << n << " has expired its release time (" << releaseFrames << " frames), ending" << endl; #endif m_ons[n] = -1; break; } else { lgain = lgain * (float)(releaseFrames - dist) / (float)releaseFrames; } } float sample = m_sampleData[rsi] + ((m_sampleData[rsi + 1] - m_sampleData[rsi]) * (rs - (float)rsi)); m_output[pos + i] += lgain * sample; } } sonic-visualiser-3.0.3/svcore/plugin/plugins/SamplePlayer.h0000644000000000000000000000607313111512442022171 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SAMPLE_PLAYER_H_ #define _SAMPLE_PLAYER_H_ #define DSSI_API_LEVEL 2 #include "../api/ladspa.h" #include "../api/dssi.h" #include #include #include #include class SamplePlayer { public: static const DSSI_Descriptor *getDescriptor(unsigned long index); private: SamplePlayer(int sampleRate); ~SamplePlayer(); enum { OutputPort = 0, RetunePort = 1, BasePitchPort = 2, ConcertAPort = 3, SustainPort = 4, ReleasePort = 5, PortCount = 6 }; enum { Polyphony = 128 }; static const char *const portNames[PortCount]; static const LADSPA_PortDescriptor ports[PortCount]; static const LADSPA_PortRangeHint hints[PortCount]; static const LADSPA_Properties properties; static const LADSPA_Descriptor ladspaDescriptor; static const DSSI_Descriptor dssiDescriptor; static const DSSI_Host_Descriptor *hostDescriptor; static LADSPA_Handle instantiate(const LADSPA_Descriptor *, unsigned long); static void connectPort(LADSPA_Handle, unsigned long, LADSPA_Data *); static void activate(LADSPA_Handle); static void run(LADSPA_Handle, unsigned long); static void deactivate(LADSPA_Handle); static void cleanup(LADSPA_Handle); static char *configure(LADSPA_Handle, const char *, const char *); static const DSSI_Program_Descriptor *getProgram(LADSPA_Handle, unsigned long); static void selectProgram(LADSPA_Handle, unsigned long, unsigned long); static int getMidiController(LADSPA_Handle, unsigned long); static void runSynth(LADSPA_Handle, unsigned long, snd_seq_event_t *, unsigned long); static void receiveHostDescriptor(const DSSI_Host_Descriptor *descriptor); static void workThreadCallback(LADSPA_Handle); void searchSamples(); void loadSampleData(QString path); void runImpl(unsigned long, snd_seq_event_t *, unsigned long); void addSample(int, unsigned long, unsigned long); float *m_output; float *m_retune; float *m_basePitch; float *m_concertA; float *m_sustain; float *m_release; float *m_sampleData; size_t m_sampleCount; int m_sampleRate; long m_ons[Polyphony]; long m_offs[Polyphony]; int m_velocities[Polyphony]; long m_sampleNo; QString m_sampleDir; QString m_program; std::vector > m_samples; // program name, path bool m_sampleSearchComplete; int m_pendingProgramChange; QMutex m_mutex; }; #endif sonic-visualiser-3.0.3/svcore/rdf/PluginRDFDescription.cpp0000644000000000000000000002174113111512442021717 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008-2012 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PluginRDFDescription.h" #include "PluginRDFIndexer.h" #include "base/Profiler.h" #include "plugin/PluginIdentifier.h" #include #include using Dataquay::Uri; using Dataquay::Node; using Dataquay::Nodes; using Dataquay::Triple; using Dataquay::Triples; using Dataquay::BasicStore; PluginRDFDescription::PluginRDFDescription(QString pluginId) : m_pluginId(pluginId), m_haveDescription(false) { PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); m_pluginUri = indexer->getURIForPluginId(pluginId); if (m_pluginUri == "") { cerr << "PluginRDFDescription: WARNING: No RDF description available for plugin ID \"" << pluginId << "\"" << endl; } else { // All the data we need should be in our RDF model already: // if it's not there, we don't know where to find it anyway if (index()) { m_haveDescription = true; } } } PluginRDFDescription::~PluginRDFDescription() { } bool PluginRDFDescription::haveDescription() const { return m_haveDescription; } QString PluginRDFDescription::getPluginName() const { return m_pluginName; } QString PluginRDFDescription::getPluginDescription() const { return m_pluginDescription; } QString PluginRDFDescription::getPluginMaker() const { return m_pluginMaker; } QString PluginRDFDescription::getPluginInfoURL() const { return m_pluginInfoURL; } QStringList PluginRDFDescription::getOutputIds() const { QStringList ids; for (OutputDispositionMap::const_iterator i = m_outputDispositions.begin(); i != m_outputDispositions.end(); ++i) { ids.push_back(i->first); } return ids; } QString PluginRDFDescription::getOutputName(QString outputId) const { if (m_outputNames.find(outputId) == m_outputNames.end()) { return ""; } return m_outputNames.find(outputId)->second; } PluginRDFDescription::OutputDisposition PluginRDFDescription::getOutputDisposition(QString outputId) const { if (m_outputDispositions.find(outputId) == m_outputDispositions.end()) { return OutputDispositionUnknown; } return m_outputDispositions.find(outputId)->second; } QString PluginRDFDescription::getOutputEventTypeURI(QString outputId) const { if (m_outputEventTypeURIMap.find(outputId) == m_outputEventTypeURIMap.end()) { return ""; } return m_outputEventTypeURIMap.find(outputId)->second; } QString PluginRDFDescription::getOutputFeatureAttributeURI(QString outputId) const { if (m_outputFeatureAttributeURIMap.find(outputId) == m_outputFeatureAttributeURIMap.end()) { return ""; } return m_outputFeatureAttributeURIMap.find(outputId)->second; } QString PluginRDFDescription::getOutputSignalTypeURI(QString outputId) const { if (m_outputSignalTypeURIMap.find(outputId) == m_outputSignalTypeURIMap.end()) { return ""; } return m_outputSignalTypeURIMap.find(outputId)->second; } QString PluginRDFDescription::getOutputUnit(QString outputId) const { if (m_outputUnitMap.find(outputId) == m_outputUnitMap.end()) { return ""; } return m_outputUnitMap.find(outputId)->second; } QString PluginRDFDescription::getOutputUri(QString outputId) const { if (m_outputUriMap.find(outputId) == m_outputUriMap.end()) { return ""; } return m_outputUriMap.find(outputId)->second; } bool PluginRDFDescription::index() { Profiler profiler("PluginRDFDescription::index"); bool success = true; if (!indexMetadata()) success = false; if (!indexOutputs()) success = false; return success; } bool PluginRDFDescription::indexMetadata() { Profiler profiler("PluginRDFDescription::index"); PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); const BasicStore *index = indexer->getIndex(); Uri plugin(m_pluginUri); Node n = index->complete (Triple(plugin, index->expand("vamp:name"), Node())); if (n.type == Node::Literal && n.value != "") { m_pluginName = n.value; } n = index->complete (Triple(plugin, index->expand("dc:description"), Node())); if (n.type == Node::Literal && n.value != "") { m_pluginDescription = n.value; } n = index->complete (Triple(plugin, index->expand("foaf:maker"), Node())); if (n.type == Node::URI || n.type == Node::Blank) { n = index->complete(Triple(n, index->expand("foaf:name"), Node())); if (n.type == Node::Literal && n.value != "") { m_pluginMaker = n.value; } } // If we have a more-information URL for this plugin, then we take // that. Otherwise, a more-information URL for the plugin library // would do nicely. n = index->complete (Triple(plugin, index->expand("foaf:page"), Node())); if (n.type == Node::URI && n.value != "") { m_pluginInfoURL = n.value; } n = index->complete (Triple(Node(), index->expand("vamp:available_plugin"), plugin)); if (n.value != "") { n = index->complete(Triple(n, index->expand("foaf:page"), Node())); if (n.type == Node::URI && n.value != "") { m_pluginInfoURL = n.value; } } return true; } bool PluginRDFDescription::indexOutputs() { Profiler profiler("PluginRDFDescription::indexOutputs"); PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); const BasicStore *index = indexer->getIndex(); Uri plugin(m_pluginUri); Nodes outputs = index->match (Triple(plugin, index->expand("vamp:output"), Node())).objects(); if (outputs.empty()) { cerr << "ERROR: PluginRDFDescription::indexURL: NOTE: No outputs defined for <" << m_pluginUri << ">" << endl; return false; } foreach (Node output, outputs) { if ((output.type != Node::URI && output.type != Node::Blank) || output.value == "") { cerr << "ERROR: PluginRDFDescription::indexURL: No valid URI for output " << output << " of plugin <" << m_pluginUri << ">" << endl; return false; } Node n = index->complete(Triple(output, index->expand("vamp:identifier"), Node())); if (n.type != Node::Literal || n.value == "") { cerr << "ERROR: PluginRDFDescription::indexURL: No vamp:identifier for output <" << output << ">" << endl; return false; } QString outputId = n.value; m_outputUriMap[outputId] = output.value; n = index->complete(Triple(output, Uri("a"), Node())); QString outputType; if (n.type == Node::URI) outputType = n.value; n = index->complete(Triple(output, index->expand("vamp:unit"), Node())); QString outputUnit; if (n.type == Node::Literal) outputUnit = n.value; if (outputType.contains("DenseOutput")) { m_outputDispositions[outputId] = OutputDense; } else if (outputType.contains("SparseOutput")) { m_outputDispositions[outputId] = OutputSparse; } else if (outputType.contains("TrackLevelOutput")) { m_outputDispositions[outputId] = OutputTrackLevel; } else { m_outputDispositions[outputId] = OutputDispositionUnknown; } // cerr << "output " << output << " -> id " << outputId << ", type " << outputType << ", unit " // << outputUnit << ", disposition " << m_outputDispositions[outputId] << endl; if (outputUnit != "") { m_outputUnitMap[outputId] = outputUnit; } n = index->complete(Triple(output, index->expand("dc:title"), Node())); if (n.type == Node::Literal && n.value != "") { m_outputNames[outputId] = n.value; } n = index->complete(Triple(output, index->expand("vamp:computes_event_type"), Node())); // cerr << output << " -> computes_event_type " << n << endl; if (n.type == Node::URI && n.value != "") { m_outputEventTypeURIMap[outputId] = n.value; } n = index->complete(Triple(output, index->expand("vamp:computes_feature"), Node())); if (n.type == Node::URI && n.value != "") { m_outputFeatureAttributeURIMap[outputId] = n.value; } n = index->complete(Triple(output, index->expand("vamp:computes_signal_type"), Node())); if (n.type == Node::URI && n.value != "") { m_outputSignalTypeURIMap[outputId] = n.value; } } return true; } sonic-visualiser-3.0.3/svcore/rdf/PluginRDFDescription.h0000644000000000000000000000454613111512442021370 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_RDF_DESCRIPTION_H_ #define _PLUGIN_RDF_DESCRIPTION_H_ #include #include #include #include "base/Debug.h" class PluginRDFDescription { public: PluginRDFDescription() : m_haveDescription(false) { } PluginRDFDescription(QString pluginId); ~PluginRDFDescription(); enum OutputDisposition { OutputDispositionUnknown, OutputSparse, OutputDense, OutputTrackLevel }; bool haveDescription() const; QString getPluginName() const; QString getPluginDescription() const; QString getPluginMaker() const; QString getPluginInfoURL() const; QStringList getOutputIds() const; QString getOutputName(QString outputId) const; OutputDisposition getOutputDisposition(QString outputId) const; QString getOutputEventTypeURI(QString outputId) const; QString getOutputFeatureAttributeURI(QString outputId) const; QString getOutputSignalTypeURI(QString outputId) const; QString getOutputUnit(QString outputId) const; QString getOutputUri(QString outputId) const; protected: typedef std::map OutputDispositionMap; typedef std::map OutputStringMap; QString m_pluginId; QString m_pluginUri; bool m_haveDescription; QString m_pluginName; QString m_pluginDescription; QString m_pluginMaker; QString m_pluginInfoURL; OutputStringMap m_outputNames; OutputDispositionMap m_outputDispositions; OutputStringMap m_outputEventTypeURIMap; OutputStringMap m_outputFeatureAttributeURIMap; OutputStringMap m_outputSignalTypeURIMap; OutputStringMap m_outputUnitMap; OutputStringMap m_outputUriMap; bool index(); bool indexMetadata(); bool indexOutputs(); }; #endif sonic-visualiser-3.0.3/svcore/rdf/PluginRDFIndexer.cpp0000644000000000000000000002477413111512442021043 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008-2012 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PluginRDFIndexer.h" #include "data/fileio/CachedFile.h" #include "data/fileio/FileSource.h" #include "data/fileio/PlaylistFileReader.h" #include "plugin/PluginIdentifier.h" #include "base/Profiler.h" #include "base/Debug.h" #include #include #include #include #include #include #include #include #include #include using std::vector; using std::string; using Vamp::PluginHostAdapter; using Dataquay::Uri; using Dataquay::Node; using Dataquay::Nodes; using Dataquay::Triple; using Dataquay::Triples; using Dataquay::BasicStore; using Dataquay::RDFException; using Dataquay::RDFDuplicateImportException; PluginRDFIndexer * PluginRDFIndexer::m_instance = 0; PluginRDFIndexer * PluginRDFIndexer::getInstance() { if (!m_instance) m_instance = new PluginRDFIndexer(); return m_instance; } PluginRDFIndexer::PluginRDFIndexer() : m_index(new Dataquay::BasicStore) { m_index->addPrefix("vamp", Uri("http://purl.org/ontology/vamp/")); m_index->addPrefix("foaf", Uri("http://xmlns.com/foaf/0.1/")); m_index->addPrefix("dc", Uri("http://purl.org/dc/elements/1.1/")); indexInstalledURLs(); } const BasicStore * PluginRDFIndexer::getIndex() { return m_index; } PluginRDFIndexer::~PluginRDFIndexer() { QMutexLocker locker(&m_mutex); } void PluginRDFIndexer::indexInstalledURLs() { vector paths = PluginHostAdapter::getPluginPath(); // SVDEBUG << "\nPluginRDFIndexer::indexInstalledURLs: pid is " << getpid() << endl; QStringList filters; filters << "*.ttl"; filters << "*.TTL"; filters << "*.n3"; filters << "*.N3"; filters << "*.rdf"; filters << "*.RDF"; // Search each Vamp plugin path for an RDF file that either has // name "soname", "soname:label" or "soname/label" plus RDF // extension. Use that order of preference, and prefer ttl over // n3 over rdf extension. for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { QDir dir(i->c_str()); if (!dir.exists()) continue; QStringList entries = dir.entryList (filters, QDir::Files | QDir::Readable); for (QStringList::const_iterator j = entries.begin(); j != entries.end(); ++j) { QFileInfo fi(dir.filePath(*j)); pullFile(fi.absoluteFilePath()); } QStringList subdirs = dir.entryList (QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Readable); for (QStringList::const_iterator j = subdirs.begin(); j != subdirs.end(); ++j) { QDir subdir(dir.filePath(*j)); if (subdir.exists()) { entries = subdir.entryList (filters, QDir::Files | QDir::Readable); for (QStringList::const_iterator k = entries.begin(); k != entries.end(); ++k) { QFileInfo fi(subdir.filePath(*k)); pullFile(fi.absoluteFilePath()); } } } } reindex(); } bool PluginRDFIndexer::indexConfiguredURLs() { SVDEBUG << "PluginRDFIndexer::indexConfiguredURLs" << endl; QSettings settings; settings.beginGroup("RDF"); QString indexKey("rdf-indices"); QStringList indices = settings.value(indexKey).toStringList(); for (int i = 0; i < indices.size(); ++i) { QString index = indices[i]; SVDEBUG << "PluginRDFIndexer::indexConfiguredURLs: index url is " << index << endl; CachedFile cf(index); if (!cf.isOK()) continue; FileSource indexSource(cf.getLocalFilename()); PlaylistFileReader reader(indexSource); if (!reader.isOK()) continue; PlaylistFileReader::Playlist list = reader.load(); for (PlaylistFileReader::Playlist::const_iterator j = list.begin(); j != list.end(); ++j) { SVDEBUG << "PluginRDFIndexer::indexConfiguredURLs: url is " << *j << endl; pullURL(*j); } } QString urlListKey("rdf-urls"); QStringList urls = settings.value(urlListKey).toStringList(); for (int i = 0; i < urls.size(); ++i) { pullURL(urls[i]); } settings.endGroup(); reindex(); return true; } QString PluginRDFIndexer::getURIForPluginId(QString pluginId) { QMutexLocker locker(&m_mutex); if (m_idToUriMap.find(pluginId) == m_idToUriMap.end()) return ""; return m_idToUriMap[pluginId]; } QString PluginRDFIndexer::getIdForPluginURI(QString uri) { m_mutex.lock(); if (m_uriToIdMap.find(uri) == m_uriToIdMap.end()) { m_mutex.unlock(); // Haven't found this uri referenced in any document on the // local filesystem; try resolving the pre-fragment part of // the uri as a document URL and reading that if possible. // Because we may want to refer to this document again, we // cache it locally if it turns out to exist. SVDEBUG << "PluginRDFIndexer::getIdForPluginURI: NOTE: Failed to find a local RDF document describing plugin <" << uri << ">: attempting to retrieve one remotely by guesswork" << endl; QString baseUrl = QUrl(uri).toString(QUrl::RemoveFragment); indexURL(baseUrl); m_mutex.lock(); if (m_uriToIdMap.find(uri) == m_uriToIdMap.end()) { m_uriToIdMap[uri] = ""; } } QString id = m_uriToIdMap[uri]; m_mutex.unlock(); return id; } QStringList PluginRDFIndexer::getIndexedPluginIds() { QMutexLocker locker(&m_mutex); QStringList ids; for (StringMap::const_iterator i = m_idToUriMap.begin(); i != m_idToUriMap.end(); ++i) { ids.push_back(i->first); } return ids; } bool PluginRDFIndexer::pullFile(QString filepath) { QUrl url = QUrl::fromLocalFile(filepath); QString urlString = url.toString(); return pullURL(urlString); } bool PluginRDFIndexer::indexURL(QString urlString) { bool pulled = pullURL(urlString); if (!pulled) return false; reindex(); return true; } bool PluginRDFIndexer::pullURL(QString urlString) { Profiler profiler("PluginRDFIndexer::indexURL"); // SVDEBUG << "PluginRDFIndexer::indexURL(" << urlString << ")" << endl; QMutexLocker locker(&m_mutex); QUrl local = urlString; if (FileSource::isRemote(urlString) && FileSource::canHandleScheme(urlString)) { CachedFile cf(urlString, 0, "application/rdf+xml"); if (!cf.isOK()) { return false; } local = QUrl::fromLocalFile(cf.getLocalFilename()); } else if (urlString.startsWith("file:")) { local = QUrl(urlString); } else { local = QUrl::fromLocalFile(urlString); } try { m_index->import(local, BasicStore::ImportFailOnDuplicates); } catch (RDFDuplicateImportException &e) { SVDEBUG << e.what() << endl; SVDEBUG << "PluginRDFIndexer::pullURL: Document at " << urlString << " duplicates triples found in earlier loaded document -- skipping it" << endl; return false; } catch (RDFException &e) { SVDEBUG << e.what() << endl; SVDEBUG << "PluginRDFIndexer::pullURL: Failed to import document from " << urlString << ": " << e.what() << endl; return false; } return true; } bool PluginRDFIndexer::reindex() { Triples tt = m_index->match (Triple(Node(), Uri("a"), m_index->expand("vamp:Plugin"))); Nodes plugins = tt.subjects(); bool foundSomething = false; bool addedSomething = false; foreach (Node plugin, plugins) { if (plugin.type != Node::URI) { SVDEBUG << "PluginRDFIndexer::reindex: Plugin has no URI: node is " << plugin << endl; continue; } Node idn = m_index->complete (Triple(plugin, m_index->expand("vamp:identifier"), Node())); if (idn.type != Node::Literal) { SVDEBUG << "PluginRDFIndexer::reindex: Plugin " << plugin << " lacks vamp:identifier literal" << endl; continue; } Node libn = m_index->complete (Triple(Node(), m_index->expand("vamp:available_plugin"), plugin)); if (libn.type != Node::URI) { SVDEBUG << "PluginRDFIndexer::reindex: Plugin " << plugin << " is not vamp:available_plugin in any library" << endl; continue; } Node son = m_index->complete (Triple(libn, m_index->expand("vamp:identifier"), Node())); if (son.type != Node::Literal) { SVDEBUG << "PluginRDFIndexer::reindex: Library " << libn << " lacks vamp:identifier for soname" << endl; continue; } QString pluginUri = plugin.value; QString identifier = idn.value; QString soname = son.value; QString pluginId = PluginIdentifier::createIdentifier ("vamp", soname, identifier); foundSomething = true; if (m_idToUriMap.find(pluginId) != m_idToUriMap.end()) { continue; } m_idToUriMap[pluginId] = pluginUri; addedSomething = true; if (pluginUri != "") { if (m_uriToIdMap.find(pluginUri) != m_uriToIdMap.end()) { SVDEBUG << "PluginRDFIndexer::reindex: WARNING: Found multiple plugins with the same URI:" << endl; SVDEBUG << " 1. Plugin id \"" << m_uriToIdMap[pluginUri] << "\"" << endl; SVDEBUG << " 2. Plugin id \"" << pluginId << "\"" << endl; SVDEBUG << "both claim URI <" << pluginUri << ">" << endl; } else { m_uriToIdMap[pluginUri] = pluginId; } } } if (!foundSomething) { SVDEBUG << "PluginRDFIndexer::reindex: NOTE: Plugins found, but none sufficiently described" << endl; } return addedSomething; } sonic-visualiser-3.0.3/svcore/rdf/PluginRDFIndexer.h0000644000000000000000000000405213111512442020473 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_RDF_INDEXER_H_ #define _PLUGIN_RDF_INDEXER_H_ #include #include #include #include #include namespace Dataquay { class BasicStore; } class PluginRDFIndexer { public: static PluginRDFIndexer *getInstance(); /** * Index all URLs obtained from index files defined in the current * settings. In contrast to indexing URLs that are installed * locally alongside plugins, this is not done automatically * because it may incur significant processing and networking * effort. It could be called from a background thread at * startup, for example. * * Note that this class has a single mutex, so other functions * will block if called from a different thread while this one is * running. */ bool indexConfiguredURLs(); bool indexURL(QString url); // in addition to "installed" URLs QString getURIForPluginId(QString pluginId); QString getIdForPluginURI(QString uri); QStringList getIndexedPluginIds(); const Dataquay::BasicStore *getIndex(); ~PluginRDFIndexer(); protected: PluginRDFIndexer(); QMutex m_mutex; typedef std::map StringMap; StringMap m_uriToIdMap; StringMap m_idToUriMap; void indexInstalledURLs(); bool pullFile(QString path); bool pullURL(QString urlString); bool reindex(); Dataquay::BasicStore *m_index; static PluginRDFIndexer *m_instance; }; #endif sonic-visualiser-3.0.3/svcore/rdf/RDFExporter.cpp0000644000000000000000000001361113111512442020062 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RDFExporter.h" #include "RDFFeatureWriter.h" #include #include "data/model/Model.h" #include "data/model/RegionModel.h" #include "data/model/NoteModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/TextModel.h" #include "data/model/EditableDenseThreeDimensionalModel.h" bool RDFExporter::canExportModel(Model *m) { if (dynamic_cast(m)) return true; if (dynamic_cast(m)) return true; if (dynamic_cast(m)) return true; if (dynamic_cast(m)) return true; if (dynamic_cast(m)) return true; // no, looks like we never implemented this one // if (dynamic_cast(m)) return true; return false; } RDFExporter::RDFExporter(QString path, Model *m) : m_path(path), m_model(m), m_fw(new RDFFeatureWriter()) { map params; params["one-file"] = path.toStdString(); params["force"] = "true"; m_fw->setParameters(params); } RDFExporter::~RDFExporter() { delete m_fw; } bool RDFExporter::isOK() const { return true; } QString RDFExporter::getError() const { return ""; } void RDFExporter::write() { QString trackId; // nil Transform transform; // nil Vamp::Plugin::OutputDescriptor output; // nil std::string summaryType; // nil Vamp::Plugin::FeatureList features; features.push_back(Vamp::Plugin::Feature()); Vamp::Plugin::Feature &f = features[0]; sv_samplerate_t sr = m_model->getSampleRate(); { RegionModel *m = dynamic_cast(m_model); if (m) { f.hasTimestamp = true; f.hasDuration = true; const RegionModel::PointList &pl(m->getPoints()); for (RegionModel::PointList::const_iterator i = pl.begin(); i != pl.end(); ++i) { f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime(); f.duration = RealTime::frame2RealTime(i->duration, sr).toVampRealTime(); f.values.clear(); f.values.push_back(i->value); f.label = i->label.toStdString(); m_fw->write(trackId, transform, output, features, summaryType); } return; } } { NoteModel *m = dynamic_cast(m_model); if (m) { f.hasTimestamp = true; f.hasDuration = true; const NoteModel::PointList &pl(m->getPoints()); for (NoteModel::PointList::const_iterator i = pl.begin(); i != pl.end(); ++i) { f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime(); f.duration = RealTime::frame2RealTime(i->duration, sr).toVampRealTime(); f.values.clear(); f.values.push_back(i->value); f.values.push_back(i->level); f.label = i->label.toStdString(); m_fw->write(trackId, transform, output, features, summaryType); } return; } } { SparseOneDimensionalModel *m = dynamic_cast(m_model); if (m) { f.hasTimestamp = true; f.hasDuration = false; const SparseOneDimensionalModel::PointList &pl(m->getPoints()); for (SparseOneDimensionalModel::PointList::const_iterator i = pl.begin(); i != pl.end(); ++i) { f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime(); f.values.clear(); f.label = i->label.toStdString(); m_fw->write(trackId, transform, output, features, summaryType); } return; } } { SparseTimeValueModel *m = dynamic_cast(m_model); if (m) { f.hasTimestamp = true; f.hasDuration = false; const SparseTimeValueModel::PointList &pl(m->getPoints()); for (SparseTimeValueModel::PointList::const_iterator i = pl.begin(); i != pl.end(); ++i) { f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime(); f.values.clear(); f.values.push_back(i->value); f.label = i->label.toStdString(); m_fw->write(trackId, transform, output, features, summaryType); } return; } } { TextModel *m = dynamic_cast(m_model); if (m) { f.hasTimestamp = true; f.hasDuration = false; const TextModel::PointList &pl(m->getPoints()); m_fw->setFixedEventTypeURI("af:Text"); for (TextModel::PointList::const_iterator i = pl.begin(); i != pl.end(); ++i) { f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime(); f.values.clear(); f.values.push_back(i->height); f.label = i->label.toStdString(); m_fw->write(trackId, transform, output, features, summaryType); } return; } } } QString RDFExporter::getSupportedExtensions() { return "*.ttl *.n3"; } sonic-visualiser-3.0.3/svcore/rdf/RDFExporter.h0000644000000000000000000000231513111512442017526 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RDF_EXPORTER_H_ #define _RDF_EXPORTER_H_ #include class Model; class RDFFeatureWriter; class RDFExporter { public: /** * Return the file extensions that we can write, in a format * suitable for use with QFileDialog. For example, "*.ttl *.n3". */ static QString getSupportedExtensions(); RDFExporter(QString path, Model *model); virtual ~RDFExporter(); static bool canExportModel(Model *); virtual bool isOK() const; virtual QString getError() const; virtual void write(); protected: QString m_path; Model *m_model; RDFFeatureWriter *m_fw; }; #endif sonic-visualiser-3.0.3/svcore/rdf/RDFFeatureWriter.cpp0000644000000000000000000006607713111512442021060 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include #include "base/Exceptions.h" #include "RDFFeatureWriter.h" #include "RDFTransformFactory.h" #include "PluginRDFIndexer.h" #include #include #include #include #include using namespace std; using Vamp::Plugin; using Vamp::PluginBase; RDFFeatureWriter::RDFFeatureWriter() : FileFeatureWriter(SupportOneFilePerTrackTransform | SupportOneFilePerTrack | SupportOneFileTotal | SupportStdOut, "n3"), m_plain(false), m_network(false), m_networkRetrieved(false), m_count(0) { } RDFFeatureWriter::~RDFFeatureWriter() { } string RDFFeatureWriter::getDescription() const { return "Write output in Audio Features Ontology RDF/Turtle format."; } RDFFeatureWriter::ParameterList RDFFeatureWriter::getSupportedParameters() const { ParameterList pl = FileFeatureWriter::getSupportedParameters(); Parameter p; p.name = "plain"; p.description = "Use \"plain\" RDF even if transform metadata is available."; p.hasArg = false; pl.push_back(p); p.name = "audiofile-uri"; p.description = "Link the output RDF to the given audio file URI instead of its actual location."; p.hasArg = true; pl.push_back(p); p.name = "track-uri"; p.description = "Link the output RDF to the given track URI."; p.hasArg = true; pl.push_back(p); p.name = "maker-uri"; p.description = "Link the track in the output RDF to the given foaf:maker URI."; p.hasArg = true; pl.push_back(p); p.name = "network"; p.description = "Attempt to retrieve RDF descriptions of plugins from network, if not available locally"; p.hasArg = false; pl.push_back(p); return pl; } void RDFFeatureWriter::setParameters(map ¶ms) { FileFeatureWriter::setParameters(params); for (map::iterator i = params.begin(); i != params.end(); ++i) { if (i->first == "plain") { m_plain = true; } if (i->first == "audiofile-uri") { m_userAudioFileUri = i->second.c_str(); } if (i->first == "track-uri") { m_userTrackUri = i->second.c_str(); } if (i->first == "maker-uri") { m_userMakerUri = i->second.c_str(); } if (i->first == "network") { m_network = true; } } } void RDFFeatureWriter::setTrackMetadata(QString trackId, TrackMetadata metadata) { // cerr << "setTrackMetadata: title = " << metadata.title << ", maker = " << metadata.maker << endl; m_metadata[trackId] = metadata; } void RDFFeatureWriter::setFixedEventTypeURI(QString uri) { m_fixedEventTypeURI = uri; } void RDFFeatureWriter::write(QString trackId, const Transform &transform, const Plugin::OutputDescriptor& output, const Plugin::FeatureList& features, std::string summaryType) { QString pluginId = transform.getPluginIdentifier(); if (m_rdfDescriptions.find(pluginId) == m_rdfDescriptions.end()) { if (m_network && !m_networkRetrieved) { PluginRDFIndexer::getInstance()->indexConfiguredURLs(); m_networkRetrieved = true; } m_rdfDescriptions[pluginId] = PluginRDFDescription(pluginId); if (m_rdfDescriptions[pluginId].haveDescription()) { cerr << "NOTE: Have RDF description for plugin ID \"" << pluginId << "\"" << endl; } else { cerr << "NOTE: No RDF description for plugin ID \"" << pluginId << "\"" << endl; if (!m_network) { cerr << " Consider using the --rdf-network option to retrieve plugin descriptions" << endl; cerr << " from the network where possible." << endl; } } } // Need to select appropriate output file for our track/transform // combination QTextStream *stream = getOutputStream(trackId, transform.getIdentifier(), QTextCodec::codecForName("UTF-8")); if (!stream) { throw FailedToOpenOutputStream(trackId, transform.getIdentifier()); } if (m_startedStreamTransforms.find(stream) == m_startedStreamTransforms.end()) { // cerr << "This stream is new, writing prefixes" << endl; writePrefixes(stream); if (m_singleFileName == "" && !m_stdout) { writeSignalDescription(stream, trackId); } } if (m_startedStreamTransforms[stream].find(transform) == m_startedStreamTransforms[stream].end()) { m_startedStreamTransforms[stream].insert(transform); writeLocalFeatureTypes (stream, transform, output, m_rdfDescriptions[pluginId], summaryType); } if (m_singleFileName != "" || m_stdout) { if (m_startedTrackIds.find(trackId) == m_startedTrackIds.end()) { writeSignalDescription(stream, trackId); m_startedTrackIds.insert(trackId); } } QString timelineURI = m_trackTimelineURIs[trackId]; if (timelineURI == "") { cerr << "RDFFeatureWriter: INTERNAL ERROR: writing features without having established a timeline URI!" << endl; exit(1); } if (summaryType != "") { writeSparseRDF(stream, transform, output, features, m_rdfDescriptions[pluginId], timelineURI); } else if (m_rdfDescriptions[pluginId].haveDescription() && m_rdfDescriptions[pluginId].getOutputDisposition (output.identifier.c_str()) == PluginRDFDescription::OutputDense) { QString signalURI = m_trackSignalURIs[trackId]; if (signalURI == "") { cerr << "RDFFeatureWriter: INTERNAL ERROR: writing dense features without having established a signal URI!" << endl; exit(1); } writeDenseRDF(stream, transform, output, features, m_rdfDescriptions[pluginId], signalURI, timelineURI); } else if (!m_plain && m_rdfDescriptions[pluginId].haveDescription() && m_rdfDescriptions[pluginId].getOutputDisposition (output.identifier.c_str()) == PluginRDFDescription::OutputTrackLevel && m_rdfDescriptions[pluginId].getOutputFeatureAttributeURI (output.identifier.c_str()) != "") { QString signalURI = m_trackSignalURIs[trackId]; if (signalURI == "") { cerr << "RDFFeatureWriter: INTERNAL ERROR: writing track-level features without having established a signal URI!" << endl; exit(1); } writeTrackLevelRDF(stream, transform, output, features, m_rdfDescriptions[pluginId], signalURI); } else { writeSparseRDF(stream, transform, output, features, m_rdfDescriptions[pluginId], timelineURI); } } void RDFFeatureWriter::writePrefixes(QTextStream *sptr) { QTextStream &stream = *sptr; stream << "@prefix dc: .\n" << "@prefix mo: .\n" << "@prefix af: .\n" << "@prefix foaf: . \n" << "@prefix event: .\n" << "@prefix rdf: .\n" << "@prefix rdfs: .\n" << "@prefix xsd: .\n" << "@prefix tl: .\n" << "@prefix vamp: .\n" << "@prefix : <#> .\n\n"; } void RDFFeatureWriter::reviewFileForAppending(QString filename) { // Appending to an RDF file is tricky, because we need to ensure // that our URIs differ from any already in the file. This is a // dirty grubby low-rent way of doing that. This function is // called by FileFeatureWriter::getOutputFile when in append mode. // cerr << "reviewFileForAppending(" << filename << ")" << endl; QFile file(filename); // just return, don't report failure -- function that called us will do that if (!file.open(QIODevice::ReadOnly)) return; QTextStream in(&file); QRegExp localObjectUriWithDigits(":[^ ]+_([0-9]+) a "); while (!in.atEnd()) { QString line = in.readLine(); if (line.length() > 120) { // probably data continue; } if (localObjectUriWithDigits.indexIn(line) > -1) { QString numeric = localObjectUriWithDigits.cap(1); int number = numeric.toInt(); if (number >= m_count) m_count = number + 1; } } file.close(); } void RDFFeatureWriter::writeSignalDescription(QTextStream *sptr, QString trackId) { // SVDEBUG << "RDFFeatureWriter::writeSignalDescription" << endl; QTextStream &stream = *sptr; /* * Describe signal we're analysing (AudioFile, Signal, TimeLine, etc.) */ QUrl url(trackId, QUrl::StrictMode); QString scheme = url.scheme().toLower(); bool local = (scheme == "" || scheme == "file" || scheme.length() == 1); if (local) { if (scheme == "") { url.setScheme("file"); url.setPath(QFileInfo(url.path()).absoluteFilePath()); } else if (scheme.length() == 1) { // DOS drive letter! url.setScheme("file"); url.setPath(scheme + ":" + url.path()); } } // Note reviewFileForAppending above (when opening in append mode) unsigned long signalCount = m_count++; if (m_trackSignalURIs.find(trackId) == m_trackSignalURIs.end()) { m_trackSignalURIs[trackId] = QString(":signal_%1").arg(signalCount); } QString signalURI = m_trackSignalURIs[trackId]; if (m_trackTrackURIs.find(trackId) == m_trackTrackURIs.end()) { m_trackTrackURIs[trackId] = QString(":track_%1").arg(signalCount); } QString trackURI = m_trackTrackURIs[trackId]; bool userSpecifiedTrack = false; if (m_userTrackUri != "") { trackURI = "<" + m_userTrackUri + ">"; m_trackTrackURIs[trackId] = trackURI; userSpecifiedTrack = true; } if (m_trackTimelineURIs.find(trackId) == m_trackTimelineURIs.end()) { m_trackTimelineURIs[trackId] = QString(":signal_timeline_%1").arg(signalCount); } QString timelineURI = m_trackTimelineURIs[trackId]; QString afURI = url.toEncoded().data(); if (m_userAudioFileUri != "") afURI = m_userAudioFileUri; bool wantTrack = (userSpecifiedTrack || (m_userMakerUri != "") || haveTitleArtistMetadata(trackId)); // cerr << "wantTrack = " << wantTrack << " (userSpecifiedTrack = " // << userSpecifiedTrack << ", m_userMakerUri = " << m_userMakerUri << ", have metadata = " << (m_metadata.find(trackId) != m_metadata.end()) << ")" << endl; if (wantTrack) { // We only write a Track at all if we have some title/artist // metadata to put in it, or if the user has requested a // specific track URI. Otherwise we can't be sure that what // we have is a Track, in the publication sense -- it may just // be a fragment, a test file, whatever. Since we'd have no // metadata to associate with our Track, the only effect of // including a Track would be to assert that this was one, // which is the one thing we wouldn't know... TrackMetadata tm; if (haveTitleArtistMetadata(trackId)) { tm = m_metadata[trackId]; } stream << trackURI << " a mo:Track "; if (tm.title != "") { stream << ";\n dc:title \"\"\"" << tm.title << "\"\"\" "; } if (m_userMakerUri != "") { stream << ";\n foaf:maker <" << m_userMakerUri << "> "; } else if (tm.maker != "") { stream << ";\n foaf:maker [ a mo:MusicArtist; foaf:name \"\"\"" << tm.maker << "\"\"\" ] "; } if (afURI != "") { stream << ";\n mo:available_as <" << afURI << "> "; } stream << ".\n\n"; } if (afURI != "") { stream << "<" << afURI << "> a mo:AudioFile ;\n"; stream << " mo:encodes " << signalURI << ".\n\n"; } stream << signalURI << " a mo:Signal ;\n"; stream << " mo:time [\n" << " a tl:Interval ;\n" << " tl:onTimeLine " << timelineURI << "\n ] .\n\n"; stream << timelineURI << " a tl:Timeline .\n\n"; } void RDFFeatureWriter::writeLocalFeatureTypes(QTextStream *sptr, const Transform &transform, const Plugin::OutputDescriptor &od, PluginRDFDescription &desc, std::string summaryType) { QString outputId = od.identifier.c_str(); QTextStream &stream = *sptr; // There is no "needFeatureType" for track-level outputs, because // we can't meaningfully write a feature at all if we don't know // what property to use for it. If the output is track level but // there is no feature type given, we have to revert to events. bool needEventType = false; bool needSignalType = false; //!!! bin names, extents and so on can be written out using e.g. vamp:bin_names ( "a" "b" "c" ) if (summaryType == "" && desc.getOutputDisposition(outputId) == PluginRDFDescription::OutputDense) { // no feature events, so may need signal type but won't need // event type if (m_plain) { needSignalType = true; } else if (desc.getOutputSignalTypeURI(outputId) == "") { needSignalType = true; } } else if (desc.getOutputDisposition(outputId) == PluginRDFDescription::OutputTrackLevel) { // see note above -- need to generate an event type if no // feature type given, or if in plain mode if (m_plain) { needEventType = true; } else if (desc.getOutputFeatureAttributeURI(outputId) == "") { if (desc.getOutputEventTypeURI(outputId) == "") { needEventType = true; } } } else { // may need event type but won't need signal type if (m_plain) { needEventType = true; } else if (desc.getOutputEventTypeURI(outputId) == "") { needEventType = true; } } QString transformUri; if (m_transformURIs.find(transform) != m_transformURIs.end()) { transformUri = m_transformURIs[transform]; } else { transformUri = QString(":transform_%1_%2").arg(m_count++).arg(outputId); m_transformURIs[transform] = transformUri; } if (transform.getIdentifier() != "") { stream << endl << RDFTransformFactory::writeTransformToRDF(transform, transformUri) << endl; } if (needEventType && m_fixedEventTypeURI == "") { QString uri; if (m_syntheticEventTypeURIs.find(transform) != m_syntheticEventTypeURIs.end()) { uri = m_syntheticEventTypeURIs[transform]; } else { uri = QString(":event_type_%1").arg(m_count++); m_syntheticEventTypeURIs[transform] = uri; } stream << uri << " rdfs:subClassOf event:Event ;" << endl << " dc:title \"" << od.name.c_str() << "\" ;" << endl << " dc:format \"" << od.unit.c_str() << "\" ;" << endl << " dc:description \"" << od.description.c_str() << "\" ." << endl << endl; } if (needSignalType) { QString uri; if (m_syntheticSignalTypeURIs.find(transform) != m_syntheticSignalTypeURIs.end()) { uri = m_syntheticSignalTypeURIs[transform]; } else { uri = QString(":signal_type_%1").arg(m_count++); m_syntheticSignalTypeURIs[transform] = uri; } stream << uri << " rdfs:subClassOf af:Signal ;" << endl << " dc:title \"" << od.name.c_str() << "\" ;" << endl << " dc:format \"" << od.unit.c_str() << "\" ;" << endl << " dc:description \"" << od.description.c_str() << "\" ." << endl << endl; } } void RDFFeatureWriter::writeSparseRDF(QTextStream *sptr, const Transform &transform, const Plugin::OutputDescriptor& od, const Plugin::FeatureList& featureList, PluginRDFDescription &desc, QString timelineURI) { // SVDEBUG << "RDFFeatureWriter::writeSparseRDF: have " << featureList.size() << " features" << endl; if (featureList.empty()) return; QTextStream &stream = *sptr; bool plain = (m_plain || !desc.haveDescription()); QString outputId = od.identifier.c_str(); // iterate through FeatureLists for (int i = 0; i < (int)featureList.size(); ++i) { const Plugin::Feature &feature = featureList[i]; unsigned long featureNumber = m_count++; stream << ":event_" << featureNumber << " a "; if (m_fixedEventTypeURI != "") { stream << m_fixedEventTypeURI << " ;\n"; } else { QString eventTypeURI = desc.getOutputEventTypeURI(outputId); if (plain || eventTypeURI == "") { if (m_syntheticEventTypeURIs.find(transform) != m_syntheticEventTypeURIs.end()) { stream << m_syntheticEventTypeURIs[transform] << " ;\n"; } else { stream << ":event_type_" << outputId << " ;\n"; } } else { stream << "<" << eventTypeURI << "> ;\n"; } } QString timestamp = feature.timestamp.toString().c_str(); timestamp.replace(QRegExp("^ +"), ""); if (feature.hasDuration && feature.duration > Vamp::RealTime::zeroTime) { QString duration = feature.duration.toString().c_str(); duration.replace(QRegExp("^ +"), ""); stream << " event:time [ \n" << " a tl:Interval ;\n" << " tl:onTimeLine " << timelineURI << " ;\n" << " tl:beginsAt \"PT" << timestamp << "S\"^^xsd:duration ;\n" << " tl:duration \"PT" << duration << "S\"^^xsd:duration ;\n" << " ] "; } else { stream << " event:time [ \n" << " a tl:Instant ;\n" //location of the event in time << " tl:onTimeLine " << timelineURI << " ;\n" << " tl:at \"PT" << timestamp << "S\"^^xsd:duration ;\n ] "; } if (transform.getIdentifier() != "") { stream << ";\n"; stream << " vamp:computed_by " << m_transformURIs[transform] << " "; } if (feature.label.length() > 0) { stream << ";\n"; stream << " rdfs:label \"\"\"" << feature.label.c_str() << "\"\"\" "; } if (!feature.values.empty()) { stream << ";\n"; //!!! named bins? stream << " af:feature \"" << feature.values[0]; for (int j = 1; j < (int)feature.values.size(); ++j) { stream << " " << feature.values[j]; } stream << "\" "; } stream << ".\n"; } } void RDFFeatureWriter::writeTrackLevelRDF(QTextStream *sptr, const Transform &, const Plugin::OutputDescriptor& od, const Plugin::FeatureList& featureList, PluginRDFDescription &desc, QString signalURI) { if (featureList.empty()) return; QTextStream &stream = *sptr; // bool plain = (m_plain || !desc.haveDescription()); QString outputId = od.identifier.c_str(); QString featureUri = desc.getOutputFeatureAttributeURI(outputId); if (featureUri == "") { SVDEBUG << "RDFFeatureWriter::writeTrackLevelRDF: ERROR: No feature URI available -- this function should not have been called!" << endl; return; } for (int i = 0; i < (int)featureList.size(); ++i) { const Plugin::Feature &feature = featureList[i]; if (feature.values.empty()) { if (feature.label == "") continue; stream << signalURI << " " << featureUri << " \"\"\"" << feature.label.c_str() << "\"\"\" .\n"; } else { stream << signalURI << " " << featureUri << " \"" << feature.values[0] << "\"^^xsd:float .\n"; } } } void RDFFeatureWriter::writeDenseRDF(QTextStream *sptr, const Transform &transform, const Plugin::OutputDescriptor& od, const Plugin::FeatureList& featureList, PluginRDFDescription &desc, QString signalURI, QString timelineURI) { if (featureList.empty()) return; StringTransformPair sp(signalURI, transform); if (m_openDenseFeatures.find(sp) == m_openDenseFeatures.end()) { StreamBuffer b(sptr, ""); m_openDenseFeatures[sp] = b; QString &str(m_openDenseFeatures[sp].second); QTextStream stream(&str); bool plain = (m_plain || !desc.haveDescription()); QString outputId = od.identifier.c_str(); unsigned long featureNumber = m_count++; // need to write out feature timeline map -- for this we need // the sample rate, window length and hop size from the // transform stream << "\n:feature_timeline_" << featureNumber << " a tl:DiscreteTimeLine .\n\n"; sv_samplerate_t sampleRate; int stepSize, blockSize; // If the output is FixedSampleRate, we need to draw the // sample rate and step size from the output descriptor; // otherwise they come from the transform if (od.sampleType == Plugin::OutputDescriptor::FixedSampleRate) { sampleRate = od.sampleRate; stepSize = 1; blockSize = 1; } else { sampleRate = transform.getSampleRate(); if (sampleRate == 0.f) { cerr << "RDFFeatureWriter: INTERNAL ERROR: writing dense features without having set the sample rate properly!" << endl; return; } stepSize = transform.getStepSize(); if (stepSize == 0) { cerr << "RDFFeatureWriter: INTERNAL ERROR: writing dense features without having set the step size properly!" << endl; return; } blockSize = transform.getBlockSize(); if (blockSize == 0) { cerr << "RDFFeatureWriter: INTERNAL ERROR: writing dense features without having set the block size properly!" << endl; return; } } stream << ":feature_timeline_map_" << featureNumber << " a tl:UniformSamplingWindowingMap ;\n" << " tl:rangeTimeLine :feature_timeline_" << featureNumber << " ;\n" << " tl:domainTimeLine " << timelineURI << " ;\n" << " tl:sampleRate \"" << sampleRate << "\"^^xsd:float ;\n" << " tl:windowLength \"" << blockSize << "\"^^xsd:int ;\n" << " tl:hopSize \"" << stepSize << "\"^^xsd:int .\n\n"; stream << signalURI << " af:signal_feature :feature_" << featureNumber << " ." << endl << endl; stream << ":feature_" << featureNumber << " a "; QString signalTypeURI = desc.getOutputSignalTypeURI(outputId); if (plain || signalTypeURI == "") { if (m_syntheticSignalTypeURIs.find(transform) != m_syntheticSignalTypeURIs.end()) { stream << m_syntheticSignalTypeURIs[transform] << " ;\n"; } else { stream << ":signal_type_" << outputId << " ;\n"; } } else { stream << "<" << signalTypeURI << "> ;\n"; } stream << " mo:time [" << "\n a tl:Interval ;" << "\n tl:onTimeLine :feature_timeline_" << featureNumber << " ;"; RealTime startrt = transform.getStartTime(); RealTime durationrt = transform.getDuration(); sv_frame_t start = RealTime::realTime2Frame (startrt, sampleRate) / stepSize; sv_frame_t duration = RealTime::realTime2Frame (durationrt, sampleRate) / stepSize; if (start != 0) { stream << "\n tl:start \"" << start << "\"^^xsd:int ;"; } if (duration != 0) { stream << "\n tl:duration \"" << duration << "\"^^xsd:int ;"; } stream << "\n ] ;\n"; if (transform.getIdentifier() != "") { stream << " vamp:computed_by " << m_transformURIs[transform] << " ;\n"; } if (od.hasFixedBinCount) { // We only know the height, so write the width as zero stream << " af:dimensions \"" << od.binCount << " 0\" ;\n"; } stream << " af:value \""; } QString &str = m_openDenseFeatures[sp].second; QTextStream stream(&str); for (int i = 0; i < (int)featureList.size(); ++i) { const Plugin::Feature &feature = featureList[i]; for (int j = 0; j < (int)feature.values.size(); ++j) { stream << feature.values[j] << " "; } } } void RDFFeatureWriter::finish() { // SVDEBUG << "RDFFeatureWriter::finish()" << endl; // close any open dense feature literals for (map::iterator i = m_openDenseFeatures.begin(); i != m_openDenseFeatures.end(); ++i) { // SVDEBUG << "closing a stream" << endl; StreamBuffer &b = i->second; *(b.first) << b.second << "\" ." << endl; } m_openDenseFeatures.clear(); m_startedStreamTransforms.clear(); FileFeatureWriter::finish(); } sonic-visualiser-3.0.3/svcore/rdf/RDFFeatureWriter.h0000644000000000000000000001172713111512442020515 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RDF_FEATURE_WRITER_H_ #define _RDF_FEATURE_WRITER_H_ #include #include #include #include #include "transform/FileFeatureWriter.h" #include "PluginRDFDescription.h" using std::string; using std::map; using std::set; using std::pair; class QTextStream; class QFile; class RDFFeatureWriter : public FileFeatureWriter { public: RDFFeatureWriter(); virtual ~RDFFeatureWriter(); virtual string getDescription() const; virtual ParameterList getSupportedParameters() const; virtual void setParameters(map ¶ms); virtual void setTrackMetadata(QString trackid, TrackMetadata metadata); virtual void write(QString trackid, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, const Vamp::Plugin::FeatureList &features, std::string summaryType = ""); virtual void setFixedEventTypeURI(QString uri); // something of a hack virtual void finish(); virtual QString getWriterTag() const { return "rdf"; } private: typedef map RDFDescriptionMap; // by plugin id RDFDescriptionMap m_rdfDescriptions; typedef map TrackMetadataMap; TrackMetadataMap m_metadata; bool haveTitleArtistMetadata(QString trackId) const { // Formerly in various places we used to test whether a track // appeared in the metadata map at all, in order to determine // whether it had any associated metadata. That won't work any // more because metadata now includes duration, which can // appear even if no title/artist are given and which is not // something whose presence indicates the involvement of a // "publication Track". So check for artist/title explicitly. auto mitr = m_metadata.find(trackId); if (mitr == m_metadata.end()) return false; return (mitr->second.title != "" || mitr->second.maker != ""); } QString m_fixedEventTypeURI; virtual void reviewFileForAppending(QString filename); void writePrefixes(QTextStream *); void writeSignalDescription(QTextStream *, QString); void writeLocalFeatureTypes(QTextStream *, const Transform &, const Vamp::Plugin::OutputDescriptor &, PluginRDFDescription &, std::string summaryType); void writeSparseRDF(QTextStream *stream, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, const Vamp::Plugin::FeatureList &features, PluginRDFDescription &desc, QString timelineURI); void writeTrackLevelRDF(QTextStream *stream, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, const Vamp::Plugin::FeatureList &features, PluginRDFDescription &desc, QString signalURI); void writeDenseRDF(QTextStream *stream, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, const Vamp::Plugin::FeatureList &features, PluginRDFDescription &desc, QString signalURI, QString timelineURI); set m_startedTrackIds; map > m_startedStreamTransforms; map m_trackTrackURIs; map m_trackTimelineURIs; map m_trackSignalURIs; map m_transformURIs; map m_syntheticEventTypeURIs; map m_syntheticSignalTypeURIs; typedef pair StringTransformPair; typedef pair StreamBuffer; map m_openDenseFeatures; // signal URI + transform -> stream + text QString m_userAudioFileUri; QString m_userTrackUri; QString m_userMakerUri; bool m_plain; bool m_network; bool m_networkRetrieved; long m_count; }; #endif sonic-visualiser-3.0.3/svcore/rdf/RDFImporter.cpp0000644000000000000000000007225613111512442020065 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008-2012 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RDFImporter.h" #include #include #include #include #include "base/ProgressReporter.h" #include "base/RealTime.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/EditableDenseThreeDimensionalModel.h" #include "data/model/NoteModel.h" #include "data/model/TextModel.h" #include "data/model/RegionModel.h" #include "data/model/ReadOnlyWaveFileModel.h" #include "data/fileio/FileSource.h" #include "data/fileio/CachedFile.h" #include "data/fileio/FileFinder.h" #include #include using Dataquay::Uri; using Dataquay::Node; using Dataquay::Nodes; using Dataquay::Triple; using Dataquay::Triples; using Dataquay::BasicStore; using Dataquay::PropertyObject; class RDFImporterImpl { public: RDFImporterImpl(QString url, sv_samplerate_t sampleRate); virtual ~RDFImporterImpl(); void setSampleRate(sv_samplerate_t sampleRate) { m_sampleRate = sampleRate; } bool isOK(); QString getErrorString() const; std::vector getDataModels(ProgressReporter *); protected: BasicStore *m_store; Uri expand(QString s) { return m_store->expand(s); } QString m_uristring; QString m_errorString; std::map m_audioModelMap; sv_samplerate_t m_sampleRate; std::map > m_labelValueMap; void getDataModelsAudio(std::vector &, ProgressReporter *); void getDataModelsSparse(std::vector &, ProgressReporter *); void getDataModelsDense(std::vector &, ProgressReporter *); void getDenseModelTitle(Model *, QString, QString); void getDenseFeatureProperties(QString featureUri, sv_samplerate_t &sampleRate, int &windowLength, int &hopSize, int &width, int &height); void fillModel(Model *, sv_frame_t, sv_frame_t, bool, std::vector &, QString); }; QString RDFImporter::getKnownExtensions() { return "*.rdf *.n3 *.ttl"; } RDFImporter::RDFImporter(QString url, sv_samplerate_t sampleRate) : m_d(new RDFImporterImpl(url, sampleRate)) { } RDFImporter::~RDFImporter() { delete m_d; } void RDFImporter::setSampleRate(sv_samplerate_t sampleRate) { m_d->setSampleRate(sampleRate); } bool RDFImporter::isOK() { return m_d->isOK(); } QString RDFImporter::getErrorString() const { return m_d->getErrorString(); } std::vector RDFImporter::getDataModels(ProgressReporter *r) { return m_d->getDataModels(r); } RDFImporterImpl::RDFImporterImpl(QString uri, sv_samplerate_t sampleRate) : m_store(new BasicStore), m_uristring(uri), m_sampleRate(sampleRate) { //!!! retrieve data if remote... then m_store->addPrefix("mo", Uri("http://purl.org/ontology/mo/")); m_store->addPrefix("af", Uri("http://purl.org/ontology/af/")); m_store->addPrefix("dc", Uri("http://purl.org/dc/elements/1.1/")); m_store->addPrefix("tl", Uri("http://purl.org/NET/c4dm/timeline.owl#")); m_store->addPrefix("event", Uri("http://purl.org/NET/c4dm/event.owl#")); m_store->addPrefix("rdfs", Uri("http://www.w3.org/2000/01/rdf-schema#")); try { QUrl url; if (uri.startsWith("file:")) { url = QUrl(uri); } else { url = QUrl::fromLocalFile(uri); } m_store->import(url, BasicStore::ImportIgnoreDuplicates); } catch (std::exception &e) { m_errorString = e.what(); } } RDFImporterImpl::~RDFImporterImpl() { delete m_store; } bool RDFImporterImpl::isOK() { return (m_errorString == ""); } QString RDFImporterImpl::getErrorString() const { return m_errorString; } std::vector RDFImporterImpl::getDataModels(ProgressReporter *reporter) { std::vector models; getDataModelsAudio(models, reporter); if (m_sampleRate == 0) { m_errorString = QString("Invalid audio data model (is audio file format supported?)"); cerr << m_errorString << endl; return models; } QString error; if (m_errorString != "") { error = m_errorString; } m_errorString = ""; getDataModelsDense(models, reporter); if (m_errorString != "") { error = m_errorString; } m_errorString = ""; getDataModelsSparse(models, reporter); if (m_errorString == "" && error != "") { m_errorString = error; } return models; } void RDFImporterImpl::getDataModelsAudio(std::vector &models, ProgressReporter *reporter) { Nodes sigs = m_store->match (Triple(Node(), Uri("a"), expand("mo:Signal"))).subjects(); foreach (Node sig, sigs) { Node file = m_store->complete(Triple(Node(), expand("mo:encodes"), sig)); if (file == Node()) { file = m_store->complete(Triple(sig, expand("mo:available_as"), Node())); } if (file == Node()) { cerr << "RDFImporterImpl::getDataModelsAudio: ERROR: No source for signal " << sig << endl; continue; } QString signal = sig.value; QString source = file.value; SVDEBUG << "NOTE: Seeking signal source \"" << source << "\"..." << endl; FileSource *fs = new FileSource(source, reporter); if (fs->isAvailable()) { SVDEBUG << "NOTE: Source is available: Local filename is \"" << fs->getLocalFilename() << "\"..." << endl; } #ifdef NO_SV_GUI if (!fs->isAvailable()) { m_errorString = QString("Signal source \"%1\" is not available").arg(source); delete fs; continue; } #else if (!fs->isAvailable()) { SVDEBUG << "NOTE: Signal source \"" << source << "\" is not available, using file finder..." << endl; FileFinder *ff = FileFinder::getInstance(); if (ff) { QString path = ff->find(FileFinder::AudioFile, fs->getLocation(), m_uristring); if (path != "") { cerr << "File finder returns: \"" << path << "\"" << endl; delete fs; fs = new FileSource(path, reporter); if (!fs->isAvailable()) { delete fs; m_errorString = QString("Signal source \"%1\" is not available").arg(source); continue; } } } } #endif if (reporter) { reporter->setMessage(RDFImporter::tr("Importing audio referenced in RDF...")); } fs->waitForData(); ReadOnlyWaveFileModel *newModel = new ReadOnlyWaveFileModel(*fs, m_sampleRate); if (newModel->isOK()) { cerr << "Successfully created wave file model from source at \"" << source << "\"" << endl; models.push_back(newModel); m_audioModelMap[signal] = newModel; if (m_sampleRate == 0) { m_sampleRate = newModel->getSampleRate(); } } else { m_errorString = QString("Failed to create wave file model from source at \"%1\"").arg(source); delete newModel; } delete fs; } } void RDFImporterImpl::getDataModelsDense(std::vector &models, ProgressReporter *reporter) { if (reporter) { reporter->setMessage(RDFImporter::tr("Importing dense signal data from RDF...")); } Nodes sigFeatures = m_store->match (Triple(Node(), expand("af:signal_feature"), Node())).objects(); foreach (Node sf, sigFeatures) { if (sf.type != Node::URI && sf.type != Node::Blank) continue; Node t = m_store->complete(Triple(sf, expand("a"), Node())); Node v = m_store->complete(Triple(sf, expand("af:value"), Node())); QString feature = sf.value; QString type = t.value; QString value = v.value; if (type == "" || value == "") continue; sv_samplerate_t sampleRate = 0; int windowLength = 0; int hopSize = 0; int width = 0; int height = 0; getDenseFeatureProperties (feature, sampleRate, windowLength, hopSize, width, height); if (sampleRate != 0 && sampleRate != m_sampleRate) { cerr << "WARNING: Sample rate in dense feature description does not match our underlying rate -- using rate from feature description" << endl; } if (sampleRate == 0) sampleRate = m_sampleRate; if (hopSize == 0) { cerr << "WARNING: Dense feature description does not specify a hop size -- assuming 1" << endl; hopSize = 1; } if (height == 0) { cerr << "WARNING: Dense feature description does not specify feature signal dimensions -- assuming one-dimensional (height = 1)" << endl; height = 1; } QStringList values = value.split(' ', QString::SkipEmptyParts); if (values.empty()) { cerr << "WARNING: Dense feature description does not specify any values!" << endl; continue; } if (height == 1) { SparseTimeValueModel *m = new SparseTimeValueModel (sampleRate, hopSize, false); for (int j = 0; j < values.size(); ++j) { float f = values[j].toFloat(); SparseTimeValueModel::Point point(j * hopSize, f, ""); m->addPoint(point); } getDenseModelTitle(m, feature, type); m->setRDFTypeURI(type); models.push_back(m); } else { EditableDenseThreeDimensionalModel *m = new EditableDenseThreeDimensionalModel (sampleRate, hopSize, height, EditableDenseThreeDimensionalModel::NoCompression, false); EditableDenseThreeDimensionalModel::Column column; int x = 0; for (int j = 0; j < values.size(); ++j) { if (j % height == 0 && !column.empty()) { m->setColumn(x++, column); column.clear(); } column.push_back(values[j].toFloat()); } if (!column.empty()) { m->setColumn(x++, column); } getDenseModelTitle(m, feature, type); m->setRDFTypeURI(type); models.push_back(m); } } } void RDFImporterImpl::getDenseModelTitle(Model *m, QString featureUri, QString featureTypeUri) { Node n = m_store->complete (Triple(Uri(featureUri), expand("dc:title"), Node())); if (n.type == Node::Literal && n.value != "") { SVDEBUG << "RDFImporterImpl::getDenseModelTitle: Title (from signal) \"" << n.value << "\"" << endl; m->setObjectName(n.value); return; } n = m_store->complete (Triple(Uri(featureTypeUri), expand("dc:title"), Node())); if (n.type == Node::Literal && n.value != "") { SVDEBUG << "RDFImporterImpl::getDenseModelTitle: Title (from signal type) \"" << n.value << "\"" << endl; m->setObjectName(n.value); return; } SVDEBUG << "RDFImporterImpl::getDenseModelTitle: No title available for feature <" << featureUri << ">" << endl; } void RDFImporterImpl::getDenseFeatureProperties(QString featureUri, sv_samplerate_t &sampleRate, int &windowLength, int &hopSize, int &width, int &height) { Node dim = m_store->complete (Triple(Uri(featureUri), expand("af:dimensions"), Node())); cerr << "Dimensions = \"" << dim.value << "\"" << endl; if (dim.type == Node::Literal && dim.value != "") { QStringList dl = dim.value.split(" "); if (dl.empty()) dl.push_back(dim.value); if (dl.size() > 0) height = dl[0].toInt(); if (dl.size() > 1) width = dl[1].toInt(); } // Looking for rate, hop, window from: // // ?feature mo:time ?time . // ?time a tl:Interval . // ?time tl:onTimeLine ?timeline . // ?map tl:rangeTimeLine ?timeline . // ?map tl:sampleRate ?rate . // ?map tl:hopSize ?hop . // ?map tl:windowLength ?window . Node interval = m_store->complete(Triple(Uri(featureUri), expand("mo:time"), Node())); if (!m_store->contains(Triple(interval, expand("a"), expand("tl:Interval")))) { cerr << "RDFImporterImpl::getDenseFeatureProperties: Feature time node " << interval << " is not a tl:Interval" << endl; return; } Node tl = m_store->complete(Triple(interval, expand("tl:onTimeLine"), Node())); if (tl == Node()) { cerr << "RDFImporterImpl::getDenseFeatureProperties: Interval node " << interval << " lacks tl:onTimeLine property" << endl; return; } Node map = m_store->complete(Triple(Node(), expand("tl:rangeTimeLine"), tl)); if (map == Node()) { cerr << "RDFImporterImpl::getDenseFeatureProperties: No map for " << "timeline node " << tl << endl; } PropertyObject po(m_store, "tl:", map); if (po.hasProperty("sampleRate")) { sampleRate = po.getProperty("sampleRate").toDouble(); } if (po.hasProperty("hopSize")) { hopSize = po.getProperty("hopSize").toInt(); } if (po.hasProperty("windowLength")) { windowLength = po.getProperty("windowLength").toInt(); } cerr << "sr = " << sampleRate << ", hop = " << hopSize << ", win = " << windowLength << endl; } void RDFImporterImpl::getDataModelsSparse(std::vector &models, ProgressReporter *reporter) { if (reporter) { reporter->setMessage(RDFImporter::tr("Importing event data from RDF...")); } /* This function is only used for sparse data (for dense data we would be in getDataModelsDense instead). Our query is intended to retrieve every thing that has a time, and every feature type and value associated with a thing that has a time. We will then need to refine this big bag of results into a set of data models. Results that have different source signals should go into different models. Results that have different feature types should go into different models. */ Nodes sigs = m_store->match (Triple(Node(), expand("a"), expand("mo:Signal"))).subjects(); // Map from timeline uri to event type to dimensionality to // presence of duration to model ptr. Whee! std::map > > > modelMap; foreach (Node sig, sigs) { Node interval = m_store->complete(Triple(sig, expand("mo:time"), Node())); if (interval == Node()) continue; Node tl = m_store->complete(Triple(interval, expand("tl:onTimeLine"), Node())); if (tl == Node()) continue; Nodes times = m_store->match(Triple(Node(), expand("tl:onTimeLine"), tl)).subjects(); foreach (Node tn, times) { Nodes timedThings = m_store->match(Triple(Node(), expand("event:time"), tn)).subjects(); foreach (Node thing, timedThings) { Node typ = m_store->complete(Triple(thing, expand("a"), Node())); if (typ == Node()) continue; Node valu = m_store->complete(Triple(thing, expand("af:feature"), Node())); QString source = sig.value; QString timeline = tl.value; QString type = typ.value; QString thinguri = thing.value; /* For sparse data, the determining factors in deciding what model to use are: Do the features have values? and Do the features have duration? We can run through the results and check off whether we find values and duration for each of the source+type keys, and then run through the source+type keys pushing each of the results into a suitable model. Unfortunately, at this point we do not yet have any actual timing data (time/duration) -- just the time URI. What we _could_ do is to create one of each type of model at the start, for each of the source+type keys, and then push each feature into the relevant model depending on what we find out about it. Then return only non-empty models. */ QString label = ""; bool text = (type.contains("Text") || type.contains("text")); // Ha, ha bool note = (type.contains("Note") || type.contains("note")); // Guffaw if (text) { label = m_store->complete(Triple(thing, expand("af:text"), Node())).value; } if (label == "") { label = m_store->complete(Triple(thing, expand("rdfs:label"), Node())).value; } RealTime time; RealTime duration; // bool haveTime = false; bool haveDuration = false; Node at = m_store->complete(Triple(tn, expand("tl:at"), Node())); if (at != Node()) { time = RealTime::fromXsdDuration(at.value.toStdString()); // haveTime = true; } else { //!!! NB we're using rather old terminology for these things, apparently: // beginsAt -> start // onTimeLine -> timeline Node start = m_store->complete(Triple(tn, expand("tl:beginsAt"), Node())); Node dur = m_store->complete(Triple(tn, expand("tl:duration"), Node())); if (start != Node() && dur != Node()) { time = RealTime::fromXsdDuration (start.value.toStdString()); duration = RealTime::fromXsdDuration (dur.value.toStdString()); // haveTime = haveDuration = true; } } QString valuestring = valu.value; std::vector values; if (valuestring != "") { QStringList vsl = valuestring.split(" ", QString::SkipEmptyParts); for (int j = 0; j < vsl.size(); ++j) { bool success = false; float v = vsl[j].toFloat(&success); if (success) values.push_back(v); } } int dimensions = 1; if (values.size() == 1) dimensions = 2; else if (values.size() > 1) dimensions = 3; Model *model = 0; if (modelMap[timeline][type][dimensions].find(haveDuration) == modelMap[timeline][type][dimensions].end()) { /* SVDEBUG << "Creating new model: source = " << source << ", type = " << type << ", dimensions = " << dimensions << ", haveDuration = " << haveDuration << ", time = " << time << ", duration = " << duration << endl; */ if (!haveDuration) { if (dimensions == 1) { if (text) { model = new TextModel(m_sampleRate, 1, false); } else { model = new SparseOneDimensionalModel(m_sampleRate, 1, false); } } else if (dimensions == 2) { if (text) { model = new TextModel(m_sampleRate, 1, false); } else { model = new SparseTimeValueModel(m_sampleRate, 1, false); } } else { // We don't have a three-dimensional sparse model, // so use a note model. We do have some logic (in // extractStructure below) for guessing whether // this should after all have been a dense model, // but it's hard to apply it because we don't have // all the necessary timing data yet... hmm model = new NoteModel(m_sampleRate, 1, false); } } else { // haveDuration if (note || (dimensions > 2)) { model = new NoteModel(m_sampleRate, 1, false); } else { // If our units are frequency or midi pitch, we // should be using a note model... hm model = new RegionModel(m_sampleRate, 1, false); } } model->setRDFTypeURI(type); if (m_audioModelMap.find(source) != m_audioModelMap.end()) { cerr << "source model for " << model << " is " << m_audioModelMap[source] << endl; model->setSourceModel(m_audioModelMap[source]); } QString title = m_store->complete (Triple(typ, expand("dc:title"), Node())).value; if (title == "") { // take it from the end of the event type title = type; title.replace(QRegExp("^.*[/#]"), ""); } model->setObjectName(title); modelMap[timeline][type][dimensions][haveDuration] = model; models.push_back(model); } model = modelMap[timeline][type][dimensions][haveDuration]; if (model) { sv_frame_t ftime = RealTime::realTime2Frame(time, m_sampleRate); sv_frame_t fduration = RealTime::realTime2Frame(duration, m_sampleRate); fillModel(model, ftime, fduration, haveDuration, values, label); } } } } } void RDFImporterImpl::fillModel(Model *model, sv_frame_t ftime, sv_frame_t fduration, bool haveDuration, std::vector &values, QString label) { // SVDEBUG << "RDFImporterImpl::fillModel: adding point at frame " << ftime << endl; SparseOneDimensionalModel *sodm = dynamic_cast(model); if (sodm) { SparseOneDimensionalModel::Point point(ftime, label); sodm->addPoint(point); return; } TextModel *tm = dynamic_cast(model); if (tm) { TextModel::Point point (ftime, values.empty() ? 0.5f : values[0] < 0.f ? 0.f : values[0] > 1.f ? 1.f : values[0], // I was young and feckless once too label); tm->addPoint(point); return; } SparseTimeValueModel *stvm = dynamic_cast(model); if (stvm) { SparseTimeValueModel::Point point (ftime, values.empty() ? 0.f : values[0], label); stvm->addPoint(point); return; } NoteModel *nm = dynamic_cast(model); if (nm) { if (haveDuration) { float value = 0.f, level = 1.f; if (!values.empty()) { value = values[0]; if (values.size() > 1) { level = values[1]; } } NoteModel::Point point(ftime, value, fduration, level, label); nm->addPoint(point); } else { float value = 0.f, duration = 1.f, level = 1.f; if (!values.empty()) { value = values[0]; if (values.size() > 1) { duration = values[1]; if (values.size() > 2) { level = values[2]; } } } NoteModel::Point point(ftime, value, sv_frame_t(lrintf(duration)), level, label); nm->addPoint(point); } return; } RegionModel *rm = dynamic_cast(model); if (rm) { float value = 0.f; if (values.empty()) { // no values? map each unique label to a distinct value if (m_labelValueMap[model].find(label) == m_labelValueMap[model].end()) { m_labelValueMap[model][label] = rm->getValueMaximum() + 1.f; } value = m_labelValueMap[model][label]; } else { value = values[0]; } if (haveDuration) { RegionModel::Point point(ftime, value, fduration, label); rm->addPoint(point); } else { // This won't actually happen -- we only create region models // if we do have duration -- but just for completeness float duration = 1.f; if (!values.empty()) { value = values[0]; if (values.size() > 1) { duration = values[1]; } } RegionModel::Point point(ftime, value, sv_frame_t(lrintf(duration)), label); rm->addPoint(point); } return; } cerr << "WARNING: RDFImporterImpl::fillModel: Unknown or unexpected model type" << endl; return; } RDFImporter::RDFDocumentType RDFImporter::identifyDocumentType(QString url) { bool haveAudio = false; bool haveAnnotations = false; bool haveRDF = false; BasicStore *store = 0; // This is not expected to return anything useful, but if it does // anything at all then we know we have RDF try { //!!! non-local document? store = BasicStore::load(QUrl(url)); Triple t = store->matchOnce(Triple()); if (t != Triple()) haveRDF = true; } catch (std::exception &e) { // nothing; haveRDF will be false so the next bit catches it } if (!haveRDF) { delete store; return NotRDF; } store->addPrefix("mo", Uri("http://purl.org/ontology/mo/")); store->addPrefix("event", Uri("http://purl.org/NET/c4dm/event.owl#")); store->addPrefix("af", Uri("http://purl.org/ontology/af/")); // "MO-conformant" structure for audio files Node n = store->complete(Triple(Node(), Uri("a"), store->expand("mo:AudioFile"))); if (n != Node() && n.type == Node::URI) { haveAudio = true; } else { // Sonic Annotator v0.2 and below used to write this structure // (which is not properly in conformance with the Music // Ontology) Nodes sigs = store->match(Triple(Node(), Uri("a"), store->expand("mo:Signal"))).subjects(); foreach (Node sig, sigs) { Node aa = store->complete(Triple(sig, store->expand("mo:available_as"), Node())); if (aa != Node()) { haveAudio = true; break; } } } SVDEBUG << "NOTE: RDFImporter::identifyDocumentType: haveAudio = " << haveAudio << endl; // can't call complete() with two Nothing nodes n = store->matchOnce(Triple(Node(), store->expand("event:time"), Node())).c; if (n != Node()) { haveAnnotations = true; } if (!haveAnnotations) { // can't call complete() with two Nothing nodes n = store->matchOnce(Triple(Node(), store->expand("af:signal_feature"), Node())).c; if (n != Node()) { haveAnnotations = true; } } SVDEBUG << "NOTE: RDFImporter::identifyDocumentType: haveAnnotations = " << haveAnnotations << endl; delete store; if (haveAudio) { if (haveAnnotations) { return AudioRefAndAnnotations; } else { return AudioRef; } } else { if (haveAnnotations) { return Annotations; } else { return OtherRDFDocument; } } return OtherRDFDocument; } sonic-visualiser-3.0.3/svcore/rdf/RDFImporter.h0000644000000000000000000000307313111512442017521 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RDF_IMPORTER_H_ #define _RDF_IMPORTER_H_ #include #include #include #include "base/BaseTypes.h" class Model; class RDFImporterImpl; class ProgressReporter; class RDFImporter : public QObject { Q_OBJECT public: /** * Return the file extensions that we have data file readers for, * in a format suitable for use with QFileDialog. For example, * "*.rdf *.n3". */ static QString getKnownExtensions(); RDFImporter(QString url, sv_samplerate_t sampleRate = 0); virtual ~RDFImporter(); void setSampleRate(sv_samplerate_t sampleRate); bool isOK(); QString getErrorString() const; std::vector getDataModels(ProgressReporter *reporter); enum RDFDocumentType { AudioRefAndAnnotations, Annotations, AudioRef, OtherRDFDocument, NotRDF }; static RDFDocumentType identifyDocumentType(QString url); protected: RDFImporterImpl *m_d; }; #endif sonic-visualiser-3.0.3/svcore/rdf/RDFTransformFactory.cpp0000644000000000000000000003567413111512442021572 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008-2012 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RDFTransformFactory.h" #include #include #include #include #include #include #include "PluginRDFIndexer.h" #include "PluginRDFDescription.h" #include "base/ProgressReporter.h" #include "plugin/PluginIdentifier.h" #include "transform/TransformFactory.h" #include #include using Dataquay::Uri; using Dataquay::Node; using Dataquay::Nodes; using Dataquay::Triple; using Dataquay::Triples; using Dataquay::BasicStore; using Dataquay::PropertyObject; class RDFTransformFactoryImpl { public: RDFTransformFactoryImpl(QString url); virtual ~RDFTransformFactoryImpl(); bool isRDF(); bool isOK(); QString getErrorString() const; std::vector getTransforms(ProgressReporter *); static QString writeTransformToRDF(const Transform &, QString); protected: BasicStore *m_store; QString m_urlString; QString m_errorString; bool m_isRDF; bool setOutput(Transform &, QString); bool setParameters(Transform &, QString); }; QString RDFTransformFactory::getKnownExtensions() { return "*.rdf *.n3 *.ttl"; } RDFTransformFactory::RDFTransformFactory(QString url) : m_d(new RDFTransformFactoryImpl(url)) { } RDFTransformFactory::~RDFTransformFactory() { delete m_d; } bool RDFTransformFactory::isRDF() { return m_d->isRDF(); } bool RDFTransformFactory::isOK() { return m_d->isOK(); } QString RDFTransformFactory::getErrorString() const { return m_d->getErrorString(); } std::vector RDFTransformFactory::getTransforms(ProgressReporter *r) { return m_d->getTransforms(r); } QString RDFTransformFactory::writeTransformToRDF(const Transform &t, QString f) { return RDFTransformFactoryImpl::writeTransformToRDF(t, f); } RDFTransformFactoryImpl::RDFTransformFactoryImpl(QString url) : m_store(new BasicStore), m_urlString(url), m_isRDF(false) { //!!! retrieve data if remote... then m_store->addPrefix("vamp", Uri("http://purl.org/ontology/vamp/")); try { QUrl qurl; if (url.startsWith("file:")) { qurl = QUrl(url); } else { qurl = QUrl::fromLocalFile(url); } m_store->import(qurl, BasicStore::ImportIgnoreDuplicates); m_isRDF = true; } catch (const std::exception &e) { // The file is not RDF -- we report this by returning false // from isRDF (because we have not reached the m_isRDF = true // line above), but we also set the error string m_errorString = e.what(); } } RDFTransformFactoryImpl::~RDFTransformFactoryImpl() { delete m_store; } bool RDFTransformFactoryImpl::isRDF() { return m_isRDF; } bool RDFTransformFactoryImpl::isOK() { return m_isRDF && (m_errorString == ""); } QString RDFTransformFactoryImpl::getErrorString() const { return m_errorString; } std::vector RDFTransformFactoryImpl::getTransforms(ProgressReporter *) { std::vector transforms; if (!m_isRDF) return transforms; std::map uriTransformMap; Nodes tnodes = m_store->match (Triple(Node(), Uri("a"), m_store->expand("vamp:Transform"))).subjects(); PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); foreach (Node tnode, tnodes) { Node pnode = m_store->complete (Triple(tnode, m_store->expand("vamp:plugin"), Node())); if (pnode == Node()) { cerr << "RDFTransformFactory: WARNING: No vamp:plugin for " << "vamp:Transform node " << tnode << ", skipping this transform" << endl; continue; } QString transformUri = tnode.value; QString pluginUri = pnode.value; QString pluginId = indexer->getIdForPluginURI(pluginUri); if (pluginId == "") { cerr << "RDFTransformFactory: WARNING: Unknown plugin <" << pluginUri << "> for transform <" << transformUri << ">, skipping this transform" << endl; continue; } Transform transform; transform.setPluginIdentifier(pluginId); if (!setOutput(transform, transformUri)) { return transforms; } if (!setParameters(transform, transformUri)) { return transforms; } uriTransformMap[transformUri] = transform; static const char *optionals[] = { "program", "summary_type", "step_size", "block_size", "window_type", "sample_rate", "start", "duration", "plugin_version" }; for (int j = 0; j < int(sizeof(optionals)/sizeof(optionals[0])); ++j) { QString optional = optionals[j]; Node onode = m_store->complete (Triple(Uri(transformUri), m_store->expand(QString("vamp:") + optional), Node())); if (onode.type != Node::Literal) continue; if (optional == "program") { transform.setProgram(onode.value); } else if (optional == "summary_type") { transform.setSummaryType (transform.stringToSummaryType(onode.value)); } else if (optional == "step_size") { transform.setStepSize(onode.value.toUInt()); } else if (optional == "block_size") { transform.setBlockSize(onode.value.toUInt()); } else if (optional == "window_type") { transform.setWindowType (Window::getTypeForName (onode.value.toLower().toStdString())); } else if (optional == "sample_rate") { transform.setSampleRate(onode.value.toFloat()); } else if (optional == "start") { RealTime start = RealTime::fromXsdDuration(onode.value.toStdString()); transform.setStartTime(start); } else if (optional == "duration") { RealTime duration = RealTime::fromXsdDuration(onode.value.toStdString()); transform.setDuration(duration); if (duration == RealTime::zeroTime) { cerr << "\nRDFTransformFactory: WARNING: Duration is specified as \"" << onode.value << "\" in RDF file,\n but this evaluates to zero when parsed as an xsd:duration datatype.\n The duration property will therefore be ignored.\n To specify start time and duration use the xsd:duration format,\n for example \"PT2.5S\"^^xsd:duration (for 2.5 seconds).\n\n"; } } else if (optional == "plugin_version") { transform.setPluginVersion(onode.value); } else { cerr << "RDFTransformFactory: ERROR: Inconsistent optionals lists (unexpected optional \"" << optional << "\"" << endl; } } cerr << "RDFTransformFactory: NOTE: Transform is: " << endl; cerr << transform.toXmlString() << endl; transforms.push_back(transform); } return transforms; } bool RDFTransformFactoryImpl::setOutput(Transform &transform, QString transformUri) { Node outputNode = m_store->complete (Triple(Uri(transformUri), m_store->expand("vamp:output"), Node())); if (outputNode == Node()) return true; if (outputNode.type != Node::URI && outputNode.type != Node::Blank) { m_errorString = QString("vamp:output for output of transform <%1> is not a URI or blank node").arg(transformUri); return false; } // Now, outputNode might be the subject of a triple within m_store // that tells us the vamp:identifier, or it might be the subject // of a triple within the indexer that tells us it Node identNode = m_store->complete (Triple(outputNode, m_store->expand("vamp:identifier"), Node())); if (identNode == Node()) { PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); const BasicStore *index = indexer->getIndex(); identNode = index->complete (Triple(outputNode, index->expand("vamp:identifier"), Node())); } if (identNode == Node() || identNode.type != Node::Literal) { m_errorString = QString("No vamp:identifier found for output of transform <%1>, or vamp:identifier is not a literal").arg(transformUri); return false; } transform.setOutput(identNode.value); return true; } bool RDFTransformFactoryImpl::setParameters(Transform &transform, QString transformUri) { Nodes bindings = m_store->match (Triple(Uri(transformUri), m_store->expand("vamp:parameter_binding"), Node())).objects(); foreach (Node binding, bindings) { Node paramNode = m_store->complete (Triple(binding, m_store->expand("vamp:parameter"), Node())); if (paramNode == Node()) { cerr << "RDFTransformFactoryImpl::setParameters: No vamp:parameter for binding " << binding << endl; continue; } Node valueNode = m_store->complete (Triple(binding, m_store->expand("vamp:value"), Node())); if (paramNode == Node()) { cerr << "RDFTransformFactoryImpl::setParameters: No vamp:value for binding " << binding << endl; continue; } // As with output above, paramNode might be the subject of a // triple within m_store that tells us the vamp:identifier, or // it might be the subject of a triple within the indexer that // tells us it Node idNode = m_store->complete (Triple(paramNode, m_store->expand("vamp:identifier"), Node())); if (idNode == Node()) { PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); const BasicStore *index = indexer->getIndex(); idNode = index->complete (Triple(paramNode, index->expand("vamp:identifier"), Node())); } if (idNode == Node() || idNode.type != Node::Literal) { cerr << "RDFTransformFactoryImpl::setParameters: No vamp:identifier for parameter " << paramNode << endl; continue; } transform.setParameter(idNode.value, valueNode.value.toFloat()); } return true; } QString RDFTransformFactoryImpl::writeTransformToRDF(const Transform &transform, QString uri) { QString str; QTextStream s(&str); // assumes the usual prefixes are available; requires that uri be // a local fragment (e.g. ":transform") rather than a uri enclosed // in <>, so that we can suffix it if need be QString pluginId = transform.getPluginIdentifier(); QString pluginUri = PluginRDFIndexer::getInstance()->getURIForPluginId(pluginId); if (pluginUri != "") { s << uri << " a vamp:Transform ;" << endl; s << " vamp:plugin <" << QUrl(pluginUri).toEncoded().data() << "> ;" << endl; } else { cerr << "WARNING: RDFTransformFactory::writeTransformToRDF: No plugin URI available for plugin id \"" << pluginId << "\", writing synthetic plugin and library resources" << endl; QString type, soname, label; PluginIdentifier::parseIdentifier(pluginId, type, soname, label); s << uri << "_plugin a vamp:Plugin ;" << endl; s << " vamp:identifier \"" << label << "\" .\n" << endl; s << uri << "_library a vamp:PluginLibrary ;" << endl; s << " vamp:identifier \"" << soname << "\" ;" << endl; s << " vamp:available_plugin " << uri << "_plugin .\n" << endl; s << uri << " a vamp:Transform ;" << endl; s << " vamp:plugin " << uri << "_plugin ;" << endl; } PluginRDFDescription description(pluginId); QString outputId = transform.getOutput(); QString outputUri = description.getOutputUri(outputId); if (transform.getOutput() != "" && outputUri == "") { cerr << "WARNING: RDFTransformFactory::writeTransformToRDF: No output URI available for transform output id \"" << transform.getOutput() << "\", writing a synthetic output resource" << endl; } if (transform.getStepSize() != 0) { s << " vamp:step_size \"" << transform.getStepSize() << "\"^^xsd:int ; " << endl; } if (transform.getBlockSize() != 0) { s << " vamp:block_size \"" << transform.getBlockSize() << "\"^^xsd:int ; " << endl; } if (transform.getWindowType() != HanningWindow) { s << " vamp:window_type \"" << Window::getNameForType(transform.getWindowType()).c_str() << "\" ; " << endl; } if (transform.getStartTime() != RealTime::zeroTime) { s << " vamp:start \"" << transform.getStartTime().toXsdDuration().c_str() << "\"^^xsd:duration ; " << endl; } if (transform.getDuration() != RealTime::zeroTime) { s << " vamp:duration \"" << transform.getDuration().toXsdDuration().c_str() << "\"^^xsd:duration ; " << endl; } if (transform.getSampleRate() != 0) { s << " vamp:sample_rate \"" << transform.getSampleRate() << "\"^^xsd:float ; " << endl; } if (transform.getPluginVersion() != "") { s << " vamp:plugin_version \"\"\"" << transform.getPluginVersion() << "\"\"\" ; " << endl; } QString program = transform.getProgram(); if (program != "") { s << " vamp:program \"\"\"" << program << "\"\"\" ;" << endl; } QString summary = transform.summaryTypeToString(transform.getSummaryType()); if (summary != "") { s << " vamp:summary_type \"" << summary << "\" ;" << endl; } Transform::ParameterMap parameters = transform.getParameters(); for (Transform::ParameterMap::const_iterator i = parameters.begin(); i != parameters.end(); ++i) { QString name = i->first; float value = i->second; s << " vamp:parameter_binding [" << endl; s << " vamp:parameter [ vamp:identifier \"" << name << "\" ] ;" << endl; s << " vamp:value \"" << value << "\"^^xsd:float ;" << endl; s << " ] ;" << endl; } if (outputUri != "") { s << " vamp:output <" << QUrl(outputUri).toEncoded().data() << "> ." << endl; } else if (outputId != "") { s << " vamp:output [ vamp:identifier \"" << outputId << "\" ] ." << endl; } else { s << " ." << endl; } return str; } sonic-visualiser-3.0.3/svcore/rdf/RDFTransformFactory.h0000644000000000000000000000406213111512442021222 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RDF_TRANSFORM_FACTORY_H_ #define _RDF_TRANSFORM_FACTORY_H_ #include #include #include #include "transform/Transform.h" class RDFTransformFactoryImpl; class ProgressReporter; class RDFTransformFactory : public QObject { Q_OBJECT public: static QString getKnownExtensions(); RDFTransformFactory(QString url); virtual ~RDFTransformFactory(); /** isRDF() may be queried at any point after construction. It returns true if the file was parseable as RDF. */ bool isRDF(); /** isOK() may be queried at any point after getTransforms() has been called. It is true if the file was parseable as RDF and any transforms in it could be completely constructed. Note that even if isOK() returns true, it is still possible that the file did not define any transforms; in this case, getTransforms() would have returned an empty list. If isOK() is called before getTransforms() has been invoked to query the file, it will return true iff isRDF() is true. */ bool isOK(); /** Return any error string resulting from loading or querying the file. This will be non-empty if isRDF() or isOK() returns false. */ QString getErrorString() const; std::vector getTransforms(ProgressReporter *reporter); static QString writeTransformToRDF(const Transform &, QString uri); protected: RDFTransformFactoryImpl *m_d; }; #endif sonic-visualiser-3.0.3/svcore/svcore.pro0000644000000000000000000000137713111512442016470 0ustar 00000000000000 TEMPLATE = lib INCLUDEPATH += ../vamp-plugin-sdk exists(config.pri) { include(config.pri) } CONFIG += staticlib qt thread warn_on stl rtti exceptions c++11 QT += network xml QT -= gui TARGET = svcore DEPENDPATH += . data plugin plugin/api/alsa ../dataquay ../checker ../piper-cpp INCLUDEPATH += . data plugin plugin/api/alsa ../dataquay ../checker ../piper-cpp OBJECTS_DIR = o MOC_DIR = o # Doesn't work with this library, which contains C99 as well as C++ PRECOMPILED_HEADER = # Set up suitable platform defines for RtMidi linux*: DEFINES += __LINUX_ALSASEQ__ macx*: DEFINES += __MACOSX_CORE__ win*: DEFINES += __WINDOWS_MM__ solaris*: DEFINES += __RTMIDI_DUMMY_ONLY__ include(files.pri) HEADERS = $$SVCORE_HEADERS SOURCES = $$SVCORE_SOURCES sonic-visualiser-3.0.3/svcore/system/Init.cpp0000644000000000000000000000313713111512442017374 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include #include #ifdef Q_OS_WIN32 #include // required for SetDllDirectory #define _WIN32_WINNT 0x0502 #include // Set default file open mode to binary //#undef _fmode //int _fmode = _O_BINARY; void redirectStderr() { #ifdef NO_PROBABLY_NOT HANDLE stderrHandle = GetStdHandle(STD_ERROR_HANDLE); if (!stderrHandle) return; AllocConsole(); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(stderrHandle, &info); info.dwSize.Y = 1000; SetConsoleScreenBufferSize(stderrHandle, info.dwSize); int h = _open_osfhandle((long)stderrHandle, _O_TEXT); if (h) { FILE *fd = _fdopen(h, "w"); if (fd) { *stderr = *fd; setvbuf(stderr, NULL, _IONBF, 0); } } #endif } #endif extern void svSystemSpecificInitialisation() { #ifdef Q_OS_WIN32 redirectStderr(); // Remove the CWD from the DLL search path, just in case SetDllDirectory(L""); putenv("PATH="); #else #endif } sonic-visualiser-3.0.3/svcore/system/Init.h0000644000000000000000000000131113111512442017031 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SV_SYSTEM_INIT_H_ #define _SV_SYSTEM_INIT_H_ extern void svSystemSpecificInitialisation(); #endif sonic-visualiser-3.0.3/svcore/system/System.cpp0000644000000000000000000001721513111512442017757 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "System.h" #include #include #include #ifndef _WIN32 #include #include #include #include #endif #ifdef __APPLE__ #include #include #endif #include #include #include #ifdef __APPLE__ extern "C" { void * rpl_realloc (void *p, size_t n) { p = realloc(p, n); if (p == 0 && n == 0) { p = malloc(0); } return p; } } #endif #ifdef _WIN32 extern "C" { #ifdef _MSC_VER void usleep(unsigned long usec) { ::Sleep(usec / 1000); } #endif int gettimeofday(struct timeval *tv, void *tz) { union { long long ns100; FILETIME ft; } now; ::GetSystemTimeAsFileTime(&now.ft); tv->tv_usec = (long)((now.ns100 / 10LL) % 1000000LL); tv->tv_sec = (long)((now.ns100 - 116444736000000000LL) / 10000000LL); return 0; } } #endif ProcessStatus GetProcessStatus(int pid) { #ifdef _WIN32 HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (!handle) { return ProcessNotRunning; } else { CloseHandle(handle); return ProcessRunning; } #else if (kill(getpid(), 0) == 0) { if (kill(pid, 0) == 0) { return ProcessRunning; } else { return ProcessNotRunning; } } else { return UnknownProcessStatus; } #endif } #ifdef _WIN32 /* MEMORYSTATUSEX is missing from older Windows headers, so define a local replacement. This trick from MinGW source code. Ugh */ typedef struct { DWORD dwLength; DWORD dwMemoryLoad; DWORDLONG ullTotalPhys; DWORDLONG ullAvailPhys; DWORDLONG ullTotalPageFile; DWORDLONG ullAvailPageFile; DWORDLONG ullTotalVirtual; DWORDLONG ullAvailVirtual; DWORDLONG ullAvailExtendedVirtual; } lMEMORYSTATUSEX; typedef BOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); #endif void GetRealMemoryMBAvailable(ssize_t &available, ssize_t &total) { available = -1; total = -1; #ifdef _WIN32 static bool checked = false; static bool exFound = false; static PFN_MS_EX ex; if (!checked) { HMODULE h = GetModuleHandleA("kernel32.dll"); if (h) { if ((ex = (PFN_MS_EX)GetProcAddress(h, "GlobalMemoryStatusEx"))) { exFound = true; } } checked = true; } DWORDLONG wavail = 0; DWORDLONG wtotal = 0; if (exFound) { lMEMORYSTATUSEX lms; lms.dwLength = sizeof(lms); if (!ex(&lms)) { cerr << "WARNING: GlobalMemoryStatusEx failed: error code " << GetLastError() << endl; return; } wavail = lms.ullAvailPhys; wtotal = lms.ullTotalPhys; } else { /* Fall back to GlobalMemoryStatus which is always available. but returns wrong results for physical memory > 4GB */ MEMORYSTATUS ms; GlobalMemoryStatus(&ms); wavail = ms.dwAvailPhys; wtotal = ms.dwTotalPhys; } DWORDLONG size = wavail / 1048576; if (size > INT_MAX) size = INT_MAX; available = ssize_t(size); size = wtotal / 1048576; if (size > INT_MAX) size = INT_MAX; total = ssize_t(size); return; #else #ifdef __APPLE__ unsigned int val; int mib[2]; size_t size_sys; mib[0] = CTL_HW; mib[1] = HW_PHYSMEM; size_sys = sizeof(val); sysctl(mib, 2, &val, &size_sys, NULL, 0); if (val) total = val / 1048576; mib[1] = HW_USERMEM; size_sys = sizeof(val); sysctl(mib, 2, &val, &size_sys, NULL, 0); if (val) available = val / 1048576; return; #else FILE *meminfo = fopen("/proc/meminfo", "r"); if (!meminfo) return; char buf[256]; while (!feof(meminfo)) { if (!fgets(buf, 256, meminfo)) { return; } bool isMemFree = (strncmp(buf, "MemFree:", 8) == 0); bool isMemTotal = (!isMemFree && (strncmp(buf, "MemTotal:", 9) == 0)); if (isMemFree || isMemTotal) { QString line = QString(buf).trimmed(); QStringList elements = line.split(' ', QString::SkipEmptyParts); QString unit = "kB"; if (elements.size() > 2) unit = elements[2]; int size = elements[1].toInt(); // cerr << "have size \"" << size << "\", unit \"" // << unit << "\"" << endl; if (unit.toLower() == "gb") size = size * 1024; else if (unit.toLower() == "mb") size = size; else if (unit.toLower() == "kb") size = size / 1024; else size = size / 1048576; if (isMemFree) available = size; else total = size; } if (available != -1 && total != -1) { fclose(meminfo); return; } } fclose(meminfo); return; #endif #endif } ssize_t GetDiscSpaceMBAvailable(const char *path) { #ifdef _WIN32 ULARGE_INTEGER available, total, totalFree; if (GetDiskFreeSpaceExA(path, &available, &total, &totalFree)) { __int64 a = available.QuadPart; a /= 1048576; if (a > INT_MAX) a = INT_MAX; return ssize_t(a); } else { cerr << "WARNING: GetDiskFreeSpaceEx failed: error code " << GetLastError() << endl; return -1; } #else struct statvfs buf; if (!statvfs(path, &buf)) { // do the multiplies and divides in this order to reduce the // likelihood of arithmetic overflow // cerr << "statvfs(" << path << ") says available: " << buf.f_bavail << ", block size: " << buf.f_bsize << endl; uint64_t available = ((buf.f_bavail / 1024) * buf.f_bsize) / 1024; if (available > INT_MAX) available = INT_MAX; return ssize_t(available); } else { perror("statvfs failed"); return -1; } #endif } #ifdef _WIN32 extern void SystemMemoryBarrier() { #ifdef _MSC_VER MemoryBarrier(); #else /* mingw */ LONG Barrier = 0; __asm__ __volatile__("xchgl %%eax,%0 " : "=r" (Barrier)); #endif } #else /* !_WIN32 */ #if !defined(__APPLE__) && defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ == 0)) void SystemMemoryBarrier() { pthread_mutex_t dummy = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&dummy); pthread_mutex_unlock(&dummy); } #endif /* !defined(__APPLE__) etc */ #endif /* !_WIN32 */ static char *startupLocale = 0; void StoreStartupLocale() { char *loc = setlocale(LC_ALL, 0); if (!loc) return; if (startupLocale) free(startupLocale); startupLocale = strdup(loc); } void RestoreStartupLocale() { if (!startupLocale) { setlocale(LC_ALL, ""); } else { setlocale(LC_ALL, startupLocale); } } double mod(double x, double y) { return x - (y * floor(x / y)); } float modf(float x, float y) { return x - (y * floorf(x / y)); } double princarg(double a) { return mod(a + M_PI, -2 * M_PI) + M_PI; } float princargf(float a) { return float(princarg(a)); } sonic-visualiser-3.0.3/svcore/system/System.h0000644000000000000000000001220113111512442017412 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SYSTEM_H_ #define _SYSTEM_H_ #include "base/Debug.h" #ifdef _WIN32 #include #include #include #include #define MLOCK(a,b) 1 #define MUNLOCK(a,b) 1 #define MUNLOCK_SAMPLEBLOCK(a) 1 #define MUNLOCKALL() 1 extern void SystemMemoryBarrier(); #define MBARRIER() SystemMemoryBarrier() #define DLOPEN(a,b) LoadLibrary((a).toStdWString().c_str()) #define DLSYM(a,b) GetProcAddress((HINSTANCE)(a),(b)) #define DLCLOSE(a) (!FreeLibrary((HINSTANCE)(a))) #define DLERROR() "" #define PLUGIN_GLOB "*.dll" #define PATH_SEPARATOR ';' // The default Vamp plugin path is obtained from a function in the // Vamp SDK (Vamp::PluginHostAdapter::getPluginPath). // At the time of writing, at least, the vast majority of LADSPA // plugins on Windows hosts will have been put there for use in // Audacity. It's a bit of a shame that Audacity uses its own Program // Files directory for plugins that any host may want to use... maybe // they were just following the example of VSTs, which are usually // found in Steinberg's Program Files directory. Anyway, we can // greatly increase our chances of picking up some LADSPA plugins by // default if we include the Audacity plugin location as well as an // (imho) more sensible place. #define DEFAULT_LADSPA_PATH "%ProgramFiles%\\LADSPA Plugins;%ProgramFiles%\\Audacity\\Plug-Ins" #define DEFAULT_DSSI_PATH "%ProgramFiles%\\DSSI Plugins" #define getpid _getpid #if defined(_MSC_VER) #include typedef SSIZE_T ssize_t; #endif #ifdef _MSC_VER extern "C" { void usleep(unsigned long usec); } #else #include #endif extern "C" { int gettimeofday(struct timeval *p, void *tz); } #define ISNAN std::isnan #define ISINF std::isinf #else #include #include #include // for perror #include #include // sleep + usleep primarily #define MLOCK(a,b) ::mlock((a),(b)) #define MUNLOCK(a,b) (::munlock((a),(b)) ? (::perror("munlock failed"), 0) : 0) #define MUNLOCK_SAMPLEBLOCK(a) do { if (!(a).empty()) { const float &b = *(a).begin(); MUNLOCK(&b, (a).capacity() * sizeof(float)); } } while(0); //#define MLOCK(a,b) 1 //#define MUNLOCK(a,b) 1 //#define MUNLOCK_SAMPLEBLOCK(a) 1 #define DLOPEN(a,b) dlopen((a).toStdString().c_str(),(b)) #define DLSYM(a,b) dlsym((a),(b)) #define DLCLOSE(a) dlclose((a)) #define DLERROR() dlerror() #include #define ISNAN std::isnan #define ISINF std::isinf #ifdef __APPLE__ #define PLUGIN_GLOB "*.dylib *.so" #define PATH_SEPARATOR ':' #define DEFAULT_LADSPA_PATH "$HOME/Library/Audio/Plug-Ins/LADSPA:/Library/Audio/Plug-Ins/LADSPA" #define DEFAULT_DSSI_PATH "$HOME/Library/Audio/Plug-Ins/DSSI:/Library/Audio/Plug-Ins/DSSI" #define MUNLOCKALL() 1 #include #define MBARRIER() OSMemoryBarrier() #else #ifdef sun #undef MLOCK #undef MUNLOCK #define MLOCK(a,b) ::mlock((char *)a,b) #define MUNLOCK(a,b) ::munlock((char *)a,b) #ifdef __SUNPRO_CC #undef ISNAN #undef ISINF #define ISNAN(x) ((x)!=(x)) #define ISINF(x) 0 #endif #endif #define PLUGIN_GLOB "*.so" #define PATH_SEPARATOR ':' #define DEFAULT_LADSPA_PATH "$HOME/ladspa:$HOME/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa" #define DEFAULT_DSSI_PATH "$HOME/dssi:$HOME/.dssi:/usr/local/lib/dssi:/usr/lib/dssi" #define MUNLOCKALL() ::munlockall() #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) #define MBARRIER() __sync_synchronize() #else extern void SystemMemoryBarrier(); #define MBARRIER() SystemMemoryBarrier() #endif #endif /* ! __APPLE__ */ #endif /* ! _WIN32 */ enum ProcessStatus { ProcessRunning, ProcessNotRunning, UnknownProcessStatus }; extern ProcessStatus GetProcessStatus(int pid); // Return a vague approximation to the number of free megabytes of real memory. // Return -1 if unknown. (Hence signed args.) Note that this could be more than // is actually addressable, e.g. for a 32-bit process on a 64-bit system. extern void GetRealMemoryMBAvailable(ssize_t &available, ssize_t &total); // Return a vague approximation to the number of free megabytes of // disc space on the partition containing the given path. Return -1 // if unknown. (Hence signed return type) extern ssize_t GetDiscSpaceMBAvailable(const char *path); extern void StoreStartupLocale(); extern void RestoreStartupLocale(); #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif extern double mod(double x, double y); extern float modf(float x, float y); extern double princarg(double a); extern float princargf(float a); #ifdef USE_POW_NO_F #define powf pow #endif #endif /* ! _SYSTEM_H_ */ sonic-visualiser-3.0.3/svcore/transform/CSVFeatureWriter.cpp0000644000000000000000000002352713111512442022331 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "CSVFeatureWriter.h" #include #include #include #include using namespace std; using namespace Vamp; CSVFeatureWriter::CSVFeatureWriter() : FileFeatureWriter(SupportOneFilePerTrackTransform | SupportOneFileTotal | SupportStdOut, "csv"), m_separator(","), m_sampleTiming(false), m_endTimes(false), m_forceEnd(false), m_omitFilename(false), m_digits(6) { } CSVFeatureWriter::~CSVFeatureWriter() { } string CSVFeatureWriter::getDescription() const { return "Write features in comma-separated (CSV) format. If transforms are being written to a single file or to stdout, the first column in the output will contain the input audio filename, or an empty string if the feature hails from the same audio file as its predecessor. If transforms are being written to multiple files, the audio filename column will be omitted. Subsequent columns will contain the feature timestamp, then any or all of duration, values, and label."; } CSVFeatureWriter::ParameterList CSVFeatureWriter::getSupportedParameters() const { ParameterList pl = FileFeatureWriter::getSupportedParameters(); Parameter p; p.name = "separator"; p.description = "Column separator for output. Default is \",\" (comma)."; p.hasArg = true; pl.push_back(p); p.name = "omit-filename"; p.description = "Omit the filename column. May result in confusion if sending more than one audio file's features to the same CSV output."; p.hasArg = false; pl.push_back(p); p.name = "sample-timing"; p.description = "Show timings as sample frame counts instead of in seconds."; p.hasArg = false; pl.push_back(p); p.name = "end-times"; p.description = "Show start and end time instead of start and duration, for features with duration."; p.hasArg = false; pl.push_back(p); p.name = "fill-ends"; p.description = "Include durations (or end times) even for features without duration, by using the gap to the next feature instead."; p.hasArg = false; pl.push_back(p); p.name = "digits"; p.description = "Specify the number of significant digits to use when printing transform outputs. Outputs are represented internally using single-precision floating-point, so digits beyond the 8th or 9th place are usually meaningless. The default is 6."; p.hasArg = true; pl.push_back(p); return pl; } void CSVFeatureWriter::setParameters(map ¶ms) { FileFeatureWriter::setParameters(params); SVDEBUG << "CSVFeatureWriter::setParameters" << endl; for (map::iterator i = params.begin(); i != params.end(); ++i) { SVDEBUG << i->first << " -> " << i->second << endl; if (i->first == "separator") { m_separator = i->second.c_str(); SVDEBUG << "m_separator = " << m_separator << endl; if (m_separator == "\\t") { m_separator = QChar::Tabulation; } } else if (i->first == "sample-timing") { m_sampleTiming = true; } else if (i->first == "end-times") { m_endTimes = true; } else if (i->first == "fill-ends") { m_forceEnd = true; } else if (i->first == "omit-filename") { m_omitFilename = true; } else if (i->first == "digits") { int digits = atoi(i->second.c_str()); if (digits <= 0 || digits > 100) { cerr << "CSVFeatureWriter: ERROR: Invalid or out-of-range value for number of significant digits: " << i->second << endl; cerr << "CSVFeatureWriter: NOTE: Continuing with default settings" << endl; } else { m_digits = digits; } } } } void CSVFeatureWriter::write(QString trackId, const Transform &transform, const Plugin::OutputDescriptor& , const Plugin::FeatureList& features, std::string summaryType) { TransformId transformId = transform.getIdentifier(); // Select appropriate output file for our track/transform // combination QTextStream *sptr = getOutputStream(trackId, transformId, QTextCodec::codecForName("UTF-8")); if (!sptr) { throw FailedToOpenOutputStream(trackId, transformId); } QTextStream &stream = *sptr; int n = (int)features.size(); if (n == 0) return; DataId tt(trackId, transform); if (m_pending.find(tt) != m_pending.end()) { writeFeature(tt, stream, m_pending[tt], &features[0], m_pendingSummaryTypes[tt]); m_pending.erase(tt); m_pendingSummaryTypes.erase(tt); } if (m_forceEnd) { // can't write final feature until we know its end time --n; m_pending[tt] = features[n]; m_pendingSummaryTypes[tt] = summaryType; } for (int i = 0; i < n; ++i) { writeFeature(tt, stream, features[i], m_forceEnd ? &features[i+1] : 0, summaryType); } } void CSVFeatureWriter::finish() { for (PendingFeatures::const_iterator i = m_pending.begin(); i != m_pending.end(); ++i) { DataId tt = i->first; Plugin::Feature f = i->second; QTextStream *sptr = getOutputStream(tt.first, tt.second.getIdentifier(), QTextCodec::codecForName("UTF-8")); if (!sptr) { throw FailedToOpenOutputStream(tt.first, tt.second.getIdentifier()); } QTextStream &stream = *sptr; // final feature has its own time as end time (we can't // reliably determine the end of audio file, and because of // the nature of block processing, the feature could even // start beyond that anyway) writeFeature(tt, stream, f, &f, m_pendingSummaryTypes[tt]); } m_pending.clear(); } void CSVFeatureWriter::writeFeature(DataId tt, QTextStream &stream, const Plugin::Feature &f, const Plugin::Feature *optionalNextFeature, std::string summaryType) { QString trackId = tt.first; Transform transform = tt.second; if (!m_omitFilename) { if (m_stdout || m_singleFileName != "") { if (trackId != m_prevPrintedTrackId) { stream << "\"" << trackId << "\"" << m_separator; m_prevPrintedTrackId = trackId; } else { stream << m_separator; } } } ::RealTime duration; bool haveDuration = true; if (f.hasDuration) { duration = f.duration; } else if (optionalNextFeature) { duration = optionalNextFeature->timestamp - f.timestamp; } else { haveDuration = false; } if (m_sampleTiming) { sv_samplerate_t rate = transform.getSampleRate(); stream << ::RealTime::realTime2Frame(f.timestamp, rate); if (haveDuration) { stream << m_separator; if (m_endTimes) { stream << ::RealTime::realTime2Frame (::RealTime(f.timestamp) + duration, rate); } else { stream << ::RealTime::realTime2Frame(duration, rate); } } } else { QString timestamp = f.timestamp.toString().c_str(); timestamp.replace(QRegExp("^ +"), ""); stream << timestamp; if (haveDuration) { if (m_endTimes) { QString endtime = (::RealTime(f.timestamp) + duration).toString().c_str(); endtime.replace(QRegExp("^ +"), ""); stream << m_separator << endtime; } else { QString d = ::RealTime(duration).toString().c_str(); d.replace(QRegExp("^ +"), ""); stream << m_separator << d; } } } if (summaryType != "") { stream << m_separator << summaryType.c_str(); } for (unsigned int j = 0; j < f.values.size(); ++j) { QString number = QString("%1").arg(f.values[j], 0, 'g', m_digits); // Qt pre-5.6 zero pads single-digit exponents to two digits; // Qt 5.7+ doesn't by default. But we want both to produce the // same output. Getting the new behaviour from standard APIs // in Qt 5.6 isn't possible I think; getting the old behaviour // from Qt 5.7 is possible but fiddly, involving setting up an // appropriate locale and using the %L specifier. We could // doubtless do it with sprintf but Qt is a known quantity at // this point. Let's just convert the old format to the new. number.replace("e-0", "e-"); stream << m_separator << number; } if (f.label != "") { stream << m_separator << "\"" << f.label.c_str() << "\""; } stream << "\n"; } sonic-visualiser-3.0.3/svcore/transform/CSVFeatureWriter.h0000644000000000000000000000433713111512442021774 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _CSV_FEATURE_WRITER_H_ #define _CSV_FEATURE_WRITER_H_ #include #include #include #include #include "FileFeatureWriter.h" using std::string; using std::map; class QTextStream; class QFile; class CSVFeatureWriter : public FileFeatureWriter { public: CSVFeatureWriter(); virtual ~CSVFeatureWriter(); virtual string getDescription() const; virtual ParameterList getSupportedParameters() const; virtual void setParameters(map ¶ms); virtual void write(QString trackid, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, const Vamp::Plugin::FeatureList &features, std::string summaryType = ""); virtual void finish(); virtual QString getWriterTag() const { return "csv"; } private: QString m_separator; bool m_sampleTiming; bool m_endTimes; bool m_forceEnd; bool m_omitFilename; QString m_prevPrintedTrackId; typedef pair DataId; // track id, transform typedef map PendingFeatures; typedef map PendingSummaryTypes; PendingFeatures m_pending; PendingSummaryTypes m_pendingSummaryTypes; void writeFeature(DataId, QTextStream &, const Vamp::Plugin::Feature &f, const Vamp::Plugin::Feature *optionalNextFeature, std::string summaryType); int m_digits; }; #endif sonic-visualiser-3.0.3/svcore/transform/FeatureExtractionModelTransformer.cpp0000644000000000000000000012213413111512442026017 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "FeatureExtractionModelTransformer.h" #include "plugin/FeatureExtractionPluginFactory.h" #include "plugin/PluginXml.h" #include #include "data/model/Model.h" #include "base/Window.h" #include "base/Exceptions.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/EditableDenseThreeDimensionalModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/FlexiNoteModel.h" #include "data/model/RegionModel.h" #include "data/model/FFTModel.h" #include "data/model/WaveFileModel.h" #include "rdf/PluginRDFDescription.h" #include "TransformFactory.h" #include #include FeatureExtractionModelTransformer::FeatureExtractionModelTransformer(Input in, const Transform &transform) : ModelTransformer(in, transform), m_plugin(0), m_haveOutputs(false) { SVDEBUG << "FeatureExtractionModelTransformer::FeatureExtractionModelTransformer: plugin " << m_transforms.begin()->getPluginIdentifier() << ", outputName " << m_transforms.begin()->getOutput() << endl; } FeatureExtractionModelTransformer::FeatureExtractionModelTransformer(Input in, const Transforms &transforms) : ModelTransformer(in, transforms), m_plugin(0), m_haveOutputs(false) { if (m_transforms.empty()) { SVDEBUG << "FeatureExtractionModelTransformer::FeatureExtractionModelTransformer: " << transforms.size() << " transform(s)" << endl; } else { SVDEBUG << "FeatureExtractionModelTransformer::FeatureExtractionModelTransformer: " << transforms.size() << " transform(s), first has plugin " << m_transforms.begin()->getPluginIdentifier() << ", outputName " << m_transforms.begin()->getOutput() << endl; } } static bool areTransformsSimilar(const Transform &t1, const Transform &t2) { Transform t2o(t2); t2o.setOutput(t1.getOutput()); return t1 == t2o; } bool FeatureExtractionModelTransformer::initialise() { // This is (now) called from the run thread. The plugin is // constructed, initialised, used, and destroyed all from a single // thread. // All transforms must use the same plugin, parameters, and // inputs: they can differ only in choice of plugin output. So we // initialise based purely on the first transform in the list (but // first check that they are actually similar as promised) for (int j = 1; j < (int)m_transforms.size(); ++j) { if (!areTransformsSimilar(m_transforms[0], m_transforms[j])) { m_message = tr("Transforms supplied to a single FeatureExtractionModelTransformer instance must be similar in every respect except plugin output"); SVCERR << m_message << endl; return false; } } Transform primaryTransform = m_transforms[0]; QString pluginId = primaryTransform.getPluginIdentifier(); FeatureExtractionPluginFactory *factory = FeatureExtractionPluginFactory::instance(); if (!factory) { m_message = tr("No factory available for feature extraction plugin id \"%1\" (unknown plugin type, or internal error?)").arg(pluginId); SVCERR << m_message << endl; return false; } DenseTimeValueModel *input = getConformingInput(); if (!input) { m_message = tr("Input model for feature extraction plugin \"%1\" is of wrong type (internal error?)").arg(pluginId); SVCERR << m_message << endl; return false; } SVDEBUG << "FeatureExtractionModelTransformer: Instantiating plugin for transform in thread " << QThread::currentThreadId() << endl; m_plugin = factory->instantiatePlugin(pluginId, input->getSampleRate()); if (!m_plugin) { m_message = tr("Failed to instantiate plugin \"%1\"").arg(pluginId); SVCERR << m_message << endl; return false; } TransformFactory::getInstance()->makeContextConsistentWithPlugin (primaryTransform, m_plugin); TransformFactory::getInstance()->setPluginParameters (primaryTransform, m_plugin); int channelCount = input->getChannelCount(); if ((int)m_plugin->getMaxChannelCount() < channelCount) { channelCount = 1; } if ((int)m_plugin->getMinChannelCount() > channelCount) { m_message = tr("Cannot provide enough channels to feature extraction plugin \"%1\" (plugin min is %2, max %3; input model has %4)") .arg(pluginId) .arg(m_plugin->getMinChannelCount()) .arg(m_plugin->getMaxChannelCount()) .arg(input->getChannelCount()); SVCERR << m_message << endl; return false; } int step = primaryTransform.getStepSize(); int block = primaryTransform.getBlockSize(); SVDEBUG << "Initialising feature extraction plugin with channels = " << channelCount << ", step = " << step << ", block = " << block << endl; if (!m_plugin->initialise(channelCount, step, block)) { int preferredStep = int(m_plugin->getPreferredStepSize()); int preferredBlock = int(m_plugin->getPreferredBlockSize()); if (step != preferredStep || block != preferredBlock) { SVDEBUG << "Initialisation failed, trying again with preferred step = " << preferredStep << ", block = " << preferredBlock << endl; if (!m_plugin->initialise(channelCount, preferredStep, preferredBlock)) { SVDEBUG << "Initialisation failed again" << endl; m_message = tr("Failed to initialise feature extraction plugin \"%1\"").arg(pluginId); SVCERR << m_message << endl; return false; } else { SVDEBUG << "Initialisation succeeded this time" << endl; // Set these values into the primary transform in the list m_transforms[0].setStepSize(preferredStep); m_transforms[0].setBlockSize(preferredBlock); m_message = tr("Feature extraction plugin \"%1\" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead") .arg(pluginId) .arg(step) .arg(block) .arg(preferredStep) .arg(preferredBlock); SVCERR << m_message << endl; } } else { SVDEBUG << "Initialisation failed (with step = " << step << " and block = " << block << ", both matching the plugin's preference)" << endl; m_message = tr("Failed to initialise feature extraction plugin \"%1\"").arg(pluginId); SVCERR << m_message << endl; return false; } } else { SVDEBUG << "Initialisation succeeded" << endl; } if (primaryTransform.getPluginVersion() != "") { QString pv = QString("%1").arg(m_plugin->getPluginVersion()); if (pv != primaryTransform.getPluginVersion()) { QString vm = tr("Transform was configured for version %1 of plugin \"%2\", but the plugin being used is version %3") .arg(primaryTransform.getPluginVersion()) .arg(pluginId) .arg(pv); if (m_message != "") { m_message = QString("%1; %2").arg(vm).arg(m_message); } else { m_message = vm; } SVCERR << m_message << endl; } } Vamp::Plugin::OutputList outputs = m_plugin->getOutputDescriptors(); if (outputs.empty()) { m_message = tr("Plugin \"%1\" has no outputs").arg(pluginId); SVCERR << m_message << endl; return false; } for (int j = 0; j < (int)m_transforms.size(); ++j) { for (int i = 0; i < (int)outputs.size(); ++i) { // SVDEBUG << "comparing output " << i << " name \"" << outputs[i].identifier << "\" with expected \"" << m_transform.getOutput() << "\"" << endl; if (m_transforms[j].getOutput() == "" || outputs[i].identifier == m_transforms[j].getOutput().toStdString()) { m_outputNos.push_back(i); m_descriptors.push_back(new Vamp::Plugin::OutputDescriptor(outputs[i])); m_fixedRateFeatureNos.push_back(-1); // we increment before use break; } } if ((int)m_descriptors.size() <= j) { m_message = tr("Plugin \"%1\" has no output named \"%2\"") .arg(pluginId) .arg(m_transforms[j].getOutput()); SVCERR << m_message << endl; return false; } } for (int j = 0; j < (int)m_transforms.size(); ++j) { createOutputModels(j); } m_outputMutex.lock(); m_haveOutputs = true; m_outputsCondition.wakeAll(); m_outputMutex.unlock(); return true; } void FeatureExtractionModelTransformer::deinitialise() { SVDEBUG << "FeatureExtractionModelTransformer: deleting plugin for transform in thread " << QThread::currentThreadId() << endl; try { delete m_plugin; } catch (const std::exception &e) { // A destructor shouldn't throw an exception. But at one point // (now fixed) our plugin stub destructor could have // accidentally done so, so just in case: SVCERR << "FeatureExtractionModelTransformer: caught exception while deleting plugin: " << e.what() << endl; m_message = e.what(); } m_plugin = 0; for (int j = 0; j < (int)m_descriptors.size(); ++j) { delete m_descriptors[j]; } } void FeatureExtractionModelTransformer::createOutputModels(int n) { DenseTimeValueModel *input = getConformingInput(); PluginRDFDescription description(m_transforms[n].getPluginIdentifier()); QString outputId = m_transforms[n].getOutput(); int binCount = 1; float minValue = 0.0, maxValue = 0.0; bool haveExtents = false; bool haveBinCount = m_descriptors[n]->hasFixedBinCount; if (haveBinCount) { binCount = (int)m_descriptors[n]->binCount; } m_needAdditionalModels[n] = false; // cerr << "FeatureExtractionModelTransformer: output bin count " // << binCount << endl; if (binCount > 0 && m_descriptors[n]->hasKnownExtents) { minValue = m_descriptors[n]->minValue; maxValue = m_descriptors[n]->maxValue; haveExtents = true; } sv_samplerate_t modelRate = input->getSampleRate(); sv_samplerate_t outputRate = modelRate; int modelResolution = 1; if (m_descriptors[n]->sampleType != Vamp::Plugin::OutputDescriptor::OneSamplePerStep) { outputRate = m_descriptors[n]->sampleRate; //!!! SV doesn't actually support display of models that have //!!! different underlying rates together -- so we always set //!!! the model rate to be the input model's rate, and adjust //!!! the resolution appropriately. We can't properly display //!!! data with a higher resolution than the base model at all if (outputRate > input->getSampleRate()) { SVDEBUG << "WARNING: plugin reports output sample rate as " << outputRate << " (can't display features with finer resolution than the input rate of " << modelRate << ")" << endl; outputRate = modelRate; } } switch (m_descriptors[n]->sampleType) { case Vamp::Plugin::OutputDescriptor::VariableSampleRate: if (outputRate != 0.0) { modelResolution = int(round(modelRate / outputRate)); } break; case Vamp::Plugin::OutputDescriptor::OneSamplePerStep: modelResolution = m_transforms[n].getStepSize(); break; case Vamp::Plugin::OutputDescriptor::FixedSampleRate: if (outputRate <= 0.0) { SVDEBUG << "WARNING: Fixed sample-rate plugin reports invalid sample rate " << m_descriptors[n]->sampleRate << "; defaulting to input rate of " << input->getSampleRate() << endl; modelResolution = 1; } else { modelResolution = int(round(modelRate / outputRate)); // cerr << "modelRate = " << modelRate << ", descriptor rate = " << outputRate << ", modelResolution = " << modelResolution << endl; } break; } bool preDurationPlugin = (m_plugin->getVampApiVersion() < 2); Model *out = 0; if (binCount == 0 && (preDurationPlugin || !m_descriptors[n]->hasDuration)) { // Anything with no value and no duration is an instant out = new SparseOneDimensionalModel(modelRate, modelResolution, false); QString outputEventTypeURI = description.getOutputEventTypeURI(outputId); out->setRDFTypeURI(outputEventTypeURI); } else if ((preDurationPlugin && binCount > 1 && (m_descriptors[n]->sampleType == Vamp::Plugin::OutputDescriptor::VariableSampleRate)) || (!preDurationPlugin && m_descriptors[n]->hasDuration)) { // For plugins using the old v1 API without explicit duration, // we treat anything that has multiple bins (i.e. that has the // potential to have value and duration) and a variable sample // rate as a note model, taking its values as pitch, duration // and velocity (if present) respectively. This is the same // behaviour as always applied by SV to these plugins in the // past. // For plugins with the newer API, we treat anything with // duration as either a note model with pitch and velocity, or // a region model. // How do we know whether it's an interval or note model? // What's the essential difference? Is a note model any // interval model using a Hz or "MIDI pitch" scale? There // isn't really a reliable test for "MIDI pitch"... Does a // note model always have velocity? This is a good question // to be addressed by accompanying RDF, but for the moment we // will do the following... bool isNoteModel = false; // Regions have only value (and duration -- we can't extract a // region model from an old-style plugin that doesn't support // duration) if (binCount > 1) isNoteModel = true; // Regions do not have units of Hz or MIDI things (a sweeping // assumption!) if (m_descriptors[n]->unit == "Hz" || m_descriptors[n]->unit.find("MIDI") != std::string::npos || m_descriptors[n]->unit.find("midi") != std::string::npos) { isNoteModel = true; } // If we had a "sparse 3D model", we would have the additional // problem of determining whether to use that here (if bin // count > 1). But we don't. QSettings settings; settings.beginGroup("Transformer"); bool flexi = settings.value("use-flexi-note-model", false).toBool(); settings.endGroup(); cerr << "flexi = " << flexi << endl; if (isNoteModel && !flexi) { NoteModel *model; if (haveExtents) { model = new NoteModel (modelRate, modelResolution, minValue, maxValue, false); } else { model = new NoteModel (modelRate, modelResolution, false); } model->setScaleUnits(m_descriptors[n]->unit.c_str()); out = model; } else if (isNoteModel && flexi) { FlexiNoteModel *model; if (haveExtents) { model = new FlexiNoteModel (modelRate, modelResolution, minValue, maxValue, false); } else { model = new FlexiNoteModel (modelRate, modelResolution, false); } model->setScaleUnits(m_descriptors[n]->unit.c_str()); out = model; } else { RegionModel *model; if (haveExtents) { model = new RegionModel (modelRate, modelResolution, minValue, maxValue, false); } else { model = new RegionModel (modelRate, modelResolution, false); } model->setScaleUnits(m_descriptors[n]->unit.c_str()); out = model; } QString outputEventTypeURI = description.getOutputEventTypeURI(outputId); out->setRDFTypeURI(outputEventTypeURI); } else if (binCount == 1 || (m_descriptors[n]->sampleType == Vamp::Plugin::OutputDescriptor::VariableSampleRate)) { // Anything that is not a 1D, note, or interval model and that // has only one value per result must be a sparse time value // model. // Anything that is not a 1D, note, or interval model and that // has a variable sample rate is treated as a set of sparse // time value models, one per output bin, because we lack a // sparse 3D model. // Anything that is not a 1D, note, or interval model and that // has a fixed sample rate but an unknown number of values per // result is also treated as a set of sparse time value models. // For sets of sparse time value models, we create a single // model first as the "standard" output and then create models // for bins 1+ in the additional model map (mapping the output // descriptor to a list of models indexed by bin-1). But we // don't create the additional models yet, as this case has to // work even if the number of bins is unknown at this point -- // we create an additional model (copying its parameters from // the default one) each time a new bin is encountered. if (!haveBinCount || binCount > 1) { m_needAdditionalModels[n] = true; } SparseTimeValueModel *model; if (haveExtents) { model = new SparseTimeValueModel (modelRate, modelResolution, minValue, maxValue, false); } else { model = new SparseTimeValueModel (modelRate, modelResolution, false); } Vamp::Plugin::OutputList outputs = m_plugin->getOutputDescriptors(); model->setScaleUnits(outputs[m_outputNos[n]].unit.c_str()); out = model; QString outputEventTypeURI = description.getOutputEventTypeURI(outputId); out->setRDFTypeURI(outputEventTypeURI); } else { // Anything that is not a 1D, note, or interval model and that // has a fixed sample rate and more than one value per result // must be a dense 3D model. EditableDenseThreeDimensionalModel *model = new EditableDenseThreeDimensionalModel (modelRate, modelResolution, binCount, EditableDenseThreeDimensionalModel::BasicMultirateCompression, false); if (!m_descriptors[n]->binNames.empty()) { std::vector names; for (int i = 0; i < (int)m_descriptors[n]->binNames.size(); ++i) { names.push_back(m_descriptors[n]->binNames[i].c_str()); } model->setBinNames(names); } out = model; QString outputSignalTypeURI = description.getOutputSignalTypeURI(outputId); out->setRDFTypeURI(outputSignalTypeURI); } if (out) { out->setSourceModel(input); m_outputs.push_back(out); } } void FeatureExtractionModelTransformer::awaitOutputModels() { m_outputMutex.lock(); while (!m_haveOutputs && !m_abandoned) { m_outputsCondition.wait(&m_outputMutex, 500); } m_outputMutex.unlock(); } FeatureExtractionModelTransformer::~FeatureExtractionModelTransformer() { // Parent class dtor set the abandoned flag and waited for the run // thread to exit; the run thread owns the plugin, and should have // destroyed it before exiting (via a call to deinitialise) } FeatureExtractionModelTransformer::Models FeatureExtractionModelTransformer::getAdditionalOutputModels() { Models mm; for (AdditionalModelMap::iterator i = m_additionalModels.begin(); i != m_additionalModels.end(); ++i) { for (std::map::iterator j = i->second.begin(); j != i->second.end(); ++j) { SparseTimeValueModel *m = j->second; if (m) mm.push_back(m); } } return mm; } bool FeatureExtractionModelTransformer::willHaveAdditionalOutputModels() { for (std::map::const_iterator i = m_needAdditionalModels.begin(); i != m_needAdditionalModels.end(); ++i) { if (i->second) return true; } return false; } SparseTimeValueModel * FeatureExtractionModelTransformer::getAdditionalModel(int n, int binNo) { // std::cerr << "getAdditionalModel(" << n << ", " << binNo << ")" << std::endl; if (binNo == 0) { std::cerr << "Internal error: binNo == 0 in getAdditionalModel (should be using primary model)" << std::endl; return 0; } if (!m_needAdditionalModels[n]) return 0; if (!isOutput(n)) return 0; if (m_additionalModels[n][binNo]) return m_additionalModels[n][binNo]; std::cerr << "getAdditionalModel(" << n << ", " << binNo << "): creating" << std::endl; SparseTimeValueModel *baseModel = getConformingOutput(n); if (!baseModel) return 0; std::cerr << "getAdditionalModel(" << n << ", " << binNo << "): (from " << baseModel << ")" << std::endl; SparseTimeValueModel *additional = new SparseTimeValueModel(baseModel->getSampleRate(), baseModel->getResolution(), baseModel->getValueMinimum(), baseModel->getValueMaximum(), false); additional->setScaleUnits(baseModel->getScaleUnits()); additional->setRDFTypeURI(baseModel->getRDFTypeURI()); m_additionalModels[n][binNo] = additional; return additional; } DenseTimeValueModel * FeatureExtractionModelTransformer::getConformingInput() { // SVDEBUG << "FeatureExtractionModelTransformer::getConformingInput: input model is " << getInputModel() << endl; DenseTimeValueModel *dtvm = dynamic_cast(getInputModel()); if (!dtvm) { SVDEBUG << "FeatureExtractionModelTransformer::getConformingInput: WARNING: Input model is not conformable to DenseTimeValueModel" << endl; } return dtvm; } void FeatureExtractionModelTransformer::run() { try { if (!initialise()) { abandon(); return; } } catch (const std::exception &e) { abandon(); m_message = e.what(); return; } DenseTimeValueModel *input = getConformingInput(); if (!input) { abandon(); return; } if (m_outputs.empty()) { abandon(); return; } Transform primaryTransform = m_transforms[0]; while (!input->isReady() && !m_abandoned) { cerr << "FeatureExtractionModelTransformer::run: Waiting for input model to be ready..." << endl; usleep(500000); } if (m_abandoned) return; sv_samplerate_t sampleRate = input->getSampleRate(); int channelCount = input->getChannelCount(); if ((int)m_plugin->getMaxChannelCount() < channelCount) { channelCount = 1; } float **buffers = new float*[channelCount]; for (int ch = 0; ch < channelCount; ++ch) { buffers[ch] = new float[primaryTransform.getBlockSize() + 2]; } int stepSize = primaryTransform.getStepSize(); int blockSize = primaryTransform.getBlockSize(); bool frequencyDomain = (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain); std::vector fftModels; if (frequencyDomain) { for (int ch = 0; ch < channelCount; ++ch) { FFTModel *model = new FFTModel (getConformingInput(), channelCount == 1 ? m_input.getChannel() : ch, primaryTransform.getWindowType(), blockSize, stepSize, blockSize); if (!model->isOK() || model->getError() != "") { QString err = model->getError(); delete model; for (int j = 0; j < (int)m_outputNos.size(); ++j) { setCompletion(j, 100); } //!!! need a better way to handle this -- previously we were using a QMessageBox but that isn't an appropriate thing to do here either throw AllocationFailed("Failed to create the FFT model for this feature extraction model transformer: error is: " + err); } fftModels.push_back(model); cerr << "created model for channel " << ch << endl; } } sv_frame_t startFrame = m_input.getModel()->getStartFrame(); sv_frame_t endFrame = m_input.getModel()->getEndFrame(); RealTime contextStartRT = primaryTransform.getStartTime(); RealTime contextDurationRT = primaryTransform.getDuration(); sv_frame_t contextStart = RealTime::realTime2Frame(contextStartRT, sampleRate); sv_frame_t contextDuration = RealTime::realTime2Frame(contextDurationRT, sampleRate); if (contextStart == 0 || contextStart < startFrame) { contextStart = startFrame; } if (contextDuration == 0) { contextDuration = endFrame - contextStart; } if (contextStart + contextDuration > endFrame) { contextDuration = endFrame - contextStart; } sv_frame_t blockFrame = contextStart; long prevCompletion = 0; for (int j = 0; j < (int)m_outputNos.size(); ++j) { setCompletion(j, 0); } float *reals = 0; float *imaginaries = 0; if (frequencyDomain) { reals = new float[blockSize/2 + 1]; imaginaries = new float[blockSize/2 + 1]; } QString error = ""; try { while (!m_abandoned) { if (frequencyDomain) { if (blockFrame - int(blockSize)/2 > contextStart + contextDuration) break; } else { if (blockFrame >= contextStart + contextDuration) break; } // SVDEBUG << "FeatureExtractionModelTransformer::run: blockFrame " // << blockFrame << ", endFrame " << endFrame << ", blockSize " // << blockSize << endl; int completion = int ((((blockFrame - contextStart) / stepSize) * 99) / (contextDuration / stepSize + 1)); // channelCount is either m_input.getModel()->channelCount or 1 if (frequencyDomain) { for (int ch = 0; ch < channelCount; ++ch) { int column = int((blockFrame - startFrame) / stepSize); if (fftModels[ch]->getValuesAt(column, reals, imaginaries)) { for (int i = 0; i <= blockSize/2; ++i) { buffers[ch][i*2] = reals[i]; buffers[ch][i*2+1] = imaginaries[i]; } } else { for (int i = 0; i <= blockSize/2; ++i) { buffers[ch][i*2] = 0.f; buffers[ch][i*2+1] = 0.f; } } error = fftModels[ch]->getError(); if (error != "") { SVCERR << "FeatureExtractionModelTransformer::run: Abandoning, error is " << error << endl; m_abandoned = true; m_message = error; break; } } } else { getFrames(channelCount, blockFrame, blockSize, buffers); } if (m_abandoned) break; Vamp::Plugin::FeatureSet features = m_plugin->process (buffers, RealTime::frame2RealTime(blockFrame, sampleRate).toVampRealTime()); if (m_abandoned) break; for (int j = 0; j < (int)m_outputNos.size(); ++j) { for (int fi = 0; fi < (int)features[m_outputNos[j]].size(); ++fi) { Vamp::Plugin::Feature feature = features[m_outputNos[j]][fi]; addFeature(j, blockFrame, feature); } } if (blockFrame == contextStart || completion > prevCompletion) { for (int j = 0; j < (int)m_outputNos.size(); ++j) { setCompletion(j, completion); } prevCompletion = completion; } blockFrame += stepSize; } if (!m_abandoned) { Vamp::Plugin::FeatureSet features = m_plugin->getRemainingFeatures(); for (int j = 0; j < (int)m_outputNos.size(); ++j) { for (int fi = 0; fi < (int)features[m_outputNos[j]].size(); ++fi) { Vamp::Plugin::Feature feature = features[m_outputNos[j]][fi]; addFeature(j, blockFrame, feature); } } } } catch (const std::exception &e) { SVCERR << "FeatureExtractionModelTransformer::run: Exception caught: " << e.what() << endl; m_abandoned = true; m_message = e.what(); } for (int j = 0; j < (int)m_outputNos.size(); ++j) { setCompletion(j, 100); } if (frequencyDomain) { for (int ch = 0; ch < channelCount; ++ch) { delete fftModels[ch]; } delete[] reals; delete[] imaginaries; } for (int ch = 0; ch < channelCount; ++ch) { delete[] buffers[ch]; } delete[] buffers; deinitialise(); } void FeatureExtractionModelTransformer::getFrames(int channelCount, sv_frame_t startFrame, sv_frame_t size, float **buffers) { sv_frame_t offset = 0; if (startFrame < 0) { for (int c = 0; c < channelCount; ++c) { for (sv_frame_t i = 0; i < size && startFrame + i < 0; ++i) { buffers[c][i] = 0.0f; } } offset = -startFrame; size -= offset; if (size <= 0) return; startFrame = 0; } DenseTimeValueModel *input = getConformingInput(); if (!input) return; sv_frame_t got = 0; if (channelCount == 1) { auto data = input->getData(m_input.getChannel(), startFrame, size); got = data.size(); copy(data.begin(), data.end(), buffers[0] + offset); if (m_input.getChannel() == -1 && input->getChannelCount() > 1) { // use mean instead of sum, as plugin input float cc = float(input->getChannelCount()); for (sv_frame_t i = 0; i < got; ++i) { buffers[0][i + offset] /= cc; } } } else { auto data = input->getMultiChannelData(0, channelCount-1, startFrame, size); if (!data.empty()) { got = data[0].size(); for (int c = 0; in_range_for(data, c); ++c) { copy(data[c].begin(), data[c].end(), buffers[c] + offset); } } } while (got < size) { for (int c = 0; c < channelCount; ++c) { buffers[c][got + offset] = 0.0; } ++got; } } void FeatureExtractionModelTransformer::addFeature(int n, sv_frame_t blockFrame, const Vamp::Plugin::Feature &feature) { sv_samplerate_t inputRate = m_input.getModel()->getSampleRate(); // cerr << "FeatureExtractionModelTransformer::addFeature: blockFrame = " // << blockFrame << ", hasTimestamp = " << feature.hasTimestamp // << ", timestamp = " << feature.timestamp << ", hasDuration = " // << feature.hasDuration << ", duration = " << feature.duration // << endl; sv_frame_t frame = blockFrame; if (m_descriptors[n]->sampleType == Vamp::Plugin::OutputDescriptor::VariableSampleRate) { if (!feature.hasTimestamp) { SVDEBUG << "WARNING: FeatureExtractionModelTransformer::addFeature: " << "Feature has variable sample rate but no timestamp!" << endl; return; } else { frame = RealTime::realTime2Frame(feature.timestamp, inputRate); } // cerr << "variable sample rate: timestamp = " << feature.timestamp // << " at input rate " << inputRate << " -> " << frame << endl; } else if (m_descriptors[n]->sampleType == Vamp::Plugin::OutputDescriptor::FixedSampleRate) { sv_samplerate_t rate = m_descriptors[n]->sampleRate; if (rate <= 0.0) { rate = inputRate; } if (!feature.hasTimestamp) { ++m_fixedRateFeatureNos[n]; } else { RealTime ts(feature.timestamp.sec, feature.timestamp.nsec); m_fixedRateFeatureNos[n] = (int)lrint(ts.toDouble() * rate); } // cerr << "m_fixedRateFeatureNo = " << m_fixedRateFeatureNos[n] // << ", m_descriptor->sampleRate = " << m_descriptors[n]->sampleRate // << ", inputRate = " << inputRate // << " giving frame = "; frame = lrint((double(m_fixedRateFeatureNos[n]) / rate) * inputRate); // cerr << frame << endl; } if (frame < 0) { SVDEBUG << "WARNING: FeatureExtractionModelTransformer::addFeature: " << "Negative frame counts are not supported (frame = " << frame << " from timestamp " << feature.timestamp << "), dropping feature" << endl; return; } // Rather than repeat the complicated tests from the constructor // to determine what sort of model we must be adding the features // to, we instead test what sort of model the constructor decided // to create. if (isOutput(n)) { SparseOneDimensionalModel *model = getConformingOutput(n); if (!model) return; model->addPoint(SparseOneDimensionalModel::Point (frame, feature.label.c_str())); } else if (isOutput(n)) { SparseTimeValueModel *model = getConformingOutput(n); if (!model) return; for (int i = 0; i < (int)feature.values.size(); ++i) { float value = feature.values[i]; QString label = feature.label.c_str(); if (feature.values.size() > 1) { label = QString("[%1] %2").arg(i+1).arg(label); } SparseTimeValueModel *targetModel = model; if (m_needAdditionalModels[n] && i > 0) { targetModel = getAdditionalModel(n, i); if (!targetModel) targetModel = model; // std::cerr << "adding point to model " << targetModel // << " for output " << n << " bin " << i << std::endl; } targetModel->addPoint (SparseTimeValueModel::Point(frame, value, label)); } } else if (isOutput(n) || isOutput(n) || isOutput(n)) { //GF: Added Note Model int index = 0; float value = 0.0; if ((int)feature.values.size() > index) { value = feature.values[index++]; } sv_frame_t duration = 1; if (feature.hasDuration) { duration = RealTime::realTime2Frame(feature.duration, inputRate); } else { if (in_range_for(feature.values, index)) { duration = lrintf(feature.values[index++]); } } if (isOutput(n)) { // GF: added for flexi note model float velocity = 100; if ((int)feature.values.size() > index) { velocity = feature.values[index++]; } if (velocity < 0) velocity = 127; if (velocity > 127) velocity = 127; FlexiNoteModel *model = getConformingOutput(n); if (!model) return; model->addPoint(FlexiNoteModel::Point(frame, value, // value is pitch duration, velocity / 127.f, feature.label.c_str())); // GF: end -- added for flexi note model } else if (isOutput(n)) { float velocity = 100; if ((int)feature.values.size() > index) { velocity = feature.values[index++]; } if (velocity < 0) velocity = 127; if (velocity > 127) velocity = 127; NoteModel *model = getConformingOutput(n); if (!model) return; model->addPoint(NoteModel::Point(frame, value, // value is pitch duration, velocity / 127.f, feature.label.c_str())); } else { RegionModel *model = getConformingOutput(n); if (!model) return; if (feature.hasDuration && !feature.values.empty()) { for (int i = 0; i < (int)feature.values.size(); ++i) { float value = feature.values[i]; QString label = feature.label.c_str(); if (feature.values.size() > 1) { label = QString("[%1] %2").arg(i+1).arg(label); } model->addPoint(RegionModel::Point(frame, value, duration, label)); } } else { model->addPoint(RegionModel::Point(frame, value, duration, feature.label.c_str())); } } } else if (isOutput(n)) { DenseThreeDimensionalModel::Column values = feature.values; EditableDenseThreeDimensionalModel *model = getConformingOutput(n); if (!model) return; // cerr << "(note: model resolution = " << model->getResolution() << ")" // << endl; if (!feature.hasTimestamp && m_fixedRateFeatureNos[n] >= 0) { model->setColumn(m_fixedRateFeatureNos[n], values); } else { model->setColumn(int(frame / model->getResolution()), values); } } else { SVDEBUG << "FeatureExtractionModelTransformer::addFeature: Unknown output model type!" << endl; } } void FeatureExtractionModelTransformer::setCompletion(int n, int completion) { // SVDEBUG << "FeatureExtractionModelTransformer::setCompletion(" // << completion << ")" << endl; if (isOutput(n)) { SparseOneDimensionalModel *model = getConformingOutput(n); if (!model) return; if (model->isAbandoning()) abandon(); model->setCompletion(completion, true); } else if (isOutput(n)) { SparseTimeValueModel *model = getConformingOutput(n); if (!model) return; if (model->isAbandoning()) abandon(); model->setCompletion(completion, true); } else if (isOutput(n)) { NoteModel *model = getConformingOutput(n); if (!model) return; if (model->isAbandoning()) abandon(); model->setCompletion(completion, true); } else if (isOutput(n)) { FlexiNoteModel *model = getConformingOutput(n); if (!model) return; if (model->isAbandoning()) abandon(); model->setCompletion(completion, true); } else if (isOutput(n)) { RegionModel *model = getConformingOutput(n); if (!model) return; if (model->isAbandoning()) abandon(); model->setCompletion(completion, true); } else if (isOutput(n)) { EditableDenseThreeDimensionalModel *model = getConformingOutput(n); if (!model) return; if (model->isAbandoning()) abandon(); model->setCompletion(completion, true); //!!!m_context.updates); } } sonic-visualiser-3.0.3/svcore/transform/FeatureExtractionModelTransformer.h0000644000000000000000000000671113111512442025466 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FEATURE_EXTRACTION_MODEL_TRANSFORMER_H_ #define _FEATURE_EXTRACTION_MODEL_TRANSFORMER_H_ #include "ModelTransformer.h" #include #include #include #include #include #include class DenseTimeValueModel; class SparseTimeValueModel; class FeatureExtractionModelTransformer : public ModelTransformer // + is a Thread { Q_OBJECT public: FeatureExtractionModelTransformer(Input input, const Transform &transform); // Obtain outputs for a set of transforms that all use the same // plugin and input (but with different outputs). i.e. run the // plugin once only and collect more than one output from it. FeatureExtractionModelTransformer(Input input, const Transforms &relatedTransforms); virtual ~FeatureExtractionModelTransformer(); // ModelTransformer method, retrieve the additional models Models getAdditionalOutputModels(); bool willHaveAdditionalOutputModels(); protected: bool initialise(); void deinitialise(); virtual void run(); Vamp::Plugin *m_plugin; std::vector m_descriptors; // per transform std::vector m_fixedRateFeatureNos; // to assign times to FixedSampleRate features std::vector m_outputNos; // list of plugin output indexes required for this group of transforms void createOutputModels(int n); std::map m_needAdditionalModels; // transformNo -> necessity typedef std::map > AdditionalModelMap; AdditionalModelMap m_additionalModels; SparseTimeValueModel *getAdditionalModel(int transformNo, int binNo); void addFeature(int n, sv_frame_t blockFrame, const Vamp::Plugin::Feature &feature); void setCompletion(int, int); void getFrames(int channelCount, sv_frame_t startFrame, sv_frame_t size, float **buffer); bool m_haveOutputs; QMutex m_outputMutex; QWaitCondition m_outputsCondition; void awaitOutputModels(); // just casts: DenseTimeValueModel *getConformingInput(); template bool isOutput(int n) { return dynamic_cast(m_outputs[n]) != 0; } template ModelClass *getConformingOutput(int n) { if ((int)m_outputs.size() > n) { ModelClass *mc = dynamic_cast(m_outputs[n]); if (!mc) { std::cerr << "FeatureExtractionModelTransformer::getOutput: Output model not conformable" << std::endl; } return mc; } else { std::cerr << "FeatureExtractionModelTransformer::getOutput: No such output number " << n << std::endl; return 0; } } }; #endif sonic-visualiser-3.0.3/svcore/transform/FeatureWriter.h0000644000000000000000000000677113111512442021424 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FEATURE_WRITER_H_ #define _FEATURE_WRITER_H_ #include #include #include #include #include "Transform.h" #include using std::string; using std::map; using std::vector; class FeatureWriter { public: virtual ~FeatureWriter() { } virtual string getDescription() const = 0; struct Parameter { // parameter of the writer, not the plugin Parameter() : hasArg(false), mandatory(false) { } string name; string description; bool hasArg; bool mandatory; }; typedef vector ParameterList; virtual ParameterList getSupportedParameters() const { return ParameterList(); } virtual void setParameters(map &) { return; } struct TrackMetadata { QString title; QString maker; RealTime duration; }; virtual void setTrackMetadata(QString /* trackid */, TrackMetadata) { } class FailedToOpenOutputStream : virtual public std::exception { public: FailedToOpenOutputStream(QString trackId, QString transformId) throw() : m_trackId(trackId), m_transformId(transformId) { } virtual ~FailedToOpenOutputStream() throw() { } virtual const char *what() const throw() { return QString("Failed to open output stream for track id \"%1\", transform id \"%2\"") .arg(m_trackId).arg(m_transformId).toLocal8Bit().data(); } protected: QString m_trackId; QString m_transformId; }; /** * Notify the writer that we are about to start extraction for * input file N of M (where N is 1..M). May be useful when writing * multiple outputs into a single file where some syntactic * element is needed to connect them. */ virtual void setNofM(int /* N */, int /* M */) { } // may throw FailedToOpenFile or other exceptions virtual void write(QString trackid, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, const Vamp::Plugin::FeatureList &features, std::string summaryType = "") = 0; /** * Throw FailedToOpenOutputStream if we can already tell that we * will be unable to write to the output file. This is called to * test the output stream before processing begins. The writer * may legitimately succeed here but still fail later -- this is * really an optimisation to ensure that easy-to-recognise failure * cases fail early. */ virtual void testOutputFile(QString /* trackId */, TransformId) { } virtual void flush() { } // whatever the last stream was virtual void finish() = 0; virtual QString getWriterTag() const = 0; }; #endif sonic-visualiser-3.0.3/svcore/transform/FileFeatureWriter.cpp0000644000000000000000000003155313111512442022553 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "FileFeatureWriter.h" #include "base/Exceptions.h" #include #include #include #include #include using namespace std; using namespace Vamp; FileFeatureWriter::FileFeatureWriter(int support, QString extension) : m_prevstream(0), m_support(support), m_extension(extension), m_manyFiles(false), m_stdout(false), m_append(false), m_force(false) { if (!(m_support & SupportOneFilePerTrack)) { if (m_support & SupportOneFilePerTrackTransform) { m_manyFiles = true; } else if (m_support & SupportOneFileTotal) { m_singleFileName = QString("output.%1").arg(m_extension); } else { cerr << "FileFeatureWriter::FileFeatureWriter: ERROR: Invalid support specification " << support << endl; } } } FileFeatureWriter::~FileFeatureWriter() { while (!m_streams.empty()) { m_streams.begin()->second->flush(); delete m_streams.begin()->second; m_streams.erase(m_streams.begin()); } while (!m_files.empty()) { if (m_files.begin()->second) { SVDEBUG << "FileFeatureWriter::~FileFeatureWriter: NOTE: Closing feature file \"" << m_files.begin()->second->fileName() << "\"" << endl; delete m_files.begin()->second; } m_files.erase(m_files.begin()); } } FileFeatureWriter::ParameterList FileFeatureWriter::getSupportedParameters() const { ParameterList pl; Parameter p; p.name = "basedir"; p.description = "Base output directory path. (The default is the same directory as the input file.) The directory must exist already."; p.hasArg = true; pl.push_back(p); if (m_support & SupportOneFilePerTrackTransform && m_support & SupportOneFilePerTrack) { p.name = "many-files"; p.description = "Create a separate output file for every combination of input file and transform. The output file names will be based on the input file names. (The default is to create one output file per input audio file, and write all transform results for that input into it.)"; p.hasArg = false; pl.push_back(p); } if (m_support & SupportOneFileTotal) { if (m_support & ~SupportOneFileTotal) { // not only option p.name = "one-file"; if (m_support & SupportOneFilePerTrack) { p.description = "Write all transform results for all input files into the single named output file. (The default is to create one output file per input audio file, and write all transform results for that input into it.)"; } else { p.description = "Write all transform results for all input files into the single named output file. (The default is to create a separate output file for each combination of input audio file and transform.)"; } p.hasArg = true; pl.push_back(p); } } if (m_support & SupportStdOut) { p.name = "stdout"; p.description = "Write all transform results directly to standard output."; p.hasArg = false; pl.push_back(p); } p.name = "force"; p.description = "If an output file already exists, overwrite it."; p.hasArg = false; pl.push_back(p); p.name = "append"; p.description = "If an output file already exists, append data to it."; p.hasArg = false; pl.push_back(p); return pl; } void FileFeatureWriter::setParameters(map ¶ms) { for (map::iterator i = params.begin(); i != params.end(); ++i) { if (i->first == "basedir") { m_baseDir = i->second.c_str(); } else if (i->first == "many-files") { if (m_support & SupportOneFilePerTrackTransform && m_support & SupportOneFilePerTrack) { if (m_singleFileName != "") { cerr << "FileFeatureWriter::setParameters: WARNING: Both one-file and many-files parameters provided, ignoring many-files" << endl; } else { m_manyFiles = true; } } } else if (i->first == "one-file") { if (m_support & SupportOneFileTotal) { if (m_support & ~SupportOneFileTotal) { // not only option // No, we cannot do this test because m_manyFiles // may be on by default (for any FileFeatureWriter // that supports OneFilePerTrackTransform but not // OneFilePerTrack), so we need to be able to // override it // if (m_manyFiles) { // cerr << "FileFeatureWriter::setParameters: WARNING: Both many-files and one-file parameters provided, ignoring one-file" << endl; // } else { m_singleFileName = i->second.c_str(); // } } } } else if (i->first == "stdout") { if (m_support & SupportStdOut) { if (m_singleFileName != "") { cerr << "FileFeatureWriter::setParameters: WARNING: Both stdout and one-file provided, ignoring stdout" << endl; } else { m_stdout = true; } } } else if (i->first == "append") { m_append = true; } else if (i->first == "force") { m_force = true; } } } QString FileFeatureWriter::createOutputFilename(QString trackId, TransformId transformId) { if (m_singleFileName != "") { if (QFileInfo(m_singleFileName).exists() && !(m_force || m_append)) { cerr << endl << "FileFeatureWriter: ERROR: Specified output file \"" << m_singleFileName << "\" exists and neither --" << getWriterTag() << "-force nor --" << getWriterTag() << "-append flag is specified -- not overwriting" << endl; cerr << "NOTE: To find out how to fix this problem, read the help for the --" << getWriterTag() << "-force" << endl << "and --" << getWriterTag() << "-append options" << endl; return ""; } return m_singleFileName; } if (m_stdout) { return ""; } QUrl url(trackId, QUrl::StrictMode); QString scheme = url.scheme().toLower(); bool local = (scheme == "" || scheme == "file" || scheme.length() == 1); QString dirname, basename; QString infilename = url.toLocalFile(); if (infilename == "") { infilename = url.path(); } basename = QFileInfo(infilename).completeBaseName(); if (scheme.length() == 1) { infilename = scheme + ":" + infilename; // DOS drive! } // cerr << "trackId = " << trackId << ", url = " << url.toString() << ", infilename = " // << infilename << ", basename = " << basename << ", m_baseDir = " << m_baseDir << endl; if (m_baseDir != "") dirname = QFileInfo(m_baseDir).absoluteFilePath(); else if (local) dirname = QFileInfo(infilename).absolutePath(); else dirname = QDir::currentPath(); // cerr << "dirname = " << dirname << endl; QString filename; if (m_manyFiles && transformId != "") { filename = QString("%1_%2.%3").arg(basename).arg(transformId).arg(m_extension); } else { filename = QString("%1.%2").arg(basename).arg(m_extension); } filename.replace(':', '_'); // ':' not permitted in Windows filename = QDir(dirname).filePath(filename); if (QFileInfo(filename).exists() && !(m_force || m_append)) { cerr << endl << "FileFeatureWriter: ERROR: Output file \"" << filename << "\" exists (for input file or URL \"" << trackId << "\" and transform \"" << transformId << "\") and neither --" << getWriterTag() << "-force nor --" << getWriterTag() << "-append is specified -- not overwriting" << endl; cerr << "NOTE: To find out how to fix this problem, read the help for the --" << getWriterTag() << "-force" << endl << "and --" << getWriterTag() << "-append options" << endl; return ""; } return filename; } void FileFeatureWriter::testOutputFile(QString trackId, TransformId transformId) { // Obviously, if we're writing to stdout we can't test for an // openable output file. But when writing a single file we don't // want to either, because this test would fail on the second and // subsequent input files (because the file would already exist). // getOutputFile does the right thing in this case, so we just // leave it to it if (m_stdout || m_singleFileName != "") return; QString filename = createOutputFilename(trackId, transformId); if (filename == "") { throw FailedToOpenOutputStream(trackId, transformId); } } FileFeatureWriter::TrackTransformPair FileFeatureWriter::getFilenameKey(QString trackId, TransformId transformId) { TrackTransformPair key; if (m_singleFileName != "") { key = TrackTransformPair("", ""); } else if (m_manyFiles) { key = TrackTransformPair(trackId, transformId); } else { key = TrackTransformPair(trackId, ""); } return key; } QString FileFeatureWriter::getOutputFilename(QString trackId, TransformId transformId) { TrackTransformPair key = getFilenameKey(trackId, transformId); if (m_filenames.find(key) == m_filenames.end()) { m_filenames[key] = createOutputFilename(trackId, transformId); } return m_filenames[key]; } QFile * FileFeatureWriter::getOutputFile(QString trackId, TransformId transformId) { TrackTransformPair key = getFilenameKey(trackId, transformId); if (m_files.find(key) == m_files.end()) { QString filename = createOutputFilename(trackId, transformId); if (filename == "") { // stdout or failure return 0; } SVDEBUG << "FileFeatureWriter: NOTE: Using output filename \"" << filename << "\"" << endl; if (m_append) { SVDEBUG << "FileFeatureWriter: NOTE: Calling reviewFileForAppending" << endl; reviewFileForAppending(filename); } QFile *file = new QFile(filename); QIODevice::OpenMode mode = (QIODevice::WriteOnly); if (m_append) mode |= QIODevice::Append; if (!file->open(mode)) { cerr << "FileFeatureWriter: ERROR: Failed to open output file \"" << filename << "\" for writing" << endl; delete file; m_files[key] = 0; throw FailedToOpenFile(filename); } m_files[key] = file; } return m_files[key]; } QTextStream *FileFeatureWriter::getOutputStream(QString trackId, TransformId transformId, QTextCodec *codec) { QFile *file = getOutputFile(trackId, transformId); if (!file && !m_stdout) { return 0; } if (m_streams.find(file) == m_streams.end()) { if (m_stdout) { m_streams[file] = new QTextStream(stdout); } else { m_streams[file] = new QTextStream(file); } m_streams[file]->setCodec(codec); } QTextStream *stream = m_streams[file]; if (m_prevstream && stream != m_prevstream) { m_prevstream->flush(); } m_prevstream = stream; return stream; } void FileFeatureWriter::flush() { if (m_prevstream) { m_prevstream->flush(); } } void FileFeatureWriter::finish() { // SVDEBUG << "FileFeatureWriter::finish()" << endl; if (m_singleFileName != "" || m_stdout) return; while (!m_streams.empty()) { m_streams.begin()->second->flush(); delete m_streams.begin()->second; m_streams.erase(m_streams.begin()); } while (!m_files.empty()) { if (m_files.begin()->second) { SVDEBUG << "FileFeatureWriter::finish: NOTE: Closing feature file \"" << m_files.begin()->second->fileName() << "\"" << endl; delete m_files.begin()->second; } m_files.erase(m_files.begin()); } m_prevstream = 0; } sonic-visualiser-3.0.3/svcore/transform/FileFeatureWriter.h0000644000000000000000000000544513111512442022221 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Sonic Annotator A utility for batch feature extraction from audio files. Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FILE_FEATURE_WRITER_H_ #define _FILE_FEATURE_WRITER_H_ #include #include #include #include "FeatureWriter.h" using std::string; using std::map; using std::set; using std::pair; class QTextStream; class QTextCodec; class QFile; class FileFeatureWriter : public FeatureWriter { public: virtual ~FileFeatureWriter(); virtual ParameterList getSupportedParameters() const; virtual void setParameters(map ¶ms); virtual void testOutputFile(QString trackId, TransformId transformId); virtual void flush(); virtual void finish(); protected: enum FileWriteSupport { SupportOneFilePerTrackTransform = 1, SupportOneFilePerTrack = 2, SupportOneFileTotal = 4, SupportStdOut = 8 }; FileFeatureWriter(int support, QString extension); QTextStream *getOutputStream(QString, TransformId, QTextCodec *); typedef pair TrackTransformPair; typedef map FileNameMap; typedef map FileMap; typedef map FileStreamMap; FileMap m_files; FileNameMap m_filenames; FileStreamMap m_streams; QTextStream *m_prevstream; TrackTransformPair getFilenameKey(QString, TransformId); // Come up with a suitable output filename for the given track ID - // transform ID combo. Fail if it already exists, etc. QString createOutputFilename(QString, TransformId); // Look up and return the output filename for the given track ID - // transform ID combo. QString getOutputFilename(QString, TransformId); // Look up and return the output file handle for the given track // ID - transform ID combo. Return 0 if it could not be opened. QFile *getOutputFile(QString, TransformId); // subclass can implement this to be called before file is opened for append virtual void reviewFileForAppending(QString) { } int m_support; QString m_extension; QString m_baseDir; bool m_manyFiles; QString m_singleFileName; bool m_stdout; bool m_append; bool m_force; }; #endif sonic-visualiser-3.0.3/svcore/transform/ModelTransformer.cpp0000644000000000000000000000253513111512442022444 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "ModelTransformer.h" ModelTransformer::ModelTransformer(Input input, const Transform &transform) : m_input(input), m_detached(false), m_detachedAdd(false), m_abandoned(false) { m_transforms.push_back(transform); } ModelTransformer::ModelTransformer(Input input, const Transforms &transforms) : m_transforms(transforms), m_input(input), m_detached(false), m_detachedAdd(false), m_abandoned(false) { } ModelTransformer::~ModelTransformer() { m_abandoned = true; wait(); if (!m_detached) { Models mine = getOutputModels(); foreach (Model *m, mine) delete m; } if (!m_detachedAdd) { Models mine = getAdditionalOutputModels(); foreach (Model *m, mine) delete m; } } sonic-visualiser-3.0.3/svcore/transform/ModelTransformer.h0000644000000000000000000001164513111512442022113 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_MODEL_TRANSFORMER_H #define SV_MODEL_TRANSFORMER_H #include "base/Thread.h" #include "data/model/Model.h" #include "Transform.h" /** * A ModelTransformer turns one data model into another. * * Typically in this application, a ModelTransformer might have a * DenseTimeValueModel as its input (e.g. an audio waveform) and a * SparseOneDimensionalModel (e.g. detected beats) as its output. * * The ModelTransformer typically runs in the background, as a * separate thread populating the output model. The model is * available to the user of the ModelTransformer immediately, but may * be initially empty until the background thread has populated it. */ class ModelTransformer : public Thread { public: virtual ~ModelTransformer(); typedef std::vector Models; class Input { public: Input(Model *m) : m_model(m), m_channel(-1) { } Input(Model *m, int c) : m_model(m), m_channel(c) { } Model *getModel() const { return m_model; } void setModel(Model *m) { m_model = m; } int getChannel() const { return m_channel; } void setChannel(int c) { m_channel = c; } protected: Model *m_model; int m_channel; }; /** * Hint to the processing thread that it should give up, for * example because the process is going to exit or we want to get * rid of the input model. Caller should still wait() and/or * delete the transform before assuming its input and output * models are no longer required. */ void abandon() { m_abandoned = true; } /** * Return true if the processing thread is being or has been * abandoned, i.e. if abandon() has been called. */ bool isAbandoned() const { return m_abandoned; } /** * Return the input model for the transform. */ Model *getInputModel() { return m_input.getModel(); } /** * Return the input channel spec for the transform. */ int getInputChannel() { return m_input.getChannel(); } /** * Return the set of output models created by the transform or * transforms. Returns an empty list if any transform could not * be initialised; an error message may be available via * getMessage() in this situation. */ Models getOutputModels() { awaitOutputModels(); return m_outputs; } /** * Return the set of output models, also detaching them from the * transformer so that they will not be deleted when the * transformer is. The caller takes ownership of the models. */ Models detachOutputModels() { awaitOutputModels(); m_detached = true; return m_outputs; } /** * Return any additional models that were created during * processing. This might happen if, for example, a transform was * configured to split a multi-bin output into separate single-bin * models as it processed. These should not be queried until after * the transform has completed. */ virtual Models getAdditionalOutputModels() { return Models(); } /** * Return true if the current transform is one that may produce * additional models (to be retrieved through * getAdditionalOutputModels above). */ virtual bool willHaveAdditionalOutputModels() { return false; } /** * Return the set of additional models, also detaching them from * the transformer. The caller takes ownership of the models. */ virtual Models detachAdditionalOutputModels() { m_detachedAdd = true; return getAdditionalOutputModels(); } /** * Return a warning or error message. If getOutputModel returned * a null pointer, this should contain a fatal error message for * the transformer; otherwise it may contain a warning to show to * the user about e.g. suboptimal block size or whatever. */ QString getMessage() const { return m_message; } protected: ModelTransformer(Input input, const Transform &transform); ModelTransformer(Input input, const Transforms &transforms); virtual void awaitOutputModels() = 0; Transforms m_transforms; Input m_input; // I don't own the model in this Models m_outputs; // I own this, unless... bool m_detached; // ... this is true. bool m_detachedAdd; bool m_abandoned; QString m_message; }; #endif sonic-visualiser-3.0.3/svcore/transform/ModelTransformerFactory.cpp0000644000000000000000000002500713111512442023773 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ModelTransformerFactory.h" #include "FeatureExtractionModelTransformer.h" #include "RealTimeEffectModelTransformer.h" #include "TransformFactory.h" #include "base/AudioPlaySource.h" #include "plugin/FeatureExtractionPluginFactory.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/PluginXml.h" #include "data/model/DenseTimeValueModel.h" #include #include #include #include using std::vector; ModelTransformerFactory * ModelTransformerFactory::m_instance = new ModelTransformerFactory; ModelTransformerFactory * ModelTransformerFactory::getInstance() { return m_instance; } ModelTransformerFactory::~ModelTransformerFactory() { } ModelTransformer::Input ModelTransformerFactory::getConfigurationForTransform(Transform &transform, const std::vector &candidateInputModels, Model *defaultInputModel, AudioPlaySource *source, sv_frame_t startFrame, sv_frame_t duration, UserConfigurator *configurator) { ModelTransformer::Input input(0); if (candidateInputModels.empty()) return input; //!!! This will need revision -- we'll have to have a callback //from the dialog for when the candidate input model is changed, //as we'll need to reinitialise the channel settings in the dialog Model *inputModel = candidateInputModels[0]; QStringList candidateModelNames; QString defaultModelName; QMap modelMap; for (int i = 0; i < (int)candidateInputModels.size(); ++i) { QString modelName = candidateInputModels[i]->objectName(); QString origModelName = modelName; int dupcount = 1; while (modelMap.contains(modelName)) { modelName = tr("%1 <%2>").arg(origModelName).arg(++dupcount); } modelMap[modelName] = candidateInputModels[i]; candidateModelNames.push_back(modelName); if (candidateInputModels[i] == defaultInputModel) { defaultModelName = modelName; } } QString id = transform.getPluginIdentifier(); bool ok = true; QString configurationXml = m_lastConfigurations[transform.getIdentifier()]; SVDEBUG << "ModelTransformer: last configuration for identifier " << transform.getIdentifier() << ": " << configurationXml << endl; Vamp::PluginBase *plugin = 0; if (RealTimePluginFactory::instanceFor(id)) { SVDEBUG << "ModelTransformerFactory::getConfigurationForTransform: instantiating real-time plugin" << endl; RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(id); sv_samplerate_t sampleRate = inputModel->getSampleRate(); int blockSize = 1024; int channels = 1; if (source) { sampleRate = source->getSourceSampleRate(); blockSize = source->getTargetBlockSize(); channels = source->getTargetChannelCount(); } RealTimePluginInstance *rtp = factory->instantiatePlugin (id, 0, 0, sampleRate, blockSize, channels); plugin = rtp; } else { SVDEBUG << "ModelTransformerFactory::getConfigurationForTransform: instantiating Vamp plugin" << endl; Vamp::Plugin *vp = FeatureExtractionPluginFactory::instance()->instantiatePlugin (id, float(inputModel->getSampleRate())); plugin = vp; } if (plugin) { // Ensure block size etc are valid TransformFactory::getInstance()-> makeContextConsistentWithPlugin(transform, plugin); // Prepare the plugin with any existing parameters already // found in the transform TransformFactory::getInstance()-> setPluginParameters(transform, plugin); // For this interactive usage, we want to override those with // whatever the user chose last time around PluginXml(plugin).setParametersFromXml(configurationXml); if (configurator) { ok = configurator->configure(input, transform, plugin, inputModel, source, startFrame, duration, modelMap, candidateModelNames, defaultModelName); } TransformFactory::getInstance()-> makeContextConsistentWithPlugin(transform, plugin); configurationXml = PluginXml(plugin).toXmlString(); SVDEBUG << "ModelTransformerFactory::getConfigurationForTransform: got configuration, deleting plugin" << endl; delete plugin; } if (ok) { m_lastConfigurations[transform.getIdentifier()] = configurationXml; input.setModel(inputModel); } return input; } ModelTransformer * ModelTransformerFactory::createTransformer(const Transforms &transforms, const ModelTransformer::Input &input) { ModelTransformer *transformer = 0; QString id = transforms[0].getPluginIdentifier(); if (RealTimePluginFactory::instanceFor(id)) { transformer = new RealTimeEffectModelTransformer(input, transforms[0]); } else { transformer = new FeatureExtractionModelTransformer(input, transforms); } if (transformer) transformer->setObjectName(transforms[0].getIdentifier()); return transformer; } Model * ModelTransformerFactory::transform(const Transform &transform, const ModelTransformer::Input &input, QString &message, AdditionalModelHandler *handler) { SVDEBUG << "ModelTransformerFactory::transform: Constructing transformer with input model " << input.getModel() << endl; Transforms transforms; transforms.push_back(transform); vector mm = transformMultiple(transforms, input, message, handler); if (mm.empty()) return 0; else return mm[0]; } vector ModelTransformerFactory::transformMultiple(const Transforms &transforms, const ModelTransformer::Input &input, QString &message, AdditionalModelHandler *handler) { SVDEBUG << "ModelTransformerFactory::transformMultiple: Constructing transformer with input model " << input.getModel() << endl; ModelTransformer *t = createTransformer(transforms, input); if (!t) return vector(); if (handler) { m_handlers[t] = handler; } m_runningTransformers.insert(t); connect(t, SIGNAL(finished()), this, SLOT(transformerFinished())); t->start(); vector models = t->detachOutputModels(); if (!models.empty()) { QString imn = input.getModel()->objectName(); QString trn = TransformFactory::getInstance()->getTransformFriendlyName (transforms[0].getIdentifier()); for (int i = 0; i < (int)models.size(); ++i) { if (imn != "") { if (trn != "") { models[i]->setObjectName(tr("%1: %2").arg(imn).arg(trn)); } else { models[i]->setObjectName(imn); } } else if (trn != "") { models[i]->setObjectName(trn); } } } else { t->wait(); } message = t->getMessage(); return models; } void ModelTransformerFactory::transformerFinished() { QObject *s = sender(); ModelTransformer *transformer = dynamic_cast(s); // SVDEBUG << "ModelTransformerFactory::transformerFinished(" << transformer << ")" << endl; if (!transformer) { cerr << "WARNING: ModelTransformerFactory::transformerFinished: sender is not a transformer" << endl; return; } if (m_runningTransformers.find(transformer) == m_runningTransformers.end()) { cerr << "WARNING: ModelTransformerFactory::transformerFinished(" << transformer << "): I have no record of this transformer running!" << endl; } m_runningTransformers.erase(transformer); if (m_handlers.find(transformer) != m_handlers.end()) { if (transformer->willHaveAdditionalOutputModels()) { vector mm = transformer->detachAdditionalOutputModels(); m_handlers[transformer]->moreModelsAvailable(mm); } else { m_handlers[transformer]->noMoreModelsAvailable(); } m_handlers.erase(transformer); } if (transformer->isAbandoned()) { if (transformer->getMessage() != "") { emit transformFailed("", transformer->getMessage()); } } transformer->wait(); // unnecessary but reassuring delete transformer; } void ModelTransformerFactory::modelAboutToBeDeleted(Model *m) { TransformerSet affected; for (TransformerSet::iterator i = m_runningTransformers.begin(); i != m_runningTransformers.end(); ++i) { ModelTransformer *t = *i; if (t->getInputModel() == m) { affected.insert(t); } else { vector mm = t->getOutputModels(); for (int i = 0; i < (int)mm.size(); ++i) { if (mm[i] == m) affected.insert(t); } } } for (TransformerSet::iterator i = affected.begin(); i != affected.end(); ++i) { ModelTransformer *t = *i; t->abandon(); t->wait(); // this should eventually call back on // transformerFinished, which will remove from // m_runningTransformers and delete. } } sonic-visualiser-3.0.3/svcore/transform/ModelTransformerFactory.h0000644000000000000000000001577413111512442023452 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_TRANSFORMER_FACTORY_H_ #define _MODEL_TRANSFORMER_FACTORY_H_ #include "Transform.h" #include "TransformDescription.h" #include "FeatureExtractionModelTransformer.h" #include "ModelTransformer.h" #include #include #include #include #include class AudioPlaySource; class ModelTransformerFactory : public QObject { Q_OBJECT public: virtual ~ModelTransformerFactory(); static ModelTransformerFactory *getInstance(); class UserConfigurator { public: virtual bool configure(ModelTransformer::Input &input, Transform &transform, Vamp::PluginBase *plugin, Model *&inputModel, AudioPlaySource *source, sv_frame_t startFrame, sv_frame_t duration, const QMap &modelMap, QStringList candidateModelNames, QString defaultModelName) = 0; }; /** * Fill out the configuration for the given transform (may include * asking the user by calling back on the UserConfigurator). * Returns the selected input model and channel if the transform * is acceptable, or an input with a null model if the operation * should be cancelled. Audio play source may be used to audition * effects plugins, if provided. */ ModelTransformer::Input getConfigurationForTransform(Transform &transform, const std::vector &candidateInputModels, Model *defaultInputModel, AudioPlaySource *source = 0, sv_frame_t startFrame = 0, sv_frame_t duration = 0, UserConfigurator *configurator = 0); class AdditionalModelHandler { public: virtual ~AdditionalModelHandler() { } // Exactly one of these functions will be called virtual void moreModelsAvailable(std::vector models) = 0; virtual void noMoreModelsAvailable() = 0; }; /** * Return the output model resulting from applying the named * transform to the given input model. The transform may still be * working in the background when the model is returned; check the * output model's isReady completion status for more details. To * cancel a background transform, call abandon() on its model. * * If the transform is unknown or the input model is not an * appropriate type for the given transform, or if some other * problem occurs, return 0. Set message if there is any error or * warning to report. * * Some transforms may return additional models at the end of * processing. (For example, a transform that splits an output * into multiple one-per-bin models.) If an additionalModelHandler * is provided here, its moreModelsAvailable method will be called * when those models become available, and ownership of those * models will be transferred to the handler. Otherwise (if the * handler is null) any such models will be discarded. * * The returned model is owned by the caller and must be deleted * when no longer needed. */ Model *transform(const Transform &transform, const ModelTransformer::Input &input, QString &message, AdditionalModelHandler *handler = 0); /** * Return the multiple output models resulting from applying the * named transforms to the given input model. The transforms may * differ only in output identifier for the plugin: they must all * use the same plugin, parameters, and programs. The plugin will * be run once only, but more than one output will be harvested * (as appropriate). Models will be returned in the same order as * the transforms were given. The plugin may still be working in * the background when the model is returned; check the output * models' isReady completion statuses for more details. To cancel * a background transform, call abandon() on its model. * * If a transform is unknown or the transforms are insufficiently * closely related or the input model is not an appropriate type * for the given transform, or if some other problem occurs, * return 0. Set message if there is any error or warning to * report. * * Some transforms may return additional models at the end of * processing. (For example, a transform that splits an output * into multiple one-per-bin models.) If an additionalModelHandler * is provided here, its moreModelsAvailable method will be called * when those models become available, and ownership of those * models will be transferred to the handler. Otherwise (if the * handler is null) any such models will be discarded. Note that * calling abandon() on any one of the models returned by * transformMultiple is sufficient to cancel all background * transform activity associated with these output models. * * The returned models are owned by the caller and must be deleted * when no longer needed. */ std::vector transformMultiple(const Transforms &transform, const ModelTransformer::Input &input, QString &message, AdditionalModelHandler *handler = 0); signals: void transformFailed(QString transformName, QString message); protected slots: void transformerFinished(); void modelAboutToBeDeleted(Model *); protected: ModelTransformer *createTransformer(const Transforms &transforms, const ModelTransformer::Input &input); typedef std::map TransformerConfigurationMap; TransformerConfigurationMap m_lastConfigurations; typedef std::set TransformerSet; TransformerSet m_runningTransformers; typedef std::map HandlerMap; HandlerMap m_handlers; static ModelTransformerFactory *m_instance; }; #endif sonic-visualiser-3.0.3/svcore/transform/RealTimeEffectModelTransformer.cpp0000644000000000000000000002335613111512442025210 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RealTimeEffectModelTransformer.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/RealTimePluginInstance.h" #include "plugin/PluginXml.h" #include "data/model/Model.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/WritableWaveFileModel.h" #include "data/model/WaveFileModel.h" #include "TransformFactory.h" #include RealTimeEffectModelTransformer::RealTimeEffectModelTransformer(Input in, const Transform &t) : ModelTransformer(in, t), m_plugin(0) { Transform transform(t); if (!transform.getBlockSize()) { transform.setBlockSize(1024); m_transforms[0] = transform; } m_units = TransformFactory::getInstance()->getTransformUnits (transform.getIdentifier()); m_outputNo = (transform.getOutput() == "A") ? -1 : transform.getOutput().toInt(); QString pluginId = transform.getPluginIdentifier(); // SVDEBUG << "RealTimeEffectModelTransformer::RealTimeEffectModelTransformer: plugin " << pluginId << ", output " << output << endl; RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(pluginId); if (!factory) { cerr << "RealTimeEffectModelTransformer: No factory available for plugin id \"" << pluginId << "\"" << endl; return; } DenseTimeValueModel *input = getConformingInput(); if (!input) return; m_plugin = factory->instantiatePlugin(pluginId, 0, 0, input->getSampleRate(), transform.getBlockSize(), input->getChannelCount()); if (!m_plugin) { cerr << "RealTimeEffectModelTransformer: Failed to instantiate plugin \"" << pluginId << "\"" << endl; return; } TransformFactory::getInstance()->setPluginParameters(transform, m_plugin); if (m_outputNo >= 0 && m_outputNo >= int(m_plugin->getControlOutputCount())) { cerr << "RealTimeEffectModelTransformer: Plugin has fewer than desired " << m_outputNo << " control outputs" << endl; return; } if (m_outputNo == -1) { int outputChannels = (int)m_plugin->getAudioOutputCount(); if (outputChannels > input->getChannelCount()) { outputChannels = input->getChannelCount(); } WritableWaveFileModel *model = new WritableWaveFileModel (input->getSampleRate(), outputChannels); m_outputs.push_back(model); } else { SparseTimeValueModel *model = new SparseTimeValueModel (input->getSampleRate(), transform.getBlockSize(), 0.0, 0.0, false); if (m_units != "") model->setScaleUnits(m_units); m_outputs.push_back(model); } } RealTimeEffectModelTransformer::~RealTimeEffectModelTransformer() { delete m_plugin; } DenseTimeValueModel * RealTimeEffectModelTransformer::getConformingInput() { DenseTimeValueModel *dtvm = dynamic_cast(getInputModel()); if (!dtvm) { SVDEBUG << "RealTimeEffectModelTransformer::getConformingInput: WARNING: Input model is not conformable to DenseTimeValueModel" << endl; } return dtvm; } void RealTimeEffectModelTransformer::run() { DenseTimeValueModel *input = getConformingInput(); if (!input) return; while (!input->isReady() && !m_abandoned) { SVDEBUG << "RealTimeEffectModelTransformer::run: Waiting for input model to be ready..." << endl; usleep(500000); } if (m_abandoned) return; SparseTimeValueModel *stvm = dynamic_cast(m_outputs[0]); WritableWaveFileModel *wwfm = dynamic_cast(m_outputs[0]); if (!stvm && !wwfm) return; if (stvm && (m_outputNo >= int(m_plugin->getControlOutputCount()))) return; sv_samplerate_t sampleRate = input->getSampleRate(); int channelCount = input->getChannelCount(); if (!wwfm && m_input.getChannel() != -1) channelCount = 1; sv_frame_t blockSize = m_plugin->getBufferSize(); float **inbufs = m_plugin->getAudioInputBuffers(); sv_frame_t startFrame = m_input.getModel()->getStartFrame(); sv_frame_t endFrame = m_input.getModel()->getEndFrame(); Transform transform = m_transforms[0]; RealTime contextStartRT = transform.getStartTime(); RealTime contextDurationRT = transform.getDuration(); sv_frame_t contextStart = RealTime::realTime2Frame(contextStartRT, sampleRate); sv_frame_t contextDuration = RealTime::realTime2Frame(contextDurationRT, sampleRate); if (contextStart == 0 || contextStart < startFrame) { contextStart = startFrame; } if (contextDuration == 0) { contextDuration = endFrame - contextStart; } if (contextStart + contextDuration > endFrame) { contextDuration = endFrame - contextStart; } if (wwfm) { wwfm->setStartFrame(contextStart); } sv_frame_t blockFrame = contextStart; int prevCompletion = 0; sv_frame_t latency = m_plugin->getLatency(); while (blockFrame < contextStart + contextDuration + latency && !m_abandoned) { int completion = int ((((blockFrame - contextStart) / blockSize) * 99) / (1 + ((contextDuration) / blockSize))); sv_frame_t got = 0; if (channelCount == 1) { if (inbufs && inbufs[0]) { auto data = input->getData (m_input.getChannel(), blockFrame, blockSize); got = data.size(); for (sv_frame_t i = 0; i < got; ++i) { inbufs[0][i] = data[i]; } while (got < blockSize) { inbufs[0][got++] = 0.f; } for (int ch = 1; ch < (int)m_plugin->getAudioInputCount(); ++ch) { for (sv_frame_t i = 0; i < blockSize; ++i) { inbufs[ch][i] = inbufs[0][i]; } } } } else { if (inbufs && inbufs[0]) { auto data = input->getMultiChannelData (0, channelCount - 1, blockFrame, blockSize); if (!data.empty()) got = data[0].size(); for (int ch = 0; ch < channelCount; ++ch) { for (sv_frame_t i = 0; i < got; ++i) { inbufs[ch][i] = data[ch][i]; } } while (got < blockSize) { for (int ch = 0; ch < channelCount; ++ch) { inbufs[ch][got] = 0.0; } ++got; } for (int ch = channelCount; ch < (int)m_plugin->getAudioInputCount(); ++ch) { for (sv_frame_t i = 0; i < blockSize; ++i) { inbufs[ch][i] = inbufs[ch % channelCount][i]; } } } } /* cerr << "Input for plugin: " << m_plugin->getAudioInputCount() << " channels "<< endl; for (int ch = 0; ch < m_plugin->getAudioInputCount(); ++ch) { cerr << "Input channel " << ch << endl; for (int i = 0; i < 100; ++i) { cerr << inbufs[ch][i] << " "; if (isnan(inbufs[ch][i])) { cerr << "\n\nWARNING: NaN in audio input" << endl; } } } */ m_plugin->run(RealTime::frame2RealTime(blockFrame, sampleRate)); if (stvm) { float value = m_plugin->getControlOutputValue(m_outputNo); sv_frame_t pointFrame = blockFrame; if (pointFrame > latency) pointFrame -= latency; else pointFrame = 0; stvm->addPoint(SparseTimeValueModel::Point (pointFrame, value, "")); } else if (wwfm) { float **outbufs = m_plugin->getAudioOutputBuffers(); if (outbufs) { if (blockFrame >= latency) { sv_frame_t writeSize = std::min (blockSize, contextStart + contextDuration + latency - blockFrame); wwfm->addSamples(outbufs, writeSize); } else if (blockFrame + blockSize >= latency) { sv_frame_t offset = latency - blockFrame; sv_frame_t count = blockSize - offset; float **tmp = new float *[channelCount]; for (int c = 0; c < channelCount; ++c) { tmp[c] = outbufs[c] + offset; } wwfm->addSamples(tmp, count); delete[] tmp; } } } if (blockFrame == contextStart || completion > prevCompletion) { // This setCompletion is probably misusing the completion // terminology, just as it was for WritableWaveFileModel if (stvm) stvm->setCompletion(completion); if (wwfm) wwfm->setWriteProportion(completion); prevCompletion = completion; } blockFrame += blockSize; } if (m_abandoned) return; if (stvm) stvm->setCompletion(100); if (wwfm) wwfm->writeComplete(); } sonic-visualiser-3.0.3/svcore/transform/RealTimeEffectModelTransformer.h0000644000000000000000000000242713111512442024651 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _REAL_TIME_EFFECT_TRANSFORMER_H_ #define _REAL_TIME_EFFECT_TRANSFORMER_H_ #include "ModelTransformer.h" #include "plugin/RealTimePluginInstance.h" class DenseTimeValueModel; class RealTimeEffectModelTransformer : public ModelTransformer { public: RealTimeEffectModelTransformer(Input input, const Transform &transform); virtual ~RealTimeEffectModelTransformer(); protected: virtual void run(); virtual void awaitOutputModels() { } // they're created synchronously QString m_units; RealTimePluginInstance *m_plugin; int m_outputNo; // just casts DenseTimeValueModel *getConformingInput(); }; #endif sonic-visualiser-3.0.3/svcore/transform/Transform.cpp0000644000000000000000000003132013111512442021126 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Transform.h" #include "plugin/PluginIdentifier.h" #include "plugin/FeatureExtractionPluginFactory.h" #include "plugin/RealTimePluginFactory.h" #include #include #include #include #include #include #include Transform::Transform() : m_summaryType(NoSummary), m_stepSize(0), m_blockSize(0), m_windowType(HanningWindow), m_sampleRate(0) { } Transform::Transform(QString xml) : m_summaryType(NoSummary), m_stepSize(0), m_blockSize(0), m_windowType(HanningWindow), m_sampleRate(0) { QDomDocument doc; QString error; int errorLine; int errorColumn; if (!doc.setContent(xml, false, &error, &errorLine, &errorColumn)) { m_errorString = QString("%1 at line %2, column %3") .arg(error).arg(errorLine).arg(errorColumn); return; } QDomElement transformElt = doc.firstChildElement("transform"); QDomNamedNodeMap attrNodes = transformElt.attributes(); QXmlAttributes attrs; for (int i = 0; i < attrNodes.length(); ++i) { QDomAttr attr = attrNodes.item(i).toAttr(); if (!attr.isNull()) attrs.append(attr.name(), "", "", attr.value()); } setFromXmlAttributes(attrs); for (QDomElement paramElt = transformElt.firstChildElement("parameter"); !paramElt.isNull(); paramElt = paramElt.nextSiblingElement("parameter")) { QDomNamedNodeMap paramAttrs = paramElt.attributes(); QDomAttr nameAttr = paramAttrs.namedItem("name").toAttr(); if (nameAttr.isNull() || nameAttr.value() == "") continue; QDomAttr valueAttr = paramAttrs.namedItem("value").toAttr(); if (valueAttr.isNull() || valueAttr.value() == "") continue; setParameter(nameAttr.value(), valueAttr.value().toFloat()); } for (QDomElement configElt = transformElt.firstChildElement("configuration"); !configElt.isNull(); configElt = configElt.nextSiblingElement("configuration")) { QDomNamedNodeMap configAttrs = configElt.attributes(); QDomAttr nameAttr = configAttrs.namedItem("name").toAttr(); if (nameAttr.isNull() || nameAttr.value() == "") continue; QDomAttr valueAttr = configAttrs.namedItem("value").toAttr(); if (valueAttr.isNull() || valueAttr.value() == "") continue; setConfigurationValue(nameAttr.value(), valueAttr.value()); } } Transform::~Transform() { } bool Transform::operator==(const Transform &t) const { bool identical = m_id == t.m_id && m_parameters == t.m_parameters && m_configuration == t.m_configuration && m_program == t.m_program && m_summaryType == t.m_summaryType && m_stepSize == t.m_stepSize && m_blockSize == t.m_blockSize && m_windowType == t.m_windowType && m_startTime == t.m_startTime && m_duration == t.m_duration && m_sampleRate == t.m_sampleRate; /* SVDEBUG << "Transform::operator==: identical = " << identical << endl; cerr << "A = " << endl; cerr << toXmlString() << endl; cerr << "B = " << endl; cerr << t.toXmlString() << endl; */ return identical; } bool Transform::operator<(const Transform &t) const { if (m_id != t.m_id) { return m_id < t.m_id; } if (m_parameters != t.m_parameters) { return mapLessThan(m_parameters, t.m_parameters); } if (m_configuration != t.m_configuration) { return mapLessThan(m_configuration, t.m_configuration); } if (m_program != t.m_program) { return m_program < t.m_program; } if (m_summaryType != t.m_summaryType) { return int(m_summaryType) < int(t.m_summaryType); } if (m_stepSize != t.m_stepSize) { return m_stepSize < t.m_stepSize; } if (m_blockSize != t.m_blockSize) { return m_blockSize < t.m_blockSize; } if (m_windowType != t.m_windowType) { return m_windowType < t.m_windowType; } if (m_startTime != t.m_startTime) { return m_startTime < t.m_startTime; } if (m_duration != t.m_duration) { return m_duration < t.m_duration; } if (m_sampleRate != t.m_sampleRate) { return m_sampleRate < t.m_sampleRate; } return false; } void Transform::setIdentifier(TransformId id) { m_id = id; } TransformId Transform::getIdentifier() const { return m_id; } QString Transform::createIdentifier(QString type, QString soName, QString label, QString output) { QString pluginId = PluginIdentifier::createIdentifier(type, soName, label); return pluginId + ":" + output; } void Transform::parseIdentifier(QString identifier, QString &type, QString &soName, QString &label, QString &output) { output = identifier.section(':', 3); PluginIdentifier::parseIdentifier(identifier.section(':', 0, 2), type, soName, label); } Transform::Type Transform::getType() const { if (RealTimePluginFactory::instanceFor(getPluginIdentifier())) { return RealTimeEffect; } else { return FeatureExtraction; } } QString Transform::getPluginIdentifier() const { return m_id.section(':', 0, 2); } QString Transform::getOutput() const { return m_id.section(':', 3); } void Transform::setPluginIdentifier(QString pluginIdentifier) { m_id = pluginIdentifier + ':' + getOutput(); } void Transform::setOutput(QString output) { m_id = getPluginIdentifier() + ':' + output; } TransformId Transform::getIdentifierForPluginOutput(QString pluginIdentifier, QString output) { return pluginIdentifier + ':' + output; } const Transform::ParameterMap & Transform::getParameters() const { return m_parameters; } void Transform::setParameters(const ParameterMap &pm) { m_parameters = pm; } void Transform::setParameter(QString name, float value) { // SVDEBUG << "Transform::setParameter(" << name// << ") -> " << value << endl; m_parameters[name] = value; } const Transform::ConfigurationMap & Transform::getConfiguration() const { return m_configuration; } void Transform::setConfiguration(const ConfigurationMap &cm) { m_configuration = cm; } void Transform::setConfigurationValue(QString name, QString value) { SVDEBUG << "Transform::setConfigurationValue(" << name << ") -> " << value << endl; m_configuration[name] = value; } QString Transform::getPluginVersion() const { return m_pluginVersion; } void Transform::setPluginVersion(QString version) { m_pluginVersion = version; } QString Transform::getProgram() const { return m_program; } void Transform::setProgram(QString program) { m_program = program; } Transform::SummaryType Transform::getSummaryType() const { return m_summaryType; } void Transform::setSummaryType(SummaryType type) { m_summaryType = type; } int Transform::getStepSize() const { return m_stepSize; } void Transform::setStepSize(int s) { m_stepSize = s; } int Transform::getBlockSize() const { return m_blockSize; } void Transform::setBlockSize(int s) { m_blockSize = s; } WindowType Transform::getWindowType() const { return m_windowType; } void Transform::setWindowType(WindowType type) { m_windowType = type; } RealTime Transform::getStartTime() const { return m_startTime; } void Transform::setStartTime(RealTime t) { m_startTime = t; } RealTime Transform::getDuration() const { return m_duration; } void Transform::setDuration(RealTime d) { m_duration = d; } sv_samplerate_t Transform::getSampleRate() const { return m_sampleRate; } void Transform::setSampleRate(sv_samplerate_t rate) { m_sampleRate = rate; } void Transform::toXml(QTextStream &out, QString indent, QString extraAttributes) const { out << indent; bool haveContent = true; if (m_parameters.empty() && m_configuration.empty()) haveContent = false; out << QString("::getNameForType(m_windowType).c_str())) .arg(encodeEntities(m_startTime.toString().c_str())) .arg(encodeEntities(m_duration.toString().c_str())) .arg(m_sampleRate); if (m_summaryType != NoSummary) { out << QString("\n summaryType=\"%1\"").arg(summaryTypeToString(m_summaryType)); } if (extraAttributes != "") { out << " " << extraAttributes; } if (haveContent) { out << ">\n"; for (ParameterMap::const_iterator i = m_parameters.begin(); i != m_parameters.end(); ++i) { out << indent << " " << QString("\n") .arg(encodeEntities(i->first)) .arg(i->second); } for (ConfigurationMap::const_iterator i = m_configuration.begin(); i != m_configuration.end(); ++i) { out << indent << " " << QString("\n") .arg(encodeEntities(i->first)) .arg(encodeEntities(i->second)); } out << indent << "\n"; } else { out << "/>\n"; } } Transform::SummaryType Transform::stringToSummaryType(QString str) { str = str.toLower(); if (str == "minimum" || str == "min") return Minimum; if (str == "maximum" || str == "max") return Maximum; if (str == "mean") return Mean; if (str == "median") return Median; if (str == "mode") return Mode; if (str == "sum") return Sum; if (str == "variance") return Variance; if (str == "standard-deviation" || str == "standardDeviation" || str == "standard deviation" || str == "sd") return StandardDeviation; if (str == "count") return Count; if (str == "") return NoSummary; SVDEBUG << "Transform::stringToSummaryType: unknown summary type \"" << str << "\"" << endl; return NoSummary; } QString Transform::summaryTypeToString(SummaryType type) { switch (type) { case Minimum: return "min"; case Maximum: return "max"; case Mean: return "mean"; case Median: return "median"; case Mode: return "mode"; case Sum: return "sum"; case Variance: return "variance"; case StandardDeviation: return "sd"; case Count: return "count"; case NoSummary: return ""; default: SVDEBUG << "Transform::summaryTypeToString: unexpected summary type " << int(type) << endl; return ""; } } void Transform::setFromXmlAttributes(const QXmlAttributes &attrs) { if (attrs.value("id") != "") { setIdentifier(attrs.value("id")); } if (attrs.value("pluginVersion") != "") { setPluginVersion(attrs.value("pluginVersion")); } if (attrs.value("program") != "") { setProgram(attrs.value("program")); } if (attrs.value("stepSize") != "") { setStepSize(attrs.value("stepSize").toInt()); } if (attrs.value("blockSize") != "") { setBlockSize(attrs.value("blockSize").toInt()); } if (attrs.value("windowType") != "") { setWindowType(Window::getTypeForName (attrs.value("windowType").toStdString())); } if (attrs.value("startTime") != "") { setStartTime(RealTime::fromString(attrs.value("startTime").toStdString())); } if (attrs.value("duration") != "") { setDuration(RealTime::fromString(attrs.value("duration").toStdString())); } if (attrs.value("sampleRate") != "") { setSampleRate(attrs.value("sampleRate").toFloat()); } if (attrs.value("summaryType") != "") { setSummaryType(stringToSummaryType(attrs.value("summaryType"))); } } sonic-visualiser-3.0.3/svcore/transform/Transform.h0000644000000000000000000001463413111512442020604 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_H_ #define _TRANSFORM_H_ #include "base/XmlExportable.h" #include "base/Window.h" #include "base/RealTime.h" #include #include #include #include typedef QString TransformId; class QXmlAttributes; class Transform : public XmlExportable { public: /** * Construct a new Transform with default data and no identifier. * The Transform object will be meaningless until some data and an * identifier have been set on it. * * To construct a Transform for use with a particular transform * identifier, use TransformFactory::getDefaultTransformFor. */ Transform(); /** * Construct a Transform by parsing the given XML data string. * This is the inverse of toXml. If this fails, getErrorString() * will return a non-empty string. */ Transform(QString xml); virtual ~Transform(); /** * Compare two Transforms. They only compare equal if every data * element matches. */ bool operator==(const Transform &) const; /** * Order two Transforms, so that they can be used as keys in * containers. */ bool operator<(const Transform &) const; void setIdentifier(TransformId id); TransformId getIdentifier() const; enum Type { FeatureExtraction, RealTimeEffect, UnknownType }; Type getType() const; QString getPluginIdentifier() const; QString getOutput() const; void setPluginIdentifier(QString pluginIdentifier); void setOutput(QString output); // Turn a plugin ID and output name into a transform ID. Note // that our pluginIdentifier is the same thing as the Vamp SDK's // PluginLoader::PluginKey. static TransformId getIdentifierForPluginOutput(QString pluginIdentifier, QString output = ""); typedef std::map ParameterMap; const ParameterMap &getParameters() const; void setParameters(const ParameterMap &pm); void setParameter(QString name, float value); typedef std::map ConfigurationMap; const ConfigurationMap &getConfiguration() const; void setConfiguration(const ConfigurationMap &cm); void setConfigurationValue(QString name, QString value); enum SummaryType { // This is the same as Vamp::PluginSummarisingAdapter::SummaryType // except with NoSummary instead of UnknownSummaryType Minimum = 0, Maximum = 1, Mean = 2, Median = 3, Mode = 4, Sum = 5, Variance = 6, StandardDeviation = 7, Count = 8, NoSummary = 999 }; SummaryType getSummaryType() const; void setSummaryType(SummaryType type); QString getPluginVersion() const; void setPluginVersion(QString version); QString getProgram() const; void setProgram(QString program); int getStepSize() const; void setStepSize(int s); int getBlockSize() const; void setBlockSize(int s); WindowType getWindowType() const; void setWindowType(WindowType type); RealTime getStartTime() const; void setStartTime(RealTime t); RealTime getDuration() const; // 0 -> all void setDuration(RealTime d); sv_samplerate_t getSampleRate() const; // 0 -> as input void setSampleRate(sv_samplerate_t rate); void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; /** * Set the main transform data from the given XML attributes. * This does not set the parameters or configuration, which are * exported to separate XML elements rather than attributes of the * transform element. * * Note that this only sets those attributes which are actually * present in the argument. Any attributes not defined in the * attribute will remain unchanged in the Transform. If your aim * is to create a transform exactly matching the given attributes, * ensure you start from an empty transform rather than one that * has already been configured. */ void setFromXmlAttributes(const QXmlAttributes &); QString getErrorString() const { return m_errorString; } static SummaryType stringToSummaryType(QString); static QString summaryTypeToString(SummaryType); protected: TransformId m_id; // pluginid:output, that is type:soname:label:output static QString createIdentifier (QString type, QString soName, QString label, QString output); static void parseIdentifier (QString identifier, QString &type, QString &soName, QString &label, QString &output); template bool mapLessThan(const std::map &a, const std::map &b) const { // Return true if a is "less than" b. Ordering doesn't have // to be meaningful, just consistent. typename std::map::const_iterator i; typename std::map::const_iterator j; for (i = a.begin(), j = b.begin(); i != a.end(); ++i) { if (j == b.end()) return false; // a is longer than b if (i->first != j->first) return i->first < j->first; if (i->second != j->second) return i->second < j->second; } if (j != b.end()) return true; // a is shorter than b return false; // equal } ParameterMap m_parameters; ConfigurationMap m_configuration; SummaryType m_summaryType; QString m_pluginVersion; QString m_program; int m_stepSize; int m_blockSize; WindowType m_windowType; RealTime m_startTime; RealTime m_duration; sv_samplerate_t m_sampleRate; QString m_errorString; }; typedef std::vector Transforms; #endif sonic-visualiser-3.0.3/svcore/transform/TransformDescription.h0000644000000000000000000000611613111512442023004 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_DESCRIPTION_H_ #define _TRANSFORM_DESCRIPTION_H_ #include "Transform.h" #include #include /** * Metadata associated with a transform. * * The transform ID is the same as that used in the Transform class. * It is intended to be computer-referenceable and unique within the * application. * * The name is intended to be human readable. In principle it doesn't * have to be unique, but the factory that creates these objects * should add suffixes to ensure that it is, all the same (just to * avoid user confusion). * * The friendly name is a shorter version of the name. * * The type is also intended to be user-readable, for use in menus. * * To obtain these objects, use * TransformFactory::getAllTransformDescriptions and * TransformFactory::getTransformDescription. */ struct TransformDescription { enum Type { Analysis, // e.g. vamp plugin output Effects, // e.g. ladspa plugin with audio in and out EffectsData, // e.g. control output of ladspa plugin Generator, // e.g. audio out of ladspa plugin with no audio in UnknownType }; TransformDescription() : type(UnknownType), configurable(false) { } TransformDescription(Type _type, QString _category, TransformId _identifier, QString _name, QString _friendlyName, QString _description, QString _longDescription, QString _maker, QString _units, bool _configurable) : type(_type), category(_category), identifier(_identifier), name(_name), friendlyName(_friendlyName), description(_description), longDescription(_longDescription), maker(_maker), units(_units), configurable(_configurable) { } Type type; QString category; // e.g. time > onsets TransformId identifier; // e.g. vamp:vamp-aubio:aubioonset QString name; // plugin's name if 1 output, else "name: output" QString friendlyName; // short text for layer name QString description; // sentence describing transform QString longDescription; // description "using" plugin name "by" maker QString maker; QString infoUrl; QString units; bool configurable; bool operator<(const TransformDescription &od) const { return (name < od.name) || (name == od.name && identifier < od.identifier); }; }; typedef std::vector TransformList; #endif sonic-visualiser-3.0.3/svcore/transform/TransformFactory.cpp0000644000000000000000000011123513111512442022462 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "TransformFactory.h" #include "plugin/FeatureExtractionPluginFactory.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/RealTimePluginInstance.h" #include "plugin/PluginXml.h" #include #include #include #include "rdf/PluginRDFIndexer.h" #include "rdf/PluginRDFDescription.h" #include "base/XmlExportable.h" #include #include #include #include #include "base/Thread.h" //#define DEBUG_TRANSFORM_FACTORY 1 TransformFactory * TransformFactory::m_instance = new TransformFactory; TransformFactory * TransformFactory::getInstance() { return m_instance; } void TransformFactory::deleteInstance() { SVDEBUG << "TransformFactory::deleteInstance called" << endl; delete m_instance; m_instance = 0; } TransformFactory::TransformFactory() : m_transformsPopulated(false), m_uninstalledTransformsPopulated(false), m_thread(0), m_exiting(false), m_populatingSlowly(false) { } TransformFactory::~TransformFactory() { m_exiting = true; if (m_thread) { #ifdef DEBUG_TRANSFORM_FACTORY SVDEBUG << "TransformFactory::~TransformFactory: waiting on thread" << endl; #endif m_thread->wait(); delete m_thread; #ifdef DEBUG_TRANSFORM_FACTORY SVDEBUG << "TransformFactory::~TransformFactory: waited and done" << endl; #endif } } void TransformFactory::startPopulationThread() { m_uninstalledTransformsMutex.lock(); if (m_thread) { m_uninstalledTransformsMutex.unlock(); return; } m_thread = new UninstalledTransformsPopulateThread(this); m_uninstalledTransformsMutex.unlock(); m_thread->start(); } void TransformFactory::UninstalledTransformsPopulateThread::run() { m_factory->m_populatingSlowly = true; sleep(1); m_factory->populateUninstalledTransforms(); } TransformList TransformFactory::getAllTransformDescriptions() { populateTransforms(); std::set dset; for (TransformDescriptionMap::const_iterator i = m_transforms.begin(); i != m_transforms.end(); ++i) { #ifdef DEBUG_TRANSFORM_FACTORY cerr << "inserting transform into set: id = " << i->second.identifier << endl; #endif dset.insert(i->second); } TransformList list; for (std::set::const_iterator i = dset.begin(); i != dset.end(); ++i) { #ifdef DEBUG_TRANSFORM_FACTORY cerr << "inserting transform into list: id = " << i->identifier << endl; #endif list.push_back(*i); } return list; } TransformDescription TransformFactory::getTransformDescription(TransformId id) { populateTransforms(); if (m_transforms.find(id) == m_transforms.end()) { return TransformDescription(); } return m_transforms[id]; } bool TransformFactory::haveInstalledTransforms() { populateTransforms(); return !m_transforms.empty(); } TransformList TransformFactory::getUninstalledTransformDescriptions() { m_populatingSlowly = false; populateUninstalledTransforms(); std::set dset; for (TransformDescriptionMap::const_iterator i = m_uninstalledTransforms.begin(); i != m_uninstalledTransforms.end(); ++i) { #ifdef DEBUG_TRANSFORM_FACTORY cerr << "inserting transform into set: id = " << i->second.identifier << endl; #endif dset.insert(i->second); } TransformList list; for (std::set::const_iterator i = dset.begin(); i != dset.end(); ++i) { #ifdef DEBUG_TRANSFORM_FACTORY cerr << "inserting transform into uninstalled list: id = " << i->identifier << endl; #endif list.push_back(*i); } return list; } TransformDescription TransformFactory::getUninstalledTransformDescription(TransformId id) { m_populatingSlowly = false; populateUninstalledTransforms(); if (m_uninstalledTransforms.find(id) == m_uninstalledTransforms.end()) { return TransformDescription(); } return m_uninstalledTransforms[id]; } bool TransformFactory::haveUninstalledTransforms(bool waitForCheckToComplete) { if (waitForCheckToComplete) { populateUninstalledTransforms(); } else { if (!m_uninstalledTransformsMutex.tryLock()) { return false; } if (!m_uninstalledTransformsPopulated) { m_uninstalledTransformsMutex.unlock(); return false; } m_uninstalledTransformsMutex.unlock(); } return !m_uninstalledTransforms.empty(); } TransformFactory::TransformInstallStatus TransformFactory::getTransformInstallStatus(TransformId id) { populateTransforms(); if (m_transforms.find(id) != m_transforms.end()) { return TransformInstalled; } if (!m_uninstalledTransformsMutex.tryLock()) { // uninstalled transforms are being populated; this may take some time, // and they aren't critical return TransformUnknown; } if (!m_uninstalledTransformsPopulated) { m_uninstalledTransformsMutex.unlock(); m_populatingSlowly = false; populateUninstalledTransforms(); m_uninstalledTransformsMutex.lock(); } if (m_uninstalledTransforms.find(id) != m_uninstalledTransforms.end()) { m_uninstalledTransformsMutex.unlock(); return TransformNotInstalled; } m_uninstalledTransformsMutex.unlock(); return TransformUnknown; } std::vector TransformFactory::getAllTransformTypes() { populateTransforms(); std::set types; for (TransformDescriptionMap::const_iterator i = m_transforms.begin(); i != m_transforms.end(); ++i) { types.insert(i->second.type); } std::vector rv; for (std::set::iterator i = types.begin(); i != types.end(); ++i) { rv.push_back(*i); } return rv; } std::vector TransformFactory::getTransformCategories(TransformDescription::Type transformType) { populateTransforms(); std::set categories; for (TransformDescriptionMap::const_iterator i = m_transforms.begin(); i != m_transforms.end(); ++i) { if (i->second.type == transformType) { categories.insert(i->second.category); } } bool haveEmpty = false; std::vector rv; for (std::set::iterator i = categories.begin(); i != categories.end(); ++i) { if (*i != "") rv.push_back(*i); else haveEmpty = true; } if (haveEmpty) rv.push_back(""); // make sure empty category sorts last return rv; } std::vector TransformFactory::getTransformMakers(TransformDescription::Type transformType) { populateTransforms(); std::set makers; for (TransformDescriptionMap::const_iterator i = m_transforms.begin(); i != m_transforms.end(); ++i) { if (i->second.type == transformType) { makers.insert(i->second.maker); } } bool haveEmpty = false; std::vector rv; for (std::set::iterator i = makers.begin(); i != makers.end(); ++i) { if (*i != "") rv.push_back(*i); else haveEmpty = true; } if (haveEmpty) rv.push_back(""); // make sure empty category sorts last return rv; } QString TransformFactory::getTransformTypeName(TransformDescription::Type type) const { switch (type) { case TransformDescription::Analysis: return tr("Analysis"); case TransformDescription::Effects: return tr("Effects"); case TransformDescription::EffectsData: return tr("Effects Data"); case TransformDescription::Generator: return tr("Generator"); case TransformDescription::UnknownType: return tr("Other"); } return tr("Other"); } void TransformFactory::populateTransforms() { MutexLocker locker(&m_transformsMutex, "TransformFactory::populateTransforms"); if (m_transformsPopulated) { return; } TransformDescriptionMap transforms; populateFeatureExtractionPlugins(transforms); if (m_exiting) return; populateRealTimePlugins(transforms); if (m_exiting) return; // disambiguate plugins with similar names std::map names; std::map pluginSources; std::map pluginMakers; for (TransformDescriptionMap::iterator i = transforms.begin(); i != transforms.end(); ++i) { TransformDescription desc = i->second; QString td = desc.name; QString tn = td.section(": ", 0, 0); QString pn = desc.identifier.section(":", 1, 1); if (pluginSources.find(tn) != pluginSources.end()) { if (pluginSources[tn] != pn && pluginMakers[tn] != desc.maker) { ++names[tn]; } } else { ++names[tn]; pluginSources[tn] = pn; pluginMakers[tn] = desc.maker; } } std::map counts; m_transforms.clear(); for (TransformDescriptionMap::iterator i = transforms.begin(); i != transforms.end(); ++i) { TransformDescription desc = i->second; QString identifier = desc.identifier; QString maker = desc.maker; QString td = desc.name; QString tn = td.section(": ", 0, 0); QString to = td.section(": ", 1); if (names[tn] > 1) { maker.replace(QRegExp(tr(" [\\(<].*$")), ""); tn = QString("%1 [%2]").arg(tn).arg(maker); } if (to != "") { desc.name = QString("%1: %2").arg(tn).arg(to); } else { desc.name = tn; } m_transforms[identifier] = desc; } m_transformsPopulated = true; } void TransformFactory::populateFeatureExtractionPlugins(TransformDescriptionMap &transforms) { FeatureExtractionPluginFactory *factory = FeatureExtractionPluginFactory::instance(); QString errorMessage; std::vector plugs = factory->getPluginIdentifiers(errorMessage); if (errorMessage != "") { m_errorString = tr("Failed to list Vamp plugins: %1").arg(errorMessage); } if (m_exiting) return; for (int i = 0; i < (int)plugs.size(); ++i) { QString pluginId = plugs[i]; piper_vamp::PluginStaticData psd = factory->getPluginStaticData(pluginId); if (psd.pluginKey == "") { cerr << "WARNING: TransformFactory::populateTransforms: No plugin static data available for instance " << pluginId << endl; continue; } QString pluginName = QString::fromStdString(psd.basic.name); QString category = factory->getPluginCategory(pluginId); const auto &basicOutputs = psd.basicOutputInfo; for (const auto &o: basicOutputs) { QString outputName = QString::fromStdString(o.name); QString transformId = QString("%1:%2") .arg(pluginId).arg(QString::fromStdString(o.identifier)); QString userName; QString friendlyName; //!!! return to this QString units = outputs[j].unit.c_str(); QString description = QString::fromStdString(psd.basic.description); QString maker = QString::fromStdString(psd.maker); if (maker == "") maker = tr(""); QString longDescription = description; if (longDescription == "") { if (basicOutputs.size() == 1) { longDescription = tr("Extract features using \"%1\" plugin (from %2)") .arg(pluginName).arg(maker); } else { longDescription = tr("Extract features using \"%1\" output of \"%2\" plugin (from %3)") .arg(outputName).arg(pluginName).arg(maker); } } else { if (basicOutputs.size() == 1) { longDescription = tr("%1 using \"%2\" plugin (from %3)") .arg(longDescription).arg(pluginName).arg(maker); } else { longDescription = tr("%1 using \"%2\" output of \"%3\" plugin (from %4)") .arg(longDescription).arg(outputName).arg(pluginName).arg(maker); } } if (basicOutputs.size() == 1) { userName = pluginName; friendlyName = pluginName; } else { userName = QString("%1: %2").arg(pluginName).arg(outputName); friendlyName = outputName; } bool configurable = (!psd.programs.empty() || !psd.parameters.empty()); #ifdef DEBUG_TRANSFORM_FACTORY cerr << "Feature extraction plugin transform: " << transformId << " friendly name: " << friendlyName << endl; #endif transforms[transformId] = TransformDescription(TransformDescription::Analysis, category, transformId, userName, friendlyName, description, longDescription, maker, //!!! units, "", configurable); } } } void TransformFactory::populateRealTimePlugins(TransformDescriptionMap &transforms) { std::vector plugs = RealTimePluginFactory::getAllPluginIdentifiers(); if (m_exiting) return; static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$"); for (int i = 0; i < (int)plugs.size(); ++i) { QString pluginId = plugs[i]; RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(pluginId); if (!factory) { cerr << "WARNING: TransformFactory::populateTransforms: No real time plugin factory for instance " << pluginId << endl; continue; } const RealTimePluginDescriptor *descriptor = factory->getPluginDescriptor(pluginId); if (!descriptor) { cerr << "WARNING: TransformFactory::populateTransforms: Failed to query plugin " << pluginId << endl; continue; } //!!! if (descriptor->controlOutputPortCount == 0 || // descriptor->audioInputPortCount == 0) continue; // cout << "TransformFactory::populateRealTimePlugins: plugin " << pluginId << " has " << descriptor->controlOutputPortCount << " control output ports, " << descriptor->audioOutputPortCount << " audio outputs, " << descriptor->audioInputPortCount << " audio inputs" << endl; QString pluginName = descriptor->name.c_str(); QString category = factory->getPluginCategory(pluginId); bool configurable = (descriptor->parameterCount > 0); QString maker = descriptor->maker.c_str(); if (maker == "") maker = tr(""); if (descriptor->audioInputPortCount > 0) { for (int j = 0; j < (int)descriptor->controlOutputPortCount; ++j) { QString transformId = QString("%1:%2").arg(pluginId).arg(j); QString userName; QString units; QString portName; if (j < (int)descriptor->controlOutputPortNames.size() && descriptor->controlOutputPortNames[j] != "") { portName = descriptor->controlOutputPortNames[j].c_str(); userName = tr("%1: %2") .arg(pluginName) .arg(portName); if (unitRE.indexIn(portName) >= 0) { units = unitRE.cap(1); } } else if (descriptor->controlOutputPortCount > 1) { userName = tr("%1: Output %2") .arg(pluginName) .arg(j + 1); } else { userName = pluginName; } QString description; if (portName != "") { description = tr("Extract \"%1\" data output from \"%2\" effect plugin (from %3)") .arg(portName) .arg(pluginName) .arg(maker); } else { description = tr("Extract data output %1 from \"%2\" effect plugin (from %3)") .arg(j + 1) .arg(pluginName) .arg(maker); } transforms[transformId] = TransformDescription(TransformDescription::EffectsData, category, transformId, userName, userName, "", description, maker, units, configurable); } } if (!descriptor->isSynth || descriptor->audioInputPortCount > 0) { if (descriptor->audioOutputPortCount > 0) { QString transformId = QString("%1:A").arg(pluginId); TransformDescription::Type type = TransformDescription::Effects; QString description = tr("Transform audio signal with \"%1\" effect plugin (from %2)") .arg(pluginName) .arg(maker); if (descriptor->audioInputPortCount == 0) { type = TransformDescription::Generator; QString description = tr("Generate audio signal using \"%1\" plugin (from %2)") .arg(pluginName) .arg(maker); } transforms[transformId] = TransformDescription(type, category, transformId, pluginName, pluginName, "", description, maker, "", configurable); } } } } void TransformFactory::populateUninstalledTransforms() { if (m_exiting) return; populateTransforms(); if (m_exiting) return; MutexLocker locker(&m_uninstalledTransformsMutex, "TransformFactory::populateUninstalledTransforms"); if (m_uninstalledTransformsPopulated) return; PluginRDFIndexer::getInstance()->indexConfiguredURLs(); if (m_exiting) return; //!!! This will be amazingly slow QStringList ids = PluginRDFIndexer::getInstance()->getIndexedPluginIds(); for (QStringList::const_iterator i = ids.begin(); i != ids.end(); ++i) { PluginRDFDescription desc(*i); QString name = desc.getPluginName(); #ifdef DEBUG_TRANSFORM_FACTORY if (name == "") { cerr << "TransformFactory::populateUninstalledTransforms: " << "No name available for plugin " << *i << ", skipping" << endl; continue; } #endif QString description = desc.getPluginDescription(); QString maker = desc.getPluginMaker(); QString infoUrl = desc.getPluginInfoURL(); QStringList oids = desc.getOutputIds(); for (QStringList::const_iterator j = oids.begin(); j != oids.end(); ++j) { TransformId tid = Transform::getIdentifierForPluginOutput(*i, *j); if (m_transforms.find(tid) != m_transforms.end()) { #ifdef DEBUG_TRANSFORM_FACTORY cerr << "TransformFactory::populateUninstalledTransforms: " << tid << " is installed; adding info url if appropriate, skipping rest" << endl; #endif if (infoUrl != "") { if (m_transforms[tid].infoUrl == "") { m_transforms[tid].infoUrl = infoUrl; } } continue; } #ifdef DEBUG_TRANSFORM_FACTORY cerr << "TransformFactory::populateUninstalledTransforms: " << "adding " << tid << endl; #endif QString oname = desc.getOutputName(*j); if (oname == "") oname = *j; TransformDescription td; td.type = TransformDescription::Analysis; td.category = ""; td.identifier = tid; if (oids.size() == 1) { td.name = name; } else if (name != "") { td.name = tr("%1: %2").arg(name).arg(oname); } QString longDescription = description; //!!! basically duplicated from above if (longDescription == "") { if (oids.size() == 1) { longDescription = tr("Extract features using \"%1\" plugin (from %2)") .arg(name).arg(maker); } else { longDescription = tr("Extract features using \"%1\" output of \"%2\" plugin (from %3)") .arg(oname).arg(name).arg(maker); } } else { if (oids.size() == 1) { longDescription = tr("%1 using \"%2\" plugin (from %3)") .arg(longDescription).arg(name).arg(maker); } else { longDescription = tr("%1 using \"%2\" output of \"%3\" plugin (from %4)") .arg(longDescription).arg(oname).arg(name).arg(maker); } } td.friendlyName = name; //!!!??? td.description = description; td.longDescription = longDescription; td.maker = maker; td.infoUrl = infoUrl; td.units = ""; td.configurable = false; m_uninstalledTransforms[tid] = td; } if (m_exiting) return; } m_uninstalledTransformsPopulated = true; #ifdef DEBUG_TRANSFORM_FACTORY cerr << "populateUninstalledTransforms exiting" << endl; #endif } Transform TransformFactory::getDefaultTransformFor(TransformId id, sv_samplerate_t rate) { Transform t; t.setIdentifier(id); if (rate != 0) t.setSampleRate(rate); SVDEBUG << "TransformFactory::getDefaultTransformFor: identifier \"" << id << "\"" << endl; Vamp::PluginBase *plugin = instantiateDefaultPluginFor(id, rate); if (plugin) { t.setPluginVersion(QString("%1").arg(plugin->getPluginVersion())); setParametersFromPlugin(t, plugin); makeContextConsistentWithPlugin(t, plugin); delete plugin; } return t; } Vamp::PluginBase * TransformFactory::instantiatePluginFor(const Transform &transform) { SVDEBUG << "TransformFactory::instantiatePluginFor: identifier \"" << transform.getIdentifier() << "\"" << endl; Vamp::PluginBase *plugin = instantiateDefaultPluginFor (transform.getIdentifier(), transform.getSampleRate()); if (plugin) { setPluginParameters(transform, plugin); } return plugin; } Vamp::PluginBase * TransformFactory::instantiateDefaultPluginFor(TransformId identifier, sv_samplerate_t rate) { Transform t; t.setIdentifier(identifier); if (rate == 0) rate = 44100.0; QString pluginId = t.getPluginIdentifier(); Vamp::PluginBase *plugin = 0; if (t.getType() == Transform::FeatureExtraction) { SVDEBUG << "TransformFactory::instantiateDefaultPluginFor: identifier \"" << identifier << "\" is a feature extraction transform" << endl; FeatureExtractionPluginFactory *factory = FeatureExtractionPluginFactory::instance(); if (factory) { plugin = factory->instantiatePlugin(pluginId, rate); } } else if (t.getType() == Transform::RealTimeEffect) { SVDEBUG << "TransformFactory::instantiateDefaultPluginFor: identifier \"" << identifier << "\" is a real-time transform" << endl; RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(pluginId); if (factory) { plugin = factory->instantiatePlugin(pluginId, 0, 0, rate, 1024, 1); } } else { SVDEBUG << "TransformFactory: ERROR: transform id \"" << identifier << "\" is of unknown type" << endl; } return plugin; } Vamp::Plugin * TransformFactory::downcastVampPlugin(Vamp::PluginBase *plugin) { Vamp::Plugin *vp = dynamic_cast(plugin); if (!vp) { // cerr << "makeConsistentWithPlugin: not a Vamp::Plugin" << endl; vp = dynamic_cast(plugin); //!!! why? } if (!vp) { // cerr << "makeConsistentWithPlugin: not a Vamp::PluginHostAdapter" << endl; vp = dynamic_cast(plugin); //!!! no, I mean really why? } if (!vp) { // cerr << "makeConsistentWithPlugin: not a Vamp::HostExt::PluginWrapper" << endl; } return vp; } bool TransformFactory::haveTransform(TransformId identifier) { populateTransforms(); return (m_transforms.find(identifier) != m_transforms.end()); } QString TransformFactory::getTransformName(TransformId identifier) { if (m_transforms.find(identifier) != m_transforms.end()) { return m_transforms[identifier].name; } else return ""; } QString TransformFactory::getTransformFriendlyName(TransformId identifier) { if (m_transforms.find(identifier) != m_transforms.end()) { return m_transforms[identifier].friendlyName; } else return ""; } QString TransformFactory::getTransformUnits(TransformId identifier) { if (m_transforms.find(identifier) != m_transforms.end()) { return m_transforms[identifier].units; } else return ""; } QString TransformFactory::getTransformInfoUrl(TransformId identifier) { if (m_transforms.find(identifier) != m_transforms.end()) { return m_transforms[identifier].infoUrl; } else return ""; } Vamp::Plugin::InputDomain TransformFactory::getTransformInputDomain(TransformId identifier) { Transform transform; transform.setIdentifier(identifier); SVDEBUG << "TransformFactory::getTransformInputDomain: identifier \"" << identifier << "\"" << endl; if (transform.getType() != Transform::FeatureExtraction) { return Vamp::Plugin::TimeDomain; } Vamp::Plugin *plugin = downcastVampPlugin(instantiateDefaultPluginFor(identifier, 0)); if (plugin) { Vamp::Plugin::InputDomain d = plugin->getInputDomain(); delete plugin; return d; } return Vamp::Plugin::TimeDomain; } bool TransformFactory::isTransformConfigurable(TransformId identifier) { if (m_transforms.find(identifier) != m_transforms.end()) { return m_transforms[identifier].configurable; } else return false; } bool TransformFactory::getTransformChannelRange(TransformId identifier, int &min, int &max) { QString id = identifier.section(':', 0, 2); if (RealTimePluginFactory::instanceFor(id)) { const RealTimePluginDescriptor *descriptor = RealTimePluginFactory::instanceFor(id)-> getPluginDescriptor(id); if (!descriptor) return false; min = descriptor->audioInputPortCount; max = descriptor->audioInputPortCount; return true; } else { auto psd = FeatureExtractionPluginFactory::instance()-> getPluginStaticData(id); if (psd.pluginKey == "") return false; min = (int)psd.minChannelCount; max = (int)psd.maxChannelCount; return true; } return false; } void TransformFactory::setParametersFromPlugin(Transform &transform, Vamp::PluginBase *plugin) { Transform::ParameterMap pmap; //!!! record plugin & API version //!!! check that this is the right plugin! Vamp::PluginBase::ParameterList parameters = plugin->getParameterDescriptors(); for (Vamp::PluginBase::ParameterList::const_iterator i = parameters.begin(); i != parameters.end(); ++i) { pmap[i->identifier.c_str()] = plugin->getParameter(i->identifier); // cerr << "TransformFactory::setParametersFromPlugin: parameter " // << i->identifier << " -> value " << // pmap[i->identifier.c_str()] << endl; } transform.setParameters(pmap); if (plugin->getPrograms().empty()) { transform.setProgram(""); } else { transform.setProgram(plugin->getCurrentProgram().c_str()); } RealTimePluginInstance *rtpi = dynamic_cast(plugin); Transform::ConfigurationMap cmap; if (rtpi) { RealTimePluginInstance::ConfigurationPairMap configurePairs = rtpi->getConfigurePairs(); for (RealTimePluginInstance::ConfigurationPairMap::const_iterator i = configurePairs.begin(); i != configurePairs.end(); ++i) { cmap[i->first.c_str()] = i->second.c_str(); } } transform.setConfiguration(cmap); } void TransformFactory::setPluginParameters(const Transform &transform, Vamp::PluginBase *plugin) { //!!! check plugin & API version (see e.g. PluginXml::setParameters) //!!! check that this is the right plugin! RealTimePluginInstance *rtpi = dynamic_cast(plugin); if (rtpi) { const Transform::ConfigurationMap &cmap = transform.getConfiguration(); for (Transform::ConfigurationMap::const_iterator i = cmap.begin(); i != cmap.end(); ++i) { rtpi->configure(i->first.toStdString(), i->second.toStdString()); } } if (transform.getProgram() != "") { plugin->selectProgram(transform.getProgram().toStdString()); } const Transform::ParameterMap &pmap = transform.getParameters(); Vamp::PluginBase::ParameterList parameters = plugin->getParameterDescriptors(); for (Vamp::PluginBase::ParameterList::const_iterator i = parameters.begin(); i != parameters.end(); ++i) { QString key = i->identifier.c_str(); Transform::ParameterMap::const_iterator pmi = pmap.find(key); if (pmi != pmap.end()) { plugin->setParameter(i->identifier, pmi->second); } } } void TransformFactory::makeContextConsistentWithPlugin(Transform &transform, Vamp::PluginBase *plugin) { const Vamp::Plugin *vp = downcastVampPlugin(plugin); if (!vp) { // time domain input for real-time effects plugin if (!transform.getBlockSize()) { if (!transform.getStepSize()) transform.setStepSize(1024); transform.setBlockSize(transform.getStepSize()); } else { transform.setStepSize(transform.getBlockSize()); } } else { Vamp::Plugin::InputDomain domain = vp->getInputDomain(); if (!transform.getStepSize()) { transform.setStepSize((int)vp->getPreferredStepSize()); } if (!transform.getBlockSize()) { transform.setBlockSize((int)vp->getPreferredBlockSize()); } if (!transform.getBlockSize()) { transform.setBlockSize(1024); } if (!transform.getStepSize()) { if (domain == Vamp::Plugin::FrequencyDomain) { // cerr << "frequency domain, step = " << blockSize/2 << endl; transform.setStepSize(transform.getBlockSize()/2); } else { // cerr << "time domain, step = " << blockSize/2 << endl; transform.setStepSize(transform.getBlockSize()); } } } } QString TransformFactory::getPluginConfigurationXml(const Transform &t) { QString xml; SVDEBUG << "TransformFactory::getPluginConfigurationXml: identifier \"" << t.getIdentifier() << "\"" << endl; Vamp::PluginBase *plugin = instantiateDefaultPluginFor (t.getIdentifier(), 0); if (!plugin) { SVDEBUG << "TransformFactory::getPluginConfigurationXml: " << "Unable to instantiate plugin for transform \"" << t.getIdentifier() << "\"" << endl; return xml; } setPluginParameters(t, plugin); QTextStream out(&xml); PluginXml(plugin).toXml(out); delete plugin; return xml; } void TransformFactory::setParametersFromPluginConfigurationXml(Transform &t, QString xml) { SVDEBUG << "TransformFactory::setParametersFromPluginConfigurationXml: identifier \"" << t.getIdentifier() << "\"" << endl; Vamp::PluginBase *plugin = instantiateDefaultPluginFor (t.getIdentifier(), 0); if (!plugin) { SVDEBUG << "TransformFactory::setParametersFromPluginConfigurationXml: " << "Unable to instantiate plugin for transform \"" << t.getIdentifier() << "\"" << endl; return; } PluginXml(plugin).setParametersFromXml(xml); setParametersFromPlugin(t, plugin); delete plugin; } TransformFactory::SearchResults TransformFactory::search(QString keyword) { QStringList keywords; keywords << keyword; return search(keywords); } TransformFactory::SearchResults TransformFactory::search(QStringList keywords) { populateTransforms(); if (keywords.size() > 1) { // Additional score for all keywords in a row keywords.push_back(keywords.join(" ")); } SearchResults results; TextMatcher matcher; for (TransformDescriptionMap::const_iterator i = m_transforms.begin(); i != m_transforms.end(); ++i) { TextMatcher::Match match; match.key = i->first; matcher.test(match, keywords, getTransformTypeName(i->second.type), tr("Plugin type"), 5); matcher.test(match, keywords, i->second.category, tr("Category"), 20); matcher.test(match, keywords, i->second.identifier, tr("System Identifier"), 6); matcher.test(match, keywords, i->second.name, tr("Name"), 30); matcher.test(match, keywords, i->second.description, tr("Description"), 20); matcher.test(match, keywords, i->second.maker, tr("Maker"), 10); matcher.test(match, keywords, i->second.units, tr("Units"), 10); if (match.score > 0) results[i->first] = match; } if (!m_uninstalledTransformsMutex.tryLock()) { // uninstalled transforms are being populated; this may take some time, // and they aren't critical, but we will speed them up if necessary SVDEBUG << "TransformFactory::search: Uninstalled transforms mutex is held, skipping" << endl; m_populatingSlowly = false; return results; } if (!m_uninstalledTransformsPopulated) { SVDEBUG << "WARNING: TransformFactory::search: Uninstalled transforms are not populated yet" << endl << "and are not being populated either -- was the thread not started correctly?" << endl; m_uninstalledTransformsMutex.unlock(); return results; } m_uninstalledTransformsMutex.unlock(); for (TransformDescriptionMap::const_iterator i = m_uninstalledTransforms.begin(); i != m_uninstalledTransforms.end(); ++i) { TextMatcher::Match match; match.key = i->first; matcher.test(match, keywords, getTransformTypeName(i->second.type), tr("Plugin type"), 2); matcher.test(match, keywords, i->second.category, tr("Category"), 10); matcher.test(match, keywords, i->second.identifier, tr("System Identifier"), 3); matcher.test(match, keywords, i->second.name, tr("Name"), 15); matcher.test(match, keywords, i->second.description, tr("Description"), 10); matcher.test(match, keywords, i->second.maker, tr("Maker"), 5); matcher.test(match, keywords, i->second.units, tr("Units"), 5); if (match.score > 0) results[i->first] = match; } return results; } sonic-visualiser-3.0.3/svcore/transform/TransformFactory.h0000644000000000000000000002031613111512442022126 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_FACTORY_H_ #define _TRANSFORM_FACTORY_H_ #include "TransformDescription.h" #include "base/TextMatcher.h" #include #include #include #include #include #include #include class TransformFactory : public QObject { Q_OBJECT public: TransformFactory(); virtual ~TransformFactory(); static TransformFactory *getInstance(); static void deleteInstance(); // only when exiting /** * TransformFactory has a background thread that can populate * uninstalled transforms from network RDF resources. It is not * started by default, but it's a good idea to start it when the * program starts up, if the uninstalled transforms may be of use * later; otherwise there will be a bottleneck the first time * they're requested. * * If this thread is not already running, start it now. */ void startPopulationThread(); TransformList getAllTransformDescriptions(); TransformDescription getTransformDescription(TransformId id); bool haveInstalledTransforms(); TransformList getUninstalledTransformDescriptions(); TransformDescription getUninstalledTransformDescription(TransformId id); bool haveUninstalledTransforms(bool waitForCheckToComplete = false); typedef enum { TransformUnknown, TransformInstalled, TransformNotInstalled } TransformInstallStatus; TransformInstallStatus getTransformInstallStatus(TransformId id); std::vector getAllTransformTypes(); std::vector getTransformCategories(TransformDescription::Type); std::vector getTransformMakers(TransformDescription::Type); QString getTransformTypeName(TransformDescription::Type) const; typedef std::map SearchResults; SearchResults search(QString keyword); SearchResults search(QStringList keywords); /** * Return true if the given transform is known. */ bool haveTransform(TransformId identifier); /** * A single transform ID can lead to many possible Transforms, * with different parameters and execution context settings. * Return the default one for the given transform. */ Transform getDefaultTransformFor(TransformId identifier, sv_samplerate_t rate = 0); /** * Full name of a transform, suitable for putting on a menu. */ QString getTransformName(TransformId identifier); /** * Brief but friendly name of a transform, suitable for use * as the name of the output layer. */ QString getTransformFriendlyName(TransformId identifier); QString getTransformUnits(TransformId identifier); QString getTransformInfoUrl(TransformId identifier); Vamp::Plugin::InputDomain getTransformInputDomain(TransformId identifier); /** * Return true if the transform has any configurable parameters, * i.e. if getConfigurationForTransform can ever return a non-trivial * (not equivalent to empty) configuration string. */ bool isTransformConfigurable(TransformId identifier); /** * If the transform has a prescribed number or range of channel * inputs, return true and set minChannels and maxChannels to the * minimum and maximum number of channel inputs the transform can * accept. Return false if it doesn't care. */ bool getTransformChannelRange(TransformId identifier, int &minChannels, int &maxChannels); /** * Load an appropriate plugin for the given transform and set the * parameters, program and configuration strings on that plugin * from the Transform object. * * Note that this requires that the transform has a meaningful * sample rate set, as that is used as the rate for the plugin. A * Transform can legitimately have rate set at zero (= "use the * rate of the input source"), so the caller will need to test for * this case. * * Returns the plugin thus loaded. This will be a * Vamp::PluginBase, but not necessarily a Vamp::Plugin (only if * the transform was a feature-extraction type -- call * downcastVampPlugin if you only want Vamp::Plugins). Returns * NULL if no suitable plugin was available. * * The returned plugin is owned by the caller, and should be * deleted (using "delete") when no longer needed. */ Vamp::PluginBase *instantiatePluginFor(const Transform &transform); /** * Convert a Vamp::PluginBase to a Vamp::Plugin, if it is one. * Return NULL otherwise. This ill-fitting convenience function * is really just a dynamic_cast wrapper. */ Vamp::Plugin *downcastVampPlugin(Vamp::PluginBase *); /** * Set the plugin parameters, program and configuration strings on * the given Transform object from the given plugin instance. * Note that no check is made whether the plugin is actually the * "correct" one for the transform. */ void setParametersFromPlugin(Transform &transform, Vamp::PluginBase *plugin); /** * Set the parameters, program and configuration strings on the * given plugin from the given Transform object. */ void setPluginParameters(const Transform &transform, Vamp::PluginBase *plugin); /** * If the given Transform object has no processing step and block * sizes set, set them to appropriate defaults for the given * plugin. */ void makeContextConsistentWithPlugin(Transform &transform, Vamp::PluginBase *plugin); /** * Retrieve a XML fragment that describes the * plugin parameters, program and configuration data for the given * transform. * * This function is provided for backward compatibility only. Use * Transform::toXml where compatibility with PluginXml * descriptions of transforms is not required. */ QString getPluginConfigurationXml(const Transform &transform); /** * Set the plugin parameters, program and configuration strings on * the given Transform object from the given XML * fragment. * * This function is provided for backward compatibility only. Use * Transform(QString) where compatibility with PluginXml * descriptions of transforms is not required. */ void setParametersFromPluginConfigurationXml(Transform &transform, QString xml); QString getStartupFailureReport() const { return m_errorString; } protected: typedef std::map TransformDescriptionMap; TransformDescriptionMap m_transforms; bool m_transformsPopulated; TransformDescriptionMap m_uninstalledTransforms; bool m_uninstalledTransformsPopulated; QString m_errorString; void populateTransforms(); void populateUninstalledTransforms(); void populateFeatureExtractionPlugins(TransformDescriptionMap &); void populateRealTimePlugins(TransformDescriptionMap &); Vamp::PluginBase *instantiateDefaultPluginFor(TransformId id, sv_samplerate_t rate); QMutex m_transformsMutex; QMutex m_uninstalledTransformsMutex; class UninstalledTransformsPopulateThread : public QThread { public: UninstalledTransformsPopulateThread(TransformFactory *factory) : m_factory(factory) { } virtual void run(); TransformFactory *m_factory; }; UninstalledTransformsPopulateThread *m_thread; bool m_exiting; bool m_populatingSlowly; static TransformFactory *m_instance; }; #endif sonic-visualiser-3.0.3/svgui/.hgignore0000644000000000000000000000016713111512442016100 0ustar 00000000000000syntax: glob Makefile */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej sonic-visualiser-3.0.3/svgui/.hgtags0000644000000000000000000000272313111512442015553 0ustar 000000000000000f36cdf407a684653a2b7cf496272b1d417169d4 sv1-v0.9rc1 1092181784a3a2beaaa97f5661ac4f7ef4e65f46 sv-v1.6 10eec0da9efe413ce70b99fd5a4c9d59bc163022 last-cc-copyright 272e58f0bf8b97910e35ae0d4d57f2a672533fd3 sv-v1.4 272e58f0bf8b97910e35ae0d4d57f2a672533fd3 sv-v1.4rc1 2e8194a30f40d478e7d009cd8f0c2cec2d0df7ce sv-v1.7.1 34bbbcb3c01fb752b8de786a24f2bc881b966acf sv1-1.0pre1 387f2f6fc333d85b054ec8c1e77b8b208bad4ba4 sv1-1.0pre2 3fe622570b3581341928b6ddac8244c87f2ae9bc sv1-v1.0 4cb5cd9ccac7b35b5af1dbe5e73359928a4d57bb sv1-v1.3 4cb5cd9ccac7b35b5af1dbe5e73359928a4d57bb sv1-v1.3rc1 50c0a548d23e9311e3bd8b75e56036b2ae5bf4b5 sv1-1.0pre4 5de07bba4676987e9dbfb44bb70fac71bca5628f sv1-1.0pre3 6167a28d25fcc2eff5bba06d68f97b7445cf2fb6 sv1-v1.2pre3 67f82da3d29c60d6e756d33415fce848c657af07 sv1-v1.2 8ce53683d0d7ba8c892b333c396522247aaaf007 sv1-v0.9rc2 8ebc2ce2a210514aa880ce73aa959fc25f3440d1 sv1-v1.2pre5 c2ba2796cbeea309cf7657a45c29d2d79ed4fb4d sv-v1.7 e6d0b097d1022d03217379c8ed0a58220a6c037f sv1-1.0rc1 e6e38632e8ea1ef0a1e4d90f9160e23b1d74d45a sv-v1.5 eabefd56299550f55296a2256f160e30b62db15c sv-v1.7.2 eedb7f341ec5c27425e1d441e2b13ca8da287e1d sv1-v1.2pre4 ff1dc4f302bd8b8b5ad01931e225bc3b70232543 sv-v1.5pre1 c9d6cf9c51c8e15a06fa1f5c1678d0331dc837cb sv_v1.8 3803f6dcf361c9ec82badb20e3ca9f5c712c5d2f sv_v1.9 ea786e8bd931243adc95a040988edd0d6b5bbc0a sv_v2.0 c6d705bf1672f2cd7f3d4cfe46aa3db6062c004c sv_v2.1 c6d705bf1672f2cd7f3d4cfe46aa3db6062c004c sv_v2.1 77fa3fdbfc7e2b9f96eac6524d48294fb47760c3 sv_v2.1 sonic-visualiser-3.0.3/svgui/.tonioni0000644000000000000000000000000013111512442015737 0ustar 00000000000000sonic-visualiser-3.0.3/svgui/COPYING0000644000000000000000000003543313111512442015334 0ustar 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 sonic-visualiser-3.0.3/svgui/Doxyfile0000644000000000000000000014253313111512442016007 0ustar 00000000000000# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = svgui # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = layer view widgets # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-3.0.3/svgui/INSTALL.txt0000644000000000000000000000412113111512442016136 0ustar 00000000000000 To compile from source ---------------------- This file provides various instructions useful when compiling the SV libraries from source, but it doesn't have a complete recipe for any one platform -- there are too many variables. However, you can find a recipe for one platform (Ubuntu Linux) in the file INSTALL.ubuntu. To build, run $ ./configure && make The following additional libraries are required or optional when building the SV core libraries: REQUIRED Qt v4.4 or newer http://qt.nokia.com/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED Rubber Band Library http://www.breakfastquay.com/rubberband/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Redland RDF libraries http://librdf.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://www.annodex.net/software/libraries.html Optional liblo OSC library http://www.plugin.org.uk/liblo/ The Redland RDF libraries include the Raptor RDF parser library, Rasqal RDF query library, and librdf, the Redland RDF datastore (which depends on both of those). The SV libraries require all of these. If you are going to build the rest of the SV libraries, you will also need one or more of: Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have one or the other of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). If you happen to be using a Debian-based Linux, you probably want to apt-get install the following packages: libqt4-dev libsndfile1-dev libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev librdf0-dev . sonic-visualiser-3.0.3/svgui/acinclude.m40000644000000000000000000002160413111512442016465 0ustar 00000000000000 AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, $QTDIR/bin/qt5-qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qt5-qmake, qt5-qmake,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) # From autoconf archive: # ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # # The first argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The second argument, if specified 'mandatory' or if left unspecified, # indicates that baseline C++11 support is required and that the macro # should error out if no mode with that support is found. If specified # 'optional', then configuration proceeds regardless, after defining # HAVE_CXX11 if and only if a supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014 Alexey Sokolov # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; ]]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi AC_SUBST(HAVE_CXX11) fi ]) sonic-visualiser-3.0.3/svgui/bootstrap.sh0000644000000000000000000000004413111512442016640 0ustar 00000000000000#!/bin/sh aclocal -I . && autoconf sonic-visualiser-3.0.3/svgui/config.pri.in0000644000000000000000000000062113111512442016656 0ustar 00000000000000 CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ linux*:LIBS += -lasound macx*:DEFINES += HAVE_QUICKTIME macx*:LIBS += -framework QuickTime -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-3.0.3/svgui/configure0000755000000000000000000075057113111512442016217 0ustar 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for SVgui 2.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='SVgui' PACKAGE_TARNAME='svgui' PACKAGE_VERSION='2.1' PACKAGE_STRING='SVgui 2.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="widgets/Fader.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_LIBS portaudio_CFLAGS liblo_LIBS liblo_CFLAGS rubberband_LIBS rubberband_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP HAVE_CXX11 MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS rubberband_CFLAGS rubberband_LIBS liblo_CFLAGS liblo_LIBS portaudio_CFLAGS portaudio_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures SVgui 2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/svgui] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of SVgui 2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_CFLAGS C compiler flags for portaudio, overriding pkg-config portaudio_LIBS linker flags for portaudio, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF SVgui configure 2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by SVgui $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } # We are daringly making use of C++11 now ax_cxx_compile_cxx11_required=true ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qt5-qmake", so it can be a program name with args. set dummy qt5-qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qt5-qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -Werror -g" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rubberband" >&5 $as_echo_n "checking for rubberband... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS" LIBS="$LIBS $portaudio_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio" >&5 $as_echo_n "checking for portaudio... " >&6; } if test -n "$portaudio_CFLAGS"; then pkg_cv_portaudio_CFLAGS="$portaudio_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_LIBS"; then pkg_cv_portaudio_LIBS="$portaudio_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_CFLAGS=$pkg_cv_portaudio_CFLAGS portaudio_LIBS=$pkg_cv_portaudio_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS";LIBS="$LIBS $portaudio_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by SVgui $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ SVgui config.status 2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r svgui.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-3.0.3/svgui/configure.ac0000644000000000000000000001054413111512442016563 0ustar 00000000000000 AC_INIT([SVgui], [2.1], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(widgets/Fader.h) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P # We are daringly making use of C++11 now AX_CXX_COMPILE_STDCXX_11(noext) AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_ANY="-Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" CXXFLAGS_DEBUG="$CXXFLAGS_ANY -Werror -g" CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2" CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r svgui.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-3.0.3/svgui/files.pri0000644000000000000000000001401613111512442016111 0ustar 00000000000000 SVGUI_HEADERS += \ layer/Colour3DPlotLayer.h \ layer/Colour3DPlotRenderer.h \ layer/ColourDatabase.h \ layer/ColourMapper.h \ layer/ColourScale.h \ layer/ColourScaleLayer.h \ layer/FlexiNoteLayer.h \ layer/ImageLayer.h \ layer/ImageRegionFinder.h \ layer/Layer.h \ layer/LayerFactory.h \ layer/LayerGeometryProvider.h \ layer/LinearNumericalScale.h \ layer/LogNumericalScale.h \ layer/LinearColourScale.h \ layer/LogColourScale.h \ layer/NoteLayer.h \ layer/PaintAssistant.h \ layer/PianoScale.h \ layer/RegionLayer.h \ layer/RenderTimer.h \ layer/ScrollableImageCache.h \ layer/ScrollableMagRangeCache.h \ layer/SingleColourLayer.h \ layer/SliceableLayer.h \ layer/SliceLayer.h \ layer/SpectrogramLayer.h \ layer/SpectrumLayer.h \ layer/TextLayer.h \ layer/TimeInstantLayer.h \ layer/TimeRulerLayer.h \ layer/TimeValueLayer.h \ layer/VerticalScaleLayer.h \ layer/WaveformLayer.h \ view/AlignmentView.h \ view/Overview.h \ view/Pane.h \ view/PaneStack.h \ view/View.h \ view/ViewManager.h \ view/ViewProxy.h \ widgets/ActivityLog.h \ widgets/AudioDial.h \ widgets/ClickableLabel.h \ widgets/ColourComboBox.h \ widgets/ColourMapComboBox.h \ widgets/ColourNameDialog.h \ widgets/CommandHistory.h \ widgets/CSVFormatDialog.h \ widgets/Fader.h \ widgets/InteractiveFileFinder.h \ widgets/IconLoader.h \ widgets/ImageDialog.h \ widgets/ItemEditDialog.h \ widgets/KeyReference.h \ widgets/LabelCounterInputDialog.h \ widgets/LayerTree.h \ widgets/LayerTreeDialog.h \ widgets/LEDButton.h \ widgets/LevelPanToolButton.h \ widgets/LevelPanWidget.h \ widgets/ListInputDialog.h \ widgets/MIDIFileImportDialog.h \ widgets/ModelDataTableDialog.h \ widgets/NotifyingCheckBox.h \ widgets/NotifyingComboBox.h \ widgets/NotifyingPushButton.h \ widgets/NotifyingTabBar.h \ widgets/NotifyingToolButton.h \ widgets/Panner.h \ widgets/PluginParameterBox.h \ widgets/PluginParameterDialog.h \ widgets/ProgressDialog.h \ widgets/PropertyBox.h \ widgets/PropertyStack.h \ widgets/RangeInputDialog.h \ widgets/SelectableLabel.h \ widgets/SubdividingMenu.h \ widgets/TextAbbrev.h \ widgets/Thumbwheel.h \ widgets/TipDialog.h \ widgets/TransformFinder.h \ widgets/UnitConverter.h \ widgets/WidgetScale.h \ widgets/WindowShapePreview.h \ widgets/WindowTypeSelector.h SVGUI_SOURCES += \ layer/Colour3DPlotLayer.cpp \ layer/Colour3DPlotRenderer.cpp \ layer/ColourDatabase.cpp \ layer/ColourMapper.cpp \ layer/ColourScale.cpp \ layer/FlexiNoteLayer.cpp \ layer/ImageLayer.cpp \ layer/ImageRegionFinder.cpp \ layer/Layer.cpp \ layer/LayerFactory.cpp \ layer/LinearNumericalScale.cpp \ layer/LogNumericalScale.cpp \ layer/LinearColourScale.cpp \ layer/LogColourScale.cpp \ layer/NoteLayer.cpp \ layer/PaintAssistant.cpp \ layer/PianoScale.cpp \ layer/RegionLayer.cpp \ layer/ScrollableImageCache.cpp \ layer/ScrollableMagRangeCache.cpp \ layer/SingleColourLayer.cpp \ layer/SliceLayer.cpp \ layer/SpectrogramLayer.cpp \ layer/SpectrumLayer.cpp \ layer/TextLayer.cpp \ layer/TimeInstantLayer.cpp \ layer/TimeRulerLayer.cpp \ layer/TimeValueLayer.cpp \ layer/WaveformLayer.cpp \ view/AlignmentView.cpp \ view/Overview.cpp \ view/Pane.cpp \ view/PaneStack.cpp \ view/View.cpp \ view/ViewManager.cpp \ widgets/ActivityLog.cpp \ widgets/AudioDial.cpp \ widgets/ColourComboBox.cpp \ widgets/ColourMapComboBox.cpp \ widgets/ColourNameDialog.cpp \ widgets/CommandHistory.cpp \ widgets/CSVFormatDialog.cpp \ widgets/Fader.cpp \ widgets/InteractiveFileFinder.cpp \ widgets/IconLoader.cpp \ widgets/ImageDialog.cpp \ widgets/ItemEditDialog.cpp \ widgets/KeyReference.cpp \ widgets/LabelCounterInputDialog.cpp \ widgets/LayerTree.cpp \ widgets/LayerTreeDialog.cpp \ widgets/LEDButton.cpp \ widgets/LevelPanToolButton.cpp \ widgets/LevelPanWidget.cpp \ widgets/ListInputDialog.cpp \ widgets/MIDIFileImportDialog.cpp \ widgets/ModelDataTableDialog.cpp \ widgets/NotifyingCheckBox.cpp \ widgets/NotifyingComboBox.cpp \ widgets/NotifyingPushButton.cpp \ widgets/NotifyingTabBar.cpp \ widgets/NotifyingToolButton.cpp \ widgets/Panner.cpp \ widgets/PluginParameterBox.cpp \ widgets/PluginParameterDialog.cpp \ widgets/ProgressDialog.cpp \ widgets/PropertyBox.cpp \ widgets/PropertyStack.cpp \ widgets/RangeInputDialog.cpp \ widgets/SelectableLabel.cpp \ widgets/SubdividingMenu.cpp \ widgets/TextAbbrev.cpp \ widgets/Thumbwheel.cpp \ widgets/TipDialog.cpp \ widgets/TransformFinder.cpp \ widgets/UnitConverter.cpp \ widgets/WindowShapePreview.cpp \ widgets/WindowTypeSelector.cpp sonic-visualiser-3.0.3/svgui/install-sh0000755000000000000000000003246413111512442016306 0ustar 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-3.0.3/svgui/layer/Colour3DPlotLayer.cpp0000644000000000000000000010175013111512442021403 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Colour3DPlotLayer.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "ColourMapper.h" #include "LayerGeometryProvider.h" #include "PaintAssistant.h" #include "data/model/Dense3DModelPeakCache.h" #include "view/ViewManager.h" #include #include #include #include #include #include #include using std::vector; //#define DEBUG_COLOUR_3D_PLOT_LAYER_PAINT 1 Colour3DPlotLayer::Colour3DPlotLayer() : m_model(0), m_colourScale(ColourScaleType::Linear), m_colourScaleSet(false), m_colourMap(0), m_gain(1.0), m_binScale(BinScale::Linear), m_normalization(ColumnNormalization::None), m_normalizeVisibleArea(false), m_invertVertical(false), m_opaque(false), m_smooth(false), m_peakResolution(256), m_miny(0), m_maxy(0), m_synchronous(false), m_peakCache(0), m_peakCacheDivisor(8) { QSettings settings; settings.beginGroup("Preferences"); setColourMap(settings.value("colour-3d-plot-colour", ColourMapper::Green).toInt()); settings.endGroup(); } Colour3DPlotLayer::~Colour3DPlotLayer() { invalidateRenderers(); if (m_peakCache) m_peakCache->aboutToDelete(); delete m_peakCache; } ColourScaleType Colour3DPlotLayer::convertToColourScale(int value) { switch (value) { default: case 0: return ColourScaleType::Linear; case 1: return ColourScaleType::Log; case 2: return ColourScaleType::PlusMinusOne; case 3: return ColourScaleType::Absolute; } } int Colour3DPlotLayer::convertFromColourScale(ColourScaleType scale) { switch (scale) { case ColourScaleType::Linear: return 0; case ColourScaleType::Log: return 1; case ColourScaleType::PlusMinusOne: return 2; case ColourScaleType::Absolute: return 3; case ColourScaleType::Meter: case ColourScaleType::Phase: default: return 0; } } std::pair Colour3DPlotLayer::convertToColumnNorm(int value) { switch (value) { default: case 0: return { ColumnNormalization::None, false }; case 1: return { ColumnNormalization::Range01, false }; case 2: return { ColumnNormalization::None, true }; // visible area case 3: return { ColumnNormalization::Hybrid, false }; } } int Colour3DPlotLayer::convertFromColumnNorm(ColumnNormalization norm, bool visible) { if (visible) return 2; switch (norm) { case ColumnNormalization::None: return 0; case ColumnNormalization::Range01: return 1; case ColumnNormalization::Hybrid: return 3; case ColumnNormalization::Sum1: case ColumnNormalization::Max1: default: return 0; } } void Colour3DPlotLayer::setSynchronousPainting(bool synchronous) { m_synchronous = synchronous; } void Colour3DPlotLayer::setModel(const DenseThreeDimensionalModel *model) { SVDEBUG << "Colour3DPlotLayer::setModel(" << model << ")" << endl; if (m_model == model) return; const DenseThreeDimensionalModel *oldModel = m_model; m_model = model; if (!m_model || !m_model->isOK()) return; connectSignals(m_model); connect(m_model, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(m_model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); m_peakResolution = 256; if (model->getResolution() > 512) { m_peakResolution = 16; } else if (model->getResolution() > 128) { m_peakResolution = 64; } else if (model->getResolution() > 2) { m_peakResolution = 128; } if (m_peakCache) m_peakCache->aboutToDelete(); delete m_peakCache; m_peakCache = 0; invalidateRenderers(); invalidateMagnitudes(); emit modelReplaced(); emit sliceableModelReplaced(oldModel, model); } void Colour3DPlotLayer::cacheInvalid() { invalidateRenderers(); invalidateMagnitudes(); } void Colour3DPlotLayer::cacheInvalid(sv_frame_t /* startFrame */, sv_frame_t /* endFrame */) { //!!! should do this only if the range is visible if (m_peakCache) m_peakCache->aboutToDelete(); delete m_peakCache; m_peakCache = 0; invalidateRenderers(); invalidateMagnitudes(); } void Colour3DPlotLayer::invalidateRenderers() { for (ViewRendererMap::iterator i = m_renderers.begin(); i != m_renderers.end(); ++i) { delete i->second; } m_renderers.clear(); } void Colour3DPlotLayer::invalidateMagnitudes() { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "Colour3DPlotLayer::invalidateMagnitudes called" << endl; #endif m_viewMags.clear(); } Dense3DModelPeakCache * Colour3DPlotLayer::getPeakCache() const { if (!m_peakCache) { m_peakCache = new Dense3DModelPeakCache(m_model, m_peakCacheDivisor); } return m_peakCache; } void Colour3DPlotLayer::modelChanged() { if (!m_colourScaleSet && m_colourScale == ColourScaleType::Linear) { if (m_model) { if (m_model->shouldUseLogValueScale()) { setColourScale(ColourScaleType::Log); } else { m_colourScaleSet = true; } } } cacheInvalid(); } void Colour3DPlotLayer::modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame) { if (!m_colourScaleSet && m_colourScale == ColourScaleType::Linear) { if (m_model && m_model->getWidth() > 50) { if (m_model->shouldUseLogValueScale()) { setColourScale(ColourScaleType::Log); } else { m_colourScaleSet = true; } } } cacheInvalid(startFrame, endFrame); } Layer::PropertyList Colour3DPlotLayer::getProperties() const { PropertyList list; list.push_back("Colour"); list.push_back("Colour Scale"); list.push_back("Normalization"); list.push_back("Gain"); list.push_back("Bin Scale"); list.push_back("Invert Vertical Scale"); list.push_back("Opaque"); list.push_back("Smooth"); return list; } QString Colour3DPlotLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Colour") return tr("Colour"); if (name == "Colour Scale") return tr("Scale"); if (name == "Normalization") return tr("Normalization"); if (name == "Invert Vertical Scale") return tr("Invert Vertical Scale"); if (name == "Gain") return tr("Gain"); if (name == "Opaque") return tr("Always Opaque"); if (name == "Smooth") return tr("Smooth"); if (name == "Bin Scale") return tr("Bin Scale"); return ""; } QString Colour3DPlotLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Invert Vertical Scale") return "invert-vertical"; if (name == "Opaque") return "opaque"; if (name == "Smooth") return "smooth"; return ""; } Layer::PropertyType Colour3DPlotLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Invert Vertical Scale") return ToggleProperty; if (name == "Opaque") return ToggleProperty; if (name == "Smooth") return ToggleProperty; if (name == "Colour") return ColourMapProperty; return ValueProperty; } QString Colour3DPlotLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Normalization" || name == "Colour Scale" || name == "Gain") return tr("Scale"); if (name == "Bin Scale" || name == "Invert Vertical Scale") return tr("Bins"); if (name == "Opaque" || name == "Smooth" || name == "Colour") return tr("Colour"); return QString(); } int Colour3DPlotLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = int(lrint(log10(1.0) * 20.0)); if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = int(lrint(log10(m_gain) * 20.0)); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Colour Scale") { // linear, log, +/-1, abs *min = 0; *max = 3; *deflt = 0; val = convertFromColourScale(m_colourScale); } else if (name == "Colour") { *min = 0; *max = ColourMapper::getColourMapCount() - 1; *deflt = 0; val = m_colourMap; } else if (name == "Normalization") { *min = 0; *max = 3; *deflt = 0; val = convertFromColumnNorm(m_normalization, m_normalizeVisibleArea); } else if (name == "Invert Vertical Scale") { *deflt = 0; val = (m_invertVertical ? 1 : 0); } else if (name == "Bin Scale") { *min = 0; *max = 1; *deflt = int(BinScale::Linear); val = (int)m_binScale; } else if (name == "Opaque") { *deflt = 0; val = (m_opaque ? 1 : 0); } else if (name == "Smooth") { *deflt = 0; val = (m_smooth ? 1 : 0); } else { val = Layer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString Colour3DPlotLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour") { return ColourMapper::getColourMapName(value); } if (name == "Colour Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); case 2: return tr("+/-1"); case 3: return tr("Absolute"); } } if (name == "Normalization") { switch(value) { default: case 0: return tr("None"); case 1: return tr("Col"); case 2: return tr("View"); case 3: return tr("Hybrid"); } // return ""; // icon only } if (name == "Bin Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); } } return tr(""); } QString Colour3DPlotLayer::getPropertyValueIconName(const PropertyName &name, int value) const { if (name == "Normalization") { switch(value) { default: case 0: return "normalise-none"; case 1: return "normalise-columns"; case 2: return "normalise"; case 3: return "normalise-hybrid"; } } return ""; } RangeMapper * Colour3DPlotLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } return 0; } void Colour3DPlotLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(float(pow(10, value/20.0))); } else if (name == "Colour Scale") { setColourScale(convertToColourScale(value)); } else if (name == "Colour") { setColourMap(value); } else if (name == "Invert Vertical Scale") { setInvertVertical(value ? true : false); } else if (name == "Opaque") { setOpaque(value ? true : false); } else if (name == "Smooth") { setSmooth(value ? true : false); } else if (name == "Bin Scale") { switch (value) { default: case 0: setBinScale(BinScale::Linear); break; case 1: setBinScale(BinScale::Log); break; } } else if (name == "Normalization") { auto n = convertToColumnNorm(value); setNormalization(n.first); setNormalizeVisibleArea(n.second); } } void Colour3DPlotLayer::setColourScale(ColourScaleType scale) { m_colourScaleSet = true; // even if setting to the same thing if (m_colourScale == scale) return; m_colourScale = scale; invalidateRenderers(); emit layerParametersChanged(); } void Colour3DPlotLayer::setColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; invalidateRenderers(); emit layerParametersChanged(); } void Colour3DPlotLayer::setGain(float gain) { if (m_gain == gain) return; m_gain = gain; invalidateRenderers(); emit layerParametersChanged(); } float Colour3DPlotLayer::getGain() const { return m_gain; } void Colour3DPlotLayer::setBinScale(BinScale binScale) { if (m_binScale == binScale) return; m_binScale = binScale; invalidateRenderers(); emit layerParametersChanged(); } BinScale Colour3DPlotLayer::getBinScale() const { return m_binScale; } void Colour3DPlotLayer::setNormalization(ColumnNormalization n) { if (m_normalization == n) return; m_normalization = n; invalidateRenderers(); emit layerParametersChanged(); } ColumnNormalization Colour3DPlotLayer::getNormalization() const { return m_normalization; } void Colour3DPlotLayer::setNormalizeVisibleArea(bool n) { if (m_normalizeVisibleArea == n) return; invalidateRenderers(); invalidateMagnitudes(); m_normalizeVisibleArea = n; emit layerParametersChanged(); } bool Colour3DPlotLayer::getNormalizeVisibleArea() const { return m_normalizeVisibleArea; } void Colour3DPlotLayer::setInvertVertical(bool n) { if (m_invertVertical == n) return; m_invertVertical = n; invalidateRenderers(); emit layerParametersChanged(); } void Colour3DPlotLayer::setOpaque(bool n) { if (m_opaque == n) return; m_opaque = n; invalidateRenderers(); emit layerParametersChanged(); } void Colour3DPlotLayer::setSmooth(bool n) { if (m_smooth == n) return; m_smooth = n; invalidateRenderers(); emit layerParametersChanged(); } bool Colour3DPlotLayer::getInvertVertical() const { return m_invertVertical; } bool Colour3DPlotLayer::getOpaque() const { return m_opaque; } bool Colour3DPlotLayer::getSmooth() const { return m_smooth; } void Colour3DPlotLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) { if (dormant) { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "Colour3DPlotLayer::setLayerDormant(" << dormant << ")" << endl; #endif if (isLayerDormant(v)) { return; } Layer::setLayerDormant(v, true); cacheInvalid(); } else { Layer::setLayerDormant(v, false); } } bool Colour3DPlotLayer::isLayerScrollable(const LayerGeometryProvider * /* v */) const { return false; } bool Colour3DPlotLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = 0; max = double(m_model->getHeight()); logarithmic = (m_binScale == BinScale::Log); unit = ""; return true; } bool Colour3DPlotLayer::getDisplayExtents(double &min, double &max) const { if (!m_model) return false; double hmax = double(m_model->getHeight()); min = m_miny; max = m_maxy; if (max <= min) { min = 0; max = hmax; } if (min < 0) min = 0; if (max > hmax) max = hmax; return true; } bool Colour3DPlotLayer::setDisplayExtents(double min, double max) { if (!m_model) return false; m_miny = int(lrint(min)); m_maxy = int(lrint(max)); invalidateRenderers(); emit layerParametersChanged(); return true; } bool Colour3DPlotLayer::getYScaleValue(const LayerGeometryProvider *, int, double &, QString &) const { return false;//!!! } int Colour3DPlotLayer::getVerticalZoomSteps(int &defaultStep) const { if (!m_model) return 0; defaultStep = 0; int h = m_model->getHeight(); return h; } int Colour3DPlotLayer::getCurrentVerticalZoomStep() const { if (!m_model) return 0; double min, max; getDisplayExtents(min, max); return m_model->getHeight() - int(lrint(max - min)); } void Colour3DPlotLayer::setVerticalZoomStep(int step) { if (!m_model) return; // SVDEBUG << "Colour3DPlotLayer::setVerticalZoomStep(" <getHeight(); getDisplayExtents(mn, mx); double h = v->getPaintHeight(); if (m_binScale == BinScale::Linear) { y = h - (((bin - mn) * h) / (mx - mn)); } else { double logmin = mn + 1, logmax = mx + 1; LogRange::mapRange(logmin, logmax); y = h - (((LogRange::map(bin + 1) - logmin) * h) / (logmax - logmin)); } return y; } double Colour3DPlotLayer::getBinForY(const LayerGeometryProvider *v, double y) const { double bin = y; if (!m_model) return bin; double mn = 0, mx = m_model->getHeight(); getDisplayExtents(mn, mx); double h = v->getPaintHeight(); if (m_binScale == BinScale::Linear) { // Arrange that the first bin (mn) appears as the exact result // for the first pixel (which is pixel h-1) and the first // out-of-range bin (mx) would appear as the exact result for // the first out-of-range pixel (which would be pixel -1) bin = mn + ((h - y - 1) * (mx - mn)) / h; } else { double logmin = mn + 1, logmax = mx + 1; LogRange::mapRange(logmin, logmax); bin = LogRange::unmap(logmin + ((h - y - 1) * (logmax - logmin)) / h) - 1; } return bin; } QString Colour3DPlotLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { if (!m_model) return ""; int x = pos.x(); int y = pos.y(); sv_frame_t modelStart = m_model->getStartFrame(); int modelResolution = m_model->getResolution(); double srRatio = v->getViewManager()->getMainModelSampleRate() / m_model->getSampleRate(); int sx0 = int((double(v->getFrameForX(x)) / srRatio - double(modelStart)) / modelResolution); int f0 = sx0 * modelResolution; int f1 = f0 + modelResolution; int sh = m_model->getHeight(); int symin = m_miny; int symax = m_maxy; if (symax <= symin) { symin = 0; symax = sh; } if (symin < 0) symin = 0; if (symax > sh) symax = sh; // double binHeight = double(v->getPaintHeight()) / (symax - symin); // int sy = int((v->getPaintHeight() - y) / binHeight) + symin; int sy = getIBinForY(v, y); if (sy < 0 || sy >= m_model->getHeight()) { return ""; } if (m_invertVertical) sy = m_model->getHeight() - sy - 1; float value = m_model->getValueAt(sx0, sy); // cerr << "bin value (" << sx0 << "," << sy << ") is " << value << endl; QString binName = m_model->getBinName(sy); if (binName == "") binName = QString("[%1]").arg(sy + 1); else binName = QString("%1 [%2]").arg(binName).arg(sy + 1); QString text = tr("Time:\t%1 - %2\nBin:\t%3\nValue:\t%4") .arg(RealTime::frame2RealTime(f0, m_model->getSampleRate()) .toText(true).c_str()) .arg(RealTime::frame2RealTime(f1, m_model->getSampleRate()) .toText(true).c_str()) .arg(binName) .arg(value); return text; } int Colour3DPlotLayer::getColourScaleWidth(QPainter &p) const { // Font is rotated int cw = p.fontMetrics().height(); return cw; } int Colour3DPlotLayer::getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &paint) const { if (!m_model) return 0; QString sampleText = QString("[%1]").arg(m_model->getHeight()); int tw = paint.fontMetrics().width(sampleText); bool another = false; for (int i = 0; i < m_model->getHeight(); ++i) { if (m_model->getBinName(i).length() > sampleText.length()) { sampleText = m_model->getBinName(i); another = true; } } if (another) { tw = std::max(tw, paint.fontMetrics().width(sampleText)); } return tw + 13 + getColourScaleWidth(paint); } void Colour3DPlotLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const { if (!m_model) return; int h = rect.height(), w = rect.width(); int cw = getColourScaleWidth(paint); int ch = h - 20; if (ch > 20) { double min = m_viewMags[v->getId()].getMin(); double max = m_viewMags[v->getId()].getMax(); if (max <= min) max = min + 0.1; paint.setPen(v->getForeground()); paint.drawRect(4, 10, cw - 8, ch+1); for (int y = 0; y < ch; ++y) { double value = ((max - min) * (double(ch-y) - 1.0)) / double(ch) + min; paint.setPen(getRenderer(v)->getColour(value)); paint.drawLine(5, 11 + y, cw - 5, 11 + y); } QString minstr = QString("%1").arg(min); QString maxstr = QString("%1").arg(max); paint.save(); QFont font = paint.font(); if (font.pixelSize() > 0) { int newSize = int(font.pixelSize() * 0.65); if (newSize < 6) newSize = 6; font.setPixelSize(newSize); paint.setFont(font); } int msw = paint.fontMetrics().width(maxstr); QMatrix m; m.translate(cw - 6, ch + 10); m.rotate(-90); paint.setWorldMatrix(m); PaintAssistant::drawVisibleText(v, paint, 2, 0, minstr, PaintAssistant::OutlinedText); m.translate(ch - msw - 2, 0); paint.setWorldMatrix(m); PaintAssistant::drawVisibleText(v, paint, 0, 0, maxstr, PaintAssistant::OutlinedText); paint.restore(); } paint.setPen(v->getForeground()); int sh = m_model->getHeight(); int symin = m_miny; int symax = m_maxy; if (symax <= symin) { symin = 0; symax = sh; } if (symin < 0) symin = 0; if (symax > sh) symax = sh; paint.save(); int py = h; int defaultFontHeight = paint.fontMetrics().height(); for (int i = symin; i <= symax; ++i) { int y0; y0 = getIYForBin(v, i); int h = py - y0; if (i > symin) { if (paint.fontMetrics().height() >= h) { if (h >= defaultFontHeight * 0.8) { QFont tf = paint.font(); tf.setPixelSize(int(h * 0.8)); paint.setFont(tf); } else { continue; } } } py = y0; if (i < symax) { paint.drawLine(cw, y0, w, y0); } if (i > symin) { int idx = i - 1; if (m_invertVertical) idx = m_model->getHeight() - idx - 1; QString text = m_model->getBinName(idx); if (text == "") text = QString("[%1]").arg(idx + 1); int ty = y0 + (h/2) - (paint.fontMetrics().height()/2) + paint.fontMetrics().ascent() + 1; paint.drawText(cw + 5, ty, text); } } paint.restore(); } Colour3DPlotRenderer * Colour3DPlotLayer::getRenderer(const LayerGeometryProvider *v) const { int viewId = v->getId(); if (m_renderers.find(viewId) == m_renderers.end()) { Colour3DPlotRenderer::Sources sources; sources.verticalBinLayer = this; sources.fft = 0; sources.source = m_model; sources.peakCaches.push_back(getPeakCache()); ColourScale::Parameters cparams; cparams.colourMap = m_colourMap; cparams.scaleType = m_colourScale; cparams.gain = m_gain; double minValue = 0.0; double maxValue = 1.0; if (m_normalizeVisibleArea && m_viewMags[viewId].isSet()) { minValue = m_viewMags[viewId].getMin(); maxValue = m_viewMags[viewId].getMax(); } else if (m_normalization == ColumnNormalization::Hybrid) { minValue = 0; maxValue = log10(m_model->getMaximumLevel() + 1.0); } else if (m_normalization == ColumnNormalization::None) { minValue = m_model->getMinimumLevel(); maxValue = m_model->getMaximumLevel(); } SVDEBUG << "Colour3DPlotLayer: rebuilding renderer, value range is " << minValue << " -> " << maxValue << endl; if (maxValue <= minValue) { maxValue = minValue + 0.1f; } cparams.threshold = minValue; cparams.minValue = minValue; cparams.maxValue = maxValue; m_lastRenderedMags[viewId] = MagnitudeRange(float(minValue), float(maxValue)); Colour3DPlotRenderer::Parameters params; params.colourScale = ColourScale(cparams); params.normalization = m_normalization; params.binScale = m_binScale; params.alwaysOpaque = m_opaque; params.invertVertical = m_invertVertical; params.interpolate = m_smooth; m_renderers[viewId] = new Colour3DPlotRenderer(sources, params); } return m_renderers[viewId]; } void Colour3DPlotLayer::paintWithRenderer(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { Colour3DPlotRenderer *renderer = getRenderer(v); Colour3DPlotRenderer::RenderResult result; MagnitudeRange magRange; int viewId = v->getId(); bool continuingPaint = !renderer->geometryChanged(v); if (continuingPaint) { magRange = m_viewMags[viewId]; } if (m_synchronous) { result = renderer->render(v, paint, rect); } else { result = renderer->renderTimeConstrained(v, paint, rect); QRect uncached = renderer->getLargestUncachedRect(v); if (uncached.width() > 0) { v->updatePaintRect(uncached); } } magRange.sample(result.range); if (magRange.isSet()) { if (m_viewMags[viewId] != magRange) { m_viewMags[viewId] = magRange; #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "mag range in this view has changed: " << magRange.getMin() << " -> " << magRange.getMax() << endl; #endif } } if (!continuingPaint && m_normalizeVisibleArea && m_viewMags[viewId] != m_lastRenderedMags[viewId]) { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "mag range has changed from last rendered range: re-rendering" << endl; #endif delete m_renderers[viewId]; m_renderers.erase(viewId); v->updatePaintRect(v->getPaintRect()); } } void Colour3DPlotLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { /* if (m_model) { SVDEBUG << "Colour3DPlotLayer::paint: model says shouldUseLogValueScale = " << m_model->shouldUseLogValueScale() << endl; } */ Profiler profiler("Colour3DPlotLayer::paint"); #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "Colour3DPlotLayer::paint(): m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << ", rect is (" << rect.x() << "," << rect.y() << ") " << rect.width() << "x" << rect.height() << endl; #endif int completion = 0; if (!m_model || !m_model->isOK() || !m_model->isReady(&completion)) { if (completion > 0) { paint.fillRect(0, 10, v->getPaintWidth() * completion / 100, 10, QColor(120, 120, 120)); } return; } if (m_model->getWidth() == 0) { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "Colour3DPlotLayer::paint(): model width == 0, " << "nothing to paint (yet)" << endl; #endif return; } paintWithRenderer(v, paint, rect); } bool Colour3DPlotLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); sv_frame_t left = (frame / resolution) * resolution; sv_frame_t right = left + resolution; switch (snap) { case SnapLeft: frame = left; break; case SnapRight: frame = right; break; case SnapNearest: case SnapNeighbouring: if (frame - left > right - frame) frame = right; else frame = left; break; } return true; } void Colour3DPlotLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s = QString("scale=\"%1\" " "colourScheme=\"%2\" " "minY=\"%3\" " "maxY=\"%4\" " "invertVertical=\"%5\" " "opaque=\"%6\" %7") .arg(convertFromColourScale(m_colourScale)) .arg(m_colourMap) .arg(m_miny) .arg(m_maxy) .arg(m_invertVertical ? "true" : "false") .arg(m_opaque ? "true" : "false") .arg(QString("binScale=\"%1\" smooth=\"%2\" gain=\"%3\" ") .arg(int(m_binScale)) .arg(m_smooth ? "true" : "false") .arg(m_gain)); // New-style normalization attributes, allowing for more types of // normalization in future: write out the column normalization // type separately, and then whether we are normalizing visible // area as well afterwards s += QString("columnNormalization=\"%1\" ") .arg(m_normalization == ColumnNormalization::Range01 ? "peak" : m_normalization == ColumnNormalization::Hybrid ? "hybrid" : "none"); // Old-style normalization attribute, for backward compatibility s += QString("normalizeColumns=\"%1\" ") .arg(m_normalization == ColumnNormalization::Range01 ? "true" : "false"); // And this applies to both old- and new-style attributes s += QString("normalizeVisibleArea=\"%1\" ") .arg(m_normalizeVisibleArea ? "true" : "false"); Layer::toXml(stream, indent, extraAttributes + " " + s); } void Colour3DPlotLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false, alsoOk = false; ColourScaleType colourScale = convertToColourScale (attributes.value("scale").toInt(&ok)); if (ok) setColourScale(colourScale); int colourMap = attributes.value("colourScheme").toInt(&ok); if (ok) setColourMap(colourMap); BinScale binScale = (BinScale) attributes.value("binScale").toInt(&ok); if (ok) setBinScale(binScale); bool invertVertical = (attributes.value("invertVertical").trimmed() == "true"); setInvertVertical(invertVertical); bool opaque = (attributes.value("opaque").trimmed() == "true"); setOpaque(opaque); bool smooth = (attributes.value("smooth").trimmed() == "true"); setSmooth(smooth); float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); float min = attributes.value("minY").toFloat(&ok); float max = attributes.value("maxY").toFloat(&alsoOk); if (ok && alsoOk) setDisplayExtents(min, max); bool haveNewStyleNormalization = false; QString columnNormalization = attributes.value("columnNormalization"); if (columnNormalization != "") { haveNewStyleNormalization = true; if (columnNormalization == "peak") { setNormalization(ColumnNormalization::Range01); } else if (columnNormalization == "hybrid") { setNormalization(ColumnNormalization::Hybrid); } else if (columnNormalization == "none") { setNormalization(ColumnNormalization::None); } else { cerr << "NOTE: Unknown or unsupported columnNormalization attribute \"" << columnNormalization << "\"" << endl; } } if (!haveNewStyleNormalization) { setNormalization(ColumnNormalization::None); bool normalizeColumns = (attributes.value("normalizeColumns").trimmed() == "true"); if (normalizeColumns) { setNormalization(ColumnNormalization::Range01); } bool normalizeHybrid = (attributes.value("normalizeHybrid").trimmed() == "true"); if (normalizeHybrid) { setNormalization(ColumnNormalization::Hybrid); } } bool normalizeVisibleArea = (attributes.value("normalizeVisibleArea").trimmed() == "true"); setNormalizeVisibleArea(normalizeVisibleArea); //!!! todo: check save/reload scaling, compare with //!!! SpectrogramLayer, compare with prior SV versions, compare //!!! with Tony v1 and v2 and their save files } sonic-visualiser-3.0.3/svgui/layer/Colour3DPlotLayer.h0000644000000000000000000001727513111512442021060 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef COLOUR_3D_PLOT_LAYER_H #define COLOUR_3D_PLOT_LAYER_H #include "SliceableLayer.h" #include "VerticalBinLayer.h" #include "ColourScale.h" #include "Colour3DPlotRenderer.h" #include "data/model/DenseThreeDimensionalModel.h" class View; class QPainter; class QImage; /** * This is a view that displays dense 3-D data (time, some sort of * binned y-axis range, value) as a colour plot with value mapped to * colour range. Its source is a DenseThreeDimensionalModel. * * This was the original implementation for the spectrogram view, but * it was replaced for that purpose with a more efficient * implementation that derived the spectrogram itself from a * DenseTimeValueModel instead of using a three-dimensional model. */ class Colour3DPlotLayer : public VerticalBinLayer { Q_OBJECT public: Colour3DPlotLayer(); ~Colour3DPlotLayer(); virtual const ZoomConstraint *getZoomConstraint() const { return m_model ? m_model->getZoomConstraint() : 0; } virtual const Model *getModel() const { return m_model; } virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual void setSynchronousPainting(bool synchronous); virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void setLayerDormant(const LayerGeometryProvider *v, bool dormant); virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourHasMeaningfulValue; } void setModel(const DenseThreeDimensionalModel *model); virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual PropertyList getProperties() const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual QString getPropertyValueIconName(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void setProperties(const QXmlAttributes &); void setColourScale(ColourScaleType); ColourScaleType getColourScale() const { return m_colourScale; } void setColourMap(int map); int getColourMap() const; /** * Set the gain multiplier for sample values in this view. * The default is 1.0. */ void setGain(float gain); float getGain() const; /** * Specify the scale for the y axis. */ void setBinScale(BinScale); BinScale getBinScale() const; /** * Specify the normalization mode for individual columns. */ void setNormalization(ColumnNormalization); ColumnNormalization getNormalization() const; /** * Specify whether to normalize the visible area. */ void setNormalizeVisibleArea(bool); bool getNormalizeVisibleArea() const; void setInvertVertical(bool i); bool getInvertVertical() const; void setOpaque(bool i); bool getOpaque() const; void setSmooth(bool i); bool getSmooth() const; virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual bool setDisplayExtents(double min, double max); virtual bool getYScaleValue(const LayerGeometryProvider *, int /* y */, double &/* value */, QString &/* unit */) const; virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual const Model *getSliceableModel() const { return m_model; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; protected slots: void cacheInvalid(); void cacheInvalid(sv_frame_t startFrame, sv_frame_t endFrame); void modelChanged(); void modelChangedWithin(sv_frame_t, sv_frame_t); protected: const DenseThreeDimensionalModel *m_model; // I do not own this ColourScaleType m_colourScale; bool m_colourScaleSet; int m_colourMap; float m_gain; BinScale m_binScale; ColumnNormalization m_normalization; // of individual columns bool m_normalizeVisibleArea; bool m_invertVertical; bool m_opaque; bool m_smooth; int m_peakResolution; // Minimum and maximum bin numbers visible within the view. We // always snap to whole bins at view edges. int m_miny; int m_maxy; bool m_synchronous; static ColourScaleType convertToColourScale(int value); static int convertFromColourScale(ColourScaleType); static std::pair convertToColumnNorm(int value); static int convertFromColumnNorm(ColumnNormalization norm, bool visible); mutable Dense3DModelPeakCache *m_peakCache; const int m_peakCacheDivisor; Dense3DModelPeakCache *getPeakCache() const; typedef std::map ViewMagMap; // key is view id mutable ViewMagMap m_viewMags; mutable ViewMagMap m_lastRenderedMags; // when in normalizeVisibleArea mode void invalidateMagnitudes(); typedef std::map ViewRendererMap; // key is view id mutable ViewRendererMap m_renderers; Colour3DPlotRenderer *getRenderer(const LayerGeometryProvider *) const; void invalidateRenderers(); /** * Return the y coordinate at which the given bin "starts" * (i.e. at the bottom of the bin, if the given bin is an integer * and the vertical scale is the usual way up). Bin number may be * fractional, to obtain a position part-way through a bin. */ double getYForBin(const LayerGeometryProvider *, double bin) const; /** * Return the bin number, possibly fractional, at the given y * coordinate. Note that the whole numbers occur at the positions * at which the bins "start" (i.e. the bottom of the visible bin, * if the vertical scale is the usual way up). */ double getBinForY(const LayerGeometryProvider *, double y) const; int getColourScaleWidth(QPainter &) const; void paintWithRenderer(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; }; #endif sonic-visualiser-3.0.3/svgui/layer/Colour3DPlotRenderer.cpp0000644000000000000000000012205613111512442022077 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Colour3DPlotRenderer.h" #include "RenderTimer.h" #include "base/Profiler.h" #include "base/HitCount.h" #include "data/model/DenseThreeDimensionalModel.h" #include "data/model/Dense3DModelPeakCache.h" #include "data/model/FFTModel.h" #include "LayerGeometryProvider.h" #include "VerticalBinLayer.h" #include "PaintAssistant.h" #include "ImageRegionFinder.h" #include "view/ViewManager.h" // for main model sample rate. Pity #include //#define DEBUG_COLOUR_PLOT_REPAINT 1 using namespace std; Colour3DPlotRenderer::RenderResult Colour3DPlotRenderer::render(const LayerGeometryProvider *v, QPainter &paint, QRect rect) { return render(v, paint, rect, false); } Colour3DPlotRenderer::RenderResult Colour3DPlotRenderer::renderTimeConstrained(const LayerGeometryProvider *v, QPainter &paint, QRect rect) { return render(v, paint, rect, true); } QRect Colour3DPlotRenderer::getLargestUncachedRect(const LayerGeometryProvider *v) { RenderType renderType = decideRenderType(v); if (renderType == DirectTranslucent) { return QRect(); // never cached } int h = m_cache.getSize().height(); QRect areaLeft(0, 0, m_cache.getValidLeft(), h); QRect areaRight(m_cache.getValidRight(), 0, m_cache.getSize().width() - m_cache.getValidRight(), h); if (areaRight.width() > areaLeft.width()) { return areaRight; } else { return areaLeft; } } bool Colour3DPlotRenderer::geometryChanged(const LayerGeometryProvider *v) { RenderType renderType = decideRenderType(v); if (renderType == DirectTranslucent) { return true; // never cached } if (m_cache.getSize() == v->getPaintSize() && m_cache.getZoomLevel() == v->getZoomLevel() && m_cache.getStartFrame() == v->getStartFrame()) { return false; } else { return true; } } Colour3DPlotRenderer::RenderResult Colour3DPlotRenderer::render(const LayerGeometryProvider *v, QPainter &paint, QRect rect, bool timeConstrained) { RenderType renderType = decideRenderType(v); if (timeConstrained) { if (renderType != DrawBufferPixelResolution) { // Rendering should be fast in bin-resolution and direct // draw cases because we are quite well zoomed-in, and the // sums are easier this way. Calculating boundaries later // will be fiddly for partial paints otherwise. timeConstrained = false; } else if (m_secondsPerXPixelValid) { double predicted = m_secondsPerXPixel * rect.width(); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "Predicted time for width " << rect.width() << " = " << predicted << " (" << m_secondsPerXPixel << " x " << rect.width() << ")" << endl; #endif if (predicted < 0.2) { #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "Predicted time looks fast enough: no partial renders" << endl; #endif timeConstrained = false; } } } int x0 = v->getXForViewX(rect.x()); int x1 = v->getXForViewX(rect.x() + rect.width()); if (x0 < 0) x0 = 0; if (x1 > v->getPaintWidth()) x1 = v->getPaintWidth(); sv_frame_t startFrame = v->getStartFrame(); m_cache.resize(v->getPaintSize()); m_cache.setZoomLevel(v->getZoomLevel()); m_magCache.resize(v->getPaintSize().width()); m_magCache.setZoomLevel(v->getZoomLevel()); if (renderType == DirectTranslucent) { MagnitudeRange range = renderDirectTranslucent(v, paint, rect); return { rect, range }; } #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "cache start " << m_cache.getStartFrame() << " valid left " << m_cache.getValidLeft() << " valid right " << m_cache.getValidRight() << endl; SVDEBUG << " view start " << startFrame << " x0 " << x0 << " x1 " << x1 << endl; #endif static HitCount count("Colour3DPlotRenderer: image cache"); if (m_cache.isValid()) { // some part of the cache is valid if (v->getXForFrame(m_cache.getStartFrame()) == v->getXForFrame(startFrame) && m_cache.getValidLeft() <= x0 && m_cache.getValidRight() >= x1) { #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "cache hit" << endl; #endif count.hit(); // cache is valid for the complete requested area paint.drawImage(rect, m_cache.getImage(), rect); MagnitudeRange range = m_magCache.getRange(x0, x1 - x0); return { rect, range }; } else { #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "cache partial hit" << endl; #endif count.partial(); // cache doesn't begin at the right frame or doesn't // contain the complete view, but might be scrollable or // partially usable m_cache.scrollTo(v, startFrame); m_magCache.scrollTo(v, startFrame); // if we are not time-constrained, then we want to paint // the whole area in one go; we don't return a partial // paint. To avoid providing the more complex logic to // handle painting discontiguous areas, if the only valid // part of cache is in the middle, just make the whole // thing invalid and start again. if (!timeConstrained) { if (m_cache.getValidLeft() > x0 && m_cache.getValidRight() < x1) { m_cache.invalidate(); } } } } else { // cache is completely invalid count.miss(); m_cache.setStartFrame(startFrame); m_magCache.setStartFrame(startFrame); } bool rightToLeft = false; int reqx0 = x0; int reqx1 = x1; if (!m_cache.isValid() && timeConstrained) { if (x0 == 0 && x1 == v->getPaintWidth()) { // When rendering the whole area, in a context where we // might not be able to complete the work, start from // somewhere near the middle so that the region of // interest appears first. // // This is very useful if we actually are slow to render, // but if we're not sure how fast we'll be, we should // prefer not to because it can be distracting to render // fast from the middle and then jump back to fill in the // start. That is: // // - if our seconds-per-x-pixel count is invalid, then we // don't do this: we've probably only just been created // and don't know how fast we'll be yet (this happens // often while zooming rapidly in and out). The exception // to the exception is if we're displaying peak // frequencies; this we can assume to be slow. (Note that // if the seconds-per-x-pixel is valid and we know we're // fast, then we've already set timeConstrained false // above so this doesn't apply) // // - if we're using a peak cache, we don't do this; // drawing from peak cache is often (even if not always) // fast. bool drawFromTheMiddle = true; if (!m_secondsPerXPixelValid && (m_params.binDisplay != BinDisplay::PeakFrequencies)) { drawFromTheMiddle = false; } else { int peakCacheIndex = -1, binsPerPeak = -1; getPreferredPeakCache(v, peakCacheIndex, binsPerPeak); if (peakCacheIndex >= 0) { // have a peak cache drawFromTheMiddle = false; } } if (drawFromTheMiddle) { double offset = 0.5 * (double(rand()) / double(RAND_MAX)); x0 = int(x1 * offset); } } } if (m_cache.isValid()) { // When rendering only a part of the cache, we need to make // sure that the part we're rendering is adjacent to (or // overlapping) a valid area of cache, if we have one. The // alternative is to ditch the valid area of cache and render // only the requested area, but that's risky because this can // happen when just waving the pointer over a small part of // the view -- if we lose the partly-built cache every time // the user does that, we'll never finish building it. int left = x0; int width = x1 - x0; bool isLeftOfValidArea = false; m_cache.adjustToTouchValidArea(left, width, isLeftOfValidArea); x0 = left; x1 = x0 + width; // That call also told us whether we should be painting // sub-regions of our target region in right-to-left order in // order to ensure contiguity rightToLeft = isLeftOfValidArea; } // Note, we always paint the full height to cache. We want to // ensure the cache is coherent without having to worry about // vertical matching of required and valid areas as well as // horizontal. if (renderType == DrawBufferBinResolution) { renderToCacheBinResolution(v, x0, x1 - x0); } else { // must be DrawBufferPixelResolution, handled DirectTranslucent earlier renderToCachePixelResolution(v, x0, x1 - x0, rightToLeft, timeConstrained); } QRect pr = rect & m_cache.getValidArea(); paint.drawImage(pr.x(), pr.y(), m_cache.getImage(), pr.x(), pr.y(), pr.width(), pr.height()); if (!timeConstrained && (pr != rect)) { cerr << "WARNING: failed to render entire requested rect " << "even when not time-constrained" << endl; } MagnitudeRange range = m_magCache.getRange(reqx0, reqx1 - reqx0); return { pr, range }; } Colour3DPlotRenderer::RenderType Colour3DPlotRenderer::decideRenderType(const LayerGeometryProvider *v) const { const DenseThreeDimensionalModel *model = m_sources.source; if (!model || !v || !(v->getViewManager())) { return DrawBufferPixelResolution; // or anything } int binResolution = model->getResolution(); int zoomLevel = v->getZoomLevel(); sv_samplerate_t modelRate = model->getSampleRate(); double rateRatio = v->getViewManager()->getMainModelSampleRate() / modelRate; double relativeBinResolution = binResolution * rateRatio; if (m_params.binDisplay == BinDisplay::PeakFrequencies) { // no alternative works here return DrawBufferPixelResolution; } if (!m_params.alwaysOpaque && !m_params.interpolate) { // consider translucent option -- only if not smoothing & not // explicitly requested opaque & sufficiently zoomed-in if (model->getHeight() * 3 < v->getPaintHeight() && relativeBinResolution >= 3 * zoomLevel) { return DirectTranslucent; } } if (relativeBinResolution > zoomLevel) { return DrawBufferBinResolution; } else { return DrawBufferPixelResolution; } } ColumnOp::Column Colour3DPlotRenderer::getColumn(int sx, int minbin, int nbins, int peakCacheIndex) const { Profiler profiler("Colour3DPlotRenderer::getColumn"); // order: // get column -> scale -> normalise -> record extents -> // peak pick -> distribute/interpolate -> apply display gain // we do the first bit here: // get column -> scale -> normalise ColumnOp::Column column; if (m_params.colourScale.getScale() == ColourScaleType::Phase && m_sources.fft) { ColumnOp::Column fullColumn = m_sources.fft->getPhases(sx); column = vector(fullColumn.data() + minbin, fullColumn.data() + minbin + nbins); } else { ColumnOp::Column fullColumn = (peakCacheIndex >= 0 ? m_sources.peakCaches[peakCacheIndex] : m_sources.source) ->getColumn(sx); column = vector(fullColumn.data() + minbin, fullColumn.data() + minbin + nbins); column = ColumnOp::applyGain(column, m_params.scaleFactor); column = ColumnOp::normalize(column, m_params.normalization); } return column; } MagnitudeRange Colour3DPlotRenderer::renderDirectTranslucent(const LayerGeometryProvider *v, QPainter &paint, QRect rect) { Profiler profiler("Colour3DPlotRenderer::renderDirectTranslucent"); MagnitudeRange magRange; QPoint illuminatePos; bool illuminate = v->shouldIlluminateLocalFeatures (m_sources.verticalBinLayer, illuminatePos); const DenseThreeDimensionalModel *model = m_sources.source; int x0 = rect.left(); int x1 = rect.right() + 1; int h = v->getPaintHeight(); sv_frame_t modelStart = model->getStartFrame(); sv_frame_t modelEnd = model->getEndFrame(); int modelResolution = model->getResolution(); double rateRatio = v->getViewManager()->getMainModelSampleRate() / model->getSampleRate(); // the s-prefix values are source, i.e. model, column and bin numbers int sx0 = int((double(v->getFrameForX(x0)) / rateRatio - double(modelStart)) / modelResolution); int sx1 = int((double(v->getFrameForX(x1)) / rateRatio - double(modelStart)) / modelResolution); int sh = model->getHeight(); const int buflen = 40; char labelbuf[buflen]; int minbin = m_sources.verticalBinLayer->getIBinForY(v, h); if (minbin >= sh) minbin = sh - 1; if (minbin < 0) minbin = 0; int nbins = m_sources.verticalBinLayer->getIBinForY(v, 0) - minbin + 1; if (minbin + nbins > sh) nbins = sh - minbin; int psx = -1; vector preparedColumn; int modelWidth = model->getWidth(); for (int sx = sx0; sx <= sx1; ++sx) { if (sx < 0 || sx >= modelWidth) { continue; } if (sx != psx) { // order: // get column -> scale -> normalise -> record extents -> // peak pick -> distribute/interpolate -> apply display gain // this does the first three: preparedColumn = getColumn(sx, minbin, nbins, -1); magRange.sample(preparedColumn); if (m_params.binDisplay == BinDisplay::PeakBins) { preparedColumn = ColumnOp::peakPick(preparedColumn); } // Display gain belongs to the colour scale and is // applied by the colour scale object when mapping it psx = sx; } sv_frame_t fx = sx * modelResolution + modelStart; if (fx + modelResolution <= modelStart || fx > modelEnd) continue; int rx0 = v->getXForFrame(int(double(fx) * rateRatio)); int rx1 = v->getXForFrame(int(double(fx + modelResolution + 1) * rateRatio)); int rw = rx1 - rx0; if (rw < 1) rw = 1; bool showLabel = (rw > 10 && paint.fontMetrics().width("0.000000") < rw - 3 && paint.fontMetrics().height() < (h / sh)); for (int sy = minbin; sy < minbin + nbins; ++sy) { int ry0 = m_sources.verticalBinLayer->getIYForBin(v, sy); int ry1 = m_sources.verticalBinLayer->getIYForBin(v, sy + 1); if (m_params.invertVertical) { ry0 = h - ry0 - 1; ry1 = h - ry1 - 1; } QRect r(rx0, ry1, rw, ry0 - ry1); float value = preparedColumn[sy - minbin]; QColor colour = m_params.colourScale.getColour(value, m_params.colourRotation); if (rw == 1) { paint.setPen(colour); paint.setBrush(Qt::NoBrush); paint.drawLine(r.x(), r.y(), r.x(), r.y() + r.height() - 1); continue; } QColor pen(255, 255, 255, 80); QColor brush(colour); if (rw > 3 && r.height() > 3) { brush.setAlpha(160); } paint.setPen(Qt::NoPen); paint.setBrush(brush); if (illuminate) { if (r.contains(illuminatePos)) { paint.setPen(v->getForeground()); } } #ifdef DEBUG_COLOUR_PLOT_REPAINT // SVDEBUG << "rect " << r.x() << "," << r.y() << " " // << r.width() << "x" << r.height() << endl; #endif paint.drawRect(r); if (showLabel) { double value = model->getValueAt(sx, sy); snprintf(labelbuf, buflen, "%06f", value); QString text(labelbuf); PaintAssistant::drawVisibleText (v, paint, rx0 + 2, ry0 - h / sh - 1 + 2 + paint.fontMetrics().ascent(), text, PaintAssistant::OutlinedText); } } } return magRange; } void Colour3DPlotRenderer::getPreferredPeakCache(const LayerGeometryProvider *v, int &peakCacheIndex, int &binsPerPeak) const { peakCacheIndex = -1; binsPerPeak = -1; const DenseThreeDimensionalModel *model = m_sources.source; if (!model) return; if (m_params.binDisplay == BinDisplay::PeakFrequencies) return; if (m_params.colourScale.getScale() == ColourScaleType::Phase) return; int zoomLevel = v->getZoomLevel(); int binResolution = model->getResolution(); for (int ix = 0; in_range_for(m_sources.peakCaches, ix); ++ix) { int bpp = m_sources.peakCaches[ix]->getColumnsPerPeak(); int equivZoom = binResolution * bpp; if (zoomLevel >= equivZoom) { // this peak cache would work, though it might not be best if (bpp > binsPerPeak) { // ok, it's better than the best one we've found so far peakCacheIndex = ix; binsPerPeak = bpp; } } } #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "getPreferredPeakCache: zoomLevel = " << zoomLevel << ", binResolution " << binResolution << ", binsPerPeak " << binsPerPeak << ", peakCacheIndex " << peakCacheIndex << ", peakCaches " << m_sources.peakCaches.size() << endl; #endif } void Colour3DPlotRenderer::renderToCachePixelResolution(const LayerGeometryProvider *v, int x0, int repaintWidth, bool rightToLeft, bool timeConstrained) { Profiler profiler("Colour3DPlotRenderer::renderToCachePixelResolution"); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "renderToCachePixelResolution" << endl; #endif // Draw to the draw buffer, and then copy from there. The draw // buffer is at the same resolution as the target in the cache, so // no extra scaling needed. const DenseThreeDimensionalModel *model = m_sources.source; if (!model || !model->isOK() || !model->isReady()) { throw std::logic_error("no source model provided, or model not ready"); } int h = v->getPaintHeight(); clearDrawBuffer(repaintWidth, h); vector binforx(repaintWidth); vector binfory(h); int binResolution = model->getResolution(); for (int x = 0; x < repaintWidth; ++x) { sv_frame_t f0 = v->getFrameForX(x0 + x); double s0 = double(f0 - model->getStartFrame()) / binResolution; binforx[x] = int(s0 + 0.0001); } int peakCacheIndex = -1; int binsPerPeak = -1; getPreferredPeakCache(v, peakCacheIndex, binsPerPeak); for (int y = 0; y < h; ++y) { binfory[y] = m_sources.verticalBinLayer->getBinForY(v, h - y - 1); } int attainedWidth; if (m_params.binDisplay == BinDisplay::PeakFrequencies) { attainedWidth = renderDrawBufferPeakFrequencies(v, repaintWidth, h, binforx, binfory, rightToLeft, timeConstrained); } else { attainedWidth = renderDrawBuffer(repaintWidth, h, binforx, binfory, peakCacheIndex, rightToLeft, timeConstrained); } if (attainedWidth == 0) return; // draw buffer is pixel resolution, no scaling factors or padding involved int paintedLeft = x0; if (rightToLeft) { paintedLeft += (repaintWidth - attainedWidth); } m_cache.drawImage(paintedLeft, attainedWidth, m_drawBuffer, paintedLeft - x0, attainedWidth); for (int i = 0; in_range_for(m_magRanges, i); ++i) { m_magCache.sampleColumn(i, m_magRanges.at(i)); } } QImage Colour3DPlotRenderer::scaleDrawBufferImage(QImage image, int targetWidth, int targetHeight) const { int sourceWidth = image.width(); int sourceHeight = image.height(); // We can only do this if we're making the image larger -- // otherwise peaks may be lost. So this should be called only when // rendering in DrawBufferBinResolution mode. Whenever the bin // size is smaller than the pixel size, in either x or y axis, we // should be using DrawBufferPixelResolution mode instead if (targetWidth < sourceWidth || targetHeight < sourceHeight) { throw std::logic_error("Colour3DPlotRenderer::scaleDrawBufferImage: Can only use this function when making the image larger; should be rendering DrawBufferPixelResolution instead"); } if (sourceWidth <= 0 || sourceHeight <= 0) { throw std::logic_error("Colour3DPlotRenderer::scaleDrawBufferImage: Source image is empty"); } if (targetWidth <= 0 || targetHeight <= 0) { throw std::logic_error("Colour3DPlotRenderer::scaleDrawBufferImage: Target image is empty"); } // This function exists because of some unpredictable behaviour // from Qt when scaling images with FastTransformation mode. We // continue to use Qt's scaler for SmoothTransformation but let's // bring the non-interpolated version "in-house" so we know what // it's really doing. if (m_params.interpolate) { return image.scaled(targetWidth, targetHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } // Same format as the target cache QImage target(targetWidth, targetHeight, QImage::Format_ARGB32_Premultiplied); for (int y = 0; y < targetHeight; ++y) { QRgb *targetLine = reinterpret_cast(target.scanLine(y)); int sy = int((uint64_t(y) * sourceHeight) / targetHeight); if (sy == sourceHeight) --sy; for (int x = 0; x < targetWidth; ++x) { int sx = int((uint64_t(x) * sourceWidth) / targetWidth); if (sx == sourceWidth) --sx; targetLine[x] = image.pixel(sx, sy); } } return target; } void Colour3DPlotRenderer::renderToCacheBinResolution(const LayerGeometryProvider *v, int x0, int repaintWidth) { Profiler profiler("Colour3DPlotRenderer::renderToCacheBinResolution"); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "renderToCacheBinResolution" << endl; #endif // Draw to the draw buffer, and then scale-copy from there. Draw // buffer is at bin resolution, i.e. buffer x == source column // number. We use toolkit smooth scaling for interpolation. const DenseThreeDimensionalModel *model = m_sources.source; if (!model || !model->isOK() || !model->isReady()) { throw std::logic_error("no source model provided, or model not ready"); } // The draw buffer will contain a fragment at bin resolution. We // need to ensure that it starts and ends at points where a // time-bin boundary occurs at an exact pixel boundary, and with a // certain amount of overlap across existing pixels so that we can // scale and draw from it without smoothing errors at the edges. // If (getFrameForX(x) / increment) * increment == // getFrameForX(x), then x is a time-bin boundary. We want two // such boundaries at either side of the draw buffer -- one which // we draw up to, and one which we subsequently crop at. sv_frame_t leftBoundaryFrame = -1, leftCropFrame = -1; sv_frame_t rightBoundaryFrame = -1, rightCropFrame = -1; int drawBufferWidth; int binResolution = model->getResolution(); for (int x = x0; ; --x) { sv_frame_t f = v->getFrameForX(x); if ((f / binResolution) * binResolution == f) { if (leftCropFrame == -1) leftCropFrame = f; else if (x < x0 - 2) { leftBoundaryFrame = f; break; } } } for (int x = x0 + repaintWidth; ; ++x) { sv_frame_t f = v->getFrameForX(x); if ((f / binResolution) * binResolution == f) { if (rightCropFrame == -1) rightCropFrame = f; else if (x > x0 + repaintWidth + 2) { rightBoundaryFrame = f; break; } } } drawBufferWidth = int ((rightBoundaryFrame - leftBoundaryFrame) / binResolution); int h = v->getPaintHeight(); // For our purposes here, the draw buffer needs to be exactly our // target size (so we recreate always rather than just clear it) recreateDrawBuffer(drawBufferWidth, h); vector binforx(drawBufferWidth); vector binfory(h); for (int x = 0; x < drawBufferWidth; ++x) { binforx[x] = int(leftBoundaryFrame / binResolution) + x; } #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "[BIN] binResolution " << binResolution << endl; #endif for (int y = 0; y < h; ++y) { binfory[y] = m_sources.verticalBinLayer->getBinForY(v, h - y - 1); } int attainedWidth = renderDrawBuffer(drawBufferWidth, h, binforx, binfory, -1, false, false); if (attainedWidth == 0) return; int scaledLeft = v->getXForFrame(leftBoundaryFrame); int scaledRight = v->getXForFrame(rightBoundaryFrame); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "scaling draw buffer from width " << m_drawBuffer.width() << " to " << (scaledRight - scaledLeft) << " (nb drawBufferWidth = " << drawBufferWidth << ")" << endl; #endif QImage scaled = scaleDrawBufferImage (m_drawBuffer, scaledRight - scaledLeft, h); int scaledLeftCrop = v->getXForFrame(leftCropFrame); int scaledRightCrop = v->getXForFrame(rightCropFrame); int targetLeft = scaledLeftCrop; if (targetLeft < 0) { targetLeft = 0; } int targetWidth = scaledRightCrop - targetLeft; if (targetLeft + targetWidth > m_cache.getSize().width()) { targetWidth = m_cache.getSize().width() - targetLeft; } int sourceLeft = targetLeft - scaledLeft; if (sourceLeft < 0) { sourceLeft = 0; } #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "repaintWidth = " << repaintWidth << ", targetWidth = " << targetWidth << endl; #endif if (targetWidth > 0) { // we are copying from an image that has already been scaled, // hence using the same width in both geometries m_cache.drawImage(targetLeft, targetWidth, scaled, sourceLeft, targetWidth); } for (int i = 0; i < targetWidth; ++i) { // but the mag range vector has not been scaled int sourceIx = int((double(i + sourceLeft) / scaled.width()) * int(m_magRanges.size())); if (in_range_for(m_magRanges, sourceIx)) { m_magCache.sampleColumn(i, m_magRanges.at(sourceIx)); } } } int Colour3DPlotRenderer::renderDrawBuffer(int w, int h, const vector &binforx, const vector &binfory, int peakCacheIndex, bool rightToLeft, bool timeConstrained) { // Callers must have checked that the appropriate subset of // Sources data members are set for the supplied flags (e.g. that // peakCache corresponding to peakCacheIndex exists) RenderTimer timer(timeConstrained ? RenderTimer::FastRender : RenderTimer::NoTimeout); Profiler profiler("Colour3DPlotRenderer::renderDrawBuffer"); int divisor = 1; const DenseThreeDimensionalModel *sourceModel = m_sources.source; if (peakCacheIndex >= 0) { divisor = m_sources.peakCaches[peakCacheIndex]->getColumnsPerPeak(); sourceModel = m_sources.peakCaches[peakCacheIndex]; } #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "renderDrawBuffer: w = " << w << ", h = " << h << ", peakCacheIndex = " << peakCacheIndex << " (divisor = " << divisor << "), rightToLeft = " << rightToLeft << ", timeConstrained = " << timeConstrained << endl; SVDEBUG << "renderDrawBuffer: normalization = " << int(m_params.normalization) << ", binDisplay = " << int(m_params.binDisplay) << ", binScale = " << int(m_params.binScale) << ", alwaysOpaque = " << m_params.alwaysOpaque << ", interpolate = " << m_params.interpolate << endl; #endif int sh = sourceModel->getHeight(); int minbin = int(binfory[0] + 0.0001); if (minbin >= sh) minbin = sh - 1; if (minbin < 0) minbin = 0; int nbins = int(binfory[h-1] + 0.0001) - minbin + 1; if (minbin + nbins > sh) nbins = sh - minbin; #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "minbin = " << minbin << ", nbins = " << nbins << ", last binfory = " << binfory[h-1] << " (rounds to " << int(binfory[h-1]) << ") (model height " << sh << ")" << endl; #endif int psx = -1; int start = 0; int finish = w; int step = 1; if (rightToLeft) { start = w-1; finish = -1; step = -1; } int xPixelCount = 0; vector preparedColumn; int modelWidth = sourceModel->getWidth(); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "modelWidth " << modelWidth << ", divisor " << divisor << endl; #endif for (int x = start; x != finish; x += step) { // x is the on-canvas pixel coord; sx (later) will be the // source column index ++xPixelCount; if (binforx[x] < 0) continue; int sx0 = binforx[x] / divisor; int sx1 = sx0; if (x+1 < w) sx1 = binforx[x+1] / divisor; if (sx0 < 0) sx0 = sx1 - 1; if (sx0 < 0) continue; if (sx1 <= sx0) sx1 = sx0 + 1; #ifdef DEBUG_COLOUR_PLOT_REPAINT // SVDEBUG << "x = " << x << ", binforx[x] = " << binforx[x] << ", sx range " << sx0 << " -> " << sx1 << endl; #endif vector pixelPeakColumn; MagnitudeRange magRange; for (int sx = sx0; sx < sx1; ++sx) { if (sx < 0 || sx >= modelWidth) { continue; } if (sx != psx) { // order: // get column -> scale -> normalise -> record extents -> // peak pick -> distribute/interpolate -> apply display gain // this does the first three: ColumnOp::Column column = getColumn(sx, minbin, nbins, peakCacheIndex); magRange.sample(column); if (m_params.binDisplay == BinDisplay::PeakBins) { column = ColumnOp::peakPick(column); } preparedColumn = ColumnOp::distribute(column, h, binfory, minbin, m_params.interpolate); // Display gain belongs to the colour scale and is // applied by the colour scale object when mapping it psx = sx; } if (sx == sx0) { pixelPeakColumn = preparedColumn; } else { for (int i = 0; in_range_for(pixelPeakColumn, i); ++i) { pixelPeakColumn[i] = std::max(pixelPeakColumn[i], preparedColumn[i]); } } } if (!pixelPeakColumn.empty()) { for (int y = 0; y < h; ++y) { int py; if (m_params.invertVertical) { py = y; } else { py = h - y - 1; } m_drawBuffer.setPixel (x, py, m_params.colourScale.getPixel(pixelPeakColumn[y])); } m_magRanges.push_back(magRange); } double fractionComplete = double(xPixelCount) / double(w); if (timer.outOfTime(fractionComplete)) { #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "out of time" << endl; #endif updateTimings(timer, xPixelCount); return xPixelCount; } } updateTimings(timer, xPixelCount); return xPixelCount; } int Colour3DPlotRenderer::renderDrawBufferPeakFrequencies(const LayerGeometryProvider *v, int w, int h, const vector &binforx, const vector &binfory, bool rightToLeft, bool timeConstrained) { // Callers must have checked that the appropriate subset of // Sources data members are set for the supplied flags (e.g. that // fft model exists) RenderTimer timer(timeConstrained ? RenderTimer::SlowRender : RenderTimer::NoTimeout); const FFTModel *fft = m_sources.fft; int sh = fft->getHeight(); int minbin = int(binfory[0] + 0.0001); if (minbin >= sh) minbin = sh - 1; if (minbin < 0) minbin = 0; int nbins = int(binfory[h-1]) - minbin + 1; if (minbin + nbins > sh) nbins = sh - minbin; FFTModel::PeakSet peakfreqs; int psx = -1; int start = 0; int finish = w; int step = 1; if (rightToLeft) { start = w-1; finish = -1; step = -1; } int xPixelCount = 0; vector preparedColumn; int modelWidth = fft->getWidth(); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "modelWidth " << modelWidth << endl; #endif double minFreq = (double(minbin) * fft->getSampleRate()) / fft->getFFTSize(); double maxFreq = (double(minbin + nbins - 1) * fft->getSampleRate()) / fft->getFFTSize(); bool logarithmic = (m_params.binScale == BinScale::Log); #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "start = " << start << ", finish = " << finish << ", step = " << step << endl; #endif for (int x = start; x != finish; x += step) { // x is the on-canvas pixel coord; sx (later) will be the // source column index ++xPixelCount; if (binforx[x] < 0) continue; int sx0 = binforx[x]; int sx1 = sx0; if (x+1 < w) sx1 = binforx[x+1]; if (sx0 < 0) sx0 = sx1 - 1; if (sx0 < 0) continue; if (sx1 <= sx0) sx1 = sx0 + 1; vector pixelPeakColumn; MagnitudeRange magRange; for (int sx = sx0; sx < sx1; ++sx) { if (sx < 0 || sx >= modelWidth) { continue; } if (sx != psx) { preparedColumn = getColumn(sx, minbin, nbins, -1); magRange.sample(preparedColumn); psx = sx; } if (sx == sx0) { pixelPeakColumn = preparedColumn; peakfreqs = fft->getPeakFrequencies(FFTModel::AllPeaks, sx, minbin, minbin + nbins - 1); } else { for (int i = 0; in_range_for(pixelPeakColumn, i); ++i) { pixelPeakColumn[i] = std::max(pixelPeakColumn[i], preparedColumn[i]); } } } if (!pixelPeakColumn.empty()) { #ifdef DEBUG_COLOUR_PLOT_REPAINT // SVDEBUG << "found " << peakfreqs.size() << " peak freqs at column " // << sx0 << endl; #endif for (FFTModel::PeakSet::const_iterator pi = peakfreqs.begin(); pi != peakfreqs.end(); ++pi) { int bin = pi->first; double freq = pi->second; if (bin < minbin) continue; if (bin >= minbin + nbins) break; double value = pixelPeakColumn[bin - minbin]; double y = v->getYForFrequency (freq, minFreq, maxFreq, logarithmic); int iy = int(y + 0.5); if (iy < 0 || iy >= h) continue; auto pixel = m_params.colourScale.getPixel(value); #ifdef DEBUG_COLOUR_PLOT_REPAINT // SVDEBUG << "frequency " << freq << " for bin " << bin // << " -> y = " << y << ", iy = " << iy << ", value = " // << value << ", pixel " << pixel << "\n"; #endif m_drawBuffer.setPixel(x, iy, pixel); } m_magRanges.push_back(magRange); } else { #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "pixel peak column for range " << sx0 << " to " << sx1 << " is empty" << endl; #endif } double fractionComplete = double(xPixelCount) / double(w); if (timer.outOfTime(fractionComplete)) { #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "out of time" << endl; #endif updateTimings(timer, xPixelCount); return xPixelCount; } } updateTimings(timer, xPixelCount); return xPixelCount; } void Colour3DPlotRenderer::updateTimings(const RenderTimer &timer, int xPixelCount) { double secondsPerXPixel = timer.secondsPerItem(xPixelCount); // valid if we have enough data points, or if the overall time is // massively slow anyway (as we definitely need to warn about that) bool valid = (xPixelCount > 20 || secondsPerXPixel > 0.01); if (valid) { m_secondsPerXPixel = secondsPerXPixel; m_secondsPerXPixelValid = true; #ifdef DEBUG_COLOUR_PLOT_REPAINT SVDEBUG << "across " << xPixelCount << " x-pixels, seconds per x-pixel = " << m_secondsPerXPixel << endl; #endif } } void Colour3DPlotRenderer::recreateDrawBuffer(int w, int h) { m_drawBuffer = QImage(w, h, QImage::Format_Indexed8); for (int pixel = 0; pixel < 256; ++pixel) { m_drawBuffer.setColor ((unsigned char)pixel, m_params.colourScale.getColourForPixel (pixel, m_params.colourRotation).rgb()); } m_drawBuffer.fill(0); m_magRanges.clear(); } void Colour3DPlotRenderer::clearDrawBuffer(int w, int h) { if (m_drawBuffer.width() < w || m_drawBuffer.height() != h) { recreateDrawBuffer(w, h); } else { m_drawBuffer.fill(0); m_magRanges.clear(); } } QRect Colour3DPlotRenderer::findSimilarRegionExtents(QPoint p) const { QImage image = m_cache.getImage(); ImageRegionFinder finder; QRect rect = finder.findRegionExtents(&image, p); return rect; } sonic-visualiser-3.0.3/svgui/layer/Colour3DPlotRenderer.h0000644000000000000000000003100313111512442021533 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef COLOUR_3D_PLOT_RENDERER_H #define COLOUR_3D_PLOT_RENDERER_H #include "ColourScale.h" #include "ScrollableImageCache.h" #include "ScrollableMagRangeCache.h" #include "base/ColumnOp.h" #include "base/MagnitudeRange.h" #include #include #include class LayerGeometryProvider; class VerticalBinLayer; class DenseThreeDimensionalModel; class Dense3DModelPeakCache; class FFTModel; class RenderTimer; enum class BinDisplay { AllBins, PeakBins, PeakFrequencies }; enum class BinScale { Linear, Log }; class Colour3DPlotRenderer { public: struct Sources { Sources() : verticalBinLayer(0), source(0), fft(0) { } // These must all outlive this class const VerticalBinLayer *verticalBinLayer; // always const DenseThreeDimensionalModel *source; // always const FFTModel *fft; // optionally std::vector peakCaches; // zero or more }; struct Parameters { Parameters() : colourScale(ColourScale::Parameters()), normalization(ColumnNormalization::None), binDisplay(BinDisplay::AllBins), binScale(BinScale::Linear), alwaysOpaque(false), interpolate(false), invertVertical(false), scaleFactor(1.0), colourRotation(0) { } /** A complete ColourScale object by value, used for colour * map conversion. Note that the final display gain setting is * also encapsulated here. */ ColourScale colourScale; /** Type of column normalization. */ ColumnNormalization normalization; /** Selection of bins to display. */ BinDisplay binDisplay; /** Scale for vertical bin spacing (linear or logarithmic). */ BinScale binScale; /** Whether cells should always be opaque. If false, then * large cells (when zoomed in a long way) will be rendered * translucent in order not to obscure anything in a layer * beneath. */ bool alwaysOpaque; /** Whether to apply smoothing when rendering cells at more * than one pixel per cell. !!! todo: decide about separating * out x-interpolate and y-interpolate as the spectrogram * actually does (or used to) */ bool interpolate; /** Whether to render the whole caboodle upside-down. */ bool invertVertical; /** Initial scale factor (e.g. for FFT scaling). This factor * is applied to all values read from the underlying model * *before* magnitude ranges are calculated, in contrast to * the display gain found in the ColourScale parameter. */ double scaleFactor; /** Colourmap rotation, in the range 0-255. */ int colourRotation; }; Colour3DPlotRenderer(Sources sources, Parameters parameters) : m_sources(sources), m_params(parameters), m_secondsPerXPixel(0.0), m_secondsPerXPixelValid(false) { } struct RenderResult { /** * The rect that was actually rendered. May be equal to the * rect that was requested to render, or may be smaller if * time ran out and the complete flag was not set. */ QRect rendered; /** * The magnitude range of the data in the rendered area, after * initial scaling (parameters.scaleFactor) and normalisation, * for use in displaying colour scale etc. (Note that the * magnitude range *before* normalisation would not be very * meaningful for this purpose, as the scale would need to be * different for every column if column or hybrid * normalisation was in use.) */ MagnitudeRange range; }; /** * Render the requested area using the given painter, obtaining * geometry (e.g. start frame) from the given * LayerGeometryProvider. * * The whole of the supplied rect will be rendered and the * returned QRect will be equal to the supplied QRect. (See * renderTimeConstrained for an alternative that may render only * part of the rect in cases where obtaining source data is slow * and retaining responsiveness is important.) * * Note that Colour3DPlotRenderer retains internal cache state * related to the size and position of the supplied * LayerGeometryProvider. Although it is valid to call render() * successively on the same Colour3DPlotRenderer with different * LayerGeometryProviders, it will be much faster to use a * dedicated Colour3DPlotRenderer for each LayerGeometryProvider. * * If the model to render from is not ready, this will throw a * std::logic_error exception. The model must be ready and the * layer requesting the render must not be dormant in its view, so * that the LayerGeometryProvider returns valid results; it is the * caller's responsibility to ensure these. */ RenderResult render(const LayerGeometryProvider *v, QPainter &paint, QRect rect); /** * Render the requested area using the given painter, obtaining * geometry (e.g. start frame) from the stored * LayerGeometryProvider. * * As much of the rect will be rendered as can be managed given * internal time constraints (using a RenderTimer object * internally). The returned QRect (the rendered field in the * RenderResult struct) will contain the area that was * rendered. Note that we always render the full requested height, * it's only width that is time-constrained. * * Note that Colour3DPlotRenderer retains internal cache state * related to the size and position of the supplied * LayerGeometryProvider. Although it is valid to call render() * successively on the same Colour3DPlotRenderer with different * LayerGeometryProviders, it will be much faster to use a * dedicated Colour3DPlotRenderer for each LayerGeometryProvider. * * If the model to render from is not ready, this will throw a * std::logic_error exception. The model must be ready and the * layer requesting the render must not be dormant in its view, so * that the LayerGeometryProvider returns valid results; it is the * caller's responsibility to ensure these. */ RenderResult renderTimeConstrained(const LayerGeometryProvider *v, QPainter &paint, QRect rect); /** * Return the area of the largest rectangle within the entire area * of the cache that is unavailable in the cache. This is only * valid in relation to a preceding render() call which is * presumed to have set the area, start frame, and zoom level for * the cache. It could be used to establish a suitable region for * a subsequent paint request (because if an area is not in the * cache, it cannot have been rendered since the cache was * cleared). * * Returns an empty QRect if the cache is entirely valid. */ QRect getLargestUncachedRect(const LayerGeometryProvider *v); /** * Return true if the provider's geometry differs from the cache, * or if we are not using a cache. i.e. if the cache will be * regenerated for the next render, or the next render performed * from scratch. */ bool geometryChanged(const LayerGeometryProvider *v); /** * Return true if the rendering will be opaque. This may be used * by the calling layer to determine whether it can scroll * directly without regard to any other layers beneath. */ bool willRenderOpaque(const LayerGeometryProvider *v) { return decideRenderType(v) != DirectTranslucent; } /** * Return the colour corresponding to the given value. * \see ColourScale::getPixel * \see ColourScale::getColour */ QColor getColour(double value) const { return m_params.colourScale.getColour(value, m_params.colourRotation); } /** * Return the enclosing rectangle for the region of similar colour * to the given point within the cache. Return an empty QRect if * this is not possible. \see ImageRegionFinder */ QRect findSimilarRegionExtents(QPoint point) const; private: Sources m_sources; Parameters m_params; // Draw buffer is the target of each partial repaint. It is always // at view height (not model height) and is cleared and repainted // on each fragment render. The only reason it's stored as a data // member is to avoid reallocation. QImage m_drawBuffer; // A temporary store of magnitude ranges per-column, used when // rendering to the draw buffer. This always has the same length // as the width of the draw buffer, and the x coordinates of the // two containers are equivalent. std::vector m_magRanges; // The image cache is our persistent record of the visible // area. It is always the same size as the view (i.e. the paint // size reported by the LayerGeometryProvider) and is scrolled and // partially repainted internally as appropriate. A render request // is carried out by repainting to cache (via the draw buffer) any // area that is being requested but is not valid in the cache, and // then repainting from cache to the requested painter. ScrollableImageCache m_cache; // The mag range cache is our record of the column magnitude // ranges for each of the columns in the cache. It always has the // same start frame and width as the image cache, and the column // indices match up across both. Our cache update mechanism // guarantees that every valid column in the image cache has a // valid range in the magnitude cache, but not necessarily vice // versa (as the image cache is limited to contiguous ranges). ScrollableMagRangeCache m_magCache; double m_secondsPerXPixel; bool m_secondsPerXPixelValid; RenderResult render(const LayerGeometryProvider *v, QPainter &paint, QRect rect, bool timeConstrained); MagnitudeRange renderDirectTranslucent(const LayerGeometryProvider *v, QPainter &paint, QRect rect); void renderToCachePixelResolution(const LayerGeometryProvider *v, int x0, int repaintWidth, bool rightToLeft, bool timeConstrained); void renderToCacheBinResolution(const LayerGeometryProvider *v, int x0, int repaintWidth); int renderDrawBuffer(int w, int h, const std::vector &binforx, const std::vector &binfory, int peakCacheIndex, // -1 => don't use a peak cache bool rightToLeft, bool timeConstrained); int renderDrawBufferPeakFrequencies(const LayerGeometryProvider *v, int w, int h, const std::vector &binforx, const std::vector &binfory, bool rightToLeft, bool timeConstrained); void recreateDrawBuffer(int w, int h); void clearDrawBuffer(int w, int h); enum RenderType { DrawBufferPixelResolution, DrawBufferBinResolution, DirectTranslucent }; RenderType decideRenderType(const LayerGeometryProvider *) const; QImage scaleDrawBufferImage(QImage source, int targetWidth, int targetHeight) const; ColumnOp::Column getColumn(int sx, int minbin, int nbins, int peakCacheIndex) const; // -1 => don't use cache void getPreferredPeakCache(const LayerGeometryProvider *, int &peakCacheIndex, int &binsPerPeak) const; void updateTimings(const RenderTimer &timer, int xPixelCount); }; #endif sonic-visualiser-3.0.3/svgui/layer/ColourDatabase.cpp0000644000000000000000000001116513111512442021005 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColourDatabase.h" #include "base/XmlExportable.h" #include ColourDatabase ColourDatabase::m_instance; ColourDatabase * ColourDatabase::getInstance() { return &m_instance; } ColourDatabase::ColourDatabase() { } int ColourDatabase::getColourCount() const { return int(m_colours.size()); } QString ColourDatabase::getColourName(int c) const { if (!in_range_for(m_colours, c)) return ""; return m_colours[c].name; } QColor ColourDatabase::getColour(int c) const { if (!in_range_for(m_colours, c)) return Qt::black; return m_colours[c].colour; } QColor ColourDatabase::getColour(QString name) const { for (auto &c: m_colours) { if (c.name == name) return c.colour; } return Qt::black; } int ColourDatabase::getColourIndex(QString name) const { int index = 0; for (auto &c: m_colours) { if (c.name == name) return index; ++index; } return -1; } int ColourDatabase::getColourIndex(QColor col) const { int index = 0; for (auto &c: m_colours) { if (c.colour == col) return index; ++index; } return -1; } bool ColourDatabase::useDarkBackground(int c) const { if (!in_range_for(m_colours, c)) return false; return m_colours[c].darkbg; } void ColourDatabase::setUseDarkBackground(int c, bool dark) { if (!in_range_for(m_colours, c)) return; if (m_colours[c].darkbg != dark) { m_colours[c].darkbg = dark; emit colourDatabaseChanged(); } } int ColourDatabase::addColour(QColor c, QString name) { int index = 0; for (ColourList::iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->name == name) { i->colour = c; return index; } ++index; } ColourRec rec; rec.colour = c; rec.name = name; rec.darkbg = false; m_colours.push_back(rec); emit colourDatabaseChanged(); return index; } void ColourDatabase::removeColour(QString name) { for (ColourList::iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->name == name) { m_colours.erase(i); return; } } } void ColourDatabase::getStringValues(int index, QString &colourName, QString &colourSpec, QString &darkbg) const { colourName = ""; colourSpec = ""; if (!in_range_for(m_colours, index)) return; colourName = getColourName(index); QColor c = getColour(index); colourSpec = XmlExportable::encodeColour(c.red(), c.green(), c.blue()); darkbg = useDarkBackground(index) ? "true" : "false"; } int ColourDatabase::putStringValues(QString colourName, QString colourSpec, QString darkbg) { int index = -1; if (colourSpec != "") { QColor colour(colourSpec); index = getColourIndex(colour); if (index < 0) { index = addColour(colour, colourName == "" ? colourSpec : colourName); } } else if (colourName != "") { index = getColourIndex(colourName); } if (index >= 0) { setUseDarkBackground(index, darkbg == "true"); } return index; } void ColourDatabase::getColourPropertyRange(int *min, int *max) const { ColourDatabase *db = getInstance(); if (min) *min = 0; if (max) { *max = 0; if (db->getColourCount() > 0) *max = db->getColourCount()-1; } } QPixmap ColourDatabase::getExamplePixmap(int index, QSize size) const { QPixmap pmap(size); pmap.fill(useDarkBackground(index) ? Qt::black : Qt::white); QPainter paint(&pmap); QColor colour(getColour(index)); paint.setPen(colour); paint.setBrush(colour); int margin = 2; if (size.width() < 4 || size.height() < 4) margin = 0; else if (size.width() < 8 || size.height() < 8) margin = 1; paint.drawRect(margin, margin, size.width() - margin*2 - 1, size.height() - margin*2 - 1); return pmap; } sonic-visualiser-3.0.3/svgui/layer/ColourDatabase.h0000644000000000000000000000444213111512442020452 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _COLOUR_DATABASE_H_ #define _COLOUR_DATABASE_H_ #include #include #include #include #include #include class ColourDatabase : public QObject { Q_OBJECT public: static ColourDatabase *getInstance(); int getColourCount() const; QString getColourName(int c) const; QColor getColour(int c) const; QColor getColour(QString name) const; int getColourIndex(QString name) const; // -1 -> not found int getColourIndex(QColor c) const; // returns first index of possibly many bool haveColour(QColor c) const; bool useDarkBackground(int c) const; void setUseDarkBackground(int c, bool dark); int addColour(QColor, QString); // returns index void removeColour(QString); // returned colour is not necessarily in database QColor getContrastingColour(int c) const; // for use in XML export void getStringValues(int index, QString &colourName, QString &colourSpec, QString &darkbg) const; // for use in XML import int putStringValues(QString colourName, QString colourSpec, QString darkbg); // for use by PropertyContainer getPropertyRangeAndValue methods void getColourPropertyRange(int *min, int *max) const; QPixmap getExamplePixmap(int index, QSize size) const; signals: void colourDatabaseChanged(); protected: ColourDatabase(); struct ColourRec { QColor colour; QString name; bool darkbg; }; typedef std::vector ColourList; ColourList m_colours; static ColourDatabase m_instance; }; #endif sonic-visualiser-3.0.3/svgui/layer/ColourMapper.cpp0000644000000000000000000002033613111512442020525 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColourMapper.h" #include #include #include "base/Debug.h" #include #include using namespace std; static vector convertStrings(const vector &strs) { vector converted; for (const auto &s: strs) converted.push_back(QColor(s)); reverse(converted.begin(), converted.end()); return converted; } static vector ice = convertStrings({ // Based on ColorBrewer ylGnBu "#ffffff", "#ffff00", "#f7fcf0", "#e0f3db", "#ccebc5", "#a8ddb5", "#7bccc4", "#4eb3d3", "#2b8cbe", "#0868ac", "#084081", "#042040" }); static vector cherry = convertStrings({ "#f7f7f7", "#fddbc7", "#f4a582", "#d6604d", "#b2182b", "#dd3497", "#ae017e", "#7a0177", "#49006a" }); static void mapDiscrete(double norm, vector &colours, double &r, double &g, double &b) { int n = int(colours.size()); double m = norm * (n-1); if (m >= n-1) { colours[n-1].getRgbF(&r, &g, &b, 0); return; } if (m <= 0) { colours[0].getRgbF(&r, &g, &b, 0); return; } int base(int(floor(m))); double prop0 = (base + 1.0) - m, prop1 = m - base; QColor c0(colours[base]), c1(colours[base+1]); r = c0.redF() * prop0 + c1.redF() * prop1; g = c0.greenF() * prop0 + c1.greenF() * prop1; b = c0.blueF() * prop0 + c1.blueF() * prop1; } ColourMapper::ColourMapper(int map, double min, double max) : m_map(map), m_min(min), m_max(max) { if (m_min == m_max) { cerr << "WARNING: ColourMapper: min == max (== " << m_min << "), adjusting" << endl; m_max = m_min + 1; } } ColourMapper::~ColourMapper() { } int ColourMapper::getColourMapCount() { return 12; } QString ColourMapper::getColourMapName(int n) { if (n >= getColourMapCount()) return QObject::tr(""); StandardMap map = (StandardMap)n; switch (map) { case Green: return QObject::tr("Green"); case WhiteOnBlack: return QObject::tr("White on Black"); case BlackOnWhite: return QObject::tr("Black on White"); case Cherry: return QObject::tr("Cherry"); case Wasp: return QObject::tr("Wasp"); case Ice: return QObject::tr("Ice"); case Sunset: return QObject::tr("Sunset"); case FruitSalad: return QObject::tr("Fruit Salad"); case Banded: return QObject::tr("Banded"); case Highlight: return QObject::tr("Highlight"); case Printer: return QObject::tr("Printer"); case HighGain: return QObject::tr("High Gain"); } return QObject::tr(""); } QColor ColourMapper::map(double value) const { double norm = (value - m_min) / (m_max - m_min); if (norm < 0.0) norm = 0.0; if (norm > 1.0) norm = 1.0; double h = 0.0, s = 0.0, v = 0.0, r = 0.0, g = 0.0, b = 0.0; bool hsv = true; double blue = 0.6666, pieslice = 0.3333; if (m_map >= getColourMapCount()) return Qt::black; StandardMap map = (StandardMap)m_map; switch (map) { case Green: h = blue - norm * 2.0 * pieslice; s = 0.5f + norm/2.0; v = norm; break; case WhiteOnBlack: r = g = b = norm; hsv = false; break; case BlackOnWhite: r = g = b = 1.0 - norm; hsv = false; break; case Cherry: hsv = false; mapDiscrete(norm, cherry, r, g, b); break; case Wasp: h = 0.15; s = 1.0; v = norm; break; case Sunset: r = (norm - 0.24) * 2.38; if (r > 1.0) r = 1.0; if (r < 0.0) r = 0.0; g = (norm - 0.64) * 2.777; if (g > 1.0) g = 1.0; if (g < 0.0) g = 0.0; b = (3.6f * norm); if (norm > 0.277) b = 2.0 - b; if (b > 1.0) b = 1.0; if (b < 0.0) b = 0.0; hsv = false; break; case FruitSalad: h = blue + (pieslice/6.0) - norm; if (h < 0.0) h += 1.0; s = 1.0; v = 1.0; break; case Banded: if (norm < 0.125) return Qt::darkGreen; else if (norm < 0.25) return Qt::green; else if (norm < 0.375) return Qt::darkBlue; else if (norm < 0.5) return Qt::blue; else if (norm < 0.625) return Qt::darkYellow; else if (norm < 0.75) return Qt::yellow; else if (norm < 0.875) return Qt::darkRed; else return Qt::red; break; case Highlight: if (norm > 0.99) return Qt::white; else return Qt::darkBlue; case Printer: if (norm > 0.8) { r = 1.0; } else if (norm > 0.7) { r = 0.9; } else if (norm > 0.6) { r = 0.8; } else if (norm > 0.5) { r = 0.7; } else if (norm > 0.4) { r = 0.6; } else if (norm > 0.3) { r = 0.5; } else if (norm > 0.2) { r = 0.4; } else { r = 0.0; } r = g = b = 1.0 - r; hsv = false; break; case HighGain: if (norm <= 1.0 / 256.0) { norm = 0.0; } else { norm = 0.1f + (pow(((norm - 0.5) * 2.0), 3.0) + 1.0) / 2.081; } // now as for Sunset r = (norm - 0.24) * 2.38; if (r > 1.0) r = 1.0; if (r < 0.0) r = 0.0; g = (norm - 0.64) * 2.777; if (g > 1.0) g = 1.0; if (g < 0.0) g = 0.0; b = (3.6f * norm); if (norm > 0.277) b = 2.0 - b; if (b > 1.0) b = 1.0; if (b < 0.0) b = 0.0; hsv = false; /* if (r > 1.0) r = 1.0; r = g = b = 1.0 - r; hsv = false; */ break; case Ice: hsv = false; mapDiscrete(norm, ice, r, g, b); } if (hsv) { return QColor::fromHsvF(h, s, v); } else { return QColor::fromRgbF(r, g, b); } } QColor ColourMapper::getContrastingColour() const { if (m_map >= getColourMapCount()) return Qt::white; StandardMap map = (StandardMap)m_map; switch (map) { case Green: return QColor(255, 150, 50); case WhiteOnBlack: return Qt::red; case BlackOnWhite: return Qt::darkGreen; case Cherry: return Qt::green; case Wasp: return QColor::fromHsv(240, 255, 255); case Ice: return Qt::red; case Sunset: return Qt::white; case FruitSalad: return Qt::white; case Banded: return Qt::cyan; case Highlight: return Qt::red; case Printer: return Qt::red; case HighGain: return Qt::red; } return Qt::white; } bool ColourMapper::hasLightBackground() const { if (m_map >= getColourMapCount()) return false; StandardMap map = (StandardMap)m_map; switch (map) { case BlackOnWhite: case Printer: case HighGain: return true; case Green: case Sunset: case WhiteOnBlack: case Cherry: case Wasp: case Ice: case FruitSalad: case Banded: case Highlight: default: return false; } } QPixmap ColourMapper::getExamplePixmap(QSize size) const { QPixmap pmap(size); pmap.fill(Qt::white); QPainter paint(&pmap); int w = size.width(), h = size.height(); int margin = 2; if (w < 4 || h < 4) margin = 0; else if (w < 8 || h < 8) margin = 1; int n = w - margin*2; for (int x = 0; x < n; ++x) { double value = m_min + ((m_max - m_min) * x) / (n-1); QColor colour(map(value)); paint.setPen(colour); paint.drawLine(x + margin, margin, x + margin, h - margin); } return pmap; } sonic-visualiser-3.0.3/svgui/layer/ColourMapper.h0000644000000000000000000000335013111512442020167 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_COLOUR_MAPPER_H #define SV_COLOUR_MAPPER_H #include #include #include #include /** * A class for mapping intensity values onto various colour maps. */ class ColourMapper { public: ColourMapper(int map, double minValue, double maxValue); ~ColourMapper(); ColourMapper(const ColourMapper &) = default; ColourMapper &operator=(const ColourMapper &) = default; enum StandardMap { Green, Sunset, WhiteOnBlack, BlackOnWhite, Cherry, Wasp, Ice, FruitSalad, Banded, Highlight, Printer, HighGain }; int getMap() const { return m_map; } double getMinValue() const { return m_min; } double getMaxValue() const { return m_max; } static int getColourMapCount(); static QString getColourMapName(int n); QColor map(double value) const; QColor getContrastingColour() const; // for cursors etc bool hasLightBackground() const; QPixmap getExamplePixmap(QSize size) const; protected: int m_map; double m_min; double m_max; }; #endif sonic-visualiser-3.0.3/svgui/layer/ColourScale.cpp0000644000000000000000000001201513111512442020323 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColourScale.h" #include "base/AudioLevel.h" #include "base/LogRange.h" #include #include using namespace std; int ColourScale::m_maxPixel = 255; ColourScale::ColourScale(Parameters parameters) : m_params(parameters), m_mapper(m_params.colourMap, 1.f, double(m_maxPixel)) { if (m_params.minValue >= m_params.maxValue) { cerr << "ERROR: ColourScale::ColourScale: minValue = " << m_params.minValue << ", maxValue = " << m_params.maxValue << endl; throw std::logic_error("maxValue must be greater than minValue"); } m_mappedMin = m_params.minValue; m_mappedMax = m_params.maxValue; if (m_mappedMin < m_params.threshold) { m_mappedMin = m_params.threshold; } if (m_params.scaleType == ColourScaleType::Log) { // When used in e.g. spectrogram, we have a range with a min // value of zero. The LogRange converts that to a threshold // value of -10, so for a range of e.g. (0,1) we end up with // (-10,0) as the mapped range. // // But in other contexts we could end up with a mapped range // much larger than that if we have a small non-zero minimum // value (less than 1e-10), or a particularly large // maximum. That's unlikely to give us good results, so let's // insist that the mapped log range has no more than 10 // difference between min and max, to match the behaviour when // min == 0 at the input. // double threshold = -10.0; LogRange::mapRange(m_mappedMin, m_mappedMax, threshold); if (m_mappedMin < m_mappedMax + threshold) { m_mappedMin = m_mappedMax + threshold; } } else if (m_params.scaleType == ColourScaleType::PlusMinusOne) { m_mappedMin = -1.0; m_mappedMax = 1.0; } else if (m_params.scaleType == ColourScaleType::Absolute) { m_mappedMin = fabs(m_mappedMin); m_mappedMax = fabs(m_mappedMax); if (m_mappedMin >= m_mappedMax) { std::swap(m_mappedMin, m_mappedMax); } } if (m_mappedMin >= m_mappedMax) { cerr << "ERROR: ColourScale::ColourScale: minValue = " << m_params.minValue << ", maxValue = " << m_params.maxValue << ", threshold = " << m_params.threshold << ", scale = " << int(m_params.scaleType) << " resulting in mapped minValue = " << m_mappedMin << ", mapped maxValue = " << m_mappedMax << endl; throw std::logic_error("maxValue must be greater than minValue [after mapping]"); } } ColourScale::~ColourScale() { } ColourScaleType ColourScale::getScale() const { return m_params.scaleType; } int ColourScale::getPixel(double value) const { double maxPixF = m_maxPixel; if (m_params.scaleType == ColourScaleType::Phase) { double half = (maxPixF - 1.f) / 2.f; int pixel = 1 + int((value * half) / M_PI + half); // cerr << "phase = " << value << " pixel = " << pixel << endl; return pixel; } value *= m_params.gain; if (value < m_params.threshold) return 0; double mapped = value; if (m_params.scaleType == ColourScaleType::Log) { mapped = LogRange::map(value); } else if (m_params.scaleType == ColourScaleType::PlusMinusOne) { if (mapped < -1.f) mapped = -1.f; if (mapped > 1.f) mapped = 1.f; } else if (m_params.scaleType == ColourScaleType::Absolute) { if (mapped < 0.f) mapped = -mapped; } mapped *= m_params.multiple; if (mapped < m_mappedMin) { mapped = m_mappedMin; } if (mapped > m_mappedMax) { mapped = m_mappedMax; } double proportion = (mapped - m_mappedMin) / (m_mappedMax - m_mappedMin); int pixel = 0; if (m_params.scaleType == ColourScaleType::Meter) { pixel = AudioLevel::multiplier_to_preview(proportion, m_maxPixel-1) + 1; } else { pixel = int(proportion * maxPixF) + 1; } if (pixel < 0) { pixel = 0; } if (pixel > m_maxPixel) { pixel = m_maxPixel; } return pixel; } QColor ColourScale::getColourForPixel(int pixel, int rotation) const { if (pixel < 0) { pixel = 0; } if (pixel > m_maxPixel) { pixel = m_maxPixel; } if (pixel == 0) { if (m_mapper.hasLightBackground()) { return Qt::white; } else { return Qt::black; } } else { int target = int(pixel) + rotation; while (target < 1) target += m_maxPixel; while (target > m_maxPixel) target -= m_maxPixel; return m_mapper.map(double(target)); } } sonic-visualiser-3.0.3/svgui/layer/ColourScale.h0000644000000000000000000000705613111512442020001 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef COLOUR_SCALE_H #define COLOUR_SCALE_H #include "ColourMapper.h" enum class ColourScaleType { Linear, Meter, Log, Phase, PlusMinusOne, Absolute }; /** * Map values within a range onto a set of colours, with a given * distribution (linear, log etc) and optional colourmap rotation. */ class ColourScale { public: struct Parameters { Parameters() : colourMap(0), scaleType(ColourScaleType::Linear), minValue(0.0), maxValue(1.0), threshold(0.0), gain(1.0), multiple(1.0) { } /** A colour map index as used by ColourMapper */ int colourMap; /** Distribution for the scale */ ColourScaleType scaleType; /** Minimum value in source range */ double minValue; /** Maximum value in source range. Must be > minValue */ double maxValue; /** Threshold below which every value is mapped to background pixel 0 */ double threshold; /** Gain to apply before thresholding, mapping, and clamping */ double gain; /** Multiple to apply after thresholding and mapping. In most * cases the gain parameter is the one you want instead of * this, but this can be used for example with Log scale to * produce the log of some power of the original value, * e.g. multiple = 2 gives log(x^2). */ double multiple; }; /** * Create a ColourScale with the given parameters. * * Note that some parameters may be ignored for some scale * distribution settings. For example, min and max are ignored for * PlusMinusOneScale and PhaseColourScale and threshold and gain * are ignored for PhaseColourScale. */ ColourScale(Parameters parameters); ~ColourScale(); ColourScale(const ColourScale &) = default; ColourScale &operator=(const ColourScale &) = default; /** * Return the general type of scale this is. */ ColourScaleType getScale() const; /** * Return a pixel number (in the range 0-255 inclusive) * corresponding to the given value. The pixel 0 is used only for * values below the threshold supplied in the constructor. All * other values are mapped onto the range 1-255. */ int getPixel(double value) const; /** * Return the colour for the given pixel number (which must be in * the range 0-255). The pixel 0 is always the background * colour. Other pixels are mapped taking into account the given * colourmap rotation (which is also a value in the range 0-255). */ QColor getColourForPixel(int pixel, int rotation) const; /** * Return the colour corresponding to the given value. This is * equivalent to getColourForPixel(getPixel(value), rotation). */ QColor getColour(double value, int rotation) const { return getColourForPixel(getPixel(value), rotation); } private: Parameters m_params; ColourMapper m_mapper; double m_mappedMin; double m_mappedMax; static int m_maxPixel; }; #endif sonic-visualiser-3.0.3/svgui/layer/ColourScaleLayer.h0000644000000000000000000000234013111512442020765 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef COLOUR_SCALE_LAYER_H #define COLOUR_SCALE_LAYER_H #include #include class LayerGeometryProvider; /** * Interface for layers in which a colour scale represents (or can * sometimes represent, depending on the display mode) the sample * value. For example, TimeValueLayer uses colour scale when in * segment mode and so provides this interface for use by the * LogColourScale or LinearColourScale scale renderers. */ class ColourScaleLayer { public: virtual QString getScaleUnits() const = 0; virtual QColor getColourForValue(LayerGeometryProvider *v, double value) const = 0; }; #endif sonic-visualiser-3.0.3/svgui/layer/FlexiNoteLayer.cpp0000644000000000000000000016066513111512442021021 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "FlexiNoteLayer.h" #include "data/model/Model.h" #include "data/model/SparseTimeValueModel.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/Pitch.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "ColourDatabase.h" #include "LayerGeometryProvider.h" #include "PianoScale.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "PaintAssistant.h" #include "data/model/FlexiNoteModel.h" #include "view/View.h" #include "widgets/ItemEditDialog.h" #include "widgets/TextAbbrev.h" #include #include #include #include #include #include #include #include #include // GF: included to compile std::numerical_limits on linux #include FlexiNoteLayer::FlexiNoteLayer() : SingleColourLayer(), // m_model(0), // m_editing(false), // m_originalPoint(0, 0.0, 0, 1.f, tr("New Point")), // m_editingPoint(0, 0.0, 0, 1.f, tr("New Point")), // m_editingCommand(0), // m_verticalScale(AutoAlignScale), // m_scaleMinimum(0), // m_scaleMaximum(0) m_model(0), m_editing(false), m_intelligentActions(true), m_dragPointX(0), m_dragPointY(0), m_dragStartX(0), m_dragStartY(0), m_originalPoint(0, 0.0, 0, 1.f, tr("New Point")), m_editingPoint(0, 0.0, 0, 1.f, tr("New Point")), m_greatestLeftNeighbourFrame(0), m_smallestRightNeighbourFrame(0), m_editingCommand(0), m_verticalScale(AutoAlignScale), m_editMode(DragNote), m_scaleMinimum(34), m_scaleMaximum(77) { } void FlexiNoteLayer::setModel(FlexiNoteModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); // m_scaleMinimum = 0; // m_scaleMaximum = 0; emit modelReplaced(); } Layer::PropertyList FlexiNoteLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Vertical Scale"); list.push_back("Scale Units"); return list; } QString FlexiNoteLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType FlexiNoteLayer::getPropertyType(const PropertyName &name) const { if (name == "Scale Units") return UnitsProperty; if (name == "Vertical Scale") return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString FlexiNoteLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } return SingleColourLayer::getPropertyGroupName(name); } QString FlexiNoteLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } int FlexiNoteLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(AutoAlignScale); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString FlexiNoteLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Linear"); case 2: return tr("Log"); case 3: return tr("MIDI Notes"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void FlexiNoteLayer::setProperty(const PropertyName &name, int value) { if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else { return SingleColourLayer::setProperty(name, value); } } void FlexiNoteLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } bool FlexiNoteLayer::isLayerScrollable(const LayerGeometryProvider *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } bool FlexiNoteLayer::shouldConvertMIDIToHz() const { QString unit = getScaleUnits(); return (unit != "Hz"); // if (unit == "" || // unit.startsWith("MIDI") || // unit.startsWith("midi")) return true; // return false; } bool FlexiNoteLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (shouldConvertMIDIToHz()) { unit = "Hz"; min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } else unit = getScaleUnits(); if (m_verticalScale == MIDIRangeScale || m_verticalScale == LogScale) logarithmic = true; return true; } bool FlexiNoteLayer::getDisplayExtents(double &min, double &max) const { if (!m_model || shouldAutoAlign()) { // std::cerr << "No model or shouldAutoAlign()" << std::endl; return false; } if (m_verticalScale == MIDIRangeScale) { min = Pitch::getFrequencyForPitch(0); max = Pitch::getFrequencyForPitch(127); return true; } if (m_scaleMinimum == m_scaleMaximum) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); } else { min = m_scaleMinimum; max = m_scaleMaximum; } if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::getDisplayExtents: min = " << min << ", max = " << max << " (m_scaleMinimum = " << m_scaleMinimum << ", m_scaleMaximum = " << m_scaleMaximum << ")" << endl; #endif return true; } bool FlexiNoteLayer::setDisplayExtents(double min, double max) { if (!m_model) return false; if (min == max) { if (min == 0.f) { max = 1.f; } else { max = min * 1.0001f; } } m_scaleMinimum = min; m_scaleMaximum = max; #ifdef DEBUG_NOTE_LAYER cerr << "FlexiNoteLayer::setDisplayExtents: min = " << min << ", max = " << max << endl; #endif emit layerParametersChanged(); return true; } int FlexiNoteLayer::getVerticalZoomSteps(int &defaultStep) const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; defaultStep = 0; return 100; } int FlexiNoteLayer::getCurrentVerticalZoomStep() const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return 0; double dmin, dmax; getDisplayExtents(dmin, dmax); int nr = mapper->getPositionForValue(dmax - dmin); delete mapper; return 100 - nr; } //!!! lots of duplication with TimeValueLayer void FlexiNoteLayer::setVerticalZoomStep(int step) { if (shouldAutoAlign()) return; if (!m_model) return; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return; double min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); double dmin, dmax; getDisplayExtents(dmin, dmax); double newdist = mapper->getValueForPosition(100 - step); double newmin, newmax; if (logarithmic) { // see SpectrogramLayer::setVerticalZoomStep newmax = (newdist + sqrt(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; } else { double dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } if (newmin < min) { newmax += (min - newmin); newmin = min; } if (newmax > max) { newmax = max; } #ifdef DEBUG_NOTE_LAYER cerr << "FlexiNoteLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; #endif setDisplayExtents(newmin, newmax); } RangeMapper * FlexiNoteLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; RangeMapper *mapper; double min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); if (min == max) return 0; if (logarithmic) { mapper = new LogRangeMapper(0, 100, min, max, unit); } else { mapper = new LinearRangeMapper(0, 100, min, max, unit); } return mapper; } FlexiNoteModel::PointList FlexiNoteLayer::getLocalPoints(LayerGeometryProvider *v, int x) const { if (!m_model) return FlexiNoteModel::PointList(); sv_frame_t frame = v->getFrameForX(x); FlexiNoteModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } FlexiNoteModel::PointList prevPoints = m_model->getPreviousPoints(frame); FlexiNoteModel::PointList nextPoints = m_model->getNextPoints(frame); FlexiNoteModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (prevPoints.begin()->frame < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (nextPoints.begin()->frame - frame < frame - prevPoints.begin()->frame) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } bool FlexiNoteLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, FlexiNoteModel::Point &p) const { if (!m_model) return false; sv_frame_t frame = v->getFrameForX(x); FlexiNoteModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return false; // cerr << "frame " << frame << ": " << onPoints.size() << " candidate points" << endl; int nearestDistance = -1; for (FlexiNoteModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int distance = getYForValue(v, (*i).value) - y; if (distance < 0) distance = -distance; if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } bool FlexiNoteLayer::getNoteToEdit(LayerGeometryProvider *v, int x, int y, FlexiNoteModel::Point &p) const { // GF: find the note that is closest to the cursor if (!m_model) return false; sv_frame_t frame = v->getFrameForX(x); FlexiNoteModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return false; // std::cerr << "frame " << frame << ": " << onPoints.size() << " candidate points" << std::endl; int nearestDistance = -1; for (FlexiNoteModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int distance = getYForValue(v, (*i).value) - y; if (distance < 0) distance = -distance; if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString FlexiNoteLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; FlexiNoteModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } FlexiNote note(0); FlexiNoteModel::PointList::iterator i; for (i = points.begin(); i != points.end(); ++i) { int y = getYForValue(v, i->value); int h = NOTE_HEIGHT; // GF: larger notes if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, i->value + m_model->getValueQuantization()); if (h < NOTE_HEIGHT) h = NOTE_HEIGHT; } // GF: this is not quite correct if (pos.y() >= y - 4 && pos.y() <= y + h) { note = *i; break; } } if (i == points.end()) return tr("No local points"); RealTime rt = RealTime::frame2RealTime(note.frame, m_model->getSampleRate()); RealTime rd = RealTime::frame2RealTime(note.duration, m_model->getSampleRate()); QString pitchText; if (shouldConvertMIDIToHz()) { int mnote = int(lrint(note.value)); int cents = int(lrint((note.value - double(mnote)) * 100)); double freq = Pitch::getFrequencyForPitch(mnote, cents); pitchText = tr("%1 (%2, %3 Hz)") .arg(Pitch::getPitchLabel(mnote, cents)) .arg(mnote) .arg(freq); } else if (getScaleUnits() == "Hz") { pitchText = tr("%1 Hz (%2, %3)") .arg(note.value) .arg(Pitch::getPitchLabelForFrequency(note.value)) .arg(Pitch::getPitchForFrequency(note.value)); } else { pitchText = tr("%1 %2") .arg(note.value).arg(getScaleUnits()); } QString text; if (note.label == "") { text = QString(tr("Time:\t%1\nPitch:\t%2\nDuration:\t%3\nNo label")) .arg(rt.toText(true).c_str()) .arg(pitchText) .arg(rd.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nPitch:\t%2\nDuration:\t%3\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(pitchText) .arg(rd.toText(true).c_str()) .arg(note.label); } pos = QPoint(v->getXForFrame(note.frame), getYForValue(v, note.value)); return text; } bool FlexiNoteLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); FlexiNoteModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (FlexiNoteModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { cerr << "FlexiNoteModel: point at " << i->frame << endl; if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } else if (i->frame + i->duration >= frame) { snapped = i->frame + i->duration; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest FlexiNoteModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } cerr << "snapToFeatureFrame: frame " << frame << " -> snapped " << snapped << ", found = " << found << endl; frame = snapped; return found; } void FlexiNoteLayer::getScaleExtents(LayerGeometryProvider *v, double &min, double &max, bool &log) const { min = 0.0; max = 0.0; log = false; QString queryUnits; if (shouldConvertMIDIToHz()) queryUnits = "Hz"; else queryUnits = getScaleUnits(); if (shouldAutoAlign()) { if (!v->getValueExtents(queryUnits, min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } #ifdef DEBUG_NOTE_LAYER cerr << "FlexiNoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; #endif } else if (log) { LogRange::mapRange(min, max); #ifdef DEBUG_NOTE_LAYER cerr << "FlexiNoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; #endif } } else { getDisplayExtents(min, max); if (m_verticalScale == MIDIRangeScale) { min = Pitch::getFrequencyForPitch(0); max = Pitch::getFrequencyForPitch(70); } else if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { LogRange::mapRange(min, max); log = true; } } if (max == min) max = min + 1.0; } int FlexiNoteLayer::getYForValue(LayerGeometryProvider *v, double val) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); #ifdef DEBUG_NOTE_LAYER cerr << "FlexiNoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; #endif if (shouldConvertMIDIToHz()) { val = Pitch::getFrequencyForPitch(int(lrint(val)), int(lrint((val - floor(val)) * 100.0))); #ifdef DEBUG_NOTE_LAYER cerr << "shouldConvertMIDIToHz true, val now = " << val << endl; #endif } if (logarithmic) { val = LogRange::map(val); #ifdef DEBUG_NOTE_LAYER cerr << "logarithmic true, val now = " << val << endl; #endif } int y = int(h - ((val - min) * h) / (max - min)) - 1; #ifdef DEBUG_NOTE_LAYER cerr << "y = " << y << endl; #endif return y; } double FlexiNoteLayer::getValueForY(LayerGeometryProvider *v, int y) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); double val = min + (double(h - y) * double(max - min)) / h; if (logarithmic) { val = pow(10.f, val); } if (shouldConvertMIDIToHz()) { val = Pitch::getPitchForFrequency(val); } return val; } bool FlexiNoteLayer::shouldAutoAlign() const { if (!m_model) return false; return (m_verticalScale == AutoAlignScale); } void FlexiNoteLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("FlexiNoteLayer::paint", true); int x1 = rect.right(); sv_frame_t frame1 = v->getFrameForX(x1); FlexiNoteModel::PointList points(m_model->getPoints(0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); // SVDEBUG << "FlexiNoteLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; double min = m_model->getValueMinimum(); double max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; QPoint localPos; FlexiNoteModel::Point illuminatePoint(0); bool shouldIlluminate = false; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); int noteNumber = 0; for (FlexiNoteModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { ++noteNumber; const FlexiNoteModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); int w = v->getXForFrame(p.frame + p.duration) - x; int h = NOTE_HEIGHT; //GF: larger notes if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, p.value + m_model->getValueQuantization()); if (h < NOTE_HEIGHT) h = NOTE_HEIGHT; //GF: larger notes } if (w < 1) w = 1; paint.setPen(getBaseQColor()); paint.setBrush(brushColour); if (shouldIlluminate && // "illuminatePoint == p" !FlexiNoteModel::Point::Comparator()(illuminatePoint, p) && !FlexiNoteModel::Point::Comparator()(p, illuminatePoint)) { paint.drawLine(x, -1, x, v->getPaintHeight() + 1); paint.drawLine(x+w, -1, x+w, v->getPaintHeight() + 1); paint.setPen(v->getForeground()); // paint.setBrush(v->getForeground()); QString vlabel = QString("freq: %1%2").arg(p.value).arg(m_model->getScaleUnits()); // PaintAssistant::drawVisibleText(v, paint, // x - paint.fontMetrics().width(vlabel) - 2, // y + paint.fontMetrics().height()/2 // - paint.fontMetrics().descent(), // vlabel, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(v, paint, x, y - h/2 - 2 - paint.fontMetrics().height() - paint.fontMetrics().descent(), vlabel, PaintAssistant::OutlinedText); QString hlabel = "dur: " + QString(RealTime::frame2RealTime (p.duration, m_model->getSampleRate()).toText(true).c_str()); PaintAssistant::drawVisibleText(v, paint, x, y - h/2 - paint.fontMetrics().descent() - 2, hlabel, PaintAssistant::OutlinedText); QString llabel = QString("%1").arg(p.label); PaintAssistant::drawVisibleText(v, paint, x, y + h + 2 + paint.fontMetrics().descent(), llabel, PaintAssistant::OutlinedText); QString nlabel = QString("%1").arg(noteNumber); PaintAssistant::drawVisibleText(v, paint, x + paint.fontMetrics().averageCharWidth() / 2, y + h/2 - paint.fontMetrics().descent(), nlabel, PaintAssistant::OutlinedText); } paint.drawRect(x, y - h/2, w, h); } paint.restore(); } int FlexiNoteLayer::getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &paint) const { if (!m_model || shouldAutoAlign()) { return 0; } else { if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { return LogNumericalScale().getWidth(v, paint) + 10; // for piano } else { return LinearNumericalScale().getWidth(v, paint); } } } void FlexiNoteLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect) const { if (!m_model || m_model->getPoints().empty()) return; QString unit; double min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } if (logarithmic && (getScaleUnits() == "Hz")) { PianoScale().paintPianoVertical (v, paint, QRect(w - 10, 0, 10, h), LogRange::unmap(min), LogRange::unmap(max)); paint.drawLine(w, 0, w, h); } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void FlexiNoteLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "FlexiNoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double value = getValueForY(v, e->y()); m_editingPoint = FlexiNoteModel::Point(frame, float(value), 0, 0.8f, tr("New Point")); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new FlexiNoteModel::EditCommand(m_model, tr("Draw Point")); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void FlexiNoteLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "FlexiNoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double newValue = getValueForY(v, e->y()); sv_frame_t newFrame = m_editingPoint.frame; sv_frame_t newDuration = frame - newFrame; if (newDuration < 0) { newFrame = frame; newDuration = -newDuration; } else if (newDuration == 0) { newDuration = 1; } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = newFrame; m_editingPoint.value = float(newValue); m_editingPoint.duration = newDuration; m_editingCommand->addPoint(m_editingPoint); } void FlexiNoteLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) { // SVDEBUG << "FlexiNoteLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void FlexiNoteLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void FlexiNoteLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } void FlexiNoteLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; FlexiNoteModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.value != m_editingPoint.value) return; m_editingCommand = new FlexiNoteModel::EditCommand(m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void FlexiNoteLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "FlexiNoteLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; std::cerr << "FlexiNoteLayer::editStart(" << e->x() << "," << e->y() << ")" << std::endl; if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; m_originalPoint = FlexiNote(m_editingPoint); if (m_editMode == RightBoundary) { m_dragPointX = v->getXForFrame(m_editingPoint.frame + m_editingPoint.duration); } else { m_dragPointX = v->getXForFrame(m_editingPoint.frame); } m_dragPointY = getYForValue(v, m_editingPoint.value); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; m_dragStartX = e->x(); m_dragStartY = e->y(); sv_frame_t onset = m_originalPoint.frame; sv_frame_t offset = m_originalPoint.frame + m_originalPoint.duration - 1; m_greatestLeftNeighbourFrame = -1; m_smallestRightNeighbourFrame = std::numeric_limits::max(); for (FlexiNoteModel::PointList::const_iterator i = m_model->getPoints().begin(); i != m_model->getPoints().end(); ++i) { FlexiNote currentNote = *i; // left boundary if (currentNote.frame + currentNote.duration - 1 < onset) { m_greatestLeftNeighbourFrame = currentNote.frame + currentNote.duration - 1; } // right boundary if (currentNote.frame > offset) { m_smallestRightNeighbourFrame = currentNote.frame; break; } } std::cerr << "editStart: mode is " << m_editMode << ", note frame: " << onset << ", left boundary: " << m_greatestLeftNeighbourFrame << ", right boundary: " << m_smallestRightNeighbourFrame << std::endl; } void FlexiNoteLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "FlexiNoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl; std::cerr << "FlexiNoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << std::endl; if (!m_model || !m_editing) return; int xdist = e->x() - m_dragStartX; int ydist = e->y() - m_dragStartY; int newx = m_dragPointX + xdist; int newy = m_dragPointY + ydist; sv_frame_t dragFrame = v->getFrameForX(newx); if (dragFrame < 0) dragFrame = 0; dragFrame = dragFrame / m_model->getResolution() * m_model->getResolution(); double value = getValueForY(v, newy); if (!m_editingCommand) { m_editingCommand = new FlexiNoteModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); std::cerr << "edit mode: " << m_editMode << " intelligent actions = " << m_intelligentActions << std::endl; switch (m_editMode) { case LeftBoundary : { // left if (m_intelligentActions && dragFrame <= m_greatestLeftNeighbourFrame) dragFrame = m_greatestLeftNeighbourFrame + 1; // right if (m_intelligentActions && dragFrame >= m_originalPoint.frame + m_originalPoint.duration) { dragFrame = m_originalPoint.frame + m_originalPoint.duration - 1; } m_editingPoint.frame = dragFrame; m_editingPoint.duration = m_originalPoint.frame - dragFrame + m_originalPoint.duration; break; } case RightBoundary : { // left if (m_intelligentActions && dragFrame <= m_greatestLeftNeighbourFrame) dragFrame = m_greatestLeftNeighbourFrame + 1; if (m_intelligentActions && dragFrame >= m_smallestRightNeighbourFrame) dragFrame = m_smallestRightNeighbourFrame - 1; m_editingPoint.duration = dragFrame - m_originalPoint.frame + 1; break; } case DragNote : { // left if (m_intelligentActions && dragFrame <= m_greatestLeftNeighbourFrame) dragFrame = m_greatestLeftNeighbourFrame + 1; // right if (m_intelligentActions && dragFrame + m_originalPoint.duration >= m_smallestRightNeighbourFrame) { dragFrame = m_smallestRightNeighbourFrame - m_originalPoint.duration; } m_editingPoint.frame = dragFrame; m_editingPoint.value = float(value); // Re-analyse region within +/- 1 semitone of the dragged value float cents = 0; int midiPitch = Pitch::getPitchForFrequency(m_editingPoint.value, ¢s); double lower = Pitch::getFrequencyForPitch(midiPitch - 1, cents); double higher = Pitch::getFrequencyForPitch(midiPitch + 1, cents); emit reAnalyseRegion(m_editingPoint.frame, m_editingPoint.frame + m_editingPoint.duration, float(lower), float(higher)); break; } case SplitNote: // nothing break; } // updateNoteValueFromPitchCurve(v, m_editingPoint); m_editingCommand->addPoint(m_editingPoint); std::cerr << "added new point(" << m_editingPoint.frame << "," << m_editingPoint.duration << ")" << std::endl; } void FlexiNoteLayer::editEnd(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "FlexiNoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; std::cerr << "FlexiNoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << std::endl; if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editMode == DragNote) { //!!! command nesting is wrong? emit materialiseReAnalysis(); } m_editingCommand->deletePoint(m_editingPoint); updateNoteValueFromPitchCurve(v, m_editingPoint); m_editingCommand->addPoint(m_editingPoint); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Point"); } else { newName = tr("Relocate Point"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } void FlexiNoteLayer::splitStart(LayerGeometryProvider *v, QMouseEvent *e) { // GF: note splitting starts (!! remove printing soon) std::cerr << "splitStart (n.b. editStart will be called later, if the user drags the mouse)" << std::endl; if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; // m_originalPoint = m_editingPoint; // // m_dragPointX = v->getXForFrame(m_editingPoint.frame); // m_dragPointY = getYForValue(v, m_editingPoint.value); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; m_dragStartX = e->x(); m_dragStartY = e->y(); } void FlexiNoteLayer::splitEnd(LayerGeometryProvider *v, QMouseEvent *e) { // GF: note splitting ends. (!! remove printing soon) std::cerr << "splitEnd" << std::endl; if (!m_model || !m_editing || m_editMode != SplitNote) return; int xdist = e->x() - m_dragStartX; int ydist = e->y() - m_dragStartY; if (xdist != 0 || ydist != 0) { std::cerr << "mouse moved" << std::endl; return; } sv_frame_t frame = v->getFrameForX(e->x()); splitNotesAt(v, frame, e); } void FlexiNoteLayer::splitNotesAt(LayerGeometryProvider *v, sv_frame_t frame) { splitNotesAt(v, frame, 0); } void FlexiNoteLayer::splitNotesAt(LayerGeometryProvider *v, sv_frame_t frame, QMouseEvent *e) { FlexiNoteModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return; FlexiNote note(*onPoints.begin()); FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand (m_model, tr("Edit Point")); command->deletePoint(note); if (!e || !(e->modifiers() & Qt::ShiftModifier)) { int gap = 0; // MM: I prefer a gap of 0, but we can decide later FlexiNote newNote1(note.frame, note.value, frame - note.frame - gap, note.level, note.label); FlexiNote newNote2(frame, note.value, note.duration - newNote1.duration, note.level, note.label); if (m_intelligentActions) { if (updateNoteValueFromPitchCurve(v, newNote1)) { command->addPoint(newNote1); } if (updateNoteValueFromPitchCurve(v, newNote2)) { command->addPoint(newNote2); } } else { command->addPoint(newNote1); command->addPoint(newNote2); } } finish(command); } void FlexiNoteLayer::addNote(LayerGeometryProvider *v, QMouseEvent *e) { std::cerr << "addNote" << std::endl; if (!m_model) return; sv_frame_t duration = 10000; sv_frame_t frame = v->getFrameForX(e->x()); double value = getValueForY(v, e->y()); FlexiNoteModel::PointList noteList = m_model->getPoints(); if (m_intelligentActions) { sv_frame_t smallestRightNeighbourFrame = 0; for (FlexiNoteModel::PointList::const_iterator i = noteList.begin(); i != noteList.end(); ++i) { FlexiNote currentNote = *i; if (currentNote.frame > frame) { smallestRightNeighbourFrame = currentNote.frame; break; } } if (smallestRightNeighbourFrame > 0) { duration = std::min(smallestRightNeighbourFrame - frame + 1, duration); duration = (duration > 0) ? duration : 0; } } if (!m_intelligentActions || (m_model->getPoints(frame).empty() && duration > 0)) { FlexiNote newNote(frame, float(value), duration, 100.f, "new note"); FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand (m_model, tr("Add Point")); command->addPoint(newNote); finish(command); } } SparseTimeValueModel * FlexiNoteLayer::getAssociatedPitchModel(LayerGeometryProvider *v) const { // Better than we used to do, but still not very satisfactory // cerr << "FlexiNoteLayer::getAssociatedPitchModel()" << endl; for (int i = 0; i < v->getView()->getLayerCount(); ++i) { Layer *layer = v->getView()->getLayer(i); if (layer && layer->getLayerPresentationName() != "candidate") { // cerr << "FlexiNoteLayer::getAssociatedPitchModel: looks like our layer is " << layer << endl; SparseTimeValueModel *model = qobject_cast (layer->getModel()); // cerr << "FlexiNoteLayer::getAssociatedPitchModel: and its model is " << model << endl; if (model && model->getScaleUnits() == "Hz") { cerr << "FlexiNoteLayer::getAssociatedPitchModel: it's good, returning " << model << endl; return model; } } } cerr << "FlexiNoteLayer::getAssociatedPitchModel: failed to find a model" << endl; return 0; } void FlexiNoteLayer::snapSelectedNotesToPitchTrack(LayerGeometryProvider *v, Selection s) { if (!m_model) return; FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand (m_model, tr("Snap Notes")); cerr << "snapSelectedNotesToPitchTrack: selection is from " << s.getStartFrame() << " to " << s.getEndFrame() << endl; for (FlexiNoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { FlexiNote note(*i); cerr << "snapSelectedNotesToPitchTrack: looking at note from " << note.frame << " to " << note.frame + note.duration << endl; if (!s.contains(note.frame) && !s.contains(note.frame + note.duration - 1)) { continue; } cerr << "snapSelectedNotesToPitchTrack: making new note" << endl; FlexiNote newNote(note); command->deletePoint(note); if (updateNoteValueFromPitchCurve(v, newNote)) { command->addPoint(newNote); } } finish(command); } void FlexiNoteLayer::mergeNotes(LayerGeometryProvider *v, Selection s, bool inclusive) { FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); FlexiNoteModel::PointList::iterator i = points.begin(); if (inclusive) { while (i != points.end() && i->frame + i->duration < s.getStartFrame()) { ++i; } } else { while (i != points.end() && i->frame < s.getStartFrame()) { ++i; } } if (i == points.end()) return; FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(m_model, tr("Merge Notes")); FlexiNote newNote(*i); while (i != points.end()) { if (inclusive) { if (i->frame >= s.getEndFrame()) break; } else { if (i->frame + i->duration > s.getEndFrame()) break; } newNote.duration = i->frame + i->duration - newNote.frame; command->deletePoint(*i); ++i; } updateNoteValueFromPitchCurve(v, newNote); command->addPoint(newNote); finish(command); } bool FlexiNoteLayer::updateNoteValueFromPitchCurve(LayerGeometryProvider *v, FlexiNoteModel::Point ¬e) const { SparseTimeValueModel *model = getAssociatedPitchModel(v); if (!model) return false; std::cerr << model->getTypeName() << std::endl; SparseModel::PointList dataPoints = model->getPoints(note.frame, note.frame + note.duration); std::cerr << "frame " << note.frame << ": " << dataPoints.size() << " candidate points" << std::endl; if (dataPoints.empty()) return false; std::vector pitchValues; for (SparseModel::PointList::const_iterator i = dataPoints.begin(); i != dataPoints.end(); ++i) { if (i->frame >= note.frame && i->frame < note.frame + note.duration) { pitchValues.push_back(i->value); } } if (pitchValues.empty()) return false; sort(pitchValues.begin(), pitchValues.end()); int size = int(pitchValues.size()); double median; if (size % 2 == 0) { median = (pitchValues[size/2 - 1] + pitchValues[size/2]) / 2; } else { median = pitchValues[size/2]; } std::cerr << "updateNoteValueFromPitchCurve: corrected from " << note.value << " to median " << median << std::endl; note.value = float(median); return true; } void FlexiNoteLayer::mouseMoveEvent(LayerGeometryProvider *v, QMouseEvent *e) { // GF: context sensitive cursors // v->getView()->setCursor(Qt::ArrowCursor); FlexiNoteModel::Point note(0); if (!getNoteToEdit(v, e->x(), e->y(), note)) { // v->getView()->setCursor(Qt::UpArrowCursor); return; } bool closeToLeft = false, closeToRight = false, closeToTop = false, closeToBottom = false; getRelativeMousePosition(v, note, e->x(), e->y(), closeToLeft, closeToRight, closeToTop, closeToBottom); if (closeToLeft) { v->getView()->setCursor(Qt::SizeHorCursor); m_editMode = LeftBoundary; cerr << "edit mode -> LeftBoundary" << endl; } else if (closeToRight) { v->getView()->setCursor(Qt::SizeHorCursor); m_editMode = RightBoundary; cerr << "edit mode -> RightBoundary" << endl; } else if (closeToTop) { v->getView()->setCursor(Qt::CrossCursor); m_editMode = DragNote; cerr << "edit mode -> DragNote" << endl; } else if (closeToBottom) { v->getView()->setCursor(Qt::UpArrowCursor); m_editMode = SplitNote; cerr << "edit mode -> SplitNote" << endl; } else { v->getView()->setCursor(Qt::ArrowCursor); } } void FlexiNoteLayer::getRelativeMousePosition(LayerGeometryProvider *v, FlexiNoteModel::Point ¬e, int x, int y, bool &closeToLeft, bool &closeToRight, bool &closeToTop, bool &closeToBottom) const { // GF: TODO: consoloidate the tolerance values if (!m_model) return; int ctol = 0; int noteStartX = v->getXForFrame(note.frame); int noteEndX = v->getXForFrame(note.frame + note.duration); int noteValueY = getYForValue(v,note.value); int noteStartY = noteValueY - (NOTE_HEIGHT / 2); int noteEndY = noteValueY + (NOTE_HEIGHT / 2); bool closeToNote = false; if (y >= noteStartY-ctol && y <= noteEndY+ctol && x >= noteStartX-ctol && x <= noteEndX+ctol) closeToNote = true; if (!closeToNote) return; int tol = NOTE_HEIGHT / 2; if (x >= noteStartX - tol && x <= noteStartX + tol) closeToLeft = true; if (x >= noteEndX - tol && x <= noteEndX + tol) closeToRight = true; if (y >= noteStartY - tol && y <= noteStartY + tol) closeToTop = true; if (y >= noteEndY - tol && y <= noteEndY + tol) closeToBottom = true; // cerr << "FlexiNoteLayer::getRelativeMousePosition: close to: left " << closeToLeft << " right " << closeToRight << " top " << closeToTop << " bottom " << closeToBottom << endl; } bool FlexiNoteLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { std::cerr << "Opening note editor dialog" << std::endl; if (!m_model) return false; FlexiNoteModel::Point note(0); if (!getPointToDrag(v, e->x(), e->y(), note)) return false; // FlexiNoteModel::Point note = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowDuration | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(note.frame); dialog->setValue(note.value); dialog->setFrameDuration(note.duration); dialog->setText(note.label); if (dialog->exec() == QDialog::Accepted) { FlexiNoteModel::Point newNote = note; newNote.frame = dialog->getFrameTime(); newNote.value = dialog->getValue(); newNote.duration = dialog->getFrameDuration(); newNote.label = dialog->getText(); FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand (m_model, tr("Edit Point")); command->deletePoint(note); command->addPoint(newNote); finish(command); } delete dialog; return true; } void FlexiNoteLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(m_model, tr("Drag Selection")); FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (FlexiNoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { FlexiNoteModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void FlexiNoteLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(m_model, tr("Resize Selection")); FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (FlexiNoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double targetStart = double(i->frame); targetStart = double(newSize.getStartFrame()) + targetStart - double(s.getStartFrame()) * ratio; double targetEnd = double(i->frame + i->duration); targetEnd = double(newSize.getStartFrame()) + targetEnd - double(s.getStartFrame()) * ratio; FlexiNoteModel::Point newPoint(*i); newPoint.frame = lrint(targetStart); newPoint.duration = lrint(targetEnd - targetStart); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void FlexiNoteLayer::deleteSelection(Selection s) { if (!m_model) return; FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(m_model, tr("Delete Selected Points")); FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (FlexiNoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); } void FlexiNoteLayer::deleteSelectionInclusive(Selection s) { if (!m_model) return; FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(m_model, tr("Delete Selected Points")); FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (FlexiNoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { bool overlap = !( ((s.getStartFrame() <= i->frame) && (s.getEndFrame() <= i->frame)) || // selection is left of note ((s.getStartFrame() >= (i->frame+i->duration)) && (s.getEndFrame() >= (i->frame+i->duration))) // selection is right of note ); if (overlap) { command->deletePoint(*i); } } finish(command); } void FlexiNoteLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; FlexiNoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (FlexiNoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->duration, i->level, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool FlexiNoteLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /*frameOffset */, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } FlexiNoteModel::Point newPoint(frame); if (i->haveLabel()) newPoint.label = i->getLabel(); if (i->haveValue()) newPoint.value = i->getValue(); else newPoint.value = (m_model->getValueMinimum() + m_model->getValueMaximum()) / 2; if (i->haveLevel()) newPoint.level = i->getLevel(); if (i->haveDuration()) newPoint.duration = i->getDuration(); else { sv_frame_t nextFrame = frame; Clipboard::PointList::const_iterator j = i; for (; j != points.end(); ++j) { if (!j->haveFrame()) continue; if (j != i) break; } if (j != points.end()) { nextFrame = j->getFrame(); } if (nextFrame == frame) { newPoint.duration = m_model->getResolution(); } else { newPoint.duration = nextFrame - frame; } } command->addPoint(newPoint); } finish(command); return true; } void FlexiNoteLayer::addNoteOn(sv_frame_t frame, int pitch, int velocity) { m_pendingNoteOns.insert(FlexiNote(frame, float(pitch), 0, float(velocity / 127.0), "")); } void FlexiNoteLayer::addNoteOff(sv_frame_t frame, int pitch) { for (FlexiNoteSet::iterator i = m_pendingNoteOns.begin(); i != m_pendingNoteOns.end(); ++i) { if (lrint((*i).value) == pitch) { FlexiNote note(*i); m_pendingNoteOns.erase(i); note.duration = frame - note.frame; if (m_model) { FlexiNoteModel::AddPointCommand *c = new FlexiNoteModel::AddPointCommand (m_model, note, tr("Record FlexiNote")); // execute and bundle: CommandHistory::getInstance()->addCommand(c, true, true); } break; } } } void FlexiNoteLayer::abandonNoteOns() { m_pendingNoteOns.clear(); } int FlexiNoteLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "White" : "Black")); } void FlexiNoteLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" verticalScale=\"%1\" scaleMinimum=\"%2\" scaleMaximum=\"%3\" ") .arg(m_verticalScale) .arg(m_scaleMinimum) .arg(m_scaleMaximum)); } void FlexiNoteLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok; VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); // bool alsoOk; // double min = attributes.value("scaleMinimum").toDouble(&ok); // double max = attributes.value("scaleMaximum").toDouble(&alsoOk); // if (ok && alsoOk && min != max) setDisplayExtents(min, max); } void FlexiNoteLayer::setVerticalRangeToNoteRange(LayerGeometryProvider *v) { double minf = std::numeric_limits::max(); double maxf = 0; bool hasNotes = 0; for (FlexiNoteModel::PointList::const_iterator i = m_model->getPoints().begin(); i != m_model->getPoints().end(); ++i) { hasNotes = 1; FlexiNote note = *i; if (note.value < minf) minf = note.value; if (note.value > maxf) maxf = note.value; } std::cerr << "min frequency:" << minf << ", max frequency: " << maxf << std::endl; if (hasNotes) { v->getView()->getLayer(1)->setDisplayExtents(minf*0.66,maxf*1.5); // MM: this is a hack because we rely on // * this layer being automatically aligned to layer 1 // * layer one is a log frequency layer. } } sonic-visualiser-3.0.3/svgui/layer/FlexiNoteLayer.h0000644000000000000000000001752013111512442020455 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _FLEXINOTE_LAYER_H_ #define _FLEXINOTE_LAYER_H_ #define NOTE_HEIGHT 16 #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "data/model/FlexiNoteModel.h" #include #include class View; class QPainter; class SparseTimeValueModel; class FlexiNoteLayer : public SingleColourLayer, public VerticalScaleLayer { Q_OBJECT public: FlexiNoteLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void splitStart(LayerGeometryProvider *v, QMouseEvent *); virtual void splitEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void addNote(LayerGeometryProvider *v, QMouseEvent *e); virtual void mouseMoveEvent(LayerGeometryProvider *v, QMouseEvent *); virtual bool editOpen(LayerGeometryProvider *v, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void deleteSelectionInclusive(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); void splitNotesAt(LayerGeometryProvider *v, sv_frame_t frame); void snapSelectedNotesToPitchTrack(LayerGeometryProvider *v, Selection s); void mergeNotes(LayerGeometryProvider *v, Selection s, bool inclusive); virtual const Model *getModel() const { return m_model; } void setModel(FlexiNoteModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); enum VerticalScale { AutoAlignScale, LinearScale, LogScale, MIDIRangeScale }; //GF: Tonioni: context sensitive note edit actions (denoted clockwise from top). enum EditMode { DragNote, RightBoundary, SplitNote, LeftBoundary }; void setIntelligentActions(bool on) { m_intelligentActions=on; } void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool getValueExtents(double &min, double &max, bool &log, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual bool setDisplayExtents(double min, double max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; /** * Add a note-on. Used when recording MIDI "live". The note will * not be finally added to the layer until the corresponding * note-off. */ void addNoteOn(sv_frame_t frame, int pitch, int velocity); /** * Add a note-off. This will cause a note to appear, if and only * if there is a matching pending note-on. */ void addNoteOff(sv_frame_t frame, int pitch); /** * Abandon all pending note-on events. */ void abandonNoteOns(); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); void setVerticalRangeToNoteRange(LayerGeometryProvider *v); /// VerticalScaleLayer methods virtual int getYForValue(LayerGeometryProvider *v, double value) const; virtual double getValueForY(LayerGeometryProvider *v, int y) const; virtual QString getScaleUnits() const; signals: void reAnalyseRegion(sv_frame_t, sv_frame_t, float, float); void materialiseReAnalysis(); protected: void getScaleExtents(LayerGeometryProvider *, double &min, double &max, bool &log) const; bool shouldConvertMIDIToHz() const; virtual int getDefaultColourHint(bool dark, bool &impose); FlexiNoteModel::PointList getLocalPoints(LayerGeometryProvider *v, int) const; bool getPointToDrag(LayerGeometryProvider *v, int x, int y, FlexiNoteModel::Point &) const; bool getNoteToEdit(LayerGeometryProvider *v, int x, int y, FlexiNoteModel::Point &) const; void getRelativeMousePosition(LayerGeometryProvider *v, FlexiNoteModel::Point ¬e, int x, int y, bool &closeToLeft, bool &closeToRight, bool &closeToTop, bool &closeToBottom) const; SparseTimeValueModel *getAssociatedPitchModel(LayerGeometryProvider *v) const; bool updateNoteValueFromPitchCurve(LayerGeometryProvider *v, FlexiNoteModel::Point ¬e) const; void splitNotesAt(LayerGeometryProvider *v, sv_frame_t frame, QMouseEvent *e); FlexiNoteModel *m_model; bool m_editing; bool m_intelligentActions; int m_dragPointX; int m_dragPointY; int m_dragStartX; int m_dragStartY; FlexiNoteModel::Point m_originalPoint; FlexiNoteModel::Point m_editingPoint; sv_frame_t m_greatestLeftNeighbourFrame; sv_frame_t m_smallestRightNeighbourFrame; FlexiNoteModel::EditCommand *m_editingCommand; VerticalScale m_verticalScale; EditMode m_editMode; typedef std::set FlexiNoteSet; FlexiNoteSet m_pendingNoteOns; mutable double m_scaleMinimum; mutable double m_scaleMaximum; bool shouldAutoAlign() const; void finish(FlexiNoteModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/ImageLayer.cpp0000644000000000000000000006061513111512442020140 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "ImageLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "view/View.h" #include "data/model/ImageModel.h" #include "data/fileio/FileSource.h" #include "widgets/ImageDialog.h" #include "widgets/ProgressDialog.h" #include #include #include #include #include #include #include #include ImageLayer::ImageMap ImageLayer::m_images; QMutex ImageLayer::m_imageMapMutex; ImageLayer::ImageLayer() : Layer(), m_model(0), m_editing(false), m_originalPoint(0, "", ""), m_editingPoint(0, "", ""), m_editingCommand(0) { } ImageLayer::~ImageLayer() { for (FileSourceMap::iterator i = m_fileSources.begin(); i != m_fileSources.end(); ++i) { delete i->second; } } void ImageLayer::setModel(ImageModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); emit modelReplaced(); } Layer::PropertyList ImageLayer::getProperties() const { return Layer::getProperties(); } QString ImageLayer::getPropertyLabel(const PropertyName &) const { return ""; } Layer::PropertyType ImageLayer::getPropertyType(const PropertyName &name) const { return Layer::getPropertyType(name); } int ImageLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { return Layer::getPropertyRangeAndValue(name, min, max, deflt); } QString ImageLayer::getPropertyValueLabel(const PropertyName &name, int value) const { return Layer::getPropertyValueLabel(name, value); } void ImageLayer::setProperty(const PropertyName &name, int value) { Layer::setProperty(name, value); } bool ImageLayer::getValueExtents(double &, double &, bool &, QString &) const { return false; } bool ImageLayer::isLayerScrollable(const LayerGeometryProvider *) const { return true; } ImageModel::PointList ImageLayer::getLocalPoints(LayerGeometryProvider *v, int x, int ) const { if (!m_model) return ImageModel::PointList(); // SVDEBUG << "ImageLayer::getLocalPoints(" << x << "," << y << "):"; const ImageModel::PointList &points(m_model->getPoints()); ImageModel::PointList rv; for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ) { const ImageModel::Point &p(*i); int px = v->getXForFrame(p.frame); if (px > x) break; ++i; if (i != points.end()) { int nx = v->getXForFrame((*i).frame); if (nx < x) { // as we aim not to overlap the images, if the following // image begins to the left of a point then the current // one may be assumed to end to the left of it as well. continue; } } // this image is a candidate, test it properly int width = 32; if (m_scaled[v].find(p.image) != m_scaled[v].end()) { width = m_scaled[v][p.image].width(); // SVDEBUG << "scaled width = " << width << endl; } if (x >= px && x < px + width) { rv.insert(p); } } // cerr << rv.size() << " point(s)" << endl; return rv; } QString ImageLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; ImageModel::PointList points = getLocalPoints(v, x, pos.y()); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return ""; } } // int useFrame = points.begin()->frame; // RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; /* if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nHeight:\t%2\nLabel:\t%3")) .arg(rt.toText(true).c_str()) .arg(points.begin()->height) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), getYForHeight(v, points.begin()->height)); */ return text; } //!!! too much overlap with TimeValueLayer/TimeInstantLayer/TextLayer bool ImageLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); ImageModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame), -1); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest ImageModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } void ImageLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("ImageLayer::paint", true); // int x0 = rect.left(), x1 = rect.right(); int x0 = 0, x1 = v->getPaintWidth(); sv_frame_t frame0 = v->getFrameForX(x0); sv_frame_t frame1 = v->getFrameForX(x1); ImageModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; paint.save(); paint.setClipRect(rect.x(), 0, rect.width(), v->getPaintHeight()); QColor penColour; penColour = v->getForeground(); QColor brushColour; brushColour = v->getBackground(); int h, s, val; brushColour.getHsv(&h, &s, &val); brushColour.setHsv(h, s, 255, 240); paint.setPen(penColour); paint.setBrush(brushColour); paint.setRenderHint(QPainter::Antialiasing, true); for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const ImageModel::Point &p(*i); int x = v->getXForFrame(p.frame); int nx = x + 2000; ImageModel::PointList::const_iterator j = i; ++j; if (j != points.end()) { int jx = v->getXForFrame(j->frame); if (jx < nx) nx = jx; } drawImage(v, paint, p, x, nx); } paint.setRenderHint(QPainter::Antialiasing, false); paint.restore(); } void ImageLayer::drawImage(LayerGeometryProvider *v, QPainter &paint, const ImageModel::Point &p, int x, int nx) const { QString label = p.label; QString imageName = p.image; QImage image; QString additionalText; QSize imageSize; if (!getImageOriginalSize(imageName, imageSize)) { image = QImage(":icons/emptypage.png"); imageSize = image.size(); additionalText = imageName; } int topMargin = 10; int bottomMargin = 10; int spacing = 5; if (v->getPaintHeight() < 100) { topMargin = 5; bottomMargin = 5; } int maxBoxHeight = v->getPaintHeight() - topMargin - bottomMargin; int availableWidth = nx - x - 3; if (availableWidth < 20) availableWidth = 20; QRect labelRect; if (label != "") { int likelyHeight = v->getPaintHeight() / 4; int likelyWidth = // available height times image aspect ((maxBoxHeight - likelyHeight) * imageSize.width()) / imageSize.height(); if (likelyWidth > imageSize.width()) { likelyWidth = imageSize.width(); } if (likelyWidth > availableWidth) { likelyWidth = availableWidth; } int singleWidth = paint.fontMetrics().width(label); if (singleWidth < availableWidth && singleWidth < likelyWidth * 2) { likelyWidth = singleWidth + 4; } labelRect = paint.fontMetrics().boundingRect (QRect(0, 0, likelyWidth, likelyHeight), Qt::AlignCenter | Qt::TextWordWrap, label); labelRect.setWidth(labelRect.width() + 6); } if (image.isNull()) { image = getImage(v, imageName, QSize(availableWidth, maxBoxHeight - labelRect.height())); } int boxWidth = image.width(); if (boxWidth < labelRect.width()) { boxWidth = labelRect.width(); } int boxHeight = image.height(); if (label != "") { boxHeight += labelRect.height() + spacing; } int division = image.height(); if (additionalText != "") { paint.save(); QFont font(paint.font()); font.setItalic(true); paint.setFont(font); int tw = paint.fontMetrics().width(additionalText); if (tw > availableWidth) { tw = availableWidth; } if (boxWidth < tw) { boxWidth = tw; } boxHeight += paint.fontMetrics().height(); division += paint.fontMetrics().height(); } bottomMargin = v->getPaintHeight() - topMargin - boxHeight; if (bottomMargin > topMargin + v->getPaintHeight()/7) { topMargin += v->getPaintHeight()/8; bottomMargin -= v->getPaintHeight()/8; } paint.drawRect(x - 1, topMargin - 1, boxWidth + 2, boxHeight + 2); int imageY; if (label != "") { imageY = topMargin + labelRect.height() + spacing; } else { imageY = topMargin; } paint.drawImage(x + (boxWidth - image.width())/2, imageY, image); if (additionalText != "") { paint.drawText(x, imageY + image.height() + paint.fontMetrics().ascent(), additionalText); paint.restore(); } if (label != "") { paint.drawLine(x, topMargin + labelRect.height() + spacing, x + boxWidth, topMargin + labelRect.height() + spacing); paint.drawText(QRect(x, topMargin, boxWidth, labelRect.height()), Qt::AlignCenter | Qt::TextWordWrap, label); } } void ImageLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) { if (dormant) { // Delete the images named in the view's scaled map from the // general image map as well. They can always be re-loaded // if it turns out another view still needs them. QMutexLocker locker(&m_imageMapMutex); for (ImageMap::iterator i = m_scaled[v].begin(); i != m_scaled[v].end(); ++i) { m_images.erase(i->first); } m_scaled.erase(v); } } //!!! how to reap no-longer-used images? bool ImageLayer::getImageOriginalSize(QString name, QSize &size) const { // cerr << "getImageOriginalSize: \"" << name << "\"" << endl; QMutexLocker locker(&m_imageMapMutex); if (m_images.find(name) == m_images.end()) { // cerr << "don't have, trying to open local" << endl; m_images[name] = QImage(getLocalFilename(name)); } if (m_images[name].isNull()) { // cerr << "null image" << endl; return false; } else { size = m_images[name].size(); return true; } } QImage ImageLayer::getImage(LayerGeometryProvider *v, QString name, QSize maxSize) const { // SVDEBUG << "ImageLayer::getImage(" << v << ", " << name << ", (" // << maxSize.width() << "x" << maxSize.height() << "))" << endl; if (!m_scaled[v][name].isNull() && ((m_scaled[v][name].width() == maxSize.width() && m_scaled[v][name].height() <= maxSize.height()) || (m_scaled[v][name].width() <= maxSize.width() && m_scaled[v][name].height() == maxSize.height()))) { // cerr << "cache hit" << endl; return m_scaled[v][name]; } QMutexLocker locker(&m_imageMapMutex); if (m_images.find(name) == m_images.end()) { m_images[name] = QImage(getLocalFilename(name)); } if (m_images[name].isNull()) { // cerr << "null image" << endl; m_scaled[v][name] = QImage(); } else if (m_images[name].width() <= maxSize.width() && m_images[name].height() <= maxSize.height()) { m_scaled[v][name] = m_images[name]; } else { m_scaled[v][name] = m_images[name].scaled(maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } return m_scaled[v][name]; } void ImageLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "ImageLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) { SVDEBUG << "ImageLayer::drawStart: no model" << endl; return; } sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingPoint = ImageModel::Point(frame, "", ""); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new ImageModel::EditCommand(m_model, "Add Image"); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void ImageLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "ImageLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void ImageLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) { // SVDEBUG << "ImageLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; ImageDialog dialog(tr("Select image"), "", ""); if (dialog.exec() == QDialog::Accepted) { checkAddSource(dialog.getImage()); ImageModel::ChangeImageCommand *command = new ImageModel::ChangeImageCommand (m_model, m_editingPoint, dialog.getImage(), dialog.getLabel()); m_editingCommand->addCommand(command); } else { m_editingCommand->deletePoint(m_editingPoint); } finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } bool ImageLayer::addImage(sv_frame_t frame, QString url) { QImage image(getLocalFilename(url)); if (image.isNull()) { cerr << "Failed to open image from url \"" << url << "\" (local filename \"" << getLocalFilename(url) << "\"" << endl; delete m_fileSources[url]; m_fileSources.erase(url); return false; } ImageModel::Point point(frame, url, ""); ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, "Add Image"); command->addPoint(point); finish(command); return true; } void ImageLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "ImageLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; ImageModel::PointList points = getLocalPoints(v, e->x(), e->y()); if (points.empty()) return; m_editOrigin = e->pos(); m_editingPoint = *points.begin(); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void ImageLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; sv_frame_t frameDiff = v->getFrameForX(e->x()) - v->getFrameForX(m_editOrigin.x()); sv_frame_t frame = m_originalPoint.frame + frameDiff; if (frame < 0) frame = 0; frame = (frame / m_model->getResolution()) * m_model->getResolution(); if (!m_editingCommand) { m_editingCommand = new ImageModel::EditCommand(m_model, tr("Move Image")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void ImageLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) { // SVDEBUG << "ImageLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; if (m_editingCommand) { finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool ImageLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return false; ImageModel::PointList points = getLocalPoints(v, e->x(), e->y()); if (points.empty()) return false; QString image = points.begin()->image; QString label = points.begin()->label; ImageDialog dialog(tr("Select image"), image, label); if (dialog.exec() == QDialog::Accepted) { checkAddSource(dialog.getImage()); ImageModel::ChangeImageCommand *command = new ImageModel::ChangeImageCommand (m_model, *points.begin(), dialog.getImage(), dialog.getLabel()); CommandHistory::getInstance()->addCommand(command); } return true; } void ImageLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Drag Selection")); ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { ImageModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void ImageLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Resize Selection")); ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = double(i->frame); target = double(newSize.getStartFrame()) + target - double(s.getStartFrame()) * ratio; ImageModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void ImageLayer::deleteSelection(Selection s) { if (!m_model) return; ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Delete Selection")); ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) command->deletePoint(*i); } finish(command); } void ImageLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool ImageLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } ImageModel::Point newPoint(frame); //!!! inadequate if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } else { newPoint.label = tr("New Point"); } command->addPoint(newPoint); } finish(command); return true; } QString ImageLayer::getLocalFilename(QString img) const { if (m_fileSources.find(img) == m_fileSources.end()) { checkAddSource(img); if (m_fileSources.find(img) == m_fileSources.end()) { return img; } } return m_fileSources[img]->getLocalFilename(); } void ImageLayer::checkAddSource(QString img) const { SVDEBUG << "ImageLayer::checkAddSource(" << img << "): yes, trying..." << endl; if (m_fileSources.find(img) != m_fileSources.end()) { return; } ProgressDialog dialog(tr("Opening image URL..."), true, 2000); FileSource *rf = new FileSource(img, &dialog); if (rf->isOK()) { cerr << "ok, adding it (local filename = " << rf->getLocalFilename() << ")" << endl; m_fileSources[img] = rf; connect(rf, SIGNAL(ready()), this, SLOT(fileSourceReady())); } else { delete rf; } } void ImageLayer::checkAddSources() { const ImageModel::PointList &points(m_model->getPoints()); for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { checkAddSource((*i).image); } } void ImageLayer::fileSourceReady() { // SVDEBUG << "ImageLayer::fileSourceReady" << endl; FileSource *rf = dynamic_cast(sender()); if (!rf) return; QString img; for (FileSourceMap::const_iterator i = m_fileSources.begin(); i != m_fileSources.end(); ++i) { if (i->second == rf) { img = i->first; // cerr << "it's image \"" << img << "\"" << endl; break; } } if (img == "") return; QMutexLocker locker(&m_imageMapMutex); m_images.erase(img); for (ViewImageMap::iterator i = m_scaled.begin(); i != m_scaled.end(); ++i) { i->second.erase(img); emit modelChanged(); } } void ImageLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { Layer::toXml(stream, indent, extraAttributes); } void ImageLayer::setProperties(const QXmlAttributes &) { } sonic-visualiser-3.0.3/svgui/layer/ImageLayer.h0000644000000000000000000001153613111512442017603 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_LAYER_H_ #define _IMAGE_LAYER_H_ #include "Layer.h" #include "data/model/ImageModel.h" #include #include #include #include #include class View; class QPainter; class FileSource; class ImageLayer : public Layer { Q_OBJECT public: ImageLayer(); virtual ~ImageLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); virtual bool editOpen(LayerGeometryProvider *, QMouseEvent *); // on double-click virtual const Model *getModel() const { return m_model; } void setModel(ImageModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); virtual ColourSignificance getLayerColourSignificance() const { return ColourAbsent; } virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual int getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &) const { return 0; } virtual void setLayerDormant(const LayerGeometryProvider *v, bool dormant); void setProperties(const QXmlAttributes &attributes); virtual bool addImage(sv_frame_t frame, QString url); // using a command protected slots: void checkAddSources(); void fileSourceReady(); protected: ImageModel::PointList getLocalPoints(LayerGeometryProvider *v, int x, int y) const; bool getImageOriginalSize(QString name, QSize &size) const; QImage getImage(LayerGeometryProvider *v, QString name, QSize maxSize) const; void drawImage(LayerGeometryProvider *v, QPainter &paint, const ImageModel::Point &p, int x, int nx) const; //!!! how to reap no-longer-used images? typedef std::map ImageMap; typedef std::map ViewImageMap; typedef std::map FileSourceMap; static ImageMap m_images; static QMutex m_imageMapMutex; mutable ViewImageMap m_scaled; mutable FileSourceMap m_fileSources; QString getLocalFilename(QString img) const; void checkAddSource(QString img) const; ImageModel *m_model; bool m_editing; QPoint m_editOrigin; ImageModel::Point m_originalPoint; ImageModel::Point m_editingPoint; ImageModel::EditCommand *m_editingCommand; void finish(ImageModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/ImageRegionFinder.cpp0000644000000000000000000000616213111512442021434 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ImageRegionFinder.h" #include #include #include #include ImageRegionFinder::ImageRegionFinder() { } ImageRegionFinder::~ImageRegionFinder() { } QRect ImageRegionFinder::findRegionExtents(QImage *image, QPoint origin) const { int w = image->width(), h = image->height(); QImage visited(w, h, QImage::Format_Mono); visited.fill(0); std::stack s; s.push(origin); int xmin = origin.x(); int xmax = xmin; int ymin = origin.y(); int ymax = ymin; QRgb opix = image->pixel(origin); while (!s.empty()) { QPoint p = s.top(); s.pop(); visited.setPixel(p, 1); int x = p.x(), y = p.y(); if (x < xmin) xmin = x; if (x > xmax) xmax = x; if (y < ymin) ymin = y; if (y > ymax) ymax = y; std::stack neighbours; int similarNeighbourCount = 0; for (int dx = -1; dx <= 1; ++dx) { for (int dy = -1; dy <= 1; ++dy) { if ((dx != 0 && dy != 0) || (dx == 0 && dy == 0)) continue; if (x + dx < 0 || x + dx >= w || y + dy < 0 || y + dy >= h) continue; if (visited.pixelIndex(x + dx, y + dy) != 0) continue; if (!similar(opix, image->pixel(x + dx, y + dy))) continue; neighbours.push(QPoint(x + dx, y + dy)); ++similarNeighbourCount; } } if (similarNeighbourCount >= 2) { while (!neighbours.empty()) { s.push(neighbours.top()); neighbours.pop(); } } } return QRect(xmin, ymin, xmax - xmin, ymax - ymin); } bool ImageRegionFinder::similar(QRgb a, QRgb b) const { if (b == qRgb(0, 0, 0) || b == qRgb(255, 255, 255)) { // black and white are boundary cases, don't compare similar // to anything -- not even themselves return false; } float ar = float(qRed(a)) / 255.f; float ag = float(qGreen(a)) / 255.f; float ab = float(qBlue(a)) / 255.f; float amag = sqrtf(ar * ar + ag * ag + ab * ab); float thresh = amag / 2; float dr = float(qRed(a) - qRed(b)) / 255.f; float dg = float(qGreen(a) - qGreen(b)) / 255.f; float db = float(qBlue(a) - qBlue(b)) / 255.f; float dist = sqrtf(dr * dr + dg * dg + db * db); // cerr << "thresh=" << thresh << ", dist=" << dist << endl; return (dist < thresh); } sonic-visualiser-3.0.3/svgui/layer/ImageRegionFinder.h0000644000000000000000000000164713111512442021104 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_REGION_FINDER_H_ #define _IMAGE_REGION_FINDER_H_ #include #include class QImage; class ImageRegionFinder { public: ImageRegionFinder(); virtual ~ImageRegionFinder(); QRect findRegionExtents(QImage *image, QPoint origin) const; protected: bool similar(QRgb a, QRgb b) const; }; #endif sonic-visualiser-3.0.3/svgui/layer/Layer.cpp0000644000000000000000000004471413111512442017177 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Layer.h" #include "view/View.h" #include "data/model/Model.h" #include "widgets/CommandHistory.h" #include #include #include #include #include #include #include #include #include "LayerFactory.h" #include "base/PlayParameterRepository.h" #include Layer::Layer() : m_haveDraggingRect(false), m_haveCurrentMeasureRect(false) { } Layer::~Layer() { // SVDEBUG << "Layer::~Layer(" << this << ")" << endl; } void Layer::connectSignals(const Model *model) { connect(model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); connect(model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t))); connect(model, SIGNAL(completionChanged()), this, SIGNAL(modelCompletionChanged())); connect(model, SIGNAL(alignmentCompletionChanged()), this, SIGNAL(modelAlignmentCompletionChanged())); } QString Layer::getPropertyContainerIconName() const { return LayerFactory::getInstance()->getLayerIconName (LayerFactory::getInstance()->getLayerType(this)); } void Layer::setPresentationName(QString name) { m_presentationName = name; } QString Layer::getLayerPresentationName() const { if (m_presentationName != "") return m_presentationName; LayerFactory *factory = LayerFactory::getInstance(); QString layerName = factory->getLayerPresentationName (factory->getLayerType(this)); QString modelName; if (getModel()) modelName = getModel()->objectName(); QString text; if (modelName != "") { text = QString("%1: %2").arg(modelName).arg(layerName); } else { text = layerName; } return text; } void Layer::setObjectName(const QString &name) { QObject::setObjectName(name); emit layerNameChanged(); } PlayParameters * Layer::getPlayParameters() { // cerr << "Layer (" << this << ", " << objectName() << ")::getPlayParameters: model is "<< getModel() << endl; const Model *model = getModel(); if (model) { return PlayParameterRepository::getInstance()->getPlayParameters(model); } return 0; } void Layer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) { const void *vv = (const void *)v; QMutexLocker locker(&m_dormancyMutex); m_dormancy[vv] = dormant; } bool Layer::isLayerDormant(const LayerGeometryProvider *v) const { const void *vv = (const void *)v; QMutexLocker locker(&m_dormancyMutex); if (m_dormancy.find(vv) == m_dormancy.end()) return false; return m_dormancy.find(vv)->second; } void Layer::showLayer(LayerGeometryProvider *view, bool show) { setLayerDormant(view, !show); emit layerParametersChanged(); } bool Layer::getXScaleValue(const LayerGeometryProvider *v, int x, double &value, QString &unit) const { if (!hasTimeXAxis()) return false; const Model *m = getModel(); if (!m) return false; value = double(v->getFrameForX(x)) / m->getSampleRate(); unit = "s"; return true; } bool Layer::getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1, double &diff, QString &unit) const { double v0, v1; if (!getYScaleValue(v, y0, v0, unit) || !getYScaleValue(v, y1, v1, unit)) { diff = 0.f; return false; } diff = fabs(v1 - v0); return true; } sv_frame_t Layer::alignToReference(LayerGeometryProvider *v, sv_frame_t frame) const { const Model *m = getModel(); SVDEBUG << "Layer::alignToReference(" << frame << "): model = " << m << ", alignment reference = " << (m ? m->getAlignmentReference() : 0) << endl; if (m && m->getAlignmentReference()) { return m->alignToReference(frame); } else { return v->getView()->alignToReference(frame); } } sv_frame_t Layer::alignFromReference(LayerGeometryProvider *v, sv_frame_t frame) const { const Model *m = getModel(); SVDEBUG << "Layer::alignFromReference(" << frame << "): model = " << m << ", alignment reference = " << (m ? m->getAlignmentReference() : 0) << endl; if (m && m->getAlignmentReference()) { return m->alignFromReference(frame); } else { return v->getView()->alignFromReference(frame); } } bool Layer::clipboardHasDifferentAlignment(LayerGeometryProvider *v, const Clipboard &clip) const { // Notes on pasting to an aligned layer: // // Each point may have a reference frame that may differ from the // point's given frame (in its source model). If it has no // reference frame, we have to assume the source model was not // aligned or was the reference model: when cutting or copying // points from a layer, we must always set their reference frame // correctly if we are aligned. // // When pasting: // - if point's reference and aligned frames differ: // - if this layer is aligned: // - if point's aligned frame matches this layer's aligned version // of point's reference frame: // - we can paste at reference frame or our frame // - else // - we can paste at reference frame, result of aligning reference // frame in our model, or literal source frame // - else // - we can paste at reference (our) frame, or literal source frame // - else // - if this layer is aligned: // - we can paste at reference (point's only available) frame, // or result of aligning reference frame in our model // - else // - we can only paste at reference frame // // Which of these alternatives are useful? // // Example: we paste between two tracks that are aligned to the // same reference, and the points are at 10s and 20s in the source // track, corresponding to 5s and 10s in the reference but 20s and // 30s in the target track. // // The obvious default is to paste at 20s and 30s; if we aren't // doing that, would it be better to paste at 5s and 10s or at 10s // and 20s? We probably don't ever want to do the former, do we? // We either want to be literal all the way through, or aligned // all the way through. for (Clipboard::PointList::const_iterator i = clip.getPoints().begin(); i != clip.getPoints().end(); ++i) { // In principle, we want to know whether the aligned version // of the reference frame in our layer is the same as the // source frame contained in the clipboard point. However, // because of rounding during alignment, that won't // necessarily be the case even if the clipboard point came // from our layer! What we need to check is whether, if we // aligned the clipboard point's frame back to the reference // using this layer's alignment, we would obtain the same // reference frame as that for the clipboard point. // What if the clipboard point has no reference frame? Then // we have to treat it as having its own frame as the // reference (i.e. having been copied from the reference // model). sv_frame_t sourceFrame = i->getFrame(); sv_frame_t referenceFrame = sourceFrame; if (i->haveReferenceFrame()) { referenceFrame = i->getReferenceFrame(); } sv_frame_t myMappedFrame = alignToReference(v, sourceFrame); // cerr << "sourceFrame = " << sourceFrame << ", referenceFrame = " << referenceFrame << " (have = " << i->haveReferenceFrame() << "), myMappedFrame = " << myMappedFrame << endl; if (myMappedFrame != referenceFrame) return true; } return false; } bool Layer::MeasureRect::operator<(const MeasureRect &mr) const { if (haveFrames) { if (startFrame == mr.startFrame) { if (endFrame != mr.endFrame) { return endFrame < mr.endFrame; } } else { return startFrame < mr.startFrame; } } else { if (pixrect.x() == mr.pixrect.x()) { if (pixrect.width() != mr.pixrect.width()) { return pixrect.width() < mr.pixrect.width(); } } else { return pixrect.x() < mr.pixrect.x(); } } // the two rects are equal in x and width if (pixrect.y() == mr.pixrect.y()) { return pixrect.height() < mr.pixrect.height(); } else { return pixrect.y() < mr.pixrect.y(); } } void Layer::MeasureRect::toXml(QTextStream &stream, QString indent) const { stream << indent; stream << QString("\n") .arg(startY).arg(endY); } void Layer::addMeasurementRect(const QXmlAttributes &attributes) { MeasureRect rect; QString fs = attributes.value("startFrame"); int x0 = 0, x1 = 0; if (fs != "") { rect.startFrame = fs.toInt(); rect.endFrame = attributes.value("endFrame").toInt(); rect.haveFrames = true; } else { x0 = attributes.value("startX").toInt(); x1 = attributes.value("endX").toInt(); rect.haveFrames = false; } rect.startY = attributes.value("startY").toDouble(); rect.endY = attributes.value("endY").toDouble(); rect.pixrect = QRect(x0, 0, x1 - x0, 0); addMeasureRectToSet(rect); } QString Layer::AddMeasurementRectCommand::getName() const { return tr("Make Measurement"); } void Layer::AddMeasurementRectCommand::execute() { m_layer->addMeasureRectToSet(m_rect); } void Layer::AddMeasurementRectCommand::unexecute() { m_layer->deleteMeasureRectFromSet(m_rect); } QString Layer::DeleteMeasurementRectCommand::getName() const { return tr("Delete Measurement"); } void Layer::DeleteMeasurementRectCommand::execute() { m_layer->deleteMeasureRectFromSet(m_rect); } void Layer::DeleteMeasurementRectCommand::unexecute() { m_layer->addMeasureRectToSet(m_rect); } void Layer::measureStart(LayerGeometryProvider *v, QMouseEvent *e) { setMeasureRectFromPixrect(v, m_draggingRect, QRect(e->x(), e->y(), 0, 0)); m_haveDraggingRect = true; } void Layer::measureDrag(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_haveDraggingRect) return; setMeasureRectFromPixrect(v, m_draggingRect, QRect(m_draggingRect.pixrect.x(), m_draggingRect.pixrect.y(), e->x() - m_draggingRect.pixrect.x(), e->y() - m_draggingRect.pixrect.y())); } void Layer::measureEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_haveDraggingRect) return; measureDrag(v, e); if (!m_draggingRect.pixrect.isNull()) { CommandHistory::getInstance()->addCommand (new AddMeasurementRectCommand(this, m_draggingRect)); } m_haveDraggingRect = false; } void Layer::measureDoubleClick(LayerGeometryProvider *, QMouseEvent *) { // nothing, in the base class } void Layer::deleteCurrentMeasureRect() { if (!m_haveCurrentMeasureRect) return; MeasureRectSet::const_iterator focusRectItr = findFocusedMeasureRect(m_currentMeasureRectPoint); if (focusRectItr == m_measureRects.end()) return; CommandHistory::getInstance()->addCommand (new DeleteMeasurementRectCommand(this, *focusRectItr)); } void Layer::paintMeasurementRects(LayerGeometryProvider *v, QPainter &paint, bool showFocus, QPoint focusPoint) const { updateMeasurePixrects(v); MeasureRectSet::const_iterator focusRectItr = m_measureRects.end(); if (m_haveDraggingRect) { paintMeasurementRect(v, paint, m_draggingRect, true); } else if (showFocus) { focusRectItr = findFocusedMeasureRect(focusPoint); } m_haveCurrentMeasureRect = false; for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { bool focused = (i == focusRectItr); paintMeasurementRect(v, paint, *i, focused); if (focused) { m_haveCurrentMeasureRect = true; m_currentMeasureRectPoint = focusPoint; } } } bool Layer::nearestMeasurementRectChanged(LayerGeometryProvider *v, QPoint prev, QPoint now) const { updateMeasurePixrects(v); MeasureRectSet::const_iterator i0 = findFocusedMeasureRect(prev); MeasureRectSet::const_iterator i1 = findFocusedMeasureRect(now); return (i0 != i1); } void Layer::updateMeasurePixrects(LayerGeometryProvider *v) const { sv_frame_t sf = v->getStartFrame(); sv_frame_t ef = v->getEndFrame(); for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { // This logic depends on the fact that if one measure rect in // a layer has frame values, they all will. That is in fact // the case, because haveFrames is based on whether the layer // hasTimeXAxis() or not. Measure rect ordering in the rect // set wouldn't work correctly either, if haveFrames could // vary. if (i->haveFrames) { if (i->startFrame >= ef) break; if (i->endFrame <= sf) continue; } int x0 = i->pixrect.x(); int x1 = x0 + i->pixrect.width(); if (i->haveFrames) { if (i->startFrame >= v->getStartFrame()) { x0 = v->getXForFrame(i->startFrame); } if (i->endFrame <= int(v->getEndFrame())) { x1 = v->getXForFrame(i->endFrame); } } i->pixrect = QRect(x0, i->pixrect.y(), x1 - x0, i->pixrect.height()); updateMeasureRectYCoords(v, *i); } } void Layer::updateMeasureRectYCoords(LayerGeometryProvider *v, const MeasureRect &r) const { int y0 = int(lrint(r.startY * v->getPaintHeight())); int y1 = int(lrint(r.endY * v->getPaintHeight())); r.pixrect = QRect(r.pixrect.x(), y0, r.pixrect.width(), y1 - y0); } void Layer::setMeasureRectYCoord(LayerGeometryProvider *v, MeasureRect &r, bool start, int y) const { if (start) { r.startY = double(y) / double(v->getPaintHeight()); r.endY = r.startY; } else { r.endY = double(y) / double(v->getPaintHeight()); } } void Layer::setMeasureRectFromPixrect(LayerGeometryProvider *v, MeasureRect &r, QRect pixrect) const { r.pixrect = pixrect; r.haveFrames = hasTimeXAxis(); if (r.haveFrames) { r.startFrame = v->getFrameForX(pixrect.x()); r.endFrame = v->getFrameForX(pixrect.x() + pixrect.width()); } setMeasureRectYCoord(v, r, true, pixrect.y()); setMeasureRectYCoord(v, r, false, pixrect.y() + pixrect.height()); } Layer::MeasureRectSet::const_iterator Layer::findFocusedMeasureRect(QPoint focusPoint) const { double frDist = 0; MeasureRectSet::const_iterator focusRectItr = m_measureRects.end(); for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { if (!i->pixrect.adjusted(-2, -2, 2, 2).contains(focusPoint)) continue; int cx = i->pixrect.x() + i->pixrect.width()/2; int cy = i->pixrect.y() + i->pixrect.height()/2; int xd = focusPoint.x() - cx; int yd = focusPoint.y() - cy; double d = sqrt(double(xd * xd + yd * yd)); if (focusRectItr == m_measureRects.end() || d < frDist) { focusRectItr = i; frDist = d; } } return focusRectItr; } void Layer::paintMeasurementRect(LayerGeometryProvider *v, QPainter &paint, const MeasureRect &r, bool focus) const { if (r.haveFrames) { int x0 = -1; int x1 = v->getPaintWidth() + 1; if (r.startFrame >= v->getStartFrame()) { x0 = v->getXForFrame(r.startFrame); } if (r.endFrame <= v->getEndFrame()) { x1 = v->getXForFrame(r.endFrame); } QRect pr = QRect(x0, r.pixrect.y(), x1 - x0, r.pixrect.height()); r.pixrect = pr; } v->drawMeasurementRect(paint, this, r.pixrect.normalized(), focus); } void Layer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; if (m_presentationName != "") { extraAttributes = QString("%1 presentationName=\"%2\"") .arg(extraAttributes).arg(encodeEntities(m_presentationName)); } stream << QString("getLayerTypeName (LayerFactory::getInstance()->getLayerType(this)))) .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getObjectExportId(getModel())) .arg(extraAttributes); if (m_measureRects.empty()) { stream << QString("/>\n"); return; } stream << QString(">\n"); for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { i->toXml(stream, indent + " "); } stream << QString("\n"); } void Layer::toBriefXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; if (m_presentationName != "") { extraAttributes = QString("%1 presentationName=\"%2\"") .arg(extraAttributes).arg(encodeEntities(m_presentationName)); } stream << QString("\n") .arg(encodeEntities(LayerFactory::getInstance()->getLayerTypeName (LayerFactory::getInstance()->getLayerType(this)))) .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getObjectExportId(getModel())) .arg(extraAttributes); } sonic-visualiser-3.0.3/svgui/layer/Layer.h0000644000000000000000000005762513111512442016651 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_H_ #define _LAYER_H_ #include "base/PropertyContainer.h" #include "base/XmlExportable.h" #include "base/Selection.h" #include "widgets/CommandHistory.h" #include "system/System.h" #include #include #include #include #include #include #include #include class ZoomConstraint; class Model; class QPainter; class View; class LayerGeometryProvider; class QMouseEvent; class Clipboard; class RangeMapper; /** * The base class for visual representations of the data found in a * Model. Layers are expected to be able to draw themselves onto a * View, and may also be editable. */ class Layer : public PropertyContainer, public XmlExportable { Q_OBJECT public: Layer(); virtual ~Layer(); virtual const Model *getModel() const = 0; Model *getModel() { return const_cast(const_cast(this)->getModel()); } /** * Return a zoom constraint object defining the supported zoom * levels for this layer. If this returns zero, the layer will * support any integer zoom level. */ virtual const ZoomConstraint *getZoomConstraint() const { return 0; } /** * Return true if this layer can handle zoom levels other than * those supported by its zoom constraint (presumably less * efficiently or accurately than the officially supported zoom * levels). If true, the layer will unenthusistically accept any * integer zoom level from 1 to the maximum returned by its zoom * constraint. */ virtual bool supportsOtherZoomLevels() const { return true; } /** * Paint the given rectangle of this layer onto the given view * using the given painter, superimposing it on top of any * existing material in that view. The LayerGeometryProvider (an * interface implemented by View) is provided here because it is * possible for one layer to exist in more than one view, so the * dimensions of the view may vary from one paint call to another * (without any view having been resized). */ virtual void paint(LayerGeometryProvider *, QPainter &, QRect) const = 0; /** * Enable or disable synchronous painting. If synchronous * painting is enabled, a call to paint() must complete painting * the entire rectangle before it returns. If synchronous * painting is disabled (which should be the default), the paint() * call may defer painting some regions if data is not yet * available, by calling back on its view to schedule another * update. Synchronous painting is necessary when rendering to an * image. Simple layer types will always paint synchronously, and * so may ignore this. */ virtual void setSynchronousPainting(bool /* synchronous */) { } enum VerticalPosition { PositionTop, PositionMiddle, PositionBottom }; virtual VerticalPosition getPreferredTimeRulerPosition() const { return PositionMiddle; } virtual VerticalPosition getPreferredFrameCountPosition() const { return PositionBottom; } virtual bool hasLightBackground() const { return true; } virtual QString getPropertyContainerIconName() const; virtual QString getPropertyContainerName() const { if (m_presentationName != "") return m_presentationName; else return objectName(); } virtual void setPresentationName(QString name); virtual QString getLayerPresentationName() const; virtual QPixmap getLayerPresentationPixmap(QSize) const { return QPixmap(); } virtual int getVerticalScaleWidth(LayerGeometryProvider *, bool detailed, QPainter &) const = 0; virtual void paintVerticalScale(LayerGeometryProvider *, bool /* detailed */, QPainter &, QRect) const { } virtual bool getCrosshairExtents(LayerGeometryProvider *, QPainter &, QPoint /* cursorPos */, std::vector &) const { return false; } virtual void paintCrosshairs(LayerGeometryProvider *, QPainter &, QPoint) const { } virtual void paintMeasurementRects(LayerGeometryProvider *, QPainter &, bool showFocus, QPoint focusPoint) const; virtual bool nearestMeasurementRectChanged(LayerGeometryProvider *, QPoint prev, QPoint now) const; virtual QString getFeatureDescription(LayerGeometryProvider *, QPoint &) const { return ""; } virtual QString getLabelPreceding(sv_frame_t /* frame */) const { return ""; } enum SnapType { SnapLeft, SnapRight, SnapNearest, SnapNeighbouring }; /** * Adjust the given frame to snap to the nearest feature, if * possible. * * If snap is SnapLeft or SnapRight, adjust the frame to match * that of the nearest feature in the given direction regardless * of how far away it is. If snap is SnapNearest, adjust the * frame to that of the nearest feature in either direction. If * snap is SnapNeighbouring, adjust the frame to that of the * nearest feature if it is close, and leave it alone (returning * false) otherwise. SnapNeighbouring should always choose the * same feature that would be used in an editing operation through * calls to editStart etc. * * Return true if a suitable feature was found and frame adjusted * accordingly. Return false if no suitable feature was available * (and leave frame unmodified). If returning true, also return * the resolution of the model in this layer in sample frames. */ virtual bool snapToFeatureFrame(LayerGeometryProvider * /* v */, sv_frame_t & /* frame */, int &resolution, SnapType /* snap */) const { resolution = 1; return false; } /** * Adjust the given frame to snap to the next feature that has * "effectively" the same value as the feature prior to the given * frame, if possible. * * The snap type must be SnapLeft (snap to the time of the next * feature prior to the one preceding the given frame that has a * similar value to it) or SnapRight (snap to the time of the next * feature following the given frame that has a similar value to * the feature preceding it). Other values are not permitted. * * Return true if a suitable feature was found and frame adjusted * accordingly. Return false if no suitable feature was available * (and leave frame unmodified). If returning true, also return * the resolution of the model in this layer in sample frames. */ virtual bool snapToSimilarFeature(LayerGeometryProvider * /* v */, sv_frame_t & /* source frame */, int &resolution, SnapType /* snap */) const { resolution = 1; return false; } // Draw, erase, and edit modes: // // Layer needs to get actual mouse events, I guess. Draw mode is // probably the easier. virtual void drawStart(LayerGeometryProvider *, QMouseEvent *) { } virtual void drawDrag(LayerGeometryProvider *, QMouseEvent *) { } virtual void drawEnd(LayerGeometryProvider *, QMouseEvent *) { } virtual void eraseStart(LayerGeometryProvider *, QMouseEvent *) { } virtual void eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } virtual void eraseEnd(LayerGeometryProvider *, QMouseEvent *) { } virtual void editStart(LayerGeometryProvider *, QMouseEvent *) { } virtual void editDrag(LayerGeometryProvider *, QMouseEvent *) { } virtual void editEnd(LayerGeometryProvider *, QMouseEvent *) { } virtual void splitStart(LayerGeometryProvider *, QMouseEvent *) { } virtual void splitEnd(LayerGeometryProvider *, QMouseEvent *) { } virtual void addNote(LayerGeometryProvider *, QMouseEvent *) { }; // Measurement rectangle (or equivalent). Unlike draw and edit, // the base Layer class can provide working implementations of // these for most situations. // virtual void measureStart(LayerGeometryProvider *, QMouseEvent *); virtual void measureDrag(LayerGeometryProvider *, QMouseEvent *); virtual void measureEnd(LayerGeometryProvider *, QMouseEvent *); virtual void measureDoubleClick(LayerGeometryProvider *, QMouseEvent *); virtual bool haveCurrentMeasureRect() const { return m_haveCurrentMeasureRect; } virtual void deleteCurrentMeasureRect(); // using a command /** * Open an editor on the item under the mouse (e.g. on * double-click). If there is no item or editing is not * supported, return false. */ virtual bool editOpen(LayerGeometryProvider *, QMouseEvent *) { return false; } virtual void moveSelection(Selection, sv_frame_t /* newStartFrame */) { } virtual void resizeSelection(Selection, Selection /* newSize */) { } virtual void deleteSelection(Selection) { } virtual void copy(LayerGeometryProvider *, Selection, Clipboard & /* to */) { } /** * Paste from the given clipboard onto the layer at the given * frame offset. If interactive is true, the layer may ask the * user about paste options through a dialog if desired, and may * return false if the user cancelled the paste operation. This * function should return true if a paste actually occurred. */ virtual bool paste(LayerGeometryProvider *, const Clipboard & /* from */, sv_frame_t /* frameOffset */, bool /* interactive */) { return false; } // Text mode: // // Label nearest feature. We need to get the feature coordinates // and current label from the layer, and then the pane can pop up // a little text entry dialog at the right location. Or we edit // in place? Probably the dialog is easier. /** * This should return true if the layer can safely be scrolled * automatically by a given view (simply copying the existing data * and then refreshing the exposed area) without altering its * meaning. For the view widget as a whole this is usually not * possible because of invariant (non-scrolling) material * displayed over the top, but the widget may be able to optimise * scrolling better if it is known that individual views can be * scrolled safely in this way. */ virtual bool isLayerScrollable(const LayerGeometryProvider *) const { return true; } /** * This should return true if the layer completely obscures any * underlying layers. It's used to determine whether the view can * safely draw any selection rectangles under the layer instead of * over it, in the case where the layer is not scrollable and * therefore needs to be redrawn each time (so that the selection * rectangle can be cached). */ virtual bool isLayerOpaque() const { return false; } enum ColourSignificance { ColourAbsent, ColourIrrelevant, ColourDistinguishes, ColourAndBackgroundSignificant, ColourHasMeaningfulValue }; /** * This should return the degree of meaning associated with colour * in this layer. * * If ColourAbsent, the layer does not use colour. If * ColourIrrelevant, the layer is coloured and the colour may be * set by the user, but it doesn't really matter what the colour * is (for example, in a time ruler layer). If * ColourDistinguishes, then the colour is used to distinguish * this layer from other similar layers (e.g. for data layers). * If ColourAndBackgroundSignificant, then the layer should be * given greater weight than ColourDistinguishes layers when * choosing a background colour (e.g. for waveforms). If * ColourHasMeaningfulValue, colours are actually meaningful -- * the view will then show selections using unfilled rectangles * instead of translucent filled rectangles, so as not to disturb * the colours underneath. */ virtual ColourSignificance getLayerColourSignificance() const = 0; /** * This should return true if the layer can be edited by the user. * If this is the case, the appropriate edit tools may be made * available by the application and the layer's drawStart/Drag/End * and editStart/Drag/End methods should be implemented. */ virtual bool isLayerEditable() const { return false; } /** * Return the proportion of background work complete in drawing * this view, as a percentage -- in most cases this will be the * value returned by pointer from a call to the underlying model's * isReady(int *) call. The view may choose to show a progress * meter if it finds that this returns < 100 at any given moment. */ virtual int getCompletion(LayerGeometryProvider *) const { return 100; } /** * Return an error string if any errors have occurred while * loading or processing data for the given view. Return the * empty string if no error has occurred. */ virtual QString getError(LayerGeometryProvider *) const { return ""; } virtual void setObjectName(const QString &name); /** * Convert the layer's data (though not those of the model it * refers to) into XML for file output. This class implements the * basic name/type/model-id output; subclasses will typically call * this superclass implementation with extra attributes describing * their particular properties. */ virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; /** * Set the particular properties of a layer (those specific to the * subclass) from a set of XML attributes. This is the effective * inverse of the toXml method. */ virtual void setProperties(const QXmlAttributes &) = 0; /** * Produce XML containing the layer's ID and type. This is used * to refer to the layer in the display section of the SV session * file, for a layer that has already been described in the data * section. */ virtual void toBriefXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; /** * Add a measurement rectangle from the given XML attributes * (presumably taken from a measurement element). * Does not use a command. */ virtual void addMeasurementRect(const QXmlAttributes &); /** * Indicate that a layer is not currently visible in the given * view and is not expected to become visible in the near future * (for example because the user has explicitly removed or hidden * it). The layer may respond by (for example) freeing any cache * memory it is using, until next time its paint method is called, * when it should set itself un-dormant again. * * A layer class that overrides this function must also call this * class's implementation. */ virtual void setLayerDormant(const LayerGeometryProvider *v, bool dormant); /** * Return whether the layer is dormant (i.e. hidden) in the given * view. */ virtual bool isLayerDormant(const LayerGeometryProvider *v) const; virtual PlayParameters *getPlayParameters(); virtual bool needsTextLabelHeight() const { return false; } virtual bool hasTimeXAxis() const { return true; } /** * Return the minimum and maximum values for the y axis of the * model in this layer, as well as whether the layer is configured * to use a logarithmic y axis display. Also return the unit for * these values if known. * * This function returns the "normal" extents for the layer, not * necessarily the extents actually in use in the display. */ virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const = 0; /** * Return the minimum and maximum values within the displayed * range for the y axis, if only a subset of the whole range of * the model (returned by getValueExtents) is being displayed. * Return false if the layer is not imposing a particular display * extent (using the normal layer extents or deferring to whatever * is in use for the same units elsewhere in the view). */ virtual bool getDisplayExtents(double & /* min */, double & /* max */) const { return false; } /** * Set the displayed minimum and maximum values for the y axis to * the given range, if supported. Return false if not supported * on this layer (and set nothing). In most cases, layers that * return false for getDisplayExtents should also return false for * this function. */ virtual bool setDisplayExtents(double /* min */, double /* max */) { return false; } /** * Return the value and unit at the given x coordinate in the * given view. This is for descriptive purposes using the * measurement tool. The default implementation works correctly * if the layer hasTimeXAxis(). */ virtual bool getXScaleValue(const LayerGeometryProvider *v, int x, double &value, QString &unit) const; /** * Return the value and unit at the given y coordinate in the * given view. */ virtual bool getYScaleValue(const LayerGeometryProvider *, int /* y */, double &/* value */, QString &/* unit */) const { return false; } /** * Return the difference between the values at the given y * coordinates in the given view, and the unit of the difference. * The default implementation just calls getYScaleValue twice and * returns the difference, with the same unit. */ virtual bool getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1, double &diff, QString &unit) const; /** * Get the number of vertical zoom steps available for this layer. * If vertical zooming is not available, return 0. The meaning of * "zooming" is entirely up to the layer -- changing the zoom * level may cause the layer to reset its display extents or * change another property such as display gain. However, layers * are advised for consistency to treat smaller zoom steps as * "more distant" or "zoomed out" and larger ones as "closer" or * "zoomed in". * * Layers that provide this facility should also emit the * verticalZoomChanged signal if their vertical zoom changes * due to factors other than setVerticalZoomStep being called. */ virtual int getVerticalZoomSteps(int & /* defaultStep */) const { return 0; } /** * Get the current vertical zoom step. A layer may support finer * control over ranges etc than is available through the integer * zoom step mechanism; if this one does, it should just return * the nearest of the available zoom steps to the current settings. */ virtual int getCurrentVerticalZoomStep() const { return 0; } /** * Set the vertical zoom step. The meaning of "zooming" is * entirely up to the layer -- changing the zoom level may cause * the layer to reset its display extents or change another * property such as display gain. */ virtual void setVerticalZoomStep(int) { } /** * Create and return a range mapper for vertical zoom step values. * See the RangeMapper documentation for more details. The * returned value is allocated on the heap and will be deleted by * the caller. */ virtual RangeMapper *getNewVerticalZoomRangeMapper() const { return 0; } /** * Return true if this layer type can function without a model * being set. If false (the default), the layer will not be loaded * from a session if its model cannot be found. */ virtual bool canExistWithoutModel() const { return false; } public slots: void showLayer(LayerGeometryProvider *, bool show); signals: void modelChanged(); void modelCompletionChanged(); void modelAlignmentCompletionChanged(); void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); void modelReplaced(); void layerParametersChanged(); void layerParameterRangesChanged(); void layerMeasurementRectsChanged(); void layerNameChanged(); void verticalZoomChanged(); protected: void connectSignals(const Model *); virtual sv_frame_t alignToReference(LayerGeometryProvider *v, sv_frame_t frame) const; virtual sv_frame_t alignFromReference(LayerGeometryProvider *v, sv_frame_t frame) const; bool clipboardHasDifferentAlignment(LayerGeometryProvider *v, const Clipboard &clip) const; struct MeasureRect { mutable QRect pixrect; bool haveFrames; sv_frame_t startFrame; // only valid if haveFrames sv_frame_t endFrame; // ditto double startY; double endY; bool operator<(const MeasureRect &mr) const; void toXml(QTextStream &stream, QString indent) const; }; class AddMeasurementRectCommand : public Command { public: AddMeasurementRectCommand(Layer *layer, MeasureRect rect) : m_layer(layer), m_rect(rect) { } virtual QString getName() const; virtual void execute(); virtual void unexecute(); private: Layer *m_layer; MeasureRect m_rect; }; class DeleteMeasurementRectCommand : public Command { public: DeleteMeasurementRectCommand(Layer *layer, MeasureRect rect) : m_layer(layer), m_rect(rect) { } virtual QString getName() const; virtual void execute(); virtual void unexecute(); private: Layer *m_layer; MeasureRect m_rect; }; void addMeasureRectToSet(const MeasureRect &r) { m_measureRects.insert(r); emit layerMeasurementRectsChanged(); } void deleteMeasureRectFromSet(const MeasureRect &r) { m_measureRects.erase(r); emit layerMeasurementRectsChanged(); } typedef std::set MeasureRectSet; MeasureRectSet m_measureRects; MeasureRect m_draggingRect; bool m_haveDraggingRect; mutable bool m_haveCurrentMeasureRect; mutable QPoint m_currentMeasureRectPoint; // Note that pixrects are only correct for a single view. // So we should update them at the start of the paint procedure // (painting is single threaded) and only use them after that. void updateMeasurePixrects(LayerGeometryProvider *v) const; virtual void updateMeasureRectYCoords(LayerGeometryProvider *v, const MeasureRect &r) const; virtual void setMeasureRectYCoord(LayerGeometryProvider *v, MeasureRect &r, bool start, int y) const; virtual void setMeasureRectFromPixrect(LayerGeometryProvider *v, MeasureRect &r, QRect pixrect) const; // This assumes updateMeasurementPixrects has been called MeasureRectSet::const_iterator findFocusedMeasureRect(QPoint) const; void paintMeasurementRect(LayerGeometryProvider *v, QPainter &paint, const MeasureRect &r, bool focus) const; QString m_presentationName; private: mutable QMutex m_dormancyMutex; mutable std::map m_dormancy; }; #endif sonic-visualiser-3.0.3/svgui/layer/LayerFactory.cpp0000644000000000000000000004114413111512442020521 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "LayerFactory.h" #include "WaveformLayer.h" #include "SpectrogramLayer.h" #include "TimeRulerLayer.h" #include "TimeInstantLayer.h" #include "TimeValueLayer.h" #include "NoteLayer.h" #include "FlexiNoteLayer.h" #include "RegionLayer.h" #include "TextLayer.h" #include "ImageLayer.h" #include "Colour3DPlotLayer.h" #include "SpectrumLayer.h" #include "SliceLayer.h" #include "SliceableLayer.h" #include "base/Clipboard.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/FlexiNoteModel.h" #include "data/model/RegionModel.h" #include "data/model/TextModel.h" #include "data/model/ImageModel.h" #include "data/model/DenseThreeDimensionalModel.h" #include "data/model/WaveFileModel.h" #include "data/model/WritableWaveFileModel.h" #include #include #include #include #include LayerFactory * LayerFactory::m_instance = new LayerFactory; LayerFactory * LayerFactory::getInstance() { return m_instance; } LayerFactory::~LayerFactory() { } QString LayerFactory::getLayerPresentationName(LayerType type) { switch (type) { case Waveform: return Layer::tr("Waveform"); case Spectrogram: return Layer::tr("Spectrogram"); case TimeRuler: return Layer::tr("Ruler"); case TimeInstants: return Layer::tr("Time Instants"); case TimeValues: return Layer::tr("Time Values"); case Notes: return Layer::tr("Notes"); case FlexiNotes: return Layer::tr("Flexible Notes"); case Regions: return Layer::tr("Regions"); case Text: return Layer::tr("Text"); case Image: return Layer::tr("Images"); case Colour3DPlot: return Layer::tr("Colour 3D Plot"); case Spectrum: return Layer::tr("Spectrum"); case Slice: return Layer::tr("Time Slice"); case MelodicRangeSpectrogram: // The user can change all the parameters of this after the // fact -- there's nothing permanently melodic-range about it // that should be encoded in its name return Layer::tr("Spectrogram"); case PeakFrequencySpectrogram: // likewise return Layer::tr("Spectrogram"); case UnknownLayer: default: cerr << "WARNING: LayerFactory::getLayerPresentationName passed unknown layer" << endl; return Layer::tr("Unknown Layer"); } } bool LayerFactory::isLayerSliceable(const Layer *layer) { if (dynamic_cast(layer)) { if (dynamic_cast(layer)) { //!!! We can create slices of spectrograms, but there's a // problem managing the models. The source model for the // slice layer has to be one of the spectrogram's FFT // models -- that's fine, except that we can't store & // recall the slice layer with a reference to that model // because the model is internal to the spectrogram layer // and the document has no record of it. We would need // some other way of managing models that are used in this // way. For the moment we just don't allow slices of // spectrograms -- and provide a spectrum layer for this // instead. // // This business needs a bit more thought -- either come // up with a sensible way to deal with that stuff, or // simplify the existing slice layer logic so that it // doesn't have to deal with models disappearing on it at // all (and use the normal Document setModel mechanism to // set its sliceable model instead of the fancy pants // nonsense it's doing at the moment). return false; } return true; } return false; } LayerFactory::LayerTypeSet LayerFactory::getValidLayerTypes(Model *model) { LayerTypeSet types; if (dynamic_cast(model)) { types.insert(Colour3DPlot); types.insert(Slice); } if (dynamic_cast(model)) { types.insert(Waveform); } if (dynamic_cast(model)) { types.insert(Spectrogram); types.insert(MelodicRangeSpectrogram); types.insert(PeakFrequencySpectrogram); } if (dynamic_cast(model)) { types.insert(TimeInstants); } if (dynamic_cast(model)) { types.insert(TimeValues); } if (dynamic_cast(model)) { types.insert(Notes); } // NOTE: GF: types is a set, so order of insertion does not matter if (dynamic_cast(model)) { types.insert(FlexiNotes); } if (dynamic_cast(model)) { types.insert(Regions); } if (dynamic_cast(model)) { types.insert(Text); } if (dynamic_cast(model)) { types.insert(Image); } if (dynamic_cast(model)) { types.insert(Spectrum); } // We don't count TimeRuler here as it doesn't actually display // the data, although it can be backed by any model return types; } LayerFactory::LayerTypeSet LayerFactory::getValidEmptyLayerTypes() { LayerTypeSet types; types.insert(TimeInstants); types.insert(TimeValues); // Because this is strictly a UI function -- list the layer types // to show in a menu -- it should not contain FlexiNotes; the // layer isn't meaningfully editable in SV // types.insert(FlexiNotes); types.insert(Notes); types.insert(Regions); types.insert(Text); types.insert(Image); //!!! and in principle Colour3DPlot -- now that's a challenge return types; } LayerFactory::LayerType LayerFactory::getLayerType(const Layer *layer) { if (dynamic_cast(layer)) return Waveform; if (dynamic_cast(layer)) return Spectrogram; if (dynamic_cast(layer)) return TimeRuler; if (dynamic_cast(layer)) return TimeInstants; if (dynamic_cast(layer)) return TimeValues; if (dynamic_cast(layer)) return FlexiNotes; if (dynamic_cast(layer)) return Notes; if (dynamic_cast(layer)) return Regions; if (dynamic_cast(layer)) return Text; if (dynamic_cast(layer)) return Image; if (dynamic_cast(layer)) return Colour3DPlot; if (dynamic_cast(layer)) return Spectrum; if (dynamic_cast(layer)) return Slice; return UnknownLayer; } QString LayerFactory::getLayerIconName(LayerType type) { switch (type) { case Waveform: return "waveform"; case Spectrogram: return "spectrogram"; case TimeRuler: return "timeruler"; case TimeInstants: return "instants"; case TimeValues: return "values"; case Notes: return "notes"; case FlexiNotes: return "flexinotes"; case Regions: return "regions"; case Text: return "text"; case Image: return "image"; case Colour3DPlot: return "colour3d"; case Spectrum: return "spectrum"; case Slice: return "spectrum"; case MelodicRangeSpectrogram: return "spectrogram"; case PeakFrequencySpectrogram: return "spectrogram"; case UnknownLayer: default: cerr << "WARNING: LayerFactory::getLayerIconName passed unknown layer" << endl; return "unknown"; } } QString LayerFactory::getLayerTypeName(LayerType type) { switch (type) { case Waveform: return "waveform"; case Spectrogram: return "spectrogram"; case TimeRuler: return "timeruler"; case TimeInstants: return "timeinstants"; case TimeValues: return "timevalues"; case Notes: return "notes"; case FlexiNotes: return "flexinotes"; case Regions: return "regions"; case Text: return "text"; case Image: return "image"; case Colour3DPlot: return "colour3dplot"; case Spectrum: return "spectrum"; case Slice: return "slice"; case MelodicRangeSpectrogram: return "melodicrange"; case PeakFrequencySpectrogram: return "peakfrequency"; case UnknownLayer: default: cerr << "WARNING: LayerFactory::getLayerTypeName passed unknown layer" << endl; return "unknown"; } } LayerFactory::LayerType LayerFactory::getLayerTypeForName(QString name) { if (name == "waveform") return Waveform; if (name == "spectrogram") return Spectrogram; if (name == "timeruler") return TimeRuler; if (name == "timeinstants") return TimeInstants; if (name == "timevalues") return TimeValues; if (name == "notes") return Notes; if (name == "flexinotes") return FlexiNotes; if (name == "regions") return Regions; if (name == "text") return Text; if (name == "image") return Image; if (name == "colour3dplot") return Colour3DPlot; if (name == "spectrum") return Spectrum; if (name == "slice") return Slice; return UnknownLayer; } void LayerFactory::setModel(Layer *layer, Model *model) { // if (trySetModel(layer, model)) // return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; // GF: added FlexiNoteLayer if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; // if (trySetModel(layer, model)) // return; } Model * LayerFactory::createEmptyModel(LayerType layerType, Model *baseModel) { if (layerType == TimeInstants) { return new SparseOneDimensionalModel(baseModel->getSampleRate(), 1); } else if (layerType == TimeValues) { return new SparseTimeValueModel(baseModel->getSampleRate(), 1, true); } else if (layerType == FlexiNotes) { return new FlexiNoteModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Notes) { return new NoteModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Regions) { return new RegionModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Text) { return new TextModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Image) { return new ImageModel(baseModel->getSampleRate(), 1, true); } else { return 0; } } int LayerFactory::getChannel(Layer *layer) { if (dynamic_cast(layer)) { return dynamic_cast(layer)->getChannel(); } if (dynamic_cast(layer)) { return dynamic_cast(layer)->getChannel(); } return -1; } void LayerFactory::setChannel(Layer *layer, int channel) { if (dynamic_cast(layer)) { dynamic_cast(layer)->setChannel(channel); return; } if (dynamic_cast(layer)) { dynamic_cast(layer)->setChannel(channel); return; } if (dynamic_cast(layer)) { dynamic_cast(layer)->setChannel(channel); return; } } Layer * LayerFactory::createLayer(LayerType type) { Layer *layer = 0; switch (type) { case Waveform: layer = new WaveformLayer; break; case Spectrogram: layer = new SpectrogramLayer; break; case TimeRuler: layer = new TimeRulerLayer; break; case TimeInstants: layer = new TimeInstantLayer; break; case TimeValues: layer = new TimeValueLayer; break; case FlexiNotes: layer = new FlexiNoteLayer; break; case Notes: layer = new NoteLayer; break; case Regions: layer = new RegionLayer; break; case Text: layer = new TextLayer; break; case Image: layer = new ImageLayer; break; case Colour3DPlot: layer = new Colour3DPlotLayer; break; case Spectrum: layer = new SpectrumLayer; break; case Slice: layer = new SliceLayer; break; case MelodicRangeSpectrogram: layer = new SpectrogramLayer(SpectrogramLayer::MelodicRange); break; case PeakFrequencySpectrogram: layer = new SpectrogramLayer(SpectrogramLayer::MelodicPeaks); break; case UnknownLayer: default: cerr << "WARNING: LayerFactory::createLayer passed unknown layer" << endl; break; } if (!layer) { cerr << "LayerFactory::createLayer: Unknown layer type " << type << endl; } else { // SVDEBUG << "LayerFactory::createLayer: Setting object name " // << getLayerPresentationName(type) << " on " << layer << endl; layer->setObjectName(getLayerPresentationName(type)); setLayerDefaultProperties(type, layer); } return layer; } void LayerFactory::setLayerDefaultProperties(LayerType type, Layer *layer) { // SVDEBUG << "LayerFactory::setLayerDefaultProperties: type " << type << " (name \"" << getLayerTypeName(type) << "\")" << endl; QSettings settings; settings.beginGroup("LayerDefaults"); QString defaults = settings.value(getLayerTypeName(type), "").toString(); if (defaults == "") return; // cerr << "defaults=\"" << defaults << "\"" << endl; QString xml = layer->toXmlString(); QDomDocument docOld, docNew; if (docOld.setContent(xml, false) && docNew.setContent(defaults, false)) { QXmlAttributes attrs; QDomElement layerElt = docNew.firstChildElement("layer"); QDomNamedNodeMap attrNodes = layerElt.attributes(); for (int i = 0; i < attrNodes.length(); ++i) { QDomAttr attr = attrNodes.item(i).toAttr(); if (attr.isNull()) continue; // cerr << "append \"" << attr.name() // << "\" -> \"" << attr.value() << "\"" // << endl; attrs.append(attr.name(), "", "", attr.value()); } layerElt = docOld.firstChildElement("layer"); attrNodes = layerElt.attributes(); for (int i = 0; i < attrNodes.length(); ++i) { QDomAttr attr = attrNodes.item(i).toAttr(); if (attr.isNull()) continue; if (attrs.value(attr.name()) == "") { // cerr << "append \"" << attr.name() // << "\" -> \"" << attr.value() << "\"" // << endl; attrs.append(attr.name(), "", "", attr.value()); } } layer->setProperties(attrs); } settings.endGroup(); } LayerFactory::LayerType LayerFactory::getLayerTypeForClipboardContents(const Clipboard &clip) { const Clipboard::PointList &contents = clip.getPoints(); bool haveFrame = false; bool haveValue = false; bool haveDuration = false; bool haveLevel = false; for (Clipboard::PointList::const_iterator i = contents.begin(); i != contents.end(); ++i) { if (i->haveFrame()) haveFrame = true; if (i->haveValue()) haveValue = true; if (i->haveDuration()) haveDuration = true; if (i->haveLevel()) haveLevel = true; } if (haveFrame && haveValue && haveDuration && haveLevel) return Notes; if (haveFrame && haveValue && haveDuration) return Regions; if (haveFrame && haveValue) return TimeValues; return TimeInstants; } sonic-visualiser-3.0.3/svgui/layer/LayerFactory.h0000644000000000000000000000471713111512442020173 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_FACTORY_H_ #define _LAYER_FACTORY_H_ #include #include class Layer; class Model; class Clipboard; class LayerFactory { public: enum LayerType { // Standard layers Waveform, Spectrogram, TimeRuler, TimeInstants, TimeValues, Notes, FlexiNotes, Regions, Text, Image, Colour3DPlot, Spectrum, Slice, // Layers with different initial parameters MelodicRangeSpectrogram, PeakFrequencySpectrogram, // Not-a-layer-type UnknownLayer = 255 }; static LayerFactory *getInstance(); virtual ~LayerFactory(); typedef std::set LayerTypeSet; LayerTypeSet getValidLayerTypes(Model *model); /** * Return the set of layer types that an end user should be * allowed to create, empty, for subsequent editing. */ LayerTypeSet getValidEmptyLayerTypes(); LayerType getLayerType(const Layer *); Layer *createLayer(LayerType type); void setLayerDefaultProperties(LayerType type, Layer *layer); QString getLayerPresentationName(LayerType type); bool isLayerSliceable(const Layer *); void setModel(Layer *layer, Model *model); Model *createEmptyModel(LayerType type, Model *baseModel); int getChannel(Layer *layer); void setChannel(Layer *layer, int channel); QString getLayerIconName(LayerType); QString getLayerTypeName(LayerType); LayerType getLayerTypeForName(QString); LayerType getLayerTypeForClipboardContents(const Clipboard &); protected: template bool trySetModel(Layer *layerBase, Model *modelBase) { LayerClass *layer = dynamic_cast(layerBase); if (!layer) return false; ModelClass *model = dynamic_cast(modelBase); if (!model) return false; layer->setModel(model); return true; } static LayerFactory *m_instance; }; #endif sonic-visualiser-3.0.3/svgui/layer/LayerGeometryProvider.h0000644000000000000000000001435413111512442022070 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef LAYER_GEOMETRY_PROVIDER_H #define LAYER_GEOMETRY_PROVIDER_H #include "base/BaseTypes.h" #include #include #include class ViewManager; class View; class Layer; /** * Interface for classes that provide geometry information (such as * size, start frame, and a large number of other properties) about * the disposition of a layer. The main implementor of this interface * is the View class, but other implementations may be used in * different circumstances, e.g. as a proxy to handle hi-dpi * coordinate mapping. * * Note it is expected that some implementations of this may be * disposable, created on-the-fly for a single use. Code that receives * a LayerGeometryProvider pointer as an argument to something should * not, in general, store that pointer as it may be invalidated before * the next use. Use getId() to instead obtain a persistent identifier * for a LayerGeometryProvider, for example to establish whether the * same one is being provided in two separate calls. */ class LayerGeometryProvider { protected: static int getNextId() { static QMutex idMutex; static int nextId = 1; static int maxId = INT_MAX; QMutexLocker locker(&idMutex); int id = nextId; if (nextId == maxId) { // we don't expect this to happen in the lifetime of a // process, but it would be undefined behaviour if it did // since we're using a signed int, so we should really // guard for it... nextId = 1; } else { nextId++; } return id; } public: LayerGeometryProvider() { } /** * Retrieve the id of this object. */ virtual int getId() const = 0; /** * Retrieve the first visible sample frame on the widget. * This is a calculated value based on the centre-frame, widget * width and zoom level. The result may be negative. */ virtual sv_frame_t getStartFrame() const = 0; /** * Return the centre frame of the visible widget. This is an * exact value that does not depend on the zoom block size. Other * frame values (start, end) are calculated from this based on the * zoom and other factors. */ virtual sv_frame_t getCentreFrame() const = 0; /** * Retrieve the last visible sample frame on the widget. * This is a calculated value based on the centre-frame, widget * width and zoom level. */ virtual sv_frame_t getEndFrame() const = 0; /** * Return the pixel x-coordinate corresponding to a given sample * frame (which may be negative). */ virtual int getXForFrame(sv_frame_t frame) const = 0; /** * Return the closest frame to the given pixel x-coordinate. */ virtual sv_frame_t getFrameForX(int x) const = 0; virtual sv_frame_t getModelsStartFrame() const = 0; virtual sv_frame_t getModelsEndFrame() const = 0; /** * Return the closest pixel x-coordinate corresponding to a given * view x-coordinate. */ virtual int getXForViewX(int viewx) const = 0; /** * Return the closest view x-coordinate corresponding to a given * pixel x-coordinate. */ virtual int getViewXForX(int x) const = 0; /** * Return the (maybe fractional) pixel y-coordinate corresponding * to a given frequency, if the frequency range is as specified. * This does not imply any policy about layer frequency ranges, * but it might be useful for layers to match theirs up if * desired. * * Not thread-safe in logarithmic mode. Call only from GUI thread. */ virtual double getYForFrequency(double frequency, double minFreq, double maxFreq, bool logarithmic) const = 0; /** * Return the closest frequency to the given (maybe fractional) * pixel y-coordinate, if the frequency range is as specified. * * Not thread-safe in logarithmic mode. Call only from GUI thread. */ virtual double getFrequencyForY(double y, double minFreq, double maxFreq, bool logarithmic) const = 0; virtual int getTextLabelHeight(const Layer *layer, QPainter &) const = 0; virtual bool getValueExtents(QString unit, double &min, double &max, bool &log) const = 0; /** * Return the zoom level, i.e. the number of frames per pixel */ virtual int getZoomLevel() const = 0; /** * To be called from a layer, to obtain the extent of the surface * that the layer is currently painting to. This may be the extent * of the view (if 1x display scaling is in effect) or of a larger * cached pixmap (if greater display scaling is in effect). */ virtual QRect getPaintRect() const = 0; virtual QSize getPaintSize() const { return getPaintRect().size(); } virtual int getPaintWidth() const { return getPaintRect().width(); } virtual int getPaintHeight() const { return getPaintRect().height(); } virtual bool hasLightBackground() const = 0; virtual QColor getForeground() const = 0; virtual QColor getBackground() const = 0; virtual ViewManager *getViewManager() const = 0; virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const = 0; virtual bool shouldShowFeatureLabels() const = 0; virtual void drawMeasurementRect(QPainter &p, const Layer *, QRect rect, bool focus) const = 0; virtual void updatePaintRect(QRect r) = 0; virtual View *getView() = 0; virtual const View *getView() const = 0; }; #endif sonic-visualiser-3.0.3/svgui/layer/LinearColourScale.cpp0000644000000000000000000000460513111512442021464 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "LinearColourScale.h" #include "ColourScaleLayer.h" #include #include #include "LayerGeometryProvider.h" int LinearColourScale::getWidth(LayerGeometryProvider *, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 15; } void LinearColourScale::paintVertical(LayerGeometryProvider *v, const ColourScaleLayer *layer, QPainter &paint, int /* x0 */, double min, double max) { int h = v->getPaintHeight(); int n = 10; double val = min; double inc = (max - val) / n; const int buflen = 40; char buffer[buflen]; int boxx = 5, boxy = 5; if (layer->getScaleUnits() != "") { boxy += paint.fontMetrics().height(); } int boxw = 10, boxh = h - boxy - 5; int tx = 5 + boxx + boxw; paint.drawRect(boxx, boxy, boxw, boxh); paint.save(); for (int y = 0; y < boxh; ++y) { double val = ((boxh - y) * (max - min)) / boxh + min; paint.setPen(layer->getColourForValue(v, val)); paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1); } paint.restore(); // double round = 1.f; int dp = 0; if (inc > 0) { int prec = int(trunc(log10(inc))); prec -= 1; if (prec < 0) dp = -prec; // round = powf(10.f, prec); //#ifdef DEBUG_TIME_VALUE_LAYER // cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << endl; //#endif } for (int i = 0; i < n; ++i) { int y, ty; y = boxy + int(boxh - ((val - min) * boxh) / (max - min)); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; snprintf(buffer, buflen, "%.*f", dp, val); QString label = QString(buffer); paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y); paint.drawText(tx, ty, label); val += inc; } } sonic-visualiser-3.0.3/svgui/layer/LinearColourScale.h0000644000000000000000000000177113111512442021132 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef LINEAR_COLOUR_SCALE_H #define LINEAR_COLOUR_SCALE_H #include class QPainter; class LayerGeometryProvider; class ColourScaleLayer; class LinearColourScale { public: int getWidth(LayerGeometryProvider *v, QPainter &paint); void paintVertical (LayerGeometryProvider *v, const ColourScaleLayer *layer, QPainter &paint, int x0, double minf, double maxf); }; #endif sonic-visualiser-3.0.3/svgui/layer/LinearNumericalScale.cpp0000644000000000000000000000374013111512442022137 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "LinearNumericalScale.h" #include "VerticalScaleLayer.h" #include #include #include "LayerGeometryProvider.h" #include "base/ScaleTickIntervals.h" int LinearNumericalScale::getWidth(LayerGeometryProvider *, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 10; } void LinearNumericalScale::paintVertical(LayerGeometryProvider *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, double minf, double maxf) { int n = 10; auto ticks = ScaleTickIntervals::linear({ minf, maxf, n }); n = int(ticks.size()); int w = getWidth(v, paint) + x0; int prevy = -1; for (int i = 0; i < n; ++i) { int y, ty; bool drawText = true; if (i == n-1 && v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) { if (layer->getScaleUnits() != "") drawText = false; } double val = ticks[i].value; QString label = QString::fromStdString(ticks[i].label); y = layer->getYForValue(v, val); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) { continue; } paint.drawLine(w - 5, y, w, y); if (drawText) { paint.drawText(w - paint.fontMetrics().width(label) - 6, ty, label); } prevy = y; } } sonic-visualiser-3.0.3/svgui/layer/LinearNumericalScale.h0000644000000000000000000000200613111512442021576 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef LINEAR_NUMERICAL_SCALE_H #define LINEAR_NUMERICAL_SCALE_H #include class QPainter; class LayerGeometryProvider; class VerticalScaleLayer; class LinearNumericalScale { public: int getWidth(LayerGeometryProvider *v, QPainter &paint); void paintVertical (LayerGeometryProvider *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, double minf, double maxf); }; #endif sonic-visualiser-3.0.3/svgui/layer/LogColourScale.cpp0000644000000000000000000000464013111512442020772 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "LogColourScale.h" #include "ColourScaleLayer.h" #include "base/LogRange.h" #include #include #include "LayerGeometryProvider.h" int LogColourScale::getWidth(LayerGeometryProvider *, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 15; } void LogColourScale::paintVertical(LayerGeometryProvider *v, const ColourScaleLayer *layer, QPainter &paint, int /* x0 */, double minlog, double maxlog) { int h = v->getPaintHeight(); int n = 10; double val = minlog; double inc = (maxlog - val) / n; const int buflen = 40; char buffer[buflen]; int boxx = 5, boxy = 5; if (layer->getScaleUnits() != "") { boxy += paint.fontMetrics().height(); } int boxw = 10, boxh = h - boxy - 5; int tx = 5 + boxx + boxw; paint.drawRect(boxx, boxy, boxw, boxh); paint.save(); for (int y = 0; y < boxh; ++y) { double val = ((boxh - y) * (maxlog - minlog)) / boxh + minlog; paint.setPen(layer->getColourForValue(v, LogRange::unmap(val))); paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1); } paint.restore(); int dp = 0; if (inc > 0) { int prec = int(trunc(log10(inc))); prec -= 1; if (prec < 0) dp = -prec; } for (int i = 0; i < n; ++i) { int y, ty; y = boxy + int(boxh - ((val - minlog) * boxh) / (maxlog - minlog)); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; double dv = LogRange::unmap(val); int digits = int(trunc(log10(dv))); int sf = dp + (digits > 0 ? digits : 0); if (sf < 2) sf = 2; snprintf(buffer, buflen, "%.*g", sf, dv); QString label = QString(buffer); paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y); paint.drawText(tx, ty, label); val += inc; } } sonic-visualiser-3.0.3/svgui/layer/LogColourScale.h0000644000000000000000000000176013111512442020437 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef LOG_COLOUR_SCALE_H #define LOG_COLOUR_SCALE_H #include class QPainter; class LayerGeometryProvider; class ColourScaleLayer; class LogColourScale { public: int getWidth(LayerGeometryProvider *v, QPainter &paint); void paintVertical (LayerGeometryProvider *v, const ColourScaleLayer *layer, QPainter &paint, int x0, double minf, double maxf); }; #endif sonic-visualiser-3.0.3/svgui/layer/LogNumericalScale.cpp0000644000000000000000000000377513111512442021456 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "LogNumericalScale.h" #include "VerticalScaleLayer.h" #include "base/LogRange.h" #include #include #include "LayerGeometryProvider.h" #include "base/ScaleTickIntervals.h" int LogNumericalScale::getWidth(LayerGeometryProvider *, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 10; } void LogNumericalScale::paintVertical(LayerGeometryProvider *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, double minlog, double maxlog) { int n = 10; auto ticks = ScaleTickIntervals::logarithmicAlready({ minlog, maxlog, n }); n = int(ticks.size()); int w = getWidth(v, paint) + x0; int prevy = -1; for (int i = 0; i < n; ++i) { int y, ty; bool drawText = true; if (i == n-1 && v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) { if (layer->getScaleUnits() != "") drawText = false; } double val = ticks[i].value; QString label = QString::fromStdString(ticks[i].label); y = layer->getYForValue(v, val); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) { continue; } paint.drawLine(w - 5, y, w, y); if (drawText) { paint.drawText(w - paint.fontMetrics().width(label) - 6, ty, label); } prevy = y; } } sonic-visualiser-3.0.3/svgui/layer/LogNumericalScale.h0000644000000000000000000000200113111512442021100 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef LOG_NUMERICAL_SCALE_H #define LOG_NUMERICAL_SCALE_H #include class QPainter; class LayerGeometryProvider; class VerticalScaleLayer; class LogNumericalScale { public: int getWidth(LayerGeometryProvider *v, QPainter &paint); void paintVertical (LayerGeometryProvider *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, double minlog, double maxlog); }; #endif sonic-visualiser-3.0.3/svgui/layer/NoteLayer.cpp0000644000000000000000000010532713111512442020023 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "NoteLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/Pitch.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "view/View.h" #include "ColourDatabase.h" #include "PianoScale.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "PaintAssistant.h" #include "data/model/NoteModel.h" #include "widgets/ItemEditDialog.h" #include "widgets/TextAbbrev.h" #include #include #include #include #include #include #include #include //#define DEBUG_NOTE_LAYER 1 NoteLayer::NoteLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_dragPointX(0), m_dragPointY(0), m_dragStartX(0), m_dragStartY(0), m_originalPoint(0, 0.0, 0, 1.f, tr("New Point")), m_editingPoint(0, 0.0, 0, 1.f, tr("New Point")), m_editingCommand(0), m_verticalScale(AutoAlignScale), m_scaleMinimum(0), m_scaleMaximum(0) { SVDEBUG << "constructed NoteLayer" << endl; } void NoteLayer::setModel(NoteModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); // SVDEBUG << "NoteLayer::setModel(" << model << ")" << endl; m_scaleMinimum = 0; m_scaleMaximum = 0; emit modelReplaced(); } Layer::PropertyList NoteLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Vertical Scale"); list.push_back("Scale Units"); return list; } QString NoteLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType NoteLayer::getPropertyType(const PropertyName &name) const { if (name == "Scale Units") return UnitsProperty; if (name == "Vertical Scale") return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString NoteLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } return SingleColourLayer::getPropertyGroupName(name); } QString NoteLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } int NoteLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(AutoAlignScale); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString NoteLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Linear"); case 2: return tr("Log"); case 3: return tr("MIDI Notes"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void NoteLayer::setProperty(const PropertyName &name, int value) { if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else { return SingleColourLayer::setProperty(name, value); } } void NoteLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } bool NoteLayer::isLayerScrollable(const LayerGeometryProvider *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } bool NoteLayer::shouldConvertMIDIToHz() const { QString unit = getScaleUnits(); return (unit != "Hz"); // if (unit == "" || // unit.startsWith("MIDI") || // unit.startsWith("midi")) return true; // return false; } bool NoteLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (shouldConvertMIDIToHz()) { unit = "Hz"; min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } else unit = getScaleUnits(); if (m_verticalScale == MIDIRangeScale || m_verticalScale == LogScale) logarithmic = true; return true; } bool NoteLayer::getDisplayExtents(double &min, double &max) const { if (!m_model || shouldAutoAlign()) return false; if (m_verticalScale == MIDIRangeScale) { min = Pitch::getFrequencyForPitch(0); max = Pitch::getFrequencyForPitch(127); return true; } if (m_scaleMinimum == m_scaleMaximum) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); } else { min = m_scaleMinimum; max = m_scaleMaximum; } if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::getDisplayExtents: min = " << min << ", max = " << max << " (m_scaleMinimum = " << m_scaleMinimum << ", m_scaleMaximum = " << m_scaleMaximum << ")" << endl; #endif return true; } bool NoteLayer::setDisplayExtents(double min, double max) { if (!m_model) return false; if (min == max) { if (min == 0.f) { max = 1.f; } else { max = min * 1.0001; } } m_scaleMinimum = min; m_scaleMaximum = max; #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::setDisplayExtents: min = " << min << ", max = " << max << endl; #endif emit layerParametersChanged(); return true; } int NoteLayer::getVerticalZoomSteps(int &defaultStep) const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; defaultStep = 0; return 100; } int NoteLayer::getCurrentVerticalZoomStep() const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return 0; double dmin, dmax; getDisplayExtents(dmin, dmax); int nr = mapper->getPositionForValue(dmax - dmin); delete mapper; return 100 - nr; } //!!! lots of duplication with TimeValueLayer void NoteLayer::setVerticalZoomStep(int step) { if (shouldAutoAlign()) return; if (!m_model) return; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return; double min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); double dmin, dmax; getDisplayExtents(dmin, dmax); double newdist = mapper->getValueForPosition(100 - step); double newmin, newmax; if (logarithmic) { // see SpectrogramLayer::setVerticalZoomStep newmax = (newdist + sqrt(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; } else { double dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } if (newmin < min) { newmax += (min - newmin); newmin = min; } if (newmax > max) { newmax = max; } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; #endif setDisplayExtents(newmin, newmax); } RangeMapper * NoteLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; RangeMapper *mapper; double min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); if (min == max) return 0; if (logarithmic) { mapper = new LogRangeMapper(0, 100, min, max, unit); } else { mapper = new LinearRangeMapper(0, 100, min, max, unit); } return mapper; } NoteModel::PointList NoteLayer::getLocalPoints(LayerGeometryProvider *v, int x) const { if (!m_model) return NoteModel::PointList(); sv_frame_t frame = v->getFrameForX(x); NoteModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } NoteModel::PointList prevPoints = m_model->getPreviousPoints(frame); NoteModel::PointList nextPoints = m_model->getNextPoints(frame); NoteModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (int(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (int(nextPoints.begin()->frame) - frame < frame - int(prevPoints.begin()->frame)) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } bool NoteLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, NoteModel::Point &p) const { if (!m_model) return false; sv_frame_t frame = v->getFrameForX(x); NoteModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return false; // cerr << "frame " << frame << ": " << onPoints.size() << " candidate points" << endl; int nearestDistance = -1; for (NoteModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int distance = getYForValue(v, (*i).value) - y; if (distance < 0) distance = -distance; if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString NoteLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; NoteModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } Note note(0); NoteModel::PointList::iterator i; for (i = points.begin(); i != points.end(); ++i) { int y = getYForValue(v, i->value); int h = 3; if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, i->value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (pos.y() >= y - h && pos.y() <= y) { note = *i; break; } } if (i == points.end()) return tr("No local points"); RealTime rt = RealTime::frame2RealTime(note.frame, m_model->getSampleRate()); RealTime rd = RealTime::frame2RealTime(note.duration, m_model->getSampleRate()); QString pitchText; if (shouldConvertMIDIToHz()) { int mnote = int(lrint(note.value)); int cents = int(lrint((note.value - float(mnote)) * 100)); double freq = Pitch::getFrequencyForPitch(mnote, cents); pitchText = tr("%1 (%2, %3 Hz)") .arg(Pitch::getPitchLabel(mnote, cents)) .arg(mnote) .arg(freq); } else if (getScaleUnits() == "Hz") { pitchText = tr("%1 Hz (%2, %3)") .arg(note.value) .arg(Pitch::getPitchLabelForFrequency(note.value)) .arg(Pitch::getPitchForFrequency(note.value)); } else { pitchText = tr("%1 %2") .arg(note.value).arg(getScaleUnits()); } QString text; if (note.label == "") { text = QString(tr("Time:\t%1\nPitch:\t%2\nDuration:\t%3\nNo label")) .arg(rt.toText(true).c_str()) .arg(pitchText) .arg(rd.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nPitch:\t%2\nDuration:\t%3\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(pitchText) .arg(rd.toText(true).c_str()) .arg(note.label); } pos = QPoint(v->getXForFrame(note.frame), getYForValue(v, note.value)); return text; } bool NoteLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); NoteModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (NoteModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest NoteModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } void NoteLayer::getScaleExtents(LayerGeometryProvider *v, double &min, double &max, bool &log) const { min = 0.0; max = 0.0; log = false; QString queryUnits; if (shouldConvertMIDIToHz()) queryUnits = "Hz"; else queryUnits = getScaleUnits(); if (shouldAutoAlign()) { if (!v->getValueExtents(queryUnits, min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; #endif } else if (log) { LogRange::mapRange(min, max); #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; #endif } } else { getDisplayExtents(min, max); if (m_verticalScale == MIDIRangeScale) { min = Pitch::getFrequencyForPitch(0); max = Pitch::getFrequencyForPitch(127); } else if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(int(lrint(min))); max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); } if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { LogRange::mapRange(min, max); log = true; } } if (max == min) max = min + 1.0; } int NoteLayer::getYForValue(LayerGeometryProvider *v, double val) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; #endif if (shouldConvertMIDIToHz()) { val = Pitch::getFrequencyForPitch(int(lrint(val)), int(lrint((val - rint(val)) * 100))); #ifdef DEBUG_NOTE_LAYER cerr << "shouldConvertMIDIToHz true, val now = " << val << endl; #endif } if (logarithmic) { val = LogRange::map(val); #ifdef DEBUG_NOTE_LAYER cerr << "logarithmic true, val now = " << val << endl; #endif } int y = int(h - ((val - min) * h) / (max - min)) - 1; #ifdef DEBUG_NOTE_LAYER cerr << "y = " << y << endl; #endif return y; } double NoteLayer::getValueForY(LayerGeometryProvider *v, int y) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); double val = min + (double(h - y) * double(max - min)) / h; if (logarithmic) { val = pow(10.0, val); } if (shouldConvertMIDIToHz()) { val = Pitch::getPitchForFrequency(val); } return val; } bool NoteLayer::shouldAutoAlign() const { if (!m_model) return false; return (m_verticalScale == AutoAlignScale); } void NoteLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("NoteLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); sv_frame_t frame0 = v->getFrameForX(x0); sv_frame_t frame1 = v->getFrameForX(x1); NoteModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); // SVDEBUG << "NoteLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; double min = m_model->getValueMinimum(); double max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; QPoint localPos; NoteModel::Point illuminatePoint(0); bool shouldIlluminate = false; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); for (NoteModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const NoteModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); int w = v->getXForFrame(p.frame + p.duration) - x; int h = 3; if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, p.value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (w < 1) w = 1; paint.setPen(getBaseQColor()); paint.setBrush(brushColour); if (shouldIlluminate && // "illuminatePoint == p" !NoteModel::Point::Comparator()(illuminatePoint, p) && !NoteModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(v->getForeground()); paint.setBrush(v->getForeground()); QString vlabel = QString("%1%2").arg(p.value).arg(getScaleUnits()); PaintAssistant::drawVisibleText(v, paint, x - paint.fontMetrics().width(vlabel) - 2, y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(), vlabel, PaintAssistant::OutlinedText); QString hlabel = RealTime::frame2RealTime (p.frame, m_model->getSampleRate()).toText(true).c_str(); PaintAssistant::drawVisibleText(v, paint, x, y - h/2 - paint.fontMetrics().descent() - 2, hlabel, PaintAssistant::OutlinedText); } paint.drawRect(x, y - h/2, w, h); } paint.restore(); } int NoteLayer::getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &paint) const { if (!m_model || shouldAutoAlign()) { return 0; } else { if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { return LogNumericalScale().getWidth(v, paint) + 10; // for piano } else { return LinearNumericalScale().getWidth(v, paint); } } } void NoteLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect) const { if (!m_model || m_model->getPoints().empty()) return; QString unit; double min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } if (logarithmic && (getScaleUnits() == "Hz")) { PianoScale().paintPianoVertical (v, paint, QRect(w - 10, 0, 10, h), LogRange::unmap(min), LogRange::unmap(max)); paint.drawLine(w, 0, w, h); } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void NoteLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double value = getValueForY(v, e->y()); m_editingPoint = NoteModel::Point(frame, float(value), 0, 0.8f, tr("New Point")); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new NoteModel::EditCommand(m_model, tr("Draw Point")); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void NoteLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double newValue = getValueForY(v, e->y()); sv_frame_t newFrame = m_editingPoint.frame; sv_frame_t newDuration = frame - newFrame; if (newDuration < 0) { newFrame = frame; newDuration = -newDuration; } else if (newDuration == 0) { newDuration = 1; } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = newFrame; m_editingPoint.value = float(newValue); m_editingPoint.duration = newDuration; m_editingCommand->addPoint(m_editingPoint); } void NoteLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) { // SVDEBUG << "NoteLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void NoteLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void NoteLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } void NoteLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; NoteModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.value != m_editingPoint.value) return; m_editingCommand = new NoteModel::EditCommand(m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void NoteLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; m_originalPoint = m_editingPoint; m_dragPointX = v->getXForFrame(m_editingPoint.frame); m_dragPointY = getYForValue(v, m_editingPoint.value); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; m_dragStartX = e->x(); m_dragStartY = e->y(); } void NoteLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; int xdist = e->x() - m_dragStartX; int ydist = e->y() - m_dragStartY; int newx = m_dragPointX + xdist; int newy = m_dragPointY + ydist; sv_frame_t frame = v->getFrameForX(newx); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double value = getValueForY(v, newy); if (!m_editingCommand) { m_editingCommand = new NoteModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = float(value); m_editingCommand->addPoint(m_editingPoint); } void NoteLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) { // SVDEBUG << "NoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Point"); } else { newName = tr("Relocate Point"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool NoteLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return false; NoteModel::Point note(0); if (!getPointToDrag(v, e->x(), e->y(), note)) return false; // NoteModel::Point note = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowDuration | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(note.frame); dialog->setValue(note.value); dialog->setFrameDuration(note.duration); dialog->setText(note.label); if (dialog->exec() == QDialog::Accepted) { NoteModel::Point newNote = note; newNote.frame = dialog->getFrameTime(); newNote.value = dialog->getValue(); newNote.duration = dialog->getFrameDuration(); newNote.label = dialog->getText(); NoteModel::EditCommand *command = new NoteModel::EditCommand (m_model, tr("Edit Point")); command->deletePoint(note); command->addPoint(newNote); finish(command); } delete dialog; return true; } void NoteLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Drag Selection")); NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { NoteModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void NoteLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Resize Selection")); NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double targetStart = double(i->frame); targetStart = double(newSize.getStartFrame()) + targetStart - double(s.getStartFrame()) * ratio; double targetEnd = double(i->frame + i->duration); targetEnd = double(newSize.getStartFrame()) + targetEnd - double(s.getStartFrame()) * ratio; NoteModel::Point newPoint(*i); newPoint.frame = lrint(targetStart); newPoint.duration = lrint(targetEnd - targetStart); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void NoteLayer::deleteSelection(Selection s) { if (!m_model) return; NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Delete Selected Points")); NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); } void NoteLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->duration, i->level, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool NoteLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } NoteModel::Point newPoint(frame); if (i->haveLabel()) newPoint.label = i->getLabel(); if (i->haveValue()) newPoint.value = i->getValue(); else newPoint.value = (m_model->getValueMinimum() + m_model->getValueMaximum()) / 2; if (i->haveLevel()) newPoint.level = i->getLevel(); if (i->haveDuration()) newPoint.duration = i->getDuration(); else { sv_frame_t nextFrame = frame; Clipboard::PointList::const_iterator j = i; for (; j != points.end(); ++j) { if (!j->haveFrame()) continue; if (j != i) break; } if (j != points.end()) { nextFrame = j->getFrame(); } if (nextFrame == frame) { newPoint.duration = m_model->getResolution(); } else { newPoint.duration = nextFrame - frame; } } command->addPoint(newPoint); } finish(command); return true; } void NoteLayer::addNoteOn(sv_frame_t frame, int pitch, int velocity) { m_pendingNoteOns.insert(Note(frame, float(pitch), 0, float(velocity) / 127.f, "")); } void NoteLayer::addNoteOff(sv_frame_t frame, int pitch) { for (NoteSet::iterator i = m_pendingNoteOns.begin(); i != m_pendingNoteOns.end(); ++i) { if (lrintf((*i).value) == pitch) { Note note(*i); m_pendingNoteOns.erase(i); note.duration = frame - note.frame; if (m_model) { NoteModel::AddPointCommand *c = new NoteModel::AddPointCommand (m_model, note, tr("Record Note")); // execute and bundle: CommandHistory::getInstance()->addCommand(c, true, true); } break; } } } void NoteLayer::abandonNoteOns() { m_pendingNoteOns.clear(); } int NoteLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "White" : "Black")); } void NoteLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" verticalScale=\"%1\" scaleMinimum=\"%2\" scaleMaximum=\"%3\" ") .arg(m_verticalScale) .arg(m_scaleMinimum) .arg(m_scaleMaximum)); } void NoteLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok, alsoOk; VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); float min = attributes.value("scaleMinimum").toFloat(&ok); float max = attributes.value("scaleMaximum").toFloat(&alsoOk); if (ok && alsoOk && min != max) setDisplayExtents(min, max); } sonic-visualiser-3.0.3/svgui/layer/NoteLayer.h0000644000000000000000000001374713111512442017474 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _NOTE_LAYER_H_ #define _NOTE_LAYER_H_ #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "data/model/NoteModel.h" #include #include class View; class QPainter; class NoteLayer : public SingleColourLayer, public VerticalScaleLayer { Q_OBJECT public: NoteLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual bool editOpen(LayerGeometryProvider *v, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(NoteModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); enum VerticalScale { AutoAlignScale, LinearScale, LogScale, MIDIRangeScale }; void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool getValueExtents(double &min, double &max, bool &log, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual bool setDisplayExtents(double min, double max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; /** * Add a note-on. Used when recording MIDI "live". The note will * not be finally added to the layer until the corresponding * note-off. */ void addNoteOn(sv_frame_t frame, int pitch, int velocity); /** * Add a note-off. This will cause a note to appear, if and only * if there is a matching pending note-on. */ void addNoteOff(sv_frame_t frame, int pitch); /** * Abandon all pending note-on events. */ void abandonNoteOns(); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); /// VerticalScaleLayer methods virtual int getYForValue(LayerGeometryProvider *v, double value) const; virtual double getValueForY(LayerGeometryProvider *v, int y) const; virtual QString getScaleUnits() const; protected: void getScaleExtents(LayerGeometryProvider *, double &min, double &max, bool &log) const; bool shouldConvertMIDIToHz() const; virtual int getDefaultColourHint(bool dark, bool &impose); NoteModel::PointList getLocalPoints(LayerGeometryProvider *v, int) const; bool getPointToDrag(LayerGeometryProvider *v, int x, int y, NoteModel::Point &) const; NoteModel *m_model; bool m_editing; int m_dragPointX; int m_dragPointY; int m_dragStartX; int m_dragStartY; NoteModel::Point m_originalPoint; NoteModel::Point m_editingPoint; NoteModel::EditCommand *m_editingCommand; VerticalScale m_verticalScale; typedef std::set NoteSet; NoteSet m_pendingNoteOns; mutable double m_scaleMinimum; mutable double m_scaleMaximum; bool shouldAutoAlign() const; void finish(NoteModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/PaintAssistant.cpp0000644000000000000000000002056213111512442021063 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PaintAssistant.h" #include "LayerGeometryProvider.h" #include "base/AudioLevel.h" #include "base/Strings.h" #include "base/Debug.h" #include #include #include #include void PaintAssistant::paintVerticalLevelScale(QPainter &paint, QRect rect, double minVal, double maxVal, Scale scale, int &mult, std::vector *vy) { static double meterdbs[] = { -40, -30, -20, -15, -10, -5, -3, -2, -1, -0.5, 0 }; int h = rect.height(), w = rect.width(); int textHeight = paint.fontMetrics().height(); int toff = -textHeight/2 + paint.fontMetrics().ascent() + 1; int lastLabelledY = -1; int n = 10; if (vy) vy->clear(); double step = 0; mult = 1; if (scale == LinearScale) { step = (maxVal - minVal) / n; int round = 0, limit = 10000000; do { round = int(minVal + step * mult); mult *= 10; } while (!round && mult < limit); if (round) { mult /= 10; // cerr << "\n\nstep goes from " << step; step = double(round) / mult; n = int(lrint((maxVal - minVal) / step)); if (mult > 1) { mult /= 10; } // cerr << " to " << step << " (n = " << n << ")" << endl; } } for (int i = 0; i <= n; ++i) { double val = 0.0, nval = 0.0; QString text = ""; switch (scale) { case LinearScale: val = (minVal + (i * step)); text = QString("%1").arg(mult * val); break; case MeterScale: // ... min, max val = AudioLevel::dB_to_multiplier(meterdbs[i]); text = QString("%1").arg(meterdbs[i]); if (i == n) text = "0dB"; if (i == 0) { text = Strings::minus_infinity; val = 0.0; } break; case dBScale: // ... min, max val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10); text = QString("%1").arg(-(10*n) + i * 10); if (i == n) text = "0dB"; if (i == 0) { text = Strings::minus_infinity; val = 0.0; } break; } if (val < minVal || val > maxVal) continue; int y = getYForValue(scale, val, minVal, maxVal, rect.y(), h); int ny = y; if (nval != 0.0) { ny = getYForValue(scale, nval, minVal, maxVal, rect.y(), h); } // SVDEBUG << "PaintAssistant::paintVerticalLevelScale: val = " // << val << ", y = " << y << ", h = " << h << endl; bool spaceForLabel = (i == 0 || abs(y - lastLabelledY) >= textHeight - 1); if (spaceForLabel) { int tx = 3; // if (scale != LinearScale) { if (paint.fontMetrics().width(text) < w - 10) { tx = w - 10 - paint.fontMetrics().width(text); } int ty = y; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); // } else if (ty > rect.y() + h - paint.fontMetrics().descent()) { // ty = rect.y() + h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); lastLabelledY = ty - toff; /* if (ny != y) { ty = ny; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); } else if (ty > h - paint.fontMetrics().descent()) { ty = h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); } */ paint.drawLine(w - 7, y, w, y); if (vy) vy->push_back(y); if (ny != y) { paint.drawLine(w - 7, ny, w, ny); if (vy) vy->push_back(ny); } } else { paint.drawLine(w - 4, y, w, y); if (vy) vy->push_back(y); if (ny != y) { paint.drawLine(w - 4, ny, w, ny); if (vy) vy->push_back(ny); } } } } static int dBscale(double sample, int m, double maxVal, double minVal) { if (sample < 0.0) return dBscale(-sample, m, maxVal, minVal); double dB = AudioLevel::multiplier_to_dB(sample); double mindB = AudioLevel::multiplier_to_dB(minVal); double maxdB = AudioLevel::multiplier_to_dB(maxVal); if (dB < mindB) return 0; if (dB > 0.0) return m; return int(((dB - mindB) * m) / (maxdB - mindB) + 0.1); } int PaintAssistant::getYForValue(Scale scale, double value, double minVal, double maxVal, int minY, int height) { int vy = 0; // int m = height/2; // int my = minY + m; switch (scale) { case LinearScale: // vy = my - int(m * value); vy = minY + height - int(((value - minVal) / (maxVal - minVal)) * height); break; case MeterScale: // vy = my - AudioLevel::multiplier_to_preview(value, m); vy = minY + height - AudioLevel::multiplier_to_preview ((value - minVal) / (maxVal - minVal), height); break; case dBScale: vy = minY + height - dBscale(value, height, maxVal, minVal); break; } return vy; } void PaintAssistant::drawVisibleText(const LayerGeometryProvider *v, QPainter &paint, int x, int y, QString text, TextStyle style) { if (style == OutlinedText || style == OutlinedItalicText) { paint.save(); if (style == OutlinedItalicText) { QFont f(paint.font()); f.setItalic(true); paint.setFont(f); } QColor penColour, surroundColour, boxColour; penColour = v->getForeground(); surroundColour = v->getBackground(); boxColour = surroundColour; boxColour.setAlpha(127); paint.setPen(Qt::NoPen); paint.setBrush(boxColour); QRect r = paint.fontMetrics().boundingRect(text); r.translate(QPoint(x, y)); // cerr << "drawVisibleText: r = " << r.x() << "," < #include #include class QPainter; class Layer; class LayerGeometryProvider; class PaintAssistant { public: enum Scale { LinearScale, MeterScale, dBScale }; static void paintVerticalLevelScale(QPainter &p, QRect rect, double minVal, double maxVal, Scale scale, int &multRtn, std::vector *markCoordRtns = 0); static int getYForValue(Scale scale, double value, double minVal, double maxVal, int minY, int height); enum TextStyle { BoxedText, OutlinedText, OutlinedItalicText }; static void drawVisibleText(const LayerGeometryProvider *, QPainter &p, int x, int y, QString text, TextStyle style); /** * Scale up pen width for a hi-dpi display without pixel doubling. * Very similar to ViewManager::scalePixelSize, but a bit more * conservative. */ static double scalePenWidth(double width); /** * Apply scalePenWidth to a pen. */ static QPen scalePen(QPen pen); }; #endif sonic-visualiser-3.0.3/svgui/layer/PianoScale.cpp0000644000000000000000000000760113111512442020133 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PianoScale.h" #include #include #include "base/Pitch.h" #include "LayerGeometryProvider.h" #include using namespace std; void PianoScale::paintPianoVertical(LayerGeometryProvider *v, QPainter &paint, QRect r, double minf, double maxf) { int x0 = r.x(), y0 = r.y(), x1 = r.x() + r.width(), y1 = r.y() + r.height(); paint.drawLine(x0, y0, x0, y1); int py = y1, ppy = y1; paint.setBrush(paint.pen().color()); for (int i = 0; i < 128; ++i) { double f = Pitch::getFrequencyForPitch(i); int y = int(lrint(v->getYForFrequency(f, minf, maxf, true))); if (y < y0 - 2) break; if (y > y1 + 2) { continue; } int n = (i % 12); if (n == 1) { // C# -- fill the C from here QColor col = Qt::gray; if (i == 61) { // filling middle C col = Qt::blue; col = col.light(150); } if (ppy - y > 2) { paint.fillRect(x0 + 1, y, x1 - x0, (py + ppy) / 2 - y, col); } } if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { // black notes paint.drawLine(x0 + 1, y, x1, y); int rh = ((py - y) / 4) * 2; if (rh < 2) rh = 2; paint.drawRect(x0 + 1, y - (py-y)/4, (x1 - x0) / 2, rh); } else if (n == 0 || n == 5) { // C, F if (py < y1) { paint.drawLine(x0 + 1, (y + py) / 2, x1, (y + py) / 2); } } ppy = py; py = y; } } void PianoScale::paintPianoHorizontal(LayerGeometryProvider *v, const HorizontalScaleProvider *p, QPainter &paint, QRect r) { int x0 = r.x(), y0 = r.y(), x1 = r.x() + r.width(), y1 = r.y() + r.height(); paint.drawLine(x0, y0, x1, y0); int px = x0, ppx = x0; paint.setBrush(paint.pen().color()); for (int i = 0; i < 128; ++i) { double f = Pitch::getFrequencyForPitch(i); int x = int(lrint(p->getXForFrequency(v, f))); if (i == 0) { px = ppx = x; } if (i == 1) { ppx = px - (x - px); } if (x < x0) { ppx = px; px = x; continue; } if (x > x1) { break; } int n = (i % 12); if (n == 1) { // C# -- fill the C from here QColor col = Qt::gray; if (i == 61) { // filling middle C col = Qt::blue; col = col.light(150); } if (x - ppx > 2) { paint.fillRect((px + ppx) / 2 + 1, y0 + 1, x - (px + ppx) / 2 - 1, y1 - y0, col); } } if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { // black notes paint.drawLine(x, y0, x, y1); int rw = int(lrint(double(x - px) / 4) * 2); if (rw < 2) rw = 2; paint.drawRect(x - rw/2, (y0 + y1) / 2, rw, (y1 - y0) / 2); } else if (n == 0 || n == 5) { // C, F if (px < x1) { paint.drawLine((x + px) / 2, y0, (x + px) / 2, y1); } } ppx = px; px = x; } } sonic-visualiser-3.0.3/svgui/layer/PianoScale.h0000644000000000000000000000236113111512442017576 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef PIANO_SCALE_H #define PIANO_SCALE_H #include class QPainter; class LayerGeometryProvider; class PianoScale { public: void paintPianoVertical (LayerGeometryProvider *v, QPainter &paint, QRect rect, double minf, double maxf); class HorizontalScaleProvider { public: virtual double getFrequencyForX(const LayerGeometryProvider *, double x) const = 0; virtual double getXForFrequency(const LayerGeometryProvider *, double freq) const = 0; }; void paintPianoHorizontal (LayerGeometryProvider *v, const HorizontalScaleProvider *p, QPainter &paint, QRect rect); }; #endif sonic-visualiser-3.0.3/svgui/layer/RegionLayer.cpp0000644000000000000000000012472413111512442020343 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2008 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RegionLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "ColourDatabase.h" #include "ColourMapper.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "LinearColourScale.h" #include "LogColourScale.h" #include "PaintAssistant.h" #include "view/View.h" #include "data/model/RegionModel.h" #include "widgets/ItemEditDialog.h" #include "widgets/TextAbbrev.h" #include #include #include #include #include #include #include RegionLayer::RegionLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_dragPointX(0), m_dragPointY(0), m_dragStartX(0), m_dragStartY(0), m_originalPoint(0, 0.0, 0, tr("New Region")), m_editingPoint(0, 0.0, 0, tr("New Region")), m_editingCommand(0), m_verticalScale(EqualSpaced), m_colourMap(0), m_plotStyle(PlotLines) { } void RegionLayer::setModel(RegionModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); connect(m_model, SIGNAL(modelChanged()), this, SLOT(recalcSpacing())); recalcSpacing(); // SVDEBUG << "RegionLayer::setModel(" << model << ")" << endl; if (m_model && m_model->getRDFTypeURI().endsWith("Segment")) { setPlotStyle(PlotSegmentation); } if (m_model && m_model->getRDFTypeURI().endsWith("Change")) { setPlotStyle(PlotSegmentation); } emit modelReplaced(); } Layer::PropertyList RegionLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Vertical Scale"); list.push_back("Scale Units"); list.push_back("Plot Type"); return list; } QString RegionLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); if (name == "Plot Type") return tr("Plot Type"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType RegionLayer::getPropertyType(const PropertyName &name) const { if (name == "Scale Units") return UnitsProperty; if (name == "Vertical Scale") return ValueProperty; if (name == "Plot Type") return ValueProperty; if (name == "Colour" && m_plotStyle == PlotSegmentation) return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString RegionLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } return SingleColourLayer::getPropertyGroupName(name); } int RegionLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Colour" && m_plotStyle == PlotSegmentation) { if (min) *min = 0; if (max) *max = ColourMapper::getColourMapCount() - 1; if (deflt) *deflt = 0; val = m_colourMap; } else if (name == "Plot Type") { if (min) *min = 0; if (max) *max = 1; if (deflt) *deflt = 0; val = int(m_plotStyle); } else if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(EqualSpaced); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString RegionLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour" && m_plotStyle == PlotSegmentation) { return ColourMapper::getColourMapName(value); } else if (name == "Plot Type") { switch (value) { default: case 0: return tr("Bars"); case 1: return tr("Segmentation"); } } else if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Equal Spaced"); case 2: return tr("Linear"); case 3: return tr("Log"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void RegionLayer::setProperty(const PropertyName &name, int value) { if (name == "Colour" && m_plotStyle == PlotSegmentation) { setFillColourMap(value); } else if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else { return SingleColourLayer::setProperty(name, value); } } void RegionLayer::setFillColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; emit layerParametersChanged(); } void RegionLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; bool colourTypeChanged = (style == PlotSegmentation || m_plotStyle == PlotSegmentation); m_plotStyle = style; if (colourTypeChanged) { emit layerParameterRangesChanged(); } emit layerParametersChanged(); } void RegionLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } bool RegionLayer::isLayerScrollable(const LayerGeometryProvider *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } void RegionLayer::recalcSpacing() { m_spacingMap.clear(); m_distributionMap.clear(); if (!m_model) return; // SVDEBUG << "RegionLayer::recalcSpacing" << endl; for (RegionModel::PointList::const_iterator i = m_model->getPoints().begin(); i != m_model->getPoints().end(); ++i) { m_distributionMap[i->value]++; // SVDEBUG << "RegionLayer::recalcSpacing: value found: " << i->value << " (now have " << m_distributionMap[i->value] << " of this value)" << endl; } int n = 0; for (SpacingMap::const_iterator i = m_distributionMap.begin(); i != m_distributionMap.end(); ++i) { m_spacingMap[i->first] = n++; // SVDEBUG << "RegionLayer::recalcSpacing: " << i->first << " -> " << m_spacingMap[i->first] << endl; } } bool RegionLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); unit = getScaleUnits(); if (m_verticalScale == LogScale) logarithmic = true; return true; } bool RegionLayer::getDisplayExtents(double &min, double &max) const { if (!m_model || m_verticalScale == AutoAlignScale || m_verticalScale == EqualSpaced) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); return true; } RegionModel::PointList RegionLayer::getLocalPoints(LayerGeometryProvider *v, int x) const { if (!m_model) return RegionModel::PointList(); sv_frame_t frame = v->getFrameForX(x); RegionModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } RegionModel::PointList prevPoints = m_model->getPreviousPoints(frame); RegionModel::PointList nextPoints = m_model->getNextPoints(frame); RegionModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (long(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (long(nextPoints.begin()->frame) - frame < frame - long(prevPoints.begin()->frame)) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } bool RegionLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, RegionModel::Point &p) const { if (!m_model) return false; sv_frame_t frame = v->getFrameForX(x); RegionModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return false; int nearestDistance = -1; for (RegionModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int distance = getYForValue(v, (*i).value) - y; if (distance < 0) distance = -distance; if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString RegionLayer::getLabelPreceding(sv_frame_t frame) const { if (!m_model) return ""; RegionModel::PointList points = m_model->getPreviousPoints(frame); for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->label != "") return i->label; } return ""; } QString RegionLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; RegionModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } RegionRec region(0); RegionModel::PointList::iterator i; //!!! harmonise with whatever decision is made about point y //!!! coords in paint method for (i = points.begin(); i != points.end(); ++i) { int y = getYForValue(v, i->value); int h = 3; if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, i->value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (pos.y() >= y - h && pos.y() <= y) { region = *i; break; } } if (i == points.end()) return tr("No local points"); RealTime rt = RealTime::frame2RealTime(region.frame, m_model->getSampleRate()); RealTime rd = RealTime::frame2RealTime(region.duration, m_model->getSampleRate()); QString valueText; valueText = tr("%1 %2").arg(region.value).arg(getScaleUnits()); QString text; if (region.label == "") { text = QString(tr("Time:\t%1\nValue:\t%2\nDuration:\t%3\nNo label")) .arg(rt.toText(true).c_str()) .arg(valueText) .arg(rd.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nValue:\t%2\nDuration:\t%3\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(valueText) .arg(rd.toText(true).c_str()) .arg(region.label); } pos = QPoint(v->getXForFrame(region.frame), getYForValue(v, region.value)); return text; } bool RegionLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); RegionModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { // The best frame to snap to is the end frame of whichever // feature we would have snapped to the start frame of if // we had been snapping left. if (i->frame <= frame) { if (i->frame + i->duration > frame) { snapped = i->frame + i->duration; found = true; // don't break, as the next may be better } } else { if (!found) { snapped = i->frame; found = true; } break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest RegionModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } bool RegionLayer::snapToSimilarFeature(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToSimilarFeature(v, frame, resolution, snap); } resolution = m_model->getResolution(); const RegionModel::PointList &points = m_model->getPoints(); RegionModel::PointList close = m_model->getPoints(frame, frame); RegionModel::PointList::const_iterator i; sv_frame_t matchframe = frame; double matchvalue = 0.f; for (i = close.begin(); i != close.end(); ++i) { if (i->frame > frame) break; matchvalue = i->value; matchframe = i->frame; } sv_frame_t snapped = frame; bool found = false; bool distant = false; double epsilon = 0.0001; i = close.begin(); // Scan through the close points first, then the more distant ones // if no suitable close one is found. So the while-termination // condition here can only happen once i has passed through the // whole of the close container and then the whole of the separate // points container. The two iterators are totally distinct, but // have the same type so we cheekily use the same variable and a // single loop for both. while (i != points.end()) { if (!distant) { if (i == close.end()) { // switch from the close container to the points container i = points.begin(); distant = true; } } if (snap == SnapRight) { if (i->frame > matchframe && fabs(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame < matchframe) { if (fabs(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; // don't break, as the next may be better } } else if (found || distant) { break; } } else { // no other snap types supported } ++i; } frame = snapped; return found; } QString RegionLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } void RegionLayer::getScaleExtents(LayerGeometryProvider *v, double &min, double &max, bool &log) const { min = 0.0; max = 0.0; log = false; QString queryUnits; queryUnits = getScaleUnits(); if (m_verticalScale == AutoAlignScale) { if (!v->getValueExtents(queryUnits, min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); // cerr << "RegionLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; } else if (log) { LogRange::mapRange(min, max); // cerr << "RegionLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; } } else if (m_verticalScale == EqualSpaced) { if (!m_spacingMap.empty()) { SpacingMap::const_iterator i = m_spacingMap.begin(); min = i->second; i = m_spacingMap.end(); --i; max = i->second; // cerr << "RegionLayer[" << this << "]::getScaleExtents: equal spaced; min = " << min << ", max = " << max << ", log = " << log << endl; } } else { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (m_verticalScale == LogScale) { LogRange::mapRange(min, max); log = true; } } if (max == min) max = min + 1.0; } int RegionLayer::spacingIndexToY(LayerGeometryProvider *v, int i) const { int h = v->getPaintHeight(); int n = int(m_spacingMap.size()); // this maps from i (spacing of the value from the spacing // map) and n (number of region types) to y int y = h - (((h * i) / n) + (h / (2 * n))); return y; } double RegionLayer::yToSpacingIndex(LayerGeometryProvider *v, int y) const { // we return an inexact result here (double rather than int) int h = v->getPaintHeight(); int n = int(m_spacingMap.size()); // from y = h - ((h * i) / n) + (h / (2 * n)) as above (vh taking place of i) double vh = double(2*h*n - h - 2*n*y) / double(2*h); return vh; } int RegionLayer::getYForValue(LayerGeometryProvider *v, double val) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); if (m_verticalScale == EqualSpaced) { if (m_spacingMap.empty()) return h/2; SpacingMap::const_iterator i = m_spacingMap.lower_bound(val); //!!! what now, if i->first != v? int y = spacingIndexToY(v, i->second); // SVDEBUG << "RegionLayer::getYForValue: value " << val << " -> i->second " << i->second << " -> y " << y << endl; return y; } else { getScaleExtents(v, min, max, logarithmic); // cerr << "RegionLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; // cerr << "h = " << h << ", margin = " << margin << endl; if (logarithmic) { val = LogRange::map(val); } return int(h - ((val - min) * h) / (max - min)); } } double RegionLayer::getValueForY(LayerGeometryProvider *v, int y) const { return getValueForY(v, y, -1); } double RegionLayer::getValueForY(LayerGeometryProvider *v, int y, int avoid) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); if (m_verticalScale == EqualSpaced) { // if we're equal spaced, we probably want to snap to the // nearest item when close to it, and give some notification // that we're doing so if (m_spacingMap.empty()) return 1.f; // n is the number of distinct regions. if we are close to // one of the m/n divisions in the y scale, we should snap to // the value of the mth region. double vh = yToSpacingIndex(v, y); // spacings in the map are integral, so find the closest one, // map it back to its y coordinate, and see how far we are // from it int n = int(m_spacingMap.size()); int ivh = int(lrint(vh)); if (ivh < 0) ivh = 0; if (ivh > n-1) ivh = n-1; int iy = spacingIndexToY(v, ivh); int dist = iy - y; int gap = h / n; // between region lines // cerr << "getValueForY: y = " << y << ", vh = " << vh << ", ivh = " << ivh << " of " << n << ", iy = " << iy << ", dist = " << dist << ", gap = " << gap << endl; SpacingMap::const_iterator i = m_spacingMap.begin(); while (i != m_spacingMap.end()) { if (i->second == ivh) break; ++i; } if (i == m_spacingMap.end()) i = m_spacingMap.begin(); // cerr << "nearest existing value = " << i->first << " at " << iy << endl; double val = 0; // cerr << "note: avoid = " << avoid << ", i->second = " << i->second << endl; if (dist < -gap/3 && ((avoid == -1) || (avoid != i->second && avoid != i->second - 1))) { // bisect gap to prior if (i == m_spacingMap.begin()) { val = i->first - 1.f; // cerr << "extended down to " << val << endl; } else { SpacingMap::const_iterator j = i; --j; val = (i->first + j->first) / 2; // cerr << "bisected down to " << val << endl; } } else if (dist > gap/3 && ((avoid == -1) || (avoid != i->second && avoid != i->second + 1))) { // bisect gap to following SpacingMap::const_iterator j = i; ++j; if (j == m_spacingMap.end()) { val = i->first + 1.f; // cerr << "extended up to " << val << endl; } else { val = (i->first + j->first) / 2; // cerr << "bisected up to " << val << endl; } } else { // snap val = i->first; // cerr << "snapped to " << val << endl; } return val; } else { getScaleExtents(v, min, max, logarithmic); double val = min + (double(h - y) * double(max - min)) / h; if (logarithmic) { val = pow(10.0, val); } return val; } } QColor RegionLayer::getColourForValue(LayerGeometryProvider *v, double val) const { double min, max; bool log; getScaleExtents(v, min, max, log); if (min > max) std::swap(min, max); if (max == min) max = min + 1; if (log) { LogRange::mapRange(min, max); val = LogRange::map(val); } // SVDEBUG << "RegionLayer::getColourForValue: min " << min << ", max " // << max << ", log " << log << ", value " << val << endl; QColor solid = ColourMapper(m_colourMap, min, max).map(val); return QColor(solid.red(), solid.green(), solid.blue(), 120); } int RegionLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Blue" : "Blue")); } void RegionLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("RegionLayer::paint", true); int x0 = rect.left() - 40, x1 = rect.right(); sv_frame_t frame0 = v->getFrameForX(x0); sv_frame_t frame1 = v->getFrameForX(x1); RegionModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); // SVDEBUG << "RegionLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; double min = m_model->getValueMinimum(); double max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; QPoint localPos; RegionModel::Point illuminatePoint(0); bool shouldIlluminate = false; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); //!!! point y coords if model does not haveDistinctValues() should //!!! be assigned to avoid overlaps //!!! if it does have distinct values, we should still ensure y //!!! coord is never completely flat on the top or bottom int fontHeight = paint.fontMetrics().height(); for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const RegionModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); int w = v->getXForFrame(p.frame + p.duration) - x; int h = 9; int ex = x + w; RegionModel::PointList::const_iterator j = i; ++j; if (j != points.end()) { const RegionModel::Point &q(*j); int nx = v->getXForFrame(q.frame); if (nx < ex) ex = nx; } if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, p.value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (w < 1) w = 1; if (m_plotStyle == PlotSegmentation) { paint.setPen(getForegroundQColor(v->getView())); paint.setBrush(getColourForValue(v, p.value)); } else { paint.setPen(getBaseQColor()); paint.setBrush(brushColour); } if (m_plotStyle == PlotSegmentation) { if (ex <= x) continue; if (!shouldIlluminate || // "illuminatePoint != p" RegionModel::Point::Comparator()(illuminatePoint, p) || RegionModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(QPen(getForegroundQColor(v->getView()), 1)); paint.drawLine(x, 0, x, v->getPaintHeight()); paint.setPen(Qt::NoPen); } else { paint.setPen(QPen(getForegroundQColor(v->getView()), 2)); } paint.drawRect(x, -1, ex - x, v->getPaintHeight() + 2); } else { if (shouldIlluminate && // "illuminatePoint == p" !RegionModel::Point::Comparator()(illuminatePoint, p) && !RegionModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(v->getForeground()); paint.setBrush(v->getForeground()); QString vlabel = QString("%1%2").arg(p.value).arg(getScaleUnits()); PaintAssistant::drawVisibleText(v, paint, x - paint.fontMetrics().width(vlabel) - 2, y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(), vlabel, PaintAssistant::OutlinedText); QString hlabel = RealTime::frame2RealTime (p.frame, m_model->getSampleRate()).toText(true).c_str(); PaintAssistant::drawVisibleText(v, paint, x, y - h/2 - paint.fontMetrics().descent() - 2, hlabel, PaintAssistant::OutlinedText); } paint.drawLine(x, y-1, x + w, y-1); paint.drawLine(x, y+1, x + w, y+1); paint.drawLine(x, y - h/2, x, y + h/2); paint.drawLine(x+w, y - h/2, x + w, y + h/2); } } int nextLabelMinX = -100; int lastLabelY = 0; for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const RegionModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); bool illuminated = false; if (m_plotStyle != PlotSegmentation) { if (shouldIlluminate && // "illuminatePoint == p" !RegionModel::Point::Comparator()(illuminatePoint, p) && !RegionModel::Point::Comparator()(p, illuminatePoint)) { illuminated = true; } } if (!illuminated) { QString label = p.label; if (label == "") { label = QString("%1%2").arg(p.value).arg(getScaleUnits()); } int labelX, labelY; if (m_plotStyle != PlotSegmentation) { labelX = x - paint.fontMetrics().width(label) - 2; labelY = y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(); } else { labelX = x + 5; labelY = v->getTextLabelHeight(this, paint); if (labelX < nextLabelMinX) { if (lastLabelY < v->getPaintHeight()/2) { labelY = lastLabelY + fontHeight; } } lastLabelY = labelY; nextLabelMinX = labelX + paint.fontMetrics().width(label); } PaintAssistant::drawVisibleText(v, paint, labelX, labelY, label, PaintAssistant::OutlinedText); } } paint.restore(); } int RegionLayer::getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &paint) const { if (!m_model || m_verticalScale == AutoAlignScale || m_verticalScale == EqualSpaced) { return 0; } else if (m_plotStyle == PlotSegmentation) { if (m_verticalScale == LogScale) { return LogColourScale().getWidth(v, paint); } else { return LinearColourScale().getWidth(v, paint); } } else { if (m_verticalScale == LogScale) { return LogNumericalScale().getWidth(v, paint); } else { return LinearNumericalScale().getWidth(v, paint); } } } void RegionLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect) const { if (!m_model || m_model->getPoints().empty()) return; QString unit; double min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); if (m_plotStyle == PlotSegmentation) { getValueExtents(min, max, logarithmic, unit); if (logarithmic) { LogRange::mapRange(min, max); LogColourScale().paintVertical(v, this, paint, 0, min, max); } else { LinearColourScale().paintVertical(v, this, paint, 0, min, max); } } else { getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void RegionLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double value = getValueForY(v, e->y()); m_editingPoint = RegionModel::Point(frame, float(value), 0, ""); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new RegionModel::EditCommand(m_model, tr("Draw Region")); m_editingCommand->addPoint(m_editingPoint); recalcSpacing(); m_editing = true; } void RegionLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double newValue = m_editingPoint.value; if (m_verticalScale != EqualSpaced) newValue = getValueForY(v, e->y()); sv_frame_t newFrame = m_editingPoint.frame; sv_frame_t newDuration = frame - newFrame; if (newDuration < 0) { newFrame = frame; newDuration = -newDuration; } else if (newDuration == 0) { newDuration = 1; } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = newFrame; m_editingPoint.value = float(newValue); m_editingPoint.duration = newDuration; m_editingCommand->addPoint(m_editingPoint); recalcSpacing(); } void RegionLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) { if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; recalcSpacing(); } void RegionLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; recalcSpacing(); } void RegionLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } void RegionLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; RegionModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.value != m_editingPoint.value) return; m_editingCommand = new RegionModel::EditCommand (m_model, tr("Erase Region")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; recalcSpacing(); } void RegionLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) { return; } m_dragPointX = v->getXForFrame(m_editingPoint.frame); m_dragPointY = getYForValue(v, m_editingPoint.value); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; m_dragStartX = e->x(); m_dragStartY = e->y(); recalcSpacing(); } void RegionLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; int xdist = e->x() - m_dragStartX; int ydist = e->y() - m_dragStartY; int newx = m_dragPointX + xdist; int newy = m_dragPointY + ydist; sv_frame_t frame = v->getFrameForX(newx); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); // Do not bisect between two values, if one of those values is // that of the point we're actually moving ... int avoid = m_spacingMap[m_editingPoint.value]; // ... unless there are other points with the same value if (m_distributionMap[m_editingPoint.value] > 1) avoid = -1; double value = getValueForY(v, newy, avoid); if (!m_editingCommand) { m_editingCommand = new RegionModel::EditCommand(m_model, tr("Drag Region")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = float(value); m_editingCommand->addPoint(m_editingPoint); recalcSpacing(); } void RegionLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) { if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Region"); } else { newName = tr("Relocate Region"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; recalcSpacing(); } bool RegionLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return false; RegionModel::Point region(0); if (!getPointToDrag(v, e->x(), e->y(), region)) return false; ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowDuration | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(region.frame); dialog->setValue(region.value); dialog->setFrameDuration(region.duration); dialog->setText(region.label); if (dialog->exec() == QDialog::Accepted) { RegionModel::Point newRegion = region; newRegion.frame = dialog->getFrameTime(); newRegion.value = dialog->getValue(); newRegion.duration = dialog->getFrameDuration(); newRegion.label = dialog->getText(); RegionModel::EditCommand *command = new RegionModel::EditCommand (m_model, tr("Edit Region")); command->deletePoint(region); command->addPoint(newRegion); finish(command); } delete dialog; recalcSpacing(); return true; } void RegionLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Drag Selection")); RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { RegionModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); recalcSpacing(); } void RegionLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Resize Selection")); RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double targetStart = double(i->frame); targetStart = double(newSize.getStartFrame()) + targetStart - double(s.getStartFrame()) * ratio; double targetEnd = double(i->frame + i->duration); targetEnd = double(newSize.getStartFrame()) + targetEnd - double(s.getStartFrame()) * ratio; RegionModel::Point newPoint(*i); newPoint.frame = lrint(targetStart); newPoint.duration = lrint(targetEnd - targetStart); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); recalcSpacing(); } void RegionLayer::deleteSelection(Selection s) { if (!m_model) return; RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Delete Selected Points")); RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); recalcSpacing(); } void RegionLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->duration, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool RegionLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } RegionModel::Point newPoint(frame); if (i->haveLabel()) newPoint.label = i->getLabel(); if (i->haveValue()) newPoint.value = i->getValue(); else newPoint.value = (m_model->getValueMinimum() + m_model->getValueMaximum()) / 2; if (i->haveDuration()) newPoint.duration = i->getDuration(); else { sv_frame_t nextFrame = frame; Clipboard::PointList::const_iterator j = i; for (; j != points.end(); ++j) { if (!j->haveFrame()) continue; if (j != i) break; } if (j != points.end()) { nextFrame = j->getFrame(); } if (nextFrame == frame) { newPoint.duration = m_model->getResolution(); } else { newPoint.duration = nextFrame - frame; } } command->addPoint(newPoint); } finish(command); recalcSpacing(); return true; } void RegionLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" verticalScale=\"%1\" plotStyle=\"%2\"") .arg(m_verticalScale) .arg(m_plotStyle)); } void RegionLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok; VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); PlotStyle style = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(style); } sonic-visualiser-3.0.3/svgui/layer/RegionLayer.h0000644000000000000000000001422413111512442020001 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2008 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _REGION_LAYER_H_ #define _REGION_LAYER_H_ #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "ColourScaleLayer.h" #include "data/model/RegionModel.h" #include #include #include class View; class QPainter; class RegionLayer : public SingleColourLayer, public VerticalScaleLayer, public ColourScaleLayer { Q_OBJECT public: RegionLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual QString getLabelPreceding(sv_frame_t) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual bool snapToSimilarFeature(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual bool editOpen(LayerGeometryProvider *v, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(RegionModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); void setFillColourMap(int); int getFillColourMap() const { return m_colourMap; } enum VerticalScale { AutoAlignScale, EqualSpaced, LinearScale, LogScale, }; void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } enum PlotStyle { PlotLines, PlotSegmentation }; void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool getValueExtents(double &min, double &max, bool &log, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); /// VerticalScaleLayer and ColourScaleLayer methods int getYForValue(LayerGeometryProvider *v, double value) const; double getValueForY(LayerGeometryProvider *v, int y) const; virtual QString getScaleUnits() const; QColor getColourForValue(LayerGeometryProvider *v, double value) const; protected slots: void recalcSpacing(); protected: double getValueForY(LayerGeometryProvider *v, int y, int avoid) const; void getScaleExtents(LayerGeometryProvider *, double &min, double &max, bool &log) const; virtual int getDefaultColourHint(bool dark, bool &impose); RegionModel::PointList getLocalPoints(LayerGeometryProvider *v, int x) const; bool getPointToDrag(LayerGeometryProvider *v, int x, int y, RegionModel::Point &) const; RegionModel *m_model; bool m_editing; int m_dragPointX; int m_dragPointY; int m_dragStartX; int m_dragStartY; RegionModel::Point m_originalPoint; RegionModel::Point m_editingPoint; RegionModel::EditCommand *m_editingCommand; VerticalScale m_verticalScale; int m_colourMap; PlotStyle m_plotStyle; typedef std::map SpacingMap; // region value -> ordering SpacingMap m_spacingMap; // region value -> number of regions with this value SpacingMap m_distributionMap; int spacingIndexToY(LayerGeometryProvider *v, int i) const; double yToSpacingIndex(LayerGeometryProvider *v, int y) const; void finish(RegionModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/RenderTimer.h0000644000000000000000000000620213111512442017776 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef RENDER_TIMER_H #define RENDER_TIMER_H #include class RenderTimer { public: enum Type { /// A normal rendering operation with normal responsiveness demands FastRender, /// An operation that the user might accept being slower SlowRender, /// An operation that should always complete, i.e. as if there /// were no RenderTimer in use, but without having to change /// client code structurally NoTimeout }; /** * Create a new RenderTimer and start timing. Make one of these * before rendering, and then call outOfTime() regularly during * rendering. If outOfTime() returns true, abandon rendering! and * schedule the rest for after some user responsiveness has * happened. */ RenderTimer(Type t) : m_start(std::chrono::steady_clock::now()), m_haveLimits(true), m_minFraction(0.1), m_softLimit(0.1), m_hardLimit(0.2), m_softLimitOverridden(false) { if (t == NoTimeout) { m_haveLimits = false; } else if (t == SlowRender) { m_softLimit = 0.2; m_hardLimit = 0.4; } } /** * Return true if we have run out of time and should suspend * rendering and handle user events instead. Call this regularly * during rendering work: fractionComplete should be an estimate * of how much of the work has been done as of this call, as a * number between 0.0 (none of it) and 1.0 (all of it). */ bool outOfTime(double fractionComplete) { if (!m_haveLimits || fractionComplete < m_minFraction) { return false; } auto t = std::chrono::steady_clock::now(); double elapsed = std::chrono::duration(t - m_start).count(); if (elapsed > m_hardLimit) { return true; } else if (!m_softLimitOverridden && elapsed > m_softLimit) { if (fractionComplete > 0.6) { // If we're significantly more than half way by the // time we reach the soft limit, ignore it (though // always respect the hard limit, above). Otherwise // respect the soft limit and report out of time now. m_softLimitOverridden = true; } else { return true; } } return false; } double secondsPerItem(int itemsRendered) const { if (itemsRendered == 0) return 0.0; auto t = std::chrono::steady_clock::now(); double elapsed = std::chrono::duration(t - m_start).count(); return elapsed / itemsRendered; } private: std::chrono::time_point m_start; bool m_haveLimits; double m_minFraction; // proportion, 0.0 -> 1.0 double m_softLimit; // seconds double m_hardLimit; // seconds bool m_softLimitOverridden; }; #endif sonic-visualiser-3.0.3/svgui/layer/ScrollableImageCache.cpp0000644000000000000000000001441113111512442022063 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "ScrollableImageCache.h" #include "base/HitCount.h" #include using namespace std; //#define DEBUG_SCROLLABLE_IMAGE_CACHE 1 void ScrollableImageCache::scrollTo(const LayerGeometryProvider *v, sv_frame_t newStartFrame) { static HitCount count("ScrollableImageCache: scrolling"); int dx = (v->getXForFrame(m_startFrame) - v->getXForFrame(newStartFrame)); #ifdef DEBUG_SCROLLABLE_IMAGE_CACHE cerr << "ScrollableImageCache::scrollTo: start frame " << m_startFrame << " -> " << newStartFrame << ", dx = " << dx << endl; #endif if (m_startFrame == newStartFrame) { // haven't moved count.hit(); return; } m_startFrame = newStartFrame; if (!isValid()) { count.miss(); return; } int w = m_image.width(); if (dx == 0) { // haven't moved visibly (even though start frame may have changed) count.hit(); return; } if (dx <= -w || dx >= w) { // scrolled entirely off invalidate(); count.miss(); return; } count.partial(); // dx is in range, cache is scrollable int dxp = dx; if (dxp < 0) dxp = -dxp; int copylen = (w - dxp) * int(sizeof(QRgb)); for (int y = 0; y < m_image.height(); ++y) { QRgb *line = (QRgb *)m_image.scanLine(y); if (dx < 0) { memmove(line, line + dxp, copylen); } else { memmove(line + dxp, line, copylen); } } // update valid area int px = m_validLeft; int pw = m_validWidth; px += dx; if (dx < 0) { // we scrolled left if (px < 0) { pw += px; px = 0; if (pw < 0) { pw = 0; } } } else { // we scrolled right if (px + pw > w) { pw = w - px; if (pw < 0) { pw = 0; } } } m_validLeft = px; m_validWidth = pw; } void ScrollableImageCache::adjustToTouchValidArea(int &left, int &width, bool &isLeftOfValidArea) const { #ifdef DEBUG_SCROLLABLE_IMAGE_CACHE cerr << "ScrollableImageCache::adjustToTouchValidArea: left " << left << ", width " << width << endl; cerr << "ScrollableImageCache: my left " << m_validLeft << ", width " << m_validWidth << " so right " << (m_validLeft + m_validWidth) << endl; #endif if (left < m_validLeft) { isLeftOfValidArea = true; if (left + width <= m_validLeft + m_validWidth) { width = m_validLeft - left; } #ifdef DEBUG_SCROLLABLE_IMAGE_CACHE cerr << "ScrollableImageCache: we're left of valid area, adjusted width to " << width << endl; #endif } else { isLeftOfValidArea = false; width = left + width - (m_validLeft + m_validWidth); left = m_validLeft + m_validWidth; if (width < 0) width = 0; #ifdef DEBUG_SCROLLABLE_IMAGE_CACHE cerr << "ScrollableImageCache: we're right of valid area, adjusted left to " << left << ", width to " << width << endl; #endif } } void ScrollableImageCache::drawImage(int left, int width, QImage image, int imageLeft, int imageWidth) { if (image.height() != m_image.height()) { cerr << "ScrollableImageCache::drawImage: ERROR: Supplied image height " << image.height() << " does not match cache height " << m_image.height() << endl; throw std::logic_error("Image height must match cache height in ScrollableImageCache::drawImage"); } if (left < 0 || width < 0 || left + width > m_image.width()) { cerr << "ScrollableImageCache::drawImage: ERROR: Target area (left = " << left << ", width = " << width << ", so right = " << left + width << ") out of bounds for cache of width " << m_image.width() << endl; throw std::logic_error("Target area out of bounds in ScrollableImageCache::drawImage"); } if (imageLeft < 0 || imageWidth < 0 || imageLeft + imageWidth > image.width()) { cerr << "ScrollableImageCache::drawImage: ERROR: Source area (left = " << imageLeft << ", width = " << imageWidth << ", so right = " << imageLeft + imageWidth << ") out of bounds for image of " << "width " << image.width() << endl; throw std::logic_error("Source area out of bounds in ScrollableImageCache::drawImage"); } QPainter painter(&m_image); painter.drawImage(QRect(left, 0, width, m_image.height()), image, QRect(imageLeft, 0, imageWidth, image.height())); painter.end(); if (!isValid()) { m_validLeft = left; m_validWidth = width; return; } if (left < m_validLeft) { if (left + width > m_validLeft + m_validWidth) { // new image completely contains the old valid area -- // use the new area as is m_validLeft = left; m_validWidth = width; } else if (left + width < m_validLeft) { // new image completely off left of old valid area -- // we can't extend the valid area because the bit in // between is not valid, so must use the new area only m_validLeft = left; m_validWidth = width; } else { // new image overlaps old valid area on left side -- // use new left edge, and extend width to existing // right edge m_validWidth = (m_validLeft + m_validWidth) - left; m_validLeft = left; } } else { if (left > m_validLeft + m_validWidth) { // new image completely off right of old valid area -- // we can't extend the valid area because the bit in // between is not valid, so must use the new area only m_validLeft = left; m_validWidth = width; } else if (left + width > m_validLeft + m_validWidth) { // new image overlaps old valid area on right side -- // use existing left edge, and extend width to new // right edge m_validWidth = (left + width) - m_validLeft; // (m_validLeft unchanged) } else { // new image completely contained within old valid // area -- leave the old area unchanged } } } sonic-visualiser-3.0.3/svgui/layer/ScrollableImageCache.h0000644000000000000000000001066013111512442021532 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SCROLLABLE_IMAGE_CACHE_H #define SCROLLABLE_IMAGE_CACHE_H #include "base/BaseTypes.h" #include "LayerGeometryProvider.h" #include #include #include /** * A cached image for a view that scrolls horizontally, such as a * spectrogram. The cache object holds an image, reports the size of * the image (likely the same as the underlying view, but it's the * caller's responsibility to set the size appropriately), can scroll * the image, and can report and update which contiguous horizontal * range of the image is valid. * * The only way to *update* the valid area in a cache is to draw to it * using the drawImage call. */ class ScrollableImageCache { public: ScrollableImageCache() : m_validLeft(0), m_validWidth(0), m_startFrame(0), m_zoomLevel(0) {} void invalidate() { m_validWidth = 0; } bool isValid() const { return m_validWidth > 0; } QSize getSize() const { return m_image.size(); } /** * Set the size of the cache. If the new size differs from the * current size, the cache is invalidated. */ void resize(QSize newSize) { if (getSize() != newSize) { m_image = QImage(newSize, QImage::Format_ARGB32_Premultiplied); invalidate(); } } int getValidLeft() const { return m_validLeft; } int getValidWidth() const { return m_validWidth; } int getValidRight() const { return m_validLeft + m_validWidth; } QRect getValidArea() const { return QRect(m_validLeft, 0, m_validWidth, m_image.height()); } int getZoomLevel() const { return m_zoomLevel; } /** * Set the zoom level. If the new zoom level differs from the * current one, the cache is invalidated. (Determining whether to * invalidate the cache here is the only thing the zoom level is * used for.) */ void setZoomLevel(int zoom) { if (m_zoomLevel != zoom) { m_zoomLevel = zoom; invalidate(); } } sv_frame_t getStartFrame() const { return m_startFrame; } /** * Set the start frame. If the new start frame differs from the * current one, the cache is invalidated. To scroll, i.e. to set * the start frame while retaining cache validity where possible, * use scrollTo() instead. */ void setStartFrame(sv_frame_t frame) { if (m_startFrame != frame) { m_startFrame = frame; invalidate(); } } const QImage &getImage() const { return m_image; } /** * Set the new start frame for the cache, according to the * geometry of the supplied LayerGeometryProvider, if possible * also moving along any existing valid data within the cache so * that it continues to be valid for the new start frame. */ void scrollTo(const LayerGeometryProvider *v, sv_frame_t newStartFrame); /** * Take a left coordinate and width describing a region, and * adjust them so that they are contiguous with the cache valid * region and so that the union of the adjusted region with the * cache valid region contains the supplied region. Does not * modify anything about the cache, only about the arguments. */ void adjustToTouchValidArea(int &left, int &width, bool &isLeftOfValidArea) const; /** * Draw from an image onto the cache. The supplied image must have * the same height as the cache and the full height is always * drawn. The left and width parameters determine the target * region of the cache, the imageLeft and imageWidth parameters * the source region of the image. */ void drawImage(int left, int width, QImage image, int imageLeft, int imageWidth); private: QImage m_image; int m_validLeft; int m_validWidth; sv_frame_t m_startFrame; int m_zoomLevel; }; #endif sonic-visualiser-3.0.3/svgui/layer/ScrollableMagRangeCache.cpp0000644000000000000000000000651513111512442022530 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "ScrollableMagRangeCache.h" #include "base/HitCount.h" #include using namespace std; //#define DEBUG_SCROLLABLE_MAG_RANGE_CACHE 1 void ScrollableMagRangeCache::scrollTo(const LayerGeometryProvider *v, sv_frame_t newStartFrame) { static HitCount count("ScrollableMagRangeCache: scrolling"); int dx = (v->getXForFrame(m_startFrame) - v->getXForFrame(newStartFrame)); #ifdef DEBUG_SCROLLABLE_MAG_RANGE_CACHE cerr << "ScrollableMagRangeCache::scrollTo: start frame " << m_startFrame << " -> " << newStartFrame << ", dx = " << dx << endl; #endif if (m_startFrame == newStartFrame) { // haven't moved count.hit(); return; } m_startFrame = newStartFrame; if (dx == 0) { // haven't moved visibly (even though start frame may have changed) count.hit(); return; } int w = int(m_ranges.size()); if (dx <= -w || dx >= w) { // scrolled entirely off invalidate(); count.miss(); return; } count.partial(); // dx is in range, cache is scrollable if (dx < 0) { // The new start frame is to the left of the old start // frame. We need to add some empty ranges at the left (start) // end and clip the right end. Assemble -dx new values, then // w+dx old values starting at index 0. auto newRanges = vector(-dx); newRanges.insert(newRanges.end(), m_ranges.begin(), m_ranges.begin() + (w + dx)); m_ranges = newRanges; } else { // The new start frame is to the right of the old start // frame. We want to clip the left (start) end and add some // empty ranges at the right end. Assemble w-dx old values // starting at index dx, then dx new values. auto newRanges = vector(dx); newRanges.insert(newRanges.begin(), m_ranges.begin() + dx, m_ranges.end()); m_ranges = newRanges; } #ifdef DEBUG_SCROLLABLE_MAG_RANGE_CACHE cerr << "maxes (" << m_ranges.size() << ") now: "; for (int i = 0; in_range_for(m_ranges, i); ++i) { cerr << m_ranges[i].getMax() << " "; } cerr << endl; #endif } MagnitudeRange ScrollableMagRangeCache::getRange(int x, int count) const { MagnitudeRange r; #ifdef DEBUG_SCROLLABLE_MAG_RANGE_CACHE cerr << "ScrollableMagRangeCache::getRange(" << x << ", " << count << ")" << endl; #endif for (int i = 0; i < count; ++i) { r.sample(m_ranges.at(x + i)); } return r; } void ScrollableMagRangeCache::sampleColumn(int column, const MagnitudeRange &r) { if (!in_range_for(m_ranges, column)) { cerr << "ERROR: ScrollableMagRangeCache::sampleColumn: column " << column << " is out of range for cache of width " << m_ranges.size() << " (with start frame " << m_startFrame << ")" << endl; throw logic_error("column out of range"); } else { m_ranges[column].sample(r); } } sonic-visualiser-3.0.3/svgui/layer/ScrollableMagRangeCache.h0000644000000000000000000000774613111512442022204 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SCROLLABLE_MAG_RANGE_CACHE_H #define SCROLLABLE_MAG_RANGE_CACHE_H #include "base/BaseTypes.h" #include "base/MagnitudeRange.h" #include "LayerGeometryProvider.h" /** * A cached set of magnitude range records for a view that scrolls * horizontally, such as a spectrogram. The cache object holds a * magnitude range per column of the view, can report width (likely * the same as the underlying view, but it's the caller's * responsibility to set the size appropriately), can scroll the set * of ranges, and can report and update which columns have had a range * specified. * * The only way to *update* the valid area in a cache is to update the * magnitude range for a column using the sampleColumn call. */ class ScrollableMagRangeCache { public: ScrollableMagRangeCache() : m_startFrame(0), m_zoomLevel(0) {} void invalidate() { m_ranges = std::vector(m_ranges.size()); } int getWidth() const { return int(m_ranges.size()); } /** * Set the width of the cache in columns. If the new size differs * from the current size, the cache is invalidated. */ void resize(int newWidth) { if (getWidth() != newWidth) { m_ranges = std::vector(newWidth); } } int getZoomLevel() const { return m_zoomLevel; } /** * Set the zoom level. If the new zoom level differs from the * current one, the cache is invalidated. (Determining whether to * invalidate the cache here is the only thing the zoom level is * used for.) */ void setZoomLevel(int zoom) { if (m_zoomLevel != zoom) { m_zoomLevel = zoom; invalidate(); } } sv_frame_t getStartFrame() const { return m_startFrame; } /** * Set the start frame. If the new start frame differs from the * current one, the cache is invalidated. To scroll, i.e. to set * the start frame while retaining cache validity where possible, * use scrollTo() instead. */ void setStartFrame(sv_frame_t frame) { if (m_startFrame != frame) { m_startFrame = frame; invalidate(); } } bool isColumnSet(int column) const { return in_range_for(m_ranges, column) && m_ranges.at(column).isSet(); } bool areColumnsSet(int x, int count) const { for (int i = 0; i < count; ++i) { if (!isColumnSet(x + i)) return false; } return true; } /** * Get the magnitude range for a single column. */ MagnitudeRange getRange(int column) const { return m_ranges.at(column); } /** * Get the magnitude range for a range of columns. */ MagnitudeRange getRange(int x, int count) const; /** * Set the new start frame for the cache, according to the * geometry of the supplied LayerGeometryProvider, if possible * also moving along any existing valid data within the cache so * that it continues to be valid for the new start frame. */ void scrollTo(const LayerGeometryProvider *v, sv_frame_t newStartFrame); /** * Update a column in the cache, by column index. (Column zero is * the first column in the cache, it has nothing to do with any * underlying model that the cache may be used with.) */ void sampleColumn(int column, const MagnitudeRange &r); private: std::vector m_ranges; sv_frame_t m_startFrame; int m_zoomLevel; }; #endif sonic-visualiser-3.0.3/svgui/layer/ShowLayerCommand.h0000644000000000000000000000226213111512442020774 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SHOW_LAYER_COMMAND_H_ #define _SHOW_LAYER_COMMAND_H_ #include "base/Command.h" class ShowLayerCommand : public Command { public: ShowLayerCommand(View *view, Layer *layer, bool show, QString commandName) : m_view(view), m_layer(layer), m_show(show), m_name(commandName) { } void execute() { m_layer->showLayer(m_view, m_show); } void unexecute() { m_layer->showLayer(m_view, !m_show); } QString getName() const { return m_name; } protected: View *m_view; Layer *m_layer; bool m_show; QString m_name; }; #endif sonic-visualiser-3.0.3/svgui/layer/SingleColourLayer.cpp0000644000000000000000000002002613111512442021513 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SingleColourLayer.h" #include "ColourDatabase.h" #include "view/View.h" #include #include #include //#define DEBUG_COLOUR_SELECTION 1 SingleColourLayer::ColourRefCount SingleColourLayer::m_colourRefCount; SingleColourLayer::SingleColourLayer() : m_colour(0), m_colourExplicitlySet(false), m_defaultColourSet(false) { // Reference current colour because setDefaulColourFor // will unreference it before (possibly) changing it. refColor(); setDefaultColourFor(0); } SingleColourLayer::~SingleColourLayer() { unrefColor(); } QPixmap SingleColourLayer::getLayerPresentationPixmap(QSize size) const { return ColourDatabase::getInstance()->getExamplePixmap(m_colour, size); } bool SingleColourLayer::hasLightBackground() const { bool dark = ColourDatabase::getInstance()->useDarkBackground(m_colour); return !dark; } Layer::PropertyList SingleColourLayer::getProperties() const { PropertyList list = Layer::getProperties(); list.push_back("Colour"); return list; } QString SingleColourLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Colour") return tr("Colour"); return ""; } Layer::PropertyType SingleColourLayer::getPropertyType(const PropertyName &name) const { if (name == "Colour") return ColourProperty; return InvalidProperty; } QString SingleColourLayer::getPropertyGroupName(const PropertyName &) const { return QString(); } int SingleColourLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Colour") { ColourDatabase::getInstance()->getColourPropertyRange(min, max); *deflt = 0; //!!! val = m_colour; } else { val = Layer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SingleColourLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour") { ColourDatabase *db = ColourDatabase::getInstance(); if (value >= 0 && value < db->getColourCount()) { return db->getColourName(value); } } return tr(""); } RangeMapper * SingleColourLayer::getNewPropertyRangeMapper(const PropertyName &) const { return 0; } void SingleColourLayer::setProperty(const PropertyName &name, int value) { if (name == "Colour") { setBaseColour(value); } } void SingleColourLayer::setDefaultColourFor(LayerGeometryProvider *v) { #ifdef DEBUG_COLOUR_SELECTION SVDEBUG << "SingleColourLayer::setDefaultColourFor: m_colourExplicitlySet = " << m_colourExplicitlySet << ", m_defaultColourSet " << m_defaultColourSet << endl; #endif if (m_colourExplicitlySet || m_defaultColourSet) return; if (v) m_defaultColourSet = true; // v==0 case doesn't really count bool dark = false; if (v) { dark = !v->hasLightBackground(); } else { QColor bg = QApplication::palette().color(QPalette::Window); if (bg.red() + bg.green() + bg.blue() < 384) dark = true; } ColourDatabase *cdb = ColourDatabase::getInstance(); int hint = -1; bool impose = false; if (v) { // We don't want to call this if !v because that probably // means we're being called from the constructor, and this is // a virtual function hint = getDefaultColourHint(dark, impose); #ifdef DEBUG_COLOUR_SELECTION cerr << "hint = " << hint << ", impose = " << impose << endl; #endif } else { #ifdef DEBUG_COLOUR_SELECTION cerr << "(from ctor)" << endl; #endif } if (hint >= 0 && impose) { setBaseColour(hint); return; } unrefColor(); int bestCount = 0, bestColour = -1; for (int i = 0; i < cdb->getColourCount(); ++i) { int index = i; if (hint > 0) index = (index + hint) % cdb->getColourCount(); if (cdb->useDarkBackground(index) != dark) continue; int count = 0; if (m_colourRefCount.find(index) != m_colourRefCount.end()) { count = m_colourRefCount[index]; } #ifdef DEBUG_COLOUR_SELECTION cerr << "index = " << index << ", count = " << count; #endif if (bestColour < 0 || count < bestCount) { bestColour = index; bestCount = count; #ifdef DEBUG_COLOUR_SELECTION cerr << " *"; #endif } #ifdef DEBUG_COLOUR_SELECTION cerr << endl; #endif } if (bestColour < 0) m_colour = 0; else m_colour = bestColour; refColor(); } void SingleColourLayer::setBaseColour(int colour) { m_colourExplicitlySet = true; if (m_colour == colour) return; refColor(); m_colour = colour; unrefColor(); flagBaseColourChanged(); emit layerParametersChanged(); } int SingleColourLayer::getBaseColour() const { return m_colour; } QColor SingleColourLayer::getBaseQColor() const { return ColourDatabase::getInstance()->getColour(m_colour); } QColor SingleColourLayer::getBackgroundQColor(LayerGeometryProvider *v) const { return v->getBackground(); } QColor SingleColourLayer::getForegroundQColor(LayerGeometryProvider *v) const { return v->getForeground(); } std::vector SingleColourLayer::getPartialShades(LayerGeometryProvider *v) const { std::vector s; QColor base = getBaseQColor(); QColor bg = getBackgroundQColor(v); for (int i = 0; i < 3; ++i) { int red = base.red() + ((bg.red() - base.red()) * (i + 1)) / 4; int green = base.green() + ((bg.green() - base.green()) * (i + 1)) / 4; int blue = base.blue() + ((bg.blue() - base.blue()) * (i + 1)) / 4; s.push_back(QColor(red, green, blue)); } return s; } void SingleColourLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; QString colourName, colourSpec, darkbg; ColourDatabase::getInstance()->getStringValues (m_colour, colourName, colourSpec, darkbg); s += QString("colourName=\"%1\" " "colour=\"%2\" " "darkBackground=\"%3\" ") .arg(colourName) .arg(colourSpec) .arg(darkbg); Layer::toXml(stream, indent, extraAttributes + " " + s); } void SingleColourLayer::setProperties(const QXmlAttributes &attributes) { QString colourName = attributes.value("colourName"); QString colourSpec = attributes.value("colour"); QString darkbg = attributes.value("darkBackground"); int colour = ColourDatabase::getInstance()->putStringValues (colourName, colourSpec, darkbg); if (colour == -1) return; m_colourExplicitlySet = true; if (m_colour != colour) { #ifdef DEBUG_COLOUR_SELECTION SVDEBUG << "SingleColourLayer::setProperties: changing colour from " << m_colour << " to " << colour << endl; #endif unrefColor(); m_colour = colour; refColor(); flagBaseColourChanged(); } } void SingleColourLayer::refColor() { if (m_colourRefCount.find(m_colour) == m_colourRefCount.end()) { m_colourRefCount[m_colour] = 1; } else { m_colourRefCount[m_colour]++; } } void SingleColourLayer::unrefColor() { if (m_colourRefCount.find(m_colour) != m_colourRefCount.end() && m_colourRefCount[m_colour] > 0) { m_colourRefCount[m_colour]--; } } sonic-visualiser-3.0.3/svgui/layer/SingleColourLayer.h0000644000000000000000000000630613111512442021165 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SINGLE_COLOUR_LAYER_H_ #define _SINGLE_COLOUR_LAYER_H_ #include "Layer.h" #include #include #include class SingleColourLayer : public Layer { Q_OBJECT public: /** * Set the colour used to draw primary items in the layer. The * colour value is a colour database index as returned by * ColourDatabase::getColourIndex(). */ virtual void setBaseColour(int); /** * Retrieve the current primary drawing colour, as a * ColourDatabase index value. */ virtual int getBaseColour() const; /** * Return true if the layer currently has a dark colour on a light * background, false if it has a light colour on a dark * background. */ virtual bool hasLightBackground() const; /** * Implements Layer::getLayerColourSignificance() */ virtual ColourSignificance getLayerColourSignificance() const { return ColourDistinguishes; } virtual QPixmap getLayerPresentationPixmap(QSize size) const; virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual void setProperties(const QXmlAttributes &attributes); virtual void setDefaultColourFor(LayerGeometryProvider *v); protected: SingleColourLayer(); virtual ~SingleColourLayer(); virtual QColor getBaseQColor() const; virtual QColor getBackgroundQColor(LayerGeometryProvider *v) const; virtual QColor getForegroundQColor(LayerGeometryProvider *v) const; std::vector getPartialShades(LayerGeometryProvider *v) const; virtual void flagBaseColourChanged() { } virtual int getDefaultColourHint(bool /* darkBackground */, bool & /* impose */) { return -1; } typedef std::map ColourRefCount; static ColourRefCount m_colourRefCount; int m_colour; bool m_colourExplicitlySet; bool m_defaultColourSet; private: void refColor(); void unrefColor(); }; #endif sonic-visualiser-3.0.3/svgui/layer/SliceLayer.cpp0000644000000000000000000006454113111512442020157 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SliceLayer.h" #include "view/View.h" #include "base/AudioLevel.h" #include "base/RangeMapper.h" #include "base/RealTime.h" #include "ColourMapper.h" #include "ColourDatabase.h" #include "PaintAssistant.h" #include #include #include SliceLayer::SliceLayer() : m_sliceableModel(0), m_colourMap(0), m_energyScale(dBScale), m_samplingMode(SampleMean), m_plotStyle(PlotLines), m_binScale(LinearBins), m_normalize(false), m_threshold(0.0), m_initialThreshold(0.0), m_gain(1.0), m_minbin(0), m_maxbin(0), m_currentf0(0), m_currentf1(0) { } SliceLayer::~SliceLayer() { } void SliceLayer::setSliceableModel(const Model *model) { const DenseThreeDimensionalModel *sliceable = dynamic_cast(model); if (model && !sliceable) { cerr << "WARNING: SliceLayer::setSliceableModel(" << model << "): model is not a DenseThreeDimensionalModel" << endl; } if (m_sliceableModel == sliceable) return; m_sliceableModel = sliceable; if (!m_sliceableModel) return; connectSignals(m_sliceableModel); m_minbin = 0; m_maxbin = m_sliceableModel->getHeight(); emit modelReplaced(); emit layerParametersChanged(); } void SliceLayer::sliceableModelReplaced(const Model *orig, const Model *replacement) { SVDEBUG << "SliceLayer::sliceableModelReplaced(" << orig << ", " << replacement << ")" << endl; if (orig == m_sliceableModel) { setSliceableModel (dynamic_cast(replacement)); } } void SliceLayer::modelAboutToBeDeleted(Model *m) { SVDEBUG << "SliceLayer::modelAboutToBeDeleted(" << m << ")" << endl; if (m == m_sliceableModel) { setSliceableModel(0); } } QString SliceLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &p) const { int minbin, maxbin, range; return getFeatureDescriptionAux(v, p, true, minbin, maxbin, range); } QString SliceLayer::getFeatureDescriptionAux(LayerGeometryProvider *v, QPoint &p, bool includeBinDescription, int &minbin, int &maxbin, int &range) const { minbin = 0; maxbin = 0; if (!m_sliceableModel) return ""; minbin = int(getBinForX(v, p.x())); maxbin = int(getBinForX(v, p.x() + 1)); int mh = m_sliceableModel->getHeight(); if (minbin >= mh) minbin = mh - 1; if (maxbin >= mh) maxbin = mh - 1; if (minbin < 0) minbin = 0; if (maxbin < 0) maxbin = 0; sv_samplerate_t sampleRate = m_sliceableModel->getSampleRate(); sv_frame_t f0 = m_currentf0; sv_frame_t f1 = m_currentf1; RealTime rt0 = RealTime::frame2RealTime(f0, sampleRate); RealTime rt1 = RealTime::frame2RealTime(f1, sampleRate); range = int(f1 - f0 + 1); QString rtrangestr = QString("%1 s").arg((rt1 - rt0).toText().c_str()); if (includeBinDescription) { int i0 = minbin - m_minbin; int i1 = maxbin - m_minbin; float minvalue = 0.0; if (in_range_for(m_values, i0)) minvalue = m_values[i0]; float maxvalue = minvalue; if (in_range_for(m_values, i1)) maxvalue = m_values[i1]; if (minvalue > maxvalue) std::swap(minvalue, maxvalue); QString binstr; if (maxbin != minbin) { binstr = tr("%1 - %2").arg(minbin+1).arg(maxbin+1); } else { binstr = QString("%1").arg(minbin+1); } QString valuestr; if (maxvalue != minvalue) { valuestr = tr("%1 - %2").arg(minvalue).arg(maxvalue); } else { valuestr = QString("%1").arg(minvalue); } QString description = tr("Time:\t%1 - %2\nRange:\t%3 samples (%4)\nBin:\t%5\n%6 value:\t%7") .arg(QString::fromStdString(rt0.toText(true))) .arg(QString::fromStdString(rt1.toText(true))) .arg(range) .arg(rtrangestr) .arg(binstr) .arg(m_samplingMode == NearestSample ? tr("First") : m_samplingMode == SampleMean ? tr("Mean") : tr("Peak")) .arg(valuestr); return description; } else { QString description = tr("Time:\t%1 - %2\nRange:\t%3 samples (%4)") .arg(QString::fromStdString(rt0.toText(true))) .arg(QString::fromStdString(rt1.toText(true))) .arg(range) .arg(rtrangestr); return description; } } double SliceLayer::getXForBin(const LayerGeometryProvider *v, double bin) const { double x = 0; bin -= m_minbin; if (bin < 0) bin = 0; double count = m_maxbin - m_minbin; if (count < 0) count = 0; int pw = v->getPaintWidth(); int origin = m_xorigins[v->getId()]; int w = pw - origin; if (w < 1) w = 1; switch (m_binScale) { case LinearBins: x = (w * bin) / count; break; case LogBins: x = (w * log10(bin + 1)) / log10(count + 1); break; case InvertedLogBins: x = w - (w * log10(count - bin - 1)) / log10(count); break; } return x + origin; } double SliceLayer::getBinForX(const LayerGeometryProvider *v, double x) const { double bin = 0; double count = m_maxbin - m_minbin; if (count < 0) count = 0; int pw = v->getPaintWidth(); int origin = m_xorigins[v->getId()]; int w = pw - origin; if (w < 1) w = 1; x = x - origin; if (x < 0) x = 0; double eps = 1e-10; switch (m_binScale) { case LinearBins: bin = (x * count) / w + eps; break; case LogBins: bin = pow(10.0, (x * log10(count + 1)) / w) - 1.0 + eps; break; case InvertedLogBins: bin = count + 1 - pow(10.0, (log10(count) * (w - x)) / double(w)) + eps; break; } return bin + m_minbin; } double SliceLayer::getYForValue(const LayerGeometryProvider *v, double value, double &norm) const { norm = 0.0; if (m_yorigins.find(v->getId()) == m_yorigins.end()) return 0; value *= m_gain; int yorigin = m_yorigins[v->getId()]; int h = m_heights[v->getId()]; double thresh = getThresholdDb(); double y = 0.0; if (h <= 0) return y; switch (m_energyScale) { case dBScale: { double db = thresh; if (value > 0.0) db = 10.0 * log10(fabs(value)); if (db < thresh) db = thresh; norm = (db - thresh) / -thresh; y = yorigin - (double(h) * norm); break; } case MeterScale: y = AudioLevel::multiplier_to_preview(value, h); norm = double(y) / double(h); y = yorigin - y; break; case AbsoluteScale: value = fabs(value); // and fall through case LinearScale: default: norm = (value - m_threshold); if (norm < 0) norm = 0; y = yorigin - (double(h) * norm); break; } return y; } double SliceLayer::getValueForY(const LayerGeometryProvider *v, double y) const { double value = 0.0; if (m_yorigins.find(v->getId()) == m_yorigins.end()) return value; int yorigin = m_yorigins[v->getId()]; int h = m_heights[v->getId()]; double thresh = getThresholdDb(); if (h <= 0) return value; y = yorigin - y; switch (m_energyScale) { case dBScale: { double db = ((y / h) * -thresh) + thresh; value = pow(10.0, db/10.0); break; } case MeterScale: value = AudioLevel::preview_to_multiplier(int(lrint(y)), h); break; case LinearScale: case AbsoluteScale: default: value = y / h + m_threshold; } return value / m_gain; } void SliceLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_sliceableModel || !m_sliceableModel->isOK() || !m_sliceableModel->isReady()) return; paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); paint.setBrush(Qt::NoBrush); if (v->getViewManager() && v->getViewManager()->shouldShowScaleGuides()) { if (!m_scalePoints.empty()) { paint.setPen(QColor(240, 240, 240)); //!!! and dark background? for (int i = 0; i < (int)m_scalePoints.size(); ++i) { paint.drawLine(0, m_scalePoints[i], rect.width(), m_scalePoints[i]); } } } if (m_plotStyle == PlotBlocks) { // Must use actual zero-width pen, too slow otherwise paint.setPen(QPen(getBaseQColor(), 0)); } else { paint.setPen(PaintAssistant::scalePen(getBaseQColor())); } int xorigin = getVerticalScaleWidth(v, true, paint) + 1; m_xorigins[v->getId()] = xorigin; // for use in getFeatureDescription int yorigin = v->getPaintHeight() - 20 - paint.fontMetrics().height() - 7; int h = yorigin - paint.fontMetrics().height() - 8; m_yorigins[v->getId()] = yorigin; // for getYForValue etc m_heights[v->getId()] = h; if (h <= 0) return; QPainterPath path; int mh = m_sliceableModel->getHeight(); int bin0 = 0; if (m_maxbin > m_minbin) { mh = m_maxbin - m_minbin; bin0 = m_minbin; } int divisor = 0; m_values.clear(); for (int bin = 0; bin < mh; ++bin) { m_values.push_back(0.0); } sv_frame_t f0 = v->getCentreFrame(); int f0x = v->getXForFrame(f0); f0 = v->getFrameForX(f0x); sv_frame_t f1 = v->getFrameForX(f0x + 1); if (f1 > f0) --f1; // cerr << "centre frame " << v->getCentreFrame() << ", x " << f0x << ", f0 " << f0 << ", f1 " << f1 << endl; int res = m_sliceableModel->getResolution(); int col0 = int(f0 / res); int col1 = col0; if (m_samplingMode != NearestSample) col1 = int(f1 / res); f0 = col0 * res; f1 = (col1 + 1) * res - 1; // cerr << "resolution " << res << ", col0 " << col0 << ", col1 " << col1 << ", f0 " << f0 << ", f1 " << f1 << endl; m_currentf0 = f0; m_currentf1 = f1; BiasCurve curve; getBiasCurve(curve); int cs = int(curve.size()); for (int col = col0; col <= col1; ++col) { for (int bin = 0; bin < mh; ++bin) { float value = m_sliceableModel->getValueAt(col, bin0 + bin); if (bin < cs) value *= curve[bin]; if (m_samplingMode == SamplePeak) { if (value > m_values[bin]) m_values[bin] = value; } else { m_values[bin] += value; } } ++divisor; } float max = 0.0; for (int bin = 0; bin < mh; ++bin) { if (m_samplingMode == SampleMean && divisor > 0) { m_values[bin] /= float(divisor); } if (m_values[bin] > max) max = m_values[bin]; } if (max != 0.0 && m_normalize) { for (int bin = 0; bin < mh; ++bin) { m_values[bin] /= max; } } double nx = getXForBin(v, bin0); ColourMapper mapper(m_colourMap, 0, 1); for (int bin = 0; bin < mh; ++bin) { double x = nx; nx = getXForBin(v, bin + bin0 + 1); double value = m_values[bin]; double norm = 0.0; double y = getYForValue(v, value, norm); if (m_plotStyle == PlotLines) { if (bin == 0) { path.moveTo((x + nx) / 2, y); } else { path.lineTo((x + nx) / 2, y); } } else if (m_plotStyle == PlotSteps) { if (bin == 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } path.lineTo(nx, y); } else if (m_plotStyle == PlotBlocks) { path.moveTo(x, yorigin); path.lineTo(x, y); path.lineTo(nx, y); path.lineTo(nx, yorigin); path.lineTo(x, yorigin); } else if (m_plotStyle == PlotFilledBlocks) { paint.fillRect(QRectF(x, y, nx - x, yorigin - y), mapper.map(norm)); } } if (m_plotStyle != PlotFilledBlocks) { paint.drawPath(path); } paint.restore(); } int SliceLayer::getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &paint) const { int width; if (m_energyScale == LinearScale || m_energyScale == AbsoluteScale) { width = std::max(paint.fontMetrics().width("0.0") + 13, paint.fontMetrics().width("x10-10")); } else { width = std::max(paint.fontMetrics().width(tr("0dB")), paint.fontMetrics().width(tr("-Inf"))) + 13; } return width; } void SliceLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const { double thresh = m_threshold; if (m_energyScale != LinearScale && m_energyScale != AbsoluteScale) { thresh = AudioLevel::dB_to_multiplier(getThresholdDb()); } // int h = (rect.height() * 3) / 4; // int y = (rect.height() / 2) - (h / 2); int yorigin = v->getPaintHeight() - 20 - paint.fontMetrics().height() - 6; int h = yorigin - paint.fontMetrics().height() - 8; if (h < 0) return; QRect actual(rect.x(), rect.y() + yorigin - h, rect.width(), h); int mult = 1; PaintAssistant::paintVerticalLevelScale (paint, actual, thresh, 1.0 / m_gain, PaintAssistant::Scale(m_energyScale), mult, const_cast *>(&m_scalePoints)); if (mult != 1 && mult != 0) { int log = int(lrint(log10(mult))); QString a = tr("x10"); QString b = QString("%1").arg(-log); paint.drawText(3, 8 + paint.fontMetrics().ascent(), a); paint.drawText(3 + paint.fontMetrics().width(a), 3 + paint.fontMetrics().ascent(), b); } } Layer::PropertyList SliceLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Bin Scale"); list.push_back("Plot Type"); list.push_back("Scale"); list.push_back("Normalize"); list.push_back("Threshold"); list.push_back("Gain"); return list; } QString SliceLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Plot Type") return tr("Plot Type"); if (name == "Scale") return tr("Scale"); if (name == "Normalize") return tr("Normalize"); if (name == "Threshold") return tr("Threshold"); if (name == "Gain") return tr("Gain"); if (name == "Sampling Mode") return tr("Sampling Mode"); if (name == "Bin Scale") return tr("Bin Scale"); return SingleColourLayer::getPropertyLabel(name); } QString SliceLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Normalize") return "normalise"; return ""; } Layer::PropertyType SliceLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Normalize") return ToggleProperty; if (name == "Threshold") return RangeProperty; if (name == "Plot Type") return ValueProperty; if (name == "Scale") return ValueProperty; if (name == "Sampling Mode") return ValueProperty; if (name == "Bin Scale") return ValueProperty; if (name == "Colour" && m_plotStyle == PlotFilledBlocks) return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString SliceLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Scale" || name == "Normalize" || name == "Sampling Mode" || name == "Threshold" || name == "Gain") return tr("Scale"); if (name == "Plot Type" || name == "Bin Scale") return tr("Bins"); return SingleColourLayer::getPropertyGroupName(name); } int SliceLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = 0; // cerr << "gain is " << m_gain << ", mode is " << m_samplingMode << endl; val = int(lrint(log10(m_gain) * 20.0)); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Threshold") { *min = -80; *max = 0; *deflt = int(lrint(AudioLevel::multiplier_to_dB(m_initialThreshold))); if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = int(lrint(AudioLevel::multiplier_to_dB(m_threshold))); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Normalize") { val = (m_normalize ? 1 : 0); *deflt = 0; } else if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { *min = 0; *max = ColourMapper::getColourMapCount() - 1; *deflt = 0; val = m_colourMap; } else if (name == "Scale") { *min = 0; *max = 3; *deflt = (int)dBScale; val = (int)m_energyScale; } else if (name == "Sampling Mode") { *min = 0; *max = 2; *deflt = (int)SampleMean; val = (int)m_samplingMode; } else if (name == "Plot Type") { *min = 0; *max = 3; *deflt = (int)PlotSteps; val = (int)m_plotStyle; } else if (name == "Bin Scale") { *min = 0; *max = 2; *deflt = (int)LinearBins; // *max = 1; // I don't think we really do want to offer inverted log val = (int)m_binScale; } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SliceLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { return ColourMapper::getColourMapName(value); } if (name == "Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Meter"); case 2: return tr("Log"); case 3: return tr("Absolute"); } } if (name == "Sampling Mode") { switch (value) { default: case 0: return tr("Any"); case 1: return tr("Mean"); case 2: return tr("Peak"); } } if (name == "Plot Type") { switch (value) { default: case 0: return tr("Lines"); case 1: return tr("Steps"); case 2: return tr("Blocks"); case 3: return tr("Colours"); } } if (name == "Bin Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); case 2: return tr("Rev Log"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } RangeMapper * SliceLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } if (name == "Threshold") { return new LinearRangeMapper(-80, 0, -80, 0, tr("dB")); } return SingleColourLayer::getNewPropertyRangeMapper(name); } void SliceLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(powf(10, float(value)/20.0f)); } else if (name == "Threshold") { if (value == -80) setThreshold(0.0f); else setThreshold(float(AudioLevel::dB_to_multiplier(value))); } else if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { setFillColourMap(value); } else if (name == "Scale") { switch (value) { default: case 0: setEnergyScale(LinearScale); break; case 1: setEnergyScale(MeterScale); break; case 2: setEnergyScale(dBScale); break; case 3: setEnergyScale(AbsoluteScale); break; } } else if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else if (name == "Sampling Mode") { switch (value) { default: case 0: setSamplingMode(NearestSample); break; case 1: setSamplingMode(SampleMean); break; case 2: setSamplingMode(SamplePeak); break; } } else if (name == "Bin Scale") { switch (value) { default: case 0: setBinScale(LinearBins); break; case 1: setBinScale(LogBins); break; case 2: setBinScale(InvertedLogBins); break; } } else if (name == "Normalize") { setNormalize(value ? true : false); } else { SingleColourLayer::setProperty(name, value); } } void SliceLayer::setFillColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; emit layerParametersChanged(); } void SliceLayer::setEnergyScale(EnergyScale scale) { if (m_energyScale == scale) return; m_energyScale = scale; emit layerParametersChanged(); } void SliceLayer::setSamplingMode(SamplingMode mode) { if (m_samplingMode == mode) return; m_samplingMode = mode; emit layerParametersChanged(); } void SliceLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; bool colourTypeChanged = (style == PlotFilledBlocks || m_plotStyle == PlotFilledBlocks); m_plotStyle = style; if (colourTypeChanged) { emit layerParameterRangesChanged(); } emit layerParametersChanged(); } void SliceLayer::setBinScale(BinScale scale) { if (m_binScale == scale) return; m_binScale = scale; emit layerParametersChanged(); } void SliceLayer::setNormalize(bool n) { if (m_normalize == n) return; m_normalize = n; emit layerParametersChanged(); } void SliceLayer::setThreshold(float thresh) { if (m_threshold == thresh) return; m_threshold = thresh; emit layerParametersChanged(); } void SliceLayer::setGain(float gain) { if (m_gain == gain) return; m_gain = gain; emit layerParametersChanged(); } float SliceLayer::getThresholdDb() const { if (m_threshold == 0.0) return -80.f; float db = float(AudioLevel::multiplier_to_dB(m_threshold)); return db; } int SliceLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Blue" : "Blue")); } void SliceLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; s += QString("colourScheme=\"%1\" " "energyScale=\"%2\" " "samplingMode=\"%3\" " "plotStyle=\"%4\" " "binScale=\"%5\" " "gain=\"%6\" " "threshold=\"%7\" " "normalize=\"%8\" %9") .arg(m_colourMap) .arg(m_energyScale) .arg(m_samplingMode) .arg(m_plotStyle) .arg(m_binScale) .arg(m_gain) .arg(m_threshold) .arg(m_normalize ? "true" : "false") .arg(QString("minbin=\"%1\" " "maxbin=\"%2\"") .arg(m_minbin) .arg(m_maxbin)); SingleColourLayer::toXml(stream, indent, extraAttributes + " " + s); } void SliceLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false; SingleColourLayer::setProperties(attributes); EnergyScale scale = (EnergyScale) attributes.value("energyScale").toInt(&ok); if (ok) setEnergyScale(scale); SamplingMode mode = (SamplingMode) attributes.value("samplingMode").toInt(&ok); if (ok) setSamplingMode(mode); int colourMap = attributes.value("colourScheme").toInt(&ok); if (ok) setFillColourMap(colourMap); PlotStyle s = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(s); BinScale b = (BinScale) attributes.value("binScale").toInt(&ok); if (ok) setBinScale(b); float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); float threshold = attributes.value("threshold").toFloat(&ok); if (ok) setThreshold(threshold); bool normalize = (attributes.value("normalize").trimmed() == "true"); setNormalize(normalize); bool alsoOk = false; float min = attributes.value("minbin").toFloat(&ok); float max = attributes.value("maxbin").toFloat(&alsoOk); if (ok && alsoOk) setDisplayExtents(min, max); } bool SliceLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_sliceableModel) return false; min = 0; max = double(m_sliceableModel->getHeight()); logarithmic = (m_binScale == BinScale::LogBins); unit = ""; return true; } bool SliceLayer::getDisplayExtents(double &min, double &max) const { if (!m_sliceableModel) return false; double hmax = double(m_sliceableModel->getHeight()); min = m_minbin; max = m_maxbin; if (max <= min) { min = 0; max = hmax; } if (min < 0) min = 0; if (max > hmax) max = hmax; return true; } bool SliceLayer::setDisplayExtents(double min, double max) { if (!m_sliceableModel) return false; m_minbin = int(lrint(min)); m_maxbin = int(lrint(max)); emit layerParametersChanged(); return true; } int SliceLayer::getVerticalZoomSteps(int &defaultStep) const { if (!m_sliceableModel) return 0; defaultStep = 0; int h = m_sliceableModel->getHeight(); return h; } int SliceLayer::getCurrentVerticalZoomStep() const { if (!m_sliceableModel) return 0; double min, max; getDisplayExtents(min, max); return m_sliceableModel->getHeight() - int(lrint(max - min)); } void SliceLayer::setVerticalZoomStep(int step) { if (!m_sliceableModel) return; // SVDEBUG << "SliceLayer::setVerticalZoomStep(" < class SliceLayer : public SingleColourLayer { Q_OBJECT public: SliceLayer(); ~SliceLayer(); // virtual void setModel(const Model *model); // virtual const Model *getModel() const { return m_model; } virtual const Model *getModel() const { return 0; } void setSliceableModel(const Model *model); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourAndBackgroundSignificant; } virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void setProperties(const QXmlAttributes &); virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual bool setDisplayExtents(double min, double max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual bool hasTimeXAxis() const { return false; } virtual bool isLayerScrollable(const LayerGeometryProvider *) const { return false; } enum EnergyScale { LinearScale, MeterScale, dBScale, AbsoluteScale }; enum SamplingMode { NearestSample, SampleMean, SamplePeak }; enum PlotStyle { PlotLines, PlotSteps, PlotBlocks, PlotFilledBlocks }; enum BinScale { LinearBins, LogBins, InvertedLogBins }; void setFillColourMap(int); int getFillColourMap() const { return m_colourMap; } void setEnergyScale(EnergyScale); EnergyScale getEnergyScale() const { return m_energyScale; } void setSamplingMode(SamplingMode); SamplingMode getSamplingMode() const { return m_samplingMode; } void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } void setBinScale(BinScale scale); BinScale getBinScale() const { return m_binScale; } void setThreshold(float); float getThreshold() const { return m_threshold; } void setGain(float gain); float getGain() const; void setNormalize(bool n); bool getNormalize() const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; public slots: void sliceableModelReplaced(const Model *, const Model *); void modelAboutToBeDeleted(Model *); protected: virtual double getXForBin(const LayerGeometryProvider *, double bin) const; virtual double getBinForX(const LayerGeometryProvider *, double x) const; virtual double getYForValue(const LayerGeometryProvider *v, double value, double &norm) const; virtual double getValueForY(const LayerGeometryProvider *v, double y) const; virtual QString getFeatureDescriptionAux(LayerGeometryProvider *v, QPoint &, bool includeBinDescription, int &minbin, int &maxbin, int &range) const; // This curve may, of course, be flat -- the spectrum uses it for // normalizing the fft results by the fft size (with 1/(fftsize/2) // in each bin). typedef std::vector BiasCurve; virtual void getBiasCurve(BiasCurve &) const { return; } virtual float getThresholdDb() const; virtual int getDefaultColourHint(bool dark, bool &impose); const DenseThreeDimensionalModel *m_sliceableModel; int m_colourMap; EnergyScale m_energyScale; SamplingMode m_samplingMode; PlotStyle m_plotStyle; BinScale m_binScale; bool m_normalize; float m_threshold; float m_initialThreshold; float m_gain; int m_minbin; int m_maxbin; mutable std::vector m_scalePoints; mutable std::map m_xorigins; // LayerGeometryProvider id -> x mutable std::map m_yorigins; // LayerGeometryProvider id -> y mutable std::map m_heights; // LayerGeometryProvider id -> h mutable sv_frame_t m_currentf0; mutable sv_frame_t m_currentf1; mutable std::vector m_values; }; #endif sonic-visualiser-3.0.3/svgui/layer/SliceableLayer.h0000644000000000000000000000311213111512442020433 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SLICEABLE_LAYER_H_ #define _SLICEABLE_LAYER_H_ #include "Layer.h" /** * Base class for layers that can be sliced, that is, that contain * models appropriate for use in a SliceLayer. */ class SliceableLayer : public Layer { Q_OBJECT public: // Get a model that can be sliced, i.e. a // DenseThreeDimensionalModel. This may be the layer's usual // model, or it may be a model derived from it (e.g. FFTModel in a // spectrogram that was constructed from a DenseTimeValueModel). // The SliceableLayer retains ownership of the model, and will // emit sliceableModelReplaced if it is about to become invalid. virtual const Model *getSliceableModel() const = 0; signals: // Emitted when a model that was obtained through // getSliceableModel is about to be deleted. If replacement is // non-NULL, it may be used instead. void sliceableModelReplaced(const Model *modelToBeReplaced, const Model *replacement); }; #endif sonic-visualiser-3.0.3/svgui/layer/SpectrogramLayer.cpp0000644000000000000000000022224213111512442021400 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2009 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SpectrogramLayer.h" #include "view/View.h" #include "base/Profiler.h" #include "base/AudioLevel.h" #include "base/Window.h" #include "base/Pitch.h" #include "base/Preferences.h" #include "base/RangeMapper.h" #include "base/LogRange.h" #include "base/ColumnOp.h" #include "base/Strings.h" #include "base/StorageAdviser.h" #include "base/Exceptions.h" #include "widgets/CommandHistory.h" #include "data/model/Dense3DModelPeakCache.h" #include "ColourMapper.h" #include "PianoScale.h" #include "PaintAssistant.h" #include "Colour3DPlotRenderer.h" #include #include #include #include #include #include #include #include #include #include #include #include //#define DEBUG_SPECTROGRAM 1 //#define DEBUG_SPECTROGRAM_REPAINT 1 using namespace std; SpectrogramLayer::SpectrogramLayer(Configuration config) : m_model(0), m_channel(0), m_windowSize(1024), m_windowType(HanningWindow), m_windowHopLevel(2), m_gain(1.0), m_initialGain(1.0), m_threshold(1.0e-8f), m_initialThreshold(1.0e-8f), m_colourRotation(0), m_initialRotation(0), m_minFrequency(10), m_maxFrequency(8000), m_initialMaxFrequency(8000), m_colourScale(ColourScaleType::Log), m_colourScaleMultiple(1.0), m_colourMap(0), m_binScale(BinScale::Linear), m_binDisplay(BinDisplay::AllBins), m_normalization(ColumnNormalization::None), m_normalizeVisibleArea(false), m_lastEmittedZoomStep(-1), m_synchronous(false), m_haveDetailedScale(false), m_exiting(false), m_fftModel(0), m_wholeCache(0), m_peakCache(0), m_peakCacheDivisor(8) { QString colourConfigName = "spectrogram-colour"; int colourConfigDefault = int(ColourMapper::Green); if (config == FullRangeDb) { m_initialMaxFrequency = 0; setMaxFrequency(0); } else if (config == MelodicRange) { setWindowSize(8192); setWindowHopLevel(4); m_initialMaxFrequency = 1500; setMaxFrequency(1500); setMinFrequency(40); setColourScale(ColourScaleType::Linear); setColourMap(ColourMapper::Sunset); setBinScale(BinScale::Log); colourConfigName = "spectrogram-melodic-colour"; colourConfigDefault = int(ColourMapper::Sunset); // setGain(20); } else if (config == MelodicPeaks) { setWindowSize(4096); setWindowHopLevel(5); m_initialMaxFrequency = 2000; setMaxFrequency(2000); setMinFrequency(40); setBinScale(BinScale::Log); setColourScale(ColourScaleType::Linear); setBinDisplay(BinDisplay::PeakFrequencies); setNormalization(ColumnNormalization::Max1); colourConfigName = "spectrogram-melodic-colour"; colourConfigDefault = int(ColourMapper::Sunset); } QSettings settings; settings.beginGroup("Preferences"); setColourMap(settings.value(colourConfigName, colourConfigDefault).toInt()); settings.endGroup(); Preferences *prefs = Preferences::getInstance(); connect(prefs, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); setWindowType(prefs->getWindowType()); } SpectrogramLayer::~SpectrogramLayer() { invalidateRenderers(); deleteDerivedModels(); } void SpectrogramLayer::deleteDerivedModels() { if (m_fftModel) m_fftModel->aboutToDelete(); if (m_peakCache) m_peakCache->aboutToDelete(); if (m_wholeCache) m_wholeCache->aboutToDelete(); delete m_fftModel; delete m_peakCache; delete m_wholeCache; m_fftModel = 0; m_peakCache = 0; m_wholeCache = 0; } pair SpectrogramLayer::convertToColourScale(int value) { switch (value) { case 0: return { ColourScaleType::Linear, 1.0 }; case 1: return { ColourScaleType::Meter, 1.0 }; case 2: return { ColourScaleType::Log, 2.0 }; // dB^2 (i.e. log of power) case 3: return { ColourScaleType::Log, 1.0 }; // dB (of magnitude) case 4: return { ColourScaleType::Phase, 1.0 }; default: return { ColourScaleType::Linear, 1.0 }; } } int SpectrogramLayer::convertFromColourScale(ColourScaleType scale, double multiple) { switch (scale) { case ColourScaleType::Linear: return 0; case ColourScaleType::Meter: return 1; case ColourScaleType::Log: return (multiple > 1.5 ? 2 : 3); case ColourScaleType::Phase: return 4; case ColourScaleType::PlusMinusOne: case ColourScaleType::Absolute: default: return 0; } } std::pair SpectrogramLayer::convertToColumnNorm(int value) { switch (value) { default: case 0: return { ColumnNormalization::None, false }; case 1: return { ColumnNormalization::Max1, false }; case 2: return { ColumnNormalization::None, true }; // visible area case 3: return { ColumnNormalization::Hybrid, false }; } } int SpectrogramLayer::convertFromColumnNorm(ColumnNormalization norm, bool visible) { if (visible) return 2; switch (norm) { case ColumnNormalization::None: return 0; case ColumnNormalization::Max1: return 1; case ColumnNormalization::Hybrid: return 3; case ColumnNormalization::Sum1: case ColumnNormalization::Range01: default: return 0; } } void SpectrogramLayer::setModel(const DenseTimeValueModel *model) { // cerr << "SpectrogramLayer(" << this << "): setModel(" << model << ")" << endl; if (model == m_model) return; m_model = model; recreateFFTModel(); if (!m_model || !m_model->isOK()) return; connectSignals(m_model); connect(m_model, SIGNAL(modelChanged()), this, SLOT(cacheInvalid())); connect(m_model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(cacheInvalid(sv_frame_t, sv_frame_t))); emit modelReplaced(); } Layer::PropertyList SpectrogramLayer::getProperties() const { PropertyList list; list.push_back("Colour"); list.push_back("Colour Scale"); list.push_back("Window Size"); list.push_back("Window Increment"); list.push_back("Normalization"); list.push_back("Bin Display"); list.push_back("Threshold"); list.push_back("Gain"); list.push_back("Colour Rotation"); // list.push_back("Min Frequency"); // list.push_back("Max Frequency"); list.push_back("Frequency Scale"); return list; } QString SpectrogramLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Colour") return tr("Colour"); if (name == "Colour Scale") return tr("Colour Scale"); if (name == "Window Size") return tr("Window Size"); if (name == "Window Increment") return tr("Window Overlap"); if (name == "Normalization") return tr("Normalization"); if (name == "Bin Display") return tr("Bin Display"); if (name == "Threshold") return tr("Threshold"); if (name == "Gain") return tr("Gain"); if (name == "Colour Rotation") return tr("Colour Rotation"); if (name == "Min Frequency") return tr("Min Frequency"); if (name == "Max Frequency") return tr("Max Frequency"); if (name == "Frequency Scale") return tr("Frequency Scale"); return ""; } QString SpectrogramLayer::getPropertyIconName(const PropertyName &) const { return ""; } Layer::PropertyType SpectrogramLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Colour Rotation") return RangeProperty; if (name == "Threshold") return RangeProperty; if (name == "Colour") return ColourMapProperty; return ValueProperty; } QString SpectrogramLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Bin Display" || name == "Frequency Scale") return tr("Bins"); if (name == "Window Size" || name == "Window Increment") return tr("Window"); if (name == "Colour" || name == "Threshold" || name == "Colour Rotation") return tr("Colour"); if (name == "Normalization" || name == "Gain" || name == "Colour Scale") return tr("Scale"); return QString(); } int SpectrogramLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = int(lrint(log10(m_initialGain) * 20.0)); if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = int(lrint(log10(m_gain) * 20.0)); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Threshold") { *min = -81; *max = -1; *deflt = int(lrint(AudioLevel::multiplier_to_dB(m_initialThreshold))); if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = int(lrint(AudioLevel::multiplier_to_dB(m_threshold))); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Colour Rotation") { *min = 0; *max = 256; *deflt = m_initialRotation; val = m_colourRotation; } else if (name == "Colour Scale") { // linear, meter, db^2, db, phase *min = 0; *max = 4; *deflt = 2; val = convertFromColourScale(m_colourScale, m_colourScaleMultiple); } else if (name == "Colour") { *min = 0; *max = ColourMapper::getColourMapCount() - 1; *deflt = 0; val = m_colourMap; } else if (name == "Window Size") { *min = 0; *max = 10; *deflt = 5; val = 0; int ws = m_windowSize; while (ws > 32) { ws >>= 1; val ++; } } else if (name == "Window Increment") { *min = 0; *max = 5; *deflt = 2; val = m_windowHopLevel; } else if (name == "Min Frequency") { *min = 0; *max = 9; *deflt = 1; switch (m_minFrequency) { case 0: default: val = 0; break; case 10: val = 1; break; case 20: val = 2; break; case 40: val = 3; break; case 100: val = 4; break; case 250: val = 5; break; case 500: val = 6; break; case 1000: val = 7; break; case 4000: val = 8; break; case 10000: val = 9; break; } } else if (name == "Max Frequency") { *min = 0; *max = 9; *deflt = 6; switch (m_maxFrequency) { case 500: val = 0; break; case 1000: val = 1; break; case 1500: val = 2; break; case 2000: val = 3; break; case 4000: val = 4; break; case 6000: val = 5; break; case 8000: val = 6; break; case 12000: val = 7; break; case 16000: val = 8; break; default: val = 9; break; } } else if (name == "Frequency Scale") { *min = 0; *max = 1; *deflt = int(BinScale::Linear); val = (int)m_binScale; } else if (name == "Bin Display") { *min = 0; *max = 2; *deflt = int(BinDisplay::AllBins); val = (int)m_binDisplay; } else if (name == "Normalization") { *min = 0; *max = 3; *deflt = 0; val = convertFromColumnNorm(m_normalization, m_normalizeVisibleArea); } else { val = Layer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SpectrogramLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour") { return ColourMapper::getColourMapName(value); } if (name == "Colour Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Meter"); case 2: return tr("dBV^2"); case 3: return tr("dBV"); case 4: return tr("Phase"); } } if (name == "Normalization") { switch(value) { default: case 0: return tr("None"); case 1: return tr("Col"); case 2: return tr("View"); case 3: return tr("Hybrid"); } // return ""; // icon only } if (name == "Window Size") { return QString("%1").arg(32 << value); } if (name == "Window Increment") { switch (value) { default: case 0: return tr("None"); case 1: return tr("25 %"); case 2: return tr("50 %"); case 3: return tr("75 %"); case 4: return tr("87.5 %"); case 5: return tr("93.75 %"); } } if (name == "Min Frequency") { switch (value) { default: case 0: return tr("No min"); case 1: return tr("10 Hz"); case 2: return tr("20 Hz"); case 3: return tr("40 Hz"); case 4: return tr("100 Hz"); case 5: return tr("250 Hz"); case 6: return tr("500 Hz"); case 7: return tr("1 KHz"); case 8: return tr("4 KHz"); case 9: return tr("10 KHz"); } } if (name == "Max Frequency") { switch (value) { default: case 0: return tr("500 Hz"); case 1: return tr("1 KHz"); case 2: return tr("1.5 KHz"); case 3: return tr("2 KHz"); case 4: return tr("4 KHz"); case 5: return tr("6 KHz"); case 6: return tr("8 KHz"); case 7: return tr("12 KHz"); case 8: return tr("16 KHz"); case 9: return tr("No max"); } } if (name == "Frequency Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); } } if (name == "Bin Display") { switch (value) { default: case 0: return tr("All Bins"); case 1: return tr("Peak Bins"); case 2: return tr("Frequencies"); } } return tr(""); } QString SpectrogramLayer::getPropertyValueIconName(const PropertyName &name, int value) const { if (name == "Normalization") { switch(value) { default: case 0: return "normalise-none"; case 1: return "normalise-columns"; case 2: return "normalise"; case 3: return "normalise-hybrid"; } } return ""; } RangeMapper * SpectrogramLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } if (name == "Threshold") { return new LinearRangeMapper(-81, -1, -81, -1, tr("dB"), false, { { -81, Strings::minus_infinity } }); } return 0; } void SpectrogramLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(float(pow(10, float(value)/20.0))); } else if (name == "Threshold") { if (value == -81) setThreshold(0.0); else setThreshold(float(AudioLevel::dB_to_multiplier(value))); } else if (name == "Colour Rotation") { setColourRotation(value); } else if (name == "Colour") { setColourMap(value); } else if (name == "Window Size") { setWindowSize(32 << value); } else if (name == "Window Increment") { setWindowHopLevel(value); } else if (name == "Min Frequency") { switch (value) { default: case 0: setMinFrequency(0); break; case 1: setMinFrequency(10); break; case 2: setMinFrequency(20); break; case 3: setMinFrequency(40); break; case 4: setMinFrequency(100); break; case 5: setMinFrequency(250); break; case 6: setMinFrequency(500); break; case 7: setMinFrequency(1000); break; case 8: setMinFrequency(4000); break; case 9: setMinFrequency(10000); break; } int vs = getCurrentVerticalZoomStep(); if (vs != m_lastEmittedZoomStep) { emit verticalZoomChanged(); m_lastEmittedZoomStep = vs; } } else if (name == "Max Frequency") { switch (value) { case 0: setMaxFrequency(500); break; case 1: setMaxFrequency(1000); break; case 2: setMaxFrequency(1500); break; case 3: setMaxFrequency(2000); break; case 4: setMaxFrequency(4000); break; case 5: setMaxFrequency(6000); break; case 6: setMaxFrequency(8000); break; case 7: setMaxFrequency(12000); break; case 8: setMaxFrequency(16000); break; default: case 9: setMaxFrequency(0); break; } int vs = getCurrentVerticalZoomStep(); if (vs != m_lastEmittedZoomStep) { emit verticalZoomChanged(); m_lastEmittedZoomStep = vs; } } else if (name == "Colour Scale") { setColourScaleMultiple(1.0); switch (value) { default: case 0: setColourScale(ColourScaleType::Linear); break; case 1: setColourScale(ColourScaleType::Meter); break; case 2: setColourScale(ColourScaleType::Log); setColourScaleMultiple(2.0); break; case 3: setColourScale(ColourScaleType::Log); break; case 4: setColourScale(ColourScaleType::Phase); break; } } else if (name == "Frequency Scale") { switch (value) { default: case 0: setBinScale(BinScale::Linear); break; case 1: setBinScale(BinScale::Log); break; } } else if (name == "Bin Display") { switch (value) { default: case 0: setBinDisplay(BinDisplay::AllBins); break; case 1: setBinDisplay(BinDisplay::PeakBins); break; case 2: setBinDisplay(BinDisplay::PeakFrequencies); break; } } else if (name == "Normalization") { auto n = convertToColumnNorm(value); setNormalization(n.first); setNormalizeVisibleArea(n.second); } } void SpectrogramLayer::invalidateRenderers() { #ifdef DEBUG_SPECTROGRAM cerr << "SpectrogramLayer::invalidateRenderers called" << endl; #endif for (ViewRendererMap::iterator i = m_renderers.begin(); i != m_renderers.end(); ++i) { delete i->second; } m_renderers.clear(); } void SpectrogramLayer::preferenceChanged(PropertyContainer::PropertyName name) { SVDEBUG << "SpectrogramLayer::preferenceChanged(" << name << ")" << endl; if (name == "Window Type") { setWindowType(Preferences::getInstance()->getWindowType()); return; } if (name == "Spectrogram Y Smoothing") { setWindowSize(m_windowSize); invalidateRenderers(); invalidateMagnitudes(); emit layerParametersChanged(); } if (name == "Spectrogram X Smoothing") { invalidateRenderers(); invalidateMagnitudes(); emit layerParametersChanged(); } if (name == "Tuning Frequency") { emit layerParametersChanged(); } } void SpectrogramLayer::setChannel(int ch) { if (m_channel == ch) return; invalidateRenderers(); m_channel = ch; recreateFFTModel(); emit layerParametersChanged(); } int SpectrogramLayer::getChannel() const { return m_channel; } int SpectrogramLayer::getFFTOversampling() const { if (m_binDisplay != BinDisplay::AllBins) { return 1; } Preferences::SpectrogramSmoothing smoothing = Preferences::getInstance()->getSpectrogramSmoothing(); if (smoothing == Preferences::NoSpectrogramSmoothing || smoothing == Preferences::SpectrogramInterpolated) { return 1; } return 4; } int SpectrogramLayer::getFFTSize() const { return m_windowSize * getFFTOversampling(); } void SpectrogramLayer::setWindowSize(int ws) { if (m_windowSize == ws) return; invalidateRenderers(); m_windowSize = ws; recreateFFTModel(); emit layerParametersChanged(); } int SpectrogramLayer::getWindowSize() const { return m_windowSize; } void SpectrogramLayer::setWindowHopLevel(int v) { if (m_windowHopLevel == v) return; invalidateRenderers(); m_windowHopLevel = v; recreateFFTModel(); emit layerParametersChanged(); } int SpectrogramLayer::getWindowHopLevel() const { return m_windowHopLevel; } void SpectrogramLayer::setWindowType(WindowType w) { if (m_windowType == w) return; invalidateRenderers(); m_windowType = w; recreateFFTModel(); emit layerParametersChanged(); } WindowType SpectrogramLayer::getWindowType() const { return m_windowType; } void SpectrogramLayer::setGain(float gain) { // SVDEBUG << "SpectrogramLayer::setGain(" << gain << ") (my gain is now " // << m_gain << ")" << endl; if (m_gain == gain) return; invalidateRenderers(); m_gain = gain; emit layerParametersChanged(); } float SpectrogramLayer::getGain() const { return m_gain; } void SpectrogramLayer::setThreshold(float threshold) { if (m_threshold == threshold) return; invalidateRenderers(); m_threshold = threshold; emit layerParametersChanged(); } float SpectrogramLayer::getThreshold() const { return m_threshold; } void SpectrogramLayer::setMinFrequency(int mf) { if (m_minFrequency == mf) return; // SVDEBUG << "SpectrogramLayer::setMinFrequency: " << mf << endl; invalidateRenderers(); invalidateMagnitudes(); m_minFrequency = mf; emit layerParametersChanged(); } int SpectrogramLayer::getMinFrequency() const { return m_minFrequency; } void SpectrogramLayer::setMaxFrequency(int mf) { if (m_maxFrequency == mf) return; // SVDEBUG << "SpectrogramLayer::setMaxFrequency: " << mf << endl; invalidateRenderers(); invalidateMagnitudes(); m_maxFrequency = mf; emit layerParametersChanged(); } int SpectrogramLayer::getMaxFrequency() const { return m_maxFrequency; } void SpectrogramLayer::setColourRotation(int r) { if (r < 0) r = 0; if (r > 256) r = 256; int distance = r - m_colourRotation; if (distance != 0) { m_colourRotation = r; } // Initially the idea with colour rotation was that we would just // rotate the palette of an already-generated cache. That's not // really practical now that cacheing is handled in a separate // class in which the main cache no longer has a palette. invalidateRenderers(); emit layerParametersChanged(); } void SpectrogramLayer::setColourScale(ColourScaleType colourScale) { if (m_colourScale == colourScale) return; invalidateRenderers(); m_colourScale = colourScale; emit layerParametersChanged(); } ColourScaleType SpectrogramLayer::getColourScale() const { return m_colourScale; } void SpectrogramLayer::setColourScaleMultiple(double multiple) { if (m_colourScaleMultiple == multiple) return; invalidateRenderers(); m_colourScaleMultiple = multiple; emit layerParametersChanged(); } double SpectrogramLayer::getColourScaleMultiple() const { return m_colourScaleMultiple; } void SpectrogramLayer::setColourMap(int map) { if (m_colourMap == map) return; invalidateRenderers(); m_colourMap = map; emit layerParametersChanged(); } int SpectrogramLayer::getColourMap() const { return m_colourMap; } void SpectrogramLayer::setBinScale(BinScale binScale) { if (m_binScale == binScale) return; invalidateRenderers(); m_binScale = binScale; emit layerParametersChanged(); } BinScale SpectrogramLayer::getBinScale() const { return m_binScale; } void SpectrogramLayer::setBinDisplay(BinDisplay binDisplay) { if (m_binDisplay == binDisplay) return; invalidateRenderers(); m_binDisplay = binDisplay; emit layerParametersChanged(); } BinDisplay SpectrogramLayer::getBinDisplay() const { return m_binDisplay; } void SpectrogramLayer::setNormalization(ColumnNormalization n) { if (m_normalization == n) return; invalidateRenderers(); invalidateMagnitudes(); m_normalization = n; emit layerParametersChanged(); } ColumnNormalization SpectrogramLayer::getNormalization() const { return m_normalization; } void SpectrogramLayer::setNormalizeVisibleArea(bool n) { if (m_normalizeVisibleArea == n) return; invalidateRenderers(); invalidateMagnitudes(); m_normalizeVisibleArea = n; emit layerParametersChanged(); } bool SpectrogramLayer::getNormalizeVisibleArea() const { return m_normalizeVisibleArea; } void SpectrogramLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) { if (dormant) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer::setLayerDormant(" << dormant << ")" << endl; #endif if (isLayerDormant(v)) { return; } Layer::setLayerDormant(v, true); invalidateRenderers(); } else { Layer::setLayerDormant(v, false); } } bool SpectrogramLayer::isLayerScrollable(const LayerGeometryProvider *) const { return false; } void SpectrogramLayer::cacheInvalid() { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer::cacheInvalid()" << endl; #endif invalidateRenderers(); invalidateMagnitudes(); } void SpectrogramLayer::cacheInvalid( #ifdef DEBUG_SPECTROGRAM_REPAINT sv_frame_t from, sv_frame_t to #else sv_frame_t , sv_frame_t #endif ) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer::cacheInvalid(" << from << ", " << to << ")" << endl; #endif // We used to call invalidateMagnitudes(from, to) to invalidate // only those caches whose views contained some of the (from, to) // range. That's the right thing to do; it has been lost in // pulling out the image cache code, but it might not matter very // much, since the underlying models for spectrogram layers don't // change very often. Let's see. invalidateRenderers(); invalidateMagnitudes(); } bool SpectrogramLayer::hasLightBackground() const { return ColourMapper(m_colourMap, 1.f, 255.f).hasLightBackground(); } double SpectrogramLayer::getEffectiveMinFrequency() const { sv_samplerate_t sr = m_model->getSampleRate(); double minf = double(sr) / getFFTSize(); if (m_minFrequency > 0.0) { int minbin = int((double(m_minFrequency) * getFFTSize()) / sr + 0.01); if (minbin < 1) minbin = 1; minf = minbin * sr / getFFTSize(); } return minf; } double SpectrogramLayer::getEffectiveMaxFrequency() const { sv_samplerate_t sr = m_model->getSampleRate(); double maxf = double(sr) / 2; if (m_maxFrequency > 0.0) { int maxbin = int((double(m_maxFrequency) * getFFTSize()) / sr + 0.1); if (maxbin > getFFTSize() / 2) maxbin = getFFTSize() / 2; maxf = maxbin * sr / getFFTSize(); } return maxf; } bool SpectrogramLayer::getYBinRange(LayerGeometryProvider *v, int y, double &q0, double &q1) const { Profiler profiler("SpectrogramLayer::getYBinRange"); int h = v->getPaintHeight(); if (y < 0 || y >= h) return false; q0 = getBinForY(v, y); q1 = getBinForY(v, y-1); return true; } double SpectrogramLayer::getYForBin(const LayerGeometryProvider *v, double bin) const { double minf = getEffectiveMinFrequency(); double maxf = getEffectiveMaxFrequency(); bool logarithmic = (m_binScale == BinScale::Log); sv_samplerate_t sr = m_model->getSampleRate(); double freq = (bin * sr) / getFFTSize(); double y = v->getYForFrequency(freq, minf, maxf, logarithmic); return y; } double SpectrogramLayer::getBinForY(const LayerGeometryProvider *v, double y) const { sv_samplerate_t sr = m_model->getSampleRate(); double minf = getEffectiveMinFrequency(); double maxf = getEffectiveMaxFrequency(); bool logarithmic = (m_binScale == BinScale::Log); double freq = v->getFrequencyForY(y, minf, maxf, logarithmic); // Now map on to ("proportion of") actual bins double bin = (freq * getFFTSize()) / sr; return bin; } bool SpectrogramLayer::getXBinRange(LayerGeometryProvider *v, int x, double &s0, double &s1) const { sv_frame_t modelStart = m_model->getStartFrame(); sv_frame_t modelEnd = m_model->getEndFrame(); // Each pixel column covers an exact range of sample frames: sv_frame_t f0 = v->getFrameForX(x) - modelStart; sv_frame_t f1 = v->getFrameForX(x + 1) - modelStart - 1; if (f1 < int(modelStart) || f0 > int(modelEnd)) { return false; } // And that range may be drawn from a possibly non-integral // range of spectrogram windows: int windowIncrement = getWindowIncrement(); s0 = double(f0) / windowIncrement; s1 = double(f1) / windowIncrement; return true; } bool SpectrogramLayer::getXBinSourceRange(LayerGeometryProvider *v, int x, RealTime &min, RealTime &max) const { double s0 = 0, s1 = 0; if (!getXBinRange(v, x, s0, s1)) return false; int s0i = int(s0 + 0.001); int s1i = int(s1); int windowIncrement = getWindowIncrement(); int w0 = s0i * windowIncrement - (m_windowSize - windowIncrement)/2; int w1 = s1i * windowIncrement + windowIncrement + (m_windowSize - windowIncrement)/2 - 1; min = RealTime::frame2RealTime(w0, m_model->getSampleRate()); max = RealTime::frame2RealTime(w1, m_model->getSampleRate()); return true; } bool SpectrogramLayer::getYBinSourceRange(LayerGeometryProvider *v, int y, double &freqMin, double &freqMax) const { double q0 = 0, q1 = 0; if (!getYBinRange(v, y, q0, q1)) return false; int q0i = int(q0 + 0.001); int q1i = int(q1); sv_samplerate_t sr = m_model->getSampleRate(); for (int q = q0i; q <= q1i; ++q) { if (q == q0i) freqMin = (sr * q) / getFFTSize(); if (q == q1i) freqMax = (sr * (q+1)) / getFFTSize(); } return true; } bool SpectrogramLayer::getAdjustedYBinSourceRange(LayerGeometryProvider *v, int x, int y, double &freqMin, double &freqMax, double &adjFreqMin, double &adjFreqMax) const { if (!m_model || !m_model->isOK() || !m_model->isReady()) { return false; } FFTModel *fft = getFFTModel(); if (!fft) return false; double s0 = 0, s1 = 0; if (!getXBinRange(v, x, s0, s1)) return false; double q0 = 0, q1 = 0; if (!getYBinRange(v, y, q0, q1)) return false; int s0i = int(s0 + 0.001); int s1i = int(s1); int q0i = int(q0 + 0.001); int q1i = int(q1); sv_samplerate_t sr = m_model->getSampleRate(); bool haveAdj = false; bool peaksOnly = (m_binDisplay == BinDisplay::PeakBins || m_binDisplay == BinDisplay::PeakFrequencies); for (int q = q0i; q <= q1i; ++q) { for (int s = s0i; s <= s1i; ++s) { double binfreq = (double(sr) * q) / m_windowSize; if (q == q0i) freqMin = binfreq; if (q == q1i) freqMax = binfreq; if (peaksOnly && !fft->isLocalPeak(s, q)) continue; if (!fft->isOverThreshold (s, q, float(m_threshold * double(getFFTSize())/2.0))) { continue; } double freq = binfreq; if (s < int(fft->getWidth()) - 1) { fft->estimateStableFrequency(s, q, freq); if (!haveAdj || freq < adjFreqMin) adjFreqMin = freq; if (!haveAdj || freq > adjFreqMax) adjFreqMax = freq; haveAdj = true; } } } if (!haveAdj) { adjFreqMin = adjFreqMax = 0.0; } return haveAdj; } bool SpectrogramLayer::getXYBinSourceRange(LayerGeometryProvider *v, int x, int y, double &min, double &max, double &phaseMin, double &phaseMax) const { if (!m_model || !m_model->isOK() || !m_model->isReady()) { return false; } double q0 = 0, q1 = 0; if (!getYBinRange(v, y, q0, q1)) return false; double s0 = 0, s1 = 0; if (!getXBinRange(v, x, s0, s1)) return false; int q0i = int(q0 + 0.001); int q1i = int(q1); int s0i = int(s0 + 0.001); int s1i = int(s1); bool rv = false; FFTModel *fft = getFFTModel(); if (fft) { int cw = fft->getWidth(); int ch = fft->getHeight(); min = 0.0; max = 0.0; phaseMin = 0.0; phaseMax = 0.0; bool have = false; for (int q = q0i; q <= q1i; ++q) { for (int s = s0i; s <= s1i; ++s) { if (s >= 0 && q >= 0 && s < cw && q < ch) { double value; value = fft->getPhaseAt(s, q); if (!have || value < phaseMin) { phaseMin = value; } if (!have || value > phaseMax) { phaseMax = value; } value = fft->getMagnitudeAt(s, q) / (getFFTSize()/2.0); if (!have || value < min) { min = value; } if (!have || value > max) { max = value; } have = true; } } } if (have) { rv = true; } } return rv; } void SpectrogramLayer::recreateFFTModel() { SVDEBUG << "SpectrogramLayer::recreateFFTModel called" << endl; if (!m_model || !m_model->isOK()) { emit sliceableModelReplaced(m_fftModel, 0); deleteDerivedModels(); return; } if (m_fftModel) m_fftModel->aboutToDelete(); if (m_peakCache) m_peakCache->aboutToDelete(); delete m_peakCache; m_peakCache = 0; if (m_wholeCache) m_wholeCache->aboutToDelete(); delete m_wholeCache; m_wholeCache = 0; FFTModel *newModel = new FFTModel(m_model, m_channel, m_windowType, m_windowSize, getWindowIncrement(), getFFTSize()); if (!newModel->isOK()) { QMessageBox::critical (0, tr("FFT cache failed"), tr("Failed to create the FFT model for this spectrogram.\n" "There may be insufficient memory or disc space to continue.")); delete newModel; delete m_fftModel; m_fftModel = 0; return; } FFTModel *oldModel = m_fftModel; m_fftModel = newModel; if (canStoreWholeCache()) { // i.e. if enough memory m_wholeCache = new Dense3DModelPeakCache(m_fftModel, 1); m_peakCache = new Dense3DModelPeakCache(m_wholeCache, m_peakCacheDivisor); } else { m_peakCache = new Dense3DModelPeakCache(m_fftModel, m_peakCacheDivisor); } emit sliceableModelReplaced(oldModel, m_fftModel); delete oldModel; } bool SpectrogramLayer::canStoreWholeCache() const { if (!m_fftModel) { return false; // or true, doesn't really matter } size_t sz = size_t(m_fftModel->getWidth()) * size_t(m_fftModel->getHeight()) * sizeof(float); try { SVDEBUG << "Requesting advice from StorageAdviser on whether to create whole-model cache" << endl; StorageAdviser::Recommendation recommendation = StorageAdviser::recommend (StorageAdviser::Criteria(StorageAdviser::SpeedCritical | StorageAdviser::PrecisionCritical | StorageAdviser::FrequentLookupLikely), sz / 1024, sz / 1024); if ((recommendation & StorageAdviser::UseDisc) || (recommendation & StorageAdviser::ConserveSpace)) { SVDEBUG << "Seems inadvisable to create whole-model cache" << endl; return false; } else { SVDEBUG << "Seems fine to create whole-model cache" << endl; return true; } } catch (const InsufficientDiscSpace &) { SVDEBUG << "Seems like a terrible idea to create whole-model cache" << endl; return false; } } const Model * SpectrogramLayer::getSliceableModel() const { return m_fftModel; } void SpectrogramLayer::invalidateMagnitudes() { #ifdef DEBUG_SPECTROGRAM cerr << "SpectrogramLayer::invalidateMagnitudes called" << endl; #endif m_viewMags.clear(); } void SpectrogramLayer::setSynchronousPainting(bool synchronous) { m_synchronous = synchronous; } Colour3DPlotRenderer * SpectrogramLayer::getRenderer(LayerGeometryProvider *v) const { int viewId = v->getId(); if (m_renderers.find(viewId) == m_renderers.end()) { Colour3DPlotRenderer::Sources sources; sources.verticalBinLayer = this; sources.fft = getFFTModel(); sources.source = sources.fft; if (m_peakCache) sources.peakCaches.push_back(m_peakCache); if (m_wholeCache) sources.peakCaches.push_back(m_wholeCache); ColourScale::Parameters cparams; cparams.colourMap = m_colourMap; cparams.scaleType = m_colourScale; cparams.multiple = m_colourScaleMultiple; if (m_colourScale != ColourScaleType::Phase) { cparams.gain = m_gain; cparams.threshold = m_threshold; } double minValue = 0.0f; double maxValue = 1.0f; if (m_normalizeVisibleArea && m_viewMags[viewId].isSet()) { minValue = m_viewMags[viewId].getMin(); maxValue = m_viewMags[viewId].getMax(); } else if (m_colourScale == ColourScaleType::Linear && m_normalization == ColumnNormalization::None) { maxValue = 0.1f; } if (maxValue <= minValue) { maxValue = minValue + 0.1f; } if (maxValue <= m_threshold) { maxValue = m_threshold + 0.1f; } cparams.minValue = minValue; cparams.maxValue = maxValue; m_lastRenderedMags[viewId] = MagnitudeRange(float(minValue), float(maxValue)); Colour3DPlotRenderer::Parameters params; params.colourScale = ColourScale(cparams); params.normalization = m_normalization; params.binDisplay = m_binDisplay; params.binScale = m_binScale; params.alwaysOpaque = true; params.invertVertical = false; params.scaleFactor = 1.0; params.colourRotation = m_colourRotation; if (m_colourScale != ColourScaleType::Phase && m_normalization != ColumnNormalization::Hybrid) { params.scaleFactor *= 2.f / float(getFFTSize()); } Preferences::SpectrogramSmoothing smoothing = Preferences::getInstance()->getSpectrogramSmoothing(); params.interpolate = (smoothing == Preferences::SpectrogramInterpolated || smoothing == Preferences::SpectrogramZeroPaddedAndInterpolated); m_renderers[viewId] = new Colour3DPlotRenderer(sources, params); m_crosshairColour = ColourMapper(m_colourMap, 1.f, 255.f).getContrastingColour(); } return m_renderers[viewId]; } void SpectrogramLayer::paintWithRenderer(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { Colour3DPlotRenderer *renderer = getRenderer(v); Colour3DPlotRenderer::RenderResult result; MagnitudeRange magRange; int viewId = v->getId(); bool continuingPaint = !renderer->geometryChanged(v); if (continuingPaint) { magRange = m_viewMags[viewId]; } if (m_synchronous) { result = renderer->render(v, paint, rect); } else { result = renderer->renderTimeConstrained(v, paint, rect); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "rect width from this paint: " << result.rendered.width() << ", mag range in this paint: " << result.range.getMin() << " -> " << result.range.getMax() << endl; #endif QRect uncached = renderer->getLargestUncachedRect(v); if (uncached.width() > 0) { v->updatePaintRect(uncached); } } magRange.sample(result.range); if (magRange.isSet()) { if (m_viewMags[viewId] != magRange) { m_viewMags[viewId] = magRange; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "mag range in this view has changed: " << magRange.getMin() << " -> " << magRange.getMax() << endl; #endif } } if (!continuingPaint && m_normalizeVisibleArea && m_viewMags[viewId] != m_lastRenderedMags[viewId]) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "mag range has changed from last rendered range: re-rendering" << endl; #endif delete m_renderers[viewId]; m_renderers.erase(viewId); v->updatePaintRect(v->getPaintRect()); } } void SpectrogramLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { Profiler profiler("SpectrogramLayer::paint", false); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer::paint() entering: m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << endl; cerr << "SpectrogramLayer::paint(): rect is " << rect.x() << "," << rect.y() << " " << rect.width() << "x" << rect.height() << endl; #endif if (!m_model || !m_model->isOK() || !m_model->isReady()) { return; } paintWithRenderer(v, paint, rect); illuminateLocalFeatures(v, paint); } void SpectrogramLayer::illuminateLocalFeatures(LayerGeometryProvider *v, QPainter &paint) const { Profiler profiler("SpectrogramLayer::illuminateLocalFeatures"); QPoint localPos; if (!v->shouldIlluminateLocalFeatures(this, localPos) || !m_model) { return; } #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: illuminateLocalFeatures(" << localPos.x() << "," << localPos.y() << ")" << endl; #endif double s0, s1; double f0, f1; if (getXBinRange(v, localPos.x(), s0, s1) && getYBinSourceRange(v, localPos.y(), f0, f1)) { int s0i = int(s0 + 0.001); int s1i = int(s1); int x0 = v->getXForFrame(s0i * getWindowIncrement()); int x1 = v->getXForFrame((s1i + 1) * getWindowIncrement()); int y1 = int(getYForFrequency(v, f1)); int y0 = int(getYForFrequency(v, f0)); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: illuminate " << x0 << "," << y1 << " -> " << x1 << "," << y0 << endl; #endif paint.setPen(v->getForeground()); //!!! should we be using paintCrosshairs for this? paint.drawRect(x0, y1, x1 - x0 + 1, y0 - y1 + 1); } } double SpectrogramLayer::getYForFrequency(const LayerGeometryProvider *v, double frequency) const { return v->getYForFrequency(frequency, getEffectiveMinFrequency(), getEffectiveMaxFrequency(), m_binScale == BinScale::Log); } double SpectrogramLayer::getFrequencyForY(const LayerGeometryProvider *v, int y) const { return v->getFrequencyForY(y, getEffectiveMinFrequency(), getEffectiveMaxFrequency(), m_binScale == BinScale::Log); } int SpectrogramLayer::getCompletion(LayerGeometryProvider *) const { if (!m_fftModel) return 100; int completion = m_fftModel->getCompletion(); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer::getCompletion: completion = " << completion << endl; #endif return completion; } QString SpectrogramLayer::getError(LayerGeometryProvider *) const { if (!m_fftModel) return ""; return m_fftModel->getError(); } bool SpectrogramLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; sv_samplerate_t sr = m_model->getSampleRate(); min = double(sr) / getFFTSize(); max = double(sr) / 2; logarithmic = (m_binScale == BinScale::Log); unit = "Hz"; return true; } bool SpectrogramLayer::getDisplayExtents(double &min, double &max) const { min = getEffectiveMinFrequency(); max = getEffectiveMaxFrequency(); // SVDEBUG << "SpectrogramLayer::getDisplayExtents: " << min << "->" << max << endl; return true; } bool SpectrogramLayer::setDisplayExtents(double min, double max) { if (!m_model) return false; // SVDEBUG << "SpectrogramLayer::setDisplayExtents: " << min << "->" << max << endl; if (min < 0) min = 0; if (max > m_model->getSampleRate()/2.0) max = m_model->getSampleRate()/2.0; int minf = int(lrint(min)); int maxf = int(lrint(max)); if (m_minFrequency == minf && m_maxFrequency == maxf) return true; invalidateRenderers(); invalidateMagnitudes(); m_minFrequency = minf; m_maxFrequency = maxf; emit layerParametersChanged(); int vs = getCurrentVerticalZoomStep(); if (vs != m_lastEmittedZoomStep) { emit verticalZoomChanged(); m_lastEmittedZoomStep = vs; } return true; } bool SpectrogramLayer::getYScaleValue(const LayerGeometryProvider *v, int y, double &value, QString &unit) const { value = getFrequencyForY(v, y); unit = "Hz"; return true; } bool SpectrogramLayer::snapToFeatureFrame(LayerGeometryProvider *, sv_frame_t &frame, int &resolution, SnapType snap) const { resolution = getWindowIncrement(); sv_frame_t left = (frame / resolution) * resolution; sv_frame_t right = left + resolution; switch (snap) { case SnapLeft: frame = left; break; case SnapRight: frame = right; break; case SnapNearest: case SnapNeighbouring: if (frame - left > right - frame) frame = right; else frame = left; break; } return true; } void SpectrogramLayer::measureDoubleClick(LayerGeometryProvider *v, QMouseEvent *e) { const Colour3DPlotRenderer *renderer = getRenderer(v); if (!renderer) return; QRect rect = renderer->findSimilarRegionExtents(e->pos()); if (rect.isValid()) { MeasureRect mr; setMeasureRectFromPixrect(v, mr, rect); CommandHistory::getInstance()->addCommand (new AddMeasurementRectCommand(this, mr)); } } bool SpectrogramLayer::getCrosshairExtents(LayerGeometryProvider *v, QPainter &paint, QPoint cursorPos, vector &extents) const { QRect vertical(cursorPos.x() - 12, 0, 12, v->getPaintHeight()); extents.push_back(vertical); QRect horizontal(0, cursorPos.y(), cursorPos.x(), 1); extents.push_back(horizontal); int sw = getVerticalScaleWidth(v, m_haveDetailedScale, paint); QRect freq(sw, cursorPos.y() - paint.fontMetrics().ascent() - 2, paint.fontMetrics().width("123456 Hz") + 2, paint.fontMetrics().height()); extents.push_back(freq); QRect pitch(sw, cursorPos.y() + 2, paint.fontMetrics().width("C#10+50c") + 2, paint.fontMetrics().height()); extents.push_back(pitch); QRect rt(cursorPos.x(), v->getPaintHeight() - paint.fontMetrics().height() - 2, paint.fontMetrics().width("1234.567 s"), paint.fontMetrics().height()); extents.push_back(rt); int w(paint.fontMetrics().width("1234567890") + 2); QRect frame(cursorPos.x() - w - 2, v->getPaintHeight() - paint.fontMetrics().height() - 2, w, paint.fontMetrics().height()); extents.push_back(frame); return true; } void SpectrogramLayer::paintCrosshairs(LayerGeometryProvider *v, QPainter &paint, QPoint cursorPos) const { paint.save(); int sw = getVerticalScaleWidth(v, m_haveDetailedScale, paint); QFont fn = paint.font(); if (fn.pointSize() > 8) { fn.setPointSize(fn.pointSize() - 1); paint.setFont(fn); } paint.setPen(m_crosshairColour); paint.drawLine(0, cursorPos.y(), cursorPos.x() - 1, cursorPos.y()); paint.drawLine(cursorPos.x(), 0, cursorPos.x(), v->getPaintHeight()); double fundamental = getFrequencyForY(v, cursorPos.y()); PaintAssistant::drawVisibleText(v, paint, sw + 2, cursorPos.y() - 2, QString("%1 Hz").arg(fundamental), PaintAssistant::OutlinedText); if (Pitch::isFrequencyInMidiRange(fundamental)) { QString pitchLabel = Pitch::getPitchLabelForFrequency(fundamental); PaintAssistant::drawVisibleText(v, paint, sw + 2, cursorPos.y() + paint.fontMetrics().ascent() + 2, pitchLabel, PaintAssistant::OutlinedText); } sv_frame_t frame = v->getFrameForX(cursorPos.x()); RealTime rt = RealTime::frame2RealTime(frame, m_model->getSampleRate()); QString rtLabel = QString("%1 s").arg(rt.toText(true).c_str()); QString frameLabel = QString("%1").arg(frame); PaintAssistant::drawVisibleText(v, paint, cursorPos.x() - paint.fontMetrics().width(frameLabel) - 2, v->getPaintHeight() - 2, frameLabel, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(v, paint, cursorPos.x() + 2, v->getPaintHeight() - 2, rtLabel, PaintAssistant::OutlinedText); int harmonic = 2; while (harmonic < 100) { int hy = int(lrint(getYForFrequency(v, fundamental * harmonic))); if (hy < 0 || hy > v->getPaintHeight()) break; int len = 7; if (harmonic % 2 == 0) { if (harmonic % 4 == 0) { len = 12; } else { len = 10; } } paint.drawLine(cursorPos.x() - len, hy, cursorPos.x(), hy); ++harmonic; } paint.restore(); } QString SpectrogramLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); int y = pos.y(); if (!m_model || !m_model->isOK()) return ""; double magMin = 0, magMax = 0; double phaseMin = 0, phaseMax = 0; double freqMin = 0, freqMax = 0; double adjFreqMin = 0, adjFreqMax = 0; QString pitchMin, pitchMax; RealTime rtMin, rtMax; bool haveValues = false; if (!getXBinSourceRange(v, x, rtMin, rtMax)) { return ""; } if (getXYBinSourceRange(v, x, y, magMin, magMax, phaseMin, phaseMax)) { haveValues = true; } QString adjFreqText = "", adjPitchText = ""; if (m_binDisplay == BinDisplay::PeakFrequencies) { if (!getAdjustedYBinSourceRange(v, x, y, freqMin, freqMax, adjFreqMin, adjFreqMax)) { return ""; } if (adjFreqMin != adjFreqMax) { adjFreqText = tr("Peak Frequency:\t%1 - %2 Hz\n") .arg(adjFreqMin).arg(adjFreqMax); } else { adjFreqText = tr("Peak Frequency:\t%1 Hz\n") .arg(adjFreqMin); } QString pmin = Pitch::getPitchLabelForFrequency(adjFreqMin); QString pmax = Pitch::getPitchLabelForFrequency(adjFreqMax); if (pmin != pmax) { adjPitchText = tr("Peak Pitch:\t%3 - %4\n").arg(pmin).arg(pmax); } else { adjPitchText = tr("Peak Pitch:\t%2\n").arg(pmin); } } else { if (!getYBinSourceRange(v, y, freqMin, freqMax)) return ""; } QString text; if (rtMin != rtMax) { text += tr("Time:\t%1 - %2\n") .arg(rtMin.toText(true).c_str()) .arg(rtMax.toText(true).c_str()); } else { text += tr("Time:\t%1\n") .arg(rtMin.toText(true).c_str()); } if (freqMin != freqMax) { text += tr("%1Bin Frequency:\t%2 - %3 Hz\n%4Bin Pitch:\t%5 - %6\n") .arg(adjFreqText) .arg(freqMin) .arg(freqMax) .arg(adjPitchText) .arg(Pitch::getPitchLabelForFrequency(freqMin)) .arg(Pitch::getPitchLabelForFrequency(freqMax)); } else { text += tr("%1Bin Frequency:\t%2 Hz\n%3Bin Pitch:\t%4\n") .arg(adjFreqText) .arg(freqMin) .arg(adjPitchText) .arg(Pitch::getPitchLabelForFrequency(freqMin)); } if (haveValues) { double dbMin = AudioLevel::multiplier_to_dB(magMin); double dbMax = AudioLevel::multiplier_to_dB(magMax); QString dbMinString; QString dbMaxString; if (dbMin == AudioLevel::DB_FLOOR) { dbMinString = Strings::minus_infinity; } else { dbMinString = QString("%1").arg(lrint(dbMin)); } if (dbMax == AudioLevel::DB_FLOOR) { dbMaxString = Strings::minus_infinity; } else { dbMaxString = QString("%1").arg(lrint(dbMax)); } if (lrint(dbMin) != lrint(dbMax)) { text += tr("dB:\t%1 - %2").arg(dbMinString).arg(dbMaxString); } else { text += tr("dB:\t%1").arg(dbMinString); } if (phaseMin != phaseMax) { text += tr("\nPhase:\t%1 - %2").arg(phaseMin).arg(phaseMax); } else { text += tr("\nPhase:\t%1").arg(phaseMin); } } return text; } int SpectrogramLayer::getColourScaleWidth(QPainter &paint) const { int cw; cw = paint.fontMetrics().width("-80dB"); return cw; } int SpectrogramLayer::getVerticalScaleWidth(LayerGeometryProvider *, bool detailed, QPainter &paint) const { if (!m_model || !m_model->isOK()) return 0; int cw = 0; if (detailed) cw = getColourScaleWidth(paint); int tw = paint.fontMetrics().width(QString("%1") .arg(m_maxFrequency > 0 ? m_maxFrequency - 1 : m_model->getSampleRate() / 2)); int fw = paint.fontMetrics().width(tr("43Hz")); if (tw < fw) tw = fw; int tickw = (m_binScale == BinScale::Log ? 10 : 4); return cw + tickw + tw + 13; } void SpectrogramLayer::paintVerticalScale(LayerGeometryProvider *v, bool detailed, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) { return; } Profiler profiler("SpectrogramLayer::paintVerticalScale"); //!!! cache this? int h = rect.height(), w = rect.width(); int textHeight = paint.fontMetrics().height(); if (detailed && (h > textHeight * 3 + 10)) { paintDetailedScale(v, paint, rect); } m_haveDetailedScale = detailed; int tickw = (m_binScale == BinScale::Log ? 10 : 4); int pkw = (m_binScale == BinScale::Log ? 10 : 0); int bins = getFFTSize() / 2; sv_samplerate_t sr = m_model->getSampleRate(); if (m_maxFrequency > 0) { bins = int((double(m_maxFrequency) * getFFTSize()) / sr + 0.1); if (bins > getFFTSize() / 2) bins = getFFTSize() / 2; } int cw = 0; if (detailed) cw = getColourScaleWidth(paint); int py = -1; int toff = -textHeight + paint.fontMetrics().ascent() + 2; paint.drawLine(cw + 7, 0, cw + 7, h); int bin = -1; for (int y = 0; y < v->getPaintHeight(); ++y) { double q0, q1; if (!getYBinRange(v, v->getPaintHeight() - y, q0, q1)) continue; int vy; if (int(q0) > bin) { vy = y; bin = int(q0); } else { continue; } int freq = int((sr * bin) / getFFTSize()); if (py >= 0 && (vy - py) < textHeight - 1) { if (m_binScale == BinScale::Linear) { paint.drawLine(w - tickw, h - vy, w, h - vy); } continue; } QString text = QString("%1").arg(freq); if (bin == 1) text = tr("%1Hz").arg(freq); // bin 0 is DC paint.drawLine(cw + 7, h - vy, w - pkw - 1, h - vy); if (h - vy - textHeight >= -2) { int tx = w - 3 - paint.fontMetrics().width(text) - max(tickw, pkw); paint.drawText(tx, h - vy + toff, text); } py = vy; } if (m_binScale == BinScale::Log) { // piano keyboard PianoScale().paintPianoVertical (v, paint, QRect(w - pkw - 1, 0, pkw, h), getEffectiveMinFrequency(), getEffectiveMaxFrequency()); } m_haveDetailedScale = detailed; } void SpectrogramLayer::paintDetailedScale(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { // The colour scale if (m_colourScale == ColourScaleType::Phase) { paintDetailedScalePhase(v, paint, rect); return; } int h = rect.height(); int textHeight = paint.fontMetrics().height(); int toff = -textHeight + paint.fontMetrics().ascent() + 2; int cw = getColourScaleWidth(paint); int cbw = paint.fontMetrics().width("dB"); int topLines = 2; int ch = h - textHeight * (topLines + 1) - 8; // paint.drawRect(4, textHeight + 4, cw - 1, ch + 1); paint.drawRect(4 + cw - cbw, textHeight * topLines + 4, cbw - 1, ch + 1); QString top, bottom; double min = m_viewMags[v->getId()].getMin(); double max = m_viewMags[v->getId()].getMax(); if (min < m_threshold) min = m_threshold; if (max <= min) max = min + 0.1; double dBmin = AudioLevel::multiplier_to_dB(min); double dBmax = AudioLevel::multiplier_to_dB(max); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "paintVerticalScale: for view id " << v->getId() << ": min = " << min << ", max = " << max << ", dBmin = " << dBmin << ", dBmax = " << dBmax << endl; #endif if (dBmax < -60.f) dBmax = -60.f; else top = QString("%1").arg(lrint(dBmax)); if (dBmin < dBmax - 60.f) dBmin = dBmax - 60.f; bottom = QString("%1").arg(lrint(dBmin)); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "adjusted dB range to min = " << dBmin << ", max = " << dBmax << endl; #endif paint.drawText((cw + 6 - paint.fontMetrics().width("dBFS")) / 2, 2 + textHeight + toff, "dBFS"); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(top), 2 + textHeight * topLines + toff + textHeight/2, top); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(bottom), h + toff - 3 - textHeight/2, bottom); paint.save(); paint.setBrush(Qt::NoBrush); int lasty = 0; int lastdb = 0; for (int i = 0; i < ch; ++i) { double dBval = dBmin + (((dBmax - dBmin) * i) / (ch - 1)); int idb = int(dBval); double value = AudioLevel::dB_to_multiplier(dBval); paint.setPen(getRenderer(v)->getColour(value)); int y = textHeight * topLines + 4 + ch - i; paint.drawLine(5 + cw - cbw, y, cw + 2, y); if (i == 0) { lasty = y; lastdb = idb; } else if (i < ch - paint.fontMetrics().ascent() && idb != lastdb && ((abs(y - lasty) > textHeight && idb % 10 == 0) || (abs(y - lasty) > paint.fontMetrics().ascent() && idb % 5 == 0))) { paint.setPen(v->getForeground()); QString text = QString("%1").arg(idb); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(text), y + toff + textHeight/2, text); paint.drawLine(5 + cw - cbw, y, 8 + cw - cbw, y); lasty = y; lastdb = idb; } } paint.restore(); } void SpectrogramLayer::paintDetailedScalePhase(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { // The colour scale in phase mode int h = rect.height(); int textHeight = paint.fontMetrics().height(); int toff = -textHeight + paint.fontMetrics().ascent() + 2; int cw = getColourScaleWidth(paint); // Phase is not measured in dB of course, but this places the // scale at the same position as in the magnitude spectrogram int cbw = paint.fontMetrics().width("dB"); int topLines = 1; int ch = h - textHeight * (topLines + 1) - 8; paint.drawRect(4 + cw - cbw, textHeight * topLines + 4, cbw - 1, ch + 1); QString top = Strings::pi, bottom = Strings::minus_pi, middle = "0"; double min = -M_PI; double max = M_PI; paint.drawText(3 + cw - cbw - paint.fontMetrics().width(top), 2 + textHeight * topLines + toff + textHeight/2, top); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(middle), 2 + textHeight * topLines + ch/2 + toff + textHeight/2, middle); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(bottom), h + toff - 3 - textHeight/2, bottom); paint.save(); paint.setBrush(Qt::NoBrush); for (int i = 0; i < ch; ++i) { double val = min + (((max - min) * i) / (ch - 1)); paint.setPen(getRenderer(v)->getColour(val)); int y = textHeight * topLines + 4 + ch - i; paint.drawLine(5 + cw - cbw, y, cw + 2, y); } paint.restore(); } class SpectrogramRangeMapper : public RangeMapper { public: SpectrogramRangeMapper(sv_samplerate_t sr, int /* fftsize */) : m_dist(sr / 2), m_s2(sqrt(sqrt(2))) { } ~SpectrogramRangeMapper() { } virtual int getPositionForValue(double value) const { double dist = m_dist; int n = 0; while (dist > (value + 0.00001) && dist > 0.1) { dist /= m_s2; ++n; } return n; } virtual int getPositionForValueUnclamped(double value) const { // We don't really support this return getPositionForValue(value); } virtual double getValueForPosition(int position) const { // Vertical zoom step 0 shows the entire range from DC -> // Nyquist frequency. Step 1 shows 2^(1/4) of the range of // step 0, and so on until the visible range is smaller than // the frequency step between bins at the current fft size. double dist = m_dist; int n = 0; while (n < position) { dist /= m_s2; ++n; } return dist; } virtual double getValueForPositionUnclamped(int position) const { // We don't really support this return getValueForPosition(position); } virtual QString getUnit() const { return "Hz"; } protected: double m_dist; double m_s2; }; int SpectrogramLayer::getVerticalZoomSteps(int &defaultStep) const { if (!m_model) return 0; sv_samplerate_t sr = m_model->getSampleRate(); SpectrogramRangeMapper mapper(sr, getFFTSize()); // int maxStep = mapper.getPositionForValue((double(sr) / getFFTSize()) + 0.001); int maxStep = mapper.getPositionForValue(0); int minStep = mapper.getPositionForValue(double(sr) / 2); int initialMax = m_initialMaxFrequency; if (initialMax == 0) initialMax = int(sr / 2); defaultStep = mapper.getPositionForValue(initialMax) - minStep; // SVDEBUG << "SpectrogramLayer::getVerticalZoomSteps: " << maxStep - minStep << " (" << maxStep <<"-" << minStep << "), default is " << defaultStep << " (from initial max freq " << initialMax << ")" << endl; return maxStep - minStep; } int SpectrogramLayer::getCurrentVerticalZoomStep() const { if (!m_model) return 0; double dmin, dmax; getDisplayExtents(dmin, dmax); SpectrogramRangeMapper mapper(m_model->getSampleRate(), getFFTSize()); int n = mapper.getPositionForValue(dmax - dmin); // SVDEBUG << "SpectrogramLayer::getCurrentVerticalZoomStep: " << n << endl; return n; } void SpectrogramLayer::setVerticalZoomStep(int step) { if (!m_model) return; double dmin = m_minFrequency, dmax = m_maxFrequency; // getDisplayExtents(dmin, dmax); // cerr << "current range " << dmin << " -> " << dmax << ", range " << dmax-dmin << ", mid " << (dmax + dmin)/2 << endl; sv_samplerate_t sr = m_model->getSampleRate(); SpectrogramRangeMapper mapper(sr, getFFTSize()); double newdist = mapper.getValueForPosition(step); double newmin, newmax; if (m_binScale == BinScale::Log) { // need to pick newmin and newmax such that // // (log(newmin) + log(newmax)) / 2 == logmid // and // newmax - newmin = newdist // // so log(newmax - newdist) + log(newmax) == 2logmid // log(newmax(newmax - newdist)) == 2logmid // newmax.newmax - newmax.newdist == exp(2logmid) // newmax^2 + (-newdist)newmax + -exp(2logmid) == 0 // quadratic with a = 1, b = -newdist, c = -exp(2logmid), all known // // positive root // newmax = (newdist + sqrt(newdist^2 + 4exp(2logmid))) / 2 // // but logmid = (log(dmin) + log(dmax)) / 2 // so exp(2logmid) = exp(log(dmin) + log(dmax)) // = exp(log(dmin.dmax)) // = dmin.dmax // so newmax = (newdist + sqrtf(newdist^2 + 4dmin.dmax)) / 2 newmax = (newdist + sqrt(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; } else { double dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } double mmin, mmax; mmin = 0; mmax = double(sr) / 2; if (newmin < mmin) { newmax += (mmin - newmin); newmin = mmin; } if (newmax > mmax) { newmax = mmax; } // SVDEBUG << "SpectrogramLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; setMinFrequency(int(lrint(newmin))); setMaxFrequency(int(lrint(newmax))); } RangeMapper * SpectrogramLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; return new SpectrogramRangeMapper(m_model->getSampleRate(), getFFTSize()); } void SpectrogramLayer::updateMeasureRectYCoords(LayerGeometryProvider *v, const MeasureRect &r) const { int y0 = 0; if (r.startY > 0.0) y0 = int(getYForFrequency(v, r.startY)); int y1 = y0; if (r.endY > 0.0) y1 = int(getYForFrequency(v, r.endY)); // SVDEBUG << "SpectrogramLayer::updateMeasureRectYCoords: start " << r.startY << " -> " << y0 << ", end " << r.endY << " -> " << y1 << endl; r.pixrect = QRect(r.pixrect.x(), y0, r.pixrect.width(), y1 - y0); } void SpectrogramLayer::setMeasureRectYCoord(LayerGeometryProvider *v, MeasureRect &r, bool start, int y) const { if (start) { r.startY = getFrequencyForY(v, y); r.endY = r.startY; } else { r.endY = getFrequencyForY(v, y); } // SVDEBUG << "SpectrogramLayer::setMeasureRectYCoord: start " << r.startY << " <- " << y << ", end " << r.endY << " <- " << y << endl; } void SpectrogramLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; s += QString("channel=\"%1\" " "windowSize=\"%2\" " "windowHopLevel=\"%3\" " "gain=\"%4\" " "threshold=\"%5\" ") .arg(m_channel) .arg(m_windowSize) .arg(m_windowHopLevel) .arg(m_gain) .arg(m_threshold); s += QString("minFrequency=\"%1\" " "maxFrequency=\"%2\" " "colourScale=\"%3\" " "colourScheme=\"%4\" " "colourRotation=\"%5\" " "frequencyScale=\"%6\" " "binDisplay=\"%7\" ") .arg(m_minFrequency) .arg(m_maxFrequency) .arg(convertFromColourScale(m_colourScale, m_colourScaleMultiple)) .arg(m_colourMap) .arg(m_colourRotation) .arg(int(m_binScale)) .arg(int(m_binDisplay)); // New-style normalization attributes, allowing for more types of // normalization in future: write out the column normalization // type separately, and then whether we are normalizing visible // area as well afterwards s += QString("columnNormalization=\"%1\" ") .arg(m_normalization == ColumnNormalization::Max1 ? "peak" : m_normalization == ColumnNormalization::Hybrid ? "hybrid" : "none"); // Old-style normalization attribute. We *don't* write out // normalizeHybrid here because the only release that would accept // it (Tony v1.0) has a totally different scale factor for // it. We'll just have to accept that session files from Tony // v2.0+ will look odd in Tony v1.0 s += QString("normalizeColumns=\"%1\" ") .arg(m_normalization == ColumnNormalization::Max1 ? "true" : "false"); // And this applies to both old- and new-style attributes s += QString("normalizeVisibleArea=\"%1\" ") .arg(m_normalizeVisibleArea ? "true" : "false"); Layer::toXml(stream, indent, extraAttributes + " " + s); } void SpectrogramLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false; int channel = attributes.value("channel").toInt(&ok); if (ok) setChannel(channel); int windowSize = attributes.value("windowSize").toUInt(&ok); if (ok) setWindowSize(windowSize); int windowHopLevel = attributes.value("windowHopLevel").toUInt(&ok); if (ok) setWindowHopLevel(windowHopLevel); else { int windowOverlap = attributes.value("windowOverlap").toUInt(&ok); // a percentage value if (ok) { if (windowOverlap == 0) setWindowHopLevel(0); else if (windowOverlap == 25) setWindowHopLevel(1); else if (windowOverlap == 50) setWindowHopLevel(2); else if (windowOverlap == 75) setWindowHopLevel(3); else if (windowOverlap == 90) setWindowHopLevel(4); } } float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); float threshold = attributes.value("threshold").toFloat(&ok); if (ok) setThreshold(threshold); int minFrequency = attributes.value("minFrequency").toUInt(&ok); if (ok) { SVDEBUG << "SpectrogramLayer::setProperties: setting min freq to " << minFrequency << endl; setMinFrequency(minFrequency); } int maxFrequency = attributes.value("maxFrequency").toUInt(&ok); if (ok) { SVDEBUG << "SpectrogramLayer::setProperties: setting max freq to " << maxFrequency << endl; setMaxFrequency(maxFrequency); } auto colourScale = convertToColourScale (attributes.value("colourScale").toInt(&ok)); if (ok) { setColourScale(colourScale.first); setColourScaleMultiple(colourScale.second); } int colourMap = attributes.value("colourScheme").toInt(&ok); if (ok) setColourMap(colourMap); int colourRotation = attributes.value("colourRotation").toInt(&ok); if (ok) setColourRotation(colourRotation); BinScale binScale = (BinScale) attributes.value("frequencyScale").toInt(&ok); if (ok) setBinScale(binScale); BinDisplay binDisplay = (BinDisplay) attributes.value("binDisplay").toInt(&ok); if (ok) setBinDisplay(binDisplay); bool haveNewStyleNormalization = false; QString columnNormalization = attributes.value("columnNormalization"); if (columnNormalization != "") { haveNewStyleNormalization = true; if (columnNormalization == "peak") { setNormalization(ColumnNormalization::Max1); } else if (columnNormalization == "hybrid") { setNormalization(ColumnNormalization::Hybrid); } else if (columnNormalization == "none") { setNormalization(ColumnNormalization::None); } else { cerr << "NOTE: Unknown or unsupported columnNormalization attribute \"" << columnNormalization << "\"" << endl; } } if (!haveNewStyleNormalization) { bool normalizeColumns = (attributes.value("normalizeColumns").trimmed() == "true"); if (normalizeColumns) { setNormalization(ColumnNormalization::Max1); } bool normalizeHybrid = (attributes.value("normalizeHybrid").trimmed() == "true"); if (normalizeHybrid) { setNormalization(ColumnNormalization::Hybrid); } } bool normalizeVisibleArea = (attributes.value("normalizeVisibleArea").trimmed() == "true"); setNormalizeVisibleArea(normalizeVisibleArea); if (!haveNewStyleNormalization && m_normalization == ColumnNormalization::Hybrid) { // Tony v1.0 is (and hopefully will remain!) the only released // SV-a-like to use old-style attributes when saving sessions // that ask for hybrid normalization. It saves them with the // wrong gain factor, so hack in a fix for that here -- this // gives us backward but not forward compatibility. setGain(m_gain / float(getFFTSize() / 2)); } } sonic-visualiser-3.0.3/svgui/layer/SpectrogramLayer.h0000644000000000000000000002753613111512442021056 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SPECTROGRAM_LAYER_H #define SPECTROGRAM_LAYER_H #include "SliceableLayer.h" #include "base/Window.h" #include "base/MagnitudeRange.h" #include "base/RealTime.h" #include "base/Thread.h" #include "base/PropertyContainer.h" #include "data/model/PowerOfSqrtTwoZoomConstraint.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/FFTModel.h" #include "VerticalBinLayer.h" #include "ColourScale.h" #include "Colour3DPlotRenderer.h" #include #include #include #include class View; class QPainter; class QImage; class QPixmap; class QTimer; class FFTModel; class Dense3DModelPeakCache; /** * SpectrogramLayer represents waveform data (obtained from a * DenseTimeValueModel) in spectrogram form. */ class SpectrogramLayer : public VerticalBinLayer, public PowerOfSqrtTwoZoomConstraint { Q_OBJECT public: enum Configuration { FullRangeDb, MelodicRange, MelodicPeaks }; SpectrogramLayer(Configuration = FullRangeDb); ~SpectrogramLayer(); virtual const ZoomConstraint *getZoomConstraint() const { return this; } virtual const Model *getModel() const { return m_model; } virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual void setSynchronousPainting(bool synchronous); virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool detailed, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool detailed, QPainter &paint, QRect rect) const; virtual bool getCrosshairExtents(LayerGeometryProvider *, QPainter &, QPoint cursorPos, std::vector &extents) const; virtual void paintCrosshairs(LayerGeometryProvider *, QPainter &, QPoint) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void measureDoubleClick(LayerGeometryProvider *, QMouseEvent *); virtual bool hasLightBackground() const; void setModel(const DenseTimeValueModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual QString getPropertyValueIconName(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); /** * Specify the channel to use from the source model. * A value of -1 means to mix all available channels. * The default is channel 0. */ void setChannel(int); int getChannel() const; void setWindowSize(int); int getWindowSize() const; void setWindowHopLevel(int level); int getWindowHopLevel() const; void setWindowType(WindowType type); WindowType getWindowType() const; /** * Set the gain multiplier for sample values in this view. * The default is 1.0. */ void setGain(float gain); float getGain() const; /** * Set the threshold for sample values to qualify for being shown * in the FFT, in voltage units. * * The default is 10^-8 (-80dB). */ void setThreshold(float threshold); float getThreshold() const; void setMinFrequency(int); int getMinFrequency() const; void setMaxFrequency(int); // 0 -> no maximum int getMaxFrequency() const; /** * Specify the scale for sample levels. See ColourScale and * WaveformLayer for comparison and details of meter and dB * scaling. The default is LogColourScale. */ void setColourScale(ColourScaleType); ColourScaleType getColourScale() const; /** * Specify multiple factor for colour scale. This is 2.0 for * log-power spectrogram and 1.0 otherwise. */ void setColourScaleMultiple(double); double getColourScaleMultiple() const; /** * Specify the scale for the y axis. */ void setBinScale(BinScale); BinScale getBinScale() const; /** * Specify the processing of frequency bins for the y axis. */ void setBinDisplay(BinDisplay); BinDisplay getBinDisplay() const; /** * Specify the normalization mode for individual columns. */ void setNormalization(ColumnNormalization); ColumnNormalization getNormalization() const; /** * Specify whether to normalize the visible area. */ void setNormalizeVisibleArea(bool); bool getNormalizeVisibleArea() const; /** * Specify the colour map. See ColourMapper for the colour map * values. */ void setColourMap(int map); int getColourMap() const; /** * Specify the colourmap rotation for the colour scale. */ void setColourRotation(int); int getColourRotation() const; virtual VerticalPosition getPreferredFrameCountPosition() const { return PositionTop; } virtual bool isLayerOpaque() const { return true; } virtual ColourSignificance getLayerColourSignificance() const { return ColourHasMeaningfulValue; } double getYForFrequency(const LayerGeometryProvider *v, double frequency) const; double getFrequencyForY(const LayerGeometryProvider *v, int y) const; //!!! VerticalBinLayer methods. Note overlap with get*BinRange() double getYForBin(const LayerGeometryProvider *, double bin) const; double getBinForY(const LayerGeometryProvider *, double y) const; virtual int getCompletion(LayerGeometryProvider *v) const; virtual QString getError(LayerGeometryProvider *v) const; virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual bool setDisplayExtents(double min, double max); virtual bool getYScaleValue(const LayerGeometryProvider *, int, double &, QString &) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); virtual void setLayerDormant(const LayerGeometryProvider *v, bool dormant); virtual bool isLayerScrollable(const LayerGeometryProvider *) const; virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual const Model *getSliceableModel() const; protected slots: void cacheInvalid(); void cacheInvalid(sv_frame_t startFrame, sv_frame_t endFrame); void preferenceChanged(PropertyContainer::PropertyName name); protected: const DenseTimeValueModel *m_model; // I do not own this int m_channel; int m_windowSize; WindowType m_windowType; int m_windowHopLevel; float m_gain; float m_initialGain; float m_threshold; float m_initialThreshold; int m_colourRotation; int m_initialRotation; int m_minFrequency; int m_maxFrequency; int m_initialMaxFrequency; ColourScaleType m_colourScale; double m_colourScaleMultiple; int m_colourMap; mutable QColor m_crosshairColour; BinScale m_binScale; BinDisplay m_binDisplay; ColumnNormalization m_normalization; // of individual columns bool m_normalizeVisibleArea; int m_lastEmittedZoomStep; bool m_synchronous; mutable bool m_haveDetailedScale; static std::pair convertToColourScale(int value); static int convertFromColourScale(ColourScaleType type, double multiple); static std::pair convertToColumnNorm(int value); static int convertFromColumnNorm(ColumnNormalization norm, bool visible); bool m_exiting; int getColourScaleWidth(QPainter &) const; void illuminateLocalFeatures(LayerGeometryProvider *v, QPainter &painter) const; double getEffectiveMinFrequency() const; double getEffectiveMaxFrequency() const; bool getXBinRange(LayerGeometryProvider *v, int x, double &windowMin, double &windowMax) const; bool getYBinRange(LayerGeometryProvider *v, int y, double &freqBinMin, double &freqBinMax) const; bool getYBinSourceRange(LayerGeometryProvider *v, int y, double &freqMin, double &freqMax) const; bool getAdjustedYBinSourceRange(LayerGeometryProvider *v, int x, int y, double &freqMin, double &freqMax, double &adjFreqMin, double &adjFreqMax) const; bool getXBinSourceRange(LayerGeometryProvider *v, int x, RealTime &timeMin, RealTime &timeMax) const; bool getXYBinSourceRange(LayerGeometryProvider *v, int x, int y, double &min, double &max, double &phaseMin, double &phaseMax) const; int getWindowIncrement() const { if (m_windowHopLevel == 0) return m_windowSize; else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4; else return m_windowSize / (1 << (m_windowHopLevel - 1)); } int getFFTOversampling() const; int getFFTSize() const; // m_windowSize * getFFTOversampling() FFTModel *m_fftModel; FFTModel *getFFTModel() const { return m_fftModel; } Dense3DModelPeakCache *m_wholeCache; Dense3DModelPeakCache *m_peakCache; Dense3DModelPeakCache *getPeakCache() const { return m_peakCache; } const int m_peakCacheDivisor; bool canStoreWholeCache() const; void recreateFFTModel(); typedef std::map ViewMagMap; // key is view id mutable ViewMagMap m_viewMags; mutable ViewMagMap m_lastRenderedMags; // when in normalizeVisibleArea mode void invalidateMagnitudes(); typedef std::map ViewRendererMap; // key is view id mutable ViewRendererMap m_renderers; Colour3DPlotRenderer *getRenderer(LayerGeometryProvider *) const; void invalidateRenderers(); void deleteDerivedModels(); void paintWithRenderer(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; void paintDetailedScale(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; void paintDetailedScalePhase(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual void updateMeasureRectYCoords(LayerGeometryProvider *v, const MeasureRect &r) const; virtual void setMeasureRectYCoord(LayerGeometryProvider *v, MeasureRect &r, bool start, int y) const; }; #endif sonic-visualiser-3.0.3/svgui/layer/SpectrumLayer.cpp0000644000000000000000000004762313111512442020724 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SpectrumLayer.h" #include "data/model/FFTModel.h" #include "view/View.h" #include "base/AudioLevel.h" #include "base/Preferences.h" #include "base/RangeMapper.h" #include "base/Pitch.h" #include "base/Strings.h" #include "ColourMapper.h" #include "PaintAssistant.h" #include #include SpectrumLayer::SpectrumLayer() : m_originModel(0), m_channel(-1), m_channelSet(false), m_windowSize(4096), m_windowType(HanningWindow), m_windowHopLevel(3), m_showPeaks(false), m_newFFTNeeded(true) { Preferences *prefs = Preferences::getInstance(); connect(prefs, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); setWindowType(prefs->getWindowType()); setBinScale(LogBins); } SpectrumLayer::~SpectrumLayer() { Model *m = const_cast (static_cast(m_sliceableModel)); if (m) m->aboutToDelete(); m_sliceableModel = 0; delete m; } void SpectrumLayer::setModel(DenseTimeValueModel *model) { SVDEBUG << "SpectrumLayer::setModel(" << model << ") from " << m_originModel << endl; if (m_originModel == model) return; m_originModel = model; if (m_sliceableModel) { Model *m = const_cast (static_cast(m_sliceableModel)); m->aboutToDelete(); setSliceableModel(0); delete m; } m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setChannel(int channel) { SVDEBUG << "SpectrumLayer::setChannel(" << channel << ") from " << m_channel << endl; m_channelSet = true; if (m_channel == channel) return; m_channel = channel; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setupFFT() { if (m_sliceableModel) { Model *m = const_cast (static_cast(m_sliceableModel)); m->aboutToDelete(); setSliceableModel(0); delete m; } if (!m_originModel) { return; } FFTModel *newFFT = new FFTModel(m_originModel, m_channel, m_windowType, m_windowSize, getWindowIncrement(), m_windowSize); setSliceableModel(newFFT); m_biasCurve.clear(); for (int i = 0; i < m_windowSize; ++i) { m_biasCurve.push_back(1.f / (float(m_windowSize)/2.f)); } m_newFFTNeeded = false; } Layer::PropertyList SpectrumLayer::getProperties() const { PropertyList list = SliceLayer::getProperties(); list.push_back("Window Size"); list.push_back("Window Increment"); list.push_back("Show Peak Frequencies"); return list; } QString SpectrumLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Window Size") return tr("Window Size"); if (name == "Window Increment") return tr("Window Overlap"); if (name == "Show Peak Frequencies") return tr("Show Peak Frequencies"); return SliceLayer::getPropertyLabel(name); } QString SpectrumLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Show Peak Frequencies") return "show-peaks"; return SliceLayer::getPropertyIconName(name); } Layer::PropertyType SpectrumLayer::getPropertyType(const PropertyName &name) const { if (name == "Window Size") return ValueProperty; if (name == "Window Increment") return ValueProperty; if (name == "Show Peak Frequencies") return ToggleProperty; return SliceLayer::getPropertyType(name); } QString SpectrumLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Window Size" || name == "Window Increment") return tr("Window"); if (name == "Show Peak Frequencies") return tr("Bins"); return SliceLayer::getPropertyGroupName(name); } int SpectrumLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Window Size") { *min = 0; *max = 15; *deflt = 5; val = 0; int ws = m_windowSize; while (ws > 32) { ws >>= 1; val ++; } } else if (name == "Window Increment") { *min = 0; *max = 5; *deflt = 2; val = m_windowHopLevel; } else if (name == "Show Peak Frequencies") { return m_showPeaks ? 1 : 0; } else { val = SliceLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SpectrumLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Window Size") { return QString("%1").arg(32 << value); } if (name == "Window Increment") { switch (value) { default: case 0: return tr("None"); case 1: return tr("25 %"); case 2: return tr("50 %"); case 3: return tr("75 %"); case 4: return tr("87.5 %"); case 5: return tr("93.75 %"); } } return SliceLayer::getPropertyValueLabel(name, value); } RangeMapper * SpectrumLayer::getNewPropertyRangeMapper(const PropertyName &name) const { return SliceLayer::getNewPropertyRangeMapper(name); } void SpectrumLayer::setProperty(const PropertyName &name, int value) { if (name == "Window Size") { setWindowSize(32 << value); } else if (name == "Window Increment") { setWindowHopLevel(value); } else if (name == "Show Peak Frequencies") { setShowPeaks(value ? true : false); } else { SliceLayer::setProperty(name, value); } } void SpectrumLayer::setWindowSize(int ws) { if (m_windowSize == ws) return; m_windowSize = ws; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setWindowHopLevel(int v) { if (m_windowHopLevel == v) return; m_windowHopLevel = v; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setWindowType(WindowType w) { if (m_windowType == w) return; m_windowType = w; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setShowPeaks(bool show) { if (m_showPeaks == show) return; m_showPeaks = show; emit layerParametersChanged(); } void SpectrumLayer::preferenceChanged(PropertyContainer::PropertyName name) { if (name == "Window Type") { setWindowType(Preferences::getInstance()->getWindowType()); return; } } double SpectrumLayer::getFrequencyForX(const LayerGeometryProvider *v, double x) const { if (!m_sliceableModel) return 0; double bin = getBinForX(v, x); return (m_sliceableModel->getSampleRate() * bin) / (m_sliceableModel->getHeight() * 2); } double SpectrumLayer::getXForFrequency(const LayerGeometryProvider *v, double freq) const { if (!m_sliceableModel) return 0; double bin = (freq * m_sliceableModel->getHeight() * 2) / m_sliceableModel->getSampleRate(); return getXForBin(v, bin); } bool SpectrumLayer::getXScaleValue(const LayerGeometryProvider *v, int x, double &value, QString &unit) const { value = getFrequencyForX(v, x); unit = "Hz"; return true; } bool SpectrumLayer::getYScaleValue(const LayerGeometryProvider *v, int y, double &value, QString &unit) const { value = getValueForY(v, y); if (m_energyScale == dBScale || m_energyScale == MeterScale) { if (value > 0.0) { value = 10.0 * log10(value); if (value < m_threshold) value = m_threshold; } else value = m_threshold; unit = "dBV"; } else { unit = "V"; } return true; } bool SpectrumLayer::getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1, double &diff, QString &unit) const { bool rv = SliceLayer::getYScaleDifference(v, y0, y1, diff, unit); if (rv && (unit == "dBV")) unit = "dB"; return rv; } bool SpectrumLayer::getCrosshairExtents(LayerGeometryProvider *v, QPainter &paint, QPoint cursorPos, std::vector &extents) const { QRect vertical(cursorPos.x(), cursorPos.y(), 1, v->getPaintHeight() - cursorPos.y()); extents.push_back(vertical); QRect horizontal(0, cursorPos.y(), v->getPaintWidth(), 12); extents.push_back(horizontal); int hoffset = 2; if (m_binScale == LogBins) hoffset = 13; int sw = getVerticalScaleWidth(v, false, paint); QRect value(sw, cursorPos.y() - paint.fontMetrics().ascent() - 2, paint.fontMetrics().width("0.0000001 V") + 2, paint.fontMetrics().height()); extents.push_back(value); QRect log(sw, cursorPos.y() + 2, paint.fontMetrics().width("-80.000 dBV") + 2, paint.fontMetrics().height()); extents.push_back(log); QRect freq(cursorPos.x(), v->getPaintHeight() - paint.fontMetrics().height() - hoffset, paint.fontMetrics().width("123456 Hz") + 2, paint.fontMetrics().height()); extents.push_back(freq); int w(paint.fontMetrics().width("C#10+50c") + 2); QRect pitch(cursorPos.x() - w, v->getPaintHeight() - paint.fontMetrics().height() - hoffset, w, paint.fontMetrics().height()); extents.push_back(pitch); return true; } void SpectrumLayer::paintCrosshairs(LayerGeometryProvider *v, QPainter &paint, QPoint cursorPos) const { if (!m_sliceableModel) return; paint.save(); QFont fn = paint.font(); if (fn.pointSize() > 8) { fn.setPointSize(fn.pointSize() - 1); paint.setFont(fn); } ColourMapper mapper(m_colourMap, 0, 1); paint.setPen(mapper.getContrastingColour()); int xorigin = m_xorigins[v->getId()]; paint.drawLine(xorigin, cursorPos.y(), v->getPaintWidth(), cursorPos.y()); paint.drawLine(cursorPos.x(), cursorPos.y(), cursorPos.x(), v->getPaintHeight()); double fundamental = getFrequencyForX(v, cursorPos.x()); int hoffset = 2; if (m_binScale == LogBins) hoffset = 13; PaintAssistant::drawVisibleText(v, paint, cursorPos.x() + 2, v->getPaintHeight() - 2 - hoffset, QString("%1 Hz").arg(fundamental), PaintAssistant::OutlinedText); if (Pitch::isFrequencyInMidiRange(fundamental)) { QString pitchLabel = Pitch::getPitchLabelForFrequency(fundamental); PaintAssistant::drawVisibleText(v, paint, cursorPos.x() - paint.fontMetrics().width(pitchLabel) - 2, v->getPaintHeight() - 2 - hoffset, pitchLabel, PaintAssistant::OutlinedText); } double value = getValueForY(v, cursorPos.y()); double thresh = m_threshold; double db = thresh; if (value > 0.0) db = 10.0 * log10(value); if (db < thresh) db = thresh; PaintAssistant::drawVisibleText(v, paint, xorigin + 2, cursorPos.y() - 2, QString("%1 V").arg(value), PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(v, paint, xorigin + 2, cursorPos.y() + 2 + paint.fontMetrics().ascent(), QString("%1 dBV").arg(db), PaintAssistant::OutlinedText); int harmonic = 2; while (harmonic < 100) { int hx = int(lrint(getXForFrequency(v, fundamental * harmonic))); if (hx < xorigin || hx > v->getPaintWidth()) break; int len = 7; if (harmonic % 2 == 0) { if (harmonic % 4 == 0) { len = 12; } else { len = 10; } } paint.drawLine(hx, cursorPos.y(), hx, cursorPos.y() + len); ++harmonic; } paint.restore(); } QString SpectrumLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &p) const { if (!m_sliceableModel) return ""; int minbin = 0, maxbin = 0, range = 0; QString genericDesc = SliceLayer::getFeatureDescriptionAux (v, p, false, minbin, maxbin, range); if (genericDesc == "") return ""; int i0 = minbin - m_minbin; int i1 = maxbin - m_minbin; float minvalue = 0.0; if (in_range_for(m_values, i0)) minvalue = m_values[i0]; float maxvalue = minvalue; if (in_range_for(m_values, i1)) maxvalue = m_values[i1]; if (minvalue > maxvalue) std::swap(minvalue, maxvalue); QString binstr; QString hzstr; int minfreq = int(lrint((minbin * m_sliceableModel->getSampleRate()) / m_windowSize)); int maxfreq = int(lrint((std::max(maxbin, minbin) * m_sliceableModel->getSampleRate()) / m_windowSize)); if (maxbin != minbin) { binstr = tr("%1 - %2").arg(minbin+1).arg(maxbin+1); } else { binstr = QString("%1").arg(minbin+1); } if (minfreq != maxfreq) { hzstr = tr("%1 - %2 Hz").arg(minfreq).arg(maxfreq); } else { hzstr = tr("%1 Hz").arg(minfreq); } QString valuestr; if (maxvalue != minvalue) { valuestr = tr("%1 - %2").arg(minvalue).arg(maxvalue); } else { valuestr = QString("%1").arg(minvalue); } QString dbstr; double mindb = AudioLevel::multiplier_to_dB(minvalue); double maxdb = AudioLevel::multiplier_to_dB(maxvalue); QString mindbstr; QString maxdbstr; if (mindb == AudioLevel::DB_FLOOR) { mindbstr = Strings::minus_infinity; } else { mindbstr = QString("%1").arg(lrint(mindb)); } if (maxdb == AudioLevel::DB_FLOOR) { maxdbstr = Strings::minus_infinity; } else { maxdbstr = QString("%1").arg(lrint(maxdb)); } if (lrint(mindb) != lrint(maxdb)) { dbstr = tr("%1 - %2").arg(mindbstr).arg(maxdbstr); } else { dbstr = tr("%1").arg(mindbstr); } QString description; if (range > int(m_sliceableModel->getResolution())) { description = tr("%1\nBin:\t%2 (%3)\n%4 value:\t%5\ndB:\t%6") .arg(genericDesc) .arg(binstr) .arg(hzstr) .arg(m_samplingMode == NearestSample ? tr("First") : m_samplingMode == SampleMean ? tr("Mean") : tr("Peak")) .arg(valuestr) .arg(dbstr); } else { description = tr("%1\nBin:\t%2 (%3)\nValue:\t%4\ndB:\t%5") .arg(genericDesc) .arg(binstr) .arg(hzstr) .arg(valuestr) .arg(dbstr); } return description; } void SpectrumLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_originModel || !m_originModel->isOK() || !m_originModel->isReady()) { SVDEBUG << "SpectrumLayer::paint: no origin model, or origin model not OK or not ready" << endl; return; } if (m_newFFTNeeded) { SVDEBUG << "SpectrumLayer::paint: new FFT needed, calling setupFFT" << endl; const_cast(this)->setupFFT(); //ugh } FFTModel *fft = dynamic_cast (const_cast(m_sliceableModel)); double thresh = (pow(10, -6) / m_gain) * (m_windowSize / 2.0); // -60dB adj int xorigin = getVerticalScaleWidth(v, false, paint) + 1; int w = v->getPaintWidth() - xorigin - 1; int pkh = int(paint.fontMetrics().height() * 0.7 + 0.5); if (pkh < 10) pkh = 10; paint.save(); if (fft && m_showPeaks) { // draw peak lines // SVDEBUG << "Showing peaks..." << endl; int col = int(v->getCentreFrame() / fft->getResolution()); paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); paint.setPen(QColor(160, 160, 160)); //!!! int peakminbin = 0; int peakmaxbin = fft->getHeight() - 1; double peakmaxfreq = Pitch::getFrequencyForPitch(128); peakmaxbin = int(((peakmaxfreq * fft->getHeight() * 2) / fft->getSampleRate())); FFTModel::PeakSet peaks = fft->getPeakFrequencies (FFTModel::MajorPitchAdaptivePeaks, col, peakminbin, peakmaxbin); ColourMapper mapper(ColourMapper::BlackOnWhite, 0, 1); BiasCurve curve; getBiasCurve(curve); int cs = int(curve.size()); std::vector values; for (int bin = 0; bin < fft->getHeight(); ++bin) { double value = m_sliceableModel->getValueAt(col, bin); if (bin < cs) value *= curve[bin]; values.push_back(value); } for (FFTModel::PeakSet::iterator i = peaks.begin(); i != peaks.end(); ++i) { int bin = i->first; // cerr << "bin = " << bin << ", thresh = " << thresh << ", value = " << fft->getMagnitudeAt(col, bin) << endl; if (!fft->isOverThreshold(col, bin, float(thresh))) continue; double freq = i->second; int x = int(lrint(getXForFrequency(v, freq))); double norm = 0.f; (void)getYForValue(v, values[bin], norm); // don't need return value, need norm paint.setPen(mapper.map(norm)); paint.drawLine(xorigin + x, 0, xorigin + x, v->getPaintHeight() - pkh - 1); } paint.restore(); } SliceLayer::paint(v, paint, rect); //!!! All of this stuff relating to depicting frequencies // (keyboard, crosshairs etc) should be applicable to any slice // layer whose model has a vertical scale unit of Hz. However, // the dense 3d model at the moment doesn't record its vertical // scale unit -- we need to fix that and hoist this code as // appropriate. Same really goes for any code in SpectrogramLayer // that could be relevant to Colour3DPlotLayer with unit Hz, but // that's a bigger proposition. int h = v->getPaintHeight(); PianoScale().paintPianoHorizontal (v, this, paint, QRect(xorigin, h - pkh - 1, w + xorigin, pkh)); paint.restore(); } void SpectrumLayer::getBiasCurve(BiasCurve &curve) const { curve = m_biasCurve; } void SpectrumLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s = QString("windowSize=\"%1\" " "windowHopLevel=\"%2\" " "showPeaks=\"%3\" ") .arg(m_windowSize) .arg(m_windowHopLevel) .arg(m_showPeaks ? "true" : "false"); SliceLayer::toXml(stream, indent, extraAttributes + " " + s); } void SpectrumLayer::setProperties(const QXmlAttributes &attributes) { SliceLayer::setProperties(attributes); bool ok = false; int windowSize = attributes.value("windowSize").toUInt(&ok); if (ok) setWindowSize(windowSize); int windowHopLevel = attributes.value("windowHopLevel").toUInt(&ok); if (ok) setWindowHopLevel(windowHopLevel); bool showPeaks = (attributes.value("showPeaks").trimmed() == "true"); setShowPeaks(showPeaks); } sonic-visualiser-3.0.3/svgui/layer/SpectrumLayer.h0000644000000000000000000001125313111512442020357 0ustar 00000000000000 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_SPECTRUM_LAYER_H #define SV_SPECTRUM_LAYER_H #include "SliceLayer.h" #include "base/Window.h" #include "data/model/DenseTimeValueModel.h" #include "PianoScale.h" #include #include class FFTModel; class SpectrumLayer : public SliceLayer, public PianoScale::HorizontalScaleProvider { Q_OBJECT public: SpectrumLayer(); ~SpectrumLayer(); void setModel(DenseTimeValueModel *model); virtual const Model *getModel() const override { return m_originModel; } virtual bool getCrosshairExtents(LayerGeometryProvider *, QPainter &, QPoint cursorPos, std::vector &extents) const override; virtual void paintCrosshairs(LayerGeometryProvider *, QPainter &, QPoint) const override; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const override; virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const override; virtual VerticalPosition getPreferredFrameCountPosition() const override { return PositionTop; } virtual PropertyList getProperties() const override; virtual QString getPropertyLabel(const PropertyName &) const override; virtual QString getPropertyIconName(const PropertyName &) const override; virtual PropertyType getPropertyType(const PropertyName &) const override; virtual QString getPropertyGroupName(const PropertyName &) const override; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const override; virtual QString getPropertyValueLabel(const PropertyName &, int value) const override; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const override; virtual void setProperty(const PropertyName &, int value) override; virtual void setProperties(const QXmlAttributes &) override; virtual bool getXScaleValue(const LayerGeometryProvider *v, int x, double &value, QString &unit) const override; virtual bool getYScaleValue(const LayerGeometryProvider *, int y, double &value, QString &unit) const override; virtual bool getYScaleDifference(const LayerGeometryProvider *, int y0, int y1, double &diff, QString &unit) const override; virtual bool isLayerScrollable(const LayerGeometryProvider *) const override { return false; } void setChannel(int); int getChannel() const { return m_channel; } void setWindowSize(int); int getWindowSize() const { return m_windowSize; } void setWindowHopLevel(int level); int getWindowHopLevel() const { return m_windowHopLevel; } void setWindowType(WindowType type); WindowType getWindowType() const { return m_windowType; } void setShowPeaks(bool); bool getShowPeaks() const { return m_showPeaks; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const override; virtual double getFrequencyForX(const LayerGeometryProvider *, double x) const override; virtual double getXForFrequency(const LayerGeometryProvider *, double freq) const override; protected slots: void preferenceChanged(PropertyContainer::PropertyName name); protected: DenseTimeValueModel *m_originModel; int m_channel; bool m_channelSet; int m_windowSize; WindowType m_windowType; int m_windowHopLevel; bool m_showPeaks; mutable bool m_newFFTNeeded; mutable QMutex m_fftMutex; void setupFFT(); virtual void getBiasCurve(BiasCurve &) const override; BiasCurve m_biasCurve; int getWindowIncrement() const { if (m_windowHopLevel == 0) return m_windowSize; else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4; else return m_windowSize / (1 << (m_windowHopLevel - 1)); } }; #endif sonic-visualiser-3.0.3/svgui/layer/TextLayer.cpp0000644000000000000000000005102613111512442020036 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "TextLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "ColourDatabase.h" #include "view/View.h" #include "data/model/TextModel.h" #include #include #include #include #include #include #include TextLayer::TextLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_originalPoint(0, 0.0, tr("Empty Label")), m_editingPoint(0, 0.0, tr("Empty Label")), m_editingCommand(0) { } void TextLayer::setModel(TextModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); // SVDEBUG << "TextLayer::setModel(" << model << ")" << endl; emit modelReplaced(); } Layer::PropertyList TextLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); return list; } QString TextLayer::getPropertyLabel(const PropertyName &name) const { return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType TextLayer::getPropertyType(const PropertyName &name) const { return SingleColourLayer::getPropertyType(name); } int TextLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { return SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } QString TextLayer::getPropertyValueLabel(const PropertyName &name, int value) const { return SingleColourLayer::getPropertyValueLabel(name, value); } void TextLayer::setProperty(const PropertyName &name, int value) { SingleColourLayer::setProperty(name, value); } bool TextLayer::getValueExtents(double &, double &, bool &, QString &) const { return false; } bool TextLayer::isLayerScrollable(const LayerGeometryProvider *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } TextModel::PointList TextLayer::getLocalPoints(LayerGeometryProvider *v, int x, int y) const { if (!m_model) return TextModel::PointList(); sv_frame_t frame0 = v->getFrameForX(-150); sv_frame_t frame1 = v->getFrameForX(v->getPaintWidth() + 150); TextModel::PointList points(m_model->getPoints(frame0, frame1)); TextModel::PointList rv; QFontMetrics metrics = QFontMetrics(QFont()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { const TextModel::Point &p(*i); int px = v->getXForFrame(p.frame); int py = getYForHeight(v, p.height); QString label = p.label; if (label == "") { label = tr(""); } QRect rect = metrics.boundingRect (QRect(0, 0, 150, 200), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, label); if (py + rect.height() > v->getPaintHeight()) { if (rect.height() > v->getPaintHeight()) py = 0; else py = v->getPaintHeight() - rect.height() - 1; } if (x >= px && x < px + rect.width() && y >= py && y < py + rect.height()) { rv.insert(p); } } return rv; } bool TextLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, TextModel::Point &p) const { if (!m_model) return false; sv_frame_t a = v->getFrameForX(x - 120); sv_frame_t b = v->getFrameForX(x + 10); TextModel::PointList onPoints = m_model->getPoints(a, b); if (onPoints.empty()) return false; double nearestDistance = -1; for (TextModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { double yd = getYForHeight(v, (*i).height) - y; double xd = v->getXForFrame((*i).frame) - x; double distance = sqrt(yd*yd + xd*xd); if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString TextLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; TextModel::PointList points = getLocalPoints(v, x, pos.y()); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return ""; } } sv_frame_t useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nHeight:\t%2\nLabel:\t%3")) .arg(rt.toText(true).c_str()) .arg(points.begin()->height) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), getYForHeight(v, points.begin()->height)); return text; } //!!! too much overlap with TimeValueLayer/TimeInstantLayer bool TextLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); TextModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame), -1); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (TextModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest TextModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } int TextLayer::getYForHeight(LayerGeometryProvider *v, double height) const { int h = v->getPaintHeight(); return h - int(height * h); } double TextLayer::getHeightForY(LayerGeometryProvider *v, int y) const { int h = v->getPaintHeight(); return double(h - y) / h; } void TextLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("TextLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); sv_frame_t frame0 = v->getFrameForX(x0); sv_frame_t frame1 = v->getFrameForX(x1); TextModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; QColor brushColour(getBaseQColor()); int h, s, val; brushColour.getHsv(&h, &s, &val); brushColour.setHsv(h, s, 255, 100); QColor penColour; penColour = v->getForeground(); // SVDEBUG << "TextLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; QPoint localPos; TextModel::Point illuminatePoint(0); bool shouldIlluminate = false; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } int boxMaxWidth = 150; int boxMaxHeight = 200; paint.save(); paint.setClipRect(rect.x(), 0, rect.width() + boxMaxWidth, v->getPaintHeight()); for (TextModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const TextModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForHeight(v, p.height); if (!shouldIlluminate || // "illuminatePoint != p" TextModel::Point::Comparator()(illuminatePoint, p) || TextModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(penColour); paint.setBrush(brushColour); } else { paint.setBrush(penColour); paint.setPen(v->getBackground()); } QString label = p.label; if (label == "") { label = tr(""); } QRect boxRect = paint.fontMetrics().boundingRect (QRect(0, 0, boxMaxWidth, boxMaxHeight), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, label); QRect textRect = QRect(3, 2, boxRect.width(), boxRect.height()); boxRect = QRect(0, 0, boxRect.width() + 6, boxRect.height() + 2); if (y + boxRect.height() > v->getPaintHeight()) { if (boxRect.height() > v->getPaintHeight()) y = 0; else y = v->getPaintHeight() - boxRect.height() - 1; } boxRect = QRect(x, y, boxRect.width(), boxRect.height()); textRect = QRect(x + 3, y + 2, textRect.width(), textRect.height()); // boxRect = QRect(x, y, boxRect.width(), boxRect.height()); // textRect = QRect(x + 3, y + 2, textRect.width(), textRect.height()); paint.setRenderHint(QPainter::Antialiasing, false); paint.drawRect(boxRect); paint.setRenderHint(QPainter::Antialiasing, true); paint.drawText(textRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, label); /// if (p.label != "") { /// paint.drawText(x + 5, y - paint.fontMetrics().height() + paint.fontMetrics().ascent(), p.label); /// } } paint.restore(); // looks like save/restore doesn't deal with this: paint.setRenderHint(QPainter::Antialiasing, false); } void TextLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "TextLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) { SVDEBUG << "TextLayer::drawStart: no model" << endl; return; } sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double height = getHeightForY(v, e->y()); m_editingPoint = TextModel::Point(frame, float(height), ""); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new TextModel::EditCommand(m_model, "Add Label"); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void TextLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "TextLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double height = getHeightForY(v, e->y()); m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.height = float(height); m_editingCommand->addPoint(m_editingPoint); } void TextLayer::drawEnd(LayerGeometryProvider *v, QMouseEvent *) { // SVDEBUG << "TextLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; bool ok = false; QString label = QInputDialog::getText(v->getView(), tr("Enter label"), tr("Please enter a new label:"), QLineEdit::Normal, "", &ok); if (ok) { TextModel::RelabelCommand *command = new TextModel::RelabelCommand(m_model, m_editingPoint, label); m_editingCommand->addCommand(command); } else { m_editingCommand->deletePoint(m_editingPoint); } finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TextLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TextLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } void TextLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; TextModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.height != m_editingPoint.height) return; m_editingCommand = new TextModel::EditCommand (m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TextLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { // SVDEBUG << "TextLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) { return; } m_editOrigin = e->pos(); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TextLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; sv_frame_t frameDiff = v->getFrameForX(e->x()) - v->getFrameForX(m_editOrigin.x()); double heightDiff = getHeightForY(v, e->y()) - getHeightForY(v, m_editOrigin.y()); sv_frame_t frame = m_originalPoint.frame + frameDiff; double height = m_originalPoint.height + heightDiff; // sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = (frame / m_model->getResolution()) * m_model->getResolution(); // double height = getHeightForY(v, e->y()); if (!m_editingCommand) { m_editingCommand = new TextModel::EditCommand(m_model, tr("Drag Label")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.height = float(height); m_editingCommand->addPoint(m_editingPoint); } void TextLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) { // SVDEBUG << "TextLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.height != m_originalPoint.height) { newName = tr("Move Label"); } else { newName = tr("Move Label Horizontally"); } } else { newName = tr("Move Label Vertically"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool TextLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return false; TextModel::Point text(0); if (!getPointToDrag(v, e->x(), e->y(), text)) return false; QString label = text.label; bool ok = false; label = QInputDialog::getText(v->getView(), tr("Enter label"), tr("Please enter a new label:"), QLineEdit::Normal, label, &ok); if (ok && label != text.label) { TextModel::RelabelCommand *command = new TextModel::RelabelCommand(m_model, text, label); CommandHistory::getInstance()->addCommand(command); } return true; } void TextLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Drag Selection")); TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { TextModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TextLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Resize Selection")); TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = double(i->frame); target = double(newSize.getStartFrame()) + target - double(s.getStartFrame()) * ratio; TextModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TextLayer::deleteSelection(Selection s) { if (!m_model) return; TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Delete Selection")); TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) command->deletePoint(*i); } finish(command); } void TextLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->height, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool TextLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Paste")); double valueMin = 0.0, valueMax = 1.0; for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->haveValue()) { if (i->getValue() < valueMin) valueMin = i->getValue(); if (i->getValue() > valueMax) valueMax = i->getValue(); } } if (valueMax < valueMin + 1.0) valueMax = valueMin + 1.0; for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } TextModel::Point newPoint(frame); if (i->haveValue()) { newPoint.height = float((i->getValue() - valueMin) / (valueMax - valueMin)); } else { newPoint.height = 0.5f; } if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } else { newPoint.label = tr("New Point"); } command->addPoint(newPoint); } finish(command); return true; } int TextLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Orange" : "Orange")); } void TextLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes); } void TextLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); } sonic-visualiser-3.0.3/svgui/layer/TextLayer.h0000644000000000000000000001026513111512442017503 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_LAYER_H_ #define _TEXT_LAYER_H_ #include "SingleColourLayer.h" #include "data/model/TextModel.h" #include #include class View; class QPainter; class TextLayer : public SingleColourLayer { Q_OBJECT public: TextLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); virtual bool editOpen(LayerGeometryProvider *, QMouseEvent *); // on double-click virtual const Model *getModel() const { return m_model; } void setModel(TextModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const; virtual int getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &) const { return 0; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); protected: int getYForHeight(LayerGeometryProvider *v, double height) const; double getHeightForY(LayerGeometryProvider *v, int y) const; virtual int getDefaultColourHint(bool dark, bool &impose); TextModel::PointList getLocalPoints(LayerGeometryProvider *v, int x, int y) const; bool getPointToDrag(LayerGeometryProvider *v, int x, int y, TextModel::Point &) const; TextModel *m_model; bool m_editing; QPoint m_editOrigin; TextModel::Point m_originalPoint; TextModel::Point m_editingPoint; TextModel::EditCommand *m_editingCommand; void finish(TextModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/TimeInstantLayer.cpp0000644000000000000000000005343313111512442021355 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "TimeInstantLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "view/View.h" #include "base/Profiler.h" #include "base/Clipboard.h" #include "ColourDatabase.h" #include "PaintAssistant.h" #include "data/model/SparseOneDimensionalModel.h" #include "widgets/ItemEditDialog.h" #include "widgets/ListInputDialog.h" #include #include #include #include #include #include //#define DEBUG_TIME_INSTANT_LAYER 1 TimeInstantLayer::TimeInstantLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_editingPoint(0, tr("New Point")), m_editingCommand(0), m_plotStyle(PlotInstants) { } TimeInstantLayer::~TimeInstantLayer() { } void TimeInstantLayer::setModel(SparseOneDimensionalModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::setModel(" << model << ")" << endl; #endif if (m_model && m_model->getRDFTypeURI().endsWith("Segment")) { setPlotStyle(PlotSegmentation); } emit modelReplaced(); } Layer::PropertyList TimeInstantLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Plot Type"); return list; } QString TimeInstantLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Plot Type") return tr("Plot Type"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType TimeInstantLayer::getPropertyType(const PropertyName &name) const { if (name == "Plot Type") return ValueProperty; return SingleColourLayer::getPropertyType(name); } int TimeInstantLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Plot Type") { if (min) *min = 0; if (max) *max = 1; if (deflt) *deflt = 0; val = int(m_plotStyle); } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString TimeInstantLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Plot Type") { switch (value) { default: case 0: return tr("Instants"); case 1: return tr("Segmentation"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void TimeInstantLayer::setProperty(const PropertyName &name, int value) { if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else { SingleColourLayer::setProperty(name, value); } } void TimeInstantLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; m_plotStyle = style; emit layerParametersChanged(); } bool TimeInstantLayer::isLayerScrollable(const LayerGeometryProvider *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } SparseOneDimensionalModel::PointList TimeInstantLayer::getLocalPoints(LayerGeometryProvider *v, int x) const { // Return a set of points that all have the same frame number, the // nearest to the given x coordinate, and that are within a // certain fuzz distance of that x coordinate. if (!m_model) return SparseOneDimensionalModel::PointList(); sv_frame_t frame = v->getFrameForX(x); SparseOneDimensionalModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } SparseOneDimensionalModel::PointList prevPoints = m_model->getPreviousPoints(frame); SparseOneDimensionalModel::PointList nextPoints = m_model->getNextPoints(frame); SparseOneDimensionalModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (long(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (nextPoints.begin()->frame - frame < frame - prevPoints.begin()->frame) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } QString TimeInstantLayer::getLabelPreceding(sv_frame_t frame) const { if (!m_model) return ""; SparseOneDimensionalModel::PointList points = m_model->getPreviousPoints(frame); for (SparseOneDimensionalModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->label != "") return i->label; } return ""; } QString TimeInstantLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; SparseOneDimensionalModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } sv_frame_t useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nNo label")) .arg(rt.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nLabel:\t%2")) .arg(rt.toText(true).c_str()) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), pos.y()); return text; } bool TimeInstantLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); SparseOneDimensionalModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (SparseOneDimensionalModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame >= frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest SparseOneDimensionalModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } void TimeInstantLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; // Profiler profiler("TimeInstantLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); sv_frame_t frame0 = v->getFrameForX(x0); sv_frame_t frame1 = v->getFrameForX(x1); SparseOneDimensionalModel::PointList points(m_model->getPoints (frame0, frame1)); bool odd = false; if (m_plotStyle == PlotSegmentation && !points.empty()) { int index = m_model->getIndexOf(*points.begin()); odd = ((index % 2) == 1); } paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(100); paint.setBrush(brushColour); QColor oddBrushColour(brushColour); if (m_plotStyle == PlotSegmentation) { if (getBaseQColor() == Qt::black) { oddBrushColour = Qt::gray; } else if (getBaseQColor() == Qt::darkRed) { oddBrushColour = Qt::red; } else if (getBaseQColor() == Qt::darkBlue) { oddBrushColour = Qt::blue; } else if (getBaseQColor() == Qt::darkGreen) { oddBrushColour = Qt::green; } else { oddBrushColour = oddBrushColour.light(150); } oddBrushColour.setAlpha(100); } // SVDEBUG << "TimeInstantLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; QPoint localPos; sv_frame_t illuminateFrame = -1; if (v->shouldIlluminateLocalFeatures(this, localPos)) { SparseOneDimensionalModel::PointList localPoints = getLocalPoints(v, localPos.x()); if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame; } int prevX = -1; int textY = v->getTextLabelHeight(this, paint); for (SparseOneDimensionalModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const SparseOneDimensionalModel::Point &p(*i); SparseOneDimensionalModel::PointList::const_iterator j = i; ++j; int x = v->getXForFrame(p.frame); if (x == prevX && m_plotStyle == PlotInstants && p.frame != illuminateFrame) continue; int iw = v->getXForFrame(p.frame + m_model->getResolution()) - x; if (iw < 2) { if (iw < 1) { iw = 2; if (j != points.end()) { int nx = v->getXForFrame(j->frame); if (nx < x + 3) iw = 1; } } else { iw = 2; } } if (p.frame == illuminateFrame) { paint.setPen(getForegroundQColor(v->getView())); } else { paint.setPen(brushColour); } if (m_plotStyle == PlotInstants) { if (iw > 1) { paint.drawRect(x, 0, iw - 1, v->getPaintHeight() - 1); } else { paint.drawLine(x, 0, x, v->getPaintHeight() - 1); } } else { if (odd) paint.setBrush(oddBrushColour); else paint.setBrush(brushColour); int nx; if (j != points.end()) { const SparseOneDimensionalModel::Point &q(*j); nx = v->getXForFrame(q.frame); } else { nx = v->getXForFrame(m_model->getEndFrame()); } if (nx >= x) { if (illuminateFrame != p.frame && (nx < x + 5 || x >= v->getPaintWidth() - 1)) { paint.setPen(Qt::NoPen); } paint.drawRect(x, -1, nx - x, v->getPaintHeight() + 1); } odd = !odd; } paint.setPen(getBaseQColor()); if (p.label != "") { // only draw if there's enough room from here to the next point int lw = paint.fontMetrics().width(p.label); bool good = true; if (j != points.end()) { int nx = v->getXForFrame(j->frame); if (nx >= x && nx - x - iw - 3 <= lw) good = false; } if (good) { PaintAssistant::drawVisibleText(v, paint, x + iw + 2, textY, p.label, PaintAssistant::OutlinedText); // paint.drawText(x + iw + 2, textY, p.label); } } prevX = x; } } void TimeInstantLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::drawStart(" << e->x() << ")" << endl; #endif if (!m_model) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingPoint = SparseOneDimensionalModel::Point(frame, tr("New Point")); if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new SparseOneDimensionalModel::EditCommand(m_model, tr("Draw Point")); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void TimeInstantLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::drawDrag(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void TimeInstantLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::drawEnd(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; QString newName = tr("Add Point at %1 s") .arg(RealTime::frame2RealTime(m_editingPoint.frame, m_model->getSampleRate()) .toText(false).c_str()); m_editingCommand->setName(newName); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeInstantLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeInstantLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } void TimeInstantLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; if (points.begin()->frame != m_editingPoint.frame) return; m_editingCommand = new SparseOneDimensionalModel::EditCommand (m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeInstantLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::editStart(" << e->x() << ")" << endl; #endif if (!m_model) return; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeInstantLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::editDrag(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); if (!m_editingCommand) { m_editingCommand = new SparseOneDimensionalModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void TimeInstantLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::editEnd(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = tr("Move Point to %1 s") .arg(RealTime::frame2RealTime(m_editingPoint.frame, m_model->getSampleRate()) .toText(false).c_str()); m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool TimeInstantLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return false; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return false; SparseOneDimensionalModel::Point point = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowText); dialog->setFrameTime(point.frame); dialog->setText(point.label); if (dialog->exec() == QDialog::Accepted) { SparseOneDimensionalModel::Point newPoint = point; newPoint.frame = dialog->getFrameTime(); newPoint.label = dialog->getText(); SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Edit Point")); command->deletePoint(point); command->addPoint(newPoint); finish(command); } delete dialog; return true; } void TimeInstantLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Drag Selection")); SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { SparseOneDimensionalModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeInstantLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Resize Selection")); SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = double(i->frame); target = double(newSize.getStartFrame()) + target - double(s.getStartFrame()) * ratio; SparseOneDimensionalModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeInstantLayer::deleteSelection(Selection s) { if (!m_model) return; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Delete Selection")); SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) command->deletePoint(*i); } finish(command); } void TimeInstantLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool TimeInstantLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted instants?"), tr("The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } if (frameOffset > 0) frame += frameOffset; else if (frameOffset < 0) { if (frame > -frameOffset) frame += frameOffset; else frame = 0; } SparseOneDimensionalModel::Point newPoint(frame); if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } command->addPoint(newPoint); } finish(command); return true; } int TimeInstantLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Purple" : "Purple")); } void TimeInstantLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" plotStyle=\"%1\"") .arg(m_plotStyle)); } void TimeInstantLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok; PlotStyle style = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(style); } sonic-visualiser-3.0.3/svgui/layer/TimeInstantLayer.h0000644000000000000000000001123013111512442021007 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TIME_INSTANT_LAYER_H_ #define _TIME_INSTANT_LAYER_H_ #include "SingleColourLayer.h" #include "data/model/SparseOneDimensionalModel.h" #include #include class View; class QPainter; class TimeInstantLayer : public SingleColourLayer { Q_OBJECT public: TimeInstantLayer(); virtual ~TimeInstantLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual QString getLabelPreceding(sv_frame_t) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual bool editOpen(LayerGeometryProvider *, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(SparseOneDimensionalModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); enum PlotStyle { PlotInstants, PlotSegmentation }; void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool needsTextLabelHeight() const { return m_model->hasTextLabels(); } virtual bool getValueExtents(double &, double &, bool &, QString &) const { return false; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); virtual ColourSignificance getLayerColourSignificance() const { if (m_plotStyle == PlotSegmentation) { return ColourHasMeaningfulValue; } else { return ColourDistinguishes; } } virtual int getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &) const { return 0; } protected: SparseOneDimensionalModel::PointList getLocalPoints(LayerGeometryProvider *v, int) const; virtual int getDefaultColourHint(bool dark, bool &impose); bool clipboardAlignmentDiffers(LayerGeometryProvider *v, const Clipboard &) const; SparseOneDimensionalModel *m_model; bool m_editing; SparseOneDimensionalModel::Point m_editingPoint; SparseOneDimensionalModel::EditCommand *m_editingCommand; PlotStyle m_plotStyle; void finish(SparseOneDimensionalModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/TimeRulerLayer.cpp0000644000000000000000000002630413111512442021023 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "TimeRulerLayer.h" #include "LayerFactory.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "view/View.h" #include "ColourDatabase.h" #include "PaintAssistant.h" #include #include #include #include //#define DEBUG_TIME_RULER_LAYER 1 TimeRulerLayer::TimeRulerLayer() : SingleColourLayer(), m_model(0), m_labelHeight(LabelTop) { } void TimeRulerLayer::setModel(Model *model) { if (m_model == model) return; m_model = model; emit modelReplaced(); } bool TimeRulerLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { resolution = 1; return false; } bool q; int tick = getMajorTickSpacing(v, q); RealTime rtick = RealTime::fromMilliseconds(tick); sv_samplerate_t rate = m_model->getSampleRate(); RealTime rt = RealTime::frame2RealTime(frame, rate); double ratio = rt / rtick; int rounded = int(ratio); RealTime rdrt = rtick * rounded; sv_frame_t left = RealTime::realTime2Frame(rdrt, rate); resolution = int(RealTime::realTime2Frame(rtick, rate)); sv_frame_t right = left + resolution; // SVDEBUG << "TimeRulerLayer::snapToFeatureFrame: type " // << int(snap) << ", frame " << frame << " (time " // << rt << ", tick " << rtick << ", rounded " << rdrt << ") "; switch (snap) { case SnapLeft: frame = left; break; case SnapRight: frame = right; break; case SnapNearest: { if (llabs(frame - left) > llabs(right - frame)) { frame = right; } else { frame = left; } break; } case SnapNeighbouring: { int dl = -1, dr = -1; int x = v->getXForFrame(frame); if (left > v->getStartFrame() && left < v->getEndFrame()) { dl = abs(v->getXForFrame(left) - x); } if (right > v->getStartFrame() && right < v->getEndFrame()) { dr = abs(v->getXForFrame(right) - x); } int fuzz = 2; if (dl >= 0 && dr >= 0) { if (dl < dr) { if (dl <= fuzz) { frame = left; } } else { if (dr < fuzz) { frame = right; } } } else if (dl >= 0) { if (dl <= fuzz) { frame = left; } } else if (dr >= 0) { if (dr <= fuzz) { frame = right; } } } } // SVDEBUG << " -> " << frame << " (resolution = " << resolution << ")" << endl; return true; } int TimeRulerLayer::getMajorTickSpacing(LayerGeometryProvider *v, bool &quarterTicks) const { // return value is in milliseconds if (!m_model || !v) return 1000; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return 1000; sv_frame_t startFrame = v->getStartFrame(); sv_frame_t endFrame = v->getEndFrame(); int minPixelSpacing = 50; RealTime rtStart = RealTime::frame2RealTime(startFrame, sampleRate); RealTime rtEnd = RealTime::frame2RealTime(endFrame, sampleRate); int count = v->getPaintWidth() / minPixelSpacing; if (count < 1) count = 1; RealTime rtGap = (rtEnd - rtStart) / count; int incms; quarterTicks = false; if (rtGap.sec > 0) { incms = 1000; int s = rtGap.sec; if (s > 0) { incms *= 5; s /= 5; } if (s > 0) { incms *= 2; s /= 2; } if (s > 0) { incms *= 6; s /= 6; quarterTicks = true; } if (s > 0) { incms *= 5; s /= 5; quarterTicks = false; } if (s > 0) { incms *= 2; s /= 2; } if (s > 0) { incms *= 6; s /= 6; quarterTicks = true; } while (s > 0) { incms *= 10; s /= 10; quarterTicks = false; } } else { incms = 1; int ms = rtGap.msec(); // cerr << "rtGap.msec = " << ms << ", rtGap = " << rtGap << ", count = " << count << endl; // cerr << "startFrame = " << startFrame << ", endFrame = " << endFrame << " rtStart = " << rtStart << ", rtEnd = " << rtEnd << endl; if (ms > 0) { incms *= 10; ms /= 10; } if (ms > 0) { incms *= 10; ms /= 10; } if (ms > 0) { incms *= 5; ms /= 5; } if (ms > 0) { incms *= 2; ms /= 2; } } return incms; } void TimeRulerLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { #ifdef DEBUG_TIME_RULER_LAYER SVDEBUG << "TimeRulerLayer::paint (" << rect.x() << "," << rect.y() << ") [" << rect.width() << "x" << rect.height() << "]" << endl; #endif if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; sv_frame_t startFrame = v->getFrameForX(rect.x() - 50); #ifdef DEBUG_TIME_RULER_LAYER cerr << "start frame = " << startFrame << endl; #endif bool quarter = false; int incms = getMajorTickSpacing(v, quarter); int ms = int(lrint(1000.0 * (double(startFrame) / double(sampleRate)))); ms = (ms / incms) * incms - incms; #ifdef DEBUG_TIME_RULER_LAYER cerr << "start ms = " << ms << " at step " << incms << endl; #endif // Calculate the number of ticks per increment -- approximate // values for x and frame counts here will do, no rounding issue. // We always use the exact incms in our calculations for where to // draw the actual ticks or lines. int minPixelSpacing = 50; sv_frame_t incFrame = lrint((incms * sampleRate) / 1000); int incX = int(incFrame / v->getZoomLevel()); int ticks = 10; if (incX < minPixelSpacing * 2) { ticks = quarter ? 4 : 5; } QColor greyColour = getPartialShades(v)[1]; paint.save(); // Do not label time zero - we now overlay an opaque area over // time < 0 which would cut it in half int minlabel = 1; // ms // used for a sanity check sv_frame_t prevframe = 0; while (1) { // frame is used to determine where to draw the lines, so it // needs to correspond to an exact pixel (so that we don't get // a different pixel when scrolling a small amount and // re-drawing with a different start frame). double dms = ms; sv_frame_t frame = lrint((dms * sampleRate) / 1000.0); frame /= v->getZoomLevel(); frame *= v->getZoomLevel(); // so frame corresponds to an exact pixel if (frame == prevframe && prevframe != 0) { cerr << "ERROR: frame == prevframe (== " << frame << ") in TimeRulerLayer::paint" << endl; throw std::logic_error("frame == prevframe in TimeRulerLayer::paint"); } prevframe = frame; int x = v->getXForFrame(frame); #ifdef DEBUG_TIME_RULER_LAYER cerr << "Considering frame = " << frame << ", x = " << x << endl; #endif if (x >= rect.x() + rect.width() + 50) { #ifdef DEBUG_TIME_RULER_LAYER cerr << "X well out of range, ending here" << endl; #endif break; } if (x >= rect.x() - 50 && ms >= minlabel) { RealTime rt = RealTime::fromMilliseconds(ms); #ifdef DEBUG_TIME_RULER_LAYER cerr << "X in range, drawing line here for time " << rt.toText() << endl; #endif QString text(QString::fromStdString(rt.toText())); QFontMetrics metrics = paint.fontMetrics(); int tw = metrics.width(text); if (tw < 50 && (x < rect.x() - tw/2 || x >= rect.x() + rect.width() + tw/2)) { #ifdef DEBUG_TIME_RULER_LAYER cerr << "hm, maybe X isn't in range after all (x = " << x << ", tw = " << tw << ", rect.x() = " << rect.x() << ", rect.width() = " << rect.width() << ")" << endl; #endif } paint.setPen(greyColour); paint.drawLine(x, 0, x, v->getPaintHeight()); paint.setPen(getBaseQColor()); paint.drawLine(x, 0, x, 5); paint.drawLine(x, v->getPaintHeight() - 6, x, v->getPaintHeight() - 1); int y; switch (m_labelHeight) { default: case LabelTop: y = 6 + metrics.ascent(); break; case LabelMiddle: y = v->getPaintHeight() / 2 - metrics.height() / 2 + metrics.ascent(); break; case LabelBottom: y = v->getPaintHeight() - metrics.height() + metrics.ascent() - 6; } if (v->getViewManager() && v->getViewManager()->getOverlayMode() != ViewManager::NoOverlays) { if (v->getView()->getLayer(0) == this) { // backmost layer, don't worry about outlining the text paint.drawText(x+2 - tw/2, y, text); } else { PaintAssistant::drawVisibleText(v, paint, x+2 - tw/2, y, text, PaintAssistant::OutlinedText); } } } paint.setPen(greyColour); for (int i = 1; i < ticks; ++i) { dms = ms + (i * double(incms)) / ticks; frame = lrint((dms * sampleRate) / 1000.0); frame /= v->getZoomLevel(); frame *= v->getZoomLevel(); // exact pixel as above x = v->getXForFrame(frame); if (x < rect.x() || x >= rect.x() + rect.width()) { #ifdef DEBUG_TIME_RULER_LAYER // cerr << "tick " << i << ": X out of range, going on to next tick" << endl; #endif continue; } #ifdef DEBUG_TIME_RULER_LAYER cerr << "tick " << i << " in range, drawing at " << x << endl; #endif int sz = 5; if (ticks == 10) { if ((i % 2) == 1) { if (i == 5) { paint.drawLine(x, 0, x, v->getPaintHeight()); } else sz = 3; } else { sz = 7; } } paint.drawLine(x, 0, x, sz); paint.drawLine(x, v->getPaintHeight() - sz - 1, x, v->getPaintHeight() - 1); } ms += incms; } paint.restore(); } int TimeRulerLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = true; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "White" : "Black")); } QString TimeRulerLayer::getLayerPresentationName() const { LayerFactory *factory = LayerFactory::getInstance(); QString layerName = factory->getLayerPresentationName (factory->getLayerType(this)); return layerName; } void TimeRulerLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes); } void TimeRulerLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); } sonic-visualiser-3.0.3/svgui/layer/TimeRulerLayer.h0000644000000000000000000000416313111512442020467 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TIME_RULER_H_ #define _TIME_RULER_H_ #include "SingleColourLayer.h" #include #include class View; class Model; class QPainter; class TimeRulerLayer : public SingleColourLayer { Q_OBJECT public: TimeRulerLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; void setModel(Model *); virtual const Model *getModel() const { return m_model; } enum LabelHeight { LabelTop, LabelMiddle, LabelBottom }; void setLabelHeight(LabelHeight h) { m_labelHeight = h; } LabelHeight getLabelHeight() const { return m_labelHeight; } virtual bool snapToFeatureFrame(LayerGeometryProvider *, sv_frame_t &, int &, SnapType) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourIrrelevant; } virtual bool getValueExtents(double &, double &, bool &, QString &) const { return false; } virtual QString getLayerPresentationName() const; virtual int getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &) const { return 0; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); virtual bool canExistWithoutModel() const { return true; } protected: Model *m_model; LabelHeight m_labelHeight; virtual int getDefaultColourHint(bool dark, bool &impose); int getMajorTickSpacing(LayerGeometryProvider *, bool &quarterTicks) const; }; #endif sonic-visualiser-3.0.3/svgui/layer/TimeValueLayer.cpp0000644000000000000000000014726713111512442021022 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "TimeValueLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "base/Pitch.h" #include "view/View.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/Labeller.h" #include "widgets/ItemEditDialog.h" #include "widgets/ListInputDialog.h" #include "widgets/TextAbbrev.h" #include "ColourDatabase.h" #include "ColourMapper.h" #include "PianoScale.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "LinearColourScale.h" #include "LogColourScale.h" #include "PaintAssistant.h" #include #include #include #include #include #include #include #include #include //#define DEBUG_TIME_VALUE_LAYER 1 TimeValueLayer::TimeValueLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_originalPoint(0, 0.0, tr("New Point")), m_editingPoint(0, 0.0, tr("New Point")), m_editingCommand(0), m_colourMap(0), m_plotStyle(PlotConnectedPoints), m_verticalScale(AutoAlignScale), m_drawSegmentDivisions(true), m_derivative(false), m_scaleMinimum(0), m_scaleMaximum(0) { } void TimeValueLayer::setModel(SparseTimeValueModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); m_scaleMinimum = 0; m_scaleMaximum = 0; if (m_model && m_model->getRDFTypeURI().endsWith("Segment")) { setPlotStyle(PlotSegmentation); } if (m_model && m_model->getRDFTypeURI().endsWith("Change")) { setPlotStyle(PlotSegmentation); } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::setModel(" << model << ")" << endl; #endif emit modelReplaced(); } Layer::PropertyList TimeValueLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Plot Type"); list.push_back("Vertical Scale"); list.push_back("Scale Units"); list.push_back("Draw Segment Division Lines"); list.push_back("Show Derivative"); return list; } QString TimeValueLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Plot Type") return tr("Plot Type"); if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); if (name == "Draw Segment Division Lines") return tr("Draw Segment Division Lines"); if (name == "Show Derivative") return tr("Show Derivative"); return SingleColourLayer::getPropertyLabel(name); } QString TimeValueLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Draw Segment Division Lines") return "lines"; if (name == "Show Derivative") return "derivative"; return ""; } Layer::PropertyType TimeValueLayer::getPropertyType(const PropertyName &name) const { if (name == "Plot Type") return ValueProperty; if (name == "Vertical Scale") return ValueProperty; if (name == "Scale Units") return UnitsProperty; if (name == "Colour" && m_plotStyle == PlotSegmentation) return ColourMapProperty; if (name == "Draw Segment Division Lines") return ToggleProperty; if (name == "Show Derivative") return ToggleProperty; return SingleColourLayer::getPropertyType(name); } QString TimeValueLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } if (name == "Plot Type" || name == "Draw Segment Division Lines" || name == "Show Derivative") { return tr("Plot Type"); } return SingleColourLayer::getPropertyGroupName(name); } QString TimeValueLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } int TimeValueLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Colour" && m_plotStyle == PlotSegmentation) { if (min) *min = 0; if (max) *max = ColourMapper::getColourMapCount() - 1; if (deflt) *deflt = 0; val = m_colourMap; } else if (name == "Plot Type") { if (min) *min = 0; if (max) *max = 6; if (deflt) *deflt = int(PlotConnectedPoints); val = int(m_plotStyle); } else if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(AutoAlignScale); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else if (name == "Draw Segment Division Lines") { if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 1; val = (m_drawSegmentDivisions ? 1.0 : 0.0); } else if (name == "Show Derivative") { if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 0; val = (m_derivative ? 1.0 : 0.0); } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString TimeValueLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour" && m_plotStyle == PlotSegmentation) { return ColourMapper::getColourMapName(value); } else if (name == "Plot Type") { switch (value) { default: case 0: return tr("Points"); case 1: return tr("Stems"); case 2: return tr("Connected Points"); case 3: return tr("Lines"); case 4: return tr("Curve"); case 5: return tr("Segmentation"); case 6: return tr("Discrete Curves"); } } else if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Linear"); case 2: return tr("Log"); case 3: return tr("+/-1"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void TimeValueLayer::setProperty(const PropertyName &name, int value) { if (name == "Colour" && m_plotStyle == PlotSegmentation) { setFillColourMap(value); } else if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else if (name == "Draw Segment Division Lines") { setDrawSegmentDivisions(value > 0.5); } else if (name == "Show Derivative") { setShowDerivative(value > 0.5); } else { SingleColourLayer::setProperty(name, value); } } void TimeValueLayer::setFillColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; emit layerParametersChanged(); } void TimeValueLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; bool colourTypeChanged = (style == PlotSegmentation || m_plotStyle == PlotSegmentation); m_plotStyle = style; if (colourTypeChanged) { emit layerParameterRangesChanged(); } emit layerParametersChanged(); } void TimeValueLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } void TimeValueLayer::setDrawSegmentDivisions(bool draw) { if (m_drawSegmentDivisions == draw) return; m_drawSegmentDivisions = draw; emit layerParametersChanged(); } void TimeValueLayer::setShowDerivative(bool show) { if (m_derivative == show) return; m_derivative = show; emit layerParametersChanged(); } bool TimeValueLayer::isLayerScrollable(const LayerGeometryProvider *v) const { // We don't illuminate sections in the line or curve modes, so // they're always scrollable if (m_plotStyle == PlotLines || m_plotStyle == PlotCurve || m_plotStyle == PlotDiscreteCurves) return true; QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } bool TimeValueLayer::getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); logarithmic = (m_verticalScale == LogScale); unit = getScaleUnits(); if (m_derivative) { max = std::max(fabs(min), fabs(max)); min = -max; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << endl; #endif if (!shouldAutoAlign() && !logarithmic && !m_derivative) { if (max == min) { max = max + 0.5; min = min - 0.5; } else { double margin = (max - min) / 10.0; max = max + margin; min = min - margin; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << " (after adjustment)" << endl; #endif } return true; } bool TimeValueLayer::getDisplayExtents(double &min, double &max) const { if (!m_model || shouldAutoAlign()) return false; if (m_scaleMinimum == m_scaleMaximum) { bool log; QString unit; getValueExtents(min, max, log, unit); } else { min = m_scaleMinimum; max = m_scaleMaximum; } if (m_derivative) { max = std::max(fabs(min), fabs(max)); min = -max; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getDisplayExtents: min = " << min << ", max = " << max << endl; #endif return true; } bool TimeValueLayer::setDisplayExtents(double min, double max) { if (!m_model) return false; if (min == max) { if (min == 0.f) { max = 1.f; } else { max = min * 1.0001; } } m_scaleMinimum = min; m_scaleMaximum = max; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::setDisplayExtents: min = " << min << ", max = " << max << endl; #endif emit layerParametersChanged(); return true; } int TimeValueLayer::getVerticalZoomSteps(int &defaultStep) const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; defaultStep = 0; return 100; } int TimeValueLayer::getCurrentVerticalZoomStep() const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return 0; double dmin, dmax; getDisplayExtents(dmin, dmax); int nr = mapper->getPositionForValue(dmax - dmin); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getCurrentVerticalZoomStep: dmin = " << dmin << ", dmax = " << dmax << ", nr = " << nr << endl; #endif delete mapper; return 100 - nr; } void TimeValueLayer::setVerticalZoomStep(int step) { if (shouldAutoAlign()) return; if (!m_model) return; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return; double min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); double dmin, dmax; getDisplayExtents(dmin, dmax); double newdist = mapper->getValueForPosition(100 - step); double newmin, newmax; if (logarithmic) { // see SpectrogramLayer::setVerticalZoomStep newmax = (newdist + sqrt(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; #endif } else { double dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } if (newmin < min) { newmax += (min - newmin); newmin = min; } if (newmax > max) { newmax = max; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; #endif setDisplayExtents(newmin, newmax); } RangeMapper * TimeValueLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; RangeMapper *mapper; double min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); if (min == max) return 0; if (logarithmic) { mapper = new LogRangeMapper(0, 100, min, max, unit); } else { mapper = new LinearRangeMapper(0, 100, min, max, unit); } return mapper; } SparseTimeValueModel::PointList TimeValueLayer::getLocalPoints(LayerGeometryProvider *v, int x) const { if (!m_model) return SparseTimeValueModel::PointList(); sv_frame_t frame = v->getFrameForX(x); SparseTimeValueModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } SparseTimeValueModel::PointList prevPoints = m_model->getPreviousPoints(frame); SparseTimeValueModel::PointList nextPoints = m_model->getNextPoints(frame); SparseTimeValueModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (nextPoints.empty()) { // stick with prevPoints } else if (prevPoints.begin()->frame < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (nextPoints.begin()->frame - frame < frame - prevPoints.begin()->frame) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 3)) { usePoints.clear(); } } return usePoints; } QString TimeValueLayer::getLabelPreceding(sv_frame_t frame) const { if (!m_model) return ""; SparseTimeValueModel::PointList points = m_model->getPreviousPoints(frame); for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->label != "") return i->label; } return ""; } QString TimeValueLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; SparseTimeValueModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } sv_frame_t useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString valueText; float value = points.begin()->value; QString unit = getScaleUnits(); if (unit == "Hz") { valueText = tr("%1 Hz (%2, %3)") .arg(value) .arg(Pitch::getPitchLabelForFrequency(value)) .arg(Pitch::getPitchForFrequency(value)); } else if (unit != "") { valueText = tr("%1 %2").arg(value).arg(unit); } else { valueText = tr("%1").arg(value); } QString text; if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nValue:\t%2\nNo label")) .arg(rt.toText(true).c_str()) .arg(valueText); } else { text = QString(tr("Time:\t%1\nValue:\t%2\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(valueText) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), getYForValue(v, points.begin()->value)); return text; } bool TimeValueLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); SparseTimeValueModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); sv_frame_t snapped = frame; bool found = false; for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest SparseTimeValueModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } bool TimeValueLayer::snapToSimilarFeature(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToSimilarFeature(v, frame, resolution, snap); } resolution = m_model->getResolution(); const SparseTimeValueModel::PointList &points = m_model->getPoints(); SparseTimeValueModel::PointList close = m_model->getPoints(frame, frame); SparseTimeValueModel::PointList::const_iterator i; sv_frame_t matchframe = frame; double matchvalue = 0.0; for (i = close.begin(); i != close.end(); ++i) { if (i->frame > frame) break; matchvalue = i->value; matchframe = i->frame; } sv_frame_t snapped = frame; bool found = false; bool distant = false; double epsilon = 0.0001; i = close.begin(); // Scan through the close points first, then the more distant ones // if no suitable close one is found. So the while-termination // condition here can only happen once i has passed through the // whole of the close container and then the whole of the separate // points container. The two iterators are totally distinct, but // have the same type so we cheekily use the same variable and a // single loop for both. while (i != points.end()) { if (!distant) { if (i == close.end()) { // switch from the close container to the points container i = points.begin(); distant = true; } } if (snap == SnapRight) { if (i->frame > matchframe && fabs(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame < matchframe) { if (fabs(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; // don't break, as the next may be better } } else if (found || distant) { break; } } else { // no other snap types supported } ++i; } frame = snapped; return found; } void TimeValueLayer::getScaleExtents(LayerGeometryProvider *v, double &min, double &max, bool &log) const { min = 0.0; max = 0.0; log = false; if (shouldAutoAlign()) { if (!v->getValueExtents(getScaleUnits(), min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); } else if (log) { LogRange::mapRange(min, max); } } else if (m_verticalScale == PlusMinusOneScale) { min = -1.0; max = 1.0; } else { getDisplayExtents(min, max); if (m_verticalScale == LogScale) { LogRange::mapRange(min, max); log = true; } } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getScaleExtents: min = " << min << ", max = " << max << endl; #endif } int TimeValueLayer::getYForValue(LayerGeometryProvider *v, double val) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "getYForValue(" << val << "): min " << min << ", max " << max << ", log " << logarithmic << endl; #endif if (logarithmic) { val = LogRange::map(val); } return int(h - ((val - min) * h) / (max - min)); } double TimeValueLayer::getValueForY(LayerGeometryProvider *v, int y) const { double min = 0.0, max = 0.0; bool logarithmic = false; int h = v->getPaintHeight(); getScaleExtents(v, min, max, logarithmic); double val = min + (double(h - y) * double(max - min)) / h; if (logarithmic) { val = LogRange::map(val); } return val; } bool TimeValueLayer::shouldAutoAlign() const { if (!m_model) return false; QString unit = getScaleUnits(); return (m_verticalScale == AutoAlignScale && unit != ""); } QColor TimeValueLayer::getColourForValue(LayerGeometryProvider *v, double val) const { double min, max; bool log; getScaleExtents(v, min, max, log); if (min > max) std::swap(min, max); if (max == min) max = min + 1; if (log) { val = LogRange::map(val); } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getColourForValue: min " << min << ", max " << max << ", log " << log << ", value " << val << endl; #endif QColor solid = ColourMapper(m_colourMap, min, max).map(val); return QColor(solid.red(), solid.green(), solid.blue(), 120); } int TimeValueLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Green" : "Green")); } void TimeValueLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; sv_samplerate_t sampleRate = m_model->getSampleRate(); if (!sampleRate) return; paint.setRenderHint(QPainter::Antialiasing, false); // Profiler profiler("TimeValueLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); sv_frame_t frame0 = v->getFrameForX(x0); sv_frame_t frame1 = v->getFrameForX(x1); if (m_derivative) --frame0; SparseTimeValueModel::PointList points(m_model->getPoints (frame0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); paint.setBrush(brushColour); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::paint: resolution is " << m_model->getResolution() << " frames" << endl; #endif double min = m_model->getValueMinimum(); double max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; int origin = int(nearbyint(v->getPaintHeight() - (-min * v->getPaintHeight()) / (max - min))); QPoint localPos; sv_frame_t illuminateFrame = -1; if (v->shouldIlluminateLocalFeatures(this, localPos)) { SparseTimeValueModel::PointList localPoints = getLocalPoints(v, localPos.x()); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer: " << localPoints.size() << " local points" << endl; #endif if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame; } int w = v->getXForFrame(frame0 + m_model->getResolution()) - v->getXForFrame(frame0); if (m_plotStyle == PlotStems) { if (w < 2) w = 2; } else { if (w < 1) w = 1; } paint.save(); QPainterPath path; int pointCount = 0; int textY = 0; if (m_plotStyle == PlotSegmentation) { textY = v->getTextLabelHeight(this, paint); } else { int originY = getYForValue(v, 0.f); if (originY > 0 && originY < v->getPaintHeight()) { paint.save(); paint.setPen(getPartialShades(v)[1]); paint.drawLine(x0, originY, x1, originY); paint.restore(); } } sv_frame_t prevFrame = 0; for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (m_derivative && i == points.begin()) continue; const SparseTimeValueModel::Point &p(*i); double value = p.value; if (m_derivative) { SparseTimeValueModel::PointList::const_iterator j = i; --j; value -= j->value; } int x = v->getXForFrame(p.frame); int y = getYForValue(v, value); bool gap = false; if (m_plotStyle == PlotDiscreteCurves) { if (value == 0.0) { // Treat zeros as gaps continue; } gap = (p.frame > prevFrame && (p.frame - prevFrame >= m_model->getResolution() * 2)); } if (m_plotStyle != PlotSegmentation) { textY = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() - 1; if (textY < paint.fontMetrics().ascent() + 1) { textY = paint.fontMetrics().ascent() + 1; } } bool haveNext = false; double nvalue = 0.f; sv_frame_t nf = v->getModelsEndFrame(); int nx = v->getXForFrame(nf); int ny = y; SparseTimeValueModel::PointList::const_iterator j = i; ++j; if (j != points.end()) { const SparseTimeValueModel::Point &q(*j); nvalue = q.value; if (m_derivative) nvalue -= p.value; nf = q.frame; nx = v->getXForFrame(nf); ny = getYForValue(v, nvalue); haveNext = true; } // cout << "frame = " << p.frame << ", x = " << x << ", haveNext = " << haveNext // << ", nx = " << nx << endl; QPen pen(getBaseQColor()); QBrush brush(brushColour); if (m_plotStyle == PlotDiscreteCurves) { pen = QPen(getBaseQColor(), 3); brush = QBrush(Qt::NoBrush); } else if (m_plotStyle == PlotSegmentation) { pen = QPen(getForegroundQColor(v)); brush = QBrush(getColourForValue(v, value)); } else if (m_plotStyle == PlotLines || m_plotStyle == PlotCurve) { brush = QBrush(Qt::NoBrush); } paint.setPen(PaintAssistant::scalePen(pen)); paint.setBrush(brush); if (m_plotStyle == PlotStems) { if (y < origin - 1) { paint.drawLine(x + w/2, y + 1, x + w/2, origin); } else if (y > origin + 1) { paint.drawLine(x + w/2, origin, x + w/2, y - 1); } } bool illuminate = false; if (illuminateFrame == p.frame) { // not equipped to illuminate the right section in line // or curve mode if (m_plotStyle != PlotCurve && m_plotStyle != PlotDiscreteCurves && m_plotStyle != PlotLines) { illuminate = true; } } if (m_plotStyle != PlotLines && m_plotStyle != PlotCurve && m_plotStyle != PlotDiscreteCurves && m_plotStyle != PlotSegmentation) { if (illuminate) { paint.save(); paint.setPen(PaintAssistant::scalePen(getForegroundQColor(v))); paint.setBrush(getForegroundQColor(v)); } if (m_plotStyle != PlotStems || w > 1) { paint.drawRect(x, y - 1, w, 2); } if (illuminate) { paint.restore(); } } if (m_plotStyle == PlotConnectedPoints || m_plotStyle == PlotLines || m_plotStyle == PlotDiscreteCurves || m_plotStyle == PlotCurve) { if (haveNext) { if (m_plotStyle == PlotConnectedPoints) { paint.save(); paint.setPen(PaintAssistant::scalePen(brushColour)); paint.drawLine(x + w, y, nx, ny); paint.restore(); } else if (m_plotStyle == PlotLines) { if (pointCount == 0) { path.moveTo(x + w/2, y); } // paint.drawLine(x + w/2, y, nx + w/2, ny); path.lineTo(nx + w/2, ny); } else { double x0 = x + double(w)/2; double x1 = nx + double(w)/2; double y0 = y; double y1 = ny; if (m_plotStyle == PlotDiscreteCurves) { bool nextGap = (nvalue == 0.0) || (nf - p.frame >= m_model->getResolution() * 2); if (nextGap) { x1 = x0; y1 = y0; } } if (pointCount == 0 || gap) { path.moveTo((x0 + x1) / 2, (y0 + y1) / 2); } if (nx - x > 5) { path.cubicTo(x0, y0, x0, y0, (x0 + x1) / 2, (y0 + y1) / 2); // // or // path.quadTo(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2); } else { path.lineTo(x0, y0); path.lineTo((x0 + x1) / 2, (y0 + y1) / 2); } } } } if (m_plotStyle == PlotSegmentation) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "drawing rect" << endl; #endif if (nx <= x) continue; paint.setPen(PaintAssistant::scalePen(QPen(getForegroundQColor(v), 2))); if (!illuminate) { if (!m_drawSegmentDivisions || nx < x + 5 || x >= v->getPaintWidth() - 1) { paint.setPen(Qt::NoPen); } } paint.drawRect(x, -1, nx - x, v->getPaintHeight() + 1); } if (v->shouldShowFeatureLabels()) { QString label = p.label; bool italic = false; if (label == "" && (m_plotStyle == PlotPoints || m_plotStyle == PlotSegmentation || m_plotStyle == PlotConnectedPoints)) { char lc[20]; snprintf(lc, 20, "%.3g", p.value); label = lc; italic = true; } if (label != "") { // Quick test for 20px before we do the slower test using metrics bool haveRoom = (nx > x + 20); haveRoom = (haveRoom && (nx > x + 6 + paint.fontMetrics().width(label))); if (haveRoom || (!haveNext && (pointCount == 0 || !italic))) { PaintAssistant::drawVisibleText(v, paint, x + 5, textY, label, italic ? PaintAssistant::OutlinedItalicText : PaintAssistant::OutlinedText); } } } prevFrame = p.frame; ++pointCount; } if (m_plotStyle == PlotDiscreteCurves) { paint.setRenderHint(QPainter::Antialiasing, true); paint.drawPath(path); } else if ((m_plotStyle == PlotCurve || m_plotStyle == PlotLines) && !path.isEmpty()) { paint.setRenderHint(QPainter::Antialiasing, pointCount <= v->getPaintWidth()); paint.drawPath(path); } paint.restore(); // looks like save/restore doesn't deal with this: paint.setRenderHint(QPainter::Antialiasing, false); } int TimeValueLayer::getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &paint) const { if (!m_model || shouldAutoAlign()) { return 0; } else if (m_plotStyle == PlotSegmentation) { if (m_verticalScale == LogScale) { return LogColourScale().getWidth(v, paint); } else { return LinearColourScale().getWidth(v, paint); } } else { if (m_verticalScale == LogScale) { return LogNumericalScale().getWidth(v, paint) + 10; // for piano } else { return LinearNumericalScale().getWidth(v, paint); } } } void TimeValueLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect) const { if (!m_model || m_model->getPoints().empty()) return; QString unit; double min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); int h = v->getPaintHeight(); if (m_plotStyle == PlotSegmentation) { getValueExtents(min, max, logarithmic, unit); if (logarithmic) { LogRange::mapRange(min, max); LogColourScale().paintVertical(v, this, paint, 0, min, max); } else { LinearColourScale().paintVertical(v, this, paint, 0, min, max); } } else { getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } if (logarithmic && (getScaleUnits() == "Hz")) { PianoScale().paintPianoVertical (v, paint, QRect(w - 10, 0, 10, h), LogRange::unmap(min), LogRange::unmap(max)); paint.drawLine(w, 0, w, h); } } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void TimeValueLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model) return; sv_frame_t frame = v->getFrameForX(e->x()); int resolution = m_model->getResolution(); if (frame < 0) frame = 0; frame = (frame / resolution) * resolution; double value = getValueForY(v, e->y()); bool havePoint = false; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (!points.empty()) { for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (((i->frame / resolution) * resolution) != frame) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "ignoring out-of-range frame at " << i->frame << endl; #endif continue; } m_editingPoint = *i; havePoint = true; } } if (!havePoint) { m_editingPoint = SparseTimeValueModel::Point (frame, float(value), tr("New Point")); } m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new SparseTimeValueModel::EditCommand(m_model, tr("Draw Point")); if (!havePoint) { m_editingCommand->addPoint(m_editingPoint); } m_editing = true; } void TimeValueLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); int resolution = m_model->getResolution(); if (frame < 0) frame = 0; frame = (frame / resolution) * resolution; double value = getValueForY(v, e->y()); SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); #ifdef DEBUG_TIME_VALUE_LAYER cerr << points.size() << " points" << endl; #endif bool havePoint = false; if (!points.empty()) { for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (i->frame == m_editingPoint.frame && i->value == m_editingPoint.value) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "ignoring current editing point at " << i->frame << ", " << i->value << endl; #endif continue; } if (((i->frame / resolution) * resolution) != frame) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "ignoring out-of-range frame at " << i->frame << endl; #endif continue; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "adjusting to new point at " << i->frame << ", " << i->value << endl; #endif m_editingPoint = *i; m_originalPoint = m_editingPoint; m_editingCommand->deletePoint(m_editingPoint); havePoint = true; } } if (!havePoint) { if (frame == m_editingPoint.frame) { m_editingCommand->deletePoint(m_editingPoint); } } // m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = float(value); m_editingCommand->addPoint(m_editingPoint); } void TimeValueLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::drawEnd" << endl; #endif if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeValueLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeValueLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *) { } void TimeValueLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; if (points.begin()->frame != m_editingPoint.frame || points.begin()->value != m_editingPoint.value) return; m_editingCommand = new SparseTimeValueModel::EditCommand (m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeValueLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model) return; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeValueLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model || !m_editing) return; sv_frame_t frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); double value = getValueForY(v, e->y()); if (!m_editingCommand) { m_editingCommand = new SparseTimeValueModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = float(value); m_editingCommand->addPoint(m_editingPoint); } void TimeValueLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::editEnd" << endl; #endif if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Point"); } else { newName = tr("Relocate Point"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool TimeValueLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) { if (!m_model) return false; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return false; SparseTimeValueModel::Point point = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(point.frame); dialog->setValue(point.value); dialog->setText(point.label); if (dialog->exec() == QDialog::Accepted) { SparseTimeValueModel::Point newPoint = point; newPoint.frame = dialog->getFrameTime(); newPoint.value = dialog->getValue(); newPoint.label = dialog->getText(); SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Edit Point")); command->deletePoint(point); command->addPoint(newPoint); finish(command); } delete dialog; return true; } void TimeValueLayer::moveSelection(Selection s, sv_frame_t newStartFrame) { if (!m_model) return; SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Drag Selection")); SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { SparseTimeValueModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeValueLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Resize Selection")); SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = double(i->frame); target = double(newSize.getStartFrame()) + target - double(s.getStartFrame()) * ratio; SparseTimeValueModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeValueLayer::deleteSelection(Selection s) { if (!m_model) return; SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Delete Selected Points")); SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); } void TimeValueLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) { if (!m_model) return; SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool TimeValueLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool interactive) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v->getView(), tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Paste")); enum ValueAvailability { UnknownAvailability, NoValues, SomeValues, AllValues }; Labeller::ValueType generation = Labeller::ValueNone; bool haveUsableLabels = false; Labeller labeller; labeller.setSampleRate(m_model->getSampleRate()); if (interactive) { ValueAvailability availability = UnknownAvailability; for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; if (availability == UnknownAvailability) { if (i->haveValue()) availability = AllValues; else availability = NoValues; continue; } if (i->haveValue()) { if (availability == NoValues) { availability = SomeValues; } } else { if (availability == AllValues) { availability = SomeValues; } } if (!haveUsableLabels) { if (i->haveLabel()) { if (i->getLabel().contains(QRegExp("[0-9]"))) { haveUsableLabels = true; } } } if (availability == SomeValues && haveUsableLabels) break; } if (availability == NoValues || availability == SomeValues) { QString text; if (availability == NoValues) { text = tr("The items you are pasting do not have values.\nWhat values do you want to use for these items?"); } else { text = tr("Some of the items you are pasting do not have values.\nWhat values do you want to use for these items?"); } Labeller::TypeNameMap names = labeller.getTypeNames(); QStringList options; std::vector genopts; for (Labeller::TypeNameMap::const_iterator i = names.begin(); i != names.end(); ++i) { if (i->first == Labeller::ValueNone) options << tr("Zero for all items"); else options << i->second; genopts.push_back(i->first); } static int prevSelection = 0; bool ok = false; QString selected = ListInputDialog::getItem (0, tr("Choose value calculation"), text, options, prevSelection, &ok); if (!ok) { delete command; return false; } int selection = 0; generation = Labeller::ValueNone; for (QStringList::const_iterator i = options.begin(); i != options.end(); ++i) { if (selected == *i) { generation = genopts[selection]; break; } ++selection; } labeller.setType(generation); if (generation == Labeller::ValueFromCyclicalCounter || generation == Labeller::ValueFromTwoLevelCounter) { int cycleSize = QInputDialog::getInt (0, tr("Select cycle size"), tr("Cycle size:"), 4, 2, 16, 1); labeller.setCounterCycleSize(cycleSize); } prevSelection = selection; } } SparseTimeValueModel::Point prevPoint(0); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; sv_frame_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } SparseTimeValueModel::Point newPoint(frame); if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } bool usePrev = false; SparseTimeValueModel::Point formerPrevPoint = prevPoint; if (i->haveValue()) { newPoint.value = i->getValue(); } else { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "Setting value on point at " << newPoint.frame << " from labeller"; if (i == points.begin()) { cerr << ", no prev point" << endl; } else { cerr << ", prev point is at " << prevPoint.frame << endl; } #endif labeller.setValue (newPoint, (i == points.begin()) ? 0 : &prevPoint); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "New point value = " << newPoint.value << endl; #endif if (labeller.actingOnPrevPoint() && i != points.begin()) { usePrev = true; } } if (usePrev) { command->deletePoint(formerPrevPoint); command->addPoint(prevPoint); } prevPoint = newPoint; command->addPoint(newPoint); } finish(command); return true; } void TimeValueLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" colourMap=\"%1\" plotStyle=\"%2\" verticalScale=\"%3\" scaleMinimum=\"%4\" scaleMaximum=\"%5\" drawDivisions=\"%6\" derivative=\"%7\" ") .arg(m_colourMap) .arg(m_plotStyle) .arg(m_verticalScale) .arg(m_scaleMinimum) .arg(m_scaleMaximum) .arg(m_drawSegmentDivisions ? "true" : "false") .arg(m_derivative ? "true" : "false")); } void TimeValueLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok, alsoOk; int cmap = attributes.value("colourMap").toInt(&ok); if (ok) setFillColourMap(cmap); PlotStyle style = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(style); VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); bool draw = (attributes.value("drawDivisions").trimmed() == "true"); setDrawSegmentDivisions(draw); bool derivative = (attributes.value("derivative").trimmed() == "true"); setShowDerivative(derivative); float min = attributes.value("scaleMinimum").toFloat(&ok); float max = attributes.value("scaleMaximum").toFloat(&alsoOk); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "from properties: min = " << min << ", max = " << max << endl; #endif if (ok && alsoOk && min != max) setDisplayExtents(min, max); } sonic-visualiser-3.0.3/svgui/layer/TimeValueLayer.h0000644000000000000000000001607513111512442020457 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_TIME_VALUE_LAYER_H #define SV_TIME_VALUE_LAYER_H #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "ColourScaleLayer.h" #include "data/model/SparseTimeValueModel.h" #include #include class View; class QPainter; class TimeValueLayer : public SingleColourLayer, public VerticalScaleLayer, public ColourScaleLayer { Q_OBJECT public: TimeValueLayer(); virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual QString getLabelPreceding(sv_frame_t) const; virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual bool snapToSimilarFeature(LayerGeometryProvider *v, sv_frame_t &frame, int &resolution, SnapType snap) const; virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *); virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *); virtual void editStart(LayerGeometryProvider *v, QMouseEvent *); virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *); virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *); virtual bool editOpen(LayerGeometryProvider *v, QMouseEvent *); virtual void moveSelection(Selection s, sv_frame_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to); virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(SparseTimeValueModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); void setFillColourMap(int); int getFillColourMap() const { return m_colourMap; } enum PlotStyle { PlotPoints, PlotStems, PlotConnectedPoints, PlotLines, PlotCurve, PlotSegmentation, PlotDiscreteCurves }; void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } enum VerticalScale { AutoAlignScale, LinearScale, LogScale, PlusMinusOneScale }; void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } void setDrawSegmentDivisions(bool); bool getDrawSegmentDivisions() const { return m_drawSegmentDivisions; } void setShowDerivative(bool); bool getShowDerivative() const { return m_derivative; } virtual bool isLayerScrollable(const LayerGeometryProvider *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); } virtual bool needsTextLabelHeight() const { return m_plotStyle == PlotSegmentation && m_model->hasTextLabels(); } virtual bool getValueExtents(double &min, double &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(double &min, double &max) const; virtual bool setDisplayExtents(double min, double max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); /// Override from SingleColourLayer virtual ColourSignificance getLayerColourSignificance() const { if (m_plotStyle == PlotSegmentation) { return ColourHasMeaningfulValue; } else { return ColourDistinguishes; } } /// Override from SingleColourLayer virtual bool hasLightBackground() const { if (m_plotStyle == PlotSegmentation) { return true; } else { return SingleColourLayer::hasLightBackground(); } } /// VerticalScaleLayer and ColourScaleLayer methods virtual int getYForValue(LayerGeometryProvider *, double value) const; virtual double getValueForY(LayerGeometryProvider *, int y) const; virtual QString getScaleUnits() const; virtual QColor getColourForValue(LayerGeometryProvider *v, double value) const; protected: void getScaleExtents(LayerGeometryProvider *, double &min, double &max, bool &log) const; bool shouldAutoAlign() const; SparseTimeValueModel::PointList getLocalPoints(LayerGeometryProvider *v, int) const; virtual int getDefaultColourHint(bool dark, bool &impose); SparseTimeValueModel *m_model; bool m_editing; SparseTimeValueModel::Point m_originalPoint; SparseTimeValueModel::Point m_editingPoint; SparseTimeValueModel::EditCommand *m_editingCommand; int m_colourMap; PlotStyle m_plotStyle; VerticalScale m_verticalScale; bool m_drawSegmentDivisions; bool m_derivative; mutable double m_scaleMinimum; mutable double m_scaleMaximum; void finish(SparseTimeValueModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-3.0.3/svgui/layer/VerticalBinLayer.h0000644000000000000000000000420613111512442020757 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2016 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef VERTICAL_BIN_LAYER_H #define VERTICAL_BIN_LAYER_H #include "SliceableLayer.h" /** * Interface for layers in which the Y axis corresponds to bin number * rather than scale value. Colour3DPlotLayer is the obvious example. * Conceptually these are always SliceableLayers as well, and this * subclasses from SliceableLayer to avoid a big inheritance mess. */ class VerticalBinLayer : public SliceableLayer { public: /** * Return the y coordinate at which the given bin "starts" * (i.e. at the bottom of the bin, if the given bin is an integer * and the vertical scale is the usual way up). Bin number may be * fractional, to obtain a position part-way through a bin. */ virtual double getYForBin(const LayerGeometryProvider *, double bin) const = 0; /** * As getYForBin, but rounding to integer values. */ virtual int getIYForBin(const LayerGeometryProvider *v, int bin) const { return int(round(getYForBin(v, bin))); } /** * Return the bin number, possibly fractional, at the given y * coordinate. Note that the whole numbers occur at the positions * at which the bins "start" (i.e. the bottom of the visible bin, * if the vertical scale is the usual way up). */ virtual double getBinForY(const LayerGeometryProvider *, double y) const = 0; /** * As getBinForY, but rounding to integer values. */ virtual int getIBinForY(const LayerGeometryProvider *v, int y) const { return int(floor(getBinForY(v, y))); } }; #endif sonic-visualiser-3.0.3/svgui/layer/VerticalScaleLayer.h0000644000000000000000000000223213111512442021273 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef VERTICAL_SCALE_LAYER_H #define VERTICAL_SCALE_LAYER_H /** * Interface for layers in which the Y axis represents (or can * sometimes represent, depending on the display mode) the sample * value. For example, TimeValueLayer uses vertical scale when in * point mode and so provides this interface. */ class VerticalScaleLayer { public: virtual int getYForValue(LayerGeometryProvider *, double value) const = 0; virtual double getValueForY(LayerGeometryProvider *, int y) const = 0; virtual QString getScaleUnits() const = 0; }; #endif sonic-visualiser-3.0.3/svgui/layer/WaveformLayer.cpp0000644000000000000000000011625013111512442020701 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "WaveformLayer.h" #include "base/AudioLevel.h" #include "view/View.h" #include "base/Profiler.h" #include "base/RangeMapper.h" #include "base/Strings.h" #include "ColourDatabase.h" #include "PaintAssistant.h" #include #include #include #include #include //#define DEBUG_WAVEFORM_PAINT 1 WaveformLayer::WaveformLayer() : SingleColourLayer(), m_model(0), m_gain(1.0f), m_autoNormalize(false), m_showMeans(true), m_greyscale(true), m_channelMode(SeparateChannels), m_channel(-1), m_scale(LinearScale), m_middleLineHeight(0.5), m_aggressive(false), m_cache(0), m_cacheValid(false), m_cacheZoomLevel(0) { } WaveformLayer::~WaveformLayer() { delete m_cache; } void WaveformLayer::setModel(const RangeSummarisableTimeValueModel *model) { bool channelsChanged = false; if (m_channel == -1) { if (!m_model) { if (model) { channelsChanged = true; } } else { if (model && m_model->getChannelCount() != model->getChannelCount()) { channelsChanged = true; } } } m_model = model; m_cacheValid = false; if (!m_model || !m_model->isOK()) return; connectSignals(m_model); emit modelReplaced(); if (channelsChanged) emit layerParametersChanged(); } Layer::PropertyList WaveformLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Scale"); list.push_back("Gain"); list.push_back("Normalize Visible Area"); if (m_model && m_model->getChannelCount() > 1 && m_channel == -1) { list.push_back("Channels"); } return list; } QString WaveformLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Scale") return tr("Scale"); if (name == "Gain") return tr("Gain"); if (name == "Normalize Visible Area") return tr("Normalize Visible Area"); if (name == "Channels") return tr("Channels"); return SingleColourLayer::getPropertyLabel(name); } QString WaveformLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Normalize Visible Area") return "normalise"; return ""; } Layer::PropertyType WaveformLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Normalize Visible Area") return ToggleProperty; if (name == "Channels") return ValueProperty; if (name == "Scale") return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString WaveformLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Gain" || name == "Normalize Visible Area" || name == "Scale") return tr("Scale"); return QString(); } int WaveformLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = 0; val = int(lrint(log10(m_gain) * 20.0)); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Normalize Visible Area") { val = (m_autoNormalize ? 1 : 0); *deflt = 0; } else if (name == "Channels") { *min = 0; *max = 2; *deflt = 0; if (m_channelMode == MixChannels) val = 1; else if (m_channelMode == MergeChannels) val = 2; else val = 0; } else if (name == "Scale") { *min = 0; *max = 2; *deflt = 0; val = (int)m_scale; } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString WaveformLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Meter"); case 2: return tr("dB"); } } if (name == "Channels") { switch (value) { default: case 0: return tr("Separate"); case 1: return tr("Mean"); case 2: return tr("Butterfly"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } RangeMapper * WaveformLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } return 0; } void WaveformLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(float(pow(10, float(value)/20.0))); } else if (name == "Normalize Visible Area") { setAutoNormalize(value ? true : false); } else if (name == "Channels") { if (value == 1) setChannelMode(MixChannels); else if (value == 2) setChannelMode(MergeChannels); else setChannelMode(SeparateChannels); } else if (name == "Scale") { switch (value) { default: case 0: setScale(LinearScale); break; case 1: setScale(MeterScale); break; case 2: setScale(dBScale); break; } } else { SingleColourLayer::setProperty(name, value); } } void WaveformLayer::setGain(float gain) { if (m_gain == gain) return; m_gain = gain; m_cacheValid = false; emit layerParametersChanged(); emit verticalZoomChanged(); } void WaveformLayer::setAutoNormalize(bool autoNormalize) { if (m_autoNormalize == autoNormalize) return; m_autoNormalize = autoNormalize; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setShowMeans(bool showMeans) { if (m_showMeans == showMeans) return; m_showMeans = showMeans; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setUseGreyscale(bool useGreyscale) { if (m_greyscale == useGreyscale) return; m_greyscale = useGreyscale; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setChannelMode(ChannelMode channelMode) { if (m_channelMode == channelMode) return; m_channelMode = channelMode; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setChannel(int channel) { // SVDEBUG << "WaveformLayer::setChannel(" << channel << ")" << endl; if (m_channel == channel) return; m_channel = channel; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setScale(Scale scale) { if (m_scale == scale) return; m_scale = scale; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setMiddleLineHeight(double height) { if (m_middleLineHeight == height) return; m_middleLineHeight = height; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setAggressiveCacheing(bool aggressive) { if (m_aggressive == aggressive) return; m_aggressive = aggressive; m_cacheValid = false; emit layerParametersChanged(); } int WaveformLayer::getCompletion(LayerGeometryProvider *) const { int completion = 100; if (!m_model || !m_model->isOK()) return completion; if (m_model->isReady(&completion)) return 100; return completion; } bool WaveformLayer::getValueExtents(double &min, double &max, bool &, QString &unit) const { if (m_scale == LinearScale) { min = 0.0; max = 1.0; unit = "V"; } else if (m_scale == MeterScale) { return false; //!!! } else { min = AudioLevel::multiplier_to_dB(0.0); max = AudioLevel::multiplier_to_dB(1.0); unit = "dB"; } return true; } int WaveformLayer::dBscale(double sample, int m) const { if (sample < 0.0) return dBscale(-sample, m); double dB = AudioLevel::multiplier_to_dB(sample); if (dB < -50.0) return 0; if (dB > 0.0) return m; return int(((dB + 50.0) * m) / 50.0 + 0.1); } int WaveformLayer::getChannelArrangement(int &min, int &max, bool &merging, bool &mixing) const { if (!m_model || !m_model->isOK()) return 0; int channels = m_model->getChannelCount(); if (channels == 0) return 0; int rawChannels = channels; if (m_channel == -1) { min = 0; if (m_channelMode == MergeChannels || m_channelMode == MixChannels) { max = 0; channels = 1; } else { max = channels - 1; } } else { min = m_channel; max = m_channel; rawChannels = 1; channels = 1; } merging = (m_channelMode == MergeChannels && rawChannels > 1); mixing = (m_channelMode == MixChannels && rawChannels > 1); // SVDEBUG << "WaveformLayer::getChannelArrangement: min " << min << ", max " << max << ", merging " << merging << ", channels " << channels << endl; return channels; } bool WaveformLayer::isLayerScrollable(const LayerGeometryProvider *) const { return !m_autoNormalize; } static float meterdbs[] = { -40, -30, -20, -15, -10, -5, -3, -2, -1, -0.5, 0 }; bool WaveformLayer::getSourceFramesForX(LayerGeometryProvider *v, int x, int modelZoomLevel, sv_frame_t &f0, sv_frame_t &f1) const { sv_frame_t viewFrame = v->getFrameForX(x); if (viewFrame < 0) { f0 = 0; f1 = 0; return false; } f0 = viewFrame; f0 = f0 / modelZoomLevel; f0 = f0 * modelZoomLevel; viewFrame = v->getFrameForX(x + 1); f1 = viewFrame; f1 = f1 / modelZoomLevel; f1 = f1 * modelZoomLevel; return (f0 < m_model->getEndFrame()); } float WaveformLayer::getNormalizeGain(LayerGeometryProvider *v, int channel) const { sv_frame_t startFrame = v->getStartFrame(); sv_frame_t endFrame = v->getEndFrame(); sv_frame_t modelStart = m_model->getStartFrame(); sv_frame_t modelEnd = m_model->getEndFrame(); sv_frame_t rangeStart, rangeEnd; if (startFrame < modelStart) rangeStart = modelStart; else rangeStart = startFrame; if (endFrame < 0) rangeEnd = 0; else if (endFrame > modelEnd) rangeEnd = modelEnd; else rangeEnd = endFrame; if (rangeEnd < rangeStart) rangeEnd = rangeStart; RangeSummarisableTimeValueModel::Range range = m_model->getSummary(channel, rangeStart, rangeEnd - rangeStart); int minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; (void)getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (mergingChannels || mixingChannels) { RangeSummarisableTimeValueModel::Range otherRange = m_model->getSummary(1, rangeStart, rangeEnd - rangeStart); range.setMax(std::max(range.max(), otherRange.max())); range.setMin(std::min(range.min(), otherRange.min())); range.setAbsmean(std::min(range.absmean(), otherRange.absmean())); } return float(1.0 / std::max(fabs(range.max()), fabs(range.min()))); } void WaveformLayer::paint(LayerGeometryProvider *v, QPainter &viewPainter, QRect rect) const { if (!m_model || !m_model->isOK()) { return; } int zoomLevel = v->getZoomLevel(); #ifdef DEBUG_WAVEFORM_PAINT Profiler profiler("WaveformLayer::paint", true); cerr << "WaveformLayer::paint (" << rect.x() << "," << rect.y() << ") [" << rect.width() << "x" << rect.height() << "]: zoom " << zoomLevel << endl; #endif int channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return; int w = v->getPaintWidth(); int h = v->getPaintHeight(); bool ready = m_model->isReady(); QPainter *paint; if (m_aggressive) { #ifdef DEBUG_WAVEFORM_PAINT cerr << "WaveformLayer::paint: aggressive is true" << endl; #endif if (m_cacheValid && (zoomLevel != m_cacheZoomLevel)) { m_cacheValid = false; } if (!m_cache || m_cache->width() != w || m_cache->height() != h) { #ifdef DEBUG_WAVEFORM_PAINT if (m_cache) { cerr << "WaveformLayer::paint: cache size " << m_cache->width() << "x" << m_cache->height() << " differs from view size " << w << "x" << h << ": regenerating aggressive cache" << endl; } #endif delete m_cache; m_cache = new QPixmap(w, h); m_cacheValid = false; } if (m_cacheValid) { viewPainter.drawPixmap(rect, *m_cache, rect); return; } paint = new QPainter(m_cache); paint->setPen(Qt::NoPen); paint->setBrush(getBackgroundQColor(v)); paint->drawRect(rect); paint->setPen(getForegroundQColor(v)); paint->setBrush(Qt::NoBrush); } else { paint = &viewPainter; } paint->setRenderHint(QPainter::Antialiasing, false); if (m_middleLineHeight != 0.5) { paint->save(); double space = m_middleLineHeight * 2; if (space > 1.0) space = 2.0 - space; double yt = h * (m_middleLineHeight - space/2); paint->translate(QPointF(0, yt)); paint->scale(1.0, space); } int x0 = 0, x1 = w - 1; int y0 = 0, y1 = h - 1; x0 = rect.left(); x1 = rect.right(); y0 = rect.top(); y1 = rect.bottom(); if (x0 > 0) --x0; if (x1 < w) ++x1; // Our zoom level may differ from that at which the underlying // model has its blocks. // Each pixel within our visible range must always draw from // exactly the same set of underlying audio frames, no matter what // the range being drawn is. And that set of underlying frames // must remain the same when we scroll one or more pixels left or // right. int modelZoomLevel = m_model->getSummaryBlockSize(zoomLevel); sv_frame_t frame0; sv_frame_t frame1; sv_frame_t spare; getSourceFramesForX(v, x0, modelZoomLevel, frame0, spare); getSourceFramesForX(v, x1, modelZoomLevel, spare, frame1); #ifdef DEBUG_WAVEFORM_PAINT cerr << "Painting waveform from " << frame0 << " to " << frame1 << " (" << (x1-x0+1) << " pixels at zoom " << zoomLevel << " and model zoom " << modelZoomLevel << ")" << endl; #endif RangeSummarisableTimeValueModel::RangeBlock *ranges = new RangeSummarisableTimeValueModel::RangeBlock; RangeSummarisableTimeValueModel::RangeBlock *otherChannelRanges = 0; RangeSummarisableTimeValueModel::Range range; QColor baseColour = getBaseQColor(); std::vector greys = getPartialShades(v); QColor midColour = baseColour; if (midColour == Qt::black) { midColour = Qt::gray; } else if (v->hasLightBackground()) { midColour = midColour.light(150); } else { midColour = midColour.light(50); } while ((int)m_effectiveGains.size() <= maxChannel) { m_effectiveGains.push_back(m_gain); } for (int ch = minChannel; ch <= maxChannel; ++ch) { int prevRangeBottom = -1, prevRangeTop = -1; QColor prevRangeBottomColour = baseColour, prevRangeTopColour = baseColour; m_effectiveGains[ch] = m_gain; if (m_autoNormalize) { m_effectiveGains[ch] = getNormalizeGain(v, ch); } double gain = m_effectiveGains[ch]; int m = (h / channels) / 2; int my = m + (((ch - minChannel) * h) / channels); #ifdef DEBUG_WAVEFORM_PAINT cerr << "ch = " << ch << ", channels = " << channels << ", m = " << m << ", my = " << my << ", h = " << h << endl; #endif if (my - m > y1 || my + m < y0) continue; if ((m_scale == dBScale || m_scale == MeterScale) && m_channelMode != MergeChannels) { m = (h / channels); my = m + (((ch - minChannel) * h) / channels); } paint->setPen(greys[1]); paint->drawLine(x0, my, x1, my); int n = 10; int py = -1; if (v->hasLightBackground() && v->getViewManager() && v->getViewManager()->shouldShowScaleGuides()) { paint->setPen(QColor(240, 240, 240)); for (int i = 1; i < n; ++i) { double val = 0.0, nval = 0.0; switch (m_scale) { case LinearScale: val = (i * gain) / n; if (i > 0) nval = -val; break; case MeterScale: val = AudioLevel::dB_to_multiplier(meterdbs[i]) * gain; break; case dBScale: val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10) * gain; break; } if (val < -1.0 || val > 1.0) continue; int y = getYForValue(v, val, ch); if (py >= 0 && abs(y - py) < 10) continue; else py = y; int ny = y; if (nval != 0.0) { ny = getYForValue(v, nval, ch); } paint->drawLine(x0, y, x1, y); if (ny != y) { paint->drawLine(x0, ny, x1, ny); } } } m_model->getSummaries(ch, frame0, frame1 - frame0, *ranges, modelZoomLevel); #ifdef DEBUG_WAVEFORM_PAINT cerr << "channel " << ch << ": " << ranges->size() << " ranges from " << frame0 << " to " << frame1 << " at zoom level " << modelZoomLevel << endl; #endif if (mergingChannels || mixingChannels) { if (m_model->getChannelCount() > 1) { if (!otherChannelRanges) { otherChannelRanges = new RangeSummarisableTimeValueModel::RangeBlock; } m_model->getSummaries (1, frame0, frame1 - frame0, *otherChannelRanges, modelZoomLevel); } else { if (otherChannelRanges != ranges) delete otherChannelRanges; otherChannelRanges = ranges; } } for (int x = x0; x <= x1; ++x) { range = RangeSummarisableTimeValueModel::Range(); sv_frame_t f0, f1; if (!getSourceFramesForX(v, x, modelZoomLevel, f0, f1)) continue; f1 = f1 - 1; if (f0 < frame0) { cerr << "ERROR: WaveformLayer::paint: pixel " << x << " has f0 = " << f0 << " which is less than range frame0 " << frame0 << " for x0 = " << x0 << endl; continue; } sv_frame_t i0 = (f0 - frame0) / modelZoomLevel; sv_frame_t i1 = (f1 - frame0) / modelZoomLevel; #ifdef DEBUG_WAVEFORM_PAINT cerr << "WaveformLayer::paint: pixel " << x << ": i0 " << i0 << " (f " << f0 << "), i1 " << i1 << " (f " << f1 << ")" << endl; #endif if (i1 > i0 + 1) { cerr << "WaveformLayer::paint: ERROR: i1 " << i1 << " > i0 " << i0 << " plus one (zoom = " << zoomLevel << ", model zoom = " << modelZoomLevel << ")" << endl; } if (ranges && i0 < (sv_frame_t)ranges->size()) { range = (*ranges)[size_t(i0)]; if (i1 > i0 && i1 < (int)ranges->size()) { range.setMax(std::max(range.max(), (*ranges)[size_t(i1)].max())); range.setMin(std::min(range.min(), (*ranges)[size_t(i1)].min())); range.setAbsmean((range.absmean() + (*ranges)[size_t(i1)].absmean()) / 2); } } else { #ifdef DEBUG_WAVEFORM_PAINT cerr << "No (or not enough) ranges for i0 = " << i0 << endl; #endif continue; } int rangeBottom = 0, rangeTop = 0, meanBottom = 0, meanTop = 0; if (mergingChannels) { if (otherChannelRanges && i0 < (sv_frame_t)otherChannelRanges->size()) { range.setMax(fabsf(range.max())); range.setMin(-fabsf((*otherChannelRanges)[size_t(i0)].max())); range.setAbsmean ((range.absmean() + (*otherChannelRanges)[size_t(i0)].absmean()) / 2); if (i1 > i0 && i1 < (sv_frame_t)otherChannelRanges->size()) { // let's not concern ourselves about the mean range.setMin (std::min (range.min(), -fabsf((*otherChannelRanges)[size_t(i1)].max()))); } } } else if (mixingChannels) { if (otherChannelRanges && i0 < (sv_frame_t)otherChannelRanges->size()) { range.setMax((range.max() + (*otherChannelRanges)[size_t(i0)].max()) / 2); range.setMin((range.min() + (*otherChannelRanges)[size_t(i0)].min()) / 2); range.setAbsmean((range.absmean() + (*otherChannelRanges)[size_t(i0)].absmean()) / 2); } } int greyLevels = 1; if (m_greyscale && (m_scale == LinearScale)) greyLevels = 4; switch (m_scale) { case LinearScale: rangeBottom = int(double(m * greyLevels) * range.min() * gain); rangeTop = int(double(m * greyLevels) * range.max() * gain); meanBottom = int(double(-m) * range.absmean() * gain); meanTop = int(double(m) * range.absmean() * gain); break; case dBScale: if (!mergingChannels) { int db0 = dBscale(range.min() * gain, m); int db1 = dBscale(range.max() * gain, m); rangeTop = std::max(db0, db1); meanTop = std::min(db0, db1); if (mixingChannels) rangeBottom = meanTop; else rangeBottom = dBscale(range.absmean() * gain, m); meanBottom = rangeBottom; } else { rangeBottom = -dBscale(range.min() * gain, m * greyLevels); rangeTop = dBscale(range.max() * gain, m * greyLevels); meanBottom = -dBscale(range.absmean() * gain, m); meanTop = dBscale(range.absmean() * gain, m); } break; case MeterScale: if (!mergingChannels) { int r0 = abs(AudioLevel::multiplier_to_preview(range.min() * gain, m)); int r1 = abs(AudioLevel::multiplier_to_preview(range.max() * gain, m)); rangeTop = std::max(r0, r1); meanTop = std::min(r0, r1); if (mixingChannels) rangeBottom = meanTop; else rangeBottom = AudioLevel::multiplier_to_preview(range.absmean() * gain, m); meanBottom = rangeBottom; } else { rangeBottom = -AudioLevel::multiplier_to_preview(range.min() * gain, m * greyLevels); rangeTop = AudioLevel::multiplier_to_preview(range.max() * gain, m * greyLevels); meanBottom = -AudioLevel::multiplier_to_preview(range.absmean() * gain, m); meanTop = AudioLevel::multiplier_to_preview(range.absmean() * gain, m); } break; } rangeBottom = my * greyLevels - rangeBottom; rangeTop = my * greyLevels - rangeTop; meanBottom = my - meanBottom; meanTop = my - meanTop; int topFill = (rangeTop % greyLevels); if (topFill > 0) topFill = greyLevels - topFill; int bottomFill = (rangeBottom % greyLevels); rangeTop = rangeTop / greyLevels; rangeBottom = rangeBottom / greyLevels; bool clipped = false; if (rangeTop < my - m) { rangeTop = my - m; } if (rangeTop > my + m) { rangeTop = my + m; } if (rangeBottom < my - m) { rangeBottom = my - m; } if (rangeBottom > my + m) { rangeBottom = my + m; } if (range.max() <= -1.0 || range.max() >= 1.0) clipped = true; if (meanBottom > rangeBottom) meanBottom = rangeBottom; if (meanTop < rangeTop) meanTop = rangeTop; bool drawMean = m_showMeans; if (meanTop == rangeTop) { if (meanTop < meanBottom) ++meanTop; else drawMean = false; } if (meanBottom == rangeBottom && m_scale == LinearScale) { if (meanBottom > meanTop) --meanBottom; else drawMean = false; } if (x != x0 && prevRangeBottom != -1) { if (prevRangeBottom > rangeBottom + 1 && prevRangeTop > rangeBottom + 1) { // paint->setPen(midColour); paint->setPen(baseColour); paint->drawLine(x-1, prevRangeTop, x, rangeBottom + 1); paint->setPen(prevRangeTopColour); paint->drawPoint(x-1, prevRangeTop); } else if (prevRangeBottom < rangeTop - 1 && prevRangeTop < rangeTop - 1) { // paint->setPen(midColour); paint->setPen(baseColour); paint->drawLine(x-1, prevRangeBottom, x, rangeTop - 1); paint->setPen(prevRangeBottomColour); paint->drawPoint(x-1, prevRangeBottom); } } if (ready) { if (clipped /*!!! || range.min() * gain <= -1.0 || range.max() * gain >= 1.0 */) { paint->setPen(Qt::red); //!!! getContrastingColour } else { paint->setPen(baseColour); } } else { paint->setPen(midColour); } #ifdef DEBUG_WAVEFORM_PAINT cerr << "range " << rangeBottom << " -> " << rangeTop << ", means " << meanBottom << " -> " << meanTop << ", raw range " << range.min() << " -> " << range.max() << endl; #endif if (rangeTop == rangeBottom) { paint->drawPoint(x, rangeTop); } else { paint->drawLine(x, rangeBottom, x, rangeTop); } prevRangeTopColour = baseColour; prevRangeBottomColour = baseColour; if (m_greyscale && (m_scale == LinearScale) && ready) { if (!clipped) { if (rangeTop < rangeBottom) { if (topFill > 0 && (!drawMean || (rangeTop < meanTop - 1))) { paint->setPen(greys[topFill - 1]); paint->drawPoint(x, rangeTop); prevRangeTopColour = greys[topFill - 1]; } if (bottomFill > 0 && (!drawMean || (rangeBottom > meanBottom + 1))) { paint->setPen(greys[bottomFill - 1]); paint->drawPoint(x, rangeBottom); prevRangeBottomColour = greys[bottomFill - 1]; } } } } if (drawMean) { paint->setPen(midColour); paint->drawLine(x, meanBottom, x, meanTop); } prevRangeBottom = rangeBottom; prevRangeTop = rangeTop; } } if (m_middleLineHeight != 0.5) { paint->restore(); } if (m_aggressive) { if (ready && rect == v->getPaintRect()) { m_cacheValid = true; m_cacheZoomLevel = zoomLevel; } paint->end(); delete paint; viewPainter.drawPixmap(rect, *m_cache, rect); } if (otherChannelRanges != ranges) delete otherChannelRanges; delete ranges; } QString WaveformLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->isOK()) return ""; int zoomLevel = v->getZoomLevel(); int modelZoomLevel = m_model->getSummaryBlockSize(zoomLevel); sv_frame_t f0, f1; if (!getSourceFramesForX(v, x, modelZoomLevel, f0, f1)) return ""; QString text; RealTime rt0 = RealTime::frame2RealTime(f0, m_model->getSampleRate()); RealTime rt1 = RealTime::frame2RealTime(f1, m_model->getSampleRate()); if (f1 != f0 + 1 && (rt0.sec != rt1.sec || rt0.msec() != rt1.msec())) { text += tr("Time:\t%1 - %2") .arg(rt0.toText(true).c_str()) .arg(rt1.toText(true).c_str()); } else { text += tr("Time:\t%1") .arg(rt0.toText(true).c_str()); } int channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return ""; for (int ch = minChannel; ch <= maxChannel; ++ch) { int blockSize = v->getZoomLevel(); RangeSummarisableTimeValueModel::RangeBlock ranges; m_model->getSummaries(ch, f0, f1 - f0, ranges, blockSize); if (ranges.empty()) continue; RangeSummarisableTimeValueModel::Range range = ranges[0]; QString label = tr("Level:"); if (minChannel != maxChannel) { if (ch == 0) label = tr("Left:"); else if (ch == 1) label = tr("Right:"); else label = tr("Channel %1").arg(ch + 1); } bool singleValue = false; double min, max; if (fabs(range.min()) < 0.01) { min = range.min(); max = range.max(); singleValue = (min == max); } else { int imin = int(lrint(range.min() * 10000)); int imax = int(lrint(range.max() * 10000)); singleValue = (imin == imax); min = double(imin)/10000; max = double(imax)/10000; } int db = int(AudioLevel::multiplier_to_dB(std::max(fabsf(range.min()), fabsf(range.max()))) * 100); if (!singleValue) { text += tr("\n%1\t%2 - %3 (%4 dB peak)") .arg(label).arg(min).arg(max).arg(double(db)/100); } else { text += tr("\n%1\t%2 (%3 dB peak)") .arg(label).arg(min).arg(double(db)/100); } } return text; } int WaveformLayer::getYForValue(const LayerGeometryProvider *v, double value, int channel) const { int channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return 0; if (maxChannel < minChannel || channel < minChannel) return 0; int h = v->getPaintHeight(); int m = (h / channels) / 2; if ((m_scale == dBScale || m_scale == MeterScale) && m_channelMode != MergeChannels) { m = (h / channels); } int my = m + (((channel - minChannel) * h) / channels); int vy = 0; switch (m_scale) { case LinearScale: vy = int(m * value); break; case MeterScale: vy = AudioLevel::multiplier_to_preview(value, m); break; case dBScale: vy = dBscale(value, m); break; } // cerr << "mergingChannels= " << mergingChannels << ", channel = " << channel << ", value = " << value << ", vy = " << vy << endl; return my - vy; } double WaveformLayer::getValueForY(const LayerGeometryProvider *v, int y, int &channel) const { int channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return 0; if (maxChannel < minChannel) return 0; int h = v->getPaintHeight(); int m = (h / channels) / 2; if ((m_scale == dBScale || m_scale == MeterScale) && m_channelMode != MergeChannels) { m = (h / channels); } channel = (y * channels) / h + minChannel; int my = m + (((channel - minChannel) * h) / channels); int vy = my - y; double value = 0; double thresh = -50.f; switch (m_scale) { case LinearScale: value = double(vy) / m; break; case MeterScale: value = AudioLevel::preview_to_multiplier(vy, m); break; case dBScale: value = (-thresh * double(vy)) / m + thresh; value = AudioLevel::dB_to_multiplier(value); break; } return value / m_gain; } bool WaveformLayer::getYScaleValue(const LayerGeometryProvider *v, int y, double &value, QString &unit) const { int channel; value = getValueForY(v, y, channel); if (m_scale == dBScale || m_scale == MeterScale) { double thresh = -50.f; if (value > 0.0) { value = 10.0 * log10(value); if (value < thresh) value = thresh; } else value = thresh; unit = "dBV"; } else { unit = "V"; } return true; } bool WaveformLayer::getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1, double &diff, QString &unit) const { int c0, c1; double v0 = getValueForY(v, y0, c0); double v1 = getValueForY(v, y1, c1); if (c0 != c1) { // different channels, not comparable diff = 0.0; unit = ""; return false; } if (m_scale == dBScale || m_scale == MeterScale) { double thresh = -50.0; if (v1 == v0) diff = thresh; else { if (v1 > v0) diff = v0 / v1; else diff = v1 / v0; diff = 10.0 * log10(diff); if (diff < thresh) diff = thresh; } unit = "dBV"; } else { diff = fabs(v1 - v0); unit = "V"; } return true; } int WaveformLayer::getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &paint) const { if (m_scale == LinearScale) { return paint.fontMetrics().width("0.0") + 13; } else { return std::max(paint.fontMetrics().width(tr("0dB")), paint.fontMetrics().width(Strings::minus_infinity)) + 13; } } void WaveformLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) { return; } int channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return; int h = rect.height(), w = rect.width(); int textHeight = paint.fontMetrics().height(); int toff = -textHeight/2 + paint.fontMetrics().ascent() + 1; double gain = m_gain; for (int ch = minChannel; ch <= maxChannel; ++ch) { int lastLabelledY = -1; if (ch < (int)m_effectiveGains.size()) gain = m_effectiveGains[ch]; int n = 10; for (int i = 0; i <= n; ++i) { double val = 0.0, nval = 0.0; QString text = ""; switch (m_scale) { case LinearScale: val = (i * gain) / n; text = QString("%1").arg(double(i) / n); if (i == 0) text = "0.0"; else { nval = -val; if (i == n) text = "1.0"; } break; case MeterScale: val = AudioLevel::dB_to_multiplier(meterdbs[i]) * gain; text = QString("%1").arg(meterdbs[i]); if (i == n) text = tr("0dB"); if (i == 0) { text = Strings::minus_infinity; val = 0.0; } break; case dBScale: val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10) * gain; text = QString("%1").arg(-(10*n) + i * 10); if (i == n) text = tr("0dB"); if (i == 0) { text = Strings::minus_infinity; val = 0.0; } break; } if (val < -1.0 || val > 1.0) continue; int y = getYForValue(v, val, ch); int ny = y; if (nval != 0.0) { ny = getYForValue(v, nval, ch); } bool spaceForLabel = (i == 0 || abs(y - lastLabelledY) >= textHeight - 1); if (spaceForLabel) { int tx = 3; if (m_scale != LinearScale) { tx = w - 10 - paint.fontMetrics().width(text); } int ty = y; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); } else if (ty > h - paint.fontMetrics().descent()) { ty = h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); lastLabelledY = ty - toff; if (ny != y) { ty = ny; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); } else if (ty > h - paint.fontMetrics().descent()) { ty = h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); } paint.drawLine(w - 7, y, w, y); if (ny != y) paint.drawLine(w - 7, ny, w, ny); } else { paint.drawLine(w - 4, y, w, y); if (ny != y) paint.drawLine(w - 4, ny, w, ny); } } } } void WaveformLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; QString colourName, colourSpec, darkbg; ColourDatabase::getInstance()->getStringValues (m_colour, colourName, colourSpec, darkbg); s += QString("gain=\"%1\" " "showMeans=\"%2\" " "greyscale=\"%3\" " "channelMode=\"%4\" " "channel=\"%5\" " "scale=\"%6\" " "middleLineHeight=\"%7\" " "aggressive=\"%8\" " "autoNormalize=\"%9\"") .arg(m_gain) .arg(m_showMeans) .arg(m_greyscale) .arg(m_channelMode) .arg(m_channel) .arg(m_scale) .arg(m_middleLineHeight) .arg(m_aggressive) .arg(m_autoNormalize); SingleColourLayer::toXml(stream, indent, extraAttributes + " " + s); } void WaveformLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false; SingleColourLayer::setProperties(attributes); float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); bool showMeans = (attributes.value("showMeans") == "1" || attributes.value("showMeans") == "true"); setShowMeans(showMeans); bool greyscale = (attributes.value("greyscale") == "1" || attributes.value("greyscale") == "true"); setUseGreyscale(greyscale); ChannelMode channelMode = (ChannelMode) attributes.value("channelMode").toInt(&ok); if (ok) setChannelMode(channelMode); int channel = attributes.value("channel").toInt(&ok); if (ok) setChannel(channel); Scale scale = (Scale)attributes.value("scale").toInt(&ok); if (ok) setScale(scale); float middleLineHeight = attributes.value("middleLineHeight").toFloat(&ok); if (ok) setMiddleLineHeight(middleLineHeight); bool aggressive = (attributes.value("aggressive") == "1" || attributes.value("aggressive") == "true"); setUseGreyscale(aggressive); bool autoNormalize = (attributes.value("autoNormalize") == "1" || attributes.value("autoNormalize") == "true"); setAutoNormalize(autoNormalize); } int WaveformLayer::getVerticalZoomSteps(int &defaultStep) const { defaultStep = 50; return 100; } int WaveformLayer::getCurrentVerticalZoomStep() const { int val = int(lrint(log10(m_gain) * 20.0) + 50); if (val < 0) val = 0; if (val > 100) val = 100; return val; } void WaveformLayer::setVerticalZoomStep(int step) { setGain(powf(10, float(step - 50) / 20.f)); } sonic-visualiser-3.0.3/svgui/layer/WaveformLayer.h0000644000000000000000000002141013111512442020337 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _WAVEFORM_LAYER_H_ #define _WAVEFORM_LAYER_H_ #include #include "SingleColourLayer.h" #include "data/model/RangeSummarisableTimeValueModel.h" class View; class QPainter; class QPixmap; class WaveformLayer : public SingleColourLayer { Q_OBJECT public: WaveformLayer(); ~WaveformLayer(); virtual const ZoomConstraint *getZoomConstraint() const { return m_model ? m_model->getZoomConstraint() : 0; } virtual const Model *getModel() const { return m_model; } virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourAndBackgroundSignificant; } virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool detailed, QPainter &) const; virtual void paintVerticalScale(LayerGeometryProvider *v, bool detailed, QPainter &paint, QRect rect) const; void setModel(const RangeSummarisableTimeValueModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); /** * Set the gain multiplier for sample values in this view. * * The default is 1.0. */ void setGain(float gain); float getGain() const { return m_gain; } /** * Toggle automatic normalization of the currently visible waveform. */ void setAutoNormalize(bool); bool getAutoNormalize() const { return m_autoNormalize; } /** * Set whether to display mean values as a lighter-coloured area * beneath the peaks. Rendering will be slightly faster without * but arguably prettier with. * * The default is to display means. */ void setShowMeans(bool); bool getShowMeans() const { return m_showMeans; } /** * Set whether to use shades of grey (or of the base colour) to * provide additional perceived vertical resolution (i.e. using * half-filled pixels to represent levels that only just meet the * pixel unit boundary). This provides a small improvement in * waveform quality at a small cost in rendering speed. * * The default is to use greyscale. */ void setUseGreyscale(bool); bool getUseGreyscale() const { return m_greyscale; } enum ChannelMode { SeparateChannels, MixChannels, MergeChannels }; /** * Specify whether multi-channel audio data should be displayed * with a separate axis per channel (SeparateChannels), with a * single synthetic axis showing channel 0 above the axis and * channel 1 below (MergeChannels), or with a single axis showing * the average of the channels (MixChannels). * * MergeChannels does not work for files with more than 2 * channels. * * The default is SeparateChannels. */ void setChannelMode(ChannelMode); ChannelMode getChannelMode() const { return m_channelMode; } /** * Specify the channel to use from the source model. A value of * -1 means to show all available channels (laid out to the * channel mode). The default is -1. */ void setChannel(int); int getChannel() const { return m_channel; } enum Scale { LinearScale, MeterScale, dBScale }; /** * Specify the vertical scale for sample levels. With LinearScale, * the scale is directly proportional to the raw [-1, +1) * floating-point audio sample values. With dBScale the * vertical scale is proportional to dB level (truncated at * -50dB). MeterScale provides a hybrid variable scale based on * IEC meter scale, intended to provide a clear overview at * relatively small heights. * * Note that the effective gain (see setGain()) is applied before * vertical scaling. * * The default is LinearScale. */ void setScale(Scale); Scale getScale() const { return m_scale; } /** * Specify the height of the middle of the waveform track or * tracks within the layer, from 0.0 to 1.0. * * A value of 0.0 would indicate that the waveform occupies * effectively no space at the very top of the layer; 1.0 would * indicate that the waveform occupies no space at the very * bottom; the default value of 0.5 indicates that it occupies the * whole layer, centred at the middle. */ void setMiddleLineHeight(double); double getMiddleLineHeight() const { return m_middleLineHeight; } /** * Enable or disable aggressive pixmap cacheing. If enabled, * waveforms will be rendered to an off-screen pixmap and * refreshed from there instead of being redrawn from the peak * data each time. This may be faster if the data and zoom level * do not change often, but it may be slower for frequently zoomed * data and it will only work if the waveform is the "bottom" * layer on the displayed widget, as each refresh will erase * anything beneath the waveform. * * This is intended specifically for a panner widget display in * which the waveform never moves, zooms, or changes, but some * graphic such as a panner outline is frequently redrawn over the * waveform. This situation would necessitate a lot of waveform * refresh if the default cacheing strategy was used. * * The default is not to use aggressive cacheing. */ void setAggressiveCacheing(bool); bool getAggressiveCacheing() const { return m_aggressive; } virtual bool isLayerScrollable(const LayerGeometryProvider *) const; virtual int getCompletion(LayerGeometryProvider *) const; virtual bool getValueExtents(double &min, double &max, bool &log, QString &unit) const; virtual bool getYScaleValue(const LayerGeometryProvider *v, int y, double &value, QString &unit) const; virtual bool getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1, double &diff, QString &unit) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual void setProperties(const QXmlAttributes &attributes); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual bool canExistWithoutModel() const { return true; } protected: int dBscale(double sample, int m) const; const RangeSummarisableTimeValueModel *m_model; // I do not own this /// Return value is number of channels displayed int getChannelArrangement(int &min, int &max, bool &merging, bool &mixing) const; int getYForValue(const LayerGeometryProvider *v, double value, int channel) const; double getValueForY(const LayerGeometryProvider *v, int y, int &channel) const; bool getSourceFramesForX(LayerGeometryProvider *v, int x, int modelZoomLevel, sv_frame_t &f0, sv_frame_t &f1) const; float getNormalizeGain(LayerGeometryProvider *v, int channel) const; virtual void flagBaseColourChanged() { m_cacheValid = false; } float m_gain; bool m_autoNormalize; bool m_showMeans; bool m_greyscale; ChannelMode m_channelMode; int m_channel; Scale m_scale; double m_middleLineHeight; bool m_aggressive; mutable std::vector m_effectiveGains; mutable QPixmap *m_cache; mutable bool m_cacheValid; mutable int m_cacheZoomLevel; }; #endif sonic-visualiser-3.0.3/svgui/svgui.pro0000644000000000000000000000061413111512442016151 0ustar 00000000000000 TEMPLATE = lib INCLUDEPATH += ../vamp-plugin-sdk exists(config.pri) { include(config.pri) } CONFIG += staticlib qt thread warn_on stl rtti exceptions c++11 QT += network xml gui widgets svg TARGET = svgui DEPENDPATH += . ../svcore INCLUDEPATH += . ../svcore OBJECTS_DIR = o MOC_DIR = o include(files.pri) HEADERS = $$(SVGUI_HEADERS) SOURCES = $$(SVGUI_SOURCES) sonic-visualiser-3.0.3/svgui/view/AlignmentView.cpp0000644000000000000000000001004213111512442020515 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2014 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "AlignmentView.h" #include #include "data/model/SparseOneDimensionalModel.h" #include "layer/TimeInstantLayer.h" using std::vector; AlignmentView::AlignmentView(QWidget *w) : View(w, false), m_above(0), m_below(0) { setObjectName(tr("AlignmentView")); } void AlignmentView::globalCentreFrameChanged(sv_frame_t f) { View::globalCentreFrameChanged(f); update(); } void AlignmentView::viewCentreFrameChanged(View *v, sv_frame_t f) { View::viewCentreFrameChanged(v, f); if (v == m_above) { m_centreFrame = f; update(); } else if (v == m_below) { update(); } } void AlignmentView::viewManagerPlaybackFrameChanged(sv_frame_t) { update(); } void AlignmentView::viewAboveZoomLevelChanged(int level, bool) { m_zoomLevel = level; update(); } void AlignmentView::viewBelowZoomLevelChanged(int, bool) { update(); } void AlignmentView::setViewAbove(View *v) { if (m_above) { disconnect(m_above, 0, this, 0); } m_above = v; if (m_above) { connect(m_above, SIGNAL(zoomLevelChanged(int, bool)), this, SLOT(viewAboveZoomLevelChanged(int, bool))); } } void AlignmentView::setViewBelow(View *v) { if (m_below) { disconnect(m_below, 0, this, 0); } m_below = v; if (m_below) { connect(m_below, SIGNAL(zoomLevelChanged(int, bool)), this, SLOT(viewBelowZoomLevelChanged(int, bool))); } } void AlignmentView::paintEvent(QPaintEvent *) { if (m_above == 0 || m_below == 0 || !m_manager) return; bool darkPalette = false; if (m_manager) darkPalette = m_manager->getGlobalDarkBackground(); QColor fg, bg; if (darkPalette) { fg = Qt::gray; bg = Qt::black; } else { fg = Qt::black; bg = Qt::gray; } QPainter paint(this); paint.setPen(QPen(fg, 2)); paint.setBrush(Qt::NoBrush); paint.setRenderHint(QPainter::Antialiasing, true); paint.fillRect(rect(), bg); vector keyFrames = getKeyFrames(); foreach (sv_frame_t f, keyFrames) { int ax = m_above->getXForFrame(f); sv_frame_t rf = m_above->alignToReference(f); sv_frame_t bf = m_below->alignFromReference(rf); int bx = m_below->getXForFrame(bf); paint.drawLine(ax, 0, bx, height()); } paint.end(); } vector AlignmentView::getKeyFrames() { if (!m_above) { return getDefaultKeyFrames(); } SparseOneDimensionalModel *m = 0; // get the topmost such for (int i = 0; i < m_above->getLayerCount(); ++i) { if (qobject_cast(m_above->getLayer(i))) { SparseOneDimensionalModel *mm = qobject_cast (m_above->getLayer(i)->getModel()); if (mm) m = mm; } } if (!m) { return getDefaultKeyFrames(); } vector keyFrames; const SparseOneDimensionalModel::PointList pp = m->getPoints(); for (SparseOneDimensionalModel::PointList::const_iterator pi = pp.begin(); pi != pp.end(); ++pi) { keyFrames.push_back(pi->frame); } return keyFrames; } vector AlignmentView::getDefaultKeyFrames() { vector keyFrames; if (!m_above || !m_manager) return keyFrames; sv_samplerate_t rate = m_manager->getMainModelSampleRate(); if (rate == 0) return keyFrames; for (sv_frame_t f = m_above->getModelsStartFrame(); f <= m_above->getModelsEndFrame(); f += sv_frame_t(rate * 5 + 0.5)) { keyFrames.push_back(f); } return keyFrames; } sonic-visualiser-3.0.3/svgui/view/AlignmentView.h0000644000000000000000000000275113111512442020172 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2014 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef ALIGNMENT_VIEW_H #define ALIGNMENT_VIEW_H #include "View.h" class AlignmentView : public View { Q_OBJECT public: AlignmentView(QWidget *parent = 0); virtual QString getPropertyContainerIconName() const { return "alignment"; } void setViewAbove(View *view); void setViewBelow(View *view); public slots: virtual void globalCentreFrameChanged(sv_frame_t); virtual void viewCentreFrameChanged(View *, sv_frame_t); virtual void viewAboveZoomLevelChanged(int, bool); virtual void viewBelowZoomLevelChanged(int, bool); virtual void viewManagerPlaybackFrameChanged(sv_frame_t); protected: virtual void paintEvent(QPaintEvent *e); virtual bool shouldLabelSelections() const { return false; } std::vector getKeyFrames(); std::vector getDefaultKeyFrames(); View *m_above; View *m_below; }; #endif sonic-visualiser-3.0.3/svgui/view/Overview.cpp0000644000000000000000000002232413111512442017560 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Overview.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "base/ZoomConstraint.h" #include #include #include //#define DEBUG_OVERVIEW 1 Overview::Overview(QWidget *w) : View(w, false), m_clickedInRange(false), m_dragCentreFrame(0) { setObjectName(tr("Overview")); m_followPan = false; m_followZoom = false; setPlaybackFollow(PlaybackIgnore); m_modelTestTime.start(); bool light = hasLightBackground(); if (light) m_boxColour = Qt::darkGray; else m_boxColour = Qt::lightGray; } void Overview::modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame) { bool zoomChanged = false; sv_frame_t frameCount = getModelsEndFrame() - getModelsStartFrame(); int zoomLevel = int(frameCount / width()); if (zoomLevel < 1) zoomLevel = 1; zoomLevel = getZoomConstraintBlockSize(zoomLevel, ZoomConstraint::RoundUp); if (zoomLevel != m_zoomLevel) { zoomChanged = true; } if (!zoomChanged) { if (m_modelTestTime.elapsed() < 1000) { for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getModel() && (!(*i)->getModel()->isOK() || !(*i)->getModel()->isReady())) { return; } } } else { m_modelTestTime.restart(); } } View::modelChangedWithin(startFrame, endFrame); } void Overview::modelReplaced() { m_playPointerFrame = getAlignedPlaybackFrame(); View::modelReplaced(); } void Overview::registerView(View *view) { m_views.insert(view); update(); } void Overview::unregisterView(View *view) { m_views.erase(view); update(); } void Overview::globalCentreFrameChanged(sv_frame_t #ifdef DEBUG_OVERVIEW f #endif ) { #ifdef DEBUG_OVERVIEW cerr << "Overview::globalCentreFrameChanged: " << f << endl; #endif update(); } void Overview::viewCentreFrameChanged(View *v, sv_frame_t #ifdef DEBUG_OVERVIEW f #endif ) { #ifdef DEBUG_OVERVIEW cerr << "Overview[" << this << "]::viewCentreFrameChanged(" << v << "): " << f << endl; #endif if (m_views.find(v) != m_views.end()) { update(); } } void Overview::viewZoomLevelChanged(View *v, int, bool) { if (v == this) return; if (m_views.find(v) != m_views.end()) { update(); } } void Overview::viewManagerPlaybackFrameChanged(sv_frame_t f) { #ifdef DEBUG_OVERVIEW cerr << "Overview[" << this << "]::viewManagerPlaybackFrameChanged(" << f << "): " << f << endl; #endif bool changed = false; f = getAlignedPlaybackFrame(); if (getXForFrame(m_playPointerFrame) != getXForFrame(f)) changed = true; m_playPointerFrame = f; if (changed) update(); } QColor Overview::getFillWithin() const { return Qt::transparent; } QColor Overview::getFillWithout() const { QColor c = palette().window().color(); c.setAlpha(100); return c; } void Overview::setBoxColour(QColor c) { m_boxColour = c; } void Overview::paintEvent(QPaintEvent *e) { // Recalculate zoom in case the size of the widget has changed. #ifdef DEBUG_OVERVIEW cerr << "Overview::paintEvent: width is " << width() << ", centre frame " << m_centreFrame << endl; #endif sv_frame_t startFrame = getModelsStartFrame(); sv_frame_t frameCount = getModelsEndFrame() - getModelsStartFrame(); int zoomLevel = int(frameCount / width()); if (zoomLevel < 1) zoomLevel = 1; zoomLevel = getZoomConstraintBlockSize(zoomLevel, ZoomConstraint::RoundUp); if (zoomLevel != m_zoomLevel) { m_zoomLevel = zoomLevel; emit zoomLevelChanged(m_zoomLevel, m_followZoom); } sv_frame_t centreFrame = startFrame + m_zoomLevel * (width() / 2); if (centreFrame > (startFrame + getModelsEndFrame())/2) { centreFrame = (startFrame + getModelsEndFrame())/2; } if (centreFrame != m_centreFrame) { #ifdef DEBUG_OVERVIEW cerr << "Overview::paintEvent: Centre frame changed from " << m_centreFrame << " to " << centreFrame << " and thus start frame from " << getStartFrame(); #endif m_centreFrame = centreFrame; #ifdef DEBUG_OVERVIEW cerr << " to " << getStartFrame() << endl; #endif emit centreFrameChanged(m_centreFrame, false, PlaybackIgnore); } View::paintEvent(e); QPainter paint; paint.begin(this); paint.setClipRegion(e->region()); paint.setRenderHints(QPainter::Antialiasing); // We paint a rounded rect for each distinct set of view extents, // and we colour in the inside and outside of the rect that // corresponds to the current view. (One small caveat -- we don't // know which rect that is yet. We'll have to figure it out // somehow...) std::set > extents; std::vector rects; QRect primary; int y = 0; for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) { if (!*i) continue; View *w = (View *)*i; sv_frame_t f0 = w->getFrameForX(0); sv_frame_t f1 = w->getFrameForX(w->width()); if (f0 >= 0) { sv_frame_t rf0 = w->alignToReference(f0); f0 = alignFromReference(rf0); } if (f1 >= 0) { sv_frame_t rf1 = w->alignToReference(f1); f1 = alignFromReference(rf1); } int x0 = getXForFrame(f0); int x1 = getXForFrame(f1); if (x1 <= x0) x1 = x0 + 1; std::pair extent(x0, x1); if (extents.find(extent) == extents.end()) { y += height() / 10 + 1; extents.insert(extent); QRect vr(x0, y, x1 - x0, height() - 2 * y); rects.push_back(vr); primary = vr; //!!! for now } } QPainterPath without; without.addRoundedRect(primary, 4, 4); without.addRect(rect()); paint.setPen(Qt::NoPen); paint.setBrush(getFillWithout()); paint.drawPath(without); paint.setBrush(getFillWithin()); paint.drawRoundedRect(primary, 4, 4); foreach (QRect vr, rects) { paint.setBrush(Qt::NoBrush); paint.setPen(QPen(m_boxColour, 2)); paint.drawRoundedRect(vr, 4, 4); } paint.end(); } void Overview::mousePressEvent(QMouseEvent *e) { m_clickPos = e->pos(); sv_frame_t clickFrame = getFrameForX(m_clickPos.x()); if (clickFrame > 0) m_dragCentreFrame = clickFrame; else m_dragCentreFrame = 0; m_clickedInRange = true; for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) { if (*i && (*i)->getAligningModel() == getAligningModel()) { m_dragCentreFrame = (*i)->getCentreFrame(); break; } } } void Overview::mouseReleaseEvent(QMouseEvent *e) { if (m_clickedInRange) { mouseMoveEvent(e); } m_clickedInRange = false; } void Overview::mouseMoveEvent(QMouseEvent *e) { if (!m_clickedInRange) return; int xoff = int(e->x()) - int(m_clickPos.x()); sv_frame_t frameOff = xoff * m_zoomLevel; sv_frame_t newCentreFrame = m_dragCentreFrame; if (frameOff > 0) { newCentreFrame += frameOff; } else if (newCentreFrame >= -frameOff) { newCentreFrame += frameOff; } else { newCentreFrame = 0; } if (newCentreFrame >= getModelsEndFrame()) { newCentreFrame = getModelsEndFrame(); if (newCentreFrame > 0) --newCentreFrame; } if (std::max(m_centreFrame, newCentreFrame) - std::min(m_centreFrame, newCentreFrame) > m_zoomLevel) { sv_frame_t rf = alignToReference(newCentreFrame); #ifdef DEBUG_OVERVIEW cerr << "Overview::mouseMoveEvent: x " << e->x() << " and click x " << m_clickPos.x() << " -> frame " << newCentreFrame << " -> rf " << rf << endl; #endif if (m_followPlay == PlaybackScrollContinuous || m_followPlay == PlaybackScrollPageWithCentre) { emit centreFrameChanged(rf, true, PlaybackScrollContinuous); } else { emit centreFrameChanged(rf, true, PlaybackIgnore); } } } void Overview::mouseDoubleClickEvent(QMouseEvent *e) { sv_frame_t frame = getFrameForX(e->x()); sv_frame_t rf = 0; if (frame > 0) rf = alignToReference(frame); #ifdef DEBUG_OVERVIEW cerr << "Overview::mouseDoubleClickEvent: frame " << frame << " -> rf " << rf << endl; #endif m_clickedInRange = false; // we're not starting a drag with the second click emit centreFrameChanged(rf, true, PlaybackScrollContinuous); } void Overview::enterEvent(QEvent *) { emit contextHelpChanged(tr("Click and drag to navigate; double-click to jump")); } void Overview::leaveEvent(QEvent *) { emit contextHelpChanged(""); } sonic-visualiser-3.0.3/svgui/view/Overview.h0000644000000000000000000000415213111512442017224 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _OVERVIEW_H_ #define _OVERVIEW_H_ #include "View.h" #include #include class QWidget; class QPaintEvent; class Layer; class View; #include class Overview : public View { Q_OBJECT public: Overview(QWidget *parent = 0); void registerView(View *view); void unregisterView(View *view); virtual QString getPropertyContainerIconName() const { return "panner"; } public slots: virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); virtual void modelReplaced(); virtual void globalCentreFrameChanged(sv_frame_t); virtual void viewCentreFrameChanged(View *, sv_frame_t); virtual void viewZoomLevelChanged(View *, int, bool); virtual void viewManagerPlaybackFrameChanged(sv_frame_t); virtual void setBoxColour(QColor); protected: virtual void paintEvent(QPaintEvent *e); virtual void mousePressEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); virtual bool shouldLabelSelections() const { return false; } QColor getFillWithin() const; QColor getFillWithout() const; QPoint m_clickPos; QPoint m_mousePos; bool m_clickedInRange; sv_frame_t m_dragCentreFrame; QTime m_modelTestTime; QColor m_boxColour; typedef std::set ViewSet; ViewSet m_views; }; #endif sonic-visualiser-3.0.3/svgui/view/Pane.cpp0000644000000000000000000025574613111512442016655 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Pane.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "base/ZoomConstraint.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "ViewManager.h" #include "widgets/CommandHistory.h" #include "widgets/TextAbbrev.h" #include "widgets/IconLoader.h" #include "base/Preferences.h" #include "layer/WaveformLayer.h" #include "layer/TimeRulerLayer.h" #include "layer/PaintAssistant.h" // GF: added so we can propagate the mouse move event to the note layer for context handling. #include "layer/LayerFactory.h" #include "layer/FlexiNoteLayer.h" //!!! ugh #include "data/model/WaveFileModel.h" #include #include #include #include #include #include #include #include #include #include #include //!!! for HUD -- pull out into a separate class #include #include #include #include "widgets/Thumbwheel.h" #include "widgets/Panner.h" #include "widgets/RangeInputDialog.h" #include "widgets/NotifyingPushButton.h" #include "widgets/KeyReference.h" //!!! should probably split KeyReference into a data class in base and another that shows the widget //#define DEBUG_PANE QCursor *Pane::m_measureCursor1 = 0; QCursor *Pane::m_measureCursor2 = 0; Pane::Pane(QWidget *w) : View(w, true), m_identifyFeatures(false), m_clickedInRange(false), m_shiftPressed(false), m_ctrlPressed(false), m_altPressed(false), m_navigating(false), m_resizing(false), m_editing(false), m_releasing(false), m_centreLineVisible(true), m_scaleWidth(0), m_pendingWheelAngle(0), m_headsUpDisplay(0), m_vpan(0), m_hthumb(0), m_vthumb(0), m_reset(0), m_mouseInWidget(false), m_playbackFrameMoveScheduled(false), m_playbackFrameMoveTo(0) { setObjectName("Pane"); setMouseTracking(true); setAcceptDrops(true); updateHeadsUpDisplay(); connect(this, SIGNAL(regionOutlined(QRect)), this, SLOT(zoomToRegion(QRect))); cerr << "Pane::Pane(" << this << ") returning" << endl; } void Pane::updateHeadsUpDisplay() { Profiler profiler("Pane::updateHeadsUpDisplay"); if (!isVisible()) return; /* int count = 0; int currentLevel = 1; int level = 1; while (true) { if (getZoomLevel() == level) currentLevel = count; int newLevel = getZoomConstraintBlockSize(level + 1, ZoomConstraint::RoundUp); if (newLevel == level) break; if (newLevel == 131072) break; //!!! just because level = newLevel; ++count; } cerr << "Have " << count+1 << " zoom levels" << endl; */ Layer *layer = 0; if (getLayerCount() > 0) layer = getLayer(getLayerCount() - 1); if (!m_headsUpDisplay) { m_headsUpDisplay = new QFrame(this); QGridLayout *layout = new QGridLayout; layout->setMargin(0); layout->setSpacing(0); m_headsUpDisplay->setLayout(layout); m_hthumb = new Thumbwheel(Qt::Horizontal); m_hthumb->setObjectName(tr("Horizontal Zoom")); m_hthumb->setCursor(Qt::ArrowCursor); layout->addWidget(m_hthumb, 1, 0, 1, 2); m_hthumb->setFixedWidth(m_manager->scalePixelSize(70)); m_hthumb->setFixedHeight(m_manager->scalePixelSize(16)); m_hthumb->setDefaultValue(0); m_hthumb->setSpeed(0.6f); connect(m_hthumb, SIGNAL(valueChanged(int)), this, SLOT(horizontalThumbwheelMoved(int))); connect(m_hthumb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_hthumb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_vpan = new Panner; m_vpan->setCursor(Qt::ArrowCursor); layout->addWidget(m_vpan, 0, 1); m_vpan->setFixedWidth(m_manager->scalePixelSize(12)); m_vpan->setFixedHeight(m_manager->scalePixelSize(70)); m_vpan->setAlpha(80, 130); connect(m_vpan, SIGNAL(rectExtentsChanged(float, float, float, float)), this, SLOT(verticalPannerMoved(float, float, float, float))); connect(m_vpan, SIGNAL(doubleClicked()), this, SLOT(editVerticalPannerExtents())); connect(m_vpan, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_vpan, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_vthumb = new Thumbwheel(Qt::Vertical); m_vthumb->setObjectName(tr("Vertical Zoom")); m_vthumb->setCursor(Qt::ArrowCursor); layout->addWidget(m_vthumb, 0, 2); m_vthumb->setFixedWidth(m_manager->scalePixelSize(16)); m_vthumb->setFixedHeight(m_manager->scalePixelSize(70)); connect(m_vthumb, SIGNAL(valueChanged(int)), this, SLOT(verticalThumbwheelMoved(int))); connect(m_vthumb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_vthumb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); if (layer) { RangeMapper *rm = layer->getNewVerticalZoomRangeMapper(); if (rm) m_vthumb->setRangeMapper(rm); } m_reset = new NotifyingPushButton; m_reset->setFlat(true); m_reset->setCursor(Qt::ArrowCursor); m_reset->setFixedHeight(m_manager->scalePixelSize(16)); m_reset->setFixedWidth(m_manager->scalePixelSize(16)); m_reset->setIcon(IconLoader().load("zoom-reset")); m_reset->setToolTip(tr("Reset zoom to default")); layout->addWidget(m_reset, 1, 2); layout->setColumnStretch(0, 20); connect(m_reset, SIGNAL(clicked()), m_hthumb, SLOT(resetToDefault())); connect(m_reset, SIGNAL(clicked()), m_vthumb, SLOT(resetToDefault())); connect(m_reset, SIGNAL(clicked()), m_vpan, SLOT(resetToDefault())); connect(m_reset, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_reset, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); } int count = 0; int current = 0; int level = 1; //!!! pull out into function (presumably in View) bool haveConstraint = false; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getZoomConstraint() && !(*i)->supportsOtherZoomLevels()) { haveConstraint = true; break; } } if (haveConstraint) { while (true) { if (getZoomLevel() == level) current = count; int newLevel = getZoomConstraintBlockSize(level + 1, ZoomConstraint::RoundUp); if (newLevel == level) break; level = newLevel; if (++count == 50) break; } } else { // if we have no particular constraints, we can really spread out while (true) { if (getZoomLevel() >= level) current = count; int step = level / 10; int pwr = 0; while (step > 0) { ++pwr; step /= 2; } step = 1; while (pwr > 0) { step *= 2; --pwr; } // cerr << level << endl; level += step; if (++count == 100 || level > 262144) break; } } // cerr << "Have " << count << " zoom levels" << endl; m_hthumb->setMinimumValue(0); m_hthumb->setMaximumValue(count); m_hthumb->setValue(count - current); // cerr << "set value to " << count-current << endl; // cerr << "default value is " << m_hthumb->getDefaultValue() << endl; if (count != 50 && m_hthumb->getDefaultValue() == 0) { m_hthumb->setDefaultValue(count - current); // cerr << "set default value to " << m_hthumb->getDefaultValue() << endl; } bool haveVThumb = false; if (layer) { int defaultStep = 0; int max = layer->getVerticalZoomSteps(defaultStep); if (max == 0) { m_vthumb->hide(); } else { haveVThumb = true; m_vthumb->show(); m_vthumb->blockSignals(true); m_vthumb->setMinimumValue(0); m_vthumb->setMaximumValue(max); m_vthumb->setDefaultValue(defaultStep); m_vthumb->setValue(layer->getCurrentVerticalZoomStep()); m_vthumb->blockSignals(false); // cerr << "Vertical thumbwheel: min 0, max " << max // << ", default " << defaultStep << ", value " // << m_vthumb->getValue() << endl; } } updateVerticalPanner(); if (m_manager && m_manager->getZoomWheelsEnabled() && width() > m_manager->scalePixelSize(120) && height() > m_manager->scalePixelSize(100)) { if (!m_headsUpDisplay->isVisible()) { m_headsUpDisplay->show(); } int shift = m_manager->scalePixelSize(86); if (haveVThumb) { m_headsUpDisplay->setFixedHeight(m_vthumb->height() + m_hthumb->height()); m_headsUpDisplay->move(width() - shift, height() - shift); } else { m_headsUpDisplay->setFixedHeight(m_hthumb->height()); m_headsUpDisplay->move(width() - shift, height() - m_manager->scalePixelSize(16)); } } else { m_headsUpDisplay->hide(); } } void Pane::updateVerticalPanner() { if (!m_vpan || !m_manager || !m_manager->getZoomWheelsEnabled()) return; // In principle we should show or hide the panner on the basis of // whether the top layer has adjustable display extents, and we do // that below. However, we have no basis for layout of the panner // if the vertical scroll wheel is not also present. So if we // have no vertical scroll wheel, we should remove the panner as // well. Ideally any layer that implements display extents should // implement vertical zoom steps as well, but they don't all at // the moment. Layer *layer = 0; if (getLayerCount() > 0) layer = getLayer(getLayerCount() - 1); int discard; if (layer && layer->getVerticalZoomSteps(discard) == 0) { m_vpan->hide(); return; } double vmin, vmax, dmin, dmax; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax) && vmax != vmin) { double y0 = (dmin - vmin) / (vmax - vmin); double y1 = (dmax - vmin) / (vmax - vmin); m_vpan->blockSignals(true); m_vpan->setRectExtents(0, float(1.0 - y1), 1, float(y1 - y0)); m_vpan->blockSignals(false); m_vpan->show(); } else { m_vpan->hide(); } } bool Pane::shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const { QPoint discard; bool b0, b1; if (m_manager && m_manager->getToolModeFor(this) == ViewManager::MeasureMode) { return false; } if (m_manager && !m_manager->shouldIlluminateLocalFeatures()) { return false; } if (layer == getInteractionLayer() && !shouldIlluminateLocalSelection(discard, b0, b1)) { pos = m_identifyPoint; return m_identifyFeatures; } return false; } bool Pane::shouldIlluminateLocalSelection(QPoint &pos, bool &closeToLeft, bool &closeToRight) const { if (m_identifyFeatures && m_manager && m_manager->getToolModeFor(this) == ViewManager::EditMode && !m_manager->getSelections().empty() && !selectionIsBeingEdited()) { Selection s(getSelectionAt(m_identifyPoint.x(), closeToLeft, closeToRight)); if (!s.isEmpty()) { if (getInteractionLayer() && getInteractionLayer()->isLayerEditable()) { pos = m_identifyPoint; return true; } } } return false; } bool Pane::selectionIsBeingEdited() const { if (!m_editingSelection.isEmpty()) { if (m_mousePos != m_clickPos && getFrameForX(m_mousePos.x()) != getFrameForX(m_clickPos.x())) { return true; } } return false; } void Pane::setCentreLineVisible(bool visible) { m_centreLineVisible = visible; update(); } void Pane::paintEvent(QPaintEvent *e) { // Profiler profiler("Pane::paintEvent", true); QPainter paint; QRect r(rect()); if (e) r = e->rect(); View::paintEvent(e); paint.begin(this); setPaintFont(paint); if (e) paint.setClipRect(r); ViewManager::ToolMode toolMode = ViewManager::NavigateMode; if (m_manager) toolMode = m_manager->getToolModeFor(this); // Locate some relevant layers and models Layer *topLayer = getTopLayer(); bool haveSomeTimeXAxis = false; const Model *waveformModel = 0; // just for reporting purposes const Model *workModel = 0; for (LayerList::iterator vi = m_layerStack.end(); vi != m_layerStack.begin(); ) { --vi; if (!haveSomeTimeXAxis && (*vi)->hasTimeXAxis()) { haveSomeTimeXAxis = true; } if (dynamic_cast(*vi)) { waveformModel = (*vi)->getModel(); workModel = waveformModel; } else { Model *m = (*vi)->getModel(); if (dynamic_cast(m)) { workModel = m; } else if (m && dynamic_cast(m->getSourceModel())) { workModel = m->getSourceModel(); } } if (waveformModel && workModel && haveSomeTimeXAxis) break; } // Block off left and right extents so we can see where the main model ends if (workModel && hasTopLayerTimeXAxis()) { drawModelTimeExtents(r, paint, workModel); } // Crosshairs for mouse movement in measure mode if (m_manager && m_mouseInWidget && toolMode == ViewManager::MeasureMode) { for (LayerList::iterator vi = m_layerStack.end(); vi != m_layerStack.begin(); ) { --vi; std::vector crosshairExtents; if ((*vi)->getCrosshairExtents(this, paint, m_identifyPoint, crosshairExtents)) { (*vi)->paintCrosshairs(this, paint, m_identifyPoint); break; } else if ((*vi)->isLayerOpaque()) { break; } } } // Scale width will be set implicitly during drawVerticalScale call m_scaleWidth = 0; if (m_manager && m_manager->shouldShowVerticalScale() && topLayer) { drawVerticalScale(r, topLayer, paint); } // Feature description: the box in top-right showing values from // the nearest feature to the mouse if (m_identifyFeatures && m_manager && m_manager->shouldIlluminateLocalFeatures() && topLayer) { drawFeatureDescription(topLayer, paint); } sv_samplerate_t sampleRate = getModelsSampleRate(); paint.setBrush(Qt::NoBrush); if (m_centreLineVisible && m_manager && m_manager->shouldShowCentreLine()) { drawCentreLine(sampleRate, paint, !haveSomeTimeXAxis); } paint.setPen(QColor(50, 50, 50)); if (waveformModel && sampleRate && m_manager && m_manager->shouldShowDuration()) { drawDurationAndRate(r, waveformModel, sampleRate, paint); } bool haveWorkTitle = false; if (workModel && m_manager && m_manager->shouldShowWorkTitle()) { drawWorkTitle(r, paint, workModel); haveWorkTitle = true; } if (workModel && m_manager && m_manager->getAlignMode()) { drawAlignmentStatus(r, paint, workModel, haveWorkTitle); } if (m_manager && m_manager->shouldShowLayerNames()) { drawLayerNames(r, paint); } // The blue box that is shown when you ctrl-click in navigate mode // to define a zoom region if (m_shiftPressed && m_clickedInRange && (toolMode == ViewManager::NavigateMode || m_navigating)) { //!!! be nice if this looked a bit more in keeping with the //selection block paint.setPen(Qt::blue); //!!! shouldn't use clickPos -- needs to use a clicked frame paint.drawRect(m_clickPos.x(), m_clickPos.y(), m_mousePos.x() - m_clickPos.x(), m_mousePos.y() - m_clickPos.y()); } if (toolMode == ViewManager::MeasureMode && topLayer) { bool showFocus = false; if (!m_manager || !m_manager->isPlaying()) showFocus = true; topLayer->paintMeasurementRects(this, paint, showFocus, m_identifyPoint); } if (selectionIsBeingEdited()) { drawEditingSelection(paint); } paint.end(); } int Pane::getVerticalScaleWidth() const { if (m_scaleWidth > 0) return m_scaleWidth; else return 0; } void Pane::drawVerticalScale(QRect r, Layer *topLayer, QPainter &paint) { Layer *scaleLayer = 0; // cerr << "Pane::drawVerticalScale[" << this << "]" << endl; double min, max; bool log; QString unit; // If the top layer has no scale and reports no display // extents, but does report a unit, then the scale should be // drawn from any underlying layer with a scale and that unit. // If the top layer has no scale and no value extents at all, // then the scale should be drawn from any underlying layer // with a scale regardless of unit. int sw = topLayer->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); // cerr << "sw = " << sw << endl; if (sw > 0) { scaleLayer = topLayer; m_scaleWidth = sw; } else { bool hasDisplayExtents = topLayer->getDisplayExtents(min, max); bool hasValueExtents = topLayer->getValueExtents(min, max, log, unit); if (!hasDisplayExtents) { if (!hasValueExtents) { for (LayerList::iterator vi = m_layerStack.end(); vi != m_layerStack.begin(); ) { --vi; if ((*vi) == topLayer) continue; sw = (*vi)->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); if (sw > 0) { scaleLayer = *vi; m_scaleWidth = sw; break; } } } else if (unit != "") { // && hasValueExtents && !hasDisplayExtents QString requireUnit = unit; for (LayerList::iterator vi = m_layerStack.end(); vi != m_layerStack.begin(); ) { --vi; if ((*vi) == topLayer) continue; if ((*vi)->getDisplayExtents(min, max)) { // search no further than this: if the // scale from this layer isn't suitable, // we'll have to draw no scale (else we'd // risk ending up with the wrong scale) if ((*vi)->getValueExtents(min, max, log, unit) && unit == requireUnit) { sw = (*vi)->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); if (sw > 0) { scaleLayer = *vi; m_scaleWidth = sw; } } break; } } } } } if (!scaleLayer) m_scaleWidth = 0; // cerr << "m_scaleWidth = " << m_scaleWidth << ", r.left = " << r.left() << endl; if (m_scaleWidth > 0 && r.left() < m_scaleWidth) { // Profiler profiler("Pane::paintEvent - painting vertical scale", true); // SVDEBUG << "Pane::paintEvent: calling paint.save() in vertical scale block" << endl; paint.save(); paint.setPen(getForeground()); paint.setBrush(getBackground()); paint.drawRect(0, -1, m_scaleWidth, height()+1); paint.setBrush(Qt::NoBrush); scaleLayer->paintVerticalScale (this, m_manager->shouldShowVerticalColourScale(), paint, QRect(0, 0, m_scaleWidth, height())); paint.restore(); } } void Pane::drawFeatureDescription(Layer *topLayer, QPainter &paint) { QPoint pos = m_identifyPoint; QString desc = topLayer->getFeatureDescription(this, pos); if (desc != "") { paint.save(); int tabStop = paint.fontMetrics().width(tr("Some lengthy prefix:")); QRect boundingRect = paint.fontMetrics().boundingRect (rect(), Qt::AlignRight | Qt::AlignTop | Qt::TextExpandTabs, desc, tabStop); if (hasLightBackground()) { paint.setPen(Qt::NoPen); paint.setBrush(QColor(250, 250, 250, 200)); } else { paint.setPen(Qt::NoPen); paint.setBrush(QColor(50, 50, 50, 200)); } int extra = paint.fontMetrics().descent(); paint.drawRect(width() - boundingRect.width() - 10 - extra, 10 - extra, boundingRect.width() + 2 * extra, boundingRect.height() + extra); if (hasLightBackground()) { paint.setPen(QColor(150, 20, 0)); } else { paint.setPen(QColor(255, 150, 100)); } QTextOption option; option.setWrapMode(QTextOption::NoWrap); option.setAlignment(Qt::AlignRight | Qt::AlignTop); option.setTabStop(tabStop); paint.drawText(QRectF(width() - boundingRect.width() - 10, 10, boundingRect.width(), boundingRect.height()), desc, option); paint.restore(); } } void Pane::drawCentreLine(sv_samplerate_t sampleRate, QPainter &paint, bool omitLine) { if (omitLine && m_manager->getMainModelSampleRate() == 0) { return; } int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); QColor c = QColor(0, 0, 0); if (!hasLightBackground()) { c = QColor(240, 240, 240); } paint.setPen(PaintAssistant::scalePen(c)); int x = width() / 2; if (!omitLine) { paint.drawLine(x, 0, x, height() - 1); paint.drawLine(x-1, 1, x+1, 1); paint.drawLine(x-2, 0, x+2, 0); paint.drawLine(x-1, height() - 2, x+1, height() - 2); paint.drawLine(x-2, height() - 1, x+2, height() - 1); } paint.setPen(QColor(50, 50, 50)); int y = height() - fontHeight + fontAscent - 6; LayerList::iterator vi = m_layerStack.end(); if (vi != m_layerStack.begin()) { switch ((*--vi)->getPreferredFrameCountPosition()) { case Layer::PositionTop: y = fontAscent + 6; break; case Layer::PositionMiddle: y = (height() - fontHeight) / 2 + fontAscent; break; case Layer::PositionBottom: // y already set correctly break; } } if (m_manager && m_manager->shouldShowFrameCount()) { if (sampleRate) { QString text(QString::fromStdString (RealTime::frame2RealTime (m_centreFrame, sampleRate) .toText(true))); int tw = paint.fontMetrics().width(text); int x = width()/2 - 4 - tw; PaintAssistant::drawVisibleText(this, paint, x, y, text, PaintAssistant::OutlinedText); } QString text = QString("%1").arg(m_centreFrame); int x = width()/2 + 4; PaintAssistant::drawVisibleText(this, paint, x, y, text, PaintAssistant::OutlinedText); } } void Pane::drawModelTimeExtents(QRect r, QPainter &paint, const Model *model) { int x0 = getXForFrame(model->getStartFrame()); int x1 = getXForFrame(model->getEndFrame()); paint.save(); QBrush brush; if (hasLightBackground()) { brush = QBrush(QColor("#f8f8f8")); paint.setPen(Qt::black); } else { brush = QBrush(QColor("#101010")); paint.setPen(Qt::white); } if (x0 > r.x()) { paint.fillRect(0, 0, x0, height(), brush); paint.drawLine(x0, 0, x0, height()); } if (x1 < r.x() + r.width()) { paint.fillRect(x1, 0, width() - x1, height(), brush); paint.drawLine(x1, 0, x1, height()); } paint.restore(); } void Pane::drawAlignmentStatus(QRect r, QPainter &paint, const Model *model, bool down) { const Model *reference = model->getAlignmentReference(); /* if (!reference) { cerr << "Pane[" << this << "]::drawAlignmentStatus: No reference" << endl; } else if (reference == model) { cerr << "Pane[" << this << "]::drawAlignmentStatus: This is the reference model" << endl; } else { cerr << "Pane[" << this << "]::drawAlignmentStatus: This is not the reference" << endl; } */ QString text; int completion = 100; if (reference == model) { text = tr("Reference"); } else if (!reference) { text = tr("Unaligned"); } else { completion = model->getAlignmentCompletion(); if (completion == 0) { text = tr("Unaligned"); } else if (completion < 100) { text = tr("Aligning: %1%").arg(completion); } else { text = tr("Aligned"); } } paint.save(); QFont font(paint.font()); font.setBold(true); paint.setFont(font); if (completion < 100) paint.setBrush(Qt::red); int y = 5; if (down) y += paint.fontMetrics().height(); int w = paint.fontMetrics().width(text); int h = paint.fontMetrics().height(); if (r.top() > h + y || r.left() > w + m_scaleWidth + 5) { paint.restore(); return; } PaintAssistant::drawVisibleText(this, paint, m_scaleWidth + 5, paint.fontMetrics().ascent() + y, text, PaintAssistant::OutlinedText); paint.restore(); } void Pane::modelAlignmentCompletionChanged() { View::modelAlignmentCompletionChanged(); update(QRect(0, 0, 300, 100)); } void Pane::drawWorkTitle(QRect r, QPainter &paint, const Model *model) { QString title = model->getTitle(); QString maker = model->getMaker(); //SVDEBUG << "Pane::drawWorkTitle: title=\"" << title//<< "\", maker=\"" << maker << "\"" << endl; if (title == "") return; QString text = title; if (maker != "") { text = tr("%1 - %2").arg(title).arg(maker); } paint.save(); QFont font(paint.font()); font.setItalic(true); paint.setFont(font); int y = 5; int w = paint.fontMetrics().width(text); int h = paint.fontMetrics().height(); if (r.top() > h + y || r.left() > w + m_scaleWidth + 5) { paint.restore(); return; } PaintAssistant::drawVisibleText(this, paint, m_scaleWidth + 5, paint.fontMetrics().ascent() + y, text, PaintAssistant::OutlinedText); paint.restore(); } void Pane::drawLayerNames(QRect r, QPainter &paint) { int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); int lly = height() - 6; if (m_manager->getZoomWheelsEnabled()) { lly -= m_manager->scalePixelSize(20); } if (r.y() + r.height() < lly - int(m_layerStack.size()) * fontHeight) { return; } QStringList texts; std::vector pixmaps; for (LayerList::iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { texts.push_back((*i)->getLayerPresentationName()); // cerr << "Pane " << this << ": Layer presentation name for " << *i << ": " // << texts[texts.size()-1] << endl; pixmaps.push_back((*i)->getLayerPresentationPixmap (QSize(fontAscent, fontAscent))); } int maxTextWidth = width() / 3; texts = TextAbbrev::abbreviate(texts, paint.fontMetrics(), maxTextWidth); int llx = width() - maxTextWidth - 5; if (m_manager->getZoomWheelsEnabled()) { llx -= m_manager->scalePixelSize(36); } if (r.x() + r.width() >= llx - fontAscent - 3) { for (int i = 0; i < texts.size(); ++i) { // cerr << "Pane "<< this << ": text " << i << ": " << texts[i] << endl; if (i + 1 == texts.size()) { paint.setPen(getForeground()); } PaintAssistant::drawVisibleText(this, paint, llx, lly - fontHeight + fontAscent, texts[i], PaintAssistant::OutlinedText); if (!pixmaps[i].isNull()) { paint.drawPixmap(llx - fontAscent - 3, lly - fontHeight + (fontHeight-fontAscent)/2, pixmaps[i]); } lly -= fontHeight; } } } void Pane::drawEditingSelection(QPainter &paint) { int offset = m_mousePos.x() - m_clickPos.x(); sv_frame_t origStart = m_editingSelection.getStartFrame(); int p0 = getXForFrame(origStart) + offset; int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset; if (m_editingSelectionEdge < 0) { p1 = getXForFrame(m_editingSelection.getEndFrame()); } else if (m_editingSelectionEdge > 0) { p0 = getXForFrame(m_editingSelection.getStartFrame()); } sv_frame_t newStart = getFrameForX(p0); sv_frame_t newEnd = getFrameForX(p1); paint.save(); paint.setPen(QPen(getForeground(), 2)); int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); sv_samplerate_t sampleRate = getModelsSampleRate(); QString startText, endText, offsetText; startText = QString("%1").arg(newStart); endText = QString("%1").arg(newEnd); offsetText = QString("%1").arg(newStart - origStart); if (newStart >= origStart) { offsetText = tr("+%1").arg(offsetText); } if (sampleRate) { startText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime(newStart, sampleRate).toText())) .arg(startText); endText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime(newEnd, sampleRate).toText())) .arg(endText); offsetText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime(newStart - origStart, sampleRate).toText())) .arg(offsetText); if (newStart >= origStart) { offsetText = tr("+%1").arg(offsetText); } } PaintAssistant::drawVisibleText(this, paint, p0 + 2, fontAscent + fontHeight + 4, startText, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(this, paint, p1 + 2, fontAscent + fontHeight + 4, endText, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(this, paint, p0 + 2, fontAscent + fontHeight*2 + 4, offsetText, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(this, paint, p1 + 2, fontAscent + fontHeight*2 + 4, offsetText, PaintAssistant::OutlinedText); //!!! duplicating display policy with View::drawSelections if (m_editingSelectionEdge < 0) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p0, 0, p0, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else if (m_editingSelectionEdge > 0) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p1, 0, p1, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else { paint.setBrush(Qt::NoBrush); paint.drawRect(p0, 1, p1 - p0, height() - 2); } paint.restore(); } void Pane::drawDurationAndRate(QRect r, const Model *waveformModel, sv_samplerate_t sampleRate, QPainter &paint) { int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); if (r.y() + r.height() < height() - fontHeight - 6) return; sv_samplerate_t modelRate = waveformModel->getSampleRate(); sv_samplerate_t nativeRate = waveformModel->getNativeRate(); sv_samplerate_t playbackRate = m_manager->getPlaybackSampleRate(); QString srNote = ""; // Show (R) for waveform models that have been resampled during // load, and (X) for waveform models that will be played at the // wrong rate because their rate differs from the current playback // rate (which is not necessarily that of the main model). if (modelRate != nativeRate) { if (playbackRate != 0 && modelRate != playbackRate) { srNote = " " + tr("(X)"); } else { srNote = " " + tr("(R)"); } } QString desc = tr("%1 / %2Hz%3") .arg(RealTime::frame2RealTime(waveformModel->getEndFrame(), sampleRate) .toText(false).c_str()) .arg(nativeRate) .arg(srNote); int x = m_scaleWidth + 5; int pbw = getProgressBarWidth(); if (x < pbw + 5) x = pbw + 5; if (r.x() < x + paint.fontMetrics().width(desc)) { PaintAssistant::drawVisibleText(this, paint, x, height() - fontHeight + fontAscent - 6, desc, PaintAssistant::OutlinedText); } } bool Pane::render(QPainter &paint, int xorigin, sv_frame_t f0, sv_frame_t f1) { if (!View::render(paint, xorigin + m_scaleWidth, f0, f1)) { return false; } if (m_scaleWidth > 0) { Layer *layer = getTopLayer(); if (layer) { paint.save(); paint.setPen(getForeground()); paint.setBrush(getBackground()); paint.drawRect(xorigin, -1, m_scaleWidth, height()+1); paint.setBrush(Qt::NoBrush); layer->paintVerticalScale (this, m_manager->shouldShowVerticalColourScale(), paint, QRect(xorigin, 0, m_scaleWidth, height())); paint.restore(); } } return true; } QImage * Pane::renderPartToNewImage(sv_frame_t f0, sv_frame_t f1) { int x0 = int(f0 / getZoomLevel()); int x1 = int(f1 / getZoomLevel()); QImage *image = new QImage(x1 - x0 + m_scaleWidth, height(), QImage::Format_RGB32); int formerScaleWidth = m_scaleWidth; if (m_manager && m_manager->shouldShowVerticalScale()) { Layer *layer = getTopLayer(); if (layer) { QPainter paint(image); m_scaleWidth = layer->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); } } else { m_scaleWidth = 0; } if (m_scaleWidth != formerScaleWidth) { delete image; image = new QImage(x1 - x0 + m_scaleWidth, height(), QImage::Format_RGB32); } QPainter *paint = new QPainter(image); if (!render(*paint, 0, f0, f1)) { delete paint; delete image; return 0; } else { delete paint; return image; } } QSize Pane::getRenderedPartImageSize(sv_frame_t f0, sv_frame_t f1) { QSize s = View::getRenderedPartImageSize(f0, f1); QImage *image = new QImage(100, 100, QImage::Format_RGB32); QPainter paint(image); int sw = 0; if (m_manager && m_manager->shouldShowVerticalScale()) { Layer *layer = getTopLayer(); if (layer) { sw = layer->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); } } return QSize(sw + s.width(), s.height()); } sv_frame_t Pane::getFirstVisibleFrame() const { sv_frame_t f0 = getFrameForX(m_scaleWidth); sv_frame_t f = View::getFirstVisibleFrame(); if (f0 < 0 || f0 < f) return f; return f0; } Selection Pane::getSelectionAt(int x, bool &closeToLeftEdge, bool &closeToRightEdge) const { closeToLeftEdge = closeToRightEdge = false; if (!m_manager) return Selection(); sv_frame_t testFrame = getFrameForX(x - 5); if (testFrame < 0) { testFrame = getFrameForX(x); if (testFrame < 0) return Selection(); } Selection selection = m_manager->getContainingSelection(testFrame, true); if (selection.isEmpty()) return selection; int lx = getXForFrame(selection.getStartFrame()); int rx = getXForFrame(selection.getEndFrame()); int fuzz = 2; if (x < lx - fuzz || x > rx + fuzz) return Selection(); int width = rx - lx; fuzz = 3; if (width < 12) fuzz = width / 4; if (fuzz < 1) fuzz = 1; if (x < lx + fuzz) closeToLeftEdge = true; if (x > rx - fuzz) closeToRightEdge = true; return selection; } bool Pane::canTopLayerMoveVertical() { double vmin, vmax, dmin, dmax; if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) return false; if (dmin <= vmin && dmax >= vmax) return false; return true; } bool Pane::getTopLayerDisplayExtents(double &vmin, double &vmax, double &dmin, double &dmax, QString *unit) { Layer *layer = getTopLayer(); if (!layer) return false; bool vlog; QString vunit; bool rv = (layer->getValueExtents(vmin, vmax, vlog, vunit) && layer->getDisplayExtents(dmin, dmax)); if (unit) *unit = vunit; return rv; } bool Pane::setTopLayerDisplayExtents(double dmin, double dmax) { Layer *layer = getTopLayer(); if (!layer) return false; return layer->setDisplayExtents(dmin, dmax); } void Pane::registerShortcuts(KeyReference &kr) { kr.setCategory(tr("Zoom")); kr.registerAlternativeShortcut(tr("Zoom In"), tr("Wheel Up")); kr.registerAlternativeShortcut(tr("Zoom Out"), tr("Wheel Down")); kr.setCategory(tr("General Pane Mouse Actions")); kr.registerShortcut(tr("Zoom"), tr("Wheel"), tr("Zoom in or out in time axis")); kr.registerShortcut(tr("Scroll"), tr("Ctrl+Wheel"), tr("Scroll rapidly left or right in time axis")); kr.registerShortcut(tr("Zoom Vertically"), tr("Shift+Wheel"), tr("Zoom in or out in the vertical axis")); kr.registerShortcut(tr("Scroll Vertically"), tr("Alt+Wheel"), tr("Scroll up or down in the vertical axis")); kr.registerShortcut(tr("Navigate"), tr("Middle"), tr("Click middle button and drag to navigate with any tool")); kr.registerShortcut(tr("Relocate"), tr("Double-Click Middle"), tr("Double-click middle button to relocate with any tool")); kr.registerShortcut(tr("Menu"), tr("Right"), tr("Show pane context menu")); } Layer * Pane::getTopFlexiNoteLayer() { for (int i = int(m_layerStack.size()) - 1; i >= 0; --i) { if (LayerFactory::getInstance()->getLayerType(m_layerStack[i]) == LayerFactory::FlexiNotes) { return m_layerStack[i]; } } return 0; } void Pane::mousePressEvent(QMouseEvent *e) { if (e->buttons() & Qt::RightButton) { emit contextHelpChanged(""); emit rightButtonMenuRequested(mapToGlobal(e->pos())); return; } // cerr << "mousePressEvent" << endl; m_clickPos = e->pos(); m_mousePos = m_clickPos; m_clickedInRange = true; m_editingSelection = Selection(); m_editingSelectionEdge = 0; m_shiftPressed = (e->modifiers() & Qt::ShiftModifier); m_ctrlPressed = (e->modifiers() & Qt::ControlModifier); m_altPressed = (e->modifiers() & Qt::AltModifier); m_dragMode = UnresolvedDrag; ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolModeFor(this); m_navigating = false; m_resizing = false; m_editing = false; m_releasing = false; if (mode == ViewManager::NavigateMode || (e->buttons() & Qt::MidButton) || (mode == ViewManager::MeasureMode && (e->buttons() & Qt::LeftButton) && m_shiftPressed)) { if (mode != ViewManager::NavigateMode) { setCursor(Qt::PointingHandCursor); } m_navigating = true; m_dragCentreFrame = m_centreFrame; m_dragStartMinValue = 0; double vmin, vmax, dmin, dmax; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { m_dragStartMinValue = dmin; } if (m_followPlay == PlaybackScrollPage) { // Schedule a play-head move to the mouse frame // location. This will happen only if nothing else of // interest happens (double-click, drag) before the // timeout. schedulePlaybackFrameMove(getFrameForX(e->x())); } } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) return; bool closeToLeft = false, closeToRight = false; Selection selection = getSelectionAt(e->x(), closeToLeft, closeToRight); if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { m_manager->removeSelection(selection); if (closeToLeft) { m_selectionStartFrame = selection.getEndFrame(); } else { m_selectionStartFrame = selection.getStartFrame(); } m_manager->setInProgressSelection(selection, false); m_resizing = true; } else { sv_frame_t mouseFrame = getFrameForX(e->x()); int resolution = 1; sv_frame_t snapFrame = mouseFrame; Layer *layer = getInteractionLayer(); if (layer && !m_shiftPressed && !qobject_cast(layer)) { // don't snap to secs layer->snapToFeatureFrame(this, snapFrame, resolution, Layer::SnapLeft); } if (snapFrame < 0) snapFrame = 0; m_selectionStartFrame = snapFrame; if (m_manager) { m_manager->setInProgressSelection (Selection(alignToReference(snapFrame), alignToReference(snapFrame + resolution)), !m_ctrlPressed); } m_resizing = false; if (m_followPlay == PlaybackScrollPage) { // Schedule a play-head move to the mouse frame // location. This will happen only if nothing else of // interest happens (double-click, drag) before the // timeout. schedulePlaybackFrameMove(mouseFrame); } } update(); } else if (mode == ViewManager::DrawMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->drawStart(this, e); } } else if (mode == ViewManager::EraseMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->eraseStart(this, e); } // GF: handle mouse press for NoteEditMode } else if (mode == ViewManager::NoteEditMode) { std::cerr << "mouse pressed in note edit mode" << std::endl; Layer *layer = getTopFlexiNoteLayer(); if (layer) { layer->splitStart(this, e); } } else if (mode == ViewManager::EditMode) { // Do nothing here -- we'll do it in mouseMoveEvent when the // drag threshold has been passed } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer) layer->measureStart(this, e); update(); } emit paneInteractedWith(); } void Pane::schedulePlaybackFrameMove(sv_frame_t frame) { m_playbackFrameMoveTo = frame; m_playbackFrameMoveScheduled = true; QTimer::singleShot(QApplication::doubleClickInterval() + 10, this, SLOT(playbackScheduleTimerElapsed())); } void Pane::playbackScheduleTimerElapsed() { if (m_playbackFrameMoveScheduled) { m_manager->setPlaybackFrame(m_playbackFrameMoveTo); m_playbackFrameMoveScheduled = false; } } void Pane::mouseReleaseEvent(QMouseEvent *e) { if (e && (e->buttons() & Qt::RightButton)) { return; } // cerr << "mouseReleaseEvent" << endl; ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolModeFor(this); m_releasing = true; if (m_clickedInRange) { mouseMoveEvent(e); } sv_frame_t mouseFrame = e ? getFrameForX(e->x()) : 0; if (mouseFrame < 0) mouseFrame = 0; if (m_navigating || mode == ViewManager::NavigateMode) { m_navigating = false; if (mode != ViewManager::NavigateMode) { // restore cursor toolModeChanged(); } if (m_shiftPressed) { int x0 = std::min(m_clickPos.x(), m_mousePos.x()); int x1 = std::max(m_clickPos.x(), m_mousePos.x()); int y0 = std::min(m_clickPos.y(), m_mousePos.y()); int y1 = std::max(m_clickPos.y(), m_mousePos.y()); emit regionOutlined(QRect(x0, y0, x1 - x0, y1 - y0)); } } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) { m_releasing = false; return; } if (m_manager && m_manager->haveInProgressSelection()) { //cerr << "JTEST: release with selection" << endl; bool exclusive; Selection selection = m_manager->getInProgressSelection(exclusive); if (selection.getEndFrame() < selection.getStartFrame() + 2) { selection = Selection(); } m_manager->clearInProgressSelection(); if (exclusive) { m_manager->setSelection(selection); } else { m_manager->addSelection(selection); } } update(); } else if (mode == ViewManager::DrawMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->drawEnd(this, e); update(); } } else if (mode == ViewManager::EraseMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->eraseEnd(this, e); update(); } } else if (mode == ViewManager::NoteEditMode) { //GF: handle mouse release for NoteEditMode (note: works but will need to re-think this a bit later) Layer *layer = getTopFlexiNoteLayer(); if (layer) { layer->splitEnd(this, e); update(); if (m_editing) { if (!editSelectionEnd(e)) { layer->editEnd(this, e); update(); } } } } else if (mode == ViewManager::EditMode) { if (m_editing) { if (!editSelectionEnd(e)) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->editEnd(this, e); update(); } } } } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer) layer->measureEnd(this, e); if (m_measureCursor1) setCursor(*m_measureCursor1); update(); } m_clickedInRange = false; m_releasing = false; emit paneInteractedWith(); } void Pane::mouseMoveEvent(QMouseEvent *e) { if (!e || (e->buttons() & Qt::RightButton)) { return; } // cerr << "mouseMoveEvent" << endl; QPoint pos = e->pos(); updateContextHelp(&pos); if (m_navigating && m_clickedInRange && !m_releasing) { // if no buttons pressed, and not called from // mouseReleaseEvent, we want to reset clicked-ness (to avoid // annoying continual drags when we moved the mouse outside // the window after pressing button first time). if (!(e->buttons() & Qt::LeftButton) && !(e->buttons() & Qt::MidButton)) { m_clickedInRange = false; return; } } ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolModeFor(this); QPoint prevPoint = m_identifyPoint; m_identifyPoint = e->pos(); if (!m_clickedInRange) { // GF: handle mouse move for context sensitive cursor switching in NoteEditMode. // GF: Propagate the event to FlexiNoteLayer. I somehow feel it's best handeled there rather than here, but perhaps not if this will be needed elsewhere too. if (mode == ViewManager::NoteEditMode) { FlexiNoteLayer *layer = qobject_cast(getTopFlexiNoteLayer()); if (layer) { layer->mouseMoveEvent(this, e); //!!! ew update(); // return; } } if (mode == ViewManager::SelectMode && hasTopLayerTimeXAxis()) { bool closeToLeft = false, closeToRight = false; getSelectionAt(e->x(), closeToLeft, closeToRight); if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { setCursor(Qt::SizeHorCursor); } else { setCursor(Qt::ArrowCursor); } } if (m_manager && !m_manager->isPlaying()) { bool updating = false; if (getInteractionLayer() && m_manager->shouldIlluminateLocalFeatures()) { bool previouslyIdentifying = m_identifyFeatures; m_identifyFeatures = true; if (m_identifyFeatures != previouslyIdentifying || m_identifyPoint != prevPoint) { update(); updating = true; } } if (!updating && mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer && layer->nearestMeasurementRectChanged (this, prevPoint, m_identifyPoint)) { update(); } } } return; } if (m_navigating || mode == ViewManager::NavigateMode) { if (m_shiftPressed) { m_mousePos = e->pos(); update(); } else { dragTopLayer(e); } } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) return; dragExtendSelection(e); } else if (mode == ViewManager::DrawMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->drawDrag(this, e); } } else if (mode == ViewManager::EraseMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->eraseDrag(this, e); } // GF: handling NoteEditMode dragging and boundary actions for mouseMoveEvent } else if (mode == ViewManager::NoteEditMode) { bool resist = true; if ((e->modifiers() & Qt::ShiftModifier)) { m_shiftPressed = true; } if (m_shiftPressed) resist = false; m_dragMode = updateDragMode (m_dragMode, m_clickPos, e->pos(), true, // can move horiz true, // can move vert resist, // resist horiz resist); // resist vert if (!m_editing) { if (m_dragMode != UnresolvedDrag) { m_editing = true; QMouseEvent clickEvent(QEvent::MouseButtonPress, m_clickPos, Qt::NoButton, e->buttons(), e->modifiers()); if (!editSelectionStart(&clickEvent)) { Layer *layer = getTopFlexiNoteLayer(); if (layer) { std::cerr << "calling edit start" << std::endl; layer->editStart(this, &clickEvent); } } } } else { if (!editSelectionDrag(e)) { Layer *layer = getTopFlexiNoteLayer(); if (layer) { int x = e->x(); int y = e->y(); if (m_dragMode == VerticalDrag) x = m_clickPos.x(); else if (m_dragMode == HorizontalDrag) y = m_clickPos.y(); QMouseEvent moveEvent(QEvent::MouseMove, QPoint(x, y), Qt::NoButton, e->buttons(), e->modifiers()); std::cerr << "calling editDrag" << std::endl; layer->editDrag(this, &moveEvent); } } } } else if (mode == ViewManager::EditMode) { bool resist = true; if ((e->modifiers() & Qt::ShiftModifier)) { m_shiftPressed = true; // ... but don't set it false if shift has been // released -- we want the state when we started // dragging to be used most of the time } if (m_shiftPressed) resist = false; m_dragMode = updateDragMode (m_dragMode, m_clickPos, e->pos(), true, // can move horiz true, // can move vert resist, // resist horiz resist); // resist vert if (!m_editing) { if (m_dragMode != UnresolvedDrag) { m_editing = true; QMouseEvent clickEvent(QEvent::MouseButtonPress, m_clickPos, Qt::NoButton, e->buttons(), e->modifiers()); if (!editSelectionStart(&clickEvent)) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->editStart(this, &clickEvent); } } } } else { if (!editSelectionDrag(e)) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { int x = e->x(); int y = e->y(); if (m_dragMode == VerticalDrag) x = m_clickPos.x(); else if (m_dragMode == HorizontalDrag) y = m_clickPos.y(); QMouseEvent moveEvent(QEvent::MouseMove, QPoint(x, y), Qt::NoButton, e->buttons(), e->modifiers()); layer->editDrag(this, &moveEvent); } } } } else if (mode == ViewManager::MeasureMode) { if (m_measureCursor2) setCursor(*m_measureCursor2); Layer *layer = getTopLayer(); if (layer) { layer->measureDrag(this, e); if (layer->hasTimeXAxis()) edgeScrollMaybe(e->x()); } update(); } if (m_dragMode != UnresolvedDrag) { m_playbackFrameMoveScheduled = false; } } void Pane::zoomToRegion(QRect r) { int x0 = r.x(); int y0 = r.y(); int x1 = r.x() + r.width(); int y1 = r.y() + r.height(); int w = x1 - x0; sv_frame_t newStartFrame = getFrameForX(x0); sv_frame_t visibleFrames = getEndFrame() - getStartFrame(); if (newStartFrame <= -visibleFrames) { newStartFrame = -visibleFrames + 1; } if (newStartFrame >= getModelsEndFrame()) { newStartFrame = getModelsEndFrame() - 1; } double ratio = double(w) / double(width()); // cerr << "ratio: " << ratio << endl; int newZoomLevel = (int)nearbyint(m_zoomLevel * ratio); if (newZoomLevel < 1) newZoomLevel = 1; // cerr << "start: " << m_startFrame << ", level " << m_zoomLevel << endl; setZoomLevel(getZoomConstraintBlockSize(newZoomLevel)); setStartFrame(newStartFrame); QString unit; double min, max; bool log; Layer *layer = 0; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getValueExtents(min, max, log, unit) && (*i)->getDisplayExtents(min, max)) { layer = *i; break; } } if (layer) { if (log) { min = (min < 0.0) ? -log10(-min) : (min == 0.0) ? 0.0 : log10(min); max = (max < 0.0) ? -log10(-max) : (max == 0.0) ? 0.0 : log10(max); } double rmin = min + ((max - min) * (height() - y1)) / height(); double rmax = min + ((max - min) * (height() - y0)) / height(); cerr << "min: " << min << ", max: " << max << ", y0: " << y0 << ", y1: " << y1 << ", h: " << height() << ", rmin: " << rmin << ", rmax: " << rmax << endl; if (log) { rmin = pow(10, rmin); rmax = pow(10, rmax); } cerr << "finally: rmin: " << rmin << ", rmax: " << rmax << " " << unit << endl; layer->setDisplayExtents(rmin, rmax); updateVerticalPanner(); } } void Pane::dragTopLayer(QMouseEvent *e) { // We need to avoid making it too easy to drag both // horizontally and vertically, in the case where the // mouse is moved "mostly" in horizontal or vertical axis // with only a small variation in the other axis. This is // particularly important during playback (when we want to // avoid small horizontal motions) or in slow refresh // layers like spectrogram (when we want to avoid small // vertical motions). // // To this end we have horizontal and vertical thresholds // and a series of states: unresolved, horizontally or // vertically constrained, free. // // When the mouse first moves, we're unresolved: we // restrict ourselves to whichever direction seems safest, // until the mouse has passed a small threshold distance // from the click point. Then we lock in to one of the // constrained modes, based on which axis that distance // was measured in first. Finally, if it turns out we've // also moved more than a certain larger distance in the // other direction as well, we may switch into free mode. // // If the top layer is incapable of being dragged // vertically, the logic is short circuited. m_dragMode = updateDragMode (m_dragMode, m_clickPos, e->pos(), true, // can move horiz canTopLayerMoveVertical(), // can move vert canTopLayerMoveVertical() || (m_manager && m_manager->isPlaying()), // resist horiz true); // resist vert if (m_dragMode == HorizontalDrag || m_dragMode == FreeDrag) { sv_frame_t frameOff = getFrameForX(e->x()) - getFrameForX(m_clickPos.x()); sv_frame_t newCentreFrame = m_dragCentreFrame; if (frameOff < 0) { newCentreFrame -= frameOff; } else if (newCentreFrame >= frameOff) { newCentreFrame -= frameOff; } else { newCentreFrame = 0; } #ifdef DEBUG_PANE SVDEBUG << "Pane::dragTopLayer: newCentreFrame = " << newCentreFrame << ", models end frame = " << getModelsEndFrame() << endl; #endif if (newCentreFrame >= getModelsEndFrame()) { newCentreFrame = getModelsEndFrame(); if (newCentreFrame > 0) --newCentreFrame; } if (getXForFrame(m_centreFrame) != getXForFrame(newCentreFrame)) { setCentreFrame(newCentreFrame, !m_altPressed); } } if (m_dragMode == VerticalDrag || m_dragMode == FreeDrag) { double vmin = 0.f, vmax = 0.f; double dmin = 0.f, dmax = 0.f; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { // cerr << "ydiff = " << ydiff << endl; int ydiff = e->y() - m_clickPos.y(); double perpix = (dmax - dmin) / height(); double valdiff = ydiff * perpix; // cerr << "valdiff = " << valdiff << endl; if (m_dragMode == UnresolvedDrag && ydiff != 0) { m_dragMode = VerticalDrag; } double newmin = m_dragStartMinValue + valdiff; double newmax = m_dragStartMinValue + (dmax - dmin) + valdiff; if (newmin < vmin) { newmax += vmin - newmin; newmin += vmin - newmin; } if (newmax > vmax) { newmin -= newmax - vmax; newmax -= newmax - vmax; } // cerr << "(" << dmin << ", " << dmax << ") -> (" // << newmin << ", " << newmax << ") (drag start " << m_dragStartMinValue << ")" << endl; setTopLayerDisplayExtents(newmin, newmax); updateVerticalPanner(); } } } Pane::DragMode Pane::updateDragMode(DragMode dragMode, QPoint origin, QPoint point, bool canMoveHorizontal, bool canMoveVertical, bool resistHorizontal, bool resistVertical) { int xdiff = point.x() - origin.x(); int ydiff = point.y() - origin.y(); int smallThreshold = 10, bigThreshold = 80; if (m_manager) { smallThreshold = m_manager->scalePixelSize(smallThreshold); bigThreshold = m_manager->scalePixelSize(bigThreshold); } // SVDEBUG << "Pane::updateDragMode: xdiff = " << xdiff << ", ydiff = " // << ydiff << ", canMoveVertical = " << canMoveVertical << ", drag mode = " << m_dragMode << endl; if (dragMode == UnresolvedDrag) { if (abs(ydiff) > smallThreshold && abs(ydiff) > abs(xdiff) * 2 && canMoveVertical) { // SVDEBUG << "Pane::updateDragMode: passed vertical threshold" << endl; dragMode = VerticalDrag; } else if (abs(xdiff) > smallThreshold && abs(xdiff) > abs(ydiff) * 2 && canMoveHorizontal) { // SVDEBUG << "Pane::updateDragMode: passed horizontal threshold" << endl; dragMode = HorizontalDrag; } else if (abs(xdiff) > smallThreshold && abs(ydiff) > smallThreshold && canMoveVertical && canMoveHorizontal) { // SVDEBUG << "Pane::updateDragMode: passed both thresholds" << endl; dragMode = FreeDrag; } } if (dragMode == VerticalDrag && canMoveHorizontal) { if (abs(xdiff) > bigThreshold) dragMode = FreeDrag; } if (dragMode == HorizontalDrag && canMoveVertical) { if (abs(ydiff) > bigThreshold) dragMode = FreeDrag; } if (dragMode == UnresolvedDrag) { if (!resistHorizontal && xdiff != 0) { dragMode = HorizontalDrag; } if (!resistVertical && ydiff != 0) { if (dragMode == HorizontalDrag) dragMode = FreeDrag; else dragMode = VerticalDrag; } } return dragMode; } void Pane::dragExtendSelection(QMouseEvent *e) { sv_frame_t mouseFrame = getFrameForX(e->x()); int resolution = 1; sv_frame_t snapFrameLeft = mouseFrame; sv_frame_t snapFrameRight = mouseFrame; Layer *layer = getInteractionLayer(); if (layer && !m_shiftPressed && !qobject_cast(layer)) { // don't snap to secs layer->snapToFeatureFrame(this, snapFrameLeft, resolution, Layer::SnapLeft); layer->snapToFeatureFrame(this, snapFrameRight, resolution, Layer::SnapRight); } // cerr << "snap: frame = " << mouseFrame << ", start frame = " << m_selectionStartFrame << ", left = " << snapFrameLeft << ", right = " << snapFrameRight << endl; if (snapFrameLeft < 0) snapFrameLeft = 0; if (snapFrameRight < 0) snapFrameRight = 0; sv_frame_t min, max; if (m_selectionStartFrame > snapFrameLeft) { min = snapFrameLeft; max = m_selectionStartFrame; } else if (snapFrameRight > m_selectionStartFrame) { min = m_selectionStartFrame; max = snapFrameRight; } else { min = snapFrameLeft; max = snapFrameRight; } sv_frame_t end = getModelsEndFrame(); if (min > end) min = end; if (max > end) max = end; if (m_manager) { Selection sel(alignToReference(min), alignToReference(max)); bool exc; bool same = (m_manager->haveInProgressSelection() && m_manager->getInProgressSelection(exc) == sel); m_manager->setInProgressSelection(sel, !m_resizing && !m_ctrlPressed); if (!same) { edgeScrollMaybe(e->x()); } } update(); if (min != max) { m_playbackFrameMoveScheduled = false; } } void Pane::edgeScrollMaybe(int x) { sv_frame_t mouseFrame = getFrameForX(x); bool doScroll = false; if (!m_manager) doScroll = true; else if (!m_manager->isPlaying()) doScroll = true; if (m_followPlay != PlaybackScrollContinuous) doScroll = true; if (doScroll) { sv_frame_t offset = mouseFrame - getStartFrame(); sv_frame_t available = getEndFrame() - getStartFrame(); sv_frame_t move = 0; sv_frame_t rightEdge = available - (available / 20); sv_frame_t leftEdge = (available / 10); if (offset >= rightEdge) { move = offset - rightEdge + 1; } else if (offset <= leftEdge) { move = offset - leftEdge - 1; } if (move != 0) { setCentreFrame(m_centreFrame + move); update(); } } } void Pane::mouseDoubleClickEvent(QMouseEvent *e) { if (e->buttons() & Qt::RightButton) { return; } cerr << "mouseDoubleClickEvent" << endl; m_clickPos = e->pos(); m_clickedInRange = true; m_shiftPressed = (e->modifiers() & Qt::ShiftModifier); m_ctrlPressed = (e->modifiers() & Qt::ControlModifier); m_altPressed = (e->modifiers() & Qt::AltModifier); // cancel any pending move that came from a single click m_playbackFrameMoveScheduled = false; ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolModeFor(this); bool relocate = (mode == ViewManager::NavigateMode || (e->buttons() & Qt::MidButton)); if (mode == ViewManager::SelectMode) { m_clickedInRange = false; if (m_manager) m_manager->clearInProgressSelection(); emit doubleClickSelectInvoked(getFrameForX(e->x())); return; } if (mode == ViewManager::NavigateMode || mode == ViewManager::EditMode) { Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { if (layer->editOpen(this, e)) relocate = false; } } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer) layer->measureDoubleClick(this, e); update(); } if (relocate) { sv_frame_t f = getFrameForX(e->x()); setCentreFrame(f); m_dragCentreFrame = f; m_dragStartMinValue = 0; m_dragMode = UnresolvedDrag; double vmin, vmax, dmin, dmax; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { m_dragStartMinValue = dmin; } } if (mode == ViewManager::NoteEditMode) { std::cerr << "double click in note edit mode" << std::endl; Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { layer->addNote(this, e); } } m_clickedInRange = false; // in case mouseReleaseEvent is not properly called } void Pane::enterEvent(QEvent *) { m_mouseInWidget = true; } void Pane::leaveEvent(QEvent *) { m_mouseInWidget = false; bool previouslyIdentifying = m_identifyFeatures; m_identifyFeatures = false; if (previouslyIdentifying) update(); emit contextHelpChanged(""); } void Pane::resizeEvent(QResizeEvent *) { updateHeadsUpDisplay(); } void Pane::wheelEvent(QWheelEvent *e) { // cerr << "wheelEvent, delta " << e->delta() << ", angleDelta " << e->angleDelta().x() << "," << e->angleDelta().y() << ", pixelDelta " << e->pixelDelta().x() << "," << e->pixelDelta().y() << ", modifiers " << e->modifiers() << endl; e->accept(); // we never want wheel events on the pane to be propagated int dx = e->angleDelta().x(); int dy = e->angleDelta().y(); if (dx == 0 && dy == 0) { return; } int d = dy; bool horizontal = false; if (abs(dx) > abs(dy)) { d = dx; horizontal = true; } else if (e->modifiers() & Qt::ControlModifier) { // treat a vertical wheel as horizontal horizontal = true; } if (e->phase() == Qt::ScrollBegin || std::abs(d) >= 120 || (d > 0 && m_pendingWheelAngle < 0) || (d < 0 && m_pendingWheelAngle > 0)) { m_pendingWheelAngle = d; } else { m_pendingWheelAngle += d; } if (horizontal && e->pixelDelta().x() != 0) { // Have fine pixel information: use it wheelHorizontalFine(e->pixelDelta().x(), e->modifiers()); m_pendingWheelAngle = 0; } else { // Coarse wheel information (or vertical zoom, which is // necessarily coarse itself) // Sometimes on Linux we're seeing absurdly extreme angles on // the first wheel event -- discard those entirely if (abs(m_pendingWheelAngle) >= 600) { m_pendingWheelAngle = 0; return; } while (abs(m_pendingWheelAngle) >= 120) { int sign = (m_pendingWheelAngle < 0 ? -1 : 1); if (horizontal) { wheelHorizontal(sign, e->modifiers()); } else { wheelVertical(sign, e->modifiers()); } m_pendingWheelAngle -= sign * 120; } } } void Pane::wheelVertical(int sign, Qt::KeyboardModifiers mods) { // cerr << "wheelVertical: sign = " << sign << endl; if (mods & Qt::ShiftModifier) { // Pan vertically if (m_vpan) { m_vpan->scroll(sign > 0); } } else if (mods & Qt::AltModifier) { // Zoom vertically if (m_vthumb) { m_vthumb->scroll(sign > 0); } } else { // Zoom in or out int newZoomLevel = m_zoomLevel; if (sign > 0) { if (newZoomLevel <= 2) { newZoomLevel = 1; } else { newZoomLevel = getZoomConstraintBlockSize (newZoomLevel - 1, ZoomConstraint::RoundDown); } } else { // sign < 0 newZoomLevel = getZoomConstraintBlockSize (newZoomLevel + 1, ZoomConstraint::RoundUp); } if (newZoomLevel != m_zoomLevel) { setZoomLevel(newZoomLevel); } } emit paneInteractedWith(); } void Pane::wheelHorizontal(int sign, Qt::KeyboardModifiers mods) { // cerr << "wheelHorizontal: sign = " << sign << endl; // Scroll left or right, rapidly wheelHorizontalFine((width() / 4) * sign, mods); } void Pane::wheelHorizontalFine(int pixels, Qt::KeyboardModifiers) { // cerr << "wheelHorizontalFine: pixels = " << pixels << endl; // Scroll left or right by a fixed number of pixels if (getStartFrame() < 0 && getEndFrame() >= getModelsEndFrame()) return; int delta = (pixels * m_zoomLevel); if (m_centreFrame < delta) { setCentreFrame(0); } else if (m_centreFrame - delta >= getModelsEndFrame()) { setCentreFrame(getModelsEndFrame()); } else { setCentreFrame(m_centreFrame - delta); } emit paneInteractedWith(); } void Pane::horizontalThumbwheelMoved(int value) { //!!! dupe with updateHeadsUpDisplay int count = 0; int level = 1; //!!! pull out into function (presumably in View) bool haveConstraint = false; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getZoomConstraint() && !(*i)->supportsOtherZoomLevels()) { haveConstraint = true; break; } } if (haveConstraint) { while (true) { if (m_hthumb->getMaximumValue() - value == count) break; int newLevel = getZoomConstraintBlockSize(level + 1, ZoomConstraint::RoundUp); if (newLevel == level) break; level = newLevel; if (++count == 50) break; } } else { while (true) { if (m_hthumb->getMaximumValue() - value == count) break; int step = level / 10; int pwr = 0; while (step > 0) { ++pwr; step /= 2; } step = 1; while (pwr > 0) { step *= 2; --pwr; } // cerr << level << endl; level += step; if (++count == 100 || level > 262144) break; } } // cerr << "new level is " << level << endl; setZoomLevel(level); } void Pane::verticalThumbwheelMoved(int value) { Layer *layer = 0; if (getLayerCount() > 0) layer = getLayer(getLayerCount() - 1); if (layer) { int defaultStep = 0; int max = layer->getVerticalZoomSteps(defaultStep); if (max == 0) { updateHeadsUpDisplay(); return; } if (value > max) { value = max; } layer->setVerticalZoomStep(value); updateVerticalPanner(); } } void Pane::verticalPannerMoved(float , float y0, float , float h) { double vmin, vmax, dmin, dmax; if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) return; double y1 = y0 + h; double newmax = vmin + ((1.0 - y0) * (vmax - vmin)); double newmin = vmin + ((1.0 - y1) * (vmax - vmin)); // cerr << "verticalPannerMoved: (" << x0 << "," << y0 << "," << w // << "," << h << ") -> (" << newmin << "," << newmax << ")" << endl; setTopLayerDisplayExtents(newmin, newmax); } void Pane::editVerticalPannerExtents() { if (!m_vpan || !m_manager || !m_manager->getZoomWheelsEnabled()) return; double vmin, vmax, dmin, dmax; QString unit; if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax, &unit) || vmax == vmin) { return; } RangeInputDialog dialog(tr("Enter new range"), tr("New vertical display range, from %1 to %2 %4:") .arg(vmin).arg(vmax).arg(unit), unit, float(vmin), float(vmax), this); dialog.setRange(float(dmin), float(dmax)); if (dialog.exec() == QDialog::Accepted) { float newmin, newmax; dialog.getRange(newmin, newmax); setTopLayerDisplayExtents(newmin, newmax); updateVerticalPanner(); } } void Pane::layerParametersChanged() { View::layerParametersChanged(); updateHeadsUpDisplay(); } void Pane::dragEnterEvent(QDragEnterEvent *e) { QStringList formats(e->mimeData()->formats()); cerr << "dragEnterEvent: format: " << formats.join(",") << ", possibleActions: " << e->possibleActions() << ", proposedAction: " << e->proposedAction() << endl; if (e->mimeData()->hasFormat("text/uri-list") || e->mimeData()->hasFormat("text/plain")) { if (e->proposedAction() & Qt::CopyAction) { e->acceptProposedAction(); } else { e->setDropAction(Qt::CopyAction); e->accept(); } } } void Pane::dropEvent(QDropEvent *e) { cerr << "dropEvent: text: \"" << e->mimeData()->text() << "\"" << endl; if (e->mimeData()->hasFormat("text/uri-list") || e->mimeData()->hasFormat("text/plain")) { if (e->proposedAction() & Qt::CopyAction) { e->acceptProposedAction(); } else { e->setDropAction(Qt::CopyAction); e->accept(); } if (e->mimeData()->hasFormat("text/uri-list")) { SVDEBUG << "accepting... data is \"" << e->mimeData()->data("text/uri-list").data() << "\"" << endl; emit dropAccepted(QString::fromLocal8Bit (e->mimeData()->data("text/uri-list").data()) .split(QRegExp("[\\r\\n]+"), QString::SkipEmptyParts)); } else { emit dropAccepted(QString::fromLocal8Bit (e->mimeData()->data("text/plain").data())); } } } bool Pane::editSelectionStart(QMouseEvent *e) { if (!m_identifyFeatures || !m_manager || m_manager->getToolModeFor(this) != ViewManager::EditMode) { return false; } bool closeToLeft, closeToRight; Selection s(getSelectionAt(e->x(), closeToLeft, closeToRight)); if (s.isEmpty()) return false; m_editingSelection = s; m_editingSelectionEdge = (closeToLeft ? -1 : closeToRight ? 1 : 0); m_mousePos = e->pos(); return true; } bool Pane::editSelectionDrag(QMouseEvent *e) { if (m_editingSelection.isEmpty()) return false; m_mousePos = e->pos(); update(); return true; } bool Pane::editSelectionEnd(QMouseEvent *) { if (m_editingSelection.isEmpty()) return false; int offset = m_mousePos.x() - m_clickPos.x(); Layer *layer = getInteractionLayer(); if (offset == 0 || !layer) { m_editingSelection = Selection(); return true; } int p0 = getXForFrame(m_editingSelection.getStartFrame()) + offset; int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset; sv_frame_t f0 = getFrameForX(p0); sv_frame_t f1 = getFrameForX(p1); Selection newSelection(f0, f1); if (m_editingSelectionEdge == 0) { CommandHistory::getInstance()->startCompoundOperation (tr("Drag Selection"), true); layer->moveSelection(m_editingSelection, f0); } else { CommandHistory::getInstance()->startCompoundOperation (tr("Resize Selection"), true); if (m_editingSelectionEdge < 0) { f1 = m_editingSelection.getEndFrame(); } else { f0 = m_editingSelection.getStartFrame(); } newSelection = Selection(f0, f1); layer->resizeSelection(m_editingSelection, newSelection); } m_manager->removeSelection(m_editingSelection); m_manager->addSelection(newSelection); CommandHistory::getInstance()->endCompoundOperation(); m_editingSelection = Selection(); return true; } void Pane::toolModeChanged() { ViewManager::ToolMode mode = m_manager->getToolModeFor(this); // SVDEBUG << "Pane::toolModeChanged(" << mode << ")" << endl; if (mode == ViewManager::MeasureMode && !m_measureCursor1) { m_measureCursor1 = new QCursor(QBitmap(":/icons/measure1cursor.xbm"), QBitmap(":/icons/measure1mask.xbm"), 15, 14); m_measureCursor2 = new QCursor(QBitmap(":/icons/measure2cursor.xbm"), QBitmap(":/icons/measure2mask.xbm"), 16, 17); } switch (mode) { case ViewManager::NavigateMode: setCursor(Qt::PointingHandCursor); break; case ViewManager::SelectMode: setCursor(Qt::ArrowCursor); break; case ViewManager::EditMode: setCursor(Qt::UpArrowCursor); break; case ViewManager::DrawMode: setCursor(Qt::CrossCursor); break; case ViewManager::EraseMode: setCursor(Qt::CrossCursor); break; case ViewManager::MeasureMode: if (m_measureCursor1) setCursor(*m_measureCursor1); break; // GF: NoteEditMode uses the same default cursor as EditMode, but it will change in a context sensitive manner. case ViewManager::NoteEditMode: setCursor(Qt::UpArrowCursor); break; /* case ViewManager::TextMode: setCursor(Qt::IBeamCursor); break; */ } } void Pane::zoomWheelsEnabledChanged() { updateHeadsUpDisplay(); update(); } void Pane::viewZoomLevelChanged(View *v, int z, bool locked) { // cerr << "Pane[" << this << "]::zoomLevelChanged (global now " // << (m_manager ? m_manager->getGlobalZoom() : 0) << ")" << endl; View::viewZoomLevelChanged(v, z, locked); if (m_hthumb && !m_hthumb->isVisible()) return; if (v != this) { if (!locked || !m_followZoom) return; } if (m_manager && m_manager->getZoomWheelsEnabled()) { updateHeadsUpDisplay(); } } void Pane::propertyContainerSelected(View *v, PropertyContainer *pc) { Layer *layer = 0; if (getLayerCount() > 0) { layer = getLayer(getLayerCount() - 1); disconnect(layer, SIGNAL(verticalZoomChanged()), this, SLOT(verticalZoomChanged())); } View::propertyContainerSelected(v, pc); updateHeadsUpDisplay(); if (m_vthumb) { RangeMapper *rm = 0; if (layer) rm = layer->getNewVerticalZoomRangeMapper(); if (rm) m_vthumb->setRangeMapper(rm); } if (getLayerCount() > 0) { layer = getLayer(getLayerCount() - 1); connect(layer, SIGNAL(verticalZoomChanged()), this, SLOT(verticalZoomChanged())); } } void Pane::verticalZoomChanged() { Layer *layer = 0; if (getLayerCount() > 0) { layer = getLayer(getLayerCount() - 1); if (m_vthumb && m_vthumb->isVisible()) { m_vthumb->setValue(layer->getCurrentVerticalZoomStep()); } } } void Pane::updateContextHelp(const QPoint *pos) { QString help = ""; if (m_clickedInRange) { emit contextHelpChanged(""); return; } ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolModeFor(this); bool editable = false; Layer *layer = getInteractionLayer(); if (layer && layer->isLayerEditable()) { editable = true; } if (mode == ViewManager::NavigateMode) { help = tr("Click and drag to navigate"); } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) return; bool haveSelection = (m_manager && !m_manager->getSelections().empty()); if (haveSelection) { #ifdef Q_OS_MAC if (editable) { help = tr("Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate"); } else { help = tr("Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate"); } #else if (editable) { help = tr("Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate"); } else { help = tr("Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate"); } #endif if (pos) { bool closeToLeft = false, closeToRight = false; Selection selection = getSelectionAt(pos->x(), closeToLeft, closeToRight); if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { help = tr("Click and drag to move the selection boundary"); } } } else { if (editable) { help = tr("Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate"); } else { help = tr("Click and drag to select a range; middle-click and drag to navigate"); } } } else if (mode == ViewManager::DrawMode) { //!!! could call through to a layer function to find out exact meaning if (editable) { help = tr("Click to add a new item in the active layer"); } } else if (mode == ViewManager::EraseMode) { //!!! could call through to a layer function to find out exact meaning if (editable) { help = tr("Click to erase an item from the active layer"); } } else if (mode == ViewManager::EditMode) { //!!! could call through to layer if (editable) { help = tr("Click and drag an item in the active layer to move it; hold Shift to override initial resistance"); if (pos) { bool closeToLeft = false, closeToRight = false; Selection selection = getSelectionAt(pos->x(), closeToLeft, closeToRight); if (!selection.isEmpty()) { help = tr("Click and drag to move all items in the selected range"); } } } } emit contextHelpChanged(help); } void Pane::mouseEnteredWidget() { QWidget *w = dynamic_cast(sender()); if (!w) return; if (w == m_vpan) { emit contextHelpChanged(tr("Click and drag to adjust the visible range of the vertical scale")); } else if (w == m_vthumb) { emit contextHelpChanged(tr("Click and drag to adjust the vertical zoom level")); } else if (w == m_hthumb) { emit contextHelpChanged(tr("Click and drag to adjust the horizontal zoom level")); } else if (w == m_reset) { emit contextHelpChanged(tr("Reset horizontal and vertical zoom levels to their defaults")); } } void Pane::mouseLeftWidget() { emit contextHelpChanged(""); } void Pane::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { View::toXml (stream, indent, QString("type=\"pane\" centreLineVisible=\"%1\" height=\"%2\" %3") .arg(m_centreLineVisible).arg(height()).arg(extraAttributes)); } sonic-visualiser-3.0.3/svgui/view/Pane.h0000644000000000000000000001554513111512442016311 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PANE_H_ #define _PANE_H_ #include #include #include "base/ZoomConstraint.h" #include "View.h" #include "base/Selection.h" class QWidget; class QPaintEvent; class Layer; class Thumbwheel; class Panner; class NotifyingPushButton; class KeyReference; class Pane : public View { Q_OBJECT public: Pane(QWidget *parent = 0); virtual QString getPropertyContainerIconName() const override { return "pane"; } virtual bool shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const override; virtual bool shouldIlluminateLocalSelection(QPoint &pos, bool &closeToLeft, bool &closeToRight) const override; void setCentreLineVisible(bool visible); bool getCentreLineVisible() const { return m_centreLineVisible; } virtual sv_frame_t getFirstVisibleFrame() const override; int getVerticalScaleWidth() const; virtual QImage *renderToNewImage() override { return View::renderToNewImage(); } virtual QImage *renderPartToNewImage(sv_frame_t f0, sv_frame_t f1) override; virtual QSize getRenderedImageSize() override { return View::getRenderedImageSize(); } virtual QSize getRenderedPartImageSize(sv_frame_t f0, sv_frame_t f1) override; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const override; static void registerShortcuts(KeyReference &kr); enum PaneType { Normal = 0, TonyMain = 1, TonySelection = 2 }; signals: void paneInteractedWith(); void rightButtonMenuRequested(QPoint position); void dropAccepted(QStringList uriList); void dropAccepted(QString text); void doubleClickSelectInvoked(sv_frame_t frame); void regionOutlined(QRect rect); public slots: // view slots virtual void toolModeChanged() override; virtual void zoomWheelsEnabledChanged() override; virtual void viewZoomLevelChanged(View *v, int z, bool locked) override; virtual void modelAlignmentCompletionChanged() override; // local slots, not overrides virtual void horizontalThumbwheelMoved(int value); virtual void verticalThumbwheelMoved(int value); virtual void verticalZoomChanged(); virtual void verticalPannerMoved(float x, float y, float w, float h); virtual void editVerticalPannerExtents(); virtual void layerParametersChanged() override; virtual void propertyContainerSelected(View *, PropertyContainer *pc) override; void zoomToRegion(QRect r); void mouseEnteredWidget(); void mouseLeftWidget(); protected slots: void playbackScheduleTimerElapsed(); protected: virtual void paintEvent(QPaintEvent *e) override; virtual void mousePressEvent(QMouseEvent *e) override; virtual void mouseReleaseEvent(QMouseEvent *e) override; virtual void mouseMoveEvent(QMouseEvent *e) override; virtual void mouseDoubleClickEvent(QMouseEvent *e) override; virtual void enterEvent(QEvent *e) override; virtual void leaveEvent(QEvent *e) override; virtual void wheelEvent(QWheelEvent *e) override; virtual void resizeEvent(QResizeEvent *e) override; virtual void dragEnterEvent(QDragEnterEvent *e) override; virtual void dropEvent(QDropEvent *e) override; void wheelVertical(int sign, Qt::KeyboardModifiers); void wheelHorizontal(int sign, Qt::KeyboardModifiers); void wheelHorizontalFine(int pixels, Qt::KeyboardModifiers); void drawVerticalScale(QRect r, Layer *, QPainter &); void drawFeatureDescription(Layer *, QPainter &); void drawCentreLine(sv_samplerate_t, QPainter &, bool omitLine); void drawModelTimeExtents(QRect, QPainter &, const Model *); void drawDurationAndRate(QRect, const Model *, sv_samplerate_t, QPainter &); void drawWorkTitle(QRect, QPainter &, const Model *); void drawLayerNames(QRect, QPainter &); void drawEditingSelection(QPainter &); void drawAlignmentStatus(QRect, QPainter &, const Model *, bool down); virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1) override; Selection getSelectionAt(int x, bool &closeToLeft, bool &closeToRight) const; bool editSelectionStart(QMouseEvent *e); bool editSelectionDrag(QMouseEvent *e); bool editSelectionEnd(QMouseEvent *e); bool selectionIsBeingEdited() const; void updateHeadsUpDisplay(); void updateVerticalPanner(); bool canTopLayerMoveVertical(); bool getTopLayerDisplayExtents(double &valueMin, double &valueMax, double &displayMin, double &displayMax, QString *unit = 0); bool setTopLayerDisplayExtents(double displayMin, double displayMax); void dragTopLayer(QMouseEvent *e); void dragExtendSelection(QMouseEvent *e); void updateContextHelp(const QPoint *pos); void edgeScrollMaybe(int x); Layer *getTopFlexiNoteLayer(); void schedulePlaybackFrameMove(sv_frame_t frame); bool m_identifyFeatures; QPoint m_identifyPoint; QPoint m_clickPos; QPoint m_mousePos; bool m_clickedInRange; bool m_shiftPressed; bool m_ctrlPressed; bool m_altPressed; bool m_navigating; bool m_resizing; bool m_editing; bool m_releasing; sv_frame_t m_dragCentreFrame; double m_dragStartMinValue; bool m_centreLineVisible; sv_frame_t m_selectionStartFrame; Selection m_editingSelection; int m_editingSelectionEdge; mutable int m_scaleWidth; int m_pendingWheelAngle; enum DragMode { UnresolvedDrag, VerticalDrag, HorizontalDrag, FreeDrag }; DragMode m_dragMode; DragMode updateDragMode(DragMode currentMode, QPoint origin, QPoint currentPoint, bool canMoveHorizontal, bool canMoveVertical, bool resistHorizontal, bool resistVertical); QWidget *m_headsUpDisplay; Panner *m_vpan; Thumbwheel *m_hthumb; Thumbwheel *m_vthumb; NotifyingPushButton *m_reset; bool m_mouseInWidget; bool m_playbackFrameMoveScheduled; sv_frame_t m_playbackFrameMoveTo; static QCursor *m_measureCursor1; static QCursor *m_measureCursor2; }; #endif sonic-visualiser-3.0.3/svgui/view/PaneStack.cpp0000644000000000000000000004312113111512442017621 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PaneStack.h" #include "Pane.h" #include "widgets/PropertyStack.h" #include "widgets/IconLoader.h" #include "widgets/ClickableLabel.h" #include "layer/Layer.h" #include "ViewManager.h" #include "AlignmentView.h" #include #include #include #include #include #include #include #include #include #include //#define DEBUG_PANE_STACK 1 PaneStack::PaneStack(QWidget *parent, ViewManager *viewManager) : QFrame(parent), m_currentPane(0), m_showAccessories(true), m_showAlignmentViews(false), m_splitter(new QSplitter), m_propertyStackStack(new QStackedWidget), m_viewManager(viewManager), m_propertyStackMinWidth(100), m_layoutStyle(PropertyStackPerPaneLayout) { QHBoxLayout *layout = new QHBoxLayout; layout->setMargin(0); layout->setSpacing(0); m_splitter->setOrientation(Qt::Vertical); m_splitter->setOpaqueResize(false); layout->addWidget(m_splitter); layout->setStretchFactor(m_splitter, 1); layout->addWidget(m_propertyStackStack); m_propertyStackStack->hide(); setLayout(layout); } void PaneStack::setShowPaneAccessories(bool show) { m_showAccessories = show; } void PaneStack::setShowAlignmentViews(bool show) { m_showAlignmentViews = show; foreach (const PaneRec &r, m_panes) { r.alignmentView->setVisible(m_showAlignmentViews); } } Pane * PaneStack::addPane(bool suppressPropertyBox) { return insertPane(getPaneCount(), suppressPropertyBox); } Pane * PaneStack::insertPane(int index, bool suppressPropertyBox) { QFrame *frame = new QFrame; QGridLayout *layout = new QGridLayout; layout->setMargin(0); layout->setSpacing(2); QPushButton *xButton = new QPushButton(frame); xButton->setIcon(IconLoader().load("cross")); xButton->setFixedSize(QSize(16, 16)); xButton->setFlat(true); xButton->setVisible(m_showAccessories); layout->addWidget(xButton, 0, 0); connect(xButton, SIGNAL(clicked()), this, SLOT(paneDeleteButtonClicked())); ClickableLabel *currentIndicator = new ClickableLabel(frame); connect(currentIndicator, SIGNAL(clicked()), this, SLOT(indicatorClicked())); layout->addWidget(currentIndicator, 1, 0); layout->setRowStretch(1, 20); currentIndicator->setMinimumWidth(8); currentIndicator->setScaledContents(true); currentIndicator->setVisible(m_showAccessories); sv_frame_t initialCentreFrame = -1; if (!m_panes.empty()) { initialCentreFrame = m_panes[0].pane->getCentreFrame(); } Pane *pane = new Pane(frame); if (initialCentreFrame >= 0) { pane->setViewManager(m_viewManager, initialCentreFrame); } else { pane->setViewManager(m_viewManager); } layout->addWidget(pane, 0, 1, 2, 1); layout->setColumnStretch(1, 20); AlignmentView *av = new AlignmentView(frame); av->setFixedHeight(40);//!!! av->setVisible(m_showAlignmentViews); av->setViewManager(m_viewManager); layout->addWidget(av, 2, 1); QWidget *properties = 0; if (suppressPropertyBox) { properties = new QFrame(); } else { properties = new PropertyStack(frame, pane); connect(properties, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)), this, SLOT(propertyContainerSelected(View *, PropertyContainer *))); connect(properties, SIGNAL(viewSelected(View *)), this, SLOT(viewSelected(View *))); connect(properties, SIGNAL(contextHelpChanged(const QString &)), this, SIGNAL(contextHelpChanged(const QString &))); } if (m_layoutStyle == PropertyStackPerPaneLayout) { layout->addWidget(properties, 0, 2, 2, 1); } else { properties->setParent(m_propertyStackStack); m_propertyStackStack->addWidget(properties); } layout->setColumnStretch(2, 0); PaneRec rec; rec.pane = pane; rec.propertyStack = properties; rec.xButton = xButton; rec.currentIndicator = currentIndicator; rec.frame = frame; rec.layout = layout; rec.alignmentView = av; m_panes.push_back(rec); frame->setLayout(layout); m_splitter->insertWidget(index, frame); connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(pane, SIGNAL(paneInteractedWith()), this, SLOT(paneInteractedWith())); connect(pane, SIGNAL(rightButtonMenuRequested(QPoint)), this, SLOT(rightButtonMenuRequested(QPoint))); connect(pane, SIGNAL(dropAccepted(QStringList)), this, SLOT(paneDropAccepted(QStringList))); connect(pane, SIGNAL(dropAccepted(QString)), this, SLOT(paneDropAccepted(QString))); connect(pane, SIGNAL(doubleClickSelectInvoked(sv_frame_t)), this, SIGNAL(doubleClickSelectInvoked(sv_frame_t))); emit paneAdded(pane); emit paneAdded(); if (!m_currentPane) { setCurrentPane(pane); } showOrHidePaneAccessories(); relinkAlignmentViews(); return pane; } void PaneStack::relinkAlignmentViews() { for (int i = 0; i < (int)m_panes.size(); ++i) { m_panes[i].alignmentView->setViewAbove(m_panes[i].pane); if (i + 1 < (int)m_panes.size()) { m_panes[i].alignmentView->setViewBelow(m_panes[i+1].pane); } else { m_panes[i].alignmentView->setViewBelow(0); } } } void PaneStack::unlinkAlignmentViews() { for (int i = 0; i < (int)m_panes.size(); ++i) { m_panes[i].alignmentView->setViewAbove(0); m_panes[i].alignmentView->setViewBelow(0); } } void PaneStack::setPropertyStackMinWidth(int mw) { for (std::vector::iterator i = m_panes.begin(); i != m_panes.end(); ++i) { i->propertyStack->setMinimumWidth(mw); } m_propertyStackMinWidth = mw; } void PaneStack::setLayoutStyle(LayoutStyle style) { if (style == m_layoutStyle) return; m_layoutStyle = style; std::vector::iterator i; switch (style) { case NoPropertyStacks: case SinglePropertyStackLayout: for (i = m_panes.begin(); i != m_panes.end(); ++i) { i->layout->removeWidget(i->propertyStack); i->propertyStack->setParent(m_propertyStackStack); m_propertyStackStack->addWidget(i->propertyStack); } m_propertyStackStack->setVisible(style != NoPropertyStacks); break; case PropertyStackPerPaneLayout: for (i = m_panes.begin(); i != m_panes.end(); ++i) { m_propertyStackStack->removeWidget(i->propertyStack); i->propertyStack->setParent(i->frame); i->layout->addWidget(i->propertyStack, 0, 2, 2, 1); i->propertyStack->show(); } m_propertyStackStack->hide(); break; } } Pane * PaneStack::getPane(int n) { if (n < (int)m_panes.size()) { return m_panes[n].pane; } else { return 0; } } int PaneStack::getPaneIndex(Pane *pane) { for (int i = 0; i < getPaneCount(); ++i) { if (pane == getPane(i)) { return i; } } return -1; } Pane * PaneStack::getHiddenPane(int n) { return m_hiddenPanes[n].pane; } void PaneStack::deletePane(Pane *pane) { cerr << "PaneStack::deletePane(" << pane << ")" << endl; std::vector::iterator i; bool found = false; QWidget *stack = 0; for (i = m_panes.begin(); i != m_panes.end(); ++i) { if (i->pane == pane) { stack = i->propertyStack; m_panes.erase(i); found = true; break; } } if (!found) { for (i = m_hiddenPanes.begin(); i != m_hiddenPanes.end(); ++i) { if (i->pane == pane) { stack = i->propertyStack; m_hiddenPanes.erase(i); found = true; break; } } if (!found) { cerr << "WARNING: PaneStack::deletePane(" << pane << "): Pane not found in visible or hidden panes, not deleting" << endl; return; } } emit paneAboutToBeDeleted(pane); unlinkAlignmentViews(); cerr << "PaneStack::deletePane: about to delete parent " << pane->parent() << " of pane " << pane << endl; // The property stack associated with the parent was initially // created with the same parent as it, so it would be deleted when // we delete the pane's parent in a moment -- but it may have been // reparented depending on the layout. We'd better delete it // separately first. (This fixes a crash on opening a new layer // with a new unit type in it, when a long-defunct property box // could be signalled from the unit database to tell it that a new // unit had appeared.) delete stack; delete pane->parent(); if (m_currentPane == pane) { if (m_panes.size() > 0) { setCurrentPane(m_panes[0].pane); } else { setCurrentPane(0); } } showOrHidePaneAccessories(); relinkAlignmentViews(); emit paneDeleted(); } void PaneStack::showOrHidePaneAccessories() { cerr << "PaneStack::showOrHidePaneAccessories: count == " << getPaneCount() << endl; bool multi = (getPaneCount() > 1); for (std::vector::iterator i = m_panes.begin(); i != m_panes.end(); ++i) { i->xButton->setVisible(multi && m_showAccessories); i->currentIndicator->setVisible(multi && m_showAccessories); } } int PaneStack::getPaneCount() const { return int(m_panes.size()); } int PaneStack::getHiddenPaneCount() const { return int(m_hiddenPanes.size()); } void PaneStack::hidePane(Pane *pane) { std::vector::iterator i = m_panes.begin(); while (i != m_panes.end()) { if (i->pane == pane) { m_hiddenPanes.push_back(*i); m_panes.erase(i); QWidget *pw = dynamic_cast(pane->parent()); if (pw) pw->hide(); if (m_currentPane == pane) { if (m_panes.size() > 0) { setCurrentPane(m_panes[0].pane); } else { setCurrentPane(0); } } showOrHidePaneAccessories(); emit paneHidden(pane); emit paneHidden(); return; } ++i; } relinkAlignmentViews(); cerr << "WARNING: PaneStack::hidePane(" << pane << "): Pane not found in visible panes" << endl; } void PaneStack::showPane(Pane *pane) { std::vector::iterator i = m_hiddenPanes.begin(); while (i != m_hiddenPanes.end()) { if (i->pane == pane) { m_panes.push_back(*i); m_hiddenPanes.erase(i); QWidget *pw = dynamic_cast(pane->parent()); if (pw) pw->show(); //!!! update current pane showOrHidePaneAccessories(); return; } ++i; } relinkAlignmentViews(); cerr << "WARNING: PaneStack::showPane(" << pane << "): Pane not found in hidden panes" << endl; } void PaneStack::setCurrentPane(Pane *pane) // may be null { if (m_currentPane == pane) return; std::vector::iterator i = m_panes.begin(); // We used to do this by setting the foreground and background // role, but it seems the background role is ignored and the // background drawn transparent in Qt 4.1 -- I can't quite see why QPixmap selectedMap(1, 1); selectedMap.fill(QApplication::palette().color(QPalette::Foreground)); QPixmap unselectedMap(1, 1); unselectedMap.fill(QApplication::palette().color(QPalette::Background)); bool found = false; while (i != m_panes.end()) { if (i->pane == pane) { i->currentIndicator->setPixmap(selectedMap); if (m_layoutStyle != PropertyStackPerPaneLayout) { m_propertyStackStack->setCurrentWidget(i->propertyStack); } found = true; } else { i->currentIndicator->setPixmap(unselectedMap); } ++i; } if (found || pane == 0) { m_currentPane = pane; emit currentPaneChanged(m_currentPane); } else { cerr << "WARNING: PaneStack::setCurrentPane(" << pane << "): pane is not a visible pane in this stack" << endl; } } void PaneStack::setCurrentLayer(Pane *pane, Layer *layer) // may be null { setCurrentPane(pane); if (m_currentPane) { std::vector::iterator i = m_panes.begin(); while (i != m_panes.end()) { if (i->pane == pane) { PropertyStack *stack = dynamic_cast (i->propertyStack); if (stack) { if (stack->containsContainer(layer)) { stack->setCurrentIndex(stack->getContainerIndex(layer)); emit currentLayerChanged(pane, layer); } else { stack->setCurrentIndex (stack->getContainerIndex (pane->getPropertyContainer(0))); emit currentLayerChanged(pane, 0); } } break; } ++i; } } } Pane * PaneStack::getCurrentPane() { return m_currentPane; } void PaneStack::propertyContainerAdded(PropertyContainer *) { sizePropertyStacks(); } void PaneStack::propertyContainerRemoved(PropertyContainer *) { sizePropertyStacks(); } void PaneStack::propertyContainerSelected(View *client, PropertyContainer *pc) { std::vector::iterator i = m_panes.begin(); while (i != m_panes.end()) { PropertyStack *stack = dynamic_cast(i->propertyStack); if (stack && stack->getClient() == client && stack->containsContainer(pc)) { setCurrentPane(i->pane); break; } ++i; } Layer *layer = dynamic_cast(pc); if (layer) emit currentLayerChanged(m_currentPane, layer); else emit currentLayerChanged(m_currentPane, 0); } void PaneStack::viewSelected(View *v) { Pane *p = dynamic_cast(v); if (p) setCurrentPane(p); } void PaneStack::paneInteractedWith() { Pane *pane = dynamic_cast(sender()); if (!pane) return; setCurrentPane(pane); } void PaneStack::rightButtonMenuRequested(QPoint position) { Pane *pane = dynamic_cast(sender()); if (!pane) return; emit rightButtonMenuRequested(pane, position); } void PaneStack::sizePropertyStacks() { int maxMinWidth = 0; if (m_propertyStackMinWidth > 0) maxMinWidth = m_propertyStackMinWidth; for (int i = 0; i < (int)m_panes.size(); ++i) { if (!m_panes[i].propertyStack) continue; #ifdef DEBUG_PANE_STACK SVDEBUG << "PaneStack::sizePropertyStacks: " << i << ": min " << m_panes[i].propertyStack->minimumSizeHint().width() << ", hint " << m_panes[i].propertyStack->sizeHint().width() << ", current " << m_panes[i].propertyStack->width() << endl; #endif if (m_panes[i].propertyStack->sizeHint().width() > maxMinWidth) { maxMinWidth = m_panes[i].propertyStack->sizeHint().width(); } } #ifdef DEBUG_PANE_STACK SVDEBUG << "PaneStack::sizePropertyStacks: max min width " << maxMinWidth << endl; #endif int setWidth = maxMinWidth; m_propertyStackStack->setMaximumWidth(setWidth + 10); for (int i = 0; i < (int)m_panes.size(); ++i) { if (!m_panes[i].propertyStack) continue; m_panes[i].propertyStack->setMinimumWidth(setWidth); } emit propertyStacksResized(setWidth); emit propertyStacksResized(); } void PaneStack::paneDropAccepted(QStringList uriList) { Pane *pane = dynamic_cast(sender()); emit dropAccepted(pane, uriList); } void PaneStack::paneDropAccepted(QString text) { Pane *pane = dynamic_cast(sender()); emit dropAccepted(pane, text); } void PaneStack::paneDeleteButtonClicked() { QObject *s = sender(); for (int i = 0; i < (int)m_panes.size(); ++i) { if (m_panes[i].xButton == s) { emit paneDeleteButtonClicked(m_panes[i].pane); } } } void PaneStack::indicatorClicked() { QObject *s = sender(); for (int i = 0; i < (int)m_panes.size(); ++i) { if (m_panes[i].currentIndicator == s) { setCurrentPane(m_panes[i].pane); return; } } } void PaneStack::sizePanesEqually() { QList sizes = m_splitter->sizes(); if (sizes.empty()) return; int count = sizes.size(); int fixed = 0, variable = 0, total = 0; int varicount = 0; for (int i = 0; i < count; ++i) { total += sizes[i]; } variable = total; for (int i = 0; i < count; ++i) { int minh = m_panes[i].pane->minimumSize().height(); if (minh == m_panes[i].pane->maximumSize().height()) { fixed += minh; variable -= minh; } else { varicount++; } } if (total == 0) return; sizes.clear(); int each = (varicount > 0 ? (variable / varicount) : 0); int remaining = total; for (int i = 0; i < count; ++i) { if (i == count - 1) { sizes.push_back(remaining); } else { int minh = m_panes[i].pane->minimumSize().height(); if (minh == m_panes[i].pane->maximumSize().height()) { sizes.push_back(minh); remaining -= minh; } else { sizes.push_back(each); remaining -= each; } } } /* cerr << "sizes: "; for (int i = 0; i < sizes.size(); ++i) { cerr << sizes[i] << " "; } cerr << endl; */ m_splitter->setSizes(sizes); } sonic-visualiser-3.0.3/svgui/view/PaneStack.h0000644000000000000000000001021113111512442017260 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PANESTACK_H_ #define _PANESTACK_H_ #include #include #include "base/BaseTypes.h" class QWidget; class QLabel; class QStackedWidget; class QSplitter; class QGridLayout; class QPushButton; class View; class Pane; class Layer; class ViewManager; class PropertyContainer; class PropertyStack; class AlignmentView; class PaneStack : public QFrame { Q_OBJECT public: PaneStack(QWidget *parent, ViewManager *viewManager); Pane *addPane(bool suppressPropertyBox = false); // I own the returned value Pane *insertPane(int index, bool suppressPropertyBox = false); // I own the returned value void deletePane(Pane *pane); // Deletes the pane, but _not_ its layers int getPaneCount() const; // Returns only count of visible panes Pane *getPane(int n); // Of visible panes; I own the returned value int getPaneIndex(Pane *pane); // so getPane(index)==pane; -1 if absent void hidePane(Pane *pane); // Also removes pane from getPane/getPaneCount void showPane(Pane *pane); // Returns pane to getPane/getPaneCount int getHiddenPaneCount() const; Pane *getHiddenPane(int n); // I own the returned value void setCurrentPane(Pane *pane); void setCurrentLayer(Pane *pane, Layer *layer); Pane *getCurrentPane(); enum LayoutStyle { NoPropertyStacks = 0, SinglePropertyStackLayout = 1, PropertyStackPerPaneLayout = 2 }; LayoutStyle getLayoutStyle() const { return m_layoutStyle; } void setLayoutStyle(LayoutStyle style); void setPropertyStackMinWidth(int mw); void setShowPaneAccessories(bool show); // current indicator, close button void setShowAlignmentViews(bool show); void sizePanesEqually(); signals: void currentPaneChanged(Pane *pane); void currentLayerChanged(Pane *pane, Layer *layer); void rightButtonMenuRequested(Pane *pane, QPoint position); void propertyStacksResized(int width); void propertyStacksResized(); void contextHelpChanged(const QString &); void paneAdded(Pane *pane); void paneAdded(); void paneHidden(Pane *pane); void paneHidden(); void paneAboutToBeDeleted(Pane *pane); void paneDeleted(); void dropAccepted(Pane *pane, QStringList uriList); void dropAccepted(Pane *pane, QString text); void paneDeleteButtonClicked(Pane *pane); void doubleClickSelectInvoked(sv_frame_t frame); public slots: void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerSelected(View *client, PropertyContainer *); void viewSelected(View *v); void paneInteractedWith(); void rightButtonMenuRequested(QPoint); void paneDropAccepted(QStringList); void paneDropAccepted(QString); void paneDeleteButtonClicked(); void indicatorClicked(); protected: Pane *m_currentPane; struct PaneRec { Pane *pane; QWidget *propertyStack; QPushButton *xButton; QLabel *currentIndicator; QFrame *frame; QGridLayout *layout; AlignmentView *alignmentView; }; std::vector m_panes; std::vector m_hiddenPanes; bool m_showAccessories; bool m_showAlignmentViews; QSplitter *m_splitter; QStackedWidget *m_propertyStackStack; ViewManager *m_viewManager; // I don't own this int m_propertyStackMinWidth; void sizePropertyStacks(); void showOrHidePaneAccessories(); void unlinkAlignmentViews(); void relinkAlignmentViews(); LayoutStyle m_layoutStyle; }; #endif sonic-visualiser-3.0.3/svgui/view/View.cpp0000644000000000000000000020736613111512442016677 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "View.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "base/ZoomConstraint.h" #include "base/Profiler.h" #include "base/Pitch.h" #include "base/Preferences.h" #include "ViewProxy.h" #include "layer/TimeRulerLayer.h" #include "layer/SingleColourLayer.h" #include "layer/PaintAssistant.h" #include "data/model/PowerOfSqrtTwoZoomConstraint.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include "widgets/IconLoader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define DEBUG_VIEW 1 //#define DEBUG_VIEW_WIDGET_PAINT 1 View::View(QWidget *w, bool showProgress) : QFrame(w), m_id(getNextId()), m_centreFrame(0), m_zoomLevel(1024), m_followPan(true), m_followZoom(true), m_followPlay(PlaybackScrollPageWithCentre), m_followPlayIsDetached(false), m_playPointerFrame(0), m_showProgress(showProgress), m_cache(0), m_buffer(0), m_cacheCentreFrame(0), m_cacheZoomLevel(1024), m_selectionCached(false), m_deleting(false), m_haveSelectedLayer(false), m_manager(0), m_propertyContainer(new ViewPropertyContainer(this)) { // cerr << "View::View(" << this << ")" << endl; } View::~View() { // cerr << "View::~View(" << this << ")" << endl; m_deleting = true; delete m_propertyContainer; delete m_cache; delete m_buffer; } PropertyContainer::PropertyList View::getProperties() const { PropertyContainer::PropertyList list; list.push_back("Global Scroll"); list.push_back("Global Zoom"); list.push_back("Follow Playback"); return list; } QString View::getPropertyLabel(const PropertyName &pn) const { if (pn == "Global Scroll") return tr("Global Scroll"); if (pn == "Global Zoom") return tr("Global Zoom"); if (pn == "Follow Playback") return tr("Follow Playback"); return ""; } PropertyContainer::PropertyType View::getPropertyType(const PropertyContainer::PropertyName &name) const { if (name == "Global Scroll") return PropertyContainer::ToggleProperty; if (name == "Global Zoom") return PropertyContainer::ToggleProperty; if (name == "Follow Playback") return PropertyContainer::ValueProperty; return PropertyContainer::InvalidProperty; } int View::getPropertyRangeAndValue(const PropertyContainer::PropertyName &name, int *min, int *max, int *deflt) const { if (deflt) *deflt = 1; if (name == "Global Scroll") return m_followPan; if (name == "Global Zoom") return m_followZoom; if (name == "Follow Playback") { if (min) *min = 0; if (max) *max = 2; if (deflt) *deflt = int(PlaybackScrollPageWithCentre); switch (m_followPlay) { case PlaybackScrollContinuous: return 0; case PlaybackScrollPageWithCentre: case PlaybackScrollPage: return 1; case PlaybackIgnore: return 2; } } if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 0; return 0; } QString View::getPropertyValueLabel(const PropertyContainer::PropertyName &name, int value) const { if (name == "Follow Playback") { switch (value) { default: case 0: return tr("Scroll"); case 1: return tr("Page"); case 2: return tr("Off"); } } return tr(""); } void View::setProperty(const PropertyContainer::PropertyName &name, int value) { if (name == "Global Scroll") { setFollowGlobalPan(value != 0); } else if (name == "Global Zoom") { setFollowGlobalZoom(value != 0); } else if (name == "Follow Playback") { switch (value) { default: case 0: setPlaybackFollow(PlaybackScrollContinuous); break; case 1: setPlaybackFollow(PlaybackScrollPageWithCentre); break; case 2: setPlaybackFollow(PlaybackIgnore); break; } } } int View::getPropertyContainerCount() const { return int(m_fixedOrderLayers.size()) + 1; // the 1 is for me } const PropertyContainer * View::getPropertyContainer(int i) const { return (const PropertyContainer *)(((View *)this)-> getPropertyContainer(i)); } PropertyContainer * View::getPropertyContainer(int i) { if (i == 0) return m_propertyContainer; return m_fixedOrderLayers[i-1]; } bool View::getValueExtents(QString unit, double &min, double &max, bool &log) const { bool have = false; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { QString layerUnit; double layerMin = 0.0, layerMax = 0.0; double displayMin = 0.0, displayMax = 0.0; bool layerLog = false; if ((*i)->getValueExtents(layerMin, layerMax, layerLog, layerUnit) && layerUnit.toLower() == unit.toLower()) { if ((*i)->getDisplayExtents(displayMin, displayMax)) { min = displayMin; max = displayMax; log = layerLog; have = true; break; } else { if (!have || layerMin < min) min = layerMin; if (!have || layerMax > max) max = layerMax; if (layerLog) log = true; have = true; } } } return have; } int View::getTextLabelHeight(const Layer *layer, QPainter &paint) const { std::map sortedLayers; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->needsTextLabelHeight()) { sortedLayers[getObjectExportId(*i)] = *i; } } int y = 15 + paint.fontMetrics().ascent(); for (std::map::const_iterator i = sortedLayers.begin(); i != sortedLayers.end(); ++i) { if (i->second == layer) return y; y += paint.fontMetrics().height(); } return y; } void View::propertyContainerSelected(View *client, PropertyContainer *pc) { if (client != this) return; if (pc == m_propertyContainer) { if (m_haveSelectedLayer) { m_haveSelectedLayer = false; update(); } return; } delete m_cache; m_cache = 0; Layer *selectedLayer = 0; for (LayerList::iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if (*i == pc) { selectedLayer = *i; m_layerStack.erase(i); break; } } if (selectedLayer) { m_haveSelectedLayer = true; m_layerStack.push_back(selectedLayer); update(); } else { m_haveSelectedLayer = false; } emit propertyContainerSelected(pc); } void View::toolModeChanged() { // SVDEBUG << "View::toolModeChanged(" << m_manager->getToolMode() << ")" << endl; } void View::overlayModeChanged() { delete m_cache; m_cache = 0; update(); } void View::zoomWheelsEnabledChanged() { // subclass might override this } sv_frame_t View::getStartFrame() const { return getFrameForX(0); } sv_frame_t View::getEndFrame() const { return getFrameForX(width()) - 1; } void View::setStartFrame(sv_frame_t f) { setCentreFrame(f + m_zoomLevel * (width() / 2)); } bool View::setCentreFrame(sv_frame_t f, bool e) { bool changeVisible = false; if (m_centreFrame != f) { int formerPixel = int(m_centreFrame / m_zoomLevel); m_centreFrame = f; int newPixel = int(m_centreFrame / m_zoomLevel); if (newPixel != formerPixel) { #ifdef DEBUG_VIEW_WIDGET_PAINT cout << "View(" << this << ")::setCentreFrame: newPixel " << newPixel << ", formerPixel " << formerPixel << endl; #endif update(); changeVisible = true; } if (e) { sv_frame_t rf = alignToReference(f); #ifdef DEBUG_VIEW cerr << "View[" << this << "]::setCentreFrame(" << f << "): emitting centreFrameChanged(" << rf << ")" << endl; #endif emit centreFrameChanged(rf, m_followPan, m_followPlay); } } return changeVisible; } int View::getXForFrame(sv_frame_t frame) const { return int((frame - getStartFrame()) / m_zoomLevel); } sv_frame_t View::getFrameForX(int x) const { sv_frame_t z = m_zoomLevel; // nb not just int, or multiplication may overflow sv_frame_t frame = m_centreFrame - (width()/2) * z; frame = (frame / z) * z; // this is start frame frame = frame + x * z; #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View::getFrameForX(" << x << "): z = " << z << ", m_centreFrame = " << m_centreFrame << ", width() = " << width() << ", frame = " << frame << endl; #endif return frame; } double View::getYForFrequency(double frequency, double minf, double maxf, bool logarithmic) const { Profiler profiler("View::getYForFrequency"); int h = height(); if (logarithmic) { static double lastminf = 0.0, lastmaxf = 0.0; static double logminf = 0.0, logmaxf = 0.0; if (lastminf != minf) { lastminf = (minf == 0.0 ? 1.0 : minf); logminf = log10(minf); } if (lastmaxf != maxf) { lastmaxf = (maxf < lastminf ? lastminf : maxf); logmaxf = log10(maxf); } if (logminf == logmaxf) return 0; return h - (h * (log10(frequency) - logminf)) / (logmaxf - logminf); } else { if (minf == maxf) return 0; return h - (h * (frequency - minf)) / (maxf - minf); } } double View::getFrequencyForY(double y, double minf, double maxf, bool logarithmic) const { double h = height(); if (logarithmic) { static double lastminf = 0.0, lastmaxf = 0.0; static double logminf = 0.0, logmaxf = 0.0; if (lastminf != minf) { lastminf = (minf == 0.0 ? 1.0 : minf); logminf = log10(minf); } if (lastmaxf != maxf) { lastmaxf = (maxf < lastminf ? lastminf : maxf); logmaxf = log10(maxf); } if (logminf == logmaxf) return 0; return pow(10.0, logminf + ((logmaxf - logminf) * (h - y)) / h); } else { if (minf == maxf) return 0; return minf + ((h - y) * (maxf - minf)) / h; } } int View::getZoomLevel() const { #ifdef DEBUG_VIEW_WIDGET_PAINT // cout << "zoom level: " << m_zoomLevel << endl; #endif return m_zoomLevel; } int View::effectiveDevicePixelRatio() const { #ifdef Q_OS_MAC int dpratio = devicePixelRatio(); if (dpratio > 1) { QSettings settings; settings.beginGroup("Preferences"); if (!settings.value("scaledHiDpi", true).toBool()) { dpratio = 1; } settings.endGroup(); } return dpratio; #else return 1; #endif } void View::setZoomLevel(int z) { int dpratio = effectiveDevicePixelRatio(); if (z < dpratio) return; if (z < 1) z = 1; if (m_zoomLevel != int(z)) { m_zoomLevel = z; emit zoomLevelChanged(z, m_followZoom); update(); } } bool View::hasLightBackground() const { bool darkPalette = false; if (m_manager) darkPalette = m_manager->getGlobalDarkBackground(); Layer::ColourSignificance maxSignificance = Layer::ColourAbsent; bool mostSignificantHasDarkBackground = false; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { Layer::ColourSignificance s = (*i)->getLayerColourSignificance(); bool light = (*i)->hasLightBackground(); if (int(s) > int(maxSignificance)) { maxSignificance = s; mostSignificantHasDarkBackground = !light; } else if (s == maxSignificance && !light) { mostSignificantHasDarkBackground = true; } } if (int(maxSignificance) >= int(Layer::ColourAndBackgroundSignificant)) { return !mostSignificantHasDarkBackground; } else { return !darkPalette; } } QColor View::getBackground() const { bool light = hasLightBackground(); QColor widgetbg = palette().window().color(); bool widgetLight = (widgetbg.red() + widgetbg.green() + widgetbg.blue()) > 384; if (widgetLight == light) { if (widgetLight) { return widgetbg.light(); } else { return widgetbg.dark(); } } else if (light) return Qt::white; else return Qt::black; } QColor View::getForeground() const { bool light = hasLightBackground(); QColor widgetfg = palette().text().color(); bool widgetLight = (widgetfg.red() + widgetfg.green() + widgetfg.blue()) > 384; if (widgetLight != light) return widgetfg; else if (light) return Qt::black; else return Qt::white; } void View::addLayer(Layer *layer) { delete m_cache; m_cache = 0; SingleColourLayer *scl = dynamic_cast(layer); if (scl) scl->setDefaultColourFor(this); m_fixedOrderLayers.push_back(layer); m_layerStack.push_back(layer); QProgressBar *pb = new QProgressBar(this); pb->setMinimum(0); pb->setMaximum(0); pb->setFixedWidth(80); pb->setTextVisible(false); QPushButton *cancel = new QPushButton(this); cancel->setIcon(IconLoader().load("fileclose")); cancel->setFlat(true); cancel->setFixedSize(QSize(20, 20)); connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked())); ProgressBarRec pbr; pbr.cancel = cancel; pbr.bar = pb; pbr.lastCheck = 0; pbr.checkTimer = new QTimer(); connect(pbr.checkTimer, SIGNAL(timeout()), this, SLOT(progressCheckStalledTimerElapsed())); m_progressBars[layer] = pbr; QFont f(pb->font()); int fs = Preferences::getInstance()->getViewFontSize(); f.setPointSize(std::min(fs, int(ceil(fs * 0.85)))); cancel->hide(); pb->setFont(f); pb->hide(); connect(layer, SIGNAL(layerParametersChanged()), this, SLOT(layerParametersChanged())); connect(layer, SIGNAL(layerParameterRangesChanged()), this, SLOT(layerParameterRangesChanged())); connect(layer, SIGNAL(layerMeasurementRectsChanged()), this, SLOT(layerMeasurementRectsChanged())); connect(layer, SIGNAL(layerNameChanged()), this, SLOT(layerNameChanged())); connect(layer, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(layer, SIGNAL(modelCompletionChanged()), this, SLOT(modelCompletionChanged())); connect(layer, SIGNAL(modelAlignmentCompletionChanged()), this, SLOT(modelAlignmentCompletionChanged())); connect(layer, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); connect(layer, SIGNAL(modelReplaced()), this, SLOT(modelReplaced())); update(); emit propertyContainerAdded(layer); } void View::removeLayer(Layer *layer) { if (m_deleting) { return; } delete m_cache; m_cache = 0; for (LayerList::iterator i = m_fixedOrderLayers.begin(); i != m_fixedOrderLayers.end(); ++i) { if (*i == layer) { m_fixedOrderLayers.erase(i); break; } } for (LayerList::iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if (*i == layer) { m_layerStack.erase(i); if (m_progressBars.find(layer) != m_progressBars.end()) { delete m_progressBars[layer].bar; delete m_progressBars[layer].cancel; delete m_progressBars[layer].checkTimer; m_progressBars.erase(layer); } break; } } disconnect(layer, SIGNAL(layerParametersChanged()), this, SLOT(layerParametersChanged())); disconnect(layer, SIGNAL(layerParameterRangesChanged()), this, SLOT(layerParameterRangesChanged())); disconnect(layer, SIGNAL(layerNameChanged()), this, SLOT(layerNameChanged())); disconnect(layer, SIGNAL(modelChanged()), this, SLOT(modelChanged())); disconnect(layer, SIGNAL(modelCompletionChanged()), this, SLOT(modelCompletionChanged())); disconnect(layer, SIGNAL(modelAlignmentCompletionChanged()), this, SLOT(modelAlignmentCompletionChanged())); disconnect(layer, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); disconnect(layer, SIGNAL(modelReplaced()), this, SLOT(modelReplaced())); update(); emit propertyContainerRemoved(layer); } Layer * View::getInteractionLayer() { Layer *sl = getSelectedLayer(); if (sl && !(sl->isLayerDormant(this))) { return sl; } if (!m_layerStack.empty()) { int n = getLayerCount(); while (n > 0) { --n; Layer *layer = getLayer(n); if (!(layer->isLayerDormant(this))) { return layer; } } } return 0; } const Layer * View::getInteractionLayer() const { return const_cast(const_cast(this)->getInteractionLayer()); } Layer * View::getSelectedLayer() { if (m_haveSelectedLayer && !m_layerStack.empty()) { return getLayer(getLayerCount() - 1); } else { return 0; } } const Layer * View::getSelectedLayer() const { return const_cast(const_cast(this)->getSelectedLayer()); } void View::setViewManager(ViewManager *manager) { if (m_manager) { m_manager->disconnect(this, SLOT(globalCentreFrameChanged(sv_frame_t))); m_manager->disconnect(this, SLOT(viewCentreFrameChanged(View *, sv_frame_t))); m_manager->disconnect(this, SLOT(viewManagerPlaybackFrameChanged(sv_frame_t))); m_manager->disconnect(this, SLOT(viewZoomLevelChanged(View *, int, bool))); m_manager->disconnect(this, SLOT(toolModeChanged())); m_manager->disconnect(this, SLOT(selectionChanged())); m_manager->disconnect(this, SLOT(overlayModeChanged())); m_manager->disconnect(this, SLOT(zoomWheelsEnabledChanged())); disconnect(m_manager, SLOT(viewCentreFrameChanged(sv_frame_t, bool, PlaybackFollowMode))); disconnect(m_manager, SLOT(zoomLevelChanged(int, bool))); } m_manager = manager; connect(m_manager, SIGNAL(globalCentreFrameChanged(sv_frame_t)), this, SLOT(globalCentreFrameChanged(sv_frame_t))); connect(m_manager, SIGNAL(viewCentreFrameChanged(View *, sv_frame_t)), this, SLOT(viewCentreFrameChanged(View *, sv_frame_t))); connect(m_manager, SIGNAL(playbackFrameChanged(sv_frame_t)), this, SLOT(viewManagerPlaybackFrameChanged(sv_frame_t))); connect(m_manager, SIGNAL(viewZoomLevelChanged(View *, int, bool)), this, SLOT(viewZoomLevelChanged(View *, int, bool))); connect(m_manager, SIGNAL(toolModeChanged()), this, SLOT(toolModeChanged())); connect(m_manager, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); connect(m_manager, SIGNAL(inProgressSelectionChanged()), this, SLOT(selectionChanged())); connect(m_manager, SIGNAL(overlayModeChanged()), this, SLOT(overlayModeChanged())); connect(m_manager, SIGNAL(showCentreLineChanged()), this, SLOT(overlayModeChanged())); connect(m_manager, SIGNAL(zoomWheelsEnabledChanged()), this, SLOT(zoomWheelsEnabledChanged())); connect(this, SIGNAL(centreFrameChanged(sv_frame_t, bool, PlaybackFollowMode)), m_manager, SLOT(viewCentreFrameChanged(sv_frame_t, bool, PlaybackFollowMode))); connect(this, SIGNAL(zoomLevelChanged(int, bool)), m_manager, SLOT(viewZoomLevelChanged(int, bool))); switch (m_followPlay) { case PlaybackScrollPage: case PlaybackScrollPageWithCentre: setCentreFrame(m_manager->getGlobalCentreFrame(), false); break; case PlaybackScrollContinuous: setCentreFrame(m_manager->getPlaybackFrame(), false); break; case PlaybackIgnore: if (m_followPan) { setCentreFrame(m_manager->getGlobalCentreFrame(), false); } break; } if (m_followZoom) setZoomLevel(m_manager->getGlobalZoom()); movePlayPointer(getAlignedPlaybackFrame()); toolModeChanged(); } void View::setViewManager(ViewManager *vm, sv_frame_t initialCentreFrame) { setViewManager(vm); setCentreFrame(initialCentreFrame, false); } void View::setFollowGlobalPan(bool f) { m_followPan = f; emit propertyContainerPropertyChanged(m_propertyContainer); } void View::setFollowGlobalZoom(bool f) { m_followZoom = f; emit propertyContainerPropertyChanged(m_propertyContainer); } void View::setPlaybackFollow(PlaybackFollowMode m) { m_followPlay = m; emit propertyContainerPropertyChanged(m_propertyContainer); } void View::modelChanged() { QObject *obj = sender(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::modelChanged()" << endl; #endif // If the model that has changed is not used by any of the cached // layers, we won't need to recreate the cache bool recreate = false; bool discard; LayerList scrollables = getScrollableBackLayers(false, discard); for (LayerList::const_iterator i = scrollables.begin(); i != scrollables.end(); ++i) { if (*i == obj || (*i)->getModel() == obj) { recreate = true; break; } } if (recreate) { delete m_cache; m_cache = 0; } emit layerModelChanged(); checkProgress(obj); update(); } void View::modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame) { QObject *obj = sender(); sv_frame_t myStartFrame = getStartFrame(); sv_frame_t myEndFrame = getEndFrame(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::modelChangedWithin(" << startFrame << "," << endFrame << ") [me " << myStartFrame << "," << myEndFrame << "]" << endl; #endif if (myStartFrame > 0 && endFrame < myStartFrame) { checkProgress(obj); return; } if (startFrame > myEndFrame) { checkProgress(obj); return; } // If the model that has changed is not used by any of the cached // layers, we won't need to recreate the cache bool recreate = false; bool discard; LayerList scrollables = getScrollableBackLayers(false, discard); for (LayerList::const_iterator i = scrollables.begin(); i != scrollables.end(); ++i) { if (*i == obj || (*i)->getModel() == obj) { recreate = true; break; } } if (recreate) { delete m_cache; m_cache = 0; } if (startFrame < myStartFrame) startFrame = myStartFrame; if (endFrame > myEndFrame) endFrame = myEndFrame; checkProgress(obj); update(); } void View::modelCompletionChanged() { // cerr << "View(" << this << ")::modelCompletionChanged()" << endl; QObject *obj = sender(); checkProgress(obj); } void View::modelAlignmentCompletionChanged() { // cerr << "View(" << this << ")::modelAlignmentCompletionChanged()" << endl; QObject *obj = sender(); checkProgress(obj); } void View::modelReplaced() { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::modelReplaced()" << endl; #endif delete m_cache; m_cache = 0; update(); } void View::layerParametersChanged() { Layer *layer = dynamic_cast(sender()); #ifdef DEBUG_VIEW_WIDGET_PAINT SVDEBUG << "View::layerParametersChanged()" << endl; #endif delete m_cache; m_cache = 0; update(); if (layer) { emit propertyContainerPropertyChanged(layer); } } void View::layerParameterRangesChanged() { Layer *layer = dynamic_cast(sender()); if (layer) emit propertyContainerPropertyRangeChanged(layer); } void View::layerMeasurementRectsChanged() { Layer *layer = dynamic_cast(sender()); if (layer) update(); } void View::layerNameChanged() { Layer *layer = dynamic_cast(sender()); if (layer) emit propertyContainerNameChanged(layer); } void View::globalCentreFrameChanged(sv_frame_t rf) { if (m_followPan) { sv_frame_t f = alignFromReference(rf); #ifdef DEBUG_VIEW cerr << "View[" << this << "]::globalCentreFrameChanged(" << rf << "): setting centre frame to " << f << endl; #endif setCentreFrame(f, false); } } void View::viewCentreFrameChanged(View *, sv_frame_t ) { // We do nothing with this, but a subclass might } void View::viewManagerPlaybackFrameChanged(sv_frame_t f) { if (m_manager) { if (sender() != m_manager) return; } #ifdef DEBUG_VIEW cerr << "View::viewManagerPlaybackFrameChanged(" << f << ")" << endl; #endif f = getAlignedPlaybackFrame(); #ifdef DEBUG_VIEW cerr << " -> aligned frame = " << f << endl; #endif movePlayPointer(f); } void View::movePlayPointer(sv_frame_t newFrame) { #ifdef DEBUG_VIEW cerr << "View(" << this << ")::movePlayPointer(" << newFrame << ")" << endl; #endif if (m_playPointerFrame == newFrame) return; bool visibleChange = (getXForFrame(m_playPointerFrame) != getXForFrame(newFrame)); sv_frame_t oldPlayPointerFrame = m_playPointerFrame; m_playPointerFrame = newFrame; if (!visibleChange) return; bool somethingGoingOn = ((QApplication::mouseButtons() != Qt::NoButton) || (QApplication::keyboardModifiers() & Qt::AltModifier)); bool pointerInVisibleArea = long(m_playPointerFrame) >= getStartFrame() && (m_playPointerFrame < getEndFrame() || // include old pointer location so we know to refresh when moving out oldPlayPointerFrame < getEndFrame()); switch (m_followPlay) { case PlaybackScrollContinuous: if (!somethingGoingOn) { setCentreFrame(m_playPointerFrame, false); } break; case PlaybackScrollPage: case PlaybackScrollPageWithCentre: if (!pointerInVisibleArea && somethingGoingOn) { m_followPlayIsDetached = true; } else if (!pointerInVisibleArea && m_followPlayIsDetached) { // do nothing; we aren't tracking until the pointer comes back in } else { int xold = getXForFrame(oldPlayPointerFrame); update(xold - 4, 0, 9, height()); sv_frame_t w = getEndFrame() - getStartFrame(); w -= w/5; sv_frame_t sf = (m_playPointerFrame / w) * w - w/8; if (m_manager && m_manager->isPlaying() && m_manager->getPlaySelectionMode()) { MultiSelection::SelectionList selections = m_manager->getSelections(); if (!selections.empty()) { sv_frame_t selectionStart = selections.begin()->getStartFrame(); if (sf < selectionStart - w / 10) { sf = selectionStart - w / 10; } } } #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "PlaybackScrollPage: f = " << m_playPointerFrame << ", sf = " << sf << ", start frame " << getStartFrame() << endl; #endif // We don't consider scrolling unless the pointer is outside // the central visible range already int xnew = getXForFrame(m_playPointerFrame); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "xnew = " << xnew << ", width = " << width() << endl; #endif bool shouldScroll = (xnew > (width() * 7) / 8); if (!m_followPlayIsDetached && (xnew < width() / 8)) { shouldScroll = true; } if (xnew > width() / 8) { m_followPlayIsDetached = false; } else if (somethingGoingOn) { m_followPlayIsDetached = true; } if (!somethingGoingOn && shouldScroll) { sv_frame_t offset = getFrameForX(width()/2) - getStartFrame(); sv_frame_t newCentre = sf + offset; bool changed = setCentreFrame(newCentre, false); if (changed) { xold = getXForFrame(oldPlayPointerFrame); update(xold - 4, 0, 9, height()); } } update(xnew - 4, 0, 9, height()); } break; case PlaybackIgnore: if (m_playPointerFrame >= getStartFrame() && m_playPointerFrame < getEndFrame()) { update(); } break; } } void View::viewZoomLevelChanged(View *p, int z, bool locked) { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View[" << this << "]: viewZoomLevelChanged(" << p << ", " << z << ", " << locked << ")" << endl; #endif if (m_followZoom && p != this && locked) { setZoomLevel(z); } } void View::selectionChanged() { if (m_selectionCached) { delete m_cache; m_cache = 0; m_selectionCached = false; } update(); } sv_frame_t View::getFirstVisibleFrame() const { sv_frame_t f0 = getStartFrame(); sv_frame_t f = getModelsStartFrame(); if (f0 < 0 || f0 < f) return f; return f0; } sv_frame_t View::getLastVisibleFrame() const { sv_frame_t f0 = getEndFrame(); sv_frame_t f = getModelsEndFrame(); if (f0 > f) return f; return f0; } sv_frame_t View::getModelsStartFrame() const { bool first = true; sv_frame_t startFrame = 0; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getModel() && (*i)->getModel()->isOK()) { sv_frame_t thisStartFrame = (*i)->getModel()->getStartFrame(); if (first || thisStartFrame < startFrame) { startFrame = thisStartFrame; } first = false; } } return startFrame; } sv_frame_t View::getModelsEndFrame() const { bool first = true; sv_frame_t endFrame = 0; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getModel() && (*i)->getModel()->isOK()) { sv_frame_t thisEndFrame = (*i)->getModel()->getEndFrame(); if (first || thisEndFrame > endFrame) { endFrame = thisEndFrame; } first = false; } } if (first) return getModelsStartFrame(); return endFrame; } sv_samplerate_t View::getModelsSampleRate() const { //!!! Just go for the first, for now. If we were supporting // multiple samplerates, we'd probably want to do frame/time // conversion in the model //!!! nah, this wants to always return the sr of the main model! for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getModel() && (*i)->getModel()->isOK()) { return (*i)->getModel()->getSampleRate(); } } return 0; } View::ModelSet View::getModels() { ModelSet models; for (int i = 0; i < getLayerCount(); ++i) { Layer *layer = getLayer(i); if (dynamic_cast(layer)) { continue; } if (layer && layer->getModel()) { Model *model = layer->getModel(); models.insert(model); } } return models; } Model * View::getAligningModel() const { if (!m_manager || !m_manager->getAlignMode() || !m_manager->getPlaybackModel()) { return 0; } Model *anyModel = 0; Model *alignedModel = 0; Model *goodModel = 0; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { Layer *layer = *i; if (!layer) continue; if (dynamic_cast(layer)) continue; Model *model = (*i)->getModel(); if (!model) continue; anyModel = model; if (model->getAlignmentReference()) { alignedModel = model; if (layer->isLayerOpaque() || dynamic_cast(model)) { goodModel = model; } } } if (goodModel) return goodModel; else if (alignedModel) return alignedModel; else return anyModel; } sv_frame_t View::alignFromReference(sv_frame_t f) const { if (!m_manager || !m_manager->getAlignMode()) return f; Model *aligningModel = getAligningModel(); if (!aligningModel) return f; return aligningModel->alignFromReference(f); } sv_frame_t View::alignToReference(sv_frame_t f) const { if (!m_manager->getAlignMode()) return f; Model *aligningModel = getAligningModel(); if (!aligningModel) return f; return aligningModel->alignToReference(f); } sv_frame_t View::getAlignedPlaybackFrame() const { if (!m_manager) return 0; sv_frame_t pf = m_manager->getPlaybackFrame(); if (!m_manager->getAlignMode()) return pf; Model *aligningModel = getAligningModel(); if (!aligningModel) return pf; sv_frame_t af = aligningModel->alignFromReference(pf); return af; } bool View::areLayersScrollable() const { // True iff all views are scrollable for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if (!(*i)->isLayerScrollable(this)) return false; } return true; } View::LayerList View::getScrollableBackLayers(bool testChanged, bool &changed) const { changed = false; // We want a list of all the scrollable layers that are behind the // backmost non-scrollable layer. LayerList scrollables; bool metUnscrollable = false; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { // SVDEBUG << "View::getScrollableBackLayers: calling isLayerDormant on layer " << *i << endl; // cerr << "(name is " << (*i)->objectName() << ")" // << endl; // SVDEBUG << "View::getScrollableBackLayers: I am " << this << endl; if ((*i)->isLayerDormant(this)) continue; if ((*i)->isLayerOpaque()) { // You can't see anything behind an opaque layer! scrollables.clear(); if (metUnscrollable) break; } if (!metUnscrollable && (*i)->isLayerScrollable(this)) { scrollables.push_back(*i); } else { metUnscrollable = true; } } if (testChanged && scrollables != m_lastScrollableBackLayers) { m_lastScrollableBackLayers = scrollables; changed = true; } return scrollables; } View::LayerList View::getNonScrollableFrontLayers(bool testChanged, bool &changed) const { changed = false; LayerList nonScrollables; // Everything in front of the first non-scrollable from the back // should also be considered non-scrollable bool started = false; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->isLayerDormant(this)) continue; if (!started && (*i)->isLayerScrollable(this)) { continue; } started = true; if ((*i)->isLayerOpaque()) { // You can't see anything behind an opaque layer! nonScrollables.clear(); } nonScrollables.push_back(*i); } if (testChanged && nonScrollables != m_lastNonScrollableBackLayers) { m_lastNonScrollableBackLayers = nonScrollables; changed = true; } return nonScrollables; } int View::getZoomConstraintBlockSize(int blockSize, ZoomConstraint::RoundingDirection dir) const { int candidate = blockSize; bool haveCandidate = false; PowerOfSqrtTwoZoomConstraint defaultZoomConstraint; for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { const ZoomConstraint *zoomConstraint = (*i)->getZoomConstraint(); if (!zoomConstraint) zoomConstraint = &defaultZoomConstraint; int thisBlockSize = zoomConstraint->getNearestBlockSize(blockSize, dir); // Go for the block size that's furthest from the one // passed in. Most of the time, that's what we want. if (!haveCandidate || (thisBlockSize > blockSize && thisBlockSize > candidate) || (thisBlockSize < blockSize && thisBlockSize < candidate)) { candidate = thisBlockSize; haveCandidate = true; } } return candidate; } bool View::areLayerColoursSignificant() const { for (LayerList::const_iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if ((*i)->getLayerColourSignificance() == Layer::ColourHasMeaningfulValue) return true; if ((*i)->isLayerOpaque()) break; } return false; } bool View::hasTopLayerTimeXAxis() const { LayerList::const_iterator i = m_layerStack.end(); if (i == m_layerStack.begin()) return false; --i; return (*i)->hasTimeXAxis(); } void View::zoom(bool in) { int newZoomLevel = m_zoomLevel; if (in) { newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1, ZoomConstraint::RoundDown); } else { newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1, ZoomConstraint::RoundUp); } if (newZoomLevel != m_zoomLevel) { setZoomLevel(newZoomLevel); } } void View::scroll(bool right, bool lots, bool e) { sv_frame_t delta; if (lots) { delta = (getEndFrame() - getStartFrame()) / 2; } else { delta = (getEndFrame() - getStartFrame()) / 20; } if (right) delta = -delta; if (m_centreFrame < delta) { setCentreFrame(0, e); } else if (m_centreFrame - delta >= getModelsEndFrame()) { setCentreFrame(getModelsEndFrame(), e); } else { setCentreFrame(m_centreFrame - delta, e); } } void View::cancelClicked() { QPushButton *cancel = qobject_cast(sender()); if (!cancel) return; for (ProgressMap::iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { if (i->second.cancel == cancel) { Layer *layer = i->first; Model *model = layer->getModel(); if (model) model->abandon(); } } } void View::checkProgress(void *object) { if (!m_showProgress) return; int ph = height(); for (ProgressMap::iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { QProgressBar *pb = i->second.bar; QPushButton *cancel = i->second.cancel; if (i->first == object) { // The timer is used to test for stalls. If the progress // bar does not get updated for some length of time, the // timer prompts it to go back into "indeterminate" mode QTimer *timer = i->second.checkTimer; int completion = i->first->getCompletion(this); QString text = i->first->getPropertyContainerName(); QString error = i->first->getError(this); if (error != "" && error != m_lastError) { QMessageBox::critical(this, tr("Layer rendering error"), error); m_lastError = error; } Model *model = i->first->getModel(); RangeSummarisableTimeValueModel *wfm = dynamic_cast(model); if (completion > 0) { pb->setMaximum(100); // was 0, for indeterminate start } if (completion >= 100) { //!!! if (wfm || (model && (wfm = dynamic_cast (model->getSourceModel())))) { completion = wfm->getAlignmentCompletion(); // SVDEBUG << "View::checkProgress: Alignment completion = " << completion << endl; if (completion < 100) { text = tr("Alignment"); } } } else if (wfm) { update(); // ensure duration &c gets updated } if (completion >= 100) { pb->hide(); cancel->hide(); timer->stop(); } else { // cerr << "progress = " << completion << endl; if (!pb->isVisible()) { i->second.lastCheck = 0; timer->setInterval(2000); timer->start(); } cancel->move(0, ph - pb->height()/2 - 10); cancel->show(); pb->setValue(completion); pb->move(20, ph - pb->height()); pb->show(); pb->update(); ph -= pb->height(); } } else { if (pb->isVisible()) { ph -= pb->height(); } } } } void View::progressCheckStalledTimerElapsed() { QObject *s = sender(); QTimer *t = qobject_cast(s); if (!t) return; for (ProgressMap::iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { if (i->second.checkTimer == t) { int value = i->second.bar->value(); if (value > 0 && value == i->second.lastCheck) { i->second.bar->setMaximum(0); // indeterminate } i->second.lastCheck = value; return; } } } int View::getProgressBarWidth() const { for (ProgressMap::const_iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { if (i->second.bar && i->second.bar->isVisible()) { return i->second.bar->width(); } } return 0; } void View::setPaintFont(QPainter &paint) { int scaleFactor = 1; int dpratio = effectiveDevicePixelRatio(); if (dpratio > 1) { QPaintDevice *dev = paint.device(); if (dynamic_cast(dev) || dynamic_cast(dev)) { scaleFactor = dpratio; } } QFont font(paint.font()); font.setPointSize(Preferences::getInstance()->getViewFontSize() * scaleFactor); paint.setFont(font); } QRect View::getPaintRect() const { return rect(); } void View::paintEvent(QPaintEvent *e) { // Profiler prof("View::paintEvent", false); // cerr << "View::paintEvent: centre frame is " << m_centreFrame << endl; if (m_layerStack.empty()) { QFrame::paintEvent(e); return; } // ensure our constraints are met /*!!! Should we do this only if we have layers that can't support other zoom levels? m_zoomLevel = getZoomConstraintBlockSize(m_zoomLevel, ZoomConstraint::RoundUp); */ QPainter paint; bool repaintCache = false; bool paintedCacheRect = false; QRect cacheRect(rect()); if (e) { cacheRect &= e->rect(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "paint rect " << cacheRect.width() << "x" << cacheRect.height() << ", my rect " << width() << "x" << height() << endl; #endif } QRect nonCacheRect(cacheRect); int dpratio = effectiveDevicePixelRatio(); // If not all layers are scrollable, but some of the back layers // are, we should store only those in the cache. bool layersChanged = false; LayerList scrollables = getScrollableBackLayers(true, layersChanged); LayerList nonScrollables = getNonScrollableFrontLayers(true, layersChanged); bool selectionCacheable = nonScrollables.empty(); bool haveSelections = m_manager && !m_manager->getSelections().empty(); // If all the non-scrollable layers are non-opaque, then we draw // the selection rectangle behind them and cache it. If any are // opaque, however, or if our device-pixel ratio is not 1 (so we // need to paint direct to the widget), then we can't cache. // if (dpratio == 1) { if (!selectionCacheable) { selectionCacheable = true; for (LayerList::const_iterator i = nonScrollables.begin(); i != nonScrollables.end(); ++i) { if ((*i)->isLayerOpaque()) { selectionCacheable = false; break; } } } if (selectionCacheable) { QPoint localPos; bool closeToLeft, closeToRight; if (shouldIlluminateLocalSelection (localPos, closeToLeft, closeToRight)) { selectionCacheable = false; } } } else { selectionCacheable = false; } #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: have " << scrollables.size() << " scrollable back layers and " << nonScrollables.size() << " non-scrollable front layers" << endl; cerr << "haveSelections " << haveSelections << ", selectionCacheable " << selectionCacheable << ", m_selectionCached " << m_selectionCached << endl; #endif if (layersChanged || scrollables.empty() || (haveSelections && (selectionCacheable != m_selectionCached))) { delete m_cache; m_cache = 0; m_selectionCached = false; } QSize scaledCacheSize(scaledSize(size(), dpratio)); QRect scaledCacheRect(scaledRect(cacheRect, dpratio)); if (!m_buffer || scaledCacheSize != m_buffer->size()) { delete m_buffer; m_buffer = new QPixmap(scaledCacheSize); } if (!scrollables.empty()) { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << "): cache " << m_cache << ", cache zoom " << m_cacheZoomLevel << ", zoom " << m_zoomLevel << endl; #endif if (!m_cache || m_cacheZoomLevel != m_zoomLevel || scaledCacheSize != m_cache->size()) { // cache is not valid if (cacheRect.width() < width()/10) { delete m_cache; m_cache = 0; #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: small repaint, not bothering to recreate cache" << endl; #endif } else { delete m_cache; m_cache = new QPixmap(scaledCacheSize); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: recreated cache" << endl; #endif cacheRect = rect(); repaintCache = true; } } else if (m_cacheCentreFrame != m_centreFrame) { int dx = getXForFrame(m_cacheCentreFrame) - getXForFrame(m_centreFrame); if (dx > -width() && dx < width()) { static QPixmap *tmpPixmap = 0; if (!tmpPixmap || tmpPixmap->size() != scaledCacheSize) { delete tmpPixmap; tmpPixmap = new QPixmap(scaledCacheSize); } paint.begin(tmpPixmap); paint.drawPixmap(0, 0, *m_cache); paint.end(); paint.begin(m_cache); paint.drawPixmap(dx, 0, *tmpPixmap); paint.end(); if (dx < 0) { cacheRect = QRect(width() + dx, 0, -dx, height()); } else { cacheRect = QRect(0, 0, dx, height()); } #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: scrolled cache by " << dx << endl; #endif } else { cacheRect = rect(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: scrolling too far" << endl; #endif } repaintCache = true; } else { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: cache is good" << endl; #endif paint.begin(m_buffer); paint.drawPixmap(scaledCacheRect, *m_cache, scaledCacheRect); paint.end(); QFrame::paintEvent(e); paintedCacheRect = true; } m_cacheCentreFrame = m_centreFrame; m_cacheZoomLevel = m_zoomLevel; } #ifdef DEBUG_VIEW_WIDGET_PAINT // cerr << "View(" << this << ")::paintEvent: cacheRect " << cacheRect << ", nonCacheRect " << (nonCacheRect | cacheRect) << ", repaintCache " << repaintCache << ", paintedCacheRect " << paintedCacheRect << endl; #endif // Scrollable (cacheable) items first ViewProxy proxy(this, dpratio); if (!paintedCacheRect) { QRect rectToPaint; if (repaintCache) { paint.begin(m_cache); rectToPaint = scaledCacheRect; } else { paint.begin(m_buffer); rectToPaint = scaledCacheRect; } setPaintFont(paint); paint.setClipRect(rectToPaint); paint.setPen(getBackground()); paint.setBrush(getBackground()); paint.drawRect(rectToPaint); paint.setPen(getForeground()); paint.setBrush(Qt::NoBrush); for (LayerList::iterator i = scrollables.begin(); i != scrollables.end(); ++i) { paint.setRenderHint(QPainter::Antialiasing, false); paint.save(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "Painting scrollable layer " << *i << " using proxy with repaintCache = " << repaintCache << ", dpratio = " << dpratio << ", rectToPaint = " << rectToPaint.x() << "," << rectToPaint.y() << " " << rectToPaint.width() << "x" << rectToPaint.height() << endl; #endif (*i)->paint(&proxy, paint, rectToPaint); paint.restore(); } if (haveSelections && selectionCacheable) { drawSelections(paint); m_selectionCached = repaintCache; } paint.end(); if (repaintCache) { cacheRect |= (e ? e->rect() : rect()); scaledCacheRect = scaledRect(cacheRect, dpratio); paint.begin(m_buffer); paint.drawPixmap(scaledCacheRect, *m_cache, scaledCacheRect); paint.end(); } } // Now non-cacheable items. We always need to redraw the // non-cacheable items across at least the area we drew of the // cacheable items. nonCacheRect |= cacheRect; QRect scaledNonCacheRect = scaledRect(nonCacheRect, dpratio); paint.begin(m_buffer); paint.setClipRect(scaledNonCacheRect); setPaintFont(paint); if (scrollables.empty()) { paint.setPen(getBackground()); paint.setBrush(getBackground()); paint.drawRect(scaledNonCacheRect); } paint.setPen(getForeground()); paint.setBrush(Qt::NoBrush); for (LayerList::iterator i = nonScrollables.begin(); i != nonScrollables.end(); ++i) { // Profiler profiler2("View::paintEvent non-cacheable"); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "Painting non-scrollable layer " << *i << " without proxy with repaintCache = " << repaintCache << ", dpratio = " << dpratio << ", rectToPaint = " << nonCacheRect.x() << "," << nonCacheRect.y() << " " << nonCacheRect.width() << "x" << nonCacheRect.height() << endl; #endif (*i)->paint(&proxy, paint, scaledNonCacheRect); } paint.end(); paint.begin(this); QRect finalPaintRect = e ? e->rect() : rect(); paint.drawPixmap(finalPaintRect, *m_buffer, scaledRect(finalPaintRect, dpratio)); paint.end(); paint.begin(this); setPaintFont(paint); if (e) paint.setClipRect(e->rect()); if (!m_selectionCached) { drawSelections(paint); } paint.end(); bool showPlayPointer = true; if (m_followPlay == PlaybackScrollContinuous) { showPlayPointer = false; } else if (m_playPointerFrame <= getStartFrame() || m_playPointerFrame >= getEndFrame()) { showPlayPointer = false; } else if (m_manager && !m_manager->isPlaying()) { if (m_playPointerFrame == getCentreFrame() && m_manager->shouldShowCentreLine() && m_followPlay != PlaybackIgnore) { // Don't show the play pointer when it is redundant with // the centre line showPlayPointer = false; } } if (showPlayPointer) { paint.begin(this); int playx = getXForFrame(m_playPointerFrame); paint.setPen(getForeground()); paint.drawLine(playx - 1, 0, playx - 1, height() - 1); paint.drawLine(playx + 1, 0, playx + 1, height() - 1); paint.drawPoint(playx, 0); paint.drawPoint(playx, height() - 1); paint.setPen(getBackground()); paint.drawLine(playx, 1, playx, height() - 2); paint.end(); } QFrame::paintEvent(e); } void View::drawSelections(QPainter &paint) { if (!hasTopLayerTimeXAxis()) return; MultiSelection::SelectionList selections; if (m_manager) { selections = m_manager->getSelections(); if (m_manager->haveInProgressSelection()) { bool exclusive; Selection inProgressSelection = m_manager->getInProgressSelection(exclusive); if (exclusive) selections.clear(); selections.insert(inProgressSelection); } } paint.save(); bool translucent = !areLayerColoursSignificant(); if (translucent) { paint.setBrush(QColor(150, 150, 255, 80)); } else { paint.setBrush(Qt::NoBrush); } sv_samplerate_t sampleRate = getModelsSampleRate(); QPoint localPos; sv_frame_t illuminateFrame = -1; bool closeToLeft, closeToRight; if (shouldIlluminateLocalSelection(localPos, closeToLeft, closeToRight)) { illuminateFrame = getFrameForX(localPos.x()); } const QFontMetrics &metrics = paint.fontMetrics(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { int p0 = getXForFrame(alignFromReference(i->getStartFrame())); int p1 = getXForFrame(alignFromReference(i->getEndFrame())); if (p1 < 0 || p0 > width()) continue; #ifdef DEBUG_VIEW_WIDGET_PAINT SVDEBUG << "View::drawSelections: " << p0 << ",-1 [" << (p1-p0) << "x" << (height()+1) << "]" << endl; #endif bool illuminateThis = (illuminateFrame >= 0 && i->contains(illuminateFrame)); paint.setPen(QColor(150, 150, 255)); if (translucent && shouldLabelSelections()) { paint.drawRect(p0, -1, p1 - p0, height() + 1); } else { // Make the top & bottom lines of the box visible if we // are lacking some of the other visual cues. There's no // particular logic to this, it's just a question of what // I happen to think looks nice. paint.drawRect(p0, 0, p1 - p0, height() - 1); } if (illuminateThis) { paint.save(); paint.setPen(QPen(getForeground(), 2)); if (closeToLeft) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p0, 0, p0, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else if (closeToRight) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p1, 0, p1, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else { paint.setBrush(Qt::NoBrush); paint.drawRect(p0, 1, p1 - p0, height() - 2); } paint.restore(); } if (sampleRate && shouldLabelSelections() && m_manager && m_manager->shouldShowSelectionExtents()) { QString startText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime (i->getStartFrame(), sampleRate).toText(true))) .arg(i->getStartFrame()); QString endText = QString(" %1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime (i->getEndFrame(), sampleRate).toText(true))) .arg(i->getEndFrame()); QString durationText = QString("(%1 / %2) ") .arg(QString::fromStdString (RealTime::frame2RealTime (i->getEndFrame() - i->getStartFrame(), sampleRate) .toText(true))) .arg(i->getEndFrame() - i->getStartFrame()); int sw = metrics.width(startText), ew = metrics.width(endText), dw = metrics.width(durationText); int sy = metrics.ascent() + metrics.height() + 4; int ey = sy; int dy = sy + metrics.height(); int sx = p0 + 2; int ex = sx; int dx = sx; bool durationBothEnds = true; if (sw + ew > (p1 - p0)) { ey += metrics.height(); dy += metrics.height(); durationBothEnds = false; } if (ew < (p1 - p0)) { ex = p1 - 2 - ew; } if (dw < (p1 - p0)) { dx = p1 - 2 - dw; } PaintAssistant::drawVisibleText(this, paint, sx, sy, startText, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(this, paint, ex, ey, endText, PaintAssistant::OutlinedText); PaintAssistant::drawVisibleText(this, paint, dx, dy, durationText, PaintAssistant::OutlinedText); if (durationBothEnds) { PaintAssistant::drawVisibleText(this, paint, sx, dy, durationText, PaintAssistant::OutlinedText); } } } paint.restore(); } void View::drawMeasurementRect(QPainter &paint, const Layer *topLayer, QRect r, bool focus) const { // SVDEBUG << "View::drawMeasurementRect(" << r.x() << "," << r.y() << " " // << r.width() << "x" << r.height() << ")" << endl; if (r.x() + r.width() < 0 || r.x() >= width()) return; if (r.width() != 0 || r.height() != 0) { paint.save(); if (focus) { paint.setPen(Qt::NoPen); QColor brushColour(Qt::black); brushColour.setAlpha(hasLightBackground() ? 15 : 40); paint.setBrush(brushColour); if (r.x() > 0) { paint.drawRect(0, 0, r.x(), height()); } if (r.x() + r.width() < width()) { paint.drawRect(r.x() + r.width(), 0, width()-r.x()-r.width(), height()); } if (r.y() > 0) { paint.drawRect(r.x(), 0, r.width(), r.y()); } if (r.y() + r.height() < height()) { paint.drawRect(r.x(), r.y() + r.height(), r.width(), height()-r.y()-r.height()); } paint.setBrush(Qt::NoBrush); } paint.setPen(Qt::green); paint.drawRect(r); paint.restore(); } else { paint.save(); paint.setPen(Qt::green); paint.drawPoint(r.x(), r.y()); paint.restore(); } if (!focus) return; paint.save(); QFont fn = paint.font(); if (fn.pointSize() > 8) { fn.setPointSize(fn.pointSize() - 1); paint.setFont(fn); } int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); double v0, v1; QString u0, u1; bool b0 = false, b1 = false; QString axs, ays, bxs, bys, dxs, dys; int axx, axy, bxx, bxy, dxx, dxy; int aw = 0, bw = 0, dw = 0; int labelCount = 0; // top-left point, x-coord if ((b0 = topLayer->getXScaleValue(this, r.x(), v0, u0))) { axs = QString("%1 %2").arg(v0).arg(u0); if (u0 == "Hz" && Pitch::isFrequencyInMidiRange(v0)) { axs = QString("%1 (%2)").arg(axs) .arg(Pitch::getPitchLabelForFrequency(v0)); } aw = paint.fontMetrics().width(axs); ++labelCount; } // bottom-right point, x-coord if (r.width() > 0) { if ((b1 = topLayer->getXScaleValue(this, r.x() + r.width(), v1, u1))) { bxs = QString("%1 %2").arg(v1).arg(u1); if (u1 == "Hz" && Pitch::isFrequencyInMidiRange(v1)) { bxs = QString("%1 (%2)").arg(bxs) .arg(Pitch::getPitchLabelForFrequency(v1)); } bw = paint.fontMetrics().width(bxs); } } // dimension, width if (b0 && b1 && v1 != v0 && u0 == u1) { dxs = QString("[%1 %2]").arg(fabs(v1 - v0)).arg(u1); dw = paint.fontMetrics().width(dxs); } b0 = false; b1 = false; // top-left point, y-coord if ((b0 = topLayer->getYScaleValue(this, r.y(), v0, u0))) { ays = QString("%1 %2").arg(v0).arg(u0); if (u0 == "Hz" && Pitch::isFrequencyInMidiRange(v0)) { ays = QString("%1 (%2)").arg(ays) .arg(Pitch::getPitchLabelForFrequency(v0)); } aw = std::max(aw, paint.fontMetrics().width(ays)); ++labelCount; } // bottom-right point, y-coord if (r.height() > 0) { if ((b1 = topLayer->getYScaleValue(this, r.y() + r.height(), v1, u1))) { bys = QString("%1 %2").arg(v1).arg(u1); if (u1 == "Hz" && Pitch::isFrequencyInMidiRange(v1)) { bys = QString("%1 (%2)").arg(bys) .arg(Pitch::getPitchLabelForFrequency(v1)); } bw = std::max(bw, paint.fontMetrics().width(bys)); } } bool bd = false; double dy = 0.f; QString du; // dimension, height if ((bd = topLayer->getYScaleDifference(this, r.y(), r.y() + r.height(), dy, du)) && dy != 0) { if (du != "") { if (du == "Hz") { int semis; double cents; semis = Pitch::getPitchForFrequencyDifference(v0, v1, ¢s); dys = QString("[%1 %2 (%3)]") .arg(dy).arg(du) .arg(Pitch::getLabelForPitchRange(semis, cents)); } else { dys = QString("[%1 %2]").arg(dy).arg(du); } } else { dys = QString("[%1]").arg(dy); } dw = std::max(dw, paint.fontMetrics().width(dys)); } int mw = r.width(); int mh = r.height(); bool edgeLabelsInside = false; bool sizeLabelsInside = false; if (mw < std::max(aw, std::max(bw, dw)) + 4) { // defaults stand } else if (mw < aw + bw + 4) { if (mh > fontHeight * labelCount * 3 + 4) { edgeLabelsInside = true; sizeLabelsInside = true; } else if (mh > fontHeight * labelCount * 2 + 4) { edgeLabelsInside = true; } } else if (mw < aw + bw + dw + 4) { if (mh > fontHeight * labelCount * 3 + 4) { edgeLabelsInside = true; sizeLabelsInside = true; } else if (mh > fontHeight * labelCount + 4) { edgeLabelsInside = true; } } else { if (mh > fontHeight * labelCount + 4) { edgeLabelsInside = true; sizeLabelsInside = true; } } if (edgeLabelsInside) { axx = r.x() + 2; axy = r.y() + fontAscent + 2; bxx = r.x() + r.width() - bw - 2; bxy = r.y() + r.height() - (labelCount-1) * fontHeight - 2; } else { axx = r.x() - aw - 2; axy = r.y() + fontAscent; bxx = r.x() + r.width() + 2; bxy = r.y() + r.height() - (labelCount-1) * fontHeight; } dxx = r.width()/2 + r.x() - dw/2; if (sizeLabelsInside) { dxy = r.height()/2 + r.y() - (labelCount * fontHeight)/2 + fontAscent; } else { dxy = r.y() + r.height() + fontAscent + 2; } if (axs != "") { PaintAssistant::drawVisibleText(this, paint, axx, axy, axs, PaintAssistant::OutlinedText); axy += fontHeight; } if (ays != "") { PaintAssistant::drawVisibleText(this, paint, axx, axy, ays, PaintAssistant::OutlinedText); axy += fontHeight; } if (bxs != "") { PaintAssistant::drawVisibleText(this, paint, bxx, bxy, bxs, PaintAssistant::OutlinedText); bxy += fontHeight; } if (bys != "") { PaintAssistant::drawVisibleText(this, paint, bxx, bxy, bys, PaintAssistant::OutlinedText); bxy += fontHeight; } if (dxs != "") { PaintAssistant::drawVisibleText(this, paint, dxx, dxy, dxs, PaintAssistant::OutlinedText); dxy += fontHeight; } if (dys != "") { PaintAssistant::drawVisibleText(this, paint, dxx, dxy, dys, PaintAssistant::OutlinedText); dxy += fontHeight; } paint.restore(); } bool View::render(QPainter &paint, int xorigin, sv_frame_t f0, sv_frame_t f1) { int x0 = int(f0 / m_zoomLevel); int x1 = int(f1 / m_zoomLevel); int w = x1 - x0; sv_frame_t origCentreFrame = m_centreFrame; bool someLayersIncomplete = false; for (LayerList::iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { int c = (*i)->getCompletion(this); if (c < 100) { someLayersIncomplete = true; break; } } if (someLayersIncomplete) { QProgressDialog progress(tr("Waiting for layers to be ready..."), tr("Cancel"), 0, 100, this); int layerCompletion = 0; while (layerCompletion < 100) { for (LayerList::iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { int c = (*i)->getCompletion(this); if (i == m_layerStack.begin() || c < layerCompletion) { layerCompletion = c; } } if (layerCompletion >= 100) break; progress.setValue(layerCompletion); qApp->processEvents(); if (progress.wasCanceled()) { update(); return false; } usleep(50000); } } QProgressDialog progress(tr("Rendering image..."), tr("Cancel"), 0, w / width(), this); for (int x = 0; x < w; x += width()) { progress.setValue(x / width()); qApp->processEvents(); if (progress.wasCanceled()) { m_centreFrame = origCentreFrame; update(); return false; } m_centreFrame = f0 + (x + width()/2) * m_zoomLevel; QRect chunk(0, 0, width(), height()); paint.setPen(getBackground()); paint.setBrush(getBackground()); paint.drawRect(QRect(xorigin + x, 0, width(), height())); paint.setPen(getForeground()); paint.setBrush(Qt::NoBrush); for (LayerList::iterator i = m_layerStack.begin(); i != m_layerStack.end(); ++i) { if (!((*i)->isLayerDormant(this))){ paint.setRenderHint(QPainter::Antialiasing, false); paint.save(); paint.translate(xorigin + x, 0); cerr << "Centre frame now: " << m_centreFrame << " drawing to " << chunk.x() + x + xorigin << ", " << chunk.width() << endl; (*i)->setSynchronousPainting(true); (*i)->paint(this, paint, chunk); (*i)->setSynchronousPainting(false); paint.restore(); } } } m_centreFrame = origCentreFrame; update(); return true; } QImage * View::renderToNewImage() { sv_frame_t f0 = getModelsStartFrame(); sv_frame_t f1 = getModelsEndFrame(); return renderPartToNewImage(f0, f1); } QImage * View::renderPartToNewImage(sv_frame_t f0, sv_frame_t f1) { int x0 = int(f0 / getZoomLevel()); int x1 = int(f1 / getZoomLevel()); QImage *image = new QImage(x1 - x0, height(), QImage::Format_RGB32); QPainter *paint = new QPainter(image); if (!render(*paint, 0, f0, f1)) { delete paint; delete image; return 0; } else { delete paint; return image; } } QSize View::getRenderedImageSize() { sv_frame_t f0 = getModelsStartFrame(); sv_frame_t f1 = getModelsEndFrame(); return getRenderedPartImageSize(f0, f1); } QSize View::getRenderedPartImageSize(sv_frame_t f0, sv_frame_t f1) { int x0 = int(f0 / getZoomLevel()); int x1 = int(f1 / getZoomLevel()); return QSize(x1 - x0, height()); } bool View::renderToSvgFile(QString filename) { sv_frame_t f0 = getModelsStartFrame(); sv_frame_t f1 = getModelsEndFrame(); return renderPartToSvgFile(filename, f0, f1); } bool View::renderPartToSvgFile(QString filename, sv_frame_t f0, sv_frame_t f1) { int x0 = int(f0 / getZoomLevel()); int x1 = int(f1 / getZoomLevel()); QSvgGenerator generator; generator.setFileName(filename); generator.setSize(QSize(x1 - x0, height())); generator.setViewBox(QRect(0, 0, x1 - x0, height())); generator.setTitle(tr("Exported image from %1") .arg(QApplication::applicationName())); QPainter paint; paint.begin(&generator); bool result = render(paint, 0, f0, f1); paint.end(); return result; } void View::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("\n") .arg(m_centreFrame) .arg(m_zoomLevel) .arg(m_followPan) .arg(m_followZoom) .arg(m_followPlay == PlaybackScrollContinuous ? "scroll" : m_followPlay == PlaybackScrollPageWithCentre ? "page" : m_followPlay == PlaybackScrollPage ? "daw" : "ignore") .arg(extraAttributes); for (int i = 0; i < (int)m_fixedOrderLayers.size(); ++i) { bool visible = !m_fixedOrderLayers[i]->isLayerDormant(this); m_fixedOrderLayers[i]->toBriefXml(stream, indent + " ", QString("visible=\"%1\"") .arg(visible ? "true" : "false")); } stream << indent + "\n"; } ViewPropertyContainer::ViewPropertyContainer(View *v) : m_v(v) { // cerr << "ViewPropertyContainer: " << this << " is owned by View " << v << endl; connect(m_v, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SIGNAL(propertyChanged(PropertyContainer::PropertyName))); } ViewPropertyContainer::~ViewPropertyContainer() { } sonic-visualiser-3.0.3/svgui/view/View.h0000644000000000000000000004551313111512442016336 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_VIEW_H #define SV_VIEW_H #include #include #include "layer/LayerGeometryProvider.h" #include "base/ZoomConstraint.h" #include "base/PropertyContainer.h" #include "ViewManager.h" #include "base/XmlExportable.h" #include "base/BaseTypes.h" // #define DEBUG_VIEW_WIDGET_PAINT 1 class Layer; class ViewPropertyContainer; class QPushButton; #include #include /** * View is the base class of widgets that display one or more * overlaid views of data against a horizontal time scale. * * A View may have any number of attached Layers, each of which * is expected to have one data Model (although multiple views may * share the same model). * * A View may be panned in time and zoomed, although the * mechanisms for doing so (as well as any other operations and * properties available) depend on the subclass. */ class View : public QFrame, public XmlExportable, public LayerGeometryProvider { Q_OBJECT public: /** * Deleting a View does not delete any of its layers. They should * be managed elsewhere (e.g. by the Document). */ virtual ~View(); /** * Retrieve the id of this object. Views have their own unique * ids, but ViewProxy objects share the id of their View. */ int getId() const { return m_id; } /** * Retrieve the first visible sample frame on the widget. * This is a calculated value based on the centre-frame, widget * width and zoom level. The result may be negative. */ sv_frame_t getStartFrame() const; /** * Set the widget pan based on the given first visible frame. The * frame value may be negative. */ void setStartFrame(sv_frame_t); /** * Return the centre frame of the visible widget. This is an * exact value that does not depend on the zoom block size. Other * frame values (start, end) are calculated from this based on the * zoom and other factors. */ sv_frame_t getCentreFrame() const { return m_centreFrame; } /** * Set the centre frame of the visible widget. */ void setCentreFrame(sv_frame_t f) { setCentreFrame(f, true); } /** * Retrieve the last visible sample frame on the widget. * This is a calculated value based on the centre-frame, widget * width and zoom level. */ sv_frame_t getEndFrame() const; /** * Return the pixel x-coordinate corresponding to a given sample * frame (which may be negative). */ int getXForFrame(sv_frame_t frame) const; /** * Return the closest frame to the given pixel x-coordinate. */ sv_frame_t getFrameForX(int x) const; /** * Return the closest pixel x-coordinate corresponding to a given * view x-coordinate. Default is no scaling, ViewProxy handles * scaling case. */ int getXForViewX(int viewx) const { return viewx; } /** * Return the closest view x-coordinate corresponding to a given * pixel x-coordinate. Default is no scaling, ViewProxy handles * scaling case. */ int getViewXForX(int x) const { return x; } /** * Return the pixel y-coordinate corresponding to a given * frequency, if the frequency range is as specified. This does * not imply any policy about layer frequency ranges, but it might * be useful for layers to match theirs up if desired. * * Not thread-safe in logarithmic mode. Call only from GUI thread. */ double getYForFrequency(double frequency, double minFreq, double maxFreq, bool logarithmic) const; /** * Return the closest frequency to the given pixel y-coordinate, * if the frequency range is as specified. * * Not thread-safe in logarithmic mode. Call only from GUI thread. */ double getFrequencyForY(double y, double minFreq, double maxFreq, bool logarithmic) const; /** * Return the zoom level, i.e. the number of frames per pixel */ int getZoomLevel() const; /** * Set the zoom level, i.e. the number of frames per pixel. The * centre frame will be unchanged; the start and end frames will * change. */ virtual void setZoomLevel(int z); /** * Zoom in or out. */ virtual void zoom(bool in); /** * Scroll left or right by a smallish or largish amount. */ virtual void scroll(bool right, bool lots, bool doEmit = true); /** * Add a layer to the view. (Normally this should be handled * through some command abstraction instead of using this function * directly.) */ virtual void addLayer(Layer *v); /** * Remove a layer from the view. Does not delete the * layer. (Normally this should be handled through some command * abstraction instead of using this function directly.) */ virtual void removeLayer(Layer *v); /** * Return the number of layers, regardless of whether visible or * dormant, i.e. invisible, in this view. */ virtual int getLayerCount() const { return int(m_layerStack.size()); } /** * Return the nth layer, counted in stacking order. That is, * layer 0 is the bottom layer and layer "getLayerCount()-1" is * the top one. The returned layer may be visible or it may be * dormant, i.e. invisible. */ virtual Layer *getLayer(int n) { if (in_range_for(m_layerStack, n)) return m_layerStack[n]; else return 0; } /** * Return the nth layer, counted in the order they were * added. Unlike the stacking order used in getLayer(), which * changes each time a layer is selected, this ordering remains * fixed. The returned layer may be visible or it may be dormant, * i.e. invisible. */ virtual Layer *getFixedOrderLayer(int n) { if (n < int(m_fixedOrderLayers.size())) return m_fixedOrderLayers[n]; else return 0; } /** * Return the layer currently active for tool interaction. This is * the topmost non-dormant (i.e. visible) layer in the view. If * there are no visible layers in the view, return 0. */ virtual Layer *getInteractionLayer(); virtual const Layer *getInteractionLayer() const; /** * Return the layer most recently selected by the user. This is * the layer that any non-tool-driven commands should operate on, * in the case where this view is the "current" one. * * If the user has selected the view itself more recently than any * of the layers on it, this function will return 0, and any * non-tool-driven layer commands should be deactivated while this * view is current. It will also return 0 if there are no layers * in the view. * * Note that, unlike getInteractionLayer(), this could return an * invisible (dormant) layer. */ virtual Layer *getSelectedLayer(); virtual const Layer *getSelectedLayer() const; /** * Return the "top" layer in the view, whether visible or dormant. * This is the same as getLayer(getLayerCount()-1) if there is at * least one layer, and 0 otherwise. * * For most purposes involving interaction or commands, you * probably want either getInteractionLayer() or * getSelectedLayer() instead. */ virtual Layer *getTopLayer() { return m_layerStack.empty() ? 0 : m_layerStack[m_layerStack.size()-1]; } virtual void setViewManager(ViewManager *m); virtual void setViewManager(ViewManager *m, sv_frame_t initialFrame); virtual ViewManager *getViewManager() const { return m_manager; } virtual void setFollowGlobalPan(bool f); virtual bool getFollowGlobalPan() const { return m_followPan; } virtual void setFollowGlobalZoom(bool f); virtual bool getFollowGlobalZoom() const { return m_followZoom; } virtual bool hasLightBackground() const; virtual QColor getForeground() const; virtual QColor getBackground() const; virtual void drawMeasurementRect(QPainter &p, const Layer *, QRect rect, bool focus) const; virtual bool shouldShowFeatureLabels() const { return m_manager && m_manager->shouldShowFeatureLabels(); } virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const { return false; } virtual bool shouldIlluminateLocalSelection(QPoint &, bool &, bool &) const { return false; } virtual void setPlaybackFollow(PlaybackFollowMode m); virtual PlaybackFollowMode getPlaybackFollow() const { return m_followPlay; } typedef PropertyContainer::PropertyName PropertyName; // We implement the PropertyContainer API, although we don't // actually subclass PropertyContainer. We have our own // PropertyContainer that we can return on request that just // delegates back to us. virtual PropertyContainer::PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyContainer::PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); virtual QString getPropertyContainerName() const { return objectName(); } virtual QString getPropertyContainerIconName() const = 0; virtual int getPropertyContainerCount() const; // The 0th property container is the view's own; the rest are the // layers in fixed-order series virtual const PropertyContainer *getPropertyContainer(int i) const; virtual PropertyContainer *getPropertyContainer(int i); /** * Render the view contents to a new QImage (which may be wider * than the visible View). */ virtual QImage *renderToNewImage(); /** * Render the view contents between the given frame extents to a * new QImage (which may be wider than the visible View). */ virtual QImage *renderPartToNewImage(sv_frame_t f0, sv_frame_t f1); /** * Calculate and return the size of image that will be generated * by renderToNewImage(). */ virtual QSize getRenderedImageSize(); /** * Calculate and return the size of image that will be generated * by renderPartToNewImage(f0, f1). */ virtual QSize getRenderedPartImageSize(sv_frame_t f0, sv_frame_t f1); /** * Render the view contents to a new SVG file. */ virtual bool renderToSvgFile(QString filename); /** * Render the view contents between the given frame extents to a * new SVG file. */ virtual bool renderPartToSvgFile(QString filename, sv_frame_t f0, sv_frame_t f1); virtual int getTextLabelHeight(const Layer *layer, QPainter &) const; virtual bool getValueExtents(QString unit, double &min, double &max, bool &log) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; // First frame actually in model, to right of scale, if present virtual sv_frame_t getFirstVisibleFrame() const; virtual sv_frame_t getLastVisibleFrame() const; sv_frame_t getModelsStartFrame() const; sv_frame_t getModelsEndFrame() const; /** * To be called from a layer, to obtain the extent of the surface * that the layer is currently painting to. This may be the extent * of the view (if 1x display scaling is in effect) or of a larger * cached pixmap (if greater display scaling is in effect). */ QRect getPaintRect() const; QSize getPaintSize() const { return getPaintRect().size(); } int getPaintWidth() const { return getPaintRect().width(); } int getPaintHeight() const { return getPaintRect().height(); } typedef std::set ModelSet; ModelSet getModels(); //!!! Model *getAligningModel() const; sv_frame_t alignFromReference(sv_frame_t) const; sv_frame_t alignToReference(sv_frame_t) const; sv_frame_t getAlignedPlaybackFrame() const; void updatePaintRect(QRect r) { update(r); } View *getView() { return this; } const View *getView() const { return this; } signals: void propertyContainerAdded(PropertyContainer *pc); void propertyContainerRemoved(PropertyContainer *pc); void propertyContainerPropertyChanged(PropertyContainer *pc); void propertyContainerPropertyRangeChanged(PropertyContainer *pc); void propertyContainerNameChanged(PropertyContainer *pc); void propertyContainerSelected(PropertyContainer *pc); void propertyChanged(PropertyContainer::PropertyName); void layerModelChanged(); void centreFrameChanged(sv_frame_t frame, bool globalScroll, PlaybackFollowMode followMode); void zoomLevelChanged(int level, bool locked); void contextHelpChanged(const QString &); public slots: virtual void modelChanged(); virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame); virtual void modelCompletionChanged(); virtual void modelAlignmentCompletionChanged(); virtual void modelReplaced(); virtual void layerParametersChanged(); virtual void layerParameterRangesChanged(); virtual void layerMeasurementRectsChanged(); virtual void layerNameChanged(); virtual void globalCentreFrameChanged(sv_frame_t); virtual void viewCentreFrameChanged(View *, sv_frame_t); virtual void viewManagerPlaybackFrameChanged(sv_frame_t); virtual void viewZoomLevelChanged(View *, int, bool); virtual void propertyContainerSelected(View *, PropertyContainer *pc); virtual void selectionChanged(); virtual void toolModeChanged(); virtual void overlayModeChanged(); virtual void zoomWheelsEnabledChanged(); virtual void cancelClicked(); virtual void progressCheckStalledTimerElapsed(); protected: View(QWidget *, bool showProgress); int m_id; virtual void paintEvent(QPaintEvent *e); virtual void drawSelections(QPainter &); virtual bool shouldLabelSelections() const { return true; } virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1); virtual void setPaintFont(QPainter &paint); QSize scaledSize(const QSize &s, int factor) { return QSize(s.width() * factor, s.height() * factor); } QRect scaledRect(const QRect &r, int factor) { return QRect(r.x() * factor, r.y() * factor, r.width() * factor, r.height() * factor); } typedef std::vector LayerList; sv_samplerate_t getModelsSampleRate() const; bool areLayersScrollable() const; LayerList getScrollableBackLayers(bool testChanged, bool &changed) const; LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const; int getZoomConstraintBlockSize(int blockSize, ZoomConstraint::RoundingDirection dir = ZoomConstraint::RoundNearest) const; // True if the top layer(s) use colours for meaningful things. If // this is the case, selections will be shown using unfilled boxes // rather than with a translucent fill. bool areLayerColoursSignificant() const; // True if the top layer has a time axis on the x coordinate (this // is generally the case except for spectrum/slice layers). It // will not be possible to make or display selections if this is // false. bool hasTopLayerTimeXAxis() const; bool setCentreFrame(sv_frame_t f, bool doEmit); void movePlayPointer(sv_frame_t f); void checkProgress(void *object); int getProgressBarWidth() const; // if visible int effectiveDevicePixelRatio() const; sv_frame_t m_centreFrame; int m_zoomLevel; bool m_followPan; bool m_followZoom; PlaybackFollowMode m_followPlay; bool m_followPlayIsDetached; sv_frame_t m_playPointerFrame; bool m_lightBackground; bool m_showProgress; QPixmap *m_cache; // I own this QPixmap *m_buffer; // I own this sv_frame_t m_cacheCentreFrame; int m_cacheZoomLevel; bool m_selectionCached; bool m_deleting; LayerList m_layerStack; // I don't own these, but see dtor note above LayerList m_fixedOrderLayers; bool m_haveSelectedLayer; QString m_lastError; // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers mutable LayerList m_lastScrollableBackLayers; mutable LayerList m_lastNonScrollableBackLayers; struct ProgressBarRec { QPushButton *cancel; QProgressBar *bar; int lastCheck; QTimer *checkTimer; }; typedef std::map ProgressMap; ProgressMap m_progressBars; // I own the ProgressBars ViewManager *m_manager; // I don't own this ViewPropertyContainer *m_propertyContainer; // I own this }; // Use this for delegation, because we can't subclass from // PropertyContainer (which is a QObject) ourselves because of // ambiguity with QFrame parent class ViewPropertyContainer : public PropertyContainer { Q_OBJECT public: ViewPropertyContainer(View *v); virtual ~ViewPropertyContainer(); PropertyList getProperties() const { return m_v->getProperties(); } QString getPropertyLabel(const PropertyName &n) const { return m_v->getPropertyLabel(n); } PropertyType getPropertyType(const PropertyName &n) const { return m_v->getPropertyType(n); } int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max, int *deflt) const { return m_v->getPropertyRangeAndValue(n, min, max, deflt); } QString getPropertyValueLabel(const PropertyName &n, int value) const { return m_v->getPropertyValueLabel(n, value); } QString getPropertyContainerName() const { return m_v->getPropertyContainerName(); } QString getPropertyContainerIconName() const { return m_v->getPropertyContainerIconName(); } public slots: virtual void setProperty(const PropertyName &n, int value) { m_v->setProperty(n, value); } protected: View *m_v; }; #endif sonic-visualiser-3.0.3/svgui/view/ViewManager.cpp0000644000000000000000000005275113111512442020166 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ViewManager.h" #include "base/AudioPlaySource.h" #include "base/AudioRecordTarget.h" #include "base/RealTime.h" #include "data/model/Model.h" #include "widgets/CommandHistory.h" #include "View.h" #include "Overview.h" #include #include #include //#define DEBUG_VIEW_MANAGER 1 ViewManager::ViewManager() : m_playSource(0), m_recordTarget(0), m_globalCentreFrame(0), m_globalZoom(1024), m_playbackFrame(0), m_playbackModel(0), m_mainModelSampleRate(0), m_lastLeft(0), m_lastRight(0), m_inProgressExclusive(true), m_toolMode(NavigateMode), m_playLoopMode(false), m_playSelectionMode(false), m_playSoloMode(false), m_alignMode(false), m_overlayMode(StandardOverlays), m_zoomWheelsEnabled(true), m_showCentreLine(true), m_illuminateLocalFeatures(true), m_showWorkTitle(false), m_showDuration(true), m_lightPalette(QApplication::palette()), m_darkPalette(QApplication::palette()) { QSettings settings; settings.beginGroup("MainWindow"); m_overlayMode = OverlayMode (settings.value("overlay-mode", int(m_overlayMode)).toInt()); if (m_overlayMode != NoOverlays && m_overlayMode != StandardOverlays && m_overlayMode != AllOverlays) { m_overlayMode = StandardOverlays; } m_zoomWheelsEnabled = settings.value("zoom-wheels-enabled", m_zoomWheelsEnabled).toBool(); m_showCentreLine = settings.value("show-centre-line", m_showCentreLine).toBool(); settings.endGroup(); if (getGlobalDarkBackground()) { /* cerr << "dark palette:" << endl; cerr << "window = " << QApplication::palette().color(QPalette::Window).name() << endl; cerr << "windowtext = " << QApplication::palette().color(QPalette::WindowText).name() << endl; cerr << "base = " << QApplication::palette().color(QPalette::Base).name() << endl; cerr << "alternatebase = " << QApplication::palette().color(QPalette::AlternateBase).name() << endl; cerr << "text = " << QApplication::palette().color(QPalette::Text).name() << endl; cerr << "button = " << QApplication::palette().color(QPalette::Button).name() << endl; cerr << "buttontext = " << QApplication::palette().color(QPalette::ButtonText).name() << endl; cerr << "brighttext = " << QApplication::palette().color(QPalette::BrightText).name() << endl; cerr << "light = " << QApplication::palette().color(QPalette::Light).name() << endl; cerr << "dark = " << QApplication::palette().color(QPalette::Dark).name() << endl; cerr << "mid = " << QApplication::palette().color(QPalette::Mid).name() << endl; */ m_lightPalette = QPalette(QColor("#000000"), // WindowText QColor("#dddfe4"), // Button QColor("#ffffff"), // Light QColor("#555555"), // Dark QColor("#c7c7c7"), // Mid QColor("#000000"), // Text QColor("#ffffff"), // BrightText QColor("#ffffff"), // Base QColor("#efefef")); // Window } else { /* cerr << "light palette:" << endl; cerr << "window = " << QApplication::palette().color(QPalette::Window).name() << endl; cerr << "windowtext = " << QApplication::palette().color(QPalette::WindowText).name() << endl; cerr << "base = " << QApplication::palette().color(QPalette::Base).name() << endl; cerr << "alternatebase = " << QApplication::palette().color(QPalette::AlternateBase).name() << endl; cerr << "text = " << QApplication::palette().color(QPalette::Text).name() << endl; cerr << "button = " << QApplication::palette().color(QPalette::Button).name() << endl; cerr << "buttontext = " << QApplication::palette().color(QPalette::ButtonText).name() << endl; cerr << "brighttext = " << QApplication::palette().color(QPalette::BrightText).name() << endl; cerr << "light = " << QApplication::palette().color(QPalette::Light).name() << endl; cerr << "dark = " << QApplication::palette().color(QPalette::Dark).name() << endl; cerr << "mid = " << QApplication::palette().color(QPalette::Mid).name() << endl; */ m_darkPalette = QPalette(QColor("#ffffff"), // WindowText QColor("#3e3e3e"), // Button QColor("#808080"), // Light QColor("#1e1e1e"), // Dark QColor("#404040"), // Mid QColor("#ffffff"), // Text QColor("#ffffff"), // BrightText QColor("#000000"), // Base QColor("#202020")); // Window } } ViewManager::~ViewManager() { } sv_frame_t ViewManager::getGlobalCentreFrame() const { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::getGlobalCentreFrame: returning " << m_globalCentreFrame << endl; #endif return m_globalCentreFrame; } void ViewManager::setGlobalCentreFrame(sv_frame_t f) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::setGlobalCentreFrame to " << f << endl; #endif m_globalCentreFrame = f; emit globalCentreFrameChanged(f); } int ViewManager::getGlobalZoom() const { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::getGlobalZoom: returning " << m_globalZoom << endl; #endif return m_globalZoom; } sv_frame_t ViewManager::getPlaybackFrame() const { if (isRecording()) { m_playbackFrame = m_recordTarget->getRecordDuration(); #ifdef DEBUG_VIEW_MANAGER cout << "ViewManager::getPlaybackFrame(recording) -> " << m_playbackFrame << endl; #endif } else if (isPlaying()) { m_playbackFrame = m_playSource->getCurrentPlayingFrame(); #ifdef DEBUG_VIEW_MANAGER cout << "ViewManager::getPlaybackFrame(playing) -> " << m_playbackFrame << endl; #endif } else { #ifdef DEBUG_VIEW_MANAGER cout << "ViewManager::getPlaybackFrame(not playing) -> " << m_playbackFrame << endl; #endif } return m_playbackFrame; } void ViewManager::setPlaybackFrame(sv_frame_t f) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::setPlaybackFrame(" << f << ")" << endl; #endif if (f < 0) f = 0; if (m_playbackFrame != f) { m_playbackFrame = f; emit playbackFrameChanged(f); if (isPlaying()) { m_playSource->play(f); } } } Model * ViewManager::getPlaybackModel() const { return m_playbackModel; } void ViewManager::setPlaybackModel(Model *model) { m_playbackModel = model; } sv_frame_t ViewManager::alignPlaybackFrameToReference(sv_frame_t frame) const { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::alignPlaybackFrameToReference(" << frame << "): playback model is " << m_playbackModel << endl; #endif if (!m_playbackModel) { return frame; } else { sv_frame_t f = m_playbackModel->alignToReference(frame); #ifdef DEBUG_VIEW_MANAGER cerr << "aligned frame = " << f << endl; #endif return f; } } sv_frame_t ViewManager::alignReferenceToPlaybackFrame(sv_frame_t frame) const { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::alignReferenceToPlaybackFrame(" << frame << "): playback model is " << m_playbackModel << endl; #endif if (!m_playbackModel) { return frame; } else { sv_frame_t f = m_playbackModel->alignFromReference(frame); #ifdef DEBUG_VIEW_MANAGER cerr << "aligned frame = " << f << endl; #endif return f; } } bool ViewManager::haveInProgressSelection() const { return !m_inProgressSelection.isEmpty(); } const Selection & ViewManager::getInProgressSelection(bool &exclusive) const { exclusive = m_inProgressExclusive; return m_inProgressSelection; } void ViewManager::setInProgressSelection(const Selection &selection, bool exclusive) { m_inProgressExclusive = exclusive; m_inProgressSelection = selection; if (exclusive) clearSelections(); emit inProgressSelectionChanged(); } void ViewManager::clearInProgressSelection() { m_inProgressSelection = Selection(); emit inProgressSelectionChanged(); } const MultiSelection & ViewManager::getSelection() const { return m_selections; } const MultiSelection::SelectionList & ViewManager::getSelections() const { return m_selections.getSelections(); } void ViewManager::setSelection(const Selection &selection) { MultiSelection ms(m_selections); ms.setSelection(selection); setSelections(ms); } void ViewManager::addSelection(const Selection &selection) { MultiSelection ms(m_selections); ms.addSelection(selection); setSelections(ms); } void ViewManager::addSelectionQuietly(const Selection &selection) { MultiSelection ms(m_selections); ms.addSelection(selection); setSelections(ms, true); } void ViewManager::removeSelection(const Selection &selection) { MultiSelection ms(m_selections); ms.removeSelection(selection); setSelections(ms); } void ViewManager::clearSelections() { MultiSelection ms(m_selections); ms.clearSelections(); setSelections(ms); } void ViewManager::setSelections(const MultiSelection &ms, bool quietly) { if (m_selections.getSelections() == ms.getSelections()) return; SetSelectionCommand *command = new SetSelectionCommand(this, ms); CommandHistory::getInstance()->addCommand(command); if (!quietly) { emit selectionChangedByUser(); } } sv_frame_t ViewManager::constrainFrameToSelection(sv_frame_t frame) const { MultiSelection::SelectionList sl = getSelections(); if (sl.empty()) return frame; for (MultiSelection::SelectionList::const_iterator i = sl.begin(); i != sl.end(); ++i) { if (frame < i->getEndFrame()) { if (frame < i->getStartFrame()) { return i->getStartFrame(); } else { return frame; } } } return sl.begin()->getStartFrame(); } void ViewManager::signalSelectionChange() { emit selectionChanged(); } ViewManager::SetSelectionCommand::SetSelectionCommand(ViewManager *vm, const MultiSelection &ms) : m_vm(vm), m_oldSelection(vm->m_selections), m_newSelection(ms) { } ViewManager::SetSelectionCommand::~SetSelectionCommand() { } void ViewManager::SetSelectionCommand::execute() { m_vm->m_selections = m_newSelection; m_vm->signalSelectionChange(); } void ViewManager::SetSelectionCommand::unexecute() { m_vm->m_selections = m_oldSelection; m_vm->signalSelectionChange(); } QString ViewManager::SetSelectionCommand::getName() const { if (m_newSelection.getSelections().empty()) return tr("Clear Selection"); if (m_newSelection.getSelections().size() > 1) return tr("Select Multiple Regions"); else return tr("Select Region"); } Selection ViewManager::getContainingSelection(sv_frame_t frame, bool defaultToFollowing) const { return m_selections.getContainingSelection(frame, defaultToFollowing); } void ViewManager::setToolMode(ToolMode mode) { m_toolMode = mode; emit toolModeChanged(); switch (mode) { case NavigateMode: emit activity(tr("Enter Navigate mode")); break; case SelectMode: emit activity(tr("Enter Select mode")); break; case EditMode: emit activity(tr("Enter Edit mode")); break; case DrawMode: emit activity(tr("Enter Draw mode")); break; case EraseMode: emit activity(tr("Enter Erase mode")); break; case MeasureMode: emit activity(tr("Enter Measure mode")); break; case NoteEditMode: emit activity(tr("Enter NoteEdit mode")); break; // GF: NoteEditMode activity (I'm not yet certain why we need to emit this.) }; } ViewManager::ToolMode ViewManager::getToolModeFor(const View *v) const { if (m_toolModeOverrides.find(v) == m_toolModeOverrides.end()) { return getToolMode(); } else { return m_toolModeOverrides.find(v)->second; } } void ViewManager::setToolModeFor(const View *v, ToolMode mode) { m_toolModeOverrides[v] = mode; } void ViewManager::clearToolModeOverrides() { m_toolModeOverrides.clear(); } void ViewManager::setPlayLoopMode(bool mode) { if (m_playLoopMode != mode) { m_playLoopMode = mode; emit playLoopModeChanged(); emit playLoopModeChanged(mode); if (mode) emit activity(tr("Switch on Loop mode")); else emit activity(tr("Switch off Loop mode")); } } void ViewManager::setPlaySelectionMode(bool mode) { if (m_playSelectionMode != mode) { m_playSelectionMode = mode; emit playSelectionModeChanged(); emit playSelectionModeChanged(mode); if (mode) emit activity(tr("Switch on Play Selection mode")); else emit activity(tr("Switch off Play Selection mode")); } } void ViewManager::setPlaySoloMode(bool mode) { if (m_playSoloMode != mode) { m_playSoloMode = mode; emit playSoloModeChanged(); emit playSoloModeChanged(mode); if (mode) emit activity(tr("Switch on Play Solo mode")); else emit activity(tr("Switch off Play Solo mode")); } } void ViewManager::setAlignMode(bool mode) { if (m_alignMode != mode) { m_alignMode = mode; emit alignModeChanged(); emit alignModeChanged(mode); if (mode) emit activity(tr("Switch on Alignment mode")); else emit activity(tr("Switch off Alignment mode")); } } sv_samplerate_t ViewManager::getPlaybackSampleRate() const { if (m_playSource) { return m_playSource->getSourceSampleRate(); } return 0; } sv_samplerate_t ViewManager::getDeviceSampleRate() const { if (m_playSource) { return m_playSource->getDeviceSampleRate(); } return 0; } void ViewManager::setAudioPlaySource(AudioPlaySource *source) { if (!m_playSource) { QTimer::singleShot(100, this, SLOT(checkPlayStatus())); } m_playSource = source; } void ViewManager::setAudioRecordTarget(AudioRecordTarget *target) { if (!m_recordTarget) { QTimer::singleShot(100, this, SLOT(checkPlayStatus())); } m_recordTarget = target; } void ViewManager::playStatusChanged(bool /* playing */) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::playStatusChanged" << endl; #endif checkPlayStatus(); } void ViewManager::recordStatusChanged(bool /* recording */) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::recordStatusChanged" << endl; #endif checkPlayStatus(); } void ViewManager::checkPlayStatus() { if (isRecording()) { float left = 0, right = 0; if (m_recordTarget->getInputLevels(left, right)) { if (left != m_lastLeft || right != m_lastRight) { emit monitoringLevelsChanged(left, right); m_lastLeft = left; m_lastRight = right; } } m_playbackFrame = m_recordTarget->getRecordDuration(); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::checkPlayStatus: Recording, frame " << m_playbackFrame << ", levels " << m_lastLeft << "," << m_lastRight << endl; #endif emit playbackFrameChanged(m_playbackFrame); QTimer::singleShot(500, this, SLOT(checkPlayStatus())); } else if (isPlaying()) { float left = 0, right = 0; if (m_playSource->getOutputLevels(left, right)) { if (left != m_lastLeft || right != m_lastRight) { emit monitoringLevelsChanged(left, right); m_lastLeft = left; m_lastRight = right; } } m_playbackFrame = m_playSource->getCurrentPlayingFrame(); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::checkPlayStatus: Playing, frame " << m_playbackFrame << ", levels " << m_lastLeft << "," << m_lastRight << endl; #endif emit playbackFrameChanged(m_playbackFrame); QTimer::singleShot(20, this, SLOT(checkPlayStatus())); } else { if (m_lastLeft != 0.0 || m_lastRight != 0.0) { emit monitoringLevelsChanged(0.0, 0.0); m_lastLeft = 0.0; m_lastRight = 0.0; } #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::checkPlayStatus: Not playing or recording" << endl; #endif } } bool ViewManager::isPlaying() const { return m_playSource && m_playSource->isPlaying(); } bool ViewManager::isRecording() const { return m_recordTarget && m_recordTarget->isRecording(); } void ViewManager::viewCentreFrameChanged(sv_frame_t f, bool locked, PlaybackFollowMode mode) { View *v = dynamic_cast(sender()); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::viewCentreFrameChanged(" << f << ", " << locked << ", " << mode << "), view is " << v << endl; #endif if (locked) { m_globalCentreFrame = f; emit globalCentreFrameChanged(f); } else { if (v) emit viewCentreFrameChanged(v, f); } if (!dynamic_cast(v) || (mode != PlaybackIgnore)) { if (m_mainModelSampleRate != 0) { emit activity(tr("Scroll to %1") .arg(RealTime::frame2RealTime (f, m_mainModelSampleRate).toText().c_str())); } } if (mode == PlaybackScrollPageWithCentre || mode == PlaybackScrollContinuous) { seek(f); } } void ViewManager::seek(sv_frame_t f) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::seek(" << f << ")" << endl; #endif if (isRecording()) { // ignore #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::seek: Ignoring during recording" << endl; #endif return; } if (isPlaying()) { sv_frame_t playFrame = m_playSource->getCurrentPlayingFrame(); sv_frame_t diff = std::max(f, playFrame) - std::min(f, playFrame); if (diff > 20000) { m_playbackFrame = f; m_playSource->play(f); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::seek: reseeking from " << playFrame << " to " << f << endl; #endif emit playbackFrameChanged(f); } } else { if (m_playbackFrame != f) { m_playbackFrame = f; emit playbackFrameChanged(f); } } } void ViewManager::viewZoomLevelChanged(int z, bool locked) { View *v = dynamic_cast(sender()); if (!v) { SVDEBUG << "ViewManager::viewZoomLevelChanged: WARNING: sender is not a view" << endl; return; } //!!! emit zoomLevelChanged(); if (locked) { m_globalZoom = z; } #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::viewZoomLevelChanged(" << v << ", " << z << ", " << locked << ")" << endl; #endif emit viewZoomLevelChanged(v, z, locked); if (!dynamic_cast(v)) { emit activity(tr("Zoom to %n sample(s) per pixel", "", z)); } } void ViewManager::setOverlayMode(OverlayMode mode) { if (m_overlayMode != mode) { m_overlayMode = mode; emit overlayModeChanged(); emit activity(tr("Change overlay level")); } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("overlay-mode", int(m_overlayMode)); settings.endGroup(); } void ViewManager::setZoomWheelsEnabled(bool enabled) { if (m_zoomWheelsEnabled != enabled) { m_zoomWheelsEnabled = enabled; emit zoomWheelsEnabledChanged(); if (enabled) emit activity("Show zoom wheels"); else emit activity("Hide zoom wheels"); } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("zoom-wheels-enabled", m_zoomWheelsEnabled); settings.endGroup(); } void ViewManager::setShowCentreLine(bool show) { if (m_showCentreLine != show) { m_showCentreLine = show; emit showCentreLineChanged(); if (show) emit activity("Show centre line"); else emit activity("Hide centre line"); } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("show-centre-line", int(m_showCentreLine)); settings.endGroup(); } void ViewManager::setGlobalDarkBackground(bool dark) { // also save the current palette, in case the user has changed it // since construction if (getGlobalDarkBackground()) { m_darkPalette = QApplication::palette(); } else { m_lightPalette = QApplication::palette(); } #ifndef Q_OS_MAC if (dark) { QApplication::setPalette(m_darkPalette); } else { QApplication::setPalette(m_lightPalette); } #endif } bool ViewManager::getGlobalDarkBackground() const { bool dark = false; QColor windowBg = QApplication::palette().color(QPalette::Window); if (windowBg.red() + windowBg.green() + windowBg.blue() < 384) { dark = true; } return dark; } int ViewManager::scalePixelSize(int pixels) { static double ratio = 0.0; if (ratio == 0.0) { double baseEm; #ifdef Q_OS_MAC baseEm = 17.0; #else baseEm = 15.0; #endif double em = QFontMetrics(QFont()).height(); ratio = em / baseEm; SVDEBUG << "ViewManager::scalePixelSize: ratio is " << ratio << " (em = " << em << ")" << endl; } int scaled = int(pixels * ratio + 0.5); // cerr << "scaledSize: " << pixels << " -> " << scaled << " at ratio " << ratio << endl; if (pixels != 0 && scaled == 0) scaled = 1; return scaled; } sonic-visualiser-3.0.3/svgui/view/ViewManager.h0000644000000000000000000002714113111512442017626 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _VIEW_MANAGER_H_ #define _VIEW_MANAGER_H_ #include #include #include #include #include "base/ViewManagerBase.h" #include "base/Selection.h" #include "base/Command.h" #include "base/Clipboard.h" #include "base/BaseTypes.h" class AudioPlaySource; class AudioRecordTarget; class Model; enum PlaybackFollowMode { /** * View scrolls continuously during playback, keeping the playback * position at the centre. */ PlaybackScrollContinuous, /** * View follows playback page-by-page, but dragging the view * relocates playback to the centre frame. This is the classic * Sonic Visualiser behaviour. */ PlaybackScrollPageWithCentre, /** * View follows playback page-by-page, and the play head is moved * (by the user) separately from dragging the view. This is * roughly the behaviour of a typical DAW or audio editor. */ PlaybackScrollPage, /** * View is detached from playback. It doesn't follow playback, and * dragging the view does not affect the play head. */ PlaybackIgnore }; class View; /** * The ViewManager manages properties that may need to be synchronised * between separate Views. For example, it handles signals associated * with changes to the global pan and zoom, and it handles selections. * * Views should be implemented in such a way as to work * correctly whether they are supplied with a ViewManager or not. */ class ViewManager : public ViewManagerBase { Q_OBJECT public: ViewManager(); virtual ~ViewManager(); void setAudioPlaySource(AudioPlaySource *source); void setAudioRecordTarget(AudioRecordTarget *target); bool isPlaying() const; bool isRecording() const; sv_frame_t getGlobalCentreFrame() const; // the set method is a slot int getGlobalZoom() const; sv_frame_t getPlaybackFrame() const; // the set method is a slot // Only meaningful in solo mode, and used for optional alignment feature Model *getPlaybackModel() const; void setPlaybackModel(Model *); sv_frame_t alignPlaybackFrameToReference(sv_frame_t) const; sv_frame_t alignReferenceToPlaybackFrame(sv_frame_t) const; bool haveInProgressSelection() const; const Selection &getInProgressSelection(bool &exclusive) const; void setInProgressSelection(const Selection &selection, bool exclusive); void clearInProgressSelection(); const MultiSelection &getSelection() const; const MultiSelection::SelectionList &getSelections() const; void setSelection(const Selection &selection); void addSelection(const Selection &selection); void removeSelection(const Selection &selection); void clearSelections(); sv_frame_t constrainFrameToSelection(sv_frame_t frame) const; /** * Adding a selection normally emits the selectionChangedByUser * signal. Call this to add a selection without emitting that signal. * This is used in session file load, for example. */ void addSelectionQuietly(const Selection &selection); /** * Return the selection that contains a given frame. * If defaultToFollowing is true, and if the frame is not in a * selected area, return the next selection after the given frame. * Return the empty selection if no appropriate selection is found. */ Selection getContainingSelection(sv_frame_t frame, bool defaultToFollowing) const; Clipboard &getClipboard() { return m_clipboard; } enum ToolMode { NavigateMode, SelectMode, EditMode, DrawMode, EraseMode, MeasureMode, NoteEditMode //GF: Tonioni: this tool mode will be context sensitive. }; ToolMode getToolMode() const { return m_toolMode; } void setToolMode(ToolMode mode); /// Override the tool mode for a specific view void setToolModeFor(const View *v, ToolMode mode); /// Return override mode if it exists for this view or global mode otherwise ToolMode getToolModeFor(const View *v) const; /// Clear all current view-specific overrides void clearToolModeOverrides(); bool getPlayLoopMode() const { return m_playLoopMode; } void setPlayLoopMode(bool on); bool getPlaySelectionMode() const { return m_playSelectionMode; } void setPlaySelectionMode(bool on); bool getPlaySoloMode() const { return m_playSoloMode; } void setPlaySoloMode(bool on); bool getAlignMode() const { return m_alignMode; } void setAlignMode(bool on); void setIlluminateLocalFeatures(bool i) { m_illuminateLocalFeatures = i; } void setShowWorkTitle(bool show) { m_showWorkTitle = show; } void setShowDuration(bool show) { m_showDuration = show; } /** * The sample rate that is used for playback. This is usually the * rate of the main model, but not always. Models whose rates * differ from this will play back at the wrong speed -- there is * no per-model resampler. */ sv_samplerate_t getPlaybackSampleRate() const; /** * The sample rate of the audio output device. If the playback * sample rate differs from this, everything will be resampled at * the output stage (but not before). */ sv_samplerate_t getDeviceSampleRate() const; /** * The sample rate of the current main model. This may in theory * differ from the playback sample rate, in which case even the * main model will play at the wrong speed. */ sv_samplerate_t getMainModelSampleRate() const { return m_mainModelSampleRate; } void setMainModelSampleRate(sv_samplerate_t sr) { m_mainModelSampleRate = sr; } /** * Take a "design pixel" size and scale it for the actual * display. This is relevant to hi-dpi systems that do not do * pixel doubling (i.e. Windows and Linux rather than OS/X). */ int scalePixelSize(int pixels); enum OverlayMode { NoOverlays, GlobalOverlays, StandardOverlays, AllOverlays }; void setOverlayMode(OverlayMode mode); OverlayMode getOverlayMode() const { return m_overlayMode; } void setShowCentreLine(bool show); bool shouldShowCentreLine() const { return m_showCentreLine; } bool shouldShowDuration() const { return m_overlayMode != NoOverlays && m_showDuration; } bool shouldShowFrameCount() const { return m_showCentreLine && shouldShowDuration(); } bool shouldShowVerticalScale() const { return m_overlayMode != NoOverlays; } bool shouldShowVerticalColourScale() const { return m_overlayMode == AllOverlays; } bool shouldShowSelectionExtents() const { return m_overlayMode != NoOverlays && m_overlayMode != GlobalOverlays; } bool shouldShowLayerNames() const { return m_overlayMode == AllOverlays; } bool shouldShowScaleGuides() const { return m_overlayMode != NoOverlays; } bool shouldShowWorkTitle() const { return m_showWorkTitle; } bool shouldIlluminateLocalFeatures() const { return m_illuminateLocalFeatures; } bool shouldShowFeatureLabels() const { return m_overlayMode != NoOverlays && m_overlayMode != GlobalOverlays; } void setZoomWheelsEnabled(bool enable); bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; } void setGlobalDarkBackground(bool dark); bool getGlobalDarkBackground() const; signals: /** Emitted when user causes the global centre frame to change. */ void globalCentreFrameChanged(sv_frame_t frame); /** Emitted when user scrolls a view, but doesn't affect global centre. */ void viewCentreFrameChanged(View *v, sv_frame_t frame); /** Emitted when a view zooms. */ void viewZoomLevelChanged(View *v, int zoom, bool locked); /** Emitted when the playback frame changes. */ void playbackFrameChanged(sv_frame_t frame); /** Emitted when the output or record levels change. Values in range 0.0 -> 1.0. */ void monitoringLevelsChanged(float left, float right); /** Emitted whenever the selection has changed. */ void selectionChanged(); /** Emitted when the selection has been changed through an * explicit selection-editing action. *Not* emitted when the * selection has been changed through undo or redo. */ void selectionChangedByUser(); /** Emitted when the in-progress (rubberbanding) selection has changed. */ void inProgressSelectionChanged(); /** Emitted when the tool mode has been changed. */ void toolModeChanged(); /** Emitted when the play loop mode has been changed. */ void playLoopModeChanged(); void playLoopModeChanged(bool); /** Emitted when the play selection mode has been changed. */ void playSelectionModeChanged(); void playSelectionModeChanged(bool); /** Emitted when the play solo mode has been changed. */ void playSoloModeChanged(); void playSoloModeChanged(bool); /** Emitted when the alignment mode has been changed. */ void alignModeChanged(); void alignModeChanged(bool); /** Emitted when the overlay mode has been changed. */ void overlayModeChanged(); /** Emitted when the centre line visibility has been changed. */ void showCentreLineChanged(); /** Emitted when the zoom wheels have been toggled. */ void zoomWheelsEnabledChanged(); /** Emitted when any loggable activity has occurred. */ void activity(QString); public slots: void viewCentreFrameChanged(sv_frame_t, bool, PlaybackFollowMode); void viewZoomLevelChanged(int, bool); void setGlobalCentreFrame(sv_frame_t); void setPlaybackFrame(sv_frame_t); void playStatusChanged(bool playing); void recordStatusChanged(bool recording); protected slots: void checkPlayStatus(); void seek(sv_frame_t); //!!! void considerZoomChange(void *, int, bool); protected: AudioPlaySource *m_playSource; AudioRecordTarget *m_recordTarget; sv_frame_t m_globalCentreFrame; int m_globalZoom; mutable sv_frame_t m_playbackFrame; Model *m_playbackModel; //!!! sv_samplerate_t m_mainModelSampleRate; float m_lastLeft; float m_lastRight; MultiSelection m_selections; Selection m_inProgressSelection; bool m_inProgressExclusive; Clipboard m_clipboard; ToolMode m_toolMode; std::map m_toolModeOverrides; bool m_playLoopMode; bool m_playSelectionMode; bool m_playSoloMode; bool m_alignMode; void setSelections(const MultiSelection &ms, bool quietly = false); void signalSelectionChange(); class SetSelectionCommand : public Command { public: SetSelectionCommand(ViewManager *vm, const MultiSelection &ms); virtual ~SetSelectionCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: ViewManager *m_vm; MultiSelection m_oldSelection; MultiSelection m_newSelection; }; OverlayMode m_overlayMode; bool m_zoomWheelsEnabled; bool m_showCentreLine; bool m_illuminateLocalFeatures; bool m_showWorkTitle; bool m_showDuration; QPalette m_lightPalette; QPalette m_darkPalette; }; #endif sonic-visualiser-3.0.3/svgui/view/ViewProxy.h0000644000000000000000000001140713111512442017373 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef VIEW_PROXY_H #define VIEW_PROXY_H #include "layer/LayerGeometryProvider.h" class ViewProxy : public LayerGeometryProvider { public: ViewProxy(View *view, int scaleFactor) : m_view(view), m_scaleFactor(scaleFactor) { } virtual int getId() const { return m_view->getId(); } virtual sv_frame_t getStartFrame() const { return m_view->getStartFrame(); } virtual sv_frame_t getCentreFrame() const { return m_view->getCentreFrame(); } virtual sv_frame_t getEndFrame() const { return m_view->getEndFrame(); } virtual int getXForFrame(sv_frame_t frame) const { //!!! not actually correct, if frame lies between view's pixels return m_scaleFactor * m_view->getXForFrame(frame); } virtual sv_frame_t getFrameForX(int x) const { sv_frame_t f0 = m_view->getFrameForX(x / m_scaleFactor); if (m_scaleFactor == 1) return f0; sv_frame_t f1 = m_view->getFrameForX((x / m_scaleFactor) + 1); return f0 + ((f1 - f0) * (x % m_scaleFactor)) / m_scaleFactor; } virtual int getXForViewX(int viewx) const { return viewx * m_scaleFactor; } virtual int getViewXForX(int x) const { return x / m_scaleFactor; } virtual sv_frame_t getModelsStartFrame() const { return m_view->getModelsStartFrame(); } virtual sv_frame_t getModelsEndFrame() const { return m_view->getModelsEndFrame(); } virtual double getYForFrequency(double frequency, double minFreq, double maxFreq, bool logarithmic) const { return m_scaleFactor * m_view->getYForFrequency(frequency, minFreq, maxFreq, logarithmic); } virtual double getFrequencyForY(double y, double minFreq, double maxFreq, bool logarithmic) const { return m_view->getFrequencyForY (y / m_scaleFactor, minFreq, maxFreq, logarithmic); } virtual int getTextLabelHeight(const Layer *layer, QPainter &paint) const { return m_scaleFactor * m_view->getTextLabelHeight(layer, paint); } virtual bool getValueExtents(QString unit, double &min, double &max, bool &log) const { return m_view->getValueExtents(unit, min, max, log); } virtual int getZoomLevel() const { int z = m_view->getZoomLevel(); // cerr << "getZoomLevel: from " << z << " to "; z = z / m_scaleFactor; // cerr << z << endl; if (z < 1) z = 1; return z; } virtual QRect getPaintRect() const { QRect r = m_view->getPaintRect(); return QRect(r.x() * m_scaleFactor, r.y() * m_scaleFactor, r.width() * m_scaleFactor, r.height() * m_scaleFactor); } virtual QSize getPaintSize() const { return getPaintRect().size(); } virtual int getPaintWidth() const { return getPaintRect().width(); } virtual int getPaintHeight() const { return getPaintRect().height(); } virtual bool hasLightBackground() const { return m_view->hasLightBackground(); } virtual QColor getForeground() const { return m_view->getForeground(); } virtual QColor getBackground() const { return m_view->getBackground(); } virtual ViewManager *getViewManager() const { return m_view->getViewManager(); } virtual bool shouldIlluminateLocalFeatures(const Layer *layer, QPoint &point) const { QPoint p; bool should = m_view->shouldIlluminateLocalFeatures(layer, p); point = QPoint(p.x() * m_scaleFactor, p.y() * m_scaleFactor); return should; } virtual bool shouldShowFeatureLabels() const { return m_view->shouldShowFeatureLabels(); } virtual void drawMeasurementRect(QPainter &p, const Layer *layer, QRect rect, bool focus) const { m_view->drawMeasurementRect(p, layer, rect, focus); } virtual void updatePaintRect(QRect r) { m_view->update(r.x() / m_scaleFactor, r.y() / m_scaleFactor, r.width() / m_scaleFactor, r.height() / m_scaleFactor); } virtual View *getView() { return m_view; } virtual const View *getView() const { return m_view; } private: View *m_view; int m_scaleFactor; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ActivityLog.cpp0000644000000000000000000000452713111512442020711 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ActivityLog.h" #include #include #include #include #include #include #include #include #include "base/Debug.h" using std::cerr; using std::endl; #ifndef NO_PRINT_ACTIVITY #define PRINT_ACTIVITY 1 #endif ActivityLog::ActivityLog() : QDialog() { setWindowTitle(tr("Activity Log")); QGridLayout *layout = new QGridLayout; setLayout(layout); layout->addWidget(new QLabel(tr("

    Activity Log lists your interactions and other events within %1.

    ").arg(QApplication::applicationName())), 0, 0); m_listView = new QListView; m_model = new QStringListModel; m_listView->setModel(m_model); layout->addWidget(m_listView, 1, 0); layout->setRowStretch(1, 10); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(rejected()), this, SLOT(hide())); layout->addWidget(bb, 2, 0); } ActivityLog::~ActivityLog() { } void ActivityLog::activityHappened(QString name) { name = name.replace("&", ""); #ifdef PRINT_ACTIVITY SVDEBUG << "ActivityLog: " << name; if (name == m_prevName) { SVDEBUG << " (duplicate)"; } SVDEBUG << endl; #endif if (name == m_prevName) { return; } m_prevName = name; int row = m_model->rowCount(); name = tr("%1: %2").arg(QTime::currentTime().toString()).arg(name); m_model->insertRows(row, 1); QModelIndex ix = m_model->index(row, 0); m_model->setData(ix, name); if (isVisible()) m_listView->scrollTo(ix); } void ActivityLog::scrollToEnd() { if (m_model->rowCount() == 0 || !isVisible()) return; QModelIndex ix = m_model->index(m_model->rowCount()-1, 0); m_listView->scrollTo(ix); } sonic-visualiser-3.0.3/svgui/widgets/ActivityLog.h0000644000000000000000000000175413111512442020355 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _ACTIVITY_LOG_H_ #define _ACTIVITY_LOG_H_ #include #include class QListView; class QStringListModel; class ActivityLog : public QDialog { Q_OBJECT public: ActivityLog(); ~ActivityLog(); public slots: void activityHappened(QString); void scrollToEnd(); private: QListView *m_listView; QStringListModel *m_model; QString m_prevName; }; #endif sonic-visualiser-3.0.3/svgui/widgets/AudioDial.cpp0000644000000000000000000003431413111512442020303 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /** * A rotary dial widget. * * Based on an original design by Thorsten Wilms. * * Implemented as a widget for the Rosegarden MIDI and audio sequencer * and notation editor by Chris Cannam. * * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas * and adapted for use in QSynth. * * Ported to Qt4 by Chris Cannam. * * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. * * 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. See the file * COPYING included with this distribution for more information. */ #include "AudioDial.h" #include "base/RangeMapper.h" #include #include #include #include #include #include #include #include #include #include "base/Profiler.h" //!!! Pedro updated his version to use my up/down response code from RG -- need to grab that code in preference to this version from Rui //------------------------------------------------------------------------- // AudioDial - Instance knob widget class. // #define AUDIO_DIAL_MIN (0.25 * M_PI) #define AUDIO_DIAL_MAX (1.75 * M_PI) #define AUDIO_DIAL_RANGE (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) //static int dialsExtant = 0; // Constructor. AudioDial::AudioDial(QWidget *parent) : QDial(parent), m_knobColor(Qt::black), m_meterColor(Qt::white), m_defaultValue(0), m_defaultMappedValue(0), m_mappedValue(0), m_noMappedUpdate(false), m_showTooltip(true), m_rangeMapper(0) { m_mouseDial = false; m_mousePressed = false; // ++dialsExtant; } // Destructor. AudioDial::~AudioDial (void) { delete m_rangeMapper; // --dialsExtant; } void AudioDial::setRangeMapper(RangeMapper *mapper) { // cerr << "AudioDial[" << this << "][\"" << objectName() << "\"::setRangeMapper(" << mapper << ") [current is " << m_rangeMapper << "] (have " << dialsExtant << " dials extant)" << endl; if (m_rangeMapper == mapper) return; if (!m_rangeMapper && mapper) { connect(this, SIGNAL(valueChanged(int)), this, SLOT(updateMappedValue(int))); } delete m_rangeMapper; m_rangeMapper = mapper; updateMappedValue(value()); } void AudioDial::paintEvent(QPaintEvent *) { Profiler profiler("AudioDial::paintEvent"); QPainter paint; double angle = AUDIO_DIAL_MIN // offset + (AUDIO_DIAL_RANGE * (double(QDial::value() - QDial::minimum()) / (double(QDial::maximum() - QDial::minimum())))); int degrees = int(angle * 180.0 / M_PI); int ns = notchSize(); int numTicks = 1 + (maximum() + ns - minimum()) / ns; QColor knobColor(m_knobColor); if (knobColor == Qt::black) knobColor = palette().window().color(); QColor meterColor(m_meterColor); if (!isEnabled()) meterColor = palette().mid().color(); else if (m_meterColor == Qt::white) meterColor = palette().highlight().color(); int m_size = width() < height() ? width() : height(); int scale = 1; int width = m_size - 2*scale; paint.begin(this); paint.setRenderHint(QPainter::Antialiasing, true); paint.translate(1, 1); QPen pen; QColor c; // Knob body and face... c = knobColor; pen.setColor(knobColor); pen.setWidth(scale * 2); pen.setCapStyle(Qt::FlatCap); paint.setPen(pen); paint.setBrush(c); int indent = (int)(width * 0.15 + 1); paint.drawEllipse(indent-1, indent-1, width-2*indent, width-2*indent); pen.setWidth(3 * scale); int pos = indent-1 + (width-2*indent) / 20; int darkWidth = (width-2*indent) * 3 / 4; while (darkWidth) { c = c.light(102); pen.setColor(c); paint.setPen(pen); paint.drawEllipse(pos, pos, darkWidth, darkWidth); if (!--darkWidth) break; paint.drawEllipse(pos, pos, darkWidth, darkWidth); if (!--darkWidth) break; paint.drawEllipse(pos, pos, darkWidth, darkWidth); ++pos; --darkWidth; } // Tick notches... if ( notchesVisible() ) { // cerr << "Notches visible" << endl; pen.setColor(palette().dark().color()); pen.setWidth(scale); paint.setPen(pen); for (int i = 0; i < numTicks; ++i) { int div = numTicks; if (div > 1) --div; drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div, width, true); } } // The bright metering bit... c = meterColor; pen.setColor(c); pen.setWidth(indent); paint.setPen(pen); // cerr << "degrees " << degrees << ", gives us " << -(degrees - 45) * 16 << endl; int arcLen = -(degrees - 45) * 16; if (arcLen == 0) arcLen = -16; paint.drawArc(indent/2, indent/2, width-indent, width-indent, (180 + 45) * 16, arcLen); paint.setBrush(Qt::NoBrush); // Shadowing... pen.setWidth(scale); paint.setPen(pen); // Knob shadow... int shadowAngle = -720; c = knobColor.dark(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); paint.setPen(pen); paint.drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle + arc, 240); paint.drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle - arc, 240); c = c.light(110); } // Scale shadow, omitting the bottom part... shadowAngle = 2160; c = palette().shadow().color(); for (int i = 0; i < 5; ++i) { pen.setColor(c); paint.setPen(pen); int arc = i * 240 + 120; paint.drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle + arc, 240); c = c.light(110); } c = palette().shadow().color(); for (int i = 0; i < 12; ++i) { pen.setColor(c); paint.setPen(pen); int arc = i * 240 + 120; paint.drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle - arc, 240); c = c.light(110); } // Scale ends... pen.setColor(palette().shadow().color()); pen.setWidth(scale); paint.setPen(pen); for (int i = 0; i < numTicks; ++i) { if (i != 0 && i != numTicks - 1) continue; int div = numTicks; if (div > 1) --div; drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div, width, false); } // Pointer notch... double hyp = double(width) / 2.0; double len = hyp - indent; --len; double x0 = hyp; double y0 = hyp; double x = hyp - len * sin(angle); double y = hyp + len * cos(angle); c = palette().dark().color(); pen.setColor(isEnabled() ? c.dark(130) : c); pen.setWidth(scale * 2); paint.setPen(pen); paint.drawLine(int(x0), int(y0), int(x), int(y)); paint.end(); } void AudioDial::drawTick(QPainter &paint, double angle, int size, bool internal) { double hyp = double(size) / 2.0; double x0 = hyp - (hyp - 1) * sin(angle); double y0 = hyp + (hyp - 1) * cos(angle); // cerr << "drawTick: angle " << angle << ", size " << size << ", internal " << internal << endl; if (internal) { double len = hyp / 4; double x1 = hyp - (hyp - len) * sin(angle); double y1 = hyp + (hyp - len) * cos(angle); paint.drawLine(int(x0), int(y0), int(x1), int(y1)); } else { double len = hyp / 4; double x1 = hyp - (hyp + len) * sin(angle); double y1 = hyp + (hyp + len) * cos(angle); paint.drawLine(int(x0), int(y0), int(x1), int(y1)); } } void AudioDial::setKnobColor(const QColor& color) { m_knobColor = color; update(); } void AudioDial::setMeterColor(const QColor& color) { m_meterColor = color; update(); } void AudioDial::setMouseDial(bool mouseDial) { m_mouseDial = mouseDial; } void AudioDial::setDefaultValue(int defaultValue) { m_defaultValue = defaultValue; if (m_rangeMapper) { m_defaultMappedValue = m_rangeMapper->getValueForPosition(defaultValue); } } void AudioDial::setValue(int value) { QDial::setValue(value); updateMappedValue(value); } void AudioDial::setDefaultMappedValue(double value) { m_defaultMappedValue = value; if (m_rangeMapper) { m_defaultValue = m_rangeMapper->getPositionForValue(value); } } void AudioDial::setMappedValue(double mappedValue) { if (m_rangeMapper) { int newPosition = m_rangeMapper->getPositionForValue(mappedValue); bool changed = (m_mappedValue != mappedValue); m_mappedValue = mappedValue; m_noMappedUpdate = true; SVDEBUG << "AudioDial::setMappedValue(" << mappedValue << "): new position is " << newPosition << endl; if (newPosition != value()) { setValue(newPosition); } else if (changed) { emit valueChanged(newPosition); } m_noMappedUpdate = false; } else { setValue(int(mappedValue)); } } void AudioDial::setShowToolTip(bool show) { m_showTooltip = show; m_noMappedUpdate = true; updateMappedValue(value()); m_noMappedUpdate = false; } double AudioDial::mappedValue() const { if (m_rangeMapper) { // SVDEBUG << "AudioDial::mappedValue(): value = " << value() << ", mappedValue = " << m_mappedValue << endl; return m_mappedValue; } return value(); } void AudioDial::updateMappedValue(int value) { if (!m_noMappedUpdate) { if (m_rangeMapper) { m_mappedValue = m_rangeMapper->getValueForPosition(value); } else { m_mappedValue = value; } } if (m_showTooltip) { QString name = objectName(); QString label; if (m_rangeMapper) { label = m_rangeMapper->getLabel(value); } QString text; if (label != "") { if (name != "") { text = tr("%1: %2").arg(name).arg(label); } else { text = label; } } else { QString unit = ""; if (m_rangeMapper) { unit = m_rangeMapper->getUnit(); } if (name != "") { text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit); } else { text = tr("%2%3").arg(m_mappedValue).arg(unit); } } setToolTip(text); } } void AudioDial::setToDefault() { if (m_rangeMapper) { setMappedValue(m_defaultMappedValue); return; } int dv = m_defaultValue; if (dv < minimum()) dv = minimum(); if (dv > maximum()) dv = maximum(); setValue(m_defaultValue); } // Alternate mouse behavior event handlers. void AudioDial::mousePressEvent(QMouseEvent *mouseEvent) { if (m_mouseDial) { QDial::mousePressEvent(mouseEvent); } else if (mouseEvent->button() == Qt::MidButton || ((mouseEvent->button() == Qt::LeftButton) && (mouseEvent->modifiers() & Qt::ControlModifier))) { setToDefault(); } else if (mouseEvent->button() == Qt::LeftButton) { m_mousePressed = true; m_posMouse = mouseEvent->pos(); } } void AudioDial::mouseDoubleClickEvent(QMouseEvent *mouseEvent) { //!!! needs a common base class with Thumbwheel if (m_mouseDial) { QDial::mouseDoubleClickEvent(mouseEvent); } else if (mouseEvent->button() != Qt::LeftButton) { return; } bool ok = false; if (m_rangeMapper) { double min = m_rangeMapper->getValueForPosition(minimum()); double max = m_rangeMapper->getValueForPosition(maximum()); if (min > max) { double tmp = min; min = max; max = tmp; } QString unit = m_rangeMapper->getUnit(); QString text; if (objectName() != "") { if (unit != "") { text = tr("New value for %1, from %2 to %3 %4:") .arg(objectName()).arg(min).arg(max).arg(unit); } else { text = tr("New value for %1, from %2 to %3:") .arg(objectName()).arg(min).arg(max); } } else { if (unit != "") { text = tr("Enter a new value from %1 to %2 %3:") .arg(min).arg(max).arg(unit); } else { text = tr("Enter a new value from %1 to %2:") .arg(min).arg(max); } } double newValue = QInputDialog::getDouble (this, tr("Enter new value"), text, m_mappedValue, min, max, 4, &ok); if (ok) { setMappedValue(newValue); } } else { int newPosition = QInputDialog::getInt (this, tr("Enter new value"), tr("Enter a new value from %1 to %2:") .arg(minimum()).arg(maximum()), value(), minimum(), maximum(), singleStep(), &ok); if (ok) { setValue(newPosition); } } } void AudioDial::mouseMoveEvent(QMouseEvent *mouseEvent) { if (m_mouseDial) { QDial::mouseMoveEvent(mouseEvent); } else if (m_mousePressed) { const QPoint& posMouse = mouseEvent->pos(); int v = QDial::value() + (posMouse.x() - m_posMouse.x()) + (m_posMouse.y() - posMouse.y()); if (v > QDial::maximum()) v = QDial::maximum(); else if (v < QDial::minimum()) v = QDial::minimum(); m_posMouse = posMouse; QDial::setValue(v); } } void AudioDial::mouseReleaseEvent(QMouseEvent *mouseEvent) { if (m_mouseDial) { QDial::mouseReleaseEvent(mouseEvent); } else if (m_mousePressed) { m_mousePressed = false; } } void AudioDial::enterEvent(QEvent *e) { QDial::enterEvent(e); emit mouseEntered(); } void AudioDial::leaveEvent(QEvent *e) { QDial::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/AudioDial.h0000644000000000000000000001105513111512442017745 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_DIAL_H_ #define _AUDIO_DIAL_H_ /** * A rotary dial widget. * * Based on an original design by Thorsten Wilms. * * Implemented as a widget for the Rosegarden MIDI and audio sequencer * and notation editor by Chris Cannam. * * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas * and adapted for use in QSynth. * * Ported to Qt4 by Chris Cannam. * * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. * * 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. See the file * COPYING included with this distribution for more information. */ #include #include class RangeMapper; /** * AudioDial is a nicer-looking QDial that by default reacts to mouse * movement on horizontal and vertical axes instead of in a radial * motion. Move the mouse up or right to increment the value, down or * left to decrement it. AudioDial also responds to the mouse wheel. * * The programming interface for this widget is compatible with QDial, * with the addition of properties for the knob colour and meter * colour and a boolean property mouseDial that determines whether to * respond to radial mouse motion in the same way as QDial (the * default is no). */ class AudioDial : public QDial { Q_OBJECT Q_PROPERTY( QColor knobColor READ getKnobColor WRITE setKnobColor ) Q_PROPERTY( QColor meterColor READ getMeterColor WRITE setMeterColor ) Q_PROPERTY( bool mouseDial READ getMouseDial WRITE setMouseDial ) public: AudioDial(QWidget *parent = 0); ~AudioDial(); const QColor& getKnobColor() const { return m_knobColor; } const QColor& getMeterColor() const { return m_meterColor; } bool getMouseDial() const { return m_mouseDial; } void setRangeMapper(RangeMapper *mapper); // I take ownership, will delete const RangeMapper *rangeMapper() const { return m_rangeMapper; } double mappedValue() const; int defaultValue() const { return m_defaultValue; } void setShowToolTip(bool show); signals: void mouseEntered(); void mouseLeft(); public slots: /** * Set the colour of the knob. The default is to inherit the * colour from the widget's palette. */ void setKnobColor(const QColor &color); /** * Set the colour of the meter (the highlighted area around the * knob that shows the current value). The default is to inherit * the colour from the widget's palette. */ void setMeterColor(const QColor &color); /** * Specify that the dial should respond to radial mouse movements * in the same way as QDial. */ void setMouseDial(bool mouseDial); void setDefaultValue(int defaultValue); void setValue(int value); void setDefaultMappedValue(double mappedValue); void setMappedValue(double mappedValue); void setToDefault(); protected: void drawTick(QPainter &paint, double angle, int size, bool internal); virtual void paintEvent(QPaintEvent *); // Alternate mouse behavior event handlers. virtual void mousePressEvent(QMouseEvent *pMouseEvent); virtual void mouseMoveEvent(QMouseEvent *pMouseEvent); virtual void mouseReleaseEvent(QMouseEvent *pMouseEvent); virtual void mouseDoubleClickEvent(QMouseEvent *pMouseEvent); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); protected slots: void updateMappedValue(int value); private: QColor m_knobColor; QColor m_meterColor; int m_defaultValue; double m_defaultMappedValue; double m_mappedValue; bool m_noMappedUpdate; // Alternate mouse behavior tracking. bool m_mouseDial; bool m_mousePressed; QPoint m_posMouse; bool m_showTooltip; RangeMapper *m_rangeMapper; }; #endif // __AudioDial_h // end of AudioDial.h sonic-visualiser-3.0.3/svgui/widgets/CSVFormatDialog.cpp0000644000000000000000000003765113111512442021403 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "CSVFormatDialog.h" #include "layer/LayerFactory.h" #include "TextAbbrev.h" #include #include #include #include #include #include #include #include #include #include #include #include "base/Debug.h" CSVFormatDialog::CSVFormatDialog(QWidget *parent, CSVFormat format, int maxDisplayCols) : QDialog(parent), m_format(format), m_maxDisplayCols(maxDisplayCols), m_fuzzyColumn(-1) { setModal(true); setWindowTitle(tr("Select Data Format")); QGridLayout *layout = new QGridLayout; int row = 0; layout->addWidget(new QLabel(tr("Please select the correct data format for this file.")), row++, 0, 1, 4); QFrame *exampleFrame = new QFrame; exampleFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); exampleFrame->setLineWidth(2); QGridLayout *exampleLayout = new QGridLayout; exampleLayout->setSpacing(4); exampleFrame->setLayout(exampleLayout); QPalette palette = exampleFrame->palette(); palette.setColor(QPalette::Window, palette.color(QPalette::Base)); exampleFrame->setPalette(palette); QFont fp; fp.setPointSize(int(floor(fp.pointSize() * 0.9))); // fp.setFixedPitch(true); // fp.setStyleHint(QFont::TypeWriter); // fp.setFamily("Monospaced"); int columns = format.getColumnCount(); QList example = m_format.getExample(); for (int i = 0; i < columns; ++i) { QComboBox *cpc = new QComboBox; m_columnPurposeCombos.push_back(cpc); exampleLayout->addWidget(cpc, 0, i); connect(cpc, SIGNAL(activated(int)), this, SLOT(columnPurposeChanged(int))); if (i == m_maxDisplayCols && columns > i + 2) { m_fuzzyColumn = i; cpc->addItem(tr("")); cpc->addItem(tr("Values")); cpc->setCurrentIndex (m_format.getColumnPurpose(i-1) == CSVFormat::ColumnUnknown ? 0 : 1); exampleLayout->addWidget(new QLabel(tr("(%1 more)").arg(columns - i)), 1, i); break; } // NB must be in the same order as the CSVFormat::ColumnPurpose enum cpc->addItem(tr("")); // ColumnUnknown cpc->addItem(tr("Time")); // ColumnStartTime cpc->addItem(tr("End time")); // ColumnEndTime cpc->addItem(tr("Duration")); // ColumnDuration cpc->addItem(tr("Value")); // ColumnValue cpc->addItem(tr("Pitch")); // ColumnPitch cpc->addItem(tr("Label")); // ColumnLabel cpc->setCurrentIndex(int(m_format.getColumnPurpose(i))); for (int j = 0; j < example.size() && j < 6; ++j) { if (i >= example[j].size()) { continue; } QLabel *label = new QLabel; label->setTextFormat(Qt::PlainText); QString text = TextAbbrev::abbreviate(example[j][i], 35); label->setText(text); label->setFont(fp); label->setPalette(palette); label->setIndent(8); exampleLayout->addWidget(label, j+1, i); } } layout->addWidget(exampleFrame, row, 0, 1, 4); layout->setColumnStretch(3, 10); layout->setRowStretch(row++, 10); layout->addWidget(new QLabel(tr("Timing is specified:")), row, 0); m_timingTypeCombo = new QComboBox; m_timingLabels = { { TimingExplicitSeconds, tr("Explicitly, in seconds") }, { TimingExplicitMsec, tr("Explicitly, in milliseconds") }, { TimingExplicitSamples, tr("Explicitly, in audio sample frames") }, { TimingImplicit, tr("Implicitly: rows are equally spaced in time") } }; for (auto &l: m_timingLabels) { m_timingTypeCombo->addItem(l.second); } layout->addWidget(m_timingTypeCombo, row++, 1, 1, 2); connect(m_timingTypeCombo, SIGNAL(activated(int)), this, SLOT(timingTypeChanged(int))); m_initialTimingOption = TimingImplicit; if (m_format.getTimingType() == CSVFormat::ExplicitTiming) { switch (m_format.getTimeUnits()) { case CSVFormat::TimeSeconds: m_initialTimingOption = TimingExplicitSeconds; break; case CSVFormat::TimeMilliseconds: m_initialTimingOption = TimingExplicitMsec; break; case CSVFormat::TimeAudioFrames: m_initialTimingOption = TimingExplicitSamples; break; case CSVFormat::TimeWindows: m_initialTimingOption = TimingImplicit; break; } } m_timingTypeCombo->setCurrentIndex(int(m_initialTimingOption)); m_sampleRateLabel = new QLabel(tr("Audio sample rate (Hz):")); layout->addWidget(m_sampleRateLabel, row, 0); int sampleRates[] = { 8000, 11025, 12000, 22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; m_sampleRateCombo = new QComboBox; for (int i = 0; i < int(sizeof(sampleRates) / sizeof(sampleRates[0])); ++i) { m_sampleRateCombo->addItem(QString("%1").arg(sampleRates[i])); if (sampleRates[i] == m_format.getSampleRate()) { m_sampleRateCombo->setCurrentIndex(i); } } m_sampleRateCombo->setEditable(true); layout->addWidget(m_sampleRateCombo, row++, 1); connect(m_sampleRateCombo, SIGNAL(activated(QString)), this, SLOT(sampleRateChanged(QString))); connect(m_sampleRateCombo, SIGNAL(editTextChanged(QString)), this, SLOT(sampleRateChanged(QString))); m_windowSizeLabel = new QLabel(tr("Frame increment between rows:")); layout->addWidget(m_windowSizeLabel, row, 0); m_windowSizeCombo = new QComboBox; for (int i = 0; i <= 16; ++i) { int value = 1 << i; m_windowSizeCombo->addItem(QString("%1").arg(value)); if (value == int(m_format.getWindowSize())) { m_windowSizeCombo->setCurrentIndex(i); } } m_windowSizeCombo->setEditable(true); layout->addWidget(m_windowSizeCombo, row++, 1); connect(m_windowSizeCombo, SIGNAL(activated(QString)), this, SLOT(windowSizeChanged(QString))); connect(m_windowSizeCombo, SIGNAL(editTextChanged(QString)), this, SLOT(windowSizeChanged(QString))); m_modelLabel = new QLabel; QFont f(m_modelLabel->font()); f.setItalic(true); m_modelLabel->setFont(f); layout->addWidget(m_modelLabel, row++, 0, 1, 4); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, row++, 0, 1, 4); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); setLayout(layout); timingTypeChanged(m_timingTypeCombo->currentIndex()); } CSVFormatDialog::~CSVFormatDialog() { } CSVFormat CSVFormatDialog::getFormat() const { return m_format; } void CSVFormatDialog::updateModelLabel() { LayerFactory *f = LayerFactory::getInstance(); QString s; switch (m_format.getModelType()) { case CSVFormat::OneDimensionalModel: s = f->getLayerPresentationName(LayerFactory::TimeInstants); break; case CSVFormat::TwoDimensionalModel: s = f->getLayerPresentationName(LayerFactory::TimeValues); break; case CSVFormat::TwoDimensionalModelWithDuration: s = f->getLayerPresentationName(LayerFactory::Regions); break; case CSVFormat::TwoDimensionalModelWithDurationAndPitch: s = f->getLayerPresentationName(LayerFactory::Notes); break; case CSVFormat::ThreeDimensionalModel: s = f->getLayerPresentationName(LayerFactory::Colour3DPlot); break; } m_modelLabel->setText("\n" + tr("Data will be displayed in a %1 layer.").arg(s)); } void CSVFormatDialog::applyStartTimePurpose() { // First check if we already have any. NB there may be fewer than // m_format.getColumnCount() elements in m_columnPurposeCombos // (because of the fuzzy column behaviour). Note also that the // fuzzy column (which is the one just showing how many more // columns there are) has a different combo with only two items // (ignore or Values) for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { if (i == m_fuzzyColumn) continue; QComboBox *cb = m_columnPurposeCombos[i]; if (cb->currentIndex() == int(CSVFormat::ColumnStartTime)) { return; } } // and if not, select one for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { if (i == m_fuzzyColumn) continue; QComboBox *cb = m_columnPurposeCombos[i]; if (cb->currentIndex() == int(CSVFormat::ColumnValue)) { cb->setCurrentIndex(int(CSVFormat::ColumnStartTime)); return; } } } void CSVFormatDialog::removeStartTimePurpose() { // NB there may be fewer than m_format.getColumnCount() elements // in m_columnPurposeCombos (because of the fuzzy column // behaviour) for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { if (i == m_fuzzyColumn) continue; QComboBox *cb = m_columnPurposeCombos[i]; if (cb->currentIndex() == int(CSVFormat::ColumnStartTime)) { cb->setCurrentIndex(int(CSVFormat::ColumnValue)); } } } void CSVFormatDialog::updateComboVisibility() { bool wantRate = (m_format.getTimingType() == CSVFormat::ImplicitTiming || m_format.getTimeUnits() == CSVFormat::TimeAudioFrames); bool wantWindow = (m_format.getTimingType() == CSVFormat::ImplicitTiming); m_sampleRateCombo->setEnabled(wantRate); m_sampleRateLabel->setEnabled(wantRate); m_windowSizeCombo->setEnabled(wantWindow); m_windowSizeLabel->setEnabled(wantWindow); } void CSVFormatDialog::timingTypeChanged(int type) { // Update any column purpose combos if (TimingOption(type) == TimingImplicit) { removeStartTimePurpose(); } else { applyStartTimePurpose(); } updateFormatFromDialog(); updateComboVisibility(); } void CSVFormatDialog::sampleRateChanged(QString rateString) { bool ok = false; int sampleRate = rateString.toInt(&ok); if (ok) m_format.setSampleRate(sampleRate); } void CSVFormatDialog::windowSizeChanged(QString sizeString) { bool ok = false; int size = sizeString.toInt(&ok); if (ok) m_format.setWindowSize(size); } void CSVFormatDialog::columnPurposeChanged(int p) { QObject *o = sender(); QComboBox *cb = qobject_cast(o); if (!cb) return; CSVFormat::ColumnPurpose purpose = (CSVFormat::ColumnPurpose)p; bool haveStartTime = false; // so as to update timing type combo appropriately // Ensure the column purpose combos are consistent with one // another, without reference to m_format (which we'll update // separately) for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { // The fuzzy column combo only has the entries or // Values, so it can't affect the timing type and none of this // logic affects it if (i == m_fuzzyColumn) continue; QComboBox *thisCombo = m_columnPurposeCombos[i]; CSVFormat::ColumnPurpose cp = (CSVFormat::ColumnPurpose) (thisCombo->currentIndex()); bool thisChanged = (cb == thisCombo); if (!thisChanged) { // We can only have one ColumnStartTime column, and only // one of either ColumnDuration or ColumnEndTime if (purpose == CSVFormat::ColumnStartTime) { if (cp == purpose) { cp = CSVFormat::ColumnValue; } } else if (purpose == CSVFormat::ColumnDuration || purpose == CSVFormat::ColumnEndTime) { if (cp == CSVFormat::ColumnDuration || cp == CSVFormat::ColumnEndTime) { cp = CSVFormat::ColumnValue; } } // And we can only have one label if (purpose == CSVFormat::ColumnLabel) { if (cp == purpose) { cp = CSVFormat::ColumnUnknown; } } if (cp == CSVFormat::ColumnStartTime) { haveStartTime = true; } thisCombo->setCurrentIndex(int(cp)); } else { if (purpose == CSVFormat::ColumnStartTime) { haveStartTime = true; } } } if (!haveStartTime) { m_timingTypeCombo->setCurrentIndex(int(TimingImplicit)); } else if (m_timingTypeCombo->currentIndex() == int(TimingImplicit)) { if (m_initialTimingOption == TimingImplicit) { m_timingTypeCombo->setCurrentIndex(TimingExplicitSeconds); } else { m_timingTypeCombo->setCurrentIndex(m_initialTimingOption); } } updateFormatFromDialog(); updateComboVisibility(); } void CSVFormatDialog::updateFormatFromDialog() { switch (TimingOption(m_timingTypeCombo->currentIndex())) { case TimingExplicitSeconds: m_format.setTimingType(CSVFormat::ExplicitTiming); m_format.setTimeUnits(CSVFormat::TimeSeconds); break; case TimingExplicitMsec: m_format.setTimingType(CSVFormat::ExplicitTiming); m_format.setTimeUnits(CSVFormat::TimeMilliseconds); break; case TimingExplicitSamples: m_format.setTimingType(CSVFormat::ExplicitTiming); m_format.setTimeUnits(CSVFormat::TimeAudioFrames); break; case TimingImplicit: m_format.setTimingType(CSVFormat::ImplicitTiming); m_format.setTimeUnits(CSVFormat::TimeWindows); break; } bool haveStartTime = false; bool haveDuration = false; bool havePitch = false; int valueCount = 0; for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { QComboBox *thisCombo = m_columnPurposeCombos[i]; CSVFormat::ColumnPurpose purpose = (CSVFormat::ColumnPurpose) (thisCombo->currentIndex()); if (i == m_fuzzyColumn) { for (int j = i; j < m_format.getColumnCount(); ++j) { if (purpose == CSVFormat::ColumnUnknown) { m_format.setColumnPurpose(j, CSVFormat::ColumnUnknown); } else { // Value m_format.setColumnPurpose(j, CSVFormat::ColumnValue); ++valueCount; } } } else { if (purpose == CSVFormat::ColumnStartTime) { haveStartTime = true; } if (purpose == CSVFormat::ColumnEndTime || purpose == CSVFormat::ColumnDuration) { haveDuration = true; } if (purpose == CSVFormat::ColumnPitch) { havePitch = true; } if (purpose == CSVFormat::ColumnValue) { ++valueCount; } m_format.setColumnPurpose(i, purpose); } } if (haveStartTime && haveDuration) { if (havePitch) { m_format.setModelType(CSVFormat::TwoDimensionalModelWithDurationAndPitch); } else { m_format.setModelType(CSVFormat::TwoDimensionalModelWithDuration); } } else { if (valueCount > 1) { m_format.setModelType(CSVFormat::ThreeDimensionalModel); } else if (valueCount > 0) { m_format.setModelType(CSVFormat::TwoDimensionalModel); } else { m_format.setModelType(CSVFormat::OneDimensionalModel); } } updateModelLabel(); } sonic-visualiser-3.0.3/svgui/widgets/CSVFormatDialog.h0000644000000000000000000000361713111512442021043 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _CSV_FORMAT_DIALOG_H_ #define _CSV_FORMAT_DIALOG_H_ #include "data/fileio/CSVFormat.h" class QTableWidget; class QComboBox; class QLabel; #include class CSVFormatDialog : public QDialog { Q_OBJECT public: CSVFormatDialog(QWidget *parent, CSVFormat initialFormat, int maxDisplayCols = 5); ~CSVFormatDialog(); CSVFormat getFormat() const; protected slots: void timingTypeChanged(int type); void sampleRateChanged(QString); void windowSizeChanged(QString); void columnPurposeChanged(int purpose); void updateFormatFromDialog(); void updateModelLabel(); protected: CSVFormat m_format; int m_maxDisplayCols; enum TimingOption { TimingExplicitSeconds = 0, TimingExplicitMsec, TimingExplicitSamples, TimingImplicit }; std::map m_timingLabels; TimingOption m_initialTimingOption; void updateComboVisibility(); void applyStartTimePurpose(); void removeStartTimePurpose(); QComboBox *m_timingTypeCombo; QLabel *m_sampleRateLabel; QComboBox *m_sampleRateCombo; QLabel *m_windowSizeLabel; QComboBox *m_windowSizeCombo; QLabel *m_modelLabel; QList m_columnPurposeCombos; int m_fuzzyColumn; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ClickableLabel.h0000644000000000000000000000176613111512442020733 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef _CLICKABLE_LABEL_H_ #define _CLICKABLE_LABEL_H_ #include class ClickableLabel : public QLabel { Q_OBJECT public: ClickableLabel(const QString &text, QWidget *parent = 0) : QLabel(text, parent) { } ClickableLabel(QWidget *parent = 0) : QLabel(parent) { } ~ClickableLabel() { } signals: void clicked(); protected: virtual void mousePressEvent(QMouseEvent *) { emit clicked(); } }; #endif sonic-visualiser-3.0.3/svgui/widgets/ColourComboBox.cpp0000644000000000000000000000550313111512442021342 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2016 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColourComboBox.h" #include "ColourNameDialog.h" #include "layer/ColourDatabase.h" #include "base/Debug.h" #include #include #include using namespace std; ColourComboBox::ColourComboBox(bool withAddNewColourEntry, QWidget *parent) : NotifyingComboBox(parent), m_withAddNewColourEntry(withAddNewColourEntry) { setEditable(false); rebuild(); connect(this, SIGNAL(activated(int)), this, SLOT(comboActivated(int))); connect(ColourDatabase::getInstance(), SIGNAL(colourDatabaseChanged()), this, SLOT(rebuild())); if (count() < 20 && count() > maxVisibleItems()) { setMaxVisibleItems(count()); } } void ColourComboBox::comboActivated(int index) { if (!m_withAddNewColourEntry || index < int(ColourDatabase::getInstance()->getColourCount())) { emit colourChanged(index); return; } QColor newColour = QColorDialog::getColor(); if (!newColour.isValid()) return; ColourNameDialog dialog(tr("Name New Colour"), tr("Enter a name for the new colour:"), newColour, newColour.name(), this); dialog.showDarkBackgroundCheckbox(tr("Prefer black background for this colour")); if (dialog.exec() == QDialog::Accepted) { //!!! command ColourDatabase *db = ColourDatabase::getInstance(); int index = db->addColour(newColour, dialog.getColourName()); db->setUseDarkBackground(index, dialog.isDarkBackgroundChecked()); // addColour will have called back on rebuild(), and the new // colour will be at the index previously occupied by Add New // Colour, which is our current index emit colourChanged(currentIndex()); } } void ColourComboBox::rebuild() { blockSignals(true); int ix = currentIndex(); clear(); int size = (QFontMetrics(QFont()).height() * 2) / 3; if (size < 12) size = 12; ColourDatabase *db = ColourDatabase::getInstance(); for (int i = 0; i < db->getColourCount(); ++i) { QString name = db->getColourName(i); addItem(db->getExamplePixmap(i, QSize(size, size)), name); } if (m_withAddNewColourEntry) { addItem(tr("Add New Colour...")); } setCurrentIndex(ix); blockSignals(false); } sonic-visualiser-3.0.3/svgui/widgets/ColourComboBox.h0000644000000000000000000000220213111512442021000 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2016 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_COLOUR_COMBO_BOX_H #define SV_COLOUR_COMBO_BOX_H #include "NotifyingComboBox.h" /** * Colour-picker combo box with swatches, optionally including "Add * New Colour..." entry to invoke a QColorDialog/ColourNameDialog */ class ColourComboBox : public NotifyingComboBox { Q_OBJECT public: ColourComboBox(bool withAddNewColourEntry, QWidget *parent = 0); signals: void colourChanged(int colourIndex); private slots: void rebuild(); void comboActivated(int); private: bool m_withAddNewColourEntry; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ColourMapComboBox.cpp0000644000000000000000000000341313111512442021776 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2016 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColourMapComboBox.h" #include "layer/ColourMapper.h" #include "base/Debug.h" #include #include using namespace std; ColourMapComboBox::ColourMapComboBox(bool includeSwatches, QWidget *parent) : NotifyingComboBox(parent), m_includeSwatches(includeSwatches) { setEditable(false); rebuild(); connect(this, SIGNAL(activated(int)), this, SLOT(comboActivated(int))); if (count() < 20 && count() > maxVisibleItems()) { setMaxVisibleItems(count()); } } void ColourMapComboBox::comboActivated(int index) { emit colourMapChanged(index); } void ColourMapComboBox::rebuild() { blockSignals(true); int ix = currentIndex(); clear(); int size = (QFontMetrics(QFont()).height() * 2) / 3; if (size < 12) size = 12; for (int i = 0; i < ColourMapper::getColourMapCount(); ++i) { QString name = ColourMapper::getColourMapName(i); if (m_includeSwatches) { ColourMapper mapper(i, 0.0, 1.0); addItem(mapper.getExamplePixmap(QSize(size * 2, size)), name); } else { addItem(name); } } setCurrentIndex(ix); blockSignals(false); } sonic-visualiser-3.0.3/svgui/widgets/ColourMapComboBox.h0000644000000000000000000000205313111512442021442 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2016 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_COLOURMAP_COMBO_BOX_H #define SV_COLOURMAP_COMBO_BOX_H #include "NotifyingComboBox.h" /** * Colour map picker combo box with optional swatches */ class ColourMapComboBox : public NotifyingComboBox { Q_OBJECT public: ColourMapComboBox(bool includeSwatches, QWidget *parent = 0); signals: void colourMapChanged(int index); private slots: void rebuild(); void comboActivated(int); private: bool m_includeSwatches; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ColourNameDialog.cpp0000644000000000000000000000564413111512442021640 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ColourNameDialog.h" #include #include #include #include #include #include #include #include ColourNameDialog::ColourNameDialog(QString title, QString message, QColor colour, QString defaultName, QWidget *parent) : QDialog(parent), m_colour(colour) { setWindowTitle(title); QGridLayout *layout = new QGridLayout(this); QLabel *label = new QLabel(message, this); layout->addWidget(label, 0, 0, 1, 2); m_colourLabel = new QLabel(this); layout->addWidget(m_colourLabel, 1, 1); m_textField = new QLineEdit(defaultName, this); layout->addWidget(m_textField, 1, 0); connect(m_textField, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &))); m_darkBackground = new QCheckBox(this); layout->addWidget(m_darkBackground, 2, 0); m_darkBackground->setChecked (colour.red() + colour.green() + colour.blue() > 384); fillColourLabel(); connect(m_darkBackground, SIGNAL(stateChanged(int)), this, SLOT(darkBackgroundChanged(int))); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, 3, 0, 1, 2); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); m_okButton = bb->button(QDialogButtonBox::Ok); m_okButton->setEnabled(defaultName != ""); } void ColourNameDialog::showDarkBackgroundCheckbox(QString text) { m_darkBackground->setText(text); m_darkBackground->show(); } bool ColourNameDialog::isDarkBackgroundChecked() const { return m_darkBackground->isChecked(); } void ColourNameDialog::darkBackgroundChanged(int) { fillColourLabel(); } void ColourNameDialog::textChanged(const QString &text) { m_okButton->setEnabled(text != ""); } void ColourNameDialog::fillColourLabel() { QPixmap pmap(20, 20); pmap.fill(m_darkBackground->isChecked() ? Qt::black : Qt::white); QPainter paint(&pmap); paint.setPen(m_colour); paint.setBrush(m_colour); paint.drawRect(2, 2, 15, 15); m_colourLabel->setPixmap(pmap); } QString ColourNameDialog::getColourName() const { return m_textField->text(); } sonic-visualiser-3.0.3/svgui/widgets/ColourNameDialog.h0000644000000000000000000000255313111512442021301 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _COLOUR_NAME_DIALOG_H_ #define _COLOUR_NAME_DIALOG_H_ #include #include #include class QLabel; class QLineEdit; class QCheckBox; class QPushButton; class ColourNameDialog : public QDialog { Q_OBJECT public: ColourNameDialog(QString title, QString message, QColor colour, QString defaultName, QWidget *parent = 0); void showDarkBackgroundCheckbox(QString text); QString getColourName() const; bool isDarkBackgroundChecked() const; protected slots: void darkBackgroundChanged(int); void textChanged(const QString &); protected: QColor m_colour; QLabel *m_colourLabel; QLineEdit *m_textField; QPushButton *m_okButton; QCheckBox *m_darkBackground; void fillColourLabel(); }; #endif sonic-visualiser-3.0.3/svgui/widgets/CommandHistory.cpp0000644000000000000000000003237213111512442021412 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor, copyright 2000-2006 Chris Cannam, distributed under the GNU General Public License. This file contains traces of the KCommandHistory class from the KDE project, copyright 2000 Werner Trobin and David Faure and distributed under the GNU Lesser General Public License. */ #include "CommandHistory.h" #include "base/Command.h" #include "IconLoader.h" #include #include #include #include #include #include #include #include //#define DEBUG_COMMAND_HISTORY 1 CommandHistory *CommandHistory::m_instance = 0; CommandHistory::CommandHistory() : m_undoLimit(50), m_redoLimit(50), m_menuLimit(15), m_savedAt(0), m_currentCompound(0), m_executeCompound(false), m_currentBundle(0), m_bundling(false), m_bundleTimer(0), m_bundleTimeout(3000) { IconLoader loader; QIcon undoIcon(loader.load("undo")); QIcon redoIcon(loader.load("redo")); m_undoAction = new QAction(undoIcon, ("&Undo"), this); m_undoAction->setShortcut(tr("Ctrl+Z")); m_undoAction->setStatusTip(tr("Undo the last editing operation")); connect(m_undoAction, SIGNAL(triggered()), this, SLOT(undo())); m_undoMenuAction = new QAction(undoIcon, tr("&Undo"), this); connect(m_undoMenuAction, SIGNAL(triggered()), this, SLOT(undo())); m_undoMenu = new QMenu(tr("&Undo")); m_undoMenuAction->setMenu(m_undoMenu); connect(m_undoMenu, SIGNAL(triggered(QAction *)), this, SLOT(undoActivated(QAction*))); m_redoAction = new QAction(redoIcon, tr("Re&do"), this); m_redoAction->setShortcut(tr("Ctrl+Shift+Z")); m_redoAction->setStatusTip(tr("Redo the last operation that was undone")); connect(m_redoAction, SIGNAL(triggered()), this, SLOT(redo())); m_redoMenuAction = new QAction(redoIcon, tr("Re&do"), this); connect(m_redoMenuAction, SIGNAL(triggered()), this, SLOT(redo())); m_redoMenu = new QMenu(tr("Re&do")); m_redoMenuAction->setMenu(m_redoMenu); connect(m_redoMenu, SIGNAL(triggered(QAction *)), this, SLOT(redoActivated(QAction*))); } CommandHistory::~CommandHistory() { m_savedAt = -1; clearStack(m_undoStack); clearStack(m_redoStack); delete m_undoMenu; delete m_redoMenu; } CommandHistory * CommandHistory::getInstance() { if (!m_instance) m_instance = new CommandHistory(); return m_instance; } void CommandHistory::clear() { #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::clear()" << endl; #endif closeBundle(); m_savedAt = -1; clearStack(m_undoStack); clearStack(m_redoStack); updateActions(); } void CommandHistory::registerMenu(QMenu *menu) { menu->addAction(m_undoAction); menu->addAction(m_redoAction); } void CommandHistory::registerToolbar(QToolBar *toolbar) { toolbar->addAction(m_undoMenuAction); toolbar->addAction(m_redoMenuAction); } void CommandHistory::addCommand(Command *command) { if (!command) return; if (m_currentCompound) { addToCompound(command, m_executeCompound); return; } addCommand(command, true); } void CommandHistory::addCommand(Command *command, bool execute, bool bundle) { if (!command) return; #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::addCommand: " << command->getName() << " of type " << typeid(*command).name() << " at " << command << ": execute = " << execute << ", bundle = " << bundle << " (m_currentCompound = " << m_currentCompound << ", m_currentBundle = " << m_currentBundle << ")" << endl; #endif if (m_currentCompound) { addToCompound(command, execute); return; } if (bundle) { addToBundle(command, execute); return; } else if (m_currentBundle) { closeBundle(); } #ifdef DEBUG_COMMAND_HISTORY if (!m_redoStack.empty()) { cerr << "CommandHistory::clearing redo stack" << endl; } #endif // We can't redo after adding a command clearStack(m_redoStack); // can we reach savedAt? if ((int)m_undoStack.size() < m_savedAt) m_savedAt = -1; // nope m_undoStack.push(command); clipCommands(); if (execute) { command->execute(); } // Emit even if we aren't executing the command, because // someone must have executed it for this to make any sense emit commandExecuted(); emit commandExecuted(command); if (!m_bundling) emit activity(command->getName()); updateActions(); } void CommandHistory::addToBundle(Command *command, bool execute) { if (m_currentBundle) { if (!command || (command->getName() != m_currentBundleName)) { #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::addToBundle: " << command->getName() << ": closing current bundle" << endl; #endif closeBundle(); } } if (!command) return; if (!m_currentBundle) { #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::addToBundle: " << command->getName() << ": creating new bundle" << endl; #endif // need to addCommand before setting m_currentBundle, as addCommand // with bundle false will reset m_currentBundle to 0 MacroCommand *mc = new BundleCommand(command->getName()); m_bundling = true; addCommand(mc, false); m_bundling = false; m_currentBundle = mc; m_currentBundleName = command->getName(); } #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::addToBundle: " << command->getName() << ": adding to bundle" << endl; #endif if (execute) command->execute(); m_currentBundle->addCommand(command); // Emit even if we aren't executing the command, because // someone must have executed it for this to make any sense emit commandExecuted(); emit commandExecuted(command); updateActions(); delete m_bundleTimer; m_bundleTimer = new QTimer(this); connect(m_bundleTimer, SIGNAL(timeout()), this, SLOT(bundleTimerTimeout())); m_bundleTimer->start(m_bundleTimeout); } void CommandHistory::closeBundle() { if (m_currentBundle) { #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::closeBundle" << endl; #endif emit activity(m_currentBundle->getName()); } m_currentBundle = 0; m_currentBundleName = ""; } void CommandHistory::bundleTimerTimeout() { #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::bundleTimerTimeout: bundle is " << m_currentBundle << endl; #endif closeBundle(); } void CommandHistory::addToCompound(Command *command, bool execute) { if (!m_currentCompound) { cerr << "CommandHistory::addToCompound: ERROR: no compound operation in progress!" << endl; return; } #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::addToCompound[" << m_currentCompound->getName() << "]: " << command->getName() << " (exec: " << execute << ")" << endl; #endif if (execute) command->execute(); m_currentCompound->addCommand(command); } void CommandHistory::startCompoundOperation(QString name, bool execute) { if (m_currentCompound) { cerr << "CommandHistory::startCompoundOperation: ERROR: compound operation already in progress!" << endl; cerr << "(name is " << m_currentCompound->getName() << ")" << endl; return; } #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::startCompoundOperation: " << name << " (exec: " << execute << ")" << endl; #endif closeBundle(); m_currentCompound = new MacroCommand(name); m_executeCompound = execute; } void CommandHistory::endCompoundOperation() { if (!m_currentCompound) { cerr << "CommandHistory::endCompoundOperation: ERROR: no compound operation in progress!" << endl; return; } #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::endCompoundOperation: " << m_currentCompound->getName() << endl; #endif MacroCommand *toAdd = m_currentCompound; m_currentCompound = 0; if (toAdd->haveCommands()) { // We don't execute the macro command here, because we have // been executing the individual commands as we went along if // m_executeCompound was true. addCommand(toAdd, false); } } void CommandHistory::addExecutedCommand(Command *command) { addCommand(command, false); } void CommandHistory::addCommandAndExecute(Command *command) { addCommand(command, true); } void CommandHistory::undo() { if (m_undoStack.empty()) return; #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::undo()" << endl; #endif closeBundle(); Command *command = m_undoStack.top(); command->unexecute(); emit commandExecuted(); emit commandUnexecuted(command); emit activity(tr("Undo %1").arg(command->getName())); m_redoStack.push(command); m_undoStack.pop(); clipCommands(); updateActions(); if ((int)m_undoStack.size() == m_savedAt) emit documentRestored(); } void CommandHistory::redo() { if (m_redoStack.empty()) return; #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::redo()" << endl; #endif closeBundle(); Command *command = m_redoStack.top(); command->execute(); emit commandExecuted(); emit commandExecuted(command); emit activity(tr("Redo %1").arg(command->getName())); m_undoStack.push(command); m_redoStack.pop(); // no need to clip updateActions(); if ((int)m_undoStack.size() == m_savedAt) emit documentRestored(); } void CommandHistory::setUndoLimit(int limit) { if (limit > 0 && limit != m_undoLimit) { m_undoLimit = limit; clipCommands(); } } void CommandHistory::setRedoLimit(int limit) { if (limit > 0 && limit != m_redoLimit) { m_redoLimit = limit; clipCommands(); } } void CommandHistory::setMenuLimit(int limit) { m_menuLimit = limit; updateActions(); } void CommandHistory::setBundleTimeout(int ms) { m_bundleTimeout = ms; } void CommandHistory::documentSaved() { closeBundle(); m_savedAt = int(m_undoStack.size()); } void CommandHistory::clipCommands() { if (int(m_undoStack.size()) > m_undoLimit) { m_savedAt -= (int(m_undoStack.size()) - m_undoLimit); } clipStack(m_undoStack, m_undoLimit); clipStack(m_redoStack, m_redoLimit); } void CommandHistory::clipStack(CommandStack &stack, int limit) { int i; if ((int)stack.size() > limit) { CommandStack tempStack; for (i = 0; i < limit; ++i) { #ifdef DEBUG_COMMAND_HISTORY Command *command = stack.top(); cerr << "CommandHistory::clipStack: Saving recent command: " << command->getName() << " at " << command << endl; #endif tempStack.push(stack.top()); stack.pop(); } clearStack(stack); for (i = 0; i < m_undoLimit; ++i) { stack.push(tempStack.top()); tempStack.pop(); } } } void CommandHistory::clearStack(CommandStack &stack) { while (!stack.empty()) { Command *command = stack.top(); // Not safe to call getName() on a command about to be deleted #ifdef DEBUG_COMMAND_HISTORY cerr << "CommandHistory::clearStack: About to delete command " << command << endl; #endif delete command; stack.pop(); } } void CommandHistory::undoActivated(QAction *action) { int pos = m_actionCounts[action]; for (int i = 0; i <= pos; ++i) { undo(); } } void CommandHistory::redoActivated(QAction *action) { int pos = m_actionCounts[action]; for (int i = 0; i <= pos; ++i) { redo(); } } void CommandHistory::updateActions() { m_actionCounts.clear(); for (int undo = 0; undo <= 1; ++undo) { QAction *action(undo ? m_undoAction : m_redoAction); QAction *menuAction(undo ? m_undoMenuAction : m_redoMenuAction); QMenu *menu(undo ? m_undoMenu : m_redoMenu); CommandStack &stack(undo ? m_undoStack : m_redoStack); if (stack.empty()) { QString text(undo ? tr("Nothing to undo") : tr("Nothing to redo")); action->setEnabled(false); action->setText(text); menuAction->setEnabled(false); menuAction->setText(text); } else { action->setEnabled(true); menuAction->setEnabled(true); QString commandName = stack.top()->getName(); commandName.replace(QRegExp("&"), ""); QString text = (undo ? tr("&Undo %1") : tr("Re&do %1")) .arg(commandName); action->setText(text); menuAction->setText(text); } menu->clear(); CommandStack tempStack; int j = 0; while (j < m_menuLimit && !stack.empty()) { Command *command = stack.top(); tempStack.push(command); stack.pop(); QString commandName = command->getName(); commandName.replace(QRegExp("&"), ""); QString text; if (undo) text = tr("&Undo %1").arg(commandName); else text = tr("Re&do %1").arg(commandName); QAction *action = menu->addAction(text); m_actionCounts[action] = j++; } while (!tempStack.empty()) { stack.push(tempStack.top()); tempStack.pop(); } } } sonic-visualiser-3.0.3/svgui/widgets/CommandHistory.h0000644000000000000000000001573213111512442021060 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor, copyright 2000-2006 Chris Cannam, distributed under the GNU General Public License. This file contains traces of the KCommandHistory class from the KDE project, copyright 2000 Werner Trobin and David Faure and distributed under the GNU Lesser General Public License. */ #ifndef _MULTI_VIEW_COMMAND_HISTORY_H_ #define _MULTI_VIEW_COMMAND_HISTORY_H_ #include #include #include #include #include class Command; class MacroCommand; class QAction; class QMenu; class QToolBar; class QTimer; /** * The CommandHistory class stores a list of executed commands and * maintains Undo and Redo actions synchronised with those commands. * * CommandHistory allows you to associate more than one Undo and Redo * menu or toolbar with the same command history, and it keeps them * all up-to-date at once. This makes it effective in systems where * multiple views may be editing the same data. */ class CommandHistory : public QObject { Q_OBJECT public: virtual ~CommandHistory(); static CommandHistory *getInstance(); void clear(); void registerMenu(QMenu *menu); void registerToolbar(QToolBar *toolbar); /** * Add a command to the command history. * * The command will normally be executed before being added; but * if a compound operation is in use (see startCompoundOperation * below), the execute status of the compound operation will * determine whether the command is executed or not. */ void addCommand(Command *command); /** * Add a command to the command history. * * If execute is true, the command will be executed before being * added. Otherwise it will be assumed to have been already * executed -- a command should not be added to the history unless * its work has actually been done somehow! * * If a compound operation is in use (see startCompoundOperation * below), the execute value passed to this method will override * the execute status of the compound operation. In this way it's * possible to have a compound operation mixing both to-execute * and pre-executed commands. * * If bundle is true, the command will be a candidate for bundling * with any adjacent bundleable commands that have the same name, * into a single compound command. This is useful for small * commands that may be executed repeatedly altering the same data * (e.g. type text, set a parameter) whose number and extent is * not known in advance. The bundle parameter will be ignored if * a compound operation is already in use. */ void addCommand(Command *command, bool execute, bool bundle = false); /// Return the maximum number of items in the undo history. int getUndoLimit() const { return m_undoLimit; } /// Set the maximum number of items in the undo history. void setUndoLimit(int limit); /// Return the maximum number of items in the redo history. int getRedoLimit() const { return m_redoLimit; } /// Set the maximum number of items in the redo history. void setRedoLimit(int limit); /// Return the maximum number of items visible in undo and redo menus. int getMenuLimit() const { return m_menuLimit; } /// Set the maximum number of items in the menus. void setMenuLimit(int limit); /// Return the time after which a bundle will be closed if nothing is added. int getBundleTimeout() const { return m_bundleTimeout; } /// Set the time after which a bundle will be closed if nothing is added. void setBundleTimeout(int msec); /// Start recording commands to batch up into a single compound command. void startCompoundOperation(QString name, bool execute); /// Finish recording commands and store the compound command. void endCompoundOperation(); public slots: /** * Checkpoint function that should be called when the document is * saved. If the undo/redo stack later returns to the point at * which the document was saved, the documentRestored signal will * be emitted. */ virtual void documentSaved(); /** * Add a command to the history that has already been executed, * without executing it again. Equivalent to addCommand(command, false). */ void addExecutedCommand(Command *); /** * Add a command to the history and also execute it. Equivalent * to addCommand(command, true). */ void addCommandAndExecute(Command *); void undo(); void redo(); protected slots: void undoActivated(QAction *); void redoActivated(QAction *); void bundleTimerTimeout(); signals: /** * Emitted whenever a command has just been executed or * unexecuted, whether by addCommand, undo, or redo. */ void commandExecuted(); /** * Emitted whenever a command has just been executed, whether by * addCommand or redo. */ void commandExecuted(Command *); /** * Emitted whenever a command has just been unexecuted, whether by * addCommand or undo. */ void commandUnexecuted(Command *); /** * Emitted when the undo/redo stack has reached the same state at * which the documentSaved slot was last called. */ void documentRestored(); /** * Emitted when some activity happened (for activity logging). */ void activity(QString); protected: CommandHistory(); static CommandHistory *m_instance; QAction *m_undoAction; QAction *m_redoAction; QAction *m_undoMenuAction; QAction *m_redoMenuAction; QMenu *m_undoMenu; QMenu *m_redoMenu; std::map m_actionCounts; typedef std::stack CommandStack; CommandStack m_undoStack; CommandStack m_redoStack; int m_undoLimit; int m_redoLimit; int m_menuLimit; int m_savedAt; MacroCommand *m_currentCompound; bool m_executeCompound; void addToCompound(Command *command, bool execute); MacroCommand *m_currentBundle; bool m_bundling; QString m_currentBundleName; QTimer *m_bundleTimer; int m_bundleTimeout; void addToBundle(Command *command, bool execute); void closeBundle(); void updateActions(); void clipCommands(); void clipStack(CommandStack &stack, int limit); void clearStack(CommandStack &stack); }; #endif sonic-visualiser-3.0.3/svgui/widgets/Fader.cpp0000644000000000000000000001475713111512442017502 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /** * Horizontal audio fader and meter widget. * * Based on the vertical fader and meter widget from the Hydrogen drum * machine. (Any poor taste that has crept in during the * modifications for this application is entirely my own, however.) * The following copyright notice applies to code from this file, and * also to the files in icons/fader_*.png (also modified by me). --cc */ /** * Hydrogen * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net] * http://www.hydrogen-music.org */ #include "Fader.h" #include "base/AudioLevel.h" #include #include #include #include #include #include #include Fader::Fader(QWidget *parent, bool withoutKnob) : QWidget(parent), m_withoutKnob(withoutKnob), m_value(1.0), m_peakLeft(0.0), m_peakRight(0.0), m_mousePressed(false), m_mousePressX(0), m_mousePressValue(0) { setMinimumSize(116, 23); setMaximumSize(116, 23); resize(116, 23); QString background_path = ":/icons/fader_background.png"; bool ok = m_back.load(background_path); if (ok == false) { cerr << "Fader: Error loading pixmap" << endl; } QString leds_path = ":/icons/fader_leds.png"; ok = m_leds.load(leds_path); if (ok == false) { cerr << "Error loading pixmap" << endl; } QString knob_path = ":/icons/fader_knob.png"; ok = m_knob.load(knob_path); if (ok == false) { cerr << "Error loading pixmap" << endl; } QString clip_path = ":/icons/fader_knob_red.png"; ok = m_clip.load(clip_path); if (ok == false) { cerr << "Error loading pixmap" << endl; } } Fader::~Fader() { } void Fader::mouseMoveEvent(QMouseEvent *ev) { if (ev->button() == Qt::MidButton) { setValue(1.0); emit valueChanged(1.0); update(); ev->accept(); return; } if (!m_mousePressed) return; int x = ev->x(); int diff = x - m_mousePressX; if (diff == 0) return; int vx = AudioLevel::multiplier_to_fader (m_mousePressValue, getMaxX(), AudioLevel::LongFader); vx += diff; if (vx > getMaxX()) vx = getMaxX(); if (vx < 0) vx = 0; float fval = (float)AudioLevel::fader_to_multiplier (vx, getMaxX(), AudioLevel::LongFader); setValue(fval); emit valueChanged(fval); ev->accept(); } void Fader::mouseReleaseEvent(QMouseEvent *ev) { if (m_mousePressed) { mouseMoveEvent(ev); m_mousePressed = false; } } void Fader::mouseDoubleClickEvent(QMouseEvent *) { bool ok = false; float min = (float)AudioLevel::fader_to_dB (0, getMaxX(), AudioLevel::LongFader); float max = (float)AudioLevel::fader_to_dB (getMaxX(), getMaxX(), AudioLevel::LongFader); float deft = (float)AudioLevel::multiplier_to_dB(m_value); float dB = (float)QInputDialog::getDouble (this, tr("Enter new fader level"), tr("New fader level, from %1 to %2 dBFS:").arg(min).arg(max), deft, min, max, 3, &ok); if (ok) { float value = (float)AudioLevel::dB_to_multiplier(dB); setValue(value); emit valueChanged(value); update(); } } void Fader::mousePressEvent(QMouseEvent *ev) { if (ev->button() == Qt::MidButton || ((ev->button() == Qt::LeftButton) && (ev->modifiers() & Qt::ControlModifier))) { setValue(1.0); emit valueChanged(1.0); update(); return; } if (ev->button() != Qt::LeftButton) return; m_mousePressed = true; m_mousePressX = ev->x(); m_mousePressValue = getValue(); } void Fader::wheelEvent(QWheelEvent *ev) { ev->accept(); //!!! needs improvement if (ev->delta() > 0) { setValue(m_value * 1.f); } else { setValue(m_value / 1.f); } update(); emit valueChanged(getValue()); } void Fader::enterEvent(QEvent *) { emit mouseEntered(); } void Fader::leaveEvent(QEvent *) { emit mouseLeft(); } void Fader::setValue(float v) { float max = (float)AudioLevel::dB_to_multiplier(10.0); if (v > max) { v = max; } else if (v < 0.0) { v = 0.0; } if (m_value != v) { m_value = v; float db = (float)AudioLevel::multiplier_to_dB(m_value); QString text; if (db <= AudioLevel::DB_FLOOR) { text = tr("Level: Off"); } else { text = tr("Level: %1%2.%3%4 dB") .arg(db < 0.0 ? "-" : "") .arg(abs(int(db))) .arg(abs(int(db * 10.0) % 10)) .arg(abs(int(db * 100.0) % 10)); } cerr << "Fader: setting tooltip to \"" << text << "\"" << endl; QWidget::setToolTip(text); update(); } } float Fader::getValue() { return m_value; } void Fader::setPeakLeft(float peak) { if (this->m_peakLeft != peak) { this->m_peakLeft = peak; update(); } } void Fader::setPeakRight(float peak) { if (this->m_peakRight != peak) { this->m_peakRight = peak; update(); } } void Fader::paintEvent(QPaintEvent *) { QPainter painter(this); // background painter.drawPixmap(rect(), m_back, QRect(0, 0, 116, 23)); int offset_L = AudioLevel::multiplier_to_fader(m_peakLeft, 116, AudioLevel::IEC268LongMeter); painter.drawPixmap(QRect(0, 0, offset_L, 11), m_leds, QRect(0, 0, offset_L, 11)); int offset_R = AudioLevel::multiplier_to_fader(m_peakRight, 116, AudioLevel::IEC268LongMeter); painter.drawPixmap(QRect(0, 11, offset_R, 11), m_leds, QRect(0, 11, offset_R, 11)); if (m_withoutKnob == false) { static const uint knob_width = 29; static const uint knob_height = 9; int x = AudioLevel::multiplier_to_fader(m_value, 116 - knob_width, AudioLevel::LongFader); bool clipping = (m_peakLeft > 1.0 || m_peakRight > 1.0); painter.drawPixmap(QRect(x, 7, knob_width, knob_height), clipping ? m_clip : m_knob, QRect(0, 0, knob_width, knob_height)); } } int Fader::getMaxX() const { return 116 - 12; } sonic-visualiser-3.0.3/svgui/widgets/Fader.h0000644000000000000000000000411013111512442017125 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef FADER_H #define FADER_H /** * Horizontal audio fader and meter widget. * Based on the vertical fader and meter widget from: * * Hydrogen * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net] * http://www.hydrogen-music.org */ #include #include #include #include #include #include #include #include "base/Debug.h" class Fader : public QWidget { Q_OBJECT public: Fader(QWidget *parent, bool withoutKnob = false); ~Fader(); void setValue(float newValue); float getValue(); void setPeakLeft(float); float getPeakLeft() { return m_peakLeft; } void setPeakRight(float); float getPeakRight() { return m_peakRight; } signals: void valueChanged(float); // 0.0 -> 1.0 void mouseEntered(); void mouseLeft(); protected: virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseDoubleClickEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void wheelEvent( QWheelEvent *ev ); virtual void paintEvent(QPaintEvent *ev); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); int getMaxX() const; bool m_withoutKnob; float m_value; float m_peakLeft; float m_peakRight; bool m_mousePressed; int m_mousePressX; float m_mousePressValue; QPixmap m_back; QPixmap m_leds; QPixmap m_knob; QPixmap m_clip; }; #endif sonic-visualiser-3.0.3/svgui/widgets/IconLoader.cpp0000644000000000000000000001244613111512442020471 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "IconLoader.h" #include #include #include #include #include #include #include #include #include "base/Debug.h" using namespace std; static set autoInvertExceptions { // These are the icons that look OK in their default colours, even // in a colour scheme with a black background. (They may also be // icons that would look worse if we tried to auto-invert them.) // If we have icons that look bad when auto-inverted but that are // not suitable for use without being inverted, we'll need to // supply inverted versions -- the loader will load xx_inverse.png // in preference to xx.png if a dark background is found.) "fileclose", "filenew", "fileopen", "fileopenaudio", "fileopensession", "filesave", "filesaveas", "filesaveas-sv", "help", "editcut", "editcopy", "editpaste", "editdelete", "exit", "zoom-fit", "zoom-in", "zoom-out", "zoom" }; static vector sizes { 0, 16, 22, 24, 32, 48, 64, 128 }; QIcon IconLoader::load(QString name) { QIcon icon; for (int sz: sizes) { QPixmap pmap(loadPixmap(name, sz)); if (!pmap.isNull()) icon.addPixmap(pmap); } return icon; } bool IconLoader::shouldInvert() const { QColor bg = QApplication::palette().window().color(); bool darkBackground = (bg.red() + bg.green() + bg.blue() <= 384); return darkBackground; } bool IconLoader::shouldAutoInvert(QString name) const { if (shouldInvert()) { return (autoInvertExceptions.find(name) == autoInvertExceptions.end()); } else { return false; } } QPixmap IconLoader::loadPixmap(QString name, int size) { bool invert = shouldInvert(); QString scalableName, nonScalableName; QPixmap pmap; nonScalableName = makeNonScalableFilename(name, size, invert); pmap = QPixmap(nonScalableName); if (!pmap.isNull()) return pmap; if (size > 0) { scalableName = makeScalableFilename(name, invert); pmap = loadScalable(scalableName, size); if (!pmap.isNull()) return pmap; } if (invert && shouldAutoInvert(name)) { nonScalableName = makeNonScalableFilename(name, size, false); pmap = QPixmap(nonScalableName); if (!pmap.isNull()) return invertPixmap(pmap); if (size > 0) { scalableName = makeScalableFilename(name, false); pmap = loadScalable(scalableName, size); if (!pmap.isNull()) return invertPixmap(pmap); } } return QPixmap(); } QPixmap IconLoader::loadScalable(QString name, int size) { if (!QFile(name).exists()) { // cerr << "loadScalable: no such file as: \"" << name << "\"" << endl; return QPixmap(); } QPixmap pmap(size, size); pmap.fill(Qt::transparent); QSvgRenderer renderer(name); QPainter painter; painter.begin(&pmap); // cerr << "calling renderer for " << name << " at size " << size << "..." << endl; renderer.render(&painter); // cerr << "renderer completed" << endl; painter.end(); return pmap; } QString IconLoader::makeNonScalableFilename(QString name, int size, bool invert) { if (invert) { if (size == 0) { return QString(":icons/%1_inverse.png").arg(name); } else { return QString(":icons/%1-%2_inverse.png").arg(name).arg(size); } } else { if (size == 0) { return QString(":icons/%1.png").arg(name); } else { return QString(":icons/%1-%2.png").arg(name).arg(size); } } } QString IconLoader::makeScalableFilename(QString name, bool invert) { if (invert) { return QString(":icons/scalable/%1_inverse.svg").arg(name); } else { return QString(":icons/scalable/%1.svg").arg(name); } } QPixmap IconLoader::invertPixmap(QPixmap pmap) { // No suitable inverted icon found for black background; try to // auto-invert the default one QImage img = pmap.toImage().convertToFormat(QImage::Format_ARGB32); for (int y = 0; y < img.height(); ++y) { for (int x = 0; x < img.width(); ++x) { QRgb rgba = img.pixel(x, y); QColor colour = QColor (qRed(rgba), qGreen(rgba), qBlue(rgba), qAlpha(rgba)); int alpha = colour.alpha(); if (colour.saturation() < 5 && colour.alpha() > 10) { colour.setHsv(colour.hue(), colour.saturation(), 255 - colour.value()); colour.setAlpha(alpha); img.setPixel(x, y, colour.rgba()); } } } pmap = QPixmap::fromImage(img); return pmap; } sonic-visualiser-3.0.3/svgui/widgets/IconLoader.h0000644000000000000000000000210013111512442020120 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _ICON_LOADER_H_ #define _ICON_LOADER_H_ #include class IconLoader { public: IconLoader() { } virtual ~IconLoader() { } QIcon load(QString name); private: bool shouldInvert() const; bool shouldAutoInvert(QString) const; QPixmap loadPixmap(QString, int); QPixmap loadScalable(QString, int); QPixmap invertPixmap(QPixmap); QString makeScalableFilename(QString, bool); QString makeNonScalableFilename(QString, int, bool); }; #endif sonic-visualiser-3.0.3/svgui/widgets/ImageDialog.cpp0000644000000000000000000001400613111512442020606 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ImageDialog.h" #include #include #include #include #include #include #include #include #include #include #include "ProgressDialog.h" #include "data/fileio/FileSource.h" #include "InteractiveFileFinder.h" #include ImageDialog::ImageDialog(QString title, QString image, QString label, QWidget *parent) : QDialog(parent), m_imagePreview(0), m_remoteFile(0) { setWindowTitle(title); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *databox = new QGroupBox(tr("Image")); QGridLayout *subgrid = new QGridLayout; databox->setLayout(subgrid); int row = 0; subgrid->addWidget(new QLabel(tr("Label:")), row, 0); m_labelEdit = new QLineEdit; subgrid->addWidget(m_labelEdit, row, 1, 1, 2); ++row; subgrid->addWidget(new QLabel(tr("File or URL:")), row, 0); m_imageEdit = new QLineEdit; subgrid->addWidget(m_imageEdit, row, 1, 1, 1); connect(m_imageEdit, SIGNAL(textEdited(const QString &)), this, SLOT(imageEditEdited(const QString &))); connect(m_imageEdit, SIGNAL(editingFinished()), this, SLOT(imageEditEdited())); QPushButton *browse = new QPushButton(tr("Browse...")); connect(browse, SIGNAL(clicked()), this, SLOT(browseClicked())); subgrid->addWidget(browse, row, 2, 1, 1); ++row; QGroupBox *previewbox = new QGroupBox(tr("Preview")); subgrid = new QGridLayout; previewbox->setLayout(subgrid); m_imagePreview = new QLabel; m_imagePreview->setAlignment(Qt::AlignCenter); subgrid->addWidget(m_imagePreview, 0, 0); m_imagePreview->setMinimumSize(QSize(100, 100)); QDesktopWidget *desktop = QApplication::desktop(); m_imagePreview->setMaximumSize(QSize((desktop->width() * 2) / 3, (desktop->height() * 2) / 3)); grid->addWidget(databox, 0, 0); grid->addWidget(previewbox, 1, 0); grid->setRowStretch(1, 10); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); grid->addWidget(bb, 2, 0, 1, 1); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); m_okButton = bb->button(QDialogButtonBox::Ok); m_okButton->setEnabled(false); if (image != "") setImage(image); if (label != "") setLabel(label); } ImageDialog::~ImageDialog() { delete m_remoteFile; } QString ImageDialog::getImage() { return m_loadedImageFile; } QPixmap ImageDialog::getPixmap() { return m_loadedImage; } QString ImageDialog::getLabel() { return m_labelEdit->text(); } void ImageDialog::setImage(QString image) { m_imageEdit->setText(image); updatePreview(); } void ImageDialog::setLabel(QString label) { m_labelEdit->setText(label); } void ImageDialog::resizeEvent(QResizeEvent *) { updatePreview(); } void ImageDialog::imageEditEdited(const QString &s) { if (s.startsWith("http:") || s.startsWith("ftp:")) { return; } updatePreview(); } void ImageDialog::imageEditEdited() { updatePreview(); } void ImageDialog::updatePreview() { if (!m_imagePreview) return; QString img = m_imageEdit->text(); m_okButton->setEnabled(img != ""); if (img != m_loadedImageFile) { QString fileName = img; delete m_remoteFile; m_remoteFile = 0; if (FileSource::isRemote(fileName)) { QUrl url(fileName); if (!FileSource::canHandleScheme(url)) { QMessageBox::critical(this, tr("Unsupported scheme in URL"), tr("The URL scheme \"%1\" is not supported") .arg(url.scheme())); } else { ProgressDialog dialog(tr("Opening image URL..."), true, 2000); m_remoteFile = new FileSource(url, &dialog); m_remoteFile->waitForData(); if (!m_remoteFile->isOK()) { QMessageBox::critical(this, tr("File download failed"), tr("Failed to download URL \"%1\": %2") .arg(url.toString()).arg(m_remoteFile->getErrorString())); delete m_remoteFile; m_remoteFile = 0; } else { fileName = m_remoteFile->getLocalFilename(); } } } // cerr << "image filename: \"" << fileName << "\"" << endl; m_loadedImage = QPixmap(fileName); m_loadedImageFile = img; } QSize sz(m_imagePreview->size()); int m = m_imagePreview->margin() * 2; sz -= QSize(m, m); if (m_loadedImage.isNull()) { m_imagePreview->setPixmap(QPixmap()); } else { m_imagePreview->setPixmap(m_loadedImage.scaled (sz, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } } void ImageDialog::browseClicked() { QString file = InteractiveFileFinder::getInstance()->getOpenFileName(FileFinder::ImageFile); if (file != "") { setImage(file); emit imageChanged(file); } } sonic-visualiser-3.0.3/svgui/widgets/ImageDialog.h0000644000000000000000000000314113111512442020251 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_DIALOG_H_ #define _IMAGE_DIALOG_H_ #include #include class QLineEdit; class QLabel; class QPushButton; class FileSource; class ImageDialog : public QDialog { Q_OBJECT public: ImageDialog(QString title, QString image = "", QString label = "", QWidget *parent = 0); virtual ~ImageDialog(); QString getImage(); QPixmap getPixmap(); QString getLabel(); signals: void imageChanged(QString image); void labelChanged(QString label); public slots: void setImage(QString image); void setLabel(QString label); void updatePreview(); protected slots: void browseClicked(); void imageEditEdited(const QString &); void imageEditEdited(); protected: void resizeEvent(QResizeEvent *); QLineEdit *m_imageEdit; QLineEdit *m_labelEdit; QLabel *m_imagePreview; QString m_loadedImageFile; QPixmap m_loadedImage; QPushButton *m_okButton; FileSource *m_remoteFile; }; #endif sonic-visualiser-3.0.3/svgui/widgets/InteractiveFileFinder.cpp0000644000000000000000000005010213111512442022646 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "InteractiveFileFinder.h" #include "data/fileio/FileSource.h" #include "data/fileio/AudioFileReaderFactory.h" #include "data/fileio/DataFileReaderFactory.h" #include "rdf/RDFImporter.h" #include "rdf/RDFExporter.h" #include #include #include #include #include #include #include InteractiveFileFinder InteractiveFileFinder::m_instance; InteractiveFileFinder::InteractiveFileFinder() : m_sessionExtension("sv"), m_lastLocatedLocation(""), m_parent(0) { FileFinder::registerFileFinder(this); } InteractiveFileFinder::~InteractiveFileFinder() { } void InteractiveFileFinder::setParentWidget(QWidget *parent) { getInstance()->m_parent = parent; } void InteractiveFileFinder::setApplicationSessionExtension(QString extension) { m_sessionExtension = extension; } QString InteractiveFileFinder::getOpenFileName(FileType type, QString fallbackLocation) { QString settingsKeyStub; QString lastPath = fallbackLocation; QString title = tr("Select file"); QString filter = tr("All files (*.*)"); switch (type) { case SessionFile: settingsKeyStub = "session"; title = tr("Select a session file"); filter = tr("%1 session files (*.%1)\nRDF files (%3)\nAll files (*.*)") .arg(QApplication::applicationName()) .arg(m_sessionExtension) .arg(RDFImporter::getKnownExtensions()); break; case AudioFile: settingsKeyStub = "audio"; title = "Select an audio file"; filter = tr("Audio files (%1)\nAll files (*.*)") .arg(AudioFileReaderFactory::getKnownExtensions()); break; case LayerFile: settingsKeyStub = "layer"; filter = tr("All supported files (%1 %2)\nSonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nRDF files (%2)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)") .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; case LayerFileNoMidi: settingsKeyStub = "layer"; filter = tr("All supported files (%1 %2)\nSonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nRDF files (%2)\nText files (*.txt)\nAll files (*.*)") .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; case LayerFileNonSV: settingsKeyStub = "layer"; filter = tr("All supported files (%1 %2)\nComma-separated data files (*.csv)\nSonic Visualiser Layer XML files (*.svl)\nSpace-separated .lab files (*.lab)\nRDF files (%2)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)") .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; case LayerFileNoMidiNonSV: settingsKeyStub = "layer"; filter = tr("All supported files (%1 %2)\nComma-separated data files (*.csv)\nSonic Visualiser Layer XML files (*.svl)\nSpace-separated .lab files (*.lab)\nRDF files (%2)\nText files (*.txt)\nAll files (*.*)") .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; case SessionOrAudioFile: settingsKeyStub = "last"; filter = tr("All supported files (*.sv %1 %2)\n%3 session files (*.%4)\nAudio files (%2)\nRDF files (%1)\nAll files (*.*)") .arg(RDFImporter::getKnownExtensions()) .arg(AudioFileReaderFactory::getKnownExtensions()) .arg(QApplication::applicationName()) .arg(m_sessionExtension); break; case ImageFile: settingsKeyStub = "image"; { QStringList fmts; QList formats = QImageReader::supportedImageFormats(); for (QList::iterator i = formats.begin(); i != formats.end(); ++i) { fmts.push_back(QString("*.%1") .arg(QString::fromLocal8Bit(*i).toLower())); } filter = tr("Image files (%1)\nAll files (*.*)").arg(fmts.join(" ")); } break; case SVGFile: settingsKeyStub = "svg"; filter = tr("Scalable Vector Graphics files (*.svg)\nAll files (*.*)"); break; case CSVFile: settingsKeyStub = "layer"; filter = tr("Comma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nText files (*.txt)\nAll files (*.*)"); break; case AnyFile: settingsKeyStub = "last"; filter = tr("All supported files (*.sv %1 %2 %3)\n%4 session files (*.%5)\nAudio files (%1)\nLayer files (%2)\nRDF files (%3)\nAll files (*.*)") .arg(AudioFileReaderFactory::getKnownExtensions()) .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()) .arg(QApplication::applicationName()) .arg(m_sessionExtension); break; }; if (lastPath == "") { char *home = getenv("HOME"); if (home) lastPath = home; else lastPath = "."; } else if (QFileInfo(lastPath).isDir()) { lastPath = QFileInfo(lastPath).canonicalPath(); } else { lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath(); } QSettings settings; settings.beginGroup("FileFinder"); lastPath = settings.value(settingsKeyStub + "path", lastPath).toString(); QString path = ""; // Use our own QFileDialog just for symmetry with getSaveFileName below QFileDialog dialog(m_parent); dialog.setNameFilters(filter.split('\n')); dialog.setWindowTitle(title); dialog.setDirectory(lastPath); dialog.setAcceptMode(QFileDialog::AcceptOpen); dialog.setFileMode(QFileDialog::ExistingFile); if (dialog.exec()) { QStringList files = dialog.selectedFiles(); if (!files.empty()) path = *files.begin(); QFileInfo fi(path); if (!fi.exists()) { QMessageBox::critical(0, tr("File does not exist"), tr("File not found

    File \"%1\" does not exist").arg(path)); path = ""; } else if (!fi.isReadable()) { QMessageBox::critical(0, tr("File is not readable"), tr("File is not readable

    File \"%1\" can not be read").arg(path)); path = ""; } else if (fi.isDir()) { QMessageBox::critical(0, tr("Directory selected"), tr("Directory selected

    File \"%1\" is a directory").arg(path)); path = ""; } else if (!fi.isFile()) { QMessageBox::critical(0, tr("Non-file selected"), tr("Not a file

    Path \"%1\" is not a file").arg(path)); path = ""; } else if (fi.size() == 0) { QMessageBox::critical(0, tr("File is empty"), tr("File is empty

    File \"%1\" is empty").arg(path)); path = ""; } } if (path != "") { settings.setValue(settingsKeyStub + "path", QFileInfo(path).absoluteDir().canonicalPath()); } return path; } QString InteractiveFileFinder::getSaveFileName(FileType type, QString fallbackLocation) { QString settingsKeyStub; QString lastPath = fallbackLocation; QString title = tr("Select file"); QString filter = tr("All files (*.*)"); switch (type) { case SessionFile: settingsKeyStub = "savesession"; title = tr("Select a session file"); filter = tr("%1 session files (*.%2)\nAll files (*.*)") .arg(QApplication::applicationName()).arg(m_sessionExtension); break; case AudioFile: settingsKeyStub = "saveaudio"; title = "Select an audio file"; title = tr("Select a file to export to"); filter = tr("WAV audio files (*.wav)\nAll files (*.*)"); break; case LayerFile: settingsKeyStub = "savelayer"; title = tr("Select a file to export to"); filter = tr("Sonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nRDF/Turtle files (%1)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)").arg(RDFExporter::getSupportedExtensions()); break; case LayerFileNoMidi: settingsKeyStub = "savelayer"; title = tr("Select a file to export to"); filter = tr("Sonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nRDF/Turtle files (%1)\nText files (*.txt)\nAll files (*.*)").arg(RDFExporter::getSupportedExtensions()); break; case LayerFileNonSV: settingsKeyStub = "savelayer"; title = tr("Select a file to export to"); filter = tr("Comma-separated data files (*.csv)\nSonic Visualiser Layer XML files (*.svl)\nRDF/Turtle files (%1)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)").arg(RDFExporter::getSupportedExtensions()); break; case LayerFileNoMidiNonSV: settingsKeyStub = "savelayer"; title = tr("Select a file to export to"); filter = tr("Comma-separated data files (*.csv)\nSonic Visualiser Layer XML files (*.svl)\nRDF/Turtle files (%1)\nText files (*.txt)\nAll files (*.*)").arg(RDFExporter::getSupportedExtensions()); break; case SessionOrAudioFile: cerr << "ERROR: Internal error: InteractiveFileFinder::getSaveFileName: SessionOrAudioFile cannot be used here" << endl; abort(); case ImageFile: settingsKeyStub = "saveimage"; title = tr("Select a file to export to"); filter = tr("Portable Network Graphics files (*.png)\nAll files (*.*)"); break; case SVGFile: settingsKeyStub = "savesvg"; title = tr("Select a file to export to"); filter = tr("Scalable Vector Graphics files (*.svg)\nAll files (*.*)"); break; case CSVFile: settingsKeyStub = "savelayer"; title = tr("Select a file to export to"); filter = tr("Comma-separated data files (*.csv)\nText files (*.txt)\nAll files (*.*)"); break; case AnyFile: cerr << "ERROR: Internal error: InteractiveFileFinder::getSaveFileName: AnyFile cannot be used here" << endl; abort(); }; if (lastPath == "") { char *home = getenv("HOME"); if (home) lastPath = home; else lastPath = "."; } else if (QFileInfo(lastPath).isDir()) { lastPath = QFileInfo(lastPath).canonicalPath(); } else { lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath(); } QSettings settings; settings.beginGroup("FileFinder"); lastPath = settings.value(settingsKeyStub + "path", lastPath).toString(); QString path = ""; // Use our own QFileDialog instead of static functions, as we may // need to adjust the file extension based on the selected filter QFileDialog dialog(m_parent); QStringList filters = filter.split('\n'); dialog.setNameFilters(filters); dialog.setWindowTitle(title); dialog.setDirectory(lastPath); dialog.setAcceptMode(QFileDialog::AcceptSave); dialog.setFileMode(QFileDialog::AnyFile); dialog.setConfirmOverwrite(false); // we'll do that QString defaultSuffix; if (type == SessionFile) { defaultSuffix = m_sessionExtension; } else if (type == AudioFile) { defaultSuffix = "wav"; } else if (type == ImageFile) { defaultSuffix = "png"; } else if (type == SVGFile) { defaultSuffix = "svg"; } else if (type == CSVFile) { defaultSuffix = "csv"; } defaultSuffix = settings.value(settingsKeyStub + "suffix", defaultSuffix).toString(); dialog.setDefaultSuffix(defaultSuffix); foreach (QString f, filters) { if (f.contains("." + defaultSuffix)) { dialog.selectNameFilter(f); } } bool good = false; while (!good) { path = ""; if (!dialog.exec()) break; QStringList files = dialog.selectedFiles(); if (files.empty()) break; path = *files.begin(); QFileInfo fi(path); cerr << "type = " << type << ", suffix = " << fi.suffix() << endl; if ((type == LayerFile || type == LayerFileNoMidi || type == LayerFileNonSV || type == LayerFileNoMidiNonSV) && fi.suffix() == "") { QString expectedExtension; QString selectedFilter = dialog.selectedNameFilter(); if (selectedFilter.contains(".svl")) { expectedExtension = "svl"; } else if (selectedFilter.contains(".txt")) { expectedExtension = "txt"; } else if (selectedFilter.contains(".csv")) { expectedExtension = "csv"; } else if (selectedFilter.contains(".mid")) { expectedExtension = "mid"; } else if (selectedFilter.contains(".ttl")) { expectedExtension = "ttl"; } cerr << "expected extension = " << expectedExtension << endl; if (expectedExtension != "") { path = QString("%1.%2").arg(path).arg(expectedExtension); fi = QFileInfo(path); } } if (fi.isDir()) { QMessageBox::critical(0, tr("Directory selected"), tr("Directory selected

    File \"%1\" is a directory").arg(path)); continue; } if (fi.exists()) { if (QMessageBox::question(0, tr("File exists"), tr("File exists

    The file \"%1\" already exists.\nDo you want to overwrite it?").arg(path), QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok) { continue; } } good = true; } if (path != "") { settings.setValue(settingsKeyStub + "path", QFileInfo(path).absoluteDir().canonicalPath()); settings.setValue(settingsKeyStub + "suffix", QFileInfo(path).suffix()); } return path; } void InteractiveFileFinder::registerLastOpenedFilePath(FileType type, QString path) { QString settingsKeyStub; switch (type) { case SessionFile: settingsKeyStub = "session"; break; case AudioFile: settingsKeyStub = "audio"; break; case LayerFile: settingsKeyStub = "layer"; break; case LayerFileNoMidi: settingsKeyStub = "layer"; break; case LayerFileNonSV: settingsKeyStub = "layer"; break; case LayerFileNoMidiNonSV: settingsKeyStub = "layer"; break; case SessionOrAudioFile: settingsKeyStub = "last"; break; case ImageFile: settingsKeyStub = "image"; break; case SVGFile: settingsKeyStub = "svg"; break; case CSVFile: settingsKeyStub = "layer"; break; case AnyFile: settingsKeyStub = "last"; break; } if (path != "") { QSettings settings; settings.beginGroup("FileFinder"); path = QFileInfo(path).absoluteDir().canonicalPath(); QString suffix = QFileInfo(path).suffix(); settings.setValue(settingsKeyStub + "path", path); settings.setValue(settingsKeyStub + "suffix", suffix); settings.setValue("lastpath", path); } } QString InteractiveFileFinder::find(FileType type, QString location, QString lastKnownLocation) { if (FileSource::canHandleScheme(location)) { if (FileSource(location).isAvailable()) { SVDEBUG << "InteractiveFileFinder::find: ok, it's available... returning" << endl; return location; } } if (QFileInfo(location).exists()) return location; QString foundAt = ""; if ((foundAt = findRelative(location, lastKnownLocation)) != "") { return foundAt; } if ((foundAt = findRelative(location, m_lastLocatedLocation)) != "") { return foundAt; } return locateInteractive(type, location); } QString InteractiveFileFinder::findRelative(QString location, QString relativeTo) { if (relativeTo == "") return ""; SVDEBUG << "Looking for \"" << location << "\" next to \"" << relativeTo << "\"..." << endl; QString fileName; QString resolved; if (FileSource::isRemote(location)) { fileName = QUrl(location).path().section('/', -1, -1, QString::SectionSkipEmpty); } else { if (QUrl(location).scheme() == "file") { location = QUrl(location).toLocalFile(); } fileName = QFileInfo(location).fileName(); } if (FileSource::isRemote(relativeTo)) { resolved = QUrl(relativeTo).resolved(fileName).toString(); if (!FileSource(resolved).isAvailable()) resolved = ""; cerr << "resolved: " << resolved << endl; } else { if (QUrl(relativeTo).scheme() == "file") { relativeTo = QUrl(relativeTo).toLocalFile(); } resolved = QFileInfo(relativeTo).dir().filePath(fileName); if (!QFileInfo(resolved).exists() || !QFileInfo(resolved).isFile() || !QFileInfo(resolved).isReadable()) { resolved = ""; } } return resolved; } QString InteractiveFileFinder::locateInteractive(FileType type, QString thing) { QString question; if (type == AudioFile) { question = tr("File not found

    Audio file \"%1\" could not be opened.\nDo you want to locate it?"); } else { question = tr("File not found

    File \"%1\" could not be opened.\nDo you want to locate it?"); } QString path = ""; bool done = false; while (!done) { int rv = QMessageBox::question (0, tr("Failed to open file"), question.arg(thing), tr("Locate file..."), tr("Use URL..."), tr("Cancel"), 0, 2); switch (rv) { case 0: // Locate file if (QFileInfo(thing).dir().exists()) { path = QFileInfo(thing).dir().canonicalPath(); } path = getOpenFileName(type, path); done = (path != ""); break; case 1: // Use URL { bool ok = false; path = QInputDialog::getText (0, tr("Use URL"), tr("Please enter the URL to use for this file:"), QLineEdit::Normal, "", &ok); if (ok && path != "") { if (FileSource(path).isAvailable()) { done = true; } else { QMessageBox::critical (0, tr("Failed to open location"), tr("Failed to open location

    URL \"%1\" could not be opened").arg(path)); path = ""; } } break; } case 2: // Cancel path = ""; done = true; break; } } if (path != "") m_lastLocatedLocation = path; return path; } sonic-visualiser-3.0.3/svgui/widgets/InteractiveFileFinder.h0000644000000000000000000000356513111512442022326 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _INTERACTIVE_FILE_FINDER_H_ #define _INTERACTIVE_FILE_FINDER_H_ #include "data/fileio/FileFinder.h" #include #include #include class InteractiveFileFinder : public QObject, public FileFinder { Q_OBJECT public: virtual ~InteractiveFileFinder(); /// Specify the extension for this application's session files /// (without the dot) void setApplicationSessionExtension(QString extension); QString getApplicationSessionExtension() const { return m_sessionExtension; } QString getOpenFileName(FileType type, QString fallbackLocation = ""); QString getSaveFileName(FileType type, QString fallbackLocation = ""); void registerLastOpenedFilePath(FileType type, QString path); QString find(FileType type, QString location, QString lastKnownLocation = ""); static void setParentWidget(QWidget *); static InteractiveFileFinder *getInstance() { return &m_instance; } protected: InteractiveFileFinder(); static InteractiveFileFinder m_instance; QString findRelative(QString location, QString relativeTo); QString locateInteractive(FileType type, QString thing); QString m_sessionExtension; QString m_lastLocatedLocation; QWidget *m_parent; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ItemEditDialog.cpp0000644000000000000000000002466513111512442021304 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "ItemEditDialog.h" #include #include #include #include #include #include #include #include #include #include // for FLT_MIN/MAX ItemEditDialog::ItemEditDialog(sv_samplerate_t sampleRate, int options, QString valueUnits, QWidget *parent) : QDialog(parent), m_sampleRate(sampleRate), m_defaultFrame(0), m_defaultDuration(0), m_defaultValue(0), m_frameTimeSpinBox(0), m_realTimeSecsSpinBox(0), m_realTimeUSecsSpinBox(0), m_frameDurationSpinBox(0), m_realDurationSecsSpinBox(0), m_realDurationUSecsSpinBox(0), m_valueSpinBox(0), m_textField(0) { QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *timeBox = 0; QGroupBox *valueBox = 0; QGridLayout *subgrid = 0; int row = 0, subrow = 0; int singleStep = RealTime::frame2RealTime(2, sampleRate).usec() - 1; if ((options & ShowTime) || (options & ShowDuration)) { timeBox = new QGroupBox; timeBox->setTitle(tr("Timing")); grid->addWidget(timeBox, row, 0); subgrid = new QGridLayout; timeBox->setLayout(subgrid); ++row; } if (options & ShowTime) { subgrid->addWidget(new QLabel(tr("Time:")), subrow, 0); m_frameTimeSpinBox = new QSpinBox; m_frameTimeSpinBox->setMaximum(INT_MAX); m_frameTimeSpinBox->setSuffix(tr(" frames")); subgrid->addWidget(m_frameTimeSpinBox, subrow, 1, 1, 2); connect(m_frameTimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(frameTimeChanged(int))); ++subrow; m_realTimeSecsSpinBox = new QSpinBox; m_realTimeSecsSpinBox->setMaximum(999999); m_realTimeSecsSpinBox->setSuffix(tr(" sec")); subgrid->addWidget(m_realTimeSecsSpinBox, subrow, 1); connect(m_realTimeSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realTimeSecsChanged(int))); m_realTimeUSecsSpinBox = new QSpinBox; m_realTimeUSecsSpinBox->setMaximum(999999); m_realTimeUSecsSpinBox->setSuffix(tr(" usec")); m_realTimeUSecsSpinBox->setSingleStep(singleStep); subgrid->addWidget(m_realTimeUSecsSpinBox, subrow, 2); connect(m_realTimeUSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realTimeUSecsChanged(int))); ++subrow; } if (options & ShowDuration) { subgrid->addWidget(new QLabel(tr("Duration:")), subrow, 0); m_frameDurationSpinBox = new QSpinBox; m_frameDurationSpinBox->setMaximum(INT_MAX); m_frameDurationSpinBox->setSuffix(tr(" frames")); subgrid->addWidget(m_frameDurationSpinBox, subrow, 1, 1, 2); connect(m_frameDurationSpinBox, SIGNAL(valueChanged(int)), this, SLOT(frameDurationChanged(int))); ++subrow; m_realDurationSecsSpinBox = new QSpinBox; m_realDurationSecsSpinBox->setMaximum(999999); m_realDurationSecsSpinBox->setSuffix(tr(" sec")); subgrid->addWidget(m_realDurationSecsSpinBox, subrow, 1); connect(m_realDurationSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realDurationSecsChanged(int))); m_realDurationUSecsSpinBox = new QSpinBox; m_realDurationUSecsSpinBox->setMaximum(999999); m_realDurationUSecsSpinBox->setSuffix(tr(" usec")); m_realDurationUSecsSpinBox->setSingleStep(singleStep); subgrid->addWidget(m_realDurationUSecsSpinBox, subrow, 2); connect(m_realDurationUSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realDurationUSecsChanged(int))); ++subrow; } if ((options & ShowValue) || (options & ShowText)) { valueBox = new QGroupBox; valueBox->setTitle(tr("Properties")); grid->addWidget(valueBox, row, 0); subgrid = new QGridLayout; valueBox->setLayout(subgrid); ++row; } subrow = 0; if (options & ShowValue) { subgrid->addWidget(new QLabel(tr("Value:")), subrow, 0); m_valueSpinBox = new QDoubleSpinBox; m_valueSpinBox->setSuffix(QString(" %1").arg(valueUnits)); m_valueSpinBox->setDecimals(10); m_valueSpinBox->setMinimum(-1e10); m_valueSpinBox->setMaximum(1e10); connect(m_valueSpinBox, SIGNAL(valueChanged(double)), this, SLOT(valueChanged(double))); subgrid->addWidget(m_valueSpinBox, subrow, 1); ++subrow; } if (options & ShowText) { subgrid->addWidget(new QLabel(tr("Text:")), subrow, 0); m_textField = new QLineEdit; connect(m_textField, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString))); subgrid->addWidget(m_textField, subrow, 1); ++subrow; } if (options & ShowText) { m_textField->setFocus(Qt::OtherFocusReason); } else if (options & ShowValue) { m_valueSpinBox->setFocus(Qt::OtherFocusReason); } QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal); grid->addWidget(bb, row, 0, 1, 2); QPushButton *ok = new QPushButton(tr("OK")); m_resetButton = new QPushButton(tr("Reset")); QPushButton *cancel = new QPushButton(tr("Cancel")); bb->addButton(ok, QDialogButtonBox::AcceptRole); bb->addButton(m_resetButton, QDialogButtonBox::ResetRole); bb->addButton(cancel, QDialogButtonBox::RejectRole); connect(ok, SIGNAL(clicked()), this, SLOT(accept())); connect(m_resetButton, SIGNAL(clicked()), this, SLOT(reset())); connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); m_resetButton->setEnabled(false); } void ItemEditDialog::setFrameTime(sv_frame_t frame) { if (!m_frameTimeSpinBox) return; RealTime rt(RealTime::frame2RealTime(frame, m_sampleRate)); m_realTimeSecsSpinBox->setValue(rt.sec); m_realTimeUSecsSpinBox->setValue(rt.usec()); m_frameTimeSpinBox->setValue(int(frame)); m_defaultFrame = frame; m_resetButton->setEnabled(false); } sv_frame_t ItemEditDialog::getFrameTime() const { return m_frameTimeSpinBox->value(); } void ItemEditDialog::setRealTime(RealTime rt) { setFrameTime(RealTime::realTime2Frame(rt, m_sampleRate)); } RealTime ItemEditDialog::getRealTime() const { return RealTime::frame2RealTime(getFrameTime(), m_sampleRate); } void ItemEditDialog::setFrameDuration(sv_frame_t duration) { if (!m_frameDurationSpinBox) return; RealTime rt(RealTime::frame2RealTime(duration, m_sampleRate)); m_realDurationSecsSpinBox->setValue(rt.sec); m_realDurationUSecsSpinBox->setValue(rt.usec()); m_frameDurationSpinBox->setValue(int(duration)); m_defaultDuration = duration; m_resetButton->setEnabled(false); } sv_frame_t ItemEditDialog::getFrameDuration() const { return m_frameDurationSpinBox->value(); } void ItemEditDialog::setRealDuration(RealTime rt) { setFrameDuration(RealTime::realTime2Frame(rt, m_sampleRate)); } RealTime ItemEditDialog::getRealDuration() const { return RealTime::frame2RealTime(getFrameDuration(), m_sampleRate); } void ItemEditDialog::setValue(float v) { if (!m_valueSpinBox) return; m_valueSpinBox->setValue(v); m_defaultValue = v; m_resetButton->setEnabled(false); } float ItemEditDialog::getValue() const { return float(m_valueSpinBox->value()); } void ItemEditDialog::setText(QString text) { if (!m_textField) return; m_textField->setText(text); m_defaultText = text; m_resetButton->setEnabled(false); } QString ItemEditDialog::getText() const { return m_textField->text(); } void ItemEditDialog::frameTimeChanged(int i) { m_realTimeSecsSpinBox->blockSignals(true); m_realTimeUSecsSpinBox->blockSignals(true); RealTime rt(RealTime::frame2RealTime(i, m_sampleRate)); m_realTimeSecsSpinBox->setValue(rt.sec); m_realTimeUSecsSpinBox->setValue(rt.usec()); m_realTimeSecsSpinBox->blockSignals(false); m_realTimeUSecsSpinBox->blockSignals(false); m_resetButton->setEnabled(true); } void ItemEditDialog::realTimeSecsChanged(int i) { RealTime rt = getRealTime(); rt.sec = i; sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameTimeSpinBox->setValue(int(frame)); m_resetButton->setEnabled(true); } void ItemEditDialog::realTimeUSecsChanged(int i) { RealTime rt = getRealTime(); rt.nsec = i * 1000; sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameTimeSpinBox->setValue(int(frame)); m_resetButton->setEnabled(true); } void ItemEditDialog::frameDurationChanged(int i) { m_realDurationSecsSpinBox->blockSignals(true); m_realDurationUSecsSpinBox->blockSignals(true); RealTime rt(RealTime::frame2RealTime(i, m_sampleRate)); m_realDurationSecsSpinBox->setValue(rt.sec); m_realDurationUSecsSpinBox->setValue(rt.usec()); m_realDurationSecsSpinBox->blockSignals(false); m_realDurationUSecsSpinBox->blockSignals(false); m_resetButton->setEnabled(true); } void ItemEditDialog::realDurationSecsChanged(int i) { RealTime rt = getRealDuration(); rt.sec = i; sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameDurationSpinBox->setValue(int(frame)); m_resetButton->setEnabled(true); } void ItemEditDialog::realDurationUSecsChanged(int i) { RealTime rt = getRealDuration(); rt.nsec = i * 1000; sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameDurationSpinBox->setValue(int(frame)); m_resetButton->setEnabled(true); } void ItemEditDialog::valueChanged(double) { m_resetButton->setEnabled(true); } void ItemEditDialog::textChanged(QString) { m_resetButton->setEnabled(true); } void ItemEditDialog::reset() { setFrameTime(m_defaultFrame); setFrameDuration(m_defaultDuration); setValue(m_defaultValue); setText(m_defaultText); m_resetButton->setEnabled(false); } sonic-visualiser-3.0.3/svgui/widgets/ItemEditDialog.h0000644000000000000000000000464213111512442020742 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _ITEM_EDIT_DIALOG_H_ #define _ITEM_EDIT_DIALOG_H_ #include #include #include "base/RealTime.h" class QSpinBox; class QDoubleSpinBox; class QLineEdit; class ItemEditDialog : public QDialog { Q_OBJECT public: enum { ShowTime = 1 << 0, ShowDuration = 1 << 1, ShowValue = 1 << 2, ShowText = 1 << 3 }; ItemEditDialog(sv_samplerate_t sampleRate, int options, QString valueUnits = "", QWidget *parent = 0); void setFrameTime(sv_frame_t frame); sv_frame_t getFrameTime() const; void setRealTime(RealTime rt); RealTime getRealTime() const; void setFrameDuration(sv_frame_t frame); sv_frame_t getFrameDuration() const; void setRealDuration(RealTime rt); RealTime getRealDuration() const; void setValue(float value); float getValue() const; void setText(QString text); QString getText() const; protected slots: void frameTimeChanged(int); // must be int as invoked from int signal void realTimeSecsChanged(int); void realTimeUSecsChanged(int); void frameDurationChanged(int); // must be int as invoked from int signal void realDurationSecsChanged(int); void realDurationUSecsChanged(int); void valueChanged(double); void textChanged(QString); void reset(); protected: sv_samplerate_t m_sampleRate; sv_frame_t m_defaultFrame; sv_frame_t m_defaultDuration; float m_defaultValue; QString m_defaultText; QSpinBox *m_frameTimeSpinBox; QSpinBox *m_realTimeSecsSpinBox; QSpinBox *m_realTimeUSecsSpinBox; QSpinBox *m_frameDurationSpinBox; QSpinBox *m_realDurationSecsSpinBox; QSpinBox *m_realDurationUSecsSpinBox; QDoubleSpinBox *m_valueSpinBox; QLineEdit *m_textField; QPushButton *m_resetButton; }; #endif sonic-visualiser-3.0.3/svgui/widgets/KeyReference.cpp0000644000000000000000000001340013111512442021010 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "KeyReference.h" #include #include #include #include #include #include #include KeyReference::KeyReference() : m_text(0), m_dialog(0) { } KeyReference::~KeyReference() { delete m_dialog; } void KeyReference::setCategory(QString category) { if (m_map.find(category) == m_map.end()) { m_categoryOrder.push_back(category); m_map[category] = KeyList(); } m_currentCategory = category; } void KeyReference::registerShortcut(QAction *action, QString overrideName) { QString name = action->text(); if (overrideName != "") name = overrideName; QString shortcut = action->shortcut().toString(QKeySequence::NativeText); QString tip = action->statusTip(); registerShortcut(name, shortcut, tip); } void KeyReference::registerShortcut(QString name, QString shortcut, QString tip) { name.replace(tr("&"), ""); KeyList &list = m_map[m_currentCategory]; for (KeyList::iterator i = list.begin(); i != list.end(); ++i) { if (i->actionName == name) { i->shortcut = shortcut; i->tip = tip; i->alternatives.clear(); return; } } KeyDetails details; details.actionName = name; details.shortcut = shortcut; details.tip = tip; list.push_back(details); } void KeyReference::registerAlternativeShortcut(QAction *action, QString alternative) { QString name = action->text(); registerAlternativeShortcut(name, alternative); } void KeyReference::registerAlternativeShortcut(QAction *action, QKeySequence shortcut) { QString name = action->text(); registerAlternativeShortcut(name, shortcut.toString(QKeySequence::NativeText)); } void KeyReference::registerAlternativeShortcut(QString name, QString alternative) { name.replace(tr("&"), ""); KeyList &list = m_map[m_currentCategory]; for (KeyList::iterator i = list.begin(); i != list.end(); ++i) { if (i->actionName == name) { i->alternatives.push_back(alternative); return; } } } void KeyReference::registerAlternativeShortcut(QString name, QKeySequence shortcut) { registerAlternativeShortcut(name, shortcut.toString(QKeySequence::NativeText)); } void KeyReference::show() { if (m_dialog) { m_dialog->show(); m_dialog->raise(); return; } QString text; QColor bgcolor = QApplication::palette().window().color(); bool darkbg = (bgcolor.red() + bgcolor.green() + bgcolor.blue() < 384); text += QString("

    ") .arg(darkbg ? "#121212" : "#e8e8e8"); for (CategoryList::iterator i = m_categoryOrder.begin(); i != m_categoryOrder.end(); ++i) { QString category = *i; KeyList &list = m_map[category]; text += QString("\n").arg(darkbg ? "#303030" : "#d0d0d0").arg(category); for (KeyList::iterator j = list.begin(); j != list.end(); ++j) { QString actionName = j->actionName; QString shortcut = j->shortcut; shortcut.replace(" ", " "); QString tip = j->tip; if (tip != "") tip = QString("%1").arg(tip); QString altdesc; if (!j->alternatives.empty()) { for (std::vector::iterator k = j->alternatives.begin(); k != j->alternatives.end(); ++k) { QString alt = *k; alt.replace(" ", " "); altdesc += tr("or %1").arg(alt); } altdesc = tr(" (%1)").arg(altdesc); } text += QString("\n") .arg(shortcut).arg(altdesc).arg(actionName).arg(tip); } } text += "

    %2
     %1%2 %3%4
    \n"; m_text = new QTextEdit; m_text->setHtml(text); m_text->setReadOnly(true); m_dialog = new QDialog; m_dialog->setWindowTitle(tr("%1: Key and Mouse Reference") .arg(QApplication::applicationName())); QVBoxLayout *layout = new QVBoxLayout; m_dialog->setLayout(layout); layout->addWidget(m_text); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(clicked(QAbstractButton *)), this, SLOT(dialogButtonClicked(QAbstractButton *))); layout->addWidget(bb); m_dialog->show(); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() * 3 / 5; int height = available.height() * 2 / 3; if (height < 450) { if (available.height() > 500) height = 450; } if (width < 600) { if (available.width() > 650) width = 600; } m_dialog->resize(width, height); m_dialog->raise(); } void KeyReference::dialogButtonClicked(QAbstractButton *) { // only button is Close m_dialog->hide(); } void KeyReference::hide() { if (m_dialog) { m_dialog->hide(); } } sonic-visualiser-3.0.3/svgui/widgets/KeyReference.h0000644000000000000000000000367613111512442020473 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _KEY_REFERENCE_H_ #define _KEY_REFERENCE_H_ #include #include #include #include #include class QAction; class QTextEdit; class QDialog; class QAbstractButton; class KeyReference : public QObject { Q_OBJECT public: KeyReference(); virtual ~KeyReference(); void setCategory(QString category); void registerShortcut(QAction *, QString overrideName = ""); void registerAlternativeShortcut(QAction *, QString alternative); void registerAlternativeShortcut(QAction *, QKeySequence alternative); void registerShortcut(QString actionName, QString shortcut, QString tipText); void registerAlternativeShortcut(QString actionName, QString alternative); void registerAlternativeShortcut(QString actionName, QKeySequence alternative); void show(); void hide(); protected slots: void dialogButtonClicked(QAbstractButton *); protected: struct KeyDetails { QString actionName; QString shortcut; QString tip; std::vector alternatives; }; typedef std::vector KeyList; typedef std::map CategoryMap; typedef std::vector CategoryList; QString m_currentCategory; CategoryMap m_map; CategoryList m_categoryOrder; QTextEdit *m_text; QDialog *m_dialog; }; #endif sonic-visualiser-3.0.3/svgui/widgets/LEDButton.cpp0000644000000000000000000001450413111512442020247 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the KDE libraries. Copyright (c) 1998-2004 Jörg Habenicht, Richard J Moore, Chris Cannam and others, distributed under the GNU Lesser General Public License. Ported to Qt4 by Chris Cannam. */ #include "LEDButton.h" #include "WidgetScale.h" #include #include #include #include #include class LEDButton::LEDButtonPrivate { friend class LEDButton; int dark_factor; QColor offcolor; }; LEDButton::LEDButton(QWidget *parent) : QWidget(parent), led_state(true) { QColor col(Qt::green); d = new LEDButton::LEDButtonPrivate; d->dark_factor = 300; d->offcolor = col.dark(300); setColor(col); } LEDButton::LEDButton(const QColor& col, QWidget *parent) : QWidget(parent), led_state(true) { d = new LEDButton::LEDButtonPrivate; d->dark_factor = 300; d->offcolor = col.dark(300); setColor(col); } LEDButton::LEDButton(const QColor& col, bool state, QWidget *parent) : QWidget(parent), led_state(state) { d = new LEDButton::LEDButtonPrivate; d->dark_factor = 300; d->offcolor = col.dark(300); setColor(col); } LEDButton::~LEDButton() { delete d; } void LEDButton::mousePressEvent(QMouseEvent *e) { cerr << "LEDButton(" << this << ")::mousePressEvent" << endl; if (e->buttons() & Qt::LeftButton) { toggle(); bool newState = state(); SVDEBUG << "emitting new state " << newState << endl; emit stateChanged(newState); } } void LEDButton::enterEvent(QEvent *) { emit mouseEntered(); } void LEDButton::leaveEvent(QEvent *) { emit mouseLeft(); } void LEDButton::paintEvent(QPaintEvent *) { QPainter paint; QColor color; QBrush brush; QPen pen; // First of all we want to know what area should be updated // Initialize coordinates, width, and height of the LED int width = this->width(); // Make sure the LED is round! if (width > this->height()) width = this->height(); width -= 2; // leave one pixel border if (width < 0) width = 0; paint.begin(this); paint.setRenderHint(QPainter::Antialiasing, true); // Set the color of the LED according to given parameters color = (led_state) ? led_color : d->offcolor; // Set the brush to SolidPattern, this fills the entire area // of the ellipse which is drawn first brush.setStyle(Qt::SolidPattern); brush.setColor(color); paint.setBrush(brush); // Draws a "flat" LED with the given color: paint.drawEllipse( 1, 1, width - 2, width - 2 ); // Draw the bright light spot of the LED now, using modified "old" // painter routine taken from KDEUI´s LEDButton widget: // Setting the new width of the pen is essential to avoid "pixelized" // shadow like it can be observed with the old LED code pen.setWidth( 2 ); // shrink the light on the LED to a size about 2/3 of the complete LED int pos = width/5 + 1; int light_width = width; light_width *= 2; light_width /= 3; // Calculate the LED´s "light factor": int light_quote = (130*2/(light_width?light_width:1))+100; // Now draw the bright spot on the LED: while (light_width) { color = color.light( light_quote ); // make color lighter pen.setColor( color ); // set color as pen color paint.setPen( pen ); // select the pen for drawing paint.drawEllipse( pos, pos, light_width, light_width ); // draw the ellipse (circle) light_width--; if (!light_width) break; paint.drawEllipse( pos, pos, light_width, light_width ); light_width--; if (!light_width) break; paint.drawEllipse( pos, pos, light_width, light_width ); pos++; light_width--; } paint.drawPoint(pos, pos); // Drawing of bright spot finished, now draw a thin border // around the LED which resembles a shadow with light coming // from the upper left. pen.setWidth(2); brush.setStyle(Qt::NoBrush); paint.setBrush(brush); // This avoids filling of the ellipse // Set the initial color value to colorGroup().light() (bright) and start // drawing the shadow border at 45° (45*16 = 720). int angle = -720; color = palette().light().color(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(color); paint.setPen(pen); int w = width - pen.width()/2; paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle + arc, 240); paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle - arc, 240); color = color.dark(110); //FIXME: this should somehow use the contrast value } // end for ( angle = 720; angle < 6480; angle += 160 ) paint.end(); } bool LEDButton::state() const { return led_state; } QColor LEDButton::color() const { return led_color; } void LEDButton::setState( bool state ) { if (led_state != state) { led_state = state; update(); } } void LEDButton::toggleState() { led_state = (led_state == true) ? false : true; // setColor(led_color); update(); } void LEDButton::setColor(const QColor& col) { if(led_color!=col) { led_color = col; d->offcolor = col.dark(d->dark_factor); update(); } } void LEDButton::setDarkFactor(int darkfactor) { if (d->dark_factor != darkfactor) { d->dark_factor = darkfactor; d->offcolor = led_color.dark(darkfactor); update(); } } int LEDButton::darkFactor() const { return d->dark_factor; } void LEDButton::toggle() { toggleState(); } void LEDButton::on() { setState(true); } void LEDButton::off() { setState(false); } QSize LEDButton::sizeHint() const { return WidgetScale::scaleQSize(QSize(17, 17)); } QSize LEDButton::minimumSizeHint() const { return WidgetScale::scaleQSize(QSize(17, 17)); } sonic-visualiser-3.0.3/svgui/widgets/LEDButton.h0000644000000000000000000000421413111512442017711 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the KDE libraries. Copyright (c) 1998-2004 Jörg Habenicht, Richard J Moore and others, distributed under the GNU Lesser General Public License. Ported to Qt4 by Chris Cannam. The original KDE widget comes in round and rectangular and flat, raised, and sunken variants. This version retains only the round sunken variant. This version also implements a simple button API. */ #ifndef SV_LED_BUTTON_H #define SV_LED_BUTTON_H #include #include "base/Debug.h" class QColor; class LEDButton : public QWidget { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor) Q_PROPERTY(int darkFactor READ darkFactor WRITE setDarkFactor) public: LEDButton(QWidget *parent = 0); LEDButton(const QColor &col, QWidget *parent = 0); LEDButton(const QColor& col, bool state, QWidget *parent = 0); ~LEDButton(); bool state() const; QColor color() const; int darkFactor() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; signals: void stateChanged(bool); void mouseEntered(); void mouseLeft(); public slots: void toggle(); void on(); void off(); void setState(bool); void toggleState(); void setColor(const QColor& color); void setDarkFactor(int darkfactor); protected: void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *); void enterEvent(QEvent *); void leaveEvent(QEvent *); bool led_state; QColor led_color; class LEDButtonPrivate; LEDButtonPrivate *d; }; #endif sonic-visualiser-3.0.3/svgui/widgets/LabelCounterInputDialog.cpp0000644000000000000000000000515613111512442023171 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "LabelCounterInputDialog.h" #include #include #include #include #include LabelCounterInputDialog::LabelCounterInputDialog(Labeller *labeller, QWidget *parent) : QDialog(parent), m_labeller(labeller) { setWindowTitle(tr("Set Counters")); QGridLayout *layout = new QGridLayout(this); QLabel *label = new QLabel(tr("Fine counter (beats):")); layout->addWidget(label, 1, 0); label = new QLabel(tr("Coarse counter (bars):")); layout->addWidget(label, 0, 0); QSpinBox *counter = new QSpinBox; counter->setMinimum(-10); counter->setMaximum(10000); counter->setSingleStep(1); m_origSecondCounter = m_labeller->getSecondLevelCounterValue(); counter->setValue(m_origSecondCounter); connect(counter, SIGNAL(valueChanged(int)), this, SLOT(secondCounterChanged(int))); layout->addWidget(counter, 0, 1); counter = new QSpinBox; counter->setMinimum(-10); counter->setMaximum(10000); counter->setSingleStep(1); m_origCounter = m_labeller->getCounterValue(); counter->setValue(m_origCounter); connect(counter, SIGNAL(valueChanged(int)), this, SLOT(counterChanged(int))); layout->addWidget(counter, 1, 1); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, 2, 0, 1, 2); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(cancelClicked())); } LabelCounterInputDialog::~LabelCounterInputDialog() { } void LabelCounterInputDialog::counterChanged(int value) { m_labeller->setCounterValue(value); } void LabelCounterInputDialog::secondCounterChanged(int value) { m_labeller->setSecondLevelCounterValue(value); } void LabelCounterInputDialog::cancelClicked() { m_labeller->setCounterValue(m_origCounter); m_labeller->setSecondLevelCounterValue(m_origSecondCounter); reject(); } sonic-visualiser-3.0.3/svgui/widgets/LabelCounterInputDialog.h0000644000000000000000000000213413111512442022627 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LABEL_COUNTER_INPUT_DIALOG_H_ #define _LABEL_COUNTER_INPUT_DIALOG_H_ #include #include "data/model/Labeller.h" class LabelCounterInputDialog : public QDialog { Q_OBJECT public: LabelCounterInputDialog(Labeller *labeller, QWidget *parent); virtual ~LabelCounterInputDialog(); protected slots: void counterChanged(int); void secondCounterChanged(int); void cancelClicked(); protected: Labeller *m_labeller; int m_origCounter; int m_origSecondCounter; }; #endif sonic-visualiser-3.0.3/svgui/widgets/LayerTree.cpp0000644000000000000000000004262313111512442020346 0ustar 00000000000000 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "LayerTree.h" #include "view/PaneStack.h" #include "base/PlayParameters.h" #include "view/Pane.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "data/model/WaveFileModel.h" #include #include ModelMetadataModel::ModelMetadataModel(PaneStack *stack, bool waveModelsOnly, QObject *parent) : QAbstractItemModel(parent), m_stack(stack), m_waveModelsOnly(waveModelsOnly) { if (m_waveModelsOnly) { m_modelTypeColumn = -1; m_modelNameColumn = 0; m_modelMakerColumn = 1; m_modelSourceColumn = 2; m_columnCount = 3; } else { m_modelTypeColumn = 0; m_modelNameColumn = 1; m_modelMakerColumn = 2; m_modelSourceColumn = 3; m_columnCount = 4; } connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded())); connect(stack, SIGNAL(paneDeleted()), this, SLOT(paneDeleted())); for (int i = 0; i < stack->getPaneCount(); ++i) { Pane *pane = stack->getPane(i); if (!pane) continue; connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)), this, SLOT(propertyContainerSelected(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(layerModelChanged()), this, SLOT(paneLayerModelChanged())); } rebuildModelSet(); } ModelMetadataModel::~ModelMetadataModel() { } void ModelMetadataModel::rebuildModelSet() { std::set unfound = m_models; for (int i = 0; i < m_stack->getPaneCount(); ++i) { Pane *pane = m_stack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; Model *model = layer->getModel(); if (!model) continue; if (m_waveModelsOnly) { if (!dynamic_cast(model)) continue; } if (m_models.find(model) == m_models.end()) { connect(model, SIGNAL(aboutToBeDeleted()), this, SLOT(rebuildModelSet())); m_models.insert(model); } else { unfound.erase(model); } } } for (std::set::iterator i = unfound.begin(); i != unfound.end(); ++i) { m_models.erase(*i); } SVDEBUG << "ModelMetadataModel::rebuildModelSet: " << m_models.size() << " models" << endl; } void ModelMetadataModel::paneAdded() { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::paneDeleted() { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::paneLayerModelChanged() { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::propertyContainerAdded(PropertyContainer *) { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::propertyContainerRemoved(PropertyContainer *) { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::propertyContainerSelected(PropertyContainer *) { } void ModelMetadataModel::propertyContainerPropertyChanged(PropertyContainer *) { } void ModelMetadataModel::playParametersAudibilityChanged(bool ) { } QVariant ModelMetadataModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); // QObject *obj = static_cast(index.internalPointer()); int row = index.row(), col = index.column(); //!!! not exactly the ideal use of a std::set std::set::iterator itr = m_models.begin(); for (int i = 0; i < row && itr != m_models.end(); ++i, ++itr); if (itr == m_models.end()) return QVariant(); Model *model = *itr; if (role != Qt::DisplayRole) { if (m_waveModelsOnly && col == m_modelNameColumn && role == Qt::DecorationRole) { // There is no meaningful icon for a model, in general -- // the icons we have represent layer types and it would be // misleading to use them for models. However, if we're // only showing wave models, we use the waveform icon just // for decorative purposes. return QVariant(QIcon(QString(":/icons/waveform.png"))); } return QVariant(); } if (col == m_modelTypeColumn) { return QVariant(model->getTypeName()); } else if (col == m_modelNameColumn) { return QVariant(model->objectName()); } else if (col == m_modelMakerColumn) { return QVariant(model->getMaker()); } else if (col == m_modelSourceColumn) { return QVariant(model->getLocation()); } return QVariant(); } bool ModelMetadataModel::setData(const QModelIndex &, const QVariant &, int ) { return false; } Qt::ItemFlags ModelMetadataModel::flags(const QModelIndex &) const { Qt::ItemFlags flags = Qt::ItemIsEnabled; return flags; } QVariant ModelMetadataModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (section == m_modelTypeColumn) return QVariant(tr("Type")); else if (section == m_modelNameColumn) return QVariant(tr("Name")); else if (section == m_modelMakerColumn) return QVariant(tr("Maker")); else if (section == m_modelSourceColumn) return QVariant(tr("Source")); } return QVariant(); } QModelIndex ModelMetadataModel::index(int row, int column, const QModelIndex &parent) const { if (!parent.isValid()) { if (row >= (int)m_models.size()) return QModelIndex(); return createIndex(row, column, (void *)0); } return QModelIndex(); } QModelIndex ModelMetadataModel::parent(const QModelIndex &) const { return QModelIndex(); } int ModelMetadataModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return int(m_models.size()); return 0; } int ModelMetadataModel::columnCount(const QModelIndex &) const { return m_columnCount; } LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) : QAbstractItemModel(parent), m_stack(stack) { m_layerNameColumn = 0; m_layerVisibleColumn = 1; m_layerPlayedColumn = 2; m_modelNameColumn = 3; m_columnCount = 4; connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded())); connect(stack, SIGNAL(paneAboutToBeDeleted(Pane *)), this, SLOT(paneAboutToBeDeleted(Pane *))); for (int i = 0; i < stack->getPaneCount(); ++i) { Pane *pane = stack->getPane(i); if (!pane) continue; connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)), this, SLOT(propertyContainerSelected(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(layerModelChanged()), this, SLOT(paneLayerModelChanged())); for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; PlayParameters *params = layer->getPlayParameters(); if (!params) continue; connect(params, SIGNAL(playAudibleChanged(bool)), this, SLOT(playParametersAudibilityChanged(bool))); } } } LayerTreeModel::~LayerTreeModel() { } void LayerTreeModel::paneAdded() { emit layoutChanged(); } void LayerTreeModel::paneAboutToBeDeleted(Pane *pane) { cerr << "paneDeleted: " << pane << endl; m_deletedPanes.insert(pane); emit layoutChanged(); } void LayerTreeModel::propertyContainerAdded(PropertyContainer *) { emit layoutChanged(); } void LayerTreeModel::propertyContainerRemoved(PropertyContainer *) { emit layoutChanged(); } void LayerTreeModel::propertyContainerSelected(PropertyContainer *) { emit layoutChanged(); } void LayerTreeModel::paneLayerModelChanged() { emit layoutChanged(); } void LayerTreeModel::propertyContainerPropertyChanged(PropertyContainer *pc) { for (int i = 0; i < m_stack->getPaneCount(); ++i) { Pane *pane = m_stack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { if (pane->getLayer(j) == pc) { emit dataChanged(createIndex(pane->getLayerCount() - j - 1, m_layerNameColumn, pane), createIndex(pane->getLayerCount() - j - 1, m_modelNameColumn, pane)); } } } } void LayerTreeModel::playParametersAudibilityChanged(bool a) { PlayParameters *params = dynamic_cast(sender()); if (!params) return; SVDEBUG << "LayerTreeModel::playParametersAudibilityChanged(" << params << "," << a << ")" << endl; for (int i = 0; i < m_stack->getPaneCount(); ++i) { Pane *pane = m_stack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; if (layer->getPlayParameters() == params) { SVDEBUG << "LayerTreeModel::playParametersAudibilityChanged(" << params << "," << a << "): row " << pane->getLayerCount() - j - 1 << ", col " << 2 << endl; emit dataChanged(createIndex(pane->getLayerCount() - j - 1, m_layerPlayedColumn, pane), createIndex(pane->getLayerCount() - j - 1, m_layerPlayedColumn, pane)); } } } } QVariant LayerTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); QObject *obj = static_cast(index.internalPointer()); int row = index.row(), col = index.column(); Pane *pane = dynamic_cast(obj); if (!pane) { if (col == 0 && row < m_stack->getPaneCount()) { switch (role) { case Qt::DisplayRole: return QVariant(QString("Pane %1").arg(row + 1)); case Qt::DecorationRole: return QVariant(QIcon(QString(":/icons/pane.png"))); default: break; } } } if (pane && pane->getLayerCount() > row) { Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); if (layer) { if (col == m_layerNameColumn) { switch (role) { case Qt::DisplayRole: return QVariant(layer->objectName()); case Qt::DecorationRole: return QVariant (QIcon(QString(":/icons/%1.png") .arg(layer->getPropertyContainerIconName()))); default: break; } } else if (col == m_layerVisibleColumn) { if (role == Qt::CheckStateRole) { return QVariant(layer->isLayerDormant(pane) ? Qt::Unchecked : Qt::Checked); } else if (role == Qt::TextAlignmentRole) { return QVariant(Qt::AlignHCenter); } } else if (col == m_layerPlayedColumn) { if (role == Qt::CheckStateRole) { PlayParameters *params = layer->getPlayParameters(); if (params) return QVariant(params->isPlayMuted() ? Qt::Unchecked : Qt::Checked); else return QVariant(); } else if (role == Qt::TextAlignmentRole) { return QVariant(Qt::AlignHCenter); } } else if (col == m_modelNameColumn) { Model *model = layer->getModel(); if (model && role == Qt::DisplayRole) { return QVariant(model->objectName()); } } } } return QVariant(); } bool LayerTreeModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) return false; QObject *obj = static_cast(index.internalPointer()); int row = index.row(), col = index.column(); Pane *pane = dynamic_cast(obj); if (!pane || pane->getLayerCount() <= row) return false; Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); if (!layer) return false; if (col == m_layerVisibleColumn) { if (role == Qt::CheckStateRole) { layer->showLayer(pane, value.toInt() == Qt::Checked); emit dataChanged(index, index); return true; } } else if (col == m_layerPlayedColumn) { if (role == Qt::CheckStateRole) { PlayParameters *params = layer->getPlayParameters(); if (params) { params->setPlayMuted(value.toInt() == Qt::Unchecked); emit dataChanged(index, index); return true; } } } return false; } Qt::ItemFlags LayerTreeModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled; if (!index.isValid()) return flags; if (index.column() == m_layerVisibleColumn || index.column() == m_layerPlayedColumn) { flags |= Qt::ItemIsUserCheckable; } else if (index.column() == 0) { flags |= Qt::ItemIsSelectable; } return flags; } QVariant LayerTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (section == m_layerNameColumn) return QVariant(tr("Layer")); else if (section == m_layerVisibleColumn) return QVariant(tr("Shown")); else if (section == m_layerPlayedColumn) return QVariant(tr("Played")); else if (section == m_modelNameColumn) return QVariant(tr("Model")); } return QVariant(); } QModelIndex LayerTreeModel::index(int row, int column, const QModelIndex &parent) const { // cell for a pane contains row, column, pane stack // -> its parent is the invalid cell // cell for a layer contains row, column, pane // -> its parent is row, column, pane stack (which identify the pane) if (!parent.isValid()) { if (row >= m_stack->getPaneCount() || column > 0) return QModelIndex(); return createIndex(row, column, m_stack); } QObject *obj = static_cast(parent.internalPointer()); if (obj == m_stack) { Pane *pane = m_stack->getPane(parent.row()); if (!pane || parent.column() > 0) return QModelIndex(); return createIndex(row, column, pane); } return QModelIndex(); } QModelIndex LayerTreeModel::parent(const QModelIndex &index) const { QObject *obj = static_cast(index.internalPointer()); if (m_deletedPanes.find(obj) != m_deletedPanes.end()) { // m_deletedPanes.erase(obj); return QModelIndex(); } Pane *pane = dynamic_cast(obj); if (pane) { int index = m_stack->getPaneIndex(pane); if (index >= 0) return createIndex(index, 0, m_stack); } return QModelIndex(); } int LayerTreeModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_stack->getPaneCount(); QObject *obj = static_cast(parent.internalPointer()); if (obj == m_stack) { Pane *pane = m_stack->getPane(parent.row()); if (!pane || parent.column() > 0) return 0; return pane->getLayerCount(); } return 0; } int LayerTreeModel::columnCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_columnCount; QObject *obj = static_cast(parent.internalPointer()); if (obj == m_stack) return m_columnCount; // row for a layer return 1; } sonic-visualiser-3.0.3/svgui/widgets/LayerTree.h0000644000000000000000000000713313111512442020010 0ustar 00000000000000 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_TREE_H_ #define _LAYER_TREE_H_ #include #include class PaneStack; class View; class Pane; class Layer; class PropertyContainer; class Model; class ModelMetadataModel : public QAbstractItemModel { Q_OBJECT public: ModelMetadataModel(PaneStack *stack, bool waveModelsOnly, QObject *parent = 0); virtual ~ModelMetadataModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; protected slots: void paneAdded(); void paneDeleted(); void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerSelected(PropertyContainer *); void propertyContainerPropertyChanged(PropertyContainer *); void playParametersAudibilityChanged(bool); void paneLayerModelChanged(); void rebuildModelSet(); protected: PaneStack *m_stack; bool m_waveModelsOnly; int m_modelTypeColumn; int m_modelNameColumn; int m_modelMakerColumn; int m_modelSourceColumn; int m_columnCount; std::set m_models; }; class LayerTreeModel : public QAbstractItemModel { Q_OBJECT public: LayerTreeModel(PaneStack *stack, QObject *parent = 0); virtual ~LayerTreeModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; protected slots: void paneAdded(); void paneAboutToBeDeleted(Pane *); void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerSelected(PropertyContainer *); void propertyContainerPropertyChanged(PropertyContainer *); void paneLayerModelChanged(); void playParametersAudibilityChanged(bool); protected: PaneStack *m_stack; std::set m_deletedPanes; int m_layerNameColumn; int m_layerVisibleColumn; int m_layerPlayedColumn; int m_modelNameColumn; int m_columnCount; }; #endif sonic-visualiser-3.0.3/svgui/widgets/LayerTreeDialog.cpp0000644000000000000000000000615113111512442021462 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "LayerTreeDialog.h" #include "LayerTree.h" #include "view/PaneStack.h" #include #include #include #include #include #include #include #include LayerTreeDialog::LayerTreeDialog(PaneStack *stack, QWidget *parent) : QDialog(parent), m_paneStack(stack) { setWindowTitle(tr("Layer Summary")); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *modelBox = new QGroupBox; modelBox->setTitle(tr("Audio Data Sources")); grid->addWidget(modelBox, 0, 0); grid->setRowStretch(0, 15); QGridLayout *subgrid = new QGridLayout; modelBox->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(5); m_modelView = new QTableView; subgrid->addWidget(m_modelView); m_modelView->verticalHeader()->hide(); #if (QT_VERSION >= 0x050000) m_modelView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); #else m_modelView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); #endif m_modelView->setShowGrid(false); m_modelModel = new ModelMetadataModel(m_paneStack, true); m_modelView->setModel(m_modelModel); QGroupBox *layerBox = new QGroupBox; layerBox->setTitle(tr("Panes and Layers")); grid->addWidget(layerBox, 1, 0); grid->setRowStretch(1, 20); subgrid = new QGridLayout; layerBox->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(5); m_layerView = new QTreeView; #if (QT_VERSION >= 0x050000) m_layerView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); #else m_layerView->header()->setResizeMode(QHeaderView::ResizeToContents); #endif subgrid->addWidget(m_layerView); m_layerModel = new LayerTreeModel(m_paneStack); m_layerView->setModel(m_layerModel); m_layerView->expandAll(); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); grid->addWidget(bb, 2, 0); grid->setRowStretch(2, 0); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() / 2; int height = available.height() / 3; if (height < 370) { if (available.height() > 500) height = 370; } if (width < 500) { if (available.width() > 650) width = 500; } resize(width, height); } LayerTreeDialog::~LayerTreeDialog() { delete m_layerModel; } sonic-visualiser-3.0.3/svgui/widgets/LayerTreeDialog.h0000644000000000000000000000212513111512442021124 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_TREE_DIALOG_H_ #define _LAYER_TREE_DIALOG_H_ #include class ModelMetadataModel; class LayerTreeModel; class PaneStack; class QTreeView; class QTableView; class LayerTreeDialog : public QDialog { Q_OBJECT public: LayerTreeDialog(PaneStack *stack, QWidget *parent = 0); ~LayerTreeDialog(); protected: PaneStack *m_paneStack; ModelMetadataModel *m_modelModel; QTableView *m_modelView; LayerTreeModel *m_layerModel; QTreeView *m_layerView; }; #endif sonic-visualiser-3.0.3/svgui/widgets/LevelPanToolButton.cpp0000644000000000000000000000776413111512442022221 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "LevelPanToolButton.h" #include "LevelPanWidget.h" #include #include #include #include #include #include using std::cerr; using std::endl; LevelPanToolButton::LevelPanToolButton(QWidget *parent) : QToolButton(parent), m_pixels(32), m_pixelsBig(32 * 3), m_muted(false), m_savedLevel(1.f) { m_lpw = new LevelPanWidget(); connect(m_lpw, SIGNAL(levelChanged(float)), this, SIGNAL(levelChanged(float))); connect(m_lpw, SIGNAL(levelChanged(float)), this, SLOT(selfLevelChanged(float))); connect(m_lpw, SIGNAL(panChanged(float)), this, SIGNAL(panChanged(float))); connect(m_lpw, SIGNAL(panChanged(float)), this, SLOT(update())); connect(this, SIGNAL(clicked(bool)), this, SLOT(selfClicked())); QMenu *menu = new QMenu(); QWidgetAction *wa = new QWidgetAction(menu); wa->setDefaultWidget(m_lpw); menu->addAction(wa); setPopupMode(InstantPopup); setMenu(menu); setToolTip(tr("Click to adjust level and pan")); setImageSize(m_pixels); setBigImageSize(m_pixelsBig); } LevelPanToolButton::~LevelPanToolButton() { } void LevelPanToolButton::wheelEvent(QWheelEvent *e) { m_lpw->wheelEvent(e); } float LevelPanToolButton::getLevel() const { return m_lpw->getLevel(); } float LevelPanToolButton::getPan() const { return m_lpw->getPan(); } bool LevelPanToolButton::includesMute() const { return m_lpw->includesMute(); } void LevelPanToolButton::setImageSize(int pixels) { m_pixels = pixels; QPixmap px(m_pixels, m_pixels); px.fill(Qt::transparent); setIcon(px); } void LevelPanToolButton::setBigImageSize(int pixels) { m_pixelsBig = pixels; m_lpw->setFixedWidth(m_pixelsBig); m_lpw->setFixedHeight(m_pixelsBig); } void LevelPanToolButton::setLevel(float level) { m_lpw->setLevel(level); update(); } void LevelPanToolButton::setPan(float pan) { m_lpw->setPan(pan); update(); } void LevelPanToolButton::setMonitoringLevels(float left, float right) { m_lpw->setMonitoringLevels(left, right); update(); } void LevelPanToolButton::setIncludeMute(bool include) { m_lpw->setIncludeMute(include); update(); } void LevelPanToolButton::setEnabled(bool enabled) { m_lpw->setEnabled(enabled); QToolButton::setEnabled(enabled); } void LevelPanToolButton::selfLevelChanged(float level) { if (level > 0.f) { m_muted = false; } else { m_muted = true; m_savedLevel = 1.f; } update(); } void LevelPanToolButton::selfClicked() { if (m_muted) { m_muted = false; m_lpw->setLevel(m_savedLevel); emit levelChanged(m_savedLevel); } else { m_savedLevel = m_lpw->getLevel(); m_muted = true; m_lpw->setLevel(0.f); emit levelChanged(0.f); } update(); } void LevelPanToolButton::paintEvent(QPaintEvent *) { QStylePainter p(this); QStyleOptionToolButton opt; initStyleOption(&opt); opt.features &= (~QStyleOptionToolButton::HasMenu); p.drawComplexControl(QStyle::CC_ToolButton, opt); if (m_pixels >= height()) { setImageSize(height()-1); } double margin = (double(height()) - m_pixels) / 2.0; m_lpw->renderTo(this, QRectF(margin, margin, m_pixels, m_pixels), false); } void LevelPanToolButton::enterEvent(QEvent *e) { QToolButton::enterEvent(e); emit mouseEntered(); } void LevelPanToolButton::leaveEvent(QEvent *e) { QToolButton::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/LevelPanToolButton.h0000644000000000000000000000405613111512442021655 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef LEVEL_PAN_TOOLBUTTON_H #define LEVEL_PAN_TOOLBUTTON_H #include class LevelPanWidget; class LevelPanToolButton : public QToolButton { Q_OBJECT public: LevelPanToolButton(QWidget *parent = 0); ~LevelPanToolButton(); /// Return level as a gain value in the range [0,1] float getLevel() const; /// Return pan as a value in the range [-1,1] float getPan() const; /// Discover whether the level range includes muting or not bool includesMute() const; void setImageSize(int pixels); void setBigImageSize(int pixels); public slots: /// Set level in the range [0,1] -- will be rounded void setLevel(float); /// Set pan in the range [-1,1] -- will be rounded void setPan(float); /// Set left and right peak monitoring levels in the range [0,1] void setMonitoringLevels(float, float); /// Specify whether the level range should include muting or not void setIncludeMute(bool); void setEnabled(bool enabled); signals: void levelChanged(float); void panChanged(float); void mouseEntered(); void mouseLeft(); private slots: void selfLevelChanged(float); void selfClicked(); protected: virtual void paintEvent(QPaintEvent *); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); virtual void wheelEvent(QWheelEvent *e); LevelPanWidget *m_lpw; int m_pixels; int m_pixelsBig; bool m_muted; float m_savedLevel; }; #endif sonic-visualiser-3.0.3/svgui/widgets/LevelPanWidget.cpp0000644000000000000000000002435413111512442021325 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "LevelPanWidget.h" #include #include #include #include "layer/ColourMapper.h" #include "base/AudioLevel.h" #include "WidgetScale.h" #include #include #include using std::cerr; using std::endl; static const int maxLevel = 4; // min is 0, may be mute or not depending on m_includeMute static const int maxPan = 2; // range is -maxPan to maxPan LevelPanWidget::LevelPanWidget(QWidget *parent) : QWidget(parent), m_level(maxLevel), m_pan(0), m_monitorLeft(-1), m_monitorRight(-1), m_editable(true), m_editing(false), m_includeMute(true) { setToolTip(tr("Drag vertically to adjust level, horizontally to adjust pan")); setLevel(1.0); setPan(0.0); } LevelPanWidget::~LevelPanWidget() { } void LevelPanWidget::setToDefault() { setLevel(1.0); setPan(0.0); emitLevelChanged(); emitPanChanged(); } QSize LevelPanWidget::sizeHint() const { return WidgetScale::scaleQSize(QSize(40, 40)); } static int db_to_level(double db) { // Only if !m_includeMute, otherwise AudioLevel is used. // Levels are: +6 0 -6 -12 -20 assert(maxLevel == 4); if (db > 3.) return 4; else if (db > -3.) return 3; else if (db > -9.) return 2; else if (db > -16.) return 1; else return 0; } static double level_to_db(int level) { // Only if !m_includeMute, otherwise AudioLevel is used. // Levels are: +6 0 -6 -12 -20 assert(maxLevel == 4); if (level >= 4) return 6.; else if (level == 3) return 0.; else if (level == 2) return -6.; else if (level == 1) return -12.; else return -20.; } int LevelPanWidget::audioLevelToLevel(float audioLevel, bool withMute) { int level; if (withMute) { level = AudioLevel::multiplier_to_fader (audioLevel, maxLevel, AudioLevel::ShortFader); } else { level = db_to_level(AudioLevel::multiplier_to_dB(audioLevel)); } if (level < 0) level = 0; if (level > maxLevel) level = maxLevel; return level; } float LevelPanWidget::levelToAudioLevel(int level, bool withMute) { if (withMute) { return float(AudioLevel::fader_to_multiplier (level, maxLevel, AudioLevel::ShortFader)); } else { return float(AudioLevel::dB_to_multiplier(level_to_db(level))); } } void LevelPanWidget::setLevel(float flevel) { int level = audioLevelToLevel(flevel, m_includeMute); if (level != m_level) { m_level = level; float convertsTo = getLevel(); if (fabsf(convertsTo - flevel) > 1e-5) { emitLevelChanged(); } update(); } } float LevelPanWidget::getLevel() const { float flevel = levelToAudioLevel(m_level, m_includeMute); return flevel; } int LevelPanWidget::audioPanToPan(float audioPan) { int pan = int(round(audioPan * maxPan)); if (pan < -maxPan) pan = -maxPan; if (pan > maxPan) pan = maxPan; return pan; } float LevelPanWidget::panToAudioPan(int pan) { return float(pan) / float(maxPan); } void LevelPanWidget::setPan(float fpan) { int pan = audioPanToPan(fpan); if (pan != m_pan) { m_pan = pan; update(); } } float LevelPanWidget::getPan() const { return panToAudioPan(m_pan); } void LevelPanWidget::setMonitoringLevels(float left, float right) { m_monitorLeft = left; m_monitorRight = right; update(); } bool LevelPanWidget::isEditable() const { return m_editable; } bool LevelPanWidget::includesMute() const { return m_includeMute; } void LevelPanWidget::setEditable(bool editable) { m_editable = editable; update(); } void LevelPanWidget::setIncludeMute(bool include) { m_includeMute = include; emitLevelChanged(); update(); } void LevelPanWidget::emitLevelChanged() { emit levelChanged(getLevel()); } void LevelPanWidget::emitPanChanged() { emit panChanged(getPan()); } void LevelPanWidget::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::MidButton || ((e->button() == Qt::LeftButton) && (e->modifiers() & Qt::ControlModifier))) { setToDefault(); } else if (e->button() == Qt::LeftButton) { m_editing = true; mouseMoveEvent(e); } } void LevelPanWidget::mouseReleaseEvent(QMouseEvent *e) { mouseMoveEvent(e); m_editing = false; } void LevelPanWidget::mouseMoveEvent(QMouseEvent *e) { if (!m_editable) return; if (!m_editing) return; int level, pan; toCell(rect(), e->pos(), level, pan); if (level == m_level && pan == m_pan) { return; } if (level != m_level) { m_level = level; emitLevelChanged(); } if (pan != m_pan) { m_pan = pan; emitPanChanged(); } update(); } void LevelPanWidget::wheelEvent(QWheelEvent *e) { if (e->modifiers() & Qt::ControlModifier) { if (e->delta() > 0) { if (m_pan < maxPan) { ++m_pan; emitPanChanged(); update(); } } else { if (m_pan > -maxPan) { --m_pan; emitPanChanged(); update(); } } } else { if (e->delta() > 0) { if (m_level < maxLevel) { ++m_level; emitLevelChanged(); update(); } } else { if (m_level > 0) { --m_level; emitLevelChanged(); update(); } } } } void LevelPanWidget::toCell(QRectF rect, QPointF loc, int &level, int &pan) const { double w = rect.width(), h = rect.height(); int npan = maxPan * 2 + 1; int nlevel = maxLevel + 1; double wcell = w / npan, hcell = h / nlevel; level = int((h - (loc.y() - rect.y())) / hcell); if (level < 0) level = 0; if (level > maxLevel) level = maxLevel; pan = int((loc.x() - rect.x()) / wcell) - maxPan; if (pan < -maxPan) pan = -maxPan; if (pan > maxPan) pan = maxPan; } QSizeF LevelPanWidget::cellSize(QRectF rect) const { double w = rect.width(), h = rect.height(); int npan = maxPan * 2 + 1; int nlevel = maxLevel + 1; double wcell = w / npan, hcell = h / nlevel; return QSizeF(wcell, hcell); } QPointF LevelPanWidget::cellCentre(QRectF rect, int level, int pan) const { QSizeF cs = cellSize(rect); return QPointF(rect.x() + cs.width() * (pan + maxPan) + cs.width() / 2., rect.y() + rect.height() - cs.height() * (level + 1) + cs.height() / 2.); } QSizeF LevelPanWidget::cellLightSize(QRectF rect) const { double extent = 3. / 4.; QSizeF cs = cellSize(rect); double m = std::min(cs.width(), cs.height()); return QSizeF(m * extent, m * extent); } QRectF LevelPanWidget::cellLightRect(QRectF rect, int level, int pan) const { QSizeF cls = cellLightSize(rect); QPointF cc = cellCentre(rect, level, pan); return QRectF(cc.x() - cls.width() / 2., cc.y() - cls.height() / 2., cls.width(), cls.height()); } double LevelPanWidget::thinLineWidth(QRectF rect) const { double tw = ceil(rect.width() / (maxPan * 2. * 10.)); double th = ceil(rect.height() / (maxLevel * 10.)); return std::min(th, tw); } static QColor level_to_colour(int level) { assert(maxLevel == 4); if (level == 0) return Qt::black; else if (level == 1) return QColor(80, 0, 0); else if (level == 2) return QColor(160, 0, 0); else if (level == 3) return QColor(255, 0, 0); else return QColor(255, 255, 0); } void LevelPanWidget::renderTo(QPaintDevice *dev, QRectF rect, bool asIfEditable) const { QPainter paint(dev); paint.setRenderHint(QPainter::Antialiasing, true); QPen pen; double thin = thinLineWidth(rect); pen.setColor(QColor(127, 127, 127, 127)); pen.setWidthF(cellLightSize(rect).width() + thin); pen.setCapStyle(Qt::RoundCap); paint.setPen(pen); paint.setBrush(Qt::NoBrush); for (int pan = -maxPan; pan <= maxPan; ++pan) { paint.drawLine(cellCentre(rect, 0, pan), cellCentre(rect, maxLevel, pan)); } if (m_monitorLeft > 0.f || m_monitorRight > 0.f) { paint.setPen(Qt::NoPen); for (int pan = -maxPan; pan <= maxPan; ++pan) { float audioPan = panToAudioPan(pan); float audioLevel; if (audioPan < 0.f) { audioLevel = m_monitorLeft + m_monitorRight * (1.f + audioPan); } else { audioLevel = m_monitorRight + m_monitorLeft * (1.f - audioPan); } int levelHere = audioLevelToLevel(audioLevel, false); for (int level = 0; level <= levelHere; ++level) { paint.setBrush(level_to_colour(level)); QRectF clr = cellLightRect(rect, level, pan); paint.drawEllipse(clr); } } paint.setPen(pen); paint.setBrush(Qt::NoBrush); } if (isEnabled()) { pen.setColor(Qt::black); } else { pen.setColor(Qt::darkGray); } if (!asIfEditable && m_includeMute && m_level == 0) { pen.setWidthF(thin * 2); pen.setCapStyle(Qt::RoundCap); paint.setPen(pen); paint.drawLine(cellCentre(rect, 0, -maxPan), cellCentre(rect, maxLevel, maxPan)); paint.drawLine(cellCentre(rect, maxLevel, -maxPan), cellCentre(rect, 0, maxPan)); return; } pen.setWidthF(thin); pen.setCapStyle(Qt::FlatCap); paint.setPen(pen); for (int level = 0; level <= m_level; ++level) { if (isEnabled()) { paint.setBrush(level_to_colour(level)); } QRectF clr = cellLightRect(rect, level, m_pan); if (m_includeMute && m_level == 0) { paint.drawLine(clr.topLeft(), clr.bottomRight()); paint.drawLine(clr.bottomLeft(), clr.topRight()); } else { paint.drawEllipse(clr); } } } void LevelPanWidget::paintEvent(QPaintEvent *) { renderTo(this, rect(), m_editable); } void LevelPanWidget::enterEvent(QEvent *e) { QWidget::enterEvent(e); emit mouseEntered(); } void LevelPanWidget::leaveEvent(QEvent *e) { QWidget::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/LevelPanWidget.h0000644000000000000000000000646513111512442020775 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef LEVEL_PAN_WIDGET_H #define LEVEL_PAN_WIDGET_H #include /** * A simple widget for coarse level and pan control. */ class LevelPanWidget : public QWidget { Q_OBJECT public: LevelPanWidget(QWidget *parent = 0); ~LevelPanWidget(); /// Return level as a gain value. The basic level range is [0,1] but the /// gain scale may go up to 4.0 float getLevel() const; /// Return pan as a value in the range [-1,1] float getPan() const; /// Find out whether the widget is editable bool isEditable() const; /// Discover whether the level range includes muting or not bool includesMute() const; /// Draw a suitably sized copy of the widget's contents to the given device void renderTo(QPaintDevice *, QRectF, bool asIfEditable) const; QSize sizeHint() const; public slots: /// Set level. The basic level range is [0,1] but the scale may go /// higher. The value will be rounded. void setLevel(float); /// Set pan in the range [-1,1]. The value will be rounded void setPan(float); /// Set left and right peak monitoring levels in the range [0,1] void setMonitoringLevels(float, float); /// Specify whether the widget is editable or read-only (default editable) void setEditable(bool); /// Specify whether the level range should include muting or not void setIncludeMute(bool); /// Reset to default values void setToDefault(); // public so it can be called from LevelPanToolButton (ew) virtual void wheelEvent(QWheelEvent *ev); signals: void levelChanged(float); // range [0,1] void panChanged(float); // range [-1,1] void mouseEntered(); void mouseLeft(); protected: virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void paintEvent(QPaintEvent *ev); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); void emitLevelChanged(); void emitPanChanged(); int m_level; int m_pan; float m_monitorLeft; float m_monitorRight; bool m_editable; bool m_editing; bool m_includeMute; static int audioLevelToLevel(float audioLevel, bool withMute); static float levelToAudioLevel(int level, bool withMute); static int audioPanToPan(float audioPan); static float panToAudioPan(int pan); QSizeF cellSize(QRectF) const; QPointF cellCentre(QRectF, int level, int pan) const; QSizeF cellLightSize(QRectF) const; QRectF cellLightRect(QRectF, int level, int pan) const; double thinLineWidth(QRectF) const; void toCell(QRectF, QPointF loc, int &level, int &pan) const; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ListInputDialog.cpp0000644000000000000000000000531513111512442021522 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "ListInputDialog.h" #include #include #include #include #include #include #include ListInputDialog::ListInputDialog(QWidget *parent, const QString &title, const QString &labelText, const QStringList &list, int current) : QDialog(parent), m_strings(list) { setWindowTitle(title); QVBoxLayout *vbox = new QVBoxLayout(this); QLabel *label = new QLabel(labelText, this); vbox->addWidget(label); vbox->addStretch(1); int count = 0; for (QStringList::const_iterator i = list.begin(); i != list.end(); ++i) { QRadioButton *radio = new QRadioButton(*i); if (current == count++) radio->setChecked(true); m_radioButtons.push_back(radio); vbox->addWidget(radio); } vbox->addStretch(1); m_footnote = new QLabel; vbox->addWidget(m_footnote); m_footnote->hide(); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); vbox->addWidget(bb); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); } ListInputDialog::~ListInputDialog() { } QString ListInputDialog::getCurrentString() const { for (size_t i = 0; i < m_radioButtons.size(); ++i) { if (m_radioButtons[i]->isChecked()) { return m_strings[int(i)]; } } return ""; } void ListInputDialog::setItemAvailability(int item, bool available) { m_radioButtons[item]->setEnabled(available); } void ListInputDialog::setFootnote(QString footnote) { m_footnote->setText(footnote); m_footnote->show(); } QString ListInputDialog::getItem(QWidget *parent, const QString &title, const QString &label, const QStringList &list, int current, bool *ok) { ListInputDialog dialog(parent, title, label, list, current); bool accepted = (dialog.exec() == QDialog::Accepted); if (ok) *ok = accepted; return dialog.getCurrentString(); } sonic-visualiser-3.0.3/svgui/widgets/ListInputDialog.h0000644000000000000000000000314713111512442021170 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _LIST_INPUT_DIALOG_H_ #define _LIST_INPUT_DIALOG_H_ #include #include #include #include class QRadioButton; class QLabel; /** * Like QInputDialog::getItem(), except that it offers the items as a * set of radio buttons instead of in a single combo box. */ class ListInputDialog : public QDialog { Q_OBJECT public: ListInputDialog(QWidget *parent, const QString &title, const QString &label, const QStringList &list, int current = 0); virtual ~ListInputDialog(); void setItemAvailability(int item, bool available); void setFootnote(QString footnote); QString getCurrentString() const; static QString getItem(QWidget *parent, const QString &title, const QString &label, const QStringList &list, int current = 0, bool *ok = 0); protected: QStringList m_strings; std::vector m_radioButtons; QLabel *m_footnote; }; #endif sonic-visualiser-3.0.3/svgui/widgets/MIDIFileImportDialog.cpp0000644000000000000000000000424413111512442022304 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "MIDIFileImportDialog.h" #include #include MIDIFileImportDialog::MIDIFileImportDialog(QWidget *parent) : m_parent(parent) { } MIDIFileImportDialog::TrackPreference MIDIFileImportDialog::getTrackImportPreference(QStringList displayNames, bool haveSomePercussion, QString &singleTrack) const { QStringList available; QString allTracks = tr("Merge all tracks"); QString allNonPercussion = tr("Merge all non-percussion tracks"); singleTrack = ""; int nonTrackItems = 1; available << allTracks; if (haveSomePercussion) { available << allNonPercussion; ++nonTrackItems; } available << displayNames; bool ok = false; QString selected = QInputDialog::getItem (0, tr("Select track or tracks to import"), tr("Select track to import

    You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.

    Please select the track or merged tracks you wish to import:"), available, 0, false, &ok); if (!ok || selected.isEmpty()) return ImportNothing; TrackPreference pref; if (selected == allTracks) pref = MergeAllTracks; else if (selected == allNonPercussion) pref = MergeAllNonPercussionTracks; else { singleTrack = selected; pref = ImportSingleTrack; } return pref; } void MIDIFileImportDialog::showError(QString error) { QMessageBox::critical(0, tr("Error in MIDI file import"), error); } sonic-visualiser-3.0.3/svgui/widgets/MIDIFileImportDialog.h0000644000000000000000000000213013111512442021741 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MIDI_FILE_IMPORT_DIALOG_H_ #define _MIDI_FILE_IMPORT_DIALOG_H_ #include #include "data/fileio/MIDIFileReader.h" class MIDIFileImportDialog : public QObject, public MIDIFileImportPreferenceAcquirer { Q_OBJECT public: MIDIFileImportDialog(QWidget *parent = 0); virtual TrackPreference getTrackImportPreference (QStringList trackNames, bool haveSomePercussion, QString &singleTrack) const; virtual void showError(QString error); protected: QWidget *m_parent; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ModelDataTableDialog.cpp0000644000000000000000000002204613111512442022371 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ModelDataTableDialog.h" #include "data/model/ModelDataTableModel.h" #include "data/model/TabularModel.h" #include "data/model/Model.h" #include "CommandHistory.h" #include "IconLoader.h" #include #include #include #include #include #include #include #include #include #include #include #include ModelDataTableDialog::ModelDataTableDialog(TabularModel *model, QString title, QWidget *parent) : QMainWindow(parent), m_currentRow(0), m_trackPlayback(true) { setWindowTitle(tr("Data Editor")); QToolBar *toolbar; toolbar = addToolBar(tr("Playback Toolbar")); m_playToolbar = toolbar; toolbar = addToolBar(tr("Play Mode Toolbar")); IconLoader il; QAction *action = new QAction(il.load("playfollow"), tr("Track Playback"), this); action->setStatusTip(tr("Toggle tracking of playback position")); action->setCheckable(true); action->setChecked(m_trackPlayback); connect(action, SIGNAL(triggered()), this, SLOT(togglePlayTracking())); toolbar->addAction(action); toolbar = addToolBar(tr("Edit Toolbar")); action = new QAction(il.load("draw"), tr("Insert New Item"), this); action->setShortcut(tr("Insert")); action->setStatusTip(tr("Insert a new item")); connect(action, SIGNAL(triggered()), this, SLOT(insertRow())); toolbar->addAction(action); action = new QAction(il.load("datadelete"), tr("Delete Selected Items"), this); action->setShortcut(tr("Delete")); action->setStatusTip(tr("Delete the selected item or items")); connect(action, SIGNAL(triggered()), this, SLOT(deleteRows())); toolbar->addAction(action); CommandHistory::getInstance()->registerToolbar(toolbar); /* action = new QAction(il.load("dataedit"), tr("Edit Selected Item"), this); action->setShortcut(tr("Edit")); action->setStatusTip(tr("Edit the selected item")); connect(action, SIGNAL(triggered()), this, SLOT(editRow())); toolbar->addAction(action); */ QFrame *mainFrame = new QFrame; setCentralWidget(mainFrame); QGridLayout *grid = new QGridLayout; mainFrame->setLayout(grid); QGroupBox *box = new QGroupBox; if (title != "") { box->setTitle(title); } else { box->setTitle(tr("Data in Layer")); } grid->addWidget(box, 0, 0); grid->setRowStretch(0, 15); QGridLayout *subgrid = new QGridLayout; box->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(5); subgrid->addWidget(new QLabel(tr("Find:")), 1, 0); subgrid->addWidget(new QLabel(tr(" ")), 1, 1); m_find = new QLineEdit; subgrid->addWidget(m_find, 1, 2); connect(m_find, SIGNAL(textChanged(const QString &)), this, SLOT(searchTextChanged(const QString &))); connect(m_find, SIGNAL(returnPressed()), this, SLOT(searchRepeated())); m_tableView = new QTableView; subgrid->addWidget(m_tableView, 0, 0, 1, 3); m_tableView->setSortingEnabled(true); m_tableView->sortByColumn(0, Qt::AscendingOrder); m_table = new ModelDataTableModel(model); m_tableView->setModel(m_table); m_tableView->horizontalHeader()->setStretchLastSection(true); connect(m_tableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(viewClicked(const QModelIndex &))); connect(m_tableView, SIGNAL(pressed(const QModelIndex &)), this, SLOT(viewPressed(const QModelIndex &))); connect(m_tableView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(currentChanged(const QModelIndex &, const QModelIndex &))); connect(m_table, SIGNAL(addCommand(Command *)), this, SLOT(addCommand(Command *))); connect(m_table, SIGNAL(currentChanged(const QModelIndex &)), this, SLOT(currentChangedThroughResort(const QModelIndex &))); connect(m_table, SIGNAL(modelRemoved()), this, SLOT(modelRemoved())); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(rejected()), this, SLOT(close())); grid->addWidget(bb, 2, 0); grid->setRowStretch(2, 0); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() / 3; int height = available.height() / 2; if (height < 370) { if (available.height() > 500) height = 370; } if (width < 650) { if (available.width() > 750) width = 650; else if (width < 500) { if (available.width() > 650) width = 500; } } resize(width, height); } ModelDataTableDialog::~ModelDataTableDialog() { delete m_table; } void ModelDataTableDialog::userScrolledToFrame(sv_frame_t frame) { QModelIndex index = m_table->getModelIndexForFrame(frame); makeCurrent(index.row()); } void ModelDataTableDialog::playbackScrolledToFrame(sv_frame_t frame) { if (m_trackPlayback) { QModelIndex index = m_table->getModelIndexForFrame(frame); makeCurrent(index.row()); } } void ModelDataTableDialog::searchTextChanged(const QString &text) { QModelIndex mi = m_table->findText(text); if (mi.isValid()) { makeCurrent(mi.row()); m_tableView->selectionModel()->setCurrentIndex (mi, QItemSelectionModel::ClearAndSelect); } } void ModelDataTableDialog::searchRepeated() { QModelIndex mi = m_table->findText(m_find->text()); if (mi.isValid()) { makeCurrent(mi.row()); m_tableView->selectionModel()->setCurrentIndex (mi, QItemSelectionModel::ClearAndSelect); } } void ModelDataTableDialog::makeCurrent(int row) { int rh = m_tableView->height() / m_tableView->rowHeight(0); int topRow = row - rh/4; if (topRow < 0) topRow = 0; // should only scroll if the desired row is not currently visible // should only select if no part of the desired row is currently selected // cerr << "rh = " << rh << ", row = " << row << ", scrolling to " // << topRow << endl; int pos = m_tableView->rowViewportPosition(row); if (pos < 0 || pos >= m_tableView->height() - rh) { m_tableView->scrollTo(m_table->index(topRow, 0)); } bool haveRowSelected = false; for (int i = 0; i < m_table->columnCount(); ++i) { if (m_tableView->selectionModel()->isSelected(m_table->index(row, i))) { haveRowSelected = true; break; } } if (!haveRowSelected) { m_tableView->selectionModel()->setCurrentIndex (m_table->index(row, 0), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } } void ModelDataTableDialog::viewClicked(const QModelIndex &index) { // SVDEBUG << "ModelDataTableDialog::viewClicked: " << index.row() << ", " << index.column() << endl; emit scrollToFrame(m_table->getFrameForModelIndex(index)); } void ModelDataTableDialog::viewPressed(const QModelIndex &) { // SVDEBUG << "ModelDataTableDialog::viewPressed: " << index.row() << ", " << index.column() << endl; } void ModelDataTableDialog::currentChanged(const QModelIndex ¤t, const QModelIndex &) { // SVDEBUG << "ModelDataTableDialog::currentChanged: from " // << previous.row() << ", " << previous.column() // << " to " << current.row() << ", " << current.column() // << endl; m_currentRow = current.row(); m_table->setCurrentRow(m_currentRow); } void ModelDataTableDialog::insertRow() { m_table->insertRow(m_currentRow); } void ModelDataTableDialog::deleteRows() { // not efficient while (m_tableView->selectionModel()->hasSelection()) { m_table->removeRow (m_tableView->selectionModel()->selection().indexes().begin()->row()); } } void ModelDataTableDialog::editRow() { } void ModelDataTableDialog::addCommand(Command *command) { CommandHistory::getInstance()->addCommand(command, false, true); } void ModelDataTableDialog::togglePlayTracking() { m_trackPlayback = !m_trackPlayback; } void ModelDataTableDialog::currentChangedThroughResort(const QModelIndex &index) { // SVDEBUG << "ModelDataTableDialog::currentChangedThroughResort: row = " << index.row() << endl; // m_tableView->scrollTo(index); makeCurrent(index.row()); } void ModelDataTableDialog::modelRemoved() { close(); } sonic-visualiser-3.0.3/svgui/widgets/ModelDataTableDialog.h0000644000000000000000000000366213111512442022041 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_DATA_TABLE_DIALOG_H_ #define _MODEL_DATA_TABLE_DIALOG_H_ #include #include "base/BaseTypes.h" class TabularModel; class ModelDataTableModel; class QTableView; class QModelIndex; class Command; class QToolBar; class QLineEdit; class ModelDataTableDialog : public QMainWindow { Q_OBJECT public: ModelDataTableDialog(TabularModel *model, QString title, QWidget *parent =0); ~ModelDataTableDialog(); QToolBar *getPlayToolbar() { return m_playToolbar; } signals: void scrollToFrame(sv_frame_t frame); public slots: void userScrolledToFrame(sv_frame_t frame); void playbackScrolledToFrame(sv_frame_t frame); void addCommand(Command *); protected slots: void viewClicked(const QModelIndex &); void viewPressed(const QModelIndex &); void currentChanged(const QModelIndex &, const QModelIndex &); void currentChangedThroughResort(const QModelIndex &); void searchTextChanged(const QString &); void searchRepeated(); void insertRow(); void deleteRows(); void editRow(); void togglePlayTracking(); void modelRemoved(); protected: void makeCurrent(int row); ModelDataTableModel *m_table; QToolBar *m_playToolbar; QTableView *m_tableView; QLineEdit *m_find; int m_currentRow; bool m_trackPlayback; }; #endif sonic-visualiser-3.0.3/svgui/widgets/NotifyingCheckBox.cpp0000644000000000000000000000156213111512442022024 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "NotifyingCheckBox.h" NotifyingCheckBox::~NotifyingCheckBox() { } void NotifyingCheckBox::enterEvent(QEvent *e) { QCheckBox::enterEvent(e); emit mouseEntered(); } void NotifyingCheckBox::leaveEvent(QEvent *e) { QCheckBox::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/NotifyingCheckBox.h0000644000000000000000000000217513111512442021472 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _NOTIFYING_CHECK_BOX_H_ #define _NOTIFYING_CHECK_BOX_H_ #include /** * Very trivial enhancement to QCheckBox to make it emit signals when * the mouse enters and leaves (for context help). */ class NotifyingCheckBox : public QCheckBox { Q_OBJECT public: NotifyingCheckBox(QWidget *parent = 0) : QCheckBox(parent) { } virtual ~NotifyingCheckBox(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-3.0.3/svgui/widgets/NotifyingComboBox.cpp0000644000000000000000000000156213111512442022046 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "NotifyingComboBox.h" NotifyingComboBox::~NotifyingComboBox() { } void NotifyingComboBox::enterEvent(QEvent *e) { QComboBox::enterEvent(e); emit mouseEntered(); } void NotifyingComboBox::leaveEvent(QEvent *e) { QComboBox::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/NotifyingComboBox.h0000644000000000000000000000217713111512442021516 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_NOTIFYING_COMBO_BOX_H #define SV_NOTIFYING_COMBO_BOX_H #include /** * Very trivial enhancement to QComboBox to make it emit signals when * the mouse enters and leaves (for context help). */ class NotifyingComboBox : public QComboBox { Q_OBJECT public: NotifyingComboBox(QWidget *parent = 0) : QComboBox(parent) { } virtual ~NotifyingComboBox(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-3.0.3/svgui/widgets/NotifyingPushButton.cpp0000644000000000000000000000160013111512442022442 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "NotifyingPushButton.h" NotifyingPushButton::~NotifyingPushButton() { } void NotifyingPushButton::enterEvent(QEvent *e) { QPushButton::enterEvent(e); emit mouseEntered(); } void NotifyingPushButton::leaveEvent(QEvent *e) { QPushButton::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/NotifyingPushButton.h0000644000000000000000000000226113111512442022113 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_NOTIFYING_PUSH_BUTTON_H #define SV_NOTIFYING_PUSH_BUTTON_H #include /** * Very trivial enhancement to QPushButton to make it emit signals * when the mouse enters and leaves (for context help). See also * NotifyingToolButton */ class NotifyingPushButton : public QPushButton { Q_OBJECT public: NotifyingPushButton(QWidget *parent = 0) : QPushButton(parent) { } virtual ~NotifyingPushButton(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-3.0.3/svgui/widgets/NotifyingTabBar.cpp0000644000000000000000000000220413111512442021463 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "NotifyingTabBar.h" #include NotifyingTabBar::NotifyingTabBar(QWidget *parent) : QTabBar(parent) { } NotifyingTabBar::~NotifyingTabBar() { } void NotifyingTabBar::mousePressEvent(QMouseEvent *e) { int i = currentIndex(); QTabBar::mousePressEvent(e); if (currentIndex() == i) { emit activeTabClicked(); } } void NotifyingTabBar::enterEvent(QEvent *e) { QTabBar::enterEvent(e); emit mouseEntered(); } void NotifyingTabBar::leaveEvent(QEvent *e) { QTabBar::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/NotifyingTabBar.h0000644000000000000000000000203613111512442021133 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _NOTIFYING_TAB_BAR_H_ #define _NOTIFYING_TAB_BAR_H_ #include class NotifyingTabBar : public QTabBar { Q_OBJECT public: NotifyingTabBar(QWidget *parent = 0); virtual ~NotifyingTabBar(); signals: void mouseEntered(); void mouseLeft(); void activeTabClicked(); protected: virtual void mousePressEvent(QMouseEvent *); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-3.0.3/svgui/widgets/NotifyingToolButton.cpp0000644000000000000000000000160013111512442022440 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "NotifyingToolButton.h" NotifyingToolButton::~NotifyingToolButton() { } void NotifyingToolButton::enterEvent(QEvent *e) { QToolButton::enterEvent(e); emit mouseEntered(); } void NotifyingToolButton::leaveEvent(QEvent *e) { QToolButton::enterEvent(e); emit mouseLeft(); } sonic-visualiser-3.0.3/svgui/widgets/NotifyingToolButton.h0000644000000000000000000000226113111512442022111 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_NOTIFYING_TOOL_BUTTON_H #define SV_NOTIFYING_TOOL_BUTTON_H #include /** * Very trivial enhancement to QToolButton to make it emit signals * when the mouse enters and leaves (for context help). See also * NotifyingPushButton */ class NotifyingToolButton : public QToolButton { Q_OBJECT public: NotifyingToolButton(QWidget *parent = 0) : QToolButton(parent) { } virtual ~NotifyingToolButton(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-3.0.3/svgui/widgets/Panner.cpp0000644000000000000000000001422213111512442017667 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Panner.h" #include #include #include #include #include "WidgetScale.h" #include #include Panner::Panner(QWidget *parent) : QWidget(parent), m_rectX(0), m_rectY(0), m_rectWidth(1), m_rectHeight(1), m_scrollUnit(0), m_defaultCentreX(0), m_defaultCentreY(0), m_defaultsSet(false), m_thumbColour(palette().highlightedText().color()), m_backgroundAlpha(255), m_thumbAlpha(255), m_clicked(false), m_dragStartX(0), m_dragStartY(0) { } Panner::~Panner() { } void Panner::setAlpha(int backgroundAlpha, int thumbAlpha) { m_backgroundAlpha = backgroundAlpha; m_thumbAlpha = thumbAlpha; } void Panner::setScrollUnit(float unit) { m_scrollUnit = unit; } void Panner::scroll(bool up) { float unit = m_scrollUnit; if (unit == 0.f) { unit = float(m_rectHeight) / (6 * float(height())); if (unit < 0.01f) unit = 0.01f; } if (!up) { m_rectY += unit; } else { m_rectY -= unit; } normalise(); emitAndUpdate(); } void Panner::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::MidButton || ((e->button() == Qt::LeftButton) && (e->modifiers() & Qt::ControlModifier))) { resetToDefault(); } else if (e->button() == Qt::LeftButton) { m_clicked = true; m_clickPos = e->pos(); m_dragStartX = m_rectX; m_dragStartY = m_rectY; } } void Panner::mouseDoubleClickEvent(QMouseEvent *e) { if (e->button() != Qt::LeftButton) { return; } emit doubleClicked(); } void Panner::mouseMoveEvent(QMouseEvent *e) { if (!m_clicked) return; float dx = float(e->pos().x() - m_clickPos.x()) / float(width()); float dy = float(e->pos().y() - m_clickPos.y()) / float(height()); m_rectX = m_dragStartX + dx; m_rectY = m_dragStartY + dy; normalise(); repaint(); emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight); emit rectCentreMoved(centreX(), centreY()); } void Panner::mouseReleaseEvent(QMouseEvent *e) { if (!m_clicked) return; mouseMoveEvent(e); m_clicked = false; } void Panner::wheelEvent(QWheelEvent *e) { scroll(e->delta() > 0); } void Panner::enterEvent(QEvent *) { emit mouseEntered(); } void Panner::leaveEvent(QEvent *) { emit mouseLeft(); } void Panner::paintEvent(QPaintEvent *) { QPainter paint(this); paint.setRenderHint(QPainter::Antialiasing, false); QColor bg(palette().background().color()); bg.setAlpha(m_backgroundAlpha); int penWidth = WidgetScale::scalePixelSize(1); if (penWidth < 1) penWidth = 1; paint.setPen(QPen(palette().dark().color(), penWidth)); paint.setBrush(bg); paint.drawRect(penWidth/2, penWidth/2, width()-penWidth/2-1, height()-penWidth/2-1); QColor hl(m_thumbColour); hl.setAlpha(m_thumbAlpha); paint.setBrush(hl); int rw = int(lrintf(float(width() - 1) * m_rectWidth)); int rh = int(lrintf(float(height() - 1) * m_rectHeight)); if (rw < 2) rw = 2; if (rh < 2) rh = 2; paint.drawRect(int(lrintf(float(width()) * m_rectX)), int(lrintf(float(height()) * m_rectY)), rw, rh); } void Panner::normalise() { if (m_rectWidth > 1.f) m_rectWidth = 1.f; if (m_rectHeight > 1.f) m_rectHeight = 1.f; if (m_rectX + m_rectWidth > 1.f) m_rectX = 1.f - m_rectWidth; if (m_rectX < 0) m_rectX = 0; if (m_rectY + m_rectHeight > 1.f) m_rectY = 1.f - m_rectHeight; if (m_rectY < 0) m_rectY = 0; if (!m_defaultsSet) { m_defaultCentreX = centreX(); m_defaultCentreY = centreY(); m_defaultsSet = true; } } void Panner::emitAndUpdate() { emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight); emit rectCentreMoved(centreX(), centreY()); update(); } void Panner::getRectExtents(float &x0, float &y0, float &width, float &height) { x0 = m_rectX; y0 = m_rectY; width = m_rectWidth; height = m_rectHeight; } void Panner::setRectExtents(float x0, float y0, float width, float height) { // SVDEBUG << "Panner::setRectExtents(" << x0 << ", " << y0 << ", " // << width << ", " << height << ")" << endl; if (m_rectX == x0 && m_rectY == y0 && m_rectWidth == width && m_rectHeight == height) { return; } m_rectX = x0; m_rectY = y0; m_rectWidth = width; m_rectHeight = height; normalise(); emitAndUpdate(); } void Panner::setRectWidth(float width) { if (m_rectWidth == width) return; m_rectWidth = width; normalise(); emitAndUpdate(); } void Panner::setRectHeight(float height) { if (m_rectHeight == height) return; m_rectHeight = height; normalise(); emitAndUpdate(); } void Panner::setRectCentreX(float x) { float x0 = x - m_rectWidth/2; if (x0 == m_rectX) return; m_rectX = x0; normalise(); emitAndUpdate(); } void Panner::setRectCentreY(float y) { float y0 = y - m_rectHeight/2; if (y0 == m_rectY) return; m_rectY = y0; normalise(); emitAndUpdate(); } QSize Panner::sizeHint() const { return QSize(30, 30); } void Panner::setDefaultRectCentre(float cx, float cy) { m_defaultCentreX = cx; m_defaultCentreY = cy; m_defaultsSet = true; } void Panner::resetToDefault() { float x0 = m_defaultCentreX - m_rectWidth/2; float y0 = m_defaultCentreY - m_rectHeight/2; if (x0 == m_rectX && y0 == m_rectY) return; m_rectX = x0; m_rectY = y0; normalise(); emitAndUpdate(); } sonic-visualiser-3.0.3/svgui/widgets/Panner.h0000644000000000000000000001033313111512442017333 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PANNER_H_ #define _PANNER_H_ #include class Panner : public QWidget { Q_OBJECT public: Panner(QWidget *parent = 0); virtual ~Panner(); void setDefaultRectCentre(float, float); void setThumbColour(QColor colour); void setAlpha(int backgroundAlpha, int thumbAlpha); /** * Set the amount the scroll() function or mouse wheel movement * makes the panner rectangle move by. The default value of 0 * means to select a value automatically based on the dimensions * of the panner rectangle. */ void setScrollUnit(float unit); void getRectExtents(float &x0, float &y0, float &width, float &height); virtual QSize sizeHint() const; signals: /** * Emitted when the panned rectangle is dragged or otherwise * moved. Arguments are x0, y0, width and height of the rectangle * in the range 0 -> 1 as proportions of the width and height of * the whole widget. */ void rectExtentsChanged(float, float, float, float); /** * Emitted when the rectangle is dragged or otherwise moved (as * well as extentsChanged). Arguments are the centre coordinates * of the rectangle in the range 0 -> 1 as proportions of the * width and height of the whole widget. */ void rectCentreMoved(float, float); /** * Emitted when the panner is double-clicked (for the "customer" * code to pop up a value editing dialog, for example). */ void doubleClicked(); void mouseEntered(); void mouseLeft(); public slots: /** * Set the extents of the panned rectangle within the overall * panner widget. Coordinates are in the range 0 -> 1 in both axes, * with 0 at the top in the y axis. */ void setRectExtents(float x0, float y0, float width, float height); /** * Set the width of the panned rectangle as a fraction (0 -> 1) of * that of the whole panner widget. */ void setRectWidth(float width); /** * Set the height of the panned rectangle as a fraction (0 -> 1) * of that of the whole panner widget. */ void setRectHeight(float height); /** * Set the location of the centre of the panned rectangle on the x * axis, as a proportion (0 -> 1) of the width of the whole panner * widget. */ void setRectCentreX(float x); /** * Set the location of the centre of the panned rectangle on the y * axis, as a proportion (0 -> 1) of the height of the whole panner * widget. */ void setRectCentreY(float y); /** * Move up (if up is true) or down a bit. This is basically the * same action as rolling the mouse wheel one notch. */ void scroll(bool up); void resetToDefault(); protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void wheelEvent(QWheelEvent *e); virtual void paintEvent(QPaintEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); void normalise(); void emitAndUpdate(); float m_rectX; float m_rectY; float m_rectWidth; float m_rectHeight; float m_scrollUnit; float m_defaultCentreX; float m_defaultCentreY; bool m_defaultsSet; QColor m_thumbColour; int m_backgroundAlpha; int m_thumbAlpha; float centreX() const { return m_rectX + m_rectWidth/2; } float centreY() const { return m_rectY + m_rectHeight/2; } bool m_clicked; QPoint m_clickPos; float m_dragStartX; float m_dragStartY; }; #endif sonic-visualiser-3.0.3/svgui/widgets/PluginParameterBox.cpp0000644000000000000000000003163213111512442022220 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PluginParameterBox.h" #include "AudioDial.h" #include "plugin/PluginXml.h" #include "plugin/RealTimePluginInstance.h" // for PortHint stuff #include "base/RangeMapper.h" #include #include #include #include #include #include #include #include #include PluginParameterBox::PluginParameterBox(Vamp::PluginBase *plugin, QWidget *parent) : QFrame(parent), m_plugin(plugin), m_programCombo(0) { m_layout = new QGridLayout; setLayout(m_layout); populate(); } PluginParameterBox::~PluginParameterBox() { } void PluginParameterBox::populate() { Vamp::PluginBase::ParameterList params = m_plugin->getParameterDescriptors(); m_programs = m_plugin->getPrograms(); m_params.clear(); if (params.empty() && m_programs.empty()) { m_layout->addWidget (new QLabel(tr("This plugin has no adjustable parameters.")), 0, 0); } int offset = 0; if (!m_programs.empty()) { std::string currentProgram = m_plugin->getCurrentProgram(); m_programCombo = new QComboBox; m_programCombo->setMaxVisibleItems (int(m_programs.size() < 25 ? m_programs.size() : 20)); for (int i = 0; in_range_for(m_programs, i); ++i) { m_programCombo->addItem(m_programs[i].c_str()); if (m_programs[i] == currentProgram) { m_programCombo->setCurrentIndex(int(i)); } } m_layout->addWidget(new QLabel(tr("Program")), 0, 0); m_layout->addWidget(m_programCombo, 0, 1, 1, 2); connect(m_programCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(programComboChanged(const QString &))); offset = 1; } for (int i = 0; in_range_for(params, i); ++i) { QString identifier = params[i].identifier.c_str(); QString name = params[i].name.c_str(); QString unit = params[i].unit.c_str(); float min = params[i].minValue; float max = params[i].maxValue; float deft = params[i].defaultValue; float value = m_plugin->getParameter(params[i].identifier); int hint = PortHint::NoHint; RealTimePluginInstance *rtpi = dynamic_cast (m_plugin); if (rtpi) { hint = rtpi->getParameterDisplayHint(i); } float qtz = 0.0; if (params[i].isQuantized) qtz = params[i].quantizeStep; // cerr << "PluginParameterBox: hint = " << hint << ", min = " << min << ", max = " // << max << ", qtz = " << qtz << endl; std::vector valueNames = params[i].valueNames; // construct an integer range int imin = 0, imax = 100; if (!(hint & PortHint::Logarithmic)) { if (qtz > 0.0) { imax = int(lrintf((max - min) / qtz)); } else { qtz = (max - min) / 100.f; } } //!!! would be nice to ensure the default value corresponds to // an integer! QLabel *label = new QLabel(name); if (params[i].description != "") { label->setToolTip(QString("%1") .arg(params[i].description.c_str()) .replace("\n", "
    ")); } m_layout->addWidget(label, i + offset, 0); ParamRec rec; rec.param = params[i]; rec.dial = 0; rec.spin = 0; rec.check = 0; rec.combo = 0; if (params[i].isQuantized && !valueNames.empty()) { QComboBox *combobox = new QComboBox; combobox->setObjectName(identifier); for (unsigned int j = 0; j < valueNames.size(); ++j) { combobox->addItem(valueNames[j].c_str()); if ((unsigned int)(lrintf(fabsf((value - min) / qtz))) == j) { combobox->setCurrentIndex(j); } } connect(combobox, SIGNAL(activated(int)), this, SLOT(dialChanged(int))); m_layout->addWidget(combobox, i + offset, 1, 1, 2); rec.combo = combobox; } else if (min == 0.0 && max == 1.0 && qtz == 1.0) { QCheckBox *checkbox = new QCheckBox; checkbox->setObjectName(identifier); checkbox->setCheckState(value < 0.5 ? Qt::Unchecked : Qt::Checked); connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxChanged(int))); m_layout->addWidget(checkbox, i + offset, 2); rec.check = checkbox; } else { AudioDial *dial = new AudioDial; dial->setObjectName(name); dial->setMinimum(imin); dial->setMaximum(imax); dial->setPageStep(1); dial->setNotchesVisible((imax - imin) <= 12); //!!! dial->setDefaultValue(lrintf((deft - min) / qtz)); // dial->setValue(lrintf((value - min) / qtz)); dial->setFixedWidth(32); dial->setFixedHeight(32); RangeMapper *rm = 0; if (hint & PortHint::Logarithmic) { rm = new LogRangeMapper(imin, imax, min, max, unit); } else { rm = new LinearRangeMapper(imin, imax, min, max, unit); } dial->setRangeMapper(rm); dial->setDefaultValue(rm->getPositionForValue(deft)); dial->setValue(rm->getPositionForValue(value)); dial->setShowToolTip(true); connect(dial, SIGNAL(valueChanged(int)), this, SLOT(dialChanged(int))); m_layout->addWidget(dial, i + offset, 1); QDoubleSpinBox *spinbox = new QDoubleSpinBox; spinbox->setObjectName(identifier); spinbox->setMinimum(min); spinbox->setMaximum(max); spinbox->setSuffix(QString(" %1").arg(unit)); if (qtz != 0) spinbox->setSingleStep(qtz); spinbox->setValue(value); spinbox->setDecimals(4); connect(spinbox, SIGNAL(valueChanged(double)), this, SLOT(spinBoxChanged(double))); m_layout->addWidget(spinbox, i + offset, 2); rec.dial = dial; rec.spin = spinbox; } m_params[identifier] = rec; m_nameMap[name] = identifier; } } void PluginParameterBox::dialChanged(int ival) { QObject *obj = sender(); QString identifier = obj->objectName(); if (m_params.find(identifier) == m_params.end() && m_nameMap.find(identifier) != m_nameMap.end()) { identifier = m_nameMap[identifier]; } if (m_params.find(identifier) == m_params.end()) { cerr << "WARNING: PluginParameterBox::dialChanged: Unknown parameter \"" << identifier << "\"" << endl; return; } Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param; float min = params.minValue; float max = params.maxValue; float newValue; float qtz = 0.0; if (params.isQuantized) qtz = params.quantizeStep; AudioDial *ad = dynamic_cast(obj); if (ad && ad->rangeMapper()) { newValue = float(ad->mappedValue()); if (newValue < min) newValue = min; if (newValue > max) newValue = max; if (qtz != 0.0) { ival = int(lrintf((newValue - min) / qtz)); newValue = min + float(ival) * qtz; } } else { if (qtz == 0.f) { qtz = (max - min) / 100.f; } newValue = min + float(ival) * qtz; } // SVDEBUG << "PluginParameterBox::dialChanged: newValue = " << newValue << endl; QDoubleSpinBox *spin = m_params[identifier].spin; if (spin) { spin->blockSignals(true); spin->setValue(newValue); spin->blockSignals(false); } // SVDEBUG << "setting plugin parameter \"" << identifier << "\" to value " << newValue << endl; m_plugin->setParameter(identifier.toStdString(), newValue); updateProgramCombo(); emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::checkBoxChanged(int state) { QObject *obj = sender(); QString identifier = obj->objectName(); if (m_params.find(identifier) == m_params.end() && m_nameMap.find(identifier) != m_nameMap.end()) { identifier = m_nameMap[identifier]; } if (m_params.find(identifier) == m_params.end()) { cerr << "WARNING: PluginParameterBox::checkBoxChanged: Unknown parameter \"" << identifier << "\"" << endl; return; } Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param; if (state) m_plugin->setParameter(identifier.toStdString(), 1.0); else m_plugin->setParameter(identifier.toStdString(), 0.0); updateProgramCombo(); emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::spinBoxChanged(double value) { QObject *obj = sender(); QString identifier = obj->objectName(); if (m_params.find(identifier) == m_params.end() && m_nameMap.find(identifier) != m_nameMap.end()) { identifier = m_nameMap[identifier]; } if (m_params.find(identifier) == m_params.end()) { cerr << "WARNING: PluginParameterBox::spinBoxChanged: Unknown parameter \"" << identifier << "\"" << endl; return; } Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param; float min = params.minValue; float max = params.maxValue; float qtz = 0.0; if (params.isQuantized) qtz = params.quantizeStep; if (qtz > 0.0) { int step = int(lrintf(float(value - min) / qtz)); value = min + float(step) * qtz; } // int imax = 100; if (qtz > 0.0) { // imax = lrintf((max - min) / qtz); } else { qtz = (max - min) / 100.f; } int ival = int(lrintf(float(value - min) / qtz)); AudioDial *dial = m_params[identifier].dial; if (dial) { dial->blockSignals(true); if (dial->rangeMapper()) { dial->setMappedValue(value); } else { dial->setValue(ival); } dial->blockSignals(false); } SVDEBUG << "setting plugin parameter \"" << identifier << "\" to value " << value << endl; m_plugin->setParameter(identifier.toStdString(), float(value)); updateProgramCombo(); emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::programComboChanged(const QString &newProgram) { m_plugin->selectProgram(newProgram.toStdString()); for (std::map::iterator i = m_params.begin(); i != m_params.end(); ++i) { Vamp::PluginBase::ParameterDescriptor ¶m = i->second.param; float value = m_plugin->getParameter(param.identifier); if (i->second.spin) { i->second.spin->blockSignals(true); i->second.spin->setValue(value); i->second.spin->blockSignals(false); } if (i->second.dial) { float min = param.minValue; float max = param.maxValue; float qtz = 0.0; if (param.isQuantized) qtz = param.quantizeStep; if (qtz == 0.0) { qtz = (max - min) / 100.f; } i->second.dial->blockSignals(true); i->second.dial->setValue(int(lrintf(float(value - min) / qtz))); i->second.dial->blockSignals(false); } if (i->second.combo) { i->second.combo->blockSignals(true); i->second.combo->setCurrentIndex(int(lrintf(value))); i->second.combo->blockSignals(false); } if (i->second.check) { i->second.check->blockSignals(true); i->second.check->setCheckState(value < 0.5 ? Qt::Unchecked : Qt::Checked); i->second.check->blockSignals(false); } } emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::updateProgramCombo() { if (!m_programCombo || m_programs.empty()) return; std::string currentProgram = m_plugin->getCurrentProgram(); for (int i = 0; in_range_for(m_programs, i); ++i) { if (m_programs[i] == currentProgram) { m_programCombo->setCurrentIndex(i); } } } sonic-visualiser-3.0.3/svgui/widgets/PluginParameterBox.h0000644000000000000000000000334313111512442021663 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_PARAMETER_BOX_H_ #define _PLUGIN_PARAMETER_BOX_H_ #include #include #include class AudioDial; class QDoubleSpinBox; class QCheckBox; class QGridLayout; class QComboBox; class PluginParameterBox : public QFrame { Q_OBJECT public: PluginParameterBox(Vamp::PluginBase *, QWidget *parent = 0); ~PluginParameterBox(); Vamp::PluginBase *getPlugin() { return m_plugin; } signals: void pluginConfigurationChanged(QString); protected slots: void dialChanged(int); void spinBoxChanged(double); void checkBoxChanged(int); void programComboChanged(const QString &); protected: void populate(); void updateProgramCombo(); QGridLayout *m_layout; Vamp::PluginBase *m_plugin; struct ParamRec { AudioDial *dial; QDoubleSpinBox *spin; QCheckBox *check; QComboBox *combo; Vamp::PluginBase::ParameterDescriptor param; }; QComboBox *m_programCombo; std::map m_params; std::map m_nameMap; Vamp::PluginBase::ProgramList m_programs; }; #endif sonic-visualiser-3.0.3/svgui/widgets/PluginParameterDialog.cpp0000644000000000000000000004765313111512442022701 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PluginParameterDialog.h" #include "PluginParameterBox.h" #include "WindowTypeSelector.h" #include "TextAbbrev.h" #include "IconLoader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "base/Debug.h" PluginParameterDialog::PluginParameterDialog(Vamp::PluginBase *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin), m_channel(-1), m_stepSize(0), m_blockSize(0), m_windowType(HanningWindow), m_parameterBox(0), m_currentSelectionOnly(false) { setWindowTitle(tr("Plugin Parameters")); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *pluginBox = new QGroupBox; pluginBox->setTitle(plugin->getType().c_str()); grid->addWidget(pluginBox, 0, 0); QGridLayout *subgrid = new QGridLayout; pluginBox->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(10); QFont boldFont(pluginBox->font()); boldFont.setBold(true); QFont italicFont(pluginBox->font()); italicFont.setItalic(true); QLabel *nameLabel = new QLabel(plugin->getName().c_str()); nameLabel->setWordWrap(true); nameLabel->setFont(boldFont); QLabel *makerLabel = new QLabel(plugin->getMaker().c_str()); makerLabel->setWordWrap(true); int version = plugin->getPluginVersion(); QLabel *versionLabel = new QLabel(QString("%1").arg(version)); versionLabel->setWordWrap(true); QLabel *copyrightLabel = new QLabel(plugin->getCopyright().c_str()); copyrightLabel->setWordWrap(true); // QLabel *typeLabel = new QLabel(plugin->getType().c_str()); // typeLabel->setWordWrap(true); // typeLabel->setFont(boldFont); QLabel *descriptionLabel = 0; if (plugin->getDescription() != "") { descriptionLabel = new QLabel(plugin->getDescription().c_str()); descriptionLabel->setWordWrap(true); descriptionLabel->setFont(italicFont); } int row = 0; QLabel *label = new QLabel(tr("Name:")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(nameLabel, row, 1); m_moreInfo = new QPushButton; m_moreInfo->setIcon(IconLoader().load("info")); m_moreInfo->setFixedSize(QSize(16, 16)); connect(m_moreInfo, SIGNAL(clicked()), this, SLOT(moreInfo())); subgrid->addWidget(m_moreInfo, row, 2, Qt::AlignTop | Qt::AlignRight); m_moreInfo->hide(); row++; if (descriptionLabel) { // label = new QLabel(tr("Description:")); // label->setAlignment(Qt::AlignTop | Qt::AlignLeft); // subgrid->addWidget(label, row, 0); subgrid->addWidget(descriptionLabel, row, 1, 1, 2); row++; } if (version >= 0) { label = new QLabel(tr("Version:")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(versionLabel, row, 1); row++; } // label = new QLabel(tr("Type:")); // label->setAlignment(Qt::AlignTop | Qt::AlignLeft); // subgrid->addWidget(label, row, 0); // subgrid->addWidget(typeLabel, row, 1); // row++; label = new QLabel(tr("Maker:")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(makerLabel, row, 1); row++; label = new QLabel(tr("Copyright: ")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(copyrightLabel, row, 1); row++; m_outputSpacer = new QLabel; subgrid->addWidget(m_outputSpacer, row, 0); m_outputSpacer->setFixedHeight(7); m_outputSpacer->hide(); row++; m_outputLabel = new QLabel(tr("Output:")); m_outputLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(m_outputLabel, row, 0); m_outputValue = new QLabel; m_outputValue->setFont(boldFont); subgrid->addWidget(m_outputValue, row, 1); m_outputLabel->hide(); m_outputValue->hide(); row++; m_outputDescription = new QLabel; m_outputDescription->setFont(italicFont); subgrid->addWidget(m_outputDescription, row, 1); m_outputDescription->hide(); row++; subgrid->setColumnStretch(1, 2); m_inputModelBox = new QGroupBox; m_inputModelBox->setTitle(tr("Input Material")); grid->addWidget(m_inputModelBox, 1, 0); m_inputModels = new QComboBox; QVBoxLayout *inputLayout = new QVBoxLayout; m_inputModelBox->setLayout(inputLayout); inputLayout->addWidget(m_inputModels); m_inputModels->hide(); m_selectionOnly = new QCheckBox(tr("Restrict to selection extents")); inputLayout->addWidget(m_selectionOnly); m_selectionOnly->hide(); m_inputModelBox->hide(); QGroupBox *paramBox = new QGroupBox; paramBox->setTitle(tr("Plugin Parameters")); grid->addWidget(paramBox, 2, 0); grid->setRowStretch(2, 10); QHBoxLayout *paramLayout = new QHBoxLayout; paramLayout->setMargin(0); paramBox->setLayout(paramLayout); QScrollArea *scroll = new QScrollArea; scroll->setWidgetResizable(true); scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll->setFrameShape(QFrame::NoFrame); paramLayout->addWidget(scroll); m_parameterBox = new PluginParameterBox(m_plugin); connect(m_parameterBox, SIGNAL(pluginConfigurationChanged(QString)), this, SIGNAL(pluginConfigurationChanged(QString))); scroll->setWidget(m_parameterBox); m_advanced = new QFrame; QVBoxLayout *advancedLayout = new QVBoxLayout; advancedLayout->setMargin(0); m_advanced->setLayout(advancedLayout); grid->addWidget(m_advanced, 3, 0); m_channelBox = new QGroupBox; m_channelBox->setTitle(tr("Channels")); advancedLayout->addWidget(m_channelBox); m_channelBox->setVisible(false); m_haveChannelBoxData = false; m_windowBox = new QGroupBox; m_windowBox->setTitle(tr("Processing")); advancedLayout->addWidget(m_windowBox); m_windowBox->setVisible(false); m_haveWindowBoxData = false; QHBoxLayout *hbox = new QHBoxLayout; grid->addLayout(hbox, 4, 0); m_advancedVisible = false; m_advancedButton = new QPushButton(tr("Advanced >>")); m_advancedButton->setCheckable(true); connect(m_advancedButton, SIGNAL(clicked()), this, SLOT(advancedToggled())); QSettings settings; settings.beginGroup("PluginParameterDialog"); m_advancedVisible = settings.value("advancedvisible", false).toBool(); settings.endGroup(); m_advanced->hide(); hbox->addWidget(m_advancedButton); m_advancedButton->hide(); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); hbox->addWidget(bb); connect(bb, SIGNAL(accepted()), this, SLOT(dialogAccepted())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); bb->button(QDialogButtonBox::Ok)->setDefault(true); setAdvancedVisible(m_advancedVisible); } PluginParameterDialog::~PluginParameterDialog() { } int PluginParameterDialog::exec() { show(); setAdvancedVisible(m_advancedVisible); return QDialog::exec(); } void PluginParameterDialog::setOutputLabel(QString text, QString description) { if (text == "") { m_outputSpacer->hide(); m_outputLabel->hide(); m_outputValue->hide(); m_outputDescription->hide(); } else { m_outputSpacer->show(); m_outputValue->setText(text); m_outputValue->setWordWrap(true); m_outputDescription->setText(description); m_outputDescription->setWordWrap(true); m_outputLabel->show(); m_outputValue->show(); if (description != "") { m_outputDescription->show(); } else { m_outputDescription->hide(); } } } void PluginParameterDialog::setMoreInfoUrl(QString moreInfoUrl) { m_moreInfoUrl = moreInfoUrl; if (m_moreInfoUrl != "") { m_moreInfo->show(); } else { m_moreInfo->hide(); } } void PluginParameterDialog::setChannelArrangement(int sourceChannels, int targetChannels, int defaultChannel) { m_channel = defaultChannel; if (sourceChannels != targetChannels) { // At the moment we can only cope with the case where // sourceChannels > targetChannels and targetChannels == 1 if (sourceChannels < targetChannels) { QMessageBox::warning (parentWidget(), tr("Channel mismatch"), tr("This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly.").arg(targetChannels).arg(sourceChannels).arg(sourceChannels != 1 ? tr("are") : tr("is")), QMessageBox::Ok, QMessageBox::NoButton); } else { if (m_haveChannelBoxData) { cerr << "WARNING: PluginParameterDialog::setChannelArrangement: Calling more than once on same dialog is not currently implemented" << endl; return; } QVBoxLayout *channelLayout = new QVBoxLayout; m_channelBox->setLayout(channelLayout); if (targetChannels != 1) { channelLayout->addWidget (new QLabel(tr("This plugin accepts no more than %1 input channels,\nbut %2 are available. Only the first %3 will be used.\n") .arg(targetChannels) .arg(sourceChannels) .arg(targetChannels))); } else { channelLayout->addWidget(new QLabel(tr("This plugin only has a single channel input,\nbut the source has %1 channels.").arg(sourceChannels))); QComboBox *channelCombo = new QComboBox; channelCombo->addItem(tr("Use mean of source channels")); for (int i = 0; i < sourceChannels; ++i) { channelCombo->addItem(tr("Use channel %1 only").arg(i + 1)); } connect(channelCombo, SIGNAL(activated(int)), this, SLOT(channelComboChanged(int))); channelLayout->addWidget(channelCombo); } m_channelBox->setVisible(true); m_haveChannelBoxData = true; m_advancedButton->show(); } } setAdvancedVisible(m_advancedVisible); } void PluginParameterDialog::setShowProcessingOptions(bool showWindowSize, bool showFrequencyDomainOptions) { if (m_haveWindowBoxData) { cerr << "WARNING: PluginParameterDialog::setShowProcessingOptions: Calling more than once on same dialog is not currently implemented" << endl; return; } if (showWindowSize) { Vamp::Plugin *fePlugin = dynamic_cast(m_plugin); if (!fePlugin) fePlugin = dynamic_cast(m_plugin); if (!fePlugin) fePlugin = dynamic_cast(m_plugin); int size = 1024; int increment = 1024; if (fePlugin) { size = int(fePlugin->getPreferredBlockSize()); cerr << "Feature extraction plugin \"" << fePlugin->getName() << "\" reports preferred block size as " << size << endl; if (size == 0) size = 1024; increment = int(fePlugin->getPreferredStepSize()); if (increment == 0) { if (fePlugin->getInputDomain() == Vamp::Plugin::TimeDomain) { increment = size; } else { increment = size/2; } } } QGridLayout *windowLayout = new QGridLayout; m_windowBox->setLayout(windowLayout); if (showFrequencyDomainOptions) { windowLayout->addWidget(new QLabel(tr("Window size:")), 0, 0); } else { windowLayout->addWidget(new QLabel(tr("Audio frames per block:")), 0, 0); } cerr << "size: " << size << ", increment: " << increment << endl; QComboBox *blockSizeCombo = new QComboBox; blockSizeCombo->setEditable(true); bool found = false; for (int i = 0; i < 14; ++i) { int val = 1 << (i + 3); blockSizeCombo->addItem(QString("%1").arg(val)); if (val == size) { blockSizeCombo->setCurrentIndex(i); found = true; } } if (!found) { blockSizeCombo->addItem(QString("%1").arg(size)); blockSizeCombo->setCurrentIndex(blockSizeCombo->count() - 1); } blockSizeCombo->setValidator(new QIntValidator(1, int(pow(2., 18)), this)); connect(blockSizeCombo, SIGNAL(editTextChanged(const QString &)), this, SLOT(blockSizeComboChanged(const QString &))); windowLayout->addWidget(blockSizeCombo, 0, 1); windowLayout->addWidget(new QLabel(tr("Window increment:")), 1, 0); QComboBox *incrementCombo = new QComboBox; incrementCombo->setEditable(true); found = false; for (int i = 0; i < 14; ++i) { int val = 1 << (i + 3); incrementCombo->addItem(QString("%1").arg(val)); if (val == increment) { incrementCombo->setCurrentIndex(i); found = true; } } if (!found) { incrementCombo->addItem(QString("%1").arg(increment)); incrementCombo->setCurrentIndex(incrementCombo->count() - 1); } incrementCombo->setValidator(new QIntValidator(1, int(pow(2., 18)), this)); connect(incrementCombo, SIGNAL(editTextChanged(const QString &)), this, SLOT(incrementComboChanged(const QString &))); windowLayout->addWidget(incrementCombo, 1, 1); if (showFrequencyDomainOptions) { windowLayout->addWidget(new QLabel(tr("Window shape:")), 2, 0); WindowTypeSelector *windowTypeSelector = new WindowTypeSelector; connect(windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)), this, SLOT(windowTypeChanged(WindowType))); windowLayout->addWidget(windowTypeSelector, 2, 1); } m_windowBox->setVisible(true); m_haveWindowBoxData = true; m_advancedButton->show(); } setAdvancedVisible(m_advancedVisible); } void PluginParameterDialog::setCandidateInputModels(const QStringList &models, QString defaultModel) { m_inputModels->clear(); QSettings settings; settings.beginGroup("PluginParameterDialog"); QString lastModel = settings.value("lastinputmodel").toString(); settings.endGroup(); if (defaultModel == "") defaultModel = lastModel; m_inputModels->show(); m_inputModelList = models; m_inputModels->addItems(TextAbbrev::abbreviate(models, 80)); m_inputModels->setCurrentIndex(0); if (defaultModel != "") { for (int i = 0; i < models.size(); ++i) { if (defaultModel == models[i]) { m_inputModels->setCurrentIndex(i); m_currentInputModel = models[i]; break; } } } connect(m_inputModels, SIGNAL(activated(int)), this, SLOT(inputModelComboChanged(int))); m_inputModelBox->show(); } void PluginParameterDialog::setShowSelectionOnlyOption(bool show) { if (!show) { m_selectionOnly->hide(); if (!m_inputModels->isVisible()) m_inputModelBox->hide(); return; } QSettings settings; settings.beginGroup("PluginParameterDialog"); bool lastSelectionOnly = settings.value("lastselectiononly", false).toBool(); settings.endGroup(); m_selectionOnly->setChecked(lastSelectionOnly); m_currentSelectionOnly = lastSelectionOnly; connect(m_selectionOnly, SIGNAL(stateChanged(int)), this, SLOT(selectionOnlyChanged(int))); m_selectionOnly->show(); m_inputModelBox->show(); } QString PluginParameterDialog::getInputModel() const { return m_currentInputModel; } bool PluginParameterDialog::getSelectionOnly() const { return m_currentSelectionOnly; } void PluginParameterDialog::getProcessingParameters(int &blockSize) const { blockSize = m_blockSize; return; } void PluginParameterDialog::getProcessingParameters(int &stepSize, int &blockSize, WindowType &windowType) const { stepSize = m_stepSize; blockSize = m_blockSize; windowType = m_windowType; return; } void PluginParameterDialog::blockSizeComboChanged(const QString &text) { m_blockSize = text.toInt(); cerr << "Block size changed to " << m_blockSize << endl; } void PluginParameterDialog::incrementComboChanged(const QString &text) { m_stepSize = text.toInt(); //!!! rename increment to step size throughout cerr << "Increment changed to " << m_stepSize << endl; } void PluginParameterDialog::windowTypeChanged(WindowType type) { m_windowType = type; } void PluginParameterDialog::moreInfo() { if (m_moreInfoUrl != "") { QDesktopServices::openUrl(QUrl(m_moreInfoUrl)); } } void PluginParameterDialog::advancedToggled() { setAdvancedVisible(!m_advancedVisible); } void PluginParameterDialog::setAdvancedVisible(bool visible) { // m_advanced->setVisible(visible); if (visible) { m_advancedButton->setText(tr("Advanced <<")); m_advancedButton->setChecked(true); m_advanced->show(); } else { m_advanced->hide(); m_advancedButton->setText(tr("Advanced >>")); m_advancedButton->setChecked(false); } // cerr << "resize to " << sizeHint().width() << " x " << sizeHint().height() << endl; // setMinimumHeight(sizeHint().height()); adjustSize(); // (sizeHint()); m_advancedVisible = visible; QSettings settings; settings.beginGroup("PluginParameterDialog"); settings.setValue("advancedvisible", visible); settings.endGroup(); // if (visible) setMaximumHeight(sizeHint().height()); // adjustSize(); } void PluginParameterDialog::channelComboChanged(int index) { m_channel = index - 1; } void PluginParameterDialog::inputModelComboChanged(int index) { if (index >= m_inputModelList.size()) return; m_currentInputModel = m_inputModelList[index]; emit inputModelChanged(m_currentInputModel); } void PluginParameterDialog::selectionOnlyChanged(int state) { if (state == Qt::Checked) { m_currentSelectionOnly = true; } else { m_currentSelectionOnly = false; } } void PluginParameterDialog::dialogAccepted() { QSettings settings; settings.beginGroup("PluginParameterDialog"); if (m_inputModels->isVisible()) { settings.setValue("lastinputmodel", getInputModel()); } if (m_selectionOnly->isVisible()) { settings.setValue("lastselectiononly", getSelectionOnly()); } settings.endGroup(); accept(); } sonic-visualiser-3.0.3/svgui/widgets/PluginParameterDialog.h0000644000000000000000000000704113111512442022331 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_PARAMETER_DIALOG_H_ #define _PLUGIN_PARAMETER_DIALOG_H_ #include #include "base/Window.h" #include class PluginParameterBox; class QWidget; class QPushButton; class QLabel; class QGroupBox; class QComboBox; class QCheckBox; /** * A dialog for editing the parameters of a given plugin, using a * PluginParameterBox. This dialog does not contain any mechanism for * selecting the plugin in the first place. Note that the dialog * directly modifies the parameters of the plugin, so they will remain * modified even if the dialog is then cancelled. */ class PluginParameterDialog : public QDialog { Q_OBJECT public: PluginParameterDialog(Vamp::PluginBase *, QWidget *parent = 0); ~PluginParameterDialog(); void setChannelArrangement(int sourceChannels, int targetChannels, int defaultChannel); void setOutputLabel(QString output, QString description); void setMoreInfoUrl(QString url); void setShowProcessingOptions(bool showWindowSize, bool showFrequencyDomainOptions); void setCandidateInputModels(const QStringList &names, QString defaultName); void setShowSelectionOnlyOption(bool show); Vamp::PluginBase *getPlugin() { return m_plugin; } int getChannel() const { return m_channel; } QString getInputModel() const; bool getSelectionOnly() const; //!!! merge with PluginTransform::ExecutionContext void getProcessingParameters(int &blockSize) const; void getProcessingParameters(int &stepSize, int &blockSize, WindowType &windowType) const; int exec(); signals: void pluginConfigurationChanged(QString); void inputModelChanged(QString); protected slots: void channelComboChanged(int); void blockSizeComboChanged(const QString &); void incrementComboChanged(const QString &); void windowTypeChanged(WindowType type); void advancedToggled(); void moreInfo(); void setAdvancedVisible(bool); void inputModelComboChanged(int); void selectionOnlyChanged(int); void dialogAccepted(); protected: Vamp::PluginBase *m_plugin; int m_channel; int m_stepSize; int m_blockSize; WindowType m_windowType; PluginParameterBox *m_parameterBox; QLabel *m_outputLabel; QLabel *m_outputValue; QLabel *m_outputDescription; QLabel *m_outputSpacer; QPushButton *m_moreInfo; QString m_moreInfoUrl; QGroupBox *m_channelBox; bool m_haveChannelBoxData; QGroupBox *m_windowBox; bool m_haveWindowBoxData; QGroupBox *m_inputModelBox; QComboBox *m_inputModels; QCheckBox *m_selectionOnly; QStringList m_inputModelList; QString m_currentInputModel; bool m_currentSelectionOnly; QPushButton *m_advancedButton; QWidget *m_advanced; bool m_advancedVisible; }; #endif sonic-visualiser-3.0.3/svgui/widgets/ProgressDialog.cpp0000644000000000000000000000512413111512442021371 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "ProgressDialog.h" #include #include #include ProgressDialog::ProgressDialog(QString message, bool cancellable, int timeBeforeShow, QWidget *parent) : m_showTimer(0), m_timerElapsed(false), m_cancelled(false) { m_dialog = new QProgressDialog(message, cancellable ? tr("Cancel") : 0, 0, 100, parent); if (timeBeforeShow > 0) { m_dialog->hide(); m_showTimer = new QTimer; connect(m_showTimer, SIGNAL(timeout()), this, SLOT(showTimerElapsed())); m_showTimer->setSingleShot(true); m_showTimer->start(timeBeforeShow); } else { m_dialog->show(); m_dialog->raise(); m_timerElapsed = true; } if (cancellable) { connect(m_dialog, SIGNAL(canceled()), this, SLOT(canceled())); } } ProgressDialog::~ProgressDialog() { delete m_showTimer; delete m_dialog; } bool ProgressDialog::isDefinite() const { return (m_dialog->maximum() > 0); } void ProgressDialog::setDefinite(bool definite) { if (definite) m_dialog->setMaximum(100); else m_dialog->setMaximum(0); } void ProgressDialog::setMessage(QString text) { m_dialog->setLabelText(text); } void ProgressDialog::canceled() { m_cancelled = true; emit cancelled(); } bool ProgressDialog::wasCancelled() const { return m_cancelled; } void ProgressDialog::showTimerElapsed() { m_timerElapsed = true; if (m_dialog->value() > 0) { emit showing(); m_dialog->show(); } qApp->processEvents(); } void ProgressDialog::setProgress(int percentage) { if (percentage > m_dialog->value()) { m_dialog->setValue(percentage); if (percentage >= 100 && isDefinite()) { m_dialog->hide(); } else if (m_timerElapsed && !m_dialog->isVisible()) { emit showing(); m_dialog->show(); m_dialog->raise(); } qApp->processEvents(); } } sonic-visualiser-3.0.3/svgui/widgets/ProgressDialog.h0000644000000000000000000000260213111512442021034 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PROGRESS_DIALOG_H_ #include "base/ProgressReporter.h" class QProgressDialog; class QTimer; class ProgressDialog : public ProgressReporter { Q_OBJECT public: ProgressDialog(QString message, bool cancellable, int timeBeforeShow = 0, QWidget *parent = 0); virtual ~ProgressDialog(); virtual bool isDefinite() const; virtual void setDefinite(bool definite); virtual bool wasCancelled() const; signals: void showing(); void cancelled(); public slots: virtual void setMessage(QString text); virtual void setProgress(int percentage); protected slots: virtual void showTimerElapsed(); void canceled(); protected: QProgressDialog *m_dialog; QTimer *m_showTimer; bool m_timerElapsed; bool m_cancelled; }; #endif sonic-visualiser-3.0.3/svgui/widgets/PropertyBox.cpp0000644000000000000000000006255013111512442020750 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "PropertyBox.h" #include "PluginParameterDialog.h" #include "base/PropertyContainer.h" #include "base/PlayParameters.h" #include "base/PlayParameterRepository.h" #include "layer/Layer.h" #include "base/UnitDatabase.h" #include "base/RangeMapper.h" #include "AudioDial.h" #include "LEDButton.h" #include "IconLoader.h" #include "LevelPanWidget.h" #include "LevelPanToolButton.h" #include "WidgetScale.h" #include "NotifyingCheckBox.h" #include "NotifyingComboBox.h" #include "NotifyingPushButton.h" #include "NotifyingToolButton.h" #include "ColourComboBox.h" #include "ColourMapComboBox.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define DEBUG_PROPERTY_BOX 1 PropertyBox::PropertyBox(PropertyContainer *container) : m_container(container), m_showButton(0), m_playButton(0) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "(\"" << container->getPropertyContainerName() << "\" at " << container << ")]::PropertyBox" << endl; #endif m_mainBox = new QVBoxLayout; setLayout(m_mainBox); #ifdef Q_OS_MAC QMargins mm = m_mainBox->contentsMargins(); QMargins mmhalf(mm.left()/2, mm.top()/3, mm.right()/2, mm.bottom()/3); m_mainBox->setContentsMargins(mmhalf); #endif // m_nameWidget = new QLabel; // m_mainBox->addWidget(m_nameWidget); // m_nameWidget->setText(container->objectName()); m_mainWidget = new QWidget; m_mainBox->addWidget(m_mainWidget); m_mainBox->insertStretch(2, 10); m_viewPlayFrame = 0; populateViewPlayFrame(); m_layout = new QGridLayout; m_layout->setMargin(0); m_layout->setHorizontalSpacing(2); m_layout->setVerticalSpacing(1); m_mainWidget->setLayout(m_layout); PropertyContainer::PropertyList properties = m_container->getProperties(); blockSignals(true); size_t i; for (i = 0; i < properties.size(); ++i) { updatePropertyEditor(properties[i]); } blockSignals(false); m_layout->setRowStretch(m_layout->rowCount(), 10); connect(UnitDatabase::getInstance(), SIGNAL(unitDatabaseChanged()), this, SLOT(unitDatabaseChanged())); #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "]::PropertyBox returning" << endl; #endif } PropertyBox::~PropertyBox() { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "]::~PropertyBox" << endl; #endif } void PropertyBox::populateViewPlayFrame() { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << ":" << m_container << "]::populateViewPlayFrame" << endl; #endif if (m_viewPlayFrame) { delete m_viewPlayFrame; m_viewPlayFrame = 0; } if (!m_container) return; Layer *layer = dynamic_cast(m_container); if (layer) { disconnect(layer, SIGNAL(modelReplaced()), this, SLOT(populateViewPlayFrame())); connect(layer, SIGNAL(modelReplaced()), this, SLOT(populateViewPlayFrame())); } PlayParameters *params = m_container->getPlayParameters(); if (!params && !layer) return; m_viewPlayFrame = new QFrame; m_viewPlayFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); m_mainBox->addWidget(m_viewPlayFrame); QGridLayout *layout = new QGridLayout; m_viewPlayFrame->setLayout(layout); layout->setMargin(layout->margin() / 2); #ifdef DEBUG_PROPERTY_BOX SVDEBUG << "PropertyBox::populateViewPlayFrame: container " << m_container << " (name " << m_container->getPropertyContainerName() << ") params " << params << endl; #endif QSize buttonSize = WidgetScale::scaleQSize(QSize(26, 26)); int col = 0; if (params) { m_playButton = new NotifyingToolButton; m_playButton->setCheckable(true); m_playButton->setIcon(IconLoader().load("speaker")); m_playButton->setToolTip(tr("Click to toggle playback")); m_playButton->setChecked(!params->isPlayMuted()); m_playButton->setFixedSize(buttonSize); connect(m_playButton, SIGNAL(toggled(bool)), this, SLOT(playAudibleButtonChanged(bool))); connect(m_playButton, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_playButton, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); connect(params, SIGNAL(playAudibleChanged(bool)), this, SLOT(playAudibleChanged(bool))); LevelPanToolButton *levelPan = new LevelPanToolButton; levelPan->setFixedSize(buttonSize); levelPan->setImageSize((buttonSize.height() * 3) / 4); layout->addWidget(levelPan, 0, col++, Qt::AlignCenter); connect(levelPan, SIGNAL(levelChanged(float)), this, SLOT(playGainControlChanged(float))); connect(levelPan, SIGNAL(panChanged(float)), this, SLOT(playPanControlChanged(float))); connect(params, SIGNAL(playGainChanged(float)), levelPan, SLOT(setLevel(float))); connect(params, SIGNAL(playPanChanged(float)), levelPan, SLOT(setPan(float))); connect(levelPan, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(levelPan, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); layout->addWidget(m_playButton, 0, col++, Qt::AlignCenter); if (params->getPlayClipId() != "") { NotifyingToolButton *playParamButton = new NotifyingToolButton; playParamButton->setObjectName("playParamButton"); playParamButton->setIcon(IconLoader().load("faders")); playParamButton->setFixedSize(buttonSize); layout->addWidget(playParamButton, 0, col++, Qt::AlignCenter); connect(playParamButton, SIGNAL(clicked()), this, SLOT(editPlayParameters())); connect(playParamButton, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(playParamButton, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); } } layout->setColumnStretch(col++, 10); if (layer) { QLabel *showLabel = new QLabel(tr("Show")); layout->addWidget(showLabel, 0, col++, Qt::AlignVCenter | Qt::AlignRight); m_showButton = new LEDButton(palette().highlight().color()); layout->addWidget(m_showButton, 0, col++, Qt::AlignVCenter | Qt::AlignLeft); connect(m_showButton, SIGNAL(stateChanged(bool)), this, SIGNAL(showLayer(bool))); connect(m_showButton, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_showButton, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); } } void PropertyBox::updatePropertyEditor(PropertyContainer::PropertyName name, bool rangeChanged) { PropertyContainer::PropertyType type = m_container->getPropertyType(name); int row = m_layout->rowCount(); int min = 0, max = 0, value = 0, deflt = 0; value = m_container->getPropertyRangeAndValue(name, &min, &max, &deflt); bool have = (m_propertyControllers.find(name) != m_propertyControllers.end()); QString groupName = m_container->getPropertyGroupName(name); QString propertyLabel = m_container->getPropertyLabel(name); QString iconName = m_container->getPropertyIconName(name); #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "(\"" << m_container->getPropertyContainerName() << "\")]"; cerr << "::updatePropertyEditor(\"" << name << "\"):"; cerr << " value " << value << ", have " << have << ", group \"" << groupName << "\"" << endl; #endif QString groupLabel = groupName; if (groupName == QString()) { groupName = "ungrouped: " + name; // not tr(), this is internal id groupLabel = propertyLabel; } if (!have) { if (m_groupLayouts.find(groupName) == m_groupLayouts.end()) { QWidget *labelWidget = new QLabel(groupLabel, m_mainWidget); m_layout->addWidget(labelWidget, row, 0); QWidget *frame = new QWidget(m_mainWidget); frame->setMinimumSize(WidgetScale::scaleQSize(QSize(1, 24))); m_groupLayouts[groupName] = new QGridLayout; #ifdef Q_OS_MAC // Seems to be plenty of whitespace already m_groupLayouts[groupName]->setContentsMargins(0, 0, 0, 0); #else // Need a bit of padding on the left m_groupLayouts[groupName]->setContentsMargins (WidgetScale::scalePixelSize(10), 0, 0, 0); #endif frame->setLayout(m_groupLayouts[groupName]); m_layout->addWidget(frame, row, 1, 1, 2); m_layout->setColumnStretch(1, 10); } } QGridLayout *groupLayout = m_groupLayouts[groupName]; #ifdef DEBUG_PROPERTY_BOX cerr << "groupName becomes \"" << groupName << "\", groupLabel = \"" << groupLabel << "\", groupLayout = " << groupLayout << endl; #endif assert(groupLayout); QWidget *existing = m_propertyControllers[name]; switch (type) { case PropertyContainer::ToggleProperty: { QAbstractButton *button; if (!(button = qobject_cast(existing))) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new checkbox" << endl; #endif if (iconName != "") { button = new NotifyingPushButton(); button->setCheckable(true); QIcon icon(IconLoader().load(iconName)); button->setIcon(icon); button->setObjectName(name); button->setFixedSize(WidgetScale::scaleQSize(QSize(18, 18))); } else { button = new NotifyingCheckBox(); button->setObjectName(name); } connect(button, SIGNAL(toggled(bool)), this, SLOT(propertyControllerChanged(bool))); connect(button, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(button, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); button->setToolTip(propertyLabel); if (existing) { groupLayout->replaceWidget(existing, button); delete existing; } else { groupLayout->addWidget(button, 0, groupLayout->columnCount()); } m_propertyControllers[name] = button; } if (button->isChecked() != (value > 0)) { button->blockSignals(true); button->setChecked(value > 0); button->blockSignals(false); } break; } case PropertyContainer::RangeProperty: { AudioDial *dial; if ((dial = qobject_cast(existing))) { if (rangeChanged) { dial->blockSignals(true); dial->setMinimum(min); dial->setMaximum(max); dial->setRangeMapper(m_container->getNewPropertyRangeMapper(name)); dial->blockSignals(false); } } else { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new dial" << endl; #endif dial = new AudioDial(); dial->setObjectName(name); dial->setMinimum(min); dial->setMaximum(max); dial->setPageStep(1); dial->setNotchesVisible((max - min) <= 12); // important to set the range mapper before the default, // because the range mapper is used to map the default dial->setRangeMapper(m_container->getNewPropertyRangeMapper(name)); dial->setDefaultValue(deflt); dial->setShowToolTip(true); connect(dial, SIGNAL(valueChanged(int)), this, SLOT(propertyControllerChanged(int))); connect(dial, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(dial, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); dial->setFixedWidth(WidgetScale::scalePixelSize(24)); dial->setFixedHeight(WidgetScale::scalePixelSize(24)); if (existing) { groupLayout->replaceWidget(existing, dial); delete existing; } else { groupLayout->addWidget(dial, 0, groupLayout->columnCount()); } m_propertyControllers[name] = dial; } if (dial->value() != value) { dial->blockSignals(true); dial->setValue(value); dial->blockSignals(false); } break; } case PropertyContainer::ColourProperty: { ColourComboBox *cb; if (!(cb = qobject_cast(existing))) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new colour combobox" << endl; #endif cb = new ColourComboBox(true); cb->setObjectName(name); connect(cb, SIGNAL(colourChanged(int)), this, SLOT(propertyControllerChanged(int))); connect(cb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(cb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); cb->setToolTip(propertyLabel); if (existing) { groupLayout->replaceWidget(existing, cb); delete existing; } else { groupLayout->addWidget(cb, 0, groupLayout->columnCount()); } m_propertyControllers[name] = cb; } if (cb->currentIndex() != value) { cb->blockSignals(true); cb->setCurrentIndex(value); cb->blockSignals(false); } break; } case PropertyContainer::ColourMapProperty: { ColourMapComboBox *cb; if (!(cb = qobject_cast(existing))) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new colourmap combobox" << endl; #endif cb = new ColourMapComboBox(false); cb->setObjectName(name); connect(cb, SIGNAL(colourMapChanged(int)), this, SLOT(propertyControllerChanged(int))); connect(cb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(cb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); cb->setToolTip(propertyLabel); if (existing) { groupLayout->replaceWidget(existing, cb); delete existing; } else { groupLayout->addWidget(cb, 0, groupLayout->columnCount()); } m_propertyControllers[name] = cb; } if (cb->currentIndex() != value) { cb->blockSignals(true); cb->setCurrentIndex(value); cb->blockSignals(false); } break; } case PropertyContainer::ValueProperty: case PropertyContainer::UnitsProperty: { NotifyingComboBox *cb; if (!(cb = qobject_cast(existing))) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new combobox" << endl; #endif cb = new NotifyingComboBox(); cb->setObjectName(name); cb->setDuplicatesEnabled(false); } if (!have || rangeChanged) { cb->blockSignals(true); cb->clear(); cb->setEditable(false); if (type == PropertyContainer::ValueProperty) { for (int i = min; i <= max; ++i) { QString label = m_container->getPropertyValueLabel(name, i); QString iname = m_container->getPropertyValueIconName(name, i); if (iname != "") { QIcon icon(IconLoader().load(iname)); cb->addItem(icon, label); } else { cb->addItem(label); } } } else { // PropertyContainer::UnitsProperty QStringList units = UnitDatabase::getInstance()->getKnownUnits(); for (int i = 0; i < units.size(); ++i) { cb->addItem(units[i]); } cb->setEditable(true); } } if (!have) { connect(cb, SIGNAL(activated(int)), this, SLOT(propertyControllerChanged(int))); connect(cb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(cb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); cb->setToolTip(propertyLabel); groupLayout->addWidget(cb, 0, groupLayout->columnCount()); m_propertyControllers[name] = cb; } else if (existing != cb) { groupLayout->replaceWidget(existing, cb); delete existing; } cb->blockSignals(true); if (type == PropertyContainer::ValueProperty) { if (cb->currentIndex() != value) { cb->setCurrentIndex(value); } } else { QString unit = UnitDatabase::getInstance()->getUnitById(value); if (cb->currentText() != unit) { for (int i = 0; i < cb->count(); ++i) { if (cb->itemText(i) == unit) { cb->setCurrentIndex(i); break; } } } } cb->blockSignals(false); break; } case PropertyContainer::InvalidProperty: default: break; } } void PropertyBox::propertyContainerPropertyChanged(PropertyContainer *pc) { if (pc != m_container) return; #ifdef DEBUG_PROPERTY_BOX SVDEBUG << "PropertyBox::propertyContainerPropertyChanged" << endl; #endif PropertyContainer::PropertyList properties = m_container->getProperties(); size_t i; blockSignals(true); for (i = 0; i < properties.size(); ++i) { updatePropertyEditor(properties[i]); } blockSignals(false); } void PropertyBox::propertyContainerPropertyRangeChanged(PropertyContainer *) { blockSignals(true); PropertyContainer::PropertyList properties = m_container->getProperties(); for (size_t i = 0; i < properties.size(); ++i) { updatePropertyEditor(properties[i], true); } blockSignals(false); } void PropertyBox::unitDatabaseChanged() { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "]: unitDatabaseChanged" << endl; #endif blockSignals(true); // cerr << "my container is " << m_container << endl; // cerr << "my container's name is... " << endl; // cerr << m_container->objectName() << endl; PropertyContainer::PropertyList properties = m_container->getProperties(); for (size_t i = 0; i < properties.size(); ++i) { if (m_container->getPropertyType(properties[i]) == PropertyContainer::UnitsProperty) { updatePropertyEditor(properties[i]); } } blockSignals(false); } void PropertyBox::propertyControllerChanged(bool on) { propertyControllerChanged(on ? 1 : 0); } void PropertyBox::propertyControllerChanged(int value) { QObject *obj = sender(); QString name = obj->objectName(); #ifdef DEBUG_PROPERTY_BOX SVDEBUG << "PropertyBox::propertyControllerChanged(" << name << ", " << value << ")" << endl; #endif PropertyContainer::PropertyType type = m_container->getPropertyType(name); Command *c = 0; if (type == PropertyContainer::UnitsProperty) { NotifyingComboBox *cb = qobject_cast(obj); if (cb) { QString unit = cb->currentText(); c = m_container->getSetPropertyCommand (name, UnitDatabase::getInstance()->getUnitId(unit)); } } else if (type != PropertyContainer::InvalidProperty) { c = m_container->getSetPropertyCommand(name, value); } if (c) CommandHistory::getInstance()->addCommand(c, true, true); updateContextHelp(obj); } void PropertyBox::playAudibleChanged(bool audible) { m_playButton->setChecked(audible); } void PropertyBox::playAudibleButtonChanged(bool audible) { PlayParameters *params = m_container->getPlayParameters(); if (!params) return; if (params->isPlayAudible() != audible) { PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); command->setPlayAudible(audible); CommandHistory::getInstance()->addCommand(command, true, true); } } void PropertyBox::playGainControlChanged(float gain) { QObject *obj = sender(); PlayParameters *params = m_container->getPlayParameters(); if (!params) return; if (params->getPlayGain() != gain) { PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); command->setPlayGain(gain); CommandHistory::getInstance()->addCommand(command, true, true); } updateContextHelp(obj); } void PropertyBox::playPanControlChanged(float pan) { QObject *obj = sender(); PlayParameters *params = m_container->getPlayParameters(); if (!params) return; if (params->getPlayPan() != pan) { PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); command->setPlayPan(pan); CommandHistory::getInstance()->addCommand(command, true, true); } updateContextHelp(obj); } void PropertyBox::editPlayParameters() { PlayParameters *params = m_container->getPlayParameters(); if (!params) return; QString clip = params->getPlayClipId(); PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); QInputDialog *dialog = new QInputDialog(this); QDir dir(":/samples"); QStringList clipFiles = dir.entryList(QStringList() << "*.wav", QDir::Files); QStringList clips; foreach (QString str, clipFiles) { clips.push_back(str.replace(".wav", "")); } dialog->setComboBoxItems(clips); dialog->setLabelText(tr("Set playback clip:")); QComboBox *cb = dialog->findChild(); if (cb) { for (int i = 0; i < cb->count(); ++i) { if (cb->itemText(i) == clip) { cb->setCurrentIndex(i); } } } connect(dialog, SIGNAL(textValueChanged(QString)), this, SLOT(playClipChanged(QString))); if (dialog->exec() == QDialog::Accepted) { QString newClip = dialog->textValue(); command->setPlayClipId(newClip); CommandHistory::getInstance()->addCommand(command, true); } else { delete command; // restore in case we mucked about with the configuration // as a consequence of signals from the dialog params->setPlayClipId(clip); } delete dialog; } void PropertyBox::playClipChanged(QString id) { PlayParameters *params = m_container->getPlayParameters(); if (!params) return; params->setPlayClipId(id); } void PropertyBox::layerVisibilityChanged(bool visible) { if (m_showButton) m_showButton->setState(visible); } void PropertyBox::mouseEnteredWidget() { updateContextHelp(sender()); } void PropertyBox::updateContextHelp(QObject *o) { QWidget *w = qobject_cast(o); if (!w) return; if (!m_container) return; QString cname = m_container->getPropertyContainerName(); if (cname == "") return; LevelPanToolButton *lp = qobject_cast(w); if (lp) { emit contextHelpChanged(tr("Adjust playback level and pan of %1").arg(cname)); return; } QString wname = w->objectName(); if (wname == "playParamButton") { PlayParameters *params = m_container->getPlayParameters(); if (params) { emit contextHelpChanged (tr("Change sound used for playback (currently \"%1\")") .arg(params->getPlayClipId())); return; } } QString extraText; AudioDial *dial = qobject_cast(w); if (dial) { double mv = dial->mappedValue(); QString unit = ""; if (dial->rangeMapper()) unit = dial->rangeMapper()->getUnit(); if (unit != "") { extraText = tr(" (current value: %1%2)").arg(mv).arg(unit); } else { extraText = tr(" (current value: %1)").arg(mv); } } if (w == m_showButton) { emit contextHelpChanged(tr("Toggle Visibility of %1").arg(cname)); } else if (w == m_playButton) { emit contextHelpChanged(tr("Toggle Playback of %1").arg(cname)); } else if (wname == "") { return; } else if (qobject_cast(w)) { emit contextHelpChanged(tr("Toggle %1 property of %2") .arg(wname).arg(cname)); } else { emit contextHelpChanged(tr("Adjust %1 property of %2%3") .arg(wname).arg(cname).arg(extraText)); } } void PropertyBox::mouseLeftWidget() { if (!(QApplication::mouseButtons() & Qt::LeftButton)) { emit contextHelpChanged(""); } } sonic-visualiser-3.0.3/svgui/widgets/PropertyBox.h0000644000000000000000000000437513111512442020416 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_PROPERTY_BOX_H #define SV_PROPERTY_BOX_H #include "base/PropertyContainer.h" #include #include class QLayout; class QWidget; class QGridLayout; class QVBoxLayout; class QLabel; class LEDButton; class QToolButton; class NotifyingPushButton; class PropertyBox : public QFrame { Q_OBJECT public: PropertyBox(PropertyContainer *); ~PropertyBox(); PropertyContainer *getContainer() { return m_container; } signals: void showLayer(bool); void contextHelpChanged(const QString &); public slots: void propertyContainerPropertyChanged(PropertyContainer *); void propertyContainerPropertyRangeChanged(PropertyContainer *); void playClipChanged(QString); void layerVisibilityChanged(bool); protected slots: void propertyControllerChanged(int); void propertyControllerChanged(bool); void playAudibleChanged(bool); void playAudibleButtonChanged(bool); void playGainControlChanged(float); void playPanControlChanged(float); void populateViewPlayFrame(); void unitDatabaseChanged(); void editPlayParameters(); void mouseEnteredWidget(); void mouseLeftWidget(); protected: void updatePropertyEditor(PropertyContainer::PropertyName, bool rangeChanged = false); void updateContextHelp(QObject *o); QLabel *m_nameWidget; QWidget *m_mainWidget; QGridLayout *m_layout; PropertyContainer *m_container; QFrame *m_viewPlayFrame; QVBoxLayout *m_mainBox; LEDButton *m_showButton; QToolButton *m_playButton; std::map m_groupLayouts; std::map m_propertyControllers; }; #endif sonic-visualiser-3.0.3/svgui/widgets/PropertyStack.cpp0000644000000000000000000001705513111512442021265 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "PropertyStack.h" #include "PropertyBox.h" #include "base/PropertyContainer.h" #include "view/View.h" #include "layer/Layer.h" #include "layer/LayerFactory.h" #include "widgets/NotifyingTabBar.h" #include "widgets/IconLoader.h" #include "base/Command.h" #include "widgets/CommandHistory.h" #include "layer/ShowLayerCommand.h" #include "WidgetScale.h" #include #include #include //#define DEBUG_PROPERTY_STACK 1 PropertyStack::PropertyStack(QWidget *parent, View *client) : QTabWidget(parent), m_client(client) { NotifyingTabBar *bar = new NotifyingTabBar(); bar->setDrawBase(false); connect(bar, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredTabBar())); connect(bar, SIGNAL(mouseLeft()), this, SLOT(mouseLeftTabBar())); connect(bar, SIGNAL(activeTabClicked()), this, SLOT(activeTabClicked())); setTabBar(bar); setElideMode(Qt::ElideNone); tabBar()->setUsesScrollButtons(true); tabBar()->setIconSize(WidgetScale::scaleQSize(QSize(16, 16))); repopulate(); connect(this, SIGNAL(currentChanged(int)), this, SLOT(selectedContainerChanged(int))); connect(m_client, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerPropertyRangeChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyRangeChanged(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), this, SLOT(propertyContainerNameChanged(PropertyContainer *))); connect(this, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)), m_client, SLOT(propertyContainerSelected(View *, PropertyContainer *))); } PropertyStack::~PropertyStack() { } void PropertyStack::repopulate() { blockSignals(true); #ifdef DEBUG_PROPERTY_STACK cerr << "PropertyStack[" << this << "]::repopulate" << endl; #endif while (count() > 0) { removeTab(0); } for (size_t i = 0; i < m_boxes.size(); ++i) { delete m_boxes[i]; } m_boxes.clear(); for (int i = 0; i < m_client->getPropertyContainerCount(); ++i) { PropertyContainer *container = m_client->getPropertyContainer(i); QString name = container->getPropertyContainerName(); #ifdef DEBUG_PROPERTY_STACK cerr << "PropertyStack[" << this << "]::repopulate: client " << m_client << " returns container " << container << " (name " << name << ") at position " << i << endl; #endif PropertyBox *box = new PropertyBox(container); connect(box, SIGNAL(showLayer(bool)), this, SLOT(showLayer(bool))); connect(box, SIGNAL(contextHelpChanged(const QString &)), this, SIGNAL(contextHelpChanged(const QString &))); Layer *layer = dynamic_cast(container); if (layer) { box->layerVisibilityChanged(!layer->isLayerDormant(m_client)); } QString shortName = name; if (layer) { shortName = LayerFactory::getInstance()->getLayerPresentationName (LayerFactory::getInstance()->getLayerType(layer)); if (layer->getLayerPresentationName() != "") { name = layer->getLayerPresentationName(); } } bool nameDiffers = (name != shortName); shortName = QString("&%1 %2").arg(i + 1).arg(shortName); QString iconName = container->getPropertyContainerIconName(); QIcon icon(IconLoader().load(iconName)); if (icon.isNull()) { addTab(box, shortName); if (nameDiffers) { setTabToolTip(i, name); } } else { addTab(box, icon, QString("&%1").arg(i + 1)); setTabToolTip(i, name); } m_boxes.push_back(box); } blockSignals(false); } bool PropertyStack::containsContainer(PropertyContainer *pc) const { for (int i = 0; i < m_client->getPropertyContainerCount(); ++i) { PropertyContainer *container = m_client->getPropertyContainer(i); if (pc == container) return true; } return false; } int PropertyStack::getContainerIndex(PropertyContainer *pc) const { // This is used to obtain an index to be passed to setCurrentIndex // -- which is the index of the property container's box in our // stack of boxes. That is not the same thing as the index of the // container (i.e. the layer) in the view: the view reorders its // containers whenever one is raised to the top, while our boxes // remain in the same order. So we must find this container in the // box list, not in the view. for (int i = 0; in_range_for(m_boxes, i); ++i) { PropertyContainer *container = m_boxes[i]->getContainer(); if (pc == container) { return i; } } return false; } void PropertyStack::propertyContainerAdded(PropertyContainer *) { if (sender() != m_client) return; repopulate(); } void PropertyStack::propertyContainerRemoved(PropertyContainer *) { if (sender() != m_client) return; repopulate(); } void PropertyStack::propertyContainerPropertyChanged(PropertyContainer *pc) { Layer *layer = dynamic_cast(pc); for (unsigned int i = 0; i < m_boxes.size(); ++i) { if (pc == m_boxes[i]->getContainer()) { m_boxes[i]->propertyContainerPropertyChanged(pc); if (layer) { m_boxes[i]->layerVisibilityChanged (!layer->isLayerDormant(m_client)); } } } } void PropertyStack::propertyContainerPropertyRangeChanged(PropertyContainer *pc) { for (unsigned int i = 0; i < m_boxes.size(); ++i) { if (pc == m_boxes[i]->getContainer()) { m_boxes[i]->propertyContainerPropertyRangeChanged(pc); } } } void PropertyStack::propertyContainerNameChanged(PropertyContainer *) { if (sender() != m_client) return; repopulate(); } void PropertyStack::showLayer(bool show) { QObject *obj = sender(); for (unsigned int i = 0; i < m_boxes.size(); ++i) { if (obj == m_boxes[i]) { Layer *layer = dynamic_cast(m_boxes[i]->getContainer()); if (layer) { CommandHistory::getInstance()->addCommand (new ShowLayerCommand(m_client, layer, show, tr("Change Layer Visibility"))); return; } } } } void PropertyStack::selectedContainerChanged(int n) { if (n >= int(m_boxes.size())) return; emit propertyContainerSelected(m_client, m_boxes[n]->getContainer()); } void PropertyStack::mouseEnteredTabBar() { emit contextHelpChanged(tr("Click to change the current active layer")); } void PropertyStack::mouseLeftTabBar() { emit contextHelpChanged(""); } void PropertyStack::activeTabClicked() { emit viewSelected(m_client); } sonic-visualiser-3.0.3/svgui/widgets/PropertyStack.h0000644000000000000000000000357713111512442020736 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _PROPERTY_STACK_H_ #define _PROPERTY_STACK_H_ #include #include #include class Layer; class View; class PropertyBox; class PropertyContainer; class PropertyStack : public QTabWidget { Q_OBJECT public: PropertyStack(QWidget *parent, View *client); virtual ~PropertyStack(); View *getClient() { return m_client; } bool containsContainer(PropertyContainer *container) const; int getContainerIndex(PropertyContainer *container) const; signals: void viewSelected(View *client); void propertyContainerSelected(View *client, PropertyContainer *container); void contextHelpChanged(const QString &); public slots: void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerPropertyChanged(PropertyContainer *); void propertyContainerPropertyRangeChanged(PropertyContainer *); void propertyContainerNameChanged(PropertyContainer *); void showLayer(bool); void mouseEnteredTabBar(); void mouseLeftTabBar(); void activeTabClicked(); protected slots: void selectedContainerChanged(int); protected: View *m_client; std::vector m_boxes; void repopulate(); void updateValues(PropertyContainer *); }; #endif sonic-visualiser-3.0.3/svgui/widgets/RangeInputDialog.cpp0000644000000000000000000000622113111512442021640 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "RangeInputDialog.h" #include #include #include #include #include #include RangeInputDialog::RangeInputDialog(QString title, QString message, QString unit, float min, float max, QWidget *parent) : QDialog(parent) { QGridLayout *grid = new QGridLayout; setLayout(grid); setWindowTitle(title); QLabel *messageLabel = new QLabel; messageLabel->setText(message); grid->addWidget(messageLabel, 0, 0, 1, 5); m_rangeStart = new QDoubleSpinBox; m_rangeStart->setDecimals(4); m_rangeStart->setMinimum(min); m_rangeStart->setMaximum(max); m_rangeStart->setSuffix(unit); grid->addWidget(m_rangeStart, 1, 1); connect(m_rangeStart, SIGNAL(valueChanged(double)), this, SLOT(rangeStartChanged(double))); grid->addWidget(new QLabel(tr(" to ")), 1, 2); m_rangeEnd = new QDoubleSpinBox; m_rangeEnd->setDecimals(4); m_rangeEnd->setMinimum(min); m_rangeEnd->setMaximum(max); m_rangeEnd->setSuffix(unit); grid->addWidget(m_rangeEnd, 1, 3); connect(m_rangeEnd, SIGNAL(valueChanged(double)), this, SLOT(rangeEndChanged(double))); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); grid->addWidget(bb, 2, 0, 1, 5); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); } RangeInputDialog::~RangeInputDialog() { } void RangeInputDialog::getRange(float &min, float &max) { min = float(m_rangeStart->value()); max = float(m_rangeEnd->value()); if (min > max) { float tmp = min; min = max; max = tmp; } } void RangeInputDialog::setRange(float start, float end) { if (start > end) { float tmp = start; start = end; end = tmp; } blockSignals(true); m_rangeStart->setValue(start); m_rangeEnd->setValue(end); blockSignals(false); } void RangeInputDialog::rangeStartChanged(double min) { double max = m_rangeEnd->value(); if (min > max) { double tmp = min; min = max; max = tmp; } emit rangeChanged(float(min), float(max)); } void RangeInputDialog::rangeEndChanged(double max) { double min = m_rangeStart->value(); if (min > max) { double tmp = min; min = max; max = tmp; } emit rangeChanged(float(min), float(max)); } sonic-visualiser-3.0.3/svgui/widgets/RangeInputDialog.h0000644000000000000000000000241413111512442021305 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _RANGE_INPUT_DIALOG_H_ #define _RANGE_INPUT_DIALOG_H_ #include #include class QDoubleSpinBox; class RangeInputDialog : public QDialog { Q_OBJECT public: RangeInputDialog(QString title, QString message, QString unit, float min, float max, QWidget *parent = 0); virtual ~RangeInputDialog(); void getRange(float &start, float &end); signals: void rangeChanged(float start, float end); public slots: void setRange(float start, float end); protected slots: void rangeStartChanged(double); void rangeEndChanged(double); protected: QDoubleSpinBox *m_rangeStart; QDoubleSpinBox *m_rangeEnd; }; #endif sonic-visualiser-3.0.3/svgui/widgets/SelectableLabel.cpp0000644000000000000000000000730513111512442021453 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SelectableLabel.h" #include #include SelectableLabel::SelectableLabel(QWidget *p) : QLabel(p), m_selected(false) { setTextFormat(Qt::RichText); // setLineWidth(2); // setFixedWidth(480); setupStyle(); setOpenExternalLinks(true); } SelectableLabel::~SelectableLabel() { } void SelectableLabel::setUnselectedText(QString text) { if (m_unselectedText == text) return; m_unselectedText = text; if (!m_selected) { setText(m_unselectedText); resize(sizeHint()); } } void SelectableLabel::setSelectedText(QString text) { if (m_selectedText == text) return; m_selectedText = text; if (m_selected) { setText(m_selectedText); resize(sizeHint()); } } void SelectableLabel::setupStyle() { QPalette palette = QApplication::palette(); setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse | Qt::TextSelectableByMouse); if (m_selected) { setWordWrap(true); setStyleSheet (QString("QLabel:hover { background: %1; color: %3; } " "QLabel:!hover { background: %2; color: %3 } " "QLabel { padding: 7px }") .arg(palette.mid().color().lighter(120).name()) .arg(palette.mid().color().lighter(140).name()) .arg(palette.text().color().name())); } else { setWordWrap(false); setStyleSheet (QString("QLabel:hover { background: %1; color: %3; } " "QLabel:!hover { background: %2; color: %3 } " "QLabel { padding: 7px }") .arg(palette.button().color().name()) .arg(palette.light().color().name()) .arg(palette.text().color().name())); } } void SelectableLabel::setSelected(bool s) { if (m_selected == s) return; m_selected = s; if (m_selected) { setText(m_selectedText); } else { setText(m_unselectedText); } setupStyle(); parentWidget()->resize(parentWidget()->sizeHint()); } void SelectableLabel::toggle() { setSelected(!m_selected); } void SelectableLabel::mousePressEvent(QMouseEvent *e) { m_swallowRelease = !m_selected; setSelected(true); QLabel::mousePressEvent(e); emit selectionChanged(); } void SelectableLabel::mouseDoubleClickEvent(QMouseEvent *e) { QLabel::mouseDoubleClickEvent(e); emit doubleClicked(); } void SelectableLabel::mouseReleaseEvent(QMouseEvent *e) { if (!m_swallowRelease) QLabel::mouseReleaseEvent(e); m_swallowRelease = false; } void SelectableLabel::enterEvent(QEvent *) { // cerr << "enterEvent" << endl; // QPalette palette = QApplication::palette(); // palette.setColor(QPalette::Window, Qt::gray); // setStyleSheet("background: gray"); // setPalette(palette); } void SelectableLabel::leaveEvent(QEvent *) { // cerr << "leaveEvent" << endl; // setStyleSheet("background: white"); // QPalette palette = QApplication::palette(); // palette.setColor(QPalette::Window, Qt::gray); // setPalette(palette); } sonic-visualiser-3.0.3/svgui/widgets/SelectableLabel.h0000644000000000000000000000265213111512442021120 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SELECTABLE_LABEL_H_ #define _SELECTABLE_LABEL_H_ #include class SelectableLabel : public QLabel { Q_OBJECT public: SelectableLabel(QWidget *parent = 0); virtual ~SelectableLabel(); void setSelectedText(QString); void setUnselectedText(QString); bool isSelected() const { return m_selected; } signals: void selectionChanged(); void doubleClicked(); public slots: void setSelected(bool); void toggle(); protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); void setupStyle(); QString m_selectedText; QString m_unselectedText; bool m_selected; bool m_swallowRelease; }; #endif sonic-visualiser-3.0.3/svgui/widgets/SubdividingMenu.cpp0000644000000000000000000002061613111512442021544 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "SubdividingMenu.h" #include #include "base/Debug.h" using std::set; using std::map; SubdividingMenu::SubdividingMenu(int lowerLimit, int upperLimit, QWidget *parent) : QMenu(parent), m_lowerLimit(lowerLimit ? lowerLimit : 14), m_upperLimit(upperLimit ? upperLimit : (m_lowerLimit * 5) / 2), m_entriesSet(false) { } SubdividingMenu::SubdividingMenu(const QString &title, int lowerLimit, int upperLimit, QWidget *parent) : QMenu(title, parent), m_lowerLimit(lowerLimit ? lowerLimit : 14), m_upperLimit(upperLimit ? upperLimit : (m_lowerLimit * 5) / 2), m_entriesSet(false) { } SubdividingMenu::~SubdividingMenu() { for (map::iterator i = m_pendingEntries.begin(); i != m_pendingEntries.end(); ++i) { delete i->second; } } void SubdividingMenu::setEntries(const std::set &entries) { m_entriesSet = true; int total = int(entries.size()); if (total < m_upperLimit) return; int count = 0; QMenu *chunkMenu = new QMenu(); chunkMenu->setTearOffEnabled(isTearOffEnabled()); QString firstNameInChunk; QChar firstInitialInChunk; bool discriminateStartInitial = false; for (set::const_iterator j = entries.begin(); j != entries.end(); ++j) { // SVDEBUG << "SubdividingMenu::setEntries: j -> " << j->toStdString() << endl; m_nameToChunkMenuMap[*j] = chunkMenu; set::iterator k = j; ++k; QChar initial = (*j)[0]; if (count == 0) { firstNameInChunk = *j; firstInitialInChunk = initial; } // cerr << "count = "<< count << ", upper limit = " << m_upperLimit << endl; bool lastInChunk = (k == entries.end() || (count >= m_lowerLimit-1 && (count == m_upperLimit || (*k)[0] != initial))); ++count; if (lastInChunk) { bool discriminateEndInitial = (k != entries.end() && (*k)[0] == initial); bool initialsEqual = (firstInitialInChunk == initial); QString from = QString("%1").arg(firstInitialInChunk); if (discriminateStartInitial || (discriminateEndInitial && initialsEqual)) { from = firstNameInChunk.left(3); } QString to = QString("%1").arg(initial); if (discriminateEndInitial || (discriminateStartInitial && initialsEqual)) { to = j->left(3); } QString menuText; if (from == to) menuText = from; else menuText = tr("%1 - %2").arg(from).arg(to); discriminateStartInitial = discriminateEndInitial; chunkMenu->setTitle(menuText); QMenu::addMenu(chunkMenu); chunkMenu = new QMenu(); chunkMenu->setTearOffEnabled(isTearOffEnabled()); count = 0; } } if (count == 0) delete chunkMenu; } void SubdividingMenu::entriesAdded() { if (m_entriesSet) { cerr << "ERROR: SubdividingMenu::entriesAdded: setEntries was also called -- should use one mechanism or the other, but not both" << endl; return; } set entries; for (map::const_iterator i = m_pendingEntries.begin(); i != m_pendingEntries.end(); ++i) { entries.insert(i->first); } setEntries(entries); for (map::iterator i = m_pendingEntries.begin(); i != m_pendingEntries.end(); ++i) { QMenu *menu = dynamic_cast(i->second); if (menu) { addMenu(i->first, menu); continue; } QAction *action = dynamic_cast(i->second); if (action) { addAction(i->first, action); continue; } } m_pendingEntries.clear(); } void SubdividingMenu::addAction(QAction *action) { QString name = action->text(); if (!m_entriesSet) { m_pendingEntries[name] = action; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addAction(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addAction(action); return; } // SVDEBUG << "SubdividingMenu::addAction(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addAction(action); } QAction * SubdividingMenu::addAction(const QString &name) { if (!m_entriesSet) { QAction *action = new QAction(name, this); m_pendingEntries[name] = action; return action; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addAction(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; return QMenu::addAction(name); } // SVDEBUG << "SubdividingMenu::addAction(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; return m_nameToChunkMenuMap[name]->addAction(name); } void SubdividingMenu::addAction(const QString &name, QAction *action) { if (!m_entriesSet) { m_pendingEntries[name] = action; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addAction(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addAction(action); return; } // SVDEBUG << "SubdividingMenu::addAction(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addAction(action); } void SubdividingMenu::addMenu(QMenu *menu) { QString name = menu->title(); if (!m_entriesSet) { m_pendingEntries[name] = menu; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addMenu(menu); return; } // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addMenu(menu); } QMenu * SubdividingMenu::addMenu(const QString &name) { if (!m_entriesSet) { QMenu *menu = new QMenu(name, this); menu->setTearOffEnabled(isTearOffEnabled()); m_pendingEntries[name] = menu; return menu; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; return QMenu::addMenu(name); } // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; return m_nameToChunkMenuMap[name]->addMenu(name); } void SubdividingMenu::addMenu(const QString &name, QMenu *menu) { if (!m_entriesSet) { m_pendingEntries[name] = menu; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addMenu(menu); return; } // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addMenu(menu); } sonic-visualiser-3.0.3/svgui/widgets/SubdividingMenu.h0000644000000000000000000000457513111512442021217 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _SUBDIVIDING_MENU_H_ #define _SUBDIVIDING_MENU_H_ #include #include #include #include /** * A menu that divides its entries into submenus, alphabetically. For * menus that may contain a very large or small number of named items * (e.g. plugins). * * The menu needs to be told, before any of the actions are added, * what the set of entry strings will be, so it can determine a * reasonable categorisation. Do this by calling the setEntries() * method. If it isn't practical to do this in advance, then add the * entries and call entriesAdded() afterwards instead. */ class SubdividingMenu : public QMenu { Q_OBJECT public: SubdividingMenu(int lowerLimit = 0, int upperLimit = 0, QWidget *parent = 0); SubdividingMenu(const QString &title, int lowerLimit = 0, int upperLimit = 0, QWidget *parent = 0); virtual ~SubdividingMenu(); void setEntries(const std::set &entries); void entriesAdded(); // Action names and strings passed to addAction and addMenu must // appear in the set previously given to setEntries. If you want // to use a different string, use the two-argument method and pass // the entry string (used to determine which submenu the action // ends up on) as the first argument. virtual void addAction(QAction *); virtual QAction *addAction(const QString &); virtual void addAction(const QString &entry, QAction *); virtual void addMenu(QMenu *); virtual QMenu *addMenu(const QString &); virtual void addMenu(const QString &entry, QMenu *); protected: std::map m_nameToChunkMenuMap; int m_lowerLimit; int m_upperLimit; bool m_entriesSet; std::map m_pendingEntries; }; #endif sonic-visualiser-3.0.3/svgui/widgets/TextAbbrev.cpp0000644000000000000000000001666413111512442020526 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "TextAbbrev.h" #include #include #include QString TextAbbrev::getDefaultEllipsis() { return "..."; } int TextAbbrev::getFuzzLength(QString ellipsis) { int len = ellipsis.length(); if (len < 3) return len + 3; else if (len > 5) return len + 5; else return len * 2; } int TextAbbrev::getFuzzWidth(const QFontMetrics &metrics, QString ellipsis) { int width = metrics.width(ellipsis); return width * 2; } QString TextAbbrev::abbreviateTo(QString text, int characters, Policy policy, QString ellipsis) { switch (policy) { case ElideEnd: case ElideEndAndCommonPrefixes: text = text.left(characters) + ellipsis; break; case ElideStart: text = ellipsis + text.right(characters); break; case ElideMiddle: if (characters > 2) { text = text.left(characters/2 + 1) + ellipsis + text.right(characters - (characters/2 + 1)); } else { text = text.left(characters) + ellipsis; } break; } return text; } QString TextAbbrev::abbreviate(QString text, int maxLength, Policy policy, bool fuzzy, QString ellipsis) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int fl = (fuzzy ? getFuzzLength(ellipsis) : 0); if (maxLength <= ellipsis.length()) maxLength = ellipsis.length() + 1; if (text.length() <= maxLength + fl) return text; int truncated = maxLength - ellipsis.length(); return abbreviateTo(text, truncated, policy, ellipsis); } QString TextAbbrev::abbreviate(QString text, const QFontMetrics &metrics, int &maxWidth, Policy policy, QString ellipsis) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int tw = metrics.width(text); if (tw <= maxWidth) { maxWidth = tw; return text; } int truncated = text.length(); QString original = text; while (tw > maxWidth && truncated > 1) { truncated--; if (truncated > ellipsis.length()) { text = abbreviateTo(original, truncated, policy, ellipsis); } else { break; } tw = metrics.width(text); } maxWidth = tw; return text; } QStringList TextAbbrev::abbreviate(const QStringList &texts, int maxLength, Policy policy, bool fuzzy, QString ellipsis) { if (policy == ElideEndAndCommonPrefixes && texts.size() > 1) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int fl = (fuzzy ? getFuzzLength(ellipsis) : 0); if (maxLength <= ellipsis.length()) maxLength = ellipsis.length() + 1; int maxOrigLength = 0; for (int i = 0; i < texts.size(); ++i) { int len = texts[i].length(); if (len > maxOrigLength) maxOrigLength = len; } if (maxOrigLength <= maxLength + fl) return texts; return abbreviate(elidePrefixes (texts, maxOrigLength - maxLength, ellipsis), maxLength, ElideEnd, fuzzy, ellipsis); } QStringList results; for (int i = 0; i < texts.size(); ++i) { results.push_back (abbreviate(texts[i], maxLength, policy, fuzzy, ellipsis)); } return results; } QStringList TextAbbrev::abbreviate(const QStringList &texts, const QFontMetrics &metrics, int &maxWidth, Policy policy, QString ellipsis) { if (policy == ElideEndAndCommonPrefixes && texts.size() > 1) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int maxOrigWidth = 0; for (int i = 0; i < texts.size(); ++i) { int w = metrics.width(texts[i]); if (w > maxOrigWidth) maxOrigWidth = w; } return abbreviate(elidePrefixes(texts, metrics, maxOrigWidth - maxWidth, ellipsis), metrics, maxWidth, ElideEnd, ellipsis); } QStringList results; int maxAbbrWidth = 0; for (int i = 0; i < texts.size(); ++i) { int width = maxWidth; QString abbr = abbreviate(texts[i], metrics, width, policy, ellipsis); if (width > maxAbbrWidth) maxAbbrWidth = width; results.push_back(abbr); } maxWidth = maxAbbrWidth; return results; } QStringList TextAbbrev::elidePrefixes(const QStringList &texts, int targetReduction, QString ellipsis) { if (texts.empty()) return texts; int plen = getPrefixLength(texts); int fl = getFuzzLength(ellipsis); if (plen < fl) return texts; QString prefix = texts[0].left(plen); int truncated = plen; if (plen >= targetReduction + fl) { truncated = plen - targetReduction; } else { truncated = fl; } prefix = abbreviate(prefix, truncated, ElideEnd, false, ellipsis); QStringList results; for (int i = 0; i < texts.size(); ++i) { results.push_back (prefix + texts[i].right(texts[i].length() - plen)); } return results; } QStringList TextAbbrev::elidePrefixes(const QStringList &texts, const QFontMetrics &metrics, int targetWidthReduction, QString ellipsis) { if (texts.empty()) return texts; int plen = getPrefixLength(texts); int fl = getFuzzLength(ellipsis); if (plen < fl) return texts; QString prefix = texts[0].left(plen); int pwid = metrics.width(prefix); int twid = pwid - targetWidthReduction; if (twid < metrics.width(ellipsis) * 2) twid = metrics.width(ellipsis) * 2; prefix = abbreviate(prefix, metrics, twid, ElideEnd, ellipsis); QStringList results; for (int i = 0; i < texts.size(); ++i) { results.push_back (prefix + texts[i].right(texts[i].length() - plen)); } return results; } static bool havePrefix(QString prefix, const QStringList &texts) { for (int i = 1; i < texts.size(); ++i) { if (!texts[i].startsWith(prefix)) return false; } return true; } int TextAbbrev::getPrefixLength(const QStringList &texts) { QString reference = texts[0]; if (reference == "" || havePrefix(reference, texts)) { return reference.length(); } int candidate = reference.length(); QString splitChars(";:,./#-!()$_+=[]{}\\"); while (--candidate > 1) { if (splitChars.contains(reference[candidate])) { if (havePrefix(reference.left(candidate), texts)) { break; } } } // SVDEBUG << "TextAbbrev::getPrefixLength: prefix length is " << candidate << endl; // for (int i = 0; i < texts.size(); ++i) { // cerr << texts[i].left(candidate) << "|" << texts[i].right(texts[i].length() - candidate) << endl; // } return candidate; } sonic-visualiser-3.0.3/svgui/widgets/TextAbbrev.h0000644000000000000000000001016413111512442020160 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_ABBREV_H_ #define _TEXT_ABBREV_H_ #include #include class QFontMetrics; class TextAbbrev { public: enum Policy { ElideEnd, ElideEndAndCommonPrefixes, ElideStart, ElideMiddle }; /** * Abbreviate the given text to the given maximum length * (including ellipsis), using the given abbreviation policy. If * fuzzy is true, the text will be left alone if it is "not much * more than" the maximum length. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is "..."). */ static QString abbreviate(QString text, int maxLength, Policy policy = ElideEnd, bool fuzzy = true, QString ellipsis = ""); /** * Abbreviate the given text to the given maximum painted width, * using the given abbreviation policy. maxWidth is also modified * so as to return the painted width of the abbreviated text. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is tr("...")). */ static QString abbreviate(QString text, const QFontMetrics &metrics, int &maxWidth, Policy policy = ElideEnd, QString ellipsis = ""); /** * Abbreviate all of the given texts to the given maximum length, * using the given abbreviation policy. If fuzzy is true, texts * that are "not much more than" the maximum length will be left * alone. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is tr("...")). */ static QStringList abbreviate(const QStringList &texts, int maxLength, Policy policy = ElideEndAndCommonPrefixes, bool fuzzy = true, QString ellipsis = ""); /** * Abbreviate all of the given texts to the given maximum painted * width, using the given abbreviation policy. maxWidth is also * modified so as to return the maximum painted width of the * abbreviated texts. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is tr("...")). */ static QStringList abbreviate(const QStringList &texts, const QFontMetrics &metrics, int &maxWidth, Policy policy = ElideEndAndCommonPrefixes, QString ellipsis = ""); protected: static QString getDefaultEllipsis(); static int getFuzzLength(QString ellipsis); static int getFuzzWidth(const QFontMetrics &metrics, QString ellipsis); static QString abbreviateTo(QString text, int characters, Policy policy, QString ellipsis); static QStringList elidePrefixes(const QStringList &texts, int targetReduction, QString ellipsis); static QStringList elidePrefixes(const QStringList &texts, const QFontMetrics &metrics, int targetWidthReduction, QString ellipsis); static int getPrefixLength(const QStringList &texts); }; #endif sonic-visualiser-3.0.3/svgui/widgets/Thumbwheel.cpp0000644000000000000000000003303313111512442020551 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "Thumbwheel.h" #include "base/RangeMapper.h" #include "base/Profiler.h" #include #include #include #include #include #include #include #include Thumbwheel::Thumbwheel(Qt::Orientation orientation, QWidget *parent) : QWidget(parent), m_min(0), m_max(100), m_default(50), m_value(50), m_mappedValue(50), m_noMappedUpdate(false), m_rotation(0.5), m_orientation(orientation), m_speed(1.0), m_tracking(true), m_showScale(true), m_clicked(false), m_atDefault(true), m_clickRotation(m_rotation), m_showTooltip(true), m_rangeMapper(0) { } Thumbwheel::~Thumbwheel() { delete m_rangeMapper; } void Thumbwheel::setRangeMapper(RangeMapper *mapper) { if (m_rangeMapper == mapper) return; if (!m_rangeMapper && mapper) { connect(this, SIGNAL(valueChanged(int)), this, SLOT(updateMappedValue(int))); } delete m_rangeMapper; m_rangeMapper = mapper; updateMappedValue(getValue()); } void Thumbwheel::setShowToolTip(bool show) { m_showTooltip = show; m_noMappedUpdate = true; updateMappedValue(getValue()); m_noMappedUpdate = false; } void Thumbwheel::setMinimumValue(int min) { if (m_min == min) return; m_min = min; if (m_max <= m_min) m_max = m_min + 1; if (m_value < m_min) m_value = m_min; if (m_value > m_max) m_value = m_max; m_rotation = float(m_value - m_min) / float(m_max - m_min); update(); } int Thumbwheel::getMinimumValue() const { return m_min; } void Thumbwheel::setMaximumValue(int max) { if (m_max == max) return; m_max = max; if (m_min >= m_max) m_min = m_max - 1; if (m_value < m_min) m_value = m_min; if (m_value > m_max) m_value = m_max; m_rotation = float(m_value - m_min) / float(m_max - m_min); update(); } int Thumbwheel::getMaximumValue() const { return m_max; } void Thumbwheel::setDefaultValue(int deft) { if (m_default == deft) return; m_default = deft; if (m_atDefault) { setValue(m_default); m_atDefault = true; // setValue unsets this m_cache = QImage(); emit valueChanged(getValue()); } } void Thumbwheel::setMappedValue(double mappedValue) { if (m_rangeMapper) { int newValue = m_rangeMapper->getPositionForValue(mappedValue); bool changed = (m_mappedValue != mappedValue); m_mappedValue = mappedValue; m_noMappedUpdate = true; // SVDEBUG << "Thumbwheel::setMappedValue(" << mappedValue << "): new value is " << newValue << " (visible " << isVisible() << ")" << endl; if (newValue != getValue()) { setValue(newValue); changed = true; m_cache = QImage(); } if (changed) emit valueChanged(newValue); m_noMappedUpdate = false; } else { int v = int(mappedValue); if (v != getValue()) { setValue(v); m_cache = QImage(); emit valueChanged(v); } } } int Thumbwheel::getDefaultValue() const { return m_default; } void Thumbwheel::setValue(int value) { // SVDEBUG << "Thumbwheel::setValue(" << value << ") (from " << m_value // << ", rotation " << m_rotation << ")" << " (visible " << isVisible() << ")" << endl; if (m_value != value) { m_atDefault = false; if (value < m_min) value = m_min; if (value > m_max) value = m_max; m_value = value; } m_rotation = float(m_value - m_min) / float(m_max - m_min); m_cache = QImage(); if (isVisible()) update(); } void Thumbwheel::resetToDefault() { if (m_default == m_value) return; setValue(m_default); m_atDefault = true; m_cache = QImage(); emit valueChanged(getValue()); } int Thumbwheel::getValue() const { return m_value; } double Thumbwheel::getMappedValue() const { if (m_rangeMapper) { // SVDEBUG << "Thumbwheel::getMappedValue(): value = " << getValue() << ", mappedValue = " << m_mappedValue << endl; return m_mappedValue; } return getValue(); } void Thumbwheel::updateMappedValue(int value) { if (!m_noMappedUpdate) { if (m_rangeMapper) { m_mappedValue = m_rangeMapper->getValueForPosition(value); } else { m_mappedValue = value; } } if (m_showTooltip) { QString name = objectName(); QString unit = ""; QString text; if (m_rangeMapper) unit = m_rangeMapper->getUnit(); if (name != "") { text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit); } else { text = tr("%2%3").arg(m_mappedValue).arg(unit); } setToolTip(text); } } void Thumbwheel::scroll(bool up) { int step = int(lrintf(m_speed)); if (step == 0) step = 1; if (up) { setValue(m_value + step); } else { setValue(m_value - step); } emit valueChanged(getValue()); } void Thumbwheel::setSpeed(float speed) { m_speed = speed; } float Thumbwheel::getSpeed() const { return m_speed; } void Thumbwheel::setTracking(bool tracking) { m_tracking = tracking; } bool Thumbwheel::getTracking() const { return m_tracking; } void Thumbwheel::setShowScale(bool showScale) { m_showScale = showScale; } bool Thumbwheel::getShowScale() const { return m_showScale; } void Thumbwheel::enterEvent(QEvent *) { emit mouseEntered(); } void Thumbwheel::leaveEvent(QEvent *) { emit mouseLeft(); } void Thumbwheel::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::MidButton || ((e->button() == Qt::LeftButton) && (e->modifiers() & Qt::ControlModifier))) { resetToDefault(); } else if (e->button() == Qt::LeftButton) { m_clicked = true; m_clickPos = e->pos(); m_clickRotation = m_rotation; } } void Thumbwheel::mouseDoubleClickEvent(QMouseEvent *mouseEvent) { //!!! needs a common base class with AudioDial (and Panner?) if (mouseEvent->button() != Qt::LeftButton) { return; } bool ok = false; if (m_rangeMapper) { double min = m_rangeMapper->getValueForPosition(m_min); double max = m_rangeMapper->getValueForPosition(m_max); if (min > max) { double tmp = min; min = max; max = tmp; } QString unit = m_rangeMapper->getUnit(); QString text; if (objectName() != "") { if (unit != "") { text = tr("New value for %1, from %2 to %3 %4:") .arg(objectName()).arg(min).arg(max).arg(unit); } else { text = tr("New value for %1, from %2 to %3:") .arg(objectName()).arg(min).arg(max); } } else { if (unit != "") { text = tr("Enter a new value from %1 to %2 %3:") .arg(min).arg(max).arg(unit); } else { text = tr("Enter a new value from %1 to %2:") .arg(min).arg(max); } } double newValue = QInputDialog::getDouble (this, tr("Enter new value"), text, m_mappedValue, min, max, 4, &ok); if (ok) { setMappedValue(newValue); } } else { int newValue = QInputDialog::getInt (this, tr("Enter new value"), tr("Enter a new value from %1 to %2:") .arg(m_min).arg(m_max), getValue(), m_min, m_max, 1, &ok); if (ok) { setValue(newValue); } } } void Thumbwheel::mouseMoveEvent(QMouseEvent *e) { if (!m_clicked) return; int dist = 0; if (m_orientation == Qt::Horizontal) { dist = e->x() - m_clickPos.x(); } else { dist = e->y() - m_clickPos.y(); } float rotation = m_clickRotation + (m_speed * float(dist)) / 100; if (rotation < 0.f) rotation = 0.f; if (rotation > 1.f) rotation = 1.f; int value = int(lrintf(float(m_min) + float(m_max - m_min) * m_rotation)); if (value != m_value) { setValue(value); if (m_tracking) emit valueChanged(getValue()); m_rotation = rotation; } else if (fabsf(rotation - m_rotation) > 0.001) { m_rotation = rotation; repaint(); } } void Thumbwheel::mouseReleaseEvent(QMouseEvent *e) { if (!m_clicked) return; bool reallyTracking = m_tracking; m_tracking = true; mouseMoveEvent(e); m_tracking = reallyTracking; m_clicked = false; } void Thumbwheel::wheelEvent(QWheelEvent *e) { int step = int(lrintf(m_speed)); if (step == 0) step = 1; if (e->delta() > 0) { setValue(m_value + step); } else { setValue(m_value - step); } emit valueChanged(getValue()); } void Thumbwheel::paintEvent(QPaintEvent *) { Profiler profiler("Thumbwheel::paintEvent"); if (!m_cache.isNull()) { QPainter paint(this); paint.drawImage(rect(), m_cache, m_cache.rect()); return; } Profiler profiler2("Thumbwheel::paintEvent (no cache)"); QSize imageSize = size() * devicePixelRatio(); m_cache = QImage(imageSize, QImage::Format_ARGB32); m_cache.fill(Qt::transparent); int w = m_cache.width(); int h = m_cache.height(); int bw = 3; // border width QRect subclip; if (m_orientation == Qt::Horizontal) { subclip = QRect(bw, bw+1, w - bw*2, h - bw*2 - 2); } else { subclip = QRect(bw+1, bw, w - bw*2 - 2, h - bw*2); } QPainter paint(&m_cache); paint.setClipRect(m_cache.rect()); paint.fillRect(subclip, palette().background().color()); paint.setRenderHint(QPainter::Antialiasing, true); double w0 = 0.5; double w1 = w - 0.5; double h0 = 0.5; double h1 = h - 0.5; for (int i = bw-1; i >= 0; --i) { int grey = (i + 1) * (256 / (bw + 1)); QColor fc = QColor(grey, grey, grey); paint.setPen(fc); QPainterPath path; if (m_orientation == Qt::Horizontal) { path.moveTo(w0 + i, h0 + i + 2); path.quadTo(w/2, i * 1.25, w1 - i, h0 + i + 2); path.lineTo(w1 - i, h1 - i - 2); path.quadTo(w/2, h - i * 1.25, w0 + i, h1 - i - 2); path.closeSubpath(); } else { path.moveTo(w0 + i + 2, h0 + i); path.quadTo(i * 1.25, h/2, w0 + i + 2, h1 - i); path.lineTo(w1 - i - 2, h1 - i); path.quadTo(w - i * 1.25, h/2, w1 - i - 2, h0 + i); path.closeSubpath(); } paint.drawPath(path); } paint.setClipRect(subclip); double radians = m_rotation * 1.5f * M_PI; // cerr << "value = " << m_value << ", min = " << m_min << ", max = " << m_max << ", rotation = " << rotation << endl; int ww = (m_orientation == Qt::Horizontal ? w : h) - bw*2; // wheel width // total number of notches on the entire wheel int notches = 25; // radius of the wheel including invisible part int radius = int(ww / 2 + 2); for (int i = 0; i < notches; ++i) { double a0 = (2.0 * M_PI * i) / notches + radians; double a1 = a0 + M_PI / (notches * 2); double a2 = (2.0 * M_PI * (i + 1)) / notches + radians; double depth = cos((a0 + a2) / 2); if (depth < 0) continue; double x0 = radius * sin(a0) + ww/2; double x1 = radius * sin(a1) + ww/2; double x2 = radius * sin(a2) + ww/2; if (x2 < 0 || x0 > ww) continue; if (x0 < 0) x0 = 0; if (x2 > ww) x2 = ww; x0 += bw; x1 += bw; x2 += bw; int grey = int(lrint(120 * depth)); QColor fc = QColor(grey, grey, grey); QColor oc = palette().highlight().color(); paint.setPen(fc); if (m_showScale) { paint.setBrush(oc); double prop; if (i >= notches / 4) { prop = double(notches - (((i - double(notches) / 4.f) * 4.f) / 3.f)) / notches; } else { prop = 0.f; } if (m_orientation == Qt::Horizontal) { paint.drawRect(QRectF(x1, h - (h - bw*2) * prop - bw, x2 - x1, h * prop)); } else { paint.drawRect(QRectF(bw, x1, (w - bw*2) * prop, x2 - x1)); } } paint.setPen(fc); paint.setBrush(palette().background().color()); if (m_orientation == Qt::Horizontal) { paint.drawRect(QRectF(x0, bw, x1 - x0, h - bw*2)); } else { paint.drawRect(QRectF(bw, x0, w - bw*2, x1 - x0)); } } QPainter paint2(this); paint2.drawImage(rect(), m_cache, m_cache.rect()); } QSize Thumbwheel::sizeHint() const { if (m_orientation == Qt::Horizontal) { return QSize(80, 12); } else { return QSize(12, 80); } } sonic-visualiser-3.0.3/svgui/widgets/Thumbwheel.h0000644000000000000000000000511413111512442020215 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _THUMBWHEEL_H_ #define _THUMBWHEEL_H_ #include #include #include class RangeMapper; class Thumbwheel : public QWidget { Q_OBJECT public: Thumbwheel(Qt::Orientation orientation, QWidget *parent = 0); virtual ~Thumbwheel(); int getMinimumValue() const; int getMaximumValue() const; int getDefaultValue() const; float getSpeed() const; bool getTracking() const; bool getShowScale() const; int getValue() const; void setRangeMapper(RangeMapper *mapper); // I take ownership, will delete const RangeMapper *getRangeMapper() const { return m_rangeMapper; } double getMappedValue() const; void setShowToolTip(bool show); QSize sizeHint() const; signals: void valueChanged(int); void mouseEntered(); void mouseLeft(); public slots: void setMinimumValue(int min); void setMaximumValue(int max); void setDefaultValue(int deft); void setSpeed(float speed); void setTracking(bool tracking); void setShowScale(bool show); void setValue(int value); void setMappedValue(double mappedValue); void scroll(bool up); void resetToDefault(); protected slots: void updateMappedValue(int value); protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void wheelEvent(QWheelEvent *e); virtual void paintEvent(QPaintEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); int m_min; int m_max; int m_default; int m_value; double m_mappedValue; bool m_noMappedUpdate; float m_rotation; Qt::Orientation m_orientation; float m_speed; bool m_tracking; bool m_showScale; bool m_clicked; bool m_atDefault; QPoint m_clickPos; float m_clickRotation; bool m_showTooltip; RangeMapper *m_rangeMapper; QImage m_cache; }; #endif sonic-visualiser-3.0.3/svgui/widgets/TipDialog.cpp0000644000000000000000000001744513111512442020332 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "TipDialog.h" #include #include #include #include #include #include #include #include #include #include #include TipDialog::TipDialog(QWidget *parent) : QDialog(parent), m_tipNumber(0), m_label(0), m_caption(tr("Tip of the Day")) { readTips(); QSettings settings; settings.beginGroup("TipOfTheDay"); if (!settings.value("showonstartup", true).toBool()) return; m_tipNumber = settings.value("nexttip", 0).toInt(); setWindowTitle(m_caption); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *groupBox = new QGroupBox; // groupBox->setTitle(m_caption); grid->addWidget(groupBox, 0, 0); QGridLayout *subgrid = new QGridLayout; groupBox->setLayout(subgrid); m_label = new QLabel; subgrid->addWidget(m_label, 0, 0); m_label->setWordWrap(true); QHBoxLayout *hbox = new QHBoxLayout; grid->addLayout(hbox, 1, 0); QCheckBox *show = new QCheckBox(tr("Show tip on startup")); hbox->addWidget(show); hbox->addSpacing(20); hbox->addStretch(10); QPushButton *prev = new QPushButton(tr("<< Previous")); hbox->addWidget(prev); connect(prev, SIGNAL(clicked()), this, SLOT(previous())); QPushButton *next = new QPushButton(tr("Next >>")); hbox->addWidget(next); connect(next, SIGNAL(clicked()), this, SLOT(next())); QPushButton *close = new QPushButton(tr("Close")); hbox->addWidget(close); connect(close, SIGNAL(clicked()), this, SLOT(accept())); close->setDefault(true); showTip(); } TipDialog::~TipDialog() { } void TipDialog::next() { if (++m_tipNumber >= int(m_tips.size())) { //!!! The tips file should define where we loop back to -- the // first one at least is likely to be a generic welcome message m_tipNumber = 0; } showTip(); } void TipDialog::previous() { if (--m_tipNumber < 0) { m_tipNumber = int(m_tips.size()) - 1; } showTip(); } void TipDialog::readTips() { SVDEBUG << "TipDialog::readTips" << endl; QString language = QLocale::system().name(); QString filename = QString(":i18n/tips_%1.xml").arg(language); if (!QFileInfo(filename).exists()) { QString base = language.section('_', 0, 0); filename = QString(":i18n/tips_%1.xml").arg(base); if (!QFileInfo(filename).exists()) { filename = QString(":i18n/tips.xml"); if (!QFileInfo(filename).exists()) return; } } QFile file(filename); SVDEBUG << "TipDialog::readTips from " << filename << endl; QXmlInputSource source(&file); TipFileParser parser(this); parser.parse(source); } void TipDialog::showTip() { if (m_tipNumber < int(m_tips.size())) { cerr << "Tip " << m_tipNumber << " is: " << m_tips[m_tipNumber] << endl; m_label->setText(m_tips[m_tipNumber]); } else { accept(); } int tn = m_tipNumber; if (++tn >= int(m_tips.size())) tn = 0; //!!! as above QSettings settings; settings.beginGroup("TipOfTheDay"); settings.setValue("nexttip", tn); } TipDialog::TipFileParser::TipFileParser(TipDialog *dialog) : m_dialog(dialog), m_inTip(false), m_inText(false), m_inHtml(false) { } TipDialog::TipFileParser::~TipFileParser() { } void TipDialog::TipFileParser::parse(QXmlInputSource &source) { QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); reader.parse(source); } bool TipDialog::TipFileParser::startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes &attributes) { QString name = qName.toLower(); SVDEBUG << "TipFileParser::startElement(" << name << ")" << endl; if (name == "tips") { QString caption = attributes.value("caption"); SVDEBUG << "TipFileParser::caption = " << caption << endl; if (caption != "") m_dialog->m_caption = caption; } else if (name == "tip") { if (m_inTip) { cerr << "WARNING: TipFileParser: nested elements" << endl; } m_inTip = true; } else if (name == "text") { if (m_inTip) { m_inText = true; cerr << "TipFileParser: adding new tip" << endl; m_dialog->m_tips.push_back(""); } else { cerr << "WARNING: TipFileParser: outside element" << endl; } } else if (name == "html") { if (m_inTip) { m_inHtml = true; cerr << "TipFileParser: adding new tip" << endl; m_dialog->m_tips.push_back(""); } else { cerr << "WARNING: TipFileParser: outside element" << endl; } } else if (m_inHtml) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += "<" + qName; for (int i = 0; i < attributes.count(); ++i) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += " " + attributes.qName(i) + "=\"" + attributes.value(i) + "\""; } m_dialog->m_tips[m_dialog->m_tips.size()-1] += ">"; } SVDEBUG << "TipFileParser::startElement done" << endl; return true; } bool TipDialog::TipFileParser::endElement(const QString &, const QString &, const QString &qName) { QString name = qName.toLower(); if (name == "text") { if (!m_inText) { cerr << "WARNING: TipFileParser: without " << endl; } m_inText = false; } else if (name == "html") { if (!m_inHtml) { cerr << "WARNING: TipFileParser: without " << endl; } m_inHtml = false; } else if (name == "tip") { if (m_inText) { cerr << "WARNING: TipFileParser: without " << endl; } else if (m_inHtml) { cerr << "WARNING: TipFileParser: without " << endl; } else if (!m_inTip) { cerr << "WARNING: TipFileParser: without " << endl; } m_inTip = false; } else if (m_inHtml) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += ""; } return true; } bool TipDialog::TipFileParser::characters(const QString &text) { SVDEBUG << "TipFileParser::characters(" << text << ")" << endl; if (m_inText || m_inHtml) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += text; } return true; } bool TipDialog::TipFileParser::error(const QXmlParseException &exception) { QString errorString = QString("ERROR: TipFileParser: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << errorString << endl; return QXmlDefaultHandler::error(exception); } bool TipDialog::TipFileParser::fatalError(const QXmlParseException &exception) { QString errorString = QString("FATAL ERROR: TipFileParser: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << errorString << endl; return QXmlDefaultHandler::fatalError(exception); } sonic-visualiser-3.0.3/svgui/widgets/TipDialog.h0000644000000000000000000000410113111512442017760 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TIP_DIALOG_H_ #define _TIP_DIALOG_H_ #include #include #include #include #include "base/Debug.h" class QLabel; class QXmlInputSource; class TipDialog : public QDialog { Q_OBJECT public: TipDialog(QWidget *parent = 0); virtual ~TipDialog(); bool isOK() { return !m_tips.empty(); } protected slots: void previous(); void next(); protected: int m_tipNumber; QLabel *m_label; QString m_caption; std::vector m_tips; void readTips(); void showTip(); class TipFileParser : public QXmlDefaultHandler { public: TipFileParser(TipDialog *dialog); virtual ~TipFileParser(); void parse(QXmlInputSource &source); virtual bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes& atts); virtual bool characters(const QString &); virtual bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); bool error(const QXmlParseException &exception); bool fatalError(const QXmlParseException &exception); protected: TipDialog *m_dialog; bool m_inTip; bool m_inText; bool m_inHtml; }; }; #endif sonic-visualiser-3.0.3/svgui/widgets/TransformFinder.cpp0000644000000000000000000003304213111512442021550 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #include "TransformFinder.h" #include "base/XmlExportable.h" #include "transform/TransformFactory.h" #include "SelectableLabel.h" #include #include #include #include #include #include #include #include #include #include TransformFinder::TransformFinder(QWidget *parent) : QDialog(parent), m_resultsFrame(0), m_resultsLayout(0) { setWindowTitle(tr("Find a Transform")); QGridLayout *mainGrid = new QGridLayout; mainGrid->setVerticalSpacing(0); setLayout(mainGrid); mainGrid->addWidget(new QLabel(tr("Find:")), 0, 0); QLineEdit *searchField = new QLineEdit; mainGrid->addWidget(searchField, 0, 1); connect(searchField, SIGNAL(textChanged(const QString &)), this, SLOT(searchTextChanged(const QString &))); // m_infoLabel = new QLabel(tr("Type in this box to search descriptions of available and known transforms")); m_infoLabel = new QLabel; mainGrid->addWidget(m_infoLabel, 1, 1); m_resultsScroll = new QScrollArea; mainGrid->addWidget(m_resultsScroll, 2, 0, 1, 2); mainGrid->setRowStretch(2, 10); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); mainGrid->addWidget(bb, 3, 0, 1, 2); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); m_resultsFrame = new QWidget; QPalette palette = m_resultsFrame->palette(); palette.setColor(QPalette::Window, palette.color(QPalette::Base)); m_resultsFrame->setPalette(palette); m_resultsScroll->setPalette(palette); m_resultsLayout = new QVBoxLayout; m_resultsLayout->setSpacing(0); m_resultsLayout->setContentsMargins(0, 0, 0, 0); m_resultsFrame->setLayout(m_resultsLayout); m_resultsScroll->setWidget(m_resultsFrame); m_resultsFrame->show(); m_noResultsLabel = new QLabel(tr("
      No results found")); m_resultsLayout->addWidget(m_noResultsLabel); m_noResultsLabel->hide(); m_beforeSearchLabel = new QLabel; m_resultsLayout->addWidget(m_beforeSearchLabel); m_beforeSearchLabel->hide(); QAction *up = new QAction(tr("Up"), this); up->setShortcut(tr("Up")); connect(up, SIGNAL(triggered()), this, SLOT(up())); addAction(up); QAction *down = new QAction(tr("Down"), this); down->setShortcut(tr("Down")); connect(down, SIGNAL(triggered()), this, SLOT(down())); addAction(down); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() / 2; int height = available.height() / 2; if (height < 450) { if (available.height() > 500) height = 450; } if (width < 600) { if (available.width() > 650) width = 600; } resize(width, height); raise(); setupBeforeSearchLabel(); m_upToDateCount = 0; m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); m_timer->start(30); } TransformFinder::~TransformFinder() { } void TransformFinder::setupBeforeSearchLabel() { bool haveInstalled = TransformFactory::getInstance()->haveInstalledTransforms(); bool haveUninstalled = TransformFactory::getInstance()->haveUninstalledTransforms(); m_beforeSearchLabel->setWordWrap(true); m_beforeSearchLabel->setOpenExternalLinks(true); m_beforeSearchLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse); m_beforeSearchLabel->setMargin(12); m_beforeSearchLabel->setFixedWidth(this->width() - 40); QString base = tr("

    Type some text into the search box to search the descriptions of:

    "); QString nopull = tr("Unable to retrieve published descriptions from network!"); QString noinst = tr("No plugins are currently installed!"); if (haveInstalled) { if (haveUninstalled) { m_beforeSearchLabel->setText(base); } else { m_beforeSearchLabel->setText (base + tr("

    %1
    Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.
    Only the descriptions of installed plugins will be searched.").arg(nopull)); } } else { if (haveUninstalled) { m_beforeSearchLabel->setText (base + tr("

    %1
    Only the published descriptions of Vamp feature extraction plugins will be searched.").arg(noinst)); } else { m_beforeSearchLabel->setText (base + tr("

    %1
    %2
    Perhaps the network connection is down, or services are responding too slowly.
    No search results will be available.").arg(noinst).arg(nopull)); } } m_beforeSearchLabel->show(); m_resultsFrame->resize(m_resultsFrame->sizeHint()); } void TransformFinder::searchTextChanged(const QString &text) { // cerr << "text is " << text << endl; m_newSearchText = text; } void TransformFinder::timeout() { int maxResults = 60; if (m_newSearchText != "") { QString text = m_newSearchText; m_newSearchText = ""; QStringList keywords = text.split(' ', QString::SkipEmptyParts); TransformFactory::SearchResults results = TransformFactory::getInstance()->search(keywords); // cerr << results.size() << " result(s)..." << endl; std::set sorted; sorted.clear(); for (TransformFactory::SearchResults::const_iterator j = results.begin(); j != results.end(); ++j) { sorted.insert(j->second); } m_sortedResults.clear(); for (std::set::const_iterator j = sorted.end(); j != sorted.begin(); ) { --j; m_sortedResults.push_back(*j); if ((int)m_sortedResults.size() == maxResults) break; } if (m_sortedResults.empty()) m_selectedTransform = ""; else m_selectedTransform = m_sortedResults.begin()->key; m_upToDateCount = 0; for (int j = (int)m_labels.size(); j > (int)m_sortedResults.size(); ) { m_labels[--j]->hide(); } m_beforeSearchLabel->hide(); if (m_sortedResults.empty()) { m_noResultsLabel->show(); m_resultsFrame->resize(m_resultsFrame->sizeHint()); } else { m_noResultsLabel->hide(); } if (m_sortedResults.size() < sorted.size()) { m_infoLabel->setText (tr("Found %n description(s) containing %1, showing the first %2 only", 0, int(sorted.size())).arg(text).arg(m_sortedResults.size())); } else { m_infoLabel->setText (tr("Found %n description(s) containing %1", 0, int(sorted.size())).arg(text)); } return; } if (m_upToDateCount >= (int)m_sortedResults.size()) return; while (m_upToDateCount < (int)m_sortedResults.size()) { int i = m_upToDateCount; // cerr << "sorted size = " << m_sortedResults.size() << endl; TransformDescription desc; TransformId tid = m_sortedResults[i].key; TransformFactory *factory = TransformFactory::getInstance(); TransformFactory::TransformInstallStatus status = factory->getTransformInstallStatus(tid); QString suffix; if (status == TransformFactory::TransformInstalled) { desc = factory->getTransformDescription(tid); } else { desc = factory->getUninstalledTransformDescription(tid); suffix = tr(" (not installed)"); } QString labelText; labelText += tr("%1%2
    ") .arg(XmlExportable::encodeEntities(desc.name)) .arg(suffix); labelText += "..."; for (TextMatcher::Match::FragmentMap::const_iterator k = m_sortedResults[i].fragments.begin(); k != m_sortedResults[i].fragments.end(); ++k) { labelText += k->second; labelText += "... "; } labelText += tr(""); QString selectedText; selectedText += tr("%1%2
    ") .arg(XmlExportable::encodeEntities (desc.name == "" ? desc.identifier : desc.name)) .arg(suffix); if (desc.longDescription != "") { selectedText += tr("%1") .arg(XmlExportable::encodeEntities(desc.longDescription)); } else if (desc.description != "") { selectedText += tr("%1") .arg(XmlExportable::encodeEntities(desc.description)); } selectedText += tr(""); if (desc.type != TransformDescription::UnknownType) { selectedText += tr("
          — Plugin type: %1") .arg(XmlExportable::encodeEntities(factory->getTransformTypeName(desc.type))); } if (desc.category != "") { selectedText += tr("
          — Category: %1") .arg(XmlExportable::encodeEntities(desc.category)); } selectedText += tr("
          — System identifier: %1") .arg(XmlExportable::encodeEntities(desc.identifier)); if (desc.infoUrl != "") { selectedText += tr("
          — More information: %1") .arg(desc.infoUrl); } selectedText += tr("
    "); if (i >= (int)m_labels.size()) { SelectableLabel *label = new SelectableLabel(m_resultsFrame); m_resultsLayout->addWidget(label); connect(label, SIGNAL(selectionChanged()), this, SLOT(selectedLabelChanged())); connect(label, SIGNAL(doubleClicked()), this, SLOT(labelDoubleClicked())); QPalette palette = label->palette(); label->setPalette(palette); m_labels.push_back(label); } m_labels[i]->setObjectName(desc.identifier); m_labels[i]->setFixedWidth(this->width() - 40); m_labels[i]->setUnselectedText(labelText); // cerr << "selected text: " << selectedText << endl; m_labels[i]->setSelectedText(selectedText); m_labels[i]->setSelected(m_selectedTransform == desc.identifier); if (!m_labels[i]->isVisible()) m_labels[i]->show(); ++m_upToDateCount; if (i == 0) break; } m_resultsFrame->resize(m_resultsFrame->sizeHint()); } void TransformFinder::selectedLabelChanged() { QObject *s = sender(); m_selectedTransform = ""; for (int i = 0; i < (int)m_labels.size(); ++i) { if (!m_labels[i]->isVisible()) continue; if (m_labels[i] == s) { if (m_labels[i]->isSelected()) { m_selectedTransform = m_labels[i]->objectName(); } } else { if (m_labels[i]->isSelected()) { m_labels[i]->setSelected(false); } } } cerr << "selectedLabelChanged: selected transform is now \"" << m_selectedTransform << "\"" << endl; } void TransformFinder::labelDoubleClicked() { // The first click should have selected the label already if (TransformFactory::getInstance()->getTransformInstallStatus (m_selectedTransform) == TransformFactory::TransformInstalled) { accept(); } } TransformId TransformFinder::getTransform() const { return m_selectedTransform; } void TransformFinder::up() { for (int i = 0; i < (int)m_labels.size(); ++i) { if (!m_labels[i]->isVisible()) continue; if (m_labels[i]->objectName() == m_selectedTransform) { if (i > 0) { m_labels[i]->setSelected(false); m_labels[i-1]->setSelected(true); m_selectedTransform = m_labels[i-1]->objectName(); } return; } } } void TransformFinder::down() { for (int i = 0; i < (int)m_labels.size(); ++i) { if (!m_labels[i]->isVisible()) continue; if (m_labels[i]->objectName() == m_selectedTransform) { if (i+1 < (int)m_labels.size() && m_labels[i+1]->isVisible()) { m_labels[i]->setSelected(false); m_labels[i+1]->setSelected(true); m_selectedTransform = m_labels[i+1]->objectName(); } return; } } } sonic-visualiser-3.0.3/svgui/widgets/TransformFinder.h0000644000000000000000000000326613111512442021222 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. 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. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_FINDER_H_ #define _TRANSFORM_FINDER_H_ #include #include #include "transform/Transform.h" #include "transform/TransformFactory.h" class QVBoxLayout; class QScrollArea; class QLabel; class SelectableLabel; class QWidget; class QTimer; class TransformFinder : public QDialog { Q_OBJECT public: TransformFinder(QWidget *parent = 0); ~TransformFinder(); TransformId getTransform() const; protected slots: void searchTextChanged(const QString &); void selectedLabelChanged(); void labelDoubleClicked(); void timeout(); void up(); void down(); protected: QLabel *m_infoLabel; QLabel *m_beforeSearchLabel; QLabel *m_noResultsLabel; QScrollArea *m_resultsScroll; QWidget *m_resultsFrame; QVBoxLayout *m_resultsLayout; std::vector m_labels; TransformId m_selectedTransform; QTimer *m_timer; void setupBeforeSearchLabel(); QString m_newSearchText; typedef std::vector SortedResults; SortedResults m_sortedResults; int m_upToDateCount; }; #endif sonic-visualiser-3.0.3/svgui/widgets/UnitConverter.cpp0000644000000000000000000002406313111512442021257 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #include "UnitConverter.h" #include #include #include #include #include #include #include #include "base/Debug.h" #include "base/Pitch.h" #include "base/Preferences.h" using namespace std; static QString pianoNotes[] = { "C", "C# / Db", "D", "D# / Eb", "E", "F", "F# / Gb", "G", "G# / Ab", "A", "A# / Bb", "B" }; UnitConverter::UnitConverter(QWidget *parent) : QDialog(parent) { QGridLayout *maingrid = new QGridLayout; setLayout(maingrid); QTabWidget *tabs = new QTabWidget; maingrid->addWidget(tabs, 0, 0); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); maingrid->addWidget(bb, 1, 0); connect(bb, SIGNAL(rejected()), this, SLOT(close())); QFrame *frame = new QFrame; tabs->addTab(frame, tr("Pitch")); QGridLayout *grid = new QGridLayout; frame->setLayout(grid); m_freq = new QDoubleSpinBox; m_freq->setSuffix(QString(" Hz")); m_freq->setDecimals(6); m_freq->setMinimum(1e-3); m_freq->setMaximum(1e6); m_freq->setValue(440); connect(m_freq, SIGNAL(valueChanged(double)), this, SLOT(freqChanged())); // The min and max range values for all the remaining controls are // determined by the min and max Hz above m_midi = new QSpinBox; m_midi->setMinimum(-156); m_midi->setMaximum(203); connect(m_midi, SIGNAL(valueChanged(int)), this, SLOT(midiChanged())); m_note = new QComboBox; for (int i = 0; i < 12; ++i) { m_note->addItem(pianoNotes[i]); } connect(m_note, SIGNAL(currentIndexChanged(int)), this, SLOT(noteChanged())); m_octave = new QSpinBox; m_octave->setMinimum(-14); m_octave->setMaximum(15); connect(m_octave, SIGNAL(valueChanged(int)), this, SLOT(octaveChanged())); m_cents = new QDoubleSpinBox; m_cents->setSuffix(tr(" cents")); m_cents->setDecimals(4); m_cents->setMinimum(-50); m_cents->setMaximum(50); connect(m_cents, SIGNAL(valueChanged(double)), this, SLOT(centsChanged())); int row = 0; grid->addWidget(new QLabel(tr("In 12-tone Equal Temperament:")), row, 0, 1, 9); ++row; grid->setRowMinimumHeight(row, 8); ++row; grid->addWidget(m_freq, row, 0, 2, 1, Qt::AlignRight | Qt::AlignVCenter); grid->addWidget(new QLabel(tr("=")), row, 1, 2, 1, Qt::AlignHCenter | Qt::AlignVCenter); grid->addWidget(new QLabel(tr("+")), row, 7, 2, 1, Qt::AlignHCenter | Qt::AlignVCenter); grid->addWidget(m_cents, row, 8, 2, 1, Qt::AlignLeft | Qt::AlignVCenter); grid->addWidget(new QLabel(tr("Piano note")), row, 2, 1, 2); grid->addWidget(m_note, row, 4); grid->addWidget(new QLabel(tr("in octave")), row, 5); grid->addWidget(m_octave, row, 6); ++row; grid->addWidget(new QLabel(tr("MIDI pitch")), row, 2, 1, 2); grid->addWidget(m_midi, row, 4); ++row; grid->setRowStretch(row, 20); grid->setRowMinimumHeight(row, 8); ++row; m_pitchPrefsLabel = new QLabel; grid->addWidget(m_pitchPrefsLabel, row, 0, 1, 9); ++row; grid->addWidget (new QLabel(tr("Note that only pitches in the range 0 to 127 are valid " "in the MIDI protocol.")), row, 0, 1, 9); ++row; frame = new QFrame; tabs->addTab(frame, tr("Tempo")); grid = new QGridLayout; frame->setLayout(grid); m_samples = new QDoubleSpinBox; m_samples->setSuffix(QString(" samples")); m_samples->setDecimals(2); m_samples->setMinimum(1); m_samples->setMaximum(1e8); m_samples->setValue(22050); connect(m_samples, SIGNAL(valueChanged(double)), this, SLOT(samplesChanged())); m_period = new QDoubleSpinBox; m_period->setSuffix(QString(" ms")); m_period->setDecimals(4); m_period->setMinimum(1e-3); m_period->setMaximum(100000); m_period->setValue(500); connect(m_period, SIGNAL(valueChanged(double)), this, SLOT(periodChanged())); m_bpm = new QDoubleSpinBox; m_bpm->setSuffix(QString(" bpm")); m_bpm->setDecimals(4); m_bpm->setMinimum(0.1); m_bpm->setMaximum(1e6); m_bpm->setValue(120); connect(m_bpm, SIGNAL(valueChanged(double)), this, SLOT(bpmChanged())); m_tempofreq = new QDoubleSpinBox; m_tempofreq->setSuffix(QString(" beats/sec")); m_tempofreq->setDecimals(4); m_tempofreq->setMinimum(1e-3); m_tempofreq->setMaximum(1e5); m_tempofreq->setValue(0.5); connect(m_tempofreq, SIGNAL(valueChanged(double)), this, SLOT(tempofreqChanged())); m_samplerate = new QComboBox; QList rates; rates << 8000; for (int i = 1; i <= 16; i *= 2) { rates << 11025 * i << 12000 * i; } foreach (int r, rates) { m_samplerate->addItem(QString("%1 Hz").arg(r)); } connect(m_samplerate, SIGNAL(currentIndexChanged(int)), this, SLOT(samplerateChanged())); m_samplerate->setCurrentText("44100 Hz"); connect(Preferences::getInstance(), SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); row = 0; grid->setRowStretch(row, 20); grid->setRowMinimumHeight(row, 8); ++row; grid->addWidget(new QLabel(tr("Beat period")), row, 0, 2, 1, Qt::AlignVCenter); grid->addWidget(m_period, row, 1); grid->addWidget(new QLabel(tr("=")), row, 2, 2, 1, Qt::AlignVCenter); grid->addWidget(m_tempofreq, row, 3); grid->addWidget(new QLabel(tr("at")), row, 4, 2, 1, Qt::AlignVCenter); grid->addWidget(m_samplerate, row, 5, 2, 1, Qt::AlignVCenter); ++row; grid->addWidget(m_samples, row, 1); grid->addWidget(m_bpm, row, 3); ++row; grid->setRowStretch(row, 20); grid->setRowMinimumHeight(row, 8); updatePitchesFromFreq(); updatePitchPrefsLabel(); updateTempiFromSamples(); } UnitConverter::~UnitConverter() { } void UnitConverter::setTo(QSpinBox *box, int value) { box->blockSignals(true); if (value < box->minimum() || value > box->maximum()) { QPalette p; p.setColor(QPalette::Text, Qt::red); box->setPalette(p); } else { box->setPalette(QPalette()); } box->setValue(value); box->blockSignals(false); } void UnitConverter::setTo(QDoubleSpinBox *box, double value) { box->blockSignals(true); if (value < box->minimum() || value > box->maximum()) { QPalette p; p.setColor(QPalette::Text, Qt::red); box->setPalette(p); } else { box->setPalette(QPalette()); } box->setValue(value); box->blockSignals(false); } void UnitConverter::preferenceChanged(PropertyContainer::PropertyName) { updatePitchesFromFreq(); updatePitchPrefsLabel(); } void UnitConverter::updatePitchPrefsLabel() { m_pitchPrefsLabel->setText (tr("With concert-A tuning frequency at %1 Hz, and " "middle C residing in octave %2.\n" "(These can be changed in the application preferences.)") .arg(Preferences::getInstance()->getTuningFrequency()) .arg(Preferences::getInstance()->getOctaveOfMiddleC())); } void UnitConverter::freqChanged() { updatePitchesFromFreq(); } void UnitConverter::midiChanged() { double freq = Pitch::getFrequencyForPitch(m_midi->value(), m_cents->value()); m_freq->setValue(freq); } void UnitConverter::noteChanged() { int pitch = Pitch::getPitchForNoteAndOctave(m_note->currentIndex(), m_octave->value()); double freq = Pitch::getFrequencyForPitch(pitch, m_cents->value()); m_freq->setValue(freq); } void UnitConverter::octaveChanged() { int pitch = Pitch::getPitchForNoteAndOctave(m_note->currentIndex(), m_octave->value()); double freq = Pitch::getFrequencyForPitch(pitch, m_cents->value()); m_freq->setValue(freq); } void UnitConverter::centsChanged() { double freq = Pitch::getFrequencyForPitch(m_midi->value(), m_cents->value()); m_freq->setValue(freq); } void UnitConverter::updatePitchesFromFreq() { double cents = 0; int pitch = Pitch::getPitchForFrequency(m_freq->value(), ¢s); int note, octave; Pitch::getNoteAndOctaveForPitch(pitch, note, octave); // cerr << "pitch " << pitch << " note " << note << " octave " << octave << " cents " << cents << endl; setTo(m_midi, pitch); setTo(m_cents, cents); setTo(m_octave, octave); m_note->blockSignals(true); m_note->setCurrentIndex(note); m_note->blockSignals(false); } void UnitConverter::samplesChanged() { updateTempiFromSamples(); } void UnitConverter::periodChanged() { double rate = getSampleRate(); double sec = m_period->value() / 1000.0; double samples = rate * sec; m_samples->setValue(samples); } void UnitConverter::bpmChanged() { double rate = getSampleRate(); double sec = 60.0 / m_bpm->value(); double samples = rate * sec; m_samples->setValue(samples); } void UnitConverter::tempofreqChanged() { double rate = getSampleRate(); double samples = rate / m_tempofreq->value(); m_samples->setValue(samples); } void UnitConverter::samplerateChanged() { // Preserve the beat period in seconds, here, not in samples periodChanged(); } double UnitConverter::getSampleRate() { return double(atoi(m_samplerate->currentText().toLocal8Bit().data())); } void UnitConverter::updateTempiFromSamples() { double samples = m_samples->value(); double rate = getSampleRate(); // cerr << samples << " samples at rate " << rate << endl; double sec = samples / rate; double hz = rate / samples; double bpm = 60.0 / sec; setTo(m_bpm, bpm); setTo(m_period, sec * 1000.0); setTo(m_tempofreq, hz); } sonic-visualiser-3.0.3/svgui/widgets/UnitConverter.h0000644000000000000000000000333013111512442020716 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef UNIT_CONVERTER_H #define UNIT_CONVERTER_H #include #include "base/PropertyContainer.h" class QSpinBox; class QDoubleSpinBox; class QComboBox; class QLabel; class UnitConverter : public QDialog { Q_OBJECT public: UnitConverter(QWidget *parent = 0); virtual ~UnitConverter(); private slots: void freqChanged(); void midiChanged(); void noteChanged(); void octaveChanged(); void centsChanged(); void samplesChanged(); void periodChanged(); void bpmChanged(); void tempofreqChanged(); void samplerateChanged(); void preferenceChanged(PropertyContainer::PropertyName); private: QDoubleSpinBox *m_freq; QSpinBox *m_midi; QComboBox *m_note; QSpinBox *m_octave; QDoubleSpinBox *m_cents; QLabel *m_pitchPrefsLabel; void updatePitchesFromFreq(); void updatePitchPrefsLabel(); QDoubleSpinBox *m_samples; QDoubleSpinBox *m_period; QDoubleSpinBox *m_bpm; QDoubleSpinBox *m_tempofreq; QComboBox *m_samplerate; void updateTempiFromSamples(); double getSampleRate(); void setTo(QSpinBox *, int); void setTo(QDoubleSpinBox *, double); }; #endif sonic-visualiser-3.0.3/svgui/widgets/WidgetScale.h0000644000000000000000000000331613111512442020306 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. 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. See the file COPYING included with this distribution for more information. */ #ifndef SV_WIDGET_SCALE_H #define SV_WIDGET_SCALE_H #include #include #include "base/Debug.h" class WidgetScale { public: /** * Take a "design pixel" size and scale it for the actual * display. This is relevant to hi-dpi systems that do not do * pixel doubling (i.e. Windows and Linux rather than OS/X). */ static int scalePixelSize(int pixels) { static double ratio = 0.0; if (ratio == 0.0) { double baseEm; #ifdef Q_OS_MAC baseEm = 17.0; #else baseEm = 15.0; #endif double em = QFontMetrics(QFont()).height(); ratio = em / baseEm; SVDEBUG << "WidgetScale::scalePixelSize: baseEm = " << baseEm << ", platform default font height = " << em << ", resulting scale factor = " << ratio << endl; } int scaled = int(pixels * ratio + 0.5); if (pixels != 0 && scaled == 0) scaled = 1; return scaled; } static QSize scaleQSize(QSize size) { return QSize(scalePixelSize(size.width()), scalePixelSize(size.height())); } }; #endif sonic-visualiser-3.0.3/svgui/widgets/WindowShapePreview.cpp0000644000000000000000000001363613111512442022246 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "WindowShapePreview.h" #include #include #include #include #include #include #include #include #include #include using namespace std; WindowShapePreview::WindowShapePreview(QWidget *parent) : QFrame(parent), m_windowType(HanningWindow) { QHBoxLayout *layout = new QHBoxLayout; layout->setMargin(0); setLayout(layout); m_windowTimeExampleLabel = new QLabel; m_windowFreqExampleLabel = new QLabel; layout->addWidget(m_windowTimeExampleLabel); layout->addWidget(m_windowFreqExampleLabel); } WindowShapePreview::~WindowShapePreview() { } void WindowShapePreview::updateLabels() { float scaleRatio = float(QFontMetrics(font()).height()) / 14.f; if (scaleRatio < 1.f) scaleRatio = 1.f; int step = int(24 * scaleRatio); float peak = float(48 * scaleRatio); int w = step * 4, h = int((peak * 4) / 3); WindowType type = m_windowType; Window windower = Window(type, step * 2); QPixmap timeLabel(w, h + 1); timeLabel.fill(Qt::white); QPainter timePainter(&timeLabel); QPainterPath path; path.moveTo(0, float(h) - peak + 1); path.lineTo(w, float(h) - peak + 1); timePainter.setPen(Qt::gray); timePainter.setRenderHint(QPainter::Antialiasing, true); timePainter.drawPath(path); path = QPainterPath(); float *acc = new float[w]; for (int i = 0; i < w; ++i) acc[i] = 0.f; for (int j = 0; j < 3; ++j) { for (int i = 0; i < step * 2; ++i) { acc[j * step + i] += windower.getValue(i); } } for (int i = 0; i < w; ++i) { int y = h - int(peak * acc[i] + 0.001f) + 1; if (i == 0) path.moveTo(i, y); else path.lineTo(i, y); } delete[] acc; timePainter.drawPath(path); timePainter.setRenderHint(QPainter::Antialiasing, false); path = QPainterPath(); timePainter.setPen(Qt::black); for (int i = 0; i < step * 2; ++i) { int y = h - int(peak * windower.getValue(i) + 0.001) + 1; if (i == 0) path.moveTo(i + step, float(y)); else path.lineTo(i + step, float(y)); } if (type == RectangularWindow) { timePainter.drawPath(path); path = QPainterPath(); } timePainter.setRenderHint(QPainter::Antialiasing, true); path.addRect(0, 0, w, h + 1); timePainter.drawPath(path); QFont font; font.setPixelSize(int(10 * scaleRatio)); font.setItalic(true); timePainter.setFont(font); QString label = tr("V / time"); timePainter.drawText(w - timePainter.fontMetrics().width(label) - 4, timePainter.fontMetrics().ascent() + 1, label); m_windowTimeExampleLabel->setPixmap(timeLabel); QPixmap freqLabel(w, h + 1); freqLabel.fill(Qt::white); QPainter freqPainter(&freqLabel); path = QPainterPath(); int fftsize = 512; breakfastquay::FFT fft(fftsize); vector input(fftsize); vector> output(fftsize/2 + 1); for (int i = 0; i < fftsize; ++i) input[i] = 0.f; for (int i = 0; i < step * 2; ++i) { input[fftsize/2 - step + i] = windower.getValue(i); } fft.forwardInterleaved(input.data(), reinterpret_cast(output.data())); float maxdb = 0.f; float mindb = 0.f; bool first = true; for (int i = 0; i < fftsize/2; ++i) { float power = output[i].real() * output[i].real() + output[i].imag() * output[i].imag(); float db = mindb; if (power > 0) { db = 20.f * log10f(power); if (first || db > maxdb) maxdb = db; if (first || db < mindb) mindb = db; first = false; } } if (mindb > -80.f) mindb = -80.f; // -- no, don't use the actual mindb -- it's easier to compare // plots with a fixed min value mindb = -170.f; float maxval = maxdb + -mindb; // float ly = h - ((-80.f + -mindb) / maxval) * peak + 1; path.moveTo(0, float(h) - peak + 1); path.lineTo(w, float(h) - peak + 1); freqPainter.setPen(Qt::gray); freqPainter.setRenderHint(QPainter::Antialiasing, true); freqPainter.drawPath(path); path = QPainterPath(); freqPainter.setPen(Qt::black); // cerr << "maxdb = " << maxdb << ", mindb = " << mindb << ", maxval = " <setPixmap(freqLabel); } void WindowShapePreview::setWindowType(WindowType type) { m_windowType = type; updateLabels(); } sonic-visualiser-3.0.3/svgui/widgets/WindowShapePreview.h0000644000000000000000000000210213111512442021675 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _WINDOW_SHAPE_PREVIEW_H_ #define _WINDOW_SHAPE_PREVIEW_H_ #include #include "base/Window.h" class QLabel; class WindowShapePreview : public QFrame { Q_OBJECT public: WindowShapePreview(QWidget *parent = 0); virtual ~WindowShapePreview(); public slots: void setWindowType(WindowType type); protected: QLabel *m_windowTimeExampleLabel; QLabel *m_windowFreqExampleLabel; WindowType m_windowType; void updateLabels(); }; #endif sonic-visualiser-3.0.3/svgui/widgets/WindowTypeSelector.cpp0000644000000000000000000000626013111512442022261 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #include "WindowTypeSelector.h" #include "WindowShapePreview.h" #include #include #include "base/Preferences.h" WindowTypeSelector::WindowTypeSelector(WindowType defaultType) { init(defaultType); } WindowTypeSelector::WindowTypeSelector() { Preferences *prefs = Preferences::getInstance(); int min = 0, max = 0, deflt = 0; WindowType type = WindowType(prefs->getPropertyRangeAndValue("Window Type", &min, &max, &deflt)); init(type); } void WindowTypeSelector::init(WindowType defaultType) { QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); setLayout(layout); // The WindowType enum is in rather a ragbag order -- reorder it here // in a more sensible order m_windows = new WindowType[9]; m_windows[0] = HanningWindow; m_windows[1] = HammingWindow; m_windows[2] = BlackmanWindow; m_windows[3] = BlackmanHarrisWindow; m_windows[4] = NuttallWindow; m_windows[5] = GaussianWindow; m_windows[6] = ParzenWindow; m_windows[7] = BartlettWindow; m_windows[8] = RectangularWindow; Preferences *prefs = Preferences::getInstance(); m_windowShape = new WindowShapePreview; m_windowCombo = new QComboBox; int window = int(defaultType); int index = 0; for (int i = 0; i <= 8; ++i) { m_windowCombo->addItem(prefs->getPropertyValueLabel("Window Type", m_windows[i])); if (m_windows[i] == window) index = i; } m_windowCombo->setCurrentIndex(index); layout->addWidget(m_windowShape); layout->addWidget(m_windowCombo); connect(m_windowCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(windowIndexChanged(int))); m_windowType = defaultType; m_windowShape->setWindowType(m_windowType); } WindowTypeSelector::~WindowTypeSelector() { delete[] m_windows; } WindowType WindowTypeSelector::getWindowType() const { return m_windowType; } void WindowTypeSelector::setWindowType(WindowType type) { if (type == m_windowType) return; int index; for (index = 0; index <= 8; ++index) { if (m_windows[index] == type) break; } if (index <= 8) m_windowCombo->setCurrentIndex(index); m_windowType = type; m_windowShape->setWindowType(m_windowType); } void WindowTypeSelector::windowIndexChanged(int index) { WindowType type = m_windows[index]; if (type == m_windowType) return; m_windowType = type; m_windowShape->setWindowType(m_windowType); emit windowTypeChanged(type); } sonic-visualiser-3.0.3/svgui/widgets/WindowTypeSelector.h0000644000000000000000000000251713111512442021727 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. 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. See the file COPYING included with this distribution for more information. */ #ifndef _WINDOW_TYPE_SELECTOR_H_ #define _WINDOW_TYPE_SELECTOR_H_ #include #include "base/Window.h" class WindowShapePreview; class QComboBox; class WindowTypeSelector : public QFrame { Q_OBJECT public: WindowTypeSelector(WindowType defaultType); WindowTypeSelector(); // get window type from preferences virtual ~WindowTypeSelector(); WindowType getWindowType() const; signals: void windowTypeChanged(WindowType type); public slots: void setWindowType(WindowType type); protected slots: void windowIndexChanged(int index); protected: QComboBox *m_windowCombo; WindowShapePreview *m_windowShape; WindowType *m_windows; WindowType m_windowType; void init(WindowType type); }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/.hgignore0000644000000000000000000000061413111512442017756 0ustar 00000000000000syntax: glob doc/ *.o autom4te* *.m4 *.a *.so *.orig *~ host/vamp-simple-host rdf/generator/vamp-rdf-template-generator config.log config.status Makefile *.dll *.exe re:^build/Debug/ re:^build/Release/ *.zip build/UpgradeLog* *.suo *.user *.sdf *.filters re:^build/_UpgradeReport_Files/ *.ipch *.opensdf re:^build/x64/Debug/ re:^build/x64/Release/ test/obtained test/failures *.VC.db *.VC.opendb sonic-visualiser-3.0.3/vamp-plugin-sdk/.hgtags0000644000000000000000000000401413111512442017427 0ustar 00000000000000003147fdf42c0688992e9e07bfd3ca7e6d1ace10 vamp-plugin-sdk-v2.2 036db77506f732caf1d058b5f61f89cb7c69b177 vamp-plugin-sdk-v1.1b 120f8888034735fc9ba91a073ca9e63467c5c8ae vamp-plugin-sdk-v1.3 1da43924fa143ba841d37a435c9185b9dbc2976a vamp-plugin-sdk-v1.2 2403ae53b8a54ca15993502ceae0649514a48821 vamp-plugin-sdk-v1.0pre1 4412c619b3739fb6567604fb56f0edd15c824627 vamp-plugin-sdk-v0.9rc2 6bf198e06d721fe081866ce07efbce4341a953c7 vamp-plugin-sdk-v1.1 7d678f889789e2244332acf1f23c94fc4b0ed685 vamp-plugin-sdk-v2.0pre1 9dc3a5e17600052d3e5e7c55e90b24b50727ce70 vamp-plugin-sdk-v2.0pre2 ba5f87117b676dd0897783b1cf2b2db933472f2c vamp-plugin-sdk-v1.1pre1 bb67b61458122dd202e8573ae34cb6ef171e1476 vamp-plugin-sdk-v2.1 ca1309b937b6b79bd07a53920e3309edf3ac2e04 vamp-plugin-sdk-v0.9rc1 ce61ad9b9159b00a8d7a3dd468c34ac2bf474328 1.0 de3e865f92c879fb8b247ab97e15f789a324170a vamp-plugin-sdk-v2.0 2351610cd3b0e8dfb762f94a9b264b61d82967bb vamp-plugin-sdk-v2.2.1 71b69f569f5204f8409ba0c735855a61eb6d0841 vamp-plugin-sdk-v2.3 71b69f569f5204f8409ba0c735855a61eb6d0841 vamp-plugin-sdk-v2.3 2c546a899eec72623c8f2333136f230f0302ca5f vamp-plugin-sdk-v2.3 2c546a899eec72623c8f2333136f230f0302ca5f vamp-plugin-sdk-v2.3 ef1dc9963638adc84bda46d4aa31b99f3229a892 vamp-plugin-sdk-v2.3 ef1dc9963638adc84bda46d4aa31b99f3229a892 vamp-plugin-sdk-v2.3 8cab5a0198d64ee606727e5f8a0683c44a55f432 vamp-plugin-sdk-v2.3 393885d7ea72d6678ea7973363cf38623fa829f5 vamp-plugin-sdk-v2.4 92b1fbb1cc878a60a3dfd4aa036e938767705b3a vamp-plugin-sdk-v2.5 b7268e8bd292718c809ee2c3963379e82c7e8a6f vamp-plugin-sdk-v2.6 b7268e8bd292718c809ee2c3963379e82c7e8a6f vamp-plugin-sdk-v2.6 32e38d394dc6ab3b81069f4092fb6a15087fed04 vamp-plugin-sdk-v2.6 32e38d394dc6ab3b81069f4092fb6a15087fed04 vamp-plugin-sdk-v2.6 5628c5ec4000b29160f5e7bb41c5fa92fb2183f6 vamp-plugin-sdk-v2.6 124752918a1b68b4de1294970b8d584a994da855 vamp-plugin-sdk-v2.7 25e023bad200ec8882d5ec331c9675f396d32841 vamp-plugin-sdk-v2.7.1 25e023bad200ec8882d5ec331c9675f396d32841 vamp-plugin-sdk-v2.7.1 2dbb3f920abc96cc198058cdf3db8bd0d51e381e vamp-plugin-sdk-v2.7.1 sonic-visualiser-3.0.3/vamp-plugin-sdk/.travis.yml0000644000000000000000000000067313111512442020271 0ustar 00000000000000dist: - trusty language: - cpp sudo: - false os: - linux - osx addons: apt: packages: - libsndfile-dev before_install: - ( cd ../ ; hg clone https://code.soundsoftware.ac.uk/hg/vamp-test-plugin ) - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew install libsndfile ; fi script: - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then make -f build/Makefile.osx test ; else ./test/run-test-plugin-regression.sh ; fi sonic-visualiser-3.0.3/vamp-plugin-sdk/CHANGELOG0000644000000000000000000001355113111512442017371 0ustar 00000000000000 Version 2.7.1, 2017-03-06 (maintenance release) * Fix inclusion mechanism for FFTs which could cause a host application to crash in certain circumstances due to conflicting versions of C-linkage symbols Version 2.7, 2017-02-24 (maintenance and minor feature release) * Add ability to PluginLoader to list plugins only in (or not in) certain library files * Fix fixed-sample-rate output timestamps in printout from the simple host, and add regression test script using test plugin * Switch the convenience FFT interface for plugin usage from the very slow reference implementation previously provided, to the somewhat faster KissFFT * Add a top-secret compiler flag to switch internal FFTs to single- precision only * Fix some small but long-standing memory leaks and minor bugs Version 2.6, 2015-06-16 (maintenance and minor feature release) * Add a simple C-linkage API for plugin library discovery and loading -- the missing part when trying to use Vamp plugins from C or a language with only C-linkage foreign-function interface * Fix bug in PluginBufferingAdapter reset() function, which failed to reset timestamp rewrites (symptom: timestamps appeared to continue to ascend from end point on next run after a reset) * Fix sometime 1-sample rounding error in PluginInputDomainAdapter * Update build files for more recent OS versions * Add -L option to simple host, as synonym for --list-full * Add a combined Visual C++ solution that includes the plugin SDK, host SDK, example plugins, and simple host projects Version 2.5, 2013-05-08 (maintenance release): * Fix incorrect handling of FixedSampleRate outputs in the PluginBufferingAdapter. Un-timestamped features on these outputs were incorrectly being timestamped from the process timestamp, where they should have been timed relative to the previous feature on the output according to the output's sample rate. * Fix return of uninitialised memory through getCurrentProgram when plugin specifies no programs * Ensure output sample rate is initialised (to 0) for variable-rate outputs where the plugin forgets to set a rate Version 2.4, 2012-07-12 (maintenance and minor feature release): * Provide a simple FFT implementation as a convenience for plugins * Add symbols to make the library versions discoverable by autoconf using C linkage * Fix failure to open plugins from Unicode builds on Windows (thanks RJ Ryan) * Fix thread-safety issue in PluginInputDomainAdapter * Add build for OS/X 10.7+/Xcode 4; remove build for OpenSolaris Version 2.3, 2011-09-28 (minor feature release): * Add window type property to PluginInputDomainAdapter * Permit vamp-simple-host to use streaming input with indeterminate length (thanks Dan Stowell) * Print label as well as values from vamp-simple-host (thanks Dan) Version 2.2.1, 2011-04-05 (maintenance release): * Minor build fixes for OS/X Version 2.2, 2010-08-26 (maintenance release): * Fixes to OS/X build procedures so as to build three-way universal binaries (PPC, i386, x86_64) by default. Forced upon us by OS/X 10.6 defaulting to 64-bit rather than 32-bit Version 2.1, 2009-09-22 (maintenance and minor feature release): * Add ProcessTimestampMethod to PluginInputDomainAdapter, offering the ability to decide how data buffering and timestamping works for frequency-domain plugins (whose process timestamps have to be at the centre of each processing block rather than the start) * Make PluginBufferingAdapter take into account any timestamp shift introduced by a PluginInputDomainAdapter that it wraps * Fix crash in PluginAdapter when plugin library getDescriptor fails on plugin construction * Add plugin skeleton files as starting point for new developers Version 2.0, 2008-12-08 (major release): * Feature structure now has an optional duration (plugin API change) * Libraries reorganised into separate include and src directories for plugin and host SDKs; hosts should no longer include from vamp-sdk/ but always from vamp-hostsdk/ instead (host source compatibility change) * OutputDescriptor now declares whether its features will have duration * Vamp RDF ontology now included for providing online (out-of-plugin) descriptions of plugins; program to generate skeleton RDF for a plugin set is included, and RDF for example plugins provided * New PluginSummarisingAdapter providing averages, min/max, count etc of returned features on request * New example plugins: Fixed Tempo Estimator and Power Spectrum * Command-line host now has a complete listing option, to print out all data reported by plugins * More complete Visual Studio project support Version 1.3, 2008-07-09 (maintenance release): * PluginBufferingAdapter has several important fixes to bugs that could cause incorrect timings or output descriptors to be returned * Conversion between real-time and frames has been improved to avoid rounding error in round-trip calculations * Plugin lookup no longer relies on non-portable DT_REG * The SDK now compiles with gcc 4.3 Version 1.2, 2008-02-28 (feature release): * New PluginBufferingAdapter, which hosts may use to avoid having to negotiate the plugin's preferred input step and block sizes Version 1.1, 2007-08-24 (feature release): * New Vamp::HostExt namespace * PluginLoader class, which handles enumeration, loading and category management for plugins on the local system * PluginInputDomainAdapter, which provides the capability for a host to support frequency-domain plugins without needing to worry about domain conversion * PluginChannelAdapter, which transparently deals with plugins that expect different numbers of audio channels from the number available * Minor beauty-and-truth updates and documentation fixes Version 1.0, 2007-03-21: * First official release sonic-visualiser-3.0.3/vamp-plugin-sdk/COPYING0000644000000000000000000000612113111512442017205 0ustar 00000000000000 Vamp Plugin SDK Copyright (c) 2005-2006 Chris Cannam Copyright (c) 2006-2017 Queen Mary, University of London Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. The KissFFT code in src/vamp-sdk/ext is distributed under the following licence: Copyright (c) 2003-2010 Mark Borgerding 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 author nor the names of any 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 OWNER 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. sonic-visualiser-3.0.3/vamp-plugin-sdk/INSTALL0000644000000000000000000000057513111512442017212 0ustar 00000000000000 Compiling and Installing the SDK and Examples ============================================= * Windows with Visual C++: Please read build/README.msvc * Mac OS/X: Please read build/README.osx * Linux: Please read build/README.linux * Windows cross-compiling from Linux: Try build/Makefile.mingw32 See the README file in this directory for more information about this SDK. sonic-visualiser-3.0.3/vamp-plugin-sdk/Makefile.in0000644000000000000000000004352213111512442020225 0ustar 00000000000000 # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. APIDIR = vamp SDKDIR = vamp-sdk HOSTSDKDIR = vamp-hostsdk SRCDIR = src SDKSRCDIR = src/vamp-sdk HOSTSDKSRCDIR = src/vamp-hostsdk EXAMPLEDIR = examples HOSTDIR = host PCDIR = pkgconfig LADIR = build RDFGENDIR = rdf/generator ### ### Start of user-serviceable parts ### # Default build target (or use "make " to select one). # Targets are: # all -- build everything # sdk -- build all the Vamp SDK libraries for plugins and hosts # sdkstatic -- build only the static versions of the SDK libraries # plugins -- build the example plugins (and the SDK if required) # host -- build the simple Vamp plugin host (and the SDK if required) # rdfgen -- build the RDF template generator (and the SDK if required) # test -- build the host and example plugins, and run a quick test # clean -- remove binary targets # distclean -- remove all targets # default: @TARGETS@ # Compile flags # CC = @CC@ CXX = @CXX@ CFLAGS = @CFLAGS@ CXXFLAGS = -I. @CXXFLAGS@ @SNDFILE_CFLAGS@ # ar, ranlib # AR = ar RANLIB = ranlib # Libraries required for the plugins. # PLUGIN_LIBS = ./libvamp-sdk.a # File extension for a dynamically loadable object # PLUGIN_EXT = .so #PLUGIN_EXT = .dll #PLUGIN_EXT = .dylib # Libraries required for the host. # HOST_LIBS = ./libvamp-hostsdk.a @SNDFILE_LIBS@ @LIBS@ # Libraries required for the RDF template generator. # RDFGEN_LIBS = ./libvamp-hostsdk.a @LIBS@ # Locations for "make install". This will need quite a bit of # editing for non-Linux platforms. Of course you don't necessarily # have to use "make install". # INSTALL_PREFIX = @prefix@ INSTALL_API_HEADERS = $(INSTALL_PREFIX)/include/vamp INSTALL_SDK_HEADERS = $(INSTALL_PREFIX)/include/vamp-sdk INSTALL_HOSTSDK_HEADERS = $(INSTALL_PREFIX)/include/vamp-hostsdk INSTALL_SDK_LIBS = $(INSTALL_PREFIX)/lib INSTALL_PLUGINS = $(INSTALL_PREFIX)/lib/vamp INSTALL_BINARIES = $(INSTALL_PREFIX)/bin INSTALL_SDK_LIBNAME = libvamp-sdk.so.2.7.0 INSTALL_SDK_LINK_ABI = libvamp-sdk.so.2 INSTALL_SDK_LINK_DEV = libvamp-sdk.so INSTALL_SDK_STATIC = libvamp-sdk.a INSTALL_SDK_LA = libvamp-sdk.la INSTALL_HOSTSDK_LIBNAME = libvamp-hostsdk.so.3.7.0 INSTALL_HOSTSDK_LINK_ABI = libvamp-hostsdk.so.3 INSTALL_HOSTSDK_LINK_DEV = libvamp-hostsdk.so INSTALL_HOSTSDK_STATIC = libvamp-hostsdk.a INSTALL_HOSTSDK_LA = libvamp-hostsdk.la INSTALL_PKGCONFIG = $(INSTALL_PREFIX)/lib/pkgconfig # Flags required to tell the compiler to create a dynamically loadable object # DYNAMIC_LDFLAGS = -static-libgcc -shared -Wl,-Bsymbolic SDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) -Wl,-soname=$(INSTALL_SDK_LINK_ABI) HOSTSDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) -Wl,-soname=$(INSTALL_HOSTSDK_LINK_ABI) # Additional flags for making a plugin. This version script tells the # GNU linker to make all symbols in the library hidden except for the # public entry point. It's not essential, but makes a tidier library. PLUGIN_LDFLAGS = $(DYNAMIC_LDFLAGS) -Wl,--version-script=build/vamp-plugin.map # Adapt install details when found to be running on OSX (thanks to David O) uname_S = $(shell uname -s) ifeq ($(uname_S),Darwin) DYNAMIC_LDFLAGS = -dynamiclib SDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) HOSTSDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) PLUGIN_LDFLAGS = $(DYNAMIC_LDFLAGS) -exported_symbols_list build/vamp-plugin.list INSTALL_HOSTSDK_LIBNAME = libvamp-hostsdk.3.7.0.dylib INSTALL_HOSTSDK_LINK_ABI = libvamp-hostsdk.3.dylib # The OS X linker doesn't allow you to request static linkage when # linking by library search path, if the same library name is found in # both static and dynamic versions. So if we install both static and # dynamic, the static library will never be used. That's OK for the # host SDK, but we do want plugins to get static linkage of the plugin # SDK. So install the dynamic version under a different name. INSTALL_SDK_LIBNAME = libvamp-sdk-dynamic.2.7.0.dylib INSTALL_SDK_LINK_ABI = libvamp-sdk-dynamic.2.dylib endif ### End of user-serviceable parts API_HEADERS = \ $(APIDIR)/vamp.h SDK_HEADERS = \ $(SDKDIR)/Plugin.h \ $(SDKDIR)/PluginAdapter.h \ $(SDKDIR)/PluginBase.h \ $(SDKDIR)/RealTime.h \ $(SDKDIR)/FFT.h \ $(SDKDIR)/plugguard.h \ $(SDKDIR)/vamp-sdk.h HOSTSDK_HEADERS = \ $(HOSTSDKDIR)/Plugin.h \ $(HOSTSDKDIR)/PluginBase.h \ $(HOSTSDKDIR)/PluginHostAdapter.h \ $(HOSTSDKDIR)/PluginBufferingAdapter.h \ $(HOSTSDKDIR)/PluginChannelAdapter.h \ $(HOSTSDKDIR)/PluginInputDomainAdapter.h \ $(HOSTSDKDIR)/PluginLoader.h \ $(HOSTSDKDIR)/PluginSummarisingAdapter.h \ $(HOSTSDKDIR)/PluginWrapper.h \ $(HOSTSDKDIR)/RealTime.h \ $(HOSTSDKDIR)/hostguard.h \ $(HOSTSDKDIR)/host-c.h \ $(HOSTSDKDIR)/vamp-hostsdk.h SDK_OBJECTS = \ $(SDKSRCDIR)/PluginAdapter.o \ $(SDKSRCDIR)/RealTime.o \ $(SDKSRCDIR)/FFT.o \ $(SDKSRCDIR)/acsymbols.o HOSTSDK_OBJECTS = \ $(HOSTSDKSRCDIR)/Files.o \ $(HOSTSDKSRCDIR)/PluginHostAdapter.o \ $(HOSTSDKSRCDIR)/RealTime.o \ $(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \ $(HOSTSDKSRCDIR)/PluginChannelAdapter.o \ $(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \ $(HOSTSDKSRCDIR)/PluginLoader.o \ $(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \ $(HOSTSDKSRCDIR)/PluginWrapper.o \ $(HOSTSDKSRCDIR)/host-c.o \ $(HOSTSDKSRCDIR)/acsymbols.o SDK_STATIC = \ ./libvamp-sdk.a HOSTSDK_STATIC = \ ./libvamp-hostsdk.a SDK_DYNAMIC = \ ./libvamp-sdk$(PLUGIN_EXT) HOSTSDK_DYNAMIC = \ ./libvamp-hostsdk$(PLUGIN_EXT) SDK_LA = \ $(LADIR)/libvamp-sdk.la HOSTSDK_LA = \ $(LADIR)/libvamp-hostsdk.la PLUGIN_HEADERS = \ $(EXAMPLEDIR)/SpectralCentroid.h \ $(EXAMPLEDIR)/PowerSpectrum.h \ $(EXAMPLEDIR)/PercussionOnsetDetector.h \ $(EXAMPLEDIR)/FixedTempoEstimator.h \ $(EXAMPLEDIR)/AmplitudeFollower.h \ $(EXAMPLEDIR)/ZeroCrossing.h PLUGIN_OBJECTS = \ $(EXAMPLEDIR)/SpectralCentroid.o \ $(EXAMPLEDIR)/PowerSpectrum.o \ $(EXAMPLEDIR)/PercussionOnsetDetector.o \ $(EXAMPLEDIR)/FixedTempoEstimator.o \ $(EXAMPLEDIR)/AmplitudeFollower.o \ $(EXAMPLEDIR)/ZeroCrossing.o \ $(EXAMPLEDIR)/plugins.o PLUGIN_TARGET = \ $(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT) PLUGIN_CAT = \ $(EXAMPLEDIR)/vamp-example-plugins.cat PLUGIN_TTL = \ $(EXAMPLEDIR)/vamp-example-plugins.n3 HOST_HEADERS = \ $(HOSTDIR)/system.h HOST_OBJECTS = \ $(HOSTDIR)/vamp-simple-host.o HOST_TARGET = \ $(HOSTDIR)/vamp-simple-host RDFGEN_OBJECTS = \ $(RDFGENDIR)/vamp-rdf-template-generator.o RDFGEN_TARGET = \ $(RDFGENDIR)/vamp-rdf-template-generator sdk: sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC) sdkstatic: $(SDK_STATIC) $(HOSTSDK_STATIC) $(RANLIB) $(SDK_STATIC) $(RANLIB) $(HOSTSDK_STATIC) plugins: $(PLUGIN_TARGET) host: $(HOST_TARGET) rdfgen: $(RDFGEN_TARGET) all: sdk plugins host rdfgen test $(SDK_STATIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(AR) r $@ $(SDK_OBJECTS) $(HOSTSDK_STATIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(AR) r $@ $(HOSTSDK_OBJECTS) $(SDK_DYNAMIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS) $(HOSTSDK_DYNAMIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS) $(PLUGIN_TARGET): $(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS) $(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS) $(HOST_TARGET): $(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS) $(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(HOST_LIBS) $(RDFGEN_TARGET): $(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) $(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(RDFGEN_LIBS) test: plugins host VAMP_PATH=$(EXAMPLEDIR) $(HOST_TARGET) -l clean: rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS) distclean: clean rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~ rm -f config.log config.status Makefile install: $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) mkdir -p $(DESTDIR)$(INSTALL_API_HEADERS) mkdir -p $(DESTDIR)$(INSTALL_SDK_HEADERS) mkdir -p $(DESTDIR)$(INSTALL_HOSTSDK_HEADERS) mkdir -p $(DESTDIR)$(INSTALL_SDK_LIBS) mkdir -p $(DESTDIR)$(INSTALL_PKGCONFIG) mkdir -p $(DESTDIR)$(INSTALL_BINARIES) mkdir -p $(DESTDIR)$(INSTALL_PLUGINS) cp $(HOST_TARGET) $(DESTDIR)$(INSTALL_BINARIES) cp $(RDFGEN_TARGET) $(DESTDIR)$(INSTALL_BINARIES) cp $(PLUGIN_TARGET) $(DESTDIR)$(INSTALL_PLUGINS) cp $(PLUGIN_CAT) $(DESTDIR)$(INSTALL_PLUGINS) cp $(PLUGIN_TTL) $(DESTDIR)$(INSTALL_PLUGINS) cp $(API_HEADERS) $(DESTDIR)$(INSTALL_API_HEADERS) cp $(SDK_HEADERS) $(DESTDIR)$(INSTALL_SDK_HEADERS) cp $(HOSTSDK_HEADERS) $(DESTDIR)$(INSTALL_HOSTSDK_HEADERS) cp $(SDK_STATIC) $(DESTDIR)$(INSTALL_SDK_LIBS) cp $(HOSTSDK_STATIC) $(DESTDIR)$(INSTALL_SDK_LIBS) cp $(SDK_DYNAMIC) $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_SDK_LIBNAME) cp $(HOSTSDK_DYNAMIC) $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_HOSTSDK_LIBNAME) rm -f $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_SDK_LINK_ABI) ln -s $(INSTALL_SDK_LIBNAME) $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_SDK_LINK_ABI) rm -f $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_HOSTSDK_LINK_ABI) ln -s $(INSTALL_HOSTSDK_LIBNAME) $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_HOSTSDK_LINK_ABI) rm -f $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_SDK_LINK_DEV) ln -s $(INSTALL_SDK_LIBNAME) $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_SDK_LINK_DEV) rm -f $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_HOSTSDK_LINK_DEV) ln -s $(INSTALL_HOSTSDK_LIBNAME) $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_HOSTSDK_LINK_DEV) sed "s,%PREFIX%,$(INSTALL_PREFIX)," $(PCDIR)/vamp.pc.in \ > $(DESTDIR)$(INSTALL_PKGCONFIG)/vamp.pc sed "s,%PREFIX%,$(INSTALL_PREFIX)," $(PCDIR)/vamp-sdk.pc.in \ > $(DESTDIR)$(INSTALL_PKGCONFIG)/vamp-sdk.pc sed "s,%PREFIX%,$(INSTALL_PREFIX)," $(PCDIR)/vamp-hostsdk.pc.in \ > $(DESTDIR)$(INSTALL_PKGCONFIG)/vamp-hostsdk.pc sed -e "s,%LIBNAME%,$(INSTALL_SDK_LIBNAME),g" \ -e "s,%LINK_ABI%,$(INSTALL_SDK_LINK_ABI),g" \ -e "s,%LINK_DEV%,$(INSTALL_SDK_LINK_DEV),g" \ -e "s,%STATIC%,$(INSTALL_SDK_STATIC),g" \ -e "s,%LIBS%,$(INSTALL_SDK_LIBS),g" $(SDK_LA).in \ > $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_SDK_LA) sed -e "s,%LIBNAME%,$(INSTALL_HOSTSDK_LIBNAME),g" \ -e "s,%LINK_ABI%,$(INSTALL_HOSTSDK_LINK_ABI),g" \ -e "s,%LINK_DEV%,$(INSTALL_HOSTSDK_LINK_DEV),g" \ -e "s,%STATIC%,$(INSTALL_HOSTSDK_STATIC),g" \ -e "s,%LIBS%,$(INSTALL_SDK_LIBS),g" $(HOSTSDK_LA).in \ > $(DESTDIR)$(INSTALL_SDK_LIBS)/$(INSTALL_HOSTSDK_LA) depend: makedepend -Y. */*.cpp */*/*.cpp */*/*/*.cpp # DO NOT DELETE examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/AmplitudeFollower.o: vamp-sdk/RealTime.h examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/SpectralCentroid.o: vamp-sdk/RealTime.h examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/PowerSpectrum.o: vamp-sdk/RealTime.h examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/ZeroCrossing.o: vamp-sdk/RealTime.h examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h examples/plugins.o: examples/FixedTempoEstimator.h examples/plugins.o: examples/AmplitudeFollower.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h host/vamp-simple-host.o: vamp-sdk/Plugin.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h src/vamp-sdk/FFT.o: src/vamp-sdk/FFT.cpp vamp-sdk/FFT.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/FFT.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h sonic-visualiser-3.0.3/vamp-plugin-sdk/README0000644000000000000000000002343413111512442017040 0ustar 00000000000000 Vamp ==== An API for audio analysis and feature extraction plugins. http://www.vamp-plugins.org/ Vamp is an API for C and C++ plugins that process sampled audio data to produce descriptive output (measurements or semantic observations). This is version 2.7.1 of the Vamp plugin Software Development Kit. Plugins and hosts built with this SDK are binary compatible with those built using any version 2.0 or newer of the SDK. Plugins and hosts built with this SDK are binary compatible with those built using version 1.0 of the SDK, with certain restrictions. See the file README.compat for more details. See the file CHANGELOG for a list of the changes in this release. A documentation guide to writing plugins using the Vamp SDK can be found at http://www.vamp-plugins.org/guide.pdf . Compiling and Installing the SDK and Examples ============================================= This SDK is intended for use on Windows, OS/X, Linux, and other POSIX and GNU platforms. Please see the platform-specific README file (README.msvc, README.osx, README.linux) in the build/ directory for details about how to compile and install the SDK, how to build plugin libraries using it, and how to install the example plugins so you can use them in a host. What's In This SDK ================== This SDK contains the following: vamp/vamp.h ----------- The formal C language plugin API for Vamp plugins. A Vamp plugin is a dynamic library (.so, .dll or .dylib depending on platform) exposing one C-linkage entry point (vampGetPluginDescriptor) which returns data defined in the rest of this C header. Although the C API is the official API for Vamp, we don't recommend that you program directly to it. The C++ abstractions found in the vamp-sdk and vamp-hostsdk directories (below) are preferable for most purposes and are more thoroughly documented. vamp-sdk -------- C++ classes for implementing Vamp plugins. Plugins should subclass Vamp::Plugin and then use Vamp::PluginAdapter to expose the correct C API for the plugin. Plugin authors should read vamp-sdk/PluginBase.h and Plugin.h for code documentation. See "examples" below for details of the example plugins in the SDK, from which you are welcome to take code and inspiration. Plugins should link with -lvamp-sdk. vamp-hostsdk ------------ C++ classes for implementing Vamp hosts. Hosts will normally use a Vamp::PluginHostAdapter to convert each plugin's exposed C API back into a useful Vamp::Plugin C++ object. The Vamp::HostExt namespace contains several additional C++ classes to do this work for them, and make the host's life easier: - Vamp::HostExt::PluginLoader provides a very easy interface for a host to discover, load, and find out category information about the available plugins. Most Vamp hosts will probably want to use this class. - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for hosts to handle plugins that want frequency-domain input, without having to convert the input themselves. - Vamp::HostExt::PluginChannelAdapter provides a simple means for hosts to use plugins that do not necessarily support the same number of audio channels as they have available, without having to apply a channel management / mixdown policy themselves. - Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to avoid having to negotiate the input step and block size, instead permitting the host to use any block size they desire (and a step size equal to it). This is particularly useful for "streaming" hosts that cannot seek backwards in the input audio stream and so would otherwise need to implement an additional buffer to support step sizes smaller than the block size. - Vamp::HostExt::PluginSummarisingAdapter provides summarisation methods such as mean and median averages of output features, for use in any context where an available plugin produces individual values but the result that is actually needed is some sort of aggregate. The PluginLoader class can also use the input domain, channel, and buffering adapters automatically to make these conversions transparent to the host if required. Host authors should also refer to the example host code in the host directory of the SDK. Hosts should link with -lvamp-hostsdk. vamp-hostsdk/host-c.h --------------------- A C-linkage header wrapping the part of the C++ SDK code that handles plugin discovery and library loading. Host programs written in C or in a language with a C-linkage foreign function interface may choose to use this header to discover and load plugin libraries, together with the vamp/vamp.h formal API to interact with plugins themselves. See the header for more documentation. examples -------- Example plugins implemented using the C++ classes. These plugins are intended to be useful examples you can draw code from in order to provide the basic shape and structure of a Vamp plugin. They are also intended to be correct and useful, if simple. - ZeroCrossing calculates the positions and density of zero-crossing points in an audio waveform. - SpectralCentroid calculates the centre of gravity of the frequency domain representation of each block of audio. - PowerSpectrum calculates a power spectrum from the input audio. Actually, it doesn't do any work except calculating power from a cartesian complex FFT output. The work of calculating this frequency domain output is done for it by the host or host SDK; the plugin just needs to declare that it wants frequency domain input. This is the simplest of the example plugins. - AmplitudeFollower is a simple implementation of SuperCollider's amplitude-follower algorithm. - PercussionOnsetDetector estimates the locations of percussive onsets using a simple method described in "Drum Source Separation using Percussive Feature Detection and Spectral Modulation" by Dan Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005. - FixedTempoEstimator calculates a single beats-per-minute value which is an estimate of the tempo of a piece of music that is assumed to be of fixed tempo, using autocorrelation of a frequency domain energy rise metric. It has several outputs that return intermediate results used in the calculation, and may be a useful example of a plugin having several outputs with varying feature structures. skeleton -------- Skeleton code that could be used as a template for your new plugin implementation. host ---- A simple command-line Vamp host, capable of loading a plugin and using it to process a complete audio file, with its default parameters. This host also contains a number of options for listing the installed plugins and their properties in various formats. For that reason, it isn't really as simple as one might hope. The core of the code is still reasonably straightforward, however. Plugin Lookup and Categorisation ================================ The Vamp API does not officially specify how to load plugin libraries or where to find them. However, the SDK does include a function (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended directory search path that hosts may use for plugin libraries, and a class (Vamp::HostExt::PluginLoader) that implements a sensible cross-platform lookup policy using this path. We recommend using this class in your host unless you have a good reason not to want to. This implementation also permits the user to set the environment variable VAMP_PATH to override the default path if desired. The policy used by Vamp::HostExt::PluginLoader -- and our recommendation for any host -- is to search each directory in the path returned by getPluginPath for .DLL (on Windows), .so (on Linux, Solaris, BSD etc) or .dylib (on OS/X) files, then to load each one and perform a dynamic name lookup on the vampGetPluginDescriptor function to enumerate the plugins in the library. This operation will necessarily be system-dependent. Vamp also has an informal convention for sorting plugins into functional categories. In addition to the library file itself, a plugin library may install a category file with the same name as the library but .cat extension. The existence and format of this file are not specified by the Vamp API, but by convention the file may contain lines of the format vamp:pluginlibrary:pluginname::General Category > Specific Category which a host may read and use to assign plugins a location within a category tree for display to the user. The expectation is that advanced users may also choose to set up their own preferred category trees, which is why this information is not queried as part of the Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also provides support for plugin category lookup using this scheme. Licensing ========= This plugin SDK is freely redistributable under a "new-style BSD" licence. See the file COPYING for more details. In short, you may modify and redistribute the SDK and example plugins within any commercial or non-commercial, proprietary or open-source plugin or application under almost any conditions, with no obligation to provide source code, provided you retain the original copyright note. See Also ======== Sonic Visualiser, an interactive open-source graphical audio inspection, analysis and visualisation tool supporting Vamp plugins. http://www.sonicvisualiser.org/ Authors ======= Vamp and the Vamp SDK were designed and made at the Centre for Digital Music at Queen Mary, University of London. The SDK was written by Chris Cannam, copyright (c) 2005-2017 Chris Cannam and QMUL. The SDK incorporates KissFFT code, copyright (c) 2003-2010 Mark Borgerding. Mark Sandler and Christian Landone provided ideas and direction, and Mark Levy, Dan Stowell, Martin Gasser and Craig Sapp provided testing and other input for the 1.0 API and SDK. The API also uses some ideas from prior plugin systems, notably DSSI (http://dssi.sourceforge.net) and FEAPI (http://feapi.sourceforge.net). sonic-visualiser-3.0.3/vamp-plugin-sdk/README.compat0000644000000000000000000001146013111512442020316 0ustar 00000000000000 Backward Compatibility Statement for Vamp Plugin SDK version 2.0 ================================================================ Plugin binary compatibility --------------------------- Version 2.0 of the Vamp plugin binary interface is backward compatible with version 1.0. A plugin that was compiled and (statically) linked using version 1.x of the SDK should load and run without modification in a host that was compiled and linked using version 2.0 of the SDK. A plugin that was compiled and (statically) linked using version 2.0 of the SDK should load and run in a host that was compiled and linked using version 1.x of the SDK. However, the 1.x host will be unable to see any durations that the plugin specifies for its returned features, as there was no support for duration in version 1 of the Vamp plugin interface. Plugin/host version discrimination ---------------------------------- A Vamp plugin library receives the Vamp SDK version number for the host as the first argument to its vampGetPluginDescriptor function. It may use this information to provide different behaviour depending on the version of the host. For example, the plugin may structure its outputs differently in older hosts that do not support feature duration. Or, if the plugins rely on version 2.0 features, the library could make itself invisible to older hosts (returning no plugin descriptors). The version argument passed to vampGetPluginDescriptor will be 1 for Vamp 1.x hosts or 2 for Vamp 2.0 hosts. (Plugin libraries should behave as for version 2 if passed a version number greater than 2.) Plugin SDK library compatibility -------------------------------- For plugin code, version 2.0 of the Vamp plugin SDK is source compatible but not library ABI compatible with version 1.x. Plugins written for version 1.x should compile and link without modification using version 2.0. Plugins dynamically linked against version 1.x SDK libraries will need to be rebuilt if they are to work with version 2.0 libraries. To avoid dynamic library resolution issues, it is generally preferable to link the SDK statically when distributing binary plugins. Host SDK library compatibility ------------------------------ For host code, version 2.0 of the Vamp plugin SDK is neither source nor binary compatible with version 1.x. The host SDK header include location has moved for version 2.0; hosts should now only include headers from the vamp-hostsdk/ include directory -- the vamp-sdk/ directory is reserved for inclusion in plugin code only. There is also no longer a separate subdirectory for hostext headers. Hosts written for version 1.x will therefore need to have their #include directives updated as follows: Old New For most hosts, these should be the only changes necessary; the actual code remains the same. Hosts that incorporate plugin code ---------------------------------- One of the changes in this version of the SDK is that separate top-level C++ namespaces are used for classes compiled into plugins (the _VampPlugin namespace) and hosts (the _VampHost namespace), to avoid any confusion between host and plugin namespaces in unusual linkage situations (as the host and plugin SDKs contain many of the same classes, there is a risk that the wrong class may be picked up by a stupid dynamic linker in cases where the host and plugin SDK versions do not match). This additional namespace is added and opened silently in a manner that is transparent in most circumstances, and neither plugin nor host authors will normally need to know about it. However, hosts that directly incorporate code from plugins, for example to provide functionality that is the same as those plugins without having to explicitly load them, will find that they cannot resolve plugin symbols at link time because of this namespace mismatch. To avoid this, you may define the preprocessor symbol _VAMP_PLUGIN_IN_HOST_NAMESPACE when compiling the plugin code in the context of the host, to ensure that both host and plugin code exist within the same namespace. (If your host does this, why not make it load the plugins dynamically instead using the normal Vamp plugin loader method? There are many advantages to that.) sonic-visualiser-3.0.3/vamp-plugin-sdk/build/Doxyfile0000644000000000000000000017473613111512442021001 0ustar 00000000000000# Doxyfile 1.5.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = VampPluginSDK # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 2.7.1 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = vamp \ vamp-sdk \ vamp-hostsdk \ src \ examples \ host # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc \ doc-overview # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to FRAME, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = NO # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = _VAMP_NO_PLUGIN_NAMESPACE # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = DejaVuSansCondensed # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 9 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = /usr/share/fonts/truetype/ttf-dejavu # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Options related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-3.0.3/vamp-plugin-sdk/build/Makefile.mingw320000644000000000000000000003420313111512442022200 0ustar 00000000000000 # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. # # This version of the Makefile is approximately correct for cross- # compiling for Windows from Linux using the MinGW tools. # Note that it has no "install" target; the following are the # library and related files that may be of interest resulting from # the build: # # libvamp-sdk.dll [SDK dynamic library for plugins] # libvamp-hostsdk.dll [SDK dynamic library for hosts] # # libvamp-sdk.a [SDK static library for plugins] # libvamp-hostsdk.a [SDK static library for hosts] # # examples/vamp-example-plugins.cat [copy this to your Vamp plugin dir] # examples/vamp-example-plugins.dll [copy this to your Vamp plugin dir] # # host/vamp-simple-host [requires libsndfile to build] # # rdf/generator/vamp-rdf-template-generator # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. APIDIR = vamp SDKDIR = vamp-sdk HOSTSDKDIR = vamp-hostsdk SRCDIR = src SDKSRCDIR = src/vamp-sdk HOSTSDKSRCDIR = src/vamp-hostsdk EXAMPLEDIR = examples HOSTDIR = host PCDIR = pkgconfig LADIR = build RDFGENDIR = rdf/generator ### ### Start of user-serviceable parts ### # Default build target (or use "make " to select one). # Targets are: # all -- build everything # sdk -- build all the Vamp SDK libraries for plugins and hosts # sdkstatic -- build only the static versions of the SDK libraries # plugins -- build the example plugins (and the SDK if required) # host -- build the simple Vamp plugin host (and the SDK if required) # rdfgen -- build the RDF template generator (and the SDK if required) # test -- build the host and example plugins, and run a quick test # clean -- remove binary targets # distclean -- remove all targets # default: all # Tools selection # TOOLPREFIX ?= i686-w64-mingw32- CXX = $(TOOLPREFIX)g++ CC = $(TOOLPREFIX)gcc LD = $(TOOLPREFIX)g++ AR = $(TOOLPREFIX)ar RANLIB = $(TOOLPREFIX)ranlib # Compile flags # CXXFLAGS := $(CXXFLAGS) -O2 -Wall -fno-exceptions -I. -I../include # Libraries required for the plugins. # PLUGIN_LIBS = ./libvamp-sdk.a # File extension for a dynamically loadable object # PLUGIN_EXT = .dll # Libraries required for the host. # HOST_LIBS = ./libvamp-hostsdk.a -L../lib -lsndfile -lvorbis -logg -lFLAC -lvorbisenc -lws2_32 # Libraries required for the RDF template generator. # RDFGEN_LIBS = ./libvamp-hostsdk.a # General linker flags # LDFLAGS := $(LDFLAGS) -fno-exceptions -static -static-libgcc # Flags required to tell the compiler to create a dynamically loadable object # DYNAMIC_LDFLAGS = -shared -Wl,-Bsymbolic # Flags for building specific plugin and library targets. We need to # tell the linker the formal name for the library, and for plugins we # also want to tell the linker to make all symbols in the library # hidden except for the public entry point (making for a tidier library). # PLUGIN_LDFLAGS = $(DYNAMIC_LDFLAGS) -Wl,--retain-symbols-file=build/vamp-plugin.list SDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) HOSTSDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) ### End of user-serviceable parts API_HEADERS = \ $(APIDIR)/vamp.h SDK_HEADERS = \ $(SDKDIR)/Plugin.h \ $(SDKDIR)/PluginAdapter.h \ $(SDKDIR)/PluginBase.h \ $(SDKDIR)/RealTime.h \ $(SDKDIR)/FFT.h \ $(SDKDIR)/plugguard.h \ $(SDKDIR)/vamp-sdk.h HOSTSDK_HEADERS = \ $(HOSTSDKDIR)/Plugin.h \ $(HOSTSDKDIR)/PluginBase.h \ $(HOSTSDKDIR)/PluginHostAdapter.h \ $(HOSTSDKDIR)/RealTime.h \ $(HOSTSDKDIR)/PluginBufferingAdapter.h \ $(HOSTSDKDIR)/PluginChannelAdapter.h \ $(HOSTSDKDIR)/PluginInputDomainAdapter.h \ $(HOSTSDKDIR)/PluginLoader.h \ $(HOSTSDKDIR)/PluginSummarisingAdapter.h \ $(HOSTSDKDIR)/PluginWrapper.h \ $(HOSTSDKDIR)/hostguard.h \ $(HOSTSDKDIR)/host-c.h \ $(HOSTSDKDIR)/vamp-hostsdk.h SDK_OBJECTS = \ $(SDKSRCDIR)/PluginAdapter.o \ $(SDKSRCDIR)/RealTime.o \ $(SDKSRCDIR)/FFT.o \ $(SDKSRCDIR)/acsymbols.o HOSTSDK_OBJECTS = \ $(HOSTSDKSRCDIR)/Files.o \ $(HOSTSDKSRCDIR)/PluginHostAdapter.o \ $(HOSTSDKSRCDIR)/RealTime.o \ $(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \ $(HOSTSDKSRCDIR)/PluginChannelAdapter.o \ $(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \ $(HOSTSDKSRCDIR)/PluginLoader.o \ $(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \ $(HOSTSDKSRCDIR)/PluginWrapper.o \ $(HOSTSDKSRCDIR)/host-c.o \ $(HOSTSDKSRCDIR)/acsymbols.o SDK_STATIC = \ ./libvamp-sdk.a HOSTSDK_STATIC = \ ./libvamp-hostsdk.a SDK_DYNAMIC = \ ./libvamp-sdk$(PLUGIN_EXT) HOSTSDK_DYNAMIC = \ ./libvamp-hostsdk$(PLUGIN_EXT) SDK_LA = \ $(LADIR)/libvamp-sdk.la HOSTSDK_LA = \ $(LADIR)/libvamp-hostsdk.la PLUGIN_HEADERS = \ $(EXAMPLEDIR)/SpectralCentroid.h \ $(EXAMPLEDIR)/PowerSpectrum.h \ $(EXAMPLEDIR)/PercussionOnsetDetector.h \ $(EXAMPLEDIR)/FixedTempoEstimator.h \ $(EXAMPLEDIR)/AmplitudeFollower.h \ $(EXAMPLEDIR)/ZeroCrossing.h PLUGIN_OBJECTS = \ $(EXAMPLEDIR)/SpectralCentroid.o \ $(EXAMPLEDIR)/PowerSpectrum.o \ $(EXAMPLEDIR)/PercussionOnsetDetector.o \ $(EXAMPLEDIR)/FixedTempoEstimator.o \ $(EXAMPLEDIR)/AmplitudeFollower.o \ $(EXAMPLEDIR)/ZeroCrossing.o \ $(EXAMPLEDIR)/plugins.o PLUGIN_TARGET = \ $(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT) HOST_HEADERS = \ $(HOSTDIR)/system.h HOST_OBJECTS = \ $(HOSTDIR)/vamp-simple-host.o HOST_TARGET = \ $(HOSTDIR)/vamp-simple-host.exe RDFGEN_OBJECTS = \ $(RDFGENDIR)/vamp-rdf-template-generator.o RDFGEN_TARGET = \ $(RDFGENDIR)/vamp-rdf-template-generator.exe sdk: sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC) sdkstatic: $(SDK_STATIC) $(HOSTSDK_STATIC) $(RANLIB) $(SDK_STATIC) $(RANLIB) $(HOSTSDK_STATIC) plugins: $(PLUGIN_TARGET) host: $(HOST_TARGET) rdfgen: $(RDFGEN_TARGET) all: sdk plugins host rdfgen test $(SDK_STATIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(AR) r $@ $(SDK_OBJECTS) $(HOSTSDK_STATIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(AR) r $@ $(HOSTSDK_OBJECTS) $(SDK_DYNAMIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS) $(HOSTSDK_DYNAMIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS) $(PLUGIN_TARGET): $(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS) $(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS) $(HOST_TARGET): $(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS) $(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(LDFLAGS) $(HOST_LIBS) $(RDFGEN_TARGET): $(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) $(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(LDFLAGS) $(RDFGEN_LIBS) test: plugins host VAMP_PATH=$(EXAMPLEDIR) wine $(HOST_TARGET) -l clean: rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS) distclean: clean rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~ # DO NOT DELETE examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/AmplitudeFollower.o: vamp-sdk/RealTime.h examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/SpectralCentroid.o: vamp-sdk/RealTime.h examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/PowerSpectrum.o: vamp-sdk/RealTime.h examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/ZeroCrossing.o: vamp-sdk/RealTime.h examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h examples/plugins.o: examples/FixedTempoEstimator.h examples/plugins.o: examples/AmplitudeFollower.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h host/vamp-simple-host.o: vamp-sdk/Plugin.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h sonic-visualiser-3.0.3/vamp-plugin-sdk/build/Makefile.mingw640000644000000000000000000003417713111512442022217 0ustar 00000000000000 # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. # # This version of the Makefile is approximately correct for cross- # compiling for Windows from Linux using the MinGW tools. # Note that it has no "install" target; the following are the # library and related files that may be of interest resulting from # the build: # # libvamp-sdk.dll [SDK dynamic library for plugins] # libvamp-hostsdk.dll [SDK dynamic library for hosts] # # libvamp-sdk.a [SDK static library for plugins] # libvamp-hostsdk.a [SDK static library for hosts] # # examples/vamp-example-plugins.cat [copy this to your Vamp plugin dir] # examples/vamp-example-plugins.dll [copy this to your Vamp plugin dir] # # host/vamp-simple-host [requires libsndfile to build] # # rdf/generator/vamp-rdf-template-generator # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. APIDIR = vamp SDKDIR = vamp-sdk HOSTSDKDIR = vamp-hostsdk SRCDIR = src SDKSRCDIR = src/vamp-sdk HOSTSDKSRCDIR = src/vamp-hostsdk EXAMPLEDIR = examples HOSTDIR = host PCDIR = pkgconfig LADIR = build RDFGENDIR = rdf/generator ### ### Start of user-serviceable parts ### # Default build target (or use "make " to select one). # Targets are: # all -- build everything # sdk -- build all the Vamp SDK libraries for plugins and hosts # sdkstatic -- build only the static versions of the SDK libraries # plugins -- build the example plugins (and the SDK if required) # host -- build the simple Vamp plugin host (and the SDK if required) # rdfgen -- build the RDF template generator (and the SDK if required) # test -- build the host and example plugins, and run a quick test # clean -- remove binary targets # distclean -- remove all targets # default: all # Tools selection # TOOLPREFIX ?= x86_64-w64-mingw32- CXX = $(TOOLPREFIX)g++ CC = $(TOOLPREFIX)gcc LD = $(TOOLPREFIX)g++ AR = $(TOOLPREFIX)ar RANLIB = $(TOOLPREFIX)ranlib # Compile flags # CXXFLAGS := $(CXXFLAGS) -O2 -Wall -fno-exceptions -I. -I../include # Libraries required for the plugins. # PLUGIN_LIBS = ./libvamp-sdk.a # File extension for a dynamically loadable object # PLUGIN_EXT = .dll # Libraries required for the host. # HOST_LIBS = ./libvamp-hostsdk.a -L../lib -lsndfile -lvorbis -logg -lFLAC -lvorbisenc -lws2_32 # Libraries required for the RDF template generator. # RDFGEN_LIBS = ./libvamp-hostsdk.a # General linker flags # LDFLAGS := $(LDFLAGS) -fno-exceptions -static -static-libgcc # Flags required to tell the compiler to create a dynamically loadable object # DYNAMIC_LDFLAGS = -shared -Wl,-Bsymbolic # Flags for building specific plugin and library targets. We need to # tell the linker the formal name for the library, and for plugins we # also want to tell the linker to make all symbols in the library # hidden except for the public entry point (making for a tidier library). # PLUGIN_LDFLAGS = $(DYNAMIC_LDFLAGS) -Wl,--version-script=build/vamp-plugin.map SDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) HOSTSDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) ### End of user-serviceable parts API_HEADERS = \ $(APIDIR)/vamp.h SDK_HEADERS = \ $(SDKDIR)/Plugin.h \ $(SDKDIR)/PluginAdapter.h \ $(SDKDIR)/PluginBase.h \ $(SDKDIR)/RealTime.h \ $(SDKDIR)/FFT.h \ $(SDKDIR)/plugguard.h \ $(SDKDIR)/vamp-sdk.h HOSTSDK_HEADERS = \ $(HOSTSDKDIR)/Plugin.h \ $(HOSTSDKDIR)/PluginBase.h \ $(HOSTSDKDIR)/PluginHostAdapter.h \ $(HOSTSDKDIR)/RealTime.h \ $(HOSTSDKDIR)/PluginBufferingAdapter.h \ $(HOSTSDKDIR)/PluginChannelAdapter.h \ $(HOSTSDKDIR)/PluginInputDomainAdapter.h \ $(HOSTSDKDIR)/PluginLoader.h \ $(HOSTSDKDIR)/PluginSummarisingAdapter.h \ $(HOSTSDKDIR)/PluginWrapper.h \ $(HOSTSDKDIR)/hostguard.h \ $(HOSTSDKDIR)/host-c.h \ $(HOSTSDKDIR)/vamp-hostsdk.h SDK_OBJECTS = \ $(SDKSRCDIR)/PluginAdapter.o \ $(SDKSRCDIR)/RealTime.o \ $(SDKSRCDIR)/FFT.o \ $(SDKSRCDIR)/acsymbols.o HOSTSDK_OBJECTS = \ $(HOSTSDKSRCDIR)/Files.o \ $(HOSTSDKSRCDIR)/PluginHostAdapter.o \ $(HOSTSDKSRCDIR)/RealTime.o \ $(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \ $(HOSTSDKSRCDIR)/PluginChannelAdapter.o \ $(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \ $(HOSTSDKSRCDIR)/PluginLoader.o \ $(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \ $(HOSTSDKSRCDIR)/PluginWrapper.o \ $(HOSTSDKSRCDIR)/host-c.o \ $(HOSTSDKSRCDIR)/acsymbols.o SDK_STATIC = \ ./libvamp-sdk.a HOSTSDK_STATIC = \ ./libvamp-hostsdk.a SDK_DYNAMIC = \ ./libvamp-sdk$(PLUGIN_EXT) HOSTSDK_DYNAMIC = \ ./libvamp-hostsdk$(PLUGIN_EXT) SDK_LA = \ $(LADIR)/libvamp-sdk.la HOSTSDK_LA = \ $(LADIR)/libvamp-hostsdk.la PLUGIN_HEADERS = \ $(EXAMPLEDIR)/SpectralCentroid.h \ $(EXAMPLEDIR)/PowerSpectrum.h \ $(EXAMPLEDIR)/PercussionOnsetDetector.h \ $(EXAMPLEDIR)/FixedTempoEstimator.h \ $(EXAMPLEDIR)/AmplitudeFollower.h \ $(EXAMPLEDIR)/ZeroCrossing.h PLUGIN_OBJECTS = \ $(EXAMPLEDIR)/SpectralCentroid.o \ $(EXAMPLEDIR)/PowerSpectrum.o \ $(EXAMPLEDIR)/PercussionOnsetDetector.o \ $(EXAMPLEDIR)/FixedTempoEstimator.o \ $(EXAMPLEDIR)/AmplitudeFollower.o \ $(EXAMPLEDIR)/ZeroCrossing.o \ $(EXAMPLEDIR)/plugins.o PLUGIN_TARGET = \ $(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT) HOST_HEADERS = \ $(HOSTDIR)/system.h HOST_OBJECTS = \ $(HOSTDIR)/vamp-simple-host.o HOST_TARGET = \ $(HOSTDIR)/vamp-simple-host.exe RDFGEN_OBJECTS = \ $(RDFGENDIR)/vamp-rdf-template-generator.o RDFGEN_TARGET = \ $(RDFGENDIR)/vamp-rdf-template-generator.exe sdk: sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC) sdkstatic: $(SDK_STATIC) $(HOSTSDK_STATIC) $(RANLIB) $(SDK_STATIC) $(RANLIB) $(HOSTSDK_STATIC) plugins: $(PLUGIN_TARGET) host: $(HOST_TARGET) rdfgen: $(RDFGEN_TARGET) all: sdk plugins host rdfgen test $(SDK_STATIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(AR) r $@ $(SDK_OBJECTS) $(HOSTSDK_STATIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(AR) r $@ $(HOSTSDK_OBJECTS) $(SDK_DYNAMIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS) $(HOSTSDK_DYNAMIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS) $(PLUGIN_TARGET): $(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS) $(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS) $(HOST_TARGET): $(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS) $(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(LDFLAGS) $(HOST_LIBS) $(RDFGEN_TARGET): $(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) $(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(LDFLAGS) $(RDFGEN_LIBS) test: plugins host VAMP_PATH=$(EXAMPLEDIR) wine $(HOST_TARGET) -l clean: rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS) distclean: clean rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~ # DO NOT DELETE examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/AmplitudeFollower.o: vamp-sdk/RealTime.h examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/SpectralCentroid.o: vamp-sdk/RealTime.h examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/PowerSpectrum.o: vamp-sdk/RealTime.h examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/ZeroCrossing.o: vamp-sdk/RealTime.h examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h examples/plugins.o: examples/FixedTempoEstimator.h examples/plugins.o: examples/AmplitudeFollower.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h host/vamp-simple-host.o: vamp-sdk/Plugin.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h sonic-visualiser-3.0.3/vamp-plugin-sdk/build/Makefile.osx0000644000000000000000000003464513111512442021535 0ustar 00000000000000 # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. # # This version of the Makefile is approximately correct for OS/X 10.7. # Note that it has no "install" target; the following are the # library and related files that may be of interest resulting from # the build: # # libvamp-sdk.dylib [SDK dynamic library for plugins] # libvamp-hostsdk.dylib [SDK dynamic library for hosts] # # libvamp-sdk.a [SDK static library for plugins] # libvamp-hostsdk.a [SDK static library for hosts] # # examples/vamp-example-plugins.cat [copy this to your Vamp plugin dir] # examples/vamp-example-plugins.dylib [copy this to your Vamp plugin dir] # # host/vamp-simple-host [requires libsndfile to build] # # rdf/generator/vamp-rdf-template-generator # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. APIDIR = vamp SDKDIR = vamp-sdk HOSTSDKDIR = vamp-hostsdk SRCDIR = src SDKSRCDIR = src/vamp-sdk HOSTSDKSRCDIR = src/vamp-hostsdk EXAMPLEDIR = examples HOSTDIR = host PCDIR = pkgconfig LADIR = build RDFGENDIR = rdf/generator ### ### Start of user-serviceable parts ### # Default build target (or use "make " to select one). # Targets are: # all -- build everything # sdk -- build all the Vamp SDK libraries for plugins and hosts # sdkstatic -- build only the static versions of the SDK libraries # plugins -- build the example plugins (and the SDK if required) # host -- build the simple Vamp plugin host (and the SDK if required) # rdfgen -- build the RDF template generator (and the SDK if required) # test -- build the host and example plugins, and run a quick test # clean -- remove binary targets # distclean -- remove all targets # default: all # Minimum version of OS/X to target. This will determine the # compiler's choice of platform SDK material MINVERSION := 10.7 # Our default is to try to build for all architectures supported by # the MINVERSION in a universal binary. # ARCHFLAGS ?= -mmacosx-version-min=$(MINVERSION) -arch x86_64 -stdlib=libc++ # Compile flags # CFLAGS += $(ARCHFLAGS) -fPIC CXXFLAGS += $(ARCHFLAGS) -O2 -Wall -I. -I/usr/local/include -fPIC # Link flags common to all link targets # LDFLAGS += $(ARCHFLAGS) -L/usr/local/lib # ar, ranlib # AR = ar RANLIB = ranlib RM_F = rm -f # Libraries required for the plugins. # PLUGIN_LIBS = ./libvamp-sdk.a # File extension for a dynamically loadable object # PLUGIN_EXT = .dylib # Libraries required for the host. # HOST_LIBS = ./libvamp-hostsdk.a -L../10.6/inst/lib -lsndfile -logg -lvorbis -lvorbisenc -lflac -ldl # Libraries required for the RDF template generator. # RDFGEN_LIBS = ./libvamp-hostsdk.a -ldl # Flags required to tell the compiler to create a dynamically loadable object # DYNAMIC_LDFLAGS = $(ARCHFLAGS) -dynamiclib # Flags for building specific plugin and library targets. We need to # tell the linker the formal name for the library, and for plugins we # also want to tell the linker to make all symbols in the library # hidden except for the public entry point (making for a tidier library). # PLUGIN_LDFLAGS = $(DYNAMIC_LDFLAGS) \ -install_name vamp-example-plugins.dylib \ -exported_symbols_list build/vamp-plugin.list SDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) -install_name libvamp-sdk.dylib HOSTSDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) -install_name libvamp-hostsdk.dylib ### End of user-serviceable parts API_HEADERS = \ $(APIDIR)/vamp.h SDK_HEADERS = \ $(SDKDIR)/Plugin.h \ $(SDKDIR)/PluginAdapter.h \ $(SDKDIR)/PluginBase.h \ $(SDKDIR)/RealTime.h \ $(SDKDIR)/FFT.h \ $(SDKDIR)/plugguard.h \ $(SDKDIR)/vamp-sdk.h HOSTSDK_HEADERS = \ $(HOSTSDKDIR)/Plugin.h \ $(HOSTSDKDIR)/PluginBase.h \ $(HOSTSDKDIR)/PluginHostAdapter.h \ $(HOSTSDKDIR)/RealTime.h \ $(HOSTSDKDIR)/PluginBufferingAdapter.h \ $(HOSTSDKDIR)/PluginChannelAdapter.h \ $(HOSTSDKDIR)/PluginInputDomainAdapter.h \ $(HOSTSDKDIR)/PluginLoader.h \ $(HOSTSDKDIR)/PluginSummarisingAdapter.h \ $(HOSTSDKDIR)/PluginWrapper.h \ $(HOSTSDKDIR)/hostguard.h \ $(HOSTSDKDIR)/host-c.h \ $(HOSTSDKDIR)/vamp-hostsdk.h SDK_OBJECTS = \ $(SDKSRCDIR)/PluginAdapter.o \ $(SDKSRCDIR)/RealTime.o \ $(SDKSRCDIR)/FFT.o \ $(SDKSRCDIR)/acsymbols.o HOSTSDK_OBJECTS = \ $(HOSTSDKSRCDIR)/Files.o \ $(HOSTSDKSRCDIR)/PluginHostAdapter.o \ $(HOSTSDKSRCDIR)/RealTime.o \ $(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \ $(HOSTSDKSRCDIR)/PluginChannelAdapter.o \ $(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \ $(HOSTSDKSRCDIR)/PluginLoader.o \ $(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \ $(HOSTSDKSRCDIR)/PluginWrapper.o \ $(HOSTSDKSRCDIR)/host-c.o \ $(HOSTSDKSRCDIR)/acsymbols.o SDK_STATIC = \ ./libvamp-sdk.a HOSTSDK_STATIC = \ ./libvamp-hostsdk.a SDK_DYNAMIC = \ ./libvamp-sdk$(PLUGIN_EXT) HOSTSDK_DYNAMIC = \ ./libvamp-hostsdk$(PLUGIN_EXT) SDK_LA = \ $(LADIR)/libvamp-sdk.la HOSTSDK_LA = \ $(LADIR)/libvamp-hostsdk.la PLUGIN_HEADERS = \ $(EXAMPLEDIR)/SpectralCentroid.h \ $(EXAMPLEDIR)/PowerSpectrum.h \ $(EXAMPLEDIR)/PercussionOnsetDetector.h \ $(EXAMPLEDIR)/FixedTempoEstimator.h \ $(EXAMPLEDIR)/AmplitudeFollower.h \ $(EXAMPLEDIR)/ZeroCrossing.h PLUGIN_OBJECTS = \ $(EXAMPLEDIR)/SpectralCentroid.o \ $(EXAMPLEDIR)/PowerSpectrum.o \ $(EXAMPLEDIR)/PercussionOnsetDetector.o \ $(EXAMPLEDIR)/FixedTempoEstimator.o \ $(EXAMPLEDIR)/AmplitudeFollower.o \ $(EXAMPLEDIR)/ZeroCrossing.o \ $(EXAMPLEDIR)/plugins.o PLUGIN_TARGET = \ $(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT) HOST_HEADERS = \ $(HOSTDIR)/system.h HOST_OBJECTS = \ $(HOSTDIR)/vamp-simple-host.o HOST_TARGET = \ $(HOSTDIR)/vamp-simple-host RDFGEN_OBJECTS = \ $(RDFGENDIR)/vamp-rdf-template-generator.o RDFGEN_TARGET = \ $(RDFGENDIR)/vamp-rdf-template-generator sdk: sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC) sdkstatic: $(SDK_STATIC) $(HOSTSDK_STATIC) $(RANLIB) $(SDK_STATIC) $(RANLIB) $(HOSTSDK_STATIC) plugins: $(PLUGIN_TARGET) host: $(HOST_TARGET) rdfgen: $(RDFGEN_TARGET) all: sdk plugins host rdfgen test $(SDK_STATIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(RM_F) $@ $(AR) r $@ $(SDK_OBJECTS) $(HOSTSDK_STATIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(RM_F) $@ $(AR) r $@ $(HOSTSDK_OBJECTS) $(SDK_DYNAMIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS) $(HOSTSDK_DYNAMIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS) $(PLUGIN_TARGET): $(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS) $(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS) $(HOST_TARGET): $(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS) $(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(HOST_LIBS) $(RDFGEN_TARGET): $(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) $(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(RDFGEN_LIBS) test: plugins host VAMP_PATH=$(EXAMPLEDIR) $(HOST_TARGET) -l clean: rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS) distclean: clean rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~ # DO NOT DELETE examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/AmplitudeFollower.o: vamp-sdk/RealTime.h examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/SpectralCentroid.o: vamp-sdk/RealTime.h examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/PowerSpectrum.o: vamp-sdk/RealTime.h examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/ZeroCrossing.o: vamp-sdk/RealTime.h examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h examples/plugins.o: examples/FixedTempoEstimator.h examples/plugins.o: examples/AmplitudeFollower.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h host/vamp-simple-host.o: vamp-sdk/Plugin.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h sonic-visualiser-3.0.3/vamp-plugin-sdk/build/Makefile.osx.1060000644000000000000000000003713313111512442022035 0ustar 00000000000000 # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. # # This version of the Makefile is approximately correct for OS/X. # Note that it has no "install" target; the following are the # library and related files that may be of interest resulting from # the build: # # libvamp-sdk.dylib [SDK dynamic library for plugins] # libvamp-hostsdk.dylib [SDK dynamic library for hosts] # # libvamp-sdk.a [SDK static library for plugins] # libvamp-hostsdk.a [SDK static library for hosts] # # examples/vamp-example-plugins.cat [copy this to your Vamp plugin dir] # examples/vamp-example-plugins.dylib [copy this to your Vamp plugin dir] # # host/vamp-simple-host [requires libsndfile to build] # # rdf/generator/vamp-rdf-template-generator # Makefile for the Vamp plugin SDK. This builds the SDK objects, # libraries, example plugins, and the test host. Please adjust to # suit your operating system requirements. APIDIR = vamp SDKDIR = vamp-sdk HOSTSDKDIR = vamp-hostsdk SRCDIR = src SDKSRCDIR = src/vamp-sdk HOSTSDKSRCDIR = src/vamp-hostsdk EXAMPLEDIR = examples HOSTDIR = host PCDIR = pkgconfig LADIR = build RDFGENDIR = rdf/generator ### ### Start of user-serviceable parts ### # Default build target (or use "make " to select one). # Targets are: # all -- build everything # sdk -- build all the Vamp SDK libraries for plugins and hosts # sdkstatic -- build only the static versions of the SDK libraries # plugins -- build the example plugins (and the SDK if required) # host -- build the simple Vamp plugin host (and the SDK if required) # rdfgen -- build the RDF template generator (and the SDK if required) # test -- build the host and example plugins, and run a quick test # clean -- remove binary targets # distclean -- remove all targets # default: all # Architecture and developer SDK selection flags. Change these only # if you want to select a different OS/X compatibility level from the # default. # # By default, we try to find the oldest available SDK that is newer # than 10.4. # # If you want to override this to select a particular SDK, change # PREFERRED_SDK to the SDK name (e.g. "10.4u") and PREFERRED_MINVERSION # to the minimum OS revision (e.g. "10.4"). An example follows this code. # SDKPREFIX := /Developer/SDKs/MacOSX SDKS := $(wildcard $(SDKPREFIX)*.sdk) SDKVERSIONS := $(patsubst $(SDKPREFIX)%.sdk,%,$(SDKS)) GOOD_SDKS := $(filter-out 10.1%,$(filter-out 10.2%,$(filter-out 10.3%,$(filter-out 10.4%,$(SDKVERSIONS))))) # PREFERRED_SDK := $(word 1, $(sort $(GOOD_SDKS))) PREFERRED_MINVERSION := $(patsubst %u,%,$(PREFERRED_SDK)) # # Example: to set your own values, uncomment and adjust: # PREFERRED_SDK := 10.4u # PREFERRED_MINVERSION := 10.4 SDKFLAGS = -isysroot /Developer/SDKs/MacOSX$(PREFERRED_SDK).sdk -mmacosx-version-min=$(PREFERRED_MINVERSION) # Our default is to try to build for all available architectures in a # universal binary. # ARCHFLAGS = $(SDKFLAGS) -arch i386 -arch x86_64 -arch ppc # Compile flags # CFLAGS = $(ARCHFLAGS) -fPIC CXXFLAGS = $(ARCHFLAGS) -O2 -Wall -I. -fPIC # Link flags common to all link targets # LDFLAGS = $(ARCHFLAGS) # ar, ranlib # AR = ar RANLIB = ranlib RM_F = rm -f # Libraries required for the plugins. # PLUGIN_LIBS = ./libvamp-sdk.a # File extension for a dynamically loadable object # PLUGIN_EXT = .dylib # Libraries required for the host. # HOST_LIBS = ./libvamp-hostsdk.a -lsndfile -ldl # Libraries required for the RDF template generator. # RDFGEN_LIBS = ./libvamp-hostsdk.a -ldl # Flags required to tell the compiler to create a dynamically loadable object # DYNAMIC_LDFLAGS = $(ARCHFLAGS) -dynamiclib # Flags for building specific plugin and library targets. We need to # tell the linker the formal name for the library, and for plugins we # also want to tell the linker to make all symbols in the library # hidden except for the public entry point (making for a tidier library). # PLUGIN_LDFLAGS = $(DYNAMIC_LDFLAGS) \ -install_name vamp-example-plugins.dylib \ -exported_symbols_list build/vamp-plugin.list SDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) -install_name libvamp-sdk.dylib HOSTSDK_DYNAMIC_LDFLAGS = $(DYNAMIC_LDFLAGS) -install_name libvamp-hostsdk.dylib ### End of user-serviceable parts API_HEADERS = \ $(APIDIR)/vamp.h SDK_HEADERS = \ $(SDKDIR)/Plugin.h \ $(SDKDIR)/PluginAdapter.h \ $(SDKDIR)/PluginBase.h \ $(SDKDIR)/RealTime.h \ $(SDKDIR)/FFT.h \ $(SDKDIR)/plugguard.h \ $(SDKDIR)/vamp-sdk.h HOSTSDK_HEADERS = \ $(HOSTSDKDIR)/Plugin.h \ $(HOSTSDKDIR)/PluginBase.h \ $(HOSTSDKDIR)/PluginHostAdapter.h \ $(HOSTSDKDIR)/RealTime.h \ $(HOSTSDKDIR)/PluginBufferingAdapter.h \ $(HOSTSDKDIR)/PluginChannelAdapter.h \ $(HOSTSDKDIR)/PluginInputDomainAdapter.h \ $(HOSTSDKDIR)/PluginLoader.h \ $(HOSTSDKDIR)/PluginSummarisingAdapter.h \ $(HOSTSDKDIR)/PluginWrapper.h \ $(HOSTSDKDIR)/hostguard.h \ $(HOSTSDKDIR)/host-c.h \ $(HOSTSDKDIR)/vamp-hostsdk.h SDK_OBJECTS = \ $(SDKSRCDIR)/PluginAdapter.o \ $(SDKSRCDIR)/RealTime.o \ $(SDKSRCDIR)/FFT.o \ $(SDKSRCDIR)/acsymbols.o HOSTSDK_OBJECTS = \ $(HOSTSDKSRCDIR)/Files.o \ $(HOSTSDKSRCDIR)/PluginHostAdapter.o \ $(HOSTSDKSRCDIR)/RealTime.o \ $(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \ $(HOSTSDKSRCDIR)/PluginChannelAdapter.o \ $(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \ $(HOSTSDKSRCDIR)/PluginLoader.o \ $(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \ $(HOSTSDKSRCDIR)/PluginWrapper.o \ $(HOSTSDKSRCDIR)/host-c.o \ $(HOSTSDKSRCDIR)/acsymbols.o SDK_STATIC = \ ./libvamp-sdk.a HOSTSDK_STATIC = \ ./libvamp-hostsdk.a SDK_DYNAMIC = \ ./libvamp-sdk$(PLUGIN_EXT) HOSTSDK_DYNAMIC = \ ./libvamp-hostsdk$(PLUGIN_EXT) SDK_LA = \ $(LADIR)/libvamp-sdk.la HOSTSDK_LA = \ $(LADIR)/libvamp-hostsdk.la PLUGIN_HEADERS = \ $(EXAMPLEDIR)/SpectralCentroid.h \ $(EXAMPLEDIR)/PowerSpectrum.h \ $(EXAMPLEDIR)/PercussionOnsetDetector.h \ $(EXAMPLEDIR)/FixedTempoEstimator.h \ $(EXAMPLEDIR)/AmplitudeFollower.h \ $(EXAMPLEDIR)/ZeroCrossing.h PLUGIN_OBJECTS = \ $(EXAMPLEDIR)/SpectralCentroid.o \ $(EXAMPLEDIR)/PowerSpectrum.o \ $(EXAMPLEDIR)/PercussionOnsetDetector.o \ $(EXAMPLEDIR)/FixedTempoEstimator.o \ $(EXAMPLEDIR)/AmplitudeFollower.o \ $(EXAMPLEDIR)/ZeroCrossing.o \ $(EXAMPLEDIR)/plugins.o PLUGIN_TARGET = \ $(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT) HOST_HEADERS = \ $(HOSTDIR)/system.h HOST_OBJECTS = \ $(HOSTDIR)/vamp-simple-host.o HOST_TARGET = \ $(HOSTDIR)/vamp-simple-host RDFGEN_OBJECTS = \ $(RDFGENDIR)/vamp-rdf-template-generator.o RDFGEN_TARGET = \ $(RDFGENDIR)/vamp-rdf-template-generator show: @echo " *** Found available SDK versions: $(SDKVERSIONS)" @test -n "$(PREFERRED_SDK)" || ( echo "Error: Failed to establish preferred SDK version, please ensure at least one Developer SDK is installed" ; exit 1 ) @test -n "$(PREFERRED_MINVERSION)" || ( echo "Error: Failed to establish preferred minimum OS version" ; exit 1 ) @echo " *** Default SDK is $(PREFERRED_SDK) for minimum OS/X version $(PREFERRED_MINVERSION)" sdk: show sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC) sdkstatic: $(SDK_STATIC) $(HOSTSDK_STATIC) $(RANLIB) $(SDK_STATIC) $(RANLIB) $(HOSTSDK_STATIC) plugins: $(PLUGIN_TARGET) host: $(HOST_TARGET) rdfgen: $(RDFGEN_TARGET) all: sdk plugins host rdfgen test $(SDK_STATIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(RM_F) $@ $(AR) r $@ $(SDK_OBJECTS) $(HOSTSDK_STATIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(RM_F) $@ $(AR) r $@ $(HOSTSDK_OBJECTS) $(SDK_DYNAMIC): $(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS) $(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS) $(HOSTSDK_DYNAMIC): $(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS) $(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS) $(PLUGIN_TARGET): $(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS) $(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS) $(HOST_TARGET): $(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS) $(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(HOST_LIBS) $(RDFGEN_TARGET): $(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) $(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(RDFGEN_LIBS) test: plugins host VAMP_PATH=$(EXAMPLEDIR) $(HOST_TARGET) -l clean: rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS) distclean: clean rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~ # DO NOT DELETE examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/AmplitudeFollower.o: vamp-sdk/RealTime.h examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/SpectralCentroid.o: vamp-sdk/RealTime.h examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/PowerSpectrum.o: vamp-sdk/RealTime.h examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/ZeroCrossing.o: vamp-sdk/RealTime.h examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h examples/plugins.o: examples/FixedTempoEstimator.h examples/plugins.o: examples/AmplitudeFollower.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h host/vamp-simple-host.o: vamp-sdk/Plugin.h host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h sonic-visualiser-3.0.3/vamp-plugin-sdk/build/README.linux0000644000000000000000000000416113111512442021271 0ustar 00000000000000 The Vamp Plugin SDK -- Platform Notes for Linux and other GNU platforms ======================================================================= Building at the command line ---------------------------- To build the SDK, example plugins, and command-line host: $ ./configure $ make To install after a successful make, run "make install" as root (or via sudo). Installing the Example Plugins ------------------------------ To install the example plugins so you can load them in Vamp hosts, copy the files examples/vamp-example-plugins.so and examples/vamp-example-plugins.cat to /usr/local/lib/vamp/ or $HOME/vamp/ Plugin Linkage -------------- Vamp plugins are distributed as dynamic libraries (.so files). A properly packaged Vamp plugin library should export exactly one public symbol, namely the Vamp API entry point vampGetPluginDescriptor. The default for the GNU linker is to export all of the symbols in the library. This will work (the host will be able to load the plugin), but it unnecessarily pollutes the host's symbol namespace, it may cause symbol collisions in some esoteric circumstances, and it increases the amount of time the plugin takes to load. To improve this behaviour, you can instruct the linker to export only the one required symbol using a linker script. To do this, place the text { global: vampGetPluginDescriptor; local: *; }; into a text file, and then use the --version-script option to the linker to tell it to refer to this file. All other symbols will then be properly hidden. The Makefile included in this SDK uses this method to manage symbol visibility for the included example plugins, using the file build/vamp-plugin.map. There are other methods that will work too, but this one is simple and has the advantage of requiring no changes to the code. Test Your Plugins ----------------- The Vamp Plugin Tester is a vital utility which you can use to test your plugins for common problems. It can help you if you're having problems getting your plugin to work at all, and you're strongly advised to use it before you release anything. Download it from the Vamp plugins site now! sonic-visualiser-3.0.3/vamp-plugin-sdk/build/README.msvc0000644000000000000000000000777713111512442021122 0ustar 00000000000000 The Vamp Plugin SDK -- Platform Notes for Visual C++ on Windows =============================================================== This version of the SDK is contains project files for Visual C++ 2013 or newer. You can build the SDK in either 32-bit or 64-bit (x64) mode, but remember that a 32-bit host generally cannot load 64-bit plugins. Visual C++ Projects and Solution Files -------------------------------------- Two Visual C++ solution files are included: - build/VampSDK.sln Builds the plugin SDK and the example plugins. See the VampPluginSDK and VampExamplePlugins projects below. - build/VampHostSDK.sln Builds the host SDK and the simple-host command-line application. See the VampHostSDK and VampSimpleHost projects below. Note that the VampSimpleHost requires the libsndfile library; if you want to build without that, use the VampHostSDK project rather than this solution. Four Visual C++ project files are included: - build/VampPluginSDK.vcxproj This builds the plugin SDK into a single static library, but does not build the example plugins, the host SDK, or the host. (We recommend using static linkage for the SDK rather than distributing it as a DLL, particularly when building plugins.) - build/VampExamplePlugins.vcxproj This builds the example plugins DLL, but does not build the plugin or host SDKs or the host. You don't need to build the plugin SDK before this, because this project simply includes the plugin SDK files rather than using the library. - build/VampHostSDK.vcxproj This builds the host SDK into a single static library, but does not build the plugin SDK, example plugins, or host. - build/VampSimpleHost.vcxproj This builds the simple host command line program. You must have the libsndfile library installed in order to build this project. Of course, when using Visual Studio or another IDE to build a plugin or host using the SDK, you may simply add the .h and .cpp files in the vamp-sdk or vamp-hostsdk directories to your existing project. This is the approach taken in the VampExamplePlugins project. Installing the Example Plugins ------------------------------ To install the example plugins so you can load them in Vamp hosts, copy the files build\release\vamp-example-plugins.dll and examples\vamp-example-plugins.cat to the appropriate location as follows: * For 32-bit plugins running on a 32-bit system, and for 64-bit plugins running on a 64-bit system C:\Program Files\Vamp Plugins * For 32-bit plugins running on a 64-bit system C:\Program Files\Vamp Plugins (x86) You cannot use 64-bit plugins on a 32-bit system. Plugin Linkage -------------- Vamp plugins are distributed as dynamic libraries (DLLs). A properly packaged Vamp plugin DLL should export exactly one public symbol, namely the Vamp API entry point vampGetPluginDescriptor. One nice tidy way to achieve this with Visual Studio is to add the linker option /EXPORT:vampGetPluginDescriptor to your project. (All of the other symbols will be properly hidden, because that is the default for the Visual Studio linker.) The included example plugins project in build/VampExamplePlugins.vcxproj does this. Alternatively, you may modify vamp/vamp.h to add the __declspec(dllexport) attribute to the vampGetPluginDescriptor declaration. This is not present by default, because it isn't portable among compilers and, as we only want one symbol exported, the above linker option works equally well without code changes. (If you don't take at least one of these actions, your plugin library simply will not load in any host.) Using MinGW/Cygwin ------------------ Refer to README.linux for build instructions using the GNU toolchain. Test Your Plugins ----------------- The Vamp Plugin Tester is a vital utility which you can use to test your plugins for common problems. It can help you if you're having problems getting your plugin to work at all, and you're strongly advised to use it before you release anything. Download it from the Vamp plugins site now! sonic-visualiser-3.0.3/vamp-plugin-sdk/build/README.osx0000644000000000000000000000633113111512442020744 0ustar 00000000000000 The Vamp Plugin SDK -- Platform Notes for OS/X ============================================== Prerequisites ------------- You must have Xcode installed, with the command-line build tools (an optional component). You must have libsndfile (http://www.mega-nerd.com/libsndfile/) installed in order to build the command-line host successfully. But you do not need libsndfile if you only want to build plugins. Building at the command line ---------------------------- To build the SDK, example plugins, and command-line host: $ make -f build/Makefile.osx To build only the SDK and example plugins (for example if you do not have libsndfile installed): $ make -f build/Makefile.osx sdk plugins See the comments at the top of Makefile.osx for more information about the libraries and other targets that are built in this way. If you are using an IDE such as Xcode, you may prefer to add the vamp-sdk and src/vamp-sdk (for plugins) or vamp-hostsdk and src/vamp-hostsdk (for hosts) directories to your existing project. If you are using OS/X 10.6 or older, you could try Makefile.osx.106 instead of Makefile.osx. Installing the Example Plugins ------------------------------ To install the example plugins so you can load them in Vamp hosts, copy the files examples/vamp-example-plugins.dylib and examples/vamp-example-plugins.cat to /Library/Audio/Plug-Ins/Vamp/ or $HOME/Library/Audio/Plug-Ins/Vamp/ Plugin Linkage -------------- Vamp plugins are distributed as dynamic libraries (.dylib). An OS/X dynamic library has a formal installed name, which is recorded in the library's header: you will need to ensure that this matches the plugin's filename (e.g. vamp-example-plugins.dylib) by using the -install_name option at link time. The Makefile.osx provided with the SDK contains an example of this. A well-packaged Vamp plugin library should export exactly one public symbol, namely the Vamp API entry point vampGetPluginDescriptor. The default for the OS/X linker is to export all of the symbols in the library. This will work (the host will be able to load the plugin), but it unnecessarily pollutes the host's symbol namespace, it may cause symbol collisions in some esoteric circumstances, and it increases the amount of time the plugin takes to load. To improve this behaviour, you can instruct the linker to export only the one required symbol using a symbols list file. To do this, place the single line _vampGetPluginDescriptor (with leading underscore) into a text file, and then use the -exported_symbols_list option to the linker to tell it to refer to this file. All other symbols will then be properly hidden. The Makefile.osx included in this SDK uses this method to manage symbol visibility for the included example plugins, using the file build/vamp-plugin.list. There are other methods that will work too, but this one is simple and has the advantage of requiring no changes to the code. Test Your Plugins ----------------- The Vamp Plugin Tester is a vital utility which you can use to test your plugins for common problems. It can help you if you're having problems getting your plugin to work at all, and you're strongly advised to use it before you release anything. Download it from the Vamp plugins site now! sonic-visualiser-3.0.3/vamp-plugin-sdk/build/VampExamplePlugins.vcxproj0000644000000000000000000002410313111512442024447 0ustar 00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A} VampExamplePlugins Win32Proj VampExamplePlugins DynamicLibrary v120 DynamicLibrary v120 DynamicLibrary v120 DynamicLibrary v120 <_ProjectFileVersion>10.0.30319.1 Debug\ Debug\ true true Release\ Release\ true true Disabled $(ProjectDir)/..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;VAMPEXAMPLEPLUGINS_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue 4996;%(DisableSpecificWarnings) /EXPORT:vampGetPluginDescriptor %(AdditionalOptions) $(OutDir)vamp-example-plugins.dll true Windows MachineX86 Disabled $(ProjectDir)/..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;VAMPEXAMPLEPLUGINS_EXPORTS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) /EXPORT:vampGetPluginDescriptor %(AdditionalOptions) $(OutDir)vamp-example-plugins.dll true Windows $(ProjectDir)/..;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;VAMPEXAMPLEPLUGINS_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) /EXPORT:vampGetPluginDescriptor %(AdditionalOptions) $(OutDir)vamp-example-plugins.dll true Windows true true MachineX86 $(ProjectDir)/..;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;VAMPEXAMPLEPLUGINS_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) /EXPORT:vampGetPluginDescriptor %(AdditionalOptions) $(OutDir)vamp-example-plugins.dll true Windows true true sonic-visualiser-3.0.3/vamp-plugin-sdk/build/VampHostSDK.sln0000644000000000000000000000576013111512442022102 0ustar 00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VampHostSDK", "VampHostSDK.vcxproj", "{3875EF8B-14E8-4825-B2C1-A8B869C336F5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VampSimpleHost", "VampSimpleHost.vcxproj", "{6F6F2651-E7B2-42B2-8053-556FEB50A552}" ProjectSection(ProjectDependencies) = postProject {3875EF8B-14E8-4825-B2C1-A8B869C336F5} = {3875EF8B-14E8-4825-B2C1-A8B869C336F5} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Debug|Win32.ActiveCfg = Debug|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Debug|Win32.Build.0 = Debug|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Debug|x64.ActiveCfg = Debug|x64 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Debug|x64.Build.0 = Debug|x64 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Release|Mixed Platforms.Build.0 = Release|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Release|Win32.ActiveCfg = Release|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Release|Win32.Build.0 = Release|Win32 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Release|x64.ActiveCfg = Release|x64 {3875EF8B-14E8-4825-B2C1-A8B869C336F5}.Release|x64.Build.0 = Release|x64 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Debug|Win32.ActiveCfg = Debug|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Debug|Win32.Build.0 = Debug|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Debug|x64.ActiveCfg = Debug|x64 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Debug|x64.Build.0 = Debug|x64 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Release|Mixed Platforms.Build.0 = Release|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Release|Win32.ActiveCfg = Release|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Release|Win32.Build.0 = Release|Win32 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Release|x64.ActiveCfg = Release|x64 {6F6F2651-E7B2-42B2-8053-556FEB50A552}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal sonic-visualiser-3.0.3/vamp-plugin-sdk/build/VampHostSDK.vcxproj0000644000000000000000000001774513111512442023007 0ustar 00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {3875EF8B-14E8-4825-B2C1-A8B869C336F5} VampHostSDK Win32Proj StaticLibrary v120 StaticLibrary v120 StaticLibrary v120 StaticLibrary v120 <_ProjectFileVersion>10.0.30319.1 Debug\ Debug\ Release\ Release\ Disabled ..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_USE_MATH_DEFINES;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue Disabled ..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_USE_MATH_DEFINES;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase ..;%(AdditionalIncludeDirectories) WIN32;_USE_MATH_DEFINES;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level2 ProgramDatabase ..;%(AdditionalIncludeDirectories) WIN32;_USE_MATH_DEFINES;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level2 ProgramDatabase sonic-visualiser-3.0.3/vamp-plugin-sdk/build/VampPluginSDK.vcxproj0000644000000000000000000001605013111512442023314 0ustar 00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5} VampPluginSDK Win32Proj StaticLibrary v120 StaticLibrary v120 StaticLibrary v120 StaticLibrary v120 <_ProjectFileVersion>10.0.30319.1 Debug\ Debug\ Release\ Release\ Disabled ..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_USE_MATH_DEFINES;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue Disabled ..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_USE_MATH_DEFINES;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase ..;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_USE_MATH_DEFINES MultiThreadedDLL Level2 ProgramDatabase ..;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_USE_MATH_DEFINES MultiThreadedDLL Level2 ProgramDatabase sonic-visualiser-3.0.3/vamp-plugin-sdk/build/VampSDK.sln0000644000000000000000000000577413111512442021251 0ustar 00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VampPluginSDK", "VampPluginSDK.vcxproj", "{65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VampExamplePlugins", "VampExamplePlugins.vcxproj", "{B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}" ProjectSection(ProjectDependencies) = postProject {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5} = {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Debug|Win32.ActiveCfg = Debug|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Debug|Win32.Build.0 = Debug|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Debug|x64.ActiveCfg = Debug|x64 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Debug|x64.Build.0 = Debug|x64 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Release|Mixed Platforms.Build.0 = Release|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Release|Win32.ActiveCfg = Release|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Release|Win32.Build.0 = Release|Win32 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Release|x64.ActiveCfg = Release|x64 {65EFA7D7-C3CE-4D29-BE96-E27F2B5979A5}.Release|x64.Build.0 = Release|x64 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Debug|Win32.ActiveCfg = Debug|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Debug|Win32.Build.0 = Debug|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Debug|x64.ActiveCfg = Debug|x64 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Debug|x64.Build.0 = Debug|x64 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Release|Mixed Platforms.Build.0 = Release|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Release|Win32.ActiveCfg = Release|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Release|Win32.Build.0 = Release|Win32 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Release|x64.ActiveCfg = Release|x64 {B3D1F5A4-4571-4D20-B184-8ACD03D6C97A}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal sonic-visualiser-3.0.3/vamp-plugin-sdk/build/VampSimpleHost.vcxproj0000644000000000000000000001775013111512442023613 0ustar 00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {6F6F2651-E7B2-42B2-8053-556FEB50A552} Win32Proj VampSimpleHost Application true v120 Unicode Application true v120 MultiByte Application false v120 true Unicode Application false v120 true MultiByte true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) .. Console true Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ..;C:\Program Files\Mega-Nerd\libsndfile\include Console true x64\Debug\VampHostSDK.lib;C:\Program Files\Mega-Nerd\libsndfile\lib\libsndfile-1.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ..;C:\Program Files\Mega-Nerd\libsndfile\include Console true true true Release\VampHostSDK.lib;C:\Program Files\Mega-Nerd\libsndfile\lib\libsndfile-1.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ..;C:\Program Files\Mega-Nerd\libsndfile\include Console true true true x64\Release\VampHostSDK.lib;C:\Program Files\Mega-Nerd\libsndfile\lib\libsndfile-1.lib;%(AdditionalDependencies) sonic-visualiser-3.0.3/vamp-plugin-sdk/build/docker/Dockerfile_v2.7_ubuntu14040000644000000000000000000000202113111512442025174 0ustar 00000000000000FROM ubuntu:14.04 MAINTAINER Chris Cannam RUN apt-get update && \ apt-get install -y \ build-essential \ libsndfile-dev \ git \ mercurial RUN gcc --version RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN git clone --branch vamp-plugin-sdk-v2.7 https://github.com/c4dm/vamp-plugin-sdk RUN hg clone https://code.soundsoftware.ac.uk/hg/vamp-test-plugin WORKDIR vamp-plugin-sdk RUN ./configure && make WORKDIR ../vamp-test-plugin RUN make -f Makefile.linux WORKDIR ../vamp-plugin-sdk RUN test/run-test-plugin-regression.sh RUN mkdir vamp-plugin-sdk-2.7-binaries-amd64-gcc4-linux RUN cp libvamp-sdk.a libvamp-hostsdk.a host/vamp-simple-host rdf/generator/vamp-rdf-template-generator vamp-plugin-sdk-2.7-binaries-amd64-gcc4-linux RUN tar cvzf vamp-plugin-sdk-2.7-binaries-amd64-gcc4-linux.tar.gz vamp-plugin-sdk-2.7-binaries-amd64-gcc4-linux RUN tar cvf output.tar *.tar.gz && cp output.tar .. sonic-visualiser-3.0.3/vamp-plugin-sdk/build/docker/Dockerfile_v2.7_ubuntu16040000644000000000000000000000202113111512442025176 0ustar 00000000000000FROM ubuntu:16.04 MAINTAINER Chris Cannam RUN apt-get update && \ apt-get install -y \ build-essential \ libsndfile-dev \ git \ mercurial RUN gcc --version RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 RUN git clone --branch vamp-plugin-sdk-v2.7 https://github.com/c4dm/vamp-plugin-sdk RUN hg clone https://code.soundsoftware.ac.uk/hg/vamp-test-plugin WORKDIR vamp-plugin-sdk RUN ./configure && make WORKDIR ../vamp-test-plugin RUN make -f Makefile.linux WORKDIR ../vamp-plugin-sdk RUN test/run-test-plugin-regression.sh RUN mkdir vamp-plugin-sdk-2.7-binaries-amd64-gcc5-linux RUN cp libvamp-sdk.a libvamp-hostsdk.a host/vamp-simple-host rdf/generator/vamp-rdf-template-generator vamp-plugin-sdk-2.7-binaries-amd64-gcc5-linux RUN tar cvzf vamp-plugin-sdk-2.7-binaries-amd64-gcc5-linux.tar.gz vamp-plugin-sdk-2.7-binaries-amd64-gcc5-linux RUN tar cvf output.tar *.tar.gz && cp output.tar .. sonic-visualiser-3.0.3/vamp-plugin-sdk/build/docker/build.sh0000755000000000000000000000177013111512442022163 0ustar 00000000000000#!/bin/bash dockerdir=./build/docker if [ ! -d "$dockerdir" ]; then echo "Run this script from the build root" exit 2 fi version="$1" platform="$2" if [ -z "$platform" ] || [ -z "$version" ] || [ -n "$3" ]; then echo "Usage: $0 " echo "where matches the suffix of the Docker file, e.g. ubuntu1604" exit 2 fi set -eu echo "Building for version $version, platform $platform" dockerfile="Dockerfile_v${version}_${platform}" if [ ! -f "$dockerdir/$dockerfile" ]; then echo "No matching docker file $dockerfile found in $dockerdir" exit 1 fi dockertag="cannam/vamp-plugin-sdk-$platform" sudo docker build -t "$dockertag" -f "$dockerdir/$dockerfile" "$dockerdir" outdir="$dockerdir/output" mkdir -p "$outdir" container=$(sudo docker create "$dockertag") sudo docker cp "$container":output.tar "$outdir" sudo docker rm "$container" ( cd "$outdir" ; tar xf output.tar && rm -f output.tar ) echo echo "Done, output directory contains:" ls -ltr "$outdir" sonic-visualiser-3.0.3/vamp-plugin-sdk/build/libvamp-hostsdk.la.in0000644000000000000000000000051713111512442023306 0ustar 00000000000000# libvamp-hostsdk.la - a libtool library file # Generated by libtool (GNU libtool) 2.4.6 # # Please DO NOT delete this file! # It is necessary for linking the library. dlname='%LINK_ABI%' library_names='%LIBNAME% %LINK_ABI% %LINK_DEV%' old_library='%STATIC%' dependency_libs='' current=3 age=7 revision=0 installed=yes libdir='%LIBS%' sonic-visualiser-3.0.3/vamp-plugin-sdk/build/libvamp-sdk.la.in0000644000000000000000000000051313111512442022404 0ustar 00000000000000# libvamp-sdk.la - a libtool library file # Generated by libtool (GNU libtool) 2.4.6 # # Please DO NOT delete this file! # It is necessary for linking the library. dlname='%LINK_ABI%' library_names='%LIBNAME% %LINK_ABI% %LINK_DEV%' old_library='%STATIC%' dependency_libs='' current=2 age=7 revision=0 installed=yes libdir='%LIBS%' sonic-visualiser-3.0.3/vamp-plugin-sdk/build/update-version.sh0000644000000000000000000000716213111512442022560 0ustar 00000000000000#!/bin/bash usage() { echo "Usage: $0 " echo " e.g. $0 2.2" echo " e.g. $0 2.2.1" exit 2; } version=$1 [ -n "$version" ] || usage major=${version%%.*} # 2.3 -> 2, 2.3.1 -> 2 minor=${version#*.} # 2.3 -> 3, 2.3.1 -> 3.1 minor=${minor%.*} # 3 -> 3, 3.1 -> 3 sdkmajor=$major sdkminor=$minor hostmajor=$(($major+1)) # there has been one API change in a minor release hostminor=$minor acs="`echo $version | tr '.' '_'`" echo "Major version = $major, minor version = $minor" echo "SDK current = $sdkmajor, age = $sdkminor" echo "Host SDK current = $hostmajor, age = $hostminor" echo "Version string = $version" echo "acsymbols string = $acs" p="perl -i -p -e" $p 's/(This is version) [^ ]+/$1 '$version'/' \ README $p 's/(AC_INIT\(vamp-plugin-sdk,) [^,]+,/$1 '$version',/' \ configure.ac $p 's/(INSTALL_SDK_LIBNAME\s*=\s*libvamp-sdk.so).*/$1.'$sdkmajor'.'$sdkminor'.0/' \ Makefile.in $p 's/(INSTALL_SDK_LINK_ABI\s*=\s*libvamp-sdk.so).*/$1.'$sdkmajor'/' \ Makefile.in $p 's/(INSTALL_SDK_LIBNAME\s*=\s*libvamp-sdk-dynamic).*.dylib/$1.'$sdkmajor'.'$sdkminor'.0.dylib/' \ Makefile.in $p 's/(INSTALL_SDK_LINK_ABI\s*=\s*libvamp-sdk-dynamic).*.dylib/$1.'$sdkmajor'.dylib/' \ Makefile.in $p 's/(current)=.*/$1='$sdkmajor'/' \ build/libvamp-sdk.la.in $p 's/(age)=.*/$1='$sdkminor'/' \ build/libvamp-sdk.la.in $p 's/(INSTALL_HOSTSDK_LIBNAME\s*=\s*libvamp-hostsdk.so).*/$1.'$hostmajor'.'$hostminor'.0/' \ Makefile.in $p 's/(INSTALL_HOSTSDK_LINK_ABI\s*=\s*libvamp-hostsdk.so).*/$1.'$hostmajor'/' \ Makefile.in $p 's/(INSTALL_HOSTSDK_LIBNAME\s*=\s*libvamp-hostsdk).*.dylib/$1.'$hostmajor'.'$hostminor'.0.dylib/' \ Makefile.in $p 's/(INSTALL_HOSTSDK_LINK_ABI\s*=\s*libvamp-hostsdk).*.dylib/$1.'$hostmajor'.dylib/' \ Makefile.in $p 's/(current)=.*/$1='$hostmajor'/' \ build/libvamp-hostsdk.la.in $p 's/(age)=.*/$1='$hostminor'/' \ build/libvamp-hostsdk.la.in $p 's/(PROJECT_NUMBER[^=]*)=.*/$1= '$version'/' \ build/Doxyfile $p 's/(VAMP_API_VERSION).*/$1 '$major'/' \ vamp/vamp.h $p 's/(VAMP_SDK_VERSION) +"[^"]*"/$1 "'$version'"/' \ vamp-sdk/plugguard.h $p 's/(VAMP_SDK_MAJOR_VERSION).*/$1 '$major'/' \ vamp-sdk/plugguard.h $p 's/(VAMP_SDK_MINOR_VERSION).*/$1 '$minor'/' \ vamp-sdk/plugguard.h $p 's/(VAMP_SDK_VERSION) +"[^"]*"/$1 "'$version'"/' \ vamp-hostsdk/hostguard.h $p 's/(VAMP_SDK_MAJOR_VERSION).*/$1 '$major'/' \ vamp-hostsdk/hostguard.h $p 's/(VAMP_SDK_MINOR_VERSION).*/$1 '$minor'/' \ vamp-hostsdk/hostguard.h $p 's/(VAMP_SDK_MAJOR_VERSION !=) [\d\.]+/$1 '$major'/' \ src/vamp-sdk/FFT.cpp $p 's/(VAMP_SDK_MINOR_VERSION !=) [\d\.]+/$1 '$minor'/' \ src/vamp-sdk/FFT.cpp $p 's/(VAMP_SDK_MAJOR_VERSION !=) [\d\.]+/$1 '$major'/' \ src/vamp-sdk/PluginAdapter.cpp $p 's/(VAMP_SDK_MINOR_VERSION !=) [\d\.]+/$1 '$minor'/' \ src/vamp-sdk/PluginAdapter.cpp $p 's/(VAMP_SDK_MAJOR_VERSION !=) [\d\.]+/$1 '$major'/' \ src/vamp-hostsdk/PluginHostAdapter.cpp $p 's/(VAMP_SDK_MINOR_VERSION !=) [\d\.]+/$1 '$minor'/' \ src/vamp-hostsdk/PluginHostAdapter.cpp for pc in pkgconfig/*.pc.in ; do $p 's/(Version:) .*/$1 '$version'/' $pc done fgrep -q 'libvampsdk_v_'$acs'_present' src/vamp-sdk/acsymbols.c || \ $p 's/^$/\nextern void libvampsdk_v_'$acs'_present(void) { }/' \ src/vamp-sdk/acsymbols.c fgrep -q 'libvamphostsdk_v_'$acs'_present' src/vamp-hostsdk/acsymbols.c || \ $p 's/^$/\nextern void libvamphostsdk_v_'$acs'_present(void) { }/' \ src/vamp-hostsdk/acsymbols.c echo "Done, now check changes with e.g. hg diff" echo "*** Don't forget to update CHANGELOG" echo "*** Don't forget to re-run \"aclocal -I . && autoconf\"" sonic-visualiser-3.0.3/vamp-plugin-sdk/build/vamp-plugin.list0000644000000000000000000000003113111512442022377 0ustar 00000000000000_vampGetPluginDescriptor sonic-visualiser-3.0.3/vamp-plugin-sdk/build/vamp-plugin.map0000644000000000000000000000006213111512442022205 0ustar 00000000000000{ global: vampGetPluginDescriptor; local: *; }; sonic-visualiser-3.0.3/vamp-plugin-sdk/configure0000755000000000000000000043604713111512442020077 0ustar 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for vamp-plugin-sdk 2.7.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='vamp-plugin-sdk' PACKAGE_TARNAME='vamp-plugin-sdk' PACKAGE_VERSION='2.7.1' PACKAGE_STRING='vamp-plugin-sdk 2.7.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="vamp/vamp.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TARGETS SNDFILE_LIBS SNDFILE_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CPP ac_ct_CC CFLAGS CC OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_programs ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR SNDFILE_CFLAGS SNDFILE_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures vamp-plugin-sdk 2.7.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/vamp-plugin-sdk] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of vamp-plugin-sdk 2.7.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-programs enable building of example host and RDF generator [default=yes] Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path SNDFILE_CFLAGS C compiler flags for SNDFILE, overriding pkg-config SNDFILE_LIBS linker flags for SNDFILE, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF vamp-plugin-sdk configure 2.7.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by vamp-plugin-sdk $as_me 2.7.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if pkg-config --modversion vamp-sdk >/dev/null 2>&1; then echo "WARNING: A version of the Vamp plugin SDK is already installed." echo " Expect worries and sorrows if you install a new version" echo " without removing the old one first. (Continuing)" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 $as_echo_n "checking for library containing dlopen... " >&6; } if ${ac_cv_search_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF for ac_lib in '' dl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dlopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_dlopen+:} false; then : break fi done if ${ac_cv_search_dlopen+:} false; then : else ac_cv_search_dlopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 $as_echo "$ac_cv_search_dlopen" >&6; } ac_res=$ac_cv_search_dlopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Check whether --enable-programs was given. if test "${enable_programs+set}" = set; then : enableval=$enable_programs; PROGS_ARGUMENT=$enableval else PROGS_ARGUMENT="yes" fi if test "x$PROGS_ARGUMENT" = "xyes" ; then if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 have_sndfile="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_sndfile="no" else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_sndfile="yes" fi if test "x$have_sndfile" = "xyes" ; then TARGETS="sdk plugins host rdfgen test" else as_fn_error $? "libsndfile not found - cannot build example Vamp host! If you don't want to build the host, configure with --disable-programs." "$LINENO" 5 fi else TARGETS="sdk plugins" fi if test "x$GCC" = "xyes"; then case " $CXXFLAGS " in *[\ \ ]-fPIC\ -Wall[\ \ ]*) ;; *) CXXFLAGS="$CXXFLAGS -fPIC -Wall -Wextra" ;; esac case " $CFLAGS " in *[\ \ ]-fPIC\ -Wall[\ \ ]*) ;; *) CFLAGS="$CFLAGS -fPIC -Wall -Wextra" ;; esac CXXFLAGS="$CXXFLAGS -std=c++98" fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by vamp-plugin-sdk $as_me 2.7.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ vamp-plugin-sdk config.status 2.7.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi sonic-visualiser-3.0.3/vamp-plugin-sdk/configure.ac0000644000000000000000000000331013111512442020435 0ustar 00000000000000 AC_INIT(vamp-plugin-sdk, 2.7.1, cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(vamp/vamp.h) AC_PROG_CXX AC_HEADER_STDC AC_C_BIGENDIAN if pkg-config --modversion vamp-sdk >/dev/null 2>&1; then echo "WARNING: A version of the Vamp plugin SDK is already installed." echo " Expect worries and sorrows if you install a new version" echo " without removing the old one first. (Continuing)" fi AC_SEARCH_LIBS([dlopen],[dl]) dnl See if the user wants to build programs, or just the SDK AC_ARG_ENABLE(programs, [AS_HELP_STRING([--enable-programs], [enable building of example host and RDF generator [default=yes]])], PROGS_ARGUMENT=$enableval, PROGS_ARGUMENT="yes") dnl if the user wants progs, then we need to check for libsndfile if test "x$PROGS_ARGUMENT" = "xyes" ; then PKG_CHECK_MODULES([SNDFILE],[sndfile],have_sndfile="yes",have_sndfile="no") if test "x$have_sndfile" = "xyes" ; then dnl all good, build everything TARGETS="sdk plugins host rdfgen test" else dnl no libsndfile - can't build host! AC_MSG_ERROR([libsndfile not found - cannot build example Vamp host! If you don't want to build the host, configure with --disable-programs.]) fi else dnl user didn't want programs - so we won't build them TARGETS="sdk plugins" fi AC_SUBST(SNDFILE_CFLAGS) AC_SUBST(SNDFILE_LIBS) AC_SUBST(TARGETS) changequote(,)dnl if test "x$GCC" = "xyes"; then case " $CXXFLAGS " in *[\ \ ]-fPIC\ -Wall[\ \ ]*) ;; *) CXXFLAGS="$CXXFLAGS -fPIC -Wall -Wextra" ;; esac case " $CFLAGS " in *[\ \ ]-fPIC\ -Wall[\ \ ]*) ;; *) CFLAGS="$CFLAGS -fPIC -Wall -Wextra" ;; esac CXXFLAGS="$CXXFLAGS -std=c++98" fi changequote([,])dnl AC_SUBST(CXXFLAGS) AC_SUBST(CFLAGS) AC_OUTPUT([Makefile]) sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/AmplitudeFollower.cpp0000644000000000000000000001410313111512442024131 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Dan Stowell. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "AmplitudeFollower.h" #include #include #include #include #include using std::string; using std::vector; using std::cerr; using std::endl; /** * An implementation of SuperCollider's amplitude-follower algorithm * as a simple Vamp plugin. */ AmplitudeFollower::AmplitudeFollower(float inputSampleRate) : Plugin(inputSampleRate), m_stepSize(0), m_previn(0.0f), m_clampcoef(0.01f), m_relaxcoef(0.01f) { } AmplitudeFollower::~AmplitudeFollower() { } string AmplitudeFollower::getIdentifier() const { return "amplitudefollower"; } string AmplitudeFollower::getName() const { return "Amplitude Follower"; } string AmplitudeFollower::getDescription() const { return "Track the amplitude of the audio signal"; } string AmplitudeFollower::getMaker() const { return "Vamp SDK Example Plugins"; } int AmplitudeFollower::getPluginVersion() const { return 1; } string AmplitudeFollower::getCopyright() const { return "Code copyright 2006 Dan Stowell; method from SuperCollider. Freely redistributable (BSD license)"; } bool AmplitudeFollower::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; m_stepSize = std::min(stepSize, blockSize); // Translate the coefficients // from their "convenient" 60dB convergence-time values // to real coefficients m_clampcoef = m_clampcoef==0.0 ? 0.0 : exp(log(0.1)/(m_clampcoef * m_inputSampleRate)); m_relaxcoef = m_relaxcoef==0.0 ? 0.0 : exp(log(0.1)/(m_relaxcoef * m_inputSampleRate)); return true; } void AmplitudeFollower::reset() { m_previn = 0.0f; } AmplitudeFollower::OutputList AmplitudeFollower::getOutputDescriptors() const { OutputList list; OutputDescriptor sca; sca.identifier = "amplitude"; sca.name = "Amplitude"; sca.description = "The peak tracked amplitude for the current processing block"; sca.unit = "V"; sca.hasFixedBinCount = true; sca.binCount = 1; sca.hasKnownExtents = false; sca.isQuantized = false; sca.sampleType = OutputDescriptor::OneSamplePerStep; list.push_back(sca); return list; } AmplitudeFollower::ParameterList AmplitudeFollower::getParameterDescriptors() const { ParameterList list; ParameterDescriptor att; att.identifier = "attack"; att.name = "Attack time"; att.description = "The 60dB convergence time for an increase in amplitude"; att.unit = "s"; att.minValue = 0.0f; att.maxValue = 1.f; att.defaultValue = 0.01f; att.isQuantized = false; list.push_back(att); ParameterDescriptor dec; dec.identifier = "release"; dec.name = "Release time"; dec.description = "The 60dB convergence time for a decrease in amplitude"; dec.unit = "s"; dec.minValue = 0.0f; dec.maxValue = 1.f; dec.defaultValue = 0.01f; dec.isQuantized = false; list.push_back(dec); return list; } void AmplitudeFollower::setParameter(std::string paramid, float newval) { if (paramid == "attack") { m_clampcoef = newval; } else if (paramid == "release") { m_relaxcoef = newval; } } float AmplitudeFollower::getParameter(std::string paramid) const { if (paramid == "attack") { return m_clampcoef; } else if (paramid == "release") { return m_relaxcoef; } return 0.0f; } AmplitudeFollower::FeatureSet AmplitudeFollower::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */) { if (m_stepSize == 0) { cerr << "ERROR: AmplitudeFollower::process: " << "AmplitudeFollower has not been initialised" << endl; return FeatureSet(); } float previn = m_previn; FeatureSet returnFeatures; float val; float peak = 0.0f; for (size_t i = 0; i < m_stepSize; ++i) { val = fabs(inputBuffers[0][i]); if (val < previn) { val = val + (previn - val) * m_relaxcoef; } else { val = val + (previn - val) * m_clampcoef; } if (val > peak) peak = val; previn = val; } m_previn = previn; // Now store the "feature" (peak amp) for this sample Feature feature; feature.hasTimestamp = false; feature.values.push_back(peak); returnFeatures[0].push_back(feature); return returnFeatures; } AmplitudeFollower::FeatureSet AmplitudeFollower::getRemainingFeatures() { return FeatureSet(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/AmplitudeFollower.h0000644000000000000000000000537113111512442023605 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Dan Stowell. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _AMPLITUDE_FOLLOWER_PLUGIN_H_ #define _AMPLITUDE_FOLLOWER_PLUGIN_H_ #include "vamp-sdk/Plugin.h" /** * Example plugin implementing the SuperCollider amplitude follower * function. */ class AmplitudeFollower : public Vamp::Plugin { public: AmplitudeFollower(float inputSampleRate); virtual ~AmplitudeFollower(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const { return TimeDomain; } std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; OutputList getOutputDescriptors() const; ParameterList getParameterDescriptors() const; float getParameter(std::string paramid) const; void setParameter(std::string paramid, float newval); FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: size_t m_stepSize; float m_previn; float m_clampcoef; float m_relaxcoef; }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/FixedTempoEstimator.cpp0000644000000000000000000004447513111512442024446 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "FixedTempoEstimator.h" using std::string; using std::vector; using std::cerr; using std::endl; using Vamp::RealTime; #include #include class FixedTempoEstimator::D // this class just avoids us having to declare any data members in the header { public: D(float inputSampleRate); ~D(); size_t getPreferredStepSize() const { return 64; } size_t getPreferredBlockSize() const { return 256; } ParameterList getParameterDescriptors() const; float getParameter(string id) const; void setParameter(string id, float value); OutputList getOutputDescriptors() const; bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); FeatureSet process(const float *const *, RealTime); FeatureSet getRemainingFeatures(); private: void calculate(); FeatureSet assembleFeatures(); float lag2tempo(int); int tempo2lag(float); float m_inputSampleRate; size_t m_stepSize; size_t m_blockSize; float m_minbpm; float m_maxbpm; float m_maxdflen; float *m_priorMagnitudes; size_t m_dfsize; float *m_df; float *m_r; float *m_fr; float *m_t; size_t m_n; Vamp::RealTime m_start; Vamp::RealTime m_lasttime; }; FixedTempoEstimator::D::D(float inputSampleRate) : m_inputSampleRate(inputSampleRate), m_stepSize(0), m_blockSize(0), m_minbpm(50), m_maxbpm(190), m_maxdflen(10), m_priorMagnitudes(0), m_df(0), m_r(0), m_fr(0), m_t(0), m_n(0) { } FixedTempoEstimator::D::~D() { delete[] m_priorMagnitudes; delete[] m_df; delete[] m_r; delete[] m_fr; delete[] m_t; } FixedTempoEstimator::ParameterList FixedTempoEstimator::D::getParameterDescriptors() const { ParameterList list; ParameterDescriptor d; d.identifier = "minbpm"; d.name = "Minimum estimated tempo"; d.description = "Minimum beat-per-minute value which the tempo estimator is able to return"; d.unit = "bpm"; d.minValue = 10; d.maxValue = 360; d.defaultValue = 50; d.isQuantized = false; list.push_back(d); d.identifier = "maxbpm"; d.name = "Maximum estimated tempo"; d.description = "Maximum beat-per-minute value which the tempo estimator is able to return"; d.defaultValue = 190; list.push_back(d); d.identifier = "maxdflen"; d.name = "Input duration to study"; d.description = "Length of audio input, in seconds, which should be taken into account when estimating tempo. There is no need to supply the plugin with any further input once this time has elapsed since the start of the audio. The tempo estimator may use only the first part of this, up to eight times the slowest beat duration: increasing this value further than that is unlikely to improve results."; d.unit = "s"; d.minValue = 2; d.maxValue = 40; d.defaultValue = 10; list.push_back(d); return list; } float FixedTempoEstimator::D::getParameter(string id) const { if (id == "minbpm") { return m_minbpm; } else if (id == "maxbpm") { return m_maxbpm; } else if (id == "maxdflen") { return m_maxdflen; } return 0.f; } void FixedTempoEstimator::D::setParameter(string id, float value) { if (id == "minbpm") { m_minbpm = value; } else if (id == "maxbpm") { m_maxbpm = value; } else if (id == "maxdflen") { m_maxdflen = value; } } static int TempoOutput = 0; static int CandidatesOutput = 1; static int DFOutput = 2; static int ACFOutput = 3; static int FilteredACFOutput = 4; FixedTempoEstimator::OutputList FixedTempoEstimator::D::getOutputDescriptors() const { OutputList list; OutputDescriptor d; d.identifier = "tempo"; d.name = "Tempo"; d.description = "Estimated tempo"; d.unit = "bpm"; d.hasFixedBinCount = true; d.binCount = 1; d.hasKnownExtents = false; d.isQuantized = false; d.sampleType = OutputDescriptor::VariableSampleRate; d.sampleRate = m_inputSampleRate; d.hasDuration = true; // our returned tempo spans a certain range list.push_back(d); d.identifier = "candidates"; d.name = "Tempo candidates"; d.description = "Possible tempo estimates, one per bin with the most likely in the first bin"; d.unit = "bpm"; d.hasFixedBinCount = false; list.push_back(d); d.identifier = "detectionfunction"; d.name = "Detection Function"; d.description = "Onset detection function"; d.unit = ""; d.hasFixedBinCount = 1; d.binCount = 1; d.hasKnownExtents = true; d.minValue = 0.0; d.maxValue = 1.0; d.isQuantized = false; d.quantizeStep = 0.0; d.sampleType = OutputDescriptor::FixedSampleRate; if (m_stepSize) { d.sampleRate = m_inputSampleRate / m_stepSize; } else { d.sampleRate = m_inputSampleRate / (getPreferredBlockSize()/2); } d.hasDuration = false; list.push_back(d); d.identifier = "acf"; d.name = "Autocorrelation Function"; d.description = "Autocorrelation of onset detection function"; d.hasKnownExtents = false; d.unit = "r"; list.push_back(d); d.identifier = "filtered_acf"; d.name = "Filtered Autocorrelation"; d.description = "Filtered autocorrelation of onset detection function"; d.unit = "r"; list.push_back(d); return list; } bool FixedTempoEstimator::D::initialise(size_t, size_t stepSize, size_t blockSize) { m_stepSize = stepSize; m_blockSize = blockSize; float dfLengthSecs = m_maxdflen; m_dfsize = (dfLengthSecs * m_inputSampleRate) / m_stepSize; m_priorMagnitudes = new float[m_blockSize/2]; m_df = new float[m_dfsize]; for (size_t i = 0; i < m_blockSize/2; ++i) { m_priorMagnitudes[i] = 0.f; } for (size_t i = 0; i < m_dfsize; ++i) { m_df[i] = 0.f; } m_n = 0; return true; } void FixedTempoEstimator::D::reset() { if (!m_priorMagnitudes) return; for (size_t i = 0; i < m_blockSize/2; ++i) { m_priorMagnitudes[i] = 0.f; } for (size_t i = 0; i < m_dfsize; ++i) { m_df[i] = 0.f; } delete[] m_r; m_r = 0; delete[] m_fr; m_fr = 0; delete[] m_t; m_t = 0; m_n = 0; m_start = RealTime::zeroTime; m_lasttime = RealTime::zeroTime; } FixedTempoEstimator::FeatureSet FixedTempoEstimator::D::process(const float *const *inputBuffers, RealTime ts) { FeatureSet fs; if (m_stepSize == 0) { cerr << "ERROR: FixedTempoEstimator::process: " << "FixedTempoEstimator has not been initialised" << endl; return fs; } if (m_n == 0) m_start = ts; m_lasttime = ts; if (m_n == m_dfsize) { // If we have seen enough input, do the estimation and return calculate(); fs = assembleFeatures(); ++m_n; return fs; } // If we have seen more than enough, just discard and return! if (m_n > m_dfsize) return FeatureSet(); float value = 0.f; // m_df will contain an onset detection function based on the rise // in overall power from one spectral frame to the next -- // simplistic but reasonably effective for our purposes. for (size_t i = 1; i < m_blockSize/2; ++i) { float real = inputBuffers[0][i*2]; float imag = inputBuffers[0][i*2 + 1]; float sqrmag = real * real + imag * imag; value += fabsf(sqrmag - m_priorMagnitudes[i]); m_priorMagnitudes[i] = sqrmag; } m_df[m_n] = value; ++m_n; return fs; } FixedTempoEstimator::FeatureSet FixedTempoEstimator::D::getRemainingFeatures() { FeatureSet fs; if (m_n > m_dfsize) return fs; calculate(); fs = assembleFeatures(); ++m_n; return fs; } float FixedTempoEstimator::D::lag2tempo(int lag) { return 60.f / ((lag * m_stepSize) / m_inputSampleRate); } int FixedTempoEstimator::D::tempo2lag(float tempo) { return ((60.f / tempo) * m_inputSampleRate) / m_stepSize; } void FixedTempoEstimator::D::calculate() { if (m_r) { cerr << "FixedTempoEstimator::calculate: calculation already happened?" << endl; return; } if (m_n < m_dfsize / 9 && m_n < (1.0 * m_inputSampleRate) / m_stepSize) { // 1 second cerr << "FixedTempoEstimator::calculate: Input is too short" << endl; return; } // This function takes m_df (the detection function array filled // out in process()) and calculates m_r (the raw autocorrelation) // and m_fr (the filtered autocorrelation from whose peaks tempo // estimates will be taken). int n = m_n; // length of actual df array (m_dfsize is the theoretical max) m_r = new float[n/2]; // raw autocorrelation m_fr = new float[n/2]; // filtered autocorrelation m_t = new float[n/2]; // averaged tempo estimate for each lag value for (int i = 0; i < n/2; ++i) { m_r[i] = 0.f; m_fr[i] = 0.f; m_t[i] = lag2tempo(i); } // Calculate the raw autocorrelation of the detection function for (int i = 0; i < n/2; ++i) { for (int j = i; j < n; ++j) { m_r[i] += m_df[j] * m_df[j - i]; } m_r[i] /= n - i - 1; } // Filter the autocorrelation and average out the tempo estimates float related[] = { 0.5, 2, 4, 8 }; for (int i = 1; i < n/2-1; ++i) { m_fr[i] = m_r[i]; int div = 1; for (int j = 0; j < int(sizeof(related)/sizeof(related[0])); ++j) { // Check for an obvious peak at each metrically related lag int k0 = int(i * related[j] + 0.5); if (k0 >= 0 && k0 < int(n/2)) { int kmax = 0; float kvmax = 0, kvmin = 0; bool have = false; for (int k = k0 - 1; k <= k0 + 1; ++k) { if (k < 0 || k >= n/2) continue; if (!have || (m_r[k] > kvmax)) { kvmax = m_r[k]; kmax = k; } if (!have || (m_r[k] < kvmin)) { kvmin = m_r[k]; } have = true; } // Boost the original lag according to the strongest // value found close to this related lag m_fr[i] += m_r[kmax] / 5; if ((kmax == 0 || m_r[kmax] > m_r[kmax-1]) && (kmax == n/2-1 || m_r[kmax] > m_r[kmax+1]) && kvmax > kvmin * 1.05) { // The strongest value close to the related lag is // also a pretty good looking peak, so use it to // improve our tempo estimate for the original lag m_t[i] = m_t[i] + lag2tempo(kmax) * related[j]; ++div; } } } m_t[i] /= div; // Finally apply a primitive perceptual weighting (to prefer // tempi of around 120-130) float weight = 1.f - fabsf(128.f - lag2tempo(i)) * 0.005; if (weight < 0.f) weight = 0.f; weight = weight * weight * weight; m_fr[i] += m_fr[i] * (weight / 3); } } FixedTempoEstimator::FeatureSet FixedTempoEstimator::D::assembleFeatures() { FeatureSet fs; if (!m_r) return fs; // No autocorrelation: no results Feature feature; feature.hasTimestamp = true; feature.hasDuration = false; feature.label = ""; feature.values.clear(); feature.values.push_back(0.f); char buffer[40]; int n = m_n; for (int i = 0; i < n; ++i) { // Return the detection function in the DF output feature.timestamp = m_start + RealTime::frame2RealTime(i * m_stepSize, m_inputSampleRate); feature.values[0] = m_df[i]; feature.label = ""; fs[DFOutput].push_back(feature); } for (int i = 1; i < n/2; ++i) { // Return the raw autocorrelation in the ACF output, each // value labelled according to its corresponding tempo feature.timestamp = m_start + RealTime::frame2RealTime(i * m_stepSize, m_inputSampleRate); feature.values[0] = m_r[i]; sprintf(buffer, "%.1f bpm", lag2tempo(i)); if (i == n/2-1) feature.label = ""; else feature.label = buffer; fs[ACFOutput].push_back(feature); } float t0 = m_minbpm; // our minimum detected tempo float t1 = m_maxbpm; // our maximum detected tempo int p0 = tempo2lag(t1); int p1 = tempo2lag(t0); std::map candidates; for (int i = p0; i <= p1 && i+1 < n/2; ++i) { if (m_fr[i] > m_fr[i-1] && m_fr[i] > m_fr[i+1]) { // This is a peak in the filtered autocorrelation: stick // it into the map from filtered autocorrelation to lag // index -- this sorts our peaks by filtered acf value candidates[m_fr[i]] = i; } // Also return the filtered autocorrelation in its own output feature.timestamp = m_start + RealTime::frame2RealTime(i * m_stepSize, m_inputSampleRate); feature.values[0] = m_fr[i]; sprintf(buffer, "%.1f bpm", lag2tempo(i)); if (i == p1 || i == n/2-2) feature.label = ""; else feature.label = buffer; fs[FilteredACFOutput].push_back(feature); } if (candidates.empty()) { cerr << "No tempo candidates!" << endl; return fs; } feature.hasTimestamp = true; feature.timestamp = m_start; feature.hasDuration = true; feature.duration = m_lasttime - m_start; // The map contains only peaks and is sorted by filtered acf // value, so the final element in it is our "best" tempo guess std::map::const_iterator ci = candidates.end(); --ci; int maxpi = ci->second; if (m_t[maxpi] > 0) { // This lag has an adjusted tempo from the averaging process: // use it feature.values[0] = m_t[maxpi]; } else { // shouldn't happen -- it would imply that this high value was // not a peak! feature.values[0] = lag2tempo(maxpi); cerr << "WARNING: No stored tempo for index " << maxpi << endl; } sprintf(buffer, "%.1f bpm", feature.values[0]); feature.label = buffer; // Return the best tempo in the main output fs[TempoOutput].push_back(feature); // And return the other estimates (up to the arbitrarily chosen // number of 10 of them) in the candidates output feature.values.clear(); feature.label = ""; while (feature.values.size() < 10) { if (m_t[ci->second] > 0) { feature.values.push_back(m_t[ci->second]); } else { feature.values.push_back(lag2tempo(ci->second)); } if (ci == candidates.begin()) break; --ci; } fs[CandidatesOutput].push_back(feature); return fs; } FixedTempoEstimator::FixedTempoEstimator(float inputSampleRate) : Plugin(inputSampleRate), m_d(new D(inputSampleRate)) { } FixedTempoEstimator::~FixedTempoEstimator() { delete m_d; } string FixedTempoEstimator::getIdentifier() const { return "fixedtempo"; } string FixedTempoEstimator::getName() const { return "Simple Fixed Tempo Estimator"; } string FixedTempoEstimator::getDescription() const { return "Study a short section of audio and estimate its tempo, assuming the tempo is constant"; } string FixedTempoEstimator::getMaker() const { return "Vamp SDK Example Plugins"; } int FixedTempoEstimator::getPluginVersion() const { return 1; } string FixedTempoEstimator::getCopyright() const { return "Code copyright 2008 Queen Mary, University of London. Freely redistributable (BSD license)"; } size_t FixedTempoEstimator::getPreferredStepSize() const { return m_d->getPreferredStepSize(); } size_t FixedTempoEstimator::getPreferredBlockSize() const { return m_d->getPreferredBlockSize(); } bool FixedTempoEstimator::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; return m_d->initialise(channels, stepSize, blockSize); } void FixedTempoEstimator::reset() { return m_d->reset(); } FixedTempoEstimator::ParameterList FixedTempoEstimator::getParameterDescriptors() const { return m_d->getParameterDescriptors(); } float FixedTempoEstimator::getParameter(std::string id) const { return m_d->getParameter(id); } void FixedTempoEstimator::setParameter(std::string id, float value) { m_d->setParameter(id, value); } FixedTempoEstimator::OutputList FixedTempoEstimator::getOutputDescriptors() const { return m_d->getOutputDescriptors(); } FixedTempoEstimator::FeatureSet FixedTempoEstimator::process(const float *const *inputBuffers, RealTime ts) { return m_d->process(inputBuffers, ts); } FixedTempoEstimator::FeatureSet FixedTempoEstimator::getRemainingFeatures() { return m_d->getRemainingFeatures(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/FixedTempoEstimator.h0000644000000000000000000000541413111512442024101 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _FIXED_TEMPO_ESTIMATOR_PLUGIN_H_ #define _FIXED_TEMPO_ESTIMATOR_PLUGIN_H_ #include "vamp-sdk/Plugin.h" /** * Example plugin that estimates the tempo of a short fixed-tempo sample. */ class FixedTempoEstimator : public Vamp::Plugin { public: FixedTempoEstimator(float inputSampleRate); virtual ~FixedTempoEstimator(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const { return FrequencyDomain; } std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; size_t getPreferredStepSize() const; size_t getPreferredBlockSize() const; ParameterList getParameterDescriptors() const; float getParameter(std::string id) const; void setParameter(std::string id, float value); OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: class D; D *m_d; }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/PercussionOnsetDetector.cpp0000644000000000000000000001656313111512442025344 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "PercussionOnsetDetector.h" using std::string; using std::vector; using std::cerr; using std::endl; #include PercussionOnsetDetector::PercussionOnsetDetector(float inputSampleRate) : Plugin(inputSampleRate), m_stepSize(0), m_blockSize(0), m_threshold(3), m_sensitivity(40), m_priorMagnitudes(0), m_dfMinus1(0), m_dfMinus2(0) { } PercussionOnsetDetector::~PercussionOnsetDetector() { delete[] m_priorMagnitudes; } string PercussionOnsetDetector::getIdentifier() const { return "percussiononsets"; } string PercussionOnsetDetector::getName() const { return "Simple Percussion Onset Detector"; } string PercussionOnsetDetector::getDescription() const { return "Detect percussive note onsets by identifying broadband energy rises"; } string PercussionOnsetDetector::getMaker() const { return "Vamp SDK Example Plugins"; } int PercussionOnsetDetector::getPluginVersion() const { return 2; } string PercussionOnsetDetector::getCopyright() const { return "Code copyright 2006 Queen Mary, University of London, after Dan Barry et al 2005. Freely redistributable (BSD license)"; } size_t PercussionOnsetDetector::getPreferredStepSize() const { return 0; } size_t PercussionOnsetDetector::getPreferredBlockSize() const { return 1024; } bool PercussionOnsetDetector::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; m_stepSize = stepSize; m_blockSize = blockSize; m_priorMagnitudes = new float[m_blockSize/2]; for (size_t i = 0; i < m_blockSize/2; ++i) { m_priorMagnitudes[i] = 0.f; } m_dfMinus1 = 0.f; m_dfMinus2 = 0.f; return true; } void PercussionOnsetDetector::reset() { for (size_t i = 0; i < m_blockSize/2; ++i) { m_priorMagnitudes[i] = 0.f; } m_dfMinus1 = 0.f; m_dfMinus2 = 0.f; } PercussionOnsetDetector::ParameterList PercussionOnsetDetector::getParameterDescriptors() const { ParameterList list; ParameterDescriptor d; d.identifier = "threshold"; d.name = "Energy rise threshold"; d.description = "Energy rise within a frequency bin necessary to count toward broadband total"; d.unit = "dB"; d.minValue = 0; d.maxValue = 20; d.defaultValue = 3; d.isQuantized = false; list.push_back(d); d.identifier = "sensitivity"; d.name = "Sensitivity"; d.description = "Sensitivity of peak detector applied to broadband detection function"; d.unit = "%"; d.minValue = 0; d.maxValue = 100; d.defaultValue = 40; d.isQuantized = false; list.push_back(d); return list; } float PercussionOnsetDetector::getParameter(std::string id) const { if (id == "threshold") return m_threshold; if (id == "sensitivity") return m_sensitivity; return 0.f; } void PercussionOnsetDetector::setParameter(std::string id, float value) { if (id == "threshold") { if (value < 0) value = 0; if (value > 20) value = 20; m_threshold = value; } else if (id == "sensitivity") { if (value < 0) value = 0; if (value > 100) value = 100; m_sensitivity = value; } } PercussionOnsetDetector::OutputList PercussionOnsetDetector::getOutputDescriptors() const { OutputList list; OutputDescriptor d; d.identifier = "onsets"; d.name = "Onsets"; d.description = "Percussive note onset locations"; d.unit = ""; d.hasFixedBinCount = true; d.binCount = 0; d.hasKnownExtents = false; d.isQuantized = false; d.sampleType = OutputDescriptor::VariableSampleRate; d.sampleRate = m_inputSampleRate; list.push_back(d); d.identifier = "detectionfunction"; d.name = "Detection Function"; d.description = "Broadband energy rise detection function"; d.binCount = 1; d.isQuantized = true; d.quantizeStep = 1.0; d.sampleType = OutputDescriptor::OneSamplePerStep; list.push_back(d); return list; } PercussionOnsetDetector::FeatureSet PercussionOnsetDetector::process(const float *const *inputBuffers, Vamp::RealTime ts) { if (m_stepSize == 0) { cerr << "ERROR: PercussionOnsetDetector::process: " << "PercussionOnsetDetector has not been initialised" << endl; return FeatureSet(); } int count = 0; for (size_t i = 1; i < m_blockSize/2; ++i) { float real = inputBuffers[0][i*2]; float imag = inputBuffers[0][i*2 + 1]; float sqrmag = real * real + imag * imag; if (m_priorMagnitudes[i] > 0.f) { float diff = 10.f * log10f(sqrmag / m_priorMagnitudes[i]); // std::cout << "i=" << i << ", sqrmag=" << sqrmag << ", prior=" << m_priorMagnitudes[i] << ", diff=" << diff << ", threshold=" << m_threshold << " " << (diff >= m_threshold ? "[*]" : "") << std::endl; if (diff >= m_threshold) ++count; } m_priorMagnitudes[i] = sqrmag; } FeatureSet returnFeatures; Feature detectionFunction; detectionFunction.hasTimestamp = false; detectionFunction.values.push_back(count); returnFeatures[1].push_back(detectionFunction); if (m_dfMinus2 < m_dfMinus1 && m_dfMinus1 >= count && m_dfMinus1 > ((100 - m_sensitivity) * m_blockSize) / 200) { //std::cout << "result at " << ts << "! (count == " << count << ", prev == " << m_dfMinus1 << ")" << std::endl; Feature onset; onset.hasTimestamp = true; onset.timestamp = ts - Vamp::RealTime::frame2RealTime (m_stepSize, int(m_inputSampleRate + 0.5)); returnFeatures[0].push_back(onset); } m_dfMinus2 = m_dfMinus1; m_dfMinus1 = count; return returnFeatures; } PercussionOnsetDetector::FeatureSet PercussionOnsetDetector::getRemainingFeatures() { return FeatureSet(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/PercussionOnsetDetector.h0000644000000000000000000000561713111512442025007 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _PERCUSSION_ONSET_DETECTOR_PLUGIN_H_ #define _PERCUSSION_ONSET_DETECTOR_PLUGIN_H_ #include "vamp-sdk/Plugin.h" /** * Example plugin that detects percussive events. */ class PercussionOnsetDetector : public Vamp::Plugin { public: PercussionOnsetDetector(float inputSampleRate); virtual ~PercussionOnsetDetector(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const { return FrequencyDomain; } std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; size_t getPreferredStepSize() const; size_t getPreferredBlockSize() const; ParameterList getParameterDescriptors() const; float getParameter(std::string id) const; void setParameter(std::string id, float value); OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: size_t m_stepSize; size_t m_blockSize; float m_threshold; float m_sensitivity; float *m_priorMagnitudes; float m_dfMinus1; float m_dfMinus2; }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/PowerSpectrum.cpp0000644000000000000000000001014613111512442023315 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2008 QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "PowerSpectrum.h" using std::string; using std::cerr; using std::endl; #include PowerSpectrum::PowerSpectrum(float inputSampleRate) : Plugin(inputSampleRate), m_blockSize(0) { } PowerSpectrum::~PowerSpectrum() { } string PowerSpectrum::getIdentifier() const { return "powerspectrum"; } string PowerSpectrum::getName() const { return "Simple Power Spectrum"; } string PowerSpectrum::getDescription() const { return "Return the power spectrum of a signal"; } string PowerSpectrum::getMaker() const { return "Vamp SDK Example Plugins"; } int PowerSpectrum::getPluginVersion() const { return 1; } string PowerSpectrum::getCopyright() const { return "Freely redistributable (BSD license)"; } bool PowerSpectrum::initialise(size_t channels, size_t, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; m_blockSize = blockSize; return true; } void PowerSpectrum::reset() { } PowerSpectrum::OutputList PowerSpectrum::getOutputDescriptors() const { OutputList list; OutputDescriptor d; d.identifier = "powerspectrum"; d.name = "Power Spectrum"; d.description = "Power values of the frequency spectrum bins calculated from the input signal"; d.unit = ""; d.hasFixedBinCount = true; if (m_blockSize == 0) { // Just so as not to return "1". This is the bin count that // would result from a block size of 1024, which is a likely // default -- but the host should always set the block size // before querying the bin count for certain. d.binCount = 513; } else { d.binCount = m_blockSize / 2 + 1; } d.hasKnownExtents = false; d.isQuantized = false; d.sampleType = OutputDescriptor::OneSamplePerStep; list.push_back(d); return list; } PowerSpectrum::FeatureSet PowerSpectrum::process(const float *const *inputBuffers, Vamp::RealTime) { FeatureSet fs; if (m_blockSize == 0) { cerr << "ERROR: PowerSpectrum::process: Not initialised" << endl; return fs; } size_t n = m_blockSize / 2 + 1; const float *fbuf = inputBuffers[0]; Feature feature; feature.hasTimestamp = false; feature.values.reserve(n); // optional for (size_t i = 0; i < n; ++i) { double real = fbuf[i * 2]; double imag = fbuf[i * 2 + 1]; feature.values.push_back(real * real + imag * imag); } fs[0].push_back(feature); return fs; } PowerSpectrum::FeatureSet PowerSpectrum::getRemainingFeatures() { return FeatureSet(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/PowerSpectrum.h0000644000000000000000000000533013111512442022761 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _POWER_SPECTRUM_PLUGIN_H_ #define _POWER_SPECTRUM_PLUGIN_H_ #include "vamp-sdk/Plugin.h" /** * Example plugin that returns a power spectrum calculated (trivially) * from the frequency domain representation of each block of audio. * This is one of the simplest possible Vamp plugins, included as an * example of how to return the appropriate value structure for this * sort of visualisation. */ class PowerSpectrum : public Vamp::Plugin { public: PowerSpectrum(float inputSampleRate); virtual ~PowerSpectrum(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const { return FrequencyDomain; } std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: size_t m_blockSize; }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/SpectralCentroid.cpp0000644000000000000000000001152413111512442023744 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "SpectralCentroid.h" using std::string; using std::vector; using std::cerr; using std::endl; #include #ifdef __SUNPRO_CC #include #define isinf(x) (!finite(x)) #endif #ifdef WIN32 #define isnan(x) false #define isinf(x) false #endif SpectralCentroid::SpectralCentroid(float inputSampleRate) : Plugin(inputSampleRate), m_stepSize(0), m_blockSize(0) { } SpectralCentroid::~SpectralCentroid() { } string SpectralCentroid::getIdentifier() const { return "spectralcentroid"; } string SpectralCentroid::getName() const { return "Spectral Centroid"; } string SpectralCentroid::getDescription() const { return "Calculate the centroid frequency of the spectrum of the input signal"; } string SpectralCentroid::getMaker() const { return "Vamp SDK Example Plugins"; } int SpectralCentroid::getPluginVersion() const { return 2; } string SpectralCentroid::getCopyright() const { return "Freely redistributable (BSD license)"; } bool SpectralCentroid::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; m_stepSize = stepSize; m_blockSize = blockSize; return true; } void SpectralCentroid::reset() { } SpectralCentroid::OutputList SpectralCentroid::getOutputDescriptors() const { OutputList list; OutputDescriptor d; d.identifier = "logcentroid"; d.name = "Log Frequency Centroid"; d.description = "Centroid of the log weighted frequency spectrum"; d.unit = "Hz"; d.hasFixedBinCount = true; d.binCount = 1; d.hasKnownExtents = false; d.isQuantized = false; d.sampleType = OutputDescriptor::OneSamplePerStep; list.push_back(d); d.identifier = "linearcentroid"; d.name = "Linear Frequency Centroid"; d.description = "Centroid of the linear frequency spectrum"; list.push_back(d); return list; } SpectralCentroid::FeatureSet SpectralCentroid::process(const float *const *inputBuffers, Vamp::RealTime) { if (m_stepSize == 0) { cerr << "ERROR: SpectralCentroid::process: " << "SpectralCentroid has not been initialised" << endl; return FeatureSet(); } double numLin = 0.0, numLog = 0.0, denom = 0.0; for (size_t i = 1; i <= m_blockSize/2; ++i) { double freq = (double(i) * m_inputSampleRate) / m_blockSize; double real = inputBuffers[0][i*2]; double imag = inputBuffers[0][i*2 + 1]; double scalemag = sqrt(real * real + imag * imag) / (m_blockSize/2); numLin += freq * scalemag; numLog += log10f(freq) * scalemag; denom += scalemag; } FeatureSet returnFeatures; if (denom != 0.0) { float centroidLin = float(numLin / denom); float centroidLog = powf(10, float(numLog / denom)); Feature feature; feature.hasTimestamp = false; if (!isnan(centroidLog) && !isinf(centroidLog)) { feature.values.push_back(centroidLog); } returnFeatures[0].push_back(feature); feature.values.clear(); if (!isnan(centroidLin) && !isinf(centroidLin)) { feature.values.push_back(centroidLin); } returnFeatures[1].push_back(feature); } return returnFeatures; } SpectralCentroid::FeatureSet SpectralCentroid::getRemainingFeatures() { return FeatureSet(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/SpectralCentroid.h0000644000000000000000000000511113111512442023404 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _SPECTRAL_CENTROID_PLUGIN_H_ #define _SPECTRAL_CENTROID_PLUGIN_H_ #include "vamp-sdk/Plugin.h" /** * Example plugin that calculates the centre of gravity of the * frequency domain representation of each block of audio. */ class SpectralCentroid : public Vamp::Plugin { public: SpectralCentroid(float inputSampleRate); virtual ~SpectralCentroid(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const { return FrequencyDomain; } std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: size_t m_stepSize; size_t m_blockSize; }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/ZeroCrossing.cpp0000644000000000000000000001122013111512442023117 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "ZeroCrossing.h" using std::string; using std::vector; using std::cerr; using std::endl; #include #include ZeroCrossing::ZeroCrossing(float inputSampleRate) : Plugin(inputSampleRate), m_stepSize(0), m_previousSample(0.0f) { } ZeroCrossing::~ZeroCrossing() { } string ZeroCrossing::getIdentifier() const { return "zerocrossing"; } string ZeroCrossing::getName() const { return "Zero Crossings"; } string ZeroCrossing::getDescription() const { return "Detect and count zero crossing points"; } string ZeroCrossing::getMaker() const { return "Vamp SDK Example Plugins"; } int ZeroCrossing::getPluginVersion() const { return 2; } string ZeroCrossing::getCopyright() const { return "Freely redistributable (BSD license)"; } bool ZeroCrossing::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; m_stepSize = std::min(stepSize, blockSize); return true; } void ZeroCrossing::reset() { m_previousSample = 0.0f; } ZeroCrossing::OutputList ZeroCrossing::getOutputDescriptors() const { OutputList list; OutputDescriptor zc; zc.identifier = "counts"; zc.name = "Zero Crossing Counts"; zc.description = "The number of zero crossing points per processing block"; zc.unit = "crossings"; zc.hasFixedBinCount = true; zc.binCount = 1; zc.hasKnownExtents = false; zc.isQuantized = true; zc.quantizeStep = 1.0; zc.sampleType = OutputDescriptor::OneSamplePerStep; list.push_back(zc); zc.identifier = "zerocrossings"; zc.name = "Zero Crossings"; zc.description = "The locations of zero crossing points"; zc.unit = ""; zc.hasFixedBinCount = true; zc.binCount = 0; zc.sampleType = OutputDescriptor::VariableSampleRate; zc.sampleRate = m_inputSampleRate; list.push_back(zc); return list; } ZeroCrossing::FeatureSet ZeroCrossing::process(const float *const *inputBuffers, Vamp::RealTime timestamp) { if (m_stepSize == 0) { cerr << "ERROR: ZeroCrossing::process: " << "ZeroCrossing has not been initialised" << endl; return FeatureSet(); } float prev = m_previousSample; size_t count = 0; FeatureSet returnFeatures; for (size_t i = 0; i < m_stepSize; ++i) { float sample = inputBuffers[0][i]; bool crossing = false; if (sample <= 0.0) { if (prev > 0.0) crossing = true; } else if (sample > 0.0) { if (prev <= 0.0) crossing = true; } if (crossing) { ++count; Feature feature; feature.hasTimestamp = true; feature.timestamp = timestamp + Vamp::RealTime::frame2RealTime(i, (size_t)m_inputSampleRate); returnFeatures[1].push_back(feature); } prev = sample; } m_previousSample = prev; Feature feature; feature.hasTimestamp = false; feature.values.push_back(float(count)); returnFeatures[0].push_back(feature); return returnFeatures; } ZeroCrossing::FeatureSet ZeroCrossing::getRemainingFeatures() { return FeatureSet(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/ZeroCrossing.h0000644000000000000000000000504613111512442022575 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _ZERO_CROSSING_PLUGIN_H_ #define _ZERO_CROSSING_PLUGIN_H_ #include "vamp-sdk/Plugin.h" /** * Example plugin that calculates the positions and density of * zero-crossing points in an audio waveform. */ class ZeroCrossing : public Vamp::Plugin { public: ZeroCrossing(float inputSampleRate); virtual ~ZeroCrossing(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const { return TimeDomain; } std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: size_t m_stepSize; float m_previousSample; }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/plugins.cpp0000644000000000000000000000542113111512442022157 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "vamp/vamp.h" #include "vamp-sdk/PluginAdapter.h" #include "ZeroCrossing.h" #include "SpectralCentroid.h" #include "PercussionOnsetDetector.h" #include "FixedTempoEstimator.h" #include "AmplitudeFollower.h" #include "PowerSpectrum.h" static Vamp::PluginAdapter zeroCrossingAdapter; static Vamp::PluginAdapter spectralCentroidAdapter; static Vamp::PluginAdapter percussionOnsetAdapter; static Vamp::PluginAdapter fixedTempoAdapter; static Vamp::PluginAdapter amplitudeAdapter; static Vamp::PluginAdapter powerSpectrum; const VampPluginDescriptor *vampGetPluginDescriptor(unsigned int version, unsigned int index) { if (version < 1) return 0; switch (index) { case 0: return zeroCrossingAdapter.getDescriptor(); case 1: return spectralCentroidAdapter.getDescriptor(); case 2: return percussionOnsetAdapter.getDescriptor(); case 3: return amplitudeAdapter.getDescriptor(); case 4: return fixedTempoAdapter.getDescriptor(); case 5: return powerSpectrum.getDescriptor(); default: return 0; } } sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/vamp-example-plugins.cat0000644000000000000000000000053613111512442024540 0ustar 00000000000000vamp:vamp-example-plugins:zerocrossing::Low Level Features vamp:vamp-example-plugins:spectralcentroid::Low Level Features vamp:vamp-example-plugins:powerspectrum::Visualisation vamp:vamp-example-plugins:percussiononsets::Time > Onsets vamp:vamp-example-plugins:amplitudefollower::Low Level Features vamp:vamp-example-plugins:fixedtempo::Time > Tempo sonic-visualiser-3.0.3/vamp-plugin-sdk/examples/vamp-example-plugins.n30000644000000000000000000003360513111512442024314 0ustar 00000000000000@prefix rdfs: . @prefix xsd: . @prefix vamp: . @prefix plugbase: . @prefix owl: . @prefix dc: . @prefix af: . @prefix foaf: . @prefix doap: . @prefix cc: . @prefix : <#> . <> a vamp:PluginDescription ; foaf:maker ; foaf:primaryTopic . :maker foaf:name "Vamp SDK Example Plugins" ; foaf:page . :vamp-example-plugins a vamp:PluginLibrary ; vamp:identifier "vamp-example-plugins" ; dc:title "Vamp example plugins" ; dc:description """A set of simple plugins as included with the Vamp developers kit. Amplitude tracker, simple percussion onset detector, tempo estimator, spectral centroid, power spectrum, and zero-crossing counter.""" ; foaf:page ; doap:download-page ; vamp:available_plugin plugbase:amplitudefollower ; vamp:available_plugin plugbase:fixedtempo ; vamp:available_plugin plugbase:percussiononsets ; vamp:available_plugin plugbase:powerspectrum ; vamp:available_plugin plugbase:spectralcentroid ; vamp:available_plugin plugbase:zerocrossing ; foaf:maker :maker ; dc:title "Vamp Example Plugins" ; dc:description """Example plugins from the Vamp Plugin SDK""" ; vamp:has_source true ; vamp:has_binary "linux32" ; vamp:has_binary "linux64" ; vamp:has_binary "osx" ; vamp:has_binary "win32" ; . plugbase:amplitudefollower a vamp:Plugin ; dc:title "Amplitude Follower" ; vamp:name "Amplitude Follower" ; dc:description "Track the amplitude of the audio signal" ; foaf:page ; foaf:maker :maker ; cc:license ; dc:rights "Freely redistributable (BSD license)" ; vamp:identifier "amplitudefollower" ; vamp:vamp_API_version vamp:api_version_2 ; owl:versionInfo "1" ; vamp:input_domain vamp:TimeDomain ; vamp:parameter plugbase:amplitudefollower_param_attack ; vamp:parameter plugbase:amplitudefollower_param_release ; vamp:output plugbase:amplitudefollower_output_amplitude ; . plugbase:amplitudefollower_param_attack a vamp:Parameter ; vamp:identifier "attack" ; dc:title "Attack time" ; dc:format "s" ; vamp:min_value 0 ; vamp:max_value 1 ; vamp:unit "s" ; vamp:default_value 0.01 ; vamp:value_names (); . plugbase:amplitudefollower_param_release a vamp:Parameter ; vamp:identifier "release" ; dc:title "Release time" ; dc:format "s" ; vamp:min_value 0 ; vamp:max_value 1 ; vamp:unit "s" ; vamp:default_value 0.01 ; vamp:value_names (); . plugbase:amplitudefollower_output_amplitude a vamp:DenseOutput ; vamp:identifier "amplitude" ; dc:title "Amplitude" ; dc:description "" ; vamp:fixed_bin_count "true" ; vamp:unit "V" ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:Signal ; . plugbase:fixedtempo a vamp:Plugin ; dc:title "Simple Fixed Tempo Estimator" ; vamp:name "Simple Fixed Tempo Estimator" ; dc:description "Study a short section of audio and estimate its tempo, assuming the tempo is constant" ; foaf:page ; foaf:maker :maker ; cc:license ; dc:rights "Freely redistributable (BSD license)" ; vamp:identifier "fixedtempo" ; vamp:vamp_API_version vamp:api_version_2 ; owl:versionInfo "1" ; vamp:input_domain vamp:FrequencyDomain ; vamp:output plugbase:fixedtempo_output_tempo ; vamp:output plugbase:fixedtempo_output_candidates ; vamp:output plugbase:fixedtempo_output_detectionfunction ; vamp:output plugbase:fixedtempo_output_acf ; vamp:output plugbase:fixedtempo_output_filtered_acf ; . plugbase:fixedtempo_output_tempo a vamp:SparseOutput ; vamp:identifier "tempo" ; dc:title "Tempo" ; dc:description "Estimated tempo" ; vamp:fixed_bin_count "true" ; vamp:unit "bpm" ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:sample_type vamp:VariableSampleRate ; vamp:computes_event_type af:Tempo ; . plugbase:fixedtempo_output_candidates a vamp:SparseOutput ; vamp:identifier "candidates" ; dc:title "Tempo candidates" ; dc:description "Possible tempo estimates, one per bin with the most likely in the first bin" ; vamp:fixed_bin_count "false" ; vamp:unit "bpm" ; vamp:sample_type vamp:VariableSampleRate ; vamp:computes_event_type af:Tempo ; . plugbase:fixedtempo_output_detectionfunction a vamp:DenseOutput ; vamp:identifier "detectionfunction" ; dc:title "Detection Function" ; dc:description "Onset detection function" ; vamp:fixed_bin_count "true" ; vamp:unit "" ; a vamp:KnownExtentsOutput ; vamp:min_value 0 ; vamp:max_value 1 ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:OnsetDetectionFunction ; . plugbase:fixedtempo_output_acf a vamp:DenseOutput ; vamp:identifier "acf" ; dc:title "Autocorrelation Function" ; dc:description "Autocorrelation of onset detection function" ; vamp:fixed_bin_count "true" ; vamp:unit "r" ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:Signal ; . plugbase:fixedtempo_output_filtered_acf a vamp:DenseOutput ; vamp:identifier "filtered_acf" ; dc:title "Filtered Autocorrelation" ; dc:description "Filtered autocorrelation of onset detection function" ; vamp:fixed_bin_count "true" ; vamp:unit "r" ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:Signal ; . plugbase:percussiononsets a vamp:Plugin ; dc:title "Simple Percussion Onset Detector" ; vamp:name "Simple Percussion Onset Detector" ; dc:description "Detect percussive note onsets by identifying broadband energy rises" ; foaf:page ; foaf:maker :maker ; cc:license ; dc:rights "Freely redistributable (BSD license)" ; vamp:identifier "percussiononsets" ; vamp:vamp_API_version vamp:api_version_2 ; owl:versionInfo "2" ; vamp:input_domain vamp:FrequencyDomain ; vamp:parameter plugbase:percussiononsets_param_threshold ; vamp:parameter plugbase:percussiononsets_param_sensitivity ; vamp:output plugbase:percussiononsets_output_onsets ; vamp:output plugbase:percussiononsets_output_detectionfunction ; . plugbase:percussiononsets_param_threshold a vamp:Parameter ; vamp:identifier "threshold" ; dc:title "Energy rise threshold" ; dc:format "dB" ; vamp:min_value 0 ; vamp:max_value 20 ; vamp:unit "dB" ; vamp:default_value 3 ; vamp:value_names (); . plugbase:percussiononsets_param_sensitivity a vamp:Parameter ; vamp:identifier "sensitivity" ; dc:title "Sensitivity" ; dc:format "%" ; vamp:min_value 0 ; vamp:max_value 100 ; vamp:unit "%" ; vamp:default_value 40 ; vamp:value_names (); . plugbase:percussiononsets_output_onsets a vamp:SparseOutput ; vamp:identifier "onsets" ; dc:title "Onsets" ; dc:description "Percussive note onset locations" ; vamp:fixed_bin_count "true" ; vamp:unit "" ; vamp:bin_count 0 ; vamp:bin_names (); vamp:sample_type vamp:VariableSampleRate ; vamp:computes_event_type af:Onset ; . plugbase:percussiononsets_output_detectionfunction a vamp:DenseOutput ; vamp:identifier "detectionfunction" ; dc:title "Detection Function" ; dc:description "Broadband energy rise detection function" ; vamp:fixed_bin_count "true" ; vamp:unit "" ; a vamp:QuantizedOutput ; vamp:quantize_step 1 ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:OnsetDetectionFunction ; . plugbase:powerspectrum a vamp:Plugin ; dc:title "Simple Power Spectrum" ; vamp:name "Simple Power Spectrum" ; dc:description "Return the power spectrum of a signal" ; foaf:page ; foaf:maker :maker ; cc:license ; dc:rights "Freely redistributable (BSD license)" ; vamp:identifier "powerspectrum" ; vamp:vamp_API_version vamp:api_version_2 ; owl:versionInfo "1" ; vamp:input_domain vamp:FrequencyDomain ; vamp:output plugbase:powerspectrum_output_powerspectrum ; . plugbase:powerspectrum_output_powerspectrum a vamp:DenseOutput ; vamp:identifier "powerspectrum" ; dc:title "Power Spectrum" ; dc:description "Power values of the frequency spectrum bins calculated from the input signal" ; vamp:computes_signal_type af:Signal ; . plugbase:spectralcentroid a vamp:Plugin ; dc:title "Spectral Centroid" ; vamp:name "Spectral Centroid" ; dc:description "Calculate the centroid frequency of the spectrum of the input signal" ; foaf:page ; foaf:maker :maker ; cc:license ; dc:rights "Freely redistributable (BSD license)" ; vamp:identifier "spectralcentroid" ; vamp:vamp_API_version vamp:api_version_2 ; owl:versionInfo "2" ; vamp:input_domain vamp:FrequencyDomain ; vamp:output plugbase:spectralcentroid_output_logcentroid ; vamp:output plugbase:spectralcentroid_output_linearcentroid ; . plugbase:spectralcentroid_output_logcentroid a vamp:DenseOutput ; vamp:identifier "logcentroid" ; dc:title "Log Frequency Centroid" ; dc:description "Centroid of the log weighted frequency spectrum" ; vamp:fixed_bin_count "true" ; vamp:unit "Hz" ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:LogFrequencyCentroid ; . plugbase:spectralcentroid_output_linearcentroid a vamp:DenseOutput ; vamp:identifier "linearcentroid" ; dc:title "Linear Frequency Centroid" ; dc:description "Centroid of the linear frequency spectrum" ; vamp:fixed_bin_count "true" ; vamp:unit "Hz" ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:LinearFrequencyCentroid ; . plugbase:zerocrossing a vamp:Plugin ; dc:title "Zero Crossings" ; vamp:name "Zero Crossings" ; dc:description "Detect and count zero crossing points" ; foaf:page ; foaf:maker :maker ; cc:license ; dc:rights "Freely redistributable (BSD license)" ; vamp:identifier "zerocrossing" ; vamp:vamp_API_version vamp:api_version_2 ; owl:versionInfo "2" ; vamp:input_domain vamp:TimeDomain ; vamp:output plugbase:zerocrossing_output_counts ; vamp:output plugbase:zerocrossing_output_zerocrossings ; . plugbase:zerocrossing_output_counts a vamp:DenseOutput ; vamp:identifier "counts" ; dc:title "Zero Crossing Counts" ; dc:description "The number of zero crossing points per processing block" ; vamp:fixed_bin_count "true" ; vamp:unit "crossings" ; a vamp:QuantizedOutput ; vamp:quantize_step 1 ; vamp:bin_count 1 ; vamp:bin_names ( ""); vamp:computes_signal_type af:ZeroCrossingCount ; . plugbase:zerocrossing_output_zerocrossings a vamp:SparseOutput ; vamp:identifier "zerocrossings" ; dc:title "Zero Crossings" ; dc:description "The locations of zero crossing points" ; vamp:fixed_bin_count "true" ; vamp:unit "" ; a vamp:QuantizedOutput ; vamp:quantize_step 1 ; vamp:bin_count 0 ; vamp:bin_names (); vamp:sample_type vamp:VariableSampleRate ; vamp:computes_event_type af:ZeroCrossing ; . sonic-visualiser-3.0.3/vamp-plugin-sdk/host/system.h0000644000000000000000000000432713111512442020632 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _SYSTEM_H_ #define _SYSTEM_H_ #ifdef _WIN32 #include #define DLOPEN(a,b) LoadLibrary((a).c_str()) #define DLSYM(a,b) GetProcAddress((HINSTANCE)(a),(b)) #define DLCLOSE(a) FreeLibrary((HINSTANCE)(a)) #define DLERROR() "" #define PLUGIN_SUFFIX "dll" #else #include #define DLOPEN(a,b) dlopen((a).c_str(),(b)) #define DLSYM(a,b) dlsym((a),(b)) #define DLCLOSE(a) dlclose((a)) #define DLERROR() dlerror() #ifdef __APPLE__ #define PLUGIN_SUFFIX "dylib" #define HAVE_OPENDIR 1 #else #define PLUGIN_SUFFIX "so" #define HAVE_OPENDIR 1 #endif /* __APPLE__ */ #endif /* ! _WIN32 */ #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/host/test-c.c0000644000000000000000000000160513111512442020474 0ustar 00000000000000 #include #include int main(int argc, char **argv) { int i; int libcount = vhGetLibraryCount(); printf("Vamp plugin libraries found:\n"); for (i = 0; i < libcount; ++i) { printf("%d: %s\n", i, vhGetLibraryName(i)); } printf("Going to try loading qm-vamp-plugins...\n"); int libindex = vhGetLibraryIndex("qm-vamp-plugins"); vhLibrary lib = vhLoadLibrary(libindex); if (!lib) { printf("Failure!\n"); return 1; } int plugincount = vhGetPluginCount(lib); printf("Success: it contains %d plugins; they are:\n", plugincount); for (i = 0; i < plugincount; ++i) { const VampPluginDescriptor *descriptor = vhGetPluginDescriptor(lib, i); if (!descriptor) { printf("\n"); } else { printf("%s\n", descriptor->identifier); } } vhUnloadLibrary(lib); return 0; } sonic-visualiser-3.0.3/vamp-plugin-sdk/host/vamp-simple-host.cpp0000644000000000000000000007272713111512442023057 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam, copyright 2007-2008 QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ /* * This "simple" Vamp plugin host is no longer as simple as it was; it * now has a lot of options and includes a lot of code to handle the * various useful listing modes it supports. * * However, the runPlugin function still contains a reasonable * implementation of a fairly generic Vamp plugin host capable of * evaluating a given output on a given plugin for a sound file read * via libsndfile. */ #include #include #include #include #include #include #include #include #include #include "system.h" #include using namespace std; using Vamp::Plugin; using Vamp::PluginHostAdapter; using Vamp::RealTime; using Vamp::HostExt::PluginLoader; using Vamp::HostExt::PluginWrapper; using Vamp::HostExt::PluginInputDomainAdapter; #define HOST_VERSION "1.5" enum Verbosity { PluginIds, PluginOutputIds, PluginInformation, PluginInformationDetailed }; void printFeatures(int, int, const Plugin::OutputDescriptor &, int, const Plugin::FeatureSet &, ofstream *, bool frames); void transformInput(float *, size_t); void fft(unsigned int, bool, double *, double *, double *, double *); void printPluginPath(bool verbose); void printPluginCategoryList(); void enumeratePlugins(Verbosity); void listPluginsInLibrary(string soname); int runPlugin(string myname, string soname, string id, string output, int outputNo, string inputFile, string outfilename, bool frames); void usage(const char *name) { cerr << "\n" << name << ": A command-line host for Vamp audio analysis plugins.\n\n" "Centre for Digital Music, Queen Mary, University of London.\n" "Copyright 2006-2009 Chris Cannam and QMUL.\n" "Freely redistributable; published under a BSD-style license.\n\n" "Usage:\n\n" " " << name << " [-s] pluginlibrary[." << PLUGIN_SUFFIX << "]:plugin[:output] file.wav [-o out.txt]\n" " " << name << " [-s] pluginlibrary[." << PLUGIN_SUFFIX << "]:plugin file.wav [outputno] [-o out.txt]\n\n" " -- Load plugin id \"plugin\" from \"pluginlibrary\" and run it on the\n" " audio data in \"file.wav\", retrieving the named \"output\", or output\n" " number \"outputno\" (the first output by default) and dumping it to\n" " standard output, or to \"out.txt\" if the -o option is given.\n\n" " \"pluginlibrary\" should be a library name, not a file path; the\n" " standard Vamp library search path will be used to locate it. If\n" " a file path is supplied, the directory part(s) will be ignored.\n\n" " If the -s option is given, results will be labelled with the audio\n" " sample frame at which they occur. Otherwise, they will be labelled\n" " with time in seconds.\n\n" " " << name << " -l\n" " " << name << " --list\n\n" " -- List the plugin libraries and Vamp plugins in the library search path\n" " in a verbose human-readable format.\n\n" " " << name << " -L\n" " " << name << " --list-full\n\n" " -- List all data reported by all the Vamp plugins in the library search\n" " path in a very verbose human-readable format.\n\n" " " << name << " --list-ids\n\n" " -- List the plugins in the search path in a terse machine-readable format,\n" " in the form vamp:soname:identifier.\n\n" " " << name << " --list-outputs\n\n" " -- List the outputs for plugins in the search path in a machine-readable\n" " format, in the form vamp:soname:identifier:output.\n\n" " " << name << " --list-by-category\n\n" " -- List the plugins as a plugin index by category, in a machine-readable\n" " format. The format may change in future releases.\n\n" " " << name << " -p\n\n" " -- Print out the Vamp library search path.\n\n" " " << name << " -v\n\n" " -- Display version information only.\n" << endl; exit(2); } int main(int argc, char **argv) { char *scooter = argv[0]; char *name = 0; while (scooter && *scooter) { if (*scooter == '/' || *scooter == '\\') name = ++scooter; else ++scooter; } if (!name || !*name) name = argv[0]; if (argc < 2) usage(name); if (argc == 2) { if (!strcmp(argv[1], "-v")) { cout << "Simple Vamp plugin host version: " << HOST_VERSION << endl << "Vamp API version: " << VAMP_API_VERSION << endl << "Vamp SDK version: " << VAMP_SDK_VERSION << endl; return 0; } else if (!strcmp(argv[1], "-l") || !strcmp(argv[1], "--list")) { printPluginPath(true); enumeratePlugins(PluginInformation); return 0; } else if (!strcmp(argv[1], "-L") || !strcmp(argv[1], "--list-full")) { enumeratePlugins(PluginInformationDetailed); return 0; } else if (!strcmp(argv[1], "-p")) { printPluginPath(false); return 0; } else if (!strcmp(argv[1], "--list-ids")) { enumeratePlugins(PluginIds); return 0; } else if (!strcmp(argv[1], "--list-outputs")) { enumeratePlugins(PluginOutputIds); return 0; } else if (!strcmp(argv[1], "--list-by-category")) { printPluginCategoryList(); return 0; } else usage(name); } if (argc < 3) usage(name); bool useFrames = false; int base = 1; if (!strcmp(argv[1], "-s")) { useFrames = true; base = 2; } string soname = argv[base]; string wavname = argv[base+1]; string plugid = ""; string output = ""; int outputNo = -1; string outfilename; if (argc >= base+3) { int idx = base+2; if (isdigit(*argv[idx])) { outputNo = atoi(argv[idx++]); } if (argc == idx + 2) { if (!strcmp(argv[idx], "-o")) { outfilename = argv[idx+1]; } else usage(name); } else if (argc != idx) { (usage(name)); } } cerr << endl << name << ": Running..." << endl; cerr << "Reading file: \"" << wavname << "\", writing to "; if (outfilename == "") { cerr << "standard output" << endl; } else { cerr << "\"" << outfilename << "\"" << endl; } string::size_type sep = soname.find(':'); if (sep != string::npos) { plugid = soname.substr(sep + 1); soname = soname.substr(0, sep); sep = plugid.find(':'); if (sep != string::npos) { output = plugid.substr(sep + 1); plugid = plugid.substr(0, sep); } } if (plugid == "") { usage(name); } if (output != "" && outputNo != -1) { usage(name); } if (output == "" && outputNo == -1) { outputNo = 0; } return runPlugin(name, soname, plugid, output, outputNo, wavname, outfilename, useFrames); } int runPlugin(string myname, string soname, string id, string output, int outputNo, string wavname, string outfilename, bool useFrames) { PluginLoader *loader = PluginLoader::getInstance(); PluginLoader::PluginKey key = loader->composePluginKey(soname, id); SNDFILE *sndfile; SF_INFO sfinfo; memset(&sfinfo, 0, sizeof(SF_INFO)); sndfile = sf_open(wavname.c_str(), SFM_READ, &sfinfo); if (!sndfile) { cerr << myname << ": ERROR: Failed to open input file \"" << wavname << "\": " << sf_strerror(sndfile) << endl; return 1; } ofstream *out = 0; if (outfilename != "") { out = new ofstream(outfilename.c_str(), ios::out); if (!*out) { cerr << myname << ": ERROR: Failed to open output file \"" << outfilename << "\" for writing" << endl; delete out; return 1; } } Plugin *plugin = loader->loadPlugin (key, sfinfo.samplerate, PluginLoader::ADAPT_ALL_SAFE); if (!plugin) { cerr << myname << ": ERROR: Failed to load plugin \"" << id << "\" from library \"" << soname << "\"" << endl; sf_close(sndfile); if (out) { out->close(); delete out; } return 1; } cerr << "Running plugin: \"" << plugin->getIdentifier() << "\"..." << endl; // Note that the following would be much simpler if we used a // PluginBufferingAdapter as well -- i.e. if we had passed // PluginLoader::ADAPT_ALL to loader->loadPlugin() above, instead // of ADAPT_ALL_SAFE. Then we could simply specify our own block // size, keep the step size equal to the block size, and ignore // the plugin's bleatings. However, there are some issues with // using a PluginBufferingAdapter that make the results sometimes // technically different from (if effectively the same as) the // un-adapted plugin, so we aren't doing that here. See the // PluginBufferingAdapter documentation for details. int blockSize = plugin->getPreferredBlockSize(); int stepSize = plugin->getPreferredStepSize(); if (blockSize == 0) { blockSize = 1024; } if (stepSize == 0) { if (plugin->getInputDomain() == Plugin::FrequencyDomain) { stepSize = blockSize/2; } else { stepSize = blockSize; } } else if (stepSize > blockSize) { cerr << "WARNING: stepSize " << stepSize << " > blockSize " << blockSize << ", resetting blockSize to "; if (plugin->getInputDomain() == Plugin::FrequencyDomain) { blockSize = stepSize * 2; } else { blockSize = stepSize; } cerr << blockSize << endl; } int overlapSize = blockSize - stepSize; sf_count_t currentStep = 0; int finalStepsRemaining = max(1, (blockSize / stepSize) - 1); // at end of file, this many part-silent frames needed after we hit EOF int channels = sfinfo.channels; float *filebuf = new float[blockSize * channels]; float **plugbuf = new float*[channels]; for (int c = 0; c < channels; ++c) plugbuf[c] = new float[blockSize + 2]; cerr << "Using block size = " << blockSize << ", step size = " << stepSize << endl; // The channel queries here are for informational purposes only -- // a PluginChannelAdapter is being used automatically behind the // scenes, and it will take case of any channel mismatch int minch = plugin->getMinChannelCount(); int maxch = plugin->getMaxChannelCount(); cerr << "Plugin accepts " << minch << " -> " << maxch << " channel(s)" << endl; cerr << "Sound file has " << channels << " (will mix/augment if necessary)" << endl; Plugin::OutputList outputs = plugin->getOutputDescriptors(); Plugin::OutputDescriptor od; Plugin::FeatureSet features; int returnValue = 1; int progress = 0; RealTime rt; PluginWrapper *wrapper = 0; RealTime adjustment = RealTime::zeroTime; if (outputs.empty()) { cerr << "ERROR: Plugin has no outputs!" << endl; goto done; } if (outputNo < 0) { for (size_t oi = 0; oi < outputs.size(); ++oi) { if (outputs[oi].identifier == output) { outputNo = oi; break; } } if (outputNo < 0) { cerr << "ERROR: Non-existent output \"" << output << "\" requested" << endl; goto done; } } else { if (int(outputs.size()) <= outputNo) { cerr << "ERROR: Output " << outputNo << " requested, but plugin has only " << outputs.size() << " output(s)" << endl; goto done; } } od = outputs[outputNo]; cerr << "Output is: \"" << od.identifier << "\"" << endl; if (!plugin->initialise(channels, stepSize, blockSize)) { cerr << "ERROR: Plugin initialise (channels = " << channels << ", stepSize = " << stepSize << ", blockSize = " << blockSize << ") failed." << endl; goto done; } wrapper = dynamic_cast(plugin); if (wrapper) { // See documentation for // PluginInputDomainAdapter::getTimestampAdjustment PluginInputDomainAdapter *ida = wrapper->getWrapper(); if (ida) adjustment = ida->getTimestampAdjustment(); } // Here we iterate over the frames, avoiding asking the numframes in case it's streaming input. do { int count; if ((blockSize==stepSize) || (currentStep==0)) { // read a full fresh block if ((count = sf_readf_float(sndfile, filebuf, blockSize)) < 0) { cerr << "ERROR: sf_readf_float failed: " << sf_strerror(sndfile) << endl; break; } if (count != blockSize) --finalStepsRemaining; } else { // otherwise shunt the existing data down and read the remainder. memmove(filebuf, filebuf + (stepSize * channels), overlapSize * channels * sizeof(float)); if ((count = sf_readf_float(sndfile, filebuf + (overlapSize * channels), stepSize)) < 0) { cerr << "ERROR: sf_readf_float failed: " << sf_strerror(sndfile) << endl; break; } if (count != stepSize) --finalStepsRemaining; count += overlapSize; } for (int c = 0; c < channels; ++c) { int j = 0; while (j < count) { plugbuf[c][j] = filebuf[j * sfinfo.channels + c]; ++j; } while (j < blockSize) { plugbuf[c][j] = 0.0f; ++j; } } rt = RealTime::frame2RealTime(currentStep * stepSize, sfinfo.samplerate); features = plugin->process(plugbuf, rt); printFeatures (RealTime::realTime2Frame(rt + adjustment, sfinfo.samplerate), sfinfo.samplerate, od, outputNo, features, out, useFrames); if (sfinfo.frames > 0){ int pp = progress; progress = (int)((float(currentStep * stepSize) / sfinfo.frames) * 100.f + 0.5f); if (progress != pp && out) { cerr << "\r" << progress << "%"; } } ++currentStep; } while (finalStepsRemaining > 0); if (out) cerr << "\rDone" << endl; rt = RealTime::frame2RealTime(currentStep * stepSize, sfinfo.samplerate); features = plugin->getRemainingFeatures(); printFeatures(RealTime::realTime2Frame(rt + adjustment, sfinfo.samplerate), sfinfo.samplerate, od, outputNo, features, out, useFrames); returnValue = 0; done: delete plugin; if (out) { out->close(); delete out; } sf_close(sndfile); return returnValue; } static double toSeconds(const RealTime &time) { return time.sec + double(time.nsec + 1) / 1000000000.0; } void printFeatures(int frame, int sr, const Plugin::OutputDescriptor &output, int outputNo, const Plugin::FeatureSet &features, ofstream *out, bool useFrames) { static int featureCount = -1; if (features.find(outputNo) == features.end()) return; for (size_t i = 0; i < features.at(outputNo).size(); ++i) { const Plugin::Feature &f = features.at(outputNo).at(i); bool haveRt = false; RealTime rt; if (output.sampleType == Plugin::OutputDescriptor::VariableSampleRate) { rt = f.timestamp; haveRt = true; } else if (output.sampleType == Plugin::OutputDescriptor::FixedSampleRate) { int n = featureCount + 1; if (f.hasTimestamp) { n = int(round(toSeconds(f.timestamp) * output.sampleRate)); } rt = RealTime::fromSeconds(double(n) / output.sampleRate); haveRt = true; featureCount = n; } if (useFrames) { int displayFrame = frame; if (haveRt) { displayFrame = RealTime::realTime2Frame(rt, sr); } (out ? *out : cout) << displayFrame; if (f.hasDuration) { displayFrame = RealTime::realTime2Frame(f.duration, sr); (out ? *out : cout) << "," << displayFrame; } (out ? *out : cout) << ":"; } else { if (!haveRt) { rt = RealTime::frame2RealTime(frame, sr); } (out ? *out : cout) << rt.toString(); if (f.hasDuration) { rt = f.duration; (out ? *out : cout) << "," << rt.toString(); } (out ? *out : cout) << ":"; } for (unsigned int j = 0; j < f.values.size(); ++j) { (out ? *out : cout) << " " << f.values[j]; } (out ? *out : cout) << " " << f.label; (out ? *out : cout) << endl; } } void printPluginPath(bool verbose) { if (verbose) { cout << "\nVamp plugin search path: "; } vector path = PluginHostAdapter::getPluginPath(); for (size_t i = 0; i < path.size(); ++i) { if (verbose) { cout << "[" << path[i] << "]"; } else { cout << path[i] << endl; } } if (verbose) cout << endl; } static string header(string text, int level) { string out = '\n' + text + '\n'; for (size_t i = 0; i < text.length(); ++i) { out += (level == 1 ? '=' : level == 2 ? '-' : '~'); } out += '\n'; return out; } void enumeratePlugins(Verbosity verbosity) { PluginLoader *loader = PluginLoader::getInstance(); if (verbosity == PluginInformation) { cout << "\nVamp plugin libraries found in search path:" << endl; } vector plugins = loader->listPlugins(); typedef multimap LibraryMap; LibraryMap libraryMap; for (size_t i = 0; i < plugins.size(); ++i) { string path = loader->getLibraryPathForPlugin(plugins[i]); libraryMap.insert(LibraryMap::value_type(path, plugins[i])); } string prevPath = ""; int index = 0; for (LibraryMap::iterator i = libraryMap.begin(); i != libraryMap.end(); ++i) { string path = i->first; PluginLoader::PluginKey key = i->second; if (path != prevPath) { prevPath = path; index = 0; if (verbosity == PluginInformation) { cout << "\n " << path << ":" << endl; } else if (verbosity == PluginInformationDetailed) { string::size_type ki = i->second.find(':'); string text = "Library \"" + i->second.substr(0, ki) + "\""; cout << "\n" << header(text, 1); } } Plugin *plugin = loader->loadPlugin(key, 48000); if (plugin) { char c = char('A' + index); if (c > 'Z') c = char('a' + (index - 26)); PluginLoader::PluginCategoryHierarchy category = loader->getPluginCategory(key); string catstr; if (!category.empty()) { for (size_t ci = 0; ci < category.size(); ++ci) { if (ci > 0) catstr += " > "; catstr += category[ci]; } } if (verbosity == PluginInformation) { cout << " [" << c << "] [v" << plugin->getVampApiVersion() << "] " << plugin->getName() << ", \"" << plugin->getIdentifier() << "\"" << " [" << plugin->getMaker() << "]" << endl; if (catstr != "") { cout << " > " << catstr << endl; } if (plugin->getDescription() != "") { cout << " - " << plugin->getDescription() << endl; } } else if (verbosity == PluginInformationDetailed) { cout << header(plugin->getName(), 2); cout << " - Identifier: " << key << endl; cout << " - Plugin Version: " << plugin->getPluginVersion() << endl; cout << " - Vamp API Version: " << plugin->getVampApiVersion() << endl; cout << " - Maker: \"" << plugin->getMaker() << "\"" << endl; cout << " - Copyright: \"" << plugin->getCopyright() << "\"" << endl; cout << " - Description: \"" << plugin->getDescription() << "\"" << endl; cout << " - Input Domain: " << (plugin->getInputDomain() == Vamp::Plugin::TimeDomain ? "Time Domain" : "Frequency Domain") << endl; cout << " - Default Step Size: " << plugin->getPreferredStepSize() << endl; cout << " - Default Block Size: " << plugin->getPreferredBlockSize() << endl; cout << " - Minimum Channels: " << plugin->getMinChannelCount() << endl; cout << " - Maximum Channels: " << plugin->getMaxChannelCount() << endl; } else if (verbosity == PluginIds) { cout << "vamp:" << key << endl; } Plugin::OutputList outputs = plugin->getOutputDescriptors(); if (verbosity == PluginInformationDetailed) { Plugin::ParameterList params = plugin->getParameterDescriptors(); for (size_t j = 0; j < params.size(); ++j) { Plugin::ParameterDescriptor &pd(params[j]); cout << "\nParameter " << j+1 << ": \"" << pd.name << "\"" << endl; cout << " - Identifier: " << pd.identifier << endl; cout << " - Description: \"" << pd.description << "\"" << endl; if (pd.unit != "") { cout << " - Unit: " << pd.unit << endl; } cout << " - Range: "; cout << pd.minValue << " -> " << pd.maxValue << endl; cout << " - Default: "; cout << pd.defaultValue << endl; if (pd.isQuantized) { cout << " - Quantize Step: " << pd.quantizeStep << endl; } if (!pd.valueNames.empty()) { cout << " - Value Names: "; for (size_t k = 0; k < pd.valueNames.size(); ++k) { if (k > 0) cout << ", "; cout << "\"" << pd.valueNames[k] << "\""; } cout << endl; } } if (outputs.empty()) { cout << "\n** Note: This plugin reports no outputs!" << endl; } for (size_t j = 0; j < outputs.size(); ++j) { Plugin::OutputDescriptor &od(outputs[j]); cout << "\nOutput " << j+1 << ": \"" << od.name << "\"" << endl; cout << " - Identifier: " << od.identifier << endl; cout << " - Description: \"" << od.description << "\"" << endl; if (od.unit != "") { cout << " - Unit: " << od.unit << endl; } if (od.hasFixedBinCount) { cout << " - Default Bin Count: " << od.binCount << endl; } if (!od.binNames.empty()) { bool have = false; for (size_t k = 0; k < od.binNames.size(); ++k) { if (od.binNames[k] != "") { have = true; break; } } if (have) { cout << " - Bin Names: "; for (size_t k = 0; k < od.binNames.size(); ++k) { if (k > 0) cout << ", "; cout << "\"" << od.binNames[k] << "\""; } cout << endl; } } if (od.hasKnownExtents) { cout << " - Default Extents: "; cout << od.minValue << " -> " << od.maxValue << endl; } if (od.isQuantized) { cout << " - Quantize Step: " << od.quantizeStep << endl; } cout << " - Sample Type: " << (od.sampleType == Plugin::OutputDescriptor::OneSamplePerStep ? "One Sample Per Step" : od.sampleType == Plugin::OutputDescriptor::FixedSampleRate ? "Fixed Sample Rate" : "Variable Sample Rate") << endl; if (od.sampleType != Plugin::OutputDescriptor::OneSamplePerStep) { cout << " - Default Rate: " << od.sampleRate << endl; } cout << " - Has Duration: " << (od.hasDuration ? "Yes" : "No") << endl; } } if (outputs.size() > 1 || verbosity == PluginOutputIds) { for (size_t j = 0; j < outputs.size(); ++j) { if (verbosity == PluginInformation) { cout << " (" << j << ") " << outputs[j].name << ", \"" << outputs[j].identifier << "\"" << endl; if (outputs[j].description != "") { cout << " - " << outputs[j].description << endl; } } else if (verbosity == PluginOutputIds) { cout << "vamp:" << key << ":" << outputs[j].identifier << endl; } } } ++index; delete plugin; } } if (verbosity == PluginInformation || verbosity == PluginInformationDetailed) { cout << endl; } } void printPluginCategoryList() { PluginLoader *loader = PluginLoader::getInstance(); vector plugins = loader->listPlugins(); set printedcats; for (size_t i = 0; i < plugins.size(); ++i) { PluginLoader::PluginKey key = plugins[i]; PluginLoader::PluginCategoryHierarchy category = loader->getPluginCategory(key); Plugin *plugin = loader->loadPlugin(key, 48000); if (!plugin) continue; string catstr = ""; if (category.empty()) catstr = '|'; else { for (size_t j = 0; j < category.size(); ++j) { catstr += category[j]; catstr += '|'; if (printedcats.find(catstr) == printedcats.end()) { std::cout << catstr << std::endl; printedcats.insert(catstr); } } } std::cout << catstr << key << ":::" << plugin->getName() << ":::" << plugin->getMaker() << ":::" << plugin->getDescription() << std::endl; } } sonic-visualiser-3.0.3/vamp-plugin-sdk/pkgconfig/vamp-hostsdk.pc.in0000644000000000000000000000040513111512442023471 0ustar 00000000000000prefix=%PREFIX% exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: vamp-hostsdk Version: 2.7.1 Description: Development library for Vamp audio analysis plugin hosts Libs: -L${libdir} -lvamp-hostsdk -ldl Cflags: -I${includedir} sonic-visualiser-3.0.3/vamp-plugin-sdk/pkgconfig/vamp-sdk.pc.in0000644000000000000000000000036313111512442022576 0ustar 00000000000000prefix=%PREFIX% exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: vamp-sdk Version: 2.7.1 Description: Development library for Vamp audio analysis plugins Libs: -L${libdir} -lvamp-sdk Cflags: -I${includedir} sonic-visualiser-3.0.3/vamp-plugin-sdk/pkgconfig/vamp.pc.in0000644000000000000000000000033613111512442022017 0ustar 00000000000000prefix=%PREFIX% exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: vamp Version: 2.7.1 Description: An API for audio analysis and feature extraction plugins Libs: Cflags: -I${includedir} sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/README0000644000000000000000000000027313111512442017607 0ustar 00000000000000Vamp Ontology/Transform OWL description David Pastor Escuredo with Chris Sutton, Yves Raimond, Chris Cannam Copyright 2008, Centre For Digital Music, Queen Mary, University of London. sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/ToDo0000644000000000000000000000022113111512442017510 0ustar 00000000000000-automatic library URI assignment (not is a bit tricky) -rules to define TrackLevelOutputs and other exceptions -mapping vamp-audio features ... sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/doc/glance.htm0000644000000000000000000000033713111512442021440 0ustar 00000000000000

    Overview of Terms

    An alphabetical index of the ontology terms, divided into classes, properties and individuals. All the terms are hyperlinked to their detailed description for quick reference.

    sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/doc/vamp.html0000644000000000000000000006717413111512442021342 0ustar 00000000000000 Vamp Plugins Ontology

    Overview of Terms

    An alphabetical index of the ontology terms, divided into classes, properties and individuals. All the terms are hyperlinked to their detailed description for quick reference.

    Classes

    Class: vamp:Configuration - unstable -

    Configuration - For extension (SV implementation of Transform).

    [back to top]


    in-range-of:program

    Class: vamp:DenseOutput - unstable -

    DenseOutput - Specific output type comprising large binary data (e.g.: chromagram).

    [back to top]


    sub-class-of:PluginOutput

    Class: vamp:Feature - deprecated -

    Feature - This may be removed mighty soon as we rely on the Audio Features Ontology for this

    [back to top]


    Class: vamp:InputDomain - stable -

    InputDomain - Plugins warn about the input domain they require so the host can convert properly the input data. Note that this is not necessary if the host is using a PluginAdapter to wrap plugins (see Vamp doc).

    [back to top]


    in-range-of:input_domain

    Class: vamp:Parameter - unstable -

    Parameter - Parameter used by the plugin transform to set up the plugin. The parameter class instances should be instantiated according to the specific vamp:PluginDescriptor instance for each plugin.

    [back to top]


    in-range-of:parameter
    in-domain-of:value parameter_descriptor

    Class: vamp:ParameterDescriptor - stable -

    ParameterDescriptor - Descriptior of a plugin parameter. Hosts require to know about the specific type and form of the parameters of a particular plugin for a correct transform setup.

    [back to top]


    in-range-of:default_value min_value max_value parameter_descriptor
    in-domain-of:quantized_step unit identifier

    Class: vamp:Plugin - stable -

    Plugin - Vamp plugin is an implementation of a feature extraction algorithm based on the Vamp API.

    [back to top]


    in-range-of:engine available_plugin
    in-domain-of:input_domain output_descriptor parameter_descriptor plugin_description

    Class: vamp:PluginDescription - unstable -

    PluginDescription - The plugin descriptor provides basic metadata of the plugin. We may remove this and link directly to the plugin instance.

    [back to top]


    in-range-of:plugin_description
    in-domain-of:vamp_API_version name identifier

    Class: vamp:PluginLibrary - stable -

    PluginLibrary - Library of Vamp Plugins. This may need to include rights.

    [back to top]


    in-domain-of:available_plugin

    Class: vamp:PluginOutput - unstable -

    PluginOutput - Descriptior of the plugin output. This descriptor provides necessary information to interpret correctly the output features. The output type will determine how to read the temporal information of the extracted feature and how to manage the burden of ouput data.

    [back to top]


    in-range-of:min_value max_value output_descriptor
    in-domain-of:computes_feature_type sample_type bin_names bin_count quantized_step sample_rate unit fixed_bin_count identifier

    Class: vamp:PluginProgram - unstable -

    PluginProgram - Plugin program defines a predefined context of parameters. We may not need a concept for this and just a property linking a string representing the program name.

    [back to top]


    in-range-of:program
    in-domain-of:identifier

    Class: vamp:SampleType - stable -

    SampleType - Sample type specifies the temporal information of the plugin output. This information should be confronted with the output type for a correct interpretation.

    [back to top]


    in-range-of:sample_type

    Class: vamp:SparseOutput - unstable -

    SparseOutput - Specific output type used in sparse data outputs (e.g.: key detector).

    [back to top]


    sub-class-of:PluginOutput

    Class: vamp:TrackLevelOutput - unstable -

    TrackLevelOutput - Specific output type that returns track level information. This sort of output will require a "hacky" interpretation of the feature timestamp as it will reflect some track metadata instead of temporal data.

    [back to top]


    sub-class-of:PluginOutput

    Class: vamp:Transform - stable -

    Transform - The Transform defines the environment of any audio processing computation.

    [back to top]


    in-domain-of:duration start window_type transform_type block_size step_size parameter program engine sample_rate identifier

    Class: vamp:TransformType - unstable -

    TransformType - Specifies the type of transform. May be feature extraction, effect...

    [back to top]


    Properties

    Property: vamp:available_plugin - stable -

    available_plugin - Available plugins in the library

    Domain: PluginLibrary
    Range: Plugin

    Property: vamp:bin_count - unstable -

    bin_count - Number of elements of the bin output. This information is necessary to define the output as belonging to a specific subclass of Plugin Output.

    Domain: PluginOutput
    Range:

    Property: vamp:bin_names - unstable -

    bin_names - List of bin names if available

    Domain: PluginOutput
    Range:

    Property: vamp:block_size - stable -

    block_size - Specifies the block size for the framing.

    Domain: Transform
    Range:

    Property: vamp:computes_feature_type - unstable -

    computes_feature_type - Feature Types output by the plugin. Links the vamp ontology to the audio features ontology.

    Domain: PluginOutput
    Range: af:AudioFeature

    Property: vamp:default_value - unstable -

    default_value - Default value of the parameter

    Domain:
    Range: ParameterDescriptor

    Property: vamp:duration - unstable -

    duration - Specifies temporal information when processing a data stream.

    Domain: Transform
    Range:

    Property: vamp:engine - stable -

    engine - Specifies the plugin in execution. This is an extension to use Transform with other plugin libraries

    Domain: Transform
    Range: Plugin

    Property: vamp:fixed_bin_count - unstable -

    fixed_bin_count - Fixed bin count. A boolean type.

    Domain: PluginOutput
    Range:

    Property: vamp:identifier - stable -

    identifier - Machine-readable identifier for Vamp plugin classes (and Transform).

    Domain: Transform ParameterDescriptor PluginOutput PluginProgram PluginDescription
    Range:

    Property: vamp:input_domain - stable -

    input_domain - Input domain allowed by the plugin (time or frequency).

    Domain: Plugin
    Range: InputDomain

    Property: vamp:max_value - unstable -

    max_value - Maximum value of the parameter range

    Domain:
    Range: PluginOutput ParameterDescriptor

    Property: vamp:min_value - unstable -

    min_value - Minimum value of the parameter range

    Domain:
    Range: PluginOutput ParameterDescriptor

    Property: vamp:name - stable -

    name - Human-readable identifier for the plugin.

    Domain: PluginDescription
    Range:

    Property: vamp:output_descriptor - stable -

    output_descriptor - Links each output type to the plugin.

    Domain: Plugin
    Range: PluginOutput

    Property: vamp:parameter - stable -

    parameter - Specifies the parameter to set the plugin in execution.

    Domain: Transform
    Range: Parameter

    Property: vamp:parameter_descriptor - stable -

    parameter_descriptor - Links each parameter descriptor to the plugin.

    Domain: Parameter Plugin
    Range: ParameterDescriptor

    Property: vamp:parameter_descriptor - stable -

    parameter_descriptor - Specifies exactly the type of descriptor to set in the transform by linking it.

    Domain: Parameter Plugin
    Range: ParameterDescriptor

    Property: vamp:plugin_description - stable -

    plugin_description - Links the plugin descriptor to the plugin (it may be redundant for an RDF decription to have a plugin descriptor in between an actual plugin and its properties).

    Domain: Plugin
    Range: PluginDescription

    Property: vamp:program - stable -

    program - Extension for configuration.

    Domain: Transform
    Range: Configuration PluginProgram

    Property: vamp:program - stable -

    program - Specifies the program to set the plugin in execution. Here the plugin program matches with the one in the plugin descriptor. There is not descriptor required for the program (just a string), is it?

    Domain: Transform
    Range: Configuration PluginProgram

    Property: vamp:quantized_step - unstable -

    quantized_step - Quantized step (if any). We do not include isQuantized.

    Domain: ParameterDescriptor PluginOutput
    Range:

    Property: vamp:sample_rate - stable -

    sample_rate - Specifies the sample rate if it is not constant.

    Domain: Transform PluginOutput
    Range:

    Property: vamp:sample_rate - stable -

    sample_rate - Sample rate of the output if any. Should be read depending on SampleType and Output classes.

    Domain: Transform PluginOutput
    Range:

    Property: vamp:sample_rate - unstable -

    sample_rate - Specifies the sample rate if it is not constant.

    Domain: Transform PluginOutput
    Range:

    Property: vamp:sample_rate - unstable -

    sample_rate - Sample rate of the output if any. Should be read depending on SampleType and Output classes.

    Domain: Transform PluginOutput
    Range:

    Property: vamp:sample_type - unstable -

    sample_type - The sample type specifies the temporal information of the output.

    Domain: PluginOutput
    Range: SampleType

    Property: vamp:start - unstable -

    start - Specifies temporal information when processing a data stream.

    Domain: Transform
    Range:

    Property: vamp:step_size - stable -

    step_size - Specifies the step size for the framing.

    Domain: Transform
    Range:

    Property: vamp:transform_type - unstable -

    transform_type - Specifies the transform type (we could do this by subclassin transform instead of using a property).

    Domain: Transform
    Range:

    Property: vamp:unit - unstable -

    unit - Unit of the output/parameter. A string type

    Domain: ParameterDescriptor PluginOutput
    Range:

    Property: vamp:value - stable -

    value - Specifies the current value of the parameter.

    Domain: Parameter
    Range:

    Property: vamp:vamp_API_version - stable -

    vamp_API_version - Version of the Vamp API used to implement this plugin.

    Domain: PluginDescription
    Range:

    Property: vamp:window_type - unstable -

    window_type - Specifies the window type (they should be individuals and clearly not here).

    Domain: Transform
    Range:

    Individuals

    Individual: Effect -

    Effect - Effect transform. This may be just a subclass of Transform...
    Class: vamp:TransformType

    Individual: FeatureExtraction -

    Feature Extraction - Feature extraction transform. This may be just a subclass of Transform...
    Class: vamp:TransformType
    sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/doc/vamp.pl0000644000000000000000000000165313111512442020777 0ustar 00000000000000:- use_module('../../../motools/mo/ontospec/onto_spec'). :- use_module(library('semweb/rdf_db')). :- use_module(library('semweb/rdf_turtle')). :- rdf_load('../vamp.rdf'). :- rdf_db:rdf_register_ns(vamp,'http://purl.org/ontology/vamp/'). author_name(''). author_foaf(''). page_title('Vamp Plugins Ontology'). output('vamp.html'). :- output(Output), open(Output,write,Otp), header(Header), write(Otp,Header), open('../doc/glance.htm',read,GlanceIntro), copy_stream_data(GlanceIntro, Otp), glance_html_desc(Glance), write(Otp,Glance), write(Otp,'

    Classes

    '), classes_html_desc(Classes), write(Otp,Classes), write(Otp,'

    Properties

    '), props_html_desc(Props), write(Otp,Props), write(Otp,'

    Individuals

    '), inds_html_desc(Inds), write(Otp,Inds), deprecs_html_desc(Deprecs), write(Otp,Deprecs), close(Otp), rdf_db:rdf_retractall(_,_,_). :- halt. sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/generator/vamp-rdf-template-generator.cpp0000644000000000000000000004211713111512442026735 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include #include #include #include #include #include #include #include #include #include #include #include #include using std::cout; using std::cin; using std::cerr; using std::getline; using std::endl; using std::string; using std::vector; using std::ofstream; using std::ios; using Vamp::HostExt::PluginLoader; using Vamp::Plugin; string programURI = "http://vamp-plugins.org/rdf/template-generator"; void usage() { cerr << endl; cerr << "vamp-rdf-template-generator: Create a skeleton RDF description file describing" << endl; cerr << "a Vamp plugin library using the Vamp ontology." << endl; cerr << endl; cerr << "Usage:" << endl; cerr << " vamp-rdf-template-generator -i vamp:soname[:plugin] [vamp:soname[:plugin] ...]" << endl; cerr << " vamp-rdf-template-generator PLUGIN_BASE_URI [ -m YOUR_URI ] [vamp:]soname[:plugin] [[vamp:]soname[:plugin] ...]" << endl; cerr << endl; cerr << "Example:" << endl; cerr << " vamp-rdf-template-generator http://vamp-plugins.org/rdf/plugins/ vamp-example-plugins" << endl; cerr << endl; exit(2); } template inline string to_string (const T& t) { std::stringstream ss; ss << t; return ss.str(); } string describe_namespaces(string pluginBundleBaseURI, string libname) { string res=\ "@prefix rdfs: .\n\ @prefix xsd: .\n\ @prefix vamp: .\n\ @prefix plugbase: <"+pluginBundleBaseURI+libname+"#> .\n\ @prefix owl: .\n\ @prefix dc: .\n\ @prefix af: .\n\ @prefix foaf: .\n\ @prefix doap: .\n\ @prefix cc: .\n\ @prefix : <#> .\n\n"; return res; } string describe_doc(string describerURI, string pluginBundleBaseURI, string libname) { string res = "\n## Properties of this document\n\n\ <> a vamp:PluginDescription ;\n"; if (describerURI != "") { res += " foaf:maker <"+describerURI+"> ;\n"; } res += "\ foaf:maker <"+programURI+"> ;\n\ foaf:primaryTopic <"+pluginBundleBaseURI+libname+"> .\n\n"; return res; } bool have_multiple_makers(vector plugins) { string firstMaker = ""; for (size_t i = 0; i < plugins.size(); ++i) { if (i == 0) { firstMaker = plugins[i]->getMaker(); } else if (plugins[i]->getMaker() != firstMaker) { return true; } } return false; } string describe_maker(vector plugins, bool multipleMakers) { string res = "\n## Maker of the whole plugin library\n\n\ :library_maker\n"; if (!multipleMakers) { string name; if (!plugins.empty()) { name = plugins[0]->getMaker(); } res += "\ foaf:name \"" + name + "\" ;\n\ # foaf:page <> ; # Place maker's homepage URL in here and uncomment\n\ # foaf:logo <> ; # URL of an image here, if you happen to have a logo\n"; } else { res += "\ foaf:name \"Multiple makers\" ;\n"; } res += " .\n\n"; return res; } string describe_library(string libname, vector plugins) { string res = "\n## Properties of the plugin library, and references to the plugins it contains\n\n\ plugbase:library a vamp:PluginLibrary ;\n\ vamp:identifier \""+libname+"\" ;\n\ foaf:maker :library_maker"; for (size_t i = 0; i < plugins.size(); ++i) { res += " ; \n\ vamp:available_plugin plugbase:"+plugins[i]->getIdentifier(); } res += " ; \n\ # dc:title \"\" ; # Place library name here and uncomment\n\ # dc:description \"\" ; # Place library description here and uncomment\n\ # foaf:page <> ; # Place more-info HTML page URL here and uncomment\n\ # doap:download-page <> ; # Place download HTML page URL here and uncomment\n\ .\n\n"; return res; } string describe_plugin(Plugin* plugin, bool multipleMakers) { string res = "\n## Properties of the " + plugin->getName() + " plugin\n\n\ plugbase:"+plugin->getIdentifier()+" a vamp:Plugin ;\n\ dc:title \""+plugin->getName()+"\" ;\n\ vamp:name \""+plugin->getName()+"\" ;\n\ dc:description \"\"\""+plugin->getDescription()+"\"\"\" ;\n\ foaf:maker "; if (multipleMakers) { res += "[ foaf:name \""+plugin->getMaker()+"\" ] ;\n"; } else { res += ":library_maker ;\n"; } res += "\ dc:rights \"\"\""+plugin->getCopyright()+"\"\"\" ;\n\ # cc:license ; \n\ vamp:identifier \""+plugin->getIdentifier()+"\" ;\n\ vamp:vamp_API_version vamp:api_version_"+to_string(plugin->getVampApiVersion())+" ;\n\ owl:versionInfo \""+to_string(plugin->getPluginVersion())+"\" ;\n"; if (plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) res+=" vamp:input_domain vamp:FrequencyDomain ;\n\n"; else res+=" vamp:input_domain vamp:TimeDomain ;\n"; Plugin::ParameterList params = plugin->getParameterDescriptors(); for (Plugin::ParameterList::const_iterator i = params.begin(); i != params.end(); i++) res+=" vamp:parameter plugbase:"+plugin->getIdentifier()+"_param_"+(*i).identifier+" ;\n"; if (!params.empty()) res+="\n"; Plugin::OutputList outputs = plugin->getOutputDescriptors(); for (Plugin::OutputList::const_iterator i = outputs.begin(); i!= outputs.end(); i++) res+=" vamp:output plugbase:"+plugin->getIdentifier()+"_output_"+(*i).identifier+" ;\n"; res+=" .\n"; return res; } string describe_param(Plugin *plugin, Plugin::ParameterDescriptor p) { //FIXME: dc:format and vamp:unit are the same??? //Should be a QUantizedParameter also a Parameter?? if(p.isQuantized){ string res=\ "plugbase:"+plugin->getIdentifier()+"_param_"+p.identifier+" a vamp:QuantizedParameter ;\n\ vamp:identifier \""+p.identifier+"\" ;\n\ dc:title \""+p.name+"\" ;\n\ dc:format \""+p.unit+"\" ;\n\ vamp:min_value "+to_string(p.minValue)+" ;\n\ vamp:max_value "+to_string(p.maxValue)+" ;\n\ vamp:unit \""+p.unit+"\" ;\n\ vamp:quantize_step "+to_string(p.quantizeStep)+" ;\n\ vamp:default_value "+to_string(p.defaultValue)+" ;\n\ vamp:value_names ("; unsigned int i; for (i=0; i+1 < p.valueNames.size(); i++) res+=" \""+p.valueNames[i]+"\""; if (i < p.valueNames.size()) res+=" \""+p.valueNames[i]+"\""; res+=");\n"; res+=" .\n"; return res; }else{ string res=\ "plugbase:"+plugin->getIdentifier()+"_param_"+p.identifier+" a vamp:Parameter ;\n\ vamp:identifier \""+p.identifier+"\" ;\n\ dc:title \""+p.name+"\" ;\n\ dc:format \""+p.unit+"\" ;\n\ vamp:min_value "+to_string(p.minValue)+" ;\n\ vamp:max_value "+to_string(p.maxValue)+" ;\n\ vamp:unit \""+p.unit+"\" ;\n\ vamp:default_value "+to_string(p.defaultValue)+" ;\n\ vamp:value_names ("; unsigned int i; for (i=0; i+1 < p.valueNames.size(); i++) res+=" \""+p.valueNames[i]+"\""; if (i < p.valueNames.size()) res+=" \""+p.valueNames[i]+"\""; res+=");\n"; res+=" .\n"; return res; } } string describe_output(Plugin *plugin, Plugin::OutputDescriptor o) { //we need to distinguish here between different output types: //Quantize or not //KnownExtents or not //Data output classification: //DenseOutput //SparseOutput //TrackLevelOutput // SparseOutput: variable sample rate. Events are not evenly // spaced so we need to record the time associated with the event // as it its not ensured that we have an event after the next one // (but there is not time to set the duration, it has to be // calculated as the different between 2 different events). The // timestamp must be read. string res; if (o.sampleType == Plugin::OutputDescriptor::VariableSampleRate || !o.hasFixedBinCount) { res=\ "plugbase:"+plugin->getIdentifier()+"_output_"+o.identifier+" a vamp:SparseOutput ;\n\ vamp:identifier \""+o.identifier+"\" ;\n\ dc:title \""+o.name+"\" ;\n\ dc:description \"\"\""+o.description+"\"\"\" ;\n\ vamp:fixed_bin_count \""+(o.hasFixedBinCount == 1 ? "true" : "false")+"\" ;\n\ vamp:unit \""+(o.unit)+"\" ;\n"; //another type of output if(o.isQuantized){ res+=" a vamp:QuantizedOutput ;\n"; res+=" vamp:quantize_step "+to_string(o.quantizeStep)+" ;\n"; } //and yet another type if(o.hasKnownExtents){ res+=" a vamp:KnownExtentsOutput ;\n"; res+=" vamp:min_value "+to_string(o.minValue)+" ;\n"; res+=" vamp:max_value "+to_string(o.maxValue)+" ;\n"; } // FIXME ? Bin names may vary based on plugin setup, so including them here might be misleading... if (o.hasFixedBinCount) { res+=" vamp:bin_count "+to_string(o.binCount)+" ;\n"; bool haveBinNames = false; for (unsigned int i=0; i < o.binNames.size(); i++) { if (o.binNames[i] != "") { haveBinNames = true; break; } } if (haveBinNames) { res+=" vamp:bin_names ("; unsigned int i; for (i=0; i+1 < o.binNames.size(); i++) res+=" \""+o.binNames[i]+"\""; if (i < o.binNames.size()) res+=" \""+o.binNames[i]+"\""; res+=");\n"; } } res+=" vamp:sample_type vamp:VariableSampleRate ;\n"; if (o.sampleRate > 0.0f) res+=" vamp:sample_rate "+to_string(o.sampleRate)+" ;\n"; } //If we do not have SparseOutput, then we have DenseOutput. TrackLevelOutput can not be inferred from the plugin directly without actually //running the plugin. else{ res=\ "plugbase:"+plugin->getIdentifier()+"_output_"+o.identifier+" a vamp:DenseOutput ;\n\ vamp:identifier \""+o.identifier+"\" ;\n\ dc:title \""+o.name+"\" ;\n\ dc:description \"\"\""+o.description+"\"\"\" ;\n\ vamp:fixed_bin_count \""+(o.hasFixedBinCount == 1 ? "true" : "false")+"\" ;\n\ vamp:unit \""+(o.unit)+"\" ;\n"; //another type of output if(o.isQuantized){ res+=" a vamp:QuantizedOutput ;\n"; res+=" vamp:quantize_step "+to_string(o.quantizeStep)+" ;\n"; } //and yet another type if(o.hasKnownExtents){ res+=" a vamp:KnownExtentsOutput ;\n"; res+=" vamp:min_value "+to_string(o.minValue)+" ;\n"; res+=" vamp:max_value "+to_string(o.maxValue)+" ;\n"; } // FIXME ? Bin names may vary based on plugin setup, so including them here might be misleading... if (o.hasFixedBinCount) { res+=" vamp:bin_count "+to_string(o.binCount)+" ;\n"; bool haveBinNames = false; for (unsigned int i=0; i < o.binNames.size(); i++) { if (o.binNames[i] != "") { haveBinNames = true; break; } } if (haveBinNames) { res+=" vamp:bin_names ("; unsigned int i; for (i=0; i+1 < o.binNames.size(); i++) res+=" \""+o.binNames[i]+"\""; if (i < o.binNames.size()) res+=" \""+o.binNames[i]+"\""; res+=");\n"; } } else if (o.sampleType == Plugin::OutputDescriptor::FixedSampleRate) { res+=" vamp:sample_type vamp:FixedSampleRate ;\n"; res+=" vamp:sample_rate "+to_string(o.sampleRate)+" ;\n"; } else if (o.sampleType == Plugin::OutputDescriptor::OneSamplePerStep) res+=" vamp:sample_type vamp:OneSamplePerStep ;\n"; else { cerr<<"Incomprehensible sampleType for output descriptor "+o.identifier<<" !"< plugins, string pluginBundleBaseURI, string describerURI, string libname) { bool multipleMakers = have_multiple_makers(plugins); string res = describe_namespaces(pluginBundleBaseURI, libname); res += describe_doc(describerURI, pluginBundleBaseURI, libname); res += describe_maker(plugins, multipleMakers); res += describe_library(libname, plugins); for (size_t i = 0; i < plugins.size(); ++i) { Plugin *plugin = plugins[i]; res += describe_plugin(plugin, multipleMakers); Plugin::ParameterList params = plugin->getParameterDescriptors(); for (Plugin::ParameterList::const_iterator i = params.begin(); i != params.end(); i++) res += describe_param(plugin, *i); Plugin::OutputList outputs = plugin->getOutputDescriptors(); for (Plugin::OutputList::const_iterator i = outputs.begin(); i!= outputs.end(); i++) res += describe_output(plugin, *i); } return res; } int main(int argc, char **argv) { if (argc < 3) usage(); bool interactive = false; if (!strcmp(argv[1], "-i")) interactive = true; if (!interactive && argc < 3) usage(); string pluginBundleBaseURI, describerURI; int argidx = 2; if (!interactive) { pluginBundleBaseURI = argv[1]; if (!strcmp(argv[2], "-m")) { if (argc < 5) usage(); describerURI = argv[3]; argidx = 4; } } else { cerr << "Please enter the base URI for the plugin bundle : "; getline(cin, pluginBundleBaseURI); cerr << "Please enter your URI (empty to omit) : "; getline(cin, describerURI); } vector plugins; string libname; PluginLoader *loader = PluginLoader::getInstance(); while (argidx < argc) { string pluginName = argv[argidx]; if (pluginName.substr(0, 5) == "vamp:") { pluginName = pluginName.substr(5); } string mylibname = pluginName.substr(0, pluginName.find(':')); if (libname == "") libname = mylibname; else if (libname != mylibname) { cerr << "ERROR: All plugins specified on command line must originate in the same library" << endl; exit(1); } if (mylibname == pluginName) { // pluginName is a library, not a plugin PluginLoader::PluginKeyList list = loader->listPlugins(); for (size_t i = 0; i < list.size(); ++i) { string thislibname = list[i].substr(0, list[i].find(':')); if (thislibname != mylibname) continue; Plugin *plugin = loader->loadPlugin(list[i], 44100); if (!plugin) { cerr << "ERROR: Plugin \"" << list[i] << "\" could not be loaded" << endl; exit(1); } plugins.push_back(plugin); } if (plugins.empty()) { cerr << "ERROR: Plugin library \"" << mylibname << "\" does not exist, could not be opened, or contains no plugins" << endl; exit(1); } } else { // pluginName is a plugin Plugin *plugin = loader->loadPlugin(pluginName, size_t(44100)); if (!plugin) { cerr << "ERROR: Plugin \"" << pluginName << "\" could not be loaded" << endl; exit(1); } plugins.push_back(plugin); } ++argidx; } cout << describe(plugins, pluginBundleBaseURI, describerURI, libname) << endl; return 0; } sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/vamp.n30000644000000000000000000004463413111512442020145 0ustar 00000000000000@prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix foaf: . @prefix vs: . @prefix dc: . @prefix event: . @prefix af: . @prefix vamp: . @prefix : <> . <> a owl:Ontology; dc:title "Vamp Plugins Ontology"; rdfs:label "Vamp Plugins Ontology"; rdfs:comment """ Vamp Ontology. This ontology includes the following descriptions: - OWL description of the Vamp API - OWL description of the Transform environment necessary to set up the execution of any plugin This Ontology provides semantics to describe and control Vamp plugins in RDF. Any "RDF-speaker" host is therefore able to use this ontology to read, set up and execute plugins. The extracted features are expressed in terms of the Audio Features Ontology: http://purl.org/ontology/af/. For more information, please visit the Vamp Plugins website: http://www.vamp-plugins.org/ """; foaf:maker "Chris Cannam"; foaf:maker "Chris Sutton"; foaf:maker "Yves Raimond"; foaf:maker "David Pastor Escuredo"; dc:date "$Date: 2008/05/21 17:05:11 $"; . vs:term_status a owl:AnnotationProperty. #Authors foaf ############################################# # Part 1: Describing a Vamp plugin ############################################# ######################################### # CLASSES ######################################### # Note: we don't include a Feature concept because we rely on the Audio Feature ontology # Note: we additionally define a Transform concept to link the running context vamp:Plugin a owl:Class; rdfs:label "Vamp Plugin"; rdfs:comment """ A Vamp plugin is an implementation of an audio feature extraction algorithm using the Vamp API. """; vs:term_status "stable"; . vamp:PluginLibrary a owl:Class; rdfs:label "Vamp Plugin Library"; rdfs:comment """ Library of Vamp Plugins. This may need to include rights. """; vs:term_status "stable"; . vamp:Parameter a owl:Class; rdfs:label "Vamp Plugin Parameter"; rdfs:comment """ Descriptor for a plugin parameter. Hosts need to know about the specific type and form of the parameters of a particular plugin for a correct transform setup. """; vs:term_status "stable"; . vamp:QuantizedParameter a owl:Class; rdfs:label "Quantized Parameter"; rdfs:subClassOf vamp:Parameter; rdfs:comment """ Descriptor of a parameter that does have quantized values. The property quantize_step is just defined for this subclass and not for the general Parameter. """; vs:term_status "stable"; . vamp:PluginOutput a owl:Class; rdfs:label "Vamp Plugin output descriptor"; rdfs:comment """ Descriptor for an output of a plugin. This descriptor provides information that is necessary to correctly interpret the output features. The output type will determine how to read the temporal information of the extracted features and how to manage the burden of ouput data. """; vs:term_status "unstable"; . #3 classifications of outputs: #-density of data #-quantised #-known extents #there is not classification for fix_bin_count vamp:QuantizedOutput a owl:Class; rdfs:label "Quantized Output"; rdfs:subClassOf vamp:PluginOutput; rdfs:comment """ Descriptor of an output that does have quantized values. """; vs:term_status "stable"; . vamp:KnownExtentsOutput a owl:Class; rdfs:label "Known Extents Output"; rdfs:subClassOf vamp:PluginOutput; rdfs:comment """ Descriptor of an output that does have known extents. """; vs:term_status "stable"; . vamp:DenseOutput a owl:Class; rdfs:subClassOf vamp:PluginOutput; rdfs:label "Dense output"; rdfs:comment """ Specific output type for data evenly spaced in time, which may be of high volume and which it is usually desirable to represent in a compact form. """; vs:term_status "unstable"; . vamp:SparseOutput a owl:Class; rdfs:label "Sparse output"; rdfs:subClassOf vamp:PluginOutput; rdfs:comment """ Specific output type for data that consist of features that require their own individual temporal information. """; vs:term_status "unstable"; . vamp:TrackLevelOutput a owl:Class; rdfs:label "track level output"; rdfs:subClassOf vamp:PluginOutput; rdfs:comment """ Specific output type for track level information. The Vamp API does not provide for this sort of output directly, so this will require a "hacky" interpretation of the feature timestamp to establish that it reflects track metadata instead of temporal data. """; vs:term_status "unstable"; . vamp:PluginProgram a owl:Class; rdfs:label "Plugin program"; rdfs:comment """ The program is a predefined context of parameters. We may not need a concept for this and just a property linking a string representing the program name. """; vs:term_status "unstable"; . vamp:Feature a owl:Class; rdfs:label "Vamp Feature"; rdfs:comment "This may be removed mighty soon as we rely on the Audio Features Ontology for this"; vs:term_status "deprecated"; . # Classes for enumerations in the Vamp API vamp:InputDomain a owl:Class; rdfs:label "Plugin input domain"; rdfs:comment """ Plugins declare the input domain they require, so the host can convert the input data properly. Hosts using the Vamp SDK PluginAdapter to wrap plugins should see this work done for them automatically - see the Vamp documentation. """; vs:term_status "stable"; . vamp:SampleType a owl:Class; rdfs:label "sample type"; rdfs:comment """ The sample type specifies the temporal information of the plugin output. This information should be combined with the output type for a correct interpretation. """; vs:term_status "stable"; . ################################################################## # PROPERTIES. ################################################################## ##### Plugin properties ##!!! lacking plugin version? vamp:parameter a rdf:Property; a owl:ObjectProperty; rdfs:label "parameter descriptor"; rdfs:comment """ Links each parameter descriptor to the plugin. """; rdfs:range vamp:Parameter; rdfs:domain vamp:ParameterBinding; rdfs:domain vamp:Plugin; vs:term_status "stable"; . vamp:output a rdf:Property; a owl:ObjectProperty; rdfs:label "output"; rdfs:comment """ Links each output type to the plugin. """; rdfs:range vamp:PluginOutput; rdfs:domain vamp:Plugin; rdfs:domain vamp:Transform; vs:term_status "stable"; . ##### Plugin Library properties (could include affiliation, rights...) vamp:available_plugin a rdf:Property; a owl:ObjectProperty; rdfs:label "available plugin"; rdfs:comment """ Available plugins in the library """; rdfs:range vamp:Plugin; rdfs:domain vamp:PluginLibrary; vs:term_status "stable"; . #### Plugin Descriptor properties vamp:identifier a rdf:Property; a owl:DatatypeProperty; rdfs:label "plugin identifier"; rdfs:comment """ Machine-readable identifier for a Vamp plugin within the scope of its library, or for a plugin descriptor within the scope of the plugin. """; rdfs:domain vamp:Plugin; rdfs:domain vamp:PluginLibrary; rdfs:domain vamp:PluginProgram; rdfs:domain vamp:PluginOutput; rdfs:domain vamp:Parameter; rdfs:domain vamp:Transform; vs:term_status "stable"; . vamp:name a rdf:Property; a owl:DatatypeProperty; rdfs:label "plugin name"; rdfs:comment """ Human-readable identifier for the plugin. """; rdfs:domain vamp:Plugin; vs:term_status "stable"; . vamp:vamp_API_version a rdf:Property; a owl:DatatypeProperty; rdfs:label "Vamp API version"; rdfs:comment """ Version of the Vamp API used to implement this plugin. """; rdfs:domain vamp:Plugin; vs:term_status "stable"; . vamp:input_domain a rdf:Property; a owl:DatatypeProperty; rdfs:label "input domain"; rdfs:comment """ Input domain required by the plugin (time or frequency). """; rdfs:domain vamp:Plugin; rdfs:range vamp:InputDomain; vs:term_status "stable"; . # Note that other properties like maker can be linked to the plugin descriptor using other namespaces ##### Parameter Descriptor properties (and some common with PluginOutput) # Note: Identifier has been already defined vamp:max_value a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "max value"; rdfs:comment """ Maximum value of the parameter range """; rdfs:range vamp:Parameter; rdfs:range vamp:KnownExtentsOutput; vs:term_status "unstable"; . vamp:min_value a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "min value"; rdfs:comment """ Minimum value of the parameter range """; rdfs:range vamp:Parameter; rdfs:range vamp:KnownExtentsOutput; vs:term_status "unstable"; . vamp:default_value a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "default value"; rdfs:comment """ Default value of the parameter """; rdfs:range vamp:Parameter; vs:term_status "unstable"; . vamp:quantize_step a rdf:Property; a owl:FunctionalProperty; a owl:DatatypeProperty; rdfs:label "quantized step"; rdfs:comment """ Quantize step. Only defined for quantized outputs """; rdfs:domain vamp:QuantizedOutput; rdfs:domain vamp:QuantizedParameter; vs:term_status "unstable"; . vamp:has_duration a rdf:Property; a owl:FunctionalProperty; a owl:DatatypeProperty; rdfs:label "has duration"; rdfs:comment """ True if features on this output are known to have durations """; rdfs:domain vamp:PluginOutput; vs:term_status "unstable"; . vamp:unit a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "unit"; rdfs:comment """ Unit of the output/parameter. A string type """; rdfs:domain vamp:PluginOutput; rdfs:domain vamp:Parameter; vs:term_status "unstable"; . vamp:value_names a rdf:Property; a owl:DatatypeProperty; rdfs:label "value names"; rdfs:comment """ List of value names if available """; rdfs:domain vamp:Parameter; vs:term_status "unstable"; . ########Output Descriptor properties vamp:fixed_bin_count a rdf:Property; a owl:DatatypeProperty; rdfs:label "fixed bin count"; rdfs:comment """ Fixed bin count. A boolean type. """; rdfs:domain vamp:PluginOutput; vs:term_status "unstable"; . vamp:sample_rate a rdf:Property; a owl:DatatypeProperty; rdfs:label "sample rate"; rdfs:comment """ Sample rate of the output if any. Should be read depending on SampleType and Output classes. """; rdfs:domain vamp:PluginOutput; vs:term_status "unstable"; . vamp:bin_count a rdf:Property; a owl:DatatypeProperty; rdfs:label "bin count"; rdfs:comment """ Number of elements of the bin output. This information is necessary to define the output as belonging to a specific subclass of Plugin Output. """; rdfs:domain vamp:PluginOutput; vs:term_status "unstable"; . vamp:bin_names a rdf:Property; a owl:DatatypeProperty; rdfs:label "bin names"; rdfs:comment """ List of bin names if available. """; rdfs:domain vamp:PluginOutput; vs:term_status "unstable"; . vamp:sample_type a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "sample type"; rdfs:comment """ The sample type specifies the temporal information of the output. """; rdfs:domain vamp:PluginOutput; rdfs:range vamp:SampleType; vs:term_status "unstable"; . # The next 3 properties are included to link in the Audio Features Ontology (not strictly from the Vamp API). vamp:computes_event_type a rdf:Property; a owl:ObjectProperty; rdfs:label "event type"; rdfs:comment """ Associates a plugin output with its corresponding event type (for example, in the Audio Features ontology). """; rdfs:domain vamp:PluginOutput; rdfs:range event:Event; vs:term_status "unstable"; . vamp:computes_feature a rdf:Property; a owl:ObjectProperty; rdfs:label "feature type"; rdfs:comment """ Associates a plugin output with the attribute connecting the event to its value data. """; rdfs:domain vamp:PluginOutput; rdfs:range event:factor; vs:term_status "unstable"; . vamp:computes_signal_type a rdf:Property; a owl:ObjectProperty; rdfs:label "signal type"; rdfs:comment """ Associates a dense plugin output with its corresponding signal type (for example, in the Audio Features ontology). """; rdfs:domain vamp:PluginOutput; rdfs:range af:Signal; vs:term_status "unstable"; . ######################## # INDIVIDUALS ######################## vamp:TimeDomain a vamp:InputDomain; . vamp:FrequencyDomain a vamp:InputDomain; . vamp:OneSamplePerStep a vamp:SampleType; . vamp:FixedSampleRate a vamp:SampleType; . vamp:VariableSampleRate a vamp:SampleType; . ################################################### END OF THE VAMP API DESCRIPTION ############################################################ ############################################# # Part 2: Classes to describe plugin execution. TRANSFORM ############################################# # Note: we need to define this part of the ontology to give a minimun common standard for hosts. # Note: this may split up in some other ontology or become part of the DSP namespace vamp:Transform a owl:Class; rdfs:label "Transform"; vs:term_status "stable"; rdfs:comment """ The Transform defines the environment of any audio processing computation. """; . vamp:ParameterBinding a owl:Class; rdfs:label "Parameter binding"; vs:term_status "unstable"; rdfs:comment """ Parameter setting used by the plugin transform to set up the plugin. """; . vamp:Configuration a owl:Class; rdfs:label "Configuration"; vs:term_status "unstable"; rdfs:comment """ For extension (key/value data provided to DSSI plugins, not relevant to Vamp) """; . vamp:TransformType a owl:Class; rdfs:label "Transform Type"; vs:term_status "unstable"; rdfs:comment """ Specifies the type of transform. May be feature extraction, effect... """; . ##individuals of transformtype vamp:FeatureExtraction a vamp:TransformType; rdfs:label "Feature Extraction"; vs:term_status "unstable"; rdfs:comment """ Feature extraction transform. This may be just a subclass of Transform... """; . vamp:Effect a vamp:TransformType; rdfs:label "Effect"; vs:term_status "unstable"; rdfs:comment """ Effect transform. This may be just a subclass of Transform... """; . ################ # Properties ################ ##### Plugin Transform properties #identifier and output are declared above vamp:engine a rdf:Property; a owl:ObjectProperty; rdfs:label "plugin"; vs:term_status "stable"; rdfs:comment """ Specifies the sort of plugin in execution. This is an extension to use Transform with other plugin libraries """; rdfs:domain vamp:Transform; rdfs:range vamp:Plugin; . vamp:program a rdf:Property; a owl:ObjectProperty; a owl:FunctionalProperty; rdfs:label "program"; vs:term_status "stable"; rdfs:comment """ Specifies the program to set the plugin in execution. Here the plugin program matches with the one in the plugin descriptor. There is not descriptor required for the program (just a string), is it? """; rdfs:domain vamp:Transform; rdfs:range vamp:PluginProgram; . vamp:configuration a rdf:Property; a owl:ObjectProperty; a owl:FunctionalProperty; rdfs:label "program"; vs:term_status "stable"; rdfs:comment """ Extension for configuration. """; rdfs:domain vamp:Transform; rdfs:range vamp:Configuration; . vamp:parameter_binding a rdf:Property; a owl:ObjectProperty; rdfs:label "parameter"; vs:term_status "stable"; rdfs:comment """ Specifies the parameter to set the plugin in execution. """; rdfs:domain vamp:Transform; rdfs:range vamp:ParameterBinding; . vamp:step_size a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "step size"; vs:term_status "stable"; rdfs:comment """ Specifies the step size for the framing. """; rdfs:domain vamp:Transform; . vamp:block_size a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "block size"; vs:term_status "stable"; rdfs:comment """ Specifies the block size for the framing. """; rdfs:domain vamp:Transform; . vamp:sample_rate a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "sample rate"; vs:term_status "stable"; rdfs:comment """ Specifies the sample rate if it is not constant. """; rdfs:domain vamp:Transform; . vamp:transform_type a rdf:Property; a owl:ObjectProperty; a owl:FunctionalProperty; rdfs:label "transform type"; vs:term_status "unstable"; rdfs:comment """ Specifies the transform type (we could do this by subclassin transform instead of using a property). """; rdfs:domain vamp:Transform; . vamp:window_type a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "window type"; vs:term_status "unstable"; rdfs:comment """ Specifies the window type (they should be individuals and clearly not here). """; rdfs:domain vamp:Transform; . vamp:start a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "start"; vs:term_status "unstable"; rdfs:comment """ Specifies temporal information when processing a data stream. """; rdfs:domain vamp:Transform; . vamp:duration a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "start"; vs:term_status "unstable"; rdfs:comment """ Specifies temporal information when processing a data stream. """; rdfs:domain vamp:Transform; . vamp:summary_type a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "summary type"; vs:term_status "unstable"; rdfs:comment """ Specifies a summary type to be used (for averaging etc) on transform results. """; rdfs:domain vamp:Transform; . ##### Parameter properties vamp:value a rdf:Property; a owl:DatatypeProperty; a owl:FunctionalProperty; rdfs:label "value"; vs:term_status "stable"; rdfs:comment """ Specifies the current value of the parameter. """; rdfs:domain vamp:ParameterBinding; . #parameter declared above # The next property is here to link the Audio Features ontology to the # Transform ontology terms -- an audio feature may use this to # indicate which transform produced it vamp:computed_by a rdf:Property; a owl:ObjectProperty; rdfs:label "computed by"; rdfs:comment """ Associates an audio feature with the transform that was used to compute it. """; rdfs:domain event:Event; rdfs:domain af:Signal; rdfs:range vamp:Transform; vs:term_status "unstable"; . sonic-visualiser-3.0.3/vamp-plugin-sdk/rdf/vamp.rdf0000644000000000000000000017071113111512442020374 0ustar 00000000000000 Vamp Plugins Ontology Vamp Plugins Ontology Vamp Ontology. This ontology includes the following descriptions: - OWL description of the Vamp API - OWL description of the Transform environment necessary to set up the execution of any plugin This Ontology provides semantics to describe and control Vamp plugins in RDF. Any "RDF-speaker" host is therefore able to use this ontology to read, set up and execute plugins. The extracted features are expressed in terms of the Audio Features Ontology: http://purl.org/ontology/af/. For more information, please visit the Vamp Plugins website: http://www.vamp-plugins.org/ Chris Cannam Chris Sutton Yves Raimond David Pastor Escuredo $Date: 2008/05/21 17:05:11 $ Vamp Plugin A Vamp plugin is an implementation of an audio feature extraction algorithm using the Vamp API. stable Vamp Plugin Library Library of Vamp Plugins. This may need to include rights. stable Vamp Plugin Parameter Descriptor for a plugin parameter. Hosts need to know about the specific type and form of the parameters of a particular plugin for a correct transform setup. stable Quantized Parameter Descriptor of a parameter that does have quantized values. The property quantize_step is just defined for this subclass and not for the general Parameter. stable Vamp Plugin output descriptor Descriptor for an output of a plugin. This descriptor provides information that is necessary to correctly interpret the output features. The output type will determine how to read the temporal information of the extracted features and how to manage the burden of ouput data. unstable Quantized Output Descriptor of an output that does have quantized values. stable Known Extents Output Descriptor of an output that does have known extents. stable Dense output Specific output type for data evenly spaced in time, which may be of high volume and which it is usually desirable to represent in a compact form. unstable Sparse output Specific output type for data that consist of features that require their own individual temporal information. unstable track level output Specific output type for track level information. The Vamp API does not provide for this sort of output directly, so this will require a "hacky" interpretation of the feature timestamp to establish that it reflects track metadata instead of temporal data. unstable Plugin program The program is a predefined context of parameters. We may not need a concept for this and just a property linking a string representing the program name. unstable Vamp Feature This may be removed mighty soon as we rely on the Audio Features Ontology for this deprecated Plugin input domain Plugins declare the input domain they require, so the host can convert the input data properly. Hosts using the Vamp SDK PluginAdapter to wrap plugins should see this work done for them automatically - see the Vamp documentation. stable sample type The sample type specifies the temporal information of the plugin output. This information should be combined with the output type for a correct interpretation. stable parameter descriptor Links each parameter descriptor to the plugin. stable output Links each output type to the plugin. stable available plugin Available plugins in the library stable plugin identifier Machine-readable identifier for a Vamp plugin within the scope of its library, or for a plugin descriptor within the scope of the plugin. stable plugin name Human-readable identifier for the plugin. stable Vamp API version Version of the Vamp API used to implement this plugin. stable input domain Input domain required by the plugin (time or frequency). stable max value Maximum value of the parameter range unstable min value Minimum value of the parameter range unstable default value Default value of the parameter unstable quantized step Quantize step. Only defined for quantized outputs unstable has duration True if features on this output are known to have durations unstable unit Unit of the output/parameter. A string type unstable value names List of value names if available unstable fixed bin count Fixed bin count. A boolean type. unstable sample rate Sample rate of the output if any. Should be read depending on SampleType and Output classes. unstable bin count Number of elements of the bin output. This information is necessary to define the output as belonging to a specific subclass of Plugin Output. unstable bin names List of bin names if available. unstable sample type The sample type specifies the temporal information of the output. unstable event type Associates a plugin output with its corresponding event type (for example, in the Audio Features ontology). unstable feature type Associates a plugin output with the attribute connecting the event to its value data. unstable signal type Associates a dense plugin output with its corresponding signal type (for example, in the Audio Features ontology). unstable Transform stable The Transform defines the environment of any audio processing computation. Parameter binding unstable Parameter setting used by the plugin transform to set up the plugin. Configuration unstable For extension (key/value data provided to DSSI plugins, not relevant to Vamp) Transform Type unstable Specifies the type of transform. May be feature extraction, effect... Feature Extraction unstable Feature extraction transform. This may be just a subclass of Transform... Effect unstable Effect transform. This may be just a subclass of Transform... plugin stable Specifies the sort of plugin in execution. This is an extension to use Transform with other plugin libraries program stable Specifies the program to set the plugin in execution. Here the plugin program matches with the one in the plugin descriptor. There is not descriptor required for the program (just a string), is it? program stable Extension for configuration. parameter stable Specifies the parameter to set the plugin in execution. step size stable Specifies the step size for the framing. block size stable Specifies the block size for the framing. sample rate stable Specifies the sample rate if it is not constant. transform type unstable Specifies the transform type (we could do this by subclassin transform instead of using a property). window type unstable Specifies the window type (they should be individuals and clearly not here). start unstable Specifies temporal information when processing a data stream. start unstable Specifies temporal information when processing a data stream. summary type unstable Specifies a summary type to be used (for averaging etc) on transform results. value stable Specifies the current value of the parameter. computed by Associates an audio feature with the transform that was used to compute it. unstable sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/Makefile.inc0000644000000000000000000000371213111512442022211 0ustar 00000000000000 ## Makefile for Vamp plugin builds using command-line tools. ## ## This file defines all of the system-independent information about ## your project: the list of source files, plugin library name, etc. ## Edit this file to make sure it has all the right information. ## ## This file does not define the system-specific stuff such as which ## compiler to use -- that goes into Makefile.osx, Makefile.mingw32, ## Makefile.linux etc. Those files all include this file, so that ## they all have a consistent set of project data. ## ## To build the plugin project, type ## ## $ gmake -f Makefile.osx ## ## or whatever the equivalent filename suffix is for your platform. ## ## This requires GNU make, which is what you get with OS/X, Linux, or ## MinGW/Cygwin on Windows. ## ## (For Windows builds using MS Visual Studio, start instead with the ## VampExamplePlugins project found in the build directory of the SDK.) # Edit this to the base name of your plugin library # PLUGIN_LIBRARY_NAME := myplugins # Edit this to list the .cpp or .c files in your plugin project # PLUGIN_SOURCES := MyPlugin.cpp plugins.cpp # Edit this to list the .h files in your plugin project # PLUGIN_HEADERS := MyPlugin.h ## Normally you should not edit anything below this line SRC_DIR := . CFLAGS := $(ARCHFLAGS) $(CFLAGS) CXXFLAGS := $(CFLAGS) -I. -I$(VAMPSDK_DIR) $(CXXFLAGS) LDFLAGS := $(ARCHFLAGS) $(LDFLAGS) PLUGIN_LDFLAGS := $(LDFLAGS) $(PLUGIN_LDFLAGS) # Defaults, overridden from the platform-specific Makefile VAMPSDK_DIR ?= ../vamp-plugin-sdk PLUGIN_EXT ?= .so CXX ?= g++ CC ?= gcc PLUGIN := $(PLUGIN_LIBRARY_NAME)$(PLUGIN_EXT) PLUGIN_OBJECTS := $(PLUGIN_SOURCES:.cpp=.o) PLUGIN_OBJECTS := $(PLUGIN_OBJECTS:.c=.o) $(PLUGIN): $(PLUGIN_OBJECTS) $(CXX) -o $@ $^ $(PLUGIN_LDFLAGS) $(PLUGIN_OBJECTS): $(PLUGIN_HEADERS) clean: rm -f $(PLUGIN_OBJECTS) distclean: clean rm -f $(PLUGIN) depend: makedepend -Y -fMakefile.inc $(PLUGIN_SOURCES) $(PLUGIN_HEADERS) sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/Makefile.linux0000644000000000000000000000152513111512442022577 0ustar 00000000000000 ## Makefile for Vamp plugin using GNU tools on Linux. ## ## Edit this to adjust compiler and library settings when ## building for Linux. ## ## Note that the list of source files, etc, goes in Makefile.inc ## instead so that it can be included by all platform Makefiles. # For a debug build... CFLAGS := -Wall -Wextra -g -fPIC # ... or for a release build #CFLAGS := -Wall -Wextra -O3 -msse -msse2 -mfpmath=sse -ftree-vectorize -fPIC # Location of Vamp plugin SDK relative to the project directory VAMPSDK_DIR := ../vamp-plugin-sdk # Libraries and linker flags required by plugin: add any -l # options here PLUGIN_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-z,defs -Wl,--version-script=vamp-plugin.map $(VAMPSDK_DIR)/libvamp-sdk.a # File extension for plugin library on this platform PLUGIN_EXT := .so include Makefile.inc sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/Makefile.mingw320000644000000000000000000000166513111512442022733 0ustar 00000000000000 ## Makefile for Vamp plugin using MinGW tools on Windows. ## ## Edit this to adjust compiler and library settings when ## building using MinGW. ## ## Note that the list of source files, etc, goes in Makefile.inc ## instead so that it can be included by all platform Makefiles. TOOLPREFIX ?= CXX = $(TOOLPREFIX)g++ CC = $(TOOLPREFIX)gcc LD = $(TOOLPREFIX)g++ AR = $(TOOLPREFIX)ar RANLIB = $(TOOLPREFIX)ranlib # For a debug build... CFLAGS := -Wall -Wextra -g # ... or for a release build #CFLAGS := -Wall -Wextra -O3 -ftree-vectorize # Location of Vamp plugin SDK relative to the project directory VAMPSDK_DIR := ../vamp-plugin-sdk # Libraries and linker flags required by plugin: add any -l # options here PLUGIN_LDFLAGS := -shared -static -Wl,--retain-symbols-file=vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a # File extension for plugin library on this platform PLUGIN_EXT := .dll include Makefile.inc sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/Makefile.osx0000644000000000000000000000164113111512442022250 0ustar 00000000000000 ## Makefile for Vamp plugin using command-line tools on OS/X. ## ## Edit this to adjust compiler and library settings when ## building for OS/X. ## ## Note that the list of source files, etc, goes in Makefile.inc ## instead so that it can be included by all platform Makefiles. # For a debug build... CFLAGS := -Wall -Wextra -g -fPIC # ... or for a release build #CFLAGS := -Wall -Wextra -O3 -fPIC # Flags to determine processor architecture and system SDK ARCHFLAGS ?= -mmacosx-version-min=10.7 -arch x86_64 -stdlib=libc++ # Location of Vamp plugin SDK relative to the project directory VAMPSDK_DIR := ../vamp-plugin-sdk # Libraries and linker flags required by plugin: add any -l # options here PLUGIN_LDFLAGS := -dynamiclib -exported_symbols_list vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a # File extension for plugin library on this platform PLUGIN_EXT := .dylib include Makefile.inc sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/MyPlugin.cpp0000644000000000000000000001104213111512442022244 0ustar 00000000000000 // This is a skeleton file for use in creating your own plugin // libraries. Replace MyPlugin and myPlugin throughout with the name // of your first plugin class, and fill in the gaps as appropriate. #include "MyPlugin.h" MyPlugin::MyPlugin(float inputSampleRate) : Plugin(inputSampleRate) // Also be sure to set your plugin parameters (presumably stored // in member variables) to their default values here -- the host // will not do that for you { } MyPlugin::~MyPlugin() { } string MyPlugin::getIdentifier() const { return "myplugin"; } string MyPlugin::getName() const { return "My Plugin"; } string MyPlugin::getDescription() const { // Return something helpful here! return ""; } string MyPlugin::getMaker() const { // Your name here return ""; } int MyPlugin::getPluginVersion() const { // Increment this each time you release a version that behaves // differently from the previous one return 1; } string MyPlugin::getCopyright() const { // This function is not ideally named. It does not necessarily // need to say who made the plugin -- getMaker does that -- but it // should indicate the terms under which it is distributed. For // example, "Copyright (year). All Rights Reserved", or "GPL" return ""; } MyPlugin::InputDomain MyPlugin::getInputDomain() const { return TimeDomain; } size_t MyPlugin::getPreferredBlockSize() const { return 0; // 0 means "I can handle any block size" } size_t MyPlugin::getPreferredStepSize() const { return 0; // 0 means "anything sensible"; in practice this // means the same as the block size for TimeDomain // plugins, or half of it for FrequencyDomain plugins } size_t MyPlugin::getMinChannelCount() const { return 1; } size_t MyPlugin::getMaxChannelCount() const { return 1; } MyPlugin::ParameterList MyPlugin::getParameterDescriptors() const { ParameterList list; // If the plugin has no adjustable parameters, return an empty // list here (and there's no need to provide implementations of // getParameter and setParameter in that case either). // Note that it is your responsibility to make sure the parameters // start off having their default values (e.g. in the constructor // above). The host needs to know the default value so it can do // things like provide a "reset to default" function, but it will // not explicitly set your parameters to their defaults for you if // they have not changed in the mean time. ParameterDescriptor d; d.identifier = "parameter"; d.name = "Some Parameter"; d.description = ""; d.unit = ""; d.minValue = 0; d.maxValue = 10; d.defaultValue = 5; d.isQuantized = false; list.push_back(d); return list; } float MyPlugin::getParameter(string identifier) const { if (identifier == "parameter") { return 5; // return the ACTUAL current value of your parameter here! } return 0; } void MyPlugin::setParameter(string identifier, float value) { if (identifier == "parameter") { // set the actual value of your parameter } } MyPlugin::ProgramList MyPlugin::getPrograms() const { ProgramList list; // If you have no programs, return an empty list (or simply don't // implement this function or getCurrentProgram/selectProgram) return list; } string MyPlugin::getCurrentProgram() const { return ""; // no programs } void MyPlugin::selectProgram(string name) { } MyPlugin::OutputList MyPlugin::getOutputDescriptors() const { OutputList list; // See OutputDescriptor documentation for the possibilities here. // Every plugin must have at least one output. OutputDescriptor d; d.identifier = "output"; d.name = "My Output"; d.description = ""; d.unit = ""; d.hasFixedBinCount = true; d.binCount = 1; d.hasKnownExtents = false; d.isQuantized = false; d.sampleType = OutputDescriptor::OneSamplePerStep; d.hasDuration = false; list.push_back(d); return list; } bool MyPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; // Real initialisation work goes here! return true; } void MyPlugin::reset() { // Clear buffers, reset stored values, etc } MyPlugin::FeatureSet MyPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp) { // Do actual work! return FeatureSet(); } MyPlugin::FeatureSet MyPlugin::getRemainingFeatures() { return FeatureSet(); } sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/MyPlugin.h0000644000000000000000000000272113111512442021715 0ustar 00000000000000 // This is a skeleton file for use in creating your own plugin // libraries. Replace MyPlugin and myPlugin throughout with the name // of your first plugin class, and fill in the gaps as appropriate. // Remember to use a different guard symbol in each header! #ifndef MY_PLUGIN_H #define MY_PLUGIN_H #include using std::string; class MyPlugin : public Vamp::Plugin { public: MyPlugin(float inputSampleRate); virtual ~MyPlugin(); string getIdentifier() const; string getName() const; string getDescription() const; string getMaker() const; int getPluginVersion() const; string getCopyright() const; InputDomain getInputDomain() const; size_t getPreferredBlockSize() const; size_t getPreferredStepSize() const; size_t getMinChannelCount() const; size_t getMaxChannelCount() const; ParameterList getParameterDescriptors() const; float getParameter(string identifier) const; void setParameter(string identifier, float value); ProgramList getPrograms() const; string getCurrentProgram() const; void selectProgram(string name); OutputList getOutputDescriptors() const; bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); protected: // plugin-specific data and methods go here }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/plugins.cpp0000644000000000000000000000173213111512442022166 0ustar 00000000000000 // This is a skeleton file for use in creating your own plugin // libraries. Replace MyPlugin and myPlugin throughout with the name // of your first plugin class, and fill in the gaps as appropriate. #include #include #include "MyPlugin.h" // Declare one static adapter here for each plugin class in this library. static Vamp::PluginAdapter myPluginAdapter; // This is the entry-point for the library, and the only function that // needs to be publicly exported. const VampPluginDescriptor * vampGetPluginDescriptor(unsigned int version, unsigned int index) { if (version < 1) return 0; // Return a different plugin adaptor's descriptor for each index, // and return 0 for the first index after you run out of plugins. // (That's how the host finds out how many plugins are in this // library.) switch (index) { case 0: return myPluginAdapter.getDescriptor(); default: return 0; } } sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/vamp-plugin.list0000644000000000000000000000003113111512442023124 0ustar 00000000000000_vampGetPluginDescriptor sonic-visualiser-3.0.3/vamp-plugin-sdk/skeleton/vamp-plugin.map0000644000000000000000000000006213111512442022732 0ustar 00000000000000{ global: vampGetPluginDescriptor; local: *; }; sonic-visualiser-3.0.3/vamp-plugin-sdk/src/doc-overview0000644000000000000000000001633513111512442021305 0ustar 00000000000000 /** \mainpage Vamp Plugin SDK \section about About Vamp Vamp is an API for C and C++ plugins that process sampled audio data to produce descriptive output (measurements or semantic observations). Find more information at http://www.vamp-plugins.org/ . Although the official API for Vamp plugins is defined in C for maximum binary compatibility, we strongly recommend using the provided C++ classes in the SDK to implement your own plugins and hosts. \section plugins For Plugins Plugins should subclass Vamp::Plugin, and then use a Vamp::PluginAdapter to expose the correct C API for the plugin. Read the documentation for Vamp::PluginBase and Vamp::Plugin before starting. Plugins should be compiled and linked into dynamic libraries using the usual convention for your platform, and should link (preferably statically) with -lvamp-sdk. Any number of plugins can reside in a single dynamic library. See plugins.cpp in the example plugins directory for the sort of code that will need to accompany your plugin class or classes, to make it possible for a host to look up your plugins properly. Please read the relevant README file for your platform found in the Vamp SDK build/ directory, for details about how to ensure the resulting dynamic library exports the correct linker symbols. The following example plugins are provided. You may legally reuse any amount of the code from these examples in any plugins you write, whether proprietary or open-source. - ZeroCrossing calculates the positions and density of zero-crossing points in an audio waveform. - SpectralCentroid calculates the centre of gravity of the frequency domain representation of each block of audio. - PowerSpectrum calculates a power spectrum from the input audio. Actually, it doesn't do any work except calculating power from a cartesian complex FFT output. The work of calculating this frequency domain output is done for it by the host or host SDK; the plugin just needs to declare that it wants frequency domain input. This is the simplest of the example plugins. - AmplitudeFollower is a simple implementation of SuperCollider's amplitude-follower algorithm. - PercussionOnsetDetector estimates the locations of percussive onsets using a simple method described in "Drum Source Separation using Percussive Feature Detection and Spectral Modulation" by Dan Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005. - FixedTempoEstimator calculates a single beats-per-minute value which is an estimate of the tempo of a piece of music that is assumed to be of fixed tempo, using autocorrelation of a frequency domain energy rise metric. It has several outputs that return intermediate results used in the calculation, and may be a useful example of a plugin having several outputs with varying feature structures. Plugin authors should also read the Programmer's Guide at http://vamp-plugins.org/guide.pdf . \section hosts For Hosts Hosts will normally use a Vamp::PluginHostAdapter to convert each plugin's exposed C API back into a useful Vamp::Plugin C++ object. The Vamp::HostExt namespace contains several additional C++ classes to do this work for them, and make the host's life easier: - Vamp::HostExt::PluginLoader provides a very easy interface for a host to discover, load, and find out category information about the available plugins. Most Vamp hosts will probably want to use this class. - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for hosts to handle plugins that want frequency-domain input, without having to convert the input themselves. - Vamp::HostExt::PluginChannelAdapter provides a simple means for hosts to use plugins that do not necessarily support the same number of audio channels as they have available, without having to apply a channel management / mixdown policy themselves. - Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to avoid having to negotiate the input step and block size, instead permitting the host to use any block size they desire (and a step size equal to it). This is particularly useful for "streaming" hosts that cannot seek backwards in the input audio stream and so would otherwise need to implement an additional buffer to support step sizes smaller than the block size. - Vamp::HostExt::PluginSummarisingAdapter provides summarisation methods such as mean and median averages of output features, for use in any context where an available plugin produces individual values but the result that is actually needed is some sort of aggregate. The PluginLoader class can also use the input domain, channel, and buffering adapters automatically to make these conversions transparent to the host if required. Host authors should also refer to the example host code in the host directory of the SDK. Hosts should link with -lvamp-hostsdk. (The following notes in this section are mostly relevant for developers that are not using the HostExt classes, or that wish to know more about the policy they implement.) The Vamp API does not officially specify how to load plugin libraries or where to find them. However, the SDK does include a function (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended directory search path that hosts may use for plugin libraries, and a class (Vamp::HostExt::PluginLoader) that implements a sensible cross-platform lookup policy using this path. We recommend using this class in your host unless you have a good reason not to want to. This implementation also permits the user to set the environment variable VAMP_PATH to override the default path if desired. The policy used by Vamp::HostExt::PluginLoader -- and our recommendation for any host -- is to search each directory in this path for .DLL (on Windows), .so (on Linux, Solaris, BSD etc) or .dylib (on OS/X) files, then to load each one and perform a dynamic name lookup on the vampGetPluginDescriptor function to enumerate the plugins in the library. The example host has some code that may help, but this operation will necessarily be system-dependent. Vamp also has an informal convention for sorting plugins into functional categories. In addition to the library file itself, a plugin library may install a category file with the same name as the library but .cat extension. The existence and format of this file are not specified by the Vamp API, but by convention the file may contain lines of the format \code vamp:pluginlibrary:pluginname::General Category > Specific Category \endcode which a host may read and use to assign plugins a location within a category tree for display to the user. The expectation is that advanced users may also choose to set up their own preferred category trees, which is why this information is not queried as part of the Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also provides support for plugin category lookup using this scheme. \section license License This plugin SDK is freely redistributable under a "new-style BSD" licence. See the file COPYING for more details. In short, you may modify and redistribute the SDK and example plugins within any commercial or non-commercial, proprietary or open-source plugin or application under almost any conditions, with no obligation to provide source code, provided you retain the original copyright note. */ sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/Files.cpp0000644000000000000000000002131413111512442023130 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2015 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include "Files.h" #include // tolower #include #ifdef _WIN32 #include #include #define PLUGIN_SUFFIX "dll" #else /* ! _WIN32 */ #include #include #ifdef __APPLE__ #define PLUGIN_SUFFIX "dylib" #else /* ! __APPLE__ */ #define PLUGIN_SUFFIX "so" #endif /* ! __APPLE__ */ #endif /* ! _WIN32 */ using namespace std; vector Files::listLibraryFiles() { return listLibraryFilesMatching(Filter()); } vector Files::listLibraryFilesMatching(Filter filter) { vector path = Vamp::PluginHostAdapter::getPluginPath(); vector libraryFiles; // we match case-insensitively, but only with ascii range // characters (input strings are expected to be utf-8) vector libraryNames; for (int j = 0; j < int(filter.libraryNames.size()); ++j) { string n = filter.libraryNames[j]; for (size_t i = 0; i < n.length(); ++i) { if (!(n[i] & 0x80)) { n[i] = char(tolower(n[i])); } } libraryNames.push_back(n); } for (size_t i = 0; i < path.size(); ++i) { vector files = listFiles(path[i], PLUGIN_SUFFIX); for (vector::iterator fi = files.begin(); fi != files.end(); ++fi) { // we match case-insensitively, but only with ascii range // characters (this string is expected to be utf-8) string cleaned = *fi; for (size_t j = 0; j < cleaned.length(); ++j) { if (!(cleaned[j] & 0x80)) { cleaned[j] = char(tolower(cleaned[j])); } } // libraryName should be lacking an extension, as it is // supposed to have come from the plugin key string::size_type pi = cleaned.find('.'); if (pi != string::npos) { cleaned = cleaned.substr(0, pi); } bool matched = false; switch (filter.type) { case Filter::All: matched = true; break; case Filter::Matching: for (int j = 0; j < int(libraryNames.size()); ++j) { if (cleaned == libraryNames[j]) { matched = true; break; } } break; case Filter::NotMatching: matched = true; for (int j = 0; j < int(libraryNames.size()); ++j) { if (cleaned == libraryNames[j]) { matched = false; break; } } break; } if (!matched) continue; string fullPath = path[i]; fullPath = splicePath(fullPath, *fi); libraryFiles.push_back(fullPath); } } return libraryFiles; } void * Files::loadLibrary(string path) { void *handle = 0; #ifdef _WIN32 #ifdef UNICODE int wlen = MultiByteToWideChar(CP_UTF8, 0, path.c_str(), path.length(), 0, 0); if (wlen < 0) { cerr << "Vamp::HostExt: Unable to convert library path \"" << path << "\" to wide characters " << endl; return handle; } wchar_t *buffer = new wchar_t[wlen+1]; (void)MultiByteToWideChar(CP_UTF8, 0, path.c_str(), path.length(), buffer, wlen); buffer[wlen] = L'\0'; handle = LoadLibrary(buffer); delete[] buffer; #else handle = LoadLibrary(path.c_str()); #endif if (!handle) { cerr << "Vamp::HostExt: Unable to load library \"" << path << "\"" << endl; } #else handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL); if (!handle) { cerr << "Vamp::HostExt: Unable to load library \"" << path << "\": " << dlerror() << endl; } #endif return handle; } void Files::unloadLibrary(void *handle) { #ifdef _WIN32 FreeLibrary((HINSTANCE)handle); #else dlclose(handle); #endif } void * Files::lookupInLibrary(void *handle, const char *symbol) { #ifdef _WIN32 return (void *)GetProcAddress((HINSTANCE)handle, symbol); #else return (void *)dlsym(handle, symbol); #endif } string Files::lcBasename(string path) { string basename(path); string::size_type li = basename.rfind('/'); if (li != string::npos) basename = basename.substr(li + 1); #ifdef _WIN32 li = basename.rfind('\\'); if (li != string::npos) basename = basename.substr(li + 1); #endif li = basename.find('.'); if (li != string::npos) basename = basename.substr(0, li); // case-insensitive, but only with ascii range characters (this // string is expected to be utf-8) for (size_t i = 0; i < basename.length(); ++i) { if (!(basename[i] & 0x80)) { basename[i] = char(tolower(basename[i])); } } return basename; } string Files::splicePath(string a, string b) { #ifdef _WIN32 return a + "\\" + b; #else return a + "/" + b; #endif } vector Files::listFiles(string dir, string extension) { vector files; #ifdef _WIN32 string expression = dir + "\\*." + extension; #ifdef UNICODE int wlen = MultiByteToWideChar(CP_UTF8, 0, expression.c_str(), expression.length(), 0, 0); if (wlen < 0) { cerr << "Vamp::HostExt: Unable to convert wildcard path \"" << expression << "\" to wide characters" << endl; return files; } wchar_t *buffer = new wchar_t[wlen+1]; (void)MultiByteToWideChar(CP_UTF8, 0, expression.c_str(), expression.length(), buffer, wlen); buffer[wlen] = L'\0'; WIN32_FIND_DATA data; HANDLE fh = FindFirstFile(buffer, &data); if (fh == INVALID_HANDLE_VALUE) { delete[] buffer; return files; } bool ok = true; while (ok) { wchar_t *fn = data.cFileName; int wlen = wcslen(fn); int len = WideCharToMultiByte(CP_UTF8, 0, fn, wlen, 0, 0, 0, 0); if (len < 0) { cerr << "Vamp::HostExt: Unable to convert wide char filename to utf-8" << endl; break; } char *conv = new char[len+1]; (void)WideCharToMultiByte(CP_UTF8, 0, fn, wlen, conv, len, 0, 0); conv[len] = '\0'; if (len > 0) { files.push_back(conv); } delete[] conv; ok = FindNextFile(fh, &data); } FindClose(fh); delete[] buffer; #else WIN32_FIND_DATA data; HANDLE fh = FindFirstFile(expression.c_str(), &data); if (fh == INVALID_HANDLE_VALUE) return files; bool ok = true; while (ok) { files.push_back(data.cFileName); ok = FindNextFile(fh, &data); } FindClose(fh); #endif #else size_t extlen = extension.length(); DIR *d = opendir(dir.c_str()); if (!d) return files; struct dirent *e = 0; while ((e = readdir(d))) { size_t len = strlen(e->d_name); if (len < extlen + 2 || e->d_name + len - extlen - 1 != "." + extension) { continue; } files.push_back(e->d_name); } closedir(d); #endif return files; } sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/Files.h0000644000000000000000000000464013111512442022600 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2015 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef VAMP_FILES_H #define VAMP_FILES_H #include #include /** * This is a private implementation class for the Vamp Host SDK. */ class Files { public: static std::vector listLibraryFiles(); struct Filter { enum { All, Matching, NotMatching } type; std::vector libraryNames; Filter() : type(All) { } }; static std::vector listLibraryFilesMatching(Filter); static void *loadLibrary(std::string filename); static void unloadLibrary(void *); static void *lookupInLibrary(void *, const char *symbol); static std::string lcBasename(std::string path); static std::string splicePath(std::string a, std::string b); static std::vector listFiles(std::string dir, std::string ext); }; #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginBufferingAdapter.cpp0000644000000000000000000005354713111512442026472 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. This file by Mark Levy and Chris Cannam, Copyright 2007-2009 QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #include #include #include using std::cerr; using std::endl; using std::vector; using std::map; _VAMP_SDK_HOSTSPACE_BEGIN(PluginBufferingAdapter.cpp) namespace Vamp { namespace HostExt { class PluginBufferingAdapter::Impl { public: Impl(Plugin *plugin, float inputSampleRate); ~Impl(); void setPluginStepSize(size_t stepSize); void setPluginBlockSize(size_t blockSize); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void getActualStepAndBlockSizes(size_t &stepSize, size_t &blockSize); OutputList getOutputDescriptors() const; void setParameter(std::string, float); void selectProgram(std::string); void reset(); FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet getRemainingFeatures(); protected: class RingBuffer { public: RingBuffer(int n) : m_buffer(new float[n+1]), m_writer(0), m_reader(0), m_size(n+1) { } virtual ~RingBuffer() { delete[] m_buffer; } int getSize() const { return m_size-1; } void reset() { m_writer = 0; m_reader = 0; } int getReadSpace() const { int writer = m_writer, reader = m_reader, space; if (writer > reader) space = writer - reader; else if (writer < reader) space = (writer + m_size) - reader; else space = 0; return space; } int getWriteSpace() const { int writer = m_writer; int reader = m_reader; int space = (reader + m_size - writer - 1); if (space >= m_size) space -= m_size; return space; } int peek(float *destination, int n) const { int available = getReadSpace(); if (n > available) { for (int i = available; i < n; ++i) { destination[i] = 0.f; } n = available; } if (n == 0) return n; int reader = m_reader; int here = m_size - reader; const float *const bufbase = m_buffer + reader; if (here >= n) { for (int i = 0; i < n; ++i) { destination[i] = bufbase[i]; } } else { for (int i = 0; i < here; ++i) { destination[i] = bufbase[i]; } float *const destbase = destination + here; const int nh = n - here; for (int i = 0; i < nh; ++i) { destbase[i] = m_buffer[i]; } } return n; } int skip(int n) { int available = getReadSpace(); if (n > available) { n = available; } if (n == 0) return n; int reader = m_reader; reader += n; while (reader >= m_size) reader -= m_size; m_reader = reader; return n; } int write(const float *source, int n) { int available = getWriteSpace(); if (n > available) { n = available; } if (n == 0) return n; int writer = m_writer; int here = m_size - writer; float *const bufbase = m_buffer + writer; if (here >= n) { for (int i = 0; i < n; ++i) { bufbase[i] = source[i]; } } else { for (int i = 0; i < here; ++i) { bufbase[i] = source[i]; } const int nh = n - here; const float *const srcbase = source + here; float *const buf = m_buffer; for (int i = 0; i < nh; ++i) { buf[i] = srcbase[i]; } } writer += n; while (writer >= m_size) writer -= m_size; m_writer = writer; return n; } int zero(int n) { int available = getWriteSpace(); if (n > available) { n = available; } if (n == 0) return n; int writer = m_writer; int here = m_size - writer; float *const bufbase = m_buffer + writer; if (here >= n) { for (int i = 0; i < n; ++i) { bufbase[i] = 0.f; } } else { for (int i = 0; i < here; ++i) { bufbase[i] = 0.f; } const int nh = n - here; for (int i = 0; i < nh; ++i) { m_buffer[i] = 0.f; } } writer += n; while (writer >= m_size) writer -= m_size; m_writer = writer; return n; } protected: float *m_buffer; int m_writer; int m_reader; int m_size; private: RingBuffer(const RingBuffer &); // not provided RingBuffer &operator=(const RingBuffer &); // not provided }; Plugin *m_plugin; size_t m_inputStepSize; // value passed to wrapper initialise() size_t m_inputBlockSize; // value passed to wrapper initialise() size_t m_setStepSize; // value passed to setPluginStepSize() size_t m_setBlockSize; // value passed to setPluginBlockSize() size_t m_stepSize; // value actually used to initialise plugin size_t m_blockSize; // value actually used to initialise plugin size_t m_channels; vector m_queue; float **m_buffers; float m_inputSampleRate; long m_frame; bool m_unrun; mutable OutputList m_outputs; mutable std::map m_rewriteOutputTimes; std::map m_fixedRateFeatureNos; // output no -> feature no void processBlock(FeatureSet& allFeatureSets); void adjustFixedRateFeatureTime(int outputNo, Feature &); }; PluginBufferingAdapter::PluginBufferingAdapter(Plugin *plugin) : PluginWrapper(plugin) { m_impl = new Impl(plugin, m_inputSampleRate); } PluginBufferingAdapter::~PluginBufferingAdapter() { delete m_impl; } size_t PluginBufferingAdapter::getPreferredStepSize() const { return getPreferredBlockSize(); } size_t PluginBufferingAdapter::getPreferredBlockSize() const { return PluginWrapper::getPreferredBlockSize(); } size_t PluginBufferingAdapter::getPluginPreferredStepSize() const { return PluginWrapper::getPreferredStepSize(); } size_t PluginBufferingAdapter::getPluginPreferredBlockSize() const { return PluginWrapper::getPreferredBlockSize(); } void PluginBufferingAdapter::setPluginStepSize(size_t stepSize) { m_impl->setPluginStepSize(stepSize); } void PluginBufferingAdapter::setPluginBlockSize(size_t blockSize) { m_impl->setPluginBlockSize(blockSize); } void PluginBufferingAdapter::getActualStepAndBlockSizes(size_t &stepSize, size_t &blockSize) { m_impl->getActualStepAndBlockSizes(stepSize, blockSize); } bool PluginBufferingAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) { return m_impl->initialise(channels, stepSize, blockSize); } PluginBufferingAdapter::OutputList PluginBufferingAdapter::getOutputDescriptors() const { return m_impl->getOutputDescriptors(); } void PluginBufferingAdapter::setParameter(std::string name, float value) { m_impl->setParameter(name, value); } void PluginBufferingAdapter::selectProgram(std::string name) { m_impl->selectProgram(name); } void PluginBufferingAdapter::reset() { m_impl->reset(); } PluginBufferingAdapter::FeatureSet PluginBufferingAdapter::process(const float *const *inputBuffers, RealTime timestamp) { return m_impl->process(inputBuffers, timestamp); } PluginBufferingAdapter::FeatureSet PluginBufferingAdapter::getRemainingFeatures() { return m_impl->getRemainingFeatures(); } PluginBufferingAdapter::Impl::Impl(Plugin *plugin, float inputSampleRate) : m_plugin(plugin), m_inputStepSize(0), m_inputBlockSize(0), m_setStepSize(0), m_setBlockSize(0), m_stepSize(0), m_blockSize(0), m_channels(0), m_queue(0), m_buffers(0), m_inputSampleRate(inputSampleRate), m_frame(0), m_unrun(true) { (void)getOutputDescriptors(); // set up m_outputs and m_rewriteOutputTimes } PluginBufferingAdapter::Impl::~Impl() { // the adapter will delete the plugin for (size_t i = 0; i < m_channels; ++i) { delete m_queue[i]; delete[] m_buffers[i]; } delete[] m_buffers; } void PluginBufferingAdapter::Impl::setPluginStepSize(size_t stepSize) { if (m_inputStepSize != 0) { std::cerr << "PluginBufferingAdapter::setPluginStepSize: ERROR: Cannot be called after initialise()" << std::endl; return; } m_setStepSize = stepSize; } void PluginBufferingAdapter::Impl::setPluginBlockSize(size_t blockSize) { if (m_inputBlockSize != 0) { std::cerr << "PluginBufferingAdapter::setPluginBlockSize: ERROR: Cannot be called after initialise()" << std::endl; return; } m_setBlockSize = blockSize; } void PluginBufferingAdapter::Impl::getActualStepAndBlockSizes(size_t &stepSize, size_t &blockSize) { stepSize = m_stepSize; blockSize = m_blockSize; } bool PluginBufferingAdapter::Impl::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (stepSize != blockSize) { std::cerr << "PluginBufferingAdapter::initialise: input stepSize must be equal to blockSize for this adapter (stepSize = " << stepSize << ", blockSize = " << blockSize << ")" << std::endl; return false; } m_channels = channels; m_inputStepSize = stepSize; m_inputBlockSize = blockSize; // if the user has requested particular step or block sizes, use // those; otherwise use the step and block sizes which the plugin // prefers m_stepSize = 0; m_blockSize = 0; if (m_setStepSize > 0) { m_stepSize = m_setStepSize; } if (m_setBlockSize > 0) { m_blockSize = m_setBlockSize; } if (m_stepSize == 0 && m_blockSize == 0) { m_stepSize = m_plugin->getPreferredStepSize(); m_blockSize = m_plugin->getPreferredBlockSize(); } bool freq = (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain); // or sensible defaults if it has no preference if (m_blockSize == 0) { if (m_stepSize == 0) { m_blockSize = 1024; if (freq) { m_stepSize = m_blockSize / 2; } else { m_stepSize = m_blockSize; } } else if (freq) { m_blockSize = m_stepSize * 2; } else { m_blockSize = m_stepSize; } } else if (m_stepSize == 0) { // m_blockSize != 0 (that was handled above) if (freq) { m_stepSize = m_blockSize/2; } else { m_stepSize = m_blockSize; } } // current implementation breaks if step is greater than block if (m_stepSize > m_blockSize) { size_t newBlockSize; if (freq) { newBlockSize = m_stepSize * 2; } else { newBlockSize = m_stepSize; } std::cerr << "PluginBufferingAdapter::initialise: WARNING: step size " << m_stepSize << " is greater than block size " << m_blockSize << ": cannot handle this in adapter; adjusting block size to " << newBlockSize << std::endl; m_blockSize = newBlockSize; } // std::cerr << "PluginBufferingAdapter::initialise: NOTE: stepSize " << m_inputStepSize << " -> " << m_stepSize // << ", blockSize " << m_inputBlockSize << " -> " << m_blockSize << std::endl; m_buffers = new float *[m_channels]; for (size_t i = 0; i < m_channels; ++i) { m_queue.push_back(new RingBuffer(int(m_blockSize + m_inputBlockSize))); m_buffers[i] = new float[m_blockSize]; } bool success = m_plugin->initialise(m_channels, m_stepSize, m_blockSize); // std::cerr << "PluginBufferingAdapter::initialise: success = " << success << std::endl; if (success) { // Re-query outputs; properties such as bin count may have // changed on initialise m_outputs.clear(); (void)getOutputDescriptors(); } return success; } PluginBufferingAdapter::OutputList PluginBufferingAdapter::Impl::getOutputDescriptors() const { if (m_outputs.empty()) { // std::cerr << "PluginBufferingAdapter::getOutputDescriptors: querying anew" << std::endl; m_outputs = m_plugin->getOutputDescriptors(); } PluginBufferingAdapter::OutputList outs = m_outputs; for (int i = 0; i < int(outs.size()); ++i) { switch (outs[i].sampleType) { case OutputDescriptor::OneSamplePerStep: outs[i].sampleType = OutputDescriptor::FixedSampleRate; outs[i].sampleRate = m_inputSampleRate / float(m_stepSize); m_rewriteOutputTimes[i] = true; break; case OutputDescriptor::FixedSampleRate: if (outs[i].sampleRate == 0.f) { outs[i].sampleRate = m_inputSampleRate / float(m_stepSize); } // We actually only need to rewrite output times for // features that don't have timestamps already, but we // can't tell from here whether our features will have // timestamps or not m_rewriteOutputTimes[i] = true; break; case OutputDescriptor::VariableSampleRate: m_rewriteOutputTimes[i] = false; break; } } return outs; } void PluginBufferingAdapter::Impl::setParameter(std::string name, float value) { m_plugin->setParameter(name, value); // Re-query outputs; properties such as bin count may have changed m_outputs.clear(); (void)getOutputDescriptors(); } void PluginBufferingAdapter::Impl::selectProgram(std::string name) { m_plugin->selectProgram(name); // Re-query outputs; properties such as bin count may have changed m_outputs.clear(); (void)getOutputDescriptors(); } void PluginBufferingAdapter::Impl::reset() { m_frame = 0; m_unrun = true; for (size_t i = 0; i < m_queue.size(); ++i) { m_queue[i]->reset(); } m_fixedRateFeatureNos.clear(); m_plugin->reset(); } PluginBufferingAdapter::FeatureSet PluginBufferingAdapter::Impl::process(const float *const *inputBuffers, RealTime timestamp) { if (m_inputStepSize == 0) { std::cerr << "PluginBufferingAdapter::process: ERROR: Plugin has not been initialised" << std::endl; return FeatureSet(); } FeatureSet allFeatureSets; if (m_unrun) { m_frame = RealTime::realTime2Frame(timestamp, int(m_inputSampleRate + 0.5)); m_unrun = false; } // queue the new input for (size_t i = 0; i < m_channels; ++i) { int written = m_queue[i]->write(inputBuffers[i], int(m_inputBlockSize)); if (written < int(m_inputBlockSize) && i == 0) { std::cerr << "WARNING: PluginBufferingAdapter::Impl::process: " << "Buffer overflow: wrote " << written << " of " << m_inputBlockSize << " input samples (for plugin step size " << m_stepSize << ", block size " << m_blockSize << ")" << std::endl; } } // process as much as we can while (m_queue[0]->getReadSpace() >= int(m_blockSize)) { processBlock(allFeatureSets); } return allFeatureSets; } void PluginBufferingAdapter::Impl::adjustFixedRateFeatureTime(int outputNo, Feature &feature) { // cerr << "adjustFixedRateFeatureTime: from " << feature.timestamp; double rate = m_outputs[outputNo].sampleRate; if (rate == 0.0) { rate = m_inputSampleRate / float(m_stepSize); } if (feature.hasTimestamp) { double secs = feature.timestamp.sec; secs += feature.timestamp.nsec / 1e9; m_fixedRateFeatureNos[outputNo] = int(secs * rate + 0.5); // cerr << " [secs = " << secs << ", no = " << m_fixedRateFeatureNos[outputNo] << "]"; } feature.timestamp = RealTime::fromSeconds (m_fixedRateFeatureNos[outputNo] / rate); // cerr << " to " << feature.timestamp << " (rate = " << rate << ", hasTimestamp = " << feature.hasTimestamp << ")" << endl; feature.hasTimestamp = true; m_fixedRateFeatureNos[outputNo] = m_fixedRateFeatureNos[outputNo] + 1; } PluginBufferingAdapter::FeatureSet PluginBufferingAdapter::Impl::getRemainingFeatures() { FeatureSet allFeatureSets; // process remaining samples in queue while (m_queue[0]->getReadSpace() >= int(m_blockSize)) { processBlock(allFeatureSets); } // pad any last samples remaining and process if (m_queue[0]->getReadSpace() > 0) { for (size_t i = 0; i < m_channels; ++i) { m_queue[i]->zero(int(m_blockSize) - m_queue[i]->getReadSpace()); } processBlock(allFeatureSets); } // get remaining features FeatureSet featureSet = m_plugin->getRemainingFeatures(); for (map::iterator iter = featureSet.begin(); iter != featureSet.end(); ++iter) { int outputNo = iter->first; FeatureList featureList = iter->second; for (size_t i = 0; i < featureList.size(); ++i) { if (m_outputs[outputNo].sampleType == OutputDescriptor::FixedSampleRate) { adjustFixedRateFeatureTime(outputNo, featureList[i]); } allFeatureSets[outputNo].push_back(featureList[i]); } } return allFeatureSets; } void PluginBufferingAdapter::Impl::processBlock(FeatureSet& allFeatureSets) { for (size_t i = 0; i < m_channels; ++i) { m_queue[i]->peek(m_buffers[i], int(m_blockSize)); } long frame = m_frame; RealTime timestamp = RealTime::frame2RealTime (frame, int(m_inputSampleRate + 0.5)); FeatureSet featureSet = m_plugin->process(m_buffers, timestamp); PluginWrapper *wrapper = dynamic_cast(m_plugin); RealTime adjustment; if (wrapper) { PluginInputDomainAdapter *ida = wrapper->getWrapper(); if (ida) adjustment = ida->getTimestampAdjustment(); } for (FeatureSet::iterator iter = featureSet.begin(); iter != featureSet.end(); ++iter) { int outputNo = iter->first; if (m_rewriteOutputTimes[outputNo]) { FeatureList featureList = iter->second; for (size_t i = 0; i < featureList.size(); ++i) { switch (m_outputs[outputNo].sampleType) { case OutputDescriptor::OneSamplePerStep: // use our internal timestamp, always featureList[i].timestamp = timestamp + adjustment; featureList[i].hasTimestamp = true; break; case OutputDescriptor::FixedSampleRate: adjustFixedRateFeatureTime(outputNo, featureList[i]); break; case OutputDescriptor::VariableSampleRate: // plugin must set timestamp break; default: break; } allFeatureSets[outputNo].push_back(featureList[i]); } } else { for (size_t i = 0; i < iter->second.size(); ++i) { allFeatureSets[outputNo].push_back(iter->second[i]); } } } // step forward for (size_t i = 0; i < m_channels; ++i) { m_queue[i]->skip(int(m_stepSize)); } // increment internal frame counter each time we step forward m_frame += m_stepSize; } } } _VAMP_SDK_HOSTSPACE_END(PluginBufferingAdapter.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginChannelAdapter.cpp0000644000000000000000000002013413111512442026115 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include _VAMP_SDK_HOSTSPACE_BEGIN(PluginChannelAdapter.cpp) namespace Vamp { namespace HostExt { class PluginChannelAdapter::Impl { public: Impl(Plugin *plugin); ~Impl(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet processInterleaved(const float *inputBuffers, RealTime timestamp); protected: Plugin *m_plugin; size_t m_blockSize; size_t m_inputChannels; size_t m_pluginChannels; float **m_buffer; float **m_deinterleave; const float **m_forwardPtrs; }; PluginChannelAdapter::PluginChannelAdapter(Plugin *plugin) : PluginWrapper(plugin) { m_impl = new Impl(plugin); } PluginChannelAdapter::~PluginChannelAdapter() { delete m_impl; } bool PluginChannelAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) { return m_impl->initialise(channels, stepSize, blockSize); } PluginChannelAdapter::FeatureSet PluginChannelAdapter::process(const float *const *inputBuffers, RealTime timestamp) { return m_impl->process(inputBuffers, timestamp); } PluginChannelAdapter::FeatureSet PluginChannelAdapter::processInterleaved(const float *inputBuffers, RealTime timestamp) { return m_impl->processInterleaved(inputBuffers, timestamp); } PluginChannelAdapter::Impl::Impl(Plugin *plugin) : m_plugin(plugin), m_blockSize(0), m_inputChannels(0), m_pluginChannels(0), m_buffer(0), m_deinterleave(0), m_forwardPtrs(0) { } PluginChannelAdapter::Impl::~Impl() { // the adapter will delete the plugin if (m_buffer) { if (m_inputChannels > m_pluginChannels) { delete[] m_buffer[0]; } else { for (size_t i = 0; i < m_pluginChannels - m_inputChannels; ++i) { delete[] m_buffer[i]; } } delete[] m_buffer; m_buffer = 0; } if (m_deinterleave) { for (size_t i = 0; i < m_inputChannels; ++i) { delete[] m_deinterleave[i]; } delete[] m_deinterleave; m_deinterleave = 0; } if (m_forwardPtrs) { delete[] m_forwardPtrs; m_forwardPtrs = 0; } } bool PluginChannelAdapter::Impl::initialise(size_t channels, size_t stepSize, size_t blockSize) { m_blockSize = blockSize; size_t minch = m_plugin->getMinChannelCount(); size_t maxch = m_plugin->getMaxChannelCount(); m_inputChannels = channels; if (m_inputChannels < minch) { m_forwardPtrs = new const float *[minch]; if (m_inputChannels > 1) { // We need a set of zero-valued buffers to add to the // forwarded pointers m_buffer = new float*[minch - channels]; for (size_t i = 0; i < minch; ++i) { m_buffer[i] = new float[blockSize]; for (size_t j = 0; j < blockSize; ++j) { m_buffer[i][j] = 0.f; } } } m_pluginChannels = minch; // std::cerr << "PluginChannelAdapter::initialise: expanding " << m_inputChannels << " to " << m_pluginChannels << " for plugin" << std::endl; } else if (m_inputChannels > maxch) { // We only need m_buffer if we are mixing down to a single // channel -- otherwise we can just forward the same float* as // passed in to process(), expecting the excess to be ignored if (maxch == 1) { m_buffer = new float *[1]; m_buffer[0] = new float[blockSize]; // std::cerr << "PluginChannelAdapter::initialise: mixing " << m_inputChannels << " to mono for plugin" << std::endl; } else { // std::cerr << "PluginChannelAdapter::initialise: reducing " << m_inputChannels << " to " << m_pluginChannels << " for plugin" << std::endl; } m_pluginChannels = maxch; } else { // std::cerr << "PluginChannelAdapter::initialise: accepting given number of channels (" << m_inputChannels << ")" << std::endl; m_pluginChannels = m_inputChannels; } return m_plugin->initialise(m_pluginChannels, stepSize, blockSize); } PluginChannelAdapter::FeatureSet PluginChannelAdapter::Impl::processInterleaved(const float *inputBuffers, RealTime timestamp) { if (!m_deinterleave) { m_deinterleave = new float *[m_inputChannels]; for (size_t i = 0; i < m_inputChannels; ++i) { m_deinterleave[i] = new float[m_blockSize]; } } for (size_t i = 0; i < m_inputChannels; ++i) { for (size_t j = 0; j < m_blockSize; ++j) { m_deinterleave[i][j] = inputBuffers[j * m_inputChannels + i]; } } return process(m_deinterleave, timestamp); } PluginChannelAdapter::FeatureSet PluginChannelAdapter::Impl::process(const float *const *inputBuffers, RealTime timestamp) { // std::cerr << "PluginChannelAdapter::process: " << m_inputChannels << " -> " << m_pluginChannels << " channels" << std::endl; if (m_inputChannels < m_pluginChannels) { if (m_inputChannels == 1) { for (size_t i = 0; i < m_pluginChannels; ++i) { m_forwardPtrs[i] = inputBuffers[0]; } } else { for (size_t i = 0; i < m_inputChannels; ++i) { m_forwardPtrs[i] = inputBuffers[i]; } for (size_t i = m_inputChannels; i < m_pluginChannels; ++i) { m_forwardPtrs[i] = m_buffer[i - m_inputChannels]; } } return m_plugin->process(m_forwardPtrs, timestamp); } else if (m_inputChannels > m_pluginChannels) { if (m_pluginChannels == 1) { for (size_t j = 0; j < m_blockSize; ++j) { m_buffer[0][j] = inputBuffers[0][j]; } for (size_t i = 1; i < m_inputChannels; ++i) { for (size_t j = 0; j < m_blockSize; ++j) { m_buffer[0][j] += inputBuffers[i][j]; } } for (size_t j = 0; j < m_blockSize; ++j) { m_buffer[0][j] /= float(m_inputChannels); } return m_plugin->process(m_buffer, timestamp); } else { return m_plugin->process(inputBuffers, timestamp); } } else { return m_plugin->process(inputBuffers, timestamp); } } } } _VAMP_SDK_HOSTSPACE_END(PluginChannelAdapter.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginHostAdapter.cpp0000644000000000000000000003155713111512442025475 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 7 ) #error Unexpected version of Vamp SDK header included #endif _VAMP_SDK_HOSTSPACE_BEGIN(PluginHostAdapter.cpp) namespace Vamp { PluginHostAdapter::PluginHostAdapter(const VampPluginDescriptor *descriptor, float inputSampleRate) : Plugin(inputSampleRate), m_descriptor(descriptor) { // std::cerr << "PluginHostAdapter::PluginHostAdapter (plugin = " << descriptor->name << ")" << std::endl; m_handle = m_descriptor->instantiate(m_descriptor, inputSampleRate); if (!m_handle) { // std::cerr << "WARNING: PluginHostAdapter: Plugin instantiation failed for plugin " << m_descriptor->name << std::endl; } } PluginHostAdapter::~PluginHostAdapter() { // std::cerr << "PluginHostAdapter::~PluginHostAdapter (plugin = " << m_descriptor->name << ")" << std::endl; if (m_handle) m_descriptor->cleanup(m_handle); } std::vector PluginHostAdapter::getPluginPath() { std::vector path; std::string envPath; char *cpath = getenv("VAMP_PATH"); if (cpath) envPath = cpath; #ifdef _WIN32 #define PATH_SEPARATOR ';' #define DEFAULT_VAMP_PATH "%ProgramFiles%\\Vamp Plugins" #else #define PATH_SEPARATOR ':' #ifdef __APPLE__ #define DEFAULT_VAMP_PATH "$HOME/Library/Audio/Plug-Ins/Vamp:/Library/Audio/Plug-Ins/Vamp" #else #define DEFAULT_VAMP_PATH "$HOME/vamp:$HOME/.vamp:/usr/local/lib/vamp:/usr/lib/vamp" #endif #endif if (envPath == "") { envPath = DEFAULT_VAMP_PATH; char *chome = getenv("HOME"); if (chome) { std::string home(chome); std::string::size_type f; while ((f = envPath.find("$HOME")) != std::string::npos && f < envPath.length()) { envPath.replace(f, 5, home); } } #ifdef _WIN32 char *cpfiles = getenv("ProgramFiles"); if (!cpfiles) cpfiles = (char *)"C:\\Program Files"; std::string pfiles(cpfiles); std::string::size_type f; while ((f = envPath.find("%ProgramFiles%")) != std::string::npos && f < envPath.length()) { envPath.replace(f, 14, pfiles); } #endif } std::string::size_type index = 0, newindex = 0; while ((newindex = envPath.find(PATH_SEPARATOR, index)) < envPath.size()) { path.push_back(envPath.substr(index, newindex - index)); index = newindex + 1; } path.push_back(envPath.substr(index)); return path; } bool PluginHostAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (!m_handle) return false; return m_descriptor->initialise (m_handle, (unsigned int)channels, (unsigned int)stepSize, (unsigned int)blockSize) ? true : false; } void PluginHostAdapter::reset() { if (!m_handle) { // std::cerr << "PluginHostAdapter::reset: no handle" << std::endl; return; } // std::cerr << "PluginHostAdapter::reset(" << m_handle << ")" << std::endl; m_descriptor->reset(m_handle); } PluginHostAdapter::InputDomain PluginHostAdapter::getInputDomain() const { if (m_descriptor->inputDomain == vampFrequencyDomain) { return FrequencyDomain; } else { return TimeDomain; } } unsigned int PluginHostAdapter::getVampApiVersion() const { return m_descriptor->vampApiVersion; } std::string PluginHostAdapter::getIdentifier() const { return m_descriptor->identifier; } std::string PluginHostAdapter::getName() const { return m_descriptor->name; } std::string PluginHostAdapter::getDescription() const { return m_descriptor->description; } std::string PluginHostAdapter::getMaker() const { return m_descriptor->maker; } int PluginHostAdapter::getPluginVersion() const { return m_descriptor->pluginVersion; } std::string PluginHostAdapter::getCopyright() const { return m_descriptor->copyright; } PluginHostAdapter::ParameterList PluginHostAdapter::getParameterDescriptors() const { ParameterList list; for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) { const VampParameterDescriptor *spd = m_descriptor->parameters[i]; ParameterDescriptor pd; pd.identifier = spd->identifier; pd.name = spd->name; pd.description = spd->description; pd.unit = spd->unit; pd.minValue = spd->minValue; pd.maxValue = spd->maxValue; pd.defaultValue = spd->defaultValue; pd.isQuantized = spd->isQuantized; pd.quantizeStep = spd->quantizeStep; if (pd.isQuantized && spd->valueNames) { for (unsigned int j = 0; spd->valueNames[j]; ++j) { pd.valueNames.push_back(spd->valueNames[j]); } } list.push_back(pd); } return list; } float PluginHostAdapter::getParameter(std::string param) const { if (!m_handle) return 0.0; for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) { if (param == m_descriptor->parameters[i]->identifier) { return m_descriptor->getParameter(m_handle, i); } } return 0.0; } void PluginHostAdapter::setParameter(std::string param, float value) { if (!m_handle) return; for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) { if (param == m_descriptor->parameters[i]->identifier) { m_descriptor->setParameter(m_handle, i, value); return; } } } PluginHostAdapter::ProgramList PluginHostAdapter::getPrograms() const { ProgramList list; for (unsigned int i = 0; i < m_descriptor->programCount; ++i) { list.push_back(m_descriptor->programs[i]); } return list; } std::string PluginHostAdapter::getCurrentProgram() const { if (!m_handle) return ""; int pn = m_descriptor->getCurrentProgram(m_handle); if (pn < (int)m_descriptor->programCount) { return m_descriptor->programs[pn]; } else { return ""; } } void PluginHostAdapter::selectProgram(std::string program) { if (!m_handle) return; for (unsigned int i = 0; i < m_descriptor->programCount; ++i) { if (program == m_descriptor->programs[i]) { m_descriptor->selectProgram(m_handle, i); return; } } } size_t PluginHostAdapter::getPreferredStepSize() const { if (!m_handle) return 0; return m_descriptor->getPreferredStepSize(m_handle); } size_t PluginHostAdapter::getPreferredBlockSize() const { if (!m_handle) return 0; return m_descriptor->getPreferredBlockSize(m_handle); } size_t PluginHostAdapter::getMinChannelCount() const { if (!m_handle) return 0; return m_descriptor->getMinChannelCount(m_handle); } size_t PluginHostAdapter::getMaxChannelCount() const { if (!m_handle) return 0; return m_descriptor->getMaxChannelCount(m_handle); } PluginHostAdapter::OutputList PluginHostAdapter::getOutputDescriptors() const { OutputList list; if (!m_handle) { // std::cerr << "PluginHostAdapter::getOutputDescriptors: no handle " << std::endl; return list; } unsigned int count = m_descriptor->getOutputCount(m_handle); for (unsigned int i = 0; i < count; ++i) { VampOutputDescriptor *sd = m_descriptor->getOutputDescriptor(m_handle, i); OutputDescriptor d; d.identifier = sd->identifier; d.name = sd->name; d.description = sd->description; d.unit = sd->unit; d.hasFixedBinCount = sd->hasFixedBinCount; d.binCount = sd->binCount; if (d.hasFixedBinCount && sd->binNames) { for (unsigned int j = 0; j < sd->binCount; ++j) { d.binNames.push_back(sd->binNames[j] ? sd->binNames[j] : ""); } } d.hasKnownExtents = sd->hasKnownExtents; d.minValue = sd->minValue; d.maxValue = sd->maxValue; d.isQuantized = sd->isQuantized; d.quantizeStep = sd->quantizeStep; switch (sd->sampleType) { case vampOneSamplePerStep: d.sampleType = OutputDescriptor::OneSamplePerStep; break; case vampFixedSampleRate: d.sampleType = OutputDescriptor::FixedSampleRate; break; case vampVariableSampleRate: d.sampleType = OutputDescriptor::VariableSampleRate; break; } d.sampleRate = sd->sampleRate; if (m_descriptor->vampApiVersion >= 2) { d.hasDuration = sd->hasDuration; } else { d.hasDuration = false; } list.push_back(d); m_descriptor->releaseOutputDescriptor(sd); } return list; } PluginHostAdapter::FeatureSet PluginHostAdapter::process(const float *const *inputBuffers, RealTime timestamp) { FeatureSet fs; if (!m_handle) return fs; int sec = timestamp.sec; int nsec = timestamp.nsec; VampFeatureList *features = m_descriptor->process(m_handle, inputBuffers, sec, nsec); convertFeatures(features, fs); m_descriptor->releaseFeatureSet(features); return fs; } PluginHostAdapter::FeatureSet PluginHostAdapter::getRemainingFeatures() { FeatureSet fs; if (!m_handle) return fs; VampFeatureList *features = m_descriptor->getRemainingFeatures(m_handle); convertFeatures(features, fs); m_descriptor->releaseFeatureSet(features); return fs; } void PluginHostAdapter::convertFeatures(VampFeatureList *features, FeatureSet &fs) { if (!features) return; unsigned int outputs = m_descriptor->getOutputCount(m_handle); for (unsigned int i = 0; i < outputs; ++i) { VampFeatureList &list = features[i]; if (list.featureCount > 0) { Feature feature; feature.values.reserve(list.features[0].v1.valueCount); for (unsigned int j = 0; j < list.featureCount; ++j) { feature.hasTimestamp = list.features[j].v1.hasTimestamp; feature.timestamp = RealTime(list.features[j].v1.sec, list.features[j].v1.nsec); feature.hasDuration = false; if (m_descriptor->vampApiVersion >= 2) { unsigned int j2 = j + list.featureCount; feature.hasDuration = list.features[j2].v2.hasDuration; feature.duration = RealTime(list.features[j2].v2.durationSec, list.features[j2].v2.durationNsec); } for (unsigned int k = 0; k < list.features[j].v1.valueCount; ++k) { feature.values.push_back(list.features[j].v1.values[k]); } if (list.features[j].v1.label) { feature.label = list.features[j].v1.label; } fs[i].push_back(feature); if (list.features[j].v1.valueCount > 0) { feature.values.clear(); } if (list.features[j].v1.label) { feature.label = ""; } } } } } } _VAMP_SDK_HOSTSPACE_END(PluginHostAdapter.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginInputDomainAdapter.cpp0000644000000000000000000003346113111512442027003 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. This file is based in part on Don Cross's public domain FFT implementation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #include "Window.h" #include #include #include #include #include _VAMP_SDK_HOSTSPACE_BEGIN(PluginInputDomainAdapter.cpp) #include "../vamp-sdk/FFTimpl.cpp" namespace Vamp { namespace HostExt { class PluginInputDomainAdapter::Impl { public: Impl(Plugin *plugin, float inputSampleRate); ~Impl(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); size_t getPreferredStepSize() const; size_t getPreferredBlockSize() const; FeatureSet process(const float *const *inputBuffers, RealTime timestamp); void setProcessTimestampMethod(ProcessTimestampMethod m); ProcessTimestampMethod getProcessTimestampMethod() const; RealTime getTimestampAdjustment() const; WindowType getWindowType() const; void setWindowType(WindowType type); protected: Plugin *m_plugin; float m_inputSampleRate; int m_channels; int m_stepSize; int m_blockSize; float **m_freqbuf; Kiss::kiss_fft_scalar *m_ri; WindowType m_windowType; typedef Window W; W *m_window; ProcessTimestampMethod m_method; int m_processCount; float **m_shiftBuffers; Kiss::kiss_fftr_cfg m_cfg; Kiss::kiss_fft_cpx *m_cbuf; FeatureSet processShiftingTimestamp(const float *const *inputBuffers, RealTime timestamp); FeatureSet processShiftingData(const float *const *inputBuffers, RealTime timestamp); size_t makeBlockSizeAcceptable(size_t) const; W::WindowType convertType(WindowType t) const; }; PluginInputDomainAdapter::PluginInputDomainAdapter(Plugin *plugin) : PluginWrapper(plugin) { m_impl = new Impl(plugin, m_inputSampleRate); } PluginInputDomainAdapter::~PluginInputDomainAdapter() { delete m_impl; } bool PluginInputDomainAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) { return m_impl->initialise(channels, stepSize, blockSize); } void PluginInputDomainAdapter::reset() { m_impl->reset(); } Plugin::InputDomain PluginInputDomainAdapter::getInputDomain() const { return TimeDomain; } size_t PluginInputDomainAdapter::getPreferredStepSize() const { return m_impl->getPreferredStepSize(); } size_t PluginInputDomainAdapter::getPreferredBlockSize() const { return m_impl->getPreferredBlockSize(); } Plugin::FeatureSet PluginInputDomainAdapter::process(const float *const *inputBuffers, RealTime timestamp) { return m_impl->process(inputBuffers, timestamp); } void PluginInputDomainAdapter::setProcessTimestampMethod(ProcessTimestampMethod m) { m_impl->setProcessTimestampMethod(m); } PluginInputDomainAdapter::ProcessTimestampMethod PluginInputDomainAdapter::getProcessTimestampMethod() const { return m_impl->getProcessTimestampMethod(); } RealTime PluginInputDomainAdapter::getTimestampAdjustment() const { return m_impl->getTimestampAdjustment(); } PluginInputDomainAdapter::WindowType PluginInputDomainAdapter::getWindowType() const { return m_impl->getWindowType(); } void PluginInputDomainAdapter::setWindowType(WindowType w) { m_impl->setWindowType(w); } PluginInputDomainAdapter::Impl::Impl(Plugin *plugin, float inputSampleRate) : m_plugin(plugin), m_inputSampleRate(inputSampleRate), m_channels(0), m_stepSize(0), m_blockSize(0), m_freqbuf(0), m_ri(0), m_windowType(HanningWindow), m_window(0), m_method(ShiftTimestamp), m_processCount(0), m_shiftBuffers(0), m_cfg(0), m_cbuf(0) { } PluginInputDomainAdapter::Impl::~Impl() { // the adapter will delete the plugin if (m_shiftBuffers) { for (int c = 0; c < m_channels; ++c) { delete[] m_shiftBuffers[c]; } delete[] m_shiftBuffers; } if (m_channels > 0) { for (int c = 0; c < m_channels; ++c) { delete[] m_freqbuf[c]; } delete[] m_freqbuf; delete[] m_ri; if (m_cfg) { Kiss::kiss_fftr_free(m_cfg); m_cfg = 0; delete[] m_cbuf; m_cbuf = 0; } delete m_window; } } // for some visual studii apparently #ifndef M_PI #define M_PI 3.14159265358979232846 #endif bool PluginInputDomainAdapter::Impl::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (m_plugin->getInputDomain() == TimeDomain) { m_stepSize = int(stepSize); m_blockSize = int(blockSize); m_channels = int(channels); return m_plugin->initialise(channels, stepSize, blockSize); } if (blockSize < 2) { std::cerr << "ERROR: PluginInputDomainAdapter::initialise: blocksize < 2 not supported" << std::endl; return false; } if (blockSize % 2) { std::cerr << "ERROR: PluginInputDomainAdapter::initialise: odd blocksize " << blockSize << " not supported" << std::endl; return false; } if (m_channels > 0) { for (int c = 0; c < m_channels; ++c) { delete[] m_freqbuf[c]; } delete[] m_freqbuf; delete[] m_ri; if (m_cfg) { Kiss::kiss_fftr_free(m_cfg); m_cfg = 0; delete[] m_cbuf; m_cbuf = 0; } delete m_window; } m_stepSize = int(stepSize); m_blockSize = int(blockSize); m_channels = int(channels); m_freqbuf = new float *[m_channels]; for (int c = 0; c < m_channels; ++c) { m_freqbuf[c] = new float[m_blockSize + 2]; } m_ri = new Kiss::kiss_fft_scalar[m_blockSize]; m_window = new W(convertType(m_windowType), m_blockSize); m_cfg = Kiss::kiss_fftr_alloc(m_blockSize, false, 0, 0); m_cbuf = new Kiss::kiss_fft_cpx[m_blockSize/2+1]; m_processCount = 0; return m_plugin->initialise(channels, stepSize, m_blockSize); } void PluginInputDomainAdapter::Impl::reset() { m_processCount = 0; m_plugin->reset(); } size_t PluginInputDomainAdapter::Impl::getPreferredStepSize() const { size_t step = m_plugin->getPreferredStepSize(); if (step == 0 && (m_plugin->getInputDomain() == FrequencyDomain)) { step = getPreferredBlockSize() / 2; } return step; } size_t PluginInputDomainAdapter::Impl::getPreferredBlockSize() const { size_t block = m_plugin->getPreferredBlockSize(); if (m_plugin->getInputDomain() == FrequencyDomain) { if (block == 0) { block = 1024; } else { block = makeBlockSizeAcceptable(block); } } return block; } size_t PluginInputDomainAdapter::Impl::makeBlockSizeAcceptable(size_t blockSize) const { if (blockSize < 2) { std::cerr << "WARNING: PluginInputDomainAdapter::initialise: blocksize < 2 not" << std::endl << "supported, increasing from " << blockSize << " to 2" << std::endl; blockSize = 2; } else if (blockSize % 2) { std::cerr << "WARNING: PluginInputDomainAdapter::initialise: odd blocksize not" << std::endl << "supported, increasing from " << blockSize << " to " << (blockSize+1) << std::endl; blockSize = blockSize+1; } return blockSize; } RealTime PluginInputDomainAdapter::Impl::getTimestampAdjustment() const { if (m_plugin->getInputDomain() == TimeDomain) { return RealTime::zeroTime; } else if (m_method == ShiftData || m_method == NoShift) { return RealTime::zeroTime; } else { return RealTime::frame2RealTime (m_blockSize/2, int(m_inputSampleRate + 0.5)); } } void PluginInputDomainAdapter::Impl::setProcessTimestampMethod(ProcessTimestampMethod m) { m_method = m; } PluginInputDomainAdapter::ProcessTimestampMethod PluginInputDomainAdapter::Impl::getProcessTimestampMethod() const { return m_method; } void PluginInputDomainAdapter::Impl::setWindowType(WindowType t) { if (m_windowType == t) return; m_windowType = t; if (m_window) { delete m_window; m_window = new W(convertType(m_windowType), m_blockSize); } } PluginInputDomainAdapter::WindowType PluginInputDomainAdapter::Impl::getWindowType() const { return m_windowType; } PluginInputDomainAdapter::Impl::W::WindowType PluginInputDomainAdapter::Impl::convertType(WindowType t) const { switch (t) { case RectangularWindow: return W::RectangularWindow; case BartlettWindow: return W::BartlettWindow; case HammingWindow: return W::HammingWindow; case HanningWindow: return W::HanningWindow; case BlackmanWindow: return W::BlackmanWindow; case NuttallWindow: return W::NuttallWindow; case BlackmanHarrisWindow: return W::BlackmanHarrisWindow; default: return W::HanningWindow; } } Plugin::FeatureSet PluginInputDomainAdapter::Impl::process(const float *const *inputBuffers, RealTime timestamp) { if (m_plugin->getInputDomain() == TimeDomain) { return m_plugin->process(inputBuffers, timestamp); } if (m_method == ShiftTimestamp || m_method == NoShift) { return processShiftingTimestamp(inputBuffers, timestamp); } else { return processShiftingData(inputBuffers, timestamp); } } Plugin::FeatureSet PluginInputDomainAdapter::Impl::processShiftingTimestamp(const float *const *inputBuffers, RealTime timestamp) { unsigned int roundedRate = 1; if (m_inputSampleRate > 0.f) { roundedRate = (unsigned int)round(m_inputSampleRate); } if (m_method == ShiftTimestamp) { // we may need to add one nsec if timestamp + // getTimestampAdjustment() rounds down timestamp = timestamp + getTimestampAdjustment(); RealTime nsec(0, 1); if (RealTime::realTime2Frame(timestamp, roundedRate) < RealTime::realTime2Frame(timestamp + nsec, roundedRate)) { timestamp = timestamp + nsec; } } for (int c = 0; c < m_channels; ++c) { m_window->cut(inputBuffers[c], m_ri); for (int i = 0; i < m_blockSize/2; ++i) { // FFT shift Kiss::kiss_fft_scalar value = m_ri[i]; m_ri[i] = m_ri[i + m_blockSize/2]; m_ri[i + m_blockSize/2] = value; } Kiss::kiss_fftr(m_cfg, m_ri, m_cbuf); for (int i = 0; i <= m_blockSize/2; ++i) { m_freqbuf[c][i * 2] = float(m_cbuf[i].r); m_freqbuf[c][i * 2 + 1] = float(m_cbuf[i].i); } } return m_plugin->process(m_freqbuf, timestamp); } Plugin::FeatureSet PluginInputDomainAdapter::Impl::processShiftingData(const float *const *inputBuffers, RealTime timestamp) { if (m_processCount == 0) { if (!m_shiftBuffers) { m_shiftBuffers = new float *[m_channels]; for (int c = 0; c < m_channels; ++c) { m_shiftBuffers[c] = new float[m_blockSize + m_blockSize/2]; } } for (int c = 0; c < m_channels; ++c) { for (int i = 0; i < m_blockSize + m_blockSize/2; ++i) { m_shiftBuffers[c][i] = 0.f; } } } for (int c = 0; c < m_channels; ++c) { for (int i = m_stepSize; i < m_blockSize + m_blockSize/2; ++i) { m_shiftBuffers[c][i - m_stepSize] = m_shiftBuffers[c][i]; } for (int i = 0; i < m_blockSize; ++i) { m_shiftBuffers[c][i + m_blockSize/2] = inputBuffers[c][i]; } } for (int c = 0; c < m_channels; ++c) { m_window->cut(m_shiftBuffers[c], m_ri); for (int i = 0; i < m_blockSize/2; ++i) { // FFT shift Kiss::kiss_fft_scalar value = m_ri[i]; m_ri[i] = m_ri[i + m_blockSize/2]; m_ri[i + m_blockSize/2] = value; } Kiss::kiss_fftr(m_cfg, m_ri, m_cbuf); for (int i = 0; i <= m_blockSize/2; ++i) { m_freqbuf[c][i * 2] = float(m_cbuf[i].r); m_freqbuf[c][i * 2 + 1] = float(m_cbuf[i].i); } } ++m_processCount; return m_plugin->process(m_freqbuf, timestamp); } } } _VAMP_SDK_HOSTSPACE_END(PluginInputDomainAdapter.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginLoader.cpp0000644000000000000000000004224713111512442024463 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2016 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #include #include #include #include #include "Files.h" #include using namespace std; _VAMP_SDK_HOSTSPACE_BEGIN(PluginLoader.cpp) namespace Vamp { namespace HostExt { class PluginLoader::Impl { public: Impl(); virtual ~Impl(); PluginKeyList listPlugins(); PluginKeyList listPluginsIn(vector); PluginKeyList listPluginsNotIn(vector); Plugin *loadPlugin(PluginKey key, float inputSampleRate, int adapterFlags); PluginKey composePluginKey(string libraryName, string identifier); PluginCategoryHierarchy getPluginCategory(PluginKey key); string getLibraryPathForPlugin(PluginKey key); static void setInstanceToClean(PluginLoader *instance); protected: class PluginDeletionNotifyAdapter : public PluginWrapper { public: PluginDeletionNotifyAdapter(Plugin *plugin, Impl *loader); virtual ~PluginDeletionNotifyAdapter(); protected: Impl *m_loader; }; class InstanceCleaner { public: InstanceCleaner() : m_instance(0) { } ~InstanceCleaner() { delete m_instance; } void setInstance(PluginLoader *instance) { m_instance = instance; } protected: PluginLoader *m_instance; }; virtual void pluginDeleted(PluginDeletionNotifyAdapter *adapter); map m_pluginLibraryNameMap; bool m_allPluginsEnumerated; struct Enumeration { enum { All, SinglePlugin, InLibraries, NotInLibraries } type; PluginKey key; vector libraryNames; Enumeration() : type(All) { } }; vector listLibraryFilesFor(Enumeration); /// Populate m_pluginLibraryNameMap and return a list of the keys /// that were added to it vector enumeratePlugins(Enumeration); map m_taxonomy; void generateTaxonomy(); map m_pluginLibraryHandleMap; bool decomposePluginKey(PluginKey key, string &libraryName, string &identifier); static InstanceCleaner m_cleaner; }; PluginLoader * PluginLoader::m_instance = 0; PluginLoader::Impl::InstanceCleaner PluginLoader::Impl::m_cleaner; PluginLoader::PluginLoader() { m_impl = new Impl(); } PluginLoader::~PluginLoader() { delete m_impl; } PluginLoader * PluginLoader::getInstance() { if (!m_instance) { // The cleaner doesn't own the instance, because we leave the // instance pointer in the base class for binary backwards // compatibility reasons and to avoid waste m_instance = new PluginLoader(); Impl::setInstanceToClean(m_instance); } return m_instance; } PluginLoader::PluginKeyList PluginLoader::listPlugins() { return m_impl->listPlugins(); } PluginLoader::PluginKeyList PluginLoader::listPluginsIn(vector libs) { return m_impl->listPluginsIn(libs); } PluginLoader::PluginKeyList PluginLoader::listPluginsNotIn(vector libs) { return m_impl->listPluginsNotIn(libs); } Plugin * PluginLoader::loadPlugin(PluginKey key, float inputSampleRate, int adapterFlags) { return m_impl->loadPlugin(key, inputSampleRate, adapterFlags); } PluginLoader::PluginKey PluginLoader::composePluginKey(string libraryName, string identifier) { return m_impl->composePluginKey(libraryName, identifier); } PluginLoader::PluginCategoryHierarchy PluginLoader::getPluginCategory(PluginKey key) { return m_impl->getPluginCategory(key); } string PluginLoader::getLibraryPathForPlugin(PluginKey key) { return m_impl->getLibraryPathForPlugin(key); } PluginLoader::Impl::Impl() : m_allPluginsEnumerated(false) { } PluginLoader::Impl::~Impl() { } void PluginLoader::Impl::setInstanceToClean(PluginLoader *instance) { m_cleaner.setInstance(instance); } PluginLoader::PluginKeyList PluginLoader::Impl::listPlugins() { if (!m_allPluginsEnumerated) enumeratePlugins(Enumeration()); vector plugins; for (map::const_iterator i = m_pluginLibraryNameMap.begin(); i != m_pluginLibraryNameMap.end(); ++i) { plugins.push_back(i->first); } return plugins; } PluginLoader::PluginKeyList PluginLoader::Impl::listPluginsIn(vector libs) { Enumeration enumeration; enumeration.type = Enumeration::InLibraries; enumeration.libraryNames = libs; return enumeratePlugins(enumeration); } PluginLoader::PluginKeyList PluginLoader::Impl::listPluginsNotIn(vector libs) { Enumeration enumeration; enumeration.type = Enumeration::NotInLibraries; enumeration.libraryNames = libs; return enumeratePlugins(enumeration); } vector PluginLoader::Impl::listLibraryFilesFor(Enumeration enumeration) { Files::Filter filter; switch (enumeration.type) { case Enumeration::All: filter.type = Files::Filter::All; break; case Enumeration::SinglePlugin: { string libraryName, identifier; if (!decomposePluginKey(enumeration.key, libraryName, identifier)) { std::cerr << "WARNING: Vamp::HostExt::PluginLoader: " << "Invalid plugin key \"" << enumeration.key << "\" in enumerate" << std::endl; return vector(); } filter.type = Files::Filter::Matching; filter.libraryNames.clear(); filter.libraryNames.push_back(libraryName); break; } case Enumeration::InLibraries: filter.type = Files::Filter::Matching; filter.libraryNames = enumeration.libraryNames; break; case Enumeration::NotInLibraries: filter.type = Files::Filter::NotMatching; filter.libraryNames = enumeration.libraryNames; break; } return Files::listLibraryFilesMatching(filter); } vector PluginLoader::Impl::enumeratePlugins(Enumeration enumeration) { string libraryName, identifier; if (enumeration.type == Enumeration::SinglePlugin) { decomposePluginKey(enumeration.key, libraryName, identifier); } vector fullPaths = listLibraryFilesFor(enumeration); // For these we should warn if a plugin can be loaded from a library bool specific = (enumeration.type == Enumeration::SinglePlugin || enumeration.type == Enumeration::InLibraries); vector added; for (size_t i = 0; i < fullPaths.size(); ++i) { string fullPath = fullPaths[i]; void *handle = Files::loadLibrary(fullPath); if (!handle) continue; VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction)Files::lookupInLibrary (handle, "vampGetPluginDescriptor"); if (!fn) { if (specific) { cerr << "Vamp::HostExt::PluginLoader: " << "No vampGetPluginDescriptor function found in library \"" << fullPath << "\"" << endl; } Files::unloadLibrary(handle); continue; } int index = 0; const VampPluginDescriptor *descriptor = 0; bool found = false; while ((descriptor = fn(VAMP_API_VERSION, index))) { ++index; if (identifier != "") { if (descriptor->identifier != identifier) { continue; } } found = true; PluginKey key = composePluginKey(fullPath, descriptor->identifier); if (m_pluginLibraryNameMap.find(key) == m_pluginLibraryNameMap.end()) { m_pluginLibraryNameMap[key] = fullPath; } added.push_back(key); } if (!found && specific) { cerr << "Vamp::HostExt::PluginLoader: Plugin \"" << identifier << "\" not found in library \"" << fullPath << "\"" << endl; } Files::unloadLibrary(handle); } if (enumeration.type == Enumeration::All) { m_allPluginsEnumerated = true; } return added; } PluginLoader::PluginKey PluginLoader::Impl::composePluginKey(string libraryName, string identifier) { string basename = Files::lcBasename(libraryName); return basename + ":" + identifier; } bool PluginLoader::Impl::decomposePluginKey(PluginKey key, string &libraryName, string &identifier) { string::size_type ki = key.find(':'); if (ki == string::npos) { return false; } libraryName = key.substr(0, ki); identifier = key.substr(ki + 1); return true; } PluginLoader::PluginCategoryHierarchy PluginLoader::Impl::getPluginCategory(PluginKey plugin) { if (m_taxonomy.empty()) generateTaxonomy(); if (m_taxonomy.find(plugin) == m_taxonomy.end()) { return PluginCategoryHierarchy(); } return m_taxonomy[plugin]; } string PluginLoader::Impl::getLibraryPathForPlugin(PluginKey plugin) { if (m_pluginLibraryNameMap.find(plugin) == m_pluginLibraryNameMap.end()) { if (m_allPluginsEnumerated) return ""; Enumeration enumeration; enumeration.type = Enumeration::SinglePlugin; enumeration.key = plugin; enumeratePlugins(enumeration); } if (m_pluginLibraryNameMap.find(plugin) == m_pluginLibraryNameMap.end()) { return ""; } return m_pluginLibraryNameMap[plugin]; } Plugin * PluginLoader::Impl::loadPlugin(PluginKey key, float inputSampleRate, int adapterFlags) { string libname, identifier; if (!decomposePluginKey(key, libname, identifier)) { std::cerr << "Vamp::HostExt::PluginLoader: Invalid plugin key \"" << key << "\" in loadPlugin" << std::endl; return 0; } string fullPath = getLibraryPathForPlugin(key); if (fullPath == "") { std::cerr << "Vamp::HostExt::PluginLoader: No library found in Vamp path for plugin \"" << key << "\"" << std::endl; return 0; } void *handle = Files::loadLibrary(fullPath); if (!handle) return 0; VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction)Files::lookupInLibrary (handle, "vampGetPluginDescriptor"); if (!fn) { cerr << "Vamp::HostExt::PluginLoader: No vampGetPluginDescriptor function found in library \"" << fullPath << "\"" << endl; Files::unloadLibrary(handle); return 0; } int index = 0; const VampPluginDescriptor *descriptor = 0; while ((descriptor = fn(VAMP_API_VERSION, index))) { if (string(descriptor->identifier) == identifier) { Vamp::PluginHostAdapter *plugin = new Vamp::PluginHostAdapter(descriptor, inputSampleRate); Plugin *adapter = new PluginDeletionNotifyAdapter(plugin, this); m_pluginLibraryHandleMap[adapter] = handle; if (adapterFlags & ADAPT_INPUT_DOMAIN) { if (adapter->getInputDomain() == Plugin::FrequencyDomain) { adapter = new PluginInputDomainAdapter(adapter); } } if (adapterFlags & ADAPT_BUFFER_SIZE) { adapter = new PluginBufferingAdapter(adapter); } if (adapterFlags & ADAPT_CHANNEL_COUNT) { adapter = new PluginChannelAdapter(adapter); } return adapter; } ++index; } cerr << "Vamp::HostExt::PluginLoader: Plugin \"" << identifier << "\" not found in library \"" << fullPath << "\"" << endl; return 0; } void PluginLoader::Impl::generateTaxonomy() { // cerr << "PluginLoader::Impl::generateTaxonomy" << endl; vector path = PluginHostAdapter::getPluginPath(); string libfragment = "/lib/"; vector catpath; string suffix = "cat"; for (vector::iterator i = path.begin(); i != path.end(); ++i) { // It doesn't matter that we're using literal forward-slash in // this bit, as it's only relevant if the path contains // "/lib/", which is only meaningful and only plausible on // systems with forward-slash delimiters string dir = *i; string::size_type li = dir.find(libfragment); if (li != string::npos) { catpath.push_back (dir.substr(0, li) + "/share/" + dir.substr(li + libfragment.length())); } catpath.push_back(dir); } char buffer[1024]; for (vector::iterator i = catpath.begin(); i != catpath.end(); ++i) { vector files = Files::listFiles(*i, suffix); for (vector::iterator fi = files.begin(); fi != files.end(); ++fi) { string filepath = Files::splicePath(*i, *fi); ifstream is(filepath.c_str(), ifstream::in | ifstream::binary); if (is.fail()) { // cerr << "failed to open: " << filepath << endl; continue; } // cerr << "opened: " << filepath << endl; while (!!is.getline(buffer, 1024)) { string line(buffer); // cerr << "line = " << line << endl; string::size_type di = line.find("::"); if (di == string::npos) continue; string id = line.substr(0, di); string encodedCat = line.substr(di + 2); if (id.substr(0, 5) != "vamp:") continue; id = id.substr(5); while (encodedCat.length() >= 1 && encodedCat[encodedCat.length()-1] == '\r') { encodedCat = encodedCat.substr(0, encodedCat.length()-1); } // cerr << "id = " << id << ", cat = " << encodedCat << endl; PluginCategoryHierarchy category; string::size_type ai; while ((ai = encodedCat.find(" > ")) != string::npos) { category.push_back(encodedCat.substr(0, ai)); encodedCat = encodedCat.substr(ai + 3); } if (encodedCat != "") category.push_back(encodedCat); m_taxonomy[id] = category; } } } } void PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) { void *handle = m_pluginLibraryHandleMap[adapter]; if (handle) Files::unloadLibrary(handle); m_pluginLibraryHandleMap.erase(adapter); } PluginLoader::Impl::PluginDeletionNotifyAdapter::PluginDeletionNotifyAdapter(Plugin *plugin, Impl *loader) : PluginWrapper(plugin), m_loader(loader) { } PluginLoader::Impl::PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() { // We need to delete the plugin before calling pluginDeleted, as // the delete call may require calling through to the descriptor // (for e.g. cleanup) but pluginDeleted may unload the required // library for the call. To prevent a double deletion when our // parent's destructor runs (after this one), be sure to set // m_plugin to 0 after deletion. delete m_plugin; m_plugin = 0; if (m_loader) m_loader->pluginDeleted(this); } } } _VAMP_SDK_HOSTSPACE_END(PluginLoader.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginSummarisingAdapter.cpp0000644000000000000000000007577713111512442027072 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #include #include #include using namespace std; //#define DEBUG_PLUGIN_SUMMARISING_ADAPTER 1 //#define DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT 1 _VAMP_SDK_HOSTSPACE_BEGIN(PluginSummarisingAdapter.cpp) namespace Vamp { namespace HostExt { class PluginSummarisingAdapter::Impl { public: Impl(Plugin *plugin, float inputSampleRate); ~Impl(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet getRemainingFeatures(); void setSummarySegmentBoundaries(const SegmentBoundaries &); FeatureList getSummaryForOutput(int output, SummaryType type, AveragingMethod avg); FeatureSet getSummaryForAllOutputs(SummaryType type, AveragingMethod avg); protected: Plugin *m_plugin; float m_inputSampleRate; size_t m_stepSize; size_t m_blockSize; SegmentBoundaries m_boundaries; typedef vector ValueList; struct Result { // smaller than Feature RealTime time; RealTime duration; ValueList values; // bin number -> value }; typedef vector ResultList; struct OutputAccumulator { int bins; ResultList results; OutputAccumulator() : bins(0) { } }; typedef map OutputAccumulatorMap; OutputAccumulatorMap m_accumulators; // output number -> accumulator typedef map SegmentAccumulatorMap; typedef map OutputSegmentAccumulatorMap; OutputSegmentAccumulatorMap m_segmentedAccumulators; // output -> segmented typedef map OutputTimestampMap; OutputTimestampMap m_prevTimestamps; // output number -> timestamp OutputTimestampMap m_prevDurations; // output number -> durations struct OutputBinSummary { int count; // extents double minimum; double maximum; double sum; // sample-average results double median; double mode; double variance; // continuous-time average results double median_c; double mode_c; double mean_c; double variance_c; }; typedef map OutputSummary; typedef map SummarySegmentMap; typedef map OutputSummarySegmentMap; OutputSummarySegmentMap m_summaries; bool m_reduced; RealTime m_endTime; void accumulate(const FeatureSet &fs, RealTime, bool final); void accumulate(int output, const Feature &f, RealTime, bool final); void accumulateFinalDurations(); void findSegmentBounds(RealTime t, RealTime &start, RealTime &end); void segment(); void reduce(); string getSummaryLabel(SummaryType type, AveragingMethod avg); }; static RealTime INVALID_DURATION(INT_MIN, INT_MIN); PluginSummarisingAdapter::PluginSummarisingAdapter(Plugin *plugin) : PluginWrapper(plugin) { m_impl = new Impl(plugin, m_inputSampleRate); } PluginSummarisingAdapter::~PluginSummarisingAdapter() { delete m_impl; } bool PluginSummarisingAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) { return PluginWrapper::initialise(channels, stepSize, blockSize) && m_impl->initialise(channels, stepSize, blockSize); } void PluginSummarisingAdapter::reset() { m_impl->reset(); } Plugin::FeatureSet PluginSummarisingAdapter::process(const float *const *inputBuffers, RealTime timestamp) { return m_impl->process(inputBuffers, timestamp); } Plugin::FeatureSet PluginSummarisingAdapter::getRemainingFeatures() { return m_impl->getRemainingFeatures(); } void PluginSummarisingAdapter::setSummarySegmentBoundaries(const SegmentBoundaries &b) { m_impl->setSummarySegmentBoundaries(b); } Plugin::FeatureList PluginSummarisingAdapter::getSummaryForOutput(int output, SummaryType type, AveragingMethod avg) { return m_impl->getSummaryForOutput(output, type, avg); } Plugin::FeatureSet PluginSummarisingAdapter::getSummaryForAllOutputs(SummaryType type, AveragingMethod avg) { return m_impl->getSummaryForAllOutputs(type, avg); } PluginSummarisingAdapter::Impl::Impl(Plugin *plugin, float inputSampleRate) : m_plugin(plugin), m_inputSampleRate(inputSampleRate), m_reduced(false) { } PluginSummarisingAdapter::Impl::~Impl() { } bool PluginSummarisingAdapter::Impl::initialise(size_t, size_t stepSize, size_t blockSize) { m_stepSize = stepSize; m_blockSize = blockSize; return true; } void PluginSummarisingAdapter::Impl::reset() { m_accumulators.clear(); m_segmentedAccumulators.clear(); m_prevTimestamps.clear(); m_prevDurations.clear(); m_summaries.clear(); m_reduced = false; m_endTime = RealTime(); m_plugin->reset(); } Plugin::FeatureSet PluginSummarisingAdapter::Impl::process(const float *const *inputBuffers, RealTime timestamp) { if (m_reduced) { cerr << "WARNING: Cannot call PluginSummarisingAdapter::process() or getRemainingFeatures() after one of the getSummary methods" << endl; } FeatureSet fs = m_plugin->process(inputBuffers, timestamp); accumulate(fs, timestamp, false); m_endTime = timestamp + RealTime::frame2RealTime(m_stepSize, int(m_inputSampleRate + 0.5)); #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "timestamp = " << timestamp << ", end time becomes " << m_endTime << endl; #endif return fs; } Plugin::FeatureSet PluginSummarisingAdapter::Impl::getRemainingFeatures() { if (m_reduced) { cerr << "WARNING: Cannot call PluginSummarisingAdapter::process() or getRemainingFeatures() after one of the getSummary methods" << endl; } FeatureSet fs = m_plugin->getRemainingFeatures(); accumulate(fs, m_endTime, true); return fs; } void PluginSummarisingAdapter::Impl::setSummarySegmentBoundaries(const SegmentBoundaries &b) { m_boundaries = b; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "PluginSummarisingAdapter::setSummarySegmentBoundaries: boundaries are:" << endl; for (SegmentBoundaries::const_iterator i = m_boundaries.begin(); i != m_boundaries.end(); ++i) { cerr << *i << " "; } cerr << endl; #endif } Plugin::FeatureList PluginSummarisingAdapter::Impl::getSummaryForOutput(int output, SummaryType type, AveragingMethod avg) { if (!m_reduced) { accumulateFinalDurations(); segment(); reduce(); m_reduced = true; } bool continuous = (avg == ContinuousTimeAverage); FeatureList fl; for (SummarySegmentMap::const_iterator i = m_summaries[output].begin(); i != m_summaries[output].end(); ++i) { Feature f; f.hasTimestamp = true; f.timestamp = i->first; f.hasDuration = true; SummarySegmentMap::const_iterator ii = i; if (++ii == m_summaries[output].end()) { f.duration = m_endTime - f.timestamp; } else { f.duration = ii->first - f.timestamp; } f.label = getSummaryLabel(type, avg); for (OutputSummary::const_iterator j = i->second.begin(); j != i->second.end(); ++j) { // these will be ordered by bin number, and no bin numbers // will be missing except at the end (because of the way // the accumulators were initially filled in accumulate()) const OutputBinSummary &summary = j->second; double result = 0.f; switch (type) { case Minimum: result = summary.minimum; break; case Maximum: result = summary.maximum; break; case Mean: if (continuous) { result = summary.mean_c; } else if (summary.count) { result = summary.sum / summary.count; } break; case Median: if (continuous) result = summary.median_c; else result = summary.median; break; case Mode: if (continuous) result = summary.mode_c; else result = summary.mode; break; case Sum: result = summary.sum; break; case Variance: if (continuous) result = summary.variance_c; else result = summary.variance; break; case StandardDeviation: if (continuous) result = sqrt(summary.variance_c); else result = sqrt(summary.variance); break; case Count: result = summary.count; break; case UnknownSummaryType: break; default: break; } f.values.push_back(float(result)); } fl.push_back(f); } return fl; } Plugin::FeatureSet PluginSummarisingAdapter::Impl::getSummaryForAllOutputs(SummaryType type, AveragingMethod avg) { if (!m_reduced) { accumulateFinalDurations(); segment(); reduce(); m_reduced = true; } FeatureSet fs; for (OutputSummarySegmentMap::const_iterator i = m_summaries.begin(); i != m_summaries.end(); ++i) { fs[i->first] = getSummaryForOutput(i->first, type, avg); } return fs; } void PluginSummarisingAdapter::Impl::accumulate(const FeatureSet &fs, RealTime timestamp, bool final) { for (FeatureSet::const_iterator i = fs.begin(); i != fs.end(); ++i) { for (FeatureList::const_iterator j = i->second.begin(); j != i->second.end(); ++j) { if (j->hasTimestamp) { accumulate(i->first, *j, j->timestamp, final); } else { //!!! is this correct? accumulate(i->first, *j, timestamp, final); } } } } string PluginSummarisingAdapter::Impl::getSummaryLabel(SummaryType type, AveragingMethod avg) { string label; string avglabel; if (avg == SampleAverage) avglabel = ", sample average"; else avglabel = ", continuous-time average"; switch (type) { case Minimum: label = "(minimum value)"; break; case Maximum: label = "(maximum value)"; break; case Mean: label = "(mean value" + avglabel + ")"; break; case Median: label = "(median value" + avglabel + ")"; break; case Mode: label = "(modal value" + avglabel + ")"; break; case Sum: label = "(sum)"; break; case Variance: label = "(variance" + avglabel + ")"; break; case StandardDeviation: label = "(standard deviation" + avglabel + ")"; break; case Count: label = "(count)"; break; case UnknownSummaryType: label = "(unknown summary)"; break; } return label; } void PluginSummarisingAdapter::Impl::accumulate(int output, const Feature &f, RealTime timestamp, bool #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER final #endif ) { // What should happen if a feature's duration spans a segment // boundary? I think we probably want to chop it, and pretend // that it appears in both. A very long feature (e.g. key, if the // whole audio is in a single key) might span many or all // segments, and we want that to be reflected in the results // (e.g. it is the modal key in all of those segments, not just // the first). This is actually quite complicated to do. // If features spanning a boundary should be chopped, then we need // to have per-segment accumulators (and the feature value goes // into both -- with a separate phase to split the accumulator up // into segments). #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "output " << output << ": timestamp " << timestamp << ", prev timestamp " << m_prevTimestamps[output] << ", final " << final << endl; #endif // At each process step, accumulate() is called once for each // feature on each output within that process's returned feature // list, and with the timestamp passed in being that of the start // of the process block. // At the end (in getRemainingFeatures), accumulate() is called // once for each feature on each output within the feature list // returned by getRemainingFeatures, and with the timestamp being // the same as the last process block and final set to true. // (What if getRemainingFeatures doesn't return any features? We // still need to ensure that the final duration is written. Need // a separate function to close the durations.) // At each call, we pull out the value for the feature and stuff // it into the accumulator's appropriate values array; and we // calculate the duration for the _previous_ feature, or pull it // from the prevDurations array if the previous feature had a // duration in its structure, and stuff that into the // accumulator's appropriate durations array. if (m_prevDurations.find(output) != m_prevDurations.end()) { // Not the first time accumulate has been called for this // output -- there has been a previous feature RealTime prevDuration; // Note that m_prevDurations[output] only contains the // duration field that was contained in the previous feature. // If it didn't have an explicit duration, // m_prevDurations[output] should be INVALID_DURATION and we // will have to calculate the duration from the previous and // current timestamps. if (m_prevDurations[output] != INVALID_DURATION) { prevDuration = m_prevDurations[output]; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "Previous duration from previous feature: " << prevDuration << endl; #endif } else { prevDuration = timestamp - m_prevTimestamps[output]; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "Previous duration from diff: " << timestamp << " - " << m_prevTimestamps[output] << endl; #endif } #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "output " << output << ": "; cerr << "Pushing previous duration as " << prevDuration << endl; #endif m_accumulators[output].results [m_accumulators[output].results.size() - 1] .duration = prevDuration; } if (f.hasDuration) m_prevDurations[output] = f.duration; else m_prevDurations[output] = INVALID_DURATION; m_prevTimestamps[output] = timestamp; if (f.hasDuration) { RealTime et = timestamp; et = et + f.duration; if (et > m_endTime) m_endTime = et; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "feature has duration, updating end time to " << m_endTime << endl; #endif } Result result; result.time = timestamp; result.duration = INVALID_DURATION; if (int(f.values.size()) > m_accumulators[output].bins) { m_accumulators[output].bins = int(f.values.size()); } for (int i = 0; i < int(f.values.size()); ++i) { result.values.push_back(f.values[i]); } m_accumulators[output].results.push_back(result); } void PluginSummarisingAdapter::Impl::accumulateFinalDurations() { for (OutputTimestampMap::iterator i = m_prevTimestamps.begin(); i != m_prevTimestamps.end(); ++i) { int output = i->first; int acount = int(m_accumulators[output].results.size()); if (acount == 0) continue; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "output " << output << ": "; #endif if (m_prevDurations.find(output) != m_prevDurations.end() && m_prevDurations[output] != INVALID_DURATION) { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "Pushing final duration from feature as " << m_prevDurations[output] << endl; #endif m_accumulators[output].results[acount - 1].duration = m_prevDurations[output]; } else { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "Pushing final duration from diff as " << m_endTime << " - " << m_prevTimestamps[output] << endl; #endif m_accumulators[output].results[acount - 1].duration = m_endTime - m_prevTimestamps[output]; } #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "so duration for result no " << acount-1 << " is " << m_accumulators[output].results[acount-1].duration << endl; #endif } } void PluginSummarisingAdapter::Impl::findSegmentBounds(RealTime t, RealTime &start, RealTime &end) { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "findSegmentBounds: t = " << t << endl; #endif SegmentBoundaries::const_iterator i = upper_bound (m_boundaries.begin(), m_boundaries.end(), t); start = RealTime::zeroTime; end = m_endTime; if (i != m_boundaries.end()) { end = *i; } if (i != m_boundaries.begin()) { start = *--i; } #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "findSegmentBounds: " << t << " is in segment " << start << " -> " << end << endl; #endif } void PluginSummarisingAdapter::Impl::segment() { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "segment: starting" << endl; #endif for (OutputAccumulatorMap::iterator i = m_accumulators.begin(); i != m_accumulators.end(); ++i) { int output = i->first; OutputAccumulator &source = i->second; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "segment: total results for output " << output << " = " << source.results.size() << endl; #endif // This is basically nonsense if the results have no values // (i.e. their times and counts are the only things of // interest)... but perhaps it's the user's problem if they // ask for segmentation (or any summary at all) in that case for (int n = 0; n < int(source.results.size()); ++n) { // This result spans source.results[n].time to // source.results[n].time + source.results[n].duration. // We need to dispose it into segments appropriately RealTime resultStart = source.results[n].time; RealTime resultEnd = resultStart + source.results[n].duration; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "output: " << output << ", result start = " << resultStart << ", end = " << resultEnd << endl; #endif RealTime segmentStart = RealTime::zeroTime; RealTime segmentEnd = resultEnd - RealTime(1, 0); RealTime prevSegmentStart = segmentStart - RealTime(1, 0); while (segmentEnd < resultEnd) { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "segment end " << segmentEnd << " < result end " << resultEnd << " (with result start " << resultStart << ")" << endl; #endif findSegmentBounds(resultStart, segmentStart, segmentEnd); if (segmentStart == prevSegmentStart) { // This can happen when we reach the end of the // input, if a feature's end time overruns the // input audio end time break; } prevSegmentStart = segmentStart; RealTime chunkStart = resultStart; if (chunkStart < segmentStart) chunkStart = segmentStart; RealTime chunkEnd = resultEnd; if (chunkEnd > segmentEnd) chunkEnd = segmentEnd; m_segmentedAccumulators[output][segmentStart].bins = source.bins; Result chunk; chunk.time = chunkStart; chunk.duration = chunkEnd - chunkStart; chunk.values = source.results[n].values; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT cerr << "chunk for segment " << segmentStart << ": from " << chunk.time << ", duration " << chunk.duration << endl; #endif m_segmentedAccumulators[output][segmentStart].results .push_back(chunk); resultStart = chunkEnd; } } } } struct ValueDurationFloatPair { float value; float duration; ValueDurationFloatPair() : value(0), duration(0) { } ValueDurationFloatPair(float v, float d) : value(v), duration(d) { } ValueDurationFloatPair &operator=(const ValueDurationFloatPair &p) { value = p.value; duration = p.duration; return *this; } bool operator<(const ValueDurationFloatPair &p) const { return value < p.value; } }; static double toSec(const RealTime &r) { return r.sec + double(r.nsec) / 1000000000.0; } void PluginSummarisingAdapter::Impl::reduce() { for (OutputSegmentAccumulatorMap::iterator i = m_segmentedAccumulators.begin(); i != m_segmentedAccumulators.end(); ++i) { int output = i->first; SegmentAccumulatorMap &segments = i->second; for (SegmentAccumulatorMap::iterator j = segments.begin(); j != segments.end(); ++j) { RealTime segmentStart = j->first; OutputAccumulator &accumulator = j->second; int sz = int(accumulator.results.size()); #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "reduce: segment starting at " << segmentStart << " on output " << output << " has " << sz << " result(s)" << endl; #endif double totalDuration = 0.0; //!!! is this right? if (sz > 0) { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "last time = " << accumulator.results[sz-1].time << ", duration = " << accumulator.results[sz-1].duration << " (step = " << m_stepSize << ", block = " << m_blockSize << ")" << endl; #endif totalDuration = toSec((accumulator.results[sz-1].time + accumulator.results[sz-1].duration) - segmentStart); } for (int bin = 0; bin < accumulator.bins; ++bin) { // work on all values over time for a single bin #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "bin " << bin << ":" << endl; #endif OutputBinSummary summary; summary.count = sz; summary.minimum = 0.f; summary.maximum = 0.f; summary.median = 0.f; summary.mode = 0.f; summary.sum = 0.f; summary.variance = 0.f; summary.median_c = 0.f; summary.mode_c = 0.f; summary.mean_c = 0.f; summary.variance_c = 0.f; if (sz == 0) continue; vector valvec; for (int k = 0; k < sz; ++k) { while (int(accumulator.results[k].values.size()) < accumulator.bins) { accumulator.results[k].values.push_back(0.f); } } for (int k = 0; k < sz; ++k) { float value = accumulator.results[k].values[bin]; valvec.push_back (ValueDurationFloatPair (value, float(toSec(accumulator.results[k].duration)))); } sort(valvec.begin(), valvec.end()); summary.minimum = valvec[0].value; summary.maximum = valvec[sz-1].value; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "total duration = " << totalDuration << endl; #endif #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER /* cerr << "value vector for medians:" << endl; for (int k = 0; k < sz; ++k) { cerr << "(" << valvec[k].value << "," << valvec[k].duration << ") "; } cerr << endl; */ #endif if (sz % 2 == 1) { summary.median = valvec[sz/2].value; } else { summary.median = (valvec[sz/2].value + valvec[sz/2 + 1].value) / 2; } double duracc = 0.0; summary.median_c = valvec[sz-1].value; for (int k = 0; k < sz; ++k) { duracc += valvec[k].duration; if (duracc > totalDuration/2) { summary.median_c = valvec[k].value; break; } } #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "median_c = " << summary.median_c << endl; cerr << "median = " << summary.median << endl; #endif map distribution; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "summing (discrete): "; #endif for (int k = 0; k < sz; ++k) { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << accumulator.results[k].values[bin] << " "; #endif summary.sum += accumulator.results[k].values[bin]; distribution[accumulator.results[k].values[bin]] += 1; } #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << endl; #endif int md = 0; for (map::iterator di = distribution.begin(); di != distribution.end(); ++di) { if (di->second > md) { md = di->second; summary.mode = di->first; } } distribution.clear(); map distribution_c; for (int k = 0; k < sz; ++k) { distribution_c[accumulator.results[k].values[bin]] += toSec(accumulator.results[k].duration); } double mrd = 0.0; for (map::iterator di = distribution_c.begin(); di != distribution_c.end(); ++di) { if (di->second > mrd) { mrd = di->second; summary.mode_c = di->first; } } distribution_c.clear(); if (totalDuration > 0.0) { double sum_c = 0.0; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "summing (continuous): "; #endif for (int k = 0; k < sz; ++k) { #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << accumulator.results[k].values[bin] << "*" << toSec(accumulator.results[k].duration) << " "; #endif double value = accumulator.results[k].values[bin] * toSec(accumulator.results[k].duration); sum_c += value; } #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << endl; #endif #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "mean_c = " << sum_c << " / " << totalDuration << " = " << sum_c / totalDuration << " (sz = " << sz << ")" << endl; #endif summary.mean_c = sum_c / totalDuration; for (int k = 0; k < sz; ++k) { double value = accumulator.results[k].values[bin]; // * toSec(accumulator.results[k].duration); summary.variance_c += (value - summary.mean_c) * (value - summary.mean_c) * toSec(accumulator.results[k].duration); } // summary.variance_c /= summary.count; summary.variance_c /= totalDuration; } double mean = summary.sum / summary.count; #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER cerr << "mean = " << summary.sum << " / " << summary.count << " = " << summary.sum / summary.count << endl; #endif for (int k = 0; k < sz; ++k) { float value = accumulator.results[k].values[bin]; summary.variance += (value - mean) * (value - mean); } summary.variance /= summary.count; m_summaries[output][segmentStart][bin] = summary; } } } m_segmentedAccumulators.clear(); m_accumulators.clear(); } } } _VAMP_SDK_HOSTSPACE_END(PluginSummarisingAdapter.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/PluginWrapper.cpp0000644000000000000000000001065113111512442024667 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include _VAMP_SDK_HOSTSPACE_BEGIN(PluginWrapper.cpp) namespace Vamp { namespace HostExt { class PluginRateExtractor : public Plugin { public: PluginRateExtractor() : Plugin(0) { } float getRate() const { return m_inputSampleRate; } }; PluginWrapper::PluginWrapper(Plugin *plugin) : Plugin(((PluginRateExtractor *)plugin)->getRate()), m_plugin(plugin) { } PluginWrapper::~PluginWrapper() { delete m_plugin; } bool PluginWrapper::initialise(size_t channels, size_t stepSize, size_t blockSize) { return m_plugin->initialise(channels, stepSize, blockSize); } void PluginWrapper::reset() { m_plugin->reset(); } Plugin::InputDomain PluginWrapper::getInputDomain() const { return m_plugin->getInputDomain(); } unsigned int PluginWrapper::getVampApiVersion() const { return m_plugin->getVampApiVersion(); } std::string PluginWrapper::getIdentifier() const { return m_plugin->getIdentifier(); } std::string PluginWrapper::getName() const { return m_plugin->getName(); } std::string PluginWrapper::getDescription() const { return m_plugin->getDescription(); } std::string PluginWrapper::getMaker() const { return m_plugin->getMaker(); } int PluginWrapper::getPluginVersion() const { return m_plugin->getPluginVersion(); } std::string PluginWrapper::getCopyright() const { return m_plugin->getCopyright(); } PluginBase::ParameterList PluginWrapper::getParameterDescriptors() const { return m_plugin->getParameterDescriptors(); } float PluginWrapper::getParameter(std::string parameter) const { return m_plugin->getParameter(parameter); } void PluginWrapper::setParameter(std::string parameter, float value) { m_plugin->setParameter(parameter, value); } PluginBase::ProgramList PluginWrapper::getPrograms() const { return m_plugin->getPrograms(); } std::string PluginWrapper::getCurrentProgram() const { return m_plugin->getCurrentProgram(); } void PluginWrapper::selectProgram(std::string program) { m_plugin->selectProgram(program); } size_t PluginWrapper::getPreferredStepSize() const { return m_plugin->getPreferredStepSize(); } size_t PluginWrapper::getPreferredBlockSize() const { return m_plugin->getPreferredBlockSize(); } size_t PluginWrapper::getMinChannelCount() const { return m_plugin->getMinChannelCount(); } size_t PluginWrapper::getMaxChannelCount() const { return m_plugin->getMaxChannelCount(); } Plugin::OutputList PluginWrapper::getOutputDescriptors() const { return m_plugin->getOutputDescriptors(); } Plugin::FeatureSet PluginWrapper::process(const float *const *inputBuffers, RealTime timestamp) { return m_plugin->process(inputBuffers, timestamp); } Plugin::FeatureSet PluginWrapper::getRemainingFeatures() { return m_plugin->getRemainingFeatures(); } } } _VAMP_SDK_HOSTSPACE_END(PluginWrapper.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/RealTime.cpp0000644000000000000000000000323413111512442023571 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include "../vamp-sdk/RealTime.cpp" sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/Window.h0000644000000000000000000001057313111512442023007 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2011 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _WINDOW_H_ #define _WINDOW_H_ #include #include #include _VAMP_SDK_HOSTSPACE_BEGIN(Window.h) template class Window { public: enum WindowType { RectangularWindow, BartlettWindow, HammingWindow, HanningWindow, BlackmanWindow, NuttallWindow, BlackmanHarrisWindow }; /** * Construct a windower of the given type. */ Window(WindowType type, size_t size) : m_type(type), m_size(size) { encache(); } Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); } Window &operator=(const Window &w) { if (&w == this) return *this; m_type = w.m_type; m_size = w.m_size; encache(); return *this; } virtual ~Window() { delete[] m_cache; } void cut(T *src) const { cut(src, src); } void cut(T *src, T *dst) const { for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i]; } template void cut(T0 *src, T1 *dst) const { for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i]; } T getArea() { return m_area; } T getValue(size_t i) { return m_cache[i]; } WindowType getType() const { return m_type; } size_t getSize() const { return m_size; } protected: WindowType m_type; size_t m_size; T *m_cache; T m_area; void encache(); void cosinewin(T *, T, T, T, T); }; template void Window::encache() { int n = int(m_size); T *mult = new T[n]; int i; for (i = 0; i < n; ++i) mult[i] = 1.0; switch (m_type) { case RectangularWindow: for (i = 0; i < n; ++i) { mult[i] *= 0.5; } break; case BartlettWindow: for (i = 0; i < n/2; ++i) { mult[i] *= (i / T(n/2)); mult[i + n/2] *= (1.0 - (i / T(n/2))); } break; case HammingWindow: cosinewin(mult, 0.54, 0.46, 0.0, 0.0); break; case HanningWindow: cosinewin(mult, 0.50, 0.50, 0.0, 0.0); break; case BlackmanWindow: cosinewin(mult, 0.42, 0.50, 0.08, 0.0); break; case NuttallWindow: cosinewin(mult, 0.3635819, 0.4891775, 0.1365995, 0.0106411); break; case BlackmanHarrisWindow: cosinewin(mult, 0.35875, 0.48829, 0.14128, 0.01168); break; } m_cache = mult; m_area = 0; for (int i = 0; i < n; ++i) { m_area += m_cache[i]; } m_area /= n; } template void Window::cosinewin(T *mult, T a0, T a1, T a2, T a3) { int n = int(m_size); for (int i = 0; i < n; ++i) { mult[i] *= (a0 - a1 * cos((2 * M_PI * i) / n) + a2 * cos((4 * M_PI * i) / n) - a3 * cos((6 * M_PI * i) / n)); } } _VAMP_SDK_HOSTSPACE_END(Window.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/acsymbols.c0000644000000000000000000000123313111512442023520 0ustar 00000000000000/* These stubs are provided so that autoconf can check library * versions using C symbols only */ extern void libvamphostsdk_v_2_7_1_present(void) { } extern void libvamphostsdk_v_2_7_present(void) { } extern void libvamphostsdk_v_2_6_present(void) { } extern void libvamphostsdk_v_2_5_present(void) { } extern void libvamphostsdk_v_2_4_present(void) { } extern void libvamphostsdk_v_2_3_1_present(void) { } extern void libvamphostsdk_v_2_3_present(void) { } extern void libvamphostsdk_v_2_2_1_present(void) { } extern void libvamphostsdk_v_2_2_present(void) { } extern void libvamphostsdk_v_2_1_present(void) { } extern void libvamphostsdk_v_2_0_present(void) { } sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-hostsdk/host-c.cpp0000644000000000000000000001030213111512442023256 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2015 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include "Files.h" #include #include #include using namespace std; static vector files; static map cnames; static bool haveFiles = false; struct vhLibrary_t { vhLibrary_t(void *h, VampGetPluginDescriptorFunction f) : handle(h), func(f), nplugins(0) { } void *handle; VampGetPluginDescriptorFunction func; int nplugins; }; static void initFilenames() { if (!haveFiles) { files = Files::listLibraryFiles(); for (size_t i = 0; i < files.size(); ++i) { cnames[files[i]] = strdup(Files::lcBasename(files[i]).c_str()); } haveFiles = true; } } int vhGetLibraryCount() { initFilenames(); return int(files.size()); } const char *vhGetLibraryName(int index) { initFilenames(); if (index >= 0 && index < int(files.size())) { return cnames[files[index]]; } else return 0; } int vhGetLibraryIndex(const char *name) { for (size_t i = 0; i < files.size(); ++i) { if (Files::lcBasename(name) == Files::lcBasename(files[i])) { return i; } } return -1; } vhLibrary vhLoadLibrary(int index) { initFilenames(); if (index < 0 || index >= int(files.size())) { return 0; } string fullPath = files[index]; void *lib = Files::loadLibrary(fullPath); if (!lib) return 0; VampGetPluginDescriptorFunction func = (VampGetPluginDescriptorFunction)Files::lookupInLibrary (lib, "vampGetPluginDescriptor"); if (!func) { cerr << "vhLoadLibrary: No vampGetPluginDescriptor function found in library \"" << fullPath << "\"" << endl; Files::unloadLibrary(lib); return 0; } vhLibrary_t *vhl = new vhLibrary_t(lib, func); while (vhl->func(VAMP_API_VERSION, vhl->nplugins)) { ++vhl->nplugins; } return vhl; } int vhGetPluginCount(vhLibrary library) { vhLibrary_t *vhl = static_cast(library); if (vhl) return vhl->nplugins; else return 0; } const VampPluginDescriptor *vhGetPluginDescriptor(vhLibrary library, int plugin) { vhLibrary_t *vhl = static_cast(library); if (vhl && plugin >= 0 && plugin < vhl->nplugins) { return vhl->func(VAMP_API_VERSION, plugin); } else { return 0; } } void vhUnloadLibrary(vhLibrary library) { vhLibrary_t *vhl = static_cast(library); if (vhl && vhl->handle) { Files::unloadLibrary(vhl->handle); } delete vhl; } sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/FFT.cpp0000644000000000000000000001476413111512442021622 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2012 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #include #include #include #if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 7 ) #error Unexpected version of Vamp SDK header included #endif _VAMP_SDK_PLUGSPACE_BEGIN(FFT.cpp) #include "FFTimpl.cpp" namespace Vamp { void FFT::forward(unsigned int un, const double *ri, const double *ii, double *ro, double *io) { int n(un); Kiss::kiss_fft_cfg c = Kiss::kiss_fft_alloc(n, false, 0, 0); Kiss::kiss_fft_cpx *in = new Kiss::kiss_fft_cpx[n]; Kiss::kiss_fft_cpx *out = new Kiss::kiss_fft_cpx[n]; for (int i = 0; i < n; ++i) { in[i].r = ri[i]; in[i].i = 0; } if (ii) { for (int i = 0; i < n; ++i) { in[i].i = ii[i]; } } kiss_fft(c, in, out); for (int i = 0; i < n; ++i) { ro[i] = out[i].r; io[i] = out[i].i; } Kiss::kiss_fft_free(c); delete[] in; delete[] out; } void FFT::inverse(unsigned int un, const double *ri, const double *ii, double *ro, double *io) { int n(un); Kiss::kiss_fft_cfg c = Kiss::kiss_fft_alloc(n, true, 0, 0); Kiss::kiss_fft_cpx *in = new Kiss::kiss_fft_cpx[n]; Kiss::kiss_fft_cpx *out = new Kiss::kiss_fft_cpx[n]; for (int i = 0; i < n; ++i) { in[i].r = ri[i]; in[i].i = 0; } if (ii) { for (int i = 0; i < n; ++i) { in[i].i = ii[i]; } } kiss_fft(c, in, out); double scale = 1.0 / double(n); for (int i = 0; i < n; ++i) { ro[i] = out[i].r * scale; io[i] = out[i].i * scale; } Kiss::kiss_fft_free(c); delete[] in; delete[] out; } class FFTComplex::D { public: D(int n) : m_n(n), m_fconf(Kiss::kiss_fft_alloc(n, false, 0, 0)), m_iconf(Kiss::kiss_fft_alloc(n, true, 0, 0)), m_ci(new Kiss::kiss_fft_cpx[m_n]), m_co(new Kiss::kiss_fft_cpx[m_n]) { } ~D() { Kiss::kiss_fftr_free(m_fconf); Kiss::kiss_fftr_free(m_iconf); delete[] m_ci; delete[] m_co; } void forward(const double *ci, double *co) { for (int i = 0; i < m_n; ++i) { m_ci[i].r = ci[i*2]; m_ci[i].i = ci[i*2+1]; } Kiss::kiss_fft(m_fconf, m_ci, m_co); for (int i = 0; i < m_n; ++i) { co[i*2] = m_co[i].r; co[i*2+1] = m_co[i].i; } } void inverse(const double *ci, double *co) { for (int i = 0; i < m_n; ++i) { m_ci[i].r = ci[i*2]; m_ci[i].i = ci[i*2+1]; } Kiss::kiss_fft(m_iconf, m_ci, m_co); double scale = 1.0 / double(m_n); for (int i = 0; i < m_n; ++i) { co[i*2] = m_co[i].r * scale; co[i*2+1] = m_co[i].i * scale; } } private: int m_n; Kiss::kiss_fft_cfg m_fconf; Kiss::kiss_fft_cfg m_iconf; Kiss::kiss_fft_cpx *m_ci; Kiss::kiss_fft_cpx *m_co; }; FFTComplex::FFTComplex(unsigned int n) : m_d(new D(n)) { } FFTComplex::~FFTComplex() { delete m_d; } void FFTComplex::forward(const double *ci, double *co) { m_d->forward(ci, co); } void FFTComplex::inverse(const double *ci, double *co) { m_d->inverse(ci, co); } class FFTReal::D { public: D(int n) : m_n(n), m_fconf(Kiss::kiss_fftr_alloc(n, false, 0, 0)), m_iconf(Kiss::kiss_fftr_alloc(n, true, 0, 0)), m_ri(new Kiss::kiss_fft_scalar[m_n]), m_ro(new Kiss::kiss_fft_scalar[m_n]), m_freq(new Kiss::kiss_fft_cpx[n/2+1]) { } ~D() { Kiss::kiss_fftr_free(m_fconf); Kiss::kiss_fftr_free(m_iconf); delete[] m_ri; delete[] m_ro; delete[] m_freq; } void forward(const double *ri, double *co) { for (int i = 0; i < m_n; ++i) { // in case kiss_fft_scalar is float m_ri[i] = ri[i]; } Kiss::kiss_fftr(m_fconf, m_ri, m_freq); int hs = m_n/2 + 1; for (int i = 0; i < hs; ++i) { co[i*2] = m_freq[i].r; co[i*2+1] = m_freq[i].i; } } void inverse(const double *ci, double *ro) { int hs = m_n/2 + 1; for (int i = 0; i < hs; ++i) { m_freq[i].r = ci[i*2]; m_freq[i].i = ci[i*2+1]; } Kiss::kiss_fftri(m_iconf, m_freq, m_ro); double scale = 1.0 / double(m_n); for (int i = 0; i < m_n; ++i) { ro[i] = m_ro[i] * scale; } } private: int m_n; Kiss::kiss_fftr_cfg m_fconf; Kiss::kiss_fftr_cfg m_iconf; Kiss::kiss_fft_scalar *m_ri; Kiss::kiss_fft_scalar *m_ro; Kiss::kiss_fft_cpx *m_freq; }; FFTReal::FFTReal(unsigned int n) : m_d(new D(n)) { } FFTReal::~FFTReal() { delete m_d; } void FFTReal::forward(const double *ri, double *co) { m_d->forward(ri, co); } void FFTReal::inverse(const double *ci, double *ro) { m_d->inverse(ci, ro); } } _VAMP_SDK_PLUGSPACE_END(FFT.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/FFTimpl.cpp0000644000000000000000000000172113111512442022471 0ustar 00000000000000 // Override C linkage for KissFFT headers. So long as we have already // included all of the other (system etc) headers KissFFT depends on, // this should work out OK #define KISSFFT_USE_CPP_LINKAGE 1 namespace Kiss { #undef KISS_FFT_H #undef KISS_FTR_H #undef KISS_FFT__GUTS_H #undef FIXED_POINT #undef USE_SIMD #undef kiss_fft_scalar #ifdef SINGLE_PRECISION_FFT #pragma message("Using single-precision FFTs") typedef float kiss_fft_scalar; #define kiss_fft_scalar float #else typedef double kiss_fft_scalar; #define kiss_fft_scalar double #endif inline void free(void *ptr) { ::free(ptr); } #include "ext/kiss_fft.c" #include "ext/kiss_fftr.c" #undef kiss_fft_scalar // leaving only the namespaced typedef } // Check that this worked, i.e. that we have our own suitably // hacked KissFFT header which set this after making the // appropriate change #ifndef KISSFFT_USED_CPP_LINKAGE #error "KissFFT header lacks specific linkage adjustment needed for Vamp SDK" #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/PluginAdapter.cpp0000644000000000000000000007467713111512442023753 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include #include #include #if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 7 ) #error Unexpected version of Vamp SDK header included #endif //#define DEBUG_PLUGIN_ADAPTER 1 _VAMP_SDK_PLUGSPACE_BEGIN(PluginAdapter.cpp) namespace Vamp { class PluginAdapterBase::Impl { public: Impl(PluginAdapterBase *); ~Impl(); const VampPluginDescriptor *getDescriptor(); protected: PluginAdapterBase *m_base; static VampPluginHandle vampInstantiate(const VampPluginDescriptor *desc, float inputSampleRate); static void vampCleanup(VampPluginHandle handle); static int vampInitialise(VampPluginHandle handle, unsigned int channels, unsigned int stepSize, unsigned int blockSize); static void vampReset(VampPluginHandle handle); static float vampGetParameter(VampPluginHandle handle, int param); static void vampSetParameter(VampPluginHandle handle, int param, float value); static unsigned int vampGetCurrentProgram(VampPluginHandle handle); static void vampSelectProgram(VampPluginHandle handle, unsigned int program); static unsigned int vampGetPreferredStepSize(VampPluginHandle handle); static unsigned int vampGetPreferredBlockSize(VampPluginHandle handle); static unsigned int vampGetMinChannelCount(VampPluginHandle handle); static unsigned int vampGetMaxChannelCount(VampPluginHandle handle); static unsigned int vampGetOutputCount(VampPluginHandle handle); static VampOutputDescriptor *vampGetOutputDescriptor(VampPluginHandle handle, unsigned int i); static void vampReleaseOutputDescriptor(VampOutputDescriptor *desc); static VampFeatureList *vampProcess(VampPluginHandle handle, const float *const *inputBuffers, int sec, int nsec); static VampFeatureList *vampGetRemainingFeatures(VampPluginHandle handle); static void vampReleaseFeatureSet(VampFeatureList *fs); void checkOutputMap(Plugin *plugin); void markOutputsChanged(Plugin *plugin); void cleanup(Plugin *plugin); unsigned int getOutputCount(Plugin *plugin); VampOutputDescriptor *getOutputDescriptor(Plugin *plugin, unsigned int i); VampFeatureList *process(Plugin *plugin, const float *const *inputBuffers, int sec, int nsec); VampFeatureList *getRemainingFeatures(Plugin *plugin); VampFeatureList *convertFeatures(Plugin *plugin, const Plugin::FeatureSet &features); // maps both plugins and descriptors to adapters typedef std::map AdapterMap; static AdapterMap *m_adapterMap; static Impl *lookupAdapter(VampPluginHandle); bool m_populated; VampPluginDescriptor m_descriptor; Plugin::ParameterList m_parameters; Plugin::ProgramList m_programs; typedef std::map OutputMap; OutputMap m_pluginOutputs; std::map m_fs; std::map > m_fsizes; std::map > > m_fvsizes; void resizeFS(Plugin *plugin, int n); void resizeFL(Plugin *plugin, int n, size_t sz); void resizeFV(Plugin *plugin, int n, int j, size_t sz); }; PluginAdapterBase::PluginAdapterBase() { m_impl = new Impl(this); } PluginAdapterBase::~PluginAdapterBase() { delete m_impl; } const VampPluginDescriptor * PluginAdapterBase::getDescriptor() { return m_impl->getDescriptor(); } PluginAdapterBase::Impl::Impl(PluginAdapterBase *base) : m_base(base), m_populated(false) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl[" << this << "]::Impl" << std::endl; #endif } const VampPluginDescriptor * PluginAdapterBase::Impl::getDescriptor() { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << std::endl; #endif if (m_populated) return &m_descriptor; Plugin *plugin = m_base->createPlugin(48000); if (!plugin) { std::cerr << "PluginAdapterBase::Impl::getDescriptor: Failed to create plugin" << std::endl; return 0; } if (plugin->getVampApiVersion() != VAMP_API_VERSION) { std::cerr << "Vamp::PluginAdapterBase::Impl::getDescriptor: ERROR: " << "API version " << plugin->getVampApiVersion() << " for\nplugin \"" << plugin->getIdentifier() << "\" " << "differs from version " << VAMP_API_VERSION << " for adapter.\n" << "This plugin is probably linked against a different version of the Vamp SDK\n" << "from the version it was compiled with. It will need to be re-linked correctly\n" << "before it can be used." << std::endl; delete plugin; return 0; } m_parameters = plugin->getParameterDescriptors(); m_programs = plugin->getPrograms(); m_descriptor.vampApiVersion = plugin->getVampApiVersion(); m_descriptor.identifier = strdup(plugin->getIdentifier().c_str()); m_descriptor.name = strdup(plugin->getName().c_str()); m_descriptor.description = strdup(plugin->getDescription().c_str()); m_descriptor.maker = strdup(plugin->getMaker().c_str()); m_descriptor.pluginVersion = plugin->getPluginVersion(); m_descriptor.copyright = strdup(plugin->getCopyright().c_str()); m_descriptor.parameterCount = m_parameters.size(); m_descriptor.parameters = (const VampParameterDescriptor **) malloc(m_parameters.size() * sizeof(VampParameterDescriptor)); unsigned int i; for (i = 0; i < m_parameters.size(); ++i) { VampParameterDescriptor *desc = (VampParameterDescriptor *) malloc(sizeof(VampParameterDescriptor)); desc->identifier = strdup(m_parameters[i].identifier.c_str()); desc->name = strdup(m_parameters[i].name.c_str()); desc->description = strdup(m_parameters[i].description.c_str()); desc->unit = strdup(m_parameters[i].unit.c_str()); desc->minValue = m_parameters[i].minValue; desc->maxValue = m_parameters[i].maxValue; desc->defaultValue = m_parameters[i].defaultValue; desc->isQuantized = m_parameters[i].isQuantized; desc->quantizeStep = m_parameters[i].quantizeStep; desc->valueNames = 0; if (desc->isQuantized && !m_parameters[i].valueNames.empty()) { desc->valueNames = (const char **) malloc((m_parameters[i].valueNames.size()+1) * sizeof(char *)); for (unsigned int j = 0; j < m_parameters[i].valueNames.size(); ++j) { desc->valueNames[j] = strdup(m_parameters[i].valueNames[j].c_str()); } desc->valueNames[m_parameters[i].valueNames.size()] = 0; } m_descriptor.parameters[i] = desc; } m_descriptor.programCount = m_programs.size(); m_descriptor.programs = (const char **) malloc(m_programs.size() * sizeof(const char *)); for (i = 0; i < m_programs.size(); ++i) { m_descriptor.programs[i] = strdup(m_programs[i].c_str()); } if (plugin->getInputDomain() == Plugin::FrequencyDomain) { m_descriptor.inputDomain = vampFrequencyDomain; } else { m_descriptor.inputDomain = vampTimeDomain; } m_descriptor.instantiate = vampInstantiate; m_descriptor.cleanup = vampCleanup; m_descriptor.initialise = vampInitialise; m_descriptor.reset = vampReset; m_descriptor.getParameter = vampGetParameter; m_descriptor.setParameter = vampSetParameter; m_descriptor.getCurrentProgram = vampGetCurrentProgram; m_descriptor.selectProgram = vampSelectProgram; m_descriptor.getPreferredStepSize = vampGetPreferredStepSize; m_descriptor.getPreferredBlockSize = vampGetPreferredBlockSize; m_descriptor.getMinChannelCount = vampGetMinChannelCount; m_descriptor.getMaxChannelCount = vampGetMaxChannelCount; m_descriptor.getOutputCount = vampGetOutputCount; m_descriptor.getOutputDescriptor = vampGetOutputDescriptor; m_descriptor.releaseOutputDescriptor = vampReleaseOutputDescriptor; m_descriptor.process = vampProcess; m_descriptor.getRemainingFeatures = vampGetRemainingFeatures; m_descriptor.releaseFeatureSet = vampReleaseFeatureSet; if (!m_adapterMap) { m_adapterMap = new AdapterMap; } (*m_adapterMap)[&m_descriptor] = this; delete plugin; m_populated = true; return &m_descriptor; } PluginAdapterBase::Impl::~Impl() { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl[" << this << "]::~Impl" << std::endl; #endif if (!m_populated) return; free((void *)m_descriptor.identifier); free((void *)m_descriptor.name); free((void *)m_descriptor.description); free((void *)m_descriptor.maker); free((void *)m_descriptor.copyright); for (unsigned int i = 0; i < m_descriptor.parameterCount; ++i) { const VampParameterDescriptor *desc = m_descriptor.parameters[i]; free((void *)desc->identifier); free((void *)desc->name); free((void *)desc->description); free((void *)desc->unit); if (desc->valueNames) { for (unsigned int j = 0; desc->valueNames[j]; ++j) { free((void *)desc->valueNames[j]); } free((void *)desc->valueNames); } free((void *)desc); } free((void *)m_descriptor.parameters); for (unsigned int i = 0; i < m_descriptor.programCount; ++i) { free((void *)m_descriptor.programs[i]); } free((void *)m_descriptor.programs); if (m_adapterMap) { m_adapterMap->erase(&m_descriptor); if (m_adapterMap->empty()) { delete m_adapterMap; m_adapterMap = 0; } } } PluginAdapterBase::Impl * PluginAdapterBase::Impl::lookupAdapter(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::lookupAdapter(" << handle << ")" << std::endl; #endif if (!m_adapterMap) return 0; AdapterMap::const_iterator i = m_adapterMap->find(handle); if (i == m_adapterMap->end()) return 0; return i->second; } VampPluginHandle PluginAdapterBase::Impl::vampInstantiate(const VampPluginDescriptor *desc, float inputSampleRate) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << ")" << std::endl; #endif if (!m_adapterMap) { m_adapterMap = new AdapterMap(); } if (m_adapterMap->find(desc) == m_adapterMap->end()) { std::cerr << "WARNING: PluginAdapterBase::Impl::vampInstantiate: Descriptor " << desc << " not in adapter map" << std::endl; return 0; } Impl *adapter = (*m_adapterMap)[desc]; if (desc != &adapter->m_descriptor) return 0; Plugin *plugin = adapter->m_base->createPlugin(inputSampleRate); if (plugin) { (*m_adapterMap)[plugin] = adapter; } #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << "): returning handle " << plugin << std::endl; #endif return plugin; } void PluginAdapterBase::Impl::vampCleanup(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampCleanup(" << handle << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) { delete ((Plugin *)handle); return; } adapter->cleanup(((Plugin *)handle)); } int PluginAdapterBase::Impl::vampInitialise(VampPluginHandle handle, unsigned int channels, unsigned int stepSize, unsigned int blockSize) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampInitialise(" << handle << ", " << channels << ", " << stepSize << ", " << blockSize << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return 0; bool result = ((Plugin *)handle)->initialise(channels, stepSize, blockSize); adapter->markOutputsChanged((Plugin *)handle); return result ? 1 : 0; } void PluginAdapterBase::Impl::vampReset(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampReset(" << handle << ")" << std::endl; #endif ((Plugin *)handle)->reset(); } float PluginAdapterBase::Impl::vampGetParameter(VampPluginHandle handle, int param) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetParameter(" << handle << ", " << param << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return 0.0; Plugin::ParameterList &list = adapter->m_parameters; return ((Plugin *)handle)->getParameter(list[param].identifier); } void PluginAdapterBase::Impl::vampSetParameter(VampPluginHandle handle, int param, float value) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampSetParameter(" << handle << ", " << param << ", " << value << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return; Plugin::ParameterList &list = adapter->m_parameters; ((Plugin *)handle)->setParameter(list[param].identifier, value); adapter->markOutputsChanged((Plugin *)handle); } unsigned int PluginAdapterBase::Impl::vampGetCurrentProgram(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetCurrentProgram(" << handle << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return 0; Plugin::ProgramList &list = adapter->m_programs; std::string program = ((Plugin *)handle)->getCurrentProgram(); for (unsigned int i = 0; i < list.size(); ++i) { if (list[i] == program) return i; } return 0; } void PluginAdapterBase::Impl::vampSelectProgram(VampPluginHandle handle, unsigned int program) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampSelectProgram(" << handle << ", " << program << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return; Plugin::ProgramList &list = adapter->m_programs; ((Plugin *)handle)->selectProgram(list[program]); adapter->markOutputsChanged((Plugin *)handle); } unsigned int PluginAdapterBase::Impl::vampGetPreferredStepSize(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetPreferredStepSize(" << handle << ")" << std::endl; #endif return ((Plugin *)handle)->getPreferredStepSize(); } unsigned int PluginAdapterBase::Impl::vampGetPreferredBlockSize(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetPreferredBlockSize(" << handle << ")" << std::endl; #endif return ((Plugin *)handle)->getPreferredBlockSize(); } unsigned int PluginAdapterBase::Impl::vampGetMinChannelCount(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetMinChannelCount(" << handle << ")" << std::endl; #endif return ((Plugin *)handle)->getMinChannelCount(); } unsigned int PluginAdapterBase::Impl::vampGetMaxChannelCount(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetMaxChannelCount(" << handle << ")" << std::endl; #endif return ((Plugin *)handle)->getMaxChannelCount(); } unsigned int PluginAdapterBase::Impl::vampGetOutputCount(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetOutputCount(" << handle << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); // std::cerr << "vampGetOutputCount: handle " << handle << " -> adapter "<< adapter << std::endl; if (!adapter) return 0; return adapter->getOutputCount((Plugin *)handle); } VampOutputDescriptor * PluginAdapterBase::Impl::vampGetOutputDescriptor(VampPluginHandle handle, unsigned int i) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetOutputDescriptor(" << handle << ", " << i << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); // std::cerr << "vampGetOutputDescriptor: handle " << handle << " -> adapter "<< adapter << std::endl; if (!adapter) return 0; return adapter->getOutputDescriptor((Plugin *)handle, i); } void PluginAdapterBase::Impl::vampReleaseOutputDescriptor(VampOutputDescriptor *desc) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampReleaseOutputDescriptor(" << desc << ")" << std::endl; #endif if (desc->identifier) free((void *)desc->identifier); if (desc->name) free((void *)desc->name); if (desc->description) free((void *)desc->description); if (desc->unit) free((void *)desc->unit); if (desc->hasFixedBinCount && desc->binNames) { for (unsigned int i = 0; i < desc->binCount; ++i) { if (desc->binNames[i]) { free((void *)desc->binNames[i]); } } } if (desc->binNames) free((void *)desc->binNames); free((void *)desc); } VampFeatureList * PluginAdapterBase::Impl::vampProcess(VampPluginHandle handle, const float *const *inputBuffers, int sec, int nsec) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampProcess(" << handle << ", " << sec << ", " << nsec << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return 0; return adapter->process((Plugin *)handle, inputBuffers, sec, nsec); } VampFeatureList * PluginAdapterBase::Impl::vampGetRemainingFeatures(VampPluginHandle handle) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetRemainingFeatures(" << handle << ")" << std::endl; #endif Impl *adapter = lookupAdapter(handle); if (!adapter) return 0; return adapter->getRemainingFeatures((Plugin *)handle); } void PluginAdapterBase::Impl::vampReleaseFeatureSet(VampFeatureList *) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampReleaseFeatureSet" << std::endl; #endif } void PluginAdapterBase::Impl::cleanup(Plugin *plugin) { if (m_fs.find(plugin) != m_fs.end()) { size_t outputCount = 0; if (m_pluginOutputs[plugin]) { outputCount = m_pluginOutputs[plugin]->size(); } #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::cleanup: " << outputCount << " output(s)" << std::endl; #endif VampFeatureList *list = m_fs[plugin]; for (unsigned int i = 0; i < outputCount; ++i) { for (unsigned int j = 0; j < m_fsizes[plugin][i]; ++j) { if (list[i].features[j].v1.label) { free(list[i].features[j].v1.label); } if (list[i].features[j].v1.values) { free(list[i].features[j].v1.values); } } if (list[i].features) free(list[i].features); } if (list) free((void *)list); m_fs.erase(plugin); m_fsizes.erase(plugin); m_fvsizes.erase(plugin); } if (m_pluginOutputs.find(plugin) != m_pluginOutputs.end()) { delete m_pluginOutputs[plugin]; m_pluginOutputs.erase(plugin); } if (m_adapterMap) { m_adapterMap->erase(plugin); if (m_adapterMap->empty()) { delete m_adapterMap; m_adapterMap = 0; } } delete ((Plugin *)plugin); } void PluginAdapterBase::Impl::checkOutputMap(Plugin *plugin) { OutputMap::iterator i = m_pluginOutputs.find(plugin); if (i == m_pluginOutputs.end() || !i->second) { m_pluginOutputs[plugin] = new Plugin::OutputList (plugin->getOutputDescriptors()); // std::cerr << "PluginAdapterBase::Impl::checkOutputMap: Have " << m_pluginOutputs[plugin]->size() << " outputs for plugin " << plugin->getIdentifier() << std::endl; } } void PluginAdapterBase::Impl::markOutputsChanged(Plugin *plugin) { OutputMap::iterator i = m_pluginOutputs.find(plugin); // std::cerr << "PluginAdapterBase::Impl::markOutputsChanged" << std::endl; if (i != m_pluginOutputs.end()) { Plugin::OutputList *list = i->second; m_pluginOutputs.erase(i); delete list; } } unsigned int PluginAdapterBase::Impl::getOutputCount(Plugin *plugin) { checkOutputMap(plugin); return m_pluginOutputs[plugin]->size(); } VampOutputDescriptor * PluginAdapterBase::Impl::getOutputDescriptor(Plugin *plugin, unsigned int i) { checkOutputMap(plugin); Plugin::OutputDescriptor &od = (*m_pluginOutputs[plugin])[i]; VampOutputDescriptor *desc = (VampOutputDescriptor *) malloc(sizeof(VampOutputDescriptor)); desc->identifier = strdup(od.identifier.c_str()); desc->name = strdup(od.name.c_str()); desc->description = strdup(od.description.c_str()); desc->unit = strdup(od.unit.c_str()); desc->hasFixedBinCount = od.hasFixedBinCount; desc->binCount = od.binCount; if (od.hasFixedBinCount && od.binCount > 0 // We would like to do "&& !od.binNames.empty()" here -- but we // can't, because it will crash older versions of the host adapter // which try to copy the names across whenever the bin count is // non-zero, regardless of whether they exist or not ) { desc->binNames = (const char **) malloc(od.binCount * sizeof(const char *)); for (unsigned int i = 0; i < od.binCount; ++i) { if (i < od.binNames.size()) { desc->binNames[i] = strdup(od.binNames[i].c_str()); } else { desc->binNames[i] = 0; } } } else { desc->binNames = 0; } desc->hasKnownExtents = od.hasKnownExtents; desc->minValue = od.minValue; desc->maxValue = od.maxValue; desc->isQuantized = od.isQuantized; desc->quantizeStep = od.quantizeStep; switch (od.sampleType) { case Plugin::OutputDescriptor::OneSamplePerStep: desc->sampleType = vampOneSamplePerStep; break; case Plugin::OutputDescriptor::FixedSampleRate: desc->sampleType = vampFixedSampleRate; break; case Plugin::OutputDescriptor::VariableSampleRate: desc->sampleType = vampVariableSampleRate; break; } desc->sampleRate = od.sampleRate; desc->hasDuration = od.hasDuration; return desc; } VampFeatureList * PluginAdapterBase::Impl::process(Plugin *plugin, const float *const *inputBuffers, int sec, int nsec) { // std::cerr << "PluginAdapterBase::Impl::process" << std::endl; RealTime rt(sec, nsec); checkOutputMap(plugin); return convertFeatures(plugin, plugin->process(inputBuffers, rt)); } VampFeatureList * PluginAdapterBase::Impl::getRemainingFeatures(Plugin *plugin) { // std::cerr << "PluginAdapterBase::Impl::getRemainingFeatures" << std::endl; checkOutputMap(plugin); return convertFeatures(plugin, plugin->getRemainingFeatures()); } VampFeatureList * PluginAdapterBase::Impl::convertFeatures(Plugin *plugin, const Plugin::FeatureSet &features) { int lastN = -1; int outputCount = 0; if (m_pluginOutputs[plugin]) outputCount = m_pluginOutputs[plugin]->size(); resizeFS(plugin, outputCount); VampFeatureList *fs = m_fs[plugin]; // std::cerr << "PluginAdapter(v2)::convertFeatures: NOTE: sizeof(Feature) == " << sizeof(Plugin::Feature) << ", sizeof(VampFeature) == " << sizeof(VampFeature) << ", sizeof(VampFeatureList) == " << sizeof(VampFeatureList) << std::endl; for (Plugin::FeatureSet::const_iterator fi = features.begin(); fi != features.end(); ++fi) { int n = fi->first; // std::cerr << "PluginAdapterBase::Impl::convertFeatures: n = " << n << std::endl; if (n >= int(outputCount)) { std::cerr << "WARNING: PluginAdapterBase::Impl::convertFeatures: Too many outputs from plugin (" << n+1 << ", only should be " << outputCount << ")" << std::endl; continue; } if (n > lastN + 1) { for (int i = lastN + 1; i < n; ++i) { fs[i].featureCount = 0; } } const Plugin::FeatureList &fl = fi->second; size_t sz = fl.size(); if (sz > m_fsizes[plugin][n]) resizeFL(plugin, n, sz); fs[n].featureCount = sz; for (size_t j = 0; j < sz; ++j) { // std::cerr << "PluginAdapterBase::Impl::convertFeatures: j = " << j << std::endl; VampFeature *feature = &fs[n].features[j].v1; feature->hasTimestamp = fl[j].hasTimestamp; feature->sec = fl[j].timestamp.sec; feature->nsec = fl[j].timestamp.nsec; feature->valueCount = fl[j].values.size(); VampFeatureV2 *v2 = &fs[n].features[j + sz].v2; v2->hasDuration = fl[j].hasDuration; v2->durationSec = fl[j].duration.sec; v2->durationNsec = fl[j].duration.nsec; if (feature->label) free(feature->label); if (fl[j].label.empty()) { feature->label = 0; } else { feature->label = strdup(fl[j].label.c_str()); } if (feature->valueCount > m_fvsizes[plugin][n][j]) { resizeFV(plugin, n, j, feature->valueCount); } for (unsigned int k = 0; k < feature->valueCount; ++k) { // std::cerr << "PluginAdapterBase::Impl::convertFeatures: k = " << k << std::endl; feature->values[k] = fl[j].values[k]; } } lastN = n; } if (lastN == -1) return 0; if (int(outputCount) > lastN + 1) { for (int i = lastN + 1; i < int(outputCount); ++i) { fs[i].featureCount = 0; } } // std::cerr << "PluginAdapter(v2)::convertFeatures: NOTE: have " << outputCount << " outputs" << std::endl; // for (int i = 0; i < outputCount; ++i) { // std::cerr << "PluginAdapter(v2)::convertFeatures: NOTE: output " << i << " has " << fs[i].featureCount << " features" << std::endl; // } return fs; } void PluginAdapterBase::Impl::resizeFS(Plugin *plugin, int n) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::resizeFS(" << plugin << ", " << n << ")" << std::endl; #endif int i = m_fsizes[plugin].size(); if (i >= n) return; #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "resizing from " << i << std::endl; #endif m_fs[plugin] = (VampFeatureList *)realloc (m_fs[plugin], n * sizeof(VampFeatureList)); while (i < n) { m_fs[plugin][i].featureCount = 0; m_fs[plugin][i].features = 0; m_fsizes[plugin].push_back(0); m_fvsizes[plugin].push_back(std::vector()); i++; } } void PluginAdapterBase::Impl::resizeFL(Plugin *plugin, int n, size_t sz) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::resizeFL(" << plugin << ", " << n << ", " << sz << ")" << std::endl; #endif size_t i = m_fsizes[plugin][n]; if (i >= sz) return; #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "resizing from " << i << std::endl; #endif m_fs[plugin][n].features = (VampFeatureUnion *)realloc (m_fs[plugin][n].features, 2 * sz * sizeof(VampFeatureUnion)); while (m_fsizes[plugin][n] < sz) { m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.hasTimestamp = 0; m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.valueCount = 0; m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.values = 0; m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.label = 0; m_fs[plugin][n].features[m_fsizes[plugin][n] + sz].v2.hasDuration = 0; m_fvsizes[plugin][n].push_back(0); m_fsizes[plugin][n]++; } } void PluginAdapterBase::Impl::resizeFV(Plugin *plugin, int n, int j, size_t sz) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::resizeFV(" << plugin << ", " << n << ", " << j << ", " << sz << ")" << std::endl; #endif size_t i = m_fvsizes[plugin][n][j]; if (i >= sz) return; #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "resizing from " << i << std::endl; #endif m_fs[plugin][n].features[j].v1.values = (float *)realloc (m_fs[plugin][n].features[j].v1.values, sz * sizeof(float)); m_fvsizes[plugin][n][j] = sz; } PluginAdapterBase::Impl::AdapterMap * PluginAdapterBase::Impl::m_adapterMap = 0; } _VAMP_SDK_PLUGSPACE_END(PluginAdapter.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/RealTime.cpp0000644000000000000000000001465013111512442022677 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. Relicensed by the author as detailed above. */ #include #if (defined(__GNUC__)) && (__GNUC__ < 3) #include #define stringstream strstream #else #include #endif using std::cerr; using std::endl; #ifndef _WIN32 #include #endif #include _VAMP_SDK_PLUGSPACE_BEGIN(RealTime.cpp) namespace Vamp { // A RealTime consists of two ints that must be at least 32 bits each. // A signed 32-bit int can store values exceeding +/- 2 billion. This // means we can safely use our lower int for nanoseconds, as there are // 1 billion nanoseconds in a second and we need to handle double that // because of the implementations of addition etc that we use. // // The maximum valid RealTime on a 32-bit system is somewhere around // 68 years: 999999999 nanoseconds longer than the classic Unix epoch. #define ONE_BILLION 1000000000 RealTime::RealTime(int s, int n) : sec(s), nsec(n) { if (sec == 0) { while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } } else if (sec < 0) { while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } } else { while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } } } RealTime RealTime::fromSeconds(double sec) { if (sec != sec) { // NaN cerr << "ERROR: NaN/Inf passed to Vamp::RealTime::fromSeconds" << endl; return RealTime::zeroTime; } else if (sec >= 0) { return RealTime(int(sec), int((sec - int(sec)) * ONE_BILLION + 0.5)); } else { return -fromSeconds(-sec); } } RealTime RealTime::fromMilliseconds(int msec) { return RealTime(msec / 1000, (msec % 1000) * 1000000); } #ifndef _WIN32 RealTime RealTime::fromTimeval(const struct timeval &tv) { return RealTime(int(tv.tv_sec), int(tv.tv_usec * 1000)); } #endif std::ostream &operator<<(std::ostream &out, const RealTime &rt) { if (rt < RealTime::zeroTime) { out << "-"; } else { out << " "; } int s = (rt.sec < 0 ? -rt.sec : rt.sec); int n = (rt.nsec < 0 ? -rt.nsec : rt.nsec); out << s << "."; int nn(n); if (nn == 0) out << "00000000"; else while (nn < (ONE_BILLION / 10)) { out << "0"; nn *= 10; } out << n << "R"; return out; } std::string RealTime::toString() const { std::stringstream out; out << *this; std::string s = out.str(); // remove trailing R return s.substr(0, s.length() - 1); } std::string RealTime::toText(bool fixedDp) const { if (*this < RealTime::zeroTime) return "-" + (-*this).toText(fixedDp); std::stringstream out; if (sec >= 3600) { out << (sec / 3600) << ":"; } if (sec >= 60) { int minutes = (sec % 3600) / 60; if (sec >= 3600 && minutes < 10) out << "0"; out << minutes << ":"; } if (sec >= 10) { out << ((sec % 60) / 10); } out << (sec % 10); int ms = msec(); if (ms != 0) { out << "."; out << (ms / 100); ms = ms % 100; if (ms != 0) { out << (ms / 10); ms = ms % 10; } else if (fixedDp) { out << "0"; } if (ms != 0) { out << ms; } else if (fixedDp) { out << "0"; } } else if (fixedDp) { out << ".000"; } std::string s = out.str(); return s; } RealTime RealTime::operator/(int d) const { int secdiv = sec / d; int secrem = sec % d; double nsecdiv = (double(nsec) + ONE_BILLION * double(secrem)) / d; return RealTime(secdiv, int(nsecdiv + 0.5)); } double RealTime::operator/(const RealTime &r) const { double lTotal = double(sec) * ONE_BILLION + double(nsec); double rTotal = double(r.sec) * ONE_BILLION + double(r.nsec); if (rTotal == 0) return 0.0; else return lTotal/rTotal; } long RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate) { if (time < zeroTime) return -realTime2Frame(-time, sampleRate); double s = time.sec + double(time.nsec) / ONE_BILLION; return long(s * sampleRate + 0.5); } RealTime RealTime::frame2RealTime(long frame, unsigned int sampleRate) { if (frame < 0) return -frame2RealTime(-frame, sampleRate); int sec = int(frame / long(sampleRate)); frame -= sec * long(sampleRate); int nsec = (int)((double(frame) / double(sampleRate)) * ONE_BILLION + 0.5); // Use ctor here instead of setting data members directly to // ensure nsec > ONE_BILLION is handled properly. It's extremely // unlikely, but not impossible. return RealTime(sec, nsec); } const RealTime RealTime::zeroTime(0,0); } _VAMP_SDK_PLUGSPACE_END(RealTime.cpp) sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/acsymbols.c0000644000000000000000000000115713111512442022627 0ustar 00000000000000/* These stubs are provided so that autoconf can check library * versions using C symbols only */ extern void libvampsdk_v_2_7_1_present(void) { } extern void libvampsdk_v_2_7_present(void) { } extern void libvampsdk_v_2_6_present(void) { } extern void libvampsdk_v_2_5_present(void) { } extern void libvampsdk_v_2_4_present(void) { } extern void libvampsdk_v_2_3_1_present(void) { } extern void libvampsdk_v_2_3_present(void) { } extern void libvampsdk_v_2_2_1_present(void) { } extern void libvampsdk_v_2_2_present(void) { } extern void libvampsdk_v_2_1_present(void) { } extern void libvampsdk_v_2_0_present(void) { } sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/ext/_kiss_fft_guts.h0000644000000000000000000001334013111512442024446 0ustar 00000000000000#ifndef KISS_FFT__GUTS_H #define KISS_FFT__GUTS_H /* Copyright (c) 2003-2010, Mark Borgerding 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 author nor the names of any 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 OWNER 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. */ /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" #include #define MAXFACTORS 32 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ struct kiss_fft_state{ int nfft; int inverse; int factors[2*MAXFACTORS]; kiss_fft_cpx twiddles[1]; }; /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #if (FIXED_POINT==32) # define FRACBITS 31 # define SAMPPROD int64_t #define SAMP_MAX 2147483647 #else # define FRACBITS 15 # define SAMPPROD int32_t #define SAMP_MAX 32767 #endif #define SAMP_MIN -SAMP_MAX #if defined(CHECK_OVERFLOW) # define CHECK_OVERFLOW_OP(a,op,b) \ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } #endif # define smul(a,b) ( (SAMPPROD)(a)*(b) ) # define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) # define S_MUL(a,b) sround( smul(a,b) ) # define C_MUL(m,a,b) \ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) # define DIVSCALAR(x,k) \ (x) = sround( smul( x, SAMP_MAX/k ) ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = sround( smul( (c).r , s ) ) ;\ (c).i = sround( smul( (c).i , s ) ) ; }while(0) #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #ifdef FIXED_POINT # define KISS_FFT_COS(phase) floor(.5+SAMP_MAX * cos (phase)) # define KISS_FFT_SIN(phase) floor(.5+SAMP_MAX * sin (phase)) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) /* a debugging function */ #define pcpx(c)\ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) #ifdef KISS_FFT_USE_ALLOCA // define this to allow use of alloca instead of malloc for temporary buffers // Temporary buffers are used in two case: // 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 // 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. #include #define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) #define KISS_FFT_TMP_FREE(ptr) #else #define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) #define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) #endif #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/ext/kiss_fft.c0000644000000000000000000003063113111512442023242 0ustar 00000000000000/* Copyright (c) 2003-2010, Mark Borgerding 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 author nor the names of any 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 OWNER 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. */ #include "_kiss_fft_guts.h" /* The guts header contains all the multiplication and addition macros that are defined for fixed or floating point complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx * Fout2; kiss_fft_cpx * tw1 = st->twiddles; kiss_fft_cpx t; Fout2 = Fout + m; do{ C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2); C_MUL (t, *Fout2 , *tw1); tw1 += fstride; C_SUB( *Fout2 , *Fout , t ); C_ADDTO( *Fout , t ); ++Fout2; ++Fout; }while (--m); } static void kf_bfly4( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, const size_t m ) { kiss_fft_cpx *tw1,*tw2,*tw3; kiss_fft_cpx scratch[6]; size_t k=m; const size_t m2=2*m; const size_t m3=3*m; tw3 = tw2 = tw1 = st->twiddles; do { C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4); C_MUL(scratch[0],Fout[m] , *tw1 ); C_MUL(scratch[1],Fout[m2] , *tw2 ); C_MUL(scratch[2],Fout[m3] , *tw3 ); C_SUB( scratch[5] , *Fout, scratch[1] ); C_ADDTO(*Fout, scratch[1]); C_ADD( scratch[3] , scratch[0] , scratch[2] ); C_SUB( scratch[4] , scratch[0] , scratch[2] ); C_SUB( Fout[m2], *Fout, scratch[3] ); tw1 += fstride; tw2 += fstride*2; tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); if(st->inverse) { Fout[m].r = scratch[5].r - scratch[4].i; Fout[m].i = scratch[5].i + scratch[4].r; Fout[m3].r = scratch[5].r + scratch[4].i; Fout[m3].i = scratch[5].i - scratch[4].r; }else{ Fout[m].r = scratch[5].r + scratch[4].i; Fout[m].i = scratch[5].i - scratch[4].r; Fout[m3].r = scratch[5].r - scratch[4].i; Fout[m3].i = scratch[5].i + scratch[4].r; } ++Fout; }while(--k); } static void kf_bfly3( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, size_t m ) { size_t k=m; const size_t m2 = 2*m; kiss_fft_cpx *tw1,*tw2; kiss_fft_cpx scratch[5]; kiss_fft_cpx epi3; epi3 = st->twiddles[fstride*m]; tw1=tw2=st->twiddles; do{ C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int u; kiss_fft_cpx scratch[13]; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx *tw; kiss_fft_cpx ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=st->twiddles; for ( u=0; ur += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } /* perform the butterfly for one stage of a mixed radix FFT */ static void kf_bfly_generic( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p ) { int u,k,q1,q; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx t; int Norig = st->nfft; kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p); for ( u=0; u=Norig) twidx-=Norig; C_MUL(t,scratch[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } KISS_FFT_TMP_FREE(scratch); } static void kf_work( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride, int in_stride, int * factors, const kiss_fft_cfg st ) { kiss_fft_cpx * Fout_beg=Fout; const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ const kiss_fft_cpx * Fout_end = Fout + p*m; #ifdef _OPENMP // use openmp extensions at the // top-level (not recursive) if (fstride==1 && p<=5) { int k; // execute the p different work units in different threads # pragma omp parallel for for (k=0;kr = f->r; Fout->i = f->i; f += fstride*in_stride; }while(++Fout != Fout_end ); }else{ do{ // recursive call: // DFT of size m*p performed by doing // p instances of smaller DFTs of size m, // each one takes a decimated version of the input kf_work( Fout , f, fstride*p, in_stride, factors,st); f += fstride*in_stride; }while( (Fout += m) != Fout_end ); } Fout=Fout_beg; // recombine the p smaller DFTs switch (p) { case 2: kf_bfly2(Fout,fstride,st,m); break; case 3: kf_bfly3(Fout,fstride,st,m); break; case 4: kf_bfly4(Fout,fstride,st,m); break; case 5: kf_bfly5(Fout,fstride,st,m); break; default: kf_bfly_generic(Fout,fstride,st,m,p); break; } } /* facbuf is populated by p1,m1,p2,m2, ... where p[i] * m[i] = m[i-1] m0 = n */ static void kf_factor(int n,int * facbuf) { int p=4; double floor_sqrt; floor_sqrt = floor( sqrt((double)n) ); /*factor out powers of 4, powers of 2, then any remaining primes */ do { while (n % p) { switch (p) { case 4: p = 2; break; case 2: p = 3; break; default: p += 2; break; } if (p > floor_sqrt) p = n; /* no more factors, skip to end */ } n /= p; *facbuf++ = p; *facbuf++ = n; } while (n > 1); } /* * * User-callable function to allocate all necessary storage space for the fft. * * The return value is a contiguous block of memory, allocated with malloc. As such, * It can be freed with free(), rather than a kiss_fft-specific function. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) { kiss_fft_cfg st=NULL; size_t memneeded = sizeof(struct kiss_fft_state) + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ if ( lenmem==NULL ) { st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); }else{ if (mem != NULL && *lenmem >= memneeded) st = (kiss_fft_cfg)mem; *lenmem = memneeded; } if (st) { int i; st->nfft=nfft; st->inverse = inverse_fft; for (i=0;iinverse) phase *= -1; kf_cexp(st->twiddles+i, phase ); } kf_factor(nfft,st->factors); } return st; } void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { //NOTE: this is not really an in-place FFT algorithm. //It just performs an out-of-place FFT into a temp buffer kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft); kf_work(tmpbuf,fin,1,in_stride, st->factors,st); memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); KISS_FFT_TMP_FREE(tmpbuf); }else{ kf_work( fout, fin, 1,in_stride, st->factors,st ); } } void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_fft_stride(cfg,fin,fout,1); } void kiss_fft_cleanup(void) { // nothing needed any more } int kiss_fft_next_fast_size(int n) { while(1) { int m=n; while ( (m%2) == 0 ) m/=2; while ( (m%3) == 0 ) m/=3; while ( (m%5) == 0 ) m/=5; if (m<=1) break; /* n is completely factorable by twos, threes, and fives */ n++; } return n; } sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/ext/kiss_fft.h0000644000000000000000000000657513111512442023261 0ustar 00000000000000#ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include #include #ifndef KISSFFT_USE_CPP_LINKAGE #ifdef __cplusplus extern "C" { #endif #endif /* ATTENTION! If you would like a : -- a utility that will handle the caching of fft objects -- real-only (no imaginary time component ) FFT -- a multi-dimensional FFT -- a command-line utility to perform ffts -- a command-line utility to perform fast-convolution filtering Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c in the tools/ directory. */ #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) #define KISS_FFT_FREE _mm_free #else #define KISS_FFT_MALLOC malloc #define KISS_FFT_FREE free #endif #ifdef FIXED_POINT #include # if (FIXED_POINT == 32) # define kiss_fft_scalar int32_t # else # define kiss_fft_scalar int16_t # endif #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # endif #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct kiss_fft_state* kiss_fft_cfg; /* * kiss_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); /* * kiss_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); /* A more generic version of the above function. It reads its input from every Nth sample. * */ void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); /* If kiss_fft_alloc allocated a buffer, it is one contiguous buffer and can be simply free()d when no longer needed*/ #define kiss_fft_free free /* Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up your compiler output to call this before you exit. */ void kiss_fft_cleanup(void); /* * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) */ int kiss_fft_next_fast_size(int n); /* for real ffts, we need an even size */ #define kiss_fftr_next_fast_size_real(n) \ (kiss_fft_next_fast_size( ((n)+1)>>1)<<1) #ifndef KISSFFT_USE_CPP_LINKAGE #ifdef __cplusplus } #endif #endif #ifdef KISSFFT_USE_CPP_LINKAGE #define KISSFFT_USED_CPP_LINKAGE 1 #endif #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/ext/kiss_fftr.c0000644000000000000000000001346313111512442023430 0ustar 00000000000000/* Copyright (c) 2003-2004, Mark Borgerding 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 author nor the names of any 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 OWNER 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. */ #include "kiss_fftr.h" #include "_kiss_fft_guts.h" struct kiss_fftr_state{ kiss_fft_cfg substate; kiss_fft_cpx * tmpbuf; kiss_fft_cpx * super_twiddles; #ifdef USE_SIMD void * pad; #endif }; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) { int i; kiss_fftr_cfg st = NULL; size_t subsize, memneeded; if (nfft & 1) { fprintf(stderr,"Real FFT optimization must be even.\n"); return NULL; } nfft >>= 1; kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize); memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 3 / 2); if (lenmem == NULL) { st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); } else { if (*lenmem >= memneeded) st = (kiss_fftr_cfg) mem; *lenmem = memneeded; } if (!st) return NULL; st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize); st->super_twiddles = st->tmpbuf + nfft; kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); for (i = 0; i < nfft/2; ++i) { double phase = -3.14159265358979323846264338327 * ((double) (i+1) / nfft + .5); if (inverse_fft) phase *= -1; kf_cexp (st->super_twiddles+i,phase); } return st; } void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx fpnk,fpk,f1k,f2k,tw,tdc; if ( st->substate->inverse) { fprintf(stderr,"kiss fft usage error: improper alloc\n"); exit(1); } ncfft = st->substate->nfft; /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = st->tmpbuf[0].r; tdc.i = st->tmpbuf[0].i; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0].r = tdc.r + tdc.i; freqdata[ncfft].r = tdc.r - tdc.i; #ifdef USE_SIMD freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); #else freqdata[ncfft].i = freqdata[0].i = 0; #endif for ( k=1;k <= ncfft/2 ; ++k ) { fpk = st->tmpbuf[k]; fpnk.r = st->tmpbuf[ncfft-k].r; fpnk.i = - st->tmpbuf[ncfft-k].i; C_FIXDIV(fpk,2); C_FIXDIV(fpnk,2); C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( tw , f2k , st->super_twiddles[k-1]); freqdata[k].r = HALF_OF(f1k.r + tw.r); freqdata[k].i = HALF_OF(f1k.i + tw.i); freqdata[ncfft-k].r = HALF_OF(f1k.r - tw.r); freqdata[ncfft-k].i = HALF_OF(tw.i - f1k.i); } } void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; if (st->substate->inverse == 0) { fprintf (stderr, "kiss fft usage error: improper alloc\n"); exit (1); } ncfft = st->substate->nfft; st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; C_FIXDIV(st->tmpbuf[0],2); for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk = freqdata[k]; fnkc.r = freqdata[ncfft - k].r; fnkc.i = -freqdata[ncfft - k].i; C_FIXDIV( fk , 2 ); C_FIXDIV( fnkc , 2 ); C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k-1]); C_ADD (st->tmpbuf[k], fek, fok); C_SUB (st->tmpbuf[ncfft - k], fek, fok); #ifdef USE_SIMD st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); #else st->tmpbuf[ncfft - k].i *= -1; #endif } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } sonic-visualiser-3.0.3/vamp-plugin-sdk/src/vamp-sdk/ext/kiss_fftr.h0000644000000000000000000000176413111512442023436 0ustar 00000000000000#ifndef KISS_FTR_H #define KISS_FTR_H #include "kiss_fft.h" #ifndef KISSFFT_USE_CPP_LINKAGE #ifdef __cplusplus extern "C" { #endif #endif /* Real optimized version can save about 45% cpu time vs. complex fft of a real seq. */ typedef struct kiss_fftr_state *kiss_fftr_cfg; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); /* nfft must be even If you don't care to allocate space, use mem = lenmem = NULL */ void kiss_fftr(kiss_fftr_cfg cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); /* input timedata has nfft scalar points output freqdata has nfft/2+1 complex points */ void kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); /* input freqdata has nfft/2+1 complex points output timedata has nfft scalar points */ #define kiss_fftr_free free #ifndef KISSFFT_USE_CPP_LINKAGE #ifdef __cplusplus } #endif #endif #ifdef KISSFFT_USE_CPP_LINKAGE #define KISSFFT_USED_CPP_LINKAGE 1 #endif #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_curve-fsr-mixed.txt0000644000000000000000000000100313111512442030734 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:curve-fsr-mixed 2.400000000: 0 1 of 10: 0 at 2.4 snap to 2.4 2.800000000: 0.1 2 of 10: 0.1 at 2.9 snap to 2.8 3.200000000: 0.2 3 of 10: 0.2 at 3.14 snap to 3.2 3.600000000: 0.3 4 of 10: 0.3 at 3.5 snap to 3.6 4.000000000: 0.4 5 of 10: 0.4 at 4 4.400000000: 0.5 6 of 10: 0.5 at 4.4 4.000000000: 0.6 7 of 10: 0.6 at 3.9 snap to 4 4.400000000: 0.7 8 of 10: 0.7 at 4.4 snap to 4.4 4.800000000: 0.8 9 of 10: 0.8 at 4.8 5.200000000: 0.9 10 of 10: 0.9 at 5 snap to 5.2 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_curve-fsr-timed.txt0000644000000000000000000000103013111512442030730 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:curve-fsr-timed 0.000000000: 0 1 of 10: 0 at 0 snap to 0 0.000000000: 0.1 2 of 10: 0.1 at 0 snap to 0 0.000000000: 0.2 3 of 10: 0.2 at 0.166 snap to 0 0.400000000: 0.3 4 of 10: 0.3 at 0.333 snap to 0.4 2.000000000: 0.4 5 of 10: 0.4 at 2 snap to 2 2.000000000: 0.5 6 of 10: 0.5 at 2 snap to 2 2.000000000: 0.6 7 of 10: 0.6 at 2.166 snap to 2 2.400000000: 0.7 8 of 10: 0.7 at 2.333 snap to 2.4 4.000000000: 0.8 9 of 10: 0.8 at 4 snap to 4 4.000000000: 0.9 10 of 10: 0.9 at 4 snap to 4 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_curve-fsr.txt0000644000000000000000000000065213111512442027641 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:curve-fsr 0.000000000: 0 1 of 10: 0 at 0 0.400000000: 0.1 2 of 10: 0.1 at 0.4 0.800000000: 0.2 3 of 10: 0.2 at 0.8 1.200000000: 0.3 4 of 10: 0.3 at 1.2 1.600000000: 0.4 5 of 10: 0.4 at 1.6 2.000000000: 0.5 6 of 10: 0.5 at 2 2.400000000: 0.6 7 of 10: 0.6 at 2.4 2.800000000: 0.7 8 of 10: 0.7 at 2.8 3.200000000: 0.8 9 of 10: 0.8 at 3.2 3.600000000: 0.9 10 of 10: 0.9 at 3.6 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_curve-oss.txt0000644000000000000000000000156013111512442027652 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:curve-oss 0.023219955: 0 1 of 20: 0 at 0.023 0.046439909: 0.05 2 of 20: 0.05 at 0.046 0.069659864: 0.1 3 of 20: 0.1 at 0.069 0.092879819: 0.15 4 of 20: 0.15 at 0.092 0.116099773: 0.2 5 of 20: 0.2 at 0.116 0.139319728: 0.25 6 of 20: 0.25 at 0.139 0.162539683: 0.3 7 of 20: 0.3 at 0.162 0.185759637: 0.35 8 of 20: 0.35 at 0.185 0.208979592: 0.4 9 of 20: 0.4 at 0.208 0.232199546: 0.45 10 of 20: 0.45 at 0.232 0.255419501: 0.5 11 of 20: 0.5 at 0.255 0.278639456: 0.55 12 of 20: 0.55 at 0.278 0.301859410: 0.6 13 of 20: 0.6 at 0.301 0.325079365: 0.65 14 of 20: 0.65 at 0.325 0.348299320: 0.7 15 of 20: 0.7 at 0.348 0.371519274: 0.75 16 of 20: 0.75 at 0.371 0.394739229: 0.8 17 of 20: 0.8 at 0.394 0.417959184: 0.85 18 of 20: 0.85 at 0.417 0.441179138: 0.9 19 of 20: 0.9 at 0.441 0.464399093: 0.95 20 of 20: 0.95 at 0.464 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_curve-vsr.txt0000644000000000000000000000061513111512442027660 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:curve-vsr 0.750000000: 0.1 2 of 10: 0.1 at 0.75 1.500000000: 0.2 3 of 10: 0.2 at 1.5 2.250000000: 0.3 4 of 10: 0.3 at 2.25 3.000000000: 0.4 5 of 10: 0.4 at 3 3.750000000: 0.5 6 of 10: 0.5 at 3.75 4.500000000: 0.6 7 of 10: 0.6 at 4.5 5.250000000: 0.7 8 of 10: 0.7 at 5.25 6.000000000: 0.8 9 of 10: 0.8 at 6 6.750000000: 0.9 10 of 10: 0.9 at 6.75 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_grid-fsr.txt0000644000000000000000000000142313111512442027437 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:grid-fsr 0.000000000: 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 1 of 10 at 0 0.400000000: 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 2 of 10 at 0.4 0.800000000: 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 3 of 10 at 0.8 1.200000000: 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 4 of 10 at 1.2 1.600000000: 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 5 of 10 at 1.6 2.000000000: 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 6 of 10 at 2 2.400000000: 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 7 of 10 at 2.4 2.800000000: 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 8 of 10 at 2.8 3.200000000: 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 9 of 10 at 3.2 3.600000000: 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1 10 of 10 at 3.6 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_grid-oss.txt0000644000000000000000000000414313111512442027453 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:grid-oss 0.023219955: 0.0666667 0.1 0.133333 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 1 of 20 at 0.023 0.046439909: 0.1 0.133333 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 2 of 20 at 0.046 0.069659864: 0.133333 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 3 of 20 at 0.069 0.092879819: 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 4 of 20 at 0.092 0.116099773: 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 5 of 20 at 0.116 0.139319728: 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 6 of 20 at 0.139 0.162539683: 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 7 of 20 at 0.162 0.185759637: 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 8 of 20 at 0.185 0.208979592: 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 9 of 20 at 0.208 0.232199546: 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 10 of 20 at 0.232 0.255419501: 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 11 of 20 at 0.255 0.278639456: 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 12 of 20 at 0.278 0.301859410: 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 13 of 20 at 0.301 0.325079365: 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 14 of 20 at 0.325 0.348299320: 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 15 of 20 at 0.348 0.371519274: 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 16 of 20 at 0.371 0.394739229: 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 17 of 20 at 0.394 0.417959184: 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 0.933333 18 of 20 at 0.417 0.441179138: 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 0.933333 0.966667 19 of 20 at 0.441 0.464399093: 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 0.933333 0.966667 1 20 of 20 at 0.464 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_input-summary.txt0000644000000000000000000005505413111512442030565 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:input-summary 0.023219955: 0 0 0.046439909: 1.04688 482 0.069659864: 0 968.992 0.092879819: 1.09375 981.992 0.116099773: 0 993.992 0.139319728: 1.14844 997.992 0.162539683: 0 999.992 0.185759637: 1.19531 1002.99 0.208979592: 0 1005.99 0.232199546: 1.24219 1005.99 0.255419501: 0 1007.99 0.278639456: 1.29688 1007.99 0.301859410: 0 1007 0.325079365: 1.34375 1011.99 0.348299320: 0 1014.99 0.371519274: 1.39062 1015.99 0.394739229: 0 1015 0.417959184: 1.44531 1015.99 0.441179138: 0 1015.99 0.464399093: 1.49219 1017.99 0.487619048: 0 1016 0.510839002: 1.53906 1016.99 0.534058957: 0 1015.99 0.557278912: 1.59375 1015.99 0.580498866: 0 1016 0.603718821: 1.64062 1016 0.626938776: 0 1016.99 0.650158730: 1.6875 1016.99 0.673378685: 0 1017 0.696598639: 1.74219 1017.99 0.719818594: 0 1016.99 0.743038549: 1.78906 1016.99 0.766258503: 0 1017.99 0.789478458: 1.83594 1017 0.812698413: 0 1016.99 0.835918367: 1.89062 1016.99 0.859138322: 0 1017.99 0.882358277: 1.9375 1016.99 0.905578231: 0 1015.99 0.928798186: 0 507 0.952018141: 0 0 0.975238095: 1.04688 482 0.998458050: 0 968.992 1.021678005: 1.09375 981.992 1.044897959: 0 993.992 1.068117914: 1.14844 997.992 1.091337868: 0 999.992 1.114557823: 1.19531 1002.99 1.137777778: 0 1005.99 1.160997732: 1.24219 1005.99 1.184217687: 0 1007.99 1.207437642: 1.29688 1007.99 1.230657596: 0 1007 1.253877551: 1.34375 1011.99 1.277097506: 0 1014.99 1.300317460: 1.39062 1015.99 1.323537415: 0 1015 1.346757370: 1.44531 1015.99 1.369977324: 0 1015.99 1.393197279: 1.49219 1017.99 1.416417234: 0 1016 1.439637188: 1.53906 1016.99 1.462857143: 0 1015.99 1.486077098: 1.59375 1015.99 1.509297052: 0 1016 1.532517007: 1.64062 1016 1.555736961: 0 1016.99 1.578956916: 1.6875 1016.99 1.602176871: 0 1017 1.625396825: 1.74219 1017.99 1.648616780: 0 1016.99 1.671836735: 1.78906 1016.99 1.695056689: 0 1017.99 1.718276644: 1.83594 1017 1.741496599: 0 1016.99 1.764716553: 1.89062 1016.99 1.787936508: 0 1017.99 1.811156463: 1.9375 1016.99 1.834376417: 0 1015.99 1.857596372: 0 507 1.880816327: 0 0 1.904036281: 1.04688 482 1.927256236: 0 968.992 1.950476190: 1.09375 981.992 1.973696145: 0 993.992 1.996916100: 1.14844 997.992 2.020136054: 0 999.992 2.043356009: 1.19531 1002.99 2.066575964: 0 1005.99 2.089795918: 1.24219 1005.99 2.113015873: 0 1007.99 2.136235828: 1.29688 1007.99 2.159455782: 0 1007 2.182675737: 1.34375 1011.99 2.205895692: 0 1014.99 2.229115646: 1.39062 1015.99 2.252335601: 0 1015 2.275555556: 1.44531 1015.99 2.298775510: 0 1015.99 2.321995465: 1.49219 1017.99 2.345215420: 0 1016 2.368435374: 1.53906 1016.99 2.391655329: 0 1015.99 2.414875283: 1.59375 1015.99 2.438095238: 0 1016 2.461315193: 1.64062 1016 2.484535147: 0 1016.99 2.507755102: 1.6875 1016.99 2.530975057: 0 1017 2.554195011: 1.74219 1017.99 2.577414966: 0 1016.99 2.600634921: 1.78906 1016.99 2.623854875: 0 1017.99 2.647074830: 1.83594 1017 2.670294785: 0 1016.99 2.693514739: 1.89062 1016.99 2.716734694: 0 1017.99 2.739954649: 1.9375 1016.99 2.763174603: 0 1015.99 2.786394558: 0 507 2.809614512: 0 0 2.832834467: 1.04688 482 2.856054422: 0 968.992 2.879274376: 1.09375 981.992 2.902494331: 0 993.992 2.925714286: 1.14844 997.992 2.948934240: 0 999.992 2.972154195: 1.19531 1002.99 2.995374150: 0 1005.99 3.018594104: 1.24219 1005.99 3.041814059: 0 1007.99 3.065034014: 1.29688 1007.99 3.088253968: 0 1007 3.111473923: 1.34375 1011.99 3.134693878: 0 1014.99 3.157913832: 1.39062 1015.99 3.181133787: 0 1015 3.204353741: 1.44531 1015.99 3.227573696: 0 1015.99 3.250793651: 1.49219 1017.99 3.274013605: 0 1016 3.297233560: 1.53906 1016.99 3.320453515: 0 1015.99 3.343673469: 1.59375 1015.99 3.366893424: 0 1016 3.390113379: 1.64062 1016 3.413333333: 0 1016.99 3.436553288: 1.6875 1016.99 3.459773243: 0 1017 3.482993197: 1.74219 1017.99 3.506213152: 0 1016.99 3.529433107: 1.78906 1016.99 3.552653061: 0 1017.99 3.575873016: 1.83594 1017 3.599092971: 0 1016.99 3.622312925: 1.89062 1016.99 3.645532880: 0 1017.99 3.668752834: 1.9375 1016.99 3.691972789: 0 1015.99 3.715192744: 0 507 3.738412698: 0 0 3.761632653: 1.04688 482 3.784852608: 0 968.992 3.808072562: 1.09375 981.992 3.831292517: 0 993.992 3.854512472: 1.14844 997.992 3.877732426: 0 999.992 3.900952381: 1.19531 1002.99 3.924172336: 0 1005.99 3.947392290: 1.24219 1005.99 3.970612245: 0 1007.99 3.993832200: 1.29688 1007.99 4.017052154: 0 1007 4.040272109: 1.34375 1011.99 4.063492063: 0 1014.99 4.086712018: 1.39062 1015.99 4.109931973: 0 1015 4.133151927: 1.44531 1015.99 4.156371882: 0 1015.99 4.179591837: 1.49219 1017.99 4.202811791: 0 1016 4.226031746: 1.53906 1016.99 4.249251701: 0 1015.99 4.272471655: 1.59375 1015.99 4.295691610: 0 1016 4.318911565: 1.64062 1016 4.342131519: 0 1016.99 4.365351474: 1.6875 1016.99 4.388571429: 0 1017 4.411791383: 1.74219 1017.99 4.435011338: 0 1016.99 4.458231293: 1.78906 1016.99 4.481451247: 0 1017.99 4.504671202: 1.83594 1017 4.527891156: 0 1016.99 4.551111111: 1.89062 1016.99 4.574331066: 0 1017.99 4.597551020: 1.9375 1016.99 4.620770975: 0 1015.99 4.643990930: 0 507 4.667210884: 0 0 4.690430839: 1.04688 482 4.713650794: 0 968.992 4.736870748: 1.09375 981.992 4.760090703: 0 993.992 4.783310658: 1.14844 997.992 4.806530612: 0 999.992 4.829750567: 1.19531 1002.99 4.852970522: 0 1005.99 4.876190476: 1.24219 1005.99 4.899410431: 0 1007.99 4.922630385: 1.29688 1007.99 4.945850340: 0 1007 4.969070295: 1.34375 1011.99 4.992290249: 0 1014.99 5.015510204: 1.39062 1015.99 5.038730159: 0 1015 5.061950113: 1.44531 1015.99 5.085170068: 0 1015.99 5.108390023: 1.49219 1017.99 5.131609977: 0 1016 5.154829932: 1.53906 1016.99 5.178049887: 0 1015.99 5.201269841: 1.59375 1015.99 5.224489796: 0 1016 5.247709751: 1.64062 1016 5.270929705: 0 1016.99 5.294149660: 1.6875 1016.99 5.317369615: 0 1017 5.340589569: 1.74219 1017.99 5.363809524: 0 1016.99 5.387029478: 1.78906 1016.99 5.410249433: 0 1017.99 5.433469388: 1.83594 1017 5.456689342: 0 1016.99 5.479909297: 1.89062 1016.99 5.503129252: 0 1017.99 5.526349206: 1.9375 1016.99 5.549569161: 0 1015.99 5.572789116: 0 507 5.596009070: 0 0 5.619229025: 1.04688 482 5.642448980: 0 968.992 5.665668934: 1.09375 981.992 5.688888889: 0 993.992 5.712108844: 1.14844 997.992 5.735328798: 0 999.992 5.758548753: 1.19531 1002.99 5.781768707: 0 1005.99 5.804988662: 1.24219 1005.99 5.828208617: 0 1007.99 5.851428571: 1.29688 1007.99 5.874648526: 0 1007 5.897868481: 1.34375 1011.99 5.921088435: 0 1014.99 5.944308390: 1.39062 1015.99 5.967528345: 0 1015 5.990748299: 1.44531 1015.99 6.013968254: 0 1015.99 6.037188209: 1.49219 1017.99 6.060408163: 0 1016 6.083628118: 1.53906 1016.99 6.106848073: 0 1015.99 6.130068027: 1.59375 1015.99 6.153287982: 0 1016 6.176507937: 1.64062 1016 6.199727891: 0 1016.99 6.222947846: 1.6875 1016.99 6.246167800: 0 1017 6.269387755: 1.74219 1017.99 6.292607710: 0 1016.99 6.315827664: 1.78906 1016.99 6.339047619: 0 1017.99 6.362267574: 1.83594 1017 6.385487528: 0 1016.99 6.408707483: 1.89062 1016.99 6.431927438: 0 1017.99 6.455147392: 1.9375 1016.99 6.478367347: 0 1015.99 6.501587302: 0 507 6.524807256: 0 0 6.548027211: 1.04688 482 6.571247166: 0 968.992 6.594467120: 1.09375 981.992 6.617687075: 0 993.992 6.640907029: 1.14844 997.992 6.664126984: 0 999.992 6.687346939: 1.19531 1002.99 6.710566893: 0 1005.99 6.733786848: 1.24219 1005.99 6.757006803: 0 1007.99 6.780226757: 1.29688 1007.99 6.803446712: 0 1007 6.826666667: 1.34375 1011.99 6.849886621: 0 1014.99 6.873106576: 1.39062 1015.99 6.896326531: 0 1015 6.919546485: 1.44531 1015.99 6.942766440: 0 1015.99 6.965986395: 1.49219 1017.99 6.989206349: 0 1016 7.012426304: 1.53906 1016.99 7.035646259: 0 1015.99 7.058866213: 1.59375 1015.99 7.082086168: 0 1016 7.105306122: 1.64062 1016 7.128526077: 0 1016.99 7.151746032: 1.6875 1016.99 7.174965986: 0 1017 7.198185941: 1.74219 1017.99 7.221405896: 0 1016.99 7.244625850: 1.78906 1016.99 7.267845805: 0 1017.99 7.291065760: 1.83594 1017 7.314285714: 0 1016.99 7.337505669: 1.89062 1016.99 7.360725624: 0 1017.99 7.383945578: 1.9375 1016.99 7.407165533: 0 1015.99 7.430385488: 0 507 7.453605442: 0 0 7.476825397: 1.04688 482 7.500045351: 0 968.992 7.523265306: 1.09375 981.992 7.546485261: 0 993.992 7.569705215: 1.14844 997.992 7.592925170: 0 999.992 7.616145125: 1.19531 1002.99 7.639365079: 0 1005.99 7.662585034: 1.24219 1005.99 7.685804989: 0 1007.99 7.709024943: 1.29688 1007.99 7.732244898: 0 1007 7.755464853: 1.34375 1011.99 7.778684807: 0 1014.99 7.801904762: 1.39062 1015.99 7.825124717: 0 1015 7.848344671: 1.44531 1015.99 7.871564626: 0 1015.99 7.894784580: 1.49219 1017.99 7.918004535: 0 1016 7.941224490: 1.53906 1016.99 7.964444444: 0 1015.99 7.987664399: 1.59375 1015.99 8.010884354: 0 1016 8.034104308: 1.64062 1016 8.057324263: 0 1016.99 8.080544218: 1.6875 1016.99 8.103764172: 0 1017 8.126984127: 1.74219 1017.99 8.150204082: 0 1016.99 8.173424036: 1.78906 1016.99 8.196643991: 0 1017.99 8.219863946: 1.83594 1017 8.243083900: 0 1016.99 8.266303855: 1.89062 1016.99 8.289523810: 0 1017.99 8.312743764: 1.9375 1016.99 8.335963719: 0 1015.99 8.359183673: 0 507 8.382403628: 0 0 8.405623583: 1.04688 482 8.428843537: 0 968.992 8.452063492: 1.09375 981.992 8.475283447: 0 993.992 8.498503401: 1.14844 997.992 8.521723356: 0 999.992 8.544943311: 1.19531 1002.99 8.568163265: 0 1005.99 8.591383220: 1.24219 1005.99 8.614603175: 0 1007.99 8.637823129: 1.29688 1007.99 8.661043084: 0 1007 8.684263039: 1.34375 1011.99 8.707482993: 0 1014.99 8.730702948: 1.39062 1015.99 8.753922902: 0 1015 8.777142857: 1.44531 1015.99 8.800362812: 0 1015.99 8.823582766: 1.49219 1017.99 8.846802721: 0 1016 8.870022676: 1.53906 1016.99 8.893242630: 0 1015.99 8.916462585: 1.59375 1015.99 8.939682540: 0 1016 8.962902494: 1.64062 1016 8.986122449: 0 1016.99 9.009342404: 1.6875 1016.99 9.032562358: 0 1017 9.055782313: 1.74219 1017.99 9.079002268: 0 1016.99 9.102222222: 1.78906 1016.99 9.125442177: 0 1017.99 9.148662132: 1.83594 1017 9.171882086: 0 1016.99 9.195102041: 1.89062 1016.99 9.218321995: 0 1017.99 9.241541950: 1.9375 1016.99 9.264761905: 0 1015.99 9.287981859: 0 507 9.311201814: 0 0 9.334421769: 1.04688 482 9.357641723: 0 968.992 9.380861678: 1.09375 981.992 9.404081633: 0 993.992 9.427301587: 1.14844 997.992 9.450521542: 0 999.992 9.473741497: 1.19531 1002.99 9.496961451: 0 1005.99 9.520181406: 1.24219 1005.99 9.543401361: 0 1007.99 9.566621315: 1.29688 1007.99 9.589841270: 0 1007 9.613061224: 1.34375 1011.99 9.636281179: 0 1014.99 9.659501134: 1.39062 1015.99 9.682721088: 0 1015 9.705941043: 1.44531 1015.99 9.729160998: 0 1015.99 9.752380952: 1.49219 1017.99 9.775600907: 0 1016 9.798820862: 1.53906 1016.99 9.822040816: 0 1015.99 9.845260771: 1.59375 1015.99 9.868480726: 0 1016 9.891700680: 1.64062 1016 9.914920635: 0 1016.99 9.938140590: 1.6875 1016.99 9.961360544: 0 1017 9.984580499: 1.74219 1017.99 10.007800454: 0 1016.99 10.031020408: 1.78906 1016.99 10.054240363: 0 1017.99 10.077460317: 1.83594 1017 10.100680272: 0 1016.99 10.123900227: 1.89062 1016.99 10.147120181: 0 1017.99 10.170340136: 1.9375 1016.99 10.193560091: 0 1015.99 10.216780045: 0 507 10.240000000: 0 0 10.263219955: 1.04688 482 10.286439909: 0 968.992 10.309659864: 1.09375 981.992 10.332879819: 0 993.992 10.356099773: 1.14844 997.992 10.379319728: 0 999.992 10.402539683: 1.19531 1002.99 10.425759637: 0 1005.99 10.448979592: 1.24219 1005.99 10.472199546: 0 1007.99 10.495419501: 1.29688 1007.99 10.518639456: 0 1007 10.541859410: 1.34375 1011.99 10.565079365: 0 1014.99 10.588299320: 1.39062 1015.99 10.611519274: 0 1015 10.634739229: 1.44531 1015.99 10.657959184: 0 1015.99 10.681179138: 1.49219 1017.99 10.704399093: 0 1016 10.727619048: 1.53906 1016.99 10.750839002: 0 1015.99 10.774058957: 1.59375 1015.99 10.797278912: 0 1016 10.820498866: 1.64062 1016 10.843718821: 0 1016.99 10.866938776: 1.6875 1016.99 10.890158730: 0 1017 10.913378685: 1.74219 1017.99 10.936598639: 0 1016.99 10.959818594: 1.78906 1016.99 10.983038549: 0 1017.99 11.006258503: 1.83594 1017 11.029478458: 0 1016.99 11.052698413: 1.89062 1016.99 11.075918367: 0 1017.99 11.099138322: 1.9375 1016.99 11.122358277: 0 1015.99 11.145578231: 0 507 11.168798186: 0 0 11.192018141: 1.04688 482 11.215238095: 0 968.992 11.238458050: 1.09375 981.992 11.261678005: 0 993.992 11.284897959: 1.14844 997.992 11.308117914: 0 999.992 11.331337868: 1.19531 1002.99 11.354557823: 0 1005.99 11.377777778: 1.24219 1005.99 11.400997732: 0 1007.99 11.424217687: 1.29688 1007.99 11.447437642: 0 1007 11.470657596: 1.34375 1011.99 11.493877551: 0 1014.99 11.517097506: 1.39062 1015.99 11.540317460: 0 1015 11.563537415: 1.44531 1015.99 11.586757370: 0 1015.99 11.609977324: 1.49219 1017.99 11.633197279: 0 1016 11.656417234: 1.53906 1016.99 11.679637188: 0 1015.99 11.702857143: 1.59375 1015.99 11.726077098: 0 1016 11.749297052: 1.64062 1016 11.772517007: 0 1016.99 11.795736961: 1.6875 1016.99 11.818956916: 0 1017 11.842176871: 1.74219 1017.99 11.865396825: 0 1016.99 11.888616780: 1.78906 1016.99 11.911836735: 0 1017.99 11.935056689: 1.83594 1017 11.958276644: 0 1016.99 11.981496599: 1.89062 1016.99 12.004716553: 0 1017.99 12.027936508: 1.9375 1016.99 12.051156463: 0 1015.99 12.074376417: 0 507 12.097596372: 0 0 12.120816327: 1.04688 482 12.144036281: 0 968.992 12.167256236: 1.09375 981.992 12.190476190: 0 993.992 12.213696145: 1.14844 997.992 12.236916100: 0 999.992 12.260136054: 1.19531 1002.99 12.283356009: 0 1005.99 12.306575964: 1.24219 1005.99 12.329795918: 0 1007.99 12.353015873: 1.29688 1007.99 12.376235828: 0 1007 12.399455782: 1.34375 1011.99 12.422675737: 0 1014.99 12.445895692: 1.39062 1015.99 12.469115646: 0 1015 12.492335601: 1.44531 1015.99 12.515555556: 0 1015.99 12.538775510: 1.49219 1017.99 12.561995465: 0 1016 12.585215420: 1.53906 1016.99 12.608435374: 0 1015.99 12.631655329: 1.59375 1015.99 12.654875283: 0 1016 12.678095238: 1.64062 1016 12.701315193: 0 1016.99 12.724535147: 1.6875 1016.99 12.747755102: 0 1017 12.770975057: 1.74219 1017.99 12.794195011: 0 1016.99 12.817414966: 1.78906 1016.99 12.840634921: 0 1017.99 12.863854875: 1.83594 1017 12.887074830: 0 1016.99 12.910294785: 1.89062 1016.99 12.933514739: 0 1017.99 12.956734694: 1.9375 1016.99 12.979954649: 0 1015.99 13.003174603: 0 507 13.026394558: 0 0 13.049614512: 1.04688 482 13.072834467: 0 968.992 13.096054422: 1.09375 981.992 13.119274376: 0 993.992 13.142494331: 1.14844 997.992 13.165714286: 0 999.992 13.188934240: 1.19531 1002.99 13.212154195: 0 1005.99 13.235374150: 1.24219 1005.99 13.258594104: 0 1007.99 13.281814059: 1.29688 1007.99 13.305034014: 0 1007 13.328253968: 1.34375 1011.99 13.351473923: 0 1014.99 13.374693878: 1.39062 1015.99 13.397913832: 0 1015 13.421133787: 1.44531 1015.99 13.444353741: 0 1015.99 13.467573696: 1.49219 1017.99 13.490793651: 0 1016 13.514013605: 1.53906 1016.99 13.537233560: 0 1015.99 13.560453515: 1.59375 1015.99 13.583673469: 0 1016 13.606893424: 1.64062 1016 13.630113379: 0 1016.99 13.653333333: 1.6875 1016.99 13.676553288: 0 1017 13.699773243: 1.74219 1017.99 13.722993197: 0 1016.99 13.746213152: 1.78906 1016.99 13.769433107: 0 1017.99 13.792653061: 1.83594 1017 13.815873016: 0 1016.99 13.839092971: 1.89062 1016.99 13.862312925: 0 1017.99 13.885532880: 1.9375 1016.99 13.908752834: 0 1015.99 13.931972789: 0 507 13.955192744: 0 0 13.978412698: 1.04688 482 14.001632653: 0 968.992 14.024852608: 1.09375 981.992 14.048072562: 0 993.992 14.071292517: 1.14844 997.992 14.094512472: 0 999.992 14.117732426: 1.19531 1002.99 14.140952381: 0 1005.99 14.164172336: 1.24219 1005.99 14.187392290: 0 1007.99 14.210612245: 1.29688 1007.99 14.233832200: 0 1007 14.257052154: 1.34375 1011.99 14.280272109: 0 1014.99 14.303492063: 1.39062 1015.99 14.326712018: 0 1015 14.349931973: 1.44531 1015.99 14.373151927: 0 1015.99 14.396371882: 1.49219 1017.99 14.419591837: 0 1016 14.442811791: 1.53906 1016.99 14.466031746: 0 1015.99 14.489251701: 1.59375 1015.99 14.512471655: 0 1016 14.535691610: 1.64062 1016 14.558911565: 0 1016.99 14.582131519: 1.6875 1016.99 14.605351474: 0 1017 14.628571429: 1.74219 1017.99 14.651791383: 0 1016.99 14.675011338: 1.78906 1016.99 14.698231293: 0 1017.99 14.721451247: 1.83594 1017 14.744671202: 0 1016.99 14.767891156: 1.89062 1016.99 14.791111111: 0 1017.99 14.814331066: 1.9375 1016.99 14.837551020: 0 1015.99 14.860770975: 0 507 14.883990930: 0 0 14.907210884: 1.04688 482 14.930430839: 0 968.992 14.953650794: 1.09375 981.992 14.976870748: 0 993.992 15.000090703: 1.14844 997.992 15.023310658: 0 999.992 15.046530612: 1.19531 1002.99 15.069750567: 0 1005.99 15.092970522: 1.24219 1005.99 15.116190476: 0 1007.99 15.139410431: 1.29688 1007.99 15.162630385: 0 1007 15.185850340: 1.34375 1011.99 15.209070295: 0 1014.99 15.232290249: 1.39062 1015.99 15.255510204: 0 1015 15.278730159: 1.44531 1015.99 15.301950113: 0 1015.99 15.325170068: 1.49219 1017.99 15.348390023: 0 1016 15.371609977: 1.53906 1016.99 15.394829932: 0 1015.99 15.418049887: 1.59375 1015.99 15.441269841: 0 1016 15.464489796: 1.64062 1016 15.487709751: 0 1016.99 15.510929705: 1.6875 1016.99 15.534149660: 0 1017 15.557369615: 1.74219 1017.99 15.580589569: 0 1016.99 15.603809524: 1.78906 1016.99 15.627029478: 0 1017.99 15.650249433: 1.83594 1017 15.673469388: 0 1016.99 15.696689342: 1.89062 1016.99 15.719909297: 0 1017.99 15.743129252: 1.9375 1016.99 15.766349206: 0 1015.99 15.789569161: 0 507 15.812789116: 0 0 15.836009070: 1.04688 482 15.859229025: 0 968.992 15.882448980: 1.09375 981.992 15.905668934: 0 993.992 15.928888889: 1.14844 997.992 15.952108844: 0 999.992 15.975328798: 1.19531 1002.99 15.998548753: 0 1005.99 16.021768707: 1.24219 1005.99 16.044988662: 0 1007.99 16.068208617: 1.29688 1007.99 16.091428571: 0 1007 16.114648526: 1.34375 1011.99 16.137868481: 0 1014.99 16.161088435: 1.39062 1015.99 16.184308390: 0 1015 16.207528345: 1.44531 1015.99 16.230748299: 0 1015.99 16.253968254: 1.49219 1017.99 16.277188209: 0 1016 16.300408163: 1.53906 1016.99 16.323628118: 0 1015.99 16.346848073: 1.59375 1015.99 16.370068027: 0 1016 16.393287982: 1.64062 1016 16.416507937: 0 1016.99 16.439727891: 1.6875 1016.99 16.462947846: 0 1017 16.486167800: 1.74219 1017.99 16.509387755: 0 1016.99 16.532607710: 1.78906 1016.99 16.555827664: 0 1017.99 16.579047619: 1.83594 1017 16.602267574: 0 1016.99 16.625487528: 1.89062 1016.99 16.648707483: 0 1017.99 16.671927438: 1.9375 1016.99 16.695147392: 0 1015.99 16.718367347: 0 507 16.741587302: 0 0 16.764807256: 1.04688 482 16.788027211: 0 968.992 16.811247166: 1.09375 981.992 16.834467120: 0 993.992 16.857687075: 1.14844 997.992 16.880907029: 0 999.992 16.904126984: 1.19531 1002.99 16.927346939: 0 1005.99 16.950566893: 1.24219 1005.99 16.973786848: 0 1007.99 16.997006803: 1.29688 1007.99 17.020226757: 0 1007 17.043446712: 1.34375 1011.99 17.066666667: 0 1014.99 17.089886621: 1.39062 1015.99 17.113106576: 0 1015 17.136326531: 1.44531 1015.99 17.159546485: 0 1015.99 17.182766440: 1.49219 1017.99 17.205986395: 0 1016 17.229206349: 1.53906 1016.99 17.252426304: 0 1015.99 17.275646259: 1.59375 1015.99 17.298866213: 0 1016 17.322086168: 1.64062 1016 17.345306122: 0 1016.99 17.368526077: 1.6875 1016.99 17.391746032: 0 1017 17.414965986: 1.74219 1017.99 17.438185941: 0 1016.99 17.461405896: 1.78906 1016.99 17.484625850: 0 1017.99 17.507845805: 1.83594 1017 17.531065760: 0 1016.99 17.554285714: 1.89062 1016.99 17.577505669: 0 1017.99 17.600725624: 1.9375 1016.99 17.623945578: 0 1015.99 17.647165533: 0 507 17.670385488: 0 0 17.693605442: 1.04688 482 17.716825397: 0 968.992 17.740045351: 1.09375 981.992 17.763265306: 0 993.992 17.786485261: 1.14844 997.992 17.809705215: 0 999.992 17.832925170: 1.19531 1002.99 17.856145125: 0 1005.99 17.879365079: 1.24219 1005.99 17.902585034: 0 1007.99 17.925804989: 1.29688 1007.99 17.949024943: 0 1007 17.972244898: 1.34375 1011.99 17.995464853: 0 1014.99 18.018684807: 1.39062 1015.99 18.041904762: 0 1015 18.065124717: 1.44531 1015.99 18.088344671: 0 1015.99 18.111564626: 1.49219 1017.99 18.134784580: 0 1016 18.158004535: 1.53906 1016.99 18.181224490: 0 1015.99 18.204444444: 1.59375 1015.99 18.227664399: 0 1016 18.250884354: 1.64062 1016 18.274104308: 0 1016.99 18.297324263: 1.6875 1016.99 18.320544218: 0 1017 18.343764172: 1.74219 1017.99 18.366984127: 0 1016.99 18.390204082: 1.78906 1016.99 18.413424036: 0 1017.99 18.436643991: 1.83594 1017 18.459863946: 0 1016.99 18.483083900: 1.89062 1016.99 18.506303855: 0 1017.99 18.529523810: 1.9375 1016.99 18.552743764: 0 1015.99 18.575963719: 0 507 18.599183673: 0 0 18.622403628: 1.04688 482 18.645623583: 0 968.992 18.668843537: 1.09375 981.992 18.692063492: 0 993.992 18.715283447: 1.14844 997.992 18.738503401: 0 999.992 18.761723356: 1.19531 1002.99 18.784943311: 0 1005.99 18.808163265: 1.24219 1005.99 18.831383220: 0 1007.99 18.854603175: 1.29688 1007.99 18.877823129: 0 1007 18.901043084: 1.34375 1011.99 18.924263039: 0 1014.99 18.947482993: 1.39062 1015.99 18.970702948: 0 1015 18.993922902: 1.44531 1015.99 19.017142857: 0 1015.99 19.040362812: 1.49219 1017.99 19.063582766: 0 1016 19.086802721: 1.53906 1016.99 19.110022676: 0 1015.99 19.133242630: 1.59375 1015.99 19.156462585: 0 1016 19.179682540: 1.64062 1016 19.202902494: 0 1016.99 19.226122449: 1.6875 1016.99 19.249342404: 0 1017 19.272562358: 1.74219 1017.99 19.295782313: 0 1016.99 19.319002268: 1.78906 1016.99 19.342222222: 0 1017.99 19.365442177: 1.83594 1017 19.388662132: 0 1016.99 19.411882086: 1.89062 1016.99 19.435102041: 0 1017.99 19.458321995: 1.9375 1016.99 19.481541950: 0 1015.99 19.504761905: 0 507 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_input-timestamp.txt0000644000000000000000000004445613111512442031077 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:input-timestamp 0.023219955: 512 0.046439909: 1024 0.069659864: 1536 0.092879819: 2048 0.116099773: 2560 0.139319728: 3072 0.162539683: 3584 0.185759637: 4096 0.208979592: 4608 0.232199546: 5120 0.255419501: 5632 0.278639456: 6144 0.301859410: 6656 0.325079365: 7168 0.348299320: 7680 0.371519274: 8192 0.394739229: 8704 0.417959184: 9216 0.441179138: 9728 0.464399093: 10240 0.487619048: 10752 0.510839002: 11264 0.534058957: 11776 0.557278912: 12288 0.580498866: 12800 0.603718821: 13312 0.626938776: 13824 0.650158730: 14336 0.673378685: 14848 0.696598639: 15360 0.719818594: 15872 0.743038549: 16384 0.766258503: 16896 0.789478458: 17408 0.812698413: 17920 0.835918367: 18432 0.859138322: 18944 0.882358277: 19456 0.905578231: 19968 0.928798186: 20480 0.952018141: 20992 0.975238095: 21504 0.998458050: 22016 1.021678005: 22528 1.044897959: 23040 1.068117914: 23552 1.091337868: 24064 1.114557823: 24576 1.137777778: 25088 1.160997732: 25600 1.184217687: 26112 1.207437642: 26624 1.230657596: 27136 1.253877551: 27648 1.277097506: 28160 1.300317460: 28672 1.323537415: 29184 1.346757370: 29696 1.369977324: 30208 1.393197279: 30720 1.416417234: 31232 1.439637188: 31744 1.462857143: 32256 1.486077098: 32768 1.509297052: 33280 1.532517007: 33792 1.555736961: 34304 1.578956916: 34816 1.602176871: 35328 1.625396825: 35840 1.648616780: 36352 1.671836735: 36864 1.695056689: 37376 1.718276644: 37888 1.741496599: 38400 1.764716553: 38912 1.787936508: 39424 1.811156463: 39936 1.834376417: 40448 1.857596372: 40960 1.880816327: 41472 1.904036281: 41984 1.927256236: 42496 1.950476190: 43008 1.973696145: 43520 1.996916100: 44032 2.020136054: 44544 2.043356009: 45056 2.066575964: 45568 2.089795918: 46080 2.113015873: 46592 2.136235828: 47104 2.159455782: 47616 2.182675737: 48128 2.205895692: 48640 2.229115646: 49152 2.252335601: 49664 2.275555556: 50176 2.298775510: 50688 2.321995465: 51200 2.345215420: 51712 2.368435374: 52224 2.391655329: 52736 2.414875283: 53248 2.438095238: 53760 2.461315193: 54272 2.484535147: 54784 2.507755102: 55296 2.530975057: 55808 2.554195011: 56320 2.577414966: 56832 2.600634921: 57344 2.623854875: 57856 2.647074830: 58368 2.670294785: 58880 2.693514739: 59392 2.716734694: 59904 2.739954649: 60416 2.763174603: 60928 2.786394558: 61440 2.809614512: 61952 2.832834467: 62464 2.856054422: 62976 2.879274376: 63488 2.902494331: 64000 2.925714286: 64512 2.948934240: 65024 2.972154195: 65536 2.995374150: 66048 3.018594104: 66560 3.041814059: 67072 3.065034014: 67584 3.088253968: 68096 3.111473923: 68608 3.134693878: 69120 3.157913832: 69632 3.181133787: 70144 3.204353741: 70656 3.227573696: 71168 3.250793651: 71680 3.274013605: 72192 3.297233560: 72704 3.320453515: 73216 3.343673469: 73728 3.366893424: 74240 3.390113379: 74752 3.413333333: 75264 3.436553288: 75776 3.459773243: 76288 3.482993197: 76800 3.506213152: 77312 3.529433107: 77824 3.552653061: 78336 3.575873016: 78848 3.599092971: 79360 3.622312925: 79872 3.645532880: 80384 3.668752834: 80896 3.691972789: 81408 3.715192744: 81920 3.738412698: 82432 3.761632653: 82944 3.784852608: 83456 3.808072562: 83968 3.831292517: 84480 3.854512472: 84992 3.877732426: 85504 3.900952381: 86016 3.924172336: 86528 3.947392290: 87040 3.970612245: 87552 3.993832200: 88064 4.017052154: 88576 4.040272109: 89088 4.063492063: 89600 4.086712018: 90112 4.109931973: 90624 4.133151927: 91136 4.156371882: 91648 4.179591837: 92160 4.202811791: 92672 4.226031746: 93184 4.249251701: 93696 4.272471655: 94208 4.295691610: 94720 4.318911565: 95232 4.342131519: 95744 4.365351474: 96256 4.388571429: 96768 4.411791383: 97280 4.435011338: 97792 4.458231293: 98304 4.481451247: 98816 4.504671202: 99328 4.527891156: 99840 4.551111111: 100352 4.574331066: 100864 4.597551020: 101376 4.620770975: 101888 4.643990930: 102400 4.667210884: 102912 4.690430839: 103424 4.713650794: 103936 4.736870748: 104448 4.760090703: 104960 4.783310658: 105472 4.806530612: 105984 4.829750567: 106496 4.852970522: 107008 4.876190476: 107520 4.899410431: 108032 4.922630385: 108544 4.945850340: 109056 4.969070295: 109568 4.992290249: 110080 5.015510204: 110592 5.038730159: 111104 5.061950113: 111616 5.085170068: 112128 5.108390023: 112640 5.131609977: 113152 5.154829932: 113664 5.178049887: 114176 5.201269841: 114688 5.224489796: 115200 5.247709751: 115712 5.270929705: 116224 5.294149660: 116736 5.317369615: 117248 5.340589569: 117760 5.363809524: 118272 5.387029478: 118784 5.410249433: 119296 5.433469388: 119808 5.456689342: 120320 5.479909297: 120832 5.503129252: 121344 5.526349206: 121856 5.549569161: 122368 5.572789116: 122880 5.596009070: 123392 5.619229025: 123904 5.642448980: 124416 5.665668934: 124928 5.688888889: 125440 5.712108844: 125952 5.735328798: 126464 5.758548753: 126976 5.781768707: 127488 5.804988662: 128000 5.828208617: 128512 5.851428571: 129024 5.874648526: 129536 5.897868481: 130048 5.921088435: 130560 5.944308390: 131072 5.967528345: 131584 5.990748299: 132096 6.013968254: 132608 6.037188209: 133120 6.060408163: 133632 6.083628118: 134144 6.106848073: 134656 6.130068027: 135168 6.153287982: 135680 6.176507937: 136192 6.199727891: 136704 6.222947846: 137216 6.246167800: 137728 6.269387755: 138240 6.292607710: 138752 6.315827664: 139264 6.339047619: 139776 6.362267574: 140288 6.385487528: 140800 6.408707483: 141312 6.431927438: 141824 6.455147392: 142336 6.478367347: 142848 6.501587302: 143360 6.524807256: 143872 6.548027211: 144384 6.571247166: 144896 6.594467120: 145408 6.617687075: 145920 6.640907029: 146432 6.664126984: 146944 6.687346939: 147456 6.710566893: 147968 6.733786848: 148480 6.757006803: 148992 6.780226757: 149504 6.803446712: 150016 6.826666667: 150528 6.849886621: 151040 6.873106576: 151552 6.896326531: 152064 6.919546485: 152576 6.942766440: 153088 6.965986395: 153600 6.989206349: 154112 7.012426304: 154624 7.035646259: 155136 7.058866213: 155648 7.082086168: 156160 7.105306122: 156672 7.128526077: 157184 7.151746032: 157696 7.174965986: 158208 7.198185941: 158720 7.221405896: 159232 7.244625850: 159744 7.267845805: 160256 7.291065760: 160768 7.314285714: 161280 7.337505669: 161792 7.360725624: 162304 7.383945578: 162816 7.407165533: 163328 7.430385488: 163840 7.453605442: 164352 7.476825397: 164864 7.500045351: 165376 7.523265306: 165888 7.546485261: 166400 7.569705215: 166912 7.592925170: 167424 7.616145125: 167936 7.639365079: 168448 7.662585034: 168960 7.685804989: 169472 7.709024943: 169984 7.732244898: 170496 7.755464853: 171008 7.778684807: 171520 7.801904762: 172032 7.825124717: 172544 7.848344671: 173056 7.871564626: 173568 7.894784580: 174080 7.918004535: 174592 7.941224490: 175104 7.964444444: 175616 7.987664399: 176128 8.010884354: 176640 8.034104308: 177152 8.057324263: 177664 8.080544218: 178176 8.103764172: 178688 8.126984127: 179200 8.150204082: 179712 8.173424036: 180224 8.196643991: 180736 8.219863946: 181248 8.243083900: 181760 8.266303855: 182272 8.289523810: 182784 8.312743764: 183296 8.335963719: 183808 8.359183673: 184320 8.382403628: 184832 8.405623583: 185344 8.428843537: 185856 8.452063492: 186368 8.475283447: 186880 8.498503401: 187392 8.521723356: 187904 8.544943311: 188416 8.568163265: 188928 8.591383220: 189440 8.614603175: 189952 8.637823129: 190464 8.661043084: 190976 8.684263039: 191488 8.707482993: 192000 8.730702948: 192512 8.753922902: 193024 8.777142857: 193536 8.800362812: 194048 8.823582766: 194560 8.846802721: 195072 8.870022676: 195584 8.893242630: 196096 8.916462585: 196608 8.939682540: 197120 8.962902494: 197632 8.986122449: 198144 9.009342404: 198656 9.032562358: 199168 9.055782313: 199680 9.079002268: 200192 9.102222222: 200704 9.125442177: 201216 9.148662132: 201728 9.171882086: 202240 9.195102041: 202752 9.218321995: 203264 9.241541950: 203776 9.264761905: 204288 9.287981859: 204800 9.311201814: 205312 9.334421769: 205824 9.357641723: 206336 9.380861678: 206848 9.404081633: 207360 9.427301587: 207872 9.450521542: 208384 9.473741497: 208896 9.496961451: 209408 9.520181406: 209920 9.543401361: 210432 9.566621315: 210944 9.589841270: 211456 9.613061224: 211968 9.636281179: 212480 9.659501134: 212992 9.682721088: 213504 9.705941043: 214016 9.729160998: 214528 9.752380952: 215040 9.775600907: 215552 9.798820862: 216064 9.822040816: 216576 9.845260771: 217088 9.868480726: 217600 9.891700680: 218112 9.914920635: 218624 9.938140590: 219136 9.961360544: 219648 9.984580499: 220160 10.007800454: 220672 10.031020408: 221184 10.054240363: 221696 10.077460317: 222208 10.100680272: 222720 10.123900227: 223232 10.147120181: 223744 10.170340136: 224256 10.193560091: 224768 10.216780045: 225280 10.240000000: 225792 10.263219955: 226304 10.286439909: 226816 10.309659864: 227328 10.332879819: 227840 10.356099773: 228352 10.379319728: 228864 10.402539683: 229376 10.425759637: 229888 10.448979592: 230400 10.472199546: 230912 10.495419501: 231424 10.518639456: 231936 10.541859410: 232448 10.565079365: 232960 10.588299320: 233472 10.611519274: 233984 10.634739229: 234496 10.657959184: 235008 10.681179138: 235520 10.704399093: 236032 10.727619048: 236544 10.750839002: 237056 10.774058957: 237568 10.797278912: 238080 10.820498866: 238592 10.843718821: 239104 10.866938776: 239616 10.890158730: 240128 10.913378685: 240640 10.936598639: 241152 10.959818594: 241664 10.983038549: 242176 11.006258503: 242688 11.029478458: 243200 11.052698413: 243712 11.075918367: 244224 11.099138322: 244736 11.122358277: 245248 11.145578231: 245760 11.168798186: 246272 11.192018141: 246784 11.215238095: 247296 11.238458050: 247808 11.261678005: 248320 11.284897959: 248832 11.308117914: 249344 11.331337868: 249856 11.354557823: 250368 11.377777778: 250880 11.400997732: 251392 11.424217687: 251904 11.447437642: 252416 11.470657596: 252928 11.493877551: 253440 11.517097506: 253952 11.540317460: 254464 11.563537415: 254976 11.586757370: 255488 11.609977324: 256000 11.633197279: 256512 11.656417234: 257024 11.679637188: 257536 11.702857143: 258048 11.726077098: 258560 11.749297052: 259072 11.772517007: 259584 11.795736961: 260096 11.818956916: 260608 11.842176871: 261120 11.865396825: 261632 11.888616780: 262144 11.911836735: 262656 11.935056689: 263168 11.958276644: 263680 11.981496599: 264192 12.004716553: 264704 12.027936508: 265216 12.051156463: 265728 12.074376417: 266240 12.097596372: 266752 12.120816327: 267264 12.144036281: 267776 12.167256236: 268288 12.190476190: 268800 12.213696145: 269312 12.236916100: 269824 12.260136054: 270336 12.283356009: 270848 12.306575964: 271360 12.329795918: 271872 12.353015873: 272384 12.376235828: 272896 12.399455782: 273408 12.422675737: 273920 12.445895692: 274432 12.469115646: 274944 12.492335601: 275456 12.515555556: 275968 12.538775510: 276480 12.561995465: 276992 12.585215420: 277504 12.608435374: 278016 12.631655329: 278528 12.654875283: 279040 12.678095238: 279552 12.701315193: 280064 12.724535147: 280576 12.747755102: 281088 12.770975057: 281600 12.794195011: 282112 12.817414966: 282624 12.840634921: 283136 12.863854875: 283648 12.887074830: 284160 12.910294785: 284672 12.933514739: 285184 12.956734694: 285696 12.979954649: 286208 13.003174603: 286720 13.026394558: 287232 13.049614512: 287744 13.072834467: 288256 13.096054422: 288768 13.119274376: 289280 13.142494331: 289792 13.165714286: 290304 13.188934240: 290816 13.212154195: 291328 13.235374150: 291840 13.258594104: 292352 13.281814059: 292864 13.305034014: 293376 13.328253968: 293888 13.351473923: 294400 13.374693878: 294912 13.397913832: 295424 13.421133787: 295936 13.444353741: 296448 13.467573696: 296960 13.490793651: 297472 13.514013605: 297984 13.537233560: 298496 13.560453515: 299008 13.583673469: 299520 13.606893424: 300032 13.630113379: 300544 13.653333333: 301056 13.676553288: 301568 13.699773243: 302080 13.722993197: 302592 13.746213152: 303104 13.769433107: 303616 13.792653061: 304128 13.815873016: 304640 13.839092971: 305152 13.862312925: 305664 13.885532880: 306176 13.908752834: 306688 13.931972789: 307200 13.955192744: 307712 13.978412698: 308224 14.001632653: 308736 14.024852608: 309248 14.048072562: 309760 14.071292517: 310272 14.094512472: 310784 14.117732426: 311296 14.140952381: 311808 14.164172336: 312320 14.187392290: 312832 14.210612245: 313344 14.233832200: 313856 14.257052154: 314368 14.280272109: 314880 14.303492063: 315392 14.326712018: 315904 14.349931973: 316416 14.373151927: 316928 14.396371882: 317440 14.419591837: 317952 14.442811791: 318464 14.466031746: 318976 14.489251701: 319488 14.512471655: 320000 14.535691610: 320512 14.558911565: 321024 14.582131519: 321536 14.605351474: 322048 14.628571429: 322560 14.651791383: 323072 14.675011338: 323584 14.698231293: 324096 14.721451247: 324608 14.744671202: 325120 14.767891156: 325632 14.791111111: 326144 14.814331066: 326656 14.837551020: 327168 14.860770975: 327680 14.883990930: 328192 14.907210884: 328704 14.930430839: 329216 14.953650794: 329728 14.976870748: 330240 15.000090703: 330752 15.023310658: 331264 15.046530612: 331776 15.069750567: 332288 15.092970522: 332800 15.116190476: 333312 15.139410431: 333824 15.162630385: 334336 15.185850340: 334848 15.209070295: 335360 15.232290249: 335872 15.255510204: 336384 15.278730159: 336896 15.301950113: 337408 15.325170068: 337920 15.348390023: 338432 15.371609977: 338944 15.394829932: 339456 15.418049887: 339968 15.441269841: 340480 15.464489796: 340992 15.487709751: 341504 15.510929705: 342016 15.534149660: 342528 15.557369615: 343040 15.580589569: 343552 15.603809524: 344064 15.627029478: 344576 15.650249433: 345088 15.673469388: 345600 15.696689342: 346112 15.719909297: 346624 15.743129252: 347136 15.766349206: 347648 15.789569161: 348160 15.812789116: 348672 15.836009070: 349184 15.859229025: 349696 15.882448980: 350208 15.905668934: 350720 15.928888889: 351232 15.952108844: 351744 15.975328798: 352256 15.998548753: 352768 16.021768707: 353280 16.044988662: 353792 16.068208617: 354304 16.091428571: 354816 16.114648526: 355328 16.137868481: 355840 16.161088435: 356352 16.184308390: 356864 16.207528345: 357376 16.230748299: 357888 16.253968254: 358400 16.277188209: 358912 16.300408163: 359424 16.323628118: 359936 16.346848073: 360448 16.370068027: 360960 16.393287982: 361472 16.416507937: 361984 16.439727891: 362496 16.462947846: 363008 16.486167800: 363520 16.509387755: 364032 16.532607710: 364544 16.555827664: 365056 16.579047619: 365568 16.602267574: 366080 16.625487528: 366592 16.648707483: 367104 16.671927438: 367616 16.695147392: 368128 16.718367347: 368640 16.741587302: 369152 16.764807256: 369664 16.788027211: 370176 16.811247166: 370688 16.834467120: 371200 16.857687075: 371712 16.880907029: 372224 16.904126984: 372736 16.927346939: 373248 16.950566893: 373760 16.973786848: 374272 16.997006803: 374784 17.020226757: 375296 17.043446712: 375808 17.066666667: 376320 17.089886621: 376832 17.113106576: 377344 17.136326531: 377856 17.159546485: 378368 17.182766440: 378880 17.205986395: 379392 17.229206349: 379904 17.252426304: 380416 17.275646259: 380928 17.298866213: 381440 17.322086168: 381952 17.345306122: 382464 17.368526077: 382976 17.391746032: 383488 17.414965986: 384000 17.438185941: 384512 17.461405896: 385024 17.484625850: 385536 17.507845805: 386048 17.531065760: 386560 17.554285714: 387072 17.577505669: 387584 17.600725624: 388096 17.623945578: 388608 17.647165533: 389120 17.670385488: 389632 17.693605442: 390144 17.716825397: 390656 17.740045351: 391168 17.763265306: 391680 17.786485261: 392192 17.809705215: 392704 17.832925170: 393216 17.856145125: 393728 17.879365079: 394240 17.902585034: 394752 17.925804989: 395264 17.949024943: 395776 17.972244898: 396288 17.995464853: 396800 18.018684807: 397312 18.041904762: 397824 18.065124717: 398336 18.088344671: 398848 18.111564626: 399360 18.134784580: 399872 18.158004535: 400384 18.181224490: 400896 18.204444444: 401408 18.227664399: 401920 18.250884354: 402432 18.274104308: 402944 18.297324263: 403456 18.320544218: 403968 18.343764172: 404480 18.366984127: 404992 18.390204082: 405504 18.413424036: 406016 18.436643991: 406528 18.459863946: 407040 18.483083900: 407552 18.506303855: 408064 18.529523810: 408576 18.552743764: 409088 18.575963719: 409600 18.599183673: 410112 18.622403628: 410624 18.645623583: 411136 18.668843537: 411648 18.692063492: 412160 18.715283447: 412672 18.738503401: 413184 18.761723356: 413696 18.784943311: 414208 18.808163265: 414720 18.831383220: 415232 18.854603175: 415744 18.877823129: 416256 18.901043084: 416768 18.924263039: 417280 18.947482993: 417792 18.970702948: 418304 18.993922902: 418816 19.017142857: 419328 19.040362812: 419840 19.063582766: 420352 19.086802721: 420864 19.110022676: 421376 19.133242630: 421888 19.156462585: 422400 19.179682540: 422912 19.202902494: 423424 19.226122449: 423936 19.249342404: 424448 19.272562358: 424960 19.295782313: 425472 19.319002268: 425984 19.342222222: 426496 19.365442177: 427008 19.388662132: 427520 19.411882086: 428032 19.435102041: 428544 19.458321995: 429056 19.481541950: 429568 19.504761905: 430080 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_instants.txt0000644000000000000000000000047013111512442027566 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:instants 1.500000000: 2 of 10 at 1.5 3.000000000: 3 of 10 at 3 4.500000000: 4 of 10 at 4.5 6.000000000: 5 of 10 at 6 7.500000000: 6 of 10 at 7.5 9.000000000: 7 of 10 at 9 10.500000000: 8 of 10 at 10.5 12.000000000: 9 of 10 at 12 13.500000000: 10 of 10 at 13.5 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin-freq_notes-regions.txt0000644000000000000000000000111013111512442030507 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin-freq:notes-regions 1.000000000, 0.500000000: 0.1 2 of 10: 0.1 at 1 dur. 0.5 2.000000000, 1.750000000: 0.2 3 of 10: 0.2 at 2 dur. 1.75 3.000000000, 0.500000000: 0.3 4 of 10: 0.3 at 3 dur. 0.5 4.000000000, 1.750000000: 0.4 5 of 10: 0.4 at 4 dur. 1.75 5.000000000, 0.500000000: 0.5 6 of 10: 0.5 at 5 dur. 0.5 6.000000000, 1.750000000: 0.6 7 of 10: 0.6 at 6 dur. 1.75 7.000000000, 0.500000000: 0.7 8 of 10: 0.7 at 7 dur. 0.5 8.000000000, 1.750000000: 0.8 9 of 10: 0.8 at 8 dur. 1.75 9.000000000, 0.500000000: 0.9 10 of 10: 0.9 at 9 dur. 0.5 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_curve-fsr-mixed.txt0000644000000000000000000000077613111512442030021 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:curve-fsr-mixed 2.400000000: 0 1 of 10: 0 at 2.4 snap to 2.4 2.800000000: 0.1 2 of 10: 0.1 at 2.9 snap to 2.8 3.200000000: 0.2 3 of 10: 0.2 at 3.14 snap to 3.2 3.600000000: 0.3 4 of 10: 0.3 at 3.5 snap to 3.6 4.000000000: 0.4 5 of 10: 0.4 at 4 4.400000000: 0.5 6 of 10: 0.5 at 4.4 4.000000000: 0.6 7 of 10: 0.6 at 3.9 snap to 4 4.400000000: 0.7 8 of 10: 0.7 at 4.4 snap to 4.4 4.800000000: 0.8 9 of 10: 0.8 at 4.8 5.200000000: 0.9 10 of 10: 0.9 at 5 snap to 5.2 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_curve-fsr-timed.txt0000644000000000000000000000102313111512442027777 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:curve-fsr-timed 0.000000000: 0 1 of 10: 0 at 0 snap to 0 0.000000000: 0.1 2 of 10: 0.1 at 0 snap to 0 0.000000000: 0.2 3 of 10: 0.2 at 0.166 snap to 0 0.400000000: 0.3 4 of 10: 0.3 at 0.333 snap to 0.4 2.000000000: 0.4 5 of 10: 0.4 at 2 snap to 2 2.000000000: 0.5 6 of 10: 0.5 at 2 snap to 2 2.000000000: 0.6 7 of 10: 0.6 at 2.166 snap to 2 2.400000000: 0.7 8 of 10: 0.7 at 2.333 snap to 2.4 4.000000000: 0.8 9 of 10: 0.8 at 4 snap to 4 4.000000000: 0.9 10 of 10: 0.9 at 4 snap to 4 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_curve-fsr.txt0000644000000000000000000000064513111512442026710 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:curve-fsr 0.000000000: 0 1 of 10: 0 at 0 0.400000000: 0.1 2 of 10: 0.1 at 0.4 0.800000000: 0.2 3 of 10: 0.2 at 0.8 1.200000000: 0.3 4 of 10: 0.3 at 1.2 1.600000000: 0.4 5 of 10: 0.4 at 1.6 2.000000000: 0.5 6 of 10: 0.5 at 2 2.400000000: 0.6 7 of 10: 0.6 at 2.4 2.800000000: 0.7 8 of 10: 0.7 at 2.8 3.200000000: 0.8 9 of 10: 0.8 at 3.2 3.600000000: 0.9 10 of 10: 0.9 at 3.6 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_curve-oss.txt0000644000000000000000000000154513111512442026722 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:curve-oss 0.000000000: 0 1 of 20: 0 at 0 0.046439909: 0.05 2 of 20: 0.05 at 0.046 0.092879819: 0.1 3 of 20: 0.1 at 0.092 0.139319728: 0.15 4 of 20: 0.15 at 0.139 0.185759637: 0.2 5 of 20: 0.2 at 0.185 0.232199546: 0.25 6 of 20: 0.25 at 0.232 0.278639456: 0.3 7 of 20: 0.3 at 0.278 0.325079365: 0.35 8 of 20: 0.35 at 0.325 0.371519274: 0.4 9 of 20: 0.4 at 0.371 0.417959184: 0.45 10 of 20: 0.45 at 0.417 0.464399093: 0.5 11 of 20: 0.5 at 0.464 0.510839002: 0.55 12 of 20: 0.55 at 0.51 0.557278912: 0.6 13 of 20: 0.6 at 0.557 0.603718821: 0.65 14 of 20: 0.65 at 0.603 0.650158730: 0.7 15 of 20: 0.7 at 0.65 0.696598639: 0.75 16 of 20: 0.75 at 0.696 0.743038549: 0.8 17 of 20: 0.8 at 0.743 0.789478458: 0.85 18 of 20: 0.85 at 0.789 0.835918367: 0.9 19 of 20: 0.9 at 0.835 0.882358277: 0.95 20 of 20: 0.95 at 0.882 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_curve-vsr.txt0000644000000000000000000000065013111512442026724 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:curve-vsr 0.000000000: 0 1 of 10: 0 at 0 0.750000000: 0.1 2 of 10: 0.1 at 0.75 1.500000000: 0.2 3 of 10: 0.2 at 1.5 2.250000000: 0.3 4 of 10: 0.3 at 2.25 3.000000000: 0.4 5 of 10: 0.4 at 3 3.750000000: 0.5 6 of 10: 0.5 at 3.75 4.500000000: 0.6 7 of 10: 0.6 at 4.5 5.250000000: 0.7 8 of 10: 0.7 at 5.25 6.000000000: 0.8 9 of 10: 0.8 at 6 6.750000000: 0.9 10 of 10: 0.9 at 6.75 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_grid-fsr.txt0000644000000000000000000000141613111512442026506 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:grid-fsr 0.000000000: 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 1 of 10 at 0 0.400000000: 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 2 of 10 at 0.4 0.800000000: 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 3 of 10 at 0.8 1.200000000: 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 4 of 10 at 1.2 1.600000000: 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 5 of 10 at 1.6 2.000000000: 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 6 of 10 at 2 2.400000000: 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 7 of 10 at 2.4 2.800000000: 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 8 of 10 at 2.8 3.200000000: 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 9 of 10 at 3.2 3.600000000: 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1 10 of 10 at 3.6 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_grid-oss.txt0000644000000000000000000000413013111512442026514 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:grid-oss 0.000000000: 0.0666667 0.1 0.133333 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 1 of 20 at 0 0.046439909: 0.1 0.133333 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 2 of 20 at 0.046 0.092879819: 0.133333 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 3 of 20 at 0.092 0.139319728: 0.166667 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 4 of 20 at 0.139 0.185759637: 0.2 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 5 of 20 at 0.185 0.232199546: 0.233333 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 6 of 20 at 0.232 0.278639456: 0.266667 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 7 of 20 at 0.278 0.325079365: 0.3 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 8 of 20 at 0.325 0.371519274: 0.333333 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 9 of 20 at 0.371 0.417959184: 0.366667 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 10 of 20 at 0.417 0.464399093: 0.4 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 11 of 20 at 0.464 0.510839002: 0.433333 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 12 of 20 at 0.51 0.557278912: 0.466667 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 13 of 20 at 0.557 0.603718821: 0.5 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 14 of 20 at 0.603 0.650158730: 0.533333 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 15 of 20 at 0.65 0.696598639: 0.566667 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 16 of 20 at 0.696 0.743038549: 0.6 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 17 of 20 at 0.743 0.789478458: 0.633333 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 0.933333 18 of 20 at 0.789 0.835918367: 0.666667 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 0.933333 0.966667 19 of 20 at 0.835 0.882358277: 0.7 0.733333 0.766667 0.8 0.833333 0.866667 0.9 0.933333 0.966667 1 20 of 20 at 0.882 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_input-summary.txt0000644000000000000000000003077013111512442027630 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:input-summary 0.000000000: 0 0 0.046439909: 1.04688 972 0.092879819: 1.09375 997.992 0.139319728: 1.14844 1003.99 0.185759637: 1.19531 1010.99 0.232199546: 1.24219 1011.99 0.278639456: 1.29688 1010.99 0.325079365: 1.34375 1019.99 0.371519274: 1.39062 1019.99 0.417959184: 1.44531 1020.99 0.464399093: 1.49219 1019.99 0.510839002: 1.53906 1019.99 0.557278912: 1.59375 1019.99 0.603718821: 1.64062 1019 0.650158730: 1.6875 1019.99 0.696598639: 1.74219 1019.99 0.743038549: 1.78906 1020.99 0.789478458: 1.83594 1019 0.835918367: 1.89062 1020.99 0.882358277: 1.9375 1018.99 0.928798186: 0 0 0.975238095: 1.04688 972 1.021678005: 1.09375 997.992 1.068117914: 1.14844 1003.99 1.114557823: 1.19531 1010.99 1.160997732: 1.24219 1011.99 1.207437642: 1.29688 1010.99 1.253877551: 1.34375 1019.99 1.300317460: 1.39062 1019.99 1.346757370: 1.44531 1020.99 1.393197279: 1.49219 1019.99 1.439637188: 1.53906 1019.99 1.486077098: 1.59375 1019.99 1.532517007: 1.64062 1019 1.578956916: 1.6875 1019.99 1.625396825: 1.74219 1019.99 1.671836735: 1.78906 1020.99 1.718276644: 1.83594 1019 1.764716553: 1.89062 1020.99 1.811156463: 1.9375 1018.99 1.857596372: 0 0 1.904036281: 1.04688 972 1.950476190: 1.09375 997.992 1.996916100: 1.14844 1003.99 2.043356009: 1.19531 1010.99 2.089795918: 1.24219 1011.99 2.136235828: 1.29688 1010.99 2.182675737: 1.34375 1019.99 2.229115646: 1.39062 1019.99 2.275555556: 1.44531 1020.99 2.321995465: 1.49219 1019.99 2.368435374: 1.53906 1019.99 2.414875283: 1.59375 1019.99 2.461315193: 1.64062 1019 2.507755102: 1.6875 1019.99 2.554195011: 1.74219 1019.99 2.600634921: 1.78906 1020.99 2.647074830: 1.83594 1019 2.693514739: 1.89062 1020.99 2.739954649: 1.9375 1018.99 2.786394558: 0 0 2.832834467: 1.04688 972 2.879274376: 1.09375 997.992 2.925714286: 1.14844 1003.99 2.972154195: 1.19531 1010.99 3.018594104: 1.24219 1011.99 3.065034014: 1.29688 1010.99 3.111473923: 1.34375 1019.99 3.157913832: 1.39062 1019.99 3.204353741: 1.44531 1020.99 3.250793651: 1.49219 1019.99 3.297233560: 1.53906 1019.99 3.343673469: 1.59375 1019.99 3.390113379: 1.64062 1019 3.436553288: 1.6875 1019.99 3.482993197: 1.74219 1019.99 3.529433107: 1.78906 1020.99 3.575873016: 1.83594 1019 3.622312925: 1.89062 1020.99 3.668752834: 1.9375 1018.99 3.715192744: 0 0 3.761632653: 1.04688 972 3.808072562: 1.09375 997.992 3.854512472: 1.14844 1003.99 3.900952381: 1.19531 1010.99 3.947392290: 1.24219 1011.99 3.993832200: 1.29688 1010.99 4.040272109: 1.34375 1019.99 4.086712018: 1.39062 1019.99 4.133151927: 1.44531 1020.99 4.179591837: 1.49219 1019.99 4.226031746: 1.53906 1019.99 4.272471655: 1.59375 1019.99 4.318911565: 1.64062 1019 4.365351474: 1.6875 1019.99 4.411791383: 1.74219 1019.99 4.458231293: 1.78906 1020.99 4.504671202: 1.83594 1019 4.551111111: 1.89062 1020.99 4.597551020: 1.9375 1018.99 4.643990930: 0 0 4.690430839: 1.04688 972 4.736870748: 1.09375 997.992 4.783310658: 1.14844 1003.99 4.829750567: 1.19531 1010.99 4.876190476: 1.24219 1011.99 4.922630385: 1.29688 1010.99 4.969070295: 1.34375 1019.99 5.015510204: 1.39062 1019.99 5.061950113: 1.44531 1020.99 5.108390023: 1.49219 1019.99 5.154829932: 1.53906 1019.99 5.201269841: 1.59375 1019.99 5.247709751: 1.64062 1019 5.294149660: 1.6875 1019.99 5.340589569: 1.74219 1019.99 5.387029478: 1.78906 1020.99 5.433469388: 1.83594 1019 5.479909297: 1.89062 1020.99 5.526349206: 1.9375 1018.99 5.572789116: 0 0 5.619229025: 1.04688 972 5.665668934: 1.09375 997.992 5.712108844: 1.14844 1003.99 5.758548753: 1.19531 1010.99 5.804988662: 1.24219 1011.99 5.851428571: 1.29688 1010.99 5.897868481: 1.34375 1019.99 5.944308390: 1.39062 1019.99 5.990748299: 1.44531 1020.99 6.037188209: 1.49219 1019.99 6.083628118: 1.53906 1019.99 6.130068027: 1.59375 1019.99 6.176507937: 1.64062 1019 6.222947846: 1.6875 1019.99 6.269387755: 1.74219 1019.99 6.315827664: 1.78906 1020.99 6.362267574: 1.83594 1019 6.408707483: 1.89062 1020.99 6.455147392: 1.9375 1018.99 6.501587302: 0 0 6.548027211: 1.04688 972 6.594467120: 1.09375 997.992 6.640907029: 1.14844 1003.99 6.687346939: 1.19531 1010.99 6.733786848: 1.24219 1011.99 6.780226757: 1.29688 1010.99 6.826666667: 1.34375 1019.99 6.873106576: 1.39062 1019.99 6.919546485: 1.44531 1020.99 6.965986395: 1.49219 1019.99 7.012426304: 1.53906 1019.99 7.058866213: 1.59375 1019.99 7.105306122: 1.64062 1019 7.151746032: 1.6875 1019.99 7.198185941: 1.74219 1019.99 7.244625850: 1.78906 1020.99 7.291065760: 1.83594 1019 7.337505669: 1.89062 1020.99 7.383945578: 1.9375 1018.99 7.430385488: 0 0 7.476825397: 1.04688 972 7.523265306: 1.09375 997.992 7.569705215: 1.14844 1003.99 7.616145125: 1.19531 1010.99 7.662585034: 1.24219 1011.99 7.709024943: 1.29688 1010.99 7.755464853: 1.34375 1019.99 7.801904762: 1.39062 1019.99 7.848344671: 1.44531 1020.99 7.894784580: 1.49219 1019.99 7.941224490: 1.53906 1019.99 7.987664399: 1.59375 1019.99 8.034104308: 1.64062 1019 8.080544218: 1.6875 1019.99 8.126984127: 1.74219 1019.99 8.173424036: 1.78906 1020.99 8.219863946: 1.83594 1019 8.266303855: 1.89062 1020.99 8.312743764: 1.9375 1018.99 8.359183673: 0 0 8.405623583: 1.04688 972 8.452063492: 1.09375 997.992 8.498503401: 1.14844 1003.99 8.544943311: 1.19531 1010.99 8.591383220: 1.24219 1011.99 8.637823129: 1.29688 1010.99 8.684263039: 1.34375 1019.99 8.730702948: 1.39062 1019.99 8.777142857: 1.44531 1020.99 8.823582766: 1.49219 1019.99 8.870022676: 1.53906 1019.99 8.916462585: 1.59375 1019.99 8.962902494: 1.64062 1019 9.009342404: 1.6875 1019.99 9.055782313: 1.74219 1019.99 9.102222222: 1.78906 1020.99 9.148662132: 1.83594 1019 9.195102041: 1.89062 1020.99 9.241541950: 1.9375 1018.99 9.287981859: 0 0 9.334421769: 1.04688 972 9.380861678: 1.09375 997.992 9.427301587: 1.14844 1003.99 9.473741497: 1.19531 1010.99 9.520181406: 1.24219 1011.99 9.566621315: 1.29688 1010.99 9.613061224: 1.34375 1019.99 9.659501134: 1.39062 1019.99 9.705941043: 1.44531 1020.99 9.752380952: 1.49219 1019.99 9.798820862: 1.53906 1019.99 9.845260771: 1.59375 1019.99 9.891700680: 1.64062 1019 9.938140590: 1.6875 1019.99 9.984580499: 1.74219 1019.99 10.031020408: 1.78906 1020.99 10.077460317: 1.83594 1019 10.123900227: 1.89062 1020.99 10.170340136: 1.9375 1018.99 10.216780045: 0 0 10.263219955: 1.04688 972 10.309659864: 1.09375 997.992 10.356099773: 1.14844 1003.99 10.402539683: 1.19531 1010.99 10.448979592: 1.24219 1011.99 10.495419501: 1.29688 1010.99 10.541859410: 1.34375 1019.99 10.588299320: 1.39062 1019.99 10.634739229: 1.44531 1020.99 10.681179138: 1.49219 1019.99 10.727619048: 1.53906 1019.99 10.774058957: 1.59375 1019.99 10.820498866: 1.64062 1019 10.866938776: 1.6875 1019.99 10.913378685: 1.74219 1019.99 10.959818594: 1.78906 1020.99 11.006258503: 1.83594 1019 11.052698413: 1.89062 1020.99 11.099138322: 1.9375 1018.99 11.145578231: 0 0 11.192018141: 1.04688 972 11.238458050: 1.09375 997.992 11.284897959: 1.14844 1003.99 11.331337868: 1.19531 1010.99 11.377777778: 1.24219 1011.99 11.424217687: 1.29688 1010.99 11.470657596: 1.34375 1019.99 11.517097506: 1.39062 1019.99 11.563537415: 1.44531 1020.99 11.609977324: 1.49219 1019.99 11.656417234: 1.53906 1019.99 11.702857143: 1.59375 1019.99 11.749297052: 1.64062 1019 11.795736961: 1.6875 1019.99 11.842176871: 1.74219 1019.99 11.888616780: 1.78906 1020.99 11.935056689: 1.83594 1019 11.981496599: 1.89062 1020.99 12.027936508: 1.9375 1018.99 12.074376417: 0 0 12.120816327: 1.04688 972 12.167256236: 1.09375 997.992 12.213696145: 1.14844 1003.99 12.260136054: 1.19531 1010.99 12.306575964: 1.24219 1011.99 12.353015873: 1.29688 1010.99 12.399455782: 1.34375 1019.99 12.445895692: 1.39062 1019.99 12.492335601: 1.44531 1020.99 12.538775510: 1.49219 1019.99 12.585215420: 1.53906 1019.99 12.631655329: 1.59375 1019.99 12.678095238: 1.64062 1019 12.724535147: 1.6875 1019.99 12.770975057: 1.74219 1019.99 12.817414966: 1.78906 1020.99 12.863854875: 1.83594 1019 12.910294785: 1.89062 1020.99 12.956734694: 1.9375 1018.99 13.003174603: 0 0 13.049614512: 1.04688 972 13.096054422: 1.09375 997.992 13.142494331: 1.14844 1003.99 13.188934240: 1.19531 1010.99 13.235374150: 1.24219 1011.99 13.281814059: 1.29688 1010.99 13.328253968: 1.34375 1019.99 13.374693878: 1.39062 1019.99 13.421133787: 1.44531 1020.99 13.467573696: 1.49219 1019.99 13.514013605: 1.53906 1019.99 13.560453515: 1.59375 1019.99 13.606893424: 1.64062 1019 13.653333333: 1.6875 1019.99 13.699773243: 1.74219 1019.99 13.746213152: 1.78906 1020.99 13.792653061: 1.83594 1019 13.839092971: 1.89062 1020.99 13.885532880: 1.9375 1018.99 13.931972789: 0 0 13.978412698: 1.04688 972 14.024852608: 1.09375 997.992 14.071292517: 1.14844 1003.99 14.117732426: 1.19531 1010.99 14.164172336: 1.24219 1011.99 14.210612245: 1.29688 1010.99 14.257052154: 1.34375 1019.99 14.303492063: 1.39062 1019.99 14.349931973: 1.44531 1020.99 14.396371882: 1.49219 1019.99 14.442811791: 1.53906 1019.99 14.489251701: 1.59375 1019.99 14.535691610: 1.64062 1019 14.582131519: 1.6875 1019.99 14.628571429: 1.74219 1019.99 14.675011338: 1.78906 1020.99 14.721451247: 1.83594 1019 14.767891156: 1.89062 1020.99 14.814331066: 1.9375 1018.99 14.860770975: 0 0 14.907210884: 1.04688 972 14.953650794: 1.09375 997.992 15.000090703: 1.14844 1003.99 15.046530612: 1.19531 1010.99 15.092970522: 1.24219 1011.99 15.139410431: 1.29688 1010.99 15.185850340: 1.34375 1019.99 15.232290249: 1.39062 1019.99 15.278730159: 1.44531 1020.99 15.325170068: 1.49219 1019.99 15.371609977: 1.53906 1019.99 15.418049887: 1.59375 1019.99 15.464489796: 1.64062 1019 15.510929705: 1.6875 1019.99 15.557369615: 1.74219 1019.99 15.603809524: 1.78906 1020.99 15.650249433: 1.83594 1019 15.696689342: 1.89062 1020.99 15.743129252: 1.9375 1018.99 15.789569161: 0 0 15.836009070: 1.04688 972 15.882448980: 1.09375 997.992 15.928888889: 1.14844 1003.99 15.975328798: 1.19531 1010.99 16.021768707: 1.24219 1011.99 16.068208617: 1.29688 1010.99 16.114648526: 1.34375 1019.99 16.161088435: 1.39062 1019.99 16.207528345: 1.44531 1020.99 16.253968254: 1.49219 1019.99 16.300408163: 1.53906 1019.99 16.346848073: 1.59375 1019.99 16.393287982: 1.64062 1019 16.439727891: 1.6875 1019.99 16.486167800: 1.74219 1019.99 16.532607710: 1.78906 1020.99 16.579047619: 1.83594 1019 16.625487528: 1.89062 1020.99 16.671927438: 1.9375 1018.99 16.718367347: 0 0 16.764807256: 1.04688 972 16.811247166: 1.09375 997.992 16.857687075: 1.14844 1003.99 16.904126984: 1.19531 1010.99 16.950566893: 1.24219 1011.99 16.997006803: 1.29688 1010.99 17.043446712: 1.34375 1019.99 17.089886621: 1.39062 1019.99 17.136326531: 1.44531 1020.99 17.182766440: 1.49219 1019.99 17.229206349: 1.53906 1019.99 17.275646259: 1.59375 1019.99 17.322086168: 1.64062 1019 17.368526077: 1.6875 1019.99 17.414965986: 1.74219 1019.99 17.461405896: 1.78906 1020.99 17.507845805: 1.83594 1019 17.554285714: 1.89062 1020.99 17.600725624: 1.9375 1018.99 17.647165533: 0 0 17.693605442: 1.04688 972 17.740045351: 1.09375 997.992 17.786485261: 1.14844 1003.99 17.832925170: 1.19531 1010.99 17.879365079: 1.24219 1011.99 17.925804989: 1.29688 1010.99 17.972244898: 1.34375 1019.99 18.018684807: 1.39062 1019.99 18.065124717: 1.44531 1020.99 18.111564626: 1.49219 1019.99 18.158004535: 1.53906 1019.99 18.204444444: 1.59375 1019.99 18.250884354: 1.64062 1019 18.297324263: 1.6875 1019.99 18.343764172: 1.74219 1019.99 18.390204082: 1.78906 1020.99 18.436643991: 1.83594 1019 18.483083900: 1.89062 1020.99 18.529523810: 1.9375 1018.99 18.575963719: 0 0 18.622403628: 1.04688 972 18.668843537: 1.09375 997.992 18.715283447: 1.14844 1003.99 18.761723356: 1.19531 1010.99 18.808163265: 1.24219 1011.99 18.854603175: 1.29688 1010.99 18.901043084: 1.34375 1019.99 18.947482993: 1.39062 1019.99 18.993922902: 1.44531 1020.99 19.040362812: 1.49219 1019.99 19.086802721: 1.53906 1019.99 19.133242630: 1.59375 1019.99 19.179682540: 1.64062 1019 19.226122449: 1.6875 1019.99 19.272562358: 1.74219 1019.99 19.319002268: 1.78906 1020.99 19.365442177: 1.83594 1019 19.411882086: 1.89062 1020.99 19.458321995: 1.9375 1018.99 19.504761905: 0 0 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_input-timestamp.txt0000644000000000000000000002230213111512442030126 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:input-timestamp 0.000000000: 0 0.046439909: 1024 0.092879819: 2048 0.139319728: 3072 0.185759637: 4096 0.232199546: 5120 0.278639456: 6144 0.325079365: 7168 0.371519274: 8192 0.417959184: 9216 0.464399093: 10240 0.510839002: 11264 0.557278912: 12288 0.603718821: 13312 0.650158730: 14336 0.696598639: 15360 0.743038549: 16384 0.789478458: 17408 0.835918367: 18432 0.882358277: 19456 0.928798186: 20480 0.975238095: 21504 1.021678005: 22528 1.068117914: 23552 1.114557823: 24576 1.160997732: 25600 1.207437642: 26624 1.253877551: 27648 1.300317460: 28672 1.346757370: 29696 1.393197279: 30720 1.439637188: 31744 1.486077098: 32768 1.532517007: 33792 1.578956916: 34816 1.625396825: 35840 1.671836735: 36864 1.718276644: 37888 1.764716553: 38912 1.811156463: 39936 1.857596372: 40960 1.904036281: 41984 1.950476190: 43008 1.996916100: 44032 2.043356009: 45056 2.089795918: 46080 2.136235828: 47104 2.182675737: 48128 2.229115646: 49152 2.275555556: 50176 2.321995465: 51200 2.368435374: 52224 2.414875283: 53248 2.461315193: 54272 2.507755102: 55296 2.554195011: 56320 2.600634921: 57344 2.647074830: 58368 2.693514739: 59392 2.739954649: 60416 2.786394558: 61440 2.832834467: 62464 2.879274376: 63488 2.925714286: 64512 2.972154195: 65536 3.018594104: 66560 3.065034014: 67584 3.111473923: 68608 3.157913832: 69632 3.204353741: 70656 3.250793651: 71680 3.297233560: 72704 3.343673469: 73728 3.390113379: 74752 3.436553288: 75776 3.482993197: 76800 3.529433107: 77824 3.575873016: 78848 3.622312925: 79872 3.668752834: 80896 3.715192744: 81920 3.761632653: 82944 3.808072562: 83968 3.854512472: 84992 3.900952381: 86016 3.947392290: 87040 3.993832200: 88064 4.040272109: 89088 4.086712018: 90112 4.133151927: 91136 4.179591837: 92160 4.226031746: 93184 4.272471655: 94208 4.318911565: 95232 4.365351474: 96256 4.411791383: 97280 4.458231293: 98304 4.504671202: 99328 4.551111111: 100352 4.597551020: 101376 4.643990930: 102400 4.690430839: 103424 4.736870748: 104448 4.783310658: 105472 4.829750567: 106496 4.876190476: 107520 4.922630385: 108544 4.969070295: 109568 5.015510204: 110592 5.061950113: 111616 5.108390023: 112640 5.154829932: 113664 5.201269841: 114688 5.247709751: 115712 5.294149660: 116736 5.340589569: 117760 5.387029478: 118784 5.433469388: 119808 5.479909297: 120832 5.526349206: 121856 5.572789116: 122880 5.619229025: 123904 5.665668934: 124928 5.712108844: 125952 5.758548753: 126976 5.804988662: 128000 5.851428571: 129024 5.897868481: 130048 5.944308390: 131072 5.990748299: 132096 6.037188209: 133120 6.083628118: 134144 6.130068027: 135168 6.176507937: 136192 6.222947846: 137216 6.269387755: 138240 6.315827664: 139264 6.362267574: 140288 6.408707483: 141312 6.455147392: 142336 6.501587302: 143360 6.548027211: 144384 6.594467120: 145408 6.640907029: 146432 6.687346939: 147456 6.733786848: 148480 6.780226757: 149504 6.826666667: 150528 6.873106576: 151552 6.919546485: 152576 6.965986395: 153600 7.012426304: 154624 7.058866213: 155648 7.105306122: 156672 7.151746032: 157696 7.198185941: 158720 7.244625850: 159744 7.291065760: 160768 7.337505669: 161792 7.383945578: 162816 7.430385488: 163840 7.476825397: 164864 7.523265306: 165888 7.569705215: 166912 7.616145125: 167936 7.662585034: 168960 7.709024943: 169984 7.755464853: 171008 7.801904762: 172032 7.848344671: 173056 7.894784580: 174080 7.941224490: 175104 7.987664399: 176128 8.034104308: 177152 8.080544218: 178176 8.126984127: 179200 8.173424036: 180224 8.219863946: 181248 8.266303855: 182272 8.312743764: 183296 8.359183673: 184320 8.405623583: 185344 8.452063492: 186368 8.498503401: 187392 8.544943311: 188416 8.591383220: 189440 8.637823129: 190464 8.684263039: 191488 8.730702948: 192512 8.777142857: 193536 8.823582766: 194560 8.870022676: 195584 8.916462585: 196608 8.962902494: 197632 9.009342404: 198656 9.055782313: 199680 9.102222222: 200704 9.148662132: 201728 9.195102041: 202752 9.241541950: 203776 9.287981859: 204800 9.334421769: 205824 9.380861678: 206848 9.427301587: 207872 9.473741497: 208896 9.520181406: 209920 9.566621315: 210944 9.613061224: 211968 9.659501134: 212992 9.705941043: 214016 9.752380952: 215040 9.798820862: 216064 9.845260771: 217088 9.891700680: 218112 9.938140590: 219136 9.984580499: 220160 10.031020408: 221184 10.077460317: 222208 10.123900227: 223232 10.170340136: 224256 10.216780045: 225280 10.263219955: 226304 10.309659864: 227328 10.356099773: 228352 10.402539683: 229376 10.448979592: 230400 10.495419501: 231424 10.541859410: 232448 10.588299320: 233472 10.634739229: 234496 10.681179138: 235520 10.727619048: 236544 10.774058957: 237568 10.820498866: 238592 10.866938776: 239616 10.913378685: 240640 10.959818594: 241664 11.006258503: 242688 11.052698413: 243712 11.099138322: 244736 11.145578231: 245760 11.192018141: 246784 11.238458050: 247808 11.284897959: 248832 11.331337868: 249856 11.377777778: 250880 11.424217687: 251904 11.470657596: 252928 11.517097506: 253952 11.563537415: 254976 11.609977324: 256000 11.656417234: 257024 11.702857143: 258048 11.749297052: 259072 11.795736961: 260096 11.842176871: 261120 11.888616780: 262144 11.935056689: 263168 11.981496599: 264192 12.027936508: 265216 12.074376417: 266240 12.120816327: 267264 12.167256236: 268288 12.213696145: 269312 12.260136054: 270336 12.306575964: 271360 12.353015873: 272384 12.399455782: 273408 12.445895692: 274432 12.492335601: 275456 12.538775510: 276480 12.585215420: 277504 12.631655329: 278528 12.678095238: 279552 12.724535147: 280576 12.770975057: 281600 12.817414966: 282624 12.863854875: 283648 12.910294785: 284672 12.956734694: 285696 13.003174603: 286720 13.049614512: 287744 13.096054422: 288768 13.142494331: 289792 13.188934240: 290816 13.235374150: 291840 13.281814059: 292864 13.328253968: 293888 13.374693878: 294912 13.421133787: 295936 13.467573696: 296960 13.514013605: 297984 13.560453515: 299008 13.606893424: 300032 13.653333333: 301056 13.699773243: 302080 13.746213152: 303104 13.792653061: 304128 13.839092971: 305152 13.885532880: 306176 13.931972789: 307200 13.978412698: 308224 14.024852608: 309248 14.071292517: 310272 14.117732426: 311296 14.164172336: 312320 14.210612245: 313344 14.257052154: 314368 14.303492063: 315392 14.349931973: 316416 14.396371882: 317440 14.442811791: 318464 14.489251701: 319488 14.535691610: 320512 14.582131519: 321536 14.628571429: 322560 14.675011338: 323584 14.721451247: 324608 14.767891156: 325632 14.814331066: 326656 14.860770975: 327680 14.907210884: 328704 14.953650794: 329728 15.000090703: 330752 15.046530612: 331776 15.092970522: 332800 15.139410431: 333824 15.185850340: 334848 15.232290249: 335872 15.278730159: 336896 15.325170068: 337920 15.371609977: 338944 15.418049887: 339968 15.464489796: 340992 15.510929705: 342016 15.557369615: 343040 15.603809524: 344064 15.650249433: 345088 15.696689342: 346112 15.743129252: 347136 15.789569161: 348160 15.836009070: 349184 15.882448980: 350208 15.928888889: 351232 15.975328798: 352256 16.021768707: 353280 16.068208617: 354304 16.114648526: 355328 16.161088435: 356352 16.207528345: 357376 16.253968254: 358400 16.300408163: 359424 16.346848073: 360448 16.393287982: 361472 16.439727891: 362496 16.486167800: 363520 16.532607710: 364544 16.579047619: 365568 16.625487528: 366592 16.671927438: 367616 16.718367347: 368640 16.764807256: 369664 16.811247166: 370688 16.857687075: 371712 16.904126984: 372736 16.950566893: 373760 16.997006803: 374784 17.043446712: 375808 17.089886621: 376832 17.136326531: 377856 17.182766440: 378880 17.229206349: 379904 17.275646259: 380928 17.322086168: 381952 17.368526077: 382976 17.414965986: 384000 17.461405896: 385024 17.507845805: 386048 17.554285714: 387072 17.600725624: 388096 17.647165533: 389120 17.693605442: 390144 17.740045351: 391168 17.786485261: 392192 17.832925170: 393216 17.879365079: 394240 17.925804989: 395264 17.972244898: 396288 18.018684807: 397312 18.065124717: 398336 18.111564626: 399360 18.158004535: 400384 18.204444444: 401408 18.250884354: 402432 18.297324263: 403456 18.343764172: 404480 18.390204082: 405504 18.436643991: 406528 18.483083900: 407552 18.529523810: 408576 18.575963719: 409600 18.622403628: 410624 18.668843537: 411648 18.715283447: 412672 18.761723356: 413696 18.808163265: 414720 18.854603175: 415744 18.901043084: 416768 18.947482993: 417792 18.993922902: 418816 19.040362812: 419840 19.086802721: 420864 19.133242630: 421888 19.179682540: 422912 19.226122449: 423936 19.272562358: 424960 19.319002268: 425984 19.365442177: 427008 19.411882086: 428032 19.458321995: 429056 19.504761905: 430080 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_instants.txt0000644000000000000000000000051613111512442026634 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:instants 0.000000000: 1 of 10 at 0 1.500000000: 2 of 10 at 1.5 3.000000000: 3 of 10 at 3 4.500000000: 4 of 10 at 4.5 6.000000000: 5 of 10 at 6 7.500000000: 6 of 10 at 7.5 9.000000000: 7 of 10 at 9 10.500000000: 8 of 10 at 10.5 12.000000000: 9 of 10 at 12 13.500000000: 10 of 10 at 13.5 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/expected/vamp-test-plugin_notes-regions.txt0000644000000000000000000000117213111512442027564 0ustar 00000000000000=== vamp-test-plugin:vamp-test-plugin:notes-regions 0.000000000, 1.750000000: 0 1 of 10: 0 at 0 dur. 1.75 1.000000000, 0.500000000: 0.1 2 of 10: 0.1 at 1 dur. 0.5 2.000000000, 1.750000000: 0.2 3 of 10: 0.2 at 2 dur. 1.75 3.000000000, 0.500000000: 0.3 4 of 10: 0.3 at 3 dur. 0.5 4.000000000, 1.750000000: 0.4 5 of 10: 0.4 at 4 dur. 1.75 5.000000000, 0.500000000: 0.5 6 of 10: 0.5 at 5 dur. 0.5 6.000000000, 1.750000000: 0.6 7 of 10: 0.6 at 6 dur. 1.75 7.000000000, 0.500000000: 0.7 8 of 10: 0.7 at 7 dur. 0.5 8.000000000, 1.750000000: 0.8 9 of 10: 0.8 at 8 dur. 1.75 9.000000000, 0.500000000: 0.9 10 of 10: 0.9 at 9 dur. 0.5 sonic-visualiser-3.0.3/vamp-plugin-sdk/test/run-test-plugin-regression.sh0000755000000000000000000000330513111512442024724 0ustar 00000000000000#!/bin/bash set -eu MYDIR=$(dirname "$0") TEST_PLUGIN_DIR="$MYDIR/../../vamp-test-plugin" HOST_DIR="$MYDIR/../host" HOST="$HOST_DIR/vamp-simple-host" TEST_FILE="$MYDIR/testsignal.wav" mkdir -p "$MYDIR/obtained" mkdir -p "$MYDIR/failures" echo "Rebuilding SDK and simple host..." 1>&2 ( cd "$MYDIR/.." && ./configure && make clean && make ) if [ ! -d "$TEST_PLUGIN_DIR" ]; then echo "Can't find test plugin dir at $TEST_PLUGIN_DIR" 1>&2 exit 1 fi if [ ! -x "$HOST" ]; then echo "Can't find host at $HOST" 1>&2 exit 1 fi echo "Rebuilding test plugin..." 1>&2 ( cd "$TEST_PLUGIN_DIR" && make -f Makefile.linux clean && make -f Makefile.linux ) export VAMP_PATH="$TEST_PLUGIN_DIR" # check that the two expected test plugin ids are present: ids=$("$HOST" --list-ids) expected="vamp:vamp-test-plugin:vamp-test-plugin vamp:vamp-test-plugin:vamp-test-plugin-freq" if [ "$ids" != "$expected" ]; then echo "Unexpected id list: $ids" 1>&2 echo "Expected: $expected" 1>&2 exit 1 fi some_failed=nope echo for test in $("$HOST" --list-outputs | sed 's/^vamp://') ; do filename="$(echo "$test.txt" | sed 's/^[^:]*://' | sed 's/:/_/g')" expected="$MYDIR/expected/$filename" obtained="$MYDIR/obtained/$filename" failure="$MYDIR/failures/$filename" rm -f "$failure" echo "=== $test" > "$obtained" "$HOST" "$test" "$TEST_FILE" >> "$obtained" 2>/dev/null if cmp -s "$expected" "$obtained" ; then echo "$test: ok" else sdiff "$expected" "$obtained" > "$failure" || true # avoid exit-on-failure echo "*** $test: FAILED, see $failure for diff" some_failed=yup fi done if [ "$some_failed" != "nope" ]; then echo; echo "*** Some tests failed!"; echo fi sonic-visualiser-3.0.3/vamp-plugin-sdk/test/testsignal.ipynb0000644000000000000000000011366613111512442022366 0ustar 00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import librosa\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "block=1024\n", "length=block*20" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "diracs = [ x/float(length) if (x % block) == 0 else 0.0 for x in range(0,length) ]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEACAYAAAC6d6FnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFUZJREFUeJzt3X+sJWV9x/H3lwKaCgJq1HSXReNSUBJDoVlpS+2NCiwG\nXdrUyhKKGmv8Q2zjj7j4I9m9qTHVWsUG0VSpEYQuqSZAQflR6W3ij102/BC6Lstaw7LLLwUWVk1K\n1t2nf5y57OFwds+ce+ecmWfm/Uo2e87cZ+4885yZ5zPzzMy5kVJCktQ9h9RdAUlSPQwASeooA0CS\nOsoAkKSOMgAkqaMMAEnqqJEBEBGXR8RjEXHPQcr8c0Rsi4i7I+LkaqsoSZqEMmcA3wDOOtAPI+Js\n4DUppeOB9wNfrahukqQJGhkAKaUfALsOUmQVcEVRdiNwVES8oprqSZImpYprAEuAHX3vHyqmSZIa\nrIoAiCHT/H4JSWq4Qyv4HTuBY/veLwUeHlYwIgwGSVqAlNKwg+1FKXsGEAw/0ge4HrgQICJOA55K\nKT12oF+UUvJfSqxdu7b2OjTln21hW9gWB/83KSPPACLiamAGeGlEPAisBQ7v9eXpX1JK342It0bE\nz4DfAO+ZWG0lSZUZGQAppfNLlLmomupIkqbFJ4FrMjMzU3cVGsO22M+22M+2mLyY5PjS8xYWkaa5\nPElqg4gg1XgRWJLUMgaAJHWUASBJHWUASFJHGQCSanHmmfD443XXotsMAEm1uPVWuPfeumvRbQaA\nJHWUASBJHWUASFJHGQCS1FEGgCR1lAEgSR1lAEhSRxkAkmrjlwPXywCQpI4yACQtyo03wp131l0L\nLcTIPwkpSQdzzjnwutfB5s1110Tj8gxAkjrKAJCkjjIAJKmjDABJ6igDQJI6ygCQVBsfBKuXASBJ\nHWUASFo0j+TzZABIUkcZAJIA2L3br3ToGgNAEgCf+hScemrdtdA0GQCSAHjmmbproGkzACSpowwA\nSeooA0BSbbx9tF4GgKRFsyPPkwEgSR1VKgAiYmVE3BcR90fEmiE/PzYibouIOyPi7og4u/qqSpKq\nNDIAIuIQ4FLgLOAkYHVEnDhQ7FPANSmlU4DVwGVVV1TSZEXUXQNNW5kzgBXAtpTS9pTSHmA9sGqg\nzD7gxcXro4GHqquiJGkSygTAEmBH3/udxbR+s8BfR8QO4Abgg9VUT9JCPPhg3TVQDg4tUWbYieHg\nNf/VwDdSSl+MiNOAb9EbLnqedevWPft6ZmaGmZmZUhWVVM6ePXDccd6Zk7O5uTnm5uYmvpwyAbAT\nWNb3finw8ECZ99K7RkBKaUNEvDAiXpZSenzwl/UHgKTq7dtXdw20WIMHx7OzsxNZTpkhoE3A8og4\nLiIOB84Drh8osx14C0BEvBZ4wbDOX1I7LfRsw7OUeo0MgJTSXuAi4BZgM7A+pbQlImYj4pyi2EeB\n90XE3cBVwLsmVWFJUjXKDAGRUroJOGFg2tq+11uA06utmiRpknwSWBLgcwBdZABIUkcZAJLUUQaA\n1DIO5agsA0CSOsoAkBrst79t973ybV63HBgAUoMddhh87Wt112I0O/I8GQBSw23dWncN1FYGgCTA\ni8ddZABIUkcZAJLUUQaA1DIO5agsA0CSOsoAkBrOWyw1KQaApEXzD8LkyQCQpI4yACQBXjzuIgNA\nmoJPfALOPbfuWkjPVepPQkpanKuuggcfnM6yPJJXWZ4BSFJHGQBSw3mnjCbFAJCkjjIAJKmjDABJ\ntXF4q14GgNRS43au3j3UPQaANAV2rmoiA0CSOsoAkBrOcXJNigEgjWHnTnjDG+quhVQNA0Aawx13\nwO23110LqRoGgCR1lAEgTUHb7wLyOkWeDACppXwOQKMYAJLUUQaA1HAOr2hSSgVARKyMiPsi4v6I\nWHOAMn8VEZsj4t6I+Fa11ZSawWEStcnIvwgWEYcAlwJvBh4GNkXEdSml+/rKLAfWAH+UUtodES+b\nVIUlSdUocwawAtiWUtqeUtoDrAdWDZR5H/DllNJugJTS49VWU5JUtTIBsATY0fd+ZzGt3+8DJ0TE\nDyLiRxFxVlUVlNrAoSM1UZkAGLbpDl6WOhRYDrwROB/4ekS8eJF1kybqk5+EX/2q7lpMzjQvHnuh\nOk8jrwHQO+Jf1vd+Kb1rAYNlfpxS2gc8EBFbgeOBOwZ/2bp16559PTMzw8zMzHg1lirymc/AzAyc\ncUbdNWkGz1KaY25ujrm5uYkvp0wAbAKWR8RxwCPAecDqgTLXFtOuKC4AHw/8fNgv6w8AKTd1dJJt\nPrpu87otxuDB8ezs7ESWM3IIKKW0F7gIuAXYDKxPKW2JiNmIOKcoczPwRERsBr4PfDSltGsiNZYk\nVaLMGQAppZuAEwamrR14/xHgI9VVTZI0ST4JLE2B4+tqIgNAneYYtLrMAJCkjjIApDHkNJTj2Y1G\nMQAkLZphkycDQFJtDI56GQDK3r33wo4do8sNYwekLjMAlL3Xvx7OPrvuWhxcTtcO1B0GgFph7966\nayDlxwCQxuCRvNrEAJBaZv66htc3NIoBIDWcHbkmxQBQKyy0k7Rz3W8xw1u2Y54MAGkKvHagJjIA\nJNXGM4d6GQDSGDySV5sYAJLUUQaAGuOZZ+CBBxY2r0MJ0vgMADXGpz8Nr371dJeZQ3B4h5MmxQBQ\nYzz5ZN01kLrFAJCmIIeLxz4H0D0GgDSGHDpyqSwDQK3gEag0PgNAjVHH0bXBUS/bv14GgNRwdpKa\nFANAaimDQ6MYAJLUUQaAWsGjXWl8BoAm4je/GX+eHG6xzKGOC9XmddNwBoAqt28fHHFE3bWQNIoB\noMo5HCPlwQCQGs5A1aQYAGqFaXWSOXXGOdQ1hzq2mQGgxmjzRcg2r5vyZQCocjl1duMegea0btIo\nBoAkwHDrolIBEBErI+K+iLg/ItYcpNxfRsS+iDiluipKkiZhZABExCHApcBZwEnA6og4cUi5I4AP\nAhuqrqTyNM3hFS8m1sv2z1OZM4AVwLaU0vaU0h5gPbBqSLm/Bz4LPFNh/aTOs3PVpJQJgCXAjr73\nO4tpz4qIk4GlKaXvVlg3qTUcX1cTlQmAYZvus8ckERHAF4GPjJhHGTrySLjmmrprMTltvgvIMweN\ncmiJMjuBZX3vlwIP970/kt61gbkiDF4JXBcRb08p3Tn4y9atW/fs65mZGWZmZsavtabm17+GDRvg\nne8cf96U8uowNX2G1HBzc3PMzc1NfDllAmATsDwijgMeAc4DVs//MKW0G3j5/PuI+C/gwymlu4b9\nsv4AkPp5EVjqGTw4np2dnchyRg4BpZT2AhcBtwCbgfUppS0RMRsR5wybBYeApOx4ttY9Zc4ASCnd\nBJwwMG3tAcq+qYJ6qUE8upbaySeB1Rh1BE0O4WYdNSkGgCamjZ3CQodJHF5RExkAGmlaHbmd5HAL\nbZc2BrCqZQBIUkcZAJJq41lKvQwATYw7t9RsBkBHfOUr8KEPLWzeNl8DMKT28xpM9xgAHfH5z8Ml\nl9Rdi8lpekj5lLOayACQpI4yAFS5+SNWj1y7w886TwZARzgE0T1+bhrFAFBjeBFSmi4DQK2w0KNd\nj5LVZQaAJqaNnatnKdVq4zaSEwOgI7wGUK8c2t9w6x4DQFJtDJ16GQBqDDsDaboMgMzs2gUf+MD4\n89UxBOHQUb2m2f5+1nkyADLzox/BZZfVXYvmsQOSxmcASGNwmEptYgB0RA4dVw51XKg2r5vyZQBk\nJqevTHZYphq2oybFAJBUG8OtXgZAR7R9CMKzFGl8BkBm2t6Ra/H8Om6VZQCoMXIItxzqWAfDJk8G\ngCbGTkFqNgMgMx6B5snPTU1kANTouutgz566azFaDkfybb4InEMdlScDoEbnngvf//5483gkKakq\nBkDNptWh5/QAmerhwUX3GAA1s5PMi51ktdz+62UAZMYjeZXl56ZRDICa+ef+qmFnJ43PAFDlFvok\nqmc30nQZADXLoZNUvQwpTUqpAIiIlRFxX0TcHxFrhvz8QxGxOSLujohbI+LY6quqxajjT0JKaraR\nARARhwCXAmcBJwGrI+LEgWJ3AqemlE4GvgP8Y9UVlSRVq8wZwApgW0ppe0ppD7AeWNVfIKX03yml\n/yvebgCWVFvN9mrzEJB/lDwvOW1bqkaZAFgC7Oh7v5ODd/DvBb63mErlZscOeOKJ6Syrjo6uzXcq\ntTk42rxuqsahJcoM2y2HbloRcQFwKvBnB/pl69ate/b1zMwMMzMzJarQbMuWwYoVsHHj+PO2uXPV\nfrb/cIbUcHNzc8zNzU18OWUCYCewrO/9UuDhwUIR8Rbg48Abi6GiofoDoE2efHI6y7Ejkdpv8OB4\ndnZ2IsspMwS0CVgeEcdFxOHAecD1/QUi4g+ArwJvTylNaTCkWdr8bZQL1eZ103P5WedpZACklPYC\nFwG3AJuB9SmlLRExGxHnFMU+B7wI+PeIuCsirp1YjRuq6UM5OdwGmsPZTQ51lMoqMwRESukm4ISB\naWv7Xp9Rcb0kSRPmk8AVcQgoT7a/uswAyExOQxB2rvvl8LnlUEdVywCoSJs7uzavW5v5uWkUA0CN\nkcOFaqlNDICKTOsaQB13AWk/n1auVpvXLQcGQJ99++Dpp+uuRXvksHPnUMcc2I55MgD6fOELcPTR\nddeiedy5pXYyAPps3z79Zbb520BzYHuqywyAPm2+CJlDR2f7S9NlANSs6R0X5FFHPZ9nlxrFAOiT\nwxFoTjtpG4Mjp/aXRjEA+rT5Fr/FrFubO70cQiqHOipPBkAfzwCk6TLc6mUA1CyHHcA6Su1kAPTJ\n4QxgoaZ55jDfFk1vk2lq+5mbn3WeDIA+OeykOdRRUh4MgIr49wC6wQBWm7QyAFJa2I7qzj1cmy9w\ntzmAfQ5Ao7QyAOblsHPbuea3rGlr87qpXgZAnzYfAdmJSBpkANS8rBw65hzqKGl8BkCfHM4A/IMw\nebL9h/Pgol4GQJ86ngNoc8eQQwDnUMcc2JHnqdUBsG/f9JbV5iEgSe3UygBY6JOoORzd1TEElENI\n5VDHaWvj9q9qtTIA5uUwBGTHpVHcRjQpBkCfHI6AcqjjvDa2v9QmBkDNy2rzg2Daz/ZXEzU+AE4/\nHW66aWHzegRajTYPQbiNqMsaHwA//CHccMPC5m1jx2UHNFwbP2tp0hofAAB79y5svhw6hRzquFBt\nXjc9V9OHQDVcFgGw0Pv5c7gLaFpyWDfPbqrV9G1S9csiAMbdkHN6DiCHOqpeBrAmJYsAWOgZwLjz\n5XCUrGr5uanLWh0AOezcHt1Vo+nt2Pb2V55KBUBErIyI+yLi/ohYM+Tnh0fE+ojYFhE/johlVVZy\nWheYcjgDyGGYarHzSZqOkQEQEYcAlwJnAScBqyPixIFi7wWeTCkdD1wCfK7KSk7rLqBpdq5zc3OA\nnSTsbwuPkve3hWyLaShzBrAC2JZS2p5S2gOsB1YNlFkFfLN4/W3gzdVVMY8hoHGXNe2Nu8mdqzv6\nfrbFfrbF5JUJgCXAjr73O4tpQ8uklPYCT0XESyqpIXkMAU1LDnWUlIdDS5QZ1uUMdq2DZWJIGQDe\n9rYSSxxw9dWwe3f58vMd/wUXwAtfWH6+m2/u/b+QOu7aNd58W7f2/r/4YrjmmvLzPfpo7/9x63j7\n7QubD+Cqq+Dpp8uXnz9ju+ACeMELRpffuhXuuGP/V34spI5PPLGw+das6W1fZT30UO//cZd1xx3l\n5ptvi35XXAFPPll+WfPtf/755dp/3o03lqvjML/4xcLm+9jH4Morh/9sWFsALFsGX/7y+MvS80Ua\ncZgcEacB61JKK4v3FwMppfTZvjLfK8psjIjfAR5JKb18yO9yxFuSFiClVPn5f5kzgE3A8og4DngE\nOA9YPVDmP4B3ARuBdwC3DftFk1gBSdLCjAyAlNLeiLgIuIXeNYPLU0pbImIW2JRSugG4HLgyIrYB\nT9ALCUlSg40cApIktdPUngQe9TBZG0TEAxHxk4i4KyJuL6YdExG3RMTWiLg5Io7qK//PxcNzd0fE\nyX3T31W009aIuLCOdRlXRFweEY9FxD190ypb94g4JSLuKX52yfTWbHwHaIu1EbEzIu4s/q3s+9nH\ni7bYEhFn9k0fus9ExKsiYkPRRv8WEWWGcmsREUsj4raI+GlE3BsRf1tM79y2MaQtPlhMr2/bSClN\n/B+9oPkZcBxwGHA3cOI0lj3Nf8DPgWMGpn0W+Fjxeg3wD8Xrs4Ebi9dvADYUr48B/hc4Cjh6/nXd\n61Zi3U8HTgbumcS607u+tKJ4/V3grLrXecy2WAt8eEjZ1wJ30RuOfVWxn8TB9hngGuAdxeuvAO+v\ne50P0havBE4uXh8BbAVO7OK2cZC2qG3bmNYZQJmHydpg/sPp1/+Q3DfZv96rgCsAUkobgaMi4hX0\nnri+JaX0dErpKXrXXlbScCmlHwC7BiZXsu4R8UrgyJRScTMrVwDnTmxlFukAbQHDb6leBaxPKf02\npfQAsI3e/nKwfeZNwHeK198E/rzC6lcqpfRoSunu4vWvgS3AUjq4bRygLeafqapl25hWAJR5mKwN\nEnBzRGyKiL8ppr0ipfQY9DYAYP722AO1yeD0h8i3rV5e0bovKcoMls/NB4phja/3DXkcbJ2f10YR\n8VJgV0ppX9/035twvSsREa+id2a0ger2iyy3jb622FhMqmXbmFYAlHmYrA3+OKX0h8Bb6X2gf8qB\n1/NAD891oa3GXfc2tMllwGtSSicDjwL/VEwfd51jyM8a3xYRcQS9r4n5u+Lot6r9IrttY0hb1LZt\nTCsAdgL93xC6FHh4SsuemuJIhpTSL4Fr6Z2qPVacwlKcrv6iKL4TOLZv9vk2aVNbVbXuByqfjZTS\nL1MxMAt8jd62AWO2RUrpceDo6H1JY3/5xiouRH4buDKldF0xuZPbxrC2qHPbmFYAPPswWUQcTu85\ngeuntOypiIjfLZKdiHgRcCZwL731fHdR7N3A/A5wPXBhUf404KnilPhm4IyIOCoijgHOKKblYPAI\npJJ1L4J1d0SsiIgo5r2OZntOWxSd3Ly/AP6neH09cF70vlL91cBy4HaG7zPz63wbvQcuofcAZtPb\n4l+Bn6aUvtQ3ravbxvPaotZtY4pXwFfSu+q9Dbh4mlffp7R+r6Z3Nf4ueh3/xcX0lwD/Waz7rcDR\nffNcSu9q/k+AU/qmv7top/uBC+tet5LrfzW9o41ngAeB99C7c6OSdQdOLdp1G/Clutd3AW1xBXBP\nsY1cS28MfL78x4u22AKc2Td96D5TbGsbiza6Bjis7nU+SFv8CbC3b9+4s1ivyvaLXLaNg7RFbduG\nD4JJUkdl8SchJUnVMwAkqaMMAEnqKANAkjrKAJCkjjIAJKmjDABJ6igDQJI66v8BFdVGZ/S457MA\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(diracs)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import math\n", "wave = [ (int(x/block) / float(length/block)) * math.sin(x*math.pi/(block/8)) for x in range(0,length)]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEACAYAAABGYoqtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztfWu0XFWV7rdOkpM3h2cCCU8JvlquiBdavYpB5CHDltbR\nXvHRBr2+2teV1r4KtJ0gtq2Oboe2qA02jaAi3a2t4KMRUeNbBCWC8opKhBASXkmAJOfknJN9f6ya\nrFmz5lp77V27qk5y5jdGRq2quWvVI6fmt7/5zbW2K4oCBoPBYDBoGBr0GzAYDAbD1IWRhMFgMBii\nMJIwGAwGQxRGEgaDwWCIwkjCYDAYDFEYSRgMBoMhikZIwjl3iXNuk3Pu5sQx/+ycW+ucW+OcO6aJ\n1zUYDAZDb9GUkrgUwKmxoHPuRQCOLIriKABvBvAvDb2uwWAwGHqIRkiiKIofA9icOOQMAJe3jr0e\nwIhzbnETr20wGAyG3qFfnsRSAPew+/e2HjMYDAbDFEa/SMIpj9l+IAaDwTDFMbNPr7MewCHs/sEA\nNsiDnHNGHAaDwVADRVFoJ+Ndo0kl4aArBgC4GsBrAcA59ywAW4qi2KQdWBSF/SsKrFy5cuDvYar8\ns+/Cvgv7LtL/eolGlIRz7goAywHs55y7G8BKAMMAiqIoLi6K4lvOudOdc78DsA3A65p4XYPBYDD0\nFo2QRFEUr8o45u1NvJbBYDAY+gdbcT1FsXz58kG/hSkD+y4Cptt3cffdwLZtfjwxAaxdG2JHHbUc\nExN+vH27P9bQPFyv61lV4JwrptL7MRgMg4VzwBveAHz2s8B//AfwilcAlCKcAz73OWDFCuCd7wQ+\n+ckQm25wzqHYDYxrg8FgaBy33+5vH3usM7ZhQ/utoXkYSRgMBoMhCiMJg8EwpeFaRRStlJSKGZqB\nkYTBYJjSMJIYLIwkDAZDz3HjjcCFF4b7b3tb6Fq66irgq1/14x07gL/6q/bnup7YsYZcGEkYDIae\n40MfAt7xjnD/058Gfv97P37FK4CXvcyPH3wQ+Jd/0ZWBKYnBwEjCYDD0HDOVZbuTk52xXbv87fh4\neMzKTYOFkYTBYOg5eBKXCZ3fJ3LQSIIIhB9vJNF7GEkYDIaeQyMCWi3NYzt3th8DBCLgBJIiGkOz\nMJIwGAyVQIYz4LfDoDN8GePjFBGUkQSVo/jxVKoiyPuG5mAkYTAYsvHAA8CCBeH+smXA3/6tH19z\nTXtswQLga1/zY01JECFoJEG3ADA01P68ycn2Mb81NA8jCYPBkI2xMX9LSfq++4Af/MCPta0xfvvb\nzsc0tZATI8Wya1f7GLA22V7CSMJgMGQj5Rlo0IzlFBFoxjUhRRKG3qFfly81GAx7AFIkkWpR5clc\nGtc8RvNTjM/LiUGb19AbGEkYDIZsaJ5BThsq9wzouZTgUzE+r0YS9FwrN/UOVm4yGKYprrjCr3AG\ngD/8AfjmN0PsootCwr7hBuDnP/fjukqCE4E0nTWVoRnRNP/kZCdxGEn0DkYSBsM0xatfDXz+8368\nciXw4heH2FveEq7j8JKXAHRBvJSfoIGSN0/iKT9Bi2lKwjyJ/sFIwmCYxti+3d9S1xIHEcGjj4Z4\nTrmpbGFbVZLQYkYS/YORhMEwjaGVilKrmWULLJ+DG9L8EqMSmheRikny2bWrvfQUex1DMzCSMBgM\naotqatsMfgZPK6J5TCbvVLmprBSVU24ykugdrLvJYJjG0JSELC1x0GP8TH/GjM6YXAmtEUGuktBi\ntArbyk29hykJg2E3x3ve4y/iAwCbN7cn5FNO8Z1KAHD99cCiRe3PzVnsxmN1PYNulETV+Q3NwkjC\nYNjNcdFF/iI+QNhUj0pF3/lO6GC69Va/9xJHjpLQ/IqUZ8BbVFOtrFqClzFtfu5JmJLoPYwkDIY9\nCKlSUS60DiZCE91HdY1rbX46zkijdzCSMBh2c5TtoqqpBekV8G0wiGgo4fJYThKfnOw8rpt1ElpM\nHmck0TuYcW0w7OYoM51TvkNqawxtG+7cJJ7aW6muJ5FacW3rJnoHUxIGwxTBjh3Aj38c7v/kJ8Fj\nePBB4KabQuy739Uv55lLEk10GBHqKokmyk1GEr2HkYTBMEXw9a8Dz3teuP/c5wKXX+7Hq1YBxx4b\nYi98IXDbbX5clSSKolrJp4nuI0JR5BvX0vxOeRIp4jF0ByMJg2GKgLbI4HjoIX97//2dsdFRf8sT\nMZFEapuNJs70U4vd+PzabS4JVZnDPInewUjCYJgiSO2iqpWKtDZTIgf+GK2I5rEqJFGHQFJn+rnl\nphQRmCfRPxhJGAxTBKmN8VIlpZTpDOgrouuWm1LrGHITfN2SVa5SMTQLIwmDYYpAI4kh5RdKZabU\nOobcs/RebJtRVUnEXruKJ5FavGfoDkYSBkMPcPLJwJYtfnzJJcBnPuPH27aFazMAwPvfD1xzjR/n\nlpukkihL8N12H1XdgK/sTD/XuLZy09SAkYTB0ANcdx3w+9/78bveBbz1rX68ZQvwgx8EE/mDHwQu\nuMCP5bWfOThJkJIgsqijArrtbqq6Ijqn86nsuNyYoVkYSRgMDSPlLaS6j+ixiYmQ7MhP0MxpIpNu\nttpusrspZ7FbFeM6pRaMJPoHIwmDoWFIRZBSAUDwHbixLA1ori40c5qgrZLWYrFEzddQ5HoGVfdW\nylEqVX0N8yR6B9uWw2BoGJIIykiCkqSW4HOIoBtPIqf7qJsknqMCOFLHmScxGJiSMBgSePDB9usq\nbNgQYnffHRLk6Chw331hDFQnCZ5kU0SQUgt1jetU8o/Nn0MEGoGkLj2qlazk++dqR4sZmoWRhMGQ\nwAEHAO94hx9fey2wdGmIHXYY8KUv+fGHPgQsWeLHVUmCkFMOArr3E1IkUdb5pCmObpVEmVLJIQl5\na2gOVm4yGEpwyy3+duPGzthdd/nbO+8MjxEB8G0wCEQS3GMgc5onWfIpmlgRrSmJKqZwbP66SqKu\nUrFy02BgJGEwlIASEiV9Dm1LbCICzXSWMSBsm5FLEjmeRFl3U2yhWm4Sr6oktM0FtbN+HrNy09SA\nlZsMhhJQwtbWL+Rsw53rJ9QtN8XmqDJ/brkppTjqxmLX0K4zhymJ5mFKwmAogTyr12LaVd9S6xg4\n4aSMZTqOb8/RhCchFVDV7qOqRJNSAdr8ZWrBlET/YErCMC1w663A5z8f7q9cCTz2mB9fdx3w3//t\nx2NjwDnntD+XPANCKgHzce6Zfi+2zai6oK3Oa9chCc1P4NCMcc2cTpWiDM3CSMIwLfD+9wOvfW24\n/4EPhIv2/OVfAqef7scPPAB8+MPt/oM86x4fD2NNZTSxjkHOwY/JbYGtk8RzSaLqmX7Kk4jFbMX1\n1EAjJOGcO805d7tz7k7n3HuV+Arn3P3OuV+1/r2+idc1GHIxPBzGlEgo+dElQoFgLNMt0EkEk5Oh\ng0krH2mPETQzW8b6eaZft9xUtxyU8hPkFfN27fKfjc9B92WsKPz/kymJ5tG1J+GcGwJwIYCTAGwA\ncINz7qqiKG4Xh15ZFMU7u309g6EOePIgUqDtLXhsxw5/OzoKLFzYPgdP/lSC0nyHJldEVyUJ/try\nffBbSXy586faUHNaVKuQy65d/nvmj9F9PqY5+H1Dc2hCSRwPYG1RFH8simIcwJUAzlCOc8pjBkNf\nwJMyeRGkFjhJ0CVEiSz4c1MJmCM3iaeel0rwOXNU7Q4ahJIoUxlEBPy4mTPD/DSmGD/W0ByaIIml\nAO5h99e3HpN4mXNujXPuP5xzBzfwuoZpCl6qkWUbfiEePuYJlUpFGklwJSHBlYQsKU0VJVF1jpwE\nz9EtCZHX4Fz7Y1Q64mOZ+LlaiKkMI4nm0UQLrKYQ5H/V1QCuKIpi3Dn3ZgCXwZenOrBq1arHx8uX\nL8dyfoUWw7THQw8B++8fatLHHQecdBLwj/8I/PCHwPOfHxLFwoXAV74CvPjF7WfFlDTllttAUBJl\n22bkrIjO9STkwrZBeBL8GK1tVc5flSR4eSg3+Usi4M9LzTEdsHr1aqxevbovr9UESawHcCi7fzC8\nN/E4iqLYzO5+FsBHYpNxkjAYJB55xN9u3w7Mnw+sWQPMmeMfoy0yCDt3Ajfd5Eki1X1UtiJanm1P\nTHQusGtaSXRbbmrSuNZIok65SSZ4KilxFcCPK4r2khI/TitFTSclIU+gzz///J69VhPlphsALHPO\nHeacGwZwJrxyeBzOuQPZ3TMA3NrA6xqmIagcRGf8ADBrlr/VEoRTdG5qsVvd7qPcdQx8jlivf1Ul\nwdGtZ5Dbolqn3DRzZohR8qfy0tBQeyylJFLlpumiJPqJrpVEURSTzrm3A7gWnnQuKYriNufc+QBu\nKIriGwDe6Zx7CYBxAA8DOKvb1zVMT2jloByS4AviuiWJiYmw35KcoyjylYRGDnRblyRSZSN+v46f\nIEtFPNlTPMdYlsneOd2H2LXLkwd/32XlpumiJPqJRrblKIriGgBPEo+tZONzAZzbxGsZpjdISXBT\nmiCNUKDzlh+XSxJauUkepyXZMqKJzTHVups0kqh6pi/LSHw8NBTWOMjYzJntV/hLtcByUjI0B1tx\nbRgYvvENYMsWP77vPuD73w+xyy8Pq57XrAFuvNGPNSVBSYTHKFkMKX/huWohFtPO5lNJvMltLbRY\nN+WgqqUo6R/kKgnNuKbx0FDodsolmpiSsHJT8zCSMAwMf/ZnwKWX+vHf/z3wgheE2IoV4ToOK1YA\np57qx6QkOElQoqDY5KR+wR9CKonnnKWnVABvj6262K1bP0ESQ64ioMekZ1AWyz2OxySBEEmQkpCx\n3HUS1gLbO9gusIaBgrqV7r8/PCbLNevWheMo+fNyEyUGOn58PDwmrwHBPYOycpNMrqkEr8XKdoGV\nnzPXT5CxGIGUEU2VUtGsWc2Um5pQEmUxQ7MwJWEYKMhQ5smcykbUjsp/+HKNA4+n6v08UcrkHCOJ\n2Jm+Nr9GLiljOaUkcktFGoFUmSOnVERxrcQUK/lUie3aFbqbtBZYPoe1wA4GRhKGgYJIgidU2luJ\nyEIjCW2dQYokcs/0U8k+t/tIPsZRlwjKYnQWPTmpj+m98TPx3JISlYPkGbw0j1PGcjeeRNmiOz6/\nkUTzMJIwDATSWJ7JCp9EEuQxDIokulUSGknULSmVlZu05F9GBHXLQak215wYXySndTdJpSLfoxnX\n/YWRhKFrvOc9wJvf7MePPgocdFD48b7lLcAXv+jHt9wCPPvZfkyeAv2oeRcSKQgqQfFSVKpFlXsS\nfMyf1w1J5HoSkiT42W3TSiLVcZSTxOsoibrGdVUlYeWmqQEjCUPXuPBC4OKL/fjhh4GNG4MauOgi\nHwf8Fhk//7kfE0mQ78ATNSXvsjZUgjzb7lW5iSsJPo69tiQJbprHFAFPlpSYKcYTNY1pTUgdJZGj\nAjhJaAvhqhjLdbubcuaX5S1DczCSMHSNefPC+NFH/S2/kA9fjUyQBjRXElIF8FhKSeSShEzwHDlK\nIpbg6VY+VsVYpiQ+Odme4Pl9Pm7yTL+KJ1Gn3NSEJ2FbhfcfRhKGrsGv+qaRhNwxtSg6k7d2Nk8k\noamMup6ElvyrrmPQSCKXQMp8B54EZ81qT4J0X47rkkQdTyJmQKfmoP+jbrubcpWKoVkYSRi6Bk+y\nRBJ8Az4iCb6lRqrkI5VE7rYZTXsSuYpAi/HrJUxO6mUkPqbn8vUIOWf6k5PtSTymOOh9NFFuqmtc\na51PZFznkFCOJ0HHGpqDkYThcezcCfz61+H+b34TPIOtW4HbbguxG2/s7FACOi8NCoQN+Ig4du7s\n9B20DfJy91aSiTp3X6SyxW4xJVFmXMvkzJN/KonL5J9bbpoxo34Sr1tuqqokmiIha4HtP4wkDI/j\n2muBY44J948+GvjMZ/z4vPOApz41xI47Drj5Zj+mtQ5A5xk8B4/JRM1LRjlKgpebZCzXk+AJRs7B\n1UIdT4JIgZ/1yhgf0/w8OfNY7HlaEp+qLbDddjdRzFpg+wsjCcPj0BIvlYjWr+88jlRDynQG0uUg\nmcy1UlHVclBudxP3SOg215Og5MZfm5d8Zs0KhDQ05BMYzUkxPqZ5q5abuiGJbspNVd4jxWJtuikl\nQX9bssRkLbD9g5GE4XFQWUh7jMdoHyUqRXGS0NY2UKKgxzRPIpXgy4xlmreqJyHJRSqEyUlvyseU\nhCwHaWf65BnkKAmeWKd6d1MVNQLEvYZdu8L1JFIqo6z91spNvYORhOFxUDLmioLGfEX01q3+ljwG\nTUmUbcAnPYk6SqLMF9Bi2jqGGElQEo/Nr5WDpCdByYySbK4noRFIqtzU5AZ5sUQtFYg8e5dqIda+\nKhVB7HoSGoGk9pfiys7QHIwkDI+DkvKOHeHHRgmbk8Rjj4XjgHrlppiSKCMJfnws2ZcZy9rxzoXn\n8TFXElIhSJWRUhL8TDzXk6jS3URJluaQYz5/FT9BKweVrYjmsRQJ8fljnkTOQj4iEzrO0CyMJPZQ\nvOxl4YI+X/gC8PGP+/HoKPDKV4Yf06c/7S/+A4SkvH17Z6LmJMGPA6qThNbdxElClpFylQTvZNK6\nmiipa+TCk3pVItDmqKsktDlo/txyU6qc1a3noa13oP/j1Jm+fJ42f4ygeHssVxxyzNuODc3BSGIP\nxVe/Ctxxhx+/4Q3A2Wf78caNwJVXhvUMb3sbcMEFfsw9A1k20kiCYvzsTbumQ5Vy08REvD0WyFcL\n2mOSJCYnQ5LhpSI6TpabypJ4t0pCJs/cchMnoViy1+avW26qslqakjsQX7WdM3+KhORxhmZhJLEH\ngn74RAQ8wW/e3B4DgDlz/C03nSVJ8DNGzZwm8OeljOU63Uf8sZS3EOtMkl1FPIlTYtJUhVQSvfQk\nmvAMcudoYjFdzhqHsrJRasW1Fot9B1Zu6g2MJPZAUFKm7iPemUQkQb6C9rzx8U61wBNl7loISTRa\nuUkjC+1KbUCos/NkLN/b8HBIwDTmMakW+Jm+RiB8Du1svleeRJ1yU78W01XtrJJEphnXsRXXqefF\nDG5DszCS2ANBSZmMZa4kqH2V761EPyx6npbguRqQSiJWbpJkkqsktMfodnISmD07KAkymWkuSv58\nTM8dHg7rK2S5hiuJWLlJJupeeRKU+Ors3STn5wpQe180Btrn4N9Ht+WmGJHlkFyOcS2ViqFZGElM\ncWze3F77f+CBEHvwwfADHx8PKkFuw81JgmIaSaTKTTzBN0ESMeM6x2vgKkAmak0tUGz27PZyEI0p\niWtKIuYLpGJ1lUTsTDwV087mU36FNK67LSnlqBh5pk/vK6e7KfW82ByGZmEkMcVx7LHAOef48fe/\nDyxaFGIHHABceqkff/KTwL77+rFUErzcRDG+jkEjCVlu4ok+p9ykKQLZvjprlk4WExPtZ/D8vlQS\nse6j2Jk+JxB+1szPonOUhEzwqXJQrpKoE9NIqE45KEUmMlbHuO5GScjFdNqYyMSURPMwkpjiWLcO\n+MlP/PgPf+iMb9rkb3/84/CYVBLaiugykqiiJOj5RZFPEhMTIdnTY1Q6otjkZEgCvIyUIomUkuDE\nwMlElptk2Yg+IycNLYlLcslREtzcLVMZdRbTVSkHVZmjqpIomyP12nKhHRGPlZv6AyOJ3QB0vQZ5\nVg8EAuAyWyoJDm2OFEnQRYFSnkSMGMqUxJw57UqCJ3heGqIkrsV4IuXkwsf0mppC0MpN/H2kCCS1\nhiJXScyY0dniKeegxCc7k+T83ZSDcktKRVHfuK7b3VS24loSjaFZGEnsBqCzWb6ITSb2spISIaUk\nOIFIAsjxGqgUNXNm55jiVGLSlIRmOk9MdJJESi2kyk2al5EiAp6ApUJInemXlYNy1jik5pDlrKa6\nj3Ln6FapVO1ushbYwcJIYjeALP2MjoYErV3+U1MLMpZbbpKEoJWbpF8RO5vn97m3AHQqBGky55JE\nLCbVg1QLMeOa1lDIElPKM5BEkOo+SiX/XAO67vx1y03SkNZUgBzL4+quuLYW2P7DSKJPWLvWr3Qm\n/NM/hQ6jn/4U+O53/Xh8HPiHf2h/Lp0dcZKQJSVqdeTHaSTBlQTNS4lUIwlZKiorN42PhzISH9Px\nc+bECSSmJFIkUaW7KUdJSDLRkrOcg/sJkkzKEnxZ91GdM/1edzfVNa7reBLckM6Z35RE8zCS6BMu\nvtjvmQT4JPKe9wBr1vj7b3wj8MIX+vHddwPnnhvaWTk4MUhzmn4cWhLnSG29oakFTUlQCYgfw0tM\nnAhoTMdx0zmmJKQayS03Ebns2tU+pvklSZQpCUpE/LW11dhUO5cqgJ5DSVZ7bR7jyb9quamOcd1N\nyUpbSU1+hRzHSKhMScRWasdaYK3c1BsYSfQJvLxDax1oa4x160JswwZ/+9BD4Q8+R0nwVda55aYY\nERCBDA3peyuNjwPz5rV3PlHCLyOJmJKIJX+t3MSJhhaV0WKxHCXBz6g1T0KuxpYqQ461JB5brKed\n6fPXrlpu4q9d1ZDuprupipKIHZdaQ5HzPCs39QdGEn0CdSgBgSTougwagWzd2lkG0kiClIQWky2q\nVA6i4yVJyBXXslTkXFAZ8+a1qwuZ/DVzOuVJyBJTTEnIOWJrHPhYduVo5SYtwWsqI2eOMgLJXeNQ\nJRnXNa77tZhOKg56T6TCZEzzMqwFdjAwkugTePcRJXYiCU4gPEZJm8xprdxESkKLaQbzzp2hVKQd\nx4lAtqjOnRsIhEiC1kbQsTnGtTwOaC83yXHKk9DaVzlh8GScO4c0hWW5KeZraGSSUgGpBF+13DSo\n7iZK4mVKItXKSm3A8rXLvAxTEv2BkUQN8LMVeeYSi3HPgIiArsfAt83gMSIHSRJjY+mYtqEe3Y6P\nA/Pnx8tN8+a1l414bO7cUG6iMSUR3tqaU24qUxK5xrVUGdoc8jgtwcfKTalSUU5JqY6S4EY4T4j8\nDDt376bc7qZUyYfHZItqLMFryT5mfqc6pLghnVIStuK6dzCSqIiHH/Z/uJR4X/hCYOVKP/7lL32M\ncMABwH/9lx/TGf/YWCACuuXgsZiS0FRAKjY+3q4eOEnIshElfy3Bk5KQhDFzZtgLSaoFOpsnxZGz\n2K2KcZ1K8DGSoCSboyRS7bGaAR1LxjlKQj6vypl+LFGnYvJsPuVdxGK5LbCpVlYtphEIL0VpYys3\n9QZGEhXxu9/52/Xr/e33vgdcc40f33KLvyXJ+9BDwM03+zGphtHR/pDE7NntyZ/IgJTE2Fi7ctCO\niykJWXoiktDKTbNmhSSb290kE3yVcpMsBxEp1FUSvNwkFUIvPImcBXmxclMdz0Am45iS0GKpBF9l\nUVyVFddWbuo/jCQqgsjh4YfDY/Pm+dv77/e3jz7auX6B7nOS0LbNkCSxcGE7STjnb/mYYqRwSC1w\nkuDqgWJSSezc2V5uIlIA4kqCiGDGDL3cJFVG7joJTjRad1OsjNSkJ6ERCCeelOLo1pOoqiRiCT4V\ny032mhqpqiS0klWOkpCGtxnX/YeRREXQxXr4Oga+XQbF+JjHRkfbCQNob3XlMUkSY2Mhwe/cCSxY\n0L7ymsdoTMmNEjyP8WRPn4NII+ZJ8OdJJaGVmyjBS5WRUhJyvYNGBKRGeBKPlbPqehIy+Zed6ce8\ni9yzdD4n78biSVDGpMrIfV4VxRFTAblKoglPghSCKYn+w0iiIijZb9kSHqOzeR6Tx6XKTbxUxGNj\nY51KYsGCoBZorMU4Ecya5ROfVA+cJIqi02vQupukyuCehFZu4iog1t1Eaxxi22bIOeS+TrK7qSlP\nQib/XM9AEkhOi61GLnU9iSqts1WJTEvOvVISstwExOcw47p3mNYk8Z3vhCR+333t221/7WshAd9+\ne/AbKNlv3x5KJXTLY3wMdJab9trL3xZFSPAUW7gwKAlSC3ScphaAeIxIYtYsnUCGh0PyzFESfDEd\nHVen3MSVBCUzqUY4EcTKTbIUlfIMZNmIJ1KeFLUErykJrWSlJfsqMe19lJFEylhOKQS+rUgdNcJj\n9BvgCb6su6mMaOT8stOJmkTk5zQ0i2lNEqecAnzmM3780Y8Cz3ueH2/bBrz0pcDPfubvv+517THA\nJ39K/HSbIont2/0fPxHB3nsHtTB7tk+6FNtnn0ASc+b4H7NM/rkksXOnT2Y0h/QnZs3yP2auMlLd\nTbIFtm65qawcVMW4zu1uSvkO/Exflpv4a+euiE75Arn7LuWSRK4K0NpXgfYEXFWNUGxyUn8f2vwp\ntaB1N8n5pTqhmJWbeoNpSxKU7Km8wy/oIzuYfvnLsPCtjAhisR07QvLnJDE66pPxnDmdMUrww8Od\nJaaychMvKZGSSKmMiYnO58U8CWli83LT+HhI/hTjSkVeMIjKXDwZayWlXNM5p9xUxXfQvAY6Tkvi\nkoSqkoRUCFSKix1X90y/LAHnlpQolpPEU75DFSXBPxvNb0qid5i2JEFlpo0b/S1J19HRYDbfd5+/\nnTs3PG/7dp9kiQjmzm0nBLqvxfbdtz5J0CI5Kj9pSoLHSBFIkpCeREpJaN1NvNzUbXfTjBk+NjZW\nvYMpFisrN+X4DrJ1Npb8ZbKPGdc5JKEl8RkzOpNgVaKh2MREJ5nIBJxbbtKM65wk3gslwQnKlERv\nMO1JggjhkUfC46QaKEayGfDJfv/9vTLg47IYKYkdOwIR0JhIQsbGxnxCnD27XT1o3U38vmxzLSMJ\nUhJSLZCSoARGXUUU09ZJcK+Bl4p4TJaRxsaqEYFGINqZPh9TEtdiOUpCi9HfhUzA3SRxXtah+1qs\najmobP4qm+xpLbA5SZximnGdilUhIVMSzWPakgQRgXYrH+Ntmtu3+5XUpBb228/fFkUgBorRGPC3\n++zjE+KOHcDISBjPmeMTn4xp5SbyE6jldedO/6OZmAg7s6Y8CbniOqYkeLlJHhfrbpJegywVSb8i\npSTK1AJvgZUJnpMQ/f91oyRi3U0Uo3KZJAJOUPw9arHx8U4yiamAGNFo5jRP1PI4TUnklpu6URKS\nhMq2BKlKQoZmsUeQxIUXAn/3d3784IPACScEz+Fd7wIuvdSP16wBXvAC/4e0ZYs/Yyci2LLFdxxt\n3do+3rU85jU0AAAgAElEQVTLz7VggVcb27YFYti+3XcizZzpky4nDT4G6nsSs2e3l5tiHUwaEWhK\ngsikipIgtcD3Z4qtuKYEz5O4jMnk34SSGB/3iUJ2Js2YETY1rOtJaCQUS+KcoOqWg3KSuNbBJJMs\nP0sntcCP0wikSrmJz1E2f7dKQpKJLFNZual32CNI4t3vBi64wI9vuQX40Y+AG2/09z/xidDBdPXV\nwPe/D9x7ryeCQw8NZaatW8N9Pn70UZ9w99nH35dqYd48/0+qBz6enPRJjBTC6Gj7mCsJIomYktDK\nTfy4MpKo4kkMD/sf3thYOI6XmzRPIlZSorUYcuM+UhJVSEKL8bN5mfylMS69BeknaGoh9jye4FOe\nRFlMUwspJRHrnpIL5lK+Az/Tr1tuihFZynSuqyR4ScmM6/6hEZJwzp3mnLvdOXenc+69SnzYOXel\nc26tc+5nzrlDm3hdAhnLk5PhAj633RYu6kNn83/8o7+9/fZABFu3BmVxyCFBSVCMFMfIiL9fhyR2\n7PDHkFoYG/Pz8RZYLUbJn3sSVCqi8cRE8C5iayGkkuCdSTz5y+4mSuKjo2HMVUZqxTUvN3Ei4KqC\nn+lXKTdp3U1UruHH0X2tlFP1ynEywfNYbP66SqIsFiOCuvP3otzEyUWqpLqehBnXg0HXJOGcGwJw\nIYBTAfwJgFc6554sDvs/AB4uiuIoAB8H8NFuX5dAdfx99/UX7CGSWL/et7Uedpi/LQp/adDFi4F7\n7vHJ/7DDfOLfscP/YS5aFDwJIomtW33SpvJTFZLYd1///rZt84l5zpywzTcpCU4SdH+vvcJYdjfx\nctPs2T4hbNsWLzdp6yTIu9DKTbJraeZM//3w4yYn2/2KlHGdKvk0qST4/DnlpiqL3bhxrS1ii3kS\n3SbxVCmn6orrmHFdRkKxclOOOR1L4lWVhBnXg0UTSuJ4AGuLovhjURTjAK4EcIY45gwAl7XGXwZw\nUgOvC8An/CVLvArYsAG46y7guc/1JHHXXcDRR/uEef/9niSe9Sx/3JYtwNKl/iz5oYfa1YIkCakk\nDjggdDARSciOpu3bfTlozhy/GeC8eT55xpSEFitbJ0Gxxx7TDW6uFqgUpXkSvNykeQ2akuDHcTUi\nkzjvYJLbazTpSRARcEWQU24qM665GnGunTC0UpFGJnVIItWiKueQZ9hVjOs65aaqSiJWKpJqIRbT\nSChFUIZmMbOBOZYCuIfdXw9PHOoxRVFMOue2OOf2LYriYXEcvv71ai/+m994RTB/vvca1q3zq6Ov\nv94TxSGH+LUQd93lSeL1r/dlp/Fx4MgjvfF8zz0+MY+MeN+Bq4wtW/zjCxf6+9u26Uri0Uf9nHvv\n7R+nVdTz5nkznZTE5s0+odG2HJTsqdzEY5xA+NbeUiGklETKk9i5M64k+EI4UhIxTyK1qjpWbqKE\nm9vdxJN/TrmJkgsvN6WMa0pmZSUlSpBAZ4KPdUHJ5JlDEtr8KaKhxKkl8ZgaSRGIVAuUxGOlqNwk\nHlMLqZgZ14NFEyThlMckn8tjnHIMAODd7171+Hi//ZZj//2Xl76BV73KG9WkJM49F/jyl/39pUt9\nGeqGG3yifuIT/XYbu3b50tPIiCePvfby43vv9URxyCHBxN5rr1Bu2ratvQWWE8G8eWGhHSeJhx4K\nngSVkWjjPkkEvNzEu5u2bfPJi64TwZUEkcTwcCAarfNp585OT2J4OKgF58L8XCGQkuDdTUQE5CeQ\nJ5FbbqJOJKkkxsfzSELOz9UCL4vIWIoItASvGeMyAed4EmUkIecA8kiCn3nLUhGfP2Zc55abgHQp\nKjW/piSk70BjGeP/95rimK7G9erVq7F69eq+vFYTJLEewKHs/sEANohj7gFwCIANzrkZAPYqimIz\nFNx556pab4II4v77gWc/26uD9euBE0/0yf1HP/IlpCVLPBEMDXkPYmSkXUnceqsnh/328z/0jRvb\nPYlHHvHkEiMJ8ic0JcFLSvPm+R/AY4/FjWsaDw97pSLNabpP5aZZs/z7k56EpiSkJ7F9e6da4OUm\nuU5CEkis3EQbCEq1AOhKYnS0upLQyk2kVDSVIUtKmpKQ5TJJEnT2KxP8xES5Z8BjM2dWUxKx+bmS\nyJk/1t3Ev5MypULza55HzHROKYmUijHjuh3Lly/H8uXLH79//vnn9+y1hhqY4wYAy5xzhznnhgGc\nCeBqcczXAaxojV8O4HsNvG4bDj/cE8GSJT6xzp/v10UsXRpiBx/sx+vWeTIhJXHPPUFJEBHQfR67\n7z6fQKiklCIJLcaVBBHD1q3t5SZpXJOS4CQhy02cJCg2d67/wVD7amqdhDSnY91NXEnMmOHvy1IU\n9wxyu5u6Na4pUUu1kGNcxzwJnswkEcj56XPyWB1PQprfVcpNZcZvyrjOKTeVxcqMa0kgUknImEY0\nKRLiKuPss4G1a5vOMNMXXZNEURSTAN4O4FoAvwVwZVEUtznnznfOvbh12CUA9nfOrQXwLgDv6/Z1\nJZ7wBOCnPwWOOMLfP+wwv2ZiyRJPDBs3+hLSokU+qa5bBxx0kE/+69fnkQQdx4lg7tx2taDFHnoo\neBKytfWRR0K5idZU0LbhVG6aPbvdnB4fb+984uUmSSBa8tcW02lKQhIIT/CSQKQnkdPdJAmkLklI\n30Emf824LltMR8fRHLJ7Skvi8gy7rJzFY1XXSaRWXMsErCVxnuDrdDeVJXFOXtwPkW20dUkoFfvB\nD8L6J0P3aKLchKIorgHwJPHYSjYeA/C/m3itGJ7wBH971FH+dskS4Fe/8ub0jBn+scMPD7VwwCfu\nkRHgjjt8iWpkJFxVbsGCQBInnthOGLRx37Zt+eUm6m6SSuKRR8KK6wce6GyHpeT/6KM+Fis3xWLS\n1JaexIIFupIoKzeRstixo9OTyOlukp5EFeM6p7tJKzfxRJ1ax6C1wFbxDDRfA4jPz+fgJROeZFNq\nYWioff4q3VO53U2ynNW0kuCeikZCXBVRrMzUNjSDJspNUwJLlvjbpzyl/XbuXK8qAOC44/ztMccE\nUtHUwvz5/o9TxmhMSXHLlurlJtm1ROUmqSpo9TWVm7Q211gLLDerSSHMmuXnGxoKi/OkkiATW+tu\nkuUm+g7qlpu0WL/KTTxRa2f62tYb0pPgz2t6MV3ZamZ5th1TAbE5mig3VVESsfmrKgleUkoZ19xs\nN3SPRpTEVMDQkF80t3Spv79qFfD2t/vxvHm+Rnnkkf7+VVcF83RkBNi0KRDBpk1hDi1G5MO7lmjM\nS1Fz5oTYunWeqMi4pjISKQk5HhryP3RK/rNnB0+Cl5R451Os3MRJgo+lJ0HdU1xJcHNaM7Wlkti5\n0/9A5QZ8mu9AZ/qxUhSpPV6rp609tPmlOU2JIuVJpIxrrWQlk6okKF6ykokaqHemn1tuihnLMTXS\nTXdT3XJQN0qiyvwUMzSDPYYkgOBHAD45H3pouL9sWRjvu28Yj4z4WyICGpfFpHp48EHgwAN1ktCM\nazKrJUkMD/v5eUyqBTKjeSlKrszm5SZK/pTQ6UfITW1tLURqMR1XEjSn3F6Dr6GQMSo3xdZJaGUk\nrUtJIxqebDQCIZIoirRnwMtBUkkAYc6cJA40RxKaWqCEmyoHybN52TlUpdwk36P8HmOxOkqiqnFt\nSqJZTPuvkpL/3nuHPaDmz++M8THQaVbzBXOjoz6px2LckCZioNLT7Nl+fkkSRAR8Hye6zxWH9CSo\njMSVhHPt9/k6DK27SW7LEetuinUwpcpNmsqIJf+Y+R07m4+Vouh5zrU/b2LCf/fcX5FKoqpxXafc\nlBPjc8TaS8sW03VbbkopFVluKlMSqe6mXKUiY4ZmYCTRSv6LF4c/LCILHuNjwCf/zZuDWqDx0FBo\nbZUxKhtRUqLjeDsskYQkEKkkuCeRUhK8xERn/YCPa6Uo2d0kS0q02E1TGXzMy0ZcLfAYJ5CYkuAE\nkiKT1AZ/miehPU8jAn5cridB7wvoXOMAtL+P2Bw8Cab2btK6j3I8iarlJh7LKTdpxnU/lIQskRm6\nx7T/KsnwPuig8BhdN/qAA/wtLboDAoHMmxdu+RjwCZ9ueUyWlKRZLctNRBpEBLTimoiA7vMYXZBI\nJn8iBSIJTUnILijuO+R4EilzenS0U2Xw7qZU8pdjSTRauSmHQKQCkWqkzJzmCoQTCCcXrjI0xREr\nWaVKOTQ/0B4jLyaldqSSyC03VV3H0JSSqNMCa0qiWexRnkQdHHss8PSnB8/ivPOAJ7WaeU8+GXjB\nC0LiftWrgFNO8eMUSdBZjHM6SXASIWKg8eGHh9j69e1qYfHi0MHEF9pt3BjGo6M+IcQ8iVmz/PxS\nZdBxsruJ+w6x7iaZ7HPKTZQcZUxTGbQ6ffv2/HITzS/LTTEC4USgKQnZYkvPkQQiFQIvw1QpKdHf\nUW4pivwVqThii+lyPAOgPcFTs0dOos5RElo5K0UgVVpgTUk0h2lPEgsX+pXZhA9+MIyXLQO++91w\n/4tfDGNK/uQ70FiCx2bPDpcnBcJ9vgssLzfxFlhaJ0FKgsakJPh4eLjdd+ClJ64kOIHEupukkkip\nDF5SkovuZIySL5ELEY22CG/hwjDmyYYrFYoR0VCi4DGuEDiBlCV7rRQFlCuEQZAE/37KiICXs1Iq\ngxJunZJPjKCkGqH3T59bklxOCyzFTEk0C+PbmiA1sHBhIALqfBofD8fxGD2Hl5SA4EnEYtKTICWh\neRI0BnRPgpSEbJ1N7d3ES0qpzqc65aYcJcGJgM5wU6Z27mrvWDmrrCwlY5KEYsm/qjldNZYyp2Us\ntZguloC1tRx1y0FEPGVqhH+vufPbYrpmYSRRE7wThohgn3387dhYOI7HuEoA2omBkwK/5VtvyN1i\nY0qCnpsyrmPlJtndJI/TuptiJFG1u6nseTQG0iQhzWktpikE6V1oBjdPwDFPIuZlpMpS2vxVSULz\nLqrGUgv5ZDmragtsGQlpvoYZ14OHfZU1wc9UaN0FkUQsRmfxkgio84nGQCCNefOCMqAdVZ0LZaQy\nJcGTPyV7HuMkJD0JrbtpbCwkipkzw5y8bEQ/UO5raKUonvxT5SY5BjoNbzqblyogFkvNrymJXKKR\n7bd1lESKQFKxJpWK1lmVMqdzWmDLVEBTSsLKTc3CSKImyGAG/O6yQOiGeupTQzKm7T+WLAl/uHQ2\nz4mAj2VMkgptoEftsXIslUTMk5AtsNq2HHydBC8v0RyakqDPyEtMfMzbaKWSSJWb5Pz8WhaUxDUS\nKis3VVESuSRB9+t0N6XO5lPbVWiJOmZcy7P0pstNmnHdjZIw43pwsK+yJs47z1/ICPA/8uuuC3tD\nffnLwG9/68dHHAF8+9thER4dD4RkPn9++1jGuJLgz585s72dVh7H1YKmJEZHO3eSdc7PT1txcCKg\n5xBJSALJJQlt76aYktDWSdB3ULfcVFVJSL+Cl5QkSciz9F6Um7Q1DhoJ8a1JYrGqCieHTJpWEmZc\nDxbTvrupLvbbz/8jnHRSGPPtQZwLbbMESnSkFubPbx9zSCKQ4N6FVBySJEgd0PF0zKxZwRinx3jy\n52pB+hp0HBELj1Hy52MiCSKFMk+CK4SUcZ1aTJerEGKKgJI4lZB4Mksl/9T8kmi0ZJxDLrwcxEuB\nZcY1kK9UpC+glaWkX0F/+5xoUuTCu7OkkqhabjIl0SzsqxwAJElo5Sb6oQGdCoGjTEns2hVIgh6T\nt5TE6XlybQTflkNTErLkQ7GUktA8CSpFAf5HXmZca7FUyYoSmPQrctRIGdHEvIzUYj3uXcTUSJUy\nVV3jOtb5JJ8ny01lLbap1y5TErnmdKpMZWgGRhIDgFZuosRLj1H3FH+sTEloJEH3aczP9FPPi12Q\niJK9PE4rN8WSOG+jlSWlnDbXVEwrWdXxJLSSkiSQHKVSd8V1HdO5zICuSyAxMqlSEksZ0lUUTY6K\nMSXRLOyrHACKwt9SgtcW4dExQJ6SID8BCLdSLcjHYjGuFKTvQMldO06qjNi+TiklkUM0QHcqoIwk\nqLwiVUDVM33+PDnO6WCKdRjldjeV+Q4pAkl1N5UdpyVx7UxfmuYpz4M/hxvjWsyURLMwT6LP+Iu/\n8Bc9AoBnPjOUlwB/Vb2jj/bjl7/cXx8D6PQk+A8gpTI0JcEfo9uYAuElJk4mUo3wFthYuSnnGtca\nSTz2WHuMl8RyPYmqxjXQOafcliO2FqLb7iaKUYLNfR6Qv5iOv3ctwcfWOOSWpaTnUaYk6G9XrqjX\niKZMjdhiuuZhJNFn/Od/hvEznuGNZcKdd4bxmWf6f0Dn4rvJyXCcjAEhaWglJW5q060kDq4G+HGa\nguCxKuUmaoGV3U1lJSVSXUQu2kI+6Umk1kloSkJ77fFx/x1rSiW1vqJudxM3ricm/GunyjyyRTVF\nVinjOva+5PxlSoLO7KsokBQJpZRK7HmGZmBf5W4ASt4LF/pbvu2HjPHHNCWhkYRUEnQWNjTUSQRA\np5KQyZ4e08pN9OPlXUspJVGn3DQxEU/i5PVQq2+OkuDJskwFTE7GW0+l8ZvqbiorRWkxTXHkeBJ1\ny02pVdV1jPEyg7vsteXzDM3AlMRuAEresj0WABYsaL8FwpmiphYkSWilKA5tDp7EKUYJMifBUzcV\nLzdJE5teJ3edRG65iZ8Zx870gU5i0DqTYoman0Vr81OcJ+duu5tow8NYIpUxoJNAaH5OcrK7ifsA\nmrdA74XmL2ud5XNW3V+qzMswNAP7KncDEEkQEfDS0v77t8cAf9YOpJUEVxspY1wSAZ+XKwlJHNLU\nTsWKIt5Gm1onoXVFlZWUNLXAj9NiQ0PlC+3kmObQlIQWq7p3k6YQqqiFsjNx7Xm5voDWPVXW2lpF\nSeTucGtoBkYSuwGIAKikdMghIZnRViD8ut1EIimS4MlQehIcnBB4ggP0UpSMUYKXr0m3fFy13MQ9\nCU4m3DOQ6yRS5rRM8JqSKPMkYmokpVQoGecoFV7O4mficlxW8qlTbuqWhFKL5FKKIPb+zZPoD6zc\ntBtgeBi46KLQ+fTZz4aSwdKlwMc+FojkqqvCRZO0UhERCPkazuWXmwj0A+RKgs7cckiCnu9cu6rQ\nzvSrrJPgZ+ypclNqDvp+UuWsVDmoWyWhzc8/W1l3EyVjeX2J1IruKovpchM1/f9SbPbstAoA4opA\ntrny+bWYKYlmYSSxm+BNbwrj5zwnjGfOBM4+O9x/yUvCmJL4vHmdSkIzv3k7Lp+fzwWEH6AWyyk3\ncUglQRekoePpvhaj53VbbipTEnQ2n3Omz0moqpLIOUunzjZ5ds89DnlmHvM1ZCz12tpxdVpg63gS\ncn7yPGIxUxLNwr7KPRiU9OfP7/QT+IpufpxEjpLQ/AqtFEUxvlBQI5M6JSu+joE+n0YgVUiiyuZ/\nTSmJMhLic6RiMql3s9Cu6qI7bixrBFKnu6mKijEl0SyMJPZgUAmKew2UbDlJ0HUwcklCJnGe4KuS\nRMyfyI1xT4ISJL+vLbrLLWeltuzgngT3K1JJPEdJpEpKco4YEdD8VUztOuWmKua3lsSleqgyf1nM\nSKI5GEnswaCkzH8wO3e23wJhG3Ntc8FUuYkb3nRcao0GxcqUBE/2dL9MSVDSpsd4EucJVz63F+Wm\nbpVETsmHvhdJBHyNixbT5pdn81wFaN1N5HlUVRKaIc1judt3lMWs3NQs7Kvcg3HQQZ2PLVnib489\nNjxGCZjaafmK7pxy09y51ZQEJyGuCLQyk4xVURkypsXrbCCY2uCvm+4mnjjLSj7aHNwEls+r0uYK\npF9bW/+QqySqXk+iTszKTc3CSGIPxkknAVu2hPtbtgArVvjxOee0xzZvDl1RvBRFCZtvQijP9Gm7\nCqC+J8F9h5w5tOTPz9LpfhlJ5CoJ7kGkPIluWmxpLBe05ZabJAmV7S+lEYEkGq3cRDGtnJVSC1xl\nxFSMVCpV5zAl0Tzsq9yD4RwwMhLuj4y0qwAe41fO4yRB5MA7n2S5SVMS0jMA9HKTdlwOSaQMb3p/\nvMWWkgg/jhI+VwixGD1Wx5OgMpXW+USxqh1GNEcqxokntqpaIwJt/jKlUmYsy88WUyqkUmQZqUq5\nyZREszCSMHSAkwQRCVcSlHg5WcTUAk/UZUpCqhGt3JRSEpIkYselFEeZGqG5tTP41Jl+FU8iZ9sP\nem+pzqc6q7E1tRArdcXKTVIFSKVC/0exklXO/GW7wJqSaA72VRo6oJEEVxIU5z94qRZS5nfMk+AJ\nQj5PrrXQkj/FYkol5l2kSILO9GUsVirq1pPgSkWSi0zUFJNn4jymJeqUZ5BbbuKdSbE1DpII5EI4\nml8qAopzr8FaYAcHIwlDBzhJ7LWXv+W7zI6NdR4nz/Q1tZDqbqLnA/pivRxPoi5JpMxvqSToVnoU\nckzH9bq7KXUmXmZca7Eq5aZc41qa07nvX8ZS3VOaUjE0A1txbejA5z4HPPywHy9eDJx1VlhDcfHF\nfu8oADj9dOCVr/TjnJJSap0EX40tz+ZT5SZtRXesxVZTBHQ/t9zEj6EEJsfSd6iiJCjR1VlMV8W4\nji2mKys30fdfRhJlay1i82sxUhV09UVOcCmlYmgGRhKGDlDiB3zn0qWXhvtvfGMYH3IIcMUVfkzb\nfWjKQG5PTmfc/HhOEnWVRIqEtH2pcpRErNykPU8jmqpKoqzcND7e/h1XNbXl/DHFQXPIBE9qMJbg\nNaWSO3+ukki1wPKSlaEZDA36DRj2DFCCpDM5nvSpVEWb5/GYTMpAe10daN/2Q/MmcstNsfdcd42G\nc2k1op2ll8W0ck0/F9M1VW7KURLSy0ipjKpttIbmYF+noVHwzdcIRBK0TQiPUVLm1+iWSkJrj+UJ\nO7fcJFGXJHiSq1qyKovRGoFYqajJxXRai2qV7qY6LbB1lESVFlhTEs3DSMLQKLSaMPkZ1Eartaim\nSCJVbtISfFm5SSqVMpKQiZ2DJzU+rhuTiTWnu6lKTDsTr7uYruqKa5nE6Xk53U25LbCmJJqHeRKG\nRkFbgSxbFh6jHy2RxJ/+KbBpkx/Lzicgr9xUp7tJIockNK9BmyO3QypHZWhn91JVpI4rm6OpclNK\nScR2gY2RBI1jxniu58GJzNAMjCQMjWHNmrC1x9/8DfCa14TYL34BPO1pfnzZZUFxaEqCTG1uhktj\nXCv59MqTkIm9rMVWblRYV2VQ4pOfMzZHikD49bVTFyTKIRqKxbbUqGuMT06G/2ftebktsKYkmoWR\nhKExPP3pYTwy0r7tx3HHhTFtMgjoSoIuiERlquHhTmM8tVivqieRUgGaJ8Hn5wQiyaRpv4ITBj+O\nCCRmXPNYyoegcVkHk5xfjlPloCrGtfQkOAlp18k2T6I3MM41DBSakqAkrCV4ipHa4HPkehLa83KM\na0rS/VISMlZ2XI5xnYrlnOnnlpuaaIGNKYmynWRNSTQL+zoNA4XW3aR1SBE0JVG13ETxqgleM65z\n11pUifEzbf4+yspNfM8ifl+L8ec1WW7i5SCtFFXVuK4yv1QjhmZgJGEYKGjbD16aSq2apVhVJVHV\nk+AbFKbKTSnvIlWKSsW07i9NSdSNaSSRs1YhJ9akktAIpKwF1vZtah7mSRgGCvInaKHdW98KnHCC\nHz/zmcDznx+OfdGL/D+gXUlIU5sSlRYD8lpgOWRi56/NkzJPoLH5U56H9tpNl6y0WJ3uJs0L0M70\nZawKCdElaLVykxnX/YORhGGgmD+//cz8U58K46c9DVi9Otz/1rfCmCsJ2qGWX0WPNh+UMSAvUcfM\naQktwWtkQWNZztKUBEeVcpP22rJDSovxLUB4WYrf58fRHNp2GLx7qszziJWUaP46K66t3NQ8uuJc\n59w+zrlrnXN3OOe+7ZwbiRw36Zz7lXPuJufc17p5TYMBaCcJ6oIiQuBJgh7jW53LJMtLRZTENc8j\nVW7iCV4qlaqeRGx+SSaptRwpcuHfTxUykbFYC2xMPVRVEnXWSZiSaB7dfp3vA3BdURRPAvA9AOdE\njttWFMWxRVE8oyiKP+/yNQ0GVUnQYj2eJORqbx6vqiToVovlKokcTyK3xVaL5ZSbOLopWdVZQ1G2\n9YZUGZJ0rAW2/+iWJM4AcFlrfBmAGAHYf5uhUXCSID+DL8QiSAIBujubL4txNOlJaO9RI4kcFaDN\nX4ck+Nk8N4xjMV6WouNiO7hqRGMtsINBt1/noqIoNgFAURQbARwQOW62c+4XzrmfOufO6PI1DYa2\niyDJ8s7hhwMHtP4SiUA0JcFNbVpApiX93A4p+X60JJ7jSdQpN3WrVOqUm+hWEgg/Rh7XzToJOs48\nif6i1Lh2zn0HwGL+EIACwN9WeJ1Di6LY6Jw7AsD3nHM3F0Vxl3bgqlWrHh8vX74cy5cvr/AyhumC\nj360/doWV1wBHH20H3/hC0FpHHSQv69d1IiIg+8ySwmUG910fOp6Fb3yJOqWrFIEEiulVVUS9Flz\nyUUm8ZwV11VbYKeLkli9ejVW866OHqKUJIqiODkWc85tcs4tLopik3PuQAD3R+bY2Lq9yzm3GsAz\nAJSShMEQw5Il7dt78AslEVkAPmG8+tXtz6VkSeqBEwJfHyGP10gix5NI7STLE3BZuSlFEpKYUn6F\nNn9dksglEK4CZMkqJ1alBXY6KAl5An3++ef37LW65dyrAZzVGq8AcJU8wDm3t3NuuDXeH8BzANza\n5esaDLWRqtGnSCK1WC/lSTTlecgkXLW7KdVi24tykyQJ/rg8XsbkHNycBuK72E4XkugnuiWJjwA4\n2Tl3B4AXAvgwADjnnumcu7h1zFMA3OicuwnAdwH8Q1EUt3f5ugZDbciEyqFtCZJTbqra3cSRUw7S\nyll1S1FNlLNSBKJ9NkkY8rYslrvae7qUm/qJrhbTFUXxMDw5yMd/CeBNrfHPAPyPbl7HYGgSmlpI\nxWS5iUoh/DGexOU26PxMv6oaySUJuR9VVZJostykrcPgx1Vd8Ec+BH9MtsTS2JRE8zDONUwrHHww\ncKF4Bh8AAAzESURBVPzxfvyEJ7TH5s4NW5qfcALw1Kf6sSQJrhq4+U2grc5TnkTK16hTztodlUSs\nC0re5pKLfK6hGdi2HIZphT/+MSSb5z43JHQAeOSRkKjf+lbgTW/yY1lu4smQSELbxbYJTyJXScTm\n0ryMJkiCvwf5fjg0IqiqJKqShCmJZmEkYZhWkImMKwDZXSSvLcHLTQRah0G3QKevUdWTKIt1W27S\n5q9bbqry2eqWszRy0GIpsjLUh5GEwVCCbpWEtjdUyvyuU26SxMRvcz2POuUmLcHHPI9uuptyYqYk\negMjCYOhBKQStA0EiSS4ktBMbalK+BzS/K5TbpJmOV830UtPos78dUtKuca4KYlmYV+nwVACIgBK\ngrRpIBAW5HGSIDLhz0ut6Jbzc+SSRKzkw5NsWXeTtgaCbquUisq6p3KILEUuHKYkeg9TEgZDBs4+\nGzjqKD++4opgeC9aBKxcGUjgS18KXVF8RTclLm0dhtygsInupqq72PJV292uw+Bo0pOQt/IxLW7o\nHkYSBkMGPvaxMD7xxDAeHgb4TjJnnhnGWtLS1mGkSEJ6GfyxfhrjTXgS3ZaztDKSlZt6D/s6DYYe\nIbVYL6UkOHITfK7iiM1RNQHXIahUOSvVwWTlpsHCSMJg6BFyV3QTOVB5iidsbUW39DWqrIUoi/H3\n1islUbfcpL1/HpPHGZqBkYTB0CPkkoQ8A+alJSIQnvjID+GxKkTQ672hOFLHVTWurdw0GNjXaTD0\nCPvv3/nYkUf62yc9qTOpjrSuEK/5FaQygNDuyo3xbo3ruuWmfigJI4nBwr5Og6FHOP10YMOGcH/D\nhmBsn3cecN99IXbvvYFAUqUooNPXyG1znWpKoqqpXZWEDM3AupsMhh5haMhfGY/Ax8PD4RKrQPsF\nlFKdT0C6ZNWv7iZ+rDxe8ww0czplamvPM09iMDDONRimGMqUhHacNLhT5jeP1S3l1FEqsfUOVm6a\n2rCv02CYYqijJOSKbs38puTJY1p7rKYk5HHdeB6aojDjeurCvk6DYYqBJ1lSEJqS0MouBJ4oUy22\ndf2E2HF1YzktsFXLWYZmYJ6EwTDF8KlPhTbXvfcGTj01nP2vWgU85zl+fMIJwFlntT83Zx1GbIM8\nCX5WX0UtNNE9pe30WlbqMiXRGxhJGAxTDCtWhPH8+cA114T7K1eG8bJlwKWXtj+3LkmUlZtSpnC3\nxrhWbuLH5sxvSqJ3MJIwGPYg8LNsQqpkJbcw53PwWI45XVVJaJ1J3agR2+CvNzDONRj2IKRIgpI+\nT6KaT0GlLh7TLrhEaFJJlPkOZTFD87Cv1mDYg5BaQ0HQSlH8+hY0BycXudV5r7ubOKq038rPZ+ge\nVm4yGPYgLFrkbxcv7ozRxZCOPBLYutWPtVJU7FKoPMbRbXdTVWM8NoehNzCSMBj2EFx/PXD00X78\ngQ8Ab35ziP3wh8CTn+zHV18d9n/SlATFUhsUdpPEq6zolsdVmd/QDIwkDIY9BMcfH8b77uv/EZ73\nvDA+9NAwTpnaudfD0K7frZnfsfmrrIUoixmah321BsM0RmoDwRRJ8KQvze9UjM9bt9xknkR/YUrC\nYJjG4NuNE3JIgid92T2VivF5q67DME9iMDCSMBimMXK3/ZDQ2mi1xXoaCRFyF8JVLTeZkmgWRhIG\nwzTGggX+ls70Tz8deOlL/fjoo4GDDw7HHnEEsHy5H6eIoAmSqLrLrJFE72AkYTBMY+y9d3vS/eY3\nw/i444B77gn3//CHMM4liZTnkVrRzZN+TrnJriHRO1glz2AwVEY35aaJifaYtqKbJ33zJAYL+2oN\nBkNlaBc8mqnUJTSSoHUY/GJINB/FUt1Q2vswkugd7Ks1GAyVwUlCegBlSkK20abWUAD1F+sZmoF5\nEgaDoTL4lfIIRAgLFwKTk35MyVvzJDTU3fbDlETvYCRhMBgq44ILgNe8Jtz/t38DnvhEP/7mN0PZ\n6MADgUsu0c/uU+swOLT1FwRNjaRIyFAdRhIGg6EyDj/c/yO87nVhfOyxYTxzJvD61+tzpEhC8zy4\noiCloq3oJmPc0AxMpBkMhr4itaKboJGE1h4rY0BQMYZmYCRhMBimDDQCqbpYz8pNzcJIwmAw9BU5\nSZwfI1tsy9pvjSSahZGEwWDoG5YuBU480Y/5lh+Epz3N3x57LLD//n6c2tqDHtNihmZgxrXBYOgb\nfve70D576qnAjh0htmMHMGeOH597LvDud/uxJAIrN/UXRhIGg6FvIBLQ7vOxc+F+ypMwJdF7WLnJ\nYDBMaWhXviOYkug9jCQMBsOURmrbDzOuew8jCYPBsFuAlIS2WI4rCds2vFmYJ2EwGKY8/vqvgWXL\n/PgrXwkL5hYtAt71rqAuLr64fcW3oXu4ogtt5pz7CwCrADwFwHFFUfwqctxpAD4Or1wuKYriI5Hj\nim7ej8FgMExHOOdQFEVP9r/tttx0C4CXAvhB7ADn3BCACwGcCuBPALzSOffkLl93j8fq1asH/Ram\nDOy7CLDvIsC+i/6gK5IoiuKOoijWAkgx2PEA1hZF8ceiKMYBXAngjG5edzrAfgAB9l0E2HcRYN9F\nf9AP43opAHalXKxvPWYwGAyGKY5S49o59x0Ai/lDAAoA5xVF8fWM19BUhhkPBoPBsBugK+P68Umc\n+z6Ad2vGtXPuWQBWFUVxWuv++wAUmnntnDPyMBgMhhrolXHdZAts7A3eAGCZc+4wAPcBOBPAK7UD\ne/UhDQaDwVAPXXkSzrk/d87dA+BZAL7hnPvv1uMHOee+AQBFUUwCeDuAawH8FsCVRVHc1t3bNhgM\nBkM/0Ei5yWAwGAx7JqbMthzOudOcc7c75+50zr130O+nV3DOrXPO/do5d5Nz7hetx/Zxzl3rnLvD\nOfdt59wIO/6fnXNrnXNrnHPHsMdXtL6rO5xzrx3EZ6kK59wlzrlNzrmb2WONfXbn3LHOuZtbsY/3\n75NVR+S7WOmcW++c+1Xr32ksdk7ru7jNOXcKe1z93TjnDnfO/bz1HX3JOTcld1dwzh3snPuec+5W\n59wtzrl3th6fdn8Xynfxjtbjg/27KIpi4P/gyep3AA4DMAvAGgBPHvT76tFn/QOAfcRjHwHw/1rj\n9wL4cGv8IgDfbI3/FMDPW+N9APwewAiAvWk86M+W8dmfC+AYADf34rMDuB7A8a3xtwCcOujPXPG7\nWAngr5VjnwLgJngP8fDWb8WlfjcA/h3Ay1vjzwB486A/c+R7OBDAMa3xAgB3AHjydPy7SHwXA/27\nmCpKYjotuKP/RI4zAFzWGl+G8NnPAHA5ABRFcT2AEefcYvjV69cWRbG1KIot8H7PaZjiKIrixwA2\ni4cb+ezOuQMBLCyK4het518O4M979mG6ROS7APQGkDPgvbyJoijWAVgL/5tJ/W5eAOArrfFl8Dsj\nTDkURbGxKIo1rfFjAG4DcDCm4d9F5LugNWUD+7uYKiQxnRbcFQC+7Zy7wTn3htZji4ui2AT4PxQA\ni1qPx74X+fi92H2/r0UNffalrWPk8bsb3tYqo/wrK7GkPnPHd+Sc2w/A5qIodrHHl/T4fXcN59zh\n8Orq52juN7Fb/l2w7+L61kMD+7uYKiQxnRbcPacoiv8J4HT4//jnIf5Z5fdCCxmnw/dV9bPvCd/J\npwEcWRTFMQA2Avin1uNVP7NTYlP6u3DOLQDwZQD/t3UW3dRvYrf7u1C+i4H+XUwVklgP4FB2/2AA\nGwb0XnqK1lkRiqJ4AMDX4KXhppZkRkse3986fD2AQ9jT6XvZk76vpj577PjdBkVRPFC0isUAPgv/\ntwFU/C6KongQwN7Ob67Jj5+SaJmnXwbw+aIormo9PC3/LrTvYtB/F1OFJB5fcOecG4ZfcHf1gN9T\n43DOzWudJcA5Nx/AKfA76V4N4KzWYWcBoB/K1QBe2zr+WQC2tCT4twGc7Jwbcc7tA+Dk1mO7A+TZ\nTCOfvUW+jzjnjnfOudZzr8LURtt30UqGhJcB+E1rfDWAM51zw865IwAsA/AL6L8b+szfA/Dy1ngF\npvZ38W8Abi2K4hPssen6d9HxXQz872LQjj5z6k+Dd/PXAnjfoN9Pjz7jEfCdBjfBk8P7Wo/vC+C6\n1uf/DoC92XMuhO9U+DWAY9njZ7W+qzsBvHbQny3z818Bf+YyBuBuAK+D70pp5LMDeGbre10L4BOD\n/rw1vovLAdzc+hv5Gnxdno4/p/Vd3AbgFPa4+rtp/a1d3/qO/h3ArEF/5sj38L8ATLLfxa9an6mx\n38Tu8neR+C4G+ndhi+kMBoPBEMVUKTcZDAaDYQrCSMJgMBgMURhJGAwGgyEKIwmDwWAwRGEkYTAY\nDIYojCQMBoPBEIWRhMFgMBiiMJIwGAwGQxT/H4dzZ7cLgp0cAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(wave)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [], "source": [ "duration=20.0\n", "rate=22050\n", "nsamples=duration*rate\n", "repeats=int(nsamples/length)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data=[diracs * repeats, wave * repeats]" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "ndata = np.uint8(np.array(data) * 127.0 + 128.0)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(430080, 2)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ndata = np.swapaxes(ndata, 0, 1)\n", "ndata.shape" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from scipy.io.wavfile import write\n", "write('/tmp/test.wav', rate, ndata)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 } sonic-visualiser-3.0.3/vamp-plugin-sdk/test/testsignal.wav0000644000000000000000000322005413111512442022033 0ustar 00000000000000RIFF$ WAVEfmt "VD¬data €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€„€„€„€„€„€„€„€„€„€…€…€…€…€…€…€…€…€…€…€…€…€…€…€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€†€…€…€…€…€…€…€…€…€…€…€…€…€…€…€„€„€„€„€„€„€„€„€„€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€}€}€}€}€}€}€}€|€|€|€|€|€|€|€{€{€{€{€{€{€{€{€{€z€z€z€z€z€z€z€z€z€z€z€z€z€z€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€y€z€z€z€z€z€z€z€z€z€z€z€z€z€z€{€{€{€{€{€{€{€{€{€|€|€|€|€|€|€|€}€}€}€}€}€}€}€~€~€~€~€~€~€~€€€€€€Œ€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€€€€€€€€€€€€‚€‚€‚€ƒ€ƒ€ƒ€ƒ€„€„€„€…€…€…€…€†€†€†€‡€‡€‡€‡€ˆ€ˆ€ˆ€ˆ€ˆ€‰€‰€‰€‰€Š€Š€Š€Š€Š€Š€‹€‹€‹€‹€‹€‹€‹€‹€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€Œ€‹€‹€‹€‹€‹€‹€‹€‹€Š€Š€Š€Š€Š€Š€‰€‰€‰€‰€ˆ€ˆ€ˆ€ˆ€ˆ€‡€‡€‡€‡€†€†€†€…€…€…€…€„€„€„€ƒ€ƒ€ƒ€ƒ€‚€‚€‚€€€€€€€€€€€€€€€~€~€~€}€}€}€|€|€|€|€{€{€{€z€z€z€z€y€y€y€x€x€x€x€w€w€w€w€w€v€v€v€v€u€u€u€u€u€u€t€t€t€t€t€t€t€t€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€s€t€t€t€t€t€t€t€t€u€u€u€u€u€u€v€v€v€v€w€w€w€w€w€x€x€x€x€y€y€y€z€z€z€z€{€{€{€|€|€|€|€}€}€}€~€~€~€€€“€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€€€€€€€€€‚€‚€ƒ€ƒ€„€„€…€…€…€†€†€‡€‡€ˆ€ˆ€ˆ€‰€‰€Š€Š€Š€‹€‹€Œ€Œ€Œ€€€€Ž€Ž€Ž€€€€€€€€€‘€‘€‘€‘€‘€‘€’€’€’€’€’€’€’€’€’€’€’€“€“€“€“€“€’€’€’€’€’€’€’€’€’€’€’€‘€‘€‘€‘€‘€‘€€€€€€€€€Ž€Ž€Ž€€€€Œ€Œ€Œ€‹€‹€Š€Š€Š€‰€‰€ˆ€ˆ€ˆ€‡€‡€†€†€…€…€…€„€„€ƒ€ƒ€‚€‚€€€€€€€€€€€~€~€}€}€|€|€{€{€z€z€z€y€y€x€x€w€w€w€v€v€u€u€u€t€t€s€s€s€r€r€r€q€q€q€p€p€p€p€o€o€o€o€n€n€n€n€n€n€m€m€m€m€m€m€m€m€m€m€m€l€l€l€l€l€m€m€m€m€m€m€m€m€m€m€m€n€n€n€n€n€n€o€o€o€o€p€p€p€p€q€q€q€r€r€r€s€s€s€t€t€u€u€u€v€v€w€w€w€x€x€y€y€z€z€z€{€{€|€|€}€}€~€~€€™€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€€€€€€€‚€ƒ€ƒ€„€„€…€†€†€‡€‡€ˆ€‰€‰€Š€Š€‹€‹€Œ€€€Ž€Ž€€€€€‘€‘€‘€’€’€“€“€”€”€”€•€•€•€–€–€–€–€—€—€—€—€˜€˜€˜€˜€˜€˜€™€™€™€™€™€™€™€™€™€™€™€™€™€™€™€˜€˜€˜€˜€˜€˜€—€—€—€—€–€–€–€–€•€•€•€”€”€”€“€“€’€’€‘€‘€‘€€€€€Ž€Ž€€€Œ€‹€‹€Š€Š€‰€‰€ˆ€‡€‡€†€†€…€„€„€ƒ€ƒ€‚€€€€€€€€~€~€}€|€|€{€{€z€y€y€x€x€w€v€v€u€u€t€t€s€r€r€q€q€p€p€o€o€n€n€n€m€m€l€l€k€k€k€j€j€j€i€i€i€i€h€h€h€h€g€g€g€g€g€g€f€f€f€f€f€f€f€f€f€f€f€f€f€f€f€g€g€g€g€g€g€h€h€h€h€i€i€i€i€j€j€j€k€k€k€l€l€m€m€n€n€n€o€o€p€p€q€q€r€r€s€t€t€u€u€v€v€w€x€x€y€y€z€{€{€|€|€}€~€~€Ÿ€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€€€€€€‚€ƒ€ƒ€„€…€†€†€‡€ˆ€‰€‰€Š€‹€Œ€Œ€€Ž€Ž€€€€‘€’€’€“€”€”€•€•€–€–€—€˜€˜€™€™€™€š€š€›€›€œ€œ€œ€€€€€ž€ž€ž€ž€ž€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ž€ž€ž€ž€ž€€€€€œ€œ€œ€›€›€š€š€™€™€™€˜€˜€—€–€–€•€•€”€”€“€’€’€‘€€€€Ž€Ž€€Œ€Œ€‹€Š€‰€‰€ˆ€‡€†€†€…€„€ƒ€ƒ€‚€€€€€€~€}€|€|€{€z€y€y€x€w€v€v€u€t€s€s€r€q€q€p€o€o€n€m€m€l€k€k€j€j€i€i€h€g€g€f€f€f€e€e€d€d€c€c€c€b€b€b€b€a€a€a€a€a€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€`€a€a€a€a€a€b€b€b€b€c€c€c€d€d€e€e€f€f€f€g€g€h€i€i€j€j€k€k€l€m€m€n€o€o€p€q€q€r€s€s€t€u€v€v€w€x€y€y€z€{€|€|€}€~€¦€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€‹€Œ€€Ž€€€‘€‘€’€“€”€•€•€–€—€˜€˜€™€š€š€›€œ€œ€€ž€ž€Ÿ€Ÿ€ € €¡€¡€¢€¢€¢€£€£€£€¤€¤€¤€¤€¥€¥€¥€¥€¥€¥€¥€¦€¦€¦€¦€¦€¥€¥€¥€¥€¥€¥€¥€¤€¤€¤€¤€£€£€£€¢€¢€¢€¡€¡€ € €Ÿ€Ÿ€ž€ž€€œ€œ€›€š€š€™€˜€˜€—€–€•€•€”€“€’€‘€‘€€€Ž€€Œ€‹€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€€€~€}€|€{€z€y€x€w€v€u€t€t€s€r€q€p€o€n€n€m€l€k€j€j€i€h€g€g€f€e€e€d€c€c€b€a€a€`€`€_€_€^€^€]€]€]€\€\€\€[€[€[€[€Z€Z€Z€Z€Z€Z€Z€Y€Y€Y€Y€Y€Z€Z€Z€Z€Z€Z€Z€[€[€[€[€\€\€\€]€]€]€^€^€_€_€`€`€a€a€b€c€c€d€e€e€f€g€g€h€i€j€j€k€l€m€n€n€o€p€q€r€s€t€t€u€v€w€x€y€z€{€|€}€~€¬€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€‘€’€“€“€”€•€–€—€˜€™€š€›€œ€€€ž€Ÿ€ € €¡€¢€£€£€¤€¤€¥€¦€¦€§€§€¨€¨€©€©€©€ª€ª€ª€«€«€«€«€«€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€¬€«€«€«€«€«€ª€ª€ª€©€©€©€¨€¨€§€§€¦€¦€¥€¤€¤€£€£€¢€¡€ € €Ÿ€ž€€€œ€›€š€™€˜€—€–€•€”€“€“€’€‘€€Ž€€Œ€‹€Š€‰€ˆ€‡€†€…€„€ƒ€‚€€€~€}€|€{€z€y€x€w€v€u€t€s€r€q€p€n€m€l€l€k€j€i€h€g€f€e€d€c€b€b€a€`€_€_€^€]€\€\€[€[€Z€Y€Y€X€X€W€W€V€V€V€U€U€U€T€T€T€T€T€S€S€S€S€S€S€S€S€S€S€S€T€T€T€T€T€U€U€U€V€V€V€W€W€X€X€Y€Y€Z€[€[€\€\€]€^€_€_€`€a€b€b€c€d€e€f€g€h€i€j€k€l€l€m€n€p€q€r€s€t€u€v€w€x€y€z€{€|€}€~²€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~€€€‚€ƒ€„€†€‡€ˆ€‰€‹€Œ€€Ž€€‘€’€“€”€•€–€—€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€£€¤€¥€¦€§€¨€¨€©€ª€ª€«€¬€¬€­€­€®€®€¯€¯€°€°€°€±€±€±€²€²€²€²€²€²€²€²€²€²€²€²€²€²€²€±€±€±€°€°€°€¯€¯€®€®€­€­€¬€¬€«€ª€ª€©€¨€¨€§€¦€¥€¤€£€£€¢€¡€ €Ÿ€ž€€œ€›€š€™€—€–€•€”€“€’€‘€€Ž€€Œ€‹€‰€ˆ€‡€†€„€ƒ€‚€€€~€}€|€{€y€x€w€v€t€s€r€q€p€n€m€l€k€j€i€h€f€e€d€c€b€a€`€_€^€]€\€\€[€Z€Y€X€W€W€V€U€U€T€S€S€R€R€Q€Q€P€P€O€O€O€N€N€N€M€M€M€M€M€M€M€M€M€M€M€M€M€M€M€N€N€N€O€O€O€P€P€Q€Q€R€R€S€S€T€U€U€V€W€W€X€Y€Z€[€\€\€]€^€_€`€a€b€c€d€e€f€h€i€j€k€l€m€n€p€q€r€s€t€v€w€x€y€{€|€}€~¹€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~€€€‚€„€…€†€ˆ€‰€‹€Œ€€€€‘€“€”€•€—€˜€™€š€œ€€ž€Ÿ€ €¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€­€®€¯€°€±€±€²€³€³€´€´€µ€µ€¶€¶€·€·€·€¸€¸€¸€¸€¸€¸€¹€¹€¹€¹€¹€¸€¸€¸€¸€¸€¸€·€·€·€¶€¶€µ€µ€´€´€³€³€²€±€±€°€¯€®€­€­€¬€«€ª€©€¨€§€¦€¥€¤€£€¢€ €Ÿ€ž€€œ€š€™€˜€—€•€”€“€‘€€€€Œ€‹€‰€ˆ€†€…€„€‚€€€~€}€{€z€y€w€v€t€s€r€p€o€n€l€k€j€h€g€f€e€c€b€a€`€_€]€\€[€Z€Y€X€W€V€U€T€S€R€R€Q€P€O€N€N€M€L€L€K€K€J€J€I€I€H€H€H€G€G€G€G€G€G€F€F€F€F€F€G€G€G€G€G€G€H€H€H€I€I€J€J€K€K€L€L€M€N€N€O€P€Q€R€R€S€T€U€V€W€X€Y€Z€[€\€]€_€`€a€b€c€e€f€g€h€j€k€l€n€o€p€r€s€t€v€w€y€z€{€}€~¿€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~€€€ƒ€„€†€‡€‰€Š€Œ€€€€’€“€•€–€˜€™€›€œ€€Ÿ€ €¡€£€¤€¥€§€¨€©€ª€«€¬€­€¯€°€±€²€³€³€´€µ€¶€·€¸€¸€¹€º€º€»€»€¼€¼€½€½€½€¾€¾€¾€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¿€¾€¾€¾€½€½€½€¼€¼€»€»€º€º€¹€¸€¸€·€¶€µ€´€³€³€²€±€°€¯€­€¬€«€ª€©€¨€§€¥€¤€£€¡€ €Ÿ€€œ€›€™€˜€–€•€“€’€€€€Œ€Š€‰€‡€†€„€ƒ€€€€~€|€{€y€x€v€u€s€r€p€o€m€l€j€i€g€f€d€c€b€`€_€^€\€[€Z€X€W€V€U€T€S€R€P€O€N€M€L€L€K€J€I€H€G€G€F€E€E€D€D€C€C€B€B€B€A€A€A€@€@€@€@€@€@€@€@€@€@€@€A€A€A€B€B€B€C€C€D€D€E€E€F€G€G€H€I€J€K€L€L€M€N€O€P€R€S€T€U€V€W€X€Z€[€\€^€_€`€b€c€d€f€g€i€j€l€m€o€p€r€s€u€v€x€y€{€|€~Å€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~€€€€ƒ€…€†€ˆ€Š€‹€€€€’€”€•€—€™€š€œ€€Ÿ€ €¢€£€¥€¦€¨€©€ª€¬€­€®€°€±€²€³€´€µ€·€¸€¹€º€»€»€¼€½€¾€¿€¿€À€Á€Á€Â€Â€Ã€Ã€Ä€Ä€Ä€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Å€Ä€Ä€Ä€Ã€Ã€Â€Â€Á€Á€À€¿€¿€¾€½€¼€»€»€º€¹€¸€·€µ€´€³€²€±€°€®€­€¬€ª€©€¨€¦€¥€£€¢€ €Ÿ€€œ€š€™€—€•€”€’€€€€‹€Š€ˆ€†€…€ƒ€€€€~€|€z€y€w€u€t€r€p€o€m€k€j€h€f€e€c€b€`€_€]€\€Z€Y€W€V€U€S€R€Q€O€N€M€L€K€J€H€G€F€E€D€D€C€B€A€@€@€?€>€>€=€=€<€<€;€;€;€:€:€:€:€:€:€:€:€:€:€:€:€:€;€;€;€<€<€=€=€>€>€?€@€@€A€B€C€D€D€E€F€G€H€J€K€L€M€N€O€Q€R€S€U€V€W€Y€Z€\€]€_€`€b€c€e€f€h€j€k€m€o€p€r€t€u€w€y€z€|€~Ì€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~€€€ƒ€…€‡€‰€‹€€Ž€€’€”€–€—€™€›€€ž€ €¢€£€¥€§€¨€ª€«€­€®€°€±€³€´€µ€·€¸€¹€º€¼€½€¾€¿€À€Á€Â€Ã€Ä€Ä€Å€Æ€Ç€Ç€È€È€É€É€Ê€Ê€Ë€Ë€Ë€Ë€Ë€Ì€Ì€Ì€Ì€Ì€Ë€Ë€Ë€Ë€Ë€Ê€Ê€É€É€È€È€Ç€Ç€Æ€Å€Ä€Ä€Ã€Â€Á€À€¿€¾€½€¼€º€¹€¸€·€µ€´€³€±€°€®€­€«€ª€¨€§€¥€£€¢€ €ž€€›€™€—€–€”€’€€Ž€€‹€‰€‡€…€ƒ€€€€~€|€z€x€v€t€r€q€o€m€k€i€h€f€d€b€a€_€]€\€Z€X€W€U€T€R€Q€O€N€L€K€J€H€G€F€E€C€B€A€@€?€>€=€<€;€;€:€9€8€8€7€7€6€6€5€5€4€4€4€4€4€3€3€3€3€3€4€4€4€4€4€5€5€6€6€7€7€8€8€9€:€;€;€<€=€>€?€@€A€B€C€E€F€G€H€J€K€L€N€O€Q€R€T€U€W€X€Z€\€]€_€a€b€d€f€h€i€k€m€o€q€r€t€v€x€z€|€~Ò€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}€€€‚€„€†€ˆ€Š€Œ€Ž€€’€”€–€—€™€›€€Ÿ€¡€£€¥€¦€¨€ª€¬€­€¯€±€²€´€µ€·€¸€º€»€½€¾€¿€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Í€Î€Î€Ï€Ð€Ð€Ð€Ñ€Ñ€Ñ€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ò€Ñ€Ñ€Ñ€Ð€Ð€Ð€Ï€Î€Î€Í€Í€Ì€Ë€Ê€É€È€Ç€Æ€Å€Ä€Ã€Â€Á€¿€¾€½€»€º€¸€·€µ€´€²€±€¯€­€¬€ª€¨€¦€¥€£€¡€Ÿ€€›€™€—€–€”€’€€Ž€Œ€Š€ˆ€†€„€‚€€€}€{€y€w€u€s€q€o€m€k€i€h€f€d€b€`€^€\€Z€Y€W€U€S€R€P€N€M€K€J€H€G€E€D€B€A€@€>€=€<€;€:€9€8€7€6€5€4€3€2€2€1€1€0€/€/€/€.€.€.€-€-€-€-€-€-€-€-€-€.€.€.€/€/€/€0€1€1€2€2€3€4€5€6€7€8€9€:€;€<€=€>€@€A€B€D€E€G€H€J€K€M€N€P€R€S€U€W€Y€Z€\€^€`€b€d€f€h€i€k€m€o€q€s€u€w€y€{€}Ø€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}€€‚€„€†€ˆ€Š€€€‘€“€•€—€™€›€€Ÿ€¢€¤€¦€§€©€«€­€¯€±€³€´€¶€¸€º€»€½€¾€À€Á€Ã€Ä€Æ€Ç€È€É€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ò€Ó€Ô€Õ€Õ€Ö€Ö€×€×€×€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€Ø€×€×€×€Ö€Ö€Õ€Õ€Ô€Ó€Ò€Ò€Ñ€Ð€Ï€Î€Í€Ì€Ë€É€È€Ç€Æ€Ä€Ã€Á€À€¾€½€»€º€¸€¶€´€³€±€¯€­€«€©€§€¦€¤€¢€Ÿ€€›€™€—€•€“€‘€€€Š€ˆ€†€„€‚€€€}€{€y€w€u€r€p€n€l€j€h€f€d€b€`€]€[€Y€X€V€T€R€P€N€L€K€I€G€E€D€B€A€?€>€<€;€9€8€7€6€4€3€2€1€0€/€.€-€-€,€+€*€*€)€)€(€(€(€'€'€'€'€'€'€'€'€'€'€'€(€(€(€)€)€*€*€+€,€-€-€.€/€0€1€2€3€4€6€7€8€9€;€<€>€?€A€B€D€E€G€I€K€L€N€P€R€T€V€X€Y€[€]€`€b€d€f€h€j€l€n€p€r€u€w€y€{€}߀‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}€€€‚€„€‡€‰€‹€€€’€”€—€™€›€€ €¢€¤€¦€¨€ª€¬€®€°€²€´€¶€¸€º€¼€¾€¿€Á€Ã€Ä€Æ€È€É€Ë€Ì€Í€Ï€Ð€Ñ€Ò€Ô€Õ€Ö€×€×€Ø€Ù€Ú€Û€Û€Ü€Ü€Ý€Ý€Þ€Þ€Þ€Þ€ß€ß€ß€ß€ß€Þ€Þ€Þ€Þ€Ý€Ý€Ü€Ü€Û€Û€Ú€Ù€Ø€×€×€Ö€Õ€Ô€Ò€Ñ€Ð€Ï€Í€Ì€Ë€É€È€Æ€Ä€Ã€Á€¿€¾€¼€º€¸€¶€´€²€°€®€¬€ª€¨€¦€¤€¢€ €€›€™€—€”€’€€€‹€‰€‡€„€‚€€€}€{€x€v€t€r€o€m€k€h€f€d€b€_€]€[€Y€W€U€S€Q€O€M€K€I€G€E€C€A€@€>€<€;€9€7€6€4€3€2€0€/€.€-€+€*€)€(€(€'€&€%€$€$€#€#€"€"€!€!€!€!€ € € € € €!€!€!€!€"€"€#€#€$€$€%€&€'€(€(€)€*€+€-€.€/€0€2€3€4€6€7€9€;€<€>€@€A€C€E€G€I€K€M€O€Q€S€U€W€Y€[€]€_€b€d€f€h€k€m€o€r€t€v€x€{€}倂€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}€€‚€„€‡€‰€Œ€Ž€‘€“€–€˜€›€€Ÿ€¢€¤€¦€©€«€­€¯€²€´€¶€¸€º€¼€¾€À€Â€Ä€Æ€Ç€É€Ë€Ì€Î€Ð€Ñ€Ó€Ô€Õ€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€á€â€ã€ã€ä€ä€ä€å€å€å€å€å€å€å€å€å€ä€ä€ä€ã€ã€â€á€á€à€ß€Þ€Ý€Ü€Û€Ú€Ù€Ø€×€Õ€Ô€Ó€Ñ€Ð€Î€Ì€Ë€É€Ç€Æ€Ä€Â€À€¾€¼€º€¸€¶€´€²€¯€­€«€©€¦€¤€¢€Ÿ€€›€˜€–€“€‘€Ž€Œ€‰€‡€„€‚€€€}€{€x€v€s€q€n€l€i€g€d€b€`€]€[€Y€V€T€R€P€M€K€I€G€E€C€A€?€=€;€9€8€6€4€3€1€/€.€,€+€*€(€'€&€%€$€#€"€!€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€*€+€,€.€/€1€3€4€6€8€9€;€=€?€A€C€E€G€I€K€M€P€R€T€V€Y€[€]€`€b€d€g€i€l€n€q€s€v€x€{€}뀀‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}€€€‚€…€‡€Š€€€’€•€—€š€œ€Ÿ€¡€¤€¦€©€«€®€°€²€µ€·€¹€»€¾€À€Â€Ä€Æ€È€Ê€Ì€Î€Ï€Ñ€Ó€Õ€Ö€Ø€Ù€Û€Ü€Ý€ß€à€á€â€ã€ä€å€æ€ç€è€è€é€é€ê€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ê€é€é€è€è€ç€æ€å€ä€ã€â€á€à€ß€Ý€Ü€Û€Ù€Ø€Ö€Õ€Ó€Ñ€Ï€Î€Ì€Ê€È€Æ€Ä€Â€À€¾€»€¹€·€µ€²€°€®€«€©€¦€¤€¡€Ÿ€œ€š€—€•€’€€€Š€‡€…€‚€€€}€z€x€u€r€p€m€j€h€e€c€`€^€[€Y€V€T€Q€O€M€J€H€F€D€A€?€=€;€9€7€5€3€1€0€.€,€*€)€'€&€$€#€"€ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ €"€#€$€&€'€)€*€,€.€0€1€3€5€7€9€;€=€?€A€D€F€H€J€M€O€Q€T€V€Y€[€^€`€c€e€h€j€m€p€r€u€x€z€}ò€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}€€‚€…€ˆ€‹€€€“€–€™€›€ž€¡€£€¦€©€«€®€°€³€µ€¸€º€½€¿€Á€Ä€Æ€È€Ê€Ì€Î€Ð€Ò€Ô€Ö€Ø€Ú€Û€Ý€ß€à€â€ã€ä€æ€ç€è€é€ê€ë€ì€í€î€î€ï€ð€ð€ñ€ñ€ñ€ñ€ò€ò€ò€ò€ò€ñ€ñ€ñ€ñ€ð€ð€ï€î€î€í€ì€ë€ê€é€è€ç€æ€ä€ã€â€à€ß€Ý€Û€Ú€Ø€Ö€Ô€Ò€Ð€Î€Ì€Ê€È€Æ€Ä€Á€¿€½€º€¸€µ€³€°€®€«€©€¦€£€¡€ž€›€™€–€“€€€‹€ˆ€…€‚€€€}€z€w€t€r€o€l€i€f€d€a€^€\€Y€V€T€Q€O€L€J€G€E€B€@€>€;€9€7€5€3€1€/€-€+€)€'€%€$€"€ €€€€€€€€€€€€€€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€€€€ €"€$€%€'€)€+€-€/€1€3€5€7€9€;€>€@€B€E€G€J€L€O€Q€T€V€Y€\€^€a€d€f€i€l€o€r€t€w€z€}ø€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}€€€‚€…€ˆ€‹€Ž€‘€”€—€š€€ €£€¥€¨€«€®€°€³€¶€¸€»€¾€À€Ã€Å€Ç€Ê€Ì€Î€Ñ€Ó€Õ€×€Ù€Û€Ý€ß€à€â€ä€å€ç€è€ê€ë€í€î€ï€ð€ñ€ò€ó€ô€õ€õ€ö€ö€÷€÷€ø€ø€ø€ø€ø€ø€ø€ø€ø€÷€÷€ö€ö€õ€õ€ô€ó€ò€ñ€ð€ï€î€í€ë€ê€è€ç€å€ä€â€à€ß€Ý€Û€Ù€×€Õ€Ó€Ñ€Î€Ì€Ê€Ç€Å€Ã€À€¾€»€¸€¶€³€°€®€«€¨€¥€£€ €€š€—€”€‘€Ž€‹€ˆ€…€‚€€€}€z€w€t€q€n€k€h€e€b€_€\€Z€W€T€Q€O€L€I€G€D€A€?€<€:€8€5€3€1€.€,€*€(€&€$€"€ €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ € € € € € € €€€€€€€€€€€€€€ €"€$€&€(€*€,€.€1€3€5€8€:€<€?€A€D€G€I€L€O€Q€T€W€Z€\€_€b€e€h€k€n€q€t€w€z€}sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/Plugin.h0000644000000000000000000000346413111512442022210 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_HOSTSDK_PLUGIN_H_ #define _VAMP_HOSTSDK_PLUGIN_H_ // Do not include vamp-sdk/Plugin.h directly from host code. Always // use this header instead. #include "hostguard.h" #include #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginBase.h0000644000000000000000000000350513111512442022777 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_HOSTSDK_PLUGIN_BASE_H_ #define _VAMP_HOSTSDK_PLUGIN_BASE_H_ // Do not include vamp-sdk/PluginBase.h directly from host code. // Always use this header instead. #include "hostguard.h" #include #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginBufferingAdapter.h0000644000000000000000000001611213111512442025333 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. This file by Mark Levy and Chris Cannam, Copyright 2007-2008 QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_BUFFERING_ADAPTER_H_ #define _VAMP_PLUGIN_BUFFERING_ADAPTER_H_ #include "hostguard.h" #include "PluginWrapper.h" _VAMP_SDK_HOSTSPACE_BEGIN(PluginBufferingAdapter.h) namespace Vamp { namespace HostExt { /** * \class PluginBufferingAdapter PluginBufferingAdapter.h * * PluginBufferingAdapter is a Vamp plugin adapter that allows plugins * to be used by a host supplying an audio stream in non-overlapping * buffers of arbitrary size. * * A host using PluginBufferingAdapter may ignore the preferred step * and block size reported by the plugin, and still expect the plugin * to run. The value of blockSize and stepSize passed to initialise * should be the size of the buffer which the host will supply; the * stepSize should be equal to the blockSize. * * If the internal step size used for the plugin differs from that * supplied by the host, the adapter will modify the sample type and * rate specifications for the plugin outputs appropriately, and set * timestamps on the output features for outputs that formerly used a * different sample rate specification. This is necessary in order to * obtain correct time stamping. * * In other respects, the PluginBufferingAdapter behaves identically * to the plugin that it wraps. The wrapped plugin will be deleted * when the wrapper is deleted. */ class PluginBufferingAdapter : public PluginWrapper { public: /** * Construct a PluginBufferingAdapter wrapping the given plugin. * The adapter takes ownership of the plugin, which will be * deleted when the adapter is deleted. */ PluginBufferingAdapter(Plugin *plugin); virtual ~PluginBufferingAdapter(); /** * Return the preferred step size for this adapter. * * Because of the way this adapter works, its preferred step size * will always be the same as its preferred block size. This may * or may not be the same as the preferred step size of the * underlying plugin, which may be obtained by calling * getPluginPreferredStepSize(). */ size_t getPreferredStepSize() const; /** * Return the preferred block size for this adapter. * * This may or may not be the same as the preferred block size of * the underlying plugin, which may be obtained by calling * getPluginPreferredBlockSize(). * * Note that this adapter may be initialised with any block size, * not just its supposedly preferred one. */ size_t getPreferredBlockSize() const; /** * Initialise the adapter (and therefore the plugin) for the given * number of channels. Initialise the adapter for the given step * and block size, which must be equal. * * The step and block size used for the underlying plugin will * depend on its preferences, or any values previously passed to * setPluginStepSize and setPluginBlockSize. */ bool initialise(size_t channels, size_t stepSize, size_t blockSize); /** * Return the preferred step size of the plugin wrapped by this * adapter. * * This is included mainly for informational purposes. This value * is not likely to be a valid step size for the adapter itself, * and it is not usually of any use in interpreting the results * (because the adapter re-writes OneSamplePerStep outputs to * FixedSampleRate so that the hop size no longer needs to be * known beforehand in order to interpret them). */ size_t getPluginPreferredStepSize() const; /** * Return the preferred block size of the plugin wrapped by this * adapter. * * This is included mainly for informational purposes. */ size_t getPluginPreferredBlockSize() const; /** * Set the step size that will be used for the underlying plugin * when initialise() is called. If this is not set, the plugin's * own preferred step size will be used. You will not usually * need to call this function. If you do call it, it must be * before the first call to initialise(). */ void setPluginStepSize(size_t stepSize); /** * Set the block size that will be used for the underlying plugin * when initialise() is called. If this is not set, the plugin's * own preferred block size will be used. You will not usually * need to call this function. If you do call it, it must be * before the first call to initialise(). */ void setPluginBlockSize(size_t blockSize); /** * Return the step and block sizes that were actually used when * initialising the underlying plugin. * * This is included mainly for informational purposes. You will * not usually need to call this function. If this is called * before initialise(), it will return 0 for both values. If it * is called after a failed call to initialise(), it will return * the values that were used in the failed call to the plugin's * initialise() function. */ void getActualStepAndBlockSizes(size_t &stepSize, size_t &blockSize); void setParameter(std::string, float); void selectProgram(std::string); OutputList getOutputDescriptors() const; void reset(); FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet getRemainingFeatures(); protected: class Impl; Impl *m_impl; }; } } _VAMP_SDK_HOSTSPACE_END(PluginBufferingAdapter.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginChannelAdapter.h0000644000000000000000000001313613111512442024777 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_CHANNEL_ADAPTER_H_ #define _VAMP_PLUGIN_CHANNEL_ADAPTER_H_ #include "hostguard.h" #include "PluginWrapper.h" _VAMP_SDK_HOSTSPACE_BEGIN(PluginChannelAdapter.h) namespace Vamp { namespace HostExt { /** * \class PluginChannelAdapter PluginChannelAdapter.h * * PluginChannelAdapter is a Vamp plugin adapter that implements a * policy for management of plugins that expect a different number of * input channels from the number actually available in the source * audio data. * * A host using PluginChannelAdapter may ignore the getMinChannelCount * and getMaxChannelCount reported by the plugin, and still expect the * plugin to run. * * PluginChannelAdapter implements the following policy: * * - If the plugin supports the provided number of channels directly, * PluginChannelAdapter will just run the plugin as normal. * * - If the plugin only supports exactly one channel but more than * one channel is provided, PluginChannelAdapter will use the mean of * the channels. This ensures that the resulting values remain * within the same magnitude range as expected for mono data. * * - If the plugin requires more than one channel but exactly one is * provided, the provided channel will be duplicated across all the * plugin input channels. * * If none of the above apply: * * - If the plugin requires more channels than are provided, the * minimum acceptable number of channels will be produced by adding * empty (zero valued) channels to those provided. * * - If the plugin requires fewer channels than are provided, the * maximum acceptable number of channels will be produced by * discarding the excess channels. * * Hosts requiring a different channel policy from the above will need * to implement it themselves, instead of using PluginChannelAdapter. * * Note that PluginChannelAdapter does not override the minimum and * maximum channel counts returned by the wrapped plugin. The host * will need to be aware that it is using a PluginChannelAdapter, and * be prepared to ignore these counts as necessary. (This contrasts * with the approach used in PluginInputDomainAdapter, which aims to * make the host completely unaware of which underlying input domain * is in fact in use.) * * (The rationale for this is that a host may wish to use the * PluginChannelAdapter but still discriminate in some way on the * basis of the number of channels actually supported. For example, a * simple stereo audio host may prefer to reject plugins that require * more than two channels on the grounds that doesn't actually * understand what they are for, rather than allow the channel adapter * to make a potentially meaningless channel conversion for them.) * * In every respect other than its management of channels, the * PluginChannelAdapter behaves identically to the plugin that it * wraps. The wrapped plugin will be deleted when the wrapper is * deleted. * * \note This class was introduced in version 1.1 of the Vamp plugin SDK. */ class PluginChannelAdapter : public PluginWrapper { public: /** * Construct a PluginChannelAdapter wrapping the given plugin. * The adapter takes ownership of the plugin, which will be * deleted when the adapter is deleted. */ PluginChannelAdapter(Plugin *plugin); virtual ~PluginChannelAdapter(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); FeatureSet process(const float *const *inputBuffers, RealTime timestamp); /** * Call process(), providing interleaved audio data with the * number of channels passed to initialise(). The adapter will * de-interleave into temporary buffers as appropriate before * calling process(). * * \note This function was introduced in version 1.4 of the Vamp * plugin SDK. */ FeatureSet processInterleaved(const float *inputBuffer, RealTime timestamp); protected: class Impl; Impl *m_impl; }; } } _VAMP_SDK_HOSTSPACE_END(PluginChannelAdapter.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginHostAdapter.h0000644000000000000000000000763613111512442024354 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_HOST_ADAPTER_H_ #define _VAMP_PLUGIN_HOST_ADAPTER_H_ #include "hostguard.h" #include "Plugin.h" #include #include _VAMP_SDK_HOSTSPACE_BEGIN(PluginHostAdapter.h) namespace Vamp { /** * \class PluginHostAdapter PluginHostAdapter.h * * PluginHostAdapter is a wrapper class that a Vamp host can use to * make the C-language VampPluginDescriptor object appear as a C++ * Vamp::Plugin object. * * The Vamp API is defined in vamp/vamp.h as a C API. The C++ objects * used for convenience by plugins and hosts actually communicate * using the C low-level API, but the details of this communication * are handled seamlessly by the Vamp SDK implementation provided the * plugin and host use the proper C++ wrapper objects. * * See also PluginAdapter, the plugin-side wrapper that makes a C++ * plugin object available using the C query API. */ class PluginHostAdapter : public Plugin { public: PluginHostAdapter(const VampPluginDescriptor *descriptor, float inputSampleRate); virtual ~PluginHostAdapter(); static std::vector getPluginPath(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const; unsigned int getVampApiVersion() const; std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; ParameterList getParameterDescriptors() const; float getParameter(std::string) const; void setParameter(std::string, float); ProgramList getPrograms() const; std::string getCurrentProgram() const; void selectProgram(std::string); size_t getPreferredStepSize() const; size_t getPreferredBlockSize() const; size_t getMinChannelCount() const; size_t getMaxChannelCount() const; OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet getRemainingFeatures(); protected: void convertFeatures(VampFeatureList *, FeatureSet &); const VampPluginDescriptor *m_descriptor; VampPluginHandle m_handle; }; } _VAMP_SDK_HOSTSPACE_END(PluginHostAdapter.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginInputDomainAdapter.h0000644000000000000000000002107513111512442025657 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_INPUT_DOMAIN_ADAPTER_H_ #define _VAMP_PLUGIN_INPUT_DOMAIN_ADAPTER_H_ #include "hostguard.h" #include "PluginWrapper.h" _VAMP_SDK_HOSTSPACE_BEGIN(PluginInputDomainAdapter.h) namespace Vamp { namespace HostExt { /** * \class PluginInputDomainAdapter PluginInputDomainAdapter.h * * PluginInputDomainAdapter is a Vamp plugin adapter that converts * time-domain input into frequency-domain input for plugins that need * it. This permits a host to use time- and frequency-domain plugins * interchangeably without needing to handle the conversion itself. * * This adapter uses a basic windowed FFT (using Hann window by * default) that supports power-of-two block sizes only. If a * frequency domain plugin requests a non-power-of-two blocksize, the * adapter will adjust it to a nearby power of two instead. Thus, * getPreferredBlockSize() will always return a power of two if the * wrapped plugin is a frequency domain one. If the plugin doesn't * accept the adjusted power of two block size, initialise() will * fail. * * The adapter provides no way for the host to discover whether the * underlying plugin is actually a time or frequency domain plugin * (except that if the preferred block size is not a power of two, it * must be a time domain plugin). * * The FFT implementation is simple and self-contained, but unlikely * to be the fastest available: a host can usually do better if it * cares enough. * * The window shape for the FFT frame can be set using setWindowType * and the current shape retrieved using getWindowType. (This was * added in v2.3 of the SDK.) * * In every respect other than its input domain handling, the * PluginInputDomainAdapter behaves identically to the plugin that it * wraps. The wrapped plugin will be deleted when the wrapper is * deleted. * * \note This class was introduced in version 1.1 of the Vamp plugin SDK. */ class PluginInputDomainAdapter : public PluginWrapper { public: /** * Construct a PluginInputDomainAdapter wrapping the given plugin. * The adapter takes ownership of the plugin, which will be * deleted when the adapter is deleted. */ PluginInputDomainAdapter(Plugin *plugin); virtual ~PluginInputDomainAdapter(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const; size_t getPreferredStepSize() const; size_t getPreferredBlockSize() const; FeatureSet process(const float *const *inputBuffers, RealTime timestamp); /** * ProcessTimestampMethod determines how the * PluginInputDomainAdapter handles timestamps for the data passed * to the process() function of the plugin it wraps, in the case * where the plugin is expecting frequency-domain data. * * The Vamp specification requires that the timestamp passed to * the plugin for frequency-domain input should be that of the * centre of the processing block, rather than the start as is the * case for time-domain input. * * Since PluginInputDomainAdapter aims to be transparent in use, * it needs to handle this timestamp adjustment itself. However, * some control is available over the method used for adjustment, * by means of the ProcessTimestampMethod setting. * * If ProcessTimestampMethod is set to ShiftTimestamp (the * default), then the data passed to the wrapped plugin will be * calculated from the same input data block as passed to the * wrapper, but the timestamp passed to the plugin will be * advanced by half of the window size. * * If ProcessTimestampMethod is set to ShiftData, then the * timestamp passed to the wrapped plugin will be the same as that * passed to the process call of the wrapper, but the data block * used to calculate the input will be shifted back (earlier) by * half of the window size, with half a block of zero padding at * the start of the first process call. This has the advantage of * preserving the first half block of audio without any * deterioration from window shaping. * * If ProcessTimestampMethod is set to NoShift, then no adjustment * will be made and the timestamps will be incorrect. */ enum ProcessTimestampMethod { ShiftTimestamp, ShiftData, NoShift }; /** * Set the method used for timestamp adjustment in plugins taking * frequency-domain input. See the ProcessTimestampMethod * documentation for details. * * This function must be called before the first call to * process(). */ void setProcessTimestampMethod(ProcessTimestampMethod); /** * Retrieve the method used for timestamp adjustment in plugins * taking frequency-domain input. See the ProcessTimestampMethod * documentation for details. */ ProcessTimestampMethod getProcessTimestampMethod() const; /** * Return the amount by which the timestamps supplied to process() * are being incremented when they are passed to the plugin's own * process() implementation. * * The Vamp API mandates that the timestamp passed to the plugin * for time-domain input should be the time of the first sample in * the block, but the timestamp passed for frequency-domain input * should be the timestamp of the centre of the block. * * The PluginInputDomainAdapter adjusts its timestamps properly so * that the plugin receives correct times, but in some * circumstances (such as for establishing the correct timing of * implicitly-timed features, i.e. features without their own * timestamps) the host may need to be aware that this adjustment * is taking place. * * If the plugin requires time-domain input or the * PluginInputDomainAdapter is configured with its * ProcessTimestampMethod set to ShiftData instead of * ShiftTimestamp, then this function will return zero. * * The result of calling this function before initialise() has * been called is undefined. */ RealTime getTimestampAdjustment() const; /** * The set of supported window shapes. */ enum WindowType { RectangularWindow = 0, BartlettWindow = 1, /// synonym for RectangularWindow TriangularWindow = 1, /// synonym for BartlettWindow HammingWindow = 2, HanningWindow = 3, /// synonym for HannWindow HannWindow = 3, /// synonym for HanningWindow BlackmanWindow = 4, NuttallWindow = 7, BlackmanHarrisWindow = 8 }; /** * Return the current window shape. The default is HanningWindow. */ WindowType getWindowType() const; /** * Set the current window shape. */ void setWindowType(WindowType type); protected: class Impl; Impl *m_impl; }; } } _VAMP_SDK_HOSTSPACE_END(PluginInputDomainAdapter.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginLoader.h0000644000000000000000000002422713111512442023337 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_LOADER_H_ #define _VAMP_PLUGIN_LOADER_H_ #include #include #include #include "hostguard.h" #include "PluginWrapper.h" _VAMP_SDK_HOSTSPACE_BEGIN(PluginLoader.h) namespace Vamp { class Plugin; namespace HostExt { /** * \class PluginLoader PluginLoader.h * * Vamp::HostExt::PluginLoader is a convenience class for discovering * and loading Vamp plugins using the typical plugin-path, library * naming, and categorisation conventions described in the Vamp SDK * documentation. This class is intended to greatly simplify the task * of becoming a Vamp plugin host for any C++ application. * * Hosts are not required by the Vamp specification to use the same * plugin search path and naming conventions as implemented by this * class, and are certainly not required to use this actual class. * But we do strongly recommend it. * * This class is not thread-safe; use it from a single application * thread, or guard access to it with a mutex. * * \note This class was introduced in version 1.1 of the Vamp plugin SDK. */ class PluginLoader { public: /** * Obtain a pointer to the singleton instance of PluginLoader. * Use this to obtain your loader object. */ static PluginLoader *getInstance(); /** * PluginKey is a string type that is used to identify a plugin * uniquely within the scope of "the current system". It consists * of the lower-cased base name of the plugin library, a colon * separator, and the identifier string for the plugin. It is * only meaningful in the context of a given plugin path (the one * returned by PluginHostAdapter::getPluginPath()). * * Use composePluginKey() to construct a plugin key from a known * plugin library name and identifier. * * Note: the fact that the library component of the key is * lower-cased implies that library names are matched * case-insensitively by the PluginLoader class, regardless of the * case sensitivity of the underlying filesystem. (Plugin * identifiers _are_ case sensitive, however.) Also, it is not * possible to portably extract a working library name from a * plugin key, as the result may fail on case-sensitive * filesystems. Use getLibraryPathForPlugin() instead. */ typedef std::string PluginKey; /** * PluginKeyList is a sequence of plugin keys, such as returned by * listPlugins(). */ typedef std::vector PluginKeyList; /** * PluginCategoryHierarchy is a sequence of general->specific * category names, as may be associated with a single plugin. * This sequence describes the location of a plugin within a * category forest, containing the human-readable names of the * plugin's category tree root, followed by each of the nodes down * to the leaf containing the plugin. * * \see getPluginCategory() */ typedef std::vector PluginCategoryHierarchy; /** * Search for all available Vamp plugins, and return a list of * them in the order in which they were found. */ PluginKeyList listPlugins(); /** * Search for available Vamp plugins in libraries with the given * library names, and return a list of them in the order in which * they were found. Do not attempt to load any plugin libraries * other than those named. * * The library names should be supplied without path or * suffix. For example, use "vamp-example-plugins" to find plugins * in /install/path/of/vamp-example-plugins.dll (or .so etc). This * is the same concept of "library name" as appears in the plugin * key: \see composePluginKey(). */ PluginKeyList listPluginsIn(std::vector libraryNames); /** * Search for available Vamp plugins in libraries other than those * with the given library names, and return a list of them in the * order in which they were found. Do not attempt to load any of * the libraries named. * * The library names should be supplied without path or * suffix. For example, use "vamp-example-plugins" to find plugins * not appearing in /install/path/of/vamp-example-plugins.dll (or * .so etc). This is the same concept of "library name" as appears * in the plugin key: \see composePluginKey(). */ PluginKeyList listPluginsNotIn(std::vector libraryNames); /** * AdapterFlags contains a set of values that may be OR'd together * to indicate in which circumstances PluginLoader should use a * plugin adapter to make a plugin easier to use for a host that * does not want to cater for complex features. * * The available flags are: * * ADAPT_INPUT_DOMAIN - If the plugin expects frequency domain * input, wrap it in a PluginInputDomainAdapter that automatically * converts the plugin to one that expects time-domain input. * This enables a host to accommodate time- and frequency-domain * plugins without needing to do any conversion itself. * * ADAPT_CHANNEL_COUNT - Wrap the plugin in a PluginChannelAdapter * to handle any mismatch between the number of channels of audio * the plugin can handle and the number available in the host. * This enables a host to use plugins that may require the input * to be mixed down to mono, etc., without having to worry about * doing that itself. * * ADAPT_BUFFER_SIZE - Wrap the plugin in a PluginBufferingAdapter * permitting the host to provide audio input using any block * size, with no overlap, regardless of the plugin's preferred * block size (suitable for hosts that read from non-seekable * streaming media, for example). This adapter introduces some * run-time overhead and also changes the semantics of the plugin * slightly (see the PluginBufferingAdapter header documentation * for details). * * ADAPT_ALL_SAFE - Perform all available adaptations that are * meaningful for the plugin and "safe". Currently this means to * ADAPT_INPUT_DOMAIN if the plugin wants FrequencyDomain input; * ADAPT_CHANNEL_COUNT always; and ADAPT_BUFFER_SIZE never. * * ADAPT_ALL - Perform all available adaptations that are * meaningful for the plugin. * * See PluginInputDomainAdapter, PluginChannelAdapter and * PluginBufferingAdapter for more details of the classes that the * loader may use if these flags are set. */ enum AdapterFlags { ADAPT_INPUT_DOMAIN = 0x01, ADAPT_CHANNEL_COUNT = 0x02, ADAPT_BUFFER_SIZE = 0x04, ADAPT_ALL_SAFE = 0x03, ADAPT_ALL = 0xff }; /** * Load a Vamp plugin, given its identifying key. If the plugin * could not be loaded, returns 0. * * The returned plugin should be deleted (using the standard C++ * delete keyword) after use. * * \param adapterFlags a bitwise OR of the values in the AdapterFlags * enumeration, indicating under which circumstances an adapter should be * used to wrap the original plugin. If adapterFlags is 0, no * optional adapters will be used. Otherwise, the returned plugin * may be of an adapter class type which will behave identically * to the original plugin, apart from any particular features * implemented by the adapter itself. * * \see AdapterFlags, PluginInputDomainAdapter, PluginChannelAdapter */ Plugin *loadPlugin(PluginKey key, float inputSampleRate, int adapterFlags = 0); /** * Given a Vamp plugin library name and plugin identifier, return * the corresponding plugin key in a form suitable for passing in to * loadPlugin(). */ PluginKey composePluginKey(std::string libraryName, std::string identifier); /** * Return the category hierarchy for a Vamp plugin, given its * identifying key. * * If the plugin has no category information, return an empty * hierarchy. * * \see PluginCategoryHierarchy */ PluginCategoryHierarchy getPluginCategory(PluginKey plugin); /** * Return the file path of the dynamic library from which the * given plugin will be loaded (if available). */ std::string getLibraryPathForPlugin(PluginKey plugin); protected: PluginLoader(); virtual ~PluginLoader(); class Impl; Impl *m_impl; static PluginLoader *m_instance; }; } } _VAMP_SDK_HOSTSPACE_END(PluginLoader.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginSummarisingAdapter.h0000644000000000000000000001675513111512442025737 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_SUMMARISING_ADAPTER_H_ #define _VAMP_PLUGIN_SUMMARISING_ADAPTER_H_ #include "hostguard.h" #include "PluginWrapper.h" #include _VAMP_SDK_HOSTSPACE_BEGIN(PluginSummarisingAdapter.h) namespace Vamp { namespace HostExt { /** * \class PluginSummarisingAdapter PluginSummarisingAdapter.h * * PluginSummarisingAdapter is a Vamp plugin adapter that provides * summarisation methods such as mean and median averages of output * features, for use in any context where an available plugin produces * individual values but the result that is actually needed is some * sort of aggregate. * * To make use of PluginSummarisingAdapter, the host should configure, * initialise and run the plugin through the adapter interface just as * normal. Then, after the process and getRemainingFeatures methods * have been properly called and processing is complete, the host may * call getSummaryForOutput or getSummaryForAllOutputs to obtain * summarised features: averages, maximum values, etc, depending on * the SummaryType passed to the function. * * By default PluginSummarisingAdapter calculates a single summary of * each output's feature across the whole duration of processed audio. * A host needing summaries of sub-segments of the whole audio may * call setSummarySegmentBoundaries before retrieving the summaries, * providing a list of times such that one summary will be provided * for each segment between two consecutive times. * * PluginSummarisingAdapter is straightforward rather than fast. It * calculates all of the summary types for all outputs always, and * then returns only the ones that are requested. It is designed on * the basis that, for most features, summarising and storing * summarised results is far cheaper than calculating the results in * the first place. If this is not true for your particular feature, * PluginSummarisingAdapter may not be the best approach for you. * * \note This class was introduced in version 2.0 of the Vamp plugin SDK. */ class PluginSummarisingAdapter : public PluginWrapper { public: /** * Construct a PluginSummarisingAdapter wrapping the given plugin. * The adapter takes ownership of the plugin, which will be * deleted when the adapter is deleted. */ PluginSummarisingAdapter(Plugin *plugin); virtual ~PluginSummarisingAdapter(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet getRemainingFeatures(); typedef std::set SegmentBoundaries; /** * Specify a series of segment boundaries, such that one summary * will be returned for each of the contiguous intra-boundary * segments. This function must be called before * getSummaryForOutput or getSummaryForAllOutputs. * * Note that you cannot retrieve results with multiple different * segmentations by repeatedly calling this function followed by * one of the getSummary functions. The summaries are all * calculated at the first call to any getSummary function, and * once the summaries have been calculated, they remain * calculated. */ void setSummarySegmentBoundaries(const SegmentBoundaries &); enum SummaryType { Minimum = 0, Maximum = 1, Mean = 2, Median = 3, Mode = 4, Sum = 5, Variance = 6, StandardDeviation = 7, Count = 8, UnknownSummaryType = 999 }; /** * AveragingMethod indicates how the adapter should handle * average-based summaries of features whose results are not * equally spaced in time. * * If SampleAverage is specified, summary types based on averages * will be calculated by treating each result individually without * regard to its time: for example, the mean will be the sum of * all values divided by the number of values. * * If ContinuousTimeAverage is specified, each feature will be * considered to have a duration, either as specified in the * feature's duration field, or until the following feature: thus, * for example, the mean will be the sum of the products of values * and durations, divided by the total duration. * * Although SampleAverage is useful for many types of feature, * ContinuousTimeAverage is essential for some situations, for * example finding the result that spans the largest proportion of * the input given a feature that emits a new result only when the * value changes (the modal value integrated over time). */ enum AveragingMethod { SampleAverage = 0, ContinuousTimeAverage = 1 }; /** * Return summaries of the features that were returned on the * given output, using the given SummaryType and AveragingMethod. * * The plugin must have been fully run (process() and * getRemainingFeatures() calls all made as appropriate) before * this function is called. */ FeatureList getSummaryForOutput(int output, SummaryType type, AveragingMethod method = SampleAverage); /** * Return summaries of the features that were returned on all of * the plugin's outputs, using the given SummaryType and * AveragingMethod. * * The plugin must have been fully run (process() and * getRemainingFeatures() calls all made as appropriate) before * this function is called. */ FeatureSet getSummaryForAllOutputs(SummaryType type, AveragingMethod method = SampleAverage); protected: class Impl; Impl *m_impl; }; } } _VAMP_SDK_HOSTSPACE_END(PluginSummarisingAdapter.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/PluginWrapper.h0000644000000000000000000001106213111512442023542 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2009 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_WRAPPER_H_ #define _VAMP_PLUGIN_WRAPPER_H_ #include "hostguard.h" #include _VAMP_SDK_HOSTSPACE_BEGIN(PluginWrapper.h) namespace Vamp { namespace HostExt { /** * \class PluginWrapper PluginWrapper.h * * PluginWrapper is a simple base class for adapter plugins. It takes * a pointer to a "to be wrapped" Vamp plugin on construction, and * provides implementations of all the Vamp plugin methods that simply * delegate through to the wrapped plugin. A subclass can therefore * override only the methods that are meaningful for the particular * adapter. * * \note This class was introduced in version 1.1 of the Vamp plugin SDK. */ class PluginWrapper : public Plugin { public: virtual ~PluginWrapper(); bool initialise(size_t channels, size_t stepSize, size_t blockSize); void reset(); InputDomain getInputDomain() const; unsigned int getVampApiVersion() const; std::string getIdentifier() const; std::string getName() const; std::string getDescription() const; std::string getMaker() const; int getPluginVersion() const; std::string getCopyright() const; ParameterList getParameterDescriptors() const; float getParameter(std::string) const; void setParameter(std::string, float); ProgramList getPrograms() const; std::string getCurrentProgram() const; void selectProgram(std::string); size_t getPreferredStepSize() const; size_t getPreferredBlockSize() const; size_t getMinChannelCount() const; size_t getMaxChannelCount() const; OutputList getOutputDescriptors() const; FeatureSet process(const float *const *inputBuffers, RealTime timestamp); FeatureSet getRemainingFeatures(); /** * Return a pointer to the plugin wrapper of type WrapperType * surrounding this wrapper's plugin, if present. * * This is useful in situations where a plugin is wrapped by * multiple different wrappers (one inside another) and the host * wants to call some wrapper-specific function on one of the * layers without having to care about the order in which they are * wrapped. For example, the plugin returned by * PluginLoader::loadPlugin may have more than one wrapper; if the * host wanted to query or fine-tune some property of one of them, * it would be hard to do so without knowing the order of the * wrappers. This function therefore gives direct access to the * wrapper of a particular type. */ template WrapperType *getWrapper() { WrapperType *w = dynamic_cast(this); if (w) return w; PluginWrapper *pw = dynamic_cast(m_plugin); if (pw) return pw->getWrapper(); return 0; } protected: PluginWrapper(Plugin *plugin); // I take ownership of plugin Plugin *m_plugin; }; } } _VAMP_SDK_HOSTSPACE_END(PluginWrapper.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/RealTime.h0000644000000000000000000000347313111512442022454 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_HOSTSDK_REALTIME_H_ #define _VAMP_HOSTSDK_REALTIME_H_ // Do not include vamp-sdk/RealTime.h directly from host code. Always // use this header instead. #include "hostguard.h" #include #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/host-c.h0000644000000000000000000001314013111512442022137 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2015 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ /* This file defines a low-level API for enumerating and loading plugin libraries using C calling conventions. It could be used in C programs, or in languages with C-compatible foreign-function interfaces. Note that this works by calling to the C++ Vamp host SDK, so any program using this interface must still link against the rest of the Vamp plugin library and the C++ standard library. This is not the simplest or easiest interface for hosting Vamp plugins -- if you have the capability to use the C++ API, please do that instead. (Most programs should not even include this header.) The C and C++ interfaces provide different abstraction levels: In the C++ interface, the class PluginLoader provides a list of keys corresponding to the installed plugins (where a key combines the plugin's library name and plugin identifier into a single string) plus a method to load a single plugin based on its key (obtaining an instance of class Plugin). With the C++ interface you go straight from the key to a live instance of the plugin. The PluginLoader also provides various facilities to adapt the plugin based on your requirements (e.g. to do time- to frequency-domain conversion for you if the plugin requires it). This low-level C interface, on the other hand, deals only in plugin libraries and static descriptors, not in plugin instances. You can enumerate the installed libraries, getting just the base .soname of each library. Then you can retrieve each of the raw C plugin descriptors from a library, and use the descriptor (whose interface is defined in vamp/vamp.h) to instantiate the plugin. So this header corresponds to the first part of the PluginLoader class interface: finding and loading plugin libraries and retrieving plugin descriptors from them. But it does not do any of the rest, i.e. instantiating and adapting the plugins themselves. Although this makes the API appear very simple, it means the resulting plugins are relatively hard to use compared to those obtained by the PluginLoader API. There is no way to get to the full C++ abstraction using this API. This API is not thread-safe; use it from a single application thread, or guard access to it with a mutex. This header was introduced in version 2.6 of the Vamp plugin SDK. */ #ifndef VAMPHOST_C_H_INCLUDED #define VAMPHOST_C_H_INCLUDED #include #ifdef __cplusplus extern "C" { #endif typedef struct vhLibrary_t *vhLibrary; /** * Return the number of Vamp plugin libraries discovered in the * installation path. This number will remain fixed after the first * call -- plugins are only discovered once, the first time this * function is called. */ extern int vhGetLibraryCount(); /** * Return the library name (base soname) of the library with the given * index, in the range 0..(vhGetLibraryCount()-1). */ extern const char *vhGetLibraryName(int library); /** * Return the library index for the given library name, or -1 if the * name is not known. */ extern int vhGetLibraryIndex(const char *name); /** * Load the library with the given index. If the library cannot be * loaded for any reason, the return value is 0; otherwise it is an * opaque pointer suitable for passing to other functions in this API. */ extern vhLibrary vhLoadLibrary(int library); /** * Return the number of Vamp plugins in the given library. */ extern int vhGetPluginCount(vhLibrary library); /** * Return a Vamp plugin descriptor for a plugin in a given * library. This simply calls the vampGetPluginDescriptor function in * that library with the given plugin index and returns the * result. See vamp/vamp.h for details about the plugin descriptor. */ extern const VampPluginDescriptor *vhGetPluginDescriptor(vhLibrary library, int plugin); /** * Unload a plugin library. Do not do this while any of its plugins * are still in use. */ extern void vhUnloadLibrary(vhLibrary); #ifdef __cplusplus } #endif #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/hostguard.h0000644000000000000000000000472013111512442022746 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_HOSTSDK_HOSTGUARD_H_ #define _VAMP_HOSTSDK_HOSTGUARD_H_ #ifdef _VAMP_IN_PLUGINSDK #error You have included headers from both vamp-sdk and vamp-hostsdk in the same source file. Please include only vamp-sdk headers in plugin code, and only vamp-hostsdk headers in host code. #else #define _VAMP_IN_HOSTSDK #define VAMP_SDK_VERSION "2.7.1" #define VAMP_SDK_MAJOR_VERSION 2 #define VAMP_SDK_MINOR_VERSION 7 #ifdef _VAMP_NO_HOST_NAMESPACE #define _VAMP_SDK_HOSTSPACE_BEGIN(h) #define _VAMP_SDK_HOSTSPACE_END(h) #define _VAMP_SDK_PLUGSPACE_BEGIN(h) #define _VAMP_SDK_PLUGSPACE_END(h) #else #define _VAMP_SDK_HOSTSPACE_BEGIN(h) \ namespace _VampHost { #define _VAMP_SDK_HOSTSPACE_END(h) \ } \ using namespace _VampHost; #define _VAMP_SDK_PLUGSPACE_BEGIN(h) \ namespace _VampHost { #define _VAMP_SDK_PLUGSPACE_END(h) \ } \ using namespace _VampHost; #endif #endif #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-hostsdk/vamp-hostsdk.h0000644000000000000000000000372713111512442023374 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_HOSTSDK_SINGLE_INCLUDE_H_ #define _VAMP_HOSTSDK_SINGLE_INCLUDE_H_ #include "PluginBase.h" #include "PluginBufferingAdapter.h" #include "PluginChannelAdapter.h" #include "Plugin.h" #include "PluginHostAdapter.h" #include "PluginInputDomainAdapter.h" #include "PluginLoader.h" #include "PluginSummarisingAdapter.h" #include "PluginWrapper.h" #include "RealTime.h" #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/FFT.h0000644000000000000000000001464613111512442020477 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006-2012 Chris Cannam and QMUL. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_FFT_H_ #define _VAMP_FFT_H_ #include "plugguard.h" _VAMP_SDK_PLUGSPACE_BEGIN(FFT.h) namespace Vamp { /** * A simple FFT implementation provided for convenience of plugin * authors. This class provides one-shot (i.e. fixed table state is * recalculated every time) double-precision complex-complex * transforms. For repeated transforms from real time-domain data, use * an FFTComplex or FFTReal object instead. * * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT * flag, then all FFTs will use single precision internally. The * default is double precision. The API uses doubles in either case. * * The forward transform is unscaled; the inverse transform is scaled * by 1/n. */ class FFT { public: /** * Calculate a one-shot forward transform of size n. * n must be a multiple of 2. * * ri and ii must point to the real and imaginary component arrays * of the input. For real input, ii may be NULL. * * ro and io must point to enough space to receive the real and * imaginary component arrays of the output. * * All input and output arrays are of size n. */ static void forward(unsigned int n, const double *ri, const double *ii, double *ro, double *io); /** * Calculate a one-shot inverse transform of size n. * n must be a power of 2, greater than 1. * * ri and ii must point to the real and imaginary component arrays * of the input. For real input, ii may be NULL. * * ro and io must point to enough space to receive the real and * imaginary component arrays of the output. The output is scaled * by 1/n. The output pointers may not be NULL, even if the output * is expected to be real. * * All input and output arrays are of size n. */ static void inverse(unsigned int n, const double *ri, const double *ii, double *ro, double *io); }; /** * A simple FFT implementation provided for convenience of plugin * authors. This class provides double-precision complex-complex * transforms. * * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT * flag, then all FFTs will use single precision internally. The * default is double precision. The API uses doubles in either case. * * The forward transform is unscaled; the inverse transform is scaled * by 1/n. */ class FFTComplex { public: /** * Prepare to calculate transforms of size n. * n must be a multiple of 2. */ FFTComplex(unsigned int n); ~FFTComplex(); /** * Calculate a forward transform of size n. * * ci must point to the interleaved complex input data of size n * (that is, 2n doubles in total). * * co must point to enough space to receive an interleaved complex * output array of size n (that is, 2n doubles in total). */ void forward(const double *ci, double *co); /** * Calculate an inverse transform of size n. * * ci must point to an interleaved complex input array of size n * (that is, 2n doubles in total). * * co must point to enough space to receive the interleaved * complex output data of size n (that is, 2n doubles in * total). The output is scaled by 1/n. */ void inverse(const double *ci, double *co); private: class D; D *m_d; }; /** * A simple FFT implementation provided for convenience of plugin * authors. This class provides transforms between double-precision * real time-domain and double-precision complex frequency-domain * data. * * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT * flag, then all FFTs will use single precision internally. The * default is double precision. The API uses doubles in either case. * * The forward transform is unscaled; the inverse transform is scaled * by 1/n. */ class FFTReal { public: /** * Prepare to calculate transforms of size n. * n must be a multiple of 2. */ FFTReal(unsigned int n); ~FFTReal(); /** * Calculate a forward transform of size n. * * ri must point to the real input data of size n. * * co must point to enough space to receive an interleaved complex * output array of size n/2+1 (that is, n+2 doubles in total). */ void forward(const double *ri, double *co); /** * Calculate an inverse transform of size n. * * ci must point to an interleaved complex input array of size * n/2+1 (that is, n+2 doubles in total). * * ro must point to enough space to receive the real output data * of size n. The output is scaled by 1/n and only the real part * is returned. */ void inverse(const double *ci, double *ro); private: class D; D *m_d; }; } _VAMP_SDK_PLUGSPACE_END(FFT.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/Plugin.h0000644000000000000000000003666013111512442021316 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_SDK_PLUGIN_H_ #define _VAMP_SDK_PLUGIN_H_ #include #include #include #include "PluginBase.h" #include "RealTime.h" #include "plugguard.h" _VAMP_SDK_PLUGSPACE_BEGIN(Plugin.h) namespace Vamp { /** * \class Plugin Plugin.h * * Vamp::Plugin is a base class for plugin instance classes * that provide feature extraction from audio or related data. * * In most cases, the input will be audio and the output will be a * stream of derived data at a lower sampling resolution than the * input. * * Note that this class inherits several abstract methods from * PluginBase. These must be implemented by the subclass. * * * PLUGIN LIFECYCLE * * Feature extraction plugins are managed differently from real-time * plugins (such as VST effects). The main difference is that the * parameters for a feature extraction plugin are configured before * the plugin is used, and do not change during use. * * 1. Host constructs the plugin, passing it the input sample rate. * The plugin may do basic initialisation, but should not do anything * computationally expensive at this point. You must make sure your * plugin is cheap to construct, otherwise you'll seriously affect the * startup performance of almost all hosts. If you have serious * initialisation to do, the proper place is in initialise() (step 5). * * 2. Host may query the plugin's available outputs. * * 3. Host queries programs and parameter descriptors, and may set * some or all of them. Parameters that are not explicitly set should * take their default values as specified in the parameter descriptor. * When a program is set, the parameter values may change and the host * will re-query them to check. * * 4. Host queries the preferred step size, block size and number of * channels. These may all vary depending on the parameter values. * (Note however that you cannot make the number of distinct outputs * dependent on parameter values.) * * 5. Plugin is properly initialised with a call to initialise. This * fixes the step size, block size, and number of channels, as well as * all of the parameter and program settings. If the values passed in * to initialise do not match the plugin's advertised preferred values * from step 4, the plugin may refuse to initialise and return false * (although if possible it should accept the new values). Any * computationally expensive setup code should take place here. * * 6. Host finally checks the number of values, resolution, extents * etc per output (which may vary depending on the number of channels, * step size and block size as well as the parameter values). * * 7. Host will repeatedly call the process method to pass in blocks * of input data. This method may return features extracted from that * data (if the plugin is causal). * * 8. Host will call getRemainingFeatures exactly once, after all the * input data has been processed. This may return any non-causal or * leftover features. * * 9. At any point after initialise was called, the host may * optionally call the reset method and restart processing. (This * does not mean it can change the parameters, which are fixed from * initialise until destruction.) * * A plugin does not need to handle the case where setParameter or * selectProgram is called after initialise has been called. It's the * host's responsibility not to do that. Similarly, the plugin may * safely assume that initialise is called no more than once. */ class Plugin : public PluginBase { public: virtual ~Plugin() { } /** * Initialise a plugin to prepare it for use with the given number * of input channels, step size (window increment, in sample * frames) and block size (window size, in sample frames). * * The input sample rate should have been already specified at * construction time. * * Return true for successful initialisation, false if the number * of input channels, step size and/or block size cannot be * supported. */ virtual bool initialise(size_t inputChannels, size_t stepSize, size_t blockSize) = 0; /** * Reset the plugin after use, to prepare it for another clean * run. Not called for the first initialisation (i.e. initialise * must also do a reset). */ virtual void reset() = 0; enum InputDomain { TimeDomain, FrequencyDomain }; /** * Get the plugin's required input domain. * * If this is TimeDomain, the samples provided to the process() * function (below) will be in the time domain, as for a * traditional audio processing plugin. * * If this is FrequencyDomain, the host will carry out a windowed * FFT of size equal to the negotiated block size on the data * before passing the frequency bin data in to process(). The * input data for the FFT will be rotated so as to place the * origin in the centre of the block. * The plugin does not get to choose the window type -- the host * will either let the user do so, or will use a Hanning window. */ virtual InputDomain getInputDomain() const = 0; /** * Get the preferred block size (window size -- the number of * sample frames passed in each block to the process() function). * This should be called before initialise(). * * A plugin that can handle any block size may return 0. The * final block size will be set in the initialise() call. */ virtual size_t getPreferredBlockSize() const { return 0; } /** * Get the preferred step size (window increment -- the distance * in sample frames between the start frames of consecutive blocks * passed to the process() function) for the plugin. This should * be called before initialise(). * * A plugin may return 0 if it has no particular interest in the * step size. In this case, the host should make the step size * equal to the block size if the plugin is accepting input in the * time domain. If the plugin is accepting input in the frequency * domain, the host may use any step size. The final step size * will be set in the initialise() call. */ virtual size_t getPreferredStepSize() const { return 0; } /** * Get the minimum supported number of input channels. */ virtual size_t getMinChannelCount() const { return 1; } /** * Get the maximum supported number of input channels. */ virtual size_t getMaxChannelCount() const { return 1; } struct OutputDescriptor { /** * The name of the output, in computer-usable form. Should be * reasonably short and without whitespace or punctuation, using * the characters [a-zA-Z0-9_-] only. * Example: "zero_crossing_count" */ std::string identifier; /** * The human-readable name of the output. * Example: "Zero Crossing Counts" */ std::string name; /** * A human-readable short text describing the output. May be * empty if the name has said it all already. * Example: "The number of zero crossing points per processing block" */ std::string description; /** * The unit of the output, in human-readable form. */ std::string unit; /** * True if the output has the same number of values per sample * for every output sample. Outputs for which this is false * are unlikely to be very useful in a general-purpose host. */ bool hasFixedBinCount; /** * The number of values per result of the output. Undefined * if hasFixedBinCount is false. If this is zero, the output * is point data (i.e. only the time of each output is of * interest, the value list will be empty). */ size_t binCount; /** * The (human-readable) names of each of the bins, if * appropriate. This is always optional. */ std::vector binNames; /** * True if the results in each output bin fall within a fixed * numeric range (minimum and maximum values). Undefined if * binCount is zero. */ bool hasKnownExtents; /** * Minimum value of the results in the output. Undefined if * hasKnownExtents is false or binCount is zero. */ float minValue; /** * Maximum value of the results in the output. Undefined if * hasKnownExtents is false or binCount is zero. */ float maxValue; /** * True if the output values are quantized to a particular * resolution. Undefined if binCount is zero. */ bool isQuantized; /** * Quantization resolution of the output values (e.g. 1.0 if * they are all integers). Undefined if isQuantized is false * or binCount is zero. */ float quantizeStep; enum SampleType { /// Results from each process() align with that call's block start OneSamplePerStep, /// Results are evenly spaced in time (sampleRate specified below) FixedSampleRate, /// Results are unevenly spaced and have individual timestamps VariableSampleRate }; /** * Positioning in time of the output results. */ SampleType sampleType; /** * Sample rate of the output results, as samples per second. * Undefined if sampleType is OneSamplePerStep. * * If sampleType is VariableSampleRate and this value is * non-zero, then it may be used to calculate a resolution for * the output (i.e. the "duration" of each sample, in time, * will be 1/sampleRate seconds). It's recommended to set * this to zero if that behaviour is not desired. */ float sampleRate; /** * True if the returned results for this output are known to * have a duration field. */ bool hasDuration; OutputDescriptor() : // defaults for mandatory non-class-type members hasFixedBinCount(false), binCount(0), hasKnownExtents(false), minValue(0), maxValue(0), isQuantized(false), quantizeStep(0), sampleType(OneSamplePerStep), sampleRate(0), hasDuration(false) { } }; typedef std::vector OutputList; /** * Get the outputs of this plugin. An output's index in this list * is used as its numeric index when looking it up in the * FeatureSet returned from the process() call. */ virtual OutputList getOutputDescriptors() const = 0; struct Feature { /** * True if an output feature has its own timestamp. This is * mandatory if the output has VariableSampleRate, optional if * the output has FixedSampleRate, and unused if the output * has OneSamplePerStep. */ bool hasTimestamp; /** * Timestamp of the output feature. This is mandatory if the * output has VariableSampleRate or if the output has * FixedSampleRate and hasTimestamp is true, and unused * otherwise. */ RealTime timestamp; /** * True if an output feature has a specified duration. This * is optional if the output has VariableSampleRate or * FixedSampleRate, and and unused if the output has * OneSamplePerStep. */ bool hasDuration; /** * Duration of the output feature. This is mandatory if the * output has VariableSampleRate or FixedSampleRate and * hasDuration is true, and unused otherwise. */ RealTime duration; /** * Results for a single sample of this feature. If the output * hasFixedBinCount, there must be the same number of values * as the output's binCount count. */ std::vector values; /** * Label for the sample of this feature. */ std::string label; Feature() : // defaults for mandatory non-class-type members hasTimestamp(false), hasDuration(false) { } }; typedef std::vector FeatureList; typedef std::map FeatureSet; // key is output no /** * Process a single block of input data. * * If the plugin's inputDomain is TimeDomain, inputBuffers will * point to one array of floats per input channel, and each of * these arrays will contain blockSize consecutive audio samples * (the host will zero-pad as necessary). The timestamp in this * case will be the real time in seconds of the start of the * supplied block of samples. * * If the plugin's inputDomain is FrequencyDomain, inputBuffers * will point to one array of floats per input channel, and each * of these arrays will contain blockSize/2+1 consecutive pairs of * real and imaginary component floats corresponding to bins * 0..(blockSize/2) of the FFT output. That is, bin 0 (the first * pair of floats) contains the DC output, up to bin blockSize/2 * which contains the Nyquist-frequency output. There will * therefore be blockSize+2 floats per channel in total. The * timestamp will be the real time in seconds of the centre of the * FFT input window (i.e. the very first block passed to process * might contain the FFT of half a block of zero samples and the * first half-block of the actual data, with a timestamp of zero). * * Return any features that have become available after this * process call. (These do not necessarily have to fall within * the process block, except for OneSamplePerStep outputs.) */ virtual FeatureSet process(const float *const *inputBuffers, RealTime timestamp) = 0; /** * After all blocks have been processed, calculate and return any * remaining features derived from the complete input. */ virtual FeatureSet getRemainingFeatures() = 0; /** * Used to distinguish between Vamp::Plugin and other potential * sibling subclasses of PluginBase. Do not reimplement this * function in your subclass. */ virtual std::string getType() const { return "Feature Extraction Plugin"; } protected: Plugin(float inputSampleRate) : m_inputSampleRate(inputSampleRate) { } float m_inputSampleRate; }; } _VAMP_SDK_PLUGSPACE_END(Plugin.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/PluginAdapter.h0000644000000000000000000000715313111512442022612 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_PLUGIN_ADAPTER_H_ #define _VAMP_PLUGIN_ADAPTER_H_ #include #include #include "Plugin.h" #include "plugguard.h" _VAMP_SDK_PLUGSPACE_BEGIN(PluginAdapter.h) namespace Vamp { /** * \class PluginAdapterBase PluginAdapter.h * * PluginAdapter and PluginAdapterBase provide a wrapper class that a * plugin library can use to make its C++ Vamp::Plugin objects * available through the Vamp C API. * * Almost all Vamp plugin libraries will want to make use of this. To * do so, all they need to do is declare a PluginAdapter for each * plugin class T in their library. It's very simple, and you need to * know absolutely nothing about how it works in order to use it. * Just cut and paste from an existing plugin's discovery function. * \see vampGetPluginDescriptor */ class PluginAdapterBase { public: virtual ~PluginAdapterBase(); /** * Return a VampPluginDescriptor describing the plugin that is * wrapped by this adapter. */ const VampPluginDescriptor *getDescriptor(); protected: PluginAdapterBase(); virtual Plugin *createPlugin(float inputSampleRate) = 0; class Impl; Impl *m_impl; }; /** * \class PluginAdapter PluginAdapter.h * * PluginAdapter turns a PluginAdapterBase into a specific wrapper for * a particular plugin implementation. * * See PluginAdapterBase. */ template class PluginAdapter : public PluginAdapterBase { public: PluginAdapter() : PluginAdapterBase() { } virtual ~PluginAdapter() { } protected: Plugin *createPlugin(float inputSampleRate) { P *p = new P(inputSampleRate); Plugin *plugin = dynamic_cast(p); if (!plugin) { std::cerr << "ERROR: PluginAdapter::createPlugin: " << "Template type is not a plugin!" << std::endl; delete p; return 0; } return plugin; } }; } _VAMP_SDK_PLUGSPACE_END(PluginAdapter.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/PluginBase.h0000644000000000000000000002007213111512442022077 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_SDK_PLUGIN_BASE_H_ #define _VAMP_SDK_PLUGIN_BASE_H_ #include #include #include "plugguard.h" _VAMP_SDK_PLUGSPACE_BEGIN(PluginBase.h) namespace Vamp { /** * A base class for plugins with optional configurable parameters, * programs, etc. The Vamp::Plugin is derived from this, and * individual Vamp plugins should derive from that. * * This class does not provide the necessary interfaces to instantiate * or run a plugin. It only specifies an interface for retrieving * those controls that the host may wish to show to the user for * editing. It could meaningfully be subclassed by real-time plugins * or other sorts of plugin as well as Vamp plugins. */ class PluginBase { public: virtual ~PluginBase() { } /** * Get the Vamp API compatibility level of the plugin. */ virtual unsigned int getVampApiVersion() const { return 2; } /** * Get the computer-usable name of the plugin. This should be * reasonably short and contain no whitespace or punctuation * characters. It may only contain the characters [a-zA-Z0-9_-]. * This is the authoritative way for a program to identify a * plugin within a given library. * * This text may be visible to the user, but it should not be the * main text used to identify a plugin to the user (that will be * the name, below). * * Example: "zero_crossings" */ virtual std::string getIdentifier() const = 0; /** * Get a human-readable name or title of the plugin. This * should be brief and self-contained, as it may be used to * identify the plugin to the user in isolation (i.e. without also * showing the plugin's "identifier"). * * Example: "Zero Crossings" */ virtual std::string getName() const = 0; /** * Get a human-readable description for the plugin, typically * a line of text that may optionally be displayed in addition * to the plugin's "name". May be empty if the name has said * it all already. * * Example: "Detect and count zero crossing points" */ virtual std::string getDescription() const = 0; /** * Get the name of the author or vendor of the plugin in * human-readable form. This should be a short identifying text, * as it may be used to label plugins from the same source in a * menu or similar. */ virtual std::string getMaker() const = 0; /** * Get the copyright statement or licensing summary for the * plugin. This can be an informative text, without the same * presentation constraints as mentioned for getMaker above. */ virtual std::string getCopyright() const = 0; /** * Get the version number of the plugin. */ virtual int getPluginVersion() const = 0; struct ParameterDescriptor { /** * The name of the parameter, in computer-usable form. Should * be reasonably short, and may only contain the characters * [a-zA-Z0-9_-]. */ std::string identifier; /** * The human-readable name of the parameter. */ std::string name; /** * A human-readable short text describing the parameter. May be * empty if the name has said it all already. */ std::string description; /** * The unit of the parameter, in human-readable form. */ std::string unit; /** * The minimum value of the parameter. */ float minValue; /** * The maximum value of the parameter. */ float maxValue; /** * The default value of the parameter. The plugin should * ensure that parameters have this value on initialisation * (i.e. the host is not required to explicitly set parameters * if it wants to use their default values). */ float defaultValue; /** * True if the parameter values are quantized to a particular * resolution. */ bool isQuantized; /** * Quantization resolution of the parameter values (e.g. 1.0 * if they are all integers). Undefined if isQuantized is * false. */ float quantizeStep; /** * Names for the quantized values. If isQuantized is true, * this may either be empty or contain one string for each of * the quantize steps from minValue up to maxValue inclusive. * Undefined if isQuantized is false. * * If these names are provided, they should be shown to the * user in preference to the values themselves. The user may * never see the actual numeric values unless they are also * encoded in the names. */ std::vector valueNames; ParameterDescriptor() : // the defaults are invalid: you must set them minValue(0), maxValue(0), defaultValue(0), isQuantized(false), quantizeStep(0) { } }; typedef std::vector ParameterList; /** * Get the controllable parameters of this plugin. */ virtual ParameterList getParameterDescriptors() const { return ParameterList(); } /** * Get the value of a named parameter. The argument is the identifier * field from that parameter's descriptor. */ virtual float getParameter(std::string) const { return 0.0; } /** * Set a named parameter. The first argument is the identifier field * from that parameter's descriptor. */ virtual void setParameter(std::string, float) { } typedef std::vector ProgramList; /** * Get the program settings available in this plugin. A program * is a named shorthand for a set of parameter values; changing * the program may cause the plugin to alter the values of its * published parameters (and/or non-public internal processing * parameters). The host should re-read the plugin's parameter * values after setting a new program. * * The programs must have unique names. */ virtual ProgramList getPrograms() const { return ProgramList(); } /** * Get the current program. */ virtual std::string getCurrentProgram() const { return ""; } /** * Select a program. (If the given program name is not one of the * available programs, do nothing.) */ virtual void selectProgram(std::string) { } /** * Get the type of plugin. This is to be implemented by the * immediate subclass, not by actual plugins. Do not attempt to * implement this in plugin code. */ virtual std::string getType() const = 0; }; } _VAMP_SDK_PLUGSPACE_END(PluginBase.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/RealTime.h0000644000000000000000000001116713111512442021555 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. Relicensed by the author as detailed above. */ #ifndef _VAMP_REAL_TIME_H_ #define _VAMP_REAL_TIME_H_ #include #include #ifndef _WIN32 struct timeval; #endif #include "plugguard.h" _VAMP_SDK_PLUGSPACE_BEGIN(RealTime.h) namespace Vamp { /** * \class RealTime RealTime.h * * RealTime represents time values to nanosecond precision * with accurate arithmetic and frame-rate conversion functions. */ struct RealTime { int sec; int nsec; int usec() const { return nsec / 1000; } int msec() const { return nsec / 1000000; } RealTime(): sec(0), nsec(0) {} RealTime(int s, int n); RealTime(const RealTime &r) : sec(r.sec), nsec(r.nsec) { } static RealTime fromSeconds(double sec); static RealTime fromMilliseconds(int msec); #ifndef _WIN32 static RealTime fromTimeval(const struct timeval &); #endif RealTime &operator=(const RealTime &r) { sec = r.sec; nsec = r.nsec; return *this; } RealTime operator+(const RealTime &r) const { return RealTime(sec + r.sec, nsec + r.nsec); } RealTime operator-(const RealTime &r) const { return RealTime(sec - r.sec, nsec - r.nsec); } RealTime operator-() const { return RealTime(-sec, -nsec); } bool operator <(const RealTime &r) const { if (sec == r.sec) return nsec < r.nsec; else return sec < r.sec; } bool operator >(const RealTime &r) const { if (sec == r.sec) return nsec > r.nsec; else return sec > r.sec; } bool operator==(const RealTime &r) const { return (sec == r.sec && nsec == r.nsec); } bool operator!=(const RealTime &r) const { return !(r == *this); } bool operator>=(const RealTime &r) const { if (sec == r.sec) return nsec >= r.nsec; else return sec >= r.sec; } bool operator<=(const RealTime &r) const { if (sec == r.sec) return nsec <= r.nsec; else return sec <= r.sec; } RealTime operator/(int d) const; /** * Return the ratio of two times. */ double operator/(const RealTime &r) const; /** * Return a human-readable debug-type string to full precision * (probably not a format to show to a user directly) */ std::string toString() const; /** * Return a user-readable string to the nearest millisecond * in a form like HH:MM:SS.mmm */ std::string toText(bool fixedDp = false) const; /** * Convert a RealTime into a sample frame at the given sample rate. */ static long realTime2Frame(const RealTime &r, unsigned int sampleRate); /** * Convert a sample frame at the given sample rate into a RealTime. */ static RealTime frame2RealTime(long frame, unsigned int sampleRate); static const RealTime zeroTime; }; std::ostream &operator<<(std::ostream &out, const RealTime &rt); } _VAMP_SDK_PLUGSPACE_END(RealTime.h) #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/plugguard.h0000644000000000000000000000730013111512442022037 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_SDK_PLUGGUARD_H_ #define _VAMP_SDK_PLUGGUARD_H_ /** * Normal usage should be: * * - Plugins include vamp-sdk/Plugin.h or vamp-sdk/PluginBase.h. * These files include this header, which specifies an appropriate * namespace for the plugin classes to avoid any risk of conflict * with non-plugin class implementations in the host on load. * * - Hosts include vamp-hostsdk/Plugin.h, vamp-hostsdk/PluginBase.h, * vamp-hostsdk/PluginHostAdapter, vamp-hostsdk/PluginLoader.h etc. * These files include vamp-hostsdk/hostguard.h, which makes a note * that we are in a host. A file such as vamp-hostsdk/Plugin.h * then simply includes vamp-sdk/Plugin.h, and this guard header * takes notice of the fact that it has been included from a host * and leaves the plugin namespace unset. * * Problems will occur when a host includes files directly from the * vamp-sdk directory. There are two reasons this might happen: * mistake, perhaps owing to ignorance of the fact that this isn't * allowed (particularly since it was the normal mechanism in v1 of * the SDK); and a wish to incorporate plugin code directly into the * host rather than having to load it. * * What if the host does include a vamp-sdk header by mistake? We can * catch it if it's included before something from vamp-hostsdk. If * it's included after something from vamp-hostsdk, it will work OK * anyway. The remaining problem case is where nothing from * vamp-hostsdk is included in the same file. We can't catch that. */ #ifndef _VAMP_IN_HOSTSDK #define _VAMP_IN_PLUGINSDK 1 #define VAMP_SDK_VERSION "2.7.1" #define VAMP_SDK_MAJOR_VERSION 2 #define VAMP_SDK_MINOR_VERSION 7 #ifdef _VAMP_NO_PLUGIN_NAMESPACE #define _VAMP_SDK_PLUGSPACE_BEGIN(h) #define _VAMP_SDK_PLUGSPACE_END(h) #else #ifdef _VAMP_PLUGIN_IN_HOST_NAMESPACE #define _VAMP_SDK_PLUGSPACE_BEGIN(h) \ namespace _VampHost { #define _VAMP_SDK_PLUGSPACE_END(h) \ } \ using namespace _VampHost; #else #define _VAMP_SDK_PLUGSPACE_BEGIN(h) \ namespace _VampPlugin { #define _VAMP_SDK_PLUGSPACE_END(h) \ } \ using namespace _VampPlugin; #endif #endif #endif #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp-sdk/vamp-sdk.h0000644000000000000000000000337213111512442021574 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _VAMP_SDK_SINGLE_INCLUDE_H_ #define _VAMP_SDK_SINGLE_INCLUDE_H_ #include "PluginBase.h" #include "Plugin.h" #include "RealTime.h" #include "FFT.h" #endif sonic-visualiser-3.0.3/vamp-plugin-sdk/vamp/vamp.h0000644000000000000000000003151113111512442020232 0ustar 00000000000000/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Vamp An API for audio analysis and feature extraction plugins. Centre for Digital Music, Queen Mary, University of London. Copyright 2006 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the names of the Centre for Digital Music; Queen Mary, University of London; and Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef VAMP_HEADER_INCLUDED #define VAMP_HEADER_INCLUDED #ifdef __cplusplus extern "C" { #endif /** * Plugin API version. This is incremented when a change is made that * changes the binary layout of the descriptor records. When this * happens, there should be a mechanism for retaining compatibility * with older hosts and/or plugins. * * See also the vampApiVersion field in the plugin descriptor, and the * hostApiVersion argument to the vampGetPluginDescriptor function. */ #define VAMP_API_VERSION 2 /** * C language API for Vamp plugins. * * This is the formal plugin API for Vamp. Plugin authors may prefer * to use the C++ classes provided in the Vamp plugin SDK, instead of * using this API directly. There is an adapter class provided that * makes C++ plugins available using this C API with relatively little * work, and the C++ headers are more thoroughly documented. * * IMPORTANT: The comments in this file summarise the purpose of each * of the declared fields and functions, but do not provide a complete * guide to their permitted values and expected usage. Please refer * to the C++ headers in the Vamp plugin SDK for further details and * plugin lifecycle documentation. */ typedef struct _VampParameterDescriptor { /** Computer-usable name of the parameter. Must not change. [a-zA-Z0-9_-] */ const char *identifier; /** Human-readable name of the parameter. May be translatable. */ const char *name; /** Human-readable short text about the parameter. May be translatable. */ const char *description; /** Human-readable unit of the parameter. */ const char *unit; /** Minimum value. */ float minValue; /** Maximum value. */ float maxValue; /** Default value. Plugin is responsible for setting this on initialise. */ float defaultValue; /** 1 if parameter values are quantized to a particular resolution. */ int isQuantized; /** Quantization resolution, if isQuantized. */ float quantizeStep; /** Human-readable names of the values, if isQuantized. May be NULL. */ const char **valueNames; } VampParameterDescriptor; typedef enum { /** Each process call returns results aligned with call's block start. */ vampOneSamplePerStep, /** Returned results are evenly spaced at samplerate specified below. */ vampFixedSampleRate, /** Returned results have their own individual timestamps. */ vampVariableSampleRate } VampSampleType; typedef struct _VampOutputDescriptor { /** Computer-usable name of the output. Must not change. [a-zA-Z0-9_-] */ const char *identifier; /** Human-readable name of the output. May be translatable. */ const char *name; /** Human-readable short text about the output. May be translatable. */ const char *description; /** Human-readable name of the unit of the output. */ const char *unit; /** 1 if output has equal number of values for each returned result. */ int hasFixedBinCount; /** Number of values per result, if hasFixedBinCount. */ unsigned int binCount; /** Names of returned value bins, if hasFixedBinCount. May be NULL. */ const char **binNames; /** 1 if each returned value falls within the same fixed min/max range. */ int hasKnownExtents; /** Minimum value for a returned result in any bin, if hasKnownExtents. */ float minValue; /** Maximum value for a returned result in any bin, if hasKnownExtents. */ float maxValue; /** 1 if returned results are quantized to a particular resolution. */ int isQuantized; /** Quantization resolution for returned results, if isQuantized. */ float quantizeStep; /** Time positioning method for returned results (see VampSampleType). */ VampSampleType sampleType; /** Sample rate of returned results, if sampleType is vampFixedSampleRate. "Resolution" of result, if sampleType is vampVariableSampleRate. */ float sampleRate; /** 1 if the returned results for this output are known to have a duration field. This field is new in Vamp API version 2; it must not be tested for plugins that report an older API version in their plugin descriptor. */ int hasDuration; } VampOutputDescriptor; typedef struct _VampFeature { /** 1 if the feature has a timestamp (i.e. if vampVariableSampleRate). */ int hasTimestamp; /** Seconds component of timestamp. */ int sec; /** Nanoseconds component of timestamp. */ int nsec; /** Number of values. Must be binCount if hasFixedBinCount. */ unsigned int valueCount; /** Values for this returned sample. */ float *values; /** Label for this returned sample. May be NULL. */ char *label; } VampFeature; typedef struct _VampFeatureV2 { /** 1 if the feature has a duration. */ int hasDuration; /** Seconds component of duratiion. */ int durationSec; /** Nanoseconds component of duration. */ int durationNsec; } VampFeatureV2; typedef union _VampFeatureUnion { // sizeof(featureV1) >= sizeof(featureV2) for backward compatibility VampFeature v1; VampFeatureV2 v2; } VampFeatureUnion; typedef struct _VampFeatureList { /** Number of features in this feature list. */ unsigned int featureCount; /** Features in this feature list. May be NULL if featureCount is zero. If present, this array must contain featureCount feature structures for a Vamp API version 1 plugin, or 2*featureCount feature unions for a Vamp API version 2 plugin. The features returned by an API version 2 plugin must consist of the same feature structures as in API version 1 for the first featureCount array elements, followed by featureCount unions that contain VampFeatureV2 structures (or NULL pointers if no V2 feature structures are present). */ VampFeatureUnion *features; } VampFeatureList; typedef enum { vampTimeDomain, vampFrequencyDomain } VampInputDomain; typedef void *VampPluginHandle; typedef struct _VampPluginDescriptor { /** API version with which this descriptor is compatible. */ unsigned int vampApiVersion; /** Computer-usable name of the plugin. Must not change. [a-zA-Z0-9_-] */ const char *identifier; /** Human-readable name of the plugin. May be translatable. */ const char *name; /** Human-readable short text about the plugin. May be translatable. */ const char *description; /** Human-readable name of plugin's author or vendor. */ const char *maker; /** Version number of the plugin. */ int pluginVersion; /** Human-readable summary of copyright or licensing for plugin. */ const char *copyright; /** Number of parameter inputs. */ unsigned int parameterCount; /** Fixed descriptors for parameter inputs. */ const VampParameterDescriptor **parameters; /** Number of programs. */ unsigned int programCount; /** Fixed names for programs. */ const char **programs; /** Preferred input domain for audio input (time or frequency). */ VampInputDomain inputDomain; /** Create and return a new instance of this plugin. */ VampPluginHandle (*instantiate)(const struct _VampPluginDescriptor *, float inputSampleRate); /** Destroy an instance of this plugin. */ void (*cleanup)(VampPluginHandle); /** Initialise an instance following parameter configuration. */ int (*initialise)(VampPluginHandle, unsigned int inputChannels, unsigned int stepSize, unsigned int blockSize); /** Reset an instance, ready to use again on new input data. */ void (*reset)(VampPluginHandle); /** Get a parameter value. */ float (*getParameter)(VampPluginHandle, int); /** Set a parameter value. May only be called before initialise. */ void (*setParameter)(VampPluginHandle, int, float); /** Get the current program (if programCount > 0). */ unsigned int (*getCurrentProgram)(VampPluginHandle); /** Set the current program. May only be called before initialise. */ void (*selectProgram)(VampPluginHandle, unsigned int); /** Get the plugin's preferred processing window increment in samples. */ unsigned int (*getPreferredStepSize)(VampPluginHandle); /** Get the plugin's preferred processing window size in samples. */ unsigned int (*getPreferredBlockSize)(VampPluginHandle); /** Get the minimum number of input channels this plugin can handle. */ unsigned int (*getMinChannelCount)(VampPluginHandle); /** Get the maximum number of input channels this plugin can handle. */ unsigned int (*getMaxChannelCount)(VampPluginHandle); /** Get the number of feature outputs (distinct sets of results). */ unsigned int (*getOutputCount)(VampPluginHandle); /** Get a descriptor for a given feature output. Returned pointer is valid only until next call to getOutputDescriptor for this handle, or releaseOutputDescriptor for this descriptor. Host must call releaseOutputDescriptor after use. */ VampOutputDescriptor *(*getOutputDescriptor)(VampPluginHandle, unsigned int); /** Destroy a descriptor for a feature output. */ void (*releaseOutputDescriptor)(VampOutputDescriptor *); /** Process an input block and return a set of features. Returned pointer is valid only until next call to process, getRemainingFeatures, or cleanup for this handle, or releaseFeatureSet for this feature set. Host must call releaseFeatureSet after use. */ VampFeatureList *(*process)(VampPluginHandle, const float *const *inputBuffers, int sec, int nsec); /** Return any remaining features at the end of processing. */ VampFeatureList *(*getRemainingFeatures)(VampPluginHandle); /** Release a feature set returned from process or getRemainingFeatures. */ void (*releaseFeatureSet)(VampFeatureList *); } VampPluginDescriptor; /** Get the descriptor for a given plugin index in this library. Return NULL if the index is outside the range of valid indices for this plugin library. The hostApiVersion argument tells the library code the highest Vamp API version supported by the host. The function should return a plugin descriptor compatible with the highest API version supported by the library that is no higher than that supported by the host. Provided the descriptor has the correct vampApiVersion field for its actual compatibility level, the host should be able to do the right thing with it: use it if possible, discard it otherwise. This is the only symbol that a Vamp plugin actually needs to export from its shared object; all others can be hidden. See the accompanying documentation for notes on how to achieve this with certain compilers. */ const VampPluginDescriptor *vampGetPluginDescriptor (unsigned int hostApiVersion, unsigned int index); /** Function pointer type for vampGetPluginDescriptor. */ typedef const VampPluginDescriptor *(*VampGetPluginDescriptorFunction) (unsigned int, unsigned int); #ifdef __cplusplus } #endif #endif
    • All currently installed Vamp audio feature extraction plugins
    • All currently installed LADSPA audio effects plugins
    • Vamp plugins that are not currently installed but that have descriptions published via the semantic web
  • Path "%1" is not a fileInteractiveFileFinderA5 D09;K (*.*)All files (*.*)InteractiveFileFinderâA5 ?>445@68205<K5 B8?K D09;>2 (%1 %2) XML-D09;K A;>Q2 Sonic Visualiser (*.svl)ÿü  0745;Q==K5 70?OB>9 D09;K 40==KE (*.csv)ÿü  0745;Q==K5 ?@>15;>< D09;K .lab (*.lab)ÿü $09;K RDF (%2)ÿü $09;K MIDI (*.mid)ÿü "5:AB>2K5 D09;K (*.txt)ÿü A5 D09;K (*.*)ÏAll supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinderºA5 ?>445@68205<K5 B8?K D09;>2 (%1 %2) XML-D09;K A;>Q2 Sonic Visualiser (*.svl)ÿü  0745;Q==K5 70?OB>9 D09;K 40==KE (*.csv) ÿü 0745;Q==K5 ?@>15;>< D09;K .lab (*.lab) ÿü$09;K RDF (%2) ÿü"5:AB>2K5 D09;K (*.txt) ÿüA5 D09;K (*.*)¼All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*)InteractiveFileFinderêA5 ?>445@68205<K5 B8?K D09;>2 (*.sv %1 %2) $09;K A5AA89 %3 (*.%4) 2C:>2K5 D09;K (%2) $09;K RDF (%1) A5 D09;K (*.*)hAll supported files (*.sv %1 %2) %3 session files (*.%4) Audio files (%2) RDF files (%1) All files (*.*)InteractiveFileFinderF2C:>2K5 D09;K (%1) A5 D09;K (*.*) Audio files (%1) All files (*.*)InteractiveFileFinderB<5=8BLCancelInteractiveFileFinderK1@0= :0B0;>3Directory selectedInteractiveFileFinder.5 C40;>AL >B:@KBL D09;Failed to open fileInteractiveFileFinderB5 C40;>AL >B:@KBL <5AB>?>;>65=85Failed to open locationInteractiveFileFinder$$09; =5 ACI5AB2C5BFile does not existInteractiveFileFinder2"0:>9 D09; C65 ACI5AB2C5B File existsInteractiveFileFinder$09; ?CAB File is emptyInteractiveFileFinder$09; =5G8B05<File is not readableInteractiveFileFinderL$09;K 87>1@065=89 (%1) A5 D09;K (*.*) Image files (%1) All files (*.*)InteractiveFileFinder#:070BL D09;...Locate file...InteractiveFileFinderK1@0= =5 D09;Non-file selectedInteractiveFileFindert#:068B5 URL, :>B>@K9 1C45B 8A?>;L7>20BLAO 4;O MB>3> D09;0:*Please enter the URL to use for this file:InteractiveFileFindern$09;K Portable Network Graphics (*.png) A5 D09;K (*.*)7Portable Network Graphics files (*.png) All files (*.*)InteractiveFileFinderl$09;K Scalable Vector Graphics (*.svg) A5 D09;K (*.*)6Scalable Vector Graphics files (*.svg) All files (*.*)InteractiveFileFinderNK15@8B5 D09;, 2 :>B>@K9 M:A?>@B8@>20BLSelect a file to export toInteractiveFileFinder(K15@8B5 D09; A5AA88Select a session fileInteractiveFileFinderK15@8B5 D09; Select fileInteractiveFileFinder<XML-D09;K A;>Q2 Sonic Visualiser (*.svl)  0745;Q==K5 70?OB>9 40==K5 (*.csv) $09;K RDF/Turtle (%1)ÿü $09;K MIDI (*.mid)ÿü "5:AB>2K5 D09;K (*.txt) A5 D09;K (*.*)—Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinderXML-D09;K A;>Q2 Sonic Visualiser (*.svl)  0745;Q==K5 70?OB>9 40==K5 (*.csv) $09;K RDF/Turtle (%1)ÿü "5:AB>2K5 D09;K (*.txt) A5 D09;K (*.*)„Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*)InteractiveFileFinder A?>;L7>20BL URLUse URLInteractiveFileFinder&A?>;L7>20BL URL... Use URL...InteractiveFileFinderT2C:>2K5 D09;K WAV (*.wav) A5 D09;K (*.*)'WAV audio files (*.wav) All files (*.*)InteractiveFileFinder 2K1>@>: framesItemEditDialogA secItemEditDialog <A usecItemEditDialogB<5=8BLCancelItemEditDialog;8B5;L=>ABL: Duration:ItemEditDialogOKItemEditDialog!2>9AB20 PropertiesItemEditDialog!1@>A8BLResetItemEditDialog "5:AB:Text:ItemEditDialog @5<O:Time:ItemEditDialog"09<8=3TimingItemEditDialog=0G5=85:Value:ItemEditDialog&& KeyReference"</b>&nbsp;(%1)<b> (%1) KeyReference2<i>8;8</i>&nbsp;<b>%1</b>or %1 KeyReference.@C1K9 AGQBG8: (B0:BK):Coarse counter (bars):LabelCounterInputDialog,">G=K9 AGQBG8: (4>;8):Fine counter (beats):LabelCounterInputDialog&#AB0=>2:0 AGQBG8:>2 Set CountersLabelCounterInputDialog%1%1Labeller %1.%2%1.%2Labeller<><5@ 2K1>@:8 72C:>2>3> AM<?;0Audio sample frame numberLabeller&&8:;8G5A:89 AG5BG8:Cyclical counterLabellerZ&8:;8G5A:89 42CEC@>2=52K9 AG5BG8: (B0:B/4>;O)%Cyclical two-level counter (bar/beat)LabellerJ;8B5;L=>ABL ?>A;5 ?@54K4CI59 >B<5B:8 Duration since the previous itemLabellerB;8B5;L=>ABL 4> A;54CNI59 >B<5B:8Duration to the following itemLabeller57 =C<5@0F88 No numberingLabellerB0: 8 1;8609H89 ?@54K4CI89 >1J5:B!Same as the nearest previous itemLabeller@>AB>9 AG5BG8:Simple counterLabellert"5<? (bpm) =0 >A=>25 4;8B5;L=>AB8 ?>A;5 ?@54K4CI59 >B<5B:81Tempo (bpm) based on duration since previous itemLabellerl"5<? (bpm) =0 >A=>25 4;8B5;L=>AB8 4> A;54CNI59 >B<5B:8/Tempo (bpm) based on duration to following itemLabeller @5<O 2 A5:C=40ETime in secondsLabellerl=0G5=85, 872;5GQ==>5 87 <5B:8 >1J5:B0 (5A;8 2>7<>6=>)6Value extracted from the item's label (where possible)Labeller"&25B=>9 3D-3@0D8:Colour 3D PlotLayer#40;8BL 70<5@Delete MeasurementLayer7>1@065=8OImagesLayer!>740BL 70<5@Make MeasurementLayer>BKNotesLayer1;0AB8RegionsLayer8=59:0RulerLayer!?5:B@>3@0<<0 SpectrogramLayer !?5:B@SpectrumLayer "5:ABTextLayerB<5B:8 2@5<5=8 Time InstantsLayer =0G5=8O 2@5<5=8 Time ValuesLayer>;=>20O D>@<0WaveformLayer2AB>G=8:8 72C:>2KE 40==KEAudio Data SourcesLayerTreeDialog!2>4:0 ?> A;>N Layer SummaryLayerTreeDialog:=0 8 A;>8Panes and LayersLayerTreeDialog!;>9LayerLayerTreeModel >45;LModelLayerTreeModel>A?@872545=85PlayedLayerTreeModelB>1@065=85ShownLayerTreeModelü<b>K15@8B5 8<?>@B8@C5<CN 4>@>6:C</b><p>K <>65B5 8<?>@B8@>20BL MB>B D09; ;8HL :0: >48=>G=K9 A;>9 0==>B0F88, => 2 D09;5 ;81> 1>;LH5 >4=>9 4>@>6:8, ;81> =>BK 2 1>;55 G5< >4=>< :0=0;5.<p>K15@8B5 >4=C 4>@>6:C 8;8 =5A:>;L:> >1J548=O5<KE 4>@>65: 4;O 8<?>@B0:èSelect track to import